@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.
- package/{esm2020 → esm2022}/lib/accessibility/sr-only/sr-only.component.mjs +4 -4
- package/esm2022/lib/download/download.service.mjs +47 -0
- package/{esm2020 → esm2022}/lib/format/pipes/common.mjs +5 -5
- package/{esm2020 → esm2022}/lib/format/pipes/date.pipe.mjs +4 -4
- package/{esm2020 → esm2022}/lib/format/pipes/days.pipe.mjs +4 -4
- package/{esm2020 → esm2022}/lib/format/pipes/dollars.pipe.mjs +4 -4
- package/{esm2020 → esm2022}/lib/format/pipes/number.pipe.mjs +4 -4
- package/{esm2020 → esm2022}/lib/format/pipes/percentage.pipe.mjs +4 -4
- package/esm2022/lib/format/pipes/sentence-case.pipe.mjs +61 -0
- package/esm2022/lib/format/pipes/small-currency.pipe.mjs +24 -0
- package/esm2022/lib/format/pipes/small-number.pipe.mjs +29 -0
- package/esm2022/lib/format/svg-text-truncate/svg-text-truncate.directive.mjs +62 -0
- package/esm2022/lib/format/truncate/truncate.component.mjs +51 -0
- package/esm2022/lib/icon/dom-cache.mjs +32 -0
- package/esm2022/lib/icon/icon.component.mjs +86 -0
- package/{esm2020 → esm2022}/lib/icon/icons.mjs +1 -1
- package/{esm2020 → esm2022}/lib/input/alphabetic-field/alphabetic-field.component.mjs +4 -4
- package/esm2022/lib/input/auto-focus/auto-focus.directive.mjs +48 -0
- package/esm2022/lib/input/button/button.component.mjs +139 -0
- package/esm2022/lib/input/button-group/button-group.component.mjs +39 -0
- package/{esm2020 → esm2022}/lib/input/calendar/calendar.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/input/card-checkbox/card-checkbox.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/input/checkbox/checkbox.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/input/currency-field/currency-field.component.mjs +4 -4
- package/esm2022/lib/input/date/date.component.mjs +279 -0
- package/esm2022/lib/input/date-range/date-range.component.mjs +477 -0
- package/esm2022/lib/input/filter-chip/filter-chip.component.mjs +47 -0
- package/{esm2020 → esm2022}/lib/input/filter-dropdown/filter-dropdown.component.mjs +5 -5
- package/{esm2020 → esm2022}/lib/input/input-label/input-label.component.mjs +4 -4
- package/esm2022/lib/input/mentions-input/mentions-input.component.mjs +745 -0
- package/esm2022/lib/input/number-field/number-field.component.mjs +125 -0
- package/{esm2020 → esm2022}/lib/input/percentage-field/percentage-field.component.mjs +4 -4
- package/esm2022/lib/input/phone-field/phone-field.component.mjs +74 -0
- package/{esm2020 → esm2022}/lib/input/radio/radio.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/input/search/search.component.mjs +4 -4
- package/esm2022/lib/input/search-select/search-select.component.mjs +189 -0
- package/esm2022/lib/input/select/select/select.component.mjs +178 -0
- package/{esm2020 → esm2022}/lib/input/select/select-node/select-node.component.mjs +4 -4
- package/esm2022/lib/input/select/state.mjs +882 -0
- package/{esm2020 → esm2022}/lib/input/simple-select/option-group.pipe.mjs +4 -4
- package/esm2022/lib/input/simple-select/simple-select.component.mjs +178 -0
- package/esm2022/lib/input/switch-checkbox/switch-checkbox.component.mjs +33 -0
- package/esm2022/lib/input/text-field/text-field.component.mjs +115 -0
- package/{esm2020 → esm2022}/lib/input/textarea-field/textarea-field.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/input/validation-message/validation-message.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/layout/card/card-actions.component.mjs +4 -4
- package/esm2022/lib/layout/card/card-content.component.mjs +64 -0
- package/esm2022/lib/layout/card/card-header.component.mjs +201 -0
- package/{esm2020 → esm2022}/lib/layout/card/card-link.component.mjs +5 -5
- package/{esm2020 → esm2022}/lib/layout/card/card-media.component.mjs +4 -4
- package/esm2022/lib/layout/card/card.component.mjs +291 -0
- package/{esm2020 → esm2022}/lib/layout/setting-row/setting-row.component.mjs +4 -4
- package/esm2022/lib/load/loading/loading.component.mjs +43 -0
- package/{esm2020 → esm2022}/lib/load/loading-cover/loading-cover.component.mjs +4 -4
- package/esm2022/lib/navigation/editable-heading/editable-heading.component.mjs +243 -0
- package/{esm2020 → esm2022}/lib/navigation/link/link.component.mjs +6 -6
- package/{esm2020 → esm2022}/lib/navigation/page-header/page-header.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/navigation/simple-tabs/simple-tab/simple-tab.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/navigation/simple-tabs/simple-tabs/simple-tabs.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/navigation/tabs/tab/tab.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/navigation/tabs/tabs/tabs.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/navigation/views/all-views-modal/all-views-modal.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/navigation/views/edit-view/edit-view.component.mjs +9 -9
- package/esm2022/lib/navigation/views/permission-picker/permission-picker.component.mjs +151 -0
- package/esm2022/lib/navigation/views/state.mjs +456 -0
- package/{esm2020 → esm2022}/lib/navigation/views/view-menu/view-menu.component.mjs +5 -5
- package/esm2022/lib/navigation/views/views/views.component.mjs +90 -0
- package/{esm2020 → esm2022}/lib/notification/badge/badge.component.mjs +4 -4
- package/esm2022/lib/notification/banner/banner-action.component.mjs +48 -0
- package/esm2022/lib/notification/banner/banner.component.mjs +61 -0
- package/esm2022/lib/notification/map-indicator/map-indicator.component.mjs +50 -0
- package/esm2022/lib/notification/map-indicator/map-indicators.mjs +15 -0
- package/{esm2020 → esm2022}/lib/notification/notification-badge/notification-badge.component.mjs +4 -4
- package/esm2022/lib/overlay/callout/callout.component.mjs +130 -0
- package/esm2022/lib/overlay/callout/callout.helpers.mjs +113 -0
- package/{esm2020 → esm2022}/lib/overlay/callout/help/help.component.mjs +4 -4
- package/esm2022/lib/overlay/callout/lock-scroll.directive.mjs +69 -0
- package/{esm2020 → esm2022}/lib/overlay/callout/menu/menu-item/menu-item.component.mjs +5 -5
- package/{esm2020 → esm2022}/lib/overlay/callout/menu/menu.component.mjs +4 -4
- package/esm2022/lib/overlay/callout/tooltip/locked-tooltip.directive.mjs +30 -0
- package/{esm2020 → esm2022}/lib/overlay/callout/tooltip/tooltip.component.mjs +4 -4
- package/esm2022/lib/overlay/callout/tooltip/tooltip.directive.mjs +138 -0
- package/esm2022/lib/overlay/modal/dialog/dialog.component.mjs +47 -0
- package/{esm2020 → esm2022}/lib/overlay/modal/dialog-stack.service.mjs +4 -4
- package/esm2022/lib/overlay/modal/form-dialog/form-dialog.component.mjs +146 -0
- package/esm2022/lib/overlay/modal/modal.component.mjs +31 -0
- package/{esm2020 → esm2022}/lib/overlay/modal/side-sheet/side-sheet.component.mjs +4 -4
- package/esm2022/lib/overlay/overlay-outlet.component.mjs +98 -0
- package/{esm2020 → esm2022}/lib/overlay/overlay.directive.mjs +5 -5
- package/{esm2020 → esm2022}/lib/overlay/overlay.service.mjs +5 -5
- package/{esm2020 → esm2022}/lib/overlay/toast/toast-action.component.mjs +4 -4
- package/esm2022/lib/overlay/toast/toast.component.mjs +41 -0
- package/{esm2020 → esm2022}/lib/riv.module.mjs +227 -227
- package/esm2022/lib/size/size.directive.mjs +33 -0
- package/esm2022/lib/table/simple-table/coordinate-helper.mjs +61 -0
- package/esm2022/lib/table/simple-table/simple-table-cell.component.mjs +36 -0
- package/esm2022/lib/table/simple-table/simple-table-header-cell.component.mjs +37 -0
- package/{esm2020 → esm2022}/lib/table/simple-table/simple-table-row.component.mjs +4 -4
- package/esm2022/lib/table/simple-table/simple-table.component.mjs +104 -0
- package/esm2022/lib/table/table/clipboard.mjs +182 -0
- package/esm2022/lib/table/table/state-helpers/collapse-helpers.mjs +116 -0
- package/esm2022/lib/table/table/state-helpers/column-helpers.mjs +383 -0
- package/{esm2020 → esm2022}/lib/table/table/state-helpers/display-helpers.mjs +1 -1
- package/esm2022/lib/table/table/state-helpers/nesting-helpers.mjs +123 -0
- package/esm2022/lib/table/table/state-helpers/order-helpers.mjs +164 -0
- package/esm2022/lib/table/table/state-helpers/pagination-helpers.mjs +139 -0
- package/esm2022/lib/table/table/state-helpers/result-helpers.mjs +70 -0
- package/esm2022/lib/table/table/state-helpers/search-helpers.mjs +72 -0
- package/esm2022/lib/table/table/state-helpers/selection-helpers.mjs +180 -0
- package/esm2022/lib/table/table/state.mjs +1035 -0
- package/esm2022/lib/table/table/table/table.component.mjs +367 -0
- package/{esm2020 → esm2022}/lib/table/table/table-collapse-all/table-collapse-all.component.mjs +5 -5
- package/esm2022/lib/table/table/table-column-settings/table-column-settings-side-sheet.component.mjs +227 -0
- package/esm2022/lib/table/table/table-column-settings/table-column-settings.component.mjs +134 -0
- package/esm2022/lib/table/table/table-csv-export/table-csv-export.component.mjs +35 -0
- package/{esm2020 → esm2022}/lib/table/table/table-header-resize-handle/table-header-resize-handle.component.mjs +6 -6
- package/esm2022/lib/table/table/table-search/table-search.component.mjs +71 -0
- package/{esm2020 → esm2022}/lib/table/table/table-search-columns/table-search-columns.component.mjs +4 -4
- package/esm2022/lib/visibility/visibility.directive.mjs +34 -0
- package/esm2022/lib/visualization/chart/chart-scaling.mjs +380 -0
- package/esm2022/lib/visualization/chart/chart.component.mjs +626 -0
- package/esm2022/lib/visualization/chart/chart.mjs +3768 -0
- package/{esm2020 → esm2022}/lib/visualization/data-table/data-table-cell.component.mjs +5 -5
- package/{esm2020 → esm2022}/lib/visualization/data-table/data-table-header-cell.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/visualization/data-table/data-table-row.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/visualization/data-table/data-table.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/visualization/donut/donut.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/visualization/funnel-chart/funnel-chart.component.mjs +5 -5
- package/esm2022/lib/visualization/funnel-chart/funnel-chart.helpers.mjs +33 -0
- package/{esm2020 → esm2022}/lib/visualization/highlight/highlight.component.mjs +4 -4
- package/esm2022/lib/visualization/highlight/highlight.helpers.mjs +20 -0
- package/esm2022/lib/visualization/intervals.mjs +63 -0
- package/{esm2020 → esm2022}/lib/visualization/issue/issue.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/visualization/legend-item/legend-item.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/visualization/metric/metric.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/visualization/mini-pie/mini-pie.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/visualization/progress/progress.component.mjs +5 -5
- package/esm2022/lib/visualization/stacked-column/stacked-column.component.mjs +377 -0
- package/esm2022/lib/visualization/stacked-column/stacked-column.helpers.mjs +18 -0
- package/esm2022/lib/visualization/stacked-row/stacked-row.component.mjs +270 -0
- package/esm2022/lib/visualization/stacked-row/stacked-row.helpers.mjs +74 -0
- package/esm2022/lib/visualization/time-series/time-series.component.mjs +374 -0
- package/esm2022/lib/visualization/time-series/time-series.helpers.mjs +15 -0
- package/esm2022/lib/visualization/trend/trend.component.mjs +51 -0
- package/{esm2020 → esm2022}/lib/visualization/zero-state/zero-state.component.mjs +4 -4
- package/{fesm2020 → fesm2022}/rivet-health-design-system.mjs +670 -670
- package/{fesm2020 → fesm2022}/rivet-health-design-system.mjs.map +1 -1
- package/lib/format/svg-text-truncate/svg-text-truncate.directive.d.ts +1 -1
- package/lib/format/truncate/truncate.component.d.ts +1 -1
- package/lib/icon/icon.component.d.ts +1 -1
- package/lib/input/auto-focus/auto-focus.directive.d.ts +1 -1
- package/lib/input/button/button.component.d.ts +1 -1
- package/lib/input/calendar/calendar.component.d.ts +1 -1
- package/lib/input/checkbox/checkbox.component.d.ts +1 -1
- package/lib/input/currency-field/currency-field.component.d.ts +1 -1
- package/lib/input/date/date.component.d.ts +1 -1
- package/lib/input/date-range/date-range.component.d.ts +1 -1
- package/lib/input/filter-chip/filter-chip.component.d.ts +1 -1
- package/lib/input/filter-dropdown/filter-dropdown.component.d.ts +1 -1
- package/lib/input/input-label/input-label.component.d.ts +1 -1
- package/lib/input/mentions-input/mentions-input.component.d.ts +1 -1
- package/lib/input/number-field/number-field.component.d.ts +1 -1
- package/lib/input/percentage-field/percentage-field.component.d.ts +1 -1
- package/lib/input/phone-field/phone-field.component.d.ts +1 -1
- package/lib/input/radio/radio.component.d.ts +1 -1
- package/lib/input/search/search.component.d.ts +1 -1
- package/lib/input/search-select/search-select.component.d.ts +1 -1
- package/lib/input/select/select/select.component.d.ts +1 -1
- package/lib/input/select/select-node/select-node.component.d.ts +1 -1
- package/lib/input/simple-select/simple-select.component.d.ts +1 -1
- package/lib/input/switch-checkbox/switch-checkbox.component.d.ts +1 -1
- package/lib/input/text-field/text-field.component.d.ts +1 -1
- package/lib/input/textarea-field/textarea-field.component.d.ts +1 -1
- package/lib/input/validation-message/validation-message.component.d.ts +1 -1
- package/lib/layout/card/card-actions.component.d.ts +1 -1
- package/lib/layout/card/card-content.component.d.ts +1 -1
- package/lib/layout/card/card-header.component.d.ts +1 -1
- package/lib/layout/card/card-link.component.d.ts +1 -1
- package/lib/layout/card/card-media.component.d.ts +1 -1
- package/lib/layout/card/card.component.d.ts +1 -1
- package/lib/layout/setting-row/setting-row.component.d.ts +1 -1
- package/lib/load/loading/loading.component.d.ts +1 -1
- package/lib/load/loading-cover/loading-cover.component.d.ts +1 -1
- package/lib/navigation/editable-heading/editable-heading.component.d.ts +1 -1
- package/lib/navigation/link/link.component.d.ts +1 -1
- package/lib/navigation/page-header/page-header.component.d.ts +1 -1
- package/lib/navigation/simple-tabs/simple-tab/simple-tab.component.d.ts +1 -1
- package/lib/navigation/tabs/tab/tab.component.d.ts +1 -1
- package/lib/navigation/views/all-views-modal/all-views-modal.component.d.ts +1 -1
- package/lib/navigation/views/edit-view/edit-view.component.d.ts +1 -1
- package/lib/navigation/views/permission-picker/permission-picker.component.d.ts +3 -3
- package/lib/navigation/views/view-menu/view-menu.component.d.ts +1 -1
- package/lib/navigation/views/views/views.component.d.ts +1 -1
- package/lib/notification/badge/badge.component.d.ts +1 -1
- package/lib/notification/banner/banner-action.component.d.ts +1 -1
- package/lib/notification/banner/banner.component.d.ts +1 -1
- package/lib/notification/map-indicator/map-indicator.component.d.ts +1 -1
- package/lib/notification/notification-badge/notification-badge.component.d.ts +1 -1
- package/lib/overlay/callout/callout.component.d.ts +1 -1
- package/lib/overlay/callout/help/help.component.d.ts +1 -1
- package/lib/overlay/callout/lock-scroll.directive.d.ts +1 -1
- package/lib/overlay/callout/menu/menu-item/menu-item.component.d.ts +1 -1
- package/lib/overlay/callout/menu/menu.component.d.ts +1 -1
- package/lib/overlay/callout/tooltip/locked-tooltip.directive.d.ts +1 -1
- package/lib/overlay/callout/tooltip/tooltip.component.d.ts +1 -1
- package/lib/overlay/callout/tooltip/tooltip.directive.d.ts +1 -1
- package/lib/overlay/modal/dialog/dialog.component.d.ts +1 -1
- package/lib/overlay/modal/form-dialog/form-dialog.component.d.ts +1 -1
- package/lib/overlay/modal/modal.component.d.ts +1 -1
- package/lib/overlay/modal/side-sheet/side-sheet.component.d.ts +1 -1
- package/lib/overlay/toast/toast.component.d.ts +1 -1
- package/lib/table/simple-table/simple-table-header-cell.component.d.ts +1 -1
- package/lib/table/simple-table/simple-table-row.component.d.ts +1 -1
- package/lib/table/table/table/table.component.d.ts +1 -1
- package/lib/table/table/table-collapse-all/table-collapse-all.component.d.ts +1 -1
- package/lib/table/table/table-column-settings/table-column-settings-side-sheet.component.d.ts +1 -1
- package/lib/table/table/table-column-settings/table-column-settings.component.d.ts +1 -1
- package/lib/table/table/table-csv-export/table-csv-export.component.d.ts +1 -1
- package/lib/table/table/table-search/table-search.component.d.ts +1 -1
- package/lib/table/table/table-search-columns/table-search-columns.component.d.ts +1 -1
- package/lib/visualization/chart/chart.component.d.ts +1 -1
- package/lib/visualization/data-table/data-table-row.component.d.ts +1 -1
- package/lib/visualization/donut/donut.component.d.ts +1 -1
- package/lib/visualization/funnel-chart/funnel-chart.component.d.ts +1 -1
- package/lib/visualization/highlight/highlight.component.d.ts +1 -1
- package/lib/visualization/issue/issue.component.d.ts +1 -1
- package/lib/visualization/legend-item/legend-item.component.d.ts +1 -1
- package/lib/visualization/metric/metric.component.d.ts +1 -1
- package/lib/visualization/mini-pie/mini-pie.component.d.ts +1 -1
- package/lib/visualization/progress/progress.component.d.ts +1 -1
- package/lib/visualization/stacked-column/stacked-column.component.d.ts +3 -3
- package/lib/visualization/stacked-row/stacked-row.component.d.ts +1 -1
- package/lib/visualization/time-series/time-series.component.d.ts +3 -3
- package/lib/visualization/trend/trend.component.d.ts +1 -1
- package/lib/visualization/zero-state/zero-state.component.d.ts +1 -1
- package/package.json +5 -11
- package/esm2020/lib/download/download.service.mjs +0 -47
- package/esm2020/lib/format/pipes/sentence-case.pipe.mjs +0 -61
- package/esm2020/lib/format/pipes/small-currency.pipe.mjs +0 -24
- package/esm2020/lib/format/pipes/small-number.pipe.mjs +0 -29
- package/esm2020/lib/format/svg-text-truncate/svg-text-truncate.directive.mjs +0 -62
- package/esm2020/lib/format/truncate/truncate.component.mjs +0 -51
- package/esm2020/lib/icon/dom-cache.mjs +0 -32
- package/esm2020/lib/icon/icon.component.mjs +0 -86
- package/esm2020/lib/input/auto-focus/auto-focus.directive.mjs +0 -48
- package/esm2020/lib/input/button/button.component.mjs +0 -139
- package/esm2020/lib/input/button-group/button-group.component.mjs +0 -39
- package/esm2020/lib/input/date/date.component.mjs +0 -279
- package/esm2020/lib/input/date-range/date-range.component.mjs +0 -477
- package/esm2020/lib/input/filter-chip/filter-chip.component.mjs +0 -47
- package/esm2020/lib/input/mentions-input/mentions-input.component.mjs +0 -745
- package/esm2020/lib/input/number-field/number-field.component.mjs +0 -125
- package/esm2020/lib/input/phone-field/phone-field.component.mjs +0 -74
- package/esm2020/lib/input/search-select/search-select.component.mjs +0 -189
- package/esm2020/lib/input/select/select/select.component.mjs +0 -178
- package/esm2020/lib/input/select/state.mjs +0 -882
- package/esm2020/lib/input/simple-select/simple-select.component.mjs +0 -178
- package/esm2020/lib/input/switch-checkbox/switch-checkbox.component.mjs +0 -33
- package/esm2020/lib/input/text-field/text-field.component.mjs +0 -115
- package/esm2020/lib/layout/card/card-content.component.mjs +0 -64
- package/esm2020/lib/layout/card/card-header.component.mjs +0 -201
- package/esm2020/lib/layout/card/card.component.mjs +0 -291
- package/esm2020/lib/load/loading/loading.component.mjs +0 -43
- package/esm2020/lib/navigation/editable-heading/editable-heading.component.mjs +0 -243
- package/esm2020/lib/navigation/views/permission-picker/permission-picker.component.mjs +0 -151
- package/esm2020/lib/navigation/views/state.mjs +0 -456
- package/esm2020/lib/navigation/views/views/views.component.mjs +0 -90
- package/esm2020/lib/notification/banner/banner-action.component.mjs +0 -48
- package/esm2020/lib/notification/banner/banner.component.mjs +0 -61
- package/esm2020/lib/notification/map-indicator/map-indicator.component.mjs +0 -50
- package/esm2020/lib/notification/map-indicator/map-indicators.mjs +0 -15
- package/esm2020/lib/overlay/callout/callout.component.mjs +0 -130
- package/esm2020/lib/overlay/callout/callout.helpers.mjs +0 -113
- package/esm2020/lib/overlay/callout/lock-scroll.directive.mjs +0 -69
- package/esm2020/lib/overlay/callout/tooltip/locked-tooltip.directive.mjs +0 -30
- package/esm2020/lib/overlay/callout/tooltip/tooltip.directive.mjs +0 -138
- package/esm2020/lib/overlay/modal/dialog/dialog.component.mjs +0 -47
- package/esm2020/lib/overlay/modal/form-dialog/form-dialog.component.mjs +0 -146
- package/esm2020/lib/overlay/modal/modal.component.mjs +0 -31
- package/esm2020/lib/overlay/overlay-outlet.component.mjs +0 -98
- package/esm2020/lib/overlay/toast/toast.component.mjs +0 -41
- package/esm2020/lib/size/size.directive.mjs +0 -33
- package/esm2020/lib/table/simple-table/coordinate-helper.mjs +0 -61
- package/esm2020/lib/table/simple-table/simple-table-cell.component.mjs +0 -36
- package/esm2020/lib/table/simple-table/simple-table-header-cell.component.mjs +0 -37
- package/esm2020/lib/table/simple-table/simple-table.component.mjs +0 -104
- package/esm2020/lib/table/table/clipboard.mjs +0 -182
- package/esm2020/lib/table/table/state-helpers/collapse-helpers.mjs +0 -116
- package/esm2020/lib/table/table/state-helpers/column-helpers.mjs +0 -383
- package/esm2020/lib/table/table/state-helpers/nesting-helpers.mjs +0 -123
- package/esm2020/lib/table/table/state-helpers/order-helpers.mjs +0 -164
- package/esm2020/lib/table/table/state-helpers/pagination-helpers.mjs +0 -139
- package/esm2020/lib/table/table/state-helpers/result-helpers.mjs +0 -70
- package/esm2020/lib/table/table/state-helpers/search-helpers.mjs +0 -72
- package/esm2020/lib/table/table/state-helpers/selection-helpers.mjs +0 -180
- package/esm2020/lib/table/table/state.mjs +0 -1035
- package/esm2020/lib/table/table/table/table.component.mjs +0 -367
- package/esm2020/lib/table/table/table-column-settings/table-column-settings-side-sheet.component.mjs +0 -227
- package/esm2020/lib/table/table/table-column-settings/table-column-settings.component.mjs +0 -134
- package/esm2020/lib/table/table/table-csv-export/table-csv-export.component.mjs +0 -35
- package/esm2020/lib/table/table/table-search/table-search.component.mjs +0 -71
- package/esm2020/lib/visibility/visibility.directive.mjs +0 -34
- package/esm2020/lib/visualization/chart/chart-scaling.mjs +0 -380
- package/esm2020/lib/visualization/chart/chart.component.mjs +0 -626
- package/esm2020/lib/visualization/chart/chart.mjs +0 -3768
- package/esm2020/lib/visualization/funnel-chart/funnel-chart.helpers.mjs +0 -33
- package/esm2020/lib/visualization/highlight/highlight.helpers.mjs +0 -20
- package/esm2020/lib/visualization/intervals.mjs +0 -63
- package/esm2020/lib/visualization/stacked-column/stacked-column.component.mjs +0 -377
- package/esm2020/lib/visualization/stacked-column/stacked-column.helpers.mjs +0 -18
- package/esm2020/lib/visualization/stacked-row/stacked-row.component.mjs +0 -270
- package/esm2020/lib/visualization/stacked-row/stacked-row.helpers.mjs +0 -74
- package/esm2020/lib/visualization/time-series/time-series.component.mjs +0 -374
- package/esm2020/lib/visualization/time-series/time-series.helpers.mjs +0 -15
- package/esm2020/lib/visualization/trend/trend.component.mjs +0 -51
- package/fesm2015/rivet-health-design-system.mjs +0 -18370
- package/fesm2015/rivet-health-design-system.mjs.map +0 -1
- /package/{esm2020 → esm2022}/lib/overlay/callout/select-callout-defaults.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/util/local-storage.mjs +0 -0
- /package/{esm2020 → esm2022}/public-api.mjs +0 -0
- /package/{esm2020 → esm2022}/rivet-health-design-system.mjs +0 -0
|
@@ -0,0 +1,377 @@
|
|
|
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
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: StackedColumnComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
355
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", 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 }); }
|
|
356
|
+
}
|
|
357
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", 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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QixTQUFTO3VCQUFDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBDb250ZW50Q2hpbGQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgVGVtcGxhdGVSZWYsXG4gIFZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBpbmRleCB9IGZyb20gJ2QzLWFycmF5JztcbmltcG9ydCB7IHNjYWxlQmFuZCwgc2NhbGVMaW5lYXIgfSBmcm9tICdkMy1zY2FsZSc7XG5pbXBvcnQgeyBzdGFjayB9IGZyb20gJ2QzLXNoYXBlJztcbmltcG9ydCB7IHV0Y0Zvcm1hdCB9IGZyb20gJ2QzLXRpbWUtZm9ybWF0JztcbmltcG9ydCB7XG4gIEJlaGF2aW9yU3ViamVjdCxcbiAgT2JzZXJ2YWJsZSxcbiAgY29tYmluZUxhdGVzdCxcbiAgbWFwLFxuICBzaGFyZVJlcGxheSxcbn0gZnJvbSAncnhqcyc7XG5pbXBvcnQge1xuICBJbnRlcnZhbCxcbiAgZ2V0SW50ZXJ2YWxUaXRsZSxcbiAgZ2V0TWFqb3JJbnRlcnZhbCxcbiAgZ2V0TWFqb3JJbnRlcnZhbEZvcm1hdCxcbiAgZ2V0TWlub3JJbnRlcnZhbEZvcm1hdCxcbiAgZ2V0VGltZUludGVydmFsLFxuICBpbnRlcnZhbHMsXG59IGZyb20gJy4uL2ludGVydmFscyc7XG5pbXBvcnQgeyBMZWdlbmRJdGVtQ29tcG9uZW50IH0gZnJvbSAnLi4vbGVnZW5kLWl0ZW0vbGVnZW5kLWl0ZW0uY29tcG9uZW50JztcbmltcG9ydCB7IGdldERhdGVSYW5nZSwgcG9pbnRSZWR1Y2VyIH0gZnJvbSAnLi9zdGFja2VkLWNvbHVtbi5oZWxwZXJzJztcblxuY29uc3QgREVGQVVMVF9JTlRFUlZBTDogSW50ZXJ2YWwgPSAnbW9udGgnO1xuXG50eXBlIEludGVydmFsT3B0aW9uID0ge1xuICBpZDogSW50ZXJ2YWw7XG4gIHRpdGxlOiBzdHJpbmc7XG59O1xuXG4vLyBUT0RPOiBvbmNlIHdlIHVwZ3JhZGUgdG8gQW5ndWxhciAxNiwgdGhpcyBjb21wb25lbnQgY2FuIGJlIGNsZWFuZWQgdXAgd2l0aFxuLy8gc2lnbmFscyBpbnN0ZWFkIG9mIFJ4SlMuXG4vLyBodHRwczovL3d3dy5ub3Rpb24uc28vcml2ZXQvUmVzb2x2ZS1UT0RPcy1hZnRlci1Bbmd1bGFyLXVwZ3JhZGUtMWYyNjY3ZWIyYTMxODBiNzlmNmFkOTJhN2U1NzZmMDhcbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3Jpdi1zdGFja2VkLWNvbHVtbicsXG4gIHRlbXBsYXRlVXJsOiAnLi9zdGFja2VkLWNvbHVtbi5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3N0YWNrZWQtY29sdW1uLmNvbXBvbmVudC5jc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIFN0YWNrZWRDb2x1bW5Db21wb25lbnQge1xuICBwcml2YXRlIHJlYWRvbmx5IGlucHV0JCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8U3RhY2tlZENvbHVtbkNvbXBvbmVudC5TdGFja1tdPihcbiAgICBbXSxcbiAgKTtcbiAgQElucHV0KClcbiAgcHVibGljIHNldCBpbnB1dCh2OiBTdGFja2VkQ29sdW1uQ29tcG9uZW50LlN0YWNrW10pIHtcbiAgICB0aGlzLmlucHV0JC5uZXh0KHYpO1xuICB9XG4gIHB1YmxpYyBnZXQgaW5wdXQoKTogU3RhY2tlZENvbHVtbkNvbXBvbmVudC5TdGFja1tdIHtcbiAgICByZXR1cm4gdGhpcy5pbnB1dCQuZ2V0VmFsdWUoKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgd2lkdGgkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxudW1iZXI+KDk2MCk7XG4gIHByb3RlY3RlZCBzZXQgd2lkdGgodjogbnVtYmVyKSB7XG4gICAgdGhpcy53aWR0aCQubmV4dCh2KTtcbiAgfVxuXG4gIEBDb250ZW50Q2hpbGQoVGVtcGxhdGVSZWYpXG4gIGNhbGxvdXRIZWFkZXJUZW1wbGF0ZSE6IFRlbXBsYXRlUmVmPHtcbiAgICAkaW1wbGljaXQ6IFN0YWNrZWRDb2x1bW5Db21wb25lbnQuQ2FsbG91dENvbnRleHQ7XG4gIH0+O1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgSEVJR0hUID0gMzAwO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyB2YWx1ZUZvcm1hdHRlcjogKHY6IG51bWJlcikgPT4gc3RyaW5nID0gdiA9PiB2LnRvU3RyaW5nKCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBpbnRlcnZhbCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEludGVydmFsPihERUZBVUxUX0lOVEVSVkFMKTtcbiAgQElucHV0KClcbiAgcHVibGljIHNldCBpbnRlcnZhbCh2OiBJbnRlcnZhbCkge1xuICAgIGlmICh2ICE9PSB0aGlzLmludGVydmFsJC5nZXRWYWx1ZSgpKSB7XG4gICAgICB0aGlzLmludGVydmFsJC5uZXh0KHYpO1xuICAgICAgdGhpcy5pbnRlcnZhbENoYW5nZWQuZW1pdCh2KTtcbiAgICB9XG4gIH1cbiAgcHVibGljIGdldCBpbnRlcnZhbCgpIHtcbiAgICByZXR1cm4gdGhpcy5pbnRlcnZhbCQuZ2V0VmFsdWUoKTtcbiAgfVxuXG4gIEBPdXRwdXQoKVxuICBpbnRlcnZhbENoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPEludGVydmFsPigpO1xuXG4gIEBPdXRwdXQoKVxuICBzdGFja0NsaWNrZWQgPSBuZXcgRXZlbnRFbWl0dGVyPFN0YWNrZWRDb2x1bW5Db21wb25lbnQuU3RhY2tDbGlja2VkPigpO1xuXG4gIEBWaWV3Q2hpbGQoJ2NvbnRyb2xzJylcbiAgcHVibGljIHJlYWRvbmx5IGNvbnRyb2xzPzogVGVtcGxhdGVSZWY8dm9pZD47XG5cbiAgcHJpdmF0ZSByZWFkb25seSBDT0xVTU5fV0lEVEhTID0gWzgsIDE2LCA0MCwgNzJdIGFzIGNvbnN0O1xuICBwcml2YXRlIHJlYWRvbmx5IE1JTl9DT0xVTU5fV0lEVEggPSB0aGlzLkNPTFVNTl9XSURUSFNbMF07XG5cbiAgcHJpdmF0ZSByZWFkb25seSBtYXhDb2x1bW5zJCA9IHRoaXMud2lkdGgkLnBpcGUoXG4gICAgbWFwKHdpZHRoID0+IHtcbiAgICAgIGNvbnN0IGlubmVyV2lkdGggPSB3aWR0aCAtIHRoaXMuTEVGVF9PRkZTRVQ7XG4gICAgICBjb25zdCBjb2x1bW5XaWR0aFdpdGhQYWRkaW5nID1cbiAgICAgICAgdGhpcy5NSU5fQ09MVU1OX1dJRFRIICsgdGhpcy5DT0xVTU5fUEFERElORyAqIDI7XG4gICAgICByZXR1cm4gTWF0aC5mbG9vcihpbm5lcldpZHRoIC8gY29sdW1uV2lkdGhXaXRoUGFkZGluZyk7XG4gICAgfSksXG4gICAgc2hhcmVSZXBsYXkoeyByZWZDb3VudDogdHJ1ZSwgYnVmZmVyU2l6ZTogMSB9KSxcbiAgKTtcblxuICBnZXRYU3RlcHNJblJhbmdlKGludGVydmFsOiBJbnRlcnZhbCwgbWluRGF0ZTogRGF0ZSwgbWF4RGF0ZTogRGF0ZSkge1xuICAgIGNvbnN0IHRpbWVJbnRlcnZhbCA9IGdldFRpbWVJbnRlcnZhbChpbnRlcnZhbCk7XG4gICAgcmV0dXJuIHRpbWVJbnRlcnZhbC5yYW5nZShcbiAgICAgIHRpbWVJbnRlcnZhbC5mbG9vcihtaW5EYXRlKSxcbiAgICAgIHRpbWVJbnRlcnZhbC5mbG9vcih0aW1lSW50ZXJ2YWwub2Zmc2V0KG1heERhdGUsIDEpKSxcbiAgICApLmxlbmd0aDtcbiAgfVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgYWxsb3dlZEludGVydmFscyQ6IE9ic2VydmFibGU8SW50ZXJ2YWxbXT4gPSBjb21iaW5lTGF0ZXN0KFtcbiAgICB0aGlzLmlucHV0JCxcbiAgICB0aGlzLm1heENvbHVtbnMkLFxuICBdKS5waXBlKFxuICAgIG1hcCgoW2lucHV0LCBtYXhDb2x1bW5zXSkgPT4ge1xuICAgICAgY29uc3QgW21pbkRhdGUsIG1heERhdGVdID0gZ2V0RGF0ZVJhbmdlKGlucHV0KTtcblxuICAgICAgcmV0dXJuIGludGVydmFscy5maWx0ZXIoaW50ZXJ2YWwgPT4ge1xuICAgICAgICBjb25zdCB4U3RlcHNDb3VudCA9IHRoaXMuZ2V0WFN0ZXBzSW5SYW5nZShpbnRlcnZhbCwgbWluRGF0ZSwgbWF4RGF0ZSk7XG4gICAgICAgIHJldHVybiBpbnB1dC5sZW5ndGggKiB4U3RlcHNDb3VudCA8PSBtYXhDb2x1bW5zO1xuICAgICAgfSk7XG4gICAgfSksXG4gICAgc2hhcmVSZXBsYXkoeyByZWZDb3VudDogdHJ1ZSwgYnVmZmVyU2l6ZTogMSB9KSxcbiAgKTtcblxuICByZWFkb25seSBpbnRlcnZhbE9wdGlvbnMkID0gdGhpcy5hbGxvd2VkSW50ZXJ2YWxzJC5waXBlKFxuICAgIG1hcChpbnRlcnZhbHMgPT5cbiAgICAgIGludGVydmFscy5tYXAoXG4gICAgICAgIChpbnRlcnZhbCk6IEludGVydmFsT3B0aW9uID0+ICh7XG4gICAgICAgICAgaWQ6IGludGVydmFsLFxuICAgICAgICAgIHRpdGxlOiBnZXRJbnRlcnZhbFRpdGxlKGludGVydmFsKSxcbiAgICAgICAgfSksXG4gICAgICApLFxuICAgICksXG4gICAgc2hhcmVSZXBsYXkoeyByZWZDb3VudDogdHJ1ZSwgYnVmZmVyU2l6ZTogMSB9KSxcbiAgKTtcblxuICByZWFkb25seSBzZWxlY3RlZEludGVydmFsT3B0aW9uJCA9IGNvbWJpbmVMYXRlc3QoW1xuICAgIHRoaXMuaW50ZXJ2YWwkLFxuICAgIHRoaXMuaW50ZXJ2YWxPcHRpb25zJCxcbiAgXSkucGlwZShcbiAgICBtYXAoKFtpbnRlcnZhbCwgb3B0aW9uc10pID0+IHtcbiAgICAgIGNvbnN0IGFsbG93ZWRJbnRlcnZhbHMgPSBvcHRpb25zLm1hcCgoeyBpZCB9KSA9PiBpZCBhcyBJbnRlcnZhbCk7XG4gICAgICBpZiAoIWFsbG93ZWRJbnRlcnZhbHMuaW5jbHVkZXMoaW50ZXJ2YWwpKSB7XG4gICAgICAgIGNvbnN0IGZpcnN0QWxsb3dlZCA9IGFsbG93ZWRJbnRlcnZhbHMuYXQoMCk7XG4gICAgICAgIGNvbnN0IGxhc3RBbGxvd2VkID0gYWxsb3dlZEludGVydmFscy5hdCgtMSk7XG4gICAgICAgIGlmICghZmlyc3RBbGxvd2VkIHx8ICFsYXN0QWxsb3dlZCkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgaWYgKGludGVydmFscy5pbmRleE9mKGludGVydmFsKSA8IGludGVydmFscy5pbmRleE9mKGZpcnN0QWxsb3dlZCkpXG4gICAgICAgICAgaW50ZXJ2YWwgPSBmaXJzdEFsbG93ZWQ7XG4gICAgICAgIGlmIChpbnRlcnZhbHMuaW5kZXhPZihpbnRlcnZhbCkgPiBpbnRlcnZhbHMuaW5kZXhPZihsYXN0QWxsb3dlZCkpXG4gICAgICAgICAgaW50ZXJ2YWwgPSBsYXN0QWxsb3dlZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBvcHRpb25zLmZpbmQobyA9PiBvLmlkID09PSBpbnRlcnZhbCkgPz8gbnVsbDtcbiAgICB9KSxcbiAgICBzaGFyZVJlcGxheSh7IHJlZkNvdW50OiB0cnVlLCBidWZmZXJTaXplOiAxIH0pLFxuICApO1xuXG4gIHJlYWRvbmx5IHNlbGVjdGVkSW50ZXJ2YWwkID0gdGhpcy5zZWxlY3RlZEludGVydmFsT3B0aW9uJC5waXBlKFxuICAgIG1hcChvcHRpb24gPT4gKG9wdGlvbiA/IChvcHRpb24uaWQgYXMgSW50ZXJ2YWwpIDogREVGQVVMVF9JTlRFUlZBTCkpLFxuICApO1xuXG4gIHNldEludGVydmFsT3B0aW9uKG9wdGlvbjogSW50ZXJ2YWxPcHRpb24gfCBudWxsKSB7XG4gICAgaWYgKG9wdGlvbikgdGhpcy5pbnRlcnZhbCA9IG9wdGlvbi5pZDtcbiAgfVxuXG4gIHByaXZhdGUgY29sdW1uV2lkdGgkID0gY29tYmluZUxhdGVzdChbXG4gICAgdGhpcy5pbnB1dCQsXG4gICAgdGhpcy5zZWxlY3RlZEludGVydmFsJCxcbiAgICB0aGlzLndpZHRoJCxcbiAgXSkucGlwZShcbiAgICBtYXAoKFtpbnB1dCwgc2VsZWN0ZWRJbnRlcnZhbCwgd2lkdGhdKSA9PiB7XG4gICAgICBjb25zdCBbbWluRGF0ZSwgbWF4RGF0ZV0gPSBnZXREYXRlUmFuZ2UoaW5wdXQpO1xuICAgICAgY29uc3QgeFN0ZXBDb3VudCA9IHRoaXMuZ2V0WFN0ZXBzSW5SYW5nZShcbiAgICAgICAgc2VsZWN0ZWRJbnRlcnZhbCxcbiAgICAgICAgbWluRGF0ZSxcbiAgICAgICAgbWF4RGF0ZSxcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IGlubmVyV2lkdGggPSB3aWR0aCAtIHRoaXMuTEVGVF9PRkZTRVQ7XG4gICAgICBjb25zdCBhbGxvd2VkQ29sdW1uV2lkdGhzID0gdGhpcy5DT0xVTU5fV0lEVEhTLmZpbHRlcihjb2x1bW5XaWR0aCA9PiB7XG4gICAgICAgIGNvbnN0IGNvbHVtbldpZHRoV2l0aFBhZGRpbmcgPSBjb2x1bW5XaWR0aCArIHRoaXMuQ09MVU1OX1BBRERJTkcgKiAyO1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIGlubmVyV2lkdGggLSBpbnB1dC5sZW5ndGggKiB4U3RlcENvdW50ICogY29sdW1uV2lkdGhXaXRoUGFkZGluZyA+PSAwXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGNvbHVtbldpZHRoID0gYWxsb3dlZENvbHVtbldpZHRocy5hdCgtMSk7XG4gICAgICBpZiAoIWNvbHVtbldpZHRoKSByZXR1cm4gMDtcblxuICAgICAgcmV0dXJuIGNvbHVtbldpZHRoO1xuICAgIH0pLFxuICAgIHNoYXJlUmVwbGF5KHsgcmVmQ291bnQ6IHRydWUsIGJ1ZmZlclNpemU6IDEgfSksXG4gICk7XG5cbiAgcmVhZG9ubHkgYmlubmVkRGF0YVdpdGhSYW5nZXMkOiBPYnNlcnZhYmxlPHtcbiAgICBzdGFja3M6IFN0YWNrZWRDb2x1bW5Db21wb25lbnQuU3RhY2tbXTtcbiAgICBnZXRSYW5nZTogKGRhdGU6IG51bWJlcikgPT4geyBtaW5EYXRlOiBEYXRlOyBtYXhEYXRlOiBEYXRlIH07XG4gIH0+ID0gY29tYmluZUxhdGVzdChbdGhpcy5pbnB1dCQsIHRoaXMuc2VsZWN0ZWRJbnRlcnZhbCRdKS5waXBlKFxuICAgIG1hcCgoW2lucHV0LCBpbnRlcnZhbF0pID0+IHtcbiAgICAgIGNvbnN0IHJhbmdlTWFwID0gbmV3IE1hcDxudW1iZXIsIERhdGU+KCk7XG4gICAgICBjb25zdCBzdGFja3MgPSBpbnB1dC5tYXAoKHN0YWNrKTogU3RhY2tlZENvbHVtbkNvbXBvbmVudC5TdGFjayA9PiB7XG4gICAgICAgIGNvbnN0IHRpbWVJbnRlcnZhbCA9IGdldFRpbWVJbnRlcnZhbChpbnRlcnZhbCk7XG5cbiAgICAgICAgY29uc3Qgc2VyaWVzID0gc3RhY2suc2VyaWVzLm1hcChzZXJpZXMgPT4ge1xuICAgICAgICAgIGNvbnN0IGJpbm5lZCA9IG5ldyBNYXA8bnVtYmVyLCBTdGFja2VkQ29sdW1uQ29tcG9uZW50LlZhbHVlW10+KCk7XG4gICAgICAgICAgZm9yIChjb25zdCBwb2ludCBvZiBzZXJpZXMuZGF0YSkge1xuICAgICAgICAgICAgY29uc3QgYmluS2V5ID0gdGltZUludGVydmFsLmZsb29yKHBvaW50LmRhdGUpLnZhbHVlT2YoKTtcbiAgICAgICAgICAgIGNvbnN0IG1heERhdGUgPSByYW5nZU1hcC5nZXQoYmluS2V5KTtcblxuICAgICAgICAgICAgaWYgKCFtYXhEYXRlIHx8IG1heERhdGUgPCBwb2ludC5kYXRlKSB7XG4gICAgICAgICAgICAgIHJhbmdlTWFwLnNldChiaW5LZXksIHBvaW50LmRhdGUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIWJpbm5lZC5oYXMoYmluS2V5KSkge1xuICAgICAgICAgICAgICBiaW5uZWQuc2V0KGJpbktleSwgW10pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgYmluID0gYmlubmVkLmdldChiaW5LZXkpITtcbiAgICAgICAgICAgIGJpbi5wdXNoKHBvaW50KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLnNlcmllcyxcbiAgICAgICAgICAgIGRhdGE6IFsuLi5iaW5uZWQuZW50cmllcygpXS5tYXAoKFtkYXRlVmFsdWUsIHBvaW50c10pID0+ICh7XG4gICAgICAgICAgICAgIGRhdGU6IG5ldyBEYXRlKGRhdGVWYWx1ZSksXG4gICAgICAgICAgICAgIHZhbHVlOiBwb2ludFJlZHVjZXIocG9pbnRzKSxcbiAgICAgICAgICAgIH0pKSxcbiAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5zdGFjayxcbiAgICAgICAgICBzZXJpZXM6IHNlcmllcyxcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3RhY2tzLFxuICAgICAgICBnZXRSYW5nZTogKGRhdGU6IG51bWJlcikgPT4ge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBtaW5EYXRlOiBuZXcgRGF0ZShkYXRlKSxcbiAgICAgICAgICAgIG1heERhdGU6IHJhbmdlTWFwLmdldChkYXRlKSEsXG4gICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfSksXG4gICAgc2hhcmVSZXBsYXkoeyByZWZDb3VudDogdHJ1ZSwgYnVmZmVyU2l6ZTogMSB9KSxcbiAgKTtcblxuICByZWFkb25seSBiaW5uZWREYXRhJCA9IHRoaXMuYmlubmVkRGF0YVdpdGhSYW5nZXMkLnBpcGUoXG4gICAgbWFwKGJpbm5lZERhdGEgPT4gYmlubmVkRGF0YS5zdGFja3MpLFxuICApO1xuXG4gIHJlYWRvbmx5IGdldFJhbmdlJCA9IHRoaXMuYmlubmVkRGF0YVdpdGhSYW5nZXMkLnBpcGUoXG4gICAgbWFwKGJpbm5lZERhdGEgPT4gYmlubmVkRGF0YS5nZXRSYW5nZSksXG4gICk7XG5cbiAgcmVhZG9ubHkgTEVGVF9PRkZTRVQgPSA0ODtcbiAgcmVhZG9ubHkgQ09MVU1OX1BBRERJTkcgPSA0O1xuXG4gIHJlYWRvbmx5IGRyYXdEYXRhJCA9IGNvbWJpbmVMYXRlc3QoW1xuICAgIHRoaXMuYmlubmVkRGF0YSQsXG4gICAgdGhpcy53aWR0aCQsXG4gICAgdGhpcy5zZWxlY3RlZEludGVydmFsJCxcbiAgICB0aGlzLmNvbHVtbldpZHRoJCxcbiAgXSkucGlwZShcbiAgICBtYXAoKFtiaW5uZWREYXRhLCB3aWR0aCwgaW50ZXJ2YWwsIGNvbHVtbldpZHRoXSkgPT4ge1xuICAgICAgY29uc3Qgdmlld0JveCA9IGAwIDAgJHt3aWR0aH0gJHt0aGlzLkhFSUdIVH1gO1xuICAgICAgY29uc3QgcGFkZGluZyA9IDE2O1xuXG4gICAgICBjb25zdCBbbWluRGF0ZSwgbWF4RGF0ZV0gPSBnZXREYXRlUmFuZ2UoYmlubmVkRGF0YSk7XG4gICAgICBjb25zdCBoYXNNdWx0aXBsZVllYXJzID0gbWluRGF0ZS5nZXRGdWxsWWVhcigpIDwgbWF4RGF0ZS5nZXRGdWxsWWVhcigpO1xuICAgICAgY29uc3QgeE1pbm9ySW50ZXJ2YWxGb3JtYXQgPSBnZXRNaW5vckludGVydmFsRm9ybWF0KGludGVydmFsKTtcbiAgICAgIGNvbnN0IG1pbm9yRm9ybWF0dGVyID0gdXRjRm9ybWF0KHhNaW5vckludGVydmFsRm9ybWF0KTtcbiAgICAgIGNvbnN0IG1pbm9yVGltZUludGVydmFsID0gZ2V0VGltZUludGVydmFsKGludGVydmFsKTtcbiAgICAgIGNvbnN0IHhTdGVwcyA9IG1pbm9yVGltZUludGVydmFsLnJhbmdlKFxuICAgICAgICBtaW5vclRpbWVJbnRlcnZhbC5mbG9vcihtaW5EYXRlKSxcbiAgICAgICAgbWlub3JUaW1lSW50ZXJ2YWwuZmxvb3IobWlub3JUaW1lSW50ZXJ2YWwub2Zmc2V0KG1heERhdGUsIDEpKSxcbiAgICAgICk7XG4gICAgICBjb25zdCB4TWFqb3JJbnRlcnZhbCA9IGdldE1ham9ySW50ZXJ2YWwoaW50ZXJ2YWwpO1xuICAgICAgY29uc3QgeE1ham9ySW50ZXJ2YWxGb3JtYXQgPSBnZXRNYWpvckludGVydmFsRm9ybWF0KFxuICAgICAgICB4TWFqb3JJbnRlcnZhbCxcbiAgICAgICAgaGFzTXVsdGlwbGVZZWFycyxcbiAgICAgICk7XG4gICAgICBjb25zdCBtYWpvckZvcm1hdHRlciA9IHV0Y0Zvcm1hdCh4TWFqb3JJbnRlcnZhbEZvcm1hdCk7XG4gICAgICBjb25zdCBmdWxsRm9ybWF0dGVyID0gdXRjRm9ybWF0KFxuICAgICAgICBgJHt4TWlub3JJbnRlcnZhbEZvcm1hdH0gJHt4TWFqb3JJbnRlcnZhbEZvcm1hdH1gLFxuICAgICAgKTtcblxuICAgICAgY29uc3QgeE91dGVyU2NhbGUgPSBzY2FsZUJhbmQoKVxuICAgICAgICAuZG9tYWluKHhTdGVwcy5tYXAoZGF0ZSA9PiBmdWxsRm9ybWF0dGVyKGRhdGUpKSlcbiAgICAgICAgLnJhbmdlKFt0aGlzLkxFRlRfT0ZGU0VULCB3aWR0aF0pO1xuXG4gICAgICBjb25zdCBvdXRlclBhZGRpbmcgPVxuICAgICAgICAoeE91dGVyU2NhbGUuYmFuZHdpZHRoKCkgLVxuICAgICAgICAgICh0aGlzLkNPTFVNTl9QQURESU5HICogKGJpbm5lZERhdGEubGVuZ3RoIC0gMSkgK1xuICAgICAgICAgICAgY29sdW1uV2lkdGggKiBiaW5uZWREYXRhLmxlbmd0aCkpIC9cbiAgICAgICAgMjtcblxuICAgICAgdHlwZSBTZXJpZXNQb2ludCA9IFN0YWNrZWRDb2x1bW5Db21wb25lbnQuVmFsdWUgJiB7XG4gICAgICAgIHNlcmllczogU3RhY2tlZENvbHVtbkNvbXBvbmVudC5TZXJpZXM7XG4gICAgICB9O1xuXG4gICAgICBjb25zdCByZW5kZXJJbmZvcm1hdGlvbiA9IGJpbm5lZERhdGEubWFwKHN0YWNrRGF0YSA9PiB7XG4gICAgICAgIC8qXG4gICAgICAgICAgQ3JlYXRlIGFuIGFycmF5IHdpdGggZXZlcnkgZGF0YSBwb2ludCArIHRoZWlyIGFzc29jaWF0ZWQgc2VyaWVzLlxuICAgICAgICAgIGkuZS4gTWFrZSBhbiBiYWNrbGluayBmb3IgZWFjaCBlbGVtZW50IHRvIGl0cyBzZXJpZXMuXG4gICAgICAgICovXG4gICAgICAgIGNvbnN0IHN0YWNrZWRUYWJsZSA9IHN0YWNrRGF0YS5zZXJpZXMucmVkdWNlPFNlcmllc1BvaW50W10+KFxuICAgICAgICAgICh0YWJsZSwgcykgPT4gW1xuICAgICAgICAgICAgLi4udGFibGUsXG4gICAgICAgICAgICAuLi5zLmRhdGEubWFwKHBvaW50ID0+ICh7XG4gICAgICAgICAgICAgIC4uLnBvaW50LFxuICAgICAgICAgICAgICBzZXJpZXM6IHMsXG4gICAgICAgICAgICB9KSksXG4gICAgICAgICAgXSxcbiAgICAgICAgICBbXSxcbiAgICAgICAgKTtcblxuICAgICAgICAvKlxuICAgICAgICAgIE1hcHMgZWFjaCBvZiB0aGUgU2VyaWVzUG9pbnRzIGJhc2VkIG9uIGxhYmVsLlxuICAgICAgICAgIFRoZW4gbWFwIGVhY2ggb2YgdGhvc2UgbWFwcyB0byBhIGRhdGUuXG5cbiAgICAgICAgICBFeGFtcGxlOlxuICAgICAgICAgICAgSWYgd2Ugd2VyZSBpbmRleGluZyB0aGUgZm9sbG93aW5nIGRhdGE6XG4gICAgICAgICAgICAgICogRXN0aW1hdGVzIENvbXBsZXRlIC0+IDUgaW4gSmFudWFyeSwgNyBpbiBGZWJydWFyeVxuICAgICAgICAgICAgICAqIEVzdGltYXRlcyBJbmNvbXBsZXRlIC0+IDMgaW4gSmFudWFyeSwgMyBpbiBGZWJydWFyeVxuICAgICAgICAgICAgV2Ugd291bGQgZ2V0IGFuIGluZGV4ZWQgdGFibGUgbGlrZSB0aGUgZm9sbG93aW5nLCAobm90ZSB0aGlzIGlzIHBzZXVkb2NvZGUpOlxuICAgICAgICAgICAgICAnSmFudWFyeSc6IHsgJ0VzdGltYXRlcyBDb21wbGV0ZSc6IDUsICdFc3RpbWF0ZXMgSW5jb21wbGV0ZSc6IDMgfVxuICAgICAgICAgICAgICAnRmVicnVhcnknOiB7ICdFc3RpbWF0ZXMgQ29tcGxldGUnOiA3LCAnRXN0aW1hdGVzIEluY29tcGxldGUnOiAzIH1cbiAgICAgICAgKi9cbiAgICAgICAgY29uc3QgaW5kZXhlZFRhYmxlOiBNYXA8RGF0ZSwgTWFwPHN0cmluZywgU2VyaWVzUG9pbnQ+PiA9IGluZGV4KFxuICAgICAgICAgIHN0YWNrZWRUYWJsZSxcbiAgICAgICAgICBkID0+IGQuZGF0ZSxcbiAgICAgICAgICBkID0+IGQuc2VyaWVzLmxhYmVsLFxuICAgICAgICApO1xuXG4gICAgICAgIC8qXG4gICAgICAgICAgVGhlIG91dHB1dCBvZiBcInN0YWNrKClcIiBpcyBhbiBhcnJheSBvZiBhcnJheXMgb2YgdHVwbGVzLlxuICAgICAgICAgICAgVGhlIHR1cGxlcyB1bm5lc3QgYXMgW2Jhc2VsaW5lLCB0b3BsaW5lXS5cbiAgICAgICAgICAgIEVhY2ggXCJrZXlcIiBpbnZvbHZlZCBpbiB0aGUgc3RhY2sgaGFzIGFuIGFycmF5IG9mIHR1cGxlcyByZWxhdGluZyB0byBpdC5cbiAgICAgICAgICAgICAgaS5lLiBbIERhdGUgMSBUdXBsZSwgRGF0ZSAyIFR1cGxlIF1cbiAgICAgICAgICAgIEFsbCBcImtleVwiIGFycmF5cyBhcmUgY29udGFpbmVkIGluIHRoZSBvdXRlciBhcnJheS5cbiAgICAgICAgICAgICAgaS5lLiBbIEtleSAxIFR1cGxlcywgS2V5IDIgVHVwbGVzXVxuXG4gICAgICAgICAgV2Ugc2VsZWN0IHRoZSBrZXlzIHVzaW5nIFwiLmtleXMoKVwiLlxuICAgICAgICAgICAgRm9yIG91ciBwdXJwb3NlcywgdGhlIGtleXMgYXJlIHRoZSBsZWdlbmQgZWxlbWVudHMuXG4gICAgICAgICAgICBpLmUuIElmIHlvdSBoYXZlIHR3byBibG9ja3Mgb2YgdGhlIHNhbWUgY29sb3IsIHRoZXkgaGF2ZSB0aGUgc2FtZSBrZXkuXG5cbiAgICAgICAgICBXZSBzZWxlY3QgdGhlIGhlaWdodHMgb2YgdGhlIGJsb2NrcyB1c2luZyBcIi52YWx1ZSgpXCIuXG5cbiAgICAgICAgICBXZSBhcmUgZ29pbmcgdG8gc3RhY2sgdGhlIGJsb2NrcyBvbiB0b3Agb2YgZWFjaCBvdGhlci5cbiAgICAgICAgICAgIFRoZSBiYXNlbGluZSBvZiB0aGUgZmlyc3Qga2V5IHR1cGxlcyBhcmUgMC5cbiAgICAgICAgICAgIFRoZSBiYXNlbGluZSBvZiB0aGUgc2Vjb25kIGtleSB0dXBsZXMgYXJlIHRoZSB0b3BsaW5lIG9mIHRoZSBhc3NvY2lhdGVkIGZpcnN0IGtleSB0dXBsZS5cblxuICAgICAgICAgIEV4YW1wbGU6XG4gICAgICAgICAgICBJZiB3ZSB3ZXJlIHN0YWNraW5nIHRoZSBmb2xsb3dpbmcgZGF0YTpcbiAgICAgICAgICAgICAgKiBFc3RpbWF0ZXMgQ29tcGxldGUgLT4gNSBpbiBKYW51YXJ5LCA3IGluIEZlYnJ1YXJ5XG4gICAgICAgICAgICAgICogRXN0aW1hdGVzIEluY29tcGxldGUgLT4gMyBpbiBKYW51YXJ5LCAzIGluIEZlYnJ1YXJ5XG4gICAgICAgICAgICBXZSB3b3VsZCBnZXQgYSBzdGFjayBvZjpcbiAgICAgICAgICAgICAgWyAgWyBbMCw1XSxbMCw3XSBdLCBbIFs1LDhdLFs3LDEwXSBdICBdXG4gICAgICAgICovXG4gICAgICAgIGNvbnN0IHN0YWNrZWQgPSBzdGFjazxcbiAgICAgICAgICB0eXBlb2YgaW5kZXhlZFRhYmxlIGV4dGVuZHMgTWFwPGluZmVyIEssIGluZmVyIFY+ID8gW0ssIFZdIDogbmV2ZXJcbiAgICAgICAgPigpXG4gICAgICAgICAgLmtleXMoc3RhY2tEYXRhLnNlcmllcy5tYXAodiA9PiB2LmxhYmVsKSlcbiAgICAgICAgICAudmFsdWUoKFtfLCBncm91cF0sIGtleSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGdyb3VwLmdldChrZXkpIS52YWx1ZTtcbiAgICAgICAgICB9KShpbmRleGVkVGFibGUpO1xuXG4gICAgICAgIHJldHVybiB7IGluZGV4ZWRUYWJsZSwgc3RhY2tlZCB9O1xuICAgICAgfSk7XG5cbiAgICAgIC8vIFRoZSBkb21haW4gc2hvdWxkIGJlIGJhc2VkIG9uIHRoZSBoaWdoZXN0IHZhbHVlIGluIGFueSBzdGFjaywgb24gYW55IGRhdGUuXG4gICAgICBsZXQgZG9tYWluTWF4ID0gMDtcbiAgICAgIC8vIEZvciBlYWNoIHVuaXF1ZSBzdGFjayxcbiAgICAgIHJlbmRlckluZm9ybWF0aW9uLmZvckVhY2goKHsgc3RhY2tlZCwgaW5kZXhlZFRhYmxlIH0pID0+IHtcbiAgICAgICAgLy8gRm9yIGVhY2ggZGF0ZSxcbiAgICAgICAgWy4uLmluZGV4ZWRUYWJsZS52YWx1ZXMoKV0uZm9yRWFjaCgocG9pbnRNYXAsIGkpID0+IHtcbiAgICAgICAgICAvLyBGb3IgZWFjaCBzZXJpZXMsXG4gICAgICAgICAgWy4uLnBvaW50TWFwLnZhbHVlcygpXS5mb3JFYWNoKChfLCBqKSA9PiB7XG4gICAgICAgICAgICBkb21haW5NYXggPSBNYXRoLm1heChkb21haW5NYXgsIC4uLnN0YWNrZWRbal1baV0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgaWYgKGRvbWFpbk1heCA9PT0gMCkgZG9tYWluTWF4ID0gMTtcbiAgICAgIGNvbnN0IHlTY2FsZSA9IHNjYWxlTGluZWFyKClcbiAgICAgICAgLmRvbWFpbihbMCwgZG9tYWluTWF4XSlcbiAgICAgICAgLnJhbmdlKFt0aGlzLkhFSUdIVCAtIHBhZGRpbmcgKiAyLCBwYWRkaW5nXSk7XG5cbiAgICAgIGNvbnN0IHJlY3RzOiB7XG4gICAgICAgIGRhdGVWYWx1ZTogbnVtYmVyO1xuICAgICAgICB4OiBudW1iZXI7XG4gICAgICAgIHk6IG51bWJlcjtcbiAgICAgICAgd2lkdGg6IG51bWJlcjtcbiAgICAgICAgaGVpZ2h0OiBudW1iZXI7XG4gICAgICAgIGZpbGw6IHN0cmluZztcbiAgICAgICAgc3RyaXBlZDogYm9vbGVhbjtcbiAgICAgICAgc2VyaWVzUG9pbnQ6IFNlcmllc1BvaW50O1xuICAgICAgfVtdID0gW107XG4gICAgICAvLyBGb3IgZWFjaCB1bmlxdWUgc3RhY2ssXG4gICAgICByZW5kZXJJbmZvcm1hdGlvbi5mb3JFYWNoKCh7IHN0YWNrZWQsIGluZGV4ZWRUYWJsZSB9LCBpbmRleCkgPT4ge1xuICAgICAgICAvLyBGb3IgZWFjaCBkYXRlLFxuICAgICAgICBbLi4uaW5kZXhlZFRhYmxlLmVudHJpZXMoKV0uZm9yRWFjaCgoW2RhdGUsIHBvaW50TWFwXSwgaSkgPT4ge1xuICAgICAgICAgIC8vIEZvciBlYWNoIHNlcmllcyxcbiAgICAgICAgICBbLi4ucG9pbnRNYXAuZW50cmllcygpXS5mb3JFYWNoKChbXywgc2VyaWVzUG9pbnRdLCBqKSA9PiB7XG4gICAgICAgICAgICAvLyBHZXQgdGhlIHNpemUgb2YgdGhlIGJveCB3ZSBhcmUgYWJvdXQgdG8gZHJhdy5cbiAgICAgICAgICAgIGNvbnN0IFtiYXNlbGluZSwgdG9wbGluZV0gPSBzdGFja2VkW2pdW2ldO1xuXG4gICAgICAgICAgICBjb25zdCB3aWR0aCA9IGNvbHVtbldpZHRoO1xuICAgICAgICAgICAgY29uc3QgaGVpZ2h0ID0geVNjYWxlKGJhc2VsaW5lKSAtIHlTY2FsZSh0b3BsaW5lKTtcbiAgICAgICAgICAgIGNvbnN0IHggPVxuICAgICAgICAgICAgICAoeE91dGVyU2NhbGUoZnVsbEZvcm1hdHRlcihkYXRlKSkgPz8gMCkgK1xuICAgICAgICAgICAgICBvdXRlclBhZGRpbmcgK1xuICAgICAgICAgICAgICBjb2x1bW5XaWR0aCAqIGluZGV4ICtcbiAgICAgICAgICAgICAgdGhpcy5DT0xVTU5fUEFERElORyAqIGluZGV4O1xuICAgICAgICAgICAgY29uc3QgeSA9IHlTY2FsZShiYXNlbGluZSkgLSBoZWlnaHQ7XG4gICAgICAgICAgICBjb25zdCBmaWxsID0gYHZhcigke3Nlcmllc1BvaW50LnNlcmllcy5jb2xvclRva2VufSlgO1xuXG4gICAgICAgICAgICByZWN0cy5wdXNoKHtcbiAgICAgICAgICAgICAgZGF0ZVZhbHVlOiBkYXRlLnZhbHVlT2YoKSxcbiAgICAgICAgICAgICAgeCxcbiAgICAgICAgICAgICAgeSxcbiAgICAgICAgICAgICAgd2lkdGgsXG4gICAgICAgICAgICAgIGhlaWdodCxcbiAgICAgICAgICAgICAgZmlsbCxcbiAgICAgICAgICAgICAgc3RyaXBlZDogc2VyaWVzUG9pbnQuc2VyaWVzLnN0eWxlID09PSAnc3RyaXBlZCcsXG4gICAgICAgICAgICAgIHNlcmllc1BvaW50LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHhNaW5vclRpY2tzID0geFN0ZXBzLm1hcChkYXRlID0+ICh7XG4gICAgICAgIGRhdGVWYWx1ZTogZGF0ZS52YWx1ZU9mKCksXG4gICAgICAgIGxhYmVsOiBtaW5vckZvcm1hdHRlcihkYXRlKSxcbiAgICAgICAgeDpcbiAgICAgICAgICAoeE91dGVyU2NhbGUoZnVsbEZvcm1hdHRlcihkYXRlKSkgPz8gMCkgKyB4T3V0ZXJTY2FsZS5iYW5kd2lkdGgoKSAvIDIsXG4gICAgICB9KSk7XG4gICAgICBjb25zdCB4TWFqb3JUaWNrcyA9XG4gICAgICAgIGludGVydmFsICE9PSAneWVhcidcbiAgICAgICAgICA/IHhTdGVwc1xuICAgICAgICAgICAgICAubWFwKGRhdGUgPT4gKHtcbiAgICAgICAgICAgICAgICBkYXRlVmFsdWU6IGRhdGUudmFsdWVPZigpLFxuICAgICAgICAgICAgICAgIGxhYmVsOiBtYWpvckZvcm1hdHRlcihkYXRlKSxcbiAgICAgICAgICAgICAgICB4OlxuICAgICAgICAgICAgICAgICAgKHhPdXRlclNjYWxlKGZ1bGxGb3JtYXR0ZXIoZGF0ZSkpID8/IDApICtcbiAgICAgICAgICAgICAgICAgIHhPdXRlclNjYWxlLmJhbmR3aWR0aCgpIC8gMixcbiAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgIC5maWx0ZXIoXG4gICAgICAgICAgICAgICAgKHRpY2ssIGksIHRpY2tzKSA9PlxuICAgICAgICAgICAgICAgICAgaSA9PT0gMCB8fCB0aWNrLmxhYmVsICE9PSB0aWNrc1tpIC0gMV0ubGFiZWwsXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICA6IFtdO1xuXG4gICAgICBjb25zdCB5VGlja3MgPSB5U2NhbGUudGlja3MoNSk7XG5cbiAgICAgIGNvbnN0IGhvdmVyQmFuZFdpZHRoID1cbiAgICAgICAgcmVuZGVySW5mb3JtYXRpb24ubGVuZ3RoICogY29sdW1uV2lkdGggK1xuICAgICAgICAocmVuZGVySW5mb3JtYXRpb24ubGVuZ3RoICsgMSkgKiB0aGlzLkNPTFVNTl9QQURESU5HO1xuICAgICAgY29uc3QgaG92ZXJCYW5kcyA9IHhTdGVwcy5tYXAoZGF0ZSA9PiAoe1xuICAgICAgICBkYXRlVmFsdWU6IGRhdGUudmFsdWVPZigpLFxuICAgICAgICB4OlxuICAgICAgICAgICh4T3V0ZXJTY2FsZShmdWxsRm9ybWF0dGVyKGRhdGUpKSA/PyAwKSArXG4gICAgICAgICAgKHhPdXRlclNjYWxlLmJhbmR3aWR0aCgpIC0gaG92ZXJCYW5kV2lkdGgpIC8gMixcbiAgICAgICAgeTogeVNjYWxlKGRvbWFpbk1heCksXG4gICAgICAgIHdpZHRoOiBob3ZlckJhbmRXaWR0aCxcbiAgICAgICAgaGVpZ2h0OiB5U2NhbGUoMCkgLSB5U2NhbGUoZG9tYWluTWF4KSxcbiAgICAgIH0pKTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29sdW1uV2lkdGgsXG4gICAgICAgIGhvdmVyQmFuZHMsXG4gICAgICAgIHJlY3RzLFxuICAgICAgICB2aWV3Qm94LFxuICAgICAgICB4TWlub3JUaWNrcyxcbiAgICAgICAgeE1ham9yVGlja3MsXG4gICAgICAgIHlTY2FsZSxcbiAgICAgICAgeVRpY2tzLFxuICAgICAgfTtcbiAgICB9KSxcbiAgICBzaGFyZVJlcGxheSh7IHJlZkNvdW50OiB0cnVlLCBidWZmZXJTaXplOiAxIH0pLFxuICApO1xuXG4gIHJlYWRvbmx5IGVtcHR5JCA9IHRoaXMuaW5wdXQkLnBpcGUoXG4gICAgbWFwKGlucHV0ID0+XG4gICAgICBpbnB1dC5ldmVyeShzdGFjayA9PlxuICAgICAgICBzdGFjay5zZXJpZXMuZXZlcnkoc2VyaWVzID0+IHNlcmllcy5kYXRhLmxlbmd0aCA9PT0gMCksXG4gICAgICApLFxuICAgICksXG4gICAgc2hhcmVSZXBsYXkoeyByZWZDb3VudDogdHJ1ZSwgYnVmZmVyU2l6ZTogMSB9KSxcbiAgKTtcblxuICByZWFkb25seSBob3ZlcmVkQmFuZCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHtcbiAgICBkYXRlVmFsdWU6IG51bWJlcjtcbiAgICBldmVudDogTW91c2VFdmVudDtcbiAgfSB8IG51bGw+KG51bGwpO1xuXG4gIHJlYWRvbmx5IGNhbGxvdXQkOiBPYnNlcnZhYmxlPFN0YWNrZWRDb2x1bW5Db21wb25lbnQuQ2FsbG91dENvbnRleHQgfCBudWxsPiA9XG4gICAgY29tYmluZUxhdGVzdChbdGhpcy5ob3ZlcmVkQmFuZCQsIHRoaXMuYmlubmVkRGF0YSRdKS5waXBlKFxuICAgICAgbWFwKChbaG92ZXJlZEJhbmQsIGJpbm5lZERhdGFdKSA9PiB7XG4gICAgICAgIGlmICghaG92ZXJlZEJhbmQpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGNvbnN0IHsgdGFyZ2V0IH0gPSBob3ZlcmVkQmFuZC5ldmVudDtcbiAgICAgICAgaWYgKCF0YXJnZXQpIHJldHVybiBudWxsO1xuICAgICAgICBjb25zdCBhbmNob3IgPSAoPFNWR1JlY3RFbGVtZW50PnRhcmdldCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBhbmNob3IsXG4gICAgICAgICAgY29udGVudDogYmlubmVkRGF0YS5tYXAoc3RhY2sgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc2VyaWVzUG9pbnRzID0gc3RhY2suc2VyaWVzLm1hcChzZXJpZXMgPT4gKHtcbiAgICAgICAgICAgICAgbGFiZWw6IHNlcmllcy5sYWJlbCxcbiAgICAgICAgICAgICAgY29sb3JUb2tlbjogc2VyaWVzLmNvbG9yVG9rZW4sXG4gICAgICAgICAgICAgIHN0eWxlOiBzZXJpZXMuc3R5bGUsXG4gICAgICAgICAgICAgIHZhbHVlOlxuICAgICAgICAgICAgICAgIHNlcmllcy5kYXRhLmZpbmQoXG4gICAgICAgICAgICAgICAgICAoeyBkYXRlIH0pID0+IGRhdGUudmFsdWVPZigpID09PSBob3ZlcmVkQmFuZC5kYXRlVmFsdWUsXG4gICAgICAgICAgICAgICAgKT8udmFsdWUgPz8gMCxcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIHRpdGxlOiBzdGFjay50aXRsZSxcbiAgICAgICAgICAgICAgdG90YWw6IHRoaXMudmFsdWVGb3JtYXR0ZXIoXG4gICAgICAgICAgICAgICAgc2VyaWVzUG9pbnRzLnJlZHVjZSgoYWNjLCBwb2ludCkgPT4gcG9pbnQudmFsdWUgKyBhY2MsIDApLFxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICBzZXJpZXM6IHNlcmllc1BvaW50cy5tYXAocG9pbnQgPT4gKHtcbiAgICAgICAgICAgICAgICAuLi5wb2ludCxcbiAgICAgICAgICAgICAgICBmb3JtYXR0ZWRWYWx1ZTogdGhpcy52YWx1ZUZvcm1hdHRlcihwb2ludC52YWx1ZSksXG4gICAgICAgICAgICAgIH0pKSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSksXG4gICAgICAgIH07XG4gICAgICB9KSxcbiAgICAgIHNoYXJlUmVwbGF5KHsgcmVmQ291bnQ6IHRydWUsIGJ1ZmZlclNpemU6IDEgfSksXG4gICAgKTtcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBTdGFja2VkQ29sdW1uQ29tcG9uZW50IHtcbiAgZXhwb3J0IHR5cGUgVmFsdWUgPSB7XG4gICAgZGF0ZTogRGF0ZTtcbiAgICB2YWx1ZTogbnVtYmVyO1xuICB9O1xuXG4gIGV4cG9ydCB0eXBlIFNlcmllcyA9IHtcbiAgICBsYWJlbDogc3RyaW5nO1xuICAgIGRhdGE6IFZhbHVlW107XG4gICAgY29sb3JUb2tlbjogc3RyaW5nO1xuICAgIHN0eWxlOiBMZWdlbmRJdGVtQ29tcG9uZW50LlN0eWxlO1xuICB9O1xuXG4gIGV4cG9ydCB0eXBlIFN0YWNrID0ge1xuICAgIHRpdGxlPzogc3RyaW5nO1xuICAgIHNlcmllczogU2VyaWVzW107XG4gIH07XG5cbiAgZXhwb3J0IHR5cGUgU3RhY2tDbGlja2VkID0ge1xuICAgIG1pbkRhdGU6IERhdGU7XG4gICAgbWF4RGF0ZTogRGF0ZTtcbiAgfTtcblxuICBleHBvcnQgdHlwZSBDYWxsb3V0Q29udGV4dCA9IHtcbiAgICBhbmNob3I6IERPTVJlY3Q7XG4gICAgY29udGVudDoge1xuICAgICAgdGl0bGU/OiBzdHJpbmc7XG4gICAgICB0b3RhbDogc3RyaW5nO1xuICAgICAgc2VyaWVzOiB7XG4gICAgICAgIGxhYmVsOiBzdHJpbmc7XG4gICAgICAgIGNvbG9yVG9rZW46IHN0cmluZztcbiAgICAgICAgc3R5bGU6IExlZ2VuZEl0ZW1Db21wb25lbnQuU3R5bGU7XG4gICAgICAgIHZhbHVlOiBudW1iZXI7XG4gICAgICAgIGZvcm1hdHRlZFZhbHVlOiBzdHJpbmc7XG4gICAgICB9W107XG4gICAgfVtdO1xuICB9O1xufVxuIiwiPGRpdlxuICAqbmdJZj1cIihlbXB0eSQgfCBhc3luYykgPT09IGZhbHNlOyBlbHNlIHplcm9TdGF0ZVwiXG4gIGNsYXNzPVwiY29udGFpbmVyXCJcbiAgKHJpdkNsaWVudFNpemUpPVwid2lkdGggPSAkZXZlbnQud2lkdGhcIlxuPlxuICA8c3ZnXG4gICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXG4gICAgKm5nSWY9XCJkcmF3RGF0YSQgfCBhc3luYzsgbGV0IGRcIlxuICAgIFthdHRyLnZpZXdCb3hdPVwiZC52aWV3Qm94XCJcbiAgPlxuICAgIDxkZWZzPlxuICAgICAgPHBhdHRlcm5cbiAgICAgICAgaWQ9XCJzdHJpcGVzXCJcbiAgICAgICAgeD1cIjBcIlxuICAgICAgICB5PVwiMFwiXG4gICAgICAgIFthdHRyLndpZHRoXT1cImQuY29sdW1uV2lkdGhcIlxuICAgICAgICBbYXR0ci5oZWlnaHRdPVwiZC5jb2x1bW5XaWR0aFwiXG4gICAgICAgIHBhdHRlcm5Vbml0cz1cInVzZXJTcGFjZU9uVXNlXCJcbiAgICAgID5cbiAgICAgICAgPGxpbmVcbiAgICAgICAgICB4MT1cIjBcIlxuICAgICAgICAgIFthdHRyLnkxXT1cImQuY29sdW1uV2lkdGhcIlxuICAgICAgICAgIFthdHRyLngyXT1cImQuY29sdW1uV2lkdGhcIlxuICAgICAgICAgIHkyPVwiMFwiXG4gICAgICAgICAgc3Ryb2tlPVwidmFyKC0td2hpdGUtMTAwKVwiXG4gICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMVwiXG4gICAgICAgID48L2xpbmU+XG4gICAgICA8L3BhdHRlcm4+XG4gICAgPC9kZWZzPlxuICAgIDxnICpuZ0Zvcj1cImxldCB0aWNrIG9mIGQueE1pbm9yVGlja3NcIj5cbiAgICAgIDxyZWN0XG4gICAgICAgIGNsYXNzPVwidGljay1iYWNrZ3JvdW5kXCJcbiAgICAgICAgW2NsYXNzLmZvY3VzZWRdPVwiKGhvdmVyZWRCYW5kJCB8IGFzeW5jKT8uZGF0ZVZhbHVlID09PSB0aWNrLmRhdGVWYWx1ZVwiXG4gICAgICAgIFthdHRyLnhdPVwidGljay54IC0gMjBcIlxuICAgICAgICBbYXR0ci55XT1cImQueVNjYWxlKDApICsgM1wiXG4gICAgICAgIHdpZHRoPVwiNDBcIlxuICAgICAgICBoZWlnaHQ9XCIxMlwiXG4gICAgICAgIHJ4PVwiMlwiXG4gICAgICA+PC9yZWN0PlxuICAgICAgPHRleHRcbiAgICAgICAgY2xhc3M9XCJ0aWNrLWxhYmVsXCJcbiAgICAgICAgW2F0dHIueF09XCJ0aWNrLnhcIlxuICAgICAgICBbYXR0ci55XT1cImQueVNjYWxlKDApICsgMTJcIlxuICAgICAgICB0ZXh0LWFuY2hvcj1cIm1pZGRsZVwiXG4gICAgICA+XG4gICAgICAgIHt7IHRpY2subGFiZWwgfX1cbiAgICAgIDwvdGV4dD5cbiAgICA8L2c+XG4gICAgPGcgKm5nRm9yPVwibGV0IHRpY2sgb2YgZC54TWFqb3JUaWNrc1wiPlxuICAgICAgPHRleHRcbiAgICAgICAgY2xhc3M9XCJ0aWNrLWxhYmVsXCJcbiAgICAgICAgW2F0dHIueF09XCJ0aWNrLnhcIlxuICAgICAgICBbYXR0ci55XT1cImQueVNjYWxlKDApICsgMjRcIlxuICAgICAgICB0ZXh0LWFuY2hvcj1cIm1pZGRsZVwiXG4gICAgICA+XG4gICAgICAgIHt7IHRpY2subGFiZWwgfX1cbiAgICAgIDwvdGV4dD5cbiAgICA8L2c+XG4gICAgPGcgKm5nRm9yPVwibGV0IHRpY2sgb2YgZC55VGlja3NcIj5cbiAgICAgIDxyZWN0XG4gICAgICAgIGNsYXNzPVwidGlja1wiXG4gICAgICAgIHg9XCIwXCJcbiAgICAgICAgW2F0dHIueV09XCJkLnlTY2FsZSh0aWNrKVwiXG4gICAgICAgIHdpZHRoPVwiMTAwJVwiXG4gICAgICAgIGhlaWdodD1cIjFcIlxuICAgICAgPjwvcmVjdD5cbiAgICAgIDx0ZXh0IGNsYXNzPVwidGljay1sYWJlbFwiIHg9XCIwXCIgW2F0dHIueV09XCJkLnlTY2FsZSh0aWNrKVwiIGR5PVwiLTRcIj5cbiAgICAgICAge3sgdmFsdWVGb3JtYXR0ZXIodGljaykgfX1cbiAgICAgIDwvdGV4dD5cbiAgICA8L2c+XG4gICAgPGcgKm5nRm9yPVwibGV0IHJlY3Qgb2YgZC5yZWN0c1wiPlxuICAgICAgPHJlY3RcbiAgICAgICAgY2xhc3M9XCJjb2x1bW5cIlxuICAgICAgICBbYXR0ci54XT1cInJlY3QueFwiXG4gICAgICAgIFthdHRyLnldPVwicmVjdC55XCJcbiAgICAgICAgW2F0dHIud2lkdGhdPVwicmVjdC53aWR0aFwiXG4gICAgICAgIFthdHRyLmhlaWdodF09XCJyZWN0LmhlaWdodFwiXG4gICAgICAgIFthdHRyLmZpbGxdPVwicmVjdC5maWxsXCJcbiAgICAgICAgW2NsYXNzLmJsdXJyZWRdPVwiXG4gICAgICAgICAgKGhvdmVyZWRCYW5kJCB8IGFzeW5jKSAhPT0gbnVsbCAmJlxuICAgICAgICAgIChob3ZlcmVkQmFuZCQgfCBhc3luYyk/LmRhdGVWYWx1ZSAhPT0gcmVjdC5kYXRlVmFsdWVcbiAgICAgICAgXCJcbiAgICAgID48L3JlY3Q+XG4gICAgICA8cmVjdFxuICAgICAgICAqbmdJZj1cInJlY3Quc3RyaXBlZFwiXG4gICAgICAgIFthdHRyLnhdPVwicmVjdC54XCJcbiAgICAgICAgW2F0dHIueV09XCJyZWN0LnlcIlxuICAgICAgICBbYXR0ci53aWR0aF09XCJyZWN0LndpZHRoXCJcbiAgICAgICAgW2F0dHIuaGVpZ2h0XT1cInJlY3QuaGVpZ2h0XCJcbiAgICAgICAgZmlsbD1cInVybCgjc3RyaXBlcylcIlxuICAgICAgPjwvcmVjdD5cbiAgICA8L2c+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImdldFJhbmdlJCB8IGFzeW5jOyBsZXQgZ2V0UmFuZ2VcIj5cbiAgICAgIDxyZWN0XG4gICAgICAgICpuZ0Zvcj1cImxldCByZWN0IG9mIGQuaG92ZXJCYW5kc1wiXG4gICAgICAgIFthdHRyLnhdPVwicmVjdC54XCJcbiAgICAgICAgW2F0dHIueV09XCJyZWN0LnlcIlxuICAgICAgICBbYXR0ci53aWR0aF09XCJyZWN0LndpZHRoXCJcbiAgICAgICAgW2F0dHIuaGVpZ2h0XT1cInJlY3QuaGVpZ2h0XCJcbiAgICAgICAgZmlsbD1cInRyYW5zcGFyZW50XCJcbiAgICAgICAgKG1vdXNlZW50ZXIpPVwiXG4gICAgICAgICAgaG92ZXJlZEJhbmQkLm5leHQoeyBkYXRlVmFsdWU6IHJlY3QuZGF0ZVZhbHVlLCBldmVudDogJGV2ZW50IH0pXG4gICAgICAgIFwiXG4gICAgICAgIChtb3VzZWxlYXZlKT1cImhvdmVyZWRCYW5kJC5uZXh0KG51bGwpXCJcbiAgICAgICAgKGNsaWNrKT1cIlxuICAgICAgICAgIHN0YWNrQ2xpY2tlZC5lbWl0KGdldFJhbmdlKHJlY3QuZGF0ZVZhbHVlKSk7IGhvdmVyZWRCYW5kJC5uZXh0KG51bGwpXG4gICAgICAgIFwiXG4gICAgICA+PC9yZWN0PlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L3N2Zz5cbjwvZGl2PlxuXG48bmctY29udGFpbmVyICpuZ0lmPVwiY2FsbG91dCQgfCBhc3luYzsgbGV0IGNhbGxvdXRcIj5cbiAgPHJpdi1jYWxsb3V0XG4gICAgKnJpdi1vdmVybGF5XG4gICAgW2FuY2hvcl09XCJjYWxsb3V0Py5hbmNob3IgPz8gbnVsbFwiXG4gICAgW3RoZW1lXT1cIidsaWdodCdcIlxuICAgIFtpc01vZGFsXT1cImZhbHNlXCJcbiAgICBbcHJlZmVycmVkUG9zaXRpb25dPVwiJ2NlbnRlci1yaWdodCdcIlxuICAgIFthbGxvd2VkUG9zaXRpb25zXT1cIltcbiAgICAgICdjZW50ZXItcmlnaHQnLFxuICAgICAgJ2NlbnRlci1sZWZ0JyxcbiAgICAgICd0b3AtY2VudGVyJyxcbiAgICAgICdib3R0b20tY2VudGVyJ1xuICAgIF1cIlxuICA+XG4gICAgPGRpdiBjbGFzcz1cImNhbGxvdXQtY29udGVudFwiPlxuICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJjYWxsb3V0SGVhZGVyVGVtcGxhdGVcIlxuICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyAkaW1wbGljaXQ6IGNhbGxvdXQgfVwiXG4gICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY2FsbG91dC1zdGFja1wiICpuZ0Zvcj1cImxldCBzdGFjayBvZiBjYWxsb3V0Py5jb250ZW50XCI+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJzdGFjay50aXRsZTsgbGV0IHRpdGxlXCIgY2xhc3M9XCJjYWxsb3V0LXJvd1wiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2VyaWVzLWxhYmVsXCI+e3sgdGl0bGUgfX08L3NwYW4+XG4gICAgICAgICAgPHNwYW4+e3sgc3RhY2sudG90YWwgfX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBzZXJpZXMgb2Ygc3RhY2suc2VyaWVzXCIgY2xhc3M9XCJjYWxsb3V0LXJvd1wiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2VyaWVzLWxhYmVsXCI+XG4gICAgICAgICAgICA8cml2LWxlZ2VuZC1pdGVtXG4gICAgICAgICAgICAgIFtjb2xvclRva2VuXT1cInNlcmllcy5jb2xvclRva2VuXCJcbiAgICAgICAgICAgICAgW3N0eWxlXT1cInNlcmllcy5zdHlsZVwiXG4gICAgICAgICAgICA+PC9yaXYtbGVnZW5kLWl0ZW0+XG4gICAgICAgICAgICA8c3Bhbj57eyBzZXJpZXMubGFiZWwgfX08L3NwYW4+XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDxzcGFuPnt7IHNlcmllcy5mb3JtYXR0ZWRWYWx1ZSB9fTwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9yaXYtY2FsbG91dD5cbjwvbmctY29udGFpbmVyPlxuXG48bmctdGVtcGxhdGUgI3plcm9TdGF0ZT5cbiAgPHJpdi16ZXJvLXN0YXRlPjwvcml2LXplcm8tc3RhdGU+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2NvbnRyb2xzPlxuICA8cml2LXNpbXBsZS1zZWxlY3RcbiAgICBbb3B0aW9uR3JvdXBzXT1cImludGVydmFsT3B0aW9ucyQgfCBhc3luYyB8IHJpdk9wdGlvbkdyb3VwXCJcbiAgICBbb3JkZXJCeV09XCInc291cmNlJ1wiXG4gICAgW3NlbGVjdGVkT3B0aW9uXT1cInNlbGVjdGVkSW50ZXJ2YWxPcHRpb24kIHwgYXN5bmNcIlxuICAgIChzZWxlY3RlZE9wdGlvbkNoYW5nZSk9XCJzZXRJbnRlcnZhbE9wdGlvbigkZXZlbnQpXCJcbiAgPjwvcml2LXNpbXBsZS1zZWxlY3Q+XG48L25nLXRlbXBsYXRlPlxuIl19
|
|
@@ -0,0 +1,18 @@
|
|
|
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhY2tlZC1jb2x1bW4uaGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Jpdi9zcmMvbGliL3Zpc3VhbGl6YXRpb24vc3RhY2tlZC1jb2x1bW4vc3RhY2tlZC1jb2x1bW4uaGVscGVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxNQUFNLFVBQVUsWUFBWSxDQUMxQixNQUFzQztJQUV0QyxJQUFJLEdBQUcsR0FBRyxRQUFRLENBQUM7SUFDbkIsSUFBSSxHQUFHLEdBQUcsQ0FBQyxRQUFRLENBQUM7SUFDcEIsS0FBSyxNQUFNLEtBQUssSUFBSSxNQUFNLEVBQUUsQ0FBQztRQUMzQixLQUFLLE1BQU0sTUFBTSxJQUFJLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNsQyxLQUFLLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ25DLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDN0IsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUMzQixHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDN0IsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDeEMsQ0FBQztBQUVELE1BQU0sVUFBVSxZQUFZLENBQUMsTUFBc0M7SUFDakUsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxDQUFDLEtBQUssR0FBRyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDL0QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFN0YWNrZWRDb2x1bW5Db21wb25lbnQgfSBmcm9tICcuL3N0YWNrZWQtY29sdW1uLmNvbXBvbmVudCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXREYXRlUmFuZ2UoXG4gIHN0YWNrczogU3RhY2tlZENvbHVtbkNvbXBvbmVudC5TdGFja1tdLFxuKTogW0RhdGUsIERhdGVdIHtcbiAgbGV0IG1pbiA9IEluZmluaXR5O1xuICBsZXQgbWF4ID0gLUluZmluaXR5O1xuICBmb3IgKGNvbnN0IHN0YWNrIG9mIHN0YWNrcykge1xuICAgIGZvciAoY29uc3Qgc2VyaWVzIG9mIHN0YWNrLnNlcmllcykge1xuICAgICAgZm9yIChjb25zdCB7IGRhdGUgfSBvZiBzZXJpZXMuZGF0YSkge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGRhdGUudmFsdWVPZigpO1xuICAgICAgICBtaW4gPSBNYXRoLm1pbihtaW4sIHZhbHVlKTtcbiAgICAgICAgbWF4ID0gTWF0aC5tYXgobWF4LCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBbbmV3IERhdGUobWluKSwgbmV3IERhdGUobWF4KV07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwb2ludFJlZHVjZXIocG9pbnRzOiBTdGFja2VkQ29sdW1uQ29tcG9uZW50LlZhbHVlW10pIHtcbiAgcmV0dXJuIHBvaW50cy5yZWR1Y2UoKHRvdGFsLCB7IHZhbHVlIH0pID0+IHRvdGFsICsgdmFsdWUsIDApO1xufVxuIl19
|