@c8y/ngx-components 1021.11.1 → 1021.21.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 (434) hide show
  1. package/alarms/alarms-date-filter.component.d.ts +34 -0
  2. package/alarms/alarms-date-filter.component.d.ts.map +1 -0
  3. package/alarms/alarms-filter.component.d.ts +2 -1
  4. package/alarms/alarms-filter.component.d.ts.map +1 -1
  5. package/alarms/alarms-list.component.d.ts +2 -17
  6. package/alarms/alarms-list.component.d.ts.map +1 -1
  7. package/alarms/alarms-view.service.d.ts +5 -2
  8. package/alarms/alarms-view.service.d.ts.map +1 -1
  9. package/alarms/alarms.component.d.ts +3 -1
  10. package/alarms/alarms.component.d.ts.map +1 -1
  11. package/alarms/alarms.model.d.ts +47 -1
  12. package/alarms/alarms.model.d.ts.map +1 -1
  13. package/alarms/alarms.module.d.ts +15 -13
  14. package/alarms/alarms.module.d.ts.map +1 -1
  15. package/branding/shared/data/store-branding.service.d.ts +5 -0
  16. package/branding/shared/data/store-branding.service.d.ts.map +1 -1
  17. package/branding/shared/lazy/branding/branding.component.d.ts.map +1 -1
  18. package/context-dashboard/context-dashboard.model.d.ts +1 -0
  19. package/context-dashboard/context-dashboard.model.d.ts.map +1 -1
  20. package/context-dashboard/context-dashboard.service.d.ts +7 -5
  21. package/context-dashboard/context-dashboard.service.d.ts.map +1 -1
  22. package/context-dashboard/dashboard-detail.component.d.ts +4 -7
  23. package/context-dashboard/dashboard-detail.component.d.ts.map +1 -1
  24. package/context-dashboard/dashboard-detail.service.d.ts +4 -4
  25. package/context-dashboard/dashboard-detail.service.d.ts.map +1 -1
  26. package/context-dashboard/dashboard-settings/dashboard-general-settings.component.d.ts +2 -2
  27. package/context-dashboard/dashboard-settings/dashboard-general-settings.component.d.ts.map +1 -1
  28. package/context-dashboard/dashboard-settings/typed-dashboard-settings.component.d.ts +19 -6
  29. package/context-dashboard/dashboard-settings/typed-dashboard-settings.component.d.ts.map +1 -1
  30. package/core/action-bar/action-bar-item.component.d.ts +1 -1
  31. package/core/action-bar/action-bar-item.component.d.ts.map +1 -1
  32. package/core/action-bar/action-bar.module.d.ts +6 -6
  33. package/core/action-bar/action-bar.module.d.ts.map +1 -1
  34. package/core/bootstrap/bootstrap.component.d.ts +3 -1
  35. package/core/bootstrap/bootstrap.component.d.ts.map +1 -1
  36. package/core/common/aggregation/aggregation.model.d.ts +39 -0
  37. package/core/common/aggregation/aggregation.model.d.ts.map +1 -0
  38. package/core/common/aggregation/aggregation.service.d.ts +17 -0
  39. package/core/common/aggregation/aggregation.service.d.ts.map +1 -0
  40. package/core/common/index.d.ts +4 -0
  41. package/core/common/index.d.ts.map +1 -1
  42. package/core/common/inter-app.service.d.ts +48 -0
  43. package/core/common/inter-app.service.d.ts.map +1 -0
  44. package/core/common/interval-based-reload.abstract.d.ts +120 -0
  45. package/core/common/interval-based-reload.abstract.d.ts.map +1 -0
  46. package/core/dashboard/dashboard.module.d.ts +26 -20
  47. package/core/dashboard/dashboard.module.d.ts.map +1 -1
  48. package/core/dashboard/index.d.ts +3 -0
  49. package/core/dashboard/index.d.ts.map +1 -1
  50. package/core/dashboard/widget-auto-refresh-context/auto-refresh-control.component.d.ts +31 -0
  51. package/core/dashboard/widget-auto-refresh-context/auto-refresh-control.component.d.ts.map +1 -0
  52. package/core/dashboard/widget-auto-refresh-context/auto-refresh-select-control.component.d.ts +17 -0
  53. package/core/dashboard/widget-auto-refresh-context/auto-refresh-select-control.component.d.ts.map +1 -0
  54. package/core/dashboard/widget-auto-refresh-context/global-refresh-loading.operator.d.ts +4 -0
  55. package/core/dashboard/widget-auto-refresh-context/global-refresh-loading.operator.d.ts.map +1 -0
  56. package/core/dashboard/widget-auto-refresh-context/index.d.ts +8 -0
  57. package/core/dashboard/widget-auto-refresh-context/index.d.ts.map +1 -0
  58. package/core/dashboard/widget-auto-refresh-context/widget-auto-refresh-context-icon-bar.component.d.ts +7 -0
  59. package/core/dashboard/widget-auto-refresh-context/widget-auto-refresh-context-icon-bar.component.d.ts.map +1 -0
  60. package/core/dashboard/widget-auto-refresh-context/widget-auto-refresh-context.component.d.ts +29 -0
  61. package/core/dashboard/widget-auto-refresh-context/widget-auto-refresh-context.component.d.ts.map +1 -0
  62. package/core/dashboard/widget-auto-refresh-context/widget-auto-refresh-context.model.d.ts +15 -0
  63. package/core/dashboard/widget-auto-refresh-context/widget-auto-refresh-context.model.d.ts.map +1 -0
  64. package/core/dashboard/widget-auto-refresh-context/widget-global-auto-refresh.service.d.ts +169 -0
  65. package/core/dashboard/widget-auto-refresh-context/widget-global-auto-refresh.service.d.ts.map +1 -0
  66. package/core/dashboard/widget-change-event.model.d.ts +1 -1
  67. package/core/dashboard/widget-change-event.model.d.ts.map +1 -1
  68. package/core/dashboard/widgets-dashboard.component.d.ts +6 -3
  69. package/core/dashboard/widgets-dashboard.component.d.ts.map +1 -1
  70. package/core/dashboard/wiget-time-context/aggregation-picker/aggregation-picker.component.d.ts +2 -2
  71. package/core/dashboard/wiget-time-context/aggregation-picker/aggregation-picker.component.d.ts.map +1 -1
  72. package/core/dashboard/wiget-time-context/widget-time-context-helper.service.d.ts +2 -1
  73. package/core/dashboard/wiget-time-context/widget-time-context-helper.service.d.ts.map +1 -1
  74. package/core/dashboard/wiget-time-context/widget-time-context-icon-bar/widget-time-context-icon-bar.component.d.ts +1 -1
  75. package/core/dashboard/wiget-time-context/widget-time-context-icon-bar/widget-time-context-icon-bar.component.d.ts.map +1 -1
  76. package/core/dashboard/wiget-time-context/widget-time-context-query.service.d.ts.map +1 -1
  77. package/core/dashboard/wiget-time-context/widget-time-context.component.d.ts +12 -8
  78. package/core/dashboard/wiget-time-context/widget-time-context.component.d.ts.map +1 -1
  79. package/core/dashboard/wiget-time-context/widget-time-context.model.d.ts +7 -26
  80. package/core/dashboard/wiget-time-context/widget-time-context.model.d.ts.map +1 -1
  81. package/core/date-time-picker/date-time-picker.component.d.ts.map +1 -1
  82. package/core/header/header.module.d.ts +18 -18
  83. package/core/header/header.module.d.ts.map +1 -1
  84. package/core/header/title/title.component.d.ts +1 -1
  85. package/core/header/title/title.component.d.ts.map +1 -1
  86. package/core/i18n/cached-locale-dictionary.service.d.ts +5 -1
  87. package/core/i18n/cached-locale-dictionary.service.d.ts.map +1 -1
  88. package/core/i18n/i18n.module.d.ts +0 -4
  89. package/core/i18n/i18n.module.d.ts.map +1 -1
  90. package/core/i18n/index.d.ts +2 -1
  91. package/core/i18n/index.d.ts.map +1 -1
  92. package/core/i18n/translation-loader.service.d.ts +50 -0
  93. package/core/i18n/translation-loader.service.d.ts.map +1 -0
  94. package/core/i18n/translation-utils.d.ts +14 -0
  95. package/core/i18n/translation-utils.d.ts.map +1 -0
  96. package/core/plugins/plugins-resolve.service.d.ts +7 -10
  97. package/core/plugins/plugins-resolve.service.d.ts.map +1 -1
  98. package/datapoint-selector/datapoint-attributes-form/datapoint-attributes-form-validation.service.d.ts +2 -1
  99. package/datapoint-selector/datapoint-attributes-form/datapoint-attributes-form-validation.service.d.ts.map +1 -1
  100. package/datapoint-selector/datapoint-attributes-form/datapoint-attributes-form.component.d.ts +11 -2
  101. package/datapoint-selector/datapoint-attributes-form/datapoint-attributes-form.component.d.ts.map +1 -1
  102. package/datapoint-selector/datapoint-selection.model.d.ts +6 -0
  103. package/datapoint-selector/datapoint-selection.model.d.ts.map +1 -1
  104. package/datapoints-export-selector/c8y-ngx-components-datapoints-export-selector.d.ts.map +1 -0
  105. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/data-fetching.service.d.ts +117 -0
  106. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/data-fetching.service.d.ts.map +1 -0
  107. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/data-processing.service.d.ts +90 -0
  108. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/data-processing.service.d.ts.map +1 -0
  109. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-export-selector-file-exporter.component.d.ts +160 -0
  110. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-export-selector-file-exporter.component.d.ts.map +1 -0
  111. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-export-selector-file-exporter.service.d.ts +89 -0
  112. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-export-selector-file-exporter.service.d.ts.map +1 -0
  113. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-export-selector-preview/datapoints-export-selector-preview.component.d.ts +11 -0
  114. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-export-selector-preview/datapoints-export-selector-preview.component.d.ts.map +1 -0
  115. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-exports-selector-data-scope/datapoints-exports-selector-data-scope.component.d.ts +27 -0
  116. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-exports-selector-data-scope/datapoints-exports-selector-data-scope.component.d.ts.map +1 -0
  117. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-exports-selector-file-types/datapoints-exports-selector-file-types.component.d.ts +12 -0
  118. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-exports-selector-file-types/datapoints-exports-selector-file-types.component.d.ts.map +1 -0
  119. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-exports-selector-time-range/datapoints-exports-selector-time-range.component.d.ts +22 -0
  120. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-exports-selector-time-range/datapoints-exports-selector-time-range.component.d.ts.map +1 -0
  121. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/generators/csv-generator.d.ts +3 -0
  122. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/generators/csv-generator.d.ts.map +1 -0
  123. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/generators/excel-generator.d.ts +9 -0
  124. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/generators/excel-generator.d.ts.map +1 -0
  125. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/utils.service.d.ts +56 -0
  126. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/utils.service.d.ts.map +1 -0
  127. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-modal.component.d.ts +21 -0
  128. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-modal.component.d.ts.map +1 -0
  129. package/datapoints-export-selector/datapoints-export-selector.component.d.ts +14 -0
  130. package/datapoints-export-selector/datapoints-export-selector.component.d.ts.map +1 -0
  131. package/datapoints-export-selector/datapoints-export-selector.model.d.ts +232 -0
  132. package/datapoints-export-selector/datapoints-export-selector.model.d.ts.map +1 -0
  133. package/datapoints-export-selector/index.d.ts +15 -0
  134. package/datapoints-export-selector/index.d.ts.map +1 -0
  135. package/device-list/device-list.module.d.ts +4 -2
  136. package/device-list/device-list.module.d.ts.map +1 -1
  137. package/esm2022/alarm-event-selector/alarm-event-selection-list/alarm-event-selection-list.component.mjs +4 -4
  138. package/esm2022/alarm-event-selector/alarm-event-selector-list-item/alarm-event-selector-list-item.component.mjs +3 -3
  139. package/esm2022/alarms/alarms-date-filter.component.mjs +139 -0
  140. package/esm2022/alarms/alarms-filter.component.mjs +11 -5
  141. package/esm2022/alarms/alarms-list.component.mjs +5 -16
  142. package/esm2022/alarms/alarms-type-filter.component.mjs +3 -3
  143. package/esm2022/alarms/alarms-view.service.mjs +16 -2
  144. package/esm2022/alarms/alarms.component.mjs +12 -6
  145. package/esm2022/alarms/alarms.model.mjs +17 -1
  146. package/esm2022/alarms/alarms.module.mjs +11 -4
  147. package/esm2022/branding/shared/data/store-branding.service.mjs +24 -1
  148. package/esm2022/branding/shared/lazy/branding/branding.component.mjs +3 -1
  149. package/esm2022/context-dashboard/context-dashboard.component.mjs +4 -4
  150. package/esm2022/context-dashboard/context-dashboard.model.mjs +1 -1
  151. package/esm2022/context-dashboard/context-dashboard.service.mjs +47 -21
  152. package/esm2022/context-dashboard/dashboard-detail.component.mjs +8 -16
  153. package/esm2022/context-dashboard/dashboard-detail.service.mjs +13 -6
  154. package/esm2022/context-dashboard/dashboard-settings/dashboard-general-settings.component.mjs +3 -3
  155. package/esm2022/context-dashboard/dashboard-settings/typed-dashboard-settings.component.mjs +32 -11
  156. package/esm2022/core/action-bar/action-bar-item.component.mjs +3 -3
  157. package/esm2022/core/action-bar/action-bar.component.mjs +3 -3
  158. package/esm2022/core/action-bar/action-bar.module.mjs +16 -5
  159. package/esm2022/core/bootstrap/bootstrap.component.mjs +21 -16
  160. package/esm2022/core/common/aggregation/aggregation.model.mjs +46 -0
  161. package/esm2022/core/common/aggregation/aggregation.service.mjs +34 -0
  162. package/esm2022/core/common/humanize-app-name.model.mjs +2 -2
  163. package/esm2022/core/common/humanize-app-name.pipe.mjs +2 -2
  164. package/esm2022/core/common/index.mjs +5 -1
  165. package/esm2022/core/common/inter-app.service.mjs +76 -0
  166. package/esm2022/core/common/interval-based-reload.abstract.mjs +110 -0
  167. package/esm2022/core/countdown-interval/countdown-interval.component.mjs +3 -3
  168. package/esm2022/core/dashboard/dashboard-child.component.mjs +6 -5
  169. package/esm2022/core/dashboard/dashboard.module.mjs +22 -4
  170. package/esm2022/core/dashboard/index.mjs +4 -1
  171. package/esm2022/core/dashboard/widget-auto-refresh-context/auto-refresh-control.component.mjs +101 -0
  172. package/esm2022/core/dashboard/widget-auto-refresh-context/auto-refresh-select-control.component.mjs +50 -0
  173. package/esm2022/core/dashboard/widget-auto-refresh-context/global-refresh-loading.operator.mjs +7 -0
  174. package/esm2022/core/dashboard/widget-auto-refresh-context/index.mjs +8 -0
  175. package/esm2022/core/dashboard/widget-auto-refresh-context/widget-auto-refresh-context-icon-bar.component.mjs +18 -0
  176. package/esm2022/core/dashboard/widget-auto-refresh-context/widget-auto-refresh-context.component.mjs +127 -0
  177. package/esm2022/core/dashboard/widget-auto-refresh-context/widget-auto-refresh-context.model.mjs +5 -0
  178. package/esm2022/core/dashboard/widget-auto-refresh-context/widget-global-auto-refresh.service.mjs +233 -0
  179. package/esm2022/core/dashboard/widget-change-event.model.mjs +1 -1
  180. package/esm2022/core/dashboard/widgets-dashboard.component.mjs +35 -30
  181. package/esm2022/core/dashboard/wiget-time-context/aggregation-picker/aggregation-picker.component.mjs +4 -4
  182. package/esm2022/core/dashboard/wiget-time-context/realtime-control/realtime-control.component.mjs +2 -2
  183. package/esm2022/core/dashboard/wiget-time-context/widget-time-context-helper.service.mjs +3 -2
  184. package/esm2022/core/dashboard/wiget-time-context/widget-time-context-icon-bar/widget-time-context-icon-bar.component.mjs +5 -5
  185. package/esm2022/core/dashboard/wiget-time-context/widget-time-context-query.service.mjs +7 -4
  186. package/esm2022/core/dashboard/wiget-time-context/widget-time-context.component.mjs +37 -36
  187. package/esm2022/core/dashboard/wiget-time-context/widget-time-context.model.mjs +1 -72
  188. package/esm2022/core/date-time-picker/date-time-picker.component.mjs +9 -3
  189. package/esm2022/core/header/header.module.mjs +7 -5
  190. package/esm2022/core/header/title/title.component.mjs +3 -3
  191. package/esm2022/core/i18n/cached-locale-dictionary.service.mjs +1 -1
  192. package/esm2022/core/i18n/i18n.module.mjs +7 -14
  193. package/esm2022/core/i18n/index.mjs +3 -2
  194. package/esm2022/core/i18n/translate.parser.mjs +2 -2
  195. package/esm2022/core/i18n/translation-loader.service.mjs +132 -0
  196. package/esm2022/core/i18n/translation-utils.mjs +24 -0
  197. package/esm2022/core/list-display-switch/list-display-switch.component.mjs +3 -3
  198. package/esm2022/core/plugins/plugins-resolve.service.mjs +12 -37
  199. package/esm2022/datapoint-selector/datapoint-attributes-form/datapoint-attributes-form-validation.service.mjs +13 -6
  200. package/esm2022/datapoint-selector/datapoint-attributes-form/datapoint-attributes-form.component.mjs +22 -5
  201. package/esm2022/datapoint-selector/datapoint-selection-list/datapoint-selection-list.component.mjs +3 -3
  202. package/esm2022/datapoint-selector/datapoint-selection.model.mjs +1 -1
  203. package/esm2022/datapoint-selector/datapoint-selector-list-item/datapoint-selector-list-item.component.mjs +3 -3
  204. package/esm2022/datapoints-export-selector/c8y-ngx-components-datapoints-export-selector.mjs +5 -0
  205. package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/data-fetching.service.mjs +407 -0
  206. package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/data-processing.service.mjs +207 -0
  207. package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-export-selector-file-exporter.component.mjs +467 -0
  208. package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-export-selector-file-exporter.service.mjs +187 -0
  209. package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-export-selector-preview/datapoints-export-selector-preview.component.mjs +27 -0
  210. package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-exports-selector-data-scope/datapoints-exports-selector-data-scope.component.mjs +41 -0
  211. package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-exports-selector-file-types/datapoints-exports-selector-file-types.component.mjs +23 -0
  212. package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-exports-selector-time-range/datapoints-exports-selector-time-range.component.mjs +42 -0
  213. package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/generators/csv-generator.mjs +120 -0
  214. package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/generators/excel-generator.mjs +282 -0
  215. package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/utils.service.mjs +76 -0
  216. package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-modal.component.mjs +46 -0
  217. package/esm2022/datapoints-export-selector/datapoints-export-selector.component.mjs +42 -0
  218. package/esm2022/datapoints-export-selector/datapoints-export-selector.model.mjs +43 -0
  219. package/esm2022/datapoints-export-selector/index.mjs +15 -0
  220. package/esm2022/device-list/add-smart-group.component.mjs +4 -3
  221. package/esm2022/device-list/device-list.module.mjs +22 -4
  222. package/esm2022/interval-picker/c8y-ngx-components-interval-picker.mjs +5 -0
  223. package/esm2022/interval-picker/index.mjs +3 -0
  224. package/esm2022/interval-picker/interval-picker.component.mjs +68 -0
  225. package/esm2022/interval-picker/interval-picker.model.mjs +47 -0
  226. package/esm2022/map/cluster-map.component.mjs +41 -13
  227. package/esm2022/map/map-status.component.mjs +6 -5
  228. package/esm2022/map/map.component.mjs +9 -5
  229. package/esm2022/map/map.model.mjs +1 -1
  230. package/esm2022/translation-editor/c8y-ngx-components-translation-editor.mjs +5 -0
  231. package/esm2022/translation-editor/data/c8y-ngx-components-translation-editor-data.mjs +5 -0
  232. package/esm2022/translation-editor/data/index.mjs +2 -0
  233. package/esm2022/translation-editor/data/translation-store.service.mjs +175 -0
  234. package/esm2022/translation-editor/index.mjs +10 -0
  235. package/esm2022/translation-editor/lazy/add-translation-modal/add-translation-modal.component.mjs +70 -0
  236. package/esm2022/translation-editor/lazy/c8y-ngx-components-translation-editor-lazy.mjs +5 -0
  237. package/esm2022/translation-editor/lazy/index.mjs +2 -0
  238. package/esm2022/translation-editor/lazy/manage-translation-cell-renderer/manage-translation-cell-renderer.component.mjs +53 -0
  239. package/esm2022/translation-editor/lazy/translation-editor/translation-editor.component.mjs +124 -0
  240. package/esm2022/translation-editor/translation-editor-naviagtor-factory.service.mjs +31 -0
  241. package/esm2022/widgets/cockpit/index.mjs +4 -2
  242. package/esm2022/widgets/cockpit-exports/index.mjs +8 -1
  243. package/esm2022/widgets/definitions/alarms/alarm-list/index.mjs +6 -2
  244. package/esm2022/widgets/definitions/alarms/all-critical-alarms/index.mjs +6 -2
  245. package/esm2022/widgets/definitions/alarms/recent-alarms/index.mjs +6 -2
  246. package/esm2022/widgets/definitions/datapoints-table/c8y-ngx-components-widgets-definitions-datapoints-table.mjs +5 -0
  247. package/esm2022/widgets/definitions/datapoints-table/index.mjs +34 -0
  248. package/esm2022/widgets/definitions/index.mjs +2 -1
  249. package/esm2022/widgets/definitions/map/index.mjs +4 -2
  250. package/esm2022/widgets/implementations/alarms/alarm-list-widget-config/alarm-list-widget-config.component.mjs +29 -15
  251. package/esm2022/widgets/implementations/alarms/alarm-list-widget-view/alarm-list-widget.component.mjs +57 -25
  252. package/esm2022/widgets/implementations/alarms/alarm-list-widget.model.mjs +2 -1
  253. package/esm2022/widgets/implementations/alarms/alarm-widget-alarms-reload.component.mjs +19 -21
  254. package/esm2022/widgets/implementations/datapoints-table/c8y-ngx-components-widgets-implementations-datapoints-table.mjs +5 -0
  255. package/esm2022/widgets/implementations/datapoints-table/datapoints-table-config/datapoints-table-config.component.mjs +383 -0
  256. package/esm2022/widgets/implementations/datapoints-table/datapoints-table-config/datapoints-table-config.service.mjs +124 -0
  257. package/esm2022/widgets/implementations/datapoints-table/datapoints-table-view/adjust-aggregated-time-range.pipe.mjs +191 -0
  258. package/esm2022/widgets/implementations/datapoints-table/datapoints-table-view/apply-range-class.pipe.mjs +36 -0
  259. package/esm2022/widgets/implementations/datapoints-table/datapoints-table-view/column-title.pipe.mjs +45 -0
  260. package/esm2022/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-reload/datapoints-reload.component.mjs +116 -0
  261. package/esm2022/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table/datapoints-table.component.mjs +116 -0
  262. package/esm2022/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table/dynamic-column.directive.mjs +43 -0
  263. package/esm2022/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table-view.component.mjs +282 -0
  264. package/esm2022/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table-view.service.mjs +430 -0
  265. package/esm2022/widgets/implementations/datapoints-table/datapoints-table-view/virtual-scroll-listener.directive.mjs +75 -0
  266. package/esm2022/widgets/implementations/datapoints-table/datapoints-table-widget.model.mjs +76 -0
  267. package/esm2022/widgets/implementations/datapoints-table/datapoints-table.service.mjs +52 -0
  268. package/esm2022/widgets/implementations/datapoints-table/date-range-picker.component.mjs +68 -0
  269. package/esm2022/widgets/implementations/datapoints-table/index.mjs +10 -0
  270. package/esm2022/widgets/implementations/map/map-widget-config.component.mjs +19 -11
  271. package/esm2022/widgets/implementations/map/map-widget.component.mjs +20 -2
  272. package/esm2022/widgets/implementations/map/map-widget.model.mjs +1 -1
  273. package/fesm2022/c8y-ngx-components-alarm-event-selector.mjs +5 -5
  274. package/fesm2022/c8y-ngx-components-alarm-event-selector.mjs.map +1 -1
  275. package/fesm2022/c8y-ngx-components-alarms.mjs +189 -31
  276. package/fesm2022/c8y-ngx-components-alarms.mjs.map +1 -1
  277. package/fesm2022/c8y-ngx-components-branding-shared-data.mjs +23 -0
  278. package/fesm2022/c8y-ngx-components-branding-shared-data.mjs.map +1 -1
  279. package/fesm2022/c8y-ngx-components-branding-shared-lazy.mjs +2 -0
  280. package/fesm2022/c8y-ngx-components-branding-shared-lazy.mjs.map +1 -1
  281. package/fesm2022/c8y-ngx-components-context-dashboard.mjs +135 -91
  282. package/fesm2022/c8y-ngx-components-context-dashboard.mjs.map +1 -1
  283. package/fesm2022/c8y-ngx-components-datapoint-selector.mjs +37 -13
  284. package/fesm2022/c8y-ngx-components-datapoint-selector.mjs.map +1 -1
  285. package/fesm2022/c8y-ngx-components-datapoints-export-selector.mjs +1928 -0
  286. package/fesm2022/c8y-ngx-components-datapoints-export-selector.mjs.map +1 -0
  287. package/fesm2022/c8y-ngx-components-device-list.mjs +24 -5
  288. package/fesm2022/c8y-ngx-components-device-list.mjs.map +1 -1
  289. package/fesm2022/c8y-ngx-components-interval-picker.mjs +120 -0
  290. package/fesm2022/c8y-ngx-components-interval-picker.mjs.map +1 -0
  291. package/fesm2022/c8y-ngx-components-map.mjs +52 -19
  292. package/fesm2022/c8y-ngx-components-map.mjs.map +1 -1
  293. package/fesm2022/c8y-ngx-components-translation-editor-data.mjs +181 -0
  294. package/fesm2022/c8y-ngx-components-translation-editor-data.mjs.map +1 -0
  295. package/fesm2022/c8y-ngx-components-translation-editor-lazy.mjs +236 -0
  296. package/fesm2022/c8y-ngx-components-translation-editor-lazy.mjs.map +1 -0
  297. package/fesm2022/c8y-ngx-components-translation-editor.mjs +46 -0
  298. package/fesm2022/c8y-ngx-components-translation-editor.mjs.map +1 -0
  299. package/fesm2022/c8y-ngx-components-widgets-cockpit-exports.mjs +7 -0
  300. package/fesm2022/c8y-ngx-components-widgets-cockpit-exports.mjs.map +1 -1
  301. package/fesm2022/c8y-ngx-components-widgets-cockpit.mjs +3 -1
  302. package/fesm2022/c8y-ngx-components-widgets-cockpit.mjs.map +1 -1
  303. package/fesm2022/c8y-ngx-components-widgets-definitions-alarms-alarm-list.mjs +5 -1
  304. package/fesm2022/c8y-ngx-components-widgets-definitions-alarms-alarm-list.mjs.map +1 -1
  305. package/fesm2022/c8y-ngx-components-widgets-definitions-alarms-all-critical-alarms.mjs +5 -1
  306. package/fesm2022/c8y-ngx-components-widgets-definitions-alarms-all-critical-alarms.mjs.map +1 -1
  307. package/fesm2022/c8y-ngx-components-widgets-definitions-alarms-recent-alarms.mjs +5 -1
  308. package/fesm2022/c8y-ngx-components-widgets-definitions-alarms-recent-alarms.mjs.map +1 -1
  309. package/fesm2022/c8y-ngx-components-widgets-definitions-datapoints-table.mjs +41 -0
  310. package/fesm2022/c8y-ngx-components-widgets-definitions-datapoints-table.mjs.map +1 -0
  311. package/fesm2022/c8y-ngx-components-widgets-definitions-map.mjs +3 -1
  312. package/fesm2022/c8y-ngx-components-widgets-definitions-map.mjs.map +1 -1
  313. package/fesm2022/c8y-ngx-components-widgets-definitions.mjs +1 -0
  314. package/fesm2022/c8y-ngx-components-widgets-definitions.mjs.map +1 -1
  315. package/fesm2022/c8y-ngx-components-widgets-implementations-alarms.mjs +101 -58
  316. package/fesm2022/c8y-ngx-components-widgets-implementations-alarms.mjs.map +1 -1
  317. package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-table.mjs +1967 -0
  318. package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-table.mjs.map +1 -0
  319. package/fesm2022/c8y-ngx-components-widgets-implementations-map.mjs +37 -11
  320. package/fesm2022/c8y-ngx-components-widgets-implementations-map.mjs.map +1 -1
  321. package/fesm2022/c8y-ngx-components.mjs +5093 -4369
  322. package/fesm2022/c8y-ngx-components.mjs.map +1 -1
  323. package/interval-picker/c8y-ngx-components-interval-picker.d.ts.map +1 -0
  324. package/interval-picker/index.d.ts +3 -0
  325. package/interval-picker/index.d.ts.map +1 -0
  326. package/{core/dashboard/wiget-time-context/interval-picker → interval-picker}/interval-picker.component.d.ts +10 -2
  327. package/interval-picker/interval-picker.component.d.ts.map +1 -0
  328. package/interval-picker/interval-picker.model.d.ts +15 -0
  329. package/interval-picker/interval-picker.model.d.ts.map +1 -0
  330. package/locales/de.po +289 -18
  331. package/locales/en.po +12 -0
  332. package/locales/en_US.po +3 -0
  333. package/locales/es.po +253 -18
  334. package/locales/fr.po +253 -18
  335. package/locales/ja_JP.po +282 -18
  336. package/locales/locales.pot +266 -21
  337. package/locales/nl.po +253 -18
  338. package/locales/pl.po +253 -18
  339. package/locales/pt_BR.po +253 -18
  340. package/map/cluster-map.component.d.ts +8 -3
  341. package/map/cluster-map.component.d.ts.map +1 -1
  342. package/map/map-status.component.d.ts +0 -3
  343. package/map/map-status.component.d.ts.map +1 -1
  344. package/map/map.component.d.ts +4 -2
  345. package/map/map.component.d.ts.map +1 -1
  346. package/map/map.model.d.ts +2 -1
  347. package/map/map.model.d.ts.map +1 -1
  348. package/package.json +1 -1
  349. package/translation-editor/c8y-ngx-components-translation-editor.d.ts.map +1 -0
  350. package/translation-editor/data/c8y-ngx-components-translation-editor-data.d.ts.map +1 -0
  351. package/translation-editor/data/index.d.ts +2 -0
  352. package/translation-editor/data/index.d.ts.map +1 -0
  353. package/translation-editor/data/translation-store.service.d.ts +61 -0
  354. package/translation-editor/data/translation-store.service.d.ts.map +1 -0
  355. package/translation-editor/index.d.ts +2 -0
  356. package/translation-editor/index.d.ts.map +1 -0
  357. package/translation-editor/lazy/add-translation-modal/add-translation-modal.component.d.ts +30 -0
  358. package/translation-editor/lazy/add-translation-modal/add-translation-modal.component.d.ts.map +1 -0
  359. package/translation-editor/lazy/c8y-ngx-components-translation-editor-lazy.d.ts.map +1 -0
  360. package/translation-editor/lazy/index.d.ts +2 -0
  361. package/translation-editor/lazy/index.d.ts.map +1 -0
  362. package/translation-editor/lazy/manage-translation-cell-renderer/manage-translation-cell-renderer.component.d.ts +22 -0
  363. package/translation-editor/lazy/manage-translation-cell-renderer/manage-translation-cell-renderer.component.d.ts.map +1 -0
  364. package/translation-editor/lazy/translation-editor/translation-editor.component.d.ts +34 -0
  365. package/translation-editor/lazy/translation-editor/translation-editor.component.d.ts.map +1 -0
  366. package/translation-editor/translation-editor-naviagtor-factory.service.d.ts +11 -0
  367. package/translation-editor/translation-editor-naviagtor-factory.service.d.ts.map +1 -0
  368. package/widgets/cockpit/index.d.ts +13 -0
  369. package/widgets/cockpit/index.d.ts.map +1 -1
  370. package/widgets/cockpit-exports/index.d.ts +6 -0
  371. package/widgets/cockpit-exports/index.d.ts.map +1 -1
  372. package/widgets/definitions/alarms/alarm-list/index.d.ts +2 -0
  373. package/widgets/definitions/alarms/alarm-list/index.d.ts.map +1 -1
  374. package/widgets/definitions/alarms/all-critical-alarms/index.d.ts +2 -0
  375. package/widgets/definitions/alarms/all-critical-alarms/index.d.ts.map +1 -1
  376. package/widgets/definitions/alarms/recent-alarms/index.d.ts +2 -0
  377. package/widgets/definitions/alarms/recent-alarms/index.d.ts.map +1 -1
  378. package/widgets/definitions/datapoints-table/c8y-ngx-components-widgets-definitions-datapoints-table.d.ts.map +1 -0
  379. package/widgets/definitions/datapoints-table/index.d.ts +14 -0
  380. package/widgets/definitions/datapoints-table/index.d.ts.map +1 -0
  381. package/widgets/definitions/index.d.ts +1 -0
  382. package/widgets/definitions/index.d.ts.map +1 -1
  383. package/widgets/definitions/map/index.d.ts +2 -1
  384. package/widgets/definitions/map/index.d.ts.map +1 -1
  385. package/widgets/implementations/alarms/alarm-list-widget-config/alarm-list-widget-config.component.d.ts +5 -9
  386. package/widgets/implementations/alarms/alarm-list-widget-config/alarm-list-widget-config.component.d.ts.map +1 -1
  387. package/widgets/implementations/alarms/alarm-list-widget-view/alarm-list-widget.component.d.ts +17 -10
  388. package/widgets/implementations/alarms/alarm-list-widget-view/alarm-list-widget.component.d.ts.map +1 -1
  389. package/widgets/implementations/alarms/alarm-list-widget.model.d.ts +5 -1
  390. package/widgets/implementations/alarms/alarm-list-widget.model.d.ts.map +1 -1
  391. package/widgets/implementations/alarms/alarm-widget-alarms-reload.component.d.ts +5 -11
  392. package/widgets/implementations/alarms/alarm-widget-alarms-reload.component.d.ts.map +1 -1
  393. package/widgets/implementations/datapoints-table/c8y-ngx-components-widgets-implementations-datapoints-table.d.ts.map +1 -0
  394. package/widgets/implementations/datapoints-table/datapoints-table-config/datapoints-table-config.component.d.ts +129 -0
  395. package/widgets/implementations/datapoints-table/datapoints-table-config/datapoints-table-config.component.d.ts.map +1 -0
  396. package/widgets/implementations/datapoints-table/datapoints-table-config/datapoints-table-config.service.d.ts +56 -0
  397. package/widgets/implementations/datapoints-table/datapoints-table-config/datapoints-table-config.service.d.ts.map +1 -0
  398. package/widgets/implementations/datapoints-table/datapoints-table-view/adjust-aggregated-time-range.pipe.d.ts +88 -0
  399. package/widgets/implementations/datapoints-table/datapoints-table-view/adjust-aggregated-time-range.pipe.d.ts.map +1 -0
  400. package/widgets/implementations/datapoints-table/datapoints-table-view/apply-range-class.pipe.d.ts +19 -0
  401. package/widgets/implementations/datapoints-table/datapoints-table-view/apply-range-class.pipe.d.ts.map +1 -0
  402. package/widgets/implementations/datapoints-table/datapoints-table-view/column-title.pipe.d.ts +26 -0
  403. package/widgets/implementations/datapoints-table/datapoints-table-view/column-title.pipe.d.ts.map +1 -0
  404. package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-reload/datapoints-reload.component.d.ts +63 -0
  405. package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-reload/datapoints-reload.component.d.ts.map +1 -0
  406. package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table/datapoints-table.component.d.ts +38 -0
  407. package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table/datapoints-table.component.d.ts.map +1 -0
  408. package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table/dynamic-column.directive.d.ts +13 -0
  409. package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table/dynamic-column.directive.d.ts.map +1 -0
  410. package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table-view.component.d.ts +123 -0
  411. package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table-view.component.d.ts.map +1 -0
  412. package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table-view.service.d.ts +196 -0
  413. package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table-view.service.d.ts.map +1 -0
  414. package/widgets/implementations/datapoints-table/datapoints-table-view/virtual-scroll-listener.directive.d.ts +41 -0
  415. package/widgets/implementations/datapoints-table/datapoints-table-view/virtual-scroll-listener.directive.d.ts.map +1 -0
  416. package/widgets/implementations/datapoints-table/datapoints-table-widget.model.d.ts +175 -0
  417. package/widgets/implementations/datapoints-table/datapoints-table-widget.model.d.ts.map +1 -0
  418. package/widgets/implementations/datapoints-table/datapoints-table.service.d.ts +12 -0
  419. package/widgets/implementations/datapoints-table/datapoints-table.service.d.ts.map +1 -0
  420. package/widgets/implementations/datapoints-table/date-range-picker.component.d.ts +34 -0
  421. package/widgets/implementations/datapoints-table/date-range-picker.component.d.ts.map +1 -0
  422. package/widgets/implementations/datapoints-table/index.d.ts +10 -0
  423. package/widgets/implementations/datapoints-table/index.d.ts.map +1 -0
  424. package/widgets/implementations/map/map-widget-config.component.d.ts +4 -4
  425. package/widgets/implementations/map/map-widget-config.component.d.ts.map +1 -1
  426. package/widgets/implementations/map/map-widget.component.d.ts +8 -3
  427. package/widgets/implementations/map/map-widget.component.d.ts.map +1 -1
  428. package/widgets/implementations/map/map-widget.model.d.ts +4 -3
  429. package/widgets/implementations/map/map-widget.model.d.ts.map +1 -1
  430. package/core/dashboard/wiget-time-context/interval-picker/interval-picker.component.d.ts.map +0 -1
  431. package/core/i18n/translate.loader.d.ts +0 -31
  432. package/core/i18n/translate.loader.d.ts.map +0 -1
  433. package/esm2022/core/dashboard/wiget-time-context/interval-picker/interval-picker.component.mjs +0 -55
  434. package/esm2022/core/i18n/translate.loader.mjs +0 -71
@@ -1,18 +1,20 @@
1
1
  import { Component, EventEmitter, Input, Output, ViewChild } from '@angular/core';
2
+ import { FormBuilder } from '@angular/forms';
3
+ import { ActivationEnd, NavigationEnd, NavigationStart, Router } from '@angular/router';
4
+ import { aggregationType } from '@c8y/client';
5
+ import { BsDropdownDirective } from 'ngx-bootstrap/dropdown';
2
6
  import { interval, Subject } from 'rxjs';
7
+ import { filter, takeUntil } from 'rxjs/operators';
8
+ import { ActionBarService } from '../../action-bar';
9
+ import { AGGREGATION_LIMITS } from '../../common/aggregation/aggregation.model';
10
+ import { AggregationService } from '../../common/aggregation/aggregation.service';
11
+ import { gettext } from '../../i18n';
3
12
  import { DashboardChildActionComponent } from '../dashboard-child-action.component';
4
13
  import { DashboardChildComponent } from '../dashboard-child.component';
5
14
  import { WidgetsDashboardEventService } from '../widgets-dashboard-event.service';
6
- import { FormBuilder } from '@angular/forms';
7
- import { gettext } from '../../i18n';
8
- import { filter, takeUntil } from 'rxjs/operators';
9
- import { AGGREGATION_LIMITS, INTERVAL_TITLES, TimeSpanInMs } from './widget-time-context.model';
10
- import { WidgetTimeContextQueryService } from './widget-time-context-query.service';
11
15
  import { WidgetTimeContextHelperService } from './widget-time-context-helper.service';
12
- import { ActivationEnd, NavigationEnd, NavigationStart, Router } from '@angular/router';
13
- import { ActionBarService } from '../../action-bar';
14
- import { aggregationType } from '@c8y/client';
15
- import { BsDropdownDirective } from 'ngx-bootstrap/dropdown';
16
+ import { WidgetTimeContextQueryService } from './widget-time-context-query.service';
17
+ import { INTERVAL_TITLES } from '@c8y/ngx-components/interval-picker';
16
18
  import * as i0 from "@angular/core";
17
19
  import * as i1 from "../widgets-dashboard-event.service";
18
20
  import * as i2 from "../dashboard-child.component";
@@ -21,27 +23,28 @@ import * as i4 from "./widget-time-context-query.service";
21
23
  import * as i5 from "./widget-time-context-helper.service";
22
24
  import * as i6 from "@angular/router";
23
25
  import * as i7 from "../../action-bar";
24
- import * as i8 from "../../common/icon.directive";
25
- import * as i9 from "../../i18n/c8y-translate.directive";
26
- import * as i10 from "@angular/common";
27
- import * as i11 from "../../action-bar/action-bar-item.component";
28
- import * as i12 from "ngx-bootstrap/dropdown";
29
- import * as i13 from "ngx-bootstrap/tooltip";
30
- import * as i14 from "../../forms/form-group.component";
31
- import * as i15 from "../../forms/message.directive";
32
- import * as i16 from "../../forms/messages.component";
33
- import * as i17 from "../../date-time-picker/date-time-picker.component";
34
- import * as i18 from "../dashboard-child-action.component";
35
- import * as i19 from "./interval-picker/interval-picker.component";
36
- import * as i20 from "./realtime-control/realtime-control.component";
37
- import * as i21 from "./aggregation-picker/aggregation-picker.component";
38
- import * as i22 from "../../i18n/c8y-translate.pipe";
39
- import * as i23 from "../../common/date.pipe";
26
+ import * as i8 from "../../common/aggregation/aggregation.service";
27
+ import * as i9 from "../../common/icon.directive";
28
+ import * as i10 from "../../i18n/c8y-translate.directive";
29
+ import * as i11 from "@angular/common";
30
+ import * as i12 from "../../action-bar/action-bar-item.component";
31
+ import * as i13 from "ngx-bootstrap/dropdown";
32
+ import * as i14 from "ngx-bootstrap/tooltip";
33
+ import * as i15 from "../../forms/form-group.component";
34
+ import * as i16 from "../../forms/message.directive";
35
+ import * as i17 from "../../forms/messages.component";
36
+ import * as i18 from "../../date-time-picker/date-time-picker.component";
37
+ import * as i19 from "@ngx-translate/core";
38
+ import * as i20 from "@c8y/ngx-components/interval-picker";
39
+ import * as i21 from "../dashboard-child-action.component";
40
+ import * as i22 from "./realtime-control/realtime-control.component";
41
+ import * as i23 from "./aggregation-picker/aggregation-picker.component";
42
+ import * as i24 from "../../common/date.pipe";
40
43
  export class WidgetTimeContextComponent {
41
44
  /**
42
45
  * @ignore only DI.
43
46
  */
44
- constructor(widgetEventService, dashboardChild, formBuilder, queryService, helperService, router, actionBarService) {
47
+ constructor(widgetEventService, dashboardChild, formBuilder, queryService, helperService, router, actionBarService, aggregationService) {
45
48
  this.widgetEventService = widgetEventService;
46
49
  this.dashboardChild = dashboardChild;
47
50
  this.formBuilder = formBuilder;
@@ -49,6 +52,7 @@ export class WidgetTimeContextComponent {
49
52
  this.helperService = helperService;
50
53
  this.router = router;
51
54
  this.actionBarService = actionBarService;
55
+ this.aggregationService = aggregationService;
52
56
  this.INTERVAL_TITLES = INTERVAL_TITLES;
53
57
  this.DATE_FORMAT = 'short';
54
58
  /**
@@ -68,6 +72,7 @@ export class WidgetTimeContextComponent {
68
72
  this.coupleTimeContextLabel = gettext('Couple time context');
69
73
  this.disabledAggregations = {};
70
74
  this.DEFAULT_INTERVAL = 'days';
75
+ this.ACTION_BAR_PRIORITY = 7;
71
76
  this.ACTION_BAR_GROUP_ID = 'timecontext';
72
77
  this.REALTIME_INTERVAL = 1000;
73
78
  this.destroy$ = new Subject();
@@ -407,12 +412,8 @@ export class WidgetTimeContextComponent {
407
412
  });
408
413
  }
409
414
  calculateAggregation([dateFrom, dateTo], aggregation) {
415
+ this.disabledAggregations = this.aggregationService.getDisabledAggregationOptions(dateFrom, dateTo);
410
416
  const timeRangeInMs = dateTo.valueOf() - dateFrom.valueOf();
411
- this.disabledAggregations = {
412
- DAILY: timeRangeInMs <= TimeSpanInMs.DAY,
413
- HOURLY: timeRangeInMs <= TimeSpanInMs.HOUR,
414
- MINUTELY: timeRangeInMs <= TimeSpanInMs.MINUTE
415
- };
416
417
  const isProperAggregation = !this.disabledAggregations[aggregation] || aggregation === null;
417
418
  if (isProperAggregation) {
418
419
  return aggregation;
@@ -430,13 +431,13 @@ export class WidgetTimeContextComponent {
430
431
  return null;
431
432
  }
432
433
  }
433
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: WidgetTimeContextComponent, deps: [{ token: i1.WidgetsDashboardEventService }, { token: i2.DashboardChildComponent }, { token: i3.FormBuilder }, { token: i4.WidgetTimeContextQueryService }, { token: i5.WidgetTimeContextHelperService }, { token: i6.Router }, { token: i7.ActionBarService }], target: i0.ɵɵFactoryTarget.Component }); }
434
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.9", type: WidgetTimeContextComponent, selector: "c8y-widget-time-context", inputs: { canDecouple: "canDecouple", displaySettings: "displaySettings", hidden: "hidden" }, outputs: { dateContextChange: "dateContextChange" }, host: { classAttribute: "d-flex a-i-center gap-4" }, viewQueries: [{ propertyName: "action", first: true, predicate: DashboardChildActionComponent, descendants: true }, { propertyName: "dropdown", first: true, predicate: BsDropdownDirective, descendants: true }], ngImport: i0, template: "<c8y-action-bar-item\n *ngIf=\"isCoupled && !hidden\"\n [groupId]=\"ACTION_BAR_GROUP_ID\"\n [inGroupPriority]=\"actionBarInGroupPriority\"\n [placement]=\"'left'\"\n>\n <ng-container\n [ngTemplateOutlet]=\"dateTimePicker\"\n [ngTemplateOutletContext]=\"{\n date: [form.value.currentDateContextFromDate, form.value.currentDateContextToDate]\n }\"\n ></ng-container>\n</c8y-action-bar-item>\n\n<ng-container\n *ngIf=\"!isCoupled\"\n [ngTemplateOutlet]=\"dateTimePicker\"\n [ngTemplateOutletContext]=\"{\n date: [form.value.currentDateContextFromDate, form.value.currentDateContextToDate]\n }\"\n></ng-container>\n\n<ng-template\n #dateTimePicker\n let-date=\"date\"\n>\n <form\n class=\"d-flex gap-16 p-l-xs-16 p-r-xs-16 m-t-xs-8 m-b-xs-8\"\n [formGroup]=\"form\"\n >\n <ng-container *ngIf=\"displaySettings.globalTimeContext\">\n <div>\n <div\n class=\"dropdown flex-grow\"\n #dropdown=\"bs-dropdown\"\n \n dropdown\n [insideClick]=\"true\"\n *ngIf=\"date\"\n >\n <button\n data-cy=\"widget-time-context--date-picker-dropdown-button\"\n class=\"dropdown-toggle form-control l-h-tight d-flex a-i-center\"\n attr.aria-label=\"{{ date[0] | c8yDate: DATE_FORMAT }} \u2014 {{\n date[1] | c8yDate: DATE_FORMAT\n }}\"\n tooltip=\"{{ date[0] | c8yDate: DATE_FORMAT }} \u2014 {{ date[1] | c8yDate: DATE_FORMAT }}\"\n placement=\"top\"\n container=\"body\"\n [adaptivePosition]=\"false\"\n [delay]=\"500\"\n dropdownToggle\n >\n <i\n class=\"m-r-4 \"\n c8yIcon=\"schedule1\"\n ></i>\n <div class=\"d-col text-left fit-w\">\n <span class=\"text-12\" data-cy=\"widget-time-context--selected-interval\">\n {{ INTERVAL_TITLES[form.controls.currentDateContextInterval.value] | translate }}\n </span>\n <span\n class=\"text-10 text-muted text-truncate\"\n data-cy=\"widget-time-context--selected-time-range\"\n >\n {{ date[0] | c8yDate: DATE_FORMAT }} \u2014 {{ date[1] | c8yDate: DATE_FORMAT }}\n </span>\n </div>\n <span class=\"caret m-r-16 m-l-4\"></span>\n </button>\n\n <ul\n class=\"dropdown-menu dropdown-menu--date-range\"\n *dropdownMenu\n >\n <c8y-interval-picker\n class=\"d-contents\"\n formControlName=\"currentDateContextInterval\"\n ></c8y-interval-picker>\n\n <ng-container *ngIf=\"form.controls.currentDateContextInterval.value === 'custom'\">\n <div class=\"p-l-16 p-r-16\">\n <c8y-form-group\n [ngClass]=\"form.controls.temporaryUserSelectedFromDate.errors ? 'has-error' : ''\"\n >\n <label\n [title]=\"'From`date`' | translate\"\n for=\"temporaryUserSelectedFromDate\"\n translate\n >\n From`date`\n </label>\n <c8y-date-time-picker\n id=\"temporaryUserSelectedFromDate\"\n [maxDate]=\"form.value.temporaryUserSelectedToDate\"\n [placeholder]=\"'From`date`' | translate\"\n [formControl]=\"form.controls.temporaryUserSelectedFromDate\"\n [ngClass]=\"form.controls.temporaryUserSelectedFromDate.errors ? 'has-error' : ''\"\n ></c8y-date-time-picker>\n <c8y-messages [show]=\"form.controls.temporaryUserSelectedFromDate.errors\">\n <c8y-message\n name=\"dateAfterRangeMax\"\n [text]=\"'This date is after the latest allowed date.' | translate\"\n ></c8y-message>\n <c8y-message\n name=\"invalidDateTime\"\n [text]=\"'This date is invalid.' | translate\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n\n <c8y-form-group\n [ngClass]=\"form.controls.temporaryUserSelectedToDate.errors ? 'has-error' : ''\"\n >\n <label\n [title]=\"'To`date`' | translate\"\n for=\"temporaryUserSelectedToDate\"\n translate\n >\n To`date`\n </label>\n <c8y-date-time-picker\n id=\"temporaryUserSelectedToDate\"\n [minDate]=\"form.value.temporaryUserSelectedFromDate\"\n [placeholder]=\"'To`date`' | translate\"\n [formControl]=\"form.controls.temporaryUserSelectedToDate\"\n [ngClass]=\"form.controls.temporaryUserSelectedToDate.errors ? 'has-error' : ''\"\n ></c8y-date-time-picker>\n <c8y-messages [show]=\"form.controls.temporaryUserSelectedToDate.errors\">\n <c8y-message\n name=\"dateBeforeRangeMin\"\n [text]=\"'This date is before the earliest allowed date.' | translate\"\n ></c8y-message>\n <c8y-message\n name=\"invalidDateTime\"\n [text]=\"'This date is invalid.' | translate\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n </div>\n\n <div class=\"p-16 d-flex gap-8 separator-top\">\n <button\n class=\"btn btn-default btn-sm flex-grow\"\n title=\"{{ 'Reset' | translate }}\"\n type=\"button\"\n (click)=\"reset(); dropdown.isOpen = false\"\n [disabled]=\"form.value.realtime\"\n translate\n >\n Reset\n </button>\n\n <button\n class=\"btn btn-primary btn-sm flex-grow\"\n title=\"{{ 'Apply' | translate }}\"\n type=\"button\"\n (click)=\"applyDatetimeContext(); dropdown.isOpen = false\"\n [disabled]=\"\n (form.pristine && form.untouched) || form.invalid || form.value.realtime\n \"\n translate\n >\n Apply\n </button>\n </div>\n </ng-container>\n </ul>\n </div>\n </div>\n </ng-container>\n\n <div class=\"input-group w-auto\">\n <c8y-realtime-control\n *ngIf=\"displaySettings.globalRealtimeContext\"\n formControlName=\"realtime\"\n class=\"form-control p-0 flex-no-grow w-auto\"\n ></c8y-realtime-control>\n\n <c8y-aggregation-picker\n *ngIf=\"displaySettings.globalAggregationContext\"\n formControlName=\"aggregation\"\n [disabledAggregations]=\"disabledAggregations\"\n ></c8y-aggregation-picker>\n </div>\n </form>\n</ng-template>\n\n<c8y-dashboard-child-action>\n <button\n type=\"button\"\n (click)=\"toggleDecoupling()\"\n >\n <i [c8yIcon]=\"isCoupled ? 'schedule1' : 'today'\"></i>\n <span class=\"m-l-4\">\n {{ (isCoupled ? decoupleTimeContextLabel : coupleTimeContextLabel) | translate }}\n </span>\n </button>\n</c8y-dashboard-child-action>\n", dependencies: [{ kind: "directive", type: i8.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i9.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i10.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i10.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i10.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i11.ActionBarItemComponent, selector: "c8y-action-bar-item", inputs: ["placement", "priority", "itemClass", "injector", "groupId", "inGroupPriority"] }, { kind: "directive", type: i12.BsDropdownMenuDirective, selector: "[bsDropdownMenu],[dropdownMenu]", exportAs: ["bs-dropdown-menu"] }, { kind: "directive", type: i12.BsDropdownToggleDirective, selector: "[bsDropdownToggle],[dropdownToggle]", exportAs: ["bs-dropdown-toggle"] }, { kind: "directive", type: i12.BsDropdownDirective, selector: "[bsDropdown], [dropdown]", inputs: ["placement", "triggers", "container", "dropup", "autoClose", "isAnimated", "insideClick", "isDisabled", "isOpen"], outputs: ["isOpenChange", "onShown", "onHidden"], exportAs: ["bs-dropdown"] }, { kind: "directive", type: i13.TooltipDirective, selector: "[tooltip], [tooltipHtml]", inputs: ["adaptivePosition", "tooltip", "placement", "triggers", "container", "containerClass", "boundariesElement", "isOpen", "isDisabled", "delay", "tooltipHtml", "tooltipPlacement", "tooltipIsOpen", "tooltipEnable", "tooltipAppendToBody", "tooltipAnimation", "tooltipClass", "tooltipContext", "tooltipPopupDelay", "tooltipFadeDuration", "tooltipTrigger"], outputs: ["tooltipChange", "onShown", "onHidden", "tooltipStateChanged"], exportAs: ["bs-tooltip"] }, { kind: "directive", type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "component", type: i14.FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "directive", type: i15.MessageDirective, selector: "c8y-message", inputs: ["name", "text"] }, { kind: "component", type: i16.MessagesComponent, selector: "c8y-messages", inputs: ["show", "defaults", "helpMessage"] }, { kind: "directive", type: i3.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i17.DateTimePickerComponent, selector: "c8y-date-time-picker", inputs: ["minDate", "maxDate", "placeholder", "dateInputFormat", "adaptivePosition", "size", "dateType", "config"], outputs: ["onDateSelected"] }, { kind: "component", type: i18.DashboardChildActionComponent, selector: "c8y-dashboard-child-action" }, { kind: "component", type: i19.IntervalPickerComponent, selector: "c8y-interval-picker" }, { kind: "component", type: i20.RealtimeControlComponent, selector: "c8y-realtime-control" }, { kind: "component", type: i21.AggregationPickerComponent, selector: "c8y-aggregation-picker", inputs: ["disabledAggregations"] }, { kind: "pipe", type: i22.C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: i23.DatePipe, name: "c8yDate" }] }); }
434
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: WidgetTimeContextComponent, deps: [{ token: i1.WidgetsDashboardEventService }, { token: i2.DashboardChildComponent }, { token: i3.FormBuilder }, { token: i4.WidgetTimeContextQueryService }, { token: i5.WidgetTimeContextHelperService }, { token: i6.Router }, { token: i7.ActionBarService }, { token: i8.AggregationService }], target: i0.ɵɵFactoryTarget.Component }); }
435
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.9", type: WidgetTimeContextComponent, selector: "c8y-widget-time-context", inputs: { canDecouple: "canDecouple", displaySettings: "displaySettings", hidden: "hidden" }, outputs: { dateContextChange: "dateContextChange" }, host: { classAttribute: "d-flex a-i-center gap-4" }, viewQueries: [{ propertyName: "action", first: true, predicate: DashboardChildActionComponent, descendants: true }, { propertyName: "dropdown", first: true, predicate: BsDropdownDirective, descendants: true }], ngImport: i0, template: "<c8y-action-bar-item\n *ngIf=\"isCoupled && !hidden\"\n [priority]=\"ACTION_BAR_PRIORITY\"\n [groupId]=\"ACTION_BAR_GROUP_ID\"\n [inGroupPriority]=\"actionBarInGroupPriority\"\n [placement]=\"'left'\"\n>\n <ng-container\n [ngTemplateOutlet]=\"dateTimePicker\"\n [ngTemplateOutletContext]=\"{\n date: [form.value.currentDateContextFromDate, form.value.currentDateContextToDate]\n }\"\n ></ng-container>\n</c8y-action-bar-item>\n\n<ng-container\n *ngIf=\"!isCoupled\"\n [ngTemplateOutlet]=\"dateTimePicker\"\n [ngTemplateOutletContext]=\"{\n date: [form.value.currentDateContextFromDate, form.value.currentDateContextToDate]\n }\"\n></ng-container>\n\n<ng-template\n #dateTimePicker\n let-date=\"date\"\n>\n <form\n class=\"d-flex gap-16 p-l-xs-16 p-r-xs-16 m-t-xs-8 m-b-xs-8\"\n [formGroup]=\"form\"\n >\n <ng-container *ngIf=\"displaySettings.globalTimeContext\">\n <div>\n <div\n class=\"dropdown flex-grow\"\n #dropdown=\"bs-dropdown\"\n dropdown\n [insideClick]=\"true\"\n *ngIf=\"date\"\n >\n <button\n class=\"dropdown-toggle form-control l-h-tight d-flex a-i-center\"\n attr.aria-label=\"{{ date[0] | c8yDate: DATE_FORMAT }} \u2014 {{\n date[1] | c8yDate: DATE_FORMAT\n }}\"\n tooltip=\"{{ date[0] | c8yDate: DATE_FORMAT }} \u2014 {{ date[1] | c8yDate: DATE_FORMAT }}\"\n placement=\"top\"\n container=\"body\"\n data-cy=\"widget-time-context--date-picker-dropdown-button\"\n [adaptivePosition]=\"false\"\n [delay]=\"500\"\n dropdownToggle\n >\n <i\n class=\"m-r-4\"\n c8yIcon=\"schedule1\"\n ></i>\n <div class=\"d-col text-left fit-w\">\n <span\n class=\"text-12\"\n data-cy=\"widget-time-context--selected-interval\"\n >\n {{ INTERVAL_TITLES[form.controls.currentDateContextInterval.value] | translate }}\n </span>\n <span\n class=\"text-10 text-muted text-truncate\"\n data-cy=\"widget-time-context--selected-time-range\"\n >\n {{ date[0] | c8yDate: DATE_FORMAT }} \u2014 {{ date[1] | c8yDate: DATE_FORMAT }}\n </span>\n </div>\n <span class=\"caret m-r-16 m-l-4\"></span>\n </button>\n\n <ul\n class=\"dropdown-menu dropdown-menu--date-range\"\n *dropdownMenu\n >\n <c8y-interval-picker\n class=\"d-contents\"\n formControlName=\"currentDateContextInterval\"\n ></c8y-interval-picker>\n\n <ng-container *ngIf=\"form.controls.currentDateContextInterval.value === 'custom'\">\n <div class=\"p-l-16 p-r-16\">\n <c8y-form-group\n [ngClass]=\"form.controls.temporaryUserSelectedFromDate.errors ? 'has-error' : ''\"\n >\n <label\n [title]=\"'From`date`' | translate\"\n for=\"temporaryUserSelectedFromDate\"\n translate\n >\n From`date`\n </label>\n <c8y-date-time-picker\n id=\"temporaryUserSelectedFromDate\"\n [maxDate]=\"form.value.temporaryUserSelectedToDate\"\n [placeholder]=\"'From`date`' | translate\"\n [formControl]=\"form.controls.temporaryUserSelectedFromDate\"\n [ngClass]=\"\n form.controls.temporaryUserSelectedFromDate.errors ? 'has-error' : ''\n \"\n ></c8y-date-time-picker>\n <c8y-messages [show]=\"form.controls.temporaryUserSelectedFromDate.errors\">\n <c8y-message\n name=\"dateAfterRangeMax\"\n [text]=\"'This date is after the latest allowed date.' | translate\"\n ></c8y-message>\n <c8y-message\n name=\"invalidDateTime\"\n [text]=\"'This date is invalid.' | translate\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n\n <c8y-form-group\n [ngClass]=\"form.controls.temporaryUserSelectedToDate.errors ? 'has-error' : ''\"\n >\n <label\n [title]=\"'To`date`' | translate\"\n for=\"temporaryUserSelectedToDate\"\n translate\n >\n To`date`\n </label>\n <c8y-date-time-picker\n id=\"temporaryUserSelectedToDate\"\n [minDate]=\"form.value.temporaryUserSelectedFromDate\"\n [placeholder]=\"'To`date`' | translate\"\n [formControl]=\"form.controls.temporaryUserSelectedToDate\"\n [ngClass]=\"form.controls.temporaryUserSelectedToDate.errors ? 'has-error' : ''\"\n ></c8y-date-time-picker>\n <c8y-messages [show]=\"form.controls.temporaryUserSelectedToDate.errors\">\n <c8y-message\n name=\"dateBeforeRangeMin\"\n [text]=\"'This date is before the earliest allowed date.' | translate\"\n ></c8y-message>\n <c8y-message\n name=\"invalidDateTime\"\n [text]=\"'This date is invalid.' | translate\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n </div>\n\n <div class=\"p-16 d-flex gap-8 separator-top\">\n <button\n class=\"btn btn-default btn-sm flex-grow\"\n title=\"{{ 'Reset' | translate }}\"\n type=\"button\"\n (click)=\"reset(); dropdown.isOpen = false\"\n [disabled]=\"form.value.realtime\"\n translate\n >\n Reset\n </button>\n\n <button\n class=\"btn btn-primary btn-sm flex-grow\"\n title=\"{{ 'Apply' | translate }}\"\n type=\"button\"\n (click)=\"applyDatetimeContext(); dropdown.isOpen = false\"\n [disabled]=\"\n (form.pristine && form.untouched) || form.invalid || form.value.realtime\n \"\n translate\n >\n Apply\n </button>\n </div>\n </ng-container>\n </ul>\n </div>\n </div>\n </ng-container>\n\n <div class=\"input-group w-auto\">\n <c8y-realtime-control\n class=\"form-control p-0 flex-no-grow w-auto\"\n *ngIf=\"displaySettings.globalRealtimeContext\"\n formControlName=\"realtime\"\n ></c8y-realtime-control>\n\n <c8y-aggregation-picker\n *ngIf=\"displaySettings.globalAggregationContext\"\n formControlName=\"aggregation\"\n [disabledAggregations]=\"disabledAggregations\"\n ></c8y-aggregation-picker>\n </div>\n </form>\n</ng-template>\n\n<c8y-dashboard-child-action>\n <button\n type=\"button\"\n (click)=\"toggleDecoupling()\"\n >\n <i [c8yIcon]=\"isCoupled ? 'schedule1' : 'today'\"></i>\n <span class=\"m-l-4\">\n {{ (isCoupled ? decoupleTimeContextLabel : coupleTimeContextLabel) | translate }}\n </span>\n </button>\n</c8y-dashboard-child-action>\n", dependencies: [{ kind: "directive", type: i9.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i10.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i11.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i11.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i11.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i12.ActionBarItemComponent, selector: "c8y-action-bar-item", inputs: ["placement", "priority", "itemClass", "injector", "groupId", "inGroupPriority"] }, { kind: "directive", type: i13.BsDropdownMenuDirective, selector: "[bsDropdownMenu],[dropdownMenu]", exportAs: ["bs-dropdown-menu"] }, { kind: "directive", type: i13.BsDropdownToggleDirective, selector: "[bsDropdownToggle],[dropdownToggle]", exportAs: ["bs-dropdown-toggle"] }, { kind: "directive", type: i13.BsDropdownDirective, selector: "[bsDropdown], [dropdown]", inputs: ["placement", "triggers", "container", "dropup", "autoClose", "isAnimated", "insideClick", "isDisabled", "isOpen"], outputs: ["isOpenChange", "onShown", "onHidden"], exportAs: ["bs-dropdown"] }, { kind: "directive", type: i14.TooltipDirective, selector: "[tooltip], [tooltipHtml]", inputs: ["adaptivePosition", "tooltip", "placement", "triggers", "container", "containerClass", "boundariesElement", "isOpen", "isDisabled", "delay", "tooltipHtml", "tooltipPlacement", "tooltipIsOpen", "tooltipEnable", "tooltipAppendToBody", "tooltipAnimation", "tooltipClass", "tooltipContext", "tooltipPopupDelay", "tooltipFadeDuration", "tooltipTrigger"], outputs: ["tooltipChange", "onShown", "onHidden", "tooltipStateChanged"], exportAs: ["bs-tooltip"] }, { kind: "directive", type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "component", type: i15.FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "directive", type: i16.MessageDirective, selector: "c8y-message", inputs: ["name", "text"] }, { kind: "component", type: i17.MessagesComponent, selector: "c8y-messages", inputs: ["show", "defaults", "helpMessage"] }, { kind: "directive", type: i3.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i18.DateTimePickerComponent, selector: "c8y-date-time-picker", inputs: ["minDate", "maxDate", "placeholder", "dateInputFormat", "adaptivePosition", "size", "dateType", "config"], outputs: ["onDateSelected"] }, { kind: "directive", type: i19.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: i20.IntervalPickerComponent, selector: "c8y-interval-picker", inputs: ["INTERVALS"] }, { kind: "component", type: i21.DashboardChildActionComponent, selector: "c8y-dashboard-child-action" }, { kind: "component", type: i22.RealtimeControlComponent, selector: "c8y-realtime-control" }, { kind: "component", type: i23.AggregationPickerComponent, selector: "c8y-aggregation-picker", inputs: ["disabledAggregations"] }, { kind: "pipe", type: i24.DatePipe, name: "c8yDate" }, { kind: "pipe", type: i19.TranslatePipe, name: "translate" }] }); }
435
436
  }
436
437
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: WidgetTimeContextComponent, decorators: [{
437
438
  type: Component,
438
- args: [{ selector: 'c8y-widget-time-context', host: { class: 'd-flex a-i-center gap-4' }, template: "<c8y-action-bar-item\n *ngIf=\"isCoupled && !hidden\"\n [groupId]=\"ACTION_BAR_GROUP_ID\"\n [inGroupPriority]=\"actionBarInGroupPriority\"\n [placement]=\"'left'\"\n>\n <ng-container\n [ngTemplateOutlet]=\"dateTimePicker\"\n [ngTemplateOutletContext]=\"{\n date: [form.value.currentDateContextFromDate, form.value.currentDateContextToDate]\n }\"\n ></ng-container>\n</c8y-action-bar-item>\n\n<ng-container\n *ngIf=\"!isCoupled\"\n [ngTemplateOutlet]=\"dateTimePicker\"\n [ngTemplateOutletContext]=\"{\n date: [form.value.currentDateContextFromDate, form.value.currentDateContextToDate]\n }\"\n></ng-container>\n\n<ng-template\n #dateTimePicker\n let-date=\"date\"\n>\n <form\n class=\"d-flex gap-16 p-l-xs-16 p-r-xs-16 m-t-xs-8 m-b-xs-8\"\n [formGroup]=\"form\"\n >\n <ng-container *ngIf=\"displaySettings.globalTimeContext\">\n <div>\n <div\n class=\"dropdown flex-grow\"\n #dropdown=\"bs-dropdown\"\n \n dropdown\n [insideClick]=\"true\"\n *ngIf=\"date\"\n >\n <button\n data-cy=\"widget-time-context--date-picker-dropdown-button\"\n class=\"dropdown-toggle form-control l-h-tight d-flex a-i-center\"\n attr.aria-label=\"{{ date[0] | c8yDate: DATE_FORMAT }} \u2014 {{\n date[1] | c8yDate: DATE_FORMAT\n }}\"\n tooltip=\"{{ date[0] | c8yDate: DATE_FORMAT }} \u2014 {{ date[1] | c8yDate: DATE_FORMAT }}\"\n placement=\"top\"\n container=\"body\"\n [adaptivePosition]=\"false\"\n [delay]=\"500\"\n dropdownToggle\n >\n <i\n class=\"m-r-4 \"\n c8yIcon=\"schedule1\"\n ></i>\n <div class=\"d-col text-left fit-w\">\n <span class=\"text-12\" data-cy=\"widget-time-context--selected-interval\">\n {{ INTERVAL_TITLES[form.controls.currentDateContextInterval.value] | translate }}\n </span>\n <span\n class=\"text-10 text-muted text-truncate\"\n data-cy=\"widget-time-context--selected-time-range\"\n >\n {{ date[0] | c8yDate: DATE_FORMAT }} \u2014 {{ date[1] | c8yDate: DATE_FORMAT }}\n </span>\n </div>\n <span class=\"caret m-r-16 m-l-4\"></span>\n </button>\n\n <ul\n class=\"dropdown-menu dropdown-menu--date-range\"\n *dropdownMenu\n >\n <c8y-interval-picker\n class=\"d-contents\"\n formControlName=\"currentDateContextInterval\"\n ></c8y-interval-picker>\n\n <ng-container *ngIf=\"form.controls.currentDateContextInterval.value === 'custom'\">\n <div class=\"p-l-16 p-r-16\">\n <c8y-form-group\n [ngClass]=\"form.controls.temporaryUserSelectedFromDate.errors ? 'has-error' : ''\"\n >\n <label\n [title]=\"'From`date`' | translate\"\n for=\"temporaryUserSelectedFromDate\"\n translate\n >\n From`date`\n </label>\n <c8y-date-time-picker\n id=\"temporaryUserSelectedFromDate\"\n [maxDate]=\"form.value.temporaryUserSelectedToDate\"\n [placeholder]=\"'From`date`' | translate\"\n [formControl]=\"form.controls.temporaryUserSelectedFromDate\"\n [ngClass]=\"form.controls.temporaryUserSelectedFromDate.errors ? 'has-error' : ''\"\n ></c8y-date-time-picker>\n <c8y-messages [show]=\"form.controls.temporaryUserSelectedFromDate.errors\">\n <c8y-message\n name=\"dateAfterRangeMax\"\n [text]=\"'This date is after the latest allowed date.' | translate\"\n ></c8y-message>\n <c8y-message\n name=\"invalidDateTime\"\n [text]=\"'This date is invalid.' | translate\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n\n <c8y-form-group\n [ngClass]=\"form.controls.temporaryUserSelectedToDate.errors ? 'has-error' : ''\"\n >\n <label\n [title]=\"'To`date`' | translate\"\n for=\"temporaryUserSelectedToDate\"\n translate\n >\n To`date`\n </label>\n <c8y-date-time-picker\n id=\"temporaryUserSelectedToDate\"\n [minDate]=\"form.value.temporaryUserSelectedFromDate\"\n [placeholder]=\"'To`date`' | translate\"\n [formControl]=\"form.controls.temporaryUserSelectedToDate\"\n [ngClass]=\"form.controls.temporaryUserSelectedToDate.errors ? 'has-error' : ''\"\n ></c8y-date-time-picker>\n <c8y-messages [show]=\"form.controls.temporaryUserSelectedToDate.errors\">\n <c8y-message\n name=\"dateBeforeRangeMin\"\n [text]=\"'This date is before the earliest allowed date.' | translate\"\n ></c8y-message>\n <c8y-message\n name=\"invalidDateTime\"\n [text]=\"'This date is invalid.' | translate\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n </div>\n\n <div class=\"p-16 d-flex gap-8 separator-top\">\n <button\n class=\"btn btn-default btn-sm flex-grow\"\n title=\"{{ 'Reset' | translate }}\"\n type=\"button\"\n (click)=\"reset(); dropdown.isOpen = false\"\n [disabled]=\"form.value.realtime\"\n translate\n >\n Reset\n </button>\n\n <button\n class=\"btn btn-primary btn-sm flex-grow\"\n title=\"{{ 'Apply' | translate }}\"\n type=\"button\"\n (click)=\"applyDatetimeContext(); dropdown.isOpen = false\"\n [disabled]=\"\n (form.pristine && form.untouched) || form.invalid || form.value.realtime\n \"\n translate\n >\n Apply\n </button>\n </div>\n </ng-container>\n </ul>\n </div>\n </div>\n </ng-container>\n\n <div class=\"input-group w-auto\">\n <c8y-realtime-control\n *ngIf=\"displaySettings.globalRealtimeContext\"\n formControlName=\"realtime\"\n class=\"form-control p-0 flex-no-grow w-auto\"\n ></c8y-realtime-control>\n\n <c8y-aggregation-picker\n *ngIf=\"displaySettings.globalAggregationContext\"\n formControlName=\"aggregation\"\n [disabledAggregations]=\"disabledAggregations\"\n ></c8y-aggregation-picker>\n </div>\n </form>\n</ng-template>\n\n<c8y-dashboard-child-action>\n <button\n type=\"button\"\n (click)=\"toggleDecoupling()\"\n >\n <i [c8yIcon]=\"isCoupled ? 'schedule1' : 'today'\"></i>\n <span class=\"m-l-4\">\n {{ (isCoupled ? decoupleTimeContextLabel : coupleTimeContextLabel) | translate }}\n </span>\n </button>\n</c8y-dashboard-child-action>\n" }]
439
- }], ctorParameters: () => [{ type: i1.WidgetsDashboardEventService }, { type: i2.DashboardChildComponent }, { type: i3.FormBuilder }, { type: i4.WidgetTimeContextQueryService }, { type: i5.WidgetTimeContextHelperService }, { type: i6.Router }, { type: i7.ActionBarService }], propDecorators: { canDecouple: [{
439
+ args: [{ selector: 'c8y-widget-time-context', host: { class: 'd-flex a-i-center gap-4' }, template: "<c8y-action-bar-item\n *ngIf=\"isCoupled && !hidden\"\n [priority]=\"ACTION_BAR_PRIORITY\"\n [groupId]=\"ACTION_BAR_GROUP_ID\"\n [inGroupPriority]=\"actionBarInGroupPriority\"\n [placement]=\"'left'\"\n>\n <ng-container\n [ngTemplateOutlet]=\"dateTimePicker\"\n [ngTemplateOutletContext]=\"{\n date: [form.value.currentDateContextFromDate, form.value.currentDateContextToDate]\n }\"\n ></ng-container>\n</c8y-action-bar-item>\n\n<ng-container\n *ngIf=\"!isCoupled\"\n [ngTemplateOutlet]=\"dateTimePicker\"\n [ngTemplateOutletContext]=\"{\n date: [form.value.currentDateContextFromDate, form.value.currentDateContextToDate]\n }\"\n></ng-container>\n\n<ng-template\n #dateTimePicker\n let-date=\"date\"\n>\n <form\n class=\"d-flex gap-16 p-l-xs-16 p-r-xs-16 m-t-xs-8 m-b-xs-8\"\n [formGroup]=\"form\"\n >\n <ng-container *ngIf=\"displaySettings.globalTimeContext\">\n <div>\n <div\n class=\"dropdown flex-grow\"\n #dropdown=\"bs-dropdown\"\n dropdown\n [insideClick]=\"true\"\n *ngIf=\"date\"\n >\n <button\n class=\"dropdown-toggle form-control l-h-tight d-flex a-i-center\"\n attr.aria-label=\"{{ date[0] | c8yDate: DATE_FORMAT }} \u2014 {{\n date[1] | c8yDate: DATE_FORMAT\n }}\"\n tooltip=\"{{ date[0] | c8yDate: DATE_FORMAT }} \u2014 {{ date[1] | c8yDate: DATE_FORMAT }}\"\n placement=\"top\"\n container=\"body\"\n data-cy=\"widget-time-context--date-picker-dropdown-button\"\n [adaptivePosition]=\"false\"\n [delay]=\"500\"\n dropdownToggle\n >\n <i\n class=\"m-r-4\"\n c8yIcon=\"schedule1\"\n ></i>\n <div class=\"d-col text-left fit-w\">\n <span\n class=\"text-12\"\n data-cy=\"widget-time-context--selected-interval\"\n >\n {{ INTERVAL_TITLES[form.controls.currentDateContextInterval.value] | translate }}\n </span>\n <span\n class=\"text-10 text-muted text-truncate\"\n data-cy=\"widget-time-context--selected-time-range\"\n >\n {{ date[0] | c8yDate: DATE_FORMAT }} \u2014 {{ date[1] | c8yDate: DATE_FORMAT }}\n </span>\n </div>\n <span class=\"caret m-r-16 m-l-4\"></span>\n </button>\n\n <ul\n class=\"dropdown-menu dropdown-menu--date-range\"\n *dropdownMenu\n >\n <c8y-interval-picker\n class=\"d-contents\"\n formControlName=\"currentDateContextInterval\"\n ></c8y-interval-picker>\n\n <ng-container *ngIf=\"form.controls.currentDateContextInterval.value === 'custom'\">\n <div class=\"p-l-16 p-r-16\">\n <c8y-form-group\n [ngClass]=\"form.controls.temporaryUserSelectedFromDate.errors ? 'has-error' : ''\"\n >\n <label\n [title]=\"'From`date`' | translate\"\n for=\"temporaryUserSelectedFromDate\"\n translate\n >\n From`date`\n </label>\n <c8y-date-time-picker\n id=\"temporaryUserSelectedFromDate\"\n [maxDate]=\"form.value.temporaryUserSelectedToDate\"\n [placeholder]=\"'From`date`' | translate\"\n [formControl]=\"form.controls.temporaryUserSelectedFromDate\"\n [ngClass]=\"\n form.controls.temporaryUserSelectedFromDate.errors ? 'has-error' : ''\n \"\n ></c8y-date-time-picker>\n <c8y-messages [show]=\"form.controls.temporaryUserSelectedFromDate.errors\">\n <c8y-message\n name=\"dateAfterRangeMax\"\n [text]=\"'This date is after the latest allowed date.' | translate\"\n ></c8y-message>\n <c8y-message\n name=\"invalidDateTime\"\n [text]=\"'This date is invalid.' | translate\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n\n <c8y-form-group\n [ngClass]=\"form.controls.temporaryUserSelectedToDate.errors ? 'has-error' : ''\"\n >\n <label\n [title]=\"'To`date`' | translate\"\n for=\"temporaryUserSelectedToDate\"\n translate\n >\n To`date`\n </label>\n <c8y-date-time-picker\n id=\"temporaryUserSelectedToDate\"\n [minDate]=\"form.value.temporaryUserSelectedFromDate\"\n [placeholder]=\"'To`date`' | translate\"\n [formControl]=\"form.controls.temporaryUserSelectedToDate\"\n [ngClass]=\"form.controls.temporaryUserSelectedToDate.errors ? 'has-error' : ''\"\n ></c8y-date-time-picker>\n <c8y-messages [show]=\"form.controls.temporaryUserSelectedToDate.errors\">\n <c8y-message\n name=\"dateBeforeRangeMin\"\n [text]=\"'This date is before the earliest allowed date.' | translate\"\n ></c8y-message>\n <c8y-message\n name=\"invalidDateTime\"\n [text]=\"'This date is invalid.' | translate\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n </div>\n\n <div class=\"p-16 d-flex gap-8 separator-top\">\n <button\n class=\"btn btn-default btn-sm flex-grow\"\n title=\"{{ 'Reset' | translate }}\"\n type=\"button\"\n (click)=\"reset(); dropdown.isOpen = false\"\n [disabled]=\"form.value.realtime\"\n translate\n >\n Reset\n </button>\n\n <button\n class=\"btn btn-primary btn-sm flex-grow\"\n title=\"{{ 'Apply' | translate }}\"\n type=\"button\"\n (click)=\"applyDatetimeContext(); dropdown.isOpen = false\"\n [disabled]=\"\n (form.pristine && form.untouched) || form.invalid || form.value.realtime\n \"\n translate\n >\n Apply\n </button>\n </div>\n </ng-container>\n </ul>\n </div>\n </div>\n </ng-container>\n\n <div class=\"input-group w-auto\">\n <c8y-realtime-control\n class=\"form-control p-0 flex-no-grow w-auto\"\n *ngIf=\"displaySettings.globalRealtimeContext\"\n formControlName=\"realtime\"\n ></c8y-realtime-control>\n\n <c8y-aggregation-picker\n *ngIf=\"displaySettings.globalAggregationContext\"\n formControlName=\"aggregation\"\n [disabledAggregations]=\"disabledAggregations\"\n ></c8y-aggregation-picker>\n </div>\n </form>\n</ng-template>\n\n<c8y-dashboard-child-action>\n <button\n type=\"button\"\n (click)=\"toggleDecoupling()\"\n >\n <i [c8yIcon]=\"isCoupled ? 'schedule1' : 'today'\"></i>\n <span class=\"m-l-4\">\n {{ (isCoupled ? decoupleTimeContextLabel : coupleTimeContextLabel) | translate }}\n </span>\n </button>\n</c8y-dashboard-child-action>\n" }]
440
+ }], ctorParameters: () => [{ type: i1.WidgetsDashboardEventService }, { type: i2.DashboardChildComponent }, { type: i3.FormBuilder }, { type: i4.WidgetTimeContextQueryService }, { type: i5.WidgetTimeContextHelperService }, { type: i6.Router }, { type: i7.ActionBarService }, { type: i8.AggregationService }], propDecorators: { canDecouple: [{
440
441
  type: Input
441
442
  }], displaySettings: [{
442
443
  type: Input
@@ -451,4 +452,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImpor
451
452
  type: ViewChild,
452
453
  args: [BsDropdownDirective]
453
454
  }] } });
454
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2lkZ2V0LXRpbWUtY29udGV4dC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9jb3JlL2Rhc2hib2FyZC93aWdldC10aW1lLWNvbnRleHQvd2lkZ2V0LXRpbWUtY29udGV4dC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9jb3JlL2Rhc2hib2FyZC93aWdldC10aW1lLWNvbnRleHQvd2lkZ2V0LXRpbWUtY29udGV4dC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBR0wsTUFBTSxFQUNOLFNBQVMsRUFDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBZ0IsTUFBTSxNQUFNLENBQUM7QUFDdkQsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDcEYsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDdkUsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFFbEYsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDckMsT0FBTyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNuRCxPQUFPLEVBQ0wsa0JBQWtCLEVBR2xCLGVBQWUsRUFDZixZQUFZLEVBSWIsTUFBTSw2QkFBNkIsQ0FBQztBQUNyQyxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUNwRixPQUFPLEVBQUUsOEJBQThCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUN0RixPQUFPLEVBQUUsYUFBYSxFQUFFLGFBQWEsRUFBRSxlQUFlLEVBQUUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDeEYsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDcEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUM5QyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQU83RCxNQUFNLE9BQU8sMEJBQTBCO0lBd0NyQzs7T0FFRztJQUNILFlBQ1Usa0JBQWdELEVBQ2hELGNBQXVDLEVBQ3ZDLFdBQXdCLEVBQ3hCLFlBQTJDLEVBQzNDLGFBQTZDLEVBQzdDLE1BQWMsRUFDZCxnQkFBa0M7UUFObEMsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUE4QjtRQUNoRCxtQkFBYyxHQUFkLGNBQWMsQ0FBeUI7UUFDdkMsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFDeEIsaUJBQVksR0FBWixZQUFZLENBQStCO1FBQzNDLGtCQUFhLEdBQWIsYUFBYSxDQUFnQztRQUM3QyxXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQ2QscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQWpEbkMsb0JBQWUsR0FBRyxlQUFlLENBQUM7UUFDbEMsZ0JBQVcsR0FBRyxPQUFPLENBQUM7UUFDL0I7O1dBRUc7UUFFSCxnQkFBVyxHQUFHLElBQUksQ0FBQztRQUlWLFdBQU0sR0FBRyxLQUFLLENBQUM7UUFFeEI7O1dBRUc7UUFFSCxzQkFBaUIsR0FBRyxJQUFJLFlBQVksRUFBMkIsQ0FBQztRQU1oRTs7V0FFRztRQUNILGNBQVMsR0FBRyxJQUFJLENBQUM7UUFDakIsNkJBQXdCLEdBQUcsT0FBTyxDQUFDLHVCQUF1QixDQUFDLENBQUM7UUFDNUQsMkJBQXNCLEdBQUcsT0FBTyxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFHeEQseUJBQW9CLEdBQThDLEVBQUUsQ0FBQztRQUM1RCxxQkFBZ0IsR0FBbUIsTUFBTSxDQUFDO1FBQzFDLHdCQUFtQixHQUFHLGFBQWEsQ0FBQztRQUNwQyxzQkFBaUIsR0FBRyxJQUFJLENBQUM7UUFFMUIsYUFBUSxHQUFrQixJQUFJLE9BQU8sRUFBRSxDQUFDO0lBZTdDLENBQUM7SUFFSjs7T0FFRztJQUNILFFBQVE7UUFDTixJQUFJLENBQUMsd0JBQXdCLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7UUFFOUYsTUFBTSxjQUFjLEdBQ2xCLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQ3ZELGNBQWMsQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUNwRCxjQUFjLENBQUMsSUFBSSxFQUNuQixjQUFjLENBQUMsV0FBVyxDQUMzQixDQUFDO1FBQ0YsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBRTVDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUM7WUFDMUIsSUFBSSxFQUFFLGNBQWMsQ0FBQyxJQUFJO1lBQ3pCLFFBQVEsRUFBRSxjQUFjLENBQUMsUUFBUTtZQUNqQyxXQUFXLEVBQUUsY0FBYyxDQUFDLFdBQVc7U0FDeEMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDbkIsSUFBSSxDQUFDLFlBQVksQ0FBQyx5QkFBeUIsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUM5RCxDQUFDO1FBQ0QsSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7UUFDaEMsSUFBSSxDQUFDLDRCQUE0QixFQUFFLENBQUM7UUFDcEMsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7UUFDL0IsSUFBSSxDQUFDLHlCQUF5QixFQUFFLENBQUM7UUFDakMsSUFBSSxDQUFDLHlCQUF5QixFQUFFLENBQUM7UUFDakMsSUFBSSxDQUFDLDRCQUE0QixFQUFFLENBQUM7UUFFcEMsSUFBSSxjQUFjLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDNUIsSUFBSSxDQUFDLHFCQUFxQixDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNwRCxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDdkIsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNILGVBQWU7UUFDYixJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNyQixJQUFJLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQ2hELENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxnQkFBZ0I7UUFDZCxJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUNqQyxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsWUFBWSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQzVFLE1BQU0sRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxHQUFHLGNBQWMsQ0FBQztRQUMzRCxJQUFJLElBQXFCLENBQUM7UUFDMUIsSUFBSSxRQUFRLEVBQUUsQ0FBQztZQUNiLElBQUksR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLDRCQUE0QixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ25FLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxHQUFHLGNBQWMsQ0FBQyxlQUFlLENBQUM7UUFDeEMsQ0FBQztRQUNELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxDQUFDLENBQUM7UUFFakUsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDbkIsSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7WUFDaEMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQztRQUMvRCxDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyw0QkFBNEIsRUFBRSxDQUFDO1FBQ3RDLENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxvQkFBb0I7UUFDbEIsSUFBSSxDQUFDLE1BQU0sQ0FBQztZQUNWLElBQUksRUFBRTtnQkFDSixJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyw2QkFBNkIsQ0FBQztnQkFDdkQsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsMkJBQTJCLENBQUM7YUFDdEQ7WUFDRCxRQUFRLEVBQUUsSUFBSTtZQUNkLFFBQVEsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRO1lBQ2xDLFdBQVcsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXO1NBQ3pDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUs7UUFDSCxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDcEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFRDs7T0FFRztJQUNILFdBQVc7UUFDVCxJQUFJLENBQUMsNEJBQTRCLEVBQUUsQ0FBQztRQUNwQyxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztRQUNoQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVPLHlCQUF5QjtRQUMvQixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQywwQkFBMEIsQ0FBQyxZQUFZO2FBQ3ZELElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2FBQzlCLFNBQVMsQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUNwQixJQUFJLElBQXFCLENBQUM7WUFDMUIsSUFBSSxRQUFRLEtBQUssUUFBUSxFQUFFLENBQUM7Z0JBQzFCLElBQUksR0FBRztvQkFDTCxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQywwQkFBMEIsQ0FBQyxLQUFLLENBQUM7b0JBQzdELElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLHdCQUF3QixDQUFDLEtBQUssQ0FBQztpQkFDNUQsQ0FBQztZQUNKLENBQUM7aUJBQU0sQ0FBQztnQkFDTixJQUFJLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyw0QkFBNEIsQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDakUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO1lBQy9CLENBQUM7WUFDRCxJQUFJLENBQUMsTUFBTSxDQUFDO2dCQUNWLElBQUk7Z0JBQ0osUUFBUTtnQkFDUixRQUFRLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUTtnQkFDbEMsV0FBVyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVc7YUFDekMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRU8seUJBQXlCO1FBQy9CLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEVBQUU7WUFDM0YsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBRXJDLElBQUksUUFBUSxFQUFFLENBQUM7Z0JBQ2IsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3ZCLENBQUM7aUJBQU0sQ0FBQztnQkFDTixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDdEIsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLDRCQUE0QjtRQUNsQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsWUFBWTthQUN4QyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQzthQUM5QixTQUFTLENBQUMsV0FBVyxDQUFDLEVBQUU7WUFDdkIsSUFBSSxDQUFDLE1BQU0sQ0FBQztnQkFDVixJQUFJLEVBQUU7b0JBQ0osSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsMEJBQTBCLENBQUM7b0JBQ3BELElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLHdCQUF3QixDQUFDO2lCQUNuRDtnQkFDRCxRQUFRLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsMEJBQTBCO2dCQUNwRCxRQUFRLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUTtnQkFDbEMsV0FBVzthQUNaLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVPLFVBQVUsQ0FBQyxPQUErQjtRQUNoRCxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDO1lBQzVCLDZCQUE2QixFQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFO1lBQzVELDJCQUEyQixFQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFO1lBQzFELDBCQUEwQixFQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFO1lBQ3pELHdCQUF3QixFQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFO1lBQ3ZELDBCQUEwQixFQUFFLE9BQU8sQ0FBQyxRQUFRLElBQUksUUFBUTtZQUN4RCxRQUFRLEVBQUUsT0FBTyxDQUFDLFFBQVE7WUFDMUIsV0FBVyxFQUFFLE9BQU8sQ0FBQyxXQUFXO1NBQ2pDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7cUVBRWlFO0lBQ3pELE1BQU0sQ0FBQyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBMEI7UUFDOUUsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQ3RFLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ25CLE1BQU0sU0FBUyxHQUNiLFFBQVEsSUFBSSxRQUFRLEtBQUssUUFBUTtnQkFDL0IsQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBQ3ZELENBQUMsQ0FBQyxFQUFFLGVBQWUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxnQkFBZ0IsRUFBRSxDQUFDO1lBQ3pFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsY0FBYyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDO1FBQzFFLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLGdCQUFnQixFQUFFLENBQUMsQ0FBQztZQUNuRixJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDO1FBQ2pGLENBQUM7SUFDSCxDQUFDO0lBRU8sd0JBQXdCO1FBQzlCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxhQUFhLENBQW1CLGNBQWMsQ0FBQyxDQUFDO1FBQ3ZGLElBQUksQ0FBQyxZQUFZLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE9BQTBCLEVBQUUsRUFBRTtZQUNsRSxJQUFJLElBQXFCLENBQUM7WUFDMUIsTUFBTSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLEdBQUcsT0FBTyxDQUFDO1lBQ3BELElBQUksUUFBUSxFQUFFLENBQUM7Z0JBQ2IsSUFBSSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsNEJBQTRCLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzNFLENBQUM7aUJBQU0sQ0FBQztnQkFDTixJQUFJLEdBQUcsT0FBTyxDQUFDLGVBQWUsQ0FBQztZQUNqQyxDQUFDO1lBRUQsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQztnQkFDMUIsSUFBSTtnQkFDSixRQUFRO2dCQUNSLFdBQVc7YUFDWixDQUFDLENBQUM7WUFDSCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDO1lBQ2pFLElBQUksQ0FBQyxZQUFZLENBQUMseUJBQXlCLENBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDO1FBQ3pGLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLGdCQUFnQixDQUFDLEVBQ3ZCLElBQUksRUFDSixRQUFRLEVBQ1IsUUFBUSxFQUNSLFdBQVcsRUFDWTtRQUN2QixJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FDbEI7WUFDRSw2QkFBNkIsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFO1lBQ3BELDJCQUEyQixFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUU7WUFDbEQsMEJBQTBCLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRTtZQUNqRCx3QkFBd0IsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFO1lBQy9DLFFBQVE7WUFDUiwwQkFBMEIsRUFBRSxRQUFRLElBQUksUUFBUTtZQUNoRCxXQUFXLEVBQUUsV0FBVyxJQUFJLElBQUk7U0FDakMsRUFDRDtZQUNFLFNBQVMsRUFBRSxLQUFLO1NBQ2pCLENBQ0YsQ0FBQztJQUNKLENBQUM7SUFFTyw0QkFBNEI7UUFDbEMsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDdEIsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNsQyxDQUFDO0lBQ0gsQ0FBQztJQUVPLGlCQUFpQjtRQUN2QixNQUFNLDhCQUE4QixHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsOEJBQThCLEVBQUUsQ0FBQztRQUMxRixJQUFJLDhCQUE4QixFQUFFLENBQUM7WUFDbkMsT0FBTztnQkFDTCxHQUFHLDhCQUE4QjtnQkFDakMsUUFBUSxFQUFFLDhCQUE4QixDQUFDLFFBQVEsSUFBSSxLQUFLO2dCQUMxRCxXQUFXLEVBQUUsOEJBQThCLENBQUMsUUFBUTtvQkFDbEQsQ0FBQyxDQUFDLElBQUk7b0JBQ04sQ0FBQyxDQUFDLDhCQUE4QixDQUFDLFdBQVcsSUFBSSxJQUFJO2FBQ3ZELENBQUM7UUFDSixDQUFDO1FBQ0QsOENBQThDO1FBQzlDLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxZQUFZLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDNUUsTUFBTSxRQUFRLEdBQUcsY0FBYyxFQUFFLFFBQVEsSUFBSSxLQUFLLENBQUM7UUFDbkQsSUFBSSxjQUFjLElBQUksY0FBYyxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3JELE9BQU87Z0JBQ0wsSUFBSSxFQUFFLGNBQWMsQ0FBQyxlQUFlO2dCQUNwQyxRQUFRLEVBQUUsUUFBUTtnQkFDbEIsUUFBUTtnQkFDUixXQUFXLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxXQUFXO2FBQzFELENBQUM7UUFDSixDQUFDO1FBQ0QsSUFBSSxjQUFjLElBQUksY0FBYyxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQzlDLE9BQU87Z0JBQ0wsSUFBSSxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsNEJBQTRCLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQztnQkFDOUUsUUFBUSxFQUFFLGNBQWMsQ0FBQyxRQUFRO2dCQUNqQyxRQUFRO2dCQUNSLFdBQVcsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLFdBQVc7YUFDMUQsQ0FBQztRQUNKLENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFTyw0QkFBNEI7UUFDbEMsSUFBSSxDQUFDLFlBQVk7YUFDZCxrQkFBa0IsRUFBRTthQUNwQixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQzthQUM5QixTQUFTLENBQ1IsQ0FBQyxFQUNDLGVBQWUsRUFDZixhQUFhLEVBQ2IsbUJBQW1CLEVBQ25CLG1CQUFtQixFQUNuQixzQkFBc0IsRUFDTSxFQUFFLEVBQUU7WUFDaEMsTUFBTSxRQUFRLEdBQUcsbUJBQW1CLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDO1lBQ2pFLElBQUksbUJBQW1CLEVBQUUsQ0FBQztnQkFDeEIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQztvQkFDM0IsSUFBSSxFQUFFLGNBQWM7b0JBQ3BCLElBQUksRUFBRTt3QkFDSixRQUFRLEVBQUUsbUJBQW1CO3dCQUM3QixRQUFRO3dCQUNSLFdBQVcsRUFBRSxzQkFBc0I7cUJBQ3BDO2lCQUNGLENBQUMsQ0FBQztZQUNMLENBQUM7aUJBQU0sQ0FBQztnQkFDTixNQUFNLFdBQVcsR0FBb0I7b0JBQ25DLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQztvQkFDekIsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDO2lCQUN4QixDQUFDO2dCQUNGLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUM7b0JBQzNCLElBQUksRUFBRSxjQUFjO29CQUNwQixJQUFJLEVBQUU7d0JBQ0osZUFBZSxFQUFFLFdBQVc7d0JBQzVCLFFBQVE7d0JBQ1IsV0FBVyxFQUFFLHNCQUFzQjtxQkFDcEM7aUJBQ0YsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztRQUNILENBQUMsQ0FDRixDQUFDO0lBQ04sQ0FBQztJQUVPLHdCQUF3QjtRQUM5Qiw4SUFBOEk7UUFDOUksSUFBSSxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztZQUM5QixPQUFPO1FBQ1QsQ0FBQztRQUNELDRFQUE0RTtRQUM1RSxNQUFNLDhCQUE4QixHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FDakYsTUFBTSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsT0FBTyxLQUFLLElBQUksQ0FBQyxtQkFBbUIsQ0FDdEQsQ0FBQztRQUNGLElBQUksQ0FBQyw4QkFBOEIsRUFBRSxDQUFDO1lBQ3BDLElBQUksQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUN2QyxDQUFDO0lBQ0gsQ0FBQztJQUVPLHVCQUF1QjtRQUM3QixJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU07YUFDZixJQUFJLENBQ0gsTUFBTSxDQUNKLENBQUMsQ0FBQyxFQUFFLENBQ0YsQ0FBQyxZQUFZLGVBQWUsSUFBSSxDQUFDLFlBQVksYUFBYSxJQUFJLENBQUMsWUFBWSxhQUFhLENBQzNGLEVBQ0QsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FDekI7YUFDQSxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDYixJQUFJLENBQUMsb0JBQW9CLEdBQUcsQ0FBQyxZQUFZLGVBQWUsQ0FBQztRQUMzRCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFTyxpQkFBaUI7UUFDdkIsT0FBTztZQUNMLElBQUksRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLDRCQUE0QixDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztZQUM1RSxRQUFRLEVBQUUsSUFBSSxDQUFDLGdCQUFnQjtZQUMvQixRQUFRLEVBQUUsS0FBSztZQUNmLFdBQVcsRUFBRSxlQUFlLENBQUMsUUFBUTtTQUN0QyxDQUFDO0lBQ0osQ0FBQztJQUVPLGFBQWE7UUFDbkIsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsNkJBQTZCLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDM0QsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsMkJBQTJCLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDekQsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBRXpDLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDO2FBQ3pELElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2FBQzlCLFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDZCxNQUFNLFdBQVcsR0FBRyxJQUFJLElBQUksQ0FDMUIsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsMEJBQTBCLENBQUMsQ0FBQyxPQUFPLEVBQUUsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQ3hGLENBQUM7WUFDRixNQUFNLFNBQVMsR0FBRyxJQUFJLElBQUksQ0FDeEIsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsd0JBQXdCLENBQUMsQ0FBQyxPQUFPLEVBQUUsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQ3RGLENBQUM7WUFDRixJQUFJLENBQUMsZ0JBQWdCLENBQUM7Z0JBQ3BCLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxTQUFTLENBQUM7Z0JBQzlCLFFBQVEsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQywwQkFBMEI7Z0JBQ3BELFFBQVEsRUFBRSxJQUFJO2dCQUNkLFdBQVcsRUFBRSxJQUFJO2FBQ2xCLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVPLFlBQVk7UUFDbEIsSUFBSSxDQUFDLG9CQUFvQixFQUFFLFdBQVcsRUFBRSxDQUFDO1FBQ3pDLElBQUksQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLDZCQUE2QixDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQzNELElBQUksQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLDJCQUEyQixDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ3pELElBQUksQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUMzQyxDQUFDO0lBRU8scUJBQXFCLENBQUMsUUFBaUI7UUFDN0MsSUFBSSxlQUFnQyxDQUFDO1FBQ3JDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsMEJBQTBCLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDNUQsZUFBZSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsNEJBQTRCLENBQy9ELElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLDBCQUEwQixDQUMzQyxDQUFDO1FBQ0osQ0FBQzthQUFNLENBQUM7WUFDTixNQUFNLG1CQUFtQixHQUN2QixJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLE9BQU8sRUFBRTtnQkFDNUQsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsMEJBQTBCLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNqRSxNQUFNLE1BQU0sR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1lBQzFCLE1BQU0sUUFBUSxHQUFHLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsR0FBRyxtQkFBbUIsQ0FBQyxDQUFDO1lBQ2xFLGVBQWUsR0FBRyxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUN2QyxDQUFDO1FBRUQsSUFBSSxDQUFDLE1BQU0sQ0FBQztZQUNWLElBQUksRUFBRSxlQUFlO1lBQ3JCLFFBQVEsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQywwQkFBMEI7WUFDcEQsUUFBUTtZQUNSLFdBQVcsRUFBRSxJQUFJO1NBQ2xCLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyxvQkFBb0IsQ0FDMUIsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFrQixFQUNuQyxXQUE0QjtRQUU1QixNQUFNLGFBQWEsR0FBRyxNQUFNLENBQUMsT0FBTyxFQUFFLEdBQUcsUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQzVELElBQUksQ0FBQyxvQkFBb0IsR0FBRztZQUMxQixLQUFLLEVBQUUsYUFBYSxJQUFJLFlBQVksQ0FBQyxHQUFHO1lBQ3hDLE1BQU0sRUFBRSxhQUFhLElBQUksWUFBWSxDQUFDLElBQUk7WUFDMUMsUUFBUSxFQUFFLGFBQWEsSUFBSSxZQUFZLENBQUMsTUFBTTtTQUMvQyxDQUFDO1FBQ0YsTUFBTSxtQkFBbUIsR0FBRyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxXQUFXLENBQUMsSUFBSSxXQUFXLEtBQUssSUFBSSxDQUFDO1FBQzVGLElBQUksbUJBQW1CLEVBQUUsQ0FBQztZQUN4QixPQUFPLFdBQVcsQ0FBQztRQUNyQixDQUFDO1FBRUQsSUFBSSxhQUFhLElBQUksa0JBQWtCLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDcEQsT0FBTyxlQUFlLENBQUMsS0FBSyxDQUFDO1FBQy9CLENBQUM7YUFBTSxJQUFJLGFBQWEsSUFBSSxrQkFBa0IsQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUM1RCxPQUFPLGVBQWUsQ0FBQyxNQUFNLENBQUM7UUFDaEMsQ0FBQzthQUFNLElBQUksYUFBYSxJQUFJLGtCQUFrQixDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQzlELE9BQU8sZUFBZSxDQUFDLFFBQVEsQ0FBQztRQUNsQyxDQUFDO2FBQU0sQ0FBQztZQUNOLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztJQUNILENBQUM7OEdBdGRVLDBCQUEwQjtrR0FBMUIsMEJBQTBCLCtTQXFCMUIsNkJBQTZCLDJFQUM3QixtQkFBbUIsZ0RDOURoQyx5aFBBdU1BOzsyRkQvSmEsMEJBQTBCO2tCQUx0QyxTQUFTOytCQUNFLHlCQUF5QixRQUU3QixFQUFFLEtBQUssRUFBRSx5QkFBeUIsRUFBRTs4U0FTMUMsV0FBVztzQkFEVixLQUFLO2dCQUdHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBRUcsTUFBTTtzQkFBZCxLQUFLO2dCQU1OLGlCQUFpQjtzQkFEaEIsTUFBTTtnQkFLbUMsTUFBTTtzQkFBL0MsU0FBUzt1QkFBQyw2QkFBNkI7Z0JBQ1IsUUFBUTtzQkFBdkMsU0FBUzt1QkFBQyxtQkFBbUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIFZpZXdDaGlsZFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGludGVydmFsLCBTdWJqZWN0LCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IERhc2hib2FyZENoaWxkQWN0aW9uQ29tcG9uZW50IH0gZnJvbSAnLi4vZGFzaGJvYXJkLWNoaWxkLWFjdGlvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgRGFzaGJvYXJkQ2hpbGRDb21wb25lbnQgfSBmcm9tICcuLi9kYXNoYm9hcmQtY2hpbGQuY29tcG9uZW50JztcbmltcG9ydCB7IFdpZGdldHNEYXNoYm9hcmRFdmVudFNlcnZpY2UgfSBmcm9tICcuLi93aWRnZXRzLWRhc2hib2FyZC1ldmVudC5zZXJ2aWNlJztcbmltcG9ydCB7IERhdGVUaW1lQ29udGV4dCwgVGltZUNvbnRleHRFdmVudCwgV2lkZ2V0VGltZUNvbnRleHQgfSBmcm9tICcuLi93aWRnZXQtY2hhbmdlLWV2ZW50Lm1vZGVsJztcbmltcG9ydCB7IEZvcm1CdWlsZGVyIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgZ2V0dGV4dCB9IGZyb20gJy4uLy4uL2kxOG4nO1xuaW1wb3J0IHsgZmlsdGVyLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge1xuICBBR0dSRUdBVElPTl9MSU1JVFMsXG4gIElucHV0RGF0ZUNvbnRleHRRdWVyeVBhcmFtcyxcbiAgSW50ZXJ2YWwsXG4gIElOVEVSVkFMX1RJVExFUyxcbiAgVGltZVNwYW5Jbk1zLFxuICBXaWRnZXREaXNwbGF5U2V0dGluZ3MsXG4gIFdpZGdldFRpbWVDb250ZXh0Q2hhbmdlLFxuICBXaWRnZXRUaW1lQ29udGV4dFN0YXRlXG59IGZyb20gJy4vd2lkZ2V0LXRpbWUtY29udGV4dC5tb2RlbCc7XG5pbXBvcnQgeyBXaWRnZXRUaW1lQ29udGV4dFF1ZXJ5U2VydmljZSB9IGZyb20gJy4vd2lkZ2V0LXRpbWUtY29udGV4dC1xdWVyeS5zZXJ2aWNlJztcbmltcG9ydCB7IFdpZGdldFRpbWVDb250ZXh0SGVscGVyU2VydmljZSB9IGZyb20gJy4vd2lkZ2V0LXRpbWUtY29udGV4dC1oZWxwZXIuc2VydmljZSc7XG5pbXBvcnQgeyBBY3RpdmF0aW9uRW5kLCBOYXZpZ2F0aW9uRW5kLCBOYXZpZ2F0aW9uU3RhcnQsIFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBBY3Rpb25CYXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vYWN0aW9uLWJhcic7XG5pbXBvcnQgeyBhZ2dyZWdhdGlvblR5cGUgfSBmcm9tICdAYzh5L2NsaWVudCc7XG5pbXBvcnQgeyBCc0Ryb3Bkb3duRGlyZWN0aXZlIH0gZnJvbSAnbmd4LWJvb3RzdHJhcC9kcm9wZG93bic7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2M4eS13aWRnZXQtdGltZS1jb250ZXh0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL3dpZGdldC10aW1lLWNvbnRleHQuY29tcG9uZW50Lmh0bWwnLFxuICBob3N0OiB7IGNsYXNzOiAnZC1mbGV4IGEtaS1jZW50ZXIgZ2FwLTQnIH1cbn0pXG5leHBvcnQgY2xhc3MgV2lkZ2V0VGltZUNvbnRleHRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgQWZ0ZXJWaWV3SW5pdCB7XG4gIHJlYWRvbmx5IElOVEVSVkFMX1RJVExFUyA9IElOVEVSVkFMX1RJVExFUztcbiAgcmVhZG9ubHkgREFURV9GT1JNQVQgPSAnc2hvcnQnO1xuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBjb21wb25lbnQgY2FuIGRlY291cGxlIG9yIG5vdC5cbiAgICovXG4gIEBJbnB1dCgpXG4gIGNhbkRlY291cGxlID0gdHJ1ZTtcblxuICBASW5wdXQoKSBkaXNwbGF5U2V0dGluZ3M6IFdpZGdldERpc3BsYXlTZXR0aW5ncztcblxuICBASW5wdXQoKSBoaWRkZW4gPSBmYWxzZTtcblxuICAvKipcbiAgICogRW1pdHMgZWFjaCBjaGFuZ2UgYXMgYW4gYXJyYXkgb2YgZGF0ZXMgW2Zyb20sIHRvXS5cbiAgICovXG4gIEBPdXRwdXQoKVxuICBkYXRlQ29udGV4dENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8V2lkZ2V0VGltZUNvbnRleHRDaGFuZ2U+KCk7XG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBAVmlld0NoaWxkKERhc2hib2FyZENoaWxkQWN0aW9uQ29tcG9uZW50KSBhY3Rpb246IERhc2hib2FyZENoaWxkQWN0aW9uQ29tcG9uZW50O1xuICBAVmlld0NoaWxkKEJzRHJvcGRvd25EaXJlY3RpdmUpIGRyb3Bkb3duOiBCc0Ryb3Bkb3duRGlyZWN0aXZlO1xuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSB0aW1lIGNvbnRleHQgaXMgYm91bmQgdG8gdGhlIGdsb2JhbCBzY29wZS5cbiAgICovXG4gIGlzQ291cGxlZCA9IHRydWU7XG4gIGRlY291cGxlVGltZUNvbnRleHRMYWJlbCA9IGdldHRleHQoJ0RlY291cGxlIHRpbWUgY29udGV4dCcpO1xuICBjb3VwbGVUaW1lQ29udGV4dExhYmVsID0gZ2V0dGV4dCgnQ291cGxlIHRpbWUgY29udGV4dCcpO1xuICBmb3JtOiBSZXR1cm5UeXBlPFdpZGdldFRpbWVDb250ZXh0Q29tcG9uZW50WydjcmVhdGVGb3JtJ10+O1xuICBhY3Rpb25CYXJJbkdyb3VwUHJpb3JpdHk6IG51bWJlcjtcbiAgZGlzYWJsZWRBZ2dyZWdhdGlvbnM6IFBhcnRpYWw8UmVjb3JkPGFnZ3JlZ2F0aW9uVHlwZSwgYm9vbGVhbj4+ID0ge307XG4gIHJlYWRvbmx5IERFRkFVTFRfSU5URVJWQUw6IEludGVydmFsWydpZCddID0gJ2RheXMnO1xuICByZWFkb25seSBBQ1RJT05fQkFSX0dST1VQX0lEID0gJ3RpbWVjb250ZXh0JztcbiAgcmVhZG9ubHkgUkVBTFRJTUVfSU5URVJWQUwgPSAxMDAwO1xuICBwcml2YXRlIHN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuICBwcml2YXRlIGRlc3Ryb3kkOiBTdWJqZWN0PHZvaWQ+ID0gbmV3IFN1YmplY3QoKTtcbiAgcHJpdmF0ZSBuYXZpZ2F0aW9uSW5Qcm9ncmVzczogYm9vbGVhbjtcbiAgcHJpdmF0ZSByZWFsdGltZVN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuXG4gIC8qKlxuICAgKiBAaWdub3JlIG9ubHkgREkuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHdpZGdldEV2ZW50U2VydmljZTogV2lkZ2V0c0Rhc2hib2FyZEV2ZW50U2VydmljZSxcbiAgICBwcml2YXRlIGRhc2hib2FyZENoaWxkOiBEYXNoYm9hcmRDaGlsZENvbXBvbmVudCxcbiAgICBwcml2YXRlIGZvcm1CdWlsZGVyOiBGb3JtQnVpbGRlcixcbiAgICBwcml2YXRlIHF1ZXJ5U2VydmljZTogV2lkZ2V0VGltZUNvbnRleHRRdWVyeVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBoZWxwZXJTZXJ2aWNlOiBXaWRnZXRUaW1lQ29udGV4dEhlbHBlclNlcnZpY2UsXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcbiAgICBwcml2YXRlIGFjdGlvbkJhclNlcnZpY2U6IEFjdGlvbkJhclNlcnZpY2VcbiAgKSB7fVxuXG4gIC8qKlxuICAgKiBAaWdub3JlIFN1YnNjcmliaW5nIHRvIHRoZSBnbG9iYWwgY29udGV4dC5cbiAgICovXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuYWN0aW9uQmFySW5Hcm91cFByaW9yaXR5ID0gdGhpcy5oZWxwZXJTZXJ2aWNlLmdldEFjdGlvbkJhclByaW9yaXR5KHRoaXMuZGlzcGxheVNldHRpbmdzKTtcblxuICAgIGNvbnN0IGluaXRpYWxDb250ZXh0OiBXaWRnZXRUaW1lQ29udGV4dFN0YXRlID1cbiAgICAgIHRoaXMuZ2V0SW5pdGlhbENvbnRleHQoKSB8fCB0aGlzLmdldERlZmF1bHRDb250ZXh0KCk7XG4gICAgaW5pdGlhbENvbnRleHQuYWdncmVnYXRpb24gPSB0aGlzLmNhbGN1bGF0ZUFnZ3JlZ2F0aW9uKFxuICAgICAgaW5pdGlhbENvbnRleHQuZGF0ZSxcbiAgICAgIGluaXRpYWxDb250ZXh0LmFnZ3JlZ2F0aW9uXG4gICAgKTtcbiAgICB0aGlzLmZvcm0gPSB0aGlzLmNyZWF0ZUZvcm0oaW5pdGlhbENvbnRleHQpO1xuXG4gICAgdGhpcy5kYXRlQ29udGV4dENoYW5nZS5lbWl0KHtcbiAgICAgIGRhdGU6IGluaXRpYWxDb250ZXh0LmRhdGUsXG4gICAgICByZWFsdGltZTogaW5pdGlhbENvbnRleHQucmVhbHRpbWUsXG4gICAgICBhZ2dyZWdhdGlvbjogaW5pdGlhbENvbnRleHQuYWdncmVnYXRpb25cbiAgICB9KTtcbiAgICBpZiAodGhpcy5pc0NvdXBsZWQpIHtcbiAgICAgIHRoaXMucXVlcnlTZXJ2aWNlLnNldERhdGVDb250ZXh0UXVlcnlQYXJhbXMoaW5pdGlhbENvbnRleHQpO1xuICAgIH1cbiAgICB0aGlzLnN1YnNjcmliZVRvR2xvYmFsQ29udGV4dCgpO1xuICAgIHRoaXMuc3Vic2NyaWJlVG9RdWVyeVBhcmFtc0NoYW5nZSgpO1xuICAgIHRoaXMuc3Vic2NyaWJlVG9Sb3V0ZXJFdmVudHMoKTtcbiAgICB0aGlzLnN1YnNjcmliZVRvSW50ZXJ2YWxDaGFuZ2UoKTtcbiAgICB0aGlzLnN1YnNjcmliZVRvUmVhbHRpbWVDaGFuZ2UoKTtcbiAgICB0aGlzLnN1YnNjcmliZVRvQWdncmVnYXRpb25DaGFuZ2UoKTtcblxuICAgIGlmIChpbml0aWFsQ29udGV4dC5yZWFsdGltZSkge1xuICAgICAgdGhpcy5vblJlYWx0aW1lVmFsdWVDaGFuZ2UoaW5pdGlhbENvbnRleHQucmVhbHRpbWUpO1xuICAgICAgdGhpcy5zdGFydFJlYWx0aW1lKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBpZ25vcmUgQWRkaW5nIGN1c3RvbSBhY3Rpb25zLlxuICAgKi9cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmNhbkRlY291cGxlKSB7XG4gICAgICB0aGlzLmRhc2hib2FyZENoaWxkLmFkZEFjdGlvbnMoW3RoaXMuYWN0aW9uXSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRvZ2dsZXMgdGhlIGNvdXBsaW5nIG9uIG9yIG9mZi5cbiAgICovXG4gIHRvZ2dsZURlY291cGxpbmcoKTogdm9pZCB7XG4gICAgdGhpcy5pc0NvdXBsZWQgPSAhdGhpcy5pc0NvdXBsZWQ7XG4gICAgY29uc3QgbGFzdEV2ZW50VmFsdWUgPSB0aGlzLndpZGdldEV2ZW50U2VydmljZS5nZXRMYXN0VmFsdWUoJ1RJTUVfQ09OVEVYVCcpO1xuICAgIGNvbnN0IHsgcmVhbHRpbWUsIGFnZ3JlZ2F0aW9uLCBpbnRlcnZhbCB9ID0gbGFzdEV2ZW50VmFsdWU7XG4gICAgbGV0IGRhdGU6IERhdGVUaW1lQ29udGV4dDtcbiAgICBpZiAoaW50ZXJ2YWwpIHtcbiAgICAgIGRhdGUgPSB0aGlzLmhlbHBlclNlcnZpY2UuZ2V0RGF0ZVRpbWVDb250ZXh0QnlJbnRlcnZhbChpbnRlcnZhbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRhdGUgPSBsYXN0RXZlbnRWYWx1ZS5kYXRlVGltZUNvbnRleHQ7XG4gICAgfVxuICAgIHRoaXMudXBkYXRlRm9ybVZhbHVlcyh7IGRhdGUsIGludGVydmFsLCByZWFsdGltZSwgYWdncmVnYXRpb24gfSk7XG5cbiAgICBpZiAodGhpcy5pc0NvdXBsZWQpIHtcbiAgICAgIHRoaXMuc3Vic2NyaWJlVG9HbG9iYWxDb250ZXh0KCk7XG4gICAgICB0aGlzLmRhdGVDb250ZXh0Q2hhbmdlLmVtaXQoeyBkYXRlLCByZWFsdGltZSwgYWdncmVnYXRpb24gfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudW5zdWJzY3JpYmVGcm9tR2xvYmFsQ29udGV4dCgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBsaWVzIGZvcm0gdmFsdWUgdG8gZ2xvYmFsIG9yIGxvY2FsIGRhdGUgY29udGV4dC5cbiAgICovXG4gIGFwcGx5RGF0ZXRpbWVDb250ZXh0KCk6IHZvaWQge1xuICAgIHRoaXMudXBkYXRlKHtcbiAgICAgIGRhdGU6IFtcbiAgICAgICAgbmV3IERhdGUodGhpcy5mb3JtLnZhbHVlLnRlbXBvcmFyeVVzZXJTZWxlY3RlZEZyb21EYXRlKSxcbiAgICAgICAgbmV3IERhdGUodGhpcy5mb3JtLnZhbHVlLnRlbXBvcmFyeVVzZXJTZWxlY3RlZFRvRGF0ZSlcbiAgICAgIF0sXG4gICAgICBpbnRlcnZhbDogbnVsbCxcbiAgICAgIHJlYWx0aW1lOiB0aGlzLmZvcm0udmFsdWUucmVhbHRpbWUsXG4gICAgICBhZ2dyZWdhdGlvbjogdGhpcy5mb3JtLnZhbHVlLmFnZ3JlZ2F0aW9uXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXRzIGZvcm0gdG8gaW5pdGlhbCB2YWx1ZSBhbmQgdXBkYXRlIGNvbnRleHQuXG4gICAqL1xuICByZXNldCgpOiB2b2lkIHtcbiAgICB0aGlzLnN0b3BSZWFsdGltZSgpO1xuICAgIHRoaXMudXBkYXRlKHRoaXMuZ2V0RGVmYXVsdENvbnRleHQoKSk7XG4gIH1cblxuICAvKipcbiAgICogQGlnbm9yZSB1bnN1YnNjcmliaW5nLlxuICAgKi9cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy51bnN1YnNjcmliZUZyb21HbG9iYWxDb250ZXh0KCk7XG4gICAgdGhpcy5jbGVhclF1ZXJ5UGFyYW1zSWZOZWVkZWQoKTtcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcbiAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gIH1cblxuICBwcml2YXRlIHN1YnNjcmliZVRvSW50ZXJ2YWxDaGFuZ2UoKTogdm9pZCB7XG4gICAgdGhpcy5mb3JtLmNvbnRyb2xzLmN1cnJlbnREYXRlQ29udGV4dEludGVydmFsLnZhbHVlQ2hhbmdlc1xuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgLnN1YnNjcmliZShpbnRlcnZhbCA9PiB7XG4gICAgICAgIGxldCBkYXRlOiBEYXRlVGltZUNvbnRleHQ7XG4gICAgICAgIGlmIChpbnRlcnZhbCA9PT0gJ2N1c3RvbScpIHtcbiAgICAgICAgICBkYXRlID0gW1xuICAgICAgICAgICAgbmV3IERhdGUodGhpcy5mb3JtLmNvbnRyb2xzLmN1cnJlbnREYXRlQ29udGV4dEZyb21EYXRlLnZhbHVlKSxcbiAgICAgICAgICAgIG5ldyBEYXRlKHRoaXMuZm9ybS5jb250cm9scy5jdXJyZW50RGF0ZUNvbnRleHRUb0RhdGUudmFsdWUpXG4gICAgICAgICAgXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkYXRlID0gdGhpcy5oZWxwZXJTZXJ2aWNlLmdldERhdGVUaW1lQ29udGV4dEJ5SW50ZXJ2YWwoaW50ZXJ2YWwpO1xuICAgICAgICAgIHRoaXMuZHJvcGRvd24uaXNPcGVuID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51cGRhdGUoe1xuICAgICAgICAgIGRhdGUsXG4gICAgICAgICAgaW50ZXJ2YWwsXG4gICAgICAgICAgcmVhbHRpbWU6IHRoaXMuZm9ybS52YWx1ZS5yZWFsdGltZSxcbiAgICAgICAgICBhZ2dyZWdhdGlvbjogdGhpcy5mb3JtLnZhbHVlLmFnZ3JlZ2F0aW9uXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHN1YnNjcmliZVRvUmVhbHRpbWVDaGFuZ2UoKTogdm9pZCB7XG4gICAgdGhpcy5mb3JtLmNvbnRyb2xzLnJlYWx0aW1lLnZhbHVlQ2hhbmdlcy5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHJlYWx0aW1lID0+IHtcbiAgICAgIHRoaXMub25SZWFsdGltZVZhbHVlQ2hhbmdlKHJlYWx0aW1lKTtcblxuICAgICAgaWYgKHJlYWx0aW1lKSB7XG4gICAgICAgIHRoaXMuc3RhcnRSZWFsdGltZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zdG9wUmVhbHRpbWUoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc3Vic2NyaWJlVG9BZ2dyZWdhdGlvbkNoYW5nZSgpIHtcbiAgICB0aGlzLmZvcm0uY29udHJvbHMuYWdncmVnYXRpb24udmFsdWVDaGFuZ2VzXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXG4gICAgICAuc3Vic2NyaWJlKGFnZ3JlZ2F0aW9uID0+IHtcbiAgICAgICAgdGhpcy51cGRhdGUoe1xuICAgICAgICAgIGRhdGU6IFtcbiAgICAgICAgICAgIG5ldyBEYXRlKHRoaXMuZm9ybS52YWx1ZS5jdXJyZW50RGF0ZUNvbnRleHRGcm9tRGF0ZSksXG4gICAgICAgICAgICBuZXcgRGF0ZSh0aGlzLmZvcm0udmFsdWUuY3VycmVudERhdGVDb250ZXh0VG9EYXRlKVxuICAgICAgICAgIF0sXG4gICAgICAgICAgaW50ZXJ2YWw6IHRoaXMuZm9ybS52YWx1ZS5jdXJyZW50RGF0ZUNvbnRleHRJbnRlcnZhbCxcbiAgICAgICAgICByZWFsdGltZTogdGhpcy5mb3JtLnZhbHVlLnJlYWx0aW1lLFxuICAgICAgICAgIGFnZ3JlZ2F0aW9uXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUZvcm0oY29udGV4dDogV2lkZ2V0VGltZUNvbnRleHRTdGF0ZSkge1xuICAgIHJldHVybiB0aGlzLmZvcm1CdWlsZGVyLmdyb3VwKHtcbiAgICAgIHRlbXBvcmFyeVVzZXJTZWxlY3RlZEZyb21EYXRlOiBjb250ZXh0LmRhdGVbMF0udG9JU09TdHJpbmcoKSxcbiAgICAgIHRlbXBvcmFyeVVzZXJTZWxlY3RlZFRvRGF0ZTogY29udGV4dC5kYXRlWzFdLnRvSVNPU3RyaW5nKCksXG4gICAgICBjdXJyZW50RGF0ZUNvbnRleHRGcm9tRGF0ZTogY29udGV4dC5kYXRlWzBdLnRvSVNPU3RyaW5nKCksXG4gICAgICBjdXJyZW50RGF0ZUNvbnRleHRUb0RhdGU6IGNvbnRleHQuZGF0ZVsxXS50b0lTT1N0cmluZygpLFxuICAgICAgY3VycmVudERhdGVDb250ZXh0SW50ZXJ2YWw6IGNvbnRleHQuaW50ZXJ2YWwgfHwgJ2N1c3RvbScsXG4gICAgICByZWFsdGltZTogY29udGV4dC5yZWFsdGltZSxcbiAgICAgIGFnZ3JlZ2F0aW9uOiBjb250ZXh0LmFnZ3JlZ2F0aW9uXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRmlyZXMgYSBuZXcgV2lkZ2V0Q2hhbmdlRXZlbnQgZWl0aGVyIG9uIHRoZSBsb2NhbCBjaGFuZ2UgZW1pdHRlciBvciBvbiB0aGUgZ2xvYmFsIG9uZS5cbiAgICogQHBhcmFtIHdpZGdldFRpbWVDb250ZXh0U3RhdGUgTmV3IHdpZGdldCB0aW1lIGNvbnRleHQgdmFsdWUuKi9cbiAgcHJpdmF0ZSB1cGRhdGUoeyBkYXRlLCBpbnRlcnZhbCwgcmVhbHRpbWUsIGFnZ3JlZ2F0aW9uIH06IFdpZGdldFRpbWVDb250ZXh0U3RhdGUpOiB2b2lkIHtcbiAgICBjb25zdCB2YWxpZEFnZ3JlZ2F0aW9uID0gdGhpcy5jYWxjdWxhdGVBZ2dyZWdhdGlvbihkYXRlLCBhZ2dyZWdhdGlvbik7XG4gICAgaWYgKHRoaXMuaXNDb3VwbGVkKSB7XG4gICAgICBjb25zdCBldmVudERhdGE6IFdpZGdldFRpbWVDb250ZXh0ID1cbiAgICAgICAgaW50ZXJ2YWwgJiYgaW50ZXJ2YWwgIT09ICdjdXN0b20nXG4gICAgICAgICAgPyB7IGludGVydmFsLCByZWFsdGltZSwgYWdncmVnYXRpb246IHZhbGlkQWdncmVnYXRpb24gfVxuICAgICAgICAgIDogeyBkYXRlVGltZUNvbnRleHQ6IGRhdGUsIHJlYWx0aW1lLCBhZ2dyZWdhdGlvbjogdmFsaWRBZ2dyZWdhdGlvbiB9O1xuICAgICAgdGhpcy53aWRnZXRFdmVudFNlcnZpY2UuZW1pdCh7IHR5cGU6ICdUSU1FX0NPTlRFWFQnLCBkYXRhOiBldmVudERhdGEgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudXBkYXRlRm9ybVZhbHVlcyh7IGRhdGUsIGludGVydmFsLCByZWFsdGltZSwgYWdncmVnYXRpb246IHZhbGlkQWdncmVnYXRpb24gfSk7XG4gICAgICB0aGlzLmRhdGVDb250ZXh0Q2hhbmdlLmVtaXQoeyBkYXRlLCByZWFsdGltZSwgYWdncmVnYXRpb246IHZhbGlkQWdncmVnYXRpb24gfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzdWJzY3JpYmVUb0dsb2JhbENvbnRleHQoKTogdm9pZCB7XG4gICAgY29uc3QgZXZlbnQkID0gdGhpcy53aWRnZXRFdmVudFNlcnZpY2UuZ2V0T2JzZXJ2YWJsZTxUaW1lQ29udGV4dEV2ZW50PignVElNRV9DT05URVhUJyk7XG4gICAgdGhpcy5zdWJzY3JpcHRpb24gPSBldmVudCQuc3Vic2NyaWJlKChjb250ZXh0OiBXaWRnZXRUaW1lQ29udGV4dCkgPT4ge1xuICAgICAgbGV0IGRhdGU6IERhdGVUaW1lQ29udGV4dDtcbiAgICAgIGNvbnN0IHsgcmVhbHRpbWUsIGludGVydmFsLCBhZ2dyZWdhdGlvbiB9ID0gY29udGV4dDtcbiAgICAgIGlmIChpbnRlcnZhbCkge1xuICAgICAgICBkYXRlID0gdGhpcy5oZWxwZXJTZXJ2aWNlLmdldERhdGVUaW1lQ29udGV4dEJ5SW50ZXJ2YWwoY29udGV4dC5pbnRlcnZhbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkYXRlID0gY29udGV4dC5kYXRlVGltZUNvbnRleHQ7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZGF0ZUNvbnRleHRDaGFuZ2UuZW1pdCh7XG4gICAgICAgIGRhdGUsXG4gICAgICAgIHJlYWx0aW1lLFxuICAgICAgICBhZ2dyZWdhdGlvblxuICAgICAgfSk7XG4gICAgICB0aGlzLnVwZGF0ZUZvcm1WYWx1ZXMoeyBkYXRlLCBpbnRlcnZhbCwgcmVhbHRpbWUsIGFnZ3JlZ2F0aW9uIH0pO1xuICAgICAgdGhpcy5xdWVyeVNlcnZpY2Uuc2V0RGF0ZUNvbnRleHRRdWVyeVBhcmFtcyh7IGludGVydmFsLCBkYXRlLCByZWFsdGltZSwgYWdncmVnYXRpb24gfSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUZvcm1WYWx1ZXMoe1xuICAgIGRhdGUsXG4gICAgaW50ZXJ2YWwsXG4gICAgcmVhbHRpbWUsXG4gICAgYWdncmVnYXRpb25cbiAgfTogV2lkZ2V0VGltZUNvbnRleHRTdGF0ZSk6IHZvaWQge1xuICAgIHRoaXMuZm9ybS5wYXRjaFZhbHVlKFxuICAgICAge1xuICAgICAgICB0ZW1wb3JhcnlVc2VyU2VsZWN0ZWRGcm9tRGF0ZTogZGF0ZVswXS50b0lTT1N0cmluZygpLFxuICAgICAgICB0ZW1wb3JhcnlVc2VyU2VsZWN0ZWRUb0RhdGU6IGRhdGVbMV0udG9JU09TdHJpbmcoKSxcbiAgICAgICAgY3VycmVudERhdGVDb250ZXh0RnJvbURhdGU6IGRhdGVbMF0udG9JU09TdHJpbmcoKSxcbiAgICAgICAgY3VycmVudERhdGVDb250ZXh0VG9EYXRlOiBkYXRlWzFdLnRvSVNPU3RyaW5nKCksXG4gICAgICAgIHJlYWx0aW1lLFxuICAgICAgICBjdXJyZW50RGF0ZUNvbnRleHRJbnRlcnZhbDogaW50ZXJ2YWwgfHwgJ2N1c3RvbScsXG4gICAgICAgIGFnZ3JlZ2F0aW9uOiBhZ2dyZWdhdGlvbiB8fCBudWxsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBlbWl0RXZlbnQ6IGZhbHNlXG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgdW5zdWJzY3JpYmVGcm9tR2xvYmFsQ29udGV4dCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRJbml0aWFsQ29udGV4dCgpOiBXaWRnZXRUaW1lQ29udGV4dFN0YXRlIHwgbnVsbCB7XG4gICAgY29uc3QgZGF0ZVRpbWVDb250ZXh0RnJvbVF1ZXJ5UGFyYW1zID0gdGhpcy5xdWVyeVNlcnZpY2UuZGF0ZVRpbWVDb250ZXh0RnJvbVF1ZXJ5UGFyYW1zKCk7XG4gICAgaWYgKGRhdGVUaW1lQ29udGV4dEZyb21RdWVyeVBhcmFtcykge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uZGF0ZVRpbWVDb250ZXh0RnJvbVF1ZXJ5UGFyYW1zLFxuICAgICAgICByZWFsdGltZTogZGF0ZVRpbWVDb250ZXh0RnJvbVF1ZXJ5UGFyYW1zLnJlYWx0aW1lID8/IGZhbHNlLFxuICAgICAgICBhZ2dyZWdhdGlvbjogZGF0ZVRpbWVDb250ZXh0RnJvbVF1ZXJ5UGFyYW1zLnJlYWx0aW1lXG4gICAgICAgICAgPyBudWxsXG4gICAgICAgICAgOiBkYXRlVGltZUNvbnRleHRGcm9tUXVlcnlQYXJhbXMuYWdncmVnYXRpb24gfHwgbnVsbFxuICAgICAgfTtcbiAgICB9XG4gICAgLy8gZ2V0IHZhbHVlIGZyb20gbGFzdCB2YWx1ZSBvZiBldmVudHMgc2VydmljZVxuICAgIGNvbnN0IGxhc3RFdmVudFZhbHVlID0gdGhpcy53aWRnZXRFdmVudFNlcnZpY2UuZ2V0TGFzdFZhbHVlKCdUSU1FX0NPTlRFWFQnKTtcbiAgICBjb25zdCByZWFsdGltZSA9IGxhc3RFdmVudFZhbHVlPy5yZWFsdGltZSA/PyBmYWxzZTtcbiAgICBpZiAobGFzdEV2ZW50VmFsdWUgJiYgbGFzdEV2ZW50VmFsdWUuZGF0ZVRpbWVDb250ZXh0KSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBkYXRlOiBsYXN0RXZlbnRWYWx1ZS5kYXRlVGltZUNvbnRleHQsXG4gICAgICAgIGludGVydmFsOiAnY3VzdG9tJyxcbiAgICAgICAgcmVhbHRpbWUsXG4gICAgICAgIGFnZ3JlZ2F0aW9uOiByZWFsdGltZSA/IG51bGwgOiBsYXN0RXZlbnRWYWx1ZS5hZ2dyZWdhdGlvblxuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKGxhc3RFdmVudFZhbHVlICYmIGxhc3RFdmVudFZhbHVlLmludGVydmFsKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBkYXRlOiB0aGlzLmhlbHBlclNlcnZpY2UuZ2V0RGF0ZVRpbWVDb250ZXh0QnlJbnRlcnZhbChsYXN0RXZlbnRWYWx1ZS5pbnRlcnZhbCksXG4gICAgICAgIGludGVydmFsOiBsYXN0RXZlbnRWYWx1ZS5pbnRlcnZhbCxcbiAgICAgICAgcmVhbHRpbWUsXG4gICAgICAgIGFnZ3JlZ2F0aW9uOiByZWFsdGltZSA/IG51bGwgOiBsYXN0RXZlbnRWYWx1ZS5hZ2dyZWdhdGlvblxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgc3Vic2NyaWJlVG9RdWVyeVBhcmFtc0NoYW5nZSgpOiB2b2lkIHtcbiAgICB0aGlzLnF1ZXJ5U2VydmljZVxuICAgICAgLnF1ZXJ5UGFyYW1zQ2hhbmdlJCgpXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXG4gICAgICAuc3Vic2NyaWJlKFxuICAgICAgICAoe1xuICAgICAgICAgIGRhdGVDb250ZXh0RnJvbSxcbiAgICAgICAgICBkYXRlQ29udGV4dFRvLFxuICAgICAgICAgIGRhdGVDb250ZXh0SW50ZXJ2YWwsXG4gICAgICAgICAgZGF0ZUNvbnRleHRSZWFsdGltZSxcbiAgICAgICAgICBkYXRlQ29udGV4dEFnZ3JlZ2F0aW9uXG4gICAgICAgIH06IElucHV0RGF0ZUNvbnRleHRRdWVyeVBhcmFtcykgPT4ge1xuICAgICAgICAgIGNvbnN0IHJlYWx0aW1lID0gZGF0ZUNvbnRleHRSZWFsdGltZSA/PyB0aGlzLmZvcm0udmFsdWUucmVhbHRpbWU7XG4gICAgICAgICAgaWYgKGRhdGVDb250ZXh0SW50ZXJ2YWwpIHtcbiAgICAgICAgICAgIHRoaXMud2lkZ2V0RXZlbnRTZXJ2aWNlLmVtaXQoe1xuICAgICAgICAgICAgICB0eXBlOiAnVElNRV9DT05URVhUJyxcbiAgICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICAgIGludGVydmFsOiBkYXRlQ29udGV4dEludGVydmFsLFxuICAgICAgICAgICAgICAgIHJlYWx0aW1lLFxuICAgICAgICAgICAgICAgIGFnZ3JlZ2F0aW9uOiBkYXRlQ29udGV4dEFnZ3JlZ2F0aW9uXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBkYXRlQ29udGV4dDogRGF0ZVRpbWVDb250ZXh0ID0gW1xuICAgICAgICAgICAgICBuZXcgRGF0ZShkYXRlQ29udGV4dEZyb20pLFxuICAgICAgICAgICAgICBuZXcgRGF0ZShkYXRlQ29udGV4dFRvKVxuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIHRoaXMud2lkZ2V0RXZlbnRTZXJ2aWNlLmVtaXQoe1xuICAgICAgICAgICAgICB0eXBlOiAnVElNRV9DT05URVhUJyxcbiAgICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICAgIGRhdGVUaW1lQ29udGV4dDogZGF0ZUNvbnRleHQsXG4gICAgICAgICAgICAgICAgcmVhbHRpbWUsXG4gICAgICAgICAgICAgICAgYWdncmVnYXRpb246IGRhdGVDb250ZXh0QWdncmVnYXRpb25cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBjbGVhclF1ZXJ5UGFyYW1zSWZOZWVkZWQoKTogdm9pZCB7XG4gICAgLy8gSWYgbmF2aWdhdGlvbiBpcyBpbiBwcm9ncmVzcywgcm91dGVyIHdpbGwgdGFrZSBjYXJlIG9mIGNsZWFyaW5nIHF1ZXJ5IHBhcmFtcy4gVGhpcyB3YXkgd2UgYXZvaWQgdW5uZWNlc3NhcnkgbWFuaXB1bGF0aW9uIG9mIGJyb3dzZXIgaGlzdG9yeVxuICAgIGlmICh0aGlzLm5hdmlnYXRpb25JblByb2dyZXNzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIGNoZWNrIGlmIGFueSBvdGhlciBXaWRnZXRUaW1lQ29udGV4dENvbXBvbmVudCBhY3Rpb24gaW4gYWN0aW9uIGJhciBleGlzdHNcbiAgICBjb25zdCBhbnlXaWRnZXRUaW1lQ29udGV4dEFjdGlvbkxlZnQgPSBBcnJheS5mcm9tKHRoaXMuYWN0aW9uQmFyU2VydmljZS5zdGF0ZSkuc29tZShcbiAgICAgIGFjdGlvbiA9PiBhY3Rpb24uZ3JvdXBJZCA9PT0gdGhpcy5BQ1RJT05fQkFSX0dST1VQX0lEXG4gICAgKTtcbiAgICBpZiAoIWFueVdpZGdldFRpbWVDb250ZXh0QWN0aW9uTGVmdCkge1xuICAgICAgdGhpcy5xdWVyeVNlcnZpY2UuY2xlYXJRdWVyeVBhcmFtcygpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc3Vic2NyaWJlVG9Sb3V0ZXJFdmVudHMoKTogdm9pZCB7XG4gICAgdGhpcy5yb3V0ZXIuZXZlbnRzXG4gICAgICAucGlwZShcbiAgICAgICAgZmlsdGVyKFxuICAgICAgICAgIGUgPT5cbiAgICAgICAgICAgIGUgaW5zdGFuY2VvZiBOYXZpZ2F0aW9uU3RhcnQgfHwgZSBpbnN0YW5jZW9mIE5hdmlnYXRpb25FbmQgfHwgZSBpbnN0YW5jZW9mIEFjdGl2YXRpb25FbmRcbiAgICAgICAgKSxcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKGUgPT4ge1xuICAgICAgICB0aGlzLm5hdmlnYXRpb25JblByb2dyZXNzID0gZSBpbnN0YW5jZW9mIE5hdmlnYXRpb25TdGFydDtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXREZWZhdWx0Q29udGV4dCgpOiBXaWRnZXRUaW1lQ29udGV4dFN0YXRlIHtcbiAgICByZXR1cm4ge1xuICAgICAgZGF0ZTogdGhpcy5oZWxwZXJTZXJ2aWNlLmdldERhdGVUaW1lQ29udGV4dEJ5SW50ZXJ2YWwodGhpcy5ERUZBVUxUX0lOVEVSVkFMKSxcbiAgICAgIGludGVydmFsOiB0aGlzLkRFRkFVTFRfSU5URVJWQUwsXG4gICAgICByZWFsdGltZTogZmFsc2UsXG4gICAgICBhZ2dyZWdhdGlvbjogYWdncmVnYXRpb25UeXBlLk1JTlVURUxZXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhcnRSZWFsdGltZSgpOiB2b2lkIHtcbiAgICB0aGlzLmZvcm0uY29udHJvbHMudGVtcG9yYXJ5VXNlclNlbGVjdGVkRnJvbURhdGUuZGlzYWJsZSgpO1xuICAgIHRoaXMuZm9ybS5jb250cm9scy50ZW1wb3JhcnlVc2VyU2VsZWN0ZWRUb0RhdGUuZGlzYWJsZSgpO1xuICAgIHRoaXMuZm9ybS5jb250cm9scy5hZ2dyZWdhdGlvbi5kaXNhYmxlKCk7XG5cbiAgICB0aGlzLnJlYWx0aW1lU3Vic2NyaXB0aW9uID0gaW50ZXJ2YWwodGhpcy5SRUFMVElNRV9JTlRFUlZBTClcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICBjb25zdCBuZXdEYXRlRnJvbSA9IG5ldyBEYXRlKFxuICAgICAgICAgIG5ldyBEYXRlKHRoaXMuZm9ybS52YWx1ZS5jdXJyZW50RGF0ZUNvbnRleHRGcm9tRGF0ZSkudmFsdWVPZigpICsgdGhpcy5SRUFMVElNRV9JTlRFUlZBTFxuICAgICAgICApO1xuICAgICAgICBjb25zdCBuZXdEYXRlVG8gPSBuZXcgRGF0ZShcbiAgICAgICAgICBuZXcgRGF0ZSh0aGlzLmZvcm0udmFsdWUuY3VycmVudERhdGVDb250ZXh0VG9EYXRlKS52YWx1ZU9mKCkgKyB0aGlzLlJFQUxUSU1FX0lOVEVSVkFMXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMudXBkYXRlRm9ybVZhbHVlcyh7XG4gICAgICAgICAgZGF0ZTogW25ld0RhdGVGcm9tLCBuZXdEYXRlVG9dLFxuICAgICAgICAgIGludGVydmFsOiB0aGlzLmZvcm0udmFsdWUuY3VycmVudERhdGVDb250ZXh0SW50ZXJ2YWwsXG4gICAgICAgICAgcmVhbHRpbWU6IHRydWUsXG4gICAgICAgICAgYWdncmVnYXRpb246IG51bGxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc3RvcFJlYWx0aW1lKCk6IHZvaWQge1xuICAgIHRoaXMucmVhbHRpbWVTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5mb3JtPy5jb250cm9scy50ZW1wb3JhcnlVc2VyU2VsZWN0ZWRGcm9tRGF0ZS5lbmFibGUoKTtcbiAgICB0aGlzLmZvcm0/LmNvbnRyb2xzLnRlbXBvcmFyeVVzZXJTZWxlY3RlZFRvRGF0ZS5lbmFibGUoKTtcbiAgICB0aGlzLmZvcm0/LmNvbnRyb2xzLmFnZ3JlZ2F0aW9uLmVuYWJsZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBvblJlYWx0aW1lVmFsdWVDaGFuZ2UocmVhbHRpbWU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBsZXQgZGF0ZVRpbWVDb250ZXh0OiBEYXRlVGltZUNvbnRleHQ7XG4gICAgaWYgKHRoaXMuZm9ybS52YWx1ZS5jdXJyZW50RGF0ZUNvbnRleHRJbnRlcnZhbCAhPT0gJ2N1c3RvbScpIHtcbiAgICAgIGRhdGVUaW1lQ29udGV4dCA9IHRoaXMuaGVscGVyU2VydmljZS5nZXREYXRlVGltZUNvbnRleHRCeUludGVydmFsKFxuICAgICAgICB0aGlzLmZvcm0udmFsdWUuY3VycmVudERhdGVDb250ZXh0SW50ZXJ2YWxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRUaW1lU3BhbkluTXMgPVxuICAgICAgICBuZXcgRGF0ZSh0aGlzLmZvcm0udmFsdWUuY3VycmVudERhdGVDb250ZXh0VG9EYXRlKS52YWx1ZU9mKCkgLVxuICAgICAgICBuZXcgRGF0ZSh0aGlzLmZvcm0udmFsdWUuY3VycmVudERhdGVDb250ZXh0RnJvbURhdGUpLnZhbHVlT2YoKTtcbiAgICAgIGNvbnN0IGRhdGVUbyA9IG5ldyBEYXRlKCk7XG4gICAgICBjb25zdCBkYXRlRnJvbSA9IG5ldyBEYXRlKGRhdGVUby52YWx1ZU9mKCkgLSBjdXJyZW50VGltZVNwYW5Jbk1zKTtcbiAgICAgIGRhdGVUaW1lQ29udGV4dCA9IFtkYXRlRnJvbSwgZGF0ZVRvXTtcbiAgICB9XG5cbiAgICB0aGlzLnVwZGF0ZSh7XG4gICAgICBkYXRlOiBkYXRlVGltZUNvbnRleHQsXG4gICAgICBpbnRlcnZhbDogdGhpcy5mb3JtLnZhbHVlLmN1cnJlbnREYXRlQ29udGV4dEludGVydmFsLFxuICAgICAgcmVhbHRpbWUsXG4gICAgICBhZ2dyZWdhdGlvbjogbnVsbFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjYWxjdWxhdGVBZ2dyZWdhdGlvbihcbiAgICBbZGF0ZUZyb20sIGRhdGVUb106IERhdGVUaW1lQ29udGV4dCxcbiAgICBhZ2dyZWdhdGlvbjogYWdncmVnYXRpb25UeXBlXG4gICk6IGFnZ3JlZ2F0aW9uVHlwZSB7XG4gICAgY29uc3QgdGltZVJhbmdlSW5NcyA9IGRhdGVUby52YWx1ZU9mKCkgLSBkYXRlRnJvbS52YWx1ZU9mKCk7XG4gICAgdGhpcy5kaXNhYmxlZEFnZ3JlZ2F0aW9ucyA9IHtcbiAgICAgIERBSUxZOiB0aW1lUmFuZ2VJbk1zIDw9IFRpbWVTcGFuSW5Ncy5EQVksXG4gICAgICBIT1VSTFk6IHRpbWVSYW5nZUluTXMgPD0gVGltZVNwYW5Jbk1zLkhPVVIsXG4gICAgICBNSU5VVEVMWTogdGltZVJhbmdlSW5NcyA8PSBUaW1lU3BhbkluTXMuTUlOVVRFXG4gICAgfTtcbiAgICBjb25zdCBpc1Byb3BlckFnZ3JlZ2F0aW9uID0gIXRoaXMuZGlzYWJsZWRBZ2dyZWdhdGlvbnNbYWdncmVnYXRpb25dIHx8IGFnZ3JlZ2F0aW9uID09PSBudWxsO1xuICAgIGlmIChpc1Byb3BlckFnZ3JlZ2F0aW9uKSB7XG4gICAgICByZXR1cm4gYWdncmVnYXRpb247XG4gICAgfVxuXG4gICAgaWYgKHRpbWVSYW5nZUluTXMgPj0gQUdHUkVHQVRJT05fTElNSVRTLkRBSUxZX0xJTUlUKSB7XG4gICAgICByZXR1cm4gYWdncmVnYXRpb25UeXBlLkRBSUxZO1xuICAgIH0gZWxzZSBpZiAodGltZVJhbmdlSW5NcyA+PSBBR0dSRUdBVElPTl9MSU1JVFMuSE9VUkxZX0xJTUlUKSB7XG4gICAgICByZXR1cm4gYWdncmVnYXRpb25UeXBlLkhPVVJMWTtcbiAgICB9IGVsc2UgaWYgKHRpbWVSYW5nZUluTXMgPj0gQUdHUkVHQVRJT05fTElNSVRTLk1JTlVURUxZX0xJTUlUKSB7XG4gICAgICByZXR1cm4gYWdncmVnYXRpb25UeXBlLk1JTlVURUxZO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cbn1cbiIsIjxjOHktYWN0aW9uLWJhci1pdGVtXG4gICpuZ0lmPVwiaXNDb3VwbGVkICYmICFoaWRkZW5cIlxuICBbZ3JvdXBJZF09XCJBQ1RJT05fQkFSX0dST1VQX0lEXCJcbiAgW2luR3JvdXBQcmlvcml0eV09XCJhY3Rpb25CYXJJbkdyb3VwUHJpb3JpdHlcIlxuICBbcGxhY2VtZW50XT1cIidsZWZ0J1wiXG4+XG4gIDxuZy1jb250YWluZXJcbiAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJkYXRlVGltZVBpY2tlclwiXG4gICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntcbiAgICAgIGRhdGU6IFtmb3JtLnZhbHVlLmN1cnJlbnREYXRlQ29udGV4dEZyb21EYXRlLCBmb3JtLnZhbHVlLmN1cnJlbnREYXRlQ29udGV4dFRvRGF0ZV1cbiAgICB9XCJcbiAgPjwvbmctY29udGFpbmVyPlxuPC9jOHktYWN0aW9uLWJhci1pdGVtPlxuXG48bmctY29udGFpbmVyXG4gICpuZ0lmPVwiIWlzQ291cGxlZFwiXG4gIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImRhdGVUaW1lUGlja2VyXCJcbiAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntcbiAgICBkYXRlOiBbZm9ybS52YWx1ZS5jdXJyZW50RGF0ZUNvbnRleHRGcm9tRGF0ZSwgZm9ybS52YWx1ZS5jdXJyZW50RGF0ZUNvbnRleHRUb0RhdGVdXG4gIH1cIlxuPjwvbmctY29udGFpbmVyPlxuXG48bmctdGVtcGxhdGVcbiAgI2RhdGVUaW1lUGlja2VyXG4gIGxldC1kYXRlPVwiZGF0ZVwiXG4+XG4gIDxmb3JtXG4gICAgY2xhc3M9XCJkLWZsZXggZ2FwLTE2IHAtbC14cy0xNiBwLXIteHMtMTYgbS10LXhzLTggbS1iLXhzLThcIlxuICAgIFtmb3JtR3JvdXBdPVwiZm9ybVwiXG4gID5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZGlzcGxheVNldHRpbmdzLmdsb2JhbFRpbWVDb250ZXh0XCI+XG4gICAgICA8ZGl2PlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJkcm9wZG93biBmbGV4LWdyb3dcIlxuICAgICAgICAgICNkcm9wZG93bj1cImJzLWRyb3Bkb3duXCJcbiAgICAgICAgICBcbiAgICAgICAgICBkcm9wZG93blxuICAgICAgICAgIFtpbnNpZGVDbGlja109XCJ0cnVlXCJcbiAgICAgICAgICAqbmdJZj1cImRhdGVcIlxuICAgICAgICA+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgZGF0YS1jeT1cIndpZGdldC10aW1lLWNvbnRleHQtLWRhdGUtcGlja2VyLWRyb3Bkb3duLWJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cImRyb3Bkb3duLXRvZ2dsZSBmb3JtLWNvbnRyb2wgbC1oLXRpZ2h0IGQtZmxleCBhLWktY2VudGVyXCJcbiAgICAgICAgICAgIGF0dHIuYXJpYS1sYWJlbD1cInt7IGRhdGVbMF0gfCBjOHlEYXRlOiBEQVRFX0ZPUk1BVCB9fSDigJQge3tcbiAgICAgICAgICAgICAgZGF0ZVsxXSB8IGM4eURhdGU6IERBVEVfRk9STUFUXG4gICAgICAgICAgICB9fVwiXG4gICAgICAgICAgICB0b29sdGlwPVwie3sgZGF0ZVswXSB8IGM4eURhdGU6IERBVEVfRk9STUFUIH19IOKAlCB7eyBkYXRlWzFdIHwgYzh5RGF0ZTogREFURV9GT1JNQVQgfX1cIlxuICAgICAgICAgICAgcGxhY2VtZW50PVwidG9wXCJcbiAgICAgICAgICAgIGNvbnRhaW5lcj1cImJvZHlcIlxuICAgICAgICAgICAgW2FkYXB0aXZlUG9zaXRpb25dPVwiZmFsc2VcIlxuICAgICAgICAgICAgW2RlbGF5XT1cIjUwMFwiXG4gICAgICAgICAgICBkcm9wZG93blRvZ2dsZVxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgIGNsYXNzPVwibS1yLTQgXCJcbiAgICAgICAgICAgICAgYzh5SWNvbj1cInNjaGVkdWxlMVwiXG4gICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtY29sIHRleHQtbGVmdCBmaXQtd1wiPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtMTJcIiBkYXRhLWN5PVwid2lkZ2V0LXRpbWUtY29udGV4dC0tc2VsZWN0ZWQtaW50ZXJ2YWxcIj5cbiAgICAgICAgICAgICAgICB7eyBJTlRFUlZBTF9USVRMRVNbZm9ybS5jb250cm9scy5jdXJyZW50RGF0ZUNvbnRleHRJbnRlcnZhbC52YWx1ZV0gfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgIGNsYXNzPVwidGV4dC0xMCB0ZXh0LW11dGVkIHRleHQtdHJ1bmNhdGVcIlxuICAgICAgICAgICAgICAgIGRhdGEtY3k9XCJ3aWRnZXQtdGltZS1jb250ZXh0LS1zZWxlY3RlZC10aW1lLXJhbmdlXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHt7IGRhdGVbMF0gfCBjOHlEYXRlOiBEQVRFX0ZPUk1BVCB9fSDigJQge3sgZGF0ZVsxXSB8IGM4eURhdGU6IERBVEVfRk9STUFUIH19XG4gICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjYXJldCBtLXItMTYgbS1sLTRcIj48L3NwYW4+XG4gICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICA8dWxcbiAgICAgICAgICAgIGNsYXNzPVwiZHJvcGRvd24tbWVudSBkcm9wZG93bi1tZW51LS1kYXRlLXJhbmdlXCJcbiAgICAgICAgICAgICpkcm9wZG93bk1lbnVcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8Yzh5LWludGVydmFsLXBpY2tlclxuICAgICAgICAgICAgICBjbGFzcz1cImQtY29udGVudHNcIlxuICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJjdXJyZW50RGF0ZUNvbnRleHRJbnRlcnZhbFwiXG4gICAgICAgICAgICA+PC9jOHktaW50ZXJ2YWwtcGlja2VyPlxuXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZm9ybS5jb250cm9scy5jdXJyZW50RGF0ZUNvbnRleHRJbnRlcnZhbC52YWx1ZSA9PT0gJ2N1c3RvbSdcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInAtbC0xNiBwLXItMTZcIj5cbiAgICAgICAgICAgICAgICA8Yzh5LWZvcm0tZ3JvdXBcbiAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImZvcm0uY29udHJvbHMudGVtcG9yYXJ5VXNlclNlbGVjdGVkRnJvbURhdGUuZXJyb3JzID8gJ2hhcy1lcnJvcicgOiAnJ1wiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCInRnJvbWBkYXRlYCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICBmb3I9XCJ0ZW1wb3JhcnlVc2VyU2VsZWN0ZWRGcm9tRGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZVxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICBGcm9tYGRhdGVgXG4gICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgPGM4eS1kYXRlLXRpbWUtcGlja2VyXG4gICAgICAgICAgICAgICAgICAgIGlkPVwidGVtcG9yYXJ5VXNlclNlbGVjdGVkRnJvbURhdGVcIlxuICAgICAgICAgICAgICAgICAgICBbbWF4RGF0ZV09XCJmb3JtLnZhbHVlLnRlbXBvcmFyeVVzZXJTZWxlY3RlZFRvRGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCInRnJvbWBkYXRlYCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwiZm9ybS5jb250cm9scy50ZW1wb3JhcnlVc2VyU2VsZWN0ZWRGcm9tRGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImZvcm0uY29udHJvbHMudGVtcG9yYXJ5VXNlclNlbGVjdGVkRnJvbURhdGUuZXJyb3JzID8gJ2hhcy1lcnJvcicgOiAnJ1wiXG4gICAgICAgICAgICAgICAgICA+PC9jOHktZGF0ZS10aW1lLXBpY2tlcj5cbiAgICAgICAgICAgICAgICAgIDxjOHktbWVzc2FnZXMgW3Nob3ddPVwiZm9ybS5jb250cm9scy50ZW1wb3JhcnlVc2VyU2VsZWN0ZWRGcm9tRGF0ZS5lcnJvcnNcIj5cbiAgICAgICAgICAgICAgICAgICAgPGM4eS1tZXNzYWdlXG4gICAgICAgICAgICAgICAgICAgICAgbmFtZT1cImRhdGVBZnRlclJhbmdlTWF4XCJcbiAgICAgICAgICAgICAgICAgICAgICBbdGV4dF09XCInVGhpcyBkYXRlIGlzIGFmdGVyIHRoZSBsYXRlc3QgYWxsb3dlZCBkYXRlLicgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICA+PC9jOHktbWVzc2FnZT5cbiAgICAgICAgICAgICAgICAgICAgPGM4eS1tZXNzYWdlXG4gICAgICAgICAgICAgICAgICAgICAgbmFtZT1cImludmFsaWREYXRlVGltZVwiXG4gICAgICAgICAgICAgICAgICAgICAgW3RleHRdPVwiJ1RoaXMgZGF0ZSBpcyBpbnZhbGlkLicgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICA+PC9jOHktbWVzc2FnZT5cbiAgICAgICAgICAgICAgICAgIDwvYzh5LW1lc3NhZ2VzPlxuICAgICAgICAgICAgICAgIDwvYzh5LWZvcm0tZ3JvdXA+XG5cbiAgICAgICAgICAgICAgICA8Yzh5LWZvcm0tZ3JvdXBcbiAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImZvcm0uY29udHJvbHMudGVtcG9yYXJ5VXNlclNlbGVjdGVkVG9EYXRlLmVycm9ycyA/ICdoYXMtZXJyb3InIDogJydcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxsYWJlbFxuICAgICAgICAgICAgICAgICAgICBbdGl0bGVdPVwiJ1RvYGRhdGVgJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgIGZvcj1cInRlbXBvcmFyeVVzZXJTZWxlY3RlZFRvRGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZVxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICBUb2BkYXRlYFxuICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgIDxjOHktZGF0ZS10aW1lLXBpY2tlclxuICAgICAgICAgICAgICAgICAgICBpZD1cInRlbXBvcmFyeVVzZXJTZWxlY3RlZFRvRGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgIFttaW5EYXRlXT1cImZvcm0udmFsdWUudGVtcG9yYXJ5VXNlclNlbGVjdGVkRnJvbURhdGVcIlxuICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiJ1RvYGRhdGVgJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJmb3JtLmNvbnRyb2xzLnRlbXBvcmFyeVVzZXJTZWxlY3RlZFRvRGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImZvcm0uY29udHJvbHMudGVtcG9yYXJ5VXNlclNlbGVjdGVkVG9EYXRlLmVycm9ycyA/ICdoYXMtZXJyb3InIDogJydcIlxuICAgICAgICAgICAgICAgICAgPjwvYzh5LWRhdGUtdGltZS1waWNrZXI+XG4gICAgICAgICAgICAgICAgICA8Yzh5LW1lc3NhZ2VzIFtzaG93XT1cImZvcm0uY29udHJvbHMudGVtcG9yYXJ5VXNlclNlbGVjdGVkVG9EYXRlLmVycm9yc1wiPlxuICAgICAgICAgICAgICAgICAgICA8Yzh5LW1lc3NhZ2VcbiAgICAgICAgICAgICAgICAgICAgICBuYW1lPVwiZGF0ZUJlZm9yZVJhbmdlTWluXCJcbiAgICAgICAgICAgICAgICAgICAgICBbdGV4dF09XCInVGhpcyBkYXRlIGlzIGJlZm9yZSB0aGUgZWFybGllc3QgYWxsb3dlZCBkYXRlLicgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICA+PC9jOHktbWVzc2FnZT5cbiAgICAgICAgICAgICAgICAgICAgPGM4eS1tZXNzYWdlXG4gICAgICAgICAgICAgICAgICAgICAgbmFtZT1cImludmFsaWREYXRlVGltZVwiXG4gICAgICAgICAgICAgICAgICAgICAgW3RleHRdPVwiJ1RoaXMgZGF0ZSBpcyBpbnZhbGlkLicgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICA+PC9jOHktbWVzc2FnZT5cbiAgICAgICAgICAgICAgICAgIDwvYzh5LW1lc3NhZ2VzPlxuICAgICAgICAgICAgICAgIDwvYzh5LWZvcm0tZ3JvdXA+XG4gICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLTE2IGQtZmxleCBnYXAtOCBzZXBhcmF0b3ItdG9wXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLWRlZmF1bHQgYnRuLXNtIGZsZXgtZ3Jvd1wiXG4gICAgICAgICAgICAgICAgICB0aXRsZT1cInt7ICdSZXNldCcgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwicmVzZXQoKTsgZHJvcGRvd24uaXNPcGVuID0gZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImZvcm0udmFsdWUucmVhbHRpbWVcIlxuICAgICAgICAgICAgICAgICAgdHJhbnNsYXRlXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgUmVzZXRcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IGJ0bi1zbSBmbGV4LWdyb3dcIlxuICAgICAgICAgICAgICAgICAgdGl0bGU9XCJ7eyAnQXBwbHknIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFwcGx5RGF0ZXRpbWVDb250ZXh0KCk7IGRyb3Bkb3duLmlzT3BlbiA9IGZhbHNlXCJcbiAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJcbiAgICAgICAgICAgICAgICAgICAgKGZvcm0ucHJpc3RpbmUgJiYgZm9ybS51bnRvdWNoZWQpIHx8IGZvcm0uaW52YWxpZCB8fCBmb3JtLnZhbHVlLnJlYWx0aW1lXG4gICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgdHJhbnNsYXRlXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgQXBwbHlcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L3VsPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwIHctYXV0b1wiPlxuICAgICAgPGM4eS1yZWFsdGltZS1jb250cm9sXG4gICAgICAqbmdJZj1cImRpc3BsYXlTZXR0aW5ncy5nbG9iYWxSZWFsdGltZUNvbnRleHRcIlxuICAgICAgZm9ybUNvbnRyb2xOYW1lPVwicmVhbHRpbWVcIlxuICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2wgcC0wIGZsZXgtbm8tZ3JvdyB3LWF1dG9cIlxuICAgICAgPjwvYzh5LXJlYWx0aW1lLWNvbnRyb2w+XG5cbiAgICAgIDxjOHktYWdncmVnYXRpb24tcGlja2VyXG4gICAgICAgICpuZ0lmPVwiZGlzcGxheVNldHRpbmdzLmdsb2JhbEFnZ3JlZ2F0aW9uQ29udGV4dFwiXG4gICAgICAgIGZvcm1Db250cm9sTmFtZT1cImFnZ3JlZ2F0aW9uXCJcbiAgICAgICAgW2Rpc2FibGVkQWdncmVnYXRpb25zXT1cImRpc2FibGVkQWdncmVnYXRpb25zXCJcbiAgICAgID48L2M4eS1hZ2dyZWdhdGlvbi1waWNrZXI+XG4gICAgPC9kaXY+XG4gIDwvZm9ybT5cbjwvbmctdGVtcGxhdGU+XG5cbjxjOHktZGFzaGJvYXJkLWNoaWxkLWFjdGlvbj5cbiAgPGJ1dHRvblxuICAgIHR5cGU9XCJidXR0b25cIlxuICAgIChjbGljayk9XCJ0b2dnbGVEZWNvdXBsaW5nKClcIlxuICA+XG4gICAgPGkgW2M4eUljb25dPVwiaXNDb3VwbGVkID8gJ3NjaGVkdWxlMScgOiAndG9kYXknXCI+PC9pPlxuICAgIDxzcGFuIGNsYXNzPVwibS1sLTRcIj5cbiAgICAgIHt7IChpc0NvdXBsZWQgPyBkZWNvdXBsZVRpbWVDb250ZXh0TGFiZWwgOiBjb3VwbGVUaW1lQ29udGV4dExhYmVsKSB8IHRyYW5zbGF0ZSB9fVxuICAgIDwvc3Bhbj5cbiAgPC9idXR0b24+XG48L2M4eS1kYXNoYm9hcmQtY2hpbGQtYWN0aW9uPlxuIl19
455
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2lkZ2V0LXRpbWUtY29udGV4dC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9jb3JlL2Rhc2hib2FyZC93aWdldC10aW1lLWNvbnRleHQvd2lkZ2V0LXRpbWUtY29udGV4dC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9jb3JlL2Rhc2hib2FyZC93aWdldC10aW1lLWNvbnRleHQvd2lkZ2V0LXRpbWUtY29udGV4dC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBR0wsTUFBTSxFQUNOLFNBQVMsRUFDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLGFBQWEsRUFBRSxhQUFhLEVBQUUsZUFBZSxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3hGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDOUMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDN0QsT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQWdCLE1BQU0sTUFBTSxDQUFDO0FBQ3ZELE9BQU8sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbkQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDcEQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDaEYsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sOENBQThDLENBQUM7QUFDbEYsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFlBQVksQ0FBQztBQUNyQyxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUNwRixPQUFPLEVBQUUs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QUFXO3NCQURWLEtBQUs7Z0JBR0csZUFBZTtzQkFBdkIsS0FBSztnQkFFRyxNQUFNO3NCQUFkLEtBQUs7Z0JBTU4saUJBQWlCO3NCQURoQixNQUFNO2dCQUttQyxNQUFNO3NCQUEvQyxTQUFTO3VCQUFDLDZCQUE2QjtnQkFDUixRQUFRO3NCQUF2QyxTQUFTO3VCQUFDLG1CQUFtQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgVmlld0NoaWxkXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUJ1aWxkZXIgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBBY3RpdmF0aW9uRW5kLCBOYXZpZ2F0aW9uRW5kLCBOYXZpZ2F0aW9uU3RhcnQsIFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBhZ2dyZWdhdGlvblR5cGUgfSBmcm9tICdAYzh5L2NsaWVudCc7XG5pbXBvcnQgeyBCc0Ryb3Bkb3duRGlyZWN0aXZlIH0gZnJvbSAnbmd4LWJvb3RzdHJhcC9kcm9wZG93bic7XG5pbXBvcnQgeyBpbnRlcnZhbCwgU3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBmaWx0ZXIsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IEFjdGlvbkJhclNlcnZpY2UgfSBmcm9tICcuLi8uLi9hY3Rpb24tYmFyJztcbmltcG9ydCB7IEFHR1JFR0FUSU9OX0xJTUlUUyB9IGZyb20gJy4uLy4uL2NvbW1vbi9hZ2dyZWdhdGlvbi9hZ2dyZWdhdGlvbi5tb2RlbCc7XG5pbXBvcnQgeyBBZ2dyZWdhdGlvblNlcnZpY2UgfSBmcm9tICcuLi8uLi9jb21tb24vYWdncmVnYXRpb24vYWdncmVnYXRpb24uc2VydmljZSc7XG5pbXBvcnQgeyBnZXR0ZXh0IH0gZnJvbSAnLi4vLi4vaTE4bic7XG5pbXBvcnQgeyBEYXNoYm9hcmRDaGlsZEFjdGlvbkNvbXBvbmVudCB9IGZyb20gJy4uL2Rhc2hib2FyZC1jaGlsZC1hY3Rpb24uY29tcG9uZW50JztcbmltcG9ydCB7IERhc2hib2FyZENoaWxkQ29tcG9uZW50IH0gZnJvbSAnLi4vZGFzaGJvYXJkLWNoaWxkLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBEYXRlVGltZUNvbnRleHQsIFRpbWVDb250ZXh0RXZlbnQsIFdpZGdldFRpbWVDb250ZXh0IH0gZnJvbSAnLi4vd2lkZ2V0LWNoYW5nZS1ldmVudC5tb2RlbCc7XG5pbXBvcnQgeyBXaWRnZXRzRGFzaGJvYXJkRXZlbnRTZXJ2aWNlIH0gZnJvbSAnLi4vd2lkZ2V0cy1kYXNoYm9hcmQtZXZlbnQuc2VydmljZSc7XG5pbXBvcnQgeyBXaWRnZXRUaW1lQ29udGV4dEhlbHBlclNlcnZpY2UgfSBmcm9tICcuL3dpZGdldC10aW1lLWNvbnRleHQtaGVscGVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgV2lkZ2V0VGltZUNvbnRleHRRdWVyeVNlcnZpY2UgfSBmcm9tICcuL3dpZGdldC10aW1lLWNvbnRleHQtcXVlcnkuc2VydmljZSc7XG5pbXBvcnQge1xuICBJbnB1dERhdGVDb250ZXh0UXVlcnlQYXJhbXMsXG4gIFdpZGdldERpc3BsYXlTZXR0aW5ncyxcbiAgV2lkZ2V0VGltZUNvbnRleHRDaGFuZ2UsXG4gIFdpZGdldFRpbWVDb250ZXh0U3RhdGVcbn0gZnJvbSAnLi93aWRnZXQtdGltZS1jb250ZXh0Lm1vZGVsJztcbmltcG9ydCB7IEludGVydmFsLCBJTlRFUlZBTF9USVRMRVMgfSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzL2ludGVydmFsLXBpY2tlcic7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2M4eS13aWRnZXQtdGltZS1jb250ZXh0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL3dpZGdldC10aW1lLWNvbnRleHQuY29tcG9uZW50Lmh0bWwnLFxuICBob3N0OiB7IGNsYXNzOiAnZC1mbGV4IGEtaS1jZW50ZXIgZ2FwLTQnIH1cbn0pXG5leHBvcnQgY2xhc3MgV2lkZ2V0VGltZUNvbnRleHRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgQWZ0ZXJWaWV3SW5pdCB7XG4gIHJlYWRvbmx5IElOVEVSVkFMX1RJVExFUyA9IElOVEVSVkFMX1RJVExFUztcbiAgcmVhZG9ubHkgREFURV9GT1JNQVQgPSAnc2hvcnQnO1xuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBjb21wb25lbnQgY2FuIGRlY291cGxlIG9yIG5vdC5cbiAgICovXG4gIEBJbnB1dCgpXG4gIGNhbkRlY291cGxlID0gdHJ1ZTtcblxuICBASW5wdXQoKSBkaXNwbGF5U2V0dGluZ3M6IFdpZGdldERpc3BsYXlTZXR0aW5ncztcblxuICBASW5wdXQoKSBoaWRkZW4gPSBmYWxzZTtcblxuICAvKipcbiAgICogRW1pdHMgZWFjaCBjaGFuZ2UgYXMgYW4gYXJyYXkgb2YgZGF0ZXMgW2Zyb20sIHRvXS5cbiAgICovXG4gIEBPdXRwdXQoKVxuICBkYXRlQ29udGV4dENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8V2lkZ2V0VGltZUNvbnRleHRDaGFuZ2U+KCk7XG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBAVmlld0NoaWxkKERhc2hib2FyZENoaWxkQWN0aW9uQ29tcG9uZW50KSBhY3Rpb246IERhc2hib2FyZENoaWxkQWN0aW9uQ29tcG9uZW50O1xuICBAVmlld0NoaWxkKEJzRHJvcGRvd25EaXJlY3RpdmUpIGRyb3Bkb3duOiBCc0Ryb3Bkb3duRGlyZWN0aXZlO1xuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSB0aW1lIGNvbnRleHQgaXMgYm91bmQgdG8gdGhlIGdsb2JhbCBzY29wZS5cbiAgICovXG4gIGlzQ291cGxlZCA9IHRydWU7XG4gIGRlY291cGxlVGltZUNvbnRleHRMYWJlbCA9IGdldHRleHQoJ0RlY291cGxlIHRpbWUgY29udGV4dCcpO1xuICBjb3VwbGVUaW1lQ29udGV4dExhYmVsID0gZ2V0dGV4dCgnQ291cGxlIHRpbWUgY29udGV4dCcpO1xuICBmb3JtOiBSZXR1cm5UeXBlPFdpZGdldFRpbWVDb250ZXh0Q29tcG9uZW50WydjcmVhdGVGb3JtJ10+O1xuICBhY3Rpb25CYXJJbkdyb3VwUHJpb3JpdHk6IG51bWJlcjtcbiAgZGlzYWJsZWRBZ2dyZWdhdGlvbnM6IFBhcnRpYWw8UmVjb3JkPGFnZ3JlZ2F0aW9uVHlwZSwgYm9vbGVhbj4+ID0ge307XG4gIHJlYWRvbmx5IERFRkFVTFRfSU5URVJWQUw6IEludGVydmFsWydpZCddID0gJ2RheXMnO1xuICByZWFkb25seSBBQ1RJT05fQkFSX1BSSU9SSVRZID0gNztcbiAgcmVhZG9ubHkgQUNUSU9OX0JBUl9HUk9VUF9JRCA9ICd0aW1lY29udGV4dCc7XG4gIHJlYWRvbmx5IFJFQUxUSU1FX0lOVEVSVkFMID0gMTAwMDtcbiAgcHJpdmF0ZSBzdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcbiAgcHJpdmF0ZSBkZXN0cm95JDogU3ViamVjdDx2b2lkPiA9IG5ldyBTdWJqZWN0KCk7XG4gIHByaXZhdGUgbmF2aWdhdGlvbkluUHJvZ3Jlc3M6IGJvb2xlYW47XG4gIHByaXZhdGUgcmVhbHRpbWVTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcblxuICAvKipcbiAgICogQGlnbm9yZSBvbmx5IERJLlxuICAgKi9cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSB3aWRnZXRFdmVudFNlcnZpY2U6IFdpZGdldHNEYXNoYm9hcmRFdmVudFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBkYXNoYm9hcmRDaGlsZDogRGFzaGJvYXJkQ2hpbGRDb21wb25lbnQsXG4gICAgcHJpdmF0ZSBmb3JtQnVpbGRlcjogRm9ybUJ1aWxkZXIsXG4gICAgcHJpdmF0ZSBxdWVyeVNlcnZpY2U6IFdpZGdldFRpbWVDb250ZXh0UXVlcnlTZXJ2aWNlLFxuICAgIHByaXZhdGUgaGVscGVyU2VydmljZTogV2lkZ2V0VGltZUNvbnRleHRIZWxwZXJTZXJ2aWNlLFxuICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXG4gICAgcHJpdmF0ZSBhY3Rpb25CYXJTZXJ2aWNlOiBBY3Rpb25CYXJTZXJ2aWNlLFxuICAgIHByaXZhdGUgYWdncmVnYXRpb25TZXJ2aWNlOiBBZ2dyZWdhdGlvblNlcnZpY2VcbiAgKSB7fVxuXG4gIC8qKlxuICAgKiBAaWdub3JlIFN1YnNjcmliaW5nIHRvIHRoZSBnbG9iYWwgY29udGV4dC5cbiAgICovXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuYWN0aW9uQmFySW5Hcm91cFByaW9yaXR5ID0gdGhpcy5oZWxwZXJTZXJ2aWNlLmdldEFjdGlvbkJhclByaW9yaXR5KHRoaXMuZGlzcGxheVNldHRpbmdzKTtcbiAgICBjb25zdCBpbml0aWFsQ29udGV4dDogV2lkZ2V0VGltZUNvbnRleHRTdGF0ZSA9XG4gICAgICB0aGlzLmdldEluaXRpYWxDb250ZXh0KCkgfHwgdGhpcy5nZXREZWZhdWx0Q29udGV4dCgpO1xuICAgIGluaXRpYWxDb250ZXh0LmFnZ3JlZ2F0aW9uID0gdGhpcy5jYWxjdWxhdGVBZ2dyZWdhdGlvbihcbiAgICAgIGluaXRpYWxDb250ZXh0LmRhdGUsXG4gICAgICBpbml0aWFsQ29udGV4dC5hZ2dyZWdhdGlvblxuICAgICk7XG4gICAgdGhpcy5mb3JtID0gdGhpcy5jcmVhdGVGb3JtKGluaXRpYWxDb250ZXh0KTtcblxuICAgIHRoaXMuZGF0ZUNvbnRleHRDaGFuZ2UuZW1pdCh7XG4gICAgICBkYXRlOiBpbml0aWFsQ29udGV4dC5kYXRlLFxuICAgICAgcmVhbHRpbWU6IGluaXRpYWxDb250ZXh0LnJlYWx0aW1lLFxuICAgICAgYWdncmVnYXRpb246IGluaXRpYWxDb250ZXh0LmFnZ3JlZ2F0aW9uXG4gICAgfSk7XG4gICAgaWYgKHRoaXMuaXNDb3VwbGVkKSB7XG4gICAgICB0aGlzLnF1ZXJ5U2VydmljZS5zZXREYXRlQ29udGV4dFF1ZXJ5UGFyYW1zKGluaXRpYWxDb250ZXh0KTtcbiAgICB9XG4gICAgdGhpcy5zdWJzY3JpYmVUb0dsb2JhbENvbnRleHQoKTtcbiAgICB0aGlzLnN1YnNjcmliZVRvUXVlcnlQYXJhbXNDaGFuZ2UoKTtcbiAgICB0aGlzLnN1YnNjcmliZVRvUm91dGVyRXZlbnRzKCk7XG4gICAgdGhpcy5zdWJzY3JpYmVUb0ludGVydmFsQ2hhbmdlKCk7XG4gICAgdGhpcy5zdWJzY3JpYmVUb1JlYWx0aW1lQ2hhbmdlKCk7XG4gICAgdGhpcy5zdWJzY3JpYmVUb0FnZ3JlZ2F0aW9uQ2hhbmdlKCk7XG5cbiAgICBpZiAoaW5pdGlhbENvbnRleHQucmVhbHRpbWUpIHtcbiAgICAgIHRoaXMub25SZWFsdGltZVZhbHVlQ2hhbmdlKGluaXRpYWxDb250ZXh0LnJlYWx0aW1lKTtcbiAgICAgIHRoaXMuc3RhcnRSZWFsdGltZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAaWdub3JlIEFkZGluZyBjdXN0b20gYWN0aW9ucy5cbiAgICovXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jYW5EZWNvdXBsZSkge1xuICAgICAgdGhpcy5kYXNoYm9hcmRDaGlsZC5hZGRBY3Rpb25zKFt0aGlzLmFjdGlvbl0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUb2dnbGVzIHRoZSBjb3VwbGluZyBvbiBvciBvZmYuXG4gICAqL1xuICB0b2dnbGVEZWNvdXBsaW5nKCk6IHZvaWQge1xuICAgIHRoaXMuaXNDb3VwbGVkID0gIXRoaXMuaXNDb3VwbGVkO1xuICAgIGNvbnN0IGxhc3RFdmVudFZhbHVlID0gdGhpcy53aWRnZXRFdmVudFNlcnZpY2UuZ2V0TGFzdFZhbHVlKCdUSU1FX0NPTlRFWFQnKTtcbiAgICBjb25zdCB7IHJlYWx0aW1lLCBhZ2dyZWdhdGlvbiwgaW50ZXJ2YWwgfSA9IGxhc3RFdmVudFZhbHVlO1xuICAgIGxldCBkYXRlOiBEYXRlVGltZUNvbnRleHQ7XG4gICAgaWYgKGludGVydmFsKSB7XG4gICAgICBkYXRlID0gdGhpcy5oZWxwZXJTZXJ2aWNlLmdldERhdGVUaW1lQ29udGV4dEJ5SW50ZXJ2YWwoaW50ZXJ2YWwpO1xuICAgIH0gZWxzZSB7XG4gICAgICBkYXRlID0gbGFzdEV2ZW50VmFsdWUuZGF0ZVRpbWVDb250ZXh0O1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZUZvcm1WYWx1ZXMoeyBkYXRlLCBpbnRlcnZhbCwgcmVhbHRpbWUsIGFnZ3JlZ2F0aW9uIH0pO1xuXG4gICAgaWYgKHRoaXMuaXNDb3VwbGVkKSB7XG4gICAgICB0aGlzLnN1YnNjcmliZVRvR2xvYmFsQ29udGV4dCgpO1xuICAgICAgdGhpcy5kYXRlQ29udGV4dENoYW5nZS5lbWl0KHsgZGF0ZSwgcmVhbHRpbWUsIGFnZ3JlZ2F0aW9uIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnVuc3Vic2NyaWJlRnJvbUdsb2JhbENvbnRleHQoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQXBwbGllcyBmb3JtIHZhbHVlIHRvIGdsb2JhbCBvciBsb2NhbCBkYXRlIGNvbnRleHQuXG4gICAqL1xuICBhcHBseURhdGV0aW1lQ29udGV4dCgpOiB2b2lkIHtcbiAgICB0aGlzLnVwZGF0ZSh7XG4gICAgICBkYXRlOiBbXG4gICAgICAgIG5ldyBEYXRlKHRoaXMuZm9ybS52YWx1ZS50ZW1wb3JhcnlVc2VyU2VsZWN0ZWRGcm9tRGF0ZSksXG4gICAgICAgIG5ldyBEYXRlKHRoaXMuZm9ybS52YWx1ZS50ZW1wb3JhcnlVc2VyU2VsZWN0ZWRUb0RhdGUpXG4gICAgICBdLFxuICAgICAgaW50ZXJ2YWw6IG51bGwsXG4gICAgICByZWFsdGltZTogdGhpcy5mb3JtLnZhbHVlLnJlYWx0aW1lLFxuICAgICAgYWdncmVnYXRpb246IHRoaXMuZm9ybS52YWx1ZS5hZ2dyZWdhdGlvblxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0cyBmb3JtIHRvIGluaXRpYWwgdmFsdWUgYW5kIHVwZGF0ZSBjb250ZXh0LlxuICAgKi9cbiAgcmVzZXQoKTogdm9pZCB7XG4gICAgdGhpcy5zdG9wUmVhbHRpbWUoKTtcbiAgICB0aGlzLnVwZGF0ZSh0aGlzLmdldERlZmF1bHRDb250ZXh0KCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpZ25vcmUgdW5zdWJzY3JpYmluZy5cbiAgICovXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMudW5zdWJzY3JpYmVGcm9tR2xvYmFsQ29udGV4dCgpO1xuICAgIHRoaXMuY2xlYXJRdWVyeVBhcmFtc0lmTmVlZGVkKCk7XG4gICAgdGhpcy5kZXN0cm95JC5uZXh0KCk7XG4gICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBzdWJzY3JpYmVUb0ludGVydmFsQ2hhbmdlKCk6IHZvaWQge1xuICAgIHRoaXMuZm9ybS5jb250cm9scy5jdXJyZW50RGF0ZUNvbnRleHRJbnRlcnZhbC52YWx1ZUNoYW5nZXNcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcbiAgICAgIC5zdWJzY3JpYmUoaW50ZXJ2YWwgPT4ge1xuICAgICAgICBsZXQgZGF0ZTogRGF0ZVRpbWVDb250ZXh0O1xuICAgICAgICBpZiAoaW50ZXJ2YWwgPT09ICdjdXN0b20nKSB7XG4gICAgICAgICAgZGF0ZSA9IFtcbiAgICAgICAgICAgIG5ldyBEYXRlKHRoaXMuZm9ybS5jb250cm9scy5jdXJyZW50RGF0ZUNvbnRleHRGcm9tRGF0ZS52YWx1ZSksXG4gICAgICAgICAgICBuZXcgRGF0ZSh0aGlzLmZvcm0uY29udHJvbHMuY3VycmVudERhdGVDb250ZXh0VG9EYXRlLnZhbHVlKVxuICAgICAgICAgIF07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZGF0ZSA9IHRoaXMuaGVscGVyU2VydmljZS5nZXREYXRlVGltZUNvbnRleHRCeUludGVydmFsKGludGVydmFsKTtcbiAgICAgICAgICB0aGlzLmRyb3Bkb3duLmlzT3BlbiA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudXBkYXRlKHtcbiAgICAgICAgICBkYXRlLFxuICAgICAgICAgIGludGVydmFsLFxuICAgICAgICAgIHJlYWx0aW1lOiB0aGlzLmZvcm0udmFsdWUucmVhbHRpbWUsXG4gICAgICAgICAgYWdncmVnYXRpb246IHRoaXMuZm9ybS52YWx1ZS5hZ2dyZWdhdGlvblxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzdWJzY3JpYmVUb1JlYWx0aW1lQ2hhbmdlKCk6IHZvaWQge1xuICAgIHRoaXMuZm9ybS5jb250cm9scy5yZWFsdGltZS52YWx1ZUNoYW5nZXMucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZShyZWFsdGltZSA9PiB7XG4gICAgICB0aGlzLm9uUmVhbHRpbWVWYWx1ZUNoYW5nZShyZWFsdGltZSk7XG5cbiAgICAgIGlmIChyZWFsdGltZSkge1xuICAgICAgICB0aGlzLnN0YXJ0UmVhbHRpbWUoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc3RvcFJlYWx0aW1lKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHN1YnNjcmliZVRvQWdncmVnYXRpb25DaGFuZ2UoKSB7XG4gICAgdGhpcy5mb3JtLmNvbnRyb2xzLmFnZ3JlZ2F0aW9uLnZhbHVlQ2hhbmdlc1xuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgLnN1YnNjcmliZShhZ2dyZWdhdGlvbiA9PiB7XG4gICAgICAgIHRoaXMudXBkYXRlKHtcbiAgICAgICAgICBkYXRlOiBbXG4gICAgICAgICAgICBuZXcgRGF0ZSh0aGlzLmZvcm0udmFsdWUuY3VycmVudERhdGVDb250ZXh0RnJvbURhdGUpLFxuICAgICAgICAgICAgbmV3IERhdGUodGhpcy5mb3JtLnZhbHVlLmN1cnJlbnREYXRlQ29udGV4dFRvRGF0ZSlcbiAgICAgICAgICBdLFxuICAgICAgICAgIGludGVydmFsOiB0aGlzLmZvcm0udmFsdWUuY3VycmVudERhdGVDb250ZXh0SW50ZXJ2YWwsXG4gICAgICAgICAgcmVhbHRpbWU6IHRoaXMuZm9ybS52YWx1ZS5yZWFsdGltZSxcbiAgICAgICAgICBhZ2dyZWdhdGlvblxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVGb3JtKGNvbnRleHQ6IFdpZGdldFRpbWVDb250ZXh0U3RhdGUpIHtcbiAgICByZXR1cm4gdGhpcy5mb3JtQnVpbGRlci5ncm91cCh7XG4gICAgICB0ZW1wb3JhcnlVc2VyU2VsZWN0ZWRGcm9tRGF0ZTogY29udGV4dC5kYXRlWzBdLnRvSVNPU3RyaW5nKCksXG4gICAgICB0ZW1wb3JhcnlVc2VyU2VsZWN0ZWRUb0RhdGU6IGNvbnRleHQuZGF0ZVsxXS50b0lTT1N0cmluZygpLFxuICAgICAgY3VycmVudERhdGVDb250ZXh0RnJvbURhdGU6IGNvbnRleHQuZGF0ZVswXS50b0lTT1N0cmluZygpLFxuICAgICAgY3VycmVudERhdGVDb250ZXh0VG9EYXRlOiBjb250ZXh0LmRhdGVbMV0udG9JU09TdHJpbmcoKSxcbiAgICAgIGN1cnJlbnREYXRlQ29udGV4dEludGVydmFsOiBjb250ZXh0LmludGVydmFsIHx8ICdjdXN0b20nLFxuICAgICAgcmVhbHRpbWU6IGNvbnRleHQucmVhbHRpbWUsXG4gICAgICBhZ2dyZWdhdGlvbjogY29udGV4dC5hZ2dyZWdhdGlvblxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpcmVzIGEgbmV3IFdpZGdldENoYW5nZUV2ZW50IGVpdGhlciBvbiB0aGUgbG9jYWwgY2hhbmdlIGVtaXR0ZXIgb3Igb24gdGhlIGdsb2JhbCBvbmUuXG4gICAqIEBwYXJhbSB3aWRnZXRUaW1lQ29udGV4dFN0YXRlIE5ldyB3aWRnZXQgdGltZSBjb250ZXh0IHZhbHVlLiovXG4gIHByaXZhdGUgdXBkYXRlKHsgZGF0ZSwgaW50ZXJ2YWwsIHJlYWx0aW1lLCBhZ2dyZWdhdGlvbiB9OiBXaWRnZXRUaW1lQ29udGV4dFN0YXRlKTogdm9pZCB7XG4gICAgY29uc3QgdmFsaWRBZ2dyZWdhdGlvbiA9IHRoaXMuY2FsY3VsYXRlQWdncmVnYXRpb24oZGF0ZSwgYWdncmVnYXRpb24pO1xuICAgIGlmICh0aGlzLmlzQ291cGxlZCkge1xuICAgICAgY29uc3QgZXZlbnREYXRhOiBXaWRnZXRUaW1lQ29udGV4dCA9XG4gICAgICAgIGludGVydmFsICYmIGludGVydmFsICE9PSAnY3VzdG9tJ1xuICAgICAgICAgID8geyBpbnRlcnZhbCwgcmVhbHRpbWUsIGFnZ3JlZ2F0aW9uOiB2YWxpZEFnZ3JlZ2F0aW9uIH1cbiAgICAgICAgICA6IHsgZGF0ZVRpbWVDb250ZXh0OiBkYXRlLCByZWFsdGltZSwgYWdncmVnYXRpb246IHZhbGlkQWdncmVnYXRpb24gfTtcbiAgICAgIHRoaXMud2lkZ2V0RXZlbnRTZXJ2aWNlLmVtaXQoeyB0eXBlOiAnVElNRV9DT05URVhUJywgZGF0YTogZXZlbnREYXRhIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnVwZGF0ZUZvcm1WYWx1ZXMoeyBkYXRlLCBpbnRlcnZhbCwgcmVhbHRpbWUsIGFnZ3JlZ2F0aW9uOiB2YWxpZEFnZ3JlZ2F0aW9uIH0pO1xuICAgICAgdGhpcy5kYXRlQ29udGV4dENoYW5nZS5lbWl0KHsgZGF0ZSwgcmVhbHRpbWUsIGFnZ3JlZ2F0aW9uOiB2YWxpZEFnZ3JlZ2F0aW9uIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc3Vic2NyaWJlVG9HbG9iYWxDb250ZXh0KCk6IHZvaWQge1xuICAgIGNvbnN0IGV2ZW50JCA9IHRoaXMud2lkZ2V0RXZlbnRTZXJ2aWNlLmdldE9ic2VydmFibGU8VGltZUNvbnRleHRFdmVudD4oJ1RJTUVfQ09OVEVYVCcpO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9uID0gZXZlbnQkLnN1YnNjcmliZSgoY29udGV4dDogV2lkZ2V0VGltZUNvbnRleHQpID0+IHtcbiAgICAgIGxldCBkYXRlOiBEYXRlVGltZUNvbnRleHQ7XG4gICAgICBjb25zdCB7IHJlYWx0aW1lLCBpbnRlcnZhbCwgYWdncmVnYXRpb24gfSA9IGNvbnRleHQ7XG4gICAgICBpZiAoaW50ZXJ2YWwpIHtcbiAgICAgICAgZGF0ZSA9IHRoaXMuaGVscGVyU2VydmljZS5nZXREYXRlVGltZUNvbnRleHRCeUludGVydmFsKGNvbnRleHQuaW50ZXJ2YWwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGF0ZSA9IGNvbnRleHQuZGF0ZVRpbWVDb250ZXh0O1xuICAgICAgfVxuXG4gICAgICB0aGlzLmRhdGVDb250ZXh0Q2hhbmdlLmVtaXQoe1xuICAgICAgICBkYXRlLFxuICAgICAgICByZWFsdGltZSxcbiAgICAgICAgYWdncmVnYXRpb25cbiAgICAgIH0pO1xuICAgICAgdGhpcy51cGRhdGVGb3JtVmFsdWVzKHsgZGF0ZSwgaW50ZXJ2YWwsIHJlYWx0aW1lLCBhZ2dyZWdhdGlvbiB9KTtcbiAgICAgIHRoaXMucXVlcnlTZXJ2aWNlLnNldERhdGVDb250ZXh0UXVlcnlQYXJhbXMoeyBpbnRlcnZhbCwgZGF0ZSwgcmVhbHRpbWUsIGFnZ3JlZ2F0aW9uIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVGb3JtVmFsdWVzKHtcbiAgICBkYXRlLFxuICAgIGludGVydmFsLFxuICAgIHJlYWx0aW1lLFxuICAgIGFnZ3JlZ2F0aW9uXG4gIH06IFdpZGdldFRpbWVDb250ZXh0U3RhdGUpOiB2b2lkIHtcbiAgICB0aGlzLmZvcm0ucGF0Y2hWYWx1ZShcbiAgICAgIHtcbiAgICAgICAgdGVtcG9yYXJ5VXNlclNlbGVjdGVkRnJvbURhdGU6IGRhdGVbMF0udG9JU09TdHJpbmcoKSxcbiAgICAgICAgdGVtcG9yYXJ5VXNlclNlbGVjdGVkVG9EYXRlOiBkYXRlWzFdLnRvSVNPU3RyaW5nKCksXG4gICAgICAgIGN1cnJlbnREYXRlQ29udGV4dEZyb21EYXRlOiBkYXRlWzBdLnRvSVNPU3RyaW5nKCksXG4gICAgICAgIGN1cnJlbnREYXRlQ29udGV4dFRvRGF0ZTogZGF0ZVsxXS50b0lTT1N0cmluZygpLFxuICAgICAgICByZWFsdGltZSxcbiAgICAgICAgY3VycmVudERhdGVDb250ZXh0SW50ZXJ2YWw6IGludGVydmFsIHx8ICdjdXN0b20nLFxuICAgICAgICBhZ2dyZWdhdGlvbjogYWdncmVnYXRpb24gfHwgbnVsbFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgZW1pdEV2ZW50OiBmYWxzZVxuICAgICAgfVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHVuc3Vic2NyaWJlRnJvbUdsb2JhbENvbnRleHQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0SW5pdGlhbENvbnRleHQoKTogV2lkZ2V0VGltZUNvbnRleHRTdGF0ZSB8IG51bGwge1xuICAgIGNvbnN0IGRhdGVUaW1lQ29udGV4dEZyb21RdWVyeVBhcmFtcyA9IHRoaXMucXVlcnlTZXJ2aWNlLmRhdGVUaW1lQ29udGV4dEZyb21RdWVyeVBhcmFtcygpO1xuICAgIGlmIChkYXRlVGltZUNvbnRleHRGcm9tUXVlcnlQYXJhbXMpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLmRhdGVUaW1lQ29udGV4dEZyb21RdWVyeVBhcmFtcyxcbiAgICAgICAgcmVhbHRpbWU6IGRhdGVUaW1lQ29udGV4dEZyb21RdWVyeVBhcmFtcy5yZWFsdGltZSA/PyBmYWxzZSxcbiAgICAgICAgYWdncmVnYXRpb246IGRhdGVUaW1lQ29udGV4dEZyb21RdWVyeVBhcmFtcy5yZWFsdGltZVxuICAgICAgICAgID8gbnVsbFxuICAgICAgICAgIDogZGF0ZVRpbWVDb250ZXh0RnJvbVF1ZXJ5UGFyYW1zLmFnZ3JlZ2F0aW9uIHx8IG51bGxcbiAgICAgIH07XG4gICAgfVxuICAgIC8vIGdldCB2YWx1ZSBmcm9tIGxhc3QgdmFsdWUgb2YgZXZlbnRzIHNlcnZpY2VcbiAgICBjb25zdCBsYXN0RXZlbnRWYWx1ZSA9IHRoaXMud2lkZ2V0RXZlbnRTZXJ2aWNlLmdldExhc3RWYWx1ZSgnVElNRV9DT05URVhUJyk7XG4gICAgY29uc3QgcmVhbHRpbWUgPSBsYXN0RXZlbnRWYWx1ZT8ucmVhbHRpbWUgPz8gZmFsc2U7XG4gICAgaWYgKGxhc3RFdmVudFZhbHVlICYmIGxhc3RFdmVudFZhbHVlLmRhdGVUaW1lQ29udGV4dCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGF0ZTogbGFzdEV2ZW50VmFsdWUuZGF0ZVRpbWVDb250ZXh0LFxuICAgICAgICBpbnRlcnZhbDogJ2N1c3RvbScsXG4gICAgICAgIHJlYWx0aW1lLFxuICAgICAgICBhZ2dyZWdhdGlvbjogcmVhbHRpbWUgPyBudWxsIDogbGFzdEV2ZW50VmFsdWUuYWdncmVnYXRpb25cbiAgICAgIH07XG4gICAgfVxuICAgIGlmIChsYXN0RXZlbnRWYWx1ZSAmJiBsYXN0RXZlbnRWYWx1ZS5pbnRlcnZhbCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGF0ZTogdGhpcy5oZWxwZXJTZXJ2aWNlLmdldERhdGVUaW1lQ29udGV4dEJ5SW50ZXJ2YWwobGFzdEV2ZW50VmFsdWUuaW50ZXJ2YWwpLFxuICAgICAgICBpbnRlcnZhbDogbGFzdEV2ZW50VmFsdWUuaW50ZXJ2YWwsXG4gICAgICAgIHJlYWx0aW1lLFxuICAgICAgICBhZ2dyZWdhdGlvbjogcmVhbHRpbWUgPyBudWxsIDogbGFzdEV2ZW50VmFsdWUuYWdncmVnYXRpb25cbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwcml2YXRlIHN1YnNjcmliZVRvUXVlcnlQYXJhbXNDaGFuZ2UoKTogdm9pZCB7XG4gICAgdGhpcy5xdWVyeVNlcnZpY2VcbiAgICAgIC5xdWVyeVBhcmFtc0NoYW5nZSQoKVxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgLnN1YnNjcmliZShcbiAgICAgICAgKHtcbiAgICAgICAgICBkYXRlQ29udGV4dEZyb20sXG4gICAgICAgICAgZGF0ZUNvbnRleHRUbyxcbiAgICAgICAgICBkYXRlQ29udGV4dEludGVydmFsLFxuICAgICAgICAgIGRhdGVDb250ZXh0UmVhbHRpbWUsXG4gICAgICAgICAgZGF0ZUNvbnRleHRBZ2dyZWdhdGlvblxuICAgICAgICB9OiBJbnB1dERhdGVDb250ZXh0UXVlcnlQYXJhbXMpID0+IHtcbiAgICAgICAgICBjb25zdCByZWFsdGltZSA9IGRhdGVDb250ZXh0UmVhbHRpbWUgPz8gdGhpcy5mb3JtLnZhbHVlLnJlYWx0aW1lO1xuICAgICAgICAgIGlmIChkYXRlQ29udGV4dEludGVydmFsKSB7XG4gICAgICAgICAgICB0aGlzLndpZGdldEV2ZW50U2VydmljZS5lbWl0KHtcbiAgICAgICAgICAgICAgdHlwZTogJ1RJTUVfQ09OVEVYVCcsXG4gICAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgICBpbnRlcnZhbDogZGF0ZUNvbnRleHRJbnRlcnZhbCxcbiAgICAgICAgICAgICAgICByZWFsdGltZSxcbiAgICAgICAgICAgICAgICBhZ2dyZWdhdGlvbjogZGF0ZUNvbnRleHRBZ2dyZWdhdGlvblxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgZGF0ZUNvbnRleHQ6IERhdGVUaW1lQ29udGV4dCA9IFtcbiAgICAgICAgICAgICAgbmV3IERhdGUoZGF0ZUNvbnRleHRGcm9tKSxcbiAgICAgICAgICAgICAgbmV3IERhdGUoZGF0ZUNvbnRleHRUbylcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICB0aGlzLndpZGdldEV2ZW50U2VydmljZS5lbWl0KHtcbiAgICAgICAgICAgICAgdHlwZTogJ1RJTUVfQ09OVEVYVCcsXG4gICAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgICBkYXRlVGltZUNvbnRleHQ6IGRhdGVDb250ZXh0LFxuICAgICAgICAgICAgICAgIHJlYWx0aW1lLFxuICAgICAgICAgICAgICAgIGFnZ3JlZ2F0aW9uOiBkYXRlQ29udGV4dEFnZ3JlZ2F0aW9uXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgY2xlYXJRdWVyeVBhcmFtc0lmTmVlZGVkKCk6IHZvaWQge1xuICAgIC8vIElmIG5hdmlnYXRpb24gaXMgaW4gcHJvZ3Jlc3MsIHJvdXRlciB3aWxsIHRha2UgY2FyZSBvZiBjbGVhcmluZyBxdWVyeSBwYXJhbXMuIFRoaXMgd2F5IHdlIGF2b2lkIHVubmVjZXNzYXJ5IG1hbmlwdWxhdGlvbiBvZiBicm93c2VyIGhpc3RvcnlcbiAgICBpZiAodGhpcy5uYXZpZ2F0aW9uSW5Qcm9ncmVzcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBjaGVjayBpZiBhbnkgb3RoZXIgV2lkZ2V0VGltZUNvbnRleHRDb21wb25lbnQgYWN0aW9uIGluIGFjdGlvbiBiYXIgZXhpc3RzXG4gICAgY29uc3QgYW55V2lkZ2V0VGltZUNvbnRleHRBY3Rpb25MZWZ0ID0gQXJyYXkuZnJvbSh0aGlzLmFjdGlvbkJhclNlcnZpY2Uuc3RhdGUpLnNvbWUoXG4gICAgICBhY3Rpb24gPT4gYWN0aW9uLmdyb3VwSWQgPT09IHRoaXMuQUNUSU9OX0JBUl9HUk9VUF9JRFxuICAgICk7XG4gICAgaWYgKCFhbnlXaWRnZXRUaW1lQ29udGV4dEFjdGlvbkxlZnQpIHtcbiAgICAgIHRoaXMucXVlcnlTZXJ2aWNlLmNsZWFyUXVlcnlQYXJhbXMoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHN1YnNjcmliZVRvUm91dGVyRXZlbnRzKCk6IHZvaWQge1xuICAgIHRoaXMucm91dGVyLmV2ZW50c1xuICAgICAgLnBpcGUoXG4gICAgICAgIGZpbHRlcihcbiAgICAgICAgICBlID0+XG4gICAgICAgICAgICBlIGluc3RhbmNlb2YgTmF2aWdhdGlvblN0YXJ0IHx8IGUgaW5zdGFuY2VvZiBOYXZpZ2F0aW9uRW5kIHx8IGUgaW5zdGFuY2VvZiBBY3RpdmF0aW9uRW5kXG4gICAgICAgICksXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZShlID0+IHtcbiAgICAgICAgdGhpcy5uYXZpZ2F0aW9uSW5Qcm9ncmVzcyA9IGUgaW5zdGFuY2VvZiBOYXZpZ2F0aW9uU3RhcnQ7XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RGVmYXVsdENvbnRleHQoKTogV2lkZ2V0VGltZUNvbnRleHRTdGF0ZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGRhdGU6IHRoaXMuaGVscGVyU2VydmljZS5nZXREYXRlVGltZUNvbnRleHRCeUludGVydmFsKHRoaXMuREVGQVVMVF9JTlRFUlZBTCksXG4gICAgICBpbnRlcnZhbDogdGhpcy5ERUZBVUxUX0lOVEVSVkFMLFxuICAgICAgcmVhbHRpbWU6IGZhbHNlLFxuICAgICAgYWdncmVnYXRpb246IGFnZ3JlZ2F0aW9uVHlwZS5NSU5VVEVMWVxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHN0YXJ0UmVhbHRpbWUoKTogdm9pZCB7XG4gICAgdGhpcy5mb3JtLmNvbnRyb2xzLnRlbXBvcmFyeVVzZXJTZWxlY3RlZEZyb21EYXRlLmRpc2FibGUoKTtcbiAgICB0aGlzLmZvcm0uY29udHJvbHMudGVtcG9yYXJ5VXNlclNlbGVjdGVkVG9EYXRlLmRpc2FibGUoKTtcbiAgICB0aGlzLmZvcm0uY29udHJvbHMuYWdncmVnYXRpb24uZGlzYWJsZSgpO1xuXG4gICAgdGhpcy5yZWFsdGltZVN1YnNjcmlwdGlvbiA9IGludGVydmFsKHRoaXMuUkVBTFRJTUVfSU5URVJWQUwpXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgY29uc3QgbmV3RGF0ZUZyb20gPSBuZXcgRGF0ZShcbiAgICAgICAgICBuZXcgRGF0ZSh0aGlzLmZvcm0udmFsdWUuY3VycmVudERhdGVDb250ZXh0RnJvbURhdGUpLnZhbHVlT2YoKSArIHRoaXMuUkVBTFRJTUVfSU5URVJWQUxcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgbmV3RGF0ZVRvID0gbmV3IERhdGUoXG4gICAgICAgICAgbmV3IERhdGUodGhpcy5mb3JtLnZhbHVlLmN1cnJlbnREYXRlQ29udGV4dFRvRGF0ZSkudmFsdWVPZigpICsgdGhpcy5SRUFMVElNRV9JTlRFUlZBTFxuICAgICAgICApO1xuICAgICAgICB0aGlzLnVwZGF0ZUZvcm1WYWx1ZXMoe1xuICAgICAgICAgIGRhdGU6IFtuZXdEYXRlRnJvbSwgbmV3RGF0ZVRvXSxcbiAgICAgICAgICBpbnRlcnZhbDogdGhpcy5mb3JtLnZhbHVlLmN1cnJlbnREYXRlQ29udGV4dEludGVydmFsLFxuICAgICAgICAgIHJlYWx0aW1lOiB0cnVlLFxuICAgICAgICAgIGFnZ3JlZ2F0aW9uOiBudWxsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHN0b3BSZWFsdGltZSgpOiB2b2lkIHtcbiAgICB0aGlzLnJlYWx0aW1lU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuZm9ybT8uY29udHJvbHMudGVtcG9yYXJ5VXNlclNlbGVjdGVkRnJvbURhdGUuZW5hYmxlKCk7XG4gICAgdGhpcy5mb3JtPy5jb250cm9scy50ZW1wb3JhcnlVc2VyU2VsZWN0ZWRUb0RhdGUuZW5hYmxlKCk7XG4gICAgdGhpcy5mb3JtPy5jb250cm9scy5hZ2dyZWdhdGlvbi5lbmFibGUoKTtcbiAgfVxuXG4gIHByaXZhdGUgb25SZWFsdGltZVZhbHVlQ2hhbmdlKHJlYWx0aW1lOiBib29sZWFuKTogdm9pZCB7XG4gICAgbGV0IGRhdGVUaW1lQ29udGV4dDogRGF0ZVRpbWVDb250ZXh0O1xuICAgIGlmICh0aGlzLmZvcm0udmFsdWUuY3VycmVudERhdGVDb250ZXh0SW50ZXJ2YWwgIT09ICdjdXN0b20nKSB7XG4gICAgICBkYXRlVGltZUNvbnRleHQgPSB0aGlzLmhlbHBlclNlcnZpY2UuZ2V0RGF0ZVRpbWVDb250ZXh0QnlJbnRlcnZhbChcbiAgICAgICAgdGhpcy5mb3JtLnZhbHVlLmN1cnJlbnREYXRlQ29udGV4dEludGVydmFsXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBjdXJyZW50VGltZVNwYW5Jbk1zID1cbiAgICAgICAgbmV3IERhdGUodGhpcy5mb3JtLnZhbHVlLmN1cnJlbnREYXRlQ29udGV4dFRvRGF0ZSkudmFsdWVPZigpIC1cbiAgICAgICAgbmV3IERhdGUodGhpcy5mb3JtLnZhbHVlLmN1cnJlbnREYXRlQ29udGV4dEZyb21EYXRlKS52YWx1ZU9mKCk7XG4gICAgICBjb25zdCBkYXRlVG8gPSBuZXcgRGF0ZSgpO1xuICAgICAgY29uc3QgZGF0ZUZyb20gPSBuZXcgRGF0ZShkYXRlVG8udmFsdWVPZigpIC0gY3VycmVudFRpbWVTcGFuSW5Ncyk7XG4gICAgICBkYXRlVGltZUNvbnRleHQgPSBbZGF0ZUZyb20sIGRhdGVUb107XG4gICAgfVxuXG4gICAgdGhpcy51cGRhdGUoe1xuICAgICAgZGF0ZTogZGF0ZVRpbWVDb250ZXh0LFxuICAgICAgaW50ZXJ2YWw6IHRoaXMuZm9ybS52YWx1ZS5jdXJyZW50RGF0ZUNvbnRleHRJbnRlcnZhbCxcbiAgICAgIHJlYWx0aW1lLFxuICAgICAgYWdncmVnYXRpb246IG51bGxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY2FsY3VsYXRlQWdncmVnYXRpb24oXG4gICAgW2RhdGVGcm9tLCBkYXRlVG9dOiBEYXRlVGltZUNvbnRleHQsXG4gICAgYWdncmVnYXRpb246IGFnZ3JlZ2F0aW9uVHlwZVxuICApOiBhZ2dyZWdhdGlvblR5cGUge1xuICAgIHRoaXMuZGlzYWJsZWRBZ2dyZWdhdGlvbnMgPSB0aGlzLmFnZ3JlZ2F0aW9uU2VydmljZS5nZXREaXNhYmxlZEFnZ3JlZ2F0aW9uT3B0aW9ucyhcbiAgICAgIGRhdGVGcm9tLFxuICAgICAgZGF0ZVRvXG4gICAgKTtcbiAgICBjb25zdCB0aW1lUmFuZ2VJbk1zID0gZGF0ZVRvLnZhbHVlT2YoKSAtIGRhdGVGcm9tLnZhbHVlT2YoKTtcbiAgICBjb25zdCBpc1Byb3BlckFnZ3JlZ2F0aW9uID0gIXRoaXMuZGlzYWJsZWRBZ2dyZWdhdGlvbnNbYWdncmVnYXRpb25dIHx8IGFnZ3JlZ2F0aW9uID09PSBudWxsO1xuXG4gICAgaWYgKGlzUHJvcGVyQWdncmVnYXRpb24pIHtcbiAgICAgIHJldHVybiBhZ2dyZWdhdGlvbjtcbiAgICB9XG4gICAgaWYgKHRpbWVSYW5nZUluTXMgPj0gQUdHUkVHQVRJT05fTElNSVRTLkRBSUxZX0xJTUlUKSB7XG4gICAgICByZXR1cm4gYWdncmVnYXRpb25UeXBlLkRBSUxZO1xuICAgIH0gZWxzZSBpZiAodGltZVJhbmdlSW5NcyA+PSBBR0dSRUdBVElPTl9MSU1JVFMuSE9VUkxZX0xJTUlUKSB7XG4gICAgICByZXR1cm4gYWdncmVnYXRpb25UeXBlLkhPVVJMWTtcbiAgICB9IGVsc2UgaWYgKHRpbWVSYW5nZUluTXMgPj0gQUdHUkVHQVRJT05fTElNSVRTLk1JTlVURUxZX0xJTUlUKSB7XG4gICAgICByZXR1cm4gYWdncmVnYXRpb25UeXBlLk1JTlVURUxZO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cbn1cbiIsIjxjOHktYWN0aW9uLWJhci1pdGVtXG4gICpuZ0lmPVwiaXNDb3VwbGVkICYmICFoaWRkZW5cIlxuICBbcHJpb3JpdHldPVwiQUNUSU9OX0JBUl9QUklPUklUWVwiXG4gIFtncm91cElkXT1cIkFDVElPTl9CQVJfR1JPVVBfSURcIlxuICBbaW5Hcm91cFByaW9yaXR5XT1cImFjdGlvbkJhckluR3JvdXBQcmlvcml0eVwiXG4gIFtwbGFjZW1lbnRdPVwiJ2xlZnQnXCJcbj5cbiAgPG5nLWNvbnRhaW5lclxuICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImRhdGVUaW1lUGlja2VyXCJcbiAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie1xuICAgICAgZGF0ZTogW2Zvcm0udmFsdWUuY3VycmVudERhdGVDb250ZXh0RnJvbURhdGUsIGZvcm0udmFsdWUuY3VycmVudERhdGVDb250ZXh0VG9EYXRlXVxuICAgIH1cIlxuICA+PC9uZy1jb250YWluZXI+XG48L2M4eS1hY3Rpb24tYmFyLWl0ZW0+XG5cbjxuZy1jb250YWluZXJcbiAgKm5nSWY9XCIhaXNDb3VwbGVkXCJcbiAgW25nVGVtcGxhdGVPdXRsZXRdPVwiZGF0ZVRpbWVQaWNrZXJcIlxuICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie1xuICAgIGRhdGU6IFtmb3JtLnZhbHVlLmN1cnJlbnREYXRlQ29udGV4dEZyb21EYXRlLCBmb3JtLnZhbHVlLmN1cnJlbnREYXRlQ29udGV4dFRvRGF0ZV1cbiAgfVwiXG4+PC9uZy1jb250YWluZXI+XG5cbjxuZy10ZW1wbGF0ZVxuICAjZGF0ZVRpbWVQaWNrZXJcbiAgbGV0LWRhdGU9XCJkYXRlXCJcbj5cbiAgPGZvcm1cbiAgICBjbGFzcz1cImQtZmxleCBnYXAtMTYgcC1sLXhzLTE2IHAtci14cy0xNiBtLXQteHMtOCBtLWIteHMtOFwiXG4gICAgW2Zvcm1Hcm91cF09XCJmb3JtXCJcbiAgPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJkaXNwbGF5U2V0dGluZ3MuZ2xvYmFsVGltZUNvbnRleHRcIj5cbiAgICAgIDxkaXY+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cImRyb3Bkb3duIGZsZXgtZ3Jvd1wiXG4gICAgICAgICAgI2Ryb3Bkb3duPVwiYnMtZHJvcGRvd25cIlxuICAgICAgICAgIGRyb3Bkb3duXG4gICAgICAgICAgW2luc2lkZUNsaWNrXT1cInRydWVcIlxuICAgICAgICAgICpuZ0lmPVwiZGF0ZVwiXG4gICAgICAgID5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICBjbGFzcz1cImRyb3Bkb3duLXRvZ2dsZSBmb3JtLWNvbnRyb2wgbC1oLXRpZ2h0IGQtZmxleCBhLWktY2VudGVyXCJcbiAgICAgICAgICAgIGF0dHIuYXJpYS1sYWJlbD1cInt7IGRhdGVbMF0gfCBjOHlEYXRlOiBEQVRFX0ZPUk1BVCB9fSDigJQge3tcbiAgICAgICAgICAgICAgZGF0ZVsxXSB8IGM4eURhdGU6IERBVEVfRk9STUFUXG4gICAgICAgICAgICB9fVwiXG4gICAgICAgICAgICB0b29sdGlwPVwie3sgZGF0ZVswXSB8IGM4eURhdGU6IERBVEVfRk9STUFUIH19IOKAlCB7eyBkYXRlWzFdIHwgYzh5RGF0ZTogREFURV9GT1JNQVQgfX1cIlxuICAgICAgICAgICAgcGxhY2VtZW50PVwidG9wXCJcbiAgICAgICAgICAgIGNvbnRhaW5lcj1cImJvZHlcIlxuICAgICAgICAgICAgZGF0YS1jeT1cIndpZGdldC10aW1lLWNvbnRleHQtLWRhdGUtcGlja2VyLWRyb3Bkb3duLWJ1dHRvblwiXG4gICAgICAgICAgICBbYWRhcHRpdmVQb3NpdGlvbl09XCJmYWxzZVwiXG4gICAgICAgICAgICBbZGVsYXldPVwiNTAwXCJcbiAgICAgICAgICAgIGRyb3Bkb3duVG9nZ2xlXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgY2xhc3M9XCJtLXItNFwiXG4gICAgICAgICAgICAgIGM4eUljb249XCJzY2hlZHVsZTFcIlxuICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWNvbCB0ZXh0LWxlZnQgZml0LXdcIj5cbiAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICBjbGFzcz1cInRleHQtMTJcIlxuICAgICAgICAgICAgICAgIGRhdGEtY3k9XCJ3aWRnZXQtdGltZS1jb250ZXh0LS1zZWxlY3RlZC1pbnRlcnZhbFwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICB7eyBJTlRFUlZBTF9USVRMRVNbZm9ybS5jb250cm9scy5jdXJyZW50RGF0ZUNvbnRleHRJbnRlcnZhbC52YWx1ZV0gfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgIGNsYXNzPVwidGV4dC0xMCB0ZXh0LW11dGVkIHRleHQtdHJ1bmNhdGVcIlxuICAgICAgICAgICAgICAgIGRhdGEtY3k9XCJ3aWRnZXQtdGltZS1jb250ZXh0LS1zZWxlY3RlZC10aW1lLXJhbmdlXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHt7IGRhdGVbMF0gfCBjOHlEYXRlOiBEQVRFX0ZPUk1BVCB9fSDigJQge3sgZGF0ZVsxXSB8IGM4eURhdGU6IERBVEVfRk9STUFUIH19XG4gICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjYXJldCBtLXItMTYgbS1sLTRcIj48L3NwYW4+XG4gICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICA8dWxcbiAgICAgICAgICAgIGNsYXNzPVwiZHJvcGRvd24tbWVudSBkcm9wZG93bi1tZW51LS1kYXRlLXJhbmdlXCJcbiAgICAgICAgICAgICpkcm9wZG93bk1lbnVcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8Yzh5LWludGVydmFsLXBpY2tlclxuICAgICAgICAgICAgICBjbGFzcz1cImQtY29udGVudHNcIlxuICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJjdXJyZW50RGF0ZUNvbnRleHRJbnRlcnZhbFwiXG4gICAgICAgICAgICA+PC9jOHktaW50ZXJ2YWwtcGlja2VyPlxuXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZm9ybS5jb250cm9scy5jdXJyZW50RGF0ZUNvbnRleHRJbnRlcnZhbC52YWx1ZSA9PT0gJ2N1c3RvbSdcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInAtbC0xNiBwLXItMTZcIj5cbiAgICAgICAgICAgICAgICA8Yzh5LWZvcm0tZ3JvdXBcbiAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImZvcm0uY29udHJvbHMudGVtcG9yYXJ5VXNlclNlbGVjdGVkRnJvbURhdGUuZXJyb3JzID8gJ2hhcy1lcnJvcicgOiAnJ1wiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCInRnJvbWBkYXRlYCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICBmb3I9XCJ0ZW1wb3JhcnlVc2VyU2VsZWN0ZWRGcm9tRGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZVxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICBGcm9tYGRhdGVgXG4gICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgPGM4eS1kYXRlLXRpbWUtcGlja2VyXG4gICAgICAgICAgICAgICAgICAgIGlkPVwidGVtcG9yYXJ5VXNlclNlbGVjdGVkRnJvbURhdGVcIlxuICAgICAgICAgICAgICAgICAgICBbbWF4RGF0ZV09XCJmb3JtLnZhbHVlLnRlbXBvcmFyeVVzZXJTZWxlY3RlZFRvRGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCInRnJvbWBkYXRlYCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwiZm9ybS5jb250cm9scy50ZW1wb3JhcnlVc2VyU2VsZWN0ZWRGcm9tRGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIlxuICAgICAgICAgICAgICAgICAgICAgIGZvcm0uY29udHJvbHMudGVtcG9yYXJ5VXNlclNlbGVjdGVkRnJvbURhdGUuZXJyb3JzID8gJ2hhcy1lcnJvcicgOiAnJ1xuICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgPjwvYzh5LWRhdGUtdGltZS1waWNrZXI+XG4gICAgICAgICAgICAgICAgICA8Yzh5LW1lc3NhZ2VzIFtzaG93XT1cImZvcm0uY29udHJvbHMudGVtcG9yYXJ5VXNlclNlbGVjdGVkRnJvbURhdGUuZXJyb3JzXCI+XG4gICAgICAgICAgICAgICAgICAgIDxjOHktbWVzc2FnZVxuICAgICAgICAgICAgICAgICAgICAgIG5hbWU9XCJkYXRlQWZ0ZXJSYW5nZU1heFwiXG4gICAgICAgICAgICAgICAgICAgICAgW3RleHRdPVwiJ1RoaXMgZGF0ZSBpcyBhZnRlciB0aGUgbGF0ZXN0IGFsbG93ZWQgZGF0ZS4nIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgPjwvYzh5LW1lc3NhZ2U+XG4gICAgICAgICAgICAgICAgICAgIDxjOHktbWVzc2FnZVxuICAgICAgICAgICAgICAgICAgICAgIG5hbWU9XCJpbnZhbGlkRGF0ZVRpbWVcIlxuICAgICAgICAgICAgICAgICAgICAgIFt0ZXh0XT1cIidUaGlzIGRhdGUgaXMgaW52YWxpZC4nIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgPjwvYzh5LW1lc3NhZ2U+XG4gICAgICAgICAgICAgICAgICA8L2M4eS1tZXNzYWdlcz5cbiAgICAgICAgICAgICAgICA8L2M4eS1mb3JtLWdyb3VwPlxuXG4gICAgICAgICAgICAgICAgPGM4eS1mb3JtLWdyb3VwXG4gICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJmb3JtLmNvbnRyb2xzLnRlbXBvcmFyeVVzZXJTZWxlY3RlZFRvRGF0ZS5lcnJvcnMgPyAnaGFzLWVycm9yJyA6ICcnXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8bGFiZWxcbiAgICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cIidUb2BkYXRlYCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICBmb3I9XCJ0ZW1wb3JhcnlVc2VyU2VsZWN0ZWRUb0RhdGVcIlxuICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGVcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgVG9gZGF0ZWBcbiAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICA8Yzh5LWRhdGUtdGltZS1waWNrZXJcbiAgICAgICAgICAgICAgICAgICAgaWQ9XCJ0ZW1wb3JhcnlVc2VyU2VsZWN0ZWRUb0RhdGVcIlxuICAgICAgICAgICAgICAgICAgICBbbWluRGF0ZV09XCJmb3JtLnZhbHVlLnRlbXBvcmFyeVVzZXJTZWxlY3RlZEZyb21EYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidUb2BkYXRlYCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwiZm9ybS5jb250cm9scy50ZW1wb3JhcnlVc2VyU2VsZWN0ZWRUb0RhdGVcIlxuICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJmb3JtLmNvbnRyb2xzLnRlbXBvcmFyeVVzZXJTZWxlY3RlZFRvRGF0ZS5lcnJvcnMgPyAnaGFzLWVycm9yJyA6ICcnXCJcbiAgICAgICAgICAgICAgICAgID48L2M4eS1kYXRlLXRpbWUtcGlja2VyPlxuICAgICAgICAgICAgICAgICAgPGM4eS1tZXNzYWdlcyBbc2hvd109XCJmb3JtLmNvbnRyb2xzLnRlbXBvcmFyeVVzZXJTZWxlY3RlZFRvRGF0ZS5lcnJvcnNcIj5cbiAgICAgICAgICAgICAgICAgICAgPGM4eS1tZXNzYWdlXG4gICAgICAgICAgICAgICAgICAgICAgbmFtZT1cImRhdGVCZWZvcmVSYW5nZU1pblwiXG4gICAgICAgICAgICAgICAgICAgICAgW3RleHRdPVwiJ1RoaXMgZGF0ZSBpcyBiZWZvcmUgdGhlIGVhcmxpZXN0IGFsbG93ZWQgZGF0ZS4nIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgPjwvYzh5LW1lc3NhZ2U+XG4gICAgICAgICAgICAgICAgICAgIDxjOHktbWVzc2FnZVxuICAgICAgICAgICAgICAgICAgICAgIG5hbWU9XCJpbnZhbGlkRGF0ZVRpbWVcIlxuICAgICAgICAgICAgICAgICAgICAgIFt0ZXh0XT1cIidUaGlzIGRhdGUgaXMgaW52YWxpZC4nIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgPjwvYzh5LW1lc3NhZ2U+XG4gICAgICAgICAgICAgICAgICA8L2M4eS1tZXNzYWdlcz5cbiAgICAgICAgICAgICAgICA8L2M4eS1mb3JtLWdyb3VwPlxuICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicC0xNiBkLWZsZXggZ2FwLTggc2VwYXJhdG9yLXRvcFwiPlxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0IGJ0bi1zbSBmbGV4LWdyb3dcIlxuICAgICAgICAgICAgICAgICAgdGl0bGU9XCJ7eyAnUmVzZXQnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJlc2V0KCk7IGRyb3Bkb3duLmlzT3BlbiA9IGZhbHNlXCJcbiAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJmb3JtLnZhbHVlLnJlYWx0aW1lXCJcbiAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZVxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIFJlc2V0XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSBidG4tc20gZmxleC1ncm93XCJcbiAgICAgICAgICAgICAgICAgIHRpdGxlPVwie3sgJ0FwcGx5JyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhcHBseURhdGV0aW1lQ29udGV4dCgpOyBkcm9wZG93bi5pc09wZW4gPSBmYWxzZVwiXG4gICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiXG4gICAgICAgICAgICAgICAgICAgIChmb3JtLnByaXN0aW5lICYmIGZvcm0udW50b3VjaGVkKSB8fCBmb3JtLmludmFsaWQgfHwgZm9ybS52YWx1ZS5yZWFsdGltZVxuICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZVxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIEFwcGx5XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC91bD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cCB3LWF1dG9cIj5cbiAgICAgIDxjOHktcmVhbHRpbWUtY29udHJvbFxuICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbCBwLTAgZmxleC1uby1ncm93IHctYXV0b1wiXG4gICAgICAgICpuZ0lmPVwiZGlzcGxheVNldHRpbmdzLmdsb2JhbFJlYWx0aW1lQ29udGV4dFwiXG4gICAgICAgIGZvcm1Db250cm9sTmFtZT1cInJlYWx0aW1lXCJcbiAgICAgID48L2M4eS1yZWFsdGltZS1jb250cm9sPlxuXG4gICAgICA8Yzh5LWFnZ3JlZ2F0aW9uLXBpY2tlclxuICAgICAgICAqbmdJZj1cImRpc3BsYXlTZXR0aW5ncy5nbG9iYWxBZ2dyZWdhdGlvbkNvbnRleHRcIlxuICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJhZ2dyZWdhdGlvblwiXG4gICAgICAgIFtkaXNhYmxlZEFnZ3JlZ2F0aW9uc109XCJkaXNhYmxlZEFnZ3JlZ2F0aW9uc1wiXG4gICAgICA+PC9jOHktYWdncmVnYXRpb24tcGlja2VyPlxuICAgIDwvZGl2PlxuICA8L2Zvcm0+XG48L25nLXRlbXBsYXRlPlxuXG48Yzh5LWRhc2hib2FyZC1jaGlsZC1hY3Rpb24+XG4gIDxidXR0b25cbiAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAoY2xpY2spPVwidG9nZ2xlRGVjb3VwbGluZygpXCJcbiAgPlxuICAgIDxpIFtjOHlJY29uXT1cImlzQ291cGxlZCA/ICdzY2hlZHVsZTEnIDogJ3RvZGF5J1wiPjwvaT5cbiAgICA8c3BhbiBjbGFzcz1cIm0tbC00XCI+XG4gICAgICB7eyAoaXNDb3VwbGVkID8gZGVjb3VwbGVUaW1lQ29udGV4dExhYmVsIDogY291cGxlVGltZUNvbnRleHRMYWJlbCkgfCB0cmFuc2xhdGUgfX1cbiAgICA8L3NwYW4+XG4gIDwvYnV0dG9uPlxuPC9jOHktZGFzaGJvYXJkLWNoaWxkLWFjdGlvbj5cbiJdfQ==
@@ -1,5 +1,3 @@
1
- import { gettext } from '../../i18n';
2
- import { aggregationType } from '@c8y/client';
3
1
  export var DateContextQueryParamNames;
4
2
  (function (DateContextQueryParamNames) {
5
3
  DateContextQueryParamNames["DATE_CONTEXT_FROM"] = "dateContextFrom";
@@ -8,75 +6,6 @@ export var DateContextQueryParamNames;
8
6
  DateContextQueryParamNames["DATE_CONTEXT_REALTIME"] = "dateContextRealtime";
9
7
  DateContextQueryParamNames["DATE_CONTEXT_AGGREGATION"] = "dateContextAggregation";
10
8
  })(DateContextQueryParamNames || (DateContextQueryParamNames = {}));
11
- const todayDate = new Date();
12
- export var TimeSpanInMs;
13
- (function (TimeSpanInMs) {
14
- TimeSpanInMs[TimeSpanInMs["MINUTE"] = 60000] = "MINUTE";
15
- TimeSpanInMs[TimeSpanInMs["HOUR"] = 3600000] = "HOUR";
16
- TimeSpanInMs[TimeSpanInMs["DAY"] = 86400000] = "DAY";
17
- TimeSpanInMs[TimeSpanInMs["WEEK"] = 604800000] = "WEEK";
18
- TimeSpanInMs[TimeSpanInMs["MONTH"] = todayDate.valueOf() - new Date(todayDate.setMonth(todayDate.getMonth() - 1)).valueOf()] = "MONTH";
19
- })(TimeSpanInMs || (TimeSpanInMs = {}));
20
- export const INTERVALS = [
21
- {
22
- id: 'minutes',
23
- title: gettext('Last minute'),
24
- timespanInMs: TimeSpanInMs.MINUTE
25
- },
26
- {
27
- id: 'hours',
28
- title: gettext('Last hour'),
29
- timespanInMs: TimeSpanInMs.HOUR
30
- },
31
- {
32
- id: 'days',
33
- title: gettext('Last day'),
34
- timespanInMs: TimeSpanInMs.DAY
35
- },
36
- {
37
- id: 'weeks',
38
- title: gettext('Last week'),
39
- timespanInMs: TimeSpanInMs.WEEK
40
- },
41
- {
42
- id: 'months',
43
- title: gettext('Last month'),
44
- timespanInMs: TimeSpanInMs.MONTH
45
- },
46
- { id: 'custom', title: gettext('Custom') }
47
- ];
48
- export const INTERVAL_TITLES = {
49
- minutes: gettext('Last minute'),
50
- hours: gettext('Last hour'),
51
- days: gettext('Last day'),
52
- weeks: gettext('Last week'),
53
- months: gettext('Last month'),
54
- custom: gettext('Custom')
55
- };
56
- export const AGGREGATIONS = [
57
- { id: null, title: gettext('None') },
58
- { id: aggregationType.MINUTELY, title: gettext('Minutely') },
59
- { id: aggregationType.HOURLY, title: gettext('Hourly') },
60
- { id: aggregationType.DAILY, title: gettext('Daily') }
61
- ];
62
- export const AGGREGATION_LIMITS = {
63
- MINUTELY_LIMIT: TimeSpanInMs.MINUTE * 10,
64
- HOURLY_LIMIT: TimeSpanInMs.DAY * 1,
65
- DAILY_LIMIT: TimeSpanInMs.DAY * 4
66
- };
67
- export const AGGREGATION_ICONS = {
68
- undefined: 'line-chart',
69
- MINUTELY: 'hourglass',
70
- HOURLY: 'clock-o',
71
- DAILY: 'calendar-o'
72
- };
73
- export const AGGREGATION_TEXTS = {
74
- disabled: gettext('No aggregation with realtime enabled'),
75
- undefined: gettext('No aggregation'),
76
- MINUTELY: gettext('Minutely aggregation'),
77
- HOURLY: gettext('Hourly aggregation'),
78
- DAILY: gettext('Daily aggregation')
79
- };
80
9
  export var WidgetTimeContextActionBarPriority;
81
10
  (function (WidgetTimeContextActionBarPriority) {
82
11
  WidgetTimeContextActionBarPriority[WidgetTimeContextActionBarPriority["NONE"] = 0] = "NONE";
@@ -84,4 +13,4 @@ export var WidgetTimeContextActionBarPriority;
84
13
  WidgetTimeContextActionBarPriority[WidgetTimeContextActionBarPriority["MEDIUM"] = 2] = "MEDIUM";
85
14
  WidgetTimeContextActionBarPriority[WidgetTimeContextActionBarPriority["HIGH"] = 3] = "HIGH";
86
15
  })(WidgetTimeContextActionBarPriority || (WidgetTimeContextActionBarPriority = {}));
87
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2lkZ2V0LXRpbWUtY29udGV4dC5tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2NvcmUvZGFzaGJvYXJkL3dpZ2V0LXRpbWUtY29udGV4dC93aWRnZXQtdGltZS1jb250ZXh0Lm1vZGVsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFckMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQTJDOUMsTUFBTSxDQUFOLElBQVksMEJBTVg7QUFORCxXQUFZLDBCQUEwQjtJQUNwQyxtRUFBcUMsQ0FBQTtJQUNyQywrREFBaUMsQ0FBQTtJQUNqQywyRUFBNkMsQ0FBQTtJQUM3QywyRUFBNkMsQ0FBQTtJQUM3QyxpRkFBbUQsQ0FBQTtBQUNyRCxDQUFDLEVBTlcsMEJBQTBCLEtBQTFCLDBCQUEwQixRQU1yQztBQXVDRCxNQUFNLFNBQVMsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO0FBQzdCLE1BQU0sQ0FBTixJQUFZLFlBTVg7QUFORCxXQUFZLFlBQVk7SUFDdEIsdURBQW9CLENBQUE7SUFDcEIscURBQXVCLENBQUE7SUFDdkIsb0RBQTJCLENBQUE7SUFDM0IsdURBQWdDLENBQUE7SUFDaEMscUNBQVUsU0FBUyxDQUFDLE9BQU8sRUFBRSxHQUFHLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLFdBQUEsQ0FBQTtBQUNsRyxDQUFDLEVBTlcsWUFBWSxLQUFaLFlBQVksUUFNdkI7QUFRRCxNQUFNLENBQUMsTUFBTSxTQUFTLEdBQWU7SUFDbkM7UUFDRSxFQUFFLEVBQUUsU0FBUztRQUNiLEtBQUssRUFBRSxPQUFPLENBQUMsYUFBYSxDQUFDO1FBQzdCLFlBQVksRUFBRSxZQUFZLENBQUMsTUFBTTtLQUNsQztJQUNE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YXRlVGltZUNvbnRleHQgfSBmcm9tICcuLi93aWRnZXQtY2hhbmdlLWV2ZW50Lm1vZGVsJztcbmltcG9ydCB7IGFnZ3JlZ2F0aW9uVHlwZSB9IGZyb20gJ0BjOHkvY2xpZW50JztcblxuZXhwb3J0IHR5cGUgV2lkZ2V0RGlzcGxheVNldHRpbmdzID0ge1xuICAvKipcbiAgICogSWYgZW5hYmxlZCB0aGUgd2lkZ2V0IGlzIGJvdW5kIHRvIHRoZSBnbG9iYWwgdGltZSBjb250ZXh0LiBZb3UgY2FuIGxpc3RlbiB0byBuZ09uQ2hhbmdlcygpIGNoYW5nZSBkZXRlY3Rpb25cbiAgICogdG8gcmVhY3QgdG8gY2hhbmdlcyBvbiB0aGUgY29udGV4dC4gV2hlbiBhIG1vcmUgZGV0YWlsZWQgY29uZmlndXJhdGlvbiBpcyBuZWVkZWQsIHVzZSB0aGUgPGM4eS13aWRnZXQtdGltZS1jb250ZXh0PlxuICAgKiBjb21wb25lbnQgaW5zdGVhZC5cbiAgICovXG4gIGdsb2JhbFRpbWVDb250ZXh0PzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIElmIGVuYWJsZWQgdGhlIHdpZGdldCBpcyBib3VuZCB0byB0aGUgZ2xvYmFsIHJlYWx0aW1lIGNvbnRleHQuIFlvdSBjYW4gbGlzdGVuIHRvIG5nT25DaGFuZ2VzKCkgY2hhbmdlIGRldGVjdGlvblxuICAgKiB0byByZWFjdCB0byBjaGFuZ2VzIG9uIHRoZSBjb250ZXh0LlxuICAgKi9cbiAgZ2xvYmFsUmVhbHRpbWVDb250ZXh0PzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIElmIGVuYWJsZWQgdGhlIHdpZGdldCBpcyBib3VuZCB0byB0aGUgZ2xvYmFsIGFnZ3JlZ2F0aW9uIGNvbnRleHQuIFlvdSBjYW4gbGlzdGVuIHRvIG5nT25DaGFuZ2VzKCkgY2hhbmdlIGRldGVjdGlvblxuICAgKiB0byByZWFjdCB0byBjaGFuZ2VzIG9uIHRoZSBjb250ZXh0LlxuICAgKi9cbiAgZ2xvYmFsQWdncmVnYXRpb25Db250ZXh0PzogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2xvYmFsVGltZUNvbnRleHRXaWRnZXRDb25maWcge1xuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIGluc3RhbmNlIG9mIHdpZGdldCBpcyBib3VuZCB0byBnbG9iYWwgZGF0ZSBjb250ZXh0LiBJdCBjYW4gYmUgb25seSB1c2VkIHdpdGggd2lkZ2V0cyB3aGljaFxuICAgKiBkeW5hbWljIGNvbXBvbmVudCBkZWZpbml0aW9uIGNvbnRhaW5zIGRpc3BsYXlTZXR0aW5ncyBhbGxvd2luZyB0byB1c2UgaXQgd2l0aCBnbG9iYWwgZGF0ZSBjb250ZXh0LlxuICAgKi9cbiAgd2lkZ2V0SW5zdGFuY2VHbG9iYWxUaW1lQ29udGV4dD86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgd2lkZ2V0IHRoYXQgaXMgYm91bmQgdG8gZ2xvYmFsIGRhdGUgY29udGV4dCBjYW4gZGVjb3VwbGUgZnJvbSBpdC4gSWYgdGhhdCB3aWRnZXQgaXMgZGVjb3VwbGVkLCBpdCBpc1xuICAgKiB1bnN1YnNjcmliZWQgZnJvbSBnbG9iYWwgZGF0ZSBjb250ZXh0IHVwZGF0ZXMgYW5kIGRhdGUgY29udGV4dCByZWxhdGVkIGNvbnRyb2xzIGFyZSBkaXNwbGF5ZWQgb24gd2lkZ2V0IHZpZXcuXG4gICAqL1xuICBjYW5EZWNvdXBsZUdsb2JhbFRpbWVDb250ZXh0PzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IHR5cGUgV2lkZ2V0VGltZUNvbnRleHRTdGF0ZSA9IHtcbiAgZGF0ZTogRGF0ZVRpbWVDb250ZXh0O1xuICBpbnRlcnZhbDogSW50ZXJ2YWxbJ2lkJ107XG4gIHJlYWx0aW1lOiBib29sZWFuO1xuICBhZ2dyZWdhdGlvbjogYWdncmVnYXRpb25UeXBlO1xufTtcblxuZXhwb3J0IHR5cGUgV2lkZ2V0VGltZUNvbnRleHRDaGFuZ2UgPSBPbWl0PFdpZGdldFRpbWVDb250ZXh0U3RhdGUsICdpbnRlcnZhbCc+O1xuXG5leHBvcnQgZW51bSBEYXRlQ29udGV4dFF1ZXJ5UGFyYW1OYW1lcyB7XG4gIERBVEVfQ09OVEVYVF9GUk9NID0gJ2RhdGVDb250ZXh0RnJvbScsXG4gIERBVEVfQ09OVEVYVF9UTyA9ICdkYXRlQ29udGV4dFRvJyxcbiAgREFURV9DT05URVhUX0lOVEVSVkFMID0gJ2RhdGVDb250ZXh0SW50ZXJ2YWwnLFxuICBEQVRFX0NPTlRFWFRfUkVBTFRJTUUgPSAnZGF0ZUNvbnRleHRSZWFsdGltZScsXG4gIERBVEVfQ09OVEVYVF9BR0dSRUdBVElPTiA9ICdkYXRlQ29udGV4dEFnZ3JlZ2F0aW9uJ1xufVxuXG50eXBlIERhdGVDb250ZXh0RnJvbVRvUXVlcnlQYXJhbXMgPSB7XG4gIFtEYXRlQ29udGV4dFF1ZXJ5UGFyYW1OYW1lcy5EQVRFX0NPTlRFWFRfRlJPTV06IHN0cmluZztcbiAgW0RhdGVDb250ZXh0UXVlcnlQYXJhbU5hbWVzLkRBVEVfQ09OVEVYVF9UT106IHN0cmluZztcbiAgW0RhdGVDb250ZXh0UXVlcnlQYXJhbU5hbWVzLkRBVEVfQ09OVEVYVF9JTlRFUlZBTF0/OiBuZXZlcjtcbn07XG5cbnR5cGUgRGF0ZUNvbnRleHRJbnRlcnZhbFF1ZXJ5UGFyYW1zID0ge1xuICBbRGF0ZUNvbnRleHRRdWVyeVBhcmFtTmFtZXMuREFURV9DT05URVhUX0ZST01dPzogbmV2ZXI7XG4gIFtEYXRlQ29udGV4dFF1ZXJ5UGFyYW1OYW1lcy5EQVRFX0NPTlRFWFRfVE9dPzogbmV2ZXI7XG4gIFtEYXRlQ29udGV4dFF1ZXJ5UGFyYW1OYW1lcy5EQVRFX0NPTlRFWFRfSU5URVJWQUxdOiBJbnRlcnZhbFsnaWQnXTtcbn07XG5cbi8qKlxuICogSW5wdXQgcXVlcnkgcGFyYW1zIGlzIGFuIG9iamVjdCByZXByZXNlbnRpbmcgYWxsIHBvc3NpYmxlIHF1ZXJ5IHBhcmFtcyByZWxhdGVkIHRvIHdpZGdldCB0aW1lIGNvbnRleHQuXG4gKiBJdCBjYW4gYmUgcHJvdmlkZWQgYnkgdXNlciB0eXBpbmcgdGhlbSBpbiBicm93c2VyIFVSTCBhZGRyZXNzIGJhciwgc28gYWxsIG9mIHRoZW0gc2hvdWxkIGJlIGNvbnNpZGVyZWQuXG4gKi9cbmV4cG9ydCB0eXBlIElucHV0RGF0ZUNvbnRleHRRdWVyeVBhcmFtcyA9IHtcbiAgW0RhdGVDb250ZXh0UXVlcnlQYXJhbU5hbWVzLkRBVEVfQ09OVEVYVF9GUk9NXT86IHN0cmluZztcbiAgW0RhdGVDb250ZXh0UXVlcnlQYXJhbU5hbWVzLkRBVEVfQ09OVEVYVF9UT10/OiBzdHJpbmc7XG4gIFtEYXRlQ29udGV4dFF1ZXJ5UGFyYW1OYW1lcy5EQVRFX0NPTlRFWFRfSU5URVJWQUxdPzogSW50ZXJ2YWxbJ2lkJ107XG4gIFtEYXRlQ29udGV4dFF1ZXJ5UGFyYW1OYW1lcy5EQVRFX0NPTlRFWFRfUkVBTFRJTUVdPzogYm9vbGVhbjtcbiAgW0RhdGVDb250ZXh0UXVlcnlQYXJhbU5hbWVzLkRBVEVfQ09OVEVYVF9BR0dSRUdBVElPTl0/OiBhZ2dyZWdhdGlvblR5cGU7XG59O1xuXG4vKipcbiAqIE91dHB1dCBxdWVyeSBwYXJhbXMgaXMgYW4gb2JqZWN0IHJlcHJlc2VudGluZyBwYXJhbXMgdGhhdCBhcmUgYXBwbGllZCB0byBjdXJyZW50IFVSTCBpbiBicm93c2VyIGFkZHJlc3MgYmFyLlxuICogVGhlc2UgcGFyYW1zIGFyZSBzZXQgcHJvZ3JhbW1hdGljYWxseS5cbiAqIFRpbWUgY29udGV4dCBpbnRlcnZhbCBhbmQgdGltZSByYW5nZSBkZXNjcmliZWQgYnkgZGF0ZSBcImZyb21cIiBhbmQgZGF0ZSBcInRvXCIgZXhjbHVkZSBlYWNoIG90aGVyLlxuICovXG5leHBvcnQgdHlwZSBPdXRwdXREYXRlQ29udGV4dFF1ZXJ5UGFyYW1zID0gKFxuICB8IERhdGVDb250ZXh0RnJvbVRvUXVlcnlQYXJhbXNcbiAgfCBEYXRlQ29udGV4dEludGVydmFsUXVlcnlQYXJhbXNcbikgJiB7XG4gIFtEYXRlQ29udGV4dFF1ZXJ5UGFyYW1OYW1lcy5EQVRFX0NPTlRFWFRfUkVBTFRJTUVdOiBib29sZWFuO1xuICBbRGF0ZUNvbnRleHRRdWVyeVBhcmFtTmFtZXMuREFURV9DT05URVhUX0FHR1JFR0FUSU9OXTogYWdncmVnYXRpb25UeXBlO1xufTtcblxuY29uc3QgdG9kYXlEYXRlID0gbmV3IERhdGUoKTtcbmV4cG9ydCBlbnVtIFRpbWVTcGFuSW5NcyB7XG4gICdNSU5VVEUnID0gMTAwMCAqIDYwLFxuICAnSE9VUicgPSAxMDAwICogNjAgKiA2MCxcbiAgJ0RBWScgPSAxMDAwICogNjAgKiA2MCAqIDI0LFxuICAnV0VFSycgPSAxMDAwICogNjAgKiA2MCAqIDI0ICogNyxcbiAgJ01PTlRIJyA9IHRvZGF5RGF0ZS52YWx1ZU9mKCkgLSBuZXcgRGF0ZSh0b2RheURhdGUuc2V0TW9udGgodG9kYXlEYXRlLmdldE1vbnRoKCkgLSAxKSkudmFsdWVPZigpXG59XG5cbmV4cG9ydCB0eXBlIEludGVydmFsID0ge1xuICBpZDogJ21pbnV0ZXMnIHwgJ2hvdXJzJyB8ICdkYXlzJyB8ICd3ZWVrcycgfCAnbW9udGhzJyB8ICdjdXN0b20nO1xuICB0aXRsZTogc3RyaW5nO1xuICB0aW1lc3BhbkluTXM/OiBudW1iZXI7XG59O1xuXG5leHBvcnQgY29uc3QgSU5URVJWQUxTOiBJbnRlcnZhbFtdID0gW1xuICB7XG4gICAgaWQ6ICdtaW51dGVzJyxcbiAgICB0aXRsZTogZ2V0dGV4dCgnTGFzdCBtaW51dGUnKSxcbiAgICB0aW1lc3BhbkluTXM6IFRpbWVTcGFuSW5Ncy5NSU5VVEVcbiAgfSxcbiAge1xuICAgIGlkOiAnaG91cnMnLFxuICAgIHRpdGxlOiBnZXR0ZXh0KCdMYXN0IGhvdXInKSxcbiAgICB0aW1lc3BhbkluTXM6IFRpbWVTcGFuSW5Ncy5IT1VSXG4gIH0sXG4gIHtcbiAgICBpZDogJ2RheXMnLFxuICAgIHRpdGxlOiBnZXR0ZXh0KCdMYXN0IGRheScpLFxuICAgIHRpbWVzcGFuSW5NczogVGltZVNwYW5Jbk1zLkRBWVxuICB9LFxuICB7XG4gICAgaWQ6ICd3ZWVrcycsXG4gICAgdGl0bGU6IGdldHRleHQoJ0xhc3Qgd2VlaycpLFxuICAgIHRpbWVzcGFuSW5NczogVGltZVNwYW5Jbk1zLldFRUtcbiAgfSxcbiAge1xuICAgIGlkOiAnbW9udGhzJyxcbiAgICB0aXRsZTogZ2V0dGV4dCgnTGFzdCBtb250aCcpLFxuICAgIHRpbWVzcGFuSW5NczogVGltZVNwYW5Jbk1zLk1PTlRIXG4gIH0sXG4gIHsgaWQ6ICdjdXN0b20nLCB0aXRsZTogZ2V0dGV4dCgnQ3VzdG9tJykgfVxuXTtcblxuZXhwb3J0IGNvbnN0IElOVEVSVkFMX1RJVExFUzogUmVjb3JkPEludGVydmFsWydpZCddLCBzdHJpbmc+ID0ge1xuICBtaW51dGVzOiBnZXR0ZXh0KCdMYXN0IG1pbnV0ZScpLFxuICBob3VyczogZ2V0dGV4dCgnTGFzdCBob3VyJyksXG4gIGRheXM6IGdldHRleHQoJ0xhc3QgZGF5JyksXG4gIHdlZWtzOiBnZXR0ZXh0KCdMYXN0IHdlZWsnKSxcbiAgbW9udGhzOiBnZXR0ZXh0KCdMYXN0IG1vbnRoJyksXG4gIGN1c3RvbTogZ2V0dGV4dCgnQ3VzdG9tJylcbn07XG5cbmV4cG9ydCB0eXBlIEFnZ3JlZ2F0aW9uID0ge1xuICBpZDogYWdncmVnYXRpb25UeXBlIHwgbnVsbDtcbiAgdGl0bGU6IHN0cmluZztcbn07XG5cbmV4cG9ydCBjb25zdCBBR0dSRUdBVElPTlM6IEFnZ3JlZ2F0aW9uW10gPSBbXG4gIHsgaWQ6IG51bGwsIHRpdGxlOiBnZXR0ZXh0KCdOb25lJykgfSxcbiAgeyBpZDogYWdncmVnYXRpb25UeXBlLk1JTlVURUxZLCB0aXRsZTogZ2V0dGV4dCgnTWludXRlbHknKSB9LFxuICB7IGlkOiBhZ2dyZWdhdGlvblR5cGUuSE9VUkxZLCB0aXRsZTogZ2V0dGV4dCgnSG91cmx5JykgfSxcbiAgeyBpZDogYWdncmVnYXRpb25UeXBlLkRBSUxZLCB0aXRsZTogZ2V0dGV4dCgnRGFpbHknKSB9XG5dO1xuXG5leHBvcnQgY29uc3QgQUdHUkVHQVRJT05fTElNSVRTID0ge1xuICBNSU5VVEVMWV9MSU1JVDogVGltZVNwYW5Jbk1zLk1JTlVURSAqIDEwLFxuICBIT1VSTFlfTElNSVQ6IFRpbWVTcGFuSW5Ncy5EQVkgKiAxLFxuICBEQUlMWV9MSU1JVDogVGltZVNwYW5Jbk1zLkRBWSAqIDRcbn07XG5cbmV4cG9ydCBjb25zdCBBR0dSRUdBVElPTl9JQ09OUzogUmVjb3JkPGFnZ3JlZ2F0aW9uVHlwZSB8ICd1bmRlZmluZWQnLCBzdHJpbmc+ID0ge1xuICB1bmRlZmluZWQ6ICdsaW5lLWNoYXJ0JyxcbiAgTUlOVVRFTFk6ICdob3VyZ2xhc3MnLFxuICBIT1VSTFk6ICdjbG9jay1vJyxcbiAgREFJTFk6ICdjYWxlbmRhci1vJ1xufTtcblxuZXhwb3J0IGNvbnN0IEFHR1JFR0FUSU9OX1RFWFRTOiBSZWNvcmQ8YWdncmVnYXRpb25UeXBlIHwgJ3VuZGVmaW5lZCcgfCAnZGlzYWJsZWQnLCBzdHJpbmc+ID0ge1xuICBkaXNhYmxlZDogZ2V0dGV4dCgnTm8gYWdncmVnYXRpb24gd2l0aCByZWFsdGltZSBlbmFibGVkJyksXG4gIHVuZGVmaW5lZDogZ2V0dGV4dCgnTm8gYWdncmVnYXRpb24nKSxcbiAgTUlOVVRFTFk6IGdldHRleHQoJ01pbnV0ZWx5IGFnZ3JlZ2F0aW9uJyksXG4gIEhPVVJMWTogZ2V0dGV4dCgnSG91cmx5IGFnZ3JlZ2F0aW9uJyksXG4gIERBSUxZOiBnZXR0ZXh0KCdEYWlseSBhZ2dyZWdhdGlvbicpXG59O1xuXG5leHBvcnQgZW51bSBXaWRnZXRUaW1lQ29udGV4dEFjdGlvbkJhclByaW9yaXR5IHtcbiAgTk9ORSA9IDAsXG4gIExPVyA9IDEsXG4gIE1FRElVTSA9IDIsXG4gIEhJR0ggPSAzXG59XG4iXX0=
16
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2lkZ2V0LXRpbWUtY29udGV4dC5tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2NvcmUvZGFzaGJvYXJkL3dpZ2V0LXRpbWUtY29udGV4dC93aWRnZXQtdGltZS1jb250ZXh0Lm1vZGVsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQW1EQSxNQUFNLENBQU4sSUFBWSwwQkFNWDtBQU5ELFdBQVksMEJBQTBCO0lBQ3BDLG1FQUFxQyxDQUFBO0lBQ3JDLCtEQUFpQyxDQUFBO0lBQ2pDLDJFQUE2QyxDQUFBO0lBQzdDLDJFQUE2QyxDQUFBO0lBQzdDLGlGQUFtRCxDQUFBO0FBQ3JELENBQUMsRUFOVywwQkFBMEIsS0FBMUIsMEJBQTBCLFFBTXJDO0FBdUNELE1BQU0sQ0FBTixJQUFZLGtDQUtYO0FBTEQsV0FBWSxrQ0FBa0M7SUFDNUMsMkZBQVEsQ0FBQTtJQUNSLHlGQUFPLENBQUE7SUFDUCwrRkFBVSxDQUFBO0lBQ1YsMkZBQVEsQ0FBQTtBQUNWLENBQUMsRUFMVyxrQ0FBa0MsS0FBbEMsa0NBQWtDLFFBSzdDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW50ZXJ2YWwgfSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzL2ludGVydmFsLXBpY2tlcic7XG5pbXBvcnQgeyBEYXRlVGltZUNvbnRleHQgfSBmcm9tICcuLi93aWRnZXQtY2hhbmdlLWV2ZW50Lm1vZGVsJztcbmltcG9ydCB7IGFnZ3JlZ2F0aW9uVHlwZSB9IGZyb20gJ0BjOHkvY2xpZW50JztcblxuZXhwb3J0IHR5cGUgV2lkZ2V0RGlzcGxheVNldHRpbmdzID0ge1xuICAvKipcbiAgICogSWYgZW5hYmxlZCB0aGUgd2lkZ2V0IGlzIGJvdW5kIHRvIHRoZSBnbG9iYWwgdGltZSBjb250ZXh0LiBZb3UgY2FuIGxpc3RlbiB0byBuZ09uQ2hhbmdlcygpIGNoYW5nZSBkZXRlY3Rpb25cbiAgICogdG8gcmVhY3QgdG8gY2hhbmdlcyBvbiB0aGUgY29udGV4dC4gV2hlbiBhIG1vcmUgZGV0YWlsZWQgY29uZmlndXJhdGlvbiBpcyBuZWVkZWQsIHVzZSB0aGUgPGM4eS13aWRnZXQtdGltZS1jb250ZXh0PlxuICAgKiBjb21wb25lbnQgaW5zdGVhZC5cbiAgICovXG4gIGdsb2JhbFRpbWVDb250ZXh0PzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIElmIGVuYWJsZWQgdGhlIHdpZGdldCBpcyBib3VuZCB0byB0aGUgZ2xvYmFsIHJlYWx0aW1lIGNvbnRleHQuIFlvdSBjYW4gbGlzdGVuIHRvIG5nT25DaGFuZ2VzKCkgY2hhbmdlIGRldGVjdGlvblxuICAgKiB0byByZWFjdCB0byBjaGFuZ2VzIG9uIHRoZSBjb250ZXh0LlxuICAgKi9cbiAgZ2xvYmFsUmVhbHRpbWVDb250ZXh0PzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIElmIGVuYWJsZWQgdGhlIHdpZGdldCBpcyBib3VuZCB0byB0aGUgZ2xvYmFsIGFnZ3JlZ2F0aW9uIGNvbnRleHQuIFlvdSBjYW4gbGlzdGVuIHRvIG5nT25DaGFuZ2VzKCkgY2hhbmdlIGRldGVjdGlvblxuICAgKiB0byByZWFjdCB0byBjaGFuZ2VzIG9uIHRoZSBjb250ZXh0LlxuICAgKi9cbiAgZ2xvYmFsQWdncmVnYXRpb25Db250ZXh0PzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIElmIGVuYWJsZWQgdGhlIHdpZGdldCBpcyBib3VuZCB0byB0aGUgZ2xvYmFsIGF1dG8gcmVmcmVzaCBjb250ZXh0LiBZb3UgY2FuIGxpc3RlbiB0byBuZ09uQ2hhbmdlcygpIGNoYW5nZSBkZXRlY3Rpb25cbiAgICogdG8gcmVhY3QgdG8gY2hhbmdlcyBvbiB0aGUgY29udGV4dC4gV2hlbiBhIG1vcmUgZGV0YWlsZWQgY29uZmlndXJhdGlvbiBpcyBuZWVkZWQsIHVzZSB0aGUgV2lkZ2V0R2xvYmFsQXV0b1JlZnJlc2hTZXJ2aWNlXG4gICAqIHNlcnZpY2UgaW5zdGVhZC5cbiAgICovXG4gIGdsb2JhbEF1dG9SZWZyZXNoQ29udGV4dD86IGJvb2xlYW47XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIEdsb2JhbFRpbWVDb250ZXh0V2lkZ2V0Q29uZmlnIHtcbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiBpbnN0YW5jZSBvZiB3aWRnZXQgaXMgYm91bmQgdG8gZ2xvYmFsIGRhdGUgY29udGV4dC4gSXQgY2FuIGJlIG9ubHkgdXNlZCB3aXRoIHdpZGdldHMgd2hpY2hcbiAgICogZHluYW1pYyBjb21wb25lbnQgZGVmaW5pdGlvbiBjb250YWlucyBkaXNwbGF5U2V0dGluZ3MgYWxsb3dpbmcgdG8gdXNlIGl0IHdpdGggZ2xvYmFsIGRhdGUgY29udGV4dC5cbiAgICovXG4gIHdpZGdldEluc3RhbmNlR2xvYmFsVGltZUNvbnRleHQ/OiBib29sZWFuO1xuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHdpZGdldCB0aGF0IGlzIGJvdW5kIHRvIGdsb2JhbCBkYXRlIGNvbnRleHQgY2FuIGRlY291cGxlIGZyb20gaXQuIElmIHRoYXQgd2lkZ2V0IGlzIGRlY291cGxlZCwgaXQgaXNcbiAgICogdW5zdWJzY3JpYmVkIGZyb20gZ2xvYmFsIGRhdGUgY29udGV4dCB1cGRhdGVzIGFuZCBkYXRlIGNvbnRleHQgcmVsYXRlZCBjb250cm9scyBhcmUgZGlzcGxheWVkIG9uIHdpZGdldCB2aWV3LlxuICAgKi9cbiAgY2FuRGVjb3VwbGVHbG9iYWxUaW1lQ29udGV4dD86IGJvb2xlYW47XG59XG5cbmV4cG9ydCB0eXBlIFdpZGdldFRpbWVDb250ZXh0U3RhdGUgPSB7XG4gIGRhdGU6IERhdGVUaW1lQ29udGV4dDtcbiAgaW50ZXJ2YWw6IEludGVydmFsWydpZCddO1xuICByZWFsdGltZTogYm9vbGVhbjtcbiAgYWdncmVnYXRpb246IGFnZ3JlZ2F0aW9uVHlwZTtcbn07XG5cbmV4cG9ydCB0eXBlIFdpZGdldFRpbWVDb250ZXh0Q2hhbmdlID0gT21pdDxXaWRnZXRUaW1lQ29udGV4dFN0YXRlLCAnaW50ZXJ2YWwnPjtcblxuZXhwb3J0IGVudW0gRGF0ZUNvbnRleHRRdWVyeVBhcmFtTmFtZXMge1xuICBEQVRFX0NPTlRFWFRfRlJPTSA9ICdkYXRlQ29udGV4dEZyb20nLFxuICBEQVRFX0NPTlRFWFRfVE8gPSAnZGF0ZUNvbnRleHRUbycsXG4gIERBVEVfQ09OVEVYVF9JTlRFUlZBTCA9ICdkYXRlQ29udGV4dEludGVydmFsJyxcbiAgREFURV9DT05URVhUX1JFQUxUSU1FID0gJ2RhdGVDb250ZXh0UmVhbHRpbWUnLFxuICBEQVRFX0NPTlRFWFRfQUdHUkVHQVRJT04gPSAnZGF0ZUNvbnRleHRBZ2dyZWdhdGlvbidcbn1cblxudHlwZSBEYXRlQ29udGV4dEZyb21Ub1F1ZXJ5UGFyYW1zID0ge1xuICBbRGF0ZUNvbnRleHRRdWVyeVBhcmFtTmFtZXMuREFURV9DT05URVhUX0ZST01dOiBzdHJpbmc7XG4gIFtEYXRlQ29udGV4dFF1ZXJ5UGFyYW1OYW1lcy5EQVRFX0NPTlRFWFRfVE9dOiBzdHJpbmc7XG4gIFtEYXRlQ29udGV4dFF1ZXJ5UGFyYW1OYW1lcy5EQVRFX0NPTlRFWFRfSU5URVJWQUxdPzogbmV2ZXI7XG59O1xuXG50eXBlIERhdGVDb250ZXh0SW50ZXJ2YWxRdWVyeVBhcmFtcyA9IHtcbiAgW0RhdGVDb250ZXh0UXVlcnlQYXJhbU5hbWVzLkRBVEVfQ09OVEVYVF9GUk9NXT86IG5ldmVyO1xuICBbRGF0ZUNvbnRleHRRdWVyeVBhcmFtTmFtZXMuREFURV9DT05URVhUX1RPXT86IG5ldmVyO1xuICBbRGF0ZUNvbnRleHRRdWVyeVBhcmFtTmFtZXMuREFURV9DT05URVhUX0lOVEVSVkFMXTogSW50ZXJ2YWxbJ2lkJ107XG59O1xuXG4vKipcbiAqIElucHV0IHF1ZXJ5IHBhcmFtcyBpcyBhbiBvYmplY3QgcmVwcmVzZW50aW5nIGFsbCBwb3NzaWJsZSBxdWVyeSBwYXJhbXMgcmVsYXRlZCB0byB3aWRnZXQgdGltZSBjb250ZXh0LlxuICogSXQgY2FuIGJlIHByb3ZpZGVkIGJ5IHVzZXIgdHlwaW5nIHRoZW0gaW4gYnJvd3NlciBVUkwgYWRkcmVzcyBiYXIsIHNvIGFsbCBvZiB0aGVtIHNob3VsZCBiZSBjb25zaWRlcmVkLlxuICovXG5leHBvcnQgdHlwZSBJbnB1dERhdGVDb250ZXh0UXVlcnlQYXJhbXMgPSB7XG4gIFtEYXRlQ29udGV4dFF1ZXJ5UGFyYW1OYW1lcy5EQVRFX0NPTlRFWFRfRlJPTV0/OiBzdHJpbmc7XG4gIFtEYXRlQ29udGV4dFF1ZXJ5UGFyYW1OYW1lcy5EQVRFX0NPTlRFWFRfVE9dPzogc3RyaW5nO1xuICBbRGF0ZUNvbnRleHRRdWVyeVBhcmFtTmFtZXMuREFURV9DT05URVhUX0lOVEVSVkFMXT86IEludGVydmFsWydpZCddO1xuICBbRGF0ZUNvbnRleHRRdWVyeVBhcmFtTmFtZXMuREFURV9DT05URVhUX1JFQUxUSU1FXT86IGJvb2xlYW47XG4gIFtEYXRlQ29udGV4dFF1ZXJ5UGFyYW1OYW1lcy5EQVRFX0NPTlRFWFRfQUdHUkVHQVRJT05dPzogYWdncmVnYXRpb25UeXBlO1xufTtcblxuLyoqXG4gKiBPdXRwdXQgcXVlcnkgcGFyYW1zIGlzIGFuIG9iamVjdCByZXByZXNlbnRpbmcgcGFyYW1zIHRoYXQgYXJlIGFwcGxpZWQgdG8gY3VycmVudCBVUkwgaW4gYnJvd3NlciBhZGRyZXNzIGJhci5cbiAqIFRoZXNlIHBhcmFtcyBhcmUgc2V0IHByb2dyYW1tYXRpY2FsbHkuXG4gKiBUaW1lIGNvbnRleHQgaW50ZXJ2YWwgYW5kIHRpbWUgcmFuZ2UgZGVzY3JpYmVkIGJ5IGRhdGUgXCJmcm9tXCIgYW5kIGRhdGUgXCJ0b1wiIGV4Y2x1ZGUgZWFjaCBvdGhlci5cbiAqL1xuZXhwb3J0IHR5cGUgT3V0cHV0RGF0ZUNvbnRleHRRdWVyeVBhcmFtcyA9IChcbiAgfCBEYXRlQ29udGV4dEZyb21Ub1F1ZXJ5UGFyYW1zXG4gIHwgRGF0ZUNvbnRleHRJbnRlcnZhbFF1ZXJ5UGFyYW1zXG4pICYge1xuICBbRGF0ZUNvbnRleHRRdWVyeVBhcmFtTmFtZXMuREFURV9DT05URVhUX1JFQUxUSU1FXTogYm9vbGVhbjtcbiAgW0RhdGVDb250ZXh0UXVlcnlQYXJhbU5hbWVzLkRBVEVfQ09OVEVYVF9BR0dSRUdBVElPTl06IGFnZ3JlZ2F0aW9uVHlwZTtcbn07XG5cbmV4cG9ydCBlbnVtIFdpZGdldFRpbWVDb250ZXh0QWN0aW9uQmFyUHJpb3JpdHkge1xuICBOT05FID0gMCxcbiAgTE9XID0gMSxcbiAgTUVESVVNID0gMixcbiAgSElHSCA9IDNcbn1cbiJdfQ==