@secrecy/lib 1.0.0-dev.6 → 1.0.0-dev.61

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.
Files changed (126) hide show
  1. package/README.md +1 -1
  2. package/dist/BaseClient.d.ts +123 -0
  3. package/dist/BaseClient.js +569 -0
  4. package/{lib → dist}/PopupTools.d.ts +1 -1
  5. package/dist/PopupTools.js +221 -0
  6. package/{lib → dist}/ZeusThunder.d.ts +0 -0
  7. package/dist/ZeusThunder.js +79 -0
  8. package/dist/cache.d.ts +6 -0
  9. package/dist/cache.js +4 -0
  10. package/dist/client/SecrecyAppClient.d.ts +17 -0
  11. package/dist/client/SecrecyAppClient.js +256 -0
  12. package/dist/client/SecrecyCloudClient.d.ts +89 -0
  13. package/dist/client/SecrecyCloudClient.js +1627 -0
  14. package/dist/client/SecrecyDbClient.d.ts +21 -0
  15. package/dist/client/SecrecyDbClient.js +198 -0
  16. package/dist/client/SecrecyMailClient.d.ts +42 -0
  17. package/dist/client/SecrecyMailClient.js +1187 -0
  18. package/dist/client/SecrecyPayClient.d.ts +7 -0
  19. package/dist/client/SecrecyPayClient.js +37 -0
  20. package/dist/client/SecrecyWalletClient.d.ts +30 -0
  21. package/dist/client/SecrecyWalletClient.js +76 -0
  22. package/{lib → dist}/client/convert/file.d.ts +3 -3
  23. package/dist/client/convert/file.js +34 -0
  24. package/dist/client/convert/mail.d.ts +3 -0
  25. package/dist/client/convert/mail.js +48 -0
  26. package/dist/client/convert/node.d.ts +9 -0
  27. package/dist/client/convert/node.js +100 -0
  28. package/{lib → dist}/client/helpers.d.ts +6 -1
  29. package/dist/client/helpers.js +126 -0
  30. package/dist/client/index.d.ts +34 -0
  31. package/dist/client/index.js +52 -0
  32. package/{lib → dist}/client/storage.d.ts +0 -0
  33. package/dist/client/storage.js +12 -0
  34. package/dist/client/types/File.d.ts +14 -0
  35. package/dist/client/types/File.js +3 -0
  36. package/{lib → dist}/client/types/Inputs.d.ts +2 -7
  37. package/dist/client/types/Inputs.js +3 -0
  38. package/dist/client/types/Node.d.ts +56 -0
  39. package/dist/client/types/Node.js +3 -0
  40. package/dist/client/types/UserAppNotifications.d.ts +6 -0
  41. package/dist/client/types/UserAppNotifications.js +3 -0
  42. package/{lib → dist}/client/types/UserAppSettings.d.ts +1 -3
  43. package/dist/client/types/UserAppSettings.js +3 -0
  44. package/{lib → dist}/client/types/index.d.ts +10 -43
  45. package/dist/client/types/index.js +8 -0
  46. package/dist/client/types/selectors.d.ts +400 -0
  47. package/dist/client/types/selectors.js +138 -0
  48. package/{lib → dist}/crypto/file.d.ts +0 -0
  49. package/dist/crypto/file.js +210 -0
  50. package/{lib → dist}/crypto/index.d.ts +0 -0
  51. package/dist/crypto/index.js +47 -0
  52. package/dist/error.d.ts +30 -0
  53. package/dist/error.js +3 -0
  54. package/dist/index.d.ts +11 -0
  55. package/dist/index.js +9 -0
  56. package/{lib → dist}/minify/index.d.ts +0 -0
  57. package/dist/minify/index.js +28 -0
  58. package/{lib → dist}/minify/lz4.d.ts +0 -0
  59. package/dist/minify/lz4.js +627 -0
  60. package/{lib → dist}/sodium.d.ts +0 -0
  61. package/dist/sodium.js +6 -0
  62. package/{lib → dist}/utils/store-buddy.d.ts +0 -0
  63. package/dist/utils/store-buddy.js +65 -0
  64. package/{lib → dist}/utils/time.d.ts +0 -0
  65. package/dist/utils/time.js +14 -0
  66. package/{lib → dist/utils}/utils.d.ts +0 -0
  67. package/dist/utils/utils.js +57 -0
  68. package/{lib → dist}/worker/md5.d.ts +0 -0
  69. package/dist/worker/md5.js +25 -0
  70. package/{lib → dist}/worker/sodium.d.ts +0 -0
  71. package/dist/worker/sodium.js +120 -0
  72. package/{lib → dist}/worker/workerCodes.d.ts +0 -0
  73. package/dist/worker/workerCodes.js +255 -0
  74. package/{lib → dist}/zeus/const.d.ts +5 -0
  75. package/dist/zeus/const.js +1286 -0
  76. package/dist/zeus/index.d.ts +6119 -0
  77. package/dist/zeus/index.js +687 -0
  78. package/package.json +60 -52
  79. package/lib/BaseClient.d.ts +0 -266
  80. package/lib/BaseClient.js +0 -1332
  81. package/lib/PopupTools.js +0 -213
  82. package/lib/ZeusThunder.js +0 -112
  83. package/lib/cache.d.ts +0 -7
  84. package/lib/cache.js +0 -5
  85. package/lib/client/convert/file.js +0 -39
  86. package/lib/client/convert/folder.d.ts +0 -8
  87. package/lib/client/convert/folder.js +0 -264
  88. package/lib/client/convert/mail.d.ts +0 -3
  89. package/lib/client/convert/mail.js +0 -46
  90. package/lib/client/convert/vFile.d.ts +0 -5
  91. package/lib/client/convert/vFile.js +0 -164
  92. package/lib/client/helpers.js +0 -116
  93. package/lib/client/index.d.ts +0 -166
  94. package/lib/client/index.js +0 -3697
  95. package/lib/client/storage.js +0 -12
  96. package/lib/client/types/File.d.ts +0 -21
  97. package/lib/client/types/File.js +0 -2
  98. package/lib/client/types/FilesOnUsersOnApplications.d.ts +0 -9
  99. package/lib/client/types/FilesOnUsersOnApplications.js +0 -2
  100. package/lib/client/types/Folder.d.ts +0 -68
  101. package/lib/client/types/Folder.js +0 -7
  102. package/lib/client/types/Inputs.js +0 -2
  103. package/lib/client/types/UserAppSettings.js +0 -2
  104. package/lib/client/types/VFile.d.ts +0 -62
  105. package/lib/client/types/VFile.js +0 -4
  106. package/lib/client/types/index.js +0 -8
  107. package/lib/client/types/queries.d.ts +0 -535
  108. package/lib/client/types/queries.js +0 -192
  109. package/lib/crypto/file.js +0 -291
  110. package/lib/crypto/index.js +0 -37
  111. package/lib/index.d.ts +0 -11
  112. package/lib/index.js +0 -40
  113. package/lib/minify/index.js +0 -28
  114. package/lib/minify/lz4.js +0 -633
  115. package/lib/sodium.js +0 -28
  116. package/lib/utils/store-buddy.js +0 -69
  117. package/lib/utils/time.js +0 -22
  118. package/lib/utils.js +0 -188
  119. package/lib/worker/__mock__/sodium.worker.d.ts +0 -19
  120. package/lib/worker/__mock__/sodium.worker.js +0 -57
  121. package/lib/worker/md5.js +0 -43
  122. package/lib/worker/sodium.js +0 -155
  123. package/lib/worker/workerCodes.js +0 -3
  124. package/lib/zeus/const.js +0 -1609
  125. package/lib/zeus/index.d.ts +0 -26113
  126. package/lib/zeus/index.js +0 -552
@@ -0,0 +1,1187 @@
1
+ import _defineProperty from "@babel/runtime/helpers/defineProperty";
2
+ import _classPrivateFieldLooseBase from "@babel/runtime/helpers/classPrivateFieldLooseBase";
3
+ import _classPrivateFieldLooseKey from "@babel/runtime/helpers/classPrivateFieldLooseKey";
4
+
5
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
6
+
7
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
8
+
9
+ /* eslint-disable @typescript-eslint/naming-convention */
10
+ import { generate } from "shortid";
11
+ import { filesCache, usersCache } from "../cache.js";
12
+ import { encryptCryptoBox, sodium } from "../index.js";
13
+ import { convertInternalMailToExternal } from "./convert/mail.js";
14
+ import { mailSelector } from "./types/selectors.js";
15
+
16
+ var _client = /*#__PURE__*/_classPrivateFieldLooseKey("client");
17
+
18
+ var _keys = /*#__PURE__*/_classPrivateFieldLooseKey("keys");
19
+
20
+ var _thunder = /*#__PURE__*/_classPrivateFieldLooseKey("thunder");
21
+
22
+ export class SecrecyMailClient {
23
+ constructor(client, keys, thunder) {
24
+ Object.defineProperty(this, _client, {
25
+ writable: true,
26
+ value: void 0
27
+ });
28
+ Object.defineProperty(this, _keys, {
29
+ writable: true,
30
+ value: void 0
31
+ });
32
+ Object.defineProperty(this, _thunder, {
33
+ writable: true,
34
+ value: void 0
35
+ });
36
+
37
+ this._eachUser = async (files, subject, body, idOrMail) => {
38
+ let u = usersCache.get(idOrMail);
39
+
40
+ if (!u || !("publicKey" in u)) {
41
+ try {
42
+ const req = await _classPrivateFieldLooseBase(this, _client)[_client].user({
43
+ userId: idOrMail,
44
+ withPublicKey: true
45
+ });
46
+
47
+ if (!req) {
48
+ return null;
49
+ }
50
+
51
+ if (req.__typename !== "SuccessResponse") {
52
+ return null;
53
+ }
54
+
55
+ u = req.data;
56
+ } catch {
57
+ return null;
58
+ }
59
+
60
+ if (!u) {
61
+ return null;
62
+ }
63
+ }
64
+
65
+ if (!("publicKey" in u)) {
66
+ throw new Error(`User ${idOrMail} have no public key`);
67
+ }
68
+
69
+ const recipientsFiles = new Array();
70
+
71
+ for (const f of files) {
72
+ let fileInHistory = filesCache.get(f.id);
73
+
74
+ if (!fileInHistory) {
75
+ await _classPrivateFieldLooseBase(this, _client)[_client].cloud.fileMetadata({
76
+ id: f.id
77
+ });
78
+ fileInHistory = filesCache.get(f.id);
79
+
80
+ if (!fileInHistory) {
81
+ throw new Error(`File ${f.name} (${f.id}) does not exists`);
82
+ }
83
+ }
84
+
85
+ const key = fileInHistory.key;
86
+ recipientsFiles.push({
87
+ id: f.id,
88
+ name: sodium.to_hex(encryptCryptoBox(sodium.from_string(f.name), u.publicKey, _classPrivateFieldLooseBase(this, _keys)[_keys].privateKey)),
89
+ fileKey: sodium.to_hex(encryptCryptoBox(sodium.from_hex(key), u.publicKey, _classPrivateFieldLooseBase(this, _keys)[_keys].privateKey))
90
+ });
91
+ }
92
+
93
+ return {
94
+ recipientId: u.id,
95
+ body: sodium.to_hex(encryptCryptoBox(sodium.from_string(body), u.publicKey, _classPrivateFieldLooseBase(this, _keys)[_keys].privateKey)),
96
+ subject: sodium.to_hex(encryptCryptoBox(sodium.from_string(subject), u.publicKey, _classPrivateFieldLooseBase(this, _keys)[_keys].privateKey)),
97
+ files: recipientsFiles
98
+ };
99
+ };
100
+
101
+ _classPrivateFieldLooseBase(this, _client)[_client] = client;
102
+ _classPrivateFieldLooseBase(this, _keys)[_keys] = keys;
103
+ _classPrivateFieldLooseBase(this, _thunder)[_thunder] = thunder;
104
+ }
105
+
106
+ async get(_ref) {
107
+ let {
108
+ id
109
+ } = _ref;
110
+ const {
111
+ mail
112
+ } = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("query", {
113
+ scalars: {
114
+ DateTime: {
115
+ decode: e => new Date(e),
116
+ encode: e => e.toISOString()
117
+ }
118
+ }
119
+ })({
120
+ mail: [{
121
+ id
122
+ }, {
123
+ "...on ErrorAccessDenied": {
124
+ __typename: true,
125
+ message: true
126
+ },
127
+ "...on QueryMailResponse": {
128
+ __typename: true,
129
+ mail: mailSelector
130
+ }
131
+ }]
132
+ });
133
+
134
+ if (!mail) {
135
+ return null;
136
+ }
137
+
138
+ if (mail.__typename === "ErrorAccessDenied") {
139
+ return mail;
140
+ }
141
+
142
+ if (!mail.mail) {
143
+ return null;
144
+ }
145
+
146
+ const result = convertInternalMailToExternal(mail.mail, _classPrivateFieldLooseBase(this, _keys)[_keys]);
147
+
148
+ if (!result) {
149
+ return null;
150
+ }
151
+
152
+ return {
153
+ __typename: "SuccessResponse",
154
+ data: result
155
+ };
156
+ }
157
+
158
+ async recover(_ref2) {
159
+ let {
160
+ mailId
161
+ } = _ref2;
162
+ const {
163
+ recoverMail
164
+ } = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("mutation")({
165
+ recoverMail: [{
166
+ mailId
167
+ }, {
168
+ "...on ErrorAccessDenied": {
169
+ __typename: true,
170
+ message: true
171
+ },
172
+ "...on ErrorBasic": {
173
+ __typename: true,
174
+ message: true
175
+ },
176
+ "...on RecoverMailResponse": {
177
+ __typename: true,
178
+ recoverMail: true
179
+ }
180
+ }]
181
+ });
182
+
183
+ if (!recoverMail) {
184
+ return null;
185
+ }
186
+
187
+ if (recoverMail.__typename === "ErrorAccessDenied") {
188
+ return recoverMail;
189
+ }
190
+
191
+ if (recoverMail.__typename === "ErrorBasic") {
192
+ return recoverMail;
193
+ }
194
+
195
+ return {
196
+ __typename: "SuccessResponse",
197
+ data: recoverMail.recoverMail
198
+ };
199
+ }
200
+
201
+ async deletedMails(_ref3) {
202
+ let {
203
+ mailType
204
+ } = _ref3;
205
+ const {
206
+ deletedMails
207
+ } = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("query", {
208
+ scalars: {
209
+ DateTime: {
210
+ decode: e => new Date(e),
211
+ encode: e => e.toISOString()
212
+ }
213
+ }
214
+ })({
215
+ deletedMails: [{
216
+ mailType
217
+ }, {
218
+ "...on ErrorAccessDenied": {
219
+ __typename: true,
220
+ message: true
221
+ },
222
+ "...on DeletedMailsResponse": {
223
+ __typename: true,
224
+ deletedMails: mailSelector
225
+ }
226
+ }]
227
+ });
228
+
229
+ if (!deletedMails) {
230
+ return null;
231
+ }
232
+
233
+ if (deletedMails.__typename === "ErrorAccessDenied") {
234
+ return deletedMails;
235
+ }
236
+
237
+ const mails = new Array();
238
+
239
+ for (const m of deletedMails.deletedMails) {
240
+ const mail = convertInternalMailToExternal(m, _classPrivateFieldLooseBase(this, _keys)[_keys]);
241
+
242
+ if (mail) {
243
+ mails.push(mail);
244
+ }
245
+ }
246
+
247
+ return {
248
+ __typename: "SuccessResponse",
249
+ data: mails
250
+ };
251
+ }
252
+
253
+ async create(data, customMessage) {
254
+ const mail = await this.createDraft(data);
255
+
256
+ if (!mail) {
257
+ return {
258
+ __typename: "SuccessResponse",
259
+ data: false
260
+ };
261
+ }
262
+
263
+ if (mail.__typename === "ErrorBasic") {
264
+ return mail;
265
+ }
266
+
267
+ if (mail.__typename === "ErrorAccessDenied") {
268
+ return mail;
269
+ }
270
+
271
+ const result = await this.sendDraft(mail.data.mailIntegrityId, customMessage);
272
+
273
+ if (!result) {
274
+ return null;
275
+ }
276
+
277
+ if (result.__typename === "ErrorAccessDenied") {
278
+ return result;
279
+ }
280
+
281
+ if (result.__typename === "ErrorBasic") {
282
+ return result;
283
+ }
284
+
285
+ return {
286
+ __typename: "SuccessResponse",
287
+ data: result.data
288
+ };
289
+ }
290
+
291
+ async waitingReceivedMails() {
292
+ const {
293
+ user
294
+ } = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("query")({
295
+ user: [{}, {
296
+ "...on ErrorNotFound": {
297
+ __typename: true,
298
+ message: true
299
+ },
300
+ "...on UserResponse": {
301
+ __typename: true,
302
+ user: {
303
+ waitingReceivedMails: {
304
+ date: true,
305
+ attachmentsCount: true,
306
+ sender: {
307
+ id: true,
308
+ firstname: true,
309
+ lastname: true,
310
+ email: true,
311
+ publicKey: true
312
+ },
313
+ recipients: {
314
+ id: true,
315
+ firstname: true,
316
+ lastname: true,
317
+ email: true,
318
+ publicKey: true
319
+ },
320
+ temporaryRecipients: {
321
+ email: true
322
+ }
323
+ }
324
+ }
325
+ }
326
+ }]
327
+ });
328
+
329
+ if (!user) {
330
+ return null;
331
+ }
332
+
333
+ if (user.__typename === "ErrorNotFound") {
334
+ return user;
335
+ }
336
+
337
+ if (!user.user) {
338
+ return null;
339
+ }
340
+
341
+ const result = user.user.waitingReceivedMails.map(m => _objectSpread(_objectSpread({
342
+ id: generate()
343
+ }, m), {}, {
344
+ date: new Date(m.date)
345
+ }));
346
+ return {
347
+ __typename: "SuccessResponse",
348
+ data: result
349
+ };
350
+ }
351
+
352
+ async updateDraft(draftId, _ref4) {
353
+ let {
354
+ body,
355
+ subject,
356
+ files,
357
+ recipientsIds,
358
+ replyTo
359
+ } = _ref4;
360
+ const drafts = await this.draftMails();
361
+
362
+ if (!drafts) {
363
+ return null;
364
+ }
365
+
366
+ if (drafts.__typename !== "SuccessResponse") {
367
+ return drafts;
368
+ }
369
+
370
+ const draft = drafts.data.find(d => d.mailIntegrityId === draftId);
371
+
372
+ if (!draft) {
373
+ throw new Error(`Invalid draft ${draftId}`);
374
+ }
375
+
376
+ let hashKey = null;
377
+ let hash = null;
378
+
379
+ if (body || subject) {
380
+ hashKey = sodium.randombytes_buf(sodium.crypto_generichash_KEYBYTES, "hex");
381
+ hash = sodium.crypto_generichash(sodium.crypto_generichash_BYTES, JSON.stringify({
382
+ body,
383
+ subject
384
+ }), hashKey, "hex");
385
+ }
386
+
387
+ const senderFiles = new Array();
388
+
389
+ if (files) {
390
+ for (const f of files) {
391
+ let file = filesCache.get(f.id);
392
+
393
+ if (!file) {
394
+ await _classPrivateFieldLooseBase(this, _client)[_client].cloud.fileMetadata({
395
+ id: f.id
396
+ });
397
+ file = filesCache.get(f.id);
398
+
399
+ if (!file) {
400
+ throw new Error(`File ${f.name} (${f.id}) does not exists`);
401
+ }
402
+ }
403
+
404
+ senderFiles.push({
405
+ id: file.id,
406
+ fileKey: sodium.to_hex(encryptCryptoBox(sodium.from_string(file.key), _classPrivateFieldLooseBase(this, _keys)[_keys].publicKey, _classPrivateFieldLooseBase(this, _keys)[_keys].privateKey)),
407
+ name: sodium.to_hex(encryptCryptoBox(sodium.from_string(f.name), _classPrivateFieldLooseBase(this, _keys)[_keys].publicKey, _classPrivateFieldLooseBase(this, _keys)[_keys].privateKey))
408
+ });
409
+ }
410
+ }
411
+
412
+ const {
413
+ updateDraftMail
414
+ } = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("mutation", {
415
+ scalars: {
416
+ Json: {
417
+ encode: e => JSON.stringify(e),
418
+ decode: e => JSON.parse(e)
419
+ },
420
+ DateTime: {
421
+ decode: e => new Date(e),
422
+ encode: e => e.toISOString()
423
+ },
424
+ BigInt: {
425
+ decode: e => BigInt(e),
426
+ encode: e => e.toString()
427
+ }
428
+ }
429
+ })({
430
+ updateDraftMail: [{
431
+ draftId,
432
+ recipients: recipientsIds,
433
+ replyTo,
434
+ body: body ? sodium.to_hex(encryptCryptoBox(sodium.from_string(body), _classPrivateFieldLooseBase(this, _keys)[_keys].publicKey, _classPrivateFieldLooseBase(this, _keys)[_keys].privateKey)) : null,
435
+ subject: subject ? sodium.to_hex(encryptCryptoBox(sodium.from_string(subject), _classPrivateFieldLooseBase(this, _keys)[_keys].publicKey, _classPrivateFieldLooseBase(this, _keys)[_keys].privateKey)) : null,
436
+ senderFiles,
437
+ hash,
438
+ hashKey
439
+ }, {
440
+ "...on ErrorAccessDenied": {
441
+ __typename: true,
442
+ message: true
443
+ },
444
+ "...on ErrorBasic": {
445
+ __typename: true,
446
+ message: true
447
+ },
448
+ "...on UpdateDraftMailResponse": {
449
+ __typename: true,
450
+ updateDraftMail: mailSelector
451
+ }
452
+ }]
453
+ });
454
+
455
+ if (!updateDraftMail) {
456
+ return null;
457
+ }
458
+
459
+ if (updateDraftMail.__typename === "ErrorAccessDenied") {
460
+ return updateDraftMail;
461
+ }
462
+
463
+ if (updateDraftMail.__typename === "ErrorBasic") {
464
+ return updateDraftMail;
465
+ }
466
+
467
+ if (!updateDraftMail.updateDraftMail) {
468
+ return null;
469
+ }
470
+
471
+ const result = convertInternalMailToExternal(updateDraftMail.updateDraftMail, _classPrivateFieldLooseBase(this, _keys)[_keys]);
472
+ return {
473
+ __typename: "SuccessResponse",
474
+ data: result
475
+ };
476
+ }
477
+
478
+ async deleteDraft(draftId) {
479
+ const {
480
+ deleteDraftMail
481
+ } = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("mutation")({
482
+ deleteDraftMail: [{
483
+ draftId
484
+ }, {
485
+ "...on ErrorAccessDenied": {
486
+ __typename: true,
487
+ message: true
488
+ },
489
+ "...on DeleteDraftMailResponse": {
490
+ __typename: true,
491
+ deleteDraftMail: true
492
+ }
493
+ }]
494
+ });
495
+
496
+ if (!deleteDraftMail) {
497
+ return null;
498
+ }
499
+
500
+ if (deleteDraftMail.__typename === "ErrorAccessDenied") {
501
+ return deleteDraftMail;
502
+ }
503
+
504
+ if (!deleteDraftMail.deleteDraftMail) {
505
+ return null;
506
+ }
507
+
508
+ return {
509
+ __typename: "SuccessResponse",
510
+ data: deleteDraftMail.deleteDraftMail ?? false
511
+ };
512
+ }
513
+
514
+ async deleteTrash(_ref5) {
515
+ let {
516
+ ids
517
+ } = _ref5;
518
+ const {
519
+ deleteMailTrash
520
+ } = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("mutation")({
521
+ deleteMailTrash: [{
522
+ ids
523
+ }, {
524
+ "...on ErrorAccessDenied": {
525
+ __typename: true,
526
+ message: true
527
+ },
528
+ "...on DeleteMailTrashResponse": {
529
+ __typename: true,
530
+ deleteMailTrash: true
531
+ }
532
+ }]
533
+ });
534
+
535
+ if (!deleteMailTrash) {
536
+ return null;
537
+ }
538
+
539
+ if (deleteMailTrash.__typename === "ErrorAccessDenied") {
540
+ return deleteMailTrash;
541
+ }
542
+
543
+ if (!deleteMailTrash.deleteMailTrash) {
544
+ return null;
545
+ }
546
+
547
+ return {
548
+ __typename: "SuccessResponse",
549
+ data: deleteMailTrash.deleteMailTrash
550
+ };
551
+ }
552
+
553
+ async emptyTrash() {
554
+ const {
555
+ emptyMailTrash
556
+ } = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("mutation")({
557
+ emptyMailTrash: {
558
+ "...on ErrorAccessDenied": {
559
+ __typename: true,
560
+ message: true
561
+ },
562
+ "...on EmptyMailTrashResponse": {
563
+ __typename: true,
564
+ emptyMailTrash: true
565
+ }
566
+ }
567
+ });
568
+
569
+ if (!emptyMailTrash) {
570
+ return null;
571
+ }
572
+
573
+ if (emptyMailTrash.__typename === "ErrorAccessDenied") {
574
+ return emptyMailTrash;
575
+ }
576
+
577
+ if (!emptyMailTrash.emptyMailTrash) {
578
+ return null;
579
+ }
580
+
581
+ return {
582
+ __typename: "SuccessResponse",
583
+ data: emptyMailTrash.emptyMailTrash
584
+ };
585
+ }
586
+
587
+ async delete(_ref6) {
588
+ let {
589
+ mailId
590
+ } = _ref6;
591
+ const {
592
+ deleteMail
593
+ } = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("mutation")({
594
+ deleteMail: [{
595
+ mailId
596
+ }, {
597
+ "...on ErrorAccessDenied": {
598
+ __typename: true,
599
+ message: true
600
+ },
601
+ "...on DeleteMailResponse": {
602
+ __typename: true,
603
+ deleteMail: true
604
+ }
605
+ }]
606
+ });
607
+
608
+ if (!deleteMail) {
609
+ return null;
610
+ }
611
+
612
+ if (deleteMail.__typename === "ErrorAccessDenied") {
613
+ return deleteMail;
614
+ }
615
+
616
+ return {
617
+ __typename: "SuccessResponse",
618
+ data: deleteMail.deleteMail
619
+ };
620
+ }
621
+
622
+ async sendDraft(draftId, customMessage) {
623
+ const drafts = await this.draftMails();
624
+
625
+ if (!drafts) {
626
+ return {
627
+ __typename: "SuccessResponse",
628
+ data: false
629
+ };
630
+ }
631
+
632
+ if (drafts.__typename !== "SuccessResponse") {
633
+ return {
634
+ __typename: "SuccessResponse",
635
+ data: false
636
+ };
637
+ }
638
+
639
+ const draft = drafts.data.find(d => d.mailIntegrityId === draftId);
640
+
641
+ if (!draft) {
642
+ return {
643
+ __typename: "SuccessResponse",
644
+ data: false
645
+ };
646
+ }
647
+
648
+ const recipients = new Array();
649
+ const temporaryRecipients = new Array();
650
+
651
+ for (const {
652
+ email
653
+ } of draft.temporaryRecipients) {
654
+ if (!email) {
655
+ continue;
656
+ }
657
+
658
+ const input = await this._eachUser(draft.files, draft.subject, draft.body, email);
659
+
660
+ if (!input) {
661
+ temporaryRecipients.push(email);
662
+ } else {
663
+ recipients.push(input);
664
+ }
665
+ }
666
+
667
+ for (const {
668
+ id
669
+ } of draft.recipients) {
670
+ const input = await this._eachUser(draft.files, draft.subject, draft.body, id);
671
+
672
+ if (!input) {
673
+ temporaryRecipients.push(id);
674
+ } else {
675
+ recipients.push(input);
676
+ }
677
+ }
678
+
679
+ const {
680
+ sendDraftMail
681
+ } = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("mutation")({
682
+ sendDraftMail: [{
683
+ temporaryRecipients,
684
+ recipients,
685
+ draftMailId: draft.mailIntegrityId,
686
+ customMessage
687
+ }, {
688
+ "...on ErrorAccessDenied": {
689
+ __typename: true,
690
+ message: true
691
+ },
692
+ "...on ErrorBasic": {
693
+ __typename: true,
694
+ message: true
695
+ },
696
+ "...on SendDraftMailResponse": {
697
+ __typename: true,
698
+ sendDraftMail: true
699
+ }
700
+ }]
701
+ });
702
+
703
+ if (!sendDraftMail) {
704
+ return null;
705
+ }
706
+
707
+ if (sendDraftMail.__typename === "ErrorAccessDenied") {
708
+ return sendDraftMail;
709
+ }
710
+
711
+ if (sendDraftMail.__typename === "ErrorBasic") {
712
+ return sendDraftMail;
713
+ }
714
+
715
+ if (!sendDraftMail.sendDraftMail) {
716
+ return null;
717
+ }
718
+
719
+ return {
720
+ __typename: "SuccessResponse",
721
+ data: sendDraftMail.sendDraftMail
722
+ };
723
+ }
724
+
725
+ async sendWaitingEmails() {
726
+ // TODO opti this
727
+ const mails = await this.sentMails();
728
+
729
+ if (!mails) {
730
+ return {
731
+ __typename: "SuccessResponse",
732
+ data: false
733
+ };
734
+ }
735
+
736
+ if (mails.__typename !== "SuccessResponse") {
737
+ return {
738
+ __typename: "SuccessResponse",
739
+ data: false
740
+ };
741
+ }
742
+
743
+ const filtered = mails.data.filter(m => m.temporaryRecipients.length > 0);
744
+
745
+ for (const mail of filtered) {
746
+ for (const {
747
+ email
748
+ } of mail.temporaryRecipients) {
749
+ if (!email) {
750
+ continue;
751
+ }
752
+
753
+ try {
754
+ const input = await this._eachUser(mail.files, mail.subject, mail.body, email);
755
+
756
+ if (!input) {
757
+ continue;
758
+ }
759
+
760
+ await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("mutation")({
761
+ sendOneMail: [{
762
+ mailIntegrityId: mail.mailIntegrityId,
763
+ recipient: input
764
+ }, {
765
+ "...on ErrorAccessDenied": {
766
+ __typename: true,
767
+ message: true
768
+ },
769
+ "...on ErrorBasic": {
770
+ __typename: true,
771
+ message: true
772
+ },
773
+ "...on RecoverNodeResponse": {
774
+ __typename: true,
775
+ recoverNode: true
776
+ }
777
+ }]
778
+ });
779
+ } catch {
780
+ continue;
781
+ }
782
+ }
783
+ }
784
+
785
+ return {
786
+ __typename: "SuccessResponse",
787
+ data: false
788
+ };
789
+ }
790
+
791
+ async createDraft(_ref7) {
792
+ let {
793
+ body,
794
+ subject,
795
+ files,
796
+ recipientsIds,
797
+ replyTo
798
+ } = _ref7;
799
+ const hashKey = sodium.randombytes_buf(sodium.crypto_generichash_KEYBYTES, "hex");
800
+ const hash = sodium.crypto_generichash(sodium.crypto_generichash_BYTES, JSON.stringify({
801
+ body,
802
+ subject
803
+ }), hashKey, "hex");
804
+ const senderFiles = new Array();
805
+
806
+ for (const f of files) {
807
+ let file = filesCache.get(f.id);
808
+
809
+ if (!file) {
810
+ await _classPrivateFieldLooseBase(this, _client)[_client].cloud.fileMetadata({
811
+ id: f.id
812
+ });
813
+ file = filesCache.get(f.id);
814
+
815
+ if (!file) {
816
+ throw new Error(`File ${f.name} (${f.id}) does not exists`);
817
+ }
818
+ }
819
+
820
+ senderFiles.push({
821
+ id: file.id,
822
+ fileKey: sodium.to_hex(encryptCryptoBox(sodium.from_string(file.key), _classPrivateFieldLooseBase(this, _keys)[_keys].publicKey, _classPrivateFieldLooseBase(this, _keys)[_keys].privateKey)),
823
+ name: sodium.to_hex(encryptCryptoBox(sodium.from_string(f.name), _classPrivateFieldLooseBase(this, _keys)[_keys].publicKey, _classPrivateFieldLooseBase(this, _keys)[_keys].privateKey))
824
+ });
825
+ }
826
+
827
+ const {
828
+ createDraftMail
829
+ } = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("mutation", {
830
+ scalars: {
831
+ DateTime: {
832
+ decode: e => new Date(e),
833
+ encode: e => e.toISOString()
834
+ }
835
+ }
836
+ })({
837
+ createDraftMail: [{
838
+ recipients: recipientsIds,
839
+ replyTo,
840
+ body: sodium.to_hex(encryptCryptoBox(sodium.from_string(body), _classPrivateFieldLooseBase(this, _keys)[_keys].publicKey, _classPrivateFieldLooseBase(this, _keys)[_keys].privateKey)),
841
+ subject: sodium.to_hex(encryptCryptoBox(sodium.from_string(subject), _classPrivateFieldLooseBase(this, _keys)[_keys].publicKey, _classPrivateFieldLooseBase(this, _keys)[_keys].privateKey)),
842
+ senderFiles,
843
+ hash,
844
+ hashKey
845
+ }, {
846
+ "...on ErrorAccessDenied": {
847
+ __typename: true,
848
+ message: true
849
+ },
850
+ "...on ErrorBasic": {
851
+ __typename: true,
852
+ message: true
853
+ },
854
+ "...on CreateDraftMailResponse": {
855
+ __typename: true,
856
+ createDraftMail: mailSelector
857
+ }
858
+ }]
859
+ });
860
+
861
+ if (!createDraftMail) {
862
+ return null;
863
+ }
864
+
865
+ if (createDraftMail.__typename === "ErrorAccessDenied") {
866
+ return createDraftMail;
867
+ }
868
+
869
+ if (createDraftMail.__typename === "ErrorBasic") {
870
+ return createDraftMail;
871
+ }
872
+
873
+ if (!createDraftMail.createDraftMail) {
874
+ return null;
875
+ }
876
+
877
+ const result = convertInternalMailToExternal(createDraftMail.createDraftMail, _classPrivateFieldLooseBase(this, _keys)[_keys]);
878
+ return {
879
+ __typename: "SuccessResponse",
880
+ data: result
881
+ };
882
+ }
883
+
884
+ async read(_ref8) {
885
+ let {
886
+ mailId
887
+ } = _ref8;
888
+ const {
889
+ readMail
890
+ } = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("mutation")({
891
+ readMail: [{
892
+ mailId
893
+ }, {
894
+ "...on ErrorAccessDenied": {
895
+ __typename: true,
896
+ message: true
897
+ },
898
+ "...on ErrorBasic": {
899
+ __typename: true,
900
+ message: true
901
+ },
902
+ "...on ErrorNotFound": {
903
+ __typename: true,
904
+ message: true
905
+ },
906
+ "...on ReadMailResponse": {
907
+ __typename: true,
908
+ readMail: true
909
+ }
910
+ }]
911
+ });
912
+
913
+ if (!readMail) {
914
+ return null;
915
+ }
916
+
917
+ if (readMail.__typename === "ErrorAccessDenied") {
918
+ return readMail;
919
+ }
920
+
921
+ if (readMail.__typename === "ErrorBasic") {
922
+ return readMail;
923
+ }
924
+
925
+ if (readMail.__typename === "ErrorNotFound") {
926
+ return readMail;
927
+ }
928
+
929
+ if (!readMail.readMail) {
930
+ return null;
931
+ }
932
+
933
+ return {
934
+ __typename: "SuccessResponse",
935
+ data: readMail.readMail
936
+ };
937
+ }
938
+
939
+ async unread(_ref9) {
940
+ let {
941
+ mailId
942
+ } = _ref9;
943
+ const {
944
+ unreadMail
945
+ } = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("mutation")({
946
+ unreadMail: [{
947
+ mailId
948
+ }, {
949
+ "...on ErrorAccessDenied": {
950
+ __typename: true,
951
+ message: true
952
+ },
953
+ "...on ErrorBasic": {
954
+ __typename: true,
955
+ message: true
956
+ },
957
+ "...on ErrorNotFound": {
958
+ __typename: true,
959
+ message: true
960
+ },
961
+ "...on UnreadMailResponse": {
962
+ __typename: true,
963
+ unreadMail: true
964
+ }
965
+ }]
966
+ });
967
+
968
+ if (!unreadMail) {
969
+ return null;
970
+ }
971
+
972
+ if (unreadMail.__typename === "ErrorAccessDenied") {
973
+ return unreadMail;
974
+ }
975
+
976
+ if (unreadMail.__typename === "ErrorBasic") {
977
+ return unreadMail;
978
+ }
979
+
980
+ if (unreadMail.__typename === "ErrorNotFound") {
981
+ return unreadMail;
982
+ }
983
+
984
+ if (!unreadMail.unreadMail) {
985
+ return null;
986
+ }
987
+
988
+ return {
989
+ __typename: "SuccessResponse",
990
+ data: unreadMail.unreadMail
991
+ };
992
+ }
993
+
994
+ async receivedMails() {
995
+ const {
996
+ user
997
+ } = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("query", {
998
+ scalars: {
999
+ DateTime: {
1000
+ decode: e => new Date(e),
1001
+ encode: e => e.toISOString()
1002
+ }
1003
+ }
1004
+ })({
1005
+ user: [{}, {
1006
+ "...on ErrorNotFound": {
1007
+ __typename: true,
1008
+ message: true
1009
+ },
1010
+ "...on UserResponse": {
1011
+ __typename: true,
1012
+ user: {
1013
+ receivedMails: mailSelector
1014
+ }
1015
+ }
1016
+ }]
1017
+ });
1018
+
1019
+ if (!user) {
1020
+ return null;
1021
+ }
1022
+
1023
+ if (user.__typename === "ErrorNotFound") {
1024
+ return user;
1025
+ }
1026
+
1027
+ if (!user.user) {
1028
+ return null;
1029
+ } // TODO get actual mails on this app only
1030
+
1031
+
1032
+ const receivedMails = new Array();
1033
+
1034
+ for (const m of user.user.receivedMails) {
1035
+ const mail = convertInternalMailToExternal(m, _classPrivateFieldLooseBase(this, _keys)[_keys]);
1036
+
1037
+ if (mail) {
1038
+ receivedMails.push(mail);
1039
+ }
1040
+ }
1041
+
1042
+ return {
1043
+ __typename: "SuccessResponse",
1044
+ data: receivedMails
1045
+ };
1046
+ }
1047
+
1048
+ async sentMails() {
1049
+ const {
1050
+ user
1051
+ } = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("query", {
1052
+ scalars: {
1053
+ DateTime: {
1054
+ decode: e => new Date(e),
1055
+ encode: e => e.toISOString()
1056
+ }
1057
+ }
1058
+ })({
1059
+ user: [{}, {
1060
+ "...on ErrorNotFound": {
1061
+ __typename: true,
1062
+ message: true
1063
+ },
1064
+ "...on UserResponse": {
1065
+ __typename: true,
1066
+ user: {
1067
+ sentMails: mailSelector
1068
+ }
1069
+ }
1070
+ }]
1071
+ });
1072
+
1073
+ if (!user) {
1074
+ return null;
1075
+ }
1076
+
1077
+ if (user.__typename === "ErrorNotFound") {
1078
+ return user;
1079
+ }
1080
+
1081
+ if (!user.user) {
1082
+ return null;
1083
+ } // TODO get actual mails on this app only
1084
+
1085
+
1086
+ const sentMails = new Array();
1087
+
1088
+ for (const m of user.user.sentMails) {
1089
+ const mail = convertInternalMailToExternal(m, _classPrivateFieldLooseBase(this, _keys)[_keys]);
1090
+
1091
+ if (mail) {
1092
+ sentMails.push(mail);
1093
+ }
1094
+ }
1095
+
1096
+ return {
1097
+ __typename: "SuccessResponse",
1098
+ data: sentMails
1099
+ };
1100
+ }
1101
+
1102
+ async draftMails() {
1103
+ const {
1104
+ user
1105
+ } = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("query", {
1106
+ scalars: {
1107
+ DateTime: {
1108
+ decode: e => new Date(e),
1109
+ encode: e => e.toISOString()
1110
+ }
1111
+ }
1112
+ })({
1113
+ user: [{}, {
1114
+ "...on ErrorNotFound": {
1115
+ __typename: true,
1116
+ message: true
1117
+ },
1118
+ "...on UserResponse": {
1119
+ __typename: true,
1120
+ user: {
1121
+ draftMails: mailSelector
1122
+ }
1123
+ }
1124
+ }]
1125
+ });
1126
+
1127
+ if (!user) {
1128
+ return null;
1129
+ }
1130
+
1131
+ if (user.__typename === "ErrorNotFound") {
1132
+ return user;
1133
+ }
1134
+
1135
+ if (!user.user) {
1136
+ return null;
1137
+ } // TODO get actual mails on this app only
1138
+
1139
+
1140
+ const draftMails = new Array();
1141
+
1142
+ for (const m of user.user.draftMails) {
1143
+ const draft = convertInternalMailToExternal(m, _classPrivateFieldLooseBase(this, _keys)[_keys]);
1144
+
1145
+ if (draft) {
1146
+ draftMails.push(draft);
1147
+ }
1148
+ }
1149
+
1150
+ return {
1151
+ __typename: "SuccessResponse",
1152
+ data: draftMails
1153
+ };
1154
+ }
1155
+
1156
+ async unreadReceivedMailsCount() {
1157
+ const {
1158
+ unreadReceivedMailsCount
1159
+ } = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("query")({
1160
+ unreadReceivedMailsCount: {
1161
+ "...on ErrorAccessDenied": {
1162
+ __typename: true,
1163
+ message: true
1164
+ },
1165
+ "...on UnreadReceivedMailsCountResponse": {
1166
+ __typename: true,
1167
+ count: true
1168
+ }
1169
+ }
1170
+ });
1171
+
1172
+ if (!unreadReceivedMailsCount) {
1173
+ return null;
1174
+ }
1175
+
1176
+ if (unreadReceivedMailsCount.__typename === "ErrorAccessDenied") {
1177
+ return unreadReceivedMailsCount;
1178
+ }
1179
+
1180
+ return {
1181
+ __typename: "SuccessResponse",
1182
+ data: unreadReceivedMailsCount.count
1183
+ };
1184
+ }
1185
+
1186
+ }
1187
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJnZW5lcmF0ZSIsImZpbGVzQ2FjaGUiLCJ1c2Vyc0NhY2hlIiwiZW5jcnlwdENyeXB0b0JveCIsInNvZGl1bSIsImNvbnZlcnRJbnRlcm5hbE1haWxUb0V4dGVybmFsIiwibWFpbFNlbGVjdG9yIiwiU2VjcmVjeU1haWxDbGllbnQiLCJjb25zdHJ1Y3RvciIsImNsaWVudCIsImtleXMiLCJ0aHVuZGVyIiwiX2VhY2hVc2VyIiwiZmlsZXMiLCJzdWJqZWN0IiwiYm9keSIsImlkT3JNYWlsIiwidSIsImdldCIsInJlcSIsInVzZXIiLCJ1c2VySWQiLCJ3aXRoUHVibGljS2V5IiwiX190eXBlbmFtZSIsImRhdGEiLCJFcnJvciIsInJlY2lwaWVudHNGaWxlcyIsIkFycmF5IiwiZiIsImZpbGVJbkhpc3RvcnkiLCJpZCIsImNsb3VkIiwiZmlsZU1ldGFkYXRhIiwibmFtZSIsImtleSIsInB1c2giLCJ0b19oZXgiLCJmcm9tX3N0cmluZyIsInB1YmxpY0tleSIsInByaXZhdGVLZXkiLCJmaWxlS2V5IiwiZnJvbV9oZXgiLCJyZWNpcGllbnRJZCIsIm1haWwiLCJzY2FsYXJzIiwiRGF0ZVRpbWUiLCJkZWNvZGUiLCJlIiwiRGF0ZSIsImVuY29kZSIsInRvSVNPU3RyaW5nIiwibWVzc2FnZSIsInJlc3VsdCIsInJlY292ZXIiLCJtYWlsSWQiLCJyZWNvdmVyTWFpbCIsImRlbGV0ZWRNYWlscyIsIm1haWxUeXBlIiwibWFpbHMiLCJtIiwiY3JlYXRlIiwiY3VzdG9tTWVzc2FnZSIsImNyZWF0ZURyYWZ0Iiwic2VuZERyYWZ0IiwibWFpbEludGVncml0eUlkIiwid2FpdGluZ1JlY2VpdmVkTWFpbHMiLCJkYXRlIiwiYXR0YWNobWVudHNDb3VudCIsInNlbmRlciIsImZpcnN0bmFtZSIsImxhc3RuYW1lIiwiZW1haWwiLCJyZWNpcGllbnRzIiwidGVtcG9yYXJ5UmVjaXBpZW50cyIsIm1hcCIsInVwZGF0ZURyYWZ0IiwiZHJhZnRJZCIsInJlY2lwaWVudHNJZHMiLCJyZXBseVRvIiwiZHJhZnRzIiwiZHJhZnRNYWlscyIsImRyYWZ0IiwiZmluZCIsImQiLCJoYXNoS2V5IiwiaGFzaCIsInJhbmRvbWJ5dGVzX2J1ZiIsImNyeXB0b19nZW5lcmljaGFzaF9LRVlCWVRFUyIsImNyeXB0b19nZW5lcmljaGFzaCIsImNyeXB0b19nZW5lcmljaGFzaF9CWVRFUyIsIkpTT04iLCJzdHJpbmdpZnkiLCJzZW5kZXJGaWxlcyIsImZpbGUiLCJ1cGRhdGVEcmFmdE1haWwiLCJKc29uIiwicGFyc2UiLCJCaWdJbnQiLCJ0b1N0cmluZyIsImRlbGV0ZURyYWZ0IiwiZGVsZXRlRHJhZnRNYWlsIiwiZGVsZXRlVHJhc2giLCJpZHMiLCJkZWxldGVNYWlsVHJhc2giLCJlbXB0eVRyYXNoIiwiZW1wdHlNYWlsVHJhc2giLCJkZWxldGUiLCJkZWxldGVNYWlsIiwiaW5wdXQiLCJzZW5kRHJhZnRNYWlsIiwiZHJhZnRNYWlsSWQiLCJzZW5kV2FpdGluZ0VtYWlscyIsInNlbnRNYWlscyIsImZpbHRlcmVkIiwiZmlsdGVyIiwibGVuZ3RoIiwic2VuZE9uZU1haWwiLCJyZWNpcGllbnQiLCJyZWNvdmVyTm9kZSIsImNyZWF0ZURyYWZ0TWFpbCIsInJlYWQiLCJyZWFkTWFpbCIsInVucmVhZCIsInVucmVhZE1haWwiLCJyZWNlaXZlZE1haWxzIiwidW5yZWFkUmVjZWl2ZWRNYWlsc0NvdW50IiwiY291bnQiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvY2xpZW50L1NlY3JlY3lNYWlsQ2xpZW50LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvbiAqL1xuaW1wb3J0IHsgZ2VuZXJhdGUgfSBmcm9tIFwic2hvcnRpZFwiO1xuaW1wb3J0IHsgZmlsZXNDYWNoZSwgdXNlcnNDYWNoZSB9IGZyb20gXCIuLi9jYWNoZS5qc1wiO1xuaW1wb3J0IHR5cGUgeyBFcnJvckFjY2Vzc0RlbmllZCwgRXJyb3JCYXNpYywgRXJyb3JOb3RGb3VuZCB9IGZyb20gXCIuLi9lcnJvci5qc1wiO1xuaW1wb3J0IHR5cGUge1xuICBTdWNjZXNzUmVzcG9uc2UsXG4gIEtleVBhaXIsXG4gIE5ld01haWwsXG4gIFNlY3JlY3lDbGllbnRcbn0gZnJvbSBcIi4uL2luZGV4LmpzXCI7XG5pbXBvcnQgeyBlbmNyeXB0Q3J5cHRvQm94LCBzb2RpdW0gfSBmcm9tIFwiLi4vaW5kZXguanNcIjtcbmltcG9ydCB0eXBlIHsgTWFpbFR5cGUsIFRodW5kZXIgfSBmcm9tIFwiLi4vemV1cy9pbmRleC5qc1wiO1xuaW1wb3J0IHsgY29udmVydEludGVybmFsTWFpbFRvRXh0ZXJuYWwgfSBmcm9tIFwiLi9jb252ZXJ0L21haWwuanNcIjtcbmltcG9ydCB0eXBlIHtcbiAgRHJhZnRNYWlsLFxuICBNYWlsLFxuICBNYWlsRmlsZUlucHV0LFxuICBNYWlsUmVjaXBpZW50SW5wdXQsXG4gIFJlY2VpdmVkTWFpbCxcbiAgU2VudE1haWwsXG4gIFdhaXRpbmdSZWNlaXZlZE1haWxcbn0gZnJvbSBcIi4vdHlwZXMvaW5kZXguanNcIjtcbmltcG9ydCB7IG1haWxTZWxlY3RvciB9IGZyb20gXCIuL3R5cGVzL3NlbGVjdG9ycy5qc1wiO1xuXG5leHBvcnQgY2xhc3MgU2VjcmVjeU1haWxDbGllbnQge1xuICAjY2xpZW50OiBTZWNyZWN5Q2xpZW50O1xuXG4gICNrZXlzOiBLZXlQYWlyO1xuXG4gICN0aHVuZGVyOiBSZXR1cm5UeXBlPHR5cGVvZiBUaHVuZGVyPjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBjbGllbnQ6IFNlY3JlY3lDbGllbnQsXG4gICAga2V5czogS2V5UGFpcixcbiAgICB0aHVuZGVyOiBSZXR1cm5UeXBlPHR5cGVvZiBUaHVuZGVyPlxuICApIHtcbiAgICB0aGlzLiNjbGllbnQgPSBjbGllbnQ7XG4gICAgdGhpcy4ja2V5cyA9IGtleXM7XG4gICAgdGhpcy4jdGh1bmRlciA9IHRodW5kZXI7XG4gIH1cblxuICBhc3luYyBnZXQoe1xuICAgIGlkXG4gIH06IHtcbiAgICBpZDogc3RyaW5nO1xuICB9KTogUHJvbWlzZTxTdWNjZXNzUmVzcG9uc2U8TWFpbD4gfCBFcnJvckFjY2Vzc0RlbmllZCB8IG51bGw+IHtcbiAgICBjb25zdCB7IG1haWwgfSA9IGF3YWl0IHRoaXMuI3RodW5kZXIoXCJxdWVyeVwiLCB7XG4gICAgICBzY2FsYXJzOiB7XG4gICAgICAgIERhdGVUaW1lOiB7XG4gICAgICAgICAgZGVjb2RlOiAoZTogdW5rbm93bikgPT4gbmV3IERhdGUoZSBhcyBzdHJpbmcpLFxuICAgICAgICAgIGVuY29kZTogKGU6IHVua25vd24pID0+IChlIGFzIERhdGUpLnRvSVNPU3RyaW5nKClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pKHtcbiAgICAgIG1haWw6IFtcbiAgICAgICAge1xuICAgICAgICAgIGlkXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIi4uLm9uIEVycm9yQWNjZXNzRGVuaWVkXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi4uLm9uIFF1ZXJ5TWFpbFJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBtYWlsOiBtYWlsU2VsZWN0b3JcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9KTtcblxuICAgIGlmICghbWFpbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKG1haWwuX190eXBlbmFtZSA9PT0gXCJFcnJvckFjY2Vzc0RlbmllZFwiKSB7XG4gICAgICByZXR1cm4gbWFpbDtcbiAgICB9XG5cbiAgICBpZiAoIW1haWwubWFpbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gY29udmVydEludGVybmFsTWFpbFRvRXh0ZXJuYWwobWFpbC5tYWlsLCB0aGlzLiNrZXlzKTtcblxuICAgIGlmICghcmVzdWx0KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgX190eXBlbmFtZTogXCJTdWNjZXNzUmVzcG9uc2VcIixcbiAgICAgIGRhdGE6IHJlc3VsdFxuICAgIH07XG4gIH1cblxuICBhc3luYyByZWNvdmVyKHtcbiAgICBtYWlsSWRcbiAgfToge1xuICAgIG1haWxJZDogc3RyaW5nO1xuICB9KTogUHJvbWlzZTxcbiAgICBTdWNjZXNzUmVzcG9uc2U8Ym9vbGVhbj4gfCBFcnJvckFjY2Vzc0RlbmllZCB8IEVycm9yQmFzaWMgfCBudWxsXG4gID4ge1xuICAgIGNvbnN0IHsgcmVjb3Zlck1haWwgfSA9IGF3YWl0IHRoaXMuI3RodW5kZXIoXCJtdXRhdGlvblwiKSh7XG4gICAgICByZWNvdmVyTWFpbDogW1xuICAgICAgICB7IG1haWxJZCB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCIuLi5vbiBFcnJvckFjY2Vzc0RlbmllZFwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgbWVzc2FnZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCIuLi5vbiBFcnJvckJhc2ljXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi4uLm9uIFJlY292ZXJNYWlsUmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIHJlY292ZXJNYWlsOiB0cnVlXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfSk7XG5cbiAgICBpZiAoIXJlY292ZXJNYWlsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAocmVjb3Zlck1haWwuX190eXBlbmFtZSA9PT0gXCJFcnJvckFjY2Vzc0RlbmllZFwiKSB7XG4gICAgICByZXR1cm4gcmVjb3Zlck1haWw7XG4gICAgfVxuXG4gICAgaWYgKHJlY292ZXJNYWlsLl9fdHlwZW5hbWUgPT09IFwiRXJyb3JCYXNpY1wiKSB7XG4gICAgICByZXR1cm4gcmVjb3Zlck1haWw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIF9fdHlwZW5hbWU6IFwiU3VjY2Vzc1Jlc3BvbnNlXCIsXG4gICAgICBkYXRhOiByZWNvdmVyTWFpbC5yZWNvdmVyTWFpbFxuICAgIH07XG4gIH1cblxuICBhc3luYyBkZWxldGVkTWFpbHMoe1xuICAgIG1haWxUeXBlXG4gIH06IHtcbiAgICBtYWlsVHlwZTogTWFpbFR5cGU7XG4gIH0pOiBQcm9taXNlPFN1Y2Nlc3NSZXNwb25zZTxNYWlsW10+IHwgRXJyb3JBY2Nlc3NEZW5pZWQgfCBudWxsPiB7XG4gICAgY29uc3QgeyBkZWxldGVkTWFpbHMgfSA9IGF3YWl0IHRoaXMuI3RodW5kZXIoXCJxdWVyeVwiLCB7XG4gICAgICBzY2FsYXJzOiB7XG4gICAgICAgIERhdGVUaW1lOiB7XG4gICAgICAgICAgZGVjb2RlOiAoZTogdW5rbm93bikgPT4gbmV3IERhdGUoZSBhcyBzdHJpbmcpLFxuICAgICAgICAgIGVuY29kZTogKGU6IHVua25vd24pID0+IChlIGFzIERhdGUpLnRvSVNPU3RyaW5nKClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pKHtcbiAgICAgIGRlbGV0ZWRNYWlsczogW1xuICAgICAgICB7IG1haWxUeXBlIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIi4uLm9uIEVycm9yQWNjZXNzRGVuaWVkXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi4uLm9uIERlbGV0ZWRNYWlsc1Jlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBkZWxldGVkTWFpbHM6IG1haWxTZWxlY3RvclxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgXVxuICAgIH0pO1xuXG4gICAgaWYgKCFkZWxldGVkTWFpbHMpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChkZWxldGVkTWFpbHMuX190eXBlbmFtZSA9PT0gXCJFcnJvckFjY2Vzc0RlbmllZFwiKSB7XG4gICAgICByZXR1cm4gZGVsZXRlZE1haWxzO1xuICAgIH1cblxuICAgIGNvbnN0IG1haWxzID0gbmV3IEFycmF5PE1haWw+KCk7XG5cbiAgICBmb3IgKGNvbnN0IG0gb2YgZGVsZXRlZE1haWxzLmRlbGV0ZWRNYWlscykge1xuICAgICAgY29uc3QgbWFpbCA9IGNvbnZlcnRJbnRlcm5hbE1haWxUb0V4dGVybmFsKG0sIHRoaXMuI2tleXMpO1xuICAgICAgaWYgKG1haWwpIHtcbiAgICAgICAgbWFpbHMucHVzaChtYWlsKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgX190eXBlbmFtZTogXCJTdWNjZXNzUmVzcG9uc2VcIixcbiAgICAgIGRhdGE6IG1haWxzXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZShcbiAgICBkYXRhOiBOZXdNYWlsLFxuICAgIGN1c3RvbU1lc3NhZ2U/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkXG4gICk6IFByb21pc2U8U3VjY2Vzc1Jlc3BvbnNlPGJvb2xlYW4+IHwgRXJyb3JCYXNpYyB8IEVycm9yQWNjZXNzRGVuaWVkIHwgbnVsbD4ge1xuICAgIGNvbnN0IG1haWwgPSBhd2FpdCB0aGlzLmNyZWF0ZURyYWZ0KGRhdGEpO1xuICAgIGlmICghbWFpbCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgX190eXBlbmFtZTogXCJTdWNjZXNzUmVzcG9uc2VcIixcbiAgICAgICAgZGF0YTogZmFsc2VcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKG1haWwuX190eXBlbmFtZSA9PT0gXCJFcnJvckJhc2ljXCIpIHtcbiAgICAgIHJldHVybiBtYWlsO1xuICAgIH1cblxuICAgIGlmIChtYWlsLl9fdHlwZW5hbWUgPT09IFwiRXJyb3JBY2Nlc3NEZW5pZWRcIikge1xuICAgICAgcmV0dXJuIG1haWw7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zZW5kRHJhZnQoXG4gICAgICBtYWlsLmRhdGEubWFpbEludGVncml0eUlkLFxuICAgICAgY3VzdG9tTWVzc2FnZVxuICAgICk7XG5cbiAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKHJlc3VsdC5fX3R5cGVuYW1lID09PSBcIkVycm9yQWNjZXNzRGVuaWVkXCIpIHtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgaWYgKHJlc3VsdC5fX3R5cGVuYW1lID09PSBcIkVycm9yQmFzaWNcIikge1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgX190eXBlbmFtZTogXCJTdWNjZXNzUmVzcG9uc2VcIixcbiAgICAgIGRhdGE6IHJlc3VsdC5kYXRhXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIHdhaXRpbmdSZWNlaXZlZE1haWxzKCk6IFByb21pc2U8XG4gICAgU3VjY2Vzc1Jlc3BvbnNlPFdhaXRpbmdSZWNlaXZlZE1haWxbXT4gfCBFcnJvck5vdEZvdW5kIHwgbnVsbFxuICA+IHtcbiAgICBjb25zdCB7IHVzZXIgfSA9IGF3YWl0IHRoaXMuI3RodW5kZXIoXCJxdWVyeVwiKSh7XG4gICAgICB1c2VyOiBbXG4gICAgICAgIHt9LFxuICAgICAgICB7XG4gICAgICAgICAgXCIuLi5vbiBFcnJvck5vdEZvdW5kXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi4uLm9uIFVzZXJSZXNwb25zZVwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgdXNlcjoge1xuICAgICAgICAgICAgICB3YWl0aW5nUmVjZWl2ZWRNYWlsczoge1xuICAgICAgICAgICAgICAgIGRhdGU6IHRydWUsXG4gICAgICAgICAgICAgICAgYXR0YWNobWVudHNDb3VudDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBzZW5kZXI6IHtcbiAgICAgICAgICAgICAgICAgIGlkOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgZmlyc3RuYW1lOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgbGFzdG5hbWU6IHRydWUsXG4gICAgICAgICAgICAgICAgICBlbWFpbDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgIHB1YmxpY0tleTogdHJ1ZVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgcmVjaXBpZW50czoge1xuICAgICAgICAgICAgICAgICAgaWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICBmaXJzdG5hbWU6IHRydWUsXG4gICAgICAgICAgICAgICAgICBsYXN0bmFtZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgIGVtYWlsOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgcHVibGljS2V5OiB0cnVlXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB0ZW1wb3JhcnlSZWNpcGllbnRzOiB7XG4gICAgICAgICAgICAgICAgICBlbWFpbDogdHJ1ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgXVxuICAgIH0pO1xuXG4gICAgaWYgKCF1c2VyKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAodXNlci5fX3R5cGVuYW1lID09PSBcIkVycm9yTm90Rm91bmRcIikge1xuICAgICAgcmV0dXJuIHVzZXI7XG4gICAgfVxuXG4gICAgaWYgKCF1c2VyLnVzZXIpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IHVzZXIudXNlci53YWl0aW5nUmVjZWl2ZWRNYWlscy5tYXAobSA9PiAoe1xuICAgICAgaWQ6IGdlbmVyYXRlKCksXG4gICAgICAuLi5tLFxuICAgICAgZGF0ZTogbmV3IERhdGUobS5kYXRlIGFzIHN0cmluZylcbiAgICB9KSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgX190eXBlbmFtZTogXCJTdWNjZXNzUmVzcG9uc2VcIixcbiAgICAgIGRhdGE6IHJlc3VsdFxuICAgIH07XG4gIH1cblxuICBhc3luYyB1cGRhdGVEcmFmdChcbiAgICBkcmFmdElkOiBzdHJpbmcsXG4gICAgeyBib2R5LCBzdWJqZWN0LCBmaWxlcywgcmVjaXBpZW50c0lkcywgcmVwbHlUbyB9OiBQYXJ0aWFsPE5ld01haWw+XG4gICk6IFByb21pc2U8XG4gICAgfCBTdWNjZXNzUmVzcG9uc2U8RHJhZnRNYWlsPlxuICAgIHwgRXJyb3JOb3RGb3VuZFxuICAgIHwgRXJyb3JBY2Nlc3NEZW5pZWRcbiAgICB8IEVycm9yQmFzaWNcbiAgICB8IG51bGxcbiAgPiB7XG4gICAgY29uc3QgZHJhZnRzID0gYXdhaXQgdGhpcy5kcmFmdE1haWxzKCk7XG4gICAgaWYgKCFkcmFmdHMpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChkcmFmdHMuX190eXBlbmFtZSAhPT0gXCJTdWNjZXNzUmVzcG9uc2VcIikge1xuICAgICAgcmV0dXJuIGRyYWZ0cztcbiAgICB9XG4gICAgY29uc3QgZHJhZnQgPSBkcmFmdHMuZGF0YS5maW5kKGQgPT4gZC5tYWlsSW50ZWdyaXR5SWQgPT09IGRyYWZ0SWQpO1xuICAgIGlmICghZHJhZnQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBkcmFmdCAke2RyYWZ0SWR9YCk7XG4gICAgfVxuICAgIGxldCBoYXNoS2V5OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgICBsZXQgaGFzaDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gICAgaWYgKGJvZHkgfHwgc3ViamVjdCkge1xuICAgICAgaGFzaEtleSA9IHNvZGl1bS5yYW5kb21ieXRlc19idWYoXG4gICAgICAgIHNvZGl1bS5jcnlwdG9fZ2VuZXJpY2hhc2hfS0VZQllURVMsXG4gICAgICAgIFwiaGV4XCJcbiAgICAgICk7XG4gICAgICBoYXNoID0gc29kaXVtLmNyeXB0b19nZW5lcmljaGFzaChcbiAgICAgICAgc29kaXVtLmNyeXB0b19nZW5lcmljaGFzaF9CWVRFUyxcbiAgICAgICAgSlNPTi5zdHJpbmdpZnkoeyBib2R5LCBzdWJqZWN0IH0pLFxuICAgICAgICBoYXNoS2V5LFxuICAgICAgICBcImhleFwiXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBzZW5kZXJGaWxlcyA9IG5ldyBBcnJheTxNYWlsRmlsZUlucHV0PigpO1xuICAgIGlmIChmaWxlcykge1xuICAgICAgZm9yIChjb25zdCBmIG9mIGZpbGVzKSB7XG4gICAgICAgIGxldCBmaWxlID0gZmlsZXNDYWNoZS5nZXQoZi5pZCk7XG4gICAgICAgIGlmICghZmlsZSkge1xuICAgICAgICAgIGF3YWl0IHRoaXMuI2NsaWVudC5jbG91ZC5maWxlTWV0YWRhdGEoeyBpZDogZi5pZCB9KTtcbiAgICAgICAgICBmaWxlID0gZmlsZXNDYWNoZS5nZXQoZi5pZCk7XG4gICAgICAgICAgaWYgKCFmaWxlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZpbGUgJHtmLm5hbWV9ICgke2YuaWR9KSBkb2VzIG5vdCBleGlzdHNgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc2VuZGVyRmlsZXMucHVzaCh7XG4gICAgICAgICAgaWQ6IGZpbGUuaWQsXG4gICAgICAgICAgZmlsZUtleTogc29kaXVtLnRvX2hleChcbiAgICAgICAgICAgIGVuY3J5cHRDcnlwdG9Cb3goXG4gICAgICAgICAgICAgIHNvZGl1bS5mcm9tX3N0cmluZyhmaWxlLmtleSksXG4gICAgICAgICAgICAgIHRoaXMuI2tleXMucHVibGljS2V5LFxuICAgICAgICAgICAgICB0aGlzLiNrZXlzLnByaXZhdGVLZXlcbiAgICAgICAgICAgIClcbiAgICAgICAgICApLFxuICAgICAgICAgIG5hbWU6IHNvZGl1bS50b19oZXgoXG4gICAgICAgICAgICBlbmNyeXB0Q3J5cHRvQm94KFxuICAgICAgICAgICAgICBzb2RpdW0uZnJvbV9zdHJpbmcoZi5uYW1lKSxcbiAgICAgICAgICAgICAgdGhpcy4ja2V5cy5wdWJsaWNLZXksXG4gICAgICAgICAgICAgIHRoaXMuI2tleXMucHJpdmF0ZUtleVxuICAgICAgICAgICAgKVxuICAgICAgICAgIClcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgeyB1cGRhdGVEcmFmdE1haWwgfSA9IGF3YWl0IHRoaXMuI3RodW5kZXIoXCJtdXRhdGlvblwiLCB7XG4gICAgICBzY2FsYXJzOiB7XG4gICAgICAgIEpzb246IHtcbiAgICAgICAgICBlbmNvZGU6IChlOiB1bmtub3duKSA9PiBKU09OLnN0cmluZ2lmeShlKSxcbiAgICAgICAgICBkZWNvZGU6IChlOiB1bmtub3duKSA9PiBKU09OLnBhcnNlKGUgYXMgc3RyaW5nKVxuICAgICAgICB9LFxuICAgICAgICBEYXRlVGltZToge1xuICAgICAgICAgIGRlY29kZTogKGU6IHVua25vd24pID0+IG5ldyBEYXRlKGUgYXMgc3RyaW5nKSxcbiAgICAgICAgICBlbmNvZGU6IChlOiB1bmtub3duKSA9PiAoZSBhcyBEYXRlKS50b0lTT1N0cmluZygpXG4gICAgICAgIH0sXG4gICAgICAgIEJpZ0ludDoge1xuICAgICAgICAgIGRlY29kZTogKGU6IHVua25vd24pID0+IEJpZ0ludChlIGFzIHN0cmluZyksXG4gICAgICAgICAgZW5jb2RlOiAoZTogdW5rbm93bikgPT4gKGUgYXMgYmlnaW50KS50b1N0cmluZygpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KSh7XG4gICAgICB1cGRhdGVEcmFmdE1haWw6IFtcbiAgICAgICAge1xuICAgICAgICAgIGRyYWZ0SWQsXG4gICAgICAgICAgcmVjaXBpZW50czogcmVjaXBpZW50c0lkcyxcbiAgICAgICAgICByZXBseVRvLFxuICAgICAgICAgIGJvZHk6IGJvZHlcbiAgICAgICAgICAgID8gc29kaXVtLnRvX2hleChcbiAgICAgICAgICAgICAgICBlbmNyeXB0Q3J5cHRvQm94KFxuICAgICAgICAgICAgICAgICAgc29kaXVtLmZyb21fc3RyaW5nKGJvZHkpLFxuICAgICAgICAgICAgICAgICAgdGhpcy4ja2V5cy5wdWJsaWNLZXksXG4gICAgICAgICAgICAgICAgICB0aGlzLiNrZXlzLnByaXZhdGVLZXlcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgICBzdWJqZWN0OiBzdWJqZWN0XG4gICAgICAgICAgICA/IHNvZGl1bS50b19oZXgoXG4gICAgICAgICAgICAgICAgZW5jcnlwdENyeXB0b0JveChcbiAgICAgICAgICAgICAgICAgIHNvZGl1bS5mcm9tX3N0cmluZyhzdWJqZWN0KSxcbiAgICAgICAgICAgICAgICAgIHRoaXMuI2tleXMucHVibGljS2V5LFxuICAgICAgICAgICAgICAgICAgdGhpcy4ja2V5cy5wcml2YXRlS2V5XG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICA6IG51bGwsXG4gICAgICAgICAgc2VuZGVyRmlsZXMsXG4gICAgICAgICAgaGFzaCxcbiAgICAgICAgICBoYXNoS2V5XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIi4uLm9uIEVycm9yQWNjZXNzRGVuaWVkXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi4uLm9uIEVycm9yQmFzaWNcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLi4ub24gVXBkYXRlRHJhZnRNYWlsUmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIHVwZGF0ZURyYWZ0TWFpbDogbWFpbFNlbGVjdG9yXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfSk7XG5cbiAgICBpZiAoIXVwZGF0ZURyYWZ0TWFpbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKHVwZGF0ZURyYWZ0TWFpbC5fX3R5cGVuYW1lID09PSBcIkVycm9yQWNjZXNzRGVuaWVkXCIpIHtcbiAgICAgIHJldHVybiB1cGRhdGVEcmFmdE1haWw7XG4gICAgfVxuXG4gICAgaWYgKHVwZGF0ZURyYWZ0TWFpbC5fX3R5cGVuYW1lID09PSBcIkVycm9yQmFzaWNcIikge1xuICAgICAgcmV0dXJuIHVwZGF0ZURyYWZ0TWFpbDtcbiAgICB9XG5cbiAgICBpZiAoIXVwZGF0ZURyYWZ0TWFpbC51cGRhdGVEcmFmdE1haWwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IGNvbnZlcnRJbnRlcm5hbE1haWxUb0V4dGVybmFsKFxuICAgICAgdXBkYXRlRHJhZnRNYWlsLnVwZGF0ZURyYWZ0TWFpbCxcbiAgICAgIHRoaXMuI2tleXNcbiAgICApIGFzIERyYWZ0TWFpbDtcblxuICAgIHJldHVybiB7XG4gICAgICBfX3R5cGVuYW1lOiBcIlN1Y2Nlc3NSZXNwb25zZVwiLFxuICAgICAgZGF0YTogcmVzdWx0XG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZURyYWZ0KFxuICAgIGRyYWZ0SWQ6IHN0cmluZ1xuICApOiBQcm9taXNlPFN1Y2Nlc3NSZXNwb25zZTxib29sZWFuPiB8IEVycm9yQWNjZXNzRGVuaWVkIHwgbnVsbD4ge1xuICAgIGNvbnN0IHsgZGVsZXRlRHJhZnRNYWlsIH0gPSBhd2FpdCB0aGlzLiN0aHVuZGVyKFwibXV0YXRpb25cIikoe1xuICAgICAgZGVsZXRlRHJhZnRNYWlsOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBkcmFmdElkXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIi4uLm9uIEVycm9yQWNjZXNzRGVuaWVkXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi4uLm9uIERlbGV0ZURyYWZ0TWFpbFJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBkZWxldGVEcmFmdE1haWw6IHRydWVcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9KTtcblxuICAgIGlmICghZGVsZXRlRHJhZnRNYWlsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoZGVsZXRlRHJhZnRNYWlsLl9fdHlwZW5hbWUgPT09IFwiRXJyb3JBY2Nlc3NEZW5pZWRcIikge1xuICAgICAgcmV0dXJuIGRlbGV0ZURyYWZ0TWFpbDtcbiAgICB9XG5cbiAgICBpZiAoIWRlbGV0ZURyYWZ0TWFpbC5kZWxldGVEcmFmdE1haWwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBfX3R5cGVuYW1lOiBcIlN1Y2Nlc3NSZXNwb25zZVwiLFxuICAgICAgZGF0YTogZGVsZXRlRHJhZnRNYWlsLmRlbGV0ZURyYWZ0TWFpbCA/PyBmYWxzZVxuICAgIH07XG4gIH1cblxuICBhc3luYyBkZWxldGVUcmFzaCh7XG4gICAgaWRzXG4gIH06IHtcbiAgICBpZHM6IEFycmF5PHN0cmluZz47XG4gIH0pOiBQcm9taXNlPFN1Y2Nlc3NSZXNwb25zZTxib29sZWFuPiB8IEVycm9yQWNjZXNzRGVuaWVkIHwgbnVsbD4ge1xuICAgIGNvbnN0IHsgZGVsZXRlTWFpbFRyYXNoIH0gPSBhd2FpdCB0aGlzLiN0aHVuZGVyKFwibXV0YXRpb25cIikoe1xuICAgICAgZGVsZXRlTWFpbFRyYXNoOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBpZHNcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwiLi4ub24gRXJyb3JBY2Nlc3NEZW5pZWRcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLi4ub24gRGVsZXRlTWFpbFRyYXNoUmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIGRlbGV0ZU1haWxUcmFzaDogdHJ1ZVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgXVxuICAgIH0pO1xuXG4gICAgaWYgKCFkZWxldGVNYWlsVHJhc2gpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChkZWxldGVNYWlsVHJhc2guX190eXBlbmFtZSA9PT0gXCJFcnJvckFjY2Vzc0RlbmllZFwiKSB7XG4gICAgICByZXR1cm4gZGVsZXRlTWFpbFRyYXNoO1xuICAgIH1cblxuICAgIGlmICghZGVsZXRlTWFpbFRyYXNoLmRlbGV0ZU1haWxUcmFzaCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIF9fdHlwZW5hbWU6IFwiU3VjY2Vzc1Jlc3BvbnNlXCIsXG4gICAgICBkYXRhOiBkZWxldGVNYWlsVHJhc2guZGVsZXRlTWFpbFRyYXNoXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGVtcHR5VHJhc2goKTogUHJvbWlzZTxcbiAgICBTdWNjZXNzUmVzcG9uc2U8Ym9vbGVhbj4gfCBFcnJvckFjY2Vzc0RlbmllZCB8IG51bGxcbiAgPiB7XG4gICAgY29uc3QgeyBlbXB0eU1haWxUcmFzaCB9ID0gYXdhaXQgdGhpcy4jdGh1bmRlcihcIm11dGF0aW9uXCIpKHtcbiAgICAgIGVtcHR5TWFpbFRyYXNoOiB7XG4gICAgICAgIFwiLi4ub24gRXJyb3JBY2Nlc3NEZW5pZWRcIjoge1xuICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgbWVzc2FnZTogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcIi4uLm9uIEVtcHR5TWFpbFRyYXNoUmVzcG9uc2VcIjoge1xuICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgZW1wdHlNYWlsVHJhc2g6IHRydWVcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKCFlbXB0eU1haWxUcmFzaCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKGVtcHR5TWFpbFRyYXNoLl9fdHlwZW5hbWUgPT09IFwiRXJyb3JBY2Nlc3NEZW5pZWRcIikge1xuICAgICAgcmV0dXJuIGVtcHR5TWFpbFRyYXNoO1xuICAgIH1cblxuICAgIGlmICghZW1wdHlNYWlsVHJhc2guZW1wdHlNYWlsVHJhc2gpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBfX3R5cGVuYW1lOiBcIlN1Y2Nlc3NSZXNwb25zZVwiLFxuICAgICAgZGF0YTogZW1wdHlNYWlsVHJhc2guZW1wdHlNYWlsVHJhc2hcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgZGVsZXRlKHtcbiAgICBtYWlsSWRcbiAgfToge1xuICAgIG1haWxJZDogc3RyaW5nO1xuICB9KTogUHJvbWlzZTxTdWNjZXNzUmVzcG9uc2U8Ym9vbGVhbj4gfCBFcnJvckFjY2Vzc0RlbmllZCB8IG51bGw+IHtcbiAgICBjb25zdCB7IGRlbGV0ZU1haWwgfSA9IGF3YWl0IHRoaXMuI3RodW5kZXIoXCJtdXRhdGlvblwiKSh7XG4gICAgICBkZWxldGVNYWlsOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBtYWlsSWRcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwiLi4ub24gRXJyb3JBY2Nlc3NEZW5pZWRcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLi4ub24gRGVsZXRlTWFpbFJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBkZWxldGVNYWlsOiB0cnVlXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfSk7XG5cbiAgICBpZiAoIWRlbGV0ZU1haWwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChkZWxldGVNYWlsLl9fdHlwZW5hbWUgPT09IFwiRXJyb3JBY2Nlc3NEZW5pZWRcIikge1xuICAgICAgcmV0dXJuIGRlbGV0ZU1haWw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIF9fdHlwZW5hbWU6IFwiU3VjY2Vzc1Jlc3BvbnNlXCIsXG4gICAgICBkYXRhOiBkZWxldGVNYWlsLmRlbGV0ZU1haWxcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgc2VuZERyYWZ0KFxuICAgIGRyYWZ0SWQ6IHN0cmluZyxcbiAgICBjdXN0b21NZXNzYWdlPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZFxuICApOiBQcm9taXNlPFN1Y2Nlc3NSZXNwb25zZTxib29sZWFuPiB8IEVycm9yQWNjZXNzRGVuaWVkIHwgRXJyb3JCYXNpYyB8IG51bGw+IHtcbiAgICBjb25zdCBkcmFmdHMgPSBhd2FpdCB0aGlzLmRyYWZ0TWFpbHMoKTtcblxuICAgIGlmICghZHJhZnRzKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBfX3R5cGVuYW1lOiBcIlN1Y2Nlc3NSZXNwb25zZVwiLFxuICAgICAgICBkYXRhOiBmYWxzZVxuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKGRyYWZ0cy5fX3R5cGVuYW1lICE9PSBcIlN1Y2Nlc3NSZXNwb25zZVwiKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBfX3R5cGVuYW1lOiBcIlN1Y2Nlc3NSZXNwb25zZVwiLFxuICAgICAgICBkYXRhOiBmYWxzZVxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCBkcmFmdCA9IGRyYWZ0cy5kYXRhLmZpbmQoZCA9PiBkLm1haWxJbnRlZ3JpdHlJZCA9PT0gZHJhZnRJZCk7XG4gICAgaWYgKCFkcmFmdCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgX190eXBlbmFtZTogXCJTdWNjZXNzUmVzcG9uc2VcIixcbiAgICAgICAgZGF0YTogZmFsc2VcbiAgICAgIH07XG4gICAgfVxuICAgIGNvbnN0IHJlY2lwaWVudHMgPSBuZXcgQXJyYXk8TWFpbFJlY2lwaWVudElucHV0PigpO1xuXG4gICAgY29uc3QgdGVtcG9yYXJ5UmVjaXBpZW50cyA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XG5cbiAgICBmb3IgKGNvbnN0IHsgZW1haWwgfSBvZiBkcmFmdC50ZW1wb3JhcnlSZWNpcGllbnRzKSB7XG4gICAgICBpZiAoIWVtYWlsKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgaW5wdXQgPSBhd2FpdCB0aGlzLl9lYWNoVXNlcihcbiAgICAgICAgZHJhZnQuZmlsZXMsXG4gICAgICAgIGRyYWZ0LnN1YmplY3QsXG4gICAgICAgIGRyYWZ0LmJvZHksXG4gICAgICAgIGVtYWlsXG4gICAgICApO1xuXG4gICAgICBpZiAoIWlucHV0KSB7XG4gICAgICAgIHRlbXBvcmFyeVJlY2lwaWVudHMucHVzaChlbWFpbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZWNpcGllbnRzLnB1c2goaW5wdXQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgeyBpZCB9IG9mIGRyYWZ0LnJlY2lwaWVudHMpIHtcbiAgICAgIGNvbnN0IGlucHV0ID0gYXdhaXQgdGhpcy5fZWFjaFVzZXIoXG4gICAgICAgIGRyYWZ0LmZpbGVzLFxuICAgICAgICBkcmFmdC5zdWJqZWN0LFxuICAgICAgICBkcmFmdC5ib2R5LFxuICAgICAgICBpZFxuICAgICAgKTtcblxuICAgICAgaWYgKCFpbnB1dCkge1xuICAgICAgICB0ZW1wb3JhcnlSZWNpcGllbnRzLnB1c2goaWQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVjaXBpZW50cy5wdXNoKGlucHV0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCB7IHNlbmREcmFmdE1haWwgfSA9IGF3YWl0IHRoaXMuI3RodW5kZXIoXCJtdXRhdGlvblwiKSh7XG4gICAgICBzZW5kRHJhZnRNYWlsOiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0ZW1wb3JhcnlSZWNpcGllbnRzLFxuICAgICAgICAgIHJlY2lwaWVudHMsXG4gICAgICAgICAgZHJhZnRNYWlsSWQ6IGRyYWZ0Lm1haWxJbnRlZ3JpdHlJZCxcbiAgICAgICAgICBjdXN0b21NZXNzYWdlXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIi4uLm9uIEVycm9yQWNjZXNzRGVuaWVkXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi4uLm9uIEVycm9yQmFzaWNcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLi4ub24gU2VuZERyYWZ0TWFpbFJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBzZW5kRHJhZnRNYWlsOiB0cnVlXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfSk7XG5cbiAgICBpZiAoIXNlbmREcmFmdE1haWwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChzZW5kRHJhZnRNYWlsLl9fdHlwZW5hbWUgPT09IFwiRXJyb3JBY2Nlc3NEZW5pZWRcIikge1xuICAgICAgcmV0dXJuIHNlbmREcmFmdE1haWw7XG4gICAgfVxuXG4gICAgaWYgKHNlbmREcmFmdE1haWwuX190eXBlbmFtZSA9PT0gXCJFcnJvckJhc2ljXCIpIHtcbiAgICAgIHJldHVybiBzZW5kRHJhZnRNYWlsO1xuICAgIH1cblxuICAgIGlmICghc2VuZERyYWZ0TWFpbC5zZW5kRHJhZnRNYWlsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgX190eXBlbmFtZTogXCJTdWNjZXNzUmVzcG9uc2VcIixcbiAgICAgIGRhdGE6IHNlbmREcmFmdE1haWwuc2VuZERyYWZ0TWFpbFxuICAgIH07XG4gIH1cblxuICBhc3luYyBzZW5kV2FpdGluZ0VtYWlscygpOiBQcm9taXNlPFxuICAgIFN1Y2Nlc3NSZXNwb25zZTxib29sZWFuPiB8IEVycm9yQWNjZXNzRGVuaWVkIHwgRXJyb3JCYXNpYyB8IG51bGxcbiAgPiB7XG4gICAgLy8gVE9ETyBvcHRpIHRoaXNcbiAgICBjb25zdCBtYWlscyA9IGF3YWl0IHRoaXMuc2VudE1haWxzKCk7XG5cbiAgICBpZiAoIW1haWxzKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBfX3R5cGVuYW1lOiBcIlN1Y2Nlc3NSZXNwb25zZVwiLFxuICAgICAgICBkYXRhOiBmYWxzZVxuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKG1haWxzLl9fdHlwZW5hbWUgIT09IFwiU3VjY2Vzc1Jlc3BvbnNlXCIpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIF9fdHlwZW5hbWU6IFwiU3VjY2Vzc1Jlc3BvbnNlXCIsXG4gICAgICAgIGRhdGE6IGZhbHNlXG4gICAgICB9O1xuICAgIH1cbiAgICBjb25zdCBmaWx0ZXJlZCA9IG1haWxzLmRhdGEuZmlsdGVyKG0gPT4gbS50ZW1wb3JhcnlSZWNpcGllbnRzLmxlbmd0aCA+IDApO1xuXG4gICAgZm9yIChjb25zdCBtYWlsIG9mIGZpbHRlcmVkKSB7XG4gICAgICBmb3IgKGNvbnN0IHsgZW1haWwgfSBvZiBtYWlsLnRlbXBvcmFyeVJlY2lwaWVudHMpIHtcbiAgICAgICAgaWYgKCFlbWFpbCkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgaW5wdXQgPSBhd2FpdCB0aGlzLl9lYWNoVXNlcihcbiAgICAgICAgICAgIG1haWwuZmlsZXMsXG4gICAgICAgICAgICBtYWlsLnN1YmplY3QsXG4gICAgICAgICAgICBtYWlsLmJvZHksXG4gICAgICAgICAgICBlbWFpbFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBpZiAoIWlucHV0KSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYXdhaXQgdGhpcy4jdGh1bmRlcihcIm11dGF0aW9uXCIpKHtcbiAgICAgICAgICAgIHNlbmRPbmVNYWlsOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBtYWlsSW50ZWdyaXR5SWQ6IG1haWwubWFpbEludGVncml0eUlkLFxuICAgICAgICAgICAgICAgIHJlY2lwaWVudDogaW5wdXRcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIFwiLi4ub24gRXJyb3JBY2Nlc3NEZW5pZWRcIjoge1xuICAgICAgICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIFwiLi4ub24gRXJyb3JCYXNpY1wiOiB7XG4gICAgICAgICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgbWVzc2FnZTogdHJ1ZVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXCIuLi5vbiBSZWNvdmVyTm9kZVJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICAgICAgICByZWNvdmVyTm9kZTogdHJ1ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXVxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgX190eXBlbmFtZTogXCJTdWNjZXNzUmVzcG9uc2VcIixcbiAgICAgIGRhdGE6IGZhbHNlXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZURyYWZ0KHtcbiAgICBib2R5LFxuICAgIHN1YmplY3QsXG4gICAgZmlsZXMsXG4gICAgcmVjaXBpZW50c0lkcyxcbiAgICByZXBseVRvXG4gIH06IE5ld01haWwpOiBQcm9taXNlPFxuICAgIFN1Y2Nlc3NSZXNwb25zZTxEcmFmdE1haWw+IHwgRXJyb3JBY2Nlc3NEZW5pZWQgfCBFcnJvckJhc2ljIHwgbnVsbFxuICA+IHtcbiAgICBjb25zdCBoYXNoS2V5ID0gc29kaXVtLnJhbmRvbWJ5dGVzX2J1ZihcbiAgICAgIHNvZGl1bS5jcnlwdG9fZ2VuZXJpY2hhc2hfS0VZQllURVMsXG4gICAgICBcImhleFwiXG4gICAgKTtcbiAgICBjb25zdCBoYXNoID0gc29kaXVtLmNyeXB0b19nZW5lcmljaGFzaChcbiAgICAgIHNvZGl1bS5jcnlwdG9fZ2VuZXJpY2hhc2hfQllURVMsXG4gICAgICBKU09OLnN0cmluZ2lmeSh7IGJvZHksIHN1YmplY3QgfSksXG4gICAgICBoYXNoS2V5LFxuICAgICAgXCJoZXhcIlxuICAgICk7XG4gICAgY29uc3Qgc2VuZGVyRmlsZXMgPSBuZXcgQXJyYXk8TWFpbEZpbGVJbnB1dD4oKTtcbiAgICBmb3IgKGNvbnN0IGYgb2YgZmlsZXMpIHtcbiAgICAgIGxldCBmaWxlID0gZmlsZXNDYWNoZS5nZXQoZi5pZCk7XG4gICAgICBpZiAoIWZpbGUpIHtcbiAgICAgICAgYXdhaXQgdGhpcy4jY2xpZW50LmNsb3VkLmZpbGVNZXRhZGF0YSh7IGlkOiBmLmlkIH0pO1xuICAgICAgICBmaWxlID0gZmlsZXNDYWNoZS5nZXQoZi5pZCk7XG4gICAgICAgIGlmICghZmlsZSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRmlsZSAke2YubmFtZX0gKCR7Zi5pZH0pIGRvZXMgbm90IGV4aXN0c2ApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBzZW5kZXJGaWxlcy5wdXNoKHtcbiAgICAgICAgaWQ6IGZpbGUuaWQsXG4gICAgICAgIGZpbGVLZXk6IHNvZGl1bS50b19oZXgoXG4gICAgICAgICAgZW5jcnlwdENyeXB0b0JveChcbiAgICAgICAgICAgIHNvZGl1bS5mcm9tX3N0cmluZyhmaWxlLmtleSksXG4gICAgICAgICAgICB0aGlzLiNrZXlzLnB1YmxpY0tleSxcbiAgICAgICAgICAgIHRoaXMuI2tleXMucHJpdmF0ZUtleVxuICAgICAgICAgIClcbiAgICAgICAgKSxcbiAgICAgICAgbmFtZTogc29kaXVtLnRvX2hleChcbiAgICAgICAgICBlbmNyeXB0Q3J5cHRvQm94KFxuICAgICAgICAgICAgc29kaXVtLmZyb21fc3RyaW5nKGYubmFtZSksXG4gICAgICAgICAgICB0aGlzLiNrZXlzLnB1YmxpY0tleSxcbiAgICAgICAgICAgIHRoaXMuI2tleXMucHJpdmF0ZUtleVxuICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgeyBjcmVhdGVEcmFmdE1haWwgfSA9IGF3YWl0IHRoaXMuI3RodW5kZXIoXCJtdXRhdGlvblwiLCB7XG4gICAgICBzY2FsYXJzOiB7XG4gICAgICAgIERhdGVUaW1lOiB7XG4gICAgICAgICAgZGVjb2RlOiAoZTogdW5rbm93bikgPT4gbmV3IERhdGUoZSBhcyBzdHJpbmcpLFxuICAgICAgICAgIGVuY29kZTogKGU6IHVua25vd24pID0+IChlIGFzIERhdGUpLnRvSVNPU3RyaW5nKClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pKHtcbiAgICAgIGNyZWF0ZURyYWZ0TWFpbDogW1xuICAgICAgICB7XG4gICAgICAgICAgcmVjaXBpZW50czogcmVjaXBpZW50c0lkcyxcbiAgICAgICAgICByZXBseVRvLFxuICAgICAgICAgIGJvZHk6IHNvZGl1bS50b19oZXgoXG4gICAgICAgICAgICBlbmNyeXB0Q3J5cHRvQm94KFxuICAgICAgICAgICAgICBzb2RpdW0uZnJvbV9zdHJpbmcoYm9keSksXG4gICAgICAgICAgICAgIHRoaXMuI2tleXMucHVibGljS2V5LFxuICAgICAgICAgICAgICB0aGlzLiNrZXlzLnByaXZhdGVLZXlcbiAgICAgICAgICAgIClcbiAgICAgICAgICApLFxuICAgICAgICAgIHN1YmplY3Q6IHNvZGl1bS50b19oZXgoXG4gICAgICAgICAgICBlbmNyeXB0Q3J5cHRvQm94KFxuICAgICAgICAgICAgICBzb2RpdW0uZnJvbV9zdHJpbmcoc3ViamVjdCksXG4gICAgICAgICAgICAgIHRoaXMuI2tleXMucHVibGljS2V5LFxuICAgICAgICAgICAgICB0aGlzLiNrZXlzLnByaXZhdGVLZXlcbiAgICAgICAgICAgIClcbiAgICAgICAgICApLFxuICAgICAgICAgIHNlbmRlckZpbGVzLFxuICAgICAgICAgIGhhc2gsXG4gICAgICAgICAgaGFzaEtleVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCIuLi5vbiBFcnJvckFjY2Vzc0RlbmllZFwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgbWVzc2FnZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCIuLi5vbiBFcnJvckJhc2ljXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi4uLm9uIENyZWF0ZURyYWZ0TWFpbFJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBjcmVhdGVEcmFmdE1haWw6IG1haWxTZWxlY3RvclxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgXVxuICAgIH0pO1xuXG4gICAgaWYgKCFjcmVhdGVEcmFmdE1haWwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChjcmVhdGVEcmFmdE1haWwuX190eXBlbmFtZSA9PT0gXCJFcnJvckFjY2Vzc0RlbmllZFwiKSB7XG4gICAgICByZXR1cm4gY3JlYXRlRHJhZnRNYWlsO1xuICAgIH1cblxuICAgIGlmIChjcmVhdGVEcmFmdE1haWwuX190eXBlbmFtZSA9PT0gXCJFcnJvckJhc2ljXCIpIHtcbiAgICAgIHJldHVybiBjcmVhdGVEcmFmdE1haWw7XG4gICAgfVxuXG4gICAgaWYgKCFjcmVhdGVEcmFmdE1haWwuY3JlYXRlRHJhZnRNYWlsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBjb252ZXJ0SW50ZXJuYWxNYWlsVG9FeHRlcm5hbChcbiAgICAgIGNyZWF0ZURyYWZ0TWFpbC5jcmVhdGVEcmFmdE1haWwsXG4gICAgICB0aGlzLiNrZXlzXG4gICAgKSBhcyBEcmFmdE1haWw7XG5cbiAgICByZXR1cm4ge1xuICAgICAgX190eXBlbmFtZTogXCJTdWNjZXNzUmVzcG9uc2VcIixcbiAgICAgIGRhdGE6IHJlc3VsdFxuICAgIH07XG4gIH1cblxuICBhc3luYyByZWFkKHtcbiAgICBtYWlsSWRcbiAgfToge1xuICAgIG1haWxJZDogc3RyaW5nO1xuICB9KTogUHJvbWlzZTxcbiAgICB8IFN1Y2Nlc3NSZXNwb25zZTxib29sZWFuPlxuICAgIHwgRXJyb3JBY2Nlc3NEZW5pZWRcbiAgICB8IEVycm9yQmFzaWNcbiAgICB8IEVycm9yTm90Rm91bmRcbiAgICB8IG51bGxcbiAgPiB7XG4gICAgY29uc3QgeyByZWFkTWFpbCB9ID0gYXdhaXQgdGhpcy4jdGh1bmRlcihcIm11dGF0aW9uXCIpKHtcbiAgICAgIHJlYWRNYWlsOiBbXG4gICAgICAgIHsgbWFpbElkIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIi4uLm9uIEVycm9yQWNjZXNzRGVuaWVkXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi4uLm9uIEVycm9yQmFzaWNcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLi4ub24gRXJyb3JOb3RGb3VuZFwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgbWVzc2FnZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCIuLi5vbiBSZWFkTWFpbFJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICByZWFkTWFpbDogdHJ1ZVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgXVxuICAgIH0pO1xuXG4gICAgaWYgKCFyZWFkTWFpbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKHJlYWRNYWlsLl9fdHlwZW5hbWUgPT09IFwiRXJyb3JBY2Nlc3NEZW5pZWRcIikge1xuICAgICAgcmV0dXJuIHJlYWRNYWlsO1xuICAgIH1cblxuICAgIGlmIChyZWFkTWFpbC5fX3R5cGVuYW1lID09PSBcIkVycm9yQmFzaWNcIikge1xuICAgICAgcmV0dXJuIHJlYWRNYWlsO1xuICAgIH1cblxuICAgIGlmIChyZWFkTWFpbC5fX3R5cGVuYW1lID09PSBcIkVycm9yTm90Rm91bmRcIikge1xuICAgICAgcmV0dXJuIHJlYWRNYWlsO1xuICAgIH1cblxuICAgIGlmICghcmVhZE1haWwucmVhZE1haWwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBfX3R5cGVuYW1lOiBcIlN1Y2Nlc3NSZXNwb25zZVwiLFxuICAgICAgZGF0YTogcmVhZE1haWwucmVhZE1haWxcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgdW5yZWFkKHtcbiAgICBtYWlsSWRcbiAgfToge1xuICAgIG1haWxJZDogc3RyaW5nO1xuICB9KTogUHJvbWlzZTxcbiAgICB8IFN1Y2Nlc3NSZXNwb25zZTxib29sZWFuPlxuICAgIHwgRXJyb3JBY2Nlc3NEZW5pZWRcbiAgICB8IEVycm9yQmFzaWNcbiAgICB8IEVycm9yTm90Rm91bmRcbiAgICB8IG51bGxcbiAgPiB7XG4gICAgY29uc3QgeyB1bnJlYWRNYWlsIH0gPSBhd2FpdCB0aGlzLiN0aHVuZGVyKFwibXV0YXRpb25cIikoe1xuICAgICAgdW5yZWFkTWFpbDogW1xuICAgICAgICB7IG1haWxJZCB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCIuLi5vbiBFcnJvckFjY2Vzc0RlbmllZFwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgbWVzc2FnZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCIuLi5vbiBFcnJvckJhc2ljXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi4uLm9uIEVycm9yTm90Rm91bmRcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLi4ub24gVW5yZWFkTWFpbFJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICB1bnJlYWRNYWlsOiB0cnVlXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfSk7XG5cbiAgICBpZiAoIXVucmVhZE1haWwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmICh1bnJlYWRNYWlsLl9fdHlwZW5hbWUgPT09IFwiRXJyb3JBY2Nlc3NEZW5pZWRcIikge1xuICAgICAgcmV0dXJuIHVucmVhZE1haWw7XG4gICAgfVxuXG4gICAgaWYgKHVucmVhZE1haWwuX190eXBlbmFtZSA9PT0gXCJFcnJvckJhc2ljXCIpIHtcbiAgICAgIHJldHVybiB1bnJlYWRNYWlsO1xuICAgIH1cblxuICAgIGlmICh1bnJlYWRNYWlsLl9fdHlwZW5hbWUgPT09IFwiRXJyb3JOb3RGb3VuZFwiKSB7XG4gICAgICByZXR1cm4gdW5yZWFkTWFpbDtcbiAgICB9XG5cbiAgICBpZiAoIXVucmVhZE1haWwudW5yZWFkTWFpbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIF9fdHlwZW5hbWU6IFwiU3VjY2Vzc1Jlc3BvbnNlXCIsXG4gICAgICBkYXRhOiB1bnJlYWRNYWlsLnVucmVhZE1haWxcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgcmVjZWl2ZWRNYWlscygpOiBQcm9taXNlPFxuICAgIFN1Y2Nlc3NSZXNwb25zZTxSZWNlaXZlZE1haWxbXT4gfCBFcnJvck5vdEZvdW5kIHwgbnVsbFxuICA+IHtcbiAgICBjb25zdCB7IHVzZXIgfSA9IGF3YWl0IHRoaXMuI3RodW5kZXIoXCJxdWVyeVwiLCB7XG4gICAgICBzY2FsYXJzOiB7XG4gICAgICAgIERhdGVUaW1lOiB7XG4gICAgICAgICAgZGVjb2RlOiAoZTogdW5rbm93bikgPT4gbmV3IERhdGUoZSBhcyBzdHJpbmcpLFxuICAgICAgICAgIGVuY29kZTogKGU6IHVua25vd24pID0+IChlIGFzIERhdGUpLnRvSVNPU3RyaW5nKClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pKHtcbiAgICAgIHVzZXI6IFtcbiAgICAgICAge30sXG4gICAgICAgIHtcbiAgICAgICAgICBcIi4uLm9uIEVycm9yTm90Rm91bmRcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLi4ub24gVXNlclJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICB1c2VyOiB7XG4gICAgICAgICAgICAgIHJlY2VpdmVkTWFpbHM6IG1haWxTZWxlY3RvclxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgXVxuICAgIH0pO1xuXG4gICAgaWYgKCF1c2VyKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAodXNlci5fX3R5cGVuYW1lID09PSBcIkVycm9yTm90Rm91bmRcIikge1xuICAgICAgcmV0dXJuIHVzZXI7XG4gICAgfVxuXG4gICAgaWYgKCF1c2VyLnVzZXIpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIFRPRE8gZ2V0IGFjdHVhbCBtYWlscyBvbiB0aGlzIGFwcCBvbmx5XG5cbiAgICBjb25zdCByZWNlaXZlZE1haWxzID0gbmV3IEFycmF5PFJlY2VpdmVkTWFpbD4oKTtcblxuICAgIGZvciAoY29uc3QgbSBvZiB1c2VyLnVzZXIucmVjZWl2ZWRNYWlscykge1xuICAgICAgY29uc3QgbWFpbCA9IGNvbnZlcnRJbnRlcm5hbE1haWxUb0V4dGVybmFsKG0sIHRoaXMuI2tleXMpO1xuICAgICAgaWYgKG1haWwpIHtcbiAgICAgICAgcmVjZWl2ZWRNYWlscy5wdXNoKG1haWwgYXMgUmVjZWl2ZWRNYWlsKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgX190eXBlbmFtZTogXCJTdWNjZXNzUmVzcG9uc2VcIixcbiAgICAgIGRhdGE6IHJlY2VpdmVkTWFpbHNcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgc2VudE1haWxzKCk6IFByb21pc2U8XG4gICAgU3VjY2Vzc1Jlc3BvbnNlPFNlbnRNYWlsW10+IHwgRXJyb3JOb3RGb3VuZCB8IG51bGxcbiAgPiB7XG4gICAgY29uc3QgeyB1c2VyIH0gPSBhd2FpdCB0aGlzLiN0aHVuZGVyKFwicXVlcnlcIiwge1xuICAgICAgc2NhbGFyczoge1xuICAgICAgICBEYXRlVGltZToge1xuICAgICAgICAgIGRlY29kZTogKGU6IHVua25vd24pID0+IG5ldyBEYXRlKGUgYXMgc3RyaW5nKSxcbiAgICAgICAgICBlbmNvZGU6IChlOiB1bmtub3duKSA9PiAoZSBhcyBEYXRlKS50b0lTT1N0cmluZygpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KSh7XG4gICAgICB1c2VyOiBbXG4gICAgICAgIHt9LFxuICAgICAgICB7XG4gICAgICAgICAgXCIuLi5vbiBFcnJvck5vdEZvdW5kXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi4uLm9uIFVzZXJSZXNwb25zZVwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgdXNlcjoge1xuICAgICAgICAgICAgICBzZW50TWFpbHM6IG1haWxTZWxlY3RvclxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgXVxuICAgIH0pO1xuXG4gICAgaWYgKCF1c2VyKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAodXNlci5fX3R5cGVuYW1lID09PSBcIkVycm9yTm90Rm91bmRcIikge1xuICAgICAgcmV0dXJuIHVzZXI7XG4gICAgfVxuXG4gICAgaWYgKCF1c2VyLnVzZXIpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIFRPRE8gZ2V0IGFjdHVhbCBtYWlscyBvbiB0aGlzIGFwcCBvbmx5XG5cbiAgICBjb25zdCBzZW50TWFpbHMgPSBuZXcgQXJyYXk8U2VudE1haWw+KCk7XG5cbiAgICBmb3IgKGNvbnN0IG0gb2YgdXNlci51c2VyLnNlbnRNYWlscykge1xuICAgICAgY29uc3QgbWFpbCA9IGNvbnZlcnRJbnRlcm5hbE1haWxUb0V4dGVybmFsKG0sIHRoaXMuI2tleXMpO1xuICAgICAgaWYgKG1haWwpIHtcbiAgICAgICAgc2VudE1haWxzLnB1c2gobWFpbCBhcyBTZW50TWFpbCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIF9fdHlwZW5hbWU6IFwiU3VjY2Vzc1Jlc3BvbnNlXCIsXG4gICAgICBkYXRhOiBzZW50TWFpbHNcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgZHJhZnRNYWlscygpOiBQcm9taXNlPFxuICAgIFN1Y2Nlc3NSZXNwb25zZTxEcmFmdE1haWxbXT4gfCBFcnJvck5vdEZvdW5kIHwgbnVsbFxuICA+IHtcbiAgICBjb25zdCB7IHVzZXIgfSA9IGF3YWl0IHRoaXMuI3RodW5kZXIoXCJxdWVyeVwiLCB7XG4gICAgICBzY2FsYXJzOiB7XG4gICAgICAgIERhdGVUaW1lOiB7XG4gICAgICAgICAgZGVjb2RlOiAoZTogdW5rbm93bikgPT4gbmV3IERhdGUoZSBhcyBzdHJpbmcpLFxuICAgICAgICAgIGVuY29kZTogKGU6IHVua25vd24pID0+IChlIGFzIERhdGUpLnRvSVNPU3RyaW5nKClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pKHtcbiAgICAgIHVzZXI6IFtcbiAgICAgICAge30sXG4gICAgICAgIHtcbiAgICAgICAgICBcIi4uLm9uIEVycm9yTm90Rm91bmRcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLi4ub24gVXNlclJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICB1c2VyOiB7XG4gICAgICAgICAgICAgIGRyYWZ0TWFpbHM6IG1haWxTZWxlY3RvclxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgXVxuICAgIH0pO1xuXG4gICAgaWYgKCF1c2VyKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAodXNlci5fX3R5cGVuYW1lID09PSBcIkVycm9yTm90Rm91bmRcIikge1xuICAgICAgcmV0dXJuIHVzZXI7XG4gICAgfVxuXG4gICAgaWYgKCF1c2VyLnVzZXIpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIFRPRE8gZ2V0IGFjdHVhbCBtYWlscyBvbiB0aGlzIGFwcCBvbmx5XG5cbiAgICBjb25zdCBkcmFmdE1haWxzID0gbmV3IEFycmF5PERyYWZ0TWFpbD4oKTtcblxuICAgIGZvciAoY29uc3QgbSBvZiB1c2VyLnVzZXIuZHJhZnRNYWlscykge1xuICAgICAgY29uc3QgZHJhZnQgPSBjb252ZXJ0SW50ZXJuYWxNYWlsVG9FeHRlcm5hbChtLCB0aGlzLiNrZXlzKSBhcyBEcmFmdE1haWw7XG4gICAgICBpZiAoZHJhZnQpIHtcbiAgICAgICAgZHJhZnRNYWlscy5wdXNoKGRyYWZ0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgX190eXBlbmFtZTogXCJTdWNjZXNzUmVzcG9uc2VcIixcbiAgICAgIGRhdGE6IGRyYWZ0TWFpbHNcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgdW5yZWFkUmVjZWl2ZWRNYWlsc0NvdW50KCk6IFByb21pc2U8XG4gICAgU3VjY2Vzc1Jlc3BvbnNlPG51bWJlcj4gfCBFcnJvckFjY2Vzc0RlbmllZCB8IG51bGxcbiAgPiB7XG4gICAgY29uc3QgeyB1bnJlYWRSZWNlaXZlZE1haWxzQ291bnQgfSA9IGF3YWl0IHRoaXMuI3RodW5kZXIoXCJxdWVyeVwiKSh7XG4gICAgICB1bnJlYWRSZWNlaXZlZE1haWxzQ291bnQ6IHtcbiAgICAgICAgXCIuLi5vbiBFcnJvckFjY2Vzc0RlbmllZFwiOiB7XG4gICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiLi4ub24gVW5yZWFkUmVjZWl2ZWRNYWlsc0NvdW50UmVzcG9uc2VcIjoge1xuICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgY291bnQ6IHRydWVcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKCF1bnJlYWRSZWNlaXZlZE1haWxzQ291bnQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmICh1bnJlYWRSZWNlaXZlZE1haWxzQ291bnQuX190eXBlbmFtZSA9PT0gXCJFcnJvckFjY2Vzc0RlbmllZFwiKSB7XG4gICAgICByZXR1cm4gdW5yZWFkUmVjZWl2ZWRNYWlsc0NvdW50O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBfX3R5cGVuYW1lOiBcIlN1Y2Nlc3NSZXNwb25zZVwiLFxuICAgICAgZGF0YTogdW5yZWFkUmVjZWl2ZWRNYWlsc0NvdW50LmNvdW50XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgX2VhY2hVc2VyID0gYXN5bmMgKFxuICAgIGZpbGVzOiB7IGlkOiBzdHJpbmc7IG5hbWU6IHN0cmluZyB9W10sXG4gICAgc3ViamVjdDogc3RyaW5nLFxuICAgIGJvZHk6IHN0cmluZyxcbiAgICBpZE9yTWFpbDogc3RyaW5nXG4gICk6IFByb21pc2U8TWFpbFJlY2lwaWVudElucHV0IHwgbnVsbD4gPT4ge1xuICAgIGxldCB1ID0gdXNlcnNDYWNoZS5nZXQoaWRPck1haWwpO1xuXG4gICAgaWYgKCF1IHx8ICEoXCJwdWJsaWNLZXlcIiBpbiB1KSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVxID0gYXdhaXQgdGhpcy4jY2xpZW50LnVzZXIoe1xuICAgICAgICAgIHVzZXJJZDogaWRPck1haWwsXG4gICAgICAgICAgd2l0aFB1YmxpY0tleTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKCFyZXEpIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVxLl9fdHlwZW5hbWUgIT09IFwiU3VjY2Vzc1Jlc3BvbnNlXCIpIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICB1ID0gcmVxLmRhdGE7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIGlmICghdSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIShcInB1YmxpY0tleVwiIGluIHUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVzZXIgJHtpZE9yTWFpbH0gaGF2ZSBubyBwdWJsaWMga2V5YCk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVjaXBpZW50c0ZpbGVzID0gbmV3IEFycmF5PE1haWxGaWxlSW5wdXQ+KCk7XG5cbiAgICBmb3IgKGNvbnN0IGYgb2YgZmlsZXMpIHtcbiAgICAgIGxldCBmaWxlSW5IaXN0b3J5ID0gZmlsZXNDYWNoZS5nZXQoZi5pZCk7XG4gICAgICBpZiAoIWZpbGVJbkhpc3RvcnkpIHtcbiAgICAgICAgYXdhaXQgdGhpcy4jY2xpZW50LmNsb3VkLmZpbGVNZXRhZGF0YSh7IGlkOiBmLmlkIH0pO1xuICAgICAgICBmaWxlSW5IaXN0b3J5ID0gZmlsZXNDYWNoZS5nZXQoZi5pZCk7XG4gICAgICAgIGlmICghZmlsZUluSGlzdG9yeSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRmlsZSAke2YubmFtZX0gKCR7Zi5pZH0pIGRvZXMgbm90IGV4aXN0c2ApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCBrZXkgPSBmaWxlSW5IaXN0b3J5LmtleTtcbiAgICAgIHJlY2lwaWVudHNGaWxlcy5wdXNoKHtcbiAgICAgICAgaWQ6IGYuaWQsXG4gICAgICAgIG5hbWU6IHNvZGl1bS50b19oZXgoXG4gICAgICAgICAgZW5jcnlwdENyeXB0b0JveChcbiAgICAgICAgICAgIHNvZGl1bS5mcm9tX3N0cmluZyhmLm5hbWUpLFxuICAgICAgICAgICAgdS5wdWJsaWNLZXksXG4gICAgICAgICAgICB0aGlzLiNrZXlzLnByaXZhdGVLZXlcbiAgICAgICAgICApXG4gICAgICAgICksXG4gICAgICAgIGZpbGVLZXk6IHNvZGl1bS50b19oZXgoXG4gICAgICAgICAgZW5jcnlwdENyeXB0b0JveChcbiAgICAgICAgICAgIHNvZGl1bS5mcm9tX2hleChrZXkpLFxuICAgICAgICAgICAgdS5wdWJsaWNLZXksXG4gICAgICAgICAgICB0aGlzLiNrZXlzLnByaXZhdGVLZXlcbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICByZWNpcGllbnRJZDogdS5pZCxcbiAgICAgIGJvZHk6IHNvZGl1bS50b19oZXgoXG4gICAgICAgIGVuY3J5cHRDcnlwdG9Cb3goXG4gICAgICAgICAgc29kaXVtLmZyb21fc3RyaW5nKGJvZHkpLFxuICAgICAgICAgIHUucHVibGljS2V5LFxuICAgICAgICAgIHRoaXMuI2tleXMucHJpdmF0ZUtleVxuICAgICAgICApXG4gICAgICApLFxuICAgICAgc3ViamVjdDogc29kaXVtLnRvX2hleChcbiAgICAgICAgZW5jcnlwdENyeXB0b0JveChcbiAgICAgICAgICBzb2RpdW0uZnJvbV9zdHJpbmcoc3ViamVjdCksXG4gICAgICAgICAgdS5wdWJsaWNLZXksXG4gICAgICAgICAgdGhpcy4ja2V5cy5wcml2YXRlS2V5XG4gICAgICAgIClcbiAgICAgICksXG4gICAgICBmaWxlczogcmVjaXBpZW50c0ZpbGVzXG4gICAgfTtcbiAgfTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQTtBQUNBLFNBQVNBLFFBQVQsUUFBeUIsU0FBekI7QUFDQSxTQUFTQyxVQUFULEVBQXFCQyxVQUFyQixRQUF1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