@cloudbase/storage 3.1.1 → 3.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/esm/index.js CHANGED
@@ -1,5 +1,716 @@
1
- import { CloudbaseStorage, COMPONENT_NAME } from './storage';
2
- import { SupabaseFileAPILikeStorage } from './supabase';
1
+ var __extends = (this && this.__extends) || (function () {
2
+ var extendStatics = function (d, b) {
3
+ extendStatics = Object.setPrototypeOf ||
4
+ ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
5
+ function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
6
+ return extendStatics(d, b);
7
+ };
8
+ return function (d, b) {
9
+ if (typeof b !== "function" && b !== null)
10
+ throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
11
+ extendStatics(d, b);
12
+ function __() { this.constructor = d; }
13
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
14
+ };
15
+ })();
16
+ var __assign = (this && this.__assign) || function () {
17
+ __assign = Object.assign || function(t) {
18
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
19
+ s = arguments[i];
20
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
21
+ t[p] = s[p];
22
+ }
23
+ return t;
24
+ };
25
+ return __assign.apply(this, arguments);
26
+ };
27
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
28
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
29
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
30
+ 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;
31
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
32
+ };
33
+ var __metadata = (this && this.__metadata) || function (k, v) {
34
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
35
+ };
36
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
37
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
38
+ return new (P || (P = Promise))(function (resolve, reject) {
39
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
40
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
41
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
42
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
43
+ });
44
+ };
45
+ var __generator = (this && this.__generator) || function (thisArg, body) {
46
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
47
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
48
+ function verb(n) { return function (v) { return step([n, v]); }; }
49
+ function step(op) {
50
+ if (f) throw new TypeError("Generator is already executing.");
51
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
52
+ 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;
53
+ if (y = 0, t) op = [op[0] & 2, t.value];
54
+ switch (op[0]) {
55
+ case 0: case 1: t = op; break;
56
+ case 4: _.label++; return { value: op[1], done: false };
57
+ case 5: _.label++; y = op[1]; op = [0]; continue;
58
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
59
+ default:
60
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
61
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
62
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
63
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
64
+ if (t[2]) _.ops.pop();
65
+ _.trys.pop(); continue;
66
+ }
67
+ op = body.call(thisArg, _);
68
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
69
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
70
+ }
71
+ };
72
+ import { isStorageError, StorageError } from './supabase/errors';
73
+ import { constants, utils, helpers } from '@cloudbase/utilities';
74
+ var EUploadMethod;
75
+ (function (EUploadMethod) {
76
+ EUploadMethod["put"] = "put";
77
+ EUploadMethod["post"] = "post";
78
+ })(EUploadMethod || (EUploadMethod = {}));
79
+ var getSdkName = constants.getSdkName, ERRORS = constants.ERRORS, COMMUNITY_SITE_URL = constants.COMMUNITY_SITE_URL;
80
+ var isArray = utils.isArray, isString = utils.isString, isPalinObject = utils.isPalinObject, execCallback = utils.execCallback;
81
+ var catchErrorsDecorator = helpers.catchErrorsDecorator;
82
+ export var COMPONENT_NAME = 'storage';
83
+ var storageGateWay = {
84
+ getUploadInfo: function (request, params, customReqOpts) { return __awaiter(void 0, void 0, void 0, function () {
85
+ var res, data;
86
+ var _a;
87
+ return __generator(this, function (_b) {
88
+ switch (_b.label) {
89
+ case 0: return [4, request.gateWay({
90
+ path: 'storages',
91
+ name: 'get-objects-upload-info',
92
+ data: [
93
+ __assign({ objectId: params.path }, (params.headers ? { signedHeader: params.headers } : {})),
94
+ ],
95
+ }, customReqOpts)];
96
+ case 1:
97
+ res = _b.sent();
98
+ data = ((_a = res.data) === null || _a === void 0 ? void 0 : _a[0]) || {};
99
+ 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 }) });
100
+ return [2, res];
101
+ }
102
+ });
103
+ }); },
104
+ getDownLoadInfo: function (request, params, customReqOpts) { return __awaiter(void 0, void 0, void 0, function () {
105
+ var res;
106
+ var _a;
107
+ return __generator(this, function (_b) {
108
+ switch (_b.label) {
109
+ case 0: return [4, request.gateWay({
110
+ path: 'storages',
111
+ name: 'get-objects-download-info',
112
+ data: params.convertedFileList.map(function (v) { return ({ cloudObjectId: v.fileid }); }),
113
+ }, customReqOpts)];
114
+ case 1:
115
+ res = _b.sent();
116
+ res = __assign(__assign({}, res), { data: {
117
+ download_list: (_a = res.data) === null || _a === void 0 ? void 0 : _a.map(function (v) { return ({
118
+ code: v.code || 'SUCCESS',
119
+ message: v.message,
120
+ fileid: v.cloudObjectId,
121
+ download_url: v.downloadUrl,
122
+ fileID: v.cloudObjectId,
123
+ tempFileURL: v.downloadUrl,
124
+ }); }),
125
+ } });
126
+ return [2, res];
127
+ }
128
+ });
129
+ }); },
130
+ delete: function (request, params, customReqOpts) { return __awaiter(void 0, void 0, void 0, function () {
131
+ var res;
132
+ var _a;
133
+ return __generator(this, function (_b) {
134
+ switch (_b.label) {
135
+ case 0: return [4, request.gateWay({
136
+ path: 'storages',
137
+ name: 'delete-objects',
138
+ data: params.fileList.map(function (v) { return ({ cloudObjectId: v }); }),
139
+ }, customReqOpts)];
140
+ case 1:
141
+ res = _b.sent();
142
+ res = __assign(__assign({}, res), { data: {
143
+ delete_list: (_a = res.data) === null || _a === void 0 ? void 0 : _a.map(function (v) { return ({
144
+ code: v.code || 'SUCCESS',
145
+ fileID: v.cloudObjectId,
146
+ message: v.message,
147
+ }); }),
148
+ } });
149
+ return [2, res];
150
+ }
151
+ });
152
+ }); },
153
+ copyFile: function (request, params, customReqOpts) { return __awaiter(void 0, void 0, void 0, function () {
154
+ var res;
155
+ var _a;
156
+ return __generator(this, function (_b) {
157
+ switch (_b.label) {
158
+ case 0: return [4, request.gateWay({
159
+ path: 'storages',
160
+ name: 'copy-objects',
161
+ data: params.convertedFileList.map(function (v) { return ({
162
+ srcPath: v.src_path,
163
+ dstPath: v.dst_path,
164
+ overwrite: v.overwrite,
165
+ removeOriginal: v.remove_original,
166
+ }); }),
167
+ }, customReqOpts)];
168
+ case 1:
169
+ res = _b.sent();
170
+ res = __assign(__assign({}, res), { data: {
171
+ copy_list: (_a = res.data) === null || _a === void 0 ? void 0 : _a.map(function (v) { return ({
172
+ code: v.code || 'SUCCESS',
173
+ fileID: v.cloudObjectId,
174
+ message: v.message,
175
+ }); }),
176
+ } });
177
+ return [2, res];
178
+ }
179
+ });
180
+ }); },
181
+ };
182
+ export var CloudbaseStorage = (function () {
183
+ function CloudbaseStorage() {
184
+ }
185
+ CloudbaseStorage.prototype.isGateWay = function () {
186
+ var config = this.config;
187
+ var endPointMode = config.endPointMode || 'CLOUD_API';
188
+ return endPointMode === 'GATEWAY';
189
+ };
190
+ CloudbaseStorage.prototype.uploadFile = function (params, callback) {
191
+ return __awaiter(this, void 0, void 0, function () {
192
+ var cloudPath, filePath, onUploadProgress, method, headers, fileContent, uploadMethod, metadataResult, metadata, requestId, url, authorization, token, fileId, cosFileId, downloadUrl, commonParams, putParams, postParams, uploadConfig, res;
193
+ var _a, _b, _c;
194
+ return __generator(this, function (_d) {
195
+ switch (_d.label) {
196
+ case 0:
197
+ 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;
198
+ if (!isString(cloudPath) || (!filePath && !fileContent)) {
199
+ throw new Error(JSON.stringify({
200
+ code: ERRORS.INVALID_PARAMS,
201
+ msg: "[".concat(COMPONENT_NAME, ".uploadFile] invalid params"),
202
+ }));
203
+ }
204
+ uploadMethod = { put: EUploadMethod.put, post: EUploadMethod.post }[method.toLocaleLowerCase()] || EUploadMethod.put;
205
+ return [4, this.getUploadMetadata({
206
+ cloudPath: cloudPath,
207
+ method: uploadMethod,
208
+ headers: uploadMethod === EUploadMethod.put ? headers : undefined,
209
+ customReqOpts: params.customReqOpts,
210
+ })];
211
+ case 1:
212
+ metadataResult = _d.sent();
213
+ metadata = metadataResult.data, requestId = metadataResult.requestId;
214
+ url = metadata.url, authorization = metadata.authorization, token = metadata.token, fileId = metadata.fileId, cosFileId = metadata.cosFileId, downloadUrl = metadata.download_url;
215
+ commonParams = {
216
+ url: url,
217
+ file: filePath,
218
+ name: cloudPath,
219
+ onUploadProgress: onUploadProgress,
220
+ fileContent: fileContent,
221
+ fileId: fileId,
222
+ requestId: requestId,
223
+ };
224
+ putParams = __assign(__assign({}, commonParams), { method: EUploadMethod.put, headers: __assign(__assign({}, headers), { authorization: authorization, 'x-cos-meta-fileid': cosFileId, 'x-cos-security-token': token }) });
225
+ postParams = __assign(__assign({}, commonParams), { method: EUploadMethod.post, data: {
226
+ key: cloudPath,
227
+ signature: authorization,
228
+ 'x-cos-meta-fileid': cosFileId,
229
+ success_action_status: '201',
230
+ 'x-cos-security-token': token,
231
+ } });
232
+ uploadConfig = (_c = {},
233
+ _c[EUploadMethod.put] = {
234
+ params: putParams,
235
+ isSuccess: function (code) { return code >= 200 && code < 300; },
236
+ },
237
+ _c[EUploadMethod.post] = {
238
+ params: postParams,
239
+ isSuccess: function (code) { return code === 201; },
240
+ },
241
+ _c);
242
+ return [4, this.request.upload(uploadConfig[uploadMethod].params)];
243
+ case 2:
244
+ res = _d.sent();
245
+ if (uploadConfig[uploadMethod].isSuccess(res.statusCode)) {
246
+ return [2, execCallback(callback, null, {
247
+ fileID: fileId,
248
+ download_url: downloadUrl,
249
+ requestId: requestId,
250
+ })];
251
+ }
252
+ return [2, execCallback(callback, new Error("[".concat(getSdkName(), "][").concat(ERRORS.OPERATION_FAIL, "][").concat(COMPONENT_NAME, "]:").concat(res.data)))];
253
+ }
254
+ });
255
+ });
256
+ };
257
+ CloudbaseStorage.prototype.getUploadMetadata = function (params, callback) {
258
+ return __awaiter(this, void 0, void 0, function () {
259
+ var cloudPath, method, headers, request, action, metaData, metaDataParam, err_1;
260
+ return __generator(this, function (_a) {
261
+ switch (_a.label) {
262
+ case 0:
263
+ cloudPath = params.cloudPath, method = params.method, headers = params.headers;
264
+ if (!isString(cloudPath)) {
265
+ throw new Error(JSON.stringify({
266
+ code: ERRORS.INVALID_PARAMS,
267
+ msg: "[".concat(COMPONENT_NAME, ".getUploadMetadata] invalid cloudPath"),
268
+ }));
269
+ }
270
+ request = this.request;
271
+ action = 'storage.getUploadMetadata';
272
+ _a.label = 1;
273
+ case 1:
274
+ _a.trys.push([1, 6, , 7]);
275
+ metaData = void 0;
276
+ metaDataParam = { path: cloudPath };
277
+ if (method) {
278
+ metaDataParam.method = method;
279
+ }
280
+ if (method === EUploadMethod.put && headers) {
281
+ metaDataParam.headers = headers;
282
+ }
283
+ if (!this.isGateWay()) return [3, 3];
284
+ return [4, storageGateWay.getUploadInfo(request, metaDataParam, params.customReqOpts)];
285
+ case 2:
286
+ metaData = _a.sent();
287
+ return [3, 5];
288
+ case 3: return [4, request.send(action, metaDataParam, params.customReqOpts)];
289
+ case 4:
290
+ metaData = _a.sent();
291
+ _a.label = 5;
292
+ case 5: return [2, execCallback(callback, null, metaData)];
293
+ case 6:
294
+ err_1 = _a.sent();
295
+ return [2, execCallback(callback, err_1)];
296
+ case 7: return [2];
297
+ }
298
+ });
299
+ });
300
+ };
301
+ CloudbaseStorage.prototype.deleteFile = function (params, callback) {
302
+ return __awaiter(this, void 0, void 0, function () {
303
+ var fileList, _i, fileList_1, fileId, action, request, res, data;
304
+ return __generator(this, function (_a) {
305
+ switch (_a.label) {
306
+ case 0:
307
+ fileList = params.fileList;
308
+ if (!fileList || !isArray(fileList) || fileList.length === 0) {
309
+ throw new Error(JSON.stringify({
310
+ code: ERRORS.INVALID_PARAMS,
311
+ msg: "[".concat(COMPONENT_NAME, ".deleteFile] fileList must not be empty"),
312
+ }));
313
+ }
314
+ for (_i = 0, fileList_1 = fileList; _i < fileList_1.length; _i++) {
315
+ fileId = fileList_1[_i];
316
+ if (!fileId || !isString(fileId)) {
317
+ throw new Error(JSON.stringify({
318
+ code: ERRORS.INVALID_PARAMS,
319
+ msg: "[".concat(COMPONENT_NAME, ".deleteFile] fileID must be string"),
320
+ }));
321
+ }
322
+ }
323
+ action = 'storage.batchDeleteFile';
324
+ request = this.request;
325
+ res = {};
326
+ if (!this.isGateWay()) return [3, 2];
327
+ return [4, storageGateWay.delete(request, { fileList: fileList }, params.customReqOpts)];
328
+ case 1:
329
+ res = _a.sent();
330
+ return [3, 4];
331
+ case 2: return [4, request.send(action, {
332
+ fileid_list: fileList,
333
+ }, params.customReqOpts)];
334
+ case 3:
335
+ res = _a.sent();
336
+ _a.label = 4;
337
+ case 4:
338
+ if (res.code) {
339
+ return [2, execCallback(callback, null, res)];
340
+ }
341
+ data = {
342
+ fileList: res.data.delete_list,
343
+ requestId: res.requestId,
344
+ };
345
+ return [2, execCallback(callback, null, data)];
346
+ }
347
+ });
348
+ });
349
+ };
350
+ CloudbaseStorage.prototype.getTempFileURL = function (params, callback) {
351
+ return __awaiter(this, void 0, void 0, function () {
352
+ var fileList, convertedFileList, _i, fileList_2, file, action, request, res;
353
+ return __generator(this, function (_a) {
354
+ switch (_a.label) {
355
+ case 0:
356
+ fileList = params.fileList;
357
+ if (!fileList || !isArray(fileList) || fileList.length === 0) {
358
+ throw new Error(JSON.stringify({
359
+ code: ERRORS.INVALID_PARAMS,
360
+ msg: "[".concat(COMPONENT_NAME, ".getTempFileURL] fileList must not be empty"),
361
+ }));
362
+ }
363
+ convertedFileList = [];
364
+ for (_i = 0, fileList_2 = fileList; _i < fileList_2.length; _i++) {
365
+ file = fileList_2[_i];
366
+ if (isPalinObject(file)) {
367
+ if (!Object.prototype.hasOwnProperty.call(file, 'fileID')) {
368
+ throw new Error(JSON.stringify({
369
+ code: ERRORS.INVALID_PARAMS,
370
+ msg: "[".concat(COMPONENT_NAME, ".getTempFileURL] file info must include fileID"),
371
+ }));
372
+ }
373
+ convertedFileList.push({
374
+ fileid: file.fileID,
375
+ max_age: file.maxAge || 7200,
376
+ });
377
+ }
378
+ else if (isString(file)) {
379
+ convertedFileList.push({
380
+ fileid: file,
381
+ });
382
+ }
383
+ else {
384
+ throw new Error(JSON.stringify({
385
+ code: ERRORS.INVALID_PARAMS,
386
+ msg: "[".concat(COMPONENT_NAME, ".getTempFileURL] invalid fileList"),
387
+ }));
388
+ }
389
+ }
390
+ action = 'storage.batchGetDownloadUrl';
391
+ request = this.request;
392
+ res = {};
393
+ if (!this.isGateWay()) return [3, 2];
394
+ return [4, storageGateWay.getDownLoadInfo(request, { convertedFileList: convertedFileList }, params.customReqOpts)];
395
+ case 1:
396
+ res = _a.sent();
397
+ return [3, 4];
398
+ case 2: return [4, request.send(action, { file_list: convertedFileList }, params.customReqOpts)];
399
+ case 3:
400
+ res = _a.sent();
401
+ _a.label = 4;
402
+ case 4:
403
+ if (res.code) {
404
+ return [2, execCallback(callback, null, res)];
405
+ }
406
+ return [2, execCallback(callback, null, {
407
+ fileList: res.data.download_list,
408
+ requestId: res.requestId,
409
+ })];
410
+ }
411
+ });
412
+ });
413
+ };
414
+ CloudbaseStorage.prototype.downloadFile = function (params, callback) {
415
+ return __awaiter(this, void 0, void 0, function () {
416
+ var fileID, tmpUrlRes, res, request, tmpUrl, result;
417
+ return __generator(this, function (_a) {
418
+ switch (_a.label) {
419
+ case 0:
420
+ fileID = params.fileID;
421
+ if (!isString(fileID)) {
422
+ throw new Error(JSON.stringify({
423
+ code: ERRORS.INVALID_PARAMS,
424
+ msg: "[".concat(COMPONENT_NAME, ".getTempFileURL] fileID must be string"),
425
+ }));
426
+ }
427
+ return [4, this.getTempFileURL.call(this, {
428
+ fileList: [
429
+ {
430
+ fileID: fileID,
431
+ maxAge: 600,
432
+ },
433
+ ],
434
+ customReqOpts: params.customReqOpts,
435
+ })];
436
+ case 1:
437
+ tmpUrlRes = _a.sent();
438
+ res = tmpUrlRes.fileList[0];
439
+ if (res.code !== 'SUCCESS') {
440
+ return [2, execCallback(callback, res)];
441
+ }
442
+ request = this.request;
443
+ tmpUrl = encodeURI(res.download_url);
444
+ return [4, request.download({ url: tmpUrl, tempFilePath: params.tempFilePath })];
445
+ case 2:
446
+ result = _a.sent();
447
+ return [2, execCallback(callback, null, result)];
448
+ }
449
+ });
450
+ });
451
+ };
452
+ CloudbaseStorage.prototype.copyFile = function (params, callback) {
453
+ return __awaiter(this, void 0, void 0, function () {
454
+ var fileList, convertedFileList, _i, fileList_3, file, srcPath, dstPath, request, res, action;
455
+ return __generator(this, function (_a) {
456
+ switch (_a.label) {
457
+ case 0:
458
+ fileList = params.fileList;
459
+ if (!fileList || !isArray(fileList) || fileList.length === 0) {
460
+ throw new Error(JSON.stringify({
461
+ code: ERRORS.INVALID_PARAMS,
462
+ msg: "[".concat(COMPONENT_NAME, ".copyFile] fileList must not be empty"),
463
+ }));
464
+ }
465
+ convertedFileList = [];
466
+ for (_i = 0, fileList_3 = fileList; _i < fileList_3.length; _i++) {
467
+ file = fileList_3[_i];
468
+ srcPath = file.srcPath, dstPath = file.dstPath;
469
+ if (!srcPath || !dstPath || typeof srcPath !== 'string' || typeof dstPath !== 'string') {
470
+ throw new Error(JSON.stringify({
471
+ code: ERRORS.INVALID_PARAMS,
472
+ msg: "[".concat(COMPONENT_NAME, ".copyFile] srcPath and dstPath may not be empty"),
473
+ }));
474
+ }
475
+ if (srcPath === dstPath) {
476
+ throw new Error(JSON.stringify({
477
+ code: ERRORS.INVALID_PARAMS,
478
+ msg: "[".concat(COMPONENT_NAME, ".copyFile] srcPath and dstPath can not be the same"),
479
+ }));
480
+ }
481
+ convertedFileList.push({
482
+ src_path: srcPath,
483
+ dst_path: dstPath,
484
+ overwrite: file.overwrite,
485
+ remove_original: file.removeOriginal,
486
+ });
487
+ }
488
+ request = this.request;
489
+ res = {};
490
+ if (!this.isGateWay()) return [3, 2];
491
+ return [4, storageGateWay.copyFile(request, { convertedFileList: convertedFileList }, params.customReqOpts)];
492
+ case 1:
493
+ res = _a.sent();
494
+ return [3, 4];
495
+ case 2:
496
+ action = 'storage.batchCopyFile';
497
+ return [4, request.send(action, { file_list: convertedFileList }, params.customReqOpts)];
498
+ case 3:
499
+ res = _a.sent();
500
+ _a.label = 4;
501
+ case 4:
502
+ if (res.code) {
503
+ return [2, execCallback(callback, null, res)];
504
+ }
505
+ return [2, execCallback(callback, null, {
506
+ fileList: res.data.copy_list,
507
+ requestId: res.requestId,
508
+ })];
509
+ }
510
+ });
511
+ });
512
+ };
513
+ CloudbaseStorage.prototype.getFileInfo = function (params) {
514
+ var _a;
515
+ return __awaiter(this, void 0, void 0, function () {
516
+ var fileInfo, fileList;
517
+ var _this = this;
518
+ return __generator(this, function (_b) {
519
+ switch (_b.label) {
520
+ case 0: return [4, this.getTempFileURL(params)];
521
+ case 1:
522
+ fileInfo = _b.sent();
523
+ 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];
524
+ return [4, Promise.all(fileInfo.fileList.map(function (item) { return __awaiter(_this, void 0, void 0, function () {
525
+ var request, res, header, fileSize, contentType, fileInfo_1, e_1;
526
+ return __generator(this, function (_a) {
527
+ switch (_a.label) {
528
+ case 0:
529
+ if (item.code !== 'SUCCESS') {
530
+ return [2, {
531
+ code: item.code,
532
+ fileID: item.fileID,
533
+ tempFileURL: item.tempFileURL,
534
+ message: item.message,
535
+ }];
536
+ }
537
+ _a.label = 1;
538
+ case 1:
539
+ _a.trys.push([1, 3, , 4]);
540
+ request = this.request;
541
+ return [4, request.fetch({ url: item.tempFileURL, method: 'HEAD' })];
542
+ case 2:
543
+ res = _a.sent();
544
+ header = res.header;
545
+ if (Headers && header instanceof Headers) {
546
+ header = Object.fromEntries(res.header.entries());
547
+ }
548
+ fileSize = parseInt(header['content-length']) || 0;
549
+ contentType = header['content-type'] || '';
550
+ if ([400, 404].includes(Number(res.statusCode))) {
551
+ return [2, {
552
+ code: 'FILE_NOT_FOUND',
553
+ fileID: item.fileID,
554
+ tempFileURL: item.tempFileURL,
555
+ message: 'file not found',
556
+ }];
557
+ }
558
+ fileInfo_1 = {
559
+ code: item.code,
560
+ fileID: item.fileID,
561
+ tempFileURL: item.tempFileURL,
562
+ cloudId: item.fileID,
563
+ fileName: item.fileID.split('/').pop(),
564
+ contentType: contentType,
565
+ mime: contentType.split(';')[0].trim(),
566
+ size: fileSize,
567
+ etag: header.etag || '',
568
+ lastModified: header['last-modified'] || '',
569
+ cacheControl: header['cache-control'] || '',
570
+ };
571
+ return [2, fileInfo_1];
572
+ case 3:
573
+ e_1 = _a.sent();
574
+ return [2, {
575
+ code: 'FETCH_FILE_INFO_ERROR',
576
+ fileID: item.fileID,
577
+ tempFileURL: item.tempFileURL,
578
+ message: e_1.message,
579
+ }];
580
+ case 4: return [2];
581
+ }
582
+ });
583
+ }); }))];
584
+ case 2:
585
+ fileList = _b.sent();
586
+ return [2, {
587
+ fileList: fileList,
588
+ requestId: fileInfo.requestId,
589
+ }];
590
+ case 3: return [2, {
591
+ fileList: [],
592
+ requestId: fileInfo.requestId,
593
+ }];
594
+ }
595
+ });
596
+ });
597
+ };
598
+ __decorate([
599
+ catchErrorsDecorator({
600
+ customInfo: {
601
+ className: 'Cloudbase',
602
+ methodName: 'uploadFile',
603
+ },
604
+ title: '上传文件失败',
605
+ messages: [
606
+ '请确认以下各项:',
607
+ ' 1 - 调用 uploadFile() 的语法或参数是否正确',
608
+ ' 2 - 当前域名是否在安全域名列表中:https://console.cloud.tencent.com/tcb/env/safety',
609
+ ' 3 - 云存储安全规则是否限制了当前登录状态访问',
610
+ "\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),
611
+ ],
612
+ }),
613
+ __metadata("design:type", Function),
614
+ __metadata("design:paramtypes", [Object, Function]),
615
+ __metadata("design:returntype", Promise)
616
+ ], CloudbaseStorage.prototype, "uploadFile", null);
617
+ __decorate([
618
+ catchErrorsDecorator({
619
+ customInfo: {
620
+ className: 'Cloudbase',
621
+ methodName: 'getUploadMetadata',
622
+ },
623
+ title: '获取上传元信息失败',
624
+ messages: [
625
+ '请确认以下各项:',
626
+ ' 1 - 调用 getUploadMetadata() 的语法或参数是否正确',
627
+ ' 2 - 当前域名是否在安全域名列表中:https://console.cloud.tencent.com/tcb/env/safety',
628
+ ' 3 - 云存储安全规则是否限制了当前登录状态访问',
629
+ "\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),
630
+ ],
631
+ }),
632
+ __metadata("design:type", Function),
633
+ __metadata("design:paramtypes", [Object, Function]),
634
+ __metadata("design:returntype", Promise)
635
+ ], CloudbaseStorage.prototype, "getUploadMetadata", null);
636
+ __decorate([
637
+ catchErrorsDecorator({
638
+ customInfo: {
639
+ className: 'Cloudbase',
640
+ methodName: 'deleteFile',
641
+ },
642
+ title: '删除文件失败',
643
+ messages: [
644
+ '请确认以下各项:',
645
+ ' 1 - 调用 deleteFile() 的语法或参数是否正确',
646
+ ' 2 - 当前域名是否在安全域名列表中:https://console.cloud.tencent.com/tcb/env/safety',
647
+ ' 3 - 云存储安全规则是否限制了当前登录状态访问',
648
+ "\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),
649
+ ],
650
+ }),
651
+ __metadata("design:type", Function),
652
+ __metadata("design:paramtypes", [Object, Function]),
653
+ __metadata("design:returntype", Promise)
654
+ ], CloudbaseStorage.prototype, "deleteFile", null);
655
+ __decorate([
656
+ catchErrorsDecorator({
657
+ customInfo: {
658
+ className: 'Cloudbase',
659
+ methodName: 'getTempFileURL',
660
+ },
661
+ title: '获取文件下载链接',
662
+ messages: [
663
+ '请确认以下各项:',
664
+ ' 1 - 调用 getTempFileURL() 的语法或参数是否正确',
665
+ ' 2 - 当前域名是否在安全域名列表中:https://console.cloud.tencent.com/tcb/env/safety',
666
+ ' 3 - 云存储安全规则是否限制了当前登录状态访问',
667
+ "\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),
668
+ ],
669
+ }),
670
+ __metadata("design:type", Function),
671
+ __metadata("design:paramtypes", [Object, Function]),
672
+ __metadata("design:returntype", Promise)
673
+ ], CloudbaseStorage.prototype, "getTempFileURL", null);
674
+ __decorate([
675
+ catchErrorsDecorator({
676
+ customInfo: {
677
+ className: 'Cloudbase',
678
+ methodName: 'downloadFile',
679
+ },
680
+ title: '下载文件失败',
681
+ messages: [
682
+ '请确认以下各项:',
683
+ ' 1 - 调用 downloadFile() 的语法或参数是否正确',
684
+ ' 2 - 当前域名是否在安全域名列表中:https://console.cloud.tencent.com/tcb/env/safety',
685
+ ' 3 - 云存储安全规则是否限制了当前登录状态访问',
686
+ "\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),
687
+ ],
688
+ }),
689
+ __metadata("design:type", Function),
690
+ __metadata("design:paramtypes", [Object, Function]),
691
+ __metadata("design:returntype", Promise)
692
+ ], CloudbaseStorage.prototype, "downloadFile", null);
693
+ __decorate([
694
+ catchErrorsDecorator({
695
+ customInfo: {
696
+ className: 'Cloudbase',
697
+ methodName: 'copyFile',
698
+ },
699
+ title: '批量复制文件',
700
+ messages: [
701
+ '请确认以下各项:',
702
+ ' 1 - 调用 copyFile() 的语法或参数是否正确',
703
+ ' 2 - 当前域名是否在安全域名列表中:https://console.cloud.tencent.com/tcb/env/safety',
704
+ ' 3 - 云存储安全规则是否限制了当前登录状态访问',
705
+ "\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),
706
+ ],
707
+ }),
708
+ __metadata("design:type", Function),
709
+ __metadata("design:paramtypes", [Object, Function]),
710
+ __metadata("design:returntype", Promise)
711
+ ], CloudbaseStorage.prototype, "copyFile", null);
712
+ return CloudbaseStorage;
713
+ }());
3
714
  var storage = new CloudbaseStorage();
4
715
  var component = {
5
716
  name: COMPONENT_NAME,
@@ -14,6 +725,642 @@ var component = {
14
725
  isGateWay: storage.isGateWay,
15
726
  },
16
727
  };
728
+ var SupabaseFileAPILikeStorage = (function (_super) {
729
+ __extends(SupabaseFileAPILikeStorage, _super);
730
+ function SupabaseFileAPILikeStorage(context) {
731
+ var _this = _super.call(this) || this;
732
+ _this.shouldThrowOnError = false;
733
+ _this.bucketId = '';
734
+ _this.context = context;
735
+ return _this;
736
+ }
737
+ Object.defineProperty(SupabaseFileAPILikeStorage.prototype, "config", {
738
+ get: function () {
739
+ var _a;
740
+ return (_a = this.context) === null || _a === void 0 ? void 0 : _a.config;
741
+ },
742
+ enumerable: false,
743
+ configurable: true
744
+ });
745
+ Object.defineProperty(SupabaseFileAPILikeStorage.prototype, "request", {
746
+ get: function () {
747
+ var _a;
748
+ return (_a = this.context) === null || _a === void 0 ? void 0 : _a.request;
749
+ },
750
+ enumerable: false,
751
+ configurable: true
752
+ });
753
+ SupabaseFileAPILikeStorage.prototype.throwOnError = function () {
754
+ this.shouldThrowOnError = true;
755
+ return this;
756
+ };
757
+ SupabaseFileAPILikeStorage.prototype.from = function (bucket) {
758
+ this.bucketId = bucket || '';
759
+ return this;
760
+ };
761
+ SupabaseFileAPILikeStorage.prototype.upload = function (path, fileBody, fileOptions) {
762
+ return __awaiter(this, void 0, void 0, function () {
763
+ var options, cacheControl, contentType, metadata, cloudPath, uploadFileParams, headers, result, error_1;
764
+ return __generator(this, function (_a) {
765
+ switch (_a.label) {
766
+ case 0:
767
+ options = __assign({ upsert: true }, fileOptions);
768
+ cacheControl = options.cacheControl, contentType = options.contentType, metadata = options.metadata;
769
+ _a.label = 1;
770
+ case 1:
771
+ _a.trys.push([1, 3, , 4]);
772
+ cloudPath = this._getCloudPath(path);
773
+ uploadFileParams = {
774
+ cloudPath: cloudPath,
775
+ filePath: fileBody,
776
+ };
777
+ if (cacheControl || contentType || metadata) {
778
+ headers = {};
779
+ if (cacheControl) {
780
+ headers['cache-control'] = cacheControl;
781
+ }
782
+ if (contentType) {
783
+ headers['content-type'] = contentType;
784
+ }
785
+ if (metadata) {
786
+ headers['x-cos-metadata-metadata'] = this.toBase64(JSON.stringify(metadata));
787
+ }
788
+ uploadFileParams.headers = headers;
789
+ }
790
+ return [4, this.uploadFile(uploadFileParams)];
791
+ case 2:
792
+ result = _a.sent();
793
+ if (!result.fileID) {
794
+ throw new Error(JSON.stringify({
795
+ code: ERRORS.OPERATION_FAIL,
796
+ msg: "[".concat(COMPONENT_NAME, ".update] no fileID returned"),
797
+ }));
798
+ }
799
+ return [2, {
800
+ data: {
801
+ id: result.fileID,
802
+ path: path,
803
+ fullPath: path,
804
+ },
805
+ error: null,
806
+ }];
807
+ case 3:
808
+ error_1 = _a.sent();
809
+ if (this.shouldThrowOnError)
810
+ throw error_1;
811
+ if (isStorageError(error_1)) {
812
+ return [2, {
813
+ data: null,
814
+ error: error_1,
815
+ }];
816
+ }
817
+ throw error_1;
818
+ case 4: return [2];
819
+ }
820
+ });
821
+ });
822
+ };
823
+ SupabaseFileAPILikeStorage.prototype.uploadToSignedUrl = function (path, _token, fileBody, fileOptions) {
824
+ return __awaiter(this, void 0, void 0, function () {
825
+ return __generator(this, function (_a) {
826
+ return [2, this.upload(path, fileBody, fileOptions)];
827
+ });
828
+ });
829
+ };
830
+ SupabaseFileAPILikeStorage.prototype.createSignedUploadUrl = function (path) {
831
+ return __awaiter(this, void 0, void 0, function () {
832
+ var cloudPath, metadata, error_2;
833
+ return __generator(this, function (_a) {
834
+ switch (_a.label) {
835
+ case 0:
836
+ _a.trys.push([0, 2, , 3]);
837
+ cloudPath = this._getCloudPath(path);
838
+ return [4, this.getUploadMetadata({ cloudPath: cloudPath })];
839
+ case 1:
840
+ metadata = (_a.sent()).data;
841
+ return [2, {
842
+ data: {
843
+ signedUrl: metadata.url,
844
+ token: metadata.token,
845
+ path: path,
846
+ authorization: metadata.authorization,
847
+ id: metadata.fileId,
848
+ cosFileId: metadata.cosFileId,
849
+ downloadUrl: metadata.download_url,
850
+ },
851
+ error: null,
852
+ }];
853
+ case 2:
854
+ error_2 = _a.sent();
855
+ if (this.shouldThrowOnError)
856
+ throw error_2;
857
+ return [2, {
858
+ data: null,
859
+ error: error_2 instanceof StorageError ? error_2 : new StorageError(error_2.message),
860
+ }];
861
+ case 3: return [2];
862
+ }
863
+ });
864
+ });
865
+ };
866
+ SupabaseFileAPILikeStorage.prototype.update = function (path, fileBody, fileOptions) {
867
+ return __awaiter(this, void 0, void 0, function () {
868
+ return __generator(this, function (_a) {
869
+ return [2, this.upload(path, fileBody, __assign(__assign({}, fileOptions), { upsert: true }))];
870
+ });
871
+ });
872
+ };
873
+ SupabaseFileAPILikeStorage.prototype.move = function (fromPath, toPath) {
874
+ return __awaiter(this, void 0, void 0, function () {
875
+ var result, error_3;
876
+ return __generator(this, function (_a) {
877
+ switch (_a.label) {
878
+ case 0:
879
+ _a.trys.push([0, 2, , 3]);
880
+ return [4, this.copyFile({
881
+ fileList: [
882
+ {
883
+ srcPath: this._getCloudPath(fromPath),
884
+ dstPath: this._getCloudPath(toPath),
885
+ overwrite: true,
886
+ removeOriginal: true,
887
+ },
888
+ ],
889
+ })];
890
+ case 1:
891
+ result = _a.sent();
892
+ if (result.fileList[0].code && result.fileList[0].code !== 'SUCCESS') {
893
+ throw new StorageError(result.fileList[0].message || 'Move failed');
894
+ }
895
+ return [2, {
896
+ data: { message: "File moved from ".concat(fromPath, " to ").concat(toPath) },
897
+ error: null,
898
+ }];
899
+ case 2:
900
+ error_3 = _a.sent();
901
+ if (this.shouldThrowOnError)
902
+ throw error_3;
903
+ if (isStorageError(error_3)) {
904
+ return [2, {
905
+ data: null,
906
+ error: error_3,
907
+ }];
908
+ }
909
+ throw error_3;
910
+ case 3: return [2];
911
+ }
912
+ });
913
+ });
914
+ };
915
+ SupabaseFileAPILikeStorage.prototype.copy = function (fromPath, toPath) {
916
+ return __awaiter(this, void 0, void 0, function () {
917
+ var result, error_4;
918
+ return __generator(this, function (_a) {
919
+ switch (_a.label) {
920
+ case 0:
921
+ _a.trys.push([0, 2, , 3]);
922
+ return [4, this.copyFile({
923
+ fileList: [
924
+ {
925
+ srcPath: this._getCloudPath(fromPath),
926
+ dstPath: this._getCloudPath(toPath),
927
+ overwrite: true,
928
+ removeOriginal: false,
929
+ },
930
+ ],
931
+ })];
932
+ case 1:
933
+ result = _a.sent();
934
+ if (result.fileList[0].code && result.fileList[0].code !== 'SUCCESS') {
935
+ throw new StorageError(result.fileList[0].message || 'Copy failed');
936
+ }
937
+ return [2, {
938
+ data: { path: this._getCloudPath(toPath) },
939
+ error: null,
940
+ }];
941
+ case 2:
942
+ error_4 = _a.sent();
943
+ if (this.shouldThrowOnError)
944
+ throw error_4;
945
+ if (isStorageError(error_4)) {
946
+ return [2, { data: null, error: error_4 }];
947
+ }
948
+ throw error_4;
949
+ case 3: return [2];
950
+ }
951
+ });
952
+ });
953
+ };
954
+ SupabaseFileAPILikeStorage.prototype.createSignedUrl = function (path, expiresIn, options) {
955
+ return __awaiter(this, void 0, void 0, function () {
956
+ var cloudPath, result, signedUrl, queryParams, transformQuery, separator, error_5;
957
+ return __generator(this, function (_a) {
958
+ switch (_a.label) {
959
+ case 0:
960
+ _a.trys.push([0, 2, , 3]);
961
+ cloudPath = this._normalizeCloudId(path);
962
+ return [4, this.getTempFileURL({
963
+ fileList: [
964
+ {
965
+ fileID: cloudPath,
966
+ maxAge: expiresIn,
967
+ },
968
+ ],
969
+ })];
970
+ case 1:
971
+ result = _a.sent();
972
+ if (result.fileList[0].code !== 'SUCCESS') {
973
+ throw new StorageError("Failed to create signed URL: [".concat(result.fileList[0].code, "] ").concat(result.fileList[0].fileID));
974
+ }
975
+ signedUrl = result.fileList[0].download_url;
976
+ queryParams = [];
977
+ if ((options === null || options === void 0 ? void 0 : options.download) !== undefined) {
978
+ if (typeof options.download === 'string') {
979
+ queryParams.push("download=".concat(encodeURIComponent(options.download)));
980
+ }
981
+ else if (options.download === true) {
982
+ queryParams.push('download=true');
983
+ }
984
+ }
985
+ if (options === null || options === void 0 ? void 0 : options.transform) {
986
+ transformQuery = this._transformOptsToQueryString(options.transform);
987
+ if (transformQuery) {
988
+ queryParams.push(transformQuery);
989
+ }
990
+ }
991
+ if (queryParams.length > 0) {
992
+ separator = signedUrl.includes('?') ? '&' : '?';
993
+ signedUrl = "".concat(signedUrl).concat(separator).concat(queryParams.join('&'));
994
+ }
995
+ return [2, {
996
+ data: { signedUrl: signedUrl },
997
+ error: null,
998
+ }];
999
+ case 2:
1000
+ error_5 = _a.sent();
1001
+ if (this.shouldThrowOnError)
1002
+ throw error_5;
1003
+ if (isStorageError(error_5)) {
1004
+ return [2, {
1005
+ data: null,
1006
+ error: error_5,
1007
+ }];
1008
+ }
1009
+ throw error_5;
1010
+ case 3: return [2];
1011
+ }
1012
+ });
1013
+ });
1014
+ };
1015
+ SupabaseFileAPILikeStorage.prototype.createSignedUrls = function (paths, expiresIn) {
1016
+ return __awaiter(this, void 0, void 0, function () {
1017
+ var fileList, result, error_6;
1018
+ var _this = this;
1019
+ return __generator(this, function (_a) {
1020
+ switch (_a.label) {
1021
+ case 0:
1022
+ _a.trys.push([0, 2, , 3]);
1023
+ fileList = paths.map(function (p) { return ({
1024
+ fileID: _this._normalizeCloudId(p),
1025
+ maxAge: expiresIn,
1026
+ }); });
1027
+ return [4, this.getTempFileURL({ fileList: fileList })];
1028
+ case 1:
1029
+ result = _a.sent();
1030
+ return [2, {
1031
+ data: result.fileList.map(function (item, index) { return ({
1032
+ path: paths[index],
1033
+ signedUrl: item.tempFileURL || '',
1034
+ error: item.code === 'SUCCESS' ? null : item.message,
1035
+ }); }),
1036
+ error: null,
1037
+ }];
1038
+ case 2:
1039
+ error_6 = _a.sent();
1040
+ if (this.shouldThrowOnError)
1041
+ throw error_6;
1042
+ if (isStorageError(error_6)) {
1043
+ return [2, {
1044
+ data: null,
1045
+ error: error_6,
1046
+ }];
1047
+ }
1048
+ throw error_6;
1049
+ case 3: return [2];
1050
+ }
1051
+ });
1052
+ });
1053
+ };
1054
+ SupabaseFileAPILikeStorage.prototype.download = function (path, options) {
1055
+ return __awaiter(this, void 0, void 0, function () {
1056
+ var error_7;
1057
+ var _a;
1058
+ var _this = this;
1059
+ return __generator(this, function (_b) {
1060
+ switch (_b.label) {
1061
+ case 0:
1062
+ _b.trys.push([0, 2, , 3]);
1063
+ _a = {};
1064
+ return [4, (function () { return __awaiter(_this, void 0, void 0, function () {
1065
+ var signedUrlResult, tmpUrl, data;
1066
+ var _a;
1067
+ return __generator(this, function (_b) {
1068
+ switch (_b.label) {
1069
+ case 0: return [4, this.createSignedUrl(path, 600, { transform: options })];
1070
+ case 1:
1071
+ signedUrlResult = _b.sent();
1072
+ if (signedUrlResult.error) {
1073
+ throw signedUrlResult.error;
1074
+ }
1075
+ tmpUrl = encodeURI((_a = signedUrlResult.data) === null || _a === void 0 ? void 0 : _a.signedUrl);
1076
+ return [4, this.request.reqClass.get({
1077
+ url: tmpUrl,
1078
+ headers: {},
1079
+ responseType: 'blob',
1080
+ })];
1081
+ case 2:
1082
+ data = (_b.sent()).data;
1083
+ if (!data) {
1084
+ throw new StorageError('Download failed: no file content');
1085
+ }
1086
+ return [2, new Blob([data])];
1087
+ }
1088
+ });
1089
+ }); })()];
1090
+ case 1: return [2, (_a.data = _b.sent(),
1091
+ _a.error = null,
1092
+ _a)];
1093
+ case 2:
1094
+ error_7 = _b.sent();
1095
+ if (this.shouldThrowOnError)
1096
+ throw error_7;
1097
+ if (isStorageError(error_7)) {
1098
+ return [2, {
1099
+ data: null,
1100
+ error: error_7,
1101
+ }];
1102
+ }
1103
+ throw error_7;
1104
+ case 3: return [2];
1105
+ }
1106
+ });
1107
+ });
1108
+ };
1109
+ SupabaseFileAPILikeStorage.prototype.info = function (pathOrFileId) {
1110
+ return __awaiter(this, void 0, void 0, function () {
1111
+ var isFileId, displayName, bucketId, fileInfo, item, now, lastModified, error_8;
1112
+ return __generator(this, function (_a) {
1113
+ switch (_a.label) {
1114
+ case 0:
1115
+ _a.trys.push([0, 2, , 3]);
1116
+ isFileId = pathOrFileId.startsWith('cloud://');
1117
+ displayName = isFileId ? this._extractPathFromFileId(pathOrFileId) : pathOrFileId;
1118
+ bucketId = isFileId ? this._extractBucketFromFileId(pathOrFileId) : this.bucketId;
1119
+ return [4, this.getFileInfo({
1120
+ fileList: [this._normalizeCloudId(pathOrFileId)],
1121
+ })];
1122
+ case 1:
1123
+ fileInfo = _a.sent();
1124
+ item = fileInfo.fileList[0];
1125
+ if (item.code !== 'SUCCESS') {
1126
+ throw new StorageError(item.message);
1127
+ }
1128
+ now = new Date().toISOString();
1129
+ lastModified = (item.lastModified ? new Date(item.lastModified) : new Date()).toISOString();
1130
+ return [2, {
1131
+ data: {
1132
+ id: item.fileID,
1133
+ version: '1',
1134
+ name: displayName,
1135
+ bucketId: bucketId,
1136
+ updatedAt: lastModified,
1137
+ createdAt: lastModified,
1138
+ lastAccessedAt: now,
1139
+ size: item.size,
1140
+ cacheControl: item.cacheControl,
1141
+ contentType: item.contentType,
1142
+ etag: item.etag,
1143
+ lastModified: lastModified,
1144
+ metadata: {},
1145
+ },
1146
+ error: null,
1147
+ }];
1148
+ case 2:
1149
+ error_8 = _a.sent();
1150
+ if (this.shouldThrowOnError)
1151
+ throw error_8;
1152
+ return [2, {
1153
+ data: null,
1154
+ error: error_8 instanceof StorageError ? error_8 : new StorageError(error_8.message),
1155
+ }];
1156
+ case 3: return [2];
1157
+ }
1158
+ });
1159
+ });
1160
+ };
1161
+ SupabaseFileAPILikeStorage.prototype.exists = function (pathOrFileId) {
1162
+ return __awaiter(this, void 0, void 0, function () {
1163
+ var fileInfo, item, error_9;
1164
+ return __generator(this, function (_a) {
1165
+ switch (_a.label) {
1166
+ case 0:
1167
+ _a.trys.push([0, 2, , 3]);
1168
+ return [4, this.getFileInfo({
1169
+ fileList: [this._normalizeCloudId(pathOrFileId)],
1170
+ })];
1171
+ case 1:
1172
+ fileInfo = _a.sent();
1173
+ item = fileInfo.fileList[0];
1174
+ if (item.code === 'FILE_NOT_FOUND') {
1175
+ return [2, {
1176
+ data: false,
1177
+ error: null,
1178
+ }];
1179
+ }
1180
+ if (item.code !== 'SUCCESS') {
1181
+ throw new StorageError(item.message);
1182
+ }
1183
+ return [2, { data: true, error: null }];
1184
+ case 2:
1185
+ error_9 = _a.sent();
1186
+ if (this.shouldThrowOnError)
1187
+ throw error_9;
1188
+ throw error_9;
1189
+ case 3: return [2];
1190
+ }
1191
+ });
1192
+ });
1193
+ };
1194
+ SupabaseFileAPILikeStorage.prototype.getPublicUrl = function (path, options) {
1195
+ return __awaiter(this, void 0, void 0, function () {
1196
+ var res;
1197
+ return __generator(this, function (_a) {
1198
+ switch (_a.label) {
1199
+ case 0: return [4, this.createSignedUrl(path, 600, options)];
1200
+ case 1:
1201
+ res = _a.sent();
1202
+ if (res.data) {
1203
+ return [2, {
1204
+ data: { publicUrl: res.data.signedUrl },
1205
+ }];
1206
+ }
1207
+ return [2, { data: null, error: res.error }];
1208
+ }
1209
+ });
1210
+ });
1211
+ };
1212
+ SupabaseFileAPILikeStorage.prototype.remove = function (paths) {
1213
+ return __awaiter(this, void 0, void 0, function () {
1214
+ var chunkSize_1, pathChunks, i, fileInfoResults, fileInfoMap_1, fileList, result, failedFiles, now_1, error_10;
1215
+ var _this = this;
1216
+ return __generator(this, function (_a) {
1217
+ switch (_a.label) {
1218
+ case 0:
1219
+ _a.trys.push([0, 3, , 4]);
1220
+ chunkSize_1 = 10;
1221
+ pathChunks = [];
1222
+ for (i = 0; i < paths.length; i += chunkSize_1) {
1223
+ pathChunks.push(paths.slice(i, i + chunkSize_1));
1224
+ }
1225
+ return [4, Promise.all(pathChunks.map(function (chunk) { return Promise.all(chunk.map(function (path) { return _this.info(path); })); }))];
1226
+ case 1:
1227
+ fileInfoResults = _a.sent();
1228
+ fileInfoMap_1 = new Map();
1229
+ fileInfoResults.flat().forEach(function (result, index) {
1230
+ if (result.data) {
1231
+ fileInfoMap_1.set(paths[Math.floor(index / chunkSize_1) * chunkSize_1 + (index % chunkSize_1)], result.data);
1232
+ }
1233
+ });
1234
+ fileList = paths.map(function (p) { return _this._normalizeCloudId(p); });
1235
+ return [4, this.deleteFile({ fileList: fileList })];
1236
+ case 2:
1237
+ result = _a.sent();
1238
+ failedFiles = result.fileList.filter(function (item) { return item.code !== 'SUCCESS'; });
1239
+ if (failedFiles.length > 0) {
1240
+ throw new StorageError("Delete failed for ".concat(failedFiles.length, " file(s)"));
1241
+ }
1242
+ now_1 = new Date().toISOString();
1243
+ return [2, {
1244
+ data: paths.map(function (p) {
1245
+ var info = fileInfoMap_1.get(p);
1246
+ return {
1247
+ name: info === null || info === void 0 ? void 0 : info.name,
1248
+ id: info === null || info === void 0 ? void 0 : info.id,
1249
+ bucket_id: info === null || info === void 0 ? void 0 : info.bucketId,
1250
+ owner: undefined,
1251
+ updated_at: (info === null || info === void 0 ? void 0 : info.updatedAt) || now_1,
1252
+ created_at: info === null || info === void 0 ? void 0 : info.createdAt,
1253
+ last_accessed_at: (info === null || info === void 0 ? void 0 : info.lastAccessedAt) || now_1,
1254
+ metadata: (info === null || info === void 0 ? void 0 : info.metadata) || {},
1255
+ buckets: {
1256
+ id: info === null || info === void 0 ? void 0 : info.bucketId,
1257
+ name: info === null || info === void 0 ? void 0 : info.bucketId,
1258
+ owner: undefined,
1259
+ public: false,
1260
+ created_at: '',
1261
+ updated_at: now_1,
1262
+ },
1263
+ };
1264
+ }),
1265
+ error: null,
1266
+ }];
1267
+ case 3:
1268
+ error_10 = _a.sent();
1269
+ if (this.shouldThrowOnError)
1270
+ throw error_10;
1271
+ if (isStorageError(error_10)) {
1272
+ return [2, {
1273
+ data: null,
1274
+ error: error_10,
1275
+ }];
1276
+ }
1277
+ throw error_10;
1278
+ case 4: return [2];
1279
+ }
1280
+ });
1281
+ });
1282
+ };
1283
+ SupabaseFileAPILikeStorage.prototype.list = function () {
1284
+ return __awaiter(this, void 0, void 0, function () {
1285
+ return __generator(this, function (_a) {
1286
+ throw new StorageError('Not implemented');
1287
+ });
1288
+ });
1289
+ };
1290
+ SupabaseFileAPILikeStorage.prototype._getCloudPath = function (path) {
1291
+ var cleanPath = path.replace(/^\/|\/$/g, '').replace(/\/+/g, '/');
1292
+ return cleanPath;
1293
+ };
1294
+ SupabaseFileAPILikeStorage.prototype._normalizeCloudId = function (path) {
1295
+ var _a;
1296
+ if (/^cloud:\/\//.test(path)) {
1297
+ return path;
1298
+ }
1299
+ var cleanPath = this._getCloudPath(path);
1300
+ if (this.bucketId) {
1301
+ var envId = ((_a = this.config) === null || _a === void 0 ? void 0 : _a.env) || '';
1302
+ if (envId) {
1303
+ return "cloud://".concat(envId, ".").concat(this.bucketId, "/").concat(cleanPath);
1304
+ }
1305
+ }
1306
+ else {
1307
+ throw new StorageError('bucketId is not set');
1308
+ }
1309
+ };
1310
+ SupabaseFileAPILikeStorage.prototype.toBase64 = function (data) {
1311
+ if (typeof Buffer !== 'undefined') {
1312
+ return Buffer.from(data).toString('base64');
1313
+ }
1314
+ return btoa(data);
1315
+ };
1316
+ SupabaseFileAPILikeStorage.prototype._transformOptsToQueryString = function (transform) {
1317
+ var params = ['imageMogr2'];
1318
+ if (transform.width || transform.height) {
1319
+ var width = transform.width || '';
1320
+ var height = transform.height || '';
1321
+ if (transform.resize === 'fill') {
1322
+ params.push("thumbnail/".concat(width, "x").concat(height, "!"));
1323
+ }
1324
+ else if (transform.resize === 'contain') {
1325
+ params.push("thumbnail/".concat(width, "x").concat(height));
1326
+ }
1327
+ else {
1328
+ params.push("thumbnail/".concat(width, "x").concat(height, "^"));
1329
+ }
1330
+ }
1331
+ if (transform.format && transform.format !== 'origin') {
1332
+ params.push("format/".concat(transform.format));
1333
+ }
1334
+ if (transform.quality !== undefined) {
1335
+ var quality = Math.max(1, Math.min(100, transform.quality));
1336
+ params.push("quality/".concat(quality));
1337
+ }
1338
+ return params.join('/');
1339
+ };
1340
+ SupabaseFileAPILikeStorage.prototype._extractPathFromFileId = function (fileId) {
1341
+ var withoutProtocol = fileId.replace(/^cloud:\/\//, '');
1342
+ var parts = withoutProtocol.split('/');
1343
+ if (parts.length < 2) {
1344
+ return fileId;
1345
+ }
1346
+ return parts.slice(1).join('/');
1347
+ };
1348
+ SupabaseFileAPILikeStorage.prototype._extractBucketFromFileId = function (fileId) {
1349
+ var withoutProtocol = fileId.replace(/^cloud:\/\//, '');
1350
+ var parts = withoutProtocol.split('/');
1351
+ if (parts.length < 1) {
1352
+ return '';
1353
+ }
1354
+ var envAndBucket = parts[0];
1355
+ var dotIndex = envAndBucket.indexOf('.');
1356
+ if (dotIndex === -1) {
1357
+ return envAndBucket;
1358
+ }
1359
+ return envAndBucket.substring(dotIndex + 1);
1360
+ };
1361
+ return SupabaseFileAPILikeStorage;
1362
+ }(CloudbaseStorage));
1363
+ export { SupabaseFileAPILikeStorage };
17
1364
  var supabaseComponent = {
18
1365
  name: "".concat(COMPONENT_NAME, "/supabase"),
19
1366
  IIFE: true,
@@ -63,4 +1410,4 @@ try {
63
1410
  window.registerStorage = registerStorage;
64
1411
  }
65
1412
  catch (e) { }
66
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLGdCQUFnQixFQUFFLGNBQWMsRUFBcUIsTUFBTSxXQUFXLENBQUE7QUFDL0UsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sWUFBWSxDQUFBO0FBSXZELElBQU0sT0FBTyxHQUFHLElBQUksZ0JBQWdCLEVBQUUsQ0FBQTtBQUN0QyxJQUFNLFNBQVMsR0FBd0I7SUFDckMsSUFBSSxFQUFFLGNBQWM7SUFDcEIsTUFBTSxFQUFFO1FBQ04sVUFBVSxFQUFFLE9BQU8sQ0FBQyxVQUFVO1FBQzlCLFVBQVUsRUFBRSxPQUFPLENBQUMsVUFBVTtRQUM5QixjQUFjLEVBQUUsT0FBTyxDQUFDLGNBQWM7UUFDdEMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxZQUFZO1FBQ2xDLGlCQUFpQixFQUFFLE9BQU8sQ0FBQyxpQkFBaUI7UUFDNUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxRQUFRO1FBQzFCLFdBQVcsRUFBRSxPQUFPLENBQUMsV0FBVztRQUNoQyxTQUFTLEVBQUUsT0FBTyxDQUFDLFNBQVM7S0FDN0I7Q0FDRixDQUFBO0FBRUQsSUFBTSxpQkFBaUIsR0FBd0I7SUFDN0MsSUFBSSxFQUFFLFVBQUcsY0FBYyxjQUFXO0lBQ2xDLElBQUksRUFBRSxJQUFJO0lBQ1YsTUFBTTtRQUtKLElBQU0sWUFBWSxHQUFHLElBQUksT0FBTyxFQUFtQyxDQUFBO1FBR25FLE1BQU0sQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUU7WUFDL0MsR0FBRztnQkFJRCxJQUFJLFlBQVksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUU7b0JBQzFCLE9BQU8sWUFBWSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQTtpQkFDOUI7Z0JBSUQsSUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFBO2dCQUVyQixJQUFNLE9BQU8sR0FBRyxJQUFJLEtBQUssQ0FBb0IsRUFBdUIsRUFBRTtvQkFDcEUsR0FBRyxFQUFFLFVBQUMsT0FBTyxFQUFFLElBQUk7d0JBQ2pCLElBQUksSUFBSSxLQUFLLFFBQVEsRUFBRTs0QkFDckIsT0FBTyxRQUFRLENBQUMsTUFBTSxDQUFBO3lCQUN2Qjt3QkFDRCxJQUFJLElBQUksS0FBSyxTQUFTLEVBQUU7NEJBQ3RCLE9BQU8sUUFBUSxDQUFDLE9BQU8sQ0FBQTt5QkFDeEI7d0JBQ0QsT0FBTyxTQUFTLENBQUE7b0JBQ2xCLENBQUM7aUJBQ0YsQ0FBQyxDQUFBO2dCQUdGLElBQU0sT0FBTyxHQUFHLElBQUksMEJBQTBCLENBQUMsT0FBTyxDQUFDLENBQUE7Z0JBQ3ZELFlBQVksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFBO2dCQUMvQixPQUFPLE9BQU8sQ0FBQTtZQUNoQixDQUFDO1lBQ0QsWUFBWSxFQUFFLElBQUk7WUFDbEIsVUFBVSxFQUFFLElBQUk7U0FDakIsQ0FBQyxDQUFBO0lBQ0osQ0FBQztDQUNGLENBQUE7QUFFRCxJQUFJO0lBQ0YsU0FBUyxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxDQUFBO0lBQ3RDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFBO0NBQy9DO0FBQUMsT0FBTyxDQUFDLEVBQUUsR0FBRTtBQUVkLE1BQU0sVUFBVSxlQUFlLENBQUMsR0FBMEM7SUFDeEUsSUFBSTtRQUNGLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsQ0FBQTtRQUNoQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsaUJBQWlCLENBQUMsQ0FBQTtLQUN6QztJQUFDLE9BQU8sQ0FBQyxFQUFFO1FBQ1YsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQTtLQUNoQjtBQUNILENBQUM7QUFFRCxJQUFJO0lBQ0QsTUFBYyxDQUFDLGVBQWUsR0FBRyxlQUFlLENBQUE7Q0FDbEQ7QUFBQyxPQUFPLENBQUMsRUFBRSxHQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSUNsb3VkYmFzZSB9IGZyb20gJ0BjbG91ZGJhc2UvdHlwZXMnXG5pbXBvcnQgeyBJQ2xvdWRiYXNlQ29tcG9uZW50IH0gZnJvbSAnQGNsb3VkYmFzZS90eXBlcy9jb21wb25lbnQnXG5pbXBvcnQgeyBDbG91ZGJhc2VTdG9yYWdlLCBDT01QT05FTlRfTkFNRSwgSUNsb3VkYmFzZUNvbnRleHQgfSBmcm9tICcuL3N0b3JhZ2UnXG5pbXBvcnQgeyBTdXBhYmFzZUZpbGVBUElMaWtlU3RvcmFnZSB9IGZyb20gJy4vc3VwYWJhc2UnXG5cbmRlY2xhcmUgY29uc3QgY2xvdWRiYXNlOiBJQ2xvdWRiYXNlXG5cbmNvbnN0IHN0b3JhZ2UgPSBuZXcgQ2xvdWRiYXNlU3RvcmFnZSgpXG5jb25zdCBjb21wb25lbnQ6IElDbG91ZGJhc2VDb21wb25lbnQgPSB7XG4gIG5hbWU6IENPTVBPTkVOVF9OQU1FLFxuICBlbnRpdHk6IHtcbiAgICB1cGxvYWRGaWxlOiBzdG9yYWdlLnVwbG9hZEZpbGUsXG4gICAgZGVsZXRlRmlsZTogc3RvcmFnZS5kZWxldGVGaWxlLFxuICAgIGdldFRlbXBGaWxlVVJMOiBzdG9yYWdlLmdldFRlbXBGaWxlVVJMLFxuICAgIGRvd25sb2FkRmlsZTogc3RvcmFnZS5kb3dubG9hZEZpbGUsXG4gICAgZ2V0VXBsb2FkTWV0YWRhdGE6IHN0b3JhZ2UuZ2V0VXBsb2FkTWV0YWRhdGEsXG4gICAgY29weUZpbGU6IHN0b3JhZ2UuY29weUZpbGUsXG4gICAgZ2V0RmlsZUluZm86IHN0b3JhZ2UuZ2V0RmlsZUluZm8sXG4gICAgaXNHYXRlV2F5OiBzdG9yYWdlLmlzR2F0ZVdheSxcbiAgfSxcbn1cblxuY29uc3Qgc3VwYWJhc2VDb21wb25lbnQ6IElDbG91ZGJhc2VDb21wb25lbnQgPSB7XG4gIG5hbWU6IGAke0NPTVBPTkVOVF9OQU1FfS9zdXBhYmFzZWAsXG4gIElJRkU6IHRydWUsXG4gIGVudGl0eSgpIHtcbiAgICAvLyDlnKggSUlGRSDkuK3vvIx0aGlzIOaYryBDbG91ZGJhc2Ug57G777yI5p6E6YCg5Ye95pWw77yJ77yM5LiN5piv5a6e5L6LXG4gICAgLy8g5omA5Lul5oiR5Lus6ZyA6KaB5L2/55SoIGdldHRlciDmnaXlu7bov5/ojrflj5blrp7kvovnmoQgY29uZmlnIOWSjCByZXF1ZXN0XG5cbiAgICAvLyDkvb/nlKggV2Vha01hcCDnvJPlrZjmr4/kuKrlrp7kvovnmoQgc3RvcmFnZSDlr7nosaFcbiAgICBjb25zdCBzdG9yYWdlQ2FjaGUgPSBuZXcgV2Vha01hcDxhbnksIFN1cGFiYXNlRmlsZUFQSUxpa2VTdG9yYWdlPigpXG5cbiAgICAvLyDlrprkuYkgc3RvcmFnZSDlsZ7mgKfnmoQgZ2V0dGVy77yM5q+P5Liq5a6e5L6L5Y+q5Yib5bu65LiA5qyhXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMucHJvdG90eXBlLCAnc3RvcmFnZScsIHtcbiAgICAgIGdldCgpIHtcbiAgICAgICAgLy8g6L+Z6YeM55qEIHRoaXMg5pivIGNsb3VkYmFzZSDlrp7kvotcblxuICAgICAgICAvLyDlpoLmnpzlt7Lnu4/liJvlu7rov4fvvIznm7TmjqXov5Tlm57nvJPlrZjnmoTlrp7kvotcbiAgICAgICAgaWYgKHN0b3JhZ2VDYWNoZS5oYXModGhpcykpIHtcbiAgICAgICAgICByZXR1cm4gc3RvcmFnZUNhY2hlLmdldCh0aGlzKVxuICAgICAgICB9XG5cbiAgICAgICAgLy8g5Yib5bu65Yqo5oCBIGNvbnRleHTvvIzku47lvZPliY3lrp7kvovojrflj5YgY29uZmlnIOWSjCByZXF1ZXN0XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdGhpcy1hbGlhc1xuICAgICAgICBjb25zdCBpbnN0YW5jZSA9IHRoaXNcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9jb25zaXN0ZW50LXR5cGUtYXNzZXJ0aW9uc1xuICAgICAgICBjb25zdCBjb250ZXh0ID0gbmV3IFByb3h5PElDbG91ZGJhc2VDb250ZXh0Pih7fSBhcyBJQ2xvdWRiYXNlQ29udGV4dCwge1xuICAgICAgICAgIGdldDogKF90YXJnZXQsIHByb3ApID0+IHtcbiAgICAgICAgICAgIGlmIChwcm9wID09PSAnY29uZmlnJykge1xuICAgICAgICAgICAgICByZXR1cm4gaW5zdGFuY2UuY29uZmlnXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocHJvcCA9PT0gJ3JlcXVlc3QnKSB7XG4gICAgICAgICAgICAgIHJldHVybiBpbnN0YW5jZS5yZXF1ZXN0XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgICAgICAgfSxcbiAgICAgICAgfSlcblxuICAgICAgICAvLyDliJvlu7rmlrDnmoQgc3RvcmFnZSDlrp7kvovlubbnvJPlrZhcbiAgICAgICAgY29uc3Qgc3RvcmFnZSA9IG5ldyBTdXBhYmFzZUZpbGVBUElMaWtlU3RvcmFnZShjb250ZXh0KVxuICAgICAgICBzdG9yYWdlQ2FjaGUuc2V0KHRoaXMsIHN0b3JhZ2UpXG4gICAgICAgIHJldHVybiBzdG9yYWdlXG4gICAgICB9LFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICB9KVxuICB9LFxufVxuXG50cnkge1xuICBjbG91ZGJhc2UucmVnaXN0ZXJDb21wb25lbnQoY29tcG9uZW50KVxuICBjbG91ZGJhc2UucmVnaXN0ZXJDb21wb25lbnQoc3VwYWJhc2VDb21wb25lbnQpXG59IGNhdGNoIChlKSB7fVxuXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJTdG9yYWdlKGFwcDogUGljazxJQ2xvdWRiYXNlLCAncmVnaXN0ZXJDb21wb25lbnQnPikge1xuICB0cnkge1xuICAgIGFwcC5yZWdpc3RlckNvbXBvbmVudChjb21wb25lbnQpXG4gICAgYXBwLnJlZ2lzdGVyQ29tcG9uZW50KHN1cGFiYXNlQ29tcG9uZW50KVxuICB9IGNhdGNoIChlKSB7XG4gICAgY29uc29sZS53YXJuKGUpXG4gIH1cbn1cblxudHJ5IHtcbiAgKHdpbmRvdyBhcyBhbnkpLnJlZ2lzdGVyU3RvcmFnZSA9IHJlZ2lzdGVyU3RvcmFnZVxufSBjYXRjaCAoZSkge31cbiJdfQ==
1413
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFHQSxPQUFPLEVBQUUsY0FBYyxFQUFFLFlBQVksRUFBRSxNQUFNLG1CQUFtQixDQUFBO0FBQ2hFLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxNQUFNLHNCQUFzQixDQUFBO0FBaUJoRSxJQUFLLGFBR0o7QUFIRCxXQUFLLGFBQWE7SUFDaEIsNEJBQVcsQ0FBQTtJQUNYLDhCQUFhLENBQUE7QUFDZixDQUFDLEVBSEksYUFBYSxLQUFiLGFBQWEsUUFHakI7QUFXTyxJQUFBLFVBQVUsR0FBaUMsU0FBUyxXQUExQyxFQUFFLE1BQU0sR0FBeUIsU0FBUyxPQUFsQyxFQUFFLGtCQUFrQixHQUFLLFNBQVMsbUJBQWQsQ0FBYztBQUNwRCxJQUFBLE9BQU8sR0FBNEMsS0FBSyxRQUFqRCxFQUFFLFFBQVEsR0FBa0MsS0FBSyxTQUF2QyxFQUFFLGFBQWEsR0FBbUIsS0FBSyxjQUF4QixFQUFFLFlBQVksR0FBSyxLQUFLLGFBQVYsQ0FBVTtBQUV4RCxJQUFBLG9CQUFvQixHQUFLLE9BQU8scUJBQVosQ0FBWTtBQUV4QyxNQUFNLENBQUMsSUFBTSxjQUFjLEdBQUcsU0FBUyxDQUFBO0FBRXZDLElBQU0sY0FBYyxHQUFHO0lBQ3JCLGFBQWEsRUFBRSxVQUNiLE9BQU8sRUFDUCxNQUEwRCxFQUMxRCxhQUEwRDs7Ozs7d0JBRWhELFdBQU0sT0FBTyxDQUFDLE9BQU8sQ0FDN0I7d0JBQ0UsSUFBSSxFQUFFLFVBQVU7d0JBQ2hCLElBQUksRUFBRSx5QkFBeUI7d0JBQy9CLElBQUksRUFBRTt1Q0FFRixRQUFRLEVBQUUsTUFBTSxDQUFDLElBQUksSUFDbEIsQ0FBQyxNQUFNLENBQUMs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O0FBRUQsSUFBSTtJQUNGLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsQ0FBQTtJQUN0QyxTQUFTLENBQUMsaUJBQWlCLENBQUMsaUJBQWlCLENBQUMsQ0FBQTtDQUMvQztBQUFDLE9BQU8sQ0FBQyxFQUFFLEdBQUU7QUFFZCxNQUFNLFVBQVUsZUFBZSxDQUFDLEdBQTBDO0lBQ3hFLElBQUk7UUFDRixHQUFHLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLENBQUE7UUFDaEMsR0FBRyxDQUFDLGlCQUFpQixDQUFDLGlCQUFpQixDQUFDLENBQUE7S0FDekM7SUFBQyxPQUFPLENBQUMsRUFBRTtRQUNWLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUE7S0FDaEI7QUFDSCxDQUFDO0FBRUQsSUFBSTtJQUNELE1BQWMsQ0FBQyxlQUFlLEdBQUcsZUFBZSxDQUFBO0NBQ2xEO0FBQUMsT0FBTyxDQUFDLEVBQUUsR0FBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IElDbG91ZGJhc2UgfSBmcm9tICdAY2xvdWRiYXNlL3R5cGVzJ1xuaW1wb3J0IHsgSUNsb3VkYmFzZUNvbXBvbmVudCB9IGZyb20gJ0BjbG91ZGJhc2UvdHlwZXMvY29tcG9uZW50J1xuaW1wb3J0IHsgQ2FtZWxpemUsIEZpbGVCb2R5LCBGaWxlT2JqZWN0LCBGaWxlT2JqZWN0VjIsIEZpbGVPcHRpb25zLCBUcmFuc2Zvcm1PcHRpb25zIH0gZnJvbSAnLi9zdXBhYmFzZS90eXBlcydcbmltcG9ydCB7IGlzU3RvcmFnZUVycm9yLCBTdG9yYWdlRXJyb3IgfSBmcm9tICcuL3N1cGFiYXNlL2Vycm9ycydcbmltcG9ydCB7IGNvbnN0YW50cywgdXRpbHMsIGhlbHBlcnMgfSBmcm9tICdAY2xvdWRiYXNlL3V0aWxpdGllcydcbmltcG9ydCB7XG4gIElDbG91ZGJhc2VGaWxlTWV0YURhdGFSZXMsXG4gIElDbG91ZGJhc2VGaWxlSW5mbyxcbiAgSUNsb3VkYmFzZVVwbG9hZEZpbGVQYXJhbXMsXG4gIElDbG91ZGJhc2VVcGxvYWRGaWxlUmVzdWx0LFxuICBJQ2xvdWRiYXNlR2V0VXBsb2FkTWV0YWRhdGFQYXJhbXMsXG4gIElDbG91ZGJhc2VEZWxldGVGaWxlUGFyYW1zLFxuICBJQ2xvdWRiYXNlRGVsZXRlRmlsZVJlc3VsdCxcbiAgSUNsb3VkYmFzZUdldFRlbXBGaWxlVVJMUmVzdWx0LFxuICBJQ2xvdWRiYXNlR2V0VGVtcEZpbGVVUkxQYXJhbXMsXG4gIElDbG91ZGJhc2VEb3dubG9hZEZpbGVSZXN1bHQsXG4gIElDbG91ZGJhc2VEb3dubG9hZEZpbGVQYXJhbXMsXG4gIElDbG91ZGJhc2VDb3B5RmlsZVBhcmFtcyxcbiAgSUNsb3VkYmFzZUNvcHlGaWxlUmVzdWx0LFxufSBmcm9tICdAY2xvdWRiYXNlL3R5cGVzL3N0b3JhZ2UnXG5cbmVudW0gRVVwbG9hZE1ldGhvZCB7XG4gIHB1dCA9ICdwdXQnLFxuICBwb3N0ID0gJ3Bvc3QnLFxufVxuXG5pbnRlcmZhY2UgSVVwbG9hZE1ldGFkYXRhIHtcbiAgdXJsOiBzdHJpbmdcbiAgdG9rZW46IHN0cmluZ1xuICBhdXRob3JpemF0aW9uOiBzdHJpbmdcbiAgZmlsZUlkOiBzdHJpbmdcbiAgY29zRmlsZUlkOiBzdHJpbmdcbiAgZG93bmxvYWRfdXJsPzogc3RyaW5nXG59XG5cbmNvbnN0IHsgZ2V0U2RrTmFtZSwgRVJST1JTLCBDT01NVU5JVFlfU0lURV9VUkwgfSA9IGNvbnN0YW50c1xuY29uc3QgeyBpc0FycmF5LCBpc1N0cmluZywgaXNQYWxpbk9iamVjdCwgZXhlY0NhbGxiYWNrIH0gPSB1dGlsc1xuLyoqIGNhdGNoRXJyb3JzRGVjb3JhdG9yIOijhemlsOWZqOimgeaUvuWcqGluZGV45YWl5Y+j5paH5Lu277yM5oSP6Z2i5pyJ55qE57yW6K+R5om+5LiN5Yiw5YW2c291cmNlbWFw77yM5L6L5aaCSEJ1aWxkZXJYICovXG5jb25zdCB7IGNhdGNoRXJyb3JzRGVjb3JhdG9yIH0gPSBoZWxwZXJzXG5cbmV4cG9ydCBjb25zdCBDT01QT05FTlRfTkFNRSA9ICdzdG9yYWdlJ1xuXG5jb25zdCBzdG9yYWdlR2F0ZVdheSA9IHtcbiAgZ2V0VXBsb2FkSW5mbzogYXN5bmMgKFxuICAgIHJlcXVlc3QsXG4gICAgcGFyYW1zOiB7IHBhdGg6IHN0cmluZzsgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfSxcbiAgICBjdXN0b21SZXFPcHRzOiBJQ2xvdWRiYXNlVXBsb2FkRmlsZVBhcmFtc1snY3VzdG9tUmVxT3B0cyddLFxuICApID0+IHtcbiAgICBsZXQgcmVzID0gYXdhaXQgcmVxdWVzdC5nYXRlV2F5KFxuICAgICAge1xuICAgICAgICBwYXRoOiAnc3RvcmFnZXMnLFxuICAgICAgICBuYW1lOiAnZ2V0LW9iamVjdHMtdXBsb2FkLWluZm8nLFxuICAgICAgICBkYXRhOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgb2JqZWN0SWQ6IHBhcmFtcy5wYXRoLFxuICAgICAgICAgICAgLi4uKHBhcmFtcy5oZWFkZXJzID8geyBzaWduZWRIZWFkZXI6IHBhcmFtcy5oZWFkZXJzIH0gOiB7fSksXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgICBjdXN0b21SZXFPcHRzLFxuICAgIClcbiAgICBjb25zdCBkYXRhID0gcmVzLmRhdGE/LlswXSB8fCB7fVxuXG4gICAgcmVzID0ge1xuICAgICAgLi4ucmVzLFxuICAgICAgZGF0YToge1xuICAgICAgICAuLi4oZGF0YS5jb2RlID8geyAuLi5kYXRhIH0gOiB7fSksXG4gICAgICAgIGF1dGhvcml6YXRpb246IGRhdGEuYXV0aG9yaXphdGlvbixcbiAgICAgICAgdG9rZW46IGRhdGEudG9rZW4sXG4gICAgICAgIHVybDogZGF0YS51cGxvYWRVcmwsXG4gICAgICAgIGZpbGVJZDogZGF0YS5jbG91ZE9iamVjdElkLFxuICAgICAgICBjb3NGaWxlSWQ6IGRhdGEuY2xvdWRPYmplY3RNZXRhLFxuICAgICAgICBkb3dubG9hZF91cmw6IGRhdGEuZG93bmxvYWRVcmwsXG4gICAgICB9LFxuICAgIH1cblxuICAgIHJldHVybiByZXNcbiAgfSxcbiAgZ2V0RG93bkxvYWRJbmZvOiBhc3luYyAoXG4gICAgcmVxdWVzdCxcbiAgICBwYXJhbXM6IHsgY29udmVydGVkRmlsZUxpc3Q6IEFycmF5PHsgZmlsZWlkOiBzdHJpbmcgfT4gfSxcbiAgICBjdXN0b21SZXFPcHRzOiBJQ2xvdWRiYXNlVXBsb2FkRmlsZVBhcmFtc1snY3VzdG9tUmVxT3B0cyddLFxuICApID0+IHtcbiAgICBsZXQgcmVzID0gYXdhaXQgcmVxdWVzdC5nYXRlV2F5KFxuICAgICAge1xuICAgICAgICBwYXRoOiAnc3RvcmFnZXMnLFxuICAgICAgICBuYW1lOiAnZ2V0LW9iamVjdHMtZG93bmxvYWQtaW5mbycsXG4gICAgICAgIGRhdGE6IHBhcmFtcy5jb252ZXJ0ZWRGaWxlTGlzdC5tYXAoKHY6IGFueSkgPT4gKHsgY2xvdWRPYmplY3RJZDogdi5maWxlaWQgfSkpLFxuICAgICAgfSxcbiAgICAgIGN1c3RvbVJlcU9wdHMsXG4gICAgKVxuICAgIHJlcyA9IHtcbiAgICAgIC4uLnJlcyxcbiAgICAgIGRhdGE6IHtcbiAgICAgICAgZG93bmxvYWRfbGlzdDogcmVzLmRhdGE/Lm1hcCh2ID0+ICh7XG4gICAgICAgICAgY29kZTogdi5jb2RlIHx8ICdTVUNDRVNTJyxcbiAgICAgICAgICBtZXNzYWdlOiB2Lm1lc3NhZ2UsXG4gICAgICAgICAgZmlsZWlkOiB2LmNsb3VkT2JqZWN0SWQsXG4gICAgICAgICAgZG93bmxvYWRfdXJsOiB2LmRvd25sb2FkVXJsLFxuICAgICAgICAgIGZpbGVJRDogdi5jbG91ZE9iamVjdElkLFxuICAgICAgICAgIHRlbXBGaWxlVVJMOiB2LmRvd25sb2FkVXJsLFxuICAgICAgICB9KSksXG4gICAgICB9LFxuICAgIH1cblxuICAgIHJldHVybiByZXNcbiAgfSxcbiAgZGVsZXRlOiBhc3luYyAoXG4gICAgcmVxdWVzdCxcbiAgICBwYXJhbXM6IHsgZmlsZUxpc3Q6IEFycmF5PHN0cmluZz4gfSxcbiAgICBjdXN0b21SZXFPcHRzOiBJQ2xvdWRiYXNlVXBsb2FkRmlsZVBhcmFtc1snY3VzdG9tUmVxT3B0cyddLFxuICApID0+IHtcbiAgICBsZXQgcmVzID0gYXdhaXQgcmVxdWVzdC5nYXRlV2F5KFxuICAgICAge1xuICAgICAgICBwYXRoOiAnc3RvcmFnZXMnLFxuICAgICAgICBuYW1lOiAnZGVsZXRlLW9iamVjdHMnLFxuICAgICAgICBkYXRhOiBwYXJhbXMuZmlsZUxpc3QubWFwKHYgPT4gKHsgY2xvdWRPYmplY3RJZDogdiB9KSksXG4gICAgICB9LFxuICAgICAgY3VzdG9tUmVxT3B0cyxcbiAgICApXG4gICAgcmVzID0ge1xuICAgICAgLi4ucmVzLFxuICAgICAgZGF0YToge1xuICAgICAgICBkZWxldGVfbGlzdDogcmVzLmRhdGE/Lm1hcCh2ID0+ICh7XG4gICAgICAgICAgY29kZTogdi5jb2RlIHx8ICdTVUNDRVNTJyxcbiAgICAgICAgICBmaWxlSUQ6IHYuY2xvdWRPYmplY3RJZCxcbiAgICAgICAgICBtZXNzYWdlOiB2Lm1lc3NhZ2UsXG4gICAgICAgIH0pKSxcbiAgICAgIH0sXG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc1xuICB9LFxuICBjb3B5RmlsZTogYXN5bmMgKFxuICAgIHJlcXVlc3QsXG4gICAgcGFyYW1zOiB7XG4gICAgICBjb252ZXJ0ZWRGaWxlTGlzdDogQXJyYXk8eyBzcmNfcGF0aDogc3RyaW5nOyBkc3RfcGF0aDogc3RyaW5nOyBvdmVyd3JpdGU6IGJvb2xlYW47IHJlbW92ZV9vcmlnaW5hbDogYm9vbGVhbiB9PlxuICAgIH0sXG4gICAgY3VzdG9tUmVxT3B0czogSUNsb3VkYmFzZVVwbG9hZEZpbGVQYXJhbXNbJ2N1c3RvbVJlcU9wdHMnXSxcbiAgKSA9PiB7XG4gICAgbGV0IHJlcyA9IGF3YWl0IHJlcXVlc3QuZ2F0ZVdheShcbiAgICAgIHtcbiAgICAgICAgcGF0aDogJ3N0b3JhZ2VzJyxcbiAgICAgICAgbmFtZTogJ2NvcHktb2JqZWN0cycsXG4gICAgICAgIGRhdGE6IHBhcmFtcy5jb252ZXJ0ZWRGaWxlTGlzdC5tYXAoKHY6IGFueSkgPT4gKHtcbiAgICAgICAgICBzcmNQYXRoOiB2LnNyY19wYXRoLFxuICAgICAgICAgIGRzdFBhdGg6IHYuZHN0X3BhdGgsXG4gICAgICAgICAgb3ZlcndyaXRlOiB2Lm92ZXJ3cml0ZSxcbiAgICAgICAgICByZW1vdmVPcmlnaW5hbDogdi5yZW1vdmVfb3JpZ2luYWwsXG4gICAgICAgIH0pKSxcbiAgICAgIH0sXG4gICAgICBjdXN0b21SZXFPcHRzLFxuICAgIClcbiAgICByZXMgPSB7XG4gICAgICAuLi5yZXMsXG4gICAgICBkYXRhOiB7XG4gICAgICAgIGNvcHlfbGlzdDogcmVzLmRhdGE/Lm1hcCh2ID0+ICh7XG4gICAgICAgICAgY29kZTogdi5jb2RlIHx8ICdTVUNDRVNTJyxcbiAgICAgICAgICBmaWxlSUQ6IHYuY2xvdWRPYmplY3RJZCxcbiAgICAgICAgICBtZXNzYWdlOiB2Lm1lc3NhZ2UsXG4gICAgICAgIH0pKSxcbiAgICAgIH0sXG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc1xuICB9LFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElDbG91ZGJhc2VDb250ZXh0IHtcbiAgY29uZmlnOiBhbnlcbiAgcmVxdWVzdDogYW55XG59XG5cbmV4cG9ydCBjbGFzcyBDbG91ZGJhc2VTdG9yYWdlIHtcbiAgcHVibGljIGlzR2F0ZVdheSgpIHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgY29uc3QgeyBjb25maWcgfSA9IHRoaXNcbiAgICBjb25zdCBlbmRQb2ludE1vZGUgPSBjb25maWcuZW5kUG9pbnRNb2RlIHx8ICdDTE9VRF9BUEknXG5cbiAgICByZXR1cm4gZW5kUG9pbnRNb2RlID09PSAnR0FURVdBWSdcbiAgfVxuXG4gIEBjYXRjaEVycm9yc0RlY29yYXRvcih7XG4gICAgY3VzdG9tSW5mbzoge1xuICAgICAgY2xhc3NOYW1lOiAnQ2xvdWRiYXNlJyxcbiAgICAgIG1ldGhvZE5hbWU6ICd1cGxvYWRGaWxlJyxcbiAgICB9LFxuICAgIHRpdGxlOiAn5LiK5Lyg5paH5Lu25aSx6LSlJyxcbiAgICBtZXNzYWdlczogW1xuICAgICAgJ+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/LmZpbGVMaXN0Py5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBmaWxlTGlzdCA9IGF3YWl0IFByb21pc2UuYWxsKGZpbGVJbmZvLmZpbGVMaXN0Lm1hcChhc3luYyAoaXRlbTogSUNsb3VkYmFzZUdldFRlbXBGaWxlVVJMUmVzdWx0WydmaWxlTGlzdCddWzBdKSA9PiB7XG4gICAgICAgIGlmIChpdGVtLmNvZGUgIT09ICdTVUNDRVNTJykge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb2RlOiBpdGVtLmNvZGUsXG4gICAgICAgICAgICBmaWxlSUQ6IGl0ZW0uZmlsZUlELFxuICAgICAgICAgICAgdGVtcEZpbGVVUkw6IGl0ZW0udGVtcEZpbGVVUkwsXG4gICAgICAgICAgICBtZXNzYWdlOiBpdGVtLm1lc3NhZ2UsXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgY29uc3QgeyByZXF1ZXN0IH0gPSB0aGlzXG4gICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgcmVxdWVzdC5mZXRjaCh7IHVybDogaXRlbS50ZW1wRmlsZVVSTCwgbWV0aG9kOiAnSEVBRCcgfSlcbiAgICAgICAgICBsZXQgeyBoZWFkZXIgfSA9IHJlc1xuXG4gICAgICAgICAgaWYgKEhlYWRlcnMgJiYgaGVhZGVyIGluc3RhbmNlb2YgSGVhZGVycykge1xuICAgICAgICAgICAgaGVhZGVyID0gT2JqZWN0LmZyb21FbnRyaWVzKHJlcy5oZWFkZXIuZW50cmllcygpKVxuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmFkaXhcbiAgICAgICAgICBjb25zdCBmaWxlU2l6ZSA9IHBhcnNlSW50KGhlYWRlclsnY29udGVudC1sZW5ndGgnXSkgfHwgMFxuICAgICAgICAgIGNvbnN0IGNvbnRlbnRUeXBlID0gaGVhZGVyWydjb250ZW50LXR5cGUnXSB8fCAnJ1xuXG4gICAgICAgICAgaWYgKFs0MDAsIDQwNF0uaW5jbHVkZXMoTnVtYmVyKHJlcy5zdGF0dXNDb2RlKSkpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGNvZGU6ICdGSUxFX05PVF9GT1VORCcsXG4gICAgICAgICAgICAgIGZpbGVJRDogaXRlbS5maWxlSUQsXG4gICAgICAgICAgICAgIHRlbXBGaWxlVVJMOiBpdGVtLnRlbXBGaWxlVVJMLFxuICAgICAgICAgICAgICBtZXNzYWdlOiAnZmlsZSBub3QgZm91bmQnLFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGZpbGVJbmZvID0ge1xuICAgICAgICAgICAgY29kZTogaXRlbS5jb2RlLFxuICAgICAgICAgICAgZmlsZUlEOiBpdGVtLmZpbGVJRCxcbiAgICAgICAgICAgIHRlbXBGaWxlVVJMOiBpdGVtLnRlbXBGaWxlVVJMLFxuICAgICAgICAgICAgY2xvdWRJZDogaXRlbS5maWxlSUQsXG4gICAgICAgICAgICBmaWxlTmFtZTogaXRlbS5maWxlSUQuc3BsaXQoJy8nKS5wb3AoKSxcbiAgICAgICAgICAgIGNvbnRlbnRUeXBlLFxuICAgICAgICAgICAgbWltZTogY29udGVudFR5cGUuc3BsaXQoJzsnKVswXS50cmltKCksXG4gICAgICAgICAgICBzaXplOiBmaWxlU2l6ZSxcbiAgICAgICAgICAgIGV0YWc6IGhlYWRlci5ldGFnIHx8ICcnLFxuICAgICAgICAgICAgbGFzdE1vZGlmaWVkOiBoZWFkZXJbJ2xhc3QtbW9kaWZpZWQnXSB8fCAnJyxcbiAgICAgICAgICAgIGNhY2hlQ29udHJvbDogaGVhZGVyWydjYWNoZS1jb250cm9sJ10gfHwgJycsXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGZpbGVJbmZvXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29kZTogJ0ZFVENIX0ZJTEVfSU5GT19FUlJPUicsXG4gICAgICAgICAgICBmaWxlSUQ6IGl0ZW0uZmlsZUlELFxuICAgICAgICAgICAgdGVtcEZpbGVVUkw6IGl0ZW0udGVtcEZpbGVVUkwsXG4gICAgICAgICAgICBtZXNzYWdlOiBlLm1lc3NhZ2UsXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KSwpXG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGZpbGVMaXN0LFxuICAgICAgICByZXF1ZXN0SWQ6IGZpbGVJbmZvLnJlcXVlc3RJZCxcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgZmlsZUxpc3Q6IFtdLFxuICAgICAgcmVxdWVzdElkOiBmaWxlSW5mby5yZXF1ZXN0SWQsXG4gICAgfVxuICB9XG59XG5cblxuZGVjbGFyZSBjb25zdCBjbG91ZGJhc2U6IElDbG91ZGJhc2VcblxuY29uc3Qgc3RvcmFnZSA9IG5ldyBDbG91ZGJhc2VTdG9yYWdlKClcbmNvbnN0IGNvbXBvbmVudDogSUNsb3VkYmFzZUNvbXBvbmVudCA9IHtcbiAgbmFtZTogQ09NUE9ORU5UX05BTUUsXG4gIGVudGl0eToge1xuICAgIHVwbG9hZEZpbGU6IHN0b3JhZ2UudXBsb2FkRmlsZSxcbiAgICBkZWxldGVGaWxlOiBzdG9yYWdlLmRlbGV0ZUZpbGUsXG4gICAgZ2V0VGVtcEZpbGVVUkw6IHN0b3JhZ2UuZ2V0VGVtcEZpbGVVUkwsXG4gICAgZG93bmxvYWRGaWxlOiBzdG9yYWdlLmRvd25sb2FkRmlsZSxcbiAgICBnZXRVcGxvYWRNZXRhZGF0YTogc3RvcmFnZS5nZXRVcGxvYWRNZXRhZGF0YSxcbiAgICBjb3B5RmlsZTogc3RvcmFnZS5jb3B5RmlsZSxcbiAgICBnZXRGaWxlSW5mbzogc3RvcmFnZS5nZXRGaWxlSW5mbyxcbiAgICBpc0dhdGVXYXk6IHN0b3JhZ2UuaXNHYXRlV2F5LFxuICB9LFxufVxuXG5leHBvcnQgY2xhc3MgU3VwYWJhc2VGaWxlQVBJTGlrZVN0b3JhZ2UgZXh0ZW5kcyBDbG91ZGJhc2VTdG9yYWdlIHtcbiAgcHJpdmF0ZSBzaG91bGRUaHJvd09uRXJyb3IgPSBmYWxzZVxuICBwcml2YXRlIGJ1Y2tldElkID0gJydcbiAgcHJpdmF0ZSBjb250ZXh0OiBJQ2xvdWRiYXNlQ29udGV4dFxuXG4gIGNvbnN0cnVjdG9yKGNvbnRleHQ/OiBJQ2xvdWRiYXNlQ29udGV4dCkge1xuICAgIHN1cGVyKClcbiAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0XG4gIH1cblxuICBnZXQgY29uZmlnKCkge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICByZXR1cm4gdGhpcy5jb250ZXh0Py5jb25maWdcbiAgfVxuXG4gIGdldCByZXF1ZXN0KCkge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICByZXR1cm4gdGhpcy5jb250ZXh0Py5yZXF1ZXN0XG4gIH1cblxuICB0aHJvd09uRXJyb3IoKTogdGhpcyB7XG4gICAgdGhpcy5zaG91bGRUaHJvd09uRXJyb3IgPSB0cnVlXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIGZyb20oYnVja2V0Pzogc3RyaW5nKSB7XG4gICAgdGhpcy5idWNrZXRJZCA9IGJ1Y2tldCB8fCAnJ1xuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICBhc3luYyB1cGxvYWQoXG4gICAgcGF0aDogc3RyaW5nLFxuICAgIGZpbGVCb2R5OiBGaWxlQm9keSxcbiAgICBmaWxlT3B0aW9ucz86IEZpbGVPcHRpb25zLFxuICApOiBQcm9taXNlPFxuICAgIHsgZGF0YTogeyBpZDogc3RyaW5nOyBwYXRoOiBzdHJpbmc7IGZ1bGxQYXRoOiBzdHJpbmcgfTsgZXJyb3I6IG51bGwgfSB8IHsgZGF0YTogbnVsbDsgZXJyb3I6IFN0b3JhZ2VFcnJvciB9XG4gICAgPiB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHsgdXBzZXJ0OiB0cnVlLCAuLi5maWxlT3B0aW9ucyB9XG4gICAgY29uc3QgeyBjYWNoZUNvbnRyb2wsIGNvbnRlbnRUeXBlLCBtZXRhZGF0YSB9ID0gb3B0aW9uc1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjbG91ZFBhdGggPSB0aGlzLl9nZXRDbG91ZFBhdGgocGF0aClcbiAgICAgIGNvbnN0IHVwbG9hZEZpbGVQYXJhbXM6IFBhcmFtZXRlcnM8Q2xvdWRiYXNlU3RvcmFnZVsndXBsb2FkRmlsZSddPlswXSA9IHtcbiAgICAgICAgY2xvdWRQYXRoLFxuICAgICAgICBmaWxlUGF0aDogZmlsZUJvZHkgYXMgYW55LFxuICAgICAgfVxuXG4gICAgICBpZiAoY2FjaGVDb250cm9sIHx8IGNvbnRlbnRUeXBlIHx8IG1ldGFkYXRhKSB7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7fVxuICAgICAgICBpZiAoY2FjaGVDb250cm9sKSB7XG4gICAgICAgICAgaGVhZGVyc1snY2FjaGUtY29udHJvbCddID0gY2FjaGVDb250cm9sXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbnRlbnRUeXBlKSB7XG4gICAgICAgICAgaGVhZGVyc1snY29udGVudC10eXBlJ10gPSBjb250ZW50VHlwZVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG1ldGFkYXRhKSB7XG4gICAgICAgICAgaGVhZGVyc1sneC1jb3MtbWV0YWRhdGEtbWV0YWRhdGEnXSA9IHRoaXMudG9CYXNlNjQoSlNPTi5zdHJpbmdpZnkobWV0YWRhdGEpKVxuICAgICAgICB9XG5cbiAgICAgICAgdXBsb2FkRmlsZVBhcmFtcy5oZWFkZXJzID0gaGVhZGVyc1xuICAgICAgfVxuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnVwbG9hZEZpbGUodXBsb2FkRmlsZVBhcmFtcylcblxuICAgICAgLy8gSVVwbG9hZEZpbGVSZXMg5rKh5pyJIGNvZGUg5a2X5q6177yM5aaC5p6c5rKh5pyJIGZpbGVJRCDliJnooajnpLrlpLHotKVcbiAgICAgIGlmICghcmVzdWx0LmZpbGVJRCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgIGNvZGU6IEVSUk9SUy5PUEVSQVRJT05fRkFJTCxcbiAgICAgICAgICBtc2c6IGBbJHtDT01QT05FTlRfTkFNRX0udXBkYXRlXSBubyBmaWxlSUQgcmV0dXJuZWRgLFxuICAgICAgICB9KSwpXG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICBpZDogcmVzdWx0LmZpbGVJRCxcbiAgICAgICAgICBwYXRoLFxuICAgICAgICAgIGZ1bGxQYXRoOiBwYXRoLFxuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogbnVsbCxcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICBpZiAodGhpcy5zaG91bGRUaHJvd09uRXJyb3IpIHRocm93IGVycm9yXG4gICAgICBpZiAoaXNTdG9yYWdlRXJyb3IoZXJyb3IpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZGF0YTogbnVsbCxcbiAgICAgICAgICBlcnJvcixcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG4gIH1cblxuICBhc3luYyB1cGxvYWRUb1NpZ25lZFVybChcbiAgICBwYXRoOiBzdHJpbmcsXG4gICAgX3Rva2VuOiBzdHJpbmcsXG4gICAgZmlsZUJvZHk6IEZpbGVCb2R5LFxuICAgIGZpbGVPcHRpb25zPzogRmlsZU9wdGlvbnMsXG4gICk6IFByb21pc2U8XG4gICAgeyBkYXRhOiB7IGlkOiBzdHJpbmc7IHBhdGg6IHN0cmluZzsgZnVsbFBhdGg6IHN0cmluZyB9OyBlcnJvcjogbnVsbCB9IHwgeyBkYXRhOiBudWxsOyBlcnJvcjogU3RvcmFnZUVycm9yIH1cbiAgICA+IHtcbiAgICByZXR1cm4gdGhpcy51cGxvYWQocGF0aCwgZmlsZUJvZHksIGZpbGVPcHRpb25zKVxuICB9XG5cbiAgYXN5bmMgY3JlYXRlU2lnbmVkVXBsb2FkVXJsKHBhdGg6IHN0cmluZyk6IFByb21pc2U8XG4gIHwge1xuICAgIGRhdGE6IHtcbiAgICAgIHNpZ25lZFVybDogc3RyaW5nXG4gICAgICB0b2tlbjogc3RyaW5nXG4gICAgICBwYXRoOiBzdHJpbmdcbiAgICAgIC8vIENsb3VkQmFzZSDpop3lpJbnmoTlhYPmlbDmja7lrZfmrrVcbiAgICAgIGF1dGhvcml6YXRpb24/OiBzdHJpbmdcbiAgICAgIGlkPzogc3RyaW5nXG4gICAgICBjb3NGaWxlSWQ/OiBzdHJpbmdcbiAgICAgIGRvd25sb2FkVXJsPzogc3RyaW5nXG4gICAgfVxuICAgIGVycm9yOiBudWxsXG4gIH1cbiAgfCB7IGRhdGE6IG51bGw7IGVycm9yOiBTdG9yYWdlRXJyb3IgfVxuICA+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY2xvdWRQYXRoID0gdGhpcy5fZ2V0Q2xvdWRQYXRoKHBhdGgpXG5cbiAgICAgIGNvbnN0IHsgZGF0YTogbWV0YWRhdGEgfSA9IGF3YWl0IHRoaXMuZ2V0VXBsb2FkTWV0YWRhdGEoeyBjbG91ZFBhdGggfSlcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGF0YToge1xuICAgICAgICAgIHNpZ25lZFVybDogbWV0YWRhdGEudXJsLFxuICAgICAgICAgIHRva2VuOiBtZXRhZGF0YS50b2tlbixcbiAgICAgICAgICBwYXRoLFxuICAgICAgICAgIC8vIOi/lOWbniBDbG91ZEJhc2Ug55qE6aKd5aSW5YWD5pWw5o2u77yM5L6bIHVwbG9hZFRvU2lnbmVkVXJsIOS9v+eUqFxuICAgICAgICAgIGF1dGhvcml6YXRpb246IG1ldGFkYXRhLmF1dGhvcml6YXRpb24sXG4gICAgICAgICAgaWQ6IG1ldGFkYXRhLmZpbGVJZCxcbiAgICAgICAgICBjb3NGaWxlSWQ6IG1ldGFkYXRhLmNvc0ZpbGVJZCxcbiAgICAgICAgICBkb3dubG9hZFVybDogbWV0YWRhdGEuZG93bmxvYWRfdXJsLFxuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogbnVsbCxcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICBpZiAodGhpcy5zaG91bGRUaHJvd09uRXJyb3IpIHRocm93IGVycm9yXG4gICAgICByZXR1cm4ge1xuICAgICAgICBkYXRhOiBudWxsLFxuICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBTdG9yYWdlRXJyb3IgPyBlcnJvciA6IG5ldyBTdG9yYWdlRXJyb3IoZXJyb3IubWVzc2FnZSksXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgdXBkYXRlKFxuICAgIHBhdGg6IHN0cmluZyxcbiAgICBmaWxlQm9keTogRmlsZUJvZHksXG4gICAgZmlsZU9wdGlvbnM/OiBGaWxlT3B0aW9ucyxcbiAgKTogUHJvbWlzZTxcbiAgICB7IGRhdGE6IHsgaWQ6IHN0cmluZzsgcGF0aDogc3RyaW5nOyBmdWxsUGF0aDogc3RyaW5nIH07IGVycm9yOiBudWxsIH0gfCB7IGRhdGE6IG51bGw7IGVycm9yOiBTdG9yYWdlRXJyb3IgfVxuICAgID4ge1xuICAgIHJldHVybiB0aGlzLnVwbG9hZChwYXRoLCBmaWxlQm9keSwgeyAuLi5maWxlT3B0aW9ucywgdXBzZXJ0OiB0cnVlIH0pXG4gIH1cblxuICBhc3luYyBtb3ZlKFxuICAgIGZyb21QYXRoOiBzdHJpbmcsXG4gICAgdG9QYXRoOiBzdHJpbmcsXG4gICAgLy8gb3B0aW9ucz86IERlc3RpbmF0aW9uT3B0aW9ucyxcbiAgKTogUHJvbWlzZTx7IGRhdGE6IHsgbWVzc2FnZTogc3RyaW5nIH07IGVycm9yOiBudWxsIH0gfCB7IGRhdGE6IG51bGw7IGVycm9yOiBTdG9yYWdlRXJyb3IgfT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmNvcHlGaWxlKHtcbiAgICAgICAgZmlsZUxpc3Q6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBzcmNQYXRoOiB0aGlzLl9nZXRDbG91ZFBhdGgoZnJvbVBhdGgpLFxuICAgICAgICAgICAgZHN0UGF0aDogdGhpcy5fZ2V0Q2xvdWRQYXRoKHRvUGF0aCksXG4gICAgICAgICAgICBvdmVyd3JpdGU6IHRydWUsXG4gICAgICAgICAgICByZW1vdmVPcmlnaW5hbDogdHJ1ZSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSlcblxuICAgICAgaWYgKHJlc3VsdC5maWxlTGlzdFswXS5jb2RlICYmIHJlc3VsdC5maWxlTGlzdFswXS5jb2RlICE9PSAnU1VDQ0VTUycpIHtcbiAgICAgICAgdGhyb3cgbmV3IFN0b3JhZ2VFcnJvcihyZXN1bHQuZmlsZUxpc3RbMF0ubWVzc2FnZSB8fCAnTW92ZSBmYWlsZWQnKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBkYXRhOiB7IG1lc3NhZ2U6IGBGaWxlIG1vdmVkIGZyb20gJHtmcm9tUGF0aH0gdG8gJHt0b1BhdGh9YCB9LFxuICAgICAgICBlcnJvcjogbnVsbCxcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICBpZiAodGhpcy5zaG91bGRUaHJvd09uRXJyb3IpIHRocm93IGVycm9yXG4gICAgICBpZiAoaXNTdG9yYWdlRXJyb3IoZXJyb3IpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZGF0YTogbnVsbCxcbiAgICAgICAgICBlcnJvcixcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG4gIH1cblxuICBhc3luYyBjb3B5KFxuICAgIGZyb21QYXRoOiBzdHJpbmcsXG4gICAgdG9QYXRoOiBzdHJpbmcsXG4gICAgLy8gb3B0aW9ucz86IERlc3RpbmF0aW9uT3B0aW9ucyxcbiAgKTogUHJvbWlzZTx7IGRhdGE6IHsgcGF0aDogc3RyaW5nIH07IGVycm9yOiBudWxsIH0gfCB7IGRhdGE6IG51bGw7IGVycm9yOiBTdG9yYWdlRXJyb3IgfT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmNvcHlGaWxlKHtcbiAgICAgICAgZmlsZUxpc3Q6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBzcmNQYXRoOiB0aGlzLl9nZXRDbG91ZFBhdGgoZnJvbVBhdGgpLFxuICAgICAgICAgICAgZHN0UGF0aDogdGhpcy5fZ2V0Q2xvdWRQYXRoKHRvUGF0aCksXG4gICAgICAgICAgICBvdmVyd3JpdGU6IHRydWUsXG4gICAgICAgICAgICByZW1vdmVPcmlnaW5hbDogZmFsc2UsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0pXG5cbiAgICAgIGlmIChyZXN1bHQuZmlsZUxpc3RbMF0uY29kZSAmJiByZXN1bHQuZmlsZUxpc3RbMF0uY29kZSAhPT0gJ1NVQ0NFU1MnKSB7XG4gICAgICAgIHRocm93IG5ldyBTdG9yYWdlRXJyb3IocmVzdWx0LmZpbGVMaXN0WzBdLm1lc3NhZ2UgfHwgJ0NvcHkgZmFpbGVkJylcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGF0YTogeyBwYXRoOiB0aGlzLl9nZXRDbG91ZFBhdGgodG9QYXRoKSB9LFxuICAgICAgICBlcnJvcjogbnVsbCxcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICBpZiAodGhpcy5zaG91bGRUaHJvd09uRXJyb3IpIHRocm93IGVycm9yXG4gICAgICBpZiAoaXNTdG9yYWdlRXJyb3IoZXJyb3IpKSB7XG4gICAgICAgIHJldHVybiB7IGRhdGE6IG51bGwsIGVycm9yIH1cbiAgICAgIH1cbiAgICAgIHRocm93IGVycm9yXG4gICAgfVxuICB9XG5cbiAgYXN5bmMgY3JlYXRlU2lnbmVkVXJsKFxuICAgIHBhdGg6IHN0cmluZyxcbiAgICBleHBpcmVzSW46IG51bWJlcixcbiAgICBvcHRpb25zPzoge1xuICAgICAgZG93bmxvYWQ/OiBzdHJpbmcgfCBib29sZWFuXG4gICAgICB0cmFuc2Zvcm0/OiBUcmFuc2Zvcm1PcHRpb25zXG4gICAgfSxcbiAgKTogUHJvbWlzZTx7IGRhdGE6IHsgc2lnbmVkVXJsOiBzdHJpbmcgfTsgZXJyb3I6IG51bGwgfSB8IHsgZGF0YTogbnVsbDsgZXJyb3I6IFN0b3JhZ2VFcnJvciB9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNsb3VkUGF0aCA9IHRoaXMuX25vcm1hbGl6ZUNsb3VkSWQocGF0aClcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZ2V0VGVtcEZpbGVVUkwoe1xuICAgICAgICBmaWxlTGlzdDogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGZpbGVJRDogY2xvdWRQYXRoLFxuICAgICAgICAgICAgbWF4QWdlOiBleHBpcmVzSW4sXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0pXG5cbiAgICAgIC8vIElHZXRGaWxlVXJsSXRlbSDmnIkgY29kZSDlrZfmrrXkvYbmsqHmnIkgbWVzc2FnZSDlrZfmrrVcbiAgICAgIGlmIChyZXN1bHQuZmlsZUxpc3RbMF0uY29kZSAhPT0gJ1NVQ0NFU1MnKSB7XG4gICAgICAgIHRocm93IG5ldyBTdG9yYWdlRXJyb3IoYEZhaWxlZCB0byBjcmVhdGUgc2lnbmVkIFVSTDogWyR7cmVzdWx0LmZpbGVMaXN0WzBdLmNvZGV9XSAke3Jlc3VsdC5maWxlTGlzdFswXS5maWxlSUR9YClcbiAgICAgIH1cblxuICAgICAgbGV0IHNpZ25lZFVybCA9IHJlc3VsdC5maWxlTGlzdFswXS5kb3dubG9hZF91cmxcblxuICAgICAgLy8g5p6E5bu65p+l6K+i5Y+C5pWwXG4gICAgICBjb25zdCBxdWVyeVBhcmFtczogc3RyaW5nW10gPSBbXVxuXG4gICAgICAvLyDlpoLmnpzmnIkgZG93bmxvYWQg5Y+C5pWw77yM5re75Yqg5YiwIFVSTCDkuK1cbiAgICAgIGlmIChvcHRpb25zPy5kb3dubG9hZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5kb3dubG9hZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAvLyBkb3dubG9hZCDmmK/mlofku7blkI1cbiAgICAgICAgICBxdWVyeVBhcmFtcy5wdXNoKGBkb3dubG9hZD0ke2VuY29kZVVSSUNvbXBvbmVudChvcHRpb25zLmRvd25sb2FkKX1gKVxuICAgICAgICB9IGVsc2UgaWYgKG9wdGlvbnMuZG93bmxvYWQgPT09IHRydWUpIHtcbiAgICAgICAgICAvLyBkb3dubG9hZCDmmK8gdHJ1Ze+8jOS9v+eUqOWOn+aWh+S7tuWQjeaIlum7mOiupOWAvFxuICAgICAgICAgIHF1ZXJ5UGFyYW1zLnB1c2goJ2Rvd25sb2FkPXRydWUnKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIOWmguaenOacieWbvueJh+i9rOaNouWPguaVsO+8jOa3u+WKoOWIsCBVUkwg5LitXG4gICAgICBpZiAob3B0aW9ucz8udHJhbnNmb3JtKSB7XG4gICAgICAgIGNvbnN0IHRyYW5zZm9ybVF1ZXJ5ID0gdGhpcy5fdHJhbnNmb3JtT3B0c1RvUXVlcnlTdHJpbmcob3B0aW9ucy50cmFuc2Zvcm0pXG4gICAgICAgIGlmICh0cmFuc2Zvcm1RdWVyeSkge1xuICAgICAgICAgIHF1ZXJ5UGFyYW1zLnB1c2godHJhbnNmb3JtUXVlcnkpXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8g5ou85o6l5omA5pyJ5p+l6K+i5Y+C5pWwXG4gICAgICBpZiAocXVlcnlQYXJhbXMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBzZXBhcmF0b3IgPSBzaWduZWRVcmwuaW5jbHVkZXMoJz8nKSA/ICcmJyA6ICc/J1xuICAgICAgICBzaWduZWRVcmwgPSBgJHtzaWduZWRVcmx9JHtzZXBhcmF0b3J9JHtxdWVyeVBhcmFtcy5qb2luKCcmJyl9YFxuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBkYXRhOiB7IHNpZ25lZFVybCB9LFxuICAgICAgICBlcnJvcjogbnVsbCxcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICBpZiAodGhpcy5zaG91bGRUaHJvd09uRXJyb3IpIHRocm93IGVycm9yXG4gICAgICBpZiAoaXNTdG9yYWdlRXJyb3IoZXJyb3IpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZGF0YTogbnVsbCxcbiAgICAgICAgICBlcnJvcixcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG4gIH1cblxuICBhc3luYyBjcmVhdGVTaWduZWRVcmxzKFxuICAgIHBhdGhzOiBzdHJpbmdbXSxcbiAgICBleHBpcmVzSW46IG51bWJlcixcbiAgICAvLyBvcHRpb25zPzoge1xuICAgIC8vICAgZG93bmxvYWQ/OiBzdHJpbmcgfCBib29sZWFuXG4gICAgLy8gfSxcbiAgKTogUHJvbWlzZTxcbiAgICB8IHsgZGF0YTogQXJyYXk8eyBwYXRoOiBzdHJpbmc7IHNpZ25lZFVybDogc3RyaW5nOyBlcnJvcjogc3RyaW5nIHwgbnVsbCB9PjsgZXJyb3I6IG51bGwgfVxuICAgIHwgeyBkYXRhOiBudWxsOyBlcnJvcjogU3RvcmFnZUVycm9yIH1cbiAgICA+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZmlsZUxpc3QgPSBwYXRocy5tYXAocCA9PiAoe1xuICAgICAgICBmaWxlSUQ6IHRoaXMuX25vcm1hbGl6ZUNsb3VkSWQocCksXG4gICAgICAgIG1heEFnZTogZXhwaXJlc0luLFxuICAgICAgfSkpXG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZ2V0VGVtcEZpbGVVUkwoeyBmaWxlTGlzdCB9KVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBkYXRhOiByZXN1bHQuZmlsZUxpc3QubWFwKChpdGVtOiBhbnksIGluZGV4OiBudW1iZXIpID0+ICh7XG4gICAgICAgICAgcGF0aDogcGF0aHNbaW5kZXhdLFxuICAgICAgICAgIHNpZ25lZFVybDogaXRlbS50ZW1wRmlsZVVSTCB8fCAnJyxcbiAgICAgICAgICBlcnJvcjogaXRlbS5jb2RlID09PSAnU1VDQ0VTUycgPyBudWxsIDogaXRlbS5tZXNzYWdlLFxuICAgICAgICB9KSksXG4gICAgICAgIGVycm9yOiBudWxsLFxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgIGlmICh0aGlzLnNob3VsZFRocm93T25FcnJvcikgdGhyb3cgZXJyb3JcbiAgICAgIGlmIChpc1N0b3JhZ2VFcnJvcihlcnJvcikpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBkYXRhOiBudWxsLFxuICAgICAgICAgIGVycm9yLFxuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvclxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGRvd25sb2FkKFxuICAgIHBhdGg6IHN0cmluZyxcbiAgICBvcHRpb25zPzogVHJhbnNmb3JtT3B0aW9ucyxcbiAgKTogUHJvbWlzZTx7XG4gICAgICBkYXRhOiBCbG9iXG4gICAgICBlcnJvcjogU3RvcmFnZUVycm9yIHwgbnVsbFxuICAgIH0+IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGF0YTogYXdhaXQgKGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCBzaWduZWRVcmxSZXN1bHQgPSBhd2FpdCB0aGlzLmNyZWF0ZVNpZ25lZFVybChwYXRoLCA2MDAsIHsgdHJhbnNmb3JtOiBvcHRpb25zIH0pXG4gICAgICAgICAgaWYgKHNpZ25lZFVybFJlc3VsdC5lcnJvcikge1xuICAgICAgICAgICAgdGhyb3cgc2lnbmVkVXJsUmVzdWx0LmVycm9yXG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHRtcFVybCA9IGVuY29kZVVSSShzaWduZWRVcmxSZXN1bHQuZGF0YT8uc2lnbmVkVXJsKVxuXG4gICAgICAgICAgY29uc3QgeyBkYXRhIH0gPSBhd2FpdCAodGhpcyBhcyBhbnkpLnJlcXVlc3QucmVxQ2xhc3MuZ2V0KHtcbiAgICAgICAgICAgIHVybDogdG1wVXJsLFxuICAgICAgICAgICAgaGVhZGVyczoge30sIC8vIOS4i+i9vei1hOa6kOivt+axguS4jee7j+i/h3NlcnZpY2XvvIxoZWFkZXLmuIXnqbpcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogJ2Jsb2InLFxuICAgICAgICAgIH0pXG5cbiAgICAgICAgICBpZiAoIWRhdGEpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBTdG9yYWdlRXJyb3IoJ0Rvd25sb2FkIGZhaWxlZDogbm8gZmlsZSBjb250ZW50JylcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyDlsIYgQnVmZmVyIOi9rOaNouS4uiBVaW50OEFycmF5IOS7peWFvOWuuSBCbG9iXG4gICAgICAgICAgcmV0dXJuIG5ldyBCbG9iKFtkYXRhXSlcbiAgICAgICAgfSkoKSxcbiAgICAgICAgZXJyb3I6IG51bGwsXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgaWYgKHRoaXMuc2hvdWxkVGhyb3dPbkVycm9yKSB0aHJvdyBlcnJvclxuICAgICAgaWYgKGlzU3RvcmFnZUVycm9yKGVycm9yKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGRhdGE6IG51bGwsXG4gICAgICAgICAgZXJyb3IsXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRocm93IGVycm9yXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPluaWh+S7tuS/oeaBr1xuICAgKlxuICAgKiBAcGFyYW0gcGF0aE9yRmlsZUlkIC0g55u45a+56Lev5b6E77yI5aaCICdpbWFnZXMvcGhvdG8uanBnJ++8ieaIliBDbG91ZEJhc2UgZmlsZUlE77yI5LulICdjbG91ZDovLycg5byA5aS077yJXG4gICAqIEByZXR1cm5zIOaWh+S7tuS/oeaBr+WvueixoVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIC8vIOS9v+eUqOebuOWvuei3r+W+hFxuICAgKiBjb25zdCB7IGRhdGEgfSA9IGF3YWl0IGJ1Y2tldC5pbmZvKCdpbWFnZXMvcGhvdG8uanBnJylcbiAgICpcbiAgICogLy8g5L2/55SoIENsb3VkQmFzZSBmaWxlSURcbiAgICogY29uc3QgeyBkYXRhIH0gPSBhd2FpdCBidWNrZXQuaW5mbygnY2xvdWQ6Ly9lbnYtaWQueHh4eC14eHh4L2ltYWdlcy9waG90by5qcGcnKVxuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGluZm8ocGF0aE9yRmlsZUlkOiBzdHJpbmcsKTogUHJvbWlzZTx7IGRhdGE6IENhbWVsaXplPEZpbGVPYmplY3RWMj47IGVycm9yOiBudWxsIH0gfCB7IGRhdGE6IG51bGw7IGVycm9yOiBTdG9yYWdlRXJyb3IgfT4ge1xuICAgIHRyeSB7XG4gICAgICAvLyDliKTmlq3mmK8gZmlsZUlEIOi/mOaYr+ebuOWvuei3r+W+hFxuICAgICAgY29uc3QgaXNGaWxlSWQgPSBwYXRoT3JGaWxlSWQuc3RhcnRzV2l0aCgnY2xvdWQ6Ly8nKVxuICAgICAgY29uc3QgZGlzcGxheU5hbWUgPSBpc0ZpbGVJZCA/IHRoaXMuX2V4dHJhY3RQYXRoRnJvbUZpbGVJZChwYXRoT3JGaWxlSWQpIDogcGF0aE9yRmlsZUlkXG4gICAgICBjb25zdCBidWNrZXRJZCA9IGlzRmlsZUlkID8gdGhpcy5fZXh0cmFjdEJ1Y2tldEZyb21GaWxlSWQocGF0aE9yRmlsZUlkKSA6IHRoaXMuYnVja2V0SWRcblxuICAgICAgY29uc3QgZmlsZUluZm8gPSBhd2FpdCB0aGlzLmdldEZpbGVJbmZvKHtcbiAgICAgICAgZmlsZUxpc3Q6IFt0aGlzLl9ub3JtYWxpemVDbG91ZElkKHBhdGhPckZpbGVJZCldLFxuICAgICAgfSlcblxuICAgICAgY29uc3QgaXRlbSA9IGZpbGVJbmZvLmZpbGVMaXN0WzBdXG5cbiAgICAgIGlmIChpdGVtLmNvZGUgIT09ICdTVUNDRVNTJykge1xuICAgICAgICB0aHJvdyBuZXcgU3RvcmFnZUVycm9yKGl0ZW0ubWVzc2FnZSlcbiAgICAgIH1cblxuICAgICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpXG4gICAgICBjb25zdCBsYXN0TW9kaWZpZWQgPSAoaXRlbS5sYXN0TW9kaWZpZWQgPyBuZXcgRGF0ZShpdGVtLmxhc3RNb2RpZmllZCkgOiBuZXcgRGF0ZSgpKS50b0lTT1N0cmluZygpXG4gICAgICByZXR1cm4ge1xuICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgaWQ6IGl0ZW0uZmlsZUlELFxuICAgICAgICAgIHZlcnNpb246ICcxJyxcbiAgICAgICAgICBuYW1lOiBkaXNwbGF5TmFtZSxcbiAgICAgICAgICBidWNrZXRJZCxcbiAgICAgICAgICB1cGRhdGVkQXQ6IGxhc3RNb2RpZmllZCxcbiAgICAgICAgICBjcmVhdGVkQXQ6IGxhc3RNb2RpZmllZCxcbiAgICAgICAgICBsYXN0QWNjZXNzZWRBdDogbm93LFxuICAgICAgICAgIHNpemU6IGl0ZW0uc2l6ZSxcbiAgICAgICAgICBjYWNoZUNvbnRyb2w6IGl0ZW0uY2FjaGVDb250cm9sLFxuICAgICAgICAgIGNvbnRlbnRUeXBlOiBpdGVtLmNvbnRlbnRUeXBlLFxuICAgICAgICAgIGV0YWc6IGl0ZW0uZXRhZyxcbiAgICAgICAgICBsYXN0TW9kaWZpZWQsXG4gICAgICAgICAgbWV0YWRhdGE6IHt9LFxuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogbnVsbCxcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICBpZiAodGhpcy5zaG91bGRUaHJvd09uRXJyb3IpIHRocm93IGVycm9yXG4gICAgICByZXR1cm4ge1xuICAgICAgICBkYXRhOiBudWxsLFxuICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBTdG9yYWdlRXJyb3IgPyBlcnJvciA6IG5ldyBTdG9yYWdlRXJyb3IoZXJyb3IubWVzc2FnZSksXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZXhpc3RzKHBhdGhPckZpbGVJZDogc3RyaW5nKTogUHJvbWlzZTx7IGRhdGE6IGJvb2xlYW47IGVycm9yOiBudWxsIH0gfCB7IGRhdGE6IG51bGw7IGVycm9yOiBTdG9yYWdlRXJyb3IgfT4ge1xuICAgIHRyeSB7XG4gICAgICAvLyDliKTmlq3mmK8gZmlsZUlEIOi/mOaYr+ebuOWvuei3r+W+hFxuICAgICAgY29uc3QgZmlsZUluZm8gPSBhd2FpdCB0aGlzLmdldEZpbGVJbmZvKHtcbiAgICAgICAgZmlsZUxpc3Q6IFt0aGlzLl9ub3JtYWxpemVDbG91ZElkKHBhdGhPckZpbGVJZCldLFxuICAgICAgfSlcblxuICAgICAgY29uc3QgaXRlbSA9IGZpbGVJbmZvLmZpbGVMaXN0WzBdXG5cbiAgICAgIGlmIChpdGVtLmNvZGUgPT09ICdGSUxFX05PVF9GT1VORCcpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBkYXRhOiBmYWxzZSxcbiAgICAgICAgICBlcnJvcjogbnVsbCxcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoaXRlbS5jb2RlICE9PSAnU1VDQ0VTUycpIHtcbiAgICAgICAgdGhyb3cgbmV3IFN0b3JhZ2VFcnJvcihpdGVtLm1lc3NhZ2UpXG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7IGRhdGE6IHRydWUsIGVycm9yOiBudWxsIH1cbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICBpZiAodGhpcy5zaG91bGRUaHJvd09uRXJyb3IpIHRocm93IGVycm9yXG4gICAgICB0aHJvdyBlcnJvclxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGdldFB1YmxpY1VybChcbiAgICBwYXRoOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IHtcbiAgICAgIGRvd25sb2FkPzogc3RyaW5nIHwgYm9vbGVhblxuICAgICAgdHJhbnNmb3JtPzogVHJhbnNmb3JtT3B0aW9uc1xuICAgIH0sXG4gICk6IFByb21pc2U8XG4gICAgfCB7XG4gICAgICBkYXRhOiB7IHB1YmxpY1VybDogc3RyaW5nIH1cbiAgICB9XG4gICAgfCB7IGRhdGE6IG51bGw7IGVycm9yOiBTdG9yYWdlRXJyb3IgfVxuICAgID4ge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuY3JlYXRlU2lnbmVkVXJsKHBhdGgsIDYwMCwgb3B0aW9ucylcblxuICAgIGlmIChyZXMuZGF0YSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGF0YTogeyBwdWJsaWNVcmw6IHJlcy5kYXRhLnNpZ25lZFVybCB9LFxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7IGRhdGE6IG51bGwsIGVycm9yOiByZXMuZXJyb3IgYXMgU3RvcmFnZUVycm9yIH1cbiAgfVxuXG4gIGFzeW5jIHJlbW92ZShwYXRoczogc3RyaW5nW10pOiBQcm9taXNlPHsgZGF0YTogRmlsZU9iamVjdFtdOyBlcnJvcjogbnVsbCB9IHwgeyBkYXRhOiBudWxsOyBlcnJvcjogU3RvcmFnZUVycm9yIH0+IHtcbiAgICB0cnkge1xuICAgICAgLy8g5YiG57uE6I635Y+W5paH5Lu25L+h5oGv77yM5q+P57uE5pyA5aSaMTDkuKpcbiAgICAgIGNvbnN0IGNodW5rU2l6ZSA9IDEwXG4gICAgICBjb25zdCBwYXRoQ2h1bmtzOiBzdHJpbmdbXVtdID0gW11cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0aHMubGVuZ3RoOyBpICs9IGNodW5rU2l6ZSkge1xuICAgICAgICBwYXRoQ2h1bmtzLnB1c2gocGF0aHMuc2xpY2UoaSwgaSArIGNodW5rU2l6ZSkpXG4gICAgICB9XG5cbiAgICAgIC8vIOW5tuihjOiOt+WPluaJgOacieWIhue7hOeahOaWh+S7tuS/oeaBr1xuICAgICAgY29uc3QgZmlsZUluZm9SZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwocGF0aENodW5rcy5tYXAoY2h1bmsgPT4gUHJvbWlzZS5hbGwoY2h1bmsubWFwKHBhdGggPT4gdGhpcy5pbmZvKHBhdGgpKSkpLClcblxuICAgICAgLy8g5ZCI5bm25omA5pyJ5paH5Lu25L+h5oGv5bm25p6E5bu65pig5bCE6KGo77yIcGF0aCAtPiBmaWxlSW5mb++8iVxuICAgICAgY29uc3QgZmlsZUluZm9NYXAgPSBuZXcgTWFwPHN0cmluZywgQ2FtZWxpemU8RmlsZU9iamVjdFYyPj4oKVxuICAgICAgZmlsZUluZm9SZXN1bHRzLmZsYXQoKS5mb3JFYWNoKChyZXN1bHQsIGluZGV4KSA9PiB7XG4gICAgICAgIGlmIChyZXN1bHQuZGF0YSkge1xuICAgICAgICAgIGZpbGVJbmZvTWFwLnNldChwYXRoc1tNYXRoLmZsb29yKGluZGV4IC8gY2h1bmtTaXplKSAqIGNodW5rU2l6ZSArIChpbmRleCAlIGNodW5rU2l6ZSldLCByZXN1bHQuZGF0YSlcbiAgICAgICAgfVxuICAgICAgfSlcblxuICAgICAgLy8g5omn6KGM5Yig6Zmk5pON5L2cXG4gICAgICBjb25zdCBmaWxlTGlzdCA9IHBhdGhzLm1hcChwID0+IHRoaXMuX25vcm1hbGl6ZUNsb3VkSWQocCkpXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmRlbGV0ZUZpbGUoeyBmaWxlTGlzdCB9KVxuXG4gICAgICAvLyBJRGVsZXRlRmlsZVJlcyDnmoQgZmlsZUxpc3Qg5pWw57uE5Lit5q+P5Liq6aG55pyJIGNvZGUg5a2X5q61XG4gICAgICBjb25zdCBmYWlsZWRGaWxlcyA9IHJlc3VsdC5maWxlTGlzdC5maWx0ZXIoaXRlbSA9PiBpdGVtLmNvZGUgIT09ICdTVUNDRVNTJylcbiAgICAgIGlmIChmYWlsZWRGaWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRocm93IG5ldyBTdG9yYWdlRXJyb3IoYERlbGV0ZSBmYWlsZWQgZm9yICR7ZmFpbGVkRmlsZXMubGVuZ3RofSBmaWxlKHMpYClcbiAgICAgIH1cblxuICAgICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpXG5cbiAgICAgIC8vIOS9v+eUqOiOt+WPluWIsOeahOaWh+S7tuS/oeaBr+aehOW7uui/lOWbnuaVsOaNrlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGF0YTogcGF0aHMubWFwKChwKSA9PiB7XG4gICAgICAgICAgY29uc3QgaW5mbyA9IGZpbGVJbmZvTWFwLmdldChwKVxuXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5hbWU6IGluZm8/Lm5hbWUsXG4gICAgICAgICAgICBpZDogaW5mbz8uaWQsXG4gICAgICAgICAgICBidWNrZXRfaWQ6IGluZm8/LmJ1Y2tldElkLFxuICAgICAgICAgICAgb3duZXI6IHVuZGVmaW5lZCwgLy8g5peg5rOV6K6h566Xb3duZXJcbiAgICAgICAgICAgIHVwZGF0ZWRfYXQ6IGluZm8/LnVwZGF0ZWRBdCB8fCBub3csXG4gICAgICAgICAgICBjcmVhdGVkX2F0OiBpbmZvPy5jcmVhdGVkQXQsXG4gICAgICAgICAgICBsYXN0X2FjY2Vzc2VkX2F0OiBpbmZvPy5sYXN0QWNjZXNzZWRBdCB8fCBub3csXG4gICAgICAgICAgICBtZXRhZGF0YTogaW5mbz8ubWV0YWRhdGEgfHwge30sXG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIFRPRE86IOiOt+WPluihpeWFqCBCdWNrZXQg5L+h5oGvXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGJ1Y2tldHM6IHtcbiAgICAgICAgICAgICAgaWQ6IGluZm8/LmJ1Y2tldElkLFxuICAgICAgICAgICAgICBuYW1lOiBpbmZvPy5idWNrZXRJZCxcbiAgICAgICAgICAgICAgb3duZXI6IHVuZGVmaW5lZCwgLy8g5peg5rOV6K6h566Xb3duZXJcbiAgICAgICAgICAgICAgcHVibGljOiBmYWxzZSwgLy8g5pyq55+lXG4gICAgICAgICAgICAgIGNyZWF0ZWRfYXQ6ICcnLCAvLyDmnKrnn6VcbiAgICAgICAgICAgICAgdXBkYXRlZF9hdDogbm93LCAvLyDmnKrnn6VcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfVxuICAgICAgICB9KSxcbiAgICAgICAgZXJyb3I6IG51bGwsXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgaWYgKHRoaXMuc2hvdWxkVGhyb3dPbkVycm9yKSB0aHJvdyBlcnJvclxuICAgICAgaWYgKGlzU3RvcmFnZUVycm9yKGVycm9yKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGRhdGE6IG51bGwsXG4gICAgICAgICAgZXJyb3IsXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRocm93IGVycm9yXG4gICAgfVxuICB9XG5cbiAgYXN5bmMgbGlzdCgpIHtcbiAgICB0aHJvdyBuZXcgU3RvcmFnZUVycm9yKCdOb3QgaW1wbGVtZW50ZWQnKVxuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0Q2xvdWRQYXRoKHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgLy8g5riF55CG6Lev5b6E77ya56e76Zmk6aaW5bC+5pac5p2g77yM5ZCI5bm25aSa5Liq5pac5p2gXG4gICAgY29uc3QgY2xlYW5QYXRoID0gcGF0aC5yZXBsYWNlKC9eXFwvfFxcLyQvZywgJycpLnJlcGxhY2UoL1xcLysvZywgJy8nKVxuXG4gICAgLy8g5ZCm5YiZ6L+U5Zue5riF55CG5ZCO55qE55u45a+56Lev5b6EXG4gICAgcmV0dXJuIGNsZWFuUGF0aFxuICB9XG5cbiAgcHJpdmF0ZSBfbm9ybWFsaXplQ2xvdWRJZChwYXRoOiBzdHJpbmcpIHtcbiAgICAvLyDlpoLmnpzlt7Lnu4/mmK8gY2xvdWQ6Ly8g5qC85byP77yM55u05o6l6L+U5ZueXG4gICAgaWYgKC9eY2xvdWQ6XFwvXFwvLy50ZXN0KHBhdGgpKSB7XG4gICAgICByZXR1cm4gcGF0aFxuICAgIH1cbiAgICBjb25zdCBjbGVhblBhdGggPSB0aGlzLl9nZXRDbG91ZFBhdGgocGF0aClcblxuICAgIC8vIOWmguaenOiuvue9ruS6hiBidWNrZXRJZO+8jOaehOW7uuWujOaVtOeahCBjbG91ZDovLyDot6/lvoRcbiAgICBpZiAodGhpcy5idWNrZXRJZCkge1xuICAgICAgLy8g6I635Y+W546v5aKDIElEXG4gICAgICBjb25zdCBlbnZJZCA9IHRoaXMuY29uZmlnPy5lbnYgfHwgJydcbiAgICAgIGlmIChlbnZJZCkge1xuICAgICAgICByZXR1cm4gYGNsb3VkOi8vJHtlbnZJZH0uJHt0aGlzLmJ1Y2tldElkfS8ke2NsZWFuUGF0aH1gXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBTdG9yYWdlRXJyb3IoJ2J1Y2tldElkIGlzIG5vdCBzZXQnKVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdG9CYXNlNjQoZGF0YTogc3RyaW5nKSB7XG4gICAgaWYgKHR5cGVvZiBCdWZmZXIgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXR1cm4gQnVmZmVyLmZyb20oZGF0YSkudG9TdHJpbmcoJ2Jhc2U2NCcpXG4gICAgfVxuICAgIHJldHVybiBidG9hKGRhdGEpXG4gIH1cblxuICAvKipcbiAgICog5bCGIFRyYW5zZm9ybU9wdGlvbnMg6L2s5o2i5Li66IW+6K6v5LqR5pWw5o2u5LiH6LGh55qEIGltYWdlTW9ncjIg5p+l6K+i5a2X56ym5LiyXG4gICAqXG4gICAqIOiFvuiur+S6keaVsOaNruS4h+ixoeS9v+eUqCBpbWFnZU1vZ3IyIOaOpeWPo+i/m+ihjOWbvueJh+WkhOeQhu+8jOaUr+aMgeS7peS4i+WPguaVsO+8mlxuICAgKiAtIC90aHVtYm5haWwvPFdpZHRoPng8SGVpZ2h0PiAtIOe8qeaUvlxuICAgKiAtIC9mb3JtYXQvPEZvcm1hdD4gLSDmoLzlvI/ovazmjaJcbiAgICogLSAvcXVhbGl0eS88UXVhbGl0eT4gLSDotKjph4/osIPmlbRcbiAgICogLSAvcnF1YWxpdHkvPFF1YWxpdHk+IC0g55u45a+56LSo6YePXG4gICAqXG4gICAqIEBwYXJhbSB0cmFuc2Zvcm0gLSBTdXBhYmFzZSBUcmFuc2Zvcm1PcHRpb25zXG4gICAqIEByZXR1cm5zIOiFvuiur+S6keaVsOaNruS4h+ixoeeahOafpeivouWtl+espuS4slxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIF90cmFuc2Zvcm1PcHRzVG9RdWVyeVN0cmluZyh7IHdpZHRoOiAzMDAsIGhlaWdodDogMjAwLCBxdWFsaXR5OiA4MCwgZm9ybWF0OiAnb3JpZ2luJyB9KVxuICAgKiAvLyDov5Tlm546ICdpbWFnZU1vZ3IyL3RodW1ibmFpbC8zMDB4MjAwL3F1YWxpdHkvODAnXG4gICAqIGBgYFxuICAgKi9cbiAgcHJpdmF0ZSBfdHJhbnNmb3JtT3B0c1RvUXVlcnlTdHJpbmcodHJhbnNmb3JtOiBUcmFuc2Zvcm1PcHRpb25zKTogc3RyaW5nIHtcbiAgICBjb25zdCBwYXJhbXM6IHN0cmluZ1tdID0gWydpbWFnZU1vZ3IyJ11cblxuICAgIC8vIOWkhOeQhue8qeaUvuWPguaVsFxuICAgIGlmICh0cmFuc2Zvcm0ud2lkdGggfHwgdHJhbnNmb3JtLmhlaWdodCkge1xuICAgICAgY29uc3Qgd2lkdGggPSB0cmFuc2Zvcm0ud2lkdGggfHwgJydcbiAgICAgIGNvbnN0IGhlaWdodCA9IHRyYW5zZm9ybS5oZWlnaHQgfHwgJydcblxuICAgICAgLy8g5qC55o2uIHJlc2l6ZSDmqKHlvI/pgInmi6nkuI3lkIznmoTnvKnmlL7mlrnlvI9cbiAgICAgIGlmICh0cmFuc2Zvcm0ucmVzaXplID09PSAnZmlsbCcpIHtcbiAgICAgICAgLy8gZmlsbDog5by65Yi257yp5pS+5Yiw5oyH5a6a5bC65a+477yM5Y+v6IO95Y+Y5b2iXG4gICAgICAgIHBhcmFtcy5wdXNoKGB0aHVtYm5haWwvJHt3aWR0aH14JHtoZWlnaHR9IWApXG4gICAgICB9IGVsc2UgaWYgKHRyYW5zZm9ybS5yZXNpemUgPT09ICdjb250YWluJykge1xuICAgICAgICAvLyBjb250YWluOiDnrYnmr5TnvKnmlL7vvIzlrozmlbTmmL7npLrlnKjmjIflrprlsLrlr7jlhoVcbiAgICAgICAgcGFyYW1zLnB1c2goYHRodW1ibmFpbC8ke3dpZHRofXgke2hlaWdodH1gKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gY292ZXIgKOm7mOiupCk6IOetieavlOe8qeaUvu+8jOWhq+WFheaMh+WumuWwuuWvuO+8jOWPr+iDveijgeWJqlxuICAgICAgICAvLyDkvb/nlKggL3RodW1ibmFpbC88V2lkdGg+eDxIZWlnaHQ+XiDooajnpLrloavlhYXmqKHlvI9cbiAgICAgICAgcGFyYW1zLnB1c2goYHRodW1ibmFpbC8ke3dpZHRofXgke2hlaWdodH1eYClcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyDlpITnkIbmoLzlvI/ovazmjaJcbiAgICAvLyBmb3JtYXQ6ICdvcmlnaW4nIOihqOekuuS/neaMgeWOn+agvOW8j++8jOS4jeS8oOatpOWPguaVsFxuICAgIGlmICh0cmFuc2Zvcm0uZm9ybWF0ICYmIHRyYW5zZm9ybS5mb3JtYXQgIT09ICdvcmlnaW4nKSB7XG4gICAgICBwYXJhbXMucHVzaChgZm9ybWF0LyR7dHJhbnNmb3JtLmZvcm1hdH1gKVxuICAgIH1cblxuICAgIC8vIOWkhOeQhui0qOmHj+WPguaVsFxuICAgIGlmICh0cmFuc2Zvcm0ucXVhbGl0eSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyDohb7orq/kupHmlbDmja7kuIfosaHnmoQgcXVhbGl0eSDlj4LmlbDojIPlm7TmmK8gMS0xMDBcbiAgICAgIGNvbnN0IHF1YWxpdHkgPSBNYXRoLm1heCgxLCBNYXRoLm1pbigxMDAsIHRyYW5zZm9ybS5xdWFsaXR5KSlcbiAgICAgIHBhcmFtcy5wdXNoKGBxdWFsaXR5LyR7cXVhbGl0eX1gKVxuICAgIH1cblxuICAgIHJldHVybiBwYXJhbXMuam9pbignLycpXG4gIH1cblxuICAvKipcbiAgICog5LuOIENsb3VkQmFzZSBmaWxlSUQg5Lit5o+Q5Y+W5paH5Lu26Lev5b6EXG4gICAqXG4gICAqIEBwYXJhbSBmaWxlSWQgLSBDbG91ZEJhc2UgZmlsZUlEICjmoLzlvI86IGNsb3VkOi8vZW52LWlkLmJ1Y2tldC9wYXRoL3RvL2ZpbGUuanBnKVxuICAgKiBAcmV0dXJucyDmj5Dlj5bnmoTmlofku7bot6/lvoRcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBfZXh0cmFjdFBhdGhGcm9tRmlsZUlkKCdjbG91ZDovL3Rlc3QtZW52LnRlc3QtYnVja2V0L2ltYWdlcy9waG90by5qcGcnKVxuICAgKiAvLyDov5Tlm546ICdpbWFnZXMvcGhvdG8uanBnJ1xuICAgKlxuICAgKiBfZXh0cmFjdFBhdGhGcm9tRmlsZUlkKCdjbG91ZDovL3Rlc3QtZW52LnRlc3QtYnVja2V0L2ZpbGUudHh0JylcbiAgICogLy8g6L+U5ZueOiAnZmlsZS50eHQnXG4gICAqIGBgYFxuICAgKi9cbiAgcHJpdmF0ZSBfZXh0cmFjdFBhdGhGcm9tRmlsZUlkKGZpbGVJZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAvLyBmaWxlSUQg5qC85byPOiBjbG91ZDovL2Vudi1pZC5idWNrZXQvcGF0aC90by9maWxlLmpwZ1xuICAgIC8vIOmcgOimgeaPkOWPluesrOS4gOS4qiAvIOWQjumdoueahOaJgOacieWGheWuue+8iOWMheaLrCBidWNrZXQg5ZKM6Lev5b6E77yJXG4gICAgLy8g54S25ZCO5YaN5o+Q5Y+WIGJ1Y2tldCDlkI7pnaLnmoTot6/lvoTpg6jliIZcblxuICAgIC8vIOenu+mZpCBjbG91ZDovLyDliY3nvIBcbiAgICBjb25zdCB3aXRob3V0UHJvdG9jb2wgPSBmaWxlSWQucmVwbGFjZSgvXmNsb3VkOlxcL1xcLy8sICcnKVxuXG4gICAgLy8g5YiG5Ymy5Li6IFtlbnYtaWQuYnVja2V0LCBwYXRoLCB0bywgZmlsZS5qcGddXG4gICAgY29uc3QgcGFydHMgPSB3aXRob3V0UHJvdG9jb2wuc3BsaXQoJy8nKVxuXG4gICAgaWYgKHBhcnRzLmxlbmd0aCA8IDIpIHtcbiAgICAgIC8vIOWmguaenOaXoOazleino+aekO+8jOi/lOWbnuWujOaVtOeahCBmaWxlSURcbiAgICAgIHJldHVybiBmaWxlSWRcbiAgICB9XG5cbiAgICAvLyDnp7vpmaTnrKzkuIDpg6jliIbvvIhlbnYtaWQuYnVja2V077yJ77yM6L+U5Zue5Ymp5L2Z6Lev5b6EXG4gICAgcmV0dXJuIHBhcnRzLnNsaWNlKDEpLmpvaW4oJy8nKVxuICB9XG5cbiAgLyoqXG4gICAqIOS7jiBDbG91ZEJhc2UgZmlsZUlEIOS4reaPkOWPliBidWNrZXQg5ZCN56ewXG4gICAqXG4gICAqIEBwYXJhbSBmaWxlSWQgLSBDbG91ZEJhc2UgZmlsZUlEICjmoLzlvI86IGNsb3VkOi8vZW52LWlkLmJ1Y2tldC9wYXRoL3RvL2ZpbGUuanBnKVxuICAgKiBAcmV0dXJucyDmj5Dlj5bnmoQgYnVja2V0IOWQjeensFxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIF9leHRyYWN0QnVja2V0RnJvbUZpbGVJZCgnY2xvdWQ6Ly90ZXN0LWVudi50ZXN0LWJ1Y2tldC9pbWFnZXMvcGhvdG8uanBnJylcbiAgICogLy8g6L+U5ZueOiAndGVzdC1idWNrZXQnXG4gICAqXG4gICAqIF9leHRyYWN0QnVja2V0RnJvbUZpbGVJZCgnY2xvdWQ6Ly9wcm9kLWVudi5teS1idWNrZXQvZmlsZS50eHQnKVxuICAgKiAvLyDov5Tlm546ICdteS1idWNrZXQnXG4gICAqIGBgYFxuICAgKi9cbiAgcHJpdmF0ZSBfZXh0cmFjdEJ1Y2tldEZyb21GaWxlSWQoZmlsZUlkOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIC8vIGZpbGVJRCDmoLzlvI86IGNsb3VkOi8vZW52LWlkLmJ1Y2tldC9wYXRoL3RvL2ZpbGUuanBnXG4gICAgLy8g6ZyA6KaB5o+Q5Y+WIGVudi1pZC5idWNrZXQg5Lit55qEIGJ1Y2tldCDpg6jliIZcblxuICAgIC8vIOenu+mZpCBjbG91ZDovLyDliY3nvIBcbiAgICBjb25zdCB3aXRob3V0UHJvdG9jb2wgPSBmaWxlSWQucmVwbGFjZSgvXmNsb3VkOlxcL1xcLy8sICcnKVxuXG4gICAgLy8g5YiG5Ymy5Li6IFtlbnYtaWQuYnVja2V0LCBwYXRoLCB0bywgZmlsZS5qcGddXG4gICAgY29uc3QgcGFydHMgPSB3aXRob3V0UHJvdG9jb2wuc3BsaXQoJy8nKVxuXG4gICAgaWYgKHBhcnRzLmxlbmd0aCA8IDEpIHtcbiAgICAgIC8vIOWmguaenOaXoOazleino+aekO+8jOi/lOWbnum7mOiupCBidWNrZXRcbiAgICAgIHJldHVybiAnJ1xuICAgIH1cblxuICAgIC8vIOesrOS4gOmDqOWIhuaYryBlbnYtaWQuYnVja2V077yM5o+Q5Y+WIGJ1Y2tldCDpg6jliIZcbiAgICAvLyDmoLzlvI86IGVudi1pZC5idWNrZXQg5oiWIGVudi1pZC5idWNrZXQtbmFtZVxuICAgIGNvbnN0IGVudkFuZEJ1Y2tldCA9IHBhcnRzWzBdXG5cbiAgICAvLyDmn6Xmib7nrKzkuIDkuKrngrnnmoTkvY3nva5cbiAgICBjb25zdCBkb3RJbmRleCA9IGVudkFuZEJ1Y2tldC5pbmRleE9mKCcuJylcblxuICAgIGlmIChkb3RJbmRleCA9PT0gLTEpIHtcbiAgICAgIC8vIOWmguaenOayoeacieeCue+8jOi/lOWbnuaVtOS4quWtl+espuS4slxuICAgICAgcmV0dXJuIGVudkFuZEJ1Y2tldFxuICAgIH1cblxuICAgIC8vIOi/lOWbnueCueWQjumdoueahOmDqOWIhu+8iGJ1Y2tldCDlkI3np7DvvIlcbiAgICByZXR1cm4gZW52QW5kQnVja2V0LnN1YnN0cmluZyhkb3RJbmRleCArIDEpXG4gIH1cbn1cblxuY29uc3Qgc3VwYWJhc2VDb21wb25lbnQ6IElDbG91ZGJhc2VDb21wb25lbnQgPSB7XG4gIG5hbWU6IGAke0NPTVBPTkVOVF9OQU1FfS9zdXBhYmFzZWAsXG4gIElJRkU6IHRydWUsXG4gIGVudGl0eSgpIHtcbiAgICAvLyDlnKggSUlGRSDkuK3vvIx0aGlzIOaYryBDbG91ZGJhc2Ug57G777yI5p6E6YCg5Ye95pWw77yJ77yM5LiN5piv5a6e5L6LXG4gICAgLy8g5omA5Lul5oiR5Lus6ZyA6KaB5L2/55SoIGdldHRlciDmnaXlu7bov5/ojrflj5blrp7kvovnmoQgY29uZmlnIOWSjCByZXF1ZXN0XG5cbiAgICAvLyDkvb/nlKggV2Vha01hcCDnvJPlrZjmr4/kuKrlrp7kvovnmoQgc3RvcmFnZSDlr7nosaFcbiAgICBjb25zdCBzdG9yYWdlQ2FjaGUgPSBuZXcgV2Vha01hcDxhbnksIFN1cGFiYXNlRmlsZUFQSUxpa2VTdG9yYWdlPigpXG5cbiAgICAvLyDlrprkuYkgc3RvcmFnZSDlsZ7mgKfnmoQgZ2V0dGVy77yM5q+P5Liq5a6e5L6L5Y+q5Yib5bu65LiA5qyhXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMucHJvdG90eXBlLCAnc3RvcmFnZScsIHtcbiAgICAgIGdldCgpIHtcbiAgICAgICAgLy8g6L+Z6YeM55qEIHRoaXMg5pivIGNsb3VkYmFzZSDlrp7kvotcblxuICAgICAgICAvLyDlpoLmnpzlt7Lnu4/liJvlu7rov4fvvIznm7TmjqXov5Tlm57nvJPlrZjnmoTlrp7kvotcbiAgICAgICAgaWYgKHN0b3JhZ2VDYWNoZS5oYXModGhpcykpIHtcbiAgICAgICAgICByZXR1cm4gc3RvcmFnZUNhY2hlLmdldCh0aGlzKVxuICAgICAgICB9XG5cbiAgICAgICAgLy8g5Yib5bu65Yqo5oCBIGNvbnRleHTvvIzku47lvZPliY3lrp7kvovojrflj5YgY29uZmlnIOWSjCByZXF1ZXN0XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdGhpcy1hbGlhc1xuICAgICAgICBjb25zdCBpbnN0YW5jZSA9IHRoaXNcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9jb25zaXN0ZW50LXR5cGUtYXNzZXJ0aW9uc1xuICAgICAgICBjb25zdCBjb250ZXh0ID0gbmV3IFByb3h5PElDbG91ZGJhc2VDb250ZXh0Pih7fSBhcyBJQ2xvdWRiYXNlQ29udGV4dCwge1xuICAgICAgICAgIGdldDogKF90YXJnZXQsIHByb3ApID0+IHtcbiAgICAgICAgICAgIGlmIChwcm9wID09PSAnY29uZmlnJykge1xuICAgICAgICAgICAgICByZXR1cm4gaW5zdGFuY2UuY29uZmlnXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocHJvcCA9PT0gJ3JlcXVlc3QnKSB7XG4gICAgICAgICAgICAgIHJldHVybiBpbnN0YW5jZS5yZXF1ZXN0XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgICAgICAgfSxcbiAgICAgICAgfSlcblxuICAgICAgICAvLyDliJvlu7rmlrDnmoQgc3RvcmFnZSDlrp7kvovlubbnvJPlrZhcbiAgICAgICAgY29uc3Qgc3RvcmFnZSA9IG5ldyBTdXBhYmFzZUZpbGVBUElMaWtlU3RvcmFnZShjb250ZXh0KVxuICAgICAgICBzdG9yYWdlQ2FjaGUuc2V0KHRoaXMsIHN0b3JhZ2UpXG4gICAgICAgIHJldHVybiBzdG9yYWdlXG4gICAgICB9LFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICB9KVxuICB9LFxufVxuXG50cnkge1xuICBjbG91ZGJhc2UucmVnaXN0ZXJDb21wb25lbnQoY29tcG9uZW50KVxuICBjbG91ZGJhc2UucmVnaXN0ZXJDb21wb25lbnQoc3VwYWJhc2VDb21wb25lbnQpXG59IGNhdGNoIChlKSB7fVxuXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJTdG9yYWdlKGFwcDogUGljazxJQ2xvdWRiYXNlLCAncmVnaXN0ZXJDb21wb25lbnQnPikge1xuICB0cnkge1xuICAgIGFwcC5yZWdpc3RlckNvbXBvbmVudChjb21wb25lbnQpXG4gICAgYXBwLnJlZ2lzdGVyQ29tcG9uZW50KHN1cGFiYXNlQ29tcG9uZW50KVxuICB9IGNhdGNoIChlKSB7XG4gICAgY29uc29sZS53YXJuKGUpXG4gIH1cbn1cblxudHJ5IHtcbiAgKHdpbmRvdyBhcyBhbnkpLnJlZ2lzdGVyU3RvcmFnZSA9IHJlZ2lzdGVyU3RvcmFnZVxufSBjYXRjaCAoZSkge31cbiJdfQ==