@rivet-health/design-system 40.44.4 → 41.0.0

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 (302) hide show
  1. package/fesm2022/rivet-health-design-system.mjs +23103 -18810
  2. package/fesm2022/rivet-health-design-system.mjs.map +1 -1
  3. package/package.json +8 -9
  4. package/types/rivet-health-design-system.d.ts +6566 -0
  5. package/esm2022/lib/accessibility/sr-only/sr-only.component.mjs +0 -18
  6. package/esm2022/lib/download/download.service.mjs +0 -47
  7. package/esm2022/lib/format/pipes/common.mjs +0 -24
  8. package/esm2022/lib/format/pipes/date.pipe.mjs +0 -20
  9. package/esm2022/lib/format/pipes/days.pipe.mjs +0 -20
  10. package/esm2022/lib/format/pipes/dollars.pipe.mjs +0 -19
  11. package/esm2022/lib/format/pipes/number.pipe.mjs +0 -19
  12. package/esm2022/lib/format/pipes/percentage.pipe.mjs +0 -19
  13. package/esm2022/lib/format/pipes/sentence-case.pipe.mjs +0 -61
  14. package/esm2022/lib/format/pipes/small-currency.pipe.mjs +0 -24
  15. package/esm2022/lib/format/pipes/small-number.pipe.mjs +0 -29
  16. package/esm2022/lib/format/svg-text-truncate/svg-text-truncate.directive.mjs +0 -62
  17. package/esm2022/lib/format/truncate/truncate.component.mjs +0 -51
  18. package/esm2022/lib/icon/dom-cache.mjs +0 -32
  19. package/esm2022/lib/icon/icon.component.mjs +0 -86
  20. package/esm2022/lib/icon/icons.mjs +0 -271
  21. package/esm2022/lib/input/alphabetic-field/alphabetic-field.component.mjs +0 -42
  22. package/esm2022/lib/input/auto-focus/auto-focus.directive.mjs +0 -48
  23. package/esm2022/lib/input/button/button.component.mjs +0 -139
  24. package/esm2022/lib/input/button-group/button-group.component.mjs +0 -39
  25. package/esm2022/lib/input/calendar/calendar.component.mjs +0 -318
  26. package/esm2022/lib/input/card-checkbox/card-checkbox.component.mjs +0 -13
  27. package/esm2022/lib/input/checkbox/checkbox.component.mjs +0 -84
  28. package/esm2022/lib/input/currency-field/currency-field.component.mjs +0 -26
  29. package/esm2022/lib/input/date/date.component.mjs +0 -279
  30. package/esm2022/lib/input/date-range/date-range.component.mjs +0 -478
  31. package/esm2022/lib/input/filter-chip/filter-chip.component.mjs +0 -47
  32. package/esm2022/lib/input/filter-dropdown/filter-dropdown.component.mjs +0 -89
  33. package/esm2022/lib/input/input-label/input-label.component.mjs +0 -38
  34. package/esm2022/lib/input/mentions-input/mentions-input.component.mjs +0 -745
  35. package/esm2022/lib/input/number-field/number-field.component.mjs +0 -125
  36. package/esm2022/lib/input/percentage-field/percentage-field.component.mjs +0 -20
  37. package/esm2022/lib/input/phone-field/phone-field.component.mjs +0 -74
  38. package/esm2022/lib/input/radio/radio.component.mjs +0 -58
  39. package/esm2022/lib/input/search/search.component.mjs +0 -26
  40. package/esm2022/lib/input/search-select/search-select.component.mjs +0 -189
  41. package/esm2022/lib/input/select/select/select.component.mjs +0 -179
  42. package/esm2022/lib/input/select/select-node/select-node.component.mjs +0 -60
  43. package/esm2022/lib/input/select/state.mjs +0 -882
  44. package/esm2022/lib/input/simple-select/option-group.pipe.mjs +0 -19
  45. package/esm2022/lib/input/simple-select/simple-select.component.mjs +0 -178
  46. package/esm2022/lib/input/switch-checkbox/switch-checkbox.component.mjs +0 -33
  47. package/esm2022/lib/input/text-field/text-field.component.mjs +0 -115
  48. package/esm2022/lib/input/textarea-field/textarea-field.component.mjs +0 -21
  49. package/esm2022/lib/input/validation-message/validation-message.component.mjs +0 -17
  50. package/esm2022/lib/layout/card/card-actions.component.mjs +0 -72
  51. package/esm2022/lib/layout/card/card-content.component.mjs +0 -64
  52. package/esm2022/lib/layout/card/card-header.component.mjs +0 -201
  53. package/esm2022/lib/layout/card/card-link.component.mjs +0 -115
  54. package/esm2022/lib/layout/card/card-media.component.mjs +0 -70
  55. package/esm2022/lib/layout/card/card.component.mjs +0 -306
  56. package/esm2022/lib/layout/setting-row/setting-row.component.mjs +0 -111
  57. package/esm2022/lib/load/loading/loading.component.mjs +0 -43
  58. package/esm2022/lib/load/loading-cover/loading-cover.component.mjs +0 -25
  59. package/esm2022/lib/navigation/editable-heading/editable-heading.component.mjs +0 -243
  60. package/esm2022/lib/navigation/link/link.component.mjs +0 -48
  61. package/esm2022/lib/navigation/page-header/page-header.component.mjs +0 -68
  62. package/esm2022/lib/navigation/simple-tabs/simple-tab/simple-tab.component.mjs +0 -43
  63. package/esm2022/lib/navigation/simple-tabs/simple-tabs/simple-tabs.component.mjs +0 -11
  64. package/esm2022/lib/navigation/tabs/tab/tab.component.mjs +0 -16
  65. package/esm2022/lib/navigation/tabs/tabs/tabs.component.mjs +0 -11
  66. package/esm2022/lib/navigation/views/all-views-modal/all-views-modal.component.mjs +0 -43
  67. package/esm2022/lib/navigation/views/edit-view/edit-view.component.mjs +0 -118
  68. package/esm2022/lib/navigation/views/permission-picker/permission-picker.component.mjs +0 -151
  69. package/esm2022/lib/navigation/views/state.mjs +0 -456
  70. package/esm2022/lib/navigation/views/view-menu/view-menu.component.mjs +0 -30
  71. package/esm2022/lib/navigation/views/views/views.component.mjs +0 -90
  72. package/esm2022/lib/notification/badge/badge.component.mjs +0 -45
  73. package/esm2022/lib/notification/banner/banner-action.component.mjs +0 -48
  74. package/esm2022/lib/notification/banner/banner.component.mjs +0 -61
  75. package/esm2022/lib/notification/map-indicator/map-indicator.component.mjs +0 -50
  76. package/esm2022/lib/notification/map-indicator/map-indicators.mjs +0 -15
  77. package/esm2022/lib/notification/notification-badge/notification-badge.component.mjs +0 -26
  78. package/esm2022/lib/overlay/callout/callout.component.mjs +0 -130
  79. package/esm2022/lib/overlay/callout/callout.helpers.mjs +0 -113
  80. package/esm2022/lib/overlay/callout/help/help.component.mjs +0 -23
  81. package/esm2022/lib/overlay/callout/lock-scroll.directive.mjs +0 -69
  82. package/esm2022/lib/overlay/callout/menu/menu-item/menu-item.component.mjs +0 -71
  83. package/esm2022/lib/overlay/callout/menu/menu.component.mjs +0 -39
  84. package/esm2022/lib/overlay/callout/select-callout-defaults.mjs +0 -13
  85. package/esm2022/lib/overlay/callout/tooltip/locked-tooltip.directive.mjs +0 -30
  86. package/esm2022/lib/overlay/callout/tooltip/tooltip.component.mjs +0 -57
  87. package/esm2022/lib/overlay/callout/tooltip/tooltip.directive.mjs +0 -138
  88. package/esm2022/lib/overlay/modal/dialog/dialog.component.mjs +0 -47
  89. package/esm2022/lib/overlay/modal/dialog-stack.service.mjs +0 -41
  90. package/esm2022/lib/overlay/modal/form-dialog/form-dialog.component.mjs +0 -146
  91. package/esm2022/lib/overlay/modal/modal.component.mjs +0 -31
  92. package/esm2022/lib/overlay/modal/side-sheet/side-sheet.component.mjs +0 -30
  93. package/esm2022/lib/overlay/overlay-outlet.component.mjs +0 -98
  94. package/esm2022/lib/overlay/overlay.directive.mjs +0 -25
  95. package/esm2022/lib/overlay/overlay.service.mjs +0 -35
  96. package/esm2022/lib/overlay/toast/toast-action.component.mjs +0 -11
  97. package/esm2022/lib/overlay/toast/toast.component.mjs +0 -41
  98. package/esm2022/lib/riv.module.mjs +0 -580
  99. package/esm2022/lib/size/size.directive.mjs +0 -33
  100. package/esm2022/lib/table/simple-table/coordinate-helper.mjs +0 -61
  101. package/esm2022/lib/table/simple-table/simple-table-cell.component.mjs +0 -36
  102. package/esm2022/lib/table/simple-table/simple-table-header-cell.component.mjs +0 -37
  103. package/esm2022/lib/table/simple-table/simple-table-row.component.mjs +0 -19
  104. package/esm2022/lib/table/simple-table/simple-table.component.mjs +0 -104
  105. package/esm2022/lib/table/table/clipboard.mjs +0 -182
  106. package/esm2022/lib/table/table/state-helpers/collapse-helpers.mjs +0 -116
  107. package/esm2022/lib/table/table/state-helpers/column-helpers.mjs +0 -383
  108. package/esm2022/lib/table/table/state-helpers/display-helpers.mjs +0 -50
  109. package/esm2022/lib/table/table/state-helpers/nesting-helpers.mjs +0 -123
  110. package/esm2022/lib/table/table/state-helpers/order-helpers.mjs +0 -164
  111. package/esm2022/lib/table/table/state-helpers/pagination-helpers.mjs +0 -139
  112. package/esm2022/lib/table/table/state-helpers/result-helpers.mjs +0 -70
  113. package/esm2022/lib/table/table/state-helpers/search-helpers.mjs +0 -72
  114. package/esm2022/lib/table/table/state-helpers/selection-helpers.mjs +0 -180
  115. package/esm2022/lib/table/table/state.mjs +0 -1035
  116. package/esm2022/lib/table/table/table/table.component.mjs +0 -367
  117. package/esm2022/lib/table/table/table-collapse-all/table-collapse-all.component.mjs +0 -25
  118. package/esm2022/lib/table/table/table-column-settings/table-column-settings-side-sheet.component.mjs +0 -227
  119. package/esm2022/lib/table/table/table-column-settings/table-column-settings.component.mjs +0 -134
  120. package/esm2022/lib/table/table/table-csv-export/table-csv-export.component.mjs +0 -35
  121. package/esm2022/lib/table/table/table-header-resize-handle/table-header-resize-handle.component.mjs +0 -28
  122. package/esm2022/lib/table/table/table-search/table-search.component.mjs +0 -71
  123. package/esm2022/lib/table/table/table-search-columns/table-search-columns.component.mjs +0 -57
  124. package/esm2022/lib/util/local-storage.mjs +0 -17
  125. package/esm2022/lib/visibility/visibility.directive.mjs +0 -34
  126. package/esm2022/lib/visualization/chart/chart-scaling.mjs +0 -380
  127. package/esm2022/lib/visualization/chart/chart.component.mjs +0 -626
  128. package/esm2022/lib/visualization/chart/chart.mjs +0 -3768
  129. package/esm2022/lib/visualization/data-table/data-table-cell.component.mjs +0 -22
  130. package/esm2022/lib/visualization/data-table/data-table-header-cell.component.mjs +0 -11
  131. package/esm2022/lib/visualization/data-table/data-table-row.component.mjs +0 -19
  132. package/esm2022/lib/visualization/data-table/data-table.component.mjs +0 -17
  133. package/esm2022/lib/visualization/donut/donut.component.mjs +0 -54
  134. package/esm2022/lib/visualization/funnel-chart/funnel-chart.component.mjs +0 -73
  135. package/esm2022/lib/visualization/funnel-chart/funnel-chart.helpers.mjs +0 -33
  136. package/esm2022/lib/visualization/highlight/highlight.component.mjs +0 -24
  137. package/esm2022/lib/visualization/highlight/highlight.helpers.mjs +0 -20
  138. package/esm2022/lib/visualization/intervals.mjs +0 -63
  139. package/esm2022/lib/visualization/issue/issue.component.mjs +0 -30
  140. package/esm2022/lib/visualization/legend-item/legend-item.component.mjs +0 -49
  141. package/esm2022/lib/visualization/metric/metric.component.mjs +0 -52
  142. package/esm2022/lib/visualization/mini-pie/mini-pie.component.mjs +0 -51
  143. package/esm2022/lib/visualization/progress/progress.component.mjs +0 -24
  144. package/esm2022/lib/visualization/stacked-column/stacked-column.component.mjs +0 -377
  145. package/esm2022/lib/visualization/stacked-column/stacked-column.helpers.mjs +0 -18
  146. package/esm2022/lib/visualization/stacked-row/stacked-row.component.mjs +0 -270
  147. package/esm2022/lib/visualization/stacked-row/stacked-row.helpers.mjs +0 -74
  148. package/esm2022/lib/visualization/time-series/time-series.component.mjs +0 -374
  149. package/esm2022/lib/visualization/time-series/time-series.helpers.mjs +0 -15
  150. package/esm2022/lib/visualization/trend/trend.component.mjs +0 -51
  151. package/esm2022/lib/visualization/zero-state/zero-state.component.mjs +0 -22
  152. package/esm2022/public-api.mjs +0 -118
  153. package/esm2022/rivet-health-design-system.mjs +0 -5
  154. package/index.d.ts +0 -5
  155. package/lib/accessibility/sr-only/sr-only.component.d.ts +0 -12
  156. package/lib/download/download.service.d.ts +0 -9
  157. package/lib/format/pipes/common.d.ts +0 -6
  158. package/lib/format/pipes/date.pipe.d.ts +0 -8
  159. package/lib/format/pipes/days.pipe.d.ts +0 -8
  160. package/lib/format/pipes/dollars.pipe.d.ts +0 -9
  161. package/lib/format/pipes/number.pipe.d.ts +0 -8
  162. package/lib/format/pipes/percentage.pipe.d.ts +0 -8
  163. package/lib/format/pipes/sentence-case.pipe.d.ts +0 -8
  164. package/lib/format/pipes/small-currency.pipe.d.ts +0 -8
  165. package/lib/format/pipes/small-number.pipe.d.ts +0 -8
  166. package/lib/format/svg-text-truncate/svg-text-truncate.directive.d.ts +0 -14
  167. package/lib/format/truncate/truncate.component.d.ts +0 -17
  168. package/lib/icon/dom-cache.d.ts +0 -13
  169. package/lib/icon/icon.component.d.ts +0 -27
  170. package/lib/icon/icons.d.ts +0 -137
  171. package/lib/input/alphabetic-field/alphabetic-field.component.d.ts +0 -14
  172. package/lib/input/auto-focus/auto-focus.directive.d.ts +0 -21
  173. package/lib/input/button/button.component.d.ts +0 -37
  174. package/lib/input/button-group/button-group.component.d.ts +0 -11
  175. package/lib/input/calendar/calendar.component.d.ts +0 -67
  176. package/lib/input/card-checkbox/card-checkbox.component.d.ts +0 -6
  177. package/lib/input/checkbox/checkbox.component.d.ts +0 -32
  178. package/lib/input/currency-field/currency-field.component.d.ts +0 -9
  179. package/lib/input/date/date.component.d.ts +0 -62
  180. package/lib/input/date-range/date-range.component.d.ts +0 -97
  181. package/lib/input/filter-chip/filter-chip.component.d.ts +0 -13
  182. package/lib/input/filter-dropdown/filter-dropdown.component.d.ts +0 -30
  183. package/lib/input/input-label/input-label.component.d.ts +0 -17
  184. package/lib/input/mentions-input/mentions-input.component.d.ts +0 -93
  185. package/lib/input/number-field/number-field.component.d.ts +0 -36
  186. package/lib/input/percentage-field/percentage-field.component.d.ts +0 -7
  187. package/lib/input/phone-field/phone-field.component.d.ts +0 -17
  188. package/lib/input/radio/radio.component.d.ts +0 -28
  189. package/lib/input/search/search.component.d.ts +0 -10
  190. package/lib/input/search-select/search-select.component.d.ts +0 -62
  191. package/lib/input/select/select/select.component.d.ts +0 -63
  192. package/lib/input/select/select-node/select-node.component.d.ts +0 -30
  193. package/lib/input/select/state.d.ts +0 -250
  194. package/lib/input/simple-select/option-group.pipe.d.ts +0 -8
  195. package/lib/input/simple-select/simple-select.component.d.ts +0 -63
  196. package/lib/input/switch-checkbox/switch-checkbox.component.d.ts +0 -18
  197. package/lib/input/text-field/text-field.component.d.ts +0 -38
  198. package/lib/input/textarea-field/textarea-field.component.d.ts +0 -8
  199. package/lib/input/validation-message/validation-message.component.d.ts +0 -6
  200. package/lib/layout/card/card-actions.component.d.ts +0 -38
  201. package/lib/layout/card/card-content.component.d.ts +0 -33
  202. package/lib/layout/card/card-header.component.d.ts +0 -132
  203. package/lib/layout/card/card-link.component.d.ts +0 -64
  204. package/lib/layout/card/card-media.component.d.ts +0 -43
  205. package/lib/layout/card/card.component.d.ts +0 -225
  206. package/lib/layout/setting-row/setting-row.component.d.ts +0 -72
  207. package/lib/load/loading/loading.component.d.ts +0 -17
  208. package/lib/load/loading-cover/loading-cover.component.d.ts +0 -10
  209. package/lib/navigation/editable-heading/editable-heading.component.d.ts +0 -118
  210. package/lib/navigation/link/link.component.d.ts +0 -19
  211. package/lib/navigation/page-header/page-header.component.d.ts +0 -50
  212. package/lib/navigation/simple-tabs/simple-tab/simple-tab.component.d.ts +0 -11
  213. package/lib/navigation/simple-tabs/simple-tabs/simple-tabs.component.d.ts +0 -5
  214. package/lib/navigation/tabs/tab/tab.component.d.ts +0 -6
  215. package/lib/navigation/tabs/tabs/tabs.component.d.ts +0 -5
  216. package/lib/navigation/views/all-views-modal/all-views-modal.component.d.ts +0 -14
  217. package/lib/navigation/views/edit-view/edit-view.component.d.ts +0 -31
  218. package/lib/navigation/views/permission-picker/permission-picker.component.d.ts +0 -37
  219. package/lib/navigation/views/state.d.ts +0 -175
  220. package/lib/navigation/views/view-menu/view-menu.component.d.ts +0 -13
  221. package/lib/navigation/views/views/views.component.d.ts +0 -25
  222. package/lib/notification/badge/badge.component.d.ts +0 -14
  223. package/lib/notification/banner/banner-action.component.d.ts +0 -15
  224. package/lib/notification/banner/banner.component.d.ts +0 -25
  225. package/lib/notification/map-indicator/map-indicator.component.d.ts +0 -24
  226. package/lib/notification/map-indicator/map-indicators.d.ts +0 -9
  227. package/lib/notification/notification-badge/notification-badge.component.d.ts +0 -11
  228. package/lib/overlay/callout/callout.component.d.ts +0 -36
  229. package/lib/overlay/callout/callout.helpers.d.ts +0 -16
  230. package/lib/overlay/callout/help/help.component.d.ts +0 -11
  231. package/lib/overlay/callout/lock-scroll.directive.d.ts +0 -22
  232. package/lib/overlay/callout/menu/menu-item/menu-item.component.d.ts +0 -27
  233. package/lib/overlay/callout/menu/menu.component.d.ts +0 -17
  234. package/lib/overlay/callout/select-callout-defaults.d.ts +0 -5
  235. package/lib/overlay/callout/tooltip/locked-tooltip.directive.d.ts +0 -14
  236. package/lib/overlay/callout/tooltip/tooltip.component.d.ts +0 -26
  237. package/lib/overlay/callout/tooltip/tooltip.directive.d.ts +0 -48
  238. package/lib/overlay/modal/dialog/dialog.component.d.ts +0 -19
  239. package/lib/overlay/modal/dialog-stack.service.d.ts +0 -23
  240. package/lib/overlay/modal/form-dialog/form-dialog.component.d.ts +0 -63
  241. package/lib/overlay/modal/modal.component.d.ts +0 -11
  242. package/lib/overlay/modal/side-sheet/side-sheet.component.d.ts +0 -13
  243. package/lib/overlay/overlay-outlet.component.d.ts +0 -19
  244. package/lib/overlay/overlay.directive.d.ts +0 -13
  245. package/lib/overlay/overlay.service.d.ts +0 -14
  246. package/lib/overlay/toast/toast-action.component.d.ts +0 -5
  247. package/lib/overlay/toast/toast.component.d.ts +0 -17
  248. package/lib/riv.module.d.ts +0 -122
  249. package/lib/size/size.directive.d.ts +0 -12
  250. package/lib/table/simple-table/coordinate-helper.d.ts +0 -13
  251. package/lib/table/simple-table/simple-table-cell.component.d.ts +0 -19
  252. package/lib/table/simple-table/simple-table-header-cell.component.d.ts +0 -20
  253. package/lib/table/simple-table/simple-table-row.component.d.ts +0 -6
  254. package/lib/table/simple-table/simple-table.component.d.ts +0 -11
  255. package/lib/table/table/clipboard.d.ts +0 -38
  256. package/lib/table/table/state-helpers/collapse-helpers.d.ts +0 -9
  257. package/lib/table/table/state-helpers/column-helpers.d.ts +0 -29
  258. package/lib/table/table/state-helpers/display-helpers.d.ts +0 -5
  259. package/lib/table/table/state-helpers/nesting-helpers.d.ts +0 -13
  260. package/lib/table/table/state-helpers/order-helpers.d.ts +0 -13
  261. package/lib/table/table/state-helpers/pagination-helpers.d.ts +0 -12
  262. package/lib/table/table/state-helpers/result-helpers.d.ts +0 -10
  263. package/lib/table/table/state-helpers/search-helpers.d.ts +0 -17
  264. package/lib/table/table/state-helpers/selection-helpers.d.ts +0 -13
  265. package/lib/table/table/state.d.ts +0 -512
  266. package/lib/table/table/table/table.component.d.ts +0 -88
  267. package/lib/table/table/table-collapse-all/table-collapse-all.component.d.ts +0 -10
  268. package/lib/table/table/table-column-settings/table-column-settings-side-sheet.component.d.ts +0 -52
  269. package/lib/table/table/table-column-settings/table-column-settings.component.d.ts +0 -37
  270. package/lib/table/table/table-csv-export/table-csv-export.component.d.ts +0 -14
  271. package/lib/table/table/table-header-resize-handle/table-header-resize-handle.component.d.ts +0 -11
  272. package/lib/table/table/table-search/table-search.component.d.ts +0 -21
  273. package/lib/table/table/table-search-columns/table-search-columns.component.d.ts +0 -23
  274. package/lib/util/local-storage.d.ts +0 -14
  275. package/lib/visibility/visibility.directive.d.ts +0 -12
  276. package/lib/visualization/chart/chart-scaling.d.ts +0 -100
  277. package/lib/visualization/chart/chart.component.d.ts +0 -116
  278. package/lib/visualization/chart/chart.d.ts +0 -354
  279. package/lib/visualization/data-table/data-table-cell.component.d.ts +0 -11
  280. package/lib/visualization/data-table/data-table-header-cell.component.d.ts +0 -5
  281. package/lib/visualization/data-table/data-table-row.component.d.ts +0 -6
  282. package/lib/visualization/data-table/data-table.component.d.ts +0 -6
  283. package/lib/visualization/donut/donut.component.d.ts +0 -22
  284. package/lib/visualization/funnel-chart/funnel-chart.component.d.ts +0 -30
  285. package/lib/visualization/funnel-chart/funnel-chart.helpers.d.ts +0 -4
  286. package/lib/visualization/highlight/highlight.component.d.ts +0 -15
  287. package/lib/visualization/highlight/highlight.helpers.d.ts +0 -2
  288. package/lib/visualization/intervals.d.ts +0 -8
  289. package/lib/visualization/issue/issue.component.d.ts +0 -10
  290. package/lib/visualization/legend-item/legend-item.component.d.ts +0 -22
  291. package/lib/visualization/metric/metric.component.d.ts +0 -20
  292. package/lib/visualization/mini-pie/mini-pie.component.d.ts +0 -17
  293. package/lib/visualization/progress/progress.component.d.ts +0 -8
  294. package/lib/visualization/stacked-column/stacked-column.component.d.ts +0 -129
  295. package/lib/visualization/stacked-column/stacked-column.helpers.d.ts +0 -3
  296. package/lib/visualization/stacked-row/stacked-row.component.d.ts +0 -109
  297. package/lib/visualization/stacked-row/stacked-row.helpers.d.ts +0 -53
  298. package/lib/visualization/time-series/time-series.component.d.ts +0 -126
  299. package/lib/visualization/time-series/time-series.helpers.d.ts +0 -34
  300. package/lib/visualization/trend/trend.component.d.ts +0 -13
  301. package/lib/visualization/zero-state/zero-state.component.d.ts +0 -9
  302. package/public-api.d.ts +0 -118
@@ -1,478 +0,0 @@
1
- import { ChangeDetectionStrategy, Component, ContentChild, ElementRef, Input, Output, ViewChild, } from '@angular/core';
2
- import { timeDay, timeMonth, timeSunday, timeWeek, timeYear } from 'd3-time';
3
- import { BehaviorSubject, Subject, combineLatest, distinctUntilChanged, filter, map, merge, scan, shareReplay, skipUntil, startWith, } from 'rxjs';
4
- import { DatePipe } from '../../format/pipes/date.pipe';
5
- import { LocalStorage } from '../../util/local-storage';
6
- import { CalendarComponent } from '../calendar/calendar.component';
7
- import { InputLabelComponent } from '../input-label/input-label.component';
8
- import * as i0 from "@angular/core";
9
- import * as i1 from "@angular/common";
10
- import * as i2 from "../button/button.component";
11
- import * as i3 from "../calendar/calendar.component";
12
- import * as i4 from "../../overlay/callout/callout.component";
13
- import * as i5 from "../../visualization/highlight/highlight.component";
14
- import * as i6 from "../../icon/icon.component";
15
- import * as i7 from "../input-label/input-label.component";
16
- import * as i8 from "../../overlay/overlay.directive";
17
- import * as i9 from "../simple-select/simple-select.component";
18
- import * as i10 from "../../overlay/callout/tooltip/tooltip.directive";
19
- import * as i11 from "../simple-select/option-group.pipe";
20
- const timeQuarter = timeMonth.every(3);
21
- // TODO: once we upgrade to Angular 16, this component can be cleaned up with
22
- // signals instead of RxJS.
23
- // https://www.notion.so/rivet/Resolve-TODOs-after-Angular-upgrade-1f2667eb2a3180b79f6ad92a7e576f08
24
- export class DateRangeComponent extends InputLabelComponent {
25
- constructor() {
26
- super(...arguments);
27
- this.TODAY = new Date();
28
- this.STORAGE_KEY = 'date-range.default';
29
- this.showPresets$ = new BehaviorSubject(true);
30
- this.min$ = new BehaviorSubject(CalendarComponent.defaultMin);
31
- this.max$ = new BehaviorSubject(CalendarComponent.defaultMax);
32
- this.value$ = new BehaviorSubject(undefined);
33
- this.distinctValue$ = this.value$.pipe(distinctUntilChanged((previous, current) => previous?.[0].valueOf() === current?.[0].valueOf() &&
34
- previous?.[1].valueOf() === current?.[1].valueOf()), shareReplay({ refCount: true, bufferSize: 1 }));
35
- this.placeholder$ = new BehaviorSubject('Select date range');
36
- this.disabled$ = new BehaviorSubject(false);
37
- this.alternativePresetList$ = new BehaviorSubject([]);
38
- this.open$ = new BehaviorSubject(false);
39
- this.userSelectedPreset$ = new Subject();
40
- this.userSelectedDate$ = new Subject();
41
- this.selectedValue$ = merge(this.distinctValue$, this.userSelectedDate$.pipe(scan((previous, date) => {
42
- if (previous instanceof Date && date instanceof Date) {
43
- if (date.valueOf() >= previous.valueOf()) {
44
- const pair = [previous, date];
45
- return pair;
46
- }
47
- }
48
- return date;
49
- })), this.userSelectedPreset$.pipe(filter((preset) => preset !== null), map(preset => preset.dates))).pipe(shareReplay({ refCount: true, bufferSize: 1 }));
50
- this.filteredPresetOptions$ = combineLatest([
51
- this.min$,
52
- this.max$,
53
- this.alternativePresetList$,
54
- ]).pipe(map(([min, max, alternativePresetList]) => {
55
- const optionsFilteredOnMinMax = DateRangeComponent.Presets.filter(p => p.dates[0].valueOf() >= min.valueOf() &&
56
- p.dates[1].valueOf() <= max.valueOf());
57
- if (alternativePresetList.length == 0) {
58
- return optionsFilteredOnMinMax;
59
- }
60
- else {
61
- const optionsFilteredOnAlternativePresetList = optionsFilteredOnMinMax.filter(p => alternativePresetList.includes(p.id));
62
- return optionsFilteredOnAlternativePresetList;
63
- }
64
- }), shareReplay({ refCount: true, bufferSize: 1 }));
65
- this.selectedPreset$ = combineLatest([
66
- this.selectedValue$,
67
- this.userSelectedPreset$.pipe(startWith(null)),
68
- ]).pipe(map(([selectedValue, userSelectedPreset]) => {
69
- if (selectedValue instanceof Array) {
70
- const options = DateRangeComponent.Presets.filter(preset => preset.dates[0].valueOf() === selectedValue[0].valueOf() &&
71
- preset.dates[1].valueOf() === selectedValue[1].valueOf());
72
- if (options.length) {
73
- // Some date ranges match multiple presets, e.g. on Jan 19th, a
74
- // selected date range of Jan 1-19 would correspond to "this month
75
- // so far," "this quarter so far," and "this year so far." We'll
76
- // use the user's most recent manual selection as a tie breaker
77
- // where possible.
78
- const mostRecent = options.find(option => option.id === userSelectedPreset?.id);
79
- if (mostRecent)
80
- return mostRecent;
81
- return options[0];
82
- }
83
- }
84
- return null;
85
- }));
86
- this.favoritePresetIds$ = new LocalStorage(this.STORAGE_KEY, []);
87
- this.favoritePresets$ = combineLatest([
88
- this.favoritePresetIds$,
89
- this.filteredPresetOptions$,
90
- this.alternativePresetList$,
91
- ]).pipe(map(([ids, presets, alternativePresetList]) => {
92
- const favoritePresets = ids
93
- .map(id => presets.find(preset => preset.id === id))
94
- .filter((p) => p !== undefined);
95
- if (alternativePresetList.length == 0) {
96
- return favoritePresets;
97
- }
98
- else {
99
- const favoritesFilteredOnAlternativePresetList = favoritePresets.filter(p => alternativePresetList.includes(p.id));
100
- return favoritesFilteredOnAlternativePresetList;
101
- }
102
- }), shareReplay({ refCount: true, bufferSize: 1 }));
103
- this.userLeftActiveYearMonth$ = new Subject();
104
- this.userRightActiveYearMonth$ = new Subject();
105
- this.leftMin$ = this.min$.pipe(shareReplay({ refCount: true, bufferSize: 1 }));
106
- this.leftMax$ = this.max$.pipe(map(max => timeDay.offset(timeMonth.floor(max), -1)), shareReplay({ refCount: true, bufferSize: 1 }));
107
- this.rightMax$ = this.max$.pipe(shareReplay({ refCount: true, bufferSize: 1 }));
108
- this.leftActiveYearMonth$ = combineLatest([
109
- this.leftMax$,
110
- merge(this.userLeftActiveYearMonth$.pipe(startWith(timeMonth.floor(this.TODAY))), this.userSelectedPreset$.pipe(filter((preset) => preset !== null), map(preset => timeMonth.floor(preset.dates[0]))), this.distinctValue$.pipe(filter((v) => v !== undefined), map(v => timeMonth.floor(v[0])))),
111
- ]).pipe(map(([leftMax, left]) => {
112
- if (left.valueOf() >= leftMax.valueOf())
113
- return timeMonth.floor(leftMax);
114
- else
115
- return left;
116
- }), shareReplay({ refCount: true, bufferSize: 1 }));
117
- this.rightActiveYearMonth$ = combineLatest([
118
- this.leftActiveYearMonth$,
119
- merge(this.userRightActiveYearMonth$.pipe(startWith(timeMonth.ceil(this.TODAY))), this.userSelectedPreset$.pipe(filter((preset) => preset !== null), map(preset => timeMonth.floor(preset.dates[1]))), this.distinctValue$.pipe(filter((v) => v !== undefined), map(v => timeMonth.floor(v[1])))),
120
- this.rightMax$,
121
- ]).pipe(map(([left, userRight, rightMax$]) => {
122
- if (left.valueOf() >= userRight.valueOf())
123
- return timeMonth.floor(timeMonth.offset(left, 1));
124
- else if (userRight.valueOf() >= rightMax$.valueOf())
125
- return timeMonth.floor(rightMax$);
126
- else
127
- return userRight;
128
- }), shareReplay({ refCount: true, bufferSize: 1 }));
129
- this.rightMin$ = this.leftActiveYearMonth$.pipe(map(left => timeMonth.floor(timeMonth.offset(left, 1))), shareReplay({ refCount: true, bufferSize: 1 }));
130
- this.leftOmitRange$ = this.rightActiveYearMonth$.pipe(map(rightActiveYearMonth => {
131
- const first = timeMonth.floor(rightActiveYearMonth);
132
- const last = timeDay.offset(timeMonth.floor(timeMonth.offset(rightActiveYearMonth, 1)), -1);
133
- return [first, last];
134
- }), shareReplay({ refCount: true, bufferSize: 1 }));
135
- this.userInteracted$ = merge(this.userSelectedDate$, this.userSelectedPreset$);
136
- this.valueChange = this.selectedValue$.pipe(skipUntil(merge(this.userInteracted$, this.selectedValue$.pipe(filter(v => v !== undefined)))), filter((v) => !(v instanceof Date)), distinctUntilChanged((previous, current) => previous?.[0].valueOf() === current?.[0].valueOf() &&
137
- previous?.[1].valueOf() === current?.[1].valueOf()), shareReplay({ refCount: true, bufferSize: 1 }));
138
- this.displayValue$ = this.valueChange.pipe(map(v => {
139
- if (v) {
140
- return v.map(date => new DatePipe().transform(date)).join(' — ');
141
- }
142
- return undefined;
143
- }), shareReplay({ refCount: true, bufferSize: 1 }));
144
- }
145
- set showPresets(v) {
146
- this.showPresets$.next(v);
147
- }
148
- get showPresets() {
149
- return this.showPresets$.getValue();
150
- }
151
- set min(v) {
152
- this.min$.next(v);
153
- }
154
- get min() {
155
- return this.min$.getValue();
156
- }
157
- set max(v) {
158
- this.max$.next(v);
159
- }
160
- get max() {
161
- return this.max$.getValue();
162
- }
163
- set value(v) {
164
- this.value$.next(v);
165
- }
166
- get value() {
167
- return this.value$.getValue();
168
- }
169
- set placeholder(v) {
170
- this.placeholder$.next(v);
171
- }
172
- get placeholder() {
173
- return this.placeholder$.getValue();
174
- }
175
- set disabled(v) {
176
- this.disabled$.next(v);
177
- }
178
- get disabled() {
179
- return this.disabled$.getValue();
180
- }
181
- getTrigger() {
182
- return (this.customTriggerButton?.nativeElement ??
183
- this.standardTriggerButton?.nativeElement ??
184
- null);
185
- }
186
- set alternativePresetList(v) {
187
- this.alternativePresetList$.next(v);
188
- }
189
- get alternativePresetList() {
190
- return this.alternativePresetList$.getValue();
191
- }
192
- setFavorite(preset, favorite) {
193
- const ids = new Set(this.favoritePresetIds$.getValue());
194
- if (favorite) {
195
- ids.add(preset.id);
196
- }
197
- else {
198
- ids.delete(preset.id);
199
- }
200
- this.favoritePresetIds$.next([...ids]);
201
- }
202
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DateRangeComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
203
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: DateRangeComponent, selector: "riv-date-range", inputs: { showPresets: "showPresets", min: "min", max: "max", value: "value", placeholder: "placeholder", disabled: "disabled", alternativePresetList: "alternativePresetList" }, outputs: { valueChange: "valueChange" }, queries: [{ propertyName: "triggerTemplate", first: true, predicate: ["trigger"], descendants: true }], viewQueries: [{ propertyName: "customTriggerButton", first: true, predicate: ["customTriggerButton"], descendants: true, read: ElementRef }, { propertyName: "standardTriggerButton", first: true, predicate: ["standardTriggerButton"], descendants: true, read: ElementRef }], usesInheritance: true, ngImport: i0, template: "<ng-container *ngIf=\"triggerTemplate; else standardTrigger\">\n <button\n #customTriggerButton\n (click)=\"open$.next(true)\"\n [disabled]=\"disabled$ | async\"\n [attr.aria-disabled]=\"(disabled$ | async) ? 'true' : null\"\n type=\"button\"\n >\n <ng-container\n [ngTemplateOutlet]=\"triggerTemplate\"\n [ngTemplateOutletContext]=\"{ open: open$ | async }\"\n ></ng-container>\n </button>\n</ng-container>\n<ng-template #standardTrigger>\n <riv-input-label\n [label]=\"label\"\n [help]=\"help\"\n [required]=\"required\"\n [state]=\"state\"\n [errorMessage]=\"errorMessage\"\n [labelActionText]=\"labelActionText\"\n (labelAction)=\"labelAction.emit($event)\"\n >\n <button\n #standardTriggerButton\n class=\"trigger\"\n [class.warning]=\"state === 'warning'\"\n [class.error]=\"state === 'error'\"\n (click)=\"open$.next(true)\"\n [disabled]=\"disabled$ | async\"\n [attr.aria-disabled]=\"(disabled$ | async) ? 'true' : null\"\n type=\"button\"\n >\n <ng-container\n *ngIf=\"displayValue$ | async; else placeholderValue; let display\"\n >\n <span class=\"value\">{{ display }}</span>\n </ng-container>\n <ng-template #placeholderValue>\n <span class=\"value placeholder\">{{ placeholder$ | async }}</span>\n </ng-template>\n <span class=\"chevron\">\n <riv-icon [name]=\"'Calendar'\" [size]=\"16\"></riv-icon>\n </span>\n </button>\n </riv-input-label>\n</ng-template>\n\n<ng-template\n #self\n [ngTemplateOutlet]=\"self\"\n let-inputValue\n [ngTemplateOutletContext]=\"{ $implicit: (distinctValue$ | async) }\"\n>\n <ng-container *ngIf=\"open$ | async\">\n <riv-callout\n *riv-overlay\n [anchor]=\"getTrigger()\"\n [showCaret]=\"false\"\n [theme]=\"'light'\"\n [allowedPositions]=\"[\n 'top-left',\n 'top-right',\n 'bottom-right',\n 'bottom-left'\n ]\"\n [preferredPosition]=\"'bottom-right'\"\n (close)=\"open$.next(false); userSelectedDate$.next(inputValue)\"\n >\n <div class=\"content\" [class.include-preset]=\"showPresets\">\n <div *ngIf=\"showPresets\" class=\"presets\">\n <riv-simple-select\n [label]=\"'Date presets'\"\n [filterabilityOptions]=\"{ enabled: true, placeholder: 'Search' }\"\n [orderBy]=\"'source'\"\n [optionGroups]=\"\n (filteredPresetOptions$ | async) ?? [] | rivOptionGroup\n \"\n [selectedOption]=\"selectedPreset$ | async\"\n (selectedOptionChange)=\"userSelectedPreset$.next($event)\"\n >\n <ng-template #option let-node=\"node\">\n <ng-template\n #self\n [ngTemplateOutlet]=\"self\"\n let-isFavorite\n [ngTemplateOutletContext]=\"{\n $implicit: (favoritePresetIds$ | async)?.includes(node.id)\n }\"\n >\n <div class=\"preset\" [class.favorite]=\"isFavorite\">\n <div class=\"description\">\n <riv-highlight\n class=\"title\"\n [text]=\"node.title\"\n [indices]=\"node.titleHighlightIndices || []\"\n ></riv-highlight>\n <riv-highlight\n class=\"subtitle\"\n [text]=\"node.subtitle\"\n [indices]=\"node.subtitleHighlightIndices || []\"\n ></riv-highlight>\n </div>\n <button\n (click)=\"\n setFavorite(node, !isFavorite); $event.stopPropagation()\n \"\n type=\"button\"\n >\n <riv-icon\n [name]=\"isFavorite ? 'HeartActive' : 'Heart'\"\n [size]=\"16\"\n [rivTooltip]=\"'Mark as favorite'\"\n ></riv-icon>\n </button>\n </div>\n </ng-template>\n </ng-template>\n </riv-simple-select>\n <ng-template\n #self\n [ngTemplateOutlet]=\"self\"\n let-favorites\n [ngTemplateOutletContext]=\"{ $implicit: favoritePresets$ | async }\"\n >\n <riv-input-label *ngIf=\"favorites.length\" [label]=\"'Favorites'\">\n <div class=\"shortcuts\">\n <button\n *ngFor=\"let favorite of favorites\"\n class=\"shortcut\"\n [class.active]=\"(selectedPreset$ | async)?.id === favorite.id\"\n (click)=\"userSelectedPreset$.next(favorite)\"\n type=\"button\"\n >\n <span class=\"title\">{{ favorite.title }}</span>\n <button\n (click)=\"setFavorite(favorite, false)\"\n [rivTooltip]=\"'Remove favorite'\"\n type=\"button\"\n >\n <riv-icon [name]=\"'HeartActive'\" [size]=\"16\"></riv-icon>\n </button>\n </button>\n </div>\n </riv-input-label>\n </ng-template>\n </div>\n\n <div class=\"calendars\">\n <riv-calendar\n class=\"left\"\n [activeYearMonth]=\"(leftActiveYearMonth$ | async) || TODAY\"\n (activeYearMonthChange)=\"userLeftActiveYearMonth$.next($event)\"\n [displayMin]=\"(min$ | async) || TODAY\"\n [displayMax]=\"(max$ | async) || TODAY\"\n [selectableMin]=\"(leftMin$ | async) || TODAY\"\n [selectableMax]=\"(leftMax$ | async) || TODAY\"\n [omitRange]=\"(leftOmitRange$ | async) || [TODAY, TODAY]\"\n [selectedValue]=\"(selectedValue$ | async) || TODAY\"\n (dateSelect)=\"userSelectedDate$.next($event)\"\n ></riv-calendar>\n <riv-calendar\n class=\"right\"\n [activeYearMonth]=\"(rightActiveYearMonth$ | async) || TODAY\"\n (activeYearMonthChange)=\"userRightActiveYearMonth$.next($event)\"\n [displayMin]=\"(min$ | async) || TODAY\"\n [displayMax]=\"(max$ | async) || TODAY\"\n [selectableMin]=\"(rightMin$ | async) || TODAY\"\n [selectableMax]=\"(rightMax$ | async) || TODAY\"\n [selectedValue]=\"(selectedValue$ | async) || TODAY\"\n (dateSelect)=\"userSelectedDate$.next($event)\"\n ></riv-calendar>\n </div>\n\n <footer class=\"buttons\">\n <button\n rivButton\n [size]=\"'small'\"\n [variant]=\"'ghost'\"\n (click)=\"userSelectedDate$.next(undefined)\"\n type=\"button\"\n >\n Clear\n </button>\n <button\n rivButton\n [size]=\"'small'\"\n [variant]=\"'primary'\"\n (click)=\"open$.next(false)\"\n type=\"button\"\n >\n Done\n </button>\n </footer>\n </div>\n </riv-callout>\n </ng-container>\n</ng-template>\n", styles: [".trigger{width:100%;border:var(--border-width) solid var(--border-light);border-radius:var(--border-radius-small);display:flex;gap:var(--size-small);background-color:var(--surface-light-0);cursor:pointer}.trigger:focus{outline:none;border:var(--border-width) solid var(--purp-60)}.trigger:disabled{color:var(--type-light-disabled);background-color:var(--surface-light-1)}.value{font-size:var(--type-2-font-size);line-height:var(--type-2-line-height-0);color:var(--type-light-high-contrast);padding:var(--size-small);flex-grow:1;text-align:left;overflow:hidden;text-overflow:ellipsis;white-space:pre}.value.placeholder{color:var(--type-light-low-contrast)}.chevron{display:flex;justify-content:center;align-items:center;padding:var(--size-xsmall) calc(var(--base-grid-size) * 1.5)}.trigger.warning{border-color:var(--surface-dark-caution)}.trigger.error{border-color:var(--surface-dark-danger);box-shadow:inset 0 0 0 var(--border-width-large) var(--surface-dark-danger)}.content{display:inline-grid;grid-template-rows:1fr auto}.content.include-preset{grid-template-columns:calc(var(--base-grid-size) * 50) 1fr 1fr}.presets{grid-area:1 / 1 / 3 / 2;background-color:var(--surface-light-1);padding:var(--size-xlarge) var(--size-large);border-right:var(--border-width) solid var(--border-light);display:flex;flex-direction:column;gap:var(--size-medium)}.preset{display:flex;transition:background-color var(--short-transition)}.preset:hover{background-color:var(--surface-light-2)}.preset button{color:transparent;transition:color var(--short-transition);padding:var(--size-medium) var(--size-large) var(--size-medium) var(--size-small);cursor:pointer}.preset:hover button{color:var(--type-light-low-contrast)}.preset button:hover{color:var(--type-light-high-contrast)}.preset.favorite button{color:var(--type-light-link)}.preset .description{flex-grow:1;padding:var(--size-medium) var(--size-small) var(--size-medium) var(--size-medium)}.preset .title{display:block;font-size:var(--type-2-font-size);line-height:var(--type-2-line-height-1)}.preset .subtitle{display:block;font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-1);color:var(--type-light-low-contrast)}.shortcuts{display:flex;flex-direction:column;gap:var(--size-xsmall);overflow-y:auto}.shortcut{display:flex;align-items:center;padding:var(--size-small) var(--size-small) var(--size-small) var(--size-medium);gap:var(--size-small);border-radius:var(--border-radius-small);transition:background-color var(--short-transition);cursor:pointer}.shortcut:hover{background-color:var(--black-20)}.shortcut.active{background-color:var(--baloo-05)}.shortcut .title{flex-grow:1;text-align:left;font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-2)}.shortcut button{color:transparent;transition:color var(--short-transition);cursor:pointer}.shortcut:hover button{color:var(--type-light-link)}.calendars{grid-column:2 / 4;display:grid;grid-template-columns:subgrid;grid-template-rows:subgrid;padding:var(--size-large)}.left{grid-area:1 / 1 / 2 / 2;padding-right:var(--size-large);border-right:var(--border-width) solid var(--border-light)}.right{padding-left:var(--size-large);grid-area:1 / 2 / 2 / 3}.buttons{grid-area:2 / 2 / 3 / 4;padding:var(--size-small);display:flex;justify-content:space-between}\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.ButtonComponent, selector: "[rivButton]", inputs: ["locked", "disabled", "loading", "full", "size", "variant", "icon", "iconPosition", "current"] }, { kind: "component", type: i3.CalendarComponent, selector: "riv-calendar", inputs: ["activeYearMonth", "displayMin", "displayMax", "selectableMin", "selectableMax", "omitRange", "selectedValue"], outputs: ["activeYearMonthChange", "dateSelect"] }, { kind: "component", type: i4.CalloutComponent, selector: "riv-callout", inputs: ["anchor", "isModal", "preferredPosition", "allowedPositions", "fallbackDirection", "showCaret", "theme"], outputs: ["close"] }, { kind: "component", type: i5.HighlightComponent, selector: "riv-highlight", inputs: ["text", "indices"] }, { kind: "component", type: i6.IconComponent, selector: "riv-icon", inputs: ["name", "fillColor", "size", "customSize", "strokeWidth"] }, { kind: "component", type: i7.InputLabelComponent, selector: "riv-input-label", inputs: ["label", "help", "required", "labelActionText", "errorMessage", "state"], outputs: ["labelAction"] }, { kind: "directive", type: i8.OverlayDirective, selector: "[riv-overlay]" }, { kind: "component", type: i9.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: i10.TooltipDirective, selector: "[rivTooltip]", inputs: ["rivTooltip", "rivTooltipTheme", "rivTooltipMaxWidth", "rivTooltipPreferredPosition", "rivTooltipAnchor", "rivTooltipCloseDelay", "rivTooltipOpenDelay", "rivTooltipGracePeriod"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "pipe", type: i11.OptionGroupPipe, name: "rivOptionGroup" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
204
- }
205
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DateRangeComponent, decorators: [{
206
- type: Component,
207
- args: [{ selector: 'riv-date-range', changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-container *ngIf=\"triggerTemplate; else standardTrigger\">\n <button\n #customTriggerButton\n (click)=\"open$.next(true)\"\n [disabled]=\"disabled$ | async\"\n [attr.aria-disabled]=\"(disabled$ | async) ? 'true' : null\"\n type=\"button\"\n >\n <ng-container\n [ngTemplateOutlet]=\"triggerTemplate\"\n [ngTemplateOutletContext]=\"{ open: open$ | async }\"\n ></ng-container>\n </button>\n</ng-container>\n<ng-template #standardTrigger>\n <riv-input-label\n [label]=\"label\"\n [help]=\"help\"\n [required]=\"required\"\n [state]=\"state\"\n [errorMessage]=\"errorMessage\"\n [labelActionText]=\"labelActionText\"\n (labelAction)=\"labelAction.emit($event)\"\n >\n <button\n #standardTriggerButton\n class=\"trigger\"\n [class.warning]=\"state === 'warning'\"\n [class.error]=\"state === 'error'\"\n (click)=\"open$.next(true)\"\n [disabled]=\"disabled$ | async\"\n [attr.aria-disabled]=\"(disabled$ | async) ? 'true' : null\"\n type=\"button\"\n >\n <ng-container\n *ngIf=\"displayValue$ | async; else placeholderValue; let display\"\n >\n <span class=\"value\">{{ display }}</span>\n </ng-container>\n <ng-template #placeholderValue>\n <span class=\"value placeholder\">{{ placeholder$ | async }}</span>\n </ng-template>\n <span class=\"chevron\">\n <riv-icon [name]=\"'Calendar'\" [size]=\"16\"></riv-icon>\n </span>\n </button>\n </riv-input-label>\n</ng-template>\n\n<ng-template\n #self\n [ngTemplateOutlet]=\"self\"\n let-inputValue\n [ngTemplateOutletContext]=\"{ $implicit: (distinctValue$ | async) }\"\n>\n <ng-container *ngIf=\"open$ | async\">\n <riv-callout\n *riv-overlay\n [anchor]=\"getTrigger()\"\n [showCaret]=\"false\"\n [theme]=\"'light'\"\n [allowedPositions]=\"[\n 'top-left',\n 'top-right',\n 'bottom-right',\n 'bottom-left'\n ]\"\n [preferredPosition]=\"'bottom-right'\"\n (close)=\"open$.next(false); userSelectedDate$.next(inputValue)\"\n >\n <div class=\"content\" [class.include-preset]=\"showPresets\">\n <div *ngIf=\"showPresets\" class=\"presets\">\n <riv-simple-select\n [label]=\"'Date presets'\"\n [filterabilityOptions]=\"{ enabled: true, placeholder: 'Search' }\"\n [orderBy]=\"'source'\"\n [optionGroups]=\"\n (filteredPresetOptions$ | async) ?? [] | rivOptionGroup\n \"\n [selectedOption]=\"selectedPreset$ | async\"\n (selectedOptionChange)=\"userSelectedPreset$.next($event)\"\n >\n <ng-template #option let-node=\"node\">\n <ng-template\n #self\n [ngTemplateOutlet]=\"self\"\n let-isFavorite\n [ngTemplateOutletContext]=\"{\n $implicit: (favoritePresetIds$ | async)?.includes(node.id)\n }\"\n >\n <div class=\"preset\" [class.favorite]=\"isFavorite\">\n <div class=\"description\">\n <riv-highlight\n class=\"title\"\n [text]=\"node.title\"\n [indices]=\"node.titleHighlightIndices || []\"\n ></riv-highlight>\n <riv-highlight\n class=\"subtitle\"\n [text]=\"node.subtitle\"\n [indices]=\"node.subtitleHighlightIndices || []\"\n ></riv-highlight>\n </div>\n <button\n (click)=\"\n setFavorite(node, !isFavorite); $event.stopPropagation()\n \"\n type=\"button\"\n >\n <riv-icon\n [name]=\"isFavorite ? 'HeartActive' : 'Heart'\"\n [size]=\"16\"\n [rivTooltip]=\"'Mark as favorite'\"\n ></riv-icon>\n </button>\n </div>\n </ng-template>\n </ng-template>\n </riv-simple-select>\n <ng-template\n #self\n [ngTemplateOutlet]=\"self\"\n let-favorites\n [ngTemplateOutletContext]=\"{ $implicit: favoritePresets$ | async }\"\n >\n <riv-input-label *ngIf=\"favorites.length\" [label]=\"'Favorites'\">\n <div class=\"shortcuts\">\n <button\n *ngFor=\"let favorite of favorites\"\n class=\"shortcut\"\n [class.active]=\"(selectedPreset$ | async)?.id === favorite.id\"\n (click)=\"userSelectedPreset$.next(favorite)\"\n type=\"button\"\n >\n <span class=\"title\">{{ favorite.title }}</span>\n <button\n (click)=\"setFavorite(favorite, false)\"\n [rivTooltip]=\"'Remove favorite'\"\n type=\"button\"\n >\n <riv-icon [name]=\"'HeartActive'\" [size]=\"16\"></riv-icon>\n </button>\n </button>\n </div>\n </riv-input-label>\n </ng-template>\n </div>\n\n <div class=\"calendars\">\n <riv-calendar\n class=\"left\"\n [activeYearMonth]=\"(leftActiveYearMonth$ | async) || TODAY\"\n (activeYearMonthChange)=\"userLeftActiveYearMonth$.next($event)\"\n [displayMin]=\"(min$ | async) || TODAY\"\n [displayMax]=\"(max$ | async) || TODAY\"\n [selectableMin]=\"(leftMin$ | async) || TODAY\"\n [selectableMax]=\"(leftMax$ | async) || TODAY\"\n [omitRange]=\"(leftOmitRange$ | async) || [TODAY, TODAY]\"\n [selectedValue]=\"(selectedValue$ | async) || TODAY\"\n (dateSelect)=\"userSelectedDate$.next($event)\"\n ></riv-calendar>\n <riv-calendar\n class=\"right\"\n [activeYearMonth]=\"(rightActiveYearMonth$ | async) || TODAY\"\n (activeYearMonthChange)=\"userRightActiveYearMonth$.next($event)\"\n [displayMin]=\"(min$ | async) || TODAY\"\n [displayMax]=\"(max$ | async) || TODAY\"\n [selectableMin]=\"(rightMin$ | async) || TODAY\"\n [selectableMax]=\"(rightMax$ | async) || TODAY\"\n [selectedValue]=\"(selectedValue$ | async) || TODAY\"\n (dateSelect)=\"userSelectedDate$.next($event)\"\n ></riv-calendar>\n </div>\n\n <footer class=\"buttons\">\n <button\n rivButton\n [size]=\"'small'\"\n [variant]=\"'ghost'\"\n (click)=\"userSelectedDate$.next(undefined)\"\n type=\"button\"\n >\n Clear\n </button>\n <button\n rivButton\n [size]=\"'small'\"\n [variant]=\"'primary'\"\n (click)=\"open$.next(false)\"\n type=\"button\"\n >\n Done\n </button>\n </footer>\n </div>\n </riv-callout>\n </ng-container>\n</ng-template>\n", styles: [".trigger{width:100%;border:var(--border-width) solid var(--border-light);border-radius:var(--border-radius-small);display:flex;gap:var(--size-small);background-color:var(--surface-light-0);cursor:pointer}.trigger:focus{outline:none;border:var(--border-width) solid var(--purp-60)}.trigger:disabled{color:var(--type-light-disabled);background-color:var(--surface-light-1)}.value{font-size:var(--type-2-font-size);line-height:var(--type-2-line-height-0);color:var(--type-light-high-contrast);padding:var(--size-small);flex-grow:1;text-align:left;overflow:hidden;text-overflow:ellipsis;white-space:pre}.value.placeholder{color:var(--type-light-low-contrast)}.chevron{display:flex;justify-content:center;align-items:center;padding:var(--size-xsmall) calc(var(--base-grid-size) * 1.5)}.trigger.warning{border-color:var(--surface-dark-caution)}.trigger.error{border-color:var(--surface-dark-danger);box-shadow:inset 0 0 0 var(--border-width-large) var(--surface-dark-danger)}.content{display:inline-grid;grid-template-rows:1fr auto}.content.include-preset{grid-template-columns:calc(var(--base-grid-size) * 50) 1fr 1fr}.presets{grid-area:1 / 1 / 3 / 2;background-color:var(--surface-light-1);padding:var(--size-xlarge) var(--size-large);border-right:var(--border-width) solid var(--border-light);display:flex;flex-direction:column;gap:var(--size-medium)}.preset{display:flex;transition:background-color var(--short-transition)}.preset:hover{background-color:var(--surface-light-2)}.preset button{color:transparent;transition:color var(--short-transition);padding:var(--size-medium) var(--size-large) var(--size-medium) var(--size-small);cursor:pointer}.preset:hover button{color:var(--type-light-low-contrast)}.preset button:hover{color:var(--type-light-high-contrast)}.preset.favorite button{color:var(--type-light-link)}.preset .description{flex-grow:1;padding:var(--size-medium) var(--size-small) var(--size-medium) var(--size-medium)}.preset .title{display:block;font-size:var(--type-2-font-size);line-height:var(--type-2-line-height-1)}.preset .subtitle{display:block;font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-1);color:var(--type-light-low-contrast)}.shortcuts{display:flex;flex-direction:column;gap:var(--size-xsmall);overflow-y:auto}.shortcut{display:flex;align-items:center;padding:var(--size-small) var(--size-small) var(--size-small) var(--size-medium);gap:var(--size-small);border-radius:var(--border-radius-small);transition:background-color var(--short-transition);cursor:pointer}.shortcut:hover{background-color:var(--black-20)}.shortcut.active{background-color:var(--baloo-05)}.shortcut .title{flex-grow:1;text-align:left;font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-2)}.shortcut button{color:transparent;transition:color var(--short-transition);cursor:pointer}.shortcut:hover button{color:var(--type-light-link)}.calendars{grid-column:2 / 4;display:grid;grid-template-columns:subgrid;grid-template-rows:subgrid;padding:var(--size-large)}.left{grid-area:1 / 1 / 2 / 2;padding-right:var(--size-large);border-right:var(--border-width) solid var(--border-light)}.right{padding-left:var(--size-large);grid-area:1 / 2 / 2 / 3}.buttons{grid-area:2 / 2 / 3 / 4;padding:var(--size-small);display:flex;justify-content:space-between}\n"] }]
208
- }], propDecorators: { showPresets: [{
209
- type: Input
210
- }], min: [{
211
- type: Input
212
- }], max: [{
213
- type: Input
214
- }], value: [{
215
- type: Input
216
- }], placeholder: [{
217
- type: Input
218
- }], disabled: [{
219
- type: Input
220
- }], triggerTemplate: [{
221
- type: ContentChild,
222
- args: ['trigger']
223
- }], customTriggerButton: [{
224
- type: ViewChild,
225
- args: ['customTriggerButton', { read: ElementRef }]
226
- }], standardTriggerButton: [{
227
- type: ViewChild,
228
- args: ['standardTriggerButton', { read: ElementRef }]
229
- }], alternativePresetList: [{
230
- type: Input
231
- }], valueChange: [{
232
- type: Output
233
- }] } });
234
- (function (DateRangeComponent) {
235
- const today = new Date();
236
- let PresetType;
237
- (function (PresetType) {
238
- PresetType["TODAY"] = "today";
239
- PresetType["YESTERDAY"] = "yesterday";
240
- PresetType["TOMORROW"] = "tomorrow";
241
- PresetType["THIS_WEEK"] = "this_week";
242
- PresetType["THIS_WEEK_SO_FAR"] = "this_week_so_far";
243
- PresetType["LAST_WEEK"] = "last_week";
244
- PresetType["NEXT_WEEK"] = "next_week";
245
- PresetType["THIS_MONTH"] = "this_month";
246
- PresetType["THIS_MONTH_SO_FAR"] = "this_month_so_far";
247
- PresetType["LAST_MONTH"] = "last_month";
248
- PresetType["NEXT_MONTH"] = "next_month";
249
- PresetType["THIS_QUARTER"] = "this_quarter";
250
- PresetType["THIS_QUARTER_SO_FAR"] = "this_quarter_so_far";
251
- PresetType["LAST_QUARTER"] = "last_quarter";
252
- PresetType["NEXT_QUARTER"] = "next_quarter";
253
- PresetType["THIS_YEAR"] = "this_year";
254
- PresetType["THIS_YEAR_SO_FAR"] = "this_year_so_far";
255
- PresetType["LAST_YEAR"] = "last_year";
256
- PresetType["NEXT_YEAR"] = "next_year";
257
- PresetType["LAST_7_DAYS"] = "last_7_days";
258
- PresetType["LAST_14_DAYS"] = "last_14_days";
259
- PresetType["LAST_30_DAYS"] = "last_30_days";
260
- PresetType["LAST_60_DAYS"] = "last_60_days";
261
- PresetType["LAST_90_DAYS"] = "last_90_days";
262
- PresetType["LAST_180_DAYS"] = "last_180_days";
263
- PresetType["LAST_365_DAYS"] = "last_365_days";
264
- })(PresetType = DateRangeComponent.PresetType || (DateRangeComponent.PresetType = {}));
265
- DateRangeComponent.Presets = [
266
- {
267
- id: PresetType.TODAY,
268
- title: 'Today',
269
- subtitle: 'Today from midnight until the current time',
270
- dates: [timeDay(), timeDay()],
271
- },
272
- {
273
- id: PresetType.YESTERDAY,
274
- title: 'Yesterday',
275
- subtitle: 'The previous 24 hour day',
276
- dates: [timeDay.offset(timeDay(), -1), timeDay.offset(timeDay(), -1)],
277
- },
278
- {
279
- id: PresetType.TOMORROW,
280
- title: 'Tomorrow',
281
- subtitle: 'The next 24 hour day',
282
- dates: [timeDay.offset(timeDay(), 1), timeDay.offset(timeDay(), 1)],
283
- },
284
- {
285
- id: PresetType.THIS_WEEK,
286
- title: 'This week',
287
- subtitle: 'The current calendar week',
288
- dates: [
289
- timeSunday.floor(today),
290
- timeDay.offset(timeSunday.ceil(today), -1),
291
- ],
292
- },
293
- {
294
- id: PresetType.THIS_WEEK_SO_FAR,
295
- title: 'This week so far',
296
- subtitle: 'The current calendar week up to now',
297
- dates: [timeSunday.floor(today), timeDay.floor(today)],
298
- },
299
- {
300
- id: PresetType.LAST_WEEK,
301
- title: 'Last week',
302
- subtitle: 'The previous calendar week',
303
- dates: [
304
- timeSunday.offset(timeWeek.floor(today), -1),
305
- timeDay.offset(timeSunday.offset(timeWeek.ceil(today), -1), -1),
306
- ],
307
- },
308
- {
309
- id: PresetType.NEXT_WEEK,
310
- title: 'Next week',
311
- subtitle: 'The next calendar week',
312
- dates: [
313
- timeSunday.offset(timeWeek.floor(today), 1),
314
- timeDay.offset(timeSunday.offset(timeWeek.ceil(today), 1), -1),
315
- ],
316
- },
317
- {
318
- id: PresetType.THIS_MONTH,
319
- title: 'This month',
320
- subtitle: 'The current calendar month',
321
- dates: [
322
- timeMonth.floor(today),
323
- timeDay.offset(timeMonth.ceil(today), -1),
324
- ],
325
- },
326
- {
327
- id: PresetType.THIS_MONTH_SO_FAR,
328
- title: 'This month so far',
329
- subtitle: 'The current calendar month up to now',
330
- dates: [timeMonth.floor(today), timeDay.floor(today)],
331
- },
332
- {
333
- id: PresetType.LAST_MONTH,
334
- title: 'Last month',
335
- subtitle: 'The previous calendar month',
336
- dates: [
337
- timeMonth.offset(timeMonth.floor(today), -1),
338
- timeDay.offset(timeMonth.offset(timeMonth.ceil(today), -1), -1),
339
- ],
340
- },
341
- {
342
- id: PresetType.NEXT_MONTH,
343
- title: 'Next month',
344
- subtitle: 'The next calendar month',
345
- dates: [
346
- timeMonth.offset(timeMonth.floor(today), 1),
347
- timeDay.offset(timeMonth.offset(timeMonth.ceil(today), 1), -1),
348
- ],
349
- },
350
- {
351
- id: PresetType.THIS_QUARTER,
352
- title: 'This quarter',
353
- subtitle: 'The current quarter',
354
- dates: [
355
- timeQuarter.floor(today),
356
- timeDay.offset(timeQuarter.ceil(today), -1),
357
- ],
358
- },
359
- {
360
- id: PresetType.THIS_QUARTER_SO_FAR,
361
- title: 'This quarter so far',
362
- subtitle: 'The current quarter up to now',
363
- dates: [timeQuarter.floor(today), timeDay.floor(today)],
364
- },
365
- {
366
- id: PresetType.LAST_QUARTER,
367
- title: 'Last quarter',
368
- subtitle: 'The previous full quarter',
369
- dates: [
370
- timeQuarter.offset(timeQuarter.floor(today), -1),
371
- timeDay.offset(timeQuarter.offset(timeQuarter.ceil(today), -1), -1),
372
- ],
373
- },
374
- {
375
- id: PresetType.NEXT_QUARTER,
376
- title: 'Next quarter',
377
- subtitle: 'The next full quarter',
378
- dates: [
379
- timeQuarter.offset(timeQuarter.floor(today), 1),
380
- timeDay.offset(timeQuarter.offset(timeQuarter.ceil(today), 1), -1),
381
- ],
382
- },
383
- {
384
- id: PresetType.THIS_YEAR,
385
- title: 'This year',
386
- subtitle: 'The current calendar year',
387
- dates: [timeYear.floor(today), timeDay.offset(timeYear.ceil(today), -1)],
388
- },
389
- {
390
- id: PresetType.THIS_YEAR_SO_FAR,
391
- title: 'This year so far',
392
- subtitle: 'The current calendar year up to now',
393
- dates: [timeYear.floor(today), timeDay.floor(today)],
394
- },
395
- {
396
- id: PresetType.LAST_YEAR,
397
- title: 'Last year',
398
- subtitle: 'The previous calendar year',
399
- dates: [
400
- timeYear.offset(timeYear.floor(today), -1),
401
- timeDay.offset(timeYear.offset(timeYear.ceil(today), -1), -1),
402
- ],
403
- },
404
- {
405
- id: PresetType.NEXT_YEAR,
406
- title: 'Next year',
407
- subtitle: 'The next calendar year',
408
- dates: [
409
- timeYear.offset(timeYear.floor(today), 1),
410
- timeDay.offset(timeYear.offset(timeYear.ceil(today), 1), -1),
411
- ],
412
- },
413
- {
414
- id: PresetType.LAST_7_DAYS,
415
- title: 'Last 7 days',
416
- subtitle: 'The previous 7 days before today',
417
- dates: [
418
- timeDay.floor(timeDay.offset(today, -8)),
419
- timeDay.floor(timeDay.offset(today, -1)),
420
- ],
421
- },
422
- {
423
- id: PresetType.LAST_14_DAYS,
424
- title: 'Last 14 days',
425
- subtitle: 'The previous 14 days before today',
426
- dates: [
427
- timeDay.floor(timeDay.offset(today, -15)),
428
- timeDay.floor(timeDay.offset(today, -1)),
429
- ],
430
- },
431
- {
432
- id: PresetType.LAST_30_DAYS,
433
- title: 'Last 30 days',
434
- subtitle: 'The previous 30 days before today',
435
- dates: [
436
- timeDay.floor(timeDay.offset(today, -31)),
437
- timeDay.floor(timeDay.offset(today, -1)),
438
- ],
439
- },
440
- {
441
- id: PresetType.LAST_60_DAYS,
442
- title: 'Last 60 days',
443
- subtitle: 'The previous 60 days before today',
444
- dates: [
445
- timeDay.floor(timeDay.offset(today, -61)),
446
- timeDay.floor(timeDay.offset(today, -1)),
447
- ],
448
- },
449
- {
450
- id: PresetType.LAST_90_DAYS,
451
- title: 'Last 90 days',
452
- subtitle: 'The previous 90 days before today',
453
- dates: [
454
- timeDay.floor(timeDay.offset(today, -91)),
455
- timeDay.floor(timeDay.offset(today, -1)),
456
- ],
457
- },
458
- {
459
- id: PresetType.LAST_180_DAYS,
460
- title: 'Last 180 days',
461
- subtitle: 'The previous 180 days before today',
462
- dates: [
463
- timeDay.floor(timeDay.offset(today, -181)),
464
- timeDay.floor(timeDay.offset(today, -1)),
465
- ],
466
- },
467
- {
468
- id: PresetType.LAST_365_DAYS,
469
- title: 'Last 365 days',
470
- subtitle: 'The previous 365 days before today',
471
- dates: [
472
- timeDay.floor(timeDay.offset(today, -366)),
473
- timeDay.floor(timeDay.offset(today, -1)),
474
- ],
475
- },
476
- ];
477
- })(DateRangeComponent || (DateRangeComponent = {}));
478
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS1yYW5nZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9yaXYvc3JjL2xpYi9pbnB1dC9kYXRlLXJhbmdlL2RhdGUtcmFuZ2UuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcml2L3NyYy9saWIvaW5wdXQvZGF0ZS1yYW5nZS9kYXRlLXJhbmdlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFlBQVksRUFDWixVQUFVLEVBQ1YsS0FBSyxFQUNMLE1BQU0sRUFFTixTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDN0UsT0FBTyxFQUNMLGVBQWUsRUFFZixPQUFPLEVBQ1AsYUFBYSxFQUNiLG9CQUFvQixFQUNwQixNQUFNLEVBQ04sR0FBRyxFQUNILEtBQUssRUFDTCxJQUFJLEVBQ0osV0FBVyxFQUNYLFNBQVMsRUFDVCxTQUFTLEdBQ1YsTUFBTSxNQUFNLENBQUM7QUFDZCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDeEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDOzs7Ozs7Ozs7Ozs7O0FBQzNFLE1BQU0sV0FBVyxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFFLENBQUM7QUFFeEMsNkVBQTZFO0FBQzdFLDJCQUEyQjtBQUMzQixtR0FBbUc7QUFPbkcsTUFBTSxPQUFPLGtCQUFtQixTQUFR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QUMsWUFBWTtZQUMzQixLQUFLLEVBQUUsY0FBYztZQUNyQixRQUFRLEVBQUUsbUNBQW1DO1lBQzdDLEtBQUssRUFBRTtnQkFDTCxPQUFPLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ3pDLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUN6QztTQUNGO1FBQ0Q7WUFDRSxFQUFFLEVBQUUsVUFBVSxDQUFDLGFBQWE7WUFDNUIsS0FBSyxFQUFFLGVBQWU7WUFDdEIsUUFBUSxFQUFFLG9DQUFvQztZQUM5QyxLQUFLLEVBQUU7Z0JBQ0wsT0FBTyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUMxQyxPQUFPLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDekM7U0FDRjtRQUNEO1lBQ0UsRUFBRSxFQUFFLFVBQVUsQ0FBQyxhQUFhO1lBQzVCLEtBQUssRUFBRSxlQUFlO1lBQ3RCLFFBQVEsRUFBRSxvQ0FBb0M7WUFDOUMsS0FBSyxFQUFFO2dCQUNMLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDMUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ3pDO1NBQ0Y7S0FDRixDQUFDO0FBQ0osQ0FBQyxFQTNQZ0Isa0JBQWtCLEtBQWxCLGtCQUFrQixRQTJQbEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBDb250ZW50Q2hpbGQsXG4gIEVsZW1lbnRSZWYsXG4gIElucHV0LFxuICBPdXRwdXQsXG4gIFRlbXBsYXRlUmVmLFxuICBWaWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdGltZURheSwgdGltZU1vbnRoLCB0aW1lU3VuZGF5LCB0aW1lV2VlaywgdGltZVllYXIgfSBmcm9tICdkMy10aW1lJztcbmltcG9ydCB7XG4gIEJlaGF2aW9yU3ViamVjdCxcbiAgT2JzZXJ2YWJsZSxcbiAgU3ViamVjdCxcbiAgY29tYmluZUxhdGVzdCxcbiAgZGlzdGluY3RVbnRpbENoYW5nZWQsXG4gIGZpbHRlcixcbiAgbWFwLFxuICBtZXJnZSxcbiAgc2NhbixcbiAgc2hhcmVSZXBsYXksXG4gIHNraXBVbnRpbCxcbiAgc3RhcnRXaXRoLFxufSBmcm9tICdyeGpzJztcbmltcG9ydCB7IERhdGVQaXBlIH0gZnJvbSAnLi4vLi4vZm9ybWF0L3BpcGVzL2RhdGUucGlwZSc7XG5pbXBvcnQgeyBMb2NhbFN0b3JhZ2UgfSBmcm9tICcuLi8uLi91dGlsL2xvY2FsLXN0b3JhZ2UnO1xuaW1wb3J0IHsgQ2FsZW5kYXJDb21wb25lbnQgfSBmcm9tICcuLi9jYWxlbmRhci9jYWxlbmRhci5jb21wb25lbnQnO1xuaW1wb3J0IHsgSW5wdXRMYWJlbENvbXBvbmVudCB9IGZyb20gJy4uL2lucHV0LWxhYmVsL2lucHV0LWxhYmVsLmNvbXBvbmVudCc7XG5jb25zdCB0aW1lUXVhcnRlciA9IHRpbWVNb250aC5ldmVyeSgzKSE7XG5cbi8vIFRPRE86IG9uY2Ugd2UgdXBncmFkZSB0byBBbmd1bGFyIDE2LCB0aGlzIGNvbXBvbmVudCBjYW4gYmUgY2xlYW5lZCB1cCB3aXRoXG4vLyBzaWduYWxzIGluc3RlYWQgb2YgUnhKUy5cbi8vIGh0dHBzOi8vd3d3Lm5vdGlvbi5zby9yaXZldC9SZXNvbHZlLVRPRE9zLWFmdGVyLUFuZ3VsYXItdXBncmFkZS0xZjI2NjdlYjJhMzE4MGI3OWY2YWQ5MmE3ZTU3NmYwOFxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAncml2LWRhdGUtcmFuZ2UnLFxuICB0ZW1wbGF0ZVVybDogJy4vZGF0ZS1yYW5nZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2RhdGUtcmFuZ2UuY29tcG9uZW50LmNzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgRGF0ZVJhbmdlQ29tcG9uZW50IGV4dGVuZHMgSW5wdXRMYWJlbENvbXBvbmVudCB7XG4gIHJlYWRvbmx5IFRPREFZID0gbmV3IERhdGUoKTtcbiAgcmVhZG9ubHkgU1RPUkFHRV9LRVkgPSAnZGF0ZS1yYW5nZS5kZWZhdWx0JztcblxuICBwcml2YXRlIHJlYWRvbmx5IHNob3dQcmVzZXRzJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4odHJ1ZSk7XG4gIEBJbnB1dCgpXG4gIHNldCBzaG93UHJlc2V0cyh2OiBib29sZWFuKSB7XG4gICAgdGhpcy5zaG93UHJlc2V0cyQubmV4dCh2KTtcbiAgfVxuICBnZXQgc2hvd1ByZXNldHMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc2hvd1ByZXNldHMkLmdldFZhbHVlKCk7XG4gIH1cblxuICByZWFkb25seSBtaW4kID0gbmV3IEJlaGF2aW9yU3ViamVjdDxEYXRlPihDYWxlbmRhckNvbXBvbmVudC5kZWZhdWx0TWluKTtcbiAgQElucHV0KClcbiAgc2V0IG1pbih2OiBEYXRlKSB7XG4gICAgdGhpcy5taW4kLm5leHQodik7XG4gIH1cbiAgZ2V0IG1pbigpOiBEYXRlIHtcbiAgICByZXR1cm4gdGhpcy5taW4kLmdldFZhbHVlKCk7XG4gIH1cblxuICByZWFkb25seSBtYXgkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxEYXRlPihDYWxlbmRhckNvbXBvbmVudC5kZWZhdWx0TWF4KTtcbiAgQElucHV0KClcbiAgc2V0IG1heCh2OiBEYXRlKSB7XG4gICAgdGhpcy5tYXgkLm5leHQodik7XG4gIH1cbiAgZ2V0IG1heCgpOiBEYXRlIHtcbiAgICByZXR1cm4gdGhpcy5tYXgkLmdldFZhbHVlKCk7XG4gIH1cblxuICByZWFkb25seSB2YWx1ZSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFtEYXRlLCBEYXRlXSB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgQElucHV0KClcbiAgc2V0IHZhbHVlKHY6IFtEYXRlLCBEYXRlXSB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMudmFsdWUkLm5leHQodik7XG4gIH1cbiAgZ2V0IHZhbHVlKCk6IFtEYXRlLCBEYXRlXSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWUkLmdldFZhbHVlKCk7XG4gIH1cblxuICByZWFkb25seSBkaXN0aW5jdFZhbHVlJCA9IHRoaXMudmFsdWUkLnBpcGUoXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoXG4gICAgICAocHJldmlvdXMsIGN1cnJlbnQpID0+XG4gICAgICAgIHByZXZpb3VzPy5bMF0udmFsdWVPZigpID09PSBjdXJyZW50Py5bMF0udmFsdWVPZigpICYmXG4gICAgICAgIHByZXZpb3VzPy5bMV0udmFsdWVPZigpID09PSBjdXJyZW50Py5bMV0udmFsdWVPZigpLFxuICAgICksXG4gICAgc2hhcmVSZXBsYXkoeyByZWZDb3VudDogdHJ1ZSwgYnVmZmVyU2l6ZTogMSB9KSxcbiAgKTtcblxuICByZWFkb25seSBwbGFjZWhvbGRlciQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4oJ1NlbGVjdCBkYXRlIHJhbmdlJyk7XG4gIEBJbnB1dCgpXG4gIHNldCBwbGFjZWhvbGRlcih2OiBzdHJpbmcpIHtcbiAgICB0aGlzLnBsYWNlaG9sZGVyJC5uZXh0KHYpO1xuICB9XG4gIGdldCBwbGFjZWhvbGRlcigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnBsYWNlaG9sZGVyJC5nZXRWYWx1ZSgpO1xuICB9XG5cbiAgcmVhZG9ubHkgZGlzYWJsZWQkID0gbmV3IEJlaGF2aW9yU3ViamVjdChmYWxzZSk7XG4gIEBJbnB1dCgpXG4gIHNldCBkaXNhYmxlZCh2OiBib29sZWFuKSB7XG4gICAgdGhpcy5kaXNhYmxlZCQubmV4dCh2KTtcbiAgfVxuICBnZXQgZGlzYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZGlzYWJsZWQkLmdldFZhbHVlKCk7XG4gIH1cblxuICBAQ29udGVudENoaWxkKCd0cmlnZ2VyJylcbiAgdHJpZ2dlclRlbXBsYXRlPzogVGVtcGxhdGVSZWY8eyBvcGVuOiBib29sZWFuIH0+O1xuXG4gIEBWaWV3Q2hpbGQoJ2N1c3RvbVRyaWdnZXJCdXR0b24nLCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSlcbiAgY3VzdG9tVHJpZ2dlckJ1dHRvbj86IEVsZW1lbnRSZWY7XG5cbiAgQFZpZXdDaGlsZCgnc3RhbmRhcmRUcmlnZ2VyQnV0dG9uJywgeyByZWFkOiBFbGVtZW50UmVmIH0pXG4gIHN0YW5kYXJkVHJpZ2dlckJ1dHRvbj86IEVsZW1lbnRSZWY7XG5cbiAgZ2V0VHJpZ2dlcigpOiBFbGVtZW50IHwgbnVsbCB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuY3VzdG9tVHJpZ2dlckJ1dHRvbj8ubmF0aXZlRWxlbWVudCA/P1xuICAgICAgdGhpcy5zdGFuZGFyZFRyaWdnZXJCdXR0b24/Lm5hdGl2ZUVsZW1lbnQgPz9cbiAgICAgIG51bGxcbiAgICApO1xuICB9XG5cbiAgcmVhZG9ubHkgYWx0ZXJuYXRpdmVQcmVzZXRMaXN0JCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8XG4gICAgRGF0ZVJhbmdlQ29tcG9uZW50LlByZXNldFR5cGVbXVxuICA+KFtdKTtcbiAgQElucHV0KClcbiAgc2V0IGFsdGVybmF0aXZlUHJlc2V0TGlzdCh2OiBEYXRlUmFuZ2VDb21wb25lbnQuUHJlc2V0VHlwZVtdKSB7XG4gICAgdGhpcy5hbHRlcm5hdGl2ZVByZXNldExpc3QkLm5leHQodik7XG4gIH1cbiAgZ2V0IGFsdGVybmF0aXZlUHJlc2V0TGlzdCgpOiBEYXRlUmFuZ2VDb21wb25lbnQuUHJlc2V0VHlwZVtdIHtcbiAgICByZXR1cm4gdGhpcy5hbHRlcm5hdGl2ZVByZXNldExpc3QkLmdldFZhbHVlKCk7XG4gIH1cblxuICByZWFkb25seSBvcGVuJCA9IG5ldyBCZWhhdmlvclN1YmplY3QoZmFsc2UpO1xuXG4gIHJlYWRvbmx5IHVzZXJTZWxlY3RlZFByZXNldCQgPVxuICAgIG5ldyBTdWJqZWN0PERhdGVSYW5nZUNvbXBvbmVudC5QcmVzZXQgfCBudWxsPigpO1xuXG4gIHJlYWRvbmx5IHVzZXJTZWxlY3RlZERhdGUkID0gbmV3IFN1YmplY3Q8RGF0ZSB8IHVuZGVmaW5lZD4oKTtcbiAgcmVhZG9ubHkgc2VsZWN0ZWRWYWx1ZSQ6IE9ic2VydmFibGU8RGF0ZSB8IFtEYXRlLCBEYXRlXSB8IHVuZGVmaW5lZD4gPSBtZXJnZShcbiAgICB0aGlzLmRpc3RpbmN0VmFsdWUkLFxuICAgIHRoaXMudXNlclNlbGVjdGVkRGF0ZSQucGlwZShcbiAgICAgIHNjYW4oXG4gICAgICAgIChwcmV2aW91czogRGF0ZSB8IFtEYXRlLCBEYXRlXSB8IHVuZGVmaW5lZCwgZGF0ZTogRGF0ZSB8IHVuZGVmaW5lZCkgPT4ge1xuICAgICAgICAgIGlmIChwcmV2aW91cyBpbnN0YW5jZW9mIERhdGUgJiYgZGF0ZSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgICAgICAgIGlmIChkYXRlLnZhbHVlT2YoKSA+PSBwcmV2aW91cy52YWx1ZU9mKCkpIHtcbiAgICAgICAgICAgICAgY29uc3QgcGFpcjogW0RhdGUsIERhdGVdID0gW3ByZXZpb3VzLCBkYXRlXTtcbiAgICAgICAgICAgICAgcmV0dXJuIHBhaXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBkYXRlO1xuICAgICAgICB9LFxuICAgICAgKSxcbiAgICApLFxuICAgIHRoaXMudXNlclNlbGVjdGVkUHJlc2V0JC5waXBlKFxuICAgICAgZmlsdGVyKChwcmVzZXQpOiBwcmVzZXQgaXMgRGF0ZVJhbmdlQ29tcG9uZW50LlByZXNldCA9PiBwcmVzZXQgIT09IG51bGwpLFxuICAgICAgbWFwKHByZXNldCA9PiBwcmVzZXQuZGF0ZXMpLFxuICAgICksXG4gICkucGlwZShzaGFyZVJlcGxheSh7IHJlZkNvdW50OiB0cnVlLCBidWZmZXJTaXplOiAxIH0pKTtcblxuICByZWFkb25seSBmaWx0ZXJlZFByZXNldE9wdGlvbnMkID0gY29tYmluZUxhdGVzdChbXG4gICAgdGhpcy5taW4kLFxuICAgIHRoaXMubWF4JCxcbiAgICB0aGlzLmFsdGVybmF0aXZlUHJlc2V0TGlzdCQsXG4gIF0pLnBpcGUoXG4gICAgbWFwKChbbWluLCBtYXgsIGFsdGVybmF0aXZlUHJlc2V0TGlzdF0pID0+IHtcbiAgICAgIGNvbnN0IG9wdGlvbnNGaWx0ZXJlZE9uTWluTWF4ID0gRGF0ZVJhbmdlQ29tcG9uZW50LlByZXNldHMuZmlsdGVyKFxuICAgICAgICBwID0+XG4gICAgICAgICAgcC5kYXRlc1swXS52YWx1ZU9mKCkgPj0gbWluLnZhbHVlT2YoKSAmJlxuICAgICAgICAgIHAuZGF0ZXNbMV0udmFsdWVPZigpIDw9IG1heC52YWx1ZU9mKCksXG4gICAgICApO1xuICAgICAgaWYgKGFsdGVybmF0aXZlUHJlc2V0TGlzdC5sZW5ndGggPT0gMCkge1xuICAgICAgICByZXR1cm4gb3B0aW9uc0ZpbHRlcmVkT25NaW5NYXg7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBvcHRpb25zRmlsdGVyZWRPbkFsdGVybmF0aXZlUHJlc2V0TGlzdCA9XG4gICAgICAgICAgb3B0aW9uc0ZpbHRlcmVkT25NaW5NYXguZmlsdGVyKHAgPT5cbiAgICAgICAgICAgIGFsdGVybmF0aXZlUHJlc2V0TGlzdC5pbmNsdWRlcyhwLmlkKSxcbiAgICAgICAgICApO1xuICAgICAgICByZXR1cm4gb3B0aW9uc0ZpbHRlcmVkT25BbHRlcm5hdGl2ZVByZXNldExpc3Q7XG4gICAgICB9XG4gICAgfSksXG4gICAgc2hhcmVSZXBsYXkoeyByZWZDb3VudDogdHJ1ZSwgYnVmZmVyU2l6ZTogMSB9KSxcbiAgKTtcblxuICByZWFkb25seSBzZWxlY3RlZFByZXNldCQ6IE9ic2VydmFibGU8RGF0ZVJhbmdlQ29tcG9uZW50LlByZXNldCB8IG51bGw+ID1cbiAgICBjb21iaW5lTGF0ZXN0KFtcbiAgICAgIHRoaXMuc2VsZWN0ZWRWYWx1ZSQsXG4gICAgICB0aGlzLnVzZXJTZWxlY3RlZFByZXNldCQucGlwZShzdGFydFdpdGgobnVsbCkpLFxuICAgIF0pLnBpcGUoXG4gICAgICBtYXAoKFtzZWxlY3RlZFZhbHVlLCB1c2VyU2VsZWN0ZWRQcmVzZXRdKSA9PiB7XG4gICAgICAgIGlmIChzZWxlY3RlZFZhbHVlIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgICAgICBjb25zdCBvcHRpb25zID0gRGF0ZVJhbmdlQ29tcG9uZW50LlByZXNldHMuZmlsdGVyKFxuICAgICAgICAgICAgcHJlc2V0ID0+XG4gICAgICAgICAgICAgIHByZXNldC5kYXRlc1swXS52YWx1ZU9mKCkgPT09IHNlbGVjdGVkVmFsdWVbMF0udmFsdWVPZigpICYmXG4gICAgICAgICAgICAgIHByZXNldC5kYXRlc1sxXS52YWx1ZU9mKCkgPT09IHNlbGVjdGVkVmFsdWVbMV0udmFsdWVPZigpLFxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKG9wdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAvLyBTb21lIGRhdGUgcmFuZ2VzIG1hdGNoIG11bHRpcGxlIHByZXNldHMsIGUuZy4gb24gSmFuIDE5dGgsIGFcbiAgICAgICAgICAgIC8vIHNlbGVjdGVkIGRhdGUgcmFuZ2Ugb2YgSmFuIDEtMTkgd291bGQgY29ycmVzcG9uZCB0byBcInRoaXMgbW9udGhcbiAgICAgICAgICAgIC8vIHNvIGZhcixcIiBcInRoaXMgcXVhcnRlciBzbyBmYXIsXCIgYW5kIFwidGhpcyB5ZWFyIHNvIGZhci5cIiBXZSdsbFxuICAgICAgICAgICAgLy8gdXNlIHRoZSB1c2VyJ3MgbW9zdCByZWNlbnQgbWFudWFsIHNlbGVjdGlvbiBhcyBhIHRpZSBicmVha2VyXG4gICAgICAgICAgICAvLyB3aGVyZSBwb3NzaWJsZS5cbiAgICAgICAgICAgIGNvbnN0IG1vc3RSZWNlbnQgPSBvcHRpb25zLmZpbmQoXG4gICAgICAgICAgICAgIG9wdGlvbiA9PiBvcHRpb24uaWQgPT09IHVzZXJTZWxlY3RlZFByZXNldD8uaWQsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKG1vc3RSZWNlbnQpIHJldHVybiBtb3N0UmVjZW50O1xuICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnNbMF07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfSksXG4gICAgKTtcblxuICByZWFkb25seSBmYXZvcml0ZVByZXNldElkcyQgPSBuZXcgTG9jYWxTdG9yYWdlPHN0cmluZ1tdPihcbiAgICB0aGlzLlNUT1JBR0VfS0VZLFxuICAgIFtdLFxuICApO1xuXG4gIHNldEZhdm9yaXRlKHByZXNldDogRGF0ZVJhbmdlQ29tcG9uZW50LlByZXNldCwgZmF2b3JpdGU6IGJvb2xlYW4pIHtcbiAgICBjb25zdCBpZHMgPSBuZXcgU2V0KHRoaXMuZmF2b3JpdGVQcmVzZXRJZHMkLmdldFZhbHVlKCkpO1xuICAgIGlmIChmYXZvcml0ZSkge1xuICAgICAgaWRzLmFkZChwcmVzZXQuaWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZHMuZGVsZXRlKHByZXNldC5pZCk7XG4gICAgfVxuICAgIHRoaXMuZmF2b3JpdGVQcmVzZXRJZHMkLm5leHQoWy4uLmlkc10pO1xuICB9XG5cbiAgcmVhZG9ubHkgZmF2b3JpdGVQcmVzZXRzJDogT2JzZXJ2YWJsZTxEYXRlUmFuZ2VDb21wb25lbnQuUHJlc2V0W10+ID1cbiAgICBjb21iaW5lTGF0ZXN0KFtcbiAgICAgIHRoaXMuZmF2b3JpdGVQcmVzZXRJZHMkLFxuICAgICAgdGhpcy5maWx0ZXJlZFByZXNldE9wdGlvbnMkLFxuICAgICAgdGhpcy5hbHRlcm5hdGl2ZVByZXNldExpc3QkLFxuICAgIF0pLnBpcGUoXG4gICAgICBtYXAoKFtpZHMsIHByZXNldHMsIGFsdGVybmF0aXZlUHJlc2V0TGlzdF0pID0+IHtcbiAgICAgICAgY29uc3QgZmF2b3JpdGVQcmVzZXRzID0gaWRzXG4gICAgICAgICAgLm1hcChpZCA9PiBwcmVzZXRzLmZpbmQocHJlc2V0ID0+IHByZXNldC5pZCA9PT0gaWQpKVxuICAgICAgICAgIC5maWx0ZXIoKHApOiBwIGlzIERhdGVSYW5nZUNvbXBvbmVudC5QcmVzZXQgPT4gcCAhPT0gdW5kZWZpbmVkKTtcblxuICAgICAgICBpZiAoYWx0ZXJuYXRpdmVQcmVzZXRMaXN0Lmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIGZhdm9yaXRlUHJlc2V0cztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBmYXZvcml0ZXNGaWx0ZXJlZE9uQWx0ZXJuYXRpdmVQcmVzZXRMaXN0ID1cbiAgICAgICAgICAgIGZhdm9yaXRlUHJlc2V0cy5maWx0ZXIocCA9PlxuICAgICAgICAgICAgICBhbHRlcm5hdGl2ZVByZXNldExpc3QuaW5jbHVkZXMoXG4gICAgICAgICAgICAgICAgPERhdGVSYW5nZUNvbXBvbmVudC5QcmVzZXRUeXBlPnAuaWQsXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiBmYXZvcml0ZXNGaWx0ZXJlZE9uQWx0ZXJuYXRpdmVQcmVzZXRMaXN0O1xuICAgICAgICB9XG4gICAgICB9KSxcbiAgICAgIHNoYXJlUmVwbGF5KHsgcmVmQ291bnQ6IHRydWUsIGJ1ZmZlclNpemU6IDEgfSksXG4gICAgKTtcblxuICByZWFkb25seSB1c2VyTGVmdEFjdGl2ZVllYXJNb250aCQgPSBuZXcgU3ViamVjdDxEYXRlPigpO1xuICByZWFkb25seSB1c2VyUmlnaHRBY3RpdmVZZWFyTW9udGgkID0gbmV3IFN1YmplY3Q8RGF0ZT4oKTtcblxuICByZWFkb25seSBsZWZ0TWluJCA9IHRoaXMubWluJC5waXBlKFxuICAgIHNoYXJlUmVwbGF5KHsgcmVmQ291bnQ6IHRydWUsIGJ1ZmZlclNpemU6IDEgfSksXG4gICk7XG4gIHJlYWRvbmx5IGxlZnRNYXgkID0gdGhpcy5tYXgkLnBpcGUoXG4gICAgbWFwKG1heCA9PiB0aW1lRGF5Lm9mZnNldCh0aW1lTW9udGguZmxvb3IobWF4KSwgLTEpKSxcbiAgICBzaGFyZVJlcGxheSh7IHJlZkNvdW50OiB0cnVlLCBidWZmZXJTaXplOiAxIH0pLFxuICApO1xuICByZWFkb25seSByaWdodE1heCQgPSB0aGlzLm1heCQucGlwZShcbiAgICBzaGFyZVJlcGxheSh7IHJlZkNvdW50OiB0cnVlLCBidWZmZXJTaXplOiAxIH0pLFxuICApO1xuXG4gIHJlYWRvbmx5IGxlZnRBY3RpdmVZZWFyTW9udGgkID0gY29tYmluZUxhdGVzdChbXG4gICAgdGhpcy5sZWZ0TWF4JCxcbiAgICBtZXJnZShcbiAgICAgIHRoaXMudXNlckxlZnRBY3RpdmVZZWFyTW9udGgkLnBpcGUoXG4gICAgICAgIHN0YXJ0V2l0aCh0aW1lTW9udGguZmxvb3IodGhpcy5UT0RBWSkpLFxuICAgICAgKSxcbiAgICAgIHRoaXMudXNlclNlbGVjdGVkUHJlc2V0JC5waXBlKFxuICAgICAgICBmaWx0ZXIoXG4gICAgICAgICAgKHByZXNldCk6IHByZXNldCBpcyBEYXRlUmFuZ2VDb21wb25lbnQuUHJlc2V0ID0+IHByZXNldCAhPT0gbnVsbCxcbiAgICAgICAgKSxcbiAgICAgICAgbWFwKHByZXNldCA9PiB0aW1lTW9udGguZmxvb3IocHJlc2V0LmRhdGVzWzBdKSksXG4gICAgICApLFxuICAgICAgdGhpcy5kaXN0aW5jdFZhbHVlJC5waXBlKFxuICAgICAgICBmaWx0ZXIoKHYpOiB2IGlzIFtEYXRlLCBEYXRlXSA9PiB2ICE9PSB1bmRlZmluZWQpLFxuICAgICAgICBtYXAodiA9PiB0aW1lTW9udGguZmxvb3IodlswXSkpLFxuICAgICAgKSxcbiAgICApLFxuICBdKS5waXBlKFxuICAgIG1hcCgoW2xlZnRNYXgsIGxlZnRdKSA9PiB7XG4gICAgICBpZiAobGVmdC52YWx1ZU9mKCkgPj0gbGVmdE1heC52YWx1ZU9mKCkpIHJldHVybiB0aW1lTW9udGguZmxvb3IobGVmdE1heCk7XG4gICAgICBlbHNlIHJldHVybiBsZWZ0O1xuICAgIH0pLFxuICAgIHNoYXJlUmVwbGF5KHsgcmVmQ291bnQ6IHRydWUsIGJ1ZmZlclNpemU6IDEgfSksXG4gICk7XG5cbiAgcmVhZG9ubHkgcmlnaHRBY3RpdmVZZWFyTW9udGgkID0gY29tYmluZUxhdGVzdChbXG4gICAgdGhpcy5sZWZ0QWN0aXZlWWVhck1vbnRoJCxcbiAgICBtZXJnZShcbiAgICAgIHRoaXMudXNlclJpZ2h0QWN0aXZlWWVhck1vbnRoJC5waXBlKFxuICAgICAgICBzdGFydFdpdGgodGltZU1vbnRoLmNlaWwodGhpcy5UT0RBWSkpLFxuICAgICAgKSxcbiAgICAgIHRoaXMudXNlclNlbGVjdGVkUHJlc2V0JC5waXBlKFxuICAgICAgICBmaWx0ZXIoXG4gICAgICAgICAgKHByZXNldCk6IHByZXNldCBpcyBEYXRlUmFuZ2VDb21wb25lbnQuUHJlc2V0ID0+IHByZXNldCAhPT0gbnVsbCxcbiAgICAgICAgKSxcbiAgICAgICAgbWFwKHByZXNldCA9PiB0aW1lTW9udGguZmxvb3IocHJlc2V0LmRhdGVzWzFdKSksXG4gICAgICApLFxuICAgICAgdGhpcy5kaXN0aW5jdFZhbHVlJC5waXBlKFxuICAgICAgICBmaWx0ZXIoKHYpOiB2IGlzIFtEYXRlLCBEYXRlXSA9PiB2ICE9PSB1bmRlZmluZWQpLFxuICAgICAgICBtYXAodiA9PiB0aW1lTW9udGguZmxvb3IodlsxXSkpLFxuICAgICAgKSxcbiAgICApLFxuICAgIHRoaXMucmlnaHRNYXgkLFxuICBdKS5waXBlKFxuICAgIG1hcCgoW2xlZnQsIHVzZXJSaWdodCwgcmlnaHRNYXgkXSkgPT4ge1xuICAgICAgaWYgKGxlZnQudmFsdWVPZigpID49IHVzZXJSaWdodC52YWx1ZU9mKCkpXG4gICAgICAgIHJldHVybiB0aW1lTW9udGguZmxvb3IodGltZU1vbnRoLm9mZnNldChsZWZ0LCAxKSk7XG4gICAgICBlbHNlIGlmICh1c2VyUmlnaHQudmFsdWVPZigpID49IHJpZ2h0TWF4JC52YWx1ZU9mKCkpXG4gICAgICAgIHJldHVybiB0aW1lTW9udGguZmxvb3IocmlnaHRNYXgkKTtcbiAgICAgIGVsc2UgcmV0dXJuIHVzZXJSaWdodDtcbiAgICB9KSxcbiAgICBzaGFyZVJlcGxheSh7IHJlZkNvdW50OiB0cnVlLCBidWZmZXJTaXplOiAxIH0pLFxuICApO1xuXG4gIHJlYWRvbmx5IHJpZ2h0TWluJCA9IHRoaXMubGVmdEFjdGl2ZVllYXJNb250aCQucGlwZShcbiAgICBtYXAobGVmdCA9PiB0aW1lTW9udGguZmxvb3IodGltZU1vbnRoLm9mZnNldChsZWZ0LCAxKSkpLFxuICAgIHNoYXJlUmVwbGF5KHsgcmVmQ291bnQ6IHRydWUsIGJ1ZmZlclNpemU6IDEgfSksXG4gICk7XG5cbiAgcmVhZG9ubHkgbGVmdE9taXRSYW5nZSQ6IE9ic2VydmFibGU8W0RhdGUsIERhdGVdPiA9XG4gICAgdGhpcy5yaWdodEFjdGl2ZVllYXJNb250aCQucGlwZShcbiAgICAgIG1hcDxEYXRlLCBbRGF0ZSwgRGF0ZV0+KHJpZ2h0QWN0aXZlWWVhck1vbnRoID0+IHtcbiAgICAgICAgY29uc3QgZmlyc3QgPSB0aW1lTW9udGguZmxvb3IocmlnaHRBY3RpdmVZZWFyTW9udGgpO1xuICAgICAgICBjb25zdCBsYXN0ID0gdGltZURheS5vZmZzZXQoXG4gICAgICAgICAgdGltZU1vbnRoLmZsb29yKHRpbWVNb250aC5vZmZzZXQocmlnaHRBY3RpdmVZZWFyTW9udGgsIDEpKSxcbiAgICAgICAgICAtMSxcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIFtmaXJzdCwgbGFzdF07XG4gICAgICB9KSxcbiAgICAgIHNoYXJlUmVwbGF5KHsgcmVmQ291bnQ6IHRydWUsIGJ1ZmZlclNpemU6IDEgfSksXG4gICAgKTtcblxuICByZWFkb25seSB1c2VySW50ZXJhY3RlZCQgPSBtZXJnZShcbiAgICB0aGlzLnVzZXJTZWxlY3RlZERhdGUkLFxuICAgIHRoaXMudXNlclNlbGVjdGVkUHJlc2V0JCxcbiAgKTtcblxuICBAT3V0cHV0KClcbiAgcmVhZG9ubHkgdmFsdWVDaGFuZ2U6IE9ic2VydmFibGU8W0RhdGUsIERhdGVdIHwgdW5kZWZpbmVkPiA9XG4gICAgdGhpcy5zZWxlY3RlZFZhbHVlJC5waXBlKFxuICAgICAgc2tpcFVudGlsKFxuICAgICAgICBtZXJnZShcbiAgICAgICAgICB0aGlzLnVzZXJJbnRlcmFjdGVkJCxcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkVmFsdWUkLnBpcGUoZmlsdGVyKHYgPT4gdiAhPT0gdW5kZWZpbmVkKSksXG4gICAgICAgICksXG4gICAgICApLFxuICAgICAgZmlsdGVyKCh2KTogdiBpcyBbRGF0ZSwgRGF0ZV0gfCB1bmRlZmluZWQgPT4gISh2IGluc3RhbmNlb2YgRGF0ZSkpLFxuICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoXG4gICAgICAgIChwcmV2aW91cywgY3VycmVudCkgPT5cbiAgICAgICAgICBwcmV2aW91cz8uWzBdLnZhbHVlT2YoKSA9PT0gY3VycmVudD8uWzBdLnZhbHVlT2YoKSAmJlxuICAgICAgICAgIHByZXZpb3VzPy5bMV0udmFsdWVPZigpID09PSBjdXJyZW50Py5bMV0udmFsdWVPZigpLFxuICAgICAgKSxcbiAgICAgIHNoYXJlUmVwbGF5KHsgcmVmQ291bnQ6IHRydWUsIGJ1ZmZlclNpemU6IDEgfSksXG4gICAgKTtcblxuICByZWFkb25seSBkaXNwbGF5VmFsdWUkOiBPYnNlcnZhYmxlPHN0cmluZyB8IHVuZGVmaW5lZD4gPVxuICAgIHRoaXMudmFsdWVDaGFuZ2UucGlwZShcbiAgICAgIG1hcCh2ID0+IHtcbiAgICAgICAgaWYgKHYpIHtcbiAgICAgICAgICByZXR1cm4gdi5tYXAoZGF0ZSA9PiBuZXcgRGF0ZVBpcGUoKS50cmFuc2Zvcm0oZGF0ZSkpLmpvaW4oJyDigJQgJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH0pLFxuICAgICAgc2hhcmVSZXBsYXkoeyByZWZDb3VudDogdHJ1ZSwgYnVmZmVyU2l6ZTogMSB9KSxcbiAgICApO1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIERhdGVSYW5nZUNvbXBvbmVudCB7XG4gIGNvbnN0IHRvZGF5ID0gbmV3IERhdGUoKTtcblxuICBleHBvcnQgZW51bSBQcmVzZXRUeXBlIHtcbiAgICBUT0RBWSA9ICd0b2RheScsXG4gICAgWUVTVEVSREFZID0gJ3llc3RlcmRheScsXG4gICAgVE9NT1JST1cgPSAndG9tb3Jyb3cnLFxuICAgIFRISVNfV0VFSyA9ICd0aGlzX3dlZWsnLFxuICAgIFRISVNfV0VFS19TT19GQVIgPSAndGhpc193ZWVrX3NvX2ZhcicsXG4gICAgTEFTVF9XRUVLID0gJ2xhc3Rfd2VlaycsXG4gICAgTkVYVF9XRUVLID0gJ25leHRfd2VlaycsXG4gICAgVEhJU19NT05USCA9ICd0aGlzX21vbnRoJyxcbiAgICBUSElTX01PTlRIX1NPX0ZBUiA9ICd0aGlzX21vbnRoX3NvX2ZhcicsXG4gICAgTEFTVF9NT05USCA9ICdsYXN0X21vbnRoJyxcbiAgICBORVhUX01PTlRIID0gJ25leHRfbW9udGgnLFxuICAgIFRISVNfUVVBUlRFUiA9ICd0aGlzX3F1YXJ0ZXInLFxuICAgIFRISVNfUVVBUlRFUl9TT19GQVIgPSAndGhpc19xdWFydGVyX3NvX2ZhcicsXG4gICAgTEFTVF9RVUFSVEVSID0gJ2xhc3RfcXVhcnRlcicsXG4gICAgTkVYVF9RVUFSVEVSID0gJ25leHRfcXVhcnRlcicsXG4gICAgVEhJU19ZRUFSID0gJ3RoaXNfeWVhcicsXG4gICAgVEhJU19ZRUFSX1NPX0ZBUiA9ICd0aGlzX3llYXJfc29fZmFyJyxcbiAgICBMQVNUX1lFQVIgPSAnbGFzdF95ZWFyJyxcbiAgICBORVhUX1lFQVIgPSAnbmV4dF95ZWFyJyxcbiAgICBMQVNUXzdfREFZUyA9ICdsYXN0XzdfZGF5cycsXG4gICAgTEFTVF8xNF9EQVlTID0gJ2xhc3RfMTRfZGF5cycsXG4gICAgTEFTVF8zMF9EQVlTID0gJ2xhc3RfMzBfZGF5cycsXG4gICAgTEFTVF82MF9EQVlTID0gJ2xhc3RfNjBfZGF5cycsXG4gICAgTEFTVF85MF9EQVlTID0gJ2xhc3RfOTBfZGF5cycsXG4gICAgTEFTVF8xODBfREFZUyA9ICdsYXN0XzE4MF9kYXlzJyxcbiAgICBMQVNUXzM2NV9EQVlTID0gJ2xhc3RfMzY1X2RheXMnLFxuICB9XG5cbiAgZXhwb3J0IHR5cGUgUHJlc2V0ID0ge1xuICAgIGlkOiBQcmVzZXRUeXBlO1xuICAgIHRpdGxlOiBzdHJpbmc7XG4gICAgc3VidGl0bGU6IHN0cmluZztcbiAgICBkYXRlczogW0RhdGUsIERhdGVdO1xuICB9O1xuXG4gIGV4cG9ydCBjb25zdCBQcmVzZXRzOiBQcmVzZXRbXSA9IFtcbiAgICB7XG4gICAgICBpZDogUHJlc2V0VHlwZS5UT0RBWSxcbiAgICAgIHRpdGxlOiAnVG9kYXknLFxuICAgICAgc3VidGl0bGU6ICdUb2RheSBmcm9tIG1pZG5pZ2h0IHVudGlsIHRoZSBjdXJyZW50IHRpbWUnLFxuICAgICAgZGF0ZXM6IFt0aW1lRGF5KCksIHRpbWVEYXkoKV0sXG4gICAgfSxcbiAgICB7XG4gICAgICBpZDogUHJlc2V0VHlwZS5ZRVNURVJEQVksXG4gICAgICB0aXRsZTogJ1llc3RlcmRheScsXG4gICAgICBzdWJ0aXRsZTogJ1RoZSBwcmV2aW91cyAyNCBob3VyIGRheScsXG4gICAgICBkYXRlczogW3RpbWVEYXkub2Zmc2V0KHRpbWVEYXkoKSwgLTEpLCB0aW1lRGF5Lm9mZnNldCh0aW1lRGF5KCksIC0xKV0sXG4gICAgfSxcbiAgICB7XG4gICAgICBpZDogUHJlc2V0VHlwZS5UT01PUlJPVyxcbiAgICAgIHRpdGxlOiAnVG9tb3Jyb3cnLFxuICAgICAgc3VidGl0bGU6ICdUaGUgbmV4dCAyNCBob3VyIGRheScsXG4gICAgICBkYXRlczogW3RpbWVEYXkub2Zmc2V0KHRpbWVEYXkoKSwgMSksIHRpbWVEYXkub2Zmc2V0KHRpbWVEYXkoKSwgMSldLFxuICAgIH0sXG4gICAge1xuICAgICAgaWQ6IFByZXNldFR5cGUuVEhJU19XRUVLLFxuICAgICAgdGl0bGU6ICdUaGlzIHdlZWsnLFxuICAgICAgc3VidGl0bGU6ICdUaGUgY3VycmVudCBjYWxlbmRhciB3ZWVrJyxcbiAgICAgIGRhdGVzOiBbXG4gICAgICAgIHRpbWVTdW5kYXkuZmxvb3IodG9kYXkpLFxuICAgICAgICB0aW1lRGF5Lm9mZnNldCh0aW1lU3VuZGF5LmNlaWwodG9kYXkpLCAtMSksXG4gICAgICBdLFxuICAgIH0sXG4gICAge1xuICAgICAgaWQ6IFByZXNldFR5cGUuVEhJU19XRUVLX1NPX0ZBUixcbiAgICAgIHRpdGxlOiAnVGhpcyB3ZWVrIHNvIGZhcicsXG4gICAgICBzdWJ0aXRsZTogJ1RoZSBjdXJyZW50IGNhbGVuZGFyIHdlZWsgdXAgdG8gbm93JyxcbiAgICAgIGRhdGVzOiBbdGltZVN1bmRheS5mbG9vcih0b2RheSksIHRpbWVEYXkuZmxvb3IodG9kYXkpXSxcbiAgICB9LFxuICAgIHtcbiAgICAgIGlkOiBQcmVzZXRUeXBlLkxBU1RfV0VFSyxcbiAgICAgIHRpdGxlOiAnTGFzdCB3ZWVrJyxcbiAgICAgIHN1YnRpdGxlOiAnVGhlIHByZXZpb3VzIGNhbGVuZGFyIHdlZWsnLFxuICAgICAgZGF0ZXM6IFtcbiAgICAgICAgdGltZVN1bmRheS5vZmZzZXQodGltZVdlZWsuZmxvb3IodG9kYXkpLCAtMSksXG4gICAgICAgIHRpbWVEYXkub2Zmc2V0KHRpbWVTdW5kYXkub2Zmc2V0KHRpbWVXZWVrLmNlaWwodG9kYXkpLCAtMSksIC0xKSxcbiAgICAgIF0sXG4gICAgfSxcbiAgICB7XG4gICAgICBpZDogUHJlc2V0VHlwZS5ORVhUX1dFRUssXG4gICAgICB0aXRsZTogJ05leHQgd2VlaycsXG4gICAgICBzdWJ0aXRsZTogJ1RoZSBuZXh0IGNhbGVuZGFyIHdlZWsnLFxuICAgICAgZGF0ZXM6IFtcbiAgICAgICAgdGltZVN1bmRheS5vZmZzZXQodGltZVdlZWsuZmxvb3IodG9kYXkpLCAxKSxcbiAgICAgICAgdGltZURheS5vZmZzZXQodGltZVN1bmRheS5vZmZzZXQodGltZVdlZWsuY2VpbCh0b2RheSksIDEpLCAtMSksXG4gICAgICBdLFxuICAgIH0sXG4gICAge1xuICAgICAgaWQ6IFByZXNldFR5cGUuVEhJU19NT05USCxcbiAgICAgIHRpdGxlOiAnVGhpcyBtb250aCcsXG4gICAgICBzdWJ0aXRsZTogJ1RoZSBjdXJyZW50IGNhbGVuZGFyIG1vbnRoJyxcbiAgICAgIGRhdGVzOiBbXG4gICAgICAgIHRpbWVNb250aC5mbG9vcih0b2RheSksXG4gICAgICAgIHRpbWVEYXkub2Zmc2V0KHRpbWVNb250aC5jZWlsKHRvZGF5KSwgLTEpLFxuICAgICAgXSxcbiAgICB9LFxuICAgIHtcbiAgICAgIGlkOiBQcmVzZXRUeXBlLlRISVNfTU9OVEhfU09fRkFSLFxuICAgICAgdGl0bGU6ICdUaGlzIG1vbnRoIHNvIGZhcicsXG4gICAgICBzdWJ0aXRsZTogJ1RoZSBjdXJyZW50IGNhbGVuZGFyIG1vbnRoIHVwIHRvIG5vdycsXG4gICAgICBkYXRlczogW3RpbWVNb250aC5mbG9vcih0b2RheSksIHRpbWVEYXkuZmxvb3IodG9kYXkpXSxcbiAgICB9LFxuICAgIHtcbiAgICAgIGlkOiBQcmVzZXRUeXBlLkxBU1RfTU9OVEgsXG4gICAgICB0aXRsZTogJ0xhc3QgbW9udGgnLFxuICAgICAgc3VidGl0bGU6ICdUaGUgcHJldmlvdXMgY2FsZW5kYXIgbW9udGgnLFxuICAgICAgZGF0ZXM6IFtcbiAgICAgICAgdGltZU1vbnRoLm9mZnNldCh0aW1lTW9udGguZmxvb3IodG9kYXkpLCAtMSksXG4gICAgICAgIHRpbWVEYXkub2Zmc2V0KHRpbWVNb250aC5vZmZzZXQodGltZU1vbnRoLmNlaWwodG9kYXkpLCAtMSksIC0xKSxcbiAgICAgIF0sXG4gICAgfSxcbiAgICB7XG4gICAgICBpZDogUHJlc2V0VHlwZS5ORVhUX01PTlRILFxuICAgICAgdGl0bGU6ICdOZXh0IG1vbnRoJyxcbiAgICAgIHN1YnRpdGxlOiAnVGhlIG5leHQgY2FsZW5kYXIgbW9udGgnLFxuICAgICAgZGF0ZXM6IFtcbiAgICAgICAgdGltZU1vbnRoLm9mZnNldCh0aW1lTW9udGguZmxvb3IodG9kYXkpLCAxKSxcbiAgICAgICAgdGltZURheS5vZmZzZXQodGltZU1vbnRoLm9mZnNldCh0aW1lTW9udGguY2VpbCh0b2RheSksIDEpLCAtMSksXG4gICAgICBdLFxuICAgIH0sXG4gICAge1xuICAgICAgaWQ6IFByZXNldFR5cGUuVEhJU19RVUFSVEVSLFxuICAgICAgdGl0bGU6ICdUaGlzIHF1YXJ0ZXInLFxuICAgICAgc3VidGl0bGU6ICdUaGUgY3VycmVudCBxdWFydGVyJyxcbiAgICAgIGRhdGVzOiBbXG4gICAgICAgIHRpbWVRdWFydGVyLmZsb29yKHRvZGF5KSxcbiAgICAgICAgdGltZURheS5vZmZzZXQodGltZVF1YXJ0ZXIuY2VpbCh0b2RheSksIC0xKSxcbiAgICAgIF0sXG4gICAgfSxcbiAgICB7XG4gICAgICBpZDogUHJlc2V0VHlwZS5USElTX1FVQVJURVJfU09fRkFSLFxuICAgICAgdGl0bGU6ICdUaGlzIHF1YXJ0ZXIgc28gZmFyJyxcbiAgICAgIHN1YnRpdGxlOiAnVGhlIGN1cnJlbnQgcXVhcnRlciB1cCB0byBub3cnLFxuICAgICAgZGF0ZXM6IFt0aW1lUXVhcnRlci5mbG9vcih0b2RheSksIHRpbWVEYXkuZmxvb3IodG9kYXkpXSxcbiAgICB9LFxuICAgIHtcbiAgICAgIGlkOiBQcmVzZXRUeXBlLkxBU1RfUVVBUlRFUixcbiAgICAgIHRpdGxlOiAnTGFzdCBxdWFydGVyJyxcbiAgICAgIHN1YnRpdGxlOiAnVGhlIHByZXZpb3VzIGZ1bGwgcXVhcnRlcicsXG4gICAgICBkYXRlczogW1xuICAgICAgICB0aW1lUXVhcnRlci5vZmZzZXQodGltZVF1YXJ0ZXIuZmxvb3IodG9kYXkpLCAtMSksXG4gICAgICAgIHRpbWVEYXkub2Zmc2V0KHRpbWVRdWFydGVyLm9mZnNldCh0aW1lUXVhcnRlci5jZWlsKHRvZGF5KSwgLTEpLCAtMSksXG4gICAgICBdLFxuICAgIH0sXG4gICAge1xuICAgICAgaWQ6IFByZXNldFR5cGUuTkVYVF9RVUFSVEVSLFxuICAgICAgdGl0bGU6ICdOZXh0IHF1YXJ0ZXInLFxuICAgICAgc3VidGl0bGU6ICdUaGUgbmV4dCBmdWxsIHF1YXJ0ZXInLFxuICAgICAgZGF0ZXM6IFtcbiAgICAgICAgdGltZVF1YXJ0ZXIub2Zmc2V0KHRpbWVRdWFydGVyLmZsb29yKHRvZGF5KSwgMSksXG4gICAgICAgIHRpbWVEYXkub2Zmc2V0KHRpbWVRdWFydGVyLm9mZnNldCh0aW1lUXVhcnRlci5jZWlsKHRvZGF5KSwgMSksIC0xKSxcbiAgICAgIF0sXG4gICAgfSxcbiAgICB7XG4gICAgICBpZDogUHJlc2V0VHlwZS5USElTX1lFQVIsXG4gICAgICB0aXRsZTogJ1RoaXMgeWVhcicsXG4gICAgICBzdWJ0aXRsZTogJ1RoZSBjdXJyZW50IGNhbGVuZGFyIHllYXInLFxuICAgICAgZGF0ZXM6IFt0aW1lWWVhci5mbG9vcih0b2RheSksIHRpbWVEYXkub2Zmc2V0KHRpbWVZZWFyLmNlaWwodG9kYXkpLCAtMSldLFxuICAgIH0sXG4gICAge1xuICAgICAgaWQ6IFByZXNldFR5cGUuVEhJU19ZRUFSX1NPX0ZBUixcbiAgICAgIHRpdGxlOiAnVGhpcyB5ZWFyIHNvIGZhcicsXG4gICAgICBzdWJ0aXRsZTogJ1RoZSBjdXJyZW50IGNhbGVuZGFyIHllYXIgdXAgdG8gbm93JyxcbiAgICAgIGRhdGVzOiBbdGltZVllYXIuZmxvb3IodG9kYXkpLCB0aW1lRGF5LmZsb29yKHRvZGF5KV0sXG4gICAgfSxcbiAgICB7XG4gICAgICBpZDogUHJlc2V0VHlwZS5MQVNUX1lFQVIsXG4gICAgICB0aXRsZTogJ0xhc3QgeWVhcicsXG4gICAgICBzdWJ0aXRsZTogJ1RoZSBwcmV2aW91cyBjYWxlbmRhciB5ZWFyJyxcbiAgICAgIGRhdGVzOiBbXG4gICAgICAgIHRpbWVZZWFyLm9mZnNldCh0aW1lWWVhci5mbG9vcih0b2RheSksIC0xKSxcbiAgICAgICAgdGltZURheS5vZmZzZXQodGltZVllYXIub2Zmc2V0KHRpbWVZZWFyLmNlaWwodG9kYXkpLCAtMSksIC0xKSxcbiAgICAgIF0sXG4gICAgfSxcbiAgICB7XG4gICAgICBpZDogUHJlc2V0VHlwZS5ORVhUX1lFQVIsXG4gICAgICB0aXRsZTogJ05leHQgeWVhcicsXG4gICAgICBzdWJ0aXRsZTogJ1RoZSBuZXh0IGNhbGVuZGFyIHllYXInLFxuICAgICAgZGF0ZXM6IFtcbiAgICAgICAgdGltZVllYXIub2Zmc2V0KHRpbWVZZWFyLmZsb29yKHRvZGF5KSwgMSksXG4gICAgICAgIHRpbWVEYXkub2Zmc2V0KHRpbWVZZWFyLm9mZnNldCh0aW1lWWVhci5jZWlsKHRvZGF5KSwgMSksIC0xKSxcbiAgICAgIF0sXG4gICAgfSxcbiAgICB7XG4gICAgICBpZDogUHJlc2V0VHlwZS5MQVNUXzdfREFZUyxcbiAgICAgIHRpdGxlOiAnTGFzdCA3IGRheXMnLFxuICAgICAgc3VidGl0bGU6ICdUaGUgcHJldmlvdXMgNyBkYXlzIGJlZm9yZSB0b2RheScsXG4gICAgICBkYXRlczogW1xuICAgICAgICB0aW1lRGF5LmZsb29yKHRpbWVEYXkub2Zmc2V0KHRvZGF5LCAtOCkpLFxuICAgICAgICB0aW1lRGF5LmZsb29yKHRpbWVEYXkub2Zmc2V0KHRvZGF5LCAtMSkpLFxuICAgICAgXSxcbiAgICB9LFxuICAgIHtcbiAgICAgIGlkOiBQcmVzZXRUeXBlLkxBU1RfMTRfREFZUyxcbiAgICAgIHRpdGxlOiAnTGFzdCAxNCBkYXlzJyxcbiAgICAgIHN1YnRpdGxlOiAnVGhlIHByZXZpb3VzIDE0IGRheXMgYmVmb3JlIHRvZGF5JyxcbiAgICAgIGRhdGVzOiBbXG4gICAgICAgIHRpbWVEYXkuZmxvb3IodGltZURheS5vZmZzZXQodG9kYXksIC0xNSkpLFxuICAgICAgICB0aW1lRGF5LmZsb29yKHRpbWVEYXkub2Zmc2V0KHRvZGF5LCAtMSkpLFxuICAgICAgXSxcbiAgICB9LFxuICAgIHtcbiAgICAgIGlkOiBQcmVzZXRUeXBlLkxBU1RfMzBfREFZUyxcbiAgICAgIHRpdGxlOiAnTGFzdCAzMCBkYXlzJyxcbiAgICAgIHN1YnRpdGxlOiAnVGhlIHByZXZpb3VzIDMwIGRheXMgYmVmb3JlIHRvZGF5JyxcbiAgICAgIGRhdGVzOiBbXG4gICAgICAgIHRpbWVEYXkuZmxvb3IodGltZURheS5vZmZzZXQodG9kYXksIC0zMSkpLFxuICAgICAgICB0aW1lRGF5LmZsb29yKHRpbWVEYXkub2Zmc2V0KHRvZGF5LCAtMSkpLFxuICAgICAgXSxcbiAgICB9LFxuICAgIHtcbiAgICAgIGlkOiBQcmVzZXRUeXBlLkxBU1RfNjBfREFZUyxcbiAgICAgIHRpdGxlOiAnTGFzdCA2MCBkYXlzJyxcbiAgICAgIHN1YnRpdGxlOiAnVGhlIHByZXZpb3VzIDYwIGRheXMgYmVmb3JlIHRvZGF5JyxcbiAgICAgIGRhdGVzOiBbXG4gICAgICAgIHRpbWVEYXkuZmxvb3IodGltZURheS5vZmZzZXQodG9kYXksIC02MSkpLFxuICAgICAgICB0aW1lRGF5LmZsb29yKHRpbWVEYXkub2Zmc2V0KHRvZGF5LCAtMSkpLFxuICAgICAgXSxcbiAgICB9LFxuICAgIHtcbiAgICAgIGlkOiBQcmVzZXRUeXBlLkxBU1RfOTBfREFZUyxcbiAgICAgIHRpdGxlOiAnTGFzdCA5MCBkYXlzJyxcbiAgICAgIHN1YnRpdGxlOiAnVGhlIHByZXZpb3VzIDkwIGRheXMgYmVmb3JlIHRvZGF5JyxcbiAgICAgIGRhdGVzOiBbXG4gICAgICAgIHRpbWVEYXkuZmxvb3IodGltZURheS5vZmZzZXQodG9kYXksIC05MSkpLFxuICAgICAgICB0aW1lRGF5LmZsb29yKHRpbWVEYXkub2Zmc2V0KHRvZGF5LCAtMSkpLFxuICAgICAgXSxcbiAgICB9LFxuICAgIHtcbiAgICAgIGlkOiBQcmVzZXRUeXBlLkxBU1RfMTgwX0RBWVMsXG4gICAgICB0aXRsZTogJ0xhc3QgMTgwIGRheXMnLFxuICAgICAgc3VidGl0bGU6ICdUaGUgcHJldmlvdXMgMTgwIGRheXMgYmVmb3JlIHRvZGF5JyxcbiAgICAgIGRhdGVzOiBbXG4gICAgICAgIHRpbWVEYXkuZmxvb3IodGltZURheS5vZmZzZXQodG9kYXksIC0xODEpKSxcbiAgICAgICAgdGltZURheS5mbG9vcih0aW1lRGF5Lm9mZnNldCh0b2RheSwgLTEpKSxcbiAgICAgIF0sXG4gICAgfSxcbiAgICB7XG4gICAgICBpZDogUHJlc2V0VHlwZS5MQVNUXzM2NV9EQVlTLFxuICAgICAgdGl0bGU6ICdMYXN0IDM2NSBkYXlzJyxcbiAgICAgIHN1YnRpdGxlOiAnVGhlIHByZXZpb3VzIDM2NSBkYXlzIGJlZm9yZSB0b2RheScsXG4gICAgICBkYXRlczogW1xuICAgICAgICB0aW1lRGF5LmZsb29yKHRpbWVEYXkub2Zmc2V0KHRvZGF5LCAtMzY2KSksXG4gICAgICAgIHRpbWVEYXkuZmxvb3IodGltZURheS5vZmZzZXQodG9kYXksIC0xKSksXG4gICAgICBdLFxuICAgIH0sXG4gIF07XG59XG4iLCI8bmctY29udGFpbmVyICpuZ0lmPVwidHJpZ2dlclRlbXBsYXRlOyBlbHNlIHN0YW5kYXJkVHJpZ2dlclwiPlxuICA8YnV0dG9uXG4gICAgI2N1c3RvbVRyaWdnZXJCdXR0b25cbiAgICAoY2xpY2spPVwib3BlbiQubmV4dCh0cnVlKVwiXG4gICAgW2Rpc2FibGVkXT1cImRpc2FibGVkJCB8IGFzeW5jXCJcbiAgICBbYXR0ci5hcmlhLWRpc2FibGVkXT1cIihkaXNhYmxlZCQgfCBhc3luYykgPyAndHJ1ZScgOiBudWxsXCJcbiAgICB0eXBlPVwiYnV0dG9uXCJcbiAgPlxuICAgIDxuZy1jb250YWluZXJcbiAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInRyaWdnZXJUZW1wbGF0ZVwiXG4gICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyBvcGVuOiBvcGVuJCB8IGFzeW5jIH1cIlxuICAgID48L25nLWNvbnRhaW5lcj5cbiAgPC9idXR0b24+XG48L25nLWNvbnRhaW5lcj5cbjxuZy10ZW1wbGF0ZSAjc3RhbmRhcmRUcmlnZ2VyPlxuICA8cml2LWlucHV0LWxhYmVsXG4gICAgW2xhYmVsXT1cImxhYmVsXCJcbiAgICBbaGVscF09XCJoZWxwXCJcbiAgICBbcmVxdWlyZWRdPVwicmVxdWlyZWRcIlxuICAgIFtzdGF0ZV09XCJzdGF0ZVwiXG4gICAgW2Vycm9yTWVzc2FnZV09XCJlcnJvck1lc3NhZ2VcIlxuICAgIFtsYWJlbEFjdGlvblRleHRdPVwibGFiZWxBY3Rpb25UZXh0XCJcbiAgICAobGFiZWxBY3Rpb24pPVwibGFiZWxBY3Rpb24uZW1pdCgkZXZlbnQpXCJcbiAgPlxuICAgIDxidXR0b25cbiAgICAgICNzdGFuZGFyZFRyaWdnZXJCdXR0b25cbiAgICAgIGNsYXNzPVwidHJpZ2dlclwiXG4gICAgICBbY2xhc3Mud2FybmluZ109XCJzdGF0ZSA9PT0gJ3dhcm5pbmcnXCJcbiAgICAgIFtjbGFzcy5lcnJvcl09XCJzdGF0ZSA9PT0gJ2Vycm9yJ1wiXG4gICAgICAoY2xpY2spPVwib3BlbiQubmV4dCh0cnVlKVwiXG4gICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWQkIHwgYXN5bmNcIlxuICAgICAgW2F0dHIuYXJpYS1kaXNhYmxlZF09XCIoZGlzYWJsZWQkIHwgYXN5bmMpID8gJ3RydWUnIDogbnVsbFwiXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICA+XG4gICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICpuZ0lmPVwiZGlzcGxheVZhbHVlJCB8IGFzeW5jOyBlbHNlIHBsYWNlaG9sZGVyVmFsdWU7IGxldCBkaXNwbGF5XCJcbiAgICAgID5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJ2YWx1ZVwiPnt7IGRpc3BsYXkgfX08L3NwYW4+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDxuZy10ZW1wbGF0ZSAjcGxhY2Vob2xkZXJWYWx1ZT5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJ2YWx1ZSBwbGFjZWhvbGRlclwiPnt7IHBsYWNlaG9sZGVyJCB8IGFzeW5jIH19PC9zcGFuPlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgIDxzcGFuIGNsYXNzPVwiY2hldnJvblwiPlxuICAgICAgICA8cml2LWljb24gW25hbWVdPVwiJ0NhbGVuZGFyJ1wiIFtzaXplXT1cIjE2XCI+PC9yaXYtaWNvbj5cbiAgICAgIDwvc3Bhbj5cbiAgICA8L2J1dHRvbj5cbiAgPC9yaXYtaW5wdXQtbGFiZWw+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGVcbiAgI3NlbGZcbiAgW25nVGVtcGxhdGVPdXRsZXRdPVwic2VsZlwiXG4gIGxldC1pbnB1dFZhbHVlXG4gIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7ICRpbXBsaWNpdDogKGRpc3RpbmN0VmFsdWUkIHwgYXN5bmMpIH1cIlxuPlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwib3BlbiQgfCBhc3luY1wiPlxuICAgIDxyaXYtY2FsbG91dFxuICAgICAgKnJpdi1vdmVybGF5XG4gICAgICBbYW5jaG9yXT1cImdldFRyaWdnZXIoKVwiXG4gICAgICBbc2hvd0NhcmV0XT1cImZhbHNlXCJcbiAgICAgIFt0aGVtZV09XCInbGlnaHQnXCJcbiAgICAgIFthbGxvd2VkUG9zaXRpb25zXT1cIltcbiAgICAgICAgJ3RvcC1sZWZ0JyxcbiAgICAgICAgJ3RvcC1yaWdodCcsXG4gICAgICAgICdib3R0b20tcmlnaHQnLFxuICAgICAgICAnYm90dG9tLWxlZnQnXG4gICAgICBdXCJcbiAgICAgIFtwcmVmZXJyZWRQb3NpdGlvbl09XCInYm90dG9tLXJpZ2h0J1wiXG4gICAgICAoY2xvc2UpPVwib3BlbiQubmV4dChmYWxzZSk7IHVzZXJTZWxlY3RlZERhdGUkLm5leHQoaW5wdXRWYWx1ZSlcIlxuICAgID5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb250ZW50XCIgW2NsYXNzLmluY2x1ZGUtcHJlc2V0XT1cInNob3dQcmVzZXRzXCI+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJzaG93UHJlc2V0c1wiIGNsYXNzPVwicHJlc2V0c1wiPlxuICAgICAgICAgIDxyaXYtc2ltcGxlLXNlbGVjdFxuICAgICAgICAgICAgW2xhYmVsXT1cIidEYXRlIHByZXNldHMnXCJcbiAgICAgICAgICAgIFtmaWx0ZXJhYmlsaXR5T3B0aW9uc109XCJ7IGVuYWJsZWQ6IHRydWUsIHBsYWNlaG9sZGVyOiAnU2VhcmNoJyB9XCJcbiAgICAgICAgICAgIFtvcmRlckJ5XT1cIidzb3VyY2UnXCJcbiAgICAgICAgICAgIFtvcHRpb25Hcm91cHNdPVwiXG4gICAgICAgICAgICAgIChmaWx0ZXJlZFByZXNldE9wdGlvbnMkIHwgYXN5bmMpID8/IFtdIHwgcml2T3B0aW9uR3JvdXBcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgICBbc2VsZWN0ZWRPcHRpb25dPVwic2VsZWN0ZWRQcmVzZXQkIHwgYXN5bmNcIlxuICAgICAgICAgICAgKHNlbGVjdGVkT3B0aW9uQ2hhbmdlKT1cInVzZXJTZWxlY3RlZFByZXNldCQubmV4dCgkZXZlbnQpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI29wdGlvbiBsZXQtbm9kZT1cIm5vZGVcIj5cbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgICAgICAgI3NlbGZcbiAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJzZWxmXCJcbiAgICAgICAgICAgICAgICBsZXQtaXNGYXZvcml0ZVxuICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7XG4gICAgICAgICAgICAgICAgICAkaW1wbGljaXQ6IChmYXZvcml0ZVByZXNldElkcyQgfCBhc3luYyk/LmluY2x1ZGVzKG5vZGUuaWQpXG4gICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJlc2V0XCIgW2NsYXNzLmZhdm9yaXRlXT1cImlzRmF2b3JpdGVcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXNjcmlwdGlvblwiPlxuICAgICAgICAgICAgICAgICAgICA8cml2LWhpZ2hsaWdodFxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidGl0bGVcIlxuICAgICAgICAgICAgICAgICAgICAgIFt0ZXh0XT1cIm5vZGUudGl0bGVcIlxuICAgICAgICAgICAgICAgICAgICAgIFtpbmRpY2VzXT1cIm5vZGUudGl0bGVIaWdobGlnaHRJbmRpY2VzIHx8IFtdXCJcbiAgICAgICAgICAgICAgICAgICAgPjwvcml2LWhpZ2hsaWdodD5cbiAgICAgICAgICAgICAgICAgICAgPHJpdi1oaWdobGlnaHRcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInN1YnRpdGxlXCJcbiAgICAgICAgICAgICAgICAgICAgICBbdGV4dF09XCJub2RlLnN1YnRpdGxlXCJcbiAgICAgICAgICAgICAgICAgICAgICBbaW5kaWNlc109XCJub2RlLnN1YnRpdGxlSGlnaGxpZ2h0SW5kaWNlcyB8fCBbXVwiXG4gICAgICAgICAgICAgICAgICAgID48L3Jpdi1oaWdobGlnaHQ+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIlxuICAgICAgICAgICAgICAgICAgICAgIHNldEZhdm9yaXRlKG5vZGUsICFpc0Zhdm9yaXRlKTsgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXG4gICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8cml2LWljb25cbiAgICAgICAgICAgICAgICAgICAgICBbbmFtZV09XCJpc0Zhdm9yaXRlID8gJ0hlYXJ0QWN0aXZlJyA6ICdIZWFydCdcIlxuICAgICAgICAgICAgICAgICAgICAgIFtzaXplXT1cIjE2XCJcbiAgICAgICAgICAgICAgICAgICAgICBbcml2VG9vbHRpcF09XCInTWFyayBhcyBmYXZvcml0ZSdcIlxuICAgICAgICAgICAgICAgICAgICA+PC9yaXYtaWNvbj5cbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICA8L3Jpdi1zaW1wbGUtc2VsZWN0PlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICAgI3NlbGZcbiAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInNlbGZcIlxuICAgICAgICAgICAgbGV0LWZhdm9yaXRlc1xuICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgJGltcGxpY2l0OiBmYXZvcml0ZVByZXNldHMkIHwgYXN5bmMgfVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHJpdi1pbnB1dC1sYWJlbCAqbmdJZj1cImZhdm9yaXRlcy5sZW5ndGhcIiBbbGFiZWxdPVwiJ0Zhdm9yaXRlcydcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNob3J0Y3V0c1wiPlxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBmYXZvcml0ZSBvZiBmYXZvcml0ZXNcIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzaG9ydGN1dFwiXG4gICAgICAgICAgICAgICAgICBbY2xhc3MuYWN0aXZlXT1cIihzZWxlY3RlZFByZXNldCQgfCBhc3luYyk/LmlkID09PSBmYXZvcml0ZS5pZFwiXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwidXNlclNlbGVjdGVkUHJlc2V0JC5uZXh0KGZhdm9yaXRlKVwiXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRpdGxlXCI+e3sgZmF2b3JpdGUudGl0bGUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZXRGYXZvcml0ZShmYXZvcml0ZSwgZmFsc2UpXCJcbiAgICAgICAgICAgICAgICAgICAgW3JpdlRvb2x0aXBdPVwiJ1JlbW92ZSBmYXZvcml0ZSdcIlxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPHJpdi1pY29uIFtuYW1lXT1cIidIZWFydEFjdGl2ZSdcIiBbc2l6ZV09XCIxNlwiPjwvcml2LWljb24+XG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L3Jpdi1pbnB1dC1sYWJlbD5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FsZW5kYXJzXCI+XG4gICAgICAgICAgPHJpdi1jYWxlbmRhclxuICAgICAgICAgICAgY2xhc3M9XCJsZWZ0XCJcbiAgICAgICAgICAgIFthY3RpdmVZZWFyTW9udGhdPVwiKGxlZnRBY3RpdmVZZWFyTW9udGgkIHwgYXN5bmMpIHx8IFRPREFZXCJcbiAgICAgICAgICAgIChhY3RpdmVZZWFyTW9udGhDaGFuZ2UpPVwidXNlckxlZnRBY3RpdmVZZWFyTW9udGgkLm5leHQoJGV2ZW50KVwiXG4gICAgICAgICAgICBbZGlzcGxheU1pbl09XCIobWluJCB8IGFzeW5jKSB8fCBUT0RBWVwiXG4gICAgICAgICAgICBbZGlzcGxheU1heF09XCIobWF4JCB8IGFzeW5jKSB8fCBUT0RBWVwiXG4gICAgICAgICAgICBbc2VsZWN0YWJsZU1pbl09XCIobGVmdE1pbiQgfCBhc3luYykgfHwgVE9EQVlcIlxuICAgICAgICAgICAgW3NlbGVjdGFibGVNYXhdPVwiKGxlZnRNYXgkIHwgYXN5bmMpIHx8IFRPREFZXCJcbiAgICAgICAgICAgIFtvbWl0UmFuZ2VdPVwiKGxlZnRPbWl0UmFuZ2UkIHwgYXN5bmMpIHx8IFtUT0RBWSwgVE9EQVldXCJcbiAgICAgICAgICAgIFtzZWxlY3RlZFZhbHVlXT1cIihzZWxlY3RlZFZhbHVlJCB8IGFzeW5jKSB8fCBUT0RBWVwiXG4gICAgICAgICAgICAoZGF0ZVNlbGVjdCk9XCJ1c2VyU2VsZWN0ZWREYXRlJC5uZXh0KCRldmVudClcIlxuICAgICAgICAgID48L3Jpdi1jYWxlbmRhcj5cbiAgICAgICAgICA8cml2LWNhbGVuZGFyXG4gICAgICAgICAgICBjbGFzcz1cInJpZ2h0XCJcbiAgICAgICAgICAgIFthY3RpdmVZZWFyTW9udGhdPVwiKHJpZ2h0QWN0aXZlWWVhck1vbnRoJCB8IGFzeW5jKSB8fCBUT0RBWVwiXG4gICAgICAgICAgICAoYWN0aXZlWWVhck1vbnRoQ2hhbmdlKT1cInVzZXJSaWdodEFjdGl2ZVllYXJNb250aCQubmV4dCgkZXZlbnQpXCJcbiAgICAgICAgICAgIFtkaXNwbGF5TWluXT1cIihtaW4kIHwgYXN5bmMpIHx8IFRPREFZXCJcbiAgICAgICAgICAgIFtkaXNwbGF5TWF4XT1cIihtYXgkIHwgYXN5bmMpIHx8IFRPREFZXCJcbiAgICAgICAgICAgIFtzZWxlY3RhYmxlTWluXT1cIihyaWdodE1pbiQgfCBhc3luYykgfHwgVE9EQVlcIlxuICAgICAgICAgICAgW3NlbGVjdGFibGVNYXhdPVwiKHJpZ2h0TWF4JCB8IGFzeW5jKSB8fCBUT0RBWVwiXG4gICAgICAgICAgICBbc2VsZWN0ZWRWYWx1ZV09XCIoc2VsZWN0ZWRWYWx1ZSQgfCBhc3luYykgfHwgVE9EQVlcIlxuICAgICAgICAgICAgKGRhdGVTZWxlY3QpPVwidXNlclNlbGVjdGVkRGF0ZSQubmV4dCgkZXZlbnQpXCJcbiAgICAgICAgICA+PC9yaXYtY2FsZW5kYXI+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxmb290ZXIgY2xhc3M9XCJidXR0b25zXCI+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgcml2QnV0dG9uXG4gICAgICAgICAgICBbc2l6ZV09XCInc21hbGwnXCJcbiAgICAgICAgICAgIFt2YXJpYW50XT1cIidnaG9zdCdcIlxuICAgICAgICAgICAgKGNsaWNrKT1cInVzZXJTZWxlY3RlZERhdGUkLm5leHQodW5kZWZpbmVkKVwiXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICBDbGVhclxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIHJpdkJ1dHRvblxuICAgICAgICAgICAgW3NpemVdPVwiJ3NtYWxsJ1wiXG4gICAgICAgICAgICBbdmFyaWFudF09XCIncHJpbWFyeSdcIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm9wZW4kLm5leHQoZmFsc2UpXCJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIERvbmVcbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9mb290ZXI+XG4gICAgICA8L2Rpdj5cbiAgICA8L3Jpdi1jYWxsb3V0PlxuICA8L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=