@cloudbase/storage 2.23.4-alpha.0 → 2.24.0

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,718 @@
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(context) {
171
+ this.context = context;
172
+ }
173
+ Object.defineProperty(CloudbaseStorage.prototype, "config", {
174
+ get: function () {
175
+ var _a;
176
+ return (_a = this.context) === null || _a === void 0 ? void 0 : _a.config;
177
+ },
178
+ enumerable: false,
179
+ configurable: true
180
+ });
181
+ Object.defineProperty(CloudbaseStorage.prototype, "request", {
182
+ get: function () {
183
+ var _a;
184
+ return (_a = this.context) === null || _a === void 0 ? void 0 : _a.request;
185
+ },
186
+ enumerable: false,
187
+ configurable: true
188
+ });
189
+ CloudbaseStorage.prototype.isGateWay = function () {
190
+ var config = this.config;
191
+ var endPointMode = config.endPointMode || 'CLOUD_API';
192
+ return endPointMode === 'GATEWAY';
193
+ };
194
+ CloudbaseStorage.prototype.uploadFile = function (params, callback) {
195
+ return __awaiter(this, void 0, void 0, function () {
196
+ var cloudPath, filePath, onUploadProgress, method, headers, fileContent, uploadMethod, metadataResult, metadata, requestId, url, authorization, token, fileId, cosFileId, downloadUrl, commonParams, putParams, postParams, uploadConfig, res;
197
+ var _a, _b, _c;
198
+ return __generator(this, function (_d) {
199
+ switch (_d.label) {
200
+ case 0:
201
+ 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;
202
+ if (!isString(cloudPath) || (!filePath && !fileContent)) {
203
+ throw new Error(JSON.stringify({
204
+ code: ERRORS.INVALID_PARAMS,
205
+ msg: "[".concat(exports.COMPONENT_NAME, ".uploadFile] invalid params"),
206
+ }));
207
+ }
208
+ uploadMethod = { put: EUploadMethod.put, post: EUploadMethod.post }[method.toLocaleLowerCase()] || EUploadMethod.put;
209
+ return [4, this.getUploadMetadata({
210
+ cloudPath: cloudPath,
211
+ method: uploadMethod,
212
+ headers: uploadMethod === EUploadMethod.put ? headers : undefined,
213
+ customReqOpts: params.customReqOpts,
214
+ })];
215
+ case 1:
216
+ metadataResult = _d.sent();
217
+ metadata = metadataResult.data, requestId = metadataResult.requestId;
218
+ url = metadata.url, authorization = metadata.authorization, token = metadata.token, fileId = metadata.fileId, cosFileId = metadata.cosFileId, downloadUrl = metadata.download_url;
219
+ commonParams = {
220
+ url: url,
221
+ file: filePath,
222
+ name: cloudPath,
223
+ onUploadProgress: onUploadProgress,
224
+ fileContent: fileContent,
225
+ fileId: fileId,
226
+ requestId: requestId,
227
+ };
228
+ putParams = __assign(__assign({}, commonParams), { method: EUploadMethod.put, headers: __assign(__assign({}, headers), { authorization: authorization, 'x-cos-meta-fileid': cosFileId, 'x-cos-security-token': token }) });
229
+ postParams = __assign(__assign({}, commonParams), { method: EUploadMethod.post, data: {
230
+ key: cloudPath,
231
+ signature: authorization,
232
+ 'x-cos-meta-fileid': cosFileId,
233
+ success_action_status: '201',
234
+ 'x-cos-security-token': token,
235
+ } });
236
+ uploadConfig = (_c = {},
237
+ _c[EUploadMethod.put] = {
238
+ params: putParams,
239
+ isSuccess: function (code) { return code >= 200 && code < 300; },
240
+ },
241
+ _c[EUploadMethod.post] = {
242
+ params: postParams,
243
+ isSuccess: function (code) { return code === 201; },
244
+ },
245
+ _c);
246
+ return [4, this.request.upload(uploadConfig[uploadMethod].params)];
247
+ case 2:
248
+ res = _d.sent();
249
+ if (uploadConfig[uploadMethod].isSuccess(res.statusCode)) {
250
+ return [2, execCallback(callback, null, {
251
+ fileID: fileId,
252
+ download_url: downloadUrl,
253
+ requestId: requestId,
254
+ })];
255
+ }
256
+ return [2, execCallback(callback, new Error("[".concat(getSdkName(), "][").concat(ERRORS.OPERATION_FAIL, "][").concat(exports.COMPONENT_NAME, "]:").concat(res.data)))];
257
+ }
258
+ });
259
+ });
260
+ };
261
+ CloudbaseStorage.prototype.getUploadMetadata = function (params, callback) {
262
+ return __awaiter(this, void 0, void 0, function () {
263
+ var cloudPath, method, headers, request, action, metaData, metaDataParam, err_1;
264
+ return __generator(this, function (_a) {
265
+ switch (_a.label) {
266
+ case 0:
267
+ cloudPath = params.cloudPath, method = params.method, headers = params.headers;
268
+ if (!isString(cloudPath)) {
269
+ throw new Error(JSON.stringify({
270
+ code: ERRORS.INVALID_PARAMS,
271
+ msg: "[".concat(exports.COMPONENT_NAME, ".getUploadMetadata] invalid cloudPath"),
272
+ }));
273
+ }
274
+ request = this.request;
275
+ action = 'storage.getUploadMetadata';
276
+ _a.label = 1;
277
+ case 1:
278
+ _a.trys.push([1, 6, , 7]);
279
+ metaData = void 0;
280
+ metaDataParam = { path: cloudPath };
281
+ if (method) {
282
+ metaDataParam.method = method;
283
+ }
284
+ if (method === EUploadMethod.put && headers) {
285
+ metaDataParam.headers = headers;
286
+ }
287
+ if (!this.isGateWay()) return [3, 3];
288
+ return [4, storageGateWay.getUploadInfo(request, metaDataParam, params.customReqOpts)];
289
+ case 2:
290
+ metaData = _a.sent();
291
+ return [3, 5];
292
+ case 3: return [4, request.send(action, metaDataParam, params.customReqOpts)];
293
+ case 4:
294
+ metaData = _a.sent();
295
+ _a.label = 5;
296
+ case 5: return [2, execCallback(callback, null, metaData)];
297
+ case 6:
298
+ err_1 = _a.sent();
299
+ return [2, execCallback(callback, err_1)];
300
+ case 7: return [2];
301
+ }
302
+ });
303
+ });
304
+ };
305
+ CloudbaseStorage.prototype.deleteFile = function (params, callback) {
306
+ return __awaiter(this, void 0, void 0, function () {
307
+ var fileList, _i, fileList_1, fileId, action, request, res, data;
308
+ return __generator(this, function (_a) {
309
+ switch (_a.label) {
310
+ case 0:
311
+ fileList = params.fileList;
312
+ if (!fileList || !isArray(fileList) || fileList.length === 0) {
313
+ throw new Error(JSON.stringify({
314
+ code: ERRORS.INVALID_PARAMS,
315
+ msg: "[".concat(exports.COMPONENT_NAME, ".deleteFile] fileList must not be empty"),
316
+ }));
317
+ }
318
+ for (_i = 0, fileList_1 = fileList; _i < fileList_1.length; _i++) {
319
+ fileId = fileList_1[_i];
320
+ if (!fileId || !isString(fileId)) {
321
+ throw new Error(JSON.stringify({
322
+ code: ERRORS.INVALID_PARAMS,
323
+ msg: "[".concat(exports.COMPONENT_NAME, ".deleteFile] fileID must be string"),
324
+ }));
325
+ }
326
+ }
327
+ action = 'storage.batchDeleteFile';
328
+ request = this.request;
329
+ res = {};
330
+ if (!this.isGateWay()) return [3, 2];
331
+ return [4, storageGateWay.delete(request, { fileList: fileList }, params.customReqOpts)];
332
+ case 1:
333
+ res = _a.sent();
334
+ return [3, 4];
335
+ case 2: return [4, request.send(action, {
336
+ fileid_list: fileList,
337
+ }, params.customReqOpts)];
338
+ case 3:
339
+ res = _a.sent();
340
+ _a.label = 4;
341
+ case 4:
342
+ if (res.code) {
343
+ return [2, execCallback(callback, null, res)];
344
+ }
345
+ data = {
346
+ fileList: res.data.delete_list,
347
+ requestId: res.requestId,
348
+ };
349
+ return [2, execCallback(callback, null, data)];
350
+ }
351
+ });
352
+ });
353
+ };
354
+ CloudbaseStorage.prototype.getTempFileURL = function (params, callback) {
355
+ return __awaiter(this, void 0, void 0, function () {
356
+ var fileList, convertedFileList, _i, fileList_2, file, action, request, res;
357
+ return __generator(this, function (_a) {
358
+ switch (_a.label) {
359
+ case 0:
360
+ fileList = params.fileList;
361
+ if (!fileList || !isArray(fileList) || fileList.length === 0) {
362
+ throw new Error(JSON.stringify({
363
+ code: ERRORS.INVALID_PARAMS,
364
+ msg: "[".concat(exports.COMPONENT_NAME, ".getTempFileURL] fileList must not be empty"),
365
+ }));
366
+ }
367
+ convertedFileList = [];
368
+ for (_i = 0, fileList_2 = fileList; _i < fileList_2.length; _i++) {
369
+ file = fileList_2[_i];
370
+ if (isPalinObject(file)) {
371
+ if (!Object.prototype.hasOwnProperty.call(file, 'fileID')) {
372
+ throw new Error(JSON.stringify({
373
+ code: ERRORS.INVALID_PARAMS,
374
+ msg: "[".concat(exports.COMPONENT_NAME, ".getTempFileURL] file info must include fileID"),
375
+ }));
376
+ }
377
+ convertedFileList.push({
378
+ fileid: file.fileID,
379
+ max_age: file.maxAge || 7200,
380
+ });
381
+ }
382
+ else if (isString(file)) {
383
+ convertedFileList.push({
384
+ fileid: file,
385
+ });
386
+ }
387
+ else {
388
+ throw new Error(JSON.stringify({
389
+ code: ERRORS.INVALID_PARAMS,
390
+ msg: "[".concat(exports.COMPONENT_NAME, ".getTempFileURL] invalid fileList"),
391
+ }));
392
+ }
393
+ }
394
+ action = 'storage.batchGetDownloadUrl';
395
+ request = this.request;
396
+ res = {};
397
+ if (!this.isGateWay()) return [3, 2];
398
+ return [4, storageGateWay.getDownLoadInfo(request, { convertedFileList: convertedFileList }, params.customReqOpts)];
399
+ case 1:
400
+ res = _a.sent();
401
+ return [3, 4];
402
+ case 2: return [4, request.send(action, { file_list: convertedFileList }, params.customReqOpts)];
403
+ case 3:
404
+ res = _a.sent();
405
+ _a.label = 4;
406
+ case 4:
407
+ if (res.code) {
408
+ return [2, execCallback(callback, null, res)];
409
+ }
410
+ return [2, execCallback(callback, null, {
411
+ fileList: res.data.download_list,
412
+ requestId: res.requestId,
413
+ })];
414
+ }
415
+ });
416
+ });
417
+ };
418
+ CloudbaseStorage.prototype.downloadFile = function (params, callback) {
419
+ return __awaiter(this, void 0, void 0, function () {
420
+ var fileID, tmpUrlRes, res, request, tmpUrl, result;
421
+ return __generator(this, function (_a) {
422
+ switch (_a.label) {
423
+ case 0:
424
+ fileID = params.fileID;
425
+ if (!isString(fileID)) {
426
+ throw new Error(JSON.stringify({
427
+ code: ERRORS.INVALID_PARAMS,
428
+ msg: "[".concat(exports.COMPONENT_NAME, ".getTempFileURL] fileID must be string"),
429
+ }));
430
+ }
431
+ return [4, this.getTempFileURL.call(this, {
432
+ fileList: [
433
+ {
434
+ fileID: fileID,
435
+ maxAge: 600,
436
+ },
437
+ ],
438
+ customReqOpts: params.customReqOpts,
439
+ })];
440
+ case 1:
441
+ tmpUrlRes = _a.sent();
442
+ res = tmpUrlRes.fileList[0];
443
+ if (res.code !== 'SUCCESS') {
444
+ return [2, execCallback(callback, res)];
445
+ }
446
+ request = this.request;
447
+ tmpUrl = encodeURI(res.download_url);
448
+ return [4, request.download({ url: tmpUrl, tempFilePath: params.tempFilePath })];
449
+ case 2:
450
+ result = _a.sent();
451
+ return [2, execCallback(callback, null, result)];
452
+ }
453
+ });
454
+ });
455
+ };
456
+ CloudbaseStorage.prototype.copyFile = function (params, callback) {
457
+ return __awaiter(this, void 0, void 0, function () {
458
+ var fileList, convertedFileList, _i, fileList_3, file, srcPath, dstPath, request, res, action;
459
+ return __generator(this, function (_a) {
460
+ switch (_a.label) {
461
+ case 0:
462
+ fileList = params.fileList;
463
+ if (!fileList || !isArray(fileList) || fileList.length === 0) {
464
+ throw new Error(JSON.stringify({
465
+ code: ERRORS.INVALID_PARAMS,
466
+ msg: "[".concat(exports.COMPONENT_NAME, ".copyFile] fileList must not be empty"),
467
+ }));
468
+ }
469
+ convertedFileList = [];
470
+ for (_i = 0, fileList_3 = fileList; _i < fileList_3.length; _i++) {
471
+ file = fileList_3[_i];
472
+ srcPath = file.srcPath, dstPath = file.dstPath;
473
+ if (!srcPath || !dstPath || typeof srcPath !== 'string' || typeof dstPath !== 'string') {
474
+ throw new Error(JSON.stringify({
475
+ code: ERRORS.INVALID_PARAMS,
476
+ msg: "[".concat(exports.COMPONENT_NAME, ".copyFile] srcPath and dstPath may not be empty"),
477
+ }));
478
+ }
479
+ if (srcPath === dstPath) {
480
+ throw new Error(JSON.stringify({
481
+ code: ERRORS.INVALID_PARAMS,
482
+ msg: "[".concat(exports.COMPONENT_NAME, ".copyFile] srcPath and dstPath can not be the same"),
483
+ }));
484
+ }
485
+ convertedFileList.push({
486
+ src_path: srcPath,
487
+ dst_path: dstPath,
488
+ overwrite: file.overwrite,
489
+ remove_original: file.removeOriginal,
490
+ });
491
+ }
492
+ request = this.request;
493
+ res = {};
494
+ if (!this.isGateWay()) return [3, 2];
495
+ return [4, storageGateWay.copyFile(request, { convertedFileList: convertedFileList }, params.customReqOpts)];
496
+ case 1:
497
+ res = _a.sent();
498
+ return [3, 4];
499
+ case 2:
500
+ action = 'storage.batchCopyFile';
501
+ return [4, request.send(action, { file_list: convertedFileList }, params.customReqOpts)];
502
+ case 3:
503
+ res = _a.sent();
504
+ _a.label = 4;
505
+ case 4:
506
+ if (res.code) {
507
+ return [2, execCallback(callback, null, res)];
508
+ }
509
+ return [2, execCallback(callback, null, {
510
+ fileList: res.data.copy_list,
511
+ requestId: res.requestId,
512
+ })];
513
+ }
514
+ });
515
+ });
516
+ };
517
+ CloudbaseStorage.prototype.getFileInfo = function (params) {
518
+ var _a;
519
+ return __awaiter(this, void 0, void 0, function () {
520
+ var fileInfo, fileList;
521
+ var _this = this;
522
+ return __generator(this, function (_b) {
523
+ switch (_b.label) {
524
+ case 0: return [4, this.getTempFileURL(params)];
525
+ case 1:
526
+ fileInfo = _b.sent();
527
+ 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];
528
+ return [4, Promise.all(fileInfo.fileList.map(function (item) { return __awaiter(_this, void 0, void 0, function () {
529
+ var request, res, header, fileSize, contentType, fileInfo_1, e_1;
530
+ return __generator(this, function (_a) {
531
+ switch (_a.label) {
532
+ case 0:
533
+ if (item.code !== 'SUCCESS') {
534
+ return [2, {
535
+ code: item.code,
536
+ fileID: item.fileID,
537
+ tempFileURL: item.tempFileURL,
538
+ message: item.message,
539
+ }];
540
+ }
541
+ _a.label = 1;
542
+ case 1:
543
+ _a.trys.push([1, 3, , 4]);
544
+ request = this.request;
545
+ return [4, request.fetch({ url: item.tempFileURL, method: 'HEAD' })];
546
+ case 2:
547
+ res = _a.sent();
548
+ header = res.header;
549
+ if (Headers && header instanceof Headers) {
550
+ header = Object.fromEntries(res.header.entries());
551
+ }
552
+ fileSize = parseInt(header['content-length']) || 0;
553
+ contentType = header['content-type'] || '';
554
+ if ([400, 404].includes(Number(res.statusCode))) {
555
+ return [2, {
556
+ code: 'FILE_NOT_FOUND',
557
+ fileID: item.fileID,
558
+ tempFileURL: item.tempFileURL,
559
+ message: 'file not found',
560
+ }];
561
+ }
562
+ fileInfo_1 = {
563
+ code: item.code,
564
+ fileID: item.fileID,
565
+ tempFileURL: item.tempFileURL,
566
+ cloudId: item.fileID,
567
+ fileName: item.fileID.split('/').pop(),
568
+ contentType: contentType,
569
+ mime: contentType.split(';')[0].trim(),
570
+ size: fileSize,
571
+ etag: header.etag || '',
572
+ lastModified: header['last-modified'] || '',
573
+ cacheControl: header['cache-control'] || '',
574
+ };
575
+ return [2, fileInfo_1];
576
+ case 3:
577
+ e_1 = _a.sent();
578
+ return [2, {
579
+ code: 'FETCH_FILE_INFO_ERROR',
580
+ fileID: item.fileID,
581
+ tempFileURL: item.tempFileURL,
582
+ message: e_1.message,
583
+ }];
584
+ case 4: return [2];
585
+ }
586
+ });
587
+ }); }))];
588
+ case 2:
589
+ fileList = _b.sent();
590
+ return [2, {
591
+ fileList: fileList,
592
+ requestId: fileInfo.requestId,
593
+ }];
594
+ case 3: return [2, {
595
+ fileList: [],
596
+ requestId: fileInfo.requestId,
597
+ }];
598
+ }
599
+ });
600
+ });
601
+ };
602
+ __decorate([
603
+ catchErrorsDecorator({
604
+ customInfo: {
605
+ className: 'Cloudbase',
606
+ methodName: 'uploadFile',
607
+ },
608
+ title: '上传文件失败',
609
+ messages: [
610
+ '请确认以下各项:',
611
+ ' 1 - 调用 uploadFile() 的语法或参数是否正确',
612
+ ' 2 - 当前域名是否在安全域名列表中:https://console.cloud.tencent.com/tcb/env/safety',
613
+ ' 3 - 云存储安全规则是否限制了当前登录状态访问',
614
+ "\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),
615
+ ],
616
+ }),
617
+ __metadata("design:type", Function),
618
+ __metadata("design:paramtypes", [Object, Function]),
619
+ __metadata("design:returntype", Promise)
620
+ ], CloudbaseStorage.prototype, "uploadFile", null);
621
+ __decorate([
622
+ catchErrorsDecorator({
623
+ customInfo: {
624
+ className: 'Cloudbase',
625
+ methodName: 'getUploadMetadata',
626
+ },
627
+ title: '获取上传元信息失败',
628
+ messages: [
629
+ '请确认以下各项:',
630
+ ' 1 - 调用 getUploadMetadata() 的语法或参数是否正确',
631
+ ' 2 - 当前域名是否在安全域名列表中:https://console.cloud.tencent.com/tcb/env/safety',
632
+ ' 3 - 云存储安全规则是否限制了当前登录状态访问',
633
+ "\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),
634
+ ],
635
+ }),
636
+ __metadata("design:type", Function),
637
+ __metadata("design:paramtypes", [Object, Function]),
638
+ __metadata("design:returntype", Promise)
639
+ ], CloudbaseStorage.prototype, "getUploadMetadata", null);
640
+ __decorate([
641
+ catchErrorsDecorator({
642
+ customInfo: {
643
+ className: 'Cloudbase',
644
+ methodName: 'deleteFile',
645
+ },
646
+ title: '删除文件失败',
647
+ messages: [
648
+ '请确认以下各项:',
649
+ ' 1 - 调用 deleteFile() 的语法或参数是否正确',
650
+ ' 2 - 当前域名是否在安全域名列表中:https://console.cloud.tencent.com/tcb/env/safety',
651
+ ' 3 - 云存储安全规则是否限制了当前登录状态访问',
652
+ "\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),
653
+ ],
654
+ }),
655
+ __metadata("design:type", Function),
656
+ __metadata("design:paramtypes", [Object, Function]),
657
+ __metadata("design:returntype", Promise)
658
+ ], CloudbaseStorage.prototype, "deleteFile", null);
659
+ __decorate([
660
+ catchErrorsDecorator({
661
+ customInfo: {
662
+ className: 'Cloudbase',
663
+ methodName: 'getTempFileURL',
664
+ },
665
+ title: '获取文件下载链接',
666
+ messages: [
667
+ '请确认以下各项:',
668
+ ' 1 - 调用 getTempFileURL() 的语法或参数是否正确',
669
+ ' 2 - 当前域名是否在安全域名列表中:https://console.cloud.tencent.com/tcb/env/safety',
670
+ ' 3 - 云存储安全规则是否限制了当前登录状态访问',
671
+ "\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),
672
+ ],
673
+ }),
674
+ __metadata("design:type", Function),
675
+ __metadata("design:paramtypes", [Object, Function]),
676
+ __metadata("design:returntype", Promise)
677
+ ], CloudbaseStorage.prototype, "getTempFileURL", null);
678
+ __decorate([
679
+ catchErrorsDecorator({
680
+ customInfo: {
681
+ className: 'Cloudbase',
682
+ methodName: 'downloadFile',
683
+ },
684
+ title: '下载文件失败',
685
+ messages: [
686
+ '请确认以下各项:',
687
+ ' 1 - 调用 downloadFile() 的语法或参数是否正确',
688
+ ' 2 - 当前域名是否在安全域名列表中:https://console.cloud.tencent.com/tcb/env/safety',
689
+ ' 3 - 云存储安全规则是否限制了当前登录状态访问',
690
+ "\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),
691
+ ],
692
+ }),
693
+ __metadata("design:type", Function),
694
+ __metadata("design:paramtypes", [Object, Function]),
695
+ __metadata("design:returntype", Promise)
696
+ ], CloudbaseStorage.prototype, "downloadFile", null);
697
+ __decorate([
698
+ catchErrorsDecorator({
699
+ customInfo: {
700
+ className: 'Cloudbase',
701
+ methodName: 'copyFile',
702
+ },
703
+ title: '批量复制文件',
704
+ messages: [
705
+ '请确认以下各项:',
706
+ ' 1 - 调用 copyFile() 的语法或参数是否正确',
707
+ ' 2 - 当前域名是否在安全域名列表中:https://console.cloud.tencent.com/tcb/env/safety',
708
+ ' 3 - 云存储安全规则是否限制了当前登录状态访问',
709
+ "\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),
710
+ ],
711
+ }),
712
+ __metadata("design:type", Function),
713
+ __metadata("design:paramtypes", [Object, Function]),
714
+ __metadata("design:returntype", Promise)
715
+ ], CloudbaseStorage.prototype, "copyFile", null);
716
+ return CloudbaseStorage;
717
+ }());
718
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zdG9yYWdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsa0RBQWdFO0FBa0JoRSxJQUFLLGFBR0o7QUFIRCxXQUFLLGFBQWE7SUFDaEIsNEJBQVcsQ0FBQTtJQUNYLDhCQUFhLENBQUE7QUFDZixDQUFDLEVBSEksYUFBYSxLQUFiLGFBQWEsUUFHakI7QUFXTyxJQUFBLFVBQVUsR0FBaUMscUJBQVMsV0FBMUMsRUFBRSxNQUFNLEdBQXlCLHFCQUFTLE9BQWxDLEVBQUUsa0JBQWtCLEdBQUsscUJBQVMsbUJBQWQsQ0FBYztBQUNwRCxJQUFBLE9BQU8sR0FBNEMsaUJBQUssUUFBakQsRUFBRSxRQUFRLEdBQWtDLGlCQUFLLFNBQXZDLEVBQUUsYUFBYSxHQUFtQixpQkFBSyxjQUF4QixFQUFFLFlBQVksR0FBSyxpQkFBSyxhQUFWLENBQVU7QUFDeEQsSUFBQSxvQkFBb0IsR0FBSyxtQkFBTyxxQkFBWixDQUFZO0FBRTNCLFFBQUEsY0FBYyxHQUFHLFNBQVMsQ0FBQTtBQVF2QyxJQUFNLGNBQWMsR0FBRztJQUNyQixhQUFhLEVBQUUsVUFDYixPQUFPLEVBQ1AsTUFBMEQsRUFDMUQsYUFBMEQ7Ozs7O3dCQUVoRCxXQUFNLE9BQU8sQ0FBQyxPQUFPLENBQzdCO3dCQUNFLElBQUksRUFBRSxVQUFVO3dCQUNoQixJQUFJLEVBQUUseUJBQXlCO3dCQUMvQixJQUFJLEVBQUU7dUNBRUYsUUFBUSxFQUFFLE1BQU0sQ0FBQyxJQUFJLElBQ2xCLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxZQUFZLEVBQUUsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7eUJBRTlEO3FCQUNGLEVBQ0QsYUFBYSxDQUNkLEVBQUE7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U0FDRixDQUFDOztpREFHVyxRQUFROzswREF3RHBCO0lBZVk7UUFkWixvQkFBb0IsQ0FBQztZQUNwQixVQUFVLEVBQUU7Z0JBQ1YsU0FBUyxFQUFFLFdBQVc7Z0JBQ3RCLFVBQVUsRUFBRSxjQUFjO2FBQzNCO1lBQ0QsS0FBSyxFQUFFLFFBQVE7WUFDZixRQUFRLEVBQUU7Z0JBQ1IsVUFBVTtnQkFDVixvQ0FBb0M7Z0JBQ3BDLHVFQUF1RTtnQkFDdkUsNEJBQTRCO2dCQUM1QixzS0FBNkIsa0JBQWtCLENBQUU7YUFDbEQ7U0FDRixDQUFDOztpREFHVyxRQUFROzt3REFnQ3BCO0lBZVk7UUFkWixvQkFBb0IsQ0FBQztZQUNwQixVQUFVLEVBQUU7Z0JBQ1YsU0FBUyxFQUFFLFdBQVc7Z0JBQ3RCLFVBQVUsRUFBRSxVQUFVO2FBQ3ZCO1lBQ0QsS0FBSyxFQUFFLFFBQVE7WUFDZixRQUFRLEVBQUU7Z0JBQ1IsVUFBVTtnQkFDVixnQ0FBZ0M7Z0JBQ2hDLHVFQUF1RTtnQkFDdkUsNEJBQTRCO2dCQUM1QixzS0FBNkIsa0JBQWtCLENBQUU7YUFDbEQ7U0FDRixDQUFDOztpREFDaUUsUUFBUTs7b0RBMkQxRTtJQXNGSCx1QkFBQztDQUFBLEFBMWdCRCxJQTBnQkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjb25zdGFudHMsIHV0aWxzLCBoZWxwZXJzIH0gZnJvbSAnQGNsb3VkYmFzZS91dGlsaXRpZXMnXG5cbmltcG9ydCB7XG4gIElDbG91ZGJhc2VGaWxlTWV0YURhdGFSZXMsXG4gIElDbG91ZGJhc2VGaWxlSW5mbyxcbiAgSUNsb3VkYmFzZVVwbG9hZEZpbGVQYXJhbXMsXG4gIElDbG91ZGJhc2VVcGxvYWRGaWxlUmVzdWx0LFxuICBJQ2xvdWRiYXNlR2V0VXBsb2FkTWV0YWRhdGFQYXJhbXMsXG4gIElDbG91ZGJhc2VEZWxldGVGaWxlUGFyYW1zLFxuICBJQ2xvdWRiYXNlRGVsZXRlRmlsZVJlc3VsdCxcbiAgSUNsb3VkYmFzZUdldFRlbXBGaWxlVVJMUmVzdWx0LFxuICBJQ2xvdWRiYXNlR2V0VGVtcEZpbGVVUkxQYXJhbXMsXG4gIElDbG91ZGJhc2VEb3dubG9hZEZpbGVSZXN1bHQsXG4gIElDbG91ZGJhc2VEb3dubG9hZEZpbGVQYXJhbXMsXG4gIElDbG91ZGJhc2VDb3B5RmlsZVBhcmFtcyxcbiAgSUNsb3VkYmFzZUNvcHlGaWxlUmVzdWx0LFxufSBmcm9tICdAY2xvdWRiYXNlL3R5cGVzL3N0b3JhZ2UnXG5cbmVudW0gRVVwbG9hZE1ldGhvZCB7XG4gIHB1dCA9ICdwdXQnLFxuICBwb3N0ID0gJ3Bvc3QnLFxufVxuXG5pbnRlcmZhY2UgSVVwbG9hZE1ldGFkYXRhIHtcbiAgdXJsOiBzdHJpbmdcbiAgdG9rZW46IHN0cmluZ1xuICBhdXRob3JpemF0aW9uOiBzdHJpbmdcbiAgZmlsZUlkOiBzdHJpbmdcbiAgY29zRmlsZUlkOiBzdHJpbmdcbiAgZG93bmxvYWRfdXJsPzogc3RyaW5nXG59XG5cbmNvbnN0IHsgZ2V0U2RrTmFtZSwgRVJST1JTLCBDT01NVU5JVFlfU0lURV9VUkwgfSA9IGNvbnN0YW50c1xuY29uc3QgeyBpc0FycmF5LCBpc1N0cmluZywgaXNQYWxpbk9iamVjdCwgZXhlY0NhbGxiYWNrIH0gPSB1dGlsc1xuY29uc3QgeyBjYXRjaEVycm9yc0RlY29yYXRvciB9ID0gaGVscGVyc1xuXG5leHBvcnQgY29uc3QgQ09NUE9ORU5UX05BTUUgPSAnc3RvcmFnZSdcblxuLy8gZnVuY3Rpb24gYmFzZW5hbWUocGF0aCkge1xuLy8gICBjb25zdCBsYXN0U2xhc2hJbmRleCA9IHBhdGgubGFzdEluZGV4T2YoJy8nKVxuLy8gICBpZiAobGFzdFNsYXNoSW5kZXggPT09IC0xKSByZXR1cm4gcGF0aFxuLy8gICByZXR1cm4gcGF0aC5zbGljZShsYXN0U2xhc2hJbmRleCArIDEpXG4vLyB9XG5cbmNvbnN0IHN0b3JhZ2VHYXRlV2F5ID0ge1xuICBnZXRVcGxvYWRJbmZvOiBhc3luYyAoXG4gICAgcmVxdWVzdCxcbiAgICBwYXJhbXM6IHsgcGF0aDogc3RyaW5nOyBoZWFkZXJzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB9LFxuICAgIGN1c3RvbVJlcU9wdHM6IElDbG91ZGJhc2VVcGxvYWRGaWxlUGFyYW1zWydjdXN0b21SZXFPcHRzJ10sXG4gICkgPT4ge1xuICAgIGxldCByZXMgPSBhd2FpdCByZXF1ZXN0LmdhdGVXYXkoXG4gICAgICB7XG4gICAgICAgIHBhdGg6ICdzdG9yYWdlcycsXG4gICAgICAgIG5hbWU6ICdnZXQtb2JqZWN0cy11cGxvYWQtaW5mbycsXG4gICAgICAgIGRhdGE6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBvYmplY3RJZDogcGFyYW1zLnBhdGgsXG4gICAgICAgICAgICAuLi4ocGFyYW1zLmhlYWRlcnMgPyB7IHNpZ25lZEhlYWRlcjogcGFyYW1zLmhlYWRlcnMgfSA6IHt9KSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICAgIGN1c3RvbVJlcU9wdHMsXG4gICAgKVxuICAgIGNvbnN0IGRhdGEgPSByZXMuZGF0YT8uWzBdIHx8IHt9XG5cbiAgICByZXMgPSB7XG4gICAgICAuLi5yZXMsXG4gICAgICBkYXRhOiB7XG4gICAgICAgIC4uLihkYXRhLmNvZGUgPyB7IC4uLmRhdGEgfSA6IHt9KSxcbiAgICAgICAgYXV0aG9yaXphdGlvbjogZGF0YS5hdXRob3JpemF0aW9uLFxuICAgICAgICB0b2tlbjogZGF0YS50b2tlbixcbiAgICAgICAgdXJsOiBkYXRhLnVwbG9hZFVybCxcbiAgICAgICAgZmlsZUlkOiBkYXRhLmNsb3VkT2JqZWN0SWQsXG4gICAgICAgIGNvc0ZpbGVJZDogZGF0YS5jbG91ZE9iamVjdE1ldGEsXG4gICAgICAgIGRvd25sb2FkX3VybDogZGF0YS5kb3dubG9hZFVybCxcbiAgICAgIH0sXG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc1xuICB9LFxuICBnZXREb3duTG9hZEluZm86IGFzeW5jIChcbiAgICByZXF1ZXN0LFxuICAgIHBhcmFtczogeyBjb252ZXJ0ZWRGaWxlTGlzdDogQXJyYXk8eyBmaWxlaWQ6IHN0cmluZyB9PiB9LFxuICAgIGN1c3RvbVJlcU9wdHM6IElDbG91ZGJhc2VVcGxvYWRGaWxlUGFyYW1zWydjdXN0b21SZXFPcHRzJ10sXG4gICkgPT4ge1xuICAgIGxldCByZXMgPSBhd2FpdCByZXF1ZXN0LmdhdGVXYXkoXG4gICAgICB7XG4gICAgICAgIHBhdGg6ICdzdG9yYWdlcycsXG4gICAgICAgIG5hbWU6ICdnZXQtb2JqZWN0cy1kb3dubG9hZC1pbmZvJyxcbiAgICAgICAgZGF0YTogcGFyYW1zLmNvbnZlcnRlZEZpbGVMaXN0Lm1hcCgodjogYW55KSA9PiAoeyBjbG91ZE9iamVjdElkOiB2LmZpbGVpZCB9KSksXG4gICAgICB9LFxuICAgICAgY3VzdG9tUmVxT3B0cyxcbiAgICApXG4gICAgcmVzID0ge1xuICAgICAgLi4ucmVzLFxuICAgICAgZGF0YToge1xuICAgICAgICBkb3dubG9hZF9saXN0OiByZXMuZGF0YT8ubWFwKHYgPT4gKHtcbiAgICAgICAgICBjb2RlOiB2LmNvZGUgfHwgJ1NVQ0NFU1MnLFxuICAgICAgICAgIG1lc3NhZ2U6IHYubWVzc2FnZSxcbiAgICAgICAgICBmaWxlaWQ6IHYuY2xvdWRPYmplY3RJZCxcbiAgICAgICAgICBkb3dubG9hZF91cmw6IHYuZG93bmxvYWRVcmwsXG4gICAgICAgICAgZmlsZUlEOiB2LmNsb3VkT2JqZWN0SWQsXG4gICAgICAgICAgdGVtcEZpbGVVUkw6IHYuZG93bmxvYWRVcmwsXG4gICAgICAgIH0pKSxcbiAgICAgIH0sXG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc1xuICB9LFxuICBkZWxldGU6IGFzeW5jIChcbiAgICByZXF1ZXN0LFxuICAgIHBhcmFtczogeyBmaWxlTGlzdDogQXJyYXk8c3RyaW5nPiB9LFxuICAgIGN1c3RvbVJlcU9wdHM6IElDbG91ZGJhc2VVcGxvYWRGaWxlUGFyYW1zWydjdXN0b21SZXFPcHRzJ10sXG4gICkgPT4ge1xuICAgIGxldCByZXMgPSBhd2FpdCByZXF1ZXN0LmdhdGVXYXkoXG4gICAgICB7XG4gICAgICAgIHBhdGg6ICdzdG9yYWdlcycsXG4gICAgICAgIG5hbWU6ICdkZWxldGUtb2JqZWN0cycsXG4gICAgICAgIGRhdGE6IHBhcmFtcy5maWxlTGlzdC5tYXAodiA9PiAoeyBjbG91ZE9iamVjdElkOiB2IH0pKSxcbiAgICAgIH0sXG4gICAgICBjdXN0b21SZXFPcHRzLFxuICAgIClcbiAgICByZXMgPSB7XG4gICAgICAuLi5yZXMsXG4gICAgICBkYXRhOiB7XG4gICAgICAgIGRlbGV0ZV9saXN0OiByZXMuZGF0YT8ubWFwKHYgPT4gKHtcbiAgICAgICAgICBjb2RlOiB2LmNvZGUgfHwgJ1NVQ0NFU1MnLFxuICAgICAgICAgIGZpbGVJRDogdi5jbG91ZE9iamVjdElkLFxuICAgICAgICAgIG1lc3NhZ2U6IHYubWVzc2FnZSxcbiAgICAgICAgfSkpLFxuICAgICAgfSxcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzXG4gIH0sXG4gIGNvcHlGaWxlOiBhc3luYyAoXG4gICAgcmVxdWVzdCxcbiAgICBwYXJhbXM6IHtcbiAgICAgIGNvbnZlcnRlZEZpbGVMaXN0OiBBcnJheTx7IHNyY19wYXRoOiBzdHJpbmc7IGRzdF9wYXRoOiBzdHJpbmc7IG92ZXJ3cml0ZTogYm9vbGVhbjsgcmVtb3ZlX29yaWdpbmFsOiBib29sZWFuIH0+XG4gICAgfSxcbiAgICBjdXN0b21SZXFPcHRzOiBJQ2xvdWRiYXNlVXBsb2FkRmlsZVBhcmFtc1snY3VzdG9tUmVxT3B0cyddLFxuICApID0+IHtcbiAgICBsZXQgcmVzID0gYXdhaXQgcmVxdWVzdC5nYXRlV2F5KFxuICAgICAge1xuICAgICAgICBwYXRoOiAnc3RvcmFnZXMnLFxuICAgICAgICBuYW1lOiAnY29weS1vYmplY3RzJyxcbiAgICAgICAgZGF0YTogcGFyYW1zLmNvbnZlcnRlZEZpbGVMaXN0Lm1hcCgodjogYW55KSA9PiAoe1xuICAgICAgICAgIHNyY1BhdGg6IHYuc3JjX3BhdGgsXG4gICAgICAgICAgZHN0UGF0aDogdi5kc3RfcGF0aCxcbiAgICAgICAgICBvdmVyd3JpdGU6IHYub3ZlcndyaXRlLFxuICAgICAgICAgIHJlbW92ZU9yaWdpbmFsOiB2LnJlbW92ZV9vcmlnaW5hbCxcbiAgICAgICAgfSkpLFxuICAgICAgfSxcbiAgICAgIGN1c3RvbVJlcU9wdHMsXG4gICAgKVxuICAgIHJlcyA9IHtcbiAgICAgIC4uLnJlcyxcbiAgICAgIGRhdGE6IHtcbiAgICAgICAgY29weV9saXN0OiByZXMuZGF0YT8ubWFwKHYgPT4gKHtcbiAgICAgICAgICBjb2RlOiB2LmNvZGUgfHwgJ1NVQ0NFU1MnLFxuICAgICAgICAgIGZpbGVJRDogdi5jbG91ZE9iamVjdElkLFxuICAgICAgICAgIG1lc3NhZ2U6IHYubWVzc2FnZSxcbiAgICAgICAgfSkpLFxuICAgICAgfSxcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzXG4gIH0sXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUNsb3VkYmFzZUNvbnRleHQge1xuICBjb25maWc6IGFueVxuICByZXF1ZXN0OiBhbnlcbn1cblxuZXhwb3J0IGNsYXNzIENsb3VkYmFzZVN0b3JhZ2Uge1xuICBwcml2YXRlIGNvbnRleHQ/OiBJQ2xvdWRiYXNlQ29udGV4dFxuICBjb25zdHJ1Y3Rvcihjb250ZXh0PzogSUNsb3VkYmFzZUNvbnRleHQpIHtcbiAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0XG4gIH1cblxuICBnZXQgY29uZmlnKCkge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICByZXR1cm4gdGhpcy5jb250ZXh0Py5jb25maWdcbiAgfVxuXG4gIGdldCByZXF1ZXN0KCkge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICByZXR1cm4gdGhpcy5jb250ZXh0Py5yZXF1ZXN0XG4gIH1cblxuICBwdWJsaWMgaXNHYXRlV2F5KCkge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBjb25zdCB7IGNvbmZpZyB9ID0gdGhpc1xuICAgIGNvbnN0IGVuZFBvaW50TW9kZSA9IGNvbmZpZy5lbmRQb2ludE1vZGUgfHwgJ0NMT1VEX0FQSSdcblxuICAgIHJldHVybiBlbmRQb2ludE1vZGUgPT09ICdHQVRFV0FZJ1xuICB9XG5cbiAgQGNhdGNoRXJyb3JzRGVjb3JhdG9yKHtcbiAgICBjdXN0b21JbmZvOiB7XG4gICAgICBjbGFzc05hbWU6ICdDbG91ZGJhc2UnLFxuICAgICAgbWV0aG9kTmFtZTogJ3VwbG9hZEZpbGUnLFxuICAgIH0sXG4gICAgdGl0bGU6ICfkuIrkvKDmlofku7blpLHotKUnLFxuICAgIG1lc3NhZ2VzOiBbXG4gICAgICAn6K+356Gu6K6k5Lul5LiL5ZCE6aG577yaJyxcbiAgICAgICcgIDEgLSDosIPnlKggdXBsb2FkRmlsZSgpIOeahOivreazleaIluWPguaVsOaYr+WQpuato+ehricsXG4gICAgICAnICAyIC0g5b2T5YmN5Z+f5ZCN5piv5ZCm5Zyo5a6J5YWo5Z+f5ZCN5YiX6KGo5Lit77yaaHR0cHM6Ly9jb25zb2xlLmNsb3VkLnRlbmNlbnQuY29tL3RjYi9lbnYvc2FmZXR5JyxcbiAgICAgICcgIDMgLSDkupHlrZjlgqjlronlhajop4TliJnmmK/lkKbpmZDliLbkuoblvZPliY3nmbvlvZXnirbmgIHorr/pl64nLFxuICAgICAgYOWmguaenOmXrumimOS+neeEtuWtmOWcqO+8jOW7uuiuruWIsOWumOaWuemXruetlOekvuWMuuaPkOmXruaIluWvu+aJvuW4ruWKqe+8miR7Q09NTVVOSVRZX1NJVEVfVVJMfWAsXG4gICAgXSxcbiAgfSlcbiAgcHVibGljIGFzeW5jIHVwbG9hZEZpbGUoXG4gICAgcGFyYW1zOiBPbWl0PElDbG91ZGJhc2VVcGxvYWRGaWxlUGFyYW1zLCAnZmlsZVBhdGgnPiAmIHsgZmlsZVBhdGg/OiBzdHJpbmcgfSxcbiAgICBjYWxsYmFjaz86IEZ1bmN0aW9uLFxuICApOiBQcm9taXNlPElDbG91ZGJhc2VVcGxvYWRGaWxlUmVzdWx0PiB7XG4gICAgY29uc3QgeyBjbG91ZFBhdGgsIGZpbGVQYXRoLCBvblVwbG9hZFByb2dyZXNzLCBtZXRob2QgPSAncHV0JywgaGVhZGVycyA9IHt9LCBmaWxlQ29udGVudCB9ID0gcGFyYW1zXG4gICAgaWYgKCFpc1N0cmluZyhjbG91ZFBhdGgpIHx8ICghZmlsZVBhdGggJiYgIWZpbGVDb250ZW50KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgY29kZTogRVJST1JTLklOVkFMSURfUEFSQU1TLFxuICAgICAgICBtc2c6IGBbJHtDT01QT05FTlRfTkFNRX0udXBsb2FkRmlsZV0gaW52YWxpZCBwYXJhbXNgLFxuICAgICAgfSksKVxuICAgIH1cbiAgICBjb25zdCB1cGxvYWRNZXRob2QgPSAgICAgIHsgcHV0OiBFVXBsb2FkTWV0aG9kLnB1dCwgcG9zdDogRVVwbG9hZE1ldGhvZC5wb3N0IH1bbWV0aG9kLnRvTG9jYWxlTG93ZXJDYXNlKCldIHx8IEVVcGxvYWRNZXRob2QucHV0XG5cbiAgICAvLyDosIPnlKggZ2V0VXBsb2FkTWV0YWRhdGEg6I635Y+W5LiK5Lyg5YWD5pWw5o2uXG4gICAgY29uc3QgbWV0YWRhdGFSZXN1bHQgPSBhd2FpdCB0aGlzLmdldFVwbG9hZE1ldGFkYXRhKHtcbiAgICAgIGNsb3VkUGF0aCxcbiAgICAgIG1ldGhvZDogdXBsb2FkTWV0aG9kLFxuICAgICAgaGVhZGVyczogdXBsb2FkTWV0aG9kID09PSBFVXBsb2FkTWV0aG9kLnB1dCA/IGhlYWRlcnMgOiB1bmRlZmluZWQsXG4gICAgICBjdXN0b21SZXFPcHRzOiBwYXJhbXMuY3VzdG9tUmVxT3B0cyxcbiAgICB9KVxuXG4gICAgY29uc3QgeyBkYXRhOiBtZXRhZGF0YSwgcmVxdWVzdElkIH0gPSBtZXRhZGF0YVJlc3VsdFxuICAgIGNvbnN0IHsgdXJsLCBhdXRob3JpemF0aW9uLCB0b2tlbiwgZmlsZUlkLCBjb3NGaWxlSWQsIGRvd25sb2FkX3VybDogZG93bmxvYWRVcmwgfSA9IG1ldGFkYXRhXG5cbiAgICBjb25zdCBjb21tb25QYXJhbXMgPSB7XG4gICAgICB1cmwsXG4gICAgICBmaWxlOiBmaWxlUGF0aCxcbiAgICAgIG5hbWU6IGNsb3VkUGF0aCxcbiAgICAgIG9uVXBsb2FkUHJvZ3Jlc3MsXG4gICAgICBmaWxlQ29udGVudCxcbiAgICAgIGZpbGVJZCxcbiAgICAgIHJlcXVlc3RJZCxcbiAgICB9XG5cbiAgICBjb25zdCBwdXRQYXJhbXMgPSB7XG4gICAgICAuLi5jb21tb25QYXJhbXMsXG4gICAgICBtZXRob2Q6IEVVcGxvYWRNZXRob2QucHV0LFxuICAgICAgaGVhZGVyczoge1xuICAgICAgICAuLi5oZWFkZXJzLFxuICAgICAgICBhdXRob3JpemF0aW9uLFxuICAgICAgICAneC1jb3MtbWV0YS1maWxlaWQnOiBjb3NGaWxlSWQsXG4gICAgICAgICd4LWNvcy1zZWN1cml0eS10b2tlbic6IHRva2VuLFxuICAgICAgfSxcbiAgICB9XG5cbiAgICBjb25zdCBwb3N0UGFyYW1zID0ge1xuICAgICAgLi4uY29tbW9uUGFyYW1zLFxuICAgICAgbWV0aG9kOiBFVXBsb2FkTWV0aG9kLnBvc3QsXG4gICAgICBkYXRhOiB7XG4gICAgICAgIGtleTogY2xvdWRQYXRoLFxuICAgICAgICBzaWduYXR1cmU6IGF1dGhvcml6YXRpb24sXG4gICAgICAgICd4LWNvcy1tZXRhLWZpbGVpZCc6IGNvc0ZpbGVJZCxcbiAgICAgICAgc3VjY2Vzc19hY3Rpb25fc3RhdHVzOiAnMjAxJyxcbiAgICAgICAgJ3gtY29zLXNlY3VyaXR5LXRva2VuJzogdG9rZW4sXG4gICAgICB9LFxuICAgIH1cblxuICAgIGNvbnN0IHVwbG9hZENvbmZpZyA9IHtcbiAgICAgIFtFVXBsb2FkTWV0aG9kLnB1dF06IHtcbiAgICAgICAgcGFyYW1zOiBwdXRQYXJhbXMsXG4gICAgICAgIGlzU3VjY2VzczogKGNvZGU6IG51bWJlcikgPT4gY29kZSA+PSAyMDAgJiYgY29kZSA8IDMwMCxcbiAgICAgIH0sXG4gICAgICBbRVVwbG9hZE1ldGhvZC5wb3N0XToge1xuICAgICAgICBwYXJhbXM6IHBvc3RQYXJhbXMsXG4gICAgICAgIGlzU3VjY2VzczogKGNvZGU6IG51bWJlcikgPT4gY29kZSA9PT0gMjAxLFxuICAgICAgfSxcbiAgICB9XG5cbiAgICAvLyBAdHMtaWdub3JlXG4gICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5yZXF1ZXN0LnVwbG9hZCh1cGxvYWRDb25maWdbdXBsb2FkTWV0aG9kXS5wYXJhbXMpXG5cbiAgICBpZiAodXBsb2FkQ29uZmlnW3VwbG9hZE1ldGhvZF0uaXNTdWNjZXNzKHJlcy5zdGF0dXNDb2RlKSkge1xuICAgICAgcmV0dXJuIGV4ZWNDYWxsYmFjayhjYWxsYmFjaywgbnVsbCwge1xuICAgICAgICBmaWxlSUQ6IGZpbGVJZCxcbiAgICAgICAgZG93bmxvYWRfdXJsOiBkb3dubG9hZFVybCxcbiAgICAgICAgcmVxdWVzdElkLFxuICAgICAgfSlcbiAgICB9XG4gICAgcmV0dXJuIGV4ZWNDYWxsYmFjayhcbiAgICAgIGNhbGxiYWNrLFxuICAgICAgbmV3IEVycm9yKGBbJHtnZXRTZGtOYW1lKCl9XVske0VSUk9SUy5PUEVSQVRJT05fRkFJTH1dWyR7Q09NUE9ORU5UX05BTUV9XToke3Jlcy5kYXRhfWApLFxuICAgIClcbiAgfVxuICBAY2F0Y2hFcnJvcnNEZWNvcmF0b3Ioe1xuICAgIGN1c3RvbUluZm86IHtcbiAgICAgIGNsYXNzTmFtZTogJ0Nsb3VkYmFzZScsXG4gICAgICBtZXRob2ROYW1lOiAnZ2V0VXBsb2FkTWV0YWRhdGEnLFxuICAgIH0sXG4gICAgdGl0bGU6ICfojrflj5bkuIrkvKDlhYPkv6Hmga/lpLHotKUnLFxuICAgIG1lc3NhZ2VzOiBbXG4gICAgICAn6K+356Gu6K6k5Lul5LiL5ZCE6aG577yaJyxcbiAgICAgICcgIDEgLSDosIPnlKggZ2V0VXBsb2FkTWV0YWRhdGEoKSDnmoTor63ms5XmiJblj4LmlbDmmK/lkKbmraPnoa4nLFxuICAgICAgJyAgMiAtIOW9k+WJjeWfn+WQjeaYr+WQpuWcqOWuieWFqOWfn+WQjeWIl+ihqOS4re+8mmh0dHBzOi8vY29uc29sZS5jbG91ZC50ZW5jZW50LmNvbS90Y2IvZW52L3NhZmV0eScsXG4gICAgICAnICAzIC0g5LqR5a2Y5YKo5a6J5YWo6KeE5YiZ5piv5ZCm6ZmQ5Yi25LqG5b2T5YmN55m75b2V54q25oCB6K6/6ZeuJyxcbiAgICAgIGDlpoLmnpzpl67popjkvp3nhLblrZjlnKjvvIzlu7rorq7liLDlrpjmlrnpl67nrZTnpL7ljLrmj5Dpl67miJblr7vmib7luK7liqnvvJoke0NPTU1VTklUWV9TSVRFX1VSTH1gLFxuICAgIF0sXG4gIH0pXG4gIHB1YmxpYyBhc3luYyBnZXRVcGxvYWRNZXRhZGF0YShcbiAgICBwYXJhbXM6IElDbG91ZGJhc2VHZXRVcGxvYWRNZXRhZGF0YVBhcmFtcyAmIHtcbiAgICAgIG1ldGhvZD86IEVVcGxvYWRNZXRob2RcbiAgICAgIGhlYWRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG4gICAgfSxcbiAgICBjYWxsYmFjaz86IEZ1bmN0aW9uLFxuICApOiBQcm9taXNlPHsgZGF0YTogSVVwbG9hZE1ldGFkYXRhOyByZXF1ZXN0SWQ6IHN0cmluZyB9PiB7XG4gICAgY29uc3QgeyBjbG91ZFBhdGgsIG1ldGhvZCwgaGVhZGVycyB9ID0gcGFyYW1zXG4gICAgaWYgKCFpc1N0cmluZyhjbG91ZFBhdGgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBjb2RlOiBFUlJPUlMuSU5WQUxJRF9QQVJBTVMsXG4gICAgICAgIG1zZzogYFske0NPTVBPTkVOVF9OQU1FfS5nZXRVcGxvYWRNZXRhZGF0YV0gaW52YWxpZCBjbG91ZFBhdGhgLFxuICAgICAgfSksKVxuICAgIH1cbiAgICAvLyBAdHMtaWdub3JlXG4gICAgY29uc3QgeyByZXF1ZXN0IH0gPSB0aGlzXG4gICAgY29uc3QgYWN0aW9uID0gJ3N0b3JhZ2UuZ2V0VXBsb2FkTWV0YWRhdGEnXG5cbiAgICB0cnkge1xuICAgICAgbGV0IG1ldGFEYXRhOiBJQ2xvdWRiYXNlRmlsZU1ldGFEYXRhUmVzXG5cbiAgICAgIGNvbnN0IG1ldGFEYXRhUGFyYW06IHtcbiAgICAgICAgcGF0aDogc3RyaW5nXG4gICAgICAgIG1ldGhvZD86IEVVcGxvYWRNZXRob2RcbiAgICAgICAgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cbiAgICAgIH0gPSB7IHBhdGg6IGNsb3VkUGF0aCB9XG5cbiAgICAgIGlmIChtZXRob2QpIHtcbiAgICAgICAgbWV0YURhdGFQYXJhbS5tZXRob2QgPSBtZXRob2RcbiAgICAgIH1cbiAgICAgIGlmIChtZXRob2QgPT09IEVVcGxvYWRNZXRob2QucHV0ICYmIGhlYWRlcnMpIHtcbiAgICAgICAgbWV0YURhdGFQYXJhbS5oZWFkZXJzID0gaGVhZGVyc1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5pc0dhdGVXYXkoKSkge1xuICAgICAgICBtZXRhRGF0YSA9IGF3YWl0IHN0b3JhZ2VHYXRlV2F5LmdldFVwbG9hZEluZm8ocmVxdWVzdCwgbWV0YURhdGFQYXJhbSwgcGFyYW1zLmN1c3RvbVJlcU9wdHMpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtZXRhRGF0YSA9IGF3YWl0IHJlcXVlc3Quc2VuZChhY3Rpb24sIG1ldGFEYXRhUGFyYW0sIHBhcmFtcy5jdXN0b21SZXFPcHRzKVxuICAgICAgfVxuICAgICAgcmV0dXJuIGV4ZWNDYWxsYmFjayhjYWxsYmFjaywgbnVsbCwgbWV0YURhdGEpXG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICByZXR1cm4gZXhlY0NhbGxiYWNrKGNhbGxiYWNrLCBlcnIpXG4gICAgfVxuICB9XG4gIEBjYXRjaEVycm9yc0RlY29yYXRvcih7XG4gICAgY3VzdG9tSW5mbzoge1xuICAgICAgY2xhc3NOYW1lOiAnQ2xvdWRiYXNlJyxcbiAgICAgIG1ldGhvZE5hbWU6ICdkZWxldGVGaWxlJyxcbiAgICB9LFxuICAgIHRpdGxlOiAn5Yig6Zmk5paH5Lu25aSx6LSlJyxcbiAgICBtZXNzYWdlczogW1xuICAgICAgJ+ivt+ehruiupOS7peS4i+WQhOmhue+8micsXG4gICAgICAnICAxIC0g6LCD55SoIGRlbGV0ZUZpbGUoKSDnmoTor63ms5XmiJblj4LmlbDmmK/lkKbmraPnoa4nLFxuICAgICAgJyAgMiAtIOW9k+WJjeWfn+WQjeaYr+WQpuWcqOWuieWFqOWfn+WQjeWIl+ihqOS4re+8mmh0dHBzOi8vY29uc29sZS5jbG91ZC50ZW5jZW50LmNvbS90Y2IvZW52L3NhZmV0eScsXG4gICAgICAnICAzIC0g5LqR5a2Y5YKo5a6J5YWo6KeE5YiZ5piv5ZCm6ZmQ5Yi25LqG5b2T5YmN55m75b2V54q25oCB6K6/6ZeuJyxcbiAgICAgIGDlpoLmnpzpl67popjkvp3nhLblrZjlnKjvvIzlu7rorq7liLDlrpjmlrnpl67nrZTnpL7ljLrmj5Dpl67miJblr7vmib7luK7liqnvvJoke0NPTU1VTklUWV9TSVRFX1VSTH1gLFxuICAgIF0sXG4gIH0pXG4gIHB1YmxpYyBhc3luYyBkZWxldGVGaWxlKFxuICAgIHBhcmFtczogSUNsb3VkYmFzZURlbGV0ZUZpbGVQYXJhbXMsXG4gICAgY2FsbGJhY2s/OiBGdW5jdGlvbixcbiAgKTogUHJvbWlzZTxJQ2xvdWRiYXNlRGVsZXRlRmlsZVJlc3VsdD4ge1xuICAgIGNvbnN0IHsgZmlsZUxpc3QgfSA9IHBhcmFtc1xuXG4gICAgaWYgKCFmaWxlTGlzdCB8fCAhaXNBcnJheShmaWxlTGlzdCkgfHwgZmlsZUxpc3QubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBjb2RlOiBFUlJPUlMuSU5WQUxJRF9QQVJBTVMsXG4gICAgICAgIG1zZzogYFske0NPTVBPTkVOVF9OQU1FfS5kZWxldGVGaWxlXSBmaWxlTGlzdCBtdXN0IG5vdCBiZSBlbXB0eWAsXG4gICAgICB9KSwpXG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBmaWxlSWQgb2YgZmlsZUxpc3QpIHtcbiAgICAgIGlmICghZmlsZUlkIHx8ICFpc1N0cmluZyhmaWxlSWQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgY29kZTogRVJST1JTLklOVkFMSURfUEFSQU1TLFxuICAgICAgICAgIG1zZzogYFske0NPTVBPTkVOVF9OQU1FfS5kZWxldGVGaWxlXSBmaWxlSUQgbXVzdCBiZSBzdHJpbmdgLFxuICAgICAgICB9KSwpXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgYWN0aW9uID0gJ3N0b3JhZ2UuYmF0Y2hEZWxldGVGaWxlJ1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBjb25zdCB7IHJlcXVlc3QgfSA9IHRoaXNcbiAgICBsZXQgcmVzOiBhbnkgPSB7fVxuXG4gICAgaWYgKHRoaXMuaXNHYXRlV2F5KCkpIHtcbiAgICAgIHJlcyA9IGF3YWl0IHN0b3JhZ2VHYXRlV2F5LmRlbGV0ZShyZXF1ZXN0LCB7IGZpbGVMaXN0IH0sIHBhcmFtcy5jdXN0b21SZXFPcHRzKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXMgPSBhd2FpdCByZXF1ZXN0LnNlbmQoXG4gICAgICAgIGFjdGlvbixcbiAgICAgICAge1xuICAgICAgICAgIGZpbGVpZF9saXN0OiBmaWxlTGlzdCxcbiAgICAgICAgfSxcbiAgICAgICAgcGFyYW1zLmN1c3RvbVJlcU9wdHMsXG4gICAgICApXG4gICAgfVxuXG4gICAgaWYgKHJlcy5jb2RlKSB7XG4gICAgICByZXR1cm4gZXhlY0NhbGxiYWNrKGNhbGxiYWNrLCBudWxsLCByZXMpXG4gICAgfVxuICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICBmaWxlTGlzdDogcmVzLmRhdGEuZGVsZXRlX2xpc3QsXG4gICAgICByZXF1ZXN0SWQ6IHJlcy5yZXF1ZXN0SWQsXG4gICAgfVxuICAgIHJldHVybiBleGVjQ2FsbGJhY2soY2FsbGJhY2ssIG51bGwsIGRhdGEpXG4gIH1cbiAgQGNhdGNoRXJyb3JzRGVjb3JhdG9yKHtcbiAgICBjdXN0b21JbmZvOiB7XG4gICAgICBjbGFzc05hbWU6ICdDbG91ZGJhc2UnLFxuICAgICAgbWV0aG9kTmFtZTogJ2dldFRlbXBGaWxlVVJMJyxcbiAgICB9LFxuICAgIHRpdGxlOiAn6I635Y+W5paH5Lu25LiL6L296ZO+5o6lJyxcbiAgICBtZXNzYWdlczogW1xuICAgICAgJ+ivt+ehruiupOS7peS4i+WQhOmhue+8micsXG4gICAgICAnICAxIC0g6LCD55SoIGdldFRlbXBGaWxlVVJMKCkg55qE6K+t5rOV5oiW5Y+C5pWw5piv5ZCm5q2j56GuJyxcbiAgICAgICcgIDIgLSDlvZPliY3ln5/lkI3mmK/lkKblnKjlronlhajln5/lkI3liJfooajkuK3vvJpodHRwczovL2NvbnNvbGUuY2xvdWQudGVuY2VudC5jb20vdGNiL2Vudi9zYWZldHknLFxuICAgICAgJyAgMyAtIOS6keWtmOWCqOWuieWFqOinhOWImeaYr+WQpumZkOWItuS6huW9k+WJjeeZu+W9leeKtuaAgeiuv+mXricsXG4gICAgICBg5aaC5p6c6Zeu6aKY5L6d54S25a2Y5Zyo77yM5bu66K6u5Yiw5a6Y5pa56Zeu562U56S+5Yy65o+Q6Zeu5oiW5a+75om+5biu5Yqp77yaJHtDT01NVU5JVFlfU0lURV9VUkx9YCxcbiAgICBdLFxuICB9KVxuICBwdWJsaWMgYXN5bmMgZ2V0VGVtcEZpbGVVUkwoXG4gICAgcGFyYW1zOiBJQ2xvdWRiYXNlR2V0VGVtcEZpbGVVUkxQYXJhbXMsXG4gICAgY2FsbGJhY2s/OiBGdW5jdGlvbixcbiAgKTogUHJvbWlzZTxJQ2xvdWRiYXNlR2V0VGVtcEZpbGVVUkxSZXN1bHQ+IHtcbiAgICBjb25zdCB7IGZpbGVMaXN0IH0gPSBwYXJhbXNcblxuICAgIGlmICghZmlsZUxpc3QgfHwgIWlzQXJyYXkoZmlsZUxpc3QpIHx8IGZpbGVMaXN0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgY29kZTogRVJST1JTLklOVkFMSURfUEFSQU1TLFxuICAgICAgICBtc2c6IGBbJHtDT01QT05FTlRfTkFNRX0uZ2V0VGVtcEZpbGVVUkxdIGZpbGVMaXN0IG11c3Qgbm90IGJlIGVtcHR5YCxcbiAgICAgIH0pLClcbiAgICB9XG5cbiAgICBjb25zdCBjb252ZXJ0ZWRGaWxlTGlzdCA9IFtdXG4gICAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVMaXN0KSB7XG4gICAgICBpZiAoaXNQYWxpbk9iamVjdChmaWxlKSkge1xuICAgICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChmaWxlLCAnZmlsZUlEJykpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgY29kZTogRVJST1JTLklOVkFMSURfUEFSQU1TLFxuICAgICAgICAgICAgbXNnOiBgWyR7Q09NUE9ORU5UX05BTUV9LmdldFRlbXBGaWxlVVJMXSBmaWxlIGluZm8gbXVzdCBpbmNsdWRlIGZpbGVJRGAsXG4gICAgICAgICAgfSksKVxuICAgICAgICB9XG5cbiAgICAgICAgY29udmVydGVkRmlsZUxpc3QucHVzaCh7XG4gICAgICAgICAgZmlsZWlkOiAoZmlsZSBhcyBJQ2xvdWRiYXNlRmlsZUluZm8pLmZpbGVJRCxcbiAgICAgICAgICBtYXhfYWdlOiAoZmlsZSBhcyBJQ2xvdWRiYXNlRmlsZUluZm8pLm1heEFnZSB8fCA3MjAwLFxuICAgICAgICB9KVxuICAgICAgfSBlbHNlIGlmIChpc1N0cmluZyhmaWxlKSkge1xuICAgICAgICBjb252ZXJ0ZWRGaWxlTGlzdC5wdXNoKHtcbiAgICAgICAgICBmaWxlaWQ6IGZpbGUsXG4gICAgICAgIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgIGNvZGU6IEVSUk9SUy5JTlZBTElEX1BBUkFNUyxcbiAgICAgICAgICBtc2c6IGBbJHtDT01QT05FTlRfTkFNRX0uZ2V0VGVtcEZpbGVVUkxdIGludmFsaWQgZmlsZUxpc3RgLFxuICAgICAgICB9KSwpXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgYWN0aW9uID0gJ3N0b3JhZ2UuYmF0Y2hHZXREb3dubG9hZFVybCdcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgY29uc3QgeyByZXF1ZXN0IH0gPSB0aGlzXG4gICAgbGV0IHJlczogYW55ID0ge31cblxuICAgIGlmICh0aGlzLmlzR2F0ZVdheSgpKSB7XG4gICAgICByZXMgPSBhd2FpdCBzdG9yYWdlR2F0ZVdheS5nZXREb3duTG9hZEluZm8ocmVxdWVzdCwgeyBjb252ZXJ0ZWRGaWxlTGlzdCB9LCBwYXJhbXMuY3VzdG9tUmVxT3B0cylcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzID0gYXdhaXQgcmVxdWVzdC5zZW5kKGFjdGlvbiwgeyBmaWxlX2xpc3Q6IGNvbnZlcnRlZEZpbGVMaXN0IH0sIHBhcmFtcy5jdXN0b21SZXFPcHRzKVxuICAgIH1cblxuICAgIGlmIChyZXMuY29kZSkge1xuICAgICAgcmV0dXJuIGV4ZWNDYWxsYmFjayhjYWxsYmFjaywgbnVsbCwgcmVzKVxuICAgIH1cblxuICAgIHJldHVybiBleGVjQ2FsbGJhY2soY2FsbGJhY2ssIG51bGwsIHtcbiAgICAgIGZpbGVMaXN0OiByZXMuZGF0YS5kb3dubG9hZF9saXN0LFxuICAgICAgcmVxdWVzdElkOiByZXMucmVxdWVzdElkLFxuICAgIH0pXG4gIH1cbiAgQGNhdGNoRXJyb3JzRGVjb3JhdG9yKHtcbiAgICBjdXN0b21JbmZvOiB7XG4gICAgICBjbGFzc05hbWU6ICdDbG91ZGJhc2UnLFxuICAgICAgbWV0aG9kTmFtZTogJ2Rvd25sb2FkRmlsZScsXG4gICAgfSxcbiAgICB0aXRsZTogJ+S4i+i9veaWh+S7tuWksei0pScsXG4gICAgbWVzc2FnZXM6IFtcbiAgICAgICfor7fnoa7orqTku6XkuIvlkITpobnvvJonLFxuICAgICAgJyAgMSAtIOiwg+eUqCBkb3dubG9hZEZpbGUoKSDnmoTor63ms5XmiJblj4LmlbDmmK/lkKbmraPnoa4nLFxuICAgICAgJyAgMiAtIOW9k+WJjeWfn+WQjeaYr+WQpuWcqOWuieWFqOWfn+WQjeWIl+ihqOS4re+8mmh0dHBzOi8vY29uc29sZS5jbG91ZC50ZW5jZW50LmNvbS90Y2IvZW52L3NhZmV0eScsXG4gICAgICAnICAzIC0g5LqR5a2Y5YKo5a6J5YWo6KeE5YiZ5piv5ZCm6ZmQ5Yi25LqG5b2T5YmN55m75b2V54q25oCB6K6/6ZeuJyxcbiAgICAgIGDlpoLmnpzpl67popjkvp3nhLblrZjlnKjvvIzlu7rorq7liLDlrpjmlrnpl67nrZTnpL7ljLrmj5Dpl67miJblr7vmib7luK7liqnvvJoke0NPTU1VTklUWV9TSVRFX1VSTH1gLFxuICAgIF0sXG4gIH0pXG4gIHB1YmxpYyBhc3luYyBkb3dubG9hZEZpbGUoXG4gICAgcGFyYW1zOiBJQ2xvdWRiYXNlRG93bmxvYWRGaWxlUGFyYW1zLFxuICAgIGNhbGxiYWNrPzogRnVuY3Rpb24sXG4gICk6IFByb21pc2U8SUNsb3VkYmFzZURvd25sb2FkRmlsZVJlc3VsdD4ge1xuICAgIGNvbnN0IHsgZmlsZUlEIH0gPSBwYXJhbXNcbiAgICBpZiAoIWlzU3RyaW5nKGZpbGVJRCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIGNvZGU6IEVSUk9SUy5JTlZBTElEX1BBUkFNUyxcbiAgICAgICAgbXNnOiBgWyR7Q09NUE9ORU5UX05BTUV9LmdldFRlbXBGaWxlVVJMXSBmaWxlSUQgbXVzdCBiZSBzdHJpbmdgLFxuICAgICAgfSksKVxuICAgIH1cblxuICAgIGNvbnN0IHRtcFVybFJlcyA9IGF3YWl0IHRoaXMuZ2V0VGVtcEZpbGVVUkwuY2FsbCh0aGlzLCB7XG4gICAgICBmaWxlTGlzdDogW1xuICAgICAgICB7XG4gICAgICAgICAgZmlsZUlELFxuICAgICAgICAgIG1heEFnZTogNjAwLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIGN1c3RvbVJlcU9wdHM6IHBhcmFtcy5jdXN0b21SZXFPcHRzLFxuICAgIH0pXG5cbiAgICBjb25zdCByZXMgPSB0bXBVcmxSZXMuZmlsZUxpc3RbMF1cblxuICAgIGlmIChyZXMuY29kZSAhPT0gJ1NVQ0NFU1MnKSB7XG4gICAgICByZXR1cm4gZXhlY0NhbGxiYWNrKGNhbGxiYWNrLCByZXMpXG4gICAgfVxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBjb25zdCB7IHJlcXVlc3QgfSA9IHRoaXNcblxuICAgIGNvbnN0IHRtcFVybCA9IGVuY29kZVVSSShyZXMuZG93bmxvYWRfdXJsKVxuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVxdWVzdC5kb3dubG9hZCh7IHVybDogdG1wVXJsLCB0ZW1wRmlsZVBhdGg6IHBhcmFtcy50ZW1wRmlsZVBhdGggfSlcbiAgICByZXR1cm4gZXhlY0NhbGxiYWNrKGNhbGxiYWNrLCBudWxsLCByZXN1bHQpXG4gIH1cbiAgQGNhdGNoRXJyb3JzRGVjb3JhdG9yKHtcbiAgICBjdXN0b21JbmZvOiB7XG4gICAgICBjbGFzc05hbWU6ICdDbG91ZGJhc2UnLFxuICAgICAgbWV0aG9kTmFtZTogJ2NvcHlGaWxlJyxcbiAgICB9LFxuICAgIHRpdGxlOiAn5om56YeP5aSN5Yi25paH5Lu2JyxcbiAgICBtZXNzYWdlczogW1xuICAgICAgJ+ivt+ehruiupOS7peS4i+WQhOmhue+8micsXG4gICAgICAnICAxIC0g6LCD55SoIGNvcHlGaWxlKCkg55qE6K+t5rOV5oiW5Y+C5pWw5piv5ZCm5q2j56GuJyxcbiAgICAgICcgIDIgLSDlvZPliY3ln5/lkI3mmK/lkKblnKjlronlhajln5/lkI3liJfooajkuK3vvJpodHRwczovL2NvbnNvbGUuY2xvdWQudGVuY2VudC5jb20vdGNiL2Vudi9zYWZldHknLFxuICAgICAgJyAgMyAtIOS6keWtmOWCqOWuieWFqOinhOWImeaYr+WQpumZkOWItuS6huW9k+WJjeeZu+W9leeKtuaAgeiuv+mXricsXG4gICAgICBg5aaC5p6c6Zeu6aKY5L6d54S25a2Y5Zyo77yM5bu66K6u5Yiw5a6Y5pa56Zeu562U56S+5Yy65o+Q6Zeu5oiW5a+75om+5biu5Yqp77yaJHtDT01NVU5JVFlfU0lURV9VUkx9YCxcbiAgICBdLFxuICB9KVxuICBwdWJsaWMgYXN5bmMgY29weUZpbGUocGFyYW1zOiBJQ2xvdWRiYXNlQ29weUZpbGVQYXJhbXMsIGNhbGxiYWNrPzogRnVuY3Rpb24pOiBQcm9taXNlPElDbG91ZGJhc2VDb3B5RmlsZVJlc3VsdD4ge1xuICAgIGNvbnN0IHsgZmlsZUxpc3QgfSA9IHBhcmFtc1xuXG4gICAgaWYgKCFmaWxlTGlzdCB8fCAhaXNBcnJheShmaWxlTGlzdCkgfHwgZmlsZUxpc3QubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBjb2RlOiBFUlJPUlMuSU5WQUxJRF9QQVJBTVMsXG4gICAgICAgIG1zZzogYFske0NPTVBPTkVOVF9OQU1FfS5jb3B5RmlsZV0gZmlsZUxpc3QgbXVzdCBub3QgYmUgZW1wdHlgLFxuICAgICAgfSksKVxuICAgIH1cblxuICAgIGNvbnN0IGNvbnZlcnRlZEZpbGVMaXN0ID0gW11cblxuICAgIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlTGlzdCkge1xuICAgICAgY29uc3QgeyBzcmNQYXRoLCBkc3RQYXRoIH0gPSBmaWxlXG4gICAgICBpZiAoIXNyY1BhdGggfHwgIWRzdFBhdGggfHwgdHlwZW9mIHNyY1BhdGggIT09ICdzdHJpbmcnIHx8IHR5cGVvZiBkc3RQYXRoICE9PSAnc3RyaW5nJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgIGNvZGU6IEVSUk9SUy5JTlZBTElEX1BBUkFNUyxcbiAgICAgICAgICBtc2c6IGBbJHtDT01QT05FTlRfTkFNRX0uY29weUZpbGVdIHNyY1BhdGggYW5kIGRzdFBhdGggbWF5IG5vdCBiZSBlbXB0eWAsXG4gICAgICAgIH0pLClcbiAgICAgIH1cbiAgICAgIGlmIChzcmNQYXRoID09PSBkc3RQYXRoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgY29kZTogRVJST1JTLklOVkFMSURfUEFSQU1TLFxuICAgICAgICAgIG1zZzogYFske0NPTVBPTkVOVF9OQU1FfS5jb3B5RmlsZV0gc3JjUGF0aCBhbmQgZHN0UGF0aCBjYW4gbm90IGJlIHRoZSBzYW1lYCxcbiAgICAgICAgfSksKVxuICAgICAgfVxuICAgICAgLy8gICBpZiAoYmFzZW5hbWUoc3JjUGF0aCkgIT09IGJhc2VuYW1lKGRzdFBhdGgpKSB7XG4gICAgICAvLyAgICAgdGhyb3cgbmV3IEVycm9yKEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIC8vICAgICAgIGNvZGU6IEVSUk9SUy5JTlZBTElEX1BBUkFNUyxcbiAgICAgIC8vICAgICAgIG1zZzogYFske0NPTVBPTkVOVF9OQU1FfS5jb3B5RmlsZV0gc3JjUGF0aCBhbmQgZHN0UGF0aCBmaWxlIG5hbWUgbXVzdCBiZSB0aGUgc2FtZWAsXG4gICAgICAvLyAgICAgfSksKVxuICAgICAgLy8gICB9XG4gICAgICBjb252ZXJ0ZWRGaWxlTGlzdC5wdXNoKHtcbiAgICAgICAgc3JjX3BhdGg6IHNyY1BhdGgsXG4gICAgICAgIGRzdF9wYXRoOiBkc3RQYXRoLFxuICAgICAgICBvdmVyd3JpdGU6IGZpbGUub3ZlcndyaXRlLFxuICAgICAgICByZW1vdmVfb3JpZ2luYWw6IGZpbGUucmVtb3ZlT3JpZ2luYWwsXG4gICAgICB9KVxuICAgIH1cblxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBjb25zdCB7IHJlcXVlc3QgfSA9IHRoaXNcbiAgICBsZXQgcmVzOiBhbnkgPSB7fVxuXG4gICAgaWYgKHRoaXMuaXNHYXRlV2F5KCkpIHtcbiAgICAgIHJlcyA9IGF3YWl0IHN0b3JhZ2VHYXRlV2F5LmNvcHlGaWxlKHJlcXVlc3QsIHsgY29udmVydGVkRmlsZUxpc3QgfSwgcGFyYW1zLmN1c3RvbVJlcU9wdHMpXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGFjdGlvbiA9ICdzdG9yYWdlLmJhdGNoQ29weUZpbGUnXG4gICAgICByZXMgPSBhd2FpdCByZXF1ZXN0LnNlbmQoYWN0aW9uLCB7IGZpbGVfbGlzdDogY29udmVydGVkRmlsZUxpc3QgfSwgcGFyYW1zLmN1c3RvbVJlcU9wdHMpXG4gICAgfVxuXG4gICAgaWYgKHJlcy5jb2RlKSB7XG4gICAgICByZXR1cm4gZXhlY0NhbGxiYWNrKGNhbGxiYWNrLCBudWxsLCByZXMpXG4gICAgfVxuXG4gICAgcmV0dXJuIGV4ZWNDYWxsYmFjayhjYWxsYmFjaywgbnVsbCwge1xuICAgICAgZmlsZUxpc3Q6IHJlcy5kYXRhLmNvcHlfbGlzdCxcbiAgICAgIHJlcXVlc3RJZDogcmVzLnJlcXVlc3RJZCxcbiAgICB9KVxuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldEZpbGVJbmZvKHBhcmFtczogSUNsb3VkYmFzZUdldFRlbXBGaWxlVVJMUGFyYW1zKTogUHJvbWlzZTx7XG4gICAgZmlsZUxpc3Q6IChQaWNrPElDbG91ZGJhc2VHZXRUZW1wRmlsZVVSTFJlc3VsdFsnZmlsZUxpc3QnXVswXSwgJ2NvZGUnIHwgJ2ZpbGVJRCcgfCAndGVtcEZpbGVVUkwnIHwgJ21lc3NhZ2UnPiAmIHtcbiAgICAgIGZpbGVOYW1lPzogc3RyaW5nXG4gICAgICBjbG91ZElkPzogSUNsb3VkYmFzZUdldFRlbXBGaWxlVVJMUmVzdWx0WydmaWxlTGlzdCddWzBdWydmaWxlSUQnXVxuICAgICAgY29udGVudFR5cGU/OiBzdHJpbmdcbiAgICAgIG1pbWU/OiBzdHJpbmdcbiAgICAgIHNpemU/OiBudW1iZXJcbiAgICAgIGNhY2hlQ29udHJvbD86IHN0cmluZ1xuICAgICAgbGFzdE1vZGlmaWVkPzogc3RyaW5nXG4gICAgICBldGFnPzogc3RyaW5nXG4gICAgfSlbXVxuICAgIHJlcXVlc3RJZDogc3RyaW5nXG4gIH0+IHtcbiAgICBjb25zdCBmaWxlSW5mbyA9IGF3YWl0IHRoaXMuZ2V0VGVtcEZpbGVVUkwocGFyYW1zKVxuXG4gICAgaWYgKGZpbGVJbmZvPy5maWxlTGlzdCAmJiBmaWxlSW5mbz8uZmlsZUxpc3Q/Lmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGZpbGVMaXN0ID0gYXdhaXQgUHJvbWlzZS5hbGwoZmlsZUluZm8uZmlsZUxpc3QubWFwKGFzeW5jIChpdGVtOiBJQ2xvdWRiYXNlR2V0VGVtcEZpbGVVUkxSZXN1bHRbJ2ZpbGVMaXN0J11bMF0pID0+IHtcbiAgICAgICAgaWYgKGl0ZW0uY29kZSAhPT0gJ1NVQ0NFU1MnKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvZGU6IGl0ZW0uY29kZSxcbiAgICAgICAgICAgIGZpbGVJRDogaXRlbS5maWxlSUQsXG4gICAgICAgICAgICB0ZW1wRmlsZVVSTDogaXRlbS50ZW1wRmlsZVVSTCxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGl0ZW0ubWVzc2FnZSxcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICBjb25zdCB7IHJlcXVlc3QgfSA9IHRoaXNcbiAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCByZXF1ZXN0LmZldGNoKHsgdXJsOiBpdGVtLnRlbXBGaWxlVVJMLCBtZXRob2Q6ICdIRUFEJyB9KVxuICAgICAgICAgIGxldCB7IGhlYWRlciB9ID0gcmVzXG5cbiAgICAgICAgICBpZiAoSGVhZGVycyAmJiBoZWFkZXIgaW5zdGFuY2VvZiBIZWFkZXJzKSB7XG4gICAgICAgICAgICBoZWFkZXIgPSBPYmplY3QuZnJvbUVudHJpZXMocmVzLmhlYWRlci5lbnRyaWVzKCkpXG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByYWRpeFxuICAgICAgICAgIGNvbnN0IGZpbGVTaXplID0gcGFyc2VJbnQoaGVhZGVyWydjb250ZW50LWxlbmd0aCddKSB8fCAwXG4gICAgICAgICAgY29uc3QgY29udGVudFR5cGUgPSBoZWFkZXJbJ2NvbnRlbnQtdHlwZSddIHx8ICcnXG5cbiAgICAgICAgICBpZiAoWzQwMCwgNDA0XS5pbmNsdWRlcyhOdW1iZXIocmVzLnN0YXR1c0NvZGUpKSkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgY29kZTogJ0ZJTEVfTk9UX0ZPVU5EJyxcbiAgICAgICAgICAgICAgZmlsZUlEOiBpdGVtLmZpbGVJRCxcbiAgICAgICAgICAgICAgdGVtcEZpbGVVUkw6IGl0ZW0udGVtcEZpbGVVUkwsXG4gICAgICAgICAgICAgIG1lc3NhZ2U6ICdmaWxlIG5vdCBmb3VuZCcsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgZmlsZUluZm8gPSB7XG4gICAgICAgICAgICBjb2RlOiBpdGVtLmNvZGUsXG4gICAgICAgICAgICBmaWxlSUQ6IGl0ZW0uZmlsZUlELFxuICAgICAgICAgICAgdGVtcEZpbGVVUkw6IGl0ZW0udGVtcEZpbGVVUkwsXG4gICAgICAgICAgICBjbG91ZElkOiBpdGVtLmZpbGVJRCxcbiAgICAgICAgICAgIGZpbGVOYW1lOiBpdGVtLmZpbGVJRC5zcGxpdCgnLycpLnBvcCgpLFxuICAgICAgICAgICAgY29udGVudFR5cGUsXG4gICAgICAgICAgICBtaW1lOiBjb250ZW50VHlwZS5zcGxpdCgnOycpWzBdLnRyaW0oKSxcbiAgICAgICAgICAgIHNpemU6IGZpbGVTaXplLFxuICAgICAgICAgICAgZXRhZzogaGVhZGVyLmV0YWcgfHwgJycsXG4gICAgICAgICAgICBsYXN0TW9kaWZpZWQ6IGhlYWRlclsnbGFzdC1tb2RpZmllZCddIHx8ICcnLFxuICAgICAgICAgICAgY2FjaGVDb250cm9sOiBoZWFkZXJbJ2NhY2hlLWNvbnRyb2wnXSB8fCAnJyxcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gZmlsZUluZm9cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb2RlOiAnRkVUQ0hfRklMRV9JTkZPX0VSUk9SJyxcbiAgICAgICAgICAgIGZpbGVJRDogaXRlbS5maWxlSUQsXG4gICAgICAgICAgICB0ZW1wRmlsZVVSTDogaXRlbS50ZW1wRmlsZVVSTCxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGUubWVzc2FnZSxcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pLClcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZmlsZUxpc3QsXG4gICAgICAgIHJlcXVlc3RJZDogZmlsZUluZm8ucmVxdWVzdElkLFxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBmaWxlTGlzdDogW10sXG4gICAgICByZXF1ZXN0SWQ6IGZpbGVJbmZvLnJlcXVlc3RJZCxcbiAgICB9XG4gIH1cbn1cbiJdfQ==