@elderbyte/ngx-starter 18.12.2 → 18.12.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (319) hide show
  1. package/esm2022/lib/common/enums/elder-enum-translation.service.mjs +3 -3
  2. package/esm2022/lib/common/forms/elder-form-field-control-base.directive.mjs +3 -3
  3. package/esm2022/lib/common/forms/elder-from-field-base.mjs +3 -3
  4. package/esm2022/lib/common/forms/elder-from-field-customizable-base.mjs +3 -3
  5. package/esm2022/lib/common/forms/elder-from-field-entity-base.mjs +3 -3
  6. package/esm2022/lib/common/forms/elder-from-field-multi-entity-base.mjs +3 -3
  7. package/esm2022/lib/common/forms/form-field-base.component.mjs +3 -3
  8. package/esm2022/lib/common/forms/multi-model-base.component.mjs +3 -3
  9. package/esm2022/lib/common/forms/template-composite-control.mjs +3 -3
  10. package/esm2022/lib/common/forms/value-accessor-base.mjs +3 -3
  11. package/esm2022/lib/common/http/http-client-builder.service.mjs +3 -3
  12. package/esm2022/lib/common/http/http-client-pristine.mjs +3 -3
  13. package/esm2022/lib/common/http/transfer/data-transfer-factory.mjs +3 -3
  14. package/esm2022/lib/common/time/temporal-util.mjs +13 -1
  15. package/esm2022/lib/common/url/elder-router.service.mjs +3 -3
  16. package/esm2022/lib/common/url/elder-url-fragment-params.service.mjs +3 -3
  17. package/esm2022/lib/components/access-denied/elder-access-denied.component.mjs +3 -3
  18. package/esm2022/lib/components/access-denied/elder-access-denied.module.mjs +4 -4
  19. package/esm2022/lib/components/auditing/audited-entity/elder-audited-entity.component.mjs +3 -3
  20. package/esm2022/lib/components/auditing/elder-audit.module.mjs +4 -4
  21. package/esm2022/lib/components/badge/elder-badge/elder-badge.component.mjs +9 -9
  22. package/esm2022/lib/components/badge/elder-badge.directive.mjs +3 -3
  23. package/esm2022/lib/components/badge/elder-badge.module.mjs +4 -4
  24. package/esm2022/lib/components/button-group/elder-button-group/elder-button-group.component.mjs +3 -3
  25. package/esm2022/lib/components/button-group/elder-button-group.module.mjs +4 -4
  26. package/esm2022/lib/components/card-organizer/card-organizer/elder-card-organizer.component.mjs +3 -3
  27. package/esm2022/lib/components/card-organizer/card-organizer/elder-stack-card.directive.mjs +3 -3
  28. package/esm2022/lib/components/card-organizer/card-stack/elder-card-stack.component.mjs +3 -3
  29. package/esm2022/lib/components/card-organizer/elder-card-organizer.module.mjs +4 -4
  30. package/esm2022/lib/components/cards/elder-card/elder-card-header/elder-card-header.component.mjs +3 -3
  31. package/esm2022/lib/components/cards/elder-card/elder-card.component.mjs +18 -18
  32. package/esm2022/lib/components/cards/elder-card/elder-card.module.mjs +4 -4
  33. package/esm2022/lib/components/chips/elder-chip-label.directive.mjs +3 -3
  34. package/esm2022/lib/components/chips/elder-chips.module.mjs +4 -4
  35. package/esm2022/lib/components/connectivity/elder-connectivity.module.mjs +4 -4
  36. package/esm2022/lib/components/connectivity/elder-connectivity.service.mjs +3 -3
  37. package/esm2022/lib/components/connectivity/offline-indicator/elder-offline-indicator.component.mjs +3 -3
  38. package/esm2022/lib/components/containers/elder-containers.module.mjs +4 -4
  39. package/esm2022/lib/components/containers/elder-scroll-container/elder-scroll-container.component.mjs +3 -3
  40. package/esm2022/lib/components/csv/elder-csv-export-btn/elder-csv-export-btn.component.mjs +3 -3
  41. package/esm2022/lib/components/csv/elder-csv-stream-exporter-builder.service.mjs +3 -3
  42. package/esm2022/lib/components/csv/elder-csv.module.mjs +4 -4
  43. package/esm2022/lib/components/currency/elder-currency.module.mjs +4 -4
  44. package/esm2022/lib/components/currency/elder-currency.pipe.mjs +3 -3
  45. package/esm2022/lib/components/data-transfer/elder-data-transfer.module.mjs +4 -4
  46. package/esm2022/lib/components/data-transfer/elder-data-transfer.service.mjs +3 -3
  47. package/esm2022/lib/components/data-transfer/http-data-transfer/http-data-transfer.component.mjs +3 -3
  48. package/esm2022/lib/components/data-transfer/http-data-transfer-aggregate/http-data-transfer-aggregate.component.mjs +3 -3
  49. package/esm2022/lib/components/data-transfer/http-data-transfer-indicator/http-data-transfer-indicator.component.mjs +3 -3
  50. package/esm2022/lib/components/data-transfer/http-data-transfer-overview/http-data-transfer-overview.component.mjs +3 -3
  51. package/esm2022/lib/components/data-view/base/elder-data-view-base.mjs +3 -3
  52. package/esm2022/lib/components/data-view/common/composite-sort/composite-sort-dc.directive.mjs +3 -3
  53. package/esm2022/lib/components/data-view/common/composite-sort/elder-composite-sort/elder-composite-sort.component.mjs +3 -3
  54. package/esm2022/lib/components/data-view/common/data-context-state-indicator/data-context-state-indicator.component.mjs +3 -3
  55. package/esm2022/lib/components/data-view/common/elder-data-common.module.mjs +4 -4
  56. package/esm2022/lib/components/data-view/common/elder-data-toolbar/elder-data-toolbar.component.mjs +6 -6
  57. package/esm2022/lib/components/data-view/common/elder-single-sort/elder-single-sort.component.mjs +3 -3
  58. package/esm2022/lib/components/data-view/common/selection/data-context-selection.directive.mjs +3 -3
  59. package/esm2022/lib/components/data-view/common/selection/elder-selection-master-checkbox/elder-selection-master-checkbox.component.mjs +3 -3
  60. package/esm2022/lib/components/data-view/grid/elder-grid/elder-grid.component.mjs +9 -9
  61. package/esm2022/lib/components/data-view/grid/elder-grid.module.mjs +4 -4
  62. package/esm2022/lib/components/data-view/master-detail/elder-detail-dialog/elder-detail-dialog.component.mjs +3 -3
  63. package/esm2022/lib/components/data-view/master-detail/elder-detail.directive.mjs +3 -3
  64. package/esm2022/lib/components/data-view/master-detail/elder-master-activation.directive.mjs +3 -3
  65. package/esm2022/lib/components/data-view/master-detail/elder-master-detail.component.mjs +3 -3
  66. package/esm2022/lib/components/data-view/master-detail/elder-master-detail.module.mjs +4 -4
  67. package/esm2022/lib/components/data-view/master-detail/elder-master-detail.service.mjs +3 -3
  68. package/esm2022/lib/components/data-view/master-detail/elder-master.directive.mjs +3 -3
  69. package/esm2022/lib/components/data-view/simple/elder-simple-selection-view/elder-simple-selection-view.component.mjs +3 -3
  70. package/esm2022/lib/components/data-view/simple/elder-simple-selection-view/elder-simple-selection-view.module.mjs +4 -4
  71. package/esm2022/lib/components/data-view/table/activation/elder-delete-active.directive.mjs +3 -3
  72. package/esm2022/lib/components/data-view/table/activation/elder-table-activation.directive.mjs +3 -3
  73. package/esm2022/lib/components/data-view/table/elder-center-cell.directive.mjs +3 -3
  74. package/esm2022/lib/components/data-view/table/elder-number-cell.directive.mjs +3 -3
  75. package/esm2022/lib/components/data-view/table/elder-paginator-intl.mjs +3 -3
  76. package/esm2022/lib/components/data-view/table/elder-table/elder-table-toolbar.directive.mjs +3 -3
  77. package/esm2022/lib/components/data-view/table/elder-table/elder-table.component.mjs +3 -3
  78. package/esm2022/lib/components/data-view/table/elder-table-column.directive.mjs +3 -3
  79. package/esm2022/lib/components/data-view/table/elder-table-extension.directive.mjs +3 -3
  80. package/esm2022/lib/components/data-view/table/elder-table-root.directive.mjs +3 -3
  81. package/esm2022/lib/components/data-view/table/elder-table-row.directive.mjs +3 -3
  82. package/esm2022/lib/components/data-view/table/elder-table-sort.directive.mjs +3 -3
  83. package/esm2022/lib/components/data-view/table/elder-table.module.mjs +4 -4
  84. package/esm2022/lib/components/data-view/table/model/elder-table-model.mjs +3 -3
  85. package/esm2022/lib/components/dialogs/confirm-dialog/elder-confirm-dialog.component.mjs +3 -3
  86. package/esm2022/lib/components/dialogs/elder-dialog.module.mjs +4 -4
  87. package/esm2022/lib/components/dialogs/elder-dialog.service.mjs +3 -3
  88. package/esm2022/lib/components/dialogs/question-dialog/elder-question-dialog.component.mjs +3 -3
  89. package/esm2022/lib/components/dialogs/selection-dialog/elder-selection-dialog/elder-selection-dialog.component.mjs +3 -3
  90. package/esm2022/lib/components/dialogs/selection-dialog/elder-selection-dialog.directive.mjs +3 -3
  91. package/esm2022/lib/components/errors/elder-error.module.mjs +4 -4
  92. package/esm2022/lib/components/errors/exception-detail/elder-exception-detail.component.mjs +3 -3
  93. package/esm2022/lib/components/expand-toggle-button/elder-expand-toggle-button.component.mjs +3 -3
  94. package/esm2022/lib/components/expand-toggle-button/elder-expand-toggle-button.module.mjs +4 -4
  95. package/esm2022/lib/components/files/blob-viewer/elder-blob-viewer.component.mjs +3 -3
  96. package/esm2022/lib/components/files/drag-n-drop/elder-drop-zone/elder-drop-zone.component.mjs +3 -3
  97. package/esm2022/lib/components/files/drag-n-drop/global-drag-drop.service.mjs +3 -3
  98. package/esm2022/lib/components/files/elder-file-drop-zone.directive.mjs +3 -3
  99. package/esm2022/lib/components/files/elder-file-select.directive.mjs +3 -3
  100. package/esm2022/lib/components/files/elder-file.module.mjs +4 -4
  101. package/esm2022/lib/components/files/file-select/file-select.component.mjs +3 -3
  102. package/esm2022/lib/components/files/file-upload/file-upload.component.mjs +3 -3
  103. package/esm2022/lib/components/forms/clipboard/elder-clipboard.service.mjs +3 -3
  104. package/esm2022/lib/components/forms/directives/base/elder-class-hostbinding-base.mjs +3 -3
  105. package/esm2022/lib/components/forms/directives/elder-clipboard-put.directive.mjs +3 -3
  106. package/esm2022/lib/components/forms/directives/elder-delayed-focus.directive.mjs +3 -3
  107. package/esm2022/lib/components/forms/directives/elder-form-field-dense.directive.mjs +3 -3
  108. package/esm2022/lib/components/forms/directives/elder-form-field-label.directive.mjs +3 -3
  109. package/esm2022/lib/components/forms/directives/elder-form-field-no-hint.directive.mjs +3 -3
  110. package/esm2022/lib/components/forms/directives/elder-form-field-no-spinner.directive.mjs +3 -3
  111. package/esm2022/lib/components/forms/directives/elder-forms-directives.module.mjs +4 -4
  112. package/esm2022/lib/components/forms/directives/elder-initial-value.directive.mjs +3 -3
  113. package/esm2022/lib/components/forms/directives/elder-input-pattern.directive.mjs +3 -3
  114. package/esm2022/lib/components/forms/directives/elder-key-event.directive.mjs +3 -3
  115. package/esm2022/lib/components/forms/directives/elder-next-focusable.directive.mjs +3 -3
  116. package/esm2022/lib/components/forms/directives/elder-plug-parent-form.directive.mjs +3 -3
  117. package/esm2022/lib/components/forms/directives/elder-stop-event-propagation.directive.mjs +3 -3
  118. package/esm2022/lib/components/forms/directives/elder-tab-focus-trap.directive.mjs +3 -3
  119. package/esm2022/lib/components/forms/directives/elder-touched.directive.mjs +3 -3
  120. package/esm2022/lib/components/forms/directives/elder-triple-state-checkbox.directive.mjs +3 -3
  121. package/esm2022/lib/components/forms/directives/validation/elder-validation-error.directive.mjs +3 -3
  122. package/esm2022/lib/components/forms/directives/validation/strategies/common-validation-message-strategy.mjs +3 -3
  123. package/esm2022/lib/components/forms/directives/validation/strategies/dynamic-validation-message-strategy.mjs +3 -3
  124. package/esm2022/lib/components/forms/directives/validation/validation-message-renderer.service.mjs +3 -3
  125. package/esm2022/lib/components/forms/directives/validation/validators/elder-max.validator.mjs +3 -3
  126. package/esm2022/lib/components/forms/directives/validation/validators/elder-min.validator.mjs +3 -3
  127. package/esm2022/lib/components/forms/directives/validation/validators/elder-multiple-of.validator.mjs +3 -3
  128. package/esm2022/lib/components/forms/directives/validation/validators/elder-required-ignore-zero.validator.mjs +3 -3
  129. package/esm2022/lib/components/forms/elder-forms.module.mjs +4 -4
  130. package/esm2022/lib/components/forms/search/domain/context/search-context.service.mjs +3 -3
  131. package/esm2022/lib/components/forms/search/domain/url/elder-search-url.directive.mjs +3 -3
  132. package/esm2022/lib/components/forms/search/domain/url/elder-search-url.service.mjs +3 -3
  133. package/esm2022/lib/components/forms/search/elder-search-context.directive.mjs +3 -3
  134. package/esm2022/lib/components/forms/search/elder-search-input.directive.mjs +3 -3
  135. package/esm2022/lib/components/forms/search/elder-search.module.mjs +4 -4
  136. package/esm2022/lib/components/forms/search/search-box/elder-search-box.component.mjs +3 -3
  137. package/esm2022/lib/components/forms/search/search-box/elder-search-panel.component.mjs +3 -3
  138. package/esm2022/lib/components/global-search/elder-global-search.component.mjs +3 -3
  139. package/esm2022/lib/components/global-search/elder-global-search.module.mjs +4 -4
  140. package/esm2022/lib/components/global-search/elder-global-search.service.mjs +3 -3
  141. package/esm2022/lib/components/graph/elder-progress-bar/elder-progress-bar.component.mjs +3 -3
  142. package/esm2022/lib/components/graph/elder-progress-bar/elder-progress-bar.module.mjs +4 -4
  143. package/esm2022/lib/components/headers/elder-header/elder-header.component.mjs +3 -3
  144. package/esm2022/lib/components/headers/elder-header.module.mjs +4 -4
  145. package/esm2022/lib/components/http-support/elder-http-client.service.mjs +3 -3
  146. package/esm2022/lib/components/i18n/entities/elder-i18n-entities.module.mjs +4 -4
  147. package/esm2022/lib/components/i18n/entities/elder-localized-input/elder-localized-input.component.mjs +3 -3
  148. package/esm2022/lib/components/i18n/entities/elder-localized-input-dialog/elder-localized-input-dialog.component.mjs +3 -3
  149. package/esm2022/lib/components/i18n/entities/elder-localized-input-dialog.service.mjs +3 -3
  150. package/esm2022/lib/components/i18n/entities/elder-localized-input-table/elder-localized-input-table.component.mjs +3 -3
  151. package/esm2022/lib/components/i18n/entities/elder-localized-text-column.directive.mjs +3 -3
  152. package/esm2022/lib/components/i18n/entities/elder-localized-texts.directive.mjs +3 -3
  153. package/esm2022/lib/components/i18n/entities/picker/i18n-pick-async.pipe.mjs +3 -3
  154. package/esm2022/lib/components/i18n/entities/picker/i18n-pick.pipe.mjs +3 -3
  155. package/esm2022/lib/components/i18n/entities/picker/localisation-picker.service.mjs +3 -3
  156. package/esm2022/lib/components/i18n/language/elder-language-interceptor.mjs +3 -3
  157. package/esm2022/lib/components/i18n/language/elder-language.module.mjs +4 -4
  158. package/esm2022/lib/components/i18n/language/elder-language.service.mjs +3 -3
  159. package/esm2022/lib/components/i18n/language/language-switcher/elder-language-switcher.component.mjs +3 -3
  160. package/esm2022/lib/components/i18n/locales/elder-locales-de-ch.module.mjs +4 -4
  161. package/esm2022/lib/components/iframes/data-view/data-view-iframe/data-view-iframe.component.mjs +3 -3
  162. package/esm2022/lib/components/iframes/data-view/data-view-iframe-adapter.directive.mjs +3 -3
  163. package/esm2022/lib/components/iframes/elder-iframe.module.mjs +4 -4
  164. package/esm2022/lib/components/iframes/iframe-close.directive.mjs +3 -3
  165. package/esm2022/lib/components/iframes/iframe-dialog/iframe-dialog.component.mjs +3 -3
  166. package/esm2022/lib/components/iframes/iframe-host/iframe-host.component.mjs +3 -3
  167. package/esm2022/lib/components/iframes/iframe-side-content/iframe-side-content.component.mjs +3 -3
  168. package/esm2022/lib/components/iframes/iframe.service.mjs +3 -3
  169. package/esm2022/lib/components/infinitescroll/elder-infinite-autocomplete.directive.mjs +3 -3
  170. package/esm2022/lib/components/infinitescroll/elder-infinite-scroll.directive.mjs +3 -3
  171. package/esm2022/lib/components/infinitescroll/elder-infinite-scroll.module.mjs +4 -4
  172. package/esm2022/lib/components/input/autocomplete/elder-autocomplete/elder-suggestion-panel.component.mjs +3 -3
  173. package/esm2022/lib/components/input/autocomplete/elder-autocomplete-many.directive.mjs +3 -3
  174. package/esm2022/lib/components/input/autocomplete/elder-autocomplete.directive.mjs +3 -3
  175. package/esm2022/lib/components/input/autocomplete/elder-autocomplete.module.mjs +4 -4
  176. package/esm2022/lib/components/labels/elder-labels.module.mjs +4 -4
  177. package/esm2022/lib/components/labels/labels-input/labels-input.component.mjs +3 -3
  178. package/esm2022/lib/components/measures/dimensions/dimensions-input/elder-dimensions-input.component.mjs +3 -3
  179. package/esm2022/lib/components/measures/dimensions/validation/elder-required-dimensions.validator.mjs +3 -3
  180. package/esm2022/lib/components/measures/directives/elder-unit-select.directive.mjs +3 -3
  181. package/esm2022/lib/components/measures/elder-measures.module.mjs +8 -8
  182. package/esm2022/lib/components/measures/elder-quantity-transform.pipe.mjs +3 -3
  183. package/esm2022/lib/components/measures/elder-quantity.pipe.mjs +3 -3
  184. package/esm2022/lib/components/measures/elder-unit.service.mjs +3 -3
  185. package/esm2022/lib/components/measures/quantity-input/quantity-form-field/elder-quantity-form-field.component.mjs +3 -3
  186. package/esm2022/lib/components/measures/quantity-input/quantity-input-control/elder-quantity-input-control.component.mjs +3 -3
  187. package/esm2022/lib/components/measures/quantity-input/validation/elder-quantity-range.validator.mjs +3 -3
  188. package/esm2022/lib/components/measures/quantity-input/validation/elder-required-quantity.validator.mjs +3 -3
  189. package/esm2022/lib/components/measures/util/elder-quantity.service.mjs +3 -3
  190. package/esm2022/lib/components/navigation/bread-crumbs/bread-crumbs/elder-bread-crumbs.component.mjs +3 -3
  191. package/esm2022/lib/components/navigation/bread-crumbs/elder-bread-crumbs.module.mjs +4 -4
  192. package/esm2022/lib/components/navigation/nav/elder-nav.module.mjs +4 -4
  193. package/esm2022/lib/components/navigation/nav/nav-group/elder-nav-group.component.mjs +3 -3
  194. package/esm2022/lib/components/navigation/nav/nav-link/elder-nav-link.component.mjs +3 -3
  195. package/esm2022/lib/components/navigation/nav/nav-list/elder-nav-list.component.mjs +3 -3
  196. package/esm2022/lib/components/navigation/toolbar/elder-toolbar-column.directive.mjs +3 -3
  197. package/esm2022/lib/components/navigation/toolbar/elder-toolbar.module.mjs +4 -4
  198. package/esm2022/lib/components/navigation/toolbar/elder-toolbar.service.mjs +3 -3
  199. package/esm2022/lib/components/navigation/toolbar/toolbar/elder-toolbar.component.mjs +3 -3
  200. package/esm2022/lib/components/navigation/toolbar/toolbar-title/elder-toolbar-title.component.mjs +3 -3
  201. package/esm2022/lib/components/navigation/toolbar/toolbar-title/elder-toolbar-title.service.mjs +3 -3
  202. package/esm2022/lib/components/overlays/elder-overlay-origin.directive.mjs +3 -3
  203. package/esm2022/lib/components/overlays/elder-overlay-ref.mjs +3 -3
  204. package/esm2022/lib/components/overlays/elder-overlay-trigger.directive.mjs +3 -3
  205. package/esm2022/lib/components/overlays/elder-overlay.component.mjs +3 -3
  206. package/esm2022/lib/components/overlays/elder-overlay.module.mjs +4 -4
  207. package/esm2022/lib/components/page/exit-guard/page-exit-guard.module.mjs +4 -4
  208. package/esm2022/lib/components/page/exit-guard/page-exit-guard.service.mjs +3 -3
  209. package/esm2022/lib/components/page/exit-guard/page-exit-lock/page-exit-lock.component.mjs +3 -3
  210. package/esm2022/lib/components/page/exit-guard/page-exit-lock-indicator/page-exit-lock-indicator.component.mjs +3 -3
  211. package/esm2022/lib/components/page/exit-guard/page-exit-lock-overview/page-exit-lock-overview.component.mjs +3 -3
  212. package/esm2022/lib/components/panels/card-panel/elder-card-panel.component.mjs +3 -3
  213. package/esm2022/lib/components/panels/elder-dialog-panel/elder-dialog-panel.component.mjs +3 -3
  214. package/esm2022/lib/components/panels/elder-panel.module.mjs +4 -4
  215. package/esm2022/lib/components/panels/flat/elder-panel.component.mjs +3 -3
  216. package/esm2022/lib/components/panels/toggle-panel/elder-toggle-panel-trigger.directive.mjs +3 -3
  217. package/esm2022/lib/components/panels/toggle-panel/elder-toggle-panel.component.mjs +9 -9
  218. package/esm2022/lib/components/scrollbar/elder-scrollbar.directive.mjs +3 -3
  219. package/esm2022/lib/components/scrollbar/elder-scrollbar.module.mjs +4 -4
  220. package/esm2022/lib/components/select/auto/elder-auto-select-first.directive.mjs +3 -3
  221. package/esm2022/lib/components/select/auto/elder-auto-select-first.service.mjs +3 -3
  222. package/esm2022/lib/components/select/auto/elder-auto-select-suggest-first.directive.mjs +3 -3
  223. package/esm2022/lib/components/select/elder-select-base.mjs +3 -3
  224. package/esm2022/lib/components/select/elder-select-chip.directive.mjs +9 -9
  225. package/esm2022/lib/components/select/elder-select-on-tab.directive.mjs +3 -3
  226. package/esm2022/lib/components/select/elder-select-value.directive.mjs +3 -3
  227. package/esm2022/lib/components/select/elder-select.module.mjs +4 -4
  228. package/esm2022/lib/components/select/filter/elder-chips-include-exclude.directive.mjs +3 -3
  229. package/esm2022/lib/components/select/filter/elder-filter-chip-template/elder-filter-chip-template.component.mjs +3 -3
  230. package/esm2022/lib/components/select/multi/elder-chip-select-option/elder-select-option.component.mjs +3 -3
  231. package/esm2022/lib/components/select/multi/elder-multi-select-base.mjs +3 -3
  232. package/esm2022/lib/components/select/multi/elder-multi-select-chip-options/elder-multi-select-chip-options.component.mjs +3 -3
  233. package/esm2022/lib/components/select/multi/elder-multi-select-chips/elder-multi-select-chips.component.mjs +3 -3
  234. package/esm2022/lib/components/select/multi/elder-multi-select-form-field.mjs +3 -3
  235. package/esm2022/lib/components/select/multi/elder-mutli-select-all-directive.mjs +3 -3
  236. package/esm2022/lib/components/select/multi/elder-search-include-exclude.directive.mjs +3 -3
  237. package/esm2022/lib/components/select/popup/selection-model-popup-trigger-adapter.directive.mjs +3 -3
  238. package/esm2022/lib/components/select/popup/selection-model-popup.directive.mjs +3 -3
  239. package/esm2022/lib/components/select/popup/templated-selection-dialog/templated-selection-dialog.component.mjs +3 -3
  240. package/esm2022/lib/components/select/single/elder-clear-select.directive.mjs +3 -3
  241. package/esm2022/lib/components/select/single/elder-select/elder-select.component.mjs +3 -3
  242. package/esm2022/lib/components/select/single/elder-select-form-field.mjs +3 -3
  243. package/esm2022/lib/components/select-chip-list/chip-list-select/elder-chip-list-select.component.mjs +3 -3
  244. package/esm2022/lib/components/select-chip-list/elder-chip-list-select.module.mjs +4 -4
  245. package/esm2022/lib/components/shell/drawers/elder-route-outlet-drawer.service.mjs +3 -3
  246. package/esm2022/lib/components/shell/drawers/elder-router-outlet.service.mjs +3 -3
  247. package/esm2022/lib/components/shell/elder-shell-slot.directive.mjs +3 -3
  248. package/esm2022/lib/components/shell/elder-shell.module.mjs +4 -4
  249. package/esm2022/lib/components/shell/elder-shell.service.mjs +3 -3
  250. package/esm2022/lib/components/shell/header/elder-app-header/elder-app-header.component.mjs +3 -3
  251. package/esm2022/lib/components/shell/shell/elder-shell.component.mjs +12 -12
  252. package/esm2022/lib/components/shell/shell-navigation-toggle/elder-shell-navigation-toggle.component.mjs +3 -3
  253. package/esm2022/lib/components/tabs/elder-tab/elder-tab.directive.mjs +3 -3
  254. package/esm2022/lib/components/tabs/elder-tab-group-routing/elder-tab-group-routing.directive.mjs +3 -3
  255. package/esm2022/lib/components/tabs/elder-tab.module.mjs +4 -4
  256. package/esm2022/lib/components/theme/elder-theme-applier.directive.mjs +3 -3
  257. package/esm2022/lib/components/theme/elder-theme-preference.service.mjs +3 -3
  258. package/esm2022/lib/components/theme/elder-theme-toggle/elder-theme-toggle.component.mjs +3 -3
  259. package/esm2022/lib/components/theme/elder-theme.directive.mjs +3 -3
  260. package/esm2022/lib/components/theme/elder-theme.module.mjs +4 -4
  261. package/esm2022/lib/components/theme/elder-theme.service.mjs +3 -3
  262. package/esm2022/lib/components/time/date-adapters/custom-date-adapter.mjs +3 -3
  263. package/esm2022/lib/components/time/duration/elder-duration-input/elder-duration-input.component.mjs +3 -3
  264. package/esm2022/lib/components/time/elder-date-switcher/elder-date-switcher.component.mjs +3 -3
  265. package/esm2022/lib/components/time/elder-date-time-input/elder-date-time-input.component.mjs +3 -3
  266. package/esm2022/lib/components/time/elder-interval-input/elder-interval-input.component.mjs +3 -3
  267. package/esm2022/lib/components/time/elder-interval-picker/elder-interval-picker-binding.directive.mjs +7 -12
  268. package/esm2022/lib/components/time/elder-interval-picker/elder-interval-picker-toggle/elder-interval-picker-toggle.component.mjs +83 -81
  269. package/esm2022/lib/components/time/elder-interval-picker/elder-interval-picker.component.mjs +82 -99
  270. package/esm2022/lib/components/time/elder-interval-picker/model/interval-picker-model-editor.mjs +284 -0
  271. package/esm2022/lib/components/time/elder-interval-picker/model/interval-picker-model.mjs +445 -0
  272. package/esm2022/lib/components/time/elder-interval-picker/model/plain-date-interval-message-renderer.mjs +37 -0
  273. package/esm2022/lib/components/time/elder-interval-picker/model/plain-temporal-duration-message-renderer.mjs +25 -0
  274. package/esm2022/lib/components/time/elder-local-date-input/elder-local-date-input.component.mjs +3 -3
  275. package/esm2022/lib/components/time/elder-local-time-input/elder-local-time-input.component.mjs +3 -3
  276. package/esm2022/lib/components/time/elder-time.module.mjs +4 -4
  277. package/esm2022/lib/components/time/period/elder-period-input/elder-period-input.component.mjs +3 -3
  278. package/esm2022/lib/components/time/pipes/to-iso-date-string.pipe.mjs +3 -3
  279. package/esm2022/lib/components/toasts/elder-toast.module.mjs +4 -4
  280. package/esm2022/lib/components/toasts/elder-toast.service.mjs +3 -3
  281. package/esm2022/lib/components/toasts/standard-toast/standard-toast.component.mjs +3 -3
  282. package/esm2022/lib/components/url-fragment/elder-url-fragment.module.mjs +4 -4
  283. package/esm2022/lib/components/url-fragment/url-fragment-switcher/elder-url-fragment-switcher.component.mjs +3 -3
  284. package/esm2022/lib/components/viewers/elder-svg-viewer/elder-svg-viewer.component.mjs +3 -3
  285. package/esm2022/lib/components/viewers/elder-viewers.module.mjs +4 -4
  286. package/esm2022/lib/features/event-source/fetch/reactive-fetch-event-source.service.mjs +3 -3
  287. package/esm2022/lib/features/event-source/standard/elder-event-source.service.mjs +3 -3
  288. package/esm2022/lib/features/kafent/access-token-provider.mjs +3 -3
  289. package/esm2022/lib/features/kafent/kafent-config.mjs +3 -3
  290. package/esm2022/lib/features/kafent/kafent-event-stream.mjs +3 -3
  291. package/esm2022/lib/features/kafent/kafent-event.service.mjs +3 -3
  292. package/esm2022/lib/features/kafent/kafent.module.mjs +4 -4
  293. package/esm2022/lib/features/kafent/sse/kafent-event-stream-sse.service.mjs +3 -3
  294. package/esm2022/lib/pipes/bytes.pipe.mjs +3 -3
  295. package/esm2022/lib/pipes/elder-pipes.module.mjs +10 -10
  296. package/esm2022/lib/pipes/elder-repeat.pipe.mjs +3 -3
  297. package/esm2022/lib/pipes/elder-round.pipe.mjs +3 -3
  298. package/esm2022/lib/pipes/elder-safe-url.pipe.mjs +3 -3
  299. package/esm2022/lib/pipes/elder-truncate.pipe.mjs +3 -3
  300. package/esm2022/lib/pipes/iso-duration.pipe.mjs +3 -3
  301. package/esm2022/lib/pipes/iso-interval-parse.pipe.mjs +3 -3
  302. package/esm2022/lib/pipes/iso-interval.pipe.mjs +3 -3
  303. package/esm2022/lib/pipes/time-ago.pipe.mjs +3 -3
  304. package/esm2022/lib/pipes/time-duration.pipe.mjs +3 -3
  305. package/esm2022/lib/pipes/weight.pipe.mjs +3 -3
  306. package/fesm2022/elderbyte-ngx-starter.mjs +1643 -1575
  307. package/fesm2022/elderbyte-ngx-starter.mjs.map +1 -1
  308. package/lib/common/time/temporal-util.d.ts +2 -0
  309. package/lib/components/time/elder-interval-picker/elder-interval-picker-binding.directive.d.ts +3 -6
  310. package/lib/components/time/elder-interval-picker/elder-interval-picker-toggle/elder-interval-picker-toggle.component.d.ts +25 -18
  311. package/lib/components/time/elder-interval-picker/elder-interval-picker.component.d.ts +19 -25
  312. package/lib/components/time/elder-interval-picker/model/interval-picker-model-editor.d.ts +77 -0
  313. package/lib/components/time/elder-interval-picker/model/interval-picker-model.d.ts +113 -0
  314. package/lib/components/time/elder-interval-picker/model/plain-date-interval-message-renderer.d.ts +7 -0
  315. package/lib/components/time/elder-interval-picker/model/plain-temporal-duration-message-renderer.d.ts +4 -0
  316. package/package.json +1 -1
  317. package/src/assets/i18n/fr.json +123 -0
  318. package/esm2022/lib/components/time/elder-interval-picker/elder-interval-picker.service.mjs +0 -708
  319. package/lib/components/time/elder-interval-picker/elder-interval-picker.service.d.ts +0 -132
@@ -1,708 +0,0 @@
1
- import { computed, effect, EventEmitter, Injectable, signal, } from '@angular/core';
2
- import { DateRange } from '@angular/material/datepicker';
3
- import { LoggerFactory } from '@elderbyte/ts-logger';
4
- import { Temporal } from '@js-temporal/polyfill';
5
- import { Interval } from '../../../common/time/interval';
6
- import { TemporalPlainDateInterval } from '../../../common/time/temporal-plain-date-interval';
7
- import { TemporalUtil } from '../../../common/time/temporal-util';
8
- import { TimeUtil } from '../../../common/time/time-util';
9
- import * as i0 from "@angular/core";
10
- const defaultCalendarMode = 'days';
11
- export class ElderIntervalPickerService {
12
- constructor() {
13
- /***************************************************************************
14
- * *
15
- * Fields *
16
- * *
17
- **************************************************************************/
18
- this.log = LoggerFactory.getLogger(this.constructor.name);
19
- this._dateChangeEmitter = new EventEmitter();
20
- this.calendarMode = signal(defaultCalendarMode);
21
- this.startDate = signal(null);
22
- this.endDate = signal(null);
23
- this.baseReferenceDate = signal(Temporal.Now.plainDateISO());
24
- this.baseReferenceTime = signal(Temporal.Now.plainTimeISO());
25
- this.fixedAnchorDate = signal(null);
26
- this.fixedAnchorTime = signal(Temporal.PlainTime.from('00:00'));
27
- this.startTime = signal(Temporal.PlainTime.from('00:00'));
28
- this.endTime = signal(Temporal.PlainTime.from('00:00'));
29
- this._inputInterval = null;
30
- this._inputAnchorDateTime = null;
31
- this.isEmittingOnChange = signal(true);
32
- this.isUpdatingIntervalOnAnchorChange = signal(false);
33
- this.isFixedAnchorDateSet = computed(() => {
34
- return !!this.fixedAnchorDate();
35
- });
36
- this.anchorDate = computed(() => {
37
- if (this.fixedAnchorDate()) {
38
- return this.fixedAnchorDate();
39
- }
40
- return this.baseReferenceDate();
41
- });
42
- this.anchorTime = computed(() => {
43
- if (this.fixedAnchorDate() && this.fixedAnchorTime()) {
44
- return this.fixedAnchorTime();
45
- }
46
- return this.baseReferenceTime();
47
- });
48
- this.anchorDateTime = computed(() => {
49
- return this.anchorDate().toPlainDateTime(this.anchorTime());
50
- });
51
- this.dateRange = computed(() => {
52
- if (!this.isStartAndEndDatesSet()) {
53
- return null;
54
- }
55
- return new TemporalPlainDateInterval(this.startDate(), this.endDate());
56
- });
57
- this.dateRangeForCalendar = computed(() => {
58
- if (!this.isStartAndEndDatesSet()) {
59
- return null;
60
- }
61
- const startDate = TemporalUtil.getJSDateFromPlainDateTime(this.startDate());
62
- const endDate = TemporalUtil.getJSDateFromPlainDateTime(this.endDate());
63
- return new DateRange(startDate, endDate);
64
- });
65
- this.dateRangeInDays = computed(() => {
66
- if (!this.dateRange()) {
67
- return 0;
68
- }
69
- return this.dateRange().getDurationInDays();
70
- });
71
- this.isStartAndEndDatesEmpty = computed(() => {
72
- return !this.startDate() && !this.endDate();
73
- });
74
- this.isStartAndEndDatesSet = computed(() => {
75
- return !!(this.startDate() && this.endDate());
76
- });
77
- this.isRangeNotSet = computed(() => {
78
- return !this.isStartAndEndDatesSet();
79
- });
80
- this.startDateTime = computed(() => {
81
- if (!this.startDate()) {
82
- return null;
83
- }
84
- if (this.startTime()) {
85
- return this.startDate().toPlainDateTime(this.startTime());
86
- }
87
- return this.startDate();
88
- });
89
- this.endDateTime = computed(() => {
90
- if (!this.endDate()) {
91
- return null;
92
- }
93
- if (this.endTime()) {
94
- return this.endDate().toPlainDateTime(this.endTime());
95
- }
96
- return this.endDate();
97
- });
98
- this.startDateAsJSDate = computed(() => {
99
- if (!this.startDate()) {
100
- return null;
101
- }
102
- return TemporalUtil.getJSDateFromPlainDateTime(this.startDate());
103
- });
104
- this.endDateAsJSDate = computed(() => {
105
- if (!this.endDate()) {
106
- return null;
107
- }
108
- return TemporalUtil.getJSDateFromPlainDateTime(this.endDate());
109
- });
110
- this.startDateTimeAsJSDate = computed(() => {
111
- if (!this.startDateTime()) {
112
- return null;
113
- }
114
- return TemporalUtil.getJSDateFromPlainDateTime(this.startDateTime());
115
- });
116
- this.endDateTimeAsJSDate = computed(() => {
117
- if (!this.endDateTime()) {
118
- return null;
119
- }
120
- return TemporalUtil.getJSDateFromPlainDateTime(this.endDateTime());
121
- });
122
- this.getCalendarWeek = computed(() => {
123
- if (!this.startDate()) {
124
- return null;
125
- }
126
- return this.startDate().weekOfYear;
127
- });
128
- this.isFullCalenderWeekSelected = computed(() => {
129
- if (!this.isStartAndEndDatesSet()) {
130
- return false;
131
- }
132
- if (!TemporalUtil.isFirstDayOfWeek(this.startDate())) {
133
- return false;
134
- }
135
- const duration = this.startDate().until(this.endDate());
136
- if (duration.days !== 7) {
137
- return false;
138
- }
139
- return this.startDate().weekOfYear;
140
- });
141
- this.viewIntervalMessage = computed(() => {
142
- if (this.isRangeNotSet()) {
143
- return '-';
144
- }
145
- if (this.calendarMode() === 'quarters') {
146
- const quarter = TemporalUtil.getQuarterForDate(this.startDate());
147
- return `Q${quarter}, ${this.startDate().year}`;
148
- }
149
- if (this.calendarMode() === 'months') {
150
- const monthName = this.startDate().month;
151
- return `1m (${monthName}, ${this.startDate().year})`;
152
- }
153
- if (this.calendarMode() === 'years') {
154
- const year = this.startDate().year;
155
- return `1y (${year})`;
156
- }
157
- if (this.calendarMode() === 'weeks') {
158
- return `1w (CW ${this.getCalendarWeek()}, ${this.endDate().year})`;
159
- }
160
- if (this.calendarMode() === 'days') {
161
- return `${this.dateRangeInDays()}d`;
162
- }
163
- return '';
164
- });
165
- this.deltaAsTemporalDuration = computed(() => {
166
- const startDateTime = this.startDateTime();
167
- const endDateTime = this.endDateTime();
168
- if (!startDateTime || !endDateTime) {
169
- return null;
170
- }
171
- const duration = startDateTime.until(endDateTime);
172
- return duration;
173
- });
174
- this.deltaHumanReadable = computed(() => {
175
- if (this.isStartAndEndDatesEmpty()) {
176
- return '';
177
- }
178
- const duration = this.deltaAsTemporalDuration();
179
- if (!duration) {
180
- return '∞';
181
- }
182
- const tmp = [];
183
- if (duration.days) {
184
- tmp.push(`${duration.days}d`);
185
- }
186
- if (duration.hours) {
187
- tmp.push(`${duration.hours}h`);
188
- }
189
- if (duration.minutes) {
190
- tmp.push(`${duration.minutes}min`);
191
- }
192
- if (duration.seconds) {
193
- tmp.push(`${duration.seconds}s`);
194
- }
195
- if (!tmp.length) {
196
- return '0s';
197
- }
198
- return tmp.join(', ');
199
- });
200
- this.getStartTimeString = computed(() => {
201
- return TemporalUtil.getHtmlTimeStringFromPlainTime(this.startTime());
202
- });
203
- this.getEndTimeString = computed(() => {
204
- return TemporalUtil.getHtmlTimeStringFromPlainTime(this.endTime());
205
- });
206
- this.getAnchorTimeString = computed(() => {
207
- return TemporalUtil.getHtmlTimeStringFromPlainTime(this.fixedAnchorTime());
208
- });
209
- this.getAnchorPointAsLocaleDate = computed(() => {
210
- const anchorPoint = this.fixedAnchorDate();
211
- if (!anchorPoint) {
212
- return null;
213
- }
214
- const jsDate = TemporalUtil.getJSDateFromPlainDateTime(anchorPoint);
215
- const localeDate = TimeUtil.dateToLocalDate(jsDate);
216
- return localeDate;
217
- });
218
- this.startDateHtmlString = computed(() => {
219
- return TemporalUtil.getHtmlDateString(this.startDateTime());
220
- });
221
- this.endDateHtmlString = computed(() => {
222
- return TemporalUtil.getHtmlDateString(this.endDateTime());
223
- });
224
- this.isStartTimeSetAndNotMidnight = computed(() => {
225
- if (!this.startTime()) {
226
- return false;
227
- }
228
- return (this.startTime().hour !== 0 || this.startTime().minute !== 0 || this.startTime().second !== 0);
229
- });
230
- this.isEndTimeSetAndNotMidnight = computed(() => {
231
- if (!this.endTime()) {
232
- return false;
233
- }
234
- return this.endTime().hour !== 0 || this.endTime().minute !== 0 || this.endTime().second !== 0;
235
- });
236
- this.isFixedAnchorTimeSetAndNotMidnight = computed(() => {
237
- if (!this.fixedAnchorTime()) {
238
- return false;
239
- }
240
- return (this.fixedAnchorTime().hour !== 0 ||
241
- this.fixedAnchorTime().minute !== 0 ||
242
- this.fixedAnchorTime().second !== 0);
243
- });
244
- /***************************************************************************
245
- * *
246
- * Effects *
247
- * *
248
- **************************************************************************/
249
- this._autoEmitOnDateTimesChangeEffect = effect(() => {
250
- const startDateTime = this.startDateTime();
251
- const endDateTime = this.endDateTime();
252
- if (this.isEmittingOnChange()) {
253
- this.emitMainDates();
254
- }
255
- });
256
- }
257
- /***************************************************************************
258
- * *
259
- * Public API *
260
- * *
261
- **************************************************************************/
262
- setStartDateFromHtmlString(htmlString) {
263
- const date = TemporalUtil.getPlainDateFromHtmlDateString(htmlString);
264
- if (!date) {
265
- return;
266
- }
267
- this.calendarMode.set('days');
268
- this.startDate.set(date);
269
- }
270
- setEndDateFromHtmlString(htmlString) {
271
- const date = TemporalUtil.getPlainDateFromHtmlDateString(htmlString);
272
- if (!date) {
273
- return;
274
- }
275
- this.calendarMode.set('days');
276
- this.endDate.set(date);
277
- }
278
- setupInputInterval(s) {
279
- this._inputInterval = s;
280
- }
281
- setupInputAnchorDateTime(s) {
282
- this._inputAnchorDateTime = s;
283
- }
284
- setupEventEmitter(e) {
285
- this._dateChangeEmitter = e;
286
- }
287
- setStartTimeFromString(timeStr, formControl) {
288
- const time = TemporalUtil.getPlainTimeFromHtmlTimeString(timeStr);
289
- if (time) {
290
- this.startTime.set(time);
291
- }
292
- if (!this.startDate()) {
293
- this.startDate.set(Temporal.Now.plainDateISO());
294
- }
295
- this.calendarMode.set('days');
296
- }
297
- setEndTimeFromString(timeStr, formControl) {
298
- const time = TemporalUtil.getPlainTimeFromHtmlTimeString(timeStr);
299
- if (time) {
300
- this.endTime.set(time);
301
- }
302
- if (!this.endDate()) {
303
- this.endDate.set(Temporal.Now.plainDateISO());
304
- }
305
- this.calendarMode.set('days');
306
- }
307
- resetCalendarMode() {
308
- this.calendarMode.set(defaultCalendarMode);
309
- }
310
- pullInputInterval() {
311
- if (!this._inputInterval) {
312
- return;
313
- }
314
- this.setDateTimesFromElderInterval(this._inputInterval());
315
- }
316
- pullInputAnchorDateTime() {
317
- if (!this._inputAnchorDateTime) {
318
- return;
319
- }
320
- this.setAnchorDateTimeFromJsDate(this._inputAnchorDateTime());
321
- }
322
- setDateTimesFromElderInterval(interval) {
323
- if (!interval) {
324
- this.startDate.set(null);
325
- this.endDate.set(null);
326
- return;
327
- }
328
- if (interval.start) {
329
- const startDateAsJSDate = TimeUtil.date(interval.start);
330
- this.startDate.set(TemporalUtil.getPlainDateFromJSDate(startDateAsJSDate));
331
- this.startTime.set(TemporalUtil.getPlainTimeFromJSDate(startDateAsJSDate));
332
- }
333
- else {
334
- this.startDate.set(null);
335
- }
336
- if (interval.end) {
337
- const endDateAsJSDate = TimeUtil.date(interval.end);
338
- this.endDate.set(TemporalUtil.getPlainDateFromJSDate(endDateAsJSDate));
339
- this.endTime.set(TemporalUtil.getPlainTimeFromJSDate(endDateAsJSDate));
340
- }
341
- else {
342
- this.endDate.set(null);
343
- }
344
- this.log.debug(`Pulled input interval:`, interval);
345
- }
346
- setAnchorDateTimeFromJsDate(dateTime) {
347
- if (!dateTime) {
348
- return;
349
- }
350
- const date = TemporalUtil.getPlainDateFromJSDate(dateTime);
351
- const time = TemporalUtil.getPlainTimeFromJSDate(dateTime);
352
- this.fixedAnchorDate.set(date);
353
- this.fixedAnchorTime.set(time);
354
- }
355
- setFixedAnchorPointToStartDateTime() {
356
- if (!this.startDate()) {
357
- this.resetFixedAnchorPoint();
358
- return;
359
- }
360
- if (this.startDate()) {
361
- this.fixedAnchorDate.set(this.startDate());
362
- }
363
- if (this.startTime()) {
364
- this.fixedAnchorTime.set(this.startTime());
365
- }
366
- }
367
- setFixedAnchorPointToEndDateTime() {
368
- if (!this.endDate()) {
369
- this.resetFixedAnchorPoint();
370
- return;
371
- }
372
- if (this.endDate()) {
373
- this.fixedAnchorDate.set(this.endDate());
374
- }
375
- if (this.endTime()) {
376
- this.fixedAnchorTime.set(this.endTime());
377
- }
378
- }
379
- resetFixedAnchorPoint() {
380
- this.fixedAnchorDate.set(null);
381
- this.fixedAnchorTime.set(Temporal.PlainTime.from('00:00'));
382
- if (this.isUpdatingIntervalOnAnchorChange() && this.isStartAndEndDatesSet()) {
383
- this.shiftRangeEndToToday();
384
- }
385
- }
386
- setAnchorDateFromForm(dateArg) {
387
- if (!dateArg) {
388
- this.fixedAnchorDate.set(null);
389
- return;
390
- }
391
- const jsDate = TimeUtil.localDateToDate(dateArg);
392
- const plainDate = TemporalUtil.getPlainDateFromJSDate(jsDate);
393
- if (!plainDate) {
394
- this.log.warn('Invalid date', plainDate);
395
- return;
396
- }
397
- this.fixedAnchorDate.set(plainDate);
398
- if (!this.isUpdatingIntervalOnAnchorChange()) {
399
- return;
400
- }
401
- if (this.fixedAnchorDate()) {
402
- this.shiftSelectionToAnchorDate();
403
- }
404
- }
405
- clearStartDateTime() {
406
- this.startDate.set(null);
407
- this.startTime.set(null);
408
- }
409
- clearEndDateTime() {
410
- this.endDate.set(null);
411
- this.endTime.set(null);
412
- }
413
- clearStartTime() {
414
- this.startTime.set(null);
415
- }
416
- clearEndTime() {
417
- this.endTime.set(null);
418
- }
419
- resetFixedAnchorTime() {
420
- this.fixedAnchorTime.set(Temporal.PlainTime.from('00:00'));
421
- }
422
- setAnchorTimeFromForm(htmlString) {
423
- const time = TemporalUtil.getPlainTimeFromHtmlTimeString(htmlString);
424
- if (!time) {
425
- return;
426
- }
427
- if (!this.fixedAnchorDate()) {
428
- this.fixedAnchorDate.set(Temporal.Now.plainDateISO());
429
- }
430
- this.fixedAnchorTime.set(time);
431
- if (!this.isUpdatingIntervalOnAnchorChange()) {
432
- return;
433
- }
434
- if (this.fixedAnchorTime()) {
435
- this.shiftSelectionToAnchorTime();
436
- }
437
- }
438
- emitMainDates() {
439
- const interval = this.createElderInterval();
440
- this._dateChangeEmitter.emit(interval);
441
- }
442
- // date shifts
443
- shiftDay(days) {
444
- this.setDatesFromRange(this.dateRange().shiftDays(days));
445
- if (this.calendarMode() === 'weeks' && (days === 7 || days === -7)) {
446
- this.calendarMode.set('weeks');
447
- return;
448
- }
449
- this.calendarMode.set('days');
450
- }
451
- shiftMonth(months, staticMode = false) {
452
- this.setDatesFromRange(this.dateRange().shiftMonths(months));
453
- if (staticMode && this.calendarMode() !== 'months') {
454
- this.calendarMode.set('days');
455
- return;
456
- }
457
- this.resetTimeRange();
458
- this.calendarMode.set('months');
459
- }
460
- shiftYear(years, staticMode = false) {
461
- this.setDatesFromRange(this.dateRange().shiftYears(years));
462
- if (staticMode && this.calendarMode() !== 'years') {
463
- this.calendarMode.set('days');
464
- return;
465
- }
466
- this.resetTimeRange();
467
- this.calendarMode.set('years');
468
- }
469
- shiftTime(amount, unit) {
470
- if (!this.isStartAndEndDatesSet()) {
471
- return;
472
- }
473
- const newStartDateTime = this.startDateTime().add({ [unit]: amount });
474
- const newEndDateTime = this.endDateTime().add({ [unit]: amount });
475
- this.startDate.set(Temporal.PlainDate.from(newStartDateTime));
476
- this.startTime.set(Temporal.PlainTime.from(newStartDateTime));
477
- this.endDate.set(Temporal.PlainDate.from(newEndDateTime));
478
- this.endTime.set(Temporal.PlainTime.from(newEndDateTime));
479
- }
480
- smartShift(direction = 1) {
481
- if (this.calendarMode() === 'quarters') {
482
- const newRange = this.dateRange().shiftMonths(direction * 3);
483
- this.setDatesFromRange(newRange);
484
- return;
485
- }
486
- if (this.calendarMode() === 'months') {
487
- const newRange = this.dateRange().shiftMonths(direction);
488
- this.setDatesFromRange(newRange);
489
- return;
490
- }
491
- if (this.calendarMode() === 'years') {
492
- const newRange = this.dateRange().shiftYears(direction);
493
- this.setDatesFromRange(newRange);
494
- return;
495
- }
496
- if (this.calendarMode() === 'weeks') {
497
- const newRange = this.dateRange().shiftDays(7 * direction);
498
- this.setDatesFromRange(newRange);
499
- return;
500
- }
501
- const daysDiff = this.dateRange().getDurationInDays();
502
- const newRange = this.dateRange().shiftDays(daysDiff * direction);
503
- this.setDatesFromRange(newRange);
504
- }
505
- // time range selections
506
- selectLastHour() {
507
- this.refreshBaseReferenceDateTime();
508
- const end = this.anchorDateTime();
509
- const start = end.subtract({ hours: 1 });
510
- this.endDate.set(this.anchorDate());
511
- this.endTime.set(this.anchorTime());
512
- const startPlainDate = Temporal.PlainDate.from(start);
513
- const startPlainTime = Temporal.PlainTime.from(start);
514
- this.startDate.set(startPlainDate);
515
- this.startTime.set(startPlainTime);
516
- this.calendarMode.set('days');
517
- }
518
- selectLast24Hours() {
519
- this.refreshBaseReferenceDateTime();
520
- const end = this.anchorDateTime();
521
- const start = end.subtract({ days: 1 });
522
- this.endDate.set(this.anchorDate());
523
- this.endTime.set(this.anchorTime());
524
- const startPlainDate = Temporal.PlainDate.from(start);
525
- const startPlainTime = Temporal.PlainTime.from(start);
526
- this.startDate.set(startPlainDate);
527
- this.startTime.set(startPlainTime);
528
- this.calendarMode.set('days');
529
- }
530
- selectLastFiveMinutes() {
531
- this.refreshBaseReferenceDateTime();
532
- const end = this.anchorDateTime();
533
- const start = end.subtract({ minutes: 5 });
534
- this.endDate.set(this.anchorDate());
535
- this.endTime.set(this.anchorTime());
536
- const startPlainDate = Temporal.PlainDate.from(start);
537
- const startPlainTime = Temporal.PlainTime.from(start);
538
- this.startDate.set(startPlainDate);
539
- this.startTime.set(startPlainTime);
540
- this.calendarMode.set('days');
541
- }
542
- // date range selections
543
- selectCurrentDay() {
544
- this.setDatesFromRange(TemporalUtil.getCurrentDay(this.anchorDate()));
545
- this.calendarMode.set('days');
546
- this.resetTimeRange();
547
- }
548
- selectYesterday() {
549
- this.setDatesFromRange(TemporalUtil.getYesterday(this.anchorDate()));
550
- this.calendarMode.set('days');
551
- this.resetTimeRange();
552
- }
553
- selectCurrentWeek() {
554
- this.setDatesFromRange(TemporalUtil.getCurrentWeek(this.anchorDate()));
555
- this.calendarMode.set('weeks');
556
- this.resetTimeRange();
557
- }
558
- selectPreviousWeek() {
559
- this.setDatesFromRange(TemporalUtil.getPreviousWeek(this.anchorDate()));
560
- this.calendarMode.set('weeks');
561
- this.resetTimeRange();
562
- }
563
- selectLastSevenDaysExcludingToday() {
564
- this.setDatesFromRange(TemporalUtil.getLastSevenDays(this.anchorDate()));
565
- this.calendarMode.set('days');
566
- this.resetTimeRange();
567
- }
568
- selectLastSevenDaysIncludingToday() {
569
- this.setDatesFromRange(TemporalUtil.getLastSevenDaysIncludingToday(this.anchorDate()));
570
- this.calendarMode.set('days');
571
- this.resetTimeRange();
572
- }
573
- selectCurrentMonth() {
574
- this.setDatesFromRange(TemporalUtil.getCurrentMonth(this.anchorDate()));
575
- this.calendarMode.set('months');
576
- this.resetTimeRange();
577
- }
578
- selectPreviousMonth() {
579
- this.setDatesFromRange(TemporalUtil.getPreviousMonth(this.anchorDate()));
580
- this.calendarMode.set('months');
581
- this.resetTimeRange();
582
- }
583
- selectLastThirtyDaysExcludingToday() {
584
- this.setDatesFromRange(TemporalUtil.getLastThirtyDays(this.anchorDate()));
585
- this.calendarMode.set('days');
586
- this.resetTimeRange();
587
- }
588
- selectLastThirtyDaysIncludingToday() {
589
- this.setDatesFromRange(TemporalUtil.getLastThirtyDaysIncludingToday(this.anchorDate()));
590
- this.calendarMode.set('days');
591
- this.resetTimeRange();
592
- }
593
- selectCurrentYear() {
594
- this.setDatesFromRange(TemporalUtil.getCurrentYear(this.anchorDate()));
595
- this.calendarMode.set('years');
596
- this.resetTimeRange();
597
- }
598
- selectPreviousYear() {
599
- this.setDatesFromRange(TemporalUtil.getPreviousYear(this.anchorDate()));
600
- this.calendarMode.set('years');
601
- this.resetTimeRange();
602
- }
603
- selectLast365Days() {
604
- this.setDatesFromRange(TemporalUtil.getLast365Days(this.anchorDate()));
605
- this.calendarMode.set('days');
606
- this.resetTimeRange();
607
- }
608
- selectCurrentQuarter() {
609
- this.setDatesFromRange(TemporalUtil.getCurrentQuarter(this.anchorDate()));
610
- this.calendarMode.set('quarters');
611
- this.resetTimeRange();
612
- }
613
- selectPreviousQuarter() {
614
- this.setDatesFromRange(TemporalUtil.getPreviousQuarter(this.anchorDate()));
615
- this.calendarMode.set('quarters');
616
- this.resetTimeRange();
617
- }
618
- // Anchor point shift selections
619
- shiftSelectionToAnchorDate() {
620
- if (!this.isStartAndEndDatesSet() || !this.fixedAnchorDate()) {
621
- return;
622
- }
623
- const range = new TemporalPlainDateInterval(this.startDate(), this.endDate());
624
- const endDate = this.fixedAnchorDate();
625
- const startDate = endDate.subtract({ days: range.getDurationInDays() });
626
- this.startDate.set(startDate);
627
- this.endDate.set(endDate);
628
- if (this.calendarMode() === 'months') {
629
- this.selectCurrentMonth();
630
- }
631
- if (this.calendarMode() === 'years') {
632
- this.selectCurrentYear();
633
- }
634
- if (this.calendarMode() === 'weeks') {
635
- this.selectCurrentWeek();
636
- }
637
- }
638
- shiftSelectionToAnchorTime() {
639
- if (!this.isStartAndEndDatesSet() || !this.fixedAnchorTime()) {
640
- return;
641
- }
642
- const duration = this.startDateTime().until(this.endDateTime());
643
- const newStartDateTime = this.anchorDateTime().subtract(duration);
644
- const newEndDateTime = this.anchorDateTime();
645
- this.startDate.set(Temporal.PlainDate.from(newStartDateTime));
646
- this.startTime.set(Temporal.PlainTime.from(newStartDateTime));
647
- this.endDate.set(Temporal.PlainDate.from(newEndDateTime));
648
- this.endTime.set(Temporal.PlainTime.from(newEndDateTime));
649
- if (this.calendarMode() === 'months') {
650
- this.selectCurrentMonth();
651
- }
652
- if (this.calendarMode() === 'years') {
653
- this.selectCurrentYear();
654
- }
655
- if (this.calendarMode() === 'weeks') {
656
- this.selectCurrentWeek();
657
- }
658
- }
659
- /***************************************************************************
660
- * *
661
- * Private methods *
662
- * *
663
- **************************************************************************/
664
- createElderInterval() {
665
- let start, end = null;
666
- if (this.startDateTime()) {
667
- const jsDate = TemporalUtil.getJSDateFromPlainDateTime(this.startDateTime());
668
- start = TimeUtil.instant(jsDate);
669
- }
670
- if (this.endDateTime()) {
671
- const jsDate = TemporalUtil.getJSDateFromPlainDateTime(this.endDateTime());
672
- end = TimeUtil.instant(jsDate);
673
- }
674
- if (!start && !end) {
675
- return new Interval(null, null);
676
- }
677
- return new Interval(start, end);
678
- }
679
- setDatesFromRange(range) {
680
- this.startDate.set(range.start);
681
- this.endDate.set(range.end);
682
- }
683
- refreshBaseReferenceDateTime() {
684
- const dateTime = Temporal.Now.zonedDateTimeISO();
685
- const date = Temporal.PlainDate.from(dateTime);
686
- const time = Temporal.PlainTime.from(dateTime);
687
- this.baseReferenceDate.set(date);
688
- this.baseReferenceTime.set(time);
689
- }
690
- resetTimeRange() {
691
- this.startTime.set(Temporal.PlainTime.from('00:00'));
692
- this.endTime.set(Temporal.PlainTime.from('00:00'));
693
- }
694
- shiftRangeEndToToday() {
695
- if (!this.isStartAndEndDatesSet()) {
696
- return;
697
- }
698
- const duration = this.startDate().until(this.endDate());
699
- this.endDate.set(Temporal.Now.plainDateISO());
700
- this.startDate.set(this.endDate().subtract(duration));
701
- }
702
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.2", ngImport: i0, type: ElderIntervalPickerService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
703
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.2", ngImport: i0, type: ElderIntervalPickerService }); }
704
- }
705
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.2", ngImport: i0, type: ElderIntervalPickerService, decorators: [{
706
- type: Injectable
707
- }] });
708
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWxkZXItaW50ZXJ2YWwtcGlja2VyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9lbGRlcmJ5dGUvbmd4LXN0YXJ0ZXIvc3JjL2xpYi9jb21wb25lbnRzL3RpbWUvZWxkZXItaW50ZXJ2YWwtcGlja2VyL2VsZGVyLWludGVydmFsLXBpY2tlci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxRQUFRLEVBQ1IsTUFBTSxFQUVOLFlBQVksRUFDWixVQUFVLEVBRVYsTUFBTSxHQUNQLE1BQU0sZUFBZSxDQUFBO0FBQ3RCLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQTtBQUN4RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sc0JBQXNCLENBQUE7QUFFcEQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHVCQUF1QixDQUFBO0FBQ2hELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQTtBQUN4RCxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxtREFBbUQsQ0FBQTtBQUM3RixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0NBQW9DLENBQUE7QUFDakUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGdDQUFnQyxDQUFBOztBQUd6RCxNQUFNLG1CQUFtQixHQUFpQixNQUFNLENBQUE7QUFHaEQsTUFBTSxPQUFPLDBCQUEwQjtJQUR2QztRQUVFOzs7O29GQUk0RTtRQUUzRCxRQUFHLEdBQUcsYUFBYSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFBO1FBRTdELHVCQUFrQixHQUFHLElBQUksWUFBWSxFQUFZLENBQUE7UUFFaEQsaUJBQVksR0FBRyxNQUFNLENBQWUsbUJBQW1CLENBQUMsQ0FBQTtRQUV4RCxjQUFTLEdBQUcsTUFBTSxDQUFxQixJQUFJLENBQUMsQ0FBQTtR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LENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFBO1FBQ3BELElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUE7SUFDcEQsQ0FBQztJQUVPLG9CQUFvQjtRQUMxQixJQUFJLENBQUMsSUFBSSxDQUFDLHFCQUFxQixFQUFFLEVBQUUsQ0FBQztZQUNsQyxPQUFNO1FBQ1IsQ0FBQztRQUNELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUE7UUFDdkQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFBO1FBQzdDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQTtJQUN2RCxDQUFDOzhHQTV6QlUsMEJBQTBCO2tIQUExQiwwQkFBMEI7OzJGQUExQiwwQkFBMEI7a0JBRHRDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBjb21wdXRlZCxcbiAgZWZmZWN0LFxuICBFZmZlY3RSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5qZWN0YWJsZSxcbiAgU2lnbmFsLFxuICBzaWduYWwsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnXG5pbXBvcnQgeyBEYXRlUmFuZ2UgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kYXRlcGlja2VyJ1xuaW1wb3J0IHsgTG9nZ2VyRmFjdG9yeSB9IGZyb20gJ0BlbGRlcmJ5dGUvdHMtbG9nZ2VyJ1xuaW1wb3J0IHsgTG9jYWxEYXRlIH0gZnJvbSAnQGpzLWpvZGEvY29yZSdcbmltcG9ydCB7IFRlbXBvcmFsIH0gZnJvbSAnQGpzLXRlbXBvcmFsL3BvbHlmaWxsJ1xuaW1wb3J0IHsgSW50ZXJ2YWwgfSBmcm9tICcuLi8uLi8uLi9jb21tb24vdGltZS9pbnRlcnZhbCdcbmltcG9ydCB7IFRlbXBvcmFsUGxhaW5EYXRlSW50ZXJ2YWwgfSBmcm9tICcuLi8uLi8uLi9jb21tb24vdGltZS90ZW1wb3JhbC1wbGFpbi1kYXRlLWludGVydmFsJ1xuaW1wb3J0IHsgVGVtcG9yYWxVdGlsIH0gZnJvbSAnLi4vLi4vLi4vY29tbW9uL3RpbWUvdGVtcG9yYWwtdXRpbCdcbmltcG9ydCB7IFRpbWVVdGlsIH0gZnJvbSAnLi4vLi4vLi4vY29tbW9uL3RpbWUvdGltZS11dGlsJ1xuXG50eXBlIGNhbGVuZGFyTW9kZSA9ICdkYXlzJyB8ICd3ZWVrcycgfCAnbW9udGhzJyB8ICdxdWFydGVycycgfCAneWVhcnMnXG5jb25zdCBkZWZhdWx0Q2FsZW5kYXJNb2RlOiBjYWxlbmRhck1vZGUgPSAnZGF5cydcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEVsZGVySW50ZXJ2YWxQaWNrZXJTZXJ2aWNlIHtcbiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqIEZpZWxkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbiAgcHJpdmF0ZSByZWFkb25seSBsb2cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcih0aGlzLmNvbnN0cnVjdG9yLm5hbWUpXG5cbiAgcHJpdmF0ZSBfZGF0ZUNoYW5nZUVtaXR0ZXIgPSBuZXcgRXZlbnRFbWl0dGVyPEludGVydmFsPigpXG5cbiAgcmVhZG9ubHkgY2FsZW5kYXJNb2RlID0gc2lnbmFsPGNhbGVuZGFyTW9kZT4oZGVmYXVsdENhbGVuZGFyTW9kZSlcblxuICByZWFkb25seSBzdGFydERhdGUgPSBzaWduYWw8VGVtcG9yYWwuUGxhaW5EYXRlPihudWxsKVxuICByZWFkb25seSBlbmREYXRlID0gc2lnbmFsPFRlbXBvcmFsLlBsYWluRGF0ZT4obnVsbClcblxuICByZWFkb25seSBiYXNlUmVmZXJlbmNlRGF0ZSA9IHNpZ25hbChUZW1wb3JhbC5Ob3cucGxhaW5EYXRlSVNPKCkpXG4gIHJlYWRvbmx5IGJhc2VSZWZlcmVuY2VUaW1lID0gc2lnbmFsKFRlbXBvcmFsLk5vdy5wbGFpblRpbWVJU08oKSlcblxuICByZWFkb25seSBmaXhlZEFuY2hvckRhdGUgPSBzaWduYWw8VGVtcG9yYWwuUGxhaW5EYXRlPihudWxsKVxuICByZWFkb25seSBmaXhlZEFuY2hvclRpbWUgPSBzaWduYWwoVGVtcG9yYWwuUGxhaW5UaW1lLmZyb20oJzAwOjAwJykpXG5cbiAgcmVhZG9ubHkgc3RhcnRUaW1lID0gc2lnbmFsKFRlbXBvcmFsLlBsYWluVGltZS5mcm9tKCcwMDowMCcpKVxuICByZWFkb25seSBlbmRUaW1lID0gc2lnbmFsKFRlbXBvcmFsLlBsYWluVGltZS5mcm9tKCcwMDowMCcpKVxuXG4gIHByaXZhdGUgX2lucHV0SW50ZXJ2YWw6IFNpZ25hbDxJbnRlcnZhbD4gPSBudWxsXG4gIHByaXZhdGUgX2lucHV0QW5jaG9yRGF0ZVRpbWU6IFNpZ25hbDxEYXRlPiA9IG51bGxcblxuICByZWFkb25seSBpc0VtaXR0aW5nT25DaGFuZ2UgPSBzaWduYWw8Ym9vbGVhbj4odHJ1ZSlcbiAgcmVhZG9ubHkgaXNVcGRhdGluZ0ludGVydmFsT25BbmNob3JDaGFuZ2UgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpXG5cbiAgcmVhZG9ubHkgaXNGaXhlZEFuY2hvckRhdGVTZXQgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgcmV0dXJuICEhdGhpcy5maXhlZEFuY2hvckRhdGUoKVxuICB9KVxuXG4gIHJlYWRvbmx5IGFuY2hvckRhdGUgPSBjb21wdXRlZDxUZW1wb3JhbC5QbGFpbkRhdGU+KCgpID0+IHtcbiAgICBpZiAodGhpcy5maXhlZEFuY2hvckRhdGUoKSkge1xuICAgICAgcmV0dXJuIHRoaXMuZml4ZWRBbmNob3JEYXRlKClcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuYmFzZVJlZmVyZW5jZURhdGUoKVxuICB9KVxuXG4gIHJlYWRvbmx5IGFuY2hvclRpbWUgPSBjb21wdXRlZDxUZW1wb3JhbC5QbGFpblRpbWU+KCgpID0+IHtcbiAgICBpZiAodGhpcy5maXhlZEFuY2hvckRhdGUoKSAmJiB0aGlzLmZpeGVkQW5jaG9yVGltZSgpKSB7XG4gICAgICByZXR1cm4gdGhpcy5maXhlZEFuY2hvclRpbWUoKVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5iYXNlUmVmZXJlbmNlVGltZSgpXG4gIH0pXG5cbiAgcmVhZG9ubHkgYW5jaG9yRGF0ZVRpbWUgPSBjb21wdXRlZDxUZW1wb3JhbC5QbGFpbkRhdGVUaW1lPigoKSA9PiB7XG4gICAgcmV0dXJuIHRoaXMuYW5jaG9yRGF0ZSgpLnRvUGxhaW5EYXRlVGltZSh0aGlzLmFuY2hvclRpbWUoKSlcbiAgfSlcblxuICByZWFkb25seSBkYXRlUmFuZ2UgPSBjb21wdXRlZDxUZW1wb3JhbFBsYWluRGF0ZUludGVydmFsIHwgbnVsbD4oKCkgPT4ge1xuICAgIGlmICghdGhpcy5pc1N0YXJ0QW5kRW5kRGF0ZXNTZXQoKSkge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBUZW1wb3JhbFBsYWluRGF0ZUludGVydmFsKHRoaXMuc3RhcnREYXRlKCksIHRoaXMuZW5kRGF0ZSgpKVxuICB9KVxuXG4gIHJlYWRvbmx5IGRhdGVSYW5nZUZvckNhbGVuZGFyID0gY29tcHV0ZWQ8RGF0ZVJhbmdlPERhdGU+IHwgbnVsbD4oKCkgPT4ge1xuICAgIGlmICghdGhpcy5pc1N0YXJ0QW5kRW5kRGF0ZXNTZXQoKSkge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG4gICAgY29uc3Qgc3RhcnREYXRlID0gVGVtcG9yYWxVdGlsLmdldEpTRGF0ZUZyb21QbGFpbkRhdGVUaW1lKHRoaXMuc3RhcnREYXRlKCkpXG4gICAgY29uc3QgZW5kRGF0ZSA9IFRlbXBvcmFsVXRpbC5nZXRKU0RhdGVGcm9tUGxhaW5EYXRlVGltZSh0aGlzLmVuZERhdGUoKSlcbiAgICByZXR1cm4gbmV3IERhdGVSYW5nZShzdGFydERhdGUsIGVuZERhdGUpXG4gIH0pXG5cbiAgcmVhZG9ubHkgZGF0ZVJhbmdlSW5EYXlzID0gY29tcHV0ZWQ8bnVtYmVyPigoKSA9PiB7XG4gICAgaWYgKCF0aGlzLmRhdGVSYW5nZSgpKSB7XG4gICAgICByZXR1cm4gMFxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5kYXRlUmFuZ2UoKS5nZXREdXJhdGlvbkluRGF5cygpXG4gIH0pXG5cbiAgcmVhZG9ubHkgaXNTdGFydEFuZEVuZERhdGVzRW1wdHkgPSBjb21wdXRlZDxib29sZWFuPigoKSA9PiB7XG4gICAgcmV0dXJuICF0aGlzLnN0YXJ0RGF0ZSgpICYmICF0aGlzLmVuZERhdGUoKVxuICB9KVxuXG4gIHJlYWRvbmx5IGlzU3RhcnRBbmRFbmREYXRlc1NldCA9IGNvbXB1dGVkPGJvb2xlYW4+KCgpID0+IHtcbiAgICByZXR1cm4gISEodGhpcy5zdGFydERhdGUoKSAmJiB0aGlzLmVuZERhdGUoKSlcbiAgfSlcblxuICByZWFkb25seSBpc1JhbmdlTm90U2V0ID0gY29tcHV0ZWQ8Ym9vbGVhbj4oKCkgPT4ge1xuICAgIHJldHVybiAhdGhpcy5pc1N0YXJ0QW5kRW5kRGF0ZXNTZXQoKVxuICB9KVxuXG4gIHJlYWRvbmx5IHN0YXJ0RGF0ZVRpbWUgPSBjb21wdXRlZDxUZW1wb3JhbC5QbGFpbkRhdGUgfCBUZW1wb3JhbC5QbGFpbkRhdGVUaW1lPigoKSA9PiB7XG4gICAgaWYgKCF0aGlzLnN0YXJ0RGF0ZSgpKSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cbiAgICBpZiAodGhpcy5zdGFydFRpbWUoKSkge1xuICAgICAgcmV0dXJuIHRoaXMuc3RhcnREYXRlKCkudG9QbGFpbkRhdGVUaW1lKHRoaXMuc3RhcnRUaW1lKCkpXG4gICAgfVxuICAgIHJldHVybiB0aGlzLnN0YXJ0RGF0ZSgpXG4gIH0pXG5cbiAgcmVhZG9ubHkgZW5kRGF0ZVRpbWUgPSBjb21wdXRlZDxUZW1wb3JhbC5QbGFpbkRhdGUgfCBUZW1wb3JhbC5QbGFpbkRhdGVUaW1lPigoKSA9PiB7XG4gICAgaWYgKCF0aGlzLmVuZERhdGUoKSkge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG4gICAgaWYgKHRoaXMuZW5kVGltZSgpKSB7XG4gICAgICByZXR1cm4gdGhpcy5lbmREYXRlKCkudG9QbGFpbkRhdGVUaW1lKHRoaXMuZW5kVGltZSgpKVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5lbmREYXRlKClcbiAgfSlcblxuICByZWFkb25seSBzdGFydERhdGVBc0pTRGF0ZSA9IGNvbXB1dGVkPERhdGUgfCBudWxsPigoKSA9PiB7XG4gICAgaWYgKCF0aGlzLnN0YXJ0RGF0ZSgpKSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cbiAgICByZXR1cm4gVGVtcG9yYWxVdGlsLmdldEpTRGF0ZUZyb21QbGFpbkRhdGVUaW1lKHRoaXMuc3RhcnREYXRlKCkpXG4gIH0pXG5cbiAgcmVhZG9ubHkgZW5kRGF0ZUFzSlNEYXRlID0gY29tcHV0ZWQ8RGF0ZSB8IG51bGw+KCgpID0+IHtcbiAgICBpZiAoIXRoaXMuZW5kRGF0ZSgpKSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cbiAgICByZXR1cm4gVGVtcG9yYWxVdGlsLmdldEpTRGF0ZUZyb21QbGFpbkRhdGVUaW1lKHRoaXMuZW5kRGF0ZSgpKVxuICB9KVxuXG4gIHJlYWRvbmx5IHN0YXJ0RGF0ZVRpbWVBc0pTRGF0ZSA9IGNvbXB1dGVkPERhdGUgfCBudWxsPigoKSA9PiB7XG4gICAgaWYgKCF0aGlzLnN0YXJ0RGF0ZVRpbWUoKSkge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG4gICAgcmV0dXJuIFRlbXBvcmFsVXRpbC5nZXRKU0RhdGVGcm9tUGxhaW5EYXRlVGltZSh0aGlzLnN0YXJ0RGF0ZVRpbWUoKSlcbiAgfSlcblxuICByZWFkb25seSBlbmREYXRlVGltZUFzSlNEYXRlID0gY29tcHV0ZWQ8RGF0ZSB8IG51bGw+KCgpID0+IHtcbiAgICBpZiAoIXRoaXMuZW5kRGF0ZVRpbWUoKSkge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG4gICAgcmV0dXJuIFRlbXBvcmFsVXRpbC5nZXRKU0RhdGVGcm9tUGxhaW5EYXRlVGltZSh0aGlzLmVuZERhdGVUaW1lKCkpXG4gIH0pXG5cbiAgcmVhZG9ubHkgZ2V0Q2FsZW5kYXJXZWVrID0gY29tcHV0ZWQ8bnVtYmVyPigoKSA9PiB7XG4gICAgaWYgKCF0aGlzLnN0YXJ0RGF0ZSgpKSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zdGFydERhdGUoKS53ZWVrT2ZZZWFyXG4gIH0pXG5cbiAgcmVhZG9ubHkgaXNGdWxsQ2FsZW5kZXJXZWVrU2VsZWN0ZWQgPSBjb21wdXRlZDxib29sZWFuIHwgbnVtYmVyPigoKSA9PiB7XG4gICAgaWYgKCF0aGlzLmlzU3RhcnRBbmRFbmREYXRlc1NldCgpKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICBpZiAoIVRlbXBvcmFsVXRpbC5pc0ZpcnN0RGF5T2ZXZWVrKHRoaXMuc3RhcnREYXRlKCkpKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICBjb25zdCBkdXJhdGlvbiA9IHRoaXMuc3RhcnREYXRlKCkudW50aWwodGhpcy5lbmREYXRlKCkpXG5cbiAgICBpZiAoZHVyYXRpb24uZGF5cyAhPT0gNykge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc3RhcnREYXRlKCkud2Vla09mWWVhclxuICB9KVxuXG4gIHJlYWRvbmx5IHZpZXdJbnRlcnZhbE1lc3NhZ2UgPSBjb21wdXRlZDxzdHJpbmc+KCgpID0+IHtcbiAgICBpZiAodGhpcy5pc1JhbmdlTm90U2V0KCkpIHtcbiAgICAgIHJldHVybiAnLSdcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jYWxlbmRhck1vZGUoKSA9PT0gJ3F1YXJ0ZXJzJykge1xuICAgICAgY29uc3QgcXVhcnRlciA9IFRlbXBvcmFsVXRpbC5nZXRRdWFydGVyRm9yRGF0ZSh0aGlzLnN0YXJ0RGF0ZSgpKVxuICAgICAgcmV0dXJuIGBRJHtxdWFydGVyfSwgJHt0aGlzLnN0YXJ0RGF0ZSgpLnllYXJ9YFxuICAgIH1cblxuICAgIGlmICh0aGlzLmNhbGVuZGFyTW9kZSgpID09PSAnbW9udGhzJykge1xuICAgICAgY29uc3QgbW9udGhOYW1lID0gdGhpcy5zdGFydERhdGUoKS5tb250aFxuICAgICAgcmV0dXJuIGAxbSAoJHttb250aE5hbWV9LCAke3RoaXMuc3RhcnREYXRlKCkueWVhcn0pYFxuICAgIH1cblxuICAgIGlmICh0aGlzLmNhbGVuZGFyTW9kZSgpID09PSAneWVhcnMnKSB7XG4gICAgICBjb25zdCB5ZWFyID0gdGhpcy5zdGFydERhdGUoKS55ZWFyXG4gICAgICByZXR1cm4gYDF5ICgke3llYXJ9KWBcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jYWxlbmRhck1vZGUoKSA9PT0gJ3dlZWtzJykge1xuICAgICAgcmV0dXJuIGAxdyAoQ1cgJHt0aGlzLmdldENhbGVuZGFyV2VlaygpfSwgJHt0aGlzLmVuZERhdGUoKS55ZWFyfSlgXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY2FsZW5kYXJNb2RlKCkgPT09ICdkYXlzJykge1xuICAgICAgcmV0dXJuIGAke3RoaXMuZGF0ZVJhbmdlSW5EYXlzKCl9ZGBcbiAgICB9XG5cbiAgICByZXR1cm4gJydcbiAgfSlcblxuICByZWFkb25seSBkZWx0YUFzVGVtcG9yYWxEdXJhdGlvbiA9IGNvbXB1dGVkPFRlbXBvcmFsLkR1cmF0aW9uPigoKSA9PiB7XG4gICAgY29uc3Qgc3RhcnREYXRlVGltZSA9IHRoaXMuc3RhcnREYXRlVGltZSgpXG4gICAgY29uc3QgZW5kRGF0ZVRpbWUgPSB0aGlzLmVuZERhdGVUaW1lKClcblxuICAgIGlmICghc3RhcnREYXRlVGltZSB8fCAhZW5kRGF0ZVRpbWUpIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgY29uc3QgZHVyYXRpb24gPSBzdGFydERhdGVUaW1lLnVudGlsKGVuZERhdGVUaW1lKVxuICAgIHJldHVybiBkdXJhdGlvblxuICB9KVxuXG4gIHJlYWRvbmx5IGRlbHRhSHVtYW5SZWFkYWJsZSA9IGNvbXB1dGVkPHN0cmluZz4oKCkgPT4ge1xuICAgIGlmICh0aGlzLmlzU3RhcnRBbmRFbmREYXRlc0VtcHR5KCkpIHtcbiAgICAgIHJldHVybiAnJ1xuICAgIH1cbiAgICBjb25zdCBkdXJhdGlvbiA9IHRoaXMuZGVsdGFBc1RlbXBvcmFsRHVyYXRpb24oKVxuICAgIGlmICghZHVyYXRpb24pIHtcbiAgICAgIHJldHVybiAn4oieJ1xuICAgIH1cbiAgICBjb25zdCB0bXAgPSBbXVxuICAgIGlmIChkdXJhdGlvbi5kYXlzKSB7XG4gICAgICB0bXAucHVzaChgJHtkdXJhdGlvbi5kYXlzfWRgKVxuICAgIH1cbiAgICBpZiAoZHVyYXRpb24uaG91cnMpIHtcbiAgICAgIHRtcC5wdXNoKGAke2R1cmF0aW9uLmhvdXJzfWhgKVxuICAgIH1cbiAgICBpZiAoZHVyYXRpb24ubWludXRlcykge1xuICAgICAgdG1wLnB1c2goYCR7ZHVyYXRpb24ubWludXRlc31taW5gKVxuICAgIH1cbiAgICBpZiAoZHVyYXRpb24uc2Vjb25kcykge1xuICAgICAgdG1wLnB1c2goYCR7ZHVyYXRpb24uc2Vjb25kc31zYClcbiAgICB9XG5cbiAgICBpZiAoIXRtcC5sZW5ndGgpIHtcbiAgICAgIHJldHVybiAnMHMnXG4gICAgfVxuXG4gICAgcmV0dXJuIHRtcC5qb2luKCcsICcpXG4gIH0pXG5cbiAgcmVhZG9ubHkgZ2V0U3RhcnRUaW1lU3RyaW5nID0gY29tcHV0ZWQ8c3RyaW5nPigoKSA9PiB7XG4gICAgcmV0dXJuIFRlbXBvcmFsVXRpbC5nZXRIdG1sVGltZVN0cmluZ0Zyb21QbGFpblRpbWUodGhpcy5zdGFydFRpbWUoKSlcbiAgfSlcblxuICByZWFkb25seSBnZXRFbmRUaW1lU3RyaW5nID0gY29tcHV0ZWQ8c3RyaW5nPigoKSA9PiB7XG4gICAgcmV0dXJuIFRlbXBvcmFsVXRpbC5nZXRIdG1sVGltZVN0cmluZ0Zyb21QbGFpblRpbWUodGhpcy5lbmRUaW1lKCkpXG4gIH0pXG5cbiAgcmVhZG9ubHkgZ2V0QW5jaG9yVGltZVN0cmluZyA9IGNvbXB1dGVkPHN0cmluZz4oKCkgPT4ge1xuICAgIHJldHVybiBUZW1wb3JhbFV0aWwuZ2V0SHRtbFRpbWVTdHJpbmdGcm9tUGxhaW5UaW1lKHRoaXMuZml4ZWRBbmNob3JUaW1lKCkpXG4gIH0pXG5cbiAgcmVhZG9ubHkgZ2V0QW5jaG9yUG9pbnRBc0xvY2FsZURhdGUgPSBjb21wdXRlZDxMb2NhbERhdGU+KCgpID0+IHtcbiAgICBjb25zdCBhbmNob3JQb2ludCA9IHRoaXMuZml4ZWRBbmNob3JEYXRlKClcbiAgICBpZiAoIWFuY2hvclBvaW50KSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cbiAgICBjb25zdCBqc0RhdGUgPSBUZW1wb3JhbFV0aWwuZ2V0SlNEYXRlRnJvbVBsYWluRGF0ZVRpbWUoYW5jaG9yUG9pbnQpXG4gICAgY29uc3QgbG9jYWxlRGF0ZSA9IFRpbWVVdGlsLmRhdGVUb0xvY2FsRGF0ZShqc0RhdGUpXG4gICAgcmV0dXJuIGxvY2FsZURhdGVcbiAgfSlcblxuICByZWFkb25seSBzdGFydERhdGVIdG1sU3RyaW5nID0gY29tcHV0ZWQ8c3RyaW5nPigoKSA9PiB7XG4gICAgcmV0dXJuIFRlbXBvcmFsVXRpbC5nZXRIdG1sRGF0ZVN0cmluZyh0aGlzLnN0YXJ0RGF0ZVRpbWUoKSlcbiAgfSlcblxuICByZWFkb25seSBlbmREYXRlSHRtbFN0cmluZyA9IGNvbXB1dGVkPHN0cmluZz4oKCkgPT4ge1xuICAgIHJldHVybiBUZW1wb3JhbFV0aWwuZ2V0SHRtbERhdGVTdHJpbmcodGhpcy5lbmREYXRlVGltZSgpKVxuICB9KVxuXG4gIHJlYWRvbmx5IGlzU3RhcnRUaW1lU2V0QW5kTm90TWlkbmlnaHQgPSBjb21wdXRlZDxib29sZWFuPigoKSA9PiB7XG4gICAgaWYgKCF0aGlzLnN0YXJ0VGltZSgpKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuc3RhcnRUaW1lKCkuaG91ciAhPT0gMCB8fCB0aGlzLnN0YXJ0VGltZSgpLm1pbnV0ZSAhPT0gMCB8fCB0aGlzLnN0YXJ0VGltZSgpLnNlY29uZCAhPT0gMFxuICAgIClcbiAgfSlcblxuICByZWFkb25seSBpc0VuZFRpbWVTZXRBbmROb3RNaWRuaWdodCA9IGNvbXB1dGVkPGJvb2xlYW4+KCgpID0+IHtcbiAgICBpZiAoIXRoaXMuZW5kVGltZSgpKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZW5kVGltZSgpLmhvdXIgIT09IDAgfHwgdGhpcy5lbmRUaW1lKCkubWludXRlICE9PSAwIHx8IHRoaXMuZW5kVGltZSgpLnNlY29uZCAhPT0gMFxuICB9KVxuXG4gIHJlYWRvbmx5IGlzRml4ZWRBbmNob3JUaW1lU2V0QW5kTm90TWlkbmlnaHQgPSBjb21wdXRlZDxib29sZWFuPigoKSA9PiB7XG4gICAgaWYgKCF0aGlzLmZpeGVkQW5jaG9yVGltZSgpKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuZml4ZWRBbmNob3JUaW1lKCkuaG91ciAhPT0gMCB8fFxuICAgICAgdGhpcy5maXhlZEFuY2hvclRpbWUoKS5taW51dGUgIT09IDAgfHxcbiAgICAgIHRoaXMuZml4ZWRBbmNob3JUaW1lKCkuc2Vjb25kICE9PSAwXG4gICAgKVxuICB9KVxuXG4gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKiBQdWJsaWMgQVBJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4gIHNldFN0YXJ0RGF0ZUZyb21IdG1sU3RyaW5nKGh0bWxTdHJpbmc6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGRhdGUgPSBUZW1wb3JhbFV0aWwuZ2V0UGxhaW5EYXRlRnJvbUh0bWxEYXRlU3RyaW5nKGh0bWxTdHJpbmcpXG4gICAgaWYgKCFkYXRlKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgdGhpcy5jYWxlbmRhck1vZGUuc2V0KCdkYXlzJylcbiAgICB0aGlzLnN0YXJ0RGF0ZS5zZXQoZGF0ZSlcbiAgfVxuXG4gIHNldEVuZERhdGVGcm9tSHRtbFN0cmluZyhodG1sU3RyaW5nOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBkYXRlID0gVGVtcG9yYWxVdGlsLmdldFBsYWluRGF0ZUZyb21IdG1sRGF0ZVN0cmluZyhodG1sU3RyaW5nKVxuICAgIGlmICghZGF0ZSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIHRoaXMuY2FsZW5kYXJNb2RlLnNldCgnZGF5cycpXG4gICAgdGhpcy5lbmREYXRlLnNldChkYXRlKVxuICB9XG5cbiAgc2V0dXBJbnB1dEludGVydmFsKHM6IFNpZ25hbDxJbnRlcnZhbD4pOiB2b2lkIHtcbiAgICB0aGlzLl9pbnB1dEludGVydmFsID0gc1xuICB9XG5cbiAgc2V0dXBJbnB1dEFuY2hvckRhdGVUaW1lKHM6IFNpZ25hbDxEYXRlPik6IHZvaWQge1xuICAgIHRoaXMuX2lucHV0QW5jaG9yRGF0ZVRpbWUgPSBzXG4gIH1cblxuICBzZXR1cEV2ZW50RW1pdHRlcihlOiBFdmVudEVtaXR0ZXI8SW50ZXJ2YWw+KTogdm9pZCB7XG4gICAgdGhpcy5fZGF0ZUNoYW5nZUVtaXR0ZXIgPSBlXG4gIH1cblxuICBzZXRTdGFydFRpbWVGcm9tU3RyaW5nKHRpbWVTdHI6IHN0cmluZywgZm9ybUNvbnRyb2w/OiBhbnkpOiB2b2lkIHtcbiAgICBjb25zdCB0aW1lID0gVGVtcG9yYWxVdGlsLmdldFBsYWluVGltZUZyb21IdG1sVGltZVN0cmluZyh0aW1lU3RyKVxuXG4gICAgaWYgKHRpbWUpIHtcbiAgICAgIHRoaXMuc3RhcnRUaW1lLnNldCh0aW1lKVxuICAgIH1cblxuICAgIGlmICghdGhpcy5zdGFydERhdGUoKSkge1xuICAgICAgdGhpcy5zdGFydERhdGUuc2V0KFRlbXBvcmFsLk5vdy5wbGFpbkRhdGVJU08oKSlcbiAgICB9XG5cbiAgICB0aGlzLmNhbGVuZGFyTW9kZS5zZXQoJ2RheXMnKVxuICB9XG5cbiAgc2V0RW5kVGltZUZyb21TdHJpbmcodGltZVN0cjogc3RyaW5nLCBmb3JtQ29udHJvbD86IGFueSk6IHZvaWQge1xuICAgIGNvbnN0IHRpbWUgPSBUZW1wb3JhbFV0aWwuZ2V0UGxhaW5UaW1lRnJvbUh0bWxUaW1lU3RyaW5nKHRpbWVTdHIpXG5cbiAgICBpZiAodGltZSkge1xuICAgICAgdGhpcy5lbmRUaW1lLnNldCh0aW1lKVxuICAgIH1cblxuICAgIGlmICghdGhpcy5lbmREYXRlKCkpIHtcbiAgICAgIHRoaXMuZW5kRGF0ZS5zZXQoVGVtcG9yYWwuTm93LnBsYWluRGF0ZUlTTygpKVxuICAgIH1cblxuICAgIHRoaXMuY2FsZW5kYXJNb2RlLnNldCgnZGF5cycpXG4gIH1cblxuICByZXNldENhbGVuZGFyTW9kZSgpOiB2b2lkIHtcbiAgICB0aGlzLmNhbGVuZGFyTW9kZS5zZXQoZGVmYXVsdENhbGVuZGFyTW9kZSlcbiAgfVxuXG4gIHB1bGxJbnB1dEludGVydmFsKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5faW5wdXRJbnRlcnZhbCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5zZXREYXRlVGltZXNGcm9tRWxkZXJJbnRlcnZhbCh0aGlzLl9pbnB1dEludGVydmFsKCkpXG4gIH1cblxuICBwdWxsSW5wdXRBbmNob3JEYXRlVGltZSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX2lucHV0QW5jaG9yRGF0ZVRpbWUpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuc2V0QW5jaG9yRGF0ZVRpbWVGcm9tSnNEYXRlKHRoaXMuX2lucHV0QW5jaG9yRGF0ZVRpbWUoKSlcbiAgfVxuXG4gIHNldERhdGVUaW1lc0Zyb21FbGRlckludGVydmFsKGludGVydmFsOiBJbnRlcnZhbCk6IHZvaWQge1xuICAgIGlmICghaW50ZXJ2YWwpIHtcbiAgICAgIHRoaXMuc3RhcnREYXRlLnNldChudWxsKVxuICAgICAgdGhpcy5lbmREYXRlLnNldChudWxsKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKGludGVydmFsLnN0YXJ0KSB7XG4gICAgICBjb25zdCBzdGFydERhdGVBc0pTRGF0ZSA9IFRpbWVVdGlsLmRhdGUoaW50ZXJ2YWwuc3RhcnQpXG4gICAgICB0aGlzLnN0YXJ0RGF0ZS5zZXQoVGVtcG9yYWxVdGlsLmdldFBsYWluRGF0ZUZyb21KU0RhdGUoc3RhcnREYXRlQXNKU0RhdGUpKVxuICAgICAgdGhpcy5zdGFydFRpbWUuc2V0KFRlbXBvcmFsVXRpbC5nZXRQbGFpblRpbWVGcm9tSlNEYXRlKHN0YXJ0RGF0ZUFzSlNEYXRlKSlcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zdGFydERhdGUuc2V0KG51bGwpXG4gICAgfVxuXG4gICAgaWYgKGludGVydmFsLmVuZCkge1xuICAgICAgY29uc3QgZW5kRGF0ZUFzSlNEYXRlID0gVGltZVV0aWwuZGF0ZShpbnRlcnZhbC5lbmQpXG4gICAgICB0aGlzLmVuZERhdGUuc2V0KFRlbXBvcmFsVXRpbC5nZXRQbGFpbkRhdGVGcm9tSlNEYXRlKGVuZERhdGVBc0pTRGF0ZSkpXG4gICAgICB0aGlzLmVuZFRpbWUuc2V0KFRlbXBvcmFsVXRpbC5nZXRQbGFpblRpbWVGcm9tSlNEYXRlKGVuZERhdGVBc0pTRGF0ZSkpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZW5kRGF0ZS5zZXQobnVsbClcbiAgICB9XG5cbiAgICB0aGlzLmxvZy5kZWJ1ZyhgUHVsbGVkIGlucHV0IGludGVydmFsOmAsIGludGVydmFsKVxuICB9XG5cbiAgc2V0QW5jaG9yRGF0ZVRpbWVGcm9tSnNEYXRlKGRhdGVUaW1lOiBEYXRlKTogdm9pZCB7XG4gICAgaWYgKCFkYXRlVGltZSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGNvbnN0IGRhdGUgPSBUZW1wb3JhbFV0aWwuZ2V0UGxhaW5EYXRlRnJvbUpTRGF0ZShkYXRlVGltZSlcbiAgICBjb25zdCB0aW1lID0gVGVtcG9yYWxVdGlsLmdldFBsYWluVGltZUZyb21KU0RhdGUoZGF0ZVRpbWUpXG4gICAgdGhpcy5maXhlZEFuY2hvckRhdGUuc2V0KGRhdGUpXG4gICAgdGhpcy5maXhlZEFuY2hvclRpbWUuc2V0KHRpbWUpXG4gIH1cblxuICBzZXRGaXhlZEFuY2hvclBvaW50VG9TdGFydERhdGVUaW1lKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zdGFydERhdGUoKSkge1xuICAgICAgdGhpcy5yZXNldEZpeGVkQW5jaG9yUG9pbnQoKVxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmICh0aGlzLnN0YXJ0RGF0ZSgpKSB7XG4gICAgICB0aGlzLmZpeGVkQW5jaG9yRGF0ZS5zZXQodGhpcy5zdGFydERhdGUoKSlcbiAgICB9XG4gICAgaWYgKHRoaXMuc3RhcnRUaW1lKCkpIHtcbiAgICAgIHRoaXMuZml4ZWRBbmNob3JUaW1lLnNldCh0aGlzLnN0YXJ0VGltZSgpKVxuICAgIH1cbiAgfVxuXG4gIHNldEZpeGVkQW5jaG9yUG9pbnRUb0VuZERhdGVUaW1lKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5lbmREYXRlKCkpIHtcbiAgICAgIHRoaXMucmVzZXRGaXhlZEFuY2hvclBvaW50KClcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBpZiAodGhpcy5lbmREYXRlKCkpIHtcbiAgICAgIHRoaXMuZml4ZWRBbmNob3JEYXRlLnNldCh0aGlzLmVuZERhdGUoKSlcbiAgICB9XG4gICAgaWYgKHRoaXMuZW5kVGltZSgpKSB7XG4gICAgICB0aGlzLmZpeGVkQW5jaG9yVGltZS5zZXQodGhpcy5lbmRUaW1lKCkpXG4gICAgfVxuICB9XG5cbiAgcmVzZXRGaXhlZEFuY2hvclBvaW50KCk6IHZvaWQge1xuICAgIHRoaXMuZml4ZWRBbmNob3JEYXRlLnNldChudWxsKVxuICAgIHRoaXMuZml4ZWRBbmNob3JUaW1lLnNldChUZW1wb3JhbC5QbGFpblRpbWUuZnJvbSgnMDA6MDAnKSlcbiAgICBpZiAodGhpcy5pc1VwZGF0aW5nSW50ZXJ2YWxPbkFuY2hvckNoYW5nZSgpICYmIHRoaXMuaXNTdGFydEFuZEVuZERhdGVzU2V0KCkpIHtcbiAgICAgIHRoaXMuc2hpZnRSYW5nZUVuZFRvVG9kYXkoKVxuICAgIH1cbiAgfVxuXG4gIHNldEFuY2hvckRhdGVGcm9tRm9ybShkYXRlQXJnOiBMb2NhbERhdGUpOiB2b2lkIHtcbiAgICBpZiAoIWRhdGVBcmcpIHtcbiAgICAgIHRoaXMuZml4ZWRBbmNob3JEYXRlLnNldChudWxsKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QganNEYXRlID0gVGltZVV0aWwubG9jYWxEYXRlVG9EYXRlKGRhdGVBcmcpXG4gICAgY29uc3QgcGxhaW5EYXRlID0gVGVtcG9yYWxVdGlsLmdldFBsYWluRGF0ZUZyb21KU0RhdGUoanNEYXRlKVxuXG4gICAgaWYgKCFwbGFpbkRhdGUpIHtcbiAgICAgIHRoaXMubG9nLndhcm4oJ0ludmFsaWQgZGF0ZScsIHBsYWluRGF0ZSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuZml4ZWRBbmNob3JEYXRlLnNldChwbGFpbkRhdGUpXG5cbiAgICBpZiAoIXRoaXMuaXNVcGRhdGluZ0ludGVydmFsT25BbmNob3JDaGFuZ2UoKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZml4ZWRBbmNob3JEYXRlKCkpIHtcbiAgICAgIHRoaXMuc2hpZnRTZWxlY3Rpb25Ub0FuY2hvckRhdGUoKVxuICAgIH1cbiAgfVxuXG4gIGNsZWFyU3RhcnREYXRlVGltZSgpOiB2b2lkIHtcbiAgICB0aGlzLnN0YXJ0RGF0ZS5zZXQobnVsbClcbiAgICB0aGlzLnN0YXJ0VGltZS5zZXQobnVsbClcbiAgfVxuXG4gIGNsZWFyRW5kRGF0ZVRpbWUoKTogdm9pZCB7XG4gICAgdGhpcy5lbmREYXRlLnNldChudWxsKVxuICAgIHRoaXMuZW5kVGltZS5zZXQobnVsbClcbiAgfVxuXG4gIGNsZWFyU3RhcnRUaW1lKCk6IHZvaWQge1xuICAgIHRoaXMuc3RhcnRUaW1lLnNldChudWxsKVxuICB9XG5cbiAgY2xlYXJFbmRUaW1lKCk6IHZvaWQge1xuICAgIHRoaXMuZW5kVGltZS5zZXQobnVsbClcbiAgfVxuXG4gIHJlc2V0Rml4ZWRBbmNob3JUaW1lKCk6IHZvaWQge1xuICAgIHRoaXMuZml4ZWRBbmNob3JUaW1lLnNldChUZW1wb3JhbC5QbGFpblRpbWUuZnJvbSgnMDA6MDAnKSlcbiAgfVxuXG4gIHNldEFuY2hvclRpbWVGcm9tRm9ybShodG1sU3RyaW5nOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCB0aW1lID0gVGVtcG9yYWxVdGlsLmdldFBsYWluVGltZUZyb21IdG1sVGltZVN0cmluZyhodG1sU3RyaW5nKVxuICAgIGlmICghdGltZSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmZpeGVkQW5jaG9yRGF0ZSgpKSB7XG4gICAgICB0aGlzLmZpeGVkQW5jaG9yRGF0ZS5zZXQoVGVtcG9yYWwuTm93LnBsYWluRGF0ZUlTTygpKVxuICAgIH1cblxuICAgIHRoaXMuZml4ZWRBbmNob3JUaW1lLnNldCh0aW1lKVxuXG4gICAgaWYgKCF0aGlzLmlzVXBkYXRpbmdJbnRlcnZhbE9uQW5jaG9yQ2hhbmdlKCkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICh0aGlzLmZpeGVkQW5jaG9yVGltZSgpKSB7XG4gICAgICB0aGlzLnNoaWZ0U2VsZWN0aW9uVG9BbmNob3JUaW1lKClcbiAgICB9XG4gIH1cblxuICBlbWl0TWFpbkRhdGVzKCk6IHZvaWQge1xuICAgIGNvbnN0IGludGVydmFsID0gdGhpcy5jcmVhdGVFbGRlckludGVydmFsKClcbiAgICB0aGlzLl9kYXRlQ2hhbmdlRW1pdHRlci5lbWl0KGludGVydmFsKVxuICB9XG5cbiAgLy8gZGF0ZSBzaGlmdHNcbiAgc2hpZnREYXkoZGF5czogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5zZXREYXRlc0Zyb21SYW5nZSh0aGlzLmRhdGVSYW5nZSgpLnNoaWZ0RGF5cyhkYXlzKSlcbiAgICBpZiAodGhpcy5jYWxlbmRhck1vZGUoKSA9PT0gJ3dlZWtzJyAmJiAoZGF5cyA9PT0gNyB8fCBkYXlzID09PSAtNykpIHtcbiAgICAgIHRoaXMuY2FsZW5kYXJNb2RlLnNldCgnd2Vla3MnKVxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIHRoaXMuY2FsZW5kYXJNb2RlLnNldCgnZGF5cycpXG4gIH1cblxuICBzaGlmdE1vbnRoKG1vbnRoczogbnVtYmVyLCBzdGF0aWNNb2RlID0gZmFsc2UpOiB2b2lkIHtcbiAgICB0aGlzLnNldERhdGVzRnJvbVJhbmdlKHRoaXMuZGF0ZVJhbmdlKCkuc2hpZnRNb250aHMobW9udGhzKSlcbiAgICBpZiAoc3RhdGljTW9kZSAmJiB0aGlzLmNhbGVuZGFyTW9kZSgpICE9PSAnbW9udGhzJykge1xuICAgICAgdGhpcy5jYWxlbmRhck1vZGUuc2V0KCdkYXlzJylcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICB0aGlzLnJlc2V0VGltZVJhbmdlKClcbiAgICB0aGlzLmNhbGVuZGFyTW9kZS5zZXQoJ21vbnRocycpXG4gIH1cblxuICBzaGlmdFllYXIoeWVhcnM6IG51bWJlciwgc3RhdGljTW9kZSA9IGZhbHNlKTogdm9pZCB7XG4gICAgdGhpcy5zZXREYXRlc0Zyb21SYW5nZSh0aGlzLmRhdGVSYW5nZSgpLnNoaWZ0WWVhcnMoeWVhcnMpKVxuICAgIGlmIChzdGF0aWNNb2RlICYmIHRoaXMuY2FsZW5kYXJNb2RlKCkgIT09ICd5ZWFycycpIHtcbiAgICAgIHRoaXMuY2FsZW5kYXJNb2RlLnNldCgnZGF5cycpXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgdGhpcy5yZXNldFRpbWVSYW5nZSgpXG4gICAgdGhpcy5jYWxlbmRhck1vZGUuc2V0KCd5ZWFycycpXG4gIH1cblxuICBzaGlmdFRpbWUoYW1vdW50OiBudW1iZXIsIHVuaXQ6ICdob3VycycgfCAnbWludXRlcycpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXNTdGFydEFuZEVuZERhdGVzU2V0KCkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IG5ld1N0YXJ0RGF0ZVRpbWUgPSB0aGlzLnN0YXJ0RGF0ZVRpbWUoKS5hZGQoeyBbdW5pdF06IGFtb3VudCB9KVxuICAgIGNvbnN0IG5ld0VuZERhdGVUaW1lID0gdGhpcy5lbmREYXRlVGltZSgpLmFkZCh7IFt1bml0XTogYW1vdW50IH0pXG5cbiAgICB0aGlzLnN0YXJ0RGF0ZS5zZXQoVGVtcG9yYWwuUGxhaW5EYXRlLmZyb20obmV3U3RhcnREYXRlVGltZSkpXG4gICAgdGhpcy5zdGFydFRpbWUuc2V0KFRlbXBvcmFsLlBsYWluVGltZS5mcm9tKG5ld1N0YXJ0RGF0ZVRpbWUgYXMgVGVtcG9yYWwuUGxhaW5EYXRlVGltZSkpXG5cbiAgICB0aGlzLmVuZERhdGUuc2V0KFRlbXBvcmFsLlBsYWluRGF0ZS5mcm9tKG5ld0VuZERhdGVUaW1lKSlcbiAgICB0aGlzLmVuZFRpbWUuc2V0KFRlbXBvcmFsLlBsYWluVGltZS5mcm9tKG5ld0VuZERhdGVUaW1lIGFzIFRlbXBvcmFsLlBsYWluRGF0ZVRpbWUpKVxuICB9XG5cbiAgc21hcnRTaGlmdChkaXJlY3Rpb24gPSAxKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY2FsZW5kYXJNb2RlKCkgPT09ICdxdWFydGVycycpIHtcbiAgICAgIGNvbnN0IG5ld1JhbmdlID0gdGhpcy5kYXRlUmFuZ2UoKS5zaGlmdE1vbnRocyhkaXJlY3Rpb24gKiAzKVxuICAgICAgdGhpcy5zZXREYXRlc0Zyb21SYW5nZShuZXdSYW5nZSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICh0aGlzLmNhbGVuZGFyTW9kZSgpID09PSAnbW9udGhzJykge1xuICAgICAgY29uc3QgbmV3UmFuZ2UgPSB0aGlzLmRhdGVSYW5nZSgpLnNoaWZ0TW9udGhzKGRpcmVjdGlvbilcbiAgICAgIHRoaXMuc2V0RGF0ZXNGcm9tUmFuZ2UobmV3UmFuZ2UpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAodGhpcy5jYWxlbmRhck1vZGUoKSA9PT0gJ3llYXJzJykge1xuICAgICAgY29uc3QgbmV3UmFuZ2UgPSB0aGlzLmRhdGVSYW5nZSgpLnNoaWZ0WWVhcnMoZGlyZWN0aW9uKVxuICAgICAgdGhpcy5zZXREYXRlc0Zyb21SYW5nZShuZXdSYW5nZSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICh0aGlzLmNhbGVuZGFyTW9kZSgpID09PSAnd2Vla3MnKSB7XG4gICAgICBjb25zdCBuZXdSYW5nZSA9IHRoaXMuZGF0ZVJhbmdlKCkuc2hpZnREYXlzKDcgKiBkaXJlY3Rpb24pXG4gICAgICB0aGlzLnNldERhdGVzRnJvbVJhbmdlKG5ld1JhbmdlKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgZGF5c0RpZmYgPSB0aGlzLmRhdGVSYW5nZSgpLmdldER1cmF0aW9uSW5EYXlzKClcbiAgICBjb25zdCBuZXdSYW5nZSA9IHRoaXMuZGF0ZVJhbmdlKCkuc2hpZnREYXlzKGRheXNEaWZmICogZGlyZWN0aW9uKVxuICAgIHRoaXMuc2V0RGF0ZXNGcm9tUmFuZ2UobmV3UmFuZ2UpXG4gIH1cblxuICAvLyB0aW1lIHJhbmdlIHNlbGVjdGlvbnNcbiAgc2VsZWN0TGFzdEhvdXIoKTogdm9pZCB7XG4gICAgdGhpcy5yZWZyZXNoQmFzZVJlZmVyZW5jZURhdGVUaW1lKClcblxuICAgIGNvbnN0IGVuZCA9IHRoaXMuYW5jaG9yRGF0ZVRpbWUoKVxuICAgIGNvbnN0IHN0YXJ0ID0gZW5kLnN1YnRyYWN0KHsgaG91cnM6IDEgfSlcbiAgICB0aGlzLmVuZERhdGUuc2V0KHRoaXMuYW5jaG9yRGF0ZSgpKVxuICAgIHRoaXMuZW5kVGltZS5zZXQodGhpcy5hbmNob3JUaW1lKCkpXG5cbiAgICBjb25zdCBzdGFydFBsYWluRGF0ZSA9IFRlbXBvcmFsLlBsYWluRGF0ZS5mcm9tKHN0YXJ0KVxuICAgIGNvbnN0IHN0YXJ0UGxhaW5UaW1lID0gVGVtcG9yYWwuUGxhaW5UaW1lLmZyb20oc3RhcnQpXG4gICAgdGhpcy5zdGFydERhdGUuc2V0KHN0YXJ0UGxhaW5EYXRlKVxuICAgIHRoaXMuc3RhcnRUaW1lLnNldChzdGFydFBsYWluVGltZSlcblxuICAgIHRoaXMuY2FsZW5kYXJNb2RlLnNldCgnZGF5cycpXG4gIH1cblxuICBzZWxlY3RMYXN0MjRIb3VycygpOiB2b2lkIHtcbiAgICB0aGlzLnJlZnJlc2hCYXNlUmVmZXJlbmNlRGF0ZVRpbWUoKVxuXG4gICAgY29uc3QgZW5kID0gdGhpcy5hbmNob3JEYXRlVGltZSgpXG4gICAgY29uc3Qgc3RhcnQgPSBlbmQuc3VidHJhY3QoeyBkYXlzOiAxIH0pXG4gICAgdGhpcy5lbmREYXRlLnNldCh0aGlzLmFuY2hvckRhdGUoKSlcbiAgICB0aGlzLmVuZFRpbWUuc2V0KHRoaXMuYW5jaG9yVGltZSgpKVxuXG4gICAgY29uc3Qgc3RhcnRQbGFpbkRhdGUgPSBUZW1wb3JhbC5QbGFpbkRhdGUuZnJvbShzdGFydClcblxuICAgIGNvbnN0IHN0YXJ0UGxhaW5UaW1lID0gVGVtcG9yYWwuUGxhaW5UaW1lLmZyb20oc3RhcnQpXG4gICAgdGhpcy5zdGFydERhdGUuc2V0KHN0YXJ0UGxhaW5EYXRlKVxuICAgIHRoaXMuc3RhcnRUaW1lLnNldChzdGFydFBsYWluVGltZSlcblxuICAgIHRoaXMuY2FsZW5kYXJNb2RlLnNldCgnZGF5cycpXG4gIH1cblxuICBzZWxlY3RMYXN0Rml2ZU1pbnV0ZXMoKTogdm9pZCB7XG4gICAgdGhpcy5yZWZyZXNoQmFzZVJlZmVyZW5jZURhdGVUaW1lKClcblxuICAgIGNvbnN0IGVuZCA9IHRoaXMuYW5jaG9yRGF0ZVRpbWUoKVxuICAgIGNvbnN0IHN0YXJ0ID0gZW5kLnN1YnRyYWN0KHsgbWludXRlczogNSB9KVxuICAgIHRoaXMuZW5kRGF0ZS5zZXQodGhpcy5hbmNob3JEYXRlKCkpXG4gICAgdGhpcy5lbmRUaW1lLnNldCh0aGlzLmFuY2hvclRpbWUoKSlcblxuICAgIGNvbnN0IHN0YXJ0UGxhaW5EYXRlID0gVGVtcG9yYWwuUGxhaW5EYXRlLmZyb20oc3RhcnQpXG4gICAgY29uc3Qgc3RhcnRQbGFpblRpbWUgPSBUZW1wb3JhbC5QbGFpblRpbWUuZnJvbShzdGFydClcbiAgICB0aGlzLnN0YXJ0RGF0ZS5zZXQoc3RhcnRQbGFpbkRhdGUpXG4gICAgdGhpcy5zdGFydFRpbWUuc2V0KHN0YXJ0UGxhaW5UaW1lKVxuXG4gICAgdGhpcy5jYWxlbmRhck1vZGUuc2V0KCdkYXlzJylcbiAgfVxuXG4gIC8vIGRhdGUgcmFuZ2Ugc2VsZWN0aW9uc1xuICBzZWxlY3RDdXJyZW50RGF5KCk6IHZvaWQge1xuICAgIHRoaXMuc2V0RGF0ZXNGcm9tUmFuZ2UoVGVtcG9yYWxVdGlsLmdldEN1cnJlbnREYXkodGhpcy5hbmNob3JEYXRlKCkpKVxuICAgIHRoaXMuY2FsZW5kYXJNb2RlLnNldCgnZGF5cycpXG4gICAgdGhpcy5yZXNldFRpbWVSYW5nZSgpXG4gIH1cblxuICBzZWxlY3RZZXN0ZXJkYXkoKTogdm9pZCB7XG4gICAgdGhpcy5zZXREYXRlc0Zyb21SYW5nZShUZW1wb3JhbFV0aWwuZ2V0WWVzdGVyZGF5KHRoaXMuYW5jaG9yRGF0ZSgpKSlcbiAgICB0aGlzLmNhbGVuZGFyTW9kZS5zZXQoJ2RheXMnKVxuICAgIHRoaXMucmVzZXRUaW1lUmFuZ2UoKVxuICB9XG5cbiAgc2VsZWN0Q3VycmVudFdlZWsoKTogdm9pZCB7XG4gICAgdGhpcy5zZXREYXRlc0Zyb21SYW5nZShUZW1wb3JhbFV0aWwuZ2V0Q3VycmVudFdlZWsodGhpcy5hbmNob3JEYXRlKCkpKVxuICAgIHRoaXMuY2FsZW5kYXJNb2RlLnNldCgnd2Vla3MnKVxuICAgIHRoaXMucmVzZXRUaW1lUmFuZ2UoKVxuICB9XG5cbiAgc2VsZWN0UHJldmlvdXNXZWVrKCk6IHZvaWQge1xuICAgIHRoaXMuc2V0RGF0ZXNGcm9tUmFuZ2UoVGVtcG9yYWxVdGlsLmdldFByZXZpb3VzV2Vlayh0aGlzLmFuY2hvckRhdGUoKSkpXG4gICAgdGhpcy5jYWxlbmRhck1vZGUuc2V0KCd3ZWVrcycpXG4gICAgdGhpcy5yZXNldFRpbWVSYW5nZSgpXG4gIH1cblxuICBzZWxlY3RMYXN0U2V2ZW5EYXlzRXhjbHVkaW5nVG9kYXkoKTogdm9pZCB7XG4gICAgdGhpcy5zZXREYXRlc0Zyb21SYW5nZShUZW1wb3JhbFV0aWwuZ2V0TGFzdFNldmVuRGF5cyh0aGlzLmFuY2hvckRhdGUoKSkpXG4gICAgdGhpcy5jYWxlbmRhck1vZGUuc2V0KCdkYXlzJylcbiAgICB0aGlzLnJlc2V0VGltZVJhbmdlKClcbiAgfVxuXG4gIHNlbGVjdExhc3RTZXZlbkRheXNJbmNsdWRpbmdUb2RheSgpOiB2b2lkIHtcbiAgICB0aGlzLnNldERhdGVzRnJvbVJhbmdlKFRlbXBvcmFsVXRpbC5nZXRMYXN0U2V2ZW5EYXlzSW5jbHVkaW5nVG9kYXkodGhpcy5hbmNob3JEYXRlKCkpKVxuICAgIHRoaXMuY2FsZW5kYXJNb2RlLnNldCgnZGF5cycpXG4gICAgdGhpcy5yZXNldFRpbWVSYW5nZSgpXG4gIH1cblxuICBzZWxlY3RDdXJyZW50TW9udGgoKTogdm9pZCB7XG4gICAgdGhpcy5zZXREYXRlc0Zyb21SYW5nZShUZW1wb3JhbFV0aWwuZ2V0Q3VycmVudE1vbnRoKHRoaXMuYW5jaG9yRGF0ZSgpKSlcbiAgICB0aGlzLmNhbGVuZGFyTW9kZS5zZXQoJ21vbnRocycpXG4gICAgdGhpcy5yZXNldFRpbWVSYW5nZSgpXG4gIH1cblxuICBzZWxlY3RQcmV2aW91c01vbnRoKCk6IHZvaWQge1xuICAgIHRoaXMuc2V0RGF0ZXNGcm9tUmFuZ2UoVGVtcG9yYWxVdGlsLmdldFByZXZpb3VzTW9udGgodGhpcy5hbmNob3JEYXRlKCkpKVxuICAgIHRoaXMuY2FsZW5kYXJNb2RlLnNldCgnbW9udGhzJylcbiAgICB0aGlzLnJlc2V0VGltZVJhbmdlKClcbiAgfVxuXG4gIHNlbGVjdExhc3RUaGlydHlEYXlzRXhjbHVkaW5nVG9kYXkoKTogdm9pZCB7XG4gICAgdGhpcy5zZXREYXRlc0Zyb21SYW5nZShUZW1wb3JhbFV0aWwuZ2V0TGFzdFRoaXJ0eURheXModGhpcy5hbmNob3JEYXRlKCkpKVxuICAgIHRoaXMuY2FsZW5kYXJNb2RlLnNldCgnZGF5cycpXG4gICAgdGhpcy5yZXNldFRpbWVSYW5nZSgpXG4gIH1cblxuICBzZWxlY3RMYXN0VGhpcnR5RGF5c0luY2x1ZGluZ1RvZGF5KCk6IHZvaWQge1xuICAgIHRoaXMuc2V0RGF0ZXNGcm9tUmFuZ2UoVGVtcG9yYWxVdGlsLmdldExhc3RUaGlydHlEYXlzSW5jbHVkaW5nVG9kYXkodGhpcy5hbmNob3JEYXRlKCkpKVxuICAgIHRoaXMuY2FsZW5kYXJNb2RlLnNldCgnZGF5cycpXG4gICAgdGhpcy5yZXNldFRpbWVSYW5nZSgpXG4gIH1cblxuICBzZWxlY3RDdXJyZW50WWVhcigpOiB2b2lkIHtcbiAgICB0aGlzLnNldERhdGVzRnJvbVJhbmdlKFRlbXBvcmFsVXRpbC5nZXRDdXJyZW50WWVhcih0aGlzLmFuY2hvckRhdGUoKSkpXG4gICAgdGhpcy5jYWxlbmRhck1vZGUuc2V0KCd5ZWFycycpXG4gICAgdGhpcy5yZXNldFRpbWVSYW5nZSgpXG4gIH1cblxuICBzZWxlY3RQcmV2aW91c1llYXIoKTogdm9pZCB7XG4gICAgdGhpcy5zZXREYXRlc0Zyb21SYW5nZShUZW1wb3JhbFV0aWwuZ2V0UHJldmlvdXNZZWFyKHRoaXMuYW5jaG9yRGF0ZSgpKSlcbiAgICB0aGlzLmNhbGVuZGFyTW9kZS5zZXQoJ3llYXJzJylcbiAgICB0aGlzLnJlc2V0VGltZVJhbmdlKClcbiAgfVxuXG4gIHNlbGVjdExhc3QzNjVEYXlzKCk6IHZvaWQge1xuICAgIHRoaXMuc2V0RGF0ZXNGcm9tUmFuZ2UoVGVtcG9yYWxVdGlsLmdldExhc3QzNjVEYXlzKHRoaXMuYW5jaG9yRGF0ZSgpKSlcbiAgICB0aGlzLmNhbGVuZGFyTW9kZS5zZXQoJ2RheXMnKVxuICAgIHRoaXMucmVzZXRUaW1lUmFuZ2UoKVxuICB9XG5cbiAgc2VsZWN0Q3VycmVudFF1YXJ0ZXIoKTogdm9pZCB7XG4gICAgdGhpcy5zZXREYXRlc0Zyb21SYW5nZShUZW1wb3JhbFV0aWwuZ2V0Q3VycmVudFF1YXJ0ZXIodGhpcy5hbmNob3JEYXRlKCkpKVxuICAgIHRoaXMuY2FsZW5kYXJNb2RlLnNldCgncXVhcnRlcnMnKVxuICAgIHRoaXMucmVzZXRUaW1lUmFuZ2UoKVxuICB9XG5cbiAgc2VsZWN0UHJldmlvdXNRdWFydGVyKCk6IHZvaWQge1xuICAgIHRoaXMuc2V0RGF0ZXNGcm9tUmFuZ2UoVGVtcG9yYWxVdGlsLmdldFByZXZpb3VzUXVhcnRlcih0aGlzLmFuY2hvckRhdGUoKSkpXG4gICAgdGhpcy5jYWxlbmRhck1vZGUuc2V0KCdxdWFydGVycycpXG4gICAgdGhpcy5yZXNldFRpbWVSYW5nZSgpXG4gIH1cblxuICAvLyBBbmNob3IgcG9pbnQgc2hpZnQgc2VsZWN0aW9uc1xuICBwcml2YXRlIHNoaWZ0U2VsZWN0aW9uVG9BbmNob3JEYXRlKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pc1N0YXJ0QW5kRW5kRGF0ZXNTZXQoKSB8fCAhdGhpcy5maXhlZEFuY2hvckRhdGUoKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgcmFuZ2UgPSBuZXcgVGVtcG9yYWxQbGFpbkRhdGVJbnRlcnZhbCh0aGlzLnN0YXJ0RGF0ZSgpLCB0aGlzLmVuZERhdGUoKSlcbiAgICBjb25zdCBlbmREYXRlID0gdGhpcy5maXhlZEFuY2hvckRhdGUoKVxuICAgIGNvbnN0IHN0YXJ0RGF0ZSA9IGVuZERhdGUuc3VidHJhY3QoeyBkYXlzOiByYW5nZS5nZXREdXJhdGlvbkluRGF5cygpIH0pXG4gICAgdGhpcy5zdGFydERhdGUuc2V0KHN0YXJ0RGF0ZSlcbiAgICB0aGlzLmVuZERhdGUuc2V0KGVuZERhdGUpXG5cbiAgICBpZiAodGhpcy5jYWxlbmRhck1vZGUoKSA9PT0gJ21vbnRocycpIHtcbiAgICAgIHRoaXMuc2VsZWN0Q3VycmVudE1vbnRoKClcbiAgICB9XG4gICAgaWYgKHRoaXMuY2FsZW5kYXJNb2RlKCkgPT09ICd5ZWFycycpIHtcbiAgICAgIHRoaXMuc2VsZWN0Q3VycmVudFllYXIoKVxuICAgIH1cbiAgICBpZiAodGhpcy5jYWxlbmRhck1vZGUoKSA9PT0gJ3dlZWtzJykge1xuICAgICAgdGhpcy5zZWxlY3RDdXJyZW50V2VlaygpXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzaGlmdFNlbGVjdGlvblRvQW5jaG9yVGltZSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXNTdGFydEFuZEVuZERhdGVzU2V0KCkgfHwgIXRoaXMuZml4ZWRBbmNob3JUaW1lKCkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGR1cmF0aW9uID0gdGhpcy5zdGFydERhdGVUaW1lKCkudW50aWwodGhpcy5lbmREYXRlVGltZSgpKVxuICAgIGNvbnN0IG5ld1N0YXJ0RGF0ZVRpbWUgPSB0aGlzLmFuY2hvckRhdGVUaW1lKCkuc3VidHJhY3QoZHVyYXRpb24pXG4gICAgY29uc3QgbmV3RW5kRGF0ZVRpbWUgPSB0aGlzLmFuY2hvckRhdGVUaW1lKClcbiAgICB0aGlzLnN0YXJ0RGF0ZS5zZXQoVGVtcG9yYWwuUGxhaW5EYXRlLmZyb20obmV3U3RhcnREYXRlVGltZSkpXG4gICAgdGhpcy5zdGFydFRpbWUuc2V0KFRlbXBvcmFsLlBsYWluVGltZS5mcm9tKG5ld1N0YXJ0RGF0ZVRpbWUpKVxuICAgIHRoaXMuZW5kRGF0ZS5zZXQoVGVtcG9yYWwuUGxhaW5EYXRlLmZyb20obmV3RW5kRGF0ZVRpbWUpKVxuICAgIHRoaXMuZW5kVGltZS5zZXQoVGVtcG9yYWwuUGxhaW5UaW1lLmZyb20obmV3RW5kRGF0ZVRpbWUpKVxuXG4gICAgaWYgKHRoaXMuY2FsZW5kYXJNb2RlKCkgPT09ICdtb250aHMnKSB7XG4gICAgICB0aGlzLnNlbGVjdEN1cnJlbnRNb250aCgpXG4gICAgfVxuICAgIGlmICh0aGlzLmNhbGVuZGFyTW9kZSgpID09PSAneWVhcnMnKSB7XG4gICAgICB0aGlzLnNlbGVjdEN1cnJlbnRZZWFyKClcbiAgICB9XG4gICAgaWYgKHRoaXMuY2FsZW5kYXJNb2RlKCkgPT09ICd3ZWVrcycpIHtcbiAgICAgIHRoaXMuc2VsZWN0Q3VycmVudFdlZWsoKVxuICAgIH1cbiAgfVxuXG4gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKiBQcml2YXRlIG1ldGhvZHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4gIHByaXZhdGUgY3JlYXRlRWxkZXJJbnRlcnZhbCgpOiBJbnRlcnZhbCB7XG4gICAgbGV0IHN0YXJ0LFxuICAgICAgZW5kID0gbnVsbFxuICAgIGlmICh0aGlzLnN0YXJ0RGF0ZVRpbWUoKSkge1xuICAgICAgY29uc3QganNEYXRlID0gVGVtcG9yYWxVdGlsLmdldEpTRGF0ZUZyb21QbGFpbkRhdGVUaW1lKHRoaXMuc3RhcnREYXRlVGltZSgpKVxuICAgICAgc3RhcnQgPSBUaW1lVXRpbC5pbnN0YW50KGpzRGF0ZSlcbiAgICB9XG4gICAgaWYgKHRoaXMuZW5kRGF0ZVRpbWUoKSkge1xuICAgICAgY29uc3QganNEYXRlID0gVGVtcG9yYWxVdGlsLmdldEpTRGF0ZUZyb21QbGFpbkRhdGVUaW1lKHRoaXMuZW5kRGF0ZVRpbWUoKSlcbiAgICAgIGVuZCA9IFRpbWVVdGlsLmluc3RhbnQoanNEYXRlKVxuICAgIH1cbiAgICBpZiAoIXN0YXJ0ICYmICFlbmQpIHtcbiAgICAgIHJldHVybiBuZXcgSW50ZXJ2YWwobnVsbCwgbnVsbClcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBJbnRlcnZhbChzdGFydCwgZW5kKVxuICB9XG5cbiAgcHJpdmF0ZSBzZXREYXRlc0Zyb21SYW5nZShyYW5nZTogVGVtcG9yYWxQbGFpbkRhdGVJbnRlcnZhbCk6IHZvaWQge1xuICAgIHRoaXMuc3RhcnREYXRlLnNldChyYW5nZS5zdGFydClcbiAgICB0aGlzLmVuZERhdGUuc2V0KHJhbmdlLmVuZClcbiAgfVxuXG4gIHByaXZhdGUgcmVmcmVzaEJhc2VSZWZlcmVuY2VEYXRlVGltZSgpOiB2b2lkIHtcbiAgICBjb25zdCBkYXRlVGltZSA9IFRlbXBvcmFsLk5vdy56b25lZERhdGVUaW1lSVNPKClcbiAgICBjb25zdCBkYXRlID0gVGVtcG9yYWwuUGxhaW5EYXRlLmZyb20oZGF0ZVRpbWUpXG4gICAgY29uc3QgdGltZSA9IFRlbXBvcmFsLlBsYWluVGltZS5mcm9tKGRhdGVUaW1lKVxuICAgIHRoaXMuYmFzZVJlZmVyZW5jZURhdGUuc2V0KGRhdGUpXG4gICAgdGhpcy5iYXNlUmVmZXJlbmNlVGltZS5zZXQodGltZSlcbiAgfVxuXG4gIHByaXZhdGUgcmVzZXRUaW1lUmFuZ2UoKTogdm9pZCB7XG4gICAgdGhpcy5zdGFydFRpbWUuc2V0KFRlbXBvcmFsLlBsYWluVGltZS5mcm9tKCcwMDowMCcpKVxuICAgIHRoaXMuZW5kVGltZS5zZXQoVGVtcG9yYWwuUGxhaW5UaW1lLmZyb20oJzAwOjAwJykpXG4gIH1cblxuICBwcml2YXRlIHNoaWZ0UmFuZ2VFbmRUb1RvZGF5KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pc1N0YXJ0QW5kRW5kRGF0ZXNTZXQoKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGNvbnN0IGR1cmF0aW9uID0gdGhpcy5zdGFydERhdGUoKS51bnRpbCh0aGlzLmVuZERhdGUoKSlcbiAgICB0aGlzLmVuZERhdGUuc2V0KFRlbXBvcmFsLk5vdy5wbGFpbkRhdGVJU08oKSlcbiAgICB0aGlzLnN0YXJ0RGF0ZS5zZXQodGhpcy5lbmREYXRlKCkuc3VidHJhY3QoZHVyYXRpb24pKVxuICB9XG5cbiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqIEVmZmVjdHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbiAgcHJpdmF0ZSByZWFkb25seSBfYXV0b0VtaXRPbkRhdGVUaW1lc0NoYW5nZUVmZmVjdDogRWZmZWN0UmVmID0gZWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBzdGFydERhdGVUaW1lID0gdGhpcy5zdGFydERhdGVUaW1lKClcbiAgICBjb25zdCBlbmREYXRlVGltZSA9IHRoaXMuZW5kRGF0ZVRpbWUoKVxuXG4gICAgaWYgKHRoaXMuaXNFbWl0dGluZ09uQ2hhbmdlKCkpIHtcbiAgICAgIHRoaXMuZW1pdE1haW5EYXRlcygpXG4gICAgfVxuICB9KVxufVxuIl19