raain-app 1.0.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/LICENSE +21 -0
- package/README.md +12 -0
- package/RELEASE.md +3 -0
- package/cache.service.d.ts +9 -0
- package/esm2020/cache.service.mjs +33 -0
- package/esm2020/fidj-storage.model.mjs +162 -0
- package/esm2020/index.mjs +18 -0
- package/esm2020/profile.service.mjs +881 -0
- package/esm2020/raain-app.mjs +5 -0
- package/esm2020/raain-compare/raain-compare.component.mjs +106 -0
- package/esm2020/raain-compare-stack/raain-compare-stack.component.mjs +27 -0
- package/esm2020/raain-configuration/raain-configuration.component.mjs +97 -0
- package/esm2020/raain-date-focus/raain-date-focus.component.mjs +94 -0
- package/esm2020/raain-map/raain-map.component.mjs +295 -0
- package/esm2020/raain-speed/raain-speed.component.mjs +83 -0
- package/esm2020/raain-test/raain-test.component.mjs +17 -0
- package/esm2020/radar.service.mjs +91 -0
- package/esm2020/shared.const.mjs +25 -0
- package/esm2020/shared.module.mjs +142 -0
- package/esm2020/shared.pipe.mjs +203 -0
- package/esm2020/storage.service.mjs +17 -0
- package/esm2020/tools/CompareManager.mjs +248 -0
- package/esm2020/tools/FrameSet.mjs +10 -0
- package/esm2020/tools/GaugeNodeFilter.mjs +19 -0
- package/esm2020/tools/RefreshManager.mjs +202 -0
- package/esm2020/tools/index.mjs +5 -0
- package/esm2020/xytype.mjs +10 -0
- package/fesm2015/raain-app.mjs +2871 -0
- package/fesm2015/raain-app.mjs.map +1 -0
- package/fesm2020/raain-app.mjs +2707 -0
- package/fesm2020/raain-app.mjs.map +1 -0
- package/fidj-storage.model.d.ts +23 -0
- package/index.d.ts +17 -0
- package/package.json +58 -0
- package/profile.service.d.ts +114 -0
- package/raain-compare/raain-compare.component.d.ts +33 -0
- package/raain-compare-stack/raain-compare-stack.component.d.ts +20 -0
- package/raain-configuration/raain-configuration.component.d.ts +29 -0
- package/raain-date-focus/raain-date-focus.component.d.ts +36 -0
- package/raain-map/raain-map.component.d.ts +58 -0
- package/raain-speed/raain-speed.component.d.ts +25 -0
- package/raain-test/raain-test.component.d.ts +6 -0
- package/radar.service.d.ts +19 -0
- package/shared.const.d.ts +23 -0
- package/shared.module.d.ts +17 -0
- package/shared.pipe.d.ts +69 -0
- package/storage.service.d.ts +7 -0
- package/tools/CompareManager.d.ts +49 -0
- package/tools/FrameSet.d.ts +14 -0
- package/tools/GaugeNodeFilter.d.ts +9 -0
- package/tools/RefreshManager.d.ts +49 -0
- package/tools/index.d.ts +4 -0
- package/xytype.d.ts +8 -0
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
import { MapLatLng } from 'raain-ui';
|
|
2
|
+
import { XYType } from '../xytype';
|
|
3
|
+
export class CompareManager {
|
|
4
|
+
constructor(rainNode, profileService, onChanges = () => {
|
|
5
|
+
}) {
|
|
6
|
+
this.rainNode = rainNode;
|
|
7
|
+
this.profileService = profileService;
|
|
8
|
+
this.onChanges = onChanges;
|
|
9
|
+
this.cleanAll();
|
|
10
|
+
}
|
|
11
|
+
static CompareDate(date1, date2, minutes) {
|
|
12
|
+
const date1AsDate = new Date(parseInt(date1, 10));
|
|
13
|
+
const date2Diff = new Date(parseInt(date2, 10));
|
|
14
|
+
date2Diff.setMinutes(date2Diff.getMinutes() + minutes);
|
|
15
|
+
const diff = Math.round((date1AsDate.getTime() - date2Diff.getTime()) / (60 * 1000));
|
|
16
|
+
return diff === 0;
|
|
17
|
+
}
|
|
18
|
+
cleanAll() {
|
|
19
|
+
this.gaugesInCompare = [];
|
|
20
|
+
this.selectedGauges = [];
|
|
21
|
+
this.selectedPixels = [];
|
|
22
|
+
this.pixelsSolutions = [];
|
|
23
|
+
this.selectedGauge = null;
|
|
24
|
+
this.selectedGaugeInPoints = null;
|
|
25
|
+
this.cleanCompareQuality('no compare');
|
|
26
|
+
}
|
|
27
|
+
async refreshCompareQuality(frameSet, targets, withCompareDuplicate) {
|
|
28
|
+
const targetsOrdered = targets
|
|
29
|
+
.sort((a, b) => a.date.getTime() - b.date.getTime())
|
|
30
|
+
.map(t => {
|
|
31
|
+
return { date: '' + t.date.getTime(), rainComputationId: t.rainComputationId, rainComputationQualityId: t.rainComputationQualityId };
|
|
32
|
+
});
|
|
33
|
+
const currentTarget = targetsOrdered.filter(t => t.date === '' + frameSet.date.getTime())[0];
|
|
34
|
+
const currentPos = targetsOrdered.indexOf(currentTarget);
|
|
35
|
+
const previousTarget = currentPos >= 0 ? targetsOrdered[currentPos - 1] : null;
|
|
36
|
+
const nextTarget = currentPos >= 0 && currentPos < targetsOrdered.length - 1 ? targetsOrdered[currentPos + 1] : null;
|
|
37
|
+
await this.fetchRainComputationQualities(targetsOrdered);
|
|
38
|
+
const currentQuality = this.rainComputationQualities[currentTarget?.date];
|
|
39
|
+
if (!currentQuality) {
|
|
40
|
+
this.cleanCompareQuality('no current quality ' + Object.keys(this.rainComputationQualities));
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
this.currentQualityDoneDate = currentQuality.isDoneDate;
|
|
44
|
+
this.currentQualityTimeSpentInMs = currentQuality.timeSpentInMs;
|
|
45
|
+
this.currentQualityLaunchedBy = currentQuality.launchedBy;
|
|
46
|
+
this.currentQualityVersion = currentQuality.version;
|
|
47
|
+
const previousQuality = previousTarget &&
|
|
48
|
+
CompareManager.CompareDate(previousTarget.date, currentTarget.date, -5) ?
|
|
49
|
+
this.rainComputationQualities[previousTarget.date] : null;
|
|
50
|
+
const nextQuality = nextTarget
|
|
51
|
+
&& CompareManager.CompareDate(nextTarget.date, currentTarget.date, +5) ?
|
|
52
|
+
this.rainComputationQualities[nextTarget.date] : null;
|
|
53
|
+
const qualitySpeedMatrixContainer = currentQuality.qualitySpeedMatrixContainer;
|
|
54
|
+
this.compareNames = qualitySpeedMatrixContainer.getMatrices()
|
|
55
|
+
.map(m => m.name)
|
|
56
|
+
.sort((a, b) => parseInt(a, 10) - parseInt(b, 10));
|
|
57
|
+
this.compareVersion = currentQuality.getVersion();
|
|
58
|
+
this.compareSpeedMatrix = qualitySpeedMatrixContainer.renderMergedMatrix({ normalize: true });
|
|
59
|
+
this.compareTrustedIndicator = qualitySpeedMatrixContainer.getTrustedIndicators()[0];
|
|
60
|
+
this.compares = this.buildCompares(currentQuality, previousQuality, nextQuality, withCompareDuplicate);
|
|
61
|
+
this.onChanges();
|
|
62
|
+
}
|
|
63
|
+
async setGauges() {
|
|
64
|
+
// console.log('setGauges');
|
|
65
|
+
const qualityPoints = [];
|
|
66
|
+
for (const compare of this.compares) {
|
|
67
|
+
for (const qualityPoint of compare.comparePointsHistory) {
|
|
68
|
+
const alreadyAdded = qualityPoints.filter(p => p?.gaugeId === qualityPoint.gaugeId);
|
|
69
|
+
if (alreadyAdded.length === 0) {
|
|
70
|
+
qualityPoints.push(qualityPoint);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
this.gaugesInCompare = qualityPoints.map(p => {
|
|
75
|
+
return new MapLatLng(p.gaugeCartesianValue.lat, p.gaugeCartesianValue.lng, 0, p.gaugeId, p.gaugeLabel + '>' + p.getGaugeValue(), p.getGaugeValue());
|
|
76
|
+
});
|
|
77
|
+
this.resetSelectedGauges();
|
|
78
|
+
}
|
|
79
|
+
async selectGauge(gaugeId, compareIndex) {
|
|
80
|
+
// console.log('selectGauge', gaugeId, compareIndex);
|
|
81
|
+
if (gaugeId) {
|
|
82
|
+
const xys = this.getCurrentQualityPoints(compareIndex).filter(p => p.gaugeId === gaugeId);
|
|
83
|
+
this.selectedGauge = xys.length === 1 ? xys[0] : null;
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
this.selectedGauge = null;
|
|
87
|
+
}
|
|
88
|
+
if (!this.selectedGauge) {
|
|
89
|
+
return this.resetSelectedGauges();
|
|
90
|
+
}
|
|
91
|
+
const selectedGaugeInPoints = this.getCurrentQualityPoints(compareIndex).filter(p => p.gaugeId === this.selectedGauge.gaugeId);
|
|
92
|
+
let pixelsSolutions = [];
|
|
93
|
+
if (selectedGaugeInPoints.length === 1) {
|
|
94
|
+
const remarks = JSON.parse(selectedGaugeInPoints[0].remark)
|
|
95
|
+
.sort((a, b) => a.criteriaAttemptedToBeMinimum - b.criteriaAttemptedToBeMinimum);
|
|
96
|
+
console.log(remarks);
|
|
97
|
+
pixelsSolutions = remarks
|
|
98
|
+
.map(remark => remark.solutionForGauge.pixels
|
|
99
|
+
.map(p => new MapLatLng(p.y + 0.005, p.x + 0.01, 0, '' + !remark.notPossible, '' + !remark.notPossible, 1)));
|
|
100
|
+
const timeDeltaInMinutes = selectedGaugeInPoints[0].getTimeDeltaInMinutes();
|
|
101
|
+
this.selectedGaugeInPointsDetail = '' + selectedGaugeInPoints[0].gaugeLabel + ' > '
|
|
102
|
+
+ Math.round(selectedGaugeInPoints[0].getGaugeValue() * 100) / 100 + ' / '
|
|
103
|
+
+ Math.round(selectedGaugeInPoints[0].getRainValue() * 100) / 100
|
|
104
|
+
+ ' dT=' + timeDeltaInMinutes;
|
|
105
|
+
this.selectedGaugeInPoints = selectedGaugeInPoints[0];
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
this.selectedGaugeInPoints = null;
|
|
109
|
+
this.selectedGauges = [];
|
|
110
|
+
this.selectedPixels = [];
|
|
111
|
+
this.pixelsSolutions = [];
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
this.selectedGauges = [
|
|
115
|
+
new MapLatLng(this.selectedGaugeInPoints.gaugeCartesianValue.lat, this.selectedGaugeInPoints.gaugeCartesianValue.lng, undefined, this.selectedGaugeInPoints.gaugeId, this.selectedGaugeInPoints.gaugeLabel + '>' + this.selectedGaugeInPoints.gaugeCartesianValue.value, this.selectedGaugeInPoints.gaugeCartesianValue.value),
|
|
116
|
+
];
|
|
117
|
+
this.selectGaugeInCompare();
|
|
118
|
+
const pixels = [];
|
|
119
|
+
for (const rainCartesianValue of this.selectedGaugeInPoints.rainCartesianValues) {
|
|
120
|
+
pixels.push(new MapLatLng(rainCartesianValue.lat + 0.005, rainCartesianValue.lng + 0.01));
|
|
121
|
+
}
|
|
122
|
+
this.selectedPixels = pixels;
|
|
123
|
+
this.pixelsSolutions = pixelsSolutions;
|
|
124
|
+
}
|
|
125
|
+
getCurrentQualityPoints(compareIndex) {
|
|
126
|
+
if (compareIndex < 0 || this.compareNames.length < compareIndex) {
|
|
127
|
+
return [];
|
|
128
|
+
}
|
|
129
|
+
return this.compares[compareIndex].comparePointsHistory;
|
|
130
|
+
}
|
|
131
|
+
cleanCompareQuality(details) {
|
|
132
|
+
this.compareVersion = details;
|
|
133
|
+
this.compareNames = [];
|
|
134
|
+
this.compares = [];
|
|
135
|
+
this.rainComputationQualities = {};
|
|
136
|
+
}
|
|
137
|
+
async fetchRainComputationQualities(targetsOrdered) {
|
|
138
|
+
for (const key of Object.keys(this.rainComputationQualities)) {
|
|
139
|
+
const found = targetsOrdered.filter(t => t.date === key);
|
|
140
|
+
if (found.length < 0) {
|
|
141
|
+
delete this.rainComputationQualities[key];
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
for (const target of targetsOrdered) {
|
|
145
|
+
if (!this.rainComputationQualities[target.date] && target.rainComputationQualityId) {
|
|
146
|
+
try {
|
|
147
|
+
this.rainComputationQualities[target.date] = await this.profileService
|
|
148
|
+
.getRainCompareById(this.rainNode.getId(), target.rainComputationId, target.rainComputationQualityId);
|
|
149
|
+
}
|
|
150
|
+
catch (e) {
|
|
151
|
+
console.log(e);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
buildCompares(currentQuality, previousQuality, nextQuality, withCompareDuplicate) {
|
|
157
|
+
const compares = [];
|
|
158
|
+
const qualitySpeedMatrixContainer = currentQuality.qualitySpeedMatrixContainer;
|
|
159
|
+
for (const [index, name] of this.compareNames.entries()) {
|
|
160
|
+
const comparePointsHistory = qualitySpeedMatrixContainer.getQualityPoints(name);
|
|
161
|
+
const maxValue = Math.max(qualitySpeedMatrixContainer.getMaxGauge(), qualitySpeedMatrixContainer.getMaxRain());
|
|
162
|
+
const remarks = qualitySpeedMatrixContainer.getMatrix(index)?.remarks;
|
|
163
|
+
const delta = parseInt(name, 10);
|
|
164
|
+
let renamed = new Date(currentQuality.date.getTime() - delta * 60 * 1000).toLocaleString();
|
|
165
|
+
renamed += delta > 0 ? ' since ' : ' in ';
|
|
166
|
+
renamed += Math.abs(delta) + ' minutes';
|
|
167
|
+
console.log('index:', index, 'delta:', delta, 'renamed:', renamed);
|
|
168
|
+
// remove previous or next better values from comparePoints
|
|
169
|
+
let qualityPoints = comparePointsHistory.filter((p) => p); // no real filter
|
|
170
|
+
const removeDuplicates = !withCompareDuplicate;
|
|
171
|
+
if (removeDuplicates) {
|
|
172
|
+
if (index === this.compareNames.length - 1) {
|
|
173
|
+
if (!previousQuality?.qualitySpeedMatrixContainer) {
|
|
174
|
+
qualityPoints = [];
|
|
175
|
+
}
|
|
176
|
+
else {
|
|
177
|
+
qualityPoints = qualityPoints.filter((p) => {
|
|
178
|
+
const previousQPs = previousQuality.qualitySpeedMatrixContainer
|
|
179
|
+
.getQualityPointsByHistoricalPosition(0)
|
|
180
|
+
.filter(previousQP => p.gaugeId === previousQP.gaugeId);
|
|
181
|
+
// better before ?
|
|
182
|
+
const betterBefore = (previousQPs.length === 1 && p.getDelta() > previousQPs[0].getDelta());
|
|
183
|
+
if (betterBefore) {
|
|
184
|
+
console.log('removed from', renamed, p.gaugeLabel, previousQuality.date.toISOString(), p.getDelta(), previousQPs.length === 1 ? previousQPs[0].getDelta() + ' dated ' + previousQPs[0].gaugeDate.toISOString() : 0);
|
|
185
|
+
return false; // => remove it
|
|
186
|
+
}
|
|
187
|
+
return true;
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
else if (index === 0) {
|
|
192
|
+
if (!nextQuality?.qualitySpeedMatrixContainer) {
|
|
193
|
+
qualityPoints = [];
|
|
194
|
+
}
|
|
195
|
+
else {
|
|
196
|
+
qualityPoints = qualityPoints.filter((p) => {
|
|
197
|
+
const nextQPs = nextQuality.qualitySpeedMatrixContainer
|
|
198
|
+
.getQualityPointsByHistoricalPosition(1)
|
|
199
|
+
.filter(nextQP => p.gaugeId === nextQP.gaugeId);
|
|
200
|
+
// better after ?
|
|
201
|
+
const betterAfter = (nextQPs.length === 1 && p.getDelta() > nextQPs[0].getDelta());
|
|
202
|
+
if (betterAfter) {
|
|
203
|
+
console.log('removed from', renamed, p.gaugeLabel, nextQuality.date.toISOString(), p.getDelta(), nextQPs.length === 1 ? nextQPs[0].getDelta() + ' dated ' + nextQPs[0].gaugeDate.toISOString() : 0);
|
|
204
|
+
return false; // => remove it
|
|
205
|
+
}
|
|
206
|
+
return true;
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
const comparePoints = qualityPoints.map((qualityPoint) => new XYType(qualityPoint.getGaugeValue(), qualityPoint.getRainValue(), 2, qualityPoint.gaugeLabel, qualityPoint.gaugeId));
|
|
212
|
+
const compare = {
|
|
213
|
+
name: renamed,
|
|
214
|
+
comparePointsHistory,
|
|
215
|
+
comparePoints,
|
|
216
|
+
maxValue,
|
|
217
|
+
comparePointsMax: new XYType(maxValue + 20, maxValue + 20),
|
|
218
|
+
remarks,
|
|
219
|
+
};
|
|
220
|
+
compares.push(compare);
|
|
221
|
+
}
|
|
222
|
+
return compares;
|
|
223
|
+
}
|
|
224
|
+
selectGaugeInCompare() {
|
|
225
|
+
for (const compare of this.compares) {
|
|
226
|
+
const comparePoints = JSON.parse(JSON.stringify(compare.comparePoints));
|
|
227
|
+
comparePoints.forEach(p => {
|
|
228
|
+
if (p.id === this.selectedGaugeInPoints?.gaugeId) {
|
|
229
|
+
p.r = 10;
|
|
230
|
+
}
|
|
231
|
+
else {
|
|
232
|
+
p.r = 3;
|
|
233
|
+
}
|
|
234
|
+
});
|
|
235
|
+
compare.comparePoints = comparePoints;
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
resetSelectedGauges() {
|
|
239
|
+
// console.log('resetSelectedGauges reset');
|
|
240
|
+
this.selectedGauge = null;
|
|
241
|
+
this.selectedGaugeInPoints = null;
|
|
242
|
+
this.selectedGauges = [];
|
|
243
|
+
this.selectedPixels = [];
|
|
244
|
+
this.pixelsSolutions = [];
|
|
245
|
+
this.selectGaugeInCompare();
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29tcGFyZU1hbmFnZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBwL3NoYXJlZC90b29scy9Db21wYXJlTWFuYWdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBRW5DLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFJakMsTUFBTSxPQUFPLGNBQWM7SUErQnpCLFlBQ1UsUUFBa0IsRUFDbEIsY0FBOEIsRUFDL0IsWUFBd0IsR0FBRyxFQUFFO0lBQ3BDLENBQUM7UUFITyxhQUFRLEdBQVIsUUFBUSxDQUFVO1FBQ2xCLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUMvQixjQUFTLEdBQVQsU0FBUyxDQUNmO1FBRUQsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ2xCLENBQUM7SUFFTyxNQUFNLENBQUMsV0FBVyxDQUFDLEtBQWEsRUFBRSxLQUFhLEVBQUUsT0FBZTtRQUV0RSxNQUFNLFdBQVcsR0FBUyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDeEQsTUFBTSxTQUFTLEdBQUcsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ2hELFNBQVMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLFVBQVUsRUFBRSxHQUFHLE9BQU8sQ0FBQyxDQUFDO1FBQ3ZELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLEdBQUcsU0FBUyxDQUFDLE9BQU8sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUNyRixPQUFPLElBQUksS0FBSyxDQUFDLENBQUM7SUFDcEIsQ0FBQztJQUVNLFFBQVE7UUFDYixJQUFJLENBQUMsZUFB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USxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUN4QjtRQUVELE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7SUFFTyxvQkFBb0I7UUFDMUIsS0FBSyxNQUFNLE9BQU8sSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ25DLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQztZQUN4RSxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFO2dCQUN4QixJQUFJLENBQUMsQ0FBQyxFQUFFLEtBQUssSUFBSSxDQUFDLHFCQUFxQixFQUFFLE9BQU8sRUFBRTtvQkFDaEQsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7aUJBQ1Y7cUJBQU07b0JBQ0wsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7aUJBQ1Q7WUFDSCxDQUFDLENBQUMsQ0FBQztZQUNILE9BQU8sQ0FBQyxhQUFhLEdBQUcsYUFBYSxDQUFDO1NBQ3ZDO0lBQ0gsQ0FBQztJQUVPLG1CQUFtQjtRQUN6Qiw0Q0FBNEM7UUFDNUMsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7UUFDMUIsSUFBSSxDQUFDLHFCQUFxQixHQUFHLElBQUksQ0FBQztRQUNsQyxJQUFJLENBQUMsY0FBYyxHQUFHLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsY0FBYyxHQUFHLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsZUFBZSxHQUFHLEVBQUUsQ0FBQztRQUMxQixJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztJQUM5QixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge01hcExhdExuZ30gZnJvbSAncmFhaW4tdWknO1xuaW1wb3J0IHtQb3NpdGlvblZhbHVlLCBRdWFsaXR5UG9pbnQsIFJhaW5Db21wdXRhdGlvblF1YWxpdHksIFJhaW5Ob2RlfSBmcm9tICdyYWFpbi1tb2RlbCc7XG5pbXBvcnQge1hZVHlwZX0gZnJvbSAnLi4veHl0eXBlJztcbmltcG9ydCB7UHJvZmlsZVNlcnZpY2V9IGZyb20gJy4uL3Byb2ZpbGUuc2VydmljZSc7XG5pbXBvcnQge0ZyYW1lU2V0fSBmcm9tICcuL0ZyYW1lU2V0JztcblxuZXhwb3J0IGNsYXNzIENvbXBhcmVNYW5hZ2VyIHtcblxuICAvLyBwdWJsaWMgY29tcHV0ZWQkOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuXG4gIHB1YmxpYyBnYXVnZXNJbkNvbXBhcmU6IE1hcExhdExuZ1tdO1xuICBwdWJsaWMgc2VsZWN0ZWRHYXVnZXM6IE1hcExhdExuZ1tdO1xuICBwdWJsaWMgc2VsZWN0ZWRQaXhlbHM6IE1hcExhdExuZ1tdO1xuICBwdWJsaWMgcGl4ZWxzU29sdXRpb25zOiBNYXBMYXRMbmdbXVtdO1xuXG4gIHB1YmxpYyBjb21wYXJlTmFtZXM6IHN0cmluZ1tdO1xuICBwdWJsaWMgY29tcGFyZXM6IHtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgY29tcGFyZVBvaW50czogWFlUeXBlW107XG4gICAgY29tcGFyZVBvaW50c01heDogWFlUeXBlO1xuICAgIGNvbXBhcmVQb2ludHNIaXN0b3J5OiBRdWFsaXR5UG9pbnRbXTtcbiAgICByZW1hcmtzOiBzdHJpbmc7XG4gIH1bXTtcbiAgcHVibGljIGNvbXBhcmVTcGVlZE1hdHJpeDogUG9zaXRpb25WYWx1ZVtdO1xuICBwdWJsaWMgY29tcGFyZVZlcnNpb246IHN0cmluZztcbiAgcHVibGljIGNvbXBhcmVUcnVzdGVkSW5kaWNhdG9yOiBudW1iZXI7XG5cbiAgcHVibGljIGN1cnJlbnRRdWFsaXR5RG9uZURhdGU6IERhdGU7XG4gIHB1YmxpYyBjdXJyZW50UXVhbGl0eUxhdW5jaGVkQnk6IHN0cmluZztcbiAgcHVibGljIGN1cnJlbnRRdWFsaXR5VmVyc2lvbjogc3RyaW5nO1xuICBwdWJsaWMgY3VycmVudFF1YWxpdHlUaW1lU3BlbnRJbk1zOiBudW1iZXI7XG5cbiAgcHJpdmF0ZSBzZWxlY3RlZEdhdWdlOiBRdWFsaXR5UG9pbnQ7XG4gIHByaXZhdGUgc2VsZWN0ZWRHYXVnZUluUG9pbnRzOiBRdWFsaXR5UG9pbnQ7XG4gIHByaXZhdGUgc2VsZWN0ZWRHYXVnZUluUG9pbnRzRGV0YWlsOiBzdHJpbmc7XG4gIHByaXZhdGUgcmFpbkNvbXB1dGF0aW9uUXVhbGl0aWVzOiBhbnk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByYWluTm9kZTogUmFpbk5vZGUsXG4gICAgcHJpdmF0ZSBwcm9maWxlU2VydmljZTogUHJvZmlsZVNlcnZpY2UsXG4gICAgcHVibGljIG9uQ2hhbmdlczogKCkgPT4gdm9pZCA9ICgpID0+IHtcbiAgICB9XG4gICkge1xuICAgIHRoaXMuY2xlYW5BbGwoKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIENvbXBhcmVEYXRlKGRhdGUxOiBzdHJpbmcsIGRhdGUyOiBzdHJpbmcsIG1pbnV0ZXM6IG51bWJlcik6IGJvb2xlYW4ge1xuXG4gICAgY29uc3QgZGF0ZTFBc0RhdGU6IERhdGUgPSBuZXcgRGF0ZShwYXJzZUludChkYXRlMSwgMTApKTtcbiAgICBjb25zdCBkYXRlMkRpZmYgPSBuZXcgRGF0ZShwYXJzZUludChkYXRlMiwgMTApKTtcbiAgICBkYXRlMkRpZmYuc2V0TWludXRlcyhkYXRlMkRpZmYuZ2V0TWludXRlcygpICsgbWludXRlcyk7XG4gICAgY29uc3QgZGlmZiA9IE1hdGgucm91bmQoKGRhdGUxQXNEYXRlLmdldFRpbWUoKSAtIGRhdGUyRGlmZi5nZXRUaW1lKCkpIC8gKDYwICogMTAwMCkpO1xuICAgIHJldHVybiBkaWZmID09PSAwO1xuICB9XG5cbiAgcHVibGljIGNsZWFuQWxsKCkge1xuICAgIHRoaXMuZ2F1Z2VzSW5Db21wYXJlID0gW107XG4gICAgdGhpcy5zZWxlY3RlZEdhdWdlcyA9IFtdO1xuICAgIHRoaXMuc2VsZWN0ZWRQaXhlbHMgPSBbXTtcbiAgICB0aGlzLnBpeGVsc1NvbHV0aW9ucyA9IFtdO1xuXG4gICAgdGhpcy5zZWxlY3RlZEdhdWdlID0gbnVsbDtcbiAgICB0aGlzLnNlbGVjdGVkR2F1Z2VJblBvaW50cyA9IG51bGw7XG4gICAgdGhpcy5jbGVhbkNvbXBhcmVRdWFsaXR5KCdubyBjb21wYXJlJyk7XG4gIH1cblxuICBhc3luYyByZWZyZXNoQ29tcGFyZVF1YWxpdHkoZnJhbWVTZXQ6IEZyYW1lU2V0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0czogeyBkYXRlOiBEYXRlOyByYWluQ29tcHV0YXRpb25JZDogc3RyaW5nOyByYWluQ29tcHV0YXRpb25RdWFsaXR5SWQ6IHN0cmluZyB9W10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoQ29tcGFyZUR1cGxpY2F0ZTogYm9vbGVhbikge1xuXG4gICAgY29uc3QgdGFyZ2V0c09yZGVyZWQgPSB0YXJnZXRzXG4gICAgICAuc29ydCgoYSwgYikgPT4gYS5kYXRlLmdldFRpbWUoKSAtIGIuZGF0ZS5nZXRUaW1lKCkpXG4gICAgICAubWFwKHQgPT4ge1xuICAgICAgICByZXR1cm4ge2RhdGU6ICcnICsgdC5kYXRlLmdldFRpbWUoKSwgcmFpbkNvbXB1dGF0aW9uSWQ6IHQucmFpbkNvbXB1dGF0aW9uSWQsIHJhaW5Db21wdXRhdGlvblF1YWxpdHlJZDogdC5yYWluQ29tcHV0YXRpb25RdWFsaXR5SWR9O1xuICAgICAgfSk7XG5cbiAgICBjb25zdCBjdXJyZW50VGFyZ2V0ID0gdGFyZ2V0c09yZGVyZWQuZmlsdGVyKHQgPT4gdC5kYXRlID09PSAnJyArIGZyYW1lU2V0LmRhdGUuZ2V0VGltZSgpKVswXTtcbiAgICBjb25zdCBjdXJyZW50UG9zID0gdGFyZ2V0c09yZGVyZWQuaW5kZXhPZihjdXJyZW50VGFyZ2V0KTtcbiAgICBjb25zdCBwcmV2aW91c1RhcmdldCA9IGN1cnJlbnRQb3MgPj0gMCA/IHRhcmdldHNPcmRlcmVkW2N1cnJlbnRQb3MgLSAxXSA6IG51bGw7XG4gICAgY29uc3QgbmV4dFRhcmdldCA9IGN1cnJlbnRQb3MgPj0gMCAmJiBjdXJyZW50UG9zIDwgdGFyZ2V0c09yZGVyZWQubGVuZ3RoIC0gMSA/IHRhcmdldHNPcmRlcmVkW2N1cnJlbnRQb3MgKyAxXSA6IG51bGw7XG5cbiAgICBhd2FpdCB0aGlzLmZldGNoUmFpbkNvbXB1dGF0aW9uUXVhbGl0aWVzKHRhcmdldHNPcmRlcmVkKTtcblxuICAgIGNvbnN0IGN1cnJlbnRRdWFsaXR5OiBSYWluQ29tcHV0YXRpb25RdWFsaXR5ID0gdGhpcy5yYWluQ29tcHV0YXRpb25RdWFsaXRpZXNbY3VycmVudFRhcmdldD8uZGF0ZV07XG4gICAgaWYgKCFjdXJyZW50UXVhbGl0eSkge1xuICAgICAgdGhpcy5jbGVhbkNvbXBhcmVRdWFsaXR5KCdubyBjdXJyZW50IHF1YWxpdHkgJyArIE9iamVjdC5rZXlzKHRoaXMucmFpbkNvbXB1dGF0aW9uUXVhbGl0aWVzKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5jdXJyZW50UXVhbGl0eURvbmVEYXRlID0gY3VycmVudFF1YWxpdHkuaXNEb25lRGF0ZTtcbiAgICB0aGlzLmN1cnJlbnRRdWFsaXR5VGltZVNwZW50SW5NcyA9IGN1cnJlbnRRdWFsaXR5LnRpbWVTcGVudEluTXM7XG4gICAgdGhpcy5jdXJyZW50UXVhbGl0eUxhdW5jaGVkQnkgPSBjdXJyZW50UXVhbGl0eS5sYXVuY2hlZEJ5O1xuICAgIHRoaXMuY3VycmVudFF1YWxpdHlWZXJzaW9uID0gY3VycmVudFF1YWxpdHkudmVyc2lvbjtcblxuICAgIGNvbnN0IHByZXZpb3VzUXVhbGl0eTogUmFpbkNvbXB1dGF0aW9uUXVhbGl0eSA9IHByZXZpb3VzVGFyZ2V0ICYmXG4gICAgQ29tcGFyZU1hbmFnZXIuQ29tcGFyZURhdGUocHJldmlvdXNUYXJnZXQuZGF0ZSwgY3VycmVudFRhcmdldC5kYXRlLCAtNSkgP1xuICAgICAgdGhpcy5yYWluQ29tcHV0YXRpb25RdWFsaXRpZXNbcHJldmlvdXNUYXJnZXQuZGF0ZV0gOiBudWxsO1xuICAgIGNvbnN0IG5leHRRdWFsaXR5OiBSYWluQ29tcHV0YXRpb25RdWFsaXR5ID0gbmV4dFRhcmdldFxuICAgICYmIENvbXBhcmVNYW5hZ2VyLkNvbXBhcmVEYXRlKG5leHRUYXJnZXQuZGF0ZSwgY3VycmVudFRhcmdldC5kYXRlLCArNSkgP1xuICAgICAgdGhpcy5yYWluQ29tcHV0YXRpb25RdWFsaXRpZXNbbmV4dFRhcmdldC5kYXRlXSA6IG51bGw7XG5cbiAgICBjb25zdCBxdWFsaXR5U3BlZWRNYXRyaXhDb250YWluZXIgPSBjdXJyZW50UXVhbGl0eS5xdWFsaXR5U3BlZWRNYXRyaXhDb250YWluZXI7XG5cbiAgICB0aGlzLmNvbXBhcmVOYW1lcyA9IHF1YWxpdHlTcGVlZE1hdHJpeENvbnRhaW5lci5nZXRNYXRyaWNlcygpXG4gICAgICAubWFwKG0gPT4gbS5uYW1lKVxuICAgICAgLnNvcnQoKGEsIGIpID0+IHBhcnNlSW50KGEsIDEwKSAtIHBhcnNlSW50KGIsIDEwKSk7XG4gICAgdGhpcy5jb21wYXJlVmVyc2lvbiA9IGN1cnJlbnRRdWFsaXR5LmdldFZlcnNpb24oKTtcbiAgICB0aGlzLmNvbXBhcmVTcGVlZE1hdHJpeCA9IHF1YWxpdHlTcGVlZE1hdHJpeENvbnRhaW5lci5yZW5kZXJNZXJnZWRNYXRyaXgoe25vcm1hbGl6ZTogdHJ1ZX0pO1xuICAgIHRoaXMuY29tcGFyZVRydXN0ZWRJbmRpY2F0b3IgPSBxdWFsaXR5U3BlZWRNYXRyaXhDb250YWluZXIuZ2V0VHJ1c3RlZEluZGljYXRvcnMoKVswXTtcbiAgICB0aGlzLmNvbXBhcmVzID0gdGhpcy5idWlsZENvbXBhcmVzKGN1cnJlbnRRdWFsaXR5LCBwcmV2aW91c1F1YWxpdHksIG5leHRRdWFsaXR5LCB3aXRoQ29tcGFyZUR1cGxpY2F0ZSk7XG4gICAgdGhpcy5vbkNoYW5nZXMoKTtcbiAgfVxuXG4gIGFzeW5jIHNldEdhdWdlcygpIHtcbiAgICAvLyBjb25zb2xlLmxvZygnc2V0R2F1Z2VzJyk7XG5cbiAgICBjb25zdCBxdWFsaXR5UG9pbnRzOiBRdWFsaXR5UG9pbnRbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgY29tcGFyZSBvZiB0aGlzLmNvbXBhcmVzKSB7XG4gICAgICBmb3IgKGNvbnN0IHF1YWxpdHlQb2ludCBvZiBjb21wYXJlLmNvbXBhcmVQb2ludHNIaXN0b3J5KSB7XG4gICAgICAgIGNvbnN0IGFscmVhZHlBZGRlZCA9IHF1YWxpdHlQb2ludHMuZmlsdGVyKHAgPT4gcD8uZ2F1Z2VJZCA9PT0gcXVhbGl0eVBvaW50LmdhdWdlSWQpO1xuICAgICAgICBpZiAoYWxyZWFkeUFkZGVkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHF1YWxpdHlQb2ludHMucHVzaChxdWFsaXR5UG9pbnQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5nYXVnZXNJbkNvbXBhcmUgPSBxdWFsaXR5UG9pbnRzLm1hcChwID0+IHtcbiAgICAgIHJldHVybiBuZXcgTWFwTGF0TG5nKHAuZ2F1Z2VDYXJ0ZXNpYW5WYWx1ZS5sYXQsIHAuZ2F1Z2VDYXJ0ZXNpYW5WYWx1ZS5sbmcsIDAsXG4gICAgICAgIHAuZ2F1Z2VJZCwgcC5nYXVnZUxhYmVsICsgJz4nICsgcC5nZXRHYXVnZVZhbHVlKCksXG4gICAgICAgIHAuZ2V0R2F1Z2VWYWx1ZSgpKTtcbiAgICB9KTtcblxuICAgIHRoaXMucmVzZXRTZWxlY3RlZEdhdWdlcygpO1xuICB9XG5cbiAgYXN5bmMgc2VsZWN0R2F1Z2UoZ2F1Z2VJZDogc3RyaW5nLCBjb21wYXJlSW5kZXg6IG51bWJlcikge1xuICAgIC8vIGNvbnNvbGUubG9nKCdzZWxlY3RHYXVnZScsIGdhdWdlSWQsIGNvbXBhcmVJbmRleCk7XG5cbiAgICBpZiAoZ2F1Z2VJZCkge1xuICAgICAgY29uc3QgeHlzID0gdGhpcy5nZXRDdXJyZW50UXVhbGl0eVBvaW50cyhjb21wYXJlSW5kZXgpLmZpbHRlcihwID0+IHAuZ2F1Z2VJZCA9PT0gZ2F1Z2VJZCk7XG4gICAgICB0aGlzLnNlbGVjdGVkR2F1Z2UgPSB4eXMubGVuZ3RoID09PSAxID8geHlzWzBdIDogbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZWxlY3RlZEdhdWdlID0gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuc2VsZWN0ZWRHYXVnZSkge1xuICAgICAgcmV0dXJuIHRoaXMucmVzZXRTZWxlY3RlZEdhdWdlcygpO1xuICAgIH1cblxuICAgIGNvbnN0IHNlbGVjdGVkR2F1Z2VJblBvaW50cyA9IHRoaXMuZ2V0Q3VycmVudFF1YWxpdHlQb2ludHMoY29tcGFyZUluZGV4KS5maWx0ZXIocCA9PiBwLmdhdWdlSWQgPT09IHRoaXMuc2VsZWN0ZWRHYXVnZS5nYXVnZUlkKTtcbiAgICBsZXQgcGl4ZWxzU29sdXRpb25zOiBNYXBMYXRMbmdbXVtdID0gW107XG5cbiAgICBpZiAoc2VsZWN0ZWRHYXVnZUluUG9pbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgY29uc3QgcmVtYXJrcyA9IEpTT04ucGFyc2Uoc2VsZWN0ZWRHYXVnZUluUG9pbnRzWzBdLnJlbWFyaylcbiAgICAgICAgLnNvcnQoKGEsIGIpID0+IGEuY3JpdGVyaWFBdHRlbXB0ZWRUb0JlTWluaW11bSAtIGIuY3JpdGVyaWFBdHRlbXB0ZWRUb0JlTWluaW11bSk7XG4gICAgICBjb25zb2xlLmxvZyhyZW1hcmtzKTtcbiAgICAgIHBpeGVsc1NvbHV0aW9ucyA9IHJlbWFya3NcbiAgICAgICAgLm1hcChyZW1hcmsgPT4gcmVtYXJrLnNvbHV0aW9uRm9yR2F1Z2UucGl4ZWxzXG4gICAgICAgICAgLm1hcChwID0+IG5ldyBNYXBMYXRMbmcocC55ICsgMC4wMDUsIHAueCArIDAuMDEsIDAsICcnICsgIXJlbWFyay5ub3RQb3NzaWJsZSwgJycgKyAhcmVtYXJrLm5vdFBvc3NpYmxlLCAxKSkpO1xuXG4gICAgICBjb25zdCB0aW1lRGVsdGFJbk1pbnV0ZXMgPSBzZWxlY3RlZEdhdWdlSW5Qb2ludHNbMF0uZ2V0VGltZURlbHRhSW5NaW51dGVzKCk7XG4gICAgICB0aGlzLnNlbGVjdGVkR2F1Z2VJblBvaW50c0RldGFpbCA9ICcnICsgc2VsZWN0ZWRHYXVnZUluUG9pbnRzWzBdLmdhdWdlTGFiZWwgKyAnID4gJ1xuICAgICAgICArIE1hdGgucm91bmQoc2VsZWN0ZWRHYXVnZUluUG9pbnRzWzBdLmdldEdhdWdlVmFsdWUoKSAqIDEwMCkgLyAxMDAgKyAnIC8gJ1xuICAgICAgICArIE1hdGgucm91bmQoc2VsZWN0ZWRHYXVnZUluUG9pbnRzWzBdLmdldFJhaW5WYWx1ZSgpICogMTAwKSAvIDEwMFxuICAgICAgICArICcgZFQ9JyArIHRpbWVEZWx0YUluTWludXRlcztcblxuICAgICAgdGhpcy5zZWxlY3RlZEdhdWdlSW5Qb2ludHMgPSBzZWxlY3RlZEdhdWdlSW5Qb2ludHNbMF07XG5cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZWxlY3RlZEdhdWdlSW5Qb2ludHMgPSBudWxsO1xuICAgICAgdGhpcy5zZWxlY3RlZEdhdWdlcyA9IFtdO1xuICAgICAgdGhpcy5zZWxlY3RlZFBpeGVscyA9IFtdO1xuICAgICAgdGhpcy5waXhlbHNTb2x1dGlvbnMgPSBbXTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnNlbGVjdGVkR2F1Z2VzID0gW1xuICAgICAgbmV3IE1hcExhdExuZyh0aGlzLnNlbGVjdGVkR2F1Z2VJblBvaW50cy5nYXVnZUNhcnRlc2lhblZhbHVlLmxhdCwgdGhpcy5zZWxlY3RlZEdhdWdlSW5Qb2ludHMuZ2F1Z2VDYXJ0ZXNpYW5WYWx1ZS5sbmcsIHVuZGVmaW5lZCxcbiAgICAgICAgdGhpcy5zZWxlY3RlZEdhdWdlSW5Qb2ludHMuZ2F1Z2VJZCxcbiAgICAgICAgdGhpcy5zZWxlY3RlZEdhdWdlSW5Qb2ludHMuZ2F1Z2VMYWJlbCArICc+JyArIHRoaXMuc2VsZWN0ZWRHYXVnZUluUG9pbnRzLmdhdWdlQ2FydGVzaWFuVmFsdWUudmFsdWUsXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRHYXVnZUluUG9pbnRzLmdhdWdlQ2FydGVzaWFuVmFsdWUudmFsdWUpLFxuICAgIF07XG5cbiAgICB0aGlzLnNlbGVjdEdhdWdlSW5Db21wYXJlKCk7XG5cbiAgICBjb25zdCBwaXhlbHM6IE1hcExhdExuZ1tdID0gW107XG4gICAgZm9yIChjb25zdCByYWluQ2FydGVzaWFuVmFsdWUgb2YgdGhpcy5zZWxlY3RlZEdhdWdlSW5Qb2ludHMucmFpbkNhcnRlc2lhblZhbHVlcykge1xuICAgICAgcGl4ZWxzLnB1c2gobmV3IE1hcExhdExuZyhyYWluQ2FydGVzaWFuVmFsdWUubGF0ICsgMC4wMDUsIHJhaW5DYXJ0ZXNpYW5WYWx1ZS5sbmcgKyAwLjAxKSk7XG4gICAgfVxuICAgIHRoaXMuc2VsZWN0ZWRQaXhlbHMgPSBwaXhlbHM7XG5cbiAgICB0aGlzLnBpeGVsc1NvbHV0aW9ucyA9IHBpeGVsc1NvbHV0aW9ucztcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q3VycmVudFF1YWxpdHlQb2ludHMoY29tcGFyZUluZGV4OiBudW1iZXIpIHtcbiAgICBpZiAoY29tcGFyZUluZGV4IDwgMCB8fCB0aGlzLmNvbXBhcmVOYW1lcy5sZW5ndGggPCBjb21wYXJlSW5kZXgpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5jb21wYXJlc1tjb21wYXJlSW5kZXhdLmNvbXBhcmVQb2ludHNIaXN0b3J5O1xuICB9XG5cbiAgcHJpdmF0ZSBjbGVhbkNvbXBhcmVRdWFsaXR5KGRldGFpbHM/OiBzdHJpbmcpIHtcbiAgICB0aGlzLmNvbXBhcmVWZXJzaW9uID0gZGV0YWlscztcbiAgICB0aGlzLmNvbXBhcmVOYW1lcyA9IFtdO1xuICAgIHRoaXMuY29tcGFyZXMgPSBbXTtcbiAgICB0aGlzLnJhaW5Db21wdXRhdGlvblF1YWxpdGllcyA9IHt9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBmZXRjaFJhaW5Db21wdXRhdGlvblF1YWxpdGllcyh0YXJnZXRzT3JkZXJlZDoge1xuICAgIGRhdGU6IHN0cmluZztcbiAgICByYWluQ29tcHV0YXRpb25JZDogc3RyaW5nO1xuICAgIHJhaW5Db21wdXRhdGlvblF1YWxpdHlJZDogc3RyaW5nXG4gIH1bXSkge1xuXG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXModGhpcy5yYWluQ29tcHV0YXRpb25RdWFsaXRpZXMpKSB7XG4gICAgICBjb25zdCBmb3VuZCA9IHRhcmdldHNPcmRlcmVkLmZpbHRlcih0ID0+IHQuZGF0ZSA9PT0ga2V5KTtcbiAgICAgIGlmIChmb3VuZC5sZW5ndGggPCAwKSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLnJhaW5Db21wdXRhdGlvblF1YWxpdGllc1trZXldO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgdGFyZ2V0IG9mIHRhcmdldHNPcmRlcmVkKSB7XG4gICAgICBpZiAoIXRoaXMucmFpbkNvbXB1dGF0aW9uUXVhbGl0aWVzW3RhcmdldC5kYXRlXSAmJiB0YXJnZXQucmFpbkNvbXB1dGF0aW9uUXVhbGl0eUlkKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdGhpcy5yYWluQ29tcHV0YXRpb25RdWFsaXRpZXNbdGFyZ2V0LmRhdGVdID0gYXdhaXQgdGhpcy5wcm9maWxlU2VydmljZVxuICAgICAgICAgICAgLmdldFJhaW5Db21wYXJlQnlJZCh0aGlzLnJhaW5Ob2RlLmdldElkKCksIHRhcmdldC5yYWluQ29tcHV0YXRpb25JZCwgdGFyZ2V0LnJhaW5Db21wdXRhdGlvblF1YWxpdHlJZCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRDb21wYXJlcyhjdXJyZW50UXVhbGl0eTogUmFpbkNvbXB1dGF0aW9uUXVhbGl0eSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzUXVhbGl0eTogUmFpbkNvbXB1dGF0aW9uUXVhbGl0eSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5leHRRdWFsaXR5OiBSYWluQ29tcHV0YXRpb25RdWFsaXR5LFxuICAgICAgICAgICAgICAgICAgICAgICAgd2l0aENvbXBhcmVEdXBsaWNhdGU6IGJvb2xlYW4pIHtcbiAgICBjb25zdCBjb21wYXJlcyA9IFtdO1xuICAgIGNvbnN0IHF1YWxpdHlTcGVlZE1hdHJpeENvbnRhaW5lciA9IGN1cnJlbnRRdWFsaXR5LnF1YWxpdHlTcGVlZE1hdHJpeENvbnRhaW5lcjtcbiAgICBmb3IgKGNvbnN0IFtpbmRleCwgbmFtZV0gb2YgdGhpcy5jb21wYXJlTmFtZXMuZW50cmllcygpKSB7XG5cbiAgICAgIGNvbnN0IGNvbXBhcmVQb2ludHNIaXN0b3J5ID0gcXVhbGl0eVNwZWVkTWF0cml4Q29udGFpbmVyLmdldFF1YWxpdHlQb2ludHMobmFtZSk7XG4gICAgICBjb25zdCBtYXhWYWx1ZSA9IE1hdGgubWF4KHF1YWxpdHlTcGVlZE1hdHJpeENvbnRhaW5lci5nZXRNYXhHYXVnZSgpLCBxdWFsaXR5U3BlZWRNYXRyaXhDb250YWluZXIuZ2V0TWF4UmFpbigpKTtcbiAgICAgIGNvbnN0IHJlbWFya3MgPSBxdWFsaXR5U3BlZWRNYXRyaXhDb250YWluZXIuZ2V0TWF0cml4KGluZGV4KT8ucmVtYXJrcztcblxuICAgICAgY29uc3QgZGVsdGEgPSBwYXJzZUludChuYW1lLCAxMCk7XG4gICAgICBsZXQgcmVuYW1lZCA9IG5ldyBEYXRlKGN1cnJlbnRRdWFsaXR5LmRhdGUuZ2V0VGltZSgpIC0gZGVsdGEgKiA2MCAqIDEwMDApLnRvTG9jYWxlU3RyaW5nKCk7XG4gICAgICByZW5hbWVkICs9IGRlbHRhID4gMCA/ICcgc2luY2UgJyA6ICcgaW4gJztcbiAgICAgIHJlbmFtZWQgKz0gTWF0aC5hYnMoZGVsdGEpICsgJyBtaW51dGVzJztcblxuICAgICAgY29uc29sZS5sb2coJ2luZGV4OicsIGluZGV4LCAnZGVsdGE6JywgZGVsdGEsICdyZW5hbWVkOicsIHJlbmFtZWQpO1xuXG4gICAgICAvLyByZW1vdmUgcHJldmlvdXMgb3IgbmV4dCBiZXR0ZXIgdmFsdWVzIGZyb20gY29tcGFyZVBvaW50c1xuICAgICAgbGV0IHF1YWxpdHlQb2ludHMgPSBjb21wYXJlUG9pbnRzSGlzdG9yeS5maWx0ZXIoKHA6IGFueSkgPT4gcCk7IC8vIG5vIHJlYWwgZmlsdGVyXG5cbiAgICAgIGNvbnN0IHJlbW92ZUR1cGxpY2F0ZXMgPSAhd2l0aENvbXBhcmVEdXBsaWNhdGU7XG4gICAgICBpZiAocmVtb3ZlRHVwbGljYXRlcykge1xuICAgICAgICBpZiAoaW5kZXggPT09IHRoaXMuY29tcGFyZU5hbWVzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICBpZiAoIXByZXZpb3VzUXVhbGl0eT8ucXVhbGl0eVNwZWVkTWF0cml4Q29udGFpbmVyKSB7XG4gICAgICAgICAgICBxdWFsaXR5UG9pbnRzID0gW107XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHF1YWxpdHlQb2ludHMgPSBxdWFsaXR5UG9pbnRzLmZpbHRlcigocDogUXVhbGl0eVBvaW50KSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzUVBzID0gcHJldmlvdXNRdWFsaXR5LnF1YWxpdHlTcGVlZE1hdHJpeENvbnRhaW5lclxuICAgICAgICAgICAgICAgIC5nZXRRdWFsaXR5UG9pbnRzQnlIaXN0b3JpY2FsUG9zaXRpb24oMClcbiAgICAgICAgICAgICAgICAuZmlsdGVyKHByZXZpb3VzUVAgPT4gcC5nYXVnZUlkID09PSBwcmV2aW91c1FQLmdhdWdlSWQpO1xuXG4gICAgICAgICAgICAgIC8vIGJldHRlciBiZWZvcmUgP1xuICAgICAgICAgICAgICBjb25zdCBiZXR0ZXJCZWZvcmUgPSAocHJldmlvdXNRUHMubGVuZ3RoID09PSAxICYmIHAuZ2V0RGVsdGEoKSA+IHByZXZpb3VzUVBzWzBdLmdldERlbHRhKCkpO1xuICAgICAgICAgICAgICBpZiAoYmV0dGVyQmVmb3JlKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ3JlbW92ZWQgZnJvbScsIHJlbmFtZWQsIHAuZ2F1Z2VMYWJlbCwgcHJldmlvdXNRdWFsaXR5LmRhdGUudG9JU09TdHJpbmcoKSxcbiAgICAgICAgICAgICAgICAgIHAuZ2V0RGVsdGEoKSxcbiAgICAgICAgICAgICAgICAgIHByZXZpb3VzUVBzLmxlbmd0aCA9PT0gMSA/IHByZXZpb3VzUVBzWzBdLmdldERlbHRhKCkgKyAnIGRhdGVkICcgKyBwcmV2aW91c1FQc1swXS5nYXVnZURhdGUudG9JU09TdHJpbmcoKSA6IDApO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gPT4gcmVtb3ZlIGl0XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoaW5kZXggPT09IDApIHtcbiAgICAgICAgICBpZiAoIW5leHRRdWFsaXR5Py5xdWFsaXR5U3BlZWRNYXRyaXhDb250YWluZXIpIHtcbiAgICAgICAgICAgIHF1YWxpdHlQb2ludHMgPSBbXTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcXVhbGl0eVBvaW50cyA9IHF1YWxpdHlQb2ludHMuZmlsdGVyKChwOiBRdWFsaXR5UG9pbnQpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgbmV4dFFQcyA9IG5leHRRdWFsaXR5LnF1YWxpdHlTcGVlZE1hdHJpeENvbnRhaW5lclxuICAgICAgICAgICAgICAgIC5nZXRRdWFsaXR5UG9pbnRzQnlIaXN0b3JpY2FsUG9zaXRpb24oMSlcbiAgICAgICAgICAgICAgICAuZmlsdGVyKG5leHRRUCA9PiBwLmdhdWdlSWQgPT09IG5leHRRUC5nYXVnZUlkKTtcblxuICAgICAgICAgICAgICAvLyBiZXR0ZXIgYWZ0ZXIgP1xuICAgICAgICAgICAgICBjb25zdCBiZXR0ZXJBZnRlciA9IChuZXh0UVBzLmxlbmd0aCA9PT0gMSAmJiBwLmdldERlbHRhKCkgPiBuZXh0UVBzWzBdLmdldERlbHRhKCkpO1xuICAgICAgICAgICAgICBpZiAoYmV0dGVyQWZ0ZXIpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygncmVtb3ZlZCBmcm9tJywgcmVuYW1lZCwgcC5nYXVnZUxhYmVsLCBuZXh0UXVhbGl0eS5kYXRlLnRvSVNPU3RyaW5nKCksXG4gICAgICAgICAgICAgICAgICBwLmdldERlbHRhKCksXG4gICAgICAgICAgICAgICAgICBuZXh0UVBzLmxlbmd0aCA9PT0gMSA/IG5leHRRUHNbMF0uZ2V0RGVsdGEoKSArICcgZGF0ZWQgJyArIG5leHRRUHNbMF0uZ2F1Z2VEYXRlLnRvSVNPU3RyaW5nKCkgOiAwKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7IC8vID0+IHJlbW92ZSBpdFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNvbXBhcmVQb2ludHMgPSBxdWFsaXR5UG9pbnRzLm1hcCgocXVhbGl0eVBvaW50OiBRdWFsaXR5UG9pbnQpID0+XG4gICAgICAgIG5ldyBYWVR5cGUocXVhbGl0eVBvaW50LmdldEdhdWdlVmFsdWUoKSwgcXVhbGl0eVBvaW50LmdldFJhaW5WYWx1ZSgpLCAyLCBxdWFsaXR5UG9pbnQuZ2F1Z2VMYWJlbCwgcXVhbGl0eVBvaW50LmdhdWdlSWQpKTtcblxuICAgICAgY29uc3QgY29tcGFyZSA9IHtcbiAgICAgICAgbmFtZTogcmVuYW1lZCxcbiAgICAgICAgY29tcGFyZVBvaW50c0hpc3RvcnksXG4gICAgICAgIGNvbXBhcmVQb2ludHMsXG4gICAgICAgIG1heFZhbHVlLFxuICAgICAgICBjb21wYXJlUG9pbnRzTWF4OiBuZXcgWFlUeXBlKG1heFZhbHVlICsgMjAsIG1heFZhbHVlICsgMjApLFxuICAgICAgICByZW1hcmtzLFxuICAgICAgfTtcblxuICAgICAgY29tcGFyZXMucHVzaChjb21wYXJlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY29tcGFyZXM7XG4gIH1cblxuICBwcml2YXRlIHNlbGVjdEdhdWdlSW5Db21wYXJlKCkge1xuICAgIGZvciAoY29uc3QgY29tcGFyZSBvZiB0aGlzLmNvbXBhcmVzKSB7XG4gICAgICBjb25zdCBjb21wYXJlUG9pbnRzID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShjb21wYXJlLmNvbXBhcmVQb2ludHMpKTtcbiAgICAgIGNvbXBhcmVQb2ludHMuZm9yRWFjaChwID0+IHtcbiAgICAgICAgaWYgKHAuaWQgPT09IHRoaXMuc2VsZWN0ZWRHYXVnZUluUG9pbnRzPy5nYXVnZUlkKSB7XG4gICAgICAgICAgcC5yID0gMTA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcC5yID0gMztcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBjb21wYXJlLmNvbXBhcmVQb2ludHMgPSBjb21wYXJlUG9pbnRzO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVzZXRTZWxlY3RlZEdhdWdlcygpIHtcbiAgICAvLyBjb25zb2xlLmxvZygncmVzZXRTZWxlY3RlZEdhdWdlcyByZXNldCcpO1xuICAgIHRoaXMuc2VsZWN0ZWRHYXVnZSA9IG51bGw7XG4gICAgdGhpcy5zZWxlY3RlZEdhdWdlSW5Qb2ludHMgPSBudWxsO1xuICAgIHRoaXMuc2VsZWN0ZWRHYXVnZXMgPSBbXTtcbiAgICB0aGlzLnNlbGVjdGVkUGl4ZWxzID0gW107XG4gICAgdGhpcy5waXhlbHNTb2x1dGlvbnMgPSBbXTtcbiAgICB0aGlzLnNlbGVjdEdhdWdlSW5Db21wYXJlKCk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export class FrameSet {
|
|
2
|
+
constructor(date, radarMeasureIds = [], rainComputationId = null, rainComputationVersion = null, rainComputationQualities = []) {
|
|
3
|
+
this.date = date;
|
|
4
|
+
this.radarMeasureIds = radarMeasureIds;
|
|
5
|
+
this.rainComputationId = rainComputationId;
|
|
6
|
+
this.rainComputationVersion = rainComputationVersion;
|
|
7
|
+
this.rainComputationQualities = rainComputationQualities;
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRnJhbWVTZXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBwL3NoYXJlZC90b29scy9GcmFtZVNldC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLE9BQU8sUUFBUTtJQUNuQixZQUFtQixJQUFVLEVBQ1Ysa0JBQTRCLEVBQUUsRUFDOUIsb0JBQTRCLElBQUksRUFDaEMseUJBQWlDLElBQUksRUFDckMsMkJBR0QsRUFBRTtRQVBELFNBQUksR0FBSixJQUFJLENBQU07UUFDVixvQkFBZSxHQUFmLGVBQWUsQ0FBZTtRQUM5QixzQkFBaUIsR0FBakIsaUJBQWlCLENBQWU7UUFDaEMsMkJBQXNCLEdBQXRCLHNCQUFzQixDQUFlO1FBQ3JDLDZCQUF3QixHQUF4Qix3QkFBd0IsQ0FHdkI7SUFDcEIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNsYXNzIEZyYW1lU2V0IHtcbiAgY29uc3RydWN0b3IocHVibGljIGRhdGU6IERhdGUsXG4gICAgICAgICAgICAgIHB1YmxpYyByYWRhck1lYXN1cmVJZHM6IHN0cmluZ1tdID0gW10sXG4gICAgICAgICAgICAgIHB1YmxpYyByYWluQ29tcHV0YXRpb25JZDogc3RyaW5nID0gbnVsbCxcbiAgICAgICAgICAgICAgcHVibGljIHJhaW5Db21wdXRhdGlvblZlcnNpb246IHN0cmluZyA9IG51bGwsXG4gICAgICAgICAgICAgIHB1YmxpYyByYWluQ29tcHV0YXRpb25RdWFsaXRpZXM6IHtcbiAgICAgICAgICAgICAgICB2ZXJzaW9uOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgaWQ6IHN0cmluZ1xuICAgICAgICAgICAgICB9W10gPSBbXSkge1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { GaugeNode } from 'raain-model';
|
|
2
|
+
export class GaugeNodeFilter extends GaugeNode {
|
|
3
|
+
constructor(json) {
|
|
4
|
+
super(json);
|
|
5
|
+
this.isIn = true;
|
|
6
|
+
this.distance = 0;
|
|
7
|
+
}
|
|
8
|
+
approxDistanceFrom(center) {
|
|
9
|
+
this.distance = Math.round((Math.pow(this.latitude - center.lat, 2) + Math.pow(this.longitude - center.lng, 2)) * 100 * 100) / 100;
|
|
10
|
+
return this.distance;
|
|
11
|
+
}
|
|
12
|
+
add() {
|
|
13
|
+
this.isIn = true;
|
|
14
|
+
}
|
|
15
|
+
remove() {
|
|
16
|
+
this.isIn = false;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR2F1Z2VOb2RlRmlsdGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwcC9zaGFyZWQvdG9vbHMvR2F1Z2VOb2RlRmlsdGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxTQUFTLEVBQVMsTUFBTSxhQUFhLENBQUM7QUFFOUMsTUFBTSxPQUFPLGVBQWdCLFNBQVEsU0FBUztJQUs1QyxZQUFZLElBQVM7UUFDbkIsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBSlAsU0FBSSxHQUFHLElBQUksQ0FBQztRQUNaLGFBQVEsR0FBRyxDQUFDLENBQUM7SUFJcEIsQ0FBQztJQUVELGtCQUFrQixDQUFDLE1BQWM7UUFDL0IsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ25JLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN2QixDQUFDO0lBRUQsR0FBRztRQUNELElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO0lBQ25CLENBQUM7SUFFRCxNQUFNO1FBQ0osSUFBSSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUM7SUFDcEIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtHYXVnZU5vZGUsIExhdExuZ30gZnJvbSAncmFhaW4tbW9kZWwnO1xuXG5leHBvcnQgY2xhc3MgR2F1Z2VOb2RlRmlsdGVyIGV4dGVuZHMgR2F1Z2VOb2RlIHtcblxuICBwdWJsaWMgaXNJbiA9IHRydWU7XG4gIHB1YmxpYyBkaXN0YW5jZSA9IDA7XG5cbiAgY29uc3RydWN0b3IoanNvbjogYW55KSB7XG4gICAgc3VwZXIoanNvbik7XG4gIH1cblxuICBhcHByb3hEaXN0YW5jZUZyb20oY2VudGVyOiBMYXRMbmcpOiBudW1iZXIge1xuICAgIHRoaXMuZGlzdGFuY2UgPSBNYXRoLnJvdW5kKChNYXRoLnBvdyh0aGlzLmxhdGl0dWRlIC0gY2VudGVyLmxhdCwgMikgKyBNYXRoLnBvdyh0aGlzLmxvbmdpdHVkZSAtIGNlbnRlci5sbmcsIDIpKSAqIDEwMCAqIDEwMCkgLyAxMDA7XG4gICAgcmV0dXJuIHRoaXMuZGlzdGFuY2U7XG4gIH1cblxuICBhZGQoKSB7XG4gICAgdGhpcy5pc0luID0gdHJ1ZTtcbiAgfVxuXG4gIHJlbW92ZSgpIHtcbiAgICB0aGlzLmlzSW4gPSBmYWxzZTtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
import { Subject, takeUntil, timer } from 'rxjs';
|
|
2
|
+
import { switchMap } from 'rxjs/operators';
|
|
3
|
+
import { TimeframeContainers } from 'raain-ui';
|
|
4
|
+
export class RefreshManager {
|
|
5
|
+
constructor(rainNode, radarService, profileService, compareManager, onRefreshInProgress, onRefreshDone, onFetchDone) {
|
|
6
|
+
this.rainNode = rainNode;
|
|
7
|
+
this.radarService = radarService;
|
|
8
|
+
this.profileService = profileService;
|
|
9
|
+
this.compareManager = compareManager;
|
|
10
|
+
this.onRefreshInProgress = onRefreshInProgress;
|
|
11
|
+
this.onRefreshDone = onRefreshDone;
|
|
12
|
+
this.onFetchDone = onFetchDone;
|
|
13
|
+
this.closeRefreshTimer = new Subject();
|
|
14
|
+
this.cleanAll();
|
|
15
|
+
}
|
|
16
|
+
static Delay(ms) {
|
|
17
|
+
return new Promise(resolve => setTimeout(resolve, ms));
|
|
18
|
+
}
|
|
19
|
+
cleanAll() {
|
|
20
|
+
this.countsPeriod = {};
|
|
21
|
+
this.timeframesFromRadars = [];
|
|
22
|
+
this.timeframesFromRadarsExtended = [];
|
|
23
|
+
this.timeframeDates = [];
|
|
24
|
+
this.closeRefreshTimer?.next(null);
|
|
25
|
+
}
|
|
26
|
+
async fetch(dateShown, withGaugesMeasures, withCompareDuplicate) {
|
|
27
|
+
// set the target
|
|
28
|
+
const currents = this.timeframesFromRadarsExtended.filter(t => t.date.getTime() === dateShown.getTime());
|
|
29
|
+
if (currents.length !== 1) {
|
|
30
|
+
console.log('no correct dateShown', dateShown, this.timeframesFromRadarsExtended);
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
// build [current, previous, next] targets
|
|
34
|
+
const current = currents[0];
|
|
35
|
+
const position = this.timeframesFromRadarsExtended.indexOf(current);
|
|
36
|
+
let previous = null, next = null;
|
|
37
|
+
const positionNames = ['' + current.date.getTime()];
|
|
38
|
+
const frameSets = {};
|
|
39
|
+
frameSets['' + current.date.getTime()] = current;
|
|
40
|
+
if (position > 0) {
|
|
41
|
+
previous = this.timeframesFromRadarsExtended[position - 1];
|
|
42
|
+
positionNames.push('' + previous.date.getTime());
|
|
43
|
+
frameSets['' + previous.date.getTime()] = previous;
|
|
44
|
+
}
|
|
45
|
+
if (position < this.timeframesFromRadarsExtended.length) {
|
|
46
|
+
next = this.timeframesFromRadarsExtended[position + 1];
|
|
47
|
+
if (next?.date) {
|
|
48
|
+
positionNames.push('' + next.date.getTime());
|
|
49
|
+
frameSets['' + next.date.getTime()] = next;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
// align Map with targets
|
|
53
|
+
const targets = [];
|
|
54
|
+
for (const positionName of positionNames) {
|
|
55
|
+
if (frameSets[positionName]) {
|
|
56
|
+
const target = frameSets[positionName];
|
|
57
|
+
target.rainComputationQualityId = this.getRainComputationQualityTarget(target);
|
|
58
|
+
target.withGauge = withGaugesMeasures;
|
|
59
|
+
targets.push(target);
|
|
60
|
+
const timeframeContainers = await this.refreshMapTimeframeContainers(target);
|
|
61
|
+
if (positionName === ('' + current.date.getTime())) {
|
|
62
|
+
this.onFetchDone(timeframeContainers).then(ignored => {
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
// align Compare with targets
|
|
68
|
+
this.refreshCompareQuality(current, targets, withCompareDuplicate).then((ignored) => {
|
|
69
|
+
});
|
|
70
|
+
return current;
|
|
71
|
+
}
|
|
72
|
+
async stopAll() {
|
|
73
|
+
this.closeRefreshTimer.next(null); // <-- stop polling
|
|
74
|
+
await this.profileService.stopAll(this.rainNode.id);
|
|
75
|
+
await this.onRefreshDone(this.timeframeDates);
|
|
76
|
+
}
|
|
77
|
+
async setPeriod(begin, end) {
|
|
78
|
+
this.begin = begin;
|
|
79
|
+
this.end = end;
|
|
80
|
+
return this.refreshCounts();
|
|
81
|
+
}
|
|
82
|
+
async refresh(launchQualityAfter) {
|
|
83
|
+
if (!this.begin || !this.end) {
|
|
84
|
+
throw new Error('need a period');
|
|
85
|
+
}
|
|
86
|
+
this.compareManager.cleanAll();
|
|
87
|
+
let refreshInProgress = false;
|
|
88
|
+
let refreshDone = false;
|
|
89
|
+
timer(1000, 15000)
|
|
90
|
+
.pipe(switchMap(async () => {
|
|
91
|
+
if (refreshInProgress) {
|
|
92
|
+
return refreshDone;
|
|
93
|
+
}
|
|
94
|
+
refreshInProgress = true;
|
|
95
|
+
this.onRefreshInProgress(await this.refreshCounts(), this.timeframeDates).then(ignored => {
|
|
96
|
+
});
|
|
97
|
+
refreshDone = await this.refreshPeriodInsidePolling();
|
|
98
|
+
if (!refreshDone) {
|
|
99
|
+
refreshInProgress = false;
|
|
100
|
+
}
|
|
101
|
+
return refreshDone;
|
|
102
|
+
}), takeUntil(this.closeRefreshTimer))
|
|
103
|
+
.subscribe({
|
|
104
|
+
next: async (refreshFinished) => {
|
|
105
|
+
console.log('refreshFinished', refreshFinished, launchQualityAfter);
|
|
106
|
+
if (refreshFinished) {
|
|
107
|
+
this.closeRefreshTimer.next(null);
|
|
108
|
+
await this.onRefreshDone(this.timeframeDates);
|
|
109
|
+
}
|
|
110
|
+
},
|
|
111
|
+
error: (error) => {
|
|
112
|
+
console.error('error in refresh', error);
|
|
113
|
+
}
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
async selectGauge(gaugeId, compareIndex) {
|
|
117
|
+
return this.compareManager.selectGauge(gaugeId, compareIndex);
|
|
118
|
+
}
|
|
119
|
+
async refreshCounts() {
|
|
120
|
+
const counts = await this.profileService.getCounts(this.rainNode.id, this.begin, this.end, true);
|
|
121
|
+
this.countsPeriod = {
|
|
122
|
+
radarMeasures: counts.radarMeasures.reduce((partialSum, a) => partialSum + a.x, 0),
|
|
123
|
+
gaugeMeasures: counts.gaugeMeasures.reduce((partialSum, a) => partialSum + a.x, 0),
|
|
124
|
+
computationsByTeam: counts.computationsByTeam.reduce((partialSum, a) => partialSum + a.x, 0),
|
|
125
|
+
computationsByR2R: counts.computationsByR2R.reduce((partialSum, a) => partialSum + a.x, 0),
|
|
126
|
+
computationsUnderProcessing: counts.computationsUnderProcessing.reduce((partialSum, a) => partialSum + a.x, 0),
|
|
127
|
+
gaugeIntensity: counts.gaugeIntensity.reduce((partialSum, a) => partialSum + a.x, 0),
|
|
128
|
+
queueStoreSize: counts.queueStoreSize,
|
|
129
|
+
queueWaiting: counts.queueWaiting,
|
|
130
|
+
queueRunning: counts.queueRunning,
|
|
131
|
+
qualitiesInternal: counts.qualitiesInternal.reduce((partialSum, a) => partialSum + a.x, 0),
|
|
132
|
+
qualitiesInternalInProgress: counts.qualitiesInternalInProgress.reduce((partialSum, a) => partialSum + a.x, 0),
|
|
133
|
+
};
|
|
134
|
+
return this.countsPeriod;
|
|
135
|
+
}
|
|
136
|
+
getRainComputationQualityTarget(frameset) {
|
|
137
|
+
if (frameset.rainComputationQualities.length <= 0) {
|
|
138
|
+
return undefined;
|
|
139
|
+
}
|
|
140
|
+
return frameset.rainComputationQualities[0].id;
|
|
141
|
+
}
|
|
142
|
+
async refreshPeriodInsidePolling() {
|
|
143
|
+
// await RefreshManager.Delay(1000);
|
|
144
|
+
await this.refreshTimeframesFromRadars();
|
|
145
|
+
// if (this.countsPeriod.queueRunning === 0) {
|
|
146
|
+
// return true;
|
|
147
|
+
// }
|
|
148
|
+
if (this.countsPeriod.computationsUnderProcessing > 0) {
|
|
149
|
+
return false; // => continue
|
|
150
|
+
}
|
|
151
|
+
if (this.countsPeriod.qualitiesInternalInProgress > 0) {
|
|
152
|
+
return false; // => continue
|
|
153
|
+
}
|
|
154
|
+
console.log('refreshPeriodInsidePolling', this.countsPeriod.computationsByR2R, this.countsPeriod.radarMeasures);
|
|
155
|
+
// return this.countsPeriod.qualitiesInternal >= this.countsPeriod.radarMeasures;
|
|
156
|
+
const done = this.countsPeriod.computationsByR2R === this.countsPeriod.radarMeasures;
|
|
157
|
+
return done;
|
|
158
|
+
}
|
|
159
|
+
async refreshTimeframesFromRadars() {
|
|
160
|
+
const beginExtended = new Date(this.begin);
|
|
161
|
+
const endExtended = new Date(this.end);
|
|
162
|
+
beginExtended.setMinutes(beginExtended.getMinutes() - 7);
|
|
163
|
+
endExtended.setMinutes(endExtended.getMinutes() + 7);
|
|
164
|
+
this.rainNode = await this.profileService.getRainTimeframe(this.rainNode.getId(), beginExtended, endExtended);
|
|
165
|
+
this.timeframesFromRadarsExtended = await this.radarService.getTimeline(this.rainNode);
|
|
166
|
+
this.timeframesFromRadars = this.timeframesFromRadarsExtended
|
|
167
|
+
.filter((frameSet) => this.begin.getTime() <= frameSet.date.getTime() && frameSet.date.getTime() <= this.end.getTime())
|
|
168
|
+
.sort((a, b) => a.date.getTime() - b.date.getTime());
|
|
169
|
+
// console.log('timeframesFromRadarsExtended:', this.timeframesFromRadarsExtended);
|
|
170
|
+
this.timeframeDates = this.timeframesFromRadars.map(frameSet => frameSet.date);
|
|
171
|
+
return this.timeframesFromRadars;
|
|
172
|
+
}
|
|
173
|
+
async refreshMapTimeframeContainers(target) {
|
|
174
|
+
if (!target || !target.rainComputationId) {
|
|
175
|
+
console.warn('Pb with refreshMapTimeframeContainers insights');
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
178
|
+
const rainNode = this.rainNode;
|
|
179
|
+
const containers = [];
|
|
180
|
+
const newCreatedTimeframeContainers = new TimeframeContainers(containers);
|
|
181
|
+
try {
|
|
182
|
+
const rainNodeCartesianMap = await this.profileService
|
|
183
|
+
.getRainComputationCartesianMapById(rainNode.getId(), target.rainComputationId);
|
|
184
|
+
if (rainNodeCartesianMap) {
|
|
185
|
+
newCreatedTimeframeContainers.addFromRainComputationMap(rainNodeCartesianMap, false);
|
|
186
|
+
this.rainComputationMapDate = rainNodeCartesianMap.date;
|
|
187
|
+
this.rainComputationMapDoneDate = rainNodeCartesianMap.isDoneDate;
|
|
188
|
+
this.rainComputationMapLaunchedBy = rainNodeCartesianMap.launchedBy;
|
|
189
|
+
this.rainComputationMapTimeSpentInMs = rainNodeCartesianMap.timeSpentInMs;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
catch (e) {
|
|
193
|
+
console.warn('Pb with computations for id:', target.rainComputationId, e);
|
|
194
|
+
}
|
|
195
|
+
return newCreatedTimeframeContainers;
|
|
196
|
+
}
|
|
197
|
+
async refreshCompareQuality(frameSet, targets, withCompareDuplicate) {
|
|
198
|
+
await this.compareManager.refreshCompareQuality(frameSet, targets, withCompareDuplicate);
|
|
199
|
+
await this.compareManager.setGauges();
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVmcmVzaE1hbmFnZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBwL3NoYXJlZC90b29scy9SZWZyZXNoTWFuYWdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFDL0MsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBRXpDLE9BQU8sRUFBbUQsbUJBQW1CLEVBQUMsTUFBTSxVQUFVLENBQUM7QUFLL0YsTUFBTSxPQUFPLGNBQWM7SUFlekIsWUFDWSxRQUFrQixFQUNsQixZQUEwQixFQUMxQixjQUE4QixFQUM5QixjQUE4QixFQUM5QixtQkFBaUYsRUFDakYsYUFBd0QsRUFDeEQsV0FBd0U7UUFOeEUsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQUNsQixpQkFBWSxHQUFaLFlBQVksQ0FBYztRQUMxQixtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDOUIsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQzlCLHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBOEQ7UUFDakYsa0JBQWEsR0FBYixhQUFhLENBQTJDO1FBQ3hELGdCQUFXLEdBQVgsV0FBVyxDQUE2RDtRQUVsRixJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxPQUFPLEVBQU8sQ0FBQztRQUM1QyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDbEIsQ0FBQztJQUVNLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBVTtRQUM1QixPQUFPLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFFRCxRQUFRO1FBRU4sSUFBSSxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUM7UUFDdkIsSUFBSSxDQUFDLG9CQUFvQixHQUFHLEVBQUUsQ0FBQztRQUMv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QUFDLENBQUM7Z0JBRXJGLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxvQkFBb0IsQ0FBQyxJQUFJLENBQUM7Z0JBQ3hELElBQUksQ0FBQywwQkFBMEIsR0FBRyxvQkFBb0IsQ0FBQyxVQUFVLENBQUM7Z0JBQ2xFLElBQUksQ0FBQyw0QkFBNEIsR0FBRyxvQkFBb0IsQ0FBQyxVQUFVLENBQUM7Z0JBQ3BFLElBQUksQ0FBQywrQkFBK0IsR0FBRyxvQkFBb0IsQ0FBQyxhQUFhLENBQUM7YUFDM0U7U0FDRjtRQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ1YsT0FBTyxDQUFDLElBQUksQ0FBQyw4QkFBOEIsRUFBRSxNQUFNLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDLENBQUM7U0FDM0U7UUFFRCxPQUFPLDZCQUE2QixDQUFDO0lBQ3ZDLENBQUM7SUFFUyxLQUFLLENBQUMscUJBQXFCLENBQUMsUUFBa0IsRUFBRSxPQUluQixFQUNILG9CQUE2QjtRQUMvRCxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMscUJBQXFCLENBQUMsUUFBUSxFQUFFLE9BQU8sRUFBRSxvQkFBb0IsQ0FBQyxDQUFDO1FBQ3pGLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUN4QyxDQUFDO0NBRUYiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0ZyYW1lU2V0fSBmcm9tICcuL0ZyYW1lU2V0JztcbmltcG9ydCB7U3ViamVjdCwgdGFrZVVudGlsLCB0aW1lcn0gZnJvbSAncnhqcyc7XG5pbXBvcnQge3N3aXRjaE1hcH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtHYXVnZU5vZGUsIFJhaW5Ob2RlfSBmcm9tICdyYWFpbi1tb2RlbCc7XG5pbXBvcnQge0ZyYW1lQ29udGFpbmVyLCBJY29uTWFwVmFsdWUsIFRpbWVmcmFtZUNvbnRhaW5lciwgVGltZWZyYW1lQ29udGFpbmVyc30gZnJvbSAncmFhaW4tdWknO1xuaW1wb3J0IHtSYWRhclNlcnZpY2V9IGZyb20gJy4uL3JhZGFyLnNlcnZpY2UnO1xuaW1wb3J0IHtQcm9maWxlU2VydmljZX0gZnJvbSAnLi4vcHJvZmlsZS5zZXJ2aWNlJztcbmltcG9ydCB7Q29tcGFyZU1hbmFnZXJ9IGZyb20gJy4vQ29tcGFyZU1hbmFnZXInO1xuXG5leHBvcnQgY2xhc3MgUmVmcmVzaE1hbmFnZXIge1xuXG4gIHB1YmxpYyByYWluQ29tcHV0YXRpb25NYXBEYXRlOiBEYXRlO1xuICBwdWJsaWMgcmFpbkNvbXB1dGF0aW9uTWFwRG9uZURhdGU6IERhdGU7XG4gIHB1YmxpYyByYWluQ29tcHV0YXRpb25NYXBMYXVuY2hlZEJ5OiBzdHJpbmc7XG4gIHB1YmxpYyByYWluQ29tcHV0YXRpb25NYXBUaW1lU3BlbnRJbk1zOiBudW1iZXI7XG5cbiAgcHJvdGVjdGVkIGNsb3NlUmVmcmVzaFRpbWVyOiBTdWJqZWN0PGFueT47XG4gIHByb3RlY3RlZCBjb3VudHNQZXJpb2Q6IGFueTtcbiAgcHJvdGVjdGVkIHRpbWVmcmFtZXNGcm9tUmFkYXJzOiBGcmFtZVNldFtdO1xuICBwcm90ZWN0ZWQgdGltZWZyYW1lc0Zyb21SYWRhcnNFeHRlbmRlZDogRnJhbWVTZXRbXTtcbiAgcHJvdGVjdGVkIHRpbWVmcmFtZURhdGVzOiBEYXRlW107XG4gIHByb3RlY3RlZCBiZWdpbjogRGF0ZTtcbiAgcHJvdGVjdGVkIGVuZDogRGF0ZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgcmFpbk5vZGU6IFJhaW5Ob2RlLFxuICAgIHByb3RlY3RlZCByYWRhclNlcnZpY2U6IFJhZGFyU2VydmljZSxcbiAgICBwcm90ZWN0ZWQgcHJvZmlsZVNlcnZpY2U6IFByb2ZpbGVTZXJ2aWNlLFxuICAgIHByb3RlY3RlZCBjb21wYXJlTWFuYWdlcjogQ29tcGFyZU1hbmFnZXIsXG4gICAgcHJvdGVjdGVkIG9uUmVmcmVzaEluUHJvZ3Jlc3M6IChjb3VudFBlcmlvZHM6IGFueSwgdGltZWZyYW1lRGF0ZXM6IERhdGVbXSkgPT4gUHJvbWlzZTx2b2lkPixcbiAgICBwcm90ZWN0ZWQgb25SZWZyZXNoRG9uZTogKHRpbWVmcmFtZURhdGVzOiBEYXRlW10pID0+IFByb21pc2U8dm9pZD4sXG4gICAgcHJvdGVjdGVkIG9uRmV0Y2hEb25lOiAodGltZWZyYW1lQ29udGFpbmVyczogVGltZWZyYW1lQ29udGFpbmVycykgPT4gUHJvbWlzZTx2b2lkPixcbiAgKSB7XG4gICAgdGhpcy5jbG9zZVJlZnJlc2hUaW1lciA9IG5ldyBTdWJqZWN0PGFueT4oKTtcbiAgICB0aGlzLmNsZWFuQWxsKCk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIERlbGF5KG1zOiBudW1iZXIpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSk7XG4gIH1cblxuICBjbGVhbkFsbCgpIHtcblxuICAgIHRoaXMuY291bnRzUGVyaW9kID0ge307XG4gICAgdGhpcy50aW1lZnJhbWVzRnJvbVJhZGFycyA9IFtdO1xuICAgIHRoaXMudGltZWZyYW1lc0Zyb21SYWRhcnNFeHRlbmRlZCA9IFtdO1xuICAgIHRoaXMudGltZWZyYW1lRGF0ZXMgPSBbXTtcbiAgICB0aGlzLmNsb3NlUmVmcmVzaFRpbWVyPy5uZXh0KG51bGwpO1xuICB9XG5cbiAgYXN5bmMgZmV0Y2goZGF0ZVNob3duOiBEYXRlLCB3aXRoR2F1Z2VzTWVhc3VyZXM6IGJvb2xlYW4sIHdpdGhDb21wYXJlRHVwbGljYXRlOiBib29sZWFuKTogUHJvbWlzZTxGcmFtZVNldD4ge1xuICAgIC8vIHNldCB0aGUgdGFyZ2V0XG4gICAgY29uc3QgY3VycmVudHMgPSB0aGlzLnRpbWVmcmFtZXNGcm9tUmFkYXJzRXh0ZW5kZWQuZmlsdGVyKHQgPT4gdC5kYXRlLmdldFRpbWUoKSA9PT0gZGF0ZVNob3duLmdldFRpbWUoKSk7XG4gICAgaWYgKGN1cnJlbnRzLmxlbmd0aCAhPT0gMSkge1xuICAgICAgY29uc29sZS5sb2coJ25vIGNvcnJlY3QgZGF0ZVNob3duJywgZGF0ZVNob3duLCB0aGlzLnRpbWVmcmFtZXNGcm9tUmFkYXJzRXh0ZW5kZWQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIGJ1aWxkIFtjdXJyZW50LCBwcmV2aW91cywgbmV4dF0gdGFyZ2V0c1xuICAgIGNvbnN0IGN1cnJlbnQ6IEZyYW1lU2V0ID0gY3VycmVudHNbMF07XG4gICAgY29uc3QgcG9zaXRpb24gPSB0aGlzLnRpbWVmcmFtZXNGcm9tUmFkYXJzRXh0ZW5kZWQuaW5kZXhPZihjdXJyZW50KTtcbiAgICBsZXQgcHJldmlvdXM6IEZyYW1lU2V0ID0gbnVsbCwgbmV4dDogRnJhbWVTZXQgPSBudWxsO1xuICAgIGNvbnN0IHBvc2l0aW9uTmFtZXM6IHN0cmluZ1tdID0gWycnICsgY3VycmVudC5kYXRlLmdldFRpbWUoKV07XG4gICAgY29uc3QgZnJhbWVTZXRzID0ge307XG4gICAgZnJhbWVTZXRzWycnICsgY3VycmVudC5kYXRlLmdldFRpbWUoKV0gPSBjdXJyZW50O1xuICAgIGlmIChwb3NpdGlvbiA+IDApIHtcbiAgICAgIHByZXZpb3VzID0gdGhpcy50aW1lZnJhbWVzRnJvbVJhZGFyc0V4dGVuZGVkW3Bvc2l0aW9uIC0gMV07XG4gICAgICBwb3NpdGlvbk5hbWVzLnB1c2goJycgKyBwcmV2aW91cy5kYXRlLmdldFRpbWUoKSk7XG4gICAgICBmcmFtZVNldHNbJycgKyBwcmV2aW91cy5kYXRlLmdldFRpbWUoKV0gPSBwcmV2aW91cztcbiAgICB9XG4gICAgaWYgKHBvc2l0aW9uIDwgdGhpcy50aW1lZnJhbWVzRnJvbVJhZGFyc0V4dGVuZGVkLmxlbmd0aCkge1xuICAgICAgbmV4dCA9IHRoaXMudGltZWZyYW1lc0Zyb21SYWRhcnNFeHRlbmRlZFtwb3NpdGlvbiArIDFdO1xuICAgICAgaWYgKG5leHQ/LmRhdGUpIHtcbiAgICAgICAgcG9zaXRpb25OYW1lcy5wdXNoKCcnICsgbmV4dC5kYXRlLmdldFRpbWUoKSk7XG4gICAgICAgIGZyYW1lU2V0c1snJyArIG5leHQuZGF0ZS5nZXRUaW1lKCldID0gbmV4dDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBhbGlnbiBNYXAgd2l0aCB0YXJnZXRzXG4gICAgY29uc3QgdGFyZ2V0czoge1xuICAgICAgZGF0ZTogRGF0ZSxcbiAgICAgIHJhaW5Db21wdXRhdGlvbklkOiBzdHJpbmcsXG4gICAgICByYWluQ29tcHV0YXRpb25RdWFsaXR5SWQ6IHN0cmluZyxcbiAgICB9W10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IHBvc2l0aW9uTmFtZSBvZiBwb3NpdGlvbk5hbWVzKSB7XG4gICAgICBpZiAoZnJhbWVTZXRzW3Bvc2l0aW9uTmFtZV0pIHtcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gZnJhbWVTZXRzW3Bvc2l0aW9uTmFtZV07XG4gICAgICAgIHRhcmdldC5yYWluQ29tcHV0YXRpb25RdWFsaXR5SWQgPSB0aGlzLmdldFJhaW5Db21wdXRhdGlvblF1YWxpdHlUYXJnZXQodGFyZ2V0KTtcbiAgICAgICAgdGFyZ2V0LndpdGhHYXVnZSA9IHdpdGhHYXVnZXNNZWFzdXJlcztcbiAgICAgICAgdGFyZ2V0cy5wdXNoKHRhcmdldCk7XG5cbiAgICAgICAgY29uc3QgdGltZWZyYW1lQ29udGFpbmVycyA9IGF3YWl0IHRoaXMucmVmcmVzaE1hcFRpbWVmcmFtZUNvbnRhaW5lcnModGFyZ2V0KTtcblxuICAgICAgICBpZiAocG9zaXRpb25OYW1lID09PSAoJycgKyBjdXJyZW50LmRhdGUuZ2V0VGltZSgpKSkge1xuICAgICAgICAgIHRoaXMub25GZXRjaERvbmUodGltZWZyYW1lQ29udGFpbmVycykudGhlbihpZ25vcmVkID0+IHtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGFsaWduIENvbXBhcmUgd2l0aCB0YXJnZXRzXG4gICAgdGhpcy5yZWZyZXNoQ29tcGFyZVF1YWxpdHkoY3VycmVudCwgdGFyZ2V0cywgd2l0aENvbXBhcmVEdXBsaWNhdGUpLnRoZW4oKGlnbm9yZWQpID0+IHtcbiAgICB9KTtcblxuICAgIHJldHVybiBjdXJyZW50O1xuICB9XG5cbiAgYXN5bmMgc3RvcEFsbCgpIHtcbiAgICB0aGlzLmNsb3NlUmVmcmVzaFRpbWVyLm5leHQobnVsbCk7IC8vIDwtLSBzdG9wIHBvbGxpbmdcbiAgICBhd2FpdCB0aGlzLnByb2ZpbGVTZXJ2aWNlLnN0b3BBbGwodGhpcy5yYWluTm9kZS5pZCk7XG4gICAgYXdhaXQgdGhpcy5vblJlZnJlc2hEb25lKHRoaXMudGltZWZyYW1lRGF0ZXMpO1xuICB9XG5cbiAgYXN5bmMgc2V0UGVyaW9kKGJlZ2luOiBEYXRlLCBlbmQ6IERhdGUpIHtcbiAgICB0aGlzLmJlZ2luID0gYmVnaW47XG4gICAgdGhpcy5lbmQgPSBlbmQ7XG5cbiAgICByZXR1cm4gdGhpcy5yZWZyZXNoQ291bnRzKCk7XG4gIH1cblxuICBhc3luYyByZWZyZXNoKGxhdW5jaFF1YWxpdHlBZnRlcjogYm9vbGVhbikge1xuXG4gICAgaWYgKCF0aGlzLmJlZ2luIHx8ICF0aGlzLmVuZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCduZWVkIGEgcGVyaW9kJyk7XG4gICAgfVxuXG4gICAgdGhpcy5jb21wYXJlTWFuYWdlci5jbGVhbkFsbCgpO1xuICAgIGxldCByZWZyZXNoSW5Qcm9ncmVzcyA9IGZhbHNlO1xuICAgIGxldCByZWZyZXNoRG9uZSA9IGZhbHNlO1xuXG4gICAgdGltZXIoMTAwMCwgMTUwMDApXG4gICAgICAucGlwZShcbiAgICAgICAgc3dpdGNoTWFwKGFzeW5jICgpID0+IHtcbiAgICAgICAgICBpZiAocmVmcmVzaEluUHJvZ3Jlc3MpIHtcbiAgICAgICAgICAgIHJldHVybiByZWZyZXNoRG9uZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZWZyZXNoSW5Qcm9ncmVzcyA9IHRydWU7XG4gICAgICAgICAgdGhpcy5vblJlZnJlc2hJblByb2dyZXNzKGF3YWl0IHRoaXMucmVmcmVzaENvdW50cygpLCB0aGlzLnRpbWVmcmFtZURhdGVzKS50aGVuKGlnbm9yZWQgPT4ge1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJlZnJlc2hEb25lID0gYXdhaXQgdGhpcy5yZWZyZXNoUGVyaW9kSW5zaWRlUG9sbGluZygpO1xuICAgICAgICAgIGlmICghcmVmcmVzaERvbmUpIHtcbiAgICAgICAgICAgIHJlZnJlc2hJblByb2dyZXNzID0gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiByZWZyZXNoRG9uZTtcbiAgICAgICAgfSksXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLmNsb3NlUmVmcmVzaFRpbWVyKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiBhc3luYyAocmVmcmVzaEZpbmlzaGVkOiBib29sZWFuKSA9PiB7XG4gICAgICAgICAgY29uc29sZS5sb2coJ3JlZnJlc2hGaW5pc2hlZCcsIHJlZnJlc2hGaW5pc2hlZCwgbGF1bmNoUXVhbGl0eUFmdGVyKTtcbiAgICAgICAgICBpZiAocmVmcmVzaEZpbmlzaGVkKSB7XG4gICAgICAgICAgICB0aGlzLmNsb3NlUmVmcmVzaFRpbWVyLm5leHQobnVsbCk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLm9uUmVmcmVzaERvbmUodGhpcy50aW1lZnJhbWVEYXRlcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogKGVycm9yOiBhbnkpID0+IHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdlcnJvciBpbiByZWZyZXNoJywgZXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICB9XG5cbiAgYXN5bmMgc2VsZWN0R2F1Z2UoZ2F1Z2VJZDogc3RyaW5nLCBjb21wYXJlSW5kZXg6IG51bWJlcikge1xuICAgIHJldHVybiB0aGlzLmNvbXBhcmVNYW5hZ2VyLnNlbGVjdEdhdWdlKGdhdWdlSWQsIGNvbXBhcmVJbmRleCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgcmVmcmVzaENvdW50cygpIHtcbiAgICBjb25zdCBjb3VudHMgPSBhd2FpdCB0aGlzLnByb2ZpbGVTZXJ2aWNlLmdldENvdW50cyh0aGlzLnJhaW5Ob2RlLmlkLCB0aGlzLmJlZ2luLCB0aGlzLmVuZCwgdHJ1ZSk7XG4gICAgdGhpcy5jb3VudHNQZXJpb2QgPSB7XG4gICAgICByYWRhck1lYXN1cmVzOiBjb3VudHMucmFkYXJNZWFzdXJlcy5yZWR1Y2UoKHBhcnRpYWxTdW0sIGEpID0+IHBhcnRpYWxTdW0gKyBhLngsIDApLFxuICAgICAgZ2F1Z2VNZWFzdXJlczogY291bnRzLmdhdWdlTWVhc3VyZXMucmVkdWNlKChwYXJ0aWFsU3VtLCBhKSA9PiBwYXJ0aWFsU3VtICsgYS54LCAwKSxcbiAgICAgIGNvbXB1dGF0aW9uc0J5VGVhbTogY291bnRzLmNvbXB1dGF0aW9uc0J5VGVhbS5yZWR1Y2UoKHBhcnRpYWxTdW0sIGEpID0+IHBhcnRpYWxTdW0gKyBhLngsIDApLFxuICAgICAgY29tcHV0YXRpb25zQnlSMlI6IGNvdW50cy5jb21wdXRhdGlvbnNCeVIyUi5yZWR1Y2UoKHBhcnRpYWxTdW0sIGEpID0+IHBhcnRpYWxTdW0gKyBhLngsIDApLFxuICAgICAgY29tcHV0YXRpb25zVW5kZXJQcm9jZXNzaW5nOiBjb3VudHMuY29tcHV0YXRpb25zVW5kZXJQcm9jZXNzaW5nLnJlZHVjZSgocGFydGlhbFN1bSwgYSkgPT4gcGFydGlhbFN1bSArIGEueCwgMCksXG4gICAgICBnYXVnZUludGVuc2l0eTogY291bnRzLmdhdWdlSW50ZW5zaXR5LnJlZHVjZSgocGFydGlhbFN1bSwgYSkgPT4gcGFydGlhbFN1bSArIGEueCwgMCksXG4gICAgICBxdWV1ZVN0b3JlU2l6ZTogY291bnRzLnF1ZXVlU3RvcmVTaXplLFxuICAgICAgcXVldWVXYWl0aW5nOiBjb3VudHMucXVldWVXYWl0aW5nLFxuICAgICAgcXVldWVSdW5uaW5nOiBjb3VudHMucXVldWVSdW5uaW5nLFxuICAgICAgcXVhbGl0aWVzSW50ZXJuYWw6IGNvdW50cy5xdWFsaXRpZXNJbnRlcm5hbC5yZWR1Y2UoKHBhcnRpYWxTdW0sIGEpID0+IHBhcnRpYWxTdW0gKyBhLngsIDApLFxuICAgICAgcXVhbGl0aWVzSW50ZXJuYWxJblByb2dyZXNzOiBjb3VudHMucXVhbGl0aWVzSW50ZXJuYWxJblByb2dyZXNzLnJlZHVjZSgocGFydGlhbFN1bSwgYSkgPT4gcGFydGlhbFN1bSArIGEueCwgMCksXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5jb3VudHNQZXJpb2Q7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0UmFpbkNvbXB1dGF0aW9uUXVhbGl0eVRhcmdldChmcmFtZXNldDogRnJhbWVTZXQpOiBzdHJpbmcge1xuICAgIGlmIChmcmFtZXNldC5yYWluQ29tcHV0YXRpb25RdWFsaXRpZXMubGVuZ3RoIDw9IDApIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiBmcmFtZXNldC5yYWluQ29tcHV0YXRpb25RdWFsaXRpZXNbMF0uaWQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgcmVmcmVzaFBlcmlvZEluc2lkZVBvbGxpbmcoKTogUHJvbWlzZTxib29sZWFuPiB7XG5cbiAgICAvLyBhd2FpdCBSZWZyZXNoTWFuYWdlci5EZWxheSgxMDAwKTtcblxuICAgIGF3YWl0IHRoaXMucmVmcmVzaFRpbWVmcmFtZXNGcm9tUmFkYXJzKCk7XG5cbiAgICAvLyBpZiAodGhpcy5jb3VudHNQZXJpb2QucXVldWVSdW5uaW5nID09PSAwKSB7XG4gICAgLy8gIHJldHVybiB0cnVlO1xuICAgIC8vIH1cblxuICAgIGlmICh0aGlzLmNvdW50c1BlcmlvZC5jb21wdXRhdGlvbnNVbmRlclByb2Nlc3NpbmcgPiAwKSB7XG4gICAgICByZXR1cm4gZmFsc2U7IC8vID0+IGNvbnRpbnVlXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY291bnRzUGVyaW9kLnF1YWxpdGllc0ludGVybmFsSW5Qcm9ncmVzcyA+IDApIHtcbiAgICAgIHJldHVybiBmYWxzZTsgLy8gPT4gY29udGludWVcbiAgICB9XG5cbiAgICBjb25zb2xlLmxvZygncmVmcmVzaFBlcmlvZEluc2lkZVBvbGxpbmcnLCB0aGlzLmNvdW50c1BlcmlvZC5jb21wdXRhdGlvbnNCeVIyUiwgdGhpcy5jb3VudHNQZXJpb2QucmFkYXJNZWFzdXJlcylcbiAgICAvLyByZXR1cm4gdGhpcy5jb3VudHNQZXJpb2QucXVhbGl0aWVzSW50ZXJuYWwgPj0gdGhpcy5jb3VudHNQZXJpb2QucmFkYXJNZWFzdXJlcztcbiAgICBjb25zdCBkb25lID0gdGhpcy5jb3VudHNQZXJpb2QuY29tcHV0YXRpb25zQnlSMlIgPT09IHRoaXMuY291bnRzUGVyaW9kLnJhZGFyTWVhc3VyZXM7XG4gICAgcmV0dXJuIGRvbmU7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgcmVmcmVzaFRpbWVmcmFtZXNGcm9tUmFkYXJzKCkge1xuXG4gICAgY29uc3QgYmVnaW5FeHRlbmRlZCA9IG5ldyBEYXRlKHRoaXMuYmVnaW4pO1xuICAgIGNvbnN0IGVuZEV4dGVuZGVkID0gbmV3IERhdGUodGhpcy5lbmQpO1xuICAgIGJlZ2luRXh0ZW5kZWQuc2V0TWludXRlcyhiZWdpbkV4dGVuZGVkLmdldE1pbnV0ZXMoKSAtIDcpO1xuICAgIGVuZEV4dGVuZGVkLnNldE1pbnV0ZXMoZW5kRXh0ZW5kZWQuZ2V0TWludXRlcygpICsgNyk7XG4gICAgdGhpcy5yYWluTm9kZSA9IGF3YWl0IHRoaXMucHJvZmlsZVNlcnZpY2UuZ2V0UmFpblRpbWVmcmFtZSh0aGlzLnJhaW5Ob2RlLmdldElkKCksIGJlZ2luRXh0ZW5kZWQsIGVuZEV4dGVuZGVkKTtcblxuICAgIHRoaXMudGltZWZyYW1lc0Zyb21SYWRhcnNFeHRlbmRlZCA9IGF3YWl0IHRoaXMucmFkYXJTZXJ2aWNlLmdldFRpbWVsaW5lKHRoaXMucmFpbk5vZGUpO1xuICAgIHRoaXMudGltZWZyYW1lc0Zyb21SYWRhcnMgPSB0aGlzLnRpbWVmcmFtZXNGcm9tUmFkYXJzRXh0ZW5kZWRcbiAgICAgIC5maWx0ZXIoKGZyYW1lU2V0KSA9PiB0aGlzLmJlZ2luLmdldFRpbWUoKSA8PSBmcmFtZVNldC5kYXRlLmdldFRpbWUoKSAmJiBmcmFtZVNldC5kYXRlLmdldFRpbWUoKSA8PSB0aGlzLmVuZC5nZXRUaW1lKCkpXG4gICAgICAuc29ydCgoYSwgYikgPT4gYS5kYXRlLmdldFRpbWUoKSAtIGIuZGF0ZS5nZXRUaW1lKCkpO1xuXG4gICAgLy8gY29uc29sZS5sb2coJ3RpbWVmcmFtZXNGcm9tUmFkYXJzRXh0ZW5kZWQ6JywgdGhpcy50aW1lZnJhbWVzRnJvbVJhZGFyc0V4dGVuZGVkKTtcblxuICAgIHRoaXMudGltZWZyYW1lRGF0ZXMgPSB0aGlzLnRpbWVmcmFtZXNGcm9tUmFkYXJzLm1hcChmcmFtZVNldCA9PiBmcmFtZVNldC5kYXRlKTtcbiAgICByZXR1cm4gdGhpcy50aW1lZnJhbWVzRnJvbVJhZGFycztcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyByZWZyZXNoTWFwVGltZWZyYW1lQ29udGFpbmVycyh0YXJnZXQ6IHtcbiAgICBkYXRlOiBEYXRlLFxuICAgIHJhaW5Db21wdXRhdGlvbklkOiBzdHJpbmcsXG4gICAgd2l0aEdhdWdlOiBib29sZWFuXG4gIH0pIHtcbiAgICBpZiAoIXRhcmdldCB8fCAhdGFyZ2V0LnJhaW5Db21wdXRhdGlvbklkKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1BiIHdpdGggcmVmcmVzaE1hcFRpbWVmcmFtZUNvbnRhaW5lcnMgaW5zaWdodHMnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCByYWluTm9kZSA9IHRoaXMucmFpbk5vZGU7XG4gICAgY29uc3QgY29udGFpbmVyczogVGltZWZyYW1lQ29udGFpbmVyW10gPSBbXTtcbiAgICBjb25zdCBuZXdDcmVhdGVkVGltZWZyYW1lQ29udGFpbmVycyA9IG5ldyBUaW1lZnJhbWVDb250YWluZXJzKGNvbnRhaW5lcnMpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByYWluTm9kZUNhcnRlc2lhbk1hcCA9IGF3YWl0IHRoaXMucHJvZmlsZVNlcnZpY2VcbiAgICAgICAgLmdldFJhaW5Db21wdXRhdGlvbkNhcnRlc2lhbk1hcEJ5SWQocmFpbk5vZGUuZ2V0SWQoKSwgdGFyZ2V0LnJhaW5Db21wdXRhdGlvbklkKTtcbiAgICAgIGlmIChyYWluTm9kZUNhcnRlc2lhbk1hcCkge1xuICAgICAgICBuZXdDcmVhdGVkVGltZWZyYW1lQ29udGFpbmVycy5hZGRGcm9tUmFpbkNvbXB1dGF0aW9uTWFwKHJhaW5Ob2RlQ2FydGVzaWFuTWFwLCBmYWxzZSk7XG5cbiAgICAgICAgdGhpcy5yYWluQ29tcHV0YXRpb25NYXBEYXRlID0gcmFpbk5vZGVDYXJ0ZXNpYW5NYXAuZGF0ZTtcbiAgICAgICAgdGhpcy5yYWluQ29tcHV0YXRpb25NYXBEb25lRGF0ZSA9IHJhaW5Ob2RlQ2FydGVzaWFuTWFwLmlzRG9uZURhdGU7XG4gICAgICAgIHRoaXMucmFpbkNvbXB1dGF0aW9uTWFwTGF1bmNoZWRCeSA9IHJhaW5Ob2RlQ2FydGVzaWFuTWFwLmxhdW5jaGVkQnk7XG4gICAgICAgIHRoaXMucmFpbkNvbXB1dGF0aW9uTWFwVGltZVNwZW50SW5NcyA9IHJhaW5Ob2RlQ2FydGVzaWFuTWFwLnRpbWVTcGVudEluTXM7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS53YXJuKCdQYiB3aXRoIGNvbXB1dGF0aW9ucyBmb3IgaWQ6JywgdGFyZ2V0LnJhaW5Db21wdXRhdGlvbklkLCBlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3Q3JlYXRlZFRpbWVmcmFtZUNvbnRhaW5lcnM7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgcmVmcmVzaENvbXBhcmVRdWFsaXR5KGZyYW1lU2V0OiBGcmFtZVNldCwgdGFyZ2V0czoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGU6IERhdGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFpbkNvbXB1dGF0aW9uSWQ6IHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWluQ29tcHV0YXRpb25RdWFsaXR5SWQ6IHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVtdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoQ29tcGFyZUR1cGxpY2F0ZTogYm9vbGVhbikge1xuICAgIGF3YWl0IHRoaXMuY29tcGFyZU1hbmFnZXIucmVmcmVzaENvbXBhcmVRdWFsaXR5KGZyYW1lU2V0LCB0YXJnZXRzLCB3aXRoQ29tcGFyZUR1cGxpY2F0ZSk7XG4gICAgYXdhaXQgdGhpcy5jb21wYXJlTWFuYWdlci5zZXRHYXVnZXMoKTtcbiAgfVxuXG59XG4iXX0=
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export * from './CompareManager';
|
|
2
|
+
export * from './FrameSet';
|
|
3
|
+
export * from './GaugeNodeFilter';
|
|
4
|
+
export * from './RefreshManager';
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBwL3NoYXJlZC90b29scy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLGtCQUFrQixDQUFDO0FBQ2pDLGNBQWMsWUFBWSxDQUFDO0FBQzNCLGNBQWMsbUJBQW1CLENBQUM7QUFDbEMsY0FBYyxrQkFBa0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vQ29tcGFyZU1hbmFnZXInO1xuZXhwb3J0ICogZnJvbSAnLi9GcmFtZVNldCc7XG5leHBvcnQgKiBmcm9tICcuL0dhdWdlTm9kZUZpbHRlcic7XG5leHBvcnQgKiBmcm9tICcuL1JlZnJlc2hNYW5hZ2VyJztcbiJdfQ==
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export class XYType {
|
|
2
|
+
constructor(x, y, r, name, id) {
|
|
3
|
+
this.x = x;
|
|
4
|
+
this.y = y;
|
|
5
|
+
this.r = r;
|
|
6
|
+
this.name = name;
|
|
7
|
+
this.id = id;
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieHl0eXBlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FwcC9zaGFyZWQveHl0eXBlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sT0FBTyxNQUFNO0lBQ2pCLFlBQW1CLENBQVMsRUFDVCxDQUFTLEVBQ1QsQ0FBVSxFQUNWLElBQWEsRUFDYixFQUFXO1FBSlgsTUFBQyxHQUFELENBQUMsQ0FBUTtRQUNULE1BQUMsR0FBRCxDQUFDLENBQVE7UUFDVCxNQUFDLEdBQUQsQ0FBQyxDQUFTO1FBQ1YsU0FBSSxHQUFKLElBQUksQ0FBUztRQUNiLE9BQUUsR0FBRixFQUFFLENBQVM7SUFDOUIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNsYXNzIFhZVHlwZSB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyB4OiBudW1iZXIsXG4gICAgICAgICAgICAgIHB1YmxpYyB5OiBudW1iZXIsXG4gICAgICAgICAgICAgIHB1YmxpYyByPzogbnVtYmVyLFxuICAgICAgICAgICAgICBwdWJsaWMgbmFtZT86IHN0cmluZyxcbiAgICAgICAgICAgICAgcHVibGljIGlkPzogc3RyaW5nKSB7XG4gIH1cbn1cblxuIl19
|