-
Notifications
You must be signed in to change notification settings - Fork 0
/
mono.js
292 lines (291 loc) · 29.8 KB
/
mono.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
"use strict";
var ModbusRTU = require("modbus-serial");
var merge = require("json-add");
var Promise = require("bluebird");
var async = require("async");
var lsusbdev = require("lsusbdev");
var defaults = {
baud: 9600,
dev: "/dev/ttyUSB0",
address: 1,
type: "import"
};
function readReg(client, reg) {
return new Promise(function (resolve, reject) {
client.readInputRegisters(reg, 2).then(function (data) {
resolve(data.buffer.readFloatBE());
}).catch(function (err) {
reject(err);
});
});
}
var SdM = (function () {
function SdM(conf) {
this.client = new ModbusRTU();
var that = this;
if (conf) {
merge(defaults, require("./conf.json"));
that.client.setID(defaults.address);
if (defaults.hub) {
lsusbdev().then(function (devis) {
for (var i = 0; i < devis.length; i++) {
if (devis[i].hub === defaults.hub) {
defaults.dev = devis[i].dev;
}
}
that.conf = defaults;
}).catch(function () {
throw "NO USB FOR SDM";
});
}
}
else {
that.client.setID(defaults.address);
that.conf = defaults;
}
}
SdM.prototype.last = function () {
return this.latest;
};
SdM.prototype.data = function (callback, interval) {
var regs;
if (this.conf.type === "import") {
regs = [
{
label: "voltage",
phase: 1,
reg: 0,
group: "strings"
},
{
label: "voltage",
phase: 2,
reg: 2,
group: "strings"
},
{
label: "voltage",
phase: 3,
reg: 4,
group: "strings"
},
{
label: "current",
phase: 1,
reg: 6,
group: "strings"
},
{
label: "current",
phase: 2,
reg: 8,
group: "strings"
},
{
label: "current",
phase: 3,
reg: 10,
group: "strings"
},
{
label: "power",
phase: 1,
reg: 12,
group: "strings"
},
{
label: "power",
phase: 2,
reg: 14,
group: "strings"
},
{
label: "power",
phase: 3,
reg: 16,
group: "strings"
},
{
label: "hz",
phase: 0,
reg: 70,
group: "grid"
},
{
label: "power",
phase: 0,
reg: 52,
group: "grid"
},
{
label: "voltage",
phase: 0,
reg: 42,
group: "grid"
},
{
label: "current",
phase: 0,
reg: 46,
group: "grid"
},
{
label: "peakMax",
phase: 0,
reg: 86,
group: "main"
},
{
label: "totalEnergy",
phase: 0,
reg: 72,
group: "main"
}
];
}
else if (this.conf.type === "export") {
regs = [
{
label: "voltage",
phase: 1,
reg: 0,
group: "strings"
},
{
label: "voltage",
phase: 2,
reg: 2,
group: "strings"
},
{
label: "voltage",
phase: 3,
reg: 4,
group: "strings"
},
{
label: "current",
phase: 1,
reg: 6,
group: "strings"
},
{
label: "current",
phase: 2,
reg: 8,
group: "strings"
},
{
label: "current",
phase: 3,
reg: 10,
group: "strings"
},
{
label: "power",
phase: 1,
reg: 12,
group: "strings"
},
{
label: "power",
phase: 2,
reg: 14,
group: "strings"
},
{
label: "power",
phase: 3,
reg: 16,
group: "strings"
},
{
label: "hz",
phase: 0,
reg: 70,
group: "grid"
},
{
label: "power",
phase: 0,
reg: 52,
group: "grid"
},
{
label: "voltage",
phase: 0,
reg: 42,
group: "grid"
},
{
label: "current",
phase: 0,
reg: 46,
group: "grid"
},
{
label: "peakMax",
phase: 0,
reg: 86,
group: "main"
},
{
label: "totalEnergy",
phase: 0,
reg: 74,
group: "main"
}
];
}
var that = this;
function start() {
var answer = {};
async.eachSeries(regs, function (iterator, cb) {
readReg(that.client, iterator.reg).then(function (d) {
if (iterator.group === "strings") {
if (!answer.strings) {
answer.strings = [];
}
if (!answer.strings[iterator.phase - 1]) {
answer.strings[iterator.phase - 1] = {};
}
answer.strings[iterator.phase - 1][iterator.label] = d;
}
else if (iterator.group === "grid") {
if (!answer.grid) {
answer.grid = {};
}
answer.grid[iterator.label] = d;
}
else if (iterator.group === "main") {
answer[iterator.label] = d;
}
cb();
}).catch(function (err) {
cb(err);
});
}, function (err) {
if (err) {
console.log(err);
}
else if (answer.grid.power && answer.grid.power > 0) {
if (callback) {
callback(answer);
}
that.latest = answer;
}
});
}
if (interval) {
setInterval(function () {
that.client.connectRTU(that.conf.dev, { baudrate: that.conf.baud }, start);
}, interval);
}
else {
that.client.connectRTU(that.conf.dev, { baudrate: that.conf.baud }, start);
}
};
return SdM;
}());
module.exports = SdM;
//# sourceMappingURL=data:application/json;base64,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QUFDLENBQUM7b0JBQ3JCLENBQUM7b0JBQ0QsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7Z0JBQ3pCLENBQUM7WUFFTCxDQUFDLENBQUMsQ0FBQztRQUVQLENBQUM7UUFFRCxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1lBQ1gsV0FBVyxDQUFDO2dCQUNSLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFFL0UsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ2pCLENBQUM7UUFBQyxJQUFJLENBQUMsQ0FBQztZQUNKLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFL0UsQ0FBQztJQUdMLENBQUM7SUFDTCxVQUFDO0FBQUQsQ0FqVEEsQUFpVEMsSUFBQTtBQUtELGlCQUFTLEdBQUcsQ0FBQSIsImZpbGUiOiJtb25vLmpzIiwic291cmNlc0NvbnRlbnQiOlsibGV0IE1vZGJ1c1JUVSA9IHJlcXVpcmUoXCJtb2RidXMtc2VyaWFsXCIpO1xuaW1wb3J0ICogYXMgcGF0aEV4aXN0cyBmcm9tIFwicGF0aC1leGlzdHNcIjtcbmltcG9ydCBtZXJnZSA9IHJlcXVpcmUoXCJqc29uLWFkZFwiKTtcbmltcG9ydCAqIGFzIFByb21pc2UgZnJvbSBcImJsdWViaXJkXCI7XG5pbXBvcnQgKiBhcyBhc3luYyBmcm9tIFwiYXN5bmNcIjtcblxuaW1wb3J0IGxzdXNiZGV2ID0gcmVxdWlyZShcImxzdXNiZGV2XCIpO1xuXG5cblxuaW50ZXJmYWNlIElkZWZhdWx0cyB7XG4gICAgYmF1ZD86IG51bWJlcjtcbiAgICBkZXY/OiBzdHJpbmc7XG4gICAgYWRkcmVzcz86IG51bWJlcjtcbiAgICBodWI/OiBzdHJpbmc7XG4gICAgdHlwZT86IHN0cmluZztcbn1cblxubGV0IGRlZmF1bHRzID0gPElkZWZhdWx0cz57XG4gICAgYmF1ZDogOTYwMCxcbiAgICBkZXY6IFwiL2Rldi90dHlVU0IwXCIsXG4gICAgYWRkcmVzczogMSxcbiAgICB0eXBlOiBcImltcG9ydFwiXG59O1xuXG5pbnRlcmZhY2UgSXJlZyB7XG4gICAgbGFiZWw6IHN0cmluZztcbiAgICBwaGFzZTogbnVtYmVyO1xuICAgIHJlZzogbnVtYmVyO1xuICAgIGdyb3VwOiBzdHJpbmc7XG59XG5cblxuZnVuY3Rpb24gcmVhZFJlZyhjbGllbnQsIHJlZzogbnVtYmVyKSB7XG5cblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgY2xpZW50LnJlYWRJbnB1dFJlZ2lzdGVycyhyZWcsIDIpLnRoZW4oZnVuY3Rpb24oZGF0YSkge1xuXG5cbiAgICAgICAgICAgIHJlc29sdmUoZGF0YS5idWZmZXIucmVhZEZsb2F0QkUoKSk7XG4gICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uKGVycikge1xuICAgICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG59XG5cblxuXG5jbGFzcyBTZE0ge1xuICAgIGNsaWVudDtcbiAgICBsYXRlc3Q7XG4gICAgY29uZjogSWRlZmF1bHRzO1xuICAgIGNvbnN0cnVjdG9yKGNvbmY/OiBJZGVmYXVsdHMpIHtcblxuICAgICAgICB0aGlzLmNsaWVudCA9IG5ldyBNb2RidXNSVFUoKTtcbiAgICAgICAgbGV0IHRoYXQgPSB0aGlzO1xuICAgICAgICBpZiAoY29uZikge1xuXG4gICAgICAgICAgICBtZXJnZShkZWZhdWx0cywgcmVxdWlyZShcIi4vY29uZi5qc29uXCIpKTtcblxuICAgICAgICAgICAgdGhhdC5jbGllbnQuc2V0SUQoZGVmYXVsdHMuYWRkcmVzcyk7XG5cblxuICAgICAgICAgICAgaWYgKGRlZmF1bHRzLmh1Yikge1xuICAgICAgICAgICAgICAgIGxzdXNiZGV2KCkudGhlbihmdW5jdGlvbihkZXZpcykge1xuXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGV2aXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXZpc1tpXS5odWIgPT09IGRlZmF1bHRzLmh1Yikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRzLmRldiA9IGRldmlzW2ldLmRldjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGF0LmNvbmYgPSBkZWZhdWx0cztcbiAgICAgICAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgXCJOTyBVU0IgRk9SIFNETVwiO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGF0LmNsaWVudC5zZXRJRChkZWZhdWx0cy5hZGRyZXNzKTtcbiAgICAgICAgICAgIHRoYXQuY29uZiA9IGRlZmF1bHRzO1xuXG5cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGxhc3QoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxhdGVzdDtcbiAgICB9XG5cbiAgICBkYXRhKGNhbGxiYWNrPzogRnVuY3Rpb24sIGludGVydmFsPzogbnVtYmVyKSB7XG5cbiAgICAgICAgbGV0IHJlZ3M6IElyZWdbXTtcblxuICAgICAgICBpZiAodGhpcy5jb25mLnR5cGUgPT09IFwiaW1wb3J0XCIpIHtcbiAgICAgICAgICAgIHJlZ3MgPSBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBsYWJlbDogXCJ2b2x0YWdlXCIsXG4gICAgICAgICAgICAgICAgICAgIHBoYXNlOiAxLFxuICAgICAgICAgICAgICAgICAgICByZWc6IDAsXG4gICAgICAgICAgICAgICAgICAgIGdyb3VwOiBcInN0cmluZ3NcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBsYWJlbDogXCJ2b2x0YWdlXCIsXG4gICAgICAgICAgICAgICAgICAgIHBoYXNlOiAyLFxuICAgICAgICAgICAgICAgICAgICByZWc6IDIsXG4gICAgICAgICAgICAgICAgICAgIGdyb3VwOiBcInN0cmluZ3NcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBsYWJlbDogXCJ2b2x0YWdlXCIsXG4gICAgICAgICAgICAgICAgICAgIHBoYXNlOiAzLFxuICAgICAgICAgICAgICAgICAgICByZWc6IDQsXG4gICAgICAgICAgICAgICAgICAgIGdyb3VwOiBcInN0cmluZ3NcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBsYWJlbDogXCJjdXJyZW50XCIsXG4gICAgICAgICAgICAgICAgICAgIHBoYXNlOiAxLFxuICAgICAgICAgICAgICAgICAgICByZWc6IDYsXG4gICAgICAgICAgICAgICAgICAgIGdyb3VwOiBcInN0cmluZ3NcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBsYWJlbDogXCJjdXJyZW50XCIsXG4gICAgICAgICAgICAgICAgICAgIHBoYXNlOiAyLFxuICAgICAgICAgICAgICAgICAgICByZWc6IDgsXG4gICAgICAgICAgICAgICAgICAgIGdyb3VwOiBcInN0cmluZ3NcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBsYWJlbDogXCJjdXJyZW50XCIsXG4gICAgICAgICAgICAgICAgICAgIHBoYXNlOiAzLFxuICAgICAgICAgICAgICAgICAgICByZWc6IDEwLFxuICAgICAgICAgICAgICAgICAgICBncm91cDogXCJzdHJpbmdzXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6IFwicG93ZXJcIixcbiAgICAgICAgICAgICAgICAgICAgcGhhc2U6IDEsXG4gICAgICAgICAgICAgICAgICAgIHJlZzogMTIsXG4gICAgICAgICAgICAgICAgICAgIGdyb3VwOiBcInN0cmluZ3NcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBsYWJlbDogXCJwb3dlclwiLFxuICAgICAgICAgICAgICAgICAgICBwaGFzZTogMixcbiAgICAgICAgICAgICAgICAgICAgcmVnOiAxNCxcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXA6IFwic3RyaW5nc1wiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiBcInBvd2VyXCIsXG4gICAgICAgICAgICAgICAgICAgIHBoYXNlOiAzLFxuICAgICAgICAgICAgICAgICAgICByZWc6IDE2LFxuICAgICAgICAgICAgICAgICAgICBncm91cDogXCJzdHJpbmdzXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6IFwiaHpcIixcbiAgICAgICAgICAgICAgICAgICAgcGhhc2U6IDAsXG4gICAgICAgICAgICAgICAgICAgIHJlZzogNzAsXG4gICAgICAgICAgICAgICAgICAgIGdyb3VwOiBcImdyaWRcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBsYWJlbDogXCJwb3dlclwiLFxuICAgICAgICAgICAgICAgICAgICBwaGFzZTogMCxcbiAgICAgICAgICAgICAgICAgICAgcmVnOiA1MixcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXA6IFwiZ3JpZFwiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiBcInZvbHRhZ2VcIixcbiAgICAgICAgICAgICAgICAgICAgcGhhc2U6IDAsXG4gICAgICAgICAgICAgICAgICAgIHJlZzogNDIsXG4gICAgICAgICAgICAgICAgICAgIGdyb3VwOiBcImdyaWRcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBsYWJlbDogXCJjdXJyZW50XCIsXG4gICAgICAgICAgICAgICAgICAgIHBoYXNlOiAwLFxuICAgICAgICAgICAgICAgICAgICByZWc6IDQ2LFxuICAgICAgICAgICAgICAgICAgICBncm91cDogXCJncmlkXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6IFwicGVha01heFwiLFxuICAgICAgICAgICAgICAgICAgICBwaGFzZTogMCxcbiAgICAgICAgICAgICAgICAgICAgcmVnOiA4NixcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXA6IFwibWFpblwiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiBcInRvdGFsRW5lcmd5XCIsXG4gICAgICAgICAgICAgICAgICAgIHBoYXNlOiAwLFxuICAgICAgICAgICAgICAgICAgICByZWc6IDcyLFxuICAgICAgICAgICAgICAgICAgICBncm91cDogXCJtYWluXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY29uZi50eXBlID09PSBcImV4cG9ydFwiKSB7XG4gICAgICAgICAgICByZWdzID0gW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6IFwidm9sdGFnZVwiLFxuICAgICAgICAgICAgICAgICAgICBwaGFzZTogMSxcbiAgICAgICAgICAgICAgICAgICAgcmVnOiAwLFxuICAgICAgICAgICAgICAgICAgICBncm91cDogXCJzdHJpbmdzXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6IFwidm9sdGFnZVwiLFxuICAgICAgICAgICAgICAgICAgICBwaGFzZTogMixcbiAgICAgICAgICAgICAgICAgICAgcmVnOiAyLFxuICAgICAgICAgICAgICAgICAgICBncm91cDogXCJzdHJpbmdzXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6IFwidm9sdGFnZVwiLFxuICAgICAgICAgICAgICAgICAgICBwaGFzZTogMyxcbiAgICAgICAgICAgICAgICAgICAgcmVnOiA0LFxuICAgICAgICAgICAgICAgICAgICBncm91cDogXCJzdHJpbmdzXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6IFwiY3VycmVudFwiLFxuICAgICAgICAgICAgICAgICAgICBwaGFzZTogMSxcbiAgICAgICAgICAgICAgICAgICAgcmVnOiA2LFxuICAgICAgICAgICAgICAgICAgICBncm91cDogXCJzdHJpbmdzXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6IFwiY3VycmVudFwiLFxuICAgICAgICAgICAgICAgICAgICBwaGFzZTogMixcbiAgICAgICAgICAgICAgICAgICAgcmVnOiA4LFxuICAgICAgICAgICAgICAgICAgICBncm91cDogXCJzdHJpbmdzXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6IFwiY3VycmVudFwiLFxuICAgICAgICAgICAgICAgICAgICBwaGFzZTogMyxcbiAgICAgICAgICAgICAgICAgICAgcmVnOiAxMCxcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXA6IFwic3RyaW5nc1wiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiBcInBvd2VyXCIsXG4gICAgICAgICAgICAgICAgICAgIHBoYXNlOiAxLFxuICAgICAgICAgICAgICAgICAgICByZWc6IDEyLFxuICAgICAgICAgICAgICAgICAgICBncm91cDogXCJzdHJpbmdzXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6IFwicG93ZXJcIixcbiAgICAgICAgICAgICAgICAgICAgcGhhc2U6IDIsXG4gICAgICAgICAgICAgICAgICAgIHJlZzogMTQsXG4gICAgICAgICAgICAgICAgICAgIGdyb3VwOiBcInN0cmluZ3NcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBsYWJlbDogXCJwb3dlclwiLFxuICAgICAgICAgICAgICAgICAgICBwaGFzZTogMyxcbiAgICAgICAgICAgICAgICAgICAgcmVnOiAxNixcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXA6IFwic3RyaW5nc1wiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiBcImh6XCIsXG4gICAgICAgICAgICAgICAgICAgIHBoYXNlOiAwLFxuICAgICAgICAgICAgICAgICAgICByZWc6IDcwLFxuICAgICAgICAgICAgICAgICAgICBncm91cDogXCJncmlkXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6IFwicG93ZXJcIixcbiAgICAgICAgICAgICAgICAgICAgcGhhc2U6IDAsXG4gICAgICAgICAgICAgICAgICAgIHJlZzogNTIsXG4gICAgICAgICAgICAgICAgICAgIGdyb3VwOiBcImdyaWRcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBsYWJlbDogXCJ2b2x0YWdlXCIsXG4gICAgICAgICAgICAgICAgICAgIHBoYXNlOiAwLFxuICAgICAgICAgICAgICAgICAgICByZWc6IDQyLFxuICAgICAgICAgICAgICAgICAgICBncm91cDogXCJncmlkXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6IFwiY3VycmVudFwiLFxuICAgICAgICAgICAgICAgICAgICBwaGFzZTogMCxcbiAgICAgICAgICAgICAgICAgICAgcmVnOiA0NixcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXA6IFwiZ3JpZFwiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiBcInBlYWtNYXhcIixcbiAgICAgICAgICAgICAgICAgICAgcGhhc2U6IDAsXG4gICAgICAgICAgICAgICAgICAgIHJlZzogODYsXG4gICAgICAgICAgICAgICAgICAgIGdyb3VwOiBcIm1haW5cIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBsYWJlbDogXCJ0b3RhbEVuZXJneVwiLFxuICAgICAgICAgICAgICAgICAgICBwaGFzZTogMCxcbiAgICAgICAgICAgICAgICAgICAgcmVnOiA3NCxcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXA6IFwibWFpblwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXTtcbiAgICAgICAgfVxuXG5cblxuXG5cbiAgICAgICAgbGV0IHRoYXQgPSB0aGlzO1xuXG5cbiAgICAgICAgZnVuY3Rpb24gc3RhcnQoKSB7XG5cblxuXG5cbiAgICAgICAgICAgIGxldCBhbnN3ZXIgPSA8YW55Pnt9O1xuXG4gICAgICAgICAgICBhc3luYy5lYWNoU2VyaWVzKHJlZ3MsIGZ1bmN0aW9uKGl0ZXJhdG9yLCBjYikge1xuXG4gICAgICAgICAgICAgICAgcmVhZFJlZyh0aGF0LmNsaWVudCwgaXRlcmF0b3IucmVnKS50aGVuKGZ1bmN0aW9uKGQpIHtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoaXRlcmF0b3IuZ3JvdXAgPT09IFwic3RyaW5nc1wiKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYW5zd2VyLnN0cmluZ3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbnN3ZXIuc3RyaW5ncyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFhbnN3ZXIuc3RyaW5nc1tpdGVyYXRvci5waGFzZSAtIDFdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5zd2VyLnN0cmluZ3NbaXRlcmF0b3IucGhhc2UgLSAxXSA9IHt9O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgYW5zd2VyLnN0cmluZ3NbaXRlcmF0b3IucGhhc2UgLSAxXVtpdGVyYXRvci5sYWJlbF0gPSBkO1xuXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXRlcmF0b3IuZ3JvdXAgPT09IFwiZ3JpZFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWFuc3dlci5ncmlkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5zd2VyLmdyaWQgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGFuc3dlci5ncmlkW2l0ZXJhdG9yLmxhYmVsXSA9IGQ7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXRlcmF0b3IuZ3JvdXAgPT09IFwibWFpblwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhbnN3ZXJbaXRlcmF0b3IubGFiZWxdID0gZDtcblxuICAgICAgICAgICAgICAgICAgICB9XG5cblxuXG4gICAgICAgICAgICAgICAgICAgIGNiKCk7XG4gICAgICAgICAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24oZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNiKGVycik7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIH0sIGZ1bmN0aW9uKGVycikge1xuXG4gICAgICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlcnIpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYW5zd2VyLmdyaWQucG93ZXIgJiYgYW5zd2VyLmdyaWQucG93ZXIgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soYW5zd2VyKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGF0LmxhdGVzdCA9IGFuc3dlcjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaW50ZXJ2YWwpIHtcbiAgICAgICAgICAgIHNldEludGVydmFsKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHRoYXQuY2xpZW50LmNvbm5lY3RSVFUodGhhdC5jb25mLmRldiwgeyBiYXVkcmF0ZTogdGhhdC5jb25mLmJhdWQgfSwgc3RhcnQpO1xuXG4gICAgICAgICAgICB9LCBpbnRlcnZhbCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGF0LmNsaWVudC5jb25uZWN0UlRVKHRoYXQuY29uZi5kZXYsIHsgYmF1ZHJhdGU6IHRoYXQuY29uZi5iYXVkIH0sIHN0YXJ0KTtcblxuICAgICAgICB9XG5cblxuICAgIH1cbn1cblxuXG5cblxuZXhwb3J0ID0gU2RNIl0sInNvdXJjZVJvb3QiOiIvc291cmNlLyJ9