@workflow/builders 5.0.0-beta.2 → 5.0.0-beta.21

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 (103) hide show
  1. package/dist/apply-swc-transform.d.ts +8 -3
  2. package/dist/apply-swc-transform.d.ts.map +1 -1
  3. package/dist/apply-swc-transform.js +10 -4
  4. package/dist/base-builder.d.ts +111 -11
  5. package/dist/base-builder.d.ts.map +1 -1
  6. package/dist/base-builder.js +698 -89
  7. package/dist/build-queue.js +1 -1
  8. package/dist/config-helpers.d.ts +2 -1
  9. package/dist/config-helpers.d.ts.map +1 -1
  10. package/dist/config-helpers.js +2 -1
  11. package/dist/constants.d.ts +27 -5
  12. package/dist/constants.d.ts.map +1 -1
  13. package/dist/constants.js +55 -19
  14. package/dist/constants.test.d.ts +2 -0
  15. package/dist/constants.test.d.ts.map +1 -0
  16. package/dist/constants.test.js +33 -0
  17. package/dist/discover-entries-esbuild-plugin.d.ts.map +1 -1
  18. package/dist/discover-entries-esbuild-plugin.js +19 -3
  19. package/dist/discover-entries-esbuild-plugin.test.js +1 -1
  20. package/dist/esbuild-tsconfig.js +1 -1
  21. package/dist/esbuild-tsconfig.test.js +1 -1
  22. package/dist/external-package-warning.test.d.ts +2 -0
  23. package/dist/external-package-warning.test.d.ts.map +1 -0
  24. package/dist/external-package-warning.test.js +219 -0
  25. package/dist/fast-discovery.d.ts +14 -0
  26. package/dist/fast-discovery.d.ts.map +1 -0
  27. package/dist/fast-discovery.js +665 -0
  28. package/dist/fast-discovery.test.d.ts +2 -0
  29. package/dist/fast-discovery.test.d.ts.map +1 -0
  30. package/dist/fast-discovery.test.js +288 -0
  31. package/dist/get-input-files.test.js +82 -3
  32. package/dist/index.d.ts +1 -1
  33. package/dist/index.d.ts.map +1 -1
  34. package/dist/index.js +2 -2
  35. package/dist/module-specifier.d.ts +20 -2
  36. package/dist/module-specifier.d.ts.map +1 -1
  37. package/dist/module-specifier.js +92 -17
  38. package/dist/module-specifier.test.js +45 -3
  39. package/dist/node-module-esbuild-plugin.d.ts.map +1 -1
  40. package/dist/node-module-esbuild-plugin.js +73 -23
  41. package/dist/node-module-esbuild-plugin.test.js +97 -1
  42. package/dist/pseudo-package-esbuild-plugin.js +1 -1
  43. package/dist/pseudo-package-esbuild-plugin.test.js +1 -1
  44. package/dist/request-converter.js +1 -1
  45. package/dist/resolve-sourcemap.test.d.ts +2 -0
  46. package/dist/resolve-sourcemap.test.d.ts.map +1 -0
  47. package/dist/resolve-sourcemap.test.js +194 -0
  48. package/dist/serde-checker.js +1 -1
  49. package/dist/standalone.d.ts +0 -3
  50. package/dist/standalone.d.ts.map +1 -1
  51. package/dist/standalone.js +11 -40
  52. package/dist/step-source-registration.test.d.ts +2 -0
  53. package/dist/step-source-registration.test.d.ts.map +1 -0
  54. package/dist/step-source-registration.test.js +85 -0
  55. package/dist/swc-esbuild-plugin.d.ts +11 -1
  56. package/dist/swc-esbuild-plugin.d.ts.map +1 -1
  57. package/dist/swc-esbuild-plugin.js +110 -13
  58. package/dist/swc-esbuild-plugin.test.js +370 -6
  59. package/dist/transform-utils.d.ts.map +1 -1
  60. package/dist/transform-utils.js +45 -6
  61. package/dist/transform-utils.test.js +78 -6
  62. package/dist/types.d.ts +39 -2
  63. package/dist/types.d.ts.map +1 -1
  64. package/dist/types.js +1 -1
  65. package/dist/vercel-build-output-api.d.ts +0 -2
  66. package/dist/vercel-build-output-api.d.ts.map +1 -1
  67. package/dist/vercel-build-output-api.js +28 -56
  68. package/dist/workflow-alias.js +1 -1
  69. package/dist/workflow-alias.test.js +1 -1
  70. package/dist/workflows-extractor.js +7 -2
  71. package/dist/workflows-extractor.test.d.ts +2 -0
  72. package/dist/workflows-extractor.test.d.ts.map +1 -0
  73. package/dist/workflows-extractor.test.js +40 -0
  74. package/package.json +7 -7
  75. package/dist/apply-swc-transform.js.map +0 -1
  76. package/dist/base-builder.js.map +0 -1
  77. package/dist/build-queue.js.map +0 -1
  78. package/dist/config-helpers.js.map +0 -1
  79. package/dist/constants.js.map +0 -1
  80. package/dist/discover-entries-esbuild-plugin.js.map +0 -1
  81. package/dist/discover-entries-esbuild-plugin.test.js.map +0 -1
  82. package/dist/esbuild-tsconfig.js.map +0 -1
  83. package/dist/esbuild-tsconfig.test.js.map +0 -1
  84. package/dist/get-input-files.test.js.map +0 -1
  85. package/dist/index.js.map +0 -1
  86. package/dist/module-specifier.js.map +0 -1
  87. package/dist/module-specifier.test.js.map +0 -1
  88. package/dist/node-module-esbuild-plugin.js.map +0 -1
  89. package/dist/node-module-esbuild-plugin.test.js.map +0 -1
  90. package/dist/pseudo-package-esbuild-plugin.js.map +0 -1
  91. package/dist/pseudo-package-esbuild-plugin.test.js.map +0 -1
  92. package/dist/request-converter.js.map +0 -1
  93. package/dist/serde-checker.js.map +0 -1
  94. package/dist/standalone.js.map +0 -1
  95. package/dist/swc-esbuild-plugin.js.map +0 -1
  96. package/dist/swc-esbuild-plugin.test.js.map +0 -1
  97. package/dist/transform-utils.js.map +0 -1
  98. package/dist/transform-utils.test.js.map +0 -1
  99. package/dist/types.js.map +0 -1
  100. package/dist/vercel-build-output-api.js.map +0 -1
  101. package/dist/workflow-alias.js.map +0 -1
  102. package/dist/workflow-alias.test.js.map +0 -1
  103. package/dist/workflows-extractor.js.map +0 -1
@@ -67,24 +67,60 @@ function findPackageJson(filePath) {
67
67
  * @param pkg - Package info from findPackageJson
68
68
  * @returns The subpath (e.g., "/internal/builtins") or empty string for root export
69
69
  */
70
- function resolveExportSubpath(filePath, pkg) {
70
+ function toPackageRelativePath(filePath, pkg) {
71
+ const normalizedFilePath = filePath.replace(/\\/g, '/');
72
+ const normalizedPkgDir = pkg.dir.replace(/\\/g, '/');
73
+ if (!normalizedFilePath.startsWith(normalizedPkgDir + '/')) {
74
+ return null;
75
+ }
76
+ return normalizedFilePath.substring(normalizedPkgDir.length + 1);
77
+ }
78
+ function getSourceFallbackExportTargets(relativePath) {
79
+ const fallbackTargets = new Set();
80
+ const extensionFallbacks = {
81
+ '.ts': ['.js'],
82
+ '.tsx': ['.js'],
83
+ '.mts': ['.mjs'],
84
+ '.cts': ['.cjs'],
85
+ '.jsx': ['.js'],
86
+ };
87
+ const extensionMatch = relativePath.match(/(\.[^./\\]+)$/);
88
+ const extension = extensionMatch?.[1]?.toLowerCase();
89
+ if (!extension) {
90
+ return [];
91
+ }
92
+ const pathWithoutExtension = relativePath.slice(0, -extension.length);
93
+ const extensionTargets = extensionFallbacks[extension] ?? [];
94
+ for (const fallbackExtension of extensionTargets) {
95
+ fallbackTargets.add(`${pathWithoutExtension}${fallbackExtension}`);
96
+ }
97
+ if (relativePath.startsWith('src/')) {
98
+ const distPathWithoutPrefix = relativePath.slice('src/'.length);
99
+ for (const fallbackExtension of extensionTargets) {
100
+ fallbackTargets.add(`dist/${distPathWithoutPrefix.slice(0, -extension.length)}${fallbackExtension}`);
101
+ }
102
+ }
103
+ return Array.from(fallbackTargets);
104
+ }
105
+ function resolveExportSubpath(filePath, pkg, options) {
71
106
  if (!pkg.exports || typeof pkg.exports !== 'object') {
72
107
  return '';
73
108
  }
74
- // Get the relative path from package root to the file
75
- const normalizedFilePath = filePath.replace(/\\/g, '/');
76
- const normalizedPkgDir = pkg.dir.replace(/\\/g, '/');
77
- const relativePath = normalizedFilePath.startsWith(normalizedPkgDir + '/')
78
- ? './' + normalizedFilePath.substring(normalizedPkgDir.length + 1)
79
- : null;
109
+ const relativePath = toPackageRelativePath(filePath, pkg);
80
110
  if (!relativePath) {
81
111
  return '';
82
112
  }
113
+ const comparableTargets = new Set([`./${relativePath}`]);
114
+ if (options?.allowSourceFallback) {
115
+ for (const fallbackTarget of getSourceFallbackExportTargets(relativePath)) {
116
+ comparableTargets.add(`./${fallbackTarget}`);
117
+ }
118
+ }
83
119
  // Search through exports to find a matching subpath
84
120
  for (const [subpath, target] of Object.entries(pkg.exports)) {
85
121
  const resolvedTarget = resolveExportTarget(target);
86
122
  if (resolvedTarget &&
87
- normalizeExportPath(resolvedTarget) === relativePath) {
123
+ comparableTargets.has(normalizeExportPath(resolvedTarget))) {
88
124
  // Found a match - return the subpath without the leading "."
89
125
  // e.g., "./internal/builtins" -> "/internal/builtins"
90
126
  return subpath === '.' ? '' : subpath.substring(1);
@@ -231,11 +267,16 @@ function isWorkspacePackage(filePath, projectRoot) {
231
267
  * // => { moduleSpecifier: 'workflow/internal/builtins@4.0.0' }
232
268
  *
233
269
  * @example
234
- * // File in workspace package
235
- * resolveModuleSpecifier('/project/packages/shared/src/utils.ts', '/project')
270
+ * // Exported root file in workspace package
271
+ * resolveModuleSpecifier('/project/packages/shared/src/index.ts', '/project')
236
272
  * // => { moduleSpecifier: '@myorg/shared@0.0.0' }
237
273
  *
238
274
  * @example
275
+ * // Non-exported / deep package file
276
+ * resolveModuleSpecifier('/project/packages/shared/src/internal/foo.ts', '/project')
277
+ * // => { moduleSpecifier: undefined }
278
+ *
279
+ * @example
239
280
  * // Local app file
240
281
  * resolveModuleSpecifier('/project/src/workflows/order.ts', '/project')
241
282
  * // => { moduleSpecifier: undefined }
@@ -255,15 +296,49 @@ export function resolveModuleSpecifier(filePath, projectRoot) {
255
296
  return { moduleSpecifier: undefined };
256
297
  }
257
298
  // Resolve the export subpath (e.g., "/internal/builtins" for "workflow/internal/builtins")
258
- const subpath = resolveExportSubpath(filePath, pkg);
259
- // Return the module specifier as "name/subpath@version" or "name@version"
260
- const specifier = subpath
261
- ? `${pkg.name}${subpath}@${pkg.version}`
262
- : `${pkg.name}@${pkg.version}`;
299
+ const subpath = resolveExportSubpath(filePath, pkg, {
300
+ allowSourceFallback: true,
301
+ });
302
+ if (subpath) {
303
+ return {
304
+ moduleSpecifier: `${pkg.name}${subpath}@${pkg.version}`,
305
+ };
306
+ }
307
+ if (isRootEntrypointFile(filePath, pkg)) {
308
+ return {
309
+ moduleSpecifier: `${pkg.name}@${pkg.version}`,
310
+ };
311
+ }
312
+ // Non-exported package file (deep import that isn't reachable as a
313
+ // package specifier). Returning undefined makes the SWC plugin fall back
314
+ // to the relative file path, which keeps IDs unique per file. Previously
315
+ // every non-exported file collapsed to "name@version", causing same-named
316
+ // step/workflow functions in different files to silently overwrite each
317
+ // other at runtime registration; the build-time duplicate-ID check now
318
+ // also catches that class of collision.
263
319
  return {
264
- moduleSpecifier: specifier,
320
+ moduleSpecifier: undefined,
265
321
  };
266
322
  }
323
+ /**
324
+ * Strip the trailing "@<version>" suffix from a module specifier produced by
325
+ * `resolveModuleSpecifier`, leaving the bare `name` or `name/subpath` form.
326
+ *
327
+ * Use this when you want to compare or dedupe specifiers across versions
328
+ * (e.g. treating `@workflow/ai/agent@5.0.0-beta.4` and
329
+ * `@workflow/ai/agent@5.0.0-beta.5` as the same logical module).
330
+ *
331
+ * Colocated with `resolveModuleSpecifier` so the construction and parsing
332
+ * stay in sync — see the `${pkg.name}${subpath}@${pkg.version}` and
333
+ * `${pkg.name}@${pkg.version}` paths above.
334
+ */
335
+ export function stripPackageVersion(specifier) {
336
+ // The version is always the final segment after the last "@". Constrain
337
+ // matching to characters that can't appear in a package name or subpath
338
+ // (no "/", no nested "@") so scoped packages like `@workflow/ai@1.0.0`
339
+ // keep their leading "@workflow/ai".
340
+ return specifier.replace(/@[^/@]+$/, '');
341
+ }
267
342
  /**
268
343
  * Clear the package.json cache. Useful for testing or when package.json files may have changed.
269
344
  */
@@ -445,4 +520,4 @@ export function getImportPath(filePath, projectRoot) {
445
520
  isPackage: false,
446
521
  };
447
522
  }
448
- //# sourceMappingURL=module-specifier.js.map
523
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kdWxlLXNwZWNpZmllci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9tb2R1bGUtc3BlY2lmaWVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ25ELE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBMkJsRTs7O0dBR0c7QUFDSCxNQUFNLGdCQUFnQixHQUFHLElBQUksR0FBRyxFQUE4QixDQUFDO0FBRS9EOzs7R0FHRztBQUNILFNBQVMsZUFBZSxDQUFDLFFBQWdCO0lBQ3ZDLElBQUksR0FBRyxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUU1QixnRUFBZ0U7SUFDaEUsTUFBTSxXQUFXLEdBQWEsRUFBRSxDQUFDO0lBRWpDLG1EQUFtRDtJQUNuRCxPQUFPLEdBQUcsS0FBSyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUM1QixvQkFBb0I7UUFDcEIsTUFBTSxNQUFNLEdBQUcsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3pDLElBQUksTUFBTSxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3pCLG1FQUFtRTtZQUNuRSxLQUFLLE1BQU0sVUFBVSxJQUFJLFdBQVcsRUFBRSxDQUFDO2dCQUNyQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQzNDLENBQUM7WUFDRCxPQUFPLE1BQU0sQ0FBQztRQUNoQixDQUFDO1FBRUQsV0FBVyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUV0QixNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLGNBQWMsQ0FBQyxDQUFDO1FBQ2xELElBQUksVUFBVSxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUM7WUFDaEMsSUFBSSxDQUFDO2dCQUNILE1BQU0sT0FBTyxHQUFHLFlBQVksQ0FBQyxlQUFlLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBQ3ZELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQ25DLElBQUksTUFBTSxDQUFDLElBQUksSUFBSSxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7b0JBQ2xDLE1BQU0sTUFBTSxHQUFnQjt3QkFDMUIsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJO3dCQUNqQixPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU87d0JBQ3ZCLEdBQUc7d0JBQ0gsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPO3dCQUN2QixJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUk7d0JBQ2pCLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTTtxQkFDdEIsQ0FBQztvQkFDRixrRUFBa0U7b0JBQ2xFLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUM7b0JBQ2xDLEtBQUssTUFBTSxVQUFVLElBQUksV0FBVyxFQUFFLENBQUM7d0JBQ3JDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLENBQUM7b0JBQzNDLENBQUM7b0JBQ0QsT0FBTyxNQUFNLENBQUM7Z0JBQ2hCLENBQUM7WUFDSCxDQUFDO1lBQUMsTUFBTSxDQUFDO2dCQUNQLHFEQUFxRDtZQUN2RCxDQUFDO1FBQ0gsQ0FBQztRQUVELEdBQUcsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDckIsQ0FBQztJQUVELGlFQUFpRTtJQUNqRSxLQUFLLE1BQU0sVUFBVSxJQUFJLFdBQVcsRUFBRSxDQUFDO1FBQ3JDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxTQUFTLHFCQUFxQixDQUM1QixRQUFnQixFQUNoQixHQUFnQjtJQUVoQixNQUFNLGtCQUFrQixHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ3hELE1BQU0sZ0JBQWdCLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ3JELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUMzRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxPQUFPLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDbkUsQ0FBQztBQUVELFNBQVMsOEJBQThCLENBQUMsWUFBb0I7SUFDMUQsTUFBTSxlQUFlLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztJQUMxQyxNQUFNLGtCQUFrQixHQUE2QjtRQUNuRCxLQUFLLEVBQUUsQ0FBQyxLQUFLLENBQUM7UUFDZCxNQUFNLEVBQUUsQ0FBQyxLQUFLLENBQUM7UUFDZixNQUFNLEVBQUUsQ0FBQyxNQUFNLENBQUM7UUFDaEIsTUFBTSxFQUFFLENBQUMsTUFBTSxDQUFDO1FBQ2hCLE1BQU0sRUFBRSxDQUFDLEtBQUssQ0FBQztLQUNoQixDQUFDO0lBRUYsTUFBTSxjQUFjLEdBQUcsWUFBWSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUMzRCxNQUFNLFNBQVMsR0FBRyxjQUFjLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxXQUFXLEVBQUUsQ0FBQztJQUNyRCxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDZixPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFFRCxNQUFNLG9CQUFvQixHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3RFLE1BQU0sZ0JBQWdCLEdBQUcsa0JBQWtCLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQzdELEtBQUssTUFBTSxpQkFBaUIsSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO1FBQ2pELGVBQWUsQ0FBQyxHQUFHLENBQUMsR0FBRyxvQkFBb0IsR0FBRyxpQkFBaUIsRUFBRSxDQUFDLENBQUM7SUFDckUsQ0FBQztJQUVELElBQUksWUFBWSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQ3BDLE1BQU0scUJBQXFCLEdBQUcsWUFBWSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDaEUsS0FBSyxNQUFNLGlCQUFpQixJQUFJLGdCQUFnQixFQUFFLENBQUM7WUFDakQsZUFBZSxDQUFDLEdBQUcsQ0FDakIsUUFBUSxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxHQUFHLGlCQUFpQixFQUFFLENBQ2hGLENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztBQUNyQyxDQUFDO0FBRUQsU0FBUyxvQkFBb0IsQ0FDM0IsUUFBZ0IsRUFDaEIsR0FBZ0IsRUFDaEIsT0FBMkM7SUFFM0MsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLElBQUksT0FBTyxHQUFHLENBQUMsT0FBTyxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQ3BELE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUVELE1BQU0sWUFBWSxHQUFHLHFCQUFxQixDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUMxRCxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDbEIsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBRUQsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEtBQUssWUFBWSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3pELElBQUksT0FBTyxFQUFFLG1CQUFtQixFQUFFLENBQUM7UUFDakMsS0FBSyxNQUFNLGNBQWMsSUFBSSw4QkFBOEIsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDO1lBQzFFLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxLQUFLLGNBQWMsRUFBRSxDQUFDLENBQUM7UUFDL0MsQ0FBQztJQUNILENBQUM7SUFFRCxvREFBb0Q7SUFDcEQsS0FBSyxNQUFNLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFDNUQsTUFBTSxjQUFjLEdBQUcsbUJBQW1CLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDbkQsSUFDRSxjQUFjO1lBQ2QsaUJBQWlCLENBQUMsR0FBRyxDQUFDLG1CQUFtQixDQUFDLGNBQWMsQ0FBQyxDQUFDLEVBQzFELENBQUM7WUFDRCw2REFBNkQ7WUFDN0Qsc0RBQXNEO1lBQ3RELE9BQU8sT0FBTyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3JELENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTyxFQUFFLENBQUM7QUFDWixDQUFDO0FBRUQ7O0dBRUc7QUFDSCxTQUFTLG1CQUFtQixDQUFDLE1BQWU7SUFDMUMsSUFBSSxPQUFPLE1BQU0sS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUMvQixPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRUQseUNBQXlDO0lBQ3pDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQzFCLEtBQUssTUFBTSxJQUFJLElBQUksTUFBTSxFQUFFLENBQUM7WUFDMUIsTUFBTSxRQUFRLEdBQUcsbUJBQW1CLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDM0MsSUFBSSxRQUFRO2dCQUFFLE9BQU8sUUFBUSxDQUFDO1FBQ2hDLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxJQUFJLE1BQU0sSUFBSSxPQUFPLE1BQU0sS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUN6QyxvRUFBb0U7UUFDcEUsTUFBTSxVQUFVLEdBQUcsQ0FBQyxVQUFVLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDeEUsS0FBSyxNQUFNLFNBQVMsSUFBSSxVQUFVLEVBQUUsQ0FBQztZQUNuQyxNQUFNLEtBQUssR0FBSSxNQUFrQyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQzdELElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7Z0JBQzlCLE9BQU8sS0FBSyxDQUFDO1lBQ2YsQ0FBQztZQUNELHVDQUF1QztZQUN2QyxJQUFJLEtBQUssSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztnQkFDdkMsTUFBTSxNQUFNLEdBQUcsbUJBQW1CLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQzFDLElBQUksTUFBTTtvQkFBRSxPQUFPLE1BQU0sQ0FBQztZQUM1QixDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUM7QUFFRDs7R0FFRztBQUNILFNBQVMsbUJBQW1CLENBQUMsSUFBWTtJQUN2QywyQkFBMkI7SUFDM0IsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUMzQixPQUFPLElBQUksR0FBRyxJQUFJLENBQUM7SUFDckIsQ0FBQztJQUNELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQUVEOztHQUVHO0FBQ0gsU0FBUyxlQUFlLENBQUMsUUFBZ0I7SUFDdkMsTUFBTSxjQUFjLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDckQsT0FBTyxjQUFjLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLENBQUM7QUFDbkQsQ0FBQztBQUVEOzs7R0FHRztBQUNILE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxHQUFHLEVBQXVCLENBQUM7QUFFeEQ7O0dBRUc7QUFDSCxTQUFTLHNCQUFzQixDQUFDLFdBQW1CO0lBQ2pELE1BQU0sTUFBTSxHQUFHLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNqRCxJQUFJLE1BQU0sRUFBRSxDQUFDO1FBQ1gsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVELE1BQU0sSUFBSSxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7SUFDL0IsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxjQUFjLENBQUMsQ0FBQztJQUVsRCxJQUFJLFVBQVUsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQztZQUNILE1BQU0sT0FBTyxHQUFHLFlBQVksQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDL0MsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUVuQywrQkFBK0I7WUFDL0IsS0FBSyxNQUFNLE9BQU8sSUFBSTtnQkFDcEIsY0FBYztnQkFDZCxpQkFBaUI7Z0JBQ2pCLGtCQUFrQjtnQkFDbEIsc0JBQXNCO2FBQ3ZCLEVBQUUsQ0FBQztnQkFDRixNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQy9CLElBQUksTUFBTSxJQUFJLE9BQU8sTUFBTSxLQUFLLFFBQVEsRUFBRSxDQUFDO29CQUN6QyxLQUFLLE1BQU0sSUFBSSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQzt3QkFDdkMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDakIsQ0FBQztnQkFDSCxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7UUFBQyxNQUFNLENBQUM7WUFDUCxvQ0FBb0M7UUFDdEMsQ0FBQztJQUNILENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3hDLE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBUyxrQkFBa0IsQ0FBQyxRQUFnQixFQUFFLFdBQW1CO0lBQy9ELElBQUksZUFBZSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7UUFDOUIsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQsTUFBTSxHQUFHLEdBQUcsZUFBZSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3RDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNULE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELHlEQUF5RDtJQUN6RCxpRUFBaUU7SUFDakUsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3hDLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7SUFFaEMsNkVBQTZFO0lBQzdFLElBQUksTUFBTSxLQUFLLFVBQVUsRUFBRSxDQUFDO1FBQzFCLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELDRDQUE0QztJQUM1QyxxRUFBcUU7SUFDckUsbUVBQW1FO0lBQ25FLHlEQUF5RDtJQUN6RCxNQUFNLFdBQVcsR0FBRyxzQkFBc0IsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUN4RCxPQUFPLFdBQVcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ25DLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQStCRztBQUNILE1BQU0sVUFBVSxzQkFBc0IsQ0FDcEMsUUFBZ0IsRUFDaEIsV0FBbUI7SUFFbkIsMERBQTBEO0lBQzFELE1BQU0sYUFBYSxHQUFHLGVBQWUsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNoRCxNQUFNLFdBQVcsR0FDZixDQUFDLGFBQWEsSUFBSSxrQkFBa0IsQ0FBQyxRQUFRLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFFOUQsSUFBSSxDQUFDLGFBQWEsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ25DLG9EQUFvRDtRQUNwRCxPQUFPLEVBQUUsZUFBZSxFQUFFLFNBQVMsRUFBRSxDQUFDO0lBQ3hDLENBQUM7SUFFRCxzQ0FBc0M7SUFDdEMsTUFBTSxHQUFHLEdBQUcsZUFBZSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3RDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNULG9EQUFvRDtRQUNwRCxPQUFPLEVBQUUsZUFBZSxFQUFFLFNBQVMsRUFBRSxDQUFDO0lBQ3hDLENBQUM7SUFFRCwyRkFBMkY7SUFDM0YsTUFBTSxPQUFPLEdBQUcsb0JBQW9CLENBQUMsUUFBUSxFQUFFLEdBQUcsRUFBRTtRQUNsRCxtQkFBbUIsRUFBRSxJQUFJO0tBQzFCLENBQUMsQ0FBQztJQUVILElBQUksT0FBTyxFQUFFLENBQUM7UUFDWixPQUFPO1lBQ0wsZUFBZSxFQUFFLEdBQUcsR0FBRyxDQUFDLElBQUksR0FBRyxPQUFPLElBQUksR0FBRyxDQUFDLE9BQU8sRUFBRTtTQUN4RCxDQUFDO0lBQ0osQ0FBQztJQUVELElBQUksb0JBQW9CLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDeEMsT0FBTztZQUNMLGVBQWUsRUFBRSxHQUFHLEdBQUcsQ0FBQyxJQUFJLElBQUksR0FBRyxDQUFDLE9BQU8sRUFBRTtTQUM5QyxDQUFDO0lBQ0osQ0FBQztJQUVELG1FQUFtRTtJQUNuRSx5RUFBeUU7SUFDekUseUVBQXlFO0lBQ3pFLDBFQUEwRTtJQUMxRSx3RUFBd0U7SUFDeEUsdUVBQXVFO0lBQ3ZFLHdDQUF3QztJQUN4QyxPQUFPO1FBQ0wsZUFBZSxFQUFFLFNBQVM7S0FDM0IsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7R0FXRztBQUNILE1BQU0sVUFBVSxtQkFBbUIsQ0FBQyxTQUFpQjtJQUNuRCx3RUFBd0U7SUFDeEUsd0VBQXdFO0lBQ3hFLHVFQUF1RTtJQUN2RSxxQ0FBcUM7SUFDckMsT0FBTyxTQUFTLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUMzQyxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLFVBQVUseUJBQXlCO0lBQ3ZDLGdCQUFnQixDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ3pCLGdCQUFnQixDQUFDLEtBQUssRUFBRSxDQUFDO0FBQzNCLENBQUM7QUFFRDs7R0FFRztBQUNILFNBQVMsb0JBQW9CLENBQUMsUUFBZ0IsRUFBRSxXQUFtQjtJQUNqRSxNQUFNLHFCQUFxQixHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQzlELE1BQU0sa0JBQWtCLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFFeEQsSUFBSSxZQUFvQixDQUFDO0lBQ3pCLElBQUksa0JBQWtCLENBQUMsVUFBVSxDQUFDLHFCQUFxQixHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDL0QsWUFBWSxHQUFHLGtCQUFrQixDQUFDLFNBQVMsQ0FDekMscUJBQXFCLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FDakMsQ0FBQztJQUNKLENBQUM7U0FBTSxDQUFDO1FBQ04saUZBQWlGO1FBQ2pGLFlBQVksR0FBRyxRQUFRLENBQUMsV0FBVyxFQUFFLFFBQVEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDckUsQ0FBQztJQUVELHNDQUFzQztJQUN0QyxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ2xDLFlBQVksR0FBRyxLQUFLLFlBQVksRUFBRSxDQUFDO0lBQ3JDLENBQUM7SUFFRCxPQUFPLFlBQVksQ0FBQztBQUN0QixDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBUyxhQUFhLENBQUMsWUFBcUI7SUFDMUMsSUFBSSxPQUFPLFlBQVksS0FBSyxRQUFRLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDO1FBQ3BFLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELElBQUksQ0FBQyxZQUFZLElBQUksT0FBTyxZQUFZLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDdEQsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUF1QyxDQUFDLENBQUM7SUFDbEUsMEVBQTBFO0lBQzFFLDhCQUE4QjtJQUM5QixJQUFJLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDakUsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsT0FBTyxHQUFHLElBQUssWUFBd0MsQ0FBQztBQUMxRCxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBUywwQkFBMEIsQ0FBQyxJQUFZO0lBQzlDLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQzVDLElBQUksVUFBVSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ2hDLE9BQU8sVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBQ0QsSUFBSSxVQUFVLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDL0IsT0FBTyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFDRCxPQUFPLFVBQVUsQ0FBQztBQUNwQixDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBUyxvQkFBb0IsQ0FBQyxRQUFnQixFQUFFLEdBQWdCO0lBQzlELE1BQU0sa0JBQWtCLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDeEQsTUFBTSxnQkFBZ0IsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFFckQsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQzNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELE1BQU0sZ0JBQWdCLEdBQUcsa0JBQWtCLENBQUMsU0FBUyxDQUNuRCxnQkFBZ0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUM1QixDQUFDO0lBRUYsSUFBSSxHQUFHLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDaEIsSUFBSSxVQUFtQixDQUFDO1FBRXhCLElBQ0UsT0FBTyxHQUFHLENBQUMsT0FBTyxLQUFLLFFBQVE7WUFDL0IsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUM7WUFDM0IsR0FBRyxJQUFJLEdBQUcsQ0FBQyxPQUFPLEVBQ2xCLENBQUM7WUFDRCxVQUFVLEdBQUksR0FBRyxDQUFDLE9BQW1DLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDN0QsQ0FBQzthQUFNLElBQUksYUFBYSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ3RDLFVBQVUsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDO1FBQzNCLENBQUM7YUFBTSxDQUFDO1lBQ04sT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBRUQsTUFBTSxjQUFjLEdBQUcsbUJBQW1CLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDdkQsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3BCLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUVELE1BQU0sZ0JBQWdCLEdBQUcsMEJBQTBCLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDcEUsT0FBTyxnQkFBZ0IsS0FBSyxnQkFBZ0IsQ0FBQztJQUMvQyxDQUFDO0lBRUQsTUFBTSxjQUFjLEdBQUc7UUFDckIsR0FBRyxDQUFDLE1BQU07UUFDVixHQUFHLENBQUMsSUFBSTtRQUNSLFVBQVU7UUFDVixXQUFXO1FBQ1gsV0FBVztRQUNYLFVBQVU7UUFDVixXQUFXO1FBQ1gsV0FBVztLQUNaO1NBQ0UsTUFBTSxDQUFDLENBQUMsU0FBUyxFQUF1QixFQUFFLENBQUMsT0FBTyxTQUFTLEtBQUssUUFBUSxDQUFDO1NBQ3pFLEdBQUcsQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsMEJBQTBCLENBQUMsU0FBUyxDQUFDLENBQUM7U0FDekQsTUFBTSxDQUFDLENBQUMsU0FBUyxFQUF1QixFQUFFLENBQUMsU0FBUyxLQUFLLElBQUksQ0FBQyxDQUFDO0lBRWxFLE9BQU8sY0FBYyxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0FBQ25ELENBQUM7QUFxQkQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXFCRztBQUNILE1BQU0sVUFBVSxhQUFhLENBQzNCLFFBQWdCLEVBQ2hCLFdBQW1CO0lBRW5CLDBEQUEwRDtJQUMxRCxNQUFNLGFBQWEsR0FBRyxlQUFlLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDaEQsTUFBTSxXQUFXLEdBQ2YsQ0FBQyxhQUFhLElBQUksa0JBQWtCLENBQUMsUUFBUSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBRTlELElBQUksYUFBYSxJQUFJLFdBQVcsRUFBRSxDQUFDO1FBQ2pDLHNDQUFzQztRQUN0QyxNQUFNLEdBQUcsR0FBRyxlQUFlLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDdEMsSUFBSSxHQUFHLEVBQUUsQ0FBQztZQUNSLE1BQU0seUJBQXlCLEdBQUcsc0JBQXNCLENBQUMsV0FBVyxDQUFDLENBQUMsR0FBRyxDQUN2RSxHQUFHLENBQUMsSUFBSSxDQUNULENBQUM7WUFDRixNQUFNLHNCQUFzQixHQUFHLFdBQVcsSUFBSSx5QkFBeUIsQ0FBQztZQUV4RSx5RUFBeUU7WUFDekUsd0VBQXdFO1lBQ3hFLG1DQUFtQztZQUNuQyxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztnQkFDNUIsT0FBTztvQkFDTCxVQUFVLEVBQUUsb0JBQW9CLENBQUMsUUFBUSxFQUFFLFdBQVcsQ0FBQztvQkFDdkQsU0FBUyxFQUFFLEtBQUs7aUJBQ2pCLENBQUM7WUFDSixDQUFDO1lBRUQsb0VBQW9FO1lBQ3BFLHVFQUF1RTtZQUN2RSw2QkFBNkI7WUFDN0Isc0VBQXNFO1lBQ3RFLGlFQUFpRTtZQUNqRSwwQkFBMEI7WUFDMUIsTUFBTSxPQUFPLEdBQUcsb0JBQW9CLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ3BELElBQUksT0FBTyxFQUFFLENBQUM7Z0JBQ1osT0FBTztvQkFDTCxVQUFVLEVBQUUsR0FBRyxHQUFHLENBQUMsSUFBSSxHQUFHLE9BQU8sRUFBRTtvQkFDbkMsU0FBUyxFQUFFLElBQUk7aUJBQ2hCLENBQUM7WUFDSixDQUFDO1lBRUQsa0VBQWtFO1lBQ2xFLHNFQUFzRTtZQUN0RSxnRUFBZ0U7WUFDaEUsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUN6QyxPQUFPO29CQUNMLFVBQVUsRUFBRSxvQkFBb0IsQ0FBQyxRQUFRLEVBQUUsV0FBVyxDQUFDO29CQUN2RCxTQUFTLEVBQUUsS0FBSztpQkFDakIsQ0FBQztZQUNKLENBQUM7WUFFRCxPQUFPO2dCQUNMLFVBQVUsRUFBRSxHQUFHLENBQUMsSUFBSTtnQkFDcEIsU0FBUyxFQUFFLElBQUk7YUFDaEIsQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDO0lBRUQscUNBQXFDO0lBQ3JDLE9BQU87UUFDTCxVQUFVLEVBQUUsb0JBQW9CLENBQUMsUUFBUSxFQUFFLFdBQVcsQ0FBQztRQUN2RCxTQUFTLEVBQUUsS0FBSztLQUNqQixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGV4aXN0c1N5bmMsIHJlYWRGaWxlU3luYyB9IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHsgZGlybmFtZSwgam9pbiwgcmVsYXRpdmUsIHJlc29sdmUsIHNlcCB9IGZyb20gJ25vZGU6cGF0aCc7XG5cbi8qKlxuICogUmVzdWx0IG9mIHJlc29sdmluZyBhIG1vZHVsZSBzcGVjaWZpZXIgZm9yIGEgZmlsZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNb2R1bGVTcGVjaWZpZXJSZXN1bHQge1xuICAvKipcbiAgICogVGhlIG1vZHVsZSBzcGVjaWZpZXIgdG8gdXNlIGZvciBJRCBnZW5lcmF0aW9uLlxuICAgKiAtIEZvciBwYWNrYWdlczogXCJ7bmFtZX1Ae3ZlcnNpb259XCIgb3IgXCJ7bmFtZX0ve3N1YnBhdGh9QHt2ZXJzaW9ufVwiXG4gICAqICAgKGUuZy4sIFwicG9pbnRAMS4wLjBcIiwgXCJAbXlvcmcvc2hhcmVkQDIuMC4wXCIsIFwid29ya2Zsb3cvaW50ZXJuYWwvYnVpbHRpbnNANC4wLjBcIilcbiAgICogLSBGb3IgbG9jYWwgZmlsZXM6IHVuZGVmaW5lZCAocGx1Z2luIHdpbGwgdXNlIGRlZmF1bHQgXCIuL3JlbGF0aXZlL3BhdGhcIiBmb3JtYXQpXG4gICAqL1xuICBtb2R1bGVTcGVjaWZpZXI6IHN0cmluZyB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBQYXJzZWQgcGFja2FnZS5qc29uIGRhdGEgd2l0aCBkaXJlY3RvcnkgaW5mb3JtYXRpb24uXG4gKi9cbmludGVyZmFjZSBQYWNrYWdlSW5mbyB7XG4gIG5hbWU6IHN0cmluZztcbiAgdmVyc2lvbjogc3RyaW5nO1xuICBkaXI6IHN0cmluZztcbiAgZXhwb3J0cz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBtYWluPzogc3RyaW5nO1xuICBtb2R1bGU/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ2FjaGUgZm9yIHBhY2thZ2UuanNvbiBsb29rdXBzIHRvIGF2b2lkIHJlcGVhdGVkIGZpbGVzeXN0ZW0gcmVhZHMuXG4gKiBNYXBzIGRpcmVjdG9yeSBwYXRoIHRvIHBhcnNlZCBwYWNrYWdlLmpzb24gaW5mbyBvciBudWxsIGlmIG5vdCBmb3VuZC5cbiAqL1xuY29uc3QgcGFja2FnZUpzb25DYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBQYWNrYWdlSW5mbyB8IG51bGw+KCk7XG5cbi8qKlxuICogRmluZCBhbmQgcmVhZCB0aGUgbmVhcmVzdCBwYWNrYWdlLmpzb24gZm9yIGEgZ2l2ZW4gZmlsZSBwYXRoLlxuICogUmVzdWx0cyBhcmUgY2FjaGVkIGZvciBwZXJmb3JtYW5jZS5cbiAqL1xuZnVuY3Rpb24gZmluZFBhY2thZ2VKc29uKGZpbGVQYXRoOiBzdHJpbmcpOiBQYWNrYWdlSW5mbyB8IG51bGwge1xuICBsZXQgZGlyID0gZGlybmFtZShmaWxlUGF0aCk7XG5cbiAgLy8gVHJhY2sgZGlyZWN0b3JpZXMgd2UndmUgdmlzaXRlZCBzbyB3ZSBjYW4gYmFjay1maWxsIHRoZSBjYWNoZVxuICBjb25zdCB2aXNpdGVkRGlyczogc3RyaW5nW10gPSBbXTtcblxuICAvLyBXYWxrIHVwIHRoZSBkaXJlY3RvcnkgdHJlZSB1bnRpbCB3ZSBoaXQgdGhlIHJvb3RcbiAgd2hpbGUgKGRpciAhPT0gZGlybmFtZShkaXIpKSB7XG4gICAgLy8gQ2hlY2sgY2FjaGUgZmlyc3RcbiAgICBjb25zdCBjYWNoZWQgPSBwYWNrYWdlSnNvbkNhY2hlLmdldChkaXIpO1xuICAgIGlmIChjYWNoZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gQmFjay1maWxsIGNhY2hlIGZvciBhbGwgdmlzaXRlZCBkaXJlY3RvcmllcyB3aXRoIHRoZSBzYW1lIHJlc3VsdFxuICAgICAgZm9yIChjb25zdCB2aXNpdGVkRGlyIG9mIHZpc2l0ZWREaXJzKSB7XG4gICAgICAgIHBhY2thZ2VKc29uQ2FjaGUuc2V0KHZpc2l0ZWREaXIsIGNhY2hlZCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gY2FjaGVkO1xuICAgIH1cblxuICAgIHZpc2l0ZWREaXJzLnB1c2goZGlyKTtcblxuICAgIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IGpvaW4oZGlyLCAncGFja2FnZS5qc29uJyk7XG4gICAgaWYgKGV4aXN0c1N5bmMocGFja2FnZUpzb25QYXRoKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgY29udGVudCA9IHJlYWRGaWxlU3luYyhwYWNrYWdlSnNvblBhdGgsICd1dGYtOCcpO1xuICAgICAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKGNvbnRlbnQpO1xuICAgICAgICBpZiAocGFyc2VkLm5hbWUgJiYgcGFyc2VkLnZlcnNpb24pIHtcbiAgICAgICAgICBjb25zdCByZXN1bHQ6IFBhY2thZ2VJbmZvID0ge1xuICAgICAgICAgICAgbmFtZTogcGFyc2VkLm5hbWUsXG4gICAgICAgICAgICB2ZXJzaW9uOiBwYXJzZWQudmVyc2lvbixcbiAgICAgICAgICAgIGRpcixcbiAgICAgICAgICAgIGV4cG9ydHM6IHBhcnNlZC5leHBvcnRzLFxuICAgICAgICAgICAgbWFpbjogcGFyc2VkLm1haW4sXG4gICAgICAgICAgICBtb2R1bGU6IHBhcnNlZC5tb2R1bGUsXG4gICAgICAgICAgfTtcbiAgICAgICAgICAvLyBDYWNoZSB0aGUgcmVzdWx0IGZvciB0aGlzIGRpcmVjdG9yeSBhbmQgYWxsIHZpc2l0ZWQgZGlyZWN0b3JpZXNcbiAgICAgICAgICBwYWNrYWdlSnNvbkNhY2hlLnNldChkaXIsIHJlc3VsdCk7XG4gICAgICAgICAgZm9yIChjb25zdCB2aXNpdGVkRGlyIG9mIHZpc2l0ZWREaXJzKSB7XG4gICAgICAgICAgICBwYWNrYWdlSnNvbkNhY2hlLnNldCh2aXNpdGVkRGlyLCByZXN1bHQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gSW52YWxpZCBKU09OIG9yIG1pc3NpbmcgZmllbGRzLCBjb250aW51ZSBzZWFyY2hpbmdcbiAgICAgIH1cbiAgICB9XG5cbiAgICBkaXIgPSBkaXJuYW1lKGRpcik7XG4gIH1cblxuICAvLyBObyBwYWNrYWdlLmpzb24gZm91bmQgLSBjYWNoZSBudWxsIGZvciBhbGwgdmlzaXRlZCBkaXJlY3Rvcmllc1xuICBmb3IgKGNvbnN0IHZpc2l0ZWREaXIgb2YgdmlzaXRlZERpcnMpIHtcbiAgICBwYWNrYWdlSnNvbkNhY2hlLnNldCh2aXNpdGVkRGlyLCBudWxsKTtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG4vKipcbiAqIFJlc29sdmUgdGhlIGV4cG9ydCBzdWJwYXRoIGZvciBhIGZpbGUgd2l0aGluIGEgcGFja2FnZS5cbiAqIExvb2tzIHVwIHRoZSBwYWNrYWdlLmpzb24gZXhwb3J0cyBmaWVsZCB0byBmaW5kIHdoaWNoIHN1YnBhdGggbWFwcyB0byB0aGUgZmlsZS5cbiAqXG4gKiBAcGFyYW0gZmlsZVBhdGggLSBBYnNvbHV0ZSBwYXRoIHRvIHRoZSBmaWxlXG4gKiBAcGFyYW0gcGtnIC0gUGFja2FnZSBpbmZvIGZyb20gZmluZFBhY2thZ2VKc29uXG4gKiBAcmV0dXJucyBUaGUgc3VicGF0aCAoZS5nLiwgXCIvaW50ZXJuYWwvYnVpbHRpbnNcIikgb3IgZW1wdHkgc3RyaW5nIGZvciByb290IGV4cG9ydFxuICovXG5mdW5jdGlvbiB0b1BhY2thZ2VSZWxhdGl2ZVBhdGgoXG4gIGZpbGVQYXRoOiBzdHJpbmcsXG4gIHBrZzogUGFja2FnZUluZm9cbik6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCBub3JtYWxpemVkRmlsZVBhdGggPSBmaWxlUGF0aC5yZXBsYWNlKC9cXFxcL2csICcvJyk7XG4gIGNvbnN0IG5vcm1hbGl6ZWRQa2dEaXIgPSBwa2cuZGlyLnJlcGxhY2UoL1xcXFwvZywgJy8nKTtcbiAgaWYgKCFub3JtYWxpemVkRmlsZVBhdGguc3RhcnRzV2l0aChub3JtYWxpemVkUGtnRGlyICsgJy8nKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIG5vcm1hbGl6ZWRGaWxlUGF0aC5zdWJzdHJpbmcobm9ybWFsaXplZFBrZ0Rpci5sZW5ndGggKyAxKTtcbn1cblxuZnVuY3Rpb24gZ2V0U291cmNlRmFsbGJhY2tFeHBvcnRUYXJnZXRzKHJlbGF0aXZlUGF0aDogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCBmYWxsYmFja1RhcmdldHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgY29uc3QgZXh0ZW5zaW9uRmFsbGJhY2tzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT4gPSB7XG4gICAgJy50cyc6IFsnLmpzJ10sXG4gICAgJy50c3gnOiBbJy5qcyddLFxuICAgICcubXRzJzogWycubWpzJ10sXG4gICAgJy5jdHMnOiBbJy5janMnXSxcbiAgICAnLmpzeCc6IFsnLmpzJ10sXG4gIH07XG5cbiAgY29uc3QgZXh0ZW5zaW9uTWF0Y2ggPSByZWxhdGl2ZVBhdGgubWF0Y2goLyhcXC5bXi4vXFxcXF0rKSQvKTtcbiAgY29uc3QgZXh0ZW5zaW9uID0gZXh0ZW5zaW9uTWF0Y2g/LlsxXT8udG9Mb3dlckNhc2UoKTtcbiAgaWYgKCFleHRlbnNpb24pIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBjb25zdCBwYXRoV2l0aG91dEV4dGVuc2lvbiA9IHJlbGF0aXZlUGF0aC5zbGljZSgwLCAtZXh0ZW5zaW9uLmxlbmd0aCk7XG4gIGNvbnN0IGV4dGVuc2lvblRhcmdldHMgPSBleHRlbnNpb25GYWxsYmFja3NbZXh0ZW5zaW9uXSA/PyBbXTtcbiAgZm9yIChjb25zdCBmYWxsYmFja0V4dGVuc2lvbiBvZiBleHRlbnNpb25UYXJnZXRzKSB7XG4gICAgZmFsbGJhY2tUYXJnZXRzLmFkZChgJHtwYXRoV2l0aG91dEV4dGVuc2lvbn0ke2ZhbGxiYWNrRXh0ZW5zaW9ufWApO1xuICB9XG5cbiAgaWYgKHJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKCdzcmMvJykpIHtcbiAgICBjb25zdCBkaXN0UGF0aFdpdGhvdXRQcmVmaXggPSByZWxhdGl2ZVBhdGguc2xpY2UoJ3NyYy8nLmxlbmd0aCk7XG4gICAgZm9yIChjb25zdCBmYWxsYmFja0V4dGVuc2lvbiBvZiBleHRlbnNpb25UYXJnZXRzKSB7XG4gICAgICBmYWxsYmFja1RhcmdldHMuYWRkKFxuICAgICAgICBgZGlzdC8ke2Rpc3RQYXRoV2l0aG91dFByZWZpeC5zbGljZSgwLCAtZXh0ZW5zaW9uLmxlbmd0aCl9JHtmYWxsYmFja0V4dGVuc2lvbn1gXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBBcnJheS5mcm9tKGZhbGxiYWNrVGFyZ2V0cyk7XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVFeHBvcnRTdWJwYXRoKFxuICBmaWxlUGF0aDogc3RyaW5nLFxuICBwa2c6IFBhY2thZ2VJbmZvLFxuICBvcHRpb25zPzogeyBhbGxvd1NvdXJjZUZhbGxiYWNrPzogYm9vbGVhbiB9XG4pOiBzdHJpbmcge1xuICBpZiAoIXBrZy5leHBvcnRzIHx8IHR5cGVvZiBwa2cuZXhwb3J0cyAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBjb25zdCByZWxhdGl2ZVBhdGggPSB0b1BhY2thZ2VSZWxhdGl2ZVBhdGgoZmlsZVBhdGgsIHBrZyk7XG4gIGlmICghcmVsYXRpdmVQYXRoKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgY29uc3QgY29tcGFyYWJsZVRhcmdldHMgPSBuZXcgU2V0KFtgLi8ke3JlbGF0aXZlUGF0aH1gXSk7XG4gIGlmIChvcHRpb25zPy5hbGxvd1NvdXJjZUZhbGxiYWNrKSB7XG4gICAgZm9yIChjb25zdCBmYWxsYmFja1RhcmdldCBvZiBnZXRTb3VyY2VGYWxsYmFja0V4cG9ydFRhcmdldHMocmVsYXRpdmVQYXRoKSkge1xuICAgICAgY29tcGFyYWJsZVRhcmdldHMuYWRkKGAuLyR7ZmFsbGJhY2tUYXJnZXR9YCk7XG4gICAgfVxuICB9XG5cbiAgLy8gU2VhcmNoIHRocm91Z2ggZXhwb3J0cyB0byBmaW5kIGEgbWF0Y2hpbmcgc3VicGF0aFxuICBmb3IgKGNvbnN0IFtzdWJwYXRoLCB0YXJnZXRdIG9mIE9iamVjdC5lbnRyaWVzKHBrZy5leHBvcnRzKSkge1xuICAgIGNvbnN0IHJlc29sdmVkVGFyZ2V0ID0gcmVzb2x2ZUV4cG9ydFRhcmdldCh0YXJnZXQpO1xuICAgIGlmIChcbiAgICAgIHJlc29sdmVkVGFyZ2V0ICYmXG4gICAgICBjb21wYXJhYmxlVGFyZ2V0cy5oYXMobm9ybWFsaXplRXhwb3J0UGF0aChyZXNvbHZlZFRhcmdldCkpXG4gICAgKSB7XG4gICAgICAvLyBGb3VuZCBhIG1hdGNoIC0gcmV0dXJuIHRoZSBzdWJwYXRoIHdpdGhvdXQgdGhlIGxlYWRpbmcgXCIuXCJcbiAgICAgIC8vIGUuZy4sIFwiLi9pbnRlcm5hbC9idWlsdGluc1wiIC0+IFwiL2ludGVybmFsL2J1aWx0aW5zXCJcbiAgICAgIHJldHVybiBzdWJwYXRoID09PSAnLicgPyAnJyA6IHN1YnBhdGguc3Vic3RyaW5nKDEpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiAnJztcbn1cblxuLyoqXG4gKiBSZXNvbHZlIGFuIGV4cG9ydCB0YXJnZXQgdG8gYSBmaWxlIHBhdGgsIGhhbmRsaW5nIGNvbmRpdGlvbmFsIGV4cG9ydHMgYW5kIGFycmF5cy5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZUV4cG9ydFRhcmdldCh0YXJnZXQ6IHVua25vd24pOiBzdHJpbmcgfCBudWxsIHtcbiAgaWYgKHR5cGVvZiB0YXJnZXQgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHRhcmdldDtcbiAgfVxuXG4gIC8vIEhhbmRsZSBhcnJheSBleHBvcnRzIChmYWxsYmFjayBjaGFpbnMpXG4gIGlmIChBcnJheS5pc0FycmF5KHRhcmdldCkpIHtcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdGFyZ2V0KSB7XG4gICAgICBjb25zdCByZXNvbHZlZCA9IHJlc29sdmVFeHBvcnRUYXJnZXQoaXRlbSk7XG4gICAgICBpZiAocmVzb2x2ZWQpIHJldHVybiByZXNvbHZlZDtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBpZiAodGFyZ2V0ICYmIHR5cGVvZiB0YXJnZXQgPT09ICdvYmplY3QnKSB7XG4gICAgLy8gQ29uZGl0aW9uYWwgZXhwb3J0IC0gdHJ5IGNvbW1vbiBjb25kaXRpb25zIGluIG9yZGVyIG9mIHByZWZlcmVuY2VcbiAgICBjb25zdCBjb25kaXRpb25zID0gWyd3b3JrZmxvdycsICdkZWZhdWx0JywgJ3JlcXVpcmUnLCAnaW1wb3J0JywgJ25vZGUnXTtcbiAgICBmb3IgKGNvbnN0IGNvbmRpdGlvbiBvZiBjb25kaXRpb25zKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9ICh0YXJnZXQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2NvbmRpdGlvbl07XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9XG4gICAgICAvLyBIYW5kbGUgbmVzdGVkIGNvbmRpdGlvbmFscyBvciBhcnJheXNcbiAgICAgIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGNvbnN0IG5lc3RlZCA9IHJlc29sdmVFeHBvcnRUYXJnZXQodmFsdWUpO1xuICAgICAgICBpZiAobmVzdGVkKSByZXR1cm4gbmVzdGVkO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG4vKipcbiAqIE5vcm1hbGl6ZSBhbiBleHBvcnQgcGF0aCBmb3IgY29tcGFyaXNvbi5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplRXhwb3J0UGF0aChwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBFbnN1cmUgaXQgc3RhcnRzIHdpdGggLi9cbiAgaWYgKCFwYXRoLnN0YXJ0c1dpdGgoJy4vJykpIHtcbiAgICByZXR1cm4gJy4vJyArIHBhdGg7XG4gIH1cbiAgcmV0dXJuIHBhdGg7XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgYSBmaWxlIHBhdGggaXMgaW5zaWRlIG5vZGVfbW9kdWxlcy5cbiAqL1xuZnVuY3Rpb24gaXNJbk5vZGVNb2R1bGVzKGZpbGVQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3Qgbm9ybWFsaXplZFBhdGggPSBmaWxlUGF0aC5zcGxpdChzZXApLmpvaW4oJy8nKTtcbiAgcmV0dXJuIG5vcm1hbGl6ZWRQYXRoLmluY2x1ZGVzKCcvbm9kZV9tb2R1bGVzLycpO1xufVxuXG4vKipcbiAqIENhY2hlIGZvciBwcm9qZWN0IGRlcGVuZGVuY2llcyB0byBhdm9pZCByZXBlYXRlZCBmaWxlc3lzdGVtIHJlYWRzLlxuICogTWFwcyBwcm9qZWN0IHJvb3QgdG8gc2V0IG9mIGRlcGVuZGVuY3kgcGFja2FnZSBuYW1lcy5cbiAqL1xuY29uc3QgcHJvamVjdERlcHNDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBTZXQ8c3RyaW5nPj4oKTtcblxuLyoqXG4gKiBHZXQgYWxsIGRlcGVuZGVuY2llcyAoaW5jbHVkaW5nIGRldkRlcGVuZGVuY2llcykgZm9yIGEgcHJvamVjdC5cbiAqL1xuZnVuY3Rpb24gZ2V0UHJvamVjdERlcGVuZGVuY2llcyhwcm9qZWN0Um9vdDogc3RyaW5nKTogU2V0PHN0cmluZz4ge1xuICBjb25zdCBjYWNoZWQgPSBwcm9qZWN0RGVwc0NhY2hlLmdldChwcm9qZWN0Um9vdCk7XG4gIGlmIChjYWNoZWQpIHtcbiAgICByZXR1cm4gY2FjaGVkO1xuICB9XG5cbiAgY29uc3QgZGVwcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCBwa2dQYXRoID0gam9pbihwcm9qZWN0Um9vdCwgJ3BhY2thZ2UuanNvbicpO1xuXG4gIGlmIChleGlzdHNTeW5jKHBrZ1BhdGgpKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSByZWFkRmlsZVN5bmMocGtnUGF0aCwgJ3V0Zi04Jyk7XG4gICAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKGNvbnRlbnQpO1xuXG4gICAgICAvLyBDb2xsZWN0IGFsbCBkZXBlbmRlbmN5IHR5cGVzXG4gICAgICBmb3IgKGNvbnN0IGRlcFR5cGUgb2YgW1xuICAgICAgICAnZGVwZW5kZW5jaWVzJyxcbiAgICAgICAgJ2RldkRlcGVuZGVuY2llcycsXG4gICAgICAgICdwZWVyRGVwZW5kZW5jaWVzJyxcbiAgICAgICAgJ29wdGlvbmFsRGVwZW5kZW5jaWVzJyxcbiAgICAgIF0pIHtcbiAgICAgICAgY29uc3QgZGVwT2JqID0gcGFyc2VkW2RlcFR5cGVdO1xuICAgICAgICBpZiAoZGVwT2JqICYmIHR5cGVvZiBkZXBPYmogPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBuYW1lIG9mIE9iamVjdC5rZXlzKGRlcE9iaikpIHtcbiAgICAgICAgICAgIGRlcHMuYWRkKG5hbWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gSW52YWxpZCBKU09OIG9yIGZpbGUgbm90IHJlYWRhYmxlXG4gICAgfVxuICB9XG5cbiAgcHJvamVjdERlcHNDYWNoZS5zZXQocHJvamVjdFJvb3QsIGRlcHMpO1xuICByZXR1cm4gZGVwcztcbn1cblxuLyoqXG4gKiBDaGVjayBpZiBhIGZpbGUgcGF0aCBpcyBpbnNpZGUgYSB3b3Jrc3BhY2UgcGFja2FnZSB0aGF0IGlzIGEgZGVwZW5kZW5jeSBvZiB0aGUgcHJvamVjdC5cbiAqIFRoaXMgaXMgYSBoZXVyaXN0aWMgLSB3ZSBjaGVjayBpZiB0aGUgZmlsZSBpcyBpbiBhIGRpcmVjdG9yeSB3aXRoIGEgcGFja2FnZS5qc29uXG4gKiB0aGF0IGhhcyBhIFwibmFtZVwiIGZpZWxkLCBpcyBOT1QgaW4gbm9kZV9tb2R1bGVzLCBhbmQgaXMgbGlzdGVkIGFzIGEgZGVwZW5kZW5jeVxuICogb2YgdGhlIHByb2plY3QuXG4gKi9cbmZ1bmN0aW9uIGlzV29ya3NwYWNlUGFja2FnZShmaWxlUGF0aDogc3RyaW5nLCBwcm9qZWN0Um9vdDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGlmIChpc0luTm9kZU1vZHVsZXMoZmlsZVBhdGgpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgcGtnID0gZmluZFBhY2thZ2VKc29uKGZpbGVQYXRoKTtcbiAgaWYgKCFwa2cpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBDaGVjayBpZiB0aGUgcGFja2FnZS5qc29uIGlzIG5vdCB0aGUgcm9vdCBwYWNrYWdlLmpzb25cbiAgLy8gVXNlIHJlc29sdmUoKSB0byBub3JtYWxpemUgcGF0aHMgZm9yIGNyb3NzLXBsYXRmb3JtIGNvbXBhcmlzb25cbiAgY29uc3Qgcm9vdFBrZ0RpciA9IHJlc29sdmUocHJvamVjdFJvb3QpO1xuICBjb25zdCBwa2dEaXIgPSByZXNvbHZlKHBrZy5kaXIpO1xuXG4gIC8vIElmIHRoZSBwYWNrYWdlIGRpcmVjdG9yeSBpcyB0aGUgcHJvamVjdCByb290LCBpdCdzIG5vdCBhIHdvcmtzcGFjZSBwYWNrYWdlXG4gIGlmIChwa2dEaXIgPT09IHJvb3RQa2dEaXIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBGb3VuZCBhIHBhY2thZ2UuanNvbiB0aGF0J3Mgbm90IHRoZSByb290LlxuICAvLyBPbmx5IHRyZWF0IGl0IGFzIGEgd29ya3NwYWNlIHBhY2thZ2UgaWYgaXQncyBhY3R1YWxseSBhIGRlcGVuZGVuY3lcbiAgLy8gb2YgdGhlIGN1cnJlbnQgcHJvamVjdC4gVGhpcyBwcmV2ZW50cyBzaWJsaW5nIGFwcHMgaW4gYSBtb25vcmVwb1xuICAvLyBmcm9tIGJlaW5nIGluY29ycmVjdGx5IHRyZWF0ZWQgYXMgaW1wb3J0YWJsZSBwYWNrYWdlcy5cbiAgY29uc3QgcHJvamVjdERlcHMgPSBnZXRQcm9qZWN0RGVwZW5kZW5jaWVzKHByb2plY3RSb290KTtcbiAgcmV0dXJuIHByb2plY3REZXBzLmhhcyhwa2cubmFtZSk7XG59XG5cbi8qKlxuICogUmVzb2x2ZSB0aGUgbW9kdWxlIHNwZWNpZmllciBmb3IgYSBmaWxlLlxuICpcbiAqIEBwYXJhbSBmaWxlUGF0aCAtIEFic29sdXRlIHBhdGggdG8gdGhlIGZpbGUgYmVpbmcgdHJhbnNmb3JtZWRcbiAqIEBwYXJhbSBwcm9qZWN0Um9vdCAtIEFic29sdXRlIHBhdGggdG8gdGhlIHByb2plY3Qgcm9vdCAodXN1YWxseSBwcm9jZXNzLmN3ZCgpKVxuICogQHJldHVybnMgVGhlIG1vZHVsZSBzcGVjaWZpZXIgcmVzdWx0XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEZpbGUgaW4gbm9kZV9tb2R1bGVzIChyb290IGV4cG9ydClcbiAqIHJlc29sdmVNb2R1bGVTcGVjaWZpZXIoJy9wcm9qZWN0L25vZGVfbW9kdWxlcy9wb2ludC9kaXN0L2luZGV4LmpzJywgJy9wcm9qZWN0JylcbiAqIC8vID0+IHsgbW9kdWxlU3BlY2lmaWVyOiAncG9pbnRAMS4wLjAnIH1cbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gRmlsZSBpbiBub2RlX21vZHVsZXMgKHN1YnBhdGggZXhwb3J0KVxuICogcmVzb2x2ZU1vZHVsZVNwZWNpZmllcignL3Byb2plY3Qvbm9kZV9tb2R1bGVzL3dvcmtmbG93L2Rpc3QvaW50ZXJuYWwvYnVpbHRpbnMuanMnLCAnL3Byb2plY3QnKVxuICogLy8gPT4geyBtb2R1bGVTcGVjaWZpZXI6ICd3b3JrZmxvdy9pbnRlcm5hbC9idWlsdGluc0A0LjAuMCcgfVxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBFeHBvcnRlZCByb290IGZpbGUgaW4gd29ya3NwYWNlIHBhY2thZ2VcbiAqIHJlc29sdmVNb2R1bGVTcGVjaWZpZXIoJy9wcm9qZWN0L3BhY2thZ2VzL3NoYXJlZC9zcmMvaW5kZXgudHMnLCAnL3Byb2plY3QnKVxuICogLy8gPT4geyBtb2R1bGVTcGVjaWZpZXI6ICdAbXlvcmcvc2hhcmVkQDAuMC4wJyB9XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIE5vbi1leHBvcnRlZCAvIGRlZXAgcGFja2FnZSBmaWxlXG4gKiByZXNvbHZlTW9kdWxlU3BlY2lmaWVyKCcvcHJvamVjdC9wYWNrYWdlcy9zaGFyZWQvc3JjL2ludGVybmFsL2Zvby50cycsICcvcHJvamVjdCcpXG4gKiAvLyA9PiB7IG1vZHVsZVNwZWNpZmllcjogdW5kZWZpbmVkIH1cbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gTG9jYWwgYXBwIGZpbGVcbiAqIHJlc29sdmVNb2R1bGVTcGVjaWZpZXIoJy9wcm9qZWN0L3NyYy93b3JrZmxvd3Mvb3JkZXIudHMnLCAnL3Byb2plY3QnKVxuICogLy8gPT4geyBtb2R1bGVTcGVjaWZpZXI6IHVuZGVmaW5lZCB9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlTW9kdWxlU3BlY2lmaWVyKFxuICBmaWxlUGF0aDogc3RyaW5nLFxuICBwcm9qZWN0Um9vdDogc3RyaW5nXG4pOiBNb2R1bGVTcGVjaWZpZXJSZXN1bHQge1xuICAvLyBDaGVjayBpZiBmaWxlIGlzIGluIG5vZGVfbW9kdWxlcyBvciBhIHdvcmtzcGFjZSBwYWNrYWdlXG4gIGNvbnN0IGluTm9kZU1vZHVsZXMgPSBpc0luTm9kZU1vZHVsZXMoZmlsZVBhdGgpO1xuICBjb25zdCBpbldvcmtzcGFjZSA9XG4gICAgIWluTm9kZU1vZHVsZXMgJiYgaXNXb3Jrc3BhY2VQYWNrYWdlKGZpbGVQYXRoLCBwcm9qZWN0Um9vdCk7XG5cbiAgaWYgKCFpbk5vZGVNb2R1bGVzICYmICFpbldvcmtzcGFjZSkge1xuICAgIC8vIExvY2FsIGFwcCBmaWxlIC0gdXNlIGRlZmF1bHQgcmVsYXRpdmUgcGF0aCBmb3JtYXRcbiAgICByZXR1cm4geyBtb2R1bGVTcGVjaWZpZXI6IHVuZGVmaW5lZCB9O1xuICB9XG5cbiAgLy8gRmluZCB0aGUgcGFja2FnZS5qc29uIGZvciB0aGlzIGZpbGVcbiAgY29uc3QgcGtnID0gZmluZFBhY2thZ2VKc29uKGZpbGVQYXRoKTtcbiAgaWYgKCFwa2cpIHtcbiAgICAvLyBDb3VsZG4ndCBmaW5kIHBhY2thZ2UuanNvbiAtIGZhbGwgYmFjayB0byBkZWZhdWx0XG4gICAgcmV0dXJuIHsgbW9kdWxlU3BlY2lmaWVyOiB1bmRlZmluZWQgfTtcbiAgfVxuXG4gIC8vIFJlc29sdmUgdGhlIGV4cG9ydCBzdWJwYXRoIChlLmcuLCBcIi9pbnRlcm5hbC9idWlsdGluc1wiIGZvciBcIndvcmtmbG93L2ludGVybmFsL2J1aWx0aW5zXCIpXG4gIGNvbnN0IHN1YnBhdGggPSByZXNvbHZlRXhwb3J0U3VicGF0aChmaWxlUGF0aCwgcGtnLCB7XG4gICAgYWxsb3dTb3VyY2VGYWxsYmFjazogdHJ1ZSxcbiAgfSk7XG5cbiAgaWYgKHN1YnBhdGgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbW9kdWxlU3BlY2lmaWVyOiBgJHtwa2cubmFtZX0ke3N1YnBhdGh9QCR7cGtnLnZlcnNpb259YCxcbiAgICB9O1xuICB9XG5cbiAgaWYgKGlzUm9vdEVudHJ5cG9pbnRGaWxlKGZpbGVQYXRoLCBwa2cpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1vZHVsZVNwZWNpZmllcjogYCR7cGtnLm5hbWV9QCR7cGtnLnZlcnNpb259YCxcbiAgICB9O1xuICB9XG5cbiAgLy8gTm9uLWV4cG9ydGVkIHBhY2thZ2UgZmlsZSAoZGVlcCBpbXBvcnQgdGhhdCBpc24ndCByZWFjaGFibGUgYXMgYVxuICAvLyBwYWNrYWdlIHNwZWNpZmllcikuIFJldHVybmluZyB1bmRlZmluZWQgbWFrZXMgdGhlIFNXQyBwbHVnaW4gZmFsbCBiYWNrXG4gIC8vIHRvIHRoZSByZWxhdGl2ZSBmaWxlIHBhdGgsIHdoaWNoIGtlZXBzIElEcyB1bmlxdWUgcGVyIGZpbGUuIFByZXZpb3VzbHlcbiAgLy8gZXZlcnkgbm9uLWV4cG9ydGVkIGZpbGUgY29sbGFwc2VkIHRvIFwibmFtZUB2ZXJzaW9uXCIsIGNhdXNpbmcgc2FtZS1uYW1lZFxuICAvLyBzdGVwL3dvcmtmbG93IGZ1bmN0aW9ucyBpbiBkaWZmZXJlbnQgZmlsZXMgdG8gc2lsZW50bHkgb3ZlcndyaXRlIGVhY2hcbiAgLy8gb3RoZXIgYXQgcnVudGltZSByZWdpc3RyYXRpb247IHRoZSBidWlsZC10aW1lIGR1cGxpY2F0ZS1JRCBjaGVjayBub3dcbiAgLy8gYWxzbyBjYXRjaGVzIHRoYXQgY2xhc3Mgb2YgY29sbGlzaW9uLlxuICByZXR1cm4ge1xuICAgIG1vZHVsZVNwZWNpZmllcjogdW5kZWZpbmVkLFxuICB9O1xufVxuXG4vKipcbiAqIFN0cmlwIHRoZSB0cmFpbGluZyBcIkA8dmVyc2lvbj5cIiBzdWZmaXggZnJvbSBhIG1vZHVsZSBzcGVjaWZpZXIgcHJvZHVjZWQgYnlcbiAqIGByZXNvbHZlTW9kdWxlU3BlY2lmaWVyYCwgbGVhdmluZyB0aGUgYmFyZSBgbmFtZWAgb3IgYG5hbWUvc3VicGF0aGAgZm9ybS5cbiAqXG4gKiBVc2UgdGhpcyB3aGVuIHlvdSB3YW50IHRvIGNvbXBhcmUgb3IgZGVkdXBlIHNwZWNpZmllcnMgYWNyb3NzIHZlcnNpb25zXG4gKiAoZS5nLiB0cmVhdGluZyBgQHdvcmtmbG93L2FpL2FnZW50QDUuMC4wLWJldGEuNGAgYW5kXG4gKiBgQHdvcmtmbG93L2FpL2FnZW50QDUuMC4wLWJldGEuNWAgYXMgdGhlIHNhbWUgbG9naWNhbCBtb2R1bGUpLlxuICpcbiAqIENvbG9jYXRlZCB3aXRoIGByZXNvbHZlTW9kdWxlU3BlY2lmaWVyYCBzbyB0aGUgY29uc3RydWN0aW9uIGFuZCBwYXJzaW5nXG4gKiBzdGF5IGluIHN5bmMg4oCUIHNlZSB0aGUgYCR7cGtnLm5hbWV9JHtzdWJwYXRofUAke3BrZy52ZXJzaW9ufWAgYW5kXG4gKiBgJHtwa2cubmFtZX1AJHtwa2cudmVyc2lvbn1gIHBhdGhzIGFib3ZlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3RyaXBQYWNrYWdlVmVyc2lvbihzcGVjaWZpZXI6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIFRoZSB2ZXJzaW9uIGlzIGFsd2F5cyB0aGUgZmluYWwgc2VnbWVudCBhZnRlciB0aGUgbGFzdCBcIkBcIi4gQ29uc3RyYWluXG4gIC8vIG1hdGNoaW5nIHRvIGNoYXJhY3RlcnMgdGhhdCBjYW4ndCBhcHBlYXIgaW4gYSBwYWNrYWdlIG5hbWUgb3Igc3VicGF0aFxuICAvLyAobm8gXCIvXCIsIG5vIG5lc3RlZCBcIkBcIikgc28gc2NvcGVkIHBhY2thZ2VzIGxpa2UgYEB3b3JrZmxvdy9haUAxLjAuMGBcbiAgLy8ga2VlcCB0aGVpciBsZWFkaW5nIFwiQHdvcmtmbG93L2FpXCIuXG4gIHJldHVybiBzcGVjaWZpZXIucmVwbGFjZSgvQFteL0BdKyQvLCAnJyk7XG59XG5cbi8qKlxuICogQ2xlYXIgdGhlIHBhY2thZ2UuanNvbiBjYWNoZS4gVXNlZnVsIGZvciB0ZXN0aW5nIG9yIHdoZW4gcGFja2FnZS5qc29uIGZpbGVzIG1heSBoYXZlIGNoYW5nZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbGVhck1vZHVsZVNwZWNpZmllckNhY2hlKCk6IHZvaWQge1xuICBwYWNrYWdlSnNvbkNhY2hlLmNsZWFyKCk7XG4gIHByb2plY3REZXBzQ2FjaGUuY2xlYXIoKTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0IGEgZmlsZSBwYXRoIHRvIGEgcmVsYXRpdmUgaW1wb3J0IHBhdGggZnJvbSBwcm9qZWN0IHJvb3QuXG4gKi9cbmZ1bmN0aW9uIHRvUmVsYXRpdmVJbXBvcnRQYXRoKGZpbGVQYXRoOiBzdHJpbmcsIHByb2plY3RSb290OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBub3JtYWxpemVkUHJvamVjdFJvb3QgPSBwcm9qZWN0Um9vdC5yZXBsYWNlKC9cXFxcL2csICcvJyk7XG4gIGNvbnN0IG5vcm1hbGl6ZWRGaWxlUGF0aCA9IGZpbGVQYXRoLnJlcGxhY2UoL1xcXFwvZywgJy8nKTtcblxuICBsZXQgcmVsYXRpdmVQYXRoOiBzdHJpbmc7XG4gIGlmIChub3JtYWxpemVkRmlsZVBhdGguc3RhcnRzV2l0aChub3JtYWxpemVkUHJvamVjdFJvb3QgKyAnLycpKSB7XG4gICAgcmVsYXRpdmVQYXRoID0gbm9ybWFsaXplZEZpbGVQYXRoLnN1YnN0cmluZyhcbiAgICAgIG5vcm1hbGl6ZWRQcm9qZWN0Um9vdC5sZW5ndGggKyAxXG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBGaWxlIGlzIG91dHNpZGUgcHJvamVjdCByb290LCB1c2UgdGhlIGZ1bGwgcGF0aCBzZWdtZW50cyBhZnRlciBjb21tb24gYW5jZXN0b3JcbiAgICByZWxhdGl2ZVBhdGggPSByZWxhdGl2ZShwcm9qZWN0Um9vdCwgZmlsZVBhdGgpLnJlcGxhY2UoL1xcXFwvZywgJy8nKTtcbiAgfVxuXG4gIC8vIEVuc3VyZSByZWxhdGl2ZSBwYXRocyBzdGFydCB3aXRoIC4vXG4gIGlmICghcmVsYXRpdmVQYXRoLnN0YXJ0c1dpdGgoJy4nKSkge1xuICAgIHJlbGF0aXZlUGF0aCA9IGAuLyR7cmVsYXRpdmVQYXRofWA7XG4gIH1cblxuICByZXR1cm4gcmVsYXRpdmVQYXRoO1xufVxuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSB3aGVuIHBhY2thZ2UgZXhwb3J0cyBpbmNsdWRlIGEgcm9vdCBlbnRyeSAoXCIuXCIpLlxuICogU3RyaW5nL2FycmF5L2NvbmRpdGlvbmFsIG9iamVjdCBleHBvcnRzIGFyZSBhbGwgY29uc2lkZXJlZCByb290IGV4cG9ydHMuXG4gKi9cbmZ1bmN0aW9uIGhhc1Jvb3RFeHBvcnQoZXhwb3J0c0ZpZWxkOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIGlmICh0eXBlb2YgZXhwb3J0c0ZpZWxkID09PSAnc3RyaW5nJyB8fCBBcnJheS5pc0FycmF5KGV4cG9ydHNGaWVsZCkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmICghZXhwb3J0c0ZpZWxkIHx8IHR5cGVvZiBleHBvcnRzRmllbGQgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGV4cG9ydHNGaWVsZCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG4gIC8vIENvbmRpdGlvbmFsIGV4cG9ydHMgb2JqZWN0IChlLmcuIHsgXCJpbXBvcnRcIjogXCIuLi5cIiwgXCJkZWZhdWx0XCI6IFwiLi4uXCIgfSlcbiAgLy8gcmVwcmVzZW50cyB0aGUgcm9vdCBleHBvcnQuXG4gIGlmIChrZXlzLmxlbmd0aCA+IDAgJiYga2V5cy5ldmVyeSgoa2V5KSA9PiAha2V5LnN0YXJ0c1dpdGgoJy4nKSkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiAnLicgaW4gKGV4cG9ydHNGaWVsZCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG59XG5cbi8qKlxuICogTm9ybWFsaXplIGEgcGFja2FnZSB0YXJnZXQgcGF0aCB0byBhIGNvbXBhcmFibGUgcGFja2FnZS1yZWxhdGl2ZSBwYXRoLlxuICogUmV0dXJucyBudWxsIGZvciBpbnZhbGlkL3Vuc3VwcG9ydGVkIHBhdGhzLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVQYWNrYWdlVGFyZ2V0UGF0aChwYXRoOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcbiAgY29uc3Qgbm9ybWFsaXplZCA9IHBhdGgucmVwbGFjZSgvXFxcXC9nLCAnLycpO1xuICBpZiAobm9ybWFsaXplZC5zdGFydHNXaXRoKCcuLycpKSB7XG4gICAgcmV0dXJuIG5vcm1hbGl6ZWQuc3Vic3RyaW5nKDIpO1xuICB9XG4gIGlmIChub3JtYWxpemVkLnN0YXJ0c1dpdGgoJy8nKSkge1xuICAgIHJldHVybiBub3JtYWxpemVkLnN1YnN0cmluZygxKTtcbiAgfVxuICByZXR1cm4gbm9ybWFsaXplZDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgZmlsZVBhdGggaXMgdGhlIHBhY2thZ2Ugcm9vdCBlbnRyeXBvaW50LlxuICogVGhpcyBjaGVja3Mgcm9vdCBleHBvcnRzIGZpcnN0LCB0aGVuIG1haW4vbW9kdWxlL2luZGV4IGZhbGxiYWNrcyB3aGVuIGV4cG9ydHMgYXJlIGFic2VudC5cbiAqL1xuZnVuY3Rpb24gaXNSb290RW50cnlwb2ludEZpbGUoZmlsZVBhdGg6IHN0cmluZywgcGtnOiBQYWNrYWdlSW5mbyk6IGJvb2xlYW4ge1xuICBjb25zdCBub3JtYWxpemVkRmlsZVBhdGggPSBmaWxlUGF0aC5yZXBsYWNlKC9cXFxcL2csICcvJyk7XG4gIGNvbnN0IG5vcm1hbGl6ZWRQa2dEaXIgPSBwa2cuZGlyLnJlcGxhY2UoL1xcXFwvZywgJy8nKTtcblxuICBpZiAoIW5vcm1hbGl6ZWRGaWxlUGF0aC5zdGFydHNXaXRoKG5vcm1hbGl6ZWRQa2dEaXIgKyAnLycpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgcmVsYXRpdmVGaWxlUGF0aCA9IG5vcm1hbGl6ZWRGaWxlUGF0aC5zdWJzdHJpbmcoXG4gICAgbm9ybWFsaXplZFBrZ0Rpci5sZW5ndGggKyAxXG4gICk7XG5cbiAgaWYgKHBrZy5leHBvcnRzKSB7XG4gICAgbGV0IHJvb3RUYXJnZXQ6IHVua25vd247XG5cbiAgICBpZiAoXG4gICAgICB0eXBlb2YgcGtnLmV4cG9ydHMgPT09ICdvYmplY3QnICYmXG4gICAgICAhQXJyYXkuaXNBcnJheShwa2cuZXhwb3J0cykgJiZcbiAgICAgICcuJyBpbiBwa2cuZXhwb3J0c1xuICAgICkge1xuICAgICAgcm9vdFRhcmdldCA9IChwa2cuZXhwb3J0cyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilbJy4nXTtcbiAgICB9IGVsc2UgaWYgKGhhc1Jvb3RFeHBvcnQocGtnLmV4cG9ydHMpKSB7XG4gICAgICByb290VGFyZ2V0ID0gcGtnLmV4cG9ydHM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCByZXNvbHZlZFRhcmdldCA9IHJlc29sdmVFeHBvcnRUYXJnZXQocm9vdFRhcmdldCk7XG4gICAgaWYgKCFyZXNvbHZlZFRhcmdldCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IG5vcm1hbGl6ZWRUYXJnZXQgPSBub3JtYWxpemVQYWNrYWdlVGFyZ2V0UGF0aChyZXNvbHZlZFRhcmdldCk7XG4gICAgcmV0dXJuIG5vcm1hbGl6ZWRUYXJnZXQgPT09IHJlbGF0aXZlRmlsZVBhdGg7XG4gIH1cblxuICBjb25zdCByb290Q2FuZGlkYXRlcyA9IFtcbiAgICBwa2cubW9kdWxlLFxuICAgIHBrZy5tYWluLFxuICAgICdpbmRleC5qcycsXG4gICAgJ2luZGV4Lm1qcycsXG4gICAgJ2luZGV4LmNqcycsXG4gICAgJ2luZGV4LnRzJyxcbiAgICAnaW5kZXgubXRzJyxcbiAgICAnaW5kZXguY3RzJyxcbiAgXVxuICAgIC5maWx0ZXIoKGNhbmRpZGF0ZSk6IGNhbmRpZGF0ZSBpcyBzdHJpbmcgPT4gdHlwZW9mIGNhbmRpZGF0ZSA9PT0gJ3N0cmluZycpXG4gICAgLm1hcCgoY2FuZGlkYXRlKSA9PiBub3JtYWxpemVQYWNrYWdlVGFyZ2V0UGF0aChjYW5kaWRhdGUpKVxuICAgIC5maWx0ZXIoKGNhbmRpZGF0ZSk6IGNhbmRpZGF0ZSBpcyBzdHJpbmcgPT4gY2FuZGlkYXRlICE9PSBudWxsKTtcblxuICByZXR1cm4gcm9vdENhbmRpZGF0ZXMuaW5jbHVkZXMocmVsYXRpdmVGaWxlUGF0aCk7XG59XG5cbi8qKlxuICogUmVzdWx0IG9mIHJlc29sdmluZyBhbiBpbXBvcnQgcGF0aCBmb3IgYSBmaWxlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEltcG9ydFBhdGhSZXN1bHQge1xuICAvKipcbiAgICogVGhlIGltcG9ydCBwYXRoIHRvIHVzZS5cbiAgICogLSBGb3Igd29ya3NwYWNlIHBhY2thZ2VzOiB0aGUgcGFja2FnZSBuYW1lIChlLmcuLCBcIkBteW9yZy9zaGFyZWRcIilcbiAgICogLSBGb3Igbm9kZV9tb2R1bGVzIHBhY2thZ2VzOiB0aGUgcGFja2FnZSBuYW1lXG4gICAqIC0gRm9yIGxvY2FsIGZpbGVzOiBhIHJlbGF0aXZlIHBhdGggKGUuZy4sIFwiLi9zcmMvd29ya2Zsb3dzL29yZGVyLnRzXCIpXG4gICAqL1xuICBpbXBvcnRQYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhpcyBmaWxlIGlzIGZyb20gYSBwYWNrYWdlICh3b3Jrc3BhY2Ugb3Igbm9kZV9tb2R1bGVzKS5cbiAgICogV2hlbiB0cnVlLCB0aGUgaW1wb3J0IHNob3VsZCBnbyB0aHJvdWdoIHBhY2thZ2UgcmVzb2x1dGlvbiB3aGljaCByZXNwZWN0cyBleHBvcnQgY29uZGl0aW9ucy5cbiAgICovXG4gIGlzUGFja2FnZTogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIGltcG9ydCBwYXRoIHRvIHVzZSBmb3IgYSBmaWxlIGluIGEgYnVuZGxlJ3MgdmlydHVhbCBlbnRyeS5cbiAqXG4gKiBGb3Igd29ya3NwYWNlIHBhY2thZ2VzIGFuZCBub2RlX21vZHVsZXMgcGFja2FnZXMsIHJldHVybnMgdGhlIHBhY2thZ2UgbmFtZVxuICogc28gdGhhdCBidW5kbGVyIHJlc29sdXRpb24gd2lsbCByZXNwZWN0IHBhY2thZ2UuanNvbiBleHBvcnRzIGFuZCBjb25kaXRpb25zLlxuICpcbiAqIEZvciBsb2NhbCBhcHAgZmlsZXMsIHJldHVybnMgYSByZWxhdGl2ZSBwYXRoLlxuICpcbiAqIEBwYXJhbSBmaWxlUGF0aCAtIEFic29sdXRlIHBhdGggdG8gdGhlIGZpbGVcbiAqIEBwYXJhbSBwcm9qZWN0Um9vdCAtIEFic29sdXRlIHBhdGggdG8gdGhlIHByb2plY3Qgcm9vdFxuICogQHJldHVybnMgVGhlIGltcG9ydCBwYXRoIGFuZCB3aGV0aGVyIGl0J3MgYSBwYWNrYWdlXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFdvcmtzcGFjZSBwYWNrYWdlXG4gKiBnZXRJbXBvcnRQYXRoKCcvcHJvamVjdC9wYWNrYWdlcy9zaGFyZWQvc3JjL2luZGV4LnRzJywgJy9wcm9qZWN0JylcbiAqIC8vID0+IHsgaW1wb3J0UGF0aDogJ0BteW9yZy9zaGFyZWQnLCBpc1BhY2thZ2U6IHRydWUgfVxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBMb2NhbCBhcHAgZmlsZVxuICogZ2V0SW1wb3J0UGF0aCgnL3Byb2plY3Qvc3JjL3dvcmtmbG93cy9vcmRlci50cycsICcvcHJvamVjdCcpXG4gKiAvLyA9PiB7IGltcG9ydFBhdGg6ICcuL3NyYy93b3JrZmxvd3Mvb3JkZXIudHMnLCBpc1BhY2thZ2U6IGZhbHNlIH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEltcG9ydFBhdGgoXG4gIGZpbGVQYXRoOiBzdHJpbmcsXG4gIHByb2plY3RSb290OiBzdHJpbmdcbik6IEltcG9ydFBhdGhSZXN1bHQge1xuICAvLyBDaGVjayBpZiBmaWxlIGlzIGluIG5vZGVfbW9kdWxlcyBvciBhIHdvcmtzcGFjZSBwYWNrYWdlXG4gIGNvbnN0IGluTm9kZU1vZHVsZXMgPSBpc0luTm9kZU1vZHVsZXMoZmlsZVBhdGgpO1xuICBjb25zdCBpbldvcmtzcGFjZSA9XG4gICAgIWluTm9kZU1vZHVsZXMgJiYgaXNXb3Jrc3BhY2VQYWNrYWdlKGZpbGVQYXRoLCBwcm9qZWN0Um9vdCk7XG5cbiAgaWYgKGluTm9kZU1vZHVsZXMgfHwgaW5Xb3Jrc3BhY2UpIHtcbiAgICAvLyBGaW5kIHRoZSBwYWNrYWdlLmpzb24gZm9yIHRoaXMgZmlsZVxuICAgIGNvbnN0IHBrZyA9IGZpbmRQYWNrYWdlSnNvbihmaWxlUGF0aCk7XG4gICAgaWYgKHBrZykge1xuICAgICAgY29uc3QgaXNEaXJlY3RQcm9qZWN0RGVwZW5kZW5jeSA9IGdldFByb2plY3REZXBlbmRlbmNpZXMocHJvamVjdFJvb3QpLmhhcyhcbiAgICAgICAgcGtnLm5hbWVcbiAgICAgICk7XG4gICAgICBjb25zdCBjYW5Vc2VQYWNrYWdlU3BlY2lmaWVyID0gaW5Xb3Jrc3BhY2UgfHwgaXNEaXJlY3RQcm9qZWN0RGVwZW5kZW5jeTtcblxuICAgICAgLy8gRm9yIHRyYW5zaXRpdmUgbm9kZV9tb2R1bGVzIGRlcGVuZGVuY2llcyB1bmRlciBzdHJpY3QgcGFja2FnZSBtYW5hZ2Vyc1xuICAgICAgLy8gKGZvciBleGFtcGxlLCBwbnBtKSwgaW1wb3J0aW5nIGJ5IHBhY2thZ2UgbmFtZSBjYW4gZmFpbC4gVXNlIGEgZGlyZWN0XG4gICAgICAvLyBmaWxlIHBhdGggaW1wb3J0IGluIHRob3NlIGNhc2VzLlxuICAgICAgaWYgKCFjYW5Vc2VQYWNrYWdlU3BlY2lmaWVyKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgaW1wb3J0UGF0aDogdG9SZWxhdGl2ZUltcG9ydFBhdGgoZmlsZVBhdGgsIHByb2plY3RSb290KSxcbiAgICAgICAgICBpc1BhY2thZ2U6IGZhbHNlLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICAvLyBQcmVmZXIgYSBwYWNrYWdlIHN1YnBhdGggaW1wb3J0IHdoZW4gdGhpcyBmaWxlIG1hcHMgdG8gYW4gZXhwb3J0LlxuICAgICAgLy8gVGhpcyBwcmVzZXJ2ZXMgdGhlIGV4YWN0IG1vZHVsZSBiZWluZyBidW5kbGVkIHdoaWxlIHN0aWxsIHJlc3BlY3RpbmdcbiAgICAgIC8vIHBhY2thZ2UgZXhwb3J0IGNvbmRpdGlvbnMuXG4gICAgICAvLyBOb3RlOiByZXNvbHZlRXhwb3J0U3VicGF0aCByZXR1cm5zIFwiXCIgZm9yIGJvdGggcm9vdCBcIi5cIiBtYXRjaGVzIGFuZFxuICAgICAgLy8gbm8gbWF0Y2g7IHJvb3QgZW50cnlwb2ludHMgYXJlIGludGVudGlvbmFsbHkgaGFuZGxlZCBiZWxvdyB2aWFcbiAgICAgIC8vIGlzUm9vdEVudHJ5cG9pbnRGaWxlKCkuXG4gICAgICBjb25zdCBzdWJwYXRoID0gcmVzb2x2ZUV4cG9ydFN1YnBhdGgoZmlsZVBhdGgsIHBrZyk7XG4gICAgICBpZiAoc3VicGF0aCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGltcG9ydFBhdGg6IGAke3BrZy5uYW1lfSR7c3VicGF0aH1gLFxuICAgICAgICAgIGlzUGFja2FnZTogdHJ1ZSxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgLy8gT25seSBpbXBvcnQgcGFja2FnZSByb290IHdoZW4gdGhpcyBmaWxlIGlzIHRoZSByb290IGVudHJ5cG9pbnQuXG4gICAgICAvLyBGb3IgZGVlcC9pbnRlcm5hbCBmaWxlcywgZmFsbCBiYWNrIHRvIGRpcmVjdCByZWxhdGl2ZSBpbXBvcnRzIHNvIHdlXG4gICAgICAvLyBkb24ndCBhY2NpZGVudGFsbHkgaW1wb3J0IGEgbm9uLWV4aXN0ZW50IG9yIGRpZmZlcmVudCBtb2R1bGUuXG4gICAgICBpZiAoIWlzUm9vdEVudHJ5cG9pbnRGaWxlKGZpbGVQYXRoLCBwa2cpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgaW1wb3J0UGF0aDogdG9SZWxhdGl2ZUltcG9ydFBhdGgoZmlsZVBhdGgsIHByb2plY3RSb290KSxcbiAgICAgICAgICBpc1BhY2thZ2U6IGZhbHNlLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBpbXBvcnRQYXRoOiBwa2cubmFtZSxcbiAgICAgICAgaXNQYWNrYWdlOiB0cnVlLFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICAvLyBMb2NhbCBhcHAgZmlsZSAtIHVzZSByZWxhdGl2ZSBwYXRoXG4gIHJldHVybiB7XG4gICAgaW1wb3J0UGF0aDogdG9SZWxhdGl2ZUltcG9ydFBhdGgoZmlsZVBhdGgsIHByb2plY3RSb290KSxcbiAgICBpc1BhY2thZ2U6IGZhbHNlLFxuICB9O1xufVxuIl19
@@ -219,10 +219,10 @@ describe('getImportPath', () => {
219
219
  moduleSpecifier: undefined,
220
220
  });
221
221
  });
222
- it('uses the consuming app root to resolve workspace package workflow ids', () => {
222
+ it('uses package specifiers for workspace package root entrypoint ids', () => {
223
223
  const projectRoot = join(testRoot, 'apps/chat');
224
224
  const packageDir = join(testRoot, 'packages/vade');
225
- const filePath = join(packageDir, 'src/internal/message/workflow/handle-message.ts');
225
+ const filePath = join(packageDir, 'src/index.ts');
226
226
  writeJson(join(projectRoot, 'package.json'), {
227
227
  name: 'chat',
228
228
  dependencies: { vade: 'workspace:*' },
@@ -230,11 +230,53 @@ describe('getImportPath', () => {
230
230
  writeJson(join(packageDir, 'package.json'), {
231
231
  name: 'vade',
232
232
  version: '0.0.0',
233
+ main: './src/index.ts',
233
234
  });
234
235
  writeFile(filePath, `'use workflow';\n`);
235
236
  expect(resolveModuleSpecifier(filePath, projectRoot)).toEqual({
236
237
  moduleSpecifier: 'vade@0.0.0',
237
238
  });
238
239
  });
240
+ it('returns undefined for non-exported workspace package files', () => {
241
+ const projectRoot = join(testRoot, 'apps/chat');
242
+ const packageDir = join(testRoot, 'packages/vade');
243
+ const filePath = join(packageDir, 'src/internal/message/workflow/handle-message.ts');
244
+ writeJson(join(projectRoot, 'package.json'), {
245
+ name: 'chat',
246
+ dependencies: { vade: 'workspace:*' },
247
+ });
248
+ writeJson(join(packageDir, 'package.json'), {
249
+ name: 'vade',
250
+ version: '0.0.0',
251
+ });
252
+ writeFile(filePath, `'use workflow';\n`);
253
+ // Non-exported package files fall back to the relative-file-path ID
254
+ // (the SWC plugin uses "./{file}" when moduleSpecifier is undefined).
255
+ // This keeps IDs unique per file across the build instead of collapsing
256
+ // every non-exported file in `vade` to the same "vade@0.0.0" specifier.
257
+ expect(resolveModuleSpecifier(filePath, projectRoot)).toEqual({
258
+ moduleSpecifier: undefined,
259
+ });
260
+ });
261
+ it('preserves package export subpaths when source files back dist exports', () => {
262
+ const projectRoot = join(testRoot, 'apps/chat');
263
+ const workspacePkgDir = join(testRoot, 'packages/agent');
264
+ const filePath = join(workspacePkgDir, 'src/server.ts');
265
+ writeJson(join(projectRoot, 'package.json'), {
266
+ name: 'chat',
267
+ dependencies: { '@internal/agent': 'workspace:*' },
268
+ });
269
+ writeJson(join(workspacePkgDir, 'package.json'), {
270
+ name: '@internal/agent',
271
+ version: '1.0.0',
272
+ exports: {
273
+ './server': './dist/server.js',
274
+ },
275
+ });
276
+ writeFile(filePath, `'use step';\n`);
277
+ expect(resolveModuleSpecifier(filePath, projectRoot)).toEqual({
278
+ moduleSpecifier: '@internal/agent/server@1.0.0',
279
+ });
280
+ });
239
281
  });
240
- //# sourceMappingURL=module-specifier.test.js.map
282
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kdWxlLXNwZWNpZmllci50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL21vZHVsZS1zcGVjaWZpZXIudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ3hFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDakMsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDMUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDckUsT0FBTyxFQUNMLHlCQUF5QixFQUN6QixhQUFhLEVBQ2Isc0JBQXNCLEdBQ3ZCLE1BQU0sdUJBQXVCLENBQUM7QUFFL0IsU0FBUyxTQUFTLENBQUMsSUFBWSxFQUFFLEtBQWM7SUFDN0MsU0FBUyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQzlDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQy9ELENBQUM7QUFFRCxTQUFTLFNBQVMsQ0FBQyxJQUFZLEVBQUUsUUFBUSxHQUFHLEVBQUU7SUFDNUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQzlDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ3pDLENBQUM7QUFFRCxRQUFRLENBQUMsZUFBZSxFQUFFLEdBQUcsRUFBRTtJQUM3QixJQUFJLFFBQWdCLENB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QUFDLENBQUM7SUFFSCxFQUFFLENBQUMsdUVBQXVFLEVBQUUsR0FBRyxFQUFFO1FBQy9FLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDaEQsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ3pELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxlQUFlLEVBQUUsZUFBZSxDQUFDLENBQUM7UUFFeEQsU0FBUyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsY0FBYyxDQUFDLEVBQUU7WUFDM0MsSUFBSSxFQUFFLE1BQU07WUFDWixZQUFZLEVBQUUsRUFBRSxpQkFBaUIsRUFBRSxhQUFhLEVBQUU7U0FDbkQsQ0FBQyxDQUFDO1FBRUgsU0FBUyxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsY0FBYyxDQUFDLEVBQUU7WUFDL0MsSUFBSSxFQUFFLGlCQUFpQjtZQUN2QixPQUFPLEVBQUUsT0FBTztZQUNoQixPQUFPLEVBQUU7Z0JBQ1AsVUFBVSxFQUFFLGtCQUFrQjthQUMvQjtTQUNGLENBQUMsQ0FBQztRQUVILFNBQVMsQ0FBQyxRQUFRLEVBQUUsZUFBZSxDQUFDLENBQUM7UUFFckMsTUFBTSxDQUFDLHNCQUFzQixDQUFDLFFBQVEsRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztZQUM1RCxlQUFlLEVBQUUsOEJBQThCO1NBQ2hELENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBta2RpclN5bmMsIG1rZHRlbXBTeW5jLCBybVN5bmMsIHdyaXRlRmlsZVN5bmMgfSBmcm9tICdub2RlOmZzJztcbmltcG9ydCB7IHRtcGRpciB9IGZyb20gJ25vZGU6b3MnO1xuaW1wb3J0IHsgZGlybmFtZSwgam9pbiB9IGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgeyBhZnRlckVhY2gsIGJlZm9yZUVhY2gsIGRlc2NyaWJlLCBleHBlY3QsIGl0IH0gZnJvbSAndml0ZXN0JztcbmltcG9ydCB7XG4gIGNsZWFyTW9kdWxlU3BlY2lmaWVyQ2FjaGUsXG4gIGdldEltcG9ydFBhdGgsXG4gIHJlc29sdmVNb2R1bGVTcGVjaWZpZXIsXG59IGZyb20gJy4vbW9kdWxlLXNwZWNpZmllci5qcyc7XG5cbmZ1bmN0aW9uIHdyaXRlSnNvbihwYXRoOiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdm9pZCB7XG4gIG1rZGlyU3luYyhkaXJuYW1lKHBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgd3JpdGVGaWxlU3luYyhwYXRoLCBKU09OLnN0cmluZ2lmeSh2YWx1ZSwgbnVsbCwgMiksICd1dGYtOCcpO1xufVxuXG5mdW5jdGlvbiB3cml0ZUZpbGUocGF0aDogc3RyaW5nLCBjb250ZW50cyA9ICcnKTogdm9pZCB7XG4gIG1rZGlyU3luYyhkaXJuYW1lKHBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgd3JpdGVGaWxlU3luYyhwYXRoLCBjb250ZW50cywgJ3V0Zi04Jyk7XG59XG5cbmRlc2NyaWJlKCdnZXRJbXBvcnRQYXRoJywgKCkgPT4ge1xuICBsZXQgdGVzdFJvb3Q6IHN0cmluZztcblxuICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICBjbGVhck1vZHVsZVNwZWNpZmllckNhY2hlKCk7XG4gICAgdGVzdFJvb3QgPSBta2R0ZW1wU3luYyhqb2luKHRtcGRpcigpLCAnd29ya2Zsb3ctbW9kdWxlLXNwZWNpZmllci0nKSk7XG4gIH0pO1xuXG4gIGFmdGVyRWFjaCgoKSA9PiB7XG4gICAgY2xlYXJNb2R1bGVTcGVjaWZpZXJDYWNoZSgpO1xuICAgIHJtU3luYyh0ZXN0Um9vdCwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICB9KTtcblxuICBpdCgndXNlcyBwYWNrYWdlIHN1YnBhdGggaW1wb3J0IHdoZW4gZmlsZSBtYXRjaGVzIGFuIGV4cG9ydCBzdWJwYXRoJywgKCkgPT4ge1xuICAgIGNvbnN0IHByb2plY3RSb290ID0gam9pbih0ZXN0Um9vdCwgJ2FwcHMvY2hhdCcpO1xuICAgIGNvbnN0IHdvcmtzcGFjZVBrZ0RpciA9IGpvaW4odGVzdFJvb3QsICdwYWNrYWdlcy9hZ2VudCcpO1xuICAgIGNvbnN0IGZpbGVQYXRoID0gam9pbih3b3Jrc3BhY2VQa2dEaXIsICdzcmMvc2VydmVyLnRzJyk7XG5cbiAgICB3cml0ZUpzb24oam9pbihwcm9qZWN0Um9vdCwgJ3BhY2thZ2UuanNvbicpLCB7XG4gICAgICBuYW1lOiAnY2hhdCcsXG4gICAgICBkZXBlbmRlbmNpZXM6IHsgJ0BpbnRlcm5hbC9hZ2VudCc6ICd3b3Jrc3BhY2U6KicgfSxcbiAgICB9KTtcblxuICAgIHdyaXRlSnNvbihqb2luKHdvcmtzcGFjZVBrZ0RpciwgJ3BhY2thZ2UuanNvbicpLCB7XG4gICAgICBuYW1lOiAnQGludGVybmFsL2FnZW50JyxcbiAgICAgIHZlcnNpb246ICcxLjAuMCcsXG4gICAgICBleHBvcnRzOiB7XG4gICAgICAgICcuL3NlcnZlcic6ICcuL3NyYy9zZXJ2ZXIudHMnLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIHdyaXRlRmlsZShmaWxlUGF0aCwgYCd1c2Ugc3RlcCc7XFxuYCk7XG5cbiAgICBleHBlY3QoZ2V0SW1wb3J0UGF0aChmaWxlUGF0aCwgcHJvamVjdFJvb3QpKS50b0VxdWFsKHtcbiAgICAgIGltcG9ydFBhdGg6ICdAaW50ZXJuYWwvYWdlbnQvc2VydmVyJyxcbiAgICAgIGlzUGFja2FnZTogdHJ1ZSxcbiAgICB9KTtcbiAgfSk7XG5cbiAgaXQoJ2ZhbGxzIGJhY2sgdG8gcmVsYXRpdmUgaW1wb3J0IHdoZW4gcGFja2FnZSBoYXMgbm8gcm9vdCBleHBvcnQnLCAoKSA9PiB7XG4gICAgY29uc3QgcHJvamVjdFJvb3QgPSBqb2luKHRlc3RSb290LCAnYXBwcy9jaGF0Jyk7XG4gICAgY29uc3Qgd29ya3NwYWNlUGtnRGlyID0gam9pbih0ZXN0Um9vdCwgJ3BhY2thZ2VzL2FnZW50Jyk7XG4gICAgY29uc3QgZmlsZVBhdGggPSBqb2luKHdvcmtzcGFjZVBrZ0RpciwgJ3NyYy9zZXJ2ZXIudHMnKTtcblxuICAgIHdyaXRlSnNvbihqb2luKHByb2plY3RSb290LCAncGFja2FnZS5qc29uJyksIHtcbiAgICAgIG5hbWU6ICdjaGF0JyxcbiAgICAgIGRlcGVuZGVuY2llczogeyAnQGludGVybmFsL2FnZW50JzogJ3dvcmtzcGFjZToqJyB9LFxuICAgIH0pO1xuXG4gICAgd3JpdGVKc29uKGpvaW4od29ya3NwYWNlUGtnRGlyLCAncGFja2FnZS5qc29uJyksIHtcbiAgICAgIG5hbWU6ICdAaW50ZXJuYWwvYWdlbnQnLFxuICAgICAgdmVyc2lvbjogJzEuMC4wJyxcbiAgICAgIGV4cG9ydHM6IHtcbiAgICAgICAgJy4vc2VydmVyJzogJy4vZGlzdC9zZXJ2ZXIuanMnLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIHdyaXRlRmlsZShmaWxlUGF0aCwgYCd1c2Ugc3RlcCc7XFxuYCk7XG5cbiAgICBleHBlY3QoZ2V0SW1wb3J0UGF0aChmaWxlUGF0aCwgcHJvamVjdFJvb3QpKS50b0VxdWFsKHtcbiAgICAgIGltcG9ydFBhdGg6ICcuLi8uLi9wYWNrYWdlcy9hZ2VudC9zcmMvc2VydmVyLnRzJyxcbiAgICAgIGlzUGFja2FnZTogZmFsc2UsXG4gICAgfSk7XG4gIH0pO1xuXG4gIGl0KCd1c2VzIHBhY2thZ2Ugcm9vdCBpbXBvcnQgZm9yIHJvb3QgZXhwb3J0cycsICgpID0+IHtcbiAgICBjb25zdCBwcm9qZWN0Um9vdCA9IGpvaW4odGVzdFJvb3QsICdhcHBzL2NoYXQnKTtcbiAgICBjb25zdCB3b3Jrc3BhY2VQa2dEaXIgPSBqb2luKHRlc3RSb290LCAncGFja2FnZXMvYWdlbnQnKTtcbiAgICBjb25zdCBmaWxlUGF0aCA9IGpvaW4od29ya3NwYWNlUGtnRGlyLCAnc3JjL2luZGV4LnRzJyk7XG5cbiAgICB3cml0ZUpzb24oam9pbihwcm9qZWN0Um9vdCwgJ3BhY2thZ2UuanNvbicpLCB7XG4gICAgICBuYW1lOiAnY2hhdCcsXG4gICAgICBkZXBlbmRlbmNpZXM6IHsgJ0BpbnRlcm5hbC9hZ2VudCc6ICd3b3Jrc3BhY2U6KicgfSxcbiAgICB9KTtcblxuICAgIHdyaXRlSnNvbihqb2luKHdvcmtzcGFjZVBrZ0RpciwgJ3BhY2thZ2UuanNvbicpLCB7XG4gICAgICBuYW1lOiAnQGludGVybmFsL2FnZW50JyxcbiAgICAgIHZlcnNpb246ICcxLjAuMCcsXG4gICAgICBleHBvcnRzOiB7XG4gICAgICAgICcuJzogJy4vc3JjL2luZGV4LnRzJyxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICB3cml0ZUZpbGUoZmlsZVBhdGgsIGAndXNlIHdvcmtmbG93JztcXG5gKTtcblxuICAgIGV4cGVjdChnZXRJbXBvcnRQYXRoKGZpbGVQYXRoLCBwcm9qZWN0Um9vdCkpLnRvRXF1YWwoe1xuICAgICAgaW1wb3J0UGF0aDogJ0BpbnRlcm5hbC9hZ2VudCcsXG4gICAgICBpc1BhY2thZ2U6IHRydWUsXG4gICAgfSk7XG4gIH0pO1xuXG4gIGl0KCd1c2VzIHBhY2thZ2Ugcm9vdCBpbXBvcnQgd2hlbiBwYWNrYWdlIG1vZHVsZSBwb2ludHMgdG8gZmlsZScsICgpID0+IHtcbiAgICBjb25zdCBwcm9qZWN0Um9vdCA9IGpvaW4odGVzdFJvb3QsICdhcHBzL2NoYXQnKTtcbiAgICBjb25zdCB3b3Jrc3BhY2VQa2dEaXIgPSBqb2luKHRlc3RSb290LCAncGFja2FnZXMvYWdlbnQnKTtcbiAgICBjb25zdCBmaWxlUGF0aCA9IGpvaW4od29ya3NwYWNlUGtnRGlyLCAnc3JjL2luZGV4Lm1qcycpO1xuXG4gICAgd3JpdGVKc29uKGpvaW4ocHJvamVjdFJvb3QsICdwYWNrYWdlLmpzb24nKSwge1xuICAgICAgbmFtZTogJ2NoYXQnLFxuICAgICAgZGVwZW5kZW5jaWVzOiB7ICdAaW50ZXJuYWwvYWdlbnQnOiAnd29ya3NwYWNlOionIH0sXG4gICAgfSk7XG5cbiAgICB3cml0ZUpzb24oam9pbih3b3Jrc3BhY2VQa2dEaXIsICdwYWNrYWdlLmpzb24nKSwge1xuICAgICAgbmFtZTogJ0BpbnRlcm5hbC9hZ2VudCcsXG4gICAgICB2ZXJzaW9uOiAnMS4wLjAnLFxuICAgICAgbW9kdWxlOiAnLi9zcmMvaW5kZXgubWpzJyxcbiAgICAgIG1haW46ICcuL2Rpc3QvaW5kZXguY2pzJyxcbiAgICB9KTtcblxuICAgIHdyaXRlRmlsZShmaWxlUGF0aCwgYCd1c2Ugd29ya2Zsb3cnO1xcbmApO1xuXG4gICAgZXhwZWN0KGdldEltcG9ydFBhdGgoZmlsZVBhdGgsIHByb2plY3RSb290KSkudG9FcXVhbCh7XG4gICAgICBpbXBvcnRQYXRoOiAnQGludGVybmFsL2FnZW50JyxcbiAgICAgIGlzUGFja2FnZTogdHJ1ZSxcbiAgICB9KTtcbiAgfSk7XG5cbiAgaXQoJ3VzZXMgcGFja2FnZSByb290IGltcG9ydCBmb3IgY29uZGl0aW9uYWwgcm9vdCBleHBvcnRzJywgKCkgPT4ge1xuICAgIGNvbnN0IHByb2plY3RSb290ID0gam9pbih0ZXN0Um9vdCwgJ2FwcHMvY2hhdCcpO1xuICAgIGNvbnN0IHdvcmtzcGFjZVBrZ0RpciA9IGpvaW4odGVzdFJvb3QsICdwYWNrYWdlcy9hZ2VudCcpO1xuICAgIGNvbnN0IGZpbGVQYXRoID0gam9pbih3b3Jrc3BhY2VQa2dEaXIsICdzcmMvaW5kZXguanMnKTtcblxuICAgIHdyaXRlSnNvbihqb2luKHByb2plY3RSb290LCAncGFja2FnZS5qc29uJyksIHtcbiAgICAgIG5hbWU6ICdjaGF0JyxcbiAgICAgIGRlcGVuZGVuY2llczogeyAnQGludGVybmFsL2FnZW50JzogJ3dvcmtzcGFjZToqJyB9LFxuICAgIH0pO1xuXG4gICAgd3JpdGVKc29uKGpvaW4od29ya3NwYWNlUGtnRGlyLCAncGFja2FnZS5qc29uJyksIHtcbiAgICAgIG5hbWU6ICdAaW50ZXJuYWwvYWdlbnQnLFxuICAgICAgdmVyc2lvbjogJzEuMC4wJyxcbiAgICAgIGV4cG9ydHM6IHtcbiAgICAgICAgJy4nOiB7XG4gICAgICAgICAgaW1wb3J0OiAnLi9zcmMvaW5kZXgubWpzJyxcbiAgICAgICAgICBkZWZhdWx0OiAnLi9zcmMvaW5kZXguanMnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIHdyaXRlRmlsZShmaWxlUGF0aCwgYCd1c2Ugd29ya2Zsb3cnO1xcbmApO1xuXG4gICAgZXhwZWN0KGdldEltcG9ydFBhdGgoZmlsZVBhdGgsIHByb2plY3RSb290KSkudG9FcXVhbCh7XG4gICAgICBpbXBvcnRQYXRoOiAnQGludGVybmFsL2FnZW50JyxcbiAgICAgIGlzUGFja2FnZTogdHJ1ZSxcbiAgICB9KTtcbiAgfSk7XG5cbiAgaXQoJ2ZhbGxzIGJhY2sgdG8gcmVsYXRpdmUgaW1wb3J0IGZvciBkZWVwIGZpbGVzIGluIHBhY2thZ2VzIHdpdGhvdXQgZXhwb3J0cycsICgpID0+IHtcbiAgICBjb25zdCBwcm9qZWN0Um9vdCA9IGpvaW4odGVzdFJvb3QsICdhcHBzL2NoYXQnKTtcbiAgICBjb25zdCB3b3Jrc3BhY2VQa2dEaXIgPSBqb2luKHRlc3RSb290LCAncGFja2FnZXMvYWdlbnQnKTtcbiAgICBjb25zdCBmaWxlUGF0aCA9IGpvaW4od29ya3NwYWNlUGtnRGlyLCAnbGliL3Rvb2xzL2R5bmFtaWMvd29ya2Zsb3cudHMnKTtcblxuICAgIHdyaXRlSnNvbihqb2luKHByb2plY3RSb290LCAncGFja2FnZS5qc29uJyksIHtcbiAgICAgIG5hbWU6ICdjaGF0JyxcbiAgICAgIGRlcGVuZGVuY2llczogeyAnQGludGVybmFsL2FnZW50JzogJ3dvcmtzcGFjZToqJyB9LFxuICAgIH0pO1xuXG4gICAgd3JpdGVKc29uKGpvaW4od29ya3NwYWNlUGtnRGlyLCAncGFja2FnZS5qc29uJyksIHtcbiAgICAgIG5hbWU6ICdAaW50ZXJuYWwvYWdlbnQnLFxuICAgICAgdmVyc2lvbjogJzEuMC4wJyxcbiAgICB9KTtcblxuICAgIHdyaXRlRmlsZShmaWxlUGF0aCwgYCd1c2Ugd29ya2Zsb3cnO1xcbmApO1xuXG4gICAgZXhwZWN0KGdldEltcG9ydFBhdGgoZmlsZVBhdGgsIHByb2plY3RSb290KSkudG9FcXVhbCh7XG4gICAgICBpbXBvcnRQYXRoOiAnLi4vLi4vcGFja2FnZXMvYWdlbnQvbGliL3Rvb2xzL2R5bmFtaWMvd29ya2Zsb3cudHMnLFxuICAgICAgaXNQYWNrYWdlOiBmYWxzZSxcbiAgICB9KTtcbiAgfSk7XG5cbiAgaXQoJ3VzZXMgcGFja2FnZSByb290IGltcG9ydCB3aGVuIHBhY2thZ2UgbWFpbiBwb2ludHMgdG8gZmlsZScsICgpID0+IHtcbiAgICBjb25zdCBwcm9qZWN0Um9vdCA9IGpvaW4odGVzdFJvb3QsICdhcHBzL2NoYXQnKTtcbiAgICBjb25zdCB3b3Jrc3BhY2VQa2dEaXIgPSBqb2luKHRlc3RSb290LCAncGFja2FnZXMvYWdlbnQnKTtcbiAgICBjb25zdCBmaWxlUGF0aCA9IGpvaW4od29ya3NwYWNlUGtnRGlyLCAnc3JjL2luZGV4LnRzJyk7XG5cbiAgICB3cml0ZUpzb24oam9pbihwcm9qZWN0Um9vdCwgJ3BhY2thZ2UuanNvbicpLCB7XG4gICAgICBuYW1lOiAnY2hhdCcsXG4gICAgICBkZXBlbmRlbmNpZXM6IHsgJ0BpbnRlcm5hbC9hZ2VudCc6ICd3b3Jrc3BhY2U6KicgfSxcbiAgICB9KTtcblxuICAgIHdyaXRlSnNvbihqb2luKHdvcmtzcGFjZVBrZ0RpciwgJ3BhY2thZ2UuanNvbicpLCB7XG4gICAgICBuYW1lOiAnQGludGVybmFsL2FnZW50JyxcbiAgICAgIHZlcnNpb246ICcxLjAuMCcsXG4gICAgICBtYWluOiAnLi9zcmMvaW5kZXgudHMnLFxuICAgIH0pO1xuXG4gICAgd3JpdGVGaWxlKGZpbGVQYXRoLCBgJ3VzZSBzdGVwJztcXG5gKTtcblxuICAgIGV4cGVjdChnZXRJbXBvcnRQYXRoKGZpbGVQYXRoLCBwcm9qZWN0Um9vdCkpLnRvRXF1YWwoe1xuICAgICAgaW1wb3J0UGF0aDogJ0BpbnRlcm5hbC9hZ2VudCcsXG4gICAgICBpc1BhY2thZ2U6IHRydWUsXG4gICAgfSk7XG4gIH0pO1xuXG4gIGl0KCd1c2VzIHBhY2thZ2Ugc3VicGF0aCBpbXBvcnQgZm9yIGRpcmVjdCBub2RlX21vZHVsZXMgZGVwZW5kZW5jaWVzJywgKCkgPT4ge1xuICAgIGNvbnN0IHByb2plY3RSb290ID0gam9pbih0ZXN0Um9vdCwgJ2FwcHMvY2hhdCcpO1xuICAgIGNvbnN0IHBhY2thZ2VEaXIgPSBqb2luKHRlc3RSb290LCAnYXBwcy9jaGF0L25vZGVfbW9kdWxlcy9Ad29ya2Zsb3cvY29yZScpO1xuICAgIGNvbnN0IGZpbGVQYXRoID0gam9pbihwYWNrYWdlRGlyLCAnZGlzdC9zZXJpYWxpemF0aW9uLmpzJyk7XG5cbiAgICB3cml0ZUpzb24oam9pbihwcm9qZWN0Um9vdCwgJ3BhY2thZ2UuanNvbicpLCB7XG4gICAgICBuYW1lOiAnY2hhdCcsXG4gICAgICBkZXBlbmRlbmNpZXM6IHsgJ0B3b3JrZmxvdy9jb3JlJzogJzEuMC4wJyB9LFxuICAgIH0pO1xuXG4gICAgd3JpdGVKc29uKGpvaW4ocGFja2FnZURpciwgJ3BhY2thZ2UuanNvbicpLCB7XG4gICAgICBuYW1lOiAnQHdvcmtmbG93L2NvcmUnLFxuICAgICAgdmVyc2lvbjogJzEuMC4wJyxcbiAgICAgIGV4cG9ydHM6IHtcbiAgICAgICAgJy4vc2VyaWFsaXphdGlvbic6ICcuL2Rpc3Qvc2VyaWFsaXphdGlvbi5qcycsXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgd3JpdGVGaWxlKGZpbGVQYXRoLCBgJ3VzZSB3b3JrZmxvdyc7XFxuYCk7XG5cbiAgICBleHBlY3QoZ2V0SW1wb3J0UGF0aChmaWxlUGF0aCwgcHJvamVjdFJvb3QpKS50b0VxdWFsKHtcbiAgICAgIGltcG9ydFBhdGg6ICdAd29ya2Zsb3cvY29yZS9zZXJpYWxpemF0aW9uJyxcbiAgICAgIGlzUGFja2FnZTogdHJ1ZSxcbiAgICB9KTtcbiAgfSk7XG5cbiAgaXQoJ2ZhbGxzIGJhY2sgdG8gcmVsYXRpdmUgaW1wb3J0IGZvciB0cmFuc2l0aXZlIG5vZGVfbW9kdWxlcyBkZXBlbmRlbmNpZXMnLCAoKSA9PiB7XG4gICAgY29uc3QgcHJvamVjdFJvb3QgPSBqb2luKHRlc3RSb290LCAnYXBwcy9jaGF0Jyk7XG4gICAgY29uc3QgcGFja2FnZURpciA9IGpvaW4odGVzdFJvb3QsICdhcHBzL2NoYXQvbm9kZV9tb2R1bGVzL0B3b3JrZmxvdy9jb3JlJyk7XG4gICAgY29uc3QgZmlsZVBhdGggPSBqb2luKHBhY2thZ2VEaXIsICdkaXN0L3NlcmlhbGl6YXRpb24uanMnKTtcblxuICAgIHdyaXRlSnNvbihqb2luKHByb2plY3RSb290LCAncGFja2FnZS5qc29uJyksIHtcbiAgICAgIG5hbWU6ICdjaGF0JyxcbiAgICAgIGRlcGVuZGVuY2llczogeyB3b3JrZmxvdzogJzEuMC4wJyB9LFxuICAgIH0pO1xuXG4gICAgd3JpdGVKc29uKGpvaW4ocGFja2FnZURpciwgJ3BhY2thZ2UuanNvbicpLCB7XG4gICAgICBuYW1lOiAnQHdvcmtmbG93L2NvcmUnLFxuICAgICAgdmVyc2lvbjogJzEuMC4wJyxcbiAgICAgIGV4cG9ydHM6IHtcbiAgICAgICAgJy4vc2VyaWFsaXphdGlvbic6ICcuL2Rpc3Qvc2VyaWFsaXphdGlvbi5qcycsXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgd3JpdGVGaWxlKGZpbGVQYXRoLCBgJ3VzZSB3b3JrZmxvdyc7XFxuYCk7XG5cbiAgICBleHBlY3QoZ2V0SW1wb3J0UGF0aChmaWxlUGF0aCwgcHJvamVjdFJvb3QpKS50b0VxdWFsKHtcbiAgICAgIGltcG9ydFBhdGg6ICcuL25vZGVfbW9kdWxlcy9Ad29ya2Zsb3cvY29yZS9kaXN0L3NlcmlhbGl6YXRpb24uanMnLFxuICAgICAgaXNQYWNrYWdlOiBmYWxzZSxcbiAgICB9KTtcbiAgfSk7XG5cbiAgaXQoJ3RyZWF0cyBhIHdvcmtzcGFjZSBwYWNrYWdlIGZpbGUgYXMgbG9jYWwgd2hlbiBwcm9qZWN0Um9vdCBpcyB0aGUgcGFja2FnZSBpdHNlbGYnLCAoKSA9PiB7XG4gICAgY29uc3QgcHJvamVjdFJvb3QgPSBqb2luKHRlc3RSb290LCAncGFja2FnZXMvdmFkZScpO1xuICAgIGNvbnN0IGZpbGVQYXRoID0gam9pbihcbiAgICAgIHByb2plY3RSb290LFxuICAgICAgJ3NyYy9pbnRlcm5hbC9tZXNzYWdlL3dvcmtmbG93L2hhbmRsZS1tZXNzYWdlLnRzJ1xuICAgICk7XG5cbiAgICB3cml0ZUpzb24oam9pbihwcm9qZWN0Um9vdCwgJ3BhY2thZ2UuanNvbicpLCB7XG4gICAgICBuYW1lOiAndmFkZScsXG4gICAgICB2ZXJzaW9uOiAnMC4wLjAnLFxuICAgIH0pO1xuXG4gICAgd3JpdGVGaWxlKGZpbGVQYXRoLCBgJ3VzZSB3b3JrZmxvdyc7XFxuYCk7XG5cbiAgICBleHBlY3QocmVzb2x2ZU1vZHVsZVNwZWNpZmllcihmaWxlUGF0aCwgcHJvamVjdFJvb3QpKS50b0VxdWFsKHtcbiAgICAgIG1vZHVsZVNwZWNpZmllcjogdW5kZWZpbmVkLFxuICAgIH0pO1xuICB9KTtcblxuICBpdCgndXNlcyBwYWNrYWdlIHNwZWNpZmllcnMgZm9yIHdvcmtzcGFjZSBwYWNrYWdlIHJvb3QgZW50cnlwb2ludCBpZHMnLCAoKSA9PiB7XG4gICAgY29uc3QgcHJvamVjdFJvb3QgPSBqb2luKHRlc3RSb290LCAnYXBwcy9jaGF0Jyk7XG4gICAgY29uc3QgcGFja2FnZURpciA9IGpvaW4odGVzdFJvb3QsICdwYWNrYWdlcy92YWRlJyk7XG4gICAgY29uc3QgZmlsZVBhdGggPSBqb2luKHBhY2thZ2VEaXIsICdzcmMvaW5kZXgudHMnKTtcblxuICAgIHdyaXRlSnNvbihqb2luKHByb2plY3RSb290LCAncGFja2FnZS5qc29uJyksIHtcbiAgICAgIG5hbWU6ICdjaGF0JyxcbiAgICAgIGRlcGVuZGVuY2llczogeyB2YWRlOiAnd29ya3NwYWNlOionIH0sXG4gICAgfSk7XG5cbiAgICB3cml0ZUpzb24oam9pbihwYWNrYWdlRGlyLCAncGFja2FnZS5qc29uJyksIHtcbiAgICAgIG5hbWU6ICd2YWRlJyxcbiAgICAgIHZlcnNpb246ICcwLjAuMCcsXG4gICAgICBtYWluOiAnLi9zcmMvaW5kZXgudHMnLFxuICAgIH0pO1xuXG4gICAgd3JpdGVGaWxlKGZpbGVQYXRoLCBgJ3VzZSB3b3JrZmxvdyc7XFxuYCk7XG5cbiAgICBleHBlY3QocmVzb2x2ZU1vZHVsZVNwZWNpZmllcihmaWxlUGF0aCwgcHJvamVjdFJvb3QpKS50b0VxdWFsKHtcbiAgICAgIG1vZHVsZVNwZWNpZmllcjogJ3ZhZGVAMC4wLjAnLFxuICAgIH0pO1xuICB9KTtcblxuICBpdCgncmV0dXJucyB1bmRlZmluZWQgZm9yIG5vbi1leHBvcnRlZCB3b3Jrc3BhY2UgcGFja2FnZSBmaWxlcycsICgpID0+IHtcbiAgICBjb25zdCBwcm9qZWN0Um9vdCA9IGpvaW4odGVzdFJvb3QsICdhcHBzL2NoYXQnKTtcbiAgICBjb25zdCBwYWNrYWdlRGlyID0gam9pbih0ZXN0Um9vdCwgJ3BhY2thZ2VzL3ZhZGUnKTtcbiAgICBjb25zdCBmaWxlUGF0aCA9IGpvaW4oXG4gICAgICBwYWNrYWdlRGlyLFxuICAgICAgJ3NyYy9pbnRlcm5hbC9tZXNzYWdlL3dvcmtmbG93L2hhbmRsZS1tZXNzYWdlLnRzJ1xuICAgICk7XG5cbiAgICB3cml0ZUpzb24oam9pbihwcm9qZWN0Um9vdCwgJ3BhY2thZ2UuanNvbicpLCB7XG4gICAgICBuYW1lOiAnY2hhdCcsXG4gICAgICBkZXBlbmRlbmNpZXM6IHsgdmFkZTogJ3dvcmtzcGFjZToqJyB9LFxuICAgIH0pO1xuXG4gICAgd3JpdGVKc29uKGpvaW4ocGFja2FnZURpciwgJ3BhY2thZ2UuanNvbicpLCB7XG4gICAgICBuYW1lOiAndmFkZScsXG4gICAgICB2ZXJzaW9uOiAnMC4wLjAnLFxuICAgIH0pO1xuXG4gICAgd3JpdGVGaWxlKGZpbGVQYXRoLCBgJ3VzZSB3b3JrZmxvdyc7XFxuYCk7XG5cbiAgICAvLyBOb24tZXhwb3J0ZWQgcGFja2FnZSBmaWxlcyBmYWxsIGJhY2sgdG8gdGhlIHJlbGF0aXZlLWZpbGUtcGF0aCBJRFxuICAgIC8vICh0aGUgU1dDIHBsdWdpbiB1c2VzIFwiLi97ZmlsZX1cIiB3aGVuIG1vZHVsZVNwZWNpZmllciBpcyB1bmRlZmluZWQpLlxuICAgIC8vIFRoaXMga2VlcHMgSURzIHVuaXF1ZSBwZXIgZmlsZSBhY3Jvc3MgdGhlIGJ1aWxkIGluc3RlYWQgb2YgY29sbGFwc2luZ1xuICAgIC8vIGV2ZXJ5IG5vbi1leHBvcnRlZCBmaWxlIGluIGB2YWRlYCB0byB0aGUgc2FtZSBcInZhZGVAMC4wLjBcIiBzcGVjaWZpZXIuXG4gICAgZXhwZWN0KHJlc29sdmVNb2R1bGVTcGVjaWZpZXIoZmlsZVBhdGgsIHByb2plY3RSb290KSkudG9FcXVhbCh7XG4gICAgICBtb2R1bGVTcGVjaWZpZXI6IHVuZGVmaW5lZCxcbiAgICB9KTtcbiAgfSk7XG5cbiAgaXQoJ3ByZXNlcnZlcyBwYWNrYWdlIGV4cG9ydCBzdWJwYXRocyB3aGVuIHNvdXJjZSBmaWxlcyBiYWNrIGRpc3QgZXhwb3J0cycsICgpID0+IHtcbiAgICBjb25zdCBwcm9qZWN0Um9vdCA9IGpvaW4odGVzdFJvb3QsICdhcHBzL2NoYXQnKTtcbiAgICBjb25zdCB3b3Jrc3BhY2VQa2dEaXIgPSBqb2luKHRlc3RSb290LCAncGFja2FnZXMvYWdlbnQnKTtcbiAgICBjb25zdCBmaWxlUGF0aCA9IGpvaW4od29ya3NwYWNlUGtnRGlyLCAnc3JjL3NlcnZlci50cycpO1xuXG4gICAgd3JpdGVKc29uKGpvaW4ocHJvamVjdFJvb3QsICdwYWNrYWdlLmpzb24nKSwge1xuICAgICAgbmFtZTogJ2NoYXQnLFxuICAgICAgZGVwZW5kZW5jaWVzOiB7ICdAaW50ZXJuYWwvYWdlbnQnOiAnd29ya3NwYWNlOionIH0sXG4gICAgfSk7XG5cbiAgICB3cml0ZUpzb24oam9pbih3b3Jrc3BhY2VQa2dEaXIsICdwYWNrYWdlLmpzb24nKSwge1xuICAgICAgbmFtZTogJ0BpbnRlcm5hbC9hZ2VudCcsXG4gICAgICB2ZXJzaW9uOiAnMS4wLjAnLFxuICAgICAgZXhwb3J0czoge1xuICAgICAgICAnLi9zZXJ2ZXInOiAnLi9kaXN0L3NlcnZlci5qcycsXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgd3JpdGVGaWxlKGZpbGVQYXRoLCBgJ3VzZSBzdGVwJztcXG5gKTtcblxuICAgIGV4cGVjdChyZXNvbHZlTW9kdWxlU3BlY2lmaWVyKGZpbGVQYXRoLCBwcm9qZWN0Um9vdCkpLnRvRXF1YWwoe1xuICAgICAgbW9kdWxlU3BlY2lmaWVyOiAnQGludGVybmFsL2FnZW50L3NlcnZlckAxLjAuMCcsXG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=
@@ -1 +1 @@
1
- {"version":3,"file":"node-module-esbuild-plugin.d.ts","sourceRoot":"","sources":["../src/node-module-esbuild-plugin.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,KAAK,OAAO,MAAM,SAAS,CAAC;AA2BxC;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,iBAoB9C;AAwCD;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,UAEzC;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,sBAkCtD;AAyED;;;;;;GAMG;AACH,wBAAsB,oBAAoB,CACxC,GAAG,EAAE,MAAM,EACX,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,MAAM;;;;;;eAkDpB;AAcD;;;;GAIG;AACH,wBAAgB,2BAA2B,IAAI,OAAO,CAAC,MAAM,CAkK5D"}
1
+ {"version":3,"file":"node-module-esbuild-plugin.d.ts","sourceRoot":"","sources":["../src/node-module-esbuild-plugin.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,KAAK,OAAO,MAAM,SAAS,CAAC;AA2BxC;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,iBAoB9C;AAwCD;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,UAEzC;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,sBAkCtD;AAyED;;;;;;GAMG;AACH,wBAAsB,oBAAoB,CACxC,GAAG,EAAE,MAAM,EACX,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,MAAM;;;;;;eAkDpB;AAcD;;;;GAIG;AACH,wBAAgB,2BAA2B,IAAI,OAAO,CAAC,MAAM,CAyN5D"}
@@ -252,6 +252,14 @@ export function createNodeModuleErrorPlugin() {
252
252
  const importParents = new Map();
253
253
  const packageViolations = [];
254
254
  const seenViolations = new Set();
255
+ // Enable the esbuild metafile so we can inspect which Node.js / Bun
256
+ // built-in imports actually survive tree-shaking. We need this to
257
+ // suppress false positives where a shared module has a workflow-safe
258
+ // export alongside a step-only export that references Node.js builtins
259
+ // — esbuild's tree-shaker can drop the step-only branch, but `onResolve`
260
+ // fires before tree-shaking, so we defer the final error decision to
261
+ // `onEnd` (see the metafile-based filter below).
262
+ build.initialOptions.metafile = true;
255
263
  // Track ALL import relationships to build the dependency graph.
256
264
  // This is necessary to trace transitive dependencies back to user code.
257
265
  // Performance impact is minimal as we only store path mappings.
@@ -321,9 +329,14 @@ export function createNodeModuleErrorPlugin() {
321
329
  const filteredChain = chain.filter((path) => !path.includes('node_modules'));
322
330
  const workflowFile = filteredChain[0] ?? importerPath;
323
331
  if (!workflowFile || workflowFile.includes('node_modules')) {
332
+ // Mark builtin imports as side-effect-free so esbuild can tree-shake
333
+ // them when they're only referenced by dead (e.g. step-only) code
334
+ // paths in shared modules. The onEnd filter below uses the metafile
335
+ // to decide which imports actually survive.
324
336
  return {
325
337
  path: args.path,
326
338
  external: true,
339
+ sideEffects: false,
327
340
  };
328
341
  }
329
342
  const packageName = importerPath.includes('node_modules')
@@ -347,36 +360,73 @@ export function createNodeModuleErrorPlugin() {
347
360
  });
348
361
  }
349
362
  }
363
+ // Mark builtin imports as side-effect-free so esbuild can tree-shake
364
+ // them when they're only referenced by dead (e.g. step-only) code
365
+ // paths in shared modules. The onEnd filter below uses the metafile
366
+ // to decide which imports actually survive.
350
367
  return {
351
368
  path: args.path,
352
369
  external: true,
370
+ sideEffects: false,
353
371
  };
354
372
  });
355
- // Report all violations at the end of the build
356
- build.onEnd(() => {
357
- if (packageViolations.length > 0) {
358
- return {
359
- errors: packageViolations.map((violation) => {
360
- const isBuiltinModule = runtimeModulesRegex.test(violation.packageName);
361
- const moduleType = getModuleTypeLabel(violation.path);
362
- // Different messages for built-in modules vs npm packages that use them
363
- const text = isBuiltinModule
364
- ? `You are attempting to use "${violation.packageName}" which is a ${moduleType} module. ${moduleType} modules are not available in workflow functions.\n\nLearn more: https://workflow-sdk.dev/err/${ERROR_SLUGS.NODE_JS_MODULE_IN_WORKFLOW}`
365
- : `You are attempting to use "${violation.packageName}" which depends on ${moduleType} modules. Packages that depend on ${moduleType} modules are not available in workflow functions.\n\nLearn more: https://workflow-sdk.dev/err/${ERROR_SLUGS.NODE_JS_MODULE_IN_WORKFLOW}`;
366
- return {
367
- text,
368
- location: violation.location
369
- ? {
370
- ...violation.location,
371
- suggestion: 'Move this function into a step function.',
372
- }
373
- : undefined,
374
- };
375
- }),
376
- };
373
+ // Report violations at the end of the build, filtered to only those
374
+ // whose Node.js / Bun builtin imports actually survived tree-shaking.
375
+ //
376
+ // `onResolve` fires during module loading, before esbuild's tree-shaker
377
+ // runs. That means a shared module whose step-only export references a
378
+ // builtin will record a violation even if the workflow never touches
379
+ // that export. By marking builtin imports as `sideEffects: false` in
380
+ // `onResolve` above, esbuild can drop such imports from the output.
381
+ // Here we consult the metafile to see which builtin imports remain
382
+ // in the emitted bundle and only report those.
383
+ build.onEnd((result) => {
384
+ if (packageViolations.length === 0)
385
+ return;
386
+ const survivingBuiltins = new Set();
387
+ const outputs = result.metafile?.outputs;
388
+ if (outputs) {
389
+ for (const output of Object.values(outputs)) {
390
+ for (const imp of output.imports) {
391
+ // External imports in the metafile are recorded with the path
392
+ // that was returned from `onResolve` (e.g. "node:fs/promises",
393
+ // "fs", "bun:sqlite"). Only collect the ones that match
394
+ // Node.js / Bun builtins.
395
+ if (imp.external && runtimeModulesRegex.test(imp.path)) {
396
+ survivingBuiltins.add(imp.path);
397
+ }
398
+ }
399
+ }
377
400
  }
401
+ // If the metafile is unavailable for some reason, fall back to
402
+ // reporting all recorded violations so we never silently suppress
403
+ // real ones.
404
+ const liveViolations = outputs
405
+ ? packageViolations.filter((violation) => survivingBuiltins.has(violation.path))
406
+ : packageViolations;
407
+ if (liveViolations.length === 0)
408
+ return;
409
+ return {
410
+ errors: liveViolations.map((violation) => {
411
+ const isBuiltinModule = runtimeModulesRegex.test(violation.packageName);
412
+ const moduleType = getModuleTypeLabel(violation.path);
413
+ // Different messages for built-in modules vs npm packages that use them
414
+ const text = isBuiltinModule
415
+ ? `You are attempting to use "${violation.packageName}" which is a ${moduleType} module. ${moduleType} modules are not available in workflow functions.\n\nLearn more: https://workflow-sdk.dev/err/${ERROR_SLUGS.NODE_JS_MODULE_IN_WORKFLOW}`
416
+ : `You are attempting to use "${violation.packageName}" which depends on ${moduleType} modules. Packages that depend on ${moduleType} modules are not available in workflow functions.\n\nLearn more: https://workflow-sdk.dev/err/${ERROR_SLUGS.NODE_JS_MODULE_IN_WORKFLOW}`;
417
+ return {
418
+ text,
419
+ location: violation.location
420
+ ? {
421
+ ...violation.location,
422
+ suggestion: 'Move this function into a step function.',
423
+ }
424
+ : undefined,
425
+ };
426
+ }),
427
+ };
378
428
  });
379
429
  },
380
430
  };
381
431
  }
382
- //# sourceMappingURL=node-module-esbuild-plugin.js.map
432
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS1tb2R1bGUtZXNidWlsZC1wbHVnaW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvbm9kZS1tb2R1bGUtZXNidWlsZC1wbHVnaW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUN6RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3RDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUMvQyxPQUFPLGNBQWMsTUFBTSxpQkFBaUIsQ0FBQztBQUM3QyxPQUFPLHVCQUF1QixNQUFNLGtCQUFrQixDQUFDO0FBR3ZELE1BQU0sZUFBZSxHQUFHLFNBQVMsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO0FBRTNELDZDQUE2QztBQUM3Qyw4Q0FBOEM7QUFDOUMsb0RBQW9EO0FBQ3BELCtEQUErRDtBQUMvRCxNQUFNLGtCQUFrQixHQUFHLElBQUksY0FBYyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDO0FBRTNELHFCQUFxQjtBQUNyQix3QkFBd0I7QUFDeEIsb0RBQW9EO0FBQ3BELE1BQU0sZUFBZSxHQUFHLFdBQVcsQ0FBQztBQUVwQyxrREFBa0Q7QUFDbEQsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLE1BQU0sQ0FDcEMsYUFBYSxrQkFBa0IsY0FBYyxDQUM5QyxDQUFDO0FBU0Y7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxjQUFjLENBQUMsUUFBZ0I7SUFDN0MsTUFBTSxVQUFVLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDaEQsTUFBTSxNQUFNLEdBQUcsZ0JBQWdCLENBQUM7SUFDaEMsTUFBTSxHQUFHLEdBQUcsVUFBVSxDQUFDLFdBQVcsQ0FBQyxN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RSxFQUFFLENBQ3JDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQ3RDO29CQUNILENBQUMsQ0FBQyxpQkFBaUIsQ0FBQztnQkFFdEIsSUFBSSxjQUFjLENBQUMsTUFBTSxLQUFLLENBQUM7b0JBQUUsT0FBTztnQkFFeEMsT0FBTztvQkFDTCxNQUFNLEVBQUUsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFO3dCQUN2QyxNQUFNLGVBQWUsR0FBRyxtQkFBbUIsQ0FBQyxJQUFJLENBQzlDLFNBQVMsQ0FBQyxXQUFXLENBQ3RCLENBQUM7d0JBQ0YsTUFBTSxVQUFVLEdBQUcsa0JBQWtCLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO3dCQUV0RCx3RUFBd0U7d0JBQ3hFLE1BQU0sSUFBSSxHQUFHLGVBQWU7NEJBQzFCLENBQUMsQ0FBQyw4QkFBOEIsU0FBUyxDQUFDLFdBQVcsZ0JBQWdCLFVBQVUsWUFBWSxVQUFVLGlHQUFpRyxXQUFXLENBQUMsMEJBQTBCLEVBQUU7NEJBQzlPLENBQUMsQ0FBQyw4QkFBOEIsU0FBUyxDQUFDLFdBQVcsc0JBQXNCLFVBQVUscUNBQXFDLFVBQVUsaUdBQWlHLFdBQVcsQ0FBQywwQkFBMEIsRUFBRSxDQUFDO3dCQUVoUixPQUFPOzRCQUNMLElBQUk7NEJBQ0osUUFBUSxFQUFFLFNBQVMsQ0FBQyxRQUFRO2dDQUMxQixDQUFDLENBQUM7b0NBQ0UsR0FBRyxTQUFTLENBQUMsUUFBUTtvQ0FDckIsVUFBVSxFQUFFLDBDQUEwQztpQ0FDdkQ7Z0NBQ0gsQ0FBQyxDQUFDLFNBQVM7eUJBQ2QsQ0FBQztvQkFDSixDQUFDLENBQUM7aUJBQ0gsQ0FBQztZQUNKLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztLQUNGLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcmVhZEZpbGUgfSBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCB7IG5vcm1hbGl6ZSwgcmVsYXRpdmUsIHJlc29sdmUgfSBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHsgcHJvbWlzaWZ5IH0gZnJvbSAnbm9kZTp1dGlsJztcbmltcG9ydCB7IEVSUk9SX1NMVUdTIH0gZnJvbSAnQHdvcmtmbG93L2Vycm9ycyc7XG5pbXBvcnQgYnVpbHRpbk1vZHVsZXMgZnJvbSAnYnVpbHRpbi1tb2R1bGVzJztcbmltcG9ydCBlbmhhbmNlZFJlc29sdmVPcmlnaW5hbCBmcm9tICdlbmhhbmNlZC1yZXNvbHZlJztcbmltcG9ydCB0eXBlICogYXMgZXNidWlsZCBmcm9tICdlc2J1aWxkJztcblxuY29uc3QgZW5oYW5jZWRSZXNvbHZlID0gcHJvbWlzaWZ5KGVuaGFuY2VkUmVzb2x2ZU9yaWdpbmFsKTtcblxuLy8gTWF0Y2ggZXhhY3QgTm9kZS5qcyBidWlsdC1pbiBtb2R1bGUgbmFtZXM6XG4vLyAtIFwiZnNcIiwgXCJwYXRoXCIsIFwic3RyZWFtXCIgZXRjLiAoZXhhY3QgbWF0Y2gpXG4vLyAtIFwibm9kZTpmc1wiLCBcIm5vZGU6cGF0aFwiIGV0Yy4gKHdpdGggbm9kZTogcHJlZml4KVxuLy8gQnV0IE5PVCBcInNvbWUtcGFja2FnZS9zdHJlYW1cIiBvciBcImV2ZW50c291cmNlLXBhcnNlci9zdHJlYW1cIlxuY29uc3Qgbm9kZU1vZHVsZXNQYXR0ZXJuID0gYCgke2J1aWx0aW5Nb2R1bGVzLmpvaW4oJ3wnKX0pYDtcblxuLy8gTWF0Y2ggQnVuIG1vZHVsZXM6XG4vLyAtIFwiYnVuXCIgKGV4YWN0IG1hdGNoKVxuLy8gLSBcImJ1bjpzcWxpdGVcIiwgXCJidW46ZmZpXCIgZXRjLiAod2l0aCBidW46IHByZWZpeClcbmNvbnN0IGJ1bk1vZHVsZXNSZWdleCA9IC9eYnVuKDp8JCkvO1xuXG4vLyBDb21iaW5lZCByZWdleCBmb3IgYm90aCBOb2RlLmpzIGFuZCBCdW4gbW9kdWxlc1xuY29uc3QgcnVudGltZU1vZHVsZXNSZWdleCA9IG5ldyBSZWdFeHAoXG4gIGBeKChub2RlOik/JHtub2RlTW9kdWxlc1BhdHRlcm59fGJ1big6LiopPykkYFxuKTtcblxudHlwZSBQYWNrYWdlVmlvbGF0aW9uID0ge1xuICBwYWNrYWdlTmFtZTogc3RyaW5nO1xuICBpbXBvcnRlcjogc3RyaW5nO1xuICBwYXRoOiBzdHJpbmc7XG4gIGxvY2F0aW9uOiBQYXJ0aWFsPGVzYnVpbGQuTG9jYXRpb24+O1xufTtcblxuLyoqXG4gKiBHZXQgdGhlIHBhY2thZ2UgbmFtZSBmcm9tIGEgZmlsZSBwYXRoLlxuICogQHBhcmFtIGZpbGVQYXRoIC0gVGhlIGZpbGUgcGF0aCB0byBnZXQgdGhlIHBhY2thZ2UgbmFtZSBmcm9tLlxuICogQHJldHVybnMgVGhlIHBhY2thZ2UgbmFtZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFBhY2thZ2VOYW1lKGZpbGVQYXRoOiBzdHJpbmcpIHtcbiAgY29uc3Qgbm9ybWFsaXplZCA9IGZpbGVQYXRoLnJlcGxhY2UoL1xcXFwvZywgJy8nKTtcbiAgY29uc3QgbWFya2VyID0gJy9ub2RlX21vZHVsZXMvJztcbiAgY29uc3QgaWR4ID0gbm9ybWFsaXplZC5sYXN0SW5kZXhPZihtYXJrZXIpO1xuICBpZiAoaWR4ID09PSAtMSkgcmV0dXJuIG51bGw7XG5cbiAgY29uc3QgYWZ0ZXIgPSBub3JtYWxpemVkLnNsaWNlKGlkeCArIG1hcmtlci5sZW5ndGgpOyAvLyBlLmcuIFwiLnBucG0vbm9kZS1mZXRjaEAzLjMuMi9ub2RlX21vZHVsZXMvbm9kZS1mZXRjaC9zcmMvaW5kZXguanNcIlxuICBjb25zdCBzZWdtZW50cyA9IGFmdGVyLnNwbGl0KCcvJyk7XG4gIGlmICghc2VnbWVudHMubGVuZ3RoKSByZXR1cm4gbnVsbDtcblxuICBsZXQgcGFja2FnZU5hbWUgPSBzZWdtZW50c1swXTtcblxuICAvLyBwbnBtIG5lc3RzOiBcIi5wbnBtLzxwa2c+QDx2ZXJzaW9uPi9ub2RlX21vZHVsZXMvPHBrZz4vLi4uXCJcbiAgaWYgKHBhY2thZ2VOYW1lID09PSAnLnBucG0nICYmIHNlZ21lbnRzLmxlbmd0aCA+PSAzKSB7XG4gICAgcGFja2FnZU5hbWUgPSBzZWdtZW50c1syXTtcbiAgfSBlbHNlIGlmIChwYWNrYWdlTmFtZS5zdGFydHNXaXRoKCdAJykgJiYgc2VnbWVudHMubGVuZ3RoID49IDIpIHtcbiAgICBwYWNrYWdlTmFtZSA9IGAke3NlZ21lbnRzWzBdfS8ke3NlZ21lbnRzWzFdfWA7XG4gIH1cblxuICByZXR1cm4gcGFja2FnZU5hbWU7XG59XG5cbi8qKlxuICogR2V0IHRoZSBwYWNrYWdlIG5hbWUgZnJvbSBhbiBpbXBvcnQgc3BlY2lmaWVyLlxuICogQHBhcmFtIHNwZWNpZmllciAtIFRoZSBpbXBvcnQgc3BlY2lmaWVyIHRvIHBhcnNlLlxuICogQHJldHVybnMgVGhlIHBhY2thZ2UgbmFtZSAoZm9yIGJhcmUgcGFja2FnZSBpbXBvcnRzKSwgb3RoZXJ3aXNlIG51bGwuXG4gKi9cbmZ1bmN0aW9uIGdldFBhY2thZ2VOYW1lRnJvbVNwZWNpZmllcihzcGVjaWZpZXI6IHN0cmluZykge1xuICAvLyBOb3QgYSBiYXJlIHBhY2thZ2Ugc3BlY2lmaWVyIChyZWxhdGl2ZSwgYWJzb2x1dGUsIG9yIFVSTC1saWtlKVxuICBpZiAoXG4gICAgIXNwZWNpZmllciB8fFxuICAgIHNwZWNpZmllci5zdGFydHNXaXRoKCcuJykgfHxcbiAgICBzcGVjaWZpZXIuc3RhcnRzV2l0aCgnLycpIHx8XG4gICAgL15bQS1aYS16XTpbXFxcXC9dLy50ZXN0KHNwZWNpZmllcilcbiAgKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvLyBJZ25vcmUgcnVudGltZSBidWlsdC1pbnMgYW5kIFVSTC1saWtlIHNwZWNpZmllcnNcbiAgaWYgKFxuICAgIHJ1bnRpbWVNb2R1bGVzUmVnZXgudGVzdChzcGVjaWZpZXIpIHx8XG4gICAgc3BlY2lmaWVyLmluY2x1ZGVzKCc6Ly8nKSB8fFxuICAgIHNwZWNpZmllci5zdGFydHNXaXRoKCcjJylcbiAgKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBub3JtYWxpemVkID0gc3BlY2lmaWVyLnJlcGxhY2UoL1xcXFwvZywgJy8nKTtcbiAgaWYgKG5vcm1hbGl6ZWQuc3RhcnRzV2l0aCgnQCcpKSB7XG4gICAgY29uc3QgW3Njb3BlLCBuYW1lXSA9IG5vcm1hbGl6ZWQuc3BsaXQoJy8nKTtcbiAgICBpZiAoIXNjb3BlIHx8ICFuYW1lKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGAke3Njb3BlfS8ke25hbWV9YDtcbiAgfVxuXG4gIGNvbnN0IFtuYW1lXSA9IG5vcm1hbGl6ZWQuc3BsaXQoJy8nKTtcbiAgcmV0dXJuIG5hbWUgPz8gbnVsbDtcbn1cblxuLyoqXG4gKiBFc2NhcGUgYSByZWd1bGFyIGV4cHJlc3Npb24gc3RyaW5nLlxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHN0cmluZyB0byBlc2NhcGUuXG4gKiBAcmV0dXJucyBUaGUgZXNjYXBlZCBzdHJpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlc2NhcGVSZWdFeHAodmFsdWU6IHN0cmluZykge1xuICByZXR1cm4gdmFsdWUucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xcXVxcXFxdL2csICdcXFxcJCYnKTtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIGltcG9ydGVkIGlkZW50aWZpZXIgZnJvbSBhIHNwZWNpZmllci5cbiAqIEBwYXJhbSBzcGVjaWZpZXIgLSBUaGUgc3BlY2lmaWVyIHRvIGdldCB0aGUgaW1wb3J0ZWQgaWRlbnRpZmllciBmcm9tLlxuICogQHJldHVybnMgVGhlIGltcG9ydGVkIGlkZW50aWZpZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRJbXBvcnRlZElkZW50aWZpZXIoc3BlY2lmaWVyOiBzdHJpbmcpIHtcbiAgY29uc3QgbmFtZXNwYWNlTWF0Y2ggPSBzcGVjaWZpZXIubWF0Y2goL1xcKlxccythc1xccysoW0EtWmEtejAtOV8kXSspLyk7XG4gIGlmIChuYW1lc3BhY2VNYXRjaCkge1xuICAgIHJldHVybiBuYW1lc3BhY2VNYXRjaFsxXTtcbiAgfVxuXG4gIGlmIChzcGVjaWZpZXIuaW5jbHVkZXMoJ3snKSkge1xuICAgIGNvbnN0IGluc2lkZSA9IHNwZWNpZmllci5yZXBsYWNlKC9eW157XSpcXHsvLCAnJykucmVwbGFjZSgvXFx9LiokLywgJycpO1xuICAgIGNvbnN0IGZpcnN0TmFtZWQgPSBpbnNpZGVcbiAgICAgIC5zcGxpdCgnLCcpXG4gICAgICAubWFwKCh0b2tlbikgPT4gdG9rZW4udHJpbSgpKVxuICAgICAgLmZpbmQoQm9vbGVhbik7XG5cbiAgICBpZiAoZmlyc3ROYW1lZCkge1xuICAgICAgY29uc3QgYWxpYXNNYXRjaCA9IGZpcnN0TmFtZWQubWF0Y2goXG4gICAgICAgIC8oW0EtWmEtejAtOV8kXSspXFxzK2FzXFxzKyhbQS1aYS16MC05XyRdKykvXG4gICAgICApO1xuICAgICAgaWYgKGFsaWFzTWF0Y2gpIHtcbiAgICAgICAgcmV0dXJuIGFsaWFzTWF0Y2hbMl07XG4gICAgICB9XG4gICAgICAvLyBWYWxpZGF0ZSB0aGF0IGZpcnN0TmFtZWQgaXMgYSB2YWxpZCBpZGVudGlmaWVyIChub3QgZW1wdHkgYnJhY2VzIG9yIHdoaXRlc3BhY2UpXG4gICAgICBjb25zdCBpZGVudGlmaWVyTWF0Y2ggPSBmaXJzdE5hbWVkLm1hdGNoKC9eW0EtWmEtel8kXVtBLVphLXowLTlfJF0qLyk7XG4gICAgICBpZiAoaWRlbnRpZmllck1hdGNoKSB7XG4gICAgICAgIHJldHVybiBpZGVudGlmaWVyTWF0Y2hbMF07XG4gICAgICB9XG4gICAgfVxuICAgIC8vIEVtcHR5IGJyYWNlcyBvciBubyB2YWxpZCBpZGVudGlmaWVyIGZvdW5kIC0gcmV0dXJuIHVuZGVmaW5lZFxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBjb25zdCBkZWZhdWx0UGFydCA9IHNwZWNpZmllci5zcGxpdCgnLCcpWzBdPy50cmltKCk7XG4gIGlmIChkZWZhdWx0UGFydCAmJiBkZWZhdWx0UGFydCAhPT0gJyonKSB7XG4gICAgcmV0dXJuIGRlZmF1bHRQYXJ0O1xuICB9XG59XG5cbi8qKlxuICogRmluZCB0aGUgdXNhZ2Ugb2YgYW4gaWRlbnRpZmllciBpbiBhIGxpc3Qgb2YgbGluZXMuXG4gKiBAcGFyYW0gbGluZXMgLSBUaGUgbGlzdCBvZiBsaW5lcyB0byBzZWFyY2ggaW4uXG4gKiBAcGFyYW0gc3RhcnRJbmRleCAtIFRoZSBpbmRleCB0byBzdGFydCBzZWFyY2hpbmcgZnJvbS5cbiAqIEBwYXJhbSBpZGVudGlmaWVyIC0gVGhlIGlkZW50aWZpZXIgdG8gc2VhcmNoIGZvci5cbiAqIEByZXR1cm5zIFRoZSB1c2FnZSBvZiB0aGUgaWRlbnRpZmllci5cbiAqL1xuZnVuY3Rpb24gZmluZElkZW50aWZpZXJVc2FnZShcbiAgbGluZXM6IHN0cmluZ1tdLFxuICBzdGFydEluZGV4OiBudW1iZXIsXG4gIGlkZW50aWZpZXI6IHN0cmluZ1xuKSB7XG4gIGNvbnN0IHVzYWdlUmVnZXggPSBuZXcgUmVnRXhwKGBcXFxcYiR7ZXNjYXBlUmVnRXhwKGlkZW50aWZpZXIpfVxcXFxiYCk7XG4gIGxldCBpbkJsb2NrQ29tbWVudCA9IGZhbHNlO1xuXG4gIGZvciAobGV0IGkgPSBzdGFydEluZGV4OyBpIDwgbGluZXMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAvLyBTdHJpcCBzdHJpbmcgbGl0ZXJhbHMgZmlyc3Qgc28gdGhhdCBjb21tZW50IGRlbGltaXRlcnMgaW5zaWRlIHN0cmluZ3NcbiAgICAvLyAoZS5nLiBgY29uc3QgcyA9IFwiLypcIjtgKSBkb24ndCBjb25mdXNlIHRoZSBjb21tZW50IHNjYW5uZXIuXG4gICAgY29uc3Qgc3RyaW5nc1N0cmlwcGVkID0gbGluZXNbaV1cbiAgICAgIC5yZXBsYWNlKC8nKD86W14nXFxcXF18XFxcXC4pKicvZywgKHMpID0+ICcgJy5yZXBlYXQocy5sZW5ndGgpKVxuICAgICAgLnJlcGxhY2UoL1wiKD86W15cIlxcXFxdfFxcXFwuKSpcIi9nLCAocykgPT4gJyAnLnJlcGVhdChzLmxlbmd0aCkpXG4gICAgICAucmVwbGFjZSgvYCg/OlteYFxcXFxdfFxcXFwuKSpgL2csIChzKSA9PiAnICcucmVwZWF0KHMubGVuZ3RoKSk7XG5cbiAgICBsZXQgbGluZSA9IHN0cmluZ3NTdHJpcHBlZDtcblxuICAgIC8vIEhhbmRsZSBtdWx0aS1saW5lIGJsb2NrIGNvbW1lbnRzIChpbmNsdWRpbmcgSlNEb2MpXG4gICAgaWYgKGluQmxvY2tDb21tZW50KSB7XG4gICAgICBjb25zdCBlbmRJZHggPSBsaW5lLmluZGV4T2YoJyovJyk7XG4gICAgICBpZiAoZW5kSWR4ID09PSAtMSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGxpbmUgPSAnICcucmVwZWF0KGVuZElkeCArIDIpICsgbGluZS5zbGljZShlbmRJZHggKyAyKTtcbiAgICAgIGluQmxvY2tDb21tZW50ID0gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gU2NhbiBmb3IgY29tbWVudHMsIHJlcGxhY2luZyB0aGVtIHdpdGggc3BhY2VzXG4gICAgbGV0IHByb2Nlc3NlZCA9ICcnO1xuICAgIGxldCBqID0gMDtcbiAgICB3aGlsZSAoaiA8IGxpbmUubGVuZ3RoKSB7XG4gICAgICBpZiAobGluZVtqXSA9PT0gJy8nICYmIGxpbmVbaiArIDFdID09PSAnLycpIHtcbiAgICAgICAgcHJvY2Vzc2VkICs9ICcgJy5yZXBlYXQobGluZS5sZW5ndGggLSBqKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpZiAobGluZVtqXSA9PT0gJy8nICYmIGxpbmVbaiArIDFdID09PSAnKicpIHtcbiAgICAgICAgY29uc3QgZW5kSWR4ID0gbGluZS5pbmRleE9mKCcqLycsIGogKyAyKTtcbiAgICAgICAgaWYgKGVuZElkeCAhPT0gLTEpIHtcbiAgICAgICAgICBjb25zdCBsZW4gPSBlbmRJZHggKyAyIC0gajtcbiAgICAgICAgICBwcm9jZXNzZWQgKz0gJyAnLnJlcGVhdChsZW4pO1xuICAgICAgICAgIGogPSBlbmRJZHggKyAyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHByb2Nlc3NlZCArPSAnICcucmVwZWF0KGxpbmUubGVuZ3RoIC0gaik7XG4gICAgICAgICAgaW5CbG9ja0NvbW1lbnQgPSB0cnVlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwcm9jZXNzZWQgKz0gbGluZVtqXTtcbiAgICAgICAgaiArPSAxO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IG1hdGNoID0gcHJvY2Vzc2VkLm1hdGNoKHVzYWdlUmVnZXgpO1xuICAgIGlmIChtYXRjaCAmJiBtYXRjaC5pbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBsaW5lOiBpLFxuICAgICAgICBjb2x1bW46IG1hdGNoLmluZGV4LFxuICAgICAgICBsaW5lVGV4dDogbGluZXNbaV0sXG4gICAgICB9O1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEdldCB0aGUgbG9jYXRpb24gb2YgYSB2aW9sYXRpb24uXG4gKiBAcGFyYW0gY3dkIC0gVGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkuXG4gKiBAcGFyYW0gcmVsYXRpdmVQYXRoIC0gVGhlIHJlbGF0aXZlIHBhdGggdG8gdGhlIGZpbGUuXG4gKiBAcGFyYW0gcGFja2FnZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgcGFja2FnZS5cbiAqIEByZXR1cm5zIFRoZSBsb2NhdGlvbiBvZiB0aGUgdmlvbGF0aW9uLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0VmlvbGF0aW9uTG9jYXRpb24oXG4gIGN3ZDogc3RyaW5nLFxuICByZWxhdGl2ZVBhdGg6IHN0cmluZyxcbiAgcGFja2FnZU5hbWU6IHN0cmluZ1xuKSB7XG4gIHRyeSB7XG4gICAgY29uc3QgYWJzb2x1dGVQYXRoID0gcmVzb2x2ZShjd2QsIHJlbGF0aXZlUGF0aCk7XG4gICAgY29uc3QgY29udGVudHMgPSBhd2FpdCByZWFkRmlsZShhYnNvbHV0ZVBhdGgsICd1dGY4Jyk7XG4gICAgY29uc3QgbGluZXMgPSBjb250ZW50cy5zcGxpdCgvXFxyP1xcbi8pO1xuXG4gICAgY29uc3QgaW1wb3J0UmVnZXggPSBuZXcgUmVnRXhwKFxuICAgICAgYGltcG9ydFxcXFxzKyguKz8pXFxcXHMrZnJvbVxcXFxzK1snXCJdJHtlc2NhcGVSZWdFeHAocGFja2FnZU5hbWUpfSg/Oi9bXidcIl0qKT9bJ1wiXWBcbiAgICApO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgY29uc3QgbGluZSA9IGxpbmVzW2ldO1xuICAgICAgY29uc3QgaW1wb3J0TWF0Y2ggPSBsaW5lLm1hdGNoKGltcG9ydFJlZ2V4KTtcblxuICAgICAgaWYgKGltcG9ydE1hdGNoICYmIGltcG9ydE1hdGNoLmluZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3Qgc3BlY2lmaWVyID0gaW1wb3J0TWF0Y2hbMV0udHJpbSgpO1xuICAgICAgICBjb25zdCBpZGVudGlmaWVyID0gZ2V0SW1wb3J0ZWRJZGVudGlmaWVyKHNwZWNpZmllcik7XG4gICAgICAgIGlmIChpZGVudGlmaWVyKSB7XG4gICAgICAgICAgY29uc3QgdXNhZ2UgPSBmaW5kSWRlbnRpZmllclVzYWdlKGxpbmVzLCBpICsgMSwgaWRlbnRpZmllcik7XG4gICAgICAgICAgaWYgKHVzYWdlKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBmaWxlOiByZWxhdGl2ZVBhdGgsXG4gICAgICAgICAgICAgIGxpbmU6IHVzYWdlLmxpbmUgKyAxLFxuICAgICAgICAgICAgICBjb2x1bW46IHVzYWdlLmNvbHVtbixcbiAgICAgICAgICAgICAgbGluZVRleHQ6IHVzYWdlLmxpbmVUZXh0LFxuICAgICAgICAgICAgICBsZW5ndGg6IGlkZW50aWZpZXIubGVuZ3RoLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBJZGVudGlmaWVyIGV4aXN0cyBidXQgaXMgbmV2ZXIgcmVmZXJlbmNlZDsgc3VyZmFjZSBubyBsb2NhdGlvblxuICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBGYWxsYmFjazogaWYgd2UgY2FuJ3QgZXh0cmFjdCBpZGVudGlmaWVyLCBwb2ludCB0byBwYWNrYWdlIG5hbWVcbiAgICAgICAgY29uc3QgY29sdW1uSW5kZXggPSBsaW5lLmluZGV4T2YocGFja2FnZU5hbWUpO1xuICAgICAgICBpZiAoY29sdW1uSW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGZpbGU6IHJlbGF0aXZlUGF0aCxcbiAgICAgICAgICAgIGxpbmU6IGkgKyAxLFxuICAgICAgICAgICAgY29sdW1uOiBjb2x1bW5JbmRleCxcbiAgICAgICAgICAgIGxpbmVUZXh0OiBsaW5lLFxuICAgICAgICAgICAgbGVuZ3RoOiBwYWNrYWdlTmFtZS5sZW5ndGgsXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgLy8gaWdub3JlIGZpbGUgcmVhZCBmYWlsdXJlcywgZmFsbGJhY2sgdG8gbm8gbG9jYXRpb24gaW5mb1xuICB9XG59XG5cbi8qKlxuICogR2V0IHRoZSBtb2R1bGUgdHlwZSBsYWJlbCBmb3IgZXJyb3IgbWVzc2FnZXMuXG4gKiBAcGFyYW0gbW9kdWxlUGF0aCAtIFRoZSBtb2R1bGUgcGF0aCB0byBjaGVjay5cbiAqIEByZXR1cm5zIFRoZSBtb2R1bGUgdHlwZSBsYWJlbC5cbiAqL1xuZnVuY3Rpb24gZ2V0TW9kdWxlVHlwZUxhYmVsKG1vZHVsZVBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmIChidW5Nb2R1bGVzUmVnZXgudGVzdChtb2R1bGVQYXRoKSkge1xuICAgIHJldHVybiAnQnVuJztcbiAgfVxuICByZXR1cm4gJ05vZGUuanMnO1xufVxuXG4vKipcbiAqIENyZWF0ZSBhbiBlc2J1aWxkIHBsdWdpbiB0byBkZXRlY3QgdmlvbGF0aW9ucyBvZiB0aGUgTm9kZS5qcyBtb2R1bGUgdXNhZ2UgcnVsZS5cbiAqIFRoaXMgcGx1Z2luIHByZXZlbnRzIHdvcmtmbG93IGZ1bmN0aW9ucyBmcm9tIGltcG9ydGluZyBOb2RlLmpzIG9yIEJ1biBidWlsdC1pblxuICogbW9kdWxlcywgd2hpY2ggYXJlIG5vdCBhdmFpbGFibGUgaW4gdGhlIHNhbmRib3hlZCB3b3JrZmxvdyBydW50aW1lLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTm9kZU1vZHVsZUVycm9yUGx1Z2luKCk6IGVzYnVpbGQuUGx1Z2luIHtcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiAnd29ya2Zsb3ctbm9kZS1tb2R1bGUtZXJyb3InLFxuICAgIHNldHVwKGJ1aWxkKSB7XG4gICAgICBjb25zdCBjd2QgPSBwcm9jZXNzLmN3ZCgpO1xuICAgICAgY29uc3QgaW1wb3J0UGFyZW50cyA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gICAgICBjb25zdCBwYWNrYWdlVmlvbGF0aW9uczogUGFja2FnZVZpb2xhdGlvbltdID0gW107XG4gICAgICBjb25zdCBzZWVuVmlvbGF0aW9ucyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gICAgICAvLyBFbmFibGUgdGhlIGVzYnVpbGQgbWV0YWZpbGUgc28gd2UgY2FuIGluc3BlY3Qgd2hpY2ggTm9kZS5qcyAvIEJ1blxuICAgICAgLy8gYnVpbHQtaW4gaW1wb3J0cyBhY3R1YWxseSBzdXJ2aXZlIHRyZWUtc2hha2luZy4gV2UgbmVlZCB0aGlzIHRvXG4gICAgICAvLyBzdXBwcmVzcyBmYWxzZSBwb3NpdGl2ZXMgd2hlcmUgYSBzaGFyZWQgbW9kdWxlIGhhcyBhIHdvcmtmbG93LXNhZmVcbiAgICAgIC8vIGV4cG9ydCBhbG9uZ3NpZGUgYSBzdGVwLW9ubHkgZXhwb3J0IHRoYXQgcmVmZXJlbmNlcyBOb2RlLmpzIGJ1aWx0aW5zXG4gICAgICAvLyDigJQgZXNidWlsZCdzIHRyZWUtc2hha2VyIGNhbiBkcm9wIHRoZSBzdGVwLW9ubHkgYnJhbmNoLCBidXQgYG9uUmVzb2x2ZWBcbiAgICAgIC8vIGZpcmVzIGJlZm9yZSB0cmVlLXNoYWtpbmcsIHNvIHdlIGRlZmVyIHRoZSBmaW5hbCBlcnJvciBkZWNpc2lvbiB0b1xuICAgICAgLy8gYG9uRW5kYCAoc2VlIHRoZSBtZXRhZmlsZS1iYXNlZCBmaWx0ZXIgYmVsb3cpLlxuICAgICAgYnVpbGQuaW5pdGlhbE9wdGlvbnMubWV0YWZpbGUgPSB0cnVlO1xuXG4gICAgICAvLyBUcmFjayBBTEwgaW1wb3J0IHJlbGF0aW9uc2hpcHMgdG8gYnVpbGQgdGhlIGRlcGVuZGVuY3kgZ3JhcGguXG4gICAgICAvLyBUaGlzIGlzIG5lY2Vzc2FyeSB0byB0cmFjZSB0cmFuc2l0aXZlIGRlcGVuZGVuY2llcyBiYWNrIHRvIHVzZXIgY29kZS5cbiAgICAgIC8vIFBlcmZvcm1hbmNlIGltcGFjdCBpcyBtaW5pbWFsIGFzIHdlIG9ubHkgc3RvcmUgcGF0aCBtYXBwaW5ncy5cbiAgICAgIGJ1aWxkLm9uUmVzb2x2ZSh7IGZpbHRlcjogLy4qLyB9LCBhc3luYyAoYXJncykgPT4ge1xuICAgICAgICBpZiAoIWFyZ3MuaW1wb3J0ZXIpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGNvbnN0IHBhcmVudFZhbHVlID0gbm9ybWFsaXplKGFyZ3MuaW1wb3J0ZXIpO1xuICAgICAgICBjb25zdCBzcGVjaWZpZXJQYWNrYWdlTmFtZSA9IGdldFBhY2thZ2VOYW1lRnJvbVNwZWNpZmllcihhcmdzLnBhdGgpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcmVzb2x2ZWRDaGlsZCA9IGF3YWl0IGVuaGFuY2VkUmVzb2x2ZShcbiAgICAgICAgICAgIGFyZ3MucmVzb2x2ZURpcixcbiAgICAgICAgICAgIGFyZ3MucGF0aFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBpZiAocmVzb2x2ZWRDaGlsZCkge1xuICAgICAgICAgICAgY29uc3QgY2hpbGRLZXkgPSBub3JtYWxpemUocmVzb2x2ZWRDaGlsZCk7XG4gICAgICAgICAgICBpbXBvcnRQYXJlbnRzLnNldChjaGlsZEtleSwgcGFyZW50VmFsdWUpO1xuXG4gICAgICAgICAgICAvLyBSZWNvcmQgdGhlIHJlc29sdmVkIHBhY2thZ2UgZWRnZSBzbyB0cmFuc2l0aXZlIGJ1aWx0aW4gdXNhZ2UgY2FuXG4gICAgICAgICAgICAvLyBzdGlsbCB0cmFjZSBiYWNrIGV2ZW4gd2hlbiBlc2J1aWxkIGFuZCBlbmhhbmNlZC1yZXNvbHZlIHBpY2tcbiAgICAgICAgICAgIC8vIGRpZmZlcmVudCBlbnRyeSBmaWxlcyAoZS5nLiBgbW9kdWxlYCB2cyBgbWFpbmApLlxuICAgICAgICAgICAgY29uc3QgcmVzb2x2ZWRQYWNrYWdlTmFtZSA9IGdldFBhY2thZ2VOYW1lKGNoaWxkS2V5KTtcbiAgICAgICAgICAgIGlmIChyZXNvbHZlZFBhY2thZ2VOYW1lKSB7XG4gICAgICAgICAgICAgIGltcG9ydFBhcmVudHMuc2V0KHJlc29sdmVkUGFja2FnZU5hbWUsIHBhcmVudFZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBBbHNvIHByZXNlcnZlIHRoZSBiYXJlIHBhY2thZ2Utc3BlY2lmaWVyIGVkZ2UgKGUuZy4gXCJwb3N0Z3Jlc1wiKSxcbiAgICAgICAgICAvLyB3aGljaCBpcyB0aGUgZmFsbGJhY2sga2V5IHVzZWQgd2hlbiB0cmFjaW5nIGZyb20gZmlsZXMgaW5cbiAgICAgICAgICAvLyBub2RlX21vZHVsZXMgYmFjayB0byB1c2VyIGNvZGUuXG4gICAgICAgICAgaWYgKHNwZWNpZmllclBhY2thZ2VOYW1lKSB7XG4gICAgICAgICAgICBpbXBvcnRQYXJlbnRzLnNldChzcGVjaWZpZXJQYWNrYWdlTmFtZSwgcGFyZW50VmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgLy8gRm9yIGJ1aWx0LWluIG1vZHVsZXMgdGhhdCBjYW4ndCBiZSByZXNvbHZlZCwgc3RpbGwgdHJhY2sgdXNpbmcgdGhlIGltcG9ydCBwYXRoXG4gICAgICAgICAgY29uc3QgY2hpbGRLZXkgPSBhcmdzLnBhdGg7XG4gICAgICAgICAgaW1wb3J0UGFyZW50cy5zZXQoY2hpbGRLZXksIHBhcmVudFZhbHVlKTtcblxuICAgICAgICAgIGlmIChzcGVjaWZpZXJQYWNrYWdlTmFtZSkge1xuICAgICAgICAgICAgaW1wb3J0UGFyZW50cy5zZXQoc3BlY2lmaWVyUGFja2FnZU5hbWUsIHBhcmVudFZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9KTtcblxuICAgICAgLy8gRGV0ZWN0IE5vZGUuanMgYW5kIEJ1biBtb2R1bGUgaW1wb3J0c1xuICAgICAgYnVpbGQub25SZXNvbHZlKHsgZmlsdGVyOiBydW50aW1lTW9kdWxlc1JlZ2V4IH0sIGFzeW5jIChhcmdzKSA9PiB7XG4gICAgICAgIGNvbnN0IGltcG9ydGVyUGF0aCA9IHJlc29sdmUoY3dkLCBhcmdzLmltcG9ydGVyKTtcbiAgICAgICAgbGV0IGN1cnJlbnQgPSBpbXBvcnRlclBhdGg7XG4gICAgICAgIGNvbnN0IGNoYWluOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBjb25zdCB2aXNpdGVkID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgICAgIHdoaWxlIChjdXJyZW50KSB7XG4gICAgICAgICAgaWYgKHZpc2l0ZWQuaGFzKGN1cnJlbnQpKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgdmlzaXRlZC5hZGQoY3VycmVudCk7XG4gICAgICAgICAgY2hhaW4ucHVzaChjdXJyZW50KTtcbiAgICAgICAgICBsZXQgbmV4dCA9IGltcG9ydFBhcmVudHMuZ2V0KGN1cnJlbnQpO1xuXG4gICAgICAgICAgLy8gSWYgd2UgY2FuJ3QgZmluZCB0aGUgcGFyZW50IGFuZCBjdXJyZW50IGlzIGluIG5vZGVfbW9kdWxlcyxcbiAgICAgICAgICAvLyB0cnkgbG9va2luZyB1cCBieSBwb3RlbnRpYWwgcGFja2FnZSBpbXBvcnQgc3RyaW5nc1xuICAgICAgICAgIGlmICghbmV4dCAmJiBjdXJyZW50LmluY2x1ZGVzKCdub2RlX21vZHVsZXMnKSkge1xuICAgICAgICAgICAgY29uc3QgcGFja2FnZU5hbWUgPSBnZXRQYWNrYWdlTmFtZShjdXJyZW50KTtcbiAgICAgICAgICAgIGlmIChwYWNrYWdlTmFtZSkge1xuICAgICAgICAgICAgICAvLyBUcnkgdGhlIHBhY2thZ2UgbmFtZSBkaXJlY3RseVxuICAgICAgICAgICAgICBuZXh0ID0gaW1wb3J0UGFyZW50cy5nZXQocGFja2FnZU5hbWUpO1xuICAgICAgICAgICAgICBpZiAoIW5leHQpIHtcbiAgICAgICAgICAgICAgICAvLyBUcnkgd2l0aCBub2RlOiBwcmVmaXhcbiAgICAgICAgICAgICAgICBuZXh0ID0gaW1wb3J0UGFyZW50cy5nZXQoYG5vZGU6JHtwYWNrYWdlTmFtZX1gKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGN1cnJlbnQgPSBuZXh0ID8/ICcnO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGZpbHRlcmVkQ2hhaW4gPSBjaGFpbi5maWx0ZXIoXG4gICAgICAgICAgKHBhdGgpID0+ICFwYXRoLmluY2x1ZGVzKCdub2RlX21vZHVsZXMnKVxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IHdvcmtmbG93RmlsZSA9IGZpbHRlcmVkQ2hhaW5bMF0gPz8gaW1wb3J0ZXJQYXRoO1xuXG4gICAgICAgIGlmICghd29ya2Zsb3dGaWxlIHx8IHdvcmtmbG93RmlsZS5pbmNsdWRlcygnbm9kZV9tb2R1bGVzJykpIHtcbiAgICAgICAgICAvLyBNYXJrIGJ1aWx0aW4gaW1wb3J0cyBhcyBzaWRlLWVmZmVjdC1mcmVlIHNvIGVzYnVpbGQgY2FuIHRyZWUtc2hha2VcbiAgICAgICAgICAvLyB0aGVtIHdoZW4gdGhleSdyZSBvbmx5IHJlZmVyZW5jZWQgYnkgZGVhZCAoZS5nLiBzdGVwLW9ubHkpIGNvZGVcbiAgICAgICAgICAvLyBwYXRocyBpbiBzaGFyZWQgbW9kdWxlcy4gVGhlIG9uRW5kIGZpbHRlciBiZWxvdyB1c2VzIHRoZSBtZXRhZmlsZVxuICAgICAgICAgIC8vIHRvIGRlY2lkZSB3aGljaCBpbXBvcnRzIGFjdHVhbGx5IHN1cnZpdmUuXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHBhdGg6IGFyZ3MucGF0aCxcbiAgICAgICAgICAgIGV4dGVybmFsOiB0cnVlLFxuICAgICAgICAgICAgc2lkZUVmZmVjdHM6IGZhbHNlLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwYWNrYWdlTmFtZSA9IGltcG9ydGVyUGF0aC5pbmNsdWRlcygnbm9kZV9tb2R1bGVzJylcbiAgICAgICAgICA/IChnZXRQYWNrYWdlTmFtZShpbXBvcnRlclBhdGgpID8/IGFyZ3MucGF0aClcbiAgICAgICAgICA6IGFyZ3MucGF0aDtcblxuICAgICAgICBjb25zdCByZWxhdGl2ZVdvcmtmbG93RmlsZSA9IHJlbGF0aXZlKGN3ZCwgd29ya2Zsb3dGaWxlKTtcbiAgICAgICAgY29uc3QgdmlvbGF0aW9uS2V5ID0gYCR7cGFja2FnZU5hbWV9OiR7cmVsYXRpdmVXb3JrZmxvd0ZpbGV9YDtcblxuICAgICAgICBpZiAoIXNlZW5WaW9sYXRpb25zLmhhcyh2aW9sYXRpb25LZXkpKSB7XG4gICAgICAgICAgc2VlblZpb2xhdGlvbnMuYWRkKHZpb2xhdGlvbktleSk7XG4gICAgICAgICAgY29uc3QgbG9jYXRpb24gPSBhd2FpdCBnZXRWaW9sYXRpb25Mb2NhdGlvbihcbiAgICAgICAgICAgIGN3ZCxcbiAgICAgICAgICAgIHJlbGF0aXZlV29ya2Zsb3dGaWxlLFxuICAgICAgICAgICAgcGFja2FnZU5hbWVcbiAgICAgICAgICApO1xuICAgICAgICAgIC8vIE9ubHkgcmVwb3J0IHZpb2xhdGlvbnMgd2hlcmUgd2UgY2FuIGZpbmQgdGhlIGltcG9ydCBsb2NhdGlvbi5cbiAgICAgICAgICAvLyBJZiB3ZSBjYW4ndCBmaW5kIGl0LCB0aGUgcGFja2FnZSBpcyBsaWtlbHkgYSB0cmFuc2l0aXZlIGRlcGVuZGVuY3lcbiAgICAgICAgICAvLyB0aGF0IHRoZSB1c2VyIGRpZG4ndCBkaXJlY3RseSBpbXBvcnQgLSB3ZSdsbCByZXBvcnQgdGhlIHRvcC1sZXZlbFxuICAgICAgICAgIC8vIHBhY2thZ2UgdGhleSBkaWQgaW1wb3J0IGluc3RlYWQuXG4gICAgICAgICAgaWYgKGxvY2F0aW9uKSB7XG4gICAgICAgICAgICBwYWNrYWdlVmlvbGF0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgICAgcGF0aDogYXJncy5wYXRoLFxuICAgICAgICAgICAgICBpbXBvcnRlcjogcmVsYXRpdmVXb3JrZmxvd0ZpbGUsXG4gICAgICAgICAgICAgIHBhY2thZ2VOYW1lLFxuICAgICAgICAgICAgICBsb2NhdGlvbixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE1hcmsgYnVpbHRpbiBpbXBvcnRzIGFzIHNpZGUtZWZmZWN0LWZyZWUgc28gZXNidWlsZCBjYW4gdHJlZS1zaGFrZVxuICAgICAgICAvLyB0aGVtIHdoZW4gdGhleSdyZSBvbmx5IHJlZmVyZW5jZWQgYnkgZGVhZCAoZS5nLiBzdGVwLW9ubHkpIGNvZGVcbiAgICAgICAgLy8gcGF0aHMgaW4gc2hhcmVkIG1vZHVsZXMuIFRoZSBvbkVuZCBmaWx0ZXIgYmVsb3cgdXNlcyB0aGUgbWV0YWZpbGVcbiAgICAgICAgLy8gdG8gZGVjaWRlIHdoaWNoIGltcG9ydHMgYWN0dWFsbHkgc3Vydml2ZS5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBwYXRoOiBhcmdzLnBhdGgsXG4gICAgICAgICAgZXh0ZXJuYWw6IHRydWUsXG4gICAgICAgICAgc2lkZUVmZmVjdHM6IGZhbHNlLFxuICAgICAgICB9O1xuICAgICAgfSk7XG5cbiAgICAgIC8vIFJlcG9ydCB2aW9sYXRpb25zIGF0IHRoZSBlbmQgb2YgdGhlIGJ1aWxkLCBmaWx0ZXJlZCB0byBvbmx5IHRob3NlXG4gICAgICAvLyB3aG9zZSBOb2RlLmpzIC8gQnVuIGJ1aWx0aW4gaW1wb3J0cyBhY3R1YWxseSBzdXJ2aXZlZCB0cmVlLXNoYWtpbmcuXG4gICAgICAvL1xuICAgICAgLy8gYG9uUmVzb2x2ZWAgZmlyZXMgZHVyaW5nIG1vZHVsZSBsb2FkaW5nLCBiZWZvcmUgZXNidWlsZCdzIHRyZWUtc2hha2VyXG4gICAgICAvLyBydW5zLiBUaGF0IG1lYW5zIGEgc2hhcmVkIG1vZHVsZSB3aG9zZSBzdGVwLW9ubHkgZXhwb3J0IHJlZmVyZW5jZXMgYVxuICAgICAgLy8gYnVpbHRpbiB3aWxsIHJlY29yZCBhIHZpb2xhdGlvbiBldmVuIGlmIHRoZSB3b3JrZmxvdyBuZXZlciB0b3VjaGVzXG4gICAgICAvLyB0aGF0IGV4cG9ydC4gQnkgbWFya2luZyBidWlsdGluIGltcG9ydHMgYXMgYHNpZGVFZmZlY3RzOiBmYWxzZWAgaW5cbiAgICAgIC8vIGBvblJlc29sdmVgIGFib3ZlLCBlc2J1aWxkIGNhbiBkcm9wIHN1Y2ggaW1wb3J0cyBmcm9tIHRoZSBvdXRwdXQuXG4gICAgICAvLyBIZXJlIHdlIGNvbnN1bHQgdGhlIG1ldGFmaWxlIHRvIHNlZSB3aGljaCBidWlsdGluIGltcG9ydHMgcmVtYWluXG4gICAgICAvLyBpbiB0aGUgZW1pdHRlZCBidW5kbGUgYW5kIG9ubHkgcmVwb3J0IHRob3NlLlxuICAgICAgYnVpbGQub25FbmQoKHJlc3VsdCkgPT4ge1xuICAgICAgICBpZiAocGFja2FnZVZpb2xhdGlvbnMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICAgICAgY29uc3Qgc3Vydml2aW5nQnVpbHRpbnMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICAgICAgY29uc3Qgb3V0cHV0cyA9IHJlc3VsdC5tZXRhZmlsZT8ub3V0cHV0cztcbiAgICAgICAgaWYgKG91dHB1dHMpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IG91dHB1dCBvZiBPYmplY3QudmFsdWVzKG91dHB1dHMpKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGltcCBvZiBvdXRwdXQuaW1wb3J0cykge1xuICAgICAgICAgICAgICAvLyBFeHRlcm5hbCBpbXBvcnRzIGluIHRoZSBtZXRhZmlsZSBhcmUgcmVjb3JkZWQgd2l0aCB0aGUgcGF0aFxuICAgICAgICAgICAgICAvLyB0aGF0IHdhcyByZXR1cm5lZCBmcm9tIGBvblJlc29sdmVgIChlLmcuIFwibm9kZTpmcy9wcm9taXNlc1wiLFxuICAgICAgICAgICAgICAvLyBcImZzXCIsIFwiYnVuOnNxbGl0ZVwiKS4gT25seSBjb2xsZWN0IHRoZSBvbmVzIHRoYXQgbWF0Y2hcbiAgICAgICAgICAgICAgLy8gTm9kZS5qcyAvIEJ1biBidWlsdGlucy5cbiAgICAgICAgICAgICAgaWYgKGltcC5leHRlcm5hbCAmJiBydW50aW1lTW9kdWxlc1JlZ2V4LnRlc3QoaW1wLnBhdGgpKSB7XG4gICAgICAgICAgICAgICAgc3Vydml2aW5nQnVpbHRpbnMuYWRkKGltcC5wYXRoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIHRoZSBtZXRhZmlsZSBpcyB1bmF2YWlsYWJsZSBmb3Igc29tZSByZWFzb24sIGZhbGwgYmFjayB0b1xuICAgICAgICAvLyByZXBvcnRpbmcgYWxsIHJlY29yZGVkIHZpb2xhdGlvbnMgc28gd2UgbmV2ZXIgc2lsZW50bHkgc3VwcHJlc3NcbiAgICAgICAgLy8gcmVhbCBvbmVzLlxuICAgICAgICBjb25zdCBsaXZlVmlvbGF0aW9ucyA9IG91dHB1dHNcbiAgICAgICAgICA/IHBhY2thZ2VWaW9sYXRpb25zLmZpbHRlcigodmlvbGF0aW9uKSA9PlxuICAgICAgICAgICAgICBzdXJ2aXZpbmdCdWlsdGlucy5oYXModmlvbGF0aW9uLnBhdGgpXG4gICAgICAgICAgICApXG4gICAgICAgICAgOiBwYWNrYWdlVmlvbGF0aW9ucztcblxuICAgICAgICBpZiAobGl2ZVZpb2xhdGlvbnMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBlcnJvcnM6IGxpdmVWaW9sYXRpb25zLm1hcCgodmlvbGF0aW9uKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpc0J1aWx0aW5Nb2R1bGUgPSBydW50aW1lTW9kdWxlc1JlZ2V4LnRlc3QoXG4gICAgICAgICAgICAgIHZpb2xhdGlvbi5wYWNrYWdlTmFtZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnN0IG1vZHVsZVR5cGUgPSBnZXRNb2R1bGVUeXBlTGFiZWwodmlvbGF0aW9uLnBhdGgpO1xuXG4gICAgICAgICAgICAvLyBEaWZmZXJlbnQgbWVzc2FnZXMgZm9yIGJ1aWx0LWluIG1vZHVsZXMgdnMgbnBtIHBhY2thZ2VzIHRoYXQgdXNlIHRoZW1cbiAgICAgICAgICAgIGNvbnN0IHRleHQgPSBpc0J1aWx0aW5Nb2R1bGVcbiAgICAgICAgICAgICAgPyBgWW91IGFyZSBhdHRlbXB0aW5nIHRvIHVzZSBcIiR7dmlvbGF0aW9uLnBhY2thZ2VOYW1lfVwiIHdoaWNoIGlzIGEgJHttb2R1bGVUeXBlfSBtb2R1bGUuICR7bW9kdWxlVHlwZX0gbW9kdWxlcyBhcmUgbm90IGF2YWlsYWJsZSBpbiB3b3JrZmxvdyBmdW5jdGlvbnMuXFxuXFxuTGVhcm4gbW9yZTogaHR0cHM6Ly93b3JrZmxvdy1zZGsuZGV2L2Vyci8ke0VSUk9SX1NMVUdTLk5PREVfSlNfTU9EVUxFX0lOX1dPUktGTE9XfWBcbiAgICAgICAgICAgICAgOiBgWW91IGFyZSBhdHRlbXB0aW5nIHRvIHVzZSBcIiR7dmlvbGF0aW9uLnBhY2thZ2VOYW1lfVwiIHdoaWNoIGRlcGVuZHMgb24gJHttb2R1bGVUeXBlfSBtb2R1bGVzLiBQYWNrYWdlcyB0aGF0IGRlcGVuZCBvbiAke21vZHVsZVR5cGV9IG1vZHVsZXMgYXJlIG5vdCBhdmFpbGFibGUgaW4gd29ya2Zsb3cgZnVuY3Rpb25zLlxcblxcbkxlYXJuIG1vcmU6IGh0dHBzOi8vd29ya2Zsb3ctc2RrLmRldi9lcnIvJHtFUlJPUl9TTFVHUy5OT0RFX0pTX01PRFVMRV9JTl9XT1JLRkxPV31gO1xuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICB0ZXh0LFxuICAgICAgICAgICAgICBsb2NhdGlvbjogdmlvbGF0aW9uLmxvY2F0aW9uXG4gICAgICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICAgIC4uLnZpb2xhdGlvbi5sb2NhdGlvbixcbiAgICAgICAgICAgICAgICAgICAgc3VnZ2VzdGlvbjogJ01vdmUgdGhpcyBmdW5jdGlvbiBpbnRvIGEgc3RlcCBmdW5jdGlvbi4nLFxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgIH0sXG4gIH07XG59XG4iXX0=