@mnaoumov/obsidian-dev-toolkit 3.2.0 → 3.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (96) hide show
  1. package/dist/lib/cjs/bundlers/esbuild-impl/copy-to-obsidian-plugins-folder-plugin.cjs +1 -75
  2. package/dist/lib/cjs/bundlers/esbuild-impl/dependency.cjs +3 -77
  3. package/dist/lib/cjs/bundlers/esbuild-impl/feature-options.cjs +1 -75
  4. package/dist/lib/cjs/bundlers/esbuild-impl/fix-source-maps-plugin.cjs +1 -75
  5. package/dist/lib/cjs/bundlers/esbuild-impl/index.cjs +1 -75
  6. package/dist/lib/cjs/bundlers/esbuild-impl/obsidian-plugin-builder.cjs +1 -75
  7. package/dist/lib/cjs/bundlers/esbuild-impl/preprocess-plugin.cjs +3 -76
  8. package/dist/lib/cjs/bundlers/esbuild-impl/preprocess-plugin.d.cts +1 -1
  9. package/dist/lib/cjs/bundlers/esbuild-impl/rename-css-plugin.cjs +1 -75
  10. package/dist/lib/cjs/bundlers/esbuild.cjs +1 -75
  11. package/dist/lib/cjs/bundlers/index.cjs +1 -75
  12. package/dist/lib/cjs/bundlers/obsidian-cli-reload.cjs +1 -75
  13. package/dist/lib/cjs/bundlers/obsidian-plugin-build.cjs +1 -75
  14. package/dist/lib/cjs/bundlers/obsidian-plugin-features.cjs +1 -75
  15. package/dist/lib/cjs/bundlers/obsidian-plugin-transforms.cjs +1 -75
  16. package/dist/lib/cjs/bundlers/obsidian-plugin-webpack-loader.cjs +1 -75
  17. package/dist/lib/cjs/bundlers/obsidian-plugins-folder-deployment.cjs +32 -85
  18. package/dist/lib/cjs/bundlers/parcel.cjs +112 -81
  19. package/dist/lib/cjs/bundlers/parcel.d.cts +13 -6
  20. package/dist/lib/cjs/bundlers/rollup-compatible-features.cjs +1 -75
  21. package/dist/lib/cjs/bundlers/rollup-compatible.cjs +1 -75
  22. package/dist/lib/cjs/bundlers/rollup.cjs +1 -75
  23. package/dist/lib/cjs/bundlers/vite.cjs +1 -75
  24. package/dist/lib/cjs/bundlers/webpack.cjs +3 -77
  25. package/dist/lib/cjs/demo-vault-app-json.cjs +1 -75
  26. package/dist/lib/cjs/demo-vault-buttons.cjs +1 -75
  27. package/dist/lib/cjs/demo-vault-cli.cjs +1 -75
  28. package/dist/lib/cjs/demo-vault-coverage.cjs +139 -118
  29. package/dist/lib/cjs/demo-vault-coverage.d.cts +100 -5
  30. package/dist/lib/cjs/demo-vault.cjs +3 -77
  31. package/dist/lib/cjs/docs-site/index.cjs +1 -75
  32. package/dist/lib/cjs/docs-site/obsidian-external-type-links.cjs +1 -75
  33. package/dist/lib/cjs/formatters/dprint.cjs +1 -75
  34. package/dist/lib/cjs/formatters/index.cjs +1 -75
  35. package/dist/lib/cjs/index.cjs +1 -81
  36. package/dist/lib/cjs/index.d.cts +0 -2
  37. package/dist/lib/cjs/integration-test-setup.cjs +1 -75
  38. package/dist/lib/cjs/integration-test-vitest-global-setup.cjs +1 -75
  39. package/dist/lib/cjs/jest-setup.cjs +1 -75
  40. package/dist/lib/cjs/linters/eslint-config.cjs +1 -75
  41. package/dist/lib/cjs/linters/eslint-rules/index.cjs +1 -75
  42. package/dist/lib/cjs/linters/eslint-rules/manifest-description.cjs +1 -75
  43. package/dist/lib/cjs/linters/eslint-rules/manifest-helpers.cjs +1 -75
  44. package/dist/lib/cjs/linters/eslint-rules/manifest-id.cjs +1 -75
  45. package/dist/lib/cjs/linters/eslint-rules/manifest-name.cjs +1 -75
  46. package/dist/lib/cjs/linters/eslint-rules/manifest-schema.cjs +1 -75
  47. package/dist/lib/cjs/linters/eslint-rules/no-local-obsidian-internals.cjs +1 -75
  48. package/dist/lib/cjs/linters/eslint-rules/no-over-cap-wait-in-eval-in-obsidian.cjs +2 -77
  49. package/dist/lib/cjs/linters/eslint-rules/no-untrusted-input-events.cjs +1 -75
  50. package/dist/lib/cjs/linters/eslint-rules/obsidian-dev-toolkit-plugin.cjs +1 -75
  51. package/dist/lib/cjs/linters/eslint-rules/plugin-name-as-code-in-ui.cjs +1 -75
  52. package/dist/lib/cjs/linters/eslint-rules/plugin-name-as-code.cjs +1 -75
  53. package/dist/lib/cjs/linters/eslint-rules/require-component-suffix.cjs +1 -75
  54. package/dist/lib/cjs/linters/eslint-rules/require-plugin-api-contract-schemas.cjs +1 -75
  55. package/dist/lib/cjs/linters/eslint.cjs +1 -75
  56. package/dist/lib/cjs/linters/index.cjs +1 -75
  57. package/dist/lib/cjs/linters/markdownlint-cli2-config.cjs +1 -75
  58. package/dist/lib/cjs/linters/markdownlint-rules/index.cjs +1 -75
  59. package/dist/lib/cjs/linters/markdownlint-rules/plugin-name-as-code.cjs +1 -75
  60. package/dist/lib/cjs/linters/markdownlint.cjs +1 -75
  61. package/dist/lib/cjs/linters/obsidianmd-rule-custom-message.cjs +1 -75
  62. package/dist/lib/cjs/linters/plugin-names.cjs +1 -75
  63. package/dist/lib/cjs/obsidian-plugin-repo-paths.cjs +1 -75
  64. package/dist/lib/cjs/setup.cjs +1 -75
  65. package/dist/lib/cjs/templates.cjs +3 -77
  66. package/dist/lib/cjs/test-runners/coverage-badge-cli.cjs +1 -75
  67. package/dist/lib/cjs/test-runners/coverage-badge.cjs +1 -75
  68. package/dist/lib/cjs/test-runners/e2e-runner-support.cjs +1 -75
  69. package/dist/lib/cjs/test-runners/index.cjs +1 -78
  70. package/dist/lib/cjs/test-runners/index.d.cts +0 -1
  71. package/dist/lib/cjs/test-runners/integration-test-plugin.cjs +3 -77
  72. package/dist/lib/cjs/test-runners/jest-config.cjs +1 -75
  73. package/dist/lib/cjs/test-runners/obsidian-test-runner.cjs +1 -75
  74. package/dist/lib/cjs/test-runners/performance-eval-cap.cjs +4 -75
  75. package/dist/lib/cjs/test-runners/performance-eval-cap.d.cts +12 -3
  76. package/dist/lib/cjs/test-runners/stale-build-global-setup.cjs +1 -75
  77. package/dist/lib/cjs/test-runners/vitest-config.cjs +4 -80
  78. package/dist/lib/cjs/test-runners/wdio-obsidian.cjs +1 -75
  79. package/dist/lib/cjs/version.cjs +1 -75
  80. package/dist/lib/cjs/vitest-setup.cjs +1 -75
  81. package/dist/lib/esm/bundlers/esbuild-impl/preprocess-plugin.d.mts +1 -1
  82. package/dist/lib/esm/bundlers/esbuild-impl/preprocess-plugin.mjs +3 -2
  83. package/dist/lib/esm/bundlers/obsidian-plugins-folder-deployment.mjs +32 -15
  84. package/dist/lib/esm/bundlers/parcel.d.mts +13 -6
  85. package/dist/lib/esm/bundlers/parcel.mjs +110 -5
  86. package/dist/lib/esm/demo-vault-coverage.d.mts +100 -5
  87. package/dist/lib/esm/demo-vault-coverage.mjs +139 -44
  88. package/dist/lib/esm/index.d.mts +0 -2
  89. package/dist/lib/esm/index.mjs +1 -5
  90. package/dist/lib/esm/linters/eslint-rules/no-over-cap-wait-in-eval-in-obsidian.mjs +2 -2
  91. package/dist/lib/esm/test-runners/index.d.mts +0 -1
  92. package/dist/lib/esm/test-runners/index.mjs +1 -3
  93. package/dist/lib/esm/test-runners/performance-eval-cap.d.mts +12 -3
  94. package/dist/lib/esm/test-runners/performance-eval-cap.mjs +3 -1
  95. package/dist/lib/esm/test-runners/vitest-config.mjs +4 -5
  96. package/package.json +3 -2
@@ -29,80 +29,6 @@ function ensureBrowserProcess() {
29
29
 
30
30
  ensureBrowserProcess();
31
31
  })();
32
- (function patchObsidianRequire() {
33
- const originalRequire = require;
34
- if (!originalRequire || originalRequire.__isPatched) {
35
- return;
36
- }
37
-
38
- require = Object.assign(
39
- (id) => requirePatched(id),
40
- originalRequire,
41
- {
42
- __isPatched: true
43
- }
44
- );
45
-
46
- function extractDefault(module) {
47
- return module && module.__esModule && 'default' in module ? module.default : module;
48
- }
49
-
50
- const OBSIDIAN_BUILT_IN_MODULE_NAMES = new Set([
51
- '@codemirror/autocomplete',
52
- '@codemirror/collab',
53
- '@codemirror/commands',
54
- '@codemirror/language',
55
- '@codemirror/lint',
56
- '@codemirror/search',
57
- '@codemirror/state',
58
- '@codemirror/text',
59
- '@codemirror/view',
60
- '@lezer/common',
61
- '@lezer/highlight',
62
- '@lezer/lr',
63
- 'obsidian']
64
- );
65
-
66
- const DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES = new Set([
67
- '@codemirror/closebrackets',
68
- '@codemirror/comment',
69
- '@codemirror/fold',
70
- '@codemirror/gutter',
71
- '@codemirror/highlight',
72
- '@codemirror/history',
73
- '@codemirror/matchbrackets',
74
- '@codemirror/panel',
75
- '@codemirror/rangeset',
76
- '@codemirror/rectangular-selection',
77
- '@codemirror/stream-parser',
78
- '@codemirror/tooltip']
79
- );
80
-
81
- function requirePatched(id) {
82
- if (OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id) || DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id)) {
83
- return originalRequire?.(id);
84
- }
85
-
86
- // eslint-disable-next-line @typescript-eslint/no-deprecated, obsidianmd/no-global-this -- Need access to app. Actively use globalThis.
87
- if (globalThis.app.isMobile) {
88
- if (id === 'process' || id === 'node:process') {
89
- // eslint-disable-next-line no-console -- Valid usage.
90
- console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Fake process object is returned instead.`);
91
-
92
- return process;
93
- }
94
- } else {
95
- const module = originalRequire?.(id);
96
- if (module) {
97
- return extractDefault(module);
98
- }
99
- }
100
-
101
- // eslint-disable-next-line no-console -- Valid usage.
102
- console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Empty object is returned instead.`);
103
- return {};
104
- }
105
- })();
106
32
 
107
33
  "use strict";
108
34
  var __create = Object.create;
@@ -151,7 +77,7 @@ var import_obsidian_plugin_repo_paths = require('../obsidian-plugin-repo-paths.c
151
77
  var import_obsidian_plugin_build = require('./obsidian-plugin-build.cjs');
152
78
  var import_obsidian_plugin_features = require('./obsidian-plugin-features.cjs');
153
79
  var import_obsidian_plugins_folder_deployment = require('./obsidian-plugins-folder-deployment.cjs');
154
- var __import_meta_url = globalThis["import.meta.url"] ?? (function getObsidianCjsImportMetaUrl() {
80
+ var __import_meta_url = globalThis["import.meta.url"] ?? (function getCjsImportMetaUrl() {
155
81
  if (typeof __filename === "string") {
156
82
  const localRequire = require;
157
83
  const url = localRequire("node:url");
@@ -159,7 +85,7 @@ var __import_meta_url = globalThis["import.meta.url"] ?? (function getObsidianCj
159
85
  return url.pathToFileURL(__filename).href;
160
86
  }
161
87
  }
162
- return typeof window === "undefined" ? "" : activeWindow.location.href;
88
+ return globalThis.location?.href ?? "";
163
89
  })();
164
90
  const PARCEL_CACHE_FOLDER = ".parcel-cache";
165
91
  const GENERATED_PARCEL_CONFIG_FOLDER = `${PARCEL_CACHE_FOLDER}/obsidian-dev-toolkit`;
@@ -168,6 +94,7 @@ const RESOLVER_FILE_NAME = "obsidian-plugin-resolver.cjs";
168
94
  const NAMER_FILE_NAME = "obsidian-plugin-namer.cjs";
169
95
  const INLINE_IMPORTS_FILE_NAME = "obsidian-plugin-inline-imports.cjs";
170
96
  const OPTIMIZER_FILE_NAME = "obsidian-plugin-optimizer.cjs";
97
+ const PRE_MINIFY_FILE_NAME = "obsidian-plugin-pre-minify.cjs";
171
98
  const FEATURES_FILE_NAME = "obsidian-plugin-features.cjs";
172
99
  const JSON_INDENT = 2;
173
100
  async function build(options) {
@@ -244,7 +171,7 @@ function getParcelConfigFiles(params) {
244
171
  extends: consumerParcelrcPath ?? "@parcel/config-default",
245
172
  namers: [`./${NAMER_FILE_NAME}`, "..."],
246
173
  optimizers: {
247
- "*.js": ["...", `./${OPTIMIZER_FILE_NAME}`]
174
+ "*.js": [`./${PRE_MINIFY_FILE_NAME}`, "...", `./${OPTIMIZER_FILE_NAME}`]
248
175
  },
249
176
  resolvers: [`./${RESOLVER_FILE_NAME}`, "..."],
250
177
  transformers
@@ -384,20 +311,123 @@ module.exports = new Optimizer({
384
311
  `,
385
312
  [PARCELRC]: `${JSON.stringify(parcelrc, null, JSON_INDENT)}
386
313
  `,
387
- [RESOLVER_FILE_NAME]: `/* Generated by @mnaoumov/obsidian-dev-toolkit. Leaves the modules Obsidian supplies at runtime to require(). */
314
+ // `String.raw`, so the line breaks below reach the file as escapes.
315
+ [PRE_MINIFY_FILE_NAME]: String.raw`/*
316
+ * Generated by @mnaoumov/obsidian-dev-toolkit. Runs before parcel's own optimizers, on the JavaScript bundle.
317
+ *
318
+ * A scope-hoisted library bundle require()s every bundle it references, the stylesheet included, and Obsidian
319
+ * loads styles.css itself, beside main.js, where a require() cannot reach it. The line is blanked rather than
320
+ * removed, so a source map still lines up.
321
+ *
322
+ * A scope-hoisted CommonJS bundle also declares every module's bindings at its top level, under long names such
323
+ * as $c5899aeb4caadf27$var$taskIdCounter, and parcel minifies it as a script, where the minifier may not rename
324
+ * a top-level binding, since in a script it is a global. Obsidian evaluates main.js as the body of a function, so
325
+ * wrapping the bundle in an arrow function changes nothing at runtime (an arrow keeps this and arguments) and
326
+ * lets the minifier rename all of them: Solid's fixture build is 70 KB without this and 10 KB with it.
327
+ */
328
+ const { Optimizer } = require('@parcel/plugin');
329
+
330
+ const STYLESHEET_REQUIRE = ${JSON.stringify(`require('./${import_obsidian_plugin_repo_paths.ObsidianPluginRepoPaths.StylesCss}');
331
+ `)};
332
+
333
+ async function readContents(contents) {
334
+ if (typeof contents === 'string') {
335
+ return contents;
336
+ }
337
+ if (Buffer.isBuffer(contents)) {
338
+ return contents.toString('utf-8');
339
+ }
340
+ const chunks = [];
341
+ for await (const chunk of contents) {
342
+ chunks.push(Buffer.from(chunk));
343
+ }
344
+ return Buffer.concat(chunks).toString('utf-8');
345
+ }
346
+
347
+ module.exports = new Optimizer({
348
+ async optimize({ bundle, contents, map }) {
349
+ const code = (await readContents(contents)).replace(STYLESHEET_REQUIRE, '\n');
350
+ if (!bundle.env.shouldOptimize) {
351
+ return { contents: code, map };
352
+ }
353
+ if (map) {
354
+ map.offsetLines(1, 1);
355
+ }
356
+ return { contents: '(() => {\n' + code + '\n})();\n', map };
357
+ }
358
+ });
359
+ `,
360
+ [RESOLVER_FILE_NAME]: `/*
361
+ * Generated by @mnaoumov/obsidian-dev-toolkit. Leaves the modules Obsidian supplies at runtime to require(), and
362
+ * resolves everything else the way @parcel/resolver-default does, with the browser's export conditions.
363
+ *
364
+ * Parcel resolves an electron-renderer target with the node and electron conditions beside browser, and an exports
365
+ * map is matched in the package's own key order, so a package listing node first (Vue, Svelte, Solid, fflate) would
366
+ * hand over its Node build: several times the code, and one that may not load on mobile. The Node builtins need no
367
+ * node condition to stay external, since they are in the externals below.
368
+ */
388
369
  const { Resolver } = require('@parcel/plugin');
370
+ const { dirname } = require('node:path');
389
371
 
390
372
  const EXTERNALS = new Set(${JSON.stringify(import_obsidian_plugin_build.OBSIDIAN_PLUGIN_EXTERNALS)});
391
373
 
374
+ function getBrowserEnvironment(env) {
375
+ return {
376
+ context: env.context,
377
+ id: env.id + ':obsidian-dev-toolkit-browser-conditions',
378
+ includeNodeModules: env.includeNodeModules,
379
+ isBrowser: () => true,
380
+ isElectron: () => false,
381
+ isLibrary: env.isLibrary,
382
+ isNode: () => false,
383
+ isWorker: () => env.isWorker(),
384
+ isWorklet: () => env.isWorklet()
385
+ };
386
+ }
387
+
392
388
  function getPackageName(specifier) {
393
389
  const segments = specifier.split('/');
394
390
  return specifier.startsWith('@') ? segments.slice(0, 2).join('/') : segments[0];
395
391
  }
396
392
 
393
+ // @parcel/node-resolver-core is what @parcel/resolver-default runs, reached through the packages that install it.
394
+ function loadNodeResolver() {
395
+ let folder = __dirname;
396
+ for (const packageName of ['@parcel/config-default', '@parcel/resolver-default']) {
397
+ folder = dirname(require.resolve(packageName + '/package.json', { paths: [folder] }));
398
+ }
399
+ return require(require.resolve('@parcel/node-resolver-core', { paths: [folder] })).default;
400
+ }
401
+
397
402
  module.exports = new Resolver({
398
- resolve({ specifier }) {
403
+ async loadConfig({ config, logger, options }) {
404
+ const packageConfig = await config.getConfig([], { packageKey: '@parcel/resolver-default' });
405
+ const NodeResolver = loadNodeResolver();
406
+ return new NodeResolver({
407
+ fs: options.inputFS,
408
+ logger,
409
+ mode: options.mode,
410
+ packageExports: packageConfig?.contents?.packageExports ?? false,
411
+ packageManager: options.packageManager,
412
+ projectRoot: options.projectRoot,
413
+ shouldAutoInstall: options.shouldAutoInstall
414
+ });
415
+ },
416
+ resolve({ config: nodeResolver, dependency, specifier }) {
399
417
  const isExternal = specifier.startsWith('node:') || EXTERNALS.has(specifier) || EXTERNALS.has(getPackageName(specifier));
400
- return isExternal ? { isExcluded: true } : null;
418
+ if (isExternal) {
419
+ return { isExcluded: true };
420
+ }
421
+ return nodeResolver.resolve({
422
+ env: getBrowserEnvironment(dependency.env),
423
+ filename: specifier,
424
+ loc: dependency.loc,
425
+ packageConditions: dependency.packageConditions,
426
+ parent: dependency.resolveFrom,
427
+ range: dependency.range,
428
+ sourcePath: dependency.sourcePath,
429
+ specifierType: dependency.specifierType
430
+ });
401
431
  }
402
432
  });
403
433
  `
@@ -423,6 +453,7 @@ function getParcelOptions(params) {
423
453
  // eslint-disable-next-line unicorn/name-replacements -- `distDir` is the name parcel's API reads.
424
454
  distDir: buildContext.distFolder,
425
455
  shouldOptimize: buildContext.isProductionBuild,
456
+ shouldScopeHoist: true,
426
457
  sourceMaps: !buildContext.isProductionBuild
427
458
  },
428
459
  entries: buildContext.entryPoint,
@@ -459,4 +490,4 @@ function handleWatchEvent(event, buildContext) {
459
490
  getParcelConfigFiles,
460
491
  getParcelOptions
461
492
  });
462
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9idW5kbGVycy9wYXJjZWwudHMiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIF9faW1wb3J0X21ldGFfdXJsID0gZ2xvYmFsVGhpc1snaW1wb3J0Lm1ldGEudXJsJ10gPz8gKGZ1bmN0aW9uIGdldE9ic2lkaWFuQ2pzSW1wb3J0TWV0YVVybCgpIHtcbiAgaWYgKHR5cGVvZiBfX2ZpbGVuYW1lID09PSAnc3RyaW5nJykge1xuICAgIGNvbnN0IGxvY2FsUmVxdWlyZSA9IHJlcXVpcmU7XG4gICAgY29uc3QgdXJsID0gbG9jYWxSZXF1aXJlKCdub2RlOnVybCcpO1xuICAgIGlmICh0eXBlb2YgdXJsLnBhdGhUb0ZpbGVVUkwgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiB1cmwucGF0aFRvRmlsZVVSTChfX2ZpbGVuYW1lKS5ocmVmO1xuICAgIH1cbiAgfVxuXG4gIC8vIEZhbGxiYWNrIHRvIGFuIGVtcHR5IHN0cmluZyBpZiB0aGUgZW52aXJvbm1lbnQgaXMgdW5rbm93blxuICByZXR1cm4gdHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgPyAnJyA6IGFjdGl2ZVdpbmRvdy5sb2NhdGlvbi5ocmVmO1xufSkoKTtcbi8qKlxuICogQGZpbGVcbiAqXG4gKiBCdWlsZHMgYW4gT2JzaWRpYW4gcGx1Z2luIHdpdGggcGFyY2VsOiBgYnVpbGQoKWAgYW5kIGBkZXYoKWAsIHRoZSBzYW1lIHR3byBlbnRyeSBwb2ludHMgdGhlIGVzYnVpbGRcbiAqIGJ1aWxkZXIgaGFzLCBwcm9kdWNpbmcgdGhlIHNhbWUgYG1haW4uanNgICsgYHN0eWxlcy5jc3NgICsgYG1hbmlmZXN0Lmpzb25gIGxheW91dC5cbiAqXG4gKiBQYXJjZWwgdGFrZXMgbm8gYGV4dGVybmFsYCBsaXN0IGFuZCBubyBvdXRwdXQgZmlsZSBuYW1lLCBvbmx5IHBsdWdpbnMgbmFtZWQgaW4gYSBgLnBhcmNlbHJjYC4gU28gdGhlXG4gKiBidWlsZCB3cml0ZXMgYSBgLnBhcmNlbHJjYCBvZiBpdHMgb3duIGludG8gYC5wYXJjZWwtY2FjaGVgLCBiZXNpZGUgYSByZXNvbHZlciB0aGF0IGxlYXZlc1xuICogT2JzaWRpYW4ncyBtb2R1bGVzIGV4dGVybmFsLCBhIG5hbWVyIHRoYXQgbmFtZXMgdGhlIHN0eWxlc2hlZXQgYHN0eWxlcy5jc3NgIGFuZCBhIHRyYW5zZm9ybWVyIHRoYXQga2VlcHNcbiAqIGR5bmFtaWMgaW1wb3J0cyBpbnNpZGUgYG1haW4uanNgLCBhbmQgZXh0ZW5kcyB0aGVcbiAqIGNvbnN1bWVyJ3Mgb3duIGAucGFyY2VscmNgIHdoZW4gdGhlcmUgaXMgb25lIChvciBgQHBhcmNlbC9jb25maWctZGVmYXVsdGAgd2hlbiB0aGVyZSBpcyBub25lKSwgc28gZXZlcnlcbiAqIHRyYW5zZm9ybWVyIHRoZSBjb25zdW1lciBjb25maWd1cmVkIHN0aWxsIGFwcGxpZXMuXG4gKlxuICogYEBwYXJjZWwvY29yZWAsIGBAcGFyY2VsL3BsdWdpbmAgYW5kIGBAcGFyY2VsL2NvbmZpZy1kZWZhdWx0YCBhcmUgb3B0aW9uYWwgcGVlciBkZXBlbmRlbmNpZXMsIGxvYWRlZFxuICogb25seSB3aGVuIGEgcGFyY2VsIGJ1aWxkIHJ1bnMsIHNvIGEgcGx1Z2luIGJ1aWx0IHdpdGggZXNidWlsZCBpbnN0YWxscyBub3RoaW5nIGV4dHJhLlxuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgQnVpbGRFdmVudCxcbiAgSW5pdGlhbFBhcmNlbE9wdGlvbnMsXG4gIFRhcmdldERlc2NyaXB0b3Jcbn0gZnJvbSAnQHBhcmNlbC90eXBlcyc7XG5cbmltcG9ydCB7IENsaVRhc2tSZXN1bHQgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1kZXYtdG9vbGtpdC9jbGktdXRpbHMnO1xuaW1wb3J0IHsgbnBtUnVuT3B0aW9uYWwgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1kZXYtdG9vbGtpdC9ucG0tcnVuJztcbmltcG9ydCB7IGludm9rZUFzeW5jU2FmZWx5IH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2FzeW5jJztcbmltcG9ydCB7XG4gIGV4dG5hbWUsXG4gIGpvaW4sXG4gIHJlbGF0aXZlLFxuICB0b1Bvc2l4UGF0aFxufSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvcGF0aCc7XG5pbXBvcnQgeyBleGlzdHNTeW5jIH0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQge1xuICBta2RpcixcbiAgcmVhZEZpbGUsXG4gIHdyaXRlRmlsZVxufSBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcblxuaW1wb3J0IHR5cGUge1xuICBPYnNpZGlhblBsdWdpbkJ1aWxkQ29udGV4dCxcbiAgT2JzaWRpYW5QbHVnaW5EZXBsb3ltZW50T3B0aW9uc1xufSBmcm9tICcuL29ic2lkaWFuLXBsdWdpbi1idWlsZC50cyc7XG5pbXBvcnQgdHlwZSB7IE9ic2lkaWFuUGx1Z2luRmVhdHVyZU9wdGlvbnMgfSBmcm9tICcuL29ic2lkaWFuLXBsdWdpbi1mZWF0dXJlcy50cyc7XG5cbmltcG9ydCB7IE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzIH0gZnJvbSAnLi4vb2JzaWRpYW4tcGx1Z2luLXJlcG8tcGF0aHMudHMnO1xuaW1wb3J0IHtcbiAgQnVpbGRNb2RlLFxuICBjbGVhbk9ic2lkaWFuUGx1Z2luRGlzdEZvbGRlcixcbiAgY29tcGxldGVPYnNpZGlhblBsdWdpbkRpc3RGb2xkZXIsXG4gIGdldE9ic2lkaWFuUGx1Z2luQmFubmVyLFxuICBPQlNJRElBTl9QTFVHSU5fRVhURVJOQUxTLFxuICByZXNvbHZlRnJvbVJvb3QsXG4gIHJlc29sdmVPYnNpZGlhblBsdWdpbkJ1aWxkQ29udGV4dFxufSBmcm9tICcuL29ic2lkaWFuLXBsdWdpbi1idWlsZC50cyc7XG5pbXBvcnQge1xuICBnZXRGcmFtZXdvcmtEZWZpbmVzLFxuICBnZXRKc3hJbXBvcnRTb3VyY2UsXG4gIGlzUG9zdGNzc05lZWRlZFxufSBmcm9tICcuL29ic2lkaWFuLXBsdWdpbi1mZWF0dXJlcy50cyc7XG5pbXBvcnQgeyBkZXBsb3lUb09ic2lkaWFuUGx1Z2luc0ZvbGRlciB9IGZyb20gJy4vb2JzaWRpYW4tcGx1Z2lucy1mb2xkZXItZGVwbG95bWVudC50cyc7XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIGJ1aWxkT2JzaWRpYW5QbHVnaW5XaXRoUGFyY2VsfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWlsZE9ic2lkaWFuUGx1Z2luV2l0aFBhcmNlbFBhcmFtcyBleHRlbmRzIEJ1aWxkT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBBIGJ1aWxkIG1vZGUsIGVpdGhlciBgRGV2ZWxvcG1lbnRgIG9yIGBQcm9kdWN0aW9uYC5cbiAgICovXG4gIHJlYWRvbmx5IG1vZGU6IEJ1aWxkTW9kZTtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgYnVpbGR9IGFuZCB7QGxpbmsgZGV2fS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWlsZE9wdGlvbnMgZXh0ZW5kcyBPYnNpZGlhblBsdWdpbkRlcGxveW1lbnRPcHRpb25zLCBPYnNpZGlhblBsdWdpbkZlYXR1cmVPcHRpb25zIHtcbiAgLyoqXG4gICAqIEN1c3RvbWl6ZXMgdGhlIG9wdGlvbnMgaGFuZGVkIHRvIHBhcmNlbCdzIGBQYXJjZWxgIGNsYXNzLlxuICAgKi9cbiAgcmVhZG9ubHkgY3VzdG9taXplUGFyY2VsT3B0aW9ucz86IChvcHRpb25zOiBJbml0aWFsUGFyY2VsT3B0aW9ucykgPT4gSW5pdGlhbFBhcmNlbE9wdGlvbnM7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGdldFBhcmNlbENvbmZpZ0ZpbGVzfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZXRQYXJjZWxDb25maWdGaWxlc1BhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgY29uc3VtZXIncyBvd24gYC5wYXJjZWxyY2AsIHJlbGF0aXZlIHRvIHRoZSBnZW5lcmF0ZWQgY29uZmlndXJhdGlvbidzIGZvbGRlciwgb3IgYHVuZGVmaW5lZGAgd2hlbiB0aGUgcHJvamVjdFxuICAgKiBoYXMgbm9uZS5cbiAgICovXG4gIHJlYWRvbmx5IGNvbnN1bWVyUGFyY2VscmNQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFRoZSBidWlsZCBmZWF0dXJlcy5cbiAgICovXG4gIHJlYWRvbmx5IGZlYXR1cmVzPzogT2JzaWRpYW5QbHVnaW5GZWF0dXJlT3B0aW9ucztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZ2V0UGFyY2VsT3B0aW9uc30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2V0UGFyY2VsT3B0aW9uc1BhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgYnVpbGQgY29udGV4dC5cbiAgICovXG4gIHJlYWRvbmx5IGJ1aWxkQ29udGV4dDogT2JzaWRpYW5QbHVnaW5CdWlsZENvbnRleHQ7XG5cbiAgLyoqXG4gICAqIFBhcmNlbCdzIGNhY2hlIGZvbGRlci4gTmFtZWQgZXhwbGljaXRseSBiZWNhdXNlIHBhcmNlbCBvdGhlcndpc2UgdGFrZXMgdGhlIGZvbGRlciBvZiB0aGUgbmVhcmVzdFxuICAgKiBsb2NrZmlsZSBmb3IgdGhlIHByb2plY3Qgcm9vdCwgd2hpY2ggaW4gYSB3b3Jrc3BhY2UgaXMgbm90IHRoZSBwbHVnaW4ncy5cbiAgICovXG4gIHJlYWRvbmx5IGNhY2hlRm9sZGVyOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBnZW5lcmF0ZWQgYC5wYXJjZWxyY2AuXG4gICAqL1xuICByZWFkb25seSBjb25maWdQYXRoOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIGZpbGVzIG9mIHRoZSBnZW5lcmF0ZWQgcGFyY2VsIGNvbmZpZ3VyYXRpb24sIGJ5IGZpbGUgbmFtZS5cbiAqL1xuZXhwb3J0IHR5cGUgUGFyY2VsQ29uZmlnRmlsZXMgPSBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PjtcblxuLy8gSW5zaWRlIHBhcmNlbCdzIG93biBjYWNoZSBmb2xkZXI6IHBhcmNlbCByZWZ1c2VzIHJlbGF0aXZlIHBsdWdpbnMgaW4gYSBjb25maWcgdW5kZXIgYG5vZGVfbW9kdWxlc2AgKGl0XG4vLyB0YWtlcyBzdWNoIGEgY29uZmlnIGZvciBhIHB1Ymxpc2hlZCBwYWNrYWdlKSwgYW5kIGl0IG5ldmVyIHdhdGNoZXMgaXRzIGNhY2hlIGZvbGRlciwgc28gcmVnZW5lcmF0aW5nXG4vLyB0aGVzZSBmaWxlcyBvbiBldmVyeSBidWlsZCBjYW5ub3QgdHJpZ2dlciBhIHJlYnVpbGQuXG5jb25zdCBQQVJDRUxfQ0FDSEVfRk9MREVSID0gJy5wYXJjZWwtY2FjaGUnO1xuY29uc3QgR0VORVJBVEVEX1BBUkNFTF9DT05GSUdfRk9MREVSID0gYCR7UEFSQ0VMX0NBQ0hFX0ZPTERFUn0vb2JzaWRpYW4tZGV2LXRvb2xraXRgO1xuY29uc3QgUEFSQ0VMUkMgPSAnLnBhcmNlbHJjJztcblxuLyoqXG4gKiBPbmUgZGlhZ25vc3RpYyBvZiBhIHtAbGluayBQYXJjZWxFcnJvckxpa2V9LlxuICovXG5pbnRlcmZhY2UgUGFyY2VsRXJyb3JEaWFnbm9zdGljIHtcbiAgcmVhZG9ubHkgbWVzc2FnZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFdoYXQgcGFyY2VsIHRocm93cyB3aGVuIGEgYnVpbGQgZmFpbHM6IGFuIGVycm9yIGNhcnJ5aW5nIGl0cyBkaWFnbm9zdGljcy5cbiAqL1xuaW50ZXJmYWNlIFBhcmNlbEVycm9yTGlrZSB7XG4gIHJlYWRvbmx5IGRpYWdub3N0aWNzPzogcmVhZG9ubHkgUGFyY2VsRXJyb3JEaWFnbm9zdGljW107XG59XG5jb25zdCBSRVNPTFZFUl9GSUxFX05BTUUgPSAnb2JzaWRpYW4tcGx1Z2luLXJlc29sdmVyLmNqcyc7XG5jb25zdCBOQU1FUl9GSUxFX05BTUUgPSAnb2JzaWRpYW4tcGx1Z2luLW5hbWVyLmNqcyc7XG5jb25zdCBJTkxJTkVfSU1QT1JUU19GSUxFX05BTUUgPSAnb2JzaWRpYW4tcGx1Z2luLWlubGluZS1pbXBvcnRzLmNqcyc7XG5jb25zdCBPUFRJTUlaRVJfRklMRV9OQU1FID0gJ29ic2lkaWFuLXBsdWdpbi1vcHRpbWl6ZXIuY2pzJztcbmNvbnN0IEZFQVRVUkVTX0ZJTEVfTkFNRSA9ICdvYnNpZGlhbi1wbHVnaW4tZmVhdHVyZXMuY2pzJztcbmNvbnN0IEpTT05fSU5ERU5UID0gMjtcblxuLyogdjggaWdub3JlIHN0YXJ0IC0tIFJ1bnMgYSByZWFsIHBhcmNlbCBidWlsZDsgZXhlcmNpc2VkIGJ5IHRoZSBidW5kbGVyIGludGVncmF0aW9uIHRlc3QuICovXG4vKipcbiAqIEJ1aWxkcyB0aGUgT2JzaWRpYW4gcGx1Z2luIGluIHByb2R1Y3Rpb24gbW9kZSB1c2luZyBwYXJjZWwuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCBidWlsZCBvcHRpb25zLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBidWlsZCBpcyBjb21wbGV0ZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkKG9wdGlvbnM/OiBCdWlsZE9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYnVpbGRPYnNpZGlhblBsdWdpbldpdGhQYXJjZWwoeyAuLi5vcHRpb25zLCBtb2RlOiBCdWlsZE1vZGUuUHJvZHVjdGlvbiB9KTtcbiAgcmVzdWx0LnRocm93T25GYWlsdXJlKCk7XG59XG5cbi8qKlxuICogQnVpbGRzIHRoZSBPYnNpZGlhbiBwbHVnaW4gd2l0aCBwYXJjZWwsIG9uY2UgZm9yIGEgcHJvZHVjdGlvbiBidWlsZCwgb3Igd2F0Y2hpbmcgZm9yIGEgZGV2ZWxvcG1lbnQgb25lLlxuICpcbiAqIFJ1bnMgdGhlIHByb2plY3QncyBgYnVpbGQ6Y29tcGlsZWAgc2NyaXB0IGZpcnN0IHdoZW4gaXQgaGFzIG9uZSwgYXMgdGhlIGVzYnVpbGQgYnVpbGRlciBkb2VzLCBzaW5jZVxuICogcGFyY2VsIHN0cmlwcyBUeXBlU2NyaXB0IHR5cGVzIHdpdGhvdXQgY2hlY2tpbmcgdGhlbS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHtAbGluayBCdWlsZE9ic2lkaWFuUGx1Z2luV2l0aFBhcmNlbFBhcmFtc30uXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIGEge0BsaW5rIENsaVRhc2tSZXN1bHR9IGluZGljYXRpbmcgdGhlIHN1Y2Nlc3Mgb3IgZmFpbHVyZSBvZiB0aGUgYnVpbGQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWlsZE9ic2lkaWFuUGx1Z2luV2l0aFBhcmNlbChwYXJhbXM6IEJ1aWxkT2JzaWRpYW5QbHVnaW5XaXRoUGFyY2VsUGFyYW1zKTogUHJvbWlzZTxDbGlUYXNrUmVzdWx0PiB7XG4gIGF3YWl0IG5wbVJ1bk9wdGlvbmFsKCdidWlsZDpjb21waWxlJyk7XG4gIGNvbnN0IGJ1aWxkQ29udGV4dCA9IGF3YWl0IHJlc29sdmVPYnNpZGlhblBsdWdpbkJ1aWxkQ29udGV4dChwYXJhbXMpO1xuICBhd2FpdCBjbGVhbk9ic2lkaWFuUGx1Z2luRGlzdEZvbGRlcihidWlsZENvbnRleHQuZGlzdEZvbGRlcik7XG4gIGF3YWl0IGNvbXBsZXRlT2JzaWRpYW5QbHVnaW5EaXN0Rm9sZGVyKGJ1aWxkQ29udGV4dCk7XG5cbiAgY29uc3QgY29uZmlnRm9sZGVyID0gcmVzb2x2ZUZyb21Sb290KEdFTkVSQVRFRF9QQVJDRUxfQ09ORklHX0ZPTERFUik7XG4gIGNvbnN0IGNvbnN1bWVyUGFyY2VscmNQYXRoID0gcmVzb2x2ZUZyb21Sb290KFBBUkNFTFJDKTtcbiAgYXdhaXQgbWtkaXIoY29uZmlnRm9sZGVyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgY29uc3QgY29uZmlnRmlsZXMgPSBnZXRQYXJjZWxDb25maWdGaWxlcyh7XG4gICAgY29uc3VtZXJQYXJjZWxyY1BhdGg6IGV4aXN0c1N5bmMoY29uc3VtZXJQYXJjZWxyY1BhdGgpID8gdG9Qb3NpeFBhdGgocmVsYXRpdmUoY29uZmlnRm9sZGVyLCBjb25zdW1lclBhcmNlbHJjUGF0aCkpIDogdW5kZWZpbmVkLFxuICAgIGZlYXR1cmVzOiBwYXJhbXNcbiAgfSk7XG4gIGZvciAoY29uc3QgW2ZpbGVOYW1lLCBjb250ZW50c10gb2YgT2JqZWN0LmVudHJpZXMoY29uZmlnRmlsZXMpKSB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBqb2luKGNvbmZpZ0ZvbGRlciwgZmlsZU5hbWUpO1xuICAgIC8vIFJld3JpdHRlbiBvbmx5IHdoZW4gaXQgY2hhbmdlZDogcGFyY2VsIGludmFsaWRhdGVzIGl0cyBjYWNoZSBvbiBhIGNvbmZpZyBmaWxlJ3MgbW9kaWZpY2F0aW9uIHRpbWUuXG4gICAgaWYgKCFleGlzdHNTeW5jKGZpbGVQYXRoKSB8fCBhd2FpdCByZWFkRmlsZShmaWxlUGF0aCwgJ3V0Zi04JykgIT09IGNvbnRlbnRzKSB7XG4gICAgICBhd2FpdCB3cml0ZUZpbGUoZmlsZVBhdGgsIGNvbnRlbnRzLCAndXRmLTgnKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCB7IFBhcmNlbCB9ID0gYXdhaXQgaW1wb3J0KCdAcGFyY2VsL2NvcmUnKTtcbiAgY29uc3QgcGFyY2VsT3B0aW9ucyA9IGdldFBhcmNlbE9wdGlvbnMoeyBidWlsZENvbnRleHQsIGNhY2hlRm9sZGVyOiByZXNvbHZlRnJvbVJvb3QoUEFSQ0VMX0NBQ0hFX0ZPTERFUiksIGNvbmZpZ1BhdGg6IGpvaW4oY29uZmlnRm9sZGVyLCBQQVJDRUxSQykgfSk7XG4gIGNvbnN0IGJ1bmRsZXIgPSBuZXcgUGFyY2VsKHBhcmFtcy5jdXN0b21pemVQYXJjZWxPcHRpb25zPy4ocGFyY2VsT3B0aW9ucykgPz8gcGFyY2VsT3B0aW9ucyk7XG5cbiAgaWYgKGJ1aWxkQ29udGV4dC5pc1Byb2R1Y3Rpb25CdWlsZCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB7IGJ1aWxkVGltZSwgYnVuZGxlR3JhcGggfSA9IGF3YWl0IGJ1bmRsZXIucnVuKCk7XG4gICAgICBjb25zb2xlLndhcm4oYEJ1aWx0ICR7U3RyaW5nKGJ1bmRsZUdyYXBoLmdldEJ1bmRsZXMoKS5sZW5ndGgpfSBidW5kbGUocykgd2l0aCBwYXJjZWwgaW4gJHtTdHJpbmcoYnVpbGRUaW1lKX0gbXMuYCk7XG4gICAgICByZXR1cm4gQ2xpVGFza1Jlc3VsdC5TdWNjZXNzKCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZm9ybWF0UGFyY2VsRXJyb3IoZXJyb3IpKTtcbiAgICAgIHJldHVybiBDbGlUYXNrUmVzdWx0LkZhaWx1cmUoKTtcbiAgICB9XG4gIH1cblxuICBhd2FpdCBidW5kbGVyLndhdGNoKChlcnJvciwgZXZlbnQpID0+IHtcbiAgICBpZiAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZm9ybWF0UGFyY2VsRXJyb3IoZXJyb3IpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaGFuZGxlV2F0Y2hFdmVudChldmVudCwgYnVpbGRDb250ZXh0KTtcbiAgfSk7XG4gIHJldHVybiBDbGlUYXNrUmVzdWx0LkRvTm90RXhpdCgpO1xufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUgT2JzaWRpYW4gcGx1Z2luIGluIGRldmVsb3BtZW50IG1vZGUgdXNpbmcgcGFyY2VsLCB3YXRjaGluZyBmb3IgY2hhbmdlcyBhbmQgZGVwbG95aW5nIGV2ZXJ5XG4gKiBzdWNjZXNzZnVsIHJlYnVpbGQgaW50byB0aGUgdmF1bHQuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCBidWlsZCBvcHRpb25zLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byBhIHtAbGluayBDbGlUYXNrUmVzdWx0fSBpbmRpY2F0aW5nIHRoZSBidWlsZCByZXN1bHQuXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB0eXBlc2NyaXB0LWRldi10b29sa2l0L3BhcmFtcy1vcHRpb25zLW5hbWUtbWF0Y2ggLS0gSW50ZW50aW9uYWxseSBzaGFyZXMgQnVpbGRPcHRpb25zIHdpdGggYnVpbGQoKS5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZXYob3B0aW9ucz86IEJ1aWxkT3B0aW9ucyk6IFByb21pc2U8Q2xpVGFza1Jlc3VsdD4ge1xuICByZXR1cm4gYXdhaXQgYnVpbGRPYnNpZGlhblBsdWdpbldpdGhQYXJjZWwoeyAuLi5vcHRpb25zLCBtb2RlOiBCdWlsZE1vZGUuRGV2ZWxvcG1lbnQgfSk7XG59XG4vKiB2OCBpZ25vcmUgc3RvcCAqL1xuXG4vKipcbiAqIEdlbmVyYXRlcyB0aGUgZmlsZXMgb2YgdGhlIHBhcmNlbCBjb25maWd1cmF0aW9uIHRoZSBidWlsZCBydW5zIHdpdGguXG4gKlxuICogVGhlIGJ1aWxkIGZlYXR1cmVzIGFkZCBwaXBlbGluZXMgdGhhdCBydW4gdGhlIHRvb2xraXQncyBzaGFyZWQgdHJhbnNmb3JtcywgdGhyb3VnaCBvbmUgZ2VuZXJhdGVkIHRyYW5zZm9ybWVyIHRoYXRcbiAqIGxvYWRzIHRoZW0gZnJvbSB0aGUgdG9vbGtpdDogU29saWQncyBgLmpzeGAgLyBgLnRzeGAsIFN2ZWx0ZSdzIGAuc3ZlbHRlYCAvIGAuc3ZlbHRlLnRzYCAvIGAuc3ZlbHRlLmpzYCwgYC53YXNtYCxcbiAqIGFuZCB3aXRoIGBzdHlsZXMucG9zdGNzc2Agb3IgYHN0eWxlcy50YWlsd2luZGAgZXZlcnkgc3R5bGVzaGVldCwgaW4gcGxhY2Ugb2YgcGFyY2VsJ3Mgb3duIFBvc3RDU1Mgc3RlcC4gUmVhY3QgYW5kXG4gKiBQcmVhY3QgSlNYIGlzIGNvbXBpbGVkIGhlcmUgdG9vLCBzaW5jZSBwYXJjZWwgcmVhZHMgdGhlIEpTWCBydW50aW1lIGZyb20gYSB0c2NvbmZpZyB3aXRob3V0IGZvbGxvd2luZyBpdHMgYGV4dGVuZHNgLFxuICogYW5kIHdpdGggYW55IGZyYW1ld29yayBldmVyeSBzY3JpcHQgaGFzIHRoZSBmcmFtZXdvcmsncyBjb21waWxlLXRpbWUgY29uc3RhbnRzIHJlcGxhY2VkLiBQYXJjZWwgY29tcGlsZXMgVnVlIHdpdGhcbiAqIGBAcGFyY2VsL3RyYW5zZm9ybWVyLXZ1ZWAgYW5kIHNjb3BlcyBgKi5tb2R1bGUuY3NzYCBpdHNlbGYsIHNvIHRob3NlIG5lZWQgbm8gcGlwZWxpbmUgaGVyZS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHtAbGluayBHZXRQYXJjZWxDb25maWdGaWxlc1BhcmFtc30uXG4gKiBAcmV0dXJucyBUaGUgZmlsZXMsIGJ5IGZpbGUgbmFtZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFBhcmNlbENvbmZpZ0ZpbGVzKHBhcmFtczogR2V0UGFyY2VsQ29uZmlnRmlsZXNQYXJhbXMpOiBQYXJjZWxDb25maWdGaWxlcyB7XG4gIGNvbnN0IHsgY29uc3VtZXJQYXJjZWxyY1BhdGgsIGZlYXR1cmVzID0ge30gfSA9IHBhcmFtcztcbiAgY29uc3QgZmVhdHVyZVRyYW5zZm9ybWVyID0gYC4vJHtGRUFUVVJFU19GSUxFX05BTUV9YDtcbiAgY29uc3QgdHJhbnNmb3JtZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT4gPSB7fTtcbiAgaWYgKGZlYXR1cmVzLmZyYW1ld29yayA9PT0gJ3N2ZWx0ZScpIHtcbiAgICB0cmFuc2Zvcm1lcnNbJyouc3ZlbHRlJ10gPSBbZmVhdHVyZVRyYW5zZm9ybWVyXTtcbiAgICB0cmFuc2Zvcm1lcnNbJyouc3ZlbHRlLntqcyx0c30nXSA9IFtmZWF0dXJlVHJhbnNmb3JtZXIsIGAuLyR7SU5MSU5FX0lNUE9SVFNfRklMRV9OQU1FfWAsICcuLi4nXTtcbiAgfVxuICBpZiAoZmVhdHVyZXMuZnJhbWV3b3JrID09PSAnc29saWQnIHx8IGdldEpzeEltcG9ydFNvdXJjZShmZWF0dXJlcy5mcmFtZXdvcmspICE9PSB1bmRlZmluZWQpIHtcbiAgICB0cmFuc2Zvcm1lcnNbJyoue2pzeCx0c3h9J10gPSBbZmVhdHVyZVRyYW5zZm9ybWVyXTtcbiAgfVxuICBpZiAoZmVhdHVyZXMud2FzbSkge1xuICAgIHRyYW5zZm9ybWVyc1snKi53YXNtJ10gPSBbZmVhdHVyZVRyYW5zZm9ybWVyXTtcbiAgfVxuICBpZiAoaXNQb3N0Y3NzTmVlZGVkKGZlYXR1cmVzLnN0eWxlcykpIHtcbiAgICB0cmFuc2Zvcm1lcnNbJyoue2NzcyxwY3NzfSddID0gW2ZlYXR1cmVUcmFuc2Zvcm1lciwgJ0BwYXJjZWwvdHJhbnNmb3JtZXItY3NzJ107XG4gIH1cbiAgY29uc3QgZGVmaW5lcyA9IGdldEZyYW1ld29ya0RlZmluZXMoeyBmcmFtZXdvcms6IGZlYXR1cmVzLmZyYW1ld29yaywgaXNQcm9kdWN0aW9uQnVpbGQ6IHRydWUgfSk7XG4gIHRyYW5zZm9ybWVyc1snKi57anMsbWpzLGNqcyxqc3gsdHMsbXRzLGN0cyx0c3h9J10gPSBbXG4gICAgLi4uT2JqZWN0LmtleXMoZGVmaW5lcykubGVuZ3RoID4gMCA/IFtmZWF0dXJlVHJhbnNmb3JtZXJdIDogW10sXG4gICAgYC4vJHtJTkxJTkVfSU1QT1JUU19GSUxFX05BTUV9YCxcbiAgICAnLi4uJ1xuICBdO1xuXG4gIGNvbnN0IHBhcmNlbHJjID0ge1xuICAgIGV4dGVuZHM6IGNvbnN1bWVyUGFyY2VscmNQYXRoID8/ICdAcGFyY2VsL2NvbmZpZy1kZWZhdWx0JyxcbiAgICBuYW1lcnM6IFtgLi8ke05BTUVSX0ZJTEVfTkFNRX1gLCAnLi4uJ10sXG4gICAgb3B0aW1pemVyczoge1xuICAgICAgJyouanMnOiBbJy4uLicsIGAuLyR7T1BUSU1JWkVSX0ZJTEVfTkFNRX1gXVxuICAgIH0sXG4gICAgcmVzb2x2ZXJzOiBbYC4vJHtSRVNPTFZFUl9GSUxFX05BTUV9YCwgJy4uLiddLFxuICAgIHRyYW5zZm9ybWVyc1xuICB9O1xuXG4gIHJldHVybiB7XG4gICAgW0ZFQVRVUkVTX0ZJTEVfTkFNRV06IGAvKlxuICogR2VuZXJhdGVkIGJ5IEBtbmFvdW1vdi9vYnNpZGlhbi1kZXYtdG9vbGtpdC4gUnVucyB0aGUgdG9vbGtpdCdzIHNoYXJlZCB0cmFuc2Zvcm1zIGZvciB0aGUgYnVpbGQgZmVhdHVyZXMsIGxvYWRlZFxuICogZnJvbSB0aGUgdG9vbGtpdCBpdHNlbGYsIHNvIHBhcmNlbCBjb21waWxlcyBlYWNoIGZlYXR1cmUgdGhlIHdheSBldmVyeSBvdGhlciBidW5kbGVyIGFkYXB0ZXIgZG9lcy5cbiAqL1xuY29uc3QgeyBUcmFuc2Zvcm1lciB9ID0gcmVxdWlyZSgnQHBhcmNlbC9wbHVnaW4nKTtcblxuY29uc3QgRkVBVFVSRVNfTU9EVUxFX1VSTCA9ICR7SlNPTi5zdHJpbmdpZnkoZ2V0U2libGluZ01vZHVsZVVybCgnb2JzaWRpYW4tcGx1Z2luLWZlYXR1cmVzJykpfTtcbmNvbnN0IFRSQU5TRk9STVNfTU9EVUxFX1VSTCA9ICR7SlNPTi5zdHJpbmdpZnkoZ2V0U2libGluZ01vZHVsZVVybCgnb2JzaWRpYW4tcGx1Z2luLXRyYW5zZm9ybXMnKSl9O1xuY29uc3QgRlJBTUVXT1JLID0gJHtKU09OLnN0cmluZ2lmeShmZWF0dXJlcy5mcmFtZXdvcmsgPz8gbnVsbCl9O1xuY29uc3QgU1RZTEVTID0gJHtKU09OLnN0cmluZ2lmeShmZWF0dXJlcy5zdHlsZXMgPz8ge30pfTtcblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgVHJhbnNmb3JtZXIoe1xuICBhc3luYyB0cmFuc2Zvcm0oeyBhc3NldCwgb3B0aW9ucyB9KSB7XG4gICAgY29uc3QgeyBnZXRGZWF0dXJlRmlsZUtpbmQsIGdldEZyYW1ld29ya0RlZmluZXMsIGdldEpzeEltcG9ydFNvdXJjZSwgcmVwbGFjZURlZmluZXMgfSA9IGF3YWl0IGltcG9ydChGRUFUVVJFU19NT0RVTEVfVVJMKTtcbiAgICBjb25zdCB0cmFuc2Zvcm1zID0gYXdhaXQgaW1wb3J0KFRSQU5TRk9STVNfTU9EVUxFX1VSTCk7XG4gICAgY29uc3QgZmlsZVBhdGggPSBhc3NldC5maWxlUGF0aDtcbiAgICBjb25zdCBpc1Byb2R1Y3Rpb25CdWlsZCA9IG9wdGlvbnMubW9kZSA9PT0gJ3Byb2R1Y3Rpb24nO1xuICAgIGNvbnN0IGRlZmluZXMgPSBnZXRGcmFtZXdvcmtEZWZpbmVzKHsgZnJhbWV3b3JrOiBGUkFNRVdPUksgPz8gdW5kZWZpbmVkLCBpc1Byb2R1Y3Rpb25CdWlsZCB9KTtcbiAgICBzd2l0Y2ggKGdldEZlYXR1cmVGaWxlS2luZChmaWxlUGF0aCkpIHtcbiAgICAgIGNhc2UgJ2pzeCc6IHtcbiAgICAgICAgY29uc3QgY29kZSA9IGF3YWl0IGFzc2V0LmdldENvZGUoKTtcbiAgICAgICAgY29uc3QganN4SW1wb3J0U291cmNlID0gZ2V0SnN4SW1wb3J0U291cmNlKEZSQU1FV09SSyA/PyB1bmRlZmluZWQpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBGUkFNRVdPUksgPT09ICdzb2xpZCdcbiAgICAgICAgICA/IGF3YWl0IHRyYW5zZm9ybXMudHJhbnNmb3JtU29saWQoeyBjb2RlLCBmaWxlUGF0aCwgaXNQcm9kdWN0aW9uQnVpbGQgfSlcbiAgICAgICAgICA6IGF3YWl0IHRyYW5zZm9ybXMudHJhbnNmb3JtSnN4KHsgY29kZSwgZmlsZVBhdGgsIGlzUHJvZHVjdGlvbkJ1aWxkLCBqc3hJbXBvcnRTb3VyY2UgfSk7XG4gICAgICAgIGFzc2V0LnNldENvZGUocmVwbGFjZURlZmluZXMocmVzdWx0LmNvZGUsIGRlZmluZXMpKTtcbiAgICAgICAgYXNzZXQudHlwZSA9ICdqcyc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnc3R5bGVzaGVldCc6IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdHJhbnNmb3Jtcy50cmFuc2Zvcm1Dc3MoeyBmaWxlUGF0aCwgaXNDc3NNb2R1bGVTY29wZWQ6IGZhbHNlLCBpc1Byb2R1Y3Rpb25CdWlsZCwgc291cmNlOiBhd2FpdCBhc3NldC5nZXRDb2RlKCksIHN0eWxlczogU1RZTEVTIH0pO1xuICAgICAgICBhc3NldC5zZXRDb2RlKHJlc3VsdC5jc3MpO1xuICAgICAgICBmb3IgKGNvbnN0IGRlcGVuZGVuY3kgb2YgcmVzdWx0LmRlcGVuZGVuY2llcykge1xuICAgICAgICAgIGFzc2V0LmludmFsaWRhdGVPbkZpbGVDaGFuZ2UoZGVwZW5kZW5jeSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdzdmVsdGUnOiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRyYW5zZm9ybXMudHJhbnNmb3JtU3ZlbHRlKHsgY29kZTogYXdhaXQgYXNzZXQuZ2V0Q29kZSgpLCBmaWxlUGF0aCwgaXNQcm9kdWN0aW9uQnVpbGQgfSk7XG4gICAgICAgIGFzc2V0LnNldENvZGUocmVwbGFjZURlZmluZXMocmVzdWx0LmNvZGUsIGRlZmluZXMpKTtcbiAgICAgICAgYXNzZXQudHlwZSA9ICdqcyc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnd2FzbSc6XG4gICAgICAgIGFzc2V0LnNldENvZGUodHJhbnNmb3Jtcy5nZXRXYXNtTW9kdWxlQ29kZShhd2FpdCBhc3NldC5nZXRCdWZmZXIoKSkpO1xuICAgICAgICBhc3NldC50eXBlID0gJ2pzJztcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIC8vIEEgZnJhbWV3b3JrJ3MgcnVudGltZSByZWFkcyBwcm9jZXNzLmVudi5OT0RFX0VOViwgd2hpY2ggcGFyY2VsIGxlYXZlcyBhbG9uZSBpbiBhbiBlbGVjdHJvbi1yZW5kZXJlciBsaWJyYXJ5LlxuICAgICAgICBjb25zdCBjb2RlID0gYXdhaXQgYXNzZXQuZ2V0Q29kZSgpO1xuICAgICAgICBjb25zdCByZXBsYWNlZCA9IHJlcGxhY2VEZWZpbmVzKGNvZGUsIGRlZmluZXMpO1xuICAgICAgICBpZiAocmVwbGFjZWQgIT09IGNvZGUpIHtcbiAgICAgICAgICBhc3NldC5zZXRDb2RlKHJlcGxhY2VkKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIFthc3NldF07XG4gIH1cbn0pO1xuYCxcbiAgICAvLyBgU3RyaW5nLnJhd2AsIHNvIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gYmVsb3cgcmVhY2hlcyB0aGUgZmlsZSB3aXRoIGl0cyBiYWNrc2xhc2hlcyBpbnRhY3QuXG4gICAgW0lOTElORV9JTVBPUlRTX0ZJTEVfTkFNRV06IFN0cmluZy5yYXdgLypcbiAqIEdlbmVyYXRlZCBieSBAbW5hb3Vtb3Yvb2JzaWRpYW4tZGV2LXRvb2xraXQuIEtlZXBzIGV2ZXJ5IGR5bmFtaWMgaW1wb3J0KCkgaW5zaWRlIG1haW4uanMuXG4gKlxuICogT2JzaWRpYW4gbG9hZHMgYSBwbHVnaW4ncyBtYWluLmpzIGFuZCBub3RoaW5nIGJlc2lkZSBpdCwgYW5kIHBhcmNlbCBtYWtlcyBldmVyeSBpbXBvcnQoKSBhIGJ1bmRsZSBvZiBpdHNcbiAqIG93biB3aXRoIG5vIG9wdGlvbiB0byBpbmxpbmUgb25lLiBUaGlzIHJld3JpdGVzIGltcG9ydCgnPGxpdGVyYWw+JykgaW50byBhIHJlcXVpcmUoKSBpbnNpZGUgYW4gYXN5bmNcbiAqIGFycm93LCBiZWZvcmUgcGFyY2VsJ3Mgb3duIEphdmFTY3JpcHQgdHJhbnNmb3JtZXIgcnVuczogdGhlIG1vZHVsZSBzdGlsbCBldmFsdWF0ZXMgb25seSB3aGVuIHRoYXQgY29kZVxuICogcnVucywgYW5kIHRoZSBwcm9taXNlIHN0aWxsIHJlamVjdHMgd2hlbiBldmFsdWF0aW9uIHRocm93cy4gT25seSBhIHBsYWluIHN0cmluZyBzcGVjaWZpZXIgaXMgcmV3cml0dGVuLFxuICogc2luY2UgYSBjb21wdXRlZCBvbmUgY2Fubm90IGJlIGJ1bmRsZWQgYnkgYW55IGJ1bmRsZXIuXG4gKi9cbmNvbnN0IHsgVHJhbnNmb3JtZXIgfSA9IHJlcXVpcmUoJ0BwYXJjZWwvcGx1Z2luJyk7XG5cbmNvbnN0IERZTkFNSUNfSU1QT1JUID0gL1xcYmltcG9ydFxcKFxccyooW1wiJ10pKFteXCInXFx4NjBcXG5cXFxcXSspXFwxXFxzKlxcKS9ndTtcblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgVHJhbnNmb3JtZXIoe1xuICBhc3luYyB0cmFuc2Zvcm0oeyBhc3NldCB9KSB7XG4gICAgY29uc3Qgc291cmNlID0gYXdhaXQgYXNzZXQuZ2V0Q29kZSgpO1xuICAgIGlmIChzb3VyY2UuaW5jbHVkZXMoJ2ltcG9ydCgnKSkge1xuICAgICAgYXNzZXQuc2V0Q29kZShzb3VyY2UucmVwbGFjZShEWU5BTUlDX0lNUE9SVCwgKF9tYXRjaCwgcXVvdGUsIHNwZWNpZmllcikgPT4gJyhhc3luYyAoKSA9PiByZXF1aXJlKCcgKyBxdW90ZSArIHNwZWNpZmllciArIHF1b3RlICsgJykpKCknKSk7XG4gICAgfVxuICAgIHJldHVybiBbYXNzZXRdO1xuICB9XG59KTtcbmAsXG4gICAgW05BTUVSX0ZJTEVfTkFNRV06IGAvKiBHZW5lcmF0ZWQgYnkgQG1uYW91bW92L29ic2lkaWFuLWRldi10b29sa2l0LiBPYnNpZGlhbiBsb2FkcyBhIHBsdWdpbidzIHN0eWxlc2hlZXQgZnJvbSBzdHlsZXMuY3NzIGFuZCBub3RoaW5nIGVsc2UuICovXG5jb25zdCB7IE5hbWVyIH0gPSByZXF1aXJlKCdAcGFyY2VsL3BsdWdpbicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBOYW1lcih7XG4gIG5hbWUoeyBidW5kbGUgfSkge1xuICAgIHJldHVybiBidW5kbGUudHlwZSA9PT0gJ2NzcycgPyAnJHtPYnNpZGlhblBsdWdpblJlcG9QYXRocy5TdHlsZXNDc3N9JyA6IG51bGw7XG4gIH1cbn0pO1xuYCxcbiAgICBbT1BUSU1JWkVSX0ZJTEVfTkFNRV06IGAvKlxuICogR2VuZXJhdGVkIGJ5IEBtbmFvdW1vdi9vYnNpZGlhbi1kZXYtdG9vbGtpdC4gUnVucyBhZnRlciBwYXJjZWwncyBvd24gb3B0aW1pemVycywgb24gdGhlIEphdmFTY3JpcHQgYnVuZGxlLlxuICpcbiAqIE9ic2lkaWFuIGV2YWx1YXRlcyBtYWluLmpzIGFzIHRoZSBib2R5IG9mIGZ1bmN0aW9uIChyZXF1aXJlLCBtb2R1bGUsIGV4cG9ydHMpLCB3aXRoIGEgbW9kdWxlIG9iamVjdCB0aGF0XG4gKiBoYXMgbm8gcmVxdWlyZSBvZiBpdHMgb3duLCBhbmQgcGFyY2VsJ3MgcnVudGltZSByZWFjaGVzIGV2ZXJ5IGV4dGVybmFsIG1vZHVsZSB0aHJvdWdoIG1vZHVsZS5yZXF1aXJlLlxuICogV2l0aG91dCB0aGUgZmlyc3QgbGluZSBiZWxvdywgdGhlIHZlcnkgZmlyc3QgcmVxdWlyZSgnb2JzaWRpYW4nKSB0aHJvd3MgXCJDYW5ub3QgZmluZCBtb2R1bGVcIi4gVGhlIGJhbm5lclxuICogZ29lcyBpbiBoZXJlIHRvbywgYWZ0ZXIgbWluaWZpY2F0aW9uLCB3aGljaCB3b3VsZCBvdGhlcndpc2Ugc3RyaXAgaXQgYXMgYW4gb3JkaW5hcnkgY29tbWVudC5cbiAqL1xuY29uc3QgeyBPcHRpbWl6ZXIgfSA9IHJlcXVpcmUoJ0BwYXJjZWwvcGx1Z2luJyk7XG5cbmNvbnN0IFBSRUFNQkxFID0gJHtKU09OLnN0cmluZ2lmeShgJHtnZXRPYnNpZGlhblBsdWdpbkJhbm5lcigncGFyY2VsJyl9aWYgKHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUucmVxdWlyZSAhPT0gJ2Z1bmN0aW9uJykgeyBtb2R1bGUucmVxdWlyZSA9IHJlcXVpcmU7IH1cXG5gKX07XG5jb25zdCBQUkVBTUJMRV9MSU5FX0NPVU5UID0gJHtTdHJpbmcoZ2V0T2JzaWRpYW5QbHVnaW5CYW5uZXIoJ3BhcmNlbCcpLnNwbGl0KCdcXG4nKS5sZW5ndGgpfTtcblxuYXN5bmMgZnVuY3Rpb24gcmVhZENvbnRlbnRzKGNvbnRlbnRzKSB7XG4gIGlmICh0eXBlb2YgY29udGVudHMgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGNvbnRlbnRzO1xuICB9XG4gIGlmIChCdWZmZXIuaXNCdWZmZXIoY29udGVudHMpKSB7XG4gICAgcmV0dXJuIGNvbnRlbnRzLnRvU3RyaW5nKCd1dGYtOCcpO1xuICB9XG4gIGNvbnN0IGNodW5rcyA9IFtdO1xuICBmb3IgYXdhaXQgKGNvbnN0IGNodW5rIG9mIGNvbnRlbnRzKSB7XG4gICAgY2h1bmtzLnB1c2goQnVmZmVyLmZyb20oY2h1bmspKTtcbiAgfVxuICByZXR1cm4gQnVmZmVyLmNvbmNhdChjaHVua3MpLnRvU3RyaW5nKCd1dGYtOCcpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBPcHRpbWl6ZXIoe1xuICBhc3luYyBvcHRpbWl6ZSh7IGNvbnRlbnRzLCBtYXAgfSkge1xuICAgIGNvbnN0IGNvZGUgPSBhd2FpdCByZWFkQ29udGVudHMoY29udGVudHMpO1xuICAgIGlmIChtYXApIHtcbiAgICAgIG1hcC5vZmZzZXRMaW5lcygxLCBQUkVBTUJMRV9MSU5FX0NPVU5UKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgY29udGVudHM6IFBSRUFNQkxFICsgY29kZSwgbWFwIH07XG4gIH1cbn0pO1xuYCxcbiAgICBbUEFSQ0VMUkNdOiBgJHtKU09OLnN0cmluZ2lmeShwYXJjZWxyYywgbnVsbCwgSlNPTl9JTkRFTlQpfVxcbmAsXG4gICAgW1JFU09MVkVSX0ZJTEVfTkFNRV06IGAvKiBHZW5lcmF0ZWQgYnkgQG1uYW91bW92L29ic2lkaWFuLWRldi10b29sa2l0LiBMZWF2ZXMgdGhlIG1vZHVsZXMgT2JzaWRpYW4gc3VwcGxpZXMgYXQgcnVudGltZSB0byByZXF1aXJlKCkuICovXG5jb25zdCB7IFJlc29sdmVyIH0gPSByZXF1aXJlKCdAcGFyY2VsL3BsdWdpbicpO1xuXG5jb25zdCBFWFRFUk5BTFMgPSBuZXcgU2V0KCR7SlNPTi5zdHJpbmdpZnkoT0JTSURJQU5fUExVR0lOX0VYVEVSTkFMUyl9KTtcblxuZnVuY3Rpb24gZ2V0UGFja2FnZU5hbWUoc3BlY2lmaWVyKSB7XG4gIGNvbnN0IHNlZ21lbnRzID0gc3BlY2lmaWVyLnNwbGl0KCcvJyk7XG4gIHJldHVybiBzcGVjaWZpZXIuc3RhcnRzV2l0aCgnQCcpID8gc2VnbWVudHMuc2xpY2UoMCwgMikuam9pbignLycpIDogc2VnbWVudHNbMF07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbmV3IFJlc29sdmVyKHtcbiAgcmVzb2x2ZSh7IHNwZWNpZmllciB9KSB7XG4gICAgY29uc3QgaXNFeHRlcm5hbCA9IHNwZWNpZmllci5zdGFydHNXaXRoKCdub2RlOicpIHx8IEVYVEVSTkFMUy5oYXMoc3BlY2lmaWVyKSB8fCBFWFRFUk5BTFMuaGFzKGdldFBhY2thZ2VOYW1lKHNwZWNpZmllcikpO1xuICAgIHJldHVybiBpc0V4dGVybmFsID8geyBpc0V4Y2x1ZGVkOiB0cnVlIH0gOiBudWxsO1xuICB9XG59KTtcbmBcbiAgfTtcbn1cblxuLyoqXG4gKiBCdWlsZHMgdGhlIG9wdGlvbnMgaGFuZGVkIHRvIHBhcmNlbCdzIGBQYXJjZWxgIGNsYXNzLlxuICpcbiAqIFRoZSBvbmUgdGFyZ2V0IGlzIGBlbGVjdHJvbi1yZW5kZXJlcmAsIHdoZXJlIE9ic2lkaWFuIHJ1bnMgYSBwbHVnaW4sIGFuZCBDb21tb25KUy4gUGFyY2VsIGNvdW50cyB0aGF0XG4gKiBjb250ZXh0IGFzIGJvdGggYSBicm93c2VyIGFuZCBhIG5vZGUgb25lLCBhbmQgZWFjaCBoYWxmIG1hdHRlcnM6IG5vZGUga2VlcHMgdGhlIGJ1aWx0aW5zIGV4dGVybmFsLCBhbmRcbiAqIGJyb3dzZXIgcmVzb2x2ZXMgdGhlIGBicm93c2VyYCBleHBvcnQgY29uZGl0aW9uLiBgaW5jbHVkZU5vZGVNb2R1bGVzYCBidW5kbGVzIHRoZSBkZXBlbmRlbmNpZXMsIHdoaWNoIGFcbiAqIG5vZGUtZmxhdm91cmVkIGNvbnRleHQgd291bGQgb3RoZXJ3aXNlIGxlYXZlIGFzIGByZXF1aXJlKClgIGNhbGxzIG5vdGhpbmcgaW5zdGFsbHMgYmVzaWRlIGEgcGx1Z2luLCBhbmRcbiAqIGBpc0xpYnJhcnlgIGtlZXBzIHRoZSBlbnRyeSdzIGRlZmF1bHQgZXhwb3J0LCB3aGljaCBpcyBob3cgT2JzaWRpYW4gZmluZHMgdGhlIHBsdWdpbiBjbGFzcy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHtAbGluayBHZXRQYXJjZWxPcHRpb25zUGFyYW1zfS5cbiAqIEByZXR1cm5zIFRoZSBwYXJjZWwgb3B0aW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFBhcmNlbE9wdGlvbnMocGFyYW1zOiBHZXRQYXJjZWxPcHRpb25zUGFyYW1zKTogSW5pdGlhbFBhcmNlbE9wdGlvbnMge1xuICBjb25zdCB7IGJ1aWxkQ29udGV4dCwgY2FjaGVGb2xkZXIsIGNvbmZpZ1BhdGggfSA9IHBhcmFtcztcbiAgY29uc3QgdGFyZ2V0OiBUYXJnZXREZXNjcmlwdG9yID0ge1xuICAgIGNvbnRleHQ6ICdlbGVjdHJvbi1yZW5kZXJlcicsXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vbmFtZS1yZXBsYWNlbWVudHMgLS0gYGRpc3REaXJgIGlzIHRoZSBuYW1lIHBhcmNlbCdzIEFQSSByZWFkcy5cbiAgICBkaXN0RGlyOiBidWlsZENvbnRleHQuZGlzdEZvbGRlcixcbiAgICBpbmNsdWRlTm9kZU1vZHVsZXM6IHRydWUsXG4gICAgaXNMaWJyYXJ5OiB0cnVlLFxuICAgIG9wdGltaXplOiBidWlsZENvbnRleHQuaXNQcm9kdWN0aW9uQnVpbGQsXG4gICAgb3V0cHV0Rm9ybWF0OiAnY29tbW9uanMnLFxuICAgIHNvdXJjZU1hcDogIWJ1aWxkQ29udGV4dC5pc1Byb2R1Y3Rpb25CdWlsZCAmJiB7IGlubGluZTogdHJ1ZSB9XG4gIH07XG5cbiAgcmV0dXJuIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9uYW1lLXJlcGxhY2VtZW50cyAtLSBgY2FjaGVEaXJgIGlzIHRoZSBuYW1lIHBhcmNlbCdzIEFQSSByZWFkcy5cbiAgICBjYWNoZURpcjogY2FjaGVGb2xkZXIsXG4gICAgY29uZmlnOiBjb25maWdQYXRoLFxuICAgIGRlZmF1bHRUYXJnZXRPcHRpb25zOiB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9uYW1lLXJlcGxhY2VtZW50cyAtLSBgZGlzdERpcmAgaXMgdGhlIG5hbWUgcGFyY2VsJ3MgQVBJIHJlYWRzLlxuICAgICAgZGlzdERpcjogYnVpbGRDb250ZXh0LmRpc3RGb2xkZXIsXG4gICAgICBzaG91bGRPcHRpbWl6ZTogYnVpbGRDb250ZXh0LmlzUHJvZHVjdGlvbkJ1aWxkLFxuICAgICAgc291cmNlTWFwczogIWJ1aWxkQ29udGV4dC5pc1Byb2R1Y3Rpb25CdWlsZFxuICAgIH0sXG4gICAgZW50cmllczogYnVpbGRDb250ZXh0LmVudHJ5UG9pbnQsXG4gICAgbW9kZTogYnVpbGRDb250ZXh0LmlzUHJvZHVjdGlvbkJ1aWxkID8gJ3Byb2R1Y3Rpb24nIDogJ2RldmVsb3BtZW50JyxcbiAgICB0YXJnZXRzOiB7IG9ic2lkaWFuUGx1Z2luOiB0YXJnZXQgfVxuICB9O1xufVxuLyogdjggaWdub3JlIHN0YXJ0IC0tIFBhcnQgb2YgdGhlIHBhcmNlbCBidWlsZCBhYm92ZS4gKi9cbmZ1bmN0aW9uIGZvcm1hdFBhcmNlbEVycm9yKGVycm9yOiB1bmtub3duKTogc3RyaW5nIHtcbiAgY29uc3QgZGlhZ25vc3RpY3MgPSAoZXJyb3IgYXMgUGFyY2VsRXJyb3JMaWtlIHwgdW5kZWZpbmVkKT8uZGlhZ25vc3RpY3M7XG4gIGlmIChkaWFnbm9zdGljcyAmJiBkaWFnbm9zdGljcy5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIGRpYWdub3N0aWNzLm1hcCgoZGlhZ25vc3RpYykgPT4gZGlhZ25vc3RpYy5tZXNzYWdlKS5qb2luKCdcXG4nKTtcbiAgfVxuICByZXR1cm4gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLnN0YWNrID8/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpO1xufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUgVVJMIG9mIGEgbW9kdWxlIG9mIHRoaXMgZm9sZGVyLCBpbiB0aGUgc2FtZSBmb3JtIGFzIHRoaXMgb25lIChgLnRzYCBmcm9tIHNvdXJjZSwgYC5tanNgIG9yIGAuY2pzYCBvbmNlXG4gKiBidWlsdCksIHdoaWNoIHRoZSBnZW5lcmF0ZWQgdHJhbnNmb3JtZXIgaW1wb3J0cy5cbiAqXG4gKiBAcGFyYW0gYmFzZU5hbWUgLSBUaGUgbW9kdWxlJ3MgZmlsZSBuYW1lIHdpdGhvdXQgaXRzIGV4dGVuc2lvbi5cbiAqIEByZXR1cm5zIFRoZSBtb2R1bGUncyBgZmlsZTpgIFVSTC5cbiAqL1xuZnVuY3Rpb24gZ2V0U2libGluZ01vZHVsZVVybChiYXNlTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIG5ldyBVUkwoYCR7YmFzZU5hbWV9JHtleHRuYW1lKG5ldyBVUkwoaW1wb3J0Lm1ldGEudXJsKS5wYXRobmFtZSl9YCwgaW1wb3J0Lm1ldGEudXJsKS5ocmVmO1xufVxuXG5mdW5jdGlvbiBoYW5kbGVXYXRjaEV2ZW50KGV2ZW50OiBCdWlsZEV2ZW50IHwgdW5kZWZpbmVkLCBidWlsZENvbnRleHQ6IE9ic2lkaWFuUGx1Z2luQnVpbGRDb250ZXh0KTogdm9pZCB7XG4gIGlmIChldmVudD8udHlwZSA9PT0gJ2J1aWxkRmFpbHVyZScpIHtcbiAgICBjb25zb2xlLmVycm9yKGV2ZW50LmRpYWdub3N0aWNzLm1hcCgoZGlhZ25vc3RpYykgPT4gZGlhZ25vc3RpYy5tZXNzYWdlKS5qb2luKCdcXG4nKSk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChldmVudD8udHlwZSAhPT0gJ2J1aWxkU3VjY2VzcycpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zb2xlLndhcm4oYFJlYnVpbHQgd2l0aCBwYXJjZWwgaW4gJHtTdHJpbmcoZXZlbnQuYnVpbGRUaW1lKX0gbXMuYCk7XG4gIGludm9rZUFzeW5jU2FmZWx5KCgpID0+IGRlcGxveVRvT2JzaWRpYW5QbHVnaW5zRm9sZGVyKGJ1aWxkQ29udGV4dCkpO1xufVxuLyogdjggaWdub3JlIHN0b3AgKi9cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFtQ0EsdUJBQThCO0FBQzlCLHFCQUErQjtBQUMvQixtQkFBa0M7QUFDbEMsa0JBS087QUFDUCxx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
493
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9idW5kbGVycy9wYXJjZWwudHMiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIF9faW1wb3J0X21ldGFfdXJsID0gZ2xvYmFsVGhpc1snaW1wb3J0Lm1ldGEudXJsJ10gPz8gKGZ1bmN0aW9uIGdldENqc0ltcG9ydE1ldGFVcmwoKSB7XG4gIGlmICh0eXBlb2YgX19maWxlbmFtZSA9PT0gXCJzdHJpbmdcIikge1xuICAgIGNvbnN0IGxvY2FsUmVxdWlyZSA9IHJlcXVpcmU7XG4gICAgY29uc3QgdXJsID0gbG9jYWxSZXF1aXJlKFwibm9kZTp1cmxcIik7XG4gICAgaWYgKHR5cGVvZiB1cmwucGF0aFRvRmlsZVVSTCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICByZXR1cm4gdXJsLnBhdGhUb0ZpbGVVUkwoX19maWxlbmFtZSkuaHJlZjtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGdsb2JhbFRoaXMubG9jYXRpb24/LmhyZWYgPz8gXCJcIjtcbn0pKCk7XG4vKipcbiAqIEBmaWxlXG4gKlxuICogQnVpbGRzIGFuIE9ic2lkaWFuIHBsdWdpbiB3aXRoIHBhcmNlbDogYGJ1aWxkKClgIGFuZCBgZGV2KClgLCB0aGUgc2FtZSB0d28gZW50cnkgcG9pbnRzIHRoZSBlc2J1aWxkXG4gKiBidWlsZGVyIGhhcywgcHJvZHVjaW5nIHRoZSBzYW1lIGBtYWluLmpzYCArIGBzdHlsZXMuY3NzYCArIGBtYW5pZmVzdC5qc29uYCBsYXlvdXQuXG4gKlxuICogUGFyY2VsIHRha2VzIG5vIGBleHRlcm5hbGAgbGlzdCBhbmQgbm8gb3V0cHV0IGZpbGUgbmFtZSwgb25seSBwbHVnaW5zIG5hbWVkIGluIGEgYC5wYXJjZWxyY2AuIFNvIHRoZVxuICogYnVpbGQgd3JpdGVzIGEgYC5wYXJjZWxyY2Agb2YgaXRzIG93biBpbnRvIGAucGFyY2VsLWNhY2hlYCwgYmVzaWRlIGEgcmVzb2x2ZXIgdGhhdCBsZWF2ZXNcbiAqIE9ic2lkaWFuJ3MgbW9kdWxlcyBleHRlcm5hbCBhbmQgcmVzb2x2ZXMgcGFja2FnZXMgd2l0aCB0aGUgYnJvd3NlcidzIGV4cG9ydCBjb25kaXRpb25zLCBhIG5hbWVyIHRoYXQgbmFtZXNcbiAqIHRoZSBzdHlsZXNoZWV0IGBzdHlsZXMuY3NzYCwgYSB0cmFuc2Zvcm1lciB0aGF0IGtlZXBzIGR5bmFtaWMgaW1wb3J0cyBpbnNpZGUgYG1haW4uanNgLCBhbmQgYW4gb3B0aW1pemVyIHRoYXRcbiAqIGxldHMgdGhlIG1pbmlmaWVyIHJlbmFtZSB0aGUgYnVuZGxlJ3MgdG9wLWxldmVsIGJpbmRpbmdzLCBhbmQgZXh0ZW5kcyB0aGVcbiAqIGNvbnN1bWVyJ3Mgb3duIGAucGFyY2VscmNgIHdoZW4gdGhlcmUgaXMgb25lIChvciBgQHBhcmNlbC9jb25maWctZGVmYXVsdGAgd2hlbiB0aGVyZSBpcyBub25lKSwgc28gZXZlcnlcbiAqIHRyYW5zZm9ybWVyIHRoZSBjb25zdW1lciBjb25maWd1cmVkIHN0aWxsIGFwcGxpZXMuXG4gKlxuICogYEBwYXJjZWwvY29yZWAsIGBAcGFyY2VsL3BsdWdpbmAgYW5kIGBAcGFyY2VsL2NvbmZpZy1kZWZhdWx0YCBhcmUgb3B0aW9uYWwgcGVlciBkZXBlbmRlbmNpZXMsIGxvYWRlZFxuICogb25seSB3aGVuIGEgcGFyY2VsIGJ1aWxkIHJ1bnMsIHNvIGEgcGx1Z2luIGJ1aWx0IHdpdGggZXNidWlsZCBpbnN0YWxscyBub3RoaW5nIGV4dHJhLlxuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgQnVpbGRFdmVudCxcbiAgSW5pdGlhbFBhcmNlbE9wdGlvbnMsXG4gIFRhcmdldERlc2NyaXB0b3Jcbn0gZnJvbSAnQHBhcmNlbC90eXBlcyc7XG5cbmltcG9ydCB7IENsaVRhc2tSZXN1bHQgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1kZXYtdG9vbGtpdC9jbGktdXRpbHMnO1xuaW1wb3J0IHsgbnBtUnVuT3B0aW9uYWwgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1kZXYtdG9vbGtpdC9ucG0tcnVuJztcbmltcG9ydCB7IGludm9rZUFzeW5jU2FmZWx5IH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2FzeW5jJztcbmltcG9ydCB7XG4gIGV4dG5hbWUsXG4gIGpvaW4sXG4gIHJlbGF0aXZlLFxuICB0b1Bvc2l4UGF0aFxufSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvcGF0aCc7XG5pbXBvcnQgeyBleGlzdHNTeW5jIH0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQge1xuICBta2RpcixcbiAgcmVhZEZpbGUsXG4gIHdyaXRlRmlsZVxufSBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcblxuaW1wb3J0IHR5cGUge1xuICBPYnNpZGlhblBsdWdpbkJ1aWxkQ29udGV4dCxcbiAgT2JzaWRpYW5QbHVnaW5EZXBsb3ltZW50T3B0aW9uc1xufSBmcm9tICcuL29ic2lkaWFuLXBsdWdpbi1idWlsZC50cyc7XG5pbXBvcnQgdHlwZSB7IE9ic2lkaWFuUGx1Z2luRmVhdHVyZU9wdGlvbnMgfSBmcm9tICcuL29ic2lkaWFuLXBsdWdpbi1mZWF0dXJlcy50cyc7XG5cbmltcG9ydCB7IE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzIH0gZnJvbSAnLi4vb2JzaWRpYW4tcGx1Z2luLXJlcG8tcGF0aHMudHMnO1xuaW1wb3J0IHtcbiAgQnVpbGRNb2RlLFxuICBjbGVhbk9ic2lkaWFuUGx1Z2luRGlzdEZvbGRlcixcbiAgY29tcGxldGVPYnNpZGlhblBsdWdpbkRpc3RGb2xkZXIsXG4gIGdldE9ic2lkaWFuUGx1Z2luQmFubmVyLFxuICBPQlNJRElBTl9QTFVHSU5fRVhURVJOQUxTLFxuICByZXNvbHZlRnJvbVJvb3QsXG4gIHJlc29sdmVPYnNpZGlhblBsdWdpbkJ1aWxkQ29udGV4dFxufSBmcm9tICcuL29ic2lkaWFuLXBsdWdpbi1idWlsZC50cyc7XG5pbXBvcnQge1xuICBnZXRGcmFtZXdvcmtEZWZpbmVzLFxuICBnZXRKc3hJbXBvcnRTb3VyY2UsXG4gIGlzUG9zdGNzc05lZWRlZFxufSBmcm9tICcuL29ic2lkaWFuLXBsdWdpbi1mZWF0dXJlcy50cyc7XG5pbXBvcnQgeyBkZXBsb3lUb09ic2lkaWFuUGx1Z2luc0ZvbGRlciB9IGZyb20gJy4vb2JzaWRpYW4tcGx1Z2lucy1mb2xkZXItZGVwbG95bWVudC50cyc7XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIGJ1aWxkT2JzaWRpYW5QbHVnaW5XaXRoUGFyY2VsfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWlsZE9ic2lkaWFuUGx1Z2luV2l0aFBhcmNlbFBhcmFtcyBleHRlbmRzIEJ1aWxkT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBBIGJ1aWxkIG1vZGUsIGVpdGhlciBgRGV2ZWxvcG1lbnRgIG9yIGBQcm9kdWN0aW9uYC5cbiAgICovXG4gIHJlYWRvbmx5IG1vZGU6IEJ1aWxkTW9kZTtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgYnVpbGR9IGFuZCB7QGxpbmsgZGV2fS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWlsZE9wdGlvbnMgZXh0ZW5kcyBPYnNpZGlhblBsdWdpbkRlcGxveW1lbnRPcHRpb25zLCBPYnNpZGlhblBsdWdpbkZlYXR1cmVPcHRpb25zIHtcbiAgLyoqXG4gICAqIEN1c3RvbWl6ZXMgdGhlIG9wdGlvbnMgaGFuZGVkIHRvIHBhcmNlbCdzIGBQYXJjZWxgIGNsYXNzLlxuICAgKi9cbiAgcmVhZG9ubHkgY3VzdG9taXplUGFyY2VsT3B0aW9ucz86IChvcHRpb25zOiBJbml0aWFsUGFyY2VsT3B0aW9ucykgPT4gSW5pdGlhbFBhcmNlbE9wdGlvbnM7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGdldFBhcmNlbENvbmZpZ0ZpbGVzfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZXRQYXJjZWxDb25maWdGaWxlc1BhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgY29uc3VtZXIncyBvd24gYC5wYXJjZWxyY2AsIHJlbGF0aXZlIHRvIHRoZSBnZW5lcmF0ZWQgY29uZmlndXJhdGlvbidzIGZvbGRlciwgb3IgYHVuZGVmaW5lZGAgd2hlbiB0aGUgcHJvamVjdFxuICAgKiBoYXMgbm9uZS5cbiAgICovXG4gIHJlYWRvbmx5IGNvbnN1bWVyUGFyY2VscmNQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFRoZSBidWlsZCBmZWF0dXJlcy5cbiAgICovXG4gIHJlYWRvbmx5IGZlYXR1cmVzPzogT2JzaWRpYW5QbHVnaW5GZWF0dXJlT3B0aW9ucztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZ2V0UGFyY2VsT3B0aW9uc30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2V0UGFyY2VsT3B0aW9uc1BhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgYnVpbGQgY29udGV4dC5cbiAgICovXG4gIHJlYWRvbmx5IGJ1aWxkQ29udGV4dDogT2JzaWRpYW5QbHVnaW5CdWlsZENvbnRleHQ7XG5cbiAgLyoqXG4gICAqIFBhcmNlbCdzIGNhY2hlIGZvbGRlci4gTmFtZWQgZXhwbGljaXRseSBiZWNhdXNlIHBhcmNlbCBvdGhlcndpc2UgdGFrZXMgdGhlIGZvbGRlciBvZiB0aGUgbmVhcmVzdFxuICAgKiBsb2NrZmlsZSBmb3IgdGhlIHByb2plY3Qgcm9vdCwgd2hpY2ggaW4gYSB3b3Jrc3BhY2UgaXMgbm90IHRoZSBwbHVnaW4ncy5cbiAgICovXG4gIHJlYWRvbmx5IGNhY2hlRm9sZGVyOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBnZW5lcmF0ZWQgYC5wYXJjZWxyY2AuXG4gICAqL1xuICByZWFkb25seSBjb25maWdQYXRoOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIGZpbGVzIG9mIHRoZSBnZW5lcmF0ZWQgcGFyY2VsIGNvbmZpZ3VyYXRpb24sIGJ5IGZpbGUgbmFtZS5cbiAqL1xuZXhwb3J0IHR5cGUgUGFyY2VsQ29uZmlnRmlsZXMgPSBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PjtcblxuLy8gSW5zaWRlIHBhcmNlbCdzIG93biBjYWNoZSBmb2xkZXI6IHBhcmNlbCByZWZ1c2VzIHJlbGF0aXZlIHBsdWdpbnMgaW4gYSBjb25maWcgdW5kZXIgYG5vZGVfbW9kdWxlc2AgKGl0XG4vLyB0YWtlcyBzdWNoIGEgY29uZmlnIGZvciBhIHB1Ymxpc2hlZCBwYWNrYWdlKSwgYW5kIGl0IG5ldmVyIHdhdGNoZXMgaXRzIGNhY2hlIGZvbGRlciwgc28gcmVnZW5lcmF0aW5nXG4vLyB0aGVzZSBmaWxlcyBvbiBldmVyeSBidWlsZCBjYW5ub3QgdHJpZ2dlciBhIHJlYnVpbGQuXG5jb25zdCBQQVJDRUxfQ0FDSEVfRk9MREVSID0gJy5wYXJjZWwtY2FjaGUnO1xuY29uc3QgR0VORVJBVEVEX1BBUkNFTF9DT05GSUdfRk9MREVSID0gYCR7UEFSQ0VMX0NBQ0hFX0ZPTERFUn0vb2JzaWRpYW4tZGV2LXRvb2xraXRgO1xuY29uc3QgUEFSQ0VMUkMgPSAnLnBhcmNlbHJjJztcblxuLyoqXG4gKiBPbmUgZGlhZ25vc3RpYyBvZiBhIHtAbGluayBQYXJjZWxFcnJvckxpa2V9LlxuICovXG5pbnRlcmZhY2UgUGFyY2VsRXJyb3JEaWFnbm9zdGljIHtcbiAgcmVhZG9ubHkgbWVzc2FnZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFdoYXQgcGFyY2VsIHRocm93cyB3aGVuIGEgYnVpbGQgZmFpbHM6IGFuIGVycm9yIGNhcnJ5aW5nIGl0cyBkaWFnbm9zdGljcy5cbiAqL1xuaW50ZXJmYWNlIFBhcmNlbEVycm9yTGlrZSB7XG4gIHJlYWRvbmx5IGRpYWdub3N0aWNzPzogcmVhZG9ubHkgUGFyY2VsRXJyb3JEaWFnbm9zdGljW107XG59XG5jb25zdCBSRVNPTFZFUl9GSUxFX05BTUUgPSAnb2JzaWRpYW4tcGx1Z2luLXJlc29sdmVyLmNqcyc7XG5jb25zdCBOQU1FUl9GSUxFX05BTUUgPSAnb2JzaWRpYW4tcGx1Z2luLW5hbWVyLmNqcyc7XG5jb25zdCBJTkxJTkVfSU1QT1JUU19GSUxFX05BTUUgPSAnb2JzaWRpYW4tcGx1Z2luLWlubGluZS1pbXBvcnRzLmNqcyc7XG5jb25zdCBPUFRJTUlaRVJfRklMRV9OQU1FID0gJ29ic2lkaWFuLXBsdWdpbi1vcHRpbWl6ZXIuY2pzJztcbmNvbnN0IFBSRV9NSU5JRllfRklMRV9OQU1FID0gJ29ic2lkaWFuLXBsdWdpbi1wcmUtbWluaWZ5LmNqcyc7XG5jb25zdCBGRUFUVVJFU19GSUxFX05BTUUgPSAnb2JzaWRpYW4tcGx1Z2luLWZlYXR1cmVzLmNqcyc7XG5jb25zdCBKU09OX0lOREVOVCA9IDI7XG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBSdW5zIGEgcmVhbCBwYXJjZWwgYnVpbGQ7IGV4ZXJjaXNlZCBieSB0aGUgYnVuZGxlciBpbnRlZ3JhdGlvbiB0ZXN0LiAqL1xuLyoqXG4gKiBCdWlsZHMgdGhlIE9ic2lkaWFuIHBsdWdpbiBpbiBwcm9kdWN0aW9uIG1vZGUgdXNpbmcgcGFyY2VsLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9uYWwgYnVpbGQgb3B0aW9ucy5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgYnVpbGQgaXMgY29tcGxldGUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWlsZChvcHRpb25zPzogQnVpbGRPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGJ1aWxkT2JzaWRpYW5QbHVnaW5XaXRoUGFyY2VsKHsgLi4ub3B0aW9ucywgbW9kZTogQnVpbGRNb2RlLlByb2R1Y3Rpb24gfSk7XG4gIHJlc3VsdC50aHJvd09uRmFpbHVyZSgpO1xufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUgT2JzaWRpYW4gcGx1Z2luIHdpdGggcGFyY2VsLCBvbmNlIGZvciBhIHByb2R1Y3Rpb24gYnVpbGQsIG9yIHdhdGNoaW5nIGZvciBhIGRldmVsb3BtZW50IG9uZS5cbiAqXG4gKiBSdW5zIHRoZSBwcm9qZWN0J3MgYGJ1aWxkOmNvbXBpbGVgIHNjcmlwdCBmaXJzdCB3aGVuIGl0IGhhcyBvbmUsIGFzIHRoZSBlc2J1aWxkIGJ1aWxkZXIgZG9lcywgc2luY2VcbiAqIHBhcmNlbCBzdHJpcHMgVHlwZVNjcmlwdCB0eXBlcyB3aXRob3V0IGNoZWNraW5nIHRoZW0uXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSB7QGxpbmsgQnVpbGRPYnNpZGlhblBsdWdpbldpdGhQYXJjZWxQYXJhbXN9LlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byBhIHtAbGluayBDbGlUYXNrUmVzdWx0fSBpbmRpY2F0aW5nIHRoZSBzdWNjZXNzIG9yIGZhaWx1cmUgb2YgdGhlIGJ1aWxkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnVpbGRPYnNpZGlhblBsdWdpbldpdGhQYXJjZWwocGFyYW1zOiBCdWlsZE9ic2lkaWFuUGx1Z2luV2l0aFBhcmNlbFBhcmFtcyk6IFByb21pc2U8Q2xpVGFza1Jlc3VsdD4ge1xuICBhd2FpdCBucG1SdW5PcHRpb25hbCgnYnVpbGQ6Y29tcGlsZScpO1xuICBjb25zdCBidWlsZENvbnRleHQgPSBhd2FpdCByZXNvbHZlT2JzaWRpYW5QbHVnaW5CdWlsZENvbnRleHQocGFyYW1zKTtcbiAgYXdhaXQgY2xlYW5PYnNpZGlhblBsdWdpbkRpc3RGb2xkZXIoYnVpbGRDb250ZXh0LmRpc3RGb2xkZXIpO1xuICBhd2FpdCBjb21wbGV0ZU9ic2lkaWFuUGx1Z2luRGlzdEZvbGRlcihidWlsZENvbnRleHQpO1xuXG4gIGNvbnN0IGNvbmZpZ0ZvbGRlciA9IHJlc29sdmVGcm9tUm9vdChHRU5FUkFURURfUEFSQ0VMX0NPTkZJR19GT0xERVIpO1xuICBjb25zdCBjb25zdW1lclBhcmNlbHJjUGF0aCA9IHJlc29sdmVGcm9tUm9vdChQQVJDRUxSQyk7XG4gIGF3YWl0IG1rZGlyKGNvbmZpZ0ZvbGRlciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGNvbnN0IGNvbmZpZ0ZpbGVzID0gZ2V0UGFyY2VsQ29uZmlnRmlsZXMoe1xuICAgIGNvbnN1bWVyUGFyY2VscmNQYXRoOiBleGlzdHNTeW5jKGNvbnN1bWVyUGFyY2VscmNQYXRoKSA/IHRvUG9zaXhQYXRoKHJlbGF0aXZlKGNvbmZpZ0ZvbGRlciwgY29uc3VtZXJQYXJjZWxyY1BhdGgpKSA6IHVuZGVmaW5lZCxcbiAgICBmZWF0dXJlczogcGFyYW1zXG4gIH0pO1xuICBmb3IgKGNvbnN0IFtmaWxlTmFtZSwgY29udGVudHNdIG9mIE9iamVjdC5lbnRyaWVzKGNvbmZpZ0ZpbGVzKSkge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gam9pbihjb25maWdGb2xkZXIsIGZpbGVOYW1lKTtcbiAgICAvLyBSZXdyaXR0ZW4gb25seSB3aGVuIGl0IGNoYW5nZWQ6IHBhcmNlbCBpbnZhbGlkYXRlcyBpdHMgY2FjaGUgb24gYSBjb25maWcgZmlsZSdzIG1vZGlmaWNhdGlvbiB0aW1lLlxuICAgIGlmICghZXhpc3RzU3luYyhmaWxlUGF0aCkgfHwgYXdhaXQgcmVhZEZpbGUoZmlsZVBhdGgsICd1dGYtOCcpICE9PSBjb250ZW50cykge1xuICAgICAgYXdhaXQgd3JpdGVGaWxlKGZpbGVQYXRoLCBjb250ZW50cywgJ3V0Zi04Jyk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgeyBQYXJjZWwgfSA9IGF3YWl0IGltcG9ydCgnQHBhcmNlbC9jb3JlJyk7XG4gIGNvbnN0IHBhcmNlbE9wdGlvbnMgPSBnZXRQYXJjZWxPcHRpb25zKHsgYnVpbGRDb250ZXh0LCBjYWNoZUZvbGRlcjogcmVzb2x2ZUZyb21Sb290KFBBUkNFTF9DQUNIRV9GT0xERVIpLCBjb25maWdQYXRoOiBqb2luKGNvbmZpZ0ZvbGRlciwgUEFSQ0VMUkMpIH0pO1xuICBjb25zdCBidW5kbGVyID0gbmV3IFBhcmNlbChwYXJhbXMuY3VzdG9taXplUGFyY2VsT3B0aW9ucz8uKHBhcmNlbE9wdGlvbnMpID8/IHBhcmNlbE9wdGlvbnMpO1xuXG4gIGlmIChidWlsZENvbnRleHQuaXNQcm9kdWN0aW9uQnVpbGQpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgeyBidWlsZFRpbWUsIGJ1bmRsZUdyYXBoIH0gPSBhd2FpdCBidW5kbGVyLnJ1bigpO1xuICAgICAgY29uc29sZS53YXJuKGBCdWlsdCAke1N0cmluZyhidW5kbGVHcmFwaC5nZXRCdW5kbGVzKCkubGVuZ3RoKX0gYnVuZGxlKHMpIHdpdGggcGFyY2VsIGluICR7U3RyaW5nKGJ1aWxkVGltZSl9IG1zLmApO1xuICAgICAgcmV0dXJuIENsaVRhc2tSZXN1bHQuU3VjY2VzcygpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGZvcm1hdFBhcmNlbEVycm9yKGVycm9yKSk7XG4gICAgICByZXR1cm4gQ2xpVGFza1Jlc3VsdC5GYWlsdXJlKCk7XG4gICAgfVxuICB9XG5cbiAgYXdhaXQgYnVuZGxlci53YXRjaCgoZXJyb3IsIGV2ZW50KSA9PiB7XG4gICAgaWYgKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGZvcm1hdFBhcmNlbEVycm9yKGVycm9yKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGhhbmRsZVdhdGNoRXZlbnQoZXZlbnQsIGJ1aWxkQ29udGV4dCk7XG4gIH0pO1xuICByZXR1cm4gQ2xpVGFza1Jlc3VsdC5Eb05vdEV4aXQoKTtcbn1cblxuLyoqXG4gKiBCdWlsZHMgdGhlIE9ic2lkaWFuIHBsdWdpbiBpbiBkZXZlbG9wbWVudCBtb2RlIHVzaW5nIHBhcmNlbCwgd2F0Y2hpbmcgZm9yIGNoYW5nZXMgYW5kIGRlcGxveWluZyBldmVyeVxuICogc3VjY2Vzc2Z1bCByZWJ1aWxkIGludG8gdGhlIHZhdWx0LlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9uYWwgYnVpbGQgb3B0aW9ucy5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gYSB7QGxpbmsgQ2xpVGFza1Jlc3VsdH0gaW5kaWNhdGluZyB0aGUgYnVpbGQgcmVzdWx0LlxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdHlwZXNjcmlwdC1kZXYtdG9vbGtpdC9wYXJhbXMtb3B0aW9ucy1uYW1lLW1hdGNoIC0tIEludGVudGlvbmFsbHkgc2hhcmVzIEJ1aWxkT3B0aW9ucyB3aXRoIGJ1aWxkKCkuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGV2KG9wdGlvbnM/OiBCdWlsZE9wdGlvbnMpOiBQcm9taXNlPENsaVRhc2tSZXN1bHQ+IHtcbiAgcmV0dXJuIGF3YWl0IGJ1aWxkT2JzaWRpYW5QbHVnaW5XaXRoUGFyY2VsKHsgLi4ub3B0aW9ucywgbW9kZTogQnVpbGRNb2RlLkRldmVsb3BtZW50IH0pO1xufVxuLyogdjggaWdub3JlIHN0b3AgKi9cblxuLyoqXG4gKiBHZW5lcmF0ZXMgdGhlIGZpbGVzIG9mIHRoZSBwYXJjZWwgY29uZmlndXJhdGlvbiB0aGUgYnVpbGQgcnVucyB3aXRoLlxuICpcbiAqIFRoZSBidWlsZCBmZWF0dXJlcyBhZGQgcGlwZWxpbmVzIHRoYXQgcnVuIHRoZSB0b29sa2l0J3Mgc2hhcmVkIHRyYW5zZm9ybXMsIHRocm91Z2ggb25lIGdlbmVyYXRlZCB0cmFuc2Zvcm1lciB0aGF0XG4gKiBsb2FkcyB0aGVtIGZyb20gdGhlIHRvb2xraXQ6IFNvbGlkJ3MgYC5qc3hgIC8gYC50c3hgLCBTdmVsdGUncyBgLnN2ZWx0ZWAgLyBgLnN2ZWx0ZS50c2AgLyBgLnN2ZWx0ZS5qc2AsIGAud2FzbWAsXG4gKiBhbmQgd2l0aCBgc3R5bGVzLnBvc3Rjc3NgIG9yIGBzdHlsZXMudGFpbHdpbmRgIGV2ZXJ5IHN0eWxlc2hlZXQsIGluIHBsYWNlIG9mIHBhcmNlbCdzIG93biBQb3N0Q1NTIHN0ZXAuIFJlYWN0IGFuZFxuICogUHJlYWN0IEpTWCBpcyBjb21waWxlZCBoZXJlIHRvbywgc2luY2UgcGFyY2VsIHJlYWRzIHRoZSBKU1ggcnVudGltZSBmcm9tIGEgdHNjb25maWcgd2l0aG91dCBmb2xsb3dpbmcgaXRzIGBleHRlbmRzYCxcbiAqIGFuZCB3aXRoIGFueSBmcmFtZXdvcmsgZXZlcnkgc2NyaXB0IGhhcyB0aGUgZnJhbWV3b3JrJ3MgY29tcGlsZS10aW1lIGNvbnN0YW50cyByZXBsYWNlZC4gUGFyY2VsIGNvbXBpbGVzIFZ1ZSB3aXRoXG4gKiBgQHBhcmNlbC90cmFuc2Zvcm1lci12dWVgIGFuZCBzY29wZXMgYCoubW9kdWxlLmNzc2AgaXRzZWxmLCBzbyB0aG9zZSBuZWVkIG5vIHBpcGVsaW5lIGhlcmUuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSB7QGxpbmsgR2V0UGFyY2VsQ29uZmlnRmlsZXNQYXJhbXN9LlxuICogQHJldHVybnMgVGhlIGZpbGVzLCBieSBmaWxlIG5hbWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRQYXJjZWxDb25maWdGaWxlcyhwYXJhbXM6IEdldFBhcmNlbENvbmZpZ0ZpbGVzUGFyYW1zKTogUGFyY2VsQ29uZmlnRmlsZXMge1xuICBjb25zdCB7IGNvbnN1bWVyUGFyY2VscmNQYXRoLCBmZWF0dXJlcyA9IHt9IH0gPSBwYXJhbXM7XG4gIGNvbnN0IGZlYXR1cmVUcmFuc2Zvcm1lciA9IGAuLyR7RkVBVFVSRVNfRklMRV9OQU1FfWA7XG4gIGNvbnN0IHRyYW5zZm9ybWVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+ID0ge307XG4gIGlmIChmZWF0dXJlcy5mcmFtZXdvcmsgPT09ICdzdmVsdGUnKSB7XG4gICAgdHJhbnNmb3JtZXJzWycqLnN2ZWx0ZSddID0gW2ZlYXR1cmVUcmFuc2Zvcm1lcl07XG4gICAgdHJhbnNmb3JtZXJzWycqLnN2ZWx0ZS57anMsdHN9J10gPSBbZmVhdHVyZVRyYW5zZm9ybWVyLCBgLi8ke0lOTElORV9JTVBPUlRTX0ZJTEVfTkFNRX1gLCAnLi4uJ107XG4gIH1cbiAgaWYgKGZlYXR1cmVzLmZyYW1ld29yayA9PT0gJ3NvbGlkJyB8fCBnZXRKc3hJbXBvcnRTb3VyY2UoZmVhdHVyZXMuZnJhbWV3b3JrKSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgdHJhbnNmb3JtZXJzWycqLntqc3gsdHN4fSddID0gW2ZlYXR1cmVUcmFuc2Zvcm1lcl07XG4gIH1cbiAgaWYgKGZlYXR1cmVzLndhc20pIHtcbiAgICB0cmFuc2Zvcm1lcnNbJyoud2FzbSddID0gW2ZlYXR1cmVUcmFuc2Zvcm1lcl07XG4gIH1cbiAgaWYgKGlzUG9zdGNzc05lZWRlZChmZWF0dXJlcy5zdHlsZXMpKSB7XG4gICAgdHJhbnNmb3JtZXJzWycqLntjc3MscGNzc30nXSA9IFtmZWF0dXJlVHJhbnNmb3JtZXIsICdAcGFyY2VsL3RyYW5zZm9ybWVyLWNzcyddO1xuICB9XG4gIGNvbnN0IGRlZmluZXMgPSBnZXRGcmFtZXdvcmtEZWZpbmVzKHsgZnJhbWV3b3JrOiBmZWF0dXJlcy5mcmFtZXdvcmssIGlzUHJvZHVjdGlvbkJ1aWxkOiB0cnVlIH0pO1xuICB0cmFuc2Zvcm1lcnNbJyoue2pzLG1qcyxjanMsanN4LHRzLG10cyxjdHMsdHN4fSddID0gW1xuICAgIC4uLk9iamVjdC5rZXlzKGRlZmluZXMpLmxlbmd0aCA+IDAgPyBbZmVhdHVyZVRyYW5zZm9ybWVyXSA6IFtdLFxuICAgIGAuLyR7SU5MSU5FX0lNUE9SVFNfRklMRV9OQU1FfWAsXG4gICAgJy4uLidcbiAgXTtcblxuICBjb25zdCBwYXJjZWxyYyA9IHtcbiAgICBleHRlbmRzOiBjb25zdW1lclBhcmNlbHJjUGF0aCA/PyAnQHBhcmNlbC9jb25maWctZGVmYXVsdCcsXG4gICAgbmFtZXJzOiBbYC4vJHtOQU1FUl9GSUxFX05BTUV9YCwgJy4uLiddLFxuICAgIG9wdGltaXplcnM6IHtcbiAgICAgICcqLmpzJzogW2AuLyR7UFJFX01JTklGWV9GSUxFX05BTUV9YCwgJy4uLicsIGAuLyR7T1BUSU1JWkVSX0ZJTEVfTkFNRX1gXVxuICAgIH0sXG4gICAgcmVzb2x2ZXJzOiBbYC4vJHtSRVNPTFZFUl9GSUxFX05BTUV9YCwgJy4uLiddLFxuICAgIHRyYW5zZm9ybWVyc1xuICB9O1xuXG4gIHJldHVybiB7XG4gICAgW0ZFQVRVUkVTX0ZJTEVfTkFNRV06IGAvKlxuICogR2VuZXJhdGVkIGJ5IEBtbmFvdW1vdi9vYnNpZGlhbi1kZXYtdG9vbGtpdC4gUnVucyB0aGUgdG9vbGtpdCdzIHNoYXJlZCB0cmFuc2Zvcm1zIGZvciB0aGUgYnVpbGQgZmVhdHVyZXMsIGxvYWRlZFxuICogZnJvbSB0aGUgdG9vbGtpdCBpdHNlbGYsIHNvIHBhcmNlbCBjb21waWxlcyBlYWNoIGZlYXR1cmUgdGhlIHdheSBldmVyeSBvdGhlciBidW5kbGVyIGFkYXB0ZXIgZG9lcy5cbiAqL1xuY29uc3QgeyBUcmFuc2Zvcm1lciB9ID0gcmVxdWlyZSgnQHBhcmNlbC9wbHVnaW4nKTtcblxuY29uc3QgRkVBVFVSRVNfTU9EVUxFX1VSTCA9ICR7SlNPTi5zdHJpbmdpZnkoZ2V0U2libGluZ01vZHVsZVVybCgnb2JzaWRpYW4tcGx1Z2luLWZlYXR1cmVzJykpfTtcbmNvbnN0IFRSQU5TRk9STVNfTU9EVUxFX1VSTCA9ICR7SlNPTi5zdHJpbmdpZnkoZ2V0U2libGluZ01vZHVsZVVybCgnb2JzaWRpYW4tcGx1Z2luLXRyYW5zZm9ybXMnKSl9O1xuY29uc3QgRlJBTUVXT1JLID0gJHtKU09OLnN0cmluZ2lmeShmZWF0dXJlcy5mcmFtZXdvcmsgPz8gbnVsbCl9O1xuY29uc3QgU1RZTEVTID0gJHtKU09OLnN0cmluZ2lmeShmZWF0dXJlcy5zdHlsZXMgPz8ge30pfTtcblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgVHJhbnNmb3JtZXIoe1xuICBhc3luYyB0cmFuc2Zvcm0oeyBhc3NldCwgb3B0aW9ucyB9KSB7XG4gICAgY29uc3QgeyBnZXRGZWF0dXJlRmlsZUtpbmQsIGdldEZyYW1ld29ya0RlZmluZXMsIGdldEpzeEltcG9ydFNvdXJjZSwgcmVwbGFjZURlZmluZXMgfSA9IGF3YWl0IGltcG9ydChGRUFUVVJFU19NT0RVTEVfVVJMKTtcbiAgICBjb25zdCB0cmFuc2Zvcm1zID0gYXdhaXQgaW1wb3J0KFRSQU5TRk9STVNfTU9EVUxFX1VSTCk7XG4gICAgY29uc3QgZmlsZVBhdGggPSBhc3NldC5maWxlUGF0aDtcbiAgICBjb25zdCBpc1Byb2R1Y3Rpb25CdWlsZCA9IG9wdGlvbnMubW9kZSA9PT0gJ3Byb2R1Y3Rpb24nO1xuICAgIGNvbnN0IGRlZmluZXMgPSBnZXRGcmFtZXdvcmtEZWZpbmVzKHsgZnJhbWV3b3JrOiBGUkFNRVdPUksgPz8gdW5kZWZpbmVkLCBpc1Byb2R1Y3Rpb25CdWlsZCB9KTtcbiAgICBzd2l0Y2ggKGdldEZlYXR1cmVGaWxlS2luZChmaWxlUGF0aCkpIHtcbiAgICAgIGNhc2UgJ2pzeCc6IHtcbiAgICAgICAgY29uc3QgY29kZSA9IGF3YWl0IGFzc2V0LmdldENvZGUoKTtcbiAgICAgICAgY29uc3QganN4SW1wb3J0U291cmNlID0gZ2V0SnN4SW1wb3J0U291cmNlKEZSQU1FV09SSyA/PyB1bmRlZmluZWQpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBGUkFNRVdPUksgPT09ICdzb2xpZCdcbiAgICAgICAgICA/IGF3YWl0IHRyYW5zZm9ybXMudHJhbnNmb3JtU29saWQoeyBjb2RlLCBmaWxlUGF0aCwgaXNQcm9kdWN0aW9uQnVpbGQgfSlcbiAgICAgICAgICA6IGF3YWl0IHRyYW5zZm9ybXMudHJhbnNmb3JtSnN4KHsgY29kZSwgZmlsZVBhdGgsIGlzUHJvZHVjdGlvbkJ1aWxkLCBqc3hJbXBvcnRTb3VyY2UgfSk7XG4gICAgICAgIGFzc2V0LnNldENvZGUocmVwbGFjZURlZmluZXMocmVzdWx0LmNvZGUsIGRlZmluZXMpKTtcbiAgICAgICAgYXNzZXQudHlwZSA9ICdqcyc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnc3R5bGVzaGVldCc6IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdHJhbnNmb3Jtcy50cmFuc2Zvcm1Dc3MoeyBmaWxlUGF0aCwgaXNDc3NNb2R1bGVTY29wZWQ6IGZhbHNlLCBpc1Byb2R1Y3Rpb25CdWlsZCwgc291cmNlOiBhd2FpdCBhc3NldC5nZXRDb2RlKCksIHN0eWxlczogU1RZTEVTIH0pO1xuICAgICAgICBhc3NldC5zZXRDb2RlKHJlc3VsdC5jc3MpO1xuICAgICAgICBmb3IgKGNvbnN0IGRlcGVuZGVuY3kgb2YgcmVzdWx0LmRlcGVuZGVuY2llcykge1xuICAgICAgICAgIGFzc2V0LmludmFsaWRhdGVPbkZpbGVDaGFuZ2UoZGVwZW5kZW5jeSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdzdmVsdGUnOiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRyYW5zZm9ybXMudHJhbnNmb3JtU3ZlbHRlKHsgY29kZTogYXdhaXQgYXNzZXQuZ2V0Q29kZSgpLCBmaWxlUGF0aCwgaXNQcm9kdWN0aW9uQnVpbGQgfSk7XG4gICAgICAgIGFzc2V0LnNldENvZGUocmVwbGFjZURlZmluZXMocmVzdWx0LmNvZGUsIGRlZmluZXMpKTtcbiAgICAgICAgYXNzZXQudHlwZSA9ICdqcyc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnd2FzbSc6XG4gICAgICAgIGFzc2V0LnNldENvZGUodHJhbnNmb3Jtcy5nZXRXYXNtTW9kdWxlQ29kZShhd2FpdCBhc3NldC5nZXRCdWZmZXIoKSkpO1xuICAgICAgICBhc3NldC50eXBlID0gJ2pzJztcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIC8vIEEgZnJhbWV3b3JrJ3MgcnVudGltZSByZWFkcyBwcm9jZXNzLmVudi5OT0RFX0VOViwgd2hpY2ggcGFyY2VsIGxlYXZlcyBhbG9uZSBpbiBhbiBlbGVjdHJvbi1yZW5kZXJlciBsaWJyYXJ5LlxuICAgICAgICBjb25zdCBjb2RlID0gYXdhaXQgYXNzZXQuZ2V0Q29kZSgpO1xuICAgICAgICBjb25zdCByZXBsYWNlZCA9IHJlcGxhY2VEZWZpbmVzKGNvZGUsIGRlZmluZXMpO1xuICAgICAgICBpZiAocmVwbGFjZWQgIT09IGNvZGUpIHtcbiAgICAgICAgICBhc3NldC5zZXRDb2RlKHJlcGxhY2VkKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIFthc3NldF07XG4gIH1cbn0pO1xuYCxcbiAgICAvLyBgU3RyaW5nLnJhd2AsIHNvIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gYmVsb3cgcmVhY2hlcyB0aGUgZmlsZSB3aXRoIGl0cyBiYWNrc2xhc2hlcyBpbnRhY3QuXG4gICAgW0lOTElORV9JTVBPUlRTX0ZJTEVfTkFNRV06IFN0cmluZy5yYXdgLypcbiAqIEdlbmVyYXRlZCBieSBAbW5hb3Vtb3Yvb2JzaWRpYW4tZGV2LXRvb2xraXQuIEtlZXBzIGV2ZXJ5IGR5bmFtaWMgaW1wb3J0KCkgaW5zaWRlIG1haW4uanMuXG4gKlxuICogT2JzaWRpYW4gbG9hZHMgYSBwbHVnaW4ncyBtYWluLmpzIGFuZCBub3RoaW5nIGJlc2lkZSBpdCwgYW5kIHBhcmNlbCBtYWtlcyBldmVyeSBpbXBvcnQoKSBhIGJ1bmRsZSBvZiBpdHNcbiAqIG93biB3aXRoIG5vIG9wdGlvbiB0byBpbmxpbmUgb25lLiBUaGlzIHJld3JpdGVzIGltcG9ydCgnPGxpdGVyYWw+JykgaW50byBhIHJlcXVpcmUoKSBpbnNpZGUgYW4gYXN5bmNcbiAqIGFycm93LCBiZWZvcmUgcGFyY2VsJ3Mgb3duIEphdmFTY3JpcHQgdHJhbnNmb3JtZXIgcnVuczogdGhlIG1vZHVsZSBzdGlsbCBldmFsdWF0ZXMgb25seSB3aGVuIHRoYXQgY29kZVxuICogcnVucywgYW5kIHRoZSBwcm9taXNlIHN0aWxsIHJlamVjdHMgd2hlbiBldmFsdWF0aW9uIHRocm93cy4gT25seSBhIHBsYWluIHN0cmluZyBzcGVjaWZpZXIgaXMgcmV3cml0dGVuLFxuICogc2luY2UgYSBjb21wdXRlZCBvbmUgY2Fubm90IGJlIGJ1bmRsZWQgYnkgYW55IGJ1bmRsZXIuXG4gKi9cbmNvbnN0IHsgVHJhbnNmb3JtZXIgfSA9IHJlcXVpcmUoJ0BwYXJjZWwvcGx1Z2luJyk7XG5cbmNvbnN0IERZTkFNSUNfSU1QT1JUID0gL1xcYmltcG9ydFxcKFxccyooW1wiJ10pKFteXCInXFx4NjBcXG5cXFxcXSspXFwxXFxzKlxcKS9ndTtcblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgVHJhbnNmb3JtZXIoe1xuICBhc3luYyB0cmFuc2Zvcm0oeyBhc3NldCB9KSB7XG4gICAgY29uc3Qgc291cmNlID0gYXdhaXQgYXNzZXQuZ2V0Q29kZSgpO1xuICAgIGlmIChzb3VyY2UuaW5jbHVkZXMoJ2ltcG9ydCgnKSkge1xuICAgICAgYXNzZXQuc2V0Q29kZShzb3VyY2UucmVwbGFjZShEWU5BTUlDX0lNUE9SVCwgKF9tYXRjaCwgcXVvdGUsIHNwZWNpZmllcikgPT4gJyhhc3luYyAoKSA9PiByZXF1aXJlKCcgKyBxdW90ZSArIHNwZWNpZmllciArIHF1b3RlICsgJykpKCknKSk7XG4gICAgfVxuICAgIHJldHVybiBbYXNzZXRdO1xuICB9XG59KTtcbmAsXG4gICAgW05BTUVSX0ZJTEVfTkFNRV06IGAvKiBHZW5lcmF0ZWQgYnkgQG1uYW91bW92L29ic2lkaWFuLWRldi10b29sa2l0LiBPYnNpZGlhbiBsb2FkcyBhIHBsdWdpbidzIHN0eWxlc2hlZXQgZnJvbSBzdHlsZXMuY3NzIGFuZCBub3RoaW5nIGVsc2UuICovXG5jb25zdCB7IE5hbWVyIH0gPSByZXF1aXJlKCdAcGFyY2VsL3BsdWdpbicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBOYW1lcih7XG4gIG5hbWUoeyBidW5kbGUgfSkge1xuICAgIHJldHVybiBidW5kbGUudHlwZSA9PT0gJ2NzcycgPyAnJHtPYnNpZGlhblBsdWdpblJlcG9QYXRocy5TdHlsZXNDc3N9JyA6IG51bGw7XG4gIH1cbn0pO1xuYCxcbiAgICBbT1BUSU1JWkVSX0ZJTEVfTkFNRV06IGAvKlxuICogR2VuZXJhdGVkIGJ5IEBtbmFvdW1vdi9vYnNpZGlhbi1kZXYtdG9vbGtpdC4gUnVucyBhZnRlciBwYXJjZWwncyBvd24gb3B0aW1pemVycywgb24gdGhlIEphdmFTY3JpcHQgYnVuZGxlLlxuICpcbiAqIE9ic2lkaWFuIGV2YWx1YXRlcyBtYWluLmpzIGFzIHRoZSBib2R5IG9mIGZ1bmN0aW9uIChyZXF1aXJlLCBtb2R1bGUsIGV4cG9ydHMpLCB3aXRoIGEgbW9kdWxlIG9iamVjdCB0aGF0XG4gKiBoYXMgbm8gcmVxdWlyZSBvZiBpdHMgb3duLCBhbmQgcGFyY2VsJ3MgcnVudGltZSByZWFjaGVzIGV2ZXJ5IGV4dGVybmFsIG1vZHVsZSB0aHJvdWdoIG1vZHVsZS5yZXF1aXJlLlxuICogV2l0aG91dCB0aGUgZmlyc3QgbGluZSBiZWxvdywgdGhlIHZlcnkgZmlyc3QgcmVxdWlyZSgnb2JzaWRpYW4nKSB0aHJvd3MgXCJDYW5ub3QgZmluZCBtb2R1bGVcIi4gVGhlIGJhbm5lclxuICogZ29lcyBpbiBoZXJlIHRvbywgYWZ0ZXIgbWluaWZpY2F0aW9uLCB3aGljaCB3b3VsZCBvdGhlcndpc2Ugc3RyaXAgaXQgYXMgYW4gb3JkaW5hcnkgY29tbWVudC5cbiAqL1xuY29uc3QgeyBPcHRpbWl6ZXIgfSA9IHJlcXVpcmUoJ0BwYXJjZWwvcGx1Z2luJyk7XG5cbmNvbnN0IFBSRUFNQkxFID0gJHtKU09OLnN0cmluZ2lmeShgJHtnZXRPYnNpZGlhblBsdWdpbkJhbm5lcigncGFyY2VsJyl9aWYgKHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUucmVxdWlyZSAhPT0gJ2Z1bmN0aW9uJykgeyBtb2R1bGUucmVxdWlyZSA9IHJlcXVpcmU7IH1cXG5gKX07XG5jb25zdCBQUkVBTUJMRV9MSU5FX0NPVU5UID0gJHtTdHJpbmcoZ2V0T2JzaWRpYW5QbHVnaW5CYW5uZXIoJ3BhcmNlbCcpLnNwbGl0KCdcXG4nKS5sZW5ndGgpfTtcblxuYXN5bmMgZnVuY3Rpb24gcmVhZENvbnRlbnRzKGNvbnRlbnRzKSB7XG4gIGlmICh0eXBlb2YgY29udGVudHMgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGNvbnRlbnRzO1xuICB9XG4gIGlmIChCdWZmZXIuaXNCdWZmZXIoY29udGVudHMpKSB7XG4gICAgcmV0dXJuIGNvbnRlbnRzLnRvU3RyaW5nKCd1dGYtOCcpO1xuICB9XG4gIGNvbnN0IGNodW5rcyA9IFtdO1xuICBmb3IgYXdhaXQgKGNvbnN0IGNodW5rIG9mIGNvbnRlbnRzKSB7XG4gICAgY2h1bmtzLnB1c2goQnVmZmVyLmZyb20oY2h1bmspKTtcbiAgfVxuICByZXR1cm4gQnVmZmVyLmNvbmNhdChjaHVua3MpLnRvU3RyaW5nKCd1dGYtOCcpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBPcHRpbWl6ZXIoe1xuICBhc3luYyBvcHRpbWl6ZSh7IGNvbnRlbnRzLCBtYXAgfSkge1xuICAgIGNvbnN0IGNvZGUgPSBhd2FpdCByZWFkQ29udGVudHMoY29udGVudHMpO1xuICAgIGlmIChtYXApIHtcbiAgICAgIG1hcC5vZmZzZXRMaW5lcygxLCBQUkVBTUJMRV9MSU5FX0NPVU5UKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgY29udGVudHM6IFBSRUFNQkxFICsgY29kZSwgbWFwIH07XG4gIH1cbn0pO1xuYCxcbiAgICBbUEFSQ0VMUkNdOiBgJHtKU09OLnN0cmluZ2lmeShwYXJjZWxyYywgbnVsbCwgSlNPTl9JTkRFTlQpfVxcbmAsXG4gICAgLy8gYFN0cmluZy5yYXdgLCBzbyB0aGUgbGluZSBicmVha3MgYmVsb3cgcmVhY2ggdGhlIGZpbGUgYXMgZXNjYXBlcy5cbiAgICBbUFJFX01JTklGWV9GSUxFX05BTUVdOiBTdHJpbmcucmF3YC8qXG4gKiBHZW5lcmF0ZWQgYnkgQG1uYW91bW92L29ic2lkaWFuLWRldi10b29sa2l0LiBSdW5zIGJlZm9yZSBwYXJjZWwncyBvd24gb3B0aW1pemVycywgb24gdGhlIEphdmFTY3JpcHQgYnVuZGxlLlxuICpcbiAqIEEgc2NvcGUtaG9pc3RlZCBsaWJyYXJ5IGJ1bmRsZSByZXF1aXJlKClzIGV2ZXJ5IGJ1bmRsZSBpdCByZWZlcmVuY2VzLCB0aGUgc3R5bGVzaGVldCBpbmNsdWRlZCwgYW5kIE9ic2lkaWFuXG4gKiBsb2FkcyBzdHlsZXMuY3NzIGl0c2VsZiwgYmVzaWRlIG1haW4uanMsIHdoZXJlIGEgcmVxdWlyZSgpIGNhbm5vdCByZWFjaCBpdC4gVGhlIGxpbmUgaXMgYmxhbmtlZCByYXRoZXIgdGhhblxuICogcmVtb3ZlZCwgc28gYSBzb3VyY2UgbWFwIHN0aWxsIGxpbmVzIHVwLlxuICpcbiAqIEEgc2NvcGUtaG9pc3RlZCBDb21tb25KUyBidW5kbGUgYWxzbyBkZWNsYXJlcyBldmVyeSBtb2R1bGUncyBiaW5kaW5ncyBhdCBpdHMgdG9wIGxldmVsLCB1bmRlciBsb25nIG5hbWVzIHN1Y2hcbiAqIGFzICRjNTg5OWFlYjRjYWFkZjI3JHZhciR0YXNrSWRDb3VudGVyLCBhbmQgcGFyY2VsIG1pbmlmaWVzIGl0IGFzIGEgc2NyaXB0LCB3aGVyZSB0aGUgbWluaWZpZXIgbWF5IG5vdCByZW5hbWVcbiAqIGEgdG9wLWxldmVsIGJpbmRpbmcsIHNpbmNlIGluIGEgc2NyaXB0IGl0IGlzIGEgZ2xvYmFsLiBPYnNpZGlhbiBldmFsdWF0ZXMgbWFpbi5qcyBhcyB0aGUgYm9keSBvZiBhIGZ1bmN0aW9uLCBzb1xuICogd3JhcHBpbmcgdGhlIGJ1bmRsZSBpbiBhbiBhcnJvdyBmdW5jdGlvbiBjaGFuZ2VzIG5vdGhpbmcgYXQgcnVudGltZSAoYW4gYXJyb3cga2VlcHMgdGhpcyBhbmQgYXJndW1lbnRzKSBhbmRcbiAqIGxldHMgdGhlIG1pbmlmaWVyIHJlbmFtZSBhbGwgb2YgdGhlbTogU29saWQncyBmaXh0dXJlIGJ1aWxkIGlzIDcwIEtCIHdpdGhvdXQgdGhpcyBhbmQgMTAgS0Igd2l0aCBpdC5cbiAqL1xuY29uc3QgeyBPcHRpbWl6ZXIgfSA9IHJlcXVpcmUoJ0BwYXJjZWwvcGx1Z2luJyk7XG5cbmNvbnN0IFNUWUxFU0hFRVRfUkVRVUlSRSA9ICR7SlNPTi5zdHJpbmdpZnkoYHJlcXVpcmUoXCIuLyR7T2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuU3R5bGVzQ3NzfVwiKTtcXG5gKX07XG5cbmFzeW5jIGZ1bmN0aW9uIHJlYWRDb250ZW50cyhjb250ZW50cykge1xuICBpZiAodHlwZW9mIGNvbnRlbnRzID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBjb250ZW50cztcbiAgfVxuICBpZiAoQnVmZmVyLmlzQnVmZmVyKGNvbnRlbnRzKSkge1xuICAgIHJldHVybiBjb250ZW50cy50b1N0cmluZygndXRmLTgnKTtcbiAgfVxuICBjb25zdCBjaHVua3MgPSBbXTtcbiAgZm9yIGF3YWl0IChjb25zdCBjaHVuayBvZiBjb250ZW50cykge1xuICAgIGNodW5rcy5wdXNoKEJ1ZmZlci5mcm9tKGNodW5rKSk7XG4gIH1cbiAgcmV0dXJuIEJ1ZmZlci5jb25jYXQoY2h1bmtzKS50b1N0cmluZygndXRmLTgnKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgT3B0aW1pemVyKHtcbiAgYXN5bmMgb3B0aW1pemUoeyBidW5kbGUsIGNvbnRlbnRzLCBtYXAgfSkge1xuICAgIGNvbnN0IGNvZGUgPSAoYXdhaXQgcmVhZENvbnRlbnRzKGNvbnRlbnRzKSkucmVwbGFjZShTVFlMRVNIRUVUX1JFUVVJUkUsICdcXG4nKTtcbiAgICBpZiAoIWJ1bmRsZS5lbnYuc2hvdWxkT3B0aW1pemUpIHtcbiAgICAgIHJldHVybiB7IGNvbnRlbnRzOiBjb2RlLCBtYXAgfTtcbiAgICB9XG4gICAgaWYgKG1hcCkge1xuICAgICAgbWFwLm9mZnNldExpbmVzKDEsIDEpO1xuICAgIH1cbiAgICByZXR1cm4geyBjb250ZW50czogJygoKSA9PiB7XFxuJyArIGNvZGUgKyAnXFxufSkoKTtcXG4nLCBtYXAgfTtcbiAgfVxufSk7XG5gLFxuICAgIFtSRVNPTFZFUl9GSUxFX05BTUVdOiBgLypcbiAqIEdlbmVyYXRlZCBieSBAbW5hb3Vtb3Yvb2JzaWRpYW4tZGV2LXRvb2xraXQuIExlYXZlcyB0aGUgbW9kdWxlcyBPYnNpZGlhbiBzdXBwbGllcyBhdCBydW50aW1lIHRvIHJlcXVpcmUoKSwgYW5kXG4gKiByZXNvbHZlcyBldmVyeXRoaW5nIGVsc2UgdGhlIHdheSBAcGFyY2VsL3Jlc29sdmVyLWRlZmF1bHQgZG9lcywgd2l0aCB0aGUgYnJvd3NlcidzIGV4cG9ydCBjb25kaXRpb25zLlxuICpcbiAqIFBhcmNlbCByZXNvbHZlcyBhbiBlbGVjdHJvbi1yZW5kZXJlciB0YXJnZXQgd2l0aCB0aGUgbm9kZSBhbmQgZWxlY3Ryb24gY29uZGl0aW9ucyBiZXNpZGUgYnJvd3NlciwgYW5kIGFuIGV4cG9ydHNcbiAqIG1hcCBpcyBtYXRjaGVkIGluIHRoZSBwYWNrYWdlJ3Mgb3duIGtleSBvcmRlciwgc28gYSBwYWNrYWdlIGxpc3Rpbmcgbm9kZSBmaXJzdCAoVnVlLCBTdmVsdGUsIFNvbGlkLCBmZmxhdGUpIHdvdWxkXG4gKiBoYW5kIG92ZXIgaXRzIE5vZGUgYnVpbGQ6IHNldmVyYWwgdGltZXMgdGhlIGNvZGUsIGFuZCBvbmUgdGhhdCBtYXkgbm90IGxvYWQgb24gbW9iaWxlLiBUaGUgTm9kZSBidWlsdGlucyBuZWVkIG5vXG4gKiBub2RlIGNvbmRpdGlvbiB0byBzdGF5IGV4dGVybmFsLCBzaW5jZSB0aGV5IGFyZSBpbiB0aGUgZXh0ZXJuYWxzIGJlbG93LlxuICovXG5jb25zdCB7IFJlc29sdmVyIH0gPSByZXF1aXJlKCdAcGFyY2VsL3BsdWdpbicpO1xuY29uc3QgeyBkaXJuYW1lIH0gPSByZXF1aXJlKCdub2RlOnBhdGgnKTtcblxuY29uc3QgRVhURVJOQUxTID0gbmV3IFNldCgke0pTT04uc3RyaW5naWZ5KE9CU0lESUFOX1BMVUdJTl9FWFRFUk5BTFMpfSk7XG5cbmZ1bmN0aW9uIGdldEJyb3dzZXJFbnZpcm9ubWVudChlbnYpIHtcbiAgcmV0dXJuIHtcbiAgICBjb250ZXh0OiBlbnYuY29udGV4dCxcbiAgICBpZDogZW52LmlkICsgJzpvYnNpZGlhbi1kZXYtdG9vbGtpdC1icm93c2VyLWNvbmRpdGlvbnMnLFxuICAgIGluY2x1ZGVOb2RlTW9kdWxlczogZW52LmluY2x1ZGVOb2RlTW9kdWxlcyxcbiAgICBpc0Jyb3dzZXI6ICgpID0+IHRydWUsXG4gICAgaXNFbGVjdHJvbjogKCkgPT4gZmFsc2UsXG4gICAgaXNMaWJyYXJ5OiBlbnYuaXNMaWJyYXJ5LFxuICAgIGlzTm9kZTogKCkgPT4gZmFsc2UsXG4gICAgaXNXb3JrZXI6ICgpID0+IGVudi5pc1dvcmtlcigpLFxuICAgIGlzV29ya2xldDogKCkgPT4gZW52LmlzV29ya2xldCgpXG4gIH07XG59XG5cbmZ1bmN0aW9uIGdldFBhY2thZ2VOYW1lKHNwZWNpZmllcikge1xuICBjb25zdCBzZWdtZW50cyA9IHNwZWNpZmllci5zcGxpdCgnLycpO1xuICByZXR1cm4gc3BlY2lmaWVyLnN0YXJ0c1dpdGgoJ0AnKSA/IHNlZ21lbnRzLnNsaWNlKDAsIDIpLmpvaW4oJy8nKSA6IHNlZ21lbnRzWzBdO1xufVxuXG4vLyBAcGFyY2VsL25vZGUtcmVzb2x2ZXItY29yZSBpcyB3aGF0IEBwYXJjZWwvcmVzb2x2ZXItZGVmYXVsdCBydW5zLCByZWFjaGVkIHRocm91Z2ggdGhlIHBhY2thZ2VzIHRoYXQgaW5zdGFsbCBpdC5cbmZ1bmN0aW9uIGxvYWROb2RlUmVzb2x2ZXIoKSB7XG4gIGxldCBmb2xkZXIgPSBfX2Rpcm5hbWU7XG4gIGZvciAoY29uc3QgcGFja2FnZU5hbWUgb2YgWydAcGFyY2VsL2NvbmZpZy1kZWZhdWx0JywgJ0BwYXJjZWwvcmVzb2x2ZXItZGVmYXVsdCddKSB7XG4gICAgZm9sZGVyID0gZGlybmFtZShyZXF1aXJlLnJlc29sdmUocGFja2FnZU5hbWUgKyAnL3BhY2thZ2UuanNvbicsIHsgcGF0aHM6IFtmb2xkZXJdIH0pKTtcbiAgfVxuICByZXR1cm4gcmVxdWlyZShyZXF1aXJlLnJlc29sdmUoJ0BwYXJjZWwvbm9kZS1yZXNvbHZlci1jb3JlJywgeyBwYXRoczogW2ZvbGRlcl0gfSkpLmRlZmF1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbmV3IFJlc29sdmVyKHtcbiAgYXN5bmMgbG9hZENvbmZpZyh7IGNvbmZpZywgbG9nZ2VyLCBvcHRpb25zIH0pIHtcbiAgICBjb25zdCBwYWNrYWdlQ29uZmlnID0gYXdhaXQgY29uZmlnLmdldENvbmZpZyhbXSwgeyBwYWNrYWdlS2V5OiAnQHBhcmNlbC9yZXNvbHZlci1kZWZhdWx0JyB9KTtcbiAgICBjb25zdCBOb2RlUmVzb2x2ZXIgPSBsb2FkTm9kZVJlc29sdmVyKCk7XG4gICAgcmV0dXJuIG5ldyBOb2RlUmVzb2x2ZXIoe1xuICAgICAgZnM6IG9wdGlvbnMuaW5wdXRGUyxcbiAgICAgIGxvZ2dlcixcbiAgICAgIG1vZGU6IG9wdGlvbnMubW9kZSxcbiAgICAgIHBhY2thZ2VFeHBvcnRzOiBwYWNrYWdlQ29uZmlnPy5jb250ZW50cz8ucGFja2FnZUV4cG9ydHMgPz8gZmFsc2UsXG4gICAgICBwYWNrYWdlTWFuYWdlcjogb3B0aW9ucy5wYWNrYWdlTWFuYWdlcixcbiAgICAgIHByb2plY3RSb290OiBvcHRpb25zLnByb2plY3RSb290LFxuICAgICAgc2hvdWxkQXV0b0luc3RhbGw6IG9wdGlvbnMuc2hvdWxkQXV0b0luc3RhbGxcbiAgICB9KTtcbiAgfSxcbiAgcmVzb2x2ZSh7IGNvbmZpZzogbm9kZVJlc29sdmVyLCBkZXBlbmRlbmN5LCBzcGVjaWZpZXIgfSkge1xuICAgIGNvbnN0IGlzRXh0ZXJuYWwgPSBzcGVjaWZpZXIuc3RhcnRzV2l0aCgnbm9kZTonKSB8fCBFWFRFUk5BTFMuaGFzKHNwZWNpZmllcikgfHwgRVhURVJOQUxTLmhhcyhnZXRQYWNrYWdlTmFtZShzcGVjaWZpZXIpKTtcbiAgICBpZiAoaXNFeHRlcm5hbCkge1xuICAgICAgcmV0dXJuIHsgaXNFeGNsdWRlZDogdHJ1ZSB9O1xuICAgIH1cbiAgICByZXR1cm4gbm9kZVJlc29sdmVyLnJlc29sdmUoe1xuICAgICAgZW52OiBnZXRCcm93c2VyRW52aXJvbm1lbnQoZGVwZW5kZW5jeS5lbnYpLFxuICAgICAgZmlsZW5hbWU6IHNwZWNpZmllcixcbiAgICAgIGxvYzogZGVwZW5kZW5jeS5sb2MsXG4gICAgICBwYWNrYWdlQ29uZGl0aW9uczogZGVwZW5kZW5jeS5wYWNrYWdlQ29uZGl0aW9ucyxcbiAgICAgIHBhcmVudDogZGVwZW5kZW5jeS5yZXNvbHZlRnJvbSxcbiAgICAgIHJhbmdlOiBkZXBlbmRlbmN5LnJhbmdlLFxuICAgICAgc291cmNlUGF0aDogZGVwZW5kZW5jeS5zb3VyY2VQYXRoLFxuICAgICAgc3BlY2lmaWVyVHlwZTogZGVwZW5kZW5jeS5zcGVjaWZpZXJUeXBlXG4gICAgfSk7XG4gIH1cbn0pO1xuYFxuICB9O1xufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUgb3B0aW9ucyBoYW5kZWQgdG8gcGFyY2VsJ3MgYFBhcmNlbGAgY2xhc3MuXG4gKlxuICogVGhlIG9uZSB0YXJnZXQgaXMgYGVsZWN0cm9uLXJlbmRlcmVyYCwgd2hlcmUgT2JzaWRpYW4gcnVucyBhIHBsdWdpbiwgYW5kIENvbW1vbkpTLiBQYXJjZWwgY291bnRzIHRoYXRcbiAqIGNvbnRleHQgYXMgYm90aCBhIGJyb3dzZXIgYW5kIGEgbm9kZSBvbmU6IG5vZGUga2VlcHMgYHByb2Nlc3NgLCBgQnVmZmVyYCBhbmQgYHByb2Nlc3MuZW52YCBhcyBPYnNpZGlhbidzXG4gKiByZW5kZXJlciBoYXMgdGhlbSwgcmF0aGVyIHRoYW4gcG9seWZpbGxlZCBvciBpbmxpbmVkIGZyb20gdGhlIGJ1aWxkIG1hY2hpbmUsIGFuZCBicm93c2VyIHRha2VzIGEgcGFja2FnZSdzXG4gKiBgYnJvd3NlcmAgZmllbGQuIEl0cyBleHBvcnQgY29uZGl0aW9ucyB3b3VsZCBpbmNsdWRlIGBub2RlYCB0b28sIHdoaWNoIHRoZSBnZW5lcmF0ZWQgcmVzb2x2ZXIgZHJvcHMuXG4gKiBgaW5jbHVkZU5vZGVNb2R1bGVzYCBidW5kbGVzIHRoZSBkZXBlbmRlbmNpZXMsIHdoaWNoIGEgbm9kZS1mbGF2b3VyZWQgY29udGV4dCB3b3VsZCBvdGhlcndpc2UgbGVhdmUgYXNcbiAqIGByZXF1aXJlKClgIGNhbGxzIG5vdGhpbmcgaW5zdGFsbHMgYmVzaWRlIGEgcGx1Z2luLCBhbmQgYGlzTGlicmFyeWAga2VlcHMgdGhlIGVudHJ5J3MgZGVmYXVsdCBleHBvcnQsIHdoaWNoXG4gKiBpcyBob3cgT2JzaWRpYW4gZmluZHMgdGhlIHBsdWdpbiBjbGFzcy5cbiAqXG4gKiBgc2hvdWxkU2NvcGVIb2lzdGAgaXMgc2V0IGV4cGxpY2l0bHkgYmVjYXVzZSBwYXJjZWwgcmVhZHMgaXQgb25seSBmcm9tIGBkZWZhdWx0VGFyZ2V0T3B0aW9uc2AgZm9yIGEgdGFyZ2V0XG4gKiBwYXNzZWQgaW4gdGhlIG9wdGlvbnMsIG5ldmVyIGZyb20gYGlzTGlicmFyeWAgYXMgaXQgZG9lcyBmb3Igb25lIGluIGBwYWNrYWdlLmpzb25gLiBXaXRob3V0IGl0IHRoZSBidW5kbGVcbiAqIGlzIG5vdCB0cmVlLXNoYWtlbiBhdCBhbGw6IFN2ZWx0ZSdzIGZpeHR1cmUgYnVpbGQgd2FzIDIyNCBLQiB3aXRoIHBhcmNlbCBhZ2FpbnN0IDI1IEtCIHdpdGggdml0ZS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHtAbGluayBHZXRQYXJjZWxPcHRpb25zUGFyYW1zfS5cbiAqIEByZXR1cm5zIFRoZSBwYXJjZWwgb3B0aW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFBhcmNlbE9wdGlvbnMocGFyYW1zOiBHZXRQYXJjZWxPcHRpb25zUGFyYW1zKTogSW5pdGlhbFBhcmNlbE9wdGlvbnMge1xuICBjb25zdCB7IGJ1aWxkQ29udGV4dCwgY2FjaGVGb2xkZXIsIGNvbmZpZ1BhdGggfSA9IHBhcmFtcztcbiAgY29uc3QgdGFyZ2V0OiBUYXJnZXREZXNjcmlwdG9yID0ge1xuICAgIGNvbnRleHQ6ICdlbGVjdHJvbi1yZW5kZXJlcicsXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vbmFtZS1yZXBsYWNlbWVudHMgLS0gYGRpc3REaXJgIGlzIHRoZSBuYW1lIHBhcmNlbCdzIEFQSSByZWFkcy5cbiAgICBkaXN0RGlyOiBidWlsZENvbnRleHQuZGlzdEZvbGRlcixcbiAgICBpbmNsdWRlTm9kZU1vZHVsZXM6IHRydWUsXG4gICAgaXNMaWJyYXJ5OiB0cnVlLFxuICAgIG9wdGltaXplOiBidWlsZENvbnRleHQuaXNQcm9kdWN0aW9uQnVpbGQsXG4gICAgb3V0cHV0Rm9ybWF0OiAnY29tbW9uanMnLFxuICAgIHNvdXJjZU1hcDogIWJ1aWxkQ29udGV4dC5pc1Byb2R1Y3Rpb25CdWlsZCAmJiB7IGlubGluZTogdHJ1ZSB9XG4gIH07XG5cbiAgcmV0dXJuIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9uYW1lLXJlcGxhY2VtZW50cyAtLSBgY2FjaGVEaXJgIGlzIHRoZSBuYW1lIHBhcmNlbCdzIEFQSSByZWFkcy5cbiAgICBjYWNoZURpcjogY2FjaGVGb2xkZXIsXG4gICAgY29uZmlnOiBjb25maWdQYXRoLFxuICAgIGRlZmF1bHRUYXJnZXRPcHRpb25zOiB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9uYW1lLXJlcGxhY2VtZW50cyAtLSBgZGlzdERpcmAgaXMgdGhlIG5hbWUgcGFyY2VsJ3MgQVBJIHJlYWRzLlxuICAgICAgZGlzdERpcjogYnVpbGRDb250ZXh0LmRpc3RGb2xkZXIsXG4gICAgICBzaG91bGRPcHRpbWl6ZTogYnVpbGRDb250ZXh0LmlzUHJvZHVjdGlvbkJ1aWxkLFxuICAgICAgc2hvdWxkU2NvcGVIb2lzdDogdHJ1ZSxcbiAgICAgIHNvdXJjZU1hcHM6ICFidWlsZENvbnRleHQuaXNQcm9kdWN0aW9uQnVpbGRcbiAgICB9LFxuICAgIGVudHJpZXM6IGJ1aWxkQ29udGV4dC5lbnRyeVBvaW50LFxuICAgIG1vZGU6IGJ1aWxkQ29udGV4dC5pc1Byb2R1Y3Rpb25CdWlsZCA/ICdwcm9kdWN0aW9uJyA6ICdkZXZlbG9wbWVudCcsXG4gICAgdGFyZ2V0czogeyBvYnNpZGlhblBsdWdpbjogdGFyZ2V0IH1cbiAgfTtcbn1cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBQYXJ0IG9mIHRoZSBwYXJjZWwgYnVpbGQgYWJvdmUuICovXG5mdW5jdGlvbiBmb3JtYXRQYXJjZWxFcnJvcihlcnJvcjogdW5rbm93bik6IHN0cmluZyB7XG4gIGNvbnN0IGRpYWdub3N0aWNzID0gKGVycm9yIGFzIFBhcmNlbEVycm9yTGlrZSB8IHVuZGVmaW5lZCk/LmRpYWdub3N0aWNzO1xuICBpZiAoZGlhZ25vc3RpY3MgJiYgZGlhZ25vc3RpY3MubGVuZ3RoID4gMCkge1xuICAgIHJldHVybiBkaWFnbm9zdGljcy5tYXAoKGRpYWdub3N0aWMpID0+IGRpYWdub3N0aWMubWVzc2FnZSkuam9pbignXFxuJyk7XG4gIH1cbiAgcmV0dXJuIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5zdGFjayA/PyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKTtcbn1cblxuLyoqXG4gKiBCdWlsZHMgdGhlIFVSTCBvZiBhIG1vZHVsZSBvZiB0aGlzIGZvbGRlciwgaW4gdGhlIHNhbWUgZm9ybSBhcyB0aGlzIG9uZSAoYC50c2AgZnJvbSBzb3VyY2UsIGAubWpzYCBvciBgLmNqc2Agb25jZVxuICogYnVpbHQpLCB3aGljaCB0aGUgZ2VuZXJhdGVkIHRyYW5zZm9ybWVyIGltcG9ydHMuXG4gKlxuICogQHBhcmFtIGJhc2VOYW1lIC0gVGhlIG1vZHVsZSdzIGZpbGUgbmFtZSB3aXRob3V0IGl0cyBleHRlbnNpb24uXG4gKiBAcmV0dXJucyBUaGUgbW9kdWxlJ3MgYGZpbGU6YCBVUkwuXG4gKi9cbmZ1bmN0aW9uIGdldFNpYmxpbmdNb2R1bGVVcmwoYmFzZU5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBuZXcgVVJMKGAke2Jhc2VOYW1lfSR7ZXh0bmFtZShuZXcgVVJMKGltcG9ydC5tZXRhLnVybCkucGF0aG5hbWUpfWAsIGltcG9ydC5tZXRhLnVybCkuaHJlZjtcbn1cblxuZnVuY3Rpb24gaGFuZGxlV2F0Y2hFdmVudChldmVudDogQnVpbGRFdmVudCB8IHVuZGVmaW5lZCwgYnVpbGRDb250ZXh0OiBPYnNpZGlhblBsdWdpbkJ1aWxkQ29udGV4dCk6IHZvaWQge1xuICBpZiAoZXZlbnQ/LnR5cGUgPT09ICdidWlsZEZhaWx1cmUnKSB7XG4gICAgY29uc29sZS5lcnJvcihldmVudC5kaWFnbm9zdGljcy5tYXAoKGRpYWdub3N0aWMpID0+IGRpYWdub3N0aWMubWVzc2FnZSkuam9pbignXFxuJykpO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoZXZlbnQ/LnR5cGUgIT09ICdidWlsZFN1Y2Nlc3MnKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc29sZS53YXJuKGBSZWJ1aWx0IHdpdGggcGFyY2VsIGluICR7U3RyaW5nKGV2ZW50LmJ1aWxkVGltZSl9IG1zLmApO1xuICBpbnZva2VBc3luY1NhZmVseSgoKSA9PiBkZXBsb3lUb09ic2lkaWFuUGx1Z2luc0ZvbGRlcihidWlsZENvbnRleHQpKTtcbn1cbi8qIHY4IGlnbm9yZSBzdG9wICovXG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQWtDQSx1QkFBOEI7QUFDOUIscUJBQStCO0FBQy9CLG1CQUFrQztBQUNsQyxrQkFLTztBQUNQLHFCQUEyQjtBQUMzQixzQkFJTztBQVFQLHdDQUF3QztBQUN4QyxtQ0FRTztBQUNQLHNDQUlPO0FBQ1AsZ0RBQThDO0FBdkU5QyxJQUFJLG9CQUFvQixXQUFXLGlCQUFpQixNQUFNLFNBQVMsc0JBQXNCO0FBQ3ZGLE1BQUksT0FBTyxlQUFlLFVBQVU7QUFDbEMsVUFBTSxlQUFlO0FBQ3JCLFVBQU0sTUFBTSxhQUFhLFVBQVU7QUFDbkMsUUFBSSxPQUFPLElBQUksa0JBQWtCLFlBQVk7QUFDM0MsYUFBTyxJQUFJLGNBQWMsVUFBVSxFQUFFO0FBQUEsSUFDdkM7QUFBQSxFQUNGO0FBQ0EsU0FBTyxXQUFXLFVBQVUsUUFBUTtBQUN0QyxHQUFHO0FBaUlILE1BQU0sc0JBQXNCO0FBQzVCLE1BQU0saUNBQWlDLEdBQUcsbUJBQW1CO0FBQzdELE1BQU0sV0FBVztBQWVqQixNQUFNLHFCQUFxQjtBQUMzQixNQUFNLGtCQUFrQjtBQUN4QixNQUFNLDJCQUEyQjtBQUNqQyxNQUFNLHNCQUFzQjtBQUM1QixNQUFNLHVCQUF1QjtBQUM3QixNQUFN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
@@ -7,8 +7,9 @@
7
7
  *
8
8
  * Parcel takes no `external` list and no output file name, only plugins named in a `.parcelrc`. So the
9
9
  * build writes a `.parcelrc` of its own into `.parcel-cache`, beside a resolver that leaves
10
- * Obsidian's modules external, a namer that names the stylesheet `styles.css` and a transformer that keeps
11
- * dynamic imports inside `main.js`, and extends the
10
+ * Obsidian's modules external and resolves packages with the browser's export conditions, a namer that names
11
+ * the stylesheet `styles.css`, a transformer that keeps dynamic imports inside `main.js`, and an optimizer that
12
+ * lets the minifier rename the bundle's top-level bindings, and extends the
12
13
  * consumer's own `.parcelrc` when there is one (or `@parcel/config-default` when there is none), so every
13
14
  * transformer the consumer configured still applies.
14
15
  *
@@ -117,10 +118,16 @@ export declare function getParcelConfigFiles(params: GetParcelConfigFilesParams)
117
118
  * Builds the options handed to parcel's `Parcel` class.
118
119
  *
119
120
  * The one target is `electron-renderer`, where Obsidian runs a plugin, and CommonJS. Parcel counts that
120
- * context as both a browser and a node one, and each half matters: node keeps the builtins external, and
121
- * browser resolves the `browser` export condition. `includeNodeModules` bundles the dependencies, which a
122
- * node-flavoured context would otherwise leave as `require()` calls nothing installs beside a plugin, and
123
- * `isLibrary` keeps the entry's default export, which is how Obsidian finds the plugin class.
121
+ * context as both a browser and a node one: node keeps `process`, `Buffer` and `process.env` as Obsidian's
122
+ * renderer has them, rather than polyfilled or inlined from the build machine, and browser takes a package's
123
+ * `browser` field. Its export conditions would include `node` too, which the generated resolver drops.
124
+ * `includeNodeModules` bundles the dependencies, which a node-flavoured context would otherwise leave as
125
+ * `require()` calls nothing installs beside a plugin, and `isLibrary` keeps the entry's default export, which
126
+ * is how Obsidian finds the plugin class.
127
+ *
128
+ * `shouldScopeHoist` is set explicitly because parcel reads it only from `defaultTargetOptions` for a target
129
+ * passed in the options, never from `isLibrary` as it does for one in `package.json`. Without it the bundle
130
+ * is not tree-shaken at all: Svelte's fixture build was 224 KB with parcel against 25 KB with vite.
124
131
  *
125
132
  * @param params - The {@link GetParcelOptionsParams}.
126
133
  * @returns The parcel options.
@@ -2,80 +2,6 @@
2
2
  THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
3
3
  if you want to view the source, please visit the github repository of this plugin
4
4
  */
5
- (function patchObsidianRequire() {
6
- const originalRequire = require;
7
- if (!originalRequire || originalRequire.__isPatched) {
8
- return;
9
- }
10
-
11
- require = Object.assign(
12
- (id) => requirePatched(id),
13
- originalRequire,
14
- {
15
- __isPatched: true
16
- }
17
- );
18
-
19
- function extractDefault(module) {
20
- return module && module.__esModule && 'default' in module ? module.default : module;
21
- }
22
-
23
- const OBSIDIAN_BUILT_IN_MODULE_NAMES = new Set([
24
- '@codemirror/autocomplete',
25
- '@codemirror/collab',
26
- '@codemirror/commands',
27
- '@codemirror/language',
28
- '@codemirror/lint',
29
- '@codemirror/search',
30
- '@codemirror/state',
31
- '@codemirror/text',
32
- '@codemirror/view',
33
- '@lezer/common',
34
- '@lezer/highlight',
35
- '@lezer/lr',
36
- 'obsidian']
37
- );
38
-
39
- const DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES = new Set([
40
- '@codemirror/closebrackets',
41
- '@codemirror/comment',
42
- '@codemirror/fold',
43
- '@codemirror/gutter',
44
- '@codemirror/highlight',
45
- '@codemirror/history',
46
- '@codemirror/matchbrackets',
47
- '@codemirror/panel',
48
- '@codemirror/rangeset',
49
- '@codemirror/rectangular-selection',
50
- '@codemirror/stream-parser',
51
- '@codemirror/tooltip']
52
- );
53
-
54
- function requirePatched(id) {
55
- if (OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id) || DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id)) {
56
- return originalRequire?.(id);
57
- }
58
-
59
- // eslint-disable-next-line @typescript-eslint/no-deprecated, obsidianmd/no-global-this -- Need access to app. Actively use globalThis.
60
- if (globalThis.app.isMobile) {
61
- if (id === 'process' || id === 'node:process') {
62
- // eslint-disable-next-line no-console -- Valid usage.
63
- console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Fake process object is returned instead.`);
64
-
65
- return process;
66
- }
67
- } else {
68
- const module = originalRequire?.(id);
69
- if (module) {
70
- return extractDefault(module);
71
- }
72
- }
73
-
74
- // eslint-disable-next-line no-console -- Valid usage.
75
- console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Empty object is returned instead.`);
76
- return {};
77
- }
78
- })();
79
5
 
80
6
  "use strict";
81
7
  var __defProp = Object.defineProperty;
@@ -178,4 +104,4 @@ async function createUnpluginVuePlugin(params) {
178
104
  createRollupCompatibleFeaturePlugin,
179
105
  createUnpluginVuePlugin
180
106
  });
181
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9idW5kbGVycy9yb2xsdXAtY29tcGF0aWJsZS1mZWF0dXJlcy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlXG4gKlxuICogVGhlIGJ1aWxkIGZlYXR1cmVzIG9mIHRoZSByb2xsdXAgYW5kIHZpdGUgYWRhcHRlcnM6IG9uZSBwbHVnaW4sIHR5cGVkIGJ5IHRoZSBzaGFwZSBib3RoIGJ1bmRsZXJzIGFjY2VwdCwgdGhhdCBydW5zXG4gKiB0aGUgc2hhcmVkIHRyYW5zZm9ybXMgKFNvbGlkLCBTdmVsdGUsIHN0eWxlc2hlZXRzLCBXZWJBc3NlbWJseSkgYW5kIHJlcGxhY2VzIHRoZSBmcmFtZXdvcmsncyBjb21waWxlLXRpbWUgY29uc3RhbnRzLFxuICogcGx1cyB0aGUgYHVucGx1Z2luLXZ1ZWAgcGx1Z2luIGZvciBWdWUuXG4gKi9cblxuaW1wb3J0IHsgcmVhZEZpbGUgfSBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcblxuaW1wb3J0IHR5cGUgeyBPYnNpZGlhblBsdWdpbkZlYXR1cmVPcHRpb25zIH0gZnJvbSAnLi9vYnNpZGlhbi1wbHVnaW4tZmVhdHVyZXMudHMnO1xuaW1wb3J0IHR5cGUgeyBTb3VyY2VNYXBMaWtlIH0gZnJvbSAnLi9vYnNpZGlhbi1wbHVnaW4tdHJhbnNmb3Jtcy50cyc7XG5cbmltcG9ydCB7IE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzIH0gZnJvbSAnLi4vb2JzaWRpYW4tcGx1Z2luLXJlcG8tcGF0aHMudHMnO1xuaW1wb3J0IHtcbiAgZ2V0RmVhdHVyZUZpbGVLaW5kLFxuICBnZXRGcmFtZXdvcmtEZWZpbmVzLFxuICBpbXBvcnRPcHRpb25hbFBlZXIsXG4gIHJlcGxhY2VEZWZpbmVzXG59IGZyb20gJy4vb2JzaWRpYW4tcGx1Z2luLWZlYXR1cmVzLnRzJztcbmltcG9ydCB7XG4gIGdldENzc01vZHVsZUNvZGUsXG4gIGdldFdhc21Nb2R1bGVDb2RlLFxuICB0cmFuc2Zvcm1Dc3MsXG4gIHRyYW5zZm9ybVNvbGlkLFxuICB0cmFuc2Zvcm1TdmVsdGVcbn0gZnJvbSAnLi9vYnNpZGlhbi1wbHVnaW4tdHJhbnNmb3Jtcy50cyc7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGNyZWF0ZVJvbGx1cENvbXBhdGlibGVGZWF0dXJlUGx1Z2lufS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVhdGVSb2xsdXBDb21wYXRpYmxlRmVhdHVyZVBsdWdpblBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgYnVpbGQgZmVhdHVyZXMuXG4gICAqL1xuICByZWFkb25seSBmZWF0dXJlczogT2JzaWRpYW5QbHVnaW5GZWF0dXJlT3B0aW9ucztcblxuICAvKipcbiAgICogVGVsbHMgd2hldGhlciB0aGUgYnVpbGQgaXMgYSBwcm9kdWN0aW9uIG9uZS4gQ2FsbGVkIGZyb20gdGhlIGhvb2tzLCBhZnRlciB0aGUgYWRhcHRlciByZXNvbHZlZCBpdHMgYnVpbGQgbW9kZS5cbiAgICovXG4gIHJlYWRvbmx5IGlzUHJvZHVjdGlvbkJ1aWxkOiAoKSA9PiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoaXMgcGx1Z2luIGNvbXBpbGVzIHN0eWxlc2hlZXRzLiBWaXRlIGNvbXBpbGVzIHRoZW0gaXRzZWxmLlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkQ29tcGlsZVN0eWxlc2hlZXRzOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoaXMgcGx1Z2luIHJlcGxhY2VzIHRoZSBmcmFtZXdvcmsncyBjb21waWxlLXRpbWUgY29uc3RhbnRzIGluIHRoZSBjb2RlLiBWaXRlIGRvZXMgaXQgdGhyb3VnaCBpdHMgb3duXG4gICAqIGBkZWZpbmVgLlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkUmVwbGFjZURlZmluZXM6IGJvb2xlYW47XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGNyZWF0ZVVucGx1Z2luVnVlUGx1Z2lufS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVhdGVVbnBsdWdpblZ1ZVBsdWdpblBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgYnVuZGxlciwgd2hpY2ggbmFtZXMgdGhlIGB1bnBsdWdpbi12dWVgIGVudHJ5LlxuICAgKi9cbiAgcmVhZG9ubHkgYnVuZGxlcjogJ3JvbGx1cCcgfCAndml0ZSc7XG5cbiAgLyoqXG4gICAqIFRoZSBidWlsZCBmZWF0dXJlcy5cbiAgICovXG4gIHJlYWRvbmx5IGZlYXR1cmVzOiBPYnNpZGlhblBsdWdpbkZlYXR1cmVPcHRpb25zO1xufVxuXG4vKipcbiAqIFRoZSBwYXJ0IG9mIGEgcm9sbHVwIG9yIHJvbGxkb3duIHBsdWdpbiBjb250ZXh0IHRoZSBmZWF0dXJlIHBsdWdpbiB1c2VzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZlYXR1cmVQbHVnaW5Db250ZXh0IHtcbiAgLyoqXG4gICAqIEFkZHMgYSBmaWxlIHRvIHdhdGNoIGluIGEgd2F0Y2ggYnVpbGQuXG4gICAqXG4gICAqIEBwYXJhbSBpZCAtIFRoZSBmaWxlJ3MgcGF0aC5cbiAgICovXG4gIGFkZFdhdGNoRmlsZTogKGlkOiBzdHJpbmcpID0+IHZvaWQ7XG5cbiAgLyoqXG4gICAqIEVtaXRzIGFuIGFzc2V0IGludG8gdGhlIGJ1bmRsZS5cbiAgICpcbiAgICogQHBhcmFtIGVtaXR0ZWRGaWxlIC0gVGhlIGFzc2V0IHRvIGVtaXQuXG4gICAqIEByZXR1cm5zIFRoZSByZWZlcmVuY2UgaWQgb2YgdGhlIGVtaXR0ZWQgZmlsZS5cbiAgICovXG4gIGVtaXRGaWxlOiAoZW1pdHRlZEZpbGU6IEVtaXR0ZWRBc3NldCkgPT4gc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSBwbHVnaW4ge0BsaW5rIGNyZWF0ZVJvbGx1cENvbXBhdGlibGVGZWF0dXJlUGx1Z2lufSBjcmVhdGVzLCBpbiB0aGUgc2hhcGUgcm9sbHVwIGFuZCB2aXRlIGJvdGggYWNjZXB0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJvbGx1cENvbXBhdGlibGVGZWF0dXJlUGx1Z2luIHtcbiAgLyoqXG4gICAqIExvYWRzIGEgYC53YXNtYCBtb2R1bGUgYXMgaXRzIGJ5dGVzLlxuICAgKi9cbiAgcmVhZG9ubHkgbG9hZDogRmVhdHVyZVBsdWdpbkhvb2s8KHRoaXM6IEZlYXR1cmVQbHVnaW5Db250ZXh0LCBpZDogc3RyaW5nKSA9PiBQcm9taXNlPG51bGwgfCBzdHJpbmc+PjtcblxuICAvKipcbiAgICogVGhlIHBsdWdpbidzIG5hbWUuXG4gICAqL1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIENvbXBpbGVzIGEgbW9kdWxlIHRoZSBmZWF0dXJlcyB0cmFuc2Zvcm0sIHRoZW4gcmVwbGFjZXMgdGhlIGNvbXBpbGUtdGltZSBjb25zdGFudHMuXG4gICAqL1xuICByZWFkb25seSB0cmFuc2Zvcm06IEZlYXR1cmVQbHVnaW5Ib29rPCh0aGlzOiBGZWF0dXJlUGx1Z2luQ29udGV4dCwgY29kZTogc3RyaW5nLCBpZDogc3RyaW5nKSA9PiBQcm9taXNlPG51bGwgfCBUcmFuc2Zvcm1SZXN1bHRMaWtlPj47XG59XG5cbi8qKlxuICogVGhlIGFzc2V0IHRoZSBmZWF0dXJlIHBsdWdpbiBlbWl0cyBmb3IgYSBzdHlsZXNoZWV0LlxuICovXG5pbnRlcmZhY2UgRW1pdHRlZEFzc2V0IHtcbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICByZWFkb25seSBzb3VyY2U6IHN0cmluZztcbiAgcmVhZG9ubHkgdHlwZTogJ2Fzc2V0Jztcbn1cblxuLyoqXG4gKiBBIHBsdWdpbiBob29rIHdpdGggaXRzIG9yZGVyLlxuICpcbiAqIEB0eXBlUGFyYW0gSGFuZGxlciAtIFRoZSBob29rJ3MgaGFuZGxlci5cbiAqL1xuaW50ZXJmYWNlIEZlYXR1cmVQbHVnaW5Ib29rPEhhbmRsZXI+IHtcbiAgcmVhZG9ubHkgaGFuZGxlcjogSGFuZGxlcjtcbiAgcmVhZG9ubHkgb3JkZXI6ICdwcmUnO1xufVxuXG4vKipcbiAqIEEgdHJhbnNmb3JtIGhvb2sncyByZXN1bHQuXG4gKi9cbmludGVyZmFjZSBUcmFuc2Zvcm1SZXN1bHRMaWtlIHtcbiAgcmVhZG9ubHkgY29kZTogc3RyaW5nO1xuICByZWFkb25seSBtYXA/OiBTb3VyY2VNYXBMaWtlIHwgdW5kZWZpbmVkO1xufVxuXG5pbnRlcmZhY2UgVW5wbHVnaW5WdWVNb2R1bGUge1xuICByZWFkb25seSBkZWZhdWx0OiAob3B0aW9ucz86IG9iamVjdCkgPT4gdW5rbm93bjtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIHRoZSBwbHVnaW4gdGhhdCBydW5zIHRoZSBzaGFyZWQgdHJhbnNmb3JtcyBpbiBhIHJvbGx1cCBvciB2aXRlIGJ1aWxkLlxuICpcbiAqIC0gYGZyYW1ld29yazogJ3NvbGlkJ2AgY29tcGlsZXMgYC5qc3hgIC8gYC50c3hgIHdpdGggYGJhYmVsLXByZXNldC1zb2xpZGAsIGJlZm9yZSB0aGUgcHJvamVjdCdzIFR5cGVTY3JpcHQgcGx1Z2luLlxuICogLSBgZnJhbWV3b3JrOiAnc3ZlbHRlJ2AgY29tcGlsZXMgYC5zdmVsdGVgIGNvbXBvbmVudHMgYW5kIGAuc3ZlbHRlLnRzYCAvIGAuc3ZlbHRlLmpzYCBtb2R1bGVzLlxuICogLSBgc3R5bGVzYCwgd2hlcmUge0BsaW5rIENyZWF0ZVJvbGx1cENvbXBhdGlibGVGZWF0dXJlUGx1Z2luUGFyYW1zLnNob3VsZENvbXBpbGVTdHlsZXNoZWV0c30gc2F5cyBzbywgcnVucyBldmVyeVxuICogICBzdHlsZXNoZWV0IHRocm91Z2ggUG9zdENTUywgVGFpbHdpbmQgYW5kIENTUy1tb2R1bGUgc2NvcGluZyBhbmQgZW1pdHMgaXQgYXMgYW4gYXNzZXQsIHdoaWNoIGVuZHMgdXAgaW5cbiAqICAgYHN0eWxlcy5jc3NgLlxuICogLSBgd2FzbWAgbG9hZHMgYSBgLndhc21gIG1vZHVsZSBhcyBpdHMgYnl0ZXMuXG4gKiAtIEEgZnJhbWV3b3JrJ3MgY29tcGlsZS10aW1lIGNvbnN0YW50cyBhcmUgcmVwbGFjZWQgd2hlcmVcbiAqICAge0BsaW5rIENyZWF0ZVJvbGx1cENvbXBhdGlibGVGZWF0dXJlUGx1Z2luUGFyYW1zLnNob3VsZFJlcGxhY2VEZWZpbmVzfSBzYXlzIHNvLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUge0BsaW5rIENyZWF0ZVJvbGx1cENvbXBhdGlibGVGZWF0dXJlUGx1Z2luUGFyYW1zfS5cbiAqIEByZXR1cm5zIFRoZSBwbHVnaW4uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVSb2xsdXBDb21wYXRpYmxlRmVhdHVyZVBsdWdpbihwYXJhbXM6IENyZWF0ZVJvbGx1cENvbXBhdGlibGVGZWF0dXJlUGx1Z2luUGFyYW1zKTogUm9sbHVwQ29tcGF0aWJsZUZlYXR1cmVQbHVnaW4ge1xuICBjb25zdCB7IGZlYXR1cmVzLCBpc1Byb2R1Y3Rpb25CdWlsZCwgc2hvdWxkQ29tcGlsZVN0eWxlc2hlZXRzLCBzaG91bGRSZXBsYWNlRGVmaW5lcyB9ID0gcGFyYW1zO1xuXG4gIGFzeW5jIGZ1bmN0aW9uIHRyYW5zZm9ybUZlYXR1cmVGaWxlKGNvbnRleHQ6IEZlYXR1cmVQbHVnaW5Db250ZXh0LCBjb2RlOiBzdHJpbmcsIGlkOiBzdHJpbmcpOiBQcm9taXNlPG51bGwgfCBUcmFuc2Zvcm1SZXN1bHRMaWtlPiB7XG4gICAgY29uc3QgW2ZpbGVQYXRoID0gaWRdID0gaWQuc3BsaXQoJz8nLCAxKTtcbiAgICBzd2l0Y2ggKGdldEZlYXR1cmVGaWxlS2luZChpZCkpIHtcbiAgICAgIGNhc2UgJ2pzeCc6IHtcbiAgICAgICAgcmV0dXJuIGZlYXR1cmVzLmZyYW1ld29yayA9PT0gJ3NvbGlkJyA/IGF3YWl0IHRyYW5zZm9ybVNvbGlkKHsgY29kZSwgZmlsZVBhdGgsIGlzUHJvZHVjdGlvbkJ1aWxkOiBpc1Byb2R1Y3Rpb25CdWlsZCgpIH0pIDogbnVsbDtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3N0eWxlc2hlZXQnOiB7XG4gICAgICAgIGlmICghc2hvdWxkQ29tcGlsZVN0eWxlc2hlZXRzIHx8ICFmZWF0dXJlcy5zdHlsZXMpIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0cmFuc2Zvcm1Dc3Moe1xuICAgICAgICAgIGZpbGVQYXRoLFxuICAgICAgICAgIGlzQ3NzTW9kdWxlU2NvcGVkOiB0cnVlLFxuICAgICAgICAgIGlzUHJvZHVjdGlvbkJ1aWxkOiBpc1Byb2R1Y3Rpb25CdWlsZCgpLFxuICAgICAgICAgIHNvdXJjZTogY29kZSxcbiAgICAgICAgICBzdHlsZXM6IGZlYXR1cmVzLnN0eWxlc1xuICAgICAgICB9KTtcbiAgICAgICAgZm9yIChjb25zdCBkZXBlbmRlbmN5IG9mIHJlc3VsdC5kZXBlbmRlbmNpZXMpIHtcbiAgICAgICAgICBjb250ZXh0LmFkZFdhdGNoRmlsZShkZXBlbmRlbmN5KTtcbiAgICAgICAgfVxuICAgICAgICBjb250ZXh0LmVtaXRGaWxlKHsgbmFtZTogT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuU3R5bGVzQ3NzLCBzb3VyY2U6IHJlc3VsdC5jc3MsIHR5cGU6ICdhc3NldCcgfSk7XG4gICAgICAgIHJldHVybiB7IGNvZGU6IHJlc3VsdC5tb2R1bGVFeHBvcnRzID8gZ2V0Q3NzTW9kdWxlQ29kZShyZXN1bHQubW9kdWxlRXhwb3J0cykgOiAnZXhwb3J0IGRlZmF1bHQgdW5kZWZpbmVkO1xcbicgfTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3N2ZWx0ZSc6IHtcbiAgICAgICAgcmV0dXJuIGZlYXR1cmVzLmZyYW1ld29yayA9PT0gJ3N2ZWx0ZScgPyBhd2FpdCB0cmFuc2Zvcm1TdmVsdGUoeyBjb2RlLCBmaWxlUGF0aCwgaXNQcm9kdWN0aW9uQnVpbGQ6IGlzUHJvZHVjdGlvbkJ1aWxkKCkgfSkgOiBudWxsO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGxvYWQ6IHtcbiAgICAgIGFzeW5jIGhhbmRsZXIoaWQpOiBQcm9taXNlPG51bGwgfCBzdHJpbmc+IHtcbiAgICAgICAgcmV0dXJuICFmZWF0dXJlcy53YXNtIHx8IGdldEZlYXR1cmVGaWxlS2luZChpZCkgIT09ICd3YXNtJyA/IG51bGwgOiBnZXRXYXNtTW9kdWxlQ29kZShhd2FpdCByZWFkRmlsZShpZCkpO1xuICAgICAgfSxcbiAgICAgIG9yZGVyOiAncHJlJ1xuICAgIH0sXG4gICAgbmFtZTogJ29ic2lkaWFuLXBsdWdpbi1mZWF0dXJlcycsXG4gICAgdHJhbnNmb3JtOiB7XG4gICAgICBhc3luYyBoYW5kbGVyKGNvZGUsIGlkKTogUHJvbWlzZTxudWxsIHwgVHJhbnNmb3JtUmVzdWx0TGlrZT4ge1xuICAgICAgICBjb25zdCB0cmFuc2Zvcm1lZCA9IGF3YWl0IHRyYW5zZm9ybUZlYXR1cmVGaWxlKHRoaXMsIGNvZGUsIGlkKTtcbiAgICAgICAgaWYgKCFzaG91bGRSZXBsYWNlRGVmaW5lcykge1xuICAgICAgICAgIHJldHVybiB0cmFuc2Zvcm1lZDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkZWZpbmVzID0gZ2V0RnJhbWV3b3JrRGVmaW5lcyh7IGZyYW1ld29yazogZmVhdHVyZXMuZnJhbWV3b3JrLCBpc1Byb2R1Y3Rpb25CdWlsZDogaXNQcm9kdWN0aW9uQnVpbGQoKSB9KTtcbiAgICAgICAgY29uc3Qgc291cmNlID0gdHJhbnNmb3JtZWQ/LmNvZGUgPz8gY29kZTtcbiAgICAgICAgY29uc3QgcmVwbGFjZWQgPSByZXBsYWNlRGVmaW5lcyhzb3VyY2UsIGRlZmluZXMpO1xuICAgICAgICByZXR1cm4gcmVwbGFjZWQgPT09IHNvdXJjZSA/IHRyYW5zZm9ybWVkIDogeyBjb2RlOiByZXBsYWNlZCwgbWFwOiB0cmFuc2Zvcm1lZD8ubWFwIH07XG4gICAgICB9LFxuICAgICAgb3JkZXI6ICdwcmUnXG4gICAgfVxuICB9O1xufVxuXG4vKipcbiAqIENyZWF0ZXMgdGhlIGB1bnBsdWdpbi12dWVgIHBsdWdpbiBvZiBvbmUgYnVuZGxlciB3aGVuIHRoZSBmcmFtZXdvcmsgaXMgVnVlLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUge0BsaW5rIENyZWF0ZVVucGx1Z2luVnVlUGx1Z2luUGFyYW1zfS5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHBsdWdpbiwgb3IgYG51bGxgIHdoZW4gdGhlIGZyYW1ld29yayBpcyBub3QgVnVlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlVW5wbHVnaW5WdWVQbHVnaW4ocGFyYW1zOiBDcmVhdGVVbnBsdWdpblZ1ZVBsdWdpblBhcmFtcyk6IFByb21pc2U8dW5rbm93bj4ge1xuICBjb25zdCB7IGJ1bmRsZXIsIGZlYXR1cmVzIH0gPSBwYXJhbXM7XG4gIGlmIChmZWF0dXJlcy5mcmFtZXdvcmsgIT09ICd2dWUnKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY29uc3QgdW5wbHVnaW5WdWUgPSBhd2FpdCBpbXBvcnRPcHRpb25hbFBlZXI8VW5wbHVnaW5WdWVNb2R1bGU+KHtcbiAgICBmZWF0dXJlOiAnZnJhbWV3b3JrOiBcXCd2dWVcXCcnLFxuICAgIHBhY2thZ2VOYW1lOiAndW5wbHVnaW4tdnVlJyxcbiAgICBzcGVjaWZpZXI6IGB1bnBsdWdpbi12dWUvJHtidW5kbGVyfWBcbiAgfSk7XG4gIHJldHVybiB1bnBsdWdpblZ1ZS5kZWZhdWx0KCk7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFRQSxzQkFBeUI7QUFLekIsd0NBQXdDO0FBQ3hDLHNDQUtPO0FBQ1Asd0NBTU87QUFpSUEsU0FBUyxvQ0FBb0MsUUFBa0Y7QUFDcEksUUFBTSxFQUFFLFVBQVUsbUJBQW1CLDBCQUEwQixxQkFBcUIsSUFBSTtBQUV4RixpQkFBZSxxQkFBcUIsU0FBK0IsTUFBYyxJQUFpRDtBQUNoSSxVQUFN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
107
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL2J1bmRsZXJzL3JvbGx1cC1jb21wYXRpYmxlLWZlYXR1cmVzLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogVGhlIGJ1aWxkIGZlYXR1cmVzIG9mIHRoZSByb2xsdXAgYW5kIHZpdGUgYWRhcHRlcnM6IG9uZSBwbHVnaW4sIHR5cGVkIGJ5IHRoZSBzaGFwZSBib3RoIGJ1bmRsZXJzIGFjY2VwdCwgdGhhdCBydW5zXG4gKiB0aGUgc2hhcmVkIHRyYW5zZm9ybXMgKFNvbGlkLCBTdmVsdGUsIHN0eWxlc2hlZXRzLCBXZWJBc3NlbWJseSkgYW5kIHJlcGxhY2VzIHRoZSBmcmFtZXdvcmsncyBjb21waWxlLXRpbWUgY29uc3RhbnRzLFxuICogcGx1cyB0aGUgYHVucGx1Z2luLXZ1ZWAgcGx1Z2luIGZvciBWdWUuXG4gKi9cblxuaW1wb3J0IHsgcmVhZEZpbGUgfSBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcblxuaW1wb3J0IHR5cGUgeyBPYnNpZGlhblBsdWdpbkZlYXR1cmVPcHRpb25zIH0gZnJvbSAnLi9vYnNpZGlhbi1wbHVnaW4tZmVhdHVyZXMudHMnO1xuaW1wb3J0IHR5cGUgeyBTb3VyY2VNYXBMaWtlIH0gZnJvbSAnLi9vYnNpZGlhbi1wbHVnaW4tdHJhbnNmb3Jtcy50cyc7XG5cbmltcG9ydCB7IE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzIH0gZnJvbSAnLi4vb2JzaWRpYW4tcGx1Z2luLXJlcG8tcGF0aHMudHMnO1xuaW1wb3J0IHtcbiAgZ2V0RmVhdHVyZUZpbGVLaW5kLFxuICBnZXRGcmFtZXdvcmtEZWZpbmVzLFxuICBpbXBvcnRPcHRpb25hbFBlZXIsXG4gIHJlcGxhY2VEZWZpbmVzXG59IGZyb20gJy4vb2JzaWRpYW4tcGx1Z2luLWZlYXR1cmVzLnRzJztcbmltcG9ydCB7XG4gIGdldENzc01vZHVsZUNvZGUsXG4gIGdldFdhc21Nb2R1bGVDb2RlLFxuICB0cmFuc2Zvcm1Dc3MsXG4gIHRyYW5zZm9ybVNvbGlkLFxuICB0cmFuc2Zvcm1TdmVsdGVcbn0gZnJvbSAnLi9vYnNpZGlhbi1wbHVnaW4tdHJhbnNmb3Jtcy50cyc7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGNyZWF0ZVJvbGx1cENvbXBhdGlibGVGZWF0dXJlUGx1Z2lufS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVhdGVSb2xsdXBDb21wYXRpYmxlRmVhdHVyZVBsdWdpblBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgYnVpbGQgZmVhdHVyZXMuXG4gICAqL1xuICByZWFkb25seSBmZWF0dXJlczogT2JzaWRpYW5QbHVnaW5GZWF0dXJlT3B0aW9ucztcblxuICAvKipcbiAgICogVGVsbHMgd2hldGhlciB0aGUgYnVpbGQgaXMgYSBwcm9kdWN0aW9uIG9uZS4gQ2FsbGVkIGZyb20gdGhlIGhvb2tzLCBhZnRlciB0aGUgYWRhcHRlciByZXNvbHZlZCBpdHMgYnVpbGQgbW9kZS5cbiAgICovXG4gIHJlYWRvbmx5IGlzUHJvZHVjdGlvbkJ1aWxkOiAoKSA9PiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoaXMgcGx1Z2luIGNvbXBpbGVzIHN0eWxlc2hlZXRzLiBWaXRlIGNvbXBpbGVzIHRoZW0gaXRzZWxmLlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkQ29tcGlsZVN0eWxlc2hlZXRzOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoaXMgcGx1Z2luIHJlcGxhY2VzIHRoZSBmcmFtZXdvcmsncyBjb21waWxlLXRpbWUgY29uc3RhbnRzIGluIHRoZSBjb2RlLiBWaXRlIGRvZXMgaXQgdGhyb3VnaCBpdHMgb3duXG4gICAqIGBkZWZpbmVgLlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkUmVwbGFjZURlZmluZXM6IGJvb2xlYW47XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGNyZWF0ZVVucGx1Z2luVnVlUGx1Z2lufS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVhdGVVbnBsdWdpblZ1ZVBsdWdpblBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgYnVuZGxlciwgd2hpY2ggbmFtZXMgdGhlIGB1bnBsdWdpbi12dWVgIGVudHJ5LlxuICAgKi9cbiAgcmVhZG9ubHkgYnVuZGxlcjogJ3JvbGx1cCcgfCAndml0ZSc7XG5cbiAgLyoqXG4gICAqIFRoZSBidWlsZCBmZWF0dXJlcy5cbiAgICovXG4gIHJlYWRvbmx5IGZlYXR1cmVzOiBPYnNpZGlhblBsdWdpbkZlYXR1cmVPcHRpb25zO1xufVxuXG4vKipcbiAqIFRoZSBwYXJ0IG9mIGEgcm9sbHVwIG9yIHJvbGxkb3duIHBsdWdpbiBjb250ZXh0IHRoZSBmZWF0dXJlIHBsdWdpbiB1c2VzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZlYXR1cmVQbHVnaW5Db250ZXh0IHtcbiAgLyoqXG4gICAqIEFkZHMgYSBmaWxlIHRvIHdhdGNoIGluIGEgd2F0Y2ggYnVpbGQuXG4gICAqXG4gICAqIEBwYXJhbSBpZCAtIFRoZSBmaWxlJ3MgcGF0aC5cbiAgICovXG4gIGFkZFdhdGNoRmlsZTogKGlkOiBzdHJpbmcpID0+IHZvaWQ7XG5cbiAgLyoqXG4gICAqIEVtaXRzIGFuIGFzc2V0IGludG8gdGhlIGJ1bmRsZS5cbiAgICpcbiAgICogQHBhcmFtIGVtaXR0ZWRGaWxlIC0gVGhlIGFzc2V0IHRvIGVtaXQuXG4gICAqIEByZXR1cm5zIFRoZSByZWZlcmVuY2UgaWQgb2YgdGhlIGVtaXR0ZWQgZmlsZS5cbiAgICovXG4gIGVtaXRGaWxlOiAoZW1pdHRlZEZpbGU6IEVtaXR0ZWRBc3NldCkgPT4gc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSBwbHVnaW4ge0BsaW5rIGNyZWF0ZVJvbGx1cENvbXBhdGlibGVGZWF0dXJlUGx1Z2lufSBjcmVhdGVzLCBpbiB0aGUgc2hhcGUgcm9sbHVwIGFuZCB2aXRlIGJvdGggYWNjZXB0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJvbGx1cENvbXBhdGlibGVGZWF0dXJlUGx1Z2luIHtcbiAgLyoqXG4gICAqIExvYWRzIGEgYC53YXNtYCBtb2R1bGUgYXMgaXRzIGJ5dGVzLlxuICAgKi9cbiAgcmVhZG9ubHkgbG9hZDogRmVhdHVyZVBsdWdpbkhvb2s8KHRoaXM6IEZlYXR1cmVQbHVnaW5Db250ZXh0LCBpZDogc3RyaW5nKSA9PiBQcm9taXNlPG51bGwgfCBzdHJpbmc+PjtcblxuICAvKipcbiAgICogVGhlIHBsdWdpbidzIG5hbWUuXG4gICAqL1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIENvbXBpbGVzIGEgbW9kdWxlIHRoZSBmZWF0dXJlcyB0cmFuc2Zvcm0sIHRoZW4gcmVwbGFjZXMgdGhlIGNvbXBpbGUtdGltZSBjb25zdGFudHMuXG4gICAqL1xuICByZWFkb25seSB0cmFuc2Zvcm06IEZlYXR1cmVQbHVnaW5Ib29rPCh0aGlzOiBGZWF0dXJlUGx1Z2luQ29udGV4dCwgY29kZTogc3RyaW5nLCBpZDogc3RyaW5nKSA9PiBQcm9taXNlPG51bGwgfCBUcmFuc2Zvcm1SZXN1bHRMaWtlPj47XG59XG5cbi8qKlxuICogVGhlIGFzc2V0IHRoZSBmZWF0dXJlIHBsdWdpbiBlbWl0cyBmb3IgYSBzdHlsZXNoZWV0LlxuICovXG5pbnRlcmZhY2UgRW1pdHRlZEFzc2V0IHtcbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICByZWFkb25seSBzb3VyY2U6IHN0cmluZztcbiAgcmVhZG9ubHkgdHlwZTogJ2Fzc2V0Jztcbn1cblxuLyoqXG4gKiBBIHBsdWdpbiBob29rIHdpdGggaXRzIG9yZGVyLlxuICpcbiAqIEB0eXBlUGFyYW0gSGFuZGxlciAtIFRoZSBob29rJ3MgaGFuZGxlci5cbiAqL1xuaW50ZXJmYWNlIEZlYXR1cmVQbHVnaW5Ib29rPEhhbmRsZXI+IHtcbiAgcmVhZG9ubHkgaGFuZGxlcjogSGFuZGxlcjtcbiAgcmVhZG9ubHkgb3JkZXI6ICdwcmUnO1xufVxuXG4vKipcbiAqIEEgdHJhbnNmb3JtIGhvb2sncyByZXN1bHQuXG4gKi9cbmludGVyZmFjZSBUcmFuc2Zvcm1SZXN1bHRMaWtlIHtcbiAgcmVhZG9ubHkgY29kZTogc3RyaW5nO1xuICByZWFkb25seSBtYXA/OiBTb3VyY2VNYXBMaWtlIHwgdW5kZWZpbmVkO1xufVxuXG5pbnRlcmZhY2UgVW5wbHVnaW5WdWVNb2R1bGUge1xuICByZWFkb25seSBkZWZhdWx0OiAob3B0aW9ucz86IG9iamVjdCkgPT4gdW5rbm93bjtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIHRoZSBwbHVnaW4gdGhhdCBydW5zIHRoZSBzaGFyZWQgdHJhbnNmb3JtcyBpbiBhIHJvbGx1cCBvciB2aXRlIGJ1aWxkLlxuICpcbiAqIC0gYGZyYW1ld29yazogJ3NvbGlkJ2AgY29tcGlsZXMgYC5qc3hgIC8gYC50c3hgIHdpdGggYGJhYmVsLXByZXNldC1zb2xpZGAsIGJlZm9yZSB0aGUgcHJvamVjdCdzIFR5cGVTY3JpcHQgcGx1Z2luLlxuICogLSBgZnJhbWV3b3JrOiAnc3ZlbHRlJ2AgY29tcGlsZXMgYC5zdmVsdGVgIGNvbXBvbmVudHMgYW5kIGAuc3ZlbHRlLnRzYCAvIGAuc3ZlbHRlLmpzYCBtb2R1bGVzLlxuICogLSBgc3R5bGVzYCwgd2hlcmUge0BsaW5rIENyZWF0ZVJvbGx1cENvbXBhdGlibGVGZWF0dXJlUGx1Z2luUGFyYW1zLnNob3VsZENvbXBpbGVTdHlsZXNoZWV0c30gc2F5cyBzbywgcnVucyBldmVyeVxuICogICBzdHlsZXNoZWV0IHRocm91Z2ggUG9zdENTUywgVGFpbHdpbmQgYW5kIENTUy1tb2R1bGUgc2NvcGluZyBhbmQgZW1pdHMgaXQgYXMgYW4gYXNzZXQsIHdoaWNoIGVuZHMgdXAgaW5cbiAqICAgYHN0eWxlcy5jc3NgLlxuICogLSBgd2FzbWAgbG9hZHMgYSBgLndhc21gIG1vZHVsZSBhcyBpdHMgYnl0ZXMuXG4gKiAtIEEgZnJhbWV3b3JrJ3MgY29tcGlsZS10aW1lIGNvbnN0YW50cyBhcmUgcmVwbGFjZWQgd2hlcmVcbiAqICAge0BsaW5rIENyZWF0ZVJvbGx1cENvbXBhdGlibGVGZWF0dXJlUGx1Z2luUGFyYW1zLnNob3VsZFJlcGxhY2VEZWZpbmVzfSBzYXlzIHNvLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUge0BsaW5rIENyZWF0ZVJvbGx1cENvbXBhdGlibGVGZWF0dXJlUGx1Z2luUGFyYW1zfS5cbiAqIEByZXR1cm5zIFRoZSBwbHVnaW4uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVSb2xsdXBDb21wYXRpYmxlRmVhdHVyZVBsdWdpbihwYXJhbXM6IENyZWF0ZVJvbGx1cENvbXBhdGlibGVGZWF0dXJlUGx1Z2luUGFyYW1zKTogUm9sbHVwQ29tcGF0aWJsZUZlYXR1cmVQbHVnaW4ge1xuICBjb25zdCB7IGZlYXR1cmVzLCBpc1Byb2R1Y3Rpb25CdWlsZCwgc2hvdWxkQ29tcGlsZVN0eWxlc2hlZXRzLCBzaG91bGRSZXBsYWNlRGVmaW5lcyB9ID0gcGFyYW1zO1xuXG4gIGFzeW5jIGZ1bmN0aW9uIHRyYW5zZm9ybUZlYXR1cmVGaWxlKGNvbnRleHQ6IEZlYXR1cmVQbHVnaW5Db250ZXh0LCBjb2RlOiBzdHJpbmcsIGlkOiBzdHJpbmcpOiBQcm9taXNlPG51bGwgfCBUcmFuc2Zvcm1SZXN1bHRMaWtlPiB7XG4gICAgY29uc3QgW2ZpbGVQYXRoID0gaWRdID0gaWQuc3BsaXQoJz8nLCAxKTtcbiAgICBzd2l0Y2ggKGdldEZlYXR1cmVGaWxlS2luZChpZCkpIHtcbiAgICAgIGNhc2UgJ2pzeCc6IHtcbiAgICAgICAgcmV0dXJuIGZlYXR1cmVzLmZyYW1ld29yayA9PT0gJ3NvbGlkJyA/IGF3YWl0IHRyYW5zZm9ybVNvbGlkKHsgY29kZSwgZmlsZVBhdGgsIGlzUHJvZHVjdGlvbkJ1aWxkOiBpc1Byb2R1Y3Rpb25CdWlsZCgpIH0pIDogbnVsbDtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3N0eWxlc2hlZXQnOiB7XG4gICAgICAgIGlmICghc2hvdWxkQ29tcGlsZVN0eWxlc2hlZXRzIHx8ICFmZWF0dXJlcy5zdHlsZXMpIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0cmFuc2Zvcm1Dc3Moe1xuICAgICAgICAgIGZpbGVQYXRoLFxuICAgICAgICAgIGlzQ3NzTW9kdWxlU2NvcGVkOiB0cnVlLFxuICAgICAgICAgIGlzUHJvZHVjdGlvbkJ1aWxkOiBpc1Byb2R1Y3Rpb25CdWlsZCgpLFxuICAgICAgICAgIHNvdXJjZTogY29kZSxcbiAgICAgICAgICBzdHlsZXM6IGZlYXR1cmVzLnN0eWxlc1xuICAgICAgICB9KTtcbiAgICAgICAgZm9yIChjb25zdCBkZXBlbmRlbmN5IG9mIHJlc3VsdC5kZXBlbmRlbmNpZXMpIHtcbiAgICAgICAgICBjb250ZXh0LmFkZFdhdGNoRmlsZShkZXBlbmRlbmN5KTtcbiAgICAgICAgfVxuICAgICAgICBjb250ZXh0LmVtaXRGaWxlKHsgbmFtZTogT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuU3R5bGVzQ3NzLCBzb3VyY2U6IHJlc3VsdC5jc3MsIHR5cGU6ICdhc3NldCcgfSk7XG4gICAgICAgIHJldHVybiB7IGNvZGU6IHJlc3VsdC5tb2R1bGVFeHBvcnRzID8gZ2V0Q3NzTW9kdWxlQ29kZShyZXN1bHQubW9kdWxlRXhwb3J0cykgOiAnZXhwb3J0IGRlZmF1bHQgdW5kZWZpbmVkO1xcbicgfTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3N2ZWx0ZSc6IHtcbiAgICAgICAgcmV0dXJuIGZlYXR1cmVzLmZyYW1ld29yayA9PT0gJ3N2ZWx0ZScgPyBhd2FpdCB0cmFuc2Zvcm1TdmVsdGUoeyBjb2RlLCBmaWxlUGF0aCwgaXNQcm9kdWN0aW9uQnVpbGQ6IGlzUHJvZHVjdGlvbkJ1aWxkKCkgfSkgOiBudWxsO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGxvYWQ6IHtcbiAgICAgIGFzeW5jIGhhbmRsZXIoaWQpOiBQcm9taXNlPG51bGwgfCBzdHJpbmc+IHtcbiAgICAgICAgcmV0dXJuICFmZWF0dXJlcy53YXNtIHx8IGdldEZlYXR1cmVGaWxlS2luZChpZCkgIT09ICd3YXNtJyA/IG51bGwgOiBnZXRXYXNtTW9kdWxlQ29kZShhd2FpdCByZWFkRmlsZShpZCkpO1xuICAgICAgfSxcbiAgICAgIG9yZGVyOiAncHJlJ1xuICAgIH0sXG4gICAgbmFtZTogJ29ic2lkaWFuLXBsdWdpbi1mZWF0dXJlcycsXG4gICAgdHJhbnNmb3JtOiB7XG4gICAgICBhc3luYyBoYW5kbGVyKGNvZGUsIGlkKTogUHJvbWlzZTxudWxsIHwgVHJhbnNmb3JtUmVzdWx0TGlrZT4ge1xuICAgICAgICBjb25zdCB0cmFuc2Zvcm1lZCA9IGF3YWl0IHRyYW5zZm9ybUZlYXR1cmVGaWxlKHRoaXMsIGNvZGUsIGlkKTtcbiAgICAgICAgaWYgKCFzaG91bGRSZXBsYWNlRGVmaW5lcykge1xuICAgICAgICAgIHJldHVybiB0cmFuc2Zvcm1lZDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkZWZpbmVzID0gZ2V0RnJhbWV3b3JrRGVmaW5lcyh7IGZyYW1ld29yazogZmVhdHVyZXMuZnJhbWV3b3JrLCBpc1Byb2R1Y3Rpb25CdWlsZDogaXNQcm9kdWN0aW9uQnVpbGQoKSB9KTtcbiAgICAgICAgY29uc3Qgc291cmNlID0gdHJhbnNmb3JtZWQ/LmNvZGUgPz8gY29kZTtcbiAgICAgICAgY29uc3QgcmVwbGFjZWQgPSByZXBsYWNlRGVmaW5lcyhzb3VyY2UsIGRlZmluZXMpO1xuICAgICAgICByZXR1cm4gcmVwbGFjZWQgPT09IHNvdXJjZSA/IHRyYW5zZm9ybWVkIDogeyBjb2RlOiByZXBsYWNlZCwgbWFwOiB0cmFuc2Zvcm1lZD8ubWFwIH07XG4gICAgICB9LFxuICAgICAgb3JkZXI6ICdwcmUnXG4gICAgfVxuICB9O1xufVxuXG4vKipcbiAqIENyZWF0ZXMgdGhlIGB1bnBsdWdpbi12dWVgIHBsdWdpbiBvZiBvbmUgYnVuZGxlciB3aGVuIHRoZSBmcmFtZXdvcmsgaXMgVnVlLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUge0BsaW5rIENyZWF0ZVVucGx1Z2luVnVlUGx1Z2luUGFyYW1zfS5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHBsdWdpbiwgb3IgYG51bGxgIHdoZW4gdGhlIGZyYW1ld29yayBpcyBub3QgVnVlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlVW5wbHVnaW5WdWVQbHVnaW4ocGFyYW1zOiBDcmVhdGVVbnBsdWdpblZ1ZVBsdWdpblBhcmFtcyk6IFByb21pc2U8dW5rbm93bj4ge1xuICBjb25zdCB7IGJ1bmRsZXIsIGZlYXR1cmVzIH0gPSBwYXJhbXM7XG4gIGlmIChmZWF0dXJlcy5mcmFtZXdvcmsgIT09ICd2dWUnKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY29uc3QgdW5wbHVnaW5WdWUgPSBhd2FpdCBpbXBvcnRPcHRpb25hbFBlZXI8VW5wbHVnaW5WdWVNb2R1bGU+KHtcbiAgICBmZWF0dXJlOiAnZnJhbWV3b3JrOiBcXCd2dWVcXCcnLFxuICAgIHBhY2thZ2VOYW1lOiAndW5wbHVnaW4tdnVlJyxcbiAgICBzcGVjaWZpZXI6IGB1bnBsdWdpbi12dWUvJHtidW5kbGVyfWBcbiAgfSk7XG4gIHJldHVybiB1bnBsdWdpblZ1ZS5kZWZhdWx0KCk7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQVFBLHNCQUF5QjtBQUt6Qix3Q0FBd0M7QUFDeEMsc0NBS087QUFDUCx3Q0FNTztBQWlJQSxTQUFTLG9DQUFvQyxRQUFrRjtBQUNwSSxRQUFNLEVBQUUsVUFBVSxtQkFBbUIsMEJBQTBCLHFCQUFxQixJQUFJO0FBRXhGLGlCQUFlLHFCQUFxQixTQUErQixNQUFjLElBQWlEO0FBQ2hJLFVBQU0sQ0FBQyxXQUFXLEVBQUUsSUFBSSxHQUFHLE1BQU0sS0FBSyxDQUFDO0FBQ3ZDLGdCQUFRLG9EQUFt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