@rivet-health/design-system 40.44.0 → 40.44.2

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 (321) hide show
  1. package/{esm2020 → esm2022}/lib/accessibility/sr-only/sr-only.component.mjs +4 -4
  2. package/esm2022/lib/download/download.service.mjs +47 -0
  3. package/{esm2020 → esm2022}/lib/format/pipes/common.mjs +5 -5
  4. package/{esm2020 → esm2022}/lib/format/pipes/date.pipe.mjs +4 -4
  5. package/{esm2020 → esm2022}/lib/format/pipes/days.pipe.mjs +4 -4
  6. package/{esm2020 → esm2022}/lib/format/pipes/dollars.pipe.mjs +4 -4
  7. package/{esm2020 → esm2022}/lib/format/pipes/number.pipe.mjs +4 -4
  8. package/{esm2020 → esm2022}/lib/format/pipes/percentage.pipe.mjs +4 -4
  9. package/esm2022/lib/format/pipes/sentence-case.pipe.mjs +61 -0
  10. package/esm2022/lib/format/pipes/small-currency.pipe.mjs +24 -0
  11. package/esm2022/lib/format/pipes/small-number.pipe.mjs +29 -0
  12. package/esm2022/lib/format/svg-text-truncate/svg-text-truncate.directive.mjs +62 -0
  13. package/esm2022/lib/format/truncate/truncate.component.mjs +51 -0
  14. package/esm2022/lib/icon/dom-cache.mjs +32 -0
  15. package/esm2022/lib/icon/icon.component.mjs +86 -0
  16. package/{esm2020 → esm2022}/lib/icon/icons.mjs +1 -1
  17. package/{esm2020 → esm2022}/lib/input/alphabetic-field/alphabetic-field.component.mjs +4 -4
  18. package/esm2022/lib/input/auto-focus/auto-focus.directive.mjs +48 -0
  19. package/esm2022/lib/input/button/button.component.mjs +139 -0
  20. package/esm2022/lib/input/button-group/button-group.component.mjs +39 -0
  21. package/{esm2020 → esm2022}/lib/input/calendar/calendar.component.mjs +4 -4
  22. package/{esm2020 → esm2022}/lib/input/card-checkbox/card-checkbox.component.mjs +4 -4
  23. package/{esm2020 → esm2022}/lib/input/checkbox/checkbox.component.mjs +4 -4
  24. package/{esm2020 → esm2022}/lib/input/currency-field/currency-field.component.mjs +4 -4
  25. package/esm2022/lib/input/date/date.component.mjs +279 -0
  26. package/esm2022/lib/input/date-range/date-range.component.mjs +477 -0
  27. package/esm2022/lib/input/filter-chip/filter-chip.component.mjs +47 -0
  28. package/{esm2020 → esm2022}/lib/input/filter-dropdown/filter-dropdown.component.mjs +5 -5
  29. package/{esm2020 → esm2022}/lib/input/input-label/input-label.component.mjs +4 -4
  30. package/esm2022/lib/input/mentions-input/mentions-input.component.mjs +745 -0
  31. package/esm2022/lib/input/number-field/number-field.component.mjs +125 -0
  32. package/{esm2020 → esm2022}/lib/input/percentage-field/percentage-field.component.mjs +4 -4
  33. package/esm2022/lib/input/phone-field/phone-field.component.mjs +74 -0
  34. package/{esm2020 → esm2022}/lib/input/radio/radio.component.mjs +4 -4
  35. package/{esm2020 → esm2022}/lib/input/search/search.component.mjs +4 -4
  36. package/esm2022/lib/input/search-select/search-select.component.mjs +189 -0
  37. package/esm2022/lib/input/select/select/select.component.mjs +178 -0
  38. package/{esm2020 → esm2022}/lib/input/select/select-node/select-node.component.mjs +4 -4
  39. package/esm2022/lib/input/select/state.mjs +882 -0
  40. package/{esm2020 → esm2022}/lib/input/simple-select/option-group.pipe.mjs +4 -4
  41. package/esm2022/lib/input/simple-select/simple-select.component.mjs +178 -0
  42. package/esm2022/lib/input/switch-checkbox/switch-checkbox.component.mjs +33 -0
  43. package/esm2022/lib/input/text-field/text-field.component.mjs +115 -0
  44. package/{esm2020 → esm2022}/lib/input/textarea-field/textarea-field.component.mjs +4 -4
  45. package/{esm2020 → esm2022}/lib/input/validation-message/validation-message.component.mjs +4 -4
  46. package/{esm2020 → esm2022}/lib/layout/card/card-actions.component.mjs +4 -4
  47. package/esm2022/lib/layout/card/card-content.component.mjs +64 -0
  48. package/esm2022/lib/layout/card/card-header.component.mjs +201 -0
  49. package/{esm2020 → esm2022}/lib/layout/card/card-link.component.mjs +5 -5
  50. package/{esm2020 → esm2022}/lib/layout/card/card-media.component.mjs +4 -4
  51. package/esm2022/lib/layout/card/card.component.mjs +291 -0
  52. package/{esm2020 → esm2022}/lib/layout/setting-row/setting-row.component.mjs +4 -4
  53. package/esm2022/lib/load/loading/loading.component.mjs +43 -0
  54. package/{esm2020 → esm2022}/lib/load/loading-cover/loading-cover.component.mjs +4 -4
  55. package/esm2022/lib/navigation/editable-heading/editable-heading.component.mjs +243 -0
  56. package/{esm2020 → esm2022}/lib/navigation/link/link.component.mjs +6 -6
  57. package/{esm2020 → esm2022}/lib/navigation/page-header/page-header.component.mjs +4 -4
  58. package/{esm2020 → esm2022}/lib/navigation/simple-tabs/simple-tab/simple-tab.component.mjs +4 -4
  59. package/{esm2020 → esm2022}/lib/navigation/simple-tabs/simple-tabs/simple-tabs.component.mjs +4 -4
  60. package/{esm2020 → esm2022}/lib/navigation/tabs/tab/tab.component.mjs +4 -4
  61. package/{esm2020 → esm2022}/lib/navigation/tabs/tabs/tabs.component.mjs +4 -4
  62. package/{esm2020 → esm2022}/lib/navigation/views/all-views-modal/all-views-modal.component.mjs +4 -4
  63. package/{esm2020 → esm2022}/lib/navigation/views/edit-view/edit-view.component.mjs +9 -9
  64. package/esm2022/lib/navigation/views/permission-picker/permission-picker.component.mjs +151 -0
  65. package/esm2022/lib/navigation/views/state.mjs +456 -0
  66. package/{esm2020 → esm2022}/lib/navigation/views/view-menu/view-menu.component.mjs +5 -5
  67. package/esm2022/lib/navigation/views/views/views.component.mjs +90 -0
  68. package/{esm2020 → esm2022}/lib/notification/badge/badge.component.mjs +4 -4
  69. package/esm2022/lib/notification/banner/banner-action.component.mjs +48 -0
  70. package/esm2022/lib/notification/banner/banner.component.mjs +61 -0
  71. package/esm2022/lib/notification/map-indicator/map-indicator.component.mjs +50 -0
  72. package/esm2022/lib/notification/map-indicator/map-indicators.mjs +15 -0
  73. package/{esm2020 → esm2022}/lib/notification/notification-badge/notification-badge.component.mjs +4 -4
  74. package/esm2022/lib/overlay/callout/callout.component.mjs +130 -0
  75. package/esm2022/lib/overlay/callout/callout.helpers.mjs +113 -0
  76. package/{esm2020 → esm2022}/lib/overlay/callout/help/help.component.mjs +4 -4
  77. package/esm2022/lib/overlay/callout/lock-scroll.directive.mjs +69 -0
  78. package/{esm2020 → esm2022}/lib/overlay/callout/menu/menu-item/menu-item.component.mjs +5 -5
  79. package/{esm2020 → esm2022}/lib/overlay/callout/menu/menu.component.mjs +4 -4
  80. package/esm2022/lib/overlay/callout/tooltip/locked-tooltip.directive.mjs +30 -0
  81. package/{esm2020 → esm2022}/lib/overlay/callout/tooltip/tooltip.component.mjs +4 -4
  82. package/esm2022/lib/overlay/callout/tooltip/tooltip.directive.mjs +138 -0
  83. package/esm2022/lib/overlay/modal/dialog/dialog.component.mjs +47 -0
  84. package/{esm2020 → esm2022}/lib/overlay/modal/dialog-stack.service.mjs +4 -4
  85. package/esm2022/lib/overlay/modal/form-dialog/form-dialog.component.mjs +146 -0
  86. package/esm2022/lib/overlay/modal/modal.component.mjs +31 -0
  87. package/{esm2020 → esm2022}/lib/overlay/modal/side-sheet/side-sheet.component.mjs +4 -4
  88. package/esm2022/lib/overlay/overlay-outlet.component.mjs +98 -0
  89. package/{esm2020 → esm2022}/lib/overlay/overlay.directive.mjs +5 -5
  90. package/{esm2020 → esm2022}/lib/overlay/overlay.service.mjs +5 -5
  91. package/{esm2020 → esm2022}/lib/overlay/toast/toast-action.component.mjs +4 -4
  92. package/esm2022/lib/overlay/toast/toast.component.mjs +41 -0
  93. package/{esm2020 → esm2022}/lib/riv.module.mjs +227 -227
  94. package/esm2022/lib/size/size.directive.mjs +33 -0
  95. package/esm2022/lib/table/simple-table/coordinate-helper.mjs +61 -0
  96. package/esm2022/lib/table/simple-table/simple-table-cell.component.mjs +36 -0
  97. package/esm2022/lib/table/simple-table/simple-table-header-cell.component.mjs +37 -0
  98. package/{esm2020 → esm2022}/lib/table/simple-table/simple-table-row.component.mjs +4 -4
  99. package/esm2022/lib/table/simple-table/simple-table.component.mjs +104 -0
  100. package/esm2022/lib/table/table/clipboard.mjs +182 -0
  101. package/esm2022/lib/table/table/state-helpers/collapse-helpers.mjs +116 -0
  102. package/esm2022/lib/table/table/state-helpers/column-helpers.mjs +383 -0
  103. package/{esm2020 → esm2022}/lib/table/table/state-helpers/display-helpers.mjs +1 -1
  104. package/esm2022/lib/table/table/state-helpers/nesting-helpers.mjs +123 -0
  105. package/esm2022/lib/table/table/state-helpers/order-helpers.mjs +164 -0
  106. package/esm2022/lib/table/table/state-helpers/pagination-helpers.mjs +139 -0
  107. package/esm2022/lib/table/table/state-helpers/result-helpers.mjs +70 -0
  108. package/esm2022/lib/table/table/state-helpers/search-helpers.mjs +72 -0
  109. package/esm2022/lib/table/table/state-helpers/selection-helpers.mjs +180 -0
  110. package/esm2022/lib/table/table/state.mjs +1035 -0
  111. package/esm2022/lib/table/table/table/table.component.mjs +367 -0
  112. package/{esm2020 → esm2022}/lib/table/table/table-collapse-all/table-collapse-all.component.mjs +5 -5
  113. package/esm2022/lib/table/table/table-column-settings/table-column-settings-side-sheet.component.mjs +227 -0
  114. package/esm2022/lib/table/table/table-column-settings/table-column-settings.component.mjs +134 -0
  115. package/esm2022/lib/table/table/table-csv-export/table-csv-export.component.mjs +35 -0
  116. package/{esm2020 → esm2022}/lib/table/table/table-header-resize-handle/table-header-resize-handle.component.mjs +6 -6
  117. package/esm2022/lib/table/table/table-search/table-search.component.mjs +71 -0
  118. package/{esm2020 → esm2022}/lib/table/table/table-search-columns/table-search-columns.component.mjs +4 -4
  119. package/esm2022/lib/visibility/visibility.directive.mjs +34 -0
  120. package/esm2022/lib/visualization/chart/chart-scaling.mjs +380 -0
  121. package/esm2022/lib/visualization/chart/chart.component.mjs +626 -0
  122. package/esm2022/lib/visualization/chart/chart.mjs +3768 -0
  123. package/{esm2020 → esm2022}/lib/visualization/data-table/data-table-cell.component.mjs +5 -5
  124. package/{esm2020 → esm2022}/lib/visualization/data-table/data-table-header-cell.component.mjs +4 -4
  125. package/{esm2020 → esm2022}/lib/visualization/data-table/data-table-row.component.mjs +4 -4
  126. package/{esm2020 → esm2022}/lib/visualization/data-table/data-table.component.mjs +4 -4
  127. package/{esm2020 → esm2022}/lib/visualization/donut/donut.component.mjs +4 -4
  128. package/{esm2020 → esm2022}/lib/visualization/funnel-chart/funnel-chart.component.mjs +5 -5
  129. package/esm2022/lib/visualization/funnel-chart/funnel-chart.helpers.mjs +33 -0
  130. package/{esm2020 → esm2022}/lib/visualization/highlight/highlight.component.mjs +4 -4
  131. package/esm2022/lib/visualization/highlight/highlight.helpers.mjs +20 -0
  132. package/esm2022/lib/visualization/intervals.mjs +63 -0
  133. package/{esm2020 → esm2022}/lib/visualization/issue/issue.component.mjs +4 -4
  134. package/{esm2020 → esm2022}/lib/visualization/legend-item/legend-item.component.mjs +4 -4
  135. package/{esm2020 → esm2022}/lib/visualization/metric/metric.component.mjs +4 -4
  136. package/{esm2020 → esm2022}/lib/visualization/mini-pie/mini-pie.component.mjs +4 -4
  137. package/{esm2020 → esm2022}/lib/visualization/progress/progress.component.mjs +5 -5
  138. package/esm2022/lib/visualization/stacked-column/stacked-column.component.mjs +377 -0
  139. package/esm2022/lib/visualization/stacked-column/stacked-column.helpers.mjs +18 -0
  140. package/esm2022/lib/visualization/stacked-row/stacked-row.component.mjs +270 -0
  141. package/esm2022/lib/visualization/stacked-row/stacked-row.helpers.mjs +74 -0
  142. package/esm2022/lib/visualization/time-series/time-series.component.mjs +374 -0
  143. package/esm2022/lib/visualization/time-series/time-series.helpers.mjs +15 -0
  144. package/esm2022/lib/visualization/trend/trend.component.mjs +51 -0
  145. package/{esm2020 → esm2022}/lib/visualization/zero-state/zero-state.component.mjs +4 -4
  146. package/{fesm2020 → fesm2022}/rivet-health-design-system.mjs +670 -670
  147. package/{fesm2020 → fesm2022}/rivet-health-design-system.mjs.map +1 -1
  148. package/lib/format/svg-text-truncate/svg-text-truncate.directive.d.ts +1 -1
  149. package/lib/format/truncate/truncate.component.d.ts +1 -1
  150. package/lib/icon/icon.component.d.ts +1 -1
  151. package/lib/input/auto-focus/auto-focus.directive.d.ts +1 -1
  152. package/lib/input/button/button.component.d.ts +1 -1
  153. package/lib/input/calendar/calendar.component.d.ts +1 -1
  154. package/lib/input/checkbox/checkbox.component.d.ts +1 -1
  155. package/lib/input/currency-field/currency-field.component.d.ts +1 -1
  156. package/lib/input/date/date.component.d.ts +1 -1
  157. package/lib/input/date-range/date-range.component.d.ts +1 -1
  158. package/lib/input/filter-chip/filter-chip.component.d.ts +1 -1
  159. package/lib/input/filter-dropdown/filter-dropdown.component.d.ts +1 -1
  160. package/lib/input/input-label/input-label.component.d.ts +1 -1
  161. package/lib/input/mentions-input/mentions-input.component.d.ts +1 -1
  162. package/lib/input/number-field/number-field.component.d.ts +1 -1
  163. package/lib/input/percentage-field/percentage-field.component.d.ts +1 -1
  164. package/lib/input/phone-field/phone-field.component.d.ts +1 -1
  165. package/lib/input/radio/radio.component.d.ts +1 -1
  166. package/lib/input/search/search.component.d.ts +1 -1
  167. package/lib/input/search-select/search-select.component.d.ts +1 -1
  168. package/lib/input/select/select/select.component.d.ts +1 -1
  169. package/lib/input/select/select-node/select-node.component.d.ts +1 -1
  170. package/lib/input/simple-select/simple-select.component.d.ts +1 -1
  171. package/lib/input/switch-checkbox/switch-checkbox.component.d.ts +1 -1
  172. package/lib/input/text-field/text-field.component.d.ts +1 -1
  173. package/lib/input/textarea-field/textarea-field.component.d.ts +1 -1
  174. package/lib/input/validation-message/validation-message.component.d.ts +1 -1
  175. package/lib/layout/card/card-actions.component.d.ts +1 -1
  176. package/lib/layout/card/card-content.component.d.ts +1 -1
  177. package/lib/layout/card/card-header.component.d.ts +1 -1
  178. package/lib/layout/card/card-link.component.d.ts +1 -1
  179. package/lib/layout/card/card-media.component.d.ts +1 -1
  180. package/lib/layout/card/card.component.d.ts +1 -1
  181. package/lib/layout/setting-row/setting-row.component.d.ts +1 -1
  182. package/lib/load/loading/loading.component.d.ts +1 -1
  183. package/lib/load/loading-cover/loading-cover.component.d.ts +1 -1
  184. package/lib/navigation/editable-heading/editable-heading.component.d.ts +1 -1
  185. package/lib/navigation/link/link.component.d.ts +1 -1
  186. package/lib/navigation/page-header/page-header.component.d.ts +1 -1
  187. package/lib/navigation/simple-tabs/simple-tab/simple-tab.component.d.ts +1 -1
  188. package/lib/navigation/tabs/tab/tab.component.d.ts +1 -1
  189. package/lib/navigation/views/all-views-modal/all-views-modal.component.d.ts +1 -1
  190. package/lib/navigation/views/edit-view/edit-view.component.d.ts +1 -1
  191. package/lib/navigation/views/permission-picker/permission-picker.component.d.ts +3 -3
  192. package/lib/navigation/views/view-menu/view-menu.component.d.ts +1 -1
  193. package/lib/navigation/views/views/views.component.d.ts +1 -1
  194. package/lib/notification/badge/badge.component.d.ts +1 -1
  195. package/lib/notification/banner/banner-action.component.d.ts +1 -1
  196. package/lib/notification/banner/banner.component.d.ts +1 -1
  197. package/lib/notification/map-indicator/map-indicator.component.d.ts +1 -1
  198. package/lib/notification/notification-badge/notification-badge.component.d.ts +1 -1
  199. package/lib/overlay/callout/callout.component.d.ts +1 -1
  200. package/lib/overlay/callout/help/help.component.d.ts +1 -1
  201. package/lib/overlay/callout/lock-scroll.directive.d.ts +1 -1
  202. package/lib/overlay/callout/menu/menu-item/menu-item.component.d.ts +1 -1
  203. package/lib/overlay/callout/menu/menu.component.d.ts +1 -1
  204. package/lib/overlay/callout/tooltip/locked-tooltip.directive.d.ts +1 -1
  205. package/lib/overlay/callout/tooltip/tooltip.component.d.ts +1 -1
  206. package/lib/overlay/callout/tooltip/tooltip.directive.d.ts +1 -1
  207. package/lib/overlay/modal/dialog/dialog.component.d.ts +1 -1
  208. package/lib/overlay/modal/form-dialog/form-dialog.component.d.ts +1 -1
  209. package/lib/overlay/modal/modal.component.d.ts +1 -1
  210. package/lib/overlay/modal/side-sheet/side-sheet.component.d.ts +1 -1
  211. package/lib/overlay/toast/toast.component.d.ts +1 -1
  212. package/lib/table/simple-table/simple-table-header-cell.component.d.ts +1 -1
  213. package/lib/table/simple-table/simple-table-row.component.d.ts +1 -1
  214. package/lib/table/table/table/table.component.d.ts +1 -1
  215. package/lib/table/table/table-collapse-all/table-collapse-all.component.d.ts +1 -1
  216. package/lib/table/table/table-column-settings/table-column-settings-side-sheet.component.d.ts +1 -1
  217. package/lib/table/table/table-column-settings/table-column-settings.component.d.ts +1 -1
  218. package/lib/table/table/table-csv-export/table-csv-export.component.d.ts +1 -1
  219. package/lib/table/table/table-search/table-search.component.d.ts +1 -1
  220. package/lib/table/table/table-search-columns/table-search-columns.component.d.ts +1 -1
  221. package/lib/visualization/chart/chart.component.d.ts +1 -1
  222. package/lib/visualization/data-table/data-table-row.component.d.ts +1 -1
  223. package/lib/visualization/donut/donut.component.d.ts +1 -1
  224. package/lib/visualization/funnel-chart/funnel-chart.component.d.ts +1 -1
  225. package/lib/visualization/highlight/highlight.component.d.ts +1 -1
  226. package/lib/visualization/issue/issue.component.d.ts +1 -1
  227. package/lib/visualization/legend-item/legend-item.component.d.ts +1 -1
  228. package/lib/visualization/metric/metric.component.d.ts +1 -1
  229. package/lib/visualization/mini-pie/mini-pie.component.d.ts +1 -1
  230. package/lib/visualization/progress/progress.component.d.ts +1 -1
  231. package/lib/visualization/stacked-column/stacked-column.component.d.ts +3 -3
  232. package/lib/visualization/stacked-row/stacked-row.component.d.ts +1 -1
  233. package/lib/visualization/time-series/time-series.component.d.ts +3 -3
  234. package/lib/visualization/trend/trend.component.d.ts +1 -1
  235. package/lib/visualization/zero-state/zero-state.component.d.ts +1 -1
  236. package/package.json +5 -11
  237. package/esm2020/lib/download/download.service.mjs +0 -47
  238. package/esm2020/lib/format/pipes/sentence-case.pipe.mjs +0 -61
  239. package/esm2020/lib/format/pipes/small-currency.pipe.mjs +0 -24
  240. package/esm2020/lib/format/pipes/small-number.pipe.mjs +0 -29
  241. package/esm2020/lib/format/svg-text-truncate/svg-text-truncate.directive.mjs +0 -62
  242. package/esm2020/lib/format/truncate/truncate.component.mjs +0 -51
  243. package/esm2020/lib/icon/dom-cache.mjs +0 -32
  244. package/esm2020/lib/icon/icon.component.mjs +0 -86
  245. package/esm2020/lib/input/auto-focus/auto-focus.directive.mjs +0 -48
  246. package/esm2020/lib/input/button/button.component.mjs +0 -139
  247. package/esm2020/lib/input/button-group/button-group.component.mjs +0 -39
  248. package/esm2020/lib/input/date/date.component.mjs +0 -279
  249. package/esm2020/lib/input/date-range/date-range.component.mjs +0 -477
  250. package/esm2020/lib/input/filter-chip/filter-chip.component.mjs +0 -47
  251. package/esm2020/lib/input/mentions-input/mentions-input.component.mjs +0 -745
  252. package/esm2020/lib/input/number-field/number-field.component.mjs +0 -125
  253. package/esm2020/lib/input/phone-field/phone-field.component.mjs +0 -74
  254. package/esm2020/lib/input/search-select/search-select.component.mjs +0 -189
  255. package/esm2020/lib/input/select/select/select.component.mjs +0 -178
  256. package/esm2020/lib/input/select/state.mjs +0 -882
  257. package/esm2020/lib/input/simple-select/simple-select.component.mjs +0 -178
  258. package/esm2020/lib/input/switch-checkbox/switch-checkbox.component.mjs +0 -33
  259. package/esm2020/lib/input/text-field/text-field.component.mjs +0 -115
  260. package/esm2020/lib/layout/card/card-content.component.mjs +0 -64
  261. package/esm2020/lib/layout/card/card-header.component.mjs +0 -201
  262. package/esm2020/lib/layout/card/card.component.mjs +0 -291
  263. package/esm2020/lib/load/loading/loading.component.mjs +0 -43
  264. package/esm2020/lib/navigation/editable-heading/editable-heading.component.mjs +0 -243
  265. package/esm2020/lib/navigation/views/permission-picker/permission-picker.component.mjs +0 -151
  266. package/esm2020/lib/navigation/views/state.mjs +0 -456
  267. package/esm2020/lib/navigation/views/views/views.component.mjs +0 -90
  268. package/esm2020/lib/notification/banner/banner-action.component.mjs +0 -48
  269. package/esm2020/lib/notification/banner/banner.component.mjs +0 -61
  270. package/esm2020/lib/notification/map-indicator/map-indicator.component.mjs +0 -50
  271. package/esm2020/lib/notification/map-indicator/map-indicators.mjs +0 -15
  272. package/esm2020/lib/overlay/callout/callout.component.mjs +0 -130
  273. package/esm2020/lib/overlay/callout/callout.helpers.mjs +0 -113
  274. package/esm2020/lib/overlay/callout/lock-scroll.directive.mjs +0 -69
  275. package/esm2020/lib/overlay/callout/tooltip/locked-tooltip.directive.mjs +0 -30
  276. package/esm2020/lib/overlay/callout/tooltip/tooltip.directive.mjs +0 -138
  277. package/esm2020/lib/overlay/modal/dialog/dialog.component.mjs +0 -47
  278. package/esm2020/lib/overlay/modal/form-dialog/form-dialog.component.mjs +0 -146
  279. package/esm2020/lib/overlay/modal/modal.component.mjs +0 -31
  280. package/esm2020/lib/overlay/overlay-outlet.component.mjs +0 -98
  281. package/esm2020/lib/overlay/toast/toast.component.mjs +0 -41
  282. package/esm2020/lib/size/size.directive.mjs +0 -33
  283. package/esm2020/lib/table/simple-table/coordinate-helper.mjs +0 -61
  284. package/esm2020/lib/table/simple-table/simple-table-cell.component.mjs +0 -36
  285. package/esm2020/lib/table/simple-table/simple-table-header-cell.component.mjs +0 -37
  286. package/esm2020/lib/table/simple-table/simple-table.component.mjs +0 -104
  287. package/esm2020/lib/table/table/clipboard.mjs +0 -182
  288. package/esm2020/lib/table/table/state-helpers/collapse-helpers.mjs +0 -116
  289. package/esm2020/lib/table/table/state-helpers/column-helpers.mjs +0 -383
  290. package/esm2020/lib/table/table/state-helpers/nesting-helpers.mjs +0 -123
  291. package/esm2020/lib/table/table/state-helpers/order-helpers.mjs +0 -164
  292. package/esm2020/lib/table/table/state-helpers/pagination-helpers.mjs +0 -139
  293. package/esm2020/lib/table/table/state-helpers/result-helpers.mjs +0 -70
  294. package/esm2020/lib/table/table/state-helpers/search-helpers.mjs +0 -72
  295. package/esm2020/lib/table/table/state-helpers/selection-helpers.mjs +0 -180
  296. package/esm2020/lib/table/table/state.mjs +0 -1035
  297. package/esm2020/lib/table/table/table/table.component.mjs +0 -367
  298. package/esm2020/lib/table/table/table-column-settings/table-column-settings-side-sheet.component.mjs +0 -227
  299. package/esm2020/lib/table/table/table-column-settings/table-column-settings.component.mjs +0 -134
  300. package/esm2020/lib/table/table/table-csv-export/table-csv-export.component.mjs +0 -35
  301. package/esm2020/lib/table/table/table-search/table-search.component.mjs +0 -71
  302. package/esm2020/lib/visibility/visibility.directive.mjs +0 -34
  303. package/esm2020/lib/visualization/chart/chart-scaling.mjs +0 -380
  304. package/esm2020/lib/visualization/chart/chart.component.mjs +0 -626
  305. package/esm2020/lib/visualization/chart/chart.mjs +0 -3768
  306. package/esm2020/lib/visualization/funnel-chart/funnel-chart.helpers.mjs +0 -33
  307. package/esm2020/lib/visualization/highlight/highlight.helpers.mjs +0 -20
  308. package/esm2020/lib/visualization/intervals.mjs +0 -63
  309. package/esm2020/lib/visualization/stacked-column/stacked-column.component.mjs +0 -377
  310. package/esm2020/lib/visualization/stacked-column/stacked-column.helpers.mjs +0 -18
  311. package/esm2020/lib/visualization/stacked-row/stacked-row.component.mjs +0 -270
  312. package/esm2020/lib/visualization/stacked-row/stacked-row.helpers.mjs +0 -74
  313. package/esm2020/lib/visualization/time-series/time-series.component.mjs +0 -374
  314. package/esm2020/lib/visualization/time-series/time-series.helpers.mjs +0 -15
  315. package/esm2020/lib/visualization/trend/trend.component.mjs +0 -51
  316. package/fesm2015/rivet-health-design-system.mjs +0 -18370
  317. package/fesm2015/rivet-health-design-system.mjs.map +0 -1
  318. /package/{esm2020 → esm2022}/lib/overlay/callout/select-callout-defaults.mjs +0 -0
  319. /package/{esm2020 → esm2022}/lib/util/local-storage.mjs +0 -0
  320. /package/{esm2020 → esm2022}/public-api.mjs +0 -0
  321. /package/{esm2020 → esm2022}/rivet-health-design-system.mjs +0 -0
@@ -1,377 +0,0 @@
1
- import { ChangeDetectionStrategy, Component, ContentChild, EventEmitter, Input, Output, TemplateRef, ViewChild, } from '@angular/core';
2
- import { index } from 'd3-array';
3
- import { scaleBand, scaleLinear } from 'd3-scale';
4
- import { stack } from 'd3-shape';
5
- import { utcFormat } from 'd3-time-format';
6
- import { BehaviorSubject, combineLatest, map, shareReplay, } from 'rxjs';
7
- import { getIntervalTitle, getMajorInterval, getMajorIntervalFormat, getMinorIntervalFormat, getTimeInterval, intervals, } from '../intervals';
8
- import { getDateRange, pointReducer } from './stacked-column.helpers';
9
- import * as i0 from "@angular/core";
10
- import * as i1 from "@angular/common";
11
- import * as i2 from "../../overlay/callout/callout.component";
12
- import * as i3 from "../legend-item/legend-item.component";
13
- import * as i4 from "../../overlay/overlay.directive";
14
- import * as i5 from "../../input/simple-select/simple-select.component";
15
- import * as i6 from "../../size/size.directive";
16
- import * as i7 from "../zero-state/zero-state.component";
17
- import * as i8 from "../../input/simple-select/option-group.pipe";
18
- const DEFAULT_INTERVAL = 'month';
19
- // TODO: once we upgrade to Angular 16, this component can be cleaned up with
20
- // signals instead of RxJS.
21
- // https://www.notion.so/rivet/Resolve-TODOs-after-Angular-upgrade-1f2667eb2a3180b79f6ad92a7e576f08
22
- export class StackedColumnComponent {
23
- constructor() {
24
- this.input$ = new BehaviorSubject([]);
25
- this.width$ = new BehaviorSubject(960);
26
- this.HEIGHT = 300;
27
- this.valueFormatter = v => v.toString();
28
- this.interval$ = new BehaviorSubject(DEFAULT_INTERVAL);
29
- this.intervalChanged = new EventEmitter();
30
- this.stackClicked = new EventEmitter();
31
- this.COLUMN_WIDTHS = [8, 16, 40, 72];
32
- this.MIN_COLUMN_WIDTH = this.COLUMN_WIDTHS[0];
33
- this.maxColumns$ = this.width$.pipe(map(width => {
34
- const innerWidth = width - this.LEFT_OFFSET;
35
- const columnWidthWithPadding = this.MIN_COLUMN_WIDTH + this.COLUMN_PADDING * 2;
36
- return Math.floor(innerWidth / columnWidthWithPadding);
37
- }), shareReplay({ refCount: true, bufferSize: 1 }));
38
- this.allowedIntervals$ = combineLatest([
39
- this.input$,
40
- this.maxColumns$,
41
- ]).pipe(map(([input, maxColumns]) => {
42
- const [minDate, maxDate] = getDateRange(input);
43
- return intervals.filter(interval => {
44
- const xStepsCount = this.getXStepsInRange(interval, minDate, maxDate);
45
- return input.length * xStepsCount <= maxColumns;
46
- });
47
- }), shareReplay({ refCount: true, bufferSize: 1 }));
48
- this.intervalOptions$ = this.allowedIntervals$.pipe(map(intervals => intervals.map((interval) => ({
49
- id: interval,
50
- title: getIntervalTitle(interval),
51
- }))), shareReplay({ refCount: true, bufferSize: 1 }));
52
- this.selectedIntervalOption$ = combineLatest([
53
- this.interval$,
54
- this.intervalOptions$,
55
- ]).pipe(map(([interval, options]) => {
56
- const allowedIntervals = options.map(({ id }) => id);
57
- if (!allowedIntervals.includes(interval)) {
58
- const firstAllowed = allowedIntervals.at(0);
59
- const lastAllowed = allowedIntervals.at(-1);
60
- if (!firstAllowed || !lastAllowed)
61
- return null;
62
- if (intervals.indexOf(interval) < intervals.indexOf(firstAllowed))
63
- interval = firstAllowed;
64
- if (intervals.indexOf(interval) > intervals.indexOf(lastAllowed))
65
- interval = lastAllowed;
66
- }
67
- return options.find(o => o.id === interval) ?? null;
68
- }), shareReplay({ refCount: true, bufferSize: 1 }));
69
- this.selectedInterval$ = this.selectedIntervalOption$.pipe(map(option => (option ? option.id : DEFAULT_INTERVAL)));
70
- this.columnWidth$ = combineLatest([
71
- this.input$,
72
- this.selectedInterval$,
73
- this.width$,
74
- ]).pipe(map(([input, selectedInterval, width]) => {
75
- const [minDate, maxDate] = getDateRange(input);
76
- const xStepCount = this.getXStepsInRange(selectedInterval, minDate, maxDate);
77
- const innerWidth = width - this.LEFT_OFFSET;
78
- const allowedColumnWidths = this.COLUMN_WIDTHS.filter(columnWidth => {
79
- const columnWidthWithPadding = columnWidth + this.COLUMN_PADDING * 2;
80
- return (innerWidth - input.length * xStepCount * columnWidthWithPadding >= 0);
81
- });
82
- const columnWidth = allowedColumnWidths.at(-1);
83
- if (!columnWidth)
84
- return 0;
85
- return columnWidth;
86
- }), shareReplay({ refCount: true, bufferSize: 1 }));
87
- this.binnedDataWithRanges$ = combineLatest([this.input$, this.selectedInterval$]).pipe(map(([input, interval]) => {
88
- const rangeMap = new Map();
89
- const stacks = input.map((stack) => {
90
- const timeInterval = getTimeInterval(interval);
91
- const series = stack.series.map(series => {
92
- const binned = new Map();
93
- for (const point of series.data) {
94
- const binKey = timeInterval.floor(point.date).valueOf();
95
- const maxDate = rangeMap.get(binKey);
96
- if (!maxDate || maxDate < point.date) {
97
- rangeMap.set(binKey, point.date);
98
- }
99
- if (!binned.has(binKey)) {
100
- binned.set(binKey, []);
101
- }
102
- const bin = binned.get(binKey);
103
- bin.push(point);
104
- }
105
- return {
106
- ...series,
107
- data: [...binned.entries()].map(([dateValue, points]) => ({
108
- date: new Date(dateValue),
109
- value: pointReducer(points),
110
- })),
111
- };
112
- });
113
- return {
114
- ...stack,
115
- series: series,
116
- };
117
- });
118
- return {
119
- stacks,
120
- getRange: (date) => {
121
- return {
122
- minDate: new Date(date),
123
- maxDate: rangeMap.get(date),
124
- };
125
- },
126
- };
127
- }), shareReplay({ refCount: true, bufferSize: 1 }));
128
- this.binnedData$ = this.binnedDataWithRanges$.pipe(map(binnedData => binnedData.stacks));
129
- this.getRange$ = this.binnedDataWithRanges$.pipe(map(binnedData => binnedData.getRange));
130
- this.LEFT_OFFSET = 48;
131
- this.COLUMN_PADDING = 4;
132
- this.drawData$ = combineLatest([
133
- this.binnedData$,
134
- this.width$,
135
- this.selectedInterval$,
136
- this.columnWidth$,
137
- ]).pipe(map(([binnedData, width, interval, columnWidth]) => {
138
- const viewBox = `0 0 ${width} ${this.HEIGHT}`;
139
- const padding = 16;
140
- const [minDate, maxDate] = getDateRange(binnedData);
141
- const hasMultipleYears = minDate.getFullYear() < maxDate.getFullYear();
142
- const xMinorIntervalFormat = getMinorIntervalFormat(interval);
143
- const minorFormatter = utcFormat(xMinorIntervalFormat);
144
- const minorTimeInterval = getTimeInterval(interval);
145
- const xSteps = minorTimeInterval.range(minorTimeInterval.floor(minDate), minorTimeInterval.floor(minorTimeInterval.offset(maxDate, 1)));
146
- const xMajorInterval = getMajorInterval(interval);
147
- const xMajorIntervalFormat = getMajorIntervalFormat(xMajorInterval, hasMultipleYears);
148
- const majorFormatter = utcFormat(xMajorIntervalFormat);
149
- const fullFormatter = utcFormat(`${xMinorIntervalFormat} ${xMajorIntervalFormat}`);
150
- const xOuterScale = scaleBand()
151
- .domain(xSteps.map(date => fullFormatter(date)))
152
- .range([this.LEFT_OFFSET, width]);
153
- const outerPadding = (xOuterScale.bandwidth() -
154
- (this.COLUMN_PADDING * (binnedData.length - 1) +
155
- columnWidth * binnedData.length)) /
156
- 2;
157
- const renderInformation = binnedData.map(stackData => {
158
- /*
159
- Create an array with every data point + their associated series.
160
- i.e. Make an backlink for each element to its series.
161
- */
162
- const stackedTable = stackData.series.reduce((table, s) => [
163
- ...table,
164
- ...s.data.map(point => ({
165
- ...point,
166
- series: s,
167
- })),
168
- ], []);
169
- /*
170
- Maps each of the SeriesPoints based on label.
171
- Then map each of those maps to a date.
172
-
173
- Example:
174
- If we were indexing the following data:
175
- * Estimates Complete -> 5 in January, 7 in February
176
- * Estimates Incomplete -> 3 in January, 3 in February
177
- We would get an indexed table like the following, (note this is pseudocode):
178
- 'January': { 'Estimates Complete': 5, 'Estimates Incomplete': 3 }
179
- 'February': { 'Estimates Complete': 7, 'Estimates Incomplete': 3 }
180
- */
181
- const indexedTable = index(stackedTable, d => d.date, d => d.series.label);
182
- /*
183
- The output of "stack()" is an array of arrays of tuples.
184
- The tuples unnest as [baseline, topline].
185
- Each "key" involved in the stack has an array of tuples relating to it.
186
- i.e. [ Date 1 Tuple, Date 2 Tuple ]
187
- All "key" arrays are contained in the outer array.
188
- i.e. [ Key 1 Tuples, Key 2 Tuples]
189
-
190
- We select the keys using ".keys()".
191
- For our purposes, the keys are the legend elements.
192
- i.e. If you have two blocks of the same color, they have the same key.
193
-
194
- We select the heights of the blocks using ".value()".
195
-
196
- We are going to stack the blocks on top of each other.
197
- The baseline of the first key tuples are 0.
198
- The baseline of the second key tuples are the topline of the associated first key tuple.
199
-
200
- Example:
201
- If we were stacking the following data:
202
- * Estimates Complete -> 5 in January, 7 in February
203
- * Estimates Incomplete -> 3 in January, 3 in February
204
- We would get a stack of:
205
- [ [ [0,5],[0,7] ], [ [5,8],[7,10] ] ]
206
- */
207
- const stacked = stack()
208
- .keys(stackData.series.map(v => v.label))
209
- .value(([_, group], key) => {
210
- return group.get(key).value;
211
- })(indexedTable);
212
- return { indexedTable, stacked };
213
- });
214
- // The domain should be based on the highest value in any stack, on any date.
215
- let domainMax = 0;
216
- // For each unique stack,
217
- renderInformation.forEach(({ stacked, indexedTable }) => {
218
- // For each date,
219
- [...indexedTable.values()].forEach((pointMap, i) => {
220
- // For each series,
221
- [...pointMap.values()].forEach((_, j) => {
222
- domainMax = Math.max(domainMax, ...stacked[j][i]);
223
- });
224
- });
225
- });
226
- if (domainMax === 0)
227
- domainMax = 1;
228
- const yScale = scaleLinear()
229
- .domain([0, domainMax])
230
- .range([this.HEIGHT - padding * 2, padding]);
231
- const rects = [];
232
- // For each unique stack,
233
- renderInformation.forEach(({ stacked, indexedTable }, index) => {
234
- // For each date,
235
- [...indexedTable.entries()].forEach(([date, pointMap], i) => {
236
- // For each series,
237
- [...pointMap.entries()].forEach(([_, seriesPoint], j) => {
238
- // Get the size of the box we are about to draw.
239
- const [baseline, topline] = stacked[j][i];
240
- const width = columnWidth;
241
- const height = yScale(baseline) - yScale(topline);
242
- const x = (xOuterScale(fullFormatter(date)) ?? 0) +
243
- outerPadding +
244
- columnWidth * index +
245
- this.COLUMN_PADDING * index;
246
- const y = yScale(baseline) - height;
247
- const fill = `var(${seriesPoint.series.colorToken})`;
248
- rects.push({
249
- dateValue: date.valueOf(),
250
- x,
251
- y,
252
- width,
253
- height,
254
- fill,
255
- striped: seriesPoint.series.style === 'striped',
256
- seriesPoint,
257
- });
258
- });
259
- });
260
- });
261
- const xMinorTicks = xSteps.map(date => ({
262
- dateValue: date.valueOf(),
263
- label: minorFormatter(date),
264
- x: (xOuterScale(fullFormatter(date)) ?? 0) + xOuterScale.bandwidth() / 2,
265
- }));
266
- const xMajorTicks = interval !== 'year'
267
- ? xSteps
268
- .map(date => ({
269
- dateValue: date.valueOf(),
270
- label: majorFormatter(date),
271
- x: (xOuterScale(fullFormatter(date)) ?? 0) +
272
- xOuterScale.bandwidth() / 2,
273
- }))
274
- .filter((tick, i, ticks) => i === 0 || tick.label !== ticks[i - 1].label)
275
- : [];
276
- const yTicks = yScale.ticks(5);
277
- const hoverBandWidth = renderInformation.length * columnWidth +
278
- (renderInformation.length + 1) * this.COLUMN_PADDING;
279
- const hoverBands = xSteps.map(date => ({
280
- dateValue: date.valueOf(),
281
- x: (xOuterScale(fullFormatter(date)) ?? 0) +
282
- (xOuterScale.bandwidth() - hoverBandWidth) / 2,
283
- y: yScale(domainMax),
284
- width: hoverBandWidth,
285
- height: yScale(0) - yScale(domainMax),
286
- }));
287
- return {
288
- columnWidth,
289
- hoverBands,
290
- rects,
291
- viewBox,
292
- xMinorTicks,
293
- xMajorTicks,
294
- yScale,
295
- yTicks,
296
- };
297
- }), shareReplay({ refCount: true, bufferSize: 1 }));
298
- this.empty$ = this.input$.pipe(map(input => input.every(stack => stack.series.every(series => series.data.length === 0))), shareReplay({ refCount: true, bufferSize: 1 }));
299
- this.hoveredBand$ = new BehaviorSubject(null);
300
- this.callout$ = combineLatest([this.hoveredBand$, this.binnedData$]).pipe(map(([hoveredBand, binnedData]) => {
301
- if (!hoveredBand)
302
- return null;
303
- const { target } = hoveredBand.event;
304
- if (!target)
305
- return null;
306
- const anchor = target.getBoundingClientRect();
307
- return {
308
- anchor,
309
- content: binnedData.map(stack => {
310
- const seriesPoints = stack.series.map(series => ({
311
- label: series.label,
312
- colorToken: series.colorToken,
313
- style: series.style,
314
- value: series.data.find(({ date }) => date.valueOf() === hoveredBand.dateValue)?.value ?? 0,
315
- }));
316
- return {
317
- title: stack.title,
318
- total: this.valueFormatter(seriesPoints.reduce((acc, point) => point.value + acc, 0)),
319
- series: seriesPoints.map(point => ({
320
- ...point,
321
- formattedValue: this.valueFormatter(point.value),
322
- })),
323
- };
324
- }),
325
- };
326
- }), shareReplay({ refCount: true, bufferSize: 1 }));
327
- }
328
- set input(v) {
329
- this.input$.next(v);
330
- }
331
- get input() {
332
- return this.input$.getValue();
333
- }
334
- set width(v) {
335
- this.width$.next(v);
336
- }
337
- set interval(v) {
338
- if (v !== this.interval$.getValue()) {
339
- this.interval$.next(v);
340
- this.intervalChanged.emit(v);
341
- }
342
- }
343
- get interval() {
344
- return this.interval$.getValue();
345
- }
346
- getXStepsInRange(interval, minDate, maxDate) {
347
- const timeInterval = getTimeInterval(interval);
348
- return timeInterval.range(timeInterval.floor(minDate), timeInterval.floor(timeInterval.offset(maxDate, 1))).length;
349
- }
350
- setIntervalOption(option) {
351
- if (option)
352
- this.interval = option.id;
353
- }
354
- }
355
- StackedColumnComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: StackedColumnComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
356
- StackedColumnComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: StackedColumnComponent, selector: "riv-stacked-column", inputs: { input: "input", valueFormatter: "valueFormatter", interval: "interval" }, outputs: { intervalChanged: "intervalChanged", stackClicked: "stackClicked" }, queries: [{ propertyName: "calloutHeaderTemplate", first: true, predicate: TemplateRef, descendants: true }], viewQueries: [{ propertyName: "controls", first: true, predicate: ["controls"], descendants: true }], ngImport: i0, template: "<div\n *ngIf=\"(empty$ | async) === false; else zeroState\"\n class=\"container\"\n (rivClientSize)=\"width = $event.width\"\n>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n *ngIf=\"drawData$ | async; let d\"\n [attr.viewBox]=\"d.viewBox\"\n >\n <defs>\n <pattern\n id=\"stripes\"\n x=\"0\"\n y=\"0\"\n [attr.width]=\"d.columnWidth\"\n [attr.height]=\"d.columnWidth\"\n patternUnits=\"userSpaceOnUse\"\n >\n <line\n x1=\"0\"\n [attr.y1]=\"d.columnWidth\"\n [attr.x2]=\"d.columnWidth\"\n y2=\"0\"\n stroke=\"var(--white-100)\"\n stroke-width=\"1\"\n ></line>\n </pattern>\n </defs>\n <g *ngFor=\"let tick of d.xMinorTicks\">\n <rect\n class=\"tick-background\"\n [class.focused]=\"(hoveredBand$ | async)?.dateValue === tick.dateValue\"\n [attr.x]=\"tick.x - 20\"\n [attr.y]=\"d.yScale(0) + 3\"\n width=\"40\"\n height=\"12\"\n rx=\"2\"\n ></rect>\n <text\n class=\"tick-label\"\n [attr.x]=\"tick.x\"\n [attr.y]=\"d.yScale(0) + 12\"\n text-anchor=\"middle\"\n >\n {{ tick.label }}\n </text>\n </g>\n <g *ngFor=\"let tick of d.xMajorTicks\">\n <text\n class=\"tick-label\"\n [attr.x]=\"tick.x\"\n [attr.y]=\"d.yScale(0) + 24\"\n text-anchor=\"middle\"\n >\n {{ tick.label }}\n </text>\n </g>\n <g *ngFor=\"let tick of d.yTicks\">\n <rect\n class=\"tick\"\n x=\"0\"\n [attr.y]=\"d.yScale(tick)\"\n width=\"100%\"\n height=\"1\"\n ></rect>\n <text class=\"tick-label\" x=\"0\" [attr.y]=\"d.yScale(tick)\" dy=\"-4\">\n {{ valueFormatter(tick) }}\n </text>\n </g>\n <g *ngFor=\"let rect of d.rects\">\n <rect\n class=\"column\"\n [attr.x]=\"rect.x\"\n [attr.y]=\"rect.y\"\n [attr.width]=\"rect.width\"\n [attr.height]=\"rect.height\"\n [attr.fill]=\"rect.fill\"\n [class.blurred]=\"\n (hoveredBand$ | async) !== null &&\n (hoveredBand$ | async)?.dateValue !== rect.dateValue\n \"\n ></rect>\n <rect\n *ngIf=\"rect.striped\"\n [attr.x]=\"rect.x\"\n [attr.y]=\"rect.y\"\n [attr.width]=\"rect.width\"\n [attr.height]=\"rect.height\"\n fill=\"url(#stripes)\"\n ></rect>\n </g>\n <ng-container *ngIf=\"getRange$ | async; let getRange\">\n <rect\n *ngFor=\"let rect of d.hoverBands\"\n [attr.x]=\"rect.x\"\n [attr.y]=\"rect.y\"\n [attr.width]=\"rect.width\"\n [attr.height]=\"rect.height\"\n fill=\"transparent\"\n (mouseenter)=\"\n hoveredBand$.next({ dateValue: rect.dateValue, event: $event })\n \"\n (mouseleave)=\"hoveredBand$.next(null)\"\n (click)=\"\n stackClicked.emit(getRange(rect.dateValue)); hoveredBand$.next(null)\n \"\n ></rect>\n </ng-container>\n </svg>\n</div>\n\n<ng-container *ngIf=\"callout$ | async; let callout\">\n <riv-callout\n *riv-overlay\n [anchor]=\"callout?.anchor ?? null\"\n [theme]=\"'light'\"\n [isModal]=\"false\"\n [preferredPosition]=\"'center-right'\"\n [allowedPositions]=\"[\n 'center-right',\n 'center-left',\n 'top-center',\n 'bottom-center'\n ]\"\n >\n <div class=\"callout-content\">\n <ng-container\n [ngTemplateOutlet]=\"calloutHeaderTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: callout }\"\n ></ng-container>\n <div class=\"callout-stack\" *ngFor=\"let stack of callout?.content\">\n <div *ngIf=\"stack.title; let title\" class=\"callout-row\">\n <span class=\"series-label\">{{ title }}</span>\n <span>{{ stack.total }}</span>\n </div>\n <div *ngFor=\"let series of stack.series\" class=\"callout-row\">\n <span class=\"series-label\">\n <riv-legend-item\n [colorToken]=\"series.colorToken\"\n [style]=\"series.style\"\n ></riv-legend-item>\n <span>{{ series.label }}</span>\n </span>\n <span>{{ series.formattedValue }}</span>\n </div>\n </div>\n </div>\n </riv-callout>\n</ng-container>\n\n<ng-template #zeroState>\n <riv-zero-state></riv-zero-state>\n</ng-template>\n\n<ng-template #controls>\n <riv-simple-select\n [optionGroups]=\"intervalOptions$ | async | rivOptionGroup\"\n [orderBy]=\"'source'\"\n [selectedOption]=\"selectedIntervalOption$ | async\"\n (selectedOptionChange)=\"setIntervalOption($event)\"\n ></riv-simple-select>\n</ng-template>\n", styles: [".tick{fill:var(--gray-20)}.tick-label{font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-0);fill:var(--type-light-low-contrast)}.tick-background{transition:fill var(--short-transition);fill:transparent}.tick-background.focused{fill:var(--baloo-10)}.column{transition:opacity var(--short-transition)}.column.blurred{opacity:.4}.callout-content{padding:var(--size-medium) var(--size-xlarge);display:flex;flex-direction:column}.callout-stack{display:flex;flex-direction:column;padding:var(--size-medium) 0;gap:var(--size-medium)}.callout-stack:not(:last-child){border-bottom:var(--border-width) solid var(--border-light)}.callout-row{display:flex;gap:var(--size-large);align-items:center;font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-0)}.series-label{flex-grow:1;font-weight:var(--font-weight-heavy);display:flex;align-items:center;gap:var(--size-small)}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i2.CalloutComponent, selector: "riv-callout", inputs: ["anchor", "isModal", "preferredPosition", "allowedPositions", "fallbackDirection", "showCaret", "theme"], outputs: ["close"] }, { kind: "component", type: i3.LegendItemComponent, selector: "riv-legend-item", inputs: ["label", "colorToken", "style", "visibility", "iconTooltip", "clickable", "showCheckWhenClickable"], outputs: ["itemClick"] }, { kind: "directive", type: i4.OverlayDirective, selector: "[riv-overlay]" }, { kind: "component", type: i5.SimpleSelectComponent, selector: "riv-simple-select", inputs: ["optionGroups", "selectedOption", "size", "disabled", "locked", "filterabilityOptions", "orderBy", "placeholder", "maxHeight", "maxWidth", "minHeight", "minWidth", "dividers", "sortSelectedToTop", "grow", "preferredCalloutPosition", "allowedCalloutPositions"], outputs: ["selectedOptionChange"] }, { kind: "directive", type: i6.SizeDirective, selector: "[rivClientSize]", outputs: ["rivClientSize"] }, { kind: "component", type: i7.ZeroStateComponent, selector: "riv-zero-state", inputs: ["message", "title", "icon"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "pipe", type: i8.OptionGroupPipe, name: "rivOptionGroup" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
357
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: StackedColumnComponent, decorators: [{
358
- type: Component,
359
- args: [{ selector: 'riv-stacked-column', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n *ngIf=\"(empty$ | async) === false; else zeroState\"\n class=\"container\"\n (rivClientSize)=\"width = $event.width\"\n>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n *ngIf=\"drawData$ | async; let d\"\n [attr.viewBox]=\"d.viewBox\"\n >\n <defs>\n <pattern\n id=\"stripes\"\n x=\"0\"\n y=\"0\"\n [attr.width]=\"d.columnWidth\"\n [attr.height]=\"d.columnWidth\"\n patternUnits=\"userSpaceOnUse\"\n >\n <line\n x1=\"0\"\n [attr.y1]=\"d.columnWidth\"\n [attr.x2]=\"d.columnWidth\"\n y2=\"0\"\n stroke=\"var(--white-100)\"\n stroke-width=\"1\"\n ></line>\n </pattern>\n </defs>\n <g *ngFor=\"let tick of d.xMinorTicks\">\n <rect\n class=\"tick-background\"\n [class.focused]=\"(hoveredBand$ | async)?.dateValue === tick.dateValue\"\n [attr.x]=\"tick.x - 20\"\n [attr.y]=\"d.yScale(0) + 3\"\n width=\"40\"\n height=\"12\"\n rx=\"2\"\n ></rect>\n <text\n class=\"tick-label\"\n [attr.x]=\"tick.x\"\n [attr.y]=\"d.yScale(0) + 12\"\n text-anchor=\"middle\"\n >\n {{ tick.label }}\n </text>\n </g>\n <g *ngFor=\"let tick of d.xMajorTicks\">\n <text\n class=\"tick-label\"\n [attr.x]=\"tick.x\"\n [attr.y]=\"d.yScale(0) + 24\"\n text-anchor=\"middle\"\n >\n {{ tick.label }}\n </text>\n </g>\n <g *ngFor=\"let tick of d.yTicks\">\n <rect\n class=\"tick\"\n x=\"0\"\n [attr.y]=\"d.yScale(tick)\"\n width=\"100%\"\n height=\"1\"\n ></rect>\n <text class=\"tick-label\" x=\"0\" [attr.y]=\"d.yScale(tick)\" dy=\"-4\">\n {{ valueFormatter(tick) }}\n </text>\n </g>\n <g *ngFor=\"let rect of d.rects\">\n <rect\n class=\"column\"\n [attr.x]=\"rect.x\"\n [attr.y]=\"rect.y\"\n [attr.width]=\"rect.width\"\n [attr.height]=\"rect.height\"\n [attr.fill]=\"rect.fill\"\n [class.blurred]=\"\n (hoveredBand$ | async) !== null &&\n (hoveredBand$ | async)?.dateValue !== rect.dateValue\n \"\n ></rect>\n <rect\n *ngIf=\"rect.striped\"\n [attr.x]=\"rect.x\"\n [attr.y]=\"rect.y\"\n [attr.width]=\"rect.width\"\n [attr.height]=\"rect.height\"\n fill=\"url(#stripes)\"\n ></rect>\n </g>\n <ng-container *ngIf=\"getRange$ | async; let getRange\">\n <rect\n *ngFor=\"let rect of d.hoverBands\"\n [attr.x]=\"rect.x\"\n [attr.y]=\"rect.y\"\n [attr.width]=\"rect.width\"\n [attr.height]=\"rect.height\"\n fill=\"transparent\"\n (mouseenter)=\"\n hoveredBand$.next({ dateValue: rect.dateValue, event: $event })\n \"\n (mouseleave)=\"hoveredBand$.next(null)\"\n (click)=\"\n stackClicked.emit(getRange(rect.dateValue)); hoveredBand$.next(null)\n \"\n ></rect>\n </ng-container>\n </svg>\n</div>\n\n<ng-container *ngIf=\"callout$ | async; let callout\">\n <riv-callout\n *riv-overlay\n [anchor]=\"callout?.anchor ?? null\"\n [theme]=\"'light'\"\n [isModal]=\"false\"\n [preferredPosition]=\"'center-right'\"\n [allowedPositions]=\"[\n 'center-right',\n 'center-left',\n 'top-center',\n 'bottom-center'\n ]\"\n >\n <div class=\"callout-content\">\n <ng-container\n [ngTemplateOutlet]=\"calloutHeaderTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: callout }\"\n ></ng-container>\n <div class=\"callout-stack\" *ngFor=\"let stack of callout?.content\">\n <div *ngIf=\"stack.title; let title\" class=\"callout-row\">\n <span class=\"series-label\">{{ title }}</span>\n <span>{{ stack.total }}</span>\n </div>\n <div *ngFor=\"let series of stack.series\" class=\"callout-row\">\n <span class=\"series-label\">\n <riv-legend-item\n [colorToken]=\"series.colorToken\"\n [style]=\"series.style\"\n ></riv-legend-item>\n <span>{{ series.label }}</span>\n </span>\n <span>{{ series.formattedValue }}</span>\n </div>\n </div>\n </div>\n </riv-callout>\n</ng-container>\n\n<ng-template #zeroState>\n <riv-zero-state></riv-zero-state>\n</ng-template>\n\n<ng-template #controls>\n <riv-simple-select\n [optionGroups]=\"intervalOptions$ | async | rivOptionGroup\"\n [orderBy]=\"'source'\"\n [selectedOption]=\"selectedIntervalOption$ | async\"\n (selectedOptionChange)=\"setIntervalOption($event)\"\n ></riv-simple-select>\n</ng-template>\n", styles: [".tick{fill:var(--gray-20)}.tick-label{font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-0);fill:var(--type-light-low-contrast)}.tick-background{transition:fill var(--short-transition);fill:transparent}.tick-background.focused{fill:var(--baloo-10)}.column{transition:opacity var(--short-transition)}.column.blurred{opacity:.4}.callout-content{padding:var(--size-medium) var(--size-xlarge);display:flex;flex-direction:column}.callout-stack{display:flex;flex-direction:column;padding:var(--size-medium) 0;gap:var(--size-medium)}.callout-stack:not(:last-child){border-bottom:var(--border-width) solid var(--border-light)}.callout-row{display:flex;gap:var(--size-large);align-items:center;font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-0)}.series-label{flex-grow:1;font-weight:var(--font-weight-heavy);display:flex;align-items:center;gap:var(--size-small)}\n"] }]
360
- }], propDecorators: { input: [{
361
- type: Input
362
- }], calloutHeaderTemplate: [{
363
- type: ContentChild,
364
- args: [TemplateRef]
365
- }], valueFormatter: [{
366
- type: Input
367
- }], interval: [{
368
- type: Input
369
- }], intervalChanged: [{
370
- type: Output
371
- }], stackClicked: [{
372
- type: Output
373
- }], controls: [{
374
- type: ViewChild,
375
- args: ['controls']
376
- }] } });
377
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhY2tlZC1jb2x1bW4uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcml2L3NyYy9saWIvdmlzdWFsaXphdGlvbi9zdGFja2VkLWNvbHVtbi9zdGFja2VkLWNvbHVtbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9yaXYvc3JjL2xpYi92aXN1YWxpemF0aW9uL3N0YWNrZWQtY29sdW1uL3N0YWNrZWQtY29sdW1uLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFlBQVksRUFDWixZQUFZLEVBQ1osS0FBSyxFQUNMLE1BQU0sRUFDTixXQUFXLEVBQ1gsU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDakMsT0FBTyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDbEQsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUNqQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0MsT0FBTyxFQUNMLGVBQWUsRUFFZixhQUFhLEVBQ2IsR0FBRyxFQUNILFdBQVcsR0FDWixNQUFNLE1BQU0sQ0FBQztBQUNkLE9BQU8sRUFFTCxnQkFBZ0IsRUFDaEIsZ0JBQWdCLEVBQ2hCLHNCQUFzQixFQUN0QixzQkFBc0IsRUFDdEIsZUFBZSxFQUNmLFNBQVMsR0FDVixNQUFNLGNBQWMsQ0FBQztBQUV0QixPQUFPLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxNQUFNLDBCQUEwQixDQUFDOzs7Ozs7Ozs7O0FBRXRFLE1BQU0sZ0JBQWdCLEdBQWEsT0FBTyxDQUFDO0FBTzNDLDZFQUE2RTtBQUM3RSwyQkFBMkI7QUFDM0IsbUdBQW1HO0FBT25H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Q2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgQ29udGVudENoaWxkLFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPdXRwdXQsXG4gIFRlbXBsYXRlUmVmLFxuICBWaWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgaW5kZXggfSBmcm9tICdkMy1hcnJheSc7XG5pbXBvcnQgeyBzY2FsZUJhbmQsIHNjYWxlTGluZWFyIH0gZnJvbSAnZDMtc2NhbGUnO1xuaW1wb3J0IHsgc3RhY2sgfSBmcm9tICdkMy1zaGFwZSc7XG5pbXBvcnQgeyB1dGNGb3JtYXQgfSBmcm9tICdkMy10aW1lLWZvcm1hdCc7XG5pbXBvcnQge1xuICBCZWhhdmlvclN1YmplY3QsXG4gIE9ic2VydmFibGUsXG4gIGNvbWJpbmVMYXRlc3QsXG4gIG1hcCxcbiAgc2hhcmVSZXBsYXksXG59IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtcbiAgSW50ZXJ2YWwsXG4gIGdldEludGVydmFsVGl0bGUsXG4gIGdldE1ham9ySW50ZXJ2YWwsXG4gIGdldE1ham9ySW50ZXJ2YWxGb3JtYXQsXG4gIGdldE1pbm9ySW50ZXJ2YWxGb3JtYXQsXG4gIGdldFRpbWVJbnRlcnZhbCxcbiAgaW50ZXJ2YWxzLFxufSBmcm9tICcuLi9pbnRlcnZhbHMnO1xuaW1wb3J0IHsgTGVnZW5kSXRlbUNvbXBvbmVudCB9IGZyb20gJy4uL2xlZ2VuZC1pdGVtL2xlZ2VuZC1pdGVtLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBnZXREYXRlUmFuZ2UsIHBvaW50UmVkdWNlciB9IGZyb20gJy4vc3RhY2tlZC1jb2x1bW4uaGVscGVycyc7XG5cbmNvbnN0IERFRkFVTFRfSU5URVJWQUw6IEludGVydmFsID0gJ21vbnRoJztcblxudHlwZSBJbnRlcnZhbE9wdGlvbiA9IHtcbiAgaWQ6IEludGVydmFsO1xuICB0aXRsZTogc3RyaW5nO1xufTtcblxuLy8gVE9ETzogb25jZSB3ZSB1cGdyYWRlIHRvIEFuZ3VsYXIgMTYsIHRoaXMgY29tcG9uZW50IGNhbiBiZSBjbGVhbmVkIHVwIHdpdGhcbi8vIHNpZ25hbHMgaW5zdGVhZCBvZiBSeEpTLlxuLy8gaHR0cHM6Ly93d3cubm90aW9uLnNvL3JpdmV0L1Jlc29sdmUtVE9ET3MtYWZ0ZXItQW5ndWxhci11cGdyYWRlLTFmMjY2N2ViMmEzMTgwYjc5ZjZhZDkyYTdlNTc2ZjA4XG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdyaXYtc3RhY2tlZC1jb2x1bW4nLFxuICB0ZW1wbGF0ZVVybDogJy4vc3RhY2tlZC1jb2x1bW4uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9zdGFja2VkLWNvbHVtbi5jb21wb25lbnQuY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBTdGFja2VkQ29sdW1uQ29tcG9uZW50IHtcbiAgcHJpdmF0ZSByZWFkb25seSBpbnB1dCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFN0YWNrZWRDb2x1bW5Db21wb25lbnQuU3RhY2tbXT4oXG4gICAgW10sXG4gICk7XG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgaW5wdXQodjogU3RhY2tlZENvbHVtbkNvbXBvbmVudC5TdGFja1tdKSB7XG4gICAgdGhpcy5pbnB1dCQubmV4dCh2KTtcbiAgfVxuICBwdWJsaWMgZ2V0IGlucHV0KCk6IFN0YWNrZWRDb2x1bW5Db21wb25lbnQuU3RhY2tbXSB7XG4gICAgcmV0dXJuIHRoaXMuaW5wdXQkLmdldFZhbHVlKCk7XG4gIH1cblxuICBwcml2YXRlIHJlYWRvbmx5IHdpZHRoJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPig5NjApO1xuICBwcm90ZWN0ZWQgc2V0IHdpZHRoKHY6IG51bWJlcikge1xuICAgIHRoaXMud2lkdGgkLm5leHQodik7XG4gIH1cblxuICBAQ29udGVudENoaWxkKFRlbXBsYXRlUmVmKVxuICBjYWxsb3V0SGVhZGVyVGVtcGxhdGUhOiBUZW1wbGF0ZVJlZjx7XG4gICAgJGltcGxpY2l0OiBTdGFja2VkQ29sdW1uQ29tcG9uZW50LkNhbGxvdXRDb250ZXh0O1xuICB9PjtcblxuICBwcml2YXRlIHJlYWRvbmx5IEhFSUdIVCA9IDMwMDtcblxuICBASW5wdXQoKVxuICBwdWJsaWMgdmFsdWVGb3JtYXR0ZXI6ICh2OiBudW1iZXIpID0+IHN0cmluZyA9IHYgPT4gdi50b1N0cmluZygpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgaW50ZXJ2YWwkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxJbnRlcnZhbD4oREVGQVVMVF9JTlRFUlZBTCk7XG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgaW50ZXJ2YWwodjogSW50ZXJ2YWwpIHtcbiAgICBpZiAodiAhPT0gdGhpcy5pbnRlcnZhbCQuZ2V0VmFsdWUoKSkge1xuICAgICAgdGhpcy5pbnRlcnZhbCQubmV4dCh2KTtcbiAgICAgIHRoaXMuaW50ZXJ2YWxDaGFuZ2VkLmVtaXQodik7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBnZXQgaW50ZXJ2YWwoKSB7XG4gICAgcmV0dXJuIHRoaXMuaW50ZXJ2YWwkLmdldFZhbHVlKCk7XG4gIH1cblxuICBAT3V0cHV0KClcbiAgaW50ZXJ2YWxDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxJbnRlcnZhbD4oKTtcblxuICBAT3V0cHV0KClcbiAgc3RhY2tDbGlja2VkID0gbmV3IEV2ZW50RW1pdHRlcjxTdGFja2VkQ29sdW1uQ29tcG9uZW50LlN0YWNrQ2xpY2tlZD4oKTtcblxuICBAVmlld0NoaWxkKCdjb250cm9scycpXG4gIHB1YmxpYyByZWFkb25seSBjb250cm9scz86IFRlbXBsYXRlUmVmPHZvaWQ+O1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgQ09MVU1OX1dJRFRIUyA9IFs4LCAxNiwgNDAsIDcyXSBhcyBjb25zdDtcbiAgcHJpdmF0ZSByZWFkb25seSBNSU5fQ09MVU1OX1dJRFRIID0gdGhpcy5DT0xVTU5fV0lEVEhTWzBdO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgbWF4Q29sdW1ucyQgPSB0aGlzLndpZHRoJC5waXBlKFxuICAgIG1hcCh3aWR0aCA9PiB7XG4gICAgICBjb25zdCBpbm5lcldpZHRoID0gd2lkdGggLSB0aGlzLkxFRlRfT0ZGU0VUO1xuICAgICAgY29uc3QgY29sdW1uV2lkdGhXaXRoUGFkZGluZyA9XG4gICAgICAgIHRoaXMuTUlOX0NPTFVNTl9XSURUSCArIHRoaXMuQ09MVU1OX1BBRERJTkcgKiAyO1xuICAgICAgcmV0dXJuIE1hdGguZmxvb3IoaW5uZXJXaWR0aCAvIGNvbHVtbldpZHRoV2l0aFBhZGRpbmcpO1xuICAgIH0pLFxuICAgIHNoYXJlUmVwbGF5KHsgcmVmQ291bnQ6IHRydWUsIGJ1ZmZlclNpemU6IDEgfSksXG4gICk7XG5cbiAgZ2V0WFN0ZXBzSW5SYW5nZShpbnRlcnZhbDogSW50ZXJ2YWwsIG1pbkRhdGU6IERhdGUsIG1heERhdGU6IERhdGUpIHtcbiAgICBjb25zdCB0aW1lSW50ZXJ2YWwgPSBnZXRUaW1lSW50ZXJ2YWwoaW50ZXJ2YWwpO1xuICAgIHJldHVybiB0aW1lSW50ZXJ2YWwucmFuZ2UoXG4gICAgICB0aW1lSW50ZXJ2YWwuZmxvb3IobWluRGF0ZSksXG4gICAgICB0aW1lSW50ZXJ2YWwuZmxvb3IodGltZUludGVydmFsLm9mZnNldChtYXhEYXRlLCAxKSksXG4gICAgKS5sZW5ndGg7XG4gIH1cblxuICBwcml2YXRlIHJlYWRvbmx5IGFsbG93ZWRJbnRlcnZhbHMkOiBPYnNlcnZhYmxlPEludGVydmFsW10+ID0gY29tYmluZUxhdGVzdChbXG4gICAgdGhpcy5pbnB1dCQsXG4gICAgdGhpcy5tYXhDb2x1bW5zJCxcbiAgXSkucGlwZShcbiAgICBtYXAoKFtpbnB1dCwgbWF4Q29sdW1uc10pID0+IHtcbiAgICAgIGNvbnN0IFttaW5EYXRlLCBtYXhEYXRlXSA9IGdldERhdGVSYW5nZShpbnB1dCk7XG5cbiAgICAgIHJldHVybiBpbnRlcnZhbHMuZmlsdGVyKGludGVydmFsID0+IHtcbiAgICAgICAgY29uc3QgeFN0ZXBzQ291bnQgPSB0aGlzLmdldFhTdGVwc0luUmFuZ2UoaW50ZXJ2YWwsIG1pbkRhdGUsIG1heERhdGUpO1xuICAgICAgICByZXR1cm4gaW5wdXQubGVuZ3RoICogeFN0ZXBzQ291bnQgPD0gbWF4Q29sdW1ucztcbiAgICAgIH0pO1xuICAgIH0pLFxuICAgIHNoYXJlUmVwbGF5KHsgcmVmQ291bnQ6IHRydWUsIGJ1ZmZlclNpemU6IDEgfSksXG4gICk7XG5cbiAgcmVhZG9ubHkgaW50ZXJ2YWxPcHRpb25zJCA9IHRoaXMuYWxsb3dlZEludGVydmFscyQucGlwZShcbiAgICBtYXAoaW50ZXJ2YWxzID0+XG4gICAgICBpbnRlcnZhbHMubWFwKFxuICAgICAgICAoaW50ZXJ2YWwpOiBJbnRlcnZhbE9wdGlvbiA9PiAoe1xuICAgICAgICAgIGlkOiBpbnRlcnZhbCxcbiAgICAgICAgICB0aXRsZTogZ2V0SW50ZXJ2YWxUaXRsZShpbnRlcnZhbCksXG4gICAgICAgIH0pLFxuICAgICAgKSxcbiAgICApLFxuICAgIHNoYXJlUmVwbGF5KHsgcmVmQ291bnQ6IHRydWUsIGJ1ZmZlclNpemU6IDEgfSksXG4gICk7XG5cbiAgcmVhZG9ubHkgc2VsZWN0ZWRJbnRlcnZhbE9wdGlvbiQgPSBjb21iaW5lTGF0ZXN0KFtcbiAgICB0aGlzLmludGVydmFsJCxcbiAgICB0aGlzLmludGVydmFsT3B0aW9ucyQsXG4gIF0pLnBpcGUoXG4gICAgbWFwKChbaW50ZXJ2YWwsIG9wdGlvbnNdKSA9PiB7XG4gICAgICBjb25zdCBhbGxvd2VkSW50ZXJ2YWxzID0gb3B0aW9ucy5tYXAoKHsgaWQgfSkgPT4gaWQgYXMgSW50ZXJ2YWwpO1xuICAgICAgaWYgKCFhbGxvd2VkSW50ZXJ2YWxzLmluY2x1ZGVzKGludGVydmFsKSkge1xuICAgICAgICBjb25zdCBmaXJzdEFsbG93ZWQgPSBhbGxvd2VkSW50ZXJ2YWxzLmF0KDApO1xuICAgICAgICBjb25zdCBsYXN0QWxsb3dlZCA9IGFsbG93ZWRJbnRlcnZhbHMuYXQoLTEpO1xuICAgICAgICBpZiAoIWZpcnN0QWxsb3dlZCB8fCAhbGFzdEFsbG93ZWQpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGlmIChpbnRlcnZhbHMuaW5kZXhPZihpbnRlcnZhbCkgPCBpbnRlcnZhbHMuaW5kZXhPZihmaXJzdEFsbG93ZWQpKVxuICAgICAgICAgIGludGVydmFsID0gZmlyc3RBbGxvd2VkO1xuICAgICAgICBpZiAoaW50ZXJ2YWxzLmluZGV4T2YoaW50ZXJ2YWwpID4gaW50ZXJ2YWxzLmluZGV4T2YobGFzdEFsbG93ZWQpKVxuICAgICAgICAgIGludGVydmFsID0gbGFzdEFsbG93ZWQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gb3B0aW9ucy5maW5kKG8gPT4gby5pZCA9PT0gaW50ZXJ2YWwpID8/IG51bGw7XG4gICAgfSksXG4gICAgc2hhcmVSZXBsYXkoeyByZWZDb3VudDogdHJ1ZSwgYnVmZmVyU2l6ZTogMSB9KSxcbiAgKTtcblxuICByZWFkb25seSBzZWxlY3RlZEludGVydmFsJCA9IHRoaXMuc2VsZWN0ZWRJbnRlcnZhbE9wdGlvbiQucGlwZShcbiAgICBtYXAob3B0aW9uID0+IChvcHRpb24gPyAob3B0aW9uLmlkIGFzIEludGVydmFsKSA6IERFRkFVTFRfSU5URVJWQUwpKSxcbiAgKTtcblxuICBzZXRJbnRlcnZhbE9wdGlvbihvcHRpb246IEludGVydmFsT3B0aW9uIHwgbnVsbCkge1xuICAgIGlmIChvcHRpb24pIHRoaXMuaW50ZXJ2YWwgPSBvcHRpb24uaWQ7XG4gIH1cblxuICBwcml2YXRlIGNvbHVtbldpZHRoJCA9IGNvbWJpbmVMYXRlc3QoW1xuICAgIHRoaXMuaW5wdXQkLFxuICAgIHRoaXMuc2VsZWN0ZWRJbnRlcnZhbCQsXG4gICAgdGhpcy53aWR0aCQsXG4gIF0pLnBpcGUoXG4gICAgbWFwKChbaW5wdXQsIHNlbGVjdGVkSW50ZXJ2YWwsIHdpZHRoXSkgPT4ge1xuICAgICAgY29uc3QgW21pbkRhdGUsIG1heERhdGVdID0gZ2V0RGF0ZVJhbmdlKGlucHV0KTtcbiAgICAgIGNvbnN0IHhTdGVwQ291bnQgPSB0aGlzLmdldFhTdGVwc0luUmFuZ2UoXG4gICAgICAgIHNlbGVjdGVkSW50ZXJ2YWwsXG4gICAgICAgIG1pbkRhdGUsXG4gICAgICAgIG1heERhdGUsXG4gICAgICApO1xuXG4gICAgICBjb25zdCBpbm5lcldpZHRoID0gd2lkdGggLSB0aGlzLkxFRlRfT0ZGU0VUO1xuICAgICAgY29uc3QgYWxsb3dlZENvbHVtbldpZHRocyA9IHRoaXMuQ09MVU1OX1dJRFRIUy5maWx0ZXIoY29sdW1uV2lkdGggPT4ge1xuICAgICAgICBjb25zdCBjb2x1bW5XaWR0aFdpdGhQYWRkaW5nID0gY29sdW1uV2lkdGggKyB0aGlzLkNPTFVNTl9QQURESU5HICogMjtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICBpbm5lcldpZHRoIC0gaW5wdXQubGVuZ3RoICogeFN0ZXBDb3VudCAqIGNvbHVtbldpZHRoV2l0aFBhZGRpbmcgPj0gMFxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgICBjb25zdCBjb2x1bW5XaWR0aCA9IGFsbG93ZWRDb2x1bW5XaWR0aHMuYXQoLTEpO1xuICAgICAgaWYgKCFjb2x1bW5XaWR0aCkgcmV0dXJuIDA7XG5cbiAgICAgIHJldHVybiBjb2x1bW5XaWR0aDtcbiAgICB9KSxcbiAgICBzaGFyZVJlcGxheSh7IHJlZkNvdW50OiB0cnVlLCBidWZmZXJTaXplOiAxIH0pLFxuICApO1xuXG4gIHJlYWRvbmx5IGJpbm5lZERhdGFXaXRoUmFuZ2VzJDogT2JzZXJ2YWJsZTx7XG4gICAgc3RhY2tzOiBTdGFja2VkQ29sdW1uQ29tcG9uZW50LlN0YWNrW107XG4gICAgZ2V0UmFuZ2U6IChkYXRlOiBudW1iZXIpID0+IHsgbWluRGF0ZTogRGF0ZTsgbWF4RGF0ZTogRGF0ZSB9O1xuICB9PiA9IGNvbWJpbmVMYXRlc3QoW3RoaXMuaW5wdXQkLCB0aGlzLnNlbGVjdGVkSW50ZXJ2YWwkXSkucGlwZShcbiAgICBtYXAoKFtpbnB1dCwgaW50ZXJ2YWxdKSA9PiB7XG4gICAgICBjb25zdCByYW5nZU1hcCA9IG5ldyBNYXA8bnVtYmVyLCBEYXRlPigpO1xuICAgICAgY29uc3Qgc3RhY2tzID0gaW5wdXQubWFwKChzdGFjayk6IFN0YWNrZWRDb2x1bW5Db21wb25lbnQuU3RhY2sgPT4ge1xuICAgICAgICBjb25zdCB0aW1lSW50ZXJ2YWwgPSBnZXRUaW1lSW50ZXJ2YWwoaW50ZXJ2YWwpO1xuXG4gICAgICAgIGNvbnN0IHNlcmllcyA9IHN0YWNrLnNlcmllcy5tYXAoc2VyaWVzID0+IHtcbiAgICAgICAgICBjb25zdCBiaW5uZWQgPSBuZXcgTWFwPG51bWJlciwgU3RhY2tlZENvbHVtbkNvbXBvbmVudC5WYWx1ZVtdPigpO1xuICAgICAgICAgIGZvciAoY29uc3QgcG9pbnQgb2Ygc2VyaWVzLmRhdGEpIHtcbiAgICAgICAgICAgIGNvbnN0IGJpbktleSA9IHRpbWVJbnRlcnZhbC5mbG9vcihwb2ludC5kYXRlKS52YWx1ZU9mKCk7XG4gICAgICAgICAgICBjb25zdCBtYXhEYXRlID0gcmFuZ2VNYXAuZ2V0KGJpbktleSk7XG5cbiAgICAgICAgICAgIGlmICghbWF4RGF0ZSB8fCBtYXhEYXRlIDwgcG9pbnQuZGF0ZSkge1xuICAgICAgICAgICAgICByYW5nZU1hcC5zZXQoYmluS2V5LCBwb2ludC5kYXRlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCFiaW5uZWQuaGFzKGJpbktleSkpIHtcbiAgICAgICAgICAgICAgYmlubmVkLnNldChiaW5LZXksIFtdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGJpbiA9IGJpbm5lZC5nZXQoYmluS2V5KSE7XG4gICAgICAgICAgICBiaW4ucHVzaChwb2ludCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5zZXJpZXMsXG4gICAgICAgICAgICBkYXRhOiBbLi4uYmlubmVkLmVudHJpZXMoKV0ubWFwKChbZGF0ZVZhbHVlLCBwb2ludHNdKSA9PiAoe1xuICAgICAgICAgICAgICBkYXRlOiBuZXcgRGF0ZShkYXRlVmFsdWUpLFxuICAgICAgICAgICAgICB2YWx1ZTogcG9pbnRSZWR1Y2VyKHBvaW50cyksXG4gICAgICAgICAgICB9KSksXG4gICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uc3RhY2ssXG4gICAgICAgICAgc2VyaWVzOiBzZXJpZXMsXG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN0YWNrcyxcbiAgICAgICAgZ2V0UmFuZ2U6IChkYXRlOiBudW1iZXIpID0+IHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbWluRGF0ZTogbmV3IERhdGUoZGF0ZSksXG4gICAgICAgICAgICBtYXhEYXRlOiByYW5nZU1hcC5nZXQoZGF0ZSkhLFxuICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH0pLFxuICAgIHNoYXJlUmVwbGF5KHsgcmVmQ291bnQ6IHRydWUsIGJ1ZmZlclNpemU6IDEgfSksXG4gICk7XG5cbiAgcmVhZG9ubHkgYmlubmVkRGF0YSQgPSB0aGlzLmJpbm5lZERhdGFXaXRoUmFuZ2VzJC5waXBlKFxuICAgIG1hcChiaW5uZWREYXRhID0+IGJpbm5lZERhdGEuc3RhY2tzKSxcbiAgKTtcblxuICByZWFkb25seSBnZXRSYW5nZSQgPSB0aGlzLmJpbm5lZERhdGFXaXRoUmFuZ2VzJC5waXBlKFxuICAgIG1hcChiaW5uZWREYXRhID0+IGJpbm5lZERhdGEuZ2V0UmFuZ2UpLFxuICApO1xuXG4gIHJlYWRvbmx5IExFRlRfT0ZGU0VUID0gNDg7XG4gIHJlYWRvbmx5IENPTFVNTl9QQURESU5HID0gNDtcblxuICByZWFkb25seSBkcmF3RGF0YSQgPSBjb21iaW5lTGF0ZXN0KFtcbiAgICB0aGlzLmJpbm5lZERhdGEkLFxuICAgIHRoaXMud2lkdGgkLFxuICAgIHRoaXMuc2VsZWN0ZWRJbnRlcnZhbCQsXG4gICAgdGhpcy5jb2x1bW5XaWR0aCQsXG4gIF0pLnBpcGUoXG4gICAgbWFwKChbYmlubmVkRGF0YSwgd2lkdGgsIGludGVydmFsLCBjb2x1bW5XaWR0aF0pID0+IHtcbiAgICAgIGNvbnN0IHZpZXdCb3ggPSBgMCAwICR7d2lkdGh9ICR7dGhpcy5IRUlHSFR9YDtcbiAgICAgIGNvbnN0IHBhZGRpbmcgPSAxNjtcblxuICAgICAgY29uc3QgW21pbkRhdGUsIG1heERhdGVdID0gZ2V0RGF0ZVJhbmdlKGJpbm5lZERhdGEpO1xuICAgICAgY29uc3QgaGFzTXVsdGlwbGVZZWFycyA9IG1pbkRhdGUuZ2V0RnVsbFllYXIoKSA8IG1heERhdGUuZ2V0RnVsbFllYXIoKTtcbiAgICAgIGNvbnN0IHhNaW5vckludGVydmFsRm9ybWF0ID0gZ2V0TWlub3JJbnRlcnZhbEZvcm1hdChpbnRlcnZhbCk7XG4gICAgICBjb25zdCBtaW5vckZvcm1hdHRlciA9IHV0Y0Zvcm1hdCh4TWlub3JJbnRlcnZhbEZvcm1hdCk7XG4gICAgICBjb25zdCBtaW5vclRpbWVJbnRlcnZhbCA9IGdldFRpbWVJbnRlcnZhbChpbnRlcnZhbCk7XG4gICAgICBjb25zdCB4U3RlcHMgPSBtaW5vclRpbWVJbnRlcnZhbC5yYW5nZShcbiAgICAgICAgbWlub3JUaW1lSW50ZXJ2YWwuZmxvb3IobWluRGF0ZSksXG4gICAgICAgIG1pbm9yVGltZUludGVydmFsLmZsb29yKG1pbm9yVGltZUludGVydmFsLm9mZnNldChtYXhEYXRlLCAxKSksXG4gICAgICApO1xuICAgICAgY29uc3QgeE1ham9ySW50ZXJ2YWwgPSBnZXRNYWpvckludGVydmFsKGludGVydmFsKTtcbiAgICAgIGNvbnN0IHhNYWpvckludGVydmFsRm9ybWF0ID0gZ2V0TWFqb3JJbnRlcnZhbEZvcm1hdChcbiAgICAgICAgeE1ham9ySW50ZXJ2YWwsXG4gICAgICAgIGhhc011bHRpcGxlWWVhcnMsXG4gICAgICApO1xuICAgICAgY29uc3QgbWFqb3JGb3JtYXR0ZXIgPSB1dGNGb3JtYXQoeE1ham9ySW50ZXJ2YWxGb3JtYXQpO1xuICAgICAgY29uc3QgZnVsbEZvcm1hdHRlciA9IHV0Y0Zvcm1hdChcbiAgICAgICAgYCR7eE1pbm9ySW50ZXJ2YWxGb3JtYXR9ICR7eE1ham9ySW50ZXJ2YWxGb3JtYXR9YCxcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHhPdXRlclNjYWxlID0gc2NhbGVCYW5kKClcbiAgICAgICAgLmRvbWFpbih4U3RlcHMubWFwKGRhdGUgPT4gZnVsbEZvcm1hdHRlcihkYXRlKSkpXG4gICAgICAgIC5yYW5nZShbdGhpcy5MRUZUX09GRlNFVCwgd2lkdGhdKTtcblxuICAgICAgY29uc3Qgb3V0ZXJQYWRkaW5nID1cbiAgICAgICAgKHhPdXRlclNjYWxlLmJhbmR3aWR0aCgpIC1cbiAgICAgICAgICAodGhpcy5DT0xVTU5fUEFERElORyAqIChiaW5uZWREYXRhLmxlbmd0aCAtIDEpICtcbiAgICAgICAgICAgIGNvbHVtbldpZHRoICogYmlubmVkRGF0YS5sZW5ndGgpKSAvXG4gICAgICAgIDI7XG5cbiAgICAgIHR5cGUgU2VyaWVzUG9pbnQgPSBTdGFja2VkQ29sdW1uQ29tcG9uZW50LlZhbHVlICYge1xuICAgICAgICBzZXJpZXM6IFN0YWNrZWRDb2x1bW5Db21wb25lbnQuU2VyaWVzO1xuICAgICAgfTtcblxuICAgICAgY29uc3QgcmVuZGVySW5mb3JtYXRpb24gPSBiaW5uZWREYXRhLm1hcChzdGFja0RhdGEgPT4ge1xuICAgICAgICAvKlxuICAgICAgICAgIENyZWF0ZSBhbiBhcnJheSB3aXRoIGV2ZXJ5IGRhdGEgcG9pbnQgKyB0aGVpciBhc3NvY2lhdGVkIHNlcmllcy5cbiAgICAgICAgICBpLmUuIE1ha2UgYW4gYmFja2xpbmsgZm9yIGVhY2ggZWxlbWVudCB0byBpdHMgc2VyaWVzLlxuICAgICAgICAqL1xuICAgICAgICBjb25zdCBzdGFja2VkVGFibGUgPSBzdGFja0RhdGEuc2VyaWVzLnJlZHVjZTxTZXJpZXNQb2ludFtdPihcbiAgICAgICAgICAodGFibGUsIHMpID0+IFtcbiAgICAgICAgICAgIC4uLnRhYmxlLFxuICAgICAgICAgICAgLi4ucy5kYXRhLm1hcChwb2ludCA9PiAoe1xuICAgICAgICAgICAgICAuLi5wb2ludCxcbiAgICAgICAgICAgICAgc2VyaWVzOiBzLFxuICAgICAgICAgICAgfSkpLFxuICAgICAgICAgIF0sXG4gICAgICAgICAgW10sXG4gICAgICAgICk7XG5cbiAgICAgICAgLypcbiAgICAgICAgICBNYXBzIGVhY2ggb2YgdGhlIFNlcmllc1BvaW50cyBiYXNlZCBvbiBsYWJlbC5cbiAgICAgICAgICBUaGVuIG1hcCBlYWNoIG9mIHRob3NlIG1hcHMgdG8gYSBkYXRlLlxuXG4gICAgICAgICAgRXhhbXBsZTpcbiAgICAgICAgICAgIElmIHdlIHdlcmUgaW5kZXhpbmcgdGhlIGZvbGxvd2luZyBkYXRhOlxuICAgICAgICAgICAgICAqIEVzdGltYXRlcyBDb21wbGV0ZSAtPiA1IGluIEphbnVhcnksIDcgaW4gRmVicnVhcnlcbiAgICAgICAgICAgICAgKiBFc3RpbWF0ZXMgSW5jb21wbGV0ZSAtPiAzIGluIEphbnVhcnksIDMgaW4gRmVicnVhcnlcbiAgICAgICAgICAgIFdlIHdvdWxkIGdldCBhbiBpbmRleGVkIHRhYmxlIGxpa2UgdGhlIGZvbGxvd2luZywgKG5vdGUgdGhpcyBpcyBwc2V1ZG9jb2RlKTpcbiAgICAgICAgICAgICAgJ0phbnVhcnknOiB7ICdFc3RpbWF0ZXMgQ29tcGxldGUnOiA1LCAnRXN0aW1hdGVzIEluY29tcGxldGUnOiAzIH1cbiAgICAgICAgICAgICAgJ0ZlYnJ1YXJ5JzogeyAnRXN0aW1hdGVzIENvbXBsZXRlJzogNywgJ0VzdGltYXRlcyBJbmNvbXBsZXRlJzogMyB9XG4gICAgICAgICovXG4gICAgICAgIGNvbnN0IGluZGV4ZWRUYWJsZTogTWFwPERhdGUsIE1hcDxzdHJpbmcsIFNlcmllc1BvaW50Pj4gPSBpbmRleChcbiAgICAgICAgICBzdGFja2VkVGFibGUsXG4gICAgICAgICAgZCA9PiBkLmRhdGUsXG4gICAgICAgICAgZCA9PiBkLnNlcmllcy5sYWJlbCxcbiAgICAgICAgKTtcblxuICAgICAgICAvKlxuICAgICAgICAgIFRoZSBvdXRwdXQgb2YgXCJzdGFjaygpXCIgaXMgYW4gYXJyYXkgb2YgYXJyYXlzIG9mIHR1cGxlcy5cbiAgICAgICAgICAgIFRoZSB0dXBsZXMgdW5uZXN0IGFzIFtiYXNlbGluZSwgdG9wbGluZV0uXG4gICAgICAgICAgICBFYWNoIFwia2V5XCIgaW52b2x2ZWQgaW4gdGhlIHN0YWNrIGhhcyBhbiBhcnJheSBvZiB0dXBsZXMgcmVsYXRpbmcgdG8gaXQuXG4gICAgICAgICAgICAgIGkuZS4gWyBEYXRlIDEgVHVwbGUsIERhdGUgMiBUdXBsZSBdXG4gICAgICAgICAgICBBbGwgXCJrZXlcIiBhcnJheXMgYXJlIGNvbnRhaW5lZCBpbiB0aGUgb3V0ZXIgYXJyYXkuXG4gICAgICAgICAgICAgIGkuZS4gWyBLZXkgMSBUdXBsZXMsIEtleSAyIFR1cGxlc11cblxuICAgICAgICAgIFdlIHNlbGVjdCB0aGUga2V5cyB1c2luZyBcIi5rZXlzKClcIi5cbiAgICAgICAgICAgIEZvciBvdXIgcHVycG9zZXMsIHRoZSBrZXlzIGFyZSB0aGUgbGVnZW5kIGVsZW1lbnRzLlxuICAgICAgICAgICAgaS5lLiBJZiB5b3UgaGF2ZSB0d28gYmxvY2tzIG9mIHRoZSBzYW1lIGNvbG9yLCB0aGV5IGhhdmUgdGhlIHNhbWUga2V5LlxuXG4gICAgICAgICAgV2Ugc2VsZWN0IHRoZSBoZWlnaHRzIG9mIHRoZSBibG9ja3MgdXNpbmcgXCIudmFsdWUoKVwiLlxuXG4gICAgICAgICAgV2UgYXJlIGdvaW5nIHRvIHN0YWNrIHRoZSBibG9ja3Mgb24gdG9wIG9mIGVhY2ggb3RoZXIuXG4gICAgICAgICAgICBUaGUgYmFzZWxpbmUgb2YgdGhlIGZpcnN0IGtleSB0dXBsZXMgYXJlIDAuXG4gICAgICAgICAgICBUaGUgYmFzZWxpbmUgb2YgdGhlIHNlY29uZCBrZXkgdHVwbGVzIGFyZSB0aGUgdG9wbGluZSBvZiB0aGUgYXNzb2NpYXRlZCBmaXJzdCBrZXkgdHVwbGUuXG5cbiAgICAgICAgICBFeGFtcGxlOlxuICAgICAgICAgICAgSWYgd2Ugd2VyZSBzdGFja2luZyB0aGUgZm9sbG93aW5nIGRhdGE6XG4gICAgICAgICAgICAgICogRXN0aW1hdGVzIENvbXBsZXRlIC0+IDUgaW4gSmFudWFyeSwgNyBpbiBGZWJydWFyeVxuICAgICAgICAgICAgICAqIEVzdGltYXRlcyBJbmNvbXBsZXRlIC0+IDMgaW4gSmFudWFyeSwgMyBpbiBGZWJydWFyeVxuICAgICAgICAgICAgV2Ugd291bGQgZ2V0IGEgc3RhY2sgb2Y6XG4gICAgICAgICAgICAgIFsgIFsgWzAsNV0sWzAsN10gXSwgWyBbNSw4XSxbNywxMF0gXSAgXVxuICAgICAgICAqL1xuICAgICAgICBjb25zdCBzdGFja2VkID0gc3RhY2s8XG4gICAgICAgICAgdHlwZW9mIGluZGV4ZWRUYWJsZSBleHRlbmRzIE1hcDxpbmZlciBLLCBpbmZlciBWPiA/IFtLLCBWXSA6IG5ldmVyXG4gICAgICAgID4oKVxuICAgICAgICAgIC5rZXlzKHN0YWNrRGF0YS5zZXJpZXMubWFwKHYgPT4gdi5sYWJlbCkpXG4gICAgICAgICAgLnZhbHVlKChbXywgZ3JvdXBdLCBrZXkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBncm91cC5nZXQoa2V5KSEudmFsdWU7XG4gICAgICAgICAgfSkoaW5kZXhlZFRhYmxlKTtcblxuICAgICAgICByZXR1cm4geyBpbmRleGVkVGFibGUsIHN0YWNrZWQgfTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBUaGUgZG9tYWluIHNob3VsZCBiZSBiYXNlZCBvbiB0aGUgaGlnaGVzdCB2YWx1ZSBpbiBhbnkgc3RhY2ssIG9uIGFueSBkYXRlLlxuICAgICAgbGV0IGRvbWFpbk1heCA9IDA7XG4gICAgICAvLyBGb3IgZWFjaCB1bmlxdWUgc3RhY2ssXG4gICAgICByZW5kZXJJbmZvcm1hdGlvbi5mb3JFYWNoKCh7IHN0YWNrZWQsIGluZGV4ZWRUYWJsZSB9KSA9PiB7XG4gICAgICAgIC8vIEZvciBlYWNoIGRhdGUsXG4gICAgICAgIFsuLi5pbmRleGVkVGFibGUudmFsdWVzKCldLmZvckVhY2goKHBvaW50TWFwLCBpKSA9PiB7XG4gICAgICAgICAgLy8gRm9yIGVhY2ggc2VyaWVzLFxuICAgICAgICAgIFsuLi5wb2ludE1hcC52YWx1ZXMoKV0uZm9yRWFjaCgoXywgaikgPT4ge1xuICAgICAgICAgICAgZG9tYWluTWF4ID0gTWF0aC5tYXgoZG9tYWluTWF4LCAuLi5zdGFja2VkW2pdW2ldKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIGlmIChkb21haW5NYXggPT09IDApIGRvbWFpbk1heCA9IDE7XG4gICAgICBjb25zdCB5U2NhbGUgPSBzY2FsZUxpbmVhcigpXG4gICAgICAgIC5kb21haW4oWzAsIGRvbWFpbk1heF0pXG4gICAgICAgIC5yYW5nZShbdGhpcy5IRUlHSFQgLSBwYWRkaW5nICogMiwgcGFkZGluZ10pO1xuXG4gICAgICBjb25zdCByZWN0czoge1xuICAgICAgICBkYXRlVmFsdWU6IG51bWJlcjtcbiAgICAgICAgeDogbnVtYmVyO1xuICAgICAgICB5OiBudW1iZXI7XG4gICAgICAgIHdpZHRoOiBudW1iZXI7XG4gICAgICAgIGhlaWdodDogbnVtYmVyO1xuICAgICAgICBmaWxsOiBzdHJpbmc7XG4gICAgICAgIHN0cmlwZWQ6IGJvb2xlYW47XG4gICAgICAgIHNlcmllc1BvaW50OiBTZXJpZXNQb2ludDtcbiAgICAgIH1bXSA9IFtdO1xuICAgICAgLy8gRm9yIGVhY2ggdW5pcXVlIHN0YWNrLFxuICAgICAgcmVuZGVySW5mb3JtYXRpb24uZm9yRWFjaCgoeyBzdGFja2VkLCBpbmRleGVkVGFibGUgfSwgaW5kZXgpID0+IHtcbiAgICAgICAgLy8gRm9yIGVhY2ggZGF0ZSxcbiAgICAgICAgWy4uLmluZGV4ZWRUYWJsZS5lbnRyaWVzKCldLmZvckVhY2goKFtkYXRlLCBwb2ludE1hcF0sIGkpID0+IHtcbiAgICAgICAgICAvLyBGb3IgZWFjaCBzZXJpZXMsXG4gICAgICAgICAgWy4uLnBvaW50TWFwLmVudHJpZXMoKV0uZm9yRWFjaCgoW18sIHNlcmllc1BvaW50XSwgaikgPT4ge1xuICAgICAgICAgICAgLy8gR2V0IHRoZSBzaXplIG9mIHRoZSBib3ggd2UgYXJlIGFib3V0IHRvIGRyYXcuXG4gICAgICAgICAgICBjb25zdCBbYmFzZWxpbmUsIHRvcGxpbmVdID0gc3RhY2tlZFtqXVtpXTtcblxuICAgICAgICAgICAgY29uc3Qgd2lkdGggPSBjb2x1bW5XaWR0aDtcbiAgICAgICAgICAgIGNvbnN0IGhlaWdodCA9IHlTY2FsZShiYXNlbGluZSkgLSB5U2NhbGUodG9wbGluZSk7XG4gICAgICAgICAgICBjb25zdCB4ID1cbiAgICAgICAgICAgICAgKHhPdXRlclNjYWxlKGZ1bGxGb3JtYXR0ZXIoZGF0ZSkpID8/IDApICtcbiAgICAgICAgICAgICAgb3V0ZXJQYWRkaW5nICtcbiAgICAgICAgICAgICAgY29sdW1uV2lkdGggKiBpbmRleCArXG4gICAgICAgICAgICAgIHRoaXMuQ09MVU1OX1BBRERJTkcgKiBpbmRleDtcbiAgICAgICAgICAgIGNvbnN0IHkgPSB5U2NhbGUoYmFzZWxpbmUpIC0gaGVpZ2h0O1xuICAgICAgICAgICAgY29uc3QgZmlsbCA9IGB2YXIoJHtzZXJpZXNQb2ludC5zZXJpZXMuY29sb3JUb2tlbn0pYDtcblxuICAgICAgICAgICAgcmVjdHMucHVzaCh7XG4gICAgICAgICAgICAgIGRhdGVWYWx1ZTogZGF0ZS52YWx1ZU9mKCksXG4gICAgICAgICAgICAgIHgsXG4gICAgICAgICAgICAgIHksXG4gICAgICAgICAgICAgIHdpZHRoLFxuICAgICAgICAgICAgICBoZWlnaHQsXG4gICAgICAgICAgICAgIGZpbGwsXG4gICAgICAgICAgICAgIHN0cmlwZWQ6IHNlcmllc1BvaW50LnNlcmllcy5zdHlsZSA9PT0gJ3N0cmlwZWQnLFxuICAgICAgICAgICAgICBzZXJpZXNQb2ludCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCB4TWlub3JUaWNrcyA9IHhTdGVwcy5tYXAoZGF0ZSA9PiAoe1xuICAgICAgICBkYXRlVmFsdWU6IGRhdGUudmFsdWVPZigpLFxuICAgICAgICBsYWJlbDogbWlub3JGb3JtYXR0ZXIoZGF0ZSksXG4gICAgICAgIHg6XG4gICAgICAgICAgKHhPdXRlclNjYWxlKGZ1bGxGb3JtYXR0ZXIoZGF0ZSkpID8/IDApICsgeE91dGVyU2NhbGUuYmFuZHdpZHRoKCkgLyAyLFxuICAgICAgfSkpO1xuICAgICAgY29uc3QgeE1ham9yVGlja3MgPVxuICAgICAgICBpbnRlcnZhbCAhPT0gJ3llYXInXG4gICAgICAgICAgPyB4U3RlcHNcbiAgICAgICAgICAgICAgLm1hcChkYXRlID0+ICh7XG4gICAgICAgICAgICAgICAgZGF0ZVZhbHVlOiBkYXRlLnZhbHVlT2YoKSxcbiAgICAgICAgICAgICAgICBsYWJlbDogbWFqb3JGb3JtYXR0ZXIoZGF0ZSksXG4gICAgICAgICAgICAgICAgeDpcbiAgICAgICAgICAgICAgICAgICh4T3V0ZXJTY2FsZShmdWxsRm9ybWF0dGVyKGRhdGUpKSA/PyAwKSArXG4gICAgICAgICAgICAgICAgICB4T3V0ZXJTY2FsZS5iYW5kd2lkdGgoKSAvIDIsXG4gICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgICAgICAgICh0aWNrLCBpLCB0aWNrcykgPT5cbiAgICAgICAgICAgICAgICAgIGkgPT09IDAgfHwgdGljay5sYWJlbCAhPT0gdGlja3NbaSAtIDFdLmxhYmVsLFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgOiBbXTtcblxuICAgICAgY29uc3QgeVRpY2tzID0geVNjYWxlLnRpY2tzKDUpO1xuXG4gICAgICBjb25zdCBob3ZlckJhbmRXaWR0aCA9XG4gICAgICAgIHJlbmRlckluZm9ybWF0aW9uLmxlbmd0aCAqIGNvbHVtbldpZHRoICtcbiAgICAgICAgKHJlbmRlckluZm9ybWF0aW9uLmxlbmd0aCArIDEpICogdGhpcy5DT0xVTU5fUEFERElORztcbiAgICAgIGNvbnN0IGhvdmVyQmFuZHMgPSB4U3RlcHMubWFwKGRhdGUgPT4gKHtcbiAgICAgICAgZGF0ZVZhbHVlOiBkYXRlLnZhbHVlT2YoKSxcbiAgICAgICAgeDpcbiAgICAgICAgICAoeE91dGVyU2NhbGUoZnVsbEZvcm1hdHRlcihkYXRlKSkgPz8gMCkgK1xuICAgICAgICAgICh4T3V0ZXJTY2FsZS5iYW5kd2lkdGgoKSAtIGhvdmVyQmFuZFdpZHRoKSAvIDIsXG4gICAgICAgIHk6IHlTY2FsZShkb21haW5NYXgpLFxuICAgICAgICB3aWR0aDogaG92ZXJCYW5kV2lkdGgsXG4gICAgICAgIGhlaWdodDogeVNjYWxlKDApIC0geVNjYWxlKGRvbWFpbk1heCksXG4gICAgICB9KSk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbHVtbldpZHRoLFxuICAgICAgICBob3ZlckJhbmRzLFxuICAgICAgICByZWN0cyxcbiAgICAgICAgdmlld0JveCxcbiAgICAgICAgeE1pbm9yVGlja3MsXG4gICAgICAgIHhNYWpvclRpY2tzLFxuICAgICAgICB5U2NhbGUsXG4gICAgICAgIHlUaWNrcyxcbiAgICAgIH07XG4gICAgfSksXG4gICAgc2hhcmVSZXBsYXkoeyByZWZDb3VudDogdHJ1ZSwgYnVmZmVyU2l6ZTogMSB9KSxcbiAgKTtcblxuICByZWFkb25seSBlbXB0eSQgPSB0aGlzLmlucHV0JC5waXBlKFxuICAgIG1hcChpbnB1dCA9PlxuICAgICAgaW5wdXQuZXZlcnkoc3RhY2sgPT5cbiAgICAgICAgc3RhY2suc2VyaWVzLmV2ZXJ5KHNlcmllcyA9PiBzZXJpZXMuZGF0YS5sZW5ndGggPT09IDApLFxuICAgICAgKSxcbiAgICApLFxuICAgIHNoYXJlUmVwbGF5KHsgcmVmQ291bnQ6IHRydWUsIGJ1ZmZlclNpemU6IDEgfSksXG4gICk7XG5cbiAgcmVhZG9ubHkgaG92ZXJlZEJhbmQkID0gbmV3IEJlaGF2aW9yU3ViamVjdDx7XG4gICAgZGF0ZVZhbHVlOiBudW1iZXI7XG4gICAgZXZlbnQ6IE1vdXNlRXZlbnQ7XG4gIH0gfCBudWxsPihudWxsKTtcblxuICByZWFkb25seSBjYWxsb3V0JDogT2JzZXJ2YWJsZTxTdGFja2VkQ29sdW1uQ29tcG9uZW50LkNhbGxvdXRDb250ZXh0IHwgbnVsbD4gPVxuICAgIGNvbWJpbmVMYXRlc3QoW3RoaXMuaG92ZXJlZEJhbmQkLCB0aGlzLmJpbm5lZERhdGEkXSkucGlwZShcbiAgICAgIG1hcCgoW2hvdmVyZWRCYW5kLCBiaW5uZWREYXRhXSkgPT4ge1xuICAgICAgICBpZiAoIWhvdmVyZWRCYW5kKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCB7IHRhcmdldCB9ID0gaG92ZXJlZEJhbmQuZXZlbnQ7XG4gICAgICAgIGlmICghdGFyZ2V0KSByZXR1cm4gbnVsbDtcbiAgICAgICAgY29uc3QgYW5jaG9yID0gKDxTVkdSZWN0RWxlbWVudD50YXJnZXQpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgYW5jaG9yLFxuICAgICAgICAgIGNvbnRlbnQ6IGJpbm5lZERhdGEubWFwKHN0YWNrID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHNlcmllc1BvaW50cyA9IHN0YWNrLnNlcmllcy5tYXAoc2VyaWVzID0+ICh7XG4gICAgICAgICAgICAgIGxhYmVsOiBzZXJpZXMubGFiZWwsXG4gICAgICAgICAgICAgIGNvbG9yVG9rZW46IHNlcmllcy5jb2xvclRva2VuLFxuICAgICAgICAgICAgICBzdHlsZTogc2VyaWVzLnN0eWxlLFxuICAgICAgICAgICAgICB2YWx1ZTpcbiAgICAgICAgICAgICAgICBzZXJpZXMuZGF0YS5maW5kKFxuICAgICAgICAgICAgICAgICAgKHsgZGF0ZSB9KSA9PiBkYXRlLnZhbHVlT2YoKSA9PT0gaG92ZXJlZEJhbmQuZGF0ZVZhbHVlLFxuICAgICAgICAgICAgICAgICk/LnZhbHVlID8/IDAsXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICB0aXRsZTogc3RhY2sudGl0bGUsXG4gICAgICAgICAgICAgIHRvdGFsOiB0aGlzLnZhbHVlRm9ybWF0dGVyKFxuICAgICAgICAgICAgICAgIHNlcmllc1BvaW50cy5yZWR1Y2UoKGFjYywgcG9pbnQpID0+IHBvaW50LnZhbHVlICsgYWNjLCAwKSxcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgc2VyaWVzOiBzZXJpZXNQb2ludHMubWFwKHBvaW50ID0+ICh7XG4gICAgICAgICAgICAgICAgLi4ucG9pbnQsXG4gICAgICAgICAgICAgICAgZm9ybWF0dGVkVmFsdWU6IHRoaXMudmFsdWVGb3JtYXR0ZXIocG9pbnQudmFsdWUpLFxuICAgICAgICAgICAgICB9KSksXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0pLFxuICAgICAgICB9O1xuICAgICAgfSksXG4gICAgICBzaGFyZVJlcGxheSh7IHJlZkNvdW50OiB0cnVlLCBidWZmZXJTaXplOiAxIH0pLFxuICAgICk7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgU3RhY2tlZENvbHVtbkNvbXBvbmVudCB7XG4gIGV4cG9ydCB0eXBlIFZhbHVlID0ge1xuICAgIGRhdGU6IERhdGU7XG4gICAgdmFsdWU6IG51bWJlcjtcbiAgfTtcblxuICBleHBvcnQgdHlwZSBTZXJpZXMgPSB7XG4gICAgbGFiZWw6IHN0cmluZztcbiAgICBkYXRhOiBWYWx1ZVtdO1xuICAgIGNvbG9yVG9rZW46IHN0cmluZztcbiAgICBzdHlsZTogTGVnZW5kSXRlbUNvbXBvbmVudC5TdHlsZTtcbiAgfTtcblxuICBleHBvcnQgdHlwZSBTdGFjayA9IHtcbiAgICB0aXRsZT86IHN0cmluZztcbiAgICBzZXJpZXM6IFNlcmllc1tdO1xuICB9O1xuXG4gIGV4cG9ydCB0eXBlIFN0YWNrQ2xpY2tlZCA9IHtcbiAgICBtaW5EYXRlOiBEYXRlO1xuICAgIG1heERhdGU6IERhdGU7XG4gIH07XG5cbiAgZXhwb3J0IHR5cGUgQ2FsbG91dENvbnRleHQgPSB7XG4gICAgYW5jaG9yOiBET01SZWN0O1xuICAgIGNvbnRlbnQ6IHtcbiAgICAgIHRpdGxlPzogc3RyaW5nO1xuICAgICAgdG90YWw6IHN0cmluZztcbiAgICAgIHNlcmllczoge1xuICAgICAgICBsYWJlbDogc3RyaW5nO1xuICAgICAgICBjb2xvclRva2VuOiBzdHJpbmc7XG4gICAgICAgIHN0eWxlOiBMZWdlbmRJdGVtQ29tcG9uZW50LlN0eWxlO1xuICAgICAgICB2YWx1ZTogbnVtYmVyO1xuICAgICAgICBmb3JtYXR0ZWRWYWx1ZTogc3RyaW5nO1xuICAgICAgfVtdO1xuICAgIH1bXTtcbiAgfTtcbn1cbiIsIjxkaXZcbiAgKm5nSWY9XCIoZW1wdHkkIHwgYXN5bmMpID09PSBmYWxzZTsgZWxzZSB6ZXJvU3RhdGVcIlxuICBjbGFzcz1cImNvbnRhaW5lclwiXG4gIChyaXZDbGllbnRTaXplKT1cIndpZHRoID0gJGV2ZW50LndpZHRoXCJcbj5cbiAgPHN2Z1xuICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxuICAgICpuZ0lmPVwiZHJhd0RhdGEkIHwgYXN5bmM7IGxldCBkXCJcbiAgICBbYXR0ci52aWV3Qm94XT1cImQudmlld0JveFwiXG4gID5cbiAgICA8ZGVmcz5cbiAgICAgIDxwYXR0ZXJuXG4gICAgICAgIGlkPVwic3RyaXBlc1wiXG4gICAgICAgIHg9XCIwXCJcbiAgICAgICAgeT1cIjBcIlxuICAgICAgICBbYXR0ci53aWR0aF09XCJkLmNvbHVtbldpZHRoXCJcbiAgICAgICAgW2F0dHIuaGVpZ2h0XT1cImQuY29sdW1uV2lkdGhcIlxuICAgICAgICBwYXR0ZXJuVW5pdHM9XCJ1c2VyU3BhY2VPblVzZVwiXG4gICAgICA+XG4gICAgICAgIDxsaW5lXG4gICAgICAgICAgeDE9XCIwXCJcbiAgICAgICAgICBbYXR0ci55MV09XCJkLmNvbHVtbldpZHRoXCJcbiAgICAgICAgICBbYXR0ci54Ml09XCJkLmNvbHVtbldpZHRoXCJcbiAgICAgICAgICB5Mj1cIjBcIlxuICAgICAgICAgIHN0cm9rZT1cInZhcigtLXdoaXRlLTEwMClcIlxuICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjFcIlxuICAgICAgICA+PC9saW5lPlxuICAgICAgPC9wYXR0ZXJuPlxuICAgIDwvZGVmcz5cbiAgICA8ZyAqbmdGb3I9XCJsZXQgdGljayBvZiBkLnhNaW5vclRpY2tzXCI+XG4gICAgICA8cmVjdFxuICAgICAgICBjbGFzcz1cInRpY2stYmFja2dyb3VuZFwiXG4gICAgICAgIFtjbGFzcy5mb2N1c2VkXT1cIihob3ZlcmVkQmFuZCQgfCBhc3luYyk/LmRhdGVWYWx1ZSA9PT0gdGljay5kYXRlVmFsdWVcIlxuICAgICAgICBbYXR0ci54XT1cInRpY2sueCAtIDIwXCJcbiAgICAgICAgW2F0dHIueV09XCJkLnlTY2FsZSgwKSArIDNcIlxuICAgICAgICB3aWR0aD1cIjQwXCJcbiAgICAgICAgaGVpZ2h0PVwiMTJcIlxuICAgICAgICByeD1cIjJcIlxuICAgICAgPjwvcmVjdD5cbiAgICAgIDx0ZXh0XG4gICAgICAgIGNsYXNzPVwidGljay1sYWJlbFwiXG4gICAgICAgIFthdHRyLnhdPVwidGljay54XCJcbiAgICAgICAgW2F0dHIueV09XCJkLnlTY2FsZSgwKSArIDEyXCJcbiAgICAgICAgdGV4dC1hbmNob3I9XCJtaWRkbGVcIlxuICAgICAgPlxuICAgICAgICB7eyB0aWNrLmxhYmVsIH19XG4gICAgICA8L3RleHQ+XG4gICAgPC9nPlxuICAgIDxnICpuZ0Zvcj1cImxldCB0aWNrIG9mIGQueE1ham9yVGlja3NcIj5cbiAgICAgIDx0ZXh0XG4gICAgICAgIGNsYXNzPVwidGljay1sYWJlbFwiXG4gICAgICAgIFthdHRyLnhdPVwidGljay54XCJcbiAgICAgICAgW2F0dHIueV09XCJkLnlTY2FsZSgwKSArIDI0XCJcbiAgICAgICAgdGV4dC1hbmNob3I9XCJtaWRkbGVcIlxuICAgICAgPlxuICAgICAgICB7eyB0aWNrLmxhYmVsIH19XG4gICAgICA8L3RleHQ+XG4gICAgPC9nPlxuICAgIDxnICpuZ0Zvcj1cImxldCB0aWNrIG9mIGQueVRpY2tzXCI+XG4gICAgICA8cmVjdFxuICAgICAgICBjbGFzcz1cInRpY2tcIlxuICAgICAgICB4PVwiMFwiXG4gICAgICAgIFthdHRyLnldPVwiZC55U2NhbGUodGljaylcIlxuICAgICAgICB3aWR0aD1cIjEwMCVcIlxuICAgICAgICBoZWlnaHQ9XCIxXCJcbiAgICAgID48L3JlY3Q+XG4gICAgICA8dGV4dCBjbGFzcz1cInRpY2stbGFiZWxcIiB4PVwiMFwiIFthdHRyLnldPVwiZC55U2NhbGUodGljaylcIiBkeT1cIi00XCI+XG4gICAgICAgIHt7IHZhbHVlRm9ybWF0dGVyKHRpY2spIH19XG4gICAgICA8L3RleHQ+XG4gICAgPC9nPlxuICAgIDxnICpuZ0Zvcj1cImxldCByZWN0IG9mIGQucmVjdHNcIj5cbiAgICAgIDxyZWN0XG4gICAgICAgIGNsYXNzPVwiY29sdW1uXCJcbiAgICAgICAgW2F0dHIueF09XCJyZWN0LnhcIlxuICAgICAgICBbYXR0ci55XT1cInJlY3QueVwiXG4gICAgICAgIFthdHRyLndpZHRoXT1cInJlY3Qud2lkdGhcIlxuICAgICAgICBbYXR0ci5oZWlnaHRdPVwicmVjdC5oZWlnaHRcIlxuICAgICAgICBbYXR0ci5maWxsXT1cInJlY3QuZmlsbFwiXG4gICAgICAgIFtjbGFzcy5ibHVycmVkXT1cIlxuICAgICAgICAgIChob3ZlcmVkQmFuZCQgfCBhc3luYykgIT09IG51bGwgJiZcbiAgICAgICAgICAoaG92ZXJlZEJhbmQkIHwgYXN5bmMpPy5kYXRlVmFsdWUgIT09IHJlY3QuZGF0ZVZhbHVlXG4gICAgICAgIFwiXG4gICAgICA+PC9yZWN0PlxuICAgICAgPHJlY3RcbiAgICAgICAgKm5nSWY9XCJyZWN0LnN0cmlwZWRcIlxuICAgICAgICBbYXR0ci54XT1cInJlY3QueFwiXG4gICAgICAgIFthdHRyLnldPVwicmVjdC55XCJcbiAgICAgICAgW2F0dHIud2lkdGhdPVwicmVjdC53aWR0aFwiXG4gICAgICAgIFthdHRyLmhlaWdodF09XCJyZWN0LmhlaWdodFwiXG4gICAgICAgIGZpbGw9XCJ1cmwoI3N0cmlwZXMpXCJcbiAgICAgID48L3JlY3Q+XG4gICAgPC9nPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJnZXRSYW5nZSQgfCBhc3luYzsgbGV0IGdldFJhbmdlXCI+XG4gICAgICA8cmVjdFxuICAgICAgICAqbmdGb3I9XCJsZXQgcmVjdCBvZiBkLmhvdmVyQmFuZHNcIlxuICAgICAgICBbYXR0ci54XT1cInJlY3QueFwiXG4gICAgICAgIFthdHRyLnldPVwicmVjdC55XCJcbiAgICAgICAgW2F0dHIud2lkdGhdPVwicmVjdC53aWR0aFwiXG4gICAgICAgIFthdHRyLmhlaWdodF09XCJyZWN0LmhlaWdodFwiXG4gICAgICAgIGZpbGw9XCJ0cmFuc3BhcmVudFwiXG4gICAgICAgIChtb3VzZWVudGVyKT1cIlxuICAgICAgICAgIGhvdmVyZWRCYW5kJC5uZXh0KHsgZGF0ZVZhbHVlOiByZWN0LmRhdGVWYWx1ZSwgZXZlbnQ6ICRldmVudCB9KVxuICAgICAgICBcIlxuICAgICAgICAobW91c2VsZWF2ZSk9XCJob3ZlcmVkQmFuZCQubmV4dChudWxsKVwiXG4gICAgICAgIChjbGljayk9XCJcbiAgICAgICAgICBzdGFja0NsaWNrZWQuZW1pdChnZXRSYW5nZShyZWN0LmRhdGVWYWx1ZSkpOyBob3ZlcmVkQmFuZCQubmV4dChudWxsKVxuICAgICAgICBcIlxuICAgICAgPjwvcmVjdD5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC9zdmc+XG48L2Rpdj5cblxuPG5nLWNvbnRhaW5lciAqbmdJZj1cImNhbGxvdXQkIHwgYXN5bmM7IGxldCBjYWxsb3V0XCI+XG4gIDxyaXYtY2FsbG91dFxuICAgICpyaXYtb3ZlcmxheVxuICAgIFthbmNob3JdPVwiY2FsbG91dD8uYW5jaG9yID8/IG51bGxcIlxuICAgIFt0aGVtZV09XCInbGlnaHQnXCJcbiAgICBbaXNNb2RhbF09XCJmYWxzZVwiXG4gICAgW3ByZWZlcnJlZFBvc2l0aW9uXT1cIidjZW50ZXItcmlnaHQnXCJcbiAgICBbYWxsb3dlZFBvc2l0aW9uc109XCJbXG4gICAgICAnY2VudGVyLXJpZ2h0JyxcbiAgICAgICdjZW50ZXItbGVmdCcsXG4gICAgICAndG9wLWNlbnRlcicsXG4gICAgICAnYm90dG9tLWNlbnRlcidcbiAgICBdXCJcbiAgPlxuICAgIDxkaXYgY2xhc3M9XCJjYWxsb3V0LWNvbnRlbnRcIj5cbiAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiY2FsbG91dEhlYWRlclRlbXBsYXRlXCJcbiAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgJGltcGxpY2l0OiBjYWxsb3V0IH1cIlxuICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgPGRpdiBjbGFzcz1cImNhbGxvdXQtc3RhY2tcIiAqbmdGb3I9XCJsZXQgc3RhY2sgb2YgY2FsbG91dD8uY29udGVudFwiPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwic3RhY2sudGl0bGU7IGxldCB0aXRsZVwiIGNsYXNzPVwiY2FsbG91dC1yb3dcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInNlcmllcy1sYWJlbFwiPnt7IHRpdGxlIH19PC9zcGFuPlxuICAgICAgICAgIDxzcGFuPnt7IHN0YWNrLnRvdGFsIH19PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgc2VyaWVzIG9mIHN0YWNrLnNlcmllc1wiIGNsYXNzPVwiY2FsbG91dC1yb3dcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInNlcmllcy1sYWJlbFwiPlxuICAgICAgICAgICAgPHJpdi1sZWdlbmQtaXRlbVxuICAgICAgICAgICAgICBbY29sb3JUb2tlbl09XCJzZXJpZXMuY29sb3JUb2tlblwiXG4gICAgICAgICAgICAgIFtzdHlsZV09XCJzZXJpZXMuc3R5bGVcIlxuICAgICAgICAgICAgPjwvcml2LWxlZ2VuZC1pdGVtPlxuICAgICAgICAgICAgPHNwYW4+e3sgc2VyaWVzLmxhYmVsIH19PC9zcGFuPlxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8c3Bhbj57eyBzZXJpZXMuZm9ybWF0dGVkVmFsdWUgfX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvcml2LWNhbGxvdXQ+XG48L25nLWNvbnRhaW5lcj5cblxuPG5nLXRlbXBsYXRlICN6ZXJvU3RhdGU+XG4gIDxyaXYtemVyby1zdGF0ZT48L3Jpdi16ZXJvLXN0YXRlPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNjb250cm9scz5cbiAgPHJpdi1zaW1wbGUtc2VsZWN0XG4gICAgW29wdGlvbkdyb3Vwc109XCJpbnRlcnZhbE9wdGlvbnMkIHwgYXN5bmMgfCByaXZPcHRpb25Hcm91cFwiXG4gICAgW29yZGVyQnldPVwiJ3NvdXJjZSdcIlxuICAgIFtzZWxlY3RlZE9wdGlvbl09XCJzZWxlY3RlZEludGVydmFsT3B0aW9uJCB8IGFzeW5jXCJcbiAgICAoc2VsZWN0ZWRPcHRpb25DaGFuZ2UpPVwic2V0SW50ZXJ2YWxPcHRpb24oJGV2ZW50KVwiXG4gID48L3Jpdi1zaW1wbGUtc2VsZWN0PlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
@@ -1,18 +0,0 @@
1
- export function getDateRange(stacks) {
2
- let min = Infinity;
3
- let max = -Infinity;
4
- for (const stack of stacks) {
5
- for (const series of stack.series) {
6
- for (const { date } of series.data) {
7
- const value = date.valueOf();
8
- min = Math.min(min, value);
9
- max = Math.max(max, value);
10
- }
11
- }
12
- }
13
- return [new Date(min), new Date(max)];
14
- }
15
- export function pointReducer(points) {
16
- return points.reduce((total, { value }) => total + value, 0);
17
- }
18
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhY2tlZC1jb2x1bW4uaGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Jpdi9zcmMvbGliL3Zpc3VhbGl6YXRpb24vc3RhY2tlZC1jb2x1bW4vc3RhY2tlZC1jb2x1bW4uaGVscGVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxNQUFNLFVBQVUsWUFBWSxDQUMxQixNQUFzQztJQUV0QyxJQUFJLEdBQUcsR0FBRyxRQUFRLENBQUM7SUFDbkIsSUFBSSxHQUFHLEdBQUcsQ0FBQyxRQUFRLENBQUM7SUFDcEIsS0FBSyxNQUFNLEtBQUssSUFBSSxNQUFNLEVBQUU7UUFDMUIsS0FBSyxNQUFNLE1BQU0sSUFBSSxLQUFLLENBQUMsTUFBTSxFQUFFO1lBQ2pDLEtBQUssTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLE1BQU0sQ0FBQyxJQUFJLEVBQUU7Z0JBQ2xDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDN0IsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUMzQixHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7YUFDNUI7U0FDRjtLQUNGO0lBQ0QsT0FBTyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDeEMsQ0FBQztBQUVELE1BQU0sVUFBVSxZQUFZLENBQUMsTUFBc0M7SUFDakUsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxDQUFDLEtBQUssR0FBRyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDL0QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFN0YWNrZWRDb2x1bW5Db21wb25lbnQgfSBmcm9tICcuL3N0YWNrZWQtY29sdW1uLmNvbXBvbmVudCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXREYXRlUmFuZ2UoXG4gIHN0YWNrczogU3RhY2tlZENvbHVtbkNvbXBvbmVudC5TdGFja1tdLFxuKTogW0RhdGUsIERhdGVdIHtcbiAgbGV0IG1pbiA9IEluZmluaXR5O1xuICBsZXQgbWF4ID0gLUluZmluaXR5O1xuICBmb3IgKGNvbnN0IHN0YWNrIG9mIHN0YWNrcykge1xuICAgIGZvciAoY29uc3Qgc2VyaWVzIG9mIHN0YWNrLnNlcmllcykge1xuICAgICAgZm9yIChjb25zdCB7IGRhdGUgfSBvZiBzZXJpZXMuZGF0YSkge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGRhdGUudmFsdWVPZigpO1xuICAgICAgICBtaW4gPSBNYXRoLm1pbihtaW4sIHZhbHVlKTtcbiAgICAgICAgbWF4ID0gTWF0aC5tYXgobWF4LCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBbbmV3IERhdGUobWluKSwgbmV3IERhdGUobWF4KV07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwb2ludFJlZHVjZXIocG9pbnRzOiBTdGFja2VkQ29sdW1uQ29tcG9uZW50LlZhbHVlW10pIHtcbiAgcmV0dXJuIHBvaW50cy5yZWR1Y2UoKHRvdGFsLCB7IHZhbHVlIH0pID0+IHRvdGFsICsgdmFsdWUsIDApO1xufVxuIl19