@c8y/ngx-components 1021.51.1 → 1021.54.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (252) hide show
  1. package/alarm-event-selector/alarm-event-attributes-form/alarm-event-attributes-form.component.d.ts +10 -2
  2. package/alarm-event-selector/alarm-event-attributes-form/alarm-event-attributes-form.component.d.ts.map +1 -1
  3. package/alarm-event-selector/alarm-event-attributes-form/alarm-event-attributes-form.model.d.ts +11 -0
  4. package/alarm-event-selector/alarm-event-attributes-form/alarm-event-attributes-form.model.d.ts.map +1 -0
  5. package/alarm-event-selector/alarm-event-selection-list/alarm-event-selection-list.component.d.ts +10 -4
  6. package/alarm-event-selector/alarm-event-selection-list/alarm-event-selection-list.component.d.ts.map +1 -1
  7. package/alarm-event-selector/alarm-event-selector-list-item/alarm-event-selector-list-item.component.d.ts +3 -1
  8. package/alarm-event-selector/alarm-event-selector-list-item/alarm-event-selector-list-item.component.d.ts.map +1 -1
  9. package/alarm-event-selector/alarm-event-selector.model.d.ts +7 -0
  10. package/alarm-event-selector/alarm-event-selector.model.d.ts.map +1 -1
  11. package/core/dashboard/dashboard-child-action.component.d.ts +1 -1
  12. package/core/dashboard/dashboard-child-action.component.d.ts.map +1 -1
  13. package/core/dashboard/dashboard.module.d.ts +29 -29
  14. package/core/dashboard/index.d.ts +3 -0
  15. package/core/dashboard/index.d.ts.map +1 -1
  16. package/core/dashboard/widgets-dashboard.component.d.ts +1 -1
  17. package/core/dashboard/widgets-dashboard.component.d.ts.map +1 -1
  18. package/core/dashboard/wiget-time-context/aggregation-picker/aggregation-picker.component.d.ts +1 -1
  19. package/core/dashboard/wiget-time-context/aggregation-picker/aggregation-picker.component.d.ts.map +1 -1
  20. package/core/dashboard/wiget-time-context/realtime-control/realtime-control.component.d.ts +1 -1
  21. package/core/dashboard/wiget-time-context/realtime-control/realtime-control.component.d.ts.map +1 -1
  22. package/core/dashboard/wiget-time-context/widget-time-context-date-range.service.d.ts +10 -0
  23. package/core/dashboard/wiget-time-context/widget-time-context-date-range.service.d.ts.map +1 -0
  24. package/core/dashboard/wiget-time-context/widget-time-context.component.d.ts +7 -4
  25. package/core/dashboard/wiget-time-context/widget-time-context.component.d.ts.map +1 -1
  26. package/core/dashboard/wiget-time-context/widget-time-context.model.d.ts +0 -1
  27. package/core/dashboard/wiget-time-context/widget-time-context.model.d.ts.map +1 -1
  28. package/core/date-picker/date-picker.component.d.ts +1 -1
  29. package/core/date-picker/date-picker.component.d.ts.map +1 -1
  30. package/core/date-picker/date-picker.module.d.ts +9 -9
  31. package/core/date-time-picker/close-date-picker.directive.d.ts +1 -1
  32. package/core/date-time-picker/close-date-picker.directive.d.ts.map +1 -1
  33. package/core/date-time-picker/date-time-picker.component.d.ts +6 -3
  34. package/core/date-time-picker/date-time-picker.component.d.ts.map +1 -1
  35. package/core/date-time-picker/date-time-picker.module.d.ts +11 -11
  36. package/core/date-time-picker/date-time-picker.module.d.ts.map +1 -1
  37. package/core/forms/forms.module.d.ts +18 -18
  38. package/core/forms/required-input-placeholder.directive.d.ts +1 -1
  39. package/core/forms/required-input-placeholder.directive.d.ts.map +1 -1
  40. package/core/router/router.service.d.ts.map +1 -1
  41. package/core/user/user-menu.service.d.ts +36 -11
  42. package/core/user/user-menu.service.d.ts.map +1 -1
  43. package/datapoint-explorer/c8y-ngx-components-datapoint-explorer.d.ts.map +1 -0
  44. package/datapoint-explorer/datapoint-explorer.module.d.ts +7 -0
  45. package/datapoint-explorer/datapoint-explorer.module.d.ts.map +1 -0
  46. package/datapoint-explorer/index.d.ts +2 -0
  47. package/datapoint-explorer/index.d.ts.map +1 -0
  48. package/datapoint-explorer/view/c8y-ngx-components-datapoint-explorer-view.d.ts.map +1 -0
  49. package/datapoint-explorer/view/configuration/naming-dictionary.d.ts +3 -0
  50. package/datapoint-explorer/view/configuration/naming-dictionary.d.ts.map +1 -0
  51. package/datapoint-explorer/view/configuration/workspace-configuration.component.d.ts +38 -0
  52. package/datapoint-explorer/view/configuration/workspace-configuration.component.d.ts.map +1 -0
  53. package/datapoint-explorer/view/configuration/workspace-configuration.model.d.ts +7 -0
  54. package/datapoint-explorer/view/configuration/workspace-configuration.model.d.ts.map +1 -0
  55. package/datapoint-explorer/view/configuration/workspace-configuration.service.d.ts +15 -0
  56. package/datapoint-explorer/view/configuration/workspace-configuration.service.d.ts.map +1 -0
  57. package/datapoint-explorer/view/create-new-report-modal/create-new-report-modal.component.d.ts +25 -0
  58. package/datapoint-explorer/view/create-new-report-modal/create-new-report-modal.component.d.ts.map +1 -0
  59. package/datapoint-explorer/view/datapoint-explorer.component.d.ts +67 -0
  60. package/datapoint-explorer/view/datapoint-explorer.component.d.ts.map +1 -0
  61. package/datapoint-explorer/view/datapoint-explorer.service.d.ts +9 -0
  62. package/datapoint-explorer/view/datapoint-explorer.service.d.ts.map +1 -0
  63. package/datapoint-explorer/view/index.d.ts +2 -0
  64. package/datapoint-explorer/view/index.d.ts.map +1 -0
  65. package/datapoint-explorer/view/send-as-widget-to-report-modal/send-as-widget-to-report-modal.component.d.ts +23 -0
  66. package/datapoint-explorer/view/send-as-widget-to-report-modal/send-as-widget-to-report-modal.component.d.ts.map +1 -0
  67. package/echart/c8y-ngx-components-echart.d.ts.map +1 -0
  68. package/echart/chart-alerts/chart-alerts.component.d.ts +8 -0
  69. package/echart/chart-alerts/chart-alerts.component.d.ts.map +1 -0
  70. package/echart/charts.component.d.ts +63 -0
  71. package/echart/charts.component.d.ts.map +1 -0
  72. package/echart/index.d.ts +5 -0
  73. package/echart/index.d.ts.map +1 -0
  74. package/echart/models/c8y-ngx-components-echart-models.d.ts.map +1 -0
  75. package/echart/models/chart.model.d.ts +37 -0
  76. package/echart/models/chart.model.d.ts.map +1 -0
  77. package/echart/models/datapoints-graph-widget.model.d.ts +126 -0
  78. package/echart/models/datapoints-graph-widget.model.d.ts.map +1 -0
  79. package/echart/models/index.d.ts +4 -0
  80. package/echart/models/index.d.ts.map +1 -0
  81. package/echart/models/svg-icons.model.d.ts +22 -0
  82. package/echart/models/svg-icons.model.d.ts.map +1 -0
  83. package/echart/services/chart-alarms.service.d.ts +17 -0
  84. package/echart/services/chart-alarms.service.d.ts.map +1 -0
  85. package/echart/services/chart-events.service.d.ts +17 -0
  86. package/echart/services/chart-events.service.d.ts.map +1 -0
  87. package/echart/services/chart-realtime.service.d.ts +35 -0
  88. package/echart/services/chart-realtime.service.d.ts.map +1 -0
  89. package/echart/services/chart-types.service.d.ts +15 -0
  90. package/echart/services/chart-types.service.d.ts.map +1 -0
  91. package/echart/services/custom-measurements.service.d.ts +12 -0
  92. package/echart/services/custom-measurements.service.d.ts.map +1 -0
  93. package/echart/services/echarts-options.service.d.ts +143 -0
  94. package/echart/services/echarts-options.service.d.ts.map +1 -0
  95. package/echart/services/y-axis.service.d.ts +17 -0
  96. package/echart/services/y-axis.service.d.ts.map +1 -0
  97. package/esm2022/alarm-event-selector/alarm-event-attributes-form/alarm-event-attributes-form.component.mjs +37 -12
  98. package/esm2022/alarm-event-selector/alarm-event-attributes-form/alarm-event-attributes-form.model.mjs +2 -0
  99. package/esm2022/alarm-event-selector/alarm-event-selection-list/alarm-event-selection-list.component.mjs +39 -12
  100. package/esm2022/alarm-event-selector/alarm-event-selector-list-item/alarm-event-selector-list-item.component.mjs +6 -4
  101. package/esm2022/alarm-event-selector/alarm-event-selector.component.mjs +1 -1
  102. package/esm2022/alarm-event-selector/alarm-event-selector.model.mjs +1 -1
  103. package/esm2022/alarm-event-selector/custom-alarm-event-form/custom-alarm-event-form.component.mjs +1 -1
  104. package/esm2022/alarms/alarms-filter.component.mjs +3 -3
  105. package/esm2022/core/dashboard/dashboard-child-action.component.mjs +3 -3
  106. package/esm2022/core/dashboard/dashboard.module.mjs +17 -14
  107. package/esm2022/core/dashboard/index.mjs +4 -1
  108. package/esm2022/core/dashboard/widgets-dashboard.component.mjs +9 -9
  109. package/esm2022/core/dashboard/wiget-time-context/aggregation-picker/aggregation-picker.component.mjs +11 -9
  110. package/esm2022/core/dashboard/wiget-time-context/realtime-control/realtime-control.component.mjs +8 -7
  111. package/esm2022/core/dashboard/wiget-time-context/widget-time-context-date-range.service.mjs +23 -0
  112. package/esm2022/core/dashboard/wiget-time-context/widget-time-context.component.mjs +70 -26
  113. package/esm2022/core/dashboard/wiget-time-context/widget-time-context.model.mjs +1 -1
  114. package/esm2022/core/date-picker/date-picker.component.mjs +29 -14
  115. package/esm2022/core/date-picker/date-picker.module.mjs +9 -7
  116. package/esm2022/core/date-time-picker/close-date-picker.directive.mjs +4 -3
  117. package/esm2022/core/date-time-picker/date-time-picker.component.mjs +57 -29
  118. package/esm2022/core/date-time-picker/date-time-picker.module.mjs +11 -7
  119. package/esm2022/core/forms/forms.module.mjs +3 -3
  120. package/esm2022/core/forms/ip-range-input-list.component.mjs +5 -5
  121. package/esm2022/core/forms/required-input-placeholder.directive.mjs +4 -3
  122. package/esm2022/core/router/router.service.mjs +1 -1
  123. package/esm2022/core/user/user-menu.service.mjs +57 -17
  124. package/esm2022/datapoint-explorer/c8y-ngx-components-datapoint-explorer.mjs +5 -0
  125. package/esm2022/datapoint-explorer/datapoint-explorer.module.mjs +65 -0
  126. package/esm2022/datapoint-explorer/index.mjs +2 -0
  127. package/esm2022/datapoint-explorer/view/c8y-ngx-components-datapoint-explorer-view.mjs +5 -0
  128. package/esm2022/datapoint-explorer/view/configuration/naming-dictionary.mjs +65 -0
  129. package/esm2022/datapoint-explorer/view/configuration/workspace-configuration.component.mjs +169 -0
  130. package/esm2022/datapoint-explorer/view/configuration/workspace-configuration.model.mjs +2 -0
  131. package/esm2022/datapoint-explorer/view/configuration/workspace-configuration.service.mjs +40 -0
  132. package/esm2022/datapoint-explorer/view/create-new-report-modal/create-new-report-modal.component.mjs +64 -0
  133. package/esm2022/datapoint-explorer/view/datapoint-explorer.component.mjs +279 -0
  134. package/esm2022/datapoint-explorer/view/datapoint-explorer.service.mjs +23 -0
  135. package/esm2022/datapoint-explorer/view/index.mjs +2 -0
  136. package/esm2022/datapoint-explorer/view/send-as-widget-to-report-modal/send-as-widget-to-report-modal.component.mjs +48 -0
  137. package/esm2022/datapoint-selector/datapoint-attributes-form/datapoint-attributes-form.component.mjs +3 -3
  138. package/esm2022/datapoint-selector/datapoint-selector-list-item/datapoint-selector-list-item.component.mjs +3 -3
  139. 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 +3 -3
  140. package/esm2022/datapoints-export-selector/datapoints-export-selector.component.mjs +3 -3
  141. package/esm2022/device-list/add-smart-group.component.mjs +3 -3
  142. package/esm2022/echart/c8y-ngx-components-echart.mjs +5 -0
  143. package/esm2022/echart/chart-alerts/chart-alerts.component.mjs +16 -0
  144. package/esm2022/echart/charts.component.mjs +560 -0
  145. package/esm2022/echart/index.mjs +5 -0
  146. package/esm2022/echart/models/c8y-ngx-components-echart-models.mjs +5 -0
  147. package/esm2022/echart/models/chart.model.mjs +2 -0
  148. package/esm2022/echart/models/datapoints-graph-widget.model.mjs +17 -0
  149. package/esm2022/echart/models/index.mjs +4 -0
  150. package/esm2022/echart/models/svg-icons.model.mjs +22 -0
  151. package/esm2022/echart/services/chart-alarms.service.mjs +58 -0
  152. package/esm2022/echart/services/chart-events.service.mjs +44 -0
  153. package/esm2022/echart/services/chart-realtime.service.mjs +193 -0
  154. package/esm2022/echart/services/chart-types.service.mjs +102 -0
  155. package/esm2022/echart/services/custom-measurements.service.mjs +52 -0
  156. package/esm2022/echart/services/echarts-options.service.mjs +857 -0
  157. package/esm2022/echart/services/y-axis.service.mjs +150 -0
  158. package/esm2022/icon-selector/icons/platform/index.mjs +10 -8
  159. package/esm2022/interval-picker/interval-picker.component.mjs +3 -3
  160. package/esm2022/interval-picker/interval-picker.model.mjs +1 -1
  161. package/esm2022/report-dashboard/index.mjs +2 -1
  162. package/esm2022/time-context/c8y-ngx-components-time-context.mjs +5 -0
  163. package/esm2022/time-context/index.mjs +2 -0
  164. package/esm2022/time-context/time-context.component.mjs +217 -0
  165. package/esm2022/time-context/time-context.service.mjs +83 -0
  166. package/esm2022/translation-editor/lazy/translation-editor/translation-editor.component.mjs +6 -5
  167. package/esm2022/widgets/cockpit-exports/index.mjs +8 -1
  168. package/esm2022/widgets/definitions/datapoints-graph/c8y-ngx-components-widgets-definitions-datapoints-graph.mjs +5 -0
  169. package/esm2022/widgets/definitions/datapoints-graph/index.mjs +31 -0
  170. package/esm2022/widgets/definitions/index.mjs +3 -2
  171. package/esm2022/widgets/implementations/datapoints-graph/c8y-ngx-components-widgets-implementations-datapoints-graph.mjs +5 -0
  172. package/esm2022/widgets/implementations/datapoints-graph/datapoints-graph-config/datapoints-graph-widget-config.component.mjs +239 -0
  173. package/esm2022/widgets/implementations/datapoints-graph/datapoints-graph-view/datapoints-graph-widget-view.component.mjs +241 -0
  174. package/esm2022/widgets/implementations/datapoints-graph/index.mjs +3 -0
  175. package/fesm2022/c8y-ngx-components-alarm-event-selector.mjs +80 -28
  176. package/fesm2022/c8y-ngx-components-alarm-event-selector.mjs.map +1 -1
  177. package/fesm2022/c8y-ngx-components-alarms.mjs +2 -2
  178. package/fesm2022/c8y-ngx-components-alarms.mjs.map +1 -1
  179. package/fesm2022/c8y-ngx-components-datapoint-explorer-view.mjs +658 -0
  180. package/fesm2022/c8y-ngx-components-datapoint-explorer-view.mjs.map +1 -0
  181. package/fesm2022/c8y-ngx-components-datapoint-explorer.mjs +72 -0
  182. package/fesm2022/c8y-ngx-components-datapoint-explorer.mjs.map +1 -0
  183. package/fesm2022/c8y-ngx-components-datapoint-selector.mjs +4 -4
  184. package/fesm2022/c8y-ngx-components-datapoint-selector.mjs.map +1 -1
  185. package/fesm2022/c8y-ngx-components-datapoints-export-selector.mjs +4 -4
  186. package/fesm2022/c8y-ngx-components-datapoints-export-selector.mjs.map +1 -1
  187. package/fesm2022/c8y-ngx-components-device-list.mjs +2 -2
  188. package/fesm2022/c8y-ngx-components-device-list.mjs.map +1 -1
  189. package/fesm2022/c8y-ngx-components-echart-models.mjs +46 -0
  190. package/fesm2022/c8y-ngx-components-echart-models.mjs.map +1 -0
  191. package/fesm2022/c8y-ngx-components-echart.mjs +2023 -0
  192. package/fesm2022/c8y-ngx-components-echart.mjs.map +1 -0
  193. package/fesm2022/c8y-ngx-components-icon-selector-icons-platform.mjs +9 -7
  194. package/fesm2022/c8y-ngx-components-icon-selector-icons-platform.mjs.map +1 -1
  195. package/fesm2022/c8y-ngx-components-interval-picker.mjs +2 -2
  196. package/fesm2022/c8y-ngx-components-interval-picker.mjs.map +1 -1
  197. package/fesm2022/c8y-ngx-components-report-dashboard.mjs +1 -1
  198. package/fesm2022/c8y-ngx-components-time-context.mjs +300 -0
  199. package/fesm2022/c8y-ngx-components-time-context.mjs.map +1 -0
  200. package/fesm2022/c8y-ngx-components-translation-editor-lazy.mjs +5 -4
  201. package/fesm2022/c8y-ngx-components-translation-editor-lazy.mjs.map +1 -1
  202. package/fesm2022/c8y-ngx-components-widgets-cockpit-exports.mjs +7 -0
  203. package/fesm2022/c8y-ngx-components-widgets-cockpit-exports.mjs.map +1 -1
  204. package/fesm2022/c8y-ngx-components-widgets-definitions-datapoints-graph.mjs +38 -0
  205. package/fesm2022/c8y-ngx-components-widgets-definitions-datapoints-graph.mjs.map +1 -0
  206. package/fesm2022/c8y-ngx-components-widgets-definitions.mjs +2 -1
  207. package/fesm2022/c8y-ngx-components-widgets-definitions.mjs.map +1 -1
  208. package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-graph.mjs +467 -0
  209. package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-graph.mjs.map +1 -0
  210. package/fesm2022/c8y-ngx-components.mjs +429 -277
  211. package/fesm2022/c8y-ngx-components.mjs.map +1 -1
  212. package/icon-selector/icons/index.d.ts +1 -1
  213. package/icon-selector/icons/platform/index.d.ts +2 -2
  214. package/icon-selector/icons/platform/index.d.ts.map +1 -1
  215. package/interval-picker/interval-picker.component.d.ts.map +1 -1
  216. package/interval-picker/interval-picker.model.d.ts.map +1 -1
  217. package/locales/de.po +206 -279
  218. package/locales/es.po +206 -279
  219. package/locales/fr.po +206 -279
  220. package/locales/ja_JP.po +196 -279
  221. package/locales/ko.po +455 -444
  222. package/locales/locales.pot +190 -272
  223. package/locales/nl.po +206 -279
  224. package/locales/pl.po +206 -279
  225. package/locales/pt_BR.po +206 -279
  226. package/locales/zh_CN.po +450 -443
  227. package/locales/zh_TW.po +452 -445
  228. package/package.json +1 -1
  229. package/report-dashboard/index.d.ts +1 -0
  230. package/report-dashboard/index.d.ts.map +1 -1
  231. package/time-context/c8y-ngx-components-time-context.d.ts.map +1 -0
  232. package/time-context/index.d.ts +2 -0
  233. package/time-context/index.d.ts.map +1 -0
  234. package/time-context/time-context.component.d.ts +61 -0
  235. package/time-context/time-context.component.d.ts.map +1 -0
  236. package/time-context/time-context.service.d.ts +25 -0
  237. package/time-context/time-context.service.d.ts.map +1 -0
  238. package/translation-editor/lazy/translation-editor/translation-editor.component.d.ts.map +1 -1
  239. package/widgets/cockpit-exports/index.d.ts +6 -0
  240. package/widgets/cockpit-exports/index.d.ts.map +1 -1
  241. package/widgets/definitions/datapoints-graph/c8y-ngx-components-widgets-definitions-datapoints-graph.d.ts.map +1 -0
  242. package/widgets/definitions/datapoints-graph/index.d.ts +16 -0
  243. package/widgets/definitions/datapoints-graph/index.d.ts.map +1 -0
  244. package/widgets/definitions/index.d.ts +1 -0
  245. package/widgets/definitions/index.d.ts.map +1 -1
  246. package/widgets/implementations/datapoints-graph/c8y-ngx-components-widgets-implementations-datapoints-graph.d.ts.map +1 -0
  247. package/widgets/implementations/datapoints-graph/datapoints-graph-config/datapoints-graph-widget-config.component.d.ts +43 -0
  248. package/widgets/implementations/datapoints-graph/datapoints-graph-config/datapoints-graph-widget-config.component.d.ts.map +1 -0
  249. package/widgets/implementations/datapoints-graph/datapoints-graph-view/datapoints-graph-widget-view.component.d.ts +54 -0
  250. package/widgets/implementations/datapoints-graph/datapoints-graph-view/datapoints-graph-widget-view.component.d.ts.map +1 -0
  251. package/widgets/implementations/datapoints-graph/index.d.ts +3 -0
  252. package/widgets/implementations/datapoints-graph/index.d.ts.map +1 -0
@@ -0,0 +1,31 @@
1
+ import { DynamicDatapointsResolver, gettext, hookWidget } from '@c8y/ngx-components';
2
+ import { defaultWidgetIds } from '@c8y/ngx-components/widgets/definitions';
3
+ export const datapointGraphWidgetDefinition = {
4
+ id: defaultWidgetIds.DATAPOINTS_GRAPH,
5
+ label: gettext('Data points graph "new"'),
6
+ description: gettext('Displays a graph of selected datapoints'),
7
+ loadComponent: () => import('@c8y/ngx-components/widgets/implementations/datapoints-graph').then(m => m.DatapointsGraphWidgetViewComponent),
8
+ loadConfigComponent: () => import('@c8y/ngx-components/widgets/implementations/datapoints-graph').then(m => m.DatapointsGraphWidgetConfigComponent),
9
+ previewImage: 'c8y-style-assets/datapoints-graph-widget.png',
10
+ resolve: {
11
+ datapoints: DynamicDatapointsResolver
12
+ },
13
+ data: {
14
+ settings: {
15
+ noNewWidgets: false,
16
+ widgetDefaults: {
17
+ _width: 8,
18
+ _height: 4
19
+ },
20
+ noDeviceTarget: true,
21
+ groupsSelectable: false
22
+ },
23
+ displaySettings: {
24
+ globalTimeContext: true,
25
+ globalAggregationContext: true,
26
+ globalRealtimeContext: true
27
+ }
28
+ }
29
+ };
30
+ export const datapointGraphWidgetproviders = [hookWidget(datapointGraphWidgetDefinition)];
31
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi93aWRnZXRzL2RlZmluaXRpb25zL2RhdGFwb2ludHMtZ3JhcGgvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNyRixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUUzRSxNQUFNLENBQUMsTUFBTSw4QkFBOEIsR0FBRztJQUM1QyxFQUFFLEVBQUUsZ0JBQWdCLENBQUMsZ0JBQWdCO0lBQ3JDLEtBQUssRUFBRSxPQUFPLENBQUMseUJBQXlCLENBQUM7SUFDekMsV0FBVyxFQUFFLE9BQU8sQ0FBQyx5Q0FBeUMsQ0FBQztJQUMvRCxhQUFhLEVBQUUsR0FBRyxFQUFFLENBQ2xCLE1BQU0sQ0FBQyw4REFBOEQsQ0FBQyxDQUFDLElBQUksQ0FDekUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsa0NBQWtDLENBQzFDO0lBQ0gsbUJBQW1CLEVBQUUsR0FBRyxFQUFFLENBQ3hCLE1BQU0sQ0FBQyw4REFBOEQsQ0FBQyxDQUFDLElBQUksQ0FDekUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsb0NBQW9DLENBQzVDO0lBQ0gsWUFBWSxFQUFFLDhDQUE4QztJQUM1RCxPQUFPLEVBQUU7UUFDUCxVQUFVLEVBQUUseUJBQXlCO0tBQ3RDO0lBQ0QsSUFBSSxFQUFFO1FBQ0osUUFBUSxFQUFFO1lBQ1IsWUFBWSxFQUFFLEtBQUs7WUFDbkIsY0FBYyxFQUFFO2dCQUNkLE1BQU0sRUFBRSxDQUFDO2dCQUNULE9BQU8sRUFBRSxDQUFDO2FBQ1g7WUFDRCxjQUFjLEVBQUUsSUFBSTtZQUNwQixnQkFBZ0IsRUFBRSxLQUFLO1NBQ3hCO1FBQ0QsZUFBZSxFQUFFO1lBQ2YsaUJBQWlCLEVBQUUsSUFBSTtZQUN2Qix3QkFBd0IsRUFBRSxJQUFJO1lBQzlCLHFCQUFxQixFQUFFLElBQUk7U0FDNUI7S0FDcUI7Q0FDUyxDQUFDO0FBRXBDLE1BQU0sQ0FBQyxNQUFNLDZCQUE2QixHQUFHLENBQUMsVUFBVSxDQUFDLDhCQUE4QixDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgQ29udGV4dFdpZGdldENvbmZpZyB9IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMvY29udGV4dC1kYXNoYm9hcmQnO1xuaW1wb3J0IHR5cGUgeyBEeW5hbWljV2lkZ2V0RGVmaW5pdGlvbiB9IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMnO1xuaW1wb3J0IHsgRHluYW1pY0RhdGFwb2ludHNSZXNvbHZlciwgZ2V0dGV4dCwgaG9va1dpZGdldCB9IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMnO1xuaW1wb3J0IHsgZGVmYXVsdFdpZGdldElkcyB9IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMvd2lkZ2V0cy9kZWZpbml0aW9ucyc7XG5cbmV4cG9ydCBjb25zdCBkYXRhcG9pbnRHcmFwaFdpZGdldERlZmluaXRpb24gPSB7XG4gIGlkOiBkZWZhdWx0V2lkZ2V0SWRzLkRBVEFQT0lOVFNfR1JBUEgsXG4gIGxhYmVsOiBnZXR0ZXh0KCdEYXRhIHBvaW50cyBncmFwaCBcIm5ld1wiJyksXG4gIGRlc2NyaXB0aW9uOiBnZXR0ZXh0KCdEaXNwbGF5cyBhIGdyYXBoIG9mIHNlbGVjdGVkIGRhdGFwb2ludHMnKSxcbiAgbG9hZENvbXBvbmVudDogKCkgPT5cbiAgICBpbXBvcnQoJ0BjOHkvbmd4LWNvbXBvbmVudHMvd2lkZ2V0cy9pbXBsZW1lbnRhdGlvbnMvZGF0YXBvaW50cy1ncmFwaCcpLnRoZW4oXG4gICAgICBtID0+IG0uRGF0YXBvaW50c0dyYXBoV2lkZ2V0Vmlld0NvbXBvbmVudFxuICAgICksXG4gIGxvYWRDb25maWdDb21wb25lbnQ6ICgpID0+XG4gICAgaW1wb3J0KCdAYzh5L25neC1jb21wb25lbnRzL3dpZGdldHMvaW1wbGVtZW50YXRpb25zL2RhdGFwb2ludHMtZ3JhcGgnKS50aGVuKFxuICAgICAgbSA9PiBtLkRhdGFwb2ludHNHcmFwaFdpZGdldENvbmZpZ0NvbXBvbmVudFxuICAgICksXG4gIHByZXZpZXdJbWFnZTogJ2M4eS1zdHlsZS1hc3NldHMvZGF0YXBvaW50cy1ncmFwaC13aWRnZXQucG5nJyxcbiAgcmVzb2x2ZToge1xuICAgIGRhdGFwb2ludHM6IER5bmFtaWNEYXRhcG9pbnRzUmVzb2x2ZXJcbiAgfSxcbiAgZGF0YToge1xuICAgIHNldHRpbmdzOiB7XG4gICAgICBub05ld1dpZGdldHM6IGZhbHNlLFxuICAgICAgd2lkZ2V0RGVmYXVsdHM6IHtcbiAgICAgICAgX3dpZHRoOiA4LFxuICAgICAgICBfaGVpZ2h0OiA0XG4gICAgICB9LFxuICAgICAgbm9EZXZpY2VUYXJnZXQ6IHRydWUsXG4gICAgICBncm91cHNTZWxlY3RhYmxlOiBmYWxzZVxuICAgIH0sXG4gICAgZGlzcGxheVNldHRpbmdzOiB7XG4gICAgICBnbG9iYWxUaW1lQ29udGV4dDogdHJ1ZSxcbiAgICAgIGdsb2JhbEFnZ3JlZ2F0aW9uQ29udGV4dDogdHJ1ZSxcbiAgICAgIGdsb2JhbFJlYWx0aW1lQ29udGV4dDogdHJ1ZVxuICAgIH1cbiAgfSBhcyBDb250ZXh0V2lkZ2V0Q29uZmlnXG59IHNhdGlzZmllcyBEeW5hbWljV2lkZ2V0RGVmaW5pdGlvbjtcblxuZXhwb3J0IGNvbnN0IGRhdGFwb2ludEdyYXBoV2lkZ2V0cHJvdmlkZXJzID0gW2hvb2tXaWRnZXQoZGF0YXBvaW50R3JhcGhXaWRnZXREZWZpbml0aW9uKV07XG4iXX0=
@@ -17,6 +17,7 @@ export const defaultWidgetIds = {
17
17
  ALL_CRITICAL_ALARMS: 'Asset Alarms',
18
18
  RECENT_ALARMS: 'Recent Alarms',
19
19
  LINEAR_GAUGE: 'KPI Linear Gauge',
20
- SILO: 'KPI Silo'
20
+ SILO: 'KPI Silo',
21
+ DATAPOINTS_GRAPH: 'Data points graph 2'
21
22
  };
22
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi93aWRnZXRzL2RlZmluaXRpb25zL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHO0lBQzlCLFlBQVksRUFBRSxjQUFjO0lBQzVCLFdBQVcsRUFBRSxhQUFhO0lBQzFCLHNCQUFzQixFQUFFLGlCQUFpQjtJQUN6QyxlQUFlLEVBQUUsd0JBQXdCO0lBQ3pDLGlCQUFpQixFQUFFLG1CQUFtQjtJQUN0Qyx5QkFBeUIsRUFBRSxpQ0FBaUM7SUFDNUQsS0FBSyxFQUFFLE9BQU87SUFDZCxHQUFHLEVBQUUsWUFBWTtJQUNqQixRQUFRLEVBQUUsVUFBVTtJQUNwQixnQkFBZ0IsRUFBRSxnQkFBZ0I7SUFDbEMsZ0JBQWdCLEVBQUUsWUFBWTtJQUM5QixHQUFHLEVBQUUsS0FBSztJQUNWLDZCQUE2QixFQUFFLDRCQUE0QjtJQUMzRCxVQUFVLEVBQUUsV0FBVztJQUN2QixVQUFVLEVBQUUsWUFBWTtJQUN4QixtQkFBbUIsRUFBRSxjQUFjO0lBQ25DLGFBQWEsRUFBRSxlQUFlO0lBQzlCLFlBQVksRUFBRSxrQkFBa0I7SUFDaEMsSUFBSSxFQUFFLFVBQVU7Q0FDUixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNvbnN0IGRlZmF1bHRXaWRnZXRJZHMgPSB7XG4gIEFQUExJQ0FUSU9OUzogJ0FwcGxpY2F0aW9ucycsXG4gIEFTU0VUX05PVEVTOiAnQXNzZXQgTm90ZXMnLFxuICBMRUdBQ1lfQ09DS1BJVF9XRUxDT01FOiAnQ29ja3BpdCBXZWxjb21lJyxcbiAgQ09DS1BJVF9XRUxDT01FOiAnY29ja3BpdC53ZWxjb21lLndpZGdldCcsXG4gIERBVEFfUE9JTlRTX1RBQkxFOiAnRGF0YSBwb2ludHMgdGFibGUnLFxuICBERVZJQ0VfTUFOQUdFTUVOVF9XRUxDT01FOiAnZGV2aWNlbWFuYWdlbWVudC53ZWxjb21lLndpZGdldCcsXG4gIElNQUdFOiAnSW1hZ2UnLFxuICBLUEk6ICdrcGkud2lkZ2V0JyxcbiAgTUFSS0RPV046ICdtYXJrZG93bicsXG4gIEhFTFBfQU5EX1NFUlZJQ0U6ICdIZWxwQW5kU2VydmljZScsXG4gIFRIUkVFX0RfUk9UQVRJT046ICdyb3RhdGlvbjNkJyxcbiAgTUFQOiAnTWFwJyxcbiAgREVWSUNFX0NPTlRST0xfTUVTU0FHRV9XSURHRVQ6ICdkZXZpY2VDb250cm9sTWVzc2FnZVdpZGdldCcsXG4gIElORk9fR0FVR0U6ICdpbmZvR2F1Z2UnLFxuICBBTEFSTV9MSVNUOiAnQWxhcm0gbGlzdCcsXG4gIEFMTF9DUklUSUNBTF9BTEFSTVM6ICdBc3NldCBBbGFybXMnLFxuICBSRUNFTlRfQUxBUk1TOiAnUmVjZW50IEFsYXJtcycsXG4gIExJTkVBUl9HQVVHRTogJ0tQSSBMaW5lYXIgR2F1Z2UnLFxuICBTSUxPOiAnS1BJIFNpbG8nXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBEZWZhdWx0V2lkZ2V0SWRLZXlzID0ga2V5b2YgdHlwZW9mIGRlZmF1bHRXaWRnZXRJZHM7XG5leHBvcnQgdHlwZSBEZWZhdWx0V2lkZ2V0SWRWYWx1ZXMgPSAodHlwZW9mIGRlZmF1bHRXaWRnZXRJZHMpW0RlZmF1bHRXaWRnZXRJZEtleXNdO1xuIl19
23
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi93aWRnZXRzL2RlZmluaXRpb25zL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHO0lBQzlCLFlBQVksRUFBRSxjQUFjO0lBQzVCLFdBQVcsRUFBRSxhQUFhO0lBQzFCLHNCQUFzQixFQUFFLGlCQUFpQjtJQUN6QyxlQUFlLEVBQUUsd0JBQXdCO0lBQ3pDLGlCQUFpQixFQUFFLG1CQUFtQjtJQUN0Qyx5QkFBeUIsRUFBRSxpQ0FBaUM7SUFDNUQsS0FBSyxFQUFFLE9BQU87SUFDZCxHQUFHLEVBQUUsWUFBWTtJQUNqQixRQUFRLEVBQUUsVUFBVTtJQUNwQixnQkFBZ0IsRUFBRSxnQkFBZ0I7SUFDbEMsZ0JBQWdCLEVBQUUsWUFBWTtJQUM5QixHQUFHLEVBQUUsS0FBSztJQUNWLDZCQUE2QixFQUFFLDRCQUE0QjtJQUMzRCxVQUFVLEVBQUUsV0FBVztJQUN2QixVQUFVLEVBQUUsWUFBWTtJQUN4QixtQkFBbUIsRUFBRSxjQUFjO0lBQ25DLGFBQWEsRUFBRSxlQUFlO0lBQzlCLFlBQVksRUFBRSxrQkFBa0I7SUFDaEMsSUFBSSxFQUFFLFVBQVU7SUFDaEIsZ0JBQWdCLEVBQUUscUJBQXFCO0NBQy9CLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY29uc3QgZGVmYXVsdFdpZGdldElkcyA9IHtcbiAgQVBQTElDQVRJT05TOiAnQXBwbGljYXRpb25zJyxcbiAgQVNTRVRfTk9URVM6ICdBc3NldCBOb3RlcycsXG4gIExFR0FDWV9DT0NLUElUX1dFTENPTUU6ICdDb2NrcGl0IFdlbGNvbWUnLFxuICBDT0NLUElUX1dFTENPTUU6ICdjb2NrcGl0LndlbGNvbWUud2lkZ2V0JyxcbiAgREFUQV9QT0lOVFNfVEFCTEU6ICdEYXRhIHBvaW50cyB0YWJsZScsXG4gIERFVklDRV9NQU5BR0VNRU5UX1dFTENPTUU6ICdkZXZpY2VtYW5hZ2VtZW50LndlbGNvbWUud2lkZ2V0JyxcbiAgSU1BR0U6ICdJbWFnZScsXG4gIEtQSTogJ2twaS53aWRnZXQnLFxuICBNQVJLRE9XTjogJ21hcmtkb3duJyxcbiAgSEVMUF9BTkRfU0VSVklDRTogJ0hlbHBBbmRTZXJ2aWNlJyxcbiAgVEhSRUVfRF9ST1RBVElPTjogJ3JvdGF0aW9uM2QnLFxuICBNQVA6ICdNYXAnLFxuICBERVZJQ0VfQ09OVFJPTF9NRVNTQUdFX1dJREdFVDogJ2RldmljZUNvbnRyb2xNZXNzYWdlV2lkZ2V0JyxcbiAgSU5GT19HQVVHRTogJ2luZm9HYXVnZScsXG4gIEFMQVJNX0xJU1Q6ICdBbGFybSBsaXN0JyxcbiAgQUxMX0NSSVRJQ0FMX0FMQVJNUzogJ0Fzc2V0IEFsYXJtcycsXG4gIFJFQ0VOVF9BTEFSTVM6ICdSZWNlbnQgQWxhcm1zJyxcbiAgTElORUFSX0dBVUdFOiAnS1BJIExpbmVhciBHYXVnZScsXG4gIFNJTE86ICdLUEkgU2lsbycsXG4gIERBVEFQT0lOVFNfR1JBUEg6ICdEYXRhIHBvaW50cyBncmFwaCAyJ1xufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgRGVmYXVsdFdpZGdldElkS2V5cyA9IGtleW9mIHR5cGVvZiBkZWZhdWx0V2lkZ2V0SWRzO1xuZXhwb3J0IHR5cGUgRGVmYXVsdFdpZGdldElkVmFsdWVzID0gKHR5cGVvZiBkZWZhdWx0V2lkZ2V0SWRzKVtEZWZhdWx0V2lkZ2V0SWRLZXlzXTtcbiJdfQ==
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ export * from './index';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYzh5LW5neC1jb21wb25lbnRzLXdpZGdldHMtaW1wbGVtZW50YXRpb25zLWRhdGFwb2ludHMtZ3JhcGguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi93aWRnZXRzL2ltcGxlbWVudGF0aW9ucy9kYXRhcG9pbnRzLWdyYXBoL2M4eS1uZ3gtY29tcG9uZW50cy13aWRnZXRzLWltcGxlbWVudGF0aW9ucy1kYXRhcG9pbnRzLWdyYXBoLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsY0FBYyxTQUFTLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEdlbmVyYXRlZCBidW5kbGUgaW5kZXguIERvIG5vdCBlZGl0LlxuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vaW5kZXgnO1xuIl19
@@ -0,0 +1,239 @@
1
+ import { Component, inject, Input, Optional } from '@angular/core';
2
+ import { FormBuilder, NgForm, Validators } from '@angular/forms';
3
+ import { CommonModule, CoreModule, FormsModule, gettext, WidgetTimeContextDateRangeService } from '@c8y/ngx-components';
4
+ import { TranslateService } from '@ngx-translate/core';
5
+ import { takeUntil } from 'rxjs/operators';
6
+ import { Subject } from 'rxjs';
7
+ import { DatapointSelectorModule } from '@c8y/ngx-components/datapoint-selector';
8
+ import { omit } from 'lodash-es';
9
+ import { ContextDashboardComponent, WidgetConfigComponent } from '@c8y/ngx-components/context-dashboard';
10
+ import { AlarmEventSelectorModule } from '@c8y/ngx-components/alarm-event-selector';
11
+ import { TooltipModule } from 'ngx-bootstrap/tooltip';
12
+ import { PopoverModule } from 'ngx-bootstrap/popover';
13
+ import { ChartAlarmsService, ChartEventsService, ChartsComponent, DATE_SELECTION_EXTENDED } from '@c8y/ngx-components/echart';
14
+ import { TimeContextComponent } from '@c8y/ngx-components/time-context';
15
+ import * as i0 from "@angular/core";
16
+ import * as i1 from "@c8y/ngx-components/context-dashboard";
17
+ import * as i2 from "@c8y/ngx-components";
18
+ import * as i3 from "@angular/common";
19
+ import * as i4 from "@angular/forms";
20
+ import * as i5 from "ngx-bootstrap/tooltip";
21
+ import * as i6 from "ngx-bootstrap/popover";
22
+ import * as i7 from "@c8y/ngx-components/datapoint-selector";
23
+ import * as i8 from "@c8y/ngx-components/alarm-event-selector";
24
+ export class DatapointsGraphWidgetConfigComponent {
25
+ constructor(widgetConfig, dashboardContextComponent) {
26
+ this.widgetConfig = widgetConfig;
27
+ this.dashboardContextComponent = dashboardContextComponent;
28
+ this.formBuilder = inject(FormBuilder);
29
+ this.form = inject(NgForm);
30
+ this.translate = inject(TranslateService);
31
+ this.widgetTimeContextDateRangeService = inject(WidgetTimeContextDateRangeService);
32
+ this.DATE_SELECTION = DATE_SELECTION_EXTENDED;
33
+ this.dateSelectionHelp = this.translate.instant(gettext(`Choose how to select a date range, the available options are:
34
+ <ul class="m-l-0 p-l-8 m-t-8 m-b-0">
35
+ <li>
36
+ <b>Widget configuration:</b>
37
+ restricts the date selection only to the widget configuration
38
+ </li>
39
+ <li>
40
+ <b>Widget and widget configuration:</b>
41
+ restricts the date selection to the widget view and widget configuration only
42
+ </li>
43
+ <li>
44
+ <b>Dashboard time range:</b>
45
+ restricts date selection to the global dashboard configuration only
46
+ </li>
47
+ </ul>`));
48
+ this.datapointSelectDefaultFormOptions = {
49
+ showRange: true,
50
+ showChart: true
51
+ };
52
+ this.datapointSelectionConfig = {};
53
+ this.activeDatapointsExists = false;
54
+ this.alarmsOrEventsHaveNoMatchingDps = false;
55
+ this.destroy$ = new Subject();
56
+ this.formGroup = this.initForm();
57
+ }
58
+ ngOnInit() {
59
+ this.config?.datapoints?.forEach(dp => this.assignContextFromContextDashboard(dp));
60
+ this.form.form.addControl('config', this.formGroup);
61
+ this.formGroup.patchValue(this.config || {});
62
+ this.formGroup.controls.alarms.setValue(this.config?.alarmsEventsConfigs?.filter(ae => ae.timelineType === 'ALARM'));
63
+ this.formGroup.controls.events.setValue(this.config?.alarmsEventsConfigs?.filter(ae => ae.timelineType === 'EVENT'));
64
+ this.initDateSelection();
65
+ this.setActiveDatapointsExists();
66
+ this.checkForMatchingDatapoints();
67
+ this.formGroup.valueChanges.pipe(takeUntil(this.destroy$)).subscribe(value => {
68
+ this.config = {
69
+ ...value,
70
+ alarmsEventsConfigs: [
71
+ ...(this.formGroup.value.alarms || []),
72
+ ...(this.formGroup.value.events || [])
73
+ ]
74
+ };
75
+ this.setActiveDatapointsExists();
76
+ this.checkForMatchingDatapoints();
77
+ });
78
+ if (this.config?.widgetInstanceGlobalTimeContext) {
79
+ this.updateDashboardTimeContext(this.widgetTimeContextDateRangeService.initialTimeRange());
80
+ }
81
+ if (this.config.dateFrom && this.config.dateTo) {
82
+ this.timeProps = {
83
+ dateFrom: new Date(this.config?.dateFrom),
84
+ dateTo: new Date(this.config?.dateTo),
85
+ interval: this.config?.interval,
86
+ realtime: this.config?.realtime,
87
+ aggregation: this.config?.realtime ? null : this.config?.aggregation
88
+ };
89
+ }
90
+ }
91
+ ngOnDestroy() {
92
+ this.destroy$.next();
93
+ this.destroy$.complete();
94
+ }
95
+ onBeforeSave(config) {
96
+ if (this.formGroup.valid && config) {
97
+ Object.assign(config, omit(this.formGroup.value, ['alarms', 'events']), {
98
+ alarmsEventsConfigs: [
99
+ ...(this.formGroup.value.alarms || []),
100
+ ...(this.formGroup.value.events || [])
101
+ ]
102
+ });
103
+ return true;
104
+ }
105
+ return false;
106
+ }
107
+ timePropsChanged(timeProps) {
108
+ if (timeProps.realtime !== this.config.realtime) {
109
+ this.formGroup.patchValue({ realtime: timeProps.realtime });
110
+ }
111
+ if (timeProps.realtime) {
112
+ if (timeProps.currentDateContextInterval !== this.formGroup.value.interval) {
113
+ this.formGroup.patchValue({ interval: timeProps.currentDateContextInterval });
114
+ }
115
+ return;
116
+ }
117
+ const patchValues = {
118
+ dateFrom: new Date(timeProps.currentDateContextFromDate),
119
+ dateTo: new Date(timeProps.currentDateContextToDate),
120
+ interval: timeProps.currentDateContextInterval,
121
+ ...(timeProps.aggregation && { aggregation: timeProps.aggregation }),
122
+ ...(timeProps.realtime && { realtime: timeProps.realtime })
123
+ };
124
+ this.formGroup.patchValue(patchValues);
125
+ }
126
+ updateDashboardTimeContext(timeProps) {
127
+ const initialTimeRange = {
128
+ dateFrom: timeProps.dateFrom,
129
+ dateTo: timeProps.dateTo,
130
+ interval: timeProps.interval || 'custom'
131
+ };
132
+ if (!this.widgetTimeContextDateRangeService.initialTimeRange()) {
133
+ this.widgetTimeContextDateRangeService.updateInitialTimeRange(initialTimeRange);
134
+ }
135
+ this.formGroup.patchValue({ ...timeProps, ...initialTimeRange });
136
+ }
137
+ updateTimeRangeOnRealtime(timeRange) {
138
+ this.formGroup.patchValue(timeRange, { emitEvent: false });
139
+ }
140
+ dateSelectionChange(dateSelection) {
141
+ this.dateSelection = dateSelection;
142
+ if (dateSelection === DATE_SELECTION_EXTENDED.CONFIG) {
143
+ this.formGroup.controls.displayDateSelection.enable();
144
+ this.formGroup.patchValue({ widgetInstanceGlobalTimeContext: false });
145
+ return;
146
+ }
147
+ // displayDateSelection should be false and disabled when dateSelection is not CONFIG
148
+ this.formGroup.controls.displayDateSelection.disable();
149
+ this.formGroup.patchValue({
150
+ widgetInstanceGlobalTimeContext: true,
151
+ realtime: false,
152
+ displayDateSelection: false
153
+ });
154
+ }
155
+ assignContextFromContextDashboard(datapoint) {
156
+ if (!this.dashboardContextComponent?.isDeviceTypeDashboard) {
157
+ return;
158
+ }
159
+ const context = this.widgetConfig?.context;
160
+ if (context?.id) {
161
+ const { name, id } = context;
162
+ datapoint.__target = { name, id };
163
+ this.datapointSelectionConfig.contextAsset = { id };
164
+ }
165
+ }
166
+ checkForMatchingDatapoints() {
167
+ const allMatch = this.config?.alarmsEventsConfigs?.every(ae => this.formGroup.value.datapoints?.some(dp => dp.__target?.id === ae.__target?.id));
168
+ queueMicrotask(() => {
169
+ if (allMatch) {
170
+ this.alarmsOrEventsHaveNoMatchingDps = false;
171
+ }
172
+ else {
173
+ this.alarmsOrEventsHaveNoMatchingDps = true;
174
+ }
175
+ });
176
+ }
177
+ initForm() {
178
+ const form = this.formBuilder.group({
179
+ datapoints: [
180
+ [],
181
+ [Validators.required, Validators.minLength(1)]
182
+ ],
183
+ alarms: [[]],
184
+ events: [[]],
185
+ displayMarkedLine: [true, []],
186
+ displayMarkedPoint: [true, []],
187
+ mergeMatchingDatapoints: [true, []],
188
+ showLabelAndUnit: [true, []],
189
+ displayDateSelection: [false, []],
190
+ displayAggregationSelection: [false, []],
191
+ widgetInstanceGlobalTimeContext: [false, []],
192
+ canDecoupleGlobalTimeContext: [false, []],
193
+ dateFrom: [null, []],
194
+ dateTo: [null, []],
195
+ interval: ['days', [Validators.required]],
196
+ aggregation: [null, []],
197
+ realtime: [false, [Validators.required]],
198
+ showSlider: [true, [Validators.required]],
199
+ yAxisSplitLines: [false, [Validators.required]],
200
+ xAxisSplitLines: [false, [Validators.required]]
201
+ });
202
+ return form;
203
+ }
204
+ initDateSelection() {
205
+ if (!this.config?.widgetInstanceGlobalTimeContext) {
206
+ this.dateSelection = DATE_SELECTION_EXTENDED.CONFIG;
207
+ return;
208
+ }
209
+ this.dateSelection = DATE_SELECTION_EXTENDED.DASHBOARD_CONTEXT;
210
+ this.formGroup.controls.displayDateSelection.disable();
211
+ }
212
+ setActiveDatapointsExists() {
213
+ this.activeDatapointsExists =
214
+ (this.config?.datapoints?.filter(dp => dp.__active)?.length || 0) > 0;
215
+ }
216
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: DatapointsGraphWidgetConfigComponent, deps: [{ token: i1.WidgetConfigComponent, optional: true }, { token: i1.ContextDashboardComponent, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
217
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.9", type: DatapointsGraphWidgetConfigComponent, isStandalone: true, selector: "c8y-datapoints-graph-widget-config", inputs: { config: "config" }, host: { classAttribute: "d-contents" }, providers: [ChartEventsService, ChartAlarmsService], ngImport: i0, template: "<div class=\"no-card-context d-flex-md fit-h--md\">\n <div class=\"col-md-5 bg-level-1 conf-col inner-scroll p-l-0\">\n <div class=\"p-l-24\">\n <form [formGroup]=\"formGroup\">\n <c8y-datapoint-selection-list\n class=\"bg-level-1 separator-bottom d-block\"\n name=\"datapoints\"\n [minActiveCount]=\"1\"\n [defaultFormOptions]=\"datapointSelectDefaultFormOptions\"\n [config]=\"datapointSelectionConfig\"\n formControlName=\"datapoints\"\n ></c8y-datapoint-selection-list>\n\n <c8y-alarm-event-selection-list\n class=\"bg-level-1 separator-bottom d-block\"\n name=\"alarms\"\n formControlName=\"alarms\"\n [timelineType]=\"'ALARM'\"\n [datapoints]=\"config?.datapoints\"\n ></c8y-alarm-event-selection-list>\n\n <c8y-alarm-event-selection-list\n class=\"bg-inherit\"\n name=\"events\"\n formControlName=\"events\"\n [timelineType]=\"'EVENT'\"\n [datapoints]=\"config?.datapoints\"\n ></c8y-alarm-event-selection-list>\n </form>\n </div>\n </div>\n\n <div class=\"col-md-7 sticky-top p-t-8 inner-scroll widget-preview\">\n <div class=\"p-r-24 d-col fit-h\">\n <div class=\"form-group p-t-8 form-group-sm d-flex a-i-center m-b-8\">\n <div class=\"d-flex a-i-center m-r-4\">\n <label\n class=\"m-b-0\"\n translate\n >\n Date selection\n </label>\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n [popover]=\"dateSelectionHelpTemplate\"\n placement=\"bottom\"\n triggers=\"focus\"\n container=\"body\"\n [adaptivePosition]=\"false\"\n ></button>\n </div>\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control input-sm\"\n [ngModel]=\"dateSelection\"\n (ngModelChange)=\"dateSelectionChange($event)\"\n [ngModelOptions]=\"{ standalone: true }\"\n >\n <option\n title=\"{{ 'Dashboard time range' | translate }}\"\n [value]=\"DATE_SELECTION.DASHBOARD_CONTEXT\"\n >\n {{ 'Dashboard time range' | translate }}\n </option>\n <option\n title=\"{{ 'Widget configuration' | translate }}\"\n [value]=\"DATE_SELECTION.CONFIG\"\n >\n {{ 'Widget configuration' | translate }}\n </option>\n </select>\n <span></span>\n </div>\n </div>\n <label class=\"text-12\">{{ 'Options' | translate }}</label>\n <c8y-time-context\n *ngIf=\"\n dateSelection === DATE_SELECTION.CONFIG &&\n formGroup.get('displayDateSelection').value === true\n \"\n [changedDateContext]=\"timeProps\"\n [controlsAvailable]=\"{\n realtime: true,\n timeRange: config?.displayDateSelection,\n interval: config?.displayDateSelection,\n aggregation: config?.displayAggregationSelection\n }\"\n (contextChange)=\"timePropsChanged($event)\"\n ></c8y-time-context>\n <c8y-charts\n class=\"d-block p-relative\"\n *ngIf=\"activeDatapointsExists\"\n [config]=\"config\"\n [alerts]=\"alerts\"\n (timeRangeChangeOnRealtime)=\"updateTimeRangeOnRealtime($event)\"\n (configChangeOnZoomOut)=\"updateDashboardTimeContext($event)\"\n ></c8y-charts>\n\n <c8y-ui-empty-state\n class=\"d-block m-t-24\"\n [icon]=\"'search'\"\n [title]=\"'No data points selected' | translate\"\n [subtitle]=\"'Select data point to render chart' | translate\"\n *ngIf=\"!activeDatapointsExists\"\n ></c8y-ui-empty-state>\n\n <form\n class=\"d-block p-t-8\"\n [formGroup]=\"formGroup\"\n >\n <label>{{ 'Display options' | translate }}</label>\n <fieldset class=\"c8y-fieldset m-b-24 m-t-0\">\n <legend>{{ 'Axis' | translate }}</legend>\n <c8y-form-group class=\"p-b-16 m-b-0 p-t-8 form-group-sm\">\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Y axis helper lines' | translate\"\n >\n <input\n name=\"yAxisSplitLines\"\n type=\"checkbox\"\n formControlName=\"yAxisSplitLines\"\n />\n <span></span>\n <span translate>Y axis helper lines</span>\n </label>\n <label\n class=\"c8y-checkbox\"\n [title]=\"'X axis helper lines' | translate\"\n >\n <input\n name=\"xAxisSplitLines\"\n type=\"checkbox\"\n formControlName=\"xAxisSplitLines\"\n />\n <span></span>\n <span translate>X axis helper lines</span>\n </label>\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Merge axis' | translate\"\n >\n <input\n name=\"mergeMatchingDatapoints\"\n type=\"checkbox\"\n formControlName=\"mergeMatchingDatapoints\"\n />\n <span></span>\n <span translate>Merge matching datapoints into single axis.</span>\n </label>\n </c8y-form-group>\n </fieldset>\n <fieldset class=\"c8y-fieldset m-b-24 m-t-0\">\n <legend>{{ 'Alarms & Events' | translate }}</legend>\n <c8y-form-group class=\"p-b-16 m-b-0 p-t-8 form-group-sm\">\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Show vertical line on every occurrence' | translate\"\n >\n <input\n name=\"displayMarkedLine\"\n type=\"checkbox\"\n formControlName=\"displayMarkedLine\"\n />\n <span></span>\n <span translate>Show vertical line on every occurrence</span>\n </label>\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Show icon when triggered' | translate\"\n >\n <input\n name=\"displayMarkedPoint\"\n type=\"checkbox\"\n formControlName=\"displayMarkedPoint\"\n />\n <span></span>\n <span translate>Show icon when triggered</span>\n <button\n class=\"btn-clean m-l-8\"\n [attr.aria-label]=\"\n 'Some alarms or events have no matching data points. No icons will be shown for them.'\n | translate\n \"\n [tooltip]=\"\n 'Some alarms or events have no matching data points. No icons will be shown for them.'\n | translate\n \"\n container=\"body\"\n type=\"button\"\n *ngIf=\"alarmsOrEventsHaveNoMatchingDps\"\n (click)=\"$event.stopPropagation()\"\n [adaptivePosition]=\"false\"\n >\n <i\n class=\"text-warning\"\n c8yIcon=\"exclamation-triangle\"\n ></i>\n </button>\n </label>\n </c8y-form-group>\n </fieldset>\n <fieldset class=\"c8y-fieldset m-b-24 m-t-0\">\n <legend>{{ 'Chart' | translate }}</legend>\n <c8y-form-group class=\"p-b-16 m-b-0 p-t-8 form-group-sm\">\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Enable date selection in the widget view.' | translate\"\n >\n <input\n name=\"displayDateSelection\"\n type=\"checkbox\"\n formControlName=\"displayDateSelection\"\n />\n <span></span>\n <span translate>Date selection in the widget view.</span>\n <button\n class=\"btn-clean m-l-8\"\n [attr.aria-label]=\"\n 'Date selection in widget view is not possible when using dashboard time range.'\n | translate\n \"\n [tooltip]=\"\n 'Date selection in widget view is not possible when using dashboard time range.'\n | translate\n \"\n container=\"body\"\n type=\"button\"\n *ngIf=\"dateSelection === DATE_SELECTION.DASHBOARD_CONTEXT\"\n (click)=\"$event.stopPropagation()\"\n [adaptivePosition]=\"false\"\n >\n <i\n class=\"text-info\"\n c8yIcon=\"info\"\n ></i>\n </button>\n </label>\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Aggregation selection' | translate\"\n >\n <input\n name=\"displayAggregationSelection\"\n type=\"checkbox\"\n formControlName=\"displayAggregationSelection\"\n />\n <span></span>\n <span translate>Aggregation selection</span>\n </label>\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Show labels and units' | translate\"\n >\n <input\n name=\"showLabelAndUnit\"\n type=\"checkbox\"\n formControlName=\"showLabelAndUnit\"\n />\n <span></span>\n <span translate>Display labels and units on y-axis</span>\n </label>\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Show slider' | translate\"\n >\n <input\n name=\"showSlider\"\n type=\"checkbox\"\n formControlName=\"showSlider\"\n />\n <span></span>\n <span translate>Show slider</span>\n </label>\n </c8y-form-group>\n </fieldset>\n </form>\n </div>\n </div>\n</div>\n<ng-template #dateSelectionHelpTemplate>\n <div [innerHTML]=\"dateSelectionHelp\"></div>\n</ng-template>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: i2.EmptyStateComponent, selector: "c8y-ui-empty-state", inputs: ["icon", "title", "subtitle", "horizontal"] }, { kind: "directive", type: i2.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "pipe", type: i2.C8yTranslatePipe, name: "translate" }, { kind: "directive", type: i2.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: CoreModule }, { kind: "directive", type: i4.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i4.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i4.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i4.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i4.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i2.FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "directive", type: i2.RequiredInputPlaceholderDirective, selector: "input[required], input[formControlName]" }, { kind: "directive", type: i4.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i4.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: TooltipModule }, { kind: "directive", type: i5.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: "ngmodule", type: PopoverModule }, { kind: "directive", type: i6.PopoverDirective, selector: "[popover]", inputs: ["adaptivePosition", "boundariesElement", "popover", "popoverContext", "popoverTitle", "placement", "outsideClick", "triggers", "container", "containerClass", "isOpen", "delay"], outputs: ["onShown", "onHidden"], exportAs: ["bs-popover"] }, { kind: "component", type: ChartsComponent, selector: "c8y-charts", inputs: ["config", "alerts"], outputs: ["configChangeOnZoomOut", "timeRangeChangeOnRealtime", "datapointOutOfSync", "updateAlarmsAndEvents", "isMarkedAreaEnabled"] }, { kind: "ngmodule", type: DatapointSelectorModule }, { kind: "component", type: i7.DatapointSelectionListComponent, selector: "c8y-datapoint-selection-list", inputs: ["actions", "allowDragAndDrop", "config", "defaultFormOptions", "maxActiveCount", "minActiveCount", "resolveContext", "listTitle"], outputs: ["isValid", "change"] }, { kind: "ngmodule", type: AlarmEventSelectorModule }, { kind: "component", type: i8.AlarmEventSelectionListComponent, selector: "c8y-alarm-event-selection-list", inputs: ["timelineType", "canRemove", "canEdit", "canDragAndDrop", "title", "addButtonLabel", "hideSource", "inline", "activeToggleAsSwitch", "omitProperties", "datapoints", "config"] }, { kind: "component", type: TimeContextComponent, selector: "c8y-time-context", inputs: ["changedDateContext", "controlsAvailable", "context"], outputs: ["contextChange"] }] }); }
218
+ }
219
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: DatapointsGraphWidgetConfigComponent, decorators: [{
220
+ type: Component,
221
+ args: [{ selector: 'c8y-datapoints-graph-widget-config', host: { class: 'd-contents' }, standalone: true, imports: [
222
+ CommonModule,
223
+ CoreModule,
224
+ FormsModule,
225
+ TooltipModule,
226
+ PopoverModule,
227
+ ChartsComponent,
228
+ DatapointSelectorModule,
229
+ AlarmEventSelectorModule,
230
+ TimeContextComponent
231
+ ], providers: [ChartEventsService, ChartAlarmsService], template: "<div class=\"no-card-context d-flex-md fit-h--md\">\n <div class=\"col-md-5 bg-level-1 conf-col inner-scroll p-l-0\">\n <div class=\"p-l-24\">\n <form [formGroup]=\"formGroup\">\n <c8y-datapoint-selection-list\n class=\"bg-level-1 separator-bottom d-block\"\n name=\"datapoints\"\n [minActiveCount]=\"1\"\n [defaultFormOptions]=\"datapointSelectDefaultFormOptions\"\n [config]=\"datapointSelectionConfig\"\n formControlName=\"datapoints\"\n ></c8y-datapoint-selection-list>\n\n <c8y-alarm-event-selection-list\n class=\"bg-level-1 separator-bottom d-block\"\n name=\"alarms\"\n formControlName=\"alarms\"\n [timelineType]=\"'ALARM'\"\n [datapoints]=\"config?.datapoints\"\n ></c8y-alarm-event-selection-list>\n\n <c8y-alarm-event-selection-list\n class=\"bg-inherit\"\n name=\"events\"\n formControlName=\"events\"\n [timelineType]=\"'EVENT'\"\n [datapoints]=\"config?.datapoints\"\n ></c8y-alarm-event-selection-list>\n </form>\n </div>\n </div>\n\n <div class=\"col-md-7 sticky-top p-t-8 inner-scroll widget-preview\">\n <div class=\"p-r-24 d-col fit-h\">\n <div class=\"form-group p-t-8 form-group-sm d-flex a-i-center m-b-8\">\n <div class=\"d-flex a-i-center m-r-4\">\n <label\n class=\"m-b-0\"\n translate\n >\n Date selection\n </label>\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n [popover]=\"dateSelectionHelpTemplate\"\n placement=\"bottom\"\n triggers=\"focus\"\n container=\"body\"\n [adaptivePosition]=\"false\"\n ></button>\n </div>\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control input-sm\"\n [ngModel]=\"dateSelection\"\n (ngModelChange)=\"dateSelectionChange($event)\"\n [ngModelOptions]=\"{ standalone: true }\"\n >\n <option\n title=\"{{ 'Dashboard time range' | translate }}\"\n [value]=\"DATE_SELECTION.DASHBOARD_CONTEXT\"\n >\n {{ 'Dashboard time range' | translate }}\n </option>\n <option\n title=\"{{ 'Widget configuration' | translate }}\"\n [value]=\"DATE_SELECTION.CONFIG\"\n >\n {{ 'Widget configuration' | translate }}\n </option>\n </select>\n <span></span>\n </div>\n </div>\n <label class=\"text-12\">{{ 'Options' | translate }}</label>\n <c8y-time-context\n *ngIf=\"\n dateSelection === DATE_SELECTION.CONFIG &&\n formGroup.get('displayDateSelection').value === true\n \"\n [changedDateContext]=\"timeProps\"\n [controlsAvailable]=\"{\n realtime: true,\n timeRange: config?.displayDateSelection,\n interval: config?.displayDateSelection,\n aggregation: config?.displayAggregationSelection\n }\"\n (contextChange)=\"timePropsChanged($event)\"\n ></c8y-time-context>\n <c8y-charts\n class=\"d-block p-relative\"\n *ngIf=\"activeDatapointsExists\"\n [config]=\"config\"\n [alerts]=\"alerts\"\n (timeRangeChangeOnRealtime)=\"updateTimeRangeOnRealtime($event)\"\n (configChangeOnZoomOut)=\"updateDashboardTimeContext($event)\"\n ></c8y-charts>\n\n <c8y-ui-empty-state\n class=\"d-block m-t-24\"\n [icon]=\"'search'\"\n [title]=\"'No data points selected' | translate\"\n [subtitle]=\"'Select data point to render chart' | translate\"\n *ngIf=\"!activeDatapointsExists\"\n ></c8y-ui-empty-state>\n\n <form\n class=\"d-block p-t-8\"\n [formGroup]=\"formGroup\"\n >\n <label>{{ 'Display options' | translate }}</label>\n <fieldset class=\"c8y-fieldset m-b-24 m-t-0\">\n <legend>{{ 'Axis' | translate }}</legend>\n <c8y-form-group class=\"p-b-16 m-b-0 p-t-8 form-group-sm\">\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Y axis helper lines' | translate\"\n >\n <input\n name=\"yAxisSplitLines\"\n type=\"checkbox\"\n formControlName=\"yAxisSplitLines\"\n />\n <span></span>\n <span translate>Y axis helper lines</span>\n </label>\n <label\n class=\"c8y-checkbox\"\n [title]=\"'X axis helper lines' | translate\"\n >\n <input\n name=\"xAxisSplitLines\"\n type=\"checkbox\"\n formControlName=\"xAxisSplitLines\"\n />\n <span></span>\n <span translate>X axis helper lines</span>\n </label>\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Merge axis' | translate\"\n >\n <input\n name=\"mergeMatchingDatapoints\"\n type=\"checkbox\"\n formControlName=\"mergeMatchingDatapoints\"\n />\n <span></span>\n <span translate>Merge matching datapoints into single axis.</span>\n </label>\n </c8y-form-group>\n </fieldset>\n <fieldset class=\"c8y-fieldset m-b-24 m-t-0\">\n <legend>{{ 'Alarms & Events' | translate }}</legend>\n <c8y-form-group class=\"p-b-16 m-b-0 p-t-8 form-group-sm\">\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Show vertical line on every occurrence' | translate\"\n >\n <input\n name=\"displayMarkedLine\"\n type=\"checkbox\"\n formControlName=\"displayMarkedLine\"\n />\n <span></span>\n <span translate>Show vertical line on every occurrence</span>\n </label>\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Show icon when triggered' | translate\"\n >\n <input\n name=\"displayMarkedPoint\"\n type=\"checkbox\"\n formControlName=\"displayMarkedPoint\"\n />\n <span></span>\n <span translate>Show icon when triggered</span>\n <button\n class=\"btn-clean m-l-8\"\n [attr.aria-label]=\"\n 'Some alarms or events have no matching data points. No icons will be shown for them.'\n | translate\n \"\n [tooltip]=\"\n 'Some alarms or events have no matching data points. No icons will be shown for them.'\n | translate\n \"\n container=\"body\"\n type=\"button\"\n *ngIf=\"alarmsOrEventsHaveNoMatchingDps\"\n (click)=\"$event.stopPropagation()\"\n [adaptivePosition]=\"false\"\n >\n <i\n class=\"text-warning\"\n c8yIcon=\"exclamation-triangle\"\n ></i>\n </button>\n </label>\n </c8y-form-group>\n </fieldset>\n <fieldset class=\"c8y-fieldset m-b-24 m-t-0\">\n <legend>{{ 'Chart' | translate }}</legend>\n <c8y-form-group class=\"p-b-16 m-b-0 p-t-8 form-group-sm\">\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Enable date selection in the widget view.' | translate\"\n >\n <input\n name=\"displayDateSelection\"\n type=\"checkbox\"\n formControlName=\"displayDateSelection\"\n />\n <span></span>\n <span translate>Date selection in the widget view.</span>\n <button\n class=\"btn-clean m-l-8\"\n [attr.aria-label]=\"\n 'Date selection in widget view is not possible when using dashboard time range.'\n | translate\n \"\n [tooltip]=\"\n 'Date selection in widget view is not possible when using dashboard time range.'\n | translate\n \"\n container=\"body\"\n type=\"button\"\n *ngIf=\"dateSelection === DATE_SELECTION.DASHBOARD_CONTEXT\"\n (click)=\"$event.stopPropagation()\"\n [adaptivePosition]=\"false\"\n >\n <i\n class=\"text-info\"\n c8yIcon=\"info\"\n ></i>\n </button>\n </label>\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Aggregation selection' | translate\"\n >\n <input\n name=\"displayAggregationSelection\"\n type=\"checkbox\"\n formControlName=\"displayAggregationSelection\"\n />\n <span></span>\n <span translate>Aggregation selection</span>\n </label>\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Show labels and units' | translate\"\n >\n <input\n name=\"showLabelAndUnit\"\n type=\"checkbox\"\n formControlName=\"showLabelAndUnit\"\n />\n <span></span>\n <span translate>Display labels and units on y-axis</span>\n </label>\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Show slider' | translate\"\n >\n <input\n name=\"showSlider\"\n type=\"checkbox\"\n formControlName=\"showSlider\"\n />\n <span></span>\n <span translate>Show slider</span>\n </label>\n </c8y-form-group>\n </fieldset>\n </form>\n </div>\n </div>\n</div>\n<ng-template #dateSelectionHelpTemplate>\n <div [innerHTML]=\"dateSelectionHelp\"></div>\n</ng-template>\n" }]
232
+ }], ctorParameters: () => [{ type: i1.WidgetConfigComponent, decorators: [{
233
+ type: Optional
234
+ }] }, { type: i1.ContextDashboardComponent, decorators: [{
235
+ type: Optional
236
+ }] }], propDecorators: { config: [{
237
+ type: Input
238
+ }] } });
239
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YXBvaW50cy1ncmFwaC13aWRnZXQtY29uZmlnLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3dpZGdldHMvaW1wbGVtZW50YXRpb25zL2RhdGFwb2ludHMtZ3JhcGgvZGF0YXBvaW50cy1ncmFwaC1jb25maWcvZGF0YXBvaW50cy1ncmFwaC13aWRnZXQtY29uZmlnLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3dpZGdldHMvaW1wbGVtZW50YXRpb25zL2RhdGFwb2ludHMtZ3JhcGgvZGF0YXBvaW50cy1ncmFwaC1jb25maWcvZGF0YXBvaW50cy1ncmFwaC13aWRnZXQtY29uZmlnLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBcUIsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3RGLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRWpFLE9BQU8sRUFDTCxZQUFZLEVBQ1osVUFBVSxFQUVWLFdBQVcsRUFDWCxPQUFPLEVBRVAsaUNBQWlDLEVBQ2xDLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdkQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUdMLHVCQUF1QixFQUV4QixNQUFNLHdDQUF3QyxDQUFDO0FBQ2hELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFakMsT0FBTyxFQUNMLHlCQUF5QixFQUN6QixxQkFBcUIsRUFDdEIsTUFBTSx1Q0FBdUMsQ0FBQztBQUMvQyxPQUFPLEVBRUwsd0JBQXdCLEVBRXpC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VUE0UkEsMkNEdk9JLFlBQVksdWdCQUNaLFVBQVUsb3ZEQUNWLFdBQVcsOEJBQ1gsYUFBYSxpa0JBQ2IsYUFBYSwrVkFDYixlQUFlLDJOQUNmLHVCQUF1QixxVEFDdkIsd0JBQXdCLHNVQUN4QixvQkFBb0I7OzJGQUlYLG9DQUFvQztrQkFsQmhELFNBQVM7K0JBQ0Usb0NBQW9DLFFBQ3hDLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxjQUVqQixJQUFJLFdBQ1A7d0JBQ1AsWUFBWTt3QkFDWixVQUFVO3dCQUNWLFdBQVc7d0JBQ1gsYUFBYTt3QkFDYixhQUFhO3dCQUNiLGVBQWU7d0JBQ2YsdUJBQXVCO3dCQUN2Qix3QkFBd0I7d0JBQ3hCLG9CQUFvQjtxQkFDckIsYUFDVSxDQUFDLGtCQUFrQixFQUFFLGtCQUFrQixDQUFDOzswQkEwQ2hELFFBQVE7OzBCQUNSLFFBQVE7eUNBeENGLE1BQU07c0JBQWQsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgaW5qZWN0LCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQsIE9wdGlvbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtQnVpbGRlciwgTmdGb3JtLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMvaW50ZXJuYWwvT2JzZXJ2YWJsZSc7XG5pbXBvcnQge1xuICBDb21tb25Nb2R1bGUsXG4gIENvcmVNb2R1bGUsXG4gIER5bmFtaWNDb21wb25lbnRBbGVydEFnZ3JlZ2F0b3IsXG4gIEZvcm1zTW9kdWxlLFxuICBnZXR0ZXh0LFxuICBPbkJlZm9yZVNhdmUsXG4gIFdpZGdldFRpbWVDb250ZXh0RGF0ZVJhbmdlU2VydmljZVxufSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzJztcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7XG4gIERhdGFwb2ludEF0dHJpYnV0ZXNGb3JtQ29uZmlnLFxuICBEYXRhcG9pbnRTZWxlY3Rvck1vZGFsT3B0aW9ucyxcbiAgRGF0YXBvaW50U2VsZWN0b3JNb2R1bGUsXG4gIEtQSURldGFpbHNcbn0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cy9kYXRhcG9pbnQtc2VsZWN0b3InO1xuaW1wb3J0IHsgb21pdCB9IGZyb20gJ2xvZGFzaC1lcyc7XG5pbXBvcnQgeyBhZ2dyZWdhdGlvblR5cGUgfSBmcm9tICdAYzh5L2NsaWVudCc7XG5pbXBvcnQge1xuICBDb250ZXh0RGFzaGJvYXJkQ29tcG9uZW50LFxuICBXaWRnZXRDb25maWdDb21wb25lbnRcbn0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cy9jb250ZXh0LWRhc2hib2FyZCc7XG5pbXBvcnQge1xuICBBbGFybURldGFpbHMsXG4gIEFsYXJtRXZlbnRTZWxlY3Rvck1vZHVsZSxcbiAgRXZlbnREZXRhaWxzXG59IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMvYWxhcm0tZXZlbnQtc2VsZWN0b3InO1xuaW1wb3J0IHsgVG9vbHRpcE1vZHVsZSB9IGZyb20gJ25neC1ib290c3RyYXAvdG9vbHRpcCc7XG5pbXBvcnQgeyBQb3BvdmVyTW9kdWxlIH0gZnJvbSAnbmd4LWJvb3RzdHJhcC9wb3BvdmVyJztcbmltcG9ydCB7XG4gIENoYXJ0QWxhcm1zU2VydmljZSxcbiAgQ2hhcnRFdmVudHNTZXJ2aWNlLFxuICBDaGFydHNDb21wb25lbnQsXG4gIERhdGFwb2ludHNHcmFwaEtQSURldGFpbHMsXG4gIERhdGFwb2ludHNHcmFwaFdpZGdldENvbmZpZyxcbiAgRGF0YXBvaW50c0dyYXBoV2lkZ2V0VGltZVByb3BzLFxuICBEQVRFX1NFTEVDVElPTl9FWFRFTkRFRCxcbiAgVGltZUNvbnRleHRQcm9wc1xufSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzL2VjaGFydCc7XG5pbXBvcnQgeyBUaW1lQ29udGV4dENvbXBvbmVudCB9IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMvdGltZS1jb250ZXh0JztcbmltcG9ydCB7IEludGVydmFsIH0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cy9pbnRlcnZhbC1waWNrZXInO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjOHktZGF0YXBvaW50cy1ncmFwaC13aWRnZXQtY29uZmlnJyxcbiAgaG9zdDogeyBjbGFzczogJ2QtY29udGVudHMnIH0sXG4gIHRlbXBsYXRlVXJsOiAnLi9kYXRhcG9pbnRzLWdyYXBoLXdpZGdldC1jb25maWcuY29tcG9uZW50Lmh0bWwnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgQ29tbW9uTW9kdWxlLFxuICAgIENvcmVNb2R1bGUsXG4gICAgRm9ybXNNb2R1bGUsXG4gICAgVG9vbHRpcE1vZHVsZSxcbiAgICBQb3BvdmVyTW9kdWxlLFxuICAgIENoYXJ0c0NvbXBvbmVudCxcbiAgICBEYXRhcG9pbnRTZWxlY3Rvck1vZHVsZSxcbiAgICBBbGFybUV2ZW50U2VsZWN0b3JNb2R1bGUsXG4gICAgVGltZUNvbnRleHRDb21wb25lbnRcbiAgXSxcbiAgcHJvdmlkZXJzOiBbQ2hhcnRFdmVudHNTZXJ2aWNlLCBDaGFydEFsYXJtc1NlcnZpY2VdXG59KVxuZXhwb3J0IGNsYXNzIERhdGFwb2ludHNHcmFwaFdpZGdldENvbmZpZ0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25CZWZvcmVTYXZlLCBPbkRlc3Ryb3kge1xuICBASW5wdXQoKSBjb25maWc6IERhdGFwb2ludHNHcmFwaFdpZGdldENvbmZpZyB8IHVuZGVmaW5lZDtcblxuICBwcml2YXRlIHJlYWRvbmx5IGZvcm1CdWlsZGVyID0gaW5qZWN0KEZvcm1CdWlsZGVyKTtcbiAgcHJpdmF0ZSByZWFkb25seSBmb3JtID0gaW5qZWN0KE5nRm9ybSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgdHJhbnNsYXRlID0gaW5qZWN0KFRyYW5zbGF0ZVNlcnZpY2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IHdpZGdldFRpbWVDb250ZXh0RGF0ZVJhbmdlU2VydmljZSA9IGluamVjdChXaWRnZXRUaW1lQ29udGV4dERhdGVSYW5nZVNlcnZpY2UpO1xuXG4gIGFsZXJ0czogRHluYW1pY0NvbXBvbmVudEFsZXJ0QWdncmVnYXRvciB8IHVuZGVmaW5lZDtcbiAgZm9ybUdyb3VwOiBSZXR1cm5UeXBlPERhdGFwb2ludHNHcmFwaFdpZGdldENvbmZpZ0NvbXBvbmVudFsnaW5pdEZvcm0nXT47XG4gIERBVEVfU0VMRUNUSU9OID0gREFURV9TRUxFQ1RJT05fRVhURU5ERUQ7XG4gIGRhdGVTZWxlY3Rpb246IERBVEVfU0VMRUNUSU9OX0VYVEVOREVEIHwgdW5kZWZpbmVkO1xuICBkYXRlU2VsZWN0aW9uSGVscCA9IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoXG4gICAgZ2V0dGV4dChgQ2hvb3NlIGhvdyB0byBzZWxlY3QgYSBkYXRlIHJhbmdlLCB0aGUgYXZhaWxhYmxlIG9wdGlvbnMgYXJlOlxuICA8dWwgY2xhc3M9XCJtLWwtMCBwLWwtOCBtLXQtOCBtLWItMFwiPlxuICAgIDxsaT5cbiAgICAgIDxiPldpZGdldCBjb25maWd1cmF0aW9uOjwvYj5cbiAgICAgIHJlc3RyaWN0cyB0aGUgZGF0ZSBzZWxlY3Rpb24gb25seSB0byB0aGUgd2lkZ2V0IGNvbmZpZ3VyYXRpb25cbiAgICA8L2xpPlxuICAgIDxsaT5cbiAgICAgIDxiPldpZGdldCBhbmQgd2lkZ2V0IGNvbmZpZ3VyYXRpb246PC9iPlxuICAgICAgcmVzdHJpY3RzIHRoZSBkYXRlIHNlbGVjdGlvbiB0byB0aGUgd2lkZ2V0IHZpZXcgYW5kIHdpZGdldCBjb25maWd1cmF0aW9uIG9ubHlcbiAgICA8L2xpPlxuICAgIDxsaT5cbiAgICAgIDxiPkRhc2hib2FyZCB0aW1lIHJhbmdlOjwvYj5cbiAgICAgIHJlc3RyaWN0cyBkYXRlIHNlbGVjdGlvbiB0byB0aGUgZ2xvYmFsIGRhc2hib2FyZCBjb25maWd1cmF0aW9uIG9ubHlcbiAgICA8L2xpPlxuICA8L3VsPmApXG4gICk7XG4gIGRhdGFwb2ludFNlbGVjdERlZmF1bHRGb3JtT3B0aW9uczogUGFydGlhbDxEYXRhcG9pbnRBdHRyaWJ1dGVzRm9ybUNvbmZpZz4gPSB7XG4gICAgc2hvd1JhbmdlOiB0cnVlLFxuICAgIHNob3dDaGFydDogdHJ1ZVxuICB9O1xuICBkYXRhcG9pbnRTZWxlY3Rpb25Db25maWc6IFBhcnRpYWw8RGF0YXBvaW50U2VsZWN0b3JNb2RhbE9wdGlvbnM+ID0ge307XG4gIGFjdGl2ZURhdGFwb2ludHNFeGlzdHMgPSBmYWxzZTtcbiAgYWxhcm1zT3JFdmVudHNIYXZlTm9NYXRjaGluZ0RwcyA9IGZhbHNlO1xuICB0aW1lUHJvcHM6IERhdGFwb2ludHNHcmFwaFdpZGdldFRpbWVQcm9wcyB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSB3aWRnZXRDb25maWc6IFdpZGdldENvbmZpZ0NvbXBvbmVudCxcbiAgICBAT3B0aW9uYWwoKSBwcml2YXRlIGRhc2hib2FyZENvbnRleHRDb21wb25lbnQ6IENvbnRleHREYXNoYm9hcmRDb21wb25lbnRcbiAgKSB7XG4gICAgdGhpcy5mb3JtR3JvdXAgPSB0aGlzLmluaXRGb3JtKCk7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmNvbmZpZz8uZGF0YXBvaW50cz8uZm9yRWFjaChkcCA9PiB0aGlzLmFzc2lnbkNvbnRleHRGcm9tQ29udGV4dERhc2hib2FyZChkcCkpO1xuICAgIHRoaXMuZm9ybS5mb3JtLmFkZENvbnRyb2woJ2NvbmZpZycsIHRoaXMuZm9ybUdyb3VwKTtcbiAgICB0aGlzLmZvcm1Hcm91cC5wYXRjaFZhbHVlKHRoaXMuY29uZmlnIHx8IHt9KTtcbiAgICB0aGlzLmZvcm1Hcm91cC5jb250cm9scy5hbGFybXMuc2V0VmFsdWUoXG4gICAgICB0aGlzLmNvbmZpZz8uYWxhcm1zRXZlbnRzQ29uZmlncz8uZmlsdGVyKGFlID0+IGFlLnRpbWVsaW5lVHlwZSA9PT0gJ0FMQVJNJykgYXMgQWxhcm1EZXRhaWxzW11cbiAgICApO1xuICAgIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzLmV2ZW50cy5zZXRWYWx1ZShcbiAgICAgIHRoaXMuY29uZmlnPy5hbGFybXNFdmVudHNDb25maWdzPy5maWx0ZXIoYWUgPT4gYWUudGltZWxpbmVUeXBlID09PSAnRVZFTlQnKSBhcyBFdmVudERldGFpbHNbXVxuICAgICk7XG5cbiAgICB0aGlzLmluaXREYXRlU2VsZWN0aW9uKCk7XG4gICAgdGhpcy5zZXRBY3RpdmVEYXRhcG9pbnRzRXhpc3RzKCk7XG4gICAgdGhpcy5jaGVja0Zvck1hdGNoaW5nRGF0YXBvaW50cygpO1xuICAgIHRoaXMuZm9ybUdyb3VwLnZhbHVlQ2hhbmdlcy5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHZhbHVlID0+IHtcbiAgICAgIHRoaXMuY29uZmlnID0ge1xuICAgICAgICAuLi52YWx1ZSxcbiAgICAgICAgYWxhcm1zRXZlbnRzQ29uZmlnczogW1xuICAgICAgICAgIC4uLih0aGlzLmZvcm1Hcm91cC52YWx1ZS5hbGFybXMgfHwgW10pLFxuICAgICAgICAgIC4uLih0aGlzLmZvcm1Hcm91cC52YWx1ZS5ldmVudHMgfHwgW10pXG4gICAgICAgIF1cbiAgICAgIH07XG4gICAgICB0aGlzLnNldEFjdGl2ZURhdGFwb2ludHNFeGlzdHMoKTtcbiAgICAgIHRoaXMuY2hlY2tGb3JNYXRjaGluZ0RhdGFwb2ludHMoKTtcbiAgICB9KTtcblxuICAgIGlmICh0aGlzLmNvbmZpZz8ud2lkZ2V0SW5zdGFuY2VHbG9iYWxUaW1lQ29udGV4dCkge1xuICAgICAgdGhpcy51cGRhdGVEYXNoYm9hcmRUaW1lQ29udGV4dCh0aGlzLndpZGdldFRpbWVDb250ZXh0RGF0ZVJhbmdlU2VydmljZS5pbml0aWFsVGltZVJhbmdlKCkpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmNvbmZpZy5kYXRlRnJvbSAmJiB0aGlzLmNvbmZpZy5kYXRlVG8pIHtcbiAgICAgIHRoaXMudGltZVByb3BzID0ge1xuICAgICAgICBkYXRlRnJvbTogbmV3IERhdGUodGhpcy5jb25maWc/LmRhdGVGcm9tKSxcbiAgICAgICAgZGF0ZVRvOiBuZXcgRGF0ZSh0aGlzLmNvbmZpZz8uZGF0ZVRvKSxcbiAgICAgICAgaW50ZXJ2YWw6IHRoaXMuY29uZmlnPy5pbnRlcnZhbCxcbiAgICAgICAgcmVhbHRpbWU6IHRoaXMuY29uZmlnPy5yZWFsdGltZSxcbiAgICAgICAgYWdncmVnYXRpb246IHRoaXMuY29uZmlnPy5yZWFsdGltZSA/IG51bGwgOiB0aGlzLmNvbmZpZz8uYWdncmVnYXRpb25cbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5kZXN0cm95JC5uZXh0KCk7XG4gICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xuICB9XG5cbiAgb25CZWZvcmVTYXZlKFxuICAgIGNvbmZpZz86IERhdGFwb2ludHNHcmFwaFdpZGdldENvbmZpZ1xuICApOiBib29sZWFuIHwgUHJvbWlzZTxib29sZWFuPiB8IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIGlmICh0aGlzLmZvcm1Hcm91cC52YWxpZCAmJiBjb25maWcpIHtcbiAgICAgIE9iamVjdC5hc3NpZ24oY29uZmlnLCBvbWl0KHRoaXMuZm9ybUdyb3VwLnZhbHVlLCBbJ2FsYXJtcycsICdldmVudHMnXSksIHtcbiAgICAgICAgYWxhcm1zRXZlbnRzQ29uZmlnczogW1xuICAgICAgICAgIC4uLih0aGlzLmZvcm1Hcm91cC52YWx1ZS5hbGFybXMgfHwgW10pLFxuICAgICAgICAgIC4uLih0aGlzLmZvcm1Hcm91cC52YWx1ZS5ldmVudHMgfHwgW10pXG4gICAgICAgIF1cbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdGltZVByb3BzQ2hhbmdlZCh0aW1lUHJvcHM6IFRpbWVDb250ZXh0UHJvcHMpOiB2b2lkIHtcbiAgICBpZiAodGltZVByb3BzLnJlYWx0aW1lICE9PSB0aGlzLmNvbmZpZy5yZWFsdGltZSkge1xuICAgICAgdGhpcy5mb3JtR3JvdXAucGF0Y2hWYWx1ZSh7IHJlYWx0aW1lOiB0aW1lUHJvcHMucmVhbHRpbWUgfSk7XG4gICAgfVxuICAgIGlmICh0aW1lUHJvcHMucmVhbHRpbWUpIHtcbiAgICAgIGlmICh0aW1lUHJvcHMuY3VycmVudERhdGVDb250ZXh0SW50ZXJ2YWwgIT09IHRoaXMuZm9ybUdyb3VwLnZhbHVlLmludGVydmFsKSB7XG4gICAgICAgIHRoaXMuZm9ybUdyb3VwLnBhdGNoVmFsdWUoeyBpbnRlcnZhbDogdGltZVByb3BzLmN1cnJlbnREYXRlQ29udGV4dEludGVydmFsIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBwYXRjaFZhbHVlcyA9IHtcbiAgICAgIGRhdGVGcm9tOiBuZXcgRGF0ZSh0aW1lUHJvcHMuY3VycmVudERhdGVDb250ZXh0RnJvbURhdGUpLFxuICAgICAgZGF0ZVRvOiBuZXcgRGF0ZSh0aW1lUHJvcHMuY3VycmVudERhdGVDb250ZXh0VG9EYXRlKSxcbiAgICAgIGludGVydmFsOiB0aW1lUHJvcHMuY3VycmVudERhdGVDb250ZXh0SW50ZXJ2YWwsXG4gICAgICAuLi4odGltZVByb3BzLmFnZ3JlZ2F0aW9uICYmIHsgYWdncmVnYXRpb246IHRpbWVQcm9wcy5hZ2dyZWdhdGlvbiB9KSxcbiAgICAgIC4uLih0aW1lUHJvcHMucmVhbHRpbWUgJiYgeyByZWFsdGltZTogdGltZVByb3BzLnJlYWx0aW1lIH0pXG4gICAgfTtcblxuICAgIHRoaXMuZm9ybUdyb3VwLnBhdGNoVmFsdWUocGF0Y2hWYWx1ZXMpO1xuICB9XG5cbiAgdXBkYXRlRGFzaGJvYXJkVGltZUNvbnRleHQodGltZVByb3BzOiBEYXRhcG9pbnRzR3JhcGhXaWRnZXRUaW1lUHJvcHMpOiB2b2lkIHtcbiAgICBjb25zdCBpbml0aWFsVGltZVJhbmdlID0ge1xuICAgICAgZGF0ZUZyb206IHRpbWVQcm9wcy5kYXRlRnJvbSxcbiAgICAgIGRhdGVUbzogdGltZVByb3BzLmRhdGVUbyxcbiAgICAgIGludGVydmFsOiB0aW1lUHJvcHMuaW50ZXJ2YWwgfHwgJ2N1c3RvbSdcbiAgICB9O1xuICAgIGlmICghdGhpcy53aWRnZXRUaW1lQ29udGV4dERhdGVSYW5nZVNlcnZpY2UuaW5pdGlhbFRpbWVSYW5nZSgpKSB7XG4gICAgICB0aGlzLndpZGdldFRpbWVDb250ZXh0RGF0ZVJhbmdlU2VydmljZS51cGRhdGVJbml0aWFsVGltZVJhbmdlKGluaXRpYWxUaW1lUmFuZ2UpO1xuICAgIH1cbiAgICB0aGlzLmZvcm1Hcm91cC5wYXRjaFZhbHVlKHsgLi4udGltZVByb3BzLCAuLi5pbml0aWFsVGltZVJhbmdlIH0pO1xuICB9XG5cbiAgdXBkYXRlVGltZVJhbmdlT25SZWFsdGltZShcbiAgICB0aW1lUmFuZ2U6IFBpY2s8RGF0YXBvaW50c0dyYXBoV2lkZ2V0Q29uZmlnLCAnZGF0ZUZyb20nIHwgJ2RhdGVUbyc+XG4gICk6IHZvaWQge1xuICAgIHRoaXMuZm9ybUdyb3VwLnBhdGNoVmFsdWUodGltZVJhbmdlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gIH1cblxuICBkYXRlU2VsZWN0aW9uQ2hhbmdlKGRhdGVTZWxlY3Rpb246IERBVEVfU0VMRUNUSU9OX0VYVEVOREVEKTogdm9pZCB7XG4gICAgdGhpcy5kYXRlU2VsZWN0aW9uID0gZGF0ZVNlbGVjdGlvbjtcblxuICAgIGlmIChkYXRlU2VsZWN0aW9uID09PSBEQVRFX1NFTEVDVElPTl9FWFRFTkRFRC5DT05GSUcpIHtcbiAgICAgIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzLmRpc3BsYXlEYXRlU2VsZWN0aW9uLmVuYWJsZSgpO1xuICAgICAgdGhpcy5mb3JtR3JvdXAucGF0Y2hWYWx1ZSh7IHdpZGdldEluc3RhbmNlR2xvYmFsVGltZUNvbnRleHQ6IGZhbHNlIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIGRpc3BsYXlEYXRlU2VsZWN0aW9uIHNob3VsZCBiZSBmYWxzZSBhbmQgZGlzYWJsZWQgd2hlbiBkYXRlU2VsZWN0aW9uIGlzIG5vdCBDT05GSUdcbiAgICB0aGlzLmZvcm1Hcm91cC5jb250cm9scy5kaXNwbGF5RGF0ZVNlbGVjdGlvbi5kaXNhYmxlKCk7XG4gICAgdGhpcy5mb3JtR3JvdXAucGF0Y2hWYWx1ZSh7XG4gICAgICB3aWRnZXRJbnN0YW5jZUdsb2JhbFRpbWVDb250ZXh0OiB0cnVlLFxuICAgICAgcmVhbHRpbWU6IGZhbHNlLFxuICAgICAgZGlzcGxheURhdGVTZWxlY3Rpb246IGZhbHNlXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzc2lnbkNvbnRleHRGcm9tQ29udGV4dERhc2hib2FyZChkYXRhcG9pbnQ6IEtQSURldGFpbHMpIHtcbiAgICBpZiAoIXRoaXMuZGFzaGJvYXJkQ29udGV4dENvbXBvbmVudD8uaXNEZXZpY2VUeXBlRGFzaGJvYXJkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLndpZGdldENvbmZpZz8uY29udGV4dDtcbiAgICBpZiAoY29udGV4dD8uaWQpIHtcbiAgICAgIGNvbnN0IHsgbmFtZSwgaWQgfSA9IGNvbnRleHQ7XG4gICAgICBkYXRhcG9pbnQuX190YXJnZXQgPSB7IG5hbWUsIGlkIH07XG4gICAgICB0aGlzLmRhdGFwb2ludFNlbGVjdGlvbkNvbmZpZy5jb250ZXh0QXNzZXQgPSB7IGlkIH07XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjaGVja0Zvck1hdGNoaW5nRGF0YXBvaW50cygpOiB2b2lkIHtcbiAgICBjb25zdCBhbGxNYXRjaCA9IHRoaXMuY29uZmlnPy5hbGFybXNFdmVudHNDb25maWdzPy5ldmVyeShhZSA9PlxuICAgICAgdGhpcy5mb3JtR3JvdXAudmFsdWUuZGF0YXBvaW50cz8uc29tZShkcCA9PiBkcC5fX3RhcmdldD8uaWQgPT09IGFlLl9fdGFyZ2V0Py5pZClcbiAgICApO1xuXG4gICAgcXVldWVNaWNyb3Rhc2soKCkgPT4ge1xuICAgICAgaWYgKGFsbE1hdGNoKSB7XG4gICAgICAgIHRoaXMuYWxhcm1zT3JFdmVudHNIYXZlTm9NYXRjaGluZ0RwcyA9IGZhbHNlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5hbGFybXNPckV2ZW50c0hhdmVOb01hdGNoaW5nRHBzID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdEZvcm0oKSB7XG4gICAgY29uc3QgZm9ybSA9IHRoaXMuZm9ybUJ1aWxkZXIuZ3JvdXAoe1xuICAgICAgZGF0YXBvaW50czogW1xuICAgICAgICBbXSBhcyBEYXRhcG9pbnRzR3JhcGhLUElEZXRhaWxzW10sXG4gICAgICAgIFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLm1pbkxlbmd0aCgxKV1cbiAgICAgIF0sXG4gICAgICBhbGFybXM6IFtbXSBhcyBBbGFybURldGFpbHNbXV0sXG4gICAgICBldmVudHM6IFtbXSBhcyBFdmVudERldGFpbHNbXV0sXG4gICAgICBkaXNwbGF5TWFya2VkTGluZTogW3RydWUsIFtdXSxcbiAgICAgIGRpc3BsYXlNYXJrZWRQb2ludDogW3RydWUsIFtdXSxcbiAgICAgIG1lcmdlTWF0Y2hpbmdEYXRhcG9pbnRzOiBbdHJ1ZSwgW11dLFxuICAgICAgc2hvd0xhYmVsQW5kVW5pdDogW3RydWUsIFtdXSxcbiAgICAgIGRpc3BsYXlEYXRlU2VsZWN0aW9uOiBbZmFsc2UsIFtdXSxcbiAgICAgIGRpc3BsYXlBZ2dyZWdhdGlvblNlbGVjdGlvbjogW2ZhbHNlLCBbXV0sXG4gICAgICB3aWRnZXRJbnN0YW5jZUdsb2JhbFRpbWVDb250ZXh0OiBbZmFsc2UsIFtdXSxcbiAgICAgIGNhbkRlY291cGxlR2xvYmFsVGltZUNvbnRleHQ6IFtmYWxzZSwgW11dLFxuICAgICAgZGF0ZUZyb206IFtudWxsIGFzIHVua25vd24gYXMgRGF0ZSwgW11dLFxuICAgICAgZGF0ZVRvOiBbbnVsbCBhcyB1bmtub3duIGFzIERhdGUsIFtdXSxcbiAgICAgIGludGVydmFsOiBbJ2RheXMnIGFzIEludGVydmFsWydpZCddLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF1dLFxuICAgICAgYWdncmVnYXRpb246IFtudWxsIGFzIGFnZ3JlZ2F0aW9uVHlwZSB8IG51bGwsIFtdXSxcbiAgICAgIHJlYWx0aW1lOiBbZmFsc2UsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXV0sXG4gICAgICBzaG93U2xpZGVyOiBbdHJ1ZSwgW1ZhbGlkYXRvcnMucmVxdWlyZWRdXSxcbiAgICAgIHlBeGlzU3BsaXRMaW5lczogW2ZhbHNlLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF1dLFxuICAgICAgeEF4aXNTcGxpdExpbmVzOiBbZmFsc2UsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXV1cbiAgICB9KTtcbiAgICByZXR1cm4gZm9ybTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdERhdGVTZWxlY3Rpb24oKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmNvbmZpZz8ud2lkZ2V0SW5zdGFuY2VHbG9iYWxUaW1lQ29udGV4dCkge1xuICAgICAgdGhpcy5kYXRlU2VsZWN0aW9uID0gREFURV9TRUxFQ1RJT05fRVhURU5ERUQuQ09ORklHO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuZGF0ZVNlbGVjdGlvbiA9IERBVEVfU0VMRUNUSU9OX0VYVEVOREVELkRBU0hCT0FSRF9DT05URVhUO1xuICAgIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzLmRpc3BsYXlEYXRlU2VsZWN0aW9uLmRpc2FibGUoKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0QWN0aXZlRGF0YXBvaW50c0V4aXN0cygpIHtcbiAgICB0aGlzLmFjdGl2ZURhdGFwb2ludHNFeGlzdHMgPVxuICAgICAgKHRoaXMuY29uZmlnPy5kYXRhcG9pbnRzPy5maWx0ZXIoZHAgPT4gZHAuX19hY3RpdmUpPy5sZW5ndGggfHwgMCkgPiAwO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwibm8tY2FyZC1jb250ZXh0IGQtZmxleC1tZCBmaXQtaC0tbWRcIj5cbiAgPGRpdiBjbGFzcz1cImNvbC1tZC01IGJnLWxldmVsLTEgY29uZi1jb2wgaW5uZXItc2Nyb2xsIHAtbC0wXCI+XG4gICAgPGRpdiBjbGFzcz1cInAtbC0yNFwiPlxuICAgICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJmb3JtR3JvdXBcIj5cbiAgICAgICAgPGM4eS1kYXRhcG9pbnQtc2VsZWN0aW9uLWxpc3RcbiAgICAgICAgICBjbGFzcz1cImJnLWxldmVsLTEgc2VwYXJhdG9yLWJvdHRvbSBkLWJsb2NrXCJcbiAgICAgICAgICBuYW1lPVwiZGF0YXBvaW50c1wiXG4gICAgICAgICAgW21pbkFjdGl2ZUNvdW50XT1cIjFcIlxuICAgICAgICAgIFtkZWZhdWx0Rm9ybU9wdGlvbnNdPVwiZGF0YXBvaW50U2VsZWN0RGVmYXVsdEZvcm1PcHRpb25zXCJcbiAgICAgICAgICBbY29uZmlnXT1cImRhdGFwb2ludFNlbGVjdGlvbkNvbmZpZ1wiXG4gICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiZGF0YXBvaW50c1wiXG4gICAgICAgID48L2M4eS1kYXRhcG9pbnQtc2VsZWN0aW9uLWxpc3Q+XG5cbiAgICAgICAgPGM4eS1hbGFybS1ldmVudC1zZWxlY3Rpb24tbGlzdFxuICAgICAgICAgIGNsYXNzPVwiYmctbGV2ZWwtMSBzZXBhcmF0b3ItYm90dG9tIGQtYmxvY2tcIlxuICAgICAgICAgIG5hbWU9XCJhbGFybXNcIlxuICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImFsYXJtc1wiXG4gICAgICAgICAgW3RpbWVsaW5lVHlwZV09XCInQUxBUk0nXCJcbiAgICAgICAgICBbZGF0YXBvaW50c109XCJjb25maWc/LmRhdGFwb2ludHNcIlxuICAgICAgICA+PC9jOHktYWxhcm0tZXZlbnQtc2VsZWN0aW9uLWxpc3Q+XG5cbiAgICAgICAgPGM4eS1hbGFybS1ldmVudC1zZWxlY3Rpb24tbGlzdFxuICAgICAgICAgIGNsYXNzPVwiYmctaW5oZXJpdFwiXG4gICAgICAgICAgbmFtZT1cImV2ZW50c1wiXG4gICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiZXZlbnRzXCJcbiAgICAgICAgICBbdGltZWxpbmVUeXBlXT1cIidFVkVOVCdcIlxuICAgICAgICAgIFtkYXRhcG9pbnRzXT1cImNvbmZpZz8uZGF0YXBvaW50c1wiXG4gICAgICAgID48L2M4eS1hbGFybS1ldmVudC1zZWxlY3Rpb24tbGlzdD5cbiAgICAgIDwvZm9ybT5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPGRpdiBjbGFzcz1cImNvbC1tZC03IHN0aWNreS10b3AgcC10LTggaW5uZXItc2Nyb2xsIHdpZGdldC1wcmV2aWV3XCI+XG4gICAgPGRpdiBjbGFzcz1cInAtci0yNCBkLWNvbCBmaXQtaFwiPlxuICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcC10LTggZm9ybS1ncm91cC1zbSBkLWZsZXggYS1pLWNlbnRlciBtLWItOFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGEtaS1jZW50ZXIgbS1yLTRcIj5cbiAgICAgICAgICA8bGFiZWxcbiAgICAgICAgICAgIGNsYXNzPVwibS1iLTBcIlxuICAgICAgICAgICAgdHJhbnNsYXRlXG4gICAgICAgICAgPlxuICAgICAgICAgICAgRGF0ZSBzZWxlY3Rpb25cbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIGNsYXNzPVwiYnRuLWhlbHAgYnRuLWhlbHAtLXNtXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ0hlbHAnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgIFtwb3BvdmVyXT1cImRhdGVTZWxlY3Rpb25IZWxwVGVtcGxhdGVcIlxuICAgICAgICAgICAgcGxhY2VtZW50PVwiYm90dG9tXCJcbiAgICAgICAgICAgIHRyaWdnZXJzPVwiZm9jdXNcIlxuICAgICAgICAgICAgY29udGFpbmVyPVwiYm9keVwiXG4gICAgICAgICAgICBbYWRhcHRpdmVQb3NpdGlvbl09XCJmYWxzZVwiXG4gICAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImM4eS1zZWxlY3Qtd3JhcHBlclwiPlxuICAgICAgICAgIDxzZWxlY3RcbiAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sIGlucHV0LXNtXCJcbiAgICAgICAgICAgIFtuZ01vZGVsXT1cImRhdGVTZWxlY3Rpb25cIlxuICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiZGF0ZVNlbGVjdGlvbkNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgIFtuZ01vZGVsT3B0aW9uc109XCJ7IHN0YW5kYWxvbmU6IHRydWUgfVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPG9wdGlvblxuICAgICAgICAgICAgICB0aXRsZT1cInt7ICdEYXNoYm9hcmQgdGltZSByYW5nZScgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICBbdmFsdWVdPVwiREFURV9TRUxFQ1RJT04uREFTSEJPQVJEX0NPTlRFWFRcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICB7eyAnRGFzaGJvYXJkIHRpbWUgcmFuZ2UnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgIDxvcHRpb25cbiAgICAgICAgICAgICAgdGl0bGU9XCJ7eyAnV2lkZ2V0IGNvbmZpZ3VyYXRpb24nIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgICAgW3ZhbHVlXT1cIkRBVEVfU0VMRUNUSU9OLkNPTkZJR1wiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIHt7ICdXaWRnZXQgY29uZmlndXJhdGlvbicgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgIDxzcGFuPjwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxsYWJlbCBjbGFzcz1cInRleHQtMTJcIj57eyAnT3B0aW9ucycgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxuICAgICAgPGM4eS10aW1lLWNvbnRleHRcbiAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICBkYXRlU2VsZWN0aW9uID09PSBEQVRFX1NFTEVDVElPTi5DT05GSUcgJiZcbiAgICAgICAgICBmb3JtR3JvdXAuZ2V0KCdkaXNwbGF5RGF0ZVNlbGVjdGlvbicpLnZhbHVlID09PSB0cnVlXG4gICAgICAgIFwiXG4gICAgICAgIFtjaGFuZ2VkRGF0ZUNvbnRleHRdPVwidGltZVByb3BzXCJcbiAgICAgICAgW2NvbnRyb2xzQXZhaWxhYmxlXT1cIntcbiAgICAgICAgICByZWFsdGltZTogdHJ1ZSxcbiAgICAgICAgICB0aW1lUmFuZ2U6IGNvbmZpZz8uZGlzcGxheURhdGVTZWxlY3Rpb24sXG4gICAgICAgICAgaW50ZXJ2YWw6IGNvbmZpZz8uZGlzcGxheURhdGVTZWxlY3Rpb24sXG4gICAgICAgICAgYWdncmVnYXRpb246IGNvbmZpZz8uZGlzcGxheUFnZ3JlZ2F0aW9uU2VsZWN0aW9uXG4gICAgICAgIH1cIlxuICAgICAgICAoY29udGV4dENoYW5nZSk9XCJ0aW1lUHJvcHNDaGFuZ2VkKCRldmVudClcIlxuICAgICAgPjwvYzh5LXRpbWUtY29udGV4dD5cbiAgICAgIDxjOHktY2hhcnRzXG4gICAgICAgIGNsYXNzPVwiZC1ibG9jayBwLXJlbGF0aXZlXCJcbiAgICAgICAgKm5nSWY9XCJhY3RpdmVEYXRhcG9pbnRzRXhpc3RzXCJcbiAgICAgICAgW2NvbmZpZ109XCJjb25maWdcIlxuICAgICAgICBbYWxlcnRzXT1cImFsZXJ0c1wiXG4gICAgICAgICh0aW1lUmFuZ2VDaGFuZ2VPblJlYWx0aW1lKT1cInVwZGF0ZVRpbWVSYW5nZU9uUmVhbHRpbWUoJGV2ZW50KVwiXG4gICAgICAgIChjb25maWdDaGFuZ2VPblpvb21PdXQpPVwidXBkYXRlRGFzaGJvYXJkVGltZUNvbnRleHQoJGV2ZW50KVwiXG4gICAgICA+PC9jOHktY2hhcnRzPlxuXG4gICAgICA8Yzh5LXVpLWVtcHR5LXN0YXRlXG4gICAgICAgIGNsYXNzPVwiZC1ibG9jayBtLXQtMjRcIlxuICAgICAgICBbaWNvbl09XCInc2VhcmNoJ1wiXG4gICAgICAgIFt0aXRsZV09XCInTm8gZGF0YSBwb2ludHMgc2VsZWN0ZWQnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgW3N1YnRpdGxlXT1cIidTZWxlY3QgZGF0YSBwb2ludCB0byByZW5kZXIgY2hhcnQnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgKm5nSWY9XCIhYWN0aXZlRGF0YXBvaW50c0V4aXN0c1wiXG4gICAgICA+PC9jOHktdWktZW1wdHktc3RhdGU+XG5cbiAgICAgIDxmb3JtXG4gICAgICAgIGNsYXNzPVwiZC1ibG9jayBwLXQtOFwiXG4gICAgICAgIFtmb3JtR3JvdXBdPVwiZm9ybUdyb3VwXCJcbiAgICAgID5cbiAgICAgICAgPGxhYmVsPnt7ICdEaXNwbGF5IG9wdGlvbnMnIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cbiAgICAgICAgPGZpZWxkc2V0IGNsYXNzPVwiYzh5LWZpZWxkc2V0IG0tYi0yNCBtLXQtMFwiPlxuICAgICAgICAgIDxsZWdlbmQ+e3sgJ0F4aXMnIHwgdHJhbnNsYXRlIH19PC9sZWdlbmQ+XG4gICAgICAgICAgPGM4eS1mb3JtLWdyb3VwIGNsYXNzPVwicC1iLTE2IG0tYi0wIHAtdC04IGZvcm0tZ3JvdXAtc21cIj5cbiAgICAgICAgICAgIDxsYWJlbFxuICAgICAgICAgICAgICBjbGFzcz1cImM4eS1jaGVja2JveFwiXG4gICAgICAgICAgICAgIFt0aXRsZV09XCInWSBheGlzIGhlbHBlciBsaW5lcycgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICBuYW1lPVwieUF4aXNTcGxpdExpbmVzXCJcbiAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInlBeGlzU3BsaXRMaW5lc1wiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDxzcGFuPjwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4gdHJhbnNsYXRlPlkgYXhpcyBoZWxwZXIgbGluZXM8L3NwYW4+XG4gICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICAgIGNsYXNzPVwiYzh5LWNoZWNrYm94XCJcbiAgICAgICAgICAgICAgW3RpdGxlXT1cIidYIGF4aXMgaGVscGVyIGxpbmVzJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgIG5hbWU9XCJ4QXhpc1NwbGl0TGluZXNcIlxuICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwieEF4aXNTcGxpdExpbmVzXCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPHNwYW4+PC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhbiB0cmFuc2xhdGU+WCBheGlzIGhlbHBlciBsaW5lczwvc3Bhbj5cbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8bGFiZWxcbiAgICAgICAgICAgICAgY2xhc3M9XCJjOHktY2hlY2tib3hcIlxuICAgICAgICAgICAgICBbdGl0bGVdPVwiJ01lcmdlIGF4aXMnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgbmFtZT1cIm1lcmdlTWF0Y2hpbmdEYXRhcG9pbnRzXCJcbiAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cIm1lcmdlTWF0Y2hpbmdEYXRhcG9pbnRzXCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPHNwYW4+PC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhbiB0cmFuc2xhdGU+TWVyZ2UgbWF0Y2hpbmcgZGF0YXBvaW50cyBpbnRvIHNpbmdsZSBheGlzLjwvc3Bhbj5cbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPC9jOHktZm9ybS1ncm91cD5cbiAgICAgICAgPC9maWVsZHNldD5cbiAgICAgICAgPGZpZWxkc2V0IGNsYXNzPVwiYzh5LWZpZWxkc2V0IG0tYi0yNCBtLXQtMFwiPlxuICAgICAgICAgIDxsZWdlbmQ+e3sgJ0FsYXJtcyAmIEV2ZW50cycgfCB0cmFuc2xhdGUgfX08L2xlZ2VuZD5cbiAgICAgICAgICA8Yzh5LWZvcm0tZ3JvdXAgY2xhc3M9XCJwLWItMTYgbS1iLTAgcC10LTggZm9ybS1ncm91cC1zbVwiPlxuICAgICAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICAgIGNsYXNzPVwiYzh5LWNoZWNrYm94XCJcbiAgICAgICAgICAgICAgW3RpdGxlXT1cIidTaG93IHZlcnRpY2FsIGxpbmUgb24gZXZlcnkgb2NjdXJyZW5jZScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICBuYW1lPVwiZGlzcGxheU1hcmtlZExpbmVcIlxuICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiZGlzcGxheU1hcmtlZExpbmVcIlxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8c3Bhbj48L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuIHRyYW5zbGF0ZT5TaG93IHZlcnRpY2FsIGxpbmUgb24gZXZlcnkgb2NjdXJyZW5jZTwvc3Bhbj5cbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8bGFiZWxcbiAgICAgICAgICAgICAgY2xhc3M9XCJjOHktY2hlY2tib3hcIlxuICAgICAgICAgICAgICBbdGl0bGVdPVwiJ1Nob3cgaWNvbiB3aGVuIHRyaWdnZXJlZCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICBuYW1lPVwiZGlzcGxheU1hcmtlZFBvaW50XCJcbiAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImRpc3BsYXlNYXJrZWRQb2ludFwiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDxzcGFuPjwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4gdHJhbnNsYXRlPlNob3cgaWNvbiB3aGVuIHRyaWdnZXJlZDwvc3Bhbj5cbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuLWNsZWFuIG0tbC04XCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIlxuICAgICAgICAgICAgICAgICAgJ1NvbWUgYWxhcm1zIG9yIGV2ZW50cyBoYXZlIG5vIG1hdGNoaW5nIGRhdGEgcG9pbnRzLiBObyBpY29ucyB3aWxsIGJlIHNob3duIGZvciB0aGVtLidcbiAgICAgICAgICAgICAgICAgICAgfCB0cmFuc2xhdGVcbiAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgIFt0b29sdGlwXT1cIlxuICAgICAgICAgICAgICAgICAgJ1NvbWUgYWxhcm1zIG9yIGV2ZW50cyBoYXZlIG5vIG1hdGNoaW5nIGRhdGEgcG9pbnRzLiBObyBpY29ucyB3aWxsIGJlIHNob3duIGZvciB0aGVtLidcbiAgICAgICAgICAgICAgICAgICAgfCB0cmFuc2xhdGVcbiAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgIGNvbnRhaW5lcj1cImJvZHlcIlxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICpuZ0lmPVwiYWxhcm1zT3JFdmVudHNIYXZlTm9NYXRjaGluZ0Rwc1wiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgICAgICAgW2FkYXB0aXZlUG9zaXRpb25dPVwiZmFsc2VcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwidGV4dC13YXJuaW5nXCJcbiAgICAgICAgICAgICAgICAgIGM4eUljb249XCJleGNsYW1hdGlvbi10cmlhbmdsZVwiXG4gICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIDwvYzh5LWZvcm0tZ3JvdXA+XG4gICAgICAgIDwvZmllbGRzZXQ+XG4gICAgICAgIDxmaWVsZHNldCBjbGFzcz1cImM4eS1maWVsZHNldCBtLWItMjQgbS10LTBcIj5cbiAgICAgICAgICA8bGVnZW5kPnt7ICdDaGFydCcgfCB0cmFuc2xhdGUgfX08L2xlZ2VuZD5cbiAgICAgICAgICA8Yzh5LWZvcm0tZ3JvdXAgY2xhc3M9XCJwLWItMTYgbS1iLTAgcC10LTggZm9ybS1ncm91cC1zbVwiPlxuICAgICAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICAgIGNsYXNzPVwiYzh5LWNoZWNrYm94XCJcbiAgICAgICAgICAgICAgW3RpdGxlXT1cIidFbmFibGUgZGF0ZSBzZWxlY3Rpb24gaW4gdGhlIHdpZGdldCB2aWV3LicgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICBuYW1lPVwiZGlzcGxheURhdGVTZWxlY3Rpb25cIlxuICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiZGlzcGxheURhdGVTZWxlY3Rpb25cIlxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8c3Bhbj48L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuIHRyYW5zbGF0ZT5EYXRlIHNlbGVjdGlvbiBpbiB0aGUgd2lkZ2V0IHZpZXcuPC9zcGFuPlxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJidG4tY2xlYW4gbS1sLThcIlxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiXG4gICAgICAgICAgICAgICAgICAnRGF0ZSBzZWxlY3Rpb24gaW4gd2lkZ2V0IHZpZXcgaXMgbm90IHBvc3NpYmxlIHdoZW4gdXNpbmcgZGFzaGJvYXJkIHRpbWUgcmFuZ2UuJ1xuICAgICAgICAgICAgICAgICAgICB8IHRyYW5zbGF0ZVxuICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgW3Rvb2x0aXBdPVwiXG4gICAgICAgICAgICAgICAgICAnRGF0ZSBzZWxlY3Rpb24gaW4gd2lkZ2V0IHZpZXcgaXMgbm90IHBvc3NpYmxlIHdoZW4gdXNpbmcgZGFzaGJvYXJkIHRpbWUgcmFuZ2UuJ1xuICAgICAgICAgICAgICAgICAgICB8IHRyYW5zbGF0ZVxuICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgY29udGFpbmVyPVwiYm9keVwiXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJkYXRlU2VsZWN0aW9uID09PSBEQVRFX1NFTEVDVElPTi5EQVNIQk9BUkRfQ09OVEVYVFwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgICAgICAgW2FkYXB0aXZlUG9zaXRpb25dPVwiZmFsc2VcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwidGV4dC1pbmZvXCJcbiAgICAgICAgICAgICAgICAgIGM4eUljb249XCJpbmZvXCJcbiAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8bGFiZWxcbiAgICAgICAgICAgICAgY2xhc3M9XCJjOHktY2hlY2tib3hcIlxuICAgICAgICAgICAgICBbdGl0bGVdPVwiJ0FnZ3JlZ2F0aW9uIHNlbGVjdGlvbicgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICBuYW1lPVwiZGlzcGxheUFnZ3JlZ2F0aW9uU2VsZWN0aW9uXCJcbiAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImRpc3BsYXlBZ2dyZWdhdGlvblNlbGVjdGlvblwiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDxzcGFuPjwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4gdHJhbnNsYXRlPkFnZ3JlZ2F0aW9uIHNlbGVjdGlvbjwvc3Bhbj5cbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8bGFiZWxcbiAgICAgICAgICAgICAgY2xhc3M9XCJjOHktY2hlY2tib3hcIlxuICAgICAgICAgICAgICBbdGl0bGVdPVwiJ1Nob3cgbGFiZWxzIGFuZCB1bml0cycgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICBuYW1lPVwic2hvd0xhYmVsQW5kVW5pdFwiXG4gICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJzaG93TGFiZWxBbmRVbml0XCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPHNwYW4+PC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhbiB0cmFuc2xhdGU+RGlzcGxheSBsYWJlbHMgYW5kIHVuaXRzIG9uIHktYXhpczwvc3Bhbj5cbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8bGFiZWxcbiAgICAgICAgICAgICAgY2xhc3M9XCJjOHktY2hlY2tib3hcIlxuICAgICAgICAgICAgICBbdGl0bGVdPVwiJ1Nob3cgc2xpZGVyJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgIG5hbWU9XCJzaG93U2xpZGVyXCJcbiAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInNob3dTbGlkZXJcIlxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8c3Bhbj48L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuIHRyYW5zbGF0ZT5TaG93IHNsaWRlcjwvc3Bhbj5cbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPC9jOHktZm9ybS1ncm91cD5cbiAgICAgICAgPC9maWVsZHNldD5cbiAgICAgIDwvZm9ybT5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cbjxuZy10ZW1wbGF0ZSAjZGF0ZVNlbGVjdGlvbkhlbHBUZW1wbGF0ZT5cbiAgPGRpdiBbaW5uZXJIVE1MXT1cImRhdGVTZWxlY3Rpb25IZWxwXCI+PC9kaXY+XG48L25nLXRlbXBsYXRlPlxuIl19