ngx-hana-nameserver-history-viewer 1.2.1 → 21.1.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 (147) hide show
  1. package/README.md +2 -1
  2. package/{fesm2020 → fesm2022}/ngx-hana-nameserver-history-viewer.mjs +2898 -3983
  3. package/fesm2022/ngx-hana-nameserver-history-viewer.mjs.map +1 -0
  4. package/ngx-hana-nameserver-history-viewer-21.1.0.tgz +0 -0
  5. package/package.json +20 -27
  6. package/types/ngx-hana-nameserver-history-viewer.d.ts +545 -0
  7. package/esm2020/ngx-hana-nameserver-history-viewer.mjs +0 -5
  8. package/esm2020/public-api.mjs +0 -2
  9. package/esm2020/src/nameserver-history-viewer/components/alert/alert.component.mjs +0 -68
  10. package/esm2020/src/nameserver-history-viewer/components/alert/alert.module.mjs +0 -22
  11. package/esm2020/src/nameserver-history-viewer/components/alert/index.mjs +0 -3
  12. package/esm2020/src/nameserver-history-viewer/components/file-drop-input/file-drop-input.component.mjs +0 -112
  13. package/esm2020/src/nameserver-history-viewer/components/file-drop-input/index.mjs +0 -2
  14. package/esm2020/src/nameserver-history-viewer/components/index.mjs +0 -9
  15. package/esm2020/src/nameserver-history-viewer/components/instruction/index.mjs +0 -2
  16. package/esm2020/src/nameserver-history-viewer/components/instruction/instruction.component.mjs +0 -42
  17. package/esm2020/src/nameserver-history-viewer/components/nameserver-history.component.mjs +0 -557
  18. package/esm2020/src/nameserver-history-viewer/components/port-selector/index.mjs +0 -2
  19. package/esm2020/src/nameserver-history-viewer/components/port-selector/port-selector.component.mjs +0 -69
  20. package/esm2020/src/nameserver-history-viewer/components/port-selector/port-selector.service.mjs +0 -41
  21. package/esm2020/src/nameserver-history-viewer/components/progress-bar/index.mjs +0 -2
  22. package/esm2020/src/nameserver-history-viewer/components/progress-bar/progress-bar.component.mjs +0 -40
  23. package/esm2020/src/nameserver-history-viewer/components/time-range-selector/index.mjs +0 -2
  24. package/esm2020/src/nameserver-history-viewer/components/time-range-selector/time-range-selector.component.mjs +0 -70
  25. package/esm2020/src/nameserver-history-viewer/components/timezone-selector/index.mjs +0 -2
  26. package/esm2020/src/nameserver-history-viewer/components/timezone-selector/timezone-selector.component.mjs +0 -88
  27. package/esm2020/src/nameserver-history-viewer/components/timezone-selector/timezone-selector.service.mjs +0 -47
  28. package/esm2020/src/nameserver-history-viewer/index.mjs +0 -3
  29. package/esm2020/src/nameserver-history-viewer/nameserver-history.module.mjs +0 -63
  30. package/esm2020/src/nameserver-history-viewer/services/chart.service.mjs +0 -328
  31. package/esm2020/src/nameserver-history-viewer/services/file.service.mjs +0 -390
  32. package/esm2020/src/nameserver-history-viewer/services/index.mjs +0 -4
  33. package/esm2020/src/nameserver-history-viewer/services/ui.service.mjs +0 -557
  34. package/esm2020/src/nameserver-history-viewer/types/abort.types.mjs +0 -6
  35. package/esm2020/src/nameserver-history-viewer/types/alert.types.mjs +0 -8
  36. package/esm2020/src/nameserver-history-viewer/types/chart-content-data-item.types.mjs +0 -2
  37. package/esm2020/src/nameserver-history-viewer/types/chart-content-data.types.mjs +0 -2
  38. package/esm2020/src/nameserver-history-viewer/types/chart-content-header.types.mjs +0 -2
  39. package/esm2020/src/nameserver-history-viewer/types/chart-content-time.types.mjs +0 -2
  40. package/esm2020/src/nameserver-history-viewer/types/chart-content.types.mjs +0 -2
  41. package/esm2020/src/nameserver-history-viewer/types/color-rgba.types.mjs +0 -2
  42. package/esm2020/src/nameserver-history-viewer/types/html-element.type.mjs +0 -9
  43. package/esm2020/src/nameserver-history-viewer/types/index.mjs +0 -28
  44. package/esm2020/src/nameserver-history-viewer/types/item.types.mjs +0 -14
  45. package/esm2020/src/nameserver-history-viewer/types/legend-color.types.mjs +0 -2
  46. package/esm2020/src/nameserver-history-viewer/types/load-history-info-backup.types.mjs +0 -2
  47. package/esm2020/src/nameserver-history-viewer/types/load-history-info-columnstore.types.mjs +0 -2
  48. package/esm2020/src/nameserver-history-viewer/types/load-history-info-host.types.mjs +0 -2
  49. package/esm2020/src/nameserver-history-viewer/types/load-history-info-item.types.mjs +0 -2
  50. package/esm2020/src/nameserver-history-viewer/types/load-history-info-persistence.types.mjs +0 -2
  51. package/esm2020/src/nameserver-history-viewer/types/load-history-info-rowstore.types.mjs +0 -2
  52. package/esm2020/src/nameserver-history-viewer/types/load-history-info-server.types.mjs +0 -2
  53. package/esm2020/src/nameserver-history-viewer/types/load-history-info-session-admission-control.types.mjs +0 -2
  54. package/esm2020/src/nameserver-history-viewer/types/load-history-info-sql.types.mjs +0 -2
  55. package/esm2020/src/nameserver-history-viewer/types/load-history-info-sync-primitives.types.mjs +0 -2
  56. package/esm2020/src/nameserver-history-viewer/types/load-history-info-threads.types.mjs +0 -2
  57. package/esm2020/src/nameserver-history-viewer/types/load-history-info.types.mjs +0 -2
  58. package/esm2020/src/nameserver-history-viewer/types/port.types.mjs +0 -2
  59. package/esm2020/src/nameserver-history-viewer/types/scale-group.types.mjs +0 -17
  60. package/esm2020/src/nameserver-history-viewer/types/unit-category.types.mjs +0 -10
  61. package/esm2020/src/nameserver-history-viewer/types/unit.types.mjs +0 -14
  62. package/esm2020/src/nameserver-history-viewer/utils/chart-util.mjs +0 -25
  63. package/esm2020/src/nameserver-history-viewer/utils/chartjs-downsample/chartjs_ext.mjs +0 -2
  64. package/esm2020/src/nameserver-history-viewer/utils/chartjs-downsample/data_culling.mjs +0 -56
  65. package/esm2020/src/nameserver-history-viewer/utils/chartjs-downsample/data_mipmap.mjs +0 -139
  66. package/esm2020/src/nameserver-history-viewer/utils/chartjs-downsample/index.mjs +0 -41
  67. package/esm2020/src/nameserver-history-viewer/utils/chartjs-downsample/lttb_data_mipmap.mjs +0 -106
  68. package/esm2020/src/nameserver-history-viewer/utils/chartjs-downsample/responsive_downsample_plugin.mjs +0 -167
  69. package/esm2020/src/nameserver-history-viewer/utils/chartjs-downsample/utils.mjs +0 -114
  70. package/esm2020/src/nameserver-history-viewer/utils/chartjs-zoom/chart.zoom.mjs +0 -527
  71. package/esm2020/src/nameserver-history-viewer/utils/chartjs-zoom/index.mjs +0 -2
  72. package/esm2020/src/nameserver-history-viewer/utils/file-util.mjs +0 -161
  73. package/esm2020/src/nameserver-history-viewer/utils/index.mjs +0 -5
  74. package/esm2020/src/nameserver-history-viewer/utils/time-util.mjs +0 -99
  75. package/esm2020/src/nameserver-history-viewer/utils/ui-util.mjs +0 -162
  76. package/fesm2015/ngx-hana-nameserver-history-viewer.mjs +0 -4098
  77. package/fesm2015/ngx-hana-nameserver-history-viewer.mjs.map +0 -1
  78. package/fesm2020/ngx-hana-nameserver-history-viewer.mjs.map +0 -1
  79. package/ngx-hana-nameserver-history-viewer.d.ts +0 -5
  80. package/public-api.d.ts +0 -1
  81. package/src/nameserver-history-viewer/components/alert/alert.component.d.ts +0 -21
  82. package/src/nameserver-history-viewer/components/alert/alert.module.d.ts +0 -8
  83. package/src/nameserver-history-viewer/components/alert/index.d.ts +0 -2
  84. package/src/nameserver-history-viewer/components/file-drop-input/file-drop-input.component.d.ts +0 -16
  85. package/src/nameserver-history-viewer/components/file-drop-input/index.d.ts +0 -1
  86. package/src/nameserver-history-viewer/components/index.d.ts +0 -8
  87. package/src/nameserver-history-viewer/components/instruction/index.d.ts +0 -1
  88. package/src/nameserver-history-viewer/components/instruction/instruction.component.d.ts +0 -17
  89. package/src/nameserver-history-viewer/components/nameserver-history.component.d.ts +0 -262
  90. package/src/nameserver-history-viewer/components/port-selector/index.d.ts +0 -1
  91. package/src/nameserver-history-viewer/components/port-selector/port-selector.component.d.ts +0 -31
  92. package/src/nameserver-history-viewer/components/port-selector/port-selector.service.d.ts +0 -14
  93. package/src/nameserver-history-viewer/components/progress-bar/index.d.ts +0 -1
  94. package/src/nameserver-history-viewer/components/progress-bar/progress-bar.component.d.ts +0 -6
  95. package/src/nameserver-history-viewer/components/time-range-selector/index.d.ts +0 -1
  96. package/src/nameserver-history-viewer/components/time-range-selector/time-range-selector.component.d.ts +0 -19
  97. package/src/nameserver-history-viewer/components/timezone-selector/index.d.ts +0 -1
  98. package/src/nameserver-history-viewer/components/timezone-selector/timezone-selector.component.d.ts +0 -26
  99. package/src/nameserver-history-viewer/components/timezone-selector/timezone-selector.service.d.ts +0 -21
  100. package/src/nameserver-history-viewer/index.d.ts +0 -2
  101. package/src/nameserver-history-viewer/nameserver-history.module.d.ts +0 -19
  102. package/src/nameserver-history-viewer/services/chart.service.d.ts +0 -59
  103. package/src/nameserver-history-viewer/services/file.service.d.ts +0 -63
  104. package/src/nameserver-history-viewer/services/index.d.ts +0 -3
  105. package/src/nameserver-history-viewer/services/ui.service.d.ts +0 -88
  106. package/src/nameserver-history-viewer/types/abort.types.d.ts +0 -4
  107. package/src/nameserver-history-viewer/types/alert.types.d.ts +0 -6
  108. package/src/nameserver-history-viewer/types/chart-content-data-item.types.d.ts +0 -4
  109. package/src/nameserver-history-viewer/types/chart-content-data.types.d.ts +0 -4
  110. package/src/nameserver-history-viewer/types/chart-content-header.types.d.ts +0 -4
  111. package/src/nameserver-history-viewer/types/chart-content-time.types.d.ts +0 -3
  112. package/src/nameserver-history-viewer/types/chart-content.types.d.ts +0 -10
  113. package/src/nameserver-history-viewer/types/color-rgba.types.d.ts +0 -6
  114. package/src/nameserver-history-viewer/types/html-element.type.d.ts +0 -7
  115. package/src/nameserver-history-viewer/types/index.d.ts +0 -27
  116. package/src/nameserver-history-viewer/types/item.types.d.ts +0 -12
  117. package/src/nameserver-history-viewer/types/legend-color.types.d.ts +0 -4
  118. package/src/nameserver-history-viewer/types/load-history-info-backup.types.d.ts +0 -7
  119. package/src/nameserver-history-viewer/types/load-history-info-columnstore.types.d.ts +0 -7
  120. package/src/nameserver-history-viewer/types/load-history-info-host.types.d.ts +0 -15
  121. package/src/nameserver-history-viewer/types/load-history-info-item.types.d.ts +0 -13
  122. package/src/nameserver-history-viewer/types/load-history-info-persistence.types.d.ts +0 -11
  123. package/src/nameserver-history-viewer/types/load-history-info-rowstore.types.d.ts +0 -5
  124. package/src/nameserver-history-viewer/types/load-history-info-server.types.d.ts +0 -10
  125. package/src/nameserver-history-viewer/types/load-history-info-session-admission-control.types.d.ts +0 -10
  126. package/src/nameserver-history-viewer/types/load-history-info-sql.types.d.ts +0 -16
  127. package/src/nameserver-history-viewer/types/load-history-info-sync-primitives.types.d.ts +0 -5
  128. package/src/nameserver-history-viewer/types/load-history-info-threads.types.d.ts +0 -9
  129. package/src/nameserver-history-viewer/types/load-history-info.types.d.ts +0 -22
  130. package/src/nameserver-history-viewer/types/port.types.d.ts +0 -5
  131. package/src/nameserver-history-viewer/types/scale-group.types.d.ts +0 -15
  132. package/src/nameserver-history-viewer/types/unit-category.types.d.ts +0 -8
  133. package/src/nameserver-history-viewer/types/unit.types.d.ts +0 -12
  134. package/src/nameserver-history-viewer/utils/chart-util.d.ts +0 -14
  135. package/src/nameserver-history-viewer/utils/chartjs-downsample/chartjs_ext.d.ts +0 -89
  136. package/src/nameserver-history-viewer/utils/chartjs-downsample/data_culling.d.ts +0 -32
  137. package/src/nameserver-history-viewer/utils/chartjs-downsample/data_mipmap.d.ts +0 -78
  138. package/src/nameserver-history-viewer/utils/chartjs-downsample/index.d.ts +0 -1
  139. package/src/nameserver-history-viewer/utils/chartjs-downsample/lttb_data_mipmap.d.ts +0 -57
  140. package/src/nameserver-history-viewer/utils/chartjs-downsample/responsive_downsample_plugin.d.ts +0 -55
  141. package/src/nameserver-history-viewer/utils/chartjs-downsample/utils.d.ts +0 -64
  142. package/src/nameserver-history-viewer/utils/chartjs-zoom/chart.zoom.d.ts +0 -30
  143. package/src/nameserver-history-viewer/utils/chartjs-zoom/index.d.ts +0 -1
  144. package/src/nameserver-history-viewer/utils/file-util.d.ts +0 -68
  145. package/src/nameserver-history-viewer/utils/index.d.ts +0 -4
  146. package/src/nameserver-history-viewer/utils/time-util.d.ts +0 -23
  147. package/src/nameserver-history-viewer/utils/ui-util.d.ts +0 -41
@@ -1,328 +0,0 @@
1
- import { Injectable } from '@angular/core';
2
- import { Chart } from 'chart.js';
3
- import { getColorString, getNumberWithCommas, randomColor } from '../utils';
4
- import { UIService } from './ui.service';
5
- import { Item, Unit } from '../types';
6
- import * as i0 from "@angular/core";
7
- // Using dynamic flag to fix the issue of ng-packagr #696: Lambda not supported
8
- // @dynamic
9
- export class ChartService {
10
- /**
11
- * toggle the dataset status of the chart, synchronously
12
- */
13
- static _toggleDataSet(dataSetIndex, chart, hidden) {
14
- // meta.hidden = false and dataset.hidden = false --> show
15
- // meta.hidden = false and dataset.hidden = true --> show
16
- // meta.hidden = null and dataset.hidden = false -> show
17
- // meta.hidden = null and dataset.hidden = true -> hide
18
- // in the first case (false, false), needs to click legend twice to
19
- // hide the dataset, because the first click only set meta.hidden = null)
20
- if (dataSetIndex != null && chart != null) {
21
- const meta = chart.getDatasetMeta(dataSetIndex);
22
- if (meta) {
23
- if (!hidden) {
24
- // display the item, if dataset hidden is false, set hidden of meta to null,
25
- meta.hidden = !chart.data.datasets[dataSetIndex].hidden ? null : hidden;
26
- }
27
- else {
28
- meta.hidden = hidden;
29
- }
30
- }
31
- }
32
- }
33
- static _restoreDataSetStatus(chart, datasetIndex, status) {
34
- if (chart && chart.data && chart.data.datasets && chart.getDatasetMeta(datasetIndex) && status) {
35
- chart.data.datasets[datasetIndex].hidden = status.datasetStatus;
36
- chart.getDatasetMeta(datasetIndex).hidden = status.metaStatus;
37
- }
38
- }
39
- /**
40
- * initialize/clear the configuration for the chart
41
- */
42
- static _initConfig(chart) {
43
- // init data sets
44
- if (chart.data && chart.data.datasets) {
45
- chart.data.datasets.length = 0;
46
- chart.data.datasets = void 0;
47
- chart.data = void 0;
48
- }
49
- // init options
50
- if (chart.options && chart.options.scales && (chart.options.scales.xAxes || chart.options.scales.yAxis)) {
51
- if (chart.options.scales.xAxes) {
52
- chart.options.scales.xAxes.length = 0;
53
- chart.options.scales.xAxes = void 0;
54
- }
55
- if (chart.options.scales.yAxes) {
56
- chart.options.scales.yAxes.length = 0;
57
- chart.options.scales.yAxes = void 0;
58
- }
59
- chart.options.scales = void 0;
60
- chart.options = void 0;
61
- }
62
- }
63
- /**
64
- * Generate DataSets by the data and header information
65
- */
66
- static _generateDataSets(data, header, headerKey, defaultItems) {
67
- const alpha = 0.5;
68
- const colors = UIService.getColors(alpha);
69
- return data.map((item, i) => {
70
- const color = colors[headerKey[i]] ? getColorString(colors[headerKey[i]]) : randomColor(alpha);
71
- return {
72
- borderColor: color,
73
- backgroundColor: color,
74
- borderWidth: 1.25,
75
- spanGaps: false,
76
- label: header[i],
77
- data: data[i],
78
- fill: false,
79
- yAxisID: `y-axis-${i}`,
80
- hidden: !defaultItems.includes(header[i])
81
- };
82
- });
83
- }
84
- static _generateXAxes(time) {
85
- const format = 'MMMDD HH:mm:ss';
86
- return [
87
- {
88
- type: 'time',
89
- time: {
90
- // unit: 'second',
91
- // stepSize: 1,
92
- displayFormats: {
93
- 'millisecond': format,
94
- 'second': format,
95
- 'minute': format,
96
- 'hour': 'MMMDD HH',
97
- 'day': 'MMMDD YYYY',
98
- 'week': format,
99
- 'month': format,
100
- 'quarter': format,
101
- 'year': format,
102
- },
103
- tooltipFormat: 'll HH:mm:ss',
104
- min: time[0],
105
- max: time[time.length - 1]
106
- },
107
- // scaleLabel: {
108
- // display: false,
109
- // labelString: 'Date'
110
- // },
111
- ticks: {
112
- maxRotation: 0,
113
- reverse: true
114
- }
115
- }
116
- ];
117
- }
118
- static _generateYAxes(data, yScale) {
119
- return data.map((item, i) => ({
120
- type: 'linear',
121
- display: false,
122
- position: 'left',
123
- id: `y-axis-${i}`,
124
- gridLines: {},
125
- ticks: {
126
- min: 0,
127
- max: yScale[i]
128
- }
129
- }));
130
- }
131
- /**
132
- * generate configuration for chart
133
- */
134
- static _generateChartConfig(time, data, yScale, header, headerKey, selection, tableSource, title, defaultItems, zoomCallback) {
135
- return {
136
- type: 'line',
137
- data: {
138
- datasets: ChartService._generateDataSets(data, header, headerKey, defaultItems)
139
- },
140
- options: {
141
- elements: { point: { radius: 0, hitRadius: 5, hoverRadius: 5 } },
142
- responsive: true,
143
- animation: {
144
- duration: 0, // general animation time
145
- },
146
- hover: {
147
- animationDuration: 0,
148
- onHover: function (e) {
149
- const point = this.getElementAtEvent(e);
150
- if (point.length) {
151
- e.target.style.cursor = 'pointer';
152
- }
153
- else {
154
- e.target.style.cursor = 'default';
155
- }
156
- }
157
- },
158
- responsiveAnimationDuration: 0,
159
- legend: {
160
- position: 'bottom',
161
- onHover: (e) => {
162
- e.target.style.cursor = 'pointer';
163
- },
164
- labels: {
165
- filter: (legendItem) => selection.isSelected(tableSource.find(row => legendItem.text === row.KPI))
166
- }
167
- },
168
- title: {
169
- display: true,
170
- text: title
171
- },
172
- responsiveDownsample: {
173
- enabled: true,
174
- desiredDataPointDistance: 2,
175
- minNumPoints: 200,
176
- maxNumPointsToDraw: 100
177
- },
178
- tooltips: {
179
- callbacks: {
180
- label: function (tooltipItem, chartData) {
181
- // format numbers with commas and add unit information
182
- const label = chartData.datasets[tooltipItem.datasetIndex].label || '';
183
- if (label) {
184
- // get unit (eg: MB, GB, MB/s, % and so on)
185
- const rowItem = tableSource.find(controlTableRow => label === controlTableRow.KPI) || '';
186
- const unit = rowItem[Item.unit] && rowItem[Item.unit] !== Unit.PCT ? ` ${rowItem[Item.unit]}` : rowItem[Item.unit] || '';
187
- return `${label}: ${getNumberWithCommas(tooltipItem.yLabel)}${unit}`;
188
- }
189
- else {
190
- return getNumberWithCommas(tooltipItem.yLabel);
191
- }
192
- }
193
- }
194
- },
195
- scales: {
196
- xAxes: ChartService._generateXAxes(time),
197
- yAxes: ChartService._generateYAxes(data, yScale)
198
- },
199
- zoom: {
200
- enabled: true,
201
- drag: true,
202
- mode: 'x',
203
- onZoom: zoomCallback
204
- }
205
- }
206
- };
207
- }
208
- _getDataSetIndexByLabel(label, chart) {
209
- if (chart.data && chart.data.datasets) {
210
- return chart.data.datasets.findIndex(dataset => dataset.label === label);
211
- }
212
- return -1;
213
- }
214
- /**
215
- * destroy the chart, release the resource of the chart
216
- */
217
- _destroyChart(chart) {
218
- return new Promise((resolve) => {
219
- if (chart) {
220
- chart.destroy();
221
- }
222
- resolve();
223
- });
224
- }
225
- /**
226
- * update/refresh the chart
227
- */
228
- _updateChart(chart) {
229
- return new Promise((resolve, reject) => {
230
- if (chart) {
231
- chart.update();
232
- resolve();
233
- }
234
- else {
235
- reject('Updating chart failed, error: the chart object is empty.');
236
- }
237
- });
238
- }
239
- /**
240
- * reset zoom of the chart
241
- */
242
- _resetZoom(chart) {
243
- return new Promise((resolve, reject) => {
244
- if (chart) {
245
- const datasetStatusBeforeReset = [];
246
- if (chart.data && chart.data.datasets) {
247
- chart.data.datasets.forEach((dataset, index) => {
248
- const meta = chart.getDatasetMeta(index);
249
- if (meta) {
250
- datasetStatusBeforeReset[index] = { metaStatus: meta.hidden, datasetStatus: dataset.hidden };
251
- }
252
- else {
253
- reject(`Internal error, can not find the meta ${index}.`);
254
- }
255
- });
256
- }
257
- chart.resetZoom();
258
- resolve(datasetStatusBeforeReset);
259
- }
260
- else {
261
- reject('Resetting chart failed, error: the chart object is empty.');
262
- }
263
- });
264
- }
265
- /**
266
- * Reset Chart to initial status
267
- * If legend is already selected/unselected from the list, it wouldn't be restored.
268
- * @param dataSourceData the data sets of the chart
269
- * @param selection selection status list
270
- */
271
- resetChart(dataSourceData, selection) {
272
- return this._resetZoom(this._chart).then((datasetStatusBeforeZoom) => {
273
- // reset the data set by the selection status
274
- dataSourceData.filter(row => !row.header).forEach(row => {
275
- const index = this._getDataSetIndexByLabel(row.KPI, this._chart);
276
- if (!selection.isSelected(row)) {
277
- ChartService._toggleDataSet(index, this._chart, true);
278
- }
279
- else {
280
- ChartService._restoreDataSetStatus(this._chart, index, datasetStatusBeforeZoom[index]);
281
- }
282
- });
283
- return this._updateChart(this._chart);
284
- });
285
- }
286
- /**
287
- * destroy the chart and reinitialize the configuration of the chart
288
- */
289
- destroyChart() {
290
- return this._destroyChart(this._chart).then(() => {
291
- if (this._chart) {
292
- ChartService._initConfig(this._chart);
293
- this._chart = void 0;
294
- }
295
- });
296
- }
297
- /**
298
- * generate configuration for chart and create the chart object.
299
- */
300
- buildChart(time, data, yScale, header, headerKey, selection, tableSource, title, defaultItems, zoomCB) {
301
- return new Promise((resolve, reject) => {
302
- const ctx = document.getElementById('chartNameServerHistory')?.getContext('2d');
303
- if (ctx) {
304
- const cfg = ChartService._generateChartConfig(time, data, yScale, header, headerKey, selection, tableSource, title, defaultItems, zoomCB);
305
- this._chart = new Chart(ctx, cfg);
306
- resolve();
307
- }
308
- else {
309
- reject('Can not find the canvas.');
310
- }
311
- });
312
- }
313
- /**
314
- * show/hide the relative data set
315
- */
316
- toggleDataInChart(label, hide) {
317
- return new Promise((resolve) => {
318
- ChartService._toggleDataSet(this._getDataSetIndexByLabel(label, this._chart), this._chart, hide);
319
- resolve(this._updateChart(this._chart));
320
- });
321
- }
322
- }
323
- ChartService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: ChartService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
324
- ChartService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: ChartService });
325
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: ChartService, decorators: [{
326
- type: Injectable
327
- }] });
328
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhcnQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9uYW1lc2VydmVyLWhpc3Rvcnktdmlld2VyL3NlcnZpY2VzL2NoYXJ0LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUzQyxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ2pDLE9BQU8sRUFBRSxjQUFjLEVBQUUsbUJBQW1CLEVBQUUsV0FBVyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQzVFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDekMsT0FBTyxFQUFxQyxJQUFJLEVBQUUsSUFBSSxFQUFFLE1BQU0sVUFBVSxDQUFDOztBQUV6RSwrRUFBK0U7QUFDL0UsV0FBVztBQUVYLE1BQU0sT0FBTyxZQUFZO0lBR3ZCOztPQUVHO0lBQ0ssTUFBTSxDQUFDLGNBQWMsQ0FBQyxZQUFvQixFQUFFLEtBQVksRUFBRSxNQUFlO1FBQy9FLDBEQUEwRDtRQUMxRCx5REFBeUQ7UUFDekQsd0RBQXdEO1FBQ3hELHVEQUF1RDtRQUN2RCxtRUFBbUU7UUFDbkUseUVBQXlFO1FBQ3pFLElBQUksWUFBWSxJQUFJLElBQUksSUFBSSxLQUFLLElBQUksSUFBSSxFQUFFO1lBQ3pDLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDaEQsSUFBSSxJQUFJLEVBQUU7Z0JBQ1IsSUFBSSxDQUFDLE1BQU0sRUFBRTtvQkFDWCw0RUFBNEU7b0JBQzVFLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO2lCQUN6RTtxQkFBTTtvQkFDTCxJ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QUFDLENBQUM7YUFDcEM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNJLGlCQUFpQixDQUFDLEtBQWEsRUFBRSxJQUFhO1FBQ25ELE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtZQUM3QixZQUFZLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDakcsT0FBTyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDMUMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDOzswR0E5VVUsWUFBWTs4R0FBWixZQUFZOzRGQUFaLFlBQVk7a0JBRHhCLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFNlbGVjdGlvbk1vZGVsIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvbGxlY3Rpb25zJztcclxuaW1wb3J0IHsgQ2hhcnQgfSBmcm9tICdjaGFydC5qcyc7XHJcbmltcG9ydCB7IGdldENvbG9yU3RyaW5nLCBnZXROdW1iZXJXaXRoQ29tbWFzLCByYW5kb21Db2xvciB9IGZyb20gJy4uL3V0aWxzJztcclxuaW1wb3J0IHsgVUlTZXJ2aWNlIH0gZnJvbSAnLi91aS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQ2hhcnRDb250ZW50RGF0YUl0ZW0sIExlZ2VuZENvbG9yLCBJdGVtLCBVbml0IH0gZnJvbSAnLi4vdHlwZXMnO1xyXG5cclxuLy8gVXNpbmcgZHluYW1pYyBmbGFnIHRvIGZpeCB0aGUgaXNzdWUgb2YgbmctcGFja2FnciAjNjk2OiBMYW1iZGEgbm90IHN1cHBvcnRlZFxyXG4vLyBAZHluYW1pY1xyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBDaGFydFNlcnZpY2Uge1xyXG4gIHByaXZhdGUgX2NoYXJ0OiBDaGFydDtcclxuXHJcbiAgLyoqXHJcbiAgICogdG9nZ2xlIHRoZSBkYXRhc2V0IHN0YXR1cyBvZiB0aGUgY2hhcnQsIHN5bmNocm9ub3VzbHlcclxuICAgKi9cclxuICBwcml2YXRlIHN0YXRpYyBfdG9nZ2xlRGF0YVNldChkYXRhU2V0SW5kZXg6IG51bWJlciwgY2hhcnQ6IENoYXJ0LCBoaWRkZW46IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIC8vIG1ldGEuaGlkZGVuID0gZmFsc2UgYW5kIGRhdGFzZXQuaGlkZGVuID0gZmFsc2UgLS0+IHNob3dcclxuICAgIC8vIG1ldGEuaGlkZGVuID0gZmFsc2UgYW5kIGRhdGFzZXQuaGlkZGVuID0gdHJ1ZSAtLT4gc2hvd1xyXG4gICAgLy8gbWV0YS5oaWRkZW4gPSBudWxsIGFuZCBkYXRhc2V0LmhpZGRlbiA9IGZhbHNlIC0+IHNob3dcclxuICAgIC8vIG1ldGEuaGlkZGVuID0gbnVsbCBhbmQgZGF0YXNldC5oaWRkZW4gPSB0cnVlIC0+IGhpZGVcclxuICAgIC8vIGluIHRoZSBmaXJzdCBjYXNlIChmYWxzZSwgZmFsc2UpLCBuZWVkcyB0byBjbGljayBsZWdlbmQgdHdpY2UgdG9cclxuICAgIC8vIGhpZGUgdGhlIGRhdGFzZXQsIGJlY2F1c2UgdGhlIGZpcnN0IGNsaWNrIG9ubHkgc2V0IG1ldGEuaGlkZGVuID0gbnVsbClcclxuICAgIGlmIChkYXRhU2V0SW5kZXggIT0gbnVsbCAmJiBjaGFydCAhPSBudWxsKSB7XHJcbiAgICAgIGNvbnN0IG1ldGEgPSBjaGFydC5nZXREYXRhc2V0TWV0YShkYXRhU2V0SW5kZXgpO1xyXG4gICAgICBpZiAobWV0YSkge1xyXG4gICAgICAgIGlmICghaGlkZGVuKSB7XHJcbiAgICAgICAgICAvLyBkaXNwbGF5IHRoZSBpdGVtLCBpZiBkYXRhc2V0IGhpZGRlbiBpcyBmYWxzZSwgc2V0IGhpZGRlbiBvZiBtZXRhIHRvIG51bGwsXHJcbiAgICAgICAgICBtZXRhLmhpZGRlbiA9ICFjaGFydC5kYXRhLmRhdGFzZXRzW2RhdGFTZXRJbmRleF0uaGlkZGVuID8gbnVsbCA6IGhpZGRlbjtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgbWV0YS5oaWRkZW4gPSBoaWRkZW47XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG4gIHByaXZhdGUgc3RhdGljIF9yZXN0b3JlRGF0YVNldFN0YXR1cyhjaGFydDogQ2hhcnQsIGRhdGFzZXRJbmRleDogbnVtYmVyLCBzdGF0dXM6IHttZXRhU3RhdHVzOiBib29sZWFuLCBkYXRhc2V0U3RhdHVzOiBib29sZWFufSk6IHZvaWQge1xyXG4gICAgaWYgKGNoYXJ0ICYmIGNoYXJ0LmRhdGEgJiYgY2hhcnQuZGF0YS5kYXRhc2V0cyAmJiBjaGFydC5nZXREYXRhc2V0TWV0YShkYXRhc2V0SW5kZXgpICYmIHN0YXR1cykge1xyXG4gICAgICBjaGFydC5kYXRhLmRhdGFzZXRzW2RhdGFzZXRJbmRleF0uaGlkZGVuID0gc3RhdHVzLmRhdGFzZXRTdGF0dXM7XHJcbiAgICAgIGNoYXJ0LmdldERhdGFzZXRNZXRhKGRhdGFzZXRJbmRleCkuaGlkZGVuID0gc3RhdHVzLm1ldGFTdGF0dXM7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBpbml0aWFsaXplL2NsZWFyIHRoZSBjb25maWd1cmF0aW9uIGZvciB0aGUgY2hhcnRcclxuICAgKi9cclxuICBwcml2YXRlIHN0YXRpYyBfaW5pdENvbmZpZyhjaGFydDogYW55KTogdm9pZCB7XHJcbiAgICAvLyBpbml0IGRhdGEgc2V0c1xyXG4gICAgaWYgKGNoYXJ0LmRhdGEgJiYgY2hhcnQuZGF0YS5kYXRhc2V0cykge1xyXG4gICAgICBjaGFydC5kYXRhLmRhdGFzZXRzLmxlbmd0aCA9IDA7XHJcbiAgICAgIGNoYXJ0LmRhdGEuZGF0YXNldHMgPSB2b2lkIDA7XHJcbiAgICAgIGNoYXJ0LmRhdGEgPSB2b2lkIDA7XHJcbiAgICB9XHJcbiAgICAvLyBpbml0IG9wdGlvbnNcclxuICAgIGlmIChjaGFydC5vcHRpb25zICYmIGNoYXJ0Lm9wdGlvbnMuc2NhbGVzICYmIChjaGFydC5vcHRpb25zLnNjYWxlcy54QXhlcyB8fCBjaGFydC5vcHRpb25zLnNjYWxlcy55QXhpcykpIHtcclxuICAgICAgaWYgKGNoYXJ0Lm9wdGlvbnMuc2NhbGVzLnhBeGVzKSB7XHJcbiAgICAgICAgY2hhcnQub3B0aW9ucy5zY2FsZXMueEF4ZXMubGVuZ3RoID0gMDtcclxuICAgICAgICBjaGFydC5vcHRpb25zLnNjYWxlcy54QXhlcyA9IHZvaWQgMDtcclxuICAgICAgfVxyXG4gICAgICBpZiAoY2hhcnQub3B0aW9ucy5zY2FsZXMueUF4ZXMpIHtcclxuICAgICAgICBjaGFydC5vcHRpb25zLnNjYWxlcy55QXhlcy5sZW5ndGggPSAwO1xyXG4gICAgICAgIGNoYXJ0Lm9wdGlvbnMuc2NhbGVzLnlBeGVzID0gdm9pZCAwO1xyXG4gICAgICB9XHJcbiAgICAgIGNoYXJ0Lm9wdGlvbnMuc2NhbGVzID0gdm9pZCAwO1xyXG4gICAgICBjaGFydC5vcHRpb25zID0gdm9pZCAwO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2VuZXJhdGUgRGF0YVNldHMgYnkgdGhlIGRhdGEgYW5kIGhlYWRlciBpbmZvcm1hdGlvblxyXG4gICAqL1xyXG4gIHByaXZhdGUgc3RhdGljIF9nZW5lcmF0ZURhdGFTZXRzKGRhdGE6IENoYXJ0Q29udGVudERhdGFJdGVtW11bXSwgaGVhZGVyOiBzdHJpbmdbXSwgaGVhZGVyS2V5OiBzdHJpbmdbXSwgZGVmYXVsdEl0ZW1zOiBzdHJpbmdbXSk6IGFueSB7XHJcbiAgICBjb25zdCBhbHBoYSA9IDAuNTtcclxuICAgIGNvbnN0IGNvbG9yczogTGVnZW5kQ29sb3IgPSBVSVNlcnZpY2UuZ2V0Q29sb3JzKGFscGhhKTtcclxuICAgIHJldHVybiBkYXRhLm1hcCgoaXRlbSwgaSkgPT4ge1xyXG4gICAgICBjb25zdCBjb2xvciA9IGNvbG9yc1toZWFkZXJLZXlbaV1dID8gZ2V0Q29sb3JTdHJpbmcoY29sb3JzW2hlYWRlcktleVtpXV0pIDogcmFuZG9tQ29sb3IoYWxwaGEpO1xyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIGJvcmRlckNvbG9yOiBjb2xvcixcclxuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IGNvbG9yLFxyXG4gICAgICAgIGJvcmRlcldpZHRoOiAxLjI1LFxyXG4gICAgICAgIHNwYW5HYXBzOiBmYWxzZSxcclxuICAgICAgICBsYWJlbDogaGVhZGVyW2ldLFxyXG4gICAgICAgIGRhdGE6IGRhdGFbaV0sXHJcbiAgICAgICAgZmlsbDogZmFsc2UsXHJcbiAgICAgICAgeUF4aXNJRDogYHktYXhpcy0ke2l9YCxcclxuICAgICAgICBoaWRkZW46ICFkZWZhdWx0SXRlbXMuaW5jbHVkZXMoaGVhZGVyW2ldKVxyXG4gICAgICB9O1xyXG4gICAgfSk7XHJcbiAgfVxyXG4gIHByaXZhdGUgc3RhdGljIF9nZW5lcmF0ZVhBeGVzKHRpbWU6IG51bWJlcltdKTogYW55IHtcclxuICAgIGNvbnN0IGZvcm1hdCA9ICdNTU1ERCBISDptbTpzcyc7XHJcbiAgICByZXR1cm4gW1xyXG4gICAgICB7XHJcbiAgICAgICAgdHlwZTogJ3RpbWUnLFxyXG4gICAgICAgIHRpbWU6IHtcclxuICAgICAgICAgIC8vIHVuaXQ6ICdzZWNvbmQnLFxyXG4gICAgICAgICAgLy8gc3RlcFNpemU6IDEsXHJcbiAgICAgICAgICBkaXNwbGF5Rm9ybWF0czoge1xyXG4gICAgICAgICAgICAnbWlsbGlzZWNvbmQnOiBmb3JtYXQsXHJcbiAgICAgICAgICAgICdzZWNvbmQnOiBmb3JtYXQsXHJcbiAgICAgICAgICAgICdtaW51dGUnOiBmb3JtYXQsXHJcbiAgICAgICAgICAgICdob3VyJzogJ01NTUREIEhIJyxcclxuICAgICAgICAgICAgJ2RheSc6ICdNTU1ERCBZWVlZJyxcclxuICAgICAgICAgICAgJ3dlZWsnOiBmb3JtYXQsXHJcbiAgICAgICAgICAgICdtb250aCc6IGZvcm1hdCxcclxuICAgICAgICAgICAgJ3F1YXJ0ZXInOiBmb3JtYXQsXHJcbiAgICAgICAgICAgICd5ZWFyJzogZm9ybWF0LFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHRvb2x0aXBGb3JtYXQ6ICdsbCBISDptbTpzcycsXHJcbiAgICAgICAgICBtaW46IHRpbWVbMF0sXHJcbiAgICAgICAgICBtYXg6IHRpbWVbdGltZS5sZW5ndGggLSAxXVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgLy8gc2NhbGVMYWJlbDoge1xyXG4gICAgICAgIC8vICAgZGlzcGxheTogZmFsc2UsXHJcbiAgICAgICAgLy8gICBsYWJlbFN0cmluZzogJ0RhdGUnXHJcbiAgICAgICAgLy8gfSxcclxuICAgICAgICB0aWNrczoge1xyXG4gICAgICAgICAgbWF4Um90YXRpb246IDAsXHJcbiAgICAgICAgICByZXZlcnNlOiB0cnVlXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICBdO1xyXG4gIH1cclxuICBwcml2YXRlIHN0YXRpYyBfZ2VuZXJhdGVZQXhlcyhkYXRhOiBDaGFydENvbnRlbnREYXRhSXRlbVtdW10sIHlTY2FsZTogbnVtYmVyW10pOiBhbnkge1xyXG4gICAgcmV0dXJuIGRhdGEubWFwKChpdGVtLCBpKSA9PiAoe1xyXG4gICAgICB0eXBlOiAnbGluZWFyJyxcclxuICAgICAgZGlzcGxheTogZmFsc2UsXHJcbiAgICAgIHBvc2l0aW9uOiAnbGVmdCcsXHJcbiAgICAgIGlkOiBgeS1heGlzLSR7aX1gLFxyXG4gICAgICBncmlkTGluZXM6IHtcclxuICAgICAgfSxcclxuICAgICAgdGlja3M6IHtcclxuICAgICAgICBtaW46IDAsXHJcbiAgICAgICAgbWF4OiB5U2NhbGVbaV1cclxuICAgICAgfVxyXG4gICAgfSkpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogZ2VuZXJhdGUgY29uZmlndXJhdGlvbiBmb3IgY2hhcnRcclxuICAgKi9cclxuICBwcml2YXRlIHN0YXRpYyBfZ2VuZXJhdGVDaGFydENvbmZpZyh0aW1lOiBudW1iZXJbXSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiBDaGFydENvbnRlbnREYXRhSXRlbVtdW10sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeVNjYWxlOiBudW1iZXJbXSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXI6IHN0cmluZ1tdLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcktleTogc3RyaW5nW10sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBTZWxlY3Rpb25Nb2RlbDxhbnk+LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlU291cmNlOiBhbnksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IHN0cmluZyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0SXRlbXM6IHN0cmluZ1tdLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpvb21DYWxsYmFjazogYW55KTogYW55IHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIHR5cGU6ICdsaW5lJyxcclxuICAgICAgZGF0YToge1xyXG4gICAgICAgIGRhdGFzZXRzOiBDaGFydFNlcnZpY2UuX2dlbmVyYXRlRGF0YVNldHMoZGF0YSwgaGVhZGVyLCBoZWFkZXJLZXksIGRlZmF1bHRJdGVtcylcclxuICAgICAgfSxcclxuICAgICAgb3B0aW9uczoge1xyXG4gICAgICAgIGVsZW1lbnRzOiB7cG9pbnQ6IHtyYWRpdXM6IDAsIGhpdFJhZGl1czogNSwgaG92ZXJSYWRpdXM6IDV9fSwgLy8gc2V0IHJhZGl1cyB0byAwIG5vdCB0byBkaXNwbGF5IHBvaW50XHJcbiAgICAgICAgcmVzcG9uc2l2ZTogdHJ1ZSxcclxuICAgICAgICBhbmltYXRpb246IHtcclxuICAgICAgICAgIGR1cmF0aW9uOiAwLCAvLyBnZW5lcmFsIGFuaW1hdGlvbiB0aW1lXHJcbiAgICAgICAgfSxcclxuICAgICAgICBob3Zlcjoge1xyXG4gICAgICAgICAgYW5pbWF0aW9uRHVyYXRpb246IDAsIC8vIGR1cmF0aW9uIG9mIGFuaW1hdGlvbnMgd2hlbiBob3ZlcmluZyBhbiBpdGVtXHJcbiAgICAgICAgICBvbkhvdmVyOiBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICBjb25zdCBwb2ludCA9IHRoaXMuZ2V0RWxlbWVudEF0RXZlbnQoZSk7XHJcbiAgICAgICAgICAgIGlmIChwb2ludC5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICBlLnRhcmdldC5zdHlsZS5jdXJzb3IgPSAncG9pbnRlcic7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgZS50YXJnZXQuc3R5bGUuY3Vyc29yID0gJ2RlZmF1bHQnO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICByZXNwb25zaXZlQW5pbWF0aW9uRHVyYXRpb246IDAsIC8vIGFuaW1hdGlvbiBkdXJhdGlvbiBhZnRlciBhIHJlc2l6ZVxyXG4gICAgICAgIGxlZ2VuZDoge1xyXG4gICAgICAgICAgcG9zaXRpb246ICdib3R0b20nLFxyXG4gICAgICAgICAgb25Ib3ZlcjogKGUpID0+IHtcclxuICAgICAgICAgICAgZS50YXJnZXQuc3R5bGUuY3Vyc29yID0gJ3BvaW50ZXInO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIGxhYmVsczoge1xyXG4gICAgICAgICAgICBmaWx0ZXI6IChsZWdlbmRJdGVtKSA9PiBzZWxlY3Rpb24uaXNTZWxlY3RlZCh0YWJsZVNvdXJjZS5maW5kKHJvdyA9PiBsZWdlbmRJdGVtLnRleHQgPT09IHJvdy5LUEkpKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgdGl0bGU6IHtcclxuICAgICAgICAgIGRpc3BsYXk6IHRydWUsXHJcbiAgICAgICAgICB0ZXh0OiB0aXRsZVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgcmVzcG9uc2l2ZURvd25zYW1wbGU6IHtcclxuICAgICAgICAgIGVuYWJsZWQ6IHRydWUsXHJcbiAgICAgICAgICBkZXNpcmVkRGF0YVBvaW50RGlzdGFuY2U6IDIsXHJcbiAgICAgICAgICBtaW5OdW1Qb2ludHM6IDIwMCxcclxuICAgICAgICAgIG1heE51bVBvaW50c1RvRHJhdzogMTAwXHJcbiAgICAgICAgfSxcclxuICAgICAgICB0b29sdGlwczoge1xyXG4gICAgICAgICAgY2FsbGJhY2tzOiB7XHJcbiAgICAgICAgICAgIGxhYmVsOiBmdW5jdGlvbih0b29sdGlwSXRlbSwgY2hhcnREYXRhKSB7XHJcbiAgICAgICAgICAgICAgLy8gZm9ybWF0IG51bWJlcnMgd2l0aCBjb21tYXMgYW5kIGFkZCB1bml0IGluZm9ybWF0aW9uXHJcbiAgICAgICAgICAgICAgY29uc3QgbGFiZWwgPSBjaGFydERhdGEuZGF0YXNldHNbdG9vbHRpcEl0ZW0uZGF0YXNldEluZGV4XS5sYWJlbCB8fCAnJztcclxuICAgICAgICAgICAgICBpZiAobGFiZWwpIHtcclxuICAgICAgICAgICAgICAgIC8vIGdldCB1bml0IChlZzogTUIsIEdCLCBNQi9zLCAlIGFuZCBzbyBvbilcclxuICAgICAgICAgICAgICAgIGNvbnN0IHJvd0l0ZW0gPSB0YWJsZVNvdXJjZS5maW5kKGNvbnRyb2xUYWJsZVJvdyA9PiBsYWJlbCA9PT0gY29udHJvbFRhYmxlUm93LktQSSkgfHwgJyc7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB1bml0ID0gcm93SXRlbVtJdGVtLnVuaXRdICYmIHJvd0l0ZW1bSXRlbS51bml0XSAhPT0gVW5pdC5QQ1QgPyBgICR7cm93SXRlbVtJdGVtLnVuaXRdfWAgOiByb3dJdGVtW0l0ZW0udW5pdF0gfHwgJyc7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYCR7bGFiZWx9OiAke2dldE51bWJlcldpdGhDb21tYXModG9vbHRpcEl0ZW0ueUxhYmVsKX0ke3VuaXR9YDtcclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGdldE51bWJlcldpdGhDb21tYXModG9vbHRpcEl0ZW0ueUxhYmVsKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIHNjYWxlczoge1xyXG4gICAgICAgICAgeEF4ZXM6IENoYXJ0U2VydmljZS5fZ2VuZXJhdGVYQXhlcyh0aW1lKSxcclxuICAgICAgICAgIHlBeGVzOiBDaGFydFNlcnZpY2UuX2dlbmVyYXRlWUF4ZXMoZGF0YSwgeVNjYWxlKVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgem9vbToge1xyXG4gICAgICAgICAgZW5hYmxlZDogdHJ1ZSxcclxuICAgICAgICAgIGRyYWc6IHRydWUsXHJcbiAgICAgICAgICBtb2RlOiAneCcsXHJcbiAgICAgICAgICBvblpvb206IHpvb21DYWxsYmFja1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2dldERhdGFTZXRJbmRleEJ5TGFiZWwobGFiZWw6IHN0cmluZywgY2hhcnQ6IENoYXJ0KTogbnVtYmVyIHtcclxuICAgIGlmIChjaGFydC5kYXRhICYmIGNoYXJ0LmRhdGEuZGF0YXNldHMpIHtcclxuICAgICAgcmV0dXJuIGNoYXJ0LmRhdGEuZGF0YXNldHMuZmluZEluZGV4KGRhdGFzZXQgPT4gZGF0YXNldC5sYWJlbCA9PT0gbGFiZWwpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIC0xO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogZGVzdHJveSB0aGUgY2hhcnQsIHJlbGVhc2UgdGhlIHJlc291cmNlIG9mIHRoZSBjaGFydFxyXG4gICAqL1xyXG4gIHByaXZhdGUgX2Rlc3Ryb3lDaGFydChjaGFydDogQ2hhcnQpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xyXG4gICAgICBpZiAoY2hhcnQpIHtcclxuICAgICAgICBjaGFydC5kZXN0cm95KCk7XHJcbiAgICAgIH1cclxuICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIHVwZGF0ZS9yZWZyZXNoIHRoZSBjaGFydFxyXG4gICAqL1xyXG4gIHByaXZhdGUgX3VwZGF0ZUNoYXJ0KGNoYXJ0OiBDaGFydCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgaWYgKGNoYXJ0KSB7XHJcbiAgICAgICAgY2hhcnQudXBkYXRlKCk7XHJcbiAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJlamVjdCgnVXBkYXRpbmcgY2hhcnQgZmFpbGVkLCBlcnJvcjogdGhlIGNoYXJ0IG9iamVjdCBpcyBlbXB0eS4nKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiByZXNldCB6b29tIG9mIHRoZSBjaGFydFxyXG4gICAqL1xyXG4gIHByaXZhdGUgX3Jlc2V0Wm9vbShjaGFydDogYW55KTogUHJvbWlzZTx7bWV0YVN0YXR1czogYm9vbGVhbiwgZGF0YXNldFN0YXR1czogYm9vbGVhbn1bXT4ge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgaWYgKGNoYXJ0KSB7XHJcbiAgICAgICAgY29uc3QgZGF0YXNldFN0YXR1c0JlZm9yZVJlc2V0ID0gW107XHJcbiAgICAgICAgaWYgKGNoYXJ0LmRhdGEgJiYgY2hhcnQuZGF0YS5kYXRhc2V0cykge1xyXG4gICAgICAgICAgY2hhcnQuZGF0YS5kYXRhc2V0cy5mb3JFYWNoKChkYXRhc2V0LCBpbmRleCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBtZXRhID0gY2hhcnQuZ2V0RGF0YXNldE1ldGEoaW5kZXgpO1xyXG4gICAgICAgICAgICBpZiAobWV0YSkge1xyXG4gICAgICAgICAgICAgIGRhdGFzZXRTdGF0dXNCZWZvcmVSZXNldFtpbmRleF0gPSB7bWV0YVN0YXR1czogbWV0YS5oaWRkZW4sIGRhdGFzZXRTdGF0dXM6IGRhdGFzZXQuaGlkZGVufTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICByZWplY3QoYEludGVybmFsIGVycm9yLCBjYW4gbm90IGZpbmQgdGhlIG1ldGEgJHtpbmRleH0uYCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjaGFydC5yZXNldFpvb20oKTtcclxuICAgICAgICByZXNvbHZlKGRhdGFzZXRTdGF0dXNCZWZvcmVSZXNldCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmVqZWN0KCdSZXNldHRpbmcgY2hhcnQgZmFpbGVkLCBlcnJvcjogdGhlIGNoYXJ0IG9iamVjdCBpcyBlbXB0eS4nKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFJlc2V0IENoYXJ0IHRvIGluaXRpYWwgc3RhdHVzXHJcbiAgICogSWYgbGVnZW5kIGlzIGFscmVhZHkgc2VsZWN0ZWQvdW5zZWxlY3RlZCBmcm9tIHRoZSBsaXN0LCBpdCB3b3VsZG4ndCBiZSByZXN0b3JlZC5cclxuICAgKiBAcGFyYW0gZGF0YVNvdXJjZURhdGEgdGhlIGRhdGEgc2V0cyBvZiB0aGUgY2hhcnRcclxuICAgKiBAcGFyYW0gc2VsZWN0aW9uIHNlbGVjdGlvbiBzdGF0dXMgbGlzdFxyXG4gICAqL1xyXG4gIHB1YmxpYyByZXNldENoYXJ0KGRhdGFTb3VyY2VEYXRhOiBhbnksIHNlbGVjdGlvbjogU2VsZWN0aW9uTW9kZWw8YW55Pik6IFByb21pc2UgPGFueT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3Jlc2V0Wm9vbSh0aGlzLl9jaGFydCkudGhlbigoZGF0YXNldFN0YXR1c0JlZm9yZVpvb20pID0+IHtcclxuICAgICAgLy8gcmVzZXQgdGhlIGRhdGEgc2V0IGJ5IHRoZSBzZWxlY3Rpb24gc3RhdHVzXHJcbiAgICAgIGRhdGFTb3VyY2VEYXRhLmZpbHRlcihyb3cgPT4gIXJvdy5oZWFkZXIpLmZvckVhY2gocm93ID0+IHtcclxuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuX2dldERhdGFTZXRJbmRleEJ5TGFiZWwocm93LktQSSwgdGhpcy5fY2hhcnQpO1xyXG4gICAgICAgIGlmICghc2VsZWN0aW9uLmlzU2VsZWN0ZWQocm93KSkge1xyXG4gICAgICAgICAgQ2hhcnRTZXJ2aWNlLl90b2dnbGVEYXRhU2V0KGluZGV4LCB0aGlzLl9jaGFydCwgdHJ1ZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIENoYXJ0U2VydmljZS5fcmVzdG9yZURhdGFTZXRTdGF0dXModGhpcy5fY2hhcnQsIGluZGV4LCBkYXRhc2V0U3RhdHVzQmVmb3JlWm9vbVtpbmRleF0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICAgIHJldHVybiB0aGlzLl91cGRhdGVDaGFydCh0aGlzLl9jaGFydCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIGRlc3Ryb3kgdGhlIGNoYXJ0IGFuZCByZWluaXRpYWxpemUgdGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIGNoYXJ0XHJcbiAgICovXHJcbiAgcHVibGljIGRlc3Ryb3lDaGFydCgpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2Rlc3Ryb3lDaGFydCh0aGlzLl9jaGFydCkudGhlbigoKSA9PiB7XHJcbiAgICAgIGlmICh0aGlzLl9jaGFydCkge1xyXG4gICAgICAgIENoYXJ0U2VydmljZS5faW5pdENvbmZpZyh0aGlzLl9jaGFydCk7XHJcbiAgICAgICAgdGhpcy5fY2hhcnQgPSB2b2lkIDA7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogZ2VuZXJhdGUgY29uZmlndXJhdGlvbiBmb3IgY2hhcnQgYW5kIGNyZWF0ZSB0aGUgY2hhcnQgb2JqZWN0LlxyXG4gICAqL1xyXG4gIHB1YmxpYyBidWlsZENoYXJ0KHRpbWU6IG51bWJlcltdLFxyXG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IENoYXJ0Q29udGVudERhdGFJdGVtW11bXSxcclxuICAgICAgICAgICAgICAgICAgICB5U2NhbGU6IG51bWJlcltdLFxyXG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcjogc3RyaW5nW10sXHJcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyS2V5OiBzdHJpbmdbXSxcclxuICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFNlbGVjdGlvbk1vZGVsPGFueT4sXHJcbiAgICAgICAgICAgICAgICAgICAgdGFibGVTb3VyY2U6IGFueSxcclxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogc3RyaW5nLFxyXG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHRJdGVtczogc3RyaW5nW10sXHJcbiAgICAgICAgICAgICAgICAgICAgem9vbUNCKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICBjb25zdCBjdHggPSAoPEhUTUxDYW52YXNFbGVtZW50PiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2hhcnROYW1lU2VydmVySGlzdG9yeScpKT8uZ2V0Q29udGV4dCgnMmQnKTtcclxuICAgICAgaWYgKGN0eCkge1xyXG4gICAgICAgIGNvbnN0IGNmZzogYW55ID0gQ2hhcnRTZXJ2aWNlLl9nZW5lcmF0ZUNoYXJ0Q29uZmlnKHRpbWUsIGRhdGEsIHlTY2FsZSwgaGVhZGVyLCBoZWFkZXJLZXksIHNlbGVjdGlvbiwgdGFibGVTb3VyY2UsIHRpdGxlLCBkZWZhdWx0SXRlbXMsIHpvb21DQik7XHJcbiAgICAgICAgdGhpcy5fY2hhcnQgPSBuZXcgQ2hhcnQoY3R4LCBjZmcpO1xyXG4gICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZWplY3QoJ0NhbiBub3QgZmluZCB0aGUgY2FudmFzLicpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIHNob3cvaGlkZSB0aGUgcmVsYXRpdmUgZGF0YSBzZXRcclxuICAgKi9cclxuICBwdWJsaWMgdG9nZ2xlRGF0YUluQ2hhcnQobGFiZWw6IHN0cmluZywgaGlkZTogYm9vbGVhbik6IFByb21pc2U8YW55PiB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcclxuICAgICAgQ2hhcnRTZXJ2aWNlLl90b2dnbGVEYXRhU2V0KHRoaXMuX2dldERhdGFTZXRJbmRleEJ5TGFiZWwobGFiZWwsIHRoaXMuX2NoYXJ0KSwgdGhpcy5fY2hhcnQsIGhpZGUpO1xyXG4gICAgICByZXNvbHZlKHRoaXMuX3VwZGF0ZUNoYXJ0KHRoaXMuX2NoYXJ0KSk7XHJcbiAgICB9KTtcclxuICB9XHJcbn1cclxuIl19