ngx-hana-nameserver-history-viewer 1.1.1 → 1.1.9-1.beta

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 (242) hide show
  1. package/README.md +7 -6
  2. package/esm2020/ngx-hana-nameserver-history-viewer.mjs +5 -0
  3. package/esm2020/public-api.mjs +2 -0
  4. package/esm2020/src/nameserver-history-viewer/components/alert/alert.component.mjs +68 -0
  5. package/esm2020/src/nameserver-history-viewer/components/alert/alert.module.mjs +22 -0
  6. package/esm2020/src/nameserver-history-viewer/components/alert/index.mjs +3 -0
  7. package/esm2020/src/nameserver-history-viewer/components/file-drop-input/file-drop-input.component.mjs +112 -0
  8. package/esm2020/src/nameserver-history-viewer/components/file-drop-input/index.mjs +2 -0
  9. package/esm2020/src/nameserver-history-viewer/components/index.mjs +9 -0
  10. package/esm2020/src/nameserver-history-viewer/components/instruction/index.mjs +2 -0
  11. package/esm2020/src/nameserver-history-viewer/components/instruction/instruction.component.mjs +42 -0
  12. package/esm2020/src/nameserver-history-viewer/components/nameserver-history.component.mjs +550 -0
  13. package/esm2020/src/nameserver-history-viewer/components/port-selector/index.mjs +2 -0
  14. package/esm2020/src/nameserver-history-viewer/components/port-selector/port-selector.component.mjs +69 -0
  15. package/esm2020/src/nameserver-history-viewer/components/port-selector/port-selector.service.mjs +41 -0
  16. package/esm2020/src/nameserver-history-viewer/components/progress-bar/index.mjs +2 -0
  17. package/esm2020/src/nameserver-history-viewer/components/progress-bar/progress-bar.component.mjs +40 -0
  18. package/esm2020/src/nameserver-history-viewer/components/time-range-selector/index.mjs +2 -0
  19. package/esm2020/src/nameserver-history-viewer/components/time-range-selector/time-range-selector.component.mjs +70 -0
  20. package/esm2020/src/nameserver-history-viewer/components/timezone-selector/index.mjs +2 -0
  21. package/esm2020/src/nameserver-history-viewer/components/timezone-selector/timezone-selector.component.mjs +90 -0
  22. package/esm2020/src/nameserver-history-viewer/components/timezone-selector/timezone-selector.service.mjs +49 -0
  23. package/esm2020/src/nameserver-history-viewer/index.mjs +3 -0
  24. package/esm2020/src/nameserver-history-viewer/nameserver-history.module.mjs +63 -0
  25. package/esm2020/src/nameserver-history-viewer/services/chart.service.mjs +323 -0
  26. package/esm2020/src/nameserver-history-viewer/services/file.service.mjs +390 -0
  27. package/esm2020/src/nameserver-history-viewer/services/index.mjs +4 -0
  28. package/esm2020/src/nameserver-history-viewer/services/ui.service.mjs +557 -0
  29. package/esm2020/src/nameserver-history-viewer/types/abort.types.mjs +6 -0
  30. package/esm2020/src/nameserver-history-viewer/types/alert.types.mjs +8 -0
  31. package/esm2020/src/nameserver-history-viewer/types/chart-content-data-item.types.mjs +2 -0
  32. package/esm2020/src/nameserver-history-viewer/types/chart-content-data.types.mjs +2 -0
  33. package/esm2020/src/nameserver-history-viewer/types/chart-content-header.types.mjs +2 -0
  34. package/esm2020/src/nameserver-history-viewer/types/chart-content-time.types.mjs +2 -0
  35. package/esm2020/src/nameserver-history-viewer/types/chart-content.types.mjs +2 -0
  36. package/esm2020/src/nameserver-history-viewer/types/color-rgba.types.mjs +2 -0
  37. package/esm2020/src/nameserver-history-viewer/types/html-element.type.mjs +9 -0
  38. package/esm2020/src/nameserver-history-viewer/types/index.mjs +28 -0
  39. package/esm2020/src/nameserver-history-viewer/types/item.types.mjs +14 -0
  40. package/esm2020/src/nameserver-history-viewer/types/legend-color.types.mjs +2 -0
  41. package/esm2020/src/nameserver-history-viewer/types/load-history-info-backup.types.mjs +2 -0
  42. package/esm2020/src/nameserver-history-viewer/types/load-history-info-columnstore.types.mjs +2 -0
  43. package/esm2020/src/nameserver-history-viewer/types/load-history-info-host.types.mjs +2 -0
  44. package/esm2020/src/nameserver-history-viewer/types/load-history-info-item.types.mjs +2 -0
  45. package/esm2020/src/nameserver-history-viewer/types/load-history-info-persistence.types.mjs +2 -0
  46. package/esm2020/src/nameserver-history-viewer/types/load-history-info-rowstore.types.mjs +2 -0
  47. package/esm2020/src/nameserver-history-viewer/types/load-history-info-server.types.mjs +2 -0
  48. package/esm2020/src/nameserver-history-viewer/types/load-history-info-session-admission-control.types.mjs +2 -0
  49. package/esm2020/src/nameserver-history-viewer/types/load-history-info-sql.types.mjs +2 -0
  50. package/esm2020/src/nameserver-history-viewer/types/load-history-info-sync-primitives.types.mjs +2 -0
  51. package/esm2020/src/nameserver-history-viewer/types/load-history-info-threads.types.mjs +2 -0
  52. package/esm2020/src/nameserver-history-viewer/types/load-history-info.types.mjs +2 -0
  53. package/esm2020/src/nameserver-history-viewer/types/port.types.mjs +2 -0
  54. package/esm2020/src/nameserver-history-viewer/types/scale-group.types.mjs +17 -0
  55. package/esm2020/src/nameserver-history-viewer/types/unit-category.types.mjs +10 -0
  56. package/esm2020/src/nameserver-history-viewer/types/unit.types.mjs +14 -0
  57. package/esm2020/src/nameserver-history-viewer/utils/chart-util.mjs +25 -0
  58. package/esm2020/src/nameserver-history-viewer/utils/chartjs-downsample/chartjs_ext.mjs +2 -0
  59. package/esm2020/src/nameserver-history-viewer/utils/chartjs-downsample/data_culling.mjs +57 -0
  60. package/esm2020/src/nameserver-history-viewer/utils/chartjs-downsample/data_mipmap.mjs +139 -0
  61. package/esm2020/src/nameserver-history-viewer/utils/chartjs-downsample/index.mjs +41 -0
  62. package/esm2020/src/nameserver-history-viewer/utils/chartjs-downsample/lttb_data_mipmap.mjs +106 -0
  63. package/esm2020/src/nameserver-history-viewer/utils/chartjs-downsample/responsive_downsample_plugin.mjs +168 -0
  64. package/esm2020/src/nameserver-history-viewer/utils/chartjs-downsample/utils.mjs +114 -0
  65. package/esm2020/src/nameserver-history-viewer/utils/chartjs-zoom/chart.zoom.mjs +527 -0
  66. package/esm2020/src/nameserver-history-viewer/utils/chartjs-zoom/index.mjs +2 -0
  67. package/esm2020/src/nameserver-history-viewer/utils/file-util.mjs +154 -0
  68. package/esm2020/src/nameserver-history-viewer/utils/index.mjs +5 -0
  69. package/esm2020/src/nameserver-history-viewer/utils/time-util.mjs +101 -0
  70. package/esm2020/src/nameserver-history-viewer/utils/ui-util.mjs +162 -0
  71. package/fesm2015/ngx-hana-nameserver-history-viewer.mjs +4081 -0
  72. package/fesm2015/ngx-hana-nameserver-history-viewer.mjs.map +1 -0
  73. package/fesm2020/ngx-hana-nameserver-history-viewer.mjs +4081 -0
  74. package/fesm2020/ngx-hana-nameserver-history-viewer.mjs.map +1 -0
  75. package/ngx-hana-nameserver-history-viewer.d.ts +1 -1
  76. package/package.json +37 -61
  77. package/src/nameserver-history-viewer/components/alert/alert.component.d.ts +4 -1
  78. package/src/nameserver-history-viewer/components/alert/alert.module.d.ts +6 -0
  79. package/src/nameserver-history-viewer/components/file-drop-input/file-drop-input.component.d.ts +3 -0
  80. package/src/nameserver-history-viewer/components/instruction/instruction.component.d.ts +3 -0
  81. package/src/nameserver-history-viewer/components/nameserver-history.component.d.ts +33 -14
  82. package/src/nameserver-history-viewer/components/port-selector/port-selector.component.d.ts +4 -1
  83. package/src/nameserver-history-viewer/components/port-selector/port-selector.service.d.ts +3 -0
  84. package/src/nameserver-history-viewer/components/progress-bar/progress-bar.component.d.ts +3 -0
  85. package/src/nameserver-history-viewer/components/time-range-selector/time-range-selector.component.d.ts +3 -0
  86. package/src/nameserver-history-viewer/components/timezone-selector/timezone-selector.component.d.ts +3 -0
  87. package/src/nameserver-history-viewer/components/timezone-selector/timezone-selector.service.d.ts +3 -0
  88. package/src/nameserver-history-viewer/index.d.ts +1 -0
  89. package/src/nameserver-history-viewer/nameserver-history.module.d.ts +17 -0
  90. package/src/nameserver-history-viewer/services/chart.service.d.ts +4 -1
  91. package/src/nameserver-history-viewer/services/file.service.d.ts +4 -0
  92. package/src/nameserver-history-viewer/services/ui.service.d.ts +5 -2
  93. package/src/nameserver-history-viewer/types/load-history-info-session-admission-control.types.d.ts +3 -0
  94. package/src/nameserver-history-viewer/utils/chartjs-downsample/lttb_data_mipmap.d.ts +1 -1
  95. package/src/nameserver-history-viewer/utils/file-util.d.ts +11 -0
  96. package/bundles/ngx-hana-nameserver-history-viewer.umd.js +0 -6298
  97. package/bundles/ngx-hana-nameserver-history-viewer.umd.js.map +0 -1
  98. package/bundles/ngx-hana-nameserver-history-viewer.umd.min.js +0 -2
  99. package/bundles/ngx-hana-nameserver-history-viewer.umd.min.js.map +0 -1
  100. package/esm2015/ngx-hana-nameserver-history-viewer.js +0 -10
  101. package/esm2015/public-api.js +0 -6
  102. package/esm2015/src/nameserver-history-viewer/components/alert/alert.component.js +0 -108
  103. package/esm2015/src/nameserver-history-viewer/components/alert/alert.module.js +0 -21
  104. package/esm2015/src/nameserver-history-viewer/components/alert/index.js +0 -7
  105. package/esm2015/src/nameserver-history-viewer/components/file-drop-input/file-drop-input.component.js +0 -141
  106. package/esm2015/src/nameserver-history-viewer/components/file-drop-input/index.js +0 -6
  107. package/esm2015/src/nameserver-history-viewer/components/index.js +0 -13
  108. package/esm2015/src/nameserver-history-viewer/components/instruction/index.js +0 -6
  109. package/esm2015/src/nameserver-history-viewer/components/instruction/instruction.component.js +0 -62
  110. package/esm2015/src/nameserver-history-viewer/components/nameserver-history.component.js +0 -742
  111. package/esm2015/src/nameserver-history-viewer/components/port-selector/index.js +0 -6
  112. package/esm2015/src/nameserver-history-viewer/components/port-selector/port-selector.component.js +0 -93
  113. package/esm2015/src/nameserver-history-viewer/components/port-selector/port-selector.service.js +0 -56
  114. package/esm2015/src/nameserver-history-viewer/components/progress-bar/index.js +0 -6
  115. package/esm2015/src/nameserver-history-viewer/components/progress-bar/progress-bar.component.js +0 -35
  116. package/esm2015/src/nameserver-history-viewer/components/time-range-selector/index.js +0 -6
  117. package/esm2015/src/nameserver-history-viewer/components/time-range-selector/time-range-selector.component.js +0 -68
  118. package/esm2015/src/nameserver-history-viewer/components/timezone-selector/index.js +0 -6
  119. package/esm2015/src/nameserver-history-viewer/components/timezone-selector/timezone-selector.component.js +0 -135
  120. package/esm2015/src/nameserver-history-viewer/components/timezone-selector/timezone-selector.service.js +0 -72
  121. package/esm2015/src/nameserver-history-viewer/index.js +0 -6
  122. package/esm2015/src/nameserver-history-viewer/nameserver-history.module.js +0 -42
  123. package/esm2015/src/nameserver-history-viewer/services/chart.service.js +0 -423
  124. package/esm2015/src/nameserver-history-viewer/services/file.service.js +0 -447
  125. package/esm2015/src/nameserver-history-viewer/services/index.js +0 -8
  126. package/esm2015/src/nameserver-history-viewer/services/ui.service.js +0 -817
  127. package/esm2015/src/nameserver-history-viewer/types/abort.types.js +0 -13
  128. package/esm2015/src/nameserver-history-viewer/types/alert.types.js +0 -13
  129. package/esm2015/src/nameserver-history-viewer/types/chart-content-data-item.types.js +0 -15
  130. package/esm2015/src/nameserver-history-viewer/types/chart-content-data.types.js +0 -9
  131. package/esm2015/src/nameserver-history-viewer/types/chart-content-header.types.js +0 -15
  132. package/esm2015/src/nameserver-history-viewer/types/chart-content-time.types.js +0 -9
  133. package/esm2015/src/nameserver-history-viewer/types/chart-content.types.js +0 -21
  134. package/esm2015/src/nameserver-history-viewer/types/color-rgba.types.js +0 -19
  135. package/esm2015/src/nameserver-history-viewer/types/html-element.type.js +0 -19
  136. package/esm2015/src/nameserver-history-viewer/types/index.js +0 -32
  137. package/esm2015/src/nameserver-history-viewer/types/item.types.js +0 -19
  138. package/esm2015/src/nameserver-history-viewer/types/legend-color.types.js +0 -9
  139. package/esm2015/src/nameserver-history-viewer/types/load-history-info-backup.types.js +0 -19
  140. package/esm2015/src/nameserver-history-viewer/types/load-history-info-columnstore.types.js +0 -19
  141. package/esm2015/src/nameserver-history-viewer/types/load-history-info-host.types.js +0 -35
  142. package/esm2015/src/nameserver-history-viewer/types/load-history-info-item.types.js +0 -31
  143. package/esm2015/src/nameserver-history-viewer/types/load-history-info-persistence.types.js +0 -27
  144. package/esm2015/src/nameserver-history-viewer/types/load-history-info-rowstore.types.js +0 -15
  145. package/esm2015/src/nameserver-history-viewer/types/load-history-info-server.types.js +0 -25
  146. package/esm2015/src/nameserver-history-viewer/types/load-history-info-session-admission-control.types.js +0 -19
  147. package/esm2015/src/nameserver-history-viewer/types/load-history-info-sql.types.js +0 -37
  148. package/esm2015/src/nameserver-history-viewer/types/load-history-info-sync-primitives.types.js +0 -15
  149. package/esm2015/src/nameserver-history-viewer/types/load-history-info-threads.types.js +0 -23
  150. package/esm2015/src/nameserver-history-viewer/types/load-history-info.types.js +0 -31
  151. package/esm2015/src/nameserver-history-viewer/types/port.types.js +0 -17
  152. package/esm2015/src/nameserver-history-viewer/types/scale-group.types.js +0 -35
  153. package/esm2015/src/nameserver-history-viewer/types/unit-category.types.js +0 -21
  154. package/esm2015/src/nameserver-history-viewer/types/unit.types.js +0 -19
  155. package/esm2015/src/nameserver-history-viewer/utils/chart-util.js +0 -38
  156. package/esm2015/src/nameserver-history-viewer/utils/chartjs-downsample/chartjs_ext.js +0 -100
  157. package/esm2015/src/nameserver-history-viewer/utils/chartjs-downsample/data_culling.js +0 -88
  158. package/esm2015/src/nameserver-history-viewer/utils/chartjs-downsample/data_mipmap.js +0 -213
  159. package/esm2015/src/nameserver-history-viewer/utils/chartjs-downsample/index.js +0 -46
  160. package/esm2015/src/nameserver-history-viewer/utils/chartjs-downsample/lttb_data_mipmap.js +0 -158
  161. package/esm2015/src/nameserver-history-viewer/utils/chartjs-downsample/responsive_downsample_plugin.js +0 -295
  162. package/esm2015/src/nameserver-history-viewer/utils/chartjs-downsample/utils.js +0 -130
  163. package/esm2015/src/nameserver-history-viewer/utils/chartjs-zoom/chart.zoom.js +0 -733
  164. package/esm2015/src/nameserver-history-viewer/utils/chartjs-zoom/index.js +0 -6
  165. package/esm2015/src/nameserver-history-viewer/utils/file-util.js +0 -149
  166. package/esm2015/src/nameserver-history-viewer/utils/index.js +0 -9
  167. package/esm2015/src/nameserver-history-viewer/utils/time-util.js +0 -135
  168. package/esm2015/src/nameserver-history-viewer/utils/ui-util.js +0 -203
  169. package/esm5/ngx-hana-nameserver-history-viewer.js +0 -10
  170. package/esm5/public-api.js +0 -6
  171. package/esm5/src/nameserver-history-viewer/components/alert/alert.component.js +0 -140
  172. package/esm5/src/nameserver-history-viewer/components/alert/alert.module.js +0 -25
  173. package/esm5/src/nameserver-history-viewer/components/alert/index.js +0 -7
  174. package/esm5/src/nameserver-history-viewer/components/file-drop-input/file-drop-input.component.js +0 -155
  175. package/esm5/src/nameserver-history-viewer/components/file-drop-input/index.js +0 -6
  176. package/esm5/src/nameserver-history-viewer/components/index.js +0 -13
  177. package/esm5/src/nameserver-history-viewer/components/instruction/index.js +0 -6
  178. package/esm5/src/nameserver-history-viewer/components/instruction/instruction.component.js +0 -67
  179. package/esm5/src/nameserver-history-viewer/components/nameserver-history.component.js +0 -990
  180. package/esm5/src/nameserver-history-viewer/components/port-selector/index.js +0 -6
  181. package/esm5/src/nameserver-history-viewer/components/port-selector/port-selector.component.js +0 -93
  182. package/esm5/src/nameserver-history-viewer/components/port-selector/port-selector.service.js +0 -81
  183. package/esm5/src/nameserver-history-viewer/components/progress-bar/index.js +0 -6
  184. package/esm5/src/nameserver-history-viewer/components/progress-bar/progress-bar.component.js +0 -26
  185. package/esm5/src/nameserver-history-viewer/components/time-range-selector/index.js +0 -6
  186. package/esm5/src/nameserver-history-viewer/components/time-range-selector/time-range-selector.component.js +0 -58
  187. package/esm5/src/nameserver-history-viewer/components/timezone-selector/index.js +0 -6
  188. package/esm5/src/nameserver-history-viewer/components/timezone-selector/timezone-selector.component.js +0 -164
  189. package/esm5/src/nameserver-history-viewer/components/timezone-selector/timezone-selector.service.js +0 -102
  190. package/esm5/src/nameserver-history-viewer/index.js +0 -6
  191. package/esm5/src/nameserver-history-viewer/nameserver-history.module.js +0 -46
  192. package/esm5/src/nameserver-history-viewer/services/chart.service.js +0 -578
  193. package/esm5/src/nameserver-history-viewer/services/file.service.js +0 -566
  194. package/esm5/src/nameserver-history-viewer/services/index.js +0 -8
  195. package/esm5/src/nameserver-history-viewer/services/ui.service.js +0 -1036
  196. package/esm5/src/nameserver-history-viewer/types/abort.types.js +0 -13
  197. package/esm5/src/nameserver-history-viewer/types/alert.types.js +0 -13
  198. package/esm5/src/nameserver-history-viewer/types/chart-content-data-item.types.js +0 -15
  199. package/esm5/src/nameserver-history-viewer/types/chart-content-data.types.js +0 -9
  200. package/esm5/src/nameserver-history-viewer/types/chart-content-header.types.js +0 -15
  201. package/esm5/src/nameserver-history-viewer/types/chart-content-time.types.js +0 -9
  202. package/esm5/src/nameserver-history-viewer/types/chart-content.types.js +0 -21
  203. package/esm5/src/nameserver-history-viewer/types/color-rgba.types.js +0 -19
  204. package/esm5/src/nameserver-history-viewer/types/html-element.type.js +0 -19
  205. package/esm5/src/nameserver-history-viewer/types/index.js +0 -32
  206. package/esm5/src/nameserver-history-viewer/types/item.types.js +0 -19
  207. package/esm5/src/nameserver-history-viewer/types/legend-color.types.js +0 -9
  208. package/esm5/src/nameserver-history-viewer/types/load-history-info-backup.types.js +0 -19
  209. package/esm5/src/nameserver-history-viewer/types/load-history-info-columnstore.types.js +0 -19
  210. package/esm5/src/nameserver-history-viewer/types/load-history-info-host.types.js +0 -35
  211. package/esm5/src/nameserver-history-viewer/types/load-history-info-item.types.js +0 -31
  212. package/esm5/src/nameserver-history-viewer/types/load-history-info-persistence.types.js +0 -27
  213. package/esm5/src/nameserver-history-viewer/types/load-history-info-rowstore.types.js +0 -15
  214. package/esm5/src/nameserver-history-viewer/types/load-history-info-server.types.js +0 -25
  215. package/esm5/src/nameserver-history-viewer/types/load-history-info-session-admission-control.types.js +0 -19
  216. package/esm5/src/nameserver-history-viewer/types/load-history-info-sql.types.js +0 -37
  217. package/esm5/src/nameserver-history-viewer/types/load-history-info-sync-primitives.types.js +0 -15
  218. package/esm5/src/nameserver-history-viewer/types/load-history-info-threads.types.js +0 -23
  219. package/esm5/src/nameserver-history-viewer/types/load-history-info.types.js +0 -31
  220. package/esm5/src/nameserver-history-viewer/types/port.types.js +0 -17
  221. package/esm5/src/nameserver-history-viewer/types/scale-group.types.js +0 -35
  222. package/esm5/src/nameserver-history-viewer/types/unit-category.types.js +0 -21
  223. package/esm5/src/nameserver-history-viewer/types/unit.types.js +0 -19
  224. package/esm5/src/nameserver-history-viewer/utils/chart-util.js +0 -39
  225. package/esm5/src/nameserver-history-viewer/utils/chartjs-downsample/chartjs_ext.js +0 -100
  226. package/esm5/src/nameserver-history-viewer/utils/chartjs-downsample/data_culling.js +0 -88
  227. package/esm5/src/nameserver-history-viewer/utils/chartjs-downsample/data_mipmap.js +0 -307
  228. package/esm5/src/nameserver-history-viewer/utils/chartjs-downsample/index.js +0 -46
  229. package/esm5/src/nameserver-history-viewer/utils/chartjs-downsample/lttb_data_mipmap.js +0 -232
  230. package/esm5/src/nameserver-history-viewer/utils/chartjs-downsample/responsive_downsample_plugin.js +0 -350
  231. package/esm5/src/nameserver-history-viewer/utils/chartjs-downsample/utils.js +0 -142
  232. package/esm5/src/nameserver-history-viewer/utils/chartjs-zoom/chart.zoom.js +0 -733
  233. package/esm5/src/nameserver-history-viewer/utils/chartjs-zoom/index.js +0 -6
  234. package/esm5/src/nameserver-history-viewer/utils/file-util.js +0 -150
  235. package/esm5/src/nameserver-history-viewer/utils/index.js +0 -9
  236. package/esm5/src/nameserver-history-viewer/utils/time-util.js +0 -135
  237. package/esm5/src/nameserver-history-viewer/utils/ui-util.js +0 -205
  238. package/fesm2015/ngx-hana-nameserver-history-viewer.js +0 -5223
  239. package/fesm2015/ngx-hana-nameserver-history-viewer.js.map +0 -1
  240. package/fesm5/ngx-hana-nameserver-history-viewer.js +0 -6295
  241. package/fesm5/ngx-hana-nameserver-history-viewer.js.map +0 -1
  242. package/ngx-hana-nameserver-history-viewer.metadata.json +0 -1
@@ -0,0 +1,106 @@
1
+ import * as utils from './utils';
2
+ import { DataMipmap } from './data_mipmap';
3
+ /**
4
+ * A mipmap data structure that uses Largest-Triangle-Three-Buckets algorithm to downsample data
5
+ */
6
+ export class LTTBDataMipmap extends DataMipmap {
7
+ getMipMapIndexForResolution(resolution) {
8
+ if (utils.isNil(resolution)) {
9
+ return 0;
10
+ }
11
+ let index = utils.findIndexInArray(this.resolutions, (levelResolution) => levelResolution >= resolution);
12
+ if (index === -1) {
13
+ // use smallest mipmap as fallback
14
+ index = this.resolutions.length - 1;
15
+ }
16
+ return index;
17
+ }
18
+ createMipMap() {
19
+ super.createMipMap();
20
+ this.resolutions = this.mipMaps.map((level) => this.computeAverageResolution(level));
21
+ }
22
+ /**
23
+ * This method is adapted from: https://github.com/sveinn-steinarsson/flot-downsample
24
+ *
25
+ * The MIT License
26
+ * Copyright (c) 2013 by Sveinn Steinarsson
27
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
28
+ * of this software and associated documentation files (the "Software"), to deal
29
+ * in the Software without restriction, including without limitation the rights
30
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
31
+ * copies of the Software, and to permit persons to whom the Software is
32
+ * furnished to do so, subject to the following conditions:
33
+ * The above copyright notice and this permission notice shall be included in
34
+ * all copies or substantial portions of the Software.
35
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
36
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
37
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
38
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
39
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
40
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
41
+ * THE SOFTWARE.
42
+ */
43
+ downsampleToResolution(data, targetResolution, targetLength) {
44
+ const dataLength = data.length;
45
+ if (targetLength >= dataLength || targetLength === 0) {
46
+ return data; // data has target size
47
+ }
48
+ const output = [];
49
+ // bucket size, leave room for start and end data points
50
+ const bucksetSize = (dataLength - 2) / (targetLength - 2);
51
+ let a = 0; // initially a is the first point in the triangle
52
+ let maxAreaPoint;
53
+ let maxArea;
54
+ let area;
55
+ let nextA;
56
+ // always add the first point
57
+ output.push(data[a]);
58
+ for (let i = 0; i < targetLength - 2; ++i) {
59
+ // Calculate point average for next bucket (containing c)
60
+ let avgX = 0;
61
+ let avgY = 0;
62
+ let avgRangeStart = Math.floor((i + 1) * bucksetSize) + 1;
63
+ let avgRangeEnd = Math.floor((i + 2) * bucksetSize) + 1;
64
+ avgRangeEnd = avgRangeEnd < dataLength ? avgRangeEnd : dataLength;
65
+ const avgRangeLength = avgRangeEnd - avgRangeStart;
66
+ for (; avgRangeStart < avgRangeEnd; avgRangeStart++) {
67
+ avgX += this.getTime(data[avgRangeStart]);
68
+ avgY += data[avgRangeStart].y * 1;
69
+ }
70
+ avgX /= avgRangeLength;
71
+ avgY /= avgRangeLength;
72
+ // Get the range for this bucket
73
+ let rangeOffs = Math.floor((i + 0) * bucksetSize) + 1;
74
+ const rangeTo = Math.floor((i + 1) * bucksetSize) + 1;
75
+ // Point a
76
+ const pointA = data[a];
77
+ const pointAX = this.getTime(pointA);
78
+ const pointAY = pointA.y * 1;
79
+ maxArea = area = -1;
80
+ for (; rangeOffs < rangeTo; rangeOffs++) {
81
+ // Calculate triangle area over three buckets
82
+ area = Math.abs((pointAX - avgX) * (data[rangeOffs].y - pointAY) -
83
+ (pointAX - this.getTime(data[rangeOffs])) * (avgY - pointAY)) * 0.5;
84
+ if (area > maxArea) {
85
+ maxArea = area;
86
+ maxAreaPoint = data[rangeOffs];
87
+ nextA = rangeOffs; // Next a is this b
88
+ }
89
+ }
90
+ output.push(maxAreaPoint); // Pick this point from the bucket
91
+ a = nextA; // This a is the next a (chosen b)
92
+ }
93
+ output.push(data[dataLength - 1]); // Always add last
94
+ return output;
95
+ }
96
+ computeAverageResolution(data) {
97
+ let timeDistances = 0;
98
+ for (let i = 0, end = this.originalData.length - 1; i < end; ++i) {
99
+ const current = this.originalData[i];
100
+ const next = this.originalData[i + 1];
101
+ timeDistances += Math.abs(this.getTime(current) - this.getTime(next));
102
+ }
103
+ return timeDistances / (data.length - 1);
104
+ }
105
+ }
106
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibHR0Yl9kYXRhX21pcG1hcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9uYW1lc2VydmVyLWhpc3Rvcnktdmlld2VyL3V0aWxzL2NoYXJ0anMtZG93bnNhbXBsZS9sdHRiX2RhdGFfbWlwbWFwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQXlCQSxPQUFPLEtBQUssS0FBSyxNQUFNLFNBQVMsQ0FBQztBQUNqQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTNDOztHQUVHO0FBQ0gsTUFBTSxPQUFPLGNBQWUsU0FBUSxVQUFVO0lBRzFDLDJCQUEyQixDQUFDLFVBQWtCO1FBQzFDLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsRUFBRTtZQUFFLE9BQU8sQ0FBQyxDQUFDO1NBQUU7UUFFMUMsSUFBSSxLQUFLLEdBQUcsS0FBSyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxlQUFlLEVBQUUsRUFBRSxDQUFDLGVBQWUsSUFBSSxVQUFVLENBQUMsQ0FBQztRQUN6RyxJQUFJLEtBQUssS0FBSyxDQUFDLENBQUMsRUFBRTtZQUNkLGtDQUFrQztZQUNsQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1NBQ3ZDO1FBRUQsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztJQUVTLFlBQVk7UUFDbEIsS0FBSyxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ3pGLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7T0FvQkc7SUFDTyxzQkFBc0IsQ0FDNUIsSUFBa0IsRUFDbEIsZ0JBQXdCLEVB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QyxDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICogVGhpcyBwbHVnaW4gaXMgYWRhcHRlZCBmcm9tOiBodHRwczovL2dpdGh1Yi5jb20vM2RjbC9jaGFydGpzLXBsdWdpbi1yZXNwb25zaXZlLWRvd25zYW1wbGVcclxuICogZm9yIGNvbnRyb2xsaW5nIHRoZSByYWRpdXMgb2YgcG9pbnQuXHJcbiAqXHJcbiAqIE1JVCBMaWNlbnNlXHJcbiAqIENvcHlyaWdodCAoYykgMjAxOCAzRCBDb250ZW50IExvZ2lzdGljc1xyXG4gKlxyXG4gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XHJcbiAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcclxuICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xyXG4gKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXHJcbiAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xyXG4gKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxyXG4gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGxcclxuICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cclxuICpcclxuICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxyXG4gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcclxuICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXHJcbiAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcclxuICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcclxuICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEVcclxuICogU09GVFdBUkUuXHJcbiAqL1xyXG5pbXBvcnQgeyBDaGFydFBvaW50IH0gZnJvbSAnY2hhcnQuanMnO1xyXG5pbXBvcnQgKiBhcyB1dGlscyBmcm9tICcuL3V0aWxzJztcclxuaW1wb3J0IHsgRGF0YU1pcG1hcCB9IGZyb20gJy4vZGF0YV9taXBtYXAnO1xyXG5cclxuLyoqXHJcbiAqIEEgbWlwbWFwIGRhdGEgc3RydWN0dXJlIHRoYXQgdXNlcyBMYXJnZXN0LVRyaWFuZ2xlLVRocmVlLUJ1Y2tldHMgYWxnb3JpdGhtIHRvIGRvd25zYW1wbGUgZGF0YVxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIExUVEJEYXRhTWlwbWFwIGV4dGVuZHMgRGF0YU1pcG1hcCB7XHJcbiAgICBwcm90ZWN0ZWQgcmVzb2x1dGlvbnM6IG51bWJlcltdO1xyXG5cclxuICAgIGdldE1pcE1hcEluZGV4Rm9yUmVzb2x1dGlvbihyZXNvbHV0aW9uOiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgICAgIGlmICh1dGlscy5pc05pbChyZXNvbHV0aW9uKSkgeyByZXR1cm4gMDsgfVxyXG5cclxuICAgICAgICBsZXQgaW5kZXggPSB1dGlscy5maW5kSW5kZXhJbkFycmF5KHRoaXMucmVzb2x1dGlvbnMsIChsZXZlbFJlc29sdXRpb24pID0+IGxldmVsUmVzb2x1dGlvbiA+PSByZXNvbHV0aW9uKTtcclxuICAgICAgICBpZiAoaW5kZXggPT09IC0xKSB7XHJcbiAgICAgICAgICAgIC8vIHVzZSBzbWFsbGVzdCBtaXBtYXAgYXMgZmFsbGJhY2tcclxuICAgICAgICAgICAgaW5kZXggPSB0aGlzLnJlc29sdXRpb25zLmxlbmd0aCAtIDE7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gaW5kZXg7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGNyZWF0ZU1pcE1hcCgpOiB2b2lkIHtcclxuICAgICAgICBzdXBlci5jcmVhdGVNaXBNYXAoKTtcclxuICAgICAgICB0aGlzLnJlc29sdXRpb25zID0gdGhpcy5taXBNYXBzLm1hcCgobGV2ZWwpID0+IHRoaXMuY29tcHV0ZUF2ZXJhZ2VSZXNvbHV0aW9uKGxldmVsKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBhZGFwdGVkIGZyb206IGh0dHBzOi8vZ2l0aHViLmNvbS9zdmVpbm4tc3RlaW5hcnNzb24vZmxvdC1kb3duc2FtcGxlXHJcbiAgICAgKlxyXG4gICAgICogVGhlIE1JVCBMaWNlbnNlXHJcbiAgICAgKiBDb3B5cmlnaHQgKGMpIDIwMTMgYnkgU3ZlaW5uIFN0ZWluYXJzc29uXHJcbiAgICAgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XHJcbiAgICAgKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXHJcbiAgICAgKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXHJcbiAgICAgKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXHJcbiAgICAgKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcclxuICAgICAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XHJcbiAgICAgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxyXG4gICAgICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXHJcbiAgICAgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXHJcbiAgICAgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcclxuICAgICAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxyXG4gICAgICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxyXG4gICAgICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcclxuICAgICAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cclxuICAgICAqIFRIRSBTT0ZUV0FSRS5cclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIGRvd25zYW1wbGVUb1Jlc29sdXRpb24oXHJcbiAgICAgICAgZGF0YTogQ2hhcnRQb2ludFtdLFxyXG4gICAgICAgIHRhcmdldFJlc29sdXRpb246IG51bWJlcixcclxuICAgICAgICB0YXJnZXRMZW5ndGg6IG51bWJlclxyXG4gICAgKSB7XHJcbiAgICAgICAgY29uc3QgZGF0YUxlbmd0aCA9IGRhdGEubGVuZ3RoO1xyXG4gICAgICAgIGlmICh0YXJnZXRMZW5ndGggPj0gZGF0YUxlbmd0aCB8fCB0YXJnZXRMZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIGRhdGE7IC8vIGRhdGEgaGFzIHRhcmdldCBzaXplXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBvdXRwdXQ6IENoYXJ0UG9pbnRbXSA9IFtdO1xyXG5cclxuICAgICAgICAvLyBidWNrZXQgc2l6ZSwgbGVhdmUgcm9vbSBmb3Igc3RhcnQgYW5kIGVuZCBkYXRhIHBvaW50c1xyXG4gICAgICAgIGNvbnN0IGJ1Y2tzZXRTaXplID0gKGRhdGFMZW5ndGggLSAyKSAvICh0YXJnZXRMZW5ndGggLSAyKTtcclxuXHJcbiAgICAgICAgbGV0IGEgPSAwOyAgLy8gaW5pdGlhbGx5IGEgaXMgdGhlIGZpcnN0IHBvaW50IGluIHRoZSB0cmlhbmdsZVxyXG4gICAgICAgIGxldCBtYXhBcmVhUG9pbnQ6IENoYXJ0UG9pbnQ7XHJcbiAgICAgICAgbGV0IG1heEFyZWE6IG51bWJlcjtcclxuICAgICAgICBsZXQgYXJlYTogbnVtYmVyO1xyXG4gICAgICAgIGxldCBuZXh0QTogbnVtYmVyO1xyXG5cclxuICAgICAgICAvLyBhbHdheXMgYWRkIHRoZSBmaXJzdCBwb2ludFxyXG4gICAgICAgIG91dHB1dC5wdXNoKGRhdGFbYV0pO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRhcmdldExlbmd0aCAtIDI7ICsraSkge1xyXG4gICAgICAgICAgICAvLyBDYWxjdWxhdGUgcG9pbnQgYXZlcmFnZSBmb3IgbmV4dCBidWNrZXQgKGNvbnRhaW5pbmcgYylcclxuICAgICAgICAgICAgbGV0IGF2Z1ggPSAwO1xyXG4gICAgICAgICAgICBsZXQgYXZnWSA9IDA7XHJcbiAgICAgICAgICAgIGxldCBhdmdSYW5nZVN0YXJ0ID0gTWF0aC5mbG9vcigoaSArIDEpICogYnVja3NldFNpemUpICsgMTtcclxuICAgICAgICAgICAgbGV0IGF2Z1JhbmdlRW5kID0gTWF0aC5mbG9vcigoaSArIDIpICogYnVja3NldFNpemUpICsgMTtcclxuICAgICAgICAgICAgYXZnUmFuZ2VFbmQgPSBhdmdSYW5nZUVuZCA8IGRhdGFMZW5ndGggPyBhdmdSYW5nZUVuZCA6IGRhdGFMZW5ndGg7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBhdmdSYW5nZUxlbmd0aCA9IGF2Z1JhbmdlRW5kIC0gYXZnUmFuZ2VTdGFydDtcclxuXHJcbiAgICAgICAgICAgIGZvciAoOyBhdmdSYW5nZVN0YXJ0IDwgYXZnUmFuZ2VFbmQ7IGF2Z1JhbmdlU3RhcnQrKykge1xyXG4gICAgICAgICAgICAgICAgYXZnWCArPSB0aGlzLmdldFRpbWUoZGF0YVthdmdSYW5nZVN0YXJ0XSk7XHJcbiAgICAgICAgICAgICAgICBhdmdZICs9IGRhdGFbYXZnUmFuZ2VTdGFydF0ueSBhcyBudW1iZXIgKiAxO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGF2Z1ggLz0gYXZnUmFuZ2VMZW5ndGg7XHJcbiAgICAgICAgICAgIGF2Z1kgLz0gYXZnUmFuZ2VMZW5ndGg7XHJcblxyXG4gICAgICAgICAgICAvLyBHZXQgdGhlIHJhbmdlIGZvciB0aGlzIGJ1Y2tldFxyXG4gICAgICAgICAgICBsZXQgcmFuZ2VPZmZzID0gTWF0aC5mbG9vcigoaSArIDApICogYnVja3NldFNpemUpICsgMTtcclxuICAgICAgICAgICAgY29uc3QgcmFuZ2VUbyA9IE1hdGguZmxvb3IoKGkgKyAxKSAqIGJ1Y2tzZXRTaXplKSArIDE7XHJcblxyXG4gICAgICAgICAgICAvLyBQb2ludCBhXHJcbiAgICAgICAgICAgIGNvbnN0IHBvaW50QSA9IGRhdGFbYV07XHJcbiAgICAgICAgICAgIGNvbnN0IHBvaW50QVggPSB0aGlzLmdldFRpbWUocG9pbnRBKTtcclxuICAgICAgICAgICAgY29uc3QgcG9pbnRBWSA9IHBvaW50QS55IGFzIG51bWJlciAqIDE7XHJcblxyXG4gICAgICAgICAgICBtYXhBcmVhID0gYXJlYSA9IC0xO1xyXG5cclxuICAgICAgICAgICAgZm9yICg7IHJhbmdlT2ZmcyA8IHJhbmdlVG87IHJhbmdlT2ZmcysrKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBDYWxjdWxhdGUgdHJpYW5nbGUgYXJlYSBvdmVyIHRocmVlIGJ1Y2tldHNcclxuICAgICAgICAgICAgICAgIGFyZWEgPSBNYXRoLmFicygocG9pbnRBWCAtIGF2Z1gpICogKGRhdGFbcmFuZ2VPZmZzXS55IGFzIG51bWJlciAtIHBvaW50QVkpIC1cclxuICAgICAgICAgICAgICAgICAgICAocG9pbnRBWCAtIHRoaXMuZ2V0VGltZShkYXRhW3JhbmdlT2Zmc10pKSAqIChhdmdZIC0gcG9pbnRBWSlcclxuICAgICAgICAgICAgICAgICkgKiAwLjU7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGFyZWEgPiBtYXhBcmVhKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbWF4QXJlYSA9IGFyZWE7XHJcbiAgICAgICAgICAgICAgICAgICAgbWF4QXJlYVBvaW50ID0gZGF0YVtyYW5nZU9mZnNdO1xyXG4gICAgICAgICAgICAgICAgICAgIG5leHRBID0gcmFuZ2VPZmZzOyAvLyBOZXh0IGEgaXMgdGhpcyBiXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIG91dHB1dC5wdXNoKG1heEFyZWFQb2ludCk7IC8vIFBpY2sgdGhpcyBwb2ludCBmcm9tIHRoZSBidWNrZXRcclxuICAgICAgICAgICAgYSA9IG5leHRBOyAvLyBUaGlzIGEgaXMgdGhlIG5leHQgYSAoY2hvc2VuIGIpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBvdXRwdXQucHVzaChkYXRhW2RhdGFMZW5ndGggLSAxXSk7IC8vIEFsd2F5cyBhZGQgbGFzdFxyXG5cclxuICAgICAgICByZXR1cm4gb3V0cHV0O1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBjb21wdXRlQXZlcmFnZVJlc29sdXRpb24oZGF0YTogQ2hhcnRQb2ludFtdKTogbnVtYmVyIHtcclxuICAgICAgICBsZXQgdGltZURpc3RhbmNlcyA9IDA7XHJcblxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBlbmQgPSB0aGlzLm9yaWdpbmFsRGF0YS5sZW5ndGggLSAxOyBpIDwgZW5kOyArK2kpIHtcclxuICAgICAgICAgICAgY29uc3QgY3VycmVudCA9IHRoaXMub3JpZ2luYWxEYXRhW2ldO1xyXG4gICAgICAgICAgICBjb25zdCBuZXh0ID0gdGhpcy5vcmlnaW5hbERhdGFbaSArIDFdO1xyXG5cclxuICAgICAgICAgICAgdGltZURpc3RhbmNlcyArPSBNYXRoLmFicyh0aGlzLmdldFRpbWUoY3VycmVudCkgLSB0aGlzLmdldFRpbWUobmV4dCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGltZURpc3RhbmNlcyAvIChkYXRhLmxlbmd0aCAtIDEpO1xyXG4gICAgfVxyXG59XHJcbiJdfQ==
@@ -0,0 +1,168 @@
1
+ /**
2
+ * This plugin is adapted from: https://github.com/3dcl/chartjs-plugin-responsive-downsample
3
+ * for controlling the radius of point.
4
+ *
5
+ * MIT License
6
+ * Copyright (c) 2018 3D Content Logistics
7
+ *
8
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
9
+ * of this software and associated documentation files (the "Software"), to deal
10
+ * in the Software without restriction, including without limitation the rights
11
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12
+ * copies of the Software, and to permit persons to whom the Software is
13
+ * furnished to do so, subject to the following conditions:
14
+ * The above copyright notice and this permission notice shall be included in all
15
+ * copies or substantial portions of the Software.
16
+ *
17
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23
+ * SOFTWARE.
24
+ */
25
+ import * as moment_module from 'moment';
26
+ const moment = (window && window.moment) ? window.moment : moment_module;
27
+ import * as utils from './utils';
28
+ import { DataMipmap } from './data_mipmap';
29
+ import { LTTBDataMipmap } from './lttb_data_mipmap';
30
+ import * as data_culling from './data_culling';
31
+ // Using dynamic flag to fix the issue of ng-packagr #696: Lambda not supported
32
+ // @dynamic
33
+ /**
34
+ * Chart js Plugin for downsampling data
35
+ */
36
+ export class ResponsiveDownsamplePlugin {
37
+ static getPluginOptions(chart) {
38
+ const options = chart.options.responsiveDownsample || {};
39
+ utils.defaultsDeep(options, {
40
+ enabled: false,
41
+ aggregationAlgorithm: 'LTTB',
42
+ desiredDataPointDistance: 1,
43
+ minNumPoints: 100,
44
+ maxNumPointsToDraw: 100,
45
+ cullData: true
46
+ });
47
+ if (options.enabled) {
48
+ chart.options.responsiveDownsample = options;
49
+ }
50
+ return options;
51
+ }
52
+ static hasDataChanged(chart) {
53
+ return !utils.isNil(utils.findInArray(chart.data.datasets, (dataset) => {
54
+ return utils.isNil(dataset.mipMap);
55
+ }));
56
+ }
57
+ static createDataMipMap(chart, options) {
58
+ chart.data.datasets.forEach((dataset) => {
59
+ // @ts-ignore
60
+ const data = !utils.isNil(dataset.originalData) ? dataset.originalData : dataset.data;
61
+ const mipMap = (options.aggregationAlgorithm === 'LTTB')
62
+ ? new LTTBDataMipmap(data, options.minNumPoints)
63
+ : new DataMipmap(data, options.minNumPoints);
64
+ dataset.originalData = data;
65
+ dataset.mipMap = mipMap;
66
+ // @ts-ignore
67
+ dataset.data = mipMap.getMipMapLevel(mipMap.getNumLevel() - 1); // set last level for first render pass
68
+ });
69
+ }
70
+ static restoreOriginalData(chart) {
71
+ let updated = false;
72
+ chart.data.datasets.forEach((dataset) => {
73
+ // @ts-ignore
74
+ if (!utils.isNil(dataset.originalData) && dataset.data !== dataset.originalData) {
75
+ // @ts-ignore
76
+ dataset.data = dataset.originalData;
77
+ updated = true;
78
+ }
79
+ });
80
+ return updated;
81
+ }
82
+ static getTargetResolution(chart, options) {
83
+ const xScale = chart.scales['x-axis-0'];
84
+ if (utils.isNil(xScale)) {
85
+ return null;
86
+ }
87
+ const start = moment(xScale.getValueForPixel(xScale.left));
88
+ const end = moment(xScale.getValueForPixel(xScale.left + 1));
89
+ const targetResolution = end.diff(start);
90
+ return targetResolution * options.desiredDataPointDistance;
91
+ }
92
+ static updateMipMap(chart, options, rangeChanged) {
93
+ let updated = false;
94
+ chart.data.datasets.forEach((dataset) => {
95
+ const mipMap = dataset.mipMap;
96
+ if (utils.isNil(mipMap)) {
97
+ return;
98
+ }
99
+ const mipMalLevel = mipMap.getMipMapIndexForResolution(options.targetResolution);
100
+ if (mipMalLevel === dataset.currentMipMapLevel && !rangeChanged) {
101
+ // skip update if mip map level and data range did not change
102
+ return;
103
+ }
104
+ updated = true;
105
+ dataset.currentMipMapLevel = mipMalLevel;
106
+ let newData = mipMap.getMipMapLevel(mipMalLevel);
107
+ if (options.cullData) {
108
+ newData = data_culling.cullData(newData, options.scaleRange);
109
+ }
110
+ // @ts-ignore
111
+ dataset.data = newData;
112
+ });
113
+ return updated;
114
+ }
115
+ beforeInit(chart) {
116
+ const options = ResponsiveDownsamplePlugin.getPluginOptions(chart);
117
+ if (!options.enabled) {
118
+ return;
119
+ }
120
+ ResponsiveDownsamplePlugin.createDataMipMap(chart, options);
121
+ options.needsUpdate = true;
122
+ }
123
+ beforeDatasetsUpdate(chart) {
124
+ const options = ResponsiveDownsamplePlugin.getPluginOptions(chart);
125
+ if (!options.enabled) {
126
+ // restore original data and remove state from options
127
+ options.needsUpdate = ResponsiveDownsamplePlugin.restoreOriginalData(chart);
128
+ delete options.targetResolution;
129
+ delete options.scaleRange;
130
+ return;
131
+ }
132
+ // only update mip map if data set was reloaded externally
133
+ if (ResponsiveDownsamplePlugin.hasDataChanged(chart)) {
134
+ ResponsiveDownsamplePlugin.createDataMipMap(chart, options);
135
+ options.needsUpdate = true;
136
+ }
137
+ }
138
+ beforeRender(chart) {
139
+ const options = ResponsiveDownsamplePlugin.getPluginOptions(chart);
140
+ if (!options.enabled) {
141
+ // update chart if data was restored from original data
142
+ if (options.needsUpdate) {
143
+ options.needsUpdate = false;
144
+ chart.update(0);
145
+ return false;
146
+ }
147
+ return;
148
+ }
149
+ const targetResolution = ResponsiveDownsamplePlugin.getTargetResolution(chart, options);
150
+ const xScale = chart.scales['x-axis-0'];
151
+ const scaleRange = data_culling.getScaleRange(xScale);
152
+ const rangeChanged = !data_culling.rangeIsEqual(options.scaleRange, scaleRange);
153
+ if (options.needsUpdate ||
154
+ options.targetResolution !== targetResolution ||
155
+ rangeChanged) {
156
+ options.targetResolution = targetResolution;
157
+ options.scaleRange = scaleRange;
158
+ options.needsUpdate = false;
159
+ if (ResponsiveDownsamplePlugin.updateMipMap(chart, options, rangeChanged)) {
160
+ utils.changePointRadius(chart, options);
161
+ // update chart and cancel current render
162
+ chart.update(0);
163
+ return false;
164
+ }
165
+ }
166
+ }
167
+ }
168
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzcG9uc2l2ZV9kb3duc2FtcGxlX3BsdWdpbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9uYW1lc2VydmVyLWhpc3Rvcnktdmlld2VyL3V0aWxzL2NoYXJ0anMtZG93bnNhbXBsZS9yZXNwb25zaXZlX2Rvd25zYW1wbGVfcGx1Z2luLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXVCRztBQUNILE9BQU8sS0FBSyxhQUFhLE1BQU0sUUFBUSxDQUFDO0FBQ3hDLE1BQU0sTUFBTSxHQUFHLENBQUMsTUFBTSxJQUFLLE1BQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUUsTUFBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDO0FBRzNGLE9BQU8sS0FBSyxLQUFLLE1BQU0sU0FBUyxDQUFDO0FBRWpDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3BELE9BQU8sS0FBSyxZQUFZLE1BQU0sZ0JBQWdCLENBQUM7QUErQy9DLCtFQUErRTtBQUMvRSxXQUFXO0FBQ1g7O0dBRUc7QUFDSCxNQUFNLE9BQU8sMEJBQTBCO0lBQ3JDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFVO1FBQ2hDLE1BQU0sT0FBTyxHQUFzQyxLQUFLLENBQUMsT0FBTyxDQUFDLG9CQUFvQixJQUFJLEVBQUUsQ0FBQztRQUM1RixLQUFLLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRTtZQUMxQixPQUFPLEVBQUUsS0FBSztZQUNkLG9CQUFvQixFQUFFLE1BQU07WUFDNUIsd0JBQXdCLEVBQUUsQ0FBQztZQUMzQixZQUFZLEVBQUUsR0FBRztZQUNqQixrQkFBa0IsRUFBRSxHQUFHO1lBQ3ZCLFFBQVEsRUFBRSxJQUFJO1NBQ2YsQ0FBQyxDQUFDO1FBRUgsSUFBSSxPQUFP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QUFNLEdBQWUsS0FBYSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUM1RCxNQUFNLFVBQVUsR0FBRyxZQUFZLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3RELE1BQU0sWUFBWSxHQUFHLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBRWhGLElBQUksT0FBTyxDQUFDLFdBQVc7WUFDckIsT0FBTyxDQUFDLGdCQUFnQixLQUFLLGdCQUFnQjtZQUM3QyxZQUFZLEVBQ1o7WUFDQSxPQUFPLENBQUMsZ0JBQWdCLEdBQUcsZ0JBQWdCLENBQUM7WUFDNUMsT0FBTyxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7WUFDaEMsT0FBTyxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7WUFFNUIsSUFBSSwwQkFBMEIsQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxZQUFZLENBQUMsRUFBRTtnQkFDekUsS0FBSyxDQUFDLGlCQUFpQixDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztnQkFDeEMseUNBQXlDO2dCQUN6QyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUVoQixPQUFPLEtBQUssQ0FBQzthQUNkO1NBQ0Y7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICogVGhpcyBwbHVnaW4gaXMgYWRhcHRlZCBmcm9tOiBodHRwczovL2dpdGh1Yi5jb20vM2RjbC9jaGFydGpzLXBsdWdpbi1yZXNwb25zaXZlLWRvd25zYW1wbGVcclxuICogZm9yIGNvbnRyb2xsaW5nIHRoZSByYWRpdXMgb2YgcG9pbnQuXHJcbiAqXHJcbiAqIE1JVCBMaWNlbnNlXHJcbiAqIENvcHlyaWdodCAoYykgMjAxOCAzRCBDb250ZW50IExvZ2lzdGljc1xyXG4gKlxyXG4gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XHJcbiAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcclxuICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xyXG4gKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXHJcbiAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xyXG4gKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxyXG4gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGxcclxuICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cclxuICpcclxuICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxyXG4gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcclxuICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXHJcbiAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcclxuICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcclxuICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEVcclxuICogU09GVFdBUkUuXHJcbiAqL1xyXG5pbXBvcnQgKiBhcyBtb21lbnRfbW9kdWxlIGZyb20gJ21vbWVudCc7XHJcbmNvbnN0IG1vbWVudCA9ICh3aW5kb3cgJiYgKHdpbmRvdyBhcyBhbnkpLm1vbWVudCkgPyAod2luZG93IGFzIGFueSkubW9tZW50IDogbW9tZW50X21vZHVsZTtcclxuaW1wb3J0IHsgQ2hhcnQsIENoYXJ0RGF0YSwgQ2hhcnREYXRhU2V0cywgQ2hhcnRQb2ludCB9IGZyb20gJ2NoYXJ0LmpzJztcclxuaW1wb3J0IHsgSUNoYXJ0UGx1Z2luLCBUaW1lU2NhbGUgfSBmcm9tICcuL2NoYXJ0anNfZXh0JztcclxuaW1wb3J0ICogYXMgdXRpbHMgZnJvbSAnLi91dGlscyc7XHJcblxyXG5pbXBvcnQgeyBEYXRhTWlwbWFwIH0gZnJvbSAnLi9kYXRhX21pcG1hcCc7XHJcbmltcG9ydCB7IExUVEJEYXRhTWlwbWFwIH0gZnJvbSAnLi9sdHRiX2RhdGFfbWlwbWFwJztcclxuaW1wb3J0ICogYXMgZGF0YV9jdWxsaW5nIGZyb20gJy4vZGF0YV9jdWxsaW5nJztcclxuXHJcbmludGVyZmFjZSBNaXBNYXBEYXRhU2V0cyBleHRlbmRzIENoYXJ0RGF0YVNldHMge1xyXG4gIG9yaWdpbmFsRGF0YT86IENoYXJ0UG9pbnRbXTtcclxuICBjdXJyZW50TWlwTWFwTGV2ZWw/OiBudW1iZXI7XHJcbiAgbWlwTWFwPzogRGF0YU1pcG1hcDtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBSZXNwb25zaXZlRG93bnNhbXBsZVBsdWdpbk9wdGlvbnMge1xyXG4gIC8qKlxyXG4gICAqIEVuYWJsZS9kaXNhYmxlIHBsdWdpblxyXG4gICAqL1xyXG4gIGVuYWJsZWQ/OiBib29sZWFuO1xyXG4gIC8qKlxyXG4gICAqIFRoZSBhZ2dyZWdhdGlvbiBhbGdvcml0aG0gdG8gdGhpbiBvdXQgZGF0YS4gRGVmYXVsdDogTFRUQlxyXG4gICAqL1xyXG4gIGFnZ3JlZ2F0aW9uQWxnb3JpdGhtPzogJ0FWRycgfCAnTFRUQic7XHJcbiAgLyoqXHJcbiAgICogRGVzaXJlZCBtaW5pbWFsIGRpc3RhbmNlIGJldHdlZW4gZGF0YSBwb2ludHMgaW4gcGl4ZWxzLiBEZWZhdWx0OiAxIHBpeGVsXHJcbiAgICovXHJcbiAgZGVzaXJlZERhdGFQb2ludERpc3RhbmNlPzogbnVtYmVyO1xyXG4gIC8qKlxyXG4gICAqIE1pbmltYWwgbnVtYmVyIG9mIGRhdGEgcG9pbnRzLiBMaW1pdHNcclxuICAgKi9cclxuICBtaW5OdW1Qb2ludHM/OiBudW1iZXI7XHJcbiAgLyoqXHJcbiAgICogQ3VsbCBkYXRhIHRvIGRpc3BsYXllZCByYW5nZSBvZiB4IHNjYWxlXHJcbiAgICovXHJcbiAgY3VsbERhdGE/OiBib29sZWFuO1xyXG4gIC8qKlxyXG4gICAqIEZsYWcgaXMgc2V0IGJ5IHBsdWdpbiB0byB0cmlnZ2VyIHJlbG9hZCBvZiBkYXRhXHJcbiAgICovXHJcbiAgbmVlZHNVcGRhdGU/OiBib29sZWFuO1xyXG4gIC8qKlxyXG4gICAqIEN1cnJlbnQgdGFyZ2V0IHJlc29sdXRpb24oU2V0IGJ5IHBsdWdpbilcclxuICAgKi9cclxuICB0YXJnZXRSZXNvbHV0aW9uPzogbnVtYmVyO1xyXG4gIC8qKlxyXG4gICAqIFNjYWxlIHJhbmdlIG9mIHggYXhpc1xyXG4gICAqL1xyXG4gIHNjYWxlUmFuZ2U/OiBkYXRhX2N1bGxpbmcuUmFuZ2U7XHJcbiAgLyoqXHJcbiAgICogRHJhdyBwb2ludHMgb25seSBpZiB0aGUgcG9pbnRzIG51bWJlciBsZXNzIHRoYW4gdGhlIGxpbWl0YXRpb25cclxuICAgKi9cclxuICBtYXhOdW1Qb2ludHNUb0RyYXc/OiBudW1iZXI7XHJcbn1cclxuXHJcbi8vIFVzaW5nIGR5bmFtaWMgZmxhZyB0byBmaXggdGhlIGlzc3VlIG9mIG5nLXBhY2thZ3IgIzY5NjogTGFtYmRhIG5vdCBzdXBwb3J0ZWRcclxuLy8gQGR5bmFtaWNcclxuLyoqXHJcbiAqIENoYXJ0IGpzIFBsdWdpbiBmb3IgZG93bnNhbXBsaW5nIGRhdGFcclxuICovXHJcbmV4cG9ydCBjbGFzcyBSZXNwb25zaXZlRG93bnNhbXBsZVBsdWdpbiBpbXBsZW1lbnRzIElDaGFydFBsdWdpbiB7XHJcbiAgc3RhdGljIGdldFBsdWdpbk9wdGlvbnMoY2hhcnQ6IGFueSk6IFJlc3BvbnNpdmVEb3duc2FtcGxlUGx1Z2luT3B0aW9ucyB7XHJcbiAgICBjb25zdCBvcHRpb25zOiBSZXNwb25zaXZlRG93bnNhbXBsZVBsdWdpbk9wdGlvbnMgPSBjaGFydC5vcHRpb25zLnJlc3BvbnNpdmVEb3duc2FtcGxlIHx8IHt9O1xyXG4gICAgdXRpbHMuZGVmYXVsdHNEZWVwKG9wdGlvbnMsIHtcclxuICAgICAgZW5hYmxlZDogZmFsc2UsXHJcbiAgICAgIGFnZ3JlZ2F0aW9uQWxnb3JpdGhtOiAnTFRUQicsXHJcbiAgICAgIGRlc2lyZWREYXRhUG9pbnREaXN0YW5jZTogMSxcclxuICAgICAgbWluTnVtUG9pbnRzOiAxMDAsXHJcbiAgICAgIG1heE51bVBvaW50c1RvRHJhdzogMTAwLFxyXG4gICAgICBjdWxsRGF0YTogdHJ1ZVxyXG4gICAgfSk7XHJcblxyXG4gICAgaWYgKG9wdGlvbnMuZW5hYmxlZCkge1xyXG4gICAgICBjaGFydC5vcHRpb25zLnJlc3BvbnNpdmVEb3duc2FtcGxlID0gb3B0aW9ucztcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gb3B0aW9ucztcclxuICB9XHJcblxyXG4gIHN0YXRpYyBoYXNEYXRhQ2hhbmdlZChjaGFydDogQ2hhcnQpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAhdXRpbHMuaXNOaWwoXHJcbiAgICAgIHV0aWxzLmZpbmRJbkFycmF5KFxyXG4gICAgICAgIGNoYXJ0LmRhdGEuZGF0YXNldHMgYXMgTWlwTWFwRGF0YVNldHNbXSxcclxuICAgICAgICAoZGF0YXNldCkgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIHV0aWxzLmlzTmlsKGRhdGFzZXQubWlwTWFwKTtcclxuICAgICAgICB9XHJcbiAgICAgIClcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgY3JlYXRlRGF0YU1pcE1hcChjaGFydDogQ2hhcnQsIG9wdGlvbnM6IFJlc3BvbnNpdmVEb3duc2FtcGxlUGx1Z2luT3B0aW9ucyk6IHZvaWQge1xyXG4gICAgY2hhcnQuZGF0YS5kYXRhc2V0cy5mb3JFYWNoKChkYXRhc2V0OiBNaXBNYXBEYXRhU2V0cykgPT4ge1xyXG4gICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgIGNvbnN0IGRhdGEgPSAhdXRpbHMuaXNOaWwoZGF0YXNldC5vcmlnaW5hbERhdGEpID8gZGF0YXNldC5vcmlnaW5hbERhdGEgOiBkYXRhc2V0LmRhdGEgYXMgQ2hhcnRQb2ludFtdO1xyXG5cclxuICAgICAgY29uc3QgbWlwTWFwID0gKG9wdGlvbnMuYWdncmVnYXRpb25BbGdvcml0aG0gPT09ICdMVFRCJylcclxuICAgICAgICA/IG5ldyBMVFRCRGF0YU1pcG1hcChkYXRhLCBvcHRpb25zLm1pbk51bVBvaW50cylcclxuICAgICAgICA6IG5ldyBEYXRhTWlwbWFwKGRhdGEsIG9wdGlvbnMubWluTnVtUG9pbnRzKTtcclxuXHJcbiAgICAgIGRhdGFzZXQub3JpZ2luYWxEYXRhID0gZGF0YTtcclxuICAgICAgZGF0YXNldC5taXBNYXAgPSBtaXBNYXA7XHJcbiAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgZGF0YXNldC5kYXRhID0gbWlwTWFwLmdldE1pcE1hcExldmVsKG1pcE1hcC5nZXROdW1MZXZlbCgpIC0gMSk7IC8vIHNldCBsYXN0IGxldmVsIGZvciBmaXJzdCByZW5kZXIgcGFzc1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgcmVzdG9yZU9yaWdpbmFsRGF0YShjaGFydDogQ2hhcnQpOiBib29sZWFuIHtcclxuICAgIGxldCB1cGRhdGVkID0gZmFsc2U7XHJcblxyXG4gICAgY2hhcnQuZGF0YS5kYXRhc2V0cy5mb3JFYWNoKChkYXRhc2V0OiBNaXBNYXBEYXRhU2V0cykgPT4ge1xyXG4gICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgIGlmICghdXRpbHMuaXNOaWwoZGF0YXNldC5vcmlnaW5hbERhdGEpICYmIGRhdGFzZXQuZGF0YSAhPT0gZGF0YXNldC5vcmlnaW5hbERhdGEpIHtcclxuICAgICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgICAgZGF0YXNldC5kYXRhID0gZGF0YXNldC5vcmlnaW5hbERhdGE7XHJcbiAgICAgICAgdXBkYXRlZCA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiB1cGRhdGVkO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIGdldFRhcmdldFJlc29sdXRpb24oY2hhcnQ6IENoYXJ0LCBvcHRpb25zOiBSZXNwb25zaXZlRG93bnNhbXBsZVBsdWdpbk9wdGlvbnMpOiBudW1iZXIge1xyXG4gICAgY29uc3QgeFNjYWxlOiBUaW1lU2NhbGUgPSAoY2hhcnQgYXMgYW55KS5zY2FsZXNbJ3gtYXhpcy0wJ107XHJcblxyXG4gICAgaWYgKHV0aWxzLmlzTmlsKHhTY2FsZSkpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qgc3RhcnQgPSBtb21lbnQoeFNjYWxlLmdldFZhbHVlRm9yUGl4ZWwoeFNjYWxlLmxlZnQpIGFzIGFueSk7XHJcbiAgICBjb25zdCBlbmQgPSBtb21lbnQoeFNjYWxlLmdldFZhbHVlRm9yUGl4ZWwoeFNjYWxlLmxlZnQgKyAxKSBhcyBhbnkpO1xyXG4gICAgY29uc3QgdGFyZ2V0UmVzb2x1dGlvbiA9IGVuZC5kaWZmKHN0YXJ0KTtcclxuXHJcbiAgICByZXR1cm4gdGFyZ2V0UmVzb2x1dGlvbiAqIG9wdGlvbnMuZGVzaXJlZERhdGFQb2ludERpc3RhbmNlO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIHVwZGF0ZU1pcE1hcChjaGFydDogQ2hhcnQsIG9wdGlvbnM6IFJlc3BvbnNpdmVEb3duc2FtcGxlUGx1Z2luT3B0aW9ucywgcmFuZ2VDaGFuZ2VkOiBib29sZWFuKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgdXBkYXRlZCA9IGZhbHNlO1xyXG5cclxuICAgIGNoYXJ0LmRhdGEuZGF0YXNldHMuZm9yRWFjaCgoZGF0YXNldDogTWlwTWFwRGF0YVNldHMpID0+IHtcclxuICAgICAgY29uc3QgbWlwTWFwID0gZGF0YXNldC5taXBNYXA7XHJcbiAgICAgIGlmICh1dGlscy5pc05pbChtaXBNYXApKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCBtaXBNYWxMZXZlbCA9IG1pcE1hcC5nZXRNaXBNYXBJbmRleEZvclJlc29sdXRpb24ob3B0aW9ucy50YXJnZXRSZXNvbHV0aW9uKTtcclxuICAgICAgaWYgKG1pcE1hbExldmVsID09PSBkYXRhc2V0LmN1cnJlbnRNaXBNYXBMZXZlbCAmJiAhcmFuZ2VDaGFuZ2VkKSB7XHJcbiAgICAgICAgLy8gc2tpcCB1cGRhdGUgaWYgbWlwIG1hcCBsZXZlbCBhbmQgZGF0YSByYW5nZSBkaWQgbm90IGNoYW5nZVxyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICB1cGRhdGVkID0gdHJ1ZTtcclxuICAgICAgZGF0YXNldC5jdXJyZW50TWlwTWFwTGV2ZWwgPSBtaXBNYWxMZXZlbDtcclxuXHJcbiAgICAgIGxldCBuZXdEYXRhID0gbWlwTWFwLmdldE1pcE1hcExldmVsKG1pcE1hbExldmVsKTtcclxuICAgICAgaWYgKG9wdGlvbnMuY3VsbERhdGEpIHtcclxuICAgICAgICBuZXdEYXRhID0gZGF0YV9jdWxsaW5nLmN1bGxEYXRhKG5ld0RhdGEsIG9wdGlvbnMuc2NhbGVSYW5nZSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgZGF0YXNldC5kYXRhID0gbmV3RGF0YTtcclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiB1cGRhdGVkO1xyXG4gIH1cclxuXHJcbiAgYmVmb3JlSW5pdChjaGFydDogQ2hhcnQpOiB2b2lkIHtcclxuICAgIGNvbnN0IG9wdGlvbnMgPSBSZXNwb25zaXZlRG93bnNhbXBsZVBsdWdpbi5nZXRQbHVnaW5PcHRpb25zKGNoYXJ0KTtcclxuICAgIGlmICghb3B0aW9ucy5lbmFibGVkKSB7IHJldHVybjsgfVxyXG5cclxuICAgIFJlc3BvbnNpdmVEb3duc2FtcGxlUGx1Z2luLmNyZWF0ZURhdGFNaXBNYXAoY2hhcnQsIG9wdGlvbnMpO1xyXG4gICAgb3B0aW9ucy5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcbiAgfVxyXG5cclxuICBiZWZvcmVEYXRhc2V0c1VwZGF0ZShjaGFydDogQ2hhcnQpOiB2b2lkIHtcclxuICAgIGNvbnN0IG9wdGlvbnMgPSBSZXNwb25zaXZlRG93bnNhbXBsZVBsdWdpbi5nZXRQbHVnaW5PcHRpb25zKGNoYXJ0KTtcclxuICAgIGlmICghb3B0aW9ucy5lbmFibGVkKSB7XHJcbiAgICAgIC8vIHJlc3RvcmUgb3JpZ2luYWwgZGF0YSBhbmQgcmVtb3ZlIHN0YXRlIGZyb20gb3B0aW9uc1xyXG4gICAgICBvcHRpb25zLm5lZWRzVXBkYXRlID0gUmVzcG9uc2l2ZURvd25zYW1wbGVQbHVnaW4ucmVzdG9yZU9yaWdpbmFsRGF0YShjaGFydCk7XHJcbiAgICAgIGRlbGV0ZSBvcHRpb25zLnRhcmdldFJlc29sdXRpb247XHJcbiAgICAgIGRlbGV0ZSBvcHRpb25zLnNjYWxlUmFuZ2U7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvLyBvbmx5IHVwZGF0ZSBtaXAgbWFwIGlmIGRhdGEgc2V0IHdhcyByZWxvYWRlZCBleHRlcm5hbGx5XHJcbiAgICBpZiAoUmVzcG9uc2l2ZURvd25zYW1wbGVQbHVnaW4uaGFzRGF0YUNoYW5nZWQoY2hhcnQpKSB7XHJcbiAgICAgIFJlc3BvbnNpdmVEb3duc2FtcGxlUGx1Z2luLmNyZWF0ZURhdGFNaXBNYXAoY2hhcnQsIG9wdGlvbnMpO1xyXG4gICAgICBvcHRpb25zLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGJlZm9yZVJlbmRlcihjaGFydDogQ2hhcnQpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IG9wdGlvbnMgPSBSZXNwb25zaXZlRG93bnNhbXBsZVBsdWdpbi5nZXRQbHVnaW5PcHRpb25zKGNoYXJ0KTtcclxuICAgIGlmICghb3B0aW9ucy5lbmFibGVkKSB7XHJcbiAgICAgIC8vIHVwZGF0ZSBjaGFydCBpZiBkYXRhIHdhcyByZXN0b3JlZCBmcm9tIG9yaWdpbmFsIGRhdGFcclxuICAgICAgaWYgKG9wdGlvbnMubmVlZHNVcGRhdGUpIHtcclxuICAgICAgICBvcHRpb25zLm5lZWRzVXBkYXRlID0gZmFsc2U7XHJcbiAgICAgICAgY2hhcnQudXBkYXRlKDApO1xyXG5cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHRhcmdldFJlc29sdXRpb24gPSBSZXNwb25zaXZlRG93bnNhbXBsZVBsdWdpbi5nZXRUYXJnZXRSZXNvbHV0aW9uKGNoYXJ0LCBvcHRpb25zKTtcclxuICAgIGNvbnN0IHhTY2FsZTogVGltZVNjYWxlID0gKGNoYXJ0IGFzIGFueSkuc2NhbGVzWyd4LWF4aXMtMCddO1xyXG4gICAgY29uc3Qgc2NhbGVSYW5nZSA9IGRhdGFfY3VsbGluZy5nZXRTY2FsZVJhbmdlKHhTY2FsZSk7XHJcbiAgICBjb25zdCByYW5nZUNoYW5nZWQgPSAhZGF0YV9jdWxsaW5nLnJhbmdlSXNFcXVhbChvcHRpb25zLnNjYWxlUmFuZ2UsIHNjYWxlUmFuZ2UpO1xyXG5cclxuICAgIGlmIChvcHRpb25zLm5lZWRzVXBkYXRlIHx8XHJcbiAgICAgIG9wdGlvbnMudGFyZ2V0UmVzb2x1dGlvbiAhPT0gdGFyZ2V0UmVzb2x1dGlvbiB8fFxyXG4gICAgICByYW5nZUNoYW5nZWRcclxuICAgICkge1xyXG4gICAgICBvcHRpb25zLnRhcmdldFJlc29sdXRpb24gPSB0YXJnZXRSZXNvbHV0aW9uO1xyXG4gICAgICBvcHRpb25zLnNjYWxlUmFuZ2UgPSBzY2FsZVJhbmdlO1xyXG4gICAgICBvcHRpb25zLm5lZWRzVXBkYXRlID0gZmFsc2U7XHJcblxyXG4gICAgICBpZiAoUmVzcG9uc2l2ZURvd25zYW1wbGVQbHVnaW4udXBkYXRlTWlwTWFwKGNoYXJ0LCBvcHRpb25zLCByYW5nZUNoYW5nZWQpKSB7XHJcbiAgICAgICAgdXRpbHMuY2hhbmdlUG9pbnRSYWRpdXMoY2hhcnQsIG9wdGlvbnMpO1xyXG4gICAgICAgIC8vIHVwZGF0ZSBjaGFydCBhbmQgY2FuY2VsIGN1cnJlbnQgcmVuZGVyXHJcbiAgICAgICAgY2hhcnQudXBkYXRlKDApO1xyXG5cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbn1cclxuIl19
@@ -0,0 +1,114 @@
1
+ /**
2
+ * This plugin is adapted from: https://github.com/3dcl/chartjs-plugin-responsive-downsample
3
+ * for controlling the radius of point.
4
+ *
5
+ * MIT License
6
+ * Copyright (c) 2018 3D Content Logistics
7
+ *
8
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
9
+ * of this software and associated documentation files (the "Software"), to deal
10
+ * in the Software without restriction, including without limitation the rights
11
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12
+ * copies of the Software, and to permit persons to whom the Software is
13
+ * furnished to do so, subject to the following conditions:
14
+ * The above copyright notice and this permission notice shall be included in all
15
+ * copies or substantial portions of the Software.
16
+ *
17
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23
+ * SOFTWARE.
24
+ */
25
+ /**
26
+ * Check if a value is null or undefined
27
+ */
28
+ export function isNil(value) {
29
+ return (typeof value === 'undefined') || value === null;
30
+ }
31
+ /**
32
+ * Clamp a number to a range
33
+ * @param value
34
+ * @param min
35
+ * @param max
36
+ */
37
+ export function clamp(value, min, max) {
38
+ return Math.min(Math.max(value, min), max);
39
+ }
40
+ /**
41
+ * Recursively assign default values to an object if object is missing the keys.
42
+ * @param object The destination object to assign default values to
43
+ * @param defaults The default values for the object
44
+ * @return The destination object
45
+ */
46
+ export function defaultsDeep(object, defaults) {
47
+ for (const key in defaults) {
48
+ if (defaults.hasOwnProperty(key)) {
49
+ const value = object[key];
50
+ if (typeof value === 'undefined') {
51
+ object[key] = defaults[key];
52
+ }
53
+ else if (value !== null && typeof value === 'object') {
54
+ object[key] = defaultsDeep(value, defaults[key]);
55
+ }
56
+ }
57
+ }
58
+ return object;
59
+ }
60
+ /**
61
+ * Finds the first element in an array for that the comaperator functions returns true
62
+ *
63
+ * @export
64
+ * @param array An array
65
+ * @param compareFunction Comperator function returning true for the element seeked
66
+ * @returns The found element or undefined
67
+ */
68
+ export function findInArray(array, compareFunction) {
69
+ if (isNil(array)) {
70
+ return undefined;
71
+ }
72
+ for (let i = 0; i < array.length; i++) {
73
+ if (compareFunction(array[i]) === true) {
74
+ return array[i];
75
+ }
76
+ }
77
+ return undefined;
78
+ }
79
+ /**
80
+ * Finds the first index in an array for that the comaperator function for an element returns true
81
+ *
82
+ * @export
83
+ * @param array An array of elements
84
+ * @param compareFunction Comperator function returning true for the element seeked
85
+ * @returns Index of the matched element or -1 if no element was found
86
+ */
87
+ export function findIndexInArray(array, compareFunction) {
88
+ if (isNil(array)) {
89
+ return undefined;
90
+ }
91
+ for (let i = 0; i < array.length; i++) {
92
+ if (compareFunction(array[i]) === true) {
93
+ return i;
94
+ }
95
+ }
96
+ return -1;
97
+ }
98
+ /**
99
+ * If points number is less than minNumPoints, show radius for all points.
100
+ */
101
+ export function changePointRadius(chart, options) {
102
+ if (chart && chart.data && chart.data.datasets && options) {
103
+ let pointRadiusChangeFlag = false;
104
+ const maxNumPointsToDraw = options.maxNumPointsToDraw == null ? 100 : options.maxNumPointsToDraw;
105
+ for (const dataset of chart.data.datasets) {
106
+ if (dataset.data.length < maxNumPointsToDraw) {
107
+ pointRadiusChangeFlag = true;
108
+ break;
109
+ }
110
+ }
111
+ chart.options.elements.point.radius = pointRadiusChangeFlag ? 2 : 0;
112
+ }
113
+ }
114
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbmFtZXNlcnZlci1oaXN0b3J5LXZpZXdlci91dGlscy9jaGFydGpzLWRvd25zYW1wbGUvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBdUJHO0FBRUg7O0dBRUc7QUFDSCxNQUFNLFVBQVUsS0FBSyxDQUFDLEtBQVU7SUFDNUIsT0FBTyxDQUFDLE9BQU8sS0FBSyxLQUFLLFdBQVcsQ0FBQyxJQUFJLEtBQUssS0FBSyxJQUFJLENBQUM7QUFDNUQsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLEtBQUssQ0FBQyxLQUFhLEVBQUUsR0FBVyxFQUFFLEdBQVc7SUFDekQsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQy9DLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxZQUFZLENBQUksTUFBUyxFQUFFLFFBQW9CO0lBQzNELEtBQUssTUFBTSxHQUFHLElBQUksUUFBUSxFQUFFO1FBQzFCLElBQUksUUFBUSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUNoQyxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7WUFFMUIsSUFBSSxPQUFPLEtBQUssS0FBSyxXQUFXLEVBQUU7Z0JBQ2hDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7YUFDN0I7aUJBQU0sSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRTtnQkFDdEQsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLFlBQVksQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7YUFDbEQ7U0FDRjtLQUNGO0lBRUQsT0FBTyxNQUFNLENBQUM7QUFDbEIsQ0FBQztBQUdEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUsV0FBVyxDQUFJLEtBQWUsRUFBRSxlQUF3QztJQUNwRixJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsRUFBRTtRQUNoQixPQUFPLFNBQVMsQ0FBQztLQUNsQjtJQUNELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQ25DLElBQUksZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksRUFBRTtZQUNwQyxPQUFPLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNuQjtLQUNKO0lBQ0QsT0FBTyxTQUFTLENBQUM7QUFDckIsQ0FBQztBQUdEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUsZ0JBQWdCLENBQUksS0FBZSxFQUFFLGVBQXdDO0lBQ3pGLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUFFO1FBQ2hCLE9BQU8sU0FBUyxDQUFDO0tBQ2xCO0lBQ0QsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDbkMsSUFBSSxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxFQUFFO1lBQ3BDLE9BQU8sQ0FBQyxDQUFDO1NBQ1o7S0FDSjtJQUNELE9BQU8sQ0FBQyxDQUFDLENBQUM7QUFDZCxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLFVBQVUsaUJBQWlCLENBQUMsS0FBSyxFQUFFLE9BQU87SUFDOUMsSUFBSSxLQUFLLElBQUksS0FBSyxDQUFDLElBQUksSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxPQUFPLEVBQUU7UUFDekQsSUFBSSxxQkFBcUIsR0FBRyxLQUFLLENBQUM7UUFDbEMsTUFBTSxrQkFBa0IsR0FBRyxPQUFPLENBQUMsa0JBQWtCLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQztRQUNqRyxLQUFLLE1BQU0sT0FBTyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ3pDLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsa0JBQWtCLEVBQUU7Z0JBQzVDLHFCQUFxQixHQUFHLElBQUksQ0FBQztnQkFDN0IsTUFBTTthQUNQO1NBQ0Y7UUFDRCxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUNyRTtBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICogVGhpcyBwbHVnaW4gaXMgYWRhcHRlZCBmcm9tOiBodHRwczovL2dpdGh1Yi5jb20vM2RjbC9jaGFydGpzLXBsdWdpbi1yZXNwb25zaXZlLWRvd25zYW1wbGVcclxuICogZm9yIGNvbnRyb2xsaW5nIHRoZSByYWRpdXMgb2YgcG9pbnQuXHJcbiAqXHJcbiAqIE1JVCBMaWNlbnNlXHJcbiAqIENvcHlyaWdodCAoYykgMjAxOCAzRCBDb250ZW50IExvZ2lzdGljc1xyXG4gKlxyXG4gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XHJcbiAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcclxuICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xyXG4gKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXHJcbiAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xyXG4gKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxyXG4gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGxcclxuICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cclxuICpcclxuICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxyXG4gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcclxuICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXHJcbiAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcclxuICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcclxuICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEVcclxuICogU09GVFdBUkUuXHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIENoZWNrIGlmIGEgdmFsdWUgaXMgbnVsbCBvciB1bmRlZmluZWRcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBpc05pbCh2YWx1ZTogYW55KTogdmFsdWUgaXMgbnVsbCB8IHVuZGVmaW5lZCB7XHJcbiAgICByZXR1cm4gKHR5cGVvZiB2YWx1ZSA9PT0gJ3VuZGVmaW5lZCcpIHx8IHZhbHVlID09PSBudWxsO1xyXG59XHJcblxyXG4vKipcclxuICogQ2xhbXAgYSBudW1iZXIgdG8gYSByYW5nZVxyXG4gKiBAcGFyYW0gdmFsdWVcclxuICogQHBhcmFtIG1pblxyXG4gKiBAcGFyYW0gbWF4XHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gY2xhbXAodmFsdWU6IG51bWJlciwgbWluOiBudW1iZXIsIG1heDogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIHJldHVybiBNYXRoLm1pbihNYXRoLm1heCh2YWx1ZSwgbWluKSwgbWF4KTtcclxufVxyXG5cclxuLyoqXHJcbiAqIFJlY3Vyc2l2ZWx5IGFzc2lnbiBkZWZhdWx0IHZhbHVlcyB0byBhbiBvYmplY3QgaWYgb2JqZWN0IGlzIG1pc3NpbmcgdGhlIGtleXMuXHJcbiAqIEBwYXJhbSBvYmplY3QgVGhlIGRlc3RpbmF0aW9uIG9iamVjdCB0byBhc3NpZ24gZGVmYXVsdCB2YWx1ZXMgdG9cclxuICogQHBhcmFtIGRlZmF1bHRzIFRoZSBkZWZhdWx0IHZhbHVlcyBmb3IgdGhlIG9iamVjdFxyXG4gKiBAcmV0dXJuIFRoZSBkZXN0aW5hdGlvbiBvYmplY3RcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBkZWZhdWx0c0RlZXA8VD4ob2JqZWN0OiBULCBkZWZhdWx0czogUGFydGlhbDxUPik6IFQge1xyXG4gICAgZm9yIChjb25zdCBrZXkgaW4gZGVmYXVsdHMpIHtcclxuICAgICAgaWYgKGRlZmF1bHRzLmhhc093blByb3BlcnR5KGtleSkpIHtcclxuICAgICAgICBjb25zdCB2YWx1ZSA9IG9iamVjdFtrZXldO1xyXG5cclxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgICAgb2JqZWN0W2tleV0gPSBkZWZhdWx0c1trZXldO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xyXG4gICAgICAgICAgb2JqZWN0W2tleV0gPSBkZWZhdWx0c0RlZXAodmFsdWUsIGRlZmF1bHRzW2tleV0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBvYmplY3Q7XHJcbn1cclxuXHJcblxyXG4vKipcclxuICogRmluZHMgdGhlIGZpcnN0IGVsZW1lbnQgaW4gYW4gYXJyYXkgZm9yIHRoYXQgdGhlIGNvbWFwZXJhdG9yIGZ1bmN0aW9ucyByZXR1cm5zIHRydWVcclxuICpcclxuICogQGV4cG9ydFxyXG4gKiBAcGFyYW0gYXJyYXkgQW4gYXJyYXlcclxuICogQHBhcmFtIGNvbXBhcmVGdW5jdGlvbiBDb21wZXJhdG9yIGZ1bmN0aW9uIHJldHVybmluZyB0cnVlIGZvciB0aGUgZWxlbWVudCBzZWVrZWRcclxuICogQHJldHVybnMgVGhlIGZvdW5kIGVsZW1lbnQgb3IgdW5kZWZpbmVkXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZmluZEluQXJyYXk8VD4oYXJyYXk6IEFycmF5PFQ+LCBjb21wYXJlRnVuY3Rpb246IChlbGVtZW50OiBUKSA9PiBib29sZWFuKTogVCB7XHJcbiAgICBpZiAoaXNOaWwoYXJyYXkpKSB7XHJcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICB9XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgaWYgKGNvbXBhcmVGdW5jdGlvbihhcnJheVtpXSkgPT09IHRydWUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGFycmF5W2ldO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbn1cclxuXHJcblxyXG4vKipcclxuICogRmluZHMgdGhlIGZpcnN0IGluZGV4IGluIGFuIGFycmF5IGZvciB0aGF0IHRoZSBjb21hcGVyYXRvciBmdW5jdGlvbiBmb3IgYW4gZWxlbWVudCByZXR1cm5zIHRydWVcclxuICpcclxuICogQGV4cG9ydFxyXG4gKiBAcGFyYW0gYXJyYXkgQW4gYXJyYXkgb2YgZWxlbWVudHNcclxuICogQHBhcmFtIGNvbXBhcmVGdW5jdGlvbiBDb21wZXJhdG9yIGZ1bmN0aW9uIHJldHVybmluZyB0cnVlIGZvciB0aGUgZWxlbWVudCBzZWVrZWRcclxuICogQHJldHVybnMgSW5kZXggb2YgdGhlIG1hdGNoZWQgZWxlbWVudCBvciAtMSBpZiBubyBlbGVtZW50IHdhcyBmb3VuZFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRJbmRleEluQXJyYXk8VD4oYXJyYXk6IEFycmF5PFQ+LCBjb21wYXJlRnVuY3Rpb246IChlbGVtZW50OiBUKSA9PiBib29sZWFuKTogbnVtYmVyIHtcclxuICAgIGlmIChpc05pbChhcnJheSkpIHtcclxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgIH1cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBpZiAoY29tcGFyZUZ1bmN0aW9uKGFycmF5W2ldKSA9PT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gaTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gLTE7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBJZiBwb2ludHMgbnVtYmVyIGlzIGxlc3MgdGhhbiBtaW5OdW1Qb2ludHMsIHNob3cgcmFkaXVzIGZvciBhbGwgcG9pbnRzLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGNoYW5nZVBvaW50UmFkaXVzKGNoYXJ0LCBvcHRpb25zKTogdm9pZCB7XHJcbiAgaWYgKGNoYXJ0ICYmIGNoYXJ0LmRhdGEgJiYgY2hhcnQuZGF0YS5kYXRhc2V0cyAmJiBvcHRpb25zKSB7XHJcbiAgICBsZXQgcG9pbnRSYWRpdXNDaGFuZ2VGbGFnID0gZmFsc2U7XHJcbiAgICBjb25zdCBtYXhOdW1Qb2ludHNUb0RyYXcgPSBvcHRpb25zLm1heE51bVBvaW50c1RvRHJhdyA9PSBudWxsID8gMTAwIDogb3B0aW9ucy5tYXhOdW1Qb2ludHNUb0RyYXc7XHJcbiAgICBmb3IgKGNvbnN0IGRhdGFzZXQgb2YgY2hhcnQuZGF0YS5kYXRhc2V0cykge1xyXG4gICAgICBpZiAoZGF0YXNldC5kYXRhLmxlbmd0aCA8IG1heE51bVBvaW50c1RvRHJhdykge1xyXG4gICAgICAgIHBvaW50UmFkaXVzQ2hhbmdlRmxhZyA9IHRydWU7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGNoYXJ0Lm9wdGlvbnMuZWxlbWVudHMucG9pbnQucmFkaXVzID0gcG9pbnRSYWRpdXNDaGFuZ2VGbGFnID8gMiA6IDA7XHJcbiAgfVxyXG59XHJcbiJdfQ==