@cloudbase/storage 2.25.8 → 2.25.9

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