@wppconnect/server 1.8.4 → 2.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/CHANGELOG.md +12 -0
- package/dist/config/upload.js +4 -4
- package/dist/config.js +78 -0
- package/dist/controller/catalogController.js +127 -22
- package/dist/controller/deviceController.js +324 -114
- package/dist/controller/encryptController.js +4 -2
- package/dist/controller/groupController.js +157 -44
- package/dist/controller/labelsController.js +46 -8
- package/dist/controller/messageController.js +104 -39
- package/dist/controller/orderController.js +19 -7
- package/dist/controller/sessionController.js +100 -35
- package/dist/controller/statusController.js +18 -10
- package/dist/index.js +47 -25
- package/dist/mapper/index.js +7 -5
- package/dist/mapper/tagone-chat.js +1 -1
- package/dist/mapper/tagone-device.js +1 -1
- package/dist/mapper/tagone-message-document.js +1 -1
- package/dist/mapper/tagone-message-image.js +1 -1
- package/dist/mapper/tagone-message-location.js +1 -1
- package/dist/mapper/tagone-message-video.js +1 -1
- package/dist/mapper/tagone-message.js +1 -1
- package/dist/mapper/tagone-onack.js +1 -1
- package/dist/mapper/tagone-return.js +4 -2
- package/dist/middleware/auth.js +29 -9
- package/dist/middleware/healthCheck.js +1 -1
- package/dist/middleware/statusConnection.js +9 -3
- package/dist/routes/index.js +618 -112
- package/dist/server.js +2 -2
- package/dist/swagger.json +76 -0
- package/dist/types/Request.js +2 -0
- package/dist/types/ServerOptions.js +2 -0
- package/dist/types/WhatsAppServer.js +2 -0
- package/dist/util/chatWootClient.js +55 -22
- package/dist/util/createSessionUtil.js +65 -17
- package/dist/util/db/mongodb/db.js +10 -7
- package/dist/util/db/redis/db.js +7 -5
- package/dist/util/functions.js +81 -37
- package/dist/util/getAllTokens.js +1 -1
- package/dist/util/logger.js +2 -3
- package/dist/util/sessionUtil.js +5 -4
- package/dist/util/tokenStore/FileTokenStore/FileTokenStore.js +178 -0
- package/dist/util/tokenStore/factory.js +8 -11
- package/dist/util/tokenStore/fileTokenStory.js +21 -15
- package/dist/util/tokenStore/firebaseTokenStory.js +1 -1
- package/dist/util/tokenStore/model/token.js +7 -5
- package/dist/util/tokenStore/mongodbTokenStory.js +18 -11
- package/dist/util/tokenStore/redisTokenStory.js +39 -19
- package/dist/util/tokenStore/types.js +2 -0
- package/package.json +50 -28
- package/tsconfig.json +105 -0
- package/types.d.ts +2 -0
- package/dist/config/upload.js.map +0 -1
- package/dist/config.json +0 -77
- package/dist/controller/catalogController.js.map +0 -1
- package/dist/controller/deviceController.js.map +0 -1
- package/dist/controller/encryptController.js.map +0 -1
- package/dist/controller/groupController.js.map +0 -1
- package/dist/controller/labelsController.js.map +0 -1
- package/dist/controller/messageController.js.map +0 -1
- package/dist/controller/orderController.js.map +0 -1
- package/dist/controller/sessionController.js.map +0 -1
- package/dist/controller/statusController.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/mapper/index.js.map +0 -1
- package/dist/mapper/tagone-chat.js.map +0 -1
- package/dist/mapper/tagone-device.js.map +0 -1
- package/dist/mapper/tagone-message-document.js.map +0 -1
- package/dist/mapper/tagone-message-image.js.map +0 -1
- package/dist/mapper/tagone-message-location.js.map +0 -1
- package/dist/mapper/tagone-message-video.js.map +0 -1
- package/dist/mapper/tagone-message.js.map +0 -1
- package/dist/mapper/tagone-onack.js.map +0 -1
- package/dist/mapper/tagone-return.js.map +0 -1
- package/dist/middleware/auth.js.map +0 -1
- package/dist/middleware/healthCheck.js.map +0 -1
- package/dist/middleware/statusConnection.js.map +0 -1
- package/dist/routes/index.js.map +0 -1
- package/dist/server.js.map +0 -1
- package/dist/util/chatWootClient.js.map +0 -1
- package/dist/util/createSessionUtil.js.map +0 -1
- package/dist/util/db/mongodb/db.js.map +0 -1
- package/dist/util/db/redis/db.js.map +0 -1
- package/dist/util/functions.js.map +0 -1
- package/dist/util/getAllTokens.js.map +0 -1
- package/dist/util/logger.js.map +0 -1
- package/dist/util/sessionUtil.js.map +0 -1
- package/dist/util/tokenStore/factory.js.map +0 -1
- package/dist/util/tokenStore/fileTokenStory.js.map +0 -1
- package/dist/util/tokenStore/firebaseTokenStory.js.map +0 -1
- package/dist/util/tokenStore/model/token.js.map +0 -1
- package/dist/util/tokenStore/mongodbTokenStory.js.map +0 -1
- package/dist/util/tokenStore/redisTokenStory.js.map +0 -1
|
@@ -1,4 +1,8 @@
|
|
|
1
|
-
"use strict";
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", { value: true });exports.archiveAllChats = archiveAllChats;exports.archiveChat = archiveChat;exports.blockContact = blockContact;exports.chatWoot = chatWoot;exports.checkNumberStatus = checkNumberStatus;exports.clearAllChats = clearAllChats;exports.clearChat = clearChat;exports.deleteAllChats = deleteAllChats;exports.deleteChat = deleteChat;exports.deleteMessage = deleteMessage;exports.forwardMessages = forwardMessages;exports.getAllChats = getAllChats;exports.getAllChatsWithMessages = getAllChatsWithMessages;exports.getAllContacts = getAllContacts;exports.getAllMessagesInChat = getAllMessagesInChat;exports.getAllNewMessages = getAllNewMessages;exports.getAllUnreadMessages = getAllUnreadMessages;exports.getBatteryLevel = getBatteryLevel;exports.getBlockList = getBlockList;exports.getChatById = getChatById;exports.getChatIsOnline = getChatIsOnline;exports.getContact = getContact;exports.getHostDevice = getHostDevice;exports.getLastSeen = getLastSeen;exports.getListMutes = getListMutes;exports.getMessageById = getMessageById;exports.getMessages = getMessages;exports.getNumberProfile = getNumberProfile;exports.getPhoneNumber = getPhoneNumber;exports.getProfilePicFromServer = getProfilePicFromServer;exports.getReactions = getReactions;exports.getStatus = getStatus;exports.getUnreadMessages = getUnreadMessages;exports.getVotes = getVotes;exports.loadAndGetAllMessagesInChat = loadAndGetAllMessagesInChat;exports.markUnseenMessage = markUnseenMessage;exports.pinChat = pinChat;exports.reactMessage = reactMessage;exports.rejectCall = rejectCall;exports.reply = reply;exports.sendContactVcard = sendContactVcard;exports.sendMute = sendMute;exports.sendSeen = sendSeen;exports.setChatState = setChatState;exports.setProfileName = setProfileName;exports.setProfilePic = setProfilePic;exports.setProfileStatus = setProfileStatus;exports.setRecording = setRecording;exports.setTemporaryMessages = setTemporaryMessages;exports.setTyping = setTyping;exports.showAllContacts = showAllContacts;exports.starMessage = starMessage;exports.unblockContact = unblockContact;
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
|
|
2
6
|
|
|
3
7
|
|
|
4
8
|
|
|
@@ -13,10 +17,7 @@
|
|
|
13
17
|
|
|
14
18
|
|
|
15
19
|
|
|
16
|
-
var _fs = _interopRequireDefault(require("fs"));
|
|
17
|
-
var _sessionController = require("./sessionController");
|
|
18
20
|
var _functions = require("../util/functions");
|
|
19
|
-
var _mimeTypes = _interopRequireDefault(require("mime-types"));
|
|
20
21
|
var _sessionUtil = require("../util/sessionUtil"); /*
|
|
21
22
|
* Copyright 2021 WPPConnect Team
|
|
22
23
|
*
|
|
@@ -46,14 +47,21 @@ var _sessionUtil = require("../util/sessionUtil"); /*
|
|
|
46
47
|
async function setProfileName(req, res) {
|
|
47
48
|
const { name } = req.body;
|
|
48
49
|
|
|
49
|
-
if (!name)
|
|
50
|
+
if (!name)
|
|
51
|
+
return res.
|
|
52
|
+
status(400).
|
|
53
|
+
json({ status: 'error', message: 'Parameter name is required!' });
|
|
50
54
|
|
|
51
55
|
try {
|
|
52
56
|
const result = await req.client.setProfileName(name);
|
|
53
57
|
return res.status(200).json({ status: 'success', response: result });
|
|
54
58
|
} catch (error) {
|
|
55
59
|
req.logger.error(error);
|
|
56
|
-
res.status(500).json({
|
|
60
|
+
res.status(500).json({
|
|
61
|
+
status: 'error',
|
|
62
|
+
message: 'Error on set profile name.',
|
|
63
|
+
error: error
|
|
64
|
+
});
|
|
57
65
|
}
|
|
58
66
|
}
|
|
59
67
|
|
|
@@ -63,17 +71,25 @@ async function showAllContacts(req, res) {
|
|
|
63
71
|
res.status(200).json({ status: 'success', response: contacts });
|
|
64
72
|
} catch (error) {
|
|
65
73
|
req.logger.error(error);
|
|
66
|
-
res.status(500).json({
|
|
74
|
+
res.status(500).json({
|
|
75
|
+
status: 'error',
|
|
76
|
+
message: 'Error fetching contacts',
|
|
77
|
+
error: error
|
|
78
|
+
});
|
|
67
79
|
}
|
|
68
80
|
}
|
|
69
81
|
|
|
70
82
|
async function getAllChats(req, res) {
|
|
71
83
|
try {
|
|
72
84
|
const response = await req.client.getAllChats();
|
|
73
|
-
return res.
|
|
85
|
+
return res.
|
|
86
|
+
status(200).
|
|
87
|
+
json({ status: 'success', response: response, mapper: 'chat' });
|
|
74
88
|
} catch (e) {
|
|
75
89
|
req.logger.error(e);
|
|
76
|
-
return res.
|
|
90
|
+
return res.
|
|
91
|
+
status(500).
|
|
92
|
+
json({ status: 'error', message: 'Error on get all chats' });
|
|
77
93
|
}
|
|
78
94
|
}
|
|
79
95
|
|
|
@@ -83,7 +99,11 @@ async function getAllChatsWithMessages(req, res) {
|
|
|
83
99
|
return res.status(200).json({ status: 'success', response: response });
|
|
84
100
|
} catch (e) {
|
|
85
101
|
req.logger.error(e);
|
|
86
|
-
return res.status(500).json({
|
|
102
|
+
return res.status(500).json({
|
|
103
|
+
status: 'error',
|
|
104
|
+
message: 'Error on get all chats whit messages',
|
|
105
|
+
error: e
|
|
106
|
+
});
|
|
87
107
|
}
|
|
88
108
|
}
|
|
89
109
|
/**
|
|
@@ -91,18 +111,30 @@ async function getAllChatsWithMessages(req, res) {
|
|
|
91
111
|
*/
|
|
92
112
|
async function getAllMessagesInChat(req, res) {
|
|
93
113
|
try {
|
|
94
|
-
|
|
95
|
-
const {
|
|
114
|
+
const { phone } = req.params;
|
|
115
|
+
const {
|
|
116
|
+
isGroup = false,
|
|
117
|
+
includeMe = true,
|
|
118
|
+
includeNotifications = true
|
|
119
|
+
} = req.query;
|
|
96
120
|
|
|
97
121
|
let response;
|
|
98
122
|
for (const contato of (0, _functions.contactToArray)(phone, isGroup)) {
|
|
99
|
-
response = await req.client.getAllMessagesInChat(
|
|
123
|
+
response = await req.client.getAllMessagesInChat(
|
|
124
|
+
contato,
|
|
125
|
+
includeMe,
|
|
126
|
+
includeNotifications);
|
|
127
|
+
|
|
100
128
|
}
|
|
101
129
|
|
|
102
130
|
return res.status(200).json({ status: 'success', response: response });
|
|
103
131
|
} catch (e) {
|
|
104
132
|
req.logger.error(e);
|
|
105
|
-
return res.status(500).json({
|
|
133
|
+
return res.status(500).json({
|
|
134
|
+
status: 'error',
|
|
135
|
+
message: 'Error on get all messages in chat',
|
|
136
|
+
error: e
|
|
137
|
+
});
|
|
106
138
|
}
|
|
107
139
|
}
|
|
108
140
|
|
|
@@ -112,7 +144,11 @@ async function getAllNewMessages(req, res) {
|
|
|
112
144
|
return res.status(200).json({ status: 'success', response: response });
|
|
113
145
|
} catch (e) {
|
|
114
146
|
req.logger.error(e);
|
|
115
|
-
return res.status(500).json({
|
|
147
|
+
return res.status(500).json({
|
|
148
|
+
status: 'error',
|
|
149
|
+
message: 'Error on get all messages in chat',
|
|
150
|
+
error: e
|
|
151
|
+
});
|
|
116
152
|
}
|
|
117
153
|
}
|
|
118
154
|
|
|
@@ -122,7 +158,11 @@ async function getAllUnreadMessages(req, res) {
|
|
|
122
158
|
return res.status(200).json({ status: 'success', response: response });
|
|
123
159
|
} catch (e) {
|
|
124
160
|
req.logger.error(e);
|
|
125
|
-
return res.status(500).json({
|
|
161
|
+
return res.status(500).json({
|
|
162
|
+
status: 'error',
|
|
163
|
+
message: 'Error on get all messages in chat',
|
|
164
|
+
error: e
|
|
165
|
+
});
|
|
126
166
|
}
|
|
127
167
|
}
|
|
128
168
|
|
|
@@ -131,32 +171,21 @@ async function getChatById(req, res) {
|
|
|
131
171
|
const { isGroup } = req.query;
|
|
132
172
|
|
|
133
173
|
try {
|
|
134
|
-
let
|
|
135
|
-
|
|
174
|
+
let result = {};
|
|
136
175
|
if (isGroup) {
|
|
137
|
-
|
|
176
|
+
result = await req.client.getChatById(`${phone}@g.us`);
|
|
138
177
|
} else {
|
|
139
|
-
|
|
178
|
+
result = await req.client.getChatById(`${phone}@c.us`);
|
|
140
179
|
}
|
|
141
180
|
|
|
142
|
-
|
|
143
|
-
if (!_fs.default.existsSync(dir)) {
|
|
144
|
-
_fs.default.mkdirSync(dir);
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
allMessages.map((message) => {
|
|
148
|
-
if (message.type === 'sticker') {
|
|
149
|
-
(0, _sessionController.download)(message, req.client, req.logger);
|
|
150
|
-
message.body = `${req.serverOptions.host}:${req.serverOptions.port}/files/file${message.t}.${_mimeTypes.default.extension(
|
|
151
|
-
message.mimetype)
|
|
152
|
-
}`;
|
|
153
|
-
}
|
|
154
|
-
});
|
|
155
|
-
|
|
156
|
-
return res.status(200).json({ status: 'success', response: allMessages });
|
|
181
|
+
return res.status(200).json(result);
|
|
157
182
|
} catch (e) {
|
|
158
183
|
req.logger.error(e);
|
|
159
|
-
return res.status(500).json({
|
|
184
|
+
return res.status(500).json({
|
|
185
|
+
status: 'error',
|
|
186
|
+
message: 'Error changing chat by Id',
|
|
187
|
+
error: e
|
|
188
|
+
});
|
|
160
189
|
}
|
|
161
190
|
}
|
|
162
191
|
|
|
@@ -165,9 +194,7 @@ async function getMessageById(req, res) {
|
|
|
165
194
|
const { messageId } = req.params;
|
|
166
195
|
|
|
167
196
|
try {
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
result = await req.client.getMessageById(messageId);
|
|
197
|
+
const result = await req.client.getMessageById(messageId);
|
|
171
198
|
|
|
172
199
|
returnSucess(res, session, result.chatId.user, result);
|
|
173
200
|
} catch (error) {
|
|
@@ -177,11 +204,15 @@ async function getMessageById(req, res) {
|
|
|
177
204
|
|
|
178
205
|
async function getBatteryLevel(req, res) {
|
|
179
206
|
try {
|
|
180
|
-
|
|
207
|
+
const response = await req.client.getBatteryLevel();
|
|
181
208
|
return res.status(200).json({ status: 'Success', response: response });
|
|
182
209
|
} catch (e) {
|
|
183
210
|
req.logger.error(e);
|
|
184
|
-
return res.status(500).json({
|
|
211
|
+
return res.status(500).json({
|
|
212
|
+
status: 'error',
|
|
213
|
+
message: 'Error retrieving battery status',
|
|
214
|
+
error: e
|
|
215
|
+
});
|
|
185
216
|
}
|
|
186
217
|
}
|
|
187
218
|
|
|
@@ -189,25 +220,39 @@ async function getHostDevice(req, res) {
|
|
|
189
220
|
try {
|
|
190
221
|
const response = await req.client.getHostDevice();
|
|
191
222
|
const phoneNumber = await req.client.getWid();
|
|
192
|
-
return res.status(200).json({
|
|
223
|
+
return res.status(200).json({
|
|
224
|
+
status: 'success',
|
|
225
|
+
response: { ...response, phoneNumber },
|
|
226
|
+
mapper: 'device'
|
|
227
|
+
});
|
|
193
228
|
} catch (e) {
|
|
194
229
|
req.logger.error(e);
|
|
195
|
-
return res.status(500).json({
|
|
230
|
+
return res.status(500).json({
|
|
231
|
+
status: 'error',
|
|
232
|
+
message: 'Erro ao recuperar dados do telefone',
|
|
233
|
+
error: e
|
|
234
|
+
});
|
|
196
235
|
}
|
|
197
236
|
}
|
|
198
237
|
|
|
199
238
|
async function getPhoneNumber(req, res) {
|
|
200
239
|
try {
|
|
201
240
|
const phoneNumber = await req.client.getWid();
|
|
202
|
-
return res.
|
|
241
|
+
return res.
|
|
242
|
+
status(200).
|
|
243
|
+
json({ status: 'success', response: phoneNumber, mapper: 'device' });
|
|
203
244
|
} catch (e) {
|
|
204
245
|
req.logger.error(e);
|
|
205
|
-
return res.status(500).json({
|
|
246
|
+
return res.status(500).json({
|
|
247
|
+
status: 'error',
|
|
248
|
+
message: 'Error retrieving phone number',
|
|
249
|
+
error: e
|
|
250
|
+
});
|
|
206
251
|
}
|
|
207
252
|
}
|
|
208
253
|
|
|
209
254
|
async function getBlockList(req, res) {
|
|
210
|
-
|
|
255
|
+
const response = await req.client.getBlockList();
|
|
211
256
|
|
|
212
257
|
try {
|
|
213
258
|
const blocked = response.map((contato) => {
|
|
@@ -217,7 +262,11 @@ async function getBlockList(req, res) {
|
|
|
217
262
|
return res.status(200).json({ status: 'success', response: blocked });
|
|
218
263
|
} catch (e) {
|
|
219
264
|
req.logger.error(e);
|
|
220
|
-
return res.status(500).json({
|
|
265
|
+
return res.status(500).json({
|
|
266
|
+
status: 'error',
|
|
267
|
+
message: 'Error retrieving blocked contact list',
|
|
268
|
+
error: e
|
|
269
|
+
});
|
|
221
270
|
}
|
|
222
271
|
}
|
|
223
272
|
|
|
@@ -226,7 +275,7 @@ async function deleteChat(req, res) {
|
|
|
226
275
|
const session = req.session;
|
|
227
276
|
|
|
228
277
|
try {
|
|
229
|
-
|
|
278
|
+
const results = {};
|
|
230
279
|
for (const contato of phone) {
|
|
231
280
|
results[contato] = await req.client.deleteChat(contato);
|
|
232
281
|
}
|
|
@@ -244,7 +293,11 @@ async function deleteAllChats(req, res) {
|
|
|
244
293
|
return res.status(200).json({ status: 'success' });
|
|
245
294
|
} catch (error) {
|
|
246
295
|
req.logger.error(error);
|
|
247
|
-
return res.status(500).json({
|
|
296
|
+
return res.status(500).json({
|
|
297
|
+
status: 'error',
|
|
298
|
+
message: 'Error on delete all chats',
|
|
299
|
+
error: error
|
|
300
|
+
});
|
|
248
301
|
}
|
|
249
302
|
}
|
|
250
303
|
|
|
@@ -253,7 +306,7 @@ async function clearChat(req, res) {
|
|
|
253
306
|
const session = req.session;
|
|
254
307
|
|
|
255
308
|
try {
|
|
256
|
-
|
|
309
|
+
const results = {};
|
|
257
310
|
for (const contato of phone) {
|
|
258
311
|
results[contato] = await req.client.clearChat(contato);
|
|
259
312
|
}
|
|
@@ -272,7 +325,9 @@ async function clearAllChats(req, res) {
|
|
|
272
325
|
return res.status(201).json({ status: 'success' });
|
|
273
326
|
} catch (e) {
|
|
274
327
|
req.logger.error(e);
|
|
275
|
-
return res.
|
|
328
|
+
return res.
|
|
329
|
+
status(500).
|
|
330
|
+
json({ status: 'error', message: 'Error on clear all chats', error: e });
|
|
276
331
|
}
|
|
277
332
|
}
|
|
278
333
|
|
|
@@ -280,12 +335,13 @@ async function archiveChat(req, res) {
|
|
|
280
335
|
const { phone, value = true } = req.body;
|
|
281
336
|
|
|
282
337
|
try {
|
|
283
|
-
|
|
284
|
-
response = await req.client.archiveChat(`${phone}`, value);
|
|
338
|
+
const response = await req.client.archiveChat(`${phone}`, value);
|
|
285
339
|
return res.status(201).json({ status: 'success', response: response });
|
|
286
340
|
} catch (e) {
|
|
287
341
|
req.logger.error(e);
|
|
288
|
-
return res.
|
|
342
|
+
return res.
|
|
343
|
+
status(500).
|
|
344
|
+
json({ status: 'error', message: 'Error on archive chat', error: e });
|
|
289
345
|
}
|
|
290
346
|
}
|
|
291
347
|
|
|
@@ -298,7 +354,11 @@ async function archiveAllChats(req, res) {
|
|
|
298
354
|
return res.status(201).json({ status: 'success' });
|
|
299
355
|
} catch (e) {
|
|
300
356
|
req.logger.error(e);
|
|
301
|
-
return res.status(500).json({
|
|
357
|
+
return res.status(500).json({
|
|
358
|
+
status: 'error',
|
|
359
|
+
message: 'Error on archive all chats',
|
|
360
|
+
error: e
|
|
361
|
+
});
|
|
302
362
|
}
|
|
303
363
|
}
|
|
304
364
|
|
|
@@ -308,10 +368,14 @@ async function deleteMessage(req, res) {
|
|
|
308
368
|
try {
|
|
309
369
|
await req.client.deleteMessage(`${phone}`, [messageId]);
|
|
310
370
|
|
|
311
|
-
return res.
|
|
371
|
+
return res.
|
|
372
|
+
status(200).
|
|
373
|
+
json({ status: 'success', response: { message: 'Message deleted' } });
|
|
312
374
|
} catch (e) {
|
|
313
375
|
req.logger.error(e);
|
|
314
|
-
return res.
|
|
376
|
+
return res.
|
|
377
|
+
status(500).
|
|
378
|
+
json({ status: 'error', message: 'Error on delete message', error: e });
|
|
315
379
|
}
|
|
316
380
|
}
|
|
317
381
|
async function reactMessage(req, res) {
|
|
@@ -320,10 +384,16 @@ async function reactMessage(req, res) {
|
|
|
320
384
|
try {
|
|
321
385
|
await req.client.sendReactionToMessage(msgId, reaction);
|
|
322
386
|
|
|
323
|
-
return res.
|
|
387
|
+
return res.
|
|
388
|
+
status(200).
|
|
389
|
+
json({ status: 'success', response: { message: 'Reaction sended' } });
|
|
324
390
|
} catch (e) {
|
|
325
391
|
req.logger.error(e);
|
|
326
|
-
return res.status(500).json({
|
|
392
|
+
return res.status(500).json({
|
|
393
|
+
status: 'error',
|
|
394
|
+
message: 'Error on send reaction to message',
|
|
395
|
+
error: e
|
|
396
|
+
});
|
|
327
397
|
}
|
|
328
398
|
}
|
|
329
399
|
|
|
@@ -331,11 +401,13 @@ async function reply(req, res) {
|
|
|
331
401
|
const { phone, text, messageid } = req.body;
|
|
332
402
|
|
|
333
403
|
try {
|
|
334
|
-
|
|
404
|
+
const response = await req.client.reply(`${phone}@c.us`, text, messageid);
|
|
335
405
|
return res.status(200).json({ status: 'success', response: response });
|
|
336
406
|
} catch (e) {
|
|
337
407
|
req.logger.error(e);
|
|
338
|
-
return res.
|
|
408
|
+
return res.
|
|
409
|
+
status(500).
|
|
410
|
+
json({ status: 'error', message: 'Error replying message', error: e });
|
|
339
411
|
}
|
|
340
412
|
}
|
|
341
413
|
|
|
@@ -346,15 +418,25 @@ async function forwardMessages(req, res) {
|
|
|
346
418
|
let response;
|
|
347
419
|
|
|
348
420
|
if (!isGroup) {
|
|
349
|
-
response = await req.client.forwardMessages(
|
|
421
|
+
response = await req.client.forwardMessages(
|
|
422
|
+
`${phone}`,
|
|
423
|
+
[messageId],
|
|
424
|
+
false);
|
|
425
|
+
|
|
350
426
|
} else {
|
|
351
|
-
response = await req.client.forwardMessages(
|
|
427
|
+
response = await req.client.forwardMessages(
|
|
428
|
+
`${phone}`,
|
|
429
|
+
[messageId],
|
|
430
|
+
false);
|
|
431
|
+
|
|
352
432
|
}
|
|
353
433
|
|
|
354
434
|
return res.status(201).json({ status: 'success', response: response });
|
|
355
435
|
} catch (e) {
|
|
356
436
|
req.logger.error(e);
|
|
357
|
-
return res.
|
|
437
|
+
return res.
|
|
438
|
+
status(500).
|
|
439
|
+
json({ status: 'error', message: 'Error forwarding message', error: e });
|
|
358
440
|
}
|
|
359
441
|
}
|
|
360
442
|
|
|
@@ -363,10 +445,14 @@ async function markUnseenMessage(req, res) {
|
|
|
363
445
|
|
|
364
446
|
try {
|
|
365
447
|
await req.client.markUnseenMessage(`${phone}`);
|
|
366
|
-
return res.
|
|
448
|
+
return res.
|
|
449
|
+
status(200).
|
|
450
|
+
json({ status: 'success', response: { message: 'unseen checked' } });
|
|
367
451
|
} catch (e) {
|
|
368
452
|
req.logger.error(e);
|
|
369
|
-
return res.
|
|
453
|
+
return res.
|
|
454
|
+
status(500).
|
|
455
|
+
json({ status: 'error', message: 'Error on mark unseen', error: e });
|
|
370
456
|
}
|
|
371
457
|
}
|
|
372
458
|
|
|
@@ -375,10 +461,14 @@ async function blockContact(req, res) {
|
|
|
375
461
|
|
|
376
462
|
try {
|
|
377
463
|
await req.client.blockContact(`${phone}`);
|
|
378
|
-
return res.
|
|
464
|
+
return res.
|
|
465
|
+
status(200).
|
|
466
|
+
json({ status: 'success', response: { message: 'Contact blocked' } });
|
|
379
467
|
} catch (e) {
|
|
380
468
|
req.logger.error(e);
|
|
381
|
-
return res.
|
|
469
|
+
return res.
|
|
470
|
+
status(500).
|
|
471
|
+
json({ status: 'error', message: 'Error on block contact', error: e });
|
|
382
472
|
}
|
|
383
473
|
}
|
|
384
474
|
|
|
@@ -387,10 +477,14 @@ async function unblockContact(req, res) {
|
|
|
387
477
|
|
|
388
478
|
try {
|
|
389
479
|
await req.client.unblockContact(`${phone}`);
|
|
390
|
-
return res.
|
|
480
|
+
return res.
|
|
481
|
+
status(200).
|
|
482
|
+
json({ status: 'success', response: { message: 'Contact UnBlocked' } });
|
|
391
483
|
} catch (e) {
|
|
392
484
|
req.logger.error(e);
|
|
393
|
-
return res.
|
|
485
|
+
return res.
|
|
486
|
+
status(500).
|
|
487
|
+
json({ status: 'error', message: 'Error on unlock contact', error: e });
|
|
394
488
|
}
|
|
395
489
|
}
|
|
396
490
|
|
|
@@ -402,15 +496,24 @@ async function pinChat(req, res) {
|
|
|
402
496
|
await req.client.pinChat(contato, state === 'true', false);
|
|
403
497
|
}
|
|
404
498
|
|
|
405
|
-
return res.
|
|
499
|
+
return res.
|
|
500
|
+
status(200).
|
|
501
|
+
json({ status: 'success', response: { message: 'Chat fixed' } });
|
|
406
502
|
} catch (e) {
|
|
407
503
|
req.logger.error(e);
|
|
408
|
-
return res.status(500).json({
|
|
504
|
+
return res.status(500).json({
|
|
505
|
+
status: 'error',
|
|
506
|
+
message: e.text || 'Error on pin chat',
|
|
507
|
+
error: e
|
|
508
|
+
});
|
|
409
509
|
}
|
|
410
510
|
}
|
|
411
511
|
|
|
412
512
|
async function setProfilePic(req, res) {
|
|
413
|
-
if (!req.file)
|
|
513
|
+
if (!req.file)
|
|
514
|
+
return res.
|
|
515
|
+
status(400).
|
|
516
|
+
json({ status: 'Error', message: 'File parameter is required!' });
|
|
414
517
|
|
|
415
518
|
try {
|
|
416
519
|
const { path: pathFile } = req.file;
|
|
@@ -418,10 +521,17 @@ async function setProfilePic(req, res) {
|
|
|
418
521
|
await req.client.setProfilePic(pathFile);
|
|
419
522
|
await (0, _functions.unlinkAsync)(pathFile);
|
|
420
523
|
|
|
421
|
-
return res.status(200).json({
|
|
524
|
+
return res.status(200).json({
|
|
525
|
+
status: 'success',
|
|
526
|
+
response: { message: 'Profile photo successfully changed' }
|
|
527
|
+
});
|
|
422
528
|
} catch (e) {
|
|
423
529
|
req.logger.error(e);
|
|
424
|
-
return res.status(500).json({
|
|
530
|
+
return res.status(500).json({
|
|
531
|
+
status: 'error',
|
|
532
|
+
message: 'Error changing profile photo',
|
|
533
|
+
error: e
|
|
534
|
+
});
|
|
425
535
|
}
|
|
426
536
|
}
|
|
427
537
|
|
|
@@ -431,7 +541,9 @@ async function getUnreadMessages(req, res) {
|
|
|
431
541
|
return res.status(200).json({ status: 'success', response: response });
|
|
432
542
|
} catch (e) {
|
|
433
543
|
req.logger.error(e);
|
|
434
|
-
return res.
|
|
544
|
+
return res.
|
|
545
|
+
status(500).
|
|
546
|
+
json({ status: 'error', response: 'Error on open list', error: e });
|
|
435
547
|
}
|
|
436
548
|
}
|
|
437
549
|
|
|
@@ -442,7 +554,11 @@ async function getChatIsOnline(req, res) {
|
|
|
442
554
|
return res.status(200).json({ status: 'success', response: response });
|
|
443
555
|
} catch (e) {
|
|
444
556
|
req.logger.error(e);
|
|
445
|
-
return res.status(500).json({
|
|
557
|
+
return res.status(500).json({
|
|
558
|
+
status: 'error',
|
|
559
|
+
response: 'Error on get chat is online',
|
|
560
|
+
error: e
|
|
561
|
+
});
|
|
446
562
|
}
|
|
447
563
|
}
|
|
448
564
|
|
|
@@ -454,7 +570,11 @@ async function getLastSeen(req, res) {
|
|
|
454
570
|
return res.status(200).json({ status: 'success', response: response });
|
|
455
571
|
} catch (error) {
|
|
456
572
|
req.logger.error(error);
|
|
457
|
-
return res.status(500).json({
|
|
573
|
+
return res.status(500).json({
|
|
574
|
+
status: 'error',
|
|
575
|
+
response: 'Error on get chat last seen',
|
|
576
|
+
error: error
|
|
577
|
+
});
|
|
458
578
|
}
|
|
459
579
|
}
|
|
460
580
|
|
|
@@ -466,19 +586,29 @@ async function getListMutes(req, res) {
|
|
|
466
586
|
return res.status(200).json({ status: 'success', response: response });
|
|
467
587
|
} catch (error) {
|
|
468
588
|
req.logger.error(error);
|
|
469
|
-
return res.status(500).json({
|
|
589
|
+
return res.status(500).json({
|
|
590
|
+
status: 'error',
|
|
591
|
+
response: 'Error on get list mutes',
|
|
592
|
+
error: error
|
|
593
|
+
});
|
|
470
594
|
}
|
|
471
595
|
}
|
|
472
596
|
|
|
473
597
|
async function loadAndGetAllMessagesInChat(req, res) {
|
|
474
598
|
const { phone, includeMe = true, includeNotifications = false } = req.params;
|
|
475
599
|
try {
|
|
476
|
-
const response = await req.client.loadAndGetAllMessagesInChat(
|
|
600
|
+
const response = await req.client.loadAndGetAllMessagesInChat(
|
|
601
|
+
`${phone}@c.us`,
|
|
602
|
+
includeMe,
|
|
603
|
+
includeNotifications);
|
|
604
|
+
|
|
477
605
|
|
|
478
606
|
return res.status(200).json({ status: 'success', response: response });
|
|
479
607
|
} catch (error) {
|
|
480
608
|
req.logger.error(error);
|
|
481
|
-
return res.
|
|
609
|
+
return res.
|
|
610
|
+
status(500).
|
|
611
|
+
json({ status: 'error', response: 'Error on open list', error: error });
|
|
482
612
|
}
|
|
483
613
|
}
|
|
484
614
|
async function getMessages(req, res) {
|
|
@@ -493,7 +623,9 @@ async function getMessages(req, res) {
|
|
|
493
623
|
return res.status(200).json({ status: 'success', response: response });
|
|
494
624
|
} catch (e) {
|
|
495
625
|
req.logger.error(e);
|
|
496
|
-
return res.
|
|
626
|
+
return res.
|
|
627
|
+
status(401).
|
|
628
|
+
json({ status: 'error', response: 'Error on open list', error: e });
|
|
497
629
|
}
|
|
498
630
|
}
|
|
499
631
|
|
|
@@ -502,13 +634,21 @@ async function sendContactVcard(req, res) {
|
|
|
502
634
|
try {
|
|
503
635
|
let response;
|
|
504
636
|
for (const contato of (0, _functions.contactToArray)(phone, isGroup)) {
|
|
505
|
-
response = await req.client.sendContactVcard(
|
|
637
|
+
response = await req.client.sendContactVcard(
|
|
638
|
+
`${contato}`,
|
|
639
|
+
contactsId,
|
|
640
|
+
name);
|
|
641
|
+
|
|
506
642
|
}
|
|
507
643
|
|
|
508
644
|
return res.status(200).json({ status: 'success', response: response });
|
|
509
645
|
} catch (error) {
|
|
510
646
|
req.logger.error(error);
|
|
511
|
-
return res.status(500).json({
|
|
647
|
+
return res.status(500).json({
|
|
648
|
+
status: 'error',
|
|
649
|
+
message: 'Error on send contact vcard',
|
|
650
|
+
error: error
|
|
651
|
+
});
|
|
512
652
|
}
|
|
513
653
|
}
|
|
514
654
|
|
|
@@ -524,7 +664,9 @@ async function sendMute(req, res) {
|
|
|
524
664
|
return res.status(200).json({ status: 'success', response: response });
|
|
525
665
|
} catch (error) {
|
|
526
666
|
req.logger.error(error);
|
|
527
|
-
return res.
|
|
667
|
+
return res.
|
|
668
|
+
status(500).
|
|
669
|
+
json({ status: 'error', message: 'Error on send mute', error: error });
|
|
528
670
|
}
|
|
529
671
|
}
|
|
530
672
|
|
|
@@ -533,7 +675,7 @@ async function sendSeen(req, res) {
|
|
|
533
675
|
const session = req.session;
|
|
534
676
|
|
|
535
677
|
try {
|
|
536
|
-
|
|
678
|
+
const results = [];
|
|
537
679
|
for (const contato of phone) {
|
|
538
680
|
results.push(await req.client.sendSeen(contato));
|
|
539
681
|
}
|
|
@@ -555,7 +697,11 @@ async function setChatState(req, res) {
|
|
|
555
697
|
return res.status(200).json({ status: 'success', response: response });
|
|
556
698
|
} catch (error) {
|
|
557
699
|
req.logger.error(error);
|
|
558
|
-
return res.status(500).json({
|
|
700
|
+
return res.status(500).json({
|
|
701
|
+
status: 'error',
|
|
702
|
+
message: 'Error on send chat state',
|
|
703
|
+
error: error
|
|
704
|
+
});
|
|
559
705
|
}
|
|
560
706
|
}
|
|
561
707
|
|
|
@@ -571,7 +717,11 @@ async function setTemporaryMessages(req, res) {
|
|
|
571
717
|
return res.status(200).json({ status: 'success', response: response });
|
|
572
718
|
} catch (error) {
|
|
573
719
|
req.logger.error(error);
|
|
574
|
-
return res.status(500).json({
|
|
720
|
+
return res.status(500).json({
|
|
721
|
+
status: 'error',
|
|
722
|
+
message: 'Error on set temporary messages',
|
|
723
|
+
error: error
|
|
724
|
+
});
|
|
575
725
|
}
|
|
576
726
|
}
|
|
577
727
|
|
|
@@ -587,7 +737,9 @@ async function setTyping(req, res) {
|
|
|
587
737
|
return res.status(200).json({ status: 'success', response: response });
|
|
588
738
|
} catch (error) {
|
|
589
739
|
req.logger.error(error);
|
|
590
|
-
return res.
|
|
740
|
+
return res.
|
|
741
|
+
status(500).
|
|
742
|
+
json({ status: 'error', message: 'Error on set typing', error: error });
|
|
591
743
|
}
|
|
592
744
|
}
|
|
593
745
|
|
|
@@ -603,7 +755,11 @@ async function setRecording(req, res) {
|
|
|
603
755
|
return res.status(200).json({ status: 'success', response: response });
|
|
604
756
|
} catch (error) {
|
|
605
757
|
req.logger.error(error);
|
|
606
|
-
return res.status(500).json({
|
|
758
|
+
return res.status(500).json({
|
|
759
|
+
status: 'error',
|
|
760
|
+
message: 'Error on set recording',
|
|
761
|
+
error: error
|
|
762
|
+
});
|
|
607
763
|
}
|
|
608
764
|
}
|
|
609
765
|
|
|
@@ -618,7 +774,11 @@ async function checkNumberStatus(req, res) {
|
|
|
618
774
|
return res.status(200).json({ status: 'success', response: response });
|
|
619
775
|
} catch (error) {
|
|
620
776
|
req.logger.error(error);
|
|
621
|
-
return res.status(500).json({
|
|
777
|
+
return res.status(500).json({
|
|
778
|
+
status: 'error',
|
|
779
|
+
message: 'Error on check number status',
|
|
780
|
+
error: error
|
|
781
|
+
});
|
|
622
782
|
}
|
|
623
783
|
}
|
|
624
784
|
|
|
@@ -633,7 +793,9 @@ async function getContact(req, res) {
|
|
|
633
793
|
return res.status(200).json({ status: 'success', response: response });
|
|
634
794
|
} catch (error) {
|
|
635
795
|
req.logger.error(error);
|
|
636
|
-
return res.
|
|
796
|
+
return res.
|
|
797
|
+
status(500).
|
|
798
|
+
json({ status: 'error', message: 'Error on get contact', error: error });
|
|
637
799
|
}
|
|
638
800
|
}
|
|
639
801
|
|
|
@@ -644,7 +806,11 @@ async function getAllContacts(req, res) {
|
|
|
644
806
|
return res.status(200).json({ status: 'success', response: response });
|
|
645
807
|
} catch (error) {
|
|
646
808
|
req.logger.error(error);
|
|
647
|
-
return res.status(500).json({
|
|
809
|
+
return res.status(500).json({
|
|
810
|
+
status: 'error',
|
|
811
|
+
message: 'Error on get all constacts',
|
|
812
|
+
error: error
|
|
813
|
+
});
|
|
648
814
|
}
|
|
649
815
|
}
|
|
650
816
|
|
|
@@ -659,7 +825,11 @@ async function getNumberProfile(req, res) {
|
|
|
659
825
|
return res.status(200).json({ status: 'success', response: response });
|
|
660
826
|
} catch (error) {
|
|
661
827
|
req.logger.error(error);
|
|
662
|
-
return res.status(500).json({
|
|
828
|
+
return res.status(500).json({
|
|
829
|
+
status: 'error',
|
|
830
|
+
message: 'Error on get number profile',
|
|
831
|
+
error: error
|
|
832
|
+
});
|
|
663
833
|
}
|
|
664
834
|
}
|
|
665
835
|
|
|
@@ -674,7 +844,11 @@ async function getProfilePicFromServer(req, res) {
|
|
|
674
844
|
return res.status(200).json({ status: 'success', response: response });
|
|
675
845
|
} catch (error) {
|
|
676
846
|
req.logger.error(error);
|
|
677
|
-
return res.status(500).json({
|
|
847
|
+
return res.status(500).json({
|
|
848
|
+
status: 'error',
|
|
849
|
+
message: 'Error on get profile pic',
|
|
850
|
+
error: error
|
|
851
|
+
});
|
|
678
852
|
}
|
|
679
853
|
}
|
|
680
854
|
|
|
@@ -688,66 +862,82 @@ async function getStatus(req, res) {
|
|
|
688
862
|
return res.status(200).json({ status: 'success', response: response });
|
|
689
863
|
} catch (error) {
|
|
690
864
|
req.logger.error(error);
|
|
691
|
-
return res.
|
|
865
|
+
return res.
|
|
866
|
+
status(500).
|
|
867
|
+
json({ status: 'error', message: 'Error on get status', error: error });
|
|
692
868
|
}
|
|
693
869
|
}
|
|
694
870
|
|
|
695
871
|
async function setProfileStatus(req, res) {
|
|
696
872
|
const { status } = req.body;
|
|
697
873
|
try {
|
|
698
|
-
|
|
874
|
+
const response = await req.client.setProfileStatus(status);
|
|
699
875
|
|
|
700
876
|
return res.status(200).json({ status: 'success', response: response });
|
|
701
877
|
} catch (e) {
|
|
702
878
|
req.logger.error(e);
|
|
703
|
-
return res.
|
|
879
|
+
return res.
|
|
880
|
+
status(500).
|
|
881
|
+
json({ status: 'error', message: 'Error on set profile status' });
|
|
704
882
|
}
|
|
705
883
|
}
|
|
706
884
|
async function rejectCall(req, res) {
|
|
707
885
|
const { callId } = req.body;
|
|
708
886
|
try {
|
|
709
|
-
|
|
887
|
+
const response = await req.client.rejectCall(callId);
|
|
710
888
|
|
|
711
889
|
return res.status(200).json({ status: 'success', response: response });
|
|
712
890
|
} catch (e) {
|
|
713
891
|
req.logger.error(e);
|
|
714
|
-
return res.
|
|
892
|
+
return res.
|
|
893
|
+
status(500).
|
|
894
|
+
json({ status: 'error', message: 'Error on rejectCall', error: e });
|
|
715
895
|
}
|
|
716
896
|
}
|
|
717
897
|
|
|
718
898
|
async function starMessage(req, res) {
|
|
719
899
|
const { messageId, star = true } = req.body;
|
|
720
900
|
try {
|
|
721
|
-
|
|
901
|
+
const response = await req.client.starMessage(messageId, star);
|
|
722
902
|
|
|
723
903
|
return res.status(200).json({ status: 'success', response: response });
|
|
724
904
|
} catch (error) {
|
|
725
905
|
req.logger.error(error);
|
|
726
|
-
return res.status(500).json({
|
|
906
|
+
return res.status(500).json({
|
|
907
|
+
status: 'error',
|
|
908
|
+
message: 'Error on start message',
|
|
909
|
+
error: error
|
|
910
|
+
});
|
|
727
911
|
}
|
|
728
912
|
}
|
|
729
913
|
|
|
730
914
|
async function getReactions(req, res) {
|
|
731
915
|
const messageId = req.params.id;
|
|
732
916
|
try {
|
|
733
|
-
|
|
917
|
+
const response = await req.client.getReactions(messageId);
|
|
734
918
|
|
|
735
919
|
return res.status(200).json({ status: 'success', response: response });
|
|
736
920
|
} catch (error) {
|
|
737
921
|
req.logger.error(error);
|
|
738
|
-
return res.status(500).json({
|
|
922
|
+
return res.status(500).json({
|
|
923
|
+
status: 'error',
|
|
924
|
+
message: 'Error on get reactions',
|
|
925
|
+
error: error
|
|
926
|
+
});
|
|
739
927
|
}
|
|
740
928
|
}
|
|
741
929
|
|
|
742
930
|
async function getVotes(req, res) {
|
|
743
931
|
const messageId = req.params.id;
|
|
744
932
|
try {
|
|
745
|
-
|
|
933
|
+
const response = await req.client.getVotes(messageId);
|
|
746
934
|
|
|
747
935
|
return res.status(200).json({ status: 'success', response: response });
|
|
748
936
|
} catch (error) {
|
|
749
937
|
req.logger.error(error);
|
|
750
|
-
return res.
|
|
938
|
+
return res.
|
|
939
|
+
status(500).
|
|
940
|
+
json({ status: 'error', message: 'Error on get votes', error: error });
|
|
751
941
|
}
|
|
752
942
|
}
|
|
753
943
|
async function chatWoot(req, res) {
|
|
@@ -758,8 +948,14 @@ async function chatWoot(req, res) {
|
|
|
758
948
|
if (await client.isConnected()) {
|
|
759
949
|
const event = req.body.event;
|
|
760
950
|
|
|
761
|
-
if (
|
|
762
|
-
|
|
951
|
+
if (
|
|
952
|
+
event == 'conversation_status_changed' ||
|
|
953
|
+
event == 'conversation_resolved' ||
|
|
954
|
+
req.body.private)
|
|
955
|
+
{
|
|
956
|
+
return res.
|
|
957
|
+
status(200).
|
|
958
|
+
json({ status: 'success', message: 'Success on receive chatwoot' });
|
|
763
959
|
}
|
|
764
960
|
|
|
765
961
|
const {
|
|
@@ -768,24 +964,38 @@ async function chatWoot(req, res) {
|
|
|
768
964
|
message = req.body.conversation.messages[0]
|
|
769
965
|
} = req.body;
|
|
770
966
|
|
|
771
|
-
if (event != 'message_created' && message_type != 'outgoing')
|
|
967
|
+
if (event != 'message_created' && message_type != 'outgoing')
|
|
968
|
+
return res.status(200);
|
|
772
969
|
for (const contato of (0, _functions.contactToArray)(phone, false)) {
|
|
773
970
|
if (message_type == 'outgoing') {
|
|
774
971
|
if (message.attachments) {
|
|
775
|
-
|
|
972
|
+
const base_url = `${
|
|
973
|
+
client.config.chatWoot.baseURL
|
|
974
|
+
}/${message.attachments[0].data_url.substring(
|
|
776
975
|
message.attachments[0].data_url.indexOf('/rails/') + 1)
|
|
777
976
|
}`;
|
|
778
|
-
await client.sendFile(
|
|
977
|
+
await client.sendFile(
|
|
978
|
+
`${contato}`,
|
|
979
|
+
base_url,
|
|
980
|
+
'file',
|
|
981
|
+
message.content);
|
|
982
|
+
|
|
779
983
|
} else {
|
|
780
984
|
await client.sendText(contato, message.content);
|
|
781
985
|
}
|
|
782
986
|
}
|
|
783
987
|
}
|
|
784
|
-
return res.
|
|
988
|
+
return res.
|
|
989
|
+
status(200).
|
|
990
|
+
json({ status: 'success', message: 'Success on receive chatwoot' });
|
|
785
991
|
}
|
|
786
992
|
} catch (e) {
|
|
787
993
|
console.log(e);
|
|
788
|
-
return res.status(400).json({
|
|
994
|
+
return res.status(400).json({
|
|
995
|
+
status: 'error',
|
|
996
|
+
message: 'Error on receive chatwoot',
|
|
997
|
+
error: e
|
|
998
|
+
});
|
|
789
999
|
}
|
|
790
1000
|
}
|
|
791
|
-
//# sourceMappingURL=deviceController.js.map
|
|
1001
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfZnVuY3Rpb25zIiwicmVxdWlyZSIsIl9zZXNzaW9uVXRpbCIsInJldHVyblN1Y2VzcyIsInJlcyIsInNlc3Npb24iLCJwaG9uZSIsImRhdGEiLCJzdGF0dXMiLCJqc29uIiwicmVzcG9uc2UiLCJtZXNzYWdlIiwiY29udGFjdCIsInJldHVybkVycm9yIiwicmVxIiwiZXJyb3IiLCJsb2dnZXIiLCJsb2ciLCJzZXRQcm9maWxlTmFtZSIsIm5hbWUiLCJib2R5IiwicmVzdWx0IiwiY2xpZW50Iiwic2hvd0FsbENvbnRhY3RzIiwiY29udGFjdHMiLCJnZXRBbGxDb250YWN0cyIsImdldEFsbENoYXRzIiwibWFwcGVyIiwiZSIsImdldEFsbENoYXRzV2l0aE1lc3NhZ2VzIiwiZ2V0QWxsTWVzc2FnZXNJbkNoYXQiLCJwYXJhbXMiLCJpc0dyb3VwIiwiaW5jbHVkZU1lIiwiaW5jbHVkZU5vdGlmaWNhdGlvbnMiLCJxdWVyeSIsImNvbnRhdG8iLCJjb250YWN0VG9BcnJheSIsImdldEFsbE5ld01lc3NhZ2VzIiwiZ2V0QWxsVW5yZWFkTWVzc2FnZXMiLCJnZXRDaGF0QnlJZCIsImdldE1lc3NhZ2VCeUlkIiwibWVzc2FnZUlkIiwiY2hhdElkIiwidXNlciIsImdldEJhdHRlcnlMZXZlbCIsImdldEhvc3REZXZpY2UiLCJwaG9uZU51bWJlciIsImdldFdpZCIsImdldFBob25lTnVtYmVyIiwiZ2V0QmxvY2tMaXN0IiwiYmxvY2tlZCIsIm1hcCIsInNwbGl0IiwiZGVsZXRlQ2hhdCIsInJlc3VsdHMiLCJkZWxldGVBbGxDaGF0cyIsImNoYXRzIiwiY2hhdCIsImNsZWFyQ2hhdCIsImNsZWFyQWxsQ2hhdHMiLCJhcmNoaXZlQ2hhdCIsInZhbHVlIiwiYXJjaGl2ZUFsbENoYXRzIiwiZGVsZXRlTWVzc2FnZSIsInJlYWN0TWVzc2FnZSIsIm1zZ0lkIiwicmVhY3Rpb24iLCJzZW5kUmVhY3Rpb25Ub01lc3NhZ2UiLCJyZXBseSIsInRleHQiLCJtZXNzYWdlaWQiLCJmb3J3YXJkTWVzc2FnZXMiLCJtYXJrVW5zZWVuTWVzc2FnZSIsImJsb2NrQ29udGFjdCIsInVuYmxvY2tDb250YWN0IiwicGluQ2hhdCIsInN0YXRlIiwic2V0UHJvZmlsZVBpYyIsImZpbGUiLCJwYXRoIiwicGF0aEZpbGUiLCJ1bmxpbmtBc3luYyIsImdldFVucmVhZE1lc3NhZ2VzIiwiZ2V0Q2hhdElzT25saW5lIiwiZ2V0TGFzdFNlZW4iLCJnZXRMaXN0TXV0ZXMiLCJ0eXBlIiwibG9hZEFuZEdldEFsbE1lc3NhZ2VzSW5DaGF0IiwiZ2V0TWVzc2FnZXMiLCJjb3VudCIsImRpcmVjdGlvbiIsImlkIiwicGFyc2VJbnQiLCJ0b1N0cmluZyIsInNlbmRDb250YWN0VmNhcmQiLCJjb250YWN0c0lkIiwic2VuZE11dGUiLCJ0aW1lIiwic2VuZFNlZW4iLCJwdXNoIiwic2V0Q2hhdFN0YXRlIiwiY2hhdHN0YXRlIiwic2V0VGVtcG9yYXJ5TWVzc2FnZXMiLCJzZXRUeXBpbmciLCJzdGFydFR5cGluZyIsInN0b3BUeXBpbmciLCJzZXRSZWNvcmRpbmciLCJkdXJhdGlvbiIsInN0YXJ0UmVjb3JkaW5nIiwic3RvcFJlY29yaW5nIiwiY2hlY2tOdW1iZXJTdGF0dXMiLCJnZXRDb250YWN0IiwiZ2V0TnVtYmVyUHJvZmlsZSIsImdldFByb2ZpbGVQaWNGcm9tU2VydmVyIiwiZ2V0U3RhdHVzIiwic2V0UHJvZmlsZVN0YXR1cyIsInJlamVjdENhbGwiLCJjYWxsSWQiLCJzdGFyTWVzc2FnZSIsInN0YXIiLCJnZXRSZWFjdGlvbnMiLCJnZXRWb3RlcyIsImNoYXRXb290IiwiY2xpZW50c0FycmF5IiwiaXNDb25uZWN0ZWQiLCJldmVudCIsInByaXZhdGUiLCJtZXNzYWdlX3R5cGUiLCJjb252ZXJzYXRpb24iLCJtZXRhIiwic2VuZGVyIiwicGhvbmVfbnVtYmVyIiwicmVwbGFjZSIsIm1lc3NhZ2VzIiwiYXR0YWNobWVudHMiLCJiYXNlX3VybCIsImNvbmZpZyIsImJhc2VVUkwiLCJkYXRhX3VybCIsInN1YnN0cmluZyIsImluZGV4T2YiLCJzZW5kRmlsZSIsImNvbnRlbnQiLCJzZW5kVGV4dCIsImNvbnNvbGUiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvY29udHJvbGxlci9kZXZpY2VDb250cm9sbGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgMjAyMSBXUFBDb25uZWN0IFRlYW1cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbmltcG9ydCB7IENoYXQgfSBmcm9tICdAd3BwY29ubmVjdC10ZWFtL3dwcGNvbm5lY3QnO1xuaW1wb3J0IHsgUmVzcG9uc2UgfSBmcm9tICdleHByZXNzJztcblxuaW1wb3J0IHsgUmVxdWVzdCB9IGZyb20gJy4uL3R5cGVzL1JlcXVlc3QnO1xuaW1wb3J0IHsgY29udGFjdFRvQXJyYXksIHVubGlua0FzeW5jIH0gZnJvbSAnLi4vdXRpbC9mdW5jdGlvbnMnO1xuaW1wb3J0IHsgY2xpZW50c0FycmF5IH0gZnJvbSAnLi4vdXRpbC9zZXNzaW9uVXRpbCc7XG5cbmZ1bmN0aW9uIHJldHVyblN1Y2VzcyhyZXM6IGFueSwgc2Vzc2lvbjogYW55LCBwaG9uZTogYW55LCBkYXRhOiBhbnkpIHtcbiAgcmVzLnN0YXR1cygyMDEpLmpzb24oe1xuICAgIHN0YXR1czogJ1N1Y2Nlc3MnLFxuICAgIHJlc3BvbnNlOiB7XG4gICAgICBtZXNzYWdlOiAnSW5mb3JtYXRpb24gcmV0cmlldmVkIHN1Y2Nlc3NmdWxseS4nLFxuICAgICAgY29udGFjdDogcGhvbmUsXG4gICAgICBzZXNzaW9uOiBzZXNzaW9uLFxuICAgICAgZGF0YTogZGF0YSxcbiAgICB9LFxuICB9KTtcbn1cblxuZnVuY3Rpb24gcmV0dXJuRXJyb3IocmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlLCBzZXNzaW9uOiBhbnksIGVycm9yOiBhbnkpIHtcbiAgcmVxLmxvZ2dlci5lcnJvcihlcnJvcik7XG4gIHJlcy5zdGF0dXMoNDAwKS5qc29uKHtcbiAgICBzdGF0dXM6ICdFcnJvcicsXG4gICAgcmVzcG9uc2U6IHtcbiAgICAgIG1lc3NhZ2U6ICdFcnJvciByZXRyaWV2aW5nIGluZm9ybWF0aW9uJyxcbiAgICAgIHNlc3Npb246IHNlc3Npb24sXG4gICAgICBsb2c6IGVycm9yLFxuICAgIH0sXG4gIH0pO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2V0UHJvZmlsZU5hbWUocmVxOiBSZXF1ZXN0LCByZXM6IGFueSkge1xuICBjb25zdCB7IG5hbWUgfSA9IHJlcS5ib2R5O1xuXG4gIGlmICghbmFtZSlcbiAgICByZXR1cm4gcmVzXG4gICAgICAuc3RhdHVzKDQwMClcbiAgICAgIC5qc29uKHsgc3RhdHVzOiAnZXJyb3InLCBtZXNzYWdlOiAnUGFyYW1ldGVyIG5hbWUgaXMgcmVxdWlyZWQhJyB9KTtcblxuICB0cnkge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlcS5jbGllbnQuc2V0UHJvZmlsZU5hbWUobmFtZSk7XG4gICAgcmV0dXJuIHJlcy5zdGF0dXMoMjAwKS5qc29uKHsgc3RhdHVzOiAnc3VjY2VzcycsIHJlc3BvbnNlOiByZXN1bHQgfSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmVxLmxvZ2dlci5lcnJvcihlcnJvcik7XG4gICAgcmVzLnN0YXR1cyg1MDApLmpzb24oe1xuICAgICAgc3RhdHVzOiAnZXJyb3InLFxuICAgICAgbWVzc2FnZTogJ0Vycm9yIG9uIHNldCBwcm9maWxlIG5hbWUuJyxcbiAgICAgIGVycm9yOiBlcnJvcixcbiAgICB9KTtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2hvd0FsbENvbnRhY3RzKHJlcTogUmVxdWVzdCwgcmVzOiBhbnkpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBjb250YWN0cyA9IGF3YWl0IHJlcS5jbGllbnQuZ2V0QWxsQ29udGFjdHMoKTtcbiAgICByZXMuc3RhdHVzKDIwMCkuanNvbih7IHN0YXR1czogJ3N1Y2Nlc3MnLCByZXNwb25zZTogY29udGFjdHMgfSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmVxLmxvZ2dlci5lcnJvcihlcnJvcik7XG4gICAgcmVzLnN0YXR1cyg1MDApLmpzb24oe1xuICAgICAgc3RhdHVzOiAnZXJyb3InLFxuICAgICAgbWVzc2FnZTogJ0Vycm9yIGZldGNoaW5nIGNvbnRhY3RzJyxcbiAgICAgIGVycm9yOiBlcnJvcixcbiAgICB9KTtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0QWxsQ2hhdHMocmVxOiBSZXF1ZXN0LCByZXM6IGFueSkge1xuICB0cnkge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgcmVxLmNsaWVudC5nZXRBbGxDaGF0cygpO1xuICAgIHJldHVybiByZXNcbiAgICAgIC5zdGF0dXMoMjAwKVxuICAgICAgLmpzb24oeyBzdGF0dXM6ICdzdWNjZXNzJywgcmVzcG9uc2U6IHJlc3BvbnNlLCBtYXBwZXI6ICdjaGF0JyB9KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJlcS5sb2dnZXIuZXJyb3IoZSk7XG4gICAgcmV0dXJuIHJlc1xuICAgICAgLnN0YXR1cyg1MDApXG4gICAgICAuanNvbih7IHN0YXR1czogJ2Vycm9yJywgbWVzc2FnZTogJ0Vycm9yIG9uIGdldCBhbGwgY2hhdHMnIH0pO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRBbGxDaGF0c1dpdGhNZXNzYWdlcyhyZXE6IFJlcXVlc3QsIHJlczogYW55KSB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCByZXEuY2xpZW50LmdldEFsbENoYXRzV2l0aE1lc3NhZ2VzKCk7XG4gICAgcmV0dXJuIHJlcy5zdGF0dXMoMjAwKS5qc29uKHsgc3RhdHVzOiAnc3VjY2VzcycsIHJlc3BvbnNlOiByZXNwb25zZSB9KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJlcS5sb2dnZXIuZXJyb3IoZSk7XG4gICAgcmV0dXJuIHJlcy5zdGF0dXMoNTAwKS5qc29uKHtcbiAgICAgIHN0YXR1czogJ2Vycm9yJyxcbiAgICAgIG1lc3NhZ2U6ICdFcnJvciBvbiBnZXQgYWxsIGNoYXRzIHdoaXQgbWVzc2FnZXMnLFxuICAgICAgZXJyb3I6IGUsXG4gICAgfSk7XG4gIH1cbn1cbi8qKlxuICogRGVwcmVjaWFkbyBlbSBmYXZvciBkZSBnZXRNZXNzYWdlc1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0QWxsTWVzc2FnZXNJbkNoYXQocmVxOiBSZXF1ZXN0LCByZXM6IGFueSkge1xuICB0cnkge1xuICAgIGNvbnN0IHsgcGhvbmUgfSA9IHJlcS5wYXJhbXM7XG4gICAgY29uc3Qge1xuICAgICAgaXNHcm91cCA9IGZhbHNlLFxuICAgICAgaW5jbHVkZU1lID0gdHJ1ZSxcbiAgICAgIGluY2x1ZGVOb3RpZmljYXRpb25zID0gdHJ1ZSxcbiAgICB9ID0gcmVxLnF1ZXJ5O1xuXG4gICAgbGV0IHJlc3BvbnNlO1xuICAgIGZvciAoY29uc3QgY29udGF0byBvZiBjb250YWN0VG9BcnJheShwaG9uZSwgaXNHcm91cCBhcyBib29sZWFuKSkge1xuICAgICAgcmVzcG9uc2UgPSBhd2FpdCByZXEuY2xpZW50LmdldEFsbE1lc3NhZ2VzSW5DaGF0KFxuICAgICAgICBjb250YXRvLFxuICAgICAgICBpbmNsdWRlTWUgYXMgYm9vbGVhbixcbiAgICAgICAgaW5jbHVkZU5vdGlmaWNhdGlvbnMgYXMgYm9vbGVhblxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzLnN0YXR1cygyMDApLmpzb24oeyBzdGF0dXM6ICdzdWNjZXNzJywgcmVzcG9uc2U6IHJlc3BvbnNlIH0pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmVxLmxvZ2dlci5lcnJvcihlKTtcbiAgICByZXR1cm4gcmVzLnN0YXR1cyg1MDApLmpzb24oe1xuICAgICAgc3RhdHVzOiAnZXJyb3InLFxuICAgICAgbWVzc2FnZTogJ0Vycm9yIG9uIGdldCBhbGwgbWVzc2FnZXMgaW4gY2hhdCcsXG4gICAgICBlcnJvcjogZSxcbiAgICB9KTtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0QWxsTmV3TWVzc2FnZXMocmVxOiBSZXF1ZXN0LCByZXM6IGFueSkge1xuICB0cnkge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgcmVxLmNsaWVudC5nZXRBbGxOZXdNZXNzYWdlcygpO1xuICAgIHJldHVybiByZXMuc3RhdHVzKDIwMCkuanNvbih7IHN0YXR1czogJ3N1Y2Nlc3MnLCByZXNwb25zZTogcmVzcG9uc2UgfSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXEubG9nZ2VyLmVycm9yKGUpO1xuICAgIHJldHVybiByZXMuc3RhdHVzKDUwMCkuanNvbih7XG4gICAgICBzdGF0dXM6ICdlcnJvcicsXG4gICAgICBtZXNzYWdlOiAnRXJyb3Igb24gZ2V0IGFsbCBtZXNzYWdlcyBpbiBjaGF0JyxcbiAgICAgIGVycm9yOiBlLFxuICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRBbGxVbnJlYWRNZXNzYWdlcyhyZXE6IFJlcXVlc3QsIHJlczogYW55KSB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCByZXEuY2xpZW50LmdldEFsbFVucmVhZE1lc3NhZ2VzKCk7XG4gICAgcmV0dXJuIHJlcy5zdGF0dXMoMjAwKS5qc29uKHsgc3RhdHVzOiAnc3VjY2VzcycsIHJlc3BvbnNlOiByZXNwb25zZSB9KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJlcS5sb2dnZXIuZXJyb3IoZSk7XG4gICAgcmV0dXJuIHJlcy5zdGF0dXMoNTAwKS5qc29uKHtcbiAgICAgIHN0YXR1czogJ2Vycm9yJyxcbiAgICAgIG1lc3NhZ2U6ICdFcnJvciBvbiBnZXQgYWxsIG1lc3NhZ2VzIGluIGNoYXQnLFxuICAgICAgZXJyb3I6IGUsXG4gICAgfSk7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldENoYXRCeUlkKHJlcTogUmVxdWVzdCwgcmVzOiBhbnkpIHtcbiAgY29uc3QgeyBwaG9uZSB9ID0gcmVxLnBhcmFtcztcbiAgY29uc3QgeyBpc0dyb3VwIH0gPSByZXEucXVlcnk7XG5cbiAgdHJ5IHtcbiAgICBsZXQgcmVzdWx0ID0ge30gYXMgQ2hhdDtcbiAgICBpZiAoaXNHcm91cCkge1xuICAgICAgcmVzdWx0ID0gYXdhaXQgcmVxLmNsaWVudC5nZXRDaGF0QnlJZChgJHtwaG9uZX1AZy51c2ApO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQgPSBhd2FpdCByZXEuY2xpZW50LmdldENoYXRCeUlkKGAke3Bob25lfUBjLnVzYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlcy5zdGF0dXMoMjAwKS5qc29uKHJlc3VsdCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXEubG9nZ2VyLmVycm9yKGUpO1xuICAgIHJldHVybiByZXMuc3RhdHVzKDUwMCkuanNvbih7XG4gICAgICBzdGF0dXM6ICdlcnJvcicsXG4gICAgICBtZXNzYWdlOiAnRXJyb3IgY2hhbmdpbmcgY2hhdCBieSBJZCcsXG4gICAgICBlcnJvcjogZSxcbiAgICB9KTtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0TWVzc2FnZUJ5SWQocmVxOiBSZXF1ZXN0LCByZXM6IGFueSkge1xuICBjb25zdCBzZXNzaW9uID0gcmVxLnNlc3Npb247XG4gIGNvbnN0IHsgbWVzc2FnZUlkIH0gPSByZXEucGFyYW1zO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVxLmNsaWVudC5nZXRNZXNzYWdlQnlJZChtZXNzYWdlSWQpO1xuXG4gICAgcmV0dXJuU3VjZXNzKHJlcywgc2Vzc2lvbiwgKHJlc3VsdCBhcyBhbnkpLmNoYXRJZC51c2VyLCByZXN1bHQpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybkVycm9yKHJlcSwgcmVzLCBzZXNzaW9uLCBlcnJvcik7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEJhdHRlcnlMZXZlbChyZXE6IFJlcXVlc3QsIHJlczogYW55KSB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCByZXEuY2xpZW50LmdldEJhdHRlcnlMZXZlbCgpO1xuICAgIHJldHVybiByZXMuc3RhdHVzKDIwMCkuanNvbih7IHN0YXR1czogJ1N1Y2Nlc3MnLCByZXNwb25zZTogcmVzcG9uc2UgfSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXEubG9nZ2VyLmVycm9yKGUpO1xuICAgIHJldHVybiByZXMuc3RhdHVzKDUwMCkuanNvbih7XG4gICAgICBzdGF0dXM6ICdlcnJvcicsXG4gICAgICBtZXNzYWdlOiAnRXJyb3IgcmV0cmlldmluZyBiYXR0ZXJ5IHN0YXR1cycsXG4gICAgICBlcnJvcjogZSxcbiAgICB9KTtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0SG9zdERldmljZShyZXE6IFJlcXVlc3QsIHJlczogYW55KSB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCByZXEuY2xpZW50LmdldEhvc3REZXZpY2UoKTtcbiAgICBjb25zdCBwaG9uZU51bWJlciA9IGF3YWl0IHJlcS5jbGllbnQuZ2V0V2lkKCk7XG4gICAgcmV0dXJuIHJlcy5zdGF0dXMoMjAwKS5qc29uKHtcbiAgICAgIHN0YXR1czogJ3N1Y2Nlc3MnLFxuICAgICAgcmVzcG9uc2U6IHsgLi4ucmVzcG9uc2UsIHBob25lTnVtYmVyIH0sXG4gICAgICBtYXBwZXI6ICdkZXZpY2UnLFxuICAgIH0pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmVxLmxvZ2dlci5lcnJvcihlKTtcbiAgICByZXR1cm4gcmVzLnN0YXR1cyg1MDApLmpzb24oe1xuICAgICAgc3RhdHVzOiAnZXJyb3InLFxuICAgICAgbWVzc2FnZTogJ0Vycm8gYW8gcmVjdXBlcmFyIGRhZG9zIGRvIHRlbGVmb25lJyxcbiAgICAgIGVycm9yOiBlLFxuICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRQaG9uZU51bWJlcihyZXE6IFJlcXVlc3QsIHJlczogYW55KSB7XG4gIHRyeSB7XG4gICAgY29uc3QgcGhvbmVOdW1iZXIgPSBhd2FpdCByZXEuY2xpZW50LmdldFdpZCgpO1xuICAgIHJldHVybiByZXNcbiAgICAgIC5zdGF0dXMoMjAwKVxuICAgICAgLmpzb24oeyBzdGF0dXM6ICdzdWNjZXNzJywgcmVzcG9uc2U6IHBob25lTnVtYmVyLCBtYXBwZXI6ICdkZXZpY2UnIH0pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmVxLmxvZ2dlci5lcnJvcihlKTtcbiAgICByZXR1cm4gcmVzLnN0YXR1cyg1MDApLmpzb24oe1xuICAgICAgc3RhdHVzOiAnZXJyb3InLFxuICAgICAgbWVzc2FnZTogJ0Vycm9yIHJldHJpZXZpbmcgcGhvbmUgbnVtYmVyJyxcbiAgICAgIGVycm9yOiBlLFxuICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRCbG9ja0xpc3QocmVxOiBSZXF1ZXN0LCByZXM6IGFueSkge1xuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHJlcS5jbGllbnQuZ2V0QmxvY2tMaXN0KCk7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBibG9ja2VkID0gcmVzcG9uc2UubWFwKChjb250YXRvOiBhbnkpID0+IHtcbiAgICAgIHJldHVybiB7IHBob25lOiBjb250YXRvID8gY29udGF0by5zcGxpdCgnQCcpWzBdIDogJycgfTtcbiAgICB9KTtcblxuICAgIHJldHVybiByZXMuc3RhdHVzKDIwMCkuanNvbih7IHN0YXR1czogJ3N1Y2Nlc3MnLCByZXNwb25zZTogYmxvY2tlZCB9KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJlcS5sb2dnZXIuZXJyb3IoZSk7XG4gICAgcmV0dXJuIHJlcy5zdGF0dXMoNTAwKS5qc29uKHtcbiAgICAgIHN0YXR1czogJ2Vycm9yJyxcbiAgICAgIG1lc3NhZ2U6ICdFcnJvciByZXRyaWV2aW5nIGJsb2NrZWQgY29udGFjdCBsaXN0JyxcbiAgICAgIGVycm9yOiBlLFxuICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWxldGVDaGF0KHJlcTogUmVxdWVzdCwgcmVzOiBhbnkpIHtcbiAgY29uc3QgeyBwaG9uZSB9ID0gcmVxLmJvZHk7XG4gIGNvbnN0IHNlc3Npb24gPSByZXEuc2Vzc2lvbjtcblxuICB0cnkge1xuICAgIGNvbnN0IHJlc3VsdHM6IGFueSA9IHt9O1xuICAgIGZvciAoY29uc3QgY29udGF0byBvZiBwaG9uZSkge1xuICAgICAgcmVzdWx0c1tjb250YXRvXSA9IGF3YWl0IHJlcS5jbGllbnQuZGVsZXRlQ2hhdChjb250YXRvKTtcbiAgICB9XG4gICAgcmV0dXJuU3VjZXNzKHJlcywgc2Vzc2lvbiwgcGhvbmUsIHJlc3VsdHMpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybkVycm9yKHJlcSwgcmVzLCBzZXNzaW9uLCBlcnJvcik7XG4gIH1cbn1cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWxldGVBbGxDaGF0cyhyZXE6IFJlcXVlc3QsIHJlczogYW55KSB7XG4gIHRyeSB7XG4gICAgY29uc3QgY2hhdHMgPSBhd2FpdCByZXEuY2xpZW50LmdldEFsbENoYXRzKCk7XG4gICAgZm9yIChjb25zdCBjaGF0IG9mIGNoYXRzKSB7XG4gICAgICBhd2FpdCByZXEuY2xpZW50LmRlbGV0ZUNoYXQoKGNoYXQgYXMgYW55KS5jaGF0SWQpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzLnN0YXR1cygyMDApLmpzb24oeyBzdGF0dXM6ICdzdWNjZXNzJyB9KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXEubG9nZ2VyLmVycm9yKGVycm9yKTtcbiAgICByZXR1cm4gcmVzLnN0YXR1cyg1MDApLmpzb24oe1xuICAgICAgc3RhdHVzOiAnZXJyb3InLFxuICAgICAgbWVzc2FnZTogJ0Vycm9yIG9uIGRlbGV0ZSBhbGwgY2hhdHMnLFxuICAgICAgZXJyb3I6IGVycm9yLFxuICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjbGVhckNoYXQocmVxOiBSZXF1ZXN0LCByZXM6IGFueSkge1xuICBjb25zdCB7IHBob25lIH0gPSByZXEuYm9keTtcbiAgY29uc3Qgc2Vzc2lvbiA9IHJlcS5zZXNzaW9uO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgcmVzdWx0czogYW55ID0ge307XG4gICAgZm9yIChjb25zdCBjb250YXRvIG9mIHBob25lKSB7XG4gICAgICByZXN1bHRzW2NvbnRhdG9dID0gYXdhaXQgcmVxLmNsaWVudC5jbGVhckNoYXQoY29udGF0byk7XG4gICAgfVxuICAgIHJldHVyblN1Y2VzcyhyZXMsIHNlc3Npb24sIHBob25lLCByZXN1bHRzKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm5FcnJvcihyZXEsIHJlcywgc2Vzc2lvbiwgZXJyb3IpO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjbGVhckFsbENoYXRzKHJlcTogUmVxdWVzdCwgcmVzOiBhbnkpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBjaGF0cyA9IGF3YWl0IHJlcS5jbGllbnQuZ2V0QWxsQ2hhdHMoKTtcbiAgICBmb3IgKGNvbnN0IGNoYXQgb2YgY2hhdHMpIHtcbiAgICAgIGF3YWl0IHJlcS5jbGllbnQuY2xlYXJDaGF0KGAkeyhjaGF0IGFzIGFueSkuY2hhdElkfWApO1xuICAgIH1cbiAgICByZXR1cm4gcmVzLnN0YXR1cygyMDEpLmpzb24oeyBzdGF0dXM6ICdzdWNjZXNzJyB9KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJlcS5sb2dnZXIuZXJyb3IoZSk7XG4gICAgcmV0dXJuIHJlc1xuICAgICAgLnN0YXR1cyg1MDApXG4gICAgICAuanNvbih7IHN0YXR1czogJ2Vycm9yJywgbWVzc2FnZTogJ0Vycm9yIG9uIGNsZWFyIGFsbCBjaGF0cycsIGVycm9yOiBlIH0pO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhcmNoaXZlQ2hhdChyZXE6IFJlcXVlc3QsIHJlczogYW55KSB7XG4gIGNvbnN0IHsgcGhvbmUsIHZhbHVlID0gdHJ1ZSB9ID0gcmVxLmJvZHk7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHJlcS5jbGllbnQuYXJjaGl2ZUNoYXQoYCR7cGhvbmV9YCwgdmFsdWUpO1xuICAgIHJldHVybiByZXMuc3RhdHVzKDIwMSkuanNvbih7IHN0YXR1czogJ3N1Y2Nlc3MnLCByZXNwb25zZTogcmVzcG9uc2UgfSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXEubG9nZ2VyLmVycm9yKGUpO1xuICAgIHJldHVybiByZXNcbiAgICAgIC5zdGF0dXMoNTAwKVxuICAgICAgLmpzb24oeyBzdGF0dXM6ICdlcnJvcicsIG1lc3NhZ2U6ICdFcnJvciBvbiBhcmNoaXZlIGNoYXQnLCBlcnJvcjogZSB9KTtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYXJjaGl2ZUFsbENoYXRzKHJlcTogUmVxdWVzdCwgcmVzOiBhbnkpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBjaGF0cyA9IGF3YWl0IHJlcS5jbGllbnQuZ2V0QWxsQ2hhdHMoKTtcbiAgICBmb3IgKGNvbnN0IGNoYXQgb2YgY2hhdHMpIHtcbiAgICAgIGF3YWl0IHJlcS5jbGllbnQuYXJjaGl2ZUNoYXQoYCR7KGNoYXQgYXMgYW55KS5jaGF0SWR9YCwgdHJ1ZSk7XG4gICAgfVxuICAgIHJldHVybiByZXMuc3RhdHVzKDIwMSkuanNvbih7IHN0YXR1czogJ3N1Y2Nlc3MnIH0pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmVxLmxvZ2dlci5lcnJvcihlKTtcbiAgICByZXR1cm4gcmVzLnN0YXR1cyg1MDApLmpzb24oe1xuICAgICAgc3RhdHVzOiAnZXJyb3InLFxuICAgICAgbWVzc2FnZTogJ0Vycm9yIG9uIGFyY2hpdmUgYWxsIGNoYXRzJyxcbiAgICAgIGVycm9yOiBlLFxuICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWxldGVNZXNzYWdlKHJlcTogUmVxdWVzdCwgcmVzOiBhbnkpIHtcbiAgY29uc3QgeyBwaG9uZSwgbWVzc2FnZUlkIH0gPSByZXEuYm9keTtcblxuICB0cnkge1xuICAgIGF3YWl0IHJlcS5jbGllbnQuZGVsZXRlTWVzc2FnZShgJHtwaG9uZX1gLCBbbWVzc2FnZUlkXSk7XG5cbiAgICByZXR1cm4gcmVzXG4gICAgICAuc3RhdHVzKDIwMClcbiAgICAgIC5qc29uKHsgc3RhdHVzOiAnc3VjY2VzcycsIHJlc3BvbnNlOiB7IG1lc3NhZ2U6ICdNZXNzYWdlIGRlbGV0ZWQnIH0gfSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXEubG9nZ2VyLmVycm9yKGUpO1xuICAgIHJldHVybiByZXNcbiAgICAgIC5zdGF0dXMoNTAwKVxuICAgICAgLmpzb24oeyBzdGF0dXM6ICdlcnJvcicsIG1lc3NhZ2U6ICdFcnJvciBvbiBkZWxldGUgbWVzc2FnZScsIGVycm9yOiBlIH0pO1xuICB9XG59XG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVhY3RNZXNzYWdlKHJlcTogUmVxdWVzdCwgcmVzOiBhbnkpIHtcbiAgY29uc3QgeyBtc2dJZCwgcmVhY3Rpb24gfSA9IHJlcS5ib2R5O1xuXG4gIHRyeSB7XG4gICAgYXdhaXQgcmVxLmNsaWVudC5zZW5kUmVhY3Rpb25Ub01lc3NhZ2UobXNnSWQsIHJlYWN0aW9uKTtcblxuICAgIHJldHVybiByZXNcbiAgICAgIC5zdGF0dXMoMjAwKVxuICAgICAgLmpzb24oeyBzdGF0dXM6ICdzdWNjZXNzJywgcmVzcG9uc2U6IHsgbWVzc2FnZTogJ1JlYWN0aW9uIHNlbmRlZCcgfSB9KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJlcS5sb2dnZXIuZXJyb3IoZSk7XG4gICAgcmV0dXJuIHJlcy5zdGF0dXMoNTAwKS5qc29uKHtcbiAgICAgIHN0YXR1czogJ2Vycm9yJyxcbiAgICAgIG1lc3NhZ2U6ICdFcnJvciBvbiBzZW5kIHJlYWN0aW9uIHRvIG1lc3NhZ2UnLFxuICAgICAgZXJyb3I6IGUsXG4gICAgfSk7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlcGx5KHJlcTogUmVxdWVzdCwgcmVzOiBhbnkpIHtcbiAgY29uc3QgeyBwaG9uZSwgdGV4dCwgbWVzc2FnZWlkIH0gPSByZXEuYm9keTtcblxuICB0cnkge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgcmVxLmNsaWVudC5yZXBseShgJHtwaG9uZX1AYy51c2AsIHRleHQsIG1lc3NhZ2VpZCk7XG4gICAgcmV0dXJuIHJlcy5zdGF0dXMoMjAwKS5qc29uKHsgc3RhdHVzOiAnc3VjY2VzcycsIHJlc3BvbnNlOiByZXNwb25zZSB9KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJlcS5sb2dnZXIuZXJyb3IoZSk7XG4gICAgcmV0dXJuIHJlc1xuICAgICAgLnN0YXR1cyg1MDApXG4gICAgICAuanNvbih7IHN0YXR1czogJ2Vycm9yJywgbWVzc2FnZTogJ0Vycm9yIHJlcGx5aW5nIG1lc3NhZ2UnLCBlcnJvcjogZSB9KTtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZm9yd2FyZE1lc3NhZ2VzKHJlcTogUmVxdWVzdCwgcmVzOiBhbnkpIHtcbiAgY29uc3QgeyBwaG9uZSwgbWVzc2FnZUlkLCBpc0dyb3VwID0gZmFsc2UgfSA9IHJlcS5ib2R5O1xuXG4gIHRyeSB7XG4gICAgbGV0IHJlc3BvbnNlO1xuXG4gICAgaWYgKCFpc0dyb3VwKSB7XG4gICAgICByZXNwb25zZSA9IGF3YWl0IHJlcS5jbGllbnQuZm9yd2FyZE1lc3NhZ2VzKFxuICAgICAgICBgJHtwaG9uZX1gLFxuICAgICAgICBbbWVzc2FnZUlkXSxcbiAgICAgICAgZmFsc2VcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3BvbnNlID0gYXdhaXQgcmVxLmNsaWVudC5mb3J3YXJkTWVzc2FnZXMoXG4gICAgICAgIGAke3Bob25lfWAsXG4gICAgICAgIFttZXNzYWdlSWRdLFxuICAgICAgICBmYWxzZVxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzLnN0YXR1cygyMDEpLmpzb24oeyBzdGF0dXM6ICdzdWNjZXNzJywgcmVzcG9uc2U6IHJlc3BvbnNlIH0pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmVxLmxvZ2dlci5lcnJvcihlKTtcbiAgICByZXR1cm4gcmVzXG4gICAgICAuc3RhdHVzKDUwMClcbiAgICAgIC5qc29uKHsgc3RhdHVzOiAnZXJyb3InLCBtZXNzYWdlOiAnRXJyb3IgZm9yd2FyZGluZyBtZXNzYWdlJywgZXJyb3I6IGUgfSk7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG1hcmtVbnNlZW5NZXNzYWdlKHJlcTogUmVxdWVzdCwgcmVzOiBhbnkpIHtcbiAgY29uc3QgeyBwaG9uZSB9ID0gcmVxLmJvZHk7XG5cbiAgdHJ5IHtcbiAgICBhd2FpdCByZXEuY2xpZW50Lm1hcmtVbnNlZW5NZXNzYWdlKGAke3Bob25lfWApO1xuICAgIHJldHVybiByZXNcbiAgICAgIC5zdGF0dXMoMjAwKVxuICAgICAgLmpzb24oeyBzdGF0dXM6ICdzdWNjZXNzJywgcmVzcG9uc2U6IHsgbWVzc2FnZTogJ3Vuc2VlbiBjaGVja2VkJyB9IH0pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmVxLmxvZ2dlci5lcnJvcihlKTtcbiAgICByZXR1cm4gcmVzXG4gICAgICAuc3RhdHVzKDUwMClcbiAgICAgIC5qc29uKHsgc3RhdHVzOiAnZXJyb3InLCBtZXNzYWdlOiAnRXJyb3Igb24gbWFyayB1bnNlZW4nLCBlcnJvcjogZSB9KTtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYmxvY2tDb250YWN0KHJlcTogUmVxdWVzdCwgcmVzOiBhbnkpIHtcbiAgY29uc3QgeyBwaG9uZSB9ID0gcmVxLmJvZHk7XG5cbiAgdHJ5IHtcbiAgICBhd2FpdCByZXEuY2xpZW50LmJsb2NrQ29udGFjdChgJHtwaG9uZX1gKTtcbiAgICByZXR1cm4gcmVzXG4gICAgICAuc3RhdHVzKDIwMClcbiAgICAgIC5qc29uKHsgc3RhdHVzOiAnc3VjY2VzcycsIHJlc3BvbnNlOiB7IG1lc3NhZ2U6ICdDb250YWN0IGJsb2NrZWQnIH0gfSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXEubG9nZ2VyLmVycm9yKGUpO1xuICAgIHJldHVybiByZXNcbiAgICAgIC5zdGF0dXMoNTAwKVxuICAgICAgLmpzb24oeyBzdGF0dXM6ICdlcnJvcicsIG1lc3NhZ2U6ICdFcnJvciBvbiBibG9jayBjb250YWN0JywgZXJyb3I6IGUgfSk7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHVuYmxvY2tDb250YWN0KHJlcTogUmVxdWVzdCwgcmVzOiBhbnkpIHtcbiAgY29uc3QgeyBwaG9uZSB9ID0gcmVxLmJvZHk7XG5cbiAgdHJ5IHtcbiAgICBhd2FpdCByZXEuY2xpZW50LnVuYmxvY2tDb250YWN0KGAke3Bob25lfWApO1xuICAgIHJldHVybiByZXNcbiAgICAgIC5zdGF0dXMoMjAwKVxuICAgICAgLmpzb24oeyBzdGF0dXM6ICdzdWNjZXNzJywgcmVzcG9uc2U6IHsgbWVzc2FnZTogJ0NvbnRhY3QgVW5CbG9ja2VkJyB9IH0pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmVxLmxvZ2dlci5lcnJvcihlKTtcbiAgICByZXR1cm4gcmVzXG4gICAgICAuc3RhdHVzKDUwMClcbiAgICAgIC5qc29uKHsgc3RhdHVzOiAnZXJyb3InLCBtZXNzYWdlOiAnRXJyb3Igb24gdW5sb2NrIGNvbnRhY3QnLCBlcnJvcjogZSB9KTtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcGluQ2hhdChyZXE6IFJlcXVlc3QsIHJlczogYW55KSB7XG4gIGNvbnN0IHsgcGhvbmUsIHN0YXRlIH0gPSByZXEuYm9keTtcblxuICB0cnkge1xuICAgIGZvciAoY29uc3QgY29udGF0byBvZiBwaG9uZSkge1xuICAgICAgYXdhaXQgcmVxLmNsaWVudC5waW5DaGF0KGNvbnRhdG8sIHN0YXRlID09PSAndHJ1ZScsIGZhbHNlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzXG4gICAgICAuc3RhdHVzKDIwMClcbiAgICAgIC5qc29uKHsgc3RhdHVzOiAnc3VjY2VzcycsIHJlc3BvbnNlOiB7IG1lc3NhZ2U6ICdDaGF0IGZpeGVkJyB9IH0pO1xuICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICByZXEubG9nZ2VyLmVycm9yKGUpO1xuICAgIHJldHVybiByZXMuc3RhdHVzKDUwMCkuanNvbih7XG4gICAgICBzdGF0dXM6ICdlcnJvcicsXG4gICAgICBtZXNzYWdlOiBlLnRleHQgfHwgJ0Vycm9yIG9uIHBpbiBjaGF0JyxcbiAgICAgIGVycm9yOiBlLFxuICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXRQcm9maWxlUGljKHJlcTogUmVxdWVzdCwgcmVzOiBhbnkpIHtcbiAgaWYgKCFyZXEuZmlsZSlcbiAgICByZXR1cm4gcmVzXG4gICAgICAuc3RhdHVzKDQwMClcbiAgICAgIC5qc29uKHsgc3RhdHVzOiAnRXJyb3InLCBtZXNzYWdlOiAnRmlsZSBwYXJhbWV0ZXIgaXMgcmVxdWlyZWQhJyB9KTtcblxuICB0cnkge1xuICAgIGNvbnN0IHsgcGF0aDogcGF0aEZpbGUgfSA9IHJlcS5maWxlO1xuXG4gICAgYXdhaXQgcmVxLmNsaWVudC5zZXRQcm9maWxlUGljKHBhdGhGaWxlKTtcbiAgICBhd2FpdCB1bmxpbmtBc3luYyhwYXRoRmlsZSk7XG5cbiAgICByZXR1cm4gcmVzLnN0YXR1cygyMDApLmpzb24oe1xuICAgICAgc3RhdHVzOiAnc3VjY2VzcycsXG4gICAgICByZXNwb25zZTogeyBtZXNzYWdlOiAnUHJvZmlsZSBwaG90byBzdWNjZXNzZnVsbHkgY2hhbmdlZCcgfSxcbiAgICB9KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJlcS5sb2dnZXIuZXJyb3IoZSk7XG4gICAgcmV0dXJuIHJlcy5zdGF0dXMoNTAwKS5qc29uKHtcbiAgICAgIHN0YXR1czogJ2Vycm9yJyxcbiAgICAgIG1lc3NhZ2U6ICdFcnJvciBjaGFuZ2luZyBwcm9maWxlIHBob3RvJyxcbiAgICAgIGVycm9yOiBlLFxuICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRVbnJlYWRNZXNzYWdlcyhyZXE6IFJlcXVlc3QsIHJlczogYW55KSB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCByZXEuY2xpZW50LmdldFVucmVhZE1lc3NhZ2VzKGZhbHNlLCBmYWxzZSwgdHJ1ZSk7XG4gICAgcmV0dXJuIHJlcy5zdGF0dXMoMjAwKS5qc29uKHsgc3RhdHVzOiAnc3VjY2VzcycsIHJlc3BvbnNlOiByZXNwb25zZSB9KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJlcS5sb2dnZXIuZXJyb3IoZSk7XG4gICAgcmV0dXJuIHJlc1xuICAgICAgLnN0YXR1cyg1MDApXG4gICAgICAuanNvbih7IHN0YXR1czogJ2Vycm9yJywgcmVzcG9uc2U6ICdFcnJvciBvbiBvcGVuIGxpc3QnLCBlcnJvcjogZSB9KTtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0Q2hhdElzT25saW5lKHJlcTogUmVxdWVzdCwgcmVzOiBhbnkpIHtcbiAgY29uc3QgeyBwaG9uZSB9ID0gcmVxLnBhcmFtcztcbiAgdHJ5IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHJlcS5jbGllbnQuZ2V0Q2hhdElzT25saW5lKGAke3Bob25lfUBjLnVzYCk7XG4gICAgcmV0dXJuIHJlcy5zdGF0dXMoMjAwKS5qc29uKHsgc3RhdHVzOiAnc3VjY2VzcycsIHJlc3BvbnNlOiByZXNwb25zZSB9KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJlcS5sb2dnZXIuZXJyb3IoZSk7XG4gICAgcmV0dXJuIHJlcy5zdGF0dXMoNTAwKS5qc29uKHtcbiAgICAgIHN0YXR1czogJ2Vycm9yJyxcbiAgICAgIHJlc3BvbnNlOiAnRXJyb3Igb24gZ2V0IGNoYXQgaXMgb25saW5lJyxcbiAgICAgIGVycm9yOiBlLFxuICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRMYXN0U2VlbihyZXE6IFJlcXVlc3QsIHJlczogYW55KSB7XG4gIGNvbnN0IHsgcGhvbmUgfSA9IHJlcS5wYXJhbXM7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCByZXEuY2xpZW50LmdldExhc3RTZWVuKGAke3Bob25lfUBjLnVzYCk7XG5cbiAgICByZXR1cm4gcmVzLnN0YXR1cygyMDApLmpzb24oeyBzdGF0dXM6ICdzdWNjZXNzJywgcmVzcG9uc2U6IHJlc3BvbnNlIH0pO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJlcS5sb2dnZXIuZXJyb3IoZXJyb3IpO1xuICAgIHJldHVybiByZXMuc3RhdHVzKDUwMCkuanNvbih7XG4gICAgICBzdGF0dXM6ICdlcnJvcicsXG4gICAgICByZXNwb25zZTogJ0Vycm9yIG9uIGdldCBjaGF0IGxhc3Qgc2VlbicsXG4gICAgICBlcnJvcjogZXJyb3IsXG4gICAgfSk7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldExpc3RNdXRlcyhyZXE6IFJlcXVlc3QsIHJlczogYW55KSB7XG4gIGNvbnN0IHsgdHlwZSA9ICdhbGwnIH0gPSByZXEucGFyYW1zO1xuICB0cnkge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgcmVxLmNsaWVudC5nZXRMaXN0TXV0ZXModHlwZSk7XG5cbiAgICByZXR1cm4gcmVzLnN0YXR1cygyMDApLmpzb24oeyBzdGF0dXM6ICdzdWNjZXNzJywgcmVzcG9uc2U6IHJlc3BvbnNlIH0pO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJlcS5sb2dnZXIuZXJyb3IoZXJyb3IpO1xuICAgIHJldHVybiByZXMuc3RhdHVzKDUwMCkuanNvbih7XG4gICAgICBzdGF0dXM6ICdlcnJvcicsXG4gICAgICByZXNwb25zZTogJ0Vycm9yIG9uIGdldCBsaXN0IG11dGVzJyxcbiAgICAgIGVycm9yOiBlcnJvcixcbiAgICB9KTtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZEFuZEdldEFsbE1lc3NhZ2VzSW5DaGF0KHJlcTogUmVxdWVzdCwgcmVzOiBhbnkpIHtcbiAgY29uc3QgeyBwaG9uZSwgaW5jbHVkZU1lID0gdHJ1ZSwgaW5jbHVkZU5vdGlmaWNhdGlvbnMgPSBmYWxzZSB9ID0gcmVxLnBhcmFtcztcbiAgdHJ5IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHJlcS5jbGllbnQubG9hZEFuZEdldEFsbE1lc3NhZ2VzSW5DaGF0KFxuICAgICAgYCR7cGhvbmV9QGMudXNgLFxuICAgICAgaW5jbHVkZU1lIGFzIGJvb2xlYW4sXG4gICAgICBpbmNsdWRlTm90aWZpY2F0aW9ucyBhcyBib29sZWFuXG4gICAgKTtcblxuICAgIHJldHVybiByZXMuc3RhdHVzKDIwMCkuanNvbih7IHN0YXR1czogJ3N1Y2Nlc3MnLCByZXNwb25zZTogcmVzcG9uc2UgfSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmVxLmxvZ2dlci5lcnJvcihlcnJvcik7XG4gICAgcmV0dXJuIHJlc1xuICAgICAgLnN0YXR1cyg1MDApXG4gICAgICAuanNvbih7IHN0YXR1czogJ2Vycm9yJywgcmVzcG9uc2U6ICdFcnJvciBvbiBvcGVuIGxpc3QnLCBlcnJvcjogZXJyb3IgfSk7XG4gIH1cbn1cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRNZXNzYWdlcyhyZXE6IFJlcXVlc3QsIHJlczogYW55KSB7XG4gIGNvbnN0IHsgcGhvbmUgfSA9IHJlcS5wYXJhbXM7XG4gIGNvbnN0IHsgY291bnQgPSAyMCwgZGlyZWN0aW9uID0gJ2JlZm9yZScsIGlkID0gbnVsbCB9ID0gcmVxLnF1ZXJ5O1xuICB0cnkge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgcmVxLmNsaWVudC5nZXRNZXNzYWdlcyhgJHtwaG9uZX1gLCB7XG4gICAgICBjb3VudDogcGFyc2VJbnQoY291bnQgYXMgc3RyaW5nKSxcbiAgICAgIGRpcmVjdGlvbjogZGlyZWN0aW9uLnRvU3RyaW5nKCkgYXMgYW55LFxuICAgICAgaWQ6IGlkIGFzIHN0cmluZyxcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzLnN0YXR1cygyMDApLmpzb24oeyBzdGF0dXM6ICdzdWNjZXNzJywgcmVzcG9uc2U6IHJlc3BvbnNlIH0pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmVxLmxvZ2dlci5lcnJvcihlKTtcbiAgICByZXR1cm4gcmVzXG4gICAgICAuc3RhdHVzKDQwMSlcbiAgICAgIC5qc29uKHsgc3RhdHVzOiAnZXJyb3InLCByZXNwb25zZTogJ0Vycm9yIG9uIG9wZW4gbGlzdCcsIGVycm9yOiBlIH0pO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZW5kQ29udGFjdFZjYXJkKHJlcTogUmVxdWVzdCwgcmVzOiBhbnkpIHtcbiAgY29uc3QgeyBwaG9uZSwgY29udGFjdHNJZCwgbmFtZSA9IG51bGwsIGlzR3JvdXAgPSBmYWxzZSB9ID0gcmVxLmJvZHk7XG4gIHRyeSB7XG4gICAgbGV0IHJlc3BvbnNlO1xuICAgIGZvciAoY29uc3QgY29udGF0byBvZiBjb250YWN0VG9BcnJheShwaG9uZSwgaXNHcm91cCkpIHtcbiAgICAgIHJlc3BvbnNlID0gYXdhaXQgcmVxLmNsaWVudC5zZW5kQ29udGFjdFZjYXJkKFxuICAgICAgICBgJHtjb250YXRvfWAsXG4gICAgICAgIGNvbnRhY3RzSWQsXG4gICAgICAgIG5hbWVcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlcy5zdGF0dXMoMjAwKS5qc29uKHsgc3RhdHVzOiAnc3VjY2VzcycsIHJlc3BvbnNlOiByZXNwb25zZSB9KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXEubG9nZ2VyLmVycm9yKGVycm9yKTtcbiAgICByZXR1cm4gcmVzLnN0YXR1cyg1MDApLmpzb24oe1xuICAgICAgc3RhdHVzOiAnZXJyb3InLFxuICAgICAgbWVzc2FnZTogJ0Vycm9yIG9uIHNlbmQgY29udGFjdCB2Y2FyZCcsXG4gICAgICBlcnJvcjogZXJyb3IsXG4gICAgfSk7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNlbmRNdXRlKHJlcTogUmVxdWVzdCwgcmVzOiBhbnkpIHtcbiAgY29uc3QgeyBwaG9uZSwgdGltZSwgdHlwZSA9ICdob3VycycsIGlzR3JvdXAgPSBmYWxzZSB9ID0gcmVxLmJvZHk7XG5cbiAgdHJ5IHtcbiAgICBsZXQgcmVzcG9uc2U7XG4gICAgZm9yIChjb25zdCBjb250YXRvIG9mIGNvbnRhY3RUb0FycmF5KHBob25lLCBpc0dyb3VwKSkge1xuICAgICAgcmVzcG9uc2UgPSBhd2FpdCByZXEuY2xpZW50LnNlbmRNdXRlKGAke2NvbnRhdG99YCwgdGltZSwgdHlwZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlcy5zdGF0dXMoMjAwKS5qc29uKHsgc3RhdHVzOiAnc3VjY2VzcycsIHJlc3BvbnNlOiByZXNwb25zZSB9KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXEubG9nZ2VyLmVycm9yKGVycm9yKTtcbiAgICByZXR1cm4gcmVzXG4gICAgICAuc3RhdHVzKDUwMClcbiAgICAgIC5qc29uKHsgc3RhdHVzOiAnZXJyb3InLCBtZXNzYWdlOiAnRXJyb3Igb24gc2VuZCBtdXRlJywgZXJyb3I6IGVycm9yIH0pO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZW5kU2VlbihyZXE6IFJlcXVlc3QsIHJlczogYW55KSB7XG4gIGNvbnN0IHsgcGhvbmUgfSA9IHJlcS5ib2R5O1xuICBjb25zdCBzZXNzaW9uID0gcmVxLnNlc3Npb247XG5cbiAgdHJ5IHtcbiAgICBjb25zdCByZXN1bHRzOiBhbnkgPSBbXTtcbiAgICBmb3IgKGNvbnN0IGNvbnRhdG8gb2YgcGhvbmUpIHtcbiAgICAgIHJlc3VsdHMucHVzaChhd2FpdCByZXEuY2xpZW50LnNlbmRTZWVuKGNvbnRhdG8pKTtcbiAgICB9XG4gICAgcmV0dXJuU3VjZXNzKHJlcywgc2Vzc2lvbiwgcGhvbmUsIHJlc3VsdHMpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybkVycm9yKHJlcSwgcmVzLCBzZXNzaW9uLCBlcnJvcik7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldENoYXRTdGF0ZShyZXE6IFJlcXVlc3QsIHJlczogYW55KSB7XG4gIGNvbnN0IHsgcGhvbmUsIGNoYXRzdGF0ZSwgaXNHcm91cCA9IGZhbHNlIH0gPSByZXEuYm9keTtcblxuICB0cnkge1xuICAgIGxldCByZXNwb25zZTtcbiAgICBmb3IgKGNvbnN0IGNvbnRhdG8gb2YgY29udGFjdFRvQXJyYXkocGhvbmUsIGlzR3JvdXApKSB7XG4gICAgICByZXNwb25zZSA9IGF3YWl0IHJlcS5jbGllbnQuc2V0Q2hhdFN0YXRlKGAke2NvbnRhdG99YCwgY2hhdHN0YXRlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzLnN0YXR1cygyMDApLmpzb24oeyBzdGF0dXM6ICdzdWNjZXNzJywgcmVzcG9uc2U6IHJlc3BvbnNlIH0pO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJlcS5sb2dnZXIuZXJyb3IoZXJyb3IpO1xuICAgIHJldHVybiByZXMuc3RhdHVzKDUwMCkuanNvbih7XG4gICAgICBzdGF0dXM6ICdlcnJvcicsXG4gICAgICBtZXNzYWdlOiAnRXJyb3Igb24gc2VuZCBjaGF0IHN0YXRlJyxcbiAgICAgIGVycm9yOiBlcnJvcixcbiAgICB9KTtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2V0VGVtcG9yYXJ5TWVzc2FnZXMocmVxOiBSZXF1ZXN0LCByZXM6IGFueSkge1xuICBjb25zdCB7IHBob25lLCB2YWx1ZSA9IHRydWUsIGlzR3JvdXAgPSBmYWxzZSB9ID0gcmVxLmJvZHk7XG5cbiAgdHJ5IHtcbiAgICBsZXQgcmVzcG9uc2U7XG4gICAgZm9yIChjb25zdCBjb250YXRvIG9mIGNvbnRhY3RUb0FycmF5KHBob25lLCBpc0dyb3VwKSkge1xuICAgICAgcmVzcG9uc2UgPSBhd2FpdCByZXEuY2xpZW50LnNldFRlbXBvcmFyeU1lc3NhZ2VzKGAke2NvbnRhdG99YCwgdmFsdWUpO1xuICAgIH1cblxuICAgIHJldHVybiByZXMuc3RhdHVzKDIwMCkuanNvbih7IHN0YXR1czogJ3N1Y2Nlc3MnLCByZXNwb25zZTogcmVzcG9uc2UgfSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmVxLmxvZ2dlci5lcnJvcihlcnJvcik7XG4gICAgcmV0dXJuIHJlcy5zdGF0dXMoNTAwKS5qc29uKHtcbiAgICAgIHN0YXR1czogJ2Vycm9yJyxcbiAgICAgIG1lc3NhZ2U6ICdFcnJvciBvbiBzZXQgdGVtcG9yYXJ5IG1lc3NhZ2VzJyxcbiAgICAgIGVycm9yOiBlcnJvcixcbiAgICB9KTtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2V0VHlwaW5nKHJlcTogUmVxdWVzdCwgcmVzOiBhbnkpIHtcbiAgY29uc3QgeyBwaG9uZSwgdmFsdWUgPSB0cnVlLCBpc0dyb3VwID0gZmFsc2UgfSA9IHJlcS5ib2R5O1xuICB0cnkge1xuICAgIGxldCByZXNwb25zZTtcbiAgICBmb3IgKGNvbnN0IGNvbnRhdG8gb2YgY29udGFjdFRvQXJyYXkocGhvbmUsIGlzR3JvdXApKSB7XG4gICAgICBpZiAodmFsdWUpIHJlc3BvbnNlID0gYXdhaXQgcmVxLmNsaWVudC5zdGFydFR5cGluZyhjb250YXRvKTtcbiAgICAgIGVsc2UgcmVzcG9uc2UgPSBhd2FpdCByZXEuY2xpZW50LnN0b3BUeXBpbmcoY29udGF0byk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlcy5zdGF0dXMoMjAwKS5qc29uKHsgc3RhdHVzOiAnc3VjY2VzcycsIHJlc3BvbnNlOiByZXNwb25zZSB9KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXEubG9nZ2VyLmVycm9yKGVycm9yKTtcbiAgICByZXR1cm4gcmVzXG4gICAgICAuc3RhdHVzKDUwMClcbiAgICAgIC5qc29uKHsgc3RhdHVzOiAnZXJyb3InLCBtZXNzYWdlOiAnRXJyb3Igb24gc2V0IHR5cGluZycsIGVycm9yOiBlcnJvciB9KTtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2V0UmVjb3JkaW5nKHJlcTogUmVxdWVzdCwgcmVzOiBhbnkpIHtcbiAgY29uc3QgeyBwaG9uZSwgdmFsdWUgPSB0cnVlLCBkdXJhdGlvbiwgaXNHcm91cCA9IGZhbHNlIH0gPSByZXEuYm9keTtcbiAgdHJ5IHtcbiAgICBsZXQgcmVzcG9uc2U7XG4gICAgZm9yIChjb25zdCBjb250YXRvIG9mIGNvbnRhY3RUb0FycmF5KHBob25lLCBpc0dyb3VwKSkge1xuICAgICAgaWYgKHZhbHVlKSByZXNwb25zZSA9IGF3YWl0IHJlcS5jbGllbnQuc3RhcnRSZWNvcmRpbmcoY29udGF0bywgZHVyYXRpb24pO1xuICAgICAgZWxzZSByZXNwb25zZSA9IGF3YWl0IHJlcS5jbGllbnQuc3RvcFJlY29yaW5nKGNvbnRhdG8pO1xuICAgIH1cblxuICAgIHJldHVybiByZXMuc3RhdHVzKDIwMCkuanNvbih7IHN0YXR1czogJ3N1Y2Nlc3MnLCByZXNwb25zZTogcmVzcG9uc2UgfSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmVxLmxvZ2dlci5lcnJvcihlcnJvcik7XG4gICAgcmV0dXJuIHJlcy5zdGF0dXMoNTAwKS5qc29uKHtcbiAgICAgIHN0YXR1czogJ2Vycm9yJyxcbiAgICAgIG1lc3NhZ2U6ICdFcnJvciBvbiBzZXQgcmVjb3JkaW5nJyxcbiAgICAgIGVycm9yOiBlcnJvcixcbiAgICB9KTtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY2hlY2tOdW1iZXJTdGF0dXMocmVxOiBSZXF1ZXN0LCByZXM6IGFueSkge1xuICBjb25zdCB7IHBob25lIH0gPSByZXEucGFyYW1zO1xuICB0cnkge1xuICAgIGxldCByZXNwb25zZTtcbiAgICBmb3IgKGNvbnN0IGNvbnRhdG8gb2YgY29udGFjdFRvQXJyYXkocGhvbmUsIGZhbHNlKSkge1xuICAgICAgcmVzcG9uc2UgPSBhd2FpdCByZXEuY2xpZW50LmNoZWNrTnVtYmVyU3RhdHVzKGAke2NvbnRhdG99YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlcy5zdGF0dXMoMjAwKS5qc29uKHsgc3RhdHVzOiAnc3VjY2VzcycsIHJlc3BvbnNlOiByZXNwb25zZSB9KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXEubG9nZ2VyLmVycm9yKGVycm9yKTtcbiAgICByZXR1cm4gcmVzLnN0YXR1cyg1MDApLmpzb24oe1xuICAgICAgc3RhdHVzOiAnZXJyb3InLFxuICAgICAgbWVzc2FnZTogJ0Vycm9yIG9uIGNoZWNrIG51bWJlciBzdGF0dXMnLFxuICAgICAgZXJyb3I6IGVycm9yLFxuICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRDb250YWN0KHJlcTogUmVxdWVzdCwgcmVzOiBhbnkpIHtcbiAgY29uc3QgeyBwaG9uZSA9IHRydWUgfSA9IHJlcS5wYXJhbXM7XG4gIHRyeSB7XG4gICAgbGV0IHJlc3BvbnNlO1xuICAgIGZvciAoY29uc3QgY29udGF0byBvZiBjb250YWN0VG9BcnJheShwaG9uZSBhcyBzdHJpbmcsIGZhbHNlKSkge1xuICAgICAgcmVzcG9uc2UgPSBhd2FpdCByZXEuY2xpZW50LmdldENvbnRhY3QoY29udGF0byk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlcy5zdGF0dXMoMjAwKS5qc29uKHsgc3RhdHVzOiAnc3VjY2VzcycsIHJlc3BvbnNlOiByZXNwb25zZSB9KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXEubG9nZ2VyLmVycm9yKGVycm9yKTtcbiAgICByZXR1cm4gcmVzXG4gICAgICAuc3RhdHVzKDUwMClcbiAgICAgIC5qc29uKHsgc3RhdHVzOiAnZXJyb3InLCBtZXNzYWdlOiAnRXJyb3Igb24gZ2V0IGNvbnRhY3QnLCBlcnJvcjogZXJyb3IgfSk7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEFsbENvbnRhY3RzKHJlcTogUmVxdWVzdCwgcmVzOiBhbnkpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHJlcS5jbGllbnQuZ2V0QWxsQ29udGFjdHMoKTtcblxuICAgIHJldHVybiByZXMuc3RhdHVzKDIwMCkuanNvbih7IHN0YXR1czogJ3N1Y2Nlc3MnLCByZXNwb25zZTogcmVzcG9uc2UgfSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmVxLmxvZ2dlci5lcnJvcihlcnJvcik7XG4gICAgcmV0dXJuIHJlcy5zdGF0dXMoNTAwKS5qc29uKHtcbiAgICAgIHN0YXR1czogJ2Vycm9yJyxcbiAgICAgIG1lc3NhZ2U6ICdFcnJvciBvbiBnZXQgYWxsIGNvbnN0YWN0cycsXG4gICAgICBlcnJvcjogZXJyb3IsXG4gICAgfSk7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldE51bWJlclByb2ZpbGUocmVxOiBSZXF1ZXN0LCByZXM6IGFueSkge1xuICBjb25zdCB7IHBob25lID0gdHJ1ZSB9ID0gcmVxLnBhcmFtcztcbiAgdHJ5IHtcbiAgICBsZXQgcmVzcG9uc2U7XG4gICAgZm9yIChjb25zdCBjb250YXRvIG9mIGNvbnRhY3RUb0FycmF5KHBob25lIGFzIHN0cmluZywgZmFsc2UpKSB7XG4gICAgICByZXNwb25zZSA9IGF3YWl0IHJlcS5jbGllbnQuZ2V0TnVtYmVyUHJvZmlsZShjb250YXRvKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzLnN0YXR1cygyMDApLmpzb24oeyBzdGF0dXM6ICdzdWNjZXNzJywgcmVzcG9uc2U6IHJlc3BvbnNlIH0pO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJlcS5sb2dnZXIuZXJyb3IoZXJyb3IpO1xuICAgIHJldHVybiByZXMuc3RhdHVzKDUwMCkuanNvbih7XG4gICAgICBzdGF0dXM6ICdlcnJvcicsXG4gICAgICBtZXNzYWdlOiAnRXJyb3Igb24gZ2V0IG51bWJlciBwcm9maWxlJyxcbiAgICAgIGVycm9yOiBlcnJvcixcbiAgICB9KTtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0UHJvZmlsZVBpY0Zyb21TZXJ2ZXIocmVxOiBSZXF1ZXN0LCByZXM6IGFueSkge1xuICBjb25zdCB7IHBob25lID0gdHJ1ZSB9ID0gcmVxLnBhcmFtcztcbiAgdHJ5IHtcbiAgICBsZXQgcmVzcG9uc2U7XG4gICAgZm9yIChjb25zdCBjb250YXRvIG9mIGNvbnRhY3RUb0FycmF5KHBob25lIGFzIHN0cmluZywgZmFsc2UpKSB7XG4gICAgICByZXNwb25zZSA9IGF3YWl0IHJlcS5jbGllbnQuZ2V0UHJvZmlsZVBpY0Zyb21TZXJ2ZXIoY29udGF0byk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlcy5zdGF0dXMoMjAwKS5qc29uKHsgc3RhdHVzOiAnc3VjY2VzcycsIHJlc3BvbnNlOiByZXNwb25zZSB9KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXEubG9nZ2VyLmVycm9yKGVycm9yKTtcbiAgICByZXR1cm4gcmVzLnN0YXR1cyg1MDApLmpzb24oe1xuICAgICAgc3RhdHVzOiAnZXJyb3InLFxuICAgICAgbWVzc2FnZTogJ0Vycm9yIG9uICBnZXQgcHJvZmlsZSBwaWMnLFxuICAgICAgZXJyb3I6IGVycm9yLFxuICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRTdGF0dXMocmVxOiBSZXF1ZXN0LCByZXM6IGFueSkge1xuICBjb25zdCB7IHBob25lID0gdHJ1ZSB9ID0gcmVxLnBhcmFtcztcbiAgdHJ5IHtcbiAgICBsZXQgcmVzcG9uc2U7XG4gICAgZm9yIChjb25zdCBjb250YXRvIG9mIGNvbnRhY3RUb0FycmF5KHBob25lIGFzIHN0cmluZywgZmFsc2UpKSB7XG4gICAgICByZXNwb25zZSA9IGF3YWl0IHJlcS5jbGllbnQuZ2V0U3RhdHVzKGNvbnRhdG8pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzLnN0YXR1cygyMDApLmpzb24oeyBzdGF0dXM6ICdzdWNjZXNzJywgcmVzcG9uc2U6IHJlc3BvbnNlIH0pO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJlcS5sb2dnZXIuZXJyb3IoZXJyb3IpO1xuICAgIHJldHVybiByZXNcbiAgICAgIC5zdGF0dXMoNTAwKVxuICAgICAgLmpzb24oeyBzdGF0dXM6ICdlcnJvcicsIG1lc3NhZ2U6ICdFcnJvciBvbiAgZ2V0IHN0YXR1cycsIGVycm9yOiBlcnJvciB9KTtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2V0UHJvZmlsZVN0YXR1cyhyZXE6IFJlcXVlc3QsIHJlczogYW55KSB7XG4gIGNvbnN0IHsgc3RhdHVzIH0gPSByZXEuYm9keTtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHJlcS5jbGllbnQuc2V0UHJvZmlsZVN0YXR1cyhzdGF0dXMpO1xuXG4gICAgcmV0dXJuIHJlcy5zdGF0dXMoMjAwKS5qc29uKHsgc3RhdHVzOiAnc3VjY2VzcycsIHJlc3BvbnNlOiByZXNwb25zZSB9KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJlcS5sb2dnZXIuZXJyb3IoZSk7XG4gICAgcmV0dXJuIHJlc1xuICAgICAgLnN0YXR1cyg1MDApXG4gICAgICAuanNvbih7IHN0YXR1czogJ2Vycm9yJywgbWVzc2FnZTogJ0Vycm9yIG9uIHNldCBwcm9maWxlIHN0YXR1cycgfSk7XG4gIH1cbn1cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWplY3RDYWxsKHJlcTogUmVxdWVzdCwgcmVzOiBhbnkpIHtcbiAgY29uc3QgeyBjYWxsSWQgfSA9IHJlcS5ib2R5O1xuICB0cnkge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgcmVxLmNsaWVudC5yZWplY3RDYWxsKGNhbGxJZCk7XG5cbiAgICByZXR1cm4gcmVzLnN0YXR1cygyMDApLmpzb24oeyBzdGF0dXM6ICdzdWNjZXNzJywgcmVzcG9uc2U6IHJlc3BvbnNlIH0pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmVxLmxvZ2dlci5lcnJvcihlKTtcbiAgICByZXR1cm4gcmVzXG4gICAgICAuc3RhdHVzKDUwMClcbiAgICAgIC5qc29uKHsgc3RhdHVzOiAnZXJyb3InLCBtZXNzYWdlOiAnRXJyb3Igb24gcmVqZWN0Q2FsbCcsIGVycm9yOiBlIH0pO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzdGFyTWVzc2FnZShyZXE6IFJlcXVlc3QsIHJlczogYW55KSB7XG4gIGNvbnN0IHsgbWVzc2FnZUlkLCBzdGFyID0gdHJ1ZSB9ID0gcmVxLmJvZHk7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCByZXEuY2xpZW50LnN0YXJNZXNzYWdlKG1lc3NhZ2VJZCwgc3Rhcik7XG5cbiAgICByZXR1cm4gcmVzLnN0YXR1cygyMDApLmpzb24oeyBzdGF0dXM6ICdzdWNjZXNzJywgcmVzcG9uc2U6IHJlc3BvbnNlIH0pO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJlcS5sb2dnZXIuZXJyb3IoZXJyb3IpO1xuICAgIHJldHVybiByZXMuc3RhdHVzKDUwMCkuanNvbih7XG4gICAgICBzdGF0dXM6ICdlcnJvcicsXG4gICAgICBtZXNzYWdlOiAnRXJyb3Igb24gIHN0YXJ0IG1lc3NhZ2UnLFxuICAgICAgZXJyb3I6IGVycm9yLFxuICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRSZWFjdGlvbnMocmVxOiBSZXF1ZXN0LCByZXM6IGFueSkge1xuICBjb25zdCBtZXNzYWdlSWQgPSByZXEucGFyYW1zLmlkO1xuICB0cnkge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgcmVxLmNsaWVudC5nZXRSZWFjdGlvbnMobWVzc2FnZUlkKTtcblxuICAgIHJldHVybiByZXMuc3RhdHVzKDIwMCkuanNvbih7IHN0YXR1czogJ3N1Y2Nlc3MnLCByZXNwb25zZTogcmVzcG9uc2UgfSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmVxLmxvZ2dlci5lcnJvcihlcnJvcik7XG4gICAgcmV0dXJuIHJlcy5zdGF0dXMoNTAwKS5qc29uKHtcbiAgICAgIHN0YXR1czogJ2Vycm9yJyxcbiAgICAgIG1lc3NhZ2U6ICdFcnJvciBvbiBnZXQgcmVhY3Rpb25zJyxcbiAgICAgIGVycm9yOiBlcnJvcixcbiAgICB9KTtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0Vm90ZXMocmVxOiBSZXF1ZXN0LCByZXM6IGFueSkge1xuICBjb25zdCBtZXNzYWdlSWQgPSByZXEucGFyYW1zLmlkO1xuICB0cnkge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgcmVxLmNsaWVudC5nZXRWb3RlcyhtZXNzYWdlSWQpO1xuXG4gICAgcmV0dXJuIHJlcy5zdGF0dXMoMjAwKS5qc29uKHsgc3RhdHVzOiAnc3VjY2VzcycsIHJlc3BvbnNlOiByZXNwb25zZSB9KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXEubG9nZ2VyLmVycm9yKGVycm9yKTtcbiAgICByZXR1cm4gcmVzXG4gICAgICAuc3RhdHVzKDUwMClcbiAgICAgIC5qc29uKHsgc3RhdHVzOiAnZXJyb3InLCBtZXNzYWdlOiAnRXJyb3Igb24gZ2V0IHZvdGVzJywgZXJyb3I6IGVycm9yIH0pO1xuICB9XG59XG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY2hhdFdvb3QocmVxOiBSZXF1ZXN0LCByZXM6IGFueSkge1xuICBjb25zdCB7IHNlc3Npb24gfSA9IHJlcS5wYXJhbXM7XG4gIGNvbnN0IGNsaWVudDogYW55ID0gY2xpZW50c0FycmF5W3Nlc3Npb25dO1xuICBpZiAoY2xpZW50ID09IG51bGwgfHwgY2xpZW50LnN0YXR1cyAhPT0gJ0NPTk5FQ1RFRCcpIHJldHVybjtcbiAgdHJ5IHtcbiAgICBpZiAoYXdhaXQgY2xpZW50LmlzQ29ubmVjdGVkKCkpIHtcbiAgICAgIGNvbnN0IGV2ZW50ID0gcmVxLmJvZHkuZXZlbnQ7XG5cbiAgICAgIGlmIChcbiAgICAgICAgZXZlbnQgPT0gJ2NvbnZlcnNhdGlvbl9zdGF0dXNfY2hhbmdlZCcgfHxcbiAgICAgICAgZXZlbnQgPT0gJ2NvbnZlcnNhdGlvbl9yZXNvbHZlZCcgfHxcbiAgICAgICAgcmVxLmJvZHkucHJpdmF0ZVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiByZXNcbiAgICAgICAgICAuc3RhdHVzKDIwMClcbiAgICAgICAgICAuanNvbih7IHN0YXR1czogJ3N1Y2Nlc3MnLCBtZXNzYWdlOiAnU3VjY2VzcyBvbiByZWNlaXZlIGNoYXR3b290JyB9KTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qge1xuICAgICAgICBtZXNzYWdlX3R5cGUsXG4gICAgICAgIHBob25lID0gcmVxLmJvZHkuY29udmVyc2F0aW9uLm1ldGEuc2VuZGVyLnBob25lX251bWJlci5yZXBsYWNlKCcrJywgJycpLFxuICAgICAgICBtZXNzYWdlID0gcmVxLmJvZHkuY29udmVyc2F0aW9uLm1lc3NhZ2VzWzBdLFxuICAgICAgfSA9IHJlcS5ib2R5O1xuXG4gICAgICBpZiAoZXZlbnQgIT0gJ21lc3NhZ2VfY3JlYXRlZCcgJiYgbWVzc2FnZV90eXBlICE9ICdvdXRnb2luZycpXG4gICAgICAgIHJldHVybiByZXMuc3RhdHVzKDIwMCk7XG4gICAgICBmb3IgKGNvbnN0IGNvbnRhdG8gb2YgY29udGFjdFRvQXJyYXkocGhvbmUsIGZhbHNlKSkge1xuICAgICAgICBpZiAobWVzc2FnZV90eXBlID09ICdvdXRnb2luZycpIHtcbiAgICAgICAgICBpZiAobWVzc2FnZS5hdHRhY2htZW50cykge1xuICAgICAgICAgICAgY29uc3QgYmFzZV91cmwgPSBgJHtcbiAgICAgICAgICAgICAgY2xpZW50LmNvbmZpZy5jaGF0V29vdC5iYXNlVVJMXG4gICAgICAgICAgICB9LyR7bWVzc2FnZS5hdHRhY2htZW50c1swXS5kYXRhX3VybC5zdWJzdHJpbmcoXG4gICAgICAgICAgICAgIG1lc3NhZ2UuYXR0YWNobWVudHNbMF0uZGF0YV91cmwuaW5kZXhPZignL3JhaWxzLycpICsgMVxuICAgICAgICAgICAgKX1gO1xuICAgICAgICAgICAgYXdhaXQgY2xpZW50LnNlbmRGaWxlKFxuICAgICAgICAgICAgICBgJHtjb250YXRvfWAsXG4gICAgICAgICAgICAgIGJhc2VfdXJsLFxuICAgICAgICAgICAgICAnZmlsZScsXG4gICAgICAgICAgICAgIG1lc3NhZ2UuY29udGVudFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYXdhaXQgY2xpZW50LnNlbmRUZXh0KGNvbnRhdG8sIG1lc3NhZ2UuY29udGVudCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzXG4gICAgICAgIC5zdGF0dXMoMjAwKVxuICAgICAgICAuanNvbih7IHN0YXR1czogJ3N1Y2Nlc3MnLCBtZXNzYWdlOiAnU3VjY2VzcyBvbiAgcmVjZWl2ZSBjaGF0d29vdCcgfSk7XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgY29uc29sZS5sb2coZSk7XG4gICAgcmV0dXJuIHJlcy5zdGF0dXMoNDAwKS5qc29uKHtcbiAgICAgIHN0YXR1czogJ2Vycm9yJyxcbiAgICAgIG1lc3NhZ2U6ICdFcnJvciBvbiAg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
|