chat4app-client-angular 1.0.2 → 1.0.4

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.
@@ -0,0 +1,656 @@
1
+ import { __awaiter } from "tslib";
2
+ import { Injectable } from '@angular/core';
3
+ import { HttpClient, HttpHeaders } from '@angular/common/http';
4
+ import * as NATS from './nats.min.js';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "@angular/common/http";
7
+ //declare let nats_min: any;
8
+ export class Chat4appClientAngularService {
9
+ constructor(http) {
10
+ this.http = http;
11
+ this.chatServer = "";
12
+ this.chatUrl = "";
13
+ this.debug = false;
14
+ this.chatUserExternalId = "";
15
+ this.timeoutReconnect = 500;
16
+ }
17
+ ngOnInit() {
18
+ }
19
+ config(chat4AppConfig) {
20
+ this.chatServer = chat4AppConfig.endpoint;
21
+ this.chatUrl = chat4AppConfig.endpoint + "/api/v1/";
22
+ this.debug = chat4AppConfig.debug;
23
+ }
24
+ init(securityChatToken, callback, chatCallback, connectionClientId) {
25
+ if (!this.chatServer || this.chatServer.trim().length == 0) {
26
+ throw new Error("Endpoint is empty");
27
+ }
28
+ if (!securityChatToken || securityChatToken.trim().length == 0) {
29
+ throw new Error("SecurityChatToken is empty");
30
+ }
31
+ this.setTokenChat4app(securityChatToken);
32
+ if (chatCallback && connectionClientId) {
33
+ this.connectWebsocket(chatCallback, connectionClientId);
34
+ }
35
+ callback(securityChatToken);
36
+ }
37
+ getChatUrlDownload(messageFileId) {
38
+ return this.chatUrl + "chatmessage/getFile?messageFileId=" + messageFileId + "&token=" + this.getBearerToken();
39
+ }
40
+ getMessageChat(chatId, fromId, toId) {
41
+ let url = this.chatUrl + "chatmessage/" + chatId + "/" + fromId + "/" + toId;
42
+ return this.http.get(url, {
43
+ headers: new HttpHeaders().set('Authorization', this.getBearerToken())
44
+ });
45
+ }
46
+ getMessageChatByGrop(chatId, groupId, fromId) {
47
+ let url = this.chatUrl + "chatmessage/byGroup/" + chatId + "/" + groupId + "/" + fromId;
48
+ return this.http.get(url, {
49
+ headers: new HttpHeaders().set('Authorization', this.getBearerToken())
50
+ });
51
+ }
52
+ addMessageChat(chatMessage4App) {
53
+ let url = this.chatUrl + "chatmessage/" + chatMessage4App.chatId;
54
+ return this.http.post(url, chatMessage4App, {
55
+ headers: new HttpHeaders().set('Authorization', this.getBearerToken())
56
+ });
57
+ }
58
+ props(chatFilterRequest4App) {
59
+ let url = this.chatUrl + "chatmessage/props";
60
+ return this.http.post(url, chatFilterRequest4App, {
61
+ headers: new HttpHeaders().set('Authorization', this.getBearerToken())
62
+ });
63
+ }
64
+ removeUsersChat(chatId, chatUsersId, chatUsersExternalId) {
65
+ let params = new Array();
66
+ if (chatUsersId && chatUsersId.length > 0) {
67
+ chatUsersId.forEach(cui => {
68
+ params.push("chatUserId=" + cui);
69
+ });
70
+ }
71
+ else if (chatUsersExternalId && chatUsersExternalId.length > 0) {
72
+ chatUsersExternalId.forEach(cuei => {
73
+ params.push("chatUserExternalId=" + cuei);
74
+ });
75
+ }
76
+ let url = this.chatUrl + "chatuser/" + chatId + "?" + params.join("&");
77
+ return this.http.delete(url, {
78
+ headers: new HttpHeaders().set('Authorization', this.getBearerToken())
79
+ });
80
+ }
81
+ removeUserChat(chatId, chatUserId, chatUserExternalId) {
82
+ let param = "";
83
+ if (chatUserId) {
84
+ param = "chatUserId=" + chatUserId;
85
+ }
86
+ else {
87
+ param = "chatUserExternalId=" + chatUserExternalId;
88
+ }
89
+ let url = this.chatUrl + "chatuser/" + chatId + "?" + param;
90
+ return this.http.delete(url, {
91
+ headers: new HttpHeaders().set('Authorization', this.getBearerToken())
92
+ });
93
+ }
94
+ updateUserChat(chatId, charUser4AppUpdate) {
95
+ let url = this.chatUrl + "chatuser/" + chatId;
96
+ return this.http.put(url, charUser4AppUpdate, {
97
+ headers: new HttpHeaders().set('Authorization', this.getBearerToken())
98
+ });
99
+ }
100
+ createUserChat(chatId, chatUser4App) {
101
+ let url = this.chatUrl + "chatuser/" + chatId;
102
+ return this.http.post(url, chatUser4App, {
103
+ headers: new HttpHeaders().set('Authorization', this.getBearerToken())
104
+ });
105
+ }
106
+ createUsersChat(chatId, chatUser4App) {
107
+ let url = this.chatUrl + "chatuser/users/" + chatId;
108
+ return this.http.post(url, chatUser4App, {
109
+ headers: new HttpHeaders().set('Authorization', this.getBearerToken())
110
+ });
111
+ }
112
+ createChat(chat4app) {
113
+ let url = this.chatUrl + "chat";
114
+ return this.http.post(url, chat4app, {
115
+ headers: new HttpHeaders().set('Authorization', this.getBearerToken())
116
+ });
117
+ }
118
+ createUpdateChat(chat4app) {
119
+ let url = this.chatUrl + "chat";
120
+ return this.http.put(url, chat4app, {
121
+ headers: new HttpHeaders().set('Authorization', this.getBearerToken())
122
+ });
123
+ }
124
+ getLastMessageGroup(chatExternalId, groupId) {
125
+ let url = this.chatUrl + "chatmessage/lastMessageGroup?chatExternalId=" + chatExternalId + "&groupId=" + groupId;
126
+ return this.http.get(url, {
127
+ headers: new HttpHeaders().set('Authorization', this.getBearerToken())
128
+ });
129
+ }
130
+ getLastMessage(chatExternalId, chatUserExternalId) {
131
+ let url = this.chatUrl + "chatmessage/lastMessage?chatExternalId=" + chatExternalId + "&chatUserExternalId=" + chatUserExternalId;
132
+ return this.http.get(url, {
133
+ headers: new HttpHeaders().set('Authorization', this.getBearerToken())
134
+ });
135
+ }
136
+ countNotReadMessages(chatUserExternalId, chatExternalId, groupId, fromId) {
137
+ let url = this.chatUrl + "chatmessage/countNotReadMessages?chatUserExternalId=" + chatUserExternalId;
138
+ if (chatExternalId && chatExternalId.length > 0) {
139
+ url += "&chatExternalId=" + chatExternalId;
140
+ }
141
+ if (groupId && groupId.length > 0) {
142
+ url += "&groupId=" + groupId;
143
+ }
144
+ if (fromId && fromId.length > 0) {
145
+ url += "&fromId=" + groupId;
146
+ }
147
+ return this.http.get(url, {
148
+ headers: new HttpHeaders().set('Authorization', this.getBearerToken())
149
+ });
150
+ }
151
+ getChatByExternalId(externalId) {
152
+ let url = this.chatUrl + "chat?externalId=" + externalId;
153
+ return this.http.get(url, {
154
+ headers: new HttpHeaders().set('Authorization', this.getBearerToken())
155
+ });
156
+ }
157
+ getChatById(id) {
158
+ let url = this.chatUrl + "chat?chatId=" + id;
159
+ return this.http.get(url, {
160
+ headers: new HttpHeaders().set('Authorization', this.getBearerToken())
161
+ });
162
+ }
163
+ listChatByUser(externalUserId, userId, chatStatus) {
164
+ let url = this.chatUrl + "chat/listChatByUser/?externalUserId=" + externalUserId
165
+ + "&userId=" + userId
166
+ + "&chatStatus=" + chatStatus;
167
+ return this.http.get(url, {
168
+ headers: new HttpHeaders().set('Authorization', this.getBearerToken())
169
+ });
170
+ }
171
+ closeChat(chatId, chatExternalId) {
172
+ let url = this.chatUrl;
173
+ if (chatId && chatId.length > 0) {
174
+ url += "chat?chatId=" + chatId;
175
+ }
176
+ if (chatExternalId && chatExternalId.length > 0) {
177
+ url += "chat?externalId=" + chatExternalId;
178
+ }
179
+ return this.http.delete(url, {
180
+ headers: new HttpHeaders().set('Authorization', this.getBearerToken())
181
+ });
182
+ }
183
+ readMessage(chatMessageId, toId) {
184
+ let url = this.chatUrl + "chatmessage/read/" + chatMessageId;
185
+ if (toId && toId.length > 0) {
186
+ url += "/" + toId;
187
+ }
188
+ return this.http.put(url, null, {
189
+ headers: new HttpHeaders().set('Authorization', this.getBearerToken())
190
+ });
191
+ }
192
+ online(chatId) {
193
+ let url = this.chatUrl + "chatmessage/online/" + chatId;
194
+ return this.http.get(url, {
195
+ headers: new HttpHeaders().set('Authorization', this.getBearerToken())
196
+ });
197
+ }
198
+ setOffLine(chatUserExternalIdId) {
199
+ let url = this.chatUrl + "chatmessage/set-offline/" + chatUserExternalIdId;
200
+ return this.http.put(url, null, {
201
+ headers: new HttpHeaders().set('Authorization', this.getBearerToken())
202
+ });
203
+ }
204
+ sendFile(chatId, fromId, toId, fileToUpload) {
205
+ const endpoint = this.chatUrl + "chatmessage/sendFile/" + chatId + "/" + fromId + "/" + toId;
206
+ const formData = new FormData();
207
+ formData.append('file', fileToUpload);
208
+ return this.http
209
+ .post(endpoint, formData, {
210
+ headers: new HttpHeaders().set('Authorization', this.getBearerToken())
211
+ });
212
+ }
213
+ sendFileGroup(chatId, fromId, groupId, fileToUpload) {
214
+ const endpoint = this.chatUrl + "chatmessage/sendFileGroup/" + chatId + "/" + fromId + "/" + groupId;
215
+ const formData = new FormData();
216
+ formData.append('file', fileToUpload);
217
+ return this.http
218
+ .post(endpoint, formData, {
219
+ headers: new HttpHeaders().set('Authorization', this.getBearerToken())
220
+ });
221
+ }
222
+ translateMessage(chatMessageId, languageTarget) {
223
+ let url = this.chatUrl + "chatmessage/translate/" + chatMessageId + "/" + languageTarget;
224
+ return this.http.get(url, {
225
+ headers: new HttpHeaders().set('Authorization', this.getBearerToken())
226
+ });
227
+ }
228
+ startTyping(chatId, fromId, toId) {
229
+ let url = this.chatUrl + "chatmessage/startTyping/" + chatId + "/" + fromId + "/" + toId;
230
+ return this.http.put(url, null, {
231
+ headers: new HttpHeaders().set('Authorization', this.getBearerToken())
232
+ });
233
+ }
234
+ startTypingGroup(chatId, fromId, groupId) {
235
+ let url = this.chatUrl + "chatmessage/startTypingGroup/" + chatId + "/" + fromId + "/" + groupId;
236
+ return this.http.put(url, null, {
237
+ headers: new HttpHeaders().set('Authorization', this.getBearerToken())
238
+ });
239
+ }
240
+ stopTyping(chatId, fromId, toId) {
241
+ let url = this.chatUrl + "chatmessage/stopTyping/" + chatId + "/" + fromId + "/" + toId;
242
+ return this.http.put(url, null, {
243
+ headers: new HttpHeaders().set('Authorization', this.getBearerToken())
244
+ });
245
+ }
246
+ stopTypingGroup(chatId, fromId, groupId) {
247
+ let url = this.chatUrl + "chatmessage/stopTypingGroup/" + chatId + "/" + fromId + "/" + groupId;
248
+ return this.http.put(url, null, {
249
+ headers: new HttpHeaders().set('Authorization', this.getBearerToken())
250
+ });
251
+ }
252
+ createGroup(group) {
253
+ let url = this.chatUrl + "/group";
254
+ return this.http.post(url, group, {
255
+ headers: new HttpHeaders().set('Authorization', this.getBearerToken())
256
+ });
257
+ }
258
+ getGroup(chatId, groupId) {
259
+ let url = this.chatUrl + "/group/" + groupId + "/" + chatId;
260
+ return this.http.get(url, {
261
+ headers: new HttpHeaders().set('Authorization', this.getBearerToken())
262
+ });
263
+ }
264
+ listGroups(chatId, externalId) {
265
+ let url = this.chatUrl + "/group/";
266
+ if (chatId && chatId.length > 0) {
267
+ url += "&chatId=" + chatId;
268
+ }
269
+ if (externalId && externalId.length > 0) {
270
+ url += "&externalId=" + externalId;
271
+ }
272
+ return this.http.get(url, {
273
+ headers: new HttpHeaders().set('Authorization', this.getBearerToken())
274
+ });
275
+ }
276
+ listFilesGroup(chatId, groupId) {
277
+ let url = this.chatUrl + "/group/" + chatId;
278
+ if (groupId && groupId.length > 0) {
279
+ url += "&groupId=" + chatId;
280
+ }
281
+ return this.http.get(url, {
282
+ headers: new HttpHeaders().set('Authorization', this.getBearerToken())
283
+ });
284
+ }
285
+ /* Token */
286
+ getBearerToken() {
287
+ let ret = "Bearer " + window.sessionStorage.getItem("chat4AppSessionToken");
288
+ return ret;
289
+ }
290
+ setTokenChat4app(chat4AppSessionToken) {
291
+ window.sessionStorage.setItem("chat4AppSessionToken", chat4AppSessionToken);
292
+ }
293
+ /* Connection */
294
+ onMessageFirebaseReceived(data, chatCallback) {
295
+ //alert("onMessageReceived connectFirebase");
296
+ if (data.type == "msg") {
297
+ let chat4appMessage = new Chat4AppMessageReceive();
298
+ chat4appMessage.data.chatId = data.chatId;
299
+ chat4appMessage.data.chatMessageId = data.chatMessageId;
300
+ chat4appMessage.data.externalId = data.externalId;
301
+ chat4appMessage.data.fromId = data.fromId;
302
+ chat4appMessage.data.toId = data.toId;
303
+ chat4appMessage.data.groupId = data.groupId;
304
+ chat4appMessage.data.dateHour = data.dateHour;
305
+ chat4appMessage.data.type = data.type;
306
+ chat4appMessage.notification.body = data.body;
307
+ if (data.fileId && data.fileId.length > 0) {
308
+ chat4appMessage.data.fileId = data.fileId;
309
+ chat4appMessage.data.fileName = data.fileName;
310
+ chat4appMessage.data.fileSize = data.fileSize;
311
+ chat4appMessage.data.fileType = data.fileType;
312
+ }
313
+ let datTmp = new Map();
314
+ for (let key in data) {
315
+ datTmp.set(key, data[key]);
316
+ }
317
+ chat4appMessage.data.all = datTmp;
318
+ chatCallback.onMessage(chat4appMessage);
319
+ }
320
+ else if ((data.type == "on" || data.type == "off")) {
321
+ let chat4appMessage = new Chat4AppMessageReceive();
322
+ chat4appMessage.data.chatId = data.chatId;
323
+ chat4appMessage.data.chatMessageId = data.chatMessageId;
324
+ chat4appMessage.data.externalId = data.externalId;
325
+ chat4appMessage.data.fromId = data.fromId;
326
+ chat4appMessage.data.toId = data.toId;
327
+ chat4appMessage.data.groupId = data.groupId;
328
+ chat4appMessage.data.dateHour = data.dateHour;
329
+ chat4appMessage.data.type = data.type;
330
+ let datTmp = new Map();
331
+ for (let key in data) {
332
+ datTmp.set(key, data[key]);
333
+ }
334
+ chat4appMessage.data.all = datTmp;
335
+ chatCallback.onOffline(chat4appMessage);
336
+ }
337
+ else if (data.type == "read") {
338
+ let chat4appMessage = new Chat4AppMessageReceive();
339
+ chat4appMessage.data.chatId = data.chatId;
340
+ chat4appMessage.data.chatMessageId = data.chatMessageId;
341
+ chat4appMessage.data.externalId = data.externalId;
342
+ chat4appMessage.data.fromId = data.fromId;
343
+ chat4appMessage.data.toId = data.toId;
344
+ chat4appMessage.data.groupId = data.groupId;
345
+ chat4appMessage.data.dateHour = data.dateHour;
346
+ chat4appMessage.data.type = data.type;
347
+ let datTmp = new Map();
348
+ for (let key in data) {
349
+ datTmp.set(key, data[key]);
350
+ }
351
+ chat4appMessage.data.all = datTmp;
352
+ chatCallback.onRead(chat4appMessage);
353
+ }
354
+ else if (data.type == "startTyping" || data.type == "stopTyping") {
355
+ let chat4appMessage = new Chat4AppMessageReceive();
356
+ chat4appMessage.data.chatId = data.chatId;
357
+ chat4appMessage.data.chatMessageId = data.chatMessageId;
358
+ chat4appMessage.data.externalId = data.externalId;
359
+ chat4appMessage.data.fromId = data.fromId;
360
+ chat4appMessage.data.toId = data.toId;
361
+ chat4appMessage.data.groupId = data.groupId;
362
+ chat4appMessage.data.dateHour = data.dateHour;
363
+ chat4appMessage.data.type = data.type;
364
+ let datTmp = new Map();
365
+ for (let key in data) {
366
+ datTmp.set(key, data[key]);
367
+ }
368
+ chat4appMessage.data.all = datTmp;
369
+ chatCallback.onStartStopTyping(chat4appMessage);
370
+ }
371
+ else if (data.type == "new_user") {
372
+ let chat4appMessage = new Chat4AppMessageReceive();
373
+ chat4appMessage.data.chatId = data.chatId;
374
+ chat4appMessage.data.chatMessageId = data.chatMessageId;
375
+ chat4appMessage.data.externalId = data.externalId;
376
+ chat4appMessage.data.fromId = data.fromId;
377
+ chat4appMessage.data.toId = data.toId;
378
+ chat4appMessage.data.groupId = data.groupId;
379
+ chat4appMessage.data.dateHour = data.dateHour;
380
+ chat4appMessage.data.type = data.type;
381
+ let datTmp = new Map();
382
+ for (let key in data) {
383
+ datTmp.set(key, data[key]);
384
+ }
385
+ chat4appMessage.data.all = datTmp;
386
+ chatCallback.onNewUser(chat4appMessage);
387
+ }
388
+ else if (data.type == "remove_user") {
389
+ let chat4appMessage = new Chat4AppMessageReceive();
390
+ chat4appMessage.data.chatId = data.chatId;
391
+ chat4appMessage.data.chatMessageId = data.chatMessageId;
392
+ chat4appMessage.data.externalId = data.externalId;
393
+ chat4appMessage.data.fromId = data.fromId;
394
+ chat4appMessage.data.toId = data.toId;
395
+ chat4appMessage.data.groupId = data.groupId;
396
+ chat4appMessage.data.dateHour = data.dateHour;
397
+ chat4appMessage.data.type = data.type;
398
+ let datTmp = new Map();
399
+ for (let key in data) {
400
+ datTmp.set(key, data[key]);
401
+ }
402
+ chat4appMessage.data.all = datTmp;
403
+ chatCallback.onRemoveUser(chat4appMessage);
404
+ }
405
+ else if (data.type == "chat_closed") {
406
+ let chat4appMessage = new Chat4AppMessageReceive();
407
+ chat4appMessage.data.chatId = data.chatId;
408
+ chat4appMessage.data.chatMessageId = data.chatMessageId;
409
+ chat4appMessage.data.externalId = data.externalId;
410
+ chat4appMessage.data.fromId = data.fromId;
411
+ chat4appMessage.data.toId = data.toId;
412
+ chat4appMessage.data.groupId = data.groupId;
413
+ chat4appMessage.data.dateHour = data.dateHour;
414
+ chat4appMessage.data.type = data.type;
415
+ let datTmp = new Map();
416
+ for (let key in data) {
417
+ datTmp.set(key, data[key]);
418
+ }
419
+ chat4appMessage.data.all = datTmp;
420
+ chatCallback.onChatClosed(chat4appMessage);
421
+ }
422
+ }
423
+ ensureConn(chatServer, chatUserExternalId) {
424
+ return __awaiter(this, void 0, void 0, function* () {
425
+ if (this.debug) {
426
+ console.log(`chatServer: ${this.chatServer}`);
427
+ console.log(`userId: ${chatUserExternalId}`);
428
+ console.log(`getBearerToken: ${this.getBearerToken()}`);
429
+ }
430
+ const that = this;
431
+ let uriStep1 = chatServer.replace(/^https/, 'wss');
432
+ let server = uriStep1.replace(/(\/\/.*?)\//, '$1ws/');
433
+ if (!this.nc || (this.nc.isClose && this.nc.isClose())) {
434
+ that.nc = yield NATS.connect({ url: server, user: chatUserExternalId, pass: this.getBearerToken(), reconnect: true });
435
+ }
436
+ this.chatUserExternalId = chatUserExternalId;
437
+ return that.nc;
438
+ });
439
+ }
440
+ disconnect() {
441
+ return __awaiter(this, void 0, void 0, function* () {
442
+ // Check how we can disconnect
443
+ if (this.interval) {
444
+ try {
445
+ clearInterval(this.interval);
446
+ }
447
+ catch (e) {
448
+ }
449
+ }
450
+ if (this.nc && this.chatUserExternalId && this.chatUserExternalId.length > 0 && this.getBearerToken() && this.getBearerToken().length > 0) {
451
+ this.setOffLine(this.chatUserExternalId).subscribe(() => {
452
+ if (this.debug) {
453
+ console.log("had set offline");
454
+ }
455
+ });
456
+ }
457
+ if (this.nc) {
458
+ try {
459
+ yield this.nc.close();
460
+ }
461
+ catch (e) {
462
+ if (this.debug) {
463
+ console.error(e);
464
+ }
465
+ }
466
+ this.nc = undefined;
467
+ }
468
+ if (this.debug) {
469
+ console.log("disconect");
470
+ }
471
+ });
472
+ }
473
+ processAndCallback(msgObj, chatCallback) {
474
+ if (this.debug && msgObj) {
475
+ console.log("Msg Received: " + JSON.stringify(msgObj));
476
+ }
477
+ //if (!chatCallback.isTokenFirebaseActive()) {
478
+ let datTmp = new Map();
479
+ for (let key in msgObj.data) {
480
+ datTmp.set(key, msgObj.data[key]);
481
+ }
482
+ msgObj.data.all = datTmp;
483
+ if (msgObj.data.type == "msg") {
484
+ chatCallback.onMessage(msgObj);
485
+ }
486
+ else if ((msgObj.data.type == "on" || msgObj.data.type == "off")) {
487
+ chatCallback.onOffline(msgObj);
488
+ }
489
+ else if (msgObj.data.type == "read") {
490
+ chatCallback.onRead(msgObj);
491
+ }
492
+ else if (msgObj.data.type == "startTyping" || msgObj.data.type == "stopTyping") {
493
+ chatCallback.onStartStopTyping(msgObj);
494
+ }
495
+ else if (msgObj.data.type == "new_user") {
496
+ chatCallback.onNewUser(msgObj);
497
+ }
498
+ else if (msgObj.data.type == "remove_user") {
499
+ chatCallback.onRemoveUser(msgObj);
500
+ }
501
+ else if (msgObj.data.type == "chat_closed") {
502
+ chatCallback.onChatClosed(msgObj);
503
+ }
504
+ //}
505
+ }
506
+ connectWebsocket(chatCallback, userId) {
507
+ return __awaiter(this, void 0, void 0, function* () {
508
+ const that = this;
509
+ this.disconnect();
510
+ let securityToken = this.getBearerToken();
511
+ let tokenAuth = "";
512
+ if (securityToken && securityToken.startsWith("Bearer ")) {
513
+ tokenAuth = securityToken;
514
+ }
515
+ else {
516
+ tokenAuth = "Bearer " + securityToken;
517
+ }
518
+ const configId = this.chatServer.split("/")[3];
519
+ const nc = yield this.ensureConn("https://apihomol.chat4app.com", userId);
520
+ //TODO Get the user id from jwt
521
+ const subject = `chat4app.config.${configId}.user.${userId}`;
522
+ const sub = nc.subscribe(subject, (msg) => {
523
+ if (this.debug) {
524
+ console.log(msg);
525
+ }
526
+ this.processAndCallback(JSON.parse(msg.data), chatCallback);
527
+ });
528
+ if (this.interval) {
529
+ try {
530
+ clearInterval(this.interval);
531
+ }
532
+ catch (e) {
533
+ }
534
+ }
535
+ that.interval = setInterval(() => {
536
+ if (that.debug) {
537
+ console.log(`publish chat4app.user.online ${userId} `);
538
+ }
539
+ that.nc.publish(`chat4app.user.online`, userId);
540
+ }, 1000);
541
+ if (this.debug) {
542
+ console.log(`Subscribe online chat4app.user.${userId}.online`);
543
+ }
544
+ });
545
+ }
546
+ /*
547
+ disconnect() {
548
+ // console.log("disconnect")
549
+ try {
550
+ if (this.stompClient) {
551
+ this.stompClient.disconnect();
552
+ }
553
+
554
+ } catch (e) {
555
+ console.log(e);
556
+ }
557
+ }
558
+ */
559
+ convertChat4AppMessageReceiveToChatMessage4App(msg) {
560
+ var _a;
561
+ let message = new ChatMessage4App();
562
+ message.body = (_a = msg === null || msg === void 0 ? void 0 : msg.notification) === null || _a === void 0 ? void 0 : _a.body;
563
+ message.chatId = msg.data.chatId;
564
+ message.fromId = msg.data.fromId;
565
+ message.toId = msg.data.toId;
566
+ message.groupId = msg.data.groupId;
567
+ message.replyFrom = msg.data.replyFrom;
568
+ if (msg.data.dateHour && msg.data.dateHour.length > 0) {
569
+ message.dateHourIncluded = msg.data.dateHour.substring(6, 10) + "-"
570
+ + msg.data.dateHour.substring(3, 5) + "-"
571
+ + msg.data.dateHour.substring(0, 2)
572
+ + msg.data.dateHour.substring(10);
573
+ }
574
+ message.id = msg.data.chatMessageId;
575
+ if (msg.data.fileId && msg.data.fileId.length > 0) {
576
+ let messageFile = new ChatMessageFile4App();
577
+ messageFile.id = msg.data.fileId;
578
+ messageFile.name = msg.data.fileName;
579
+ messageFile.size = msg.data.fileSize;
580
+ messageFile.type = msg.data.fileType;
581
+ message.chatMessageFile = messageFile;
582
+ }
583
+ if (msg.data.vFileId && msg.data.vFileId.length > 0) {
584
+ let messageFile = new ChatMessageFile4App();
585
+ messageFile.id = msg.data.vFileId;
586
+ messageFile.name = msg.data.vFileName;
587
+ messageFile.size = msg.data.vFileSize;
588
+ messageFile.type = msg.data.vFileType;
589
+ message.chatVoiceFile = messageFile;
590
+ }
591
+ return message;
592
+ }
593
+ }
594
+ Chat4appClientAngularService.ɵprov = i0.ɵɵdefineInjectable({ factory: function Chat4appClientAngularService_Factory() { return new Chat4appClientAngularService(i0.ɵɵinject(i1.HttpClient)); }, token: Chat4appClientAngularService, providedIn: "root" });
595
+ Chat4appClientAngularService.decorators = [
596
+ { type: Injectable, args: [{
597
+ providedIn: 'root'
598
+ },] }
599
+ ];
600
+ Chat4appClientAngularService.ctorParameters = () => [
601
+ { type: HttpClient }
602
+ ];
603
+ export class Chat4App {
604
+ }
605
+ export class ChatUser4App {
606
+ }
607
+ export class ChatMessage4App {
608
+ }
609
+ export class ChatMessageFile4App {
610
+ }
611
+ export class ChatMessageMeta4App {
612
+ }
613
+ export class Chat4AppMessageReceive {
614
+ constructor() {
615
+ this.data = new Chat4AppMessageReceiveData();
616
+ this.notification = new Chat4AppMessageReceiveNotification();
617
+ }
618
+ }
619
+ export class Chat4AppMessageReceiveData {
620
+ }
621
+ export class Chat4AppMessageReceiveNotification {
622
+ }
623
+ export class ChatUserResponse4App {
624
+ }
625
+ export class ChatFilterRequest4App {
626
+ }
627
+ export class Chat4AppConfig {
628
+ constructor(endpoint, debug) {
629
+ this.endpoint = endpoint;
630
+ this.debug = debug;
631
+ }
632
+ }
633
+ export class Chat4AppTranslate {
634
+ }
635
+ export class ChatGroupApp {
636
+ }
637
+ export var ChatStatus4App;
638
+ (function (ChatStatus4App) {
639
+ ChatStatus4App["CREATED"] = "CREATED";
640
+ ChatStatus4App["CLOSED"] = "CLOSED";
641
+ })(ChatStatus4App || (ChatStatus4App = {}));
642
+ export var ChatUserStatus4App;
643
+ (function (ChatUserStatus4App) {
644
+ ChatUserStatus4App["REMOVED"] = "REMOVED";
645
+ })(ChatUserStatus4App || (ChatUserStatus4App = {}));
646
+ export var ChatFilterType;
647
+ (function (ChatFilterType) {
648
+ ChatFilterType[ChatFilterType["COUNT_NOT_READ"] = 1] = "COUNT_NOT_READ";
649
+ ChatFilterType[ChatFilterType["LAST_MESSAGE"] = 2] = "LAST_MESSAGE";
650
+ })(ChatFilterType || (ChatFilterType = {}));
651
+ export var GroupStatus4App;
652
+ (function (GroupStatus4App) {
653
+ GroupStatus4App["CREATED"] = "CREATED";
654
+ GroupStatus4App["CLOSED"] = "REMOVED";
655
+ })(GroupStatus4App || (GroupStatus4App = {}));
656
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhdDRhcHAtY2xpZW50LWFuZ3VsYXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2NoYXQ0YXBwLWNsaWVudC1hbmd1bGFyL3NyYy9saWIvY2hhdDRhcHAtY2xpZW50LWFuZ3VsYXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRS9ELE9BQU8sS0FBSyxJQUFJLE1BQU0sZUFBZSxDQUFDOzs7QUFHdEMsNEJBQTRCO0FBSzVCLE1BQU0sT0FBTyw0QkFBNEI7SUFhckMsWUFBcUIsSUFBZ0I7UUFBaEIsU0FBSSxHQUFKLElBQUksQ0FBWTtRQVRyQyxlQUFVLEdBQUcsRUFBRSxDQUFDO1FBQ2hCLFlBQU8sR0FBRyxFQUFFLENBQUM7UUFDYixVQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ2QsdUJBQWtCLEdBQUcsRUFBRSxDQUFDO1FBRXhCLHFCQUFnQixHQUFHLEdBQUcsQ0FBQztJQU12QixDQUFDO0lBQ0QsUUFBUTtJQUNSLENBQUM7SUFFRCxNQUFNLENBQUMsY0FBOEI7UUFDbkMsSUFBSSxDQUFDLFVBQVUsR0FBRyxjQUFjLENBQUMsUUFBUSxDQUFDO1FBQzFDLElBQUksQ0FBQyxPQUFPLEdBQUcsY0FBYyxDQUFDLFFBQVEsR0FBRyxVQUFVLENBQUU7UUFDckQsSUFBSSxDQUFDLEtBQUssR0FBRyxjQUFjLENBQUMsS0FBSyxDQUFDO0lBQ3BDLENBQUM7SUFFRCxJQUFJLENBQUMsaUJBQXlCLEVBQUUsUUFBYSxFQUFFLFlBQTRCLEVBQUUsa0JBQTJCO1FBRXBHLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxJQUFJLENBQUMsRUFBQztZ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TSxDQUFOLElBQVksa0JBR1g7QUFIRCxXQUFZLGtCQUFrQjtJQUM1Qix5Q0FBbUIsQ0FBQTtBQUVyQixDQUFDLEVBSFcsa0JBQWtCLEtBQWxCLGtCQUFrQixRQUc3QjtBQUNELE1BQU0sQ0FBTixJQUFZLGNBR1g7QUFIRCxXQUFZLGNBQWM7SUFDeEIsdUVBQWtCLENBQUE7SUFDbEIsbUVBQWdCLENBQUE7QUFDbEIsQ0FBQyxFQUhXLGNBQWMsS0FBZCxjQUFjLFFBR3pCO0FBRUQsTUFBTSxDQUFOLElBQVksZUFHWDtBQUhELFdBQVksZUFBZTtJQUN6QixzQ0FBbUIsQ0FBQTtJQUNuQixxQ0FBa0IsQ0FBQTtBQUNwQixDQUFDLEVBSFcsZUFBZSxLQUFmLGVBQWUsUUFHMUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEh0dHBDbGllbnQsIEh0dHBIZWFkZXJzIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0ICogYXMgTkFUUyBmcm9tICcuL25hdHMubWluLmpzJztcblxuXG4vL2RlY2xhcmUgbGV0IG5hdHNfbWluOiBhbnk7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIENoYXQ0YXBwQ2xpZW50QW5ndWxhclNlcnZpY2UgaW1wbGVtZW50cyBPbkluaXQgIHtcblxuICAgIG5jOiBhbnk7XG5cbiAgICBjaGF0U2VydmVyID0gXCJcIjtcbiAgICBjaGF0VXJsID0gXCJcIjtcbiAgICBkZWJ1ZyA9IGZhbHNlO1xuICAgIGNoYXRVc2VyRXh0ZXJuYWxJZCA9IFwiXCI7XG4gICAgXG4gICAgdGltZW91dFJlY29ubmVjdCA9IDUwMDtcblxuICAgIGludGVydmFsO1xuXG4gICAgY29uc3RydWN0b3IoIHByaXZhdGUgaHR0cDogSHR0cENsaWVudCkge1xuICBcbiAgICB9XG4gICAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgfVxuXG4gICAgY29uZmlnKGNoYXQ0QXBwQ29uZmlnOiBDaGF0NEFwcENvbmZpZykge1xuICAgICAgdGhpcy5jaGF0U2VydmVyID0gY2hhdDRBcHBDb25maWcuZW5kcG9pbnQ7XG4gICAgICB0aGlzLmNoYXRVcmwgPSBjaGF0NEFwcENvbmZpZy5lbmRwb2ludCArIFwiL2FwaS92MS9cIiA7XG4gICAgICB0aGlzLmRlYnVnID0gY2hhdDRBcHBDb25maWcuZGVidWc7XG4gICAgfVxuICBcbiAgICBpbml0KHNlY3VyaXR5Q2hhdFRva2VuOiBzdHJpbmcsIGNhbGxiYWNrOiBhbnksIGNoYXRDYWxsYmFjaz86IElDaGF0Q2FsbGJhY2ssIGNvbm5lY3Rpb25DbGllbnRJZD86IHN0cmluZykge1xuXG4gICAgICAgIGlmICghdGhpcy5jaGF0U2VydmVyIHx8IHRoaXMuY2hhdFNlcnZlci50cmltKCkubGVuZ3RoID09IDApe1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkVuZHBvaW50IGlzIGVtcHR5XCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghc2VjdXJpdHlDaGF0VG9rZW4gfHwgc2VjdXJpdHlDaGF0VG9rZW4udHJpbSgpLmxlbmd0aCA9PSAwKXtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTZWN1cml0eUNoYXRUb2tlbiBpcyBlbXB0eVwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2V0VG9rZW5DaGF0NGFwcChzZWN1cml0eUNoYXRUb2tlbik7XG4gIFxuICAgICAgICBpZiAoY2hhdENhbGxiYWNrICYmIGNvbm5lY3Rpb25DbGllbnRJZCkge1xuICAgICAgICAgIHRoaXMuY29ubmVjdFdlYnNvY2tldChjaGF0Q2FsbGJhY2ssIGNvbm5lY3Rpb25DbGllbnRJZCk7XG4gICAgICAgIH1cbiAgXG4gICAgICAgIGNhbGxiYWNrKHNlY3VyaXR5Q2hhdFRva2VuKTtcbiAgICB9XG4gIFxuICAgIGdldENoYXRVcmxEb3dubG9hZChtZXNzYWdlRmlsZUlkOiBzdHJpbmcpIHtcbiAgICAgIHJldHVybiB0aGlzLmNoYXRVcmwgKyBcImNoYXRtZXNzYWdlL2dldEZpbGU/bWVzc2FnZUZpbGVJZD1cIiArIG1lc3NhZ2VGaWxlSWQgKyBcIiZ0b2tlbj1cIiArIHRoaXMuZ2V0QmVhcmVyVG9rZW4oKTtcbiAgICB9XG4gIFxuICBcbiAgICBnZXRNZXNzYWdlQ2hhdChjaGF0SWQ6IHN0cmluZywgZnJvbUlkOiBzdHJpbmcsIHRvSWQ6IHN0cmluZyk6IE9ic2VydmFibGU8QXJyYXk8Q2hhdE1lc3NhZ2U0QXBwPj4ge1xuICAgICAgbGV0IHVybCA9IHRoaXMuY2hhdFVybCArIFwiY2hhdG1lc3NhZ2UvXCIgKyBjaGF0SWQgKyBcIi9cIiArIGZyb21JZCArIFwiL1wiICsgdG9JZDtcbiAgXG4gICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxBcnJheTxDaGF0TWVzc2FnZTRBcHA+Pih1cmwsXG4gICAgICAgIHtcbiAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoKS5zZXQoJ0F1dGhvcml6YXRpb24nLCB0aGlzLmdldEJlYXJlclRva2VuKCkpXG4gICAgICAgIH0pXG4gIFxuICAgIH1cbiAgICBnZXRNZXNzYWdlQ2hhdEJ5R3JvcChjaGF0SWQ6IHN0cmluZywgZ3JvdXBJZDogc3RyaW5nLCBmcm9tSWQ6IHN0cmluZyk6IE9ic2VydmFibGU8QXJyYXk8Q2hhdE1lc3NhZ2U0QXBwPj4ge1xuICAgICAgbGV0IHVybCA9IHRoaXMuY2hhdFVybCArIFwiY2hhdG1lc3NhZ2UvYnlHcm91cC9cIiArIGNoYXRJZCArIFwiL1wiICsgZ3JvdXBJZCArIFwiL1wiICsgZnJvbUlkO1xuICBcbiAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PEFycmF5PENoYXRNZXNzYWdlNEFwcD4+KHVybCxcbiAgICAgICAge1xuICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycygpLnNldCgnQXV0aG9yaXphdGlvbicsIHRoaXMuZ2V0QmVhcmVyVG9rZW4oKSlcbiAgICAgICAgfSlcbiAgXG4gICAgfVxuICBcbiAgXG4gICAgYWRkTWVzc2FnZUNoYXQoY2hhdE1lc3NhZ2U0QXBwOiBDaGF0TWVzc2FnZTRBcHApOiBPYnNlcnZhYmxlPENoYXRNZXNzYWdlNEFwcD4ge1xuICAgICAgbGV0IHVybCA9IHRoaXMuY2hhdFVybCArIFwiY2hhdG1lc3NhZ2UvXCIgKyBjaGF0TWVzc2FnZTRBcHAuY2hhdElkO1xuXG4gICAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8Q2hhdE1lc3NhZ2U0QXBwPih1cmwsIGNoYXRNZXNzYWdlNEFwcCxcbiAgICAgICAge1xuICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycygpLnNldCgnQXV0aG9yaXphdGlvbicsIHRoaXMuZ2V0QmVhcmVyVG9rZW4oKSlcbiAgICAgICAgfSlcbiAgXG4gICAgfVxuICAgIHByb3BzKGNoYXRGaWx0ZXJSZXF1ZXN0NEFwcDogQXJyYXk8Q2hhdEZpbHRlclJlcXVlc3Q0QXBwPik6IE9ic2VydmFibGU8Q2hhdFVzZXJSZXNwb25zZTRBcHBbXT4ge1xuICAgICAgbGV0IHVybCA9IHRoaXMuY2hhdFVybCArIFwiY2hhdG1lc3NhZ2UvcHJvcHNcIjtcbiAgXG4gICAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8Q2hhdFVzZXJSZXNwb25zZTRBcHBbXT4odXJsLCBjaGF0RmlsdGVyUmVxdWVzdDRBcHAsXG4gICAgICAgIHtcbiAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoKS5zZXQoJ0F1dGhvcml6YXRpb24nLCB0aGlzLmdldEJlYXJlclRva2VuKCkpXG4gICAgICAgIH0pXG4gIFxuICAgIH1cbiAgXG4gIFxuICAgIHJlbW92ZVVzZXJzQ2hhdChjaGF0SWQ6IHN0cmluZywgY2hhdFVzZXJzSWQ/OiBzdHJpbmdbXSwgY2hhdFVzZXJzRXh0ZXJuYWxJZD86IHN0cmluZ1tdKTogT2JzZXJ2YWJsZTxDaGF0VXNlcjRBcHBbXT4ge1xuICAgICAgbGV0IHBhcmFtcyA9IG5ldyBBcnJheSgpO1xuICAgICAgaWYgKGNoYXRVc2Vyc0lkICYmIGNoYXRVc2Vyc0lkLmxlbmd0aCA+IDApIHtcbiAgXG4gICAgICAgIGNoYXRVc2Vyc0lkLmZvckVhY2goY3VpID0+IHtcbiAgICAgICAgICBwYXJhbXMucHVzaChcImNoYXRVc2VySWQ9XCIgKyBjdWkpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSBpZiAoY2hhdFVzZXJzRXh0ZXJuYWxJZCAmJiBjaGF0VXNlcnNFeHRlcm5hbElkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY2hhdFVzZXJzRXh0ZXJuYWxJZC5mb3JFYWNoKGN1ZWkgPT4ge1xuICAgICAgICAgIHBhcmFtcy5wdXNoKFwiY2hhdFVzZXJFeHRlcm5hbElkPVwiICsgY3VlaSk7XG4gICAgICAgIH0pXG4gIFxuICAgICAgfVxuICBcbiAgICAgIGxldCB1cmwgPSB0aGlzLmNoYXRVcmwgKyBcImNoYXR1c2VyL1wiICsgY2hhdElkICsgXCI/XCIgKyBwYXJhbXMuam9pbihcIiZcIik7XG4gIFxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5kZWxldGU8Q2hhdFVzZXI0QXBwW10+KHVybCxcbiAgICAgICAge1xuICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycygpLnNldCgnQXV0aG9yaXphdGlvbicsIHRoaXMuZ2V0QmVhcmVyVG9rZW4oKSlcbiAgICAgICAgfSlcbiAgICB9XG4gIFxuICAgIHJlbW92ZVVzZXJDaGF0KGNoYXRJZDogc3RyaW5nLCBjaGF0VXNlcklkPzogc3RyaW5nLCBjaGF0VXNlckV4dGVybmFsSWQ/OiBzdHJpbmcpOiBPYnNlcnZhYmxlPENoYXRVc2VyNEFwcD4ge1xuICAgICAgbGV0IHBhcmFtID0gXCJcIjtcbiAgICAgIGlmIChjaGF0VXNlcklkKSB7XG4gICAgICAgIHBhcmFtID0gXCJjaGF0VXNlcklkPVwiICsgY2hhdFVzZXJJZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBhcmFtID0gXCJjaGF0VXNlckV4dGVybmFsSWQ9XCIgKyBjaGF0VXNlckV4dGVybmFsSWQ7XG4gICAgICB9XG4gIFxuICAgICAgbGV0IHVybCA9IHRoaXMuY2hhdFVybCArIFwiY2hhdHVzZXIvXCIgKyBjaGF0SWQgKyBcIj9cIiArIHBhcmFtO1xuICBcbiAgICAgIHJldHVybiB0aGlzLmh0dHAuZGVsZXRlPENoYXRVc2VyNEFwcD4odXJsLFxuICAgICAgICB7XG4gICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKCkuc2V0KCdBdXRob3JpemF0aW9uJywgdGhpcy5nZXRCZWFyZXJUb2tlbigpKVxuICAgICAgICB9KVxuICAgIH1cbiAgXG4gICAgdXBkYXRlVXNlckNoYXQoY2hhdElkOiBzdHJpbmcsIGNoYXJVc2VyNEFwcFVwZGF0ZTogQ2hhdFVzZXI0QXBwKTogT2JzZXJ2YWJsZTxDaGF0VXNlcjRBcHA+IHtcbiAgXG4gICAgICBsZXQgdXJsID0gdGhpcy5jaGF0VXJsICsgXCJjaGF0dXNlci9cIiArIGNoYXRJZDtcbiAgXG4gICAgICByZXR1cm4gdGhpcy5odHRwLnB1dDxDaGF0VXNlcjRBcHA+KHVybCwgY2hhclVzZXI0QXBwVXBkYXRlLFxuICAgICAgICB7XG4gICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKCkuc2V0KCdBdXRob3JpemF0aW9uJywgdGhpcy5nZXRCZWFyZXJUb2tlbigpKVxuICAgICAgICB9KVxuICAgIH1cbiAgXG4gIFxuICAgIGNyZWF0ZVVzZXJDaGF0KGNoYXRJZDogc3RyaW5nLCBjaGF0VXNlcjRBcHA6IENoYXRVc2VyNEFwcCk6IE9ic2VydmFibGU8Q2hhdFVzZXI0QXBwPiB7XG4gICAgICBsZXQgdXJsID0gdGhpcy5jaGF0VXJsICsgXCJjaGF0dXNlci9cIiArIGNoYXRJZDtcbiAgXG4gICAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8Q2hhdFVzZXI0QXBwPih1cmwsIGNoYXRVc2VyNEFwcCxcbiAgICAgICAge1xuICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycygpLnNldCgnQXV0aG9yaXphdGlvbicsIHRoaXMuZ2V0QmVhcmVyVG9rZW4oKSlcbiAgICAgICAgfSlcbiAgICB9XG4gIFxuICAgIGNyZWF0ZVVzZXJzQ2hhdChjaGF0SWQ6IHN0cmluZywgY2hhdFVzZXI0QXBwOiBDaGF0VXNlcjRBcHBbXSk6IE9ic2VydmFibGU8Q2hhdFVzZXI0QXBwW10+IHtcbiAgICAgIGxldCB1cmwgPSB0aGlzLmNoYXRVcmwgKyBcImNoYXR1c2VyL3VzZXJzL1wiICsgY2hhdElkO1xuICBcbiAgICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxDaGF0VXNlcjRBcHBbXT4odXJsLCBjaGF0VXNlcjRBcHAsXG4gICAgICAgIHtcbiAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoKS5zZXQoJ0F1dGhvcml6YXRpb24nLCB0aGlzLmdldEJlYXJlclRva2VuKCkpXG4gICAgICAgIH0pXG4gICAgfVxuICBcbiAgXG4gICAgY3JlYXRlQ2hhdChjaGF0NGFwcDogQ2hhdDRBcHApOiBPYnNlcnZhYmxlPENoYXQ0QXBwPiB7XG4gICAgICBsZXQgdXJsID0gdGhpcy5jaGF0VXJsICsgXCJjaGF0XCI7XG4gIFxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PENoYXQ0QXBwPih1cmwsIGNoYXQ0YXBwLFxuICAgICAgICB7XG4gICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKCkuc2V0KCdBdXRob3JpemF0aW9uJywgdGhpcy5nZXRCZWFyZXJUb2tlbigpKVxuICAgICAgICB9KVxuICAgIH1cbiAgICBjcmVhdGVVcGRhdGVDaGF0KGNoYXQ0YXBwOiBDaGF0NEFwcCk6IE9ic2VydmFibGU8Q2hhdDRBcHA+IHtcbiAgICAgIGxldCB1cmwgPSB0aGlzLmNoYXRVcmwgKyBcImNoYXRcIjtcbiAgXG4gICAgICByZXR1cm4gdGhpcy5odHRwLnB1dDxDaGF0NEFwcD4odXJsLCBjaGF0NGFwcCxcbiAgICAgICAge1xuICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycygpLnNldCgnQXV0aG9yaXphdGlvbicsIHRoaXMuZ2V0QmVhcmVyVG9rZW4oKSlcbiAgICAgICAgfSlcbiAgICB9XG4gIFxuICBcbiAgICBnZXRMYXN0TWVzc2FnZUdyb3VwKGNoYXRFeHRlcm5hbElkOiBzdHJpbmcsIGdyb3VwSWQ6IHN0cmluZyk6IE9ic2VydmFibGU8Q2hhdFVzZXJSZXNwb25zZTRBcHA+IHtcbiAgXG4gICAgICBsZXQgdXJsID0gdGhpcy5jaGF0VXJsICsgXCJjaGF0bWVzc2FnZS9sYXN0TWVzc2FnZUdyb3VwP2NoYXRFeHRlcm5hbElkPVwiICsgY2hhdEV4dGVybmFsSWQgKyBcIiZncm91cElkPVwiICsgZ3JvdXBJZDtcbiAgXG4gICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxDaGF0VXNlclJlc3BvbnNlNEFwcD4odXJsLFxuICAgICAgICB7XG4gICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKCkuc2V0KCdBdXRob3JpemF0aW9uJywgdGhpcy5nZXRCZWFyZXJUb2tlbigpKVxuICAgICAgICB9KVxuICAgIH1cbiAgICBnZXRMYXN0TWVzc2FnZShjaGF0RXh0ZXJuYWxJZDogc3RyaW5nLCBjaGF0VXNlckV4dGVybmFsSWQ6IHN0cmluZyk6IE9ic2VydmFibGU8Q2hhdFVzZXJSZXNwb25zZTRBcHA+IHtcbiAgXG4gICAgICBsZXQgdXJsID0gdGhpcy5jaGF0VXJsICsgXCJjaGF0bWVzc2FnZS9sYXN0TWVzc2FnZT9jaGF0RXh0ZXJuYWxJZD1cIiArIGNoYXRFeHRlcm5hbElkICsgXCImY2hhdFVzZXJFeHRlcm5hbElkPVwiICsgY2hhdFVzZXJFeHRlcm5hbElkO1xuICBcbiAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PENoYXRVc2VyUmVzcG9uc2U0QXBwPih1cmwsXG4gICAgICAgIHtcbiAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoKS5zZXQoJ0F1dGhvcml6YXRpb24nLCB0aGlzLmdldEJlYXJlclRva2VuKCkpXG4gICAgICAgIH0pXG4gICAgfVxuICAgIGNvdW50Tm90UmVhZE1lc3NhZ2VzKGNoYXRVc2VyRXh0ZXJuYWxJZDogc3RyaW5nLCBjaGF0RXh0ZXJuYWxJZD86IHN0cmluZywgZ3JvdXBJZD86IHN0cmluZywgZnJvbUlkPzpzdHJpbmcpOiBPYnNlcnZhYmxlPENoYXRVc2VyUmVzcG9uc2U0QXBwPiB7XG4gIFxuICAgICAgbGV0IHVybCA9IHRoaXMuY2hhdFVybCArIFwiY2hhdG1lc3NhZ2UvY291bnROb3RSZWFkTWVzc2FnZXM/Y2hhdFVzZXJFeHRlcm5hbElkPVwiICsgY2hhdFVzZXJFeHRlcm5hbElkO1xuICBcbiAgICAgIGlmIChjaGF0RXh0ZXJuYWxJZCAmJiBjaGF0RXh0ZXJuYWxJZC5sZW5ndGggPiAwKSB7XG4gICAgICAgIHVybCArPSBcIiZjaGF0RXh0ZXJuYWxJZD1cIiArIGNoYXRFeHRlcm5hbElkO1xuICAgICAgfVxuICBcbiAgICAgIGlmIChncm91cElkICYmIGdyb3VwSWQubGVuZ3RoID4gMCkge1xuICAgICAgICB1cmwgKz0gXCImZ3JvdXBJZD1cIiArIGdyb3VwSWQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChmcm9tSWQgJiYgZnJvbUlkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdXJsICs9IFwiJmZyb21JZD1cIiArIGdyb3VwSWQ7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PENoYXRVc2VyUmVzcG9uc2U0QXBwPih1cmwsXG4gICAgICAgIHtcbiAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoKS5zZXQoJ0F1dGhvcml6YXRpb24nLCB0aGlzLmdldEJlYXJlclRva2VuKCkpXG4gICAgICAgIH0pXG4gICAgfVxuICBcbiAgXG4gICAgZ2V0Q2hhdEJ5RXh0ZXJuYWxJZChleHRlcm5hbElkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPENoYXQ0QXBwPiB7XG4gIFxuICAgICAgbGV0IHVybCA9IHRoaXMuY2hhdFVybCArIFwiY2hhdD9leHRlcm5hbElkPVwiICsgZXh0ZXJuYWxJZDtcbiAgXG4gICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxDaGF0NEFwcD4odXJsLFxuICAgICAgICB7XG4gICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKCkuc2V0KCdBdXRob3JpemF0aW9uJywgdGhpcy5nZXRCZWFyZXJUb2tlbigpKVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIGdldENoYXRCeUlkKGlkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPENoYXQ0QXBwPiB7XG4gIFxuICAgICAgbGV0IHVybCA9IHRoaXMuY2hhdFVybCArIFwiY2hhdD9jaGF0SWQ9XCIgKyBpZDtcbiAgXG4gICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxDaGF0NEFwcD4odXJsLFxuICAgICAgICB7XG4gICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKCkuc2V0KCdBdXRob3JpemF0aW9uJywgdGhpcy5nZXRCZWFyZXJUb2tlbigpKVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIGxpc3RDaGF0QnlVc2VyKGV4dGVybmFsVXNlcklkOiBzdHJpbmcsIHVzZXJJZDogc3RyaW5nLCBjaGF0U3RhdHVzOiBDaGF0U3RhdHVzNEFwcCApOiBPYnNlcnZhYmxlPEFycmF5PCBDaGF0NEFwcD4+IHtcbiAgXG4gICAgICBsZXQgdXJsID0gdGhpcy5jaGF0VXJsICsgXCJjaGF0L2xpc3RDaGF0QnlVc2VyLz9leHRlcm5hbFVzZXJJZD1cIiArIGV4dGVybmFsVXNlcklkIFxuICAgICAgKyBcIiZ1c2VySWQ9XCIgKyB1c2VySWRcbiAgICAgICsgXCImY2hhdFN0YXR1cz1cIiArIGNoYXRTdGF0dXM7XG4gIFxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8QXJyYXk8Q2hhdDRBcHA+Pih1cmwsXG4gICAgICAgIHtcbiAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoKS5zZXQoJ0F1dGhvcml6YXRpb24nLCB0aGlzLmdldEJlYXJlclRva2VuKCkpXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgY2xvc2VDaGF0KGNoYXRJZDogc3RyaW5nLCBjaGF0RXh0ZXJuYWxJZDogc3RyaW5nKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gIFxuICAgICAgbGV0IHVybCA9IHRoaXMuY2hhdFVybCA7XG5cbiAgICAgIGlmIChjaGF0SWQgJiYgY2hhdElkLmxlbmd0aCA+IDApe1xuICAgICAgICB1cmwrPSBcImNoYXQ/Y2hhdElkPVwiICsgY2hhdElkOyBcbiAgICAgIH1cbiAgICAgIFxuICAgICAgaWYgKGNoYXRFeHRlcm5hbElkICYmIGNoYXRFeHRlcm5hbElkLmxlbmd0aCA+IDApe1xuICAgICAgICB1cmwrPSBcImNoYXQ/ZXh0ZXJuYWxJZD1cIiArIGNoYXRFeHRlcm5hbElkOyBcbiAgICAgIH1cbiAgXG4gICAgICByZXR1cm4gdGhpcy5odHRwLmRlbGV0ZTx2b2lkPih1cmwsXG4gICAgICAgIHtcbiAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoKS5zZXQoJ0F1dGhvcml6YXRpb24nLCB0aGlzLmdldEJlYXJlclRva2VuKCkpXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgcmVhZE1lc3NhZ2UoY2hhdE1lc3NhZ2VJZDogc3RyaW5nLCB0b0lkPzogc3RyaW5nKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gIFxuICAgICAgbGV0IHVybCA9IHRoaXMuY2hhdFVybCArIFwiY2hhdG1lc3NhZ2UvcmVhZC9cIiArIGNoYXRNZXNzYWdlSWQ7XG4gIFxuICAgICAgaWYgKHRvSWQgJiYgdG9JZC5sZW5ndGggPiAwKSB7XG4gICAgICAgIHVybCArPSBcIi9cIiArIHRvSWQ7XG4gICAgICB9XG4gIFxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5wdXQ8dm9pZD4odXJsLCBudWxsLFxuICAgICAgICB7XG4gICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKCkuc2V0KCdBdXRob3JpemF0aW9uJywgdGhpcy5nZXRCZWFyZXJUb2tlbigpKVxuICAgICAgICB9KVxuICAgIH1cbiAgICBvbmxpbmUoY2hhdElkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPG51bWJlcj4ge1xuICBcbiAgICAgIGxldCB1cmwgPSB0aGlzLmNoYXRVcmwgKyBcImNoYXRtZXNzYWdlL29ubGluZS9cIiArIGNoYXRJZCA7XG4gIFxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8bnVtYmVyPih1cmwsXG4gICAgICAgIHtcbiAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoKS5zZXQoJ0F1dGhvcml6YXRpb24nLCB0aGlzLmdldEJlYXJlclRva2VuKCkpXG4gICAgICAgIH0pXG4gICAgfVxuICAgIHNldE9mZkxpbmUoY2hhdFVzZXJFeHRlcm5hbElkSWQ6IHN0cmluZyk6IE9ic2VydmFibGU8bnVtYmVyPiB7XG4gIFxuICAgICAgbGV0IHVybCA9IHRoaXMuY2hhdFVybCArIFwiY2hhdG1lc3NhZ2Uvc2V0LW9mZmxpbmUvXCIgKyBjaGF0VXNlckV4dGVybmFsSWRJZCA7XG4gIFxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5wdXQ8bnVtYmVyPih1cmwsIG51bGwsXG4gICAgICAgIHtcbiAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoKS5zZXQoJ0F1dGhvcml6YXRpb24nLCB0aGlzLmdldEJlYXJlclRva2VuKCkpXG4gICAgICAgIH0pXG4gICAgfVxuXG5cbiAgICBzZW5kRmlsZShjaGF0SWQ6IHN0cmluZywgZnJvbUlkOiBzdHJpbmcsIHRvSWQ6IHN0cmluZywgZmlsZVRvVXBsb2FkOiBGaWxlKTogT2JzZXJ2YWJsZTxDaGF0TWVzc2FnZUZpbGU0QXBwPiB7XG4gICAgICBjb25zdCBlbmRwb2ludCA9IHRoaXMuY2hhdFVybCArIFwiY2hhdG1lc3NhZ2Uvc2VuZEZpbGUvXCIgKyBjaGF0SWQgKyBcIi9cIiArIGZyb21JZCArIFwiL1wiICsgdG9JZDtcbiAgXG4gICAgICBjb25zdCBmb3JtRGF0YTogRm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcbiAgICAgIGZvcm1EYXRhLmFwcGVuZCgnZmlsZScsIGZpbGVUb1VwbG9hZCk7XG4gIFxuICAgICAgcmV0dXJuIHRoaXMuaHR0cFxuICAgICAgICAucG9zdDxDaGF0TWVzc2FnZUZpbGU0QXBwPihlbmRwb2ludCwgZm9ybURhdGEsXG4gICAgICAgICAge1xuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKCkuc2V0KCdBdXRob3JpemF0aW9uJywgdGhpcy5nZXRCZWFyZXJUb2tlbigpKVxuICAgICAgICAgIH0pO1xuICAgIH1cbiAgXG4gICAgc2VuZEZpbGVHcm91cChjaGF0SWQ6IHN0cmluZywgZnJvbUlkOiBzdHJpbmcsIGdyb3VwSWQ6IHN0cmluZywgZmlsZVRvVXBsb2FkOiBGaWxlKTogT2JzZXJ2YWJsZTxDaGF0TWVzc2FnZUZpbGU0QXBwPiB7XG4gICAgICBjb25zdCBlbmRwb2ludCA9IHRoaXMuY2hhdFVybCArIFwiY2hhdG1lc3NhZ2Uvc2VuZEZpbGVHcm91cC9cIiArIGNoYXRJZCArIFwiL1wiICsgZnJvbUlkICsgXCIvXCIgKyBncm91cElkO1xuICBcbiAgICAgIGNvbnN0IGZvcm1EYXRhOiBGb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xuICAgICAgZm9ybURhdGEuYXBwZW5kKCdmaWxlJywgZmlsZVRvVXBsb2FkKTtcbiAgXG4gICAgICByZXR1cm4gdGhpcy5odHRwXG4gICAgICAgIC5wb3N0PENoYXRNZXNzYWdlRmlsZTRBcHA+KGVuZHBvaW50LCBmb3JtRGF0YSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoKS5zZXQoJ0F1dGhvcml6YXRpb24nLCB0aGlzLmdldEJlYXJlclRva2VuKCkpXG4gICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgdHJhbnNsYXRlTWVzc2FnZShjaGF0TWVzc2FnZUlkOiBzdHJpbmcsIGxhbmd1YWdlVGFyZ2V0OiBzdHJpbmcpOiBPYnNlcnZhYmxlPENoYXQ0QXBwVHJhbnNsYXRlPiB7XG4gIFxuICAgICAgbGV0IHVybCA9IHRoaXMuY2hhdFVybCArIFwiY2hhdG1lc3NhZ2UvdHJhbnNsYXRlL1wiICsgY2hhdE1lc3NhZ2VJZCArIFwiL1wiICsgbGFuZ3VhZ2VUYXJnZXQ7XG4gIFxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8Q2hhdDRBcHBUcmFuc2xhdGU+KHVybCxcbiAgICAgICAge1xuICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycygpLnNldCgnQXV0aG9yaXphdGlvbicsIHRoaXMuZ2V0QmVhcmVyVG9rZW4oKSlcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBzdGFydFR5cGluZyhjaGF0SWQ6IHN0cmluZyxmcm9tSWQ6IHN0cmluZywgdG9JZDogc3RyaW5nKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gIFxuICAgICAgbGV0IHVybCA9IHRoaXMuY2hhdFVybCArIFwiY2hhdG1lc3NhZ2Uvc3RhcnRUeXBpbmcvXCIgKyBjaGF0SWQgKyBcIi9cIiArIGZyb21JZCArIFwiL1wiICsgdG9JZDtcbiAgXG4gICAgICByZXR1cm4gdGhpcy5odHRwLnB1dDx2b2lkPih1cmwsIG51bGwsXG4gICAgICAgIHtcbiAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoKS5zZXQoJ0F1dGhvcml6YXRpb24nLCB0aGlzLmdldEJlYXJlclRva2VuKCkpXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgc3RhcnRUeXBpbmdHcm91cChjaGF0SWQ6IHN0cmluZyxmcm9tSWQ6IHN0cmluZywgZ3JvdXBJZDogc3RyaW5nKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gIFxuICAgICAgbGV0IHVybCA9IHRoaXMuY2hhdFVybCArIFwiY2hhdG1lc3NhZ2Uvc3RhcnRUeXBpbmdHcm91cC9cIiArIGNoYXRJZCArIFwiL1wiICsgZnJvbUlkICsgXCIvXCIgKyBncm91cElkO1xuICBcbiAgICAgIHJldHVybiB0aGlzLmh0dHAucHV0PHZvaWQ+KHVybCwgbnVsbCxcbiAgICAgICAge1xuICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycygpLnNldCgnQXV0aG9yaXphdGlvbicsIHRoaXMuZ2V0QmVhcmVyVG9rZW4oKSlcbiAgICAgICAgfSlcbiAgICB9XG4gICAgc3RvcFR5cGluZyhjaGF0SWQ6IHN0cmluZyxmcm9tSWQ6IHN0cmluZywgdG9JZDogc3RyaW5nKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gIFxuICAgICAgbGV0IHVybCA9IHRoaXMuY2hhdFVybCArIFwiY2hhdG1lc3NhZ2Uvc3RvcFR5cGluZy9cIiArIGNoYXRJZCArIFwiL1wiICsgZnJvbUlkICsgXCIvXCIgKyB0b0lkO1xuICBcbiAgICAgIHJldHVybiB0aGlzLmh0dHAucHV0PHZvaWQ+KHVybCwgbnVsbCxcbiAgICAgICAge1xuICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycygpLnNldCgnQXV0aG9yaXphdGlvbicsIHRoaXMuZ2V0QmVhcmVyVG9rZW4oKSlcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBzdG9wVHlwaW5nR3JvdXAoY2hhdElkOiBzdHJpbmcsZnJvbUlkOiBzdHJpbmcsIGdyb3VwSWQ6IHN0cmluZyk6IE9ic2VydmFibGU8dm9pZD4ge1xuICBcbiAgICAgIGxldCB1cmwgPSB0aGlzLmNoYXRVcmwgKyBcImNoYXRtZXNzYWdlL3N0b3BUeXBpbmdHcm91cC9cIiArIGNoYXRJZCArIFwiL1wiICsgZnJvbUlkICsgXCIvXCIgKyBncm91cElkO1xuICBcbiAgICAgIHJldHVybiB0aGlzLmh0dHAucHV0PHZvaWQ+KHVybCwgbnVsbCxcbiAgICAgICAge1xuICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycygpLnNldCgnQXV0aG9yaXphdGlvbicsIHRoaXMuZ2V0QmVhcmVyVG9rZW4oKSlcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBjcmVhdGVHcm91cChncm91cDogQ2hhdEdyb3VwQXBwKTogT2JzZXJ2YWJsZTxDaGF0R3JvdXBBcHA+IHtcbiAgICAgIGxldCB1cmwgPSB0aGlzLmNoYXRVcmwgKyBcIi9ncm91cFwiO1xuICBcbiAgICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxDaGF0R3JvdXBBcHA+KHVybCwgZ3JvdXAsXG4gICAgICAgIHtcbiAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoKS5zZXQoJ0F1dGhvcml6YXRpb24nLCB0aGlzLmdldEJlYXJlclRva2VuKCkpXG4gICAgICAgIH0pXG4gICAgfVxuICAgIGdldEdyb3VwKGNoYXRJZDogc3RyaW5nLCBncm91cElkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPENoYXRHcm91cEFwcD4ge1xuICBcbiAgICAgIGxldCB1cmwgPSB0aGlzLmNoYXRVcmwgKyBcIi9ncm91cC9cIiArIGdyb3VwSWQgKyBcIi9cIiArIGNoYXRJZDtcbiAgXG4gICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxDaGF0R3JvdXBBcHA+KHVybCxcbiAgICAgICAge1xuICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycygpLnNldCgnQXV0aG9yaXphdGlvbicsIHRoaXMuZ2V0QmVhcmVyVG9rZW4oKSlcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBsaXN0R3JvdXBzKGNoYXRJZD86IHN0cmluZywgZXh0ZXJuYWxJZD86IHN0cmluZyk6IE9ic2VydmFibGU8QXJyYXk8Q2hhdEdyb3VwQXBwPj4ge1xuICBcbiAgICAgIGxldCB1cmwgPSB0aGlzLmNoYXRVcmwgKyBcIi9ncm91cC9cIiA7XG5cbiAgICAgIGlmIChjaGF0SWQgJiYgY2hhdElkLmxlbmd0aD4wKSB7XG4gICAgICAgIHVybCArPSBcIiZjaGF0SWQ9XCIgKyBjaGF0SWQ7XG4gICAgICB9XG4gICAgICBpZiAoZXh0ZXJuYWxJZCAmJiBleHRlcm5hbElkLmxlbmd0aD4wKSB7XG4gICAgICAgIHVybCArPSBcIiZleHRlcm5hbElkPVwiICsgZXh0ZXJuYWxJZDtcbiAgICAgIH1cbiAgXG4gICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxBcnJheTxDaGF0R3JvdXBBcHA+Pih1cmwsXG4gICAgICAgIHtcbiAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoKS5zZXQoJ0F1dGhvcml6YXRpb24nLCB0aGlzLmdldEJlYXJlclRva2VuKCkpXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgbGlzdEZpbGVzR3JvdXAoY2hhdElkOiBzdHJpbmcsIGdyb3VwSWQ6IHN0cmluZyk6IE9ic2VydmFibGU8QXJyYXk8Q2hhdE1lc3NhZ2VGaWxlNEFwcD4+IHtcbiAgXG4gICAgICBsZXQgdXJsID0gdGhpcy5jaGF0VXJsICsgXCIvZ3JvdXAvXCIgKyBjaGF0SWQgO1xuXG4gICAgICBpZiAoZ3JvdXBJZCAmJiBncm91cElkLmxlbmd0aD4wKSB7XG4gICAgICAgIHVybCArPSBcIiZncm91cElkPVwiICsgY2hhdElkO1xuICAgICAgfVxuICBcbiAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PEFycmF5PENoYXRNZXNzYWdlRmlsZTRBcHA+Pih1cmwsXG4gICAgICAgIHtcbiAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoKS5zZXQoJ0F1dGhvcml6YXRpb24nLCB0aGlzLmdldEJlYXJlclRva2VuKCkpXG4gICAgICAgIH0pXG4gICAgfVxuICBcbiAgICAvKiBUb2tlbiAqL1xuICAgIGdldEJlYXJlclRva2VuKCk6IHN0cmluZyB7XG4gIFxuICAgICAgbGV0IHJldCA9IFwiQmVhcmVyIFwiICsgd2luZG93LnNlc3Npb25TdG9yYWdlLmdldEl0ZW0oXCJjaGF0NEFwcFNlc3Npb25Ub2tlblwiKTtcbiAgXG4gICAgICByZXR1cm4gcmV0O1xuICAgIH1cbiAgXG4gIFxuICAgIHNldFRva2VuQ2hhdDRhcHAoY2hhdDRBcHBTZXNzaW9uVG9rZW46IHN0cmluZykge1xuICBcbiAgXG4gICAgICB3aW5kb3cuc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShcImNoYXQ0QXBwU2Vzc2lvblRva2VuXCIsIGNoYXQ0QXBwU2Vzc2lvblRva2VuKTtcbiAgICB9XG4gIFxuICBcbiAgICAvKiBDb25uZWN0aW9uICovXG4gIFxuICAgIG9uTWVzc2FnZUZpcmViYXNlUmVjZWl2ZWQoZGF0YTogYW55LCBjaGF0Q2FsbGJhY2s6IElDaGF0Q2FsbGJhY2spIHtcbiAgXG4gIFxuICAgICAgLy9hbGVydChcIm9uTWVzc2FnZVJlY2VpdmVkIGNvbm5lY3RGaXJlYmFzZVwiKTtcbiAgXG4gICAgICBpZiAoZGF0YS50eXBlID09IFwibXNnXCIpIHtcbiAgXG4gICAgICAgIGxldCBjaGF0NGFwcE1lc3NhZ2UgPSBuZXcgQ2hhdDRBcHBNZXNzYWdlUmVjZWl2ZSgpO1xuICAgICAgICBjaGF0NGFwcE1lc3NhZ2UuZGF0YS5jaGF0SWQgPSBkYXRhLmNoYXRJZDtcbiAgICAgICAgY2hhdDRhcHBNZXNzYWdlLmRhdGEuY2hhdE1lc3NhZ2VJZCA9IGRhdGEuY2hhdE1lc3NhZ2VJZDtcbiAgICAgICAgY2hhdDRhcHBNZXNzYWdlLmRhdGEuZXh0ZXJuYWxJZCA9IGRhdGEuZXh0ZXJuYWxJZDtcbiAgICAgICAgY2hhdDRhcHBNZXNzYWdlLmRhdGEuZnJvbUlkID0gZGF0YS5mcm9tSWQ7XG4gICAgICAgIGNoYXQ0YXBwTWVzc2FnZS5kYXRhLnRvSWQgPSBkYXRhLnRvSWQ7XG4gICAgICAgIGNoYXQ0YXBwTWVzc2FnZS5kYXRhLmdyb3VwSWQgPSBkYXRhLmdyb3VwSWQ7XG4gICAgICAgIGNoYXQ0YXBwTWVzc2FnZS5kYXRhLmRhdGVIb3VyID0gZGF0YS5kYXRlSG91cjtcbiAgICAgICAgY2hhdDRhcHBNZXNzYWdlLmRhdGEudHlwZSA9IGRhdGEudHlwZTtcbiAgICAgICAgY2hhdDRhcHBNZXNzYWdlLm5vdGlmaWNhdGlvbi5ib2R5ID0gZGF0YS5ib2R5O1xuICBcbiAgICAgICAgaWYgKGRhdGEuZmlsZUlkICYmIGRhdGEuZmlsZUlkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjaGF0NGFwcE1lc3NhZ2UuZGF0YS5maWxlSWQgPSBkYXRhLmZpbGVJZDtcbiAgICAgICAgICBjaGF0NGFwcE1lc3NhZ2UuZGF0YS5maWxlTmFtZSA9IGRhdGEuZmlsZU5hbWU7XG4gICAgICAgICAgY2hhdDRhcHBNZXNzYWdlLmRhdGEuZmlsZVNpemUgPSBkYXRhLmZpbGVTaXplO1xuICAgICAgICAgIGNoYXQ0YXBwTWVzc2FnZS5kYXRhLmZpbGVUeXBlID0gZGF0YS5maWxlVHlwZTtcbiAgXG4gICAgICAgIH1cbiAgXG4gICAgICAgIGxldCBkYXRUbXAgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICBcbiAgICAgICAgZm9yIChsZXQga2V5IGluIGRhdGEpIHtcbiAgICAgICAgICBkYXRUbXAuc2V0KGtleSwgZGF0YVtrZXldKTtcbiAgICAgICAgfVxuICBcbiAgICAgICAgY2hhdDRhcHBNZXNzYWdlLmRhdGEuYWxsID0gZGF0VG1wO1xuICBcbiAgICAgICAgY2hhdENhbGxiYWNrLm9uTWVzc2FnZShjaGF0NGFwcE1lc3NhZ2UpO1xuICBcbiAgICAgIH0gZWxzZSBpZiAoKGRhdGEudHlwZSA9PSBcIm9uXCIgfHwgZGF0YS50eXBlID09IFwib2ZmXCIpKSB7XG4gICAgICAgIGxldCBjaGF0NGFwcE1lc3NhZ2UgPSBuZXcgQ2hhdDRBcHBNZXNzYWdlUmVjZWl2ZSgpO1xuICAgICAgICBjaGF0NGFwcE1lc3NhZ2UuZGF0YS5jaGF0SWQgPSBkYXRhLmNoYXRJZDtcbiAgICAgICAgY2hhdDRhcHBNZXNzYWdlLmRhdGEuY2hhdE1lc3NhZ2VJZCA9IGRhdGEuY2hhdE1lc3NhZ2VJZDtcbiAgICAgICAgY2hhdDRhcHBNZXNzYWdlLmRhdGEuZXh0ZXJuYWxJZCA9IGRhdGEuZXh0ZXJuYWxJZDtcbiAgICAgICAgY2hhdDRhcHBNZXNzYWdlLmRhdGEuZnJvbUlkID0gZGF0YS5mcm9tSWQ7XG4gICAgICAgIGNoYXQ0YXBwTWVzc2FnZS5kYXRhLnRvSWQgPSBkYXRhLnRvSWQ7XG4gICAgICAgIGNoYXQ0YXBwTWVzc2FnZS5kYXRhLmdyb3VwSWQgPSBkYXRhLmdyb3VwSWQ7XG4gICAgICAgIGNoYXQ0YXBwTWVzc2FnZS5kYXRhLmRhdGVIb3VyID0gZGF0YS5kYXRlSG91cjtcbiAgICAgICAgY2hhdDRhcHBNZXNzYWdlLmRhdGEudHlwZSA9IGRhdGEudHlwZTtcblxuICAgICAgICBsZXQgZGF0VG1wID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgXG4gICAgICAgIGZvciAobGV0IGtleSBpbiBkYXRhKSB7XG4gICAgICAgICAgZGF0VG1wLnNldChrZXksIGRhdGFba2V5XSk7XG4gICAgICAgIH1cbiAgXG4gICAgICAgIGNoYXQ0YXBwTWVzc2FnZS5kYXRhLmFsbCA9IGRhdFRtcDtcbiAgXG4gICAgICAgIGNoYXRDYWxsYmFjay5vbk9mZmxpbmUoY2hhdDRhcHBNZXNzYWdlKTtcblxuICAgICAgfSBlbHNlIGlmIChkYXRhLnR5cGUgPT0gXCJyZWFkXCIgKSB7XG4gICAgICAgIGxldCBjaGF0NGFwcE1lc3NhZ2UgPSBuZXcgQ2hhdDRBcHBNZXNzYWdlUmVjZWl2ZSgpO1xuICAgICAgICBjaGF0NGFwcE1lc3NhZ2UuZGF0YS5jaGF0SWQgPSBkYXRhLmNoYXRJZDtcbiAgICAgICAgY2hhdDRhcHBNZXNzYWdlLmRhdGEuY2hhdE1lc3NhZ2VJZCA9IGRhdGEuY2hhdE1lc3NhZ2VJZDtcbiAgICAgICAgY2hhdDRhcHBNZXNzYWdlLmRhdGEuZXh0ZXJuYWxJZCA9IGRhdGEuZXh0ZXJuYWxJZDtcbiAgICAgICAgY2hhdDRhcHBNZXNzYWdlLmRhdGEuZnJvbUlkID0gZGF0YS5mcm9tSWQ7XG4gICAgICAgIGNoYXQ0YXBwTWVzc2FnZS5kYXRhLnRvSWQgPSBkYXRhLnRvSWQ7XG4gICAgICAgIGNoYXQ0YXBwTWVzc2FnZS5kYXRhLmdyb3VwSWQgPSBkYXRhLmdyb3VwSWQ7XG4gICAgICAgIGNoYXQ0YXBwTWVzc2FnZS5kYXRhLmRhdGVIb3VyID0gZGF0YS5kYXRlSG91cjtcbiAgICAgICAgY2hhdDRhcHBNZXNzYWdlLmRhdGEudHlwZSA9IGRhdGEudHlwZTtcblxuICAgICAgICBsZXQgZGF0VG1wID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgXG4gICAgICAgIGZvciAobGV0IGtleSBpbiBkYXRhKSB7XG4gICAgICAgICAgZGF0VG1wLnNldChrZXksIGRhdGFba2V5XSk7XG4gICAgICAgIH1cbiAgXG4gICAgICAgIGNoYXQ0YXBwTWVzc2FnZS5kYXRhLmFsbCA9IGRhdFRtcDtcbiAgXG4gICAgICAgIGNoYXRDYWxsYmFjay5vblJlYWQoY2hhdDRhcHBNZXNzYWdlKTtcbiAgICAgIH0gZWxzZSBpZiAoZGF0YS50eXBlID09IFwic3RhcnRUeXBpbmdcIiB8fCBkYXRhLnR5cGUgPT0gXCJzdG9wVHlwaW5nXCIgKSB7XG4gICAgICAgIGxldCBjaGF0NGFwcE1lc3NhZ2UgPSBuZXcgQ2hhdDRBcHBNZXNzYWdlUmVjZWl2ZSgpO1xuICAgICAgICBjaGF0NGFwcE1lc3NhZ2UuZGF0YS5jaGF0SWQgPSBkYXRhLmNoYXRJZDtcbiAgICAgICAgY2hhdDRhcHBNZXNzYWdlLmRhdGEuY2hhdE1lc3NhZ2VJZCA9IGRhdGEuY2hhdE1lc3NhZ2VJZDtcbiAgICAgICAgY2hhdDRhcHBNZXNzYWdlLmRhdGEuZXh0ZXJuYWxJZCA9IGRhdGEuZXh0ZXJuYWxJZDtcbiAgICAgICAgY2hhdDRhcHBNZXNzYWdlLmRhdGEuZnJvbUlkID0gZGF0YS5mcm9tSWQ7XG4gICAgICAgIGNoYXQ0YXBwTWVzc2FnZS5kYXRhLnRvSWQgPSBkYXRhLnRvSWQ7XG4gICAgICAgIGNoYXQ0YXBwTWVzc2FnZS5kYXRhLmdyb3VwSWQgPSBkYXRhLmdyb3VwSWQ7XG4gICAgICAgIGNoYXQ0YXBwTWVzc2FnZS5kYXRhLmRhdGVIb3VyID0gZGF0YS5kYXRlSG91cjtcbiAgICAgICAgY2hhdDRhcHBNZXNzYWdlLmRhdGEudHlwZSA9IGRhdGEudHlwZTtcblxuICAgICAgICBsZXQgZGF0VG1wID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgXG4gICAgICAgIGZvciAobGV0IGtleSBpbiBkYXRhKSB7XG4gICAgICAgICAgZGF0VG1wLnNldChrZXksIGRhdGFba2V5XSk7XG4gICAgICAgIH1cbiAgXG4gICAgICAgIGNoYXQ0YXBwTWVzc2FnZS5kYXRhLmFsbCA9IGRhdFRtcDtcbiAgXG4gICAgICAgIGNoYXRDYWxsYmFjay5vblN0YXJ0U3RvcFR5cGluZyhjaGF0NGFwcE1lc3NhZ2UpO1xuICAgICAgfSBlbHNlIGlmIChkYXRhLnR5cGUgPT0gXCJuZXdfdXNlclwiICApIHtcbiAgICAgICAgbGV0IGNoYXQ0YXBwTWVzc2FnZSA9IG5ldyBDaGF0NEFwcE1lc3NhZ2VSZWNlaXZlKCk7XG4gICAgICAgIGNoYXQ0YXBwTWVzc2FnZS5kYXRhLmNoYXRJZCA9IGRhdGEuY2hhdElkO1xuICAgICAgICBjaGF0NGFwcE1lc3NhZ2UuZGF0YS5jaGF0TWVzc2FnZUlkID0gZGF0YS5jaGF0TWVzc2FnZUlkO1xuICAgICAgICBjaGF0NGFwcE1lc3NhZ2UuZGF0YS5leHRlcm5hbElkID0gZGF0YS5leHRlcm5hbElkO1xuICAgICAgICBjaGF0NGFwcE1lc3NhZ2UuZGF0YS5mcm9tSWQgPSBkYXRhLmZyb21JZDtcbiAgICAgICAgY2hhdDRhcHBNZXNzYWdlLmRhdGEudG9JZCA9IGRhdGEudG9JZDtcbiAgICAgICAgY2hhdDRhcHBNZXNzYWdlLmRhdGEuZ3JvdXBJZCA9IGRhdGEuZ3JvdXBJZDtcbiAgICAgICAgY2hhdDRhcHBNZXNzYWdlLmRhdGEuZGF0ZUhvdXIgPSBkYXRhLmRhdGVIb3VyO1xuICAgICAgICBjaGF0NGFwcE1lc3NhZ2UuZGF0YS50eXBlID0gZGF0YS50eXBlO1xuXG4gICAgICAgIGxldCBkYXRUbXAgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICBcbiAgICAgICAgZm9yIChsZXQga2V5IGluIGRhdGEpIHtcbiAgICAgICAgICBkYXRUbXAuc2V0KGtleSwgZGF0YVtrZXldKTtcbiAgICAgICAgfVxuICBcbiAgICAgICAgY2hhdDRhcHBNZXNzYWdlLmRhdGEuYWxsID0gZGF0VG1wO1xuICBcbiAgICAgICAgY2hhdENhbGxiYWNrLm9uTmV3VXNlcihjaGF0NGFwcE1lc3NhZ2UpO1xuICAgICAgfSBlbHNlIGlmIChkYXRhLnR5cGUgPT0gXCJyZW1vdmVfdXNlclwiICApIHtcbiAgICAgICAgbGV0IGNoYXQ0YXBwTWVzc2FnZSA9IG5ldyBDaGF0NEFwcE1lc3NhZ2VSZWNlaXZlKCk7XG4gICAgICAgIGNoYXQ0YXBwTWVzc2FnZS5kYXRhLmNoYXRJZCA9IGRhdGEuY2hhdElkO1xuICAgICAgICBjaGF0NGFwcE1lc3NhZ2UuZGF0YS5jaGF0TWVzc2FnZUlkID0gZGF0YS5jaGF0TWVzc2FnZUlkO1xuICAgICAgICBjaGF0NGFwcE1lc3NhZ2UuZGF0YS5leHRlcm5hbElkID0gZGF0YS5leHRlcm5hbElkO1xuICAgICAgICBjaGF0NGFwcE1lc3NhZ2UuZGF0YS5mcm9tSWQgPSBkYXRhLmZyb21JZDtcbiAgICAgICAgY2hhdDRhcHBNZXNzYWdlLmRhdGEudG9JZCA9IGRhdGEudG9JZDtcbiAgICAgICAgY2hhdDRhcHBNZXNzYWdlLmRhdGEuZ3JvdXBJZCA9IGRhdGEuZ3JvdXBJZDtcbiAgICAgICAgY2hhdDRhcHBNZXNzYWdlLmRhdGEuZGF0ZUhvdXIgPSBkYXRhLmRhdGVIb3VyO1xuICAgICAgICBjaGF0NGFwcE1lc3NhZ2UuZGF0YS50eXBlID0gZGF0YS50eXBlO1xuXG4gICAgICAgIGxldCBkYXRUbXAgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICBcbiAgICAgICAgZm9yIChsZXQga2V5IGluIGRhdGEpIHtcbiAgICAgICAgICBkYXRUbXAuc2V0KGtleSwgZGF0YVtrZXldKTtcbiAgICAgICAgfVxuICBcbiAgICAgICAgY2hhdDRhcHBNZXNzYWdlLmRhdGEuYWxsID0gZGF0VG1wO1xuICBcbiAgICAgICAgY2hhdENhbGxiYWNrLm9uUmVtb3ZlVXNlcihjaGF0NGFwcE1lc3NhZ2UpO1xuICAgICAgfSBlbHNlIGlmIChkYXRhLnR5cGUgPT0gXCJjaGF0X2Nsb3NlZFwiICApIHtcbiAgICAgICAgbGV0IGNoYXQ0YXBwTWVzc2FnZSA9IG5ldyBDaGF0NEFwcE1lc3NhZ2VSZWNlaXZlKCk7XG4gICAgICAgIGNoYXQ0YXBwTWVzc2FnZS5kYXRhLmNoYXRJZCA9IGRhdGEuY2hhdElkO1xuICAgICAgICBjaGF0NGFwcE1lc3NhZ2UuZGF0YS5jaGF0TWVzc2FnZUlkID0gZGF0YS5jaGF0TWVzc2FnZUlkO1xuICAgICAgICBjaGF0NGFwcE1lc3NhZ2UuZGF0YS5leHRlcm5hbElkID0gZGF0YS5leHRlcm5hbElkO1xuICAgICAgICBjaGF0NGFwcE1lc3NhZ2UuZGF0YS5mcm9tSWQgPSBkYXRhLmZyb21JZDtcbiAgICAgICAgY2hhdDRhcHBNZXNzYWdlLmRhdGEudG9JZCA9IGRhdGEudG9JZDtcbiAgICAgICAgY2hhdDRhcHBNZXNzYWdlLmRhdGEuZ3JvdXBJZCA9IGRhdGEuZ3JvdXBJZDtcbiAgICAgICAgY2hhdDRhcHBNZXNzYWdlLmRhdGEuZGF0ZUhvdXIgPSBkYXRhLmRhdGVIb3VyO1xuICAgICAgICBjaGF0NGFwcE1lc3NhZ2UuZGF0YS50eXBlID0gZGF0YS50eXBlO1xuXG4gICAgICAgIGxldCBkYXRUbXAgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICBcbiAgICAgICAgZm9yIChsZXQga2V5IGluIGRhdGEpIHtcbiAgICAgICAgICBkYXRUbXAuc2V0KGtleSwgZGF0YVtrZXldKTtcbiAgICAgICAgfVxuICBcbiAgICAgICAgY2hhdDRhcHBNZXNzYWdlLmRhdGEuYWxsID0gZGF0VG1wO1xuICBcbiAgICAgICAgY2hhdENhbGxiYWNrLm9uQ2hhdENsb3NlZChjaGF0NGFwcE1lc3NhZ2UpO1xuICAgICAgfVxuXG4gIFxuICAgIH1cblxuICAgIGFzeW5jIGVuc3VyZUNvbm4oY2hhdFNlcnZlcjogc3RyaW5nLCBjaGF0VXNlckV4dGVybmFsSWQ6IHN0cmluZykge1xuXG4gICAgICBpZiAodGhpcy5kZWJ1Zykge1xuICAgICAgICBjb25zb2xlLmxvZyhgY2hhdFNlcnZlcjogJHt0aGlzLmNoYXRTZXJ2ZXJ9YCk7XG4gICAgICAgIGNvbnNvbGUubG9nKGB1c2VySWQ6ICR7Y2hhdFVzZXJFeHRlcm5hbElkfWApO1xuICAgICAgICBjb25zb2xlLmxvZyhgZ2V0QmVhcmVyVG9rZW46ICR7IHRoaXMuZ2V0QmVhcmVyVG9rZW4oKX1gKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgdGhhdCA9IHRoaXM7XG5cbiAgICAgIGxldCB1cmlTdGVwMTogc3RyaW5nID0gY2hhdFNlcnZlci5yZXBsYWNlKC9eaHR0cHMvLCAnd3NzJyk7XG5cbiAgICAgIGxldCBzZXJ2ZXI6IHN0cmluZyA9IHVyaVN0ZXAxLnJlcGxhY2UoLyhcXC9cXC8uKj8pXFwvLywgJyQxd3MvJyk7XG5cbiAgICAgIGlmICghdGhpcy5uYyB8fCAodGhpcy5uYy5pc0Nsb3NlICYmIHRoaXMubmMuaXNDbG9zZSgpKSkge1xuICAgICAgICBcbiAgICAgICAgdGhhdC5uYyA9IGF3YWl0IE5BVFMuY29ubmVjdCh7IHVybDogc2VydmVyLCB1c2VyOiBjaGF0VXNlckV4dGVybmFsSWQsIHBhc3M6IHRoaXMuZ2V0QmVhcmVyVG9rZW4oKSwgcmVjb25uZWN0OiB0cnVlfSk7XG5cbiAgICAgIH1cblxuICAgICAgdGhpcy5jaGF0VXNlckV4dGVybmFsSWQgPSBjaGF0VXNlckV4dGVybmFsSWQ7XG5cbiAgICAgIHJldHVybiB0aGF0Lm5jO1xuICAgIH1cblxuICAgIGFzeW5jIGRpc2Nvbm5lY3QoKSB7XG5cbiAgICAgIC8vIENoZWNrIGhvdyB3ZSBjYW4gZGlzY29ubmVjdFxuXG4gICAgICBpZiAodGhpcy5pbnRlcnZhbCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5pbnRlcnZhbCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5uYyAmJiB0aGlzLmNoYXRVc2VyRXh0ZXJuYWxJZCAmJiB0aGlzLmNoYXRVc2VyRXh0ZXJuYWxJZC5sZW5ndGggPiAwICYmIHRoaXMuZ2V0QmVhcmVyVG9rZW4oKSAmJiB0aGlzLmdldEJlYXJlclRva2VuKCkubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLnNldE9mZkxpbmUodGhpcy5jaGF0VXNlckV4dGVybmFsSWQpLnN1YnNjcmliZSgoKT0+e1xuICAgICAgICAgIGlmICh0aGlzLmRlYnVnKXtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiaGFkIHNldCBvZmZsaW5lXCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLm5jKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5uYy5jbG9zZSgpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgaWYgKHRoaXMuZGVidWcpe1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5uYyA9IHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuZGVidWcpe1xuICAgICAgICBjb25zb2xlLmxvZyhcImRpc2NvbmVjdFwiKVxuICAgICAgfVxuICAgICAgXG4gICAgfVxuXG4gICAgcHJvY2Vzc0FuZENhbGxiYWNrKG1zZ09iajogYW55LCBjaGF0Q2FsbGJhY2s6IElDaGF0Q2FsbGJhY2spIHtcblxuICAgICAgICBpZiAodGhpcy5kZWJ1ZyAmJiBtc2dPYmopIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIk1zZyBSZWNlaXZlZDogXCIgKyBKU09OLnN0cmluZ2lmeShtc2dPYmopKTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy9pZiAoIWNoYXRDYWxsYmFjay5pc1Rva2VuRmlyZWJhc2VBY3RpdmUoKSkge1xuXG4gICAgICAgICAgbGV0IGRhdFRtcCA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG5cbiAgICAgICAgICBmb3IgKGxldCBrZXkgaW4gbXNnT2JqLmRhdGEpIHtcbiAgICAgICAgICAgIGRhdFRtcC5zZXQoa2V5LCBtc2dPYmouZGF0YVtrZXldKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBtc2dPYmouZGF0YS5hbGwgPSBkYXRUbXA7XG5cbiAgICAgICAgICBpZiAobXNnT2JqLmRhdGEudHlwZSA9PSBcIm1zZ1wiKSB7XG4gICAgICAgICAgICBjaGF0Q2FsbGJhY2sub25NZXNzYWdlKG1zZ09iaik7XG4gICAgICAgICAgfSBlbHNlIGlmICgobXNnT2JqLmRhdGEudHlwZSA9PSBcIm9uXCIgfHwgbXNnT2JqLmRhdGEudHlwZSA9PSBcIm9mZlwiKSkge1xuICAgICAgICAgICAgY2hhdENhbGxiYWNrLm9uT2ZmbGluZShtc2dPYmopO1xuICAgICAgICAgIH0gZWxzZSBpZiAobXNnT2JqLmRhdGEudHlwZSA9PSBcInJlYWRcIiApIHtcbiAgICAgICAgICAgIGNoYXRDYWxsYmFjay5vblJlYWQobXNnT2JqKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKG1zZ09iai5kYXRhLnR5cGUgPT0gXCJzdGFydFR5cGluZ1wiIHx8ICBtc2dPYmouZGF0YS50eXBlID09IFwic3RvcFR5cGluZ1wiKSB7XG4gICAgICAgICAgICBjaGF0Q2FsbGJhY2sub25TdGFydFN0b3BUeXBpbmcobXNnT2JqKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKG1zZ09iai5kYXRhLnR5cGUgPT0gXCJuZXdfdXNlclwiKSB7XG4gICAgICAgICAgICBjaGF0Q2FsbGJhY2sub25OZXdVc2VyKG1zZ09iaik7XG4gICAgICAgICAgfSBlbHNlIGlmIChtc2dPYmouZGF0YS50eXBlID09IFwicmVtb3ZlX3VzZXJcIikge1xuICAgICAgICAgICAgY2hhdENhbGxiYWNrLm9uUmVtb3ZlVXNlcihtc2dPYmopO1xuICAgICAgICAgIH0gZWxzZSBpZiAobXNnT2JqLmRhdGEudHlwZSA9PSBcImNoYXRfY2xvc2VkXCIpIHtcbiAgICAgICAgICAgIGNoYXRDYWxsYmFjay5vbkNoYXRDbG9zZWQobXNnT2JqKTtcbiAgICAgICAgICB9XG4gICAgICAgIC8vfVxuXG4gICAgfVxuXG4gICAgYXN5bmMgY29ubmVjdFdlYnNvY2tldChjaGF0Q2FsbGJhY2s6IElDaGF0Q2FsbGJhY2ssIHVzZXJJZDogc3RyaW5nKSB7XG4gICAgICBjb25zdCB0aGF0ID0gdGhpcztcbiAgICAgIHRoaXMuZGlzY29ubmVjdCgpO1xuICBcbiAgICAgIGxldCBzZWN1cml0eVRva2VuID0gdGhpcy5nZXRCZWFyZXJUb2tlbigpO1xuXG4gICAgICBsZXQgdG9rZW5BdXRoID0gXCJcIjtcblxuICAgICAgaWYgKHNlY3VyaXR5VG9rZW4gJiYgc2VjdXJpdHlUb2tlbi5zdGFydHNXaXRoKFwiQmVhcmVyIFwiKSl7XG4gICAgICAgIHRva2VuQXV0aCA9IHNlY3VyaXR5VG9rZW47XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0b2tlbkF1dGggPSBcIkJlYXJlciBcIiArIHNlY3VyaXR5VG9rZW47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNvbmZpZ0lkID0gdGhpcy5jaGF0U2VydmVyLnNwbGl0KFwiL1wiKVszXTtcblxuICAgICAgY29uc3QgbmMgPSBhd2FpdCB0aGlzLmVuc3VyZUNvbm4oXCJodHRwczovL2FwaWhvbW9sLmNoYXQ0YXBwLmNvbVwiLCB1c2VySWQpO1xuXG4gICAgICAvL1RPRE8gR2V0IHRoZSB1c2VyIGlkIGZyb20gand0XG4gICAgICBjb25zdCBzdWJqZWN0ID0gYGNoYXQ0YXBwLmNvbmZpZy4ke2NvbmZpZ0lkfS51c2VyLiR7dXNlcklkfWA7IFxuXG4gICAgICBjb25zdCBzdWIgPSBuYy5zdWJzY3JpYmUoc3ViamVjdCwgKG1zZykgPT4ge1xuICAgICAgICBpZiAodGhpcy5kZWJ1Zykge1xuICAgICAgICAgIGNvbnNvbGUubG9nKG1zZyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnByb2Nlc3NBbmRDYWxsYmFjayhKU09OLnBhcnNlKG1zZy5kYXRhKSwgY2hhdENhbGxiYWNrKSAgO1xuICAgICAgICBcbiAgICAgIH0pO1xuXG4gICAgICBpZiAodGhpcy5pbnRlcnZhbCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5pbnRlcnZhbCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBcbiAgICAgICAgfVxuICAgICAgfVxuXG5cbiAgICAgIHRoYXQuaW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCgoKT0+e1xuICAgICAgICBpZiAodGhhdC5kZWJ1Zykge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGBwdWJsaXNoIGNoYXQ0YXBwLnVzZXIub25saW5lICR7dXNlcklkfSBgKTtcbiAgICAgICAgfVxuICAgICAgICB0aGF0Lm5jLnB1Ymxpc2goYGNoYXQ0YXBwLnVzZXIub25saW5lYCwgdXNlcklkKSA7XG4gICAgICB9LDEwMDApO1xuXG4gICAgICBpZiAodGhpcy5kZWJ1Zykge1xuICAgICAgICBjb25zb2xlLmxvZyhgU3Vic2NyaWJlIG9ubGluZSBjaGF0NGFwcC51c2VyLiR7dXNlcklkfS5vbmxpbmVgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLypcbiAgICBkaXNjb25uZWN0KCkge1xuLy8gICAgICBjb25zb2xlLmxvZyhcImRpc2Nvbm5lY3RcIilcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICh0aGlzLnN0b21wQ2xpZW50KSB7XG4gICAgICAgICAgdGhpcy5zdG9tcENsaWVudC5kaXNjb25uZWN0KCk7XG4gICAgICAgIH1cbiAgXG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGUpO1xuICAgICAgfVxuICAgIH1cbiAgICAqL1xuXG4gICAgY29udmVydENoYXQ0QXBwTWVzc2FnZVJlY2VpdmVUb0NoYXRNZXNzYWdlNEFwcChtc2c6IENoYXQ0QXBwTWVzc2FnZVJlY2VpdmUpOiBDaGF0TWVzc2FnZTRBcHB7XG4gICAgICBsZXQgbWVzc2FnZSA9IG5ldyBDaGF0TWVzc2FnZTRBcHAoKTtcbiAgICAgIG1lc3NhZ2UuYm9keSA9IG1zZz8ubm90aWZpY2F0aW9uPy5ib2R5O1xuICAgICAgbWVzc2FnZS5jaGF0SWQgPSBtc2cuZGF0YS5jaGF0SWQ7XG4gICAgICBtZXNzYWdlLmZyb21JZCA9IG1zZy5kYXRhLmZyb21JZDtcbiAgICAgIG1lc3NhZ2UudG9JZCA9IG1zZy5kYXRhLnRvSWQ7XG4gICAgICBtZXNzYWdlLmdyb3VwSWQgPSBtc2cuZGF0YS5ncm91cElkO1xuICAgICAgbWVzc2FnZS5yZXBseUZyb20gPSBtc2cuZGF0YS5yZXBseUZyb207XG4gICAgICBpZiAobXNnLmRhdGEuZGF0ZUhvdXIgJiYgbXNnLmRhdGEuZGF0ZUhvdXIubGVuZ3RoID4gMCkge1xuICAgICAgICBtZXNzYWdlLmRhdGVIb3VySW5jbHVkZWQgPSBtc2cuZGF0YS5kYXRlSG91ci5zdWJzdHJpbmcoNiwxMCkgKyBcIi1cIiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbXNnLmRhdGEuZGF0ZUhvdXIuc3Vic3RyaW5nKDMsNSkgKyBcIi1cIiAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1zZy5kYXRhLmRhdGVIb3VyLnN1YnN0cmluZygwLDIpIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtc2cuZGF0YS5kYXRlSG91ci5zdWJzdHJpbmcoMTApIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgO1xuICAgICAgfVxuICAgICAgbWVzc2FnZS5pZCA9IG1zZy5kYXRhLmNoYXRNZXNzYWdlSWQ7XG5cbiAgICAgIGlmIChtc2cuZGF0YS5maWxlSWQgJiYgbXNnLmRhdGEuZmlsZUlkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgbGV0IG1lc3NhZ2VGaWxlID0gbmV3IENoYXRNZXNzYWdlRmlsZTRBcHAoKTtcbiAgICAgICAgXG4gICAgICAgIG1lc3NhZ2VGaWxlLmlkID0gbXNnLmRhdGEuZmlsZUlkO1xuICAgICAgICBtZXNzYWdlRmlsZS5uYW1lID0gbXNnLmRhdGEuZmlsZU5hbWU7XG4gICAgICAgIG1lc3NhZ2VGaWxlLnNpemUgPSBtc2cuZGF0YS5maWxlU2l6ZTtcbiAgICAgICAgbWVzc2FnZUZpbGUudHlwZSA9IG1zZy5kYXRhLmZpbGVUeXBlO1xuXG4gICAgICAgIG1lc3NhZ2UuY2hhdE1lc3NhZ2VGaWxlID0gbWVzc2FnZUZpbGU7XG4gICAgICB9XG5cbiAgICAgIGlmIChtc2cuZGF0YS52RmlsZUlkICYmIG1zZy5kYXRhLnZGaWxlSWQubGVuZ3RoID4gMCkge1xuICAgICAgICBsZXQgbWVzc2FnZUZpbGUgPSBuZXcgQ2hhdE1lc3NhZ2VGaWxlNEFwcCgpO1xuICAgICAgICBcbiAgICAgICAgbWVzc2FnZUZpbGUuaWQgPSBtc2cuZGF0YS52RmlsZUlkO1xuICAgICAgICBtZXNzYWdlRmlsZS5uYW1lID0gbXNnLmRhdGEudkZpbGVOYW1lO1xuICAgICAgICBtZXNzYWdlRmlsZS5zaXplID0gbXNnLmRhdGEudkZpbGVTaXplO1xuICAgICAgICBtZXNzYWdlRmlsZS50eXBlID0gbXNnLmRhdGEudkZpbGVUeXBlO1xuXG4gICAgICAgIG1lc3NhZ2UuY2hhdFZvaWNlRmlsZSA9IG1lc3NhZ2VGaWxlO1xuICAgICAgfVxuXG5cbiAgICAgIHJldHVybiBtZXNzYWdlO1xuXG4gICAgfVxuICBcbiAgfVxuICBcbiAgXG4gIGV4cG9ydCBjbGFzcyBDaGF0NEFwcCB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBjb25maWdJZDogc3RyaW5nO1xuICAgIGV4dGVybmFsSWQ6IHN0cmluZztcbiAgICB0aXRsZTogc3RyaW5nO1xuICAgIHN0YXR1czogQ2hhdFN0YXR1czRBcHA7XG4gICAgdXNlcnM6IEFycmF5PENoYXRVc2VyNEFwcD47XG5cbiAgICBtZXRhOiBBcnJheTxDaGF0TWVzc2FnZU1ldGE0QXBwPjtcbiAgXG4gIH1cbiAgZXhwb3J0IGNsYXNzIENoYXRVc2VyNEFwcCB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgY2xpZW50VG9rZW46IHN0cmluZztcbiAgICBwaWN0dXJlUGF0aDogc3RyaW5nO1xuICAgIGVtYWlsOiBzdHJpbmc7XG4gICAgcGhvbmVOdW1iZXI6IHN0cmluZztcbiAgICBleHRlcm5hbElkOiBzdHJpbmc7XG4gICAgbWV0YTogQXJyYXk8Q2hhdE1lc3NhZ2VNZXRhNEFwcD47XG4gICAgc3RhdHVzOiBDaGF0VXNlclN0YXR1czRBcHA7XG4gIH1cbiAgZXhwb3J0IGNsYXNzIENoYXRNZXNzYWdlNEFwcCB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBmcm9tSWQ6IHN0cmluZztcbiAgICB0b0lkOiBzdHJpbmc7XG4gICAgY2hhdElkOiBzdHJpbmc7XG4gICAgdGl0bGU6IHN0cmluZztcbiAgICBib2R5OiBzdHJpbmc7XG4gICAgbWV0YTogQXJyYXk8Q2hhdE1lc3NhZ2VNZXRhNEFwcD47XG4gICAgZ3JvdXBJZDogc3RyaW5nO1xuICAgIHJlYWQ6IEJvb2xlYW47XG4gICAgcmVwbHlGcm9tOiBzdHJpbmc7XG4gICAgZGF0ZUhvdXJJbmNsdWRlZDogc3RyaW5nO1xuICAgIGdUb0lkUmVhZDogc3RyaW5nW107XG4gICAgY2hhdE1lc3NhZ2VGaWxlOiBDaGF0TWVzc2FnZUZpbGU0QXBwO1xuICAgIGNoYXRWb2ljZUZpbGU6IENoYXRNZXNzYWdlRmlsZTRBcHA7XG4gIH1cbiAgZXhwb3J0IGNsYXNzIENoYXRNZXNzYWdlRmlsZTRBcHAge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIHR5cGU6IHN0cmluZztcbiAgICBzaXplOiBudW1iZXI7XG4gICAgZnVsbFBhdGg6IHN0cmluZztcbiAgfVxuICBleHBvcnQgY2xhc3MgQ2hhdE1lc3NhZ2VNZXRhNEFwcCB7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIHZhbHVlOiBzdHJpbmc7XG4gIH1cbiAgZXhwb3J0IGNsYXNzIENoYXQ0QXBwTWVzc2FnZVJlY2VpdmUge1xuICAgIGRhdGE6IENoYXQ0QXBwTWVzc2FnZVJlY2VpdmVEYXRhID0gbmV3IENoYXQ0QXBwTWVzc2FnZVJlY2VpdmVEYXRhKCk7XG4gICAgbm90aWZpY2F0aW9uOiBDaGF0NEFwcE1lc3NhZ2VSZWNlaXZlTm90aWZpY2F0aW9uID0gbmV3IENoYXQ0QXBwTWVzc2FnZVJlY2VpdmVOb3RpZmljYXRpb24oKTtcbiAgICB0b2tlbjogc3RyaW5nO1xuICB9XG4gIGV4cG9ydCBjbGFzcyBDaGF0NEFwcE1lc3NhZ2VSZWNlaXZlRGF0YSB7XG4gICAgdG9JZDogc3RyaW5nO1xuICAgIGNoYXRJZDogc3RyaW5nO1xuICAgIGRhdGVIb3VyOiBzdHJpbmc7XG4gICAgY2hhdE1lc3NhZ2VJZDogc3RyaW5nO1xuICAgIGV4dGVybmFsSWQ6IHN0cmluZztcbiAgICB0eXBlOiBzdHJpbmc7XG4gICAgZnJvbUlkOiBzdHJpbmc7XG4gICAgcmVwbHlGcm9tOiBzdHJpbmc7XG4gICAgZ3JvdXBJZDogc3RyaW5nO1xuICAgIGZpbGVJZDogc3RyaW5nO1xuICAgIGZpbGVOYW1lOiBzdHJpbmc7XG4gICAgZmlsZVNpemU6IG51bWJlcjtcbiAgICBmaWxlVHlwZTogc3RyaW5nO1xuICAgIHZGaWxlSWQ6IHN0cmluZztcbiAgICB2RmlsZU5hbWU6IHN0cmluZztcbiAgICB2RmlsZVNpemU6IG51bWJlcjtcbiAgICB2RmlsZVR5cGU6IHN0cmluZztcblxuICAgIGFsbDogTWFwPHN0cmluZywgc3RyaW5nPjtcbiAgfVxuICBleHBvcnQgY2xhc3MgQ2hhdDRBcHBNZXNzYWdlUmVjZWl2ZU5vdGlmaWNhdGlvbiB7XG4gICAgYm9keTogc3RyaW5nO1xuICB9XG4gIFxuICBleHBvcnQgY2xhc3MgQ2hhdFVzZXJSZXNwb25zZTRBcHAge1xuICAgIHRvdGFsTWVzc2FnZXM6IG51bWJlcjtcbiAgICBjaGF0OiBDaGF0NEFwcDtcbiAgICBjaGF0TWVzc2FnZTogQ2hhdE1lc3NhZ2U0QXBwO1xuICAgIGNoYXRzOiBDaGF0VXNlclJlc3BvbnNlNEFwcFtdO1xuICB9XG4gIGV4cG9ydCBjbGFzcyBDaGF0RmlsdGVyUmVxdWVzdDRBcHAge1xuICAgIHR5cGU6IENoYXRGaWx0ZXJUeXBlO1xuICAgIGNoYXRFeHRlcm5hbElkOiBzdHJpbmc7XG4gICAgY2hhdFVzZXJFeHRlcm5hbElkOiBzdHJpbmc7XG4gICAgY2hhdFVzZXJFeHRlcm5hbFRvSWQ6IHN0cmluZztcbiAgICBncm91cElkOiBzdHJpbmc7XG4gICAgZnJvbUlkOiBzdHJpbmc7XG4gIH1cbiAgZXhwb3J0IGNsYXNzIENoYXQ0QXBwQ29uZmlnIHtcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgZW5kcG9pbnQ6IHN0cmluZywgcHVibGljIGRlYnVnPzogYm9vbGVhbikge1xuICAgICAgXG4gICAgfVxuICB9XG5cbiAgZXhwb3J0IGNsYXNzIENoYXQ0QXBwVHJhbnNsYXRlIHtcbiAgICB0ZXh0OiBzdHJpbmc7XG4gICAgdHJhbnNsYXRlZFRleHQ6IHN0cmluZztcbiAgICBvcmlnaW5hbFNvdXJjZUxhbmd1YWdlQ29kZTogc3RyaW5nO1xuICAgIHNvdXJjZUxhbmd1YWdlQ29kZTogc3RyaW5nO1xuICAgIHRhcmdldExhbmd1YWdlQ29kZTogc3RyaW5nO1xuICAgIG1lc3NhZ2VJZDogc3RyaW5nO1xuICB9XG5cbiAgZXhwb3J0IGNsYXNzIENoYXRHcm91cEFwcCB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBjaGF0SWQ6IHN0cmluZztcbiAgICBleHRlcm5hbElkOiBzdHJpbmc7XG4gICAgdGl0bGU6IHN0cmluZztcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIHVzZXJzOiBBcnJheTxzdHJpbmc+O1xuICAgIGZpbGVzOiBBcnJheTxDaGF0TWVzc2FnZUZpbGU0QXBwPjtcbiAgICBtZXRhOiBBcnJheTxDaGF0TWVzc2FnZU1ldGE0QXBwPjtcbiAgICBzdGF0dXM6IEdyb3VwU3RhdHVzNEFwcDtcbiAgfVxuXG4gIFxuICBleHBvcnQgZW51bSBDaGF0U3RhdHVzNEFwcCB7XG4gICAgQ1JFQVRFRCA9IFwiQ1JFQVRFRFwiLFxuICAgIENMT1NFRCA9IFwiQ0xPU0VEXCJcbiAgXG4gIH1cbiAgZXhwb3J0IGVudW0gQ2hhdFVzZXJTdGF0dXM0QXBwIHtcbiAgICBSRU1PVkVEID0gXCJSRU1PVkVEXCJcbiAgXG4gIH1cbiAgZXhwb3J0IGVudW0gQ2hhdEZpbHRlclR5cGUge1xuICAgIENPVU5UX05PVF9SRUFEID0gMSxcbiAgICBMQVNUX01FU1NBR0UgPSAyXG4gIH1cblxuICBleHBvcnQgZW51bSBHcm91cFN0YXR1czRBcHAge1xuICAgIENSRUFURUQgPSBcIkNSRUFURURcIixcbiAgICBDTE9TRUQgPSBcIlJFTU9WRURcIlxuICB9XG5cbiAgXG4gIGV4cG9ydCBpbnRlcmZhY2UgSUNoYXRDYWxsYmFjayB7XG4gICAgaXNUb2tlbkZpcmViYXNlQWN0aXZlKCk6IEJvb2xlYW47XG4gICAgb25NZXNzYWdlKG1zZzogQ2hhdDRBcHBNZXNzYWdlUmVjZWl2ZSk6IHZvaWQ7XG4gICAgb25PZmZsaW5lKG1zZzogQ2hhdDRBcHBNZXNzYWdlUmVjZWl2ZSk6IHZvaWQ7XG4gICAgb25SZWFkKG1zZzogQ2hhdDRBcHBNZXNzYWdlUmVjZWl2ZSk6IHZvaWQ7XG4gICAgb25TdGFydFN0b3BUeXBpbmcobXNnOiBDaGF0NEFwcE1lc3NhZ2VSZWNlaXZlKTogdm9pZDtcbiAgICBvbk5ld1VzZXIobXNnOiBDaGF0NEFwcE1lc3NhZ2VSZWNlaXZlKTogdm9pZDtcbiAgICBvblJlbW92ZVVzZXIobXNnOiBDaGF0NEFwcE1lc3NhZ2VSZWNlaXZlKTogdm9pZDtcbiAgICBvbkNoYXRDbG9zZWQobXNnOiBDaGF0NEFwcE1lc3NhZ2VSZWNlaXZlKTogdm9pZDtcbiAgfVxuICAiXX0=