@dcl/sdk 7.0.6-4197661608.commit-41efaad → 7.0.6-4197739270.commit-db87ed8

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.
@@ -28,25 +28,26 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
28
28
  Object.defineProperty(exports, "__esModule", { value: true });
29
29
  exports.getFilesFromFolder = exports.setupEcs6Endpoints = void 0;
30
30
  const path = __importStar(require("path"));
31
- const fs = __importStar(require("fs"));
32
31
  const glob_1 = require("glob");
33
32
  const sdk_1 = require("@dcl/schemas/dist/sdk");
34
33
  const schemas_1 = require("@dcl/schemas");
35
34
  const ignore_1 = __importDefault(require("ignore"));
36
35
  const node_fetch_1 = __importStar(require("node-fetch"));
37
36
  const catalyst_1 = require("./catalyst");
37
+ const fs_1 = require("fs");
38
+ const dcl_ignore_1 = require("../../utils/dcl-ignore");
38
39
  function getCatalystUrl() {
39
40
  return new URL('https://peer.decentraland.org');
40
41
  }
41
42
  function smartWearableNameToId(name) {
42
43
  return name.toLocaleLowerCase().replace(/ /g, '-');
43
44
  }
44
- function setupEcs6Endpoints(dir, router) {
45
+ function setupEcs6Endpoints(components, dir, router) {
45
46
  const baseFolders = [dir];
46
47
  router.get('/scene.json', async () => {
47
48
  return {
48
49
  headers: { 'content-type': 'application/json' },
49
- body: fs.createReadStream(path.join(dir, 'scene.json'))
50
+ body: components.fs.createReadStream(path.join(dir, 'scene.json'))
50
51
  };
51
52
  });
52
53
  router.get('/lambdas/explore/realms', async (ctx) => {
@@ -77,10 +78,10 @@ function setupEcs6Endpoints(dir, router) {
77
78
  router.get('/lambdas/profiles', async (ctx, next) => {
78
79
  const baseUrl = `${ctx.url.protocol}//${ctx.url.host}/content/contents`;
79
80
  try {
80
- const previewWearables = getAllPreviewWearables({
81
+ const previewWearables = await getAllPreviewWearables(components, {
81
82
  baseFolders,
82
83
  baseUrl
83
- }).map((wearable) => wearable.id);
84
+ });
84
85
  if (previewWearables.length === 1) {
85
86
  const catalystUrl = getCatalystUrl();
86
87
  const u = new URL(ctx.url.toString());
@@ -96,7 +97,7 @@ function setupEcs6Endpoints(dir, router) {
96
97
  });
97
98
  const deployedProfile = (await req.json());
98
99
  if ((deployedProfile === null || deployedProfile === void 0 ? void 0 : deployedProfile.length) === 1) {
99
- deployedProfile[0].avatars[0].avatar.wearables.push(...previewWearables);
100
+ deployedProfile[0].avatars[0].avatar.wearables.push(...previewWearables.map(($) => $.id));
100
101
  return {
101
102
  headers: {
102
103
  'content-type': req.headers.get('content-type') || 'application/binary'
@@ -142,11 +143,11 @@ function setupEcs6Endpoints(dir, router) {
142
143
  });
143
144
  return res;
144
145
  });
145
- serveStatic(dir, router);
146
- serveFolders(router, baseFolders);
146
+ serveStatic(components, dir, router);
147
+ serveFolders(components, router, baseFolders);
147
148
  }
148
149
  exports.setupEcs6Endpoints = setupEcs6Endpoints;
149
- function serveFolders(router, baseFolders) {
150
+ function serveFolders(components, router, baseFolders) {
150
151
  router.get('/content/contents/:hash', async (ctx, next) => {
151
152
  if (ctx.params.hash && ctx.params.hash.startsWith('b64-')) {
152
153
  const fullPath = path.resolve(Buffer.from(ctx.params.hash.replace(/^b64-/, ''), 'base64').toString('utf8'));
@@ -159,7 +160,7 @@ function serveFolders(router, baseFolders) {
159
160
  'x-sent': true,
160
161
  'cache-control': 'no-cache,private,max-age=1'
161
162
  },
162
- body: fs.createReadStream(fullPath)
163
+ body: components.fs.createReadStream(fullPath)
163
164
  };
164
165
  }
165
166
  return next();
@@ -169,7 +170,7 @@ function serveFolders(router, baseFolders) {
169
170
  return [];
170
171
  }
171
172
  const requestedPointers = new Set(pointers && typeof pointers === 'string' ? [pointers] : pointers);
172
- const resultEntities = getSceneJson({
173
+ const resultEntities = await getSceneJson(components, {
173
174
  baseFolders,
174
175
  pointers: Array.from(requestedPointers)
175
176
  });
@@ -191,7 +192,7 @@ function serveFolders(router, baseFolders) {
191
192
  });
192
193
  router.get('/preview-wearables/:id', async (ctx) => {
193
194
  const baseUrl = `${ctx.url.protocol}//${ctx.url.host}/content/contents`;
194
- const wearables = getAllPreviewWearables({
195
+ const wearables = await getAllPreviewWearables(components, {
195
196
  baseUrl,
196
197
  baseFolders
197
198
  });
@@ -208,24 +209,24 @@ function serveFolders(router, baseFolders) {
208
209
  return {
209
210
  body: {
210
211
  ok: true,
211
- data: getAllPreviewWearables({ baseUrl, baseFolders })
212
+ data: await getAllPreviewWearables(components, { baseUrl, baseFolders })
212
213
  }
213
214
  };
214
215
  });
215
216
  }
216
217
  const defaultHashMaker = (str) => 'b64-' + Buffer.from(str).toString('base64');
217
- function getAllPreviewWearables({ baseFolders, baseUrl }) {
218
+ async function getAllPreviewWearables(components, { baseFolders, baseUrl }) {
218
219
  const wearablePathArray = [];
219
220
  for (const wearableDir of baseFolders) {
220
221
  const wearableJsonPath = path.resolve(wearableDir, 'wearable.json');
221
- if (fs.existsSync(wearableJsonPath)) {
222
+ if (await components.fs.fileExists(wearableJsonPath)) {
222
223
  wearablePathArray.push(wearableJsonPath);
223
224
  }
224
225
  }
225
226
  const ret = [];
226
227
  for (const wearableJsonPath of wearablePathArray) {
227
228
  try {
228
- ret.push(serveWearable({ wearableJsonPath, baseUrl }));
229
+ ret.push(await serveWearable(components, { wearableJsonPath, baseUrl }));
229
230
  }
230
231
  catch (err) {
231
232
  console.error(`Couldn't mock the wearable ${wearableJsonPath}. Please verify the correct format and scheme.`, err);
@@ -233,24 +234,18 @@ function getAllPreviewWearables({ baseFolders, baseUrl }) {
233
234
  }
234
235
  return ret;
235
236
  }
236
- function serveWearable({ wearableJsonPath, baseUrl }) {
237
+ async function serveWearable(components, { wearableJsonPath, baseUrl }) {
237
238
  var _a;
238
239
  const wearableDir = path.dirname(wearableJsonPath);
239
- const wearableJson = JSON.parse(fs.readFileSync(wearableJsonPath).toString());
240
+ const wearableJson = JSON.parse((await components.fs.readFile(wearableJsonPath)).toString());
240
241
  if (!sdk_1.WearableJson.validate(wearableJson)) {
241
242
  const errors = (sdk_1.WearableJson.validate.errors || []).map((a) => `${a.data} ${a.message}`).join('');
242
243
  console.error(`Unable to validate wearable.json properly, please check it.`, errors);
243
244
  throw new Error(`Invalid wearable.json (${wearableJsonPath})`);
244
245
  }
245
- const dclIgnorePath = path.resolve(wearableDir, '.dclignore');
246
- let ignoreFileContent = '';
247
- if (fs.existsSync(dclIgnorePath)) {
248
- ignoreFileContent = fs.readFileSync(path.resolve(wearableDir, '.dclignore'), 'utf-8');
249
- }
250
- const hashedFiles = getFilesFromFolder({
246
+ const hashedFiles = await getFilesFromFolder(components, {
251
247
  folder: wearableDir,
252
- addOriginalPath: false,
253
- ignorePattern: ignoreFileContent
248
+ addOriginalPath: false
254
249
  });
255
250
  const thumbnailFiltered = hashedFiles.filter(($) => ($ === null || $ === void 0 ? void 0 : $.file) === 'thumbnail.png');
256
251
  const thumbnail = thumbnailFiltered.length > 0 && ((_a = thumbnailFiltered[0]) === null || _a === void 0 ? void 0 : _a.hash) && `${baseUrl}/${thumbnailFiltered[0].hash}`;
@@ -266,6 +261,8 @@ function serveWearable({ wearableJsonPath, baseUrl }) {
266
261
  i18n: [{ code: 'en', text: wearableJson.name }],
267
262
  description: wearableJson.description,
268
263
  thumbnail: thumbnail || '',
264
+ image: thumbnail || '',
265
+ collectionAddress: '0x0',
269
266
  baseUrl: `${baseUrl}/`,
270
267
  name: wearableJson.name || '',
271
268
  data: {
@@ -273,27 +270,20 @@ function serveWearable({ wearableJsonPath, baseUrl }) {
273
270
  replaces: [],
274
271
  hides: [],
275
272
  tags: [],
276
- scene: hashedFiles,
277
273
  representations: representations
278
274
  }
279
275
  };
280
276
  }
281
- function getSceneJson({ baseFolders, pointers, customHashMaker }) {
277
+ async function getSceneJson(components, { baseFolders, pointers, customHashMaker }) {
282
278
  const requestedPointers = new Set(pointers);
283
279
  const resultEntities = [];
284
- const allDeployments = baseFolders.map((folder) => {
285
- const dclIgnorePath = path.resolve(folder, '.dclignore');
286
- let ignoreFileContent = '';
287
- if (fs.existsSync(dclIgnorePath)) {
288
- ignoreFileContent = fs.readFileSync(path.resolve(folder, '.dclignore'), 'utf-8');
289
- }
290
- return entityV3FromFolder({
280
+ const allDeployments = await Promise.all(baseFolders.map(async (folder) => {
281
+ return entityV3FromFolder(components, {
291
282
  folder,
292
283
  addOriginalPath: false,
293
- ignorePattern: ignoreFileContent,
294
284
  customHashMaker
295
285
  });
296
- });
286
+ }));
297
287
  for (const pointer of Array.from(requestedPointers)) {
298
288
  const theDeployment = allDeployments.find(($) => $ && $.pointers.includes(pointer));
299
289
  if (theDeployment) {
@@ -303,7 +293,7 @@ function getSceneJson({ baseFolders, pointers, customHashMaker }) {
303
293
  }
304
294
  return resultEntities;
305
295
  }
306
- function serveStatic(dir, router) {
296
+ function serveStatic(components, dir, router) {
307
297
  const sdkPath = path.dirname(require.resolve('@dcl/sdk/package.json', {
308
298
  paths: [dir]
309
299
  }));
@@ -333,15 +323,15 @@ function serveStatic(dir, router) {
333
323
  router.get(route.route, async (_ctx) => {
334
324
  return {
335
325
  headers: { 'Content-Type': route.type },
336
- body: fs.createReadStream(route.path)
326
+ body: components.fs.createReadStream(route.path)
337
327
  };
338
328
  });
339
329
  }
340
- function createStaticRoutes(route, folder, transform = (str) => str) {
330
+ function createStaticRoutes(components, route, folder, transform = (str) => str) {
341
331
  router.get(route, async (ctx, next) => {
342
332
  const file = ctx.params.path;
343
333
  const fullPath = path.resolve(folder, transform(file));
344
- if (!fs.existsSync(fullPath)) {
334
+ if (!(await components.fs.fileExists(fullPath))) {
345
335
  return next();
346
336
  }
347
337
  const headers = {
@@ -354,13 +344,13 @@ function serveStatic(dir, router) {
354
344
  }
355
345
  return {
356
346
  headers,
357
- body: fs.createReadStream(fullPath)
347
+ body: components.fs.createReadStream(fullPath)
358
348
  };
359
349
  });
360
350
  }
361
- createStaticRoutes('/images/decentraland-connect/:path+', dclKernelImagesDecentralandConnect);
362
- createStaticRoutes('/default-profile/:path+', dclKernelDefaultProfilePath);
363
- createStaticRoutes('/@/explorer/:path+', dclExplorerJsonPath, (filePath) => filePath.replace(/.br+$/, ''));
351
+ createStaticRoutes(components, '/images/decentraland-connect/:path+', dclKernelImagesDecentralandConnect);
352
+ createStaticRoutes(components, '/default-profile/:path+', dclKernelDefaultProfilePath);
353
+ createStaticRoutes(components, '/@/explorer/:path+', dclExplorerJsonPath, (filePath) => filePath.replace(/.br+$/, ''));
364
354
  router.get('/feature-flags/:file', async (ctx) => {
365
355
  const res = await (0, node_fetch_1.default)(`https://feature-flags.decentraland.zone/${ctx.params.file}`, {
366
356
  headers: {
@@ -372,13 +362,13 @@ function serveStatic(dir, router) {
372
362
  };
373
363
  });
374
364
  }
375
- function entityV3FromFolder({ folder, addOriginalPath, ignorePattern, customHashMaker }) {
365
+ async function entityV3FromFolder(components, { folder, addOriginalPath, customHashMaker }) {
376
366
  const sceneJsonPath = path.resolve(folder, './scene.json');
377
367
  let isParcelScene = true;
378
368
  const wearableJsonPath = path.resolve(folder, './wearable.json');
379
- if (fs.existsSync(wearableJsonPath)) {
369
+ if (await components.fs.fileExists(wearableJsonPath)) {
380
370
  try {
381
- const wearableJson = JSON.parse(fs.readFileSync(wearableJsonPath).toString());
371
+ const wearableJson = JSON.parse(await components.fs.readFile(wearableJsonPath, 'utf-8'));
382
372
  if (!sdk_1.WearableJson.validate(wearableJson)) {
383
373
  const errors = (sdk_1.WearableJson.validate.errors || []).map((a) => `${a.data} ${a.message}`).join('');
384
374
  console.error(`Unable to validate wearable.json properly, please check it.`, errors);
@@ -393,16 +383,15 @@ function entityV3FromFolder({ folder, addOriginalPath, ignorePattern, customHash
393
383
  }
394
384
  }
395
385
  const hashMaker = customHashMaker ? customHashMaker : defaultHashMaker;
396
- if (fs.existsSync(sceneJsonPath) && isParcelScene) {
397
- const sceneJson = JSON.parse(fs.readFileSync(sceneJsonPath).toString());
386
+ if ((await components.fs.fileExists(sceneJsonPath)) && isParcelScene) {
387
+ const sceneJson = JSON.parse(await components.fs.readFile(sceneJsonPath, 'utf-8'));
398
388
  const { base, parcels } = sceneJson.scene;
399
389
  const pointers = new Set();
400
390
  pointers.add(base);
401
391
  parcels.forEach(($) => pointers.add($));
402
- const mappedFiles = getFilesFromFolder({
392
+ const mappedFiles = await getFilesFromFolder(components, {
403
393
  folder,
404
394
  addOriginalPath,
405
- ignorePattern,
406
395
  customHashMaker
407
396
  });
408
397
  return {
@@ -417,36 +406,18 @@ function entityV3FromFolder({ folder, addOriginalPath, ignorePattern, customHash
417
406
  }
418
407
  return null;
419
408
  }
420
- const defaultDclIgnore = () => [
421
- '.*',
422
- 'package.json',
423
- 'package-lock.json',
424
- 'yarn-lock.json',
425
- 'build.json',
426
- 'export',
427
- 'tsconfig.json',
428
- 'tslint.json',
429
- 'node_modules',
430
- '*.ts',
431
- '*.tsx',
432
- 'Dockerfile',
433
- 'dist',
434
- 'README.md',
435
- '*.blend',
436
- '*.fbx',
437
- '*.zip',
438
- '*.rar'
439
- ].join('\n');
440
- function getFilesFromFolder({ folder, addOriginalPath, ignorePattern, customHashMaker }) {
409
+ async function getFilesFromFolder(components, { folder, addOriginalPath, customHashMaker }) {
441
410
  const hashMaker = customHashMaker ? customHashMaker : defaultHashMaker;
411
+ const ignorePatterns = await (0, dcl_ignore_1.getDCLIgnorePatterns)(components, folder);
442
412
  const allFiles = (0, glob_1.sync)('**/*', {
413
+ ignore: ignorePatterns,
443
414
  cwd: folder,
444
415
  dot: false,
445
416
  absolute: true
446
417
  })
447
418
  .map((file) => {
448
419
  try {
449
- if (!fs.statSync(file).isFile())
420
+ if (!(0, fs_1.statSync)(file).isFile())
450
421
  return;
451
422
  }
452
423
  catch (err) {
@@ -457,18 +428,17 @@ function getFilesFromFolder({ folder, addOriginalPath, ignorePattern, customHash
457
428
  return key;
458
429
  })
459
430
  .filter(($) => !!$);
460
- const ensureIgnorePattern = ignorePattern && ignorePattern !== '' ? ignorePattern : defaultDclIgnore();
461
- const ig = (0, ignore_1.default)().add(ensureIgnorePattern);
431
+ const ig = (0, ignore_1.default)().add(ignorePatterns);
462
432
  const filteredFiles = ig.filter(allFiles);
463
433
  const ret = [];
464
434
  for (const file of filteredFiles) {
465
435
  const absolutePath = path.resolve(folder, file);
466
436
  try {
467
- if (!fs.statSync(absolutePath).isFile())
437
+ if (!(0, fs_1.statSync)(absolutePath).isFile())
468
438
  continue;
469
439
  }
470
440
  catch (err) {
471
- console.log(err);
441
+ console.error(err);
472
442
  continue;
473
443
  }
474
444
  const absoluteFolder = folder.replace(/\\/gi, '/');
@@ -482,4 +452,4 @@ function getFilesFromFolder({ folder, addOriginalPath, ignorePattern, customHash
482
452
  return ret;
483
453
  }
484
454
  exports.getFilesFromFolder = getFilesFromFolder;
485
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5kcG9pbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZW5kcG9pbnRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRUEsMkNBQTRCO0FBQzVCLHVDQUF3QjtBQUN4QiwrQkFBdUM7QUFDdkMsK0NBQW9EO0FBQ3BELDBDQUFpRTtBQUNqRSxvREFBMkI7QUFDM0IseURBQTJDO0FBQzNDLHlDQUFpRDtBQUVqRCxTQUFTLGNBQWM7SUFDckIsT0FBTyxJQUFJLEdBQUcsQ0FBQywrQkFBK0IsQ0FBQyxDQUFBO0FBQ2pELENBQUM7QUFFRCxTQUFTLHFCQUFxQixDQUFDLElBQVk7SUFDekMsT0FBTyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFBO0FBQ3BELENBQUM7QUFFRCxTQUFnQixrQkFBa0IsQ0FBQyxHQUFXLEVBQUUsTUFBaUM7SUFDL0UsTUFBTSxXQUFXLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQTtJQUV6QixNQUFNLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxLQUFLLElBQUksRUFBRTtRQUNuQyxPQUFPO1lBQ0wsT0FBTyxFQUFFLEVBQUUsY0FBYyxFQUFFLGtCQUFrQixFQUFFO1lBQy9DLElBQUksRUFBRSxFQUFFLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsWUFBWSxDQUFDLENBQUM7U0FDeEQsQ0FBQTtJQUNILENBQUMsQ0FBQyxDQUFBO0lBRUYsTUFBTSxDQUFDLEdBQUcsQ0FBQyx5QkFBeUIsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUU7UUFDbEQsT0FBTztZQUNMLElBQUksRUFBRTtnQkFDSjtvQkFDRSxVQUFVLEVBQUUsV0FBVztvQkFDdkIsR0FBRyxFQUFFLFVBQVUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUU7b0JBQzdCLEtBQUssRUFBRSxNQUFN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bnRzL2h0dHAtc2VydmVyJ1xuaW1wb3J0IHsgUHJldmlld0NvbXBvbmVudHMgfSBmcm9tICcuL3R5cGVzJ1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJ1xuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMnXG5pbXBvcnQgeyBzeW5jIGFzIGdsb2JTeW5jIH0gZnJvbSAnZ2xvYidcbmltcG9ydCB7IFdlYXJhYmxlSnNvbiB9IGZyb20gJ0BkY2wvc2NoZW1hcy9kaXN0L3NkaydcbmltcG9ydCB7IENvbnRlbnRNYXBwaW5nLCBFbnRpdHksIEVudGl0eVR5cGUgfSBmcm9tICdAZGNsL3NjaGVtYXMnXG5pbXBvcnQgaWdub3JlIGZyb20gJ2lnbm9yZSdcbmltcG9ydCBmZXRjaCwgeyBIZWFkZXJzIH0gZnJvbSAnbm9kZS1mZXRjaCdcbmltcG9ydCB7IGZldGNoRW50aXR5QnlQb2ludGVyIH0gZnJvbSAnLi9jYXRhbHlzdCdcblxuZnVuY3Rpb24gZ2V0Q2F0YWx5c3RVcmwoKTogVVJMIHtcbiAgcmV0dXJuIG5ldyBVUkwoJ2h0dHBzOi8vcGVlci5kZWNlbnRyYWxhbmQub3JnJylcbn1cblxuZnVuY3Rpb24gc21hcnRXZWFyYWJsZU5hbWVUb0lkKG5hbWU6IHN0cmluZykge1xuICByZXR1cm4gbmFtZS50b0xvY2FsZUxvd2VyQ2FzZSgpLnJlcGxhY2UoLyAvZywgJy0nKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0dXBFY3M2RW5kcG9pbnRzKGRpcjogc3RyaW5nLCByb3V0ZXI6IFJvdXRlcjxQcmV2aWV3Q29tcG9uZW50cz4pIHtcbiAgY29uc3QgYmFzZUZvbGRlcnMgPSBbZGlyXVxuICAvLyBoYW5kbGUgb2xkIHByZXZpZXcgc2NlbmUuanNvblxuICByb3V0ZXIuZ2V0KCcvc2NlbmUuanNvbicsIGFzeW5jICgpID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgaGVhZGVyczogeyAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiBmcy5jcmVhdGVSZWFkU3RyZWFtKHBhdGguam9pbihkaXIsICdzY2VuZS5qc29uJykpXG4gICAgfVxuICB9KVxuXG4gIHJvdXRlci5nZXQoJy9sYW1iZGFzL2V4cGxvcmUvcmVhbG1zJywgYXN5bmMgKGN0eCkgPT4ge1xuICAgIHJldHVybiB7XG4gICAgICBib2R5OiBbXG4gICAgICAgIHtcbiAgICAgICAgICBzZXJ2ZXJOYW1lOiAnbG9jYWxob3N0JyxcbiAgICAgICAgICB1cmw6IGBodHRwOi8vJHtjdHgudXJsLmhvc3R9YCxcbiAgICAgICAgICBsYXllcjogJ3N0dWInLFxuICAgICAgICAgIHVzZXJzQ291bnQ6IDAsXG4gICAgICAgICAgbWF4VXNlcnM6IDEwMCxcbiAgICAgICAgICB1c2VyUGFyY2VsczogW11cbiAgICAgICAgfVxuICAgICAgXVxuICAgIH1cbiAgfSlcblxuICByb3V0ZXIuZ2V0KCcvbGFtYmRhcy9jb250cmFjdHMvc2VydmVycycsIGFzeW5jIChjdHgpID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgYm9keTogW1xuICAgICAgICB7XG4gICAgICAgICAgYWRkcmVzczogYGh0dHA6Ly8ke2N0eC51cmwuaG9zdH1gLFxuICAgICAgICAgIG93bmVyOiAnMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwJyxcbiAgICAgICAgICBpZDogJzB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCdcbiAgICAgICAgfVxuICAgICAgXVxuICAgIH1cbiAgfSlcblxuICByb3V0ZXIuZ2V0KCcvbGFtYmRhcy9wcm9maWxlcycsIGFzeW5jIChjdHgsIG5leHQpID0+IHtcbiAgICBjb25zdCBiYXNlVXJsID0gYCR7Y3R4LnVybC5wcm90b2NvbH0vLyR7Y3R4LnVybC5ob3N0fS9jb250ZW50L2NvbnRlbnRzYFxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHByZXZpZXdXZWFyYWJsZXMgPSBnZXRBbGxQcmV2aWV3V2VhcmFibGVzKHtcbiAgICAgICAgYmFzZUZvbGRlcnMsXG4gICAgICAgIGJhc2VVcmxcbiAgICAgIH0pLm1hcCgod2VhcmFibGUpID0+IHdlYXJhYmxlLmlkKVxuXG4gICAgICBpZiAocHJldmlld1dlYXJhYmxlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgY29uc3QgY2F0YWx5c3RVcmwgPSBnZXRDYXRhbHlzdFVybCgpXG5cbiAgICAgICAgY29uc3QgdSA9IG5ldyBVUkwoY3R4LnVybC50b1N0cmluZygpKVxuICAgICAgICB1Lmhvc3QgPSBjYXRhbHlzdFVybC5ob3N0XG4gICAgICAgIHUucHJvdG9jb2wgPSBjYXRhbHlzdFVybC5wcm90b2NvbFxuICAgICAgICB1LnBvcnQgPSBjYXRhbHlzdFVybC5wb3J0XG4gICAgICAgIGNvbnN0IHJlcSA9IGF3YWl0IGZldGNoKHUudG9TdHJpbmcoKSwge1xuICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgIGNvbm5lY3Rpb246ICdjbG9zZSdcbiAgICAgICAgICB9LFxuICAgICAgICAgIG1ldGhvZDogY3R4LnJlcXVlc3QubWV0aG9kLFxuICAgICAgICAgIGJvZHk6IGN0eC5yZXF1ZXN0Lm1ldGhvZCA9PT0gJ2dldCcgPyB1bmRlZmluZWQgOiBjdHgucmVxdWVzdC5ib2R5XG4gICAgICAgIH0pXG5cbiAgICAgICAgY29uc3QgZGVwbG95ZWRQcm9maWxlID0gKGF3YWl0IHJlcS5qc29uKCkpIGFzIGFueVtdXG5cbiAgICAgICAgaWYgKGRlcGxveWVkUHJvZmlsZT8ubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgZGVwbG95ZWRQcm9maWxlWzBdLmF2YXRhcnNbMF0uYXZhdGFyLndlYXJhYmxlcy5wdXNoKC4uLnByZXZpZXdXZWFyYWJsZXMpXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6IHJlcS5oZWFkZXJzLmdldCgnY29udGVudC10eXBlJykgfHwgJ2FwcGxpY2F0aW9uL2JpbmFyeSdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBib2R5OiBkZXBsb3llZFByb2ZpbGVcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUud2FybihgRmFpbGVkIHRvIGNhdGNoIHByb2ZpbGUgYW5kIGZpbGwgd2l0aCBwcmV2aWV3IHdlYXJhYmxlcy5gLCBlcnIpXG4gICAgfVxuXG4gICAgcmV0dXJuIG5leHQoKVxuICB9KVxuXG4gIHJvdXRlci5hbGwoJy9sYW1iZGFzLzpwYXRoKycsIGFzeW5jIChjdHgpID0+IHtcbiAgICBjb25zdCBjYXRhbHlzdFVybCA9IGdldENhdGFseXN0VXJsKClcbiAgICBjb25zdCB1ID0gbmV3IFVSTChjdHgudXJsLnRvU3RyaW5nKCkpXG4gICAgdS5ob3N0ID0gY2F0YWx5c3RVcmwuaG9zdFxuICAgIHUucHJvdG9jb2wgPSBjYXRhbHlzdFVybC5wcm90b2NvbFxuICAgIHUucG9ydCA9IGNhdGFseXN0VXJsLnBvcnRcbiAgICBjb25zdCByZXEgPSBhd2FpdCBmZXRjaCh1LnRvU3RyaW5nKCksIHtcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgY29ubmVjdGlvbjogJ2Nsb3NlJ1xuICAgICAgfSxcbiAgICAgIG1ldGhvZDogY3R4LnJlcXVlc3QubWV0aG9kLFxuICAgICAgYm9keTogY3R4LnJlcXVlc3QubWV0aG9kID09PSAnZ2V0JyA/IHVuZGVmaW5lZCA6IGN0eC5yZXF1ZXN0LmJvZHlcbiAgICB9KVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgJ2NvbnRlbnQtdHlwZSc6IHJlcS5oZWFkZXJzLmdldCgnY29udGVudC10eXBlJykgfHwgJ2FwcGxpY2F0aW9uL2JpbmFyeSdcbiAgICAgIH0sXG4gICAgICBib2R5OiByZXEuYm9keVxuICAgIH1cbiAgfSlcblxuICByb3V0ZXIucG9zdCgnL2NvbnRlbnQvZW50aXRpZXMnLCBhc3luYyAoY3R4KSA9PiB7XG4gICAgY29uc3QgY2F0YWx5c3RVcmwgPSBnZXRDYXRhbHlzdFVybCgpXG4gICAgY29uc3QgaGVhZGVycyA9IG5ldyBIZWFkZXJzKClcbiAgICBjb25zb2xlLmxvZyhjdHgucmVxdWVzdC5oZWFkZXJzKVxuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKGAke2NhdGFseXN0VXJsLnRvU3RyaW5nKCl9L2NvbnRlbnQvZW50aXRpZXNgLCB7XG4gICAgICBtZXRob2Q6ICdwb3N0JyxcbiAgICAgIGhlYWRlcnMsXG4gICAgICBib2R5OiBjdHgucmVxdWVzdC5ib2R5XG4gICAgfSlcblxuICAgIHJldHVybiByZXNcbiAgfSlcblxuICBzZXJ2ZVN0YXRpYyhkaXIsIHJvdXRlcilcblxuICAvLyBUT0RPOiBnZXQgd29ya3NwYWNlIHNjZW5lcyAmIHdlYXJhYmxlcy4uLlxuXG4gIHNlcnZlRm9sZGVycyhyb3V0ZXIsIGJhc2VGb2xkZXJzKVxufVxuXG5mdW5jdGlvbiBzZXJ2ZUZvbGRlcnMocm91dGVyOiBSb3V0ZXI8UHJldmlld0NvbXBvbmVudHM+LCBiYXNlRm9sZGVyczogc3RyaW5nW10pIHtcbiAgcm91dGVyLmdldCgnL2NvbnRlbnQvY29udGVudHMvOmhhc2gnLCBhc3luYyAoY3R4OiBhbnksIG5leHQ6IGFueSkgPT4ge1xuICAgIGlmIChjdHgucGFyYW1zLmhhc2ggJiYgY3R4LnBhcmFtcy5oYXNoLnN0YXJ0c1dpdGgoJ2I2NC0nKSkge1xuICAgICAgY29uc3QgZnVsbFBhdGggPSBwYXRoLnJlc29sdmUoQnVmZmVyLmZyb20oY3R4LnBhcmFtcy5oYXNoLnJlcGxhY2UoL15iNjQtLywgJycpLCAnYmFzZTY0JykudG9TdHJpbmcoJ3V0ZjgnKSlcblxuICAgICAgLy8gb25seSByZXR1cm4gZmlsZXMgSUYgdGhlIGZpbGUgaXMgd2l0aGluIGEgYmFzZUZvbGRlclxuICAgICAgaWYgKCFiYXNlRm9sZGVycy5maW5kKChmb2xkZXI6IHN0cmluZykgPT4gZnVsbFBhdGguc3RhcnRzV2l0aChmb2xkZXIpKSkge1xuICAgICAgICByZXR1cm4gbmV4dCgpXG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAneC10aW1lc3RhbXAnOiBEYXRlLm5vdygpLFxuICAgICAgICAgICd4LXNlbnQnOiB0cnVlLFxuICAgICAgICAgICdjYWNoZS1jb250cm9sJzogJ25vLWNhY2hlLHByaXZhdGUsbWF4LWFnZT0xJ1xuICAgICAgICB9LFxuICAgICAgICBib2R5OiBmcy5jcmVhdGVSZWFkU3RyZWFtKGZ1bGxQYXRoKVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBuZXh0KClcbiAgfSlcblxuICBhc3luYyBmdW5jdGlvbiBwb2ludGVyUmVxdWVzdEhhbmRsZXIocG9pbnRlcnM6IHN0cmluZ1tdKSB7XG4gICAgaWYgKCFwb2ludGVycyB8fCBwb2ludGVycy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBbXVxuICAgIH1cblxuICAgIGNvbnN0IHJlcXVlc3RlZFBvaW50ZXJzID0gbmV3IFNldDxzdHJpbmc+KFxuICAgICAgcG9pbnRlcnMgJiYgdHlwZW9mIHBvaW50ZXJzID09PSAnc3RyaW5nJyA/IFtwb2ludGVycyBhcyBzdHJpbmddIDogKHBvaW50ZXJzIGFzIHN0cmluZ1tdKVxuICAgIClcblxuICAgIGNvbnN0IHJlc3VsdEVudGl0aWVzID0gZ2V0U2NlbmVKc29uKHtcbiAgICAgIGJhc2VGb2xkZXJzLFxuICAgICAgcG9pbnRlcnM6IEFycmF5LmZyb20ocmVxdWVzdGVkUG9pbnRlcnMpXG4gICAgfSlcbiAgICBjb25zdCBjYXRhbHlzdFVybCA9IGdldENhdGFseXN0VXJsKClcbiAgICBjb25zdCByZW1vdGUgPSBmZXRjaEVudGl0eUJ5UG9pbnRlcihcbiAgICAgIGNhdGFseXN0VXJsLnRvU3RyaW5nKCksXG4gICAgICBwb2ludGVycy5maWx0ZXIoKCQ6IHN0cmluZykgPT4gISQubWF0Y2goLy0/XFxkKywtP1xcZCsvKSlcbiAgICApXG5cbiAgICBjb25zdCBzZXJ2ZXJFbnRpdGllcyA9IEFycmF5LmlzQXJyYXkocmVtb3RlKSA/IHJlbW90ZSA6IFtdXG5cbiAgICByZXR1cm4gWy4uLnJlc3VsdEVudGl0aWVzLCAuLi5zZXJ2ZXJFbnRpdGllc11cbiAgfVxuXG4gIC8vIFJFVklFVyBSRVNQT05TRSBGT1JNQVRcbiAgcm91dGVyLmdldCgnL2NvbnRlbnQvZW50aXRpZXMvc2NlbmUnLCBhc3luYyAoY3R4KSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGJvZHk6IGF3YWl0IHBvaW50ZXJSZXF1ZXN0SGFuZGxlcihjdHgudXJsLnNlYXJjaFBhcmFtcy5nZXRBbGwoJ3BvaW50ZXInKSlcbiAgICB9XG4gIH0pXG5cbiAgLy8gUkVWSUVXIFJFU1BPTlNFIEZPUk1BVFxuICByb3V0ZXIucG9zdCgnL2NvbnRlbnQvZW50aXRpZXMvYWN0aXZlJywgYXN5bmMgKGN0eCkgPT4ge1xuICAgIGNvbnN0IGJvZHkgPSBhd2FpdCBjdHgucmVxdWVzdC5qc29uKClcbiAgICByZXR1cm4ge1xuICAgICAgYm9keTogYXdhaXQgcG9pbnRlclJlcXVlc3RIYW5kbGVyKGJvZHkucG9pbnRlcnMpXG4gICAgfVxuICB9KVxuXG4gIHJvdXRlci5nZXQoJy9wcmV2aWV3LXdlYXJhYmxlcy86aWQnLCBhc3luYyAoY3R4KSA9PiB7XG4gICAgY29uc3QgYmFzZVVybCA9IGAke2N0eC51cmwucHJvdG9jb2x9Ly8ke2N0eC51cmwuaG9zdH0vY29udGVudC9jb250ZW50c2BcbiAgICBjb25zdCB3ZWFyYWJsZXMgPSBnZXRBbGxQcmV2aWV3V2VhcmFibGVzKHtcbiAgICAgIGJhc2VVcmwsXG4gICAgICBiYXNlRm9sZGVyc1xuICAgIH0pXG4gICAgY29uc3Qgd2VhcmFibGVJZCA9IGN0eC5wYXJhbXMuaWRcbiAgICByZXR1cm4ge1xuICAgICAgYm9keToge1xuICAgICAgICBvazogdHJ1ZSxcbiAgICAgICAgZGF0YTogd2VhcmFibGVzLmZpbHRlcigod2VhcmFibGUpID0+IHNtYXJ0V2VhcmFibGVOYW1lVG9JZCh3ZWFyYWJsZT8ubmFtZSkgPT09IHdlYXJhYmxlSWQpXG4gICAgICB9XG4gICAgfVxuICB9KVxuXG4gIHJvdXRlci5nZXQoJy9wcmV2aWV3LXdlYXJhYmxlcycsIGFzeW5jIChjdHgpID0+IHtcbiAgICBjb25zdCBiYXNlVXJsID0gYCR7Y3R4LnVybC5wcm90b2NvbH0vLyR7Y3R4LnVybC5ob3N0fS9jb250ZW50L2NvbnRlbnRzYFxuICAgIHJldHVybiB7XG4gICAgICBib2R5OiB7XG4gICAgICAgIG9rOiB0cnVlLFxuICAgICAgICBkYXRhOiBnZXRBbGxQcmV2aWV3V2VhcmFibGVzKHsgYmFzZVVybCwgYmFzZUZvbGRlcnMgfSlcbiAgICAgIH1cbiAgICB9XG4gIH0pXG59XG5cbmNvbnN0IGRlZmF1bHRIYXNoTWFrZXIgPSAoc3RyOiBzdHJpbmcpID0+ICdiNjQtJyArIEJ1ZmZlci5mcm9tKHN0cikudG9TdHJpbmcoJ2Jhc2U2NCcpXG5cbmZ1bmN0aW9uIGdldEFsbFByZXZpZXdXZWFyYWJsZXMoeyBiYXNlRm9sZGVycywgYmFzZVVybCB9OiB7IGJhc2VGb2xkZXJzOiBzdHJpbmdbXTsgYmFzZVVybDogc3RyaW5nIH0pIHtcbiAgY29uc3Qgd2VhcmFibGVQYXRoQXJyYXk6IHN0cmluZ1tdID0gW11cbiAgZm9yIChjb25zdCB3ZWFyYWJsZURpciBvZiBiYXNlRm9sZGVycykge1xuICAgIGNvbnN0IHdlYXJhYmxlSnNvblBhdGggPSBwYXRoLnJlc29sdmUod2VhcmFibGVEaXIsICd3ZWFyYWJsZS5qc29uJylcbiAgICBpZiAoZnMuZXhpc3RzU3luYyh3ZWFyYWJsZUpzb25QYXRoKSkge1xuICAgICAgd2VhcmFibGVQYXRoQXJyYXkucHVzaCh3ZWFyYWJsZUpzb25QYXRoKVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHJldDogUmV0dXJuVHlwZTx0eXBlb2Ygc2VydmVXZWFyYWJsZT5bXSA9IFtdXG4gIGZvciAoY29uc3Qgd2VhcmFibGVKc29uUGF0aCBvZiB3ZWFyYWJsZVBhdGhBcnJheSkge1xuICAgIHRyeSB7XG4gICAgICByZXQucHVzaChzZXJ2ZVdlYXJhYmxlKHsgd2VhcmFibGVKc29uUGF0aCwgYmFzZVVybCB9KSlcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYENvdWxkbid0IG1vY2sgdGhlIHdlYXJhYmxlICR7d2VhcmFibGVKc29uUGF0aH0uIFBsZWFzZSB2ZXJpZnkgdGhlIGNvcnJlY3QgZm9ybWF0IGFuZCBzY2hlbWUuYCwgZXJyKVxuICAgIH1cbiAgfVxuICByZXR1cm4gcmV0XG59XG5cbmZ1bmN0aW9uIHNlcnZlV2VhcmFibGUoeyB3ZWFyYWJsZUpzb25QYXRoLCBiYXNlVXJsIH06IHsgd2VhcmFibGVKc29uUGF0aDogc3RyaW5nOyBiYXNlVXJsOiBzdHJpbmcgfSkge1xuICBjb25zdCB3ZWFyYWJsZURpciA9IHBhdGguZGlybmFtZSh3ZWFyYWJsZUpzb25QYXRoKVxuICBjb25zdCB3ZWFyYWJsZUpzb24gPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyh3ZWFyYWJsZUpzb25QYXRoKS50b1N0cmluZygpKVxuXG4gIGlmICghV2VhcmFibGVKc29uLnZhbGlkYXRlKHdlYXJhYmxlSnNvbikpIHtcbiAgICBjb25zdCBlcnJvcnMgPSAoV2VhcmFibGVKc29uLnZhbGlkYXRlLmVycm9ycyB8fCBbXSkubWFwKChhKSA9PiBgJHthLmRhdGF9ICR7YS5tZXNzYWdlfWApLmpvaW4oJycpXG5cbiAgICBjb25zb2xlLmVycm9yKGBVbmFibGUgdG8gdmFsaWRhdGUgd2VhcmFibGUuanNvbiBwcm9wZXJseSwgcGxlYXNlIGNoZWNrIGl0LmAsIGVycm9ycylcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgd2VhcmFibGUuanNvbiAoJHt3ZWFyYWJsZUpzb25QYXRofSlgKVxuICB9XG5cbiAgY29uc3QgZGNsSWdub3JlUGF0aCA9IHBhdGgucmVzb2x2ZSh3ZWFyYWJsZURpciwgJy5kY2xpZ25vcmUnKVxuICBsZXQgaWdub3JlRmlsZUNvbnRlbnQgPSAnJ1xuICBpZiAoZnMuZXhpc3RzU3luYyhkY2xJZ25vcmVQYXRoKSkge1xuICAgIGlnbm9yZUZpbGVDb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHBhdGgucmVzb2x2ZSh3ZWFyYWJsZURpciwgJy5kY2xpZ25vcmUnKSwgJ3V0Zi04JylcbiAgfVxuXG4gIGNvbnN0IGhhc2hlZEZpbGVzID0gZ2V0RmlsZXNGcm9tRm9sZGVyKHtcbiAgICBmb2xkZXI6IHdlYXJhYmxlRGlyLFxuICAgIGFkZE9yaWdpbmFsUGF0aDogZmFsc2UsXG4gICAgaWdub3JlUGF0dGVybjogaWdub3JlRmlsZUNvbnRlbnRcbiAgfSlcblxuICBjb25zdCB0aHVtYm5haWxGaWx0ZXJlZCA9IGhhc2hlZEZpbGVzLmZpbHRlcigoJCkgPT4gJD8uZmlsZSA9PT0gJ3RodW1ibmFpbC5wbmcnKVxuICBjb25zdCB0aHVtYm5haWwgPVxuICAgIHRodW1ibmFpbEZpbHRlcmVkLmxlbmd0aCA+IDAgJiYgdGh1bWJuYWlsRmlsdGVyZWRbMF0/Lmhhc2ggJiYgYCR7YmFzZVVybH0vJHt0aHVtYm5haWxGaWx0ZXJlZFswXS5oYXNofWBcblxuICBjb25zdCB3ZWFyYWJsZUlkID0gJ3Vybjo4ZGMyZDdhZC05N2UzLTQ0ZDAtYmE4OS1lODMwNWQ3OTVhNmEnXG5cbiAgY29uc3QgcmVwcmVzZW50YXRpb25zID0gd2VhcmFibGVKc29uLmRhdGEucmVwcmVzZW50YXRpb25zLm1hcCgocmVwcmVzZW50YXRpb24pID0+ICh7XG4gICAgLi4ucmVwcmVzZW50YXRpb24sXG4gICAgbWFpbkZpbGU6IGBtYWxlLyR7cmVwcmVzZW50YXRpb24ubWFpbkZpbGV9YCxcbiAgICBjb250ZW50czogaGFzaGVkRmlsZXMubWFwKCgkKSA9PiAoe1xuICAgICAga2V5OiBgbWFsZS8keyQ/LmZpbGV9YCxcbiAgICAgIHVybDogYCR7YmFzZVVybH0vJHskPy5oYXNofWAsXG4gICAgICBoYXNoOiAkPy5oYXNoXG4gICAgfSkpXG4gIH0pKVxuXG4gIHJldHVybiB7XG4gICAgaWQ6IHdlYXJhYmxlSWQsXG4gICAgcmFyaXR5OiB3ZWFyYWJsZUpzb24ucmFyaXR5LFxuICAgIGkxOG46IFt7IGNvZGU6ICdlbicsIHRleHQ6IHdlYXJhYmxlSnNvbi5uYW1lIH1dLFxuICAgIGRlc2NyaXB0aW9uOiB3ZWFyYWJsZUpzb24uZGVzY3JpcHRpb24sXG4gICAgdGh1bWJuYWlsOiB0aHVtYm5haWwgfHwgJycsXG4gICAgYmFzZVVybDogYCR7YmFzZVVybH0vYCxcbiAgICBuYW1lOiB3ZWFyYWJsZUpzb24ubmFtZSB8fCAnJyxcbiAgICBkYXRhOiB7XG4gICAgICBjYXRlZ29yeTogd2VhcmFibGVKc29uLmRhdGEuY2F0ZWdvcnksXG4gICAgICByZXBsYWNlczogW10sXG4gICAgICBoaWRlczogW10sXG4gICAgICB0YWdzOiBbXSxcbiAgICAgIHNjZW5lOiBoYXNoZWRGaWxlcyxcbiAgICAgIHJlcHJlc2VudGF0aW9uczogcmVwcmVzZW50YXRpb25zIGFzIGFueVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRTY2VuZUpzb24oe1xuICBiYXNlRm9sZGVycyxcbiAgcG9pbnRlcnMsXG4gIGN1c3RvbUhhc2hNYWtlclxufToge1xuICBiYXNlRm9sZGVyczogc3RyaW5nW11cbiAgcG9pbnRlcnM6IHN0cmluZ1tdXG4gIGN1c3RvbUhhc2hNYWtlcj86IChzdHI6IHN0cmluZykgPT4gc3RyaW5nXG59KTogRW50aXR5W10ge1xuICBjb25zdCByZXF1ZXN0ZWRQb2ludGVycyA9IG5ldyBTZXQ8c3RyaW5nPihwb2ludGVycylcbiAgY29uc3QgcmVzdWx0RW50aXRpZXM6IEVudGl0eVtdID0gW11cblxuICBjb25zdCBhbGxEZXBsb3ltZW50cyA9IGJhc2VGb2xkZXJzLm1hcCgoZm9sZGVyKSA9PiB7XG4gICAgY29uc3QgZGNsSWdub3JlUGF0aCA9IHBhdGgucmVzb2x2ZShmb2xkZXIsICcuZGNsaWdub3JlJylcbiAgICBsZXQgaWdub3JlRmlsZUNvbnRlbnQgPSAnJ1xuICAgIGlmIChmcy5leGlzdHNTeW5jKGRjbElnbm9yZVBhdGgpKSB7XG4gICAgICBpZ25vcmVGaWxlQ29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhwYXRoLnJlc29sdmUoZm9sZGVyLCAnLmRjbGlnbm9yZScpLCAndXRmLTgnKVxuICAgIH1cblxuICAgIHJldHVybiBlbnRpdHlWM0Zyb21Gb2xkZXIoe1xuICAgICAgZm9sZGVyLFxuICAgICAgYWRkT3JpZ2luYWxQYXRoOiBmYWxzZSxcbiAgICAgIGlnbm9yZVBhdHRlcm46IGlnbm9yZUZpbGVDb250ZW50LFxuICAgICAgY3VzdG9tSGFzaE1ha2VyXG4gICAgfSlcbiAgfSlcblxuICBmb3IgKGNvbnN0IHBvaW50ZXIgb2YgQXJyYXkuZnJvbShyZXF1ZXN0ZWRQb2ludGVycykpIHtcbiAgICAvLyBnZXQgZGVwbG95bWVudCBieSBwb2ludGVyXG4gICAgY29uc3QgdGhlRGVwbG95bWVudCA9IGFsbERlcGxveW1lbnRzLmZpbmQoKCQpID0+ICQgJiYgJC5wb2ludGVycy5pbmNsdWRlcyhwb2ludGVyKSlcbiAgICBpZiAodGhlRGVwbG95bWVudCkge1xuICAgICAgLy8gcmVtb3ZlIGFsbCB0aGUgcmVxdWlyZWQgcG9pbnRlcnMgZnJvbSB0aGUgcmVxdWVzdGVkUG9pbnRlcnMgc2V0XG4gICAgICAvLyB0byBwcmV2ZW50IHNlbmRpbmcgZHVwbGljYXRlZCBlbnRpdGllc1xuICAgICAgdGhlRGVwbG95bWVudC5wb2ludGVycy5mb3JFYWNoKCgkKSA9PiByZXF1ZXN0ZWRQb2ludGVycy5kZWxldGUoJCkpXG5cbiAgICAgIC8vIGFkZCB0aGUgZGVwbG95bWVudCB0byB0aGUgcmVzdWx0c1xuICAgICAgcmVzdWx0RW50aXRpZXMucHVzaCh0aGVEZXBsb3ltZW50KVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHRFbnRpdGllc1xufVxuXG5mdW5jdGlvbiBzZXJ2ZVN0YXRpYyhkaXI6IHN0cmluZywgcm91dGVyOiBSb3V0ZXI8UHJldmlld0NvbXBvbmVudHM+KSB7XG4gIGNvbnN0IHNka1BhdGggPSBwYXRoLmRpcm5hbWUoXG4gICAgcmVxdWlyZS5yZXNvbHZlKCdAZGNsL3Nkay9wYWNrYWdlLmpzb24nLCB7XG4gICAgICBwYXRoczogW2Rpcl1cbiAgICB9KVxuICApXG4gIGNvbnN0IGRjbEV4cGxvcmVySnNvblBhdGggPSBwYXRoLmRpcm5hbWUoXG4gICAgcmVxdWlyZS5yZXNvbHZlKCdAZGNsL2V4cGxvcmVyL3BhY2thZ2UuanNvbicsIHtcbiAgICAgIHBhdGhzOiBbZGlyLCBzZGtQYXRoXVxuICAgIH0pXG4gIClcblxuICBjb25zdCBkY2xLZXJuZWxEZWZhdWx0UHJvZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZGNsRXhwbG9yZXJKc29uUGF0aCwgJ2RlZmF1bHQtcHJvZmlsZScpXG4gIGNvbnN0IGRjbEtlcm5lbEltYWdlc0RlY2VudHJhbGFuZENvbm5lY3QgPSBwYXRoLnJlc29sdmUoZGNsRXhwbG9yZXJKc29uUGF0aCwgJ2ltYWdlcycsICdkZWNlbnRyYWxhbmQtY29ubmVjdCcpXG5cbiAgY29uc3Qgcm91dGVzID0gW1xuICAgIHtcbiAgICAgIHJvdXRlOiAnLycsXG4gICAgICBwYXRoOiBwYXRoLnJlc29sdmUoZGNsRXhwbG9yZXJKc29uUGF0aCwgJ3ByZXZpZXcuaHRtbCcpLFxuICAgICAgdHlwZTogJ3RleHQvaHRtbCdcbiAgICB9LFxuICAgIHtcbiAgICAgIHJvdXRlOiAnL2Zhdmljb24uaWNvJyxcbiAgICAgIHBhdGg6IHBhdGgucmVzb2x2ZShkY2xFeHBsb3Jlckpzb25QYXRoLCAnZmF2aWNvbi5pY28nKSxcbiAgICAgIHR5cGU6ICd0ZXh0L2h0bWwnXG4gICAgfSxcbiAgICB7XG4gICAgICByb3V0ZTogJy9AL2V4cGxvcmVyL2luZGV4LmpzJyxcbiAgICAgIHBhdGg6IHBhdGgucmVzb2x2ZShkY2xFeHBsb3Jlckpzb25QYXRoLCAnaW5kZXguanMnKSxcbiAgICAgIHR5cGU6ICd0ZXh0L2phdmFzY3JpcHQnXG4gICAgfVxuICBdXG5cbiAgZm9yIChjb25zdCByb3V0ZSBvZiByb3V0ZXMpIHtcbiAgICByb3V0ZXIuZ2V0KHJvdXRlLnJvdXRlLCBhc3luYyAoX2N0eCkgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogcm91dGUudHlwZSB9LFxuICAgICAgICBib2R5OiBmcy5jcmVhdGVSZWFkU3RyZWFtKHJvdXRlLnBhdGgpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZVN0YXRpY1JvdXRlcyhyb3V0ZTogc3RyaW5nLCBmb2xkZXI6IHN0cmluZywgdHJhbnNmb3JtID0gKHN0cjogc3RyaW5nKSA9PiBzdHIpIHtcbiAgICByb3V0ZXIuZ2V0KHJvdXRlLCBhc3luYyAoY3R4LCBuZXh0KSA9PiB7XG4gICAgICBjb25zdCBmaWxlID0gY3R4LnBhcmFtcy5wYXRoXG4gICAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGgucmVzb2x2ZShmb2xkZXIsIHRyYW5zZm9ybShmaWxlKSlcblxuICAgICAgLy8gb25seSByZXR1cm4gZmlsZXMgSUYgdGhlIGZpbGUgaXMgd2l0aGluIGEgYmFzZUZvbGRlclxuICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKGZ1bGxQYXRoKSkge1xuICAgICAgICByZXR1cm4gbmV4dCgpXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7XG4gICAgICAgICd4LXRpbWVzdGFtcCc6IERhdGUubm93KCksXG4gICAgICAgICd4LXNlbnQnOiB0cnVlLFxuICAgICAgICAnY2FjaGUtY29udHJvbCc6ICduby1jYWNoZSxwcml2YXRlLG1heC1hZ2U9MSdcbiAgICAgIH1cblxuICAgICAgaWYgKGZ1bGxQYXRoLmVuZHNXaXRoKCcud2FzbScpKSB7XG4gICAgICAgIGhlYWRlcnNbJ2NvbnRlbnQtdHlwZSddID0gJ2FwcGxpY2F0aW9uL3dhc20nXG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGhlYWRlcnMsXG4gICAgICAgIGJvZHk6IGZzLmNyZWF0ZVJlYWRTdHJlYW0oZnVsbFBhdGgpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIGNyZWF0ZVN0YXRpY1JvdXRlcygnL2ltYWdlcy9kZWNlbnRyYWxhbmQtY29ubmVjdC86cGF0aCsnLCBkY2xLZXJuZWxJbWFnZXNEZWNlbnRyYWxhbmRDb25uZWN0KVxuICBjcmVhdGVTdGF0aWNSb3V0ZXMoJy9kZWZhdWx0LXByb2ZpbGUvOnBhdGgrJywgZGNsS2VybmVsRGVmYXVsdFByb2ZpbGVQYXRoKVxuICBjcmVhdGVTdGF0aWNSb3V0ZXMoJy9AL2V4cGxvcmVyLzpwYXRoKycsIGRjbEV4cGxvcmVySnNvblBhdGgsIChmaWxlUGF0aCkgPT4gZmlsZVBhdGgucmVwbGFjZSgvLmJyKyQvLCAnJykpXG5cbiAgcm91dGVyLmdldCgnL2ZlYXR1cmUtZmxhZ3MvOmZpbGUnLCBhc3luYyAoY3R4KSA9PiB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goYGh0dHBzOi8vZmVhdHVyZS1mbGFncy5kZWNlbnRyYWxhbmQuem9uZS8ke2N0eC5wYXJhbXMuZmlsZX1gLCB7XG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgIGNvbm5lY3Rpb246ICdjbG9zZSdcbiAgICAgIH1cbiAgICB9KVxuICAgIHJldHVybiB7XG4gICAgICBib2R5OiBhd2FpdCByZXMuYXJyYXlCdWZmZXIoKVxuICAgIH1cbiAgfSlcbn1cblxuZnVuY3Rpb24gZW50aXR5VjNGcm9tRm9sZGVyKHtcbiAgZm9sZGVyLFxuICBhZGRPcmlnaW5hbFBhdGgsXG4gIGlnbm9yZVBhdHRlcm4sXG4gIGN1c3RvbUhhc2hNYWtlclxufToge1xuICBmb2xkZXI6IHN0cmluZ1xuICBhZGRPcmlnaW5hbFBhdGg/OiBib29sZWFuXG4gIGlnbm9yZVBhdHRlcm4/OiBzdHJpbmdcbiAgY3VzdG9tSGFzaE1ha2VyPzogKHN0cjogc3RyaW5nKSA9PiBzdHJpbmdcbn0pOiBFbnRpdHkgfCBudWxsIHtcbiAgY29uc3Qgc2NlbmVKc29uUGF0aCA9IHBhdGgucmVzb2x2ZShmb2xkZXIsICcuL3NjZW5lLmpzb24nKVxuICBsZXQgaXNQYXJjZWxTY2VuZSA9IHRydWVcblxuICBjb25zdCB3ZWFyYWJsZUpzb25QYXRoID0gcGF0aC5yZXNvbHZlKGZvbGRlciwgJy4vd2VhcmFibGUuanNvbicpXG4gIGlmIChmcy5leGlzdHNTeW5jKHdlYXJhYmxlSnNvblBhdGgpKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHdlYXJhYmxlSnNvbiA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHdlYXJhYmxlSnNvblBhdGgpLnRvU3RyaW5nKCkpXG4gICAgICBpZiAoIVdlYXJhYmxlSnNvbi52YWxpZGF0ZSh3ZWFyYWJsZUpzb24pKSB7XG4gICAgICAgIGNvbnN0IGVycm9ycyA9IChXZWFyYWJsZUpzb24udmFsaWRhdGUuZXJyb3JzIHx8IFtdKS5tYXAoKGEpID0+IGAke2EuZGF0YX0gJHthLm1lc3NhZ2V9YCkuam9pbignJylcblxuICAgICAgICBjb25zb2xlLmVycm9yKGBVbmFibGUgdG8gdmFsaWRhdGUgd2VhcmFibGUuanNvbiBwcm9wZXJseSwgcGxlYXNlIGNoZWNrIGl0LmAsIGVycm9ycylcbiAgICAgICAgY29uc29sZS5lcnJvcihgSW52YWxpZCB3ZWFyYWJsZS5qc29uICgke3dlYXJhYmxlSnNvblBhdGh9KWApXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpc1BhcmNlbFNjZW5lID0gZmFsc2VcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFVuYWJsZSB0byBsb2FkIHdlYXJhYmxlLmpzb24gcHJvcGVybHlgLCBlcnIpXG4gICAgfVxuICB9XG5cbiAgY29uc3QgaGFzaE1ha2VyID0gY3VzdG9tSGFzaE1ha2VyID8gY3VzdG9tSGFzaE1ha2VyIDogZGVmYXVsdEhhc2hNYWtlclxuXG4gIGlmIChmcy5leGlzdHNTeW5jKHNjZW5lSnNvblBhdGgpICYmIGlzUGFyY2VsU2NlbmUpIHtcbiAgICBjb25zdCBzY2VuZUpzb24gPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhzY2VuZUpzb25QYXRoKS50b1N0cmluZygpKVxuICAgIGNvbnN0IHsgYmFzZSwgcGFyY2VscyB9OiB7IGJhc2U6IHN0cmluZzsgcGFyY2Vsczogc3RyaW5nW10gfSA9IHNjZW5lSnNvbi5zY2VuZVxuICAgIGNvbnN0IHBvaW50ZXJzID0gbmV3IFNldDxzdHJpbmc+KClcbiAgICBwb2ludGVycy5hZGQoYmFzZSlcbiAgICBwYXJjZWxzLmZvckVhY2goKCQpID0+IHBvaW50ZXJzLmFkZCgkKSlcblxuICAgIGNvbnN0IG1hcHBlZEZpbGVzID0gZ2V0RmlsZXNGcm9tRm9sZGVyKHtcbiAgICAgIGZvbGRlcixcbiAgICAgIGFkZE9yaWdpbmFsUGF0aCxcbiAgICAgIGlnbm9yZVBhdHRlcm4sXG4gICAgICBjdXN0b21IYXNoTWFrZXJcbiAgICB9KVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHZlcnNpb246ICd2MycsXG4gICAgICB0eXBlOiBFbnRpdHlUeXBlLlNDRU5FLFxuICAgICAgaWQ6IGhhc2hNYWtlcihmb2xkZXIpLFxuICAgICAgcG9pbnRlcnM6IEFycmF5LmZyb20ocG9pbnRlcnMpLFxuICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgbWV0YWRhdGE6IHNjZW5lSnNvbixcbiAgICAgIGNvbnRlbnQ6IG1hcHBlZEZpbGVzXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGxcbn1cblxuY29uc3QgZGVmYXVsdERjbElnbm9yZSA9ICgpID0+XG4gIFtcbiAgICAnLionLFxuICAgICdwYWNrYWdlLmpzb24nLFxuICAgICdwYWNrYWdlLWxvY2suanNvbicsXG4gICAgJ3lhcm4tbG9jay5qc29uJyxcbiAgICAnYnVpbGQuanNvbicsXG4gICAgJ2V4cG9ydCcsXG4gICAgJ3RzY29uZmlnLmpzb24nLFxuICAgICd0c2xpbnQuanNvbicsXG4gICAgJ25vZGVfbW9kdWxlcycsXG4gICAgJyoudHMnLFxuICAgICcqLnRzeCcsXG4gICAgJ0RvY2tlcmZpbGUnLFxuICAgICdkaXN0JyxcbiAgICAnUkVBRE1FLm1kJyxcbiAgICAnKi5ibGVuZCcsXG4gICAgJyouZmJ4JyxcbiAgICAnKi56aXAnLFxuICAgICcqLnJhcidcbiAgXS5qb2luKCdcXG4nKVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RmlsZXNGcm9tRm9sZGVyKHtcbiAgZm9sZGVyLFxuICBhZGRPcmlnaW5hbFBhdGgsXG4gIGlnbm9yZVBhdHRlcm4sXG4gIGN1c3RvbUhhc2hNYWtlclxufToge1xuICBmb2xkZXI6IHN0cmluZ1xuICBhZGRPcmlnaW5hbFBhdGg/OiBib29sZWFuXG4gIGlnbm9yZVBhdHRlcm4/OiBzdHJpbmdcbiAgY3VzdG9tSGFzaE1ha2VyPzogKHN0cjogc3RyaW5nKSA9PiBzdHJpbmdcbn0pOiBDb250ZW50TWFwcGluZ1tdIHtcbiAgY29uc3QgaGFzaE1ha2VyID0gY3VzdG9tSGFzaE1ha2VyID8gY3VzdG9tSGFzaE1ha2VyIDogZGVmYXVsdEhhc2hNYWtlclxuXG4gIGNvbnN0IGFsbEZpbGVzID0gZ2xvYlN5bmMoJyoqLyonLCB7XG4gICAgY3dkOiBmb2xkZXIsXG4gICAgZG90OiBmYWxzZSxcbiAgICBhYnNvbHV0ZTogdHJ1ZVxuICB9KVxuICAgIC5tYXAoKGZpbGUpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICghZnMuc3RhdFN5bmMoZmlsZSkuaXNGaWxlKCkpIHJldHVyblxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgY29uc3QgX2ZvbGRlciA9IGZvbGRlci5yZXBsYWNlKC9cXFxcL2dpLCAnLycpXG4gICAgICBjb25zdCBrZXkgPSBmaWxlLnJlcGxhY2UoX2ZvbGRlciwgJycpLnJlcGxhY2UoL15cXC8rLywgJycpXG4gICAgICByZXR1cm4ga2V5XG4gICAgfSlcbiAgICAuZmlsdGVyKCgkKSA9PiAhISQpIGFzIHN0cmluZ1tdXG5cbiAgY29uc3QgZW5zdXJlSWdub3JlUGF0dGVybiA9IGlnbm9yZVBhdHRlcm4gJiYgaWdub3JlUGF0dGVybiAhPT0gJycgPyBpZ25vcmVQYXR0ZXJuIDogZGVmYXVsdERjbElnbm9yZSgpXG4gIGNvbnN0IGlnID0gaWdub3JlKCkuYWRkKGVuc3VyZUlnbm9yZVBhdHRlcm4pXG4gIGNvbnN0IGZpbHRlcmVkRmlsZXMgPSBpZy5maWx0ZXIoYWxsRmlsZXMpXG5cbiAgY29uc3QgcmV0OiAoQ29udGVudE1hcHBpbmcgJiB7IG9yaWdpbmFsX3BhdGg6IHN0cmluZyB8IHVuZGVmaW5lZCB9KVtdID0gW11cblxuICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsdGVyZWRGaWxlcykge1xuICAgIGNvbnN0IGFic29sdXRlUGF0aCA9IHBhdGgucmVzb2x2ZShmb2xkZXIsIGZpbGUpXG4gICAgdHJ5IHtcbiAgICAgIGlmICghZnMuc3RhdFN5bmMoYWJzb2x1dGVQYXRoKS5pc0ZpbGUoKSkgY29udGludWVcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUubG9nKGVycilcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgY29uc3QgYWJzb2x1dGVGb2xkZXIgPSBmb2xkZXIucmVwbGFjZSgvXFxcXC9naSwgJy8nKVxuXG4gICAgY29uc3QgcmVsYXRpdmVGaWxlUGF0aFRvRm9sZGVyID0gZmlsZS5yZXBsYWNlKGFic29sdXRlRm9sZGVyLCAnJykucmVwbGFjZSgvXlxcLysvLCAnJylcblxuICAgIHJldC5wdXNoKHtcbiAgICAgIGZpbGU6IHJlbGF0aXZlRmlsZVBhdGhUb0ZvbGRlci50b0xvd2VyQ2FzZSgpLFxuICAgICAgb3JpZ2luYWxfcGF0aDogYWRkT3JpZ2luYWxQYXRoID8gYWJzb2x1dGVQYXRoIDogdW5kZWZpbmVkLFxuICAgICAgaGFzaDogaGFzaE1ha2VyKGFic29sdXRlUGF0aClcbiAgICB9KVxuICB9XG5cbiAgcmV0dXJuIHJldFxufVxuIl19
455
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5kcG9pbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZW5kcG9pbnRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRUEsMkNBQTRCO0FBQzVCLCtCQUF1QztBQUN2QywrQ0FBb0Q7QUFDcEQsMENBQW1GO0FBQ25GLG9EQUEyQjtBQUMzQix5REFBMkM7QUFDM0MseUNBQWlEO0FBRWpELDJCQUE2QjtBQUM3Qix1REFBNkQ7QUFFN0QsU0FBUyxjQUFjO0lBQ3JCLE9BQU8sSUFBSSxHQUFHLENBQUMsK0JBQStCLENBQUMsQ0FBQTtBQUNqRCxDQUFDO0FBRUQsU0FBUyxxQkFBcUIsQ0FBQyxJQUFZO0lBQ3pDLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQTtBQUNwRCxDQUFDO0FBTUQsU0FBZ0Isa0JBQWtCLENBQUMsVUFBeUIsRUFBRSxHQUFXLEVBQUUsTUFBaUM7SUFDMUcsTUFBTSxXQUFXLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQTtJQUV6QixNQUFNLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxLQUFLLElBQUksRUFBRTtRQUNuQyxPQUFPO1lBQ0wsT0FBTyxFQUFFLEVBQUUsY0FBYyxFQUFFLGtCQUFrQixFQUFFO1lBQy9DLElBQUksRUFBRSxVQUFVLENBQUMsRUFBRSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLFlBQVksQ0FBQyxDQUFDO1NBQ25FLENBQUE7SUFDSCxDQUFDLENBQUMsQ0FBQTtJQUVGLE1BQU0sQ0FBQyxHQUFHLENBQUMseUJBQXlCLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxFQUFFO1FBQ2xELE9BQU87WUFDTCxJQUFJLEVBQUU7Z0JBQ0o7b0JBQ0UsVUFBVSxFQUFFLFdBQVc7b0JBQ3ZCLEdBQUcsRUFBRSxVQUFVLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFO29CQUM3QixLQUFLLEVBQUUsTUFBTTtvQkFDYixVQUFVLEVBQUUsQ0FBQztvQkFDYixRQUFRLEVBQUUsR0FBRztvQkFDYixXQUFXLEVBQUUsRUFBRTtpQkFDaEI7YUFDRjtTQUNGLENBQUE7SUFDSCxDQUFDLENBQUMsQ0FBQTtJQUVGLE1BQU0sQ0FBQyxHQUFHLENBQUMsNEJBQTRCLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxFQUFFO1FBQ3JELE9BQU87WUFDTCxJQUFJLEVBQUU7Z0JBQ0o7b0JBQ0UsT0FBTyxFQUFFLFVBQVUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUU7b0JBQ2pDLEtBQUssRUFBRSw0Q0FBNEM7b0JBQ25ELEVBQUUsRUFBRSxvRUFBb0U7aUJBQ3pFO2FBQ0Y7U0FDRixDQUFBO0lBQ0gsQ0FBQyxDQUFDLENBQUE7SUFFRixNQUFNLENBQUMsR0FBRyxDQUFDLG1CQUFtQixFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEVBQUU7UUFDbEQsTUFBTSxPQUFPLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLFFBQVEsS0FBSyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksbUJBQW1CLENBQUE7UUFFdkUsSUFBSTtZQUNGLE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxzQkFBc0IsQ0FBQyxVQUFVLEVBQUU7Z0JBQ2hFLFdBQVc7Z0JBQ1gsT0FBTzthQUNSLENBQUMsQ0FBQTtZQUVGLElBQUksZ0JBQWdCLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtnQkFDakMsTUFBTSxXQUFXLEdBQUcsY0FBYyxFQUFFLENBQUE7Z0JBRXBDLE1BQU0sQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQTtnQkFDckMsQ0FBQyxDQUFDLElBQUksR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFBO2dCQUN6QixDQUFDLENBQUMsUUFBUSxHQUFHLFdBQVcsQ0FBQyxRQUFRLENBQUE7Z0JBQ2pDLENBQUMsQ0FBQyxJQUFJLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQTtnQkFDekIsTUFBTSxHQUFHLEdBQUcsTUFBTSxJQUFBLG9CQUFLLEVBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFO29CQUNwQyxPQUFPLEVBQUU7d0JBQ1AsVUFBVSxFQUFFLE9BQU87cUJBQ3BCO29CQUNELE1BQU0sRUFBRSxHQUFHLENBQUMsT0FBTyxDQUFDLE1BQU07b0JBQzFCLElBQUksRUFBRSxHQUFHLENBQUMsT0FBTyxDQUFDLE1BQU0sS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJO2lCQUNsRSxDQUFDLENBQUE7Z0JBRUYsTUFBTSxlQUFlLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBVSxDQUFBO2dCQUVuRCxJQUFJLENBQUEsZUFBZSxhQUFmLGVBQWUsdUJBQWYsZUFBZSxDQUFFLE1BQU0sTUFBSyxDQUFDLEVBQUU7b0JBQ2pDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFBO29CQUN6RixPQUFPO3dCQUNMLE9BQU8sRUFBRTs0QkFDUCxjQUFjLEVBQUUsR0FBRyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLElBQUksb0JBQW9CO3lCQUN4RTt3QkFDRCxJQUFJLEVBQUUsZUFBZTtxQkFDdEIsQ0FBQTtpQkFDRjthQUNGO1NBQ0Y7UUFBQyxPQUFPLEdBQUcsRUFBRTtZQUNaLE9BQU8sQ0FBQyxJQUFJLENBQUMsMERBQTBELEVBQUUsR0FBRyxDQUFDLENBQUE7U0FDOUU7UUFFRCxPQUFPLElBQUksRUFBRSxDQUFBO0lBQ2YsQ0FBQyxDQUFDLENBQUE7SUFFRixNQUFNLENBQUMsR0FBRyxDQUFDLGlCQUFpQixFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRTtRQUMxQyxNQUFNLFdBQVcsR0FBRyxjQUFjLEVBQUUsQ0FBQTtRQUNwQyxNQUFNLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUE7UUFDckMsQ0FBQyxDQUFDLElBQUksR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFBO1FBQ3pCLENBQUMsQ0FBQyxRQUFRLEdBQUcsV0FBVyxDQUFDLFFBQVEsQ0FBQTtRQUNqQyxDQUFDLENBQUMsSUFBSSxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUE7UUFDekIsTUFBTSxHQUFHLEdBQUcsTUFBTSxJQUFBLG9CQUFLLEVBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFO1lBQ3BDLE9BQU8sRUFBRTtnQkFDUCxVQUFVLEVBQUUsT0FBTzthQUNwQjtZQUNELE1BQU0sRUFBRSxHQUFHLENBQUMsT0FBTyxDQUFDLE1BQU07WUFDMUIsSUFBSSxFQUFFLEdBQUcsQ0FBQyxPQUFPLENBQUMsTUFBTSxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUk7U0FDbEUsQ0FBQyxDQUFBO1FBRUYsT0FBTztZQUNMLE9BQU8sRUFBRTtnQkFDUCxjQUFjLEVBQUUsR0FBRyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLElBQUksb0JBQW9CO2FBQ3hFO1lBQ0QsSUFBSSxFQUFFLEdBQUcsQ0FBQyxJQUFJO1NBQ2YsQ0FBQTtJQUNILENBQUMsQ0FBQyxDQUFBO0lBRUYsTUFBTSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUU7UUFDN0MsTUFBTSxXQUFXLEdBQUcsY0FBYyxFQUFFLENBQUE7UUFDcEMsTUFBTSxPQUFPLEdBQUcsSUFBSSxvQkFBTyxFQUFFLENBQUE7UUFDN0IsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFBO1FBQ2hDLE1BQU0sR0FBRyxHQUFHLE1BQU0sSUFBQSxvQkFBSyxFQUFDLEdBQUcsV0FBVyxDQUFDLFFBQVEsRUFBRSxtQkFBbUIsRUFBRTtZQUNwRSxNQUFNLEVBQUUsTUFBTTtZQUNkLE9BQU87WUFDUCxJQUFJLEVBQUUsR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJO1NBQ3ZCLENBQUMsQ0FBQTtRQUVGLE9BQU8sR0FBRyxDQUFBO0lBQ1osQ0FBQyxDQUFDLENBQUE7SUFFRixXQUFXLENBQUMsVUFBVSxFQUFFLEdBQUcsRUFBRSxNQUFNLENBQUMsQ0FBQTtJQUlwQyxZQUFZLENBQUMsVUFBVSxFQUFFLE1BQU0sRUFBRSxXQUFXLENBQUMsQ0FBQTtBQUMvQyxDQUFDO0FBeEhELGdEQXdIQztBQUVELFNBQVMsWUFBWSxDQUFDLFVBQXFDLEVBQUUsTUFBaUMsRUFBRSxXQUFxQjtJQUNuSCxNQUFNLENBQUMsR0FBRyxDQUFDLHlCQUF5QixFQUFFLEtBQUssRUFBRSxHQUFRLEVBQUUsSUFBUyxFQUFFLEVBQUU7UUFDbEUsSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDekQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUE7WUFHM0csSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFjLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRTtnQkFDdEUsT0FBTyxJQUFJLEVBQUUsQ0FBQTthQUNkO1lBRUQsT0FBTztnQkFDTCxPQUFPLEVBQUU7b0JBQ1AsYUFBYSxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUU7b0JBQ3pCLFFBQVEsRUFBRSxJQUFJO29CQUNkLGVBQWUsRUFBRSw0QkFBNEI7aUJBQzlDO2dCQUNELElBQUksRUFBRSxVQUFVLENBQUMsRUFBRSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQzthQUMvQyxDQUFBO1NBQ0Y7UUFFRCxPQUFPLElBQUksRUFBRSxDQUFBO0lBQ2YsQ0FBQyxDQUFDLENBQUE7SUFFRixLQUFLLFVBQVUscUJBQXFCLENBQUMsUUFBa0I7UUFDckQsSUFBSSxDQUFDLFFBQVEsSUFBSSxRQUFRLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUN0QyxPQUFPLEVBQUUsQ0FBQTtTQUNWO1FBRUQsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLEdBQUcsQ0FDL0IsUUFBUSxJQUFJLE9BQU8sUUFBUSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFFLFFBQXFCLENBQ3pGLENBQUE7UUFFRCxNQUFNLGNBQWMsR0FBRyxNQUFNLFlBQVksQ0FBQyxVQUFVLEVBQUU7WUFDcEQsV0FBVztZQUNYLFFBQVEsRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDO1NBQ3hDLENBQUMsQ0FBQTtRQUNGLE1BQU0sV0FBVyxHQUFHLGNBQWMsRUFBRSxDQUFBO1FBQ3BDLE1BQU0sTUFBTSxHQUFHLElBQUEsK0JBQW9CLEVBQ2pDLFdBQVcsQ0FBQyxRQUFRLEVBQUUsRUFDdEIsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQ3hELENBQUE7UUFFRCxNQUFNLGNBQWMsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQTtRQUUxRCxPQUFPLENBQUMsR0FBRyxjQUFjLEVBQUUsR0FBRyxjQUFjLENBQUMsQ0FBQTtJQUMvQyxDQUFDO0lBR0QsTUFBTSxDQUFDLEdBQUcsQ0FBQyx5QkFBeUIsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUU7UUFDbEQsT0FBTztZQUNMLElBQUksRUFBRSxNQUFNLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztTQUMxRSxDQUFBO0lBQ0gsQ0FBQyxDQUFDLENBQUE7SUFHRixNQUFNLENBQUMsSUFBSSxDQUFDLDBCQUEwQixFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRTtRQUNwRCxNQUFNLElBQUksR0FBRyxNQUFNLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUE7UUFDckMsT0FBTztZQUNMLElBQUksRUFBRSxNQUFNLHFCQUFxQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7U0FDakQsQ0FBQTtJQUNILENBQUMsQ0FBQyxDQUFBO0lBRUYsTUFBTSxDQUFDLEdBQUcsQ0FBQyx3QkFBd0IsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUU7UUFDakQsTUFBTSxPQUFPLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLFFBQVEsS0FBSyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksbUJBQW1CLENBQUE7UUFDdkUsTUFBTSxTQUFTLEdBQUcsTUFBTSxzQkFBc0IsQ0FBQyxVQUFVLEVBQUU7WUFDekQsT0FBTztZQUNQLFdBQVc7U0FDWixDQUFDLENBQUE7UUFDRixNQUFNLFVBQVUsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQTtRQUNoQyxPQUFPO1lBQ0wsSUFBSSxFQUFFO2dCQUNKLEVBQUUsRUFBRSxJQUFJO2dCQUNSLElBQUksRUFBRSxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQyxRQUFRLGFBQVIsUUFBUSx1QkFBUixRQUFRLENBQUUsSUFBSSxDQUFDLEtBQUssVUFBVSxDQUFDO2FBQzNGO1NBQ0YsQ0FBQTtJQUNILENBQUMsQ0FBQyxDQUFBO0lBRUYsTUFBTSxDQUFDLEdBQUcsQ0FBQyxvQkFBb0IsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUU7UUFDN0MsTUFBTSxPQUFPLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLFFBQVEsS0FBSyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksbUJBQW1CLENBQUE7UUFDdkUsT0FBTztZQUNMLElBQUksRUFBRTtnQkFDSixFQUFFLEVBQUUsSUFBSTtnQkFDUixJQUFJLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQyxVQUFVLEVBQUUsRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLENBQUM7YUFDekU7U0FDRixDQUFBO0lBQ0gsQ0FBQyxDQUFDLENBQUE7QUFDSixDQUFDO0FBRUQsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLEdBQVcsRUFBRSxFQUFFLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFBO0FBRXRGLEtBQUssVUFBVSxzQkFBc0IsQ0FDbkMsVUFBcUMsRUFDckMsRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUE4QztJQUVwRSxNQUFNLGlCQUFpQixHQUFhLEVBQUUsQ0FBQTtJQUN0QyxLQUFLLE1BQU0sV0FBVyxJQUFJLFdBQVcsRUFBRTtRQUNyQyxNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLGVBQWUsQ0FBQyxDQUFBO1FBQ25FLElBQUksTUFBTSxVQUFVLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFO1lBQ3BELGlCQUFpQixDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFBO1NBQ3pDO0tBQ0Y7SUFFRCxNQUFNLEdBQUcsR0FBc0IsRUFBRSxDQUFBO0lBQ2pDLEtBQUssTUFBTSxnQkFBZ0IsSUFBSSxpQkFBaUIsRUFBRTtRQUNoRCxJQUFJO1lBQ0YsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLGFBQWEsQ0FBQyxVQUFVLEVBQUUsRUFBRSxnQkFBZ0IsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUE7U0FDekU7UUFBQyxPQUFPLEdBQUcsRUFBRTtZQUNaLE9BQU8sQ0FBQyxLQUFLLENBQUMsOEJBQThCLGdCQUFnQixnREFBZ0QsRUFBRSxHQUFHLENBQUMsQ0FBQTtTQUNuSDtLQUNGO0lBQ0QsT0FBTyxHQUFHLENBQUE7QUFDWixDQUFDO0FBRUQsS0FBSyxVQUFVLGFBQWEsQ0FDMUIsVUFBcUMsRUFDckMsRUFBRSxnQkFBZ0IsRUFBRSxPQUFPLEVBQWlEOztJQUU1RSxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUE7SUFDbEQsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sVUFBVSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUE7SUFFNUYsSUFBSSxDQUFDLGtCQUFZLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxFQUFFO1FBQ3hDLE1BQU0sTUFBTSxHQUFHLENBQUMsa0JBQVksQ0FBQyxRQUFRLENBQUMsTUFBTSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQTtRQUVqRyxPQUFPLENBQUMsS0FBSyxDQUFDLDZEQUE2RCxFQUFFLE1BQU0sQ0FBQyxDQUFBO1FBQ3BGLE1BQU0sSUFBSSxLQUFLLENBQUMsMEJBQTBCLGdCQUFnQixHQUFHLENBQUMsQ0FBQTtLQUMvRDtJQUVELE1BQU0sV0FBVyxHQUFHLE1BQU0sa0JBQWtCLENBQUMsVUFBVSxFQUFFO1FBQ3ZELE1BQU0sRUFBRSxXQUFXO1FBQ25CLGVBQWUsRUFBRSxLQUFLO0tBQ3ZCLENBQUMsQ0FBQTtJQUVGLE1BQU0saUJBQWlCLEdBQUcsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQSxDQUFDLGFBQUQsQ0FBQyx1QkFBRCxDQUFDLENBQUUsSUFBSSxNQUFLLGVBQWUsQ0FBQyxDQUFBO0lBQ2hGLE1BQU0sU0FBUyxHQUNiLGlCQUFpQixDQUFDLE1BQU0sR0FBRyxDQUFDLEtBQUksTUFBQSxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsMENBQUUsSUFBSSxDQUFBLElBQUksR0FBRyxPQUFPLElBQUksaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUE7SUFFekcsTUFBTSxVQUFVLEdBQUcsMENBQTBDLENBQUE7SUFFN0QsTUFBTSxlQUFlLEdBQUcsWUFBWSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUMsY0FBYyxFQUFFLEVBQUUsQ0FBQyxpQ0FDN0UsY0FBYyxLQUNqQixRQUFRLEVBQUUsUUFBUSxjQUFjLENBQUMsUUFBUSxFQUFFLEVBQzNDLFFBQVEsRUFBRSxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ2hDLEdBQUcsRUFBRSxRQUFRLENBQUMsYUFBRCxDQUFDLHVCQUFELENBQUMsQ0FBRSxJQUFJLEVBQUU7WUFDdEIsR0FBRyxFQUFFLEdBQUcsT0FBTyxJQUFJLENBQUMsYUFBRCxDQUFDLHVCQUFELENBQUMsQ0FBRSxJQUFJLEVBQUU7WUFDNUIsSUFBSSxFQUFFLENBQUMsYUFBRCxDQUFDLHVCQUFELENBQUMsQ0FBRSxJQUFJO1NBQ2QsQ0FBQyxDQUFDLElBQ0gsQ0FBQyxDQUFBO0lBRUgsT0FBTztRQUNMLEVBQUUsRUFBRSxVQUFVO1FBQ2QsTUFBTSxFQUFFLFlBQVksQ0FBQyxNQUFNO1FBQzNCLElBQUksRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQWMsRUFBRSxJQUFJLEVBQUUsWUFBWSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3pELFdBQVcsRUFBRSxZQUFZLENBQUMsV0FBVztRQUNyQyxTQUFTLEVBQUUsU0FBUyxJQUFJLEVBQUU7UUFDMUIsS0FBSyxFQUFFLFNBQVMsSUFBSSxFQUFFO1FBQ3RCLGlCQUFpQixFQUFFLEtBQUs7UUFDeEIsT0FBTyxFQUFFLEdBQUcsT0FBTyxHQUFHO1FBQ3RCLElBQUksRUFBRSxZQUFZLENBQUMsSUFBSSxJQUFJLEVBQUU7UUFDN0IsSUFBSSxFQUFFO1lBQ0osUUFBUSxFQUFFLFlBQVksQ0FBQyxJQUFJLENBQUMsUUFBUTtZQUNwQyxRQUFRLEVBQUUsRUFBRTtZQUNaLEtBQUssRUFBRSxFQUFFO1lBQ1QsSUFBSSxFQUFFLEVBQUU7WUFDUixlQUFlLEVBQUUsZUFBc0I7U0FFeEM7S0FDRixDQUFBO0FBQ0gsQ0FBQztBQUVELEtBQUssVUFBVSxZQUFZLENBQ3pCLFVBQXFDLEVBQ3JDLEVBQ0UsV0FBVyxFQUNYLFFBQVEsRUFDUixlQUFlLEVBS2hCO0lBRUQsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLEdBQUcsQ0FBUyxRQUFRLENBQUMsQ0FBQTtJQUNuRCxNQUFNLGNBQWMsR0FBYSxFQUFFLENBQUE7SUFFbkMsTUFBTSxjQUFjLEdBQUcsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUN0QyxXQUFXLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsRUFBRTtRQUMvQixPQUFPLGtCQUFrQixDQUFDLFVBQVUsRUFBRTtZQUNwQyxNQUFNO1lBQ04sZUFBZSxFQUFFLEtBQUs7WUFDdEIsZUFBZTtTQUNoQixDQUFDLENBQUE7SUFDSixDQUFDLENBQUMsQ0FDSCxDQUFBO0lBRUQsS0FBSyxNQUFNLE9BQU8sSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEVBQUU7UUFFbkQsTUFBTSxhQUFhLEdBQUcsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUE7UUFDbkYsSUFBSSxhQUFhLEVBQUU7WUFHakIsYUFBYSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO1lBR2xFLGNBQWMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUE7U0FDbkM7S0FDRjtJQUVELE9BQU8sY0FBYyxDQUFBO0FBQ3ZCLENBQUM7QUFFRCxTQUFTLFdBQVcsQ0FBQyxVQUFxQyxFQUFFLEdBQVcsRUFBRSxNQUFpQztJQUN4RyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUMxQixPQUFPLENBQUMsT0FBTyxDQUFDLHVCQUF1QixFQUFFO1FBQ3ZDLEtBQUssRUFBRSxDQUFDLEdBQUcsQ0FBQztLQUNiLENBQUMsQ0FDSCxDQUFBO0lBQ0QsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUN0QyxPQUFPLENBQUMsT0FBTyxDQUFDLDRCQUE0QixFQUFFO1FBQzVDLEtBQUssRUFBRSxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUM7S0FDdEIsQ0FBQyxDQUNILENBQUE7SUFFRCxNQUFNLDJCQUEyQixHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsbUJBQW1CLEVBQUUsaUJBQWlCLENBQUMsQ0FBQTtJQUN4RixNQUFNLGtDQUFrQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsbUJBQW1CLEVBQUUsUUFBUSxFQUFFLHNCQUFzQixDQUFDLENBQUE7SUFFOUcsTUFBTSxNQUFNLEdBQUc7UUFDYjtZQUNFLEtBQUssRUFBRSxHQUFHO1lBQ1YsSUFBSSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsbUJBQW1CLEVBQUUsY0FBYyxDQUFDO1lBQ3ZELElBQUksRUFBRSxXQUFXO1NBQ2xCO1FBQ0Q7WUFDRSxLQUFLLEVBQUUsY0FBYztZQUNyQixJQUFJLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsRUFBRSxhQUFhLENBQUM7WUFDdEQsSUFBSSxFQUFFLFdBQVc7U0FDbEI7UUFDRDtZQUNFLEtBQUssRUFBRSxzQkFBc0I7WUFDN0IsSUFBSSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsbUJBQW1CLEVBQUUsVUFBVSxDQUFDO1lBQ25ELElBQUksRUFBRSxpQkFBaUI7U0FDeEI7S0FDRixDQUFBO0lBRUQsS0FBSyxNQUFNLEtBQUssSUFBSSxNQUFNLEVBQUU7UUFDMUIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsRUFBRTtZQUNyQyxPQUFPO2dCQUNMLE9BQU8sRUFBRSxFQUFFLGNBQWMsRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFO2dCQUN2QyxJQUFJLEVBQUUsVUFBVSxDQUFDLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDO2FBQ2pELENBQUE7UUFDSCxDQUFDLENBQUMsQ0FBQTtLQUNIO0lBRUQsU0FBUyxrQkFBa0IsQ0FDekIsVUFBcUMsRUFDckMsS0FBYSxFQUNiLE1BQWMsRUFDZCxZQUFZLENBQUMsR0FBVyxFQUFFLEVBQUUsQ0FBQyxHQUFHO1FBRWhDLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEVBQUU7WUFDcEMsTUFBTSxJQUFJLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUE7WUFDNUIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUE7WUFHdEQsSUFBSSxDQUFDLENBQUMsTUFBTSxVQUFVLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFO2dCQUMvQyxPQUFPLElBQUksRUFBRSxDQUFBO2FBQ2Q7WUFFRCxNQUFNLE9BQU8sR0FBd0I7Z0JBQ25DLGFBQWEsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFO2dCQUN6QixRQUFRLEVBQUUsSUFBSTtnQkFDZCxlQUFlLEVBQUUsNEJBQTRCO2FBQzlDLENBQUE7WUFFRCxJQUFJLFFBQVEsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUU7Z0JBQzlCLE9BQU8sQ0FBQyxjQUFjLENBQUMsR0FBRyxrQkFBa0IsQ0FBQTthQUM3QztZQUVELE9BQU87Z0JBQ0wsT0FBTztnQkFDUCxJQUFJLEVBQUUsVUFBVSxDQUFDLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUM7YUFDL0MsQ0FBQTtRQUNILENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUVELGtCQUFrQixDQUFDLFVBQVUsRUFBRSxxQ0FBcUMsRUFBRSxrQ0FBa0MsQ0FBQyxDQUFBO0lBQ3pHLGtCQUFrQixDQUFDLFVBQVUsRUFBRSx5QkFBeUIsRUFBRSwyQkFBMkIsQ0FBQyxDQUFBO0lBQ3RGLGtCQUFrQixDQUFDLFVBQVUsRUFBRSxvQkFBb0IsRUFBRSxtQkFBbUIsRUFBRSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQTtJQUV0SCxNQUFNLENBQUMsR0FBRyxDQUFDLHNCQUFzQixFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRTtRQUMvQyxNQUFNLEdBQUcsR0FBRyxNQUFNLElBQUEsb0JBQUssRUFBQywyQ0FBMkMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUNwRixPQUFPLEVBQUU7Z0JBQ1AsVUFBVSxFQUFFLE9BQU87YUFDcEI7U0FDRixDQUFDLENBQUE7UUFDRixPQUFPO1lBQ0wsSUFBSSxFQUFFLE1BQU0sR0FBRyxDQUFDLFdBQVcsRUFBRTtTQUM5QixDQUFBO0lBQ0gsQ0FBQyxDQUFDLENBQUE7QUFDSixDQUFDO0FBRUQsS0FBSyxVQUFVLGtCQUFrQixDQUMvQixVQUFxQyxFQUNyQyxFQUNFLE1BQU0sRUFDTixlQUFlLEVBQ2YsZUFBZSxFQUtoQjtJQUVELE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLGNBQWMsQ0FBQyxDQUFBO0lBQzFELElBQUksYUFBYSxHQUFHLElBQUksQ0FBQTtJQUV4QixNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLGlCQUFpQixDQUFDLENBQUE7SUFDaEUsSUFBSSxNQUFNLFVBQVUsQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLEVBQUU7UUFDcEQsSUFBSTtZQUNGLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxVQUFVLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFBO1lBQ3hGLElBQUksQ0FBQyxrQkFBWSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsRUFBRTtnQkFDeEMsTUFBTSxNQUFNLEdBQUcsQ0FBQyxrQkFBWSxDQUFDLFFBQVEsQ0FBQyxNQUFNLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFBO2dCQUVqRyxPQUFPLENBQUMsS0FBSyxDQUFDLDZEQUE2RCxFQUFFLE1BQU0sQ0FBQyxDQUFBO2dCQUNwRixPQUFPLENBQUMsS0FBSyxDQUFDLDBCQUEwQixnQkFBZ0IsR0FBRyxDQUFDLENBQUE7YUFDN0Q7aUJBQU07Z0JBQ0wsYUFBYSxHQUFHLEtBQUssQ0FBQTthQUN0QjtTQUNGO1FBQUMsT0FBTyxHQUFHLEVBQUU7WUFDWixPQUFPLENBQUMsS0FBSyxDQUFDLHVDQUF1QyxFQUFFLEdBQUcsQ0FBQyxDQUFBO1NBQzVEO0tBQ0Y7SUFFRCxNQUFNLFNBQVMsR0FBRyxlQUFlLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUE7SUFFdEUsSUFBSSxDQUFDLE1BQU0sVUFBVSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLENBQUMsSUFBSSxhQUFhLEVBQUU7UUFDcEUsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLFVBQVUsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLGFBQWEsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFBO1FBQ2xGLE1BQU0sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLEdBQXdDLFNBQVMsQ0FBQyxLQUFLLENBQUE7UUFDOUUsTUFBTSxRQUFRLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQTtRQUNsQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQ2xCLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUV2QyxNQUFNLFdBQVcsR0FBRyxNQUFNLGtCQUFrQixDQUFDLFVBQVUsRUFBRTtZQUN2RCxNQUFNO1lBQ04sZUFBZTtZQUNmLGVBQWU7U0FDaEIsQ0FBQyxDQUFBO1FBRUYsT0FBTztZQUNMLE9BQU8sRUFBRSxJQUFJO1lBQ2IsSUFBSSxFQUFFLG9CQUFVLENBQUMsS0FBSztZQUN0QixFQUFFLEVBQUUsU0FBUyxDQUFDLE1BQU0sQ0FBQztZQUNyQixRQUFRLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7WUFDOUIsU0FBUyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDckIsUUFBUSxFQUFFLFNBQVM7WUFDbkIsT0FBTyxFQUFFLFdBQVc7U0FDckIsQ0FBQTtLQUNGO0lBRUQsT0FBTyxJQUFJLENBQUE7QUFDYixDQUFDO0FBRU0sS0FBSyxVQUFVLGtCQUFrQixDQUN0QyxVQUFxQyxFQUNyQyxFQUNFLE1BQU0sRUFDTixlQUFlLEVBQ2YsZUFBZSxFQUtoQjtJQUVELE1BQU0sU0FBUyxHQUFHLGVBQWUsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQTtJQUN0RSxNQUFNLGNBQWMsR0FBRyxNQUFNLElBQUEsaUNBQW9CLEVBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxDQUFBO0lBRXJFLE1BQU0sUUFBUSxHQUFHLElBQUEsV0FBUSxFQUFDLE1BQU0sRUFBRTtRQUNoQyxNQUFNLEVBQUUsY0FBYztRQUN0QixHQUFHLEVBQUUsTUFBTTtRQUNYLEdBQUcsRUFBRSxLQUFLO1FBQ1YsUUFBUSxFQUFFLElBQUk7S0FDZixDQUFDO1NBQ0MsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7UUFDWixJQUFJO1lBQ0YsSUFBSSxDQUFDLElBQUEsYUFBUSxFQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRTtnQkFBRSxPQUFNO1NBQ3JDO1FBQUMsT0FBTyxHQUFHLEVBQUU7WUFDWixPQUFNO1NBQ1A7UUFDRCxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQTtRQUMzQyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFBO1FBQ3pELE9BQU8sR0FBRyxDQUFBO0lBQ1osQ0FBQyxDQUFDO1NBQ0QsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFhLENBQUE7SUFFakMsTUFBTSxFQUFFLEdBQUcsSUFBQSxnQkFBTSxHQUFFLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFBO0lBQ3ZDLE1BQU0sYUFBYSxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUE7SUFFekMsTUFBTSxHQUFHLEdBQStELEVBQUUsQ0FBQTtJQUUxRSxLQUFLLE1BQU0sSUFBSSxJQUFJLGFBQWEsRUFBRTtRQUNoQyxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQTtRQUMvQyxJQUFJO1lBQ0YsSUFBSSxDQUFDLElBQUEsYUFBUSxFQUFDLFlBQVksQ0FBQyxDQUFDLE1BQU0sRUFBRTtnQkFBRSxTQUFRO1NBQy9DO1FBQUMsT0FBTyxHQUFHLEVBQUU7WUFDWixPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFBO1lBQ2xCLFNBQVE7U0FDVDtRQUVELE1BQU0sY0FBYyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFBO1FBRWxELE1BQU0sd0JBQXdCLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLEVBQUUsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQTtRQUVyRixHQUFHLENBQUMsSUFBSSxDQUFDO1lBQ1AsSUFBSSxFQUFFLHdCQUF3QixDQUFDLFdBQVcsRUFBRTtZQUM1QyxhQUFhLEVBQUUsZUFBZSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFNBQVM7WUFDekQsSUFBSSxFQUFFLFNBQVMsQ0FBQyxZQUFZLENBQUM7U0FDOUIsQ0FBQyxDQUFBO0tBQ0g7SUFFRCxPQUFPLEdBQUcsQ0FBQTtBQUNaLENBQUM7QUEzREQsZ0RBMkRDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUm91dGVyIH0gZnJvbSAnQHdlbGwta25vd24tY29tcG9uZW50cy9odHRwLXNlcnZlcidcbmltcG9ydCB7IFByZXZpZXdDb21wb25lbnRzIH0gZnJvbSAnLi90eXBlcydcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCdcbmltcG9ydCB7IHN5bmMgYXMgZ2xvYlN5bmMgfSBmcm9tICdnbG9iJ1xuaW1wb3J0IHsgV2VhcmFibGVKc29uIH0gZnJvbSAnQGRjbC9zY2hlbWFzL2Rpc3Qvc2RrJ1xuaW1wb3J0IHsgQ29udGVudE1hcHBpbmcsIEVudGl0eSwgRW50aXR5VHlwZSwgTG9jYWxlLCBXZWFyYWJsZSB9IGZyb20gJ0BkY2wvc2NoZW1hcydcbmltcG9ydCBpZ25vcmUgZnJvbSAnaWdub3JlJ1xuaW1wb3J0IGZldGNoLCB7IEhlYWRlcnMgfSBmcm9tICdub2RlLWZldGNoJ1xuaW1wb3J0IHsgZmV0Y2hFbnRpdHlCeVBvaW50ZXIgfSBmcm9tICcuL2NhdGFseXN0J1xuaW1wb3J0IHsgQ2xpQ29tcG9uZW50cyB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMnXG5pbXBvcnQgeyBzdGF0U3luYyB9IGZyb20gJ2ZzJ1xuaW1wb3J0IHsgZ2V0RENMSWdub3JlUGF0dGVybnMgfSBmcm9tICcuLi8uLi91dGlscy9kY2wtaWdub3JlJ1xuXG5mdW5jdGlvbiBnZXRDYXRhbHlzdFVybCgpOiBVUkwge1xuICByZXR1cm4gbmV3IFVSTCgnaHR0cHM6Ly9wZWVyLmRlY2VudHJhbGFuZC5vcmcnKVxufVxuXG5mdW5jdGlvbiBzbWFydFdlYXJhYmxlTmFtZVRvSWQobmFtZTogc3RyaW5nKSB7XG4gIHJldHVybiBuYW1lLnRvTG9jYWxlTG93ZXJDYXNlKCkucmVwbGFjZSgvIC9nLCAnLScpXG59XG5cbnR5cGUgTGFtYmRhc1dlYXJhYmxlID0gV2VhcmFibGUgJiB7XG4gIGJhc2VVcmw6IHN0cmluZ1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0dXBFY3M2RW5kcG9pbnRzKGNvbXBvbmVudHM6IENsaUNvbXBvbmVudHMsIGRpcjogc3RyaW5nLCByb3V0ZXI6IFJvdXRlcjxQcmV2aWV3Q29tcG9uZW50cz4pIHtcbiAgY29uc3QgYmFzZUZvbGRlcnMgPSBbZGlyXVxuICAvLyBoYW5kbGUgb2xkIHByZXZpZXcgc2NlbmUuanNvblxuICByb3V0ZXIuZ2V0KCcvc2NlbmUuanNvbicsIGFzeW5jICgpID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgaGVhZGVyczogeyAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiBjb21wb25lbnRzLmZzLmNyZWF0ZVJlYWRTdHJlYW0ocGF0aC5qb2luKGRpciwgJ3NjZW5lLmpzb24nKSlcbiAgICB9XG4gIH0pXG5cbiAgcm91dGVyLmdldCgnL2xhbWJkYXMvZXhwbG9yZS9yZWFsbXMnLCBhc3luYyAoY3R4KSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGJvZHk6IFtcbiAgICAgICAge1xuICAgICAgICAgIHNlcnZlck5hbWU6ICdsb2NhbGhvc3QnLFxuICAgICAgICAgIHVybDogYGh0dHA6Ly8ke2N0eC51cmwuaG9zdH1gLFxuICAgICAgICAgIGxheWVyOiAnc3R1YicsXG4gICAgICAgICAgdXNlcnNDb3VudDogMCxcbiAgICAgICAgICBtYXhVc2VyczogMTAwLFxuICAgICAgICAgIHVzZXJQYXJjZWxzOiBbXVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfVxuICB9KVxuXG4gIHJvdXRlci5nZXQoJy9sYW1iZGFzL2NvbnRyYWN0cy9zZXJ2ZXJzJywgYXN5bmMgKGN0eCkgPT4ge1xuICAgIHJldHVybiB7XG4gICAgICBib2R5OiBbXG4gICAgICAgIHtcbiAgICAgICAgICBhZGRyZXNzOiBgaHR0cDovLyR7Y3R4LnVybC5ob3N0fWAsXG4gICAgICAgICAgb3duZXI6ICcweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnLFxuICAgICAgICAgIGlkOiAnMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwJ1xuICAgICAgICB9XG4gICAgICBdXG4gICAgfVxuICB9KVxuXG4gIHJvdXRlci5nZXQoJy9sYW1iZGFzL3Byb2ZpbGVzJywgYXN5bmMgKGN0eCwgbmV4dCkgPT4ge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBgJHtjdHgudXJsLnByb3RvY29sfS8vJHtjdHgudXJsLmhvc3R9L2NvbnRlbnQvY29udGVudHNgXG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcHJldmlld1dlYXJhYmxlcyA9IGF3YWl0IGdldEFsbFByZXZpZXdXZWFyYWJsZXMoY29tcG9uZW50cywge1xuICAgICAgICBiYXNlRm9sZGVycyxcbiAgICAgICAgYmFzZVVybFxuICAgICAgfSlcblxuICAgICAgaWYgKHByZXZpZXdXZWFyYWJsZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIGNvbnN0IGNhdGFseXN0VXJsID0gZ2V0Q2F0YWx5c3RVcmwoKVxuXG4gICAgICAgIGNvbnN0IHUgPSBuZXcgVVJMKGN0eC51cmwudG9TdHJpbmcoKSlcbiAgICAgICAgdS5ob3N0ID0gY2F0YWx5c3RVcmwuaG9zdFxuICAgICAgICB1LnByb3RvY29sID0gY2F0YWx5c3RVcmwucHJvdG9jb2xcbiAgICAgICAgdS5wb3J0ID0gY2F0YWx5c3RVcmwucG9ydFxuICAgICAgICBjb25zdCByZXEgPSBhd2FpdCBmZXRjaCh1LnRvU3RyaW5nKCksIHtcbiAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICBjb25uZWN0aW9uOiAnY2xvc2UnXG4gICAgICAgICAgfSxcbiAgICAgICAgICBtZXRob2Q6IGN0eC5yZXF1ZXN0Lm1ldGhvZCxcbiAgICAgICAgICBib2R5OiBjdHgucmVxdWVzdC5tZXRob2QgPT09ICdnZXQnID8gdW5kZWZpbmVkIDogY3R4LnJlcXVlc3QuYm9keVxuICAgICAgICB9KVxuXG4gICAgICAgIGNvbnN0IGRlcGxveWVkUHJvZmlsZSA9IChhd2FpdCByZXEuanNvbigpKSBhcyBhbnlbXVxuXG4gICAgICAgIGlmIChkZXBsb3llZFByb2ZpbGU/Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgIGRlcGxveWVkUHJvZmlsZVswXS5hdmF0YXJzWzBdLmF2YXRhci53ZWFyYWJsZXMucHVzaCguLi5wcmV2aWV3V2VhcmFibGVzLm1hcCgoJCkgPT4gJC5pZCkpXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6IHJlcS5oZWFkZXJzLmdldCgnY29udGVudC10eXBlJykgfHwgJ2FwcGxpY2F0aW9uL2JpbmFyeSdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBib2R5OiBkZXBsb3llZFByb2ZpbGVcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUud2FybihgRmFpbGVkIHRvIGNhdGNoIHByb2ZpbGUgYW5kIGZpbGwgd2l0aCBwcmV2aWV3IHdlYXJhYmxlcy5gLCBlcnIpXG4gICAgfVxuXG4gICAgcmV0dXJuIG5leHQoKVxuICB9KVxuXG4gIHJvdXRlci5hbGwoJy9sYW1iZGFzLzpwYXRoKycsIGFzeW5jIChjdHgpID0+IHtcbiAgICBjb25zdCBjYXRhbHlzdFVybCA9IGdldENhdGFseXN0VXJsKClcbiAgICBjb25zdCB1ID0gbmV3IFVSTChjdHgudXJsLnRvU3RyaW5nKCkpXG4gICAgdS5ob3N0ID0gY2F0YWx5c3RVcmwuaG9zdFxuICAgIHUucHJvdG9jb2wgPSBjYXRhbHlzdFVybC5wcm90b2NvbFxuICAgIHUucG9ydCA9IGNhdGFseXN0VXJsLnBvcnRcbiAgICBjb25zdCByZXEgPSBhd2FpdCBmZXRjaCh1LnRvU3RyaW5nKCksIHtcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgY29ubmVjdGlvbjogJ2Nsb3NlJ1xuICAgICAgfSxcbiAgICAgIG1ldGhvZDogY3R4LnJlcXVlc3QubWV0aG9kLFxuICAgICAgYm9keTogY3R4LnJlcXVlc3QubWV0aG9kID09PSAnZ2V0JyA/IHVuZGVmaW5lZCA6IGN0eC5yZXF1ZXN0LmJvZHlcbiAgICB9KVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgJ2NvbnRlbnQtdHlwZSc6IHJlcS5oZWFkZXJzLmdldCgnY29udGVudC10eXBlJykgfHwgJ2FwcGxpY2F0aW9uL2JpbmFyeSdcbiAgICAgIH0sXG4gICAgICBib2R5OiByZXEuYm9keVxuICAgIH1cbiAgfSlcblxuICByb3V0ZXIucG9zdCgnL2NvbnRlbnQvZW50aXRpZXMnLCBhc3luYyAoY3R4KSA9PiB7XG4gICAgY29uc3QgY2F0YWx5c3RVcmwgPSBnZXRDYXRhbHlzdFVybCgpXG4gICAgY29uc3QgaGVhZGVycyA9IG5ldyBIZWFkZXJzKClcbiAgICBjb25zb2xlLmxvZyhjdHgucmVxdWVzdC5oZWFkZXJzKVxuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKGAke2NhdGFseXN0VXJsLnRvU3RyaW5nKCl9L2NvbnRlbnQvZW50aXRpZXNgLCB7XG4gICAgICBtZXRob2Q6ICdwb3N0JyxcbiAgICAgIGhlYWRlcnMsXG4gICAgICBib2R5OiBjdHgucmVxdWVzdC5ib2R5XG4gICAgfSlcblxuICAgIHJldHVybiByZXNcbiAgfSlcblxuICBzZXJ2ZVN0YXRpYyhjb21wb25lbnRzLCBkaXIsIHJvdXRlcilcblxuICAvLyBUT0RPOiBnZXQgd29ya3NwYWNlIHNjZW5lcyAmIHdlYXJhYmxlcy4uLlxuXG4gIHNlcnZlRm9sZGVycyhjb21wb25lbnRzLCByb3V0ZXIsIGJhc2VGb2xkZXJzKVxufVxuXG5mdW5jdGlvbiBzZXJ2ZUZvbGRlcnMoY29tcG9uZW50czogUGljazxDbGlDb21wb25lbnRzLCAnZnMnPiwgcm91dGVyOiBSb3V0ZXI8UHJldmlld0NvbXBvbmVudHM+LCBiYXNlRm9sZGVyczogc3RyaW5nW10pIHtcbiAgcm91dGVyLmdldCgnL2NvbnRlbnQvY29udGVudHMvOmhhc2gnLCBhc3luYyAoY3R4OiBhbnksIG5leHQ6IGFueSkgPT4ge1xuICAgIGlmIChjdHgucGFyYW1zLmhhc2ggJiYgY3R4LnBhcmFtcy5oYXNoLnN0YXJ0c1dpdGgoJ2I2NC0nKSkge1xuICAgICAgY29uc3QgZnVsbFBhdGggPSBwYXRoLnJlc29sdmUoQnVmZmVyLmZyb20oY3R4LnBhcmFtcy5oYXNoLnJlcGxhY2UoL15iNjQtLywgJycpLCAnYmFzZTY0JykudG9TdHJpbmcoJ3V0ZjgnKSlcblxuICAgICAgLy8gb25seSByZXR1cm4gZmlsZXMgSUYgdGhlIGZpbGUgaXMgd2l0aGluIGEgYmFzZUZvbGRlclxuICAgICAgaWYgKCFiYXNlRm9sZGVycy5maW5kKChmb2xkZXI6IHN0cmluZykgPT4gZnVsbFBhdGguc3RhcnRzV2l0aChmb2xkZXIpKSkge1xuICAgICAgICByZXR1cm4gbmV4dCgpXG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAneC10aW1lc3RhbXAnOiBEYXRlLm5vdygpLFxuICAgICAgICAgICd4LXNlbnQnOiB0cnVlLFxuICAgICAgICAgICdjYWNoZS1jb250cm9sJzogJ25vLWNhY2hlLHByaXZhdGUsbWF4LWFnZT0xJ1xuICAgICAgICB9LFxuICAgICAgICBib2R5OiBjb21wb25lbnRzLmZzLmNyZWF0ZVJlYWRTdHJlYW0oZnVsbFBhdGgpXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG5leHQoKVxuICB9KVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHBvaW50ZXJSZXF1ZXN0SGFuZGxlcihwb2ludGVyczogc3RyaW5nW10pIHtcbiAgICBpZiAoIXBvaW50ZXJzIHx8IHBvaW50ZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtdXG4gICAgfVxuXG4gICAgY29uc3QgcmVxdWVzdGVkUG9pbnRlcnMgPSBuZXcgU2V0PHN0cmluZz4oXG4gICAgICBwb2ludGVycyAmJiB0eXBlb2YgcG9pbnRlcnMgPT09ICdzdHJpbmcnID8gW3BvaW50ZXJzIGFzIHN0cmluZ10gOiAocG9pbnRlcnMgYXMgc3RyaW5nW10pXG4gICAgKVxuXG4gICAgY29uc3QgcmVzdWx0RW50aXRpZXMgPSBhd2FpdCBnZXRTY2VuZUpzb24oY29tcG9uZW50cywge1xuICAgICAgYmFzZUZvbGRlcnMsXG4gICAgICBwb2ludGVyczogQXJyYXkuZnJvbShyZXF1ZXN0ZWRQb2ludGVycylcbiAgICB9KVxuICAgIGNvbnN0IGNhdGFseXN0VXJsID0gZ2V0Q2F0YWx5c3RVcmwoKVxuICAgIGNvbnN0IHJlbW90ZSA9IGZldGNoRW50aXR5QnlQb2ludGVyKFxuICAgICAgY2F0YWx5c3RVcmwudG9TdHJpbmcoKSxcbiAgICAgIHBvaW50ZXJzLmZpbHRlcigoJDogc3RyaW5nKSA9PiAhJC5tYXRjaCgvLT9cXGQrLC0/XFxkKy8pKVxuICAgIClcblxuICAgIGNvbnN0IHNlcnZlckVudGl0aWVzID0gQXJyYXkuaXNBcnJheShyZW1vdGUpID8gcmVtb3RlIDogW11cblxuICAgIHJldHVybiBbLi4ucmVzdWx0RW50aXRpZXMsIC4uLnNlcnZlckVudGl0aWVzXVxuICB9XG5cbiAgLy8gUkVWSUVXIFJFU1BPTlNFIEZPUk1BVFxuICByb3V0ZXIuZ2V0KCcvY29udGVudC9lbnRpdGllcy9zY2VuZScsIGFzeW5jIChjdHgpID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgYm9keTogYXdhaXQgcG9pbnRlclJlcXVlc3RIYW5kbGVyKGN0eC51cmwuc2VhcmNoUGFyYW1zLmdldEFsbCgncG9pbnRlcicpKVxuICAgIH1cbiAgfSlcblxuICAvLyBSRVZJRVcgUkVTUE9OU0UgRk9STUFUXG4gIHJvdXRlci5wb3N0KCcvY29udGVudC9lbnRpdGllcy9hY3RpdmUnLCBhc3luYyAoY3R4KSA9PiB7XG4gICAgY29uc3QgYm9keSA9IGF3YWl0IGN0eC5yZXF1ZXN0Lmpzb24oKVxuICAgIHJldHVybiB7XG4gICAgICBib2R5OiBhd2FpdCBwb2ludGVyUmVxdWVzdEhhbmRsZXIoYm9keS5wb2ludGVycylcbiAgICB9XG4gIH0pXG5cbiAgcm91dGVyLmdldCgnL3ByZXZpZXctd2VhcmFibGVzLzppZCcsIGFzeW5jIChjdHgpID0+IHtcbiAgICBjb25zdCBiYXNlVXJsID0gYCR7Y3R4LnVybC5wcm90b2NvbH0vLyR7Y3R4LnVybC5ob3N0fS9jb250ZW50L2NvbnRlbnRzYFxuICAgIGNvbnN0IHdlYXJhYmxlcyA9IGF3YWl0IGdldEFsbFByZXZpZXdXZWFyYWJsZXMoY29tcG9uZW50cywge1xuICAgICAgYmFzZVVybCxcbiAgICAgIGJhc2VGb2xkZXJzXG4gICAgfSlcbiAgICBjb25zdCB3ZWFyYWJsZUlkID0gY3R4LnBhcmFtcy5pZFxuICAgIHJldHVybiB7XG4gICAgICBib2R5OiB7XG4gICAgICAgIG9rOiB0cnVlLFxuICAgICAgICBkYXRhOiB3ZWFyYWJsZXMuZmlsdGVyKCh3ZWFyYWJsZSkgPT4gc21hcnRXZWFyYWJsZU5hbWVUb0lkKHdlYXJhYmxlPy5uYW1lKSA9PT0gd2VhcmFibGVJZClcbiAgICAgIH1cbiAgICB9XG4gIH0pXG5cbiAgcm91dGVyLmdldCgnL3ByZXZpZXctd2VhcmFibGVzJywgYXN5bmMgKGN0eCkgPT4ge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBgJHtjdHgudXJsLnByb3RvY29sfS8vJHtjdHgudXJsLmhvc3R9L2NvbnRlbnQvY29udGVudHNgXG4gICAgcmV0dXJuIHtcbiAgICAgIGJvZHk6IHtcbiAgICAgICAgb2s6IHRydWUsXG4gICAgICAgIGRhdGE6IGF3YWl0IGdldEFsbFByZXZpZXdXZWFyYWJsZXMoY29tcG9uZW50cywgeyBiYXNlVXJsLCBiYXNlRm9sZGVycyB9KVxuICAgICAgfVxuICAgIH1cbiAgfSlcbn1cblxuY29uc3QgZGVmYXVsdEhhc2hNYWtlciA9IChzdHI6IHN0cmluZykgPT4gJ2I2NC0nICsgQnVmZmVyLmZyb20oc3RyKS50b1N0cmluZygnYmFzZTY0JylcblxuYXN5bmMgZnVuY3Rpb24gZ2V0QWxsUHJldmlld1dlYXJhYmxlcyhcbiAgY29tcG9uZW50czogUGljazxDbGlDb21wb25lbnRzLCAnZnMnPixcbiAgeyBiYXNlRm9sZGVycywgYmFzZVVybCB9OiB7IGJhc2VGb2xkZXJzOiBzdHJpbmdbXTsgYmFzZVVybDogc3RyaW5nIH1cbikge1xuICBjb25zdCB3ZWFyYWJsZVBhdGhBcnJheTogc3RyaW5nW10gPSBbXVxuICBmb3IgKGNvbnN0IHdlYXJhYmxlRGlyIG9mIGJhc2VGb2xkZXJzKSB7XG4gICAgY29uc3Qgd2VhcmFibGVKc29uUGF0aCA9IHBhdGgucmVzb2x2ZSh3ZWFyYWJsZURpciwgJ3dlYXJhYmxlLmpzb24nKVxuICAgIGlmIChhd2FpdCBjb21wb25lbnRzLmZzLmZpbGVFeGlzdHMod2VhcmFibGVKc29uUGF0aCkpIHtcbiAgICAgIHdlYXJhYmxlUGF0aEFycmF5LnB1c2god2VhcmFibGVKc29uUGF0aClcbiAgICB9XG4gIH1cblxuICBjb25zdCByZXQ6IExhbWJkYXNXZWFyYWJsZVtdID0gW11cbiAgZm9yIChjb25zdCB3ZWFyYWJsZUpzb25QYXRoIG9mIHdlYXJhYmxlUGF0aEFycmF5KSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldC5wdXNoKGF3YWl0IHNlcnZlV2VhcmFibGUoY29tcG9uZW50cywgeyB3ZWFyYWJsZUpzb25QYXRoLCBiYXNlVXJsIH0pKVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS5lcnJvcihgQ291bGRuJ3QgbW9jayB0aGUgd2VhcmFibGUgJHt3ZWFyYWJsZUpzb25QYXRofS4gUGxlYXNlIHZlcmlmeSB0aGUgY29ycmVjdCBmb3JtYXQgYW5kIHNjaGVtZS5gLCBlcnIpXG4gICAgfVxuICB9XG4gIHJldHVybiByZXRcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2VydmVXZWFyYWJsZShcbiAgY29tcG9uZW50czogUGljazxDbGlDb21wb25lbnRzLCAnZnMnPixcbiAgeyB3ZWFyYWJsZUpzb25QYXRoLCBiYXNlVXJsIH06IHsgd2VhcmFibGVKc29uUGF0aDogc3RyaW5nOyBiYXNlVXJsOiBzdHJpbmcgfVxuKTogUHJvbWlzZTxMYW1iZGFzV2VhcmFibGU+IHtcbiAgY29uc3Qgd2VhcmFibGVEaXIgPSBwYXRoLmRpcm5hbWUod2VhcmFibGVKc29uUGF0aClcbiAgY29uc3Qgd2VhcmFibGVKc29uID0gSlNPTi5wYXJzZSgoYXdhaXQgY29tcG9uZW50cy5mcy5yZWFkRmlsZSh3ZWFyYWJsZUpzb25QYXRoKSkudG9TdHJpbmcoKSlcblxuICBpZiAoIVdlYXJhYmxlSnNvbi52YWxpZGF0ZSh3ZWFyYWJsZUpzb24pKSB7XG4gICAgY29uc3QgZXJyb3JzID0gKFdlYXJhYmxlSnNvbi52YWxpZGF0ZS5lcnJvcnMgfHwgW10pLm1hcCgoYSkgPT4gYCR7YS5kYXRhfSAke2EubWVzc2FnZX1gKS5qb2luKCcnKVxuXG4gICAgY29uc29sZS5lcnJvcihgVW5hYmxlIHRvIHZhbGlkYXRlIHdlYXJhYmxlLmpzb24gcHJvcGVybHksIHBsZWFzZSBjaGVjayBpdC5gLCBlcnJvcnMpXG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHdlYXJhYmxlLmpzb24gKCR7d2VhcmFibGVKc29uUGF0aH0pYClcbiAgfVxuXG4gIGNvbnN0IGhhc2hlZEZpbGVzID0gYXdhaXQgZ2V0RmlsZXNGcm9tRm9sZGVyKGNvbXBvbmVudHMsIHtcbiAgICBmb2xkZXI6IHdlYXJhYmxlRGlyLFxuICAgIGFkZE9yaWdpbmFsUGF0aDogZmFsc2VcbiAgfSlcblxuICBjb25zdCB0aHVtYm5haWxGaWx0ZXJlZCA9IGhhc2hlZEZpbGVzLmZpbHRlcigoJCkgPT4gJD8uZmlsZSA9PT0gJ3RodW1ibmFpbC5wbmcnKVxuICBjb25zdCB0aHVtYm5haWwgPVxuICAgIHRodW1ibmFpbEZpbHRlcmVkLmxlbmd0aCA+IDAgJiYgdGh1bWJuYWlsRmlsdGVyZWRbMF0/Lmhhc2ggJiYgYCR7YmFzZVVybH0vJHt0aHVtYm5haWxGaWx0ZXJlZFswXS5oYXNofWBcblxuICBjb25zdCB3ZWFyYWJsZUlkID0gJ3Vybjo4ZGMyZDdhZC05N2UzLTQ0ZDAtYmE4OS1lODMwNWQ3OTVhNmEnXG5cbiAgY29uc3QgcmVwcmVzZW50YXRpb25zID0gd2VhcmFibGVKc29uLmRhdGEucmVwcmVzZW50YXRpb25zLm1hcCgocmVwcmVzZW50YXRpb24pID0+ICh7XG4gICAgLi4ucmVwcmVzZW50YXRpb24sXG4gICAgbWFpbkZpbGU6IGBtYWxlLyR7cmVwcmVzZW50YXRpb24ubWFpbkZpbGV9YCxcbiAgICBjb250ZW50czogaGFzaGVkRmlsZXMubWFwKCgkKSA9PiAoe1xuICAgICAga2V5OiBgbWFsZS8keyQ/LmZpbGV9YCxcbiAgICAgIHVybDogYCR7YmFzZVVybH0vJHskPy5oYXNofWAsXG4gICAgICBoYXNoOiAkPy5oYXNoXG4gICAgfSkpXG4gIH0pKVxuXG4gIHJldHVybiB7XG4gICAgaWQ6IHdlYXJhYmxlSWQsXG4gICAgcmFyaXR5OiB3ZWFyYWJsZUpzb24ucmFyaXR5LFxuICAgIGkxOG46IFt7IGNvZGU6ICdlbicgYXMgTG9jYWxlLCB0ZXh0OiB3ZWFyYWJsZUpzb24ubmFtZSB9XSxcbiAgICBkZXNjcmlwdGlvbjogd2VhcmFibGVKc29uLmRlc2NyaXB0aW9uLFxuICAgIHRodW1ibmFpbDogdGh1bWJuYWlsIHx8ICcnLFxuICAgIGltYWdlOiB0aHVtYm5haWwgfHwgJycsXG4gICAgY29sbGVjdGlvbkFkZHJlc3M6ICcweDAnLFxuICAgIGJhc2VVcmw6IGAke2Jhc2VVcmx9L2AsXG4gICAgbmFtZTogd2VhcmFibGVKc29uLm5hbWUgfHwgJycsXG4gICAgZGF0YToge1xuICAgICAgY2F0ZWdvcnk6IHdlYXJhYmxlSnNvbi5kYXRhLmNhdGVnb3J5LFxuICAgICAgcmVwbGFjZXM6IFtdLFxuICAgICAgaGlkZXM6IFtdLFxuICAgICAgdGFnczogW10sXG4gICAgICByZXByZXNlbnRhdGlvbnM6IHJlcHJlc2VudGF0aW9ucyBhcyBhbnlcbiAgICAgIC8vIHNjZW5lOiBoYXNoZWRGaWxlcyBhcyBhbnksXG4gICAgfVxuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldFNjZW5lSnNvbihcbiAgY29tcG9uZW50czogUGljazxDbGlDb21wb25lbnRzLCAnZnMnPixcbiAge1xuICAgIGJhc2VGb2xkZXJzLFxuICAgIHBvaW50ZXJzLFxuICAgIGN1c3RvbUhhc2hNYWtlclxuICB9OiB7XG4gICAgYmFzZUZvbGRlcnM6IHN0cmluZ1tdXG4gICAgcG9pbnRlcnM6IHN0cmluZ1tdXG4gICAgY3VzdG9tSGFzaE1ha2VyPzogKHN0cjogc3RyaW5nKSA9PiBzdHJpbmdcbiAgfVxuKTogUHJvbWlzZTxFbnRpdHlbXT4ge1xuICBjb25zdCByZXF1ZXN0ZWRQb2ludGVycyA9IG5ldyBTZXQ8c3RyaW5nPihwb2ludGVycylcbiAgY29uc3QgcmVzdWx0RW50aXRpZXM6IEVudGl0eVtdID0gW11cblxuICBjb25zdCBhbGxEZXBsb3ltZW50cyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgIGJhc2VGb2xkZXJzLm1hcChhc3luYyAoZm9sZGVyKSA9PiB7XG4gICAgICByZXR1cm4gZW50aXR5VjNGcm9tRm9sZGVyKGNvbXBvbmVudHMsIHtcbiAgICAgICAgZm9sZGVyLFxuICAgICAgICBhZGRPcmlnaW5hbFBhdGg6IGZhbHNlLFxuICAgICAgICBjdXN0b21IYXNoTWFrZXJcbiAgICAgIH0pXG4gICAgfSlcbiAgKVxuXG4gIGZvciAoY29uc3QgcG9pbnRlciBvZiBBcnJheS5mcm9tKHJlcXVlc3RlZFBvaW50ZXJzKSkge1xuICAgIC8vIGdldCBkZXBsb3ltZW50IGJ5IHBvaW50ZXJcbiAgICBjb25zdCB0aGVEZXBsb3ltZW50ID0gYWxsRGVwbG95bWVudHMuZmluZCgoJCkgPT4gJCAmJiAkLnBvaW50ZXJzLmluY2x1ZGVzKHBvaW50ZXIpKVxuICAgIGlmICh0aGVEZXBsb3ltZW50KSB7XG4gICAgICAvLyByZW1vdmUgYWxsIHRoZSByZXF1aXJlZCBwb2ludGVycyBmcm9tIHRoZSByZXF1ZXN0ZWRQb2ludGVycyBzZXRcbiAgICAgIC8vIHRvIHByZXZlbnQgc2VuZGluZyBkdXBsaWNhdGVkIGVudGl0aWVzXG4gICAgICB0aGVEZXBsb3ltZW50LnBvaW50ZXJzLmZvckVhY2goKCQpID0+IHJlcXVlc3RlZFBvaW50ZXJzLmRlbGV0ZSgkKSlcblxuICAgICAgLy8gYWRkIHRoZSBkZXBsb3ltZW50IHRvIHRoZSByZXN1bHRzXG4gICAgICByZXN1bHRFbnRpdGllcy5wdXNoKHRoZURlcGxveW1lbnQpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdEVudGl0aWVzXG59XG5cbmZ1bmN0aW9uIHNlcnZlU3RhdGljKGNvbXBvbmVudHM6IFBpY2s8Q2xpQ29tcG9uZW50cywgJ2ZzJz4sIGRpcjogc3RyaW5nLCByb3V0ZXI6IFJvdXRlcjxQcmV2aWV3Q29tcG9uZW50cz4pIHtcbiAgY29uc3Qgc2RrUGF0aCA9IHBhdGguZGlybmFtZShcbiAgICByZXF1aXJlLnJlc29sdmUoJ0BkY2wvc2RrL3BhY2thZ2UuanNvbicsIHtcbiAgICAgIHBhdGhzOiBbZGlyXVxuICAgIH0pXG4gIClcbiAgY29uc3QgZGNsRXhwbG9yZXJKc29uUGF0aCA9IHBhdGguZGlybmFtZShcbiAgICByZXF1aXJlLnJlc29sdmUoJ0BkY2wvZXhwbG9yZXIvcGFja2FnZS5qc29uJywge1xuICAgICAgcGF0aHM6IFtkaXIsIHNka1BhdGhdXG4gICAgfSlcbiAgKVxuXG4gIGNvbnN0IGRjbEtlcm5lbERlZmF1bHRQcm9maWxlUGF0aCA9IHBhdGgucmVzb2x2ZShkY2xFeHBsb3Jlckpzb25QYXRoLCAnZGVmYXVsdC1wcm9maWxlJylcbiAgY29uc3QgZGNsS2VybmVsSW1hZ2VzRGVjZW50cmFsYW5kQ29ubmVjdCA9IHBhdGgucmVzb2x2ZShkY2xFeHBsb3Jlckpzb25QYXRoLCAnaW1hZ2VzJywgJ2RlY2VudHJhbGFuZC1jb25uZWN0JylcblxuICBjb25zdCByb3V0ZXMgPSBbXG4gICAge1xuICAgICAgcm91dGU6ICcvJyxcbiAgICAgIHBhdGg6IHBhdGgucmVzb2x2ZShkY2xFeHBsb3Jlckpzb25QYXRoLCAncHJldmlldy5odG1sJyksXG4gICAgICB0eXBlOiAndGV4dC9odG1sJ1xuICAgIH0sXG4gICAge1xuICAgICAgcm91dGU6ICcvZmF2aWNvbi5pY28nLFxuICAgICAgcGF0aDogcGF0aC5yZXNvbHZlKGRjbEV4cGxvcmVySnNvblBhdGgsICdmYXZpY29uLmljbycpLFxuICAgICAgdHlwZTogJ3RleHQvaHRtbCdcbiAgICB9LFxuICAgIHtcbiAgICAgIHJvdXRlOiAnL0AvZXhwbG9yZXIvaW5kZXguanMnLFxuICAgICAgcGF0aDogcGF0aC5yZXNvbHZlKGRjbEV4cGxvcmVySnNvblBhdGgsICdpbmRleC5qcycpLFxuICAgICAgdHlwZTogJ3RleHQvamF2YXNjcmlwdCdcbiAgICB9XG4gIF1cblxuICBmb3IgKGNvbnN0IHJvdXRlIG9mIHJvdXRlcykge1xuICAgIHJvdXRlci5nZXQocm91dGUucm91dGUsIGFzeW5jIChfY3R4KSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiByb3V0ZS50eXBlIH0sXG4gICAgICAgIGJvZHk6IGNvbXBvbmVudHMuZnMuY3JlYXRlUmVhZFN0cmVhbShyb3V0ZS5wYXRoKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVTdGF0aWNSb3V0ZXMoXG4gICAgY29tcG9uZW50czogUGljazxDbGlDb21wb25lbnRzLCAnZnMnPixcbiAgICByb3V0ZTogc3RyaW5nLFxuICAgIGZvbGRlcjogc3RyaW5nLFxuICAgIHRyYW5zZm9ybSA9IChzdHI6IHN0cmluZykgPT4gc3RyXG4gICkge1xuICAgIHJvdXRlci5nZXQocm91dGUsIGFzeW5jIChjdHgsIG5leHQpID0+IHtcbiAgICAgIGNvbnN0IGZpbGUgPSBjdHgucGFyYW1zLnBhdGhcbiAgICAgIGNvbnN0IGZ1bGxQYXRoID0gcGF0aC5yZXNvbHZlKGZvbGRlciwgdHJhbnNmb3JtKGZpbGUpKVxuXG4gICAgICAvLyBvbmx5IHJldHVybiBmaWxlcyBJRiB0aGUgZmlsZSBpcyB3aXRoaW4gYSBiYXNlRm9sZGVyXG4gICAgICBpZiAoIShhd2FpdCBjb21wb25lbnRzLmZzLmZpbGVFeGlzdHMoZnVsbFBhdGgpKSkge1xuICAgICAgICByZXR1cm4gbmV4dCgpXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7XG4gICAgICAgICd4LXRpbWVzdGFtcCc6IERhdGUubm93KCksXG4gICAgICAgICd4LXNlbnQnOiB0cnVlLFxuICAgICAgICAnY2FjaGUtY29udHJvbCc6ICduby1jYWNoZSxwcml2YXRlLG1heC1hZ2U9MSdcbiAgICAgIH1cblxuICAgICAgaWYgKGZ1bGxQYXRoLmVuZHNXaXRoKCcud2FzbScpKSB7XG4gICAgICAgIGhlYWRlcnNbJ2NvbnRlbnQtdHlwZSddID0gJ2FwcGxpY2F0aW9uL3dhc20nXG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGhlYWRlcnMsXG4gICAgICAgIGJvZHk6IGNvbXBvbmVudHMuZnMuY3JlYXRlUmVhZFN0cmVhbShmdWxsUGF0aClcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgY3JlYXRlU3RhdGljUm91dGVzKGNvbXBvbmVudHMsICcvaW1hZ2VzL2RlY2VudHJhbGFuZC1jb25uZWN0LzpwYXRoKycsIGRjbEtlcm5lbEltYWdlc0RlY2VudHJhbGFuZENvbm5lY3QpXG4gIGNyZWF0ZVN0YXRpY1JvdXRlcyhjb21wb25lbnRzLCAnL2RlZmF1bHQtcHJvZmlsZS86cGF0aCsnLCBkY2xLZXJuZWxEZWZhdWx0UHJvZmlsZVBhdGgpXG4gIGNyZWF0ZVN0YXRpY1JvdXRlcyhjb21wb25lbnRzLCAnL0AvZXhwbG9yZXIvOnBhdGgrJywgZGNsRXhwbG9yZXJKc29uUGF0aCwgKGZpbGVQYXRoKSA9PiBmaWxlUGF0aC5yZXBsYWNlKC8uYnIrJC8sICcnKSlcblxuICByb3V0ZXIuZ2V0KCcvZmVhdHVyZS1mbGFncy86ZmlsZScsIGFzeW5jIChjdHgpID0+IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChgaHR0cHM6Ly9mZWF0dXJlLWZsYWdzLmRlY2VudHJhbGFuZC56b25lLyR7Y3R4LnBhcmFtcy5maWxlfWAsIHtcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgY29ubmVjdGlvbjogJ2Nsb3NlJ1xuICAgICAgfVxuICAgIH0pXG4gICAgcmV0dXJuIHtcbiAgICAgIGJvZHk6IGF3YWl0IHJlcy5hcnJheUJ1ZmZlcigpXG4gICAgfVxuICB9KVxufVxuXG5hc3luYyBmdW5jdGlvbiBlbnRpdHlWM0Zyb21Gb2xkZXIoXG4gIGNvbXBvbmVudHM6IFBpY2s8Q2xpQ29tcG9uZW50cywgJ2ZzJz4sXG4gIHtcbiAgICBmb2xkZXIsXG4gICAgYWRkT3JpZ2luYWxQYXRoLFxuICAgIGN1c3RvbUhhc2hNYWtlclxuICB9OiB7XG4gICAgZm9sZGVyOiBzdHJpbmdcbiAgICBhZGRPcmlnaW5hbFBhdGg/OiBib29sZWFuXG4gICAgY3VzdG9tSGFzaE1ha2VyPzogKHN0cjogc3RyaW5nKSA9PiBzdHJpbmdcbiAgfVxuKTogUHJvbWlzZTxFbnRpdHkgfCBudWxsPiB7XG4gIGNvbnN0IHNjZW5lSnNvblBhdGggPSBwYXRoLnJlc29sdmUoZm9sZGVyLCAnLi9zY2VuZS5qc29uJylcbiAgbGV0IGlzUGFyY2VsU2NlbmUgPSB0cnVlXG5cbiAgY29uc3Qgd2VhcmFibGVKc29uUGF0aCA9IHBhdGgucmVzb2x2ZShmb2xkZXIsICcuL3dlYXJhYmxlLmpzb24nKVxuICBpZiAoYXdhaXQgY29tcG9uZW50cy5mcy5maWxlRXhpc3RzKHdlYXJhYmxlSnNvblBhdGgpKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHdlYXJhYmxlSnNvbiA9IEpTT04ucGFyc2UoYXdhaXQgY29tcG9uZW50cy5mcy5yZWFkRmlsZSh3ZWFyYWJsZUpzb25QYXRoLCAndXRmLTgnKSlcbiAgICAgIGlmICghV2VhcmFibGVKc29uLnZhbGlkYXRlKHdlYXJhYmxlSnNvbikpIHtcbiAgICAgICAgY29uc3QgZXJyb3JzID0gKFdlYXJhYmxlSnNvbi52YWxpZGF0ZS5lcnJvcnMgfHwgW10pLm1hcCgoYSkgPT4gYCR7YS5kYXRhfSAke2EubWVzc2FnZX1gKS5qb2luKCcnKVxuXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYFVuYWJsZSB0byB2YWxpZGF0ZSB3ZWFyYWJsZS5qc29uIHByb3Blcmx5LCBwbGVhc2UgY2hlY2sgaXQuYCwgZXJyb3JzKVxuICAgICAgICBjb25zb2xlLmVycm9yKGBJbnZhbGlkIHdlYXJhYmxlLmpzb24gKCR7d2VhcmFibGVKc29uUGF0aH0pYClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlzUGFyY2VsU2NlbmUgPSBmYWxzZVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS5lcnJvcihgVW5hYmxlIHRvIGxvYWQgd2VhcmFibGUuanNvbiBwcm9wZXJseWAsIGVycilcbiAgICB9XG4gIH1cblxuICBjb25zdCBoYXNoTWFrZXIgPSBjdXN0b21IYXNoTWFrZXIgPyBjdXN0b21IYXNoTWFrZXIgOiBkZWZhdWx0SGFzaE1ha2VyXG5cbiAgaWYgKChhd2FpdCBjb21wb25lbnRzLmZzLmZpbGVFeGlzdHMoc2NlbmVKc29uUGF0aCkpICYmIGlzUGFyY2VsU2NlbmUpIHtcbiAgICBjb25zdCBzY2VuZUpzb24gPSBKU09OLnBhcnNlKGF3YWl0IGNvbXBvbmVudHMuZnMucmVhZEZpbGUoc2NlbmVKc29uUGF0aCwgJ3V0Zi04JykpXG4gICAgY29uc3QgeyBiYXNlLCBwYXJjZWxzIH06IHsgYmFzZTogc3RyaW5nOyBwYXJjZWxzOiBzdHJpbmdbXSB9ID0gc2NlbmVKc29uLnNjZW5lXG4gICAgY29uc3QgcG9pbnRlcnMgPSBuZXcgU2V0PHN0cmluZz4oKVxuICAgIHBvaW50ZXJzLmFkZChiYXNlKVxuICAgIHBhcmNlbHMuZm9yRWFjaCgoJCkgPT4gcG9pbnRlcnMuYWRkKCQpKVxuXG4gICAgY29uc3QgbWFwcGVkRmlsZXMgPSBhd2FpdCBnZXRGaWxlc0Zyb21Gb2xkZXIoY29tcG9uZW50cywge1xuICAgICAgZm9sZGVyLFxuICAgICAgYWRkT3JpZ2luYWxQYXRoLFxuICAgICAgY3VzdG9tSGFzaE1ha2VyXG4gICAgfSlcblxuICAgIHJldHVybiB7XG4gICAgICB2ZXJzaW9uOiAndjMnLFxuICAgICAgdHlwZTogRW50aXR5VHlwZS5TQ0VORSxcbiAgICAgIGlkOiBoYXNoTWFrZXIoZm9sZGVyKSxcbiAgICAgIHBvaW50ZXJzOiBBcnJheS5mcm9tKHBvaW50ZXJzKSxcbiAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgIG1ldGFkYXRhOiBzY2VuZUpzb24sXG4gICAgICBjb250ZW50OiBtYXBwZWRGaWxlc1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRGaWxlc0Zyb21Gb2xkZXIoXG4gIGNvbXBvbmVudHM6IFBpY2s8Q2xpQ29tcG9uZW50cywgJ2ZzJz4sXG4gIHtcbiAgICBmb2xkZXIsXG4gICAgYWRkT3JpZ2luYWxQYXRoLFxuICAgIGN1c3RvbUhhc2hNYWtlclxuICB9OiB7XG4gICAgZm9sZGVyOiBzdHJpbmdcbiAgICBhZGRPcmlnaW5hbFBhdGg/OiBib29sZWFuXG4gICAgY3VzdG9tSGFzaE1ha2VyPzogKHN0cjogc3RyaW5nKSA9PiBzdHJpbmdcbiAgfVxuKTogUHJvbWlzZTxDb250ZW50TWFwcGluZ1tdPiB7XG4gIGNvbnN0IGhhc2hNYWtlciA9IGN1c3RvbUhhc2hNYWtlciA/IGN1c3RvbUhhc2hNYWtlciA6IGRlZmF1bHRIYXNoTWFrZXJcbiAgY29uc3QgaWdub3JlUGF0dGVybnMgPSBhd2FpdCBnZXREQ0xJZ25vcmVQYXR0ZXJucyhjb21wb25lbnRzLCBmb2xkZXIpXG5cbiAgY29uc3QgYWxsRmlsZXMgPSBnbG9iU3luYygnKiovKicsIHtcbiAgICBpZ25vcmU6IGlnbm9yZVBhdHRlcm5zLFxuICAgIGN3ZDogZm9sZGVyLFxuICAgIGRvdDogZmFsc2UsXG4gICAgYWJzb2x1dGU6IHRydWVcbiAgfSlcbiAgICAubWFwKChmaWxlKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoIXN0YXRTeW5jKGZpbGUpLmlzRmlsZSgpKSByZXR1cm5cbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIGNvbnN0IF9mb2xkZXIgPSBmb2xkZXIucmVwbGFjZSgvXFxcXC9naSwgJy8nKVxuICAgICAgY29uc3Qga2V5ID0gZmlsZS5yZXBsYWNlKF9mb2xkZXIsICcnKS5yZXBsYWNlKC9eXFwvKy8sICcnKVxuICAgICAgcmV0dXJuIGtleVxuICAgIH0pXG4gICAgLmZpbHRlcigoJCkgPT4gISEkKSBhcyBzdHJpbmdbXVxuXG4gIGNvbnN0IGlnID0gaWdub3JlKCkuYWRkKGlnbm9yZVBhdHRlcm5zKVxuICBjb25zdCBmaWx0ZXJlZEZpbGVzID0gaWcuZmlsdGVyKGFsbEZpbGVzKVxuXG4gIGNvbnN0IHJldDogKENvbnRlbnRNYXBwaW5nICYgeyBvcmlnaW5hbF9wYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQgfSlbXSA9IFtdXG5cbiAgZm9yIChjb25zdCBmaWxlIG9mIGZpbHRlcmVkRmlsZXMpIHtcbiAgICBjb25zdCBhYnNvbHV0ZVBhdGggPSBwYXRoLnJlc29sdmUoZm9sZGVyLCBmaWxlKVxuICAgIHRyeSB7XG4gICAgICBpZiAoIXN0YXRTeW5jKGFic29sdXRlUGF0aCkuaXNGaWxlKCkpIGNvbnRpbnVlXG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGVycilcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgY29uc3QgYWJzb2x1dGVGb2xkZXIgPSBmb2xkZXIucmVwbGFjZSgvXFxcXC9naSwgJy8nKVxuXG4gICAgY29uc3QgcmVsYXRpdmVGaWxlUGF0aFRvRm9sZGVyID0gZmlsZS5yZXBsYWNlKGFic29sdXRlRm9sZGVyLCAnJykucmVwbGFjZSgvXlxcLysvLCAnJylcblxuICAgIHJldC5wdXNoKHtcbiAgICAgIGZpbGU6IHJlbGF0aXZlRmlsZVBhdGhUb0ZvbGRlci50b0xvd2VyQ2FzZSgpLFxuICAgICAgb3JpZ2luYWxfcGF0aDogYWRkT3JpZ2luYWxQYXRoID8gYWJzb2x1dGVQYXRoIDogdW5kZWZpbmVkLFxuICAgICAgaGFzaDogaGFzaE1ha2VyKGFic29sdXRlUGF0aClcbiAgICB9KVxuICB9XG5cbiAgcmV0dXJuIHJldFxufVxuIl19