@cloudbase/storage 2.23.4-alpha.0 → 2.24.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,701 @@
1
+ "use strict";
2
+ var __assign = (this && this.__assign) || function () {
3
+ __assign = Object.assign || function(t) {
4
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
5
+ s = arguments[i];
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
+ t[p] = s[p];
8
+ }
9
+ return t;
10
+ };
11
+ return __assign.apply(this, arguments);
12
+ };
13
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
14
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
15
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
16
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
17
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
18
+ };
19
+ var __metadata = (this && this.__metadata) || function (k, v) {
20
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
21
+ };
22
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
23
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
24
+ return new (P || (P = Promise))(function (resolve, reject) {
25
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
26
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
27
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
28
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
29
+ });
30
+ };
31
+ var __generator = (this && this.__generator) || function (thisArg, body) {
32
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
33
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
34
+ function verb(n) { return function (v) { return step([n, v]); }; }
35
+ function step(op) {
36
+ if (f) throw new TypeError("Generator is already executing.");
37
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
38
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
39
+ if (y = 0, t) op = [op[0] & 2, t.value];
40
+ switch (op[0]) {
41
+ case 0: case 1: t = op; break;
42
+ case 4: _.label++; return { value: op[1], done: false };
43
+ case 5: _.label++; y = op[1]; op = [0]; continue;
44
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
45
+ default:
46
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
47
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
48
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
49
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
50
+ if (t[2]) _.ops.pop();
51
+ _.trys.pop(); continue;
52
+ }
53
+ op = body.call(thisArg, _);
54
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
55
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
56
+ }
57
+ };
58
+ Object.defineProperty(exports, "__esModule", { value: true });
59
+ exports.CloudbaseStorage = exports.COMPONENT_NAME = void 0;
60
+ var utilities_1 = require("@cloudbase/utilities");
61
+ var EUploadMethod;
62
+ (function (EUploadMethod) {
63
+ EUploadMethod["put"] = "put";
64
+ EUploadMethod["post"] = "post";
65
+ })(EUploadMethod || (EUploadMethod = {}));
66
+ var getSdkName = utilities_1.constants.getSdkName, ERRORS = utilities_1.constants.ERRORS, COMMUNITY_SITE_URL = utilities_1.constants.COMMUNITY_SITE_URL;
67
+ var isArray = utilities_1.utils.isArray, isString = utilities_1.utils.isString, isPalinObject = utilities_1.utils.isPalinObject, execCallback = utilities_1.utils.execCallback;
68
+ var catchErrorsDecorator = utilities_1.helpers.catchErrorsDecorator;
69
+ exports.COMPONENT_NAME = 'storage';
70
+ var storageGateWay = {
71
+ getUploadInfo: function (request, params, customReqOpts) { return __awaiter(void 0, void 0, void 0, function () {
72
+ var res, data;
73
+ var _a;
74
+ return __generator(this, function (_b) {
75
+ switch (_b.label) {
76
+ case 0: return [4, request.gateWay({
77
+ path: 'storages',
78
+ name: 'get-objects-upload-info',
79
+ data: [
80
+ __assign({ objectId: params.path }, (params.headers ? { signedHeader: params.headers } : {})),
81
+ ],
82
+ }, customReqOpts)];
83
+ case 1:
84
+ res = _b.sent();
85
+ data = ((_a = res.data) === null || _a === void 0 ? void 0 : _a[0]) || {};
86
+ res = __assign(__assign({}, res), { data: __assign(__assign({}, (data.code ? __assign({}, data) : {})), { authorization: data.authorization, token: data.token, url: data.uploadUrl, fileId: data.cloudObjectId, cosFileId: data.cloudObjectMeta, download_url: data.downloadUrl }) });
87
+ return [2, res];
88
+ }
89
+ });
90
+ }); },
91
+ getDownLoadInfo: function (request, params, customReqOpts) { return __awaiter(void 0, void 0, void 0, function () {
92
+ var res;
93
+ var _a;
94
+ return __generator(this, function (_b) {
95
+ switch (_b.label) {
96
+ case 0: return [4, request.gateWay({
97
+ path: 'storages',
98
+ name: 'get-objects-download-info',
99
+ data: params.convertedFileList.map(function (v) { return ({ cloudObjectId: v.fileid }); }),
100
+ }, customReqOpts)];
101
+ case 1:
102
+ res = _b.sent();
103
+ res = __assign(__assign({}, res), { data: {
104
+ download_list: (_a = res.data) === null || _a === void 0 ? void 0 : _a.map(function (v) { return ({
105
+ code: v.code || 'SUCCESS',
106
+ message: v.message,
107
+ fileid: v.cloudObjectId,
108
+ download_url: v.downloadUrl,
109
+ fileID: v.cloudObjectId,
110
+ tempFileURL: v.downloadUrl,
111
+ }); }),
112
+ } });
113
+ return [2, res];
114
+ }
115
+ });
116
+ }); },
117
+ delete: function (request, params, customReqOpts) { return __awaiter(void 0, void 0, void 0, function () {
118
+ var res;
119
+ var _a;
120
+ return __generator(this, function (_b) {
121
+ switch (_b.label) {
122
+ case 0: return [4, request.gateWay({
123
+ path: 'storages',
124
+ name: 'delete-objects',
125
+ data: params.fileList.map(function (v) { return ({ cloudObjectId: v }); }),
126
+ }, customReqOpts)];
127
+ case 1:
128
+ res = _b.sent();
129
+ res = __assign(__assign({}, res), { data: {
130
+ delete_list: (_a = res.data) === null || _a === void 0 ? void 0 : _a.map(function (v) { return ({
131
+ code: v.code || 'SUCCESS',
132
+ fileID: v.cloudObjectId,
133
+ message: v.message,
134
+ }); }),
135
+ } });
136
+ return [2, res];
137
+ }
138
+ });
139
+ }); },
140
+ copyFile: function (request, params, customReqOpts) { return __awaiter(void 0, void 0, void 0, function () {
141
+ var res;
142
+ var _a;
143
+ return __generator(this, function (_b) {
144
+ switch (_b.label) {
145
+ case 0: return [4, request.gateWay({
146
+ path: 'storages',
147
+ name: 'copy-objects',
148
+ data: params.convertedFileList.map(function (v) { return ({
149
+ srcPath: v.src_path,
150
+ dstPath: v.dst_path,
151
+ overwrite: v.overwrite,
152
+ removeOriginal: v.remove_original,
153
+ }); }),
154
+ }, customReqOpts)];
155
+ case 1:
156
+ res = _b.sent();
157
+ res = __assign(__assign({}, res), { data: {
158
+ copy_list: (_a = res.data) === null || _a === void 0 ? void 0 : _a.map(function (v) { return ({
159
+ code: v.code || 'SUCCESS',
160
+ fileID: v.cloudObjectId,
161
+ message: v.message,
162
+ }); }),
163
+ } });
164
+ return [2, res];
165
+ }
166
+ });
167
+ }); },
168
+ };
169
+ var CloudbaseStorage = exports.CloudbaseStorage = (function () {
170
+ function CloudbaseStorage() {
171
+ }
172
+ CloudbaseStorage.prototype.isGateWay = function () {
173
+ var config = this.config;
174
+ var endPointMode = config.endPointMode || 'CLOUD_API';
175
+ return endPointMode === 'GATEWAY';
176
+ };
177
+ CloudbaseStorage.prototype.uploadFile = function (params, callback) {
178
+ return __awaiter(this, void 0, void 0, function () {
179
+ var cloudPath, filePath, onUploadProgress, method, headers, fileContent, uploadMethod, metadataResult, metadata, requestId, url, authorization, token, fileId, cosFileId, downloadUrl, commonParams, putParams, postParams, uploadConfig, res;
180
+ var _a, _b, _c;
181
+ return __generator(this, function (_d) {
182
+ switch (_d.label) {
183
+ case 0:
184
+ cloudPath = params.cloudPath, filePath = params.filePath, onUploadProgress = params.onUploadProgress, method = (_a = params.method, _a === void 0 ? 'put' : _a), headers = (_b = params.headers, _b === void 0 ? {} : _b), fileContent = params.fileContent;
185
+ if (!isString(cloudPath) || (!filePath && !fileContent)) {
186
+ throw new Error(JSON.stringify({
187
+ code: ERRORS.INVALID_PARAMS,
188
+ msg: "[".concat(exports.COMPONENT_NAME, ".uploadFile] invalid params"),
189
+ }));
190
+ }
191
+ uploadMethod = { put: EUploadMethod.put, post: EUploadMethod.post }[method.toLocaleLowerCase()] || EUploadMethod.put;
192
+ return [4, this.getUploadMetadata({
193
+ cloudPath: cloudPath,
194
+ method: uploadMethod,
195
+ headers: uploadMethod === EUploadMethod.put ? headers : undefined,
196
+ customReqOpts: params.customReqOpts,
197
+ })];
198
+ case 1:
199
+ metadataResult = _d.sent();
200
+ metadata = metadataResult.data, requestId = metadataResult.requestId;
201
+ url = metadata.url, authorization = metadata.authorization, token = metadata.token, fileId = metadata.fileId, cosFileId = metadata.cosFileId, downloadUrl = metadata.download_url;
202
+ commonParams = {
203
+ url: url,
204
+ file: filePath,
205
+ name: cloudPath,
206
+ onUploadProgress: onUploadProgress,
207
+ fileContent: fileContent,
208
+ fileId: fileId,
209
+ requestId: requestId,
210
+ };
211
+ putParams = __assign(__assign({}, commonParams), { method: EUploadMethod.put, headers: __assign(__assign({}, headers), { authorization: authorization, 'x-cos-meta-fileid': cosFileId, 'x-cos-security-token': token }) });
212
+ postParams = __assign(__assign({}, commonParams), { method: EUploadMethod.post, data: {
213
+ key: cloudPath,
214
+ signature: authorization,
215
+ 'x-cos-meta-fileid': cosFileId,
216
+ success_action_status: '201',
217
+ 'x-cos-security-token': token,
218
+ } });
219
+ uploadConfig = (_c = {},
220
+ _c[EUploadMethod.put] = {
221
+ params: putParams,
222
+ isSuccess: function (code) { return code >= 200 && code < 300; },
223
+ },
224
+ _c[EUploadMethod.post] = {
225
+ params: postParams,
226
+ isSuccess: function (code) { return code === 201; },
227
+ },
228
+ _c);
229
+ return [4, this.request.upload(uploadConfig[uploadMethod].params)];
230
+ case 2:
231
+ res = _d.sent();
232
+ if (uploadConfig[uploadMethod].isSuccess(res.statusCode)) {
233
+ return [2, execCallback(callback, null, {
234
+ fileID: fileId,
235
+ download_url: downloadUrl,
236
+ requestId: requestId,
237
+ })];
238
+ }
239
+ return [2, execCallback(callback, new Error("[".concat(getSdkName(), "][").concat(ERRORS.OPERATION_FAIL, "][").concat(exports.COMPONENT_NAME, "]:").concat(res.data)))];
240
+ }
241
+ });
242
+ });
243
+ };
244
+ CloudbaseStorage.prototype.getUploadMetadata = function (params, callback) {
245
+ return __awaiter(this, void 0, void 0, function () {
246
+ var cloudPath, method, headers, request, action, metaData, metaDataParam, err_1;
247
+ return __generator(this, function (_a) {
248
+ switch (_a.label) {
249
+ case 0:
250
+ cloudPath = params.cloudPath, method = params.method, headers = params.headers;
251
+ if (!isString(cloudPath)) {
252
+ throw new Error(JSON.stringify({
253
+ code: ERRORS.INVALID_PARAMS,
254
+ msg: "[".concat(exports.COMPONENT_NAME, ".getUploadMetadata] invalid cloudPath"),
255
+ }));
256
+ }
257
+ request = this.request;
258
+ action = 'storage.getUploadMetadata';
259
+ _a.label = 1;
260
+ case 1:
261
+ _a.trys.push([1, 6, , 7]);
262
+ metaData = void 0;
263
+ metaDataParam = { path: cloudPath };
264
+ if (method) {
265
+ metaDataParam.method = method;
266
+ }
267
+ if (method === EUploadMethod.put && headers) {
268
+ metaDataParam.headers = headers;
269
+ }
270
+ if (!this.isGateWay()) return [3, 3];
271
+ return [4, storageGateWay.getUploadInfo(request, metaDataParam, params.customReqOpts)];
272
+ case 2:
273
+ metaData = _a.sent();
274
+ return [3, 5];
275
+ case 3: return [4, request.send(action, metaDataParam, params.customReqOpts)];
276
+ case 4:
277
+ metaData = _a.sent();
278
+ _a.label = 5;
279
+ case 5: return [2, execCallback(callback, null, metaData)];
280
+ case 6:
281
+ err_1 = _a.sent();
282
+ return [2, execCallback(callback, err_1)];
283
+ case 7: return [2];
284
+ }
285
+ });
286
+ });
287
+ };
288
+ CloudbaseStorage.prototype.deleteFile = function (params, callback) {
289
+ return __awaiter(this, void 0, void 0, function () {
290
+ var fileList, _i, fileList_1, fileId, action, request, res, data;
291
+ return __generator(this, function (_a) {
292
+ switch (_a.label) {
293
+ case 0:
294
+ fileList = params.fileList;
295
+ if (!fileList || !isArray(fileList) || fileList.length === 0) {
296
+ throw new Error(JSON.stringify({
297
+ code: ERRORS.INVALID_PARAMS,
298
+ msg: "[".concat(exports.COMPONENT_NAME, ".deleteFile] fileList must not be empty"),
299
+ }));
300
+ }
301
+ for (_i = 0, fileList_1 = fileList; _i < fileList_1.length; _i++) {
302
+ fileId = fileList_1[_i];
303
+ if (!fileId || !isString(fileId)) {
304
+ throw new Error(JSON.stringify({
305
+ code: ERRORS.INVALID_PARAMS,
306
+ msg: "[".concat(exports.COMPONENT_NAME, ".deleteFile] fileID must be string"),
307
+ }));
308
+ }
309
+ }
310
+ action = 'storage.batchDeleteFile';
311
+ request = this.request;
312
+ res = {};
313
+ if (!this.isGateWay()) return [3, 2];
314
+ return [4, storageGateWay.delete(request, { fileList: fileList }, params.customReqOpts)];
315
+ case 1:
316
+ res = _a.sent();
317
+ return [3, 4];
318
+ case 2: return [4, request.send(action, {
319
+ fileid_list: fileList,
320
+ }, params.customReqOpts)];
321
+ case 3:
322
+ res = _a.sent();
323
+ _a.label = 4;
324
+ case 4:
325
+ if (res.code) {
326
+ return [2, execCallback(callback, null, res)];
327
+ }
328
+ data = {
329
+ fileList: res.data.delete_list,
330
+ requestId: res.requestId,
331
+ };
332
+ return [2, execCallback(callback, null, data)];
333
+ }
334
+ });
335
+ });
336
+ };
337
+ CloudbaseStorage.prototype.getTempFileURL = function (params, callback) {
338
+ return __awaiter(this, void 0, void 0, function () {
339
+ var fileList, convertedFileList, _i, fileList_2, file, action, request, res;
340
+ return __generator(this, function (_a) {
341
+ switch (_a.label) {
342
+ case 0:
343
+ fileList = params.fileList;
344
+ if (!fileList || !isArray(fileList) || fileList.length === 0) {
345
+ throw new Error(JSON.stringify({
346
+ code: ERRORS.INVALID_PARAMS,
347
+ msg: "[".concat(exports.COMPONENT_NAME, ".getTempFileURL] fileList must not be empty"),
348
+ }));
349
+ }
350
+ convertedFileList = [];
351
+ for (_i = 0, fileList_2 = fileList; _i < fileList_2.length; _i++) {
352
+ file = fileList_2[_i];
353
+ if (isPalinObject(file)) {
354
+ if (!Object.prototype.hasOwnProperty.call(file, 'fileID')) {
355
+ throw new Error(JSON.stringify({
356
+ code: ERRORS.INVALID_PARAMS,
357
+ msg: "[".concat(exports.COMPONENT_NAME, ".getTempFileURL] file info must include fileID"),
358
+ }));
359
+ }
360
+ convertedFileList.push({
361
+ fileid: file.fileID,
362
+ max_age: file.maxAge || 7200,
363
+ });
364
+ }
365
+ else if (isString(file)) {
366
+ convertedFileList.push({
367
+ fileid: file,
368
+ });
369
+ }
370
+ else {
371
+ throw new Error(JSON.stringify({
372
+ code: ERRORS.INVALID_PARAMS,
373
+ msg: "[".concat(exports.COMPONENT_NAME, ".getTempFileURL] invalid fileList"),
374
+ }));
375
+ }
376
+ }
377
+ action = 'storage.batchGetDownloadUrl';
378
+ request = this.request;
379
+ res = {};
380
+ if (!this.isGateWay()) return [3, 2];
381
+ return [4, storageGateWay.getDownLoadInfo(request, { convertedFileList: convertedFileList }, params.customReqOpts)];
382
+ case 1:
383
+ res = _a.sent();
384
+ return [3, 4];
385
+ case 2: return [4, request.send(action, { file_list: convertedFileList }, params.customReqOpts)];
386
+ case 3:
387
+ res = _a.sent();
388
+ _a.label = 4;
389
+ case 4:
390
+ if (res.code) {
391
+ return [2, execCallback(callback, null, res)];
392
+ }
393
+ return [2, execCallback(callback, null, {
394
+ fileList: res.data.download_list,
395
+ requestId: res.requestId,
396
+ })];
397
+ }
398
+ });
399
+ });
400
+ };
401
+ CloudbaseStorage.prototype.downloadFile = function (params, callback) {
402
+ return __awaiter(this, void 0, void 0, function () {
403
+ var fileID, tmpUrlRes, res, request, tmpUrl, result;
404
+ return __generator(this, function (_a) {
405
+ switch (_a.label) {
406
+ case 0:
407
+ fileID = params.fileID;
408
+ if (!isString(fileID)) {
409
+ throw new Error(JSON.stringify({
410
+ code: ERRORS.INVALID_PARAMS,
411
+ msg: "[".concat(exports.COMPONENT_NAME, ".getTempFileURL] fileID must be string"),
412
+ }));
413
+ }
414
+ return [4, this.getTempFileURL.call(this, {
415
+ fileList: [
416
+ {
417
+ fileID: fileID,
418
+ maxAge: 600,
419
+ },
420
+ ],
421
+ customReqOpts: params.customReqOpts,
422
+ })];
423
+ case 1:
424
+ tmpUrlRes = _a.sent();
425
+ res = tmpUrlRes.fileList[0];
426
+ if (res.code !== 'SUCCESS') {
427
+ return [2, execCallback(callback, res)];
428
+ }
429
+ request = this.request;
430
+ tmpUrl = encodeURI(res.download_url);
431
+ return [4, request.download({ url: tmpUrl, tempFilePath: params.tempFilePath })];
432
+ case 2:
433
+ result = _a.sent();
434
+ return [2, execCallback(callback, null, result)];
435
+ }
436
+ });
437
+ });
438
+ };
439
+ CloudbaseStorage.prototype.copyFile = function (params, callback) {
440
+ return __awaiter(this, void 0, void 0, function () {
441
+ var fileList, convertedFileList, _i, fileList_3, file, srcPath, dstPath, request, res, action;
442
+ return __generator(this, function (_a) {
443
+ switch (_a.label) {
444
+ case 0:
445
+ fileList = params.fileList;
446
+ if (!fileList || !isArray(fileList) || fileList.length === 0) {
447
+ throw new Error(JSON.stringify({
448
+ code: ERRORS.INVALID_PARAMS,
449
+ msg: "[".concat(exports.COMPONENT_NAME, ".copyFile] fileList must not be empty"),
450
+ }));
451
+ }
452
+ convertedFileList = [];
453
+ for (_i = 0, fileList_3 = fileList; _i < fileList_3.length; _i++) {
454
+ file = fileList_3[_i];
455
+ srcPath = file.srcPath, dstPath = file.dstPath;
456
+ if (!srcPath || !dstPath || typeof srcPath !== 'string' || typeof dstPath !== 'string') {
457
+ throw new Error(JSON.stringify({
458
+ code: ERRORS.INVALID_PARAMS,
459
+ msg: "[".concat(exports.COMPONENT_NAME, ".copyFile] srcPath and dstPath may not be empty"),
460
+ }));
461
+ }
462
+ if (srcPath === dstPath) {
463
+ throw new Error(JSON.stringify({
464
+ code: ERRORS.INVALID_PARAMS,
465
+ msg: "[".concat(exports.COMPONENT_NAME, ".copyFile] srcPath and dstPath can not be the same"),
466
+ }));
467
+ }
468
+ convertedFileList.push({
469
+ src_path: srcPath,
470
+ dst_path: dstPath,
471
+ overwrite: file.overwrite,
472
+ remove_original: file.removeOriginal,
473
+ });
474
+ }
475
+ request = this.request;
476
+ res = {};
477
+ if (!this.isGateWay()) return [3, 2];
478
+ return [4, storageGateWay.copyFile(request, { convertedFileList: convertedFileList }, params.customReqOpts)];
479
+ case 1:
480
+ res = _a.sent();
481
+ return [3, 4];
482
+ case 2:
483
+ action = 'storage.batchCopyFile';
484
+ return [4, request.send(action, { file_list: convertedFileList }, params.customReqOpts)];
485
+ case 3:
486
+ res = _a.sent();
487
+ _a.label = 4;
488
+ case 4:
489
+ if (res.code) {
490
+ return [2, execCallback(callback, null, res)];
491
+ }
492
+ return [2, execCallback(callback, null, {
493
+ fileList: res.data.copy_list,
494
+ requestId: res.requestId,
495
+ })];
496
+ }
497
+ });
498
+ });
499
+ };
500
+ CloudbaseStorage.prototype.getFileInfo = function (params) {
501
+ var _a;
502
+ return __awaiter(this, void 0, void 0, function () {
503
+ var fileInfo, fileList;
504
+ var _this = this;
505
+ return __generator(this, function (_b) {
506
+ switch (_b.label) {
507
+ case 0: return [4, this.getTempFileURL(params)];
508
+ case 1:
509
+ fileInfo = _b.sent();
510
+ if (!((fileInfo === null || fileInfo === void 0 ? void 0 : fileInfo.fileList) && ((_a = fileInfo === null || fileInfo === void 0 ? void 0 : fileInfo.fileList) === null || _a === void 0 ? void 0 : _a.length) > 0)) return [3, 3];
511
+ return [4, Promise.all(fileInfo.fileList.map(function (item) { return __awaiter(_this, void 0, void 0, function () {
512
+ var request, res, header, fileSize, contentType, fileInfo_1, e_1;
513
+ return __generator(this, function (_a) {
514
+ switch (_a.label) {
515
+ case 0:
516
+ if (item.code !== 'SUCCESS') {
517
+ return [2, {
518
+ code: item.code,
519
+ fileID: item.fileID,
520
+ tempFileURL: item.tempFileURL,
521
+ message: item.message,
522
+ }];
523
+ }
524
+ _a.label = 1;
525
+ case 1:
526
+ _a.trys.push([1, 3, , 4]);
527
+ request = this.request;
528
+ return [4, request.fetch({ url: item.tempFileURL, method: 'HEAD' })];
529
+ case 2:
530
+ res = _a.sent();
531
+ header = res.header;
532
+ if (Headers && header instanceof Headers) {
533
+ header = Object.fromEntries(res.header.entries());
534
+ }
535
+ fileSize = parseInt(header['content-length']) || 0;
536
+ contentType = header['content-type'] || '';
537
+ if ([400, 404].includes(Number(res.statusCode))) {
538
+ return [2, {
539
+ code: 'FILE_NOT_FOUND',
540
+ fileID: item.fileID,
541
+ tempFileURL: item.tempFileURL,
542
+ message: 'file not found',
543
+ }];
544
+ }
545
+ fileInfo_1 = {
546
+ code: item.code,
547
+ fileID: item.fileID,
548
+ tempFileURL: item.tempFileURL,
549
+ cloudId: item.fileID,
550
+ fileName: item.fileID.split('/').pop(),
551
+ contentType: contentType,
552
+ mime: contentType.split(';')[0].trim(),
553
+ size: fileSize,
554
+ etag: header.etag || '',
555
+ lastModified: header['last-modified'] || '',
556
+ cacheControl: header['cache-control'] || '',
557
+ };
558
+ return [2, fileInfo_1];
559
+ case 3:
560
+ e_1 = _a.sent();
561
+ return [2, {
562
+ code: 'FETCH_FILE_INFO_ERROR',
563
+ fileID: item.fileID,
564
+ tempFileURL: item.tempFileURL,
565
+ message: e_1.message,
566
+ }];
567
+ case 4: return [2];
568
+ }
569
+ });
570
+ }); }))];
571
+ case 2:
572
+ fileList = _b.sent();
573
+ return [2, {
574
+ fileList: fileList,
575
+ requestId: fileInfo.requestId,
576
+ }];
577
+ case 3: return [2, {
578
+ fileList: [],
579
+ requestId: fileInfo.requestId,
580
+ }];
581
+ }
582
+ });
583
+ });
584
+ };
585
+ __decorate([
586
+ catchErrorsDecorator({
587
+ customInfo: {
588
+ className: 'Cloudbase',
589
+ methodName: 'uploadFile',
590
+ },
591
+ title: '上传文件失败',
592
+ messages: [
593
+ '请确认以下各项:',
594
+ ' 1 - 调用 uploadFile() 的语法或参数是否正确',
595
+ ' 2 - 当前域名是否在安全域名列表中:https://console.cloud.tencent.com/tcb/env/safety',
596
+ ' 3 - 云存储安全规则是否限制了当前登录状态访问',
597
+ "\u5982\u679C\u95EE\u9898\u4F9D\u7136\u5B58\u5728\uFF0C\u5EFA\u8BAE\u5230\u5B98\u65B9\u95EE\u7B54\u793E\u533A\u63D0\u95EE\u6216\u5BFB\u627E\u5E2E\u52A9\uFF1A".concat(COMMUNITY_SITE_URL),
598
+ ],
599
+ }),
600
+ __metadata("design:type", Function),
601
+ __metadata("design:paramtypes", [Object, Function]),
602
+ __metadata("design:returntype", Promise)
603
+ ], CloudbaseStorage.prototype, "uploadFile", null);
604
+ __decorate([
605
+ catchErrorsDecorator({
606
+ customInfo: {
607
+ className: 'Cloudbase',
608
+ methodName: 'getUploadMetadata',
609
+ },
610
+ title: '获取上传元信息失败',
611
+ messages: [
612
+ '请确认以下各项:',
613
+ ' 1 - 调用 getUploadMetadata() 的语法或参数是否正确',
614
+ ' 2 - 当前域名是否在安全域名列表中:https://console.cloud.tencent.com/tcb/env/safety',
615
+ ' 3 - 云存储安全规则是否限制了当前登录状态访问',
616
+ "\u5982\u679C\u95EE\u9898\u4F9D\u7136\u5B58\u5728\uFF0C\u5EFA\u8BAE\u5230\u5B98\u65B9\u95EE\u7B54\u793E\u533A\u63D0\u95EE\u6216\u5BFB\u627E\u5E2E\u52A9\uFF1A".concat(COMMUNITY_SITE_URL),
617
+ ],
618
+ }),
619
+ __metadata("design:type", Function),
620
+ __metadata("design:paramtypes", [Object, Function]),
621
+ __metadata("design:returntype", Promise)
622
+ ], CloudbaseStorage.prototype, "getUploadMetadata", null);
623
+ __decorate([
624
+ catchErrorsDecorator({
625
+ customInfo: {
626
+ className: 'Cloudbase',
627
+ methodName: 'deleteFile',
628
+ },
629
+ title: '删除文件失败',
630
+ messages: [
631
+ '请确认以下各项:',
632
+ ' 1 - 调用 deleteFile() 的语法或参数是否正确',
633
+ ' 2 - 当前域名是否在安全域名列表中:https://console.cloud.tencent.com/tcb/env/safety',
634
+ ' 3 - 云存储安全规则是否限制了当前登录状态访问',
635
+ "\u5982\u679C\u95EE\u9898\u4F9D\u7136\u5B58\u5728\uFF0C\u5EFA\u8BAE\u5230\u5B98\u65B9\u95EE\u7B54\u793E\u533A\u63D0\u95EE\u6216\u5BFB\u627E\u5E2E\u52A9\uFF1A".concat(COMMUNITY_SITE_URL),
636
+ ],
637
+ }),
638
+ __metadata("design:type", Function),
639
+ __metadata("design:paramtypes", [Object, Function]),
640
+ __metadata("design:returntype", Promise)
641
+ ], CloudbaseStorage.prototype, "deleteFile", null);
642
+ __decorate([
643
+ catchErrorsDecorator({
644
+ customInfo: {
645
+ className: 'Cloudbase',
646
+ methodName: 'getTempFileURL',
647
+ },
648
+ title: '获取文件下载链接',
649
+ messages: [
650
+ '请确认以下各项:',
651
+ ' 1 - 调用 getTempFileURL() 的语法或参数是否正确',
652
+ ' 2 - 当前域名是否在安全域名列表中:https://console.cloud.tencent.com/tcb/env/safety',
653
+ ' 3 - 云存储安全规则是否限制了当前登录状态访问',
654
+ "\u5982\u679C\u95EE\u9898\u4F9D\u7136\u5B58\u5728\uFF0C\u5EFA\u8BAE\u5230\u5B98\u65B9\u95EE\u7B54\u793E\u533A\u63D0\u95EE\u6216\u5BFB\u627E\u5E2E\u52A9\uFF1A".concat(COMMUNITY_SITE_URL),
655
+ ],
656
+ }),
657
+ __metadata("design:type", Function),
658
+ __metadata("design:paramtypes", [Object, Function]),
659
+ __metadata("design:returntype", Promise)
660
+ ], CloudbaseStorage.prototype, "getTempFileURL", null);
661
+ __decorate([
662
+ catchErrorsDecorator({
663
+ customInfo: {
664
+ className: 'Cloudbase',
665
+ methodName: 'downloadFile',
666
+ },
667
+ title: '下载文件失败',
668
+ messages: [
669
+ '请确认以下各项:',
670
+ ' 1 - 调用 downloadFile() 的语法或参数是否正确',
671
+ ' 2 - 当前域名是否在安全域名列表中:https://console.cloud.tencent.com/tcb/env/safety',
672
+ ' 3 - 云存储安全规则是否限制了当前登录状态访问',
673
+ "\u5982\u679C\u95EE\u9898\u4F9D\u7136\u5B58\u5728\uFF0C\u5EFA\u8BAE\u5230\u5B98\u65B9\u95EE\u7B54\u793E\u533A\u63D0\u95EE\u6216\u5BFB\u627E\u5E2E\u52A9\uFF1A".concat(COMMUNITY_SITE_URL),
674
+ ],
675
+ }),
676
+ __metadata("design:type", Function),
677
+ __metadata("design:paramtypes", [Object, Function]),
678
+ __metadata("design:returntype", Promise)
679
+ ], CloudbaseStorage.prototype, "downloadFile", null);
680
+ __decorate([
681
+ catchErrorsDecorator({
682
+ customInfo: {
683
+ className: 'Cloudbase',
684
+ methodName: 'copyFile',
685
+ },
686
+ title: '批量复制文件',
687
+ messages: [
688
+ '请确认以下各项:',
689
+ ' 1 - 调用 copyFile() 的语法或参数是否正确',
690
+ ' 2 - 当前域名是否在安全域名列表中:https://console.cloud.tencent.com/tcb/env/safety',
691
+ ' 3 - 云存储安全规则是否限制了当前登录状态访问',
692
+ "\u5982\u679C\u95EE\u9898\u4F9D\u7136\u5B58\u5728\uFF0C\u5EFA\u8BAE\u5230\u5B98\u65B9\u95EE\u7B54\u793E\u533A\u63D0\u95EE\u6216\u5BFB\u627E\u5E2E\u52A9\uFF1A".concat(COMMUNITY_SITE_URL),
693
+ ],
694
+ }),
695
+ __metadata("design:type", Function),
696
+ __metadata("design:paramtypes", [Object, Function]),
697
+ __metadata("design:returntype", Promise)
698
+ ], CloudbaseStorage.prototype, "copyFile", null);
699
+ return CloudbaseStorage;
700
+ }());
701
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zdG9yYWdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsa0RBQWdFO0FBa0JoRSxJQUFLLGFBR0o7QUFIRCxXQUFLLGFBQWE7SUFDaEIsNEJBQVcsQ0FBQTtJQUNYLDhCQUFhLENBQUE7QUFDZixDQUFDLEVBSEksYUFBYSxLQUFiLGFBQWEsUUFHakI7QUFXTyxJQUFBLFVBQVUsR0FBaUMscUJBQVMsV0FBMUMsRUFBRSxNQUFNLEdBQXlCLHFCQUFTLE9BQWxDLEVBQUUsa0JBQWtCLEdBQUsscUJBQVMsbUJBQWQsQ0FBYztBQUNwRCxJQUFBLE9BQU8sR0FBNEMsaUJBQUssUUFBakQsRUFBRSxRQUFRLEdBQWtDLGlCQUFLLFNBQXZDLEVBQUUsYUFBYSxHQUFtQixpQkFBSyxjQUF4QixFQUFFLFlBQVksR0FBSyxpQkFBSyxhQUFWLENBQVU7QUFDeEQsSUFBQSxvQkFBb0IsR0FBSyxtQkFBTyxxQkFBWixDQUFZO0FBRTNCLFFBQUEsY0FBYyxHQUFHLFNBQVMsQ0FBQTtBQVF2QyxJQUFNLGNBQWMsR0FBRztJQUNyQixhQUFhLEVBQUUsVUFDYixPQUFPLEVBQ1AsTUFBMEQsRUFDMUQsYUFBMEQ7Ozs7O3dCQUVoRCxXQUFNLE9BQU8sQ0FBQyxPQUFPLENBQzdCO3dCQUNFLElBQUksRUFBRSxVQUFVO3dCQUNoQixJQUFJLEVBQUUseUJBQXlCO3dCQUMvQixJQUFJLEVBQUU7dUNBRUYsUUFBUSxFQUFFLE1BQU0sQ0FBQyxJQUFJLElBQ2xCLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxZQUFZLEVBQUUsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7eUJBRTlEO3FCQUNGLEVBQ0QsYUFBYSxDQUNkLEVBQUE7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QUFrQixDQUFFO2FBQ2xEO1NBQ0YsQ0FBQzs7aURBR1csUUFBUTs7d0RBZ0NwQjtJQWVZO1FBZFosb0JBQW9CLENBQUM7WUFDcEIsVUFBVSxFQUFFO2dCQUNWLFNBQVMsRUFBRSxXQUFXO2dCQUN0QixVQUFVLEVBQUUsVUFBVTthQUN2QjtZQUNELEtBQUssRUFBRSxRQUFRO1lBQ2YsUUFBUSxFQUFFO2dCQUNSLFVBQVU7Z0JBQ1YsZ0NBQWdDO2dCQUNoQyx1RUFBdUU7Z0JBQ3ZFLDRCQUE0QjtnQkFDNUIsc0tBQTZCLGtCQUFrQixDQUFFO2FBQ2xEO1NBQ0YsQ0FBQzs7aURBQ2lFLFFBQVE7O29EQTJEMUU7SUFzRkgsdUJBQUM7Q0FBQSxBQTNmRCxJQTJmQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNvbnN0YW50cywgdXRpbHMsIGhlbHBlcnMgfSBmcm9tICdAY2xvdWRiYXNlL3V0aWxpdGllcydcblxuaW1wb3J0IHtcbiAgSUNsb3VkYmFzZUZpbGVNZXRhRGF0YVJlcyxcbiAgSUNsb3VkYmFzZUZpbGVJbmZvLFxuICBJQ2xvdWRiYXNlVXBsb2FkRmlsZVBhcmFtcyxcbiAgSUNsb3VkYmFzZVVwbG9hZEZpbGVSZXN1bHQsXG4gIElDbG91ZGJhc2VHZXRVcGxvYWRNZXRhZGF0YVBhcmFtcyxcbiAgSUNsb3VkYmFzZURlbGV0ZUZpbGVQYXJhbXMsXG4gIElDbG91ZGJhc2VEZWxldGVGaWxlUmVzdWx0LFxuICBJQ2xvdWRiYXNlR2V0VGVtcEZpbGVVUkxSZXN1bHQsXG4gIElDbG91ZGJhc2VHZXRUZW1wRmlsZVVSTFBhcmFtcyxcbiAgSUNsb3VkYmFzZURvd25sb2FkRmlsZVJlc3VsdCxcbiAgSUNsb3VkYmFzZURvd25sb2FkRmlsZVBhcmFtcyxcbiAgSUNsb3VkYmFzZUNvcHlGaWxlUGFyYW1zLFxuICBJQ2xvdWRiYXNlQ29weUZpbGVSZXN1bHQsXG59IGZyb20gJ0BjbG91ZGJhc2UvdHlwZXMvc3RvcmFnZSdcblxuZW51bSBFVXBsb2FkTWV0aG9kIHtcbiAgcHV0ID0gJ3B1dCcsXG4gIHBvc3QgPSAncG9zdCcsXG59XG5cbmludGVyZmFjZSBJVXBsb2FkTWV0YWRhdGEge1xuICB1cmw6IHN0cmluZ1xuICB0b2tlbjogc3RyaW5nXG4gIGF1dGhvcml6YXRpb246IHN0cmluZ1xuICBmaWxlSWQ6IHN0cmluZ1xuICBjb3NGaWxlSWQ6IHN0cmluZ1xuICBkb3dubG9hZF91cmw/OiBzdHJpbmdcbn1cblxuY29uc3QgeyBnZXRTZGtOYW1lLCBFUlJPUlMsIENPTU1VTklUWV9TSVRFX1VSTCB9ID0gY29uc3RhbnRzXG5jb25zdCB7IGlzQXJyYXksIGlzU3RyaW5nLCBpc1BhbGluT2JqZWN0LCBleGVjQ2FsbGJhY2sgfSA9IHV0aWxzXG5jb25zdCB7IGNhdGNoRXJyb3JzRGVjb3JhdG9yIH0gPSBoZWxwZXJzXG5cbmV4cG9ydCBjb25zdCBDT01QT05FTlRfTkFNRSA9ICdzdG9yYWdlJ1xuXG4vLyBmdW5jdGlvbiBiYXNlbmFtZShwYXRoKSB7XG4vLyAgIGNvbnN0IGxhc3RTbGFzaEluZGV4ID0gcGF0aC5sYXN0SW5kZXhPZignLycpXG4vLyAgIGlmIChsYXN0U2xhc2hJbmRleCA9PT0gLTEpIHJldHVybiBwYXRoXG4vLyAgIHJldHVybiBwYXRoLnNsaWNlKGxhc3RTbGFzaEluZGV4ICsgMSlcbi8vIH1cblxuY29uc3Qgc3RvcmFnZUdhdGVXYXkgPSB7XG4gIGdldFVwbG9hZEluZm86IGFzeW5jIChcbiAgICByZXF1ZXN0LFxuICAgIHBhcmFtczogeyBwYXRoOiBzdHJpbmc7IGhlYWRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IH0sXG4gICAgY3VzdG9tUmVxT3B0czogSUNsb3VkYmFzZVVwbG9hZEZpbGVQYXJhbXNbJ2N1c3RvbVJlcU9wdHMnXSxcbiAgKSA9PiB7XG4gICAgbGV0IHJlcyA9IGF3YWl0IHJlcXVlc3QuZ2F0ZVdheShcbiAgICAgIHtcbiAgICAgICAgcGF0aDogJ3N0b3JhZ2VzJyxcbiAgICAgICAgbmFtZTogJ2dldC1vYmplY3RzLXVwbG9hZC1pbmZvJyxcbiAgICAgICAgZGF0YTogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG9iamVjdElkOiBwYXJhbXMucGF0aCxcbiAgICAgICAgICAgIC4uLihwYXJhbXMuaGVhZGVycyA/IHsgc2lnbmVkSGVhZGVyOiBwYXJhbXMuaGVhZGVycyB9IDoge30pLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgICAgY3VzdG9tUmVxT3B0cyxcbiAgICApXG4gICAgY29uc3QgZGF0YSA9IHJlcy5kYXRhPy5bMF0gfHwge31cblxuICAgIHJlcyA9IHtcbiAgICAgIC4uLnJlcyxcbiAgICAgIGRhdGE6IHtcbiAgICAgICAgLi4uKGRhdGEuY29kZSA/IHsgLi4uZGF0YSB9IDoge30pLFxuICAgICAgICBhdXRob3JpemF0aW9uOiBkYXRhLmF1dGhvcml6YXRpb24sXG4gICAgICAgIHRva2VuOiBkYXRhLnRva2VuLFxuICAgICAgICB1cmw6IGRhdGEudXBsb2FkVXJsLFxuICAgICAgICBmaWxlSWQ6IGRhdGEuY2xvdWRPYmplY3RJZCxcbiAgICAgICAgY29zRmlsZUlkOiBkYXRhLmNsb3VkT2JqZWN0TWV0YSxcbiAgICAgICAgZG93bmxvYWRfdXJsOiBkYXRhLmRvd25sb2FkVXJsLFxuICAgICAgfSxcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzXG4gIH0sXG4gIGdldERvd25Mb2FkSW5mbzogYXN5bmMgKFxuICAgIHJlcXVlc3QsXG4gICAgcGFyYW1zOiB7IGNvbnZlcnRlZEZpbGVMaXN0OiBBcnJheTx7IGZpbGVpZDogc3RyaW5nIH0+IH0sXG4gICAgY3VzdG9tUmVxT3B0czogSUNsb3VkYmFzZVVwbG9hZEZpbGVQYXJhbXNbJ2N1c3RvbVJlcU9wdHMnXSxcbiAgKSA9PiB7XG4gICAgbGV0IHJlcyA9IGF3YWl0IHJlcXVlc3QuZ2F0ZVdheShcbiAgICAgIHtcbiAgICAgICAgcGF0aDogJ3N0b3JhZ2VzJyxcbiAgICAgICAgbmFtZTogJ2dldC1vYmplY3RzLWRvd25sb2FkLWluZm8nLFxuICAgICAgICBkYXRhOiBwYXJhbXMuY29udmVydGVkRmlsZUxpc3QubWFwKCh2OiBhbnkpID0+ICh7IGNsb3VkT2JqZWN0SWQ6IHYuZmlsZWlkIH0pKSxcbiAgICAgIH0sXG4gICAgICBjdXN0b21SZXFPcHRzLFxuICAgIClcbiAgICByZXMgPSB7XG4gICAgICAuLi5yZXMsXG4gICAgICBkYXRhOiB7XG4gICAgICAgIGRvd25sb2FkX2xpc3Q6IHJlcy5kYXRhPy5tYXAodiA9PiAoe1xuICAgICAgICAgIGNvZGU6IHYuY29kZSB8fCAnU1VDQ0VTUycsXG4gICAgICAgICAgbWVzc2FnZTogdi5tZXNzYWdlLFxuICAgICAgICAgIGZpbGVpZDogdi5jbG91ZE9iamVjdElkLFxuICAgICAgICAgIGRvd25sb2FkX3VybDogdi5kb3dubG9hZFVybCxcbiAgICAgICAgICBmaWxlSUQ6IHYuY2xvdWRPYmplY3RJZCxcbiAgICAgICAgICB0ZW1wRmlsZVVSTDogdi5kb3dubG9hZFVybCxcbiAgICAgICAgfSkpLFxuICAgICAgfSxcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzXG4gIH0sXG4gIGRlbGV0ZTogYXN5bmMgKFxuICAgIHJlcXVlc3QsXG4gICAgcGFyYW1zOiB7IGZpbGVMaXN0OiBBcnJheTxzdHJpbmc+IH0sXG4gICAgY3VzdG9tUmVxT3B0czogSUNsb3VkYmFzZVVwbG9hZEZpbGVQYXJhbXNbJ2N1c3RvbVJlcU9wdHMnXSxcbiAgKSA9PiB7XG4gICAgbGV0IHJlcyA9IGF3YWl0IHJlcXVlc3QuZ2F0ZVdheShcbiAgICAgIHtcbiAgICAgICAgcGF0aDogJ3N0b3JhZ2VzJyxcbiAgICAgICAgbmFtZTogJ2RlbGV0ZS1vYmplY3RzJyxcbiAgICAgICAgZGF0YTogcGFyYW1zLmZpbGVMaXN0Lm1hcCh2ID0+ICh7IGNsb3VkT2JqZWN0SWQ6IHYgfSkpLFxuICAgICAgfSxcbiAgICAgIGN1c3RvbVJlcU9wdHMsXG4gICAgKVxuICAgIHJlcyA9IHtcbiAgICAgIC4uLnJlcyxcbiAgICAgIGRhdGE6IHtcbiAgICAgICAgZGVsZXRlX2xpc3Q6IHJlcy5kYXRhPy5tYXAodiA9PiAoe1xuICAgICAgICAgIGNvZGU6IHYuY29kZSB8fCAnU1VDQ0VTUycsXG4gICAgICAgICAgZmlsZUlEOiB2LmNsb3VkT2JqZWN0SWQsXG4gICAgICAgICAgbWVzc2FnZTogdi5tZXNzYWdlLFxuICAgICAgICB9KSksXG4gICAgICB9LFxuICAgIH1cblxuICAgIHJldHVybiByZXNcbiAgfSxcbiAgY29weUZpbGU6IGFzeW5jIChcbiAgICByZXF1ZXN0LFxuICAgIHBhcmFtczoge1xuICAgICAgY29udmVydGVkRmlsZUxpc3Q6IEFycmF5PHsgc3JjX3BhdGg6IHN0cmluZzsgZHN0X3BhdGg6IHN0cmluZzsgb3ZlcndyaXRlOiBib29sZWFuOyByZW1vdmVfb3JpZ2luYWw6IGJvb2xlYW4gfT5cbiAgICB9LFxuICAgIGN1c3RvbVJlcU9wdHM6IElDbG91ZGJhc2VVcGxvYWRGaWxlUGFyYW1zWydjdXN0b21SZXFPcHRzJ10sXG4gICkgPT4ge1xuICAgIGxldCByZXMgPSBhd2FpdCByZXF1ZXN0LmdhdGVXYXkoXG4gICAgICB7XG4gICAgICAgIHBhdGg6ICdzdG9yYWdlcycsXG4gICAgICAgIG5hbWU6ICdjb3B5LW9iamVjdHMnLFxuICAgICAgICBkYXRhOiBwYXJhbXMuY29udmVydGVkRmlsZUxpc3QubWFwKCh2OiBhbnkpID0+ICh7XG4gICAgICAgICAgc3JjUGF0aDogdi5zcmNfcGF0aCxcbiAgICAgICAgICBkc3RQYXRoOiB2LmRzdF9wYXRoLFxuICAgICAgICAgIG92ZXJ3cml0ZTogdi5vdmVyd3JpdGUsXG4gICAgICAgICAgcmVtb3ZlT3JpZ2luYWw6IHYucmVtb3ZlX29yaWdpbmFsLFxuICAgICAgICB9KSksXG4gICAgICB9LFxuICAgICAgY3VzdG9tUmVxT3B0cyxcbiAgICApXG4gICAgcmVzID0ge1xuICAgICAgLi4ucmVzLFxuICAgICAgZGF0YToge1xuICAgICAgICBjb3B5X2xpc3Q6IHJlcy5kYXRhPy5tYXAodiA9PiAoe1xuICAgICAgICAgIGNvZGU6IHYuY29kZSB8fCAnU1VDQ0VTUycsXG4gICAgICAgICAgZmlsZUlEOiB2LmNsb3VkT2JqZWN0SWQsXG4gICAgICAgICAgbWVzc2FnZTogdi5tZXNzYWdlLFxuICAgICAgICB9KSksXG4gICAgICB9LFxuICAgIH1cblxuICAgIHJldHVybiByZXNcbiAgfSxcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJQ2xvdWRiYXNlQ29udGV4dCB7XG4gIGNvbmZpZzogYW55XG4gIHJlcXVlc3Q6IGFueVxufVxuXG5leHBvcnQgY2xhc3MgQ2xvdWRiYXNlU3RvcmFnZSB7XG4gIHB1YmxpYyBpc0dhdGVXYXkoKSB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGNvbnN0IHsgY29uZmlnIH0gPSB0aGlzXG4gICAgY29uc3QgZW5kUG9pbnRNb2RlID0gY29uZmlnLmVuZFBvaW50TW9kZSB8fCAnQ0xPVURfQVBJJ1xuXG4gICAgcmV0dXJuIGVuZFBvaW50TW9kZSA9PT0gJ0dBVEVXQVknXG4gIH1cblxuICBAY2F0Y2hFcnJvcnNEZWNvcmF0b3Ioe1xuICAgIGN1c3RvbUluZm86IHtcbiAgICAgIGNsYXNzTmFtZTogJ0Nsb3VkYmFzZScsXG4gICAgICBtZXRob2ROYW1lOiAndXBsb2FkRmlsZScsXG4gICAgfSxcbiAgICB0aXRsZTogJ+S4iuS8oOaWh+S7tuWksei0pScsXG4gICAgbWVzc2FnZXM6IFtcbiAgICAgICfor7fnoa7orqTku6XkuIvlkITpobnvvJonLFxuICAgICAgJyAgMSAtIOiwg+eUqCB1cGxvYWRGaWxlKCkg55qE6K+t5rOV5oiW5Y+C5pWw5piv5ZCm5q2j56GuJyxcbiAgICAgICcgIDIgLSDlvZPliY3ln5/lkI3mmK/lkKblnKjlronlhajln5/lkI3liJfooajkuK3vvJpodHRwczovL2NvbnNvbGUuY2xvdWQudGVuY2VudC5jb20vdGNiL2Vudi9zYWZldHknLFxuICAgICAgJyAgMyAtIOS6keWtmOWCqOWuieWFqOinhOWImeaYr+WQpumZkOWItuS6huW9k+WJjeeZu+W9leeKtuaAgeiuv+mXricsXG4gICAgICBg5aaC5p6c6Zeu6aKY5L6d54S25a2Y5Zyo77yM5bu66K6u5Yiw5a6Y5pa56Zeu562U56S+5Yy65o+Q6Zeu5oiW5a+75om+5biu5Yqp77yaJHtDT01NVU5JVFlfU0lURV9VUkx9YCxcbiAgICBdLFxuICB9KVxuICBwdWJsaWMgYXN5bmMgdXBsb2FkRmlsZShcbiAgICBwYXJhbXM6IE9taXQ8SUNsb3VkYmFzZVVwbG9hZEZpbGVQYXJhbXMsICdmaWxlUGF0aCc+ICYgeyBmaWxlUGF0aD86IHN0cmluZyB9LFxuICAgIGNhbGxiYWNrPzogRnVuY3Rpb24sXG4gICk6IFByb21pc2U8SUNsb3VkYmFzZVVwbG9hZEZpbGVSZXN1bHQ+IHtcbiAgICBjb25zdCB7IGNsb3VkUGF0aCwgZmlsZVBhdGgsIG9uVXBsb2FkUHJvZ3Jlc3MsIG1ldGhvZCA9ICdwdXQnLCBoZWFkZXJzID0ge30sIGZpbGVDb250ZW50IH0gPSBwYXJhbXNcbiAgICBpZiAoIWlzU3RyaW5nKGNsb3VkUGF0aCkgfHwgKCFmaWxlUGF0aCAmJiAhZmlsZUNvbnRlbnQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBjb2RlOiBFUlJPUlMuSU5WQUxJRF9QQVJBTVMsXG4gICAgICAgIG1zZzogYFske0NPTVBPTkVOVF9OQU1FfS51cGxvYWRGaWxlXSBpbnZhbGlkIHBhcmFtc2AsXG4gICAgICB9KSwpXG4gICAgfVxuICAgIGNvbnN0IHVwbG9hZE1ldGhvZCA9ICAgICAgeyBwdXQ6IEVVcGxvYWRNZXRob2QucHV0LCBwb3N0OiBFVXBsb2FkTWV0aG9kLnBvc3QgfVttZXRob2QudG9Mb2NhbGVMb3dlckNhc2UoKV0gfHwgRVVwbG9hZE1ldGhvZC5wdXRcblxuICAgIC8vIOiwg+eUqCBnZXRVcGxvYWRNZXRhZGF0YSDojrflj5bkuIrkvKDlhYPmlbDmja5cbiAgICBjb25zdCBtZXRhZGF0YVJlc3VsdCA9IGF3YWl0IHRoaXMuZ2V0VXBsb2FkTWV0YWRhdGEoe1xuICAgICAgY2xvdWRQYXRoLFxuICAgICAgbWV0aG9kOiB1cGxvYWRNZXRob2QsXG4gICAgICBoZWFkZXJzOiB1cGxvYWRNZXRob2QgPT09IEVVcGxvYWRNZXRob2QucHV0ID8gaGVhZGVycyA6IHVuZGVmaW5lZCxcbiAgICAgIGN1c3RvbVJlcU9wdHM6IHBhcmFtcy5jdXN0b21SZXFPcHRzLFxuICAgIH0pXG5cbiAgICBjb25zdCB7IGRhdGE6IG1ldGFkYXRhLCByZXF1ZXN0SWQgfSA9IG1ldGFkYXRhUmVzdWx0XG4gICAgY29uc3QgeyB1cmwsIGF1dGhvcml6YXRpb24sIHRva2VuLCBmaWxlSWQsIGNvc0ZpbGVJZCwgZG93bmxvYWRfdXJsOiBkb3dubG9hZFVybCB9ID0gbWV0YWRhdGFcblxuICAgIGNvbnN0IGNvbW1vblBhcmFtcyA9IHtcbiAgICAgIHVybCxcbiAgICAgIGZpbGU6IGZpbGVQYXRoLFxuICAgICAgbmFtZTogY2xvdWRQYXRoLFxuICAgICAgb25VcGxvYWRQcm9ncmVzcyxcbiAgICAgIGZpbGVDb250ZW50LFxuICAgICAgZmlsZUlkLFxuICAgICAgcmVxdWVzdElkLFxuICAgIH1cblxuICAgIGNvbnN0IHB1dFBhcmFtcyA9IHtcbiAgICAgIC4uLmNvbW1vblBhcmFtcyxcbiAgICAgIG1ldGhvZDogRVVwbG9hZE1ldGhvZC5wdXQsXG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgIC4uLmhlYWRlcnMsXG4gICAgICAgIGF1dGhvcml6YXRpb24sXG4gICAgICAgICd4LWNvcy1tZXRhLWZpbGVpZCc6IGNvc0ZpbGVJZCxcbiAgICAgICAgJ3gtY29zLXNlY3VyaXR5LXRva2VuJzogdG9rZW4sXG4gICAgICB9LFxuICAgIH1cblxuICAgIGNvbnN0IHBvc3RQYXJhbXMgPSB7XG4gICAgICAuLi5jb21tb25QYXJhbXMsXG4gICAgICBtZXRob2Q6IEVVcGxvYWRNZXRob2QucG9zdCxcbiAgICAgIGRhdGE6IHtcbiAgICAgICAga2V5OiBjbG91ZFBhdGgsXG4gICAgICAgIHNpZ25hdHVyZTogYXV0aG9yaXphdGlvbixcbiAgICAgICAgJ3gtY29zLW1ldGEtZmlsZWlkJzogY29zRmlsZUlkLFxuICAgICAgICBzdWNjZXNzX2FjdGlvbl9zdGF0dXM6ICcyMDEnLFxuICAgICAgICAneC1jb3Mtc2VjdXJpdHktdG9rZW4nOiB0b2tlbixcbiAgICAgIH0sXG4gICAgfVxuXG4gICAgY29uc3QgdXBsb2FkQ29uZmlnID0ge1xuICAgICAgW0VVcGxvYWRNZXRob2QucHV0XToge1xuICAgICAgICBwYXJhbXM6IHB1dFBhcmFtcyxcbiAgICAgICAgaXNTdWNjZXNzOiAoY29kZTogbnVtYmVyKSA9PiBjb2RlID49IDIwMCAmJiBjb2RlIDwgMzAwLFxuICAgICAgfSxcbiAgICAgIFtFVXBsb2FkTWV0aG9kLnBvc3RdOiB7XG4gICAgICAgIHBhcmFtczogcG9zdFBhcmFtcyxcbiAgICAgICAgaXNTdWNjZXNzOiAoY29kZTogbnVtYmVyKSA9PiBjb2RlID09PSAyMDEsXG4gICAgICB9LFxuICAgIH1cblxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLnJlcXVlc3QudXBsb2FkKHVwbG9hZENvbmZpZ1t1cGxvYWRNZXRob2RdLnBhcmFtcylcblxuICAgIGlmICh1cGxvYWRDb25maWdbdXBsb2FkTWV0aG9kXS5pc1N1Y2Nlc3MocmVzLnN0YXR1c0NvZGUpKSB7XG4gICAgICByZXR1cm4gZXhlY0NhbGxiYWNrKGNhbGxiYWNrLCBudWxsLCB7XG4gICAgICAgIGZpbGVJRDogZmlsZUlkLFxuICAgICAgICBkb3dubG9hZF91cmw6IGRvd25sb2FkVXJsLFxuICAgICAgICByZXF1ZXN0SWQsXG4gICAgICB9KVxuICAgIH1cbiAgICByZXR1cm4gZXhlY0NhbGxiYWNrKFxuICAgICAgY2FsbGJhY2ssXG4gICAgICBuZXcgRXJyb3IoYFske2dldFNka05hbWUoKX1dWyR7RVJST1JTLk9QRVJBVElPTl9GQUlMfV1bJHtDT01QT05FTlRfTkFNRX1dOiR7cmVzLmRhdGF9YCksXG4gICAgKVxuICB9XG4gIEBjYXRjaEVycm9yc0RlY29yYXRvcih7XG4gICAgY3VzdG9tSW5mbzoge1xuICAgICAgY2xhc3NOYW1lOiAnQ2xvdWRiYXNlJyxcbiAgICAgIG1ldGhvZE5hbWU6ICdnZXRVcGxvYWRNZXRhZGF0YScsXG4gICAgfSxcbiAgICB0aXRsZTogJ+iOt+WPluS4iuS8oOWFg+S/oeaBr+Wksei0pScsXG4gICAgbWVzc2FnZXM6IFtcbiAgICAgICfor7fnoa7orqTku6XkuIvlkITpobnvvJonLFxuICAgICAgJyAgMSAtIOiwg+eUqCBnZXRVcGxvYWRNZXRhZGF0YSgpIOeahOivreazleaIluWPguaVsOaYr+WQpuato+ehricsXG4gICAgICAnICAyIC0g5b2T5YmN5Z+f5ZCN5piv5ZCm5Zyo5a6J5YWo5Z+f5ZCN5YiX6KGo5Lit77yaaHR0cHM6Ly9jb25zb2xlLmNsb3VkLnRlbmNlbnQuY29tL3RjYi9lbnYvc2FmZXR5JyxcbiAgICAgICcgIDMgLSDkupHlrZjlgqjlronlhajop4TliJnmmK/lkKbpmZDliLbkuoblvZPliY3nmbvlvZXnirbmgIHorr/pl64nLFxuICAgICAgYOWmguaenOmXrumimOS+neeEtuWtmOWcqO+8jOW7uuiuruWIsOWumOaWuemXruetlOekvuWMuuaPkOmXruaIluWvu+aJvuW4ruWKqe+8miR7Q09NTVVOSVRZX1NJVEVfVVJMfWAsXG4gICAgXSxcbiAgfSlcbiAgcHVibGljIGFzeW5jIGdldFVwbG9hZE1ldGFkYXRhKFxuICAgIHBhcmFtczogSUNsb3VkYmFzZUdldFVwbG9hZE1ldGFkYXRhUGFyYW1zICYge1xuICAgICAgbWV0aG9kPzogRVVwbG9hZE1ldGhvZFxuICAgICAgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cbiAgICB9LFxuICAgIGNhbGxiYWNrPzogRnVuY3Rpb24sXG4gICk6IFByb21pc2U8eyBkYXRhOiBJVXBsb2FkTWV0YWRhdGE7IHJlcXVlc3RJZDogc3RyaW5nIH0+IHtcbiAgICBjb25zdCB7IGNsb3VkUGF0aCwgbWV0aG9kLCBoZWFkZXJzIH0gPSBwYXJhbXNcbiAgICBpZiAoIWlzU3RyaW5nKGNsb3VkUGF0aCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIGNvZGU6IEVSUk9SUy5JTlZBTElEX1BBUkFNUyxcbiAgICAgICAgbXNnOiBgWyR7Q09NUE9ORU5UX05BTUV9LmdldFVwbG9hZE1ldGFkYXRhXSBpbnZhbGlkIGNsb3VkUGF0aGAsXG4gICAgICB9KSwpXG4gICAgfVxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBjb25zdCB7IHJlcXVlc3QgfSA9IHRoaXNcbiAgICBjb25zdCBhY3Rpb24gPSAnc3RvcmFnZS5nZXRVcGxvYWRNZXRhZGF0YSdcblxuICAgIHRyeSB7XG4gICAgICBsZXQgbWV0YURhdGE6IElDbG91ZGJhc2VGaWxlTWV0YURhdGFSZXNcblxuICAgICAgY29uc3QgbWV0YURhdGFQYXJhbToge1xuICAgICAgICBwYXRoOiBzdHJpbmdcbiAgICAgICAgbWV0aG9kPzogRVVwbG9hZE1ldGhvZFxuICAgICAgICBoZWFkZXJzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPlxuICAgICAgfSA9IHsgcGF0aDogY2xvdWRQYXRoIH1cblxuICAgICAgaWYgKG1ldGhvZCkge1xuICAgICAgICBtZXRhRGF0YVBhcmFtLm1ldGhvZCA9IG1ldGhvZFxuICAgICAgfVxuICAgICAgaWYgKG1ldGhvZCA9PT0gRVVwbG9hZE1ldGhvZC5wdXQgJiYgaGVhZGVycykge1xuICAgICAgICBtZXRhRGF0YVBhcmFtLmhlYWRlcnMgPSBoZWFkZXJzXG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmlzR2F0ZVdheSgpKSB7XG4gICAgICAgIG1ldGFEYXRhID0gYXdhaXQgc3RvcmFnZUdhdGVXYXkuZ2V0VXBsb2FkSW5mbyhyZXF1ZXN0LCBtZXRhRGF0YVBhcmFtLCBwYXJhbXMuY3VzdG9tUmVxT3B0cylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1ldGFEYXRhID0gYXdhaXQgcmVxdWVzdC5zZW5kKGFjdGlvbiwgbWV0YURhdGFQYXJhbSwgcGFyYW1zLmN1c3RvbVJlcU9wdHMpXG4gICAgICB9XG4gICAgICByZXR1cm4gZXhlY0NhbGxiYWNrKGNhbGxiYWNrLCBudWxsLCBtZXRhRGF0YSlcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHJldHVybiBleGVjQ2FsbGJhY2soY2FsbGJhY2ssIGVycilcbiAgICB9XG4gIH1cbiAgQGNhdGNoRXJyb3JzRGVjb3JhdG9yKHtcbiAgICBjdXN0b21JbmZvOiB7XG4gICAgICBjbGFzc05hbWU6ICdDbG91ZGJhc2UnLFxuICAgICAgbWV0aG9kTmFtZTogJ2RlbGV0ZUZpbGUnLFxuICAgIH0sXG4gICAgdGl0bGU6ICfliKDpmaTmlofku7blpLHotKUnLFxuICAgIG1lc3NhZ2VzOiBbXG4gICAgICAn6K+356Gu6K6k5Lul5LiL5ZCE6aG577yaJyxcbiAgICAgICcgIDEgLSDosIPnlKggZGVsZXRlRmlsZSgpIOeahOivreazleaIluWPguaVsOaYr+WQpuato+ehricsXG4gICAgICAnICAyIC0g5b2T5YmN5Z+f5ZCN5piv5ZCm5Zyo5a6J5YWo5Z+f5ZCN5YiX6KGo5Lit77yaaHR0cHM6Ly9jb25zb2xlLmNsb3VkLnRlbmNlbnQuY29tL3RjYi9lbnYvc2FmZXR5JyxcbiAgICAgICcgIDMgLSDkupHlrZjlgqjlronlhajop4TliJnmmK/lkKbpmZDliLbkuoblvZPliY3nmbvlvZXnirbmgIHorr/pl64nLFxuICAgICAgYOWmguaenOmXrumimOS+neeEtuWtmOWcqO+8jOW7uuiuruWIsOWumOaWuemXruetlOekvuWMuuaPkOmXruaIluWvu+aJvuW4ruWKqe+8miR7Q09NTVVOSVRZX1NJVEVfVVJMfWAsXG4gICAgXSxcbiAgfSlcbiAgcHVibGljIGFzeW5jIGRlbGV0ZUZpbGUoXG4gICAgcGFyYW1zOiBJQ2xvdWRiYXNlRGVsZXRlRmlsZVBhcmFtcyxcbiAgICBjYWxsYmFjaz86IEZ1bmN0aW9uLFxuICApOiBQcm9taXNlPElDbG91ZGJhc2VEZWxldGVGaWxlUmVzdWx0PiB7XG4gICAgY29uc3QgeyBmaWxlTGlzdCB9ID0gcGFyYW1zXG5cbiAgICBpZiAoIWZpbGVMaXN0IHx8ICFpc0FycmF5KGZpbGVMaXN0KSB8fCBmaWxlTGlzdC5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIGNvZGU6IEVSUk9SUy5JTlZBTElEX1BBUkFNUyxcbiAgICAgICAgbXNnOiBgWyR7Q09NUE9ORU5UX05BTUV9LmRlbGV0ZUZpbGVdIGZpbGVMaXN0IG11c3Qgbm90IGJlIGVtcHR5YCxcbiAgICAgIH0pLClcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGZpbGVJZCBvZiBmaWxlTGlzdCkge1xuICAgICAgaWYgKCFmaWxlSWQgfHwgIWlzU3RyaW5nKGZpbGVJZCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICBjb2RlOiBFUlJPUlMuSU5WQUxJRF9QQVJBTVMsXG4gICAgICAgICAgbXNnOiBgWyR7Q09NUE9ORU5UX05BTUV9LmRlbGV0ZUZpbGVdIGZpbGVJRCBtdXN0IGJlIHN0cmluZ2AsXG4gICAgICAgIH0pLClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBhY3Rpb24gPSAnc3RvcmFnZS5iYXRjaERlbGV0ZUZpbGUnXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGNvbnN0IHsgcmVxdWVzdCB9ID0gdGhpc1xuICAgIGxldCByZXM6IGFueSA9IHt9XG5cbiAgICBpZiAodGhpcy5pc0dhdGVXYXkoKSkge1xuICAgICAgcmVzID0gYXdhaXQgc3RvcmFnZUdhdGVXYXkuZGVsZXRlKHJlcXVlc3QsIHsgZmlsZUxpc3QgfSwgcGFyYW1zLmN1c3RvbVJlcU9wdHMpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJlcyA9IGF3YWl0IHJlcXVlc3Quc2VuZChcbiAgICAgICAgYWN0aW9uLFxuICAgICAgICB7XG4gICAgICAgICAgZmlsZWlkX2xpc3Q6IGZpbGVMaXN0LFxuICAgICAgICB9LFxuICAgICAgICBwYXJhbXMuY3VzdG9tUmVxT3B0cyxcbiAgICAgIClcbiAgICB9XG5cbiAgICBpZiAocmVzLmNvZGUpIHtcbiAgICAgIHJldHVybiBleGVjQ2FsbGJhY2soY2FsbGJhY2ssIG51bGwsIHJlcylcbiAgICB9XG4gICAgY29uc3QgZGF0YSA9IHtcbiAgICAgIGZpbGVMaXN0OiByZXMuZGF0YS5kZWxldGVfbGlzdCxcbiAgICAgIHJlcXVlc3RJZDogcmVzLnJlcXVlc3RJZCxcbiAgICB9XG4gICAgcmV0dXJuIGV4ZWNDYWxsYmFjayhjYWxsYmFjaywgbnVsbCwgZGF0YSlcbiAgfVxuICBAY2F0Y2hFcnJvcnNEZWNvcmF0b3Ioe1xuICAgIGN1c3RvbUluZm86IHtcbiAgICAgIGNsYXNzTmFtZTogJ0Nsb3VkYmFzZScsXG4gICAgICBtZXRob2ROYW1lOiAnZ2V0VGVtcEZpbGVVUkwnLFxuICAgIH0sXG4gICAgdGl0bGU6ICfojrflj5bmlofku7bkuIvovb3pk77mjqUnLFxuICAgIG1lc3NhZ2VzOiBbXG4gICAgICAn6K+356Gu6K6k5Lul5LiL5ZCE6aG577yaJyxcbiAgICAgICcgIDEgLSDosIPnlKggZ2V0VGVtcEZpbGVVUkwoKSDnmoTor63ms5XmiJblj4LmlbDmmK/lkKbmraPnoa4nLFxuICAgICAgJyAgMiAtIOW9k+WJjeWfn+WQjeaYr+WQpuWcqOWuieWFqOWfn+WQjeWIl+ihqOS4re+8mmh0dHBzOi8vY29uc29sZS5jbG91ZC50ZW5jZW50LmNvbS90Y2IvZW52L3NhZmV0eScsXG4gICAgICAnICAzIC0g5LqR5a2Y5YKo5a6J5YWo6KeE5YiZ5piv5ZCm6ZmQ5Yi25LqG5b2T5YmN55m75b2V54q25oCB6K6/6ZeuJyxcbiAgICAgIGDlpoLmnpzpl67popjkvp3nhLblrZjlnKjvvIzlu7rorq7liLDlrpjmlrnpl67nrZTnpL7ljLrmj5Dpl67miJblr7vmib7luK7liqnvvJoke0NPTU1VTklUWV9TSVRFX1VSTH1gLFxuICAgIF0sXG4gIH0pXG4gIHB1YmxpYyBhc3luYyBnZXRUZW1wRmlsZVVSTChcbiAgICBwYXJhbXM6IElDbG91ZGJhc2VHZXRUZW1wRmlsZVVSTFBhcmFtcyxcbiAgICBjYWxsYmFjaz86IEZ1bmN0aW9uLFxuICApOiBQcm9taXNlPElDbG91ZGJhc2VHZXRUZW1wRmlsZVVSTFJlc3VsdD4ge1xuICAgIGNvbnN0IHsgZmlsZUxpc3QgfSA9IHBhcmFtc1xuXG4gICAgaWYgKCFmaWxlTGlzdCB8fCAhaXNBcnJheShmaWxlTGlzdCkgfHwgZmlsZUxpc3QubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBjb2RlOiBFUlJPUlMuSU5WQUxJRF9QQVJBTVMsXG4gICAgICAgIG1zZzogYFske0NPTVBPTkVOVF9OQU1FfS5nZXRUZW1wRmlsZVVSTF0gZmlsZUxpc3QgbXVzdCBub3QgYmUgZW1wdHlgLFxuICAgICAgfSksKVxuICAgIH1cblxuICAgIGNvbnN0IGNvbnZlcnRlZEZpbGVMaXN0ID0gW11cbiAgICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZUxpc3QpIHtcbiAgICAgIGlmIChpc1BhbGluT2JqZWN0KGZpbGUpKSB7XG4gICAgICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGZpbGUsICdmaWxlSUQnKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICBjb2RlOiBFUlJPUlMuSU5WQUxJRF9QQVJBTVMsXG4gICAgICAgICAgICBtc2c6IGBbJHtDT01QT05FTlRfTkFNRX0uZ2V0VGVtcEZpbGVVUkxdIGZpbGUgaW5mbyBtdXN0IGluY2x1ZGUgZmlsZUlEYCxcbiAgICAgICAgICB9KSwpXG4gICAgICAgIH1cblxuICAgICAgICBjb252ZXJ0ZWRGaWxlTGlzdC5wdXNoKHtcbiAgICAgICAgICBmaWxlaWQ6IChmaWxlIGFzIElDbG91ZGJhc2VGaWxlSW5mbykuZmlsZUlELFxuICAgICAgICAgIG1heF9hZ2U6IChmaWxlIGFzIElDbG91ZGJhc2VGaWxlSW5mbykubWF4QWdlIHx8IDcyMDAsXG4gICAgICAgIH0pXG4gICAgICB9IGVsc2UgaWYgKGlzU3RyaW5nKGZpbGUpKSB7XG4gICAgICAgIGNvbnZlcnRlZEZpbGVMaXN0LnB1c2goe1xuICAgICAgICAgIGZpbGVpZDogZmlsZSxcbiAgICAgICAgfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgY29kZTogRVJST1JTLklOVkFMSURfUEFSQU1TLFxuICAgICAgICAgIG1zZzogYFske0NPTVBPTkVOVF9OQU1FfS5nZXRUZW1wRmlsZVVSTF0gaW52YWxpZCBmaWxlTGlzdGAsXG4gICAgICAgIH0pLClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBhY3Rpb24gPSAnc3RvcmFnZS5iYXRjaEdldERvd25sb2FkVXJsJ1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBjb25zdCB7IHJlcXVlc3QgfSA9IHRoaXNcbiAgICBsZXQgcmVzOiBhbnkgPSB7fVxuXG4gICAgaWYgKHRoaXMuaXNHYXRlV2F5KCkpIHtcbiAgICAgIHJlcyA9IGF3YWl0IHN0b3JhZ2VHYXRlV2F5LmdldERvd25Mb2FkSW5mbyhyZXF1ZXN0LCB7IGNvbnZlcnRlZEZpbGVMaXN0IH0sIHBhcmFtcy5jdXN0b21SZXFPcHRzKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXMgPSBhd2FpdCByZXF1ZXN0LnNlbmQoYWN0aW9uLCB7IGZpbGVfbGlzdDogY29udmVydGVkRmlsZUxpc3QgfSwgcGFyYW1zLmN1c3RvbVJlcU9wdHMpXG4gICAgfVxuXG4gICAgaWYgKHJlcy5jb2RlKSB7XG4gICAgICByZXR1cm4gZXhlY0NhbGxiYWNrKGNhbGxiYWNrLCBudWxsLCByZXMpXG4gICAgfVxuXG4gICAgcmV0dXJuIGV4ZWNDYWxsYmFjayhjYWxsYmFjaywgbnVsbCwge1xuICAgICAgZmlsZUxpc3Q6IHJlcy5kYXRhLmRvd25sb2FkX2xpc3QsXG4gICAgICByZXF1ZXN0SWQ6IHJlcy5yZXF1ZXN0SWQsXG4gICAgfSlcbiAgfVxuICBAY2F0Y2hFcnJvcnNEZWNvcmF0b3Ioe1xuICAgIGN1c3RvbUluZm86IHtcbiAgICAgIGNsYXNzTmFtZTogJ0Nsb3VkYmFzZScsXG4gICAgICBtZXRob2ROYW1lOiAnZG93bmxvYWRGaWxlJyxcbiAgICB9LFxuICAgIHRpdGxlOiAn5LiL6L295paH5Lu25aSx6LSlJyxcbiAgICBtZXNzYWdlczogW1xuICAgICAgJ+ivt+ehruiupOS7peS4i+WQhOmhue+8micsXG4gICAgICAnICAxIC0g6LCD55SoIGRvd25sb2FkRmlsZSgpIOeahOivreazleaIluWPguaVsOaYr+WQpuato+ehricsXG4gICAgICAnICAyIC0g5b2T5YmN5Z+f5ZCN5piv5ZCm5Zyo5a6J5YWo5Z+f5ZCN5YiX6KGo5Lit77yaaHR0cHM6Ly9jb25zb2xlLmNsb3VkLnRlbmNlbnQuY29tL3RjYi9lbnYvc2FmZXR5JyxcbiAgICAgICcgIDMgLSDkupHlrZjlgqjlronlhajop4TliJnmmK/lkKbpmZDliLbkuoblvZPliY3nmbvlvZXnirbmgIHorr/pl64nLFxuICAgICAgYOWmguaenOmXrumimOS+neeEtuWtmOWcqO+8jOW7uuiuruWIsOWumOaWuemXruetlOekvuWMuuaPkOmXruaIluWvu+aJvuW4ruWKqe+8miR7Q09NTVVOSVRZX1NJVEVfVVJMfWAsXG4gICAgXSxcbiAgfSlcbiAgcHVibGljIGFzeW5jIGRvd25sb2FkRmlsZShcbiAgICBwYXJhbXM6IElDbG91ZGJhc2VEb3dubG9hZEZpbGVQYXJhbXMsXG4gICAgY2FsbGJhY2s/OiBGdW5jdGlvbixcbiAgKTogUHJvbWlzZTxJQ2xvdWRiYXNlRG93bmxvYWRGaWxlUmVzdWx0PiB7XG4gICAgY29uc3QgeyBmaWxlSUQgfSA9IHBhcmFtc1xuICAgIGlmICghaXNTdHJpbmcoZmlsZUlEKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgY29kZTogRVJST1JTLklOVkFMSURfUEFSQU1TLFxuICAgICAgICBtc2c6IGBbJHtDT01QT05FTlRfTkFNRX0uZ2V0VGVtcEZpbGVVUkxdIGZpbGVJRCBtdXN0IGJlIHN0cmluZ2AsXG4gICAgICB9KSwpXG4gICAgfVxuXG4gICAgY29uc3QgdG1wVXJsUmVzID0gYXdhaXQgdGhpcy5nZXRUZW1wRmlsZVVSTC5jYWxsKHRoaXMsIHtcbiAgICAgIGZpbGVMaXN0OiBbXG4gICAgICAgIHtcbiAgICAgICAgICBmaWxlSUQsXG4gICAgICAgICAgbWF4QWdlOiA2MDAsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgY3VzdG9tUmVxT3B0czogcGFyYW1zLmN1c3RvbVJlcU9wdHMsXG4gICAgfSlcblxuICAgIGNvbnN0IHJlcyA9IHRtcFVybFJlcy5maWxlTGlzdFswXVxuXG4gICAgaWYgKHJlcy5jb2RlICE9PSAnU1VDQ0VTUycpIHtcbiAgICAgIHJldHVybiBleGVjQ2FsbGJhY2soY2FsbGJhY2ssIHJlcylcbiAgICB9XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGNvbnN0IHsgcmVxdWVzdCB9ID0gdGhpc1xuXG4gICAgY29uc3QgdG1wVXJsID0gZW5jb2RlVVJJKHJlcy5kb3dubG9hZF91cmwpXG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXF1ZXN0LmRvd25sb2FkKHsgdXJsOiB0bXBVcmwsIHRlbXBGaWxlUGF0aDogcGFyYW1zLnRlbXBGaWxlUGF0aCB9KVxuICAgIHJldHVybiBleGVjQ2FsbGJhY2soY2FsbGJhY2ssIG51bGwsIHJlc3VsdClcbiAgfVxuICBAY2F0Y2hFcnJvcnNEZWNvcmF0b3Ioe1xuICAgIGN1c3RvbUluZm86IHtcbiAgICAgIGNsYXNzTmFtZTogJ0Nsb3VkYmFzZScsXG4gICAgICBtZXRob2ROYW1lOiAnY29weUZpbGUnLFxuICAgIH0sXG4gICAgdGl0bGU6ICfmibnph4/lpI3liLbmlofku7YnLFxuICAgIG1lc3NhZ2VzOiBbXG4gICAgICAn6K+356Gu6K6k5Lul5LiL5ZCE6aG577yaJyxcbiAgICAgICcgIDEgLSDosIPnlKggY29weUZpbGUoKSDnmoTor63ms5XmiJblj4LmlbDmmK/lkKbmraPnoa4nLFxuICAgICAgJyAgMiAtIOW9k+WJjeWfn+WQjeaYr+WQpuWcqOWuieWFqOWfn+WQjeWIl+ihqOS4re+8mmh0dHBzOi8vY29uc29sZS5jbG91ZC50ZW5jZW50LmNvbS90Y2IvZW52L3NhZmV0eScsXG4gICAgICAnICAzIC0g5LqR5a2Y5YKo5a6J5YWo6KeE5YiZ5piv5ZCm6ZmQ5Yi25LqG5b2T5YmN55m75b2V54q25oCB6K6/6ZeuJyxcbiAgICAgIGDlpoLmnpzpl67popjkvp3nhLblrZjlnKjvvIzlu7rorq7liLDlrpjmlrnpl67nrZTnpL7ljLrmj5Dpl67miJblr7vmib7luK7liqnvvJoke0NPTU1VTklUWV9TSVRFX1VSTH1gLFxuICAgIF0sXG4gIH0pXG4gIHB1YmxpYyBhc3luYyBjb3B5RmlsZShwYXJhbXM6IElDbG91ZGJhc2VDb3B5RmlsZVBhcmFtcywgY2FsbGJhY2s/OiBGdW5jdGlvbik6IFByb21pc2U8SUNsb3VkYmFzZUNvcHlGaWxlUmVzdWx0PiB7XG4gICAgY29uc3QgeyBmaWxlTGlzdCB9ID0gcGFyYW1zXG5cbiAgICBpZiAoIWZpbGVMaXN0IHx8ICFpc0FycmF5KGZpbGVMaXN0KSB8fCBmaWxlTGlzdC5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIGNvZGU6IEVSUk9SUy5JTlZBTElEX1BBUkFNUyxcbiAgICAgICAgbXNnOiBgWyR7Q09NUE9ORU5UX05BTUV9LmNvcHlGaWxlXSBmaWxlTGlzdCBtdXN0IG5vdCBiZSBlbXB0eWAsXG4gICAgICB9KSwpXG4gICAgfVxuXG4gICAgY29uc3QgY29udmVydGVkRmlsZUxpc3QgPSBbXVxuXG4gICAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVMaXN0KSB7XG4gICAgICBjb25zdCB7IHNyY1BhdGgsIGRzdFBhdGggfSA9IGZpbGVcbiAgICAgIGlmICghc3JjUGF0aCB8fCAhZHN0UGF0aCB8fCB0eXBlb2Ygc3JjUGF0aCAhPT0gJ3N0cmluZycgfHwgdHlwZW9mIGRzdFBhdGggIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgY29kZTogRVJST1JTLklOVkFMSURfUEFSQU1TLFxuICAgICAgICAgIG1zZzogYFske0NPTVBPTkVOVF9OQU1FfS5jb3B5RmlsZV0gc3JjUGF0aCBhbmQgZHN0UGF0aCBtYXkgbm90IGJlIGVtcHR5YCxcbiAgICAgICAgfSksKVxuICAgICAgfVxuICAgICAgaWYgKHNyY1BhdGggPT09IGRzdFBhdGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICBjb2RlOiBFUlJPUlMuSU5WQUxJRF9QQVJBTVMsXG4gICAgICAgICAgbXNnOiBgWyR7Q09NUE9ORU5UX05BTUV9LmNvcHlGaWxlXSBzcmNQYXRoIGFuZCBkc3RQYXRoIGNhbiBub3QgYmUgdGhlIHNhbWVgLFxuICAgICAgICB9KSwpXG4gICAgICB9XG4gICAgICAvLyAgIGlmIChiYXNlbmFtZShzcmNQYXRoKSAhPT0gYmFzZW5hbWUoZHN0UGF0aCkpIHtcbiAgICAgIC8vICAgICB0aHJvdyBuZXcgRXJyb3IoSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgLy8gICAgICAgY29kZTogRVJST1JTLklOVkFMSURfUEFSQU1TLFxuICAgICAgLy8gICAgICAgbXNnOiBgWyR7Q09NUE9ORU5UX05BTUV9LmNvcHlGaWxlXSBzcmNQYXRoIGFuZCBkc3RQYXRoIGZpbGUgbmFtZSBtdXN0IGJlIHRoZSBzYW1lYCxcbiAgICAgIC8vICAgICB9KSwpXG4gICAgICAvLyAgIH1cbiAgICAgIGNvbnZlcnRlZEZpbGVMaXN0LnB1c2goe1xuICAgICAgICBzcmNfcGF0aDogc3JjUGF0aCxcbiAgICAgICAgZHN0X3BhdGg6IGRzdFBhdGgsXG4gICAgICAgIG92ZXJ3cml0ZTogZmlsZS5vdmVyd3JpdGUsXG4gICAgICAgIHJlbW92ZV9vcmlnaW5hbDogZmlsZS5yZW1vdmVPcmlnaW5hbCxcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGNvbnN0IHsgcmVxdWVzdCB9ID0gdGhpc1xuICAgIGxldCByZXM6IGFueSA9IHt9XG5cbiAgICBpZiAodGhpcy5pc0dhdGVXYXkoKSkge1xuICAgICAgcmVzID0gYXdhaXQgc3RvcmFnZUdhdGVXYXkuY29weUZpbGUocmVxdWVzdCwgeyBjb252ZXJ0ZWRGaWxlTGlzdCB9LCBwYXJhbXMuY3VzdG9tUmVxT3B0cylcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgYWN0aW9uID0gJ3N0b3JhZ2UuYmF0Y2hDb3B5RmlsZSdcbiAgICAgIHJlcyA9IGF3YWl0IHJlcXVlc3Quc2VuZChhY3Rpb24sIHsgZmlsZV9saXN0OiBjb252ZXJ0ZWRGaWxlTGlzdCB9LCBwYXJhbXMuY3VzdG9tUmVxT3B0cylcbiAgICB9XG5cbiAgICBpZiAocmVzLmNvZGUpIHtcbiAgICAgIHJldHVybiBleGVjQ2FsbGJhY2soY2FsbGJhY2ssIG51bGwsIHJlcylcbiAgICB9XG5cbiAgICByZXR1cm4gZXhlY0NhbGxiYWNrKGNhbGxiYWNrLCBudWxsLCB7XG4gICAgICBmaWxlTGlzdDogcmVzLmRhdGEuY29weV9saXN0LFxuICAgICAgcmVxdWVzdElkOiByZXMucmVxdWVzdElkLFxuICAgIH0pXG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0RmlsZUluZm8ocGFyYW1zOiBJQ2xvdWRiYXNlR2V0VGVtcEZpbGVVUkxQYXJhbXMpOiBQcm9taXNlPHtcbiAgICBmaWxlTGlzdDogKFBpY2s8SUNsb3VkYmFzZUdldFRlbXBGaWxlVVJMUmVzdWx0WydmaWxlTGlzdCddWzBdLCAnY29kZScgfCAnZmlsZUlEJyB8ICd0ZW1wRmlsZVVSTCcgfCAnbWVzc2FnZSc+ICYge1xuICAgICAgZmlsZU5hbWU/OiBzdHJpbmdcbiAgICAgIGNsb3VkSWQ/OiBJQ2xvdWRiYXNlR2V0VGVtcEZpbGVVUkxSZXN1bHRbJ2ZpbGVMaXN0J11bMF1bJ2ZpbGVJRCddXG4gICAgICBjb250ZW50VHlwZT86IHN0cmluZ1xuICAgICAgbWltZT86IHN0cmluZ1xuICAgICAgc2l6ZT86IG51bWJlclxuICAgICAgY2FjaGVDb250cm9sPzogc3RyaW5nXG4gICAgICBsYXN0TW9kaWZpZWQ/OiBzdHJpbmdcbiAgICAgIGV0YWc/OiBzdHJpbmdcbiAgICB9KVtdXG4gICAgcmVxdWVzdElkOiBzdHJpbmdcbiAgfT4ge1xuICAgIGNvbnN0IGZpbGVJbmZvID0gYXdhaXQgdGhpcy5nZXRUZW1wRmlsZVVSTChwYXJhbXMpXG5cbiAgICBpZiAoZmlsZUluZm8/LmZpbGVMaXN0ICYmIGZpbGVJbmZvPy5maWxlTGlzdD8ubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgZmlsZUxpc3QgPSBhd2FpdCBQcm9taXNlLmFsbChmaWxlSW5mby5maWxlTGlzdC5tYXAoYXN5bmMgKGl0ZW06IElDbG91ZGJhc2VHZXRUZW1wRmlsZVVSTFJlc3VsdFsnZmlsZUxpc3QnXVswXSkgPT4ge1xuICAgICAgICBpZiAoaXRlbS5jb2RlICE9PSAnU1VDQ0VTUycpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29kZTogaXRlbS5jb2RlLFxuICAgICAgICAgICAgZmlsZUlEOiBpdGVtLmZpbGVJRCxcbiAgICAgICAgICAgIHRlbXBGaWxlVVJMOiBpdGVtLnRlbXBGaWxlVVJMLFxuICAgICAgICAgICAgbWVzc2FnZTogaXRlbS5tZXNzYWdlLFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgIGNvbnN0IHsgcmVxdWVzdCB9ID0gdGhpc1xuICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHJlcXVlc3QuZmV0Y2goeyB1cmw6IGl0ZW0udGVtcEZpbGVVUkwsIG1ldGhvZDogJ0hFQUQnIH0pXG4gICAgICAgICAgbGV0IHsgaGVhZGVyIH0gPSByZXNcblxuICAgICAgICAgIGlmIChIZWFkZXJzICYmIGhlYWRlciBpbnN0YW5jZW9mIEhlYWRlcnMpIHtcbiAgICAgICAgICAgIGhlYWRlciA9IE9iamVjdC5mcm9tRW50cmllcyhyZXMuaGVhZGVyLmVudHJpZXMoKSlcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJhZGl4XG4gICAgICAgICAgY29uc3QgZmlsZVNpemUgPSBwYXJzZUludChoZWFkZXJbJ2NvbnRlbnQtbGVuZ3RoJ10pIHx8IDBcbiAgICAgICAgICBjb25zdCBjb250ZW50VHlwZSA9IGhlYWRlclsnY29udGVudC10eXBlJ10gfHwgJydcblxuICAgICAgICAgIGlmIChbNDAwLCA0MDRdLmluY2x1ZGVzKE51bWJlcihyZXMuc3RhdHVzQ29kZSkpKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBjb2RlOiAnRklMRV9OT1RfRk9VTkQnLFxuICAgICAgICAgICAgICBmaWxlSUQ6IGl0ZW0uZmlsZUlELFxuICAgICAgICAgICAgICB0ZW1wRmlsZVVSTDogaXRlbS50ZW1wRmlsZVVSTCxcbiAgICAgICAgICAgICAgbWVzc2FnZTogJ2ZpbGUgbm90IGZvdW5kJyxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBmaWxlSW5mbyA9IHtcbiAgICAgICAgICAgIGNvZGU6IGl0ZW0uY29kZSxcbiAgICAgICAgICAgIGZpbGVJRDogaXRlbS5maWxlSUQsXG4gICAgICAgICAgICB0ZW1wRmlsZVVSTDogaXRlbS50ZW1wRmlsZVVSTCxcbiAgICAgICAgICAgIGNsb3VkSWQ6IGl0ZW0uZmlsZUlELFxuICAgICAgICAgICAgZmlsZU5hbWU6IGl0ZW0uZmlsZUlELnNwbGl0KCcvJykucG9wKCksXG4gICAgICAgICAgICBjb250ZW50VHlwZSxcbiAgICAgICAgICAgIG1pbWU6IGNvbnRlbnRUeXBlLnNwbGl0KCc7JylbMF0udHJpbSgpLFxuICAgICAgICAgICAgc2l6ZTogZmlsZVNpemUsXG4gICAgICAgICAgICBldGFnOiBoZWFkZXIuZXRhZyB8fCAnJyxcbiAgICAgICAgICAgIGxhc3RNb2RpZmllZDogaGVhZGVyWydsYXN0LW1vZGlmaWVkJ10gfHwgJycsXG4gICAgICAgICAgICBjYWNoZUNvbnRyb2w6IGhlYWRlclsnY2FjaGUtY29udHJvbCddIHx8ICcnLFxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBmaWxlSW5mb1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvZGU6ICdGRVRDSF9GSUxFX0lORk9fRVJST1InLFxuICAgICAgICAgICAgZmlsZUlEOiBpdGVtLmZpbGVJRCxcbiAgICAgICAgICAgIHRlbXBGaWxlVVJMOiBpdGVtLnRlbXBGaWxlVVJMLFxuICAgICAgICAgICAgbWVzc2FnZTogZS5tZXNzYWdlLFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSksKVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBmaWxlTGlzdCxcbiAgICAgICAgcmVxdWVzdElkOiBmaWxlSW5mby5yZXF1ZXN0SWQsXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGZpbGVMaXN0OiBbXSxcbiAgICAgIHJlcXVlc3RJZDogZmlsZUluZm8ucmVxdWVzdElkLFxuICAgIH1cbiAgfVxufVxuIl19