@kalisio/kdk 2.5.2 → 2.5.3

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 (275) hide show
  1. package/core/client/components/input/KShapePicker.vue +4 -4
  2. package/coverage/core/api/application.js.html +344 -344
  3. package/coverage/core/api/authentication.js.html +79 -79
  4. package/coverage/core/api/db.js.html +167 -167
  5. package/coverage/core/api/hooks/hooks.authentication.js.html +12 -12
  6. package/coverage/core/api/hooks/hooks.authorisations.js.html +166 -163
  7. package/coverage/core/api/hooks/hooks.groups.js.html +1 -1
  8. package/coverage/core/api/hooks/hooks.logger.js.html +18 -18
  9. package/coverage/core/api/hooks/hooks.model.js.html +280 -268
  10. package/coverage/core/api/hooks/hooks.organisations.js.html +1 -1
  11. package/coverage/core/api/hooks/hooks.push.js.html +12 -12
  12. package/coverage/core/api/hooks/hooks.query.js.html +92 -92
  13. package/coverage/core/api/hooks/hooks.schemas.js.html +13 -13
  14. package/coverage/core/api/hooks/hooks.service.js.html +28 -28
  15. package/coverage/core/api/hooks/hooks.storage.js.html +7 -7
  16. package/coverage/core/api/hooks/hooks.users.js.html +48 -48
  17. package/coverage/core/api/hooks/index.html +49 -49
  18. package/coverage/core/api/hooks/index.js.html +11 -11
  19. package/coverage/core/api/index.html +42 -42
  20. package/coverage/core/api/index.js.html +22 -22
  21. package/coverage/core/api/marshall.js.html +127 -127
  22. package/coverage/core/api/models/groups.model.mongodb.js.html +1 -1
  23. package/coverage/core/api/models/index.html +1 -1
  24. package/coverage/core/api/models/messages.model.mongodb.js.html +1 -1
  25. package/coverage/core/api/models/organisations.model.mongodb.js.html +1 -1
  26. package/coverage/core/api/models/tags.model.mongodb.js.html +1 -1
  27. package/coverage/core/api/models/users.model.mongodb.js.html +11 -11
  28. package/coverage/core/api/services/account/account.hooks.js.html +42 -42
  29. package/coverage/core/api/services/account/account.service.js.html +34 -34
  30. package/coverage/core/api/services/account/index.html +1 -1
  31. package/coverage/core/api/services/authorisations/authorisations.hooks.js.html +34 -34
  32. package/coverage/core/api/services/authorisations/authorisations.service.js.html +108 -120
  33. package/coverage/core/api/services/authorisations/index.html +19 -19
  34. package/coverage/core/api/services/databases/databases.hooks.js.html +1 -1
  35. package/coverage/core/api/services/databases/databases.service.js.html +1 -1
  36. package/coverage/core/api/services/databases/index.html +1 -1
  37. package/coverage/core/api/services/groups/groups.hooks.js.html +1 -1
  38. package/coverage/core/api/services/groups/index.html +1 -1
  39. package/coverage/core/api/services/import-export/import-export.hooks.js.html +1 -1
  40. package/coverage/core/api/services/import-export/import-export.service.js.html +1 -1
  41. package/coverage/core/api/services/import-export/index.html +1 -1
  42. package/coverage/core/api/services/index.html +15 -15
  43. package/coverage/core/api/services/index.js.html +97 -85
  44. package/coverage/core/api/services/mailer/index.html +1 -1
  45. package/coverage/core/api/services/mailer/mailer.hooks.js.html +1 -1
  46. package/coverage/core/api/services/mailer/mailer.service.js.html +1 -1
  47. package/coverage/core/api/services/messages/index.html +5 -5
  48. package/coverage/core/api/services/messages/messages.hooks.js.html +11 -8
  49. package/coverage/core/api/services/organisations/index.html +1 -1
  50. package/coverage/core/api/services/organisations/organisations.hooks.js.html +1 -1
  51. package/coverage/core/api/services/organisations/organisations.service.js.html +1 -1
  52. package/coverage/core/api/services/push/index.html +1 -1
  53. package/coverage/core/api/services/push/push.hooks.js.html +1 -1
  54. package/coverage/core/api/services/push/push.service.js.html +1 -1
  55. package/coverage/core/api/services/storage/index.html +1 -1
  56. package/coverage/core/api/services/storage/storage.hooks.js.html +36 -36
  57. package/coverage/core/api/services/storage/storage.service.js.html +30 -30
  58. package/coverage/core/api/services/tags/index.html +1 -1
  59. package/coverage/core/api/services/tags/tags.hooks.js.html +1 -1
  60. package/coverage/core/api/services/users/index.html +7 -7
  61. package/coverage/core/api/services/users/users.hooks.js.html +83 -80
  62. package/coverage/core/api/services/users/users.service.js.html +4 -4
  63. package/coverage/core/api/utils.js.html +1 -1
  64. package/coverage/core/common/errors.js.html +2 -2
  65. package/coverage/core/common/index.html +30 -30
  66. package/coverage/core/common/index.js.html +11 -11
  67. package/coverage/core/common/permissions.js.html +187 -187
  68. package/coverage/core/common/schema.js.html +26 -26
  69. package/coverage/core/common/utils.js.html +61 -61
  70. package/coverage/core/common/utils.offline.js.html +6 -6
  71. package/coverage/index.html +179 -164
  72. package/coverage/lcov-report/core/api/application.js.html +344 -344
  73. package/coverage/lcov-report/core/api/authentication.js.html +79 -79
  74. package/coverage/lcov-report/core/api/db.js.html +167 -167
  75. package/coverage/lcov-report/core/api/hooks/hooks.authentication.js.html +12 -12
  76. package/coverage/lcov-report/core/api/hooks/hooks.authorisations.js.html +166 -163
  77. package/coverage/lcov-report/core/api/hooks/hooks.groups.js.html +1 -1
  78. package/coverage/lcov-report/core/api/hooks/hooks.logger.js.html +18 -18
  79. package/coverage/lcov-report/core/api/hooks/hooks.model.js.html +280 -268
  80. package/coverage/lcov-report/core/api/hooks/hooks.organisations.js.html +1 -1
  81. package/coverage/lcov-report/core/api/hooks/hooks.push.js.html +12 -12
  82. package/coverage/lcov-report/core/api/hooks/hooks.query.js.html +92 -92
  83. package/coverage/lcov-report/core/api/hooks/hooks.schemas.js.html +13 -13
  84. package/coverage/lcov-report/core/api/hooks/hooks.service.js.html +28 -28
  85. package/coverage/lcov-report/core/api/hooks/hooks.storage.js.html +7 -7
  86. package/coverage/lcov-report/core/api/hooks/hooks.users.js.html +48 -48
  87. package/coverage/lcov-report/core/api/hooks/index.html +49 -49
  88. package/coverage/lcov-report/core/api/hooks/index.js.html +11 -11
  89. package/coverage/lcov-report/core/api/index.html +42 -42
  90. package/coverage/lcov-report/core/api/index.js.html +22 -22
  91. package/coverage/lcov-report/core/api/marshall.js.html +127 -127
  92. package/coverage/lcov-report/core/api/models/groups.model.mongodb.js.html +1 -1
  93. package/coverage/lcov-report/core/api/models/index.html +1 -1
  94. package/coverage/lcov-report/core/api/models/messages.model.mongodb.js.html +1 -1
  95. package/coverage/lcov-report/core/api/models/organisations.model.mongodb.js.html +1 -1
  96. package/coverage/lcov-report/core/api/models/tags.model.mongodb.js.html +1 -1
  97. package/coverage/lcov-report/core/api/models/users.model.mongodb.js.html +11 -11
  98. package/coverage/lcov-report/core/api/services/account/account.hooks.js.html +42 -42
  99. package/coverage/lcov-report/core/api/services/account/account.service.js.html +34 -34
  100. package/coverage/lcov-report/core/api/services/account/index.html +1 -1
  101. package/coverage/lcov-report/core/api/services/authorisations/authorisations.hooks.js.html +34 -34
  102. package/coverage/lcov-report/core/api/services/authorisations/authorisations.service.js.html +108 -120
  103. package/coverage/lcov-report/core/api/services/authorisations/index.html +19 -19
  104. package/coverage/lcov-report/core/api/services/databases/databases.hooks.js.html +1 -1
  105. package/coverage/lcov-report/core/api/services/databases/databases.service.js.html +1 -1
  106. package/coverage/lcov-report/core/api/services/databases/index.html +1 -1
  107. package/coverage/lcov-report/core/api/services/groups/groups.hooks.js.html +1 -1
  108. package/coverage/lcov-report/core/api/services/groups/index.html +1 -1
  109. package/coverage/lcov-report/core/api/services/import-export/import-export.hooks.js.html +1 -1
  110. package/coverage/lcov-report/core/api/services/import-export/import-export.service.js.html +1 -1
  111. package/coverage/lcov-report/core/api/services/import-export/index.html +1 -1
  112. package/coverage/lcov-report/core/api/services/index.html +15 -15
  113. package/coverage/lcov-report/core/api/services/index.js.html +97 -85
  114. package/coverage/lcov-report/core/api/services/mailer/index.html +1 -1
  115. package/coverage/lcov-report/core/api/services/mailer/mailer.hooks.js.html +1 -1
  116. package/coverage/lcov-report/core/api/services/mailer/mailer.service.js.html +1 -1
  117. package/coverage/lcov-report/core/api/services/messages/index.html +5 -5
  118. package/coverage/lcov-report/core/api/services/messages/messages.hooks.js.html +11 -8
  119. package/coverage/lcov-report/core/api/services/organisations/index.html +1 -1
  120. package/coverage/lcov-report/core/api/services/organisations/organisations.hooks.js.html +1 -1
  121. package/coverage/lcov-report/core/api/services/organisations/organisations.service.js.html +1 -1
  122. package/coverage/lcov-report/core/api/services/push/index.html +1 -1
  123. package/coverage/lcov-report/core/api/services/push/push.hooks.js.html +1 -1
  124. package/coverage/lcov-report/core/api/services/push/push.service.js.html +1 -1
  125. package/coverage/lcov-report/core/api/services/storage/index.html +1 -1
  126. package/coverage/lcov-report/core/api/services/storage/storage.hooks.js.html +36 -36
  127. package/coverage/lcov-report/core/api/services/storage/storage.service.js.html +30 -30
  128. package/coverage/lcov-report/core/api/services/tags/index.html +1 -1
  129. package/coverage/lcov-report/core/api/services/tags/tags.hooks.js.html +1 -1
  130. package/coverage/lcov-report/core/api/services/users/index.html +7 -7
  131. package/coverage/lcov-report/core/api/services/users/users.hooks.js.html +83 -80
  132. package/coverage/lcov-report/core/api/services/users/users.service.js.html +4 -4
  133. package/coverage/lcov-report/core/api/utils.js.html +1 -1
  134. package/coverage/lcov-report/core/common/errors.js.html +2 -2
  135. package/coverage/lcov-report/core/common/index.html +30 -30
  136. package/coverage/lcov-report/core/common/index.js.html +11 -11
  137. package/coverage/lcov-report/core/common/permissions.js.html +187 -187
  138. package/coverage/lcov-report/core/common/schema.js.html +26 -26
  139. package/coverage/lcov-report/core/common/utils.js.html +61 -61
  140. package/coverage/lcov-report/core/common/utils.offline.js.html +6 -6
  141. package/coverage/lcov-report/index.html +179 -164
  142. package/coverage/lcov-report/map/api/hooks/hooks.catalog.js.html +348 -258
  143. package/coverage/lcov-report/map/api/hooks/hooks.features.js.html +218 -218
  144. package/coverage/lcov-report/map/api/hooks/hooks.query.js.html +795 -810
  145. package/coverage/lcov-report/map/api/hooks/index.html +54 -54
  146. package/coverage/lcov-report/map/api/hooks/index.js.html +16 -16
  147. package/coverage/lcov-report/map/api/index.html +32 -32
  148. package/coverage/lcov-report/map/api/index.js.html +46 -46
  149. package/coverage/lcov-report/map/api/marshall.js.html +72 -72
  150. package/coverage/lcov-report/map/api/models/alerts.model.mongodb.js.html +24 -24
  151. package/coverage/lcov-report/map/api/models/catalog.model.mongodb.js.html +69 -27
  152. package/coverage/lcov-report/map/api/models/features.model.mongodb.js.html +80 -80
  153. package/coverage/lcov-report/map/api/models/index.html +69 -54
  154. package/coverage/lcov-report/map/api/models/projects.model.mongodb.js.html +26 -26
  155. package/coverage/lcov-report/map/api/models/styles.model.mongodb.js.html +112 -0
  156. package/coverage/lcov-report/map/api/services/alerts/alerts.hooks.js.html +136 -136
  157. package/coverage/lcov-report/map/api/services/alerts/alerts.service.js.html +343 -343
  158. package/coverage/lcov-report/map/api/services/alerts/index.html +32 -32
  159. package/coverage/lcov-report/map/api/services/catalog/catalog.hooks.js.html +177 -162
  160. package/coverage/lcov-report/map/api/services/catalog/index.html +21 -21
  161. package/coverage/lcov-report/map/api/services/daptiles/daptiles.service.js.html +1 -1
  162. package/coverage/lcov-report/map/api/services/daptiles/index.html +1 -1
  163. package/coverage/lcov-report/map/api/services/features/features.hooks.js.html +160 -160
  164. package/coverage/lcov-report/map/api/services/features/features.service.js.html +117 -117
  165. package/coverage/lcov-report/map/api/services/features/index.html +31 -31
  166. package/coverage/lcov-report/map/api/services/index.html +21 -21
  167. package/coverage/lcov-report/map/api/services/index.js.html +404 -296
  168. package/coverage/lcov-report/map/api/services/projects/index.html +21 -21
  169. package/coverage/lcov-report/map/api/services/projects/projects.hooks.js.html +237 -237
  170. package/coverage/lcov-report/map/api/services/styles/index.html +116 -0
  171. package/coverage/lcov-report/map/api/services/styles/styles.hooks.js.html +196 -0
  172. package/coverage/lcov-report/map/common/dynamic-grid-source.js.html +68 -68
  173. package/coverage/lcov-report/map/common/errors.js.html +16 -16
  174. package/coverage/lcov-report/map/common/geotiff-grid-source.js.html +267 -267
  175. package/coverage/lcov-report/map/common/grid.js.html +554 -554
  176. package/coverage/lcov-report/map/common/index.html +158 -158
  177. package/coverage/lcov-report/map/common/index.js.html +68 -68
  178. package/coverage/lcov-report/map/common/meteo-model-grid-source.js.html +73 -73
  179. package/coverage/lcov-report/map/common/moment-utils.js.html +18 -18
  180. package/coverage/lcov-report/map/common/opendap-grid-source.js.html +484 -484
  181. package/coverage/lcov-report/map/common/opendap-utils.js.html +353 -353
  182. package/coverage/lcov-report/map/common/permissions.js.html +42 -36
  183. package/coverage/lcov-report/map/common/time-based-grid-source.js.html +59 -59
  184. package/coverage/lcov-report/map/common/tms-utils.js.html +6 -6
  185. package/coverage/lcov-report/map/common/wcs-grid-source.js.html +190 -190
  186. package/coverage/lcov-report/map/common/wcs-utils.js.html +339 -339
  187. package/coverage/lcov-report/map/common/weacast-grid-source.js.html +345 -345
  188. package/coverage/lcov-report/map/common/wfs-utils.js.html +11 -11
  189. package/coverage/lcov-report/map/common/wms-utils.js.html +8 -8
  190. package/coverage/lcov-report/map/common/wmts-utils.js.html +7 -7
  191. package/coverage/lcov.info +7022 -5894
  192. package/coverage/map/api/hooks/hooks.catalog.js.html +348 -258
  193. package/coverage/map/api/hooks/hooks.features.js.html +218 -218
  194. package/coverage/map/api/hooks/hooks.query.js.html +795 -810
  195. package/coverage/map/api/hooks/index.html +54 -54
  196. package/coverage/map/api/hooks/index.js.html +16 -16
  197. package/coverage/map/api/index.html +32 -32
  198. package/coverage/map/api/index.js.html +46 -46
  199. package/coverage/map/api/marshall.js.html +72 -72
  200. package/coverage/map/api/models/alerts.model.mongodb.js.html +24 -24
  201. package/coverage/map/api/models/catalog.model.mongodb.js.html +69 -27
  202. package/coverage/map/api/models/features.model.mongodb.js.html +80 -80
  203. package/coverage/map/api/models/index.html +69 -54
  204. package/coverage/map/api/models/projects.model.mongodb.js.html +26 -26
  205. package/coverage/map/api/models/styles.model.mongodb.js.html +112 -0
  206. package/coverage/map/api/services/alerts/alerts.hooks.js.html +136 -136
  207. package/coverage/map/api/services/alerts/alerts.service.js.html +343 -343
  208. package/coverage/map/api/services/alerts/index.html +32 -32
  209. package/coverage/map/api/services/catalog/catalog.hooks.js.html +177 -162
  210. package/coverage/map/api/services/catalog/index.html +21 -21
  211. package/coverage/map/api/services/daptiles/daptiles.service.js.html +1 -1
  212. package/coverage/map/api/services/daptiles/index.html +1 -1
  213. package/coverage/map/api/services/features/features.hooks.js.html +160 -160
  214. package/coverage/map/api/services/features/features.service.js.html +117 -117
  215. package/coverage/map/api/services/features/index.html +31 -31
  216. package/coverage/map/api/services/index.html +21 -21
  217. package/coverage/map/api/services/index.js.html +404 -296
  218. package/coverage/map/api/services/projects/index.html +21 -21
  219. package/coverage/map/api/services/projects/projects.hooks.js.html +237 -237
  220. package/coverage/map/api/services/styles/index.html +116 -0
  221. package/coverage/map/api/services/styles/styles.hooks.js.html +196 -0
  222. package/coverage/map/common/dynamic-grid-source.js.html +68 -68
  223. package/coverage/map/common/errors.js.html +16 -16
  224. package/coverage/map/common/geotiff-grid-source.js.html +267 -267
  225. package/coverage/map/common/grid.js.html +554 -554
  226. package/coverage/map/common/index.html +158 -158
  227. package/coverage/map/common/index.js.html +68 -68
  228. package/coverage/map/common/meteo-model-grid-source.js.html +73 -73
  229. package/coverage/map/common/moment-utils.js.html +18 -18
  230. package/coverage/map/common/opendap-grid-source.js.html +484 -484
  231. package/coverage/map/common/opendap-utils.js.html +353 -353
  232. package/coverage/map/common/permissions.js.html +42 -36
  233. package/coverage/map/common/time-based-grid-source.js.html +59 -59
  234. package/coverage/map/common/tms-utils.js.html +6 -6
  235. package/coverage/map/common/wcs-grid-source.js.html +190 -190
  236. package/coverage/map/common/wcs-utils.js.html +339 -339
  237. package/coverage/map/common/weacast-grid-source.js.html +345 -345
  238. package/coverage/map/common/wfs-utils.js.html +11 -11
  239. package/coverage/map/common/wms-utils.js.html +8 -8
  240. package/coverage/map/common/wmts-utils.js.html +7 -7
  241. package/coverage/tmp/coverage-151198-1753351220086-0.json +1 -0
  242. package/coverage/tmp/coverage-151210-1753351220070-0.json +1 -0
  243. package/coverage/tmp/coverage-151221-1753351129816-0.json +1 -0
  244. package/coverage/tmp/coverage-151233-1753351129803-0.json +1 -0
  245. package/coverage/tmp/coverage-151240-1753351129770-0.json +1 -0
  246. package/coverage/tmp/coverage-151307-1753351220058-0.json +1 -0
  247. package/coverage/tmp/coverage-151319-1753351220044-0.json +1 -0
  248. package/coverage/tmp/coverage-151326-1753351220010-0.json +1 -0
  249. package/map/api/services/styles/styles.hooks.js +1 -1
  250. package/map/client/components/KLayerEditor.vue +4 -0
  251. package/map/client/components/catalog/KLayerCategories.vue +2 -0
  252. package/map/client/components/stickies/KLevelSlider.vue +10 -8
  253. package/map/client/components/styles/KStyleEditor.vue +1 -1
  254. package/map/client/components/styles/KStyleManager.vue +7 -1
  255. package/map/client/composables/highlight.js +5 -1
  256. package/map/client/i18n/map_en.json +4 -1
  257. package/map/client/i18n/map_fr.json +4 -1
  258. package/map/client/mixins/globe/mixin.geojson-layers.js +11 -5
  259. package/map/client/mixins/mixin.activity.js +9 -0
  260. package/map/client/utils/utils.layers.js +0 -2
  261. package/package.json +1 -1
  262. package/test/api/core/push.test.js +1 -1
  263. package/test/api/core/test-log-2025-02-05.log +23 -0
  264. package/test/api/core/test-log-2025-05-21.log +15 -0
  265. package/test/api/core/test-log-2025-06-25.log +9 -0
  266. package/test/api/core/test-log-2025-07-24.log +44 -0
  267. package/test/api/map/test-log-2025-05-27.log +13 -0
  268. package/test/api/map/test-log-2025-06-23.log +7 -0
  269. package/test/api/map/{test-log-2025-05-26.log → test-log-2025-07-24.log} +3 -4
  270. package/coverage/tmp/coverage-122123-1739872365211-0.json +0 -1
  271. package/coverage/tmp/coverage-122135-1739872365196-0.json +0 -1
  272. package/coverage/tmp/coverage-122146-1739872365184-0.json +0 -1
  273. package/coverage/tmp/coverage-122158-1739872365169-0.json +0 -1
  274. package/coverage/tmp/coverage-122165-1739872365141-0.json +0 -1
  275. package/test/api/core/test-log-2025-05-26.log +0 -22
@@ -23,30 +23,30 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">0% </span>
26
+ <span class="strong">50.29% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>0/509</span>
28
+ <span class='fraction'>256/509</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">0% </span>
33
+ <span class="strong">64.7% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>0/1</span>
35
+ <span class='fraction'>22/34</span>
36
36
  </div>
37
37
 
38
38
 
39
39
  <div class='fl pad1y space-right2'>
40
- <span class="strong">0% </span>
40
+ <span class="strong">28.3% </span>
41
41
  <span class="quiet">Functions</span>
42
- <span class='fraction'>0/1</span>
42
+ <span class='fraction'>15/53</span>
43
43
  </div>
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">0% </span>
47
+ <span class="strong">50.29% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>0/509</span>
49
+ <span class='fraction'>256/509</span>
50
50
  </div>
51
51
 
52
52
 
@@ -61,7 +61,7 @@
61
61
  </div>
62
62
  </template>
63
63
  </div>
64
- <div class='status-line low'></div>
64
+ <div class='status-line medium'></div>
65
65
  <pre><table class="coverage">
66
66
  <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
67
67
  <a name='L2'></a><a href='#L2'>2</a>
@@ -572,7 +572,24 @@
572
572
  <a name='L507'></a><a href='#L507'>507</a>
573
573
  <a name='L508'></a><a href='#L508'>508</a>
574
574
  <a name='L509'></a><a href='#L509'>509</a>
575
- <a name='L510'></a><a href='#L510'>510</a></td><td class="line-coverage quiet"><span class="cline-any cline-no">&nbsp;</span>
575
+ <a name='L510'></a><a href='#L510'>510</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
576
+ <span class="cline-any cline-yes">1x</span>
577
+ <span class="cline-any cline-yes">1x</span>
578
+ <span class="cline-any cline-yes">1x</span>
579
+ <span class="cline-any cline-yes">1x</span>
580
+ <span class="cline-any cline-yes">1x</span>
581
+ <span class="cline-any cline-yes">1x</span>
582
+ <span class="cline-any cline-yes">1x</span>
583
+ <span class="cline-any cline-yes">1x</span>
584
+ <span class="cline-any cline-yes">1x</span>
585
+ <span class="cline-any cline-yes">1x</span>
586
+ <span class="cline-any cline-yes">1x</span>
587
+ <span class="cline-any cline-yes">1x</span>
588
+ <span class="cline-any cline-yes">1x</span>
589
+ <span class="cline-any cline-yes">1x</span>
590
+ <span class="cline-any cline-yes">1x</span>
591
+ <span class="cline-any cline-yes">1x</span>
592
+ <span class="cline-any cline-yes">1x</span>
576
593
  <span class="cline-any cline-no">&nbsp;</span>
577
594
  <span class="cline-any cline-no">&nbsp;</span>
578
595
  <span class="cline-any cline-no">&nbsp;</span>
@@ -610,12 +627,42 @@
610
627
  <span class="cline-any cline-no">&nbsp;</span>
611
628
  <span class="cline-any cline-no">&nbsp;</span>
612
629
  <span class="cline-any cline-no">&nbsp;</span>
630
+ <span class="cline-any cline-yes">1x</span>
631
+ <span class="cline-any cline-yes">1x</span>
632
+ <span class="cline-any cline-yes">1x</span>
633
+ <span class="cline-any cline-yes">1x</span>
634
+ <span class="cline-any cline-yes">1x</span>
635
+ <span class="cline-any cline-yes">1x</span>
636
+ <span class="cline-any cline-yes">6x</span>
637
+ <span class="cline-any cline-yes">6x</span>
638
+ <span class="cline-any cline-yes">6x</span>
639
+ <span class="cline-any cline-yes">6x</span>
640
+ <span class="cline-any cline-yes">6x</span>
641
+ <span class="cline-any cline-yes">6x</span>
642
+ <span class="cline-any cline-yes">6x</span>
613
643
  <span class="cline-any cline-no">&nbsp;</span>
614
644
  <span class="cline-any cline-no">&nbsp;</span>
645
+ <span class="cline-any cline-yes">6x</span>
615
646
  <span class="cline-any cline-no">&nbsp;</span>
616
647
  <span class="cline-any cline-no">&nbsp;</span>
648
+ <span class="cline-any cline-yes">6x</span>
617
649
  <span class="cline-any cline-no">&nbsp;</span>
618
650
  <span class="cline-any cline-no">&nbsp;</span>
651
+ <span class="cline-any cline-yes">6x</span>
652
+ <span class="cline-any cline-yes">1x</span>
653
+ <span class="cline-any cline-yes">1x</span>
654
+ <span class="cline-any cline-yes">1x</span>
655
+ <span class="cline-any cline-yes">1x</span>
656
+ <span class="cline-any cline-yes">1x</span>
657
+ <span class="cline-any cline-yes">1x</span>
658
+ <span class="cline-any cline-yes">3x</span>
659
+ <span class="cline-any cline-yes">3x</span>
660
+ <span class="cline-any cline-yes">1x</span>
661
+ <span class="cline-any cline-yes">1x</span>
662
+ <span class="cline-any cline-yes">9x</span>
663
+ <span class="cline-any cline-yes">9x</span>
664
+ <span class="cline-any cline-yes">1x</span>
665
+ <span class="cline-any cline-yes">1x</span>
619
666
  <span class="cline-any cline-no">&nbsp;</span>
620
667
  <span class="cline-any cline-no">&nbsp;</span>
621
668
  <span class="cline-any cline-no">&nbsp;</span>
@@ -625,6 +672,8 @@
625
672
  <span class="cline-any cline-no">&nbsp;</span>
626
673
  <span class="cline-any cline-no">&nbsp;</span>
627
674
  <span class="cline-any cline-no">&nbsp;</span>
675
+ <span class="cline-any cline-yes">1x</span>
676
+ <span class="cline-any cline-yes">1x</span>
628
677
  <span class="cline-any cline-no">&nbsp;</span>
629
678
  <span class="cline-any cline-no">&nbsp;</span>
630
679
  <span class="cline-any cline-no">&nbsp;</span>
@@ -654,12 +703,20 @@
654
703
  <span class="cline-any cline-no">&nbsp;</span>
655
704
  <span class="cline-any cline-no">&nbsp;</span>
656
705
  <span class="cline-any cline-no">&nbsp;</span>
706
+ <span class="cline-any cline-yes">1x</span>
707
+ <span class="cline-any cline-yes">1x</span>
657
708
  <span class="cline-any cline-no">&nbsp;</span>
658
709
  <span class="cline-any cline-no">&nbsp;</span>
710
+ <span class="cline-any cline-yes">1x</span>
711
+ <span class="cline-any cline-yes">1x</span>
659
712
  <span class="cline-any cline-no">&nbsp;</span>
660
713
  <span class="cline-any cline-no">&nbsp;</span>
714
+ <span class="cline-any cline-yes">1x</span>
715
+ <span class="cline-any cline-yes">1x</span>
661
716
  <span class="cline-any cline-no">&nbsp;</span>
662
717
  <span class="cline-any cline-no">&nbsp;</span>
718
+ <span class="cline-any cline-yes">1x</span>
719
+ <span class="cline-any cline-yes">1x</span>
663
720
  <span class="cline-any cline-no">&nbsp;</span>
664
721
  <span class="cline-any cline-no">&nbsp;</span>
665
722
  <span class="cline-any cline-no">&nbsp;</span>
@@ -667,6 +724,8 @@
667
724
  <span class="cline-any cline-no">&nbsp;</span>
668
725
  <span class="cline-any cline-no">&nbsp;</span>
669
726
  <span class="cline-any cline-no">&nbsp;</span>
727
+ <span class="cline-any cline-yes">1x</span>
728
+ <span class="cline-any cline-yes">1x</span>
670
729
  <span class="cline-any cline-no">&nbsp;</span>
671
730
  <span class="cline-any cline-no">&nbsp;</span>
672
731
  <span class="cline-any cline-no">&nbsp;</span>
@@ -693,6 +752,8 @@
693
752
  <span class="cline-any cline-no">&nbsp;</span>
694
753
  <span class="cline-any cline-no">&nbsp;</span>
695
754
  <span class="cline-any cline-no">&nbsp;</span>
755
+ <span class="cline-any cline-yes">1x</span>
756
+ <span class="cline-any cline-yes">1x</span>
696
757
  <span class="cline-any cline-no">&nbsp;</span>
697
758
  <span class="cline-any cline-no">&nbsp;</span>
698
759
  <span class="cline-any cline-no">&nbsp;</span>
@@ -718,6 +779,8 @@
718
779
  <span class="cline-any cline-no">&nbsp;</span>
719
780
  <span class="cline-any cline-no">&nbsp;</span>
720
781
  <span class="cline-any cline-no">&nbsp;</span>
782
+ <span class="cline-any cline-yes">1x</span>
783
+ <span class="cline-any cline-yes">1x</span>
721
784
  <span class="cline-any cline-no">&nbsp;</span>
722
785
  <span class="cline-any cline-no">&nbsp;</span>
723
786
  <span class="cline-any cline-no">&nbsp;</span>
@@ -732,6 +795,8 @@
732
795
  <span class="cline-any cline-no">&nbsp;</span>
733
796
  <span class="cline-any cline-no">&nbsp;</span>
734
797
  <span class="cline-any cline-no">&nbsp;</span>
798
+ <span class="cline-any cline-yes">1x</span>
799
+ <span class="cline-any cline-yes">1x</span>
735
800
  <span class="cline-any cline-no">&nbsp;</span>
736
801
  <span class="cline-any cline-no">&nbsp;</span>
737
802
  <span class="cline-any cline-no">&nbsp;</span>
@@ -746,6 +811,8 @@
746
811
  <span class="cline-any cline-no">&nbsp;</span>
747
812
  <span class="cline-any cline-no">&nbsp;</span>
748
813
  <span class="cline-any cline-no">&nbsp;</span>
814
+ <span class="cline-any cline-yes">1x</span>
815
+ <span class="cline-any cline-yes">1x</span>
749
816
  <span class="cline-any cline-no">&nbsp;</span>
750
817
  <span class="cline-any cline-no">&nbsp;</span>
751
818
  <span class="cline-any cline-no">&nbsp;</span>
@@ -765,12 +832,30 @@
765
832
  <span class="cline-any cline-no">&nbsp;</span>
766
833
  <span class="cline-any cline-no">&nbsp;</span>
767
834
  <span class="cline-any cline-no">&nbsp;</span>
835
+ <span class="cline-any cline-yes">1x</span>
836
+ <span class="cline-any cline-yes">1x</span>
837
+ <span class="cline-any cline-yes">1x</span>
838
+ <span class="cline-any cline-yes">1x</span>
839
+ <span class="cline-any cline-yes">4x</span>
840
+ <span class="cline-any cline-yes">4x</span>
841
+ <span class="cline-any cline-yes">4x</span>
842
+ <span class="cline-any cline-yes">1x</span>
843
+ <span class="cline-any cline-yes">1x</span>
768
844
  <span class="cline-any cline-no">&nbsp;</span>
769
845
  <span class="cline-any cline-no">&nbsp;</span>
846
+ <span class="cline-any cline-yes">1x</span>
847
+ <span class="cline-any cline-yes">1x</span>
770
848
  <span class="cline-any cline-no">&nbsp;</span>
771
849
  <span class="cline-any cline-no">&nbsp;</span>
850
+ <span class="cline-any cline-yes">1x</span>
851
+ <span class="cline-any cline-yes">1x</span>
772
852
  <span class="cline-any cline-no">&nbsp;</span>
773
853
  <span class="cline-any cline-no">&nbsp;</span>
854
+ <span class="cline-any cline-yes">1x</span>
855
+ <span class="cline-any cline-yes">1x</span>
856
+ <span class="cline-any cline-yes">1x</span>
857
+ <span class="cline-any cline-yes">1x</span>
858
+ <span class="cline-any cline-yes">1x</span>
774
859
  <span class="cline-any cline-no">&nbsp;</span>
775
860
  <span class="cline-any cline-no">&nbsp;</span>
776
861
  <span class="cline-any cline-no">&nbsp;</span>
@@ -781,324 +866,239 @@
781
866
  <span class="cline-any cline-no">&nbsp;</span>
782
867
  <span class="cline-any cline-no">&nbsp;</span>
783
868
  <span class="cline-any cline-no">&nbsp;</span>
869
+ <span class="cline-any cline-yes">1x</span>
870
+ <span class="cline-any cline-yes">1x</span>
784
871
  <span class="cline-any cline-no">&nbsp;</span>
785
872
  <span class="cline-any cline-no">&nbsp;</span>
873
+ <span class="cline-any cline-yes">1x</span>
874
+ <span class="cline-any cline-yes">1x</span>
786
875
  <span class="cline-any cline-no">&nbsp;</span>
787
876
  <span class="cline-any cline-no">&nbsp;</span>
877
+ <span class="cline-any cline-yes">1x</span>
878
+ <span class="cline-any cline-yes">1x</span>
788
879
  <span class="cline-any cline-no">&nbsp;</span>
789
880
  <span class="cline-any cline-no">&nbsp;</span>
790
881
  <span class="cline-any cline-no">&nbsp;</span>
791
882
  <span class="cline-any cline-no">&nbsp;</span>
883
+ <span class="cline-any cline-yes">1x</span>
884
+ <span class="cline-any cline-yes">1x</span>
792
885
  <span class="cline-any cline-no">&nbsp;</span>
793
886
  <span class="cline-any cline-no">&nbsp;</span>
794
887
  <span class="cline-any cline-no">&nbsp;</span>
888
+ <span class="cline-any cline-yes">1x</span>
889
+ <span class="cline-any cline-yes">1x</span>
890
+ <span class="cline-any cline-yes">4x</span>
891
+ <span class="cline-any cline-yes">4x</span>
892
+ <span class="cline-any cline-yes">4x</span>
795
893
  <span class="cline-any cline-no">&nbsp;</span>
796
894
  <span class="cline-any cline-no">&nbsp;</span>
895
+ <span class="cline-any cline-yes">4x</span>
896
+ <span class="cline-any cline-yes">1x</span>
897
+ <span class="cline-any cline-yes">1x</span>
898
+ <span class="cline-any cline-yes">4x</span>
899
+ <span class="cline-any cline-yes">4x</span>
900
+ <span class="cline-any cline-yes">1x</span>
901
+ <span class="cline-any cline-yes">1x</span>
902
+ <span class="cline-any cline-yes">1x</span>
903
+ <span class="cline-any cline-yes">4x</span>
904
+ <span class="cline-any cline-yes">4x</span>
797
905
  <span class="cline-any cline-no">&nbsp;</span>
906
+ <span class="cline-any cline-yes">4x</span>
907
+ <span class="cline-any cline-yes">1x</span>
908
+ <span class="cline-any cline-yes">1x</span>
909
+ <span class="cline-any cline-yes">4x</span>
910
+ <span class="cline-any cline-yes">4x</span>
911
+ <span class="cline-any cline-yes">4x</span>
912
+ <span class="cline-any cline-yes">4x</span>
798
913
  <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-no">&nbsp;</span>
1017
- <span class="cline-any cline-no">&nbsp;</span>
1018
- <span class="cline-any cline-no">&nbsp;</span>
1019
- <span class="cline-any cline-no">&nbsp;</span>
1020
- <span class="cline-any cline-no">&nbsp;</span>
1021
- <span class="cline-any cline-no">&nbsp;</span>
1022
- <span class="cline-any cline-no">&nbsp;</span>
1023
- <span class="cline-any cline-no">&nbsp;</span>
1024
- <span class="cline-any cline-no">&nbsp;</span>
1025
- <span class="cline-any cline-no">&nbsp;</span>
1026
- <span class="cline-any cline-no">&nbsp;</span>
1027
- <span class="cline-any cline-no">&nbsp;</span>
1028
- <span class="cline-any cline-no">&nbsp;</span>
1029
- <span class="cline-any cline-no">&nbsp;</span>
1030
- <span class="cline-any cline-no">&nbsp;</span>
1031
- <span class="cline-any cline-no">&nbsp;</span>
1032
- <span class="cline-any cline-no">&nbsp;</span>
1033
- <span class="cline-any cline-no">&nbsp;</span>
1034
- <span class="cline-any cline-no">&nbsp;</span>
1035
- <span class="cline-any cline-no">&nbsp;</span>
1036
- <span class="cline-any cline-no">&nbsp;</span>
1037
- <span class="cline-any cline-no">&nbsp;</span>
1038
- <span class="cline-any cline-no">&nbsp;</span>
1039
- <span class="cline-any cline-no">&nbsp;</span>
1040
- <span class="cline-any cline-no">&nbsp;</span>
1041
- <span class="cline-any cline-no">&nbsp;</span>
1042
- <span class="cline-any cline-no">&nbsp;</span>
1043
- <span class="cline-any cline-no">&nbsp;</span>
1044
- <span class="cline-any cline-no">&nbsp;</span>
1045
- <span class="cline-any cline-no">&nbsp;</span>
1046
- <span class="cline-any cline-no">&nbsp;</span>
1047
- <span class="cline-any cline-no">&nbsp;</span>
1048
- <span class="cline-any cline-no">&nbsp;</span>
1049
- <span class="cline-any cline-no">&nbsp;</span>
1050
- <span class="cline-any cline-no">&nbsp;</span>
1051
- <span class="cline-any cline-no">&nbsp;</span>
1052
- <span class="cline-any cline-no">&nbsp;</span>
1053
- <span class="cline-any cline-no">&nbsp;</span>
1054
- <span class="cline-any cline-no">&nbsp;</span>
1055
- <span class="cline-any cline-no">&nbsp;</span>
1056
- <span class="cline-any cline-no">&nbsp;</span>
1057
- <span class="cline-any cline-no">&nbsp;</span>
1058
- <span class="cline-any cline-no">&nbsp;</span>
1059
- <span class="cline-any cline-no">&nbsp;</span>
1060
- <span class="cline-any cline-no">&nbsp;</span>
1061
- <span class="cline-any cline-no">&nbsp;</span>
1062
- <span class="cline-any cline-no">&nbsp;</span>
1063
- <span class="cline-any cline-no">&nbsp;</span>
1064
- <span class="cline-any cline-no">&nbsp;</span>
1065
- <span class="cline-any cline-no">&nbsp;</span>
1066
- <span class="cline-any cline-no">&nbsp;</span>
1067
- <span class="cline-any cline-no">&nbsp;</span>
1068
- <span class="cline-any cline-no">&nbsp;</span>
1069
- <span class="cline-any cline-no">&nbsp;</span>
1070
- <span class="cline-any cline-no">&nbsp;</span>
1071
- <span class="cline-any cline-no">&nbsp;</span>
1072
- <span class="cline-any cline-no">&nbsp;</span>
1073
- <span class="cline-any cline-no">&nbsp;</span>
1074
- <span class="cline-any cline-no">&nbsp;</span>
1075
- <span class="cline-any cline-no">&nbsp;</span>
1076
- <span class="cline-any cline-no">&nbsp;</span>
1077
- <span class="cline-any cline-no">&nbsp;</span>
1078
- <span class="cline-any cline-no">&nbsp;</span>
1079
- <span class="cline-any cline-no">&nbsp;</span>
1080
- <span class="cline-any cline-no">&nbsp;</span>
1081
- <span class="cline-any cline-no">&nbsp;</span>
1082
- <span class="cline-any cline-no">&nbsp;</span>
1083
- <span class="cline-any cline-no">&nbsp;</span>
1084
- <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 _ from 'lodash'</span></span></span>
1085
- <span class="cstat-no" title="statement not covered" ></span>
1086
- <span class="cstat-no" title="statement not covered" >export const SortOrder = {</span>
1087
- <span class="cstat-no" title="statement not covered" > ASCENDING: 0,</span>
1088
- <span class="cstat-no" title="statement not covered" > DESCENDING: 1</span>
1089
- <span class="cstat-no" title="statement not covered" >}</span>
1090
- <span class="cstat-no" title="statement not covered" ></span>
1091
- <span class="cstat-no" title="statement not covered" >export const gridSourceFactories = { }</span>
1092
- <span class="cstat-no" title="statement not covered" >export const unitConverters = { }</span>
1093
- <span class="cstat-no" title="statement not covered" ></span>
1094
- <span class="cstat-no" title="statement not covered" >const toHalf = (function () {</span>
1095
- <span class="cstat-no" title="statement not covered" > const floatView = new Float32Array(1)</span>
1096
- <span class="cstat-no" title="statement not covered" > const int32View = new Int32Array(floatView.buffer)</span>
1097
- <span class="cstat-no" title="statement not covered" ></span>
1098
- <span class="cstat-no" title="statement not covered" > /* This method is faster than the OpenEXR implementation (very often</span>
1099
- <span class="cstat-no" title="statement not covered" > * used, eg. in Ogre), with the additional benefit of rounding, inspired</span>
1100
- <span class="cstat-no" title="statement not covered" > * by James Tursa?s half-precision code. */</span>
1101
- <span class="cstat-no" title="statement not covered" > return function toHalf (val) {</span>
914
+ <span class="cline-any cline-yes">4x</span>
915
+ <span class="cline-any cline-yes">1x</span>
916
+ <span class="cline-any cline-yes">1x</span>
917
+ <span class="cline-any cline-yes">1x</span>
918
+ <span class="cline-any cline-yes">1x</span>
919
+ <span class="cline-any cline-yes">1x</span>
920
+ <span class="cline-any cline-yes">1x</span>
921
+ <span class="cline-any cline-yes">1x</span>
922
+ <span class="cline-any cline-yes">1x</span>
923
+ <span class="cline-any cline-yes">1x</span>
924
+ <span class="cline-any cline-yes">1x</span>
925
+ <span class="cline-any cline-yes">1x</span>
926
+ <span class="cline-any cline-yes">1x</span>
927
+ <span class="cline-any cline-yes">1x</span>
928
+ <span class="cline-any cline-yes">1x</span>
929
+ <span class="cline-any cline-yes">1x</span>
930
+ <span class="cline-any cline-yes">1x</span>
931
+ <span class="cline-any cline-yes">1x</span>
932
+ <span class="cline-any cline-yes">1x</span>
933
+ <span class="cline-any cline-yes">1x</span>
934
+ <span class="cline-any cline-yes">1x</span>
935
+ <span class="cline-any cline-yes">1x</span>
936
+ <span class="cline-any cline-yes">1x</span>
937
+ <span class="cline-any cline-yes">1x</span>
938
+ <span class="cline-any cline-yes">1x</span>
939
+ <span class="cline-any cline-yes">4x</span>
940
+ <span class="cline-any cline-yes">4x</span>
941
+ <span class="cline-any cline-yes">4x</span>
942
+ <span class="cline-any cline-yes">4x</span>
943
+ <span class="cline-any cline-yes">4x</span>
944
+ <span class="cline-any cline-yes">4x</span>
945
+ <span class="cline-any cline-yes">4x</span>
946
+ <span class="cline-any cline-yes">4x</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-yes">4x</span>
952
+ <span class="cline-any cline-yes">1x</span>
953
+ <span class="cline-any cline-yes">1x</span>
954
+ <span class="cline-any cline-yes">2x</span>
955
+ <span class="cline-any cline-yes">2x</span>
956
+ <span class="cline-any cline-yes">1x</span>
957
+ <span class="cline-any cline-yes">1x</span>
958
+ <span class="cline-any cline-yes">1x</span>
959
+ <span class="cline-any cline-yes">1x</span>
960
+ <span class="cline-any cline-yes">1x</span>
961
+ <span class="cline-any cline-yes">1x</span>
962
+ <span class="cline-any cline-yes">1x</span>
963
+ <span class="cline-any cline-yes">1x</span>
964
+ <span class="cline-any cline-yes">1x</span>
965
+ <span class="cline-any cline-yes">1x</span>
966
+ <span class="cline-any cline-yes">1x</span>
967
+ <span class="cline-any cline-yes">1x</span>
968
+ <span class="cline-any cline-yes">1x</span>
969
+ <span class="cline-any cline-yes">1x</span>
970
+ <span class="cline-any cline-yes">1x</span>
971
+ <span class="cline-any cline-yes">1x</span>
972
+ <span class="cline-any cline-yes">1x</span>
973
+ <span class="cline-any cline-yes">1x</span>
974
+ <span class="cline-any cline-yes">1x</span>
975
+ <span class="cline-any cline-yes">1x</span>
976
+ <span class="cline-any cline-yes">1x</span>
977
+ <span class="cline-any cline-yes">1x</span>
978
+ <span class="cline-any cline-yes">1x</span>
979
+ <span class="cline-any cline-yes">1x</span>
980
+ <span class="cline-any cline-yes">1x</span>
981
+ <span class="cline-any cline-yes">1x</span>
982
+ <span class="cline-any cline-yes">1x</span>
983
+ <span class="cline-any cline-yes">1x</span>
984
+ <span class="cline-any cline-yes">1x</span>
985
+ <span class="cline-any cline-yes">1x</span>
986
+ <span class="cline-any cline-yes">1x</span>
987
+ <span class="cline-any cline-yes">1x</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-yes">1x</span>
996
+ <span class="cline-any cline-yes">1x</span>
997
+ <span class="cline-any cline-yes">1x</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-yes">1x</span>
1001
+ <span class="cline-any cline-yes">1x</span>
1002
+ <span class="cline-any cline-yes">1x</span>
1003
+ <span class="cline-any cline-yes">1x</span>
1004
+ <span class="cline-any cline-yes">1x</span>
1005
+ <span class="cline-any cline-yes">1x</span>
1006
+ <span class="cline-any cline-yes">1x</span>
1007
+ <span class="cline-any cline-yes">1x</span>
1008
+ <span class="cline-any cline-yes">1x</span>
1009
+ <span class="cline-any cline-yes">1x</span>
1010
+ <span class="cline-any cline-yes">1x</span>
1011
+ <span class="cline-any cline-yes">1x</span>
1012
+ <span class="cline-any cline-yes">1x</span>
1013
+ <span class="cline-any cline-yes">1x</span>
1014
+ <span class="cline-any cline-yes">1x</span>
1015
+ <span class="cline-any cline-yes">1x</span>
1016
+ <span class="cline-any cline-yes">2x</span>
1017
+ <span class="cline-any cline-yes">2x</span>
1018
+ <span class="cline-any cline-yes">2x</span>
1019
+ <span class="cline-any cline-no">&nbsp;</span>
1020
+ <span class="cline-any cline-no">&nbsp;</span>
1021
+ <span class="cline-any cline-yes">2x</span>
1022
+ <span class="cline-any cline-yes">2x</span>
1023
+ <span class="cline-any cline-yes">2x</span>
1024
+ <span class="cline-any cline-yes">2x</span>
1025
+ <span class="cline-any cline-yes">2x</span>
1026
+ <span class="cline-any cline-yes">2x</span>
1027
+ <span class="cline-any cline-yes">2x</span>
1028
+ <span class="cline-any cline-yes">2x</span>
1029
+ <span class="cline-any cline-yes">1x</span>
1030
+ <span class="cline-any cline-yes">1x</span>
1031
+ <span class="cline-any cline-yes">1x</span>
1032
+ <span class="cline-any cline-yes">1x</span>
1033
+ <span class="cline-any cline-yes">1x</span>
1034
+ <span class="cline-any cline-yes">1x</span>
1035
+ <span class="cline-any cline-yes">1x</span>
1036
+ <span class="cline-any cline-yes">2x</span>
1037
+ <span class="cline-any cline-yes">2x</span>
1038
+ <span class="cline-any cline-yes">2x</span>
1039
+ <span class="cline-any cline-yes">2x</span>
1040
+ <span class="cline-any cline-yes">2x</span>
1041
+ <span class="cline-any cline-yes">2x</span>
1042
+ <span class="cline-any cline-yes">2x</span>
1043
+ <span class="cline-any cline-yes">2x</span>
1044
+ <span class="cline-any cline-yes">2x</span>
1045
+ <span class="cline-any cline-yes">2x</span>
1046
+ <span class="cline-any cline-yes">2x</span>
1047
+ <span class="cline-any cline-yes">1x</span>
1048
+ <span class="cline-any cline-yes">1x</span>
1049
+ <span class="cline-any cline-yes">1x</span>
1050
+ <span class="cline-any cline-yes">2x</span>
1051
+ <span class="cline-any cline-yes">2x</span>
1052
+ <span class="cline-any cline-yes">2x</span>
1053
+ <span class="cline-any cline-yes">3x</span>
1054
+ <span class="cline-any cline-yes">2x</span>
1055
+ <span class="cline-any cline-yes">2x</span>
1056
+ <span class="cline-any cline-yes">2x</span>
1057
+ <span class="cline-any cline-yes">2x</span>
1058
+ <span class="cline-any cline-yes">2x</span>
1059
+ <span class="cline-any cline-no">&nbsp;</span>
1060
+ <span class="cline-any cline-no">&nbsp;</span>
1061
+ <span class="cline-any cline-yes">2x</span>
1062
+ <span class="cline-any cline-yes">2x</span>
1063
+ <span class="cline-any cline-yes">2x</span>
1064
+ <span class="cline-any cline-yes">1x</span>
1065
+ <span class="cline-any cline-yes">1x</span>
1066
+ <span class="cline-any cline-yes">1x</span>
1067
+ <span class="cline-any cline-yes">1x</span>
1068
+ <span class="cline-any cline-no">&nbsp;</span>
1069
+ <span class="cline-any cline-no">&nbsp;</span>
1070
+ <span class="cline-any cline-no">&nbsp;</span>
1071
+ <span class="cline-any cline-no">&nbsp;</span>
1072
+ <span class="cline-any cline-no">&nbsp;</span>
1073
+ <span class="cline-any cline-no">&nbsp;</span>
1074
+ <span class="cline-any cline-no">&nbsp;</span>
1075
+ <span class="cline-any cline-no">&nbsp;</span>
1076
+ <span class="cline-any cline-no">&nbsp;</span>
1077
+ <span class="cline-any cline-no">&nbsp;</span>
1078
+ <span class="cline-any cline-no">&nbsp;</span>
1079
+ <span class="cline-any cline-yes">1x</span>
1080
+ <span class="cline-any cline-yes">1x</span>
1081
+ <span class="cline-any cline-no">&nbsp;</span>
1082
+ <span class="cline-any cline-no">&nbsp;</span>
1083
+ <span class="cline-any cline-yes">1x</span>
1084
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import _ from 'lodash'
1085
+ &nbsp;
1086
+ export const SortOrder = {
1087
+ ASCENDING: 0,
1088
+ DESCENDING: 1
1089
+ }
1090
+ &nbsp;
1091
+ export const gridSourceFactories = { }
1092
+ export const unitConverters = { }
1093
+ &nbsp;
1094
+ const toHalf = (function () {
1095
+ const floatView = new Float32Array(1)
1096
+ const int32View = new Int32Array(floatView.buffer)
1097
+ &nbsp;
1098
+ /* This method is faster than the OpenEXR implementation (very often
1099
+ * used, eg. in Ogre), with the additional benefit of rounding, inspired
1100
+ * by James Tursa?s half-precision code. */
1101
+ return <span class="fstat-no" title="function not covered" >function toHalf (val) {</span>
1102
1102
  <span class="cstat-no" title="statement not covered" > floatView[0] = val</span>
1103
1103
  <span class="cstat-no" title="statement not covered" > const x = int32View[0]</span>
1104
1104
  <span class="cstat-no" title="statement not covered" ></span>
@@ -1136,42 +1136,42 @@
1136
1136
  <span class="cstat-no" title="statement not covered" > bits += m &amp; 1</span>
1137
1137
  <span class="cstat-no" title="statement not covered" > return bits</span>
1138
1138
  <span class="cstat-no" title="statement not covered" > }</span>
1139
- <span class="cstat-no" title="statement not covered" >}())</span>
1140
- <span class="cstat-no" title="statement not covered" ></span>
1141
- <span class="cstat-no" title="statement not covered" >// Base 2d grid class</span>
1142
- <span class="cstat-no" title="statement not covered" >// TODO: add interpolate/bilinearInterpolate and other missing stuff from weacast grid</span>
1143
- <span class="cstat-no" title="statement not covered" >export class BaseGrid {</span>
1144
- <span class="cstat-no" title="statement not covered" > constructor (sourceKey, bbox, dimensions, nodata) {</span>
1145
- <span class="cstat-no" title="statement not covered" > this.sourceKey = sourceKey</span>
1146
- <span class="cstat-no" title="statement not covered" > this.bbox = bbox</span>
1147
- <span class="cstat-no" title="statement not covered" > this.dimensions = dimensions</span>
1148
- <span class="cstat-no" title="statement not covered" > this.resolution = [(bbox[2] - bbox[0]) / (dimensions[0] - 1), (bbox[3] - bbox[1]) / (dimensions[1] - 1)]</span>
1149
- <span class="cstat-no" title="statement not covered" > this.nodata = nodata</span>
1150
- <span class="cstat-no" title="statement not covered" ></span>
1151
- <span class="cstat-no" title="statement not covered" > if (this.bbox[0] &gt;= this.bbox[2] || this.bbox[1] &gt;= this.bbox[3]) {</span>
1139
+ }())
1140
+ &nbsp;
1141
+ // Base 2d grid class
1142
+ // TODO: add interpolate/bilinearInterpolate and other missing stuff from weacast grid
1143
+ export class BaseGrid {
1144
+ constructor (sourceKey, bbox, dimensions, nodata) {
1145
+ this.sourceKey = sourceKey
1146
+ this.bbox = bbox
1147
+ this.dimensions = dimensions
1148
+ this.resolution = [(bbox[2] - bbox[0]) / (dimensions[0] - 1), (bbox[3] - bbox[1]) / (dimensions[1] - 1)]
1149
+ this.nodata = nodata
1150
+ &nbsp;
1151
+ if (this.bbox[0] &gt;= this.bbox[2] || this.bbox[1] &gt;= this.bbox[3]) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
1152
1152
  <span class="cstat-no" title="statement not covered" > throw new Error('Grid bbox seems weird')</span>
1153
1153
  <span class="cstat-no" title="statement not covered" > }</span>
1154
- <span class="cstat-no" title="statement not covered" > if (this.dimensions[0] &lt;= 0 || this.dimensions[1] &lt;= 0) {</span>
1154
+ if (this.dimensions[0] &lt;= 0 || this.dimensions[1] &lt;= 0) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
1155
1155
  <span class="cstat-no" title="statement not covered" > throw new Error("Grid dimension is &lt; 0, something's wrong")</span>
1156
1156
  <span class="cstat-no" title="statement not covered" > }</span>
1157
- <span class="cstat-no" title="statement not covered" > if (this.resolution[0] &lt;= 0.0 || this.resolution[1] &lt;= 0.0) {</span>
1157
+ if (this.resolution[0] &lt;= 0.0 || this.resolution[1] &lt;= 0.0) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
1158
1158
  <span class="cstat-no" title="statement not covered" > throw new Error("Grid resolution is &lt; 0, something's wrong")</span>
1159
1159
  <span class="cstat-no" title="statement not covered" > }</span>
1160
- <span class="cstat-no" title="statement not covered" > }</span>
1161
- <span class="cstat-no" title="statement not covered" ></span>
1162
- <span class="cstat-no" title="statement not covered" > getDimensions () {</span>
1163
- <span class="cstat-no" title="statement not covered" > return this.dimensions</span>
1164
- <span class="cstat-no" title="statement not covered" > }</span>
1165
- <span class="cstat-no" title="statement not covered" ></span>
1166
- <span class="cstat-no" title="statement not covered" > getResolution () {</span>
1167
- <span class="cstat-no" title="statement not covered" > return this.resolution</span>
1168
- <span class="cstat-no" title="statement not covered" > }</span>
1169
- <span class="cstat-no" title="statement not covered" ></span>
1170
- <span class="cstat-no" title="statement not covered" > getBBox () {</span>
1171
- <span class="cstat-no" title="statement not covered" > return this.bbox</span>
1172
- <span class="cstat-no" title="statement not covered" > }</span>
1173
- <span class="cstat-no" title="statement not covered" ></span>
1174
- <span class="cstat-no" title="statement not covered" > hasData () {</span>
1160
+ }
1161
+ &nbsp;
1162
+ getDimensions () {
1163
+ return this.dimensions
1164
+ }
1165
+ &nbsp;
1166
+ getResolution () {
1167
+ return this.resolution
1168
+ }
1169
+ &nbsp;
1170
+ getBBox () {
1171
+ return this.bbox
1172
+ }
1173
+ &nbsp;
1174
+ <span class="fstat-no" title="function not covered" > hasData () {</span>
1175
1175
  <span class="cstat-no" title="statement not covered" > for (let ilat = 0; ilat &lt; this.dimensions[0]; ++ilat) {</span>
1176
1176
  <span class="cstat-no" title="statement not covered" > for (let ilon = 0; ilon &lt; this.dimensions[1]; ++ilon) {</span>
1177
1177
  <span class="cstat-no" title="statement not covered" > const value = this.getValue(ilat, ilon)</span>
@@ -1181,8 +1181,8 @@
1181
1181
  <span class="cstat-no" title="statement not covered" ></span>
1182
1182
  <span class="cstat-no" title="statement not covered" > return false</span>
1183
1183
  <span class="cstat-no" title="statement not covered" > }</span>
1184
- <span class="cstat-no" title="statement not covered" ></span>
1185
- <span class="cstat-no" title="statement not covered" > getDataBounds () {</span>
1184
+ &nbsp;
1185
+ <span class="fstat-no" title="function not covered" > getDataBounds () {</span>
1186
1186
  <span class="cstat-no" title="statement not covered" > // if already computed, return</span>
1187
1187
  <span class="cstat-no" title="statement not covered" > if (this.dataBounds) { return this.dataBounds }</span>
1188
1188
  <span class="cstat-no" title="statement not covered" ></span>
@@ -1212,20 +1212,20 @@
1212
1212
  <span class="cstat-no" title="statement not covered" > this.dataBounds = [minVal, maxVal]</span>
1213
1213
  <span class="cstat-no" title="statement not covered" > return this.dataBounds</span>
1214
1214
  <span class="cstat-no" title="statement not covered" > }</span>
1215
- <span class="cstat-no" title="statement not covered" ></span>
1216
- <span class="cstat-no" title="statement not covered" > getLat (ilat) {</span>
1215
+ &nbsp;
1216
+ <span class="fstat-no" title="function not covered" > getLat (ilat) {</span>
1217
1217
  <span class="cstat-no" title="statement not covered" > return this.bbox[0] + (ilat * this.resolution[0])</span>
1218
1218
  <span class="cstat-no" title="statement not covered" > }</span>
1219
- <span class="cstat-no" title="statement not covered" ></span>
1220
- <span class="cstat-no" title="statement not covered" > getLon (ilon) {</span>
1219
+ &nbsp;
1220
+ <span class="fstat-no" title="function not covered" > getLon (ilon) {</span>
1221
1221
  <span class="cstat-no" title="statement not covered" > return this.bbox[1] + (ilon * this.resolution[1])</span>
1222
1222
  <span class="cstat-no" title="statement not covered" > }</span>
1223
- <span class="cstat-no" title="statement not covered" ></span>
1224
- <span class="cstat-no" title="statement not covered" > getValue (ilat, ilon) {</span>
1223
+ &nbsp;
1224
+ <span class="fstat-no" title="function not covered" > getValue (ilat, ilon) {</span>
1225
1225
  <span class="cstat-no" title="statement not covered" > throw new Error('Not implemented')</span>
1226
1226
  <span class="cstat-no" title="statement not covered" > }</span>
1227
- <span class="cstat-no" title="statement not covered" ></span>
1228
- <span class="cstat-no" title="statement not covered" > getIndices (lat, lon) {</span>
1227
+ &nbsp;
1228
+ <span class="fstat-no" title="function not covered" > getIndices (lat, lon) {</span>
1229
1229
  <span class="cstat-no" title="statement not covered" > if (lat &lt; this.bbox[0] || lat &gt; this.bbox[2] || lon &lt; this.bbox[1] || lon &gt; this.bbox[2]) { return null }</span>
1230
1230
  <span class="cstat-no" title="statement not covered" ></span>
1231
1231
  <span class="cstat-no" title="statement not covered" > const ilat = (lat - this.bbox[0]) / this.resolution[0]</span>
@@ -1233,8 +1233,8 @@
1233
1233
  <span class="cstat-no" title="statement not covered" ></span>
1234
1234
  <span class="cstat-no" title="statement not covered" > return [Math.floor(ilat), Math.floor(ilon)]</span>
1235
1235
  <span class="cstat-no" title="statement not covered" > }</span>
1236
- <span class="cstat-no" title="statement not covered" ></span>
1237
- <span class="cstat-no" title="statement not covered" > getBestFit (fitBbox) {</span>
1236
+ &nbsp;
1237
+ <span class="fstat-no" title="function not covered" > getBestFit (fitBbox) {</span>
1238
1238
  <span class="cstat-no" title="statement not covered" > let iminlat = -1</span>
1239
1239
  <span class="cstat-no" title="statement not covered" > for (let ilat = 0; ilat &lt; this.dimensions[0] - 1 &amp;&amp; iminlat === -1; ++ilat) {</span>
1240
1240
  <span class="cstat-no" title="statement not covered" > const lat = this.getLat(ilat + 1)</span>
@@ -1261,8 +1261,8 @@
1261
1261
  <span class="cstat-no" title="statement not covered" ></span>
1262
1262
  <span class="cstat-no" title="statement not covered" > return [iminlat, iminlon, imaxlat, imaxlon]</span>
1263
1263
  <span class="cstat-no" title="statement not covered" > }</span>
1264
- <span class="cstat-no" title="statement not covered" ></span>
1265
- <span class="cstat-no" title="statement not covered" > genCoordsBuffer () {</span>
1264
+ &nbsp;
1265
+ <span class="fstat-no" title="function not covered" > genCoordsBuffer () {</span>
1266
1266
  <span class="cstat-no" title="statement not covered" > const numPoints = this.dimensions[0] * this.dimensions[1]</span>
1267
1267
  <span class="cstat-no" title="statement not covered" > const coords = new Uint16Array(2 * numPoints)</span>
1268
1268
  <span class="cstat-no" title="statement not covered" ></span>
@@ -1288,8 +1288,8 @@
1288
1288
  <span class="cstat-no" title="statement not covered" ></span>
1289
1289
  <span class="cstat-no" title="statement not covered" > return { coords, minLat, maxLat, minLon, maxLon, deltaLat, deltaLon }</span>
1290
1290
  <span class="cstat-no" title="statement not covered" > }</span>
1291
- <span class="cstat-no" title="statement not covered" ></span>
1292
- <span class="cstat-no" title="statement not covered" > genValuesBuffer () {</span>
1291
+ &nbsp;
1292
+ <span class="fstat-no" title="function not covered" > genValuesBuffer () {</span>
1293
1293
  <span class="cstat-no" title="statement not covered" > const numPoints = this.dimensions[0] * this.dimensions[1]</span>
1294
1294
  <span class="cstat-no" title="statement not covered" > const values = new Float32Array(numPoints)</span>
1295
1295
  <span class="cstat-no" title="statement not covered" ></span>
@@ -1304,8 +1304,8 @@
1304
1304
  <span class="cstat-no" title="statement not covered" ></span>
1305
1305
  <span class="cstat-no" title="statement not covered" > return values</span>
1306
1306
  <span class="cstat-no" title="statement not covered" > }</span>
1307
- <span class="cstat-no" title="statement not covered" ></span>
1308
- <span class="cstat-no" title="statement not covered" > genMeshIndexBuffer () {</span>
1307
+ &nbsp;
1308
+ <span class="fstat-no" title="function not covered" > genMeshIndexBuffer () {</span>
1309
1309
  <span class="cstat-no" title="statement not covered" > let iidx = 0</span>
1310
1310
  <span class="cstat-no" title="statement not covered" > const maxIndex = (this.dimensions[0] * this.dimensions[1]) - 1</span>
1311
1311
  <span class="cstat-no" title="statement not covered" > const numIndex = (this.dimensions[1] - 1) * (this.dimensions[0] * 2 + 1) - 1</span>
@@ -1320,8 +1320,8 @@
1320
1320
  <span class="cstat-no" title="statement not covered" > }</span>
1321
1321
  <span class="cstat-no" title="statement not covered" > return index</span>
1322
1322
  <span class="cstat-no" title="statement not covered" > }</span>
1323
- <span class="cstat-no" title="statement not covered" ></span>
1324
- <span class="cstat-no" title="statement not covered" > genWireframeIndexBuffer () {</span>
1323
+ &nbsp;
1324
+ <span class="fstat-no" title="function not covered" > genWireframeIndexBuffer () {</span>
1325
1325
  <span class="cstat-no" title="statement not covered" > const maxIndex = (this.dimensions[0] * this.dimensions[1]) - 1</span>
1326
1326
  <span class="cstat-no" title="statement not covered" > const numIndex = (this.dimensions[1] * (this.dimensions[0] + 1)) + (this.dimensions[0] * (this.dimensions[1] + 1) - 1)</span>
1327
1327
  <span class="cstat-no" title="statement not covered" > const restart = maxIndex &gt; 65534 ? 4294967295 : 65535</span>
@@ -1341,30 +1341,30 @@
1341
1341
  <span class="cstat-no" title="statement not covered" > }</span>
1342
1342
  <span class="cstat-no" title="statement not covered" > return index</span>
1343
1343
  <span class="cstat-no" title="statement not covered" > }</span>
1344
- <span class="cstat-no" title="statement not covered" >}</span>
1345
- <span class="cstat-no" title="statement not covered" ></span>
1346
- <span class="cstat-no" title="statement not covered" >export class GridSource {</span>
1347
- <span class="cstat-no" title="statement not covered" > constructor (options) {</span>
1348
- <span class="cstat-no" title="statement not covered" > this.events = {}</span>
1349
- <span class="cstat-no" title="statement not covered" > this.sourceKey = 0</span>
1350
- <span class="cstat-no" title="statement not covered" > }</span>
1351
- <span class="cstat-no" title="statement not covered" ></span>
1352
- <span class="cstat-no" title="statement not covered" > getBBox () {</span>
1344
+ }
1345
+ &nbsp;
1346
+ export class GridSource {
1347
+ constructor (options) {
1348
+ this.events = {}
1349
+ this.sourceKey = 0
1350
+ }
1351
+ &nbsp;
1352
+ <span class="fstat-no" title="function not covered" > getBBox () {</span>
1353
1353
  <span class="cstat-no" title="statement not covered" > return null</span>
1354
1354
  <span class="cstat-no" title="statement not covered" > }</span>
1355
- <span class="cstat-no" title="statement not covered" ></span>
1356
- <span class="cstat-no" title="statement not covered" > getDataBounds () {</span>
1355
+ &nbsp;
1356
+ <span class="fstat-no" title="function not covered" > getDataBounds () {</span>
1357
1357
  <span class="cstat-no" title="statement not covered" > throw new Error('Not implemented')</span>
1358
1358
  <span class="cstat-no" title="statement not covered" > }</span>
1359
- <span class="cstat-no" title="statement not covered" ></span>
1360
- <span class="cstat-no" title="statement not covered" > supportsNoData () {</span>
1359
+ &nbsp;
1360
+ <span class="fstat-no" title="function not covered" > supportsNoData () {</span>
1361
1361
  <span class="cstat-no" title="statement not covered" > return this.nodata !== undefined</span>
1362
1362
  <span class="cstat-no" title="statement not covered" > }</span>
1363
- <span class="cstat-no" title="statement not covered" ></span>
1364
- <span class="cstat-no" title="statement not covered" > /**</span>
1365
- <span class="cstat-no" title="statement not covered" > * @returns {Number} Returns a new longitude with the value wrapped so it's always in the same range than the given bounding box (e.g. between -180 and +180 degrees).</span>
1366
- <span class="cstat-no" title="statement not covered" > */</span>
1367
- <span class="cstat-no" title="statement not covered" > wrapLongitude (lon, bounds) {</span>
1363
+ &nbsp;
1364
+ /**
1365
+ * @returns {Number} Returns a new longitude with the value wrapped so it's always in the same range than the given bounding box (e.g. between -180 and +180 degrees).
1366
+ */
1367
+ <span class="fstat-no" title="function not covered" > wrapLongitude (lon, bounds) {</span>
1368
1368
  <span class="cstat-no" title="statement not covered" > // We have longitudes in range [-180, 180] so take care if longitude is given in range [0, 360]</span>
1369
1369
  <span class="cstat-no" title="statement not covered" > if (bounds[0] &lt; 0) {</span>
1370
1370
  <span class="cstat-no" title="statement not covered" > return lon &gt; 180 ? lon - 360 : lon</span>
@@ -1375,125 +1375,125 @@
1375
1375
  <span class="cstat-no" title="statement not covered" > return lon</span>
1376
1376
  <span class="cstat-no" title="statement not covered" > }</span>
1377
1377
  <span class="cstat-no" title="statement not covered" > }</span>
1378
- <span class="cstat-no" title="statement not covered" ></span>
1379
- <span class="cstat-no" title="statement not covered" > async setup (config) {</span>
1378
+ &nbsp;
1379
+ <span class="fstat-no" title="function not covered" > async setup (config) {</span>
1380
1380
  <span class="cstat-no" title="statement not covered" > throw new Error('Not implemented')</span>
1381
1381
  <span class="cstat-no" title="statement not covered" > }</span>
1382
- <span class="cstat-no" title="statement not covered" ></span>
1383
- <span class="cstat-no" title="statement not covered" > async fetch (abort, bbox, resolution) {</span>
1382
+ &nbsp;
1383
+ <span class="fstat-no" title="function not covered" > async fetch (abort, bbox, resolution) {</span>
1384
1384
  <span class="cstat-no" title="statement not covered" > throw new Error('Not implemented')</span>
1385
1385
  <span class="cstat-no" title="statement not covered" > }</span>
1386
- <span class="cstat-no" title="statement not covered" ></span>
1387
- <span class="cstat-no" title="statement not covered" > on (event, callback) {</span>
1386
+ &nbsp;
1387
+ <span class="fstat-no" title="function not covered" > on (event, callback) {</span>
1388
1388
  <span class="cstat-no" title="statement not covered" > const callbacks = _.get(this.events, event, [])</span>
1389
1389
  <span class="cstat-no" title="statement not covered" > callbacks.push(callback)</span>
1390
1390
  <span class="cstat-no" title="statement not covered" > if (callbacks.length === 1) { this.events[event] = callbacks }</span>
1391
1391
  <span class="cstat-no" title="statement not covered" > }</span>
1392
- <span class="cstat-no" title="statement not covered" ></span>
1393
- <span class="cstat-no" title="statement not covered" > off (event, callback) {</span>
1392
+ &nbsp;
1393
+ <span class="fstat-no" title="function not covered" > off (event, callback) {</span>
1394
1394
  <span class="cstat-no" title="statement not covered" > const callbacks = _.get(this.events, event, [])</span>
1395
1395
  <span class="cstat-no" title="statement not covered" > callbacks.splice(0, 0, callback)</span>
1396
1396
  <span class="cstat-no" title="statement not covered" > }</span>
1397
- <span class="cstat-no" title="statement not covered" ></span>
1398
- <span class="cstat-no" title="statement not covered" > emit (event) {</span>
1399
- <span class="cstat-no" title="statement not covered" > const callbacks = _.get(this.events, event, [])</span>
1400
- <span class="cstat-no" title="statement not covered" > const ctx = { source: this, event }</span>
1401
- <span class="cstat-no" title="statement not covered" > for (const cb of callbacks) {</span>
1397
+ &nbsp;
1398
+ emit (event) {
1399
+ const callbacks = _.get(this.events, event, [])
1400
+ const ctx = { source: this, event }
1401
+ for (const cb of callbacks) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
1402
1402
  <span class="cstat-no" title="statement not covered" > cb(ctx)</span>
1403
1403
  <span class="cstat-no" title="statement not covered" > }</span>
1404
- <span class="cstat-no" title="statement not covered" > }</span>
1405
- <span class="cstat-no" title="statement not covered" ></span>
1406
- <span class="cstat-no" title="statement not covered" > dataChanged () {</span>
1407
- <span class="cstat-no" title="statement not covered" > this.emit('data-changed')</span>
1408
- <span class="cstat-no" title="statement not covered" > }</span>
1409
- <span class="cstat-no" title="statement not covered" >}</span>
1410
- <span class="cstat-no" title="statement not covered" ></span>
1411
- <span class="cstat-no" title="statement not covered" >export function makeGridSource (key, options = null) {</span>
1412
- <span class="cstat-no" title="statement not covered" > const factory = _.get(gridSourceFactories, key, null)</span>
1413
- <span class="cstat-no" title="statement not covered" > if (factory) { return factory(options) }</span>
1414
- <span class="cstat-no" title="statement not covered" > return null</span>
1415
- <span class="cstat-no" title="statement not covered" >}</span>
1416
- <span class="cstat-no" title="statement not covered" ></span>
1417
- <span class="cstat-no" title="statement not covered" >export function extractGridSourceConfig (options) {</span>
1418
- <span class="cstat-no" title="statement not covered" > for (const key of Object.keys(options)) {</span>
1419
- <span class="cstat-no" title="statement not covered" > const factory = _.get(gridSourceFactories, key, null)</span>
1420
- <span class="cstat-no" title="statement not covered" > if (factory) { return [key, options[key]] }</span>
1421
- <span class="cstat-no" title="statement not covered" > }</span>
1422
- <span class="cstat-no" title="statement not covered" > return [null, null]</span>
1423
- <span class="cstat-no" title="statement not covered" >}</span>
1424
- <span class="cstat-no" title="statement not covered" ></span>
1425
- <span class="cstat-no" title="statement not covered" >// these allow to query grid with ascending lat/lon</span>
1426
- <span class="cstat-no" title="statement not covered" >const grid1DAccessFunctions = [</span>
1427
- <span class="cstat-no" title="statement not covered" > // lonFirst, latOrder=SortOrder.ASCENDING, lonOrder=SortOrder.ASCENDING</span>
1428
- <span class="cstat-no" title="statement not covered" > function (data, ilat, ilon, latCount, lonCount) { return data[ilon * latCount + ilat] },</span>
1429
- <span class="cstat-no" title="statement not covered" > // lonFirst, latOrder=SortOrder.ASCENDING, lonOrder=SortOrder.DESCENDING</span>
1430
- <span class="cstat-no" title="statement not covered" > function (data, ilat, ilon, latCount, lonCount) { return data[(lonCount - (ilon + 1)) * latCount + ilat] },</span>
1431
- <span class="cstat-no" title="statement not covered" > // lonFirst, latOrder=SortOrder.DESCENDING, lonOrder=SortOrder.ASCENDING</span>
1432
- <span class="cstat-no" title="statement not covered" > function (data, ilat, ilon, latCount, lonCount) { return data[ilon * latCount + (latCount - (ilat + 1))] },</span>
1433
- <span class="cstat-no" title="statement not covered" > // lonFirst, latOrder=SortOrder.DESCENDING, lonOrder=SortOrder.DESCENDING</span>
1434
- <span class="cstat-no" title="statement not covered" > function (data, ilat, ilon, latCount, lonCount) { return data[(lonCount - (ilon + 1)) * latCount + (latCount - (ilat + 1))] },</span>
1435
- <span class="cstat-no" title="statement not covered" ></span>
1436
- <span class="cstat-no" title="statement not covered" > // latFirst, latOrder=SortOrder.ASCENDING, lonOrder=SortOrder.ASCENDING</span>
1437
- <span class="cstat-no" title="statement not covered" > function (data, ilat, ilon, latCount, lonCount) { return data[ilat * lonCount + ilon] },</span>
1438
- <span class="cstat-no" title="statement not covered" > // latFirst, latOrder=SortOrder.ASCENDING, lonOrder=SortOrder.DESCENDING</span>
1439
- <span class="cstat-no" title="statement not covered" > function (data, ilat, ilon, latCount, lonCount) { return data[ilat * lonCount + (lonCount - (ilon + 1))] },</span>
1440
- <span class="cstat-no" title="statement not covered" > // latFirst, latOrder=SortOrder.DESCENDING, lonOrder=SortOrder.ASCENDING</span>
1441
- <span class="cstat-no" title="statement not covered" > function (data, ilat, ilon, latCount, lonCount) { return data[(latCount - (ilat + 1)) * lonCount + ilon] },</span>
1442
- <span class="cstat-no" title="statement not covered" > // latFirst, latOrder=SortOrder.DESCENDING, lonOrder=SortOrder.DESCENDING</span>
1443
- <span class="cstat-no" title="statement not covered" > function (data, ilat, ilon, latCount, lonCount) { return data[(latCount - (ilat + 1)) * lonCount + (lonCount - (ilon + 1))] }</span>
1444
- <span class="cstat-no" title="statement not covered" >]</span>
1445
- <span class="cstat-no" title="statement not covered" ></span>
1446
- <span class="cstat-no" title="statement not covered" >export class Grid1D extends BaseGrid {</span>
1447
- <span class="cstat-no" title="statement not covered" > constructor (sourceKey, bbox, dimensions, data, latFirst, latSortOrder, lonSortOrder, nodata = undefined, converter = null) {</span>
1448
- <span class="cstat-no" title="statement not covered" > super(sourceKey, bbox, dimensions, nodata)</span>
1449
- <span class="cstat-no" title="statement not covered" ></span>
1450
- <span class="cstat-no" title="statement not covered" > this.data = data</span>
1451
- <span class="cstat-no" title="statement not covered" ></span>
1452
- <span class="cstat-no" title="statement not covered" > const index = lonSortOrder + (latSortOrder * 2) + ((latFirst ? 1 : 0) * 4)</span>
1453
- <span class="cstat-no" title="statement not covered" > this.getByIndex = grid1DAccessFunctions[index]</span>
1454
- <span class="cstat-no" title="statement not covered" ></span>
1455
- <span class="cstat-no" title="statement not covered" > if (converter) {</span>
1404
+ }
1405
+ &nbsp;
1406
+ dataChanged () {
1407
+ this.emit('data-changed')
1408
+ }
1409
+ }
1410
+ &nbsp;
1411
+ export function makeGridSource (key, options = null) {
1412
+ const factory = _.get(gridSourceFactories, key, null)
1413
+ if (factory) { return factory(options) }
1414
+ <span class="cstat-no" title="statement not covered" ><span class="branch-0 cbranch-no" title="branch not covered" > return null</span></span>
1415
+ }
1416
+ &nbsp;
1417
+ export function extractGridSourceConfig (options) {
1418
+ for (const key of Object.keys(options)) {
1419
+ const factory = _.get(gridSourceFactories, key, null)
1420
+ if (factory) { return [key, options[key]] }
1421
+ }
1422
+ <span class="cstat-no" title="statement not covered" ><span class="branch-0 cbranch-no" title="branch not covered" > return [null, null]</span></span>
1423
+ }
1424
+ &nbsp;
1425
+ // these allow to query grid with ascending lat/lon
1426
+ const grid1DAccessFunctions = [
1427
+ // lonFirst, latOrder=SortOrder.ASCENDING, lonOrder=SortOrder.ASCENDING
1428
+ <span class="fstat-no" title="function not covered" > function (data, ilat, ilon, latCount, lonCount) { return data[ilon * latCount + ilat] },</span>
1429
+ // lonFirst, latOrder=SortOrder.ASCENDING, lonOrder=SortOrder.DESCENDING
1430
+ <span class="fstat-no" title="function not covered" > function (data, ilat, ilon, latCount, lonCount) { return data[(lonCount - (ilon + 1)) * latCount + ilat] },</span>
1431
+ // lonFirst, latOrder=SortOrder.DESCENDING, lonOrder=SortOrder.ASCENDING
1432
+ <span class="fstat-no" title="function not covered" > function (data, ilat, ilon, latCount, lonCount) { return data[ilon * latCount + (latCount - (ilat + 1))] },</span>
1433
+ // lonFirst, latOrder=SortOrder.DESCENDING, lonOrder=SortOrder.DESCENDING
1434
+ <span class="fstat-no" title="function not covered" > function (data, ilat, ilon, latCount, lonCount) { return data[(lonCount - (ilon + 1)) * latCount + (latCount - (ilat + 1))] },</span>
1435
+ &nbsp;
1436
+ // latFirst, latOrder=SortOrder.ASCENDING, lonOrder=SortOrder.ASCENDING
1437
+ <span class="fstat-no" title="function not covered" > function (data, ilat, ilon, latCount, lonCount) { return data[ilat * lonCount + ilon] },</span>
1438
+ // latFirst, latOrder=SortOrder.ASCENDING, lonOrder=SortOrder.DESCENDING
1439
+ <span class="fstat-no" title="function not covered" > function (data, ilat, ilon, latCount, lonCount) { return data[ilat * lonCount + (lonCount - (ilon + 1))] },</span>
1440
+ // latFirst, latOrder=SortOrder.DESCENDING, lonOrder=SortOrder.ASCENDING
1441
+ function (data, ilat, ilon, latCount, lonCount) { return data[(latCount - (ilat + 1)) * lonCount + ilon] },
1442
+ // latFirst, latOrder=SortOrder.DESCENDING, lonOrder=SortOrder.DESCENDING
1443
+ <span class="fstat-no" title="function not covered" > function (data, ilat, ilon, latCount, lonCount) { return data[(latCount - (ilat + 1)) * lonCount + (lonCount - (ilon + 1))] }</span>
1444
+ ]
1445
+ &nbsp;
1446
+ export class Grid1D extends BaseGrid {
1447
+ constructor (sourceKey, bbox, dimensions, data, latFirst, latSortOrder, lonSortOrder, nodata = undefined, converter = null) {
1448
+ super(sourceKey, bbox, dimensions, nodata)
1449
+ &nbsp;
1450
+ this.data = data
1451
+ &nbsp;
1452
+ const index = lonSortOrder + (latSortOrder * 2) + ((latFirst ? 1 <span class="branch-0 cbranch-no" title="branch not covered" >: 0)</span> * 4)
1453
+ this.getByIndex = grid1DAccessFunctions[index]
1454
+ &nbsp;
1455
+ if (converter) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
1456
1456
  <span class="cstat-no" title="statement not covered" > for (let i = 0; i &lt; data.length; ++i) {</span>
1457
1457
  <span class="cstat-no" title="statement not covered" > data[i] = converter(data[i])</span>
1458
1458
  <span class="cstat-no" title="statement not covered" > }</span>
1459
1459
  <span class="cstat-no" title="statement not covered" > }</span>
1460
- <span class="cstat-no" title="statement not covered" > }</span>
1461
- <span class="cstat-no" title="statement not covered" ></span>
1462
- <span class="cstat-no" title="statement not covered" > getValue (ilat, ilon) {</span>
1463
- <span class="cstat-no" title="statement not covered" > return this.getByIndex(this.data, ilat, ilon, this.dimensions[0], this.dimensions[1])</span>
1464
- <span class="cstat-no" title="statement not covered" > }</span>
1465
- <span class="cstat-no" title="statement not covered" >}</span>
1466
- <span class="cstat-no" title="statement not covered" ></span>
1467
- <span class="cstat-no" title="statement not covered" >// these allow to query grid with ascending lat/lon</span>
1468
- <span class="cstat-no" title="statement not covered" >const grid2DAccessFunctions = [</span>
1469
- <span class="cstat-no" title="statement not covered" > // lonFirst, latOrder=SortOrder.ASCENDING, lonOrder=SortOrder.ASCENDING</span>
1470
- <span class="cstat-no" title="statement not covered" > function (data, ilat, ilon, latCount, lonCount) { return data[ilon][ilat] },</span>
1471
- <span class="cstat-no" title="statement not covered" > // lonFirst, latOrder=SortOrder.ASCENDING, lonOrder=SortOrder.DESCENDING</span>
1472
- <span class="cstat-no" title="statement not covered" > function (data, ilat, ilon, latCount, lonCount) { return data[lonCount - (ilon + 1)][ilat] },</span>
1473
- <span class="cstat-no" title="statement not covered" > // lonFirst, latOrder=SortOrder.DESCENDING, lonOrder=SortOrder.ASCENDING</span>
1474
- <span class="cstat-no" title="statement not covered" > function (data, ilat, ilon, latCount, lonCount) { return data[ilon][latCount - (ilat + 1)] },</span>
1475
- <span class="cstat-no" title="statement not covered" > // lonFirst, latOrder=SortOrder.DESCENDING, lonOrder=SortOrder.DESCENDING</span>
1476
- <span class="cstat-no" title="statement not covered" > function (data, ilat, ilon, latCount, lonCount) { return data[lonCount - (ilon + 1)][latCount - (ilat + 1)] },</span>
1477
- <span class="cstat-no" title="statement not covered" ></span>
1478
- <span class="cstat-no" title="statement not covered" > // latFirst, latOrder=SortOrder.ASCENDING, lonOrder=SortOrder.ASCENDING</span>
1479
- <span class="cstat-no" title="statement not covered" > function (data, ilat, ilon, latCount, lonCount) { return data[ilat][ilon] },</span>
1480
- <span class="cstat-no" title="statement not covered" > // latFirst, latOrder=SortOrder.ASCENDING, lonOrder=SortOrder.DESCENDING</span>
1481
- <span class="cstat-no" title="statement not covered" > function (data, ilat, ilon, latCount, lonCount) { return data[ilat][lonCount - (ilon + 1)] },</span>
1482
- <span class="cstat-no" title="statement not covered" > // latFirst, latOrder=SortOrder.DESCENDING, lonOrder=SortOrder.ASCENDING</span>
1483
- <span class="cstat-no" title="statement not covered" > function (data, ilat, ilon, latCount, lonCount) { return data[latCount - (ilat + 1)][ilon] },</span>
1484
- <span class="cstat-no" title="statement not covered" > // latFirst, latOrder=SortOrder.DESCENDING, lonOrder=SortOrder.DESCENDING</span>
1485
- <span class="cstat-no" title="statement not covered" > function (data, ilat, ilon, latCount, lonCount) { return data[latCount - (ilat + 1)][lonCount - (ilon + 1)] }</span>
1486
- <span class="cstat-no" title="statement not covered" >]</span>
1487
- <span class="cstat-no" title="statement not covered" ></span>
1488
- <span class="cstat-no" title="statement not covered" >export class Grid2D extends BaseGrid {</span>
1489
- <span class="cstat-no" title="statement not covered" > constructor (sourceKey, bbox, dimensions, data, latFirst, latSortOrder, lonSortOrder, nodata = undefined, converter = null) {</span>
1490
- <span class="cstat-no" title="statement not covered" > super(sourceKey, bbox, dimensions, nodata)</span>
1491
- <span class="cstat-no" title="statement not covered" > this.data = data</span>
1492
- <span class="cstat-no" title="statement not covered" ></span>
1493
- <span class="cstat-no" title="statement not covered" > const index = lonSortOrder + (latSortOrder * 2) + ((latFirst ? 1 : 0) * 4)</span>
1494
- <span class="cstat-no" title="statement not covered" > this.getByIndex = grid2DAccessFunctions[index]</span>
1495
- <span class="cstat-no" title="statement not covered" ></span>
1496
- <span class="cstat-no" title="statement not covered" > if (converter) {</span>
1460
+ }
1461
+ &nbsp;
1462
+ getValue (ilat, ilon) {
1463
+ return this.getByIndex(this.data, ilat, ilon, this.dimensions[0], this.dimensions[1])
1464
+ }
1465
+ }
1466
+ &nbsp;
1467
+ // these allow to query grid with ascending lat/lon
1468
+ const grid2DAccessFunctions = [
1469
+ // lonFirst, latOrder=SortOrder.ASCENDING, lonOrder=SortOrder.ASCENDING
1470
+ <span class="fstat-no" title="function not covered" > function (data, ilat, ilon, latCount, lonCount) { return data[ilon][ilat] },</span>
1471
+ // lonFirst, latOrder=SortOrder.ASCENDING, lonOrder=SortOrder.DESCENDING
1472
+ <span class="fstat-no" title="function not covered" > function (data, ilat, ilon, latCount, lonCount) { return data[lonCount - (ilon + 1)][ilat] },</span>
1473
+ // lonFirst, latOrder=SortOrder.DESCENDING, lonOrder=SortOrder.ASCENDING
1474
+ <span class="fstat-no" title="function not covered" > function (data, ilat, ilon, latCount, lonCount) { return data[ilon][latCount - (ilat + 1)] },</span>
1475
+ // lonFirst, latOrder=SortOrder.DESCENDING, lonOrder=SortOrder.DESCENDING
1476
+ <span class="fstat-no" title="function not covered" > function (data, ilat, ilon, latCount, lonCount) { return data[lonCount - (ilon + 1)][latCount - (ilat + 1)] },</span>
1477
+ &nbsp;
1478
+ // latFirst, latOrder=SortOrder.ASCENDING, lonOrder=SortOrder.ASCENDING
1479
+ <span class="fstat-no" title="function not covered" > function (data, ilat, ilon, latCount, lonCount) { return data[ilat][ilon] },</span>
1480
+ // latFirst, latOrder=SortOrder.ASCENDING, lonOrder=SortOrder.DESCENDING
1481
+ <span class="fstat-no" title="function not covered" > function (data, ilat, ilon, latCount, lonCount) { return data[ilat][lonCount - (ilon + 1)] },</span>
1482
+ // latFirst, latOrder=SortOrder.DESCENDING, lonOrder=SortOrder.ASCENDING
1483
+ <span class="fstat-no" title="function not covered" > function (data, ilat, ilon, latCount, lonCount) { return data[latCount - (ilat + 1)][ilon] },</span>
1484
+ // latFirst, latOrder=SortOrder.DESCENDING, lonOrder=SortOrder.DESCENDING
1485
+ <span class="fstat-no" title="function not covered" > function (data, ilat, ilon, latCount, lonCount) { return data[latCount - (ilat + 1)][lonCount - (ilon + 1)] }</span>
1486
+ ]
1487
+ &nbsp;
1488
+ export class Grid2D extends BaseGrid {
1489
+ constructor (sourceKey, bbox, dimensions, data, latFirst, latSortOrder, lonSortOrder, nodata = undefined, converter = null) {
1490
+ super(sourceKey, bbox, dimensions, nodata)
1491
+ this.data = data
1492
+ &nbsp;
1493
+ const index = lonSortOrder + (latSortOrder * 2) + ((latFirst ? 1 <span class="branch-0 cbranch-no" title="branch not covered" >: 0)</span> * 4)
1494
+ this.getByIndex = grid2DAccessFunctions[index]
1495
+ &nbsp;
1496
+ if (converter) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
1497
1497
  <span class="cstat-no" title="statement not covered" > for (let l = 0; l &lt; data.length; ++l) {</span>
1498
1498
  <span class="cstat-no" title="statement not covered" > const line = data[l]</span>
1499
1499
  <span class="cstat-no" title="statement not covered" > for (let r = 0; r &lt; line.length; ++r) {</span>
@@ -1501,79 +1501,79 @@
1501
1501
  <span class="cstat-no" title="statement not covered" > }</span>
1502
1502
  <span class="cstat-no" title="statement not covered" > }</span>
1503
1503
  <span class="cstat-no" title="statement not covered" > }</span>
1504
- <span class="cstat-no" title="statement not covered" > }</span>
1505
- <span class="cstat-no" title="statement not covered" ></span>
1506
- <span class="cstat-no" title="statement not covered" > getValue (ilat, ilon) {</span>
1504
+ }
1505
+ &nbsp;
1506
+ <span class="fstat-no" title="function not covered" > getValue (ilat, ilon) {</span>
1507
1507
  <span class="cstat-no" title="statement not covered" > return this.getByIndex(this.data, ilat, ilon, this.dimensions[0], this.dimensions[1])</span>
1508
1508
  <span class="cstat-no" title="statement not covered" > }</span>
1509
- <span class="cstat-no" title="statement not covered" >}</span>
1510
- <span class="cstat-no" title="statement not covered" ></span>
1511
- <span class="cstat-no" title="statement not covered" >// Class to aggregate multiple grids in a single one</span>
1512
- <span class="cstat-no" title="statement not covered" >// All grids in the aggregate MUST have the same resolution</span>
1513
- <span class="cstat-no" title="statement not covered" >export class TiledGrid extends BaseGrid {</span>
1514
- <span class="cstat-no" title="statement not covered" > constructor (sourceKey, tiles, nodata = undefined) {</span>
1515
- <span class="cstat-no" title="statement not covered" > const bbox0 = tiles[0].getBBox()</span>
1516
- <span class="cstat-no" title="statement not covered" > const dim0 = tiles[0].getDimensions()</span>
1517
- <span class="cstat-no" title="statement not covered" > const res0 = tiles[0].getResolution()</span>
1518
- <span class="cstat-no" title="statement not covered" > super(sourceKey, bbox0, dim0, nodata)</span>
1519
- <span class="cstat-no" title="statement not covered" ></span>
1520
- <span class="cstat-no" title="statement not covered" > this.dimensions = [0, 0]</span>
1521
- <span class="cstat-no" title="statement not covered" > this.bbox = [bbox0[0], bbox0[1], bbox0[2], bbox0[3]]</span>
1522
- <span class="cstat-no" title="statement not covered" > this.resolution = [res0[0], res0[1]]</span>
1523
- <span class="cstat-no" title="statement not covered" ></span>
1524
- <span class="cstat-no" title="statement not covered" > for (const tile of tiles) {</span>
1525
- <span class="cstat-no" title="statement not covered" > // make sure resolution match between tiles</span>
1526
- <span class="cstat-no" title="statement not covered" > const res = tile.getResolution()</span>
1527
- <span class="cstat-no" title="statement not covered" > if (res[0] !== res0[0] || res[1] !== res0[1]) {</span>
1509
+ }
1510
+ &nbsp;
1511
+ // Class to aggregate multiple grids in a single one
1512
+ // All grids in the aggregate MUST have the same resolution
1513
+ export class TiledGrid extends BaseGrid {
1514
+ constructor (sourceKey, tiles, nodata = undefined) {
1515
+ const bbox0 = tiles[0].getBBox()
1516
+ const dim0 = tiles[0].getDimensions()
1517
+ const res0 = tiles[0].getResolution()
1518
+ super(sourceKey, bbox0, dim0, nodata)
1519
+ &nbsp;
1520
+ this.dimensions = [0, 0]
1521
+ this.bbox = [bbox0[0], bbox0[1], bbox0[2], bbox0[3]]
1522
+ this.resolution = [res0[0], res0[1]]
1523
+ &nbsp;
1524
+ for (const tile of tiles) {
1525
+ // make sure resolution match between tiles
1526
+ const res = tile.getResolution()
1527
+ if (res[0] !== res0[0] || res[1] !== res0[1]) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
1528
1528
  <span class="cstat-no" title="statement not covered" > throw new Error('Resolution does not match between tiles')</span>
1529
1529
  <span class="cstat-no" title="statement not covered" > }</span>
1530
- <span class="cstat-no" title="statement not covered" ></span>
1531
- <span class="cstat-no" title="statement not covered" > // update grid bbox and make sure it is contiguous</span>
1532
- <span class="cstat-no" title="statement not covered" > const bbox = tile.getBBox()</span>
1533
- <span class="cstat-no" title="statement not covered" > this.bbox[0] = Math.min(this.bbox[0], bbox[0])</span>
1534
- <span class="cstat-no" title="statement not covered" > this.bbox[1] = Math.min(this.bbox[1], bbox[1])</span>
1535
- <span class="cstat-no" title="statement not covered" > this.bbox[2] = Math.max(this.bbox[2], bbox[2])</span>
1536
- <span class="cstat-no" title="statement not covered" > this.bbox[3] = Math.max(this.bbox[3], bbox[3])</span>
1537
- <span class="cstat-no" title="statement not covered" > }</span>
1538
- <span class="cstat-no" title="statement not covered" ></span>
1539
- <span class="cstat-no" title="statement not covered" > this.dimensions[0] = 1 + Math.trunc((this.bbox[2] - this.bbox[0]) / this.resolution[0])</span>
1540
- <span class="cstat-no" title="statement not covered" > this.dimensions[1] = 1 + Math.trunc((this.bbox[3] - this.bbox[1]) / this.resolution[1])</span>
1541
- <span class="cstat-no" title="statement not covered" ></span>
1542
- <span class="cstat-no" title="statement not covered" > this.tiles = []</span>
1543
- <span class="cstat-no" title="statement not covered" ></span>
1544
- <span class="cstat-no" title="statement not covered" > for (const tile of tiles) {</span>
1545
- <span class="cstat-no" title="statement not covered" > const bbox = tile.getBBox()</span>
1546
- <span class="cstat-no" title="statement not covered" > const meta = {</span>
1547
- <span class="cstat-no" title="statement not covered" > tile,</span>
1548
- <span class="cstat-no" title="statement not covered" > iLatMin: Math.floor((bbox[0] - this.bbox[0]) / this.resolution[0]),</span>
1549
- <span class="cstat-no" title="statement not covered" > iLatMax: Math.floor((bbox[2] - this.bbox[0]) / this.resolution[0]),</span>
1550
- <span class="cstat-no" title="statement not covered" > iLonMin: Math.floor((bbox[1] - this.bbox[1]) / this.resolution[1]),</span>
1551
- <span class="cstat-no" title="statement not covered" > iLonMax: Math.floor((bbox[3] - this.bbox[1]) / this.resolution[1])</span>
1552
- <span class="cstat-no" title="statement not covered" > }</span>
1553
- <span class="cstat-no" title="statement not covered" ></span>
1554
- <span class="cstat-no" title="statement not covered" > this.tiles.push(meta)</span>
1555
- <span class="cstat-no" title="statement not covered" > }</span>
1556
- <span class="cstat-no" title="statement not covered" > }</span>
1557
- <span class="cstat-no" title="statement not covered" ></span>
1558
- <span class="cstat-no" title="statement not covered" > getValue (ilat, ilon) {</span>
1559
- <span class="cstat-no" title="statement not covered" > // find which tile holds our data</span>
1560
- <span class="cstat-no" title="statement not covered" > let tile = null</span>
1561
- <span class="cstat-no" title="statement not covered" > for (const t of this.tiles) {</span>
1562
- <span class="cstat-no" title="statement not covered" > if (ilat &lt; t.iLatMin || ilat &gt; t.iLatMax || ilon &lt; t.iLonMin || ilon &gt; t.iLonMax) { continue }</span>
1563
- <span class="cstat-no" title="statement not covered" > tile = t</span>
1564
- <span class="cstat-no" title="statement not covered" > break</span>
1565
- <span class="cstat-no" title="statement not covered" > }</span>
1566
- <span class="cstat-no" title="statement not covered" ></span>
1567
- <span class="cstat-no" title="statement not covered" > if (!tile) {</span>
1530
+ &nbsp;
1531
+ // update grid bbox and make sure it is contiguous
1532
+ const bbox = tile.getBBox()
1533
+ this.bbox[0] = Math.min(this.bbox[0], bbox[0])
1534
+ this.bbox[1] = Math.min(this.bbox[1], bbox[1])
1535
+ this.bbox[2] = Math.max(this.bbox[2], bbox[2])
1536
+ this.bbox[3] = Math.max(this.bbox[3], bbox[3])
1537
+ }
1538
+ &nbsp;
1539
+ this.dimensions[0] = 1 + Math.trunc((this.bbox[2] - this.bbox[0]) / this.resolution[0])
1540
+ this.dimensions[1] = 1 + Math.trunc((this.bbox[3] - this.bbox[1]) / this.resolution[1])
1541
+ &nbsp;
1542
+ this.tiles = []
1543
+ &nbsp;
1544
+ for (const tile of tiles) {
1545
+ const bbox = tile.getBBox()
1546
+ const meta = {
1547
+ tile,
1548
+ iLatMin: Math.floor((bbox[0] - this.bbox[0]) / this.resolution[0]),
1549
+ iLatMax: Math.floor((bbox[2] - this.bbox[0]) / this.resolution[0]),
1550
+ iLonMin: Math.floor((bbox[1] - this.bbox[1]) / this.resolution[1]),
1551
+ iLonMax: Math.floor((bbox[3] - this.bbox[1]) / this.resolution[1])
1552
+ }
1553
+ &nbsp;
1554
+ this.tiles.push(meta)
1555
+ }
1556
+ }
1557
+ &nbsp;
1558
+ getValue (ilat, ilon) {
1559
+ // find which tile holds our data
1560
+ let tile = null
1561
+ for (const t of this.tiles) {
1562
+ if (ilat &lt; t.iLatMin || ilat &gt; t.iLatMax || ilon &lt; t.iLonMin || ilon &gt; t.iLonMax) { continue }
1563
+ tile = t
1564
+ break
1565
+ }
1566
+ &nbsp;
1567
+ if (!tile) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
1568
1568
  <span class="cstat-no" title="statement not covered" > return 0</span>
1569
1569
  <span class="cstat-no" title="statement not covered" > }</span>
1570
- <span class="cstat-no" title="statement not covered" ></span>
1571
- <span class="cstat-no" title="statement not covered" > return tile.tile.getValue(ilat - tile.iLatMin, ilon - tile.iLonMin)</span>
1572
- <span class="cstat-no" title="statement not covered" > }</span>
1573
- <span class="cstat-no" title="statement not covered" >}</span>
1574
- <span class="cstat-no" title="statement not covered" ></span>
1575
- <span class="cstat-no" title="statement not covered" >export class SubGrid extends BaseGrid {</span>
1576
- <span class="cstat-no" title="statement not covered" > constructor (sourceKey, grid, subBbox) {</span>
1570
+ &nbsp;
1571
+ return tile.tile.getValue(ilat - tile.iLatMin, ilon - tile.iLonMin)
1572
+ }
1573
+ }
1574
+ &nbsp;
1575
+ export class SubGrid extends BaseGrid {
1576
+ <span class="fstat-no" title="function not covered" > constructor (sourceKey, grid, subBbox) {</span>
1577
1577
  <span class="cstat-no" title="statement not covered" > const [iminlat, iminlon, imaxlat, imaxlon] = grid.getBestFit(subBbox)</span>
1578
1578
  <span class="cstat-no" title="statement not covered" ></span>
1579
1579
  <span class="cstat-no" title="statement not covered" > const adjustedDims = [1 + imaxlat - iminlat, 1 + imaxlon - iminlon]</span>
@@ -1585,11 +1585,11 @@
1585
1585
  <span class="cstat-no" title="statement not covered" > this.lonOffset = iminlon</span>
1586
1586
  <span class="cstat-no" title="statement not covered" > this.implGrid = grid</span>
1587
1587
  <span class="cstat-no" title="statement not covered" > }</span>
1588
- <span class="cstat-no" title="statement not covered" ></span>
1589
- <span class="cstat-no" title="statement not covered" > getValue (ilat, ilon) {</span>
1588
+ &nbsp;
1589
+ <span class="fstat-no" title="function not covered" > getValue (ilat, ilon) {</span>
1590
1590
  <span class="cstat-no" title="statement not covered" > return this.implGrid.getValue(ilat + this.latOffset, ilon + this.lonOffset)</span>
1591
1591
  <span class="cstat-no" title="statement not covered" > }</span>
1592
- <span class="cstat-no" title="statement not covered" >}</span>
1592
+ }
1593
1593
  &nbsp;</pre></td></tr></table></pre>
1594
1594
 
1595
1595
  <div class='push'></div><!-- for sticky footer -->
@@ -1597,7 +1597,7 @@
1597
1597
  <div class='footer quiet pad2 space-top1 center small'>
1598
1598
  Code coverage generated by
1599
1599
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
1600
- at 2025-02-18T09:52:45.637Z
1600
+ at 2025-07-24T10:00:20.508Z
1601
1601
  </div>
1602
1602
  <script src="../../prettify.js"></script>
1603
1603
  <script>