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