@esfaenza/es-charts 18.2.2 → 19.2.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.
- package/fesm2022/esfaenza-es-charts.mjs +49 -49
- package/fesm2022/esfaenza-es-charts.mjs.map +1 -1
- package/lib/components/base/base-chart.component.d.ts +1 -1
- package/package.json +6 -8
- package/esm2022/esfaenza-es-charts.mjs +0 -5
- package/esm2022/lib/adapters/BaseAdapter.mjs +0 -50
- package/esm2022/lib/adapters/IBaseAdapter.mjs +0 -2
- package/esm2022/lib/components/base/base-chart.component.mjs +0 -350
- package/esm2022/lib/components/chart-pager/chart-pager.component.mjs +0 -89
- package/esm2022/lib/components/specializations/es-area-chart.component.mjs +0 -77
- package/esm2022/lib/components/specializations/es-chart.component.mjs +0 -122
- package/esm2022/lib/components/specializations/es-line-chart.component.mjs +0 -112
- package/esm2022/lib/components/specializations/es-pie-chart.component.mjs +0 -98
- package/esm2022/lib/components/specializations/es-vertical-2d-chart.component.mjs +0 -95
- package/esm2022/lib/components/specializations/es-vertical-chart.component.mjs +0 -92
- package/esm2022/lib/components/specializations/es-vertical-stacked-chart.component.mjs +0 -92
- package/esm2022/lib/es-charts.module.mjs +0 -67
- package/esm2022/lib/models/EsChaartsModuleConfig.mjs +0 -6
- package/esm2022/lib/models/core/ChartDispatcher.mjs +0 -91
- package/esm2022/lib/models/core/ChartLoader.mjs +0 -212
- package/esm2022/lib/models/core/ChartThemes.mjs +0 -61
- package/esm2022/lib/models/data/AreaChartData.mjs +0 -16
- package/esm2022/lib/models/data/LineChartData.mjs +0 -16
- package/esm2022/lib/models/data/PagedChartData.mjs +0 -20
- package/esm2022/lib/models/data/PieChartData.mjs +0 -14
- package/esm2022/lib/models/data/Vertical2DChartData.mjs +0 -16
- package/esm2022/lib/models/data/VerticalChartData.mjs +0 -14
- package/esm2022/lib/models/data/VerticalStackedChartData.mjs +0 -14
- package/esm2022/lib/models/data/base/DateValue.mjs +0 -11
- package/esm2022/lib/models/data/base/KeyValue.mjs +0 -11
- package/esm2022/lib/models/data/base/KeyValueColor.mjs +0 -13
- package/esm2022/lib/models/data/base/Limit.mjs +0 -16
- package/esm2022/lib/models/data/base/LineSerie.mjs +0 -28
- package/esm2022/lib/models/settings/AreaChartSettings.mjs +0 -11
- package/esm2022/lib/models/settings/LineChartSettings.mjs +0 -11
- package/esm2022/lib/models/settings/PieChartSettings.mjs +0 -7
- package/esm2022/lib/models/settings/Vertical2DChartSettings.mjs +0 -11
- package/esm2022/lib/models/settings/VerticalChartSettings.mjs +0 -11
- package/esm2022/lib/models/settings/VerticalStackedChartSettings.mjs +0 -11
- package/esm2022/lib/models/settings/base/BaseInterval.mjs +0 -6
- package/esm2022/lib/models/settings/base/BaseSettings.mjs +0 -6
- package/esm2022/lib/models/settings/base/LegendPad.mjs +0 -6
- package/esm2022/lib/services/AreaChartService.mjs +0 -157
- package/esm2022/lib/services/LineChartService.mjs +0 -392
- package/esm2022/lib/services/PieChartService.mjs +0 -114
- package/esm2022/lib/services/Vertical2DChartService.mjs +0 -163
- package/esm2022/lib/services/VerticalChartService.mjs +0 -114
- package/esm2022/lib/services/VerticalStackedChartService.mjs +0 -127
- package/esm2022/lib/services/base/IBaseService.mjs +0 -2
- package/esm2022/lib/tokens.mjs +0 -14
- package/esm2022/public-api.mjs +0 -39
|
@@ -1,392 +0,0 @@
|
|
|
1
|
-
import * as am4core from "@amcharts/amcharts4/core";
|
|
2
|
-
import * as am4charts from "@amcharts/amcharts4/charts";
|
|
3
|
-
/**
|
|
4
|
-
* Classe il cui unico scopo è gestire il setup e rendering di un LineChart
|
|
5
|
-
*/
|
|
6
|
-
export class LineChartService {
|
|
7
|
-
/** @ignore */
|
|
8
|
-
constructor(Adapter, dateExts) {
|
|
9
|
-
this.Adapter = Adapter;
|
|
10
|
-
this.dateExts = dateExts;
|
|
11
|
-
/** @ignore */
|
|
12
|
-
this.DataGroupBucketSize = 1500;
|
|
13
|
-
/** @ignore */
|
|
14
|
-
this.OpacityOnSelected = 0.3;
|
|
15
|
-
/** @ignore */
|
|
16
|
-
this.OpacityOnFill = 0.75;
|
|
17
|
-
/** @ignore */
|
|
18
|
-
this.singleDataSet = false;
|
|
19
|
-
//******************** Funzione di throttling per non spammare richieste in caso di animazioni attivate
|
|
20
|
-
//TODO: spostarla in un metodo di utilità (esfaenza/extensions)
|
|
21
|
-
/** @ignore */
|
|
22
|
-
this.executionTimers = {};
|
|
23
|
-
}
|
|
24
|
-
/**
|
|
25
|
-
* Metodo che data una coppia Dati - Impostazioni li utilizza per creare e visualizzare un LineChart
|
|
26
|
-
*/
|
|
27
|
-
graphicate(data, settings) {
|
|
28
|
-
let dataConverted = this.Adapter ? this.Adapter.adaptDataForLineChart(data) : data;
|
|
29
|
-
let threshold = settings.DataGroupingThreshold ?? 3000;
|
|
30
|
-
this.singleDataSet = settings.MergeDatasets ?? false;
|
|
31
|
-
let showTicks = settings.ShowTicks == null ? true : settings?.ShowTicks;
|
|
32
|
-
let dataShouldBeGrouped = Math.max(...dataConverted.series.map(t => t.values.length)) > threshold;
|
|
33
|
-
let showTimeline = settings.Timeline || dataShouldBeGrouped;
|
|
34
|
-
let seriesWithInterval = dataConverted.series.some(t => t.interval);
|
|
35
|
-
let interval = seriesWithInterval ? dataConverted.series.find(t => t.interval).interval : null;
|
|
36
|
-
let gapsAllowed = settings?.AllowGaps == null ? seriesWithInterval : settings?.AllowGaps;
|
|
37
|
-
let finalInstant = settings?.FinalInstants ?? true;
|
|
38
|
-
//Per evitare di dimenticarmeli e gestire comunque bene gli ngif ecc...
|
|
39
|
-
am4core.options.autoDispose = true;
|
|
40
|
-
this.ChartInstance = am4core.create(settings.Name, am4charts.XYChart);
|
|
41
|
-
let ChartInstanceCasted = this.ChartInstance;
|
|
42
|
-
let yAxis = ChartInstanceCasted.yAxes.push(new am4charts.ValueAxis());
|
|
43
|
-
if (settings.YAxisTitle) {
|
|
44
|
-
yAxis.title.text = settings.YAxisTitle;
|
|
45
|
-
yAxis.title.fontWeight = "bold";
|
|
46
|
-
}
|
|
47
|
-
if (settings.Min)
|
|
48
|
-
yAxis.min = settings.Min;
|
|
49
|
-
if (settings.Max)
|
|
50
|
-
yAxis.max = settings.Max;
|
|
51
|
-
let limitNullOrUndef = dataConverted.limit == null || dataConverted.limit == undefined;
|
|
52
|
-
let limits = limitNullOrUndef ? [] : !dataConverted.limit.length ? [dataConverted.limit] : dataConverted.limit;
|
|
53
|
-
if (limits.length > 0) {
|
|
54
|
-
for (let i = 0; i < limits.length; i++) {
|
|
55
|
-
let limit = limits[i];
|
|
56
|
-
if (limit.upper != null && limit.upper != undefined && limit.lower != null && limit.lower != undefined) {
|
|
57
|
-
let range = yAxis.axisRanges.create();
|
|
58
|
-
range.value = limit.lower;
|
|
59
|
-
range.endValue = limit.upper;
|
|
60
|
-
if (limit.fillColor) {
|
|
61
|
-
range.contents.stroke = am4core.color(limit.fillColor);
|
|
62
|
-
range.contents.fill = range.contents.stroke;
|
|
63
|
-
}
|
|
64
|
-
range.label.inside = true;
|
|
65
|
-
range.label.text = limit.upperlabel;
|
|
66
|
-
range.label.fill = range.grid.stroke;
|
|
67
|
-
range.label.verticalCenter = "bottom";
|
|
68
|
-
range.label.stroke = am4core.color(limit.uppercolor || "#F92200");
|
|
69
|
-
range.grid.stroke = am4core.color(limit.uppercolor || "#F92200");
|
|
70
|
-
range.grid.strokeWidth = 2;
|
|
71
|
-
range.grid.strokeOpacity = 1;
|
|
72
|
-
}
|
|
73
|
-
else if ((limit.lower == null || limit.lower == undefined) && limit.upper != null && limit.upper != undefined) {
|
|
74
|
-
let range = yAxis.axisRanges.create();
|
|
75
|
-
range.value = limit.upper;
|
|
76
|
-
range.label.inside = true;
|
|
77
|
-
range.label.text = limit.upperlabel;
|
|
78
|
-
range.label.fill = range.grid.stroke;
|
|
79
|
-
range.label.verticalCenter = "bottom";
|
|
80
|
-
range.label.stroke = am4core.color(limit.uppercolor || "#F92200");
|
|
81
|
-
range.grid.stroke = am4core.color(limit.uppercolor || "#F92200");
|
|
82
|
-
range.grid.strokeWidth = 2;
|
|
83
|
-
range.grid.strokeOpacity = 1;
|
|
84
|
-
}
|
|
85
|
-
else if ((limit.upper == null || limit.upper == undefined) && limit.lower != null && limit.lower != undefined) {
|
|
86
|
-
let range = yAxis.axisRanges.create();
|
|
87
|
-
range.value = limit.lower;
|
|
88
|
-
range.label.inside = true;
|
|
89
|
-
range.label.text = limit.lowerlabel;
|
|
90
|
-
range.label.fill = range.grid.stroke;
|
|
91
|
-
range.label.verticalCenter = "bottom";
|
|
92
|
-
range.label.stroke = am4core.color(limit.lowercolor || "#F92200");
|
|
93
|
-
range.grid.stroke = am4core.color(limit.lowercolor || "#F92200");
|
|
94
|
-
range.grid.strokeWidth = 2;
|
|
95
|
-
range.grid.strokeOpacity = 1;
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
this.dateAxis = ChartInstanceCasted.xAxes.push(new am4charts.DateAxis());
|
|
100
|
-
// Per comatibilità col codice scritto quando non era a livello globale, mi scoccia sostituire
|
|
101
|
-
let dateAxis = this.dateAxis;
|
|
102
|
-
if (settings.XAxisTitle) {
|
|
103
|
-
dateAxis.title.text = settings.XAxisTitle;
|
|
104
|
-
dateAxis.title.fontWeight = "bold";
|
|
105
|
-
}
|
|
106
|
-
if (showTicks) {
|
|
107
|
-
dateAxis.renderer.ticks.template.disabled = false;
|
|
108
|
-
dateAxis.renderer.ticks.template.strokeOpacity = 1;
|
|
109
|
-
dateAxis.renderer.ticks.template.stroke = am4core.color("#495C43");
|
|
110
|
-
dateAxis.renderer.ticks.template.strokeWidth = 2;
|
|
111
|
-
dateAxis.renderer.ticks.template.length = 10;
|
|
112
|
-
dateAxis.renderer.ticks.template.location = 0;
|
|
113
|
-
}
|
|
114
|
-
dateAxis.renderer.minGridDistance = settings?.MinGridDistance ?? 50;
|
|
115
|
-
dateAxis.renderer.grid.template.location = 0;
|
|
116
|
-
dateAxis.minZoomCount = 5;
|
|
117
|
-
dateAxis.groupData = dataShouldBeGrouped;
|
|
118
|
-
dateAxis.groupCount = settings.DataGroupBucketSize ?? this.DataGroupBucketSize;
|
|
119
|
-
//Se ho almeno una serie ad intervallo e i settings non mi impediscono esplicitamente di usare i gaps, visualizzo i dati col gap
|
|
120
|
-
if (gapsAllowed) {
|
|
121
|
-
if (!seriesWithInterval) {
|
|
122
|
-
console.error("Per utilizzare la funzionalità dei gap è obbligatorio definire un intervallo nelle serie del grafico");
|
|
123
|
-
return null;
|
|
124
|
-
}
|
|
125
|
-
dateAxis.baseInterval = { count: interval.count, timeUnit: this.fixTimeUnit(interval.timeunit) };
|
|
126
|
-
}
|
|
127
|
-
if (showTimeline)
|
|
128
|
-
ChartInstanceCasted.scrollbarX = new am4charts.XYChartScrollbar();
|
|
129
|
-
let seriesToPush = [];
|
|
130
|
-
let seriesColors = [];
|
|
131
|
-
let defaultIndex = 0;
|
|
132
|
-
// Ordinamento dei dati se serve
|
|
133
|
-
dataConverted.series.forEach((s) => {
|
|
134
|
-
if (s.values[0] && !(s.values[0].d instanceof Date)) {
|
|
135
|
-
for (let v = 0; v < s.values.length; v++)
|
|
136
|
-
s.values[v].d = new Date(s.values[v].d);
|
|
137
|
-
}
|
|
138
|
-
var correctOrder = true;
|
|
139
|
-
var prevDate = null;
|
|
140
|
-
for (let v = 0; v < s.values.length; v++) {
|
|
141
|
-
if (!prevDate)
|
|
142
|
-
prevDate = s.values[v].d;
|
|
143
|
-
else if (s.values[v].d < prevDate) {
|
|
144
|
-
correctOrder = false;
|
|
145
|
-
break;
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
if (!correctOrder)
|
|
149
|
-
s.values.sort((d1, d2) => d1.d.getTime() - d2.d.getTime());
|
|
150
|
-
});
|
|
151
|
-
// Generazione di un unico dataset invece che N, per poter gestire un unico tooltip
|
|
152
|
-
if (this.singleDataSet) {
|
|
153
|
-
this.ChartInstance.data = this.generateSingleDataset(dataConverted);
|
|
154
|
-
;
|
|
155
|
-
dateAxis.cursorTooltipEnabled = false;
|
|
156
|
-
}
|
|
157
|
-
dataConverted.series.forEach((s, index) => {
|
|
158
|
-
let stacked = s.stacked != null && s.stacked != undefined ? s.stacked : (settings?.Stacked ?? false);
|
|
159
|
-
let fill = stacked || (s.fill != null && s.fill != undefined ? s.fill : (settings?.Fill ?? false));
|
|
160
|
-
let series = settings?.Step ? new am4charts.StepLineSeries() : new am4charts.LineSeries();
|
|
161
|
-
series.dataFields.valueY = "v" + (this.singleDataSet ? index : "");
|
|
162
|
-
series.dataFields.dateX = "d";
|
|
163
|
-
series.measureUnit = s.uom;
|
|
164
|
-
series.name = s.name;
|
|
165
|
-
series.strokeWidth = settings?.StrokeSize ?? 1;
|
|
166
|
-
series.connect = !gapsAllowed;
|
|
167
|
-
series.minBulletDistance = 10;
|
|
168
|
-
series.tooltipText = this.singleDataSet ? "" : s.name ? "{name}: [bold]{valueY}[/]" : "[bold]{valueY}[/]";
|
|
169
|
-
series.tooltip.pointerOrientation = "vertical";
|
|
170
|
-
series.tooltip.background.fillOpacity = 0.5;
|
|
171
|
-
series.tooltip.label.padding(12, 12, 12, 12);
|
|
172
|
-
series.fillOpacity = fill ? this.OpacityOnFill : 0.0001;
|
|
173
|
-
series.stacked = stacked;
|
|
174
|
-
series.hidden = s.hidden;
|
|
175
|
-
//Dataset singolo, i dati sono registrati a livello di chart, creo il tooltip che permette di vederli tutti insieme
|
|
176
|
-
//altrimenti assegno i dati della serie direttamente alla serie
|
|
177
|
-
if (this.singleDataSet) {
|
|
178
|
-
series.tooltip.getFillFromObject = false;
|
|
179
|
-
series.tooltip.background.fill = am4core.color("#eee");
|
|
180
|
-
series.tooltip.label.fill = am4core.color("#00");
|
|
181
|
-
series.tooltip.defaultState.transitionDuration = 0;
|
|
182
|
-
series.tooltip.hiddenState.transitionDuration = 0;
|
|
183
|
-
//Utilizzo il mio dateService per la formattazione della data in modo che non debba mai gestire n formati fra n librerie... bellissimo
|
|
184
|
-
series.dateFormatter.format = (source) => {
|
|
185
|
-
if (interval && finalInstant && ["hour", "minute", "second"].includes(interval.timeunit)) {
|
|
186
|
-
let timepart = null;
|
|
187
|
-
switch (interval.timeunit) {
|
|
188
|
-
case "hour":
|
|
189
|
-
timepart = 'day';
|
|
190
|
-
break;
|
|
191
|
-
case "minute":
|
|
192
|
-
timepart = 'hour';
|
|
193
|
-
break;
|
|
194
|
-
case "second":
|
|
195
|
-
timepart = 'minute';
|
|
196
|
-
break;
|
|
197
|
-
}
|
|
198
|
-
if (timepart)
|
|
199
|
-
return this.dateExts.adjustDateToFinalInstant(source, timepart, interval ? interval.timeunit == "second" : false);
|
|
200
|
-
}
|
|
201
|
-
else
|
|
202
|
-
return this.dateExts.getFormatted(source, interval ? ["day", "week", "month", "year"].includes(interval.timeunit) : false, interval ? interval.timeunit == "second" : false);
|
|
203
|
-
};
|
|
204
|
-
series.adapter.add("tooltipText", () => {
|
|
205
|
-
var text = "[bold]{dateX.formatDate()}[/]\n";
|
|
206
|
-
this.ChartInstance.series.each((item) => {
|
|
207
|
-
let uom = " [font-style: italic]" + series.measureUnit || "" + "[/]";
|
|
208
|
-
text += "[" + item.stroke.hex + "]●[/] " + (item.name ? (item.name + ": ") : "") + "[bold]{" + item.dataFields.valueY + "}[/]" + uom + "\n";
|
|
209
|
-
});
|
|
210
|
-
return text;
|
|
211
|
-
});
|
|
212
|
-
}
|
|
213
|
-
else
|
|
214
|
-
series.data = s.values;
|
|
215
|
-
let segment = series.segments.template;
|
|
216
|
-
let hoverState = segment.states.create("hover");
|
|
217
|
-
hoverState.properties.strokeWidth = (settings?.StrokeSize ?? 1) + 1;
|
|
218
|
-
let dimmed = segment.states.create("dimmed");
|
|
219
|
-
dimmed.properties.stroke = am4core.color("#dadada");
|
|
220
|
-
//Se la serie ha un colore, uso quello, altrimenti pesco dai colori di default andando in ordine
|
|
221
|
-
if (s.color)
|
|
222
|
-
seriesColors.push(am4core.color(s.color));
|
|
223
|
-
else {
|
|
224
|
-
seriesColors.push(ChartInstanceCasted.colors.list[defaultIndex % ChartInstanceCasted.colors.list.length]);
|
|
225
|
-
defaultIndex++;
|
|
226
|
-
}
|
|
227
|
-
seriesToPush.push(series);
|
|
228
|
-
});
|
|
229
|
-
ChartInstanceCasted.colors.list = seriesColors;
|
|
230
|
-
//Scrivo le serie nel grafico
|
|
231
|
-
seriesToPush.forEach(s => {
|
|
232
|
-
ChartInstanceCasted.series.push(s);
|
|
233
|
-
if (showTimeline)
|
|
234
|
-
ChartInstanceCasted.scrollbarX.series.push(s);
|
|
235
|
-
});
|
|
236
|
-
if (settings.Legend) {
|
|
237
|
-
this.ChartInstance.legend = new am4charts.Legend();
|
|
238
|
-
this.ChartInstance.legend.position = settings?.LegendPosition ?? 'right';
|
|
239
|
-
this.ChartInstance.legend.scrollable = true;
|
|
240
|
-
this.ChartInstance.legend.itemContainers.template.tooltipText = "{name}";
|
|
241
|
-
this.ChartInstance.legend.itemContainers.template.events.on("over", (event) => { this.processOver(event.target.dataItem.dataContext); });
|
|
242
|
-
this.ChartInstance.legend.itemContainers.template.events.on("out", () => { this.processOut(); });
|
|
243
|
-
if (settings.LegendPadding) {
|
|
244
|
-
let template = this.ChartInstance.legend.itemContainers.template;
|
|
245
|
-
template.paddingTop = settings.LegendPadding.top ?? 0;
|
|
246
|
-
template.paddingBottom = settings.LegendPadding.bottom ?? 0;
|
|
247
|
-
template.paddingLeft = settings.LegendPadding.left ?? 0;
|
|
248
|
-
template.paddingRight = settings.LegendPadding.right ?? 0;
|
|
249
|
-
}
|
|
250
|
-
}
|
|
251
|
-
this.ChartInstance.cursor = new am4charts.XYCursor();
|
|
252
|
-
//Prove******************************************************************************************************************************
|
|
253
|
-
// this.ChartInstance.cursor.events.on("cursorpositionchanged", (ev) => {
|
|
254
|
-
// //var value = dateAxis.positionToDate(dateAxis.toAxisPosition(ev.target.xPosition));
|
|
255
|
-
// var dt = dateAxis.series.values.find(t => t.dataItem.values.dateX);
|
|
256
|
-
// if (dt && dt.dataItem) {
|
|
257
|
-
// console.log(dt.dataItem.values);
|
|
258
|
-
// // this.ChartInstance.tooltipText = dt;
|
|
259
|
-
// }
|
|
260
|
-
// else {
|
|
261
|
-
// this.ChartInstance.tooltipText = "";
|
|
262
|
-
// }
|
|
263
|
-
// });
|
|
264
|
-
//******************************************************************************************************************************
|
|
265
|
-
this.ChartInstance.cursor.xAxis = dateAxis;
|
|
266
|
-
this.ChartInstance.cursor.yAxis = yAxis;
|
|
267
|
-
if (this.singleDataSet)
|
|
268
|
-
this.ChartInstance.cursor.maxTooltipDistance = -1;
|
|
269
|
-
//TODO: Cercare di capire perché è figlio di puttana......
|
|
270
|
-
dateAxis.events.on("startchanged", t => this.emitSelectionChanged(t, settings));
|
|
271
|
-
dateAxis.events.on("endchanged", t => this.emitSelectionChanged(t, settings));
|
|
272
|
-
return this;
|
|
273
|
-
}
|
|
274
|
-
fixTimeUnit(tu) {
|
|
275
|
-
if (tu === 0)
|
|
276
|
-
return "millisecond";
|
|
277
|
-
else if (tu === 1)
|
|
278
|
-
return "second";
|
|
279
|
-
else if (tu === 2)
|
|
280
|
-
return "minute";
|
|
281
|
-
else if (tu === 3)
|
|
282
|
-
return "hour";
|
|
283
|
-
else if (tu === 4)
|
|
284
|
-
return "day";
|
|
285
|
-
else if (tu === 5)
|
|
286
|
-
return "week";
|
|
287
|
-
else if (tu === 6)
|
|
288
|
-
return "month";
|
|
289
|
-
else if (tu === 7)
|
|
290
|
-
return "year";
|
|
291
|
-
else
|
|
292
|
-
return tu;
|
|
293
|
-
}
|
|
294
|
-
/** @ignore */
|
|
295
|
-
setSelection(from, to) {
|
|
296
|
-
this.dateAxis.zoomToDates(from, to, true, true);
|
|
297
|
-
}
|
|
298
|
-
/** @ignore */
|
|
299
|
-
refreshData(data) {
|
|
300
|
-
let dataConverted = this.Adapter ? this.Adapter.adaptDataForLineChart(data) : data;
|
|
301
|
-
if (this.singleDataSet) {
|
|
302
|
-
var data = this.generateSingleDataset(dataConverted);
|
|
303
|
-
this.ChartInstance.addData(data);
|
|
304
|
-
return;
|
|
305
|
-
}
|
|
306
|
-
throw "Impossibile aggiornare i dati senza unire il dataset. Si prega di impostare [MergeDatasets] a true";
|
|
307
|
-
}
|
|
308
|
-
/** Partendo da dati divisi per seriue genera un dataset unito con la data come chiave e i vari valori dopo */
|
|
309
|
-
generateSingleDataset(data) {
|
|
310
|
-
let dto = {};
|
|
311
|
-
data.series.forEach((vs, index) => {
|
|
312
|
-
for (let i = 0; i < vs.values.length; i++) {
|
|
313
|
-
var dataitem = vs.values[i];
|
|
314
|
-
var indexer = new Date(dataitem.d).valueOf();
|
|
315
|
-
if (!dto[indexer])
|
|
316
|
-
dto[indexer] = {};
|
|
317
|
-
dto[indexer]['v' + index] = dataitem.v;
|
|
318
|
-
}
|
|
319
|
-
});
|
|
320
|
-
var dates = Object.keys(dto);
|
|
321
|
-
var ret = [];
|
|
322
|
-
for (let i = 0; i < dates.length; i++) {
|
|
323
|
-
let values = dto[dates[i]];
|
|
324
|
-
let item = { d: new Date(parseInt(dates[i])) };
|
|
325
|
-
var vals = Object.keys(values);
|
|
326
|
-
for (let ii = 0; ii < vals.length; ii++) {
|
|
327
|
-
let series = vals[ii];
|
|
328
|
-
let singleVal = values[series];
|
|
329
|
-
item[series] = singleVal;
|
|
330
|
-
}
|
|
331
|
-
ret.push(item);
|
|
332
|
-
}
|
|
333
|
-
return ret;
|
|
334
|
-
}
|
|
335
|
-
/** @ignore */
|
|
336
|
-
emitSelectionChanged(ev, settings) {
|
|
337
|
-
if (settings.OnSelectionChangedCallback) {
|
|
338
|
-
this.throttla("selchange", () => {
|
|
339
|
-
var axis = ev.target;
|
|
340
|
-
var start = new Date(axis.minZoomed);
|
|
341
|
-
var end = new Date(axis.maxZoomed);
|
|
342
|
-
var initial = axis.min == axis.minZoomed && axis.max == axis.maxZoomed;
|
|
343
|
-
settings.OnSelectionChangedCallback({ from: start, to: end, initial: initial });
|
|
344
|
-
}, 150);
|
|
345
|
-
}
|
|
346
|
-
}
|
|
347
|
-
/** @ignore */
|
|
348
|
-
processOver(hoveredSeries) {
|
|
349
|
-
hoveredSeries.zIndex = 999;
|
|
350
|
-
let fill = hoveredSeries.fillOpacity == this.OpacityOnFill;
|
|
351
|
-
hoveredSeries.segments.each((segment) => {
|
|
352
|
-
segment.setState("hover");
|
|
353
|
-
if (!fill)
|
|
354
|
-
segment.fillSprite.fillOpacity = this.OpacityOnSelected;
|
|
355
|
-
});
|
|
356
|
-
if (!fill)
|
|
357
|
-
hoveredSeries.legendDataItem.marker.children.getIndex(1).fillOpacity = this.OpacityOnSelected;
|
|
358
|
-
this.ChartInstance.series.each((series) => {
|
|
359
|
-
if (series != hoveredSeries) {
|
|
360
|
-
let fill = series.fillOpacity == this.OpacityOnFill;
|
|
361
|
-
series.segments.each((segment) => {
|
|
362
|
-
segment.setState("dimmed");
|
|
363
|
-
if (!fill)
|
|
364
|
-
segment.fillSprite.fillOpacity = 0;
|
|
365
|
-
});
|
|
366
|
-
}
|
|
367
|
-
});
|
|
368
|
-
}
|
|
369
|
-
/** @ignore */
|
|
370
|
-
processOut() {
|
|
371
|
-
this.ChartInstance.series.each((series, i) => {
|
|
372
|
-
series.zIndex = i;
|
|
373
|
-
let fill = series.fillOpacity == this.OpacityOnFill;
|
|
374
|
-
series.segments.each((segment) => {
|
|
375
|
-
segment.setState("default");
|
|
376
|
-
if (!fill)
|
|
377
|
-
segment.fillSprite.fillOpacity = 0;
|
|
378
|
-
});
|
|
379
|
-
if (!fill)
|
|
380
|
-
series.legendDataItem.marker.children.getIndex(1).fillOpacity = 0;
|
|
381
|
-
});
|
|
382
|
-
}
|
|
383
|
-
/** @ignore */
|
|
384
|
-
throttla(id, func, throttleTime) {
|
|
385
|
-
//Se ho la funzione che vuole eseguire ripulisco quel timeout
|
|
386
|
-
if (this.executionTimers[id])
|
|
387
|
-
clearTimeout(this.executionTimers[id]);
|
|
388
|
-
//Ricreo il timeout per eseguire quella funzione dopo throttleTime millisecondi
|
|
389
|
-
this.executionTimers[id] = setTimeout(() => { func(); this.executionTimers[id] = null; }, throttleTime);
|
|
390
|
-
}
|
|
391
|
-
}
|
|
392
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTGluZUNoYXJ0U2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2VzLWNoYXJ0cy9zcmMvbGliL3NlcnZpY2VzL0xpbmVDaGFydFNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBUUEsT0FBTyxLQUFLLE9BQU8sTUFBTSwwQkFBMEIsQ0FBQztBQUNwRCxPQUFPLEtBQUssU0FBUyxNQUFNLDRCQUE0QixDQUFDO0FBRXhEOztHQUVHO0FBQ0gsTUFBTSxPQUFPLGdCQUFnQjtJQVd6QixjQUFjO0lBQ2QsWUFBbUIsT0FBb0IsRUFBVSxRQUFxQjtRQUFuRCxZQUFPLEdBQVAsT0FBTyxDQUFhO1FBQVUsYUFBUSxHQUFSLFFBQVEsQ0FBYTtRQVR0RSxjQUFjO1FBQ04sd0JBQW1CLEdBQVcsSUFBSSxDQUFDO1FBQzNDLGNBQWM7UUFDTixzQkFBaUIsR0FBVyxHQUFHLENBQUM7UUFDeEMsY0FBYztRQUNOLGtCQUFhLEdBQVcsSUFBSSxDQUFDO1FBQ3JDLGNBQWM7UUFDTixrQkFBYSxHQUFZLEtBQUssQ0FBQztRQXNadkMsdUdBQXVHO1FBQ3ZHLCtEQUErRDtRQUMvRCxjQUFjO1FBQ04sb0JBQWUsR0FBNkIsRUFBRSxDQUFDO0lBdlptQixDQUFDO0lBSzNFOztPQUVHO0lBQ0ksVUFBVSxDQUFDLElBQXlCLEVBQUUsUUFBMkI7UUFDcEUsSUFBSSxhQUFhLEdBQWtCLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUNsRyxJQUFJLFNBQVMsR0FBRyxRQUFRLENBQUMscUJBQXFCLElBQUksSUFBSSxDQUFDO1FBQ3ZELElBQUksQ0FBQyxhQUFhLEdBQUcsUUFBUSxDQUFDLGFBQWEsSUFBSSxLQUFLLENBQUM7UUFDckQsSUFBSSxTQUFTLEdBQUcsUUFBUSxDQUFDLFNBQVMs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Q0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBQzVHLENBQUM7Q0FFSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERhdGVTZXJ2aWNlIH0gZnJvbSBcIkBlc2ZhZW56YS9leHRlbnNpb25zXCI7XHJcbmltcG9ydCB7IElCYXNlU2VydmljZSB9IGZyb20gJy4vYmFzZS9JQmFzZVNlcnZpY2UnO1xyXG5pbXBvcnQgeyBCYXNlQWRhcHRlciB9IGZyb20gJy4uL2FkYXB0ZXJzL0Jhc2VBZGFwdGVyJztcclxuXHJcbmltcG9ydCB7IExpbWl0IH0gZnJvbSBcIi4uL21vZGVscy9kYXRhL2Jhc2UvTGltaXRcIjtcclxuaW1wb3J0IHsgTGluZUNoYXJ0RGF0YSB9IGZyb20gJy4uL21vZGVscy9kYXRhL0xpbmVDaGFydERhdGEnO1xyXG5pbXBvcnQgeyBMaW5lQ2hhcnRTZXR0aW5ncyB9IGZyb20gJy4uL21vZGVscy9zZXR0aW5ncy9MaW5lQ2hhcnRTZXR0aW5ncyc7XHJcblxyXG5pbXBvcnQgKiBhcyBhbTRjb3JlIGZyb20gXCJAYW1jaGFydHMvYW1jaGFydHM0L2NvcmVcIjtcclxuaW1wb3J0ICogYXMgYW00Y2hhcnRzIGZyb20gXCJAYW1jaGFydHMvYW1jaGFydHM0L2NoYXJ0c1wiO1xyXG5cclxuLyoqXHJcbiAqIENsYXNzZSBpbCBjdWkgdW5pY28gc2NvcG8gw6ggZ2VzdGlyZSBpbCBzZXR1cCBlIHJlbmRlcmluZyBkaSB1biBMaW5lQ2hhcnRcclxuICovXHJcbmV4cG9ydCBjbGFzcyBMaW5lQ2hhcnRTZXJ2aWNlIGltcGxlbWVudHMgSUJhc2VTZXJ2aWNlPGFtNGNoYXJ0cy5YWUNoYXJ0PntcclxuICAgIC8qKiBAaWdub3JlICovXHJcbiAgICBwdWJsaWMgQ2hhcnRJbnN0YW5jZTogYW00Y2hhcnRzLlhZQ2hhcnQ7XHJcbiAgICAvKiogQGlnbm9yZSAqL1xyXG4gICAgcHJpdmF0ZSBEYXRhR3JvdXBCdWNrZXRTaXplOiBudW1iZXIgPSAxNTAwO1xyXG4gICAgLyoqIEBpZ25vcmUgKi9cclxuICAgIHByaXZhdGUgT3BhY2l0eU9uU2VsZWN0ZWQ6IG51bWJlciA9IDAuMztcclxuICAgIC8qKiBAaWdub3JlICovXHJcbiAgICBwcml2YXRlIE9wYWNpdHlPbkZpbGw6IG51bWJlciA9IDAuNzU7XHJcbiAgICAvKiogQGlnbm9yZSAqL1xyXG4gICAgcHJpdmF0ZSBzaW5nbGVEYXRhU2V0OiBib29sZWFuID0gZmFsc2U7XHJcbiAgICAvKiogQGlnbm9yZSAqL1xyXG4gICAgY29uc3RydWN0b3IocHVibGljIEFkYXB0ZXI6IEJhc2VBZGFwdGVyLCBwcml2YXRlIGRhdGVFeHRzOiBEYXRlU2VydmljZSkgeyB9XHJcblxyXG4gICAgLyoqIFJpZmVpcm1lbnRvIGludGVybm8gYWxsJ2Fzc2UgZGVsbGUgRGF0ZSBwZXIgc2VtcGxpY2l0w6AgKi9cclxuICAgIHByaXZhdGUgZGF0ZUF4aXM6IGFtNGNoYXJ0cy5EYXRlQXhpcztcclxuXHJcbiAgICAvKipcclxuICAgICAqIE1ldG9kbyBjaGUgZGF0YSB1bmEgY29wcGlhIERhdGkgLSBJbXBvc3RhemlvbmkgbGkgdXRpbGl6emEgcGVyIGNyZWFyZSBlIHZpc3VhbGl6emFyZSB1biBMaW5lQ2hhcnRcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdyYXBoaWNhdGUoZGF0YTogTGluZUNoYXJ0RGF0YSB8IGFueSwgc2V0dGluZ3M6IExpbmVDaGFydFNldHRpbmdzKTogSUJhc2VTZXJ2aWNlPGFtNGNoYXJ0cy5YWUNoYXJ0PiB7XHJcbiAgICAgICAgbGV0IGRhdGFDb252ZXJ0ZWQ6IExpbmVDaGFydERhdGEgPSB0aGlzLkFkYXB0ZXIgPyB0aGlzLkFkYXB0ZXIuYWRhcHREYXRhRm9yTGluZUNoYXJ0KGRhdGEpIDogZGF0YTtcclxuICAgICAgICBsZXQgdGhyZXNob2xkID0gc2V0dGluZ3MuRGF0YUdyb3VwaW5nVGhyZXNob2xkID8/IDMwMDA7XHJcbiAgICAgICAgdGhpcy5zaW5nbGVEYXRhU2V0ID0gc2V0dGluZ3MuTWVyZ2VEYXRhc2V0cyA/PyBmYWxzZTtcclxuICAgICAgICBsZXQgc2hvd1RpY2tzID0gc2V0dGluZ3MuU2hvd1RpY2tzID09IG51bGwgPyB0cnVlIDogc2V0dGluZ3M/LlNob3dUaWNrcztcclxuICAgICAgICBsZXQgZGF0YVNob3VsZEJlR3JvdXBlZCA9IE1hdGgubWF4KC4uLmRhdGFDb252ZXJ0ZWQuc2VyaWVzLm1hcCh0ID0+IHQudmFsdWVzLmxlbmd0aCkpID4gdGhyZXNob2xkO1xyXG4gICAgICAgIGxldCBzaG93VGltZWxpbmUgPSBzZXR0aW5ncy5UaW1lbGluZSB8fCBkYXRhU2hvdWxkQmVHcm91cGVkO1xyXG4gICAgICAgIGxldCBzZXJpZXNXaXRoSW50ZXJ2YWwgPSBkYXRhQ29udmVydGVkLnNlcmllcy5zb21lKHQgPT4gdC5pbnRlcnZhbCk7XHJcbiAgICAgICAgbGV0IGludGVydmFsID0gc2VyaWVzV2l0aEludGVydmFsID8gZGF0YUNvbnZlcnRlZC5zZXJpZXMuZmluZCh0ID0+IHQuaW50ZXJ2YWwpLmludGVydmFsIDogbnVsbDtcclxuICAgICAgICBsZXQgZ2Fwc0FsbG93ZWQgPSBzZXR0aW5ncz8uQWxsb3dHYXBzID09IG51bGwgPyBzZXJpZXNXaXRoSW50ZXJ2YWwgOiBzZXR0aW5ncz8uQWxsb3dHYXBzO1xyXG4gICAgICAgIGxldCBmaW5hbEluc3RhbnQgPSBzZXR0aW5ncz8uRmluYWxJbnN0YW50cyA/PyB0cnVlO1xyXG5cclxuICAgICAgICAvL1BlciBldml0YXJlIGRpIGRpbWVudGljYXJtZWxpIGUgZ2VzdGlyZSBjb211bnF1ZSBiZW5lIGdsaSBuZ2lmIGVjYy4uLlxyXG4gICAgICAgIGFtNGNvcmUub3B0aW9ucy5hdXRvRGlzcG9zZSA9IHRydWU7XHJcblxyXG4gICAgICAgIHRoaXMuQ2hhcnRJbnN0YW5jZSA9IGFtNGNvcmUuY3JlYXRlKHNldHRpbmdzLk5hbWUsIGFtNGNoYXJ0cy5YWUNoYXJ0KTtcclxuICAgICAgICBsZXQgQ2hhcnRJbnN0YW5jZUNhc3RlZCA9IDxhbTRjaGFydHMuWFlDaGFydD50aGlzLkNoYXJ0SW5zdGFuY2U7XHJcblxyXG4gICAgICAgIGxldCB5QXhpcyA9IENoYXJ0SW5zdGFuY2VDYXN0ZWQueUF4ZXMucHVzaChuZXcgYW00Y2hhcnRzLlZhbHVlQXhpcygpKTtcclxuICAgICAgICBpZiAoc2V0dGluZ3MuWUF4aXNUaXRsZSkge1xyXG4gICAgICAgICAgICB5QXhpcy50aXRsZS50ZXh0ID0gc2V0dGluZ3MuWUF4aXNUaXRsZVxyXG4gICAgICAgICAgICB5QXhpcy50aXRsZS5mb250V2VpZ2h0ID0gXCJib2xkXCI7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoc2V0dGluZ3MuTWluKVxyXG4gICAgICAgICAgICB5QXhpcy5taW4gPSBzZXR0aW5ncy5NaW47XHJcbiAgICAgICAgaWYgKHNldHRpbmdzLk1heClcclxuICAgICAgICAgICAgeUF4aXMubWF4ID0gc2V0dGluZ3MuTWF4O1xyXG5cclxuICAgICAgICBsZXQgbGltaXROdWxsT3JVbmRlZiA9IGRhdGFDb252ZXJ0ZWQubGltaXQgPT0gbnVsbCB8fCBkYXRhQ29udmVydGVkLmxpbWl0ID09IHVuZGVmaW5lZDtcclxuICAgICAgICBsZXQgbGltaXRzID0gbGltaXROdWxsT3JVbmRlZiA/IFtdIDogISg8YW55PmRhdGFDb252ZXJ0ZWQubGltaXQpLmxlbmd0aCA/IFs8TGltaXQ+ZGF0YUNvbnZlcnRlZC5saW1pdF0gOiA8TGltaXRbXT5kYXRhQ29udmVydGVkLmxpbWl0O1xyXG4gICAgICAgIGlmIChsaW1pdHMubGVuZ3RoID4gMCkge1xyXG5cclxuICAgICAgICAgICAgZm9yKGxldCBpID0gMDsgaSA8IGxpbWl0cy5sZW5ndGg7IGkrKyl7XHJcbiAgICAgICAgICAgICAgICBsZXQgbGltaXQgPSBsaW1pdHNbaV1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAobGltaXQudXBwZXIgIT0gbnVsbCAmJiBsaW1pdC51cHBlciAhPSB1bmRlZmluZWQgJiYgbGltaXQubG93ZXIgIT0gbnVsbCAmJiBsaW1pdC5sb3dlciAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgcmFuZ2UgPSB5QXhpcy5heGlzUmFuZ2VzLmNyZWF0ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJhbmdlLnZhbHVlID0gbGltaXQubG93ZXI7XHJcbiAgICAgICAgICAgICAgICAgICAgcmFuZ2UuZW5kVmFsdWUgPSBsaW1pdC51cHBlcjtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxpbWl0LmZpbGxDb2xvcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByYW5nZS5jb250ZW50cy5zdHJva2UgPSBhbTRjb3JlLmNvbG9yKGxpbWl0LmZpbGxDb2xvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlLmNvbnRlbnRzLmZpbGwgPSByYW5nZS5jb250ZW50cy5zdHJva2U7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICByYW5nZS5sYWJlbC5pbnNpZGUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIHJhbmdlLmxhYmVsLnRleHQgPSBsaW1pdC51cHBlcmxhYmVsO1xyXG4gICAgICAgICAgICAgICAgICAgIHJhbmdlLmxhYmVsLmZpbGwgPSByYW5nZS5ncmlkLnN0cm9rZTtcclxuICAgICAgICAgICAgICAgICAgICByYW5nZS5sYWJlbC52ZXJ0aWNhbENlbnRlciA9IFwiYm90dG9tXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgcmFuZ2UubGFiZWwuc3Ryb2tlID0gYW00Y29yZS5jb2xvcihsaW1pdC51cHBlcmNvbG9yIHx8IFwiI0Y5MjIwMFwiKTtcclxuICAgICAgICAgICAgICAgICAgICByYW5nZS5ncmlkLnN0cm9rZSA9IGFtNGNvcmUuY29sb3IobGltaXQudXBwZXJjb2xvciB8fCBcIiNGOTIyMDBcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgcmFuZ2UuZ3JpZC5zdHJva2VXaWR0aCA9IDI7XHJcbiAgICAgICAgICAgICAgICAgICAgcmFuZ2UuZ3JpZC5zdHJva2VPcGFjaXR5ID0gMTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKChsaW1pdC5sb3dlciA9PSBudWxsIHx8IGxpbWl0Lmxvd2VyID09IHVuZGVmaW5lZCkgJiYgbGltaXQudXBwZXIgIT0gbnVsbCAmJiBsaW1pdC51cHBlciAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgcmFuZ2UgPSB5QXhpcy5heGlzUmFuZ2VzLmNyZWF0ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJhbmdlLnZhbHVlID0gbGltaXQudXBwZXI7XHJcbiAgICAgICAgICAgICAgICAgICAgcmFuZ2UubGFiZWwuaW5zaWRlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICByYW5nZS5sYWJlbC50ZXh0ID0gbGltaXQudXBwZXJsYWJlbDtcclxuICAgICAgICAgICAgICAgICAgICByYW5nZS5sYWJlbC5maWxsID0gcmFuZ2UuZ3JpZC5zdHJva2U7XHJcbiAgICAgICAgICAgICAgICAgICAgcmFuZ2UubGFiZWwudmVydGljYWxDZW50ZXIgPSBcImJvdHRvbVwiO1xyXG4gICAgICAgICAgICAgICAgICAgIHJhbmdlLmxhYmVsLnN0cm9rZSA9IGFtNGNvcmUuY29sb3IobGltaXQudXBwZXJjb2xvciB8fCBcIiNGOTIyMDBcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgcmFuZ2UuZ3JpZC5zdHJva2UgPSBhbTRjb3JlLmNvbG9yKGxpbWl0LnVwcGVyY29sb3IgfHwgXCIjRjkyMjAwXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJhbmdlLmdyaWQuc3Ryb2tlV2lkdGggPSAyO1xyXG4gICAgICAgICAgICAgICAgICAgIHJhbmdlLmdyaWQuc3Ryb2tlT3BhY2l0eSA9IDE7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmICgobGltaXQudXBwZXIgPT0gbnVsbCB8fCBsaW1pdC51cHBlciA9PSB1bmRlZmluZWQpICYmIGxpbWl0Lmxvd2VyICE9IG51bGwgJiYgbGltaXQubG93ZXIgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJhbmdlID0geUF4aXMuYXhpc1Jhbmdlcy5jcmVhdGUoKTtcclxuICAgICAgICAgICAgICAgICAgICByYW5nZS52YWx1ZSA9IGxpbWl0Lmxvd2VyO1xyXG4gICAgICAgICAgICAgICAgICAgIHJhbmdlLmxhYmVsLmluc2lkZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgcmFuZ2UubGFiZWwudGV4dCA9IGxpbWl0Lmxvd2VybGFiZWw7XHJcbiAgICAgICAgICAgICAgICAgICAgcmFuZ2UubGFiZWwuZmlsbCA9IHJhbmdlLmdyaWQuc3Ryb2tlO1xyXG4gICAgICAgICAgICAgICAgICAgIHJhbmdlLmxhYmVsLnZlcnRpY2FsQ2VudGVyID0gXCJib3R0b21cIjtcclxuICAgICAgICAgICAgICAgICAgICByYW5nZS5sYWJlbC5zdHJva2UgPSBhbTRjb3JlLmNvbG9yKGxpbWl0Lmxvd2VyY29sb3IgfHwgXCIjRjkyMjAwXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJhbmdlLmdyaWQuc3Ryb2tlID0gYW00Y29yZS5jb2xvcihsaW1pdC5sb3dlcmNvbG9yIHx8IFwiI0Y5MjIwMFwiKTtcclxuICAgICAgICAgICAgICAgICAgICByYW5nZS5ncmlkLnN0cm9rZVdpZHRoID0gMjtcclxuICAgICAgICAgICAgICAgICAgICByYW5nZS5ncmlkLnN0cm9rZU9wYWNpdHkgPSAxO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIHRoaXMuZGF0ZUF4aXMgPSBDaGFydEluc3RhbmNlQ2FzdGVkLnhBeGVzLnB1c2gobmV3IGFtNGNoYXJ0cy5EYXRlQXhpcygpKTtcclxuXHJcbiAgICAgICAgLy8gUGVyIGNvbWF0aWJpbGl0w6AgY29sIGNvZGljZSBzY3JpdHRvIHF1YW5kbyBub24gZXJhIGEgbGl2ZWxsbyBnbG9iYWxlLCBtaSBzY29jY2lhIHNvc3RpdHVpcmVcclxuICAgICAgICBsZXQgZGF0ZUF4aXMgPSB0aGlzLmRhdGVBeGlzO1xyXG5cclxuICAgICAgICBpZiAoc2V0dGluZ3MuWEF4aXNUaXRsZSkge1xyXG4gICAgICAgICAgICBkYXRlQXhpcy50aXRsZS50ZXh0ID0gc2V0dGluZ3MuWEF4aXNUaXRsZVxyXG4gICAgICAgICAgICBkYXRlQXhpcy50aXRsZS5mb250V2VpZ2h0ID0gXCJib2xkXCI7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoc2hvd1RpY2tzKSB7XHJcbiAgICAgICAgICAgIGRhdGVBeGlzLnJlbmRlcmVyLnRpY2tzLnRlbXBsYXRlLmRpc2FibGVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGRhdGVBeGlzLnJlbmRlcmVyLnRpY2tzLnRlbXBsYXRlLnN0cm9rZU9wYWNpdHkgPSAxO1xyXG4gICAgICAgICAgICBkYXRlQXhpcy5yZW5kZXJlci50aWNrcy50ZW1wbGF0ZS5zdHJva2UgPSBhbTRjb3JlLmNvbG9yKFwiIzQ5NUM0M1wiKTtcclxuICAgICAgICAgICAgZGF0ZUF4aXMucmVuZGVyZXIudGlja3MudGVtcGxhdGUuc3Ryb2tlV2lkdGggPSAyO1xyXG4gICAgICAgICAgICBkYXRlQXhpcy5yZW5kZXJlci50aWNrcy50ZW1wbGF0ZS5sZW5ndGggPSAxMDtcclxuICAgICAgICAgICAgZGF0ZUF4aXMucmVuZGVyZXIudGlja3MudGVtcGxhdGUubG9jYXRpb24gPSAwO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZGF0ZUF4aXMucmVuZGVyZXIubWluR3JpZERpc3RhbmNlID0gc2V0dGluZ3M/Lk1pbkdyaWREaXN0YW5jZSA/PyA1MDtcclxuICAgICAgICBkYXRlQXhpcy5yZW5kZXJlci5ncmlkLnRlbXBsYXRlLmxvY2F0aW9uID0gMDtcclxuICAgICAgICBkYXRlQXhpcy5taW5ab29tQ291bnQgPSA1O1xyXG4gICAgICAgIGRhdGVBeGlzLmdyb3VwRGF0YSA9IGRhdGFTaG91bGRCZUdyb3VwZWQ7XHJcbiAgICAgICAgZGF0ZUF4aXMuZ3JvdXBDb3VudCA9IHNldHRpbmdzLkRhdGFHcm91cEJ1Y2tldFNpemUgPz8gdGhpcy5EYXRhR3JvdXBCdWNrZXRTaXplO1xyXG5cclxuICAgICAgICAvL1NlIGhvIGFsbWVubyB1bmEgc2VyaWUgYWQgaW50ZXJ2YWxsbyBlIGkgc2V0dGluZ3Mgbm9uIG1pIGltcGVkaXNjb25vIGVzcGxpY2l0YW1lbnRlIGRpIHVzYXJlIGkgZ2FwcywgdmlzdWFsaXp6byBpIGRhdGkgY29sIGdhcFxyXG5cclxuICAgICAgICBpZiAoZ2Fwc0FsbG93ZWQpIHtcclxuICAgICAgICAgICAgaWYgKCFzZXJpZXNXaXRoSW50ZXJ2YWwpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJQZXIgdXRpbGl6emFyZSBsYSBmdW56aW9uYWxpdMOgIGRlaSBnYXAgw6ggb2JibGlnYXRvcmlvIGRlZmluaXJlIHVuIGludGVydmFsbG8gbmVsbGUgc2VyaWUgZGVsIGdyYWZpY29cIik7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBkYXRlQXhpcy5iYXNlSW50ZXJ2YWwgPSB7IGNvdW50OiBpbnRlcnZhbC5jb3VudCwgdGltZVVuaXQ6IHRoaXMuZml4VGltZVVuaXQoaW50ZXJ2YWwudGltZXVuaXQpIH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChzaG93VGltZWxpbmUpXHJcbiAgICAgICAgICAgIENoYXJ0SW5zdGFuY2VDYXN0ZWQuc2Nyb2xsYmFyWCA9IG5ldyBhbTRjaGFydHMuWFlDaGFydFNjcm9sbGJhcigpO1xyXG5cclxuICAgICAgICBsZXQgc2VyaWVzVG9QdXNoID0gW107XHJcbiAgICAgICAgbGV0IHNlcmllc0NvbG9yczogYW00Y29yZS5Db2xvcltdID0gW107XHJcbiAgICAgICAgbGV0IGRlZmF1bHRJbmRleCA9IDA7XHJcblxyXG4gICAgICAgIC8vIE9yZGluYW1lbnRvIGRlaSBkYXRpIHNlIHNlcnZlXHJcbiAgICAgICAgZGF0YUNvbnZlcnRlZC5zZXJpZXMuZm9yRWFjaCgocykgPT4ge1xyXG4gICAgICAgICAgICBpZiAocy52YWx1ZXNbMF0gJiYgIShzLnZhbHVlc1swXS5kIGluc3RhbmNlb2YgRGF0ZSkpIHtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IHYgPSAwOyB2IDwgcy52YWx1ZXMubGVuZ3RoOyB2KyspXHJcbiAgICAgICAgICAgICAgICAgICAgcy52YWx1ZXNbdl0uZCA9IG5ldyBEYXRlKHMudmFsdWVzW3ZdLmQpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB2YXIgY29ycmVjdE9yZGVyID0gdHJ1ZTtcclxuICAgICAgICAgICAgdmFyIHByZXZEYXRlID0gbnVsbDtcclxuICAgICAgICAgICAgZm9yIChsZXQgdiA9IDA7IHYgPCBzLnZhbHVlcy5sZW5ndGg7IHYrKykge1xyXG4gICAgICAgICAgICAgICAgaWYgKCFwcmV2RGF0ZSlcclxuICAgICAgICAgICAgICAgICAgICBwcmV2RGF0ZSA9IHMudmFsdWVzW3ZdLmQ7XHJcbiAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHMudmFsdWVzW3ZdLmQgPCBwcmV2RGF0ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb3JyZWN0T3JkZXIgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoIWNvcnJlY3RPcmRlcilcclxuICAgICAgICAgICAgICAgIHMudmFsdWVzLnNvcnQoKGQxLCBkMikgPT4gZDEuZC5nZXRUaW1lKCkgLSBkMi5kLmdldFRpbWUoKSk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vIEdlbmVyYXppb25lIGRpIHVuIHVuaWNvIGRhdGFzZXQgaW52ZWNlIGNoZSBOLCBwZXIgcG90ZXIgZ2VzdGlyZSB1biB1bmljbyB0b29sdGlwXHJcbiAgICAgICAgaWYgKHRoaXMuc2luZ2xlRGF0YVNldCkge1xyXG4gICAgICAgICAgICB0aGlzLkNoYXJ0SW5zdGFuY2UuZGF0YSA9IHRoaXMuZ2VuZXJhdGVTaW5nbGVEYXRhc2V0KGRhdGFDb252ZXJ0ZWQpOztcclxuICAgICAgICAgICAgZGF0ZUF4aXMuY3Vyc29yVG9vbHRpcEVuYWJsZWQgPSBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGRhdGFDb252ZXJ0ZWQuc2VyaWVzLmZvckVhY2goKHMsIGluZGV4KSA9PiB7XHJcbiAgICAgICAgICAgIGxldCBzdGFja2VkID0gcy5zdGFja2VkICE9IG51bGwgJiYgcy5zdGFja2VkICE9IHVuZGVmaW5lZCA/IHMuc3RhY2tlZCA6IChzZXR0aW5ncz8uU3RhY2tlZCA/PyBmYWxzZSk7XHJcbiAgICAgICAgICAgIGxldCBmaWxsID0gc3RhY2tlZCB8fCAocy5maWxsICE9IG51bGwgJiYgcy5maWxsICE9IHVuZGVmaW5lZCA/IHMuZmlsbCA6IChzZXR0aW5ncz8uRmlsbCA/PyBmYWxzZSkpO1xyXG4gICAgICAgICAgICBsZXQgc2VyaWVzOiBhbTRjaGFydHMuU3RlcExpbmVTZXJpZXMgfCBhbTRjaGFydHMuTGluZVNlcmllcyA9IHNldHRpbmdzPy5TdGVwID8gbmV3IGFtNGNoYXJ0cy5TdGVwTGluZVNlcmllcygpIDogbmV3IGFtNGNoYXJ0cy5MaW5lU2VyaWVzKCk7XHJcbiAgICAgICAgICAgIHNlcmllcy5kYXRhRmllbGRzLnZhbHVlWSA9IFwidlwiICsgKHRoaXMuc2luZ2xlRGF0YVNldCA/IGluZGV4IDogXCJcIik7XHJcbiAgICAgICAgICAgIHNlcmllcy5kYXRhRmllbGRzLmRhdGVYID0gXCJkXCI7XHJcbiAgICAgICAgICAgICg8YW55PnNlcmllcykubWVhc3VyZVVuaXQgPSBzLnVvbTtcclxuICAgICAgICAgICAgc2VyaWVzLm5hbWUgPSBzLm5hbWU7XHJcbiAgICAgICAgICAgIHNlcmllcy5zdHJva2VXaWR0aCA9IHNldHRpbmdzPy5TdHJva2VTaXplID8/IDE7XHJcbiAgICAgICAgICAgIHNlcmllcy5jb25uZWN0ID0gIWdhcHNBbGxvd2VkO1xyXG4gICAgICAgICAgICBzZXJpZXMubWluQnVsbGV0RGlzdGFuY2UgPSAxMDtcclxuICAgICAgICAgICAgc2VyaWVzLnRvb2x0aXBUZXh0ID0gdGhpcy5zaW5nbGVEYXRhU2V0ID8gXCJcIiA6IHMubmFtZSA/IFwie25hbWV9OiBbYm9sZF17dmFsdWVZfVsvXVwiIDogXCJbYm9sZF17dmFsdWVZfVsvXVwiO1xyXG4gICAgICAgICAgICBzZXJpZXMudG9vbHRpcC5wb2ludGVyT3JpZW50YXRpb24gPSBcInZlcnRpY2FsXCI7XHJcbiAgICAgICAgICAgIHNlcmllcy50b29sdGlwLmJhY2tncm91bmQuZmlsbE9wYWNpdHkgPSAwLjU7XHJcbiAgICAgICAgICAgIHNlcmllcy50b29sdGlwLmxhYmVsLnBhZGRpbmcoMTIsIDEyLCAxMiwgMTIpO1xyXG4gICAgICAgICAgICBzZXJpZXMuZmlsbE9wYWNpdHkgPSBmaWxsID8gdGhpcy5PcGFjaXR5T25GaWxsIDogMC4wMDAxO1xyXG4gICAgICAgICAgICBzZXJpZXMuc3RhY2tlZCA9IHN0YWNrZWQ7XHJcbiAgICAgICAgICAgIHNlcmllcy5oaWRkZW4gPSBzLmhpZGRlbjtcclxuXHJcbiAgICAgICAgICAgIC8vRGF0YXNldCBzaW5nb2xvLCBpIGRhdGkgc29ubyByZWdpc3RyYXRpIGEgbGl2ZWxsbyBkaSBjaGFydCwgY3JlbyBpbCB0b29sdGlwIGNoZSBwZXJtZXR0ZSBkaSB2ZWRlcmxpIHR1dHRpIGluc2llbWVcclxuICAgICAgICAgICAgLy9hbHRyaW1lbnRpIGFzc2Vnbm8gaSBkYXRpIGRlbGxhIHNlcmllIGRpcmV0dGFtZW50ZSBhbGxhIHNlcmllXHJcbiAgICAgICAgICAgIGlmICh0aGlzLnNpbmdsZURhdGFTZXQpIHtcclxuICAgICAgICAgICAgICAgIHNlcmllcy50b29sdGlwLmdldEZpbGxGcm9tT2JqZWN0ID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBzZXJpZXMudG9vbHRpcC5iYWNrZ3JvdW5kLmZpbGwgPSBhbTRjb3JlLmNvbG9yKFwiI2VlZVwiKTtcclxuICAgICAgICAgICAgICAgIHNlcmllcy50b29sdGlwLmxhYmVsLmZpbGwgPSBhbTRjb3JlLmNvbG9yKFwiIzAwXCIpO1xyXG4gICAgICAgICAgICAgICAgc2VyaWVzLnRvb2x0aXAuZGVmYXVsdFN0YXRlLnRyYW5zaXRpb25EdXJhdGlvbiA9IDA7XHJcbiAgICAgICAgICAgICAgICBzZXJpZXMudG9vbHRpcC5oaWRkZW5TdGF0ZS50cmFuc2l0aW9uRHVyYXRpb24gPSAwO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vVXRpbGl6em8gaWwgbWlvIGRhdGVTZXJ2aWNlIHBlciBsYSBmb3JtYXR0YXppb25lIGRlbGxhIGRhdGEgaW4gbW9kbyBjaGUgbm9uIGRlYmJhIG1haSBnZXN0aXJlIG4gZm9ybWF0aSBmcmEgbiBsaWJyZXJpZS4uLiBiZWxsaXNzaW1vXHJcbiAgICAgICAgICAgICAgICBzZXJpZXMuZGF0ZUZvcm1hdHRlci5mb3JtYXQgPSAoc291cmNlOiBEYXRlKTogc3RyaW5nID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaW50ZXJ2YWwgJiYgZmluYWxJbnN0YW50ICYmIFtcImhvdXJcIiwgXCJtaW51dGVcIiwgXCJzZWNvbmRcIl0uaW5jbHVkZXMoaW50ZXJ2YWwudGltZXVuaXQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0aW1lcGFydDogXCJtaW51dGVcIiB8IFwiaG91clwiIHwgXCJkYXlcIiA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoaW50ZXJ2YWwudGltZXVuaXQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJob3VyXCI6IHRpbWVwYXJ0ID0gJ2RheSc7IGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcIm1pbnV0ZVwiOiB0aW1lcGFydCA9ICdob3VyJzsgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwic2Vjb25kXCI6IHRpbWVwYXJ0ID0gJ21pbnV0ZSc7IGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aW1lcGFydClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGVFeHRzLmFkanVzdERhdGVUb0ZpbmFsSW5zdGFudChzb3VyY2UsIHRpbWVwYXJ0LCBpbnRlcnZhbCA/IGludGVydmFsLnRpbWV1bml0ID09IFwic2Vjb25kXCIgOiBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0ZUV4dHMuZ2V0Rm9ybWF0dGVkKHNvdXJjZSwgaW50ZXJ2YWwgPyBbXCJkYXlcIiwgXCJ3ZWVrXCIsIFwibW9udGhcIiwgXCJ5ZWFyXCJdLmluY2x1ZGVzKGludGVydmFsLnRpbWV1bml0KSA6IGZhbHNlLCBpbnRlcnZhbCA/IGludGVydmFsLnRpbWV1bml0ID09IFwic2Vjb25kXCIgOiBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgKDxhbnk+c2VyaWVzLmFkYXB0ZXIpLmFkZChcInRvb2x0aXBUZXh0XCIsICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgdGV4dCA9IFwiW2JvbGRde2RhdGVYLmZvcm1hdERhdGUoKX1bL11cXG5cIjtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLkNoYXJ0SW5zdGFuY2Uuc2VyaWVzLmVhY2goKGl0ZW0pID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHVvbSA9IFwiIFtmb250LXN0eWxlOiBpdGFsaWNdXCIgKyAoPGFueT5zZXJpZXMpLm1lYXN1cmVVbml0IHx8IFwiXCIgKyBcIlsvXVwiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ICs9IFwiW1wiICsgKDxhbnk+aXRlbS5zdHJva2UpLmhleCArIFwiXeKXj1svXSBcIiArIChpdGVtLm5hbWUgPyAoaXRlbS5uYW1lICsgXCI6IFwiKSA6IFwiXCIpICsgXCJbYm9sZF17XCIgKyBpdGVtLmRhdGFGaWVsZHMudmFsdWVZICsgXCJ9Wy9dXCIgKyB1b20gKyBcIlxcblwiO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0ZXh0O1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgc2VyaWVzLmRhdGEgPSBzLnZhbHVlcztcclxuXHJcbiAgICAgICAgICAgIGxldCBzZWdtZW50ID0gc2VyaWVzLnNlZ21lbnRzLnRlbXBsYXRlO1xyXG5cclxuICAgICAgICAgICAgbGV0IGhvdmVyU3RhdGUgPSBzZWdtZW50LnN0YXRlcy5jcmVhdGUoXCJob3ZlclwiKTtcclxuICAgICAgICAgICAgaG92ZXJTdGF0ZS5wcm9wZXJ0aWVzLnN0cm9rZVdpZHRoID0gKHNldHRpbmdzPy5TdHJva2VTaXplID8/IDEpICsgMTtcclxuXHJcbiAgICAgICAgICAgIGxldCBkaW1tZWQgPSBzZWdtZW50LnN0YXRlcy5jcmVhdGUoXCJkaW1tZWRcIik7XHJcbiAgICAgICAgICAgIGRpbW1lZC5wcm9wZXJ0aWVzLnN0cm9rZSA9IGFtNGNvcmUuY29sb3IoXCIjZGFkYWRhXCIpO1xyXG5cclxuICAgICAgICAgICAgLy9TZSBsYSBzZXJpZSBoYSB1biBjb2xvcmUsIHVzbyBxdWVsbG8sIGFsdHJpbWVudGkgcGVzY28gZGFpIGNvbG9yaSBkaSBkZWZhdWx0IGFuZGFuZG8gaW4gb3JkaW5lXHJcbiAgICAgICAgICAgIGlmIChzLmNvbG9yKVxyXG4gICAgICAgICAgICAgICAgc2VyaWVzQ29sb3JzLnB1c2goYW00Y29yZS5jb2xvcihzLmNvbG9yKSk7XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgc2VyaWVzQ29sb3JzLnB1c2goQ2hhcnRJbnN0YW5jZUNhc3RlZC5jb2xvcnMubGlzdFtkZWZhdWx0SW5kZXggJSBDaGFydEluc3RhbmNlQ2FzdGVkLmNvbG9ycy5saXN0Lmxlbmd0aF0pXHJcbiAgICAgICAgICAgICAgICBkZWZhdWx0SW5kZXgrKztcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgc2VyaWVzVG9QdXNoLnB1c2goc2VyaWVzKTtcclxuICAgICAgICB9KTtcclxuXHJcblxyXG4gICAgICAgIENoYXJ0SW5zdGFuY2VDYXN0ZWQuY29sb3JzLmxpc3QgPSBzZXJpZXNDb2xvcnM7XHJcbiAgICAgICAgLy9TY3Jpdm8gbGUgc2VyaWUgbmVsIGdyYWZpY29cclxuICAgICAgICBzZXJpZXNUb1B1c2guZm9yRWFjaChzID0+IHtcclxuICAgICAgICAgICAgQ2hhcnRJbnN0YW5jZUNhc3RlZC5zZXJpZXMucHVzaChzKTtcclxuICAgICAgICAgICAgaWYgKHNob3dUaW1lbGluZSlcclxuICAgICAgICAgICAgICAgICg8YW00Y2hhcnRzLlhZQ2hhcnRTY3JvbGxiYXI+Q2hhcnRJbnN0YW5jZUNhc3RlZC5zY3JvbGxiYXJYKS5zZXJpZXMucHVzaChzKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgaWYgKHNldHRpbmdzLkxlZ2VuZCkge1xyXG4gICAgICAgICAgICB0aGlzLkNoYXJ0SW5zdGFuY2UubGVnZW5kID0gbmV3IGFtNGNoYXJ0cy5MZWdlbmQoKTtcclxuICAgICAgICAgICAgdGhpcy5DaGFydEluc3RhbmNlLmxlZ2VuZC5wb3NpdGlvbiA9IHNldHRpbmdzPy5MZWdlbmRQb3NpdGlvbiA/PyAncmlnaHQnO1xyXG4gICAgICAgICAgICB0aGlzLkNoYXJ0SW5zdGFuY2UubGVnZW5kLnNjcm9sbGFibGUgPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5DaGFydEluc3RhbmNlLmxlZ2VuZC5pdGVtQ29udGFpbmVycy50ZW1wbGF0ZS50b29sdGlwVGV4dCA9IFwie25hbWV9XCI7XHJcbiAgICAgICAgICAgIHRoaXMuQ2hhcnRJbnN0YW5jZS5sZWdlbmQuaXRlbUNvbnRhaW5lcnMudGVtcGxhdGUuZXZlbnRzLm9uKFwib3ZlclwiLCAoZXZlbnQpID0+IHsgdGhpcy5wcm9jZXNzT3Zlcig8YW00Y2hhcnRzLkxpbmVTZXJpZXM+ZXZlbnQudGFyZ2V0LmRhdGFJdGVtLmRhdGFDb250ZXh0KTsgfSk7XHJcbiAgICAgICAgICAgIHRoaXMuQ2hhcnRJbnN0YW5jZS5sZWdlbmQuaXRlbUNvbnRhaW5lcnMudGVtcGxhdGUuZXZlbnRzLm9uKFwib3V0XCIsICgpID0+IHsgdGhpcy5wcm9jZXNzT3V0KCk7IH0pO1xyXG5cclxuICAgICAgICAgICAgaWYgKHNldHRpbmdzLkxlZ2VuZFBhZGRpbmcpIHtcclxuICAgICAgICAgICAgICAgIGxldCB0ZW1wbGF0ZSA9IHRoaXMuQ2hhcnRJbnN0YW5jZS5sZWdlbmQuaXRlbUNvbnRhaW5lcnMudGVtcGxhdGU7XHJcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZS5wYWRkaW5nVG9wID0gc2V0dGluZ3MuTGVnZW5kUGFkZGluZy50b3AgPz8gMDtcclxuICAgICAgICAgICAgICAgIHRlbXBsYXRlLnBhZGRpbmdCb3R0b20gPSBzZXR0aW5ncy5MZWdlbmRQYWRkaW5nLmJvdHRvbSA/PyAwO1xyXG4gICAgICAgICAgICAgICAgdGVtcGxhdGUucGFkZGluZ0xlZnQgPSBzZXR0aW5ncy5MZWdlbmRQYWRkaW5nLmxlZnQgPz8gMDtcclxuICAgICAgICAgICAgICAgIHRlbXBsYXRlLnBhZGRpbmdSaWdodCA9IHNldHRpbmdzLkxlZ2VuZFBhZGRpbmcucmlnaHQgPz8gMDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5DaGFydEluc3RhbmNlLmN1cnNvciA9IG5ldyBhbTRjaGFydHMuWFlDdXJzb3IoKTtcclxuXHJcbiAgICAgICAgLy9Qcm92ZSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG4gICAgICAgIC8vIHRoaXMuQ2hhcnRJbnN0YW5jZS5jdXJzb3IuZXZlbnRzLm9uKFwiY3Vyc29ycG9zaXRpb25jaGFuZ2VkXCIsIChldikgPT4ge1xyXG4gICAgICAgIC8vICAgICAvL3ZhciB2YWx1ZSA9IGRhdGVBeGlzLnBvc2l0aW9uVG9EYXRlKGRhdGVBeGlzLnRvQXhpc1Bvc2l0aW9uKGV2LnRhcmdldC54UG9zaXRpb24pKTtcclxuICAgICAgICAvLyAgICAgdmFyIGR0ID0gZGF0ZUF4aXMuc2VyaWVzLnZhbHVlcy5maW5kKHQgPT4gdC5kYXRhSXRlbS52YWx1ZXMuZGF0ZVgpO1xyXG4gICAgICAgIC8vICAgICBpZiAoZHQgJiYgZHQuZGF0YUl0ZW0pIHtcclxuICAgICAgICAvLyAgICAgICAgIGNvbnNvbGUubG9nKGR0LmRhdGFJdGVtLnZhbHVlcyk7XHJcbiAgICAgICAgLy8gICAgICAgICAvLyB0aGlzLkNoYXJ0SW5zdGFuY2UudG9vbHRpcFRleHQgPSBkdDtcclxuICAgICAgICAvLyAgICAgfVxyXG4gICAgICAgIC8vICAgICBlbHNlIHtcclxuICAgICAgICAvLyAgICAgICAgIHRoaXMuQ2hhcnRJbnN0YW5jZS50b29sdGlwVGV4dCA9IFwiXCI7XHJcbiAgICAgICAgLy8gICAgIH1cclxuICAgICAgICAvLyB9KTtcclxuICAgICAgICAvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG5cclxuICAgICAgICB0aGlzLkNoYXJ0SW5zdGFuY2UuY3Vyc29yLnhBeGlzID0gZGF0ZUF4aXM7XHJcbiAgICAgICAgdGhpcy5DaGFydEluc3RhbmNlLmN1cnNvci55QXhpcyA9IHlBeGlzO1xyXG4gICAgICAgIGlmICh0aGlzLnNpbmdsZURhdGFTZXQpXHJcbiAgICAgICAgICAgIHRoaXMuQ2hhcnRJbnN0YW5jZS5jdXJzb3IubWF4VG9vbHRpcERpc3RhbmNlID0gLTE7XHJcblxyXG4gICAgICAgIC8vVE9ETzogQ2VyY2FyZSBkaSBjYXBpcmUgcGVyY2jDqSDDqCBmaWdsaW8gZGkgcHV0dGFuYS4uLi4uLlxyXG4gICAgICAgIGRhdGVBeGlzLmV2ZW50cy5vbihcInN0YXJ0Y2hhbmdlZFwiLCB0ID0+IHRoaXMuZW1pdFNlbGVjdGlvbkNoYW5nZWQodCwgc2V0dGluZ3MpKTtcclxuICAgICAgICBkYXRlQXhpcy5ldmVudHMub24oXCJlbmRjaGFuZ2VkXCIsIHQgPT4gdGhpcy5lbWl0U2VsZWN0aW9uQ2hhbmdlZCh0LCBzZXR0aW5ncykpO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIGZpeFRpbWVVbml0KHR1OiBhbnkpOiBcIm1pbGxpc2Vjb25kXCIgfCBcInNlY29uZFwiIHwgXCJtaW51dGVcIiB8IFwiaG91clwiIHwgXCJkYXlcIiB8IFwid2Vla1wiIHwgXCJtb250aFwiIHwgXCJ5ZWFyXCIge1xyXG4gICAgICAgIGlmICh0dSA9PT0gMCkgcmV0dXJuIFwibWlsbGlzZWNvbmRcIjtcclxuICAgICAgICBlbHNlIGlmICh0dSA9PT0gMSkgcmV0dXJuIFwic2Vjb25kXCI7XHJcbiAgICAgICAgZWxzZSBpZiAodHUgPT09IDIpIHJldHVybiBcIm1pbnV0ZVwiO1xyXG4gICAgICAgIGVsc2UgaWYgKHR1ID09PSAzKSByZXR1cm4gXCJob3VyXCI7XHJcbiAgICAgICAgZWxzZSBpZiAodHUgPT09IDQpIHJldHVybiBcImRheVwiO1xyXG4gICAgICAgIGVsc2UgaWYgKHR1ID09PSA1KSByZXR1cm4gXCJ3ZWVrXCI7XHJcbiAgICAgICAgZWxzZSBpZiAodHUgPT09IDYpIHJldHVybiBcIm1vbnRoXCI7XHJcbiAgICAgICAgZWxzZSBpZiAodHUgPT09IDcpIHJldHVybiBcInllYXJcIjtcclxuICAgICAgICBlbHNlIHJldHVybiB0dTtcclxuICAgICAgfVxyXG4gICAgICBcclxuICAgIC8qKiBAaWdub3JlICovXHJcbiAgICBzZXRTZWxlY3Rpb24oZnJvbTogRGF0ZSwgdG86IERhdGUpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmRhdGVBeGlzLnpvb21Ub0RhdGVzKGZyb20sIHRvLCB0cnVlLCB0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGlnbm9yZSAqL1xyXG4gICAgcHVibGljIHJlZnJlc2hEYXRhKGRhdGE6IExpbmVDaGFydERhdGEgfCBhbnkpIHtcclxuICAgICAgICBsZXQgZGF0YUNvbnZlcnRlZDogTGluZUNoYXJ0RGF0YSA9IHRoaXMuQWRhcHRlciA/IHRoaXMuQWRhcHRlci5hZGFwdERhdGFGb3JMaW5lQ2hhcnQoZGF0YSkgOiBkYXRhO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5zaW5nbGVEYXRhU2V0KSB7XHJcbiAgICAgICAgICAgIHZhciBkYXRhID0gdGhpcy5nZW5lcmF0ZVNpbmdsZURhdGFzZXQoZGF0YUNvbnZlcnRlZCk7XHJcbiAgICAgICAgICAgIHRoaXMuQ2hhcnRJbnN0YW5jZS5hZGREYXRhKGRhdGEpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aHJvdyBcIkltcG9zc2liaWxlIGFnZ2lvcm5hcmUgaSBkYXRpIHNlbnphIHVuaXJlIGlsIGRhdGFzZXQuIFNpIHByZWdhIGRpIGltcG9zdGFyZSBbTWVyZ2VEYXRhc2V0c10gYSB0cnVlXCJcclxuXHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFBhcnRlbmRvIGRhIGRhdGkgZGl2aXNpIHBlciBzZXJpdWUgZ2VuZXJhIHVuIGRhdGFzZXQgdW5pdG8gY29uIGxhIGRhdGEgY29tZSBjaGlhdmUgZSBpIHZhcmkgdmFsb3JpIGRvcG8gKi9cclxuICAgIHByaXZhdGUgZ2VuZXJhdGVTaW5nbGVEYXRhc2V0KGRhdGE6IExpbmVDaGFydERhdGEpOiBhbnkge1xyXG4gICAgICAgIGxldCBkdG86IHsgW2luZGV4OiBudW1iZXJdOiB7IFtzaW5kZXg6IHN0cmluZ106IG51bWJlciB9IH0gPSB7fTtcclxuICAgICAgICBkYXRhLnNlcmllcy5mb3JFYWNoKCh2cywgaW5kZXgpID0+IHtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2cy52YWx1ZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIHZhciBkYXRhaXRlbSA9IHZzLnZhbHVlc1tpXTtcclxuICAgICAgICAgICAgICAgIHZhciBpbmRleGVyID0gbmV3IERhdGUoZGF0YWl0ZW0uZCkudmFsdWVPZigpO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICghZHRvW2luZGV4ZXJdKVxyXG4gICAgICAgICAgICAgICAgICAgIGR0b1tpbmRleGVyXSA9IHt9O1xyXG5cclxuICAgICAgICAgICAgICAgIGR0b1tpbmRleGVyXVsndicgKyBpbmRleF0gPSBkYXRhaXRlbS52O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHZhciBkYXRlcyA9IE9iamVjdC5rZXlzKGR0byk7XHJcbiAgICAgICAgdmFyIHJldCA9IFtdO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0ZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgbGV0IHZhbHVlczogeyBbc2luZGV4OiBzdHJpbmddOiBudW1iZXIgfSA9IGR0b1tkYXRlc1tpXV07XHJcbiAgICAgICAgICAgIGxldCBpdGVtID0geyBkOiBuZXcgRGF0ZShwYXJzZUludChkYXRlc1tpXSkpIH07XHJcblxyXG4gICAgICAgICAgICB2YXIgdmFscyA9IE9iamVjdC5rZXlzKHZhbHVlcyk7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGlpID0gMDsgaWkgPCB2YWxzLmxlbmd0aDsgaWkrKykge1xyXG4gICAgICAgICAgICAgICAgbGV0IHNlcmllcyA9IHZhbHNbaWldO1xyXG4gICAgICAgICAgICAgICAgbGV0IHNpbmdsZVZhbCA9IHZhbHVlc1tzZXJpZXNdO1xyXG4gICAgICAgICAgICAgICAgaXRlbVtzZXJpZXNdID0gc2luZ2xlVmFsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldC5wdXNoKGl0ZW0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmV0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaWdub3JlICovXHJcbiAgICBwcml2YXRlIGVtaXRTZWxlY3Rpb25DaGFuZ2VkKGV2LCBzZXR0aW5ncykge1xyXG4gICAgICAgIGlmICgoPGFueT5zZXR0aW5ncykuT25TZWxlY3Rpb25DaGFuZ2VkQ2FsbGJhY2spIHtcclxuICAgICAgICAgICAgdGhpcy50aHJvdHRsYShcInNlbGNoYW5nZVwiLCAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB2YXIgYXhpcyA9IDxhbTRjaGFydHMuRGF0ZUF4aXM+ZXYudGFyZ2V0XHJcbiAgICAgICAgICAgICAgICB2YXIgc3RhcnQgPSBuZXcgRGF0ZShheGlzLm1pblpvb21lZCk7XHJcbiAgICAgICAgICAgICAgICB2YXIgZW5kID0gbmV3IERhdGUoYXhpcy5tYXhab29tZWQpO1xyXG4gICAgICAgICAgICAgICAgdmFyIGluaXRpYWwgPSBheGlzLm1pbiA9PSBheGlzLm1pblpvb21lZCAmJiBheGlzLm1heCA9PSBheGlzLm1heFpvb21lZDtcclxuICAgICAgICAgICAgICAgICg8YW55PnNldHRpbmdzKS5PblNlbGVjdGlvbkNoYW5nZWRDYWxsYmFjayh7IGZyb206IHN0YXJ0LCB0bzogZW5kLCBpbml0aWFsOiBpbml0aWFsIH0pO1xyXG4gICAgICAgICAgICB9LCAxNTApXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaWdub3JlICovXHJcbiAgICBwcml2YXRlIHByb2Nlc3NPdmVyKGhvdmVyZWRTZXJpZXM6IGFtNGNoYXJ0cy5MaW5lU2VyaWVzKSB7XHJcbiAgICAgICAgaG92ZXJlZFNlcmllcy56SW5kZXggPSA5OTk7XHJcbiAgICAgICAgbGV0IGZpbGwgPSBob3ZlcmVkU2VyaWVzLmZpbGxPcGFjaXR5ID09IHRoaXMuT3BhY2l0eU9uRmlsbDtcclxuICAgICAgICBob3ZlcmVkU2VyaWVzLnNlZ21lbnRzLmVhY2goKHNlZ21lbnQpID0+IHtcclxuICAgICAgICAgICAgc2VnbWVudC5zZXRTdGF0ZShcImhvdmVyXCIpO1xyXG4gICAgICAgICAgICBpZiAoIWZpbGwpXHJcbiAgICAgICAgICAgICAgICBzZWdtZW50LmZpbGxTcHJpdGUuZmlsbE9wYWNpdHkgPSB0aGlzLk9wYWNpdHlPblNlbGVjdGVkO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGlmICghZmlsbClcclxuICAgICAgICAgICAgaG92ZXJlZFNlcmllcy5sZWdlbmREYXRhSXRlbS5tYXJrZXIuY2hpbGRyZW4uZ2V0SW5kZXgoMSkuZmlsbE9wYWNpdHkgPSB0aGlzLk9wYWNpdHlPblNlbGVjdGVkO1xyXG5cclxuICAgICAgICB0aGlzLkNoYXJ0SW5zdGFuY2Uuc2VyaWVzLmVhY2goKHNlcmllcykgPT4ge1xyXG4gICAgICAgICAgICBpZiAoc2VyaWVzICE9IGhvdmVyZWRTZXJpZXMpIHtcclxuICAgICAgICAgICAgICAgIGxldCBmaWxsID0gc2VyaWVzLmZpbGxPcGFjaXR5ID09IHRoaXMuT3BhY2l0eU9uRmlsbDtcclxuICAgICAgICAgICAgICAgICg8YW00Y2hhcnRzLkxpbmVTZXJpZXM+c2VyaWVzKS5zZWdtZW50cy5lYWNoKChzZWdtZW50KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VnbWVudC5zZXRTdGF0ZShcImRpbW1lZFwiKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIWZpbGwpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlZ21lbnQuZmlsbFNwcml0ZS5maWxsT3BhY2l0eSA9IDA7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaWdub3JlICovXHJcbiAgICBwcml2YXRlIHByb2Nlc3NPdXQoKSB7XHJcbiAgICAgICAgdGhpcy5DaGFydEluc3RhbmNlLnNlcmllcy5lYWNoKChzZXJpZXMsIGkpID0+IHtcclxuICAgICAgICAgICAgc2VyaWVzLnpJbmRleCA9IGk7XHJcbiAgICAgICAgICAgIGxldCBmaWxsID0gc2VyaWVzLmZpbGxPcGFjaXR5ID09IHRoaXMuT3BhY2l0eU9uRmlsbDtcclxuICAgICAgICAgICAgKDxhbTRjaGFydHMuTGluZVNlcmllcz5zZXJpZXMpLnNlZ21lbnRzLmVhY2goKHNlZ21lbnQpID0+IHtcclxuICAgICAgICAgICAgICAgIHNlZ21lbnQuc2V0U3RhdGUoXCJkZWZhdWx0XCIpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFmaWxsKVxyXG4gICAgICAgICAgICAgICAgICAgIHNlZ21lbnQuZmlsbFNwcml0ZS5maWxsT3BhY2l0eSA9IDA7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBpZiAoIWZpbGwpXHJcbiAgICAgICAgICAgICAgICBzZXJpZXMubGVnZW5kRGF0YUl0ZW0ubWFya2VyLmNoaWxkcmVuLmdldEluZGV4KDEpLmZpbGxPcGFjaXR5ID0gMDtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyoqKioqKioqKioqKioqKioqKioqIEZ1bnppb25lIGRpIHRocm90dGxpbmcgcGVyIG5vbiBzcGFtbWFyZSByaWNoaWVzdGUgaW4gY2FzbyBkaSBhbmltYXppb25pIGF0dGl2YXRlXHJcbiAgICAvL1RPRE86IHNwb3N0YXJsYSBpbiB1biBtZXRvZG8gZGkgdXRpbGl0w6AgKGVzZmFlbnphL2V4dGVuc2lvbnMpXHJcbiAgICAvKiogQGlnbm9yZSAqL1xyXG4gICAgcHJpdmF0ZSBleGVjdXRpb25UaW1lcnM6IHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfSA9IHt9O1xyXG4gICAgLyoqIEBpZ25vcmUgKi9cclxuICAgIHByaXZhdGUgdGhyb3R0bGEoaWQ6IHN0cmluZywgZnVuYzogRnVuY3Rpb24sIHRocm90dGxlVGltZTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgICAgLy9TZSBobyBsYSBmdW56aW9uZSBjaGUgdnVvbGUgZXNlZ3VpcmUgcmlwdWxpc2NvIHF1ZWwgdGltZW91dFxyXG4gICAgICAgIGlmICh0aGlzLmV4ZWN1dGlvblRpbWVyc1tpZF0pXHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLmV4ZWN1dGlvblRpbWVyc1tpZF0pO1xyXG5cclxuICAgICAgICAvL1JpY3JlbyBpbCB0aW1lb3V0IHBlciBlc2VndWlyZSBxdWVsbGEgZnVuemlvbmUgZG9wbyB0aHJvdHRsZVRpbWUgbWlsbGlzZWNvbmRpXHJcbiAgICAgICAgdGhpcy5leGVjdXRpb25UaW1lcnNbaWRdID0gc2V0VGltZW91dCgoKSA9PiB7IGZ1bmMoKTsgdGhpcy5leGVjdXRpb25UaW1lcnNbaWRdID0gbnVsbDsgfSwgdGhyb3R0bGVUaW1lKTtcclxuICAgIH1cclxuICAgIC8vKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG59Il19
|