@workflow/builders 5.0.0-beta.0 → 5.0.0-beta.10

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 (88) hide show
  1. package/dist/apply-swc-transform.d.ts +1 -1
  2. package/dist/apply-swc-transform.d.ts.map +1 -1
  3. package/dist/apply-swc-transform.js +1 -1
  4. package/dist/base-builder.d.ts +79 -5
  5. package/dist/base-builder.d.ts.map +1 -1
  6. package/dist/base-builder.js +424 -44
  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 +3 -13
  12. package/dist/constants.d.ts.map +1 -1
  13. package/dist/constants.js +4 -14
  14. package/dist/discover-entries-esbuild-plugin.d.ts.map +1 -1
  15. package/dist/discover-entries-esbuild-plugin.js +27 -10
  16. package/dist/discover-entries-esbuild-plugin.test.js +42 -2
  17. package/dist/esbuild-tsconfig.js +1 -1
  18. package/dist/esbuild-tsconfig.test.js +1 -1
  19. package/dist/external-package-warning.test.d.ts +2 -0
  20. package/dist/external-package-warning.test.d.ts.map +1 -0
  21. package/dist/external-package-warning.test.js +219 -0
  22. package/dist/get-input-files.test.js +49 -2
  23. package/dist/index.d.ts +2 -2
  24. package/dist/index.d.ts.map +1 -1
  25. package/dist/index.js +3 -3
  26. package/dist/module-specifier.d.ts.map +1 -1
  27. package/dist/module-specifier.js +48 -10
  28. package/dist/module-specifier.test.js +21 -1
  29. package/dist/node-module-esbuild-plugin.d.ts.map +1 -1
  30. package/dist/node-module-esbuild-plugin.js +73 -23
  31. package/dist/node-module-esbuild-plugin.test.js +97 -1
  32. package/dist/pseudo-package-esbuild-plugin.js +1 -1
  33. package/dist/pseudo-package-esbuild-plugin.test.js +1 -1
  34. package/dist/request-converter.js +1 -1
  35. package/dist/resolve-sourcemap.test.d.ts +2 -0
  36. package/dist/resolve-sourcemap.test.d.ts.map +1 -0
  37. package/dist/resolve-sourcemap.test.js +126 -0
  38. package/dist/serde-checker.js +1 -1
  39. package/dist/standalone.d.ts +0 -3
  40. package/dist/standalone.d.ts.map +1 -1
  41. package/dist/standalone.js +11 -40
  42. package/dist/swc-esbuild-plugin.d.ts +10 -1
  43. package/dist/swc-esbuild-plugin.d.ts.map +1 -1
  44. package/dist/swc-esbuild-plugin.js +73 -9
  45. package/dist/swc-esbuild-plugin.test.js +280 -4
  46. package/dist/transform-utils.d.ts +3 -9
  47. package/dist/transform-utils.d.ts.map +1 -1
  48. package/dist/transform-utils.js +5 -30
  49. package/dist/transform-utils.test.js +37 -17
  50. package/dist/types.d.ts +31 -0
  51. package/dist/types.d.ts.map +1 -1
  52. package/dist/types.js +1 -1
  53. package/dist/vercel-build-output-api.d.ts +0 -2
  54. package/dist/vercel-build-output-api.d.ts.map +1 -1
  55. package/dist/vercel-build-output-api.js +32 -57
  56. package/dist/workflow-alias.js +1 -1
  57. package/dist/workflow-alias.test.js +1 -1
  58. package/dist/workflows-extractor.js +1 -1
  59. package/package.json +5 -5
  60. package/dist/apply-swc-transform.js.map +0 -1
  61. package/dist/base-builder.js.map +0 -1
  62. package/dist/build-queue.js.map +0 -1
  63. package/dist/config-helpers.js.map +0 -1
  64. package/dist/constants.js.map +0 -1
  65. package/dist/discover-entries-esbuild-plugin.js.map +0 -1
  66. package/dist/discover-entries-esbuild-plugin.test.js.map +0 -1
  67. package/dist/esbuild-tsconfig.js.map +0 -1
  68. package/dist/esbuild-tsconfig.test.js.map +0 -1
  69. package/dist/get-input-files.test.js.map +0 -1
  70. package/dist/index.js.map +0 -1
  71. package/dist/module-specifier.js.map +0 -1
  72. package/dist/module-specifier.test.js.map +0 -1
  73. package/dist/node-module-esbuild-plugin.js.map +0 -1
  74. package/dist/node-module-esbuild-plugin.test.js.map +0 -1
  75. package/dist/pseudo-package-esbuild-plugin.js.map +0 -1
  76. package/dist/pseudo-package-esbuild-plugin.test.js.map +0 -1
  77. package/dist/request-converter.js.map +0 -1
  78. package/dist/serde-checker.js.map +0 -1
  79. package/dist/standalone.js.map +0 -1
  80. package/dist/swc-esbuild-plugin.js.map +0 -1
  81. package/dist/swc-esbuild-plugin.test.js.map +0 -1
  82. package/dist/transform-utils.js.map +0 -1
  83. package/dist/transform-utils.test.js.map +0 -1
  84. package/dist/types.js.map +0 -1
  85. package/dist/vercel-build-output-api.js.map +0 -1
  86. package/dist/workflow-alias.js.map +0 -1
  87. package/dist/workflow-alias.test.js.map +0 -1
  88. package/dist/workflows-extractor.js.map +0 -1
@@ -9,6 +9,7 @@ const { applySwcTransformMock } = vi.hoisted(() => ({
9
9
  vi.mock('./apply-swc-transform.js', () => ({
10
10
  applySwcTransform: applySwcTransformMock,
11
11
  }));
12
+ import { createDiscoverEntriesPlugin, importParents, } from './discover-entries-esbuild-plugin.js';
12
13
  import { createSwcPlugin } from './swc-esbuild-plugin.js';
13
14
  const realTmpdir = realpathSync(tmpdir());
14
15
  function writeFile(path, contents = '') {
@@ -19,6 +20,7 @@ describe('createSwcPlugin externalizeNonSteps', () => {
19
20
  let testRoot;
20
21
  beforeEach(() => {
21
22
  testRoot = mkdtempSync(join(realTmpdir, 'workflow-swc-plugin-'));
23
+ importParents.clear();
22
24
  applySwcTransformMock.mockReset();
23
25
  applySwcTransformMock.mockImplementation(async (_filename, source) => ({
24
26
  code: source,
@@ -26,6 +28,7 @@ describe('createSwcPlugin externalizeNonSteps', () => {
26
28
  }));
27
29
  });
28
30
  afterEach(() => {
31
+ importParents.clear();
29
32
  rmSync(testRoot, { recursive: true, force: true });
30
33
  });
31
34
  it.each([
@@ -61,12 +64,16 @@ describe('createSwcPlugin externalizeNonSteps', () => {
61
64
  expect(output).toContain(`/dep${outputExt}`);
62
65
  expect(output).not.toContain(`/dep${inputExt}`);
63
66
  });
64
- it('rewrites path-aliased imports to relative paths', async () => {
67
+ it('bundles path-aliased project-local imports inline', async () => {
68
+ // Aliased project-local files must be bundled inline (not externalized
69
+ // as relative paths) because their source on disk may contain further
70
+ // alias imports that Node's ESM loader cannot resolve at runtime.
71
+ // See packages/builders/src/swc-esbuild-plugin.ts for full reasoning.
65
72
  const outdir = join(testRoot, 'out');
66
73
  const srcDir = join(testRoot, 'src');
67
74
  const libDir = join(srcDir, 'lib');
68
75
  const stepFile = join(srcDir, 'step.ts');
69
- writeFile(join(libDir, 'config.ts'), 'export const config = {};');
76
+ writeFile(join(libDir, 'config.ts'), 'export const config = { value: "hello-from-config" };');
70
77
  writeFile(stepFile, `import { config } from '@/lib/config';\nconsole.log(config);`);
71
78
  const result = await esbuild.build({
72
79
  entryPoints: [stepFile],
@@ -88,8 +95,63 @@ describe('createSwcPlugin externalizeNonSteps', () => {
88
95
  });
89
96
  expect(result.errors).toHaveLength(0);
90
97
  const output = result.outputFiles[0].text;
91
- expect(output).toContain('/lib/config.js');
98
+ // The aliased helper should be bundled inline (its content is in the
99
+ // output), not externalized as a relative path or left as a bare alias.
100
+ expect(output).toContain('hello-from-config');
92
101
  expect(output).not.toContain('@/lib/config');
102
+ expect(output).not.toMatch(/from\s+["'][^"']*\/lib\/config\.(js|ts)["']/);
103
+ });
104
+ it('bundles transitive aliased imports inside aliased helpers (Mux self-referencing package regression)', async () => {
105
+ // Regression test for https://github.com/muxinc/ai/pull/193.
106
+ //
107
+ // A package self-references its own subpath via tsconfig `paths` (e.g.
108
+ // `@my-pkg/lib/foo` → `src/lib/foo.ts`). A step file imports a helper
109
+ // via the alias, and that helper imports another helper via the alias.
110
+ //
111
+ // Previously the helpers were externalized as relative paths, but their
112
+ // source on disk still contained `import "@my-pkg/lib/..."`. At runtime,
113
+ // Node's ESM loader didn't know about tsconfig paths, fell through to
114
+ // the package's `exports` map, and threw `Package subpath ... is not
115
+ // defined by "exports"`.
116
+ //
117
+ // With the fix, aliased project-local files are bundled inline, so
118
+ // their alias imports are resolved at build time.
119
+ const outdir = join(testRoot, 'out');
120
+ const srcDir = join(testRoot, 'src');
121
+ const libDir = join(srcDir, 'lib');
122
+ const stepFile = join(srcDir, 'step.ts');
123
+ writeFile(join(libDir, 'providers.ts'), 'export const providerName = "anthropic";');
124
+ writeFile(join(libDir, 'client-factory.ts'),
125
+ // Helper uses the same alias to reach a sibling — this is the case
126
+ // that broke the Mux build with workflow >= 4.2.0-beta.78.
127
+ `import { providerName } from '@my-pkg/lib/providers';
128
+ export const client = { provider: providerName };`);
129
+ writeFile(stepFile, `import { client } from '@my-pkg/lib/client-factory';\nconsole.log(client);`);
130
+ const result = await esbuild.build({
131
+ entryPoints: [stepFile],
132
+ absWorkingDir: testRoot,
133
+ outdir,
134
+ bundle: true,
135
+ format: 'esm',
136
+ platform: 'node',
137
+ write: false,
138
+ alias: { '@my-pkg': srcDir },
139
+ plugins: [
140
+ createSwcPlugin({
141
+ mode: 'step',
142
+ entriesToBundle: [stepFile],
143
+ outdir,
144
+ rewriteTsExtensions: true,
145
+ }),
146
+ ],
147
+ });
148
+ expect(result.errors).toHaveLength(0);
149
+ const output = result.outputFiles[0].text;
150
+ // Both helpers should be bundled inline — no aliased specifiers should
151
+ // leak into the output, where Node's ESM loader would choke on them.
152
+ expect(output).toContain('anthropic');
153
+ expect(output).not.toContain('@my-pkg/lib/providers');
154
+ expect(output).not.toContain('@my-pkg/lib/client-factory');
93
155
  });
94
156
  it('does not relativize Node.js builtin imports', async () => {
95
157
  const outdir = join(testRoot, 'out');
@@ -150,6 +212,39 @@ describe('createSwcPlugin externalizeNonSteps', () => {
150
212
  expect(output).toContain('hello');
151
213
  expect(output).not.toMatch(/from\s+["'].*node_modules/);
152
214
  });
215
+ it('externalizes nested bare package imports that only resolve from a bundled package', async () => {
216
+ const outdir = join(testRoot, 'out');
217
+ const srcDir = join(testRoot, 'src');
218
+ const stepFile = join(srcDir, 'step.ts');
219
+ const parentPkgDir = join(testRoot, 'node_modules', 'parent-pkg');
220
+ const parentPkgIndex = join(parentPkgDir, 'index.js');
221
+ const nativePkgDir = join(parentPkgDir, 'node_modules', 'optional-native');
222
+ writeFile(join(parentPkgDir, 'package.json'), JSON.stringify({ name: 'parent-pkg', main: 'index.js' }));
223
+ writeFile(parentPkgIndex, `const native = require('optional-native');\nexports.value = native.value;`);
224
+ writeFile(join(nativePkgDir, 'package.json'), JSON.stringify({ name: 'optional-native', main: 'binding.node' }));
225
+ writeFile(join(nativePkgDir, 'binding.node'), '');
226
+ writeFile(stepFile, `import { value } from 'parent-pkg';\nconsole.log(value);`);
227
+ const result = await esbuild.build({
228
+ entryPoints: [stepFile],
229
+ absWorkingDir: testRoot,
230
+ outdir,
231
+ bundle: true,
232
+ format: 'esm',
233
+ platform: 'node',
234
+ write: false,
235
+ plugins: [
236
+ createSwcPlugin({
237
+ mode: 'step',
238
+ entriesToBundle: [stepFile, parentPkgIndex],
239
+ outdir,
240
+ }),
241
+ ],
242
+ });
243
+ expect(result.errors).toHaveLength(0);
244
+ const output = result.outputFiles[0].text;
245
+ expect(output).toContain('optional-native');
246
+ expect(output).not.toContain('binding.node');
247
+ });
153
248
  it.each([
154
249
  '.ts',
155
250
  '.tsx',
@@ -181,6 +276,187 @@ describe('createSwcPlugin externalizeNonSteps', () => {
181
276
  const output = result.outputFiles[0].text;
182
277
  expect(output).toContain(`/dep${inputExt}`);
183
278
  });
279
+ it('bundles transitive local TypeScript dependencies with extensionless imports', async () => {
280
+ const outdir = join(testRoot, 'out');
281
+ const stepFile = join(testRoot, 'server', 'workflows', 'my-workflow.ts');
282
+ const constantsFile = join(testRoot, 'shared', 'constants.ts');
283
+ const helpersFile = join(testRoot, 'shared', 'helpers.ts');
284
+ writeFile(helpersFile, `export const HELPER_VALUE = "from-helper";`);
285
+ writeFile(constantsFile, `import { HELPER_VALUE } from './helpers';\nexport const CATEGORIES = [HELPER_VALUE];`);
286
+ writeFile(stepFile, `import { CATEGORIES } from '../../shared/constants';\nexport async function myStep() {\n 'use step';\n return CATEGORIES[0];\n}`);
287
+ const state = {
288
+ discoveredSteps: new Set(),
289
+ discoveredWorkflows: new Set(),
290
+ discoveredSerdeFiles: new Set(),
291
+ };
292
+ await esbuild.build({
293
+ entryPoints: [stepFile],
294
+ absWorkingDir: testRoot,
295
+ bundle: true,
296
+ format: 'esm',
297
+ platform: 'node',
298
+ write: false,
299
+ resolveExtensions: ['.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs'],
300
+ plugins: [createDiscoverEntriesPlugin(state, testRoot)],
301
+ });
302
+ const result = await esbuild.build({
303
+ entryPoints: [stepFile],
304
+ absWorkingDir: testRoot,
305
+ outdir,
306
+ bundle: true,
307
+ format: 'esm',
308
+ platform: 'node',
309
+ write: false,
310
+ resolveExtensions: ['.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs'],
311
+ plugins: [
312
+ createSwcPlugin({
313
+ mode: 'step',
314
+ entriesToBundle: [stepFile],
315
+ outdir,
316
+ bundleTransitiveLocalStepDependencies: true,
317
+ }),
318
+ ],
319
+ });
320
+ expect(result.errors).toHaveLength(0);
321
+ const output = result.outputFiles[0].text;
322
+ expect(output).toContain('from-helper');
323
+ expect(output).not.toMatch(/from\s+["'][^"']*shared\/constants/);
324
+ expect(output).not.toMatch(/from\s+["'][^"']*shared\/helpers/);
325
+ });
326
+ it('externalizes transitive local TypeScript dependencies by default', async () => {
327
+ const outdir = join(testRoot, 'out');
328
+ const stepFile = join(testRoot, 'server', 'workflows', 'my-workflow.ts');
329
+ const constantsFile = join(testRoot, 'shared', 'constants.ts');
330
+ const helpersFile = join(testRoot, 'shared', 'helpers.ts');
331
+ writeFile(helpersFile, `export const HELPER_VALUE = "from-helper";`);
332
+ writeFile(constantsFile, `import { HELPER_VALUE } from './helpers';\nexport const CATEGORIES = [HELPER_VALUE];`);
333
+ writeFile(stepFile, `import { CATEGORIES } from '../../shared/constants';\nexport async function myStep() {\n 'use step';\n return CATEGORIES[0];\n}`);
334
+ const state = {
335
+ discoveredSteps: new Set(),
336
+ discoveredWorkflows: new Set(),
337
+ discoveredSerdeFiles: new Set(),
338
+ };
339
+ await esbuild.build({
340
+ entryPoints: [stepFile],
341
+ absWorkingDir: testRoot,
342
+ bundle: true,
343
+ format: 'esm',
344
+ platform: 'node',
345
+ write: false,
346
+ resolveExtensions: ['.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs'],
347
+ plugins: [createDiscoverEntriesPlugin(state, testRoot)],
348
+ });
349
+ const result = await esbuild.build({
350
+ entryPoints: [stepFile],
351
+ absWorkingDir: testRoot,
352
+ outdir,
353
+ bundle: true,
354
+ format: 'esm',
355
+ platform: 'node',
356
+ write: false,
357
+ resolveExtensions: ['.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs'],
358
+ plugins: [
359
+ createSwcPlugin({
360
+ mode: 'step',
361
+ entriesToBundle: [stepFile],
362
+ outdir,
363
+ }),
364
+ ],
365
+ });
366
+ expect(result.errors).toHaveLength(0);
367
+ const output = result.outputFiles[0].text;
368
+ expect(output).not.toContain('from-helper');
369
+ expect(output).toMatch(/from\s+["'][^"']*shared\/constants\.ts["']/);
370
+ });
371
+ it('keeps ordinary package dependencies external when reachable from a bundled step', async () => {
372
+ const outdir = join(testRoot, 'out');
373
+ const stepFile = join(testRoot, 'server', 'workflows', 'my-workflow.ts');
374
+ const pkgDir = join(testRoot, 'node_modules', 'plain-pkg');
375
+ const pkgIndex = join(pkgDir, 'index.js');
376
+ writeFile(join(pkgDir, 'package.json'), JSON.stringify({ name: 'plain-pkg', main: 'index.js' }));
377
+ writeFile(pkgIndex, `export const value = "from-package";`);
378
+ writeFile(stepFile, `import { value } from 'plain-pkg';\nexport async function myStep() {\n 'use step';\n return value;\n}`);
379
+ const state = {
380
+ discoveredSteps: new Set(),
381
+ discoveredWorkflows: new Set(),
382
+ discoveredSerdeFiles: new Set(),
383
+ };
384
+ await esbuild.build({
385
+ entryPoints: [stepFile],
386
+ absWorkingDir: testRoot,
387
+ bundle: true,
388
+ format: 'esm',
389
+ platform: 'node',
390
+ write: false,
391
+ plugins: [createDiscoverEntriesPlugin(state, testRoot)],
392
+ });
393
+ const result = await esbuild.build({
394
+ entryPoints: [stepFile],
395
+ absWorkingDir: testRoot,
396
+ outdir,
397
+ bundle: true,
398
+ format: 'esm',
399
+ platform: 'node',
400
+ write: false,
401
+ plugins: [
402
+ createSwcPlugin({
403
+ mode: 'step',
404
+ entriesToBundle: [stepFile],
405
+ outdir,
406
+ bundleTransitiveLocalStepDependencies: true,
407
+ }),
408
+ ],
409
+ });
410
+ expect(result.errors).toHaveLength(0);
411
+ const output = result.outputFiles[0].text;
412
+ expect(output).toMatch(/from\s+["']plain-pkg["']/);
413
+ expect(output).not.toContain('from-package');
414
+ });
415
+ it('bundles package parents when they lead to discovered workflow-related entries', async () => {
416
+ const outdir = join(testRoot, 'out');
417
+ const stepFile = join(testRoot, 'server', 'workflows', 'my-workflow.ts');
418
+ const pkgDir = join(testRoot, 'node_modules', 'workflow-pkg');
419
+ const pkgIndex = join(pkgDir, 'index.js');
420
+ const pkgSerde = join(pkgDir, 'serde.js');
421
+ writeFile(join(pkgDir, 'package.json'), JSON.stringify({ name: 'workflow-pkg', main: 'index.js' }));
422
+ writeFile(pkgSerde, `export const value = "from-serde";`);
423
+ writeFile(pkgIndex, `export { value } from './serde.js';`);
424
+ writeFile(stepFile, `import { value } from 'workflow-pkg';\nexport async function myStep() {\n 'use step';\n return value;\n}`);
425
+ const state = {
426
+ discoveredSteps: new Set(),
427
+ discoveredWorkflows: new Set(),
428
+ discoveredSerdeFiles: new Set(),
429
+ };
430
+ await esbuild.build({
431
+ entryPoints: [stepFile],
432
+ absWorkingDir: testRoot,
433
+ bundle: true,
434
+ format: 'esm',
435
+ platform: 'node',
436
+ write: false,
437
+ plugins: [createDiscoverEntriesPlugin(state, testRoot)],
438
+ });
439
+ const result = await esbuild.build({
440
+ entryPoints: [stepFile],
441
+ absWorkingDir: testRoot,
442
+ outdir,
443
+ bundle: true,
444
+ format: 'esm',
445
+ platform: 'node',
446
+ write: false,
447
+ plugins: [
448
+ createSwcPlugin({
449
+ mode: 'step',
450
+ entriesToBundle: [stepFile, pkgSerde],
451
+ outdir,
452
+ }),
453
+ ],
454
+ });
455
+ expect(result.errors).toHaveLength(0);
456
+ const output = result.outputFiles[0].text;
457
+ expect(output).toContain('from-serde');
458
+ expect(output).not.toMatch(/from\s+["']workflow-pkg["']/);
459
+ });
184
460
  });
185
461
  describe('createSwcPlugin sideEffectEntries', () => {
186
462
  let testRoot;
@@ -490,4 +766,4 @@ describe('createSwcPlugin projectRoot', () => {
490
766
  expect(applySwcTransformMock).toHaveBeenCalledWith('src/internal/message/workflow/handle-message.ts', expect.stringContaining('"use workflow"'), 'workflow', fixture.workflowFile, fixture.packageRoot);
491
767
  });
492
768
  });
493
- //# sourceMappingURL=swc-esbuild-plugin.test.js.map
769
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3djLWVzYnVpbGQtcGx1Z2luLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvc3djLWVzYnVpbGQtcGx1Z2luLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxXQUFXLEVBQ1gsWUFBWSxFQUNaLE1BQU0sRUFDTixhQUFhLEdBQ2QsTUFBTSxTQUFTLENBQUM7QUFDakIsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUNqQyxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUMxQyxPQUFPLEtBQUssT0FBTyxNQUFNLFNBQVMsQ0FBQztBQUNuQyxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFFekUsTUFBTSxFQUFFLHFCQUFxQixFQUFFLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQ2xELHFCQUFxQixFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Q0FDL0IsQ0FBQyxDQUFDLENBQUM7QUFFSixFQUFFLENBQUMsSUFBSSxDQUFDLDBCQUEwQixFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7SUFDekMsaUJBQWlCLEVBQUUscUJBQXFCO0NBQ3pDLENBQUMsQ0FBQyxDQUFDO0FBRUosT0FBTyxFQUNMLDJCQUEyQixFQUMzQixhQUFhLEdBQ2QsTUFBTSxzQ0FBc0MsQ0FBQztBQUM5QyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFMUQsTUFBTSxVQUFVLEdBQUcsWUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7QUFFMUMsU0FBUyxTQUFTLENBQUMsSUFBWSxFQUFFLFFBQVEsR0FBRyxFQUFFO0lBQzVDLFNBQVMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFD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LGdCQUFnQixDQUFDLGdCQUFnQixDQUFDLEVBQ3pDLFVBQVUsRUFDVixPQUFPLENBQUMsWUFBWSxFQUNwQixPQUFPLENBQUMsT0FBTyxDQUNoQixDQUFDO0lBQ0osQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMscURBQXFELEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDbkUsTUFBTSxPQUFPLEdBQUcsWUFBWSxFQUFFLENBQUM7UUFFL0IsTUFBTSxNQUFNLEdBQUcsTUFBTSxPQUFPLENBQUMsS0FBSyxDQUFDO1lBQ2pDLFdBQVcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUM7WUFDbkMsYUFBYSxFQUFFLE9BQU8sQ0FBQyxXQUFXO1lBQ2xDLE1BQU0sRUFBRSxJQUFJO1lBQ1osTUFBTSxFQUFFLEtBQUs7WUFDYixRQUFRLEVBQUUsTUFBTTtZQUNoQixLQUFLLEVBQUUsS0FBSztZQUNaLE9BQU8sRUFBRTtnQkFDUCxlQUFlLENBQUM7b0JBQ2QsSUFBSSxFQUFFLFVBQVU7b0JBQ2hCLGdCQUFnQixFQUFFLEVBQUU7aUJBQ3JCLENBQUM7YUFDSDtTQUNGLENBQUMsQ0FBQztRQUVILE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RDLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLG9CQUFvQixDQUNoRCxpREFBaUQsRUFDakQsTUFBTSxDQUFDLGdCQUFnQixDQUFDLGdCQUFnQixDQUFDLEVBQ3pDLFVBQVUsRUFDVixPQUFPLENBQUMsWUFBWSxFQUNwQixPQUFPLENBQUMsV0FBVyxDQUNwQixDQUFDO0lBQ0osQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIG1rZGlyU3luYyxcbiAgbWtkdGVtcFN5bmMsXG4gIHJlYWxwYXRoU3luYyxcbiAgcm1TeW5jLFxuICB3cml0ZUZpbGVTeW5jLFxufSBmcm9tICdub2RlOmZzJztcbmltcG9ydCB7IHRtcGRpciB9IGZyb20gJ25vZGU6b3MnO1xuaW1wb3J0IHsgZGlybmFtZSwgam9pbiB9IGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgKiBhcyBlc2J1aWxkIGZyb20gJ2VzYnVpbGQnO1xuaW1wb3J0IHsgYWZ0ZXJFYWNoLCBiZWZvcmVFYWNoLCBkZXNjcmliZSwgZXhwZWN0LCBpdCwgdmkgfSBmcm9tICd2aXRlc3QnO1xuXG5jb25zdCB7IGFwcGx5U3djVHJhbnNmb3JtTW9jayB9ID0gdmkuaG9pc3RlZCgoKSA9PiAoe1xuICBhcHBseVN3Y1RyYW5zZm9ybU1vY2s6IHZpLmZuKCksXG59KSk7XG5cbnZpLm1vY2soJy4vYXBwbHktc3djLXRyYW5zZm9ybS5qcycsICgpID0+ICh7XG4gIGFwcGx5U3djVHJhbnNmb3JtOiBhcHBseVN3Y1RyYW5zZm9ybU1vY2ssXG59KSk7XG5cbmltcG9ydCB7XG4gIGNyZWF0ZURpc2NvdmVyRW50cmllc1BsdWdpbixcbiAgaW1wb3J0UGFyZW50cyxcbn0gZnJvbSAnLi9kaXNjb3Zlci1lbnRyaWVzLWVzYnVpbGQtcGx1Z2luLmpzJztcbmltcG9ydCB7IGNyZWF0ZVN3Y1BsdWdpbiB9IGZyb20gJy4vc3djLWVzYnVpbGQtcGx1Z2luLmpzJztcblxuY29uc3QgcmVhbFRtcGRpciA9IHJlYWxwYXRoU3luYyh0bXBkaXIoKSk7XG5cbmZ1bmN0aW9uIHdyaXRlRmlsZShwYXRoOiBzdHJpbmcsIGNvbnRlbnRzID0gJycpOiB2b2lkIHtcbiAgbWtkaXJTeW5jKGRpcm5hbWUocGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICB3cml0ZUZpbGVTeW5jKHBhdGgsIGNvbnRlbnRzLCAndXRmLTgnKTtcbn1cblxuZGVzY3JpYmUoJ2NyZWF0ZVN3Y1BsdWdpbiBleHRlcm5hbGl6ZU5vblN0ZXBzJywgKCkgPT4ge1xuICBsZXQgdGVzdFJvb3Q6IHN0cmluZztcblxuICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICB0ZXN0Um9vdCA9IG1rZHRlbXBTeW5jKGpvaW4ocmVhbFRtcGRpciwgJ3dvcmtmbG93LXN3Yy1wbHVnaW4tJykpO1xuICAgIGltcG9ydFBhcmVudHMuY2xlYXIoKTtcbiAgICBhcHBseVN3Y1RyYW5zZm9ybU1vY2subW9ja1Jlc2V0KCk7XG4gICAgYXBwbHlTd2NUcmFuc2Zvcm1Nb2NrLm1vY2tJbXBsZW1lbnRhdGlvbihcbiAgICAgIGFzeW5jIChfZmlsZW5hbWU6IHN0cmluZywgc291cmNlOiBzdHJpbmcpID0+ICh7XG4gICAgICAgIGNvZGU6IHNvdXJjZSxcbiAgICAgICAgd29ya2Zsb3dNYW5pZmVzdDoge30sXG4gICAgICB9KVxuICAgICk7XG4gIH0pO1xuXG4gIGFmdGVyRWFjaCgoKSA9PiB7XG4gICAgaW1wb3J0UGFyZW50cy5jbGVhcigpO1xuICAgIHJtU3luYyh0ZXN0Um9vdCwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICB9KTtcblxuICBpdC5lYWNoKFtcbiAgICB7IGlucHV0RXh0OiAnLnRzJywgb3V0cHV0RXh0OiAnLmpzJyB9LFxuICAgIHsgaW5wdXRFeHQ6ICcudHN4Jywgb3V0cHV0RXh0OiAnLmpzJyB9LFxuICAgIHsgaW5wdXRFeHQ6ICcubXRzJywgb3V0cHV0RXh0OiAnLm1qcycgfSxcbiAgICB7IGlucHV0RXh0OiAnLmN0cycsIG91dHB1dEV4dDogJy5janMnIH0sXG4gIF0pKCdyZXdyaXRlcyBleHRlcm5hbGl6ZWQgJGlucHV0RXh0IGltcG9ydHMgdG8gJG91dHB1dEV4dCB3aGVuIHJld3JpdGVUc0V4dGVuc2lvbnMgaXMgZW5hYmxlZCcsIGFzeW5jICh7XG4gICAgaW5wdXRFeHQsXG4gICAgb3V0cHV0RXh0LFxuICB9KSA9PiB7XG4gICAgY29uc3Qgb3V0ZGlyID0gam9pbih0ZXN0Um9vdCwgJ291dCcpO1xuICAgIGNvbnN0IHNyY0RpciA9IGpvaW4odGVzdFJvb3QsICdzcmMnKTtcbiAgICBjb25zdCBzdGVwRmlsZSA9IGpvaW4oc3JjRGlyLCAnc3RlcC50cycpO1xuXG4gICAgd3JpdGVGaWxlKGpvaW4oc3JjRGlyLCBgZGVwJHtpbnB1dEV4dH1gKSwgJ2V4cG9ydCBjb25zdCBkZXAgPSB7fTsnKTtcbiAgICB3cml0ZUZpbGUoc3RlcEZpbGUsIGBpbXBvcnQgeyBkZXAgfSBmcm9tICcuL2RlcCc7XFxuY29uc29sZS5sb2coZGVwKTtgKTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGVzYnVpbGQuYnVpbGQoe1xuICAgICAgZW50cnlQb2ludHM6IFtzdGVwRmlsZV0sXG4gICAgICBhYnNXb3JraW5nRGlyOiB0ZXN0Um9vdCxcbiAgICAgIG91dGRpcixcbiAgICAgIGJ1bmRsZTogdHJ1ZSxcbiAgICAgIGZvcm1hdDogJ2VzbScsXG4gICAgICBwbGF0Zm9ybTogJ25vZGUnLFxuICAgICAgd3JpdGU6IGZhbHNlLFxuICAgICAgcGx1Z2luczogW1xuICAgICAgICBjcmVhdGVTd2NQbHVnaW4oe1xuICAgICAgICAgIG1vZGU6ICdzdGVwJyxcbiAgICAgICAgICBlbnRyaWVzVG9CdW5kbGU6IFtzdGVwRmlsZV0sXG4gICAgICAgICAgb3V0ZGlyLFxuICAgICAgICAgIHJld3JpdGVUc0V4dGVuc2lvbnM6IHRydWUsXG4gICAgICAgIH0pLFxuICAgICAgXSxcbiAgICB9KTtcblxuICAgIGV4cGVjdChyZXN1bHQuZXJyb3JzKS50b0hhdmVMZW5ndGgoMCk7XG4gICAgY29uc3Qgb3V0cHV0ID0gcmVzdWx0Lm91dHB1dEZpbGVzWzBdLnRleHQ7XG4gICAgZXhwZWN0KG91dHB1dCkudG9Db250YWluKGAvZGVwJHtvdXRwdXRFeHR9YCk7XG4gICAgZXhwZWN0KG91dHB1dCkubm90LnRvQ29udGFpbihgL2RlcCR7aW5wdXRFeHR9YCk7XG4gIH0pO1xuXG4gIGl0KCdidW5kbGVzIHBhdGgtYWxpYXNlZCBwcm9qZWN0LWxvY2FsIGltcG9ydHMgaW5saW5lJywgYXN5bmMgKCkgPT4ge1xuICAgIC8vIEFsaWFzZWQgcHJvamVjdC1sb2NhbCBmaWxlcyBtdXN0IGJlIGJ1bmRsZWQgaW5saW5lIChub3QgZXh0ZXJuYWxpemVkXG4gICAgLy8gYXMgcmVsYXRpdmUgcGF0aHMpIGJlY2F1c2UgdGhlaXIgc291cmNlIG9uIGRpc2sgbWF5IGNvbnRhaW4gZnVydGhlclxuICAgIC8vIGFsaWFzIGltcG9ydHMgdGhhdCBOb2RlJ3MgRVNNIGxvYWRlciBjYW5ub3QgcmVzb2x2ZSBhdCBydW50aW1lLlxuICAgIC8vIFNlZSBwYWNrYWdlcy9idWlsZGVycy9zcmMvc3djLWVzYnVpbGQtcGx1Z2luLnRzIGZvciBmdWxsIHJlYXNvbmluZy5cbiAgICBjb25zdCBvdXRkaXIgPSBqb2luKHRlc3RSb290LCAnb3V0Jyk7XG4gICAgY29uc3Qgc3JjRGlyID0gam9pbih0ZXN0Um9vdCwgJ3NyYycpO1xuICAgIGNvbnN0IGxpYkRpciA9IGpvaW4oc3JjRGlyLCAnbGliJyk7XG4gICAgY29uc3Qgc3RlcEZpbGUgPSBqb2luKHNyY0RpciwgJ3N0ZXAudHMnKTtcblxuICAgIHdyaXRlRmlsZShcbiAgICAgIGpvaW4obGliRGlyLCAnY29uZmlnLnRzJyksXG4gICAgICAnZXhwb3J0IGNvbnN0IGNvbmZpZyA9IHsgdmFsdWU6IFwiaGVsbG8tZnJvbS1jb25maWdcIiB9OydcbiAgICApO1xuICAgIHdyaXRlRmlsZShcbiAgICAgIHN0ZXBGaWxlLFxuICAgICAgYGltcG9ydCB7IGNvbmZpZyB9IGZyb20gJ0AvbGliL2NvbmZpZyc7XFxuY29uc29sZS5sb2coY29uZmlnKTtgXG4gICAgKTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGVzYnVpbGQuYnVpbGQoe1xuICAgICAgZW50cnlQb2ludHM6IFtzdGVwRmlsZV0sXG4gICAgICBhYnNXb3JraW5nRGlyOiB0ZXN0Um9vdCxcbiAgICAgIG91dGRpcixcbiAgICAgIGJ1bmRsZTogdHJ1ZSxcbiAgICAgIGZvcm1hdDogJ2VzbScsXG4gICAgICBwbGF0Zm9ybTogJ25vZGUnLFxuICAgICAgd3JpdGU6IGZhbHNlLFxuICAgICAgYWxpYXM6IHsgJ0AnOiBzcmNEaXIgfSxcbiAgICAgIHBsdWdpbnM6IFtcbiAgICAgICAgY3JlYXRlU3djUGx1Z2luKHtcbiAgICAgICAgICBtb2RlOiAnc3RlcCcsXG4gICAgICAgICAgZW50cmllc1RvQnVuZGxlOiBbc3RlcEZpbGVdLFxuICAgICAgICAgIG91dGRpcixcbiAgICAgICAgICByZXdyaXRlVHNFeHRlbnNpb25zOiB0cnVlLFxuICAgICAgICB9KSxcbiAgICAgIF0sXG4gICAgfSk7XG5cbiAgICBleHBlY3QocmVzdWx0LmVycm9ycykudG9IYXZlTGVuZ3RoKDApO1xuICAgIGNvbnN0IG91dHB1dCA9IHJlc3VsdC5vdXRwdXRGaWxlc1swXS50ZXh0O1xuICAgIC8vIFRoZSBhbGlhc2VkIGhlbHBlciBzaG91bGQgYmUgYnVuZGxlZCBpbmxpbmUgKGl0cyBjb250ZW50IGlzIGluIHRoZVxuICAgIC8vIG91dHB1dCksIG5vdCBleHRlcm5hbGl6ZWQgYXMgYSByZWxhdGl2ZSBwYXRoIG9yIGxlZnQgYXMgYSBiYXJlIGFsaWFzLlxuICAgIGV4cGVjdChvdXRwdXQpLnRvQ29udGFpbignaGVsbG8tZnJvbS1jb25maWcnKTtcbiAgICBleHBlY3Qob3V0cHV0KS5ub3QudG9Db250YWluKCdAL2xpYi9jb25maWcnKTtcbiAgICBleHBlY3Qob3V0cHV0KS5ub3QudG9NYXRjaCgvZnJvbVxccytbXCInXVteXCInXSpcXC9saWJcXC9jb25maWdcXC4oanN8dHMpW1wiJ10vKTtcbiAgfSk7XG5cbiAgaXQoJ2J1bmRsZXMgdHJhbnNpdGl2ZSBhbGlhc2VkIGltcG9ydHMgaW5zaWRlIGFsaWFzZWQgaGVscGVycyAoTXV4IHNlbGYtcmVmZXJlbmNpbmcgcGFja2FnZSByZWdyZXNzaW9uKScsIGFzeW5jICgpID0+IHtcbiAgICAvLyBSZWdyZXNzaW9uIHRlc3QgZm9yIGh0dHBzOi8vZ2l0aHViLmNvbS9tdXhpbmMvYWkvcHVsbC8xOTMuXG4gICAgLy9cbiAgICAvLyBBIHBhY2thZ2Ugc2VsZi1yZWZlcmVuY2VzIGl0cyBvd24gc3VicGF0aCB2aWEgdHNjb25maWcgYHBhdGhzYCAoZS5nLlxuICAgIC8vIGBAbXktcGtnL2xpYi9mb29gIOKGkiBgc3JjL2xpYi9mb28udHNgKS4gQSBzdGVwIGZpbGUgaW1wb3J0cyBhIGhlbHBlclxuICAgIC8vIHZpYSB0aGUgYWxpYXMsIGFuZCB0aGF0IGhlbHBlciBpbXBvcnRzIGFub3RoZXIgaGVscGVyIHZpYSB0aGUgYWxpYXMuXG4gICAgLy9cbiAgICAvLyBQcmV2aW91c2x5IHRoZSBoZWxwZXJzIHdlcmUgZXh0ZXJuYWxpemVkIGFzIHJlbGF0aXZlIHBhdGhzLCBidXQgdGhlaXJcbiAgICAvLyBzb3VyY2Ugb24gZGlzayBzdGlsbCBjb250YWluZWQgYGltcG9ydCBcIkBteS1wa2cvbGliLy4uLlwiYC4gQXQgcnVudGltZSxcbiAgICAvLyBOb2RlJ3MgRVNNIGxvYWRlciBkaWRuJ3Qga25vdyBhYm91dCB0c2NvbmZpZyBwYXRocywgZmVsbCB0aHJvdWdoIHRvXG4gICAgLy8gdGhlIHBhY2thZ2UncyBgZXhwb3J0c2AgbWFwLCBhbmQgdGhyZXcgYFBhY2thZ2Ugc3VicGF0aCAuLi4gaXMgbm90XG4gICAgLy8gZGVmaW5lZCBieSBcImV4cG9ydHNcImAuXG4gICAgLy9cbiAgICAvLyBXaXRoIHRoZSBmaXgsIGFsaWFzZWQgcHJvamVjdC1sb2NhbCBmaWxlcyBhcmUgYnVuZGxlZCBpbmxpbmUsIHNvXG4gICAgLy8gdGhlaXIgYWxpYXMgaW1wb3J0cyBhcmUgcmVzb2x2ZWQgYXQgYnVpbGQgdGltZS5cbiAgICBjb25zdCBvdXRkaXIgPSBqb2luKHRlc3RSb290LCAnb3V0Jyk7XG4gICAgY29uc3Qgc3JjRGlyID0gam9pbih0ZXN0Um9vdCwgJ3NyYycpO1xuICAgIGNvbnN0IGxpYkRpciA9IGpvaW4oc3JjRGlyLCAnbGliJyk7XG4gICAgY29uc3Qgc3RlcEZpbGUgPSBqb2luKHNyY0RpciwgJ3N0ZXAudHMnKTtcblxuICAgIHdyaXRlRmlsZShcbiAgICAgIGpvaW4obGliRGlyLCAncHJvdmlkZXJzLnRzJyksXG4gICAgICAnZXhwb3J0IGNvbnN0IHByb3ZpZGVyTmFtZSA9IFwiYW50aHJvcGljXCI7J1xuICAgICk7XG4gICAgd3JpdGVGaWxlKFxuICAgICAgam9pbihsaWJEaXIsICdjbGllbnQtZmFjdG9yeS50cycpLFxuICAgICAgLy8gSGVscGVyIHVzZXMgdGhlIHNhbWUgYWxpYXMgdG8gcmVhY2ggYSBzaWJsaW5nIOKAlCB0aGlzIGlzIHRoZSBjYXNlXG4gICAgICAvLyB0aGF0IGJyb2tlIHRoZSBNdXggYnVpbGQgd2l0aCB3b3JrZmxvdyA+PSA0LjIuMC1iZXRhLjc4LlxuICAgICAgYGltcG9ydCB7IHByb3ZpZGVyTmFtZSB9IGZyb20gJ0BteS1wa2cvbGliL3Byb3ZpZGVycyc7XG5leHBvcnQgY29uc3QgY2xpZW50ID0geyBwcm92aWRlcjogcHJvdmlkZXJOYW1lIH07YFxuICAgICk7XG4gICAgd3JpdGVGaWxlKFxuICAgICAgc3RlcEZpbGUsXG4gICAgICBgaW1wb3J0IHsgY2xpZW50IH0gZnJvbSAnQG15LXBrZy9saWIvY2xpZW50LWZhY3RvcnknO1xcbmNvbnNvbGUubG9nKGNsaWVudCk7YFxuICAgICk7XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBlc2J1aWxkLmJ1aWxkKHtcbiAgICAgIGVudHJ5UG9pbnRzOiBbc3RlcEZpbGVdLFxuICAgICAgYWJzV29ya2luZ0RpcjogdGVzdFJvb3QsXG4gICAgICBvdXRkaXIsXG4gICAgICBidW5kbGU6IHRydWUsXG4gICAgICBmb3JtYXQ6ICdlc20nLFxuICAgICAgcGxhdGZvcm06ICdub2RlJyxcbiAgICAgIHdyaXRlOiBmYWxzZSxcbiAgICAgIGFsaWFzOiB7ICdAbXktcGtnJzogc3JjRGlyIH0sXG4gICAgICBwbHVnaW5zOiBbXG4gICAgICAgIGNyZWF0ZVN3Y1BsdWdpbih7XG4gICAgICAgICAgbW9kZTogJ3N0ZXAnLFxuICAgICAgICAgIGVudHJpZXNUb0J1bmRsZTogW3N0ZXBGaWxlXSxcbiAgICAgICAgICBvdXRkaXIsXG4gICAgICAgICAgcmV3cml0ZVRzRXh0ZW5zaW9uczogdHJ1ZSxcbiAgICAgICAgfSksXG4gICAgICBdLFxuICAgIH0pO1xuXG4gICAgZXhwZWN0KHJlc3VsdC5lcnJvcnMpLnRvSGF2ZUxlbmd0aCgwKTtcbiAgICBjb25zdCBvdXRwdXQgPSByZXN1bHQub3V0cHV0RmlsZXNbMF0udGV4dDtcbiAgICAvLyBCb3RoIGhlbHBlcnMgc2hvdWxkIGJlIGJ1bmRsZWQgaW5saW5lIOKAlCBubyBhbGlhc2VkIHNwZWNpZmllcnMgc2hvdWxkXG4gICAgLy8gbGVhayBpbnRvIHRoZSBvdXRwdXQsIHdoZXJlIE5vZGUncyBFU00gbG9hZGVyIHdvdWxkIGNob2tlIG9uIHRoZW0uXG4gICAgZXhwZWN0KG91dHB1dCkudG9Db250YWluKCdhbnRocm9waWMnKTtcbiAgICBleHBlY3Qob3V0cHV0KS5ub3QudG9Db250YWluKCdAbXktcGtnL2xpYi9wcm92aWRlcnMnKTtcbiAgICBleHBlY3Qob3V0cHV0KS5ub3QudG9Db250YWluKCdAbXktcGtnL2xpYi9jbGllbnQtZmFjdG9yeScpO1xuICB9KTtcblxuICBpdCgnZG9lcyBub3QgcmVsYXRpdml6ZSBOb2RlLmpzIGJ1aWx0aW4gaW1wb3J0cycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBvdXRkaXIgPSBqb2luKHRlc3RSb290LCAnb3V0Jyk7XG4gICAgY29uc3Qgc3JjRGlyID0gam9pbih0ZXN0Um9vdCwgJ3NyYycpO1xuICAgIGNvbnN0IHN0ZXBGaWxlID0gam9pbihzcmNEaXIsICdzdGVwLnRzJyk7XG5cbiAgICB3cml0ZUZpbGUoXG4gICAgICBzdGVwRmlsZSxcbiAgICAgIGBpbXBvcnQgeyBjcmVhdGVIYXNoIH0gZnJvbSAnY3J5cHRvJztcXG5pbXBvcnQgeyBqb2luIH0gZnJvbSAnbm9kZTpwYXRoJztcXG5jb25zb2xlLmxvZyhjcmVhdGVIYXNoLCBqb2luKTtgXG4gICAgKTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGVzYnVpbGQuYnVpbGQoe1xuICAgICAgZW50cnlQb2ludHM6IFtzdGVwRmlsZV0sXG4gICAgICBhYnNXb3JraW5nRGlyOiB0ZXN0Um9vdCxcbiAgICAgIG91dGRpcixcbiAgICAgIGJ1bmRsZTogdHJ1ZSxcbiAgICAgIGZvcm1hdDogJ2VzbScsXG4gICAgICBwbGF0Zm9ybTogJ25vZGUnLFxuICAgICAgd3JpdGU6IGZhbHNlLFxuICAgICAgcGx1Z2luczogW1xuICAgICAgICBjcmVhdGVTd2NQbHVnaW4oe1xuICAgICAgICAgIG1vZGU6ICdzdGVwJyxcbiAgICAgICAgICBlbnRyaWVzVG9CdW5kbGU6IFtzdGVwRmlsZV0sXG4gICAgICAgICAgb3V0ZGlyLFxuICAgICAgICB9KSxcbiAgICAgIF0sXG4gICAgfSk7XG5cbiAgICBleHBlY3QocmVzdWx0LmVycm9ycykudG9IYXZlTGVuZ3RoKDApO1xuICAgIGNvbnN0IG91dHB1dCA9IHJlc3VsdC5vdXRwdXRGaWxlc1swXS50ZXh0O1xuICAgIC8vIEJ1aWx0aW5zIHNob3VsZCByZW1haW4gYXMgYmFyZSBzcGVjaWZpZXJzLCBub3QgcmVsYXRpdml6ZWQgcGF0aHNcbiAgICBleHBlY3Qob3V0cHV0KS50b01hdGNoKC9mcm9tXFxzK1tcIiddY3J5cHRvW1wiJ10vKTtcbiAgICBleHBlY3Qob3V0cHV0KS50b01hdGNoKC9mcm9tXFxzK1tcIiddbm9kZTpwYXRoW1wiJ10vKTtcbiAgICBleHBlY3Qob3V0cHV0KS5ub3QudG9NYXRjaCgvZnJvbVxccytbXCInXVxcLi4qY3J5cHRvW1wiJ10vKTtcbiAgICBleHBlY3Qob3V0cHV0KS5ub3QudG9NYXRjaCgvZnJvbVxccytbXCInXVxcLi4qbm9kZTpwYXRoW1wiJ10vKTtcbiAgfSk7XG5cbiAgaXQoJ2RvZXMgbm90IGV4dGVybmFsaXplIGFsaWFzZWQgaW1wb3J0cyB0aGF0IHJlc29sdmUgaW50byBub2RlX21vZHVsZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3Qgb3V0ZGlyID0gam9pbih0ZXN0Um9vdCwgJ291dCcpO1xuICAgIGNvbnN0IHNyY0RpciA9IGpvaW4odGVzdFJvb3QsICdzcmMnKTtcbiAgICBjb25zdCBzdGVwRmlsZSA9IGpvaW4oc3JjRGlyLCAnc3RlcC50cycpO1xuICAgIGNvbnN0IG5vZGVNb2R1bGVzRGlyID0gam9pbih0ZXN0Um9vdCwgJ25vZGVfbW9kdWxlcycsICdzb21lLXBrZycpO1xuXG4gICAgd3JpdGVGaWxlKGpvaW4obm9kZU1vZHVsZXNEaXIsICdpbmRleC5qcycpLCAnZXhwb3J0IGNvbnN0IHBrZyA9IFwiaGVsbG9cIjsnKTtcbiAgICB3cml0ZUZpbGUoc3RlcEZpbGUsIGBpbXBvcnQgeyBwa2cgfSBmcm9tICdAcGtnJztcXG5jb25zb2xlLmxvZyhwa2cpO2ApO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZXNidWlsZC5idWlsZCh7XG4gICAgICBlbnRyeVBvaW50czogW3N0ZXBGaWxlXSxcbiAgICAgIGFic1dvcmtpbmdEaXI6IHRlc3RSb290LFxuICAgICAgb3V0ZGlyLFxuICAgICAgYnVuZGxlOiB0cnVlLFxuICAgICAgZm9ybWF0OiAnZXNtJyxcbiAgICAgIHBsYXRmb3JtOiAnbm9kZScsXG4gICAgICB3cml0ZTogZmFsc2UsXG4gICAgICBhbGlhczogeyAnQHBrZyc6IGpvaW4obm9kZU1vZHVsZXNEaXIsICdpbmRleC5qcycpIH0sXG4gICAgICBwbHVnaW5zOiBbXG4gICAgICAgIGNyZWF0ZVN3Y1BsdWdpbih7XG4gICAgICAgICAgbW9kZTogJ3N0ZXAnLFxuICAgICAgICAgIGVudHJpZXNUb0J1bmRsZTogW3N0ZXBGaWxlXSxcbiAgICAgICAgICBvdXRkaXIsXG4gICAgICAgIH0pLFxuICAgICAgXSxcbiAgICB9KTtcblxuICAgIGV4cGVjdChyZXN1bHQuZXJyb3JzKS50b0hhdmVMZW5ndGgoMCk7XG4gICAgY29uc3Qgb3V0cHV0ID0gcmVzdWx0Lm91dHB1dEZpbGVzWzBdLnRleHQ7XG4gICAgLy8gU2hvdWxkIGJlIGJ1bmRsZWQgKGlubGluZWQpLCBub3QgZXh0ZXJuYWxpemVkIGFzIGEgcmVsYXRpdmUgbm9kZV9tb2R1bGVzIHBhdGhcbiAgICBleHBlY3Qob3V0cHV0KS50b0NvbnRhaW4oJ2hlbGxvJyk7XG4gICAgZXhwZWN0KG91dHB1dCkubm90LnRvTWF0Y2goL2Zyb21cXHMrW1wiJ10uKm5vZGVfbW9kdWxlcy8pO1xuICB9KTtcblxuICBpdCgnZXh0ZXJuYWxpemVzIG5lc3RlZCBiYXJlIHBhY2thZ2UgaW1wb3J0cyB0aGF0IG9ubHkgcmVzb2x2ZSBmcm9tIGEgYnVuZGxlZCBwYWNrYWdlJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IG91dGRpciA9IGpvaW4odGVzdFJvb3QsICdvdXQnKTtcbiAgICBjb25zdCBzcmNEaXIgPSBqb2luKHRlc3RSb290LCAnc3JjJyk7XG4gICAgY29uc3Qgc3RlcEZpbGUgPSBqb2luKHNyY0RpciwgJ3N0ZXAudHMnKTtcbiAgICBjb25zdCBwYXJlbnRQa2dEaXIgPSBqb2luKHRlc3RSb290LCAnbm9kZV9tb2R1bGVzJywgJ3BhcmVudC1wa2cnKTtcbiAgICBjb25zdCBwYXJlbnRQa2dJbmRleCA9IGpvaW4ocGFyZW50UGtnRGlyLCAnaW5kZXguanMnKTtcbiAgICBjb25zdCBuYXRpdmVQa2dEaXIgPSBqb2luKHBhcmVudFBrZ0RpciwgJ25vZGVfbW9kdWxlcycsICdvcHRpb25hbC1uYXRpdmUnKTtcblxuICAgIHdyaXRlRmlsZShcbiAgICAgIGpvaW4ocGFyZW50UGtnRGlyLCAncGFja2FnZS5qc29uJyksXG4gICAgICBKU09OLnN0cmluZ2lmeSh7IG5hbWU6ICdwYXJlbnQtcGtnJywgbWFpbjogJ2luZGV4LmpzJyB9KVxuICAgICk7XG4gICAgd3JpdGVGaWxlKFxuICAgICAgcGFyZW50UGtnSW5kZXgsXG4gICAgICBgY29uc3QgbmF0aXZlID0gcmVxdWlyZSgnb3B0aW9uYWwtbmF0aXZlJyk7XFxuZXhwb3J0cy52YWx1ZSA9IG5hdGl2ZS52YWx1ZTtgXG4gICAgKTtcbiAgICB3cml0ZUZpbGUoXG4gICAgICBqb2luKG5hdGl2ZVBrZ0RpciwgJ3BhY2thZ2UuanNvbicpLFxuICAgICAgSlNPTi5zdHJpbmdpZnkoeyBuYW1lOiAnb3B0aW9uYWwtbmF0aXZlJywgbWFpbjogJ2JpbmRpbmcubm9kZScgfSlcbiAgICApO1xuICAgIHdyaXRlRmlsZShqb2luKG5hdGl2ZVBrZ0RpciwgJ2JpbmRpbmcubm9kZScpLCAnJyk7XG4gICAgd3JpdGVGaWxlKFxuICAgICAgc3RlcEZpbGUsXG4gICAgICBgaW1wb3J0IHsgdmFsdWUgfSBmcm9tICdwYXJlbnQtcGtnJztcXG5jb25zb2xlLmxvZyh2YWx1ZSk7YFxuICAgICk7XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBlc2J1aWxkLmJ1aWxkKHtcbiAgICAgIGVudHJ5UG9pbnRzOiBbc3RlcEZpbGVdLFxuICAgICAgYWJzV29ya2luZ0RpcjogdGVzdFJvb3QsXG4gICAgICBvdXRkaXIsXG4gICAgICBidW5kbGU6IHRydWUsXG4gICAgICBmb3JtYXQ6ICdlc20nLFxuICAgICAgcGxhdGZvcm06ICdub2RlJyxcbiAgICAgIHdyaXRlOiBmYWxzZSxcbiAgICAgIHBsdWdpbnM6IFtcbiAgICAgICAgY3JlYXRlU3djUGx1Z2luKHtcbiAgICAgICAgICBtb2RlOiAnc3RlcCcsXG4gICAgICAgICAgZW50cmllc1RvQnVuZGxlOiBbc3RlcEZpbGUsIHBhcmVudFBrZ0luZGV4XSxcbiAgICAgICAgICBvdXRkaXIsXG4gICAgICAgIH0pLFxuICAgICAgXSxcbiAgICB9KTtcblxuICAgIGV4cGVjdChyZXN1bHQuZXJyb3JzKS50b0hhdmVMZW5ndGgoMCk7XG4gICAgY29uc3Qgb3V0cHV0ID0gcmVzdWx0Lm91dHB1dEZpbGVzWzBdLnRleHQ7XG4gICAgZXhwZWN0KG91dHB1dCkudG9Db250YWluKCdvcHRpb25hbC1uYXRpdmUnKTtcbiAgICBleHBlY3Qob3V0cHV0KS5ub3QudG9Db250YWluKCdiaW5kaW5nLm5vZGUnKTtcbiAgfSk7XG5cbiAgaXQuZWFjaChbXG4gICAgJy50cycsXG4gICAgJy50c3gnLFxuICAgICcubXRzJyxcbiAgICAnLmN0cycsXG4gIF0pKCdwcmVzZXJ2ZXMgZXh0ZXJuYWxpemVkICVzIGV4dGVuc2lvbnMgYnkgZGVmYXVsdCcsIGFzeW5jIChpbnB1dEV4dCkgPT4ge1xuICAgIGNvbnN0IG91dGRpciA9IGpvaW4odGVzdFJvb3QsICdvdXQnKTtcbiAgICBjb25zdCBzcmNEaXIgPSBqb2luKHRlc3RSb290LCAnc3JjJyk7XG4gICAgY29uc3Qgc3RlcEZpbGUgPSBqb2luKHNyY0RpciwgJ3N0ZXAudHMnKTtcblxuICAgIHdyaXRlRmlsZShqb2luKHNyY0RpciwgYGRlcCR7aW5wdXRFeHR9YCksICdleHBvcnQgY29uc3QgZGVwID0ge307Jyk7XG4gICAgd3JpdGVGaWxlKHN0ZXBGaWxlLCBgaW1wb3J0IHsgZGVwIH0gZnJvbSAnLi9kZXAnO1xcbmNvbnNvbGUubG9nKGRlcCk7YCk7XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBlc2J1aWxkLmJ1aWxkKHtcbiAgICAgIGVudHJ5UG9pbnRzOiBbc3RlcEZpbGVdLFxuICAgICAgYWJzV29ya2luZ0RpcjogdGVzdFJvb3QsXG4gICAgICBvdXRkaXIsXG4gICAgICBidW5kbGU6IHRydWUsXG4gICAgICBmb3JtYXQ6ICdlc20nLFxuICAgICAgcGxhdGZvcm06ICdub2RlJyxcbiAgICAgIHdyaXRlOiBmYWxzZSxcbiAgICAgIHBsdWdpbnM6IFtcbiAgICAgICAgY3JlYXRlU3djUGx1Z2luKHtcbiAgICAgICAgICBtb2RlOiAnc3RlcCcsXG4gICAgICAgICAgZW50cmllc1RvQnVuZGxlOiBbc3RlcEZpbGVdLFxuICAgICAgICAgIG91dGRpcixcbiAgICAgICAgfSksXG4gICAgICBdLFxuICAgIH0pO1xuXG4gICAgZXhwZWN0KHJlc3VsdC5lcnJvcnMpLnRvSGF2ZUxlbmd0aCgwKTtcbiAgICBjb25zdCBvdXRwdXQgPSByZXN1bHQub3V0cHV0RmlsZXNbMF0udGV4dDtcbiAgICBleHBlY3Qob3V0cHV0KS50b0NvbnRhaW4oYC9kZXAke2lucHV0RXh0fWApO1xuICB9KTtcblxuICBpdCgnYnVuZGxlcyB0cmFuc2l0aXZlIGxvY2FsIFR5cGVTY3JpcHQgZGVwZW5kZW5jaWVzIHdpdGggZXh0ZW5zaW9ubGVzcyBpbXBvcnRzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IG91dGRpciA9IGpvaW4odGVzdFJvb3QsICdvdXQnKTtcbiAgICBjb25zdCBzdGVwRmlsZSA9IGpvaW4odGVzdFJvb3QsICdzZXJ2ZXInLCAnd29ya2Zsb3dzJywgJ215LXdvcmtmbG93LnRzJyk7XG4gICAgY29uc3QgY29uc3RhbnRzRmlsZSA9IGpvaW4odGVzdFJvb3QsICdzaGFyZWQnLCAnY29uc3RhbnRzLnRzJyk7XG4gICAgY29uc3QgaGVscGVyc0ZpbGUgPSBqb2luKHRlc3RSb290LCAnc2hhcmVkJywgJ2hlbHBlcnMudHMnKTtcblxuICAgIHdyaXRlRmlsZShoZWxwZXJzRmlsZSwgYGV4cG9ydCBjb25zdCBIRUxQRVJfVkFMVUUgPSBcImZyb20taGVscGVyXCI7YCk7XG4gICAgd3JpdGVGaWxlKFxuICAgICAgY29uc3RhbnRzRmlsZSxcbiAgICAgIGBpbXBvcnQgeyBIRUxQRVJfVkFMVUUgfSBmcm9tICcuL2hlbHBlcnMnO1xcbmV4cG9ydCBjb25zdCBDQVRFR09SSUVTID0gW0hFTFBFUl9WQUxVRV07YFxuICAgICk7XG4gICAgd3JpdGVGaWxlKFxuICAgICAgc3RlcEZpbGUsXG4gICAgICBgaW1wb3J0IHsgQ0FURUdPUklFUyB9IGZyb20gJy4uLy4uL3NoYXJlZC9jb25zdGFudHMnO1xcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBteVN0ZXAoKSB7XFxuICAndXNlIHN0ZXAnO1xcbiAgcmV0dXJuIENBVEVHT1JJRVNbMF07XFxufWBcbiAgICApO1xuXG4gICAgY29uc3Qgc3RhdGUgPSB7XG4gICAgICBkaXNjb3ZlcmVkU3RlcHM6IG5ldyBTZXQ8c3RyaW5nPigpLFxuICAgICAgZGlzY292ZXJlZFdvcmtmbG93czogbmV3IFNldDxzdHJpbmc+KCksXG4gICAgICBkaXNjb3ZlcmVkU2VyZGVGaWxlczogbmV3IFNldDxzdHJpbmc+KCksXG4gICAgfTtcbiAgICBhd2FpdCBlc2J1aWxkLmJ1aWxkKHtcbiAgICAgIGVudHJ5UG9pbnRzOiBbc3RlcEZpbGVdLFxuICAgICAgYWJzV29ya2luZ0RpcjogdGVzdFJvb3QsXG4gICAgICBidW5kbGU6IHRydWUsXG4gICAgICBmb3JtYXQ6ICdlc20nLFxuICAgICAgcGxhdGZvcm06ICdub2RlJyxcbiAgICAgIHdyaXRlOiBmYWxzZSxcbiAgICAgIHJlc29sdmVFeHRlbnNpb25zOiBbJy50cycsICcudHN4JywgJy5qcycsICcuanN4JywgJy5tanMnLCAnLmNqcyddLFxuICAgICAgcGx1Z2luczogW2NyZWF0ZURpc2NvdmVyRW50cmllc1BsdWdpbihzdGF0ZSwgdGVzdFJvb3QpXSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGVzYnVpbGQuYnVpbGQoe1xuICAgICAgZW50cnlQb2ludHM6IFtzdGVwRmlsZV0sXG4gICAgICBhYnNXb3JraW5nRGlyOiB0ZXN0Um9vdCxcbiAgICAgIG91dGRpcixcbiAgICAgIGJ1bmRsZTogdHJ1ZSxcbiAgICAgIGZvcm1hdDogJ2VzbScsXG4gICAgICBwbGF0Zm9ybTogJ25vZGUnLFxuICAgICAgd3JpdGU6IGZhbHNlLFxuICAgICAgcmVzb2x2ZUV4dGVuc2lvbnM6IFsnLnRzJywgJy50c3gnLCAnLmpzJywgJy5qc3gnLCAnLm1qcycsICcuY2pzJ10sXG4gICAgICBwbHVnaW5zOiBbXG4gICAgICAgIGNyZWF0ZVN3Y1BsdWdpbih7XG4gICAgICAgICAgbW9kZTogJ3N0ZXAnLFxuICAgICAgICAgIGVudHJpZXNUb0J1bmRsZTogW3N0ZXBGaWxlXSxcbiAgICAgICAgICBvdXRkaXIsXG4gICAgICAgICAgYnVuZGxlVHJhbnNpdGl2ZUxvY2FsU3RlcERlcGVuZGVuY2llczogdHJ1ZSxcbiAgICAgICAgfSksXG4gICAgICBdLFxuICAgIH0pO1xuXG4gICAgZXhwZWN0KHJlc3VsdC5lcnJvcnMpLnRvSGF2ZUxlbmd0aCgwKTtcbiAgICBjb25zdCBvdXRwdXQgPSByZXN1bHQub3V0cHV0RmlsZXNbMF0udGV4dDtcbiAgICBleHBlY3Qob3V0cHV0KS50b0NvbnRhaW4oJ2Zyb20taGVscGVyJyk7XG4gICAgZXhwZWN0KG91dHB1dCkubm90LnRvTWF0Y2goL2Zyb21cXHMrW1wiJ11bXlwiJ10qc2hhcmVkXFwvY29uc3RhbnRzLyk7XG4gICAgZXhwZWN0KG91dHB1dCkubm90LnRvTWF0Y2goL2Zyb21cXHMrW1wiJ11bXlwiJ10qc2hhcmVkXFwvaGVscGVycy8pO1xuICB9KTtcblxuICBpdCgnZXh0ZXJuYWxpemVzIHRyYW5zaXRpdmUgbG9jYWwgVHlwZVNjcmlwdCBkZXBlbmRlbmNpZXMgYnkgZGVmYXVsdCcsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBvdXRkaXIgPSBqb2luKHRlc3RSb290LCAnb3V0Jyk7XG4gICAgY29uc3Qgc3RlcEZpbGUgPSBqb2luKHRlc3RSb290LCAnc2VydmVyJywgJ3dvcmtmbG93cycsICdteS13b3JrZmxvdy50cycpO1xuICAgIGNvbnN0IGNvbnN0YW50c0ZpbGUgPSBqb2luKHRlc3RSb290LCAnc2hhcmVkJywgJ2NvbnN0YW50cy50cycpO1xuICAgIGNvbnN0IGhlbHBlcnNGaWxlID0gam9pbih0ZXN0Um9vdCwgJ3NoYXJlZCcsICdoZWxwZXJzLnRzJyk7XG5cbiAgICB3cml0ZUZpbGUoaGVscGVyc0ZpbGUsIGBleHBvcnQgY29uc3QgSEVMUEVSX1ZBTFVFID0gXCJmcm9tLWhlbHBlclwiO2ApO1xuICAgIHdyaXRlRmlsZShcbiAgICAgIGNvbnN0YW50c0ZpbGUsXG4gICAgICBgaW1wb3J0IHsgSEVMUEVSX1ZBTFVFIH0gZnJvbSAnLi9oZWxwZXJzJztcXG5leHBvcnQgY29uc3QgQ0FURUdPUklFUyA9IFtIRUxQRVJfVkFMVUVdO2BcbiAgICApO1xuICAgIHdyaXRlRmlsZShcbiAgICAgIHN0ZXBGaWxlLFxuICAgICAgYGltcG9ydCB7IENBVEVHT1JJRVMgfSBmcm9tICcuLi8uLi9zaGFyZWQvY29uc3RhbnRzJztcXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbXlTdGVwKCkge1xcbiAgJ3VzZSBzdGVwJztcXG4gIHJldHVybiBDQVRFR09SSUVTWzBdO1xcbn1gXG4gICAgKTtcblxuICAgIGNvbnN0IHN0YXRlID0ge1xuICAgICAgZGlzY292ZXJlZFN0ZXBzOiBuZXcgU2V0PHN0cmluZz4oKSxcbiAgICAgIGRpc2NvdmVyZWRXb3JrZmxvd3M6IG5ldyBTZXQ8c3RyaW5nPigpLFxuICAgICAgZGlzY292ZXJlZFNlcmRlRmlsZXM6IG5ldyBTZXQ8c3RyaW5nPigpLFxuICAgIH07XG4gICAgYXdhaXQgZXNidWlsZC5idWlsZCh7XG4gICAgICBlbnRyeVBvaW50czogW3N0ZXBGaWxlXSxcbiAgICAgIGFic1dvcmtpbmdEaXI6IHRlc3RSb290LFxuICAgICAgYnVuZGxlOiB0cnVlLFxuICAgICAgZm9ybWF0OiAnZXNtJyxcbiAgICAgIHBsYXRmb3JtOiAnbm9kZScsXG4gICAgICB3cml0ZTogZmFsc2UsXG4gICAgICByZXNvbHZlRXh0ZW5zaW9uczogWycudHMnLCAnLnRzeCcsICcuanMnLCAnLmpzeCcsICcubWpzJywgJy5janMnXSxcbiAgICAgIHBsdWdpbnM6IFtjcmVhdGVEaXNjb3ZlckVudHJpZXNQbHVnaW4oc3RhdGUsIHRlc3RSb290KV0sXG4gICAgfSk7XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBlc2J1aWxkLmJ1aWxkKHtcbiAgICAgIGVudHJ5UG9pbnRzOiBbc3RlcEZpbGVdLFxuICAgICAgYWJzV29ya2luZ0RpcjogdGVzdFJvb3QsXG4gICAgICBvdXRkaXIsXG4gICAgICBidW5kbGU6IHRydWUsXG4gICAgICBmb3JtYXQ6ICdlc20nLFxuICAgICAgcGxhdGZvcm06ICdub2RlJyxcbiAgICAgIHdyaXRlOiBmYWxzZSxcbiAgICAgIHJlc29sdmVFeHRlbnNpb25zOiBbJy50cycsICcudHN4JywgJy5qcycsICcuanN4JywgJy5tanMnLCAnLmNqcyddLFxuICAgICAgcGx1Z2luczogW1xuICAgICAgICBjcmVhdGVTd2NQbHVnaW4oe1xuICAgICAgICAgIG1vZGU6ICdzdGVwJyxcbiAgICAgICAgICBlbnRyaWVzVG9CdW5kbGU6IFtzdGVwRmlsZV0sXG4gICAgICAgICAgb3V0ZGlyLFxuICAgICAgICB9KSxcbiAgICAgIF0sXG4gICAgfSk7XG5cbiAgICBleHBlY3QocmVzdWx0LmVycm9ycykudG9IYXZlTGVuZ3RoKDApO1xuICAgIGNvbnN0IG91dHB1dCA9IHJlc3VsdC5vdXRwdXRGaWxlc1swXS50ZXh0O1xuICAgIGV4cGVjdChvdXRwdXQpLm5vdC50b0NvbnRhaW4oJ2Zyb20taGVscGVyJyk7XG4gICAgZXhwZWN0KG91dHB1dCkudG9NYXRjaCgvZnJvbVxccytbXCInXVteXCInXSpzaGFyZWRcXC9jb25zdGFudHNcXC50c1tcIiddLyk7XG4gIH0pO1xuXG4gIGl0KCdrZWVwcyBvcmRpbmFyeSBwYWNrYWdlIGRlcGVuZGVuY2llcyBleHRlcm5hbCB3aGVuIHJlYWNoYWJsZSBmcm9tIGEgYnVuZGxlZCBzdGVwJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IG91dGRpciA9IGpvaW4odGVzdFJvb3QsICdvdXQnKTtcbiAgICBjb25zdCBzdGVwRmlsZSA9IGpvaW4odGVzdFJvb3QsICdzZXJ2ZXInLCAnd29ya2Zsb3dzJywgJ215LXdvcmtmbG93LnRzJyk7XG4gICAgY29uc3QgcGtnRGlyID0gam9pbih0ZXN0Um9vdCwgJ25vZGVfbW9kdWxlcycsICdwbGFpbi1wa2cnKTtcbiAgICBjb25zdCBwa2dJbmRleCA9IGpvaW4ocGtnRGlyLCAnaW5kZXguanMnKTtcblxuICAgIHdyaXRlRmlsZShcbiAgICAgIGpvaW4ocGtnRGlyLCAncGFja2FnZS5qc29uJyksXG4gICAgICBKU09OLnN0cmluZ2lmeSh7IG5hbWU6ICdwbGFpbi1wa2cnLCBtYWluOiAnaW5kZXguanMnIH0pXG4gICAgKTtcbiAgICB3cml0ZUZpbGUocGtnSW5kZXgsIGBleHBvcnQgY29uc3QgdmFsdWUgPSBcImZyb20tcGFja2FnZVwiO2ApO1xuICAgIHdyaXRlRmlsZShcbiAgICAgIHN0ZXBGaWxlLFxuICAgICAgYGltcG9ydCB7IHZhbHVlIH0gZnJvbSAncGxhaW4tcGtnJztcXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbXlTdGVwKCkge1xcbiAgJ3VzZSBzdGVwJztcXG4gIHJldHVybiB2YWx1ZTtcXG59YFxuICAgICk7XG5cbiAgICBjb25zdCBzdGF0ZSA9IHtcbiAgICAgIGRpc2NvdmVyZWRTdGVwczogbmV3IFNldDxzdHJpbmc+KCksXG4gICAgICBkaXNjb3ZlcmVkV29ya2Zsb3dzOiBuZXcgU2V0PHN0cmluZz4oKSxcbiAgICAgIGRpc2NvdmVyZWRTZXJkZUZpbGVzOiBuZXcgU2V0PHN0cmluZz4oKSxcbiAgICB9O1xuICAgIGF3YWl0IGVzYnVpbGQuYnVpbGQoe1xuICAgICAgZW50cnlQb2ludHM6IFtzdGVwRmlsZV0sXG4gICAgICBhYnNXb3JraW5nRGlyOiB0ZXN0Um9vdCxcbiAgICAgIGJ1bmRsZTogdHJ1ZSxcbiAgICAgIGZvcm1hdDogJ2VzbScsXG4gICAgICBwbGF0Zm9ybTogJ25vZGUnLFxuICAgICAgd3JpdGU6IGZhbHNlLFxuICAgICAgcGx1Z2luczogW2NyZWF0ZURpc2NvdmVyRW50cmllc1BsdWdpbihzdGF0ZSwgdGVzdFJvb3QpXSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGVzYnVpbGQuYnVpbGQoe1xuICAgICAgZW50cnlQb2ludHM6IFtzdGVwRmlsZV0sXG4gICAgICBhYnNXb3JraW5nRGlyOiB0ZXN0Um9vdCxcbiAgICAgIG91dGRpcixcbiAgICAgIGJ1bmRsZTogdHJ1ZSxcbiAgICAgIGZvcm1hdDogJ2VzbScsXG4gICAgICBwbGF0Zm9ybTogJ25vZGUnLFxuICAgICAgd3JpdGU6IGZhbHNlLFxuICAgICAgcGx1Z2luczogW1xuICAgICAgICBjcmVhdGVTd2NQbHVnaW4oe1xuICAgICAgICAgIG1vZGU6ICdzdGVwJyxcbiAgICAgICAgICBlbnRyaWVzVG9CdW5kbGU6IFtzdGVwRmlsZV0sXG4gICAgICAgICAgb3V0ZGlyLFxuICAgICAgICAgIGJ1bmRsZVRyYW5zaXRpdmVMb2NhbFN0ZXBEZXBlbmRlbmNpZXM6IHRydWUsXG4gICAgICAgIH0pLFxuICAgICAgXSxcbiAgICB9KTtcblxuICAgIGV4cGVjdChyZXN1bHQuZXJyb3JzKS50b0hhdmVMZW5ndGgoMCk7XG4gICAgY29uc3Qgb3V0cHV0ID0gcmVzdWx0Lm91dHB1dEZpbGVzWzBdLnRleHQ7XG4gICAgZXhwZWN0KG91dHB1dCkudG9NYXRjaCgvZnJvbVxccytbXCInXXBsYWluLXBrZ1tcIiddLyk7XG4gICAgZXhwZWN0KG91dHB1dCkubm90LnRvQ29udGFpbignZnJvbS1wYWNrYWdlJyk7XG4gIH0pO1xuXG4gIGl0KCdidW5kbGVzIHBhY2thZ2UgcGFyZW50cyB3aGVuIHRoZXkgbGVhZCB0byBkaXNjb3ZlcmVkIHdvcmtmbG93LXJlbGF0ZWQgZW50cmllcycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBvdXRkaXIgPSBqb2luKHRlc3RSb290LCAnb3V0Jyk7XG4gICAgY29uc3Qgc3RlcEZpbGUgPSBqb2luKHRlc3RSb290LCAnc2VydmVyJywgJ3dvcmtmbG93cycsICdteS13b3JrZmxvdy50cycpO1xuICAgIGNvbnN0IHBrZ0RpciA9IGpvaW4odGVzdFJvb3QsICdub2RlX21vZHVsZXMnLCAnd29ya2Zsb3ctcGtnJyk7XG4gICAgY29uc3QgcGtnSW5kZXggPSBqb2luKHBrZ0RpciwgJ2luZGV4LmpzJyk7XG4gICAgY29uc3QgcGtnU2VyZGUgPSBqb2luKHBrZ0RpciwgJ3NlcmRlLmpzJyk7XG5cbiAgICB3cml0ZUZpbGUoXG4gICAgICBqb2luKHBrZ0RpciwgJ3BhY2thZ2UuanNvbicpLFxuICAgICAgSlNPTi5zdHJpbmdpZnkoeyBuYW1lOiAnd29ya2Zsb3ctcGtnJywgbWFpbjogJ2luZGV4LmpzJyB9KVxuICAgICk7XG4gICAgd3JpdGVGaWxlKHBrZ1NlcmRlLCBgZXhwb3J0IGNvbnN0IHZhbHVlID0gXCJmcm9tLXNlcmRlXCI7YCk7XG4gICAgd3JpdGVGaWxlKHBrZ0luZGV4LCBgZXhwb3J0IHsgdmFsdWUgfSBmcm9tICcuL3NlcmRlLmpzJztgKTtcbiAgICB3cml0ZUZpbGUoXG4gICAgICBzdGVwRmlsZSxcbiAgICAgIGBpbXBvcnQgeyB2YWx1ZSB9IGZyb20gJ3dvcmtmbG93LXBrZyc7XFxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG15U3RlcCgpIHtcXG4gICd1c2Ugc3RlcCc7XFxuICByZXR1cm4gdmFsdWU7XFxufWBcbiAgICApO1xuXG4gICAgY29uc3Qgc3RhdGUgPSB7XG4gICAgICBkaXNjb3ZlcmVkU3RlcHM6IG5ldyBTZXQ8c3RyaW5nPigpLFxuICAgICAgZGlzY292ZXJlZFdvcmtmbG93czogbmV3IFNldDxzdHJpbmc+KCksXG4gICAgICBkaXNjb3ZlcmVkU2VyZGVGaWxlczogbmV3IFNldDxzdHJpbmc+KCksXG4gICAgfTtcbiAgICBhd2FpdCBlc2J1aWxkLmJ1aWxkKHtcbiAgICAgIGVudHJ5UG9pbnRzOiBbc3RlcEZpbGVdLFxuICAgICAgYWJzV29ya2luZ0RpcjogdGVzdFJvb3QsXG4gICAgICBidW5kbGU6IHRydWUsXG4gICAgICBmb3JtYXQ6ICdlc20nLFxuICAgICAgcGxhdGZvcm06ICdub2RlJyxcbiAgICAgIHdyaXRlOiBmYWxzZSxcbiAgICAgIHBsdWdpbnM6IFtjcmVhdGVEaXNjb3ZlckVudHJpZXNQbHVnaW4oc3RhdGUsIHRlc3RSb290KV0sXG4gICAgfSk7XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBlc2J1aWxkLmJ1aWxkKHtcbiAgICAgIGVudHJ5UG9pbnRzOiBbc3RlcEZpbGVdLFxuICAgICAgYWJzV29ya2luZ0RpcjogdGVzdFJvb3QsXG4gICAgICBvdXRkaXIsXG4gICAgICBidW5kbGU6IHRydWUsXG4gICAgICBmb3JtYXQ6ICdlc20nLFxuICAgICAgcGxhdGZvcm06ICdub2RlJyxcbiAgICAgIHdyaXRlOiBmYWxzZSxcbiAgICAgIHBsdWdpbnM6IFtcbiAgICAgICAgY3JlYXRlU3djUGx1Z2luKHtcbiAgICAgICAgICBtb2RlOiAnc3RlcCcsXG4gICAgICAgICAgZW50cmllc1RvQnVuZGxlOiBbc3RlcEZpbGUsIHBrZ1NlcmRlXSxcbiAgICAgICAgICBvdXRkaXIsXG4gICAgICAgIH0pLFxuICAgICAgXSxcbiAgICB9KTtcblxuICAgIGV4cGVjdChyZXN1bHQuZXJyb3JzKS50b0hhdmVMZW5ndGgoMCk7XG4gICAgY29uc3Qgb3V0cHV0ID0gcmVzdWx0Lm91dHB1dEZpbGVzWzBdLnRleHQ7XG4gICAgZXhwZWN0KG91dHB1dCkudG9Db250YWluKCdmcm9tLXNlcmRlJyk7XG4gICAgZXhwZWN0KG91dHB1dCkubm90LnRvTWF0Y2goL2Zyb21cXHMrW1wiJ113b3JrZmxvdy1wa2dbXCInXS8pO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZSgnY3JlYXRlU3djUGx1Z2luIHNpZGVFZmZlY3RFbnRyaWVzJywgKCkgPT4ge1xuICBsZXQgdGVzdFJvb3Q6IHN0cmluZztcblxuICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICB0ZXN0Um9vdCA9IG1rZHRlbXBTeW5jKGpvaW4ocmVhbFRtcGRpciwgJ3dvcmtmbG93LXN3Yy1wbHVnaW4tJykpO1xuICAgIGFwcGx5U3djVHJhbnNmb3JtTW9jay5tb2NrUmVzZXQoKTtcbiAgfSk7XG5cbiAgYWZ0ZXJFYWNoKCgpID0+IHtcbiAgICBybVN5bmModGVzdFJvb3QsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgfSk7XG5cbiAgLyoqXG4gICAqIEhlbHBlcjogY3JlYXRlcyBhIGZha2Ugbm9kZV9tb2R1bGVzIHBhY2thZ2Ugd2l0aCBgXCJzaWRlRWZmZWN0c1wiOiBmYWxzZWBcbiAgICogaW4gaXRzIHBhY2thZ2UuanNvbiBhbmQgYSBzaW5nbGUgZW50cnkgZmlsZSB0aGF0IGV4cG9ydHMgYSBzaWRlLWVmZmVjdGZ1bFxuICAgKiByZWdpc3RyYXRpb24gY2FsbCAoc2ltdWxhdGluZyB3aGF0IHRoZSBTV0MgdHJhbnNmb3JtIHByb2R1Y2VzKS5cbiAgICovXG4gIGZ1bmN0aW9uIGNyZWF0ZVNpZGVFZmZlY3RzRmFsc2VQYWNrYWdlKFxuICAgIHBhY2thZ2VOYW1lOiBzdHJpbmcsXG4gICAgZW50cnlDb2RlOiBzdHJpbmdcbiAgKTogc3RyaW5nIHtcbiAgICBjb25zdCBwa2dEaXIgPSBqb2luKHRlc3RSb290LCAnbm9kZV9tb2R1bGVzJywgcGFja2FnZU5hbWUpO1xuICAgIHdyaXRlRmlsZShcbiAgICAgIGpvaW4ocGtnRGlyLCAncGFja2FnZS5qc29uJyksXG4gICAgICBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIG5hbWU6IHBhY2thZ2VOYW1lLFxuICAgICAgICB2ZXJzaW9uOiAnMS4wLjAnLFxuICAgICAgICBzaWRlRWZmZWN0czogZmFsc2UsXG4gICAgICAgIG1haW46ICdpbmRleC5qcycsXG4gICAgICB9KVxuICAgICk7XG4gICAgY29uc3QgZW50cnlQYXRoID0gam9pbihwa2dEaXIsICdpbmRleC5qcycpO1xuICAgIHdyaXRlRmlsZShlbnRyeVBhdGgsIGVudHJ5Q29kZSk7XG4gICAgcmV0dXJuIGVudHJ5UGF0aDtcbiAgfVxuXG4gIGl0KCdwcmVzZXJ2ZXMgYmFyZSBpbXBvcnRzIG9mIHNpZGVFZmZlY3RFbnRyaWVzIHBhY2thZ2VzIHdoZW4gYnVuZGxpbmcgd2l0aG91dCBlbnRyaWVzVG9CdW5kbGUnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3Qgc2lkZUVmZmVjdENvZGUgPVxuICAgICAgJ2dsb2JhbFRoaXMuX19yZWdpc3RlcmVkID0gZ2xvYmFsVGhpcy5fX3JlZ2lzdGVyZWQgfHwgW107XFxuZ2xvYmFsVGhpcy5fX3JlZ2lzdGVyZWQucHVzaChcIm15LXBrZ1wiKTsnO1xuICAgIGNvbnN0IGVudHJ5UGF0aCA9IGNyZWF0ZVNpZGVFZmZlY3RzRmFsc2VQYWNrYWdlKFxuICAgICAgJ215LXNpZGUtZWZmZWN0LXBrZycsXG4gICAgICBzaWRlRWZmZWN0Q29kZVxuICAgICk7XG5cbiAgICAvLyBTV0MgbW9jazogcmV0dXJuIHRoZSBjb2RlIHVuY2hhbmdlZCAodGhlIHNpZGUgZWZmZWN0cyBhcmUgYWxyZWFkeSB0aGVyZSlcbiAgICBhcHBseVN3Y1RyYW5zZm9ybU1vY2subW9ja0ltcGxlbWVudGF0aW9uKFxuICAgICAgYXN5bmMgKF9maWxlbmFtZTogc3RyaW5nLCBzb3VyY2U6IHN0cmluZykgPT4gKHtcbiAgICAgICAgY29kZTogc291cmNlLFxuICAgICAgICB3b3JrZmxvd01hbmlmZXN0OiB7fSxcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGVzYnVpbGQuYnVpbGQoe1xuICAgICAgc3RkaW46IHtcbiAgICAgICAgY29udGVudHM6IGBpbXBvcnQgJ215LXNpZGUtZWZmZWN0LXBrZyc7YCxcbiAgICAgICAgcmVzb2x2ZURpcjogdGVzdFJvb3QsXG4gICAgICAgIHNvdXJjZWZpbGU6ICd2aXJ0dWFsLWVudHJ5LmpzJyxcbiAgICAgICAgbG9hZGVyOiAnanMnLFxuICAgICAgfSxcbiAgICAgIGFic1dvcmtpbmdEaXI6IHRlc3RSb290LFxuICAgICAgYnVuZGxlOiB0cnVlLFxuICAgICAgZm9ybWF0OiAnY2pzJyxcbiAgICAgIHBsYXRmb3JtOiAnbm9kZScsXG4gICAgICB3cml0ZTogZmFsc2UsXG4gICAgICB0cmVlU2hha2luZzogdHJ1ZSxcbiAgICAgIGxvZ0xldmVsOiAnc2lsZW50JyxcbiAgICAgIHBsdWdpbnM6IFtcbiAgICAgICAgY3JlYXRlU3djUGx1Z2luKHtcbiAgICAgICAgICBtb2RlOiAnd29ya2Zsb3cnLFxuICAgICAgICAgIHNpZGVFZmZlY3RFbnRyaWVzOiBbZW50cnlQYXRoXSxcbiAgICAgICAgfSksXG4gICAgICBdLFxuICAgIH0pO1xuXG4gICAgZXhwZWN0KHJlc3VsdC5lcnJvcnMpLnRvSGF2ZUxlbmd0aCgwKTtcbiAgICBjb25zdCBvdXRwdXQgPSByZXN1bHQub3V0cHV0RmlsZXNbMF0udGV4dDtcbiAgICAvLyBUaGUgcmVnaXN0cmF0aW9uIGNvZGUgc2hvdWxkIGJlIHByZXNlbnQgaW4gdGhlIGJ1bmRsZVxuICAgIGV4cGVjdChvdXRwdXQpLnRvQ29udGFpbignX19yZWdpc3RlcmVkJyk7XG4gIH0pO1xuXG4gIGl0KCdkcm9wcyBiYXJlIGltcG9ydHMgd2hlbiBzaWRlRWZmZWN0RW50cmllcyBpcyBOT1QgcHJvdmlkZWQgZm9yIHNpZGVFZmZlY3RzOmZhbHNlIHBhY2thZ2VzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHNpZGVFZmZlY3RDb2RlID1cbiAgICAgICdnbG9iYWxUaGlzLl9fcmVnaXN0ZXJlZCA9IGdsb2JhbFRoaXMuX19yZWdpc3RlcmVkIHx8IFtdO1xcbmdsb2JhbFRoaXMuX19yZWdpc3RlcmVkLnB1c2goXCJteS1wa2dcIik7JztcbiAgICBjcmVhdGVTaWRlRWZmZWN0c0ZhbHNlUGFja2FnZSgnbXktZHJvcHBlZC1wa2cnLCBzaWRlRWZmZWN0Q29kZSk7XG5cbiAgICBhcHBseVN3Y1RyYW5zZm9ybU1vY2subW9ja0ltcGxlbWVudGF0aW9uKFxuICAgICAgYXN5bmMgKF9maWxlbmFtZTogc3RyaW5nLCBzb3VyY2U6IHN0cmluZykgPT4gKHtcbiAgICAgICAgY29kZTogc291cmNlLFxuICAgICAgICB3b3JrZmxvd01hbmlmZXN0OiB7fSxcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGVzYnVpbGQuYnVpbGQoe1xuICAgICAgc3RkaW46IHtcbiAgICAgICAgY29udGVudHM6IGBpbXBvcnQgJ215LWRyb3BwZWQtcGtnJztgLFxuICAgICAgICByZXNvbHZlRGlyOiB0ZXN0Um9vdCxcbiAgICAgICAgc291cmNlZmlsZTogJ3ZpcnR1YWwtZW50cnkuanMnLFxuICAgICAgICBsb2FkZXI6ICdqcycsXG4gICAgICB9LFxuICAgICAgYWJzV29ya2luZ0RpcjogdGVzdFJvb3QsXG4gICAgICBidW5kbGU6IHRydWUsXG4gICAgICBmb3JtYXQ6ICdjanMnLFxuICAgICAgcGxhdGZvcm06ICdub2RlJyxcbiAgICAgIHdyaXRlOiBmYWxzZSxcbiAgICAgIHRyZWVTaGFraW5nOiB0cnVlLFxuICAgICAgbG9nTGV2ZWw6ICdzaWxlbnQnLFxuICAgICAgcGx1Z2luczogW1xuICAgICAgICBjcmVhdGVTd2NQbHVnaW4oe1xuICAgICAgICAgIG1vZGU6ICd3b3JrZmxvdycsXG4gICAgICAgIH0pLFxuICAgICAgXSxcbiAgICB9KTtcblxuICAgIGV4cGVjdChyZXN1bHQuZXJyb3JzKS50b0hhdmVMZW5ndGgoMCk7XG4gICAgY29uc3Qgb3V0cHV0ID0gcmVzdWx0Lm91dHB1dEZpbGVzWzBdLnRleHQ7XG4gICAgLy8gV2l0aG91dCBzaWRlRWZmZWN0RW50cmllcywgZXNidWlsZCBkcm9wcyB0aGUgYmFyZSBpbXBvcnRcbiAgICBleHBlY3Qob3V0cHV0KS5ub3QudG9Db250YWluKCdfX3JlZ2lzdGVyZWQnKTtcbiAgfSk7XG5cbiAgaXQoJ3Byb2R1Y2VzIG5vIHdhcm5pbmdzIGZvciBzaWRlRWZmZWN0RW50cmllcyBwYWNrYWdlcycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBzaWRlRWZmZWN0Q29kZSA9XG4gICAgICAnZ2xvYmFsVGhpcy5fX3JlZ2lzdGVyZWQgPSBnbG9iYWxUaGlzLl9fcmVnaXN0ZXJlZCB8fCBbXTtcXG5nbG9iYWxUaGlzLl9fcmVnaXN0ZXJlZC5wdXNoKFwid2FybmVkLXBrZ1wiKTsnO1xuICAgIGNvbnN0IGVudHJ5UGF0aCA9IGNyZWF0ZVNpZGVFZmZlY3RzRmFsc2VQYWNrYWdlKFxuICAgICAgJ215LXdhcm5lZC1wa2cnLFxuICAgICAgc2lkZUVmZmVjdENvZGVcbiAgICApO1xuXG4gICAgYXBwbHlTd2NUcmFuc2Zvcm1Nb2NrLm1vY2tJbXBsZW1lbnRhdGlvbihcbiAgICAgIGFzeW5jIChfZmlsZW5hbWU6IHN0cmluZywgc291cmNlOiBzdHJpbmcpID0+ICh7XG4gICAgICAgIGNvZGU6IHNvdXJjZSxcbiAgICAgICAgd29ya2Zsb3dNYW5pZmVzdDoge30sXG4gICAgICB9KVxuICAgICk7XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBlc2J1aWxkLmJ1aWxkKHtcbiAgICAgIHN0ZGluOiB7XG4gICAgICAgIGNvbnRlbnRzOiBgaW1wb3J0ICdteS13YXJuZWQtcGtnJztgLFxuICAgICAgICByZXNvbHZlRGlyOiB0ZXN0Um9vdCxcbiAgICAgICAgc291cmNlZmlsZTogJ3ZpcnR1YWwtZW50cnkuanMnLFxuICAgICAgICBsb2FkZXI6ICdqcycsXG4gICAgICB9LFxuICAgICAgYWJzV29ya2luZ0RpcjogdGVzdFJvb3QsXG4gICAgICBidW5kbGU6IHRydWUsXG4gICAgICBmb3JtYXQ6ICdjanMnLFxuICAgICAgcGxhdGZvcm06ICdub2RlJyxcbiAgICAgIHdyaXRlOiBmYWxzZSxcbiAgICAgIHRyZWVTaGFraW5nOiB0cnVlLFxuICAgICAgcGx1Z2luczogW1xuICAgICAgICBjcmVhdGVTd2NQbHVnaW4oe1xuICAgICAgICAgIG1vZGU6ICd3b3JrZmxvdycsXG4gICAgICAgICAgc2lkZUVmZmVjdEVudHJpZXM6IFtlbnRyeVBhdGhdLFxuICAgICAgICB9KSxcbiAgICAgIF0sXG4gICAgfSk7XG5cbiAgICBleHBlY3QocmVzdWx0LmVycm9ycykudG9IYXZlTGVuZ3RoKDApO1xuICAgIC8vIE5vIFwiaWdub3JlZC1iYXJlLWltcG9ydFwiIHdhcm5pbmdzIHNob3VsZCBiZSBwcm9kdWNlZFxuICAgIGNvbnN0IHNpZGVFZmZlY3RXYXJuaW5ncyA9IHJlc3VsdC53YXJuaW5ncy5maWx0ZXIoXG4gICAgICAodykgPT4gdy5pZCA9PT0gJ2lnbm9yZWQtYmFyZS1pbXBvcnQnXG4gICAgKTtcbiAgICBleHBlY3Qoc2lkZUVmZmVjdFdhcm5pbmdzKS50b0hhdmVMZW5ndGgoMCk7XG4gIH0pO1xuXG4gIGl0KCdwcmVzZXJ2ZXMgYmFyZSBpbXBvcnRzIHdpdGggZW50cmllc1RvQnVuZGxlIGFuZCBzaWRlRWZmZWN0RW50cmllcyB0b2dldGhlcicsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBzaWRlRWZmZWN0Q29kZSA9XG4gICAgICAnZ2xvYmFsVGhpcy5fX3JlZ2lzdGVyZWQgPSBnbG9iYWxUaGlzLl9fcmVnaXN0ZXJlZCB8fCBbXTtcXG5nbG9iYWxUaGlzLl9fcmVnaXN0ZXJlZC5wdXNoKFwiYnVuZGxlZC1wa2dcIik7JztcbiAgICBjb25zdCBlbnRyeVBhdGggPSBjcmVhdGVTaWRlRWZmZWN0c0ZhbHNlUGFja2FnZShcbiAgICAgICdteS1idW5kbGVkLXBrZycsXG4gICAgICBzaWRlRWZmZWN0Q29kZVxuICAgICk7XG5cbiAgICBhcHBseVN3Y1RyYW5zZm9ybU1vY2subW9ja0ltcGxlbWVudGF0aW9uKFxuICAgICAgYXN5bmMgKF9maWxlbmFtZTogc3RyaW5nLCBzb3VyY2U6IHN0cmluZykgPT4gKHtcbiAgICAgICAgY29kZTogc291cmNlLFxuICAgICAgICB3b3JrZmxvd01hbmlmZXN0OiB7fSxcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIGNvbnN0IG91dGRpciA9IGpvaW4odGVzdFJvb3QsICdvdXQnKTtcbiAgICBjb25zdCBzdGVwRmlsZSA9IGpvaW4odGVzdFJvb3QsICdzcmMnLCAnc3RlcC50cycpO1xuICAgIHdyaXRlRmlsZShcbiAgICAgIHN0ZXBGaWxlLFxuICAgICAgYGltcG9ydCAnbXktYnVuZGxlZC1wa2cnO1xcbmV4cG9ydCBjb25zdCBQT1NUID0gKCkgPT4ge307YFxuICAgICk7XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBlc2J1aWxkLmJ1aWxkKHtcbiAgICAgIGVudHJ5UG9pbnRzOiBbc3RlcEZpbGVdLFxuICAgICAgYWJzV29ya2luZ0RpcjogdGVzdFJvb3QsXG4gICAgICBvdXRkaXIsXG4gICAgICBidW5kbGU6IHRydWUsXG4gICAgICBmb3JtYXQ6ICdlc20nLFxuICAgICAgcGxhdGZvcm06ICdub2RlJyxcbiAgICAgIHdyaXRlOiBmYWxzZSxcbiAgICAgIHRyZWVTaGFraW5nOiB0cnVlLFxuICAgICAgbG9nTGV2ZWw6ICdzaWxlbnQnLFxuICAgICAgcGx1Z2luczogW1xuICAgICAgICBjcmVhdGVTd2NQbHVnaW4oe1xuICAgICAgICAgIG1vZGU6ICdzdGVwJyxcbiAgICAgICAgICBlbnRyaWVzVG9CdW5kbGU6IFtzdGVwRmlsZSwgZW50cnlQYXRoXSxcbiAgICAgICAgICBvdXRkaXIsXG4gICAgICAgICAgc2lkZUVmZmVjdEVudHJpZXM6IFtlbnRyeVBhdGhdLFxuICAgICAgICB9KSxcbiAgICAgIF0sXG4gICAgfSk7XG5cbiAgICBleHBlY3QocmVzdWx0LmVycm9ycykudG9IYXZlTGVuZ3RoKDApO1xuICAgIGNvbnN0IG91dHB1dCA9IHJlc3VsdC5vdXRwdXRGaWxlc1swXS50ZXh0O1xuICAgIC8vIFRoZSByZWdpc3RyYXRpb24gY29kZSBzaG91bGQgYmUgYnVuZGxlZCBpblxuICAgIGV4cGVjdChvdXRwdXQpLnRvQ29udGFpbignX19yZWdpc3RlcmVkJyk7XG4gIH0pO1xuXG4gIGl0KCdwcmVzZXJ2ZXMgYmFyZSBpbXBvcnRzIGZvciBsb2NhbCBmaWxlcyB3aXRoIHNpZGVFZmZlY3RzOmZhbHNlIGluIHRoZWlyIHBhcmVudCBwYWNrYWdlLmpzb24nLCBhc3luYyAoKSA9PiB7XG4gICAgLy8gU2ltdWxhdGUgYSB3b3Jrc3BhY2UgcGFja2FnZSB3aXRoIHNpZGVFZmZlY3RzOiBmYWxzZVxuICAgIGNvbnN0IHBrZ0RpciA9IGpvaW4odGVzdFJvb3QsICdwYWNrYWdlcycsICdzaGFyZWQnKTtcbiAgICB3cml0ZUZpbGUoXG4gICAgICBqb2luKHBrZ0RpciwgJ3BhY2thZ2UuanNvbicpLFxuICAgICAgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBuYW1lOiAnQG15b3JnL3NoYXJlZCcsXG4gICAgICAgIHZlcnNpb246ICcxLjAuMCcsXG4gICAgICAgIHNpZGVFZmZlY3RzOiBmYWxzZSxcbiAgICAgICAgbWFpbjogJ2luZGV4LmpzJyxcbiAgICAgIH0pXG4gICAgKTtcbiAgICBjb25zdCBzaGFyZWRFbnRyeSA9IGpvaW4ocGtnRGlyLCAnaW5kZXguanMnKTtcbiAgICB3cml0ZUZpbGUoc2hhcmVkRW50cnksICdnbG9iYWxUaGlzLl9fc2hhcmVkUmVnaXN0ZXJlZCA9IHRydWU7Jyk7XG5cbiAgICBhcHBseVN3Y1RyYW5zZm9ybU1vY2subW9ja0ltcGxlbWVudGF0aW9uKFxuICAgICAgYXN5bmMgKF9maWxlbmFtZTogc3RyaW5nLCBzb3VyY2U6IHN0cmluZykgPT4gKHtcbiAgICAgICAgY29kZTogc291cmNlLFxuICAgICAgICB3b3JrZmxvd01hbmlmZXN0OiB7fSxcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIC8vIFVzZSBhIHJlbGF0aXZlIGltcG9ydCB0byB0aGUgbG9jYWwgZmlsZSAobGlrZSB0aGUgdmlydHVhbCBlbnRyeSBkb2VzIGZvciBsb2NhbCBmaWxlcylcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBlc2J1aWxkLmJ1aWxkKHtcbiAgICAgIHN0ZGluOiB7XG4gICAgICAgIGNvbnRlbnRzOiBgaW1wb3J0ICcuL3BhY2thZ2VzL3NoYXJlZC9pbmRleC5qcyc7YCxcbiAgICAgICAgcmVzb2x2ZURpcjogdGVzdFJvb3QsXG4gICAgICAgIHNvdXJjZWZpbGU6ICd2aXJ0dWFsLWVudHJ5LmpzJyxcbiAgICAgICAgbG9hZGVyOiAnanMnLFxuICAgICAgfSxcbiAgICAgIGFic1dvcmtpbmdEaXI6IHRlc3RSb290LFxuICAgICAgYnVuZGxlOiB0cnVlLFxuICAgICAgZm9ybWF0OiAnY2pzJyxcbiAgICAgIHBsYXRmb3JtOiAnbm9kZScsXG4gICAgICB3cml0ZTogZmFsc2UsXG4gICAgICB0cmVlU2hha2luZzogdHJ1ZSxcbiAgICAgIGxvZ0xldmVsOiAnc2lsZW50JyxcbiAgICAgIHBsdWdpbnM6IFtcbiAgICAgICAgY3JlYXRlU3djUGx1Z2luKHtcbiAgICAgICAgICBtb2RlOiAnd29ya2Zsb3cnLFxuICAgICAgICAgIHNpZGVFZmZlY3RFbnRyaWVzOiBbc2hhcmVkRW50cnldLFxuICAgICAgICB9KSxcbiAgICAgIF0sXG4gICAgfSk7XG5cbiAgICBleHBlY3QocmVzdWx0LmVycm9ycykudG9IYXZlTGVuZ3RoKDApO1xuICAgIGNvbnN0IG91dHB1dCA9IHJlc3VsdC5vdXRwdXRGaWxlc1swXS50ZXh0O1xuICAgIGV4cGVjdChvdXRwdXQpLnRvQ29udGFpbignX19zaGFyZWRSZWdpc3RlcmVkJyk7XG4gIH0pO1xuXG4gIGl0KCdkb2VzIG5vdCBvdmVycmlkZSBzaWRlRWZmZWN0cyBmb3Igbm9uLWVudHJ5IG1vZHVsZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgLy8gQ3JlYXRlIHR3byBwYWNrYWdlcyAtIG9uZSBpcyBhIHNpZGUtZWZmZWN0IGVudHJ5LCBvbmUgaXMgbm90XG4gICAgY29uc3Qgc2lkZUVmZmVjdENvZGUgPSAnZ2xvYmFsVGhpcy5fX2VudHJ5UmVnaXN0ZXJlZCA9IHRydWU7JztcbiAgICBjb25zdCBlbnRyeVBhdGggPSBjcmVhdGVTaWRlRWZmZWN0c0ZhbHNlUGFja2FnZShcbiAgICAgICdlbnRyeS1wa2cnLFxuICAgICAgc2lkZUVmZmVjdENvZGVcbiAgICApO1xuXG4gICAgY29uc3Qgbm9uRW50cnlDb2RlID0gJ2dsb2JhbFRoaXMuX19ub25FbnRyeVJlZ2lzdGVyZWQgPSB0cnVlOyc7XG4gICAgY3JlYXRlU2lkZUVmZmVjdHNGYWxzZVBhY2thZ2UoJ25vbi1lbnRyeS1wa2cnLCBub25FbnRyeUNvZGUpO1xuXG4gICAgYXBwbHlTd2NUcmFuc2Zvcm1Nb2NrLm1vY2tJbXBsZW1lbnRhdGlvbihcbiAgICAgIGFzeW5jIChfZmlsZW5hbWU6IHN0cmluZywgc291cmNlOiBzdHJpbmcpID0+ICh7XG4gICAgICAgIGNvZGU6IHNvdXJjZSxcbiAgICAgICAgd29ya2Zsb3dNYW5pZmVzdDoge30sXG4gICAgICB9KVxuICAgICk7XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBlc2J1aWxkLmJ1aWxkKHtcbiAgICAgIHN0ZGluOiB7XG4gICAgICAgIGNvbnRlbnRzOiBgaW1wb3J0ICdlbnRyeS1wa2cnO1xcbmltcG9ydCAnbm9uLWVudHJ5LXBrZyc7YCxcbiAgICAgICAgcmVzb2x2ZURpcjogdGVzdFJvb3QsXG4gICAgICAgIHNvdXJjZWZpbGU6ICd2aXJ0dWFsLWVudHJ5LmpzJyxcbiAgICAgICAgbG9hZGVyOiAnanMnLFxuICAgICAgfSxcbiAgICAgIGFic1dvcmtpbmdEaXI6IHRlc3RSb290LFxuICAgICAgYnVuZGxlOiB0cnVlLFxuICAgICAgZm9ybWF0OiAnY2pzJyxcbiAgICAgIHBsYXRmb3JtOiAnbm9kZScsXG4gICAgICB3cml0ZTogZmFsc2UsXG4gICAgICB0cmVlU2hha2luZzogdHJ1ZSxcbiAgICAgIGxvZ0xldmVsOiAnc2lsZW50JyxcbiAgICAgIHBsdWdpbnM6IFtcbiAgICAgICAgY3JlYXRlU3djUGx1Z2luKHtcbiAgICAgICAgICBtb2RlOiAnd29ya2Zsb3cnLFxuICAgICAgICAgIC8vIE9ubHkgZW50cnktcGtnIGlzIGxpc3RlZCwgbm9uLWVudHJ5LXBrZyBpcyBub3RcbiAgICAgICAgICBzaWRlRWZmZWN0RW50cmllczogW2VudHJ5UGF0aF0sXG4gICAgICAgIH0pLFxuICAgICAgXSxcbiAgICB9KTtcblxuICAgIGV4cGVjdChyZXN1bHQuZXJyb3JzKS50b0hhdmVMZW5ndGgoMCk7XG4gICAgY29uc3Qgb3V0cHV0ID0gcmVzdWx0Lm91dHB1dEZpbGVzWzBdLnRleHQ7XG4gICAgLy8gZW50cnktcGtnIHNob3VsZCBiZSBwcmVzZXJ2ZWRcbiAgICBleHBlY3Qob3V0cHV0KS50b0NvbnRhaW4oJ19fZW50cnlSZWdpc3RlcmVkJyk7XG4gICAgLy8gbm9uLWVudHJ5LXBrZyBzaG91bGQgYmUgZHJvcHBlZCAoc2lkZUVmZmVjdHM6IGZhbHNlIGlzIHJlc3BlY3RlZClcbiAgICBleHBlY3Qob3V0cHV0KS5ub3QudG9Db250YWluKCdfX25vbkVudHJ5UmVnaXN0ZXJlZCcpO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZSgnY3JlYXRlU3djUGx1Z2luIHByb2plY3RSb290JywgKCkgPT4ge1xuICBsZXQgdGVzdFJvb3Q6IHN0cmluZztcblxuICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICB0ZXN0Um9vdCA9IG1rZHRlbXBTeW5jKGpvaW4ocmVhbFRtcGRpciwgJ3dvcmtmbG93LXN3Yy1wbHVnaW4tJykpO1xuICAgIGFwcGx5U3djVHJhbnNmb3JtTW9jay5tb2NrUmVzZXQoKTtcbiAgICBhcHBseVN3Y1RyYW5zZm9ybU1vY2subW9ja0ltcGxlbWVudGF0aW9uKFxuICAgICAgYXN5bmMgKF9maWxlbmFtZTogc3RyaW5nLCBzb3VyY2U6IHN0cmluZykgPT4gKHtcbiAgICAgICAgY29kZTogc291cmNlLFxuICAgICAgICB3b3JrZmxvd01hbmlmZXN0OiB7fSxcbiAgICAgIH0pXG4gICAgKTtcbiAgfSk7XG5cbiAgYWZ0ZXJFYWNoKCgpID0+IHtcbiAgICBybVN5bmModGVzdFJvb3QsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgfSk7XG5cbiAgZnVuY3Rpb24gc2V0dXBGaXh0dXJlKCkge1xuICAgIGNvbnN0IGFwcFJvb3QgPSBqb2luKHRlc3RSb290LCAnYXBwcycsICdjaGF0Jyk7XG4gICAgY29uc3QgcGFja2FnZVJvb3QgPSBqb2luKHRlc3RSb290LCAncGFja2FnZXMnLCAndmFkZScpO1xuICAgIGNvbnN0IHdvcmtmbG93RmlsZSA9IGpvaW4oXG4gICAgICBwYWNrYWdlUm9vdCxcbiAgICAgICdzcmMnLFxuICAgICAgJ2ludGVybmFsJyxcbiAgICAgICdtZXNzYWdlJyxcbiAgICAgICd3b3JrZmxvdycsXG4gICAgICAnaGFuZGxlLW1lc3NhZ2UudHMnXG4gICAgKTtcblxuICAgIHdyaXRlRmlsZShcbiAgICAgIHdvcmtmbG93RmlsZSxcbiAgICAgIGBleHBvcnQgYXN5bmMgZnVuY3Rpb24gaGFuZGxlTWVzc2FnZVdvcmtmbG93KG1lc3NhZ2UpIHtcbiAgXCJ1c2Ugd29ya2Zsb3dcIjtcblxuICByZXR1cm4gbWVzc2FnZTtcbn1cbmBcbiAgICApO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGFwcFJvb3QsXG4gICAgICBwYWNrYWdlUm9vdCxcbiAgICAgIHdvcmtmbG93RmlsZSxcbiAgICB9O1xuICB9XG5cbiAgaXQoJ3Bhc3NlcyB0aGUgZXhwbGljaXQgcHJvamVjdFJvb3QgdGhyb3VnaCB0byBhcHBseVN3Y1RyYW5zZm9ybScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaXh0dXJlID0gc2V0dXBGaXh0dXJlKCk7XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBlc2J1aWxkLmJ1aWxkKHtcbiAgICAgIGVudHJ5UG9pbnRzOiBbZml4dHVyZS53b3JrZmxvd0ZpbGVdLFxuICAgICAgYWJzV29ya2luZ0RpcjogZml4dHVyZS5wYWNrYWdlUm9vdCxcbiAgICAgIGJ1bmRsZTogdHJ1ZSxcbiAgICAgIGZvcm1hdDogJ2VzbScsXG4gICAgICBwbGF0Zm9ybTogJ25vZGUnLFxuICAgICAgd3JpdGU6IGZhbHNlLFxuICAgICAgcGx1Z2luczogW1xuICAgICAgICBjcmVhdGVTd2NQbHVnaW4oe1xuICAgICAgICAgIG1vZGU6ICd3b3JrZmxvdycsXG4gICAgICAgICAgcHJvamVjdFJvb3Q6IGZpeHR1cmUuYXBwUm9vdCxcbiAgICAgICAgICB3b3JrZmxvd01hbmlmZXN0OiB7fSxcbiAgICAgICAgfSksXG4gICAgICBdLFxuICAgIH0pO1xuXG4gICAgZXhwZWN0KHJlc3VsdC5lcnJvcnMpLnRvSGF2ZUxlbmd0aCgwKTtcbiAgICBleHBlY3QoYXBwbHlTd2NUcmFuc2Zvcm1Nb2NrKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChcbiAgICAgICdzcmMvaW50ZXJuYWwvbWVzc2FnZS93b3JrZmxvdy9oYW5kbGUtbWVzc2FnZS50cycsXG4gICAgICBleHBlY3Quc3RyaW5nQ29udGFpbmluZygnXCJ1c2Ugd29ya2Zsb3dcIicpLFxuICAgICAgJ3dvcmtmbG93JyxcbiAgICAgIGZpeHR1cmUud29ya2Zsb3dGaWxlLFxuICAgICAgZml4dHVyZS5hcHBSb290XG4gICAgKTtcbiAgfSk7XG5cbiAgaXQoJ2RlZmF1bHRzIHRoZSB0cmFuc2Zvcm0gcHJvamVjdFJvb3QgdG8gYWJzV29ya2luZ0RpcicsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaXh0dXJlID0gc2V0dXBGaXh0dXJlKCk7XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBlc2J1aWxkLmJ1aWxkKHtcbiAgICAgIGVudHJ5UG9pbnRzOiBbZml4dHVyZS53b3JrZmxvd0ZpbGVdLFxuICAgICAgYWJzV29ya2luZ0RpcjogZml4dHVyZS5wYWNrYWdlUm9vdCxcbiAgICAgIGJ1bmRsZTogdHJ1ZSxcbiAgICAgIGZvcm1hdDogJ2VzbScsXG4gICAgICBwbGF0Zm9ybTogJ25vZGUnLFxuICAgICAgd3JpdGU6IGZhbHNlLFxuICAgICAgcGx1Z2luczogW1xuICAgICAgICBjcmVhdGVTd2NQbHVnaW4oe1xuICAgICAgICAgIG1vZGU6ICd3b3JrZmxvdycsXG4gICAgICAgICAgd29ya2Zsb3dNYW5pZmVzdDoge30sXG4gICAgICAgIH0pLFxuICAgICAgXSxcbiAgICB9KTtcblxuICAgIGV4cGVjdChyZXN1bHQuZXJyb3JzKS50b0hhdmVMZW5ndGgoMCk7XG4gICAgZXhwZWN0KGFwcGx5U3djVHJhbnNmb3JtTW9jaykudG9IYXZlQmVlbkNhbGxlZFdpdGgoXG4gICAgICAnc3JjL2ludGVybmFsL21lc3NhZ2Uvd29ya2Zsb3cvaGFuZGxlLW1lc3NhZ2UudHMnLFxuICAgICAgZXhwZWN0LnN0cmluZ0NvbnRhaW5pbmcoJ1widXNlIHdvcmtmbG93XCInKSxcbiAgICAgICd3b3JrZmxvdycsXG4gICAgICBmaXh0dXJlLndvcmtmbG93RmlsZSxcbiAgICAgIGZpeHR1cmUucGFja2FnZVJvb3RcbiAgICApO1xuICB9KTtcbn0pO1xuIl19
@@ -8,7 +8,6 @@ export declare const workflowSerdeImportPattern: RegExp;
8
8
  export declare const workflowSerdeSymbolPattern: RegExp;
9
9
  export declare const workflowSerdeComputedPropertyPattern: RegExp;
10
10
  export declare const generatedWorkflowPathPattern: RegExp;
11
- export declare const workflowSdkPathPattern: RegExp;
12
11
  /**
13
12
  * Detects workflow-related patterns in source code.
14
13
  */
@@ -38,20 +37,15 @@ export declare function detectWorkflowPatterns(source: string): WorkflowPatternM
38
37
  * @returns true if the file is a generated workflow route
39
38
  */
40
39
  export declare function isGeneratedWorkflowFile(filePath: string): boolean;
41
- /**
42
- * Determines if a file path is part of the @workflow SDK.
43
- * @param filePath - The file path to check
44
- * @returns true if the file is part of the @workflow SDK
45
- */
46
- export declare function isWorkflowSdkFile(filePath: string): boolean;
47
40
  /**
48
41
  * Determines if a file should be transformed based on its path and content patterns.
49
42
  *
50
43
  * Logic:
51
44
  * - Generated workflow route files are never transformed
52
45
  * - Files with directives ('use workflow' or 'use step') are always transformed
53
- * - Files with serde patterns are transformed, unless they're @workflow SDK files
54
- * (SDK files with serde patterns are internal implementation, not user code)
46
+ * - Files with serde patterns are always transformed; the SWC plugin performs
47
+ * AST-level extraction/filtering to determine whether they actually define
48
+ * serde classes
55
49
  *
56
50
  * @param filePath - The file path to check
57
51
  * @param patterns - The detected patterns from detectWorkflowPatterns()
@@ -1 +1 @@
1
- {"version":3,"file":"transform-utils.d.ts","sourceRoot":"","sources":["../src/transform-utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,eAAO,MAAM,kBAAkB,QAAoC,CAAC;AACpE,eAAO,MAAM,cAAc,QAAgC,CAAC;AAI5D,eAAO,MAAM,0BAA0B,QAAoC,CAAC;AAI5E,eAAO,MAAM,0BAA0B,QAC+B,CAAC;AAKvE,eAAO,MAAM,oCAAoC,QACD,CAAC;AAIjD,eAAO,MAAM,4BAA4B,QACF,CAAC;AAWxC,eAAO,MAAM,sBAAsB,QACkM,CAAC;AAEtO;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,6CAA6C;IAC7C,cAAc,EAAE,OAAO,CAAC;IACxB,yCAAyC;IACzC,UAAU,EAAE,OAAO,CAAC;IACpB,2CAA2C;IAC3C,cAAc,EAAE,OAAO,CAAC;IACxB,2FAA2F;IAC3F,cAAc,EAAE,OAAO,CAAC;IACxB,iEAAiE;IACjE,YAAY,EAAE,OAAO,CAAC;IACtB,6DAA6D;IAC7D,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,oBAAoB,CAgB3E;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAEjE;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAE3D;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,oBAAoB,GAC7B,OAAO,CAiBT;AAED;;;;;GAKG;AACH,eAAO,MAAM,uBAAuB,QACuI,CAAC"}
1
+ {"version":3,"file":"transform-utils.d.ts","sourceRoot":"","sources":["../src/transform-utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,eAAO,MAAM,kBAAkB,QAAoC,CAAC;AACpE,eAAO,MAAM,cAAc,QAAgC,CAAC;AAI5D,eAAO,MAAM,0BAA0B,QAAoC,CAAC;AAI5E,eAAO,MAAM,0BAA0B,QAC+B,CAAC;AAKvE,eAAO,MAAM,oCAAoC,QACD,CAAC;AAIjD,eAAO,MAAM,4BAA4B,QACF,CAAC;AAExC;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,6CAA6C;IAC7C,cAAc,EAAE,OAAO,CAAC;IACxB,yCAAyC;IACzC,UAAU,EAAE,OAAO,CAAC;IACpB,2CAA2C;IAC3C,cAAc,EAAE,OAAO,CAAC;IACxB,2FAA2F;IAC3F,cAAc,EAAE,OAAO,CAAC;IACxB,iEAAiE;IACjE,YAAY,EAAE,OAAO,CAAC;IACtB,6DAA6D;IAC7D,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,oBAAoB,CAgB3E;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAEjE;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,oBAAoB,GAC7B,OAAO,CAOT;AAED;;;;;GAKG;AACH,eAAO,MAAM,uBAAuB,QACuI,CAAC"}
@@ -18,16 +18,6 @@ export const workflowSerdeComputedPropertyPattern = /\[\s*WORKFLOW_(?:SERIALIZE|
18
18
  // Pattern to detect generated workflow route files that should be excluded
19
19
  // These files are generated by the build process and should not be re-processed
20
20
  export const generatedWorkflowPathPattern = /[/\\]\.well-known[/\\]workflow[/\\]/;
21
- // Pattern to detect @workflow SDK packages that should be excluded from transformation
22
- // These are internal SDK packages that should not be treated as user entry points.
23
- // Matches:
24
- // - node_modules/@workflow/*
25
- // - node_modules/workflow/*
26
- // - node_modules/.pnpm/.../node_modules/@workflow/* (pnpm virtual store)
27
- // - node_modules/.pnpm/.../node_modules/workflow/* (pnpm virtual store)
28
- // - monorepo packages/*/dist paths
29
- // User npm packages with workflows/steps/serde SHOULD still be discovered.
30
- export const workflowSdkPathPattern = /[/\\](?:node_modules[/\\](?:@workflow[/\\]|workflow[/\\]|\.pnpm[/\\][^/\\]+[/\\]node_modules[/\\](?:@workflow[/\\]|workflow[/\\]))|packages[/\\](?:builders|core|rollup|vite|next|nitro|serde|workflow|swc-plugin-workflow)[/\\])/;
31
21
  /**
32
22
  * Detects workflow-related patterns in source code.
33
23
  * @param source - The source code to analyze
@@ -56,22 +46,15 @@ export function detectWorkflowPatterns(source) {
56
46
  export function isGeneratedWorkflowFile(filePath) {
57
47
  return generatedWorkflowPathPattern.test(filePath);
58
48
  }
59
- /**
60
- * Determines if a file path is part of the @workflow SDK.
61
- * @param filePath - The file path to check
62
- * @returns true if the file is part of the @workflow SDK
63
- */
64
- export function isWorkflowSdkFile(filePath) {
65
- return workflowSdkPathPattern.test(filePath);
66
- }
67
49
  /**
68
50
  * Determines if a file should be transformed based on its path and content patterns.
69
51
  *
70
52
  * Logic:
71
53
  * - Generated workflow route files are never transformed
72
54
  * - Files with directives ('use workflow' or 'use step') are always transformed
73
- * - Files with serde patterns are transformed, unless they're @workflow SDK files
74
- * (SDK files with serde patterns are internal implementation, not user code)
55
+ * - Files with serde patterns are always transformed; the SWC plugin performs
56
+ * AST-level extraction/filtering to determine whether they actually define
57
+ * serde classes
75
58
  *
76
59
  * @param filePath - The file path to check
77
60
  * @param patterns - The detected patterns from detectWorkflowPatterns()
@@ -82,15 +65,7 @@ export function shouldTransformFile(filePath, patterns) {
82
65
  if (isGeneratedWorkflowFile(filePath)) {
83
66
  return false;
84
67
  }
85
- // Always transform files with directives
86
- if (patterns.hasDirective) {
87
- return true;
88
- }
89
- // Transform files with serde patterns, unless they're @workflow SDK files
90
- if (patterns.hasSerde) {
91
- return !isWorkflowSdkFile(filePath);
92
- }
93
- return false;
68
+ return patterns.hasDirective || patterns.hasSerde;
94
69
  }
95
70
  /**
96
71
  * Combined regex pattern for turbopack content matching.
@@ -99,4 +74,4 @@ export function shouldTransformFile(filePath, patterns) {
99
74
  * and WORKFLOW_SERIALIZE/WORKFLOW_DESERIALIZE computed property usage
100
75
  */
101
76
  export const turbopackContentPattern = /(use workflow|use step|from\s+(['"])@workflow\/serde\2|Symbol\.for\s*\(\s*(['"])workflow-(?:serialize|deserialize)\3\s*\)|\[\s*WORKFLOW_(?:SERIALIZE|DESERIALIZE)\s*\])/;
102
- //# sourceMappingURL=transform-utils.js.map
77
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNmb3JtLXV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3RyYW5zZm9ybS11dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFFSCwwR0FBMEc7QUFDMUcsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUcsaUNBQWlDLENBQUM7QUFDcEUsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFHLDZCQUE2QixDQUFDO0FBRTVELDBFQUEwRTtBQUMxRSw4REFBOEQ7QUFDOUQsTUFBTSxDQUFDLE1BQU0sMEJBQTBCLEdBQUcsaUNBQWlDLENBQUM7QUFFNUUsaUdBQWlHO0FBQ2pHLG9FQUFvRTtBQUNwRSxNQUFNLENBQUMsTUFBTSwwQkFBMEIsR0FDckMsb0VBQW9FLENBQUM7QUFFdkUseUZBQXlGO0FBQ3pGLHNEQUFzRDtBQUN0RCwyRkFBMkY7QUFDM0YsTUFBTSxDQUFDLE1BQU0sb0NBQW9DLEdBQy9DLDhDQUE4QyxDQUFDO0FBRWpELDJFQUEyRTtBQUMzRSxnRkFBZ0Y7QUFDaEYsTUFBTSxDQUFDLE1BQU0sNEJBQTRCLEdBQ3ZDLHFDQUFxQyxDQUFDO0FBb0J4Qzs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLHNCQUFzQixDQUFDLE1BQWM7SUFDbkQsTUFBTSxjQUFjLEdBQUcsa0JBQWtCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3ZELE1BQU0sVUFBVSxHQUFHLGNBQWMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDL0MsTUFBTSxjQUFjLEdBQUcsMEJBQTBCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQy9ELE1BQU0sY0FBYyxHQUFHLDBCQUEwQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUMvRCxNQUFNLHdCQUF3QixHQUM1QixvQ0FBb0MsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFFcEQsT0FBTztRQUNMLGNBQWM7UUFDZCxVQUFVO1FBQ1YsY0FBYztRQUNkLGNBQWM7UUFDZCxZQUFZLEVBQUUsY0FBYyxJQUFJLFVBQVU7UUFDMUMsUUFBUSxFQUFFLGNBQWMsSUFBSSxjQUFjLElBQUksd0JBQXdCO0tBQ3ZFLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSx1QkFBdUIsQ0FBQyxRQUFnQjtJQUN0RCxPQUFPLDRCQUE0QixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUNyRCxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7R0FhRztBQUNILE1BQU0sVUFBVSxtQkFBbUIsQ0FDakMsUUFBZ0IsRUFDaEIsUUFBOEI7SUFFOUIsaURBQWlEO0lBQ2pELElBQUksdUJBQXVCLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztRQUN0QyxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxPQUFPLFFBQVEsQ0FBQyxZQUFZLElBQUksUUFBUSxDQUFDLFFBQVEsQ0FBQztBQUNwRCxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FDbEMseUtBQXlLLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFNoYXJlZCB1dGlsaXRpZXMgZm9yIGRldGVjdGluZyBmaWxlcyB0aGF0IG5lZWQgd29ya2Zsb3cgdHJhbnNmb3JtYXRpb24uXG4gKiBVc2VkIGJ5IGJ1aWxkZXJzLCByb2xsdXAgcGx1Z2luLCBOZXh0LmpzIGxvYWRlciwgYW5kIHZpdGUgcGx1Z2luLlxuICovXG5cbi8vIE1hdGNoZXM6ICd1c2Ugd29ya2Zsb3cnOyBcInVzZSB3b3JrZmxvd1wiOyAndXNlIHN0ZXAnOyBcInVzZSBzdGVwXCI7IGF0IGxpbmUgc3RhcnQgd2l0aCBvcHRpb25hbCB3aGl0ZXNwYWNlXG5leHBvcnQgY29uc3QgdXNlV29ya2Zsb3dQYXR0ZXJuID0gL15cXHMqKFsnXCJdKXVzZSB3b3JrZmxvd1xcMTs/XFxzKiQvbTtcbmV4cG9ydCBjb25zdCB1c2VTdGVwUGF0dGVybiA9IC9eXFxzKihbJ1wiXSl1c2Ugc3RlcFxcMTs/XFxzKiQvbTtcblxuLy8gTWF0Y2hlcyBpbXBvcnRzIGZyb20gJ0B3b3JrZmxvdy9zZXJkZScgKGZvciBjdXN0b20gY2xhc3Mgc2VyaWFsaXphdGlvbilcbi8vIGUuZy46IGltcG9ydCB7IFdPUktGTE9XX1NFUklBTElaRSB9IGZyb20gJ0B3b3JrZmxvdy9zZXJkZSc7XG5leHBvcnQgY29uc3Qgd29ya2Zsb3dTZXJkZUltcG9ydFBhdHRlcm4gPSAvZnJvbVxccysoWydcIl0pQHdvcmtmbG93XFwvc2VyZGVcXDEvO1xuXG4vLyBNYXRjaGVzIGRpcmVjdCB1c2FnZSBvZiBTeW1ib2wuZm9yKCd3b3JrZmxvdy1zZXJpYWxpemUnKSBvciBTeW1ib2wuZm9yKCd3b3JrZmxvdy1kZXNlcmlhbGl6ZScpXG4vLyBlLmcuOiBzdGF0aWMgW1N5bWJvbC5mb3IoJ3dvcmtmbG93LXNlcmlhbGl6ZScpXShpbnN0YW5jZSkgeyAuLi4gfVxuZXhwb3J0IGNvbnN0IHdvcmtmbG93U2VyZGVTeW1ib2xQYXR0ZXJuID1cbiAgL1N5bWJvbFxcLmZvclxccypcXChcXHMqKFsnXCJdKXdvcmtmbG93LSg/OnNlcmlhbGl6ZXxkZXNlcmlhbGl6ZSlcXDFcXHMqXFwpLztcblxuLy8gTWF0Y2hlcyB1c2FnZSBvZiBXT1JLRkxPV19TRVJJQUxJWkUgb3IgV09SS0ZMT1dfREVTRVJJQUxJWkUgYXMgY29tcHV0ZWQgcHJvcGVydHkgbmFtZXNcbi8vIGUuZy46IHN0YXRpYyBbV09SS0ZMT1dfU0VSSUFMSVpFXShpbnN0YW5jZSkgeyAuLi4gfVxuLy8gVGhpcyBjYXRjaGVzIGNhc2VzIHdoZXJlIHRoZSBzeW1ib2xzIGFyZSBpbXBvcnRlZCBhbmQgdXNlZCAoZXZlbiBpZiBidW5kbGVkL3JlLWV4cG9ydGVkKVxuZXhwb3J0IGNvbnN0IHdvcmtmbG93U2VyZGVDb21wdXRlZFByb3BlcnR5UGF0dGVybiA9XG4gIC9cXFtcXHMqV09SS0ZMT1dfKD86U0VSSUFMSVpFfERFU0VSSUFMSVpFKVxccypcXF0vO1xuXG4vLyBQYXR0ZXJuIHRvIGRldGVjdCBnZW5lcmF0ZWQgd29ya2Zsb3cgcm91dGUgZmlsZXMgdGhhdCBzaG91bGQgYmUgZXhjbHVkZWRcbi8vIFRoZXNlIGZpbGVzIGFyZSBnZW5lcmF0ZWQgYnkgdGhlIGJ1aWxkIHByb2Nlc3MgYW5kIHNob3VsZCBub3QgYmUgcmUtcHJvY2Vzc2VkXG5leHBvcnQgY29uc3QgZ2VuZXJhdGVkV29ya2Zsb3dQYXRoUGF0dGVybiA9XG4gIC9bL1xcXFxdXFwud2VsbC1rbm93blsvXFxcXF13b3JrZmxvd1svXFxcXF0vO1xuXG4vKipcbiAqIERldGVjdHMgd29ya2Zsb3ctcmVsYXRlZCBwYXR0ZXJucyBpbiBzb3VyY2UgY29kZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXb3JrZmxvd1BhdHRlcm5NYXRjaCB7XG4gIC8qKiBGaWxlIGNvbnRhaW5zICd1c2Ugd29ya2Zsb3cnIGRpcmVjdGl2ZSAqL1xuICBoYXNVc2VXb3JrZmxvdzogYm9vbGVhbjtcbiAgLyoqIEZpbGUgY29udGFpbnMgJ3VzZSBzdGVwJyBkaXJlY3RpdmUgKi9cbiAgaGFzVXNlU3RlcDogYm9vbGVhbjtcbiAgLyoqIEZpbGUgY29udGFpbnMgQHdvcmtmbG93L3NlcmRlIGltcG9ydCAqL1xuICBoYXNTZXJkZUltcG9ydDogYm9vbGVhbjtcbiAgLyoqIEZpbGUgY29udGFpbnMgU3ltYm9sLmZvcignd29ya2Zsb3ctc2VyaWFsaXplJykgb3IgU3ltYm9sLmZvcignd29ya2Zsb3ctZGVzZXJpYWxpemUnKSAqL1xuICBoYXNTZXJkZVN5bWJvbDogYm9vbGVhbjtcbiAgLyoqIEZpbGUgY29udGFpbnMgYW55IGRpcmVjdGl2ZSAoJ3VzZSB3b3JrZmxvdycgb3IgJ3VzZSBzdGVwJykgKi9cbiAgaGFzRGlyZWN0aXZlOiBib29sZWFuO1xuICAvKiogRmlsZSBjb250YWlucyBhbnkgc2VyZGUgcGF0dGVybiAoaW1wb3J0IG9yIFN5bWJvbC5mb3IpICovXG4gIGhhc1NlcmRlOiBib29sZWFuO1xufVxuXG4vKipcbiAqIERldGVjdHMgd29ya2Zsb3ctcmVsYXRlZCBwYXR0ZXJucyBpbiBzb3VyY2UgY29kZS5cbiAqIEBwYXJhbSBzb3VyY2UgLSBUaGUgc291cmNlIGNvZGUgdG8gYW5hbHl6ZVxuICogQHJldHVybnMgT2JqZWN0IHdpdGggZmxhZ3MgZm9yIGVhY2ggZGV0ZWN0ZWQgcGF0dGVyblxuICovXG5leHBvcnQgZnVuY3Rpb24gZGV0ZWN0V29ya2Zsb3dQYXR0ZXJucyhzb3VyY2U6IHN0cmluZyk6IFdvcmtmbG93UGF0dGVybk1hdGNoIHtcbiAgY29uc3QgaGFzVXNlV29ya2Zsb3cgPSB1c2VXb3JrZmxvd1BhdHRlcm4udGVzdChzb3VyY2UpO1xuICBjb25zdCBoYXNVc2VTdGVwID0gdXNlU3RlcFBhdHRlcm4udGVzdChzb3VyY2UpO1xuICBjb25zdCBoYXNTZXJkZUltcG9ydCA9IHdvcmtmbG93U2VyZGVJbXBvcnRQYXR0ZXJuLnRlc3Qoc291cmNlKTtcbiAgY29uc3QgaGFzU2VyZGVTeW1ib2wgPSB3b3JrZmxvd1NlcmRlU3ltYm9sUGF0dGVybi50ZXN0KHNvdXJjZSk7XG4gIGNvbnN0IGhhc1NlcmRlQ29tcHV0ZWRQcm9wZXJ0eSA9XG4gICAgd29ya2Zsb3dTZXJkZUNvbXB1dGVkUHJvcGVydHlQYXR0ZXJuLnRlc3Qoc291cmNlKTtcblxuICByZXR1cm4ge1xuICAgIGhhc1VzZVdvcmtmbG93LFxuICAgIGhhc1VzZVN0ZXAsXG4gICAgaGFzU2VyZGVJbXBvcnQsXG4gICAgaGFzU2VyZGVTeW1ib2wsXG4gICAgaGFzRGlyZWN0aXZlOiBoYXNVc2VXb3JrZmxvdyB8fCBoYXNVc2VTdGVwLFxuICAgIGhhc1NlcmRlOiBoYXNTZXJkZUltcG9ydCB8fCBoYXNTZXJkZVN5bWJvbCB8fCBoYXNTZXJkZUNvbXB1dGVkUHJvcGVydHksXG4gIH07XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lcyBpZiBhIGZpbGUgcGF0aCBpcyBhIGdlbmVyYXRlZCB3b3JrZmxvdyByb3V0ZSBmaWxlLlxuICogQHBhcmFtIGZpbGVQYXRoIC0gVGhlIGZpbGUgcGF0aCB0byBjaGVja1xuICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgZmlsZSBpcyBhIGdlbmVyYXRlZCB3b3JrZmxvdyByb3V0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNHZW5lcmF0ZWRXb3JrZmxvd0ZpbGUoZmlsZVBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gZ2VuZXJhdGVkV29ya2Zsb3dQYXRoUGF0dGVybi50ZXN0KGZpbGVQYXRoKTtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmVzIGlmIGEgZmlsZSBzaG91bGQgYmUgdHJhbnNmb3JtZWQgYmFzZWQgb24gaXRzIHBhdGggYW5kIGNvbnRlbnQgcGF0dGVybnMuXG4gKlxuICogTG9naWM6XG4gKiAtIEdlbmVyYXRlZCB3b3JrZmxvdyByb3V0ZSBmaWxlcyBhcmUgbmV2ZXIgdHJhbnNmb3JtZWRcbiAqIC0gRmlsZXMgd2l0aCBkaXJlY3RpdmVzICgndXNlIHdvcmtmbG93JyBvciAndXNlIHN0ZXAnKSBhcmUgYWx3YXlzIHRyYW5zZm9ybWVkXG4gKiAtIEZpbGVzIHdpdGggc2VyZGUgcGF0dGVybnMgYXJlIGFsd2F5cyB0cmFuc2Zvcm1lZDsgdGhlIFNXQyBwbHVnaW4gcGVyZm9ybXNcbiAqICAgQVNULWxldmVsIGV4dHJhY3Rpb24vZmlsdGVyaW5nIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZXkgYWN0dWFsbHkgZGVmaW5lXG4gKiAgIHNlcmRlIGNsYXNzZXNcbiAqXG4gKiBAcGFyYW0gZmlsZVBhdGggLSBUaGUgZmlsZSBwYXRoIHRvIGNoZWNrXG4gKiBAcGFyYW0gcGF0dGVybnMgLSBUaGUgZGV0ZWN0ZWQgcGF0dGVybnMgZnJvbSBkZXRlY3RXb3JrZmxvd1BhdHRlcm5zKClcbiAqIEByZXR1cm5zIHRydWUgaWYgdGhlIGZpbGUgc2hvdWxkIGJlIHRyYW5zZm9ybWVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaG91bGRUcmFuc2Zvcm1GaWxlKFxuICBmaWxlUGF0aDogc3RyaW5nLFxuICBwYXR0ZXJuczogV29ya2Zsb3dQYXR0ZXJuTWF0Y2hcbik6IGJvb2xlYW4ge1xuICAvLyBOZXZlciB0cmFuc2Zvcm0gZ2VuZXJhdGVkIHdvcmtmbG93IHJvdXRlIGZpbGVzXG4gIGlmIChpc0dlbmVyYXRlZFdvcmtmbG93RmlsZShmaWxlUGF0aCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gcGF0dGVybnMuaGFzRGlyZWN0aXZlIHx8IHBhdHRlcm5zLmhhc1NlcmRlO1xufVxuXG4vKipcbiAqIENvbWJpbmVkIHJlZ2V4IHBhdHRlcm4gZm9yIHR1cmJvcGFjayBjb250ZW50IG1hdGNoaW5nLlxuICogVXNlcyBiYWNrcmVmZXJlbmNlcyB0byBlbnN1cmUgbWF0Y2hpbmcgcXVvdGUgdHlwZXMuXG4gKiBNYXRjaGVzOiAndXNlIHdvcmtmbG93JywgJ3VzZSBzdGVwJywgQHdvcmtmbG93L3NlcmRlIGltcG9ydHMsIFN5bWJvbC5mb3Igc2VyaWFsaXphdGlvbiBzeW1ib2xzLFxuICogYW5kIFdPUktGTE9XX1NFUklBTElaRS9XT1JLRkxPV19ERVNFUklBTElaRSBjb21wdXRlZCBwcm9wZXJ0eSB1c2FnZVxuICovXG5leHBvcnQgY29uc3QgdHVyYm9wYWNrQ29udGVudFBhdHRlcm4gPVxuICAvKHVzZSB3b3JrZmxvd3x1c2Ugc3RlcHxmcm9tXFxzKyhbJ1wiXSlAd29ya2Zsb3dcXC9zZXJkZVxcMnxTeW1ib2xcXC5mb3JcXHMqXFwoXFxzKihbJ1wiXSl3b3JrZmxvdy0oPzpzZXJpYWxpemV8ZGVzZXJpYWxpemUpXFwzXFxzKlxcKXxcXFtcXHMqV09SS0ZMT1dfKD86U0VSSUFMSVpFfERFU0VSSUFMSVpFKVxccypcXF0pLztcbiJdfQ==