@catchpower/device-config-interaction 0.0.13
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/README.md +25 -0
- package/esm2022/catchpower-device-config-interaction.mjs +5 -0
- package/esm2022/lib/command.service.mjs +66 -0
- package/esm2022/lib/crc-check.service.mjs +105 -0
- package/esm2022/lib/dataset-processing.service.mjs +524 -0
- package/esm2022/lib/device-config-dataset.service.mjs +187 -0
- package/esm2022/lib/device-config-interaction.module.mjs +16 -0
- package/esm2022/lib/device-config-interaction.service.mjs +58 -0
- package/esm2022/lib/device-live-dataset.service.mjs +67 -0
- package/esm2022/lib/interfaces/devices-list.mjs +2 -0
- package/esm2022/public-api.mjs +12 -0
- package/fesm2022/catchpower-device-config-interaction.mjs +1018 -0
- package/fesm2022/catchpower-device-config-interaction.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/command.service.d.ts +25 -0
- package/lib/crc-check.service.d.ts +17 -0
- package/lib/dataset-processing.service.d.ts +60 -0
- package/lib/device-config-dataset.service.d.ts +20 -0
- package/lib/device-config-interaction.module.d.ts +6 -0
- package/lib/device-config-interaction.service.d.ts +8 -0
- package/lib/device-live-dataset.service.d.ts +15 -0
- package/lib/interfaces/devices-list.d.ts +183 -0
- package/package.json +25 -0
- package/public-api.d.ts +8 -0
|
@@ -0,0 +1,524 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
export class DatasetProcessingService {
|
|
4
|
+
//constructor() {}
|
|
5
|
+
/*
|
|
6
|
+
* For use with DataView
|
|
7
|
+
*
|
|
8
|
+
*/
|
|
9
|
+
getValuefromBuffer(obj, buffer) {
|
|
10
|
+
let value = 0;
|
|
11
|
+
if (obj.signed) {
|
|
12
|
+
switch (obj.length) {
|
|
13
|
+
case 8:
|
|
14
|
+
value = buffer.getInt8(obj.position);
|
|
15
|
+
break;
|
|
16
|
+
case 16:
|
|
17
|
+
value = buffer.getInt16(obj.position, obj.little);
|
|
18
|
+
break;
|
|
19
|
+
case 32:
|
|
20
|
+
value = buffer.getInt32(obj.position, obj.little);
|
|
21
|
+
break;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
switch (obj.length) {
|
|
26
|
+
case 8:
|
|
27
|
+
value = buffer.getUint8(obj.position);
|
|
28
|
+
break;
|
|
29
|
+
case 16:
|
|
30
|
+
value = buffer.getUint16(obj.position, obj.little);
|
|
31
|
+
break;
|
|
32
|
+
case 32:
|
|
33
|
+
value = buffer.getUint32(obj.position, obj.little);
|
|
34
|
+
break;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return value;
|
|
38
|
+
}
|
|
39
|
+
/*
|
|
40
|
+
* For use with DataView
|
|
41
|
+
*
|
|
42
|
+
*
|
|
43
|
+
*/
|
|
44
|
+
writeValueToBuffer(obj, value, buffer) {
|
|
45
|
+
if (obj.signed) {
|
|
46
|
+
switch (obj.length) {
|
|
47
|
+
case 8:
|
|
48
|
+
buffer.setInt8(obj.position, value);
|
|
49
|
+
break;
|
|
50
|
+
case 16:
|
|
51
|
+
buffer.setInt16(obj.position, value, obj.little);
|
|
52
|
+
break;
|
|
53
|
+
case 32:
|
|
54
|
+
buffer.setInt32(obj.position, value, obj.little);
|
|
55
|
+
break;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
switch (obj.length) {
|
|
60
|
+
case 8:
|
|
61
|
+
buffer.setUint8(obj.position, value);
|
|
62
|
+
break;
|
|
63
|
+
case 16:
|
|
64
|
+
buffer.setUint16(obj.position, value, obj.little);
|
|
65
|
+
break;
|
|
66
|
+
case 32:
|
|
67
|
+
buffer.setUint32(obj.position, value, obj.little);
|
|
68
|
+
break;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
runProcess(process, rawData, otherData) {
|
|
73
|
+
const values = this.getChunkValues(process.data, rawData, otherData);
|
|
74
|
+
//console.log('process values ', values);
|
|
75
|
+
let pVal = 0;
|
|
76
|
+
switch (process.type) {
|
|
77
|
+
case 'ass':
|
|
78
|
+
pVal = this.assembleProcess(values);
|
|
79
|
+
process.value = pVal;
|
|
80
|
+
return;
|
|
81
|
+
case 'com':
|
|
82
|
+
pVal = this.compareProcess(values, process);
|
|
83
|
+
process.value = pVal;
|
|
84
|
+
return;
|
|
85
|
+
case 'cal':
|
|
86
|
+
pVal = this.calculateProcess(values);
|
|
87
|
+
process.value = pVal;
|
|
88
|
+
return;
|
|
89
|
+
case 'tfm':
|
|
90
|
+
pVal = this.tfmProcess(values);
|
|
91
|
+
process.value = pVal;
|
|
92
|
+
return;
|
|
93
|
+
case 'cdt':
|
|
94
|
+
pVal = this.cdtProcess(values);
|
|
95
|
+
process.value = pVal;
|
|
96
|
+
return;
|
|
97
|
+
case 'itd':
|
|
98
|
+
pVal = this.itdProcess(values);
|
|
99
|
+
process.value = pVal;
|
|
100
|
+
return;
|
|
101
|
+
case 'its':
|
|
102
|
+
pVal = this.itsProcess(values);
|
|
103
|
+
process.value = pVal;
|
|
104
|
+
return;
|
|
105
|
+
case 'bsv':
|
|
106
|
+
pVal = this.bsvProcess(values);
|
|
107
|
+
process.value = pVal;
|
|
108
|
+
return;
|
|
109
|
+
case 'vfa':
|
|
110
|
+
pVal = this.vfaProcess(values, process);
|
|
111
|
+
process.value = pVal;
|
|
112
|
+
return;
|
|
113
|
+
case 'cts':
|
|
114
|
+
pVal = this.ctsProcess(values);
|
|
115
|
+
process.value = pVal;
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
assembleProcess(values) {
|
|
120
|
+
let result = '';
|
|
121
|
+
values.forEach((v) => {
|
|
122
|
+
result += v;
|
|
123
|
+
});
|
|
124
|
+
return result;
|
|
125
|
+
}
|
|
126
|
+
disassembleProcess(string, values) {
|
|
127
|
+
const result = {};
|
|
128
|
+
let i = 0;
|
|
129
|
+
let length = 0;
|
|
130
|
+
values.forEach((val) => {
|
|
131
|
+
if (Object.prototype.hasOwnProperty.call(val, 'strLength')) {
|
|
132
|
+
length = val.strLength;
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
const str = val.value;
|
|
136
|
+
length = str.length;
|
|
137
|
+
}
|
|
138
|
+
if (val.fromData == 'raw') {
|
|
139
|
+
result[val.value] = Number(string.substring(i, i + length));
|
|
140
|
+
}
|
|
141
|
+
i = i + length;
|
|
142
|
+
});
|
|
143
|
+
//console.log('Disassemble Result ', JSON.stringify(result));
|
|
144
|
+
return result;
|
|
145
|
+
}
|
|
146
|
+
compareProcess(values, process) {
|
|
147
|
+
const result = this.compareValues(values[0], values[1], values[2]);
|
|
148
|
+
let text = 'N/A';
|
|
149
|
+
if ('comTxt' in process) {
|
|
150
|
+
if (process.comTxt !== undefined) {
|
|
151
|
+
if (result) {
|
|
152
|
+
text = process.comTxt[0];
|
|
153
|
+
}
|
|
154
|
+
else {
|
|
155
|
+
return process.comTxt[1];
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
return text;
|
|
160
|
+
}
|
|
161
|
+
compareValues(v1, op, v2) {
|
|
162
|
+
switch (op) {
|
|
163
|
+
case '<':
|
|
164
|
+
return v1 < v2;
|
|
165
|
+
case '<=':
|
|
166
|
+
return v1 <= v2;
|
|
167
|
+
case '==':
|
|
168
|
+
return v1 == v2;
|
|
169
|
+
case '>=':
|
|
170
|
+
return v1 >= v2;
|
|
171
|
+
case '>':
|
|
172
|
+
return v1 > v2;
|
|
173
|
+
default:
|
|
174
|
+
return false;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
calculateProcess(values) {
|
|
178
|
+
return this.calculateValues(values[0], values[1], values[2]);
|
|
179
|
+
}
|
|
180
|
+
calculateValues(v1, op, v2) {
|
|
181
|
+
switch (op) {
|
|
182
|
+
case '+':
|
|
183
|
+
return v1 + v2;
|
|
184
|
+
case '-':
|
|
185
|
+
return v1 - v2;
|
|
186
|
+
case '/':
|
|
187
|
+
return v1 / v2;
|
|
188
|
+
case '*':
|
|
189
|
+
return v1 * v2;
|
|
190
|
+
default:
|
|
191
|
+
return 0;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
tfmProcess(values) {
|
|
195
|
+
const hours = Math.floor((values[0] * 60) / 3600);
|
|
196
|
+
const mins = Math.floor((values[0] * 60 - hours * 3600) / 60);
|
|
197
|
+
return this.displayTime(hours, mins);
|
|
198
|
+
}
|
|
199
|
+
cdtProcess(values) {
|
|
200
|
+
const hours = parseInt(values[0].substring(11, 13));
|
|
201
|
+
const mins = parseInt(values[0].substring(14, 16));
|
|
202
|
+
return this.displayTime(hours, mins);
|
|
203
|
+
}
|
|
204
|
+
//New process to pick value from array based on interger value
|
|
205
|
+
vfaProcess(values, process) {
|
|
206
|
+
const value = values[0];
|
|
207
|
+
if (process.valuesList !== undefined) {
|
|
208
|
+
if (value < process.valuesList.length) {
|
|
209
|
+
return process.valuesList[value];
|
|
210
|
+
}
|
|
211
|
+
else {
|
|
212
|
+
return 'nip';
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
else {
|
|
216
|
+
return 'n/a';
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
itdProcess(values) {
|
|
220
|
+
let hours = Math.floor((values[0] * 60) / 3600);
|
|
221
|
+
//console.log("hours ", hours);
|
|
222
|
+
const mins = Math.floor((values[0] * 60 - hours * 3600) / 60);
|
|
223
|
+
//console.log("mins ", mins);
|
|
224
|
+
let h;
|
|
225
|
+
let m;
|
|
226
|
+
if (hours > 23) {
|
|
227
|
+
hours = hours - 24;
|
|
228
|
+
}
|
|
229
|
+
if (hours < 10) {
|
|
230
|
+
h = '0' + hours;
|
|
231
|
+
}
|
|
232
|
+
else {
|
|
233
|
+
h = hours;
|
|
234
|
+
}
|
|
235
|
+
if (mins < 10) {
|
|
236
|
+
m = '0' + mins;
|
|
237
|
+
}
|
|
238
|
+
else {
|
|
239
|
+
m = mins;
|
|
240
|
+
}
|
|
241
|
+
const string = '0000-00-00T' + h + ':' + m;
|
|
242
|
+
//console.log("$%^&&^%%$$%^&&&^%%%%^^^&&&^^%^%%%^^^& dt string ", string);
|
|
243
|
+
return string;
|
|
244
|
+
}
|
|
245
|
+
dtiProcess(string, values) {
|
|
246
|
+
//console.log("dtiProcess inputs string: ", string, " Values: ", values);
|
|
247
|
+
const result = {};
|
|
248
|
+
let h;
|
|
249
|
+
let m;
|
|
250
|
+
values.forEach((val) => {
|
|
251
|
+
// h = Number(string.substr(11, 2));
|
|
252
|
+
// m = Number(string.substr(14, 2));
|
|
253
|
+
h = Number(string.substring(11, 13));
|
|
254
|
+
m = Number(string.substring(14, 16));
|
|
255
|
+
result[val.value] = h * 60 + m;
|
|
256
|
+
});
|
|
257
|
+
//console.log("date to integer Result ", JSON.stringify(result));
|
|
258
|
+
return result;
|
|
259
|
+
}
|
|
260
|
+
itsProcess(values) {
|
|
261
|
+
//console.log('itsProcess values', JSON.stringify(values));
|
|
262
|
+
const str = values[0].toString();
|
|
263
|
+
return str;
|
|
264
|
+
}
|
|
265
|
+
stiProcess(string, values) {
|
|
266
|
+
const result = {};
|
|
267
|
+
values.forEach((val) => {
|
|
268
|
+
result[val.value] = Number(string);
|
|
269
|
+
});
|
|
270
|
+
//console.log("string to integer Result ", JSON.stringify(result));
|
|
271
|
+
return result;
|
|
272
|
+
}
|
|
273
|
+
bsvProcess(values) {
|
|
274
|
+
const startValue = values[0];
|
|
275
|
+
const pos1 = values[1];
|
|
276
|
+
const pos2 = pos1 + 1;
|
|
277
|
+
const binaryStr = parseInt(startValue, 10)
|
|
278
|
+
.toString(2)
|
|
279
|
+
.padStart(4, '0');
|
|
280
|
+
return binaryStr.substring(pos1, pos2);
|
|
281
|
+
}
|
|
282
|
+
bsvRevert(string, values, bssObj) {
|
|
283
|
+
if (Object.prototype.hasOwnProperty.call(bssObj, values[0].value)) {
|
|
284
|
+
bssObj[values[0].value] = this.replaceCharAt(bssObj[values[0].value], values[1].value, string);
|
|
285
|
+
}
|
|
286
|
+
else {
|
|
287
|
+
bssObj[values[0].value] = '0000';
|
|
288
|
+
bssObj[values[0].value] = this.replaceCharAt(bssObj[values[0].value], values[1].value, string);
|
|
289
|
+
}
|
|
290
|
+
return bssObj;
|
|
291
|
+
}
|
|
292
|
+
stcProcess(value) {
|
|
293
|
+
const initArray = value.split('');
|
|
294
|
+
const resultArray = [];
|
|
295
|
+
initArray.forEach((v) => {
|
|
296
|
+
resultArray.push(v.charCodeAt(0));
|
|
297
|
+
});
|
|
298
|
+
return resultArray;
|
|
299
|
+
}
|
|
300
|
+
ctsProcess(values) {
|
|
301
|
+
// let result: string = "";
|
|
302
|
+
const ary = [];
|
|
303
|
+
values.forEach((v) => {
|
|
304
|
+
if (v >= 0) {
|
|
305
|
+
ary.push(v);
|
|
306
|
+
}
|
|
307
|
+
else {
|
|
308
|
+
ary.push(0);
|
|
309
|
+
}
|
|
310
|
+
});
|
|
311
|
+
//console.log("CTS PROCESS INPUT VALUES ", values);
|
|
312
|
+
let str = String.fromCharCode(...ary);
|
|
313
|
+
// eslint-disable-next-line no-control-regex
|
|
314
|
+
str = str.replace(/[\u0000]/g, '');
|
|
315
|
+
//str = str.replace(/[^\x20-\x7E]/g, "");
|
|
316
|
+
return str;
|
|
317
|
+
}
|
|
318
|
+
ctsRevert(otherObj, results) {
|
|
319
|
+
const valAry = this.stcProcess(otherObj.value);
|
|
320
|
+
//console.log("VAL ARRAY", valAry);
|
|
321
|
+
//console.log("PROCESS DATA", JSON.stringify(otherObj.processData));
|
|
322
|
+
let progress = 0;
|
|
323
|
+
otherObj.processData[0].data.forEach((process) => {
|
|
324
|
+
const res = {};
|
|
325
|
+
if (valAry.length >= progress) {
|
|
326
|
+
res[process.value] = valAry[progress];
|
|
327
|
+
}
|
|
328
|
+
else {
|
|
329
|
+
res[process.value] = 0;
|
|
330
|
+
}
|
|
331
|
+
results = Object.assign(results, res);
|
|
332
|
+
++progress;
|
|
333
|
+
});
|
|
334
|
+
return results;
|
|
335
|
+
}
|
|
336
|
+
binaryStrToDecimal(str) {
|
|
337
|
+
return parseInt(str, 2);
|
|
338
|
+
}
|
|
339
|
+
replaceCharAt(string, index, char) {
|
|
340
|
+
return (string.substring(0, index) + char + string.substring(index + char.length));
|
|
341
|
+
//return string.substr(0, index) + char + string.substr(index + char.length);
|
|
342
|
+
}
|
|
343
|
+
writeFormValuesToRawObj(formValues, rawObj) {
|
|
344
|
+
// rawObj.forEach((raw) => {
|
|
345
|
+
// if (formValues.hasOwnProperty(raw.name)) {
|
|
346
|
+
// raw.value = Math.round(formValues[raw.name] / raw.multi);
|
|
347
|
+
// }
|
|
348
|
+
// });
|
|
349
|
+
for (let i = 0; i < rawObj.length; i++) {
|
|
350
|
+
if (Object.prototype.hasOwnProperty.call(formValues, rawObj[i].name)) {
|
|
351
|
+
rawObj[i].value = Math.round(formValues[rawObj[i].name] / rawObj[i].multi);
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
return rawObj;
|
|
355
|
+
}
|
|
356
|
+
getPwd(rawValues) {
|
|
357
|
+
const pwdArray = [];
|
|
358
|
+
let i;
|
|
359
|
+
let name;
|
|
360
|
+
for (i = 0; i < 16; i++) {
|
|
361
|
+
if (i < 10) {
|
|
362
|
+
name = 'pass_0' + i;
|
|
363
|
+
}
|
|
364
|
+
else {
|
|
365
|
+
name = 'pass_' + i;
|
|
366
|
+
}
|
|
367
|
+
rawValues.forEach((v) => {
|
|
368
|
+
if (v.name == name) {
|
|
369
|
+
pwdArray.push(v.value);
|
|
370
|
+
}
|
|
371
|
+
});
|
|
372
|
+
}
|
|
373
|
+
return pwdArray;
|
|
374
|
+
}
|
|
375
|
+
strToPwd(string) {
|
|
376
|
+
const pwdArray = [];
|
|
377
|
+
let i;
|
|
378
|
+
if (string == null) {
|
|
379
|
+
string = '';
|
|
380
|
+
}
|
|
381
|
+
for (i = 0; i < 16; i++) {
|
|
382
|
+
if (i < string.length) {
|
|
383
|
+
pwdArray.push(string.charCodeAt(i));
|
|
384
|
+
}
|
|
385
|
+
else {
|
|
386
|
+
pwdArray.push(0);
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
return pwdArray;
|
|
390
|
+
}
|
|
391
|
+
chkPwd(arr1, arr2) {
|
|
392
|
+
if (!Array.isArray(arr1) ||
|
|
393
|
+
!Array.isArray(arr2) ||
|
|
394
|
+
arr1.length !== arr2.length)
|
|
395
|
+
return false;
|
|
396
|
+
for (let i = 0; i < arr1.length; i++) {
|
|
397
|
+
if (arr1[i] !== arr2[i])
|
|
398
|
+
return false;
|
|
399
|
+
}
|
|
400
|
+
return true;
|
|
401
|
+
}
|
|
402
|
+
writePwdToConfig(passArray, rawObj) {
|
|
403
|
+
let i;
|
|
404
|
+
let name;
|
|
405
|
+
//console.log("Before write password ", JSON.stringify(rawObj));
|
|
406
|
+
for (i = 0; i < 16; i++) {
|
|
407
|
+
if (i < 10) {
|
|
408
|
+
name = 'pass_0' + i;
|
|
409
|
+
}
|
|
410
|
+
else {
|
|
411
|
+
name = 'pass_' + i;
|
|
412
|
+
}
|
|
413
|
+
rawObj.forEach((v) => {
|
|
414
|
+
if (v.name == name) {
|
|
415
|
+
v.value = passArray[i];
|
|
416
|
+
}
|
|
417
|
+
});
|
|
418
|
+
}
|
|
419
|
+
//console.log("After write password ", JSON.stringify(rawObj));
|
|
420
|
+
return rawObj;
|
|
421
|
+
}
|
|
422
|
+
displayTime(hours, mins) {
|
|
423
|
+
//console.log("hours = ", hours, " mins = ", mins);
|
|
424
|
+
let m = mins;
|
|
425
|
+
let p = 'am';
|
|
426
|
+
if (mins < 10) {
|
|
427
|
+
m = '0' + mins;
|
|
428
|
+
}
|
|
429
|
+
if (hours > 11) {
|
|
430
|
+
p = 'pm';
|
|
431
|
+
}
|
|
432
|
+
if (hours == 0) {
|
|
433
|
+
hours = 12;
|
|
434
|
+
}
|
|
435
|
+
if (hours > 12) {
|
|
436
|
+
hours -= 12;
|
|
437
|
+
}
|
|
438
|
+
return hours + ':' + m + ' ' + p;
|
|
439
|
+
}
|
|
440
|
+
getChunkValues(processData, rawData, otherData) {
|
|
441
|
+
// console.log(
|
|
442
|
+
// 'GET CHUNK VALUES ',
|
|
443
|
+
// JSON.stringify(rawData),
|
|
444
|
+
// ' ',
|
|
445
|
+
// JSON.stringify(otherData)
|
|
446
|
+
// );
|
|
447
|
+
let v;
|
|
448
|
+
const values = [];
|
|
449
|
+
processData.forEach((chunk) => {
|
|
450
|
+
//console.log('Process Raw chunk ', JSON.stringify(chunk));
|
|
451
|
+
switch (chunk.fromData) {
|
|
452
|
+
case 'raw':
|
|
453
|
+
rawData.forEach((rd) => {
|
|
454
|
+
if (rd.name == chunk.value) {
|
|
455
|
+
//console.log('RAW chunk name: ', rd.name);
|
|
456
|
+
v = rd.value;
|
|
457
|
+
}
|
|
458
|
+
});
|
|
459
|
+
break;
|
|
460
|
+
case 'other':
|
|
461
|
+
otherData.forEach((od) => {
|
|
462
|
+
if (od.name == chunk.value) {
|
|
463
|
+
v = od.value;
|
|
464
|
+
}
|
|
465
|
+
});
|
|
466
|
+
break;
|
|
467
|
+
case 'no':
|
|
468
|
+
v = chunk.value;
|
|
469
|
+
break;
|
|
470
|
+
}
|
|
471
|
+
if (typeof chunk.strLength === 'undefined') {
|
|
472
|
+
values.push(v);
|
|
473
|
+
}
|
|
474
|
+
else {
|
|
475
|
+
const pad = v.toString().padStart(chunk.strLength, '0');
|
|
476
|
+
values.push(pad);
|
|
477
|
+
}
|
|
478
|
+
});
|
|
479
|
+
return values;
|
|
480
|
+
}
|
|
481
|
+
uint8ArrayToArray(uint8) {
|
|
482
|
+
return Array.from(uint8);
|
|
483
|
+
}
|
|
484
|
+
arrayToUint8Array(array) {
|
|
485
|
+
return Uint8Array.from(array);
|
|
486
|
+
}
|
|
487
|
+
isUint8Array(v) {
|
|
488
|
+
const isStr = Object.prototype.toString;
|
|
489
|
+
return isStr.call(v) === '[object Uint8Array]';
|
|
490
|
+
}
|
|
491
|
+
processRaw(input, configObj) {
|
|
492
|
+
let buffer;
|
|
493
|
+
if (this.isUint8Array(input)) {
|
|
494
|
+
buffer = input;
|
|
495
|
+
}
|
|
496
|
+
else {
|
|
497
|
+
buffer = this.arrayToUint8Array(input);
|
|
498
|
+
}
|
|
499
|
+
const rawDataBuffer = new DataView(buffer.buffer, 0, 254);
|
|
500
|
+
//console.log('PROCESS RAW CONFIG ', rawDataBuffer);
|
|
501
|
+
configObj.rawData.forEach((datapoint) => {
|
|
502
|
+
datapoint.value =
|
|
503
|
+
this.getValuefromBuffer(datapoint.buffer, rawDataBuffer) *
|
|
504
|
+
datapoint.multi;
|
|
505
|
+
});
|
|
506
|
+
}
|
|
507
|
+
processOther(configObj) {
|
|
508
|
+
configObj.otherData.forEach((dataPoint) => {
|
|
509
|
+
dataPoint.processData.forEach((process) => {
|
|
510
|
+
this.runProcess(process, configObj.rawData, configObj.otherData);
|
|
511
|
+
dataPoint.value = process.value;
|
|
512
|
+
});
|
|
513
|
+
});
|
|
514
|
+
}
|
|
515
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DatasetProcessingService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
516
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DatasetProcessingService, providedIn: 'root' }); }
|
|
517
|
+
}
|
|
518
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DatasetProcessingService, decorators: [{
|
|
519
|
+
type: Injectable,
|
|
520
|
+
args: [{
|
|
521
|
+
providedIn: 'root',
|
|
522
|
+
}]
|
|
523
|
+
}] });
|
|
524
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YXNldC1wcm9jZXNzaW5nLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9kZXZpY2UtY29uZmlnLWludGVyYWN0aW9uL3NyYy9saWIvZGF0YXNldC1wcm9jZXNzaW5nLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7QUFjM0MsTUFBTSxPQUFPLHdCQUF3QjtJQUNuQyxrQkFBa0I7SUFDbEI7OztPQUdHO0lBQ0gsa0JBQWtCLENBQUMsR0FBZSxFQUFFLE1BQWdCO1FBQ2xELElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQztRQUNkLElBQUksR0FBRyxDQUFDLE1BQU0sRUFBRTtZQUNkLFFBQVEsR0FBRyxDQUFDLE1BQU0sRUFBRTtnQkFDbEIsS0FBSyxDQUFDO29CQUNKLEtBQUssR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztvQkFDckMsTUFBTTtnQkFDUixLQUFLLEVBQUU7b0JBQ0wsS0FBSyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7b0JBQ2xELE1BQU07Z0JBQ1IsS0FBSyxFQUFFO29CQUNMLEtBQUssR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO29CQUNsRCxNQUFNO2FBQ1Q7U0FDRjthQUFNO1lBQ0wsUUFBUSxHQUFHLENBQUMsTUFBTSxFQUFFO2dCQUNsQixLQUFLLENBQUM7b0JBQ0osS0FBSyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO29CQUN0QyxNQUFNO2dCQUNSLEtBQUssRUFBRTtvQkFDTCxLQUFLLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxH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Q0wsTUFBTSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFpQixDQUFDLENBQUM7U0FDcEQ7UUFDRCxNQUFNLGFBQWEsR0FBRyxJQUFJLFFBQVEsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUMxRCxvREFBb0Q7UUFDcEQsU0FBUyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRTtZQUN0QyxTQUFTLENBQUMsS0FBSztnQkFDYixJQUFJLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxhQUFhLENBQUM7b0JBQ3hELFNBQVMsQ0FBQyxLQUFLLENBQUM7UUFDcEIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsWUFBWSxDQUFDLFNBQTZCO1FBQ3hDLFNBQVMsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUU7WUFDeEMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtnQkFDeEMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQ2pFLFNBQVMsQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQztZQUNsQyxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzsrR0F6a0JVLHdCQUF3QjttSEFBeEIsd0JBQXdCLGNBRnZCLE1BQU07OzRGQUVQLHdCQUF3QjtrQkFIcEMsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBJQnVmZmVyT2JqLFxuICBJUHJvY2Vzc0RhdGFPYmosXG4gIElQcm9jZXNzRGF0YVN0ZXAsXG4gIElSYXdEYXRhT2JqLFxuICBJT3RoZXJEYXRhT2JqLFxuICBJQ29uZmlnLFxuICBJRGlzcGxheSxcbn0gZnJvbSAnLi4vbGliL2ludGVyZmFjZXMvZGV2aWNlcy1saXN0JztcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIERhdGFzZXRQcm9jZXNzaW5nU2VydmljZSB7XG4gIC8vY29uc3RydWN0b3IoKSB7fVxuICAvKlxuICAgKiBGb3IgdXNlIHdpdGggRGF0YVZpZXdcbiAgICpcbiAgICovXG4gIGdldFZhbHVlZnJvbUJ1ZmZlcihvYmo6IElCdWZmZXJPYmosIGJ1ZmZlcjogRGF0YVZpZXcpIHtcbiAgICBsZXQgdmFsdWUgPSAwO1xuICAgIGlmIChvYmouc2lnbmVkKSB7XG4gICAgICBzd2l0Y2ggKG9iai5sZW5ndGgpIHtcbiAgICAgICAgY2FzZSA4OlxuICAgICAgICAgIHZhbHVlID0gYnVmZmVyLmdldEludDgob2JqLnBvc2l0aW9uKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAxNjpcbiAgICAgICAgICB2YWx1ZSA9IGJ1ZmZlci5nZXRJbnQxNihvYmoucG9zaXRpb24sIG9iai5saXR0bGUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDMyOlxuICAgICAgICAgIHZhbHVlID0gYnVmZmVyLmdldEludDMyKG9iai5wb3NpdGlvbiwgb2JqLmxpdHRsZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHN3aXRjaCAob2JqLmxlbmd0aCkge1xuICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgdmFsdWUgPSBidWZmZXIuZ2V0VWludDgob2JqLnBvc2l0aW9uKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAxNjpcbiAgICAgICAgICB2YWx1ZSA9IGJ1ZmZlci5nZXRVaW50MTYob2JqLnBvc2l0aW9uLCBvYmoubGl0dGxlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAzMjpcbiAgICAgICAgICB2YWx1ZSA9IGJ1ZmZlci5nZXRVaW50MzIob2JqLnBvc2l0aW9uLCBvYmoubGl0dGxlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgLypcbiAgICogRm9yIHVzZSB3aXRoIERhdGFWaWV3XG4gICAqXG4gICAqXG4gICAqL1xuICB3cml0ZVZhbHVlVG9CdWZmZXIob2JqOiBJQnVmZmVyT2JqLCB2YWx1ZTogbnVtYmVyLCBidWZmZXI6IERhdGFWaWV3KSB7XG4gICAgaWYgKG9iai5zaWduZWQpIHtcbiAgICAgIHN3aXRjaCAob2JqLmxlbmd0aCkge1xuICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgYnVmZmVyLnNldEludDgob2JqLnBvc2l0aW9uLCB2YWx1ZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMTY6XG4gICAgICAgICAgYnVmZmVyLnNldEludDE2KG9iai5wb3NpdGlvbiwgdmFsdWUsIG9iai5saXR0bGUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDMyOlxuICAgICAgICAgIGJ1ZmZlci5zZXRJbnQzMihvYmoucG9zaXRpb24sIHZhbHVlLCBvYmoubGl0dGxlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgc3dpdGNoIChvYmoubGVuZ3RoKSB7XG4gICAgICAgIGNhc2UgODpcbiAgICAgICAgICBidWZmZXIuc2V0VWludDgob2JqLnBvc2l0aW9uLCB2YWx1ZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMTY6XG4gICAgICAgICAgYnVmZmVyLnNldFVpbnQxNihvYmoucG9zaXRpb24sIHZhbHVlLCBvYmoubGl0dGxlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAzMjpcbiAgICAgICAgICBidWZmZXIuc2V0VWludDMyKG9iai5wb3NpdGlvbiwgdmFsdWUsIG9iai5saXR0bGUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJ1blByb2Nlc3MoXG4gICAgcHJvY2VzczogSVByb2Nlc3NEYXRhT2JqLFxuICAgIHJhd0RhdGE6IElSYXdEYXRhT2JqW10sXG4gICAgb3RoZXJEYXRhOiBJT3RoZXJEYXRhT2JqW11cbiAgKSB7XG4gICAgY29uc3QgdmFsdWVzOiAoc3RyaW5nIHwgbnVtYmVyKVtdID0gdGhpcy5nZXRDaHVua1ZhbHVlcyhcbiAgICAgIHByb2Nlc3MuZGF0YSxcbiAgICAgIHJhd0RhdGEsXG4gICAgICBvdGhlckRhdGFcbiAgICApO1xuICAgIC8vY29uc29sZS5sb2coJ3Byb2Nlc3MgdmFsdWVzICcsIHZhbHVlcyk7XG4gICAgbGV0IHBWYWw6IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gPSAwO1xuICAgIHN3aXRjaCAocHJvY2Vzcy50eXBlKSB7XG4gICAgICBjYXNlICdhc3MnOlxuICAgICAgICBwVmFsID0gdGhpcy5hc3NlbWJsZVByb2Nlc3ModmFsdWVzKTtcbiAgICAgICAgcHJvY2Vzcy52YWx1ZSA9IHBWYWw7XG4gICAgICAgIHJldHVybjtcbiAgICAgIGNhc2UgJ2NvbSc6XG4gICAgICAgIHBWYWwgPSB0aGlzLmNvbXBhcmVQcm9jZXNzKFxuICAgICAgICAgIHZhbHVlcyBhcyBbbnVtYmVyLCAnPCcgfCAnPD0nIHwgJz09JyB8ICc+PScgfCAnPicsIG51bWJlcl0sXG4gICAgICAgICAgcHJvY2Vzc1xuICAgICAgICApO1xuICAgICAgICBwcm9jZXNzLnZhbHVlID0gcFZhbDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgY2FzZSAnY2FsJzpcbiAgICAgICAgcFZhbCA9IHRoaXMuY2FsY3VsYXRlUHJvY2VzcyhcbiAgICAgICAgICB2YWx1ZXMgYXMgW251bWJlciwgJysnIHwgJy0nIHwgJy8nIHwgJyonLCBudW1iZXJdXG4gICAgICAgICk7XG4gICAgICAgIHByb2Nlc3MudmFsdWUgPSBwVmFsO1xuICAgICAgICByZXR1cm47XG4gICAgICBjYXNlICd0Zm0nOlxuICAgICAgICBwVmFsID0gdGhpcy50Zm1Qcm9jZXNzKHZhbHVlcyBhcyBudW1iZXJbXSk7XG4gICAgICAgIHByb2Nlc3MudmFsdWUgPSBwVmFsO1xuICAgICAgICByZXR1cm47XG4gICAgICBjYXNlICdjZHQnOlxuICAgICAgICBwVmFsID0gdGhpcy5jZHRQcm9jZXNzKHZhbHVlcyBhcyBzdHJpbmdbXSk7XG4gICAgICAgIHByb2Nlc3MudmFsdWUgPSBwVmFsO1xuICAgICAgICByZXR1cm47XG4gICAgICBjYXNlICdpdGQnOlxuICAgICAgICBwVmFsID0gdGhpcy5pdGRQcm9jZXNzKHZhbHVlcyBhcyBudW1iZXJbXSk7XG4gICAgICAgIHByb2Nlc3MudmFsdWUgPSBwVmFsO1xuICAgICAgICByZXR1cm47XG4gICAgICBjYXNlICdpdHMnOlxuICAgICAgICBwVmFsID0gdGhpcy5pdHNQcm9jZXNzKHZhbHVlcyBhcyBudW1iZXJbXSk7XG4gICAgICAgIHByb2Nlc3MudmFsdWUgPSBwVmFsO1xuICAgICAgICByZXR1cm47XG4gICAgICBjYXNlICdic3YnOlxuICAgICAgICBwVmFsID0gdGhpcy5ic3ZQcm9jZXNzKHZhbHVlcyk7XG4gICAgICAgIHByb2Nlc3MudmFsdWUgPSBwVmFsO1xuICAgICAgICByZXR1cm47XG4gICAgICBjYXNlICd2ZmEnOlxuICAgICAgICBwVmFsID0gdGhpcy52ZmFQcm9jZXNzKHZhbHVlcyBhcyBudW1iZXJbXSwgcHJvY2Vzcyk7XG4gICAgICAgIHByb2Nlc3MudmFsdWUgPSBwVmFsO1xuICAgICAgICByZXR1cm47XG4gICAgICBjYXNlICdjdHMnOlxuICAgICAgICBwVmFsID0gdGhpcy5jdHNQcm9jZXNzKHZhbHVlcyBhcyBudW1iZXJbXSk7XG4gICAgICAgIHByb2Nlc3MudmFsdWUgPSBwVmFsO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgYXNzZW1ibGVQcm9jZXNzKHZhbHVlczogKHN0cmluZyB8IG51bWJlcilbXSkge1xuICAgIGxldCByZXN1bHQgPSAnJztcbiAgICB2YWx1ZXMuZm9yRWFjaCgodikgPT4ge1xuICAgICAgcmVzdWx0ICs9IHY7XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGRpc2Fzc2VtYmxlUHJvY2VzcyhzdHJpbmc6IHN0cmluZywgdmFsdWVzOiBJUHJvY2Vzc0RhdGFTdGVwW10pIHtcbiAgICBjb25zdCByZXN1bHQ6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0gPSB7fTtcbiAgICBsZXQgaSA9IDA7XG4gICAgbGV0IGxlbmd0aCA9IDA7XG4gICAgdmFsdWVzLmZvckVhY2goKHZhbCkgPT4ge1xuICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh2YWwsICdzdHJMZW5ndGgnKSkge1xuICAgICAgICBsZW5ndGggPSB2YWwuc3RyTGVuZ3RoIGFzIG51bWJlcjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHN0ciA9IHZhbC52YWx1ZSBhcyBzdHJpbmc7XG4gICAgICAgIGxlbmd0aCA9IHN0ci5sZW5ndGg7XG4gICAgICB9XG4gICAgICBpZiAodmFsLmZyb21EYXRhID09ICdyYXcnKSB7XG4gICAgICAgIHJlc3VsdFt2YWwudmFsdWVdID0gTnVtYmVyKHN0cmluZy5zdWJzdHJpbmcoaSwgaSArIGxlbmd0aCkpO1xuICAgICAgfVxuICAgICAgaSA9IGkgKyBsZW5ndGg7XG4gICAgfSk7XG4gICAgLy9jb25zb2xlLmxvZygnRGlzYXNzZW1ibGUgUmVzdWx0ICcsIEpTT04uc3RyaW5naWZ5KHJlc3VsdCkpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBjb21wYXJlUHJvY2VzcyhcbiAgICB2YWx1ZXM6IFtudW1iZXIsICc8JyB8ICc8PScgfCAnPT0nIHwgJz49JyB8ICc+JywgbnVtYmVyXSxcbiAgICBwcm9jZXNzOiBJUHJvY2Vzc0RhdGFPYmpcbiAgKSB7XG4gICAgY29uc3QgcmVzdWx0OiBib29sZWFuID0gdGhpcy5jb21wYXJlVmFsdWVzKHZhbHVlc1swXSwgdmFsdWVzWzFdLCB2YWx1ZXNbMl0pO1xuICAgIGxldCB0ZXh0ID0gJ04vQSc7XG4gICAgaWYgKCdjb21UeHQnIGluIHByb2Nlc3MpIHtcbiAgICAgIGlmIChwcm9jZXNzLmNvbVR4dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICB0ZXh0ID0gcHJvY2Vzcy5jb21UeHRbMF07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHByb2Nlc3MuY29tVHh0WzFdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0ZXh0O1xuICB9XG5cbiAgY29tcGFyZVZhbHVlcyh2MTogbnVtYmVyLCBvcDogJzwnIHwgJzw9JyB8ICc9PScgfCAnPj0nIHwgJz4nLCB2MjogbnVtYmVyKSB7XG4gICAgc3dpdGNoIChvcCkge1xuICAgICAgY2FzZSAnPCc6XG4gICAgICAgIHJldHVybiB2MSA8IHYyO1xuICAgICAgY2FzZSAnPD0nOlxuICAgICAgICByZXR1cm4gdjEgPD0gdjI7XG4gICAgICBjYXNlICc9PSc6XG4gICAgICAgIHJldHVybiB2MSA9PSB2MjtcbiAgICAgIGNhc2UgJz49JzpcbiAgICAgICAgcmV0dXJuIHYxID49IHYyO1xuICAgICAgY2FzZSAnPic6XG4gICAgICAgIHJldHVybiB2MSA+IHYyO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGNhbGN1bGF0ZVByb2Nlc3ModmFsdWVzOiBbbnVtYmVyLCAnKycgfCAnLScgfCAnLycgfCAnKicsIG51bWJlcl0pIHtcbiAgICByZXR1cm4gdGhpcy5jYWxjdWxhdGVWYWx1ZXModmFsdWVzWzBdLCB2YWx1ZXNbMV0sIHZhbHVlc1syXSk7XG4gIH1cblxuICBjYWxjdWxhdGVWYWx1ZXModjE6IG51bWJlciwgb3A6ICcrJyB8ICctJyB8ICcvJyB8ICcqJywgdjI6IG51bWJlcikge1xuICAgIHN3aXRjaCAob3ApIHtcbiAgICAgIGNhc2UgJysnOlxuICAgICAgICByZXR1cm4gdjEgKyB2MjtcbiAgICAgIGNhc2UgJy0nOlxuICAgICAgICByZXR1cm4gdjEgLSB2MjtcbiAgICAgIGNhc2UgJy8nOlxuICAgICAgICByZXR1cm4gdjEgLyB2MjtcbiAgICAgIGNhc2UgJyonOlxuICAgICAgICByZXR1cm4gdjEgKiB2MjtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgfVxuXG4gIHRmbVByb2Nlc3ModmFsdWVzOiBudW1iZXJbXSkge1xuICAgIGNvbnN0IGhvdXJzOiBudW1iZXIgPSBNYXRoLmZsb29yKCh2YWx1ZXNbMF0gKiA2MCkgLyAzNjAwKTtcbiAgICBjb25zdCBtaW5zOiBudW1iZXIgPSBNYXRoLmZsb29yKCh2YWx1ZXNbMF0gKiA2MCAtIGhvdXJzICogMzYwMCkgLyA2MCk7XG4gICAgcmV0dXJuIHRoaXMuZGlzcGxheVRpbWUoaG91cnMsIG1pbnMpO1xuICB9XG5cbiAgY2R0UHJvY2Vzcyh2YWx1ZXM6IHN0cmluZ1tdKSB7XG4gICAgY29uc3QgaG91cnM6IG51bWJlciA9IHBhcnNlSW50KHZhbHVlc1swXS5zdWJzdHJpbmcoMTEsIDEzKSk7XG4gICAgY29uc3QgbWluczogbnVtYmVyID0gcGFyc2VJbnQodmFsdWVzWzBdLnN1YnN0cmluZygxNCwgMTYpKTtcbiAgICByZXR1cm4gdGhpcy5kaXNwbGF5VGltZShob3VycywgbWlucyk7XG4gIH1cblxuICAvL05ldyBwcm9jZXNzIHRvIHBpY2sgdmFsdWUgZnJvbSBhcnJheSBiYXNlZCBvbiBpbnRlcmdlciB2YWx1ZVxuICB2ZmFQcm9jZXNzKHZhbHVlczogbnVtYmVyW10sIHByb2Nlc3M6IElQcm9jZXNzRGF0YU9iaikge1xuICAgIGNvbnN0IHZhbHVlID0gdmFsdWVzWzBdO1xuICAgIGlmIChwcm9jZXNzLnZhbHVlc0xpc3QgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKHZhbHVlIDwgcHJvY2Vzcy52YWx1ZXNMaXN0Lmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gcHJvY2Vzcy52YWx1ZXNMaXN0W3ZhbHVlXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiAnbmlwJztcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuICduL2EnO1xuICAgIH1cbiAgfVxuXG4gIGl0ZFByb2Nlc3ModmFsdWVzOiBudW1iZXJbXSkge1xuICAgIGxldCBob3VyczogbnVtYmVyID0gTWF0aC5mbG9vcigodmFsdWVzWzBdICogNjApIC8gMzYwMCk7XG4gICAgLy9jb25zb2xlLmxvZyhcImhvdXJzIFwiLCBob3Vycyk7XG4gICAgY29uc3QgbWluczogbnVtYmVyID0gTWF0aC5mbG9vcigodmFsdWVzWzBdICogNjAgLSBob3VycyAqIDM2MDApIC8gNjApO1xuICAgIC8vY29uc29sZS5sb2coXCJtaW5zIFwiLCBtaW5zKTtcbiAgICBsZXQgaDogbnVtYmVyIHwgc3RyaW5nO1xuICAgIGxldCBtOiBudW1iZXIgfCBzdHJpbmc7XG4gICAgaWYgKGhvdXJzID4gMjMpIHtcbiAgICAgIGhvdXJzID0gaG91cnMgLSAyNDtcbiAgICB9XG4gICAgaWYgKGhvdXJzIDwgMTApIHtcbiAgICAgIGggPSAnMCcgKyBob3VycztcbiAgICB9IGVsc2Uge1xuICAgICAgaCA9IGhvdXJzO1xuICAgIH1cbiAgICBpZiAobWlucyA8IDEwKSB7XG4gICAgICBtID0gJzAnICsgbWlucztcbiAgICB9IGVsc2Uge1xuICAgICAgbSA9IG1pbnM7XG4gICAgfVxuICAgIGNvbnN0IHN0cmluZzogc3RyaW5nID0gJzAwMDAtMDAtMDBUJyArIGggKyAnOicgKyBtO1xuICAgIC8vY29uc29sZS5sb2coXCIkJV4mJl4lJSQkJV4mJiZeJSUlJV5eXiYmJl5eJV4lJSVeXl4mIGR0IHN0cmluZyBcIiwgc3RyaW5nKTtcbiAgICByZXR1cm4gc3RyaW5nO1xuICB9XG5cbiAgZHRpUHJvY2VzcyhzdHJpbmc6IHN0cmluZywgdmFsdWVzOiBJUHJvY2Vzc0RhdGFTdGVwW10pIHtcbiAgICAvL2NvbnNvbGUubG9nKFwiZHRpUHJvY2VzcyBpbnB1dHMgc3RyaW5nOiBcIiwgc3RyaW5nLCBcIiBWYWx1ZXM6IFwiLCB2YWx1ZXMpO1xuICAgIGNvbnN0IHJlc3VsdDogeyBba2V5OiBzdHJpbmcgfCBudW1iZXJdOiBudW1iZXIgfSA9IHt9O1xuICAgIGxldCBoOiBudW1iZXI7XG4gICAgbGV0IG06IG51bWJlcjtcbiAgICB2YWx1ZXMuZm9yRWFjaCgodmFsKSA9PiB7XG4gICAgICAvLyBoID0gTnVtYmVyKHN0cmluZy5zdWJzdHIoMTEsIDIpKTtcbiAgICAgIC8vIG0gPSBOdW1iZXIoc3RyaW5nLnN1YnN0cigxNCwgMikpO1xuICAgICAgaCA9IE51bWJlcihzdHJpbmcuc3Vic3RyaW5nKDExLCAxMykpO1xuICAgICAgbSA9IE51bWJlcihzdHJpbmcuc3Vic3RyaW5nKDE0LCAxNikpO1xuICAgICAgcmVzdWx0W3ZhbC52YWx1ZV0gPSBoICogNjAgKyBtO1xuICAgIH0pO1xuICAgIC8vY29uc29sZS5sb2coXCJkYXRlIHRvIGludGVnZXIgUmVzdWx0IFwiLCBKU09OLnN0cmluZ2lmeShyZXN1bHQpKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgaXRzUHJvY2Vzcyh2YWx1ZXM6IG51bWJlcltdKSB7XG4gICAgLy9jb25zb2xlLmxvZygnaXRzUHJvY2VzcyB2YWx1ZXMnLCBKU09OLnN0cmluZ2lmeSh2YWx1ZXMpKTtcbiAgICBjb25zdCBzdHI6IHN0cmluZyA9IHZhbHVlc1swXS50b1N0cmluZygpO1xuICAgIHJldHVybiBzdHI7XG4gIH1cblxuICBzdGlQcm9jZXNzKHN0cmluZzogc3RyaW5nLCB2YWx1ZXM6IElQcm9jZXNzRGF0YVN0ZXBbXSkge1xuICAgIGNvbnN0IHJlc3VsdDogeyBba2V5OiBzdHJpbmcgfCBudW1iZXJdOiBudW1iZXIgfSA9IHt9O1xuICAgIHZhbHVlcy5mb3JFYWNoKCh2YWwpID0+IHtcbiAgICAgIHJlc3VsdFt2YWwudmFsdWVdID0gTnVtYmVyKHN0cmluZyk7XG4gICAgfSk7XG4gICAgLy9jb25zb2xlLmxvZyhcInN0cmluZyB0byBpbnRlZ2VyIFJlc3VsdCBcIiwgSlNPTi5zdHJpbmdpZnkocmVzdWx0KSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGJzdlByb2Nlc3ModmFsdWVzOiAobnVtYmVyIHwgc3RyaW5nKVtdKSB7XG4gICAgY29uc3Qgc3RhcnRWYWx1ZTogc3RyaW5nID0gdmFsdWVzWzBdIGFzIHN0cmluZztcbiAgICBjb25zdCBwb3MxOiBudW1iZXIgPSB2YWx1ZXNbMV0gYXMgbnVtYmVyO1xuICAgIGNvbnN0IHBvczI6IG51bWJlciA9IHBvczEgKyAxO1xuICAgIGNvbnN0IGJpbmFyeVN0cjogc3RyaW5nID0gcGFyc2VJbnQoc3RhcnRWYWx1ZSwgMTApXG4gICAgICAudG9TdHJpbmcoMilcbiAgICAgIC5wYWRTdGFydCg0LCAnMCcpO1xuICAgIHJldHVybiBiaW5hcnlTdHIuc3Vic3RyaW5nKHBvczEsIHBvczIpO1xuICB9XG5cbiAgYnN2UmV2ZXJ0KFxuICAgIHN0cmluZzogc3RyaW5nLFxuICAgIHZhbHVlczogSVByb2Nlc3NEYXRhU3RlcFtdLFxuICAgIGJzc09iajogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfCBudW1iZXIgfVxuICApIHtcbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGJzc09iaiwgdmFsdWVzWzBdLnZhbHVlKSkge1xuICAgICAgYnNzT2JqW3ZhbHVlc1swXS52YWx1ZV0gPSB0aGlzLnJlcGxhY2VDaGFyQXQoXG4gICAgICAgIGJzc09ialt2YWx1ZXNbMF0udmFsdWVdIGFzIHN0cmluZyxcbiAgICAgICAgdmFsdWVzWzFdLnZhbHVlIGFzIG51bWJlcixcbiAgICAgICAgc3RyaW5nXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBic3NPYmpbdmFsdWVzWzBdLnZhbHVlXSA9ICcwMDAwJztcbiAgICAgIGJzc09ialt2YWx1ZXNbMF0udmFsdWVdID0gdGhpcy5yZXBsYWNlQ2hhckF0KFxuICAgICAgICBic3NPYmpbdmFsdWVzWzBdLnZhbHVlXSBhcyBzdHJpbmcsXG4gICAgICAgIHZhbHVlc1sxXS52YWx1ZSBhcyBudW1iZXIsXG4gICAgICAgIHN0cmluZ1xuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGJzc09iajtcbiAgfVxuXG4gIHN0Y1Byb2Nlc3ModmFsdWU6IHN0cmluZykge1xuICAgIGNvbnN0IGluaXRBcnJheSA9IHZhbHVlLnNwbGl0KCcnKTtcbiAgICBjb25zdCByZXN1bHRBcnJheTogbnVtYmVyW10gPSBbXTtcbiAgICBpbml0QXJyYXkuZm9yRWFjaCgodikgPT4ge1xuICAgICAgcmVzdWx0QXJyYXkucHVzaCh2LmNoYXJDb2RlQXQoMCkpO1xuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHRBcnJheTtcbiAgfVxuXG4gIGN0c1Byb2Nlc3ModmFsdWVzOiBudW1iZXJbXSkge1xuICAgIC8vIGxldCByZXN1bHQ6IHN0cmluZyA9IFwiXCI7XG4gICAgY29uc3QgYXJ5OiBudW1iZXJbXSA9IFtdO1xuICAgIHZhbHVlcy5mb3JFYWNoKCh2KSA9PiB7XG4gICAgICBpZiAodiA+PSAwKSB7XG4gICAgICAgIGFyeS5wdXNoKHYpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXJ5LnB1c2goMCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgLy9jb25zb2xlLmxvZyhcIkNUUyBQUk9DRVNTIElOUFVUIFZBTFVFUyBcIiwgdmFsdWVzKTtcbiAgICBsZXQgc3RyID0gU3RyaW5nLmZyb21DaGFyQ29kZSguLi5hcnkpO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb250cm9sLXJlZ2V4XG4gICAgc3RyID0gc3RyLnJlcGxhY2UoL1tcXHUwMDAwXS9nLCAnJyk7XG4gICAgLy9zdHIgPSBzdHIucmVwbGFjZSgvW15cXHgyMC1cXHg3RV0vZywgXCJcIik7XG4gICAgcmV0dXJuIHN0cjtcbiAgfVxuXG4gIGN0c1JldmVydChcbiAgICBvdGhlck9iajogSU90aGVyRGF0YU9iaixcbiAgICByZXN1bHRzOiB7IFtrZXk6IHN0cmluZyB8IG51bWJlcl06IHN0cmluZyB8IG51bWJlciB9XG4gICkge1xuICAgIGNvbnN0IHZhbEFyeSA9IHRoaXMuc3RjUHJvY2Vzcyg8c3RyaW5nPm90aGVyT2JqLnZhbHVlKTtcbiAgICAvL2NvbnNvbGUubG9nKFwiVkFMIEFSUkFZXCIsIHZhbEFyeSk7XG4gICAgLy9jb25zb2xlLmxvZyhcIlBST0NFU1MgREFUQVwiLCBKU09OLnN0cmluZ2lmeShvdGhlck9iai5wcm9jZXNzRGF0YSkpO1xuICAgIGxldCBwcm9ncmVzcyA9IDA7XG4gICAgb3RoZXJPYmoucHJvY2Vzc0RhdGFbMF0uZGF0YS5mb3JFYWNoKChwcm9jZXNzKSA9PiB7XG4gICAgICBjb25zdCByZXM6IHsgW2tleTogc3RyaW5nIHwgbnVtYmVyXTogc3RyaW5nIHwgbnVtYmVyIH0gPSB7fTtcblxuICAgICAgaWYgKHZhbEFyeS5sZW5ndGggPj0gcHJvZ3Jlc3MpIHtcbiAgICAgICAgcmVzW3Byb2Nlc3MudmFsdWVdID0gdmFsQXJ5W3Byb2dyZXNzXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc1twcm9jZXNzLnZhbHVlXSA9IDA7XG4gICAgICB9XG4gICAgICByZXN1bHRzID0gT2JqZWN0LmFzc2lnbihyZXN1bHRzLCByZXMpO1xuICAgICAgKytwcm9ncmVzcztcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfVxuXG4gIGJpbmFyeVN0clRvRGVjaW1hbChzdHI6IHN0cmluZykge1xuICAgIHJldHVybiBwYXJzZUludChzdHIsIDIpO1xuICB9XG5cbiAgcmVwbGFjZUNoYXJBdChzdHJpbmc6IHN0cmluZywgaW5kZXg6IG51bWJlciwgY2hhcjogc3RyaW5nKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHN0cmluZy5zdWJzdHJpbmcoMCwgaW5kZXgpICsgY2hhciArIHN0cmluZy5zdWJzdHJpbmcoaW5kZXggKyBjaGFyLmxlbmd0aClcbiAgICApO1xuICAgIC8vcmV0dXJuIHN0cmluZy5zdWJzdHIoMCwgaW5kZXgpICsgY2hhciArIHN0cmluZy5zdWJzdHIoaW5kZXggKyBjaGFyLmxlbmd0aCk7XG4gIH1cblxuICB3cml0ZUZvcm1WYWx1ZXNUb1Jhd09iaihcbiAgICBmb3JtVmFsdWVzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB8IG51bWJlciB9LFxuICAgIHJhd09iajogSVJhd0RhdGFPYmpbXVxuICApIHtcbiAgICAvLyByYXdPYmouZm9yRWFjaCgocmF3KSA9PiB7XG4gICAgLy8gICBpZiAoZm9ybVZhbHVlcy5oYXNPd25Qcm9wZXJ0eShyYXcubmFtZSkpIHtcbiAgICAvLyAgICAgcmF3LnZhbHVlID0gTWF0aC5yb3VuZChmb3JtVmFsdWVzW3Jhdy5uYW1lXSAvIHJhdy5tdWx0aSk7XG4gICAgLy8gICB9XG4gICAgLy8gfSk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByYXdPYmoubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZm9ybVZhbHVlcywgcmF3T2JqW2ldLm5hbWUpKSB7XG4gICAgICAgIHJhd09ialtpXS52YWx1ZSA9IE1hdGgucm91bmQoXG4gICAgICAgICAgKGZvcm1WYWx1ZXNbcmF3T2JqW2ldLm5hbWVdIGFzIG51bWJlcikgLyByYXdPYmpbaV0ubXVsdGlcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJhd09iajtcbiAgfVxuXG4gIGdldFB3ZChyYXdWYWx1ZXM6IElSYXdEYXRhT2JqW10pIHtcbiAgICBjb25zdCBwd2RBcnJheTogbnVtYmVyW10gPSBbXTtcbiAgICBsZXQgaTogbnVtYmVyO1xuICAgIGxldCBuYW1lOiBzdHJpbmc7XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykge1xuICAgICAgaWYgKGkgPCAxMCkge1xuICAgICAgICBuYW1lID0gJ3Bhc3NfMCcgKyBpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmFtZSA9ICdwYXNzXycgKyBpO1xuICAgICAgfVxuICAgICAgcmF3VmFsdWVzLmZvckVhY2goKHYpID0+IHtcbiAgICAgICAgaWYgKHYubmFtZSA9PSBuYW1lKSB7XG4gICAgICAgICAgcHdkQXJyYXkucHVzaCh2LnZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHB3ZEFycmF5O1xuICB9XG5cbiAgc3RyVG9Qd2Qoc3RyaW5nOiBzdHJpbmcpIHtcbiAgICBjb25zdCBwd2RBcnJheTogbnVtYmVyW10gPSBbXTtcbiAgICBsZXQgaTogbnVtYmVyO1xuXG4gICAgaWYgKHN0cmluZyA9PSBudWxsKSB7XG4gICAgICBzdHJpbmcgPSAnJztcbiAgICB9XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykge1xuICAgICAgaWYgKGkgPCBzdHJpbmcubGVuZ3RoKSB7XG4gICAgICAgIHB3ZEFycmF5LnB1c2goc3RyaW5nLmNoYXJDb2RlQXQoaSkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcHdkQXJyYXkucHVzaCgwKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcHdkQXJyYXk7XG4gIH1cblxuICBjaGtQd2QoYXJyMTogbnVtYmVyW10sIGFycjI6IG51bWJlcltdKSB7XG4gICAgaWYgKFxuICAgICAgIUFycmF5LmlzQXJyYXkoYXJyMSkgfHxcbiAgICAgICFBcnJheS5pc0FycmF5KGFycjIpIHx8XG4gICAgICBhcnIxLmxlbmd0aCAhPT0gYXJyMi5sZW5ndGhcbiAgICApXG4gICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFycjEubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChhcnIxW2ldICE9PSBhcnIyW2ldKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICB3cml0ZVB3ZFRvQ29uZmlnKHBhc3NBcnJheTogbnVtYmVyW10sIHJhd09iajogSVJhd0RhdGFPYmpbXSkge1xuICAgIGxldCBpOiBudW1iZXI7XG4gICAgbGV0IG5hbWU6IHN0cmluZztcblxuICAgIC8vY29uc29sZS5sb2coXCJCZWZvcmUgd3JpdGUgcGFzc3dvcmQgXCIsIEpTT04uc3RyaW5naWZ5KHJhd09iaikpO1xuXG4gICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHtcbiAgICAgIGlmIChpIDwgMTApIHtcbiAgICAgICAgbmFtZSA9ICdwYXNzXzAnICsgaTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5hbWUgPSAncGFzc18nICsgaTtcbiAgICAgIH1cbiAgICAgIHJhd09iai5mb3JFYWNoKCh2KSA9PiB7XG4gICAgICAgIGlmICh2Lm5hbWUgPT0gbmFtZSkge1xuICAgICAgICAgIHYudmFsdWUgPSBwYXNzQXJyYXlbaV07XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vY29uc29sZS5sb2coXCJBZnRlciB3cml0ZSBwYXNzd29yZCBcIiwgSlNPTi5zdHJpbmdpZnkocmF3T2JqKSk7XG5cbiAgICByZXR1cm4gcmF3T2JqO1xuICB9XG5cbiAgZGlzcGxheVRpbWUoaG91cnM6IG51bWJlciwgbWluczogbnVtYmVyKSB7XG4gICAgLy9jb25zb2xlLmxvZyhcImhvdXJzID0gXCIsIGhvdXJzLCBcIiBtaW5zID0gXCIsIG1pbnMpO1xuICAgIGxldCBtOiBudW1iZXIgfCBzdHJpbmcgPSBtaW5zO1xuICAgIGxldCBwID0gJ2FtJztcbiAgICBpZiAobWlucyA8IDEwKSB7XG4gICAgICBtID0gJzAnICsgbWlucztcbiAgICB9XG4gICAgaWYgKGhvdXJzID4gMTEpIHtcbiAgICAgIHAgPSAncG0nO1xuICAgIH1cbiAgICBpZiAoaG91cnMgPT0gMCkge1xuICAgICAgaG91cnMgPSAxMjtcbiAgICB9XG4gICAgaWYgKGhvdXJzID4gMTIpIHtcbiAgICAgIGhvdXJzIC09IDEyO1xuICAgIH1cbiAgICByZXR1cm4gaG91cnMgKyAnOicgKyBtICsgJyAnICsgcDtcbiAgfVxuXG4gIGdldENodW5rVmFsdWVzKFxuICAgIHByb2Nlc3NEYXRhOiBJUHJvY2Vzc0RhdGFTdGVwW10sXG4gICAgcmF3RGF0YTogSVJhd0RhdGFPYmpbXSxcbiAgICBvdGhlckRhdGE6IElPdGhlckRhdGFPYmpbXVxuICApIHtcbiAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAvLyAgICdHRVQgQ0hVTksgVkFMVUVTICcsXG4gICAgLy8gICBKU09OLnN0cmluZ2lmeShyYXdEYXRhKSxcbiAgICAvLyAgICcgJyxcbiAgICAvLyAgIEpTT04uc3RyaW5naWZ5KG90aGVyRGF0YSlcbiAgICAvLyApO1xuICAgIGxldCB2OiBzdHJpbmcgfCBudW1iZXI7XG4gICAgY29uc3QgdmFsdWVzOiAoc3RyaW5nIHwgbnVtYmVyKVtdID0gW107XG4gICAgcHJvY2Vzc0RhdGEuZm9yRWFjaCgoY2h1bmspID0+IHtcbiAgICAgIC8vY29uc29sZS5sb2coJ1Byb2Nlc3MgUmF3IGNodW5rICcsIEpTT04uc3RyaW5naWZ5KGNodW5rKSk7XG4gICAgICBzd2l0Y2ggKGNodW5rLmZyb21EYXRhKSB7XG4gICAgICAgIGNhc2UgJ3Jhdyc6XG4gICAgICAgICAgcmF3RGF0YS5mb3JFYWNoKChyZCkgPT4ge1xuICAgICAgICAgICAgaWYgKHJkLm5hbWUgPT0gY2h1bmsudmFsdWUpIHtcbiAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnUkFXIGNodW5rIG5hbWU6ICcsIHJkLm5hbWUpO1xuICAgICAgICAgICAgICB2ID0gcmQudmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ290aGVyJzpcbiAgICAgICAgICBvdGhlckRhdGEuZm9yRWFjaCgob2QpID0+IHtcbiAgICAgICAgICAgIGlmIChvZC5uYW1lID09IGNodW5rLnZhbHVlKSB7XG4gICAgICAgICAgICAgIHYgPSBvZC52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnbm8nOlxuICAgICAgICAgIHYgPSBjaHVuay52YWx1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBjaHVuay5zdHJMZW5ndGggPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHZhbHVlcy5wdXNoKHYpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcGFkID0gdi50b1N0cmluZygpLnBhZFN0YXJ0KGNodW5rLnN0ckxlbmd0aCwgJzAnKTtcbiAgICAgICAgdmFsdWVzLnB1c2gocGFkKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gdmFsdWVzO1xuICB9XG5cbiAgdWludDhBcnJheVRvQXJyYXkodWludDg6IFVpbnQ4QXJyYXkpOiBudW1iZXJbXSB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20odWludDgpO1xuICB9XG5cbiAgYXJyYXlUb1VpbnQ4QXJyYXkoYXJyYXk6IG51bWJlcltdKTogVWludDhBcnJheSB7XG4gICAgcmV0dXJuIFVpbnQ4QXJyYXkuZnJvbShhcnJheSk7XG4gIH1cblxuICBpc1VpbnQ4QXJyYXkodjogbnVtYmVyW10gfCBVaW50OEFycmF5KSB7XG4gICAgY29uc3QgaXNTdHIgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xuICAgIHJldHVybiBpc1N0ci5jYWxsKHYpID09PSAnW29iamVjdCBVaW50OEFycmF5XSc7XG4gIH1cblxuICBwcm9jZXNzUmF3KGlucHV0OiBudW1iZXJbXSB8IFVpbnQ4QXJyYXksIGNvbmZpZ09iajogSUNvbmZpZyB8IElEaXNwbGF5KSB7XG4gICAgbGV0IGJ1ZmZlcjogVWludDhBcnJheTtcbiAgICBpZiAodGhpcy5pc1VpbnQ4QXJyYXkoaW5wdXQpKSB7XG4gICAgICBidWZmZXIgPSBpbnB1dCBhcyBVaW50OEFycmF5O1xuICAgIH0gZWxzZSB7XG4gICAgICBidWZmZXIgPSB0aGlzLmFycmF5VG9VaW50OEFycmF5KGlucHV0IGFzIG51bWJlcltdKTtcbiAgICB9XG4gICAgY29uc3QgcmF3RGF0YUJ1ZmZlciA9IG5ldyBEYXRhVmlldyhidWZmZXIuYnVmZmVyLCAwLCAyNTQpO1xuICAgIC8vY29uc29sZS5sb2coJ1BST0NFU1MgUkFXIENPTkZJRyAnLCByYXdEYXRhQnVmZmVyKTtcbiAgICBjb25maWdPYmoucmF3RGF0YS5mb3JFYWNoKChkYXRhcG9pbnQpID0+IHtcbiAgICAgIGRhdGFwb2ludC52YWx1ZSA9XG4gICAgICAgIHRoaXMuZ2V0VmFsdWVmcm9tQnVmZmVyKGRhdGFwb2ludC5idWZmZXIsIHJhd0RhdGFCdWZmZXIpICpcbiAgICAgICAgZGF0YXBvaW50Lm11bHRpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJvY2Vzc090aGVyKGNvbmZpZ09iajogSUNvbmZpZyB8IElEaXNwbGF5KSB7XG4gICAgY29uZmlnT2JqLm90aGVyRGF0YS5mb3JFYWNoKChkYXRhUG9pbnQpID0+IHtcbiAgICAgIGRhdGFQb2ludC5wcm9jZXNzRGF0YS5mb3JFYWNoKChwcm9jZXNzKSA9PiB7XG4gICAgICAgIHRoaXMucnVuUHJvY2Vzcyhwcm9jZXNzLCBjb25maWdPYmoucmF3RGF0YSwgY29uZmlnT2JqLm90aGVyRGF0YSk7XG4gICAgICAgIGRhdGFQb2ludC52YWx1ZSA9IHByb2Nlc3MudmFsdWU7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxufVxuIl19
|