@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,1627 @@
1
+ import _classPrivateFieldLooseBase from "@babel/runtime/helpers/classPrivateFieldLooseBase";
2
+ import _classPrivateFieldLooseKey from "@babel/runtime/helpers/classPrivateFieldLooseKey";
3
+
4
+ /* eslint-disable @typescript-eslint/naming-convention */
5
+ import axios from "axios";
6
+ import ky from "ky";
7
+ import { encryptName } from "../index.js";
8
+ import { nodesCache, filesCache } from "../cache.js";
9
+ import { secretstreamKeygen } from "../crypto/file.js";
10
+ import { decryptCryptoBox } from "../crypto/index.js";
11
+ import { encryptCryptoBox } from "../crypto/index.js";
12
+ import { compress, uncompress } from "../minify/index.js";
13
+ import { sodium } from "../sodium.js";
14
+ import { enumerate, chunks, promiseAllLimit, concatenate } from "../utils/utils.js";
15
+ import { md5 } from "../worker/md5.js";
16
+ import { decrypt, encrypt } from "../worker/sodium.js";
17
+ import { gqlFileToExternal } from "./convert/file.js";
18
+ import { gqlNodeFullToInternalFull, gqlNodeToExternal, gqlNodeToExternalNodeFull, internalNodeToNode } from "./convert/node.js";
19
+ import { fileSelector, nodeFullSelector, nodeSelector } from "./types/selectors.js"; // import { md5 } from "../worker/index.js";
20
+ // import { firstValueFrom, of } from "rxjs";
21
+
22
+ var _client = /*#__PURE__*/_classPrivateFieldLooseKey("client");
23
+
24
+ var _keys = /*#__PURE__*/_classPrivateFieldLooseKey("keys");
25
+
26
+ var _thunder = /*#__PURE__*/_classPrivateFieldLooseKey("thunder");
27
+
28
+ export class SecrecyCloudClient {
29
+ constructor(client, keys, thunder) {
30
+ Object.defineProperty(this, _client, {
31
+ writable: true,
32
+ value: void 0
33
+ });
34
+ Object.defineProperty(this, _keys, {
35
+ writable: true,
36
+ value: void 0
37
+ });
38
+ Object.defineProperty(this, _thunder, {
39
+ writable: true,
40
+ value: void 0
41
+ });
42
+
43
+ this.perNode = async (nodeId, publicKey) => {
44
+ var _node$access;
45
+
46
+ let node = nodesCache.get(nodeId);
47
+
48
+ if (!node) {
49
+ await this.node({
50
+ id: nodeId
51
+ });
52
+ node = nodesCache.get(nodeId);
53
+
54
+ if (!node) {
55
+ return null;
56
+ }
57
+ }
58
+
59
+ const nameKey = (_node$access = node.access) == null ? void 0 : _node$access.nameKey;
60
+
61
+ if (!nameKey) {
62
+ return null;
63
+ }
64
+
65
+ return {
66
+ id: node.id,
67
+ nameKey: sodium.to_hex(encryptCryptoBox(sodium.from_hex(nameKey), publicKey, _classPrivateFieldLooseBase(this, _keys)[_keys].privateKey)),
68
+ files: "history" in node ? node.history.map(f => ({
69
+ id: f.id,
70
+ key: sodium.to_hex(encryptCryptoBox(sodium.from_hex(f.key), publicKey, _classPrivateFieldLooseBase(this, _keys)[_keys].privateKey))
71
+ })) : []
72
+ };
73
+ };
74
+
75
+ _classPrivateFieldLooseBase(this, _client)[_client] = client;
76
+ _classPrivateFieldLooseBase(this, _keys)[_keys] = keys;
77
+ _classPrivateFieldLooseBase(this, _thunder)[_thunder] = thunder;
78
+ }
79
+
80
+ async addFileToHistory(_ref) {
81
+ let {
82
+ fileId,
83
+ nodeId
84
+ } = _ref;
85
+ const {
86
+ addFileToHistory
87
+ } = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("mutation")({
88
+ addFileToHistory: [{
89
+ fileId,
90
+ nodeId
91
+ }, {
92
+ "...on ErrorAccessDenied": {
93
+ __typename: true,
94
+ message: true
95
+ },
96
+ "...on ErrorNotExist": {
97
+ __typename: true,
98
+ message: true
99
+ },
100
+ "...on AddFileToHistoryResponse": {
101
+ __typename: true,
102
+ addFileToHistory: nodeFullSelector
103
+ }
104
+ }]
105
+ });
106
+
107
+ if (!addFileToHistory) {
108
+ return null;
109
+ }
110
+
111
+ if (addFileToHistory.__typename === "ErrorAccessDenied") {
112
+ return addFileToHistory;
113
+ }
114
+
115
+ if (addFileToHistory.__typename === "ErrorNotExist") {
116
+ return addFileToHistory;
117
+ }
118
+
119
+ const node = await gqlNodeFullToInternalFull(addFileToHistory.addFileToHistory, _classPrivateFieldLooseBase(this, _keys)[_keys]);
120
+ const file = node.history.find(f => f.id === fileId);
121
+
122
+ if (file) {
123
+ const users = node.users.filter(_ref2 => {
124
+ let [u] = _ref2;
125
+ return u.publicKey !== _classPrivateFieldLooseBase(this, _keys)[_keys].publicKey;
126
+ });
127
+ const input = {
128
+ fileId: file.id,
129
+ users: users.map(_ref3 => {
130
+ let [u] = _ref3;
131
+ return {
132
+ id: u.id,
133
+ key: sodium.to_hex(encryptCryptoBox(sodium.from_hex(file.key), _classPrivateFieldLooseBase(this, _keys)[_keys].publicKey, _classPrivateFieldLooseBase(this, _keys)[_keys].privateKey))
134
+ };
135
+ })
136
+ };
137
+ await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("mutation")({
138
+ shareFileInHistory: [{
139
+ input,
140
+ nodeId
141
+ }, {
142
+ "...on ErrorAccessDenied": {
143
+ __typename: true,
144
+ message: true
145
+ },
146
+ "...on ErrorNotFound": {
147
+ __typename: true,
148
+ message: true
149
+ },
150
+ "...on ShareFileInHistoryResponse": {
151
+ __typename: true,
152
+ shareFileInHistory: true
153
+ }
154
+ }]
155
+ });
156
+ }
157
+
158
+ const result = internalNodeToNode(node);
159
+ return {
160
+ __typename: "SuccessResponse",
161
+ data: result
162
+ };
163
+ }
164
+
165
+ async uploadFile(_ref4) {
166
+ let {
167
+ file,
168
+ encryptProgress,
169
+ uploadProgress,
170
+ signal
171
+ } = _ref4;
172
+ const fileKey = secretstreamKeygen();
173
+ const fileBuffer = file instanceof File ? new Uint8Array(await file.arrayBuffer()) : file;
174
+ const compressed = compress(fileBuffer);
175
+ const {
176
+ data: encryptedFile,
177
+ md5: md5File,
178
+ md5Encrypted
179
+ } = await encrypt(fileKey, compressed, encryptProgress, signal);
180
+ const encryptedFileKey = encryptCryptoBox(fileKey, _classPrivateFieldLooseBase(this, _keys)[_keys].publicKey, _classPrivateFieldLooseBase(this, _keys)[_keys].privateKey);
181
+ const {
182
+ uploadFile
183
+ } = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("mutation", {
184
+ scalars: {
185
+ Json: {
186
+ encode: e => JSON.stringify(e),
187
+ decode: e => JSON.parse(e)
188
+ },
189
+ DateTime: {
190
+ decode: e => new Date(e),
191
+ encode: e => e.toISOString()
192
+ },
193
+ BigInt: {
194
+ decode: e => BigInt(e),
195
+ encode: e => e.toString()
196
+ }
197
+ }
198
+ })({
199
+ uploadFile: [{
200
+ fileSize: encryptedFile.byteLength,
201
+ fileSizeBefore: fileBuffer.byteLength,
202
+ fileKey: sodium.to_hex(encryptedFileKey),
203
+ md5Encrypted,
204
+ md5: md5File
205
+ }, {
206
+ "...on ErrorAccessDenied": {
207
+ __typename: true,
208
+ message: true
209
+ },
210
+ "...on ErrorLimit": {
211
+ __typename: true,
212
+ message: true
213
+ },
214
+ "...on ErrorNotFound": {
215
+ __typename: true,
216
+ message: true
217
+ },
218
+ "...on UploadFileResponse": {
219
+ __typename: true,
220
+ uploadFile: {
221
+ fileId: true,
222
+ filePartSize: true,
223
+ parts: {
224
+ fields: true,
225
+ order: true,
226
+ url: true
227
+ }
228
+ }
229
+ }
230
+ }]
231
+ });
232
+
233
+ if (!uploadFile) {
234
+ return null;
235
+ }
236
+
237
+ if (uploadFile.__typename === "ErrorAccessDenied") {
238
+ return uploadFile;
239
+ }
240
+
241
+ if (uploadFile.__typename === "ErrorLimit") {
242
+ return uploadFile;
243
+ }
244
+
245
+ if (uploadFile.__typename === "ErrorNotFound") {
246
+ return uploadFile;
247
+ }
248
+
249
+ if (!uploadFile.uploadFile) {
250
+ return null;
251
+ }
252
+
253
+ uploadProgress == null ? void 0 : uploadProgress({
254
+ total: encryptedFile.byteLength,
255
+ current: 0,
256
+ percent: 0
257
+ });
258
+
259
+ if (uploadFile.uploadFile.parts.length === 0) {
260
+ uploadProgress == null ? void 0 : uploadProgress({
261
+ total: encryptedFile.byteLength,
262
+ current: encryptedFile.byteLength,
263
+ percent: 1
264
+ });
265
+ return {
266
+ __typename: "SuccessResponse",
267
+ data: uploadFile.uploadFile.fileId
268
+ };
269
+ }
270
+
271
+ const uploadPartEnded = async (md5, order) => {
272
+ if (!uploadFile.uploadFile) {
273
+ return null;
274
+ }
275
+
276
+ const {
277
+ uploadFilePartEnd
278
+ } = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("mutation")({
279
+ uploadFilePartEnd: [{
280
+ fileId: uploadFile.uploadFile.fileId,
281
+ md5,
282
+ order
283
+ }, {
284
+ "...on ErrorAccessDenied": {
285
+ __typename: true,
286
+ message: true
287
+ },
288
+ "...on UploadFilePartEndResponse": {
289
+ __typename: true,
290
+ uploadFilePartEnd: true
291
+ }
292
+ }]
293
+ });
294
+
295
+ if (!uploadFilePartEnd) {
296
+ return null;
297
+ }
298
+
299
+ if (uploadFilePartEnd.__typename === "ErrorAccessDenied") {
300
+ return uploadFilePartEnd;
301
+ }
302
+
303
+ return {
304
+ __typename: "SuccessResponse",
305
+ data: uploadFilePartEnd.uploadFilePartEnd
306
+ };
307
+ };
308
+
309
+ const uploadEnded = async () => {
310
+ if (!uploadFile.uploadFile) {
311
+ return null;
312
+ }
313
+
314
+ const {
315
+ uploadFileEnd
316
+ } = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("mutation")({
317
+ uploadFileEnd: [{
318
+ fileId: uploadFile.uploadFile.fileId
319
+ }, {
320
+ "...on ErrorAccessDenied": {
321
+ __typename: true,
322
+ message: true
323
+ },
324
+ "...on ErrorNotFound": {
325
+ __typename: true,
326
+ message: true
327
+ },
328
+ "...on UploadFileEndResponse": {
329
+ __typename: true,
330
+ uploadFileEnd: true
331
+ }
332
+ }]
333
+ });
334
+
335
+ if (!uploadFileEnd) {
336
+ return null;
337
+ }
338
+
339
+ if (uploadFileEnd.__typename === "ErrorAccessDenied") {
340
+ return uploadFileEnd;
341
+ }
342
+
343
+ if (uploadFileEnd.__typename === "ErrorNotFound") {
344
+ return uploadFileEnd;
345
+ }
346
+
347
+ if (!uploadFileEnd.uploadFileEnd) {
348
+ return null;
349
+ }
350
+
351
+ return {
352
+ __typename: "SuccessResponse",
353
+ data: uploadFileEnd.uploadFileEnd
354
+ };
355
+ };
356
+
357
+ const chunkParts = new Array();
358
+
359
+ for (const [index, chunk] of enumerate(chunks(encryptedFile, Number(uploadFile.uploadFile.filePartSize)))) {
360
+ chunkParts.push({
361
+ order: index + 1,
362
+ data: chunk,
363
+ md5: await md5(chunk)
364
+ });
365
+ }
366
+
367
+ const progressParts = {};
368
+
369
+ const onProgress = (part, progressEvent) => {
370
+ progressParts[part] = progressEvent;
371
+ const current = Object.values(progressParts).reduce((prv, cur) => prv + cur.loaded, 0);
372
+ uploadProgress == null ? void 0 : uploadProgress({
373
+ percent: current / encryptedFile.byteLength,
374
+ total: encryptedFile.byteLength,
375
+ current
376
+ });
377
+ };
378
+
379
+ const byPart = async part => {
380
+ if (!uploadFile.uploadFile) {
381
+ return;
382
+ }
383
+
384
+ const formData = new FormData();
385
+ const chunk = chunkParts.find(p => p.order === part.order);
386
+
387
+ if (!chunk) {
388
+ return;
389
+ }
390
+
391
+ for (const [key, value] of Object.entries(part.fields)) {
392
+ formData.append(key, value);
393
+ }
394
+
395
+ formData.append("file", new Blob([chunk.data]), `${uploadFile.uploadFile.fileId}-${chunk.order}`);
396
+ await axios.post(part.url, formData, {
397
+ onUploadProgress: progressEvent => onProgress(part.order, progressEvent),
398
+ signal
399
+ });
400
+ await uploadPartEnded(chunk.md5, chunk.order); // if ((e as any).response.status === 0) {
401
+ // // TODO https://github.com/sindresorhus/ky/issues/305
402
+ // } else {
403
+ // throw e;
404
+ // }
405
+ };
406
+
407
+ if (!uploadFile.uploadFile) {
408
+ return null;
409
+ }
410
+
411
+ await promiseAllLimit(3, uploadFile.uploadFile.parts.map(p => () => byPart(p)));
412
+ const result = await uploadEnded();
413
+
414
+ if (!result) {
415
+ return null;
416
+ }
417
+
418
+ if (result.__typename === "ErrorAccessDenied") {
419
+ return result;
420
+ }
421
+
422
+ if (result.__typename === "ErrorNotFound") {
423
+ return result;
424
+ }
425
+
426
+ return {
427
+ __typename: "SuccessResponse",
428
+ data: result.data
429
+ };
430
+ }
431
+
432
+ async uploadFileInCloud(_ref5) {
433
+ let {
434
+ file,
435
+ name,
436
+ nodeId,
437
+ encryptProgress,
438
+ uploadProgress,
439
+ signal
440
+ } = _ref5;
441
+ const fileId = await this.uploadFile({
442
+ file,
443
+ encryptProgress,
444
+ uploadProgress,
445
+ signal
446
+ });
447
+
448
+ if (!fileId) {
449
+ return null;
450
+ }
451
+
452
+ if (fileId.__typename === "ErrorAccessDenied") {
453
+ return fileId;
454
+ }
455
+
456
+ if (fileId.__typename === "ErrorLimit") {
457
+ return fileId;
458
+ }
459
+
460
+ if (fileId.__typename === "ErrorNotFound") {
461
+ return fileId;
462
+ }
463
+
464
+ const result = await this.saveInCloud({
465
+ fileId: fileId.data,
466
+ name,
467
+ nodeId
468
+ });
469
+
470
+ if (!result) {
471
+ return null;
472
+ }
473
+
474
+ if (result.__typename === "ErrorAccessDenied") {
475
+ return result;
476
+ }
477
+
478
+ if (result.__typename === "ErrorBasic") {
479
+ return result;
480
+ }
481
+
482
+ if (result.__typename === "ErrorLimit") {
483
+ return result;
484
+ }
485
+
486
+ if (result.__typename === "ErrorNotFound") {
487
+ return result;
488
+ }
489
+
490
+ if (result.__typename === "ErrorNotExist") {
491
+ return result;
492
+ }
493
+
494
+ return {
495
+ __typename: "SuccessResponse",
496
+ data: result.data
497
+ };
498
+ }
499
+
500
+ async deletedNodes() {
501
+ const {
502
+ deletedNodes
503
+ } = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("query")({
504
+ deletedNodes: {
505
+ "...on ErrorAccessDenied": {
506
+ __typename: true,
507
+ message: true
508
+ },
509
+ "...on DeletedNodesResponse": {
510
+ __typename: true,
511
+ deletedNodes: nodeSelector
512
+ }
513
+ }
514
+ });
515
+
516
+ if (!deletedNodes) {
517
+ return null;
518
+ }
519
+
520
+ if (deletedNodes.__typename === "ErrorAccessDenied") {
521
+ return deletedNodes;
522
+ }
523
+
524
+ const nodes = new Array();
525
+
526
+ for (const node of deletedNodes.deletedNodes) {
527
+ nodes.push(await gqlNodeToExternal(node, _classPrivateFieldLooseBase(this, _keys)[_keys]));
528
+ }
529
+
530
+ return {
531
+ __typename: "SuccessResponse",
532
+ data: nodes
533
+ };
534
+ }
535
+
536
+ async sharedNodes() {
537
+ const {
538
+ sharedNodes
539
+ } = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("query")({
540
+ sharedNodes: {
541
+ "...on ErrorAccessDenied": {
542
+ __typename: true,
543
+ message: true
544
+ },
545
+ "...on SharedNodesResponse": {
546
+ __typename: true,
547
+ sharedNodes: nodeSelector
548
+ }
549
+ }
550
+ });
551
+
552
+ if (!sharedNodes) {
553
+ return null;
554
+ }
555
+
556
+ if (sharedNodes.__typename === "ErrorAccessDenied") {
557
+ return sharedNodes;
558
+ }
559
+
560
+ const nodes = new Array();
561
+
562
+ for (const folder of sharedNodes.sharedNodes) {
563
+ nodes.push(await gqlNodeToExternal(folder, _classPrivateFieldLooseBase(this, _keys)[_keys]));
564
+ }
565
+
566
+ return {
567
+ __typename: "SuccessResponse",
568
+ data: nodes
569
+ };
570
+ }
571
+
572
+ async nodesSharedWithMe(type) {
573
+ const {
574
+ nodesSharedWithMe
575
+ } = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("query")({
576
+ nodesSharedWithMe: [{
577
+ type
578
+ }, {
579
+ "...on ErrorAccessDenied": {
580
+ __typename: true,
581
+ message: true
582
+ },
583
+ "...on NodesSharedWithMeResponse": {
584
+ __typename: true,
585
+ nodesSharedWithMe: nodeSelector
586
+ }
587
+ }]
588
+ });
589
+
590
+ if (!nodesSharedWithMe) {
591
+ return null;
592
+ }
593
+
594
+ if (nodesSharedWithMe.__typename === "ErrorAccessDenied") {
595
+ return nodesSharedWithMe;
596
+ }
597
+
598
+ const nodes = new Array();
599
+
600
+ for (const folder of nodesSharedWithMe.nodesSharedWithMe) {
601
+ nodes.push(await gqlNodeToExternal(folder, _classPrivateFieldLooseBase(this, _keys)[_keys]));
602
+ }
603
+
604
+ return {
605
+ __typename: "SuccessResponse",
606
+ data: nodes
607
+ };
608
+ }
609
+
610
+ async deleteNodeSharing(_ref6) {
611
+ let {
612
+ nodeId,
613
+ userId
614
+ } = _ref6;
615
+ const {
616
+ deleteNodeSharing
617
+ } = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("mutation")({
618
+ deleteNodeSharing: [{
619
+ nodeId,
620
+ userId
621
+ }, {
622
+ "...on ErrorAccessDenied": {
623
+ __typename: true,
624
+ message: true
625
+ },
626
+ "...on DeleteNodeSharingResponse": {
627
+ __typename: true,
628
+ deleteNodeSharing: true
629
+ }
630
+ }]
631
+ });
632
+
633
+ if (!deleteNodeSharing) {
634
+ return null;
635
+ }
636
+
637
+ if (deleteNodeSharing.__typename === "ErrorAccessDenied") {
638
+ return deleteNodeSharing;
639
+ }
640
+
641
+ return {
642
+ __typename: "SuccessResponse",
643
+ data: deleteNodeSharing.deleteNodeSharing
644
+ };
645
+ }
646
+
647
+ async duplicateNode(_ref7) {
648
+ var _node$access2;
649
+
650
+ let {
651
+ nodeId,
652
+ folderId,
653
+ customName
654
+ } = _ref7;
655
+ let node = nodesCache.get(nodeId);
656
+
657
+ if (!node) {
658
+ await this.node({
659
+ id: nodeId
660
+ });
661
+ node = nodesCache.get(nodeId);
662
+
663
+ if (!node) {
664
+ throw new Error(`Node (${nodeId}) does not exists`);
665
+ }
666
+ }
667
+
668
+ if (!((_node$access2 = node.access) != null && _node$access2.nameKey)) {
669
+ throw new Error(`Can't have access to node ${nodeId}`);
670
+ }
671
+
672
+ customName = customName ? await encryptName(customName, node.access.nameKey) : null;
673
+ const {
674
+ duplicateNode
675
+ } = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("mutation")({
676
+ duplicateNode: [{
677
+ nodeId,
678
+ folderId,
679
+ customName
680
+ }, {
681
+ "...on ErrorAccessDenied": {
682
+ __typename: true,
683
+ message: true
684
+ },
685
+ "...on ErrorNotFound": {
686
+ __typename: true,
687
+ message: true
688
+ },
689
+ "...on DuplicateNodeResponse": {
690
+ __typename: true,
691
+ duplicateNode: true
692
+ }
693
+ }]
694
+ });
695
+
696
+ if (!duplicateNode) {
697
+ return null;
698
+ }
699
+
700
+ if (duplicateNode.__typename === "ErrorAccessDenied") {
701
+ return duplicateNode;
702
+ }
703
+
704
+ if (duplicateNode.__typename === "ErrorNotFound") {
705
+ return duplicateNode;
706
+ }
707
+
708
+ return {
709
+ __typename: "SuccessResponse",
710
+ data: duplicateNode.duplicateNode
711
+ };
712
+ }
713
+
714
+ async deleteNodeCloudTrash(_ref8) {
715
+ let {
716
+ ids
717
+ } = _ref8;
718
+ const {
719
+ deleteNodeCloudTrash
720
+ } = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("mutation")({
721
+ deleteNodeCloudTrash: [{
722
+ ids
723
+ }, {
724
+ "...on ErrorAccessDenied": {
725
+ __typename: true,
726
+ message: true
727
+ },
728
+ "...on DeleteNodeCloudTrashResponse": {
729
+ __typename: true,
730
+ deleteNodeCloudTrash: true
731
+ }
732
+ }]
733
+ });
734
+
735
+ if (!deleteNodeCloudTrash) {
736
+ return null;
737
+ }
738
+
739
+ if (deleteNodeCloudTrash.__typename === "ErrorAccessDenied") {
740
+ return deleteNodeCloudTrash;
741
+ }
742
+
743
+ return {
744
+ __typename: "SuccessResponse",
745
+ data: deleteNodeCloudTrash.deleteNodeCloudTrash ?? false
746
+ };
747
+ }
748
+
749
+ async createFolder(_ref9) {
750
+ var _folder$parent, _folder$parent$users;
751
+
752
+ let {
753
+ name,
754
+ parentFolderId
755
+ } = _ref9;
756
+ const key = secretstreamKeygen();
757
+ const encryptedName = await encryptName(name, sodium.to_hex(key));
758
+ const encryptedKey = encryptCryptoBox(key, _classPrivateFieldLooseBase(this, _keys)[_keys].publicKey, _classPrivateFieldLooseBase(this, _keys)[_keys].privateKey);
759
+ const {
760
+ createFolder
761
+ } = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("mutation")({
762
+ createFolder: [{
763
+ name: encryptedName,
764
+ parentFolderId,
765
+ key: sodium.to_hex(encryptedKey)
766
+ }, {
767
+ "...on ErrorAccessDenied": {
768
+ __typename: true,
769
+ message: true
770
+ },
771
+ "...on ErrorNotExist": {
772
+ __typename: true,
773
+ message: true
774
+ },
775
+ "...on CreateFolderResponse": {
776
+ __typename: true,
777
+ createFolder: nodeFullSelector
778
+ }
779
+ }]
780
+ });
781
+
782
+ if (!createFolder) {
783
+ //throw new Error(`Can't create folder`);
784
+ return null;
785
+ }
786
+
787
+ if (createFolder.__typename === "ErrorAccessDenied") {
788
+ return createFolder;
789
+ }
790
+
791
+ if (createFolder.__typename === "ErrorNotExist") {
792
+ return createFolder;
793
+ }
794
+
795
+ if (!createFolder.createFolder) {
796
+ return null;
797
+ }
798
+
799
+ const folder = await gqlNodeToExternalNodeFull(createFolder.createFolder, _classPrivateFieldLooseBase(this, _keys)[_keys]);
800
+ const users = ((_folder$parent = folder.parent) == null ? void 0 : (_folder$parent$users = _folder$parent.users) == null ? void 0 : _folder$parent$users.filter(_ref10 => {
801
+ let [u] = _ref10;
802
+ return u.publicKey !== _classPrivateFieldLooseBase(this, _keys)[_keys].publicKey;
803
+ })) ?? [];
804
+
805
+ if (users.length) {
806
+ await Promise.all(users.map(_ref11 => {
807
+ let [u, rights] = _ref11;
808
+ return this.shareNode({
809
+ nodeId: folder.id,
810
+ rights,
811
+ userId: u.id
812
+ });
813
+ }));
814
+ }
815
+
816
+ return {
817
+ __typename: "SuccessResponse",
818
+ data: folder
819
+ };
820
+ }
821
+
822
+ async node(_temp) {
823
+ let {
824
+ id,
825
+ deleted
826
+ } = _temp === void 0 ? {} : _temp;
827
+ const {
828
+ node
829
+ } = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("query")({
830
+ node: [{
831
+ deleted,
832
+ id
833
+ }, {
834
+ "...on ErrorAccessDenied": {
835
+ __typename: true,
836
+ message: true
837
+ },
838
+ "...on NodeResponse": {
839
+ __typename: true,
840
+ node: nodeFullSelector
841
+ }
842
+ }]
843
+ });
844
+
845
+ if (!node) {
846
+ return null;
847
+ }
848
+
849
+ if (node.__typename === "ErrorAccessDenied") {
850
+ return node;
851
+ }
852
+
853
+ if (!node.node) {
854
+ return null;
855
+ }
856
+
857
+ const result = await gqlNodeToExternalNodeFull(node.node, _classPrivateFieldLooseBase(this, _keys)[_keys]);
858
+ return {
859
+ __typename: "SuccessResponse",
860
+ data: result
861
+ };
862
+ }
863
+
864
+ async fileMetadata(_ref12) {
865
+ let {
866
+ id
867
+ } = _ref12;
868
+ const {
869
+ file
870
+ } = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("query")({
871
+ file: [{
872
+ id
873
+ }, {
874
+ "...on ErrorAccessDenied": {
875
+ __typename: true,
876
+ message: true
877
+ },
878
+ "...on FileQueryResponse": {
879
+ __typename: true,
880
+ file: fileSelector
881
+ }
882
+ }]
883
+ });
884
+
885
+ if (!file) {
886
+ return null;
887
+ }
888
+
889
+ if (file.__typename === "ErrorAccessDenied") {
890
+ return file;
891
+ }
892
+
893
+ if (!file.file) {
894
+ return null;
895
+ }
896
+
897
+ const result = gqlFileToExternal(file.file, _classPrivateFieldLooseBase(this, _keys)[_keys]);
898
+ return {
899
+ __typename: "SuccessResponse",
900
+ data: result
901
+ };
902
+ }
903
+
904
+ async shareNode(_ref13) {
905
+ let {
906
+ nodeId,
907
+ userId,
908
+ rights
909
+ } = _ref13;
910
+ const user = await _classPrivateFieldLooseBase(this, _client)[_client].user({
911
+ userId,
912
+ withPublicKey: true
913
+ });
914
+
915
+ if (!user) {
916
+ return user;
917
+ }
918
+
919
+ if (user.__typename === "ErrorNotFound") {
920
+ return user;
921
+ }
922
+
923
+ const {
924
+ shareNode
925
+ } = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("mutation")({
926
+ shareNode: [{
927
+ nodeId,
928
+ userId
929
+ }, {
930
+ "...on ErrorAccessDenied": {
931
+ __typename: true,
932
+ message: true
933
+ },
934
+ "...on ErrorNotFound": {
935
+ __typename: true,
936
+ message: true
937
+ },
938
+ "...on ShareNodeResponse": {
939
+ __typename: true,
940
+ nodes: true
941
+ }
942
+ }]
943
+ });
944
+
945
+ if (!shareNode) {
946
+ return null;
947
+ }
948
+
949
+ if (shareNode.__typename === "ErrorAccessDenied") {
950
+ return shareNode;
951
+ }
952
+
953
+ if (shareNode.__typename === "ErrorNotFound") {
954
+ return shareNode;
955
+ }
956
+
957
+ const shareNodes = {
958
+ nodes: []
959
+ };
960
+
961
+ for (const id of shareNode.nodes) {
962
+ const nameKey = await this.perNode(id, user.data.publicKey);
963
+
964
+ if (nameKey) {
965
+ shareNodes.nodes.push(nameKey);
966
+ }
967
+ }
968
+
969
+ const {
970
+ shareNodeFinish
971
+ } = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("mutation")({
972
+ shareNodeFinish: [{
973
+ rights,
974
+ userId,
975
+ shareNodes
976
+ }, {
977
+ "...on ErrorAccessDenied": {
978
+ __typename: true,
979
+ message: true
980
+ },
981
+ "...on ErrorNotFound": {
982
+ __typename: true,
983
+ message: true
984
+ },
985
+ "...on ShareNodeFinishResponse": {
986
+ __typename: true,
987
+ shareNodeFinish: true
988
+ }
989
+ }]
990
+ });
991
+
992
+ if (!shareNodeFinish) {
993
+ return null;
994
+ }
995
+
996
+ if (shareNodeFinish.__typename === "ErrorAccessDenied") {
997
+ return shareNodeFinish;
998
+ }
999
+
1000
+ if (shareNodeFinish.__typename === "ErrorNotFound") {
1001
+ return shareNodeFinish;
1002
+ }
1003
+
1004
+ return {
1005
+ __typename: "SuccessResponse",
1006
+ data: shareNodeFinish.shareNodeFinish ?? false
1007
+ };
1008
+ }
1009
+
1010
+ async updateNode(_ref14) {
1011
+ var _node$access3, _node$access4;
1012
+
1013
+ let {
1014
+ nodeId,
1015
+ name,
1016
+ isFavorite,
1017
+ deletedAt
1018
+ } = _ref14;
1019
+ let node = nodesCache.get(nodeId);
1020
+
1021
+ if (!node) {
1022
+ await this.node({
1023
+ id: nodeId
1024
+ });
1025
+ node = nodesCache.get(nodeId);
1026
+
1027
+ if (!node) {
1028
+ throw `Can't find Node ${nodeId}`;
1029
+ }
1030
+ }
1031
+
1032
+ if (!((_node$access3 = node.access) != null && _node$access3.nameKey)) {
1033
+ throw new Error(`Can't have access to node ${nodeId}`);
1034
+ }
1035
+
1036
+ name = name ? (_node$access4 = node.access) != null && _node$access4.nameKey ? await encryptName(name, node.access.nameKey) : name : null;
1037
+ const {
1038
+ updateNode
1039
+ } = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("mutation")({
1040
+ updateNode: [{
1041
+ nodeId,
1042
+ name,
1043
+ isFavorite,
1044
+ deletedAt
1045
+ }, {
1046
+ "...on ErrorAccessDenied": {
1047
+ __typename: true,
1048
+ message: true
1049
+ },
1050
+ "...on ErrorNotExist": {
1051
+ __typename: true,
1052
+ message: true
1053
+ },
1054
+ "...on UpdateNodeResponse": {
1055
+ __typename: true,
1056
+ updateNode: nodeFullSelector
1057
+ }
1058
+ }]
1059
+ });
1060
+
1061
+ if (!updateNode) {
1062
+ return null;
1063
+ }
1064
+
1065
+ if (updateNode.__typename === "ErrorAccessDenied") {
1066
+ return updateNode;
1067
+ }
1068
+
1069
+ if (updateNode.__typename === "ErrorNotExist") {
1070
+ return updateNode;
1071
+ }
1072
+
1073
+ if (!updateNode.updateNode) {
1074
+ return null;
1075
+ }
1076
+
1077
+ const result = await gqlNodeToExternalNodeFull(updateNode.updateNode, _classPrivateFieldLooseBase(this, _keys)[_keys]);
1078
+ return {
1079
+ __typename: "SuccessResponse",
1080
+ data: result
1081
+ };
1082
+ }
1083
+
1084
+ async fileContent(_ref15) {
1085
+ let {
1086
+ fileId,
1087
+ onDownloadProgress,
1088
+ progressDecrypt,
1089
+ signal
1090
+ } = _ref15;
1091
+ const {
1092
+ fileContent
1093
+ } = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("query", {
1094
+ scalars: {
1095
+ Bytes: {
1096
+ decode: e => {
1097
+ console.log(e, typeof e);
1098
+ return Uint8Array.from([1, 2, 3]);
1099
+ },
1100
+ encode: e => e.toString()
1101
+ }
1102
+ }
1103
+ })({
1104
+ fileContent: [{
1105
+ fileId
1106
+ }, {
1107
+ "...on ErrorAccessDenied": {
1108
+ __typename: true,
1109
+ message: true
1110
+ },
1111
+ "...on ErrorBasic": {
1112
+ __typename: true,
1113
+ message: true
1114
+ },
1115
+ "...on FileContentResponse": {
1116
+ __typename: true,
1117
+ file: {
1118
+ "...on FileContentCloud": {
1119
+ __typename: true,
1120
+ parts: {
1121
+ contentUrl: true,
1122
+ order: true,
1123
+ md5: true
1124
+ },
1125
+ key: true,
1126
+ publicKey: true,
1127
+ totalSize: true,
1128
+ md5: true,
1129
+ md5Encrypted: true
1130
+ },
1131
+ "...on FileContentLite": {
1132
+ __typename: true,
1133
+ content: true,
1134
+ id: true,
1135
+ key: true,
1136
+ publicKey: true,
1137
+ md5: true,
1138
+ md5Encrypted: true,
1139
+ totalSize: true
1140
+ },
1141
+ "...on FileContentReceivedMail": {
1142
+ __typename: true,
1143
+ maybeParts: {
1144
+ contentUrl: true,
1145
+ order: true,
1146
+ md5: true
1147
+ },
1148
+ maybeContent: true,
1149
+ key: true,
1150
+ senderPublicKey: true,
1151
+ totalSize: true,
1152
+ md5: true,
1153
+ md5Encrypted: true
1154
+ },
1155
+ "...on FileContentSentMail": {
1156
+ __typename: true,
1157
+ maybeParts: {
1158
+ contentUrl: true,
1159
+ order: true,
1160
+ md5: true
1161
+ },
1162
+ maybeContent: true,
1163
+ key: true,
1164
+ totalSize: true,
1165
+ md5: true,
1166
+ md5Encrypted: true
1167
+ }
1168
+ }
1169
+ }
1170
+ }]
1171
+ });
1172
+
1173
+ if (!fileContent) {
1174
+ return null;
1175
+ }
1176
+
1177
+ if (fileContent.__typename === "ErrorAccessDenied") {
1178
+ return fileContent;
1179
+ }
1180
+
1181
+ if (fileContent.__typename === "ErrorBasic") {
1182
+ return fileContent;
1183
+ }
1184
+
1185
+ const file = fileContent.file;
1186
+
1187
+ if (!file) {
1188
+ return null;
1189
+ }
1190
+
1191
+ const progressParts = {};
1192
+
1193
+ const onProgress = (part, progressEvent) => {
1194
+ progressParts[part] = progressEvent;
1195
+ const transferredBytes = Object.values(progressParts).reduce((prv, cur) => prv + cur.transferredBytes, 0);
1196
+ const totalBytes = Number(file.totalSize);
1197
+ onDownloadProgress == null ? void 0 : onDownloadProgress({
1198
+ percent: transferredBytes / totalBytes,
1199
+ totalBytes,
1200
+ transferredBytes
1201
+ });
1202
+ };
1203
+
1204
+ const encryptedContentFromParts = async fileParts => {
1205
+ const parts = new Array();
1206
+
1207
+ const byPart = async part => {
1208
+ const buf = new Uint8Array(await ky.get(part.contentUrl, {
1209
+ timeout: false,
1210
+ onDownloadProgress: pr => onProgress(part.order, pr),
1211
+ signal: signal
1212
+ }).arrayBuffer());
1213
+ const md5Part = await md5(buf);
1214
+
1215
+ if (md5Part !== part.md5) {
1216
+ throw new Error(`Invalid md5 for part ${part.order} of file ${fileId}`);
1217
+ }
1218
+
1219
+ parts.push({
1220
+ data: buf,
1221
+ order: part.order
1222
+ });
1223
+ };
1224
+
1225
+ await promiseAllLimit(3, fileParts.map(p => () => byPart(p)));
1226
+ return concatenate(...parts.sort((a, b) => a.order - b.order).map(p => p.data));
1227
+ };
1228
+
1229
+ const finalize = async encryptedContent => {
1230
+ // const md5Encrypted = await firstValueFrom(md5(of(encryptedContent)));
1231
+ const md5Encrypted = await md5(encryptedContent);
1232
+
1233
+ if (md5Encrypted !== file.md5Encrypted) {
1234
+ throw new Error(`Encrypted content does not match`);
1235
+ }
1236
+
1237
+ const key = decryptCryptoBox(sodium.from_hex(file.key), file.__typename === "FileContentReceivedMail" ? file.senderPublicKey : file.__typename === "FileContentCloud" ? file.publicKey : _classPrivateFieldLooseBase(this, _keys)[_keys].publicKey, _classPrivateFieldLooseBase(this, _keys)[_keys].privateKey);
1238
+ const src = await decrypt(key, encryptedContent, progressDecrypt, signal); // const md5Content = await firstValueFrom(md5(of(src)));
1239
+
1240
+ const md5Content = await md5(src);
1241
+
1242
+ if (md5Content !== file.md5) {
1243
+ throw new Error(`Content does not match`);
1244
+ }
1245
+
1246
+ return uncompress(src);
1247
+ };
1248
+
1249
+ const encryptedContent = file.__typename === "FileContentLite" ? file.content : file.__typename === "FileContentCloud" ? await encryptedContentFromParts(file.parts) : file.maybeContent ? file.maybeContent : file.maybeParts ? await encryptedContentFromParts(file.maybeParts) : null;
1250
+
1251
+ if (!encryptedContent) {
1252
+ return null;
1253
+ }
1254
+
1255
+ return {
1256
+ __typename: "SuccessResponse",
1257
+ data: await finalize(encryptedContent)
1258
+ };
1259
+ }
1260
+
1261
+ async deleteFile(_ref16) {
1262
+ let {
1263
+ fileId,
1264
+ nodeId
1265
+ } = _ref16;
1266
+ const {
1267
+ deleteFile
1268
+ } = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("mutation")({
1269
+ deleteFile: [{
1270
+ fileId,
1271
+ nodeId
1272
+ }, {
1273
+ "...on ErrorAccessDenied": {
1274
+ __typename: true,
1275
+ message: true
1276
+ },
1277
+ "...on ErrorNotExist": {
1278
+ __typename: true,
1279
+ message: true
1280
+ },
1281
+ "...on DeleteFileResponse": {
1282
+ __typename: true,
1283
+ deleteFile: true
1284
+ }
1285
+ }]
1286
+ });
1287
+
1288
+ if (!deleteFile) {
1289
+ return null;
1290
+ }
1291
+
1292
+ if (deleteFile.__typename === "ErrorAccessDenied") {
1293
+ return deleteFile;
1294
+ }
1295
+
1296
+ if (deleteFile.__typename === "ErrorNotExist") {
1297
+ return deleteFile;
1298
+ }
1299
+
1300
+ return {
1301
+ __typename: "SuccessResponse",
1302
+ data: deleteFile.deleteFile
1303
+ };
1304
+ }
1305
+
1306
+ async deleteNode(_ref17) {
1307
+ let {
1308
+ nodeId
1309
+ } = _ref17;
1310
+ const {
1311
+ deleteNode
1312
+ } = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("mutation")({
1313
+ deleteNode: [{
1314
+ id: nodeId
1315
+ }, {
1316
+ "...on ErrorAccessDenied": {
1317
+ __typename: true,
1318
+ message: true
1319
+ },
1320
+ "...on DeleteNodeResponse": {
1321
+ __typename: true,
1322
+ deleteNode: true
1323
+ }
1324
+ }]
1325
+ });
1326
+
1327
+ if (!deleteNode) {
1328
+ return null;
1329
+ }
1330
+
1331
+ if (deleteNode.__typename === "ErrorAccessDenied") {
1332
+ return deleteNode;
1333
+ }
1334
+
1335
+ return {
1336
+ __typename: "SuccessResponse",
1337
+ data: deleteNode.deleteNode
1338
+ };
1339
+ }
1340
+
1341
+ async emptyTrash() {
1342
+ const {
1343
+ emptyCloudTrash
1344
+ } = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("mutation")({
1345
+ emptyCloudTrash: {
1346
+ "...on ErrorAccessDenied": {
1347
+ __typename: true,
1348
+ message: true
1349
+ },
1350
+ "...on EmptyCloudTrashResponse": {
1351
+ __typename: true,
1352
+ emptyCloudTrash: true
1353
+ }
1354
+ }
1355
+ });
1356
+
1357
+ if (!emptyCloudTrash) {
1358
+ return null;
1359
+ }
1360
+
1361
+ if (emptyCloudTrash.__typename === "ErrorAccessDenied") {
1362
+ return emptyCloudTrash;
1363
+ }
1364
+
1365
+ if (!emptyCloudTrash.emptyCloudTrash) {
1366
+ return null;
1367
+ }
1368
+
1369
+ return {
1370
+ __typename: "SuccessResponse",
1371
+ data: emptyCloudTrash.emptyCloudTrash
1372
+ };
1373
+ }
1374
+
1375
+ async recoverNode(id) {
1376
+ const {
1377
+ recoverNode
1378
+ } = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("mutation")({
1379
+ recoverNode: [{
1380
+ id
1381
+ }, {
1382
+ "...on ErrorAccessDenied": {
1383
+ __typename: true,
1384
+ message: true
1385
+ },
1386
+ "...on ErrorNotExist": {
1387
+ __typename: true,
1388
+ message: true
1389
+ },
1390
+ "...on RecoverNodeResponse": {
1391
+ __typename: true,
1392
+ recoverNode: true
1393
+ }
1394
+ }]
1395
+ });
1396
+
1397
+ if (!recoverNode) {
1398
+ return null;
1399
+ }
1400
+
1401
+ if (recoverNode.__typename === "ErrorAccessDenied") {
1402
+ return recoverNode;
1403
+ }
1404
+
1405
+ if (recoverNode.__typename === "ErrorNotExist") {
1406
+ return recoverNode;
1407
+ }
1408
+
1409
+ return {
1410
+ __typename: "SuccessResponse",
1411
+ data: recoverNode.recoverNode ?? false
1412
+ };
1413
+ }
1414
+
1415
+ async moveNodes(_ref18) {
1416
+ let {
1417
+ nodeIds,
1418
+ parentNodeId
1419
+ } = _ref18;
1420
+ const {
1421
+ moveNodes
1422
+ } = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("mutation")({
1423
+ moveNodes: [{
1424
+ nodeIds,
1425
+ parentNodeId
1426
+ }, {
1427
+ "...on ErrorAccessDenied": {
1428
+ __typename: true,
1429
+ message: true
1430
+ },
1431
+ "...on MoveNodesResponse": {
1432
+ __typename: true,
1433
+ moveNodes: true
1434
+ }
1435
+ }]
1436
+ });
1437
+
1438
+ if (!moveNodes) {
1439
+ return null;
1440
+ }
1441
+
1442
+ if (moveNodes.__typename === "ErrorAccessDenied") {
1443
+ return moveNodes;
1444
+ }
1445
+
1446
+ return {
1447
+ __typename: "SuccessResponse",
1448
+ data: moveNodes.moveNodes ?? false
1449
+ };
1450
+ }
1451
+
1452
+ async saveInCloud(_ref19) {
1453
+ var _node$parent;
1454
+
1455
+ let {
1456
+ fileId,
1457
+ name,
1458
+ nodeId
1459
+ } = _ref19;
1460
+
1461
+ if (nodeId && !nodesCache.has(nodeId)) {
1462
+ await this.node({
1463
+ id: nodeId
1464
+ });
1465
+
1466
+ if (!nodesCache.has(nodeId)) {
1467
+ return {
1468
+ __typename: "ErrorBasic",
1469
+ message: `The node ${nodeId} does not exists`
1470
+ };
1471
+ }
1472
+ }
1473
+
1474
+ let key = "";
1475
+ const file = filesCache.get(fileId);
1476
+
1477
+ if (!file) {
1478
+ await this.fileMetadata({
1479
+ id: fileId
1480
+ });
1481
+ const file = filesCache.get(fileId) ?? null;
1482
+
1483
+ if (!file) {
1484
+ const receivedMails = await _classPrivateFieldLooseBase(this, _client)[_client].mail.receivedMails();
1485
+
1486
+ if (!receivedMails) {
1487
+ return null;
1488
+ }
1489
+
1490
+ if (receivedMails.__typename !== "SuccessResponse") {
1491
+ return null;
1492
+ }
1493
+
1494
+ const mail = receivedMails.data.find(m => m.files.some(f => f.id === fileId));
1495
+
1496
+ if (!mail) {
1497
+ return {
1498
+ __typename: "ErrorBasic",
1499
+ message: `Can't find mail with the file ${fileId}`
1500
+ };
1501
+ }
1502
+
1503
+ const fileMail = mail.files.find(f => f.id === fileId);
1504
+
1505
+ if (!fileMail) {
1506
+ return {
1507
+ __typename: "ErrorBasic",
1508
+ message: `Can't find mail with the file ${fileId}`
1509
+ };
1510
+ }
1511
+
1512
+ const fileKey = decryptCryptoBox(sodium.from_hex(fileMail.key), mail.sender.publicKey, _classPrivateFieldLooseBase(this, _keys)[_keys].privateKey);
1513
+ key = sodium.to_hex(fileKey);
1514
+ } else {
1515
+ key = file.key;
1516
+ }
1517
+ } else {
1518
+ key = file.key;
1519
+ }
1520
+
1521
+ if (key === "") {
1522
+ return {
1523
+ __typename: "ErrorBasic",
1524
+ message: "Unexpected error 3"
1525
+ };
1526
+ }
1527
+
1528
+ key = sodium.to_hex(encryptCryptoBox(sodium.from_hex(key), _classPrivateFieldLooseBase(this, _keys)[_keys].publicKey, _classPrivateFieldLooseBase(this, _keys)[_keys].privateKey));
1529
+ const nameKey = secretstreamKeygen();
1530
+ const encryptedName = await encryptName(name, sodium.to_hex(nameKey));
1531
+ const encryptedNameKey = sodium.to_hex(encryptCryptoBox(nameKey, _classPrivateFieldLooseBase(this, _keys)[_keys].publicKey, _classPrivateFieldLooseBase(this, _keys)[_keys].privateKey));
1532
+ const {
1533
+ saveInCloud
1534
+ } = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("mutation")({
1535
+ saveInCloud: [{
1536
+ fileId,
1537
+ key,
1538
+ nodeId,
1539
+ filename: encryptedName,
1540
+ nameKey: encryptedNameKey
1541
+ }, {
1542
+ "...on ErrorAccessDenied": {
1543
+ __typename: true,
1544
+ message: true
1545
+ },
1546
+ "...on ErrorNotFound": {
1547
+ __typename: true,
1548
+ message: true
1549
+ },
1550
+ "...on ErrorLimit": {
1551
+ __typename: true,
1552
+ message: true
1553
+ },
1554
+ "...on ErrorBasic": {
1555
+ __typename: true,
1556
+ message: true
1557
+ },
1558
+ "...on ErrorNotExist": {
1559
+ __typename: true,
1560
+ message: true
1561
+ },
1562
+ "...on SaveInCloudResponse": {
1563
+ __typename: true,
1564
+ saveInCloud: nodeFullSelector
1565
+ }
1566
+ }]
1567
+ });
1568
+
1569
+ if (!saveInCloud) {
1570
+ return null;
1571
+ }
1572
+
1573
+ if (saveInCloud.__typename === "ErrorAccessDenied") {
1574
+ return saveInCloud;
1575
+ }
1576
+
1577
+ if (saveInCloud.__typename === "ErrorNotFound") {
1578
+ return saveInCloud;
1579
+ }
1580
+
1581
+ if (saveInCloud.__typename === "ErrorLimit") {
1582
+ return saveInCloud;
1583
+ }
1584
+
1585
+ if (saveInCloud.__typename === "ErrorBasic") {
1586
+ return saveInCloud;
1587
+ }
1588
+
1589
+ if (saveInCloud.__typename === "ErrorNotExist") {
1590
+ return saveInCloud;
1591
+ }
1592
+
1593
+ if (!saveInCloud.saveInCloud) {
1594
+ return null;
1595
+ }
1596
+
1597
+ const node = await gqlNodeToExternalNodeFull(saveInCloud.saveInCloud, _classPrivateFieldLooseBase(this, _keys)[_keys]);
1598
+ const me = (_node$parent = node.parent) == null ? void 0 : _node$parent.users.find(_ref20 => {
1599
+ let [u] = _ref20;
1600
+ return u.publicKey === _classPrivateFieldLooseBase(this, _keys)[_keys].publicKey;
1601
+ });
1602
+
1603
+ if (me && ["admin", "write"].includes(me[1])) {
1604
+ var _node$parent2;
1605
+
1606
+ const others = ((_node$parent2 = node.parent) == null ? void 0 : _node$parent2.users.filter(_ref21 => {
1607
+ let [u] = _ref21;
1608
+ return u.publicKey !== _classPrivateFieldLooseBase(this, _keys)[_keys].publicKey;
1609
+ })) ?? [];
1610
+ await Promise.all(others.map(_ref22 => {
1611
+ let [u, rights] = _ref22;
1612
+ return this.shareNode({
1613
+ nodeId: node.id,
1614
+ rights,
1615
+ userId: u.id
1616
+ });
1617
+ }));
1618
+ }
1619
+
1620
+ return {
1621
+ __typename: "SuccessResponse",
1622
+ data: node
1623
+ };
1624
+ }
1625
+
1626
+ }
1627
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJheGlvcyIsImt5IiwiZW5jcnlwdE5hbWUiLCJub2Rlc0NhY2hlIiwiZmlsZXNDYWNoZSIsInNlY3JldHN0cmVhbUtleWdlbiIsImRlY3J5cHRDcnlwdG9Cb3giLCJlbmNyeXB0Q3J5cHRvQm94IiwiY29tcHJlc3MiLCJ1bmNvbXByZXNzIiwic29kaXVtIiwiZW51bWVyYXRlIiwiY2h1bmtzIiwicHJvbWlzZUFsbExpbWl0IiwiY29uY2F0ZW5hdGUiLCJtZDUiLCJkZWNyeXB0IiwiZW5jcnlwdCIsImdxbEZpbGVUb0V4dGVybmFsIiwiZ3FsTm9kZUZ1bGxUb0ludGVybmFsRnVsbCIsImdxbE5vZGVUb0V4dGVybmFsIiwiZ3FsTm9kZVRvRXh0ZXJuYWxOb2RlRnVsbCIsImludGVybmFsTm9kZVRvTm9kZSIsImZpbGVTZWxlY3RvciIsIm5vZGVGdWxsU2VsZWN0b3IiLCJub2RlU2VsZWN0b3IiLCJTZWNyZWN5Q2xvdWRDbGllbnQiLCJjb25zdHJ1Y3RvciIsImNsaWVudCIsImtleXMiLCJ0aHVuZGVyIiwicGVyTm9kZSIsIm5vZGVJZCIsInB1YmxpY0tleSIsIm5vZGUiLCJnZXQiLCJpZCIsIm5hbWVLZXkiLCJhY2Nlc3MiLCJ0b19oZXgiLCJmcm9tX2hleCIsInByaXZhdGVLZXkiLCJmaWxlcyIsImhpc3RvcnkiLCJtYXAiLCJmIiwia2V5IiwiYWRkRmlsZVRvSGlzdG9yeSIsImZpbGVJZCIsIl9fdHlwZW5hbWUiLCJtZXNzYWdlIiwiZmlsZSIsImZpbmQiLCJ1c2VycyIsImZpbHRlciIsInUiLCJpbnB1dCIsInNoYXJlRmlsZUluSGlzdG9yeSIsInJlc3VsdCIsImRhdGEiLCJ1cGxvYWRGaWxlIiwiZW5jcnlwdFByb2dyZXNzIiwidXBsb2FkUHJvZ3Jlc3MiLCJzaWduYWwiLCJmaWxlS2V5IiwiZmlsZUJ1ZmZlciIsIkZpbGUiLCJVaW50OEFycmF5IiwiYXJyYXlCdWZmZXIiLCJjb21wcmVzc2VkIiwiZW5jcnlwdGVkRmlsZSIsIm1kNUZpbGUiLCJtZDVFbmNyeXB0ZWQiLCJlbmNyeXB0ZWRGaWxlS2V5Iiwic2NhbGFycyIsIkpzb24iLCJlbmNvZGUiLCJlIiwiSlNPTiIsInN0cmluZ2lmeSIsImRlY29kZSIsInBhcnNlIiwiRGF0ZVRpbWUiLCJEYXRlIiwidG9JU09TdHJpbmciLCJCaWdJbnQiLCJ0b1N0cmluZyIsImZpbGVTaXplIiwiYnl0ZUxlbmd0aCIsImZpbGVTaXplQmVmb3JlIiwiZmlsZVBhcnRTaXplIiwicGFydHMiLCJmaWVsZHMiLCJvcmRlciIsInVybCIsInRvdGFsIiwiY3VycmVudCIsInBlcmNlbnQiLCJsZW5ndGgiLCJ1cGxvYWRQYXJ0RW5kZWQiLCJ1cGxvYWRGaWxlUGFydEVuZCIsInVwbG9hZEVuZGVkIiwidXBsb2FkRmlsZUVuZCIsImNodW5rUGFydHMiLCJBcnJheSIsImluZGV4IiwiY2h1bmsiLCJOdW1iZXIiLCJwdXNoIiwicHJvZ3Jlc3NQYXJ0cyIsIm9uUHJvZ3Jlc3MiLCJwYXJ0IiwicHJvZ3Jlc3NFdmVudCIsIk9iamVjdCIsInZhbHVlcyIsInJlZHVjZSIsInBydiIsImN1ciIsImxvYWRlZCIsImJ5UGFydCIsImZvcm1EYXRhIiwiRm9ybURhdGEiLCJwIiwidmFsdWUiLCJlbnRyaWVzIiwiYXBwZW5kIiwiQmxvYiIsInBvc3QiLCJvblVwbG9hZFByb2dyZXNzIiwidXBsb2FkRmlsZUluQ2xvdWQiLCJuYW1lIiwic2F2ZUluQ2xvdWQiLCJkZWxldGVkTm9kZXMiLCJub2RlcyIsInNoYXJlZE5vZGVzIiwiZm9sZGVyIiwibm9kZXNTaGFyZWRXaXRoTWUiLCJ0eXBlIiwiZGVsZXRlTm9kZVNoYXJpbmciLCJ1c2VySWQiLCJkdXBsaWNhdGVOb2RlIiwiZm9sZGVySWQiLCJjdXN0b21OYW1lIiwiRXJyb3IiLCJkZWxldGVOb2RlQ2xvdWRUcmFzaCIsImlkcyIsImNyZWF0ZUZvbGRlciIsInBhcmVudEZvbGRlcklkIiwiZW5jcnlwdGVkTmFtZSIsImVuY3J5cHRlZEtleSIsInBhcmVudCIsIlByb21pc2UiLCJhbGwiLCJyaWdodHMiLCJzaGFyZU5vZGUiLCJkZWxldGVkIiwiZmlsZU1ldGFkYXRhIiwidXNlciIsIndpdGhQdWJsaWNLZXkiLCJzaGFyZU5vZGVzIiwic2hhcmVOb2RlRmluaXNoIiwidXBkYXRlTm9kZSIsImlzRmF2b3JpdGUiLCJkZWxldGVkQXQiLCJmaWxlQ29udGVudCIsIm9uRG93bmxvYWRQcm9ncmVzcyIsInByb2dyZXNzRGVjcnlwdCIsIkJ5dGVzIiwiY29uc29sZSIsImxvZyIsImZyb20iLCJjb250ZW50VXJsIiwidG90YWxTaXplIiwiY29udGVudCIsIm1heWJlUGFydHMiLCJtYXliZUNvbnRlbnQiLCJzZW5kZXJQdWJsaWNLZXkiLCJ0cmFuc2ZlcnJlZEJ5dGVzIiwidG90YWxCeXRlcyIsImVuY3J5cHRlZENvbnRlbnRGcm9tUGFydHMiLCJmaWxlUGFydHMiLCJidWYiLCJ0aW1lb3V0IiwicHIiLCJtZDVQYXJ0Iiwic29ydCIsImEiLCJiIiwiZmluYWxpemUiLCJlbmNyeXB0ZWRDb250ZW50Iiwic3JjIiwibWQ1Q29udGVudCIsImRlbGV0ZUZpbGUiLCJkZWxldGVOb2RlIiwiZW1wdHlUcmFzaCIsImVtcHR5Q2xvdWRUcmFzaCIsInJlY292ZXJOb2RlIiwibW92ZU5vZGVzIiwibm9kZUlkcyIsInBhcmVudE5vZGVJZCIsImhhcyIsInJlY2VpdmVkTWFpbHMiLCJtYWlsIiwibSIsInNvbWUiLCJmaWxlTWFpbCIsInNlbmRlciIsImVuY3J5cHRlZE5hbWVLZXkiLCJmaWxlbmFtZSIsIm1lIiwiaW5jbHVkZXMiLCJvdGhlcnMiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvY2xpZW50L1NlY3JlY3lDbG91ZENsaWVudC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb24gKi9cbmltcG9ydCBheGlvcyBmcm9tIFwiYXhpb3NcIjtcbmltcG9ydCBreSBmcm9tIFwia3lcIjtcbmltcG9ydCB0eXBlIHtcbiAgRG93bmxvYWRQcm9ncmVzcyxcbiAgUHJvZ3Jlc3NDYWxsYmFjayxcbiAgU2VjcmVjeUNsaWVudCxcbiAgU3VjY2Vzc1Jlc3BvbnNlXG59IGZyb20gXCIuLi9pbmRleC5qc1wiO1xuaW1wb3J0IHsgZW5jcnlwdE5hbWUgfSBmcm9tIFwiLi4vaW5kZXguanNcIjtcbmltcG9ydCB7IG5vZGVzQ2FjaGUsIGZpbGVzQ2FjaGUgfSBmcm9tIFwiLi4vY2FjaGUuanNcIjtcbmltcG9ydCB7IHNlY3JldHN0cmVhbUtleWdlbiB9IGZyb20gXCIuLi9jcnlwdG8vZmlsZS5qc1wiO1xuaW1wb3J0IHR5cGUgeyBLZXlQYWlyIH0gZnJvbSBcIi4uL2NyeXB0by9pbmRleC5qc1wiO1xuaW1wb3J0IHsgZGVjcnlwdENyeXB0b0JveCB9IGZyb20gXCIuLi9jcnlwdG8vaW5kZXguanNcIjtcbmltcG9ydCB7IGVuY3J5cHRDcnlwdG9Cb3ggfSBmcm9tIFwiLi4vY3J5cHRvL2luZGV4LmpzXCI7XG5pbXBvcnQgdHlwZSB7XG4gIEVycm9yQWNjZXNzRGVuaWVkLFxuICBFcnJvckJhc2ljLFxuICBFcnJvckxpbWl0LFxuICBFcnJvck5vdEV4aXN0LFxuICBFcnJvck5vdEZvdW5kXG59IGZyb20gXCIuLi9lcnJvci5qc1wiO1xuaW1wb3J0IHsgY29tcHJlc3MsIHVuY29tcHJlc3MgfSBmcm9tIFwiLi4vbWluaWZ5L2luZGV4LmpzXCI7XG5pbXBvcnQgeyBzb2RpdW0gfSBmcm9tIFwiLi4vc29kaXVtLmpzXCI7XG5pbXBvcnQge1xuICBlbnVtZXJhdGUsXG4gIGNodW5rcyxcbiAgcHJvbWlzZUFsbExpbWl0LFxuICBjb25jYXRlbmF0ZVxufSBmcm9tIFwiLi4vdXRpbHMvdXRpbHMuanNcIjtcbmltcG9ydCB7IG1kNSB9IGZyb20gXCIuLi93b3JrZXIvbWQ1LmpzXCI7XG5pbXBvcnQgeyBkZWNyeXB0LCBlbmNyeXB0IH0gZnJvbSBcIi4uL3dvcmtlci9zb2RpdW0uanNcIjtcbmltcG9ydCB0eXBlIHsgTm9kZVR5cGUsIFJpZ2h0cywgVGh1bmRlciB9IGZyb20gXCIuLi96ZXVzL2luZGV4LmpzXCI7XG5pbXBvcnQgeyBncWxGaWxlVG9FeHRlcm5hbCB9IGZyb20gXCIuL2NvbnZlcnQvZmlsZS5qc1wiO1xuaW1wb3J0IHtcbiAgZ3FsTm9kZUZ1bGxUb0ludGVybmFsRnVsbCxcbiAgZ3FsTm9kZVRvRXh0ZXJuYWwsXG4gIGdxbE5vZGVUb0V4dGVybmFsTm9kZUZ1bGwsXG4gIGludGVybmFsTm9kZVRvTm9kZVxufSBmcm9tIFwiLi9jb252ZXJ0L25vZGUuanNcIjtcbmltcG9ydCB0eXBlIHtcbiAgRmlsZUNvbnRlbnRQYXJ0LFxuICBGaWxlTWV0YWRhdGEsXG4gIEZpbGVQYXJ0UmVzcG9uc2UsXG4gIE5hbWVLZXlJbnB1dCxcbiAgTm9kZSxcbiAgTm9kZUZ1bGwsXG4gIFNoYXJlRmlsZUluSGlzdG9yeUlucHV0LFxuICBTaGFyZU5vZGVzSW5wdXRcbn0gZnJvbSBcIi4vdHlwZXMvaW5kZXguanNcIjtcbmltcG9ydCB7XG4gIGZpbGVTZWxlY3RvcixcbiAgbm9kZUZ1bGxTZWxlY3RvcixcbiAgbm9kZVNlbGVjdG9yXG59IGZyb20gXCIuL3R5cGVzL3NlbGVjdG9ycy5qc1wiO1xuLy8gaW1wb3J0IHsgbWQ1IH0gZnJvbSBcIi4uL3dvcmtlci9pbmRleC5qc1wiO1xuLy8gaW1wb3J0IHsgZmlyc3RWYWx1ZUZyb20sIG9mIH0gZnJvbSBcInJ4anNcIjtcblxuZXhwb3J0IGNsYXNzIFNlY3JlY3lDbG91ZENsaWVudCB7XG4gICNjbGllbnQ6IFNlY3JlY3lDbGllbnQ7XG5cbiAgI2tleXM6IEtleVBhaXI7XG5cbiAgI3RodW5kZXI6IFJldHVyblR5cGU8dHlwZW9mIFRodW5kZXI+O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGNsaWVudDogU2VjcmVjeUNsaWVudCxcbiAgICBrZXlzOiBLZXlQYWlyLFxuICAgIHRodW5kZXI6IFJldHVyblR5cGU8dHlwZW9mIFRodW5kZXI+XG4gICkge1xuICAgIHRoaXMuI2NsaWVudCA9IGNsaWVudDtcbiAgICB0aGlzLiNrZXlzID0ga2V5cztcbiAgICB0aGlzLiN0aHVuZGVyID0gdGh1bmRlcjtcbiAgfVxuXG4gIGFzeW5jIGFkZEZpbGVUb0hpc3Rvcnkoe1xuICAgIGZpbGVJZCxcbiAgICBub2RlSWRcbiAgfToge1xuICAgIGZpbGVJZDogc3RyaW5nO1xuICAgIG5vZGVJZDogc3RyaW5nO1xuICB9KTogUHJvbWlzZTxcbiAgICBTdWNjZXNzUmVzcG9uc2U8Tm9kZT4gfCBFcnJvckFjY2Vzc0RlbmllZCB8IEVycm9yTm90RXhpc3QgfCBudWxsXG4gID4ge1xuICAgIGNvbnN0IHsgYWRkRmlsZVRvSGlzdG9yeSB9ID0gYXdhaXQgdGhpcy4jdGh1bmRlcihcIm11dGF0aW9uXCIpKHtcbiAgICAgIGFkZEZpbGVUb0hpc3Rvcnk6IFtcbiAgICAgICAge1xuICAgICAgICAgIGZpbGVJZCxcbiAgICAgICAgICBub2RlSWRcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwiLi4ub24gRXJyb3JBY2Nlc3NEZW5pZWRcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLi4ub24gRXJyb3JOb3RFeGlzdFwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgbWVzc2FnZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCIuLi5vbiBBZGRGaWxlVG9IaXN0b3J5UmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIGFkZEZpbGVUb0hpc3Rvcnk6IG5vZGVGdWxsU2VsZWN0b3JcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9KTtcblxuICAgIGlmICghYWRkRmlsZVRvSGlzdG9yeSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKGFkZEZpbGVUb0hpc3RvcnkuX190eXBlbmFtZSA9PT0gXCJFcnJvckFjY2Vzc0RlbmllZFwiKSB7XG4gICAgICByZXR1cm4gYWRkRmlsZVRvSGlzdG9yeTtcbiAgICB9XG5cbiAgICBpZiAoYWRkRmlsZVRvSGlzdG9yeS5fX3R5cGVuYW1lID09PSBcIkVycm9yTm90RXhpc3RcIikge1xuICAgICAgcmV0dXJuIGFkZEZpbGVUb0hpc3Rvcnk7XG4gICAgfVxuXG4gICAgY29uc3Qgbm9kZSA9IGF3YWl0IGdxbE5vZGVGdWxsVG9JbnRlcm5hbEZ1bGwoXG4gICAgICBhZGRGaWxlVG9IaXN0b3J5LmFkZEZpbGVUb0hpc3RvcnksXG4gICAgICB0aGlzLiNrZXlzXG4gICAgKTtcbiAgICBjb25zdCBmaWxlID0gbm9kZS5oaXN0b3J5LmZpbmQoZiA9PiBmLmlkID09PSBmaWxlSWQpO1xuICAgIGlmIChmaWxlKSB7XG4gICAgICBjb25zdCB1c2VycyA9IG5vZGUudXNlcnMuZmlsdGVyKFxuICAgICAgICAoW3VdKSA9PiB1LnB1YmxpY0tleSAhPT0gdGhpcy4ja2V5cy5wdWJsaWNLZXlcbiAgICAgICk7XG4gICAgICBjb25zdCBpbnB1dDogU2hhcmVGaWxlSW5IaXN0b3J5SW5wdXQgPSB7XG4gICAgICAgIGZpbGVJZDogZmlsZS5pZCxcbiAgICAgICAgdXNlcnM6IHVzZXJzLm1hcCgoW3VdKSA9PiAoe1xuICAgICAgICAgIGlkOiB1LmlkLFxuICAgICAgICAgIGtleTogc29kaXVtLnRvX2hleChcbiAgICAgICAgICAgIGVuY3J5cHRDcnlwdG9Cb3goXG4gICAgICAgICAgICAgIHNvZGl1bS5mcm9tX2hleChmaWxlLmtleSksXG4gICAgICAgICAgICAgIHRoaXMuI2tleXMucHVibGljS2V5LFxuICAgICAgICAgICAgICB0aGlzLiNrZXlzLnByaXZhdGVLZXlcbiAgICAgICAgICAgIClcbiAgICAgICAgICApXG4gICAgICAgIH0pKVxuICAgICAgfTtcblxuICAgICAgYXdhaXQgdGhpcy4jdGh1bmRlcihcIm11dGF0aW9uXCIpKHtcbiAgICAgICAgc2hhcmVGaWxlSW5IaXN0b3J5OiBbXG4gICAgICAgICAgeyBpbnB1dCwgbm9kZUlkIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgXCIuLi5vbiBFcnJvckFjY2Vzc0RlbmllZFwiOiB7XG4gICAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIi4uLm9uIEVycm9yTm90Rm91bmRcIjoge1xuICAgICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCIuLi5vbiBTaGFyZUZpbGVJbkhpc3RvcnlSZXNwb25zZVwiOiB7XG4gICAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICAgIHNoYXJlRmlsZUluSGlzdG9yeTogdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgICAgfSk7XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdCA9IGludGVybmFsTm9kZVRvTm9kZShub2RlKTtcbiAgICByZXR1cm4ge1xuICAgICAgX190eXBlbmFtZTogXCJTdWNjZXNzUmVzcG9uc2VcIixcbiAgICAgIGRhdGE6IHJlc3VsdFxuICAgIH07XG4gIH1cblxuICBhc3luYyB1cGxvYWRGaWxlKHtcbiAgICBmaWxlLFxuICAgIGVuY3J5cHRQcm9ncmVzcyxcbiAgICB1cGxvYWRQcm9ncmVzcyxcbiAgICBzaWduYWxcbiAgfToge1xuICAgIGZpbGU6IGdsb2JhbFRoaXMuRmlsZSB8IFVpbnQ4QXJyYXk7XG4gICAgZW5jcnlwdFByb2dyZXNzPzogUHJvZ3Jlc3NDYWxsYmFjaztcbiAgICB1cGxvYWRQcm9ncmVzcz86IFByb2dyZXNzQ2FsbGJhY2s7XG4gICAgc2lnbmFsPzogQWJvcnRTaWduYWw7XG4gIH0pOiBQcm9taXNlPFxuICAgIHwgU3VjY2Vzc1Jlc3BvbnNlPHN0cmluZz5cbiAgICB8IEVycm9yQWNjZXNzRGVuaWVkXG4gICAgfCBFcnJvckxpbWl0XG4gICAgfCBFcnJvck5vdEZvdW5kXG4gICAgfCBudWxsXG4gID4ge1xuICAgIGNvbnN0IGZpbGVLZXkgPSBzZWNyZXRzdHJlYW1LZXlnZW4oKTtcbiAgICBjb25zdCBmaWxlQnVmZmVyID1cbiAgICAgIGZpbGUgaW5zdGFuY2VvZiBGaWxlID8gbmV3IFVpbnQ4QXJyYXkoYXdhaXQgZmlsZS5hcnJheUJ1ZmZlcigpKSA6IGZpbGU7XG4gICAgY29uc3QgY29tcHJlc3NlZCA9IGNvbXByZXNzKGZpbGVCdWZmZXIpO1xuXG4gICAgY29uc3Qge1xuICAgICAgZGF0YTogZW5jcnlwdGVkRmlsZSxcbiAgICAgIG1kNTogbWQ1RmlsZSxcbiAgICAgIG1kNUVuY3J5cHRlZFxuICAgIH0gPSBhd2FpdCBlbmNyeXB0KGZpbGVLZXksIGNvbXByZXNzZWQsIGVuY3J5cHRQcm9ncmVzcywgc2lnbmFsKTtcblxuICAgIGNvbnN0IGVuY3J5cHRlZEZpbGVLZXkgPSBlbmNyeXB0Q3J5cHRvQm94KFxuICAgICAgZmlsZUtleSxcbiAgICAgIHRoaXMuI2tleXMucHVibGljS2V5LFxuICAgICAgdGhpcy4ja2V5cy5wcml2YXRlS2V5XG4gICAgKTtcblxuICAgIGNvbnN0IHsgdXBsb2FkRmlsZSB9ID0gYXdhaXQgdGhpcy4jdGh1bmRlcihcIm11dGF0aW9uXCIsIHtcbiAgICAgIHNjYWxhcnM6IHtcbiAgICAgICAgSnNvbjoge1xuICAgICAgICAgIGVuY29kZTogKGU6IHVua25vd24pID0+IEpTT04uc3RyaW5naWZ5KGUpLFxuICAgICAgICAgIGRlY29kZTogKGU6IHVua25vd24pID0+IEpTT04ucGFyc2UoZSBhcyBzdHJpbmcpXG4gICAgICAgIH0sXG4gICAgICAgIERhdGVUaW1lOiB7XG4gICAgICAgICAgZGVjb2RlOiAoZTogdW5rbm93bikgPT4gbmV3IERhdGUoZSBhcyBzdHJpbmcpLFxuICAgICAgICAgIGVuY29kZTogKGU6IHVua25vd24pID0+IChlIGFzIERhdGUpLnRvSVNPU3RyaW5nKClcbiAgICAgICAgfSxcbiAgICAgICAgQmlnSW50OiB7XG4gICAgICAgICAgZGVjb2RlOiAoZTogdW5rbm93bikgPT4gQmlnSW50KGUgYXMgc3RyaW5nKSxcbiAgICAgICAgICBlbmNvZGU6IChlOiB1bmtub3duKSA9PiAoZSBhcyBiaWdpbnQpLnRvU3RyaW5nKClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pKHtcbiAgICAgIHVwbG9hZEZpbGU6IFtcbiAgICAgICAge1xuICAgICAgICAgIGZpbGVTaXplOiBlbmNyeXB0ZWRGaWxlLmJ5dGVMZW5ndGgsXG4gICAgICAgICAgZmlsZVNpemVCZWZvcmU6IGZpbGVCdWZmZXIuYnl0ZUxlbmd0aCxcbiAgICAgICAgICBmaWxlS2V5OiBzb2RpdW0udG9faGV4KGVuY3J5cHRlZEZpbGVLZXkpLFxuICAgICAgICAgIG1kNUVuY3J5cHRlZCxcbiAgICAgICAgICBtZDU6IG1kNUZpbGVcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwiLi4ub24gRXJyb3JBY2Nlc3NEZW5pZWRcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLi4ub24gRXJyb3JMaW1pdFwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgbWVzc2FnZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCIuLi5vbiBFcnJvck5vdEZvdW5kXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi4uLm9uIFVwbG9hZEZpbGVSZXNwb25zZVwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgdXBsb2FkRmlsZToge1xuICAgICAgICAgICAgICBmaWxlSWQ6IHRydWUsXG4gICAgICAgICAgICAgIGZpbGVQYXJ0U2l6ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgcGFydHM6IHtcbiAgICAgICAgICAgICAgICBmaWVsZHM6IHRydWUsXG4gICAgICAgICAgICAgICAgb3JkZXI6IHRydWUsXG4gICAgICAgICAgICAgICAgdXJsOiB0cnVlXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9KTtcblxuICAgIGlmICghdXBsb2FkRmlsZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKHVwbG9hZEZpbGUuX190eXBlbmFtZSA9PT0gXCJFcnJvckFjY2Vzc0RlbmllZFwiKSB7XG4gICAgICByZXR1cm4gdXBsb2FkRmlsZTtcbiAgICB9XG5cbiAgICBpZiAodXBsb2FkRmlsZS5fX3R5cGVuYW1lID09PSBcIkVycm9yTGltaXRcIikge1xuICAgICAgcmV0dXJuIHVwbG9hZEZpbGU7XG4gICAgfVxuXG4gICAgaWYgKHVwbG9hZEZpbGUuX190eXBlbmFtZSA9PT0gXCJFcnJvck5vdEZvdW5kXCIpIHtcbiAgICAgIHJldHVybiB1cGxvYWRGaWxlO1xuICAgIH1cblxuICAgIGlmICghdXBsb2FkRmlsZS51cGxvYWRGaWxlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICB1cGxvYWRQcm9ncmVzcz8uKHtcbiAgICAgIHRvdGFsOiBlbmNyeXB0ZWRGaWxlLmJ5dGVMZW5ndGgsXG4gICAgICBjdXJyZW50OiAwLFxuICAgICAgcGVyY2VudDogMFxuICAgIH0pO1xuXG4gICAgaWYgKHVwbG9hZEZpbGUudXBsb2FkRmlsZS5wYXJ0cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHVwbG9hZFByb2dyZXNzPy4oe1xuICAgICAgICB0b3RhbDogZW5jcnlwdGVkRmlsZS5ieXRlTGVuZ3RoLFxuICAgICAgICBjdXJyZW50OiBlbmNyeXB0ZWRGaWxlLmJ5dGVMZW5ndGgsXG4gICAgICAgIHBlcmNlbnQ6IDFcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBfX3R5cGVuYW1lOiBcIlN1Y2Nlc3NSZXNwb25zZVwiLFxuICAgICAgICBkYXRhOiB1cGxvYWRGaWxlLnVwbG9hZEZpbGUuZmlsZUlkXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IHVwbG9hZFBhcnRFbmRlZCA9IGFzeW5jIChcbiAgICAgIG1kNTogc3RyaW5nLFxuICAgICAgb3JkZXI6IG51bWJlclxuICAgICk6IFByb21pc2U8U3VjY2Vzc1Jlc3BvbnNlPGJvb2xlYW4+IHwgRXJyb3JBY2Nlc3NEZW5pZWQgfCBudWxsPiA9PiB7XG4gICAgICBpZiAoIXVwbG9hZEZpbGUudXBsb2FkRmlsZSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHsgdXBsb2FkRmlsZVBhcnRFbmQgfSA9IGF3YWl0IHRoaXMuI3RodW5kZXIoXCJtdXRhdGlvblwiKSh7XG4gICAgICAgIHVwbG9hZEZpbGVQYXJ0RW5kOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgZmlsZUlkOiB1cGxvYWRGaWxlLnVwbG9hZEZpbGUuZmlsZUlkLFxuICAgICAgICAgICAgbWQ1LFxuICAgICAgICAgICAgb3JkZXJcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIFwiLi4ub24gRXJyb3JBY2Nlc3NEZW5pZWRcIjoge1xuICAgICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCIuLi5vbiBVcGxvYWRGaWxlUGFydEVuZFJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgICAgdXBsb2FkRmlsZVBhcnRFbmQ6IHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICAgIH0pO1xuXG4gICAgICBpZiAoIXVwbG9hZEZpbGVQYXJ0RW5kKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICBpZiAodXBsb2FkRmlsZVBhcnRFbmQuX190eXBlbmFtZSA9PT0gXCJFcnJvckFjY2Vzc0RlbmllZFwiKSB7XG4gICAgICAgIHJldHVybiB1cGxvYWRGaWxlUGFydEVuZDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgX190eXBlbmFtZTogXCJTdWNjZXNzUmVzcG9uc2VcIixcbiAgICAgICAgZGF0YTogdXBsb2FkRmlsZVBhcnRFbmQudXBsb2FkRmlsZVBhcnRFbmRcbiAgICAgIH07XG4gICAgfTtcblxuICAgIGNvbnN0IHVwbG9hZEVuZGVkID0gYXN5bmMgKCk6IFByb21pc2U8XG4gICAgICBTdWNjZXNzUmVzcG9uc2U8c3RyaW5nPiB8IEVycm9yQWNjZXNzRGVuaWVkIHwgRXJyb3JOb3RGb3VuZCB8IG51bGxcbiAgICA+ID0+IHtcbiAgICAgIGlmICghdXBsb2FkRmlsZS51cGxvYWRGaWxlKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgY29uc3QgeyB1cGxvYWRGaWxlRW5kIH0gPSBhd2FpdCB0aGlzLiN0aHVuZGVyKFwibXV0YXRpb25cIikoe1xuICAgICAgICB1cGxvYWRGaWxlRW5kOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgZmlsZUlkOiB1cGxvYWRGaWxlLnVwbG9hZEZpbGUuZmlsZUlkXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBcIi4uLm9uIEVycm9yQWNjZXNzRGVuaWVkXCI6IHtcbiAgICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgICAgbWVzc2FnZTogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiLi4ub24gRXJyb3JOb3RGb3VuZFwiOiB7XG4gICAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIi4uLm9uIFVwbG9hZEZpbGVFbmRSZXNwb25zZVwiOiB7XG4gICAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICAgIHVwbG9hZEZpbGVFbmQ6IHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICAgIH0pO1xuXG4gICAgICBpZiAoIXVwbG9hZEZpbGVFbmQpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIGlmICh1cGxvYWRGaWxlRW5kLl9fdHlwZW5hbWUgPT09IFwiRXJyb3JBY2Nlc3NEZW5pZWRcIikge1xuICAgICAgICByZXR1cm4gdXBsb2FkRmlsZUVuZDtcbiAgICAgIH1cblxuICAgICAgaWYgKHVwbG9hZEZpbGVFbmQuX190eXBlbmFtZSA9PT0gXCJFcnJvck5vdEZvdW5kXCIpIHtcbiAgICAgICAgcmV0dXJuIHVwbG9hZEZpbGVFbmQ7XG4gICAgICB9XG5cbiAgICAgIGlmICghdXBsb2FkRmlsZUVuZC51cGxvYWRGaWxlRW5kKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBfX3R5cGVuYW1lOiBcIlN1Y2Nlc3NSZXNwb25zZVwiLFxuICAgICAgICBkYXRhOiB1cGxvYWRGaWxlRW5kLnVwbG9hZEZpbGVFbmRcbiAgICAgIH07XG4gICAgfTtcblxuICAgIGNvbnN0IGNodW5rUGFydHMgPSBuZXcgQXJyYXk8e1xuICAgICAgb3JkZXI6IG51bWJlcjtcbiAgICAgIGRhdGE6IFVpbnQ4QXJyYXk7XG4gICAgICBtZDU6IHN0cmluZztcbiAgICB9PigpO1xuXG4gICAgZm9yIChjb25zdCBbaW5kZXgsIGNodW5rXSBvZiBlbnVtZXJhdGUoXG4gICAgICBjaHVua3MoZW5jcnlwdGVkRmlsZSwgTnVtYmVyKHVwbG9hZEZpbGUudXBsb2FkRmlsZS5maWxlUGFydFNpemUpKVxuICAgICkpIHtcbiAgICAgIGNodW5rUGFydHMucHVzaCh7XG4gICAgICAgIG9yZGVyOiBpbmRleCArIDEsXG4gICAgICAgIGRhdGE6IGNodW5rLFxuICAgICAgICBtZDU6IGF3YWl0IG1kNShjaHVuaylcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IHByb2dyZXNzUGFydHM6IFJlY29yZDxudW1iZXIsIFByb2dyZXNzRXZlbnQ+ID0ge307XG4gICAgY29uc3Qgb25Qcm9ncmVzcyA9IChwYXJ0OiBudW1iZXIsIHByb2dyZXNzRXZlbnQ6IFByb2dyZXNzRXZlbnQpOiB2b2lkID0+IHtcbiAgICAgIHByb2dyZXNzUGFydHNbcGFydF0gPSBwcm9ncmVzc0V2ZW50O1xuICAgICAgY29uc3QgY3VycmVudCA9IE9iamVjdC52YWx1ZXMocHJvZ3Jlc3NQYXJ0cykucmVkdWNlKFxuICAgICAgICAocHJ2LCBjdXIpID0+IHBydiArIGN1ci5sb2FkZWQsXG4gICAgICAgIDBcbiAgICAgICk7XG4gICAgICB1cGxvYWRQcm9ncmVzcz8uKHtcbiAgICAgICAgcGVyY2VudDogY3VycmVudCAvIGVuY3J5cHRlZEZpbGUuYnl0ZUxlbmd0aCxcbiAgICAgICAgdG90YWw6IGVuY3J5cHRlZEZpbGUuYnl0ZUxlbmd0aCxcbiAgICAgICAgY3VycmVudFxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIGNvbnN0IGJ5UGFydCA9IGFzeW5jIChwYXJ0OiBGaWxlUGFydFJlc3BvbnNlKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICBpZiAoIXVwbG9hZEZpbGUudXBsb2FkRmlsZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xuICAgICAgY29uc3QgY2h1bmsgPSBjaHVua1BhcnRzLmZpbmQocCA9PiBwLm9yZGVyID09PSBwYXJ0Lm9yZGVyKTtcbiAgICAgIGlmICghY2h1bmspIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocGFydC5maWVsZHMpKSB7XG4gICAgICAgIGZvcm1EYXRhLmFwcGVuZChrZXksIHZhbHVlKTtcbiAgICAgIH1cbiAgICAgIGZvcm1EYXRhLmFwcGVuZChcbiAgICAgICAgXCJmaWxlXCIsXG4gICAgICAgIG5ldyBCbG9iKFtjaHVuay5kYXRhXSksXG4gICAgICAgIGAke3VwbG9hZEZpbGUudXBsb2FkRmlsZS5maWxlSWR9LSR7Y2h1bmsub3JkZXJ9YFxuICAgICAgKTtcblxuICAgICAgYXdhaXQgYXhpb3MucG9zdChwYXJ0LnVybCwgZm9ybURhdGEsIHtcbiAgICAgICAgb25VcGxvYWRQcm9ncmVzczogcHJvZ3Jlc3NFdmVudCA9PlxuICAgICAgICAgIG9uUHJvZ3Jlc3MocGFydC5vcmRlciwgcHJvZ3Jlc3NFdmVudCksXG4gICAgICAgIHNpZ25hbFxuICAgICAgfSk7XG5cbiAgICAgIGF3YWl0IHVwbG9hZFBhcnRFbmRlZChjaHVuay5tZDUsIGNodW5rLm9yZGVyKTtcbiAgICAgIC8vIGlmICgoZSBhcyBhbnkpLnJlc3BvbnNlLnN0YXR1cyA9PT0gMCkge1xuICAgICAgLy8gICAvLyBUT0RPIGh0dHBzOi8vZ2l0aHViLmNvbS9zaW5kcmVzb3JodXMva3kvaXNzdWVzLzMwNVxuICAgICAgLy8gfSBlbHNlIHtcbiAgICAgIC8vICAgdGhyb3cgZTtcbiAgICAgIC8vIH1cbiAgICB9O1xuXG4gICAgaWYgKCF1cGxvYWRGaWxlLnVwbG9hZEZpbGUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGF3YWl0IHByb21pc2VBbGxMaW1pdChcbiAgICAgIDMsXG4gICAgICB1cGxvYWRGaWxlLnVwbG9hZEZpbGUucGFydHMubWFwKHAgPT4gKCk6IFByb21pc2U8dm9pZD4gPT4gYnlQYXJ0KHApKVxuICAgICk7XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB1cGxvYWRFbmRlZCgpO1xuXG4gICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChyZXN1bHQuX190eXBlbmFtZSA9PT0gXCJFcnJvckFjY2Vzc0RlbmllZFwiKSB7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIGlmIChyZXN1bHQuX190eXBlbmFtZSA9PT0gXCJFcnJvck5vdEZvdW5kXCIpIHtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIF9fdHlwZW5hbWU6IFwiU3VjY2Vzc1Jlc3BvbnNlXCIsXG4gICAgICBkYXRhOiByZXN1bHQuZGF0YVxuICAgIH07XG4gIH1cblxuICBhc3luYyB1cGxvYWRGaWxlSW5DbG91ZCh7XG4gICAgZmlsZSxcbiAgICBuYW1lLFxuICAgIG5vZGVJZCxcbiAgICBlbmNyeXB0UHJvZ3Jlc3MsXG4gICAgdXBsb2FkUHJvZ3Jlc3MsXG4gICAgc2lnbmFsXG4gIH06IHtcbiAgICBmaWxlOiBnbG9iYWxUaGlzLkZpbGUgfCBVaW50OEFycmF5O1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBub2RlSWQ/OiBzdHJpbmc7XG4gICAgZW5jcnlwdFByb2dyZXNzPzogUHJvZ3Jlc3NDYWxsYmFjaztcbiAgICB1cGxvYWRQcm9ncmVzcz86IFByb2dyZXNzQ2FsbGJhY2s7XG4gICAgc2lnbmFsPzogQWJvcnRTaWduYWw7XG4gIH0pOiBQcm9taXNlPFxuICAgIHwgU3VjY2Vzc1Jlc3BvbnNlPE5vZGVGdWxsPlxuICAgIHwgRXJyb3JBY2Nlc3NEZW5pZWRcbiAgICB8IEVycm9yTGltaXRcbiAgICB8IEVycm9yTm90Rm91bmRcbiAgICB8IEVycm9yQmFzaWNcbiAgICB8IEVycm9yTm90RXhpc3RcbiAgICB8IG51bGxcbiAgPiB7XG4gICAgY29uc3QgZmlsZUlkID0gYXdhaXQgdGhpcy51cGxvYWRGaWxlKHtcbiAgICAgIGZpbGUsXG4gICAgICBlbmNyeXB0UHJvZ3Jlc3MsXG4gICAgICB1cGxvYWRQcm9ncmVzcyxcbiAgICAgIHNpZ25hbFxuICAgIH0pO1xuXG4gICAgaWYgKCFmaWxlSWQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChmaWxlSWQuX190eXBlbmFtZSA9PT0gXCJFcnJvckFjY2Vzc0RlbmllZFwiKSB7XG4gICAgICByZXR1cm4gZmlsZUlkO1xuICAgIH1cblxuICAgIGlmIChmaWxlSWQuX190eXBlbmFtZSA9PT0gXCJFcnJvckxpbWl0XCIpIHtcbiAgICAgIHJldHVybiBmaWxlSWQ7XG4gICAgfVxuXG4gICAgaWYgKGZpbGVJZC5fX3R5cGVuYW1lID09PSBcIkVycm9yTm90Rm91bmRcIikge1xuICAgICAgcmV0dXJuIGZpbGVJZDtcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnNhdmVJbkNsb3VkKHtcbiAgICAgIGZpbGVJZDogZmlsZUlkLmRhdGEsXG4gICAgICBuYW1lLFxuICAgICAgbm9kZUlkXG4gICAgfSk7XG5cbiAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKHJlc3VsdC5fX3R5cGVuYW1lID09PSBcIkVycm9yQWNjZXNzRGVuaWVkXCIpIHtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgaWYgKHJlc3VsdC5fX3R5cGVuYW1lID09PSBcIkVycm9yQmFzaWNcIikge1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBpZiAocmVzdWx0Ll9fdHlwZW5hbWUgPT09IFwiRXJyb3JMaW1pdFwiKSB7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIGlmIChyZXN1bHQuX190eXBlbmFtZSA9PT0gXCJFcnJvck5vdEZvdW5kXCIpIHtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgaWYgKHJlc3VsdC5fX3R5cGVuYW1lID09PSBcIkVycm9yTm90RXhpc3RcIikge1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgX190eXBlbmFtZTogXCJTdWNjZXNzUmVzcG9uc2VcIixcbiAgICAgIGRhdGE6IHJlc3VsdC5kYXRhXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZWROb2RlcygpOiBQcm9taXNlPFxuICAgIFN1Y2Nlc3NSZXNwb25zZTxOb2RlW10+IHwgRXJyb3JBY2Nlc3NEZW5pZWQgfCBudWxsXG4gID4ge1xuICAgIGNvbnN0IHsgZGVsZXRlZE5vZGVzIH0gPSBhd2FpdCB0aGlzLiN0aHVuZGVyKFwicXVlcnlcIikoe1xuICAgICAgZGVsZXRlZE5vZGVzOiB7XG4gICAgICAgIFwiLi4ub24gRXJyb3JBY2Nlc3NEZW5pZWRcIjoge1xuICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgbWVzc2FnZTogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcIi4uLm9uIERlbGV0ZWROb2Rlc1Jlc3BvbnNlXCI6IHtcbiAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgIGRlbGV0ZWROb2Rlczogbm9kZVNlbGVjdG9yXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmICghZGVsZXRlZE5vZGVzKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoZGVsZXRlZE5vZGVzLl9fdHlwZW5hbWUgPT09IFwiRXJyb3JBY2Nlc3NEZW5pZWRcIikge1xuICAgICAgcmV0dXJuIGRlbGV0ZWROb2RlcztcbiAgICB9XG5cbiAgICBjb25zdCBub2RlcyA9IG5ldyBBcnJheTxOb2RlPigpO1xuXG4gICAgZm9yIChjb25zdCBub2RlIG9mIGRlbGV0ZWROb2Rlcy5kZWxldGVkTm9kZXMpIHtcbiAgICAgIG5vZGVzLnB1c2goYXdhaXQgZ3FsTm9kZVRvRXh0ZXJuYWwobm9kZSwgdGhpcy4ja2V5cykpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBfX3R5cGVuYW1lOiBcIlN1Y2Nlc3NSZXNwb25zZVwiLFxuICAgICAgZGF0YTogbm9kZXNcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgc2hhcmVkTm9kZXMoKTogUHJvbWlzZTxcbiAgICBTdWNjZXNzUmVzcG9uc2U8Tm9kZVtdPiB8IEVycm9yQWNjZXNzRGVuaWVkIHwgbnVsbFxuICA+IHtcbiAgICBjb25zdCB7IHNoYXJlZE5vZGVzIH0gPSBhd2FpdCB0aGlzLiN0aHVuZGVyKFwicXVlcnlcIikoe1xuICAgICAgc2hhcmVkTm9kZXM6IHtcbiAgICAgICAgXCIuLi5vbiBFcnJvckFjY2Vzc0RlbmllZFwiOiB7XG4gICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiLi4ub24gU2hhcmVkTm9kZXNSZXNwb25zZVwiOiB7XG4gICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICBzaGFyZWROb2Rlczogbm9kZVNlbGVjdG9yXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmICghc2hhcmVkTm9kZXMpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChzaGFyZWROb2Rlcy5fX3R5cGVuYW1lID09PSBcIkVycm9yQWNjZXNzRGVuaWVkXCIpIHtcbiAgICAgIHJldHVybiBzaGFyZWROb2RlcztcbiAgICB9XG5cbiAgICBjb25zdCBub2RlcyA9IG5ldyBBcnJheTxOb2RlPigpO1xuXG4gICAgZm9yIChjb25zdCBmb2xkZXIgb2Ygc2hhcmVkTm9kZXMuc2hhcmVkTm9kZXMpIHtcbiAgICAgIG5vZGVzLnB1c2goYXdhaXQgZ3FsTm9kZVRvRXh0ZXJuYWwoZm9sZGVyLCB0aGlzLiNrZXlzKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIF9fdHlwZW5hbWU6IFwiU3VjY2Vzc1Jlc3BvbnNlXCIsXG4gICAgICBkYXRhOiBub2Rlc1xuICAgIH07XG4gIH1cblxuICBhc3luYyBub2Rlc1NoYXJlZFdpdGhNZShcbiAgICB0eXBlPzogTm9kZVR5cGUgfCBudWxsIHwgdW5kZWZpbmVkXG4gICk6IFByb21pc2U8U3VjY2Vzc1Jlc3BvbnNlPE5vZGVbXT4gfCBFcnJvckFjY2Vzc0RlbmllZCB8IG51bGw+IHtcbiAgICBjb25zdCB7IG5vZGVzU2hhcmVkV2l0aE1lIH0gPSBhd2FpdCB0aGlzLiN0aHVuZGVyKFwicXVlcnlcIikoe1xuICAgICAgbm9kZXNTaGFyZWRXaXRoTWU6IFtcbiAgICAgICAge1xuICAgICAgICAgIHR5cGVcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwiLi4ub24gRXJyb3JBY2Nlc3NEZW5pZWRcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLi4ub24gTm9kZXNTaGFyZWRXaXRoTWVSZXNwb25zZVwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgbm9kZXNTaGFyZWRXaXRoTWU6IG5vZGVTZWxlY3RvclxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgXVxuICAgIH0pO1xuXG4gICAgaWYgKCFub2Rlc1NoYXJlZFdpdGhNZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKG5vZGVzU2hhcmVkV2l0aE1lLl9fdHlwZW5hbWUgPT09IFwiRXJyb3JBY2Nlc3NEZW5pZWRcIikge1xuICAgICAgcmV0dXJuIG5vZGVzU2hhcmVkV2l0aE1lO1xuICAgIH1cblxuICAgIGNvbnN0IG5vZGVzID0gbmV3IEFycmF5PE5vZGU+KCk7XG5cbiAgICBmb3IgKGNvbnN0IGZvbGRlciBvZiBub2Rlc1NoYXJlZFdpdGhNZS5ub2Rlc1NoYXJlZFdpdGhNZSkge1xuICAgICAgbm9kZXMucHVzaChhd2FpdCBncWxOb2RlVG9FeHRlcm5hbChmb2xkZXIsIHRoaXMuI2tleXMpKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgX190eXBlbmFtZTogXCJTdWNjZXNzUmVzcG9uc2VcIixcbiAgICAgIGRhdGE6IG5vZGVzXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZU5vZGVTaGFyaW5nKHtcbiAgICBub2RlSWQsXG4gICAgdXNlcklkXG4gIH06IHtcbiAgICBub2RlSWQ6IHN0cmluZztcbiAgICB1c2VySWQ6IHN0cmluZztcbiAgfSk6IFByb21pc2U8U3VjY2Vzc1Jlc3BvbnNlPGJvb2xlYW4+IHwgRXJyb3JBY2Nlc3NEZW5pZWQgfCBudWxsPiB7XG4gICAgY29uc3QgeyBkZWxldGVOb2RlU2hhcmluZyB9ID0gYXdhaXQgdGhpcy4jdGh1bmRlcihcIm11dGF0aW9uXCIpKHtcbiAgICAgIGRlbGV0ZU5vZGVTaGFyaW5nOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBub2RlSWQsXG4gICAgICAgICAgdXNlcklkXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIi4uLm9uIEVycm9yQWNjZXNzRGVuaWVkXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi4uLm9uIERlbGV0ZU5vZGVTaGFyaW5nUmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIGRlbGV0ZU5vZGVTaGFyaW5nOiB0cnVlXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfSk7XG5cbiAgICBpZiAoIWRlbGV0ZU5vZGVTaGFyaW5nKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoZGVsZXRlTm9kZVNoYXJpbmcuX190eXBlbmFtZSA9PT0gXCJFcnJvckFjY2Vzc0RlbmllZFwiKSB7XG4gICAgICByZXR1cm4gZGVsZXRlTm9kZVNoYXJpbmc7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIF9fdHlwZW5hbWU6IFwiU3VjY2Vzc1Jlc3BvbnNlXCIsXG4gICAgICBkYXRhOiBkZWxldGVOb2RlU2hhcmluZy5kZWxldGVOb2RlU2hhcmluZ1xuICAgIH07XG4gIH1cblxuICBhc3luYyBkdXBsaWNhdGVOb2RlKHtcbiAgICBub2RlSWQsXG4gICAgZm9sZGVySWQsXG4gICAgY3VzdG9tTmFtZVxuICB9OiB7XG4gICAgbm9kZUlkOiBzdHJpbmc7XG4gICAgZm9sZGVySWQ/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkO1xuICAgIGN1c3RvbU5hbWU/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkO1xuICB9KTogUHJvbWlzZTxcbiAgICBTdWNjZXNzUmVzcG9uc2U8Ym9vbGVhbj4gfCBFcnJvckFjY2Vzc0RlbmllZCB8IEVycm9yTm90Rm91bmQgfCBudWxsXG4gID4ge1xuICAgIGxldCBub2RlID0gbm9kZXNDYWNoZS5nZXQobm9kZUlkKTtcbiAgICBpZiAoIW5vZGUpIHtcbiAgICAgIGF3YWl0IHRoaXMubm9kZSh7IGlkOiBub2RlSWQgfSk7XG4gICAgICBub2RlID0gbm9kZXNDYWNoZS5nZXQobm9kZUlkKTtcbiAgICAgIGlmICghbm9kZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vZGUgKCR7bm9kZUlkfSkgZG9lcyBub3QgZXhpc3RzYCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghbm9kZS5hY2Nlc3M/Lm5hbWVLZXkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ2FuJ3QgaGF2ZSBhY2Nlc3MgdG8gbm9kZSAke25vZGVJZH1gKTtcbiAgICB9XG4gICAgY3VzdG9tTmFtZSA9IGN1c3RvbU5hbWVcbiAgICAgID8gYXdhaXQgZW5jcnlwdE5hbWUoY3VzdG9tTmFtZSwgbm9kZS5hY2Nlc3MubmFtZUtleSlcbiAgICAgIDogbnVsbDtcblxuICAgIGNvbnN0IHsgZHVwbGljYXRlTm9kZSB9ID0gYXdhaXQgdGhpcy4jdGh1bmRlcihcIm11dGF0aW9uXCIpKHtcbiAgICAgIGR1cGxpY2F0ZU5vZGU6IFtcbiAgICAgICAge1xuICAgICAgICAgIG5vZGVJZCxcbiAgICAgICAgICBmb2xkZXJJZCxcbiAgICAgICAgICBjdXN0b21OYW1lXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIi4uLm9uIEVycm9yQWNjZXNzRGVuaWVkXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi4uLm9uIEVycm9yTm90Rm91bmRcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLi4ub24gRHVwbGljYXRlTm9kZVJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBkdXBsaWNhdGVOb2RlOiB0cnVlXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfSk7XG5cbiAgICBpZiAoIWR1cGxpY2F0ZU5vZGUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChkdXBsaWNhdGVOb2RlLl9fdHlwZW5hbWUgPT09IFwiRXJyb3JBY2Nlc3NEZW5pZWRcIikge1xuICAgICAgcmV0dXJuIGR1cGxpY2F0ZU5vZGU7XG4gICAgfVxuXG4gICAgaWYgKGR1cGxpY2F0ZU5vZGUuX190eXBlbmFtZSA9PT0gXCJFcnJvck5vdEZvdW5kXCIpIHtcbiAgICAgIHJldHVybiBkdXBsaWNhdGVOb2RlO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBfX3R5cGVuYW1lOiBcIlN1Y2Nlc3NSZXNwb25zZVwiLFxuICAgICAgZGF0YTogZHVwbGljYXRlTm9kZS5kdXBsaWNhdGVOb2RlXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZU5vZGVDbG91ZFRyYXNoKHtcbiAgICBpZHNcbiAgfToge1xuICAgIGlkczogQXJyYXk8c3RyaW5nPjtcbiAgfSk6IFByb21pc2U8U3VjY2Vzc1Jlc3BvbnNlPGJvb2xlYW4+IHwgRXJyb3JBY2Nlc3NEZW5pZWQgfCBudWxsPiB7XG4gICAgY29uc3QgeyBkZWxldGVOb2RlQ2xvdWRUcmFzaCB9ID0gYXdhaXQgdGhpcy4jdGh1bmRlcihcIm11dGF0aW9uXCIpKHtcbiAgICAgIGRlbGV0ZU5vZGVDbG91ZFRyYXNoOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBpZHNcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwiLi4ub24gRXJyb3JBY2Nlc3NEZW5pZWRcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLi4ub24gRGVsZXRlTm9kZUNsb3VkVHJhc2hSZXNwb25zZVwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgZGVsZXRlTm9kZUNsb3VkVHJhc2g6IHRydWVcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9KTtcblxuICAgIGlmICghZGVsZXRlTm9kZUNsb3VkVHJhc2gpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChkZWxldGVOb2RlQ2xvdWRUcmFzaC5fX3R5cGVuYW1lID09PSBcIkVycm9yQWNjZXNzRGVuaWVkXCIpIHtcbiAgICAgIHJldHVybiBkZWxldGVOb2RlQ2xvdWRUcmFzaDtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgX190eXBlbmFtZTogXCJTdWNjZXNzUmVzcG9uc2VcIixcbiAgICAgIGRhdGE6IGRlbGV0ZU5vZGVDbG91ZFRyYXNoLmRlbGV0ZU5vZGVDbG91ZFRyYXNoID8/IGZhbHNlXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZUZvbGRlcih7XG4gICAgbmFtZSxcbiAgICBwYXJlbnRGb2xkZXJJZFxuICB9OiB7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIHBhcmVudEZvbGRlcklkPzogc3RyaW5nIHwgbnVsbDtcbiAgfSk6IFByb21pc2U8XG4gICAgU3VjY2Vzc1Jlc3BvbnNlPE5vZGVGdWxsPiB8IEVycm9yQWNjZXNzRGVuaWVkIHwgRXJyb3JOb3RFeGlzdCB8IG51bGxcbiAgPiB7XG4gICAgY29uc3Qga2V5ID0gc2VjcmV0c3RyZWFtS2V5Z2VuKCk7XG4gICAgY29uc3QgZW5jcnlwdGVkTmFtZSA9IGF3YWl0IGVuY3J5cHROYW1lKG5hbWUsIHNvZGl1bS50b19oZXgoa2V5KSk7XG4gICAgY29uc3QgZW5jcnlwdGVkS2V5ID0gZW5jcnlwdENyeXB0b0JveChcbiAgICAgIGtleSxcbiAgICAgIHRoaXMuI2tleXMucHVibGljS2V5LFxuICAgICAgdGhpcy4ja2V5cy5wcml2YXRlS2V5XG4gICAgKTtcbiAgICBjb25zdCB7IGNyZWF0ZUZvbGRlciB9ID0gYXdhaXQgdGhpcy4jdGh1bmRlcihcIm11dGF0aW9uXCIpKHtcbiAgICAgIGNyZWF0ZUZvbGRlcjogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogZW5jcnlwdGVkTmFtZSxcbiAgICAgICAgICBwYXJlbnRGb2xkZXJJZCxcbiAgICAgICAgICBrZXk6IHNvZGl1bS50b19oZXgoZW5jcnlwdGVkS2V5KVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCIuLi5vbiBFcnJvckFjY2Vzc0RlbmllZFwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgbWVzc2FnZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCIuLi5vbiBFcnJvck5vdEV4aXN0XCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi4uLm9uIENyZWF0ZUZvbGRlclJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBjcmVhdGVGb2xkZXI6IG5vZGVGdWxsU2VsZWN0b3JcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9KTtcbiAgICBpZiAoIWNyZWF0ZUZvbGRlcikge1xuICAgICAgLy90aHJvdyBuZXcgRXJyb3IoYENhbid0IGNyZWF0ZSBmb2xkZXJgKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChjcmVhdGVGb2xkZXIuX190eXBlbmFtZSA9PT0gXCJFcnJvckFjY2Vzc0RlbmllZFwiKSB7XG4gICAgICByZXR1cm4gY3JlYXRlRm9sZGVyO1xuICAgIH1cblxuICAgIGlmIChjcmVhdGVGb2xkZXIuX190eXBlbmFtZSA9PT0gXCJFcnJvck5vdEV4aXN0XCIpIHtcbiAgICAgIHJldHVybiBjcmVhdGVGb2xkZXI7XG4gICAgfVxuXG4gICAgaWYgKCFjcmVhdGVGb2xkZXIuY3JlYXRlRm9sZGVyKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBmb2xkZXIgPSBhd2FpdCBncWxOb2RlVG9FeHRlcm5hbE5vZGVGdWxsKFxuICAgICAgY3JlYXRlRm9sZGVyLmNyZWF0ZUZvbGRlcixcbiAgICAgIHRoaXMuI2tleXNcbiAgICApO1xuXG4gICAgY29uc3QgdXNlcnMgPVxuICAgICAgZm9sZGVyLnBhcmVudD8udXNlcnM/LmZpbHRlcihcbiAgICAgICAgKFt1XSkgPT4gdS5wdWJsaWNLZXkgIT09IHRoaXMuI2tleXMucHVibGljS2V5XG4gICAgICApID8/IFtdO1xuXG4gICAgaWYgKHVzZXJzLmxlbmd0aCkge1xuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIHVzZXJzLm1hcCgoW3UsIHJpZ2h0c10pID0+XG4gICAgICAgICAgdGhpcy5zaGFyZU5vZGUoe1xuICAgICAgICAgICAgbm9kZUlkOiBmb2xkZXIuaWQsXG4gICAgICAgICAgICByaWdodHMsXG4gICAgICAgICAgICB1c2VySWQ6IHUuaWRcbiAgICAgICAgICB9KVxuICAgICAgICApXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBfX3R5cGVuYW1lOiBcIlN1Y2Nlc3NSZXNwb25zZVwiLFxuICAgICAgZGF0YTogZm9sZGVyXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIG5vZGUoe1xuICAgIGlkLFxuICAgIGRlbGV0ZWRcbiAgfToge1xuICAgIGlkPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZDtcbiAgICBkZWxldGVkPzogYm9vbGVhbiB8IG51bGwgfCB1bmRlZmluZWQ7XG4gIH0gPSB7fSk6IFByb21pc2U8U3VjY2Vzc1Jlc3BvbnNlPE5vZGVGdWxsPiB8IEVycm9yQWNjZXNzRGVuaWVkIHwgbnVsbD4ge1xuICAgIGNvbnN0IHsgbm9kZSB9ID0gYXdhaXQgdGhpcy4jdGh1bmRlcihcInF1ZXJ5XCIpKHtcbiAgICAgIG5vZGU6IFtcbiAgICAgICAgeyBkZWxldGVkLCBpZCB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCIuLi5vbiBFcnJvckFjY2Vzc0RlbmllZFwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgbWVzc2FnZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCIuLi5vbiBOb2RlUmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG5vZGU6IG5vZGVGdWxsU2VsZWN0b3JcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9KTtcbiAgICBpZiAoIW5vZGUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChub2RlLl9fdHlwZW5hbWUgPT09IFwiRXJyb3JBY2Nlc3NEZW5pZWRcIikge1xuICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuICAgIGlmICghbm9kZS5ub2RlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBncWxOb2RlVG9FeHRlcm5hbE5vZGVGdWxsKG5vZGUubm9kZSwgdGhpcy4ja2V5cyk7XG4gICAgcmV0dXJuIHtcbiAgICAgIF9fdHlwZW5hbWU6IFwiU3VjY2Vzc1Jlc3BvbnNlXCIsXG4gICAgICBkYXRhOiByZXN1bHRcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgZmlsZU1ldGFkYXRhKHtcbiAgICBpZFxuICB9OiB7XG4gICAgaWQ6IHN0cmluZztcbiAgfSk6IFByb21pc2U8U3VjY2Vzc1Jlc3BvbnNlPEZpbGVNZXRhZGF0YT4gfCBFcnJvckFjY2Vzc0RlbmllZCB8IG51bGw+IHtcbiAgICBjb25zdCB7IGZpbGUgfSA9IGF3YWl0IHRoaXMuI3RodW5kZXIoXCJxdWVyeVwiKSh7XG4gICAgICBmaWxlOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBpZFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCIuLi5vbiBFcnJvckFjY2Vzc0RlbmllZFwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgbWVzc2FnZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCIuLi5vbiBGaWxlUXVlcnlSZXNwb25zZVwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgZmlsZTogZmlsZVNlbGVjdG9yXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfSk7XG4gICAgaWYgKCFmaWxlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoZmlsZS5fX3R5cGVuYW1lID09PSBcIkVycm9yQWNjZXNzRGVuaWVkXCIpIHtcbiAgICAgIHJldHVybiBmaWxlO1xuICAgIH1cblxuICAgIGlmICghZmlsZS5maWxlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBncWxGaWxlVG9FeHRlcm5hbChmaWxlLmZpbGUsIHRoaXMuI2tleXMpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIF9fdHlwZW5hbWU6IFwiU3VjY2Vzc1Jlc3BvbnNlXCIsXG4gICAgICBkYXRhOiByZXN1bHRcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgc2hhcmVOb2RlKHtcbiAgICBub2RlSWQsXG4gICAgdXNlcklkLFxuICAgIHJpZ2h0c1xuICB9OiB7XG4gICAgbm9kZUlkOiBzdHJpbmc7XG4gICAgdXNlcklkOiBzdHJpbmc7XG4gICAgcmlnaHRzOiBSaWdodHM7XG4gIH0pOiBQcm9taXNlPFxuICAgIFN1Y2Nlc3NSZXNwb25zZTxib29sZWFuPiB8IEVycm9yQWNjZXNzRGVuaWVkIHwgRXJyb3JOb3RGb3VuZCB8IG51bGxcbiAgPiB7XG4gICAgY29uc3QgdXNlciA9IGF3YWl0IHRoaXMuI2NsaWVudC51c2VyKHsgdXNlcklkLCB3aXRoUHVibGljS2V5OiB0cnVlIH0pO1xuXG4gICAgaWYgKCF1c2VyKSB7XG4gICAgICByZXR1cm4gdXNlcjtcbiAgICB9XG5cbiAgICBpZiAodXNlci5fX3R5cGVuYW1lID09PSBcIkVycm9yTm90Rm91bmRcIikge1xuICAgICAgcmV0dXJuIHVzZXI7XG4gICAgfVxuXG4gICAgY29uc3QgeyBzaGFyZU5vZGUgfSA9IGF3YWl0IHRoaXMuI3RodW5kZXIoXCJtdXRhdGlvblwiKSh7XG4gICAgICBzaGFyZU5vZGU6IFtcbiAgICAgICAgeyBub2RlSWQsIHVzZXJJZCB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCIuLi5vbiBFcnJvckFjY2Vzc0RlbmllZFwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgbWVzc2FnZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCIuLi5vbiBFcnJvck5vdEZvdW5kXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi4uLm9uIFNoYXJlTm9kZVJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBub2RlczogdHJ1ZVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgXVxuICAgIH0pO1xuXG4gICAgaWYgKCFzaGFyZU5vZGUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChzaGFyZU5vZGUuX190eXBlbmFtZSA9PT0gXCJFcnJvckFjY2Vzc0RlbmllZFwiKSB7XG4gICAgICByZXR1cm4gc2hhcmVOb2RlO1xuICAgIH1cblxuICAgIGlmIChzaGFyZU5vZGUuX190eXBlbmFtZSA9PT0gXCJFcnJvck5vdEZvdW5kXCIpIHtcbiAgICAgIHJldHVybiBzaGFyZU5vZGU7XG4gICAgfVxuXG4gICAgY29uc3Qgc2hhcmVOb2RlczogU2hhcmVOb2Rlc0lucHV0ID0ge1xuICAgICAgbm9kZXM6IFtdXG4gICAgfTtcblxuICAgIGZvciAoY29uc3QgaWQgb2Ygc2hhcmVOb2RlLm5vZGVzKSB7XG4gICAgICBjb25zdCBuYW1lS2V5ID0gYXdhaXQgdGhpcy5wZXJOb2RlKGlkLCB1c2VyLmRhdGEucHVibGljS2V5KTtcbiAgICAgIGlmIChuYW1lS2V5KSB7XG4gICAgICAgIHNoYXJlTm9kZXMubm9kZXMucHVzaChuYW1lS2V5KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCB7IHNoYXJlTm9kZUZpbmlzaCB9ID0gYXdhaXQgdGhpcy4jdGh1bmRlcihcIm11dGF0aW9uXCIpKHtcbiAgICAgIHNoYXJlTm9kZUZpbmlzaDogW1xuICAgICAgICB7XG4gICAgICAgICAgcmlnaHRzLFxuICAgICAgICAgIHVzZXJJZCxcbiAgICAgICAgICBzaGFyZU5vZGVzXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIi4uLm9uIEVycm9yQWNjZXNzRGVuaWVkXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi4uLm9uIEVycm9yTm90Rm91bmRcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLi4ub24gU2hhcmVOb2RlRmluaXNoUmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIHNoYXJlTm9kZUZpbmlzaDogdHJ1ZVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgXVxuICAgIH0pO1xuXG4gICAgaWYgKCFzaGFyZU5vZGVGaW5pc2gpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChzaGFyZU5vZGVGaW5pc2guX190eXBlbmFtZSA9PT0gXCJFcnJvckFjY2Vzc0RlbmllZFwiKSB7XG4gICAgICByZXR1cm4gc2hhcmVOb2RlRmluaXNoO1xuICAgIH1cblxuICAgIGlmIChzaGFyZU5vZGVGaW5pc2guX190eXBlbmFtZSA9PT0gXCJFcnJvck5vdEZvdW5kXCIpIHtcbiAgICAgIHJldHVybiBzaGFyZU5vZGVGaW5pc2g7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIF9fdHlwZW5hbWU6IFwiU3VjY2Vzc1Jlc3BvbnNlXCIsXG4gICAgICBkYXRhOiBzaGFyZU5vZGVGaW5pc2guc2hhcmVOb2RlRmluaXNoID8/IGZhbHNlXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIHVwZGF0ZU5vZGUoe1xuICAgIG5vZGVJZCxcbiAgICBuYW1lLFxuICAgIGlzRmF2b3JpdGUsXG4gICAgZGVsZXRlZEF0XG4gIH06IHtcbiAgICBub2RlSWQ6IHN0cmluZztcbiAgICBuYW1lPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZDtcbiAgICBpc0Zhdm9yaXRlPzogYm9vbGVhbiB8IG51bGwgfCB1bmRlZmluZWQ7XG4gICAgZGVsZXRlZEF0PzogRGF0ZSB8IG51bGwgfCB1bmRlZmluZWQ7XG4gIH0pOiBQcm9taXNlPFxuICAgIFN1Y2Nlc3NSZXNwb25zZTxOb2RlRnVsbD4gfCBFcnJvckFjY2Vzc0RlbmllZCB8IEVycm9yTm90RXhpc3QgfCBudWxsXG4gID4ge1xuICAgIGxldCBub2RlID0gbm9kZXNDYWNoZS5nZXQobm9kZUlkKTtcbiAgICBpZiAoIW5vZGUpIHtcbiAgICAgIGF3YWl0IHRoaXMubm9kZSh7IGlkOiBub2RlSWQgfSk7XG4gICAgICBub2RlID0gbm9kZXNDYWNoZS5nZXQobm9kZUlkKTtcbiAgICAgIGlmICghbm9kZSkge1xuICAgICAgICB0aHJvdyBgQ2FuJ3QgZmluZCBOb2RlICR7bm9kZUlkfWA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFub2RlLmFjY2Vzcz8ubmFtZUtleSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW4ndCBoYXZlIGFjY2VzcyB0byBub2RlICR7bm9kZUlkfWApO1xuICAgIH1cblxuICAgIG5hbWUgPSBuYW1lXG4gICAgICA/IG5vZGUuYWNjZXNzPy5uYW1lS2V5XG4gICAgICAgID8gYXdhaXQgZW5jcnlwdE5hbWUobmFtZSwgbm9kZS5hY2Nlc3MubmFtZUtleSlcbiAgICAgICAgOiBuYW1lXG4gICAgICA6IG51bGw7XG5cbiAgICBjb25zdCB7IHVwZGF0ZU5vZGUgfSA9IGF3YWl0IHRoaXMuI3RodW5kZXIoXCJtdXRhdGlvblwiKSh7XG4gICAgICB1cGRhdGVOb2RlOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBub2RlSWQsXG4gICAgICAgICAgbmFtZSxcbiAgICAgICAgICBpc0Zhdm9yaXRlLFxuICAgICAgICAgIGRlbGV0ZWRBdFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCIuLi5vbiBFcnJvckFjY2Vzc0RlbmllZFwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgbWVzc2FnZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCIuLi5vbiBFcnJvck5vdEV4aXN0XCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi4uLm9uIFVwZGF0ZU5vZGVSZXNwb25zZVwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgdXBkYXRlTm9kZTogbm9kZUZ1bGxTZWxlY3RvclxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgXVxuICAgIH0pO1xuXG4gICAgaWYgKCF1cGRhdGVOb2RlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAodXBkYXRlTm9kZS5fX3R5cGVuYW1lID09PSBcIkVycm9yQWNjZXNzRGVuaWVkXCIpIHtcbiAgICAgIHJldHVybiB1cGRhdGVOb2RlO1xuICAgIH1cblxuICAgIGlmICh1cGRhdGVOb2RlLl9fdHlwZW5hbWUgPT09IFwiRXJyb3JOb3RFeGlzdFwiKSB7XG4gICAgICByZXR1cm4gdXBkYXRlTm9kZTtcbiAgICB9XG5cbiAgICBpZiAoIXVwZGF0ZU5vZGUudXBkYXRlTm9kZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZ3FsTm9kZVRvRXh0ZXJuYWxOb2RlRnVsbChcbiAgICAgIHVwZGF0ZU5vZGUudXBkYXRlTm9kZSxcbiAgICAgIHRoaXMuI2tleXNcbiAgICApO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIF9fdHlwZW5hbWU6IFwiU3VjY2Vzc1Jlc3BvbnNlXCIsXG4gICAgICBkYXRhOiByZXN1bHRcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgZmlsZUNvbnRlbnQoe1xuICAgIGZpbGVJZCxcbiAgICBvbkRvd25sb2FkUHJvZ3Jlc3MsXG4gICAgcHJvZ3Jlc3NEZWNyeXB0LFxuICAgIHNpZ25hbFxuICB9OiB7XG4gICAgZmlsZUlkOiBzdHJpbmc7XG4gICAgb25Eb3dubG9hZFByb2dyZXNzPzogKHByb2dyZXNzOiBEb3dubG9hZFByb2dyZXNzKSA9PiB2b2lkO1xuICAgIHByb2dyZXNzRGVjcnlwdD86IFByb2dyZXNzQ2FsbGJhY2s7XG4gICAgc2lnbmFsPzogQWJvcnRTaWduYWw7XG4gIH0pOiBQcm9taXNlPFxuICAgIFN1Y2Nlc3NSZXNwb25zZTxVaW50OEFycmF5PiB8IEVycm9yQWNjZXNzRGVuaWVkIHwgRXJyb3JCYXNpYyB8IG51bGxcbiAgPiB7XG4gICAgY29uc3QgeyBmaWxlQ29udGVudCB9ID0gYXdhaXQgdGhpcy4jdGh1bmRlcihcInF1ZXJ5XCIsIHtcbiAgICAgIHNjYWxhcnM6IHtcbiAgICAgICAgQnl0ZXM6IHtcbiAgICAgICAgICBkZWNvZGU6IChlOiB1bmtub3duKSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhlLCB0eXBlb2YgZSk7XG4gICAgICAgICAgICByZXR1cm4gVWludDhBcnJheS5mcm9tKFsxLCAyLCAzXSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBlbmNvZGU6IChlOiB1bmtub3duKSA9PiAoZSBhcyBVaW50OEFycmF5KS50b1N0cmluZygpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KSh7XG4gICAgICBmaWxlQ29udGVudDogW1xuICAgICAgICB7IGZpbGVJZCB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCIuLi5vbiBFcnJvckFjY2Vzc0RlbmllZFwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgbWVzc2FnZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCIuLi5vbiBFcnJvckJhc2ljXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi4uLm9uIEZpbGVDb250ZW50UmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIGZpbGU6IHtcbiAgICAgICAgICAgICAgXCIuLi5vbiBGaWxlQ29udGVudENsb3VkXCI6IHtcbiAgICAgICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgICAgIHBhcnRzOiB7XG4gICAgICAgICAgICAgICAgICBjb250ZW50VXJsOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgb3JkZXI6IHRydWUsXG4gICAgICAgICAgICAgICAgICBtZDU6IHRydWVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGtleTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBwdWJsaWNLZXk6IHRydWUsXG4gICAgICAgICAgICAgICAgdG90YWxTaXplOiB0cnVlLFxuICAgICAgICAgICAgICAgIG1kNTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBtZDVFbmNyeXB0ZWQ6IHRydWVcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgXCIuLi5vbiBGaWxlQ29udGVudExpdGVcIjoge1xuICAgICAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICAgICAgY29udGVudDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBpZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBrZXk6IHRydWUsXG4gICAgICAgICAgICAgICAgcHVibGljS2V5OiB0cnVlLFxuICAgICAgICAgICAgICAgIG1kNTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBtZDVFbmNyeXB0ZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgdG90YWxTaXplOiB0cnVlXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIFwiLi4ub24gRmlsZUNvbnRlbnRSZWNlaXZlZE1haWxcIjoge1xuICAgICAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICAgICAgbWF5YmVQYXJ0czoge1xuICAgICAgICAgICAgICAgICAgY29udGVudFVybDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgIG9yZGVyOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgbWQ1OiB0cnVlXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBtYXliZUNvbnRlbnQ6IHRydWUsXG4gICAgICAgICAgICAgICAga2V5OiB0cnVlLFxuICAgICAgICAgICAgICAgIHNlbmRlclB1YmxpY0tleTogdHJ1ZSxcbiAgICAgICAgICAgICAgICB0b3RhbFNpemU6IHRydWUsXG4gICAgICAgICAgICAgICAgbWQ1OiB0cnVlLFxuICAgICAgICAgICAgICAgIG1kNUVuY3J5cHRlZDogdHJ1ZVxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBcIi4uLm9uIEZpbGVDb250ZW50U2VudE1haWxcIjoge1xuICAgICAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICAgICAgbWF5YmVQYXJ0czoge1xuICAgICAgICAgICAgICAgICAgY29udGVudFVybDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgIG9yZGVyOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgbWQ1OiB0cnVlXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBtYXliZUNvbnRlbnQ6IHRydWUsXG4gICAgICAgICAgICAgICAga2V5OiB0cnVlLFxuICAgICAgICAgICAgICAgIHRvdGFsU2l6ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBtZDU6IHRydWUsXG4gICAgICAgICAgICAgICAgbWQ1RW5jcnlwdGVkOiB0cnVlXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9KTtcblxuICAgIGlmICghZmlsZUNvbnRlbnQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChmaWxlQ29udGVudC5fX3R5cGVuYW1lID09PSBcIkVycm9yQWNjZXNzRGVuaWVkXCIpIHtcbiAgICAgIHJldHVybiBmaWxlQ29udGVudDtcbiAgICB9XG5cbiAgICBpZiAoZmlsZUNvbnRlbnQuX190eXBlbmFtZSA9PT0gXCJFcnJvckJhc2ljXCIpIHtcbiAgICAgIHJldHVybiBmaWxlQ29udGVudDtcbiAgICB9XG5cbiAgICBjb25zdCBmaWxlID0gZmlsZUNvbnRlbnQuZmlsZTtcbiAgICBpZiAoIWZpbGUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IHByb2dyZXNzUGFydHM6IFJlY29yZDxudW1iZXIsIERvd25sb2FkUHJvZ3Jlc3M+ID0ge307XG4gICAgY29uc3Qgb25Qcm9ncmVzcyA9IChcbiAgICAgIHBhcnQ6IG51bWJlcixcbiAgICAgIHByb2dyZXNzRXZlbnQ6IERvd25sb2FkUHJvZ3Jlc3NcbiAgICApOiB2b2lkID0+IHtcbiAgICAgIHByb2dyZXNzUGFydHNbcGFydF0gPSBwcm9ncmVzc0V2ZW50O1xuICAgICAgY29uc3QgdHJhbnNmZXJyZWRCeXRlcyA9IE9iamVjdC52YWx1ZXMocHJvZ3Jlc3NQYXJ0cykucmVkdWNlKFxuICAgICAgICAocHJ2LCBjdXIpID0+IHBydiArIGN1ci50cmFuc2ZlcnJlZEJ5dGVzLFxuICAgICAgICAwXG4gICAgICApO1xuICAgICAgY29uc3QgdG90YWxCeXRlcyA9IE51bWJlcihmaWxlLnRvdGFsU2l6ZSk7XG4gICAgICBvbkRvd25sb2FkUHJvZ3Jlc3M/Lih7XG4gICAgICAgIHBlcmNlbnQ6IHRyYW5zZmVycmVkQnl0ZXMgLyB0b3RhbEJ5dGVzLFxuICAgICAgICB0b3RhbEJ5dGVzLFxuICAgICAgICB0cmFuc2ZlcnJlZEJ5dGVzXG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgY29uc3QgZW5jcnlwdGVkQ29udGVudEZyb21QYXJ0cyA9IGFzeW5jIChcbiAgICAgIGZpbGVQYXJ0czogRmlsZUNvbnRlbnRQYXJ0W11cbiAgICApOiBQcm9taXNlPFVpbnQ4QXJyYXk+ID0+IHtcbiAgICAgIGNvbnN0IHBhcnRzID0gbmV3IEFycmF5PHsgZGF0YTogVWludDhBcnJheTsgb3JkZXI6IG51bWJlciB9PigpO1xuXG4gICAgICBjb25zdCBieVBhcnQgPSBhc3luYyAocGFydDogRmlsZUNvbnRlbnRQYXJ0KTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICAgIGNvbnN0IGJ1ZiA9IG5ldyBVaW50OEFycmF5KFxuICAgICAgICAgIGF3YWl0IGt5XG4gICAgICAgICAgICAuZ2V0KHBhcnQuY29udGVudFVybCwge1xuICAgICAgICAgICAgICB0aW1lb3V0OiBmYWxzZSxcbiAgICAgICAgICAgICAgb25Eb3dubG9hZFByb2dyZXNzOiBwciA9PiBvblByb2dyZXNzKHBhcnQub3JkZXIsIHByKSxcbiAgICAgICAgICAgICAgc2lnbmFsOiBzaWduYWxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuYXJyYXlCdWZmZXIoKVxuICAgICAgICApO1xuICAgICAgICBjb25zdCBtZDVQYXJ0ID0gYXdhaXQgbWQ1KGJ1Zik7XG4gICAgICAgIGlmIChtZDVQYXJ0ICE9PSBwYXJ0Lm1kNSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBJbnZhbGlkIG1kNSBmb3IgcGFydCAke3BhcnQub3JkZXJ9IG9mIGZpbGUgJHtmaWxlSWR9YFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcGFydHMucHVzaCh7XG4gICAgICAgICAgZGF0YTogYnVmLFxuICAgICAgICAgIG9yZGVyOiBwYXJ0Lm9yZGVyXG4gICAgICAgIH0pO1xuICAgICAgfTtcblxuICAgICAgYXdhaXQgcHJvbWlzZUFsbExpbWl0KFxuICAgICAgICAzLFxuICAgICAgICBmaWxlUGFydHMubWFwKHAgPT4gKCk6IFByb21pc2U8dm9pZD4gPT4gYnlQYXJ0KHApKVxuICAgICAgKTtcblxuICAgICAgcmV0dXJuIGNvbmNhdGVuYXRlKFxuICAgICAgICAuLi5wYXJ0cy5zb3J0KChhLCBiKSA9PiBhLm9yZGVyIC0gYi5vcmRlcikubWFwKHAgPT4gcC5kYXRhKVxuICAgICAgKTtcbiAgICB9O1xuXG4gICAgY29uc3QgZmluYWxpemUgPSBhc3luYyAoXG4gICAgICBlbmNyeXB0ZWRDb250ZW50OiBVaW50OEFycmF5XG4gICAgKTogUHJvbWlzZTxVaW50OEFycmF5PiA9PiB7XG4gICAgICAvLyBjb25zdCBtZDVFbmNyeXB0ZWQgPSBhd2FpdCBmaXJzdFZhbHVlRnJvbShtZDUob2YoZW5jcnlwdGVkQ29udGVudCkpKTtcbiAgICAgIGNvbnN0IG1kNUVuY3J5cHRlZCA9IGF3YWl0IG1kNShlbmNyeXB0ZWRDb250ZW50KTtcblxuICAgICAgaWYgKG1kNUVuY3J5cHRlZCAhPT0gZmlsZS5tZDVFbmNyeXB0ZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFbmNyeXB0ZWQgY29udGVudCBkb2VzIG5vdCBtYXRjaGApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBrZXkgPSBkZWNyeXB0Q3J5cHRvQm94KFxuICAgICAgICBzb2RpdW0uZnJvbV9oZXgoZmlsZS5rZXkpLFxuICAgICAgICBmaWxlLl9fdHlwZW5hbWUgPT09IFwiRmlsZUNvbnRlbnRSZWNlaXZlZE1haWxcIlxuICAgICAgICAgID8gZmlsZS5zZW5kZXJQdWJsaWNLZXlcbiAgICAgICAgICA6IGZpbGUuX190eXBlbmFtZSA9PT0gXCJGaWxlQ29udGVudENsb3VkXCJcbiAgICAgICAgICA/IGZpbGUucHVibGljS2V5XG4gICAgICAgICAgOiB0aGlzLiNrZXlzLnB1YmxpY0tleSxcbiAgICAgICAgdGhpcy4ja2V5cy5wcml2YXRlS2V5XG4gICAgICApO1xuXG4gICAgICBjb25zdCBzcmMgPSBhd2FpdCBkZWNyeXB0KGtleSwgZW5jcnlwdGVkQ29udGVudCwgcHJvZ3Jlc3NEZWNyeXB0LCBzaWduYWwpO1xuXG4gICAgICAvLyBjb25zdCBtZDVDb250ZW50ID0gYXdhaXQgZmlyc3RWYWx1ZUZyb20obWQ1KG9mKHNyYykpKTtcbiAgICAgIGNvbnN0IG1kNUNvbnRlbnQgPSBhd2FpdCBtZDUoc3JjKTtcblxuICAgICAgaWYgKG1kNUNvbnRlbnQgIT09IGZpbGUubWQ1KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ29udGVudCBkb2VzIG5vdCBtYXRjaGApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdW5jb21wcmVzcyhzcmMpO1xuICAgIH07XG5cbiAgICBjb25zdCBlbmNyeXB0ZWRDb250ZW50ID1cbiAgICAgIGZpbGUuX190eXBlbmFtZSA9PT0gXCJGaWxlQ29udGVudExpdGVcIlxuICAgICAgICA/IGZpbGUuY29udGVudFxuICAgICAgICA6IGZpbGUuX190eXBlbmFtZSA9PT0gXCJGaWxlQ29udGVudENsb3VkXCJcbiAgICAgICAgPyBhd2FpdCBlbmNyeXB0ZWRDb250ZW50RnJvbVBhcnRzKGZpbGUucGFydHMpXG4gICAgICAgIDogZmlsZS5tYXliZUNvbnRlbnRcbiAgICAgICAgPyBmaWxlLm1heWJlQ29udGVudFxuICAgICAgICA6IGZpbGUubWF5YmVQYXJ0c1xuICAgICAgICA/IGF3YWl0IGVuY3J5cHRlZENvbnRlbnRGcm9tUGFydHMoZmlsZS5tYXliZVBhcnRzKVxuICAgICAgICA6IG51bGw7XG5cbiAgICBpZiAoIWVuY3J5cHRlZENvbnRlbnQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBfX3R5cGVuYW1lOiBcIlN1Y2Nlc3NSZXNwb25zZVwiLFxuICAgICAgZGF0YTogYXdhaXQgZmluYWxpemUoZW5jcnlwdGVkQ29udGVudClcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgZGVsZXRlRmlsZSh7XG4gICAgZmlsZUlkLFxuICAgIG5vZGVJZFxuICB9OiB7XG4gICAgZmlsZUlkOiBzdHJpbmc7XG4gICAgbm9kZUlkOiBzdHJpbmc7XG4gIH0pOiBQcm9taXNlPFxuICAgIFN1Y2Nlc3NSZXNwb25zZTxib29sZWFuPiB8IEVycm9yQWNjZXNzRGVuaWVkIHwgRXJyb3JOb3RFeGlzdCB8IG51bGxcbiAgPiB7XG4gICAgY29uc3QgeyBkZWxldGVGaWxlIH0gPSBhd2FpdCB0aGlzLiN0aHVuZGVyKFwibXV0YXRpb25cIikoe1xuICAgICAgZGVsZXRlRmlsZTogW1xuICAgICAgICB7XG4gICAgICAgICAgZmlsZUlkLFxuICAgICAgICAgIG5vZGVJZFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCIuLi5vbiBFcnJvckFjY2Vzc0RlbmllZFwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgbWVzc2FnZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCIuLi5vbiBFcnJvck5vdEV4aXN0XCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi4uLm9uIERlbGV0ZUZpbGVSZXNwb25zZVwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgZGVsZXRlRmlsZTogdHJ1ZVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgXVxuICAgIH0pO1xuXG4gICAgaWYgKCFkZWxldGVGaWxlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoZGVsZXRlRmlsZS5fX3R5cGVuYW1lID09PSBcIkVycm9yQWNjZXNzRGVuaWVkXCIpIHtcbiAgICAgIHJldHVybiBkZWxldGVGaWxlO1xuICAgIH1cblxuICAgIGlmIChkZWxldGVGaWxlLl9fdHlwZW5hbWUgPT09IFwiRXJyb3JOb3RFeGlzdFwiKSB7XG4gICAgICByZXR1cm4gZGVsZXRlRmlsZTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgX190eXBlbmFtZTogXCJTdWNjZXNzUmVzcG9uc2VcIixcbiAgICAgIGRhdGE6IGRlbGV0ZUZpbGUuZGVsZXRlRmlsZVxuICAgIH07XG4gIH1cblxuICBhc3luYyBkZWxldGVOb2RlKHtcbiAgICBub2RlSWRcbiAgfToge1xuICAgIG5vZGVJZDogc3RyaW5nO1xuICB9KTogUHJvbWlzZTxTdWNjZXNzUmVzcG9uc2U8Ym9vbGVhbj4gfCBFcnJvckFjY2Vzc0RlbmllZCB8IG51bGw+IHtcbiAgICBjb25zdCB7IGRlbGV0ZU5vZGUgfSA9IGF3YWl0IHRoaXMuI3RodW5kZXIoXCJtdXRhdGlvblwiKSh7XG4gICAgICBkZWxldGVOb2RlOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBpZDogbm9kZUlkXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIi4uLm9uIEVycm9yQWNjZXNzRGVuaWVkXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi4uLm9uIERlbGV0ZU5vZGVSZXNwb25zZVwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgZGVsZXRlTm9kZTogdHJ1ZVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgXVxuICAgIH0pO1xuXG4gICAgaWYgKCFkZWxldGVOb2RlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoZGVsZXRlTm9kZS5fX3R5cGVuYW1lID09PSBcIkVycm9yQWNjZXNzRGVuaWVkXCIpIHtcbiAgICAgIHJldHVybiBkZWxldGVOb2RlO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBfX3R5cGVuYW1lOiBcIlN1Y2Nlc3NSZXNwb25zZVwiLFxuICAgICAgZGF0YTogZGVsZXRlTm9kZS5kZWxldGVOb2RlXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGVtcHR5VHJhc2goKTogUHJvbWlzZTxcbiAgICBTdWNjZXNzUmVzcG9uc2U8Ym9vbGVhbj4gfCBFcnJvckFjY2Vzc0RlbmllZCB8IG51bGxcbiAgPiB7XG4gICAgY29uc3QgeyBlbXB0eUNsb3VkVHJhc2ggfSA9IGF3YWl0IHRoaXMuI3RodW5kZXIoXCJtdXRhdGlvblwiKSh7XG4gICAgICBlbXB0eUNsb3VkVHJhc2g6IHtcbiAgICAgICAgXCIuLi5vbiBFcnJvckFjY2Vzc0RlbmllZFwiOiB7XG4gICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiLi4ub24gRW1wdHlDbG91ZFRyYXNoUmVzcG9uc2VcIjoge1xuICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgZW1wdHlDbG91ZFRyYXNoOiB0cnVlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmICghZW1wdHlDbG91ZFRyYXNoKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoZW1wdHlDbG91ZFRyYXNoLl9fdHlwZW5hbWUgPT09IFwiRXJyb3JBY2Nlc3NEZW5pZWRcIikge1xuICAgICAgcmV0dXJuIGVtcHR5Q2xvdWRUcmFzaDtcbiAgICB9XG5cbiAgICBpZiAoIWVtcHR5Q2xvdWRUcmFzaC5lbXB0eUNsb3VkVHJhc2gpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBfX3R5cGVuYW1lOiBcIlN1Y2Nlc3NSZXNwb25zZVwiLFxuICAgICAgZGF0YTogZW1wdHlDbG91ZFRyYXNoLmVtcHR5Q2xvdWRUcmFzaFxuICAgIH07XG4gIH1cblxuICBhc3luYyByZWNvdmVyTm9kZShcbiAgICBpZDogc3RyaW5nXG4gICk6IFByb21pc2U8XG4gICAgU3VjY2Vzc1Jlc3BvbnNlPGJvb2xlYW4+IHwgRXJyb3JBY2Nlc3NEZW5pZWQgfCBFcnJvck5vdEV4aXN0IHwgbnVsbFxuICA+IHtcbiAgICBjb25zdCB7IHJlY292ZXJOb2RlIH0gPSBhd2FpdCB0aGlzLiN0aHVuZGVyKFwibXV0YXRpb25cIikoe1xuICAgICAgcmVjb3Zlck5vZGU6IFtcbiAgICAgICAgeyBpZCB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCIuLi5vbiBFcnJvckFjY2Vzc0RlbmllZFwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgbWVzc2FnZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCIuLi5vbiBFcnJvck5vdEV4aXN0XCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi4uLm9uIFJlY292ZXJOb2RlUmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIHJlY292ZXJOb2RlOiB0cnVlXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfSk7XG5cbiAgICBpZiAoIXJlY292ZXJOb2RlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAocmVjb3Zlck5vZGUuX190eXBlbmFtZSA9PT0gXCJFcnJvckFjY2Vzc0RlbmllZFwiKSB7XG4gICAgICByZXR1cm4gcmVjb3Zlck5vZGU7XG4gICAgfVxuXG4gICAgaWYgKHJlY292ZXJOb2RlLl9fdHlwZW5hbWUgPT09IFwiRXJyb3JOb3RFeGlzdFwiKSB7XG4gICAgICByZXR1cm4gcmVjb3Zlck5vZGU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIF9fdHlwZW5hbWU6IFwiU3VjY2Vzc1Jlc3BvbnNlXCIsXG4gICAgICBkYXRhOiByZWNvdmVyTm9kZS5yZWNvdmVyTm9kZSA/PyBmYWxzZVxuICAgIH07XG4gIH1cblxuICBhc3luYyBtb3ZlTm9kZXMoe1xuICAgIG5vZGVJZHMsXG4gICAgcGFyZW50Tm9kZUlkXG4gIH06IHtcbiAgICBub2RlSWRzOiBzdHJpbmdbXTtcbiAgICBwYXJlbnROb2RlSWQ/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkO1xuICB9KTogUHJvbWlzZTxTdWNjZXNzUmVzcG9uc2U8Ym9vbGVhbj4gfCBFcnJvckFjY2Vzc0RlbmllZCB8IG51bGw+IHtcbiAgICBjb25zdCB7IG1vdmVOb2RlcyB9ID0gYXdhaXQgdGhpcy4jdGh1bmRlcihcIm11dGF0aW9uXCIpKHtcbiAgICAgIG1vdmVOb2RlczogW1xuICAgICAgICB7XG4gICAgICAgICAgbm9kZUlkcyxcbiAgICAgICAgICBwYXJlbnROb2RlSWRcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwiLi4ub24gRXJyb3JBY2Nlc3NEZW5pZWRcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLi4ub24gTW92ZU5vZGVzUmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG1vdmVOb2RlczogdHJ1ZVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgXVxuICAgIH0pO1xuXG4gICAgaWYgKCFtb3ZlTm9kZXMpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChtb3ZlTm9kZXMuX190eXBlbmFtZSA9PT0gXCJFcnJvckFjY2Vzc0RlbmllZFwiKSB7XG4gICAgICByZXR1cm4gbW92ZU5vZGVzO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBfX3R5cGVuYW1lOiBcIlN1Y2Nlc3NSZXNwb25zZVwiLFxuICAgICAgZGF0YTogbW92ZU5vZGVzLm1vdmVOb2RlcyA/PyBmYWxzZVxuICAgIH07XG4gIH1cblxuICBhc3luYyBzYXZlSW5DbG91ZCh7XG4gICAgZmlsZUlkLFxuICAgIG5hbWUsXG4gICAgbm9kZUlkXG4gIH06IHtcbiAgICBmaWxlSWQ6IHN0cmluZztcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgbm9kZUlkPzogc3RyaW5nO1xuICB9KTogUHJvbWlzZTxcbiAgICB8IFN1Y2Nlc3NSZXNwb25zZTxOb2RlRnVsbD5cbiAgICB8IEVycm9yQWNjZXNzRGVuaWVkXG4gICAgfCBFcnJvckJhc2ljXG4gICAgfCBFcnJvckxpbWl0XG4gICAgfCBFcnJvck5vdEZvdW5kXG4gICAgfCBFcnJvck5vdEV4aXN0XG4gICAgfCBudWxsXG4gID4ge1xuICAgIGlmIChub2RlSWQgJiYgIW5vZGVzQ2FjaGUuaGFzKG5vZGVJZCkpIHtcbiAgICAgIGF3YWl0IHRoaXMubm9kZSh7IGlkOiBub2RlSWQgfSk7XG4gICAgICBpZiAoIW5vZGVzQ2FjaGUuaGFzKG5vZGVJZCkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBfX3R5cGVuYW1lOiBcIkVycm9yQmFzaWNcIixcbiAgICAgICAgICBtZXNzYWdlOiBgVGhlIG5vZGUgJHtub2RlSWR9IGRvZXMgbm90IGV4aXN0c2BcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQga2V5ID0gXCJcIjtcblxuICAgIGNvbnN0IGZpbGUgPSBmaWxlc0NhY2hlLmdldChmaWxlSWQpO1xuXG4gICAgaWYgKCFmaWxlKSB7XG4gICAgICBhd2FpdCB0aGlzLmZpbGVNZXRhZGF0YSh7IGlkOiBmaWxlSWQgfSk7XG4gICAgICBjb25zdCBmaWxlID0gZmlsZXNDYWNoZS5nZXQoZmlsZUlkKSA/PyBudWxsO1xuICAgICAgaWYgKCFmaWxlKSB7XG4gICAgICAgIGNvbnN0IHJlY2VpdmVkTWFpbHMgPSBhd2FpdCB0aGlzLiNjbGllbnQubWFpbC5yZWNlaXZlZE1haWxzKCk7XG4gICAgICAgIGlmICghcmVjZWl2ZWRNYWlscykge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZWNlaXZlZE1haWxzLl9fdHlwZW5hbWUgIT09IFwiU3VjY2Vzc1Jlc3BvbnNlXCIpIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtYWlsID0gcmVjZWl2ZWRNYWlscy5kYXRhLmZpbmQobSA9PlxuICAgICAgICAgIG0uZmlsZXMuc29tZShmID0+IGYuaWQgPT09IGZpbGVJZClcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoIW1haWwpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgX190eXBlbmFtZTogXCJFcnJvckJhc2ljXCIsXG4gICAgICAgICAgICBtZXNzYWdlOiBgQ2FuJ3QgZmluZCBtYWlsIHdpdGggdGhlIGZpbGUgJHtmaWxlSWR9YFxuICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmaWxlTWFpbCA9IG1haWwuZmlsZXMuZmluZChmID0+IGYuaWQgPT09IGZpbGVJZCk7XG5cbiAgICAgICAgaWYgKCFmaWxlTWFpbCkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiBcIkVycm9yQmFzaWNcIixcbiAgICAgICAgICAgIG1lc3NhZ2U6IGBDYW4ndCBmaW5kIG1haWwgd2l0aCB0aGUgZmlsZSAke2ZpbGVJZH1gXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZpbGVLZXkgPSBkZWNyeXB0Q3J5cHRvQm94KFxuICAgICAgICAgIHNvZGl1bS5mcm9tX2hleChmaWxlTWFpbC5rZXkpLFxuICAgICAgICAgIG1haWwuc2VuZGVyLnB1YmxpY0tleSxcbiAgICAgICAgICB0aGlzLiNrZXlzLnByaXZhdGVLZXlcbiAgICAgICAgKTtcblxuICAgICAgICBrZXkgPSBzb2RpdW0udG9faGV4KGZpbGVLZXkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAga2V5ID0gZmlsZS5rZXk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGtleSA9IGZpbGUua2V5O1xuICAgIH1cblxuICAgIGlmIChrZXkgPT09IFwiXCIpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIF9fdHlwZW5hbWU6IFwiRXJyb3JCYXNpY1wiLFxuICAgICAgICBtZXNzYWdlOiBcIlVuZXhwZWN0ZWQgZXJyb3IgM1wiXG4gICAgICB9O1xuICAgIH1cblxuICAgIGtleSA9IHNvZGl1bS50b19oZXgoXG4gICAgICBlbmNyeXB0Q3J5cHRvQm94KFxuICAgICAgICBzb2RpdW0uZnJvbV9oZXgoa2V5KSxcbiAgICAgICAgdGhpcy4ja2V5cy5wdWJsaWNLZXksXG4gICAgICAgIHRoaXMuI2tleXMucHJpdmF0ZUtleVxuICAgICAgKVxuICAgICk7XG5cbiAgICBjb25zdCBuYW1lS2V5ID0gc2VjcmV0c3RyZWFtS2V5Z2VuKCk7XG4gICAgY29uc3QgZW5jcnlwdGVkTmFtZSA9IGF3YWl0IGVuY3J5cHROYW1lKG5hbWUsIHNvZGl1bS50b19oZXgobmFtZUtleSkpO1xuICAgIGNvbnN0IGVuY3J5cHRlZE5hbWVLZXkgPSBzb2RpdW0udG9faGV4KFxuICAgICAgZW5jcnlwdENyeXB0b0JveChuYW1lS2V5LCB0aGlzLiNrZXlzLnB1YmxpY0tleSwgdGhpcy4ja2V5cy5wcml2YXRlS2V5KVxuICAgICk7XG5cbiAgICBjb25zdCB7IHNhdmVJbkNsb3VkIH0gPSBhd2FpdCB0aGlzLiN0aHVuZGVyKFwibXV0YXRpb25cIikoe1xuICAgICAgc2F2ZUluQ2xvdWQ6IFtcbiAgICAgICAge1xuICAgICAgICAgIGZpbGVJZCxcbiAgICAgICAgICBrZXksXG4gICAgICAgICAgbm9kZUlkLFxuICAgICAgICAgIGZpbGVuYW1lOiBlbmNyeXB0ZWROYW1lLFxuICAgICAgICAgIG5hbWVLZXk6IGVuY3J5cHRlZE5hbWVLZXlcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwiLi4ub24gRXJyb3JBY2Nlc3NEZW5pZWRcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLi4ub24gRXJyb3JOb3RGb3VuZFwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgbWVzc2FnZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCIuLi5vbiBFcnJvckxpbWl0XCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi4uLm9uIEVycm9yQmFzaWNcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLi4ub24gRXJyb3JOb3RFeGlzdFwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgbWVzc2FnZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCIuLi5vbiBTYXZlSW5DbG91ZFJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBzYXZlSW5DbG91ZDogbm9kZUZ1bGxTZWxlY3RvclxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgXVxuICAgIH0pO1xuXG4gICAgaWYgKCFzYXZlSW5DbG91ZCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKHNhdmVJbkNsb3VkLl9fdHlwZW5hbWUgPT09IFwiRXJyb3JBY2Nlc3NEZW5pZWRcIikge1xuICAgICAgcmV0dXJuIHNhdmVJbkNsb3VkO1xuICAgIH1cblxuICAgIGlmIChzYXZlSW5DbG91ZC5fX3R5cGVuYW1lID09PSBcIkVycm9yTm90Rm91bmRcIikge1xuICAgICAgcmV0dXJuIHNhdmVJbkNsb3VkO1xuICAgIH1cbiAgICBpZiAoc2F2ZUluQ2xvdWQuX190eXBlbmFtZSA9PT0gXCJFcnJvckxpbWl0XCIpIHtcbiAgICAgIHJldHVybiBzYXZlSW5DbG91ZDtcbiAgICB9XG5cbiAgICBpZiAoc2F2ZUluQ2xvdWQuX190eXBlbmFtZSA9PT0gXCJFcnJvckJhc2ljXCIpIHtcbiAgICAgIHJldHVybiBzYXZlSW5DbG91ZDtcbiAgICB9XG5cbiAgICBpZiAoc2F2ZUluQ2xvdWQuX190eXBlbmFtZSA9PT0gXCJFcnJvck5vdEV4aXN0XCIpIHtcbiAgICAgIHJldHVybiBzYXZlSW5DbG91ZDtcbiAgICB9XG5cbiAgICBpZiAoIXNhdmVJbkNsb3VkLnNhdmVJbkNsb3VkKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBub2RlID0gYXdhaXQgZ3FsTm9kZVRvRXh0ZXJuYWxOb2RlRnVsbChcbiAgICAgIHNhdmVJbkNsb3VkLnNhdmVJbkNsb3VkLFxuICAgICAgdGhpcy4ja2V5c1xuICAgICk7XG5cbiAgICBjb25zdCBtZSA9IG5vZGUucGFyZW50Py51c2Vycy5maW5kKFxuICAgICAgKFt1XSkgPT4gdS5wdWJsaWNLZXkgPT09IHRoaXMuI2tleXMucHVibGljS2V5XG4gICAgKTtcblxuICAgIGlmIChtZSAmJiBbXCJhZG1pblwiLCBcIndyaXRlXCJdLmluY2x1ZGVzKG1lWzFdKSkge1xuICAgICAgY29uc3Qgb3RoZXJzID1cbiAgICAgICAgbm9kZS5wYXJlbnQ/LnVzZXJzLmZpbHRlcihcbiAgICAgICAgICAoW3VdKSA9PiB1LnB1YmxpY0tleSAhPT0gdGhpcy4ja2V5cy5wdWJsaWNLZXlcbiAgICAgICAgKSA/PyBbXTtcblxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIG90aGVycy5tYXAoKFt1LCByaWdodHNdKSA9PlxuICAgICAgICAgIHRoaXMuc2hhcmVOb2RlKHtcbiAgICAgICAgICAgIG5vZGVJZDogbm9kZS5pZCxcbiAgICAgICAgICAgIHJpZ2h0cyxcbiAgICAgICAgICAgIHVzZXJJZDogdS5pZFxuICAgICAgICAgIH0pXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIF9fdHlwZW5hbWU6IFwiU3VjY2Vzc1Jlc3BvbnNlXCIsXG4gICAgICBkYXRhOiBub2RlXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgcGVyTm9kZSA9IGFzeW5jIChcbiAgICBub2RlSWQ6IHN0cmluZyxcbiAgICBwdWJsaWNLZXk6IHN0cmluZ1xuICApOiBQcm9taXNlPE5hbWVLZXlJbnB1dCB8IG51bGw+ID0+IHtcbiAgICBsZXQgbm9kZSA9IG5vZGVzQ2FjaGUuZ2V0KG5vZGVJZCk7XG5cbiAgICBpZiAoIW5vZGUpIHtcbiAgICAgIGF3YWl0IHRoaXMubm9kZSh7IGlkOiBub2RlSWQgfSk7XG4gICAgICBub2RlID0gbm9kZXNDYWNoZS5nZXQobm9kZUlkKTtcblxuICAgICAgaWYgKCFub2RlKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IG5hbWVLZXkgPSBub2RlLmFjY2Vzcz8ubmFtZUtleTtcblxuICAgIGlmICghbmFtZUtleSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiBub2RlLmlkLFxuICAgICAgbmFtZUtleTogc29kaXVtLnRvX2hleChcbiAgICAgICAgZW5jcnlwdENyeXB0b0JveChcbiAgICAgICAgICBzb2RpdW0uZnJvbV9oZXgobmFtZUtleSksXG4gICAgICAgICAgcHVibGljS2V5LFxuICAgICAgICAgIHRoaXMuI2tleXMucHJpdmF0ZUtleVxuICAgICAgICApXG4gICAgICApLFxuICAgICAgZmlsZXM6XG4gICAgICAgIFwiaGlzdG9yeVwiIGluIG5vZGVcbiAgICAgICAgICA/IG5vZGUuaGlzdG9yeS5tYXAoZiA9PiAoe1xuICAgICAgICAgICAgICBpZDogZi5pZCxcbiAgICAgICAgICAgICAga2V5OiBzb2RpdW0udG9faGV4KFxuICAgICAgICAgICAgICAgIGVuY3J5cHRDcnlwdG9Cb3goXG4gICAgICAgICAgICAgICAgICBzb2RpdW0uZnJvbV9oZXgoZi5rZXkpLFxuICAgICAgICAgICAgICAgICAgcHVibGljS2V5LFxuICAgICAgICAgICAgICAgICAgdGhpcy4ja2V5cy5wcml2YXRlS2V5XG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9KSlcbiAgICAgICAgICA6IFtdXG4gICAgfTtcbiAgfTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7O0FBQUE7QUFDQSxPQUFPQSxLQUFQLE1B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