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