@kalisio/kdk 2.2.2 → 2.3.1

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 (388) hide show
  1. package/.eslintignore +1 -0
  2. package/.github/workflows/main.yaml +67 -0
  3. package/.gitmodules +3 -0
  4. package/README.md +1 -2
  5. package/core/api/hooks/hooks.query.js +15 -2
  6. package/core/api/marshall.js +35 -4
  7. package/core/client/api.js +1 -1
  8. package/core/client/components/KActivity.vue +73 -0
  9. package/core/client/components/KContent.vue +1 -1
  10. package/core/client/components/KSponsor.vue +2 -13
  11. package/core/client/components/account/KDeleteAccountManager.vue +1 -1
  12. package/core/client/components/account/KPasswordManager.vue +1 -1
  13. package/core/client/components/action/KAction.vue +294 -0
  14. package/core/client/components/action/KBugReportAction.vue +37 -0
  15. package/core/client/components/action/index.js +7 -0
  16. package/core/client/components/app/KAbout.vue +16 -63
  17. package/core/client/components/app/KPlatform.vue +1 -1
  18. package/core/client/components/app/KSettings.vue +14 -14
  19. package/core/client/components/app/KTour.vue +6 -8
  20. package/core/client/components/app/KWelcome.vue +1 -1
  21. package/core/client/components/app/index.js +4 -0
  22. package/core/client/components/chart/KDataTable.vue +40 -25
  23. package/core/client/components/chart/KTimeSeriesChart.vue +20 -12
  24. package/core/client/components/collection/KCard.vue +1 -1
  25. package/core/client/components/collection/KCardSection.vue +3 -2
  26. package/core/client/components/collection/KColumn.vue +1 -1
  27. package/core/client/components/collection/KFilter.vue +6 -1
  28. package/core/client/components/document/KDocument.vue +83 -0
  29. package/core/client/components/document/KHtml.vue +23 -0
  30. package/core/client/components/document/KMarkdown.vue +37 -0
  31. package/core/client/components/document/index.js +9 -0
  32. package/core/client/components/form/KForm.vue +6 -2
  33. package/core/client/components/form/KSelectField.vue +1 -1
  34. package/core/client/components/index.js +1 -4
  35. package/core/client/components/input/KOptionsChooser.vue +1 -1
  36. package/core/client/components/layout/KFab.vue +1 -1
  37. package/core/client/components/layout/KPage.vue +3 -2
  38. package/core/client/components/layout/KWindow.vue +1 -1
  39. package/core/client/components/media/KColorScale.vue +16 -6
  40. package/core/client/components/screen/KLoginScreen.vue +1 -1
  41. package/core/client/components/screen/KRegisterScreen.vue +1 -1
  42. package/core/client/components/team/KAddMember.vue +7 -7
  43. package/core/client/components/team/KGroupCard.vue +1 -1
  44. package/core/client/components/team/KMemberFilter.vue +1 -1
  45. package/core/client/components/team/KTagCard.vue +1 -1
  46. package/core/client/components/time/KRelativeTimeRanges.vue +16 -1
  47. package/core/client/components/time/KTimeControl.vue +1 -0
  48. package/core/client/components/tool/KExportTool.vue +1 -1
  49. package/core/client/composables/collection.js +1 -1
  50. package/core/client/composables/index.js +1 -0
  51. package/core/client/composables/layout.js +50 -0
  52. package/core/client/composables/session.js +6 -0
  53. package/core/client/filter.js +9 -6
  54. package/core/client/guards.js +29 -6
  55. package/core/client/i18n/core_en.json +4 -1
  56. package/core/client/i18n/core_fr.json +8 -5
  57. package/core/client/i18n.js +14 -0
  58. package/core/client/layout.js +25 -14
  59. package/core/client/mixins/mixin.base-activity.js +16 -0
  60. package/core/client/services/index.js +27 -26
  61. package/core/client/services/local-settings.service.js +2 -3
  62. package/core/client/units.js +6 -1
  63. package/core/client/utils/index.js +3 -0
  64. package/core/client/utils/utils.actions.js +93 -0
  65. package/core/client/utils/utils.colors.js +1 -1
  66. package/core/client/utils/utils.data.js +22 -0
  67. package/core/client/utils/utils.shapes.js +16 -6
  68. package/coverage/base.css +224 -0
  69. package/coverage/block-navigation.js +87 -0
  70. package/coverage/core/api/application.js.html +1870 -0
  71. package/coverage/core/api/authentication.js.html +742 -0
  72. package/coverage/core/api/db.js.html +778 -0
  73. package/coverage/core/api/hooks/hooks.authentication.js.html +313 -0
  74. package/coverage/core/api/hooks/hooks.authorisations.js.html +1243 -0
  75. package/coverage/core/api/hooks/hooks.groups.js.html +229 -0
  76. package/coverage/core/api/hooks/hooks.logger.js.html +163 -0
  77. package/coverage/core/api/hooks/hooks.model.js.html +955 -0
  78. package/coverage/core/api/hooks/hooks.organisations.js.html +541 -0
  79. package/coverage/core/api/hooks/hooks.push.js.html +253 -0
  80. package/coverage/core/api/hooks/hooks.query.js.html +862 -0
  81. package/coverage/core/api/hooks/hooks.schemas.js.html +304 -0
  82. package/coverage/core/api/hooks/hooks.service.js.html +319 -0
  83. package/coverage/core/api/hooks/hooks.storage.js.html +193 -0
  84. package/coverage/core/api/hooks/hooks.users.js.html +868 -0
  85. package/coverage/core/api/hooks/index.html +296 -0
  86. package/coverage/core/api/hooks/index.js.html +121 -0
  87. package/coverage/core/api/index.html +191 -0
  88. package/coverage/core/api/index.js.html +148 -0
  89. package/coverage/core/api/marshall.js.html +448 -0
  90. package/coverage/core/api/models/groups.model.mongodb.js.html +109 -0
  91. package/coverage/core/api/models/index.html +161 -0
  92. package/coverage/core/api/models/organisations.model.mongodb.js.html +94 -0
  93. package/coverage/core/api/models/tags.model.mongodb.js.html +115 -0
  94. package/coverage/core/api/models/users.model.mongodb.js.html +115 -0
  95. package/coverage/core/api/services/account/account.hooks.js.html +208 -0
  96. package/coverage/core/api/services/account/account.service.js.html +436 -0
  97. package/coverage/core/api/services/account/index.html +131 -0
  98. package/coverage/core/api/services/authorisations/authorisations.hooks.js.html +184 -0
  99. package/coverage/core/api/services/authorisations/authorisations.service.js.html +502 -0
  100. package/coverage/core/api/services/authorisations/index.html +131 -0
  101. package/coverage/core/api/services/databases/databases.hooks.js.html +193 -0
  102. package/coverage/core/api/services/databases/databases.service.js.html +100 -0
  103. package/coverage/core/api/services/databases/index.html +131 -0
  104. package/coverage/core/api/services/groups/groups.hooks.js.html +178 -0
  105. package/coverage/core/api/services/groups/index.html +116 -0
  106. package/coverage/core/api/services/import-export/import-export.hooks.js.html +184 -0
  107. package/coverage/core/api/services/import-export/import-export.service.js.html +118 -0
  108. package/coverage/core/api/services/import-export/index.html +131 -0
  109. package/coverage/core/api/services/index.html +116 -0
  110. package/coverage/core/api/services/index.js.html +499 -0
  111. package/coverage/core/api/services/mailer/index.html +131 -0
  112. package/coverage/core/api/services/mailer/mailer.hooks.js.html +190 -0
  113. package/coverage/core/api/services/mailer/mailer.service.js.html +118 -0
  114. package/coverage/core/api/services/organisations/index.html +131 -0
  115. package/coverage/core/api/services/organisations/organisations.hooks.js.html +178 -0
  116. package/coverage/core/api/services/organisations/organisations.service.js.html +343 -0
  117. package/coverage/core/api/services/push/index.html +131 -0
  118. package/coverage/core/api/services/push/push.hooks.js.html +190 -0
  119. package/coverage/core/api/services/push/push.service.js.html +121 -0
  120. package/coverage/core/api/services/storage/index.html +131 -0
  121. package/coverage/core/api/services/storage/storage.hooks.js.html +190 -0
  122. package/coverage/core/api/services/storage/storage.service.js.html +172 -0
  123. package/coverage/core/api/services/tags/index.html +116 -0
  124. package/coverage/core/api/services/tags/tags.hooks.js.html +178 -0
  125. package/coverage/core/api/services/users/index.html +116 -0
  126. package/coverage/core/api/services/users/users.hooks.js.html +307 -0
  127. package/coverage/core/api/utils.js.html +118 -0
  128. package/coverage/core/common/errors.js.html +88 -0
  129. package/coverage/core/common/index.html +176 -0
  130. package/coverage/core/common/index.js.html +115 -0
  131. package/coverage/core/common/permissions.js.html +1048 -0
  132. package/coverage/core/common/schema.js.html +190 -0
  133. package/coverage/core/common/utils.js.html +220 -0
  134. package/coverage/favicon.png +0 -0
  135. package/coverage/index.html +491 -0
  136. package/coverage/lcov-report/base.css +224 -0
  137. package/coverage/lcov-report/block-navigation.js +87 -0
  138. package/coverage/lcov-report/core/api/application.js.html +1870 -0
  139. package/coverage/lcov-report/core/api/authentication.js.html +742 -0
  140. package/coverage/lcov-report/core/api/db.js.html +778 -0
  141. package/coverage/lcov-report/core/api/hooks/hooks.authentication.js.html +313 -0
  142. package/coverage/lcov-report/core/api/hooks/hooks.authorisations.js.html +1243 -0
  143. package/coverage/lcov-report/core/api/hooks/hooks.groups.js.html +229 -0
  144. package/coverage/lcov-report/core/api/hooks/hooks.logger.js.html +163 -0
  145. package/coverage/lcov-report/core/api/hooks/hooks.model.js.html +955 -0
  146. package/coverage/lcov-report/core/api/hooks/hooks.organisations.js.html +541 -0
  147. package/coverage/lcov-report/core/api/hooks/hooks.push.js.html +253 -0
  148. package/coverage/lcov-report/core/api/hooks/hooks.query.js.html +862 -0
  149. package/coverage/lcov-report/core/api/hooks/hooks.schemas.js.html +304 -0
  150. package/coverage/lcov-report/core/api/hooks/hooks.service.js.html +319 -0
  151. package/coverage/lcov-report/core/api/hooks/hooks.storage.js.html +193 -0
  152. package/coverage/lcov-report/core/api/hooks/hooks.users.js.html +868 -0
  153. package/coverage/lcov-report/core/api/hooks/index.html +296 -0
  154. package/coverage/lcov-report/core/api/hooks/index.js.html +121 -0
  155. package/coverage/lcov-report/core/api/index.html +191 -0
  156. package/coverage/lcov-report/core/api/index.js.html +148 -0
  157. package/coverage/lcov-report/core/api/marshall.js.html +448 -0
  158. package/coverage/lcov-report/core/api/models/groups.model.mongodb.js.html +109 -0
  159. package/coverage/lcov-report/core/api/models/index.html +161 -0
  160. package/coverage/lcov-report/core/api/models/organisations.model.mongodb.js.html +94 -0
  161. package/coverage/lcov-report/core/api/models/tags.model.mongodb.js.html +115 -0
  162. package/coverage/lcov-report/core/api/models/users.model.mongodb.js.html +115 -0
  163. package/coverage/lcov-report/core/api/services/account/account.hooks.js.html +208 -0
  164. package/coverage/lcov-report/core/api/services/account/account.service.js.html +436 -0
  165. package/coverage/lcov-report/core/api/services/account/index.html +131 -0
  166. package/coverage/lcov-report/core/api/services/authorisations/authorisations.hooks.js.html +184 -0
  167. package/coverage/lcov-report/core/api/services/authorisations/authorisations.service.js.html +502 -0
  168. package/coverage/lcov-report/core/api/services/authorisations/index.html +131 -0
  169. package/coverage/lcov-report/core/api/services/databases/databases.hooks.js.html +193 -0
  170. package/coverage/lcov-report/core/api/services/databases/databases.service.js.html +100 -0
  171. package/coverage/lcov-report/core/api/services/databases/index.html +131 -0
  172. package/coverage/lcov-report/core/api/services/groups/groups.hooks.js.html +178 -0
  173. package/coverage/lcov-report/core/api/services/groups/index.html +116 -0
  174. package/coverage/lcov-report/core/api/services/import-export/import-export.hooks.js.html +184 -0
  175. package/coverage/lcov-report/core/api/services/import-export/import-export.service.js.html +118 -0
  176. package/coverage/lcov-report/core/api/services/import-export/index.html +131 -0
  177. package/coverage/lcov-report/core/api/services/index.html +116 -0
  178. package/coverage/lcov-report/core/api/services/index.js.html +499 -0
  179. package/coverage/lcov-report/core/api/services/mailer/index.html +131 -0
  180. package/coverage/lcov-report/core/api/services/mailer/mailer.hooks.js.html +190 -0
  181. package/coverage/lcov-report/core/api/services/mailer/mailer.service.js.html +118 -0
  182. package/coverage/lcov-report/core/api/services/organisations/index.html +131 -0
  183. package/coverage/lcov-report/core/api/services/organisations/organisations.hooks.js.html +178 -0
  184. package/coverage/lcov-report/core/api/services/organisations/organisations.service.js.html +343 -0
  185. package/coverage/lcov-report/core/api/services/push/index.html +131 -0
  186. package/coverage/lcov-report/core/api/services/push/push.hooks.js.html +190 -0
  187. package/coverage/lcov-report/core/api/services/push/push.service.js.html +121 -0
  188. package/coverage/lcov-report/core/api/services/storage/index.html +131 -0
  189. package/coverage/lcov-report/core/api/services/storage/storage.hooks.js.html +190 -0
  190. package/coverage/lcov-report/core/api/services/storage/storage.service.js.html +172 -0
  191. package/coverage/lcov-report/core/api/services/tags/index.html +116 -0
  192. package/coverage/lcov-report/core/api/services/tags/tags.hooks.js.html +178 -0
  193. package/coverage/lcov-report/core/api/services/users/index.html +116 -0
  194. package/coverage/lcov-report/core/api/services/users/users.hooks.js.html +307 -0
  195. package/coverage/lcov-report/core/api/utils.js.html +118 -0
  196. package/coverage/lcov-report/core/common/errors.js.html +88 -0
  197. package/coverage/lcov-report/core/common/index.html +176 -0
  198. package/coverage/lcov-report/core/common/index.js.html +115 -0
  199. package/coverage/lcov-report/core/common/permissions.js.html +1048 -0
  200. package/coverage/lcov-report/core/common/schema.js.html +190 -0
  201. package/coverage/lcov-report/core/common/utils.js.html +220 -0
  202. package/coverage/lcov-report/favicon.png +0 -0
  203. package/coverage/lcov-report/index.html +491 -0
  204. package/coverage/lcov-report/map/api/hooks/hooks.catalog.js.html +457 -0
  205. package/coverage/lcov-report/map/api/hooks/hooks.features.js.html +397 -0
  206. package/coverage/lcov-report/map/api/hooks/hooks.query.js.html +1309 -0
  207. package/coverage/lcov-report/map/api/hooks/index.html +161 -0
  208. package/coverage/lcov-report/map/api/hooks/index.js.html +94 -0
  209. package/coverage/lcov-report/map/api/index.html +131 -0
  210. package/coverage/lcov-report/map/api/index.js.html +139 -0
  211. package/coverage/lcov-report/map/api/marshall.js.html +178 -0
  212. package/coverage/lcov-report/map/api/models/alerts.model.mongodb.js.html +106 -0
  213. package/coverage/lcov-report/map/api/models/catalog.model.mongodb.js.html +127 -0
  214. package/coverage/lcov-report/map/api/models/features.model.mongodb.js.html +196 -0
  215. package/coverage/lcov-report/map/api/models/index.html +161 -0
  216. package/coverage/lcov-report/map/api/models/projects.model.mongodb.js.html +109 -0
  217. package/coverage/lcov-report/map/api/services/alerts/alerts.hooks.js.html +274 -0
  218. package/coverage/lcov-report/map/api/services/alerts/alerts.service.js.html +610 -0
  219. package/coverage/lcov-report/map/api/services/alerts/index.html +131 -0
  220. package/coverage/lcov-report/map/api/services/catalog/catalog.hooks.js.html +316 -0
  221. package/coverage/lcov-report/map/api/services/catalog/index.html +116 -0
  222. package/coverage/lcov-report/map/api/services/daptiles/daptiles.service.js.html +1510 -0
  223. package/coverage/lcov-report/map/api/services/daptiles/index.html +116 -0
  224. package/coverage/lcov-report/map/api/services/features/features.hooks.js.html +241 -0
  225. package/coverage/lcov-report/map/api/services/features/features.service.js.html +241 -0
  226. package/coverage/lcov-report/map/api/services/features/index.html +131 -0
  227. package/coverage/lcov-report/map/api/services/index.html +116 -0
  228. package/coverage/lcov-report/map/api/services/index.js.html +817 -0
  229. package/coverage/lcov-report/map/api/services/projects/index.html +116 -0
  230. package/coverage/lcov-report/map/api/services/projects/projects.hooks.js.html +439 -0
  231. package/coverage/lcov-report/map/common/dynamic-grid-source.js.html +466 -0
  232. package/coverage/lcov-report/map/common/errors.js.html +94 -0
  233. package/coverage/lcov-report/map/common/geotiff-grid-source.js.html +541 -0
  234. package/coverage/lcov-report/map/common/grid.js.html +1612 -0
  235. package/coverage/lcov-report/map/common/index.html +371 -0
  236. package/coverage/lcov-report/map/common/index.js.html +172 -0
  237. package/coverage/lcov-report/map/common/meteo-model-grid-source.js.html +556 -0
  238. package/coverage/lcov-report/map/common/moment-utils.js.html +157 -0
  239. package/coverage/lcov-report/map/common/opendap-grid-source.js.html +868 -0
  240. package/coverage/lcov-report/map/common/opendap-utils.js.html +826 -0
  241. package/coverage/lcov-report/map/common/permissions.js.html +124 -0
  242. package/coverage/lcov-report/map/common/time-based-grid-source.js.html +418 -0
  243. package/coverage/lcov-report/map/common/tms-utils.js.html +274 -0
  244. package/coverage/lcov-report/map/common/wcs-grid-source.js.html +364 -0
  245. package/coverage/lcov-report/map/common/wcs-utils.js.html +586 -0
  246. package/coverage/lcov-report/map/common/weacast-grid-source.js.html +1033 -0
  247. package/coverage/lcov-report/map/common/wfs-utils.js.html +574 -0
  248. package/coverage/lcov-report/map/common/wms-utils.js.html +451 -0
  249. package/coverage/lcov-report/map/common/wmts-utils.js.html +547 -0
  250. package/coverage/lcov-report/prettify.css +1 -0
  251. package/coverage/lcov-report/prettify.js +2 -0
  252. package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  253. package/coverage/lcov-report/sorter.js +196 -0
  254. package/coverage/lcov.info +11128 -0
  255. package/coverage/map/api/hooks/hooks.catalog.js.html +457 -0
  256. package/coverage/map/api/hooks/hooks.features.js.html +397 -0
  257. package/coverage/map/api/hooks/hooks.query.js.html +1309 -0
  258. package/coverage/map/api/hooks/index.html +161 -0
  259. package/coverage/map/api/hooks/index.js.html +94 -0
  260. package/coverage/map/api/index.html +131 -0
  261. package/coverage/map/api/index.js.html +139 -0
  262. package/coverage/map/api/marshall.js.html +178 -0
  263. package/coverage/map/api/models/alerts.model.mongodb.js.html +106 -0
  264. package/coverage/map/api/models/catalog.model.mongodb.js.html +127 -0
  265. package/coverage/map/api/models/features.model.mongodb.js.html +196 -0
  266. package/coverage/map/api/models/index.html +161 -0
  267. package/coverage/map/api/models/projects.model.mongodb.js.html +109 -0
  268. package/coverage/map/api/services/alerts/alerts.hooks.js.html +274 -0
  269. package/coverage/map/api/services/alerts/alerts.service.js.html +610 -0
  270. package/coverage/map/api/services/alerts/index.html +131 -0
  271. package/coverage/map/api/services/catalog/catalog.hooks.js.html +316 -0
  272. package/coverage/map/api/services/catalog/index.html +116 -0
  273. package/coverage/map/api/services/daptiles/daptiles.service.js.html +1510 -0
  274. package/coverage/map/api/services/daptiles/index.html +116 -0
  275. package/coverage/map/api/services/features/features.hooks.js.html +241 -0
  276. package/coverage/map/api/services/features/features.service.js.html +241 -0
  277. package/coverage/map/api/services/features/index.html +131 -0
  278. package/coverage/map/api/services/index.html +116 -0
  279. package/coverage/map/api/services/index.js.html +817 -0
  280. package/coverage/map/api/services/projects/index.html +116 -0
  281. package/coverage/map/api/services/projects/projects.hooks.js.html +439 -0
  282. package/coverage/map/common/dynamic-grid-source.js.html +466 -0
  283. package/coverage/map/common/errors.js.html +94 -0
  284. package/coverage/map/common/geotiff-grid-source.js.html +541 -0
  285. package/coverage/map/common/grid.js.html +1612 -0
  286. package/coverage/map/common/index.html +371 -0
  287. package/coverage/map/common/index.js.html +172 -0
  288. package/coverage/map/common/meteo-model-grid-source.js.html +556 -0
  289. package/coverage/map/common/moment-utils.js.html +157 -0
  290. package/coverage/map/common/opendap-grid-source.js.html +868 -0
  291. package/coverage/map/common/opendap-utils.js.html +826 -0
  292. package/coverage/map/common/permissions.js.html +124 -0
  293. package/coverage/map/common/time-based-grid-source.js.html +418 -0
  294. package/coverage/map/common/tms-utils.js.html +274 -0
  295. package/coverage/map/common/wcs-grid-source.js.html +364 -0
  296. package/coverage/map/common/wcs-utils.js.html +586 -0
  297. package/coverage/map/common/weacast-grid-source.js.html +1033 -0
  298. package/coverage/map/common/wfs-utils.js.html +574 -0
  299. package/coverage/map/common/wms-utils.js.html +451 -0
  300. package/coverage/map/common/wmts-utils.js.html +547 -0
  301. package/coverage/prettify.css +1 -0
  302. package/coverage/prettify.js +2 -0
  303. package/coverage/sort-arrow-sprite.png +0 -0
  304. package/coverage/sorter.js +196 -0
  305. package/coverage/tmp/coverage-137435-1719398750767-0.json +1 -0
  306. package/coverage/tmp/coverage-137447-1719398750752-0.json +1 -0
  307. package/coverage/tmp/coverage-137458-1719398750740-0.json +1 -0
  308. package/coverage/tmp/coverage-137470-1719398750728-0.json +1 -0
  309. package/coverage/tmp/coverage-137477-1719398750691-0.json +1 -0
  310. package/map/api/hooks/hooks.query.js +5 -2
  311. package/map/api/services/catalog/catalog.hooks.js +4 -5
  312. package/map/client/cesium/utils/index.js +2 -1
  313. package/map/client/cesium/utils/utils.cesium.js +8 -0
  314. package/map/client/cesium/utils/utils.features.js +2 -2
  315. package/map/client/cesium/utils/utils.style.js +19 -17
  316. package/map/client/components/KCompass.vue +25 -3
  317. package/map/client/components/KEditLayerData.vue +1 -1
  318. package/map/client/components/KPositionIndicator.vue +1 -1
  319. package/map/client/components/catalog/KConnectLayer.vue +2 -2
  320. package/map/client/components/catalog/KCreateView.vue +2 -2
  321. package/map/client/components/form/KDirectionField.vue +4 -0
  322. package/map/client/components/form/KOwsLayerField.vue +4 -4
  323. package/map/client/components/form/KOwsServiceField.vue +3 -4
  324. package/map/client/components/legend/KLegend.vue +13 -15
  325. package/map/client/components/tools/KGeolocateTool.vue +1 -1
  326. package/map/client/components/widget/KStackableTimeSeries.vue +3 -0
  327. package/map/client/composables/highlight.js +4 -1
  328. package/map/client/elevation-utils.js +2 -2
  329. package/map/client/i18n/map_en.json +3 -1
  330. package/map/client/i18n/map_fr.json +3 -1
  331. package/map/client/mixins/globe/mixin.base-globe.js +121 -80
  332. package/map/client/mixins/globe/mixin.file-layers.js +2 -2
  333. package/map/client/mixins/globe/mixin.geojson-layers.js +24 -19
  334. package/map/client/mixins/globe/mixin.globe-activity.js +3 -3
  335. package/map/client/mixins/globe/mixin.opendap-layers.js +3 -3
  336. package/map/client/mixins/globe/mixin.style.js +5 -5
  337. package/map/client/mixins/globe/mixin.tooltip.js +5 -3
  338. package/map/client/mixins/map/mixin.base-map.js +42 -4
  339. package/map/client/mixins/map/mixin.canvas-layers.js +0 -1
  340. package/map/client/mixins/map/mixin.geojson-layers.js +10 -5
  341. package/map/client/mixins/mixin.activity.js +2 -2
  342. package/map/client/mixins/mixin.feature-selection.js +7 -5
  343. package/map/client/mixins/mixin.levels.js +1 -1
  344. package/map/client/utils/utils.catalog.js +15 -0
  345. package/map/client/utils/utils.location.js +2 -1
  346. package/map/client/utils/utils.style.js +1 -1
  347. package/map/common/geotiff-grid-source.js +5 -3
  348. package/map/common/grid.js +2 -2
  349. package/map/common/meteo-model-grid-source.js +1 -1
  350. package/map/common/time-based-grid-source.js +1 -1
  351. package/map/common/wmts-utils.js +11 -11
  352. package/package.json +12 -8
  353. package/scripts/build_docs.sh +37 -0
  354. package/scripts/init_runner.sh +30 -0
  355. package/scripts/kash/.github/workflows/run_tests.yaml +33 -0
  356. package/scripts/kash/README.md +2 -0
  357. package/scripts/kash/kash.sh +1657 -0
  358. package/scripts/kash/scripts/run_tests.sh +151 -0
  359. package/scripts/run_tests.sh +48 -0
  360. package/scripts/setup_workspace.sh +42 -0
  361. package/test/api/core/hooks.test.js +31 -0
  362. package/test/api/core/test-log-2023-12-19.log +7 -0
  363. package/test/api/core/test-log-2024-01-04.log +14 -0
  364. package/test/api/core/test-log-2024-05-14.log +6 -0
  365. package/test/api/core/test-log-2024-06-06.log +23 -0
  366. package/test/api/core/test-log-2024-06-26.log +25 -0
  367. package/test/api/core/test-log-2024-06-28.log +2 -0
  368. package/test/api/map/grid-sources.test.js +3 -1
  369. package/test/api/map/hooks.test.js +58 -12
  370. package/test/api/map/test-log-2023-11-24.log +121 -0
  371. package/test/api/map/test-log-2023-12-12.log +29 -0
  372. package/test/api/map/test-log-2023-12-13.log +5 -0
  373. package/test/api/map/test-log-2024-01-04.log +2 -0
  374. package/test/api/map/test-log-2024-01-11.log +1 -0
  375. package/test/api/map/test-log-2024-01-25.log +19 -0
  376. package/test/api/map/test-log-2024-06-06.log +39 -0
  377. package/test/client/core/collection.js +2 -2
  378. package/test/client/core/dialogs.js +13 -0
  379. package/test/client/core/index.js +6 -5
  380. package/test/client/core/layout.js +1 -13
  381. package/test/client/core/runner.js +41 -20
  382. package/test/client/core/screens.js +6 -0
  383. package/test/client/core/utils.js +23 -19
  384. package/.travis.doc.sh +0 -8
  385. package/.travis.test.sh +0 -72
  386. package/core/client/components/KAction.vue +0 -393
  387. package/core/client/components/KBlock.vue +0 -67
  388. package/core/client/components/app/KTerms.vue +0 -41
@@ -0,0 +1,1510 @@
1
+
2
+ <!doctype html>
3
+ <html lang="en">
4
+
5
+ <head>
6
+ <title>Code coverage report for map/api/services/daptiles/daptiles.service.js</title>
7
+ <meta charset="utf-8" />
8
+ <link rel="stylesheet" href="../../../../prettify.css" />
9
+ <link rel="stylesheet" href="../../../../base.css" />
10
+ <link rel="shortcut icon" type="image/x-icon" href="../../../../favicon.png" />
11
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
12
+ <style type='text/css'>
13
+ .coverage-summary .sorter {
14
+ background-image: url(../../../../sort-arrow-sprite.png);
15
+ }
16
+ </style>
17
+ </head>
18
+
19
+ <body>
20
+ <div class='wrapper'>
21
+ <div class='pad1'>
22
+ <h1><a href="../../../../index.html">All files</a> / <a href="index.html">map/api/services/daptiles</a> daptiles.service.js</h1>
23
+ <div class='clearfix'>
24
+
25
+ <div class='fl pad1y space-right2'>
26
+ <span class="strong">0% </span>
27
+ <span class="quiet">Statements</span>
28
+ <span class='fraction'>0/475</span>
29
+ </div>
30
+
31
+
32
+ <div class='fl pad1y space-right2'>
33
+ <span class="strong">0% </span>
34
+ <span class="quiet">Branches</span>
35
+ <span class='fraction'>0/1</span>
36
+ </div>
37
+
38
+
39
+ <div class='fl pad1y space-right2'>
40
+ <span class="strong">0% </span>
41
+ <span class="quiet">Functions</span>
42
+ <span class='fraction'>0/1</span>
43
+ </div>
44
+
45
+
46
+ <div class='fl pad1y space-right2'>
47
+ <span class="strong">0% </span>
48
+ <span class="quiet">Lines</span>
49
+ <span class='fraction'>0/475</span>
50
+ </div>
51
+
52
+
53
+ </div>
54
+ <p class="quiet">
55
+ Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
56
+ </p>
57
+ <template id="filterTemplate">
58
+ <div class="quiet">
59
+ Filter:
60
+ <input oninput="onInput()" type="search" id="fileSearch">
61
+ </div>
62
+ </template>
63
+ </div>
64
+ <div class='status-line low'></div>
65
+ <pre><table class="coverage">
66
+ <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
67
+ <a name='L2'></a><a href='#L2'>2</a>
68
+ <a name='L3'></a><a href='#L3'>3</a>
69
+ <a name='L4'></a><a href='#L4'>4</a>
70
+ <a name='L5'></a><a href='#L5'>5</a>
71
+ <a name='L6'></a><a href='#L6'>6</a>
72
+ <a name='L7'></a><a href='#L7'>7</a>
73
+ <a name='L8'></a><a href='#L8'>8</a>
74
+ <a name='L9'></a><a href='#L9'>9</a>
75
+ <a name='L10'></a><a href='#L10'>10</a>
76
+ <a name='L11'></a><a href='#L11'>11</a>
77
+ <a name='L12'></a><a href='#L12'>12</a>
78
+ <a name='L13'></a><a href='#L13'>13</a>
79
+ <a name='L14'></a><a href='#L14'>14</a>
80
+ <a name='L15'></a><a href='#L15'>15</a>
81
+ <a name='L16'></a><a href='#L16'>16</a>
82
+ <a name='L17'></a><a href='#L17'>17</a>
83
+ <a name='L18'></a><a href='#L18'>18</a>
84
+ <a name='L19'></a><a href='#L19'>19</a>
85
+ <a name='L20'></a><a href='#L20'>20</a>
86
+ <a name='L21'></a><a href='#L21'>21</a>
87
+ <a name='L22'></a><a href='#L22'>22</a>
88
+ <a name='L23'></a><a href='#L23'>23</a>
89
+ <a name='L24'></a><a href='#L24'>24</a>
90
+ <a name='L25'></a><a href='#L25'>25</a>
91
+ <a name='L26'></a><a href='#L26'>26</a>
92
+ <a name='L27'></a><a href='#L27'>27</a>
93
+ <a name='L28'></a><a href='#L28'>28</a>
94
+ <a name='L29'></a><a href='#L29'>29</a>
95
+ <a name='L30'></a><a href='#L30'>30</a>
96
+ <a name='L31'></a><a href='#L31'>31</a>
97
+ <a name='L32'></a><a href='#L32'>32</a>
98
+ <a name='L33'></a><a href='#L33'>33</a>
99
+ <a name='L34'></a><a href='#L34'>34</a>
100
+ <a name='L35'></a><a href='#L35'>35</a>
101
+ <a name='L36'></a><a href='#L36'>36</a>
102
+ <a name='L37'></a><a href='#L37'>37</a>
103
+ <a name='L38'></a><a href='#L38'>38</a>
104
+ <a name='L39'></a><a href='#L39'>39</a>
105
+ <a name='L40'></a><a href='#L40'>40</a>
106
+ <a name='L41'></a><a href='#L41'>41</a>
107
+ <a name='L42'></a><a href='#L42'>42</a>
108
+ <a name='L43'></a><a href='#L43'>43</a>
109
+ <a name='L44'></a><a href='#L44'>44</a>
110
+ <a name='L45'></a><a href='#L45'>45</a>
111
+ <a name='L46'></a><a href='#L46'>46</a>
112
+ <a name='L47'></a><a href='#L47'>47</a>
113
+ <a name='L48'></a><a href='#L48'>48</a>
114
+ <a name='L49'></a><a href='#L49'>49</a>
115
+ <a name='L50'></a><a href='#L50'>50</a>
116
+ <a name='L51'></a><a href='#L51'>51</a>
117
+ <a name='L52'></a><a href='#L52'>52</a>
118
+ <a name='L53'></a><a href='#L53'>53</a>
119
+ <a name='L54'></a><a href='#L54'>54</a>
120
+ <a name='L55'></a><a href='#L55'>55</a>
121
+ <a name='L56'></a><a href='#L56'>56</a>
122
+ <a name='L57'></a><a href='#L57'>57</a>
123
+ <a name='L58'></a><a href='#L58'>58</a>
124
+ <a name='L59'></a><a href='#L59'>59</a>
125
+ <a name='L60'></a><a href='#L60'>60</a>
126
+ <a name='L61'></a><a href='#L61'>61</a>
127
+ <a name='L62'></a><a href='#L62'>62</a>
128
+ <a name='L63'></a><a href='#L63'>63</a>
129
+ <a name='L64'></a><a href='#L64'>64</a>
130
+ <a name='L65'></a><a href='#L65'>65</a>
131
+ <a name='L66'></a><a href='#L66'>66</a>
132
+ <a name='L67'></a><a href='#L67'>67</a>
133
+ <a name='L68'></a><a href='#L68'>68</a>
134
+ <a name='L69'></a><a href='#L69'>69</a>
135
+ <a name='L70'></a><a href='#L70'>70</a>
136
+ <a name='L71'></a><a href='#L71'>71</a>
137
+ <a name='L72'></a><a href='#L72'>72</a>
138
+ <a name='L73'></a><a href='#L73'>73</a>
139
+ <a name='L74'></a><a href='#L74'>74</a>
140
+ <a name='L75'></a><a href='#L75'>75</a>
141
+ <a name='L76'></a><a href='#L76'>76</a>
142
+ <a name='L77'></a><a href='#L77'>77</a>
143
+ <a name='L78'></a><a href='#L78'>78</a>
144
+ <a name='L79'></a><a href='#L79'>79</a>
145
+ <a name='L80'></a><a href='#L80'>80</a>
146
+ <a name='L81'></a><a href='#L81'>81</a>
147
+ <a name='L82'></a><a href='#L82'>82</a>
148
+ <a name='L83'></a><a href='#L83'>83</a>
149
+ <a name='L84'></a><a href='#L84'>84</a>
150
+ <a name='L85'></a><a href='#L85'>85</a>
151
+ <a name='L86'></a><a href='#L86'>86</a>
152
+ <a name='L87'></a><a href='#L87'>87</a>
153
+ <a name='L88'></a><a href='#L88'>88</a>
154
+ <a name='L89'></a><a href='#L89'>89</a>
155
+ <a name='L90'></a><a href='#L90'>90</a>
156
+ <a name='L91'></a><a href='#L91'>91</a>
157
+ <a name='L92'></a><a href='#L92'>92</a>
158
+ <a name='L93'></a><a href='#L93'>93</a>
159
+ <a name='L94'></a><a href='#L94'>94</a>
160
+ <a name='L95'></a><a href='#L95'>95</a>
161
+ <a name='L96'></a><a href='#L96'>96</a>
162
+ <a name='L97'></a><a href='#L97'>97</a>
163
+ <a name='L98'></a><a href='#L98'>98</a>
164
+ <a name='L99'></a><a href='#L99'>99</a>
165
+ <a name='L100'></a><a href='#L100'>100</a>
166
+ <a name='L101'></a><a href='#L101'>101</a>
167
+ <a name='L102'></a><a href='#L102'>102</a>
168
+ <a name='L103'></a><a href='#L103'>103</a>
169
+ <a name='L104'></a><a href='#L104'>104</a>
170
+ <a name='L105'></a><a href='#L105'>105</a>
171
+ <a name='L106'></a><a href='#L106'>106</a>
172
+ <a name='L107'></a><a href='#L107'>107</a>
173
+ <a name='L108'></a><a href='#L108'>108</a>
174
+ <a name='L109'></a><a href='#L109'>109</a>
175
+ <a name='L110'></a><a href='#L110'>110</a>
176
+ <a name='L111'></a><a href='#L111'>111</a>
177
+ <a name='L112'></a><a href='#L112'>112</a>
178
+ <a name='L113'></a><a href='#L113'>113</a>
179
+ <a name='L114'></a><a href='#L114'>114</a>
180
+ <a name='L115'></a><a href='#L115'>115</a>
181
+ <a name='L116'></a><a href='#L116'>116</a>
182
+ <a name='L117'></a><a href='#L117'>117</a>
183
+ <a name='L118'></a><a href='#L118'>118</a>
184
+ <a name='L119'></a><a href='#L119'>119</a>
185
+ <a name='L120'></a><a href='#L120'>120</a>
186
+ <a name='L121'></a><a href='#L121'>121</a>
187
+ <a name='L122'></a><a href='#L122'>122</a>
188
+ <a name='L123'></a><a href='#L123'>123</a>
189
+ <a name='L124'></a><a href='#L124'>124</a>
190
+ <a name='L125'></a><a href='#L125'>125</a>
191
+ <a name='L126'></a><a href='#L126'>126</a>
192
+ <a name='L127'></a><a href='#L127'>127</a>
193
+ <a name='L128'></a><a href='#L128'>128</a>
194
+ <a name='L129'></a><a href='#L129'>129</a>
195
+ <a name='L130'></a><a href='#L130'>130</a>
196
+ <a name='L131'></a><a href='#L131'>131</a>
197
+ <a name='L132'></a><a href='#L132'>132</a>
198
+ <a name='L133'></a><a href='#L133'>133</a>
199
+ <a name='L134'></a><a href='#L134'>134</a>
200
+ <a name='L135'></a><a href='#L135'>135</a>
201
+ <a name='L136'></a><a href='#L136'>136</a>
202
+ <a name='L137'></a><a href='#L137'>137</a>
203
+ <a name='L138'></a><a href='#L138'>138</a>
204
+ <a name='L139'></a><a href='#L139'>139</a>
205
+ <a name='L140'></a><a href='#L140'>140</a>
206
+ <a name='L141'></a><a href='#L141'>141</a>
207
+ <a name='L142'></a><a href='#L142'>142</a>
208
+ <a name='L143'></a><a href='#L143'>143</a>
209
+ <a name='L144'></a><a href='#L144'>144</a>
210
+ <a name='L145'></a><a href='#L145'>145</a>
211
+ <a name='L146'></a><a href='#L146'>146</a>
212
+ <a name='L147'></a><a href='#L147'>147</a>
213
+ <a name='L148'></a><a href='#L148'>148</a>
214
+ <a name='L149'></a><a href='#L149'>149</a>
215
+ <a name='L150'></a><a href='#L150'>150</a>
216
+ <a name='L151'></a><a href='#L151'>151</a>
217
+ <a name='L152'></a><a href='#L152'>152</a>
218
+ <a name='L153'></a><a href='#L153'>153</a>
219
+ <a name='L154'></a><a href='#L154'>154</a>
220
+ <a name='L155'></a><a href='#L155'>155</a>
221
+ <a name='L156'></a><a href='#L156'>156</a>
222
+ <a name='L157'></a><a href='#L157'>157</a>
223
+ <a name='L158'></a><a href='#L158'>158</a>
224
+ <a name='L159'></a><a href='#L159'>159</a>
225
+ <a name='L160'></a><a href='#L160'>160</a>
226
+ <a name='L161'></a><a href='#L161'>161</a>
227
+ <a name='L162'></a><a href='#L162'>162</a>
228
+ <a name='L163'></a><a href='#L163'>163</a>
229
+ <a name='L164'></a><a href='#L164'>164</a>
230
+ <a name='L165'></a><a href='#L165'>165</a>
231
+ <a name='L166'></a><a href='#L166'>166</a>
232
+ <a name='L167'></a><a href='#L167'>167</a>
233
+ <a name='L168'></a><a href='#L168'>168</a>
234
+ <a name='L169'></a><a href='#L169'>169</a>
235
+ <a name='L170'></a><a href='#L170'>170</a>
236
+ <a name='L171'></a><a href='#L171'>171</a>
237
+ <a name='L172'></a><a href='#L172'>172</a>
238
+ <a name='L173'></a><a href='#L173'>173</a>
239
+ <a name='L174'></a><a href='#L174'>174</a>
240
+ <a name='L175'></a><a href='#L175'>175</a>
241
+ <a name='L176'></a><a href='#L176'>176</a>
242
+ <a name='L177'></a><a href='#L177'>177</a>
243
+ <a name='L178'></a><a href='#L178'>178</a>
244
+ <a name='L179'></a><a href='#L179'>179</a>
245
+ <a name='L180'></a><a href='#L180'>180</a>
246
+ <a name='L181'></a><a href='#L181'>181</a>
247
+ <a name='L182'></a><a href='#L182'>182</a>
248
+ <a name='L183'></a><a href='#L183'>183</a>
249
+ <a name='L184'></a><a href='#L184'>184</a>
250
+ <a name='L185'></a><a href='#L185'>185</a>
251
+ <a name='L186'></a><a href='#L186'>186</a>
252
+ <a name='L187'></a><a href='#L187'>187</a>
253
+ <a name='L188'></a><a href='#L188'>188</a>
254
+ <a name='L189'></a><a href='#L189'>189</a>
255
+ <a name='L190'></a><a href='#L190'>190</a>
256
+ <a name='L191'></a><a href='#L191'>191</a>
257
+ <a name='L192'></a><a href='#L192'>192</a>
258
+ <a name='L193'></a><a href='#L193'>193</a>
259
+ <a name='L194'></a><a href='#L194'>194</a>
260
+ <a name='L195'></a><a href='#L195'>195</a>
261
+ <a name='L196'></a><a href='#L196'>196</a>
262
+ <a name='L197'></a><a href='#L197'>197</a>
263
+ <a name='L198'></a><a href='#L198'>198</a>
264
+ <a name='L199'></a><a href='#L199'>199</a>
265
+ <a name='L200'></a><a href='#L200'>200</a>
266
+ <a name='L201'></a><a href='#L201'>201</a>
267
+ <a name='L202'></a><a href='#L202'>202</a>
268
+ <a name='L203'></a><a href='#L203'>203</a>
269
+ <a name='L204'></a><a href='#L204'>204</a>
270
+ <a name='L205'></a><a href='#L205'>205</a>
271
+ <a name='L206'></a><a href='#L206'>206</a>
272
+ <a name='L207'></a><a href='#L207'>207</a>
273
+ <a name='L208'></a><a href='#L208'>208</a>
274
+ <a name='L209'></a><a href='#L209'>209</a>
275
+ <a name='L210'></a><a href='#L210'>210</a>
276
+ <a name='L211'></a><a href='#L211'>211</a>
277
+ <a name='L212'></a><a href='#L212'>212</a>
278
+ <a name='L213'></a><a href='#L213'>213</a>
279
+ <a name='L214'></a><a href='#L214'>214</a>
280
+ <a name='L215'></a><a href='#L215'>215</a>
281
+ <a name='L216'></a><a href='#L216'>216</a>
282
+ <a name='L217'></a><a href='#L217'>217</a>
283
+ <a name='L218'></a><a href='#L218'>218</a>
284
+ <a name='L219'></a><a href='#L219'>219</a>
285
+ <a name='L220'></a><a href='#L220'>220</a>
286
+ <a name='L221'></a><a href='#L221'>221</a>
287
+ <a name='L222'></a><a href='#L222'>222</a>
288
+ <a name='L223'></a><a href='#L223'>223</a>
289
+ <a name='L224'></a><a href='#L224'>224</a>
290
+ <a name='L225'></a><a href='#L225'>225</a>
291
+ <a name='L226'></a><a href='#L226'>226</a>
292
+ <a name='L227'></a><a href='#L227'>227</a>
293
+ <a name='L228'></a><a href='#L228'>228</a>
294
+ <a name='L229'></a><a href='#L229'>229</a>
295
+ <a name='L230'></a><a href='#L230'>230</a>
296
+ <a name='L231'></a><a href='#L231'>231</a>
297
+ <a name='L232'></a><a href='#L232'>232</a>
298
+ <a name='L233'></a><a href='#L233'>233</a>
299
+ <a name='L234'></a><a href='#L234'>234</a>
300
+ <a name='L235'></a><a href='#L235'>235</a>
301
+ <a name='L236'></a><a href='#L236'>236</a>
302
+ <a name='L237'></a><a href='#L237'>237</a>
303
+ <a name='L238'></a><a href='#L238'>238</a>
304
+ <a name='L239'></a><a href='#L239'>239</a>
305
+ <a name='L240'></a><a href='#L240'>240</a>
306
+ <a name='L241'></a><a href='#L241'>241</a>
307
+ <a name='L242'></a><a href='#L242'>242</a>
308
+ <a name='L243'></a><a href='#L243'>243</a>
309
+ <a name='L244'></a><a href='#L244'>244</a>
310
+ <a name='L245'></a><a href='#L245'>245</a>
311
+ <a name='L246'></a><a href='#L246'>246</a>
312
+ <a name='L247'></a><a href='#L247'>247</a>
313
+ <a name='L248'></a><a href='#L248'>248</a>
314
+ <a name='L249'></a><a href='#L249'>249</a>
315
+ <a name='L250'></a><a href='#L250'>250</a>
316
+ <a name='L251'></a><a href='#L251'>251</a>
317
+ <a name='L252'></a><a href='#L252'>252</a>
318
+ <a name='L253'></a><a href='#L253'>253</a>
319
+ <a name='L254'></a><a href='#L254'>254</a>
320
+ <a name='L255'></a><a href='#L255'>255</a>
321
+ <a name='L256'></a><a href='#L256'>256</a>
322
+ <a name='L257'></a><a href='#L257'>257</a>
323
+ <a name='L258'></a><a href='#L258'>258</a>
324
+ <a name='L259'></a><a href='#L259'>259</a>
325
+ <a name='L260'></a><a href='#L260'>260</a>
326
+ <a name='L261'></a><a href='#L261'>261</a>
327
+ <a name='L262'></a><a href='#L262'>262</a>
328
+ <a name='L263'></a><a href='#L263'>263</a>
329
+ <a name='L264'></a><a href='#L264'>264</a>
330
+ <a name='L265'></a><a href='#L265'>265</a>
331
+ <a name='L266'></a><a href='#L266'>266</a>
332
+ <a name='L267'></a><a href='#L267'>267</a>
333
+ <a name='L268'></a><a href='#L268'>268</a>
334
+ <a name='L269'></a><a href='#L269'>269</a>
335
+ <a name='L270'></a><a href='#L270'>270</a>
336
+ <a name='L271'></a><a href='#L271'>271</a>
337
+ <a name='L272'></a><a href='#L272'>272</a>
338
+ <a name='L273'></a><a href='#L273'>273</a>
339
+ <a name='L274'></a><a href='#L274'>274</a>
340
+ <a name='L275'></a><a href='#L275'>275</a>
341
+ <a name='L276'></a><a href='#L276'>276</a>
342
+ <a name='L277'></a><a href='#L277'>277</a>
343
+ <a name='L278'></a><a href='#L278'>278</a>
344
+ <a name='L279'></a><a href='#L279'>279</a>
345
+ <a name='L280'></a><a href='#L280'>280</a>
346
+ <a name='L281'></a><a href='#L281'>281</a>
347
+ <a name='L282'></a><a href='#L282'>282</a>
348
+ <a name='L283'></a><a href='#L283'>283</a>
349
+ <a name='L284'></a><a href='#L284'>284</a>
350
+ <a name='L285'></a><a href='#L285'>285</a>
351
+ <a name='L286'></a><a href='#L286'>286</a>
352
+ <a name='L287'></a><a href='#L287'>287</a>
353
+ <a name='L288'></a><a href='#L288'>288</a>
354
+ <a name='L289'></a><a href='#L289'>289</a>
355
+ <a name='L290'></a><a href='#L290'>290</a>
356
+ <a name='L291'></a><a href='#L291'>291</a>
357
+ <a name='L292'></a><a href='#L292'>292</a>
358
+ <a name='L293'></a><a href='#L293'>293</a>
359
+ <a name='L294'></a><a href='#L294'>294</a>
360
+ <a name='L295'></a><a href='#L295'>295</a>
361
+ <a name='L296'></a><a href='#L296'>296</a>
362
+ <a name='L297'></a><a href='#L297'>297</a>
363
+ <a name='L298'></a><a href='#L298'>298</a>
364
+ <a name='L299'></a><a href='#L299'>299</a>
365
+ <a name='L300'></a><a href='#L300'>300</a>
366
+ <a name='L301'></a><a href='#L301'>301</a>
367
+ <a name='L302'></a><a href='#L302'>302</a>
368
+ <a name='L303'></a><a href='#L303'>303</a>
369
+ <a name='L304'></a><a href='#L304'>304</a>
370
+ <a name='L305'></a><a href='#L305'>305</a>
371
+ <a name='L306'></a><a href='#L306'>306</a>
372
+ <a name='L307'></a><a href='#L307'>307</a>
373
+ <a name='L308'></a><a href='#L308'>308</a>
374
+ <a name='L309'></a><a href='#L309'>309</a>
375
+ <a name='L310'></a><a href='#L310'>310</a>
376
+ <a name='L311'></a><a href='#L311'>311</a>
377
+ <a name='L312'></a><a href='#L312'>312</a>
378
+ <a name='L313'></a><a href='#L313'>313</a>
379
+ <a name='L314'></a><a href='#L314'>314</a>
380
+ <a name='L315'></a><a href='#L315'>315</a>
381
+ <a name='L316'></a><a href='#L316'>316</a>
382
+ <a name='L317'></a><a href='#L317'>317</a>
383
+ <a name='L318'></a><a href='#L318'>318</a>
384
+ <a name='L319'></a><a href='#L319'>319</a>
385
+ <a name='L320'></a><a href='#L320'>320</a>
386
+ <a name='L321'></a><a href='#L321'>321</a>
387
+ <a name='L322'></a><a href='#L322'>322</a>
388
+ <a name='L323'></a><a href='#L323'>323</a>
389
+ <a name='L324'></a><a href='#L324'>324</a>
390
+ <a name='L325'></a><a href='#L325'>325</a>
391
+ <a name='L326'></a><a href='#L326'>326</a>
392
+ <a name='L327'></a><a href='#L327'>327</a>
393
+ <a name='L328'></a><a href='#L328'>328</a>
394
+ <a name='L329'></a><a href='#L329'>329</a>
395
+ <a name='L330'></a><a href='#L330'>330</a>
396
+ <a name='L331'></a><a href='#L331'>331</a>
397
+ <a name='L332'></a><a href='#L332'>332</a>
398
+ <a name='L333'></a><a href='#L333'>333</a>
399
+ <a name='L334'></a><a href='#L334'>334</a>
400
+ <a name='L335'></a><a href='#L335'>335</a>
401
+ <a name='L336'></a><a href='#L336'>336</a>
402
+ <a name='L337'></a><a href='#L337'>337</a>
403
+ <a name='L338'></a><a href='#L338'>338</a>
404
+ <a name='L339'></a><a href='#L339'>339</a>
405
+ <a name='L340'></a><a href='#L340'>340</a>
406
+ <a name='L341'></a><a href='#L341'>341</a>
407
+ <a name='L342'></a><a href='#L342'>342</a>
408
+ <a name='L343'></a><a href='#L343'>343</a>
409
+ <a name='L344'></a><a href='#L344'>344</a>
410
+ <a name='L345'></a><a href='#L345'>345</a>
411
+ <a name='L346'></a><a href='#L346'>346</a>
412
+ <a name='L347'></a><a href='#L347'>347</a>
413
+ <a name='L348'></a><a href='#L348'>348</a>
414
+ <a name='L349'></a><a href='#L349'>349</a>
415
+ <a name='L350'></a><a href='#L350'>350</a>
416
+ <a name='L351'></a><a href='#L351'>351</a>
417
+ <a name='L352'></a><a href='#L352'>352</a>
418
+ <a name='L353'></a><a href='#L353'>353</a>
419
+ <a name='L354'></a><a href='#L354'>354</a>
420
+ <a name='L355'></a><a href='#L355'>355</a>
421
+ <a name='L356'></a><a href='#L356'>356</a>
422
+ <a name='L357'></a><a href='#L357'>357</a>
423
+ <a name='L358'></a><a href='#L358'>358</a>
424
+ <a name='L359'></a><a href='#L359'>359</a>
425
+ <a name='L360'></a><a href='#L360'>360</a>
426
+ <a name='L361'></a><a href='#L361'>361</a>
427
+ <a name='L362'></a><a href='#L362'>362</a>
428
+ <a name='L363'></a><a href='#L363'>363</a>
429
+ <a name='L364'></a><a href='#L364'>364</a>
430
+ <a name='L365'></a><a href='#L365'>365</a>
431
+ <a name='L366'></a><a href='#L366'>366</a>
432
+ <a name='L367'></a><a href='#L367'>367</a>
433
+ <a name='L368'></a><a href='#L368'>368</a>
434
+ <a name='L369'></a><a href='#L369'>369</a>
435
+ <a name='L370'></a><a href='#L370'>370</a>
436
+ <a name='L371'></a><a href='#L371'>371</a>
437
+ <a name='L372'></a><a href='#L372'>372</a>
438
+ <a name='L373'></a><a href='#L373'>373</a>
439
+ <a name='L374'></a><a href='#L374'>374</a>
440
+ <a name='L375'></a><a href='#L375'>375</a>
441
+ <a name='L376'></a><a href='#L376'>376</a>
442
+ <a name='L377'></a><a href='#L377'>377</a>
443
+ <a name='L378'></a><a href='#L378'>378</a>
444
+ <a name='L379'></a><a href='#L379'>379</a>
445
+ <a name='L380'></a><a href='#L380'>380</a>
446
+ <a name='L381'></a><a href='#L381'>381</a>
447
+ <a name='L382'></a><a href='#L382'>382</a>
448
+ <a name='L383'></a><a href='#L383'>383</a>
449
+ <a name='L384'></a><a href='#L384'>384</a>
450
+ <a name='L385'></a><a href='#L385'>385</a>
451
+ <a name='L386'></a><a href='#L386'>386</a>
452
+ <a name='L387'></a><a href='#L387'>387</a>
453
+ <a name='L388'></a><a href='#L388'>388</a>
454
+ <a name='L389'></a><a href='#L389'>389</a>
455
+ <a name='L390'></a><a href='#L390'>390</a>
456
+ <a name='L391'></a><a href='#L391'>391</a>
457
+ <a name='L392'></a><a href='#L392'>392</a>
458
+ <a name='L393'></a><a href='#L393'>393</a>
459
+ <a name='L394'></a><a href='#L394'>394</a>
460
+ <a name='L395'></a><a href='#L395'>395</a>
461
+ <a name='L396'></a><a href='#L396'>396</a>
462
+ <a name='L397'></a><a href='#L397'>397</a>
463
+ <a name='L398'></a><a href='#L398'>398</a>
464
+ <a name='L399'></a><a href='#L399'>399</a>
465
+ <a name='L400'></a><a href='#L400'>400</a>
466
+ <a name='L401'></a><a href='#L401'>401</a>
467
+ <a name='L402'></a><a href='#L402'>402</a>
468
+ <a name='L403'></a><a href='#L403'>403</a>
469
+ <a name='L404'></a><a href='#L404'>404</a>
470
+ <a name='L405'></a><a href='#L405'>405</a>
471
+ <a name='L406'></a><a href='#L406'>406</a>
472
+ <a name='L407'></a><a href='#L407'>407</a>
473
+ <a name='L408'></a><a href='#L408'>408</a>
474
+ <a name='L409'></a><a href='#L409'>409</a>
475
+ <a name='L410'></a><a href='#L410'>410</a>
476
+ <a name='L411'></a><a href='#L411'>411</a>
477
+ <a name='L412'></a><a href='#L412'>412</a>
478
+ <a name='L413'></a><a href='#L413'>413</a>
479
+ <a name='L414'></a><a href='#L414'>414</a>
480
+ <a name='L415'></a><a href='#L415'>415</a>
481
+ <a name='L416'></a><a href='#L416'>416</a>
482
+ <a name='L417'></a><a href='#L417'>417</a>
483
+ <a name='L418'></a><a href='#L418'>418</a>
484
+ <a name='L419'></a><a href='#L419'>419</a>
485
+ <a name='L420'></a><a href='#L420'>420</a>
486
+ <a name='L421'></a><a href='#L421'>421</a>
487
+ <a name='L422'></a><a href='#L422'>422</a>
488
+ <a name='L423'></a><a href='#L423'>423</a>
489
+ <a name='L424'></a><a href='#L424'>424</a>
490
+ <a name='L425'></a><a href='#L425'>425</a>
491
+ <a name='L426'></a><a href='#L426'>426</a>
492
+ <a name='L427'></a><a href='#L427'>427</a>
493
+ <a name='L428'></a><a href='#L428'>428</a>
494
+ <a name='L429'></a><a href='#L429'>429</a>
495
+ <a name='L430'></a><a href='#L430'>430</a>
496
+ <a name='L431'></a><a href='#L431'>431</a>
497
+ <a name='L432'></a><a href='#L432'>432</a>
498
+ <a name='L433'></a><a href='#L433'>433</a>
499
+ <a name='L434'></a><a href='#L434'>434</a>
500
+ <a name='L435'></a><a href='#L435'>435</a>
501
+ <a name='L436'></a><a href='#L436'>436</a>
502
+ <a name='L437'></a><a href='#L437'>437</a>
503
+ <a name='L438'></a><a href='#L438'>438</a>
504
+ <a name='L439'></a><a href='#L439'>439</a>
505
+ <a name='L440'></a><a href='#L440'>440</a>
506
+ <a name='L441'></a><a href='#L441'>441</a>
507
+ <a name='L442'></a><a href='#L442'>442</a>
508
+ <a name='L443'></a><a href='#L443'>443</a>
509
+ <a name='L444'></a><a href='#L444'>444</a>
510
+ <a name='L445'></a><a href='#L445'>445</a>
511
+ <a name='L446'></a><a href='#L446'>446</a>
512
+ <a name='L447'></a><a href='#L447'>447</a>
513
+ <a name='L448'></a><a href='#L448'>448</a>
514
+ <a name='L449'></a><a href='#L449'>449</a>
515
+ <a name='L450'></a><a href='#L450'>450</a>
516
+ <a name='L451'></a><a href='#L451'>451</a>
517
+ <a name='L452'></a><a href='#L452'>452</a>
518
+ <a name='L453'></a><a href='#L453'>453</a>
519
+ <a name='L454'></a><a href='#L454'>454</a>
520
+ <a name='L455'></a><a href='#L455'>455</a>
521
+ <a name='L456'></a><a href='#L456'>456</a>
522
+ <a name='L457'></a><a href='#L457'>457</a>
523
+ <a name='L458'></a><a href='#L458'>458</a>
524
+ <a name='L459'></a><a href='#L459'>459</a>
525
+ <a name='L460'></a><a href='#L460'>460</a>
526
+ <a name='L461'></a><a href='#L461'>461</a>
527
+ <a name='L462'></a><a href='#L462'>462</a>
528
+ <a name='L463'></a><a href='#L463'>463</a>
529
+ <a name='L464'></a><a href='#L464'>464</a>
530
+ <a name='L465'></a><a href='#L465'>465</a>
531
+ <a name='L466'></a><a href='#L466'>466</a>
532
+ <a name='L467'></a><a href='#L467'>467</a>
533
+ <a name='L468'></a><a href='#L468'>468</a>
534
+ <a name='L469'></a><a href='#L469'>469</a>
535
+ <a name='L470'></a><a href='#L470'>470</a>
536
+ <a name='L471'></a><a href='#L471'>471</a>
537
+ <a name='L472'></a><a href='#L472'>472</a>
538
+ <a name='L473'></a><a href='#L473'>473</a>
539
+ <a name='L474'></a><a href='#L474'>474</a>
540
+ <a name='L475'></a><a href='#L475'>475</a>
541
+ <a name='L476'></a><a href='#L476'>476</a></td><td class="line-coverage quiet"><span class="cline-any cline-no">&nbsp;</span>
542
+ <span class="cline-any cline-no">&nbsp;</span>
543
+ <span class="cline-any cline-no">&nbsp;</span>
544
+ <span class="cline-any cline-no">&nbsp;</span>
545
+ <span class="cline-any cline-no">&nbsp;</span>
546
+ <span class="cline-any cline-no">&nbsp;</span>
547
+ <span class="cline-any cline-no">&nbsp;</span>
548
+ <span class="cline-any cline-no">&nbsp;</span>
549
+ <span class="cline-any cline-no">&nbsp;</span>
550
+ <span class="cline-any cline-no">&nbsp;</span>
551
+ <span class="cline-any cline-no">&nbsp;</span>
552
+ <span class="cline-any cline-no">&nbsp;</span>
553
+ <span class="cline-any cline-no">&nbsp;</span>
554
+ <span class="cline-any cline-no">&nbsp;</span>
555
+ <span class="cline-any cline-no">&nbsp;</span>
556
+ <span class="cline-any cline-no">&nbsp;</span>
557
+ <span class="cline-any cline-no">&nbsp;</span>
558
+ <span class="cline-any cline-no">&nbsp;</span>
559
+ <span class="cline-any cline-no">&nbsp;</span>
560
+ <span class="cline-any cline-no">&nbsp;</span>
561
+ <span class="cline-any cline-no">&nbsp;</span>
562
+ <span class="cline-any cline-no">&nbsp;</span>
563
+ <span class="cline-any cline-no">&nbsp;</span>
564
+ <span class="cline-any cline-no">&nbsp;</span>
565
+ <span class="cline-any cline-no">&nbsp;</span>
566
+ <span class="cline-any cline-no">&nbsp;</span>
567
+ <span class="cline-any cline-no">&nbsp;</span>
568
+ <span class="cline-any cline-no">&nbsp;</span>
569
+ <span class="cline-any cline-no">&nbsp;</span>
570
+ <span class="cline-any cline-no">&nbsp;</span>
571
+ <span class="cline-any cline-no">&nbsp;</span>
572
+ <span class="cline-any cline-no">&nbsp;</span>
573
+ <span class="cline-any cline-no">&nbsp;</span>
574
+ <span class="cline-any cline-no">&nbsp;</span>
575
+ <span class="cline-any cline-no">&nbsp;</span>
576
+ <span class="cline-any cline-no">&nbsp;</span>
577
+ <span class="cline-any cline-no">&nbsp;</span>
578
+ <span class="cline-any cline-no">&nbsp;</span>
579
+ <span class="cline-any cline-no">&nbsp;</span>
580
+ <span class="cline-any cline-no">&nbsp;</span>
581
+ <span class="cline-any cline-no">&nbsp;</span>
582
+ <span class="cline-any cline-no">&nbsp;</span>
583
+ <span class="cline-any cline-no">&nbsp;</span>
584
+ <span class="cline-any cline-no">&nbsp;</span>
585
+ <span class="cline-any cline-no">&nbsp;</span>
586
+ <span class="cline-any cline-no">&nbsp;</span>
587
+ <span class="cline-any cline-no">&nbsp;</span>
588
+ <span class="cline-any cline-no">&nbsp;</span>
589
+ <span class="cline-any cline-no">&nbsp;</span>
590
+ <span class="cline-any cline-no">&nbsp;</span>
591
+ <span class="cline-any cline-no">&nbsp;</span>
592
+ <span class="cline-any cline-no">&nbsp;</span>
593
+ <span class="cline-any cline-no">&nbsp;</span>
594
+ <span class="cline-any cline-no">&nbsp;</span>
595
+ <span class="cline-any cline-no">&nbsp;</span>
596
+ <span class="cline-any cline-no">&nbsp;</span>
597
+ <span class="cline-any cline-no">&nbsp;</span>
598
+ <span class="cline-any cline-no">&nbsp;</span>
599
+ <span class="cline-any cline-no">&nbsp;</span>
600
+ <span class="cline-any cline-no">&nbsp;</span>
601
+ <span class="cline-any cline-no">&nbsp;</span>
602
+ <span class="cline-any cline-no">&nbsp;</span>
603
+ <span class="cline-any cline-no">&nbsp;</span>
604
+ <span class="cline-any cline-no">&nbsp;</span>
605
+ <span class="cline-any cline-no">&nbsp;</span>
606
+ <span class="cline-any cline-no">&nbsp;</span>
607
+ <span class="cline-any cline-no">&nbsp;</span>
608
+ <span class="cline-any cline-no">&nbsp;</span>
609
+ <span class="cline-any cline-no">&nbsp;</span>
610
+ <span class="cline-any cline-no">&nbsp;</span>
611
+ <span class="cline-any cline-no">&nbsp;</span>
612
+ <span class="cline-any cline-no">&nbsp;</span>
613
+ <span class="cline-any cline-no">&nbsp;</span>
614
+ <span class="cline-any cline-no">&nbsp;</span>
615
+ <span class="cline-any cline-no">&nbsp;</span>
616
+ <span class="cline-any cline-no">&nbsp;</span>
617
+ <span class="cline-any cline-no">&nbsp;</span>
618
+ <span class="cline-any cline-no">&nbsp;</span>
619
+ <span class="cline-any cline-no">&nbsp;</span>
620
+ <span class="cline-any cline-no">&nbsp;</span>
621
+ <span class="cline-any cline-no">&nbsp;</span>
622
+ <span class="cline-any cline-no">&nbsp;</span>
623
+ <span class="cline-any cline-no">&nbsp;</span>
624
+ <span class="cline-any cline-no">&nbsp;</span>
625
+ <span class="cline-any cline-no">&nbsp;</span>
626
+ <span class="cline-any cline-no">&nbsp;</span>
627
+ <span class="cline-any cline-no">&nbsp;</span>
628
+ <span class="cline-any cline-no">&nbsp;</span>
629
+ <span class="cline-any cline-no">&nbsp;</span>
630
+ <span class="cline-any cline-no">&nbsp;</span>
631
+ <span class="cline-any cline-no">&nbsp;</span>
632
+ <span class="cline-any cline-no">&nbsp;</span>
633
+ <span class="cline-any cline-no">&nbsp;</span>
634
+ <span class="cline-any cline-no">&nbsp;</span>
635
+ <span class="cline-any cline-no">&nbsp;</span>
636
+ <span class="cline-any cline-no">&nbsp;</span>
637
+ <span class="cline-any cline-no">&nbsp;</span>
638
+ <span class="cline-any cline-no">&nbsp;</span>
639
+ <span class="cline-any cline-no">&nbsp;</span>
640
+ <span class="cline-any cline-no">&nbsp;</span>
641
+ <span class="cline-any cline-no">&nbsp;</span>
642
+ <span class="cline-any cline-no">&nbsp;</span>
643
+ <span class="cline-any cline-no">&nbsp;</span>
644
+ <span class="cline-any cline-no">&nbsp;</span>
645
+ <span class="cline-any cline-no">&nbsp;</span>
646
+ <span class="cline-any cline-no">&nbsp;</span>
647
+ <span class="cline-any cline-no">&nbsp;</span>
648
+ <span class="cline-any cline-no">&nbsp;</span>
649
+ <span class="cline-any cline-no">&nbsp;</span>
650
+ <span class="cline-any cline-no">&nbsp;</span>
651
+ <span class="cline-any cline-no">&nbsp;</span>
652
+ <span class="cline-any cline-no">&nbsp;</span>
653
+ <span class="cline-any cline-no">&nbsp;</span>
654
+ <span class="cline-any cline-no">&nbsp;</span>
655
+ <span class="cline-any cline-no">&nbsp;</span>
656
+ <span class="cline-any cline-no">&nbsp;</span>
657
+ <span class="cline-any cline-no">&nbsp;</span>
658
+ <span class="cline-any cline-no">&nbsp;</span>
659
+ <span class="cline-any cline-no">&nbsp;</span>
660
+ <span class="cline-any cline-no">&nbsp;</span>
661
+ <span class="cline-any cline-no">&nbsp;</span>
662
+ <span class="cline-any cline-no">&nbsp;</span>
663
+ <span class="cline-any cline-no">&nbsp;</span>
664
+ <span class="cline-any cline-no">&nbsp;</span>
665
+ <span class="cline-any cline-no">&nbsp;</span>
666
+ <span class="cline-any cline-no">&nbsp;</span>
667
+ <span class="cline-any cline-no">&nbsp;</span>
668
+ <span class="cline-any cline-no">&nbsp;</span>
669
+ <span class="cline-any cline-no">&nbsp;</span>
670
+ <span class="cline-any cline-no">&nbsp;</span>
671
+ <span class="cline-any cline-no">&nbsp;</span>
672
+ <span class="cline-any cline-no">&nbsp;</span>
673
+ <span class="cline-any cline-no">&nbsp;</span>
674
+ <span class="cline-any cline-no">&nbsp;</span>
675
+ <span class="cline-any cline-no">&nbsp;</span>
676
+ <span class="cline-any cline-no">&nbsp;</span>
677
+ <span class="cline-any cline-no">&nbsp;</span>
678
+ <span class="cline-any cline-no">&nbsp;</span>
679
+ <span class="cline-any cline-no">&nbsp;</span>
680
+ <span class="cline-any cline-no">&nbsp;</span>
681
+ <span class="cline-any cline-no">&nbsp;</span>
682
+ <span class="cline-any cline-no">&nbsp;</span>
683
+ <span class="cline-any cline-no">&nbsp;</span>
684
+ <span class="cline-any cline-no">&nbsp;</span>
685
+ <span class="cline-any cline-no">&nbsp;</span>
686
+ <span class="cline-any cline-no">&nbsp;</span>
687
+ <span class="cline-any cline-no">&nbsp;</span>
688
+ <span class="cline-any cline-no">&nbsp;</span>
689
+ <span class="cline-any cline-no">&nbsp;</span>
690
+ <span class="cline-any cline-no">&nbsp;</span>
691
+ <span class="cline-any cline-no">&nbsp;</span>
692
+ <span class="cline-any cline-no">&nbsp;</span>
693
+ <span class="cline-any cline-no">&nbsp;</span>
694
+ <span class="cline-any cline-no">&nbsp;</span>
695
+ <span class="cline-any cline-no">&nbsp;</span>
696
+ <span class="cline-any cline-no">&nbsp;</span>
697
+ <span class="cline-any cline-no">&nbsp;</span>
698
+ <span class="cline-any cline-no">&nbsp;</span>
699
+ <span class="cline-any cline-no">&nbsp;</span>
700
+ <span class="cline-any cline-no">&nbsp;</span>
701
+ <span class="cline-any cline-no">&nbsp;</span>
702
+ <span class="cline-any cline-no">&nbsp;</span>
703
+ <span class="cline-any cline-no">&nbsp;</span>
704
+ <span class="cline-any cline-no">&nbsp;</span>
705
+ <span class="cline-any cline-no">&nbsp;</span>
706
+ <span class="cline-any cline-no">&nbsp;</span>
707
+ <span class="cline-any cline-no">&nbsp;</span>
708
+ <span class="cline-any cline-no">&nbsp;</span>
709
+ <span class="cline-any cline-no">&nbsp;</span>
710
+ <span class="cline-any cline-no">&nbsp;</span>
711
+ <span class="cline-any cline-no">&nbsp;</span>
712
+ <span class="cline-any cline-no">&nbsp;</span>
713
+ <span class="cline-any cline-no">&nbsp;</span>
714
+ <span class="cline-any cline-no">&nbsp;</span>
715
+ <span class="cline-any cline-no">&nbsp;</span>
716
+ <span class="cline-any cline-no">&nbsp;</span>
717
+ <span class="cline-any cline-no">&nbsp;</span>
718
+ <span class="cline-any cline-no">&nbsp;</span>
719
+ <span class="cline-any cline-no">&nbsp;</span>
720
+ <span class="cline-any cline-no">&nbsp;</span>
721
+ <span class="cline-any cline-no">&nbsp;</span>
722
+ <span class="cline-any cline-no">&nbsp;</span>
723
+ <span class="cline-any cline-no">&nbsp;</span>
724
+ <span class="cline-any cline-no">&nbsp;</span>
725
+ <span class="cline-any cline-no">&nbsp;</span>
726
+ <span class="cline-any cline-no">&nbsp;</span>
727
+ <span class="cline-any cline-no">&nbsp;</span>
728
+ <span class="cline-any cline-no">&nbsp;</span>
729
+ <span class="cline-any cline-no">&nbsp;</span>
730
+ <span class="cline-any cline-no">&nbsp;</span>
731
+ <span class="cline-any cline-no">&nbsp;</span>
732
+ <span class="cline-any cline-no">&nbsp;</span>
733
+ <span class="cline-any cline-no">&nbsp;</span>
734
+ <span class="cline-any cline-no">&nbsp;</span>
735
+ <span class="cline-any cline-no">&nbsp;</span>
736
+ <span class="cline-any cline-no">&nbsp;</span>
737
+ <span class="cline-any cline-no">&nbsp;</span>
738
+ <span class="cline-any cline-no">&nbsp;</span>
739
+ <span class="cline-any cline-no">&nbsp;</span>
740
+ <span class="cline-any cline-no">&nbsp;</span>
741
+ <span class="cline-any cline-no">&nbsp;</span>
742
+ <span class="cline-any cline-no">&nbsp;</span>
743
+ <span class="cline-any cline-no">&nbsp;</span>
744
+ <span class="cline-any cline-no">&nbsp;</span>
745
+ <span class="cline-any cline-no">&nbsp;</span>
746
+ <span class="cline-any cline-no">&nbsp;</span>
747
+ <span class="cline-any cline-no">&nbsp;</span>
748
+ <span class="cline-any cline-no">&nbsp;</span>
749
+ <span class="cline-any cline-no">&nbsp;</span>
750
+ <span class="cline-any cline-no">&nbsp;</span>
751
+ <span class="cline-any cline-no">&nbsp;</span>
752
+ <span class="cline-any cline-no">&nbsp;</span>
753
+ <span class="cline-any cline-no">&nbsp;</span>
754
+ <span class="cline-any cline-no">&nbsp;</span>
755
+ <span class="cline-any cline-no">&nbsp;</span>
756
+ <span class="cline-any cline-no">&nbsp;</span>
757
+ <span class="cline-any cline-no">&nbsp;</span>
758
+ <span class="cline-any cline-no">&nbsp;</span>
759
+ <span class="cline-any cline-no">&nbsp;</span>
760
+ <span class="cline-any cline-no">&nbsp;</span>
761
+ <span class="cline-any cline-no">&nbsp;</span>
762
+ <span class="cline-any cline-no">&nbsp;</span>
763
+ <span class="cline-any cline-no">&nbsp;</span>
764
+ <span class="cline-any cline-no">&nbsp;</span>
765
+ <span class="cline-any cline-no">&nbsp;</span>
766
+ <span class="cline-any cline-no">&nbsp;</span>
767
+ <span class="cline-any cline-no">&nbsp;</span>
768
+ <span class="cline-any cline-no">&nbsp;</span>
769
+ <span class="cline-any cline-no">&nbsp;</span>
770
+ <span class="cline-any cline-no">&nbsp;</span>
771
+ <span class="cline-any cline-no">&nbsp;</span>
772
+ <span class="cline-any cline-no">&nbsp;</span>
773
+ <span class="cline-any cline-no">&nbsp;</span>
774
+ <span class="cline-any cline-no">&nbsp;</span>
775
+ <span class="cline-any cline-no">&nbsp;</span>
776
+ <span class="cline-any cline-no">&nbsp;</span>
777
+ <span class="cline-any cline-no">&nbsp;</span>
778
+ <span class="cline-any cline-no">&nbsp;</span>
779
+ <span class="cline-any cline-no">&nbsp;</span>
780
+ <span class="cline-any cline-no">&nbsp;</span>
781
+ <span class="cline-any cline-no">&nbsp;</span>
782
+ <span class="cline-any cline-no">&nbsp;</span>
783
+ <span class="cline-any cline-no">&nbsp;</span>
784
+ <span class="cline-any cline-no">&nbsp;</span>
785
+ <span class="cline-any cline-no">&nbsp;</span>
786
+ <span class="cline-any cline-no">&nbsp;</span>
787
+ <span class="cline-any cline-no">&nbsp;</span>
788
+ <span class="cline-any cline-no">&nbsp;</span>
789
+ <span class="cline-any cline-no">&nbsp;</span>
790
+ <span class="cline-any cline-no">&nbsp;</span>
791
+ <span class="cline-any cline-no">&nbsp;</span>
792
+ <span class="cline-any cline-no">&nbsp;</span>
793
+ <span class="cline-any cline-no">&nbsp;</span>
794
+ <span class="cline-any cline-no">&nbsp;</span>
795
+ <span class="cline-any cline-no">&nbsp;</span>
796
+ <span class="cline-any cline-no">&nbsp;</span>
797
+ <span class="cline-any cline-no">&nbsp;</span>
798
+ <span class="cline-any cline-no">&nbsp;</span>
799
+ <span class="cline-any cline-no">&nbsp;</span>
800
+ <span class="cline-any cline-no">&nbsp;</span>
801
+ <span class="cline-any cline-no">&nbsp;</span>
802
+ <span class="cline-any cline-no">&nbsp;</span>
803
+ <span class="cline-any cline-no">&nbsp;</span>
804
+ <span class="cline-any cline-no">&nbsp;</span>
805
+ <span class="cline-any cline-no">&nbsp;</span>
806
+ <span class="cline-any cline-no">&nbsp;</span>
807
+ <span class="cline-any cline-no">&nbsp;</span>
808
+ <span class="cline-any cline-no">&nbsp;</span>
809
+ <span class="cline-any cline-no">&nbsp;</span>
810
+ <span class="cline-any cline-no">&nbsp;</span>
811
+ <span class="cline-any cline-no">&nbsp;</span>
812
+ <span class="cline-any cline-no">&nbsp;</span>
813
+ <span class="cline-any cline-no">&nbsp;</span>
814
+ <span class="cline-any cline-no">&nbsp;</span>
815
+ <span class="cline-any cline-no">&nbsp;</span>
816
+ <span class="cline-any cline-no">&nbsp;</span>
817
+ <span class="cline-any cline-no">&nbsp;</span>
818
+ <span class="cline-any cline-no">&nbsp;</span>
819
+ <span class="cline-any cline-no">&nbsp;</span>
820
+ <span class="cline-any cline-no">&nbsp;</span>
821
+ <span class="cline-any cline-no">&nbsp;</span>
822
+ <span class="cline-any cline-no">&nbsp;</span>
823
+ <span class="cline-any cline-no">&nbsp;</span>
824
+ <span class="cline-any cline-no">&nbsp;</span>
825
+ <span class="cline-any cline-no">&nbsp;</span>
826
+ <span class="cline-any cline-no">&nbsp;</span>
827
+ <span class="cline-any cline-no">&nbsp;</span>
828
+ <span class="cline-any cline-no">&nbsp;</span>
829
+ <span class="cline-any cline-no">&nbsp;</span>
830
+ <span class="cline-any cline-no">&nbsp;</span>
831
+ <span class="cline-any cline-no">&nbsp;</span>
832
+ <span class="cline-any cline-no">&nbsp;</span>
833
+ <span class="cline-any cline-no">&nbsp;</span>
834
+ <span class="cline-any cline-no">&nbsp;</span>
835
+ <span class="cline-any cline-no">&nbsp;</span>
836
+ <span class="cline-any cline-no">&nbsp;</span>
837
+ <span class="cline-any cline-no">&nbsp;</span>
838
+ <span class="cline-any cline-no">&nbsp;</span>
839
+ <span class="cline-any cline-no">&nbsp;</span>
840
+ <span class="cline-any cline-no">&nbsp;</span>
841
+ <span class="cline-any cline-no">&nbsp;</span>
842
+ <span class="cline-any cline-no">&nbsp;</span>
843
+ <span class="cline-any cline-no">&nbsp;</span>
844
+ <span class="cline-any cline-no">&nbsp;</span>
845
+ <span class="cline-any cline-no">&nbsp;</span>
846
+ <span class="cline-any cline-no">&nbsp;</span>
847
+ <span class="cline-any cline-no">&nbsp;</span>
848
+ <span class="cline-any cline-no">&nbsp;</span>
849
+ <span class="cline-any cline-no">&nbsp;</span>
850
+ <span class="cline-any cline-no">&nbsp;</span>
851
+ <span class="cline-any cline-no">&nbsp;</span>
852
+ <span class="cline-any cline-no">&nbsp;</span>
853
+ <span class="cline-any cline-no">&nbsp;</span>
854
+ <span class="cline-any cline-no">&nbsp;</span>
855
+ <span class="cline-any cline-no">&nbsp;</span>
856
+ <span class="cline-any cline-no">&nbsp;</span>
857
+ <span class="cline-any cline-no">&nbsp;</span>
858
+ <span class="cline-any cline-no">&nbsp;</span>
859
+ <span class="cline-any cline-no">&nbsp;</span>
860
+ <span class="cline-any cline-no">&nbsp;</span>
861
+ <span class="cline-any cline-no">&nbsp;</span>
862
+ <span class="cline-any cline-no">&nbsp;</span>
863
+ <span class="cline-any cline-no">&nbsp;</span>
864
+ <span class="cline-any cline-no">&nbsp;</span>
865
+ <span class="cline-any cline-no">&nbsp;</span>
866
+ <span class="cline-any cline-no">&nbsp;</span>
867
+ <span class="cline-any cline-no">&nbsp;</span>
868
+ <span class="cline-any cline-no">&nbsp;</span>
869
+ <span class="cline-any cline-no">&nbsp;</span>
870
+ <span class="cline-any cline-no">&nbsp;</span>
871
+ <span class="cline-any cline-no">&nbsp;</span>
872
+ <span class="cline-any cline-no">&nbsp;</span>
873
+ <span class="cline-any cline-no">&nbsp;</span>
874
+ <span class="cline-any cline-no">&nbsp;</span>
875
+ <span class="cline-any cline-no">&nbsp;</span>
876
+ <span class="cline-any cline-no">&nbsp;</span>
877
+ <span class="cline-any cline-no">&nbsp;</span>
878
+ <span class="cline-any cline-no">&nbsp;</span>
879
+ <span class="cline-any cline-no">&nbsp;</span>
880
+ <span class="cline-any cline-no">&nbsp;</span>
881
+ <span class="cline-any cline-no">&nbsp;</span>
882
+ <span class="cline-any cline-no">&nbsp;</span>
883
+ <span class="cline-any cline-no">&nbsp;</span>
884
+ <span class="cline-any cline-no">&nbsp;</span>
885
+ <span class="cline-any cline-no">&nbsp;</span>
886
+ <span class="cline-any cline-no">&nbsp;</span>
887
+ <span class="cline-any cline-no">&nbsp;</span>
888
+ <span class="cline-any cline-no">&nbsp;</span>
889
+ <span class="cline-any cline-no">&nbsp;</span>
890
+ <span class="cline-any cline-no">&nbsp;</span>
891
+ <span class="cline-any cline-no">&nbsp;</span>
892
+ <span class="cline-any cline-no">&nbsp;</span>
893
+ <span class="cline-any cline-no">&nbsp;</span>
894
+ <span class="cline-any cline-no">&nbsp;</span>
895
+ <span class="cline-any cline-no">&nbsp;</span>
896
+ <span class="cline-any cline-no">&nbsp;</span>
897
+ <span class="cline-any cline-no">&nbsp;</span>
898
+ <span class="cline-any cline-no">&nbsp;</span>
899
+ <span class="cline-any cline-no">&nbsp;</span>
900
+ <span class="cline-any cline-no">&nbsp;</span>
901
+ <span class="cline-any cline-no">&nbsp;</span>
902
+ <span class="cline-any cline-no">&nbsp;</span>
903
+ <span class="cline-any cline-no">&nbsp;</span>
904
+ <span class="cline-any cline-no">&nbsp;</span>
905
+ <span class="cline-any cline-no">&nbsp;</span>
906
+ <span class="cline-any cline-no">&nbsp;</span>
907
+ <span class="cline-any cline-no">&nbsp;</span>
908
+ <span class="cline-any cline-no">&nbsp;</span>
909
+ <span class="cline-any cline-no">&nbsp;</span>
910
+ <span class="cline-any cline-no">&nbsp;</span>
911
+ <span class="cline-any cline-no">&nbsp;</span>
912
+ <span class="cline-any cline-no">&nbsp;</span>
913
+ <span class="cline-any cline-no">&nbsp;</span>
914
+ <span class="cline-any cline-no">&nbsp;</span>
915
+ <span class="cline-any cline-no">&nbsp;</span>
916
+ <span class="cline-any cline-no">&nbsp;</span>
917
+ <span class="cline-any cline-no">&nbsp;</span>
918
+ <span class="cline-any cline-no">&nbsp;</span>
919
+ <span class="cline-any cline-no">&nbsp;</span>
920
+ <span class="cline-any cline-no">&nbsp;</span>
921
+ <span class="cline-any cline-no">&nbsp;</span>
922
+ <span class="cline-any cline-no">&nbsp;</span>
923
+ <span class="cline-any cline-no">&nbsp;</span>
924
+ <span class="cline-any cline-no">&nbsp;</span>
925
+ <span class="cline-any cline-no">&nbsp;</span>
926
+ <span class="cline-any cline-no">&nbsp;</span>
927
+ <span class="cline-any cline-no">&nbsp;</span>
928
+ <span class="cline-any cline-no">&nbsp;</span>
929
+ <span class="cline-any cline-no">&nbsp;</span>
930
+ <span class="cline-any cline-no">&nbsp;</span>
931
+ <span class="cline-any cline-no">&nbsp;</span>
932
+ <span class="cline-any cline-no">&nbsp;</span>
933
+ <span class="cline-any cline-no">&nbsp;</span>
934
+ <span class="cline-any cline-no">&nbsp;</span>
935
+ <span class="cline-any cline-no">&nbsp;</span>
936
+ <span class="cline-any cline-no">&nbsp;</span>
937
+ <span class="cline-any cline-no">&nbsp;</span>
938
+ <span class="cline-any cline-no">&nbsp;</span>
939
+ <span class="cline-any cline-no">&nbsp;</span>
940
+ <span class="cline-any cline-no">&nbsp;</span>
941
+ <span class="cline-any cline-no">&nbsp;</span>
942
+ <span class="cline-any cline-no">&nbsp;</span>
943
+ <span class="cline-any cline-no">&nbsp;</span>
944
+ <span class="cline-any cline-no">&nbsp;</span>
945
+ <span class="cline-any cline-no">&nbsp;</span>
946
+ <span class="cline-any cline-no">&nbsp;</span>
947
+ <span class="cline-any cline-no">&nbsp;</span>
948
+ <span class="cline-any cline-no">&nbsp;</span>
949
+ <span class="cline-any cline-no">&nbsp;</span>
950
+ <span class="cline-any cline-no">&nbsp;</span>
951
+ <span class="cline-any cline-no">&nbsp;</span>
952
+ <span class="cline-any cline-no">&nbsp;</span>
953
+ <span class="cline-any cline-no">&nbsp;</span>
954
+ <span class="cline-any cline-no">&nbsp;</span>
955
+ <span class="cline-any cline-no">&nbsp;</span>
956
+ <span class="cline-any cline-no">&nbsp;</span>
957
+ <span class="cline-any cline-no">&nbsp;</span>
958
+ <span class="cline-any cline-no">&nbsp;</span>
959
+ <span class="cline-any cline-no">&nbsp;</span>
960
+ <span class="cline-any cline-no">&nbsp;</span>
961
+ <span class="cline-any cline-no">&nbsp;</span>
962
+ <span class="cline-any cline-no">&nbsp;</span>
963
+ <span class="cline-any cline-no">&nbsp;</span>
964
+ <span class="cline-any cline-no">&nbsp;</span>
965
+ <span class="cline-any cline-no">&nbsp;</span>
966
+ <span class="cline-any cline-no">&nbsp;</span>
967
+ <span class="cline-any cline-no">&nbsp;</span>
968
+ <span class="cline-any cline-no">&nbsp;</span>
969
+ <span class="cline-any cline-no">&nbsp;</span>
970
+ <span class="cline-any cline-no">&nbsp;</span>
971
+ <span class="cline-any cline-no">&nbsp;</span>
972
+ <span class="cline-any cline-no">&nbsp;</span>
973
+ <span class="cline-any cline-no">&nbsp;</span>
974
+ <span class="cline-any cline-no">&nbsp;</span>
975
+ <span class="cline-any cline-no">&nbsp;</span>
976
+ <span class="cline-any cline-no">&nbsp;</span>
977
+ <span class="cline-any cline-no">&nbsp;</span>
978
+ <span class="cline-any cline-no">&nbsp;</span>
979
+ <span class="cline-any cline-no">&nbsp;</span>
980
+ <span class="cline-any cline-no">&nbsp;</span>
981
+ <span class="cline-any cline-no">&nbsp;</span>
982
+ <span class="cline-any cline-no">&nbsp;</span>
983
+ <span class="cline-any cline-no">&nbsp;</span>
984
+ <span class="cline-any cline-no">&nbsp;</span>
985
+ <span class="cline-any cline-no">&nbsp;</span>
986
+ <span class="cline-any cline-no">&nbsp;</span>
987
+ <span class="cline-any cline-no">&nbsp;</span>
988
+ <span class="cline-any cline-no">&nbsp;</span>
989
+ <span class="cline-any cline-no">&nbsp;</span>
990
+ <span class="cline-any cline-no">&nbsp;</span>
991
+ <span class="cline-any cline-no">&nbsp;</span>
992
+ <span class="cline-any cline-no">&nbsp;</span>
993
+ <span class="cline-any cline-no">&nbsp;</span>
994
+ <span class="cline-any cline-no">&nbsp;</span>
995
+ <span class="cline-any cline-no">&nbsp;</span>
996
+ <span class="cline-any cline-no">&nbsp;</span>
997
+ <span class="cline-any cline-no">&nbsp;</span>
998
+ <span class="cline-any cline-no">&nbsp;</span>
999
+ <span class="cline-any cline-no">&nbsp;</span>
1000
+ <span class="cline-any cline-no">&nbsp;</span>
1001
+ <span class="cline-any cline-no">&nbsp;</span>
1002
+ <span class="cline-any cline-no">&nbsp;</span>
1003
+ <span class="cline-any cline-no">&nbsp;</span>
1004
+ <span class="cline-any cline-no">&nbsp;</span>
1005
+ <span class="cline-any cline-no">&nbsp;</span>
1006
+ <span class="cline-any cline-no">&nbsp;</span>
1007
+ <span class="cline-any cline-no">&nbsp;</span>
1008
+ <span class="cline-any cline-no">&nbsp;</span>
1009
+ <span class="cline-any cline-no">&nbsp;</span>
1010
+ <span class="cline-any cline-no">&nbsp;</span>
1011
+ <span class="cline-any cline-no">&nbsp;</span>
1012
+ <span class="cline-any cline-no">&nbsp;</span>
1013
+ <span class="cline-any cline-no">&nbsp;</span>
1014
+ <span class="cline-any cline-no">&nbsp;</span>
1015
+ <span class="cline-any cline-no">&nbsp;</span>
1016
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js"><span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" ><span class="branch-0 cbranch-no" title="branch not covered" >import chroma from 'chroma-js'</span></span></span>
1017
+ <span class="cstat-no" title="statement not covered" >import * as dap from '../../common/opendap-utils.js'</span>
1018
+ <span class="cstat-no" title="statement not covered" >import cesium from 'cesium'</span>
1019
+ <span class="cstat-no" title="statement not covered" >import makeDebug from 'debug'</span>
1020
+ <span class="cstat-no" title="statement not covered" ></span>
1021
+ <span class="cstat-no" title="statement not covered" >const debug = makeDebug('kdk:map:daptiles:service')</span>
1022
+ <span class="cstat-no" title="statement not covered" ></span>
1023
+ <span class="cstat-no" title="statement not covered" >// middleware global: https://github.com/kalisio/aktnmap/blob/master/api/src/services/index.js#L19</span>
1024
+ <span class="cstat-no" title="statement not covered" >// middleware sur service: https://github.com/kalisio/kCore/blob/master/src/services/index.js#L41</span>
1025
+ <span class="cstat-no" title="statement not covered" >// https://docs.feathersjs.com/api/express.html#custom-service-middleware</span>
1026
+ <span class="cstat-no" title="statement not covered" ></span>
1027
+ <span class="cstat-no" title="statement not covered" >const opendapUrl = 'https://thredds.irsn.kalisio.xyz/thredds/dodsC/'</span>
1028
+ <span class="cstat-no" title="statement not covered" ></span>
1029
+ <span class="cstat-no" title="statement not covered" >function toRadians (deg) {</span>
1030
+ <span class="cstat-no" title="statement not covered" > return deg * (Math.PI / 180.0)</span>
1031
+ <span class="cstat-no" title="statement not covered" >}</span>
1032
+ <span class="cstat-no" title="statement not covered" ></span>
1033
+ <span class="cstat-no" title="statement not covered" >class TilesetBuilder {</span>
1034
+ <span class="cstat-no" title="statement not covered" > async build (datasetUrl, variable, dimensions, latitude, longitude) {</span>
1035
+ <span class="cstat-no" title="statement not covered" > const descriptor = await dap.fetchDescriptor(datasetUrl)</span>
1036
+ <span class="cstat-no" title="statement not covered" ></span>
1037
+ <span class="cstat-no" title="statement not covered" > // perform a few sanity checks</span>
1038
+ <span class="cstat-no" title="statement not covered" > /*</span>
1039
+ <span class="cstat-no" title="statement not covered" > if (!dap.variableIsGrid(descriptor, variable))</span>
1040
+ <span class="cstat-no" title="statement not covered" > return ?</span>
1041
+ <span class="cstat-no" title="statement not covered" > if (!dap.variableIsArray(descriptor, latitude))</span>
1042
+ <span class="cstat-no" title="statement not covered" > return ?</span>
1043
+ <span class="cstat-no" title="statement not covered" > if (!dap.variableIsArray(descriptor, longitude))</span>
1044
+ <span class="cstat-no" title="statement not covered" > return ?</span>
1045
+ <span class="cstat-no" title="statement not covered" > */</span>
1046
+ <span class="cstat-no" title="statement not covered" ></span>
1047
+ <span class="cstat-no" title="statement not covered" > const latIndex = dap.getGridDimensionIndex(descriptor, variable, latitude)</span>
1048
+ <span class="cstat-no" title="statement not covered" > const latCount = dap.getGridDimensionLength(descriptor, variable, latIndex)</span>
1049
+ <span class="cstat-no" title="statement not covered" > const lonIndex = dap.getGridDimensionIndex(descriptor, variable, longitude)</span>
1050
+ <span class="cstat-no" title="statement not covered" > const lonCount = dap.getGridDimensionLength(descriptor, variable, lonIndex)</span>
1051
+ <span class="cstat-no" title="statement not covered" ></span>
1052
+ <span class="cstat-no" title="statement not covered" > const dims = Object.assign({}, dimensions)</span>
1053
+ <span class="cstat-no" title="statement not covered" > dims[latitude] = `0:${latCount - 1}`</span>
1054
+ <span class="cstat-no" title="statement not covered" > dims[longitude] = `0:${lonCount - 1}`</span>
1055
+ <span class="cstat-no" title="statement not covered" > const indices = dap.makeGridIndices(descriptor, variable, dims)</span>
1056
+ <span class="cstat-no" title="statement not covered" > const query = dap.makeGridQuery(datasetUrl, variable, indices)</span>
1057
+ <span class="cstat-no" title="statement not covered" ></span>
1058
+ <span class="cstat-no" title="statement not covered" > const data = await dap.fetchData(query)</span>
1059
+ <span class="cstat-no" title="statement not covered" > const valData = data[0][0]</span>
1060
+ <span class="cstat-no" title="statement not covered" > const latData = data[0][latIndex + 1]</span>
1061
+ <span class="cstat-no" title="statement not covered" > const lonData = data[0][lonIndex + 1]</span>
1062
+ <span class="cstat-no" title="statement not covered" ></span>
1063
+ <span class="cstat-no" title="statement not covered" > const minMaxLat = dap.getMinMaxArray(latData)</span>
1064
+ <span class="cstat-no" title="statement not covered" > const minMaxLon = dap.getMinMaxArray(lonData)</span>
1065
+ <span class="cstat-no" title="statement not covered" > const minMaxVal = dap.getMinMaxGrid(valData, indices.length)</span>
1066
+ <span class="cstat-no" title="statement not covered" ></span>
1067
+ <span class="cstat-no" title="statement not covered" > // normalize longitude</span>
1068
+ <span class="cstat-no" title="statement not covered" > if (minMaxLon[0] &gt; 180.0) minMaxLon[0] -= 360.0</span>
1069
+ <span class="cstat-no" title="statement not covered" > if (minMaxLon[1] &gt; 180.0) minMaxLon[1] -= 360.0</span>
1070
+ <span class="cstat-no" title="statement not covered" > const lon0 = minMaxLon[0]</span>
1071
+ <span class="cstat-no" title="statement not covered" > const lon1 = minMaxLon[1]</span>
1072
+ <span class="cstat-no" title="statement not covered" > minMaxLon[0] = Math.min(lon0, lon1)</span>
1073
+ <span class="cstat-no" title="statement not covered" > minMaxLon[1] = Math.max(lon0, lon1)</span>
1074
+ <span class="cstat-no" title="statement not covered" ></span>
1075
+ <span class="cstat-no" title="statement not covered" > minMaxLat[0] = Math.max(minMaxLat[0], -90.0)</span>
1076
+ <span class="cstat-no" title="statement not covered" > minMaxLat[1] = Math.min(minMaxLat[1], 90.0)</span>
1077
+ <span class="cstat-no" title="statement not covered" > minMaxLon[0] = Math.max(minMaxLon[0], -180.0)</span>
1078
+ <span class="cstat-no" title="statement not covered" > minMaxLon[1] = Math.min(minMaxLon[1], 180.0)</span>
1079
+ <span class="cstat-no" title="statement not covered" ></span>
1080
+ <span class="cstat-no" title="statement not covered" > this.datasetUrl = datasetUrl</span>
1081
+ <span class="cstat-no" title="statement not covered" > this.variable = variable</span>
1082
+ <span class="cstat-no" title="statement not covered" > this.query = query</span>
1083
+ <span class="cstat-no" title="statement not covered" > this.indices = indices</span>
1084
+ <span class="cstat-no" title="statement not covered" > this.latIndex = latIndex</span>
1085
+ <span class="cstat-no" title="statement not covered" > this.lonIndex = lonIndex</span>
1086
+ <span class="cstat-no" title="statement not covered" > this.minMaxVal = minMaxVal</span>
1087
+ <span class="cstat-no" title="statement not covered" ></span>
1088
+ <span class="cstat-no" title="statement not covered" > const tileset = {</span>
1089
+ <span class="cstat-no" title="statement not covered" > asset: {</span>
1090
+ <span class="cstat-no" title="statement not covered" > version: '1.0'</span>
1091
+ <span class="cstat-no" title="statement not covered" > // tilesetVersion: "e575c6f1-a45b-420a-b172-6449fa6e0a59",</span>
1092
+ <span class="cstat-no" title="statement not covered" > },</span>
1093
+ <span class="cstat-no" title="statement not covered" > properties: {</span>
1094
+ <span class="cstat-no" title="statement not covered" > /*</span>
1095
+ <span class="cstat-no" title="statement not covered" > temperature: {</span>
1096
+ <span class="cstat-no" title="statement not covered" > minimum: minMaxVal[0] - 273.15,</span>
1097
+ <span class="cstat-no" title="statement not covered" > maximum: minMaxVal[1] - 273.15,</span>
1098
+ <span class="cstat-no" title="statement not covered" > },</span>
1099
+ <span class="cstat-no" title="statement not covered" > */</span>
1100
+ <span class="cstat-no" title="statement not covered" > },</span>
1101
+ <span class="cstat-no" title="statement not covered" > geometricError: 100000.0,</span>
1102
+ <span class="cstat-no" title="statement not covered" > root: {</span>
1103
+ <span class="cstat-no" title="statement not covered" > boundingVolume: {</span>
1104
+ <span class="cstat-no" title="statement not covered" > region: [toRadians(minMaxLon[0]), toRadians(minMaxLat[0]), toRadians(minMaxLon[1]), toRadians(minMaxLat[1]), 0, 20]</span>
1105
+ <span class="cstat-no" title="statement not covered" > },</span>
1106
+ <span class="cstat-no" title="statement not covered" > geometricError: 100000.0,</span>
1107
+ <span class="cstat-no" title="statement not covered" > refine: 'REPLACE',</span>
1108
+ <span class="cstat-no" title="statement not covered" > /*</span>
1109
+ <span class="cstat-no" title="statement not covered" > content: {</span>
1110
+ <span class="cstat-no" title="statement not covered" > uri: `content.vctr?file=${query.query.file}&amp;variable=${query.query.variable}&amp;time=${query.query.time}&amp;s=0&amp;n=${iLatMax}&amp;w=0&amp;e=${iLonMax}`,</span>
1111
+ <span class="cstat-no" title="statement not covered" > },</span>
1112
+ <span class="cstat-no" title="statement not covered" > */</span>
1113
+ <span class="cstat-no" title="statement not covered" > children: this.refineTile(latData, lonData, 0, latData.length, 0, lonData.length)</span>
1114
+ <span class="cstat-no" title="statement not covered" > // children: []</span>
1115
+ <span class="cstat-no" title="statement not covered" > }</span>
1116
+ <span class="cstat-no" title="statement not covered" > }</span>
1117
+ <span class="cstat-no" title="statement not covered" ></span>
1118
+ <span class="cstat-no" title="statement not covered" > // store min max values of explored variables</span>
1119
+ <span class="cstat-no" title="statement not covered" > tileset.properties[variable] = {</span>
1120
+ <span class="cstat-no" title="statement not covered" > minimum: minMaxVal[0],</span>
1121
+ <span class="cstat-no" title="statement not covered" > maximum: minMaxVal[1]</span>
1122
+ <span class="cstat-no" title="statement not covered" > }</span>
1123
+ <span class="cstat-no" title="statement not covered" ></span>
1124
+ <span class="cstat-no" title="statement not covered" > return tileset</span>
1125
+ <span class="cstat-no" title="statement not covered" > }</span>
1126
+ <span class="cstat-no" title="statement not covered" ></span>
1127
+ <span class="cstat-no" title="statement not covered" > refineTile (lat, lon, iLat, latCount, iLon, lonCount) {</span>
1128
+ <span class="cstat-no" title="statement not covered" > // const lonCount = e - w</span>
1129
+ <span class="cstat-no" title="statement not covered" > // const latCount = n - s</span>
1130
+ <span class="cstat-no" title="statement not covered" > const children = []</span>
1131
+ <span class="cstat-no" title="statement not covered" > /*</span>
1132
+ <span class="cstat-no" title="statement not covered" > if (latCount &gt; 10 &amp;&amp; lonCount &gt; 10) {</span>
1133
+ <span class="cstat-no" title="statement not covered" > const w0 = w</span>
1134
+ <span class="cstat-no" title="statement not covered" > const w1 = w + Math.floor(lonCount / 2)</span>
1135
+ <span class="cstat-no" title="statement not covered" > const s0 = s</span>
1136
+ <span class="cstat-no" title="statement not covered" > const s1 = s + Math.floor(latCount / 2)</span>
1137
+ <span class="cstat-no" title="statement not covered" > children.push(makeTile(query, lat, lon, w0, s0, w1, s1))</span>
1138
+ <span class="cstat-no" title="statement not covered" > children[children.length - 1].children = refineTile(query, lat, lon, w0, s0, w1, s1)</span>
1139
+ <span class="cstat-no" title="statement not covered" > children.push(makeTile(query, lat, lon, w0, s1, w1, n))</span>
1140
+ <span class="cstat-no" title="statement not covered" > children[children.length - 1].children = refineTile(query, lat, lon, w0, s1, w1, n)</span>
1141
+ <span class="cstat-no" title="statement not covered" > children.push(makeTile(query, lat, lon, w1, s0, e, s1))</span>
1142
+ <span class="cstat-no" title="statement not covered" > children[children.length - 1].children = refineTile(query, lat, lon, w1, s0, e, s1)</span>
1143
+ <span class="cstat-no" title="statement not covered" > children.push(makeTile(query, lat, lon, w1, s1, e, n))</span>
1144
+ <span class="cstat-no" title="statement not covered" > children[children.length - 1].children = refineTile(query, lat, lon, w1, s1, e, n)</span>
1145
+ <span class="cstat-no" title="statement not covered" > }</span>
1146
+ <span class="cstat-no" title="statement not covered" > */</span>
1147
+ <span class="cstat-no" title="statement not covered" ></span>
1148
+ <span class="cstat-no" title="statement not covered" > const ustep = 40</span>
1149
+ <span class="cstat-no" title="statement not covered" > const vstep = 40</span>
1150
+ <span class="cstat-no" title="statement not covered" > const utiles = Math.floor(lonCount / ustep) /* + (lonCount % 10 !== 0 ? 1 : 0) */</span>
1151
+ <span class="cstat-no" title="statement not covered" > const vtiles = Math.floor(latCount / vstep) /* + (latCount % 10 !== 0 ? 1 : 0) */</span>
1152
+ <span class="cstat-no" title="statement not covered" > let startu = iLon</span>
1153
+ <span class="cstat-no" title="statement not covered" > let startv = iLat</span>
1154
+ <span class="cstat-no" title="statement not covered" > for (let u = 0; u &lt; utiles; ++u) {</span>
1155
+ <span class="cstat-no" title="statement not covered" > const u0 = startu</span>
1156
+ <span class="cstat-no" title="statement not covered" > const u1 = Math.min(u0 + ustep, iLon + lonCount - 1)</span>
1157
+ <span class="cstat-no" title="statement not covered" > for (let v = 0; v &lt; vtiles; ++v) {</span>
1158
+ <span class="cstat-no" title="statement not covered" > const v0 = startv</span>
1159
+ <span class="cstat-no" title="statement not covered" > const v1 = Math.min(v0 + vstep, iLat + latCount - 1)</span>
1160
+ <span class="cstat-no" title="statement not covered" > // children.push(makeTile(query, lat, lon, u0, v0, u1, v1))</span>
1161
+ <span class="cstat-no" title="statement not covered" > const tile = this.makeTile(lat, lon, v0, v1 - v0, u0, u1 - u0)</span>
1162
+ <span class="cstat-no" title="statement not covered" > if (tile !== undefined) { children.push(tile) }</span>
1163
+ <span class="cstat-no" title="statement not covered" > startv += (vstep - 1)</span>
1164
+ <span class="cstat-no" title="statement not covered" > }</span>
1165
+ <span class="cstat-no" title="statement not covered" > startu += (ustep - 1)</span>
1166
+ <span class="cstat-no" title="statement not covered" > startv = iLat</span>
1167
+ <span class="cstat-no" title="statement not covered" > }</span>
1168
+ <span class="cstat-no" title="statement not covered" ></span>
1169
+ <span class="cstat-no" title="statement not covered" > return children</span>
1170
+ <span class="cstat-no" title="statement not covered" > }</span>
1171
+ <span class="cstat-no" title="statement not covered" ></span>
1172
+ <span class="cstat-no" title="statement not covered" > makeTile (lat, lon, iLat, latCount, iLon, lonCount) {</span>
1173
+ <span class="cstat-no" title="statement not covered" > let minLat = lat[iLat]</span>
1174
+ <span class="cstat-no" title="statement not covered" > let maxLat = lat[iLat]</span>
1175
+ <span class="cstat-no" title="statement not covered" > let minLon = lon[iLon]</span>
1176
+ <span class="cstat-no" title="statement not covered" > let maxLon = lon[iLon]</span>
1177
+ <span class="cstat-no" title="statement not covered" > for (let i = 1; i &lt; latCount; ++i) {</span>
1178
+ <span class="cstat-no" title="statement not covered" > minLat = Math.min(minLat, lat[iLat + i])</span>
1179
+ <span class="cstat-no" title="statement not covered" > maxLat = Math.max(maxLat, lat[iLat + i])</span>
1180
+ <span class="cstat-no" title="statement not covered" > }</span>
1181
+ <span class="cstat-no" title="statement not covered" > for (let i = 1; i &lt; lonCount; ++i) {</span>
1182
+ <span class="cstat-no" title="statement not covered" > minLon = Math.min(minLon, lon[iLon + i])</span>
1183
+ <span class="cstat-no" title="statement not covered" > maxLon = Math.max(maxLon, lon[iLon + i])</span>
1184
+ <span class="cstat-no" title="statement not covered" > }</span>
1185
+ <span class="cstat-no" title="statement not covered" ></span>
1186
+ <span class="cstat-no" title="statement not covered" > /**/</span>
1187
+ <span class="cstat-no" title="statement not covered" > if (minLon &gt; 180.0) minLon -= 360.0</span>
1188
+ <span class="cstat-no" title="statement not covered" > if (maxLon &gt; 180.0) maxLon -= 360.0</span>
1189
+ <span class="cstat-no" title="statement not covered" > const lon0 = minLon</span>
1190
+ <span class="cstat-no" title="statement not covered" > const lon1 = maxLon</span>
1191
+ <span class="cstat-no" title="statement not covered" > minLon = Math.min(lon0, lon1)</span>
1192
+ <span class="cstat-no" title="statement not covered" > maxLon = Math.max(lon0, lon1)</span>
1193
+ <span class="cstat-no" title="statement not covered" > /**/</span>
1194
+ <span class="cstat-no" title="statement not covered" ></span>
1195
+ <span class="cstat-no" title="statement not covered" > minLat = Math.max(minLat, -90.0)</span>
1196
+ <span class="cstat-no" title="statement not covered" > maxLat = Math.min(maxLat, 90.0)</span>
1197
+ <span class="cstat-no" title="statement not covered" > minLon = Math.max(minLon, -180.0)</span>
1198
+ <span class="cstat-no" title="statement not covered" > maxLon = Math.min(maxLon, 180.0)</span>
1199
+ <span class="cstat-no" title="statement not covered" ></span>
1200
+ <span class="cstat-no" title="statement not covered" > // if ((minLon &gt; 20) || (maxLon &lt; -20) || (maxLat &lt; 40) || (minLat &gt; 60)) return undefined</span>
1201
+ <span class="cstat-no" title="statement not covered" ></span>
1202
+ <span class="cstat-no" title="statement not covered" > // parameters to buildBatchedTile</span>
1203
+ <span class="cstat-no" title="statement not covered" > const tileIndices = [...this.indices]</span>
1204
+ <span class="cstat-no" title="statement not covered" > tileIndices[this.latIndex] = `${iLat}:${iLat + latCount - 1}`</span>
1205
+ <span class="cstat-no" title="statement not covered" > tileIndices[this.lonIndex] = `${iLon}:${iLon + lonCount - 1}`</span>
1206
+ <span class="cstat-no" title="statement not covered" > const tileQuery = dap.makeGridQuery(this.datasetUrl, this.variable, tileIndices)</span>
1207
+ <span class="cstat-no" title="statement not covered" > const q = {</span>
1208
+ <span class="cstat-no" title="statement not covered" > query: tileQuery,</span>
1209
+ <span class="cstat-no" title="statement not covered" > indices: tileIndices,</span>
1210
+ <span class="cstat-no" title="statement not covered" > latIndex: this.latIndex,</span>
1211
+ <span class="cstat-no" title="statement not covered" > lonIndex: this.lonIndex,</span>
1212
+ <span class="cstat-no" title="statement not covered" > minMaxVal: this.minMaxVal</span>
1213
+ <span class="cstat-no" title="statement not covered" > }</span>
1214
+ <span class="cstat-no" title="statement not covered" ></span>
1215
+ <span class="cstat-no" title="statement not covered" > return {</span>
1216
+ <span class="cstat-no" title="statement not covered" > boundingVolume: {</span>
1217
+ <span class="cstat-no" title="statement not covered" > region: [toRadians(minLon), toRadians(minLat), toRadians(maxLon), toRadians(maxLat), 0, 20]</span>
1218
+ <span class="cstat-no" title="statement not covered" > },</span>
1219
+ <span class="cstat-no" title="statement not covered" > geometricError: 100000.0,</span>
1220
+ <span class="cstat-no" title="statement not covered" > refine: 'REPLACE',</span>
1221
+ <span class="cstat-no" title="statement not covered" > content: {</span>
1222
+ <span class="cstat-no" title="statement not covered" > // uri: `content.vctr?file=${query.query.file}&amp;variable=${query.query.variable}&amp;time=${query.query.time}&amp;w=${w}&amp;e=${e}&amp;s=${s}&amp;n=${n}`</span>
1223
+ <span class="cstat-no" title="statement not covered" > // uri: `content.i3dm?file=${query.query.file}&amp;variable=${query.query.variable}&amp;time=${query.query.time}&amp;w=${w}&amp;e=${e}&amp;s=${s}&amp;n=${n}`</span>
1224
+ <span class="cstat-no" title="statement not covered" > // uri: `tile.b3dm?box=${iLat},${latCount},${iLon},${lonCount}`</span>
1225
+ <span class="cstat-no" title="statement not covered" > uri: `tile.b3dm?query=${JSON.stringify(q)}`</span>
1226
+ <span class="cstat-no" title="statement not covered" > }</span>
1227
+ <span class="cstat-no" title="statement not covered" > // children: []</span>
1228
+ <span class="cstat-no" title="statement not covered" > }</span>
1229
+ <span class="cstat-no" title="statement not covered" > }</span>
1230
+ <span class="cstat-no" title="statement not covered" >}</span>
1231
+ <span class="cstat-no" title="statement not covered" ></span>
1232
+ <span class="cstat-no" title="statement not covered" >class TileBuilder {</span>
1233
+ <span class="cstat-no" title="statement not covered" > async build (query, indices, latIndex, lonIndex, minMaxVal) {</span>
1234
+ <span class="cstat-no" title="statement not covered" > const data = await dap.fetchData(query)</span>
1235
+ <span class="cstat-no" title="statement not covered" ></span>
1236
+ <span class="cstat-no" title="statement not covered" > const valData = data[0][0]</span>
1237
+ <span class="cstat-no" title="statement not covered" > const latData = data[0][latIndex]</span>
1238
+ <span class="cstat-no" title="statement not covered" > const lonData = data[0][lonIndex]</span>
1239
+ <span class="cstat-no" title="statement not covered" ></span>
1240
+ <span class="cstat-no" title="statement not covered" > const gltf = this.buildglTF(indices, latIndex, lonIndex, minMaxVal, valData, latData, lonData)</span>
1241
+ <span class="cstat-no" title="statement not covered" ></span>
1242
+ <span class="cstat-no" title="statement not covered" > const featureTableJSON = {</span>
1243
+ <span class="cstat-no" title="statement not covered" > BATCH_LENGTH: 0</span>
1244
+ <span class="cstat-no" title="statement not covered" > }</span>
1245
+ <span class="cstat-no" title="statement not covered" > const featureTableJSONBuffer = JSON.stringify(featureTableJSON, null, 0)</span>
1246
+ <span class="cstat-no" title="statement not covered" > const featureTableJSONPaddingCount = (featureTableJSONBuffer.length % 8) ? 8 - (featureTableJSONBuffer.length % 8) : 0</span>
1247
+ <span class="cstat-no" title="statement not covered" ></span>
1248
+ <span class="cstat-no" title="statement not covered" > const header = Buffer.alloc(28)</span>
1249
+ <span class="cstat-no" title="statement not covered" > const featureTableJSONPadding = Buffer.alloc(featureTableJSONPaddingCount, 0x20)</span>
1250
+ <span class="cstat-no" title="statement not covered" ></span>
1251
+ <span class="cstat-no" title="statement not covered" > /* let byteLength = header.length +</span>
1252
+ <span class="cstat-no" title="statement not covered" > featureTableJSONBuffer.length + featureTableJSONPaddingCount /* + featureTableBinary.length */</span>
1253
+ <span class="cstat-no" title="statement not covered" > // + batchTableJSONBuffer.length + batchTableJSONPaddingCount + batchTableBinary.length</span>
1254
+ <span class="cstat-no" title="statement not covered" ></span>
1255
+ <span class="cstat-no" title="statement not covered" > /* for (const buf of gltf) {</span>
1256
+ <span class="cstat-no" title="statement not covered" > byteLength += buf.length</span>
1257
+ <span class="cstat-no" title="statement not covered" > } */</span>
1258
+ <span class="cstat-no" title="statement not covered" ></span>
1259
+ <span class="cstat-no" title="statement not covered" > // Is it useful ?</span>
1260
+ <span class="cstat-no" title="statement not covered" > // let hidx = 0</span>
1261
+ <span class="cstat-no" title="statement not covered" > // hidx += header.write('b3dm', hidx) // magic</span>
1262
+ <span class="cstat-no" title="statement not covered" > // hidx = header.writeUInt32LE(1, hidx) // version</span>
1263
+ <span class="cstat-no" title="statement not covered" > // hidx = header.writeUInt32LE(byteLength, hidx) // byteLength</span>
1264
+ <span class="cstat-no" title="statement not covered" > // hidx = header.writeUInt32LE(featureTableJSONBuffer.length + featureTableJSONPaddingCount, hidx) // featureTableJSONByteLength</span>
1265
+ <span class="cstat-no" title="statement not covered" > // hidx = header.writeUInt32LE(/* featureTableBinary.length */ 0, hidx) // featureTableBinaryByteLength</span>
1266
+ <span class="cstat-no" title="statement not covered" > // hidx = header.writeUInt32LE(/* batchTableJSONBuffer.length + batchTableJSONPaddingCount */ 0, hidx) // batchTableJSONByteLength</span>
1267
+ <span class="cstat-no" title="statement not covered" > // hidx = header.writeUInt32LE(/* batchTableBinary.length */ 0, hidx) // batchTableBinaryByteLength</span>
1268
+ <span class="cstat-no" title="statement not covered" ></span>
1269
+ <span class="cstat-no" title="statement not covered" > const buffers = [header, featureTableJSONBuffer, featureTableJSONPadding]</span>
1270
+ <span class="cstat-no" title="statement not covered" > return buffers.concat(gltf)</span>
1271
+ <span class="cstat-no" title="statement not covered" > }</span>
1272
+ <span class="cstat-no" title="statement not covered" ></span>
1273
+ <span class="cstat-no" title="statement not covered" > buildglTF (query, latIndex, lonIndex, minMaxVal, valData, latData, lonData) {</span>
1274
+ <span class="cstat-no" title="statement not covered" > const vertexCount = latData.length * lonData.length</span>
1275
+ <span class="cstat-no" title="statement not covered" > const indexCount = (latData.length - 1) * (lonData.length - 1) * 6</span>
1276
+ <span class="cstat-no" title="statement not covered" > const positions = Buffer.alloc(vertexCount * 3 * 4)</span>
1277
+ <span class="cstat-no" title="statement not covered" > const colors = Buffer.alloc(vertexCount * 4)</span>
1278
+ <span class="cstat-no" title="statement not covered" > const indices = vertexCount &gt; 65535</span>
1279
+ <span class="cstat-no" title="statement not covered" > ? Buffer.alloc(indexCount * 4)</span>
1280
+ <span class="cstat-no" title="statement not covered" > : Buffer.alloc(indexCount * 2)</span>
1281
+ <span class="cstat-no" title="statement not covered" ></span>
1282
+ <span class="cstat-no" title="statement not covered" > const writeIndex = vertexCount &gt; 65535</span>
1283
+ <span class="cstat-no" title="statement not covered" > ? function (index, offset) { return indices.writeUInt32LE(index, offset) }</span>
1284
+ <span class="cstat-no" title="statement not covered" > : function (index, offset) { return indices.writeUInt16LE(index, offset) }</span>
1285
+ <span class="cstat-no" title="statement not covered" ></span>
1286
+ <span class="cstat-no" title="statement not covered" > // fill indices</span>
1287
+ <span class="cstat-no" title="statement not covered" > let iidx = 0</span>
1288
+ <span class="cstat-no" title="statement not covered" > // const minIdx = 0</span>
1289
+ <span class="cstat-no" title="statement not covered" > // const maxIdx = vertexCount - 1</span>
1290
+ <span class="cstat-no" title="statement not covered" > for (let i = 1; i &lt; lonData.length; ++i) {</span>
1291
+ <span class="cstat-no" title="statement not covered" > for (let j = 0; j &lt; latData.length - 1; ++j) {</span>
1292
+ <span class="cstat-no" title="statement not covered" > const i0 = j + (i - 1) * latData.length</span>
1293
+ <span class="cstat-no" title="statement not covered" > const i1 = i0 + 1</span>
1294
+ <span class="cstat-no" title="statement not covered" > const i2 = i1 + latData.length</span>
1295
+ <span class="cstat-no" title="statement not covered" > const i3 = i0 + latData.length</span>
1296
+ <span class="cstat-no" title="statement not covered" ></span>
1297
+ <span class="cstat-no" title="statement not covered" > iidx = writeIndex(i0, iidx)</span>
1298
+ <span class="cstat-no" title="statement not covered" > iidx = writeIndex(i1, iidx)</span>
1299
+ <span class="cstat-no" title="statement not covered" > iidx = writeIndex(i2, iidx)</span>
1300
+ <span class="cstat-no" title="statement not covered" > iidx = writeIndex(i0, iidx)</span>
1301
+ <span class="cstat-no" title="statement not covered" > iidx = writeIndex(i2, iidx)</span>
1302
+ <span class="cstat-no" title="statement not covered" > iidx = writeIndex(i3, iidx)</span>
1303
+ <span class="cstat-no" title="statement not covered" > }</span>
1304
+ <span class="cstat-no" title="statement not covered" > }</span>
1305
+ <span class="cstat-no" title="statement not covered" ></span>
1306
+ <span class="cstat-no" title="statement not covered" > const scale = chroma.scale('YlOrRd').domain(minMaxVal)</span>
1307
+ <span class="cstat-no" title="statement not covered" > // let scale = chromajs.scale('RdYlBu').domain([ dataSetTempBounds[1], dataSetTempBounds[0] ])</span>
1308
+ <span class="cstat-no" title="statement not covered" > // let scale = chromajs.scale('Spectral').domain([ dataSetTempBounds[1], dataSetTempBounds[0] ])</span>
1309
+ <span class="cstat-no" title="statement not covered" ></span>
1310
+ <span class="cstat-no" title="statement not covered" > // fill attributes</span>
1311
+ <span class="cstat-no" title="statement not covered" > let vidx = 0</span>
1312
+ <span class="cstat-no" title="statement not covered" > let cidx = 0</span>
1313
+ <span class="cstat-no" title="statement not covered" > let maxVtxX = -4294967295.0</span>
1314
+ <span class="cstat-no" title="statement not covered" > let minVtxX = 4294967295.0</span>
1315
+ <span class="cstat-no" title="statement not covered" > let maxVtxY = -4294967295.0</span>
1316
+ <span class="cstat-no" title="statement not covered" > let minVtxY = 4294967295.0</span>
1317
+ <span class="cstat-no" title="statement not covered" > let maxVtxZ = -4294967295.0</span>
1318
+ <span class="cstat-no" title="statement not covered" > let minVtxZ = 4294967295.0</span>
1319
+ <span class="cstat-no" title="statement not covered" > for (let lo = 0; lo &lt; lonData.length; ++lo) {</span>
1320
+ <span class="cstat-no" title="statement not covered" > query[lonIndex] = lo</span>
1321
+ <span class="cstat-no" title="statement not covered" > if (lonData[lo] &gt; 180.0) lonData[lo] -= 360.0</span>
1322
+ <span class="cstat-no" title="statement not covered" > for (let la = 0; la &lt; latData.length; ++la) {</span>
1323
+ <span class="cstat-no" title="statement not covered" > const pos = cesium.Cartesian3.fromDegrees(lonData[lo], latData[la], 8000)</span>
1324
+ <span class="cstat-no" title="statement not covered" > maxVtxX = Math.max(maxVtxX, pos.x)</span>
1325
+ <span class="cstat-no" title="statement not covered" > minVtxX = Math.min(minVtxX, pos.x)</span>
1326
+ <span class="cstat-no" title="statement not covered" > maxVtxY = Math.max(maxVtxY, pos.y)</span>
1327
+ <span class="cstat-no" title="statement not covered" > minVtxY = Math.min(minVtxY, pos.y)</span>
1328
+ <span class="cstat-no" title="statement not covered" > maxVtxZ = Math.max(maxVtxZ, pos.z)</span>
1329
+ <span class="cstat-no" title="statement not covered" > minVtxZ = Math.min(minVtxZ, pos.z)</span>
1330
+ <span class="cstat-no" title="statement not covered" > vidx = positions.writeFloatLE(pos.x, vidx)</span>
1331
+ <span class="cstat-no" title="statement not covered" > vidx = positions.writeFloatLE(pos.y, vidx)</span>
1332
+ <span class="cstat-no" title="statement not covered" > vidx = positions.writeFloatLE(pos.z, vidx)</span>
1333
+ <span class="cstat-no" title="statement not covered" ></span>
1334
+ <span class="cstat-no" title="statement not covered" > query[latIndex] = la</span>
1335
+ <span class="cstat-no" title="statement not covered" > const value = dap.gridValue(valData, query)</span>
1336
+ <span class="cstat-no" title="statement not covered" > const color = scale(value).rgb()</span>
1337
+ <span class="cstat-no" title="statement not covered" > cidx = colors.writeUInt8(color[0], cidx)</span>
1338
+ <span class="cstat-no" title="statement not covered" > cidx = colors.writeUInt8(color[1], cidx)</span>
1339
+ <span class="cstat-no" title="statement not covered" > cidx = colors.writeUInt8(color[2], cidx)</span>
1340
+ <span class="cstat-no" title="statement not covered" > cidx = colors.writeUInt8(160, cidx)</span>
1341
+ <span class="cstat-no" title="statement not covered" > }</span>
1342
+ <span class="cstat-no" title="statement not covered" > }</span>
1343
+ <span class="cstat-no" title="statement not covered" ></span>
1344
+ <span class="cstat-no" title="statement not covered" > const positionPaddingCount = 0</span>
1345
+ <span class="cstat-no" title="statement not covered" > const positionPadding = Buffer.alloc(positionPaddingCount, 0)</span>
1346
+ <span class="cstat-no" title="statement not covered" ></span>
1347
+ <span class="cstat-no" title="statement not covered" > const gltfJSON = {</span>
1348
+ <span class="cstat-no" title="statement not covered" > asset: {</span>
1349
+ <span class="cstat-no" title="statement not covered" > version: '2.0'</span>
1350
+ <span class="cstat-no" title="statement not covered" > },</span>
1351
+ <span class="cstat-no" title="statement not covered" > scenes: [{ nodes: [0] }],</span>
1352
+ <span class="cstat-no" title="statement not covered" > nodes: [{</span>
1353
+ <span class="cstat-no" title="statement not covered" > matrix: [1, 0, 0, 0, 0, 0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 1],</span>
1354
+ <span class="cstat-no" title="statement not covered" > mesh: 0</span>
1355
+ <span class="cstat-no" title="statement not covered" > }],</span>
1356
+ <span class="cstat-no" title="statement not covered" > meshes: [{</span>
1357
+ <span class="cstat-no" title="statement not covered" > primitives: [{</span>
1358
+ <span class="cstat-no" title="statement not covered" > attributes: {</span>
1359
+ <span class="cstat-no" title="statement not covered" > POSITION: 1,</span>
1360
+ <span class="cstat-no" title="statement not covered" > COLOR_0: 2</span>
1361
+ <span class="cstat-no" title="statement not covered" > },</span>
1362
+ <span class="cstat-no" title="statement not covered" > indices: 0,</span>
1363
+ <span class="cstat-no" title="statement not covered" > mode: 4, // TRIANGLES</span>
1364
+ <span class="cstat-no" title="statement not covered" > material: 0</span>
1365
+ <span class="cstat-no" title="statement not covered" > }]</span>
1366
+ <span class="cstat-no" title="statement not covered" > }],</span>
1367
+ <span class="cstat-no" title="statement not covered" > materials: [{</span>
1368
+ <span class="cstat-no" title="statement not covered" > alphaMode: 'BLEND'</span>
1369
+ <span class="cstat-no" title="statement not covered" > }],</span>
1370
+ <span class="cstat-no" title="statement not covered" > accessors: [{</span>
1371
+ <span class="cstat-no" title="statement not covered" > bufferView: 0,</span>
1372
+ <span class="cstat-no" title="statement not covered" > byteOffset: 0,</span>
1373
+ <span class="cstat-no" title="statement not covered" > componentType: vertexCount &gt; 65535 ? 5125 : 5123, // uint32 : uint16</span>
1374
+ <span class="cstat-no" title="statement not covered" > count: indexCount,</span>
1375
+ <span class="cstat-no" title="statement not covered" > max: [vertexCount - 1],</span>
1376
+ <span class="cstat-no" title="statement not covered" > min: [0],</span>
1377
+ <span class="cstat-no" title="statement not covered" > type: 'SCALAR'</span>
1378
+ <span class="cstat-no" title="statement not covered" > }, {</span>
1379
+ <span class="cstat-no" title="statement not covered" > bufferView: 1,</span>
1380
+ <span class="cstat-no" title="statement not covered" > byteOffset: 0,</span>
1381
+ <span class="cstat-no" title="statement not covered" > componentType: 5126, // float</span>
1382
+ <span class="cstat-no" title="statement not covered" > count: vertexCount,</span>
1383
+ <span class="cstat-no" title="statement not covered" > max: [maxVtxX, maxVtxY, maxVtxZ],</span>
1384
+ <span class="cstat-no" title="statement not covered" > min: [minVtxX, minVtxY, minVtxZ],</span>
1385
+ <span class="cstat-no" title="statement not covered" > type: 'VEC3'</span>
1386
+ <span class="cstat-no" title="statement not covered" > }, {</span>
1387
+ <span class="cstat-no" title="statement not covered" > bufferView: 2,</span>
1388
+ <span class="cstat-no" title="statement not covered" > byteOffset: 0,</span>
1389
+ <span class="cstat-no" title="statement not covered" > componentType: 5121, // uint8</span>
1390
+ <span class="cstat-no" title="statement not covered" > count: vertexCount,</span>
1391
+ <span class="cstat-no" title="statement not covered" > normalized: true,</span>
1392
+ <span class="cstat-no" title="statement not covered" > /*</span>
1393
+ <span class="cstat-no" title="statement not covered" > max: [ maxVtxX, maxVtxY, maxVtxZ ],</span>
1394
+ <span class="cstat-no" title="statement not covered" > min: [ minVtxX, minVtxY, minVtxZ ],</span>
1395
+ <span class="cstat-no" title="statement not covered" > */</span>
1396
+ <span class="cstat-no" title="statement not covered" > type: 'VEC4'</span>
1397
+ <span class="cstat-no" title="statement not covered" > }],</span>
1398
+ <span class="cstat-no" title="statement not covered" > bufferViews: [{</span>
1399
+ <span class="cstat-no" title="statement not covered" > buffer: 0,</span>
1400
+ <span class="cstat-no" title="statement not covered" > byteOffset: 0,</span>
1401
+ <span class="cstat-no" title="statement not covered" > byteLength: indices.length,</span>
1402
+ <span class="cstat-no" title="statement not covered" > target: 34963 // ELEMENT_ARRAY_BUFFER</span>
1403
+ <span class="cstat-no" title="statement not covered" > }, {</span>
1404
+ <span class="cstat-no" title="statement not covered" > buffer: 0,</span>
1405
+ <span class="cstat-no" title="statement not covered" > byteOffset: indices.length + positionPadding.length,</span>
1406
+ <span class="cstat-no" title="statement not covered" > byteLength: positions.length,</span>
1407
+ <span class="cstat-no" title="statement not covered" > byteStride: 12,</span>
1408
+ <span class="cstat-no" title="statement not covered" > target: 34962 // ARRAY_BUFFER</span>
1409
+ <span class="cstat-no" title="statement not covered" > }, {</span>
1410
+ <span class="cstat-no" title="statement not covered" > buffer: 0,</span>
1411
+ <span class="cstat-no" title="statement not covered" > byteOffset: indices.length + positionPadding.length + positions.length,</span>
1412
+ <span class="cstat-no" title="statement not covered" > byteLength: colors.length,</span>
1413
+ <span class="cstat-no" title="statement not covered" > byteStride: 4,</span>
1414
+ <span class="cstat-no" title="statement not covered" > target: 34962 // ARRAY_BUFFER</span>
1415
+ <span class="cstat-no" title="statement not covered" > }],</span>
1416
+ <span class="cstat-no" title="statement not covered" > buffers: [{</span>
1417
+ <span class="cstat-no" title="statement not covered" > byteLength: indices.length + positionPaddingCount + positions.length + colors.length</span>
1418
+ <span class="cstat-no" title="statement not covered" > }]</span>
1419
+ <span class="cstat-no" title="statement not covered" > }</span>
1420
+ <span class="cstat-no" title="statement not covered" > const gltfJSONBuffer = JSON.stringify(gltfJSON, null, 0)</span>
1421
+ <span class="cstat-no" title="statement not covered" > const gltfJSONChunk = Buffer.alloc(2 * 4)</span>
1422
+ <span class="cstat-no" title="statement not covered" > const gltfHeader = Buffer.alloc(12)</span>
1423
+ <span class="cstat-no" title="statement not covered" ></span>
1424
+ <span class="cstat-no" title="statement not covered" > const offset = gltfHeader.length + gltfJSONChunk.length + gltfJSONBuffer.length</span>
1425
+ <span class="cstat-no" title="statement not covered" > const gltfJSONPaddingCount = (offset % 4 !== 0) ? 4 - offset % 4 : 0</span>
1426
+ <span class="cstat-no" title="statement not covered" > const gltfJSONPadding = Buffer.alloc(gltfJSONPaddingCount, 0x20)</span>
1427
+ <span class="cstat-no" title="statement not covered" ></span>
1428
+ <span class="cstat-no" title="statement not covered" > /* Is it usefull ?</span>
1429
+ <span class="cstat-no" title="statement not covered" > let bidx = 0</span>
1430
+ <span class="cstat-no" title="statement not covered" > bidx = gltfJSONChunk.writeUInt32LE(gltfJSONBuffer.length + gltfJSONPadding.length, bidx) // chunkLength</span>
1431
+ <span class="cstat-no" title="statement not covered" > bidx = gltfJSONChunk.writeUInt32LE(0x4E4F534A, bidx) // chunkType (JSON)</span>
1432
+ <span class="cstat-no" title="statement not covered" > */</span>
1433
+ <span class="cstat-no" title="statement not covered" ></span>
1434
+ <span class="cstat-no" title="statement not covered" > // offset += gltfJSONPadding.length</span>
1435
+ <span class="cstat-no" title="statement not covered" > const gltfBinaryChunk = Buffer.alloc(2 * 4)</span>
1436
+ <span class="cstat-no" title="statement not covered" ></span>
1437
+ <span class="cstat-no" title="statement not covered" > /* bidx = 0</span>
1438
+ <span class="cstat-no" title="statement not covered" > bidx = gltfBinaryChunk.writeUInt32LE(indices.length + positionPadding.length + positions.length + colors.length, bidx) // chunkLength</span>
1439
+ <span class="cstat-no" title="statement not covered" > bidx = gltfBinaryChunk.writeUInt32LE(0x004E4942, bidx) // chunkType (binary)</span>
1440
+ <span class="cstat-no" title="statement not covered" ></span>
1441
+ <span class="cstat-no" title="statement not covered" > offset += gltfBinaryChunk.length + indices.length + positionPadding.length + positions.length + colors.length</span>
1442
+ <span class="cstat-no" title="statement not covered" ></span>
1443
+ <span class="cstat-no" title="statement not covered" > bidx = 0</span>
1444
+ <span class="cstat-no" title="statement not covered" > bidx += gltfHeader.write('glTF', bidx) // magic</span>
1445
+ <span class="cstat-no" title="statement not covered" > bidx = gltfHeader.writeUInt32LE(2, bidx) // version</span>
1446
+ <span class="cstat-no" title="statement not covered" > bidx = gltfHeader.writeUInt32LE(offset, bidx) // length</span>
1447
+ <span class="cstat-no" title="statement not covered" > */</span>
1448
+ <span class="cstat-no" title="statement not covered" ></span>
1449
+ <span class="cstat-no" title="statement not covered" > return [gltfHeader,</span>
1450
+ <span class="cstat-no" title="statement not covered" > gltfJSONChunk, gltfJSONBuffer, gltfJSONPadding,</span>
1451
+ <span class="cstat-no" title="statement not covered" > gltfBinaryChunk, indices, positionPadding, positions, colors]</span>
1452
+ <span class="cstat-no" title="statement not covered" > }</span>
1453
+ <span class="cstat-no" title="statement not covered" >}</span>
1454
+ <span class="cstat-no" title="statement not covered" ></span>
1455
+ <span class="cstat-no" title="statement not covered" >export default function (name, app, options) {</span>
1456
+ <span class="cstat-no" title="statement not covered" > // Keep track of config</span>
1457
+ <span class="cstat-no" title="statement not covered" > Object.assign(options, app.get('daptiles'))</span>
1458
+ <span class="cstat-no" title="statement not covered" > debug('daptiles created with config ', options)</span>
1459
+ <span class="cstat-no" title="statement not covered" ></span>
1460
+ <span class="cstat-no" title="statement not covered" > return {</span>
1461
+ <span class="cstat-no" title="statement not covered" > async get (id, params) {</span>
1462
+ <span class="cstat-no" title="statement not covered" > // either requesting tileset json</span>
1463
+ <span class="cstat-no" title="statement not covered" > // console.log(id)</span>
1464
+ <span class="cstat-no" title="statement not covered" > // console.log(params.query)</span>
1465
+ <span class="cstat-no" title="statement not covered" > const query = params.query</span>
1466
+ <span class="cstat-no" title="statement not covered" > // either requesting tile content</span>
1467
+ <span class="cstat-no" title="statement not covered" > if (id.endsWith('b3dm')) {</span>
1468
+ <span class="cstat-no" title="statement not covered" > const tile = JSON.parse(query.query)</span>
1469
+ <span class="cstat-no" title="statement not covered" > // const url = tile.query.replace('[', '%5B').replace(']', '%5D')</span>
1470
+ <span class="cstat-no" title="statement not covered" > const url = tile.query.replace(/\[/g, '%5B').replace(/\]/g, '%5D')</span>
1471
+ <span class="cstat-no" title="statement not covered" > const builder = new TileBuilder()</span>
1472
+ <span class="cstat-no" title="statement not covered" > const content = await builder.build(url, tile.indices, tile.latIndex, tile.lonIndex, tile.minMaxVal)</span>
1473
+ <span class="cstat-no" title="statement not covered" > // req.buffers = content</span>
1474
+ <span class="cstat-no" title="statement not covered" > // return content</span>
1475
+ <span class="cstat-no" title="statement not covered" > return { buffers: content }</span>
1476
+ <span class="cstat-no" title="statement not covered" > } else if (id.endsWith('json')) {</span>
1477
+ <span class="cstat-no" title="statement not covered" > const datasetUrl = [opendapUrl, query.file].join('')</span>
1478
+ <span class="cstat-no" title="statement not covered" > const builder = new TilesetBuilder()</span>
1479
+ <span class="cstat-no" title="statement not covered" > const tileset = builder.build(datasetUrl, query.query, JSON.parse(query.dimensions), query.latitude, query.longitude)</span>
1480
+ <span class="cstat-no" title="statement not covered" > return tileset</span>
1481
+ <span class="cstat-no" title="statement not covered" > }</span>
1482
+ <span class="cstat-no" title="statement not covered" ></span>
1483
+ <span class="cstat-no" title="statement not covered" > return new Promise((resolve, reject) =&gt; {</span>
1484
+ <span class="cstat-no" title="statement not covered" > setTimeout(() =&gt; {</span>
1485
+ <span class="cstat-no" title="statement not covered" > resolve('hello!')</span>
1486
+ <span class="cstat-no" title="statement not covered" > }, 500)</span>
1487
+ <span class="cstat-no" title="statement not covered" > })</span>
1488
+ <span class="cstat-no" title="statement not covered" > }</span>
1489
+ <span class="cstat-no" title="statement not covered" > }</span>
1490
+ <span class="cstat-no" title="statement not covered" >}</span>
1491
+ &nbsp;</pre></td></tr></table></pre>
1492
+
1493
+ <div class='push'></div><!-- for sticky footer -->
1494
+ </div><!-- /wrapper -->
1495
+ <div class='footer quiet pad2 space-top1 center small'>
1496
+ Code coverage generated by
1497
+ <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
1498
+ at 2024-06-26T10:45:51.176Z
1499
+ </div>
1500
+ <script src="../../../../prettify.js"></script>
1501
+ <script>
1502
+ window.onload = function () {
1503
+ prettyPrint();
1504
+ };
1505
+ </script>
1506
+ <script src="../../../../sorter.js"></script>
1507
+ <script src="../../../../block-navigation.js"></script>
1508
+ </body>
1509
+ </html>
1510
+