@secrecy/lib 1.0.0-dev.6 → 1.0.0-dev.60
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/BaseClient.d.ts +123 -0
- package/dist/BaseClient.js +569 -0
- package/{lib → dist}/PopupTools.d.ts +1 -1
- package/dist/PopupTools.js +216 -0
- package/{lib → dist}/ZeusThunder.d.ts +0 -0
- package/dist/ZeusThunder.js +79 -0
- package/dist/cache.d.ts +6 -0
- package/dist/cache.js +4 -0
- package/dist/client/SecrecyAppClient.d.ts +17 -0
- package/dist/client/SecrecyAppClient.js +256 -0
- package/dist/client/SecrecyCloudClient.d.ts +89 -0
- package/dist/client/SecrecyCloudClient.js +1627 -0
- package/dist/client/SecrecyDbClient.d.ts +21 -0
- package/dist/client/SecrecyDbClient.js +198 -0
- package/dist/client/SecrecyMailClient.d.ts +42 -0
- package/dist/client/SecrecyMailClient.js +1187 -0
- package/dist/client/SecrecyPayClient.d.ts +7 -0
- package/dist/client/SecrecyPayClient.js +37 -0
- package/dist/client/SecrecyWalletClient.d.ts +30 -0
- package/dist/client/SecrecyWalletClient.js +76 -0
- package/{lib → dist}/client/convert/file.d.ts +3 -3
- package/dist/client/convert/file.js +34 -0
- package/dist/client/convert/mail.d.ts +3 -0
- package/dist/client/convert/mail.js +48 -0
- package/dist/client/convert/node.d.ts +9 -0
- package/dist/client/convert/node.js +100 -0
- package/{lib → dist}/client/helpers.d.ts +6 -1
- package/dist/client/helpers.js +126 -0
- package/dist/client/index.d.ts +34 -0
- package/dist/client/index.js +52 -0
- package/{lib → dist}/client/storage.d.ts +0 -0
- package/dist/client/storage.js +12 -0
- package/dist/client/types/File.d.ts +14 -0
- package/dist/client/types/File.js +3 -0
- package/{lib → dist}/client/types/Inputs.d.ts +2 -7
- package/dist/client/types/Inputs.js +3 -0
- package/dist/client/types/Node.d.ts +56 -0
- package/dist/client/types/Node.js +3 -0
- package/dist/client/types/UserAppNotifications.d.ts +6 -0
- package/dist/client/types/UserAppNotifications.js +3 -0
- package/{lib → dist}/client/types/UserAppSettings.d.ts +1 -3
- package/dist/client/types/UserAppSettings.js +3 -0
- package/{lib → dist}/client/types/index.d.ts +10 -43
- package/dist/client/types/index.js +8 -0
- package/dist/client/types/selectors.d.ts +400 -0
- package/dist/client/types/selectors.js +138 -0
- package/{lib → dist}/crypto/file.d.ts +0 -0
- package/dist/crypto/file.js +210 -0
- package/{lib → dist}/crypto/index.d.ts +0 -0
- package/dist/crypto/index.js +47 -0
- package/dist/error.d.ts +30 -0
- package/dist/error.js +3 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.js +9 -0
- package/{lib → dist}/minify/index.d.ts +0 -0
- package/dist/minify/index.js +28 -0
- package/{lib → dist}/minify/lz4.d.ts +0 -0
- package/dist/minify/lz4.js +627 -0
- package/{lib → dist}/sodium.d.ts +0 -0
- package/dist/sodium.js +6 -0
- package/{lib → dist}/utils/store-buddy.d.ts +0 -0
- package/dist/utils/store-buddy.js +65 -0
- package/{lib → dist}/utils/time.d.ts +0 -0
- package/dist/utils/time.js +14 -0
- package/{lib → dist/utils}/utils.d.ts +0 -0
- package/dist/utils/utils.js +57 -0
- package/{lib → dist}/worker/md5.d.ts +0 -0
- package/dist/worker/md5.js +25 -0
- package/{lib → dist}/worker/sodium.d.ts +0 -0
- package/dist/worker/sodium.js +120 -0
- package/{lib → dist}/worker/workerCodes.d.ts +0 -0
- package/dist/worker/workerCodes.js +255 -0
- package/{lib → dist}/zeus/const.d.ts +5 -0
- package/dist/zeus/const.js +1286 -0
- package/dist/zeus/index.d.ts +6119 -0
- package/dist/zeus/index.js +687 -0
- package/package.json +60 -52
- package/lib/BaseClient.d.ts +0 -266
- package/lib/BaseClient.js +0 -1332
- package/lib/PopupTools.js +0 -213
- package/lib/ZeusThunder.js +0 -112
- package/lib/cache.d.ts +0 -7
- package/lib/cache.js +0 -5
- package/lib/client/convert/file.js +0 -39
- package/lib/client/convert/folder.d.ts +0 -8
- package/lib/client/convert/folder.js +0 -264
- package/lib/client/convert/mail.d.ts +0 -3
- package/lib/client/convert/mail.js +0 -46
- package/lib/client/convert/vFile.d.ts +0 -5
- package/lib/client/convert/vFile.js +0 -164
- package/lib/client/helpers.js +0 -116
- package/lib/client/index.d.ts +0 -166
- package/lib/client/index.js +0 -3697
- package/lib/client/storage.js +0 -12
- package/lib/client/types/File.d.ts +0 -21
- package/lib/client/types/File.js +0 -2
- package/lib/client/types/FilesOnUsersOnApplications.d.ts +0 -9
- package/lib/client/types/FilesOnUsersOnApplications.js +0 -2
- package/lib/client/types/Folder.d.ts +0 -68
- package/lib/client/types/Folder.js +0 -7
- package/lib/client/types/Inputs.js +0 -2
- package/lib/client/types/UserAppSettings.js +0 -2
- package/lib/client/types/VFile.d.ts +0 -62
- package/lib/client/types/VFile.js +0 -4
- package/lib/client/types/index.js +0 -8
- package/lib/client/types/queries.d.ts +0 -535
- package/lib/client/types/queries.js +0 -192
- package/lib/crypto/file.js +0 -291
- package/lib/crypto/index.js +0 -37
- package/lib/index.d.ts +0 -11
- package/lib/index.js +0 -40
- package/lib/minify/index.js +0 -28
- package/lib/minify/lz4.js +0 -633
- package/lib/sodium.js +0 -28
- package/lib/utils/store-buddy.js +0 -69
- package/lib/utils/time.js +0 -22
- package/lib/utils.js +0 -188
- package/lib/worker/__mock__/sodium.worker.d.ts +0 -19
- package/lib/worker/__mock__/sodium.worker.js +0 -57
- package/lib/worker/md5.js +0 -43
- package/lib/worker/sodium.js +0 -155
- package/lib/worker/workerCodes.js +0 -3
- package/lib/zeus/const.js +0 -1609
- package/lib/zeus/index.d.ts +0 -26113
- 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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
|