@workflow/builders 5.0.0-beta.4 → 5.0.0-beta.41
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +26 -0
- package/dist/apply-swc-transform.d.ts +7 -2
- package/dist/apply-swc-transform.d.ts.map +1 -1
- package/dist/apply-swc-transform.js +10 -4
- package/dist/base-builder-logging.test.d.ts +2 -0
- package/dist/base-builder-logging.test.d.ts.map +1 -0
- package/dist/base-builder-logging.test.js +99 -0
- package/dist/base-builder.d.ts +132 -13
- package/dist/base-builder.d.ts.map +1 -1
- package/dist/base-builder.js +788 -92
- package/dist/build-queue.js +1 -1
- package/dist/config-helpers.d.ts +4 -1
- package/dist/config-helpers.d.ts.map +1 -1
- package/dist/config-helpers.js +63 -1
- package/dist/config-helpers.test.d.ts +2 -0
- package/dist/config-helpers.test.d.ts.map +1 -0
- package/dist/config-helpers.test.js +17 -0
- package/dist/constants.d.ts +66 -5
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +106 -19
- package/dist/constants.test.d.ts +2 -0
- package/dist/constants.test.d.ts.map +1 -0
- package/dist/constants.test.js +90 -0
- package/dist/discover-entries-esbuild-plugin.d.ts +3 -1
- package/dist/discover-entries-esbuild-plugin.d.ts.map +1 -1
- package/dist/discover-entries-esbuild-plugin.js +24 -4
- package/dist/discover-entries-esbuild-plugin.test.js +1 -1
- package/dist/esbuild-tsconfig.js +1 -1
- package/dist/esbuild-tsconfig.test.js +1 -1
- package/dist/external-package-warning.test.d.ts +2 -0
- package/dist/external-package-warning.test.d.ts.map +1 -0
- package/dist/external-package-warning.test.js +219 -0
- package/dist/fast-discovery.d.ts +29 -0
- package/dist/fast-discovery.d.ts.map +1 -0
- package/dist/fast-discovery.js +771 -0
- package/dist/fast-discovery.test.d.ts +2 -0
- package/dist/fast-discovery.test.d.ts.map +1 -0
- package/dist/fast-discovery.test.js +453 -0
- package/dist/get-input-files.test.js +34 -2
- package/dist/index.d.ts +7 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -5
- package/dist/module-specifier.d.ts +20 -2
- package/dist/module-specifier.d.ts.map +1 -1
- package/dist/module-specifier.js +92 -17
- package/dist/module-specifier.test.js +45 -3
- package/dist/node-module-esbuild-plugin.d.ts.map +1 -1
- package/dist/node-module-esbuild-plugin.js +73 -23
- package/dist/node-module-esbuild-plugin.test.js +97 -1
- package/dist/optional-otel-api.d.ts +14 -0
- package/dist/optional-otel-api.d.ts.map +1 -0
- package/dist/optional-otel-api.js +14 -0
- package/dist/optional-typescript-alias.d.ts +2 -0
- package/dist/optional-typescript-alias.d.ts.map +1 -0
- package/dist/optional-typescript-alias.js +3 -0
- package/dist/optional-typescript.d.ts +3 -0
- package/dist/optional-typescript.d.ts.map +1 -0
- package/dist/optional-typescript.js +9 -0
- package/dist/optional-ws-native.d.ts +30 -0
- package/dist/optional-ws-native.d.ts.map +1 -0
- package/dist/optional-ws-native.js +33 -0
- package/dist/pseudo-package-esbuild-plugin.js +1 -1
- package/dist/pseudo-package-esbuild-plugin.test.js +1 -1
- package/dist/request-converter.js +1 -1
- package/dist/resolve-sourcemap.test.d.ts +2 -0
- package/dist/resolve-sourcemap.test.d.ts.map +1 -0
- package/dist/resolve-sourcemap.test.js +194 -0
- package/dist/serde-checker.js +1 -1
- package/dist/standalone.d.ts +0 -3
- package/dist/standalone.d.ts.map +1 -1
- package/dist/standalone.js +17 -41
- package/dist/step-source-registration.test.d.ts +2 -0
- package/dist/step-source-registration.test.d.ts.map +1 -0
- package/dist/step-source-registration.test.js +82 -0
- package/dist/swc-esbuild-plugin.d.ts +26 -0
- package/dist/swc-esbuild-plugin.d.ts.map +1 -1
- package/dist/swc-esbuild-plugin.js +124 -14
- package/dist/swc-esbuild-plugin.test.js +475 -6
- package/dist/transform-utils.d.ts.map +1 -1
- package/dist/transform-utils.js +45 -6
- package/dist/transform-utils.test.js +78 -6
- package/dist/types.d.ts +73 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +1 -1
- package/dist/vercel-build-output-api.d.ts +0 -2
- package/dist/vercel-build-output-api.d.ts.map +1 -1
- package/dist/vercel-build-output-api.js +37 -60
- package/dist/workflow-alias.js +1 -1
- package/dist/workflow-alias.test.js +2 -2
- package/dist/workflows-extractor.js +8 -3
- package/dist/workflows-extractor.test.d.ts +2 -0
- package/dist/workflows-extractor.test.d.ts.map +1 -0
- package/dist/workflows-extractor.test.js +70 -0
- package/package.json +8 -7
- package/dist/apply-swc-transform.js.map +0 -1
- package/dist/base-builder.js.map +0 -1
- package/dist/build-queue.js.map +0 -1
- package/dist/config-helpers.js.map +0 -1
- package/dist/constants.js.map +0 -1
- package/dist/discover-entries-esbuild-plugin.js.map +0 -1
- package/dist/discover-entries-esbuild-plugin.test.js.map +0 -1
- package/dist/esbuild-tsconfig.js.map +0 -1
- package/dist/esbuild-tsconfig.test.js.map +0 -1
- package/dist/get-input-files.test.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/module-specifier.js.map +0 -1
- package/dist/module-specifier.test.js.map +0 -1
- package/dist/node-module-esbuild-plugin.js.map +0 -1
- package/dist/node-module-esbuild-plugin.test.js.map +0 -1
- package/dist/pseudo-package-esbuild-plugin.js.map +0 -1
- package/dist/pseudo-package-esbuild-plugin.test.js.map +0 -1
- package/dist/request-converter.js.map +0 -1
- package/dist/serde-checker.js.map +0 -1
- package/dist/standalone.js.map +0 -1
- package/dist/swc-esbuild-plugin.js.map +0 -1
- package/dist/swc-esbuild-plugin.test.js.map +0 -1
- package/dist/transform-utils.js.map +0 -1
- package/dist/transform-utils.test.js.map +0 -1
- package/dist/types.js.map +0 -1
- package/dist/vercel-build-output-api.js.map +0 -1
- package/dist/workflow-alias.js.map +0 -1
- package/dist/workflow-alias.test.js.map +0 -1
- package/dist/workflows-extractor.js.map +0 -1
|
@@ -219,10 +219,10 @@ describe('getImportPath', () => {
|
|
|
219
219
|
moduleSpecifier: undefined,
|
|
220
220
|
});
|
|
221
221
|
});
|
|
222
|
-
it('uses
|
|
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/
|
|
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,
|
|
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
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
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=
|
|
@@ -305,6 +305,102 @@ describe('workflow-node-module-error plugin', () => {
|
|
|
305
305
|
rmSync(tempDir, { recursive: true, force: true });
|
|
306
306
|
}
|
|
307
307
|
});
|
|
308
|
+
it('should not error when a shared module exposes a workflow-safe export alongside an unused Node.js-using export', async () => {
|
|
309
|
+
// Repro for https://github.com/vercel/workflow/issues/1817
|
|
310
|
+
//
|
|
311
|
+
// When a shared module has both a workflow-safe export and a Node.js-using
|
|
312
|
+
// export, and the workflow bundle only uses the workflow-safe one, esbuild
|
|
313
|
+
// should be able to tree-shake the Node.js-using export (and its imports)
|
|
314
|
+
// and the plugin should not emit a false-positive violation.
|
|
315
|
+
const tempDir = mkdtempSync(join(realTmpdir, 'node-module-plugin-test-'));
|
|
316
|
+
const sharedFile = join(tempDir, 'shared.ts');
|
|
317
|
+
const entryFile = join(tempDir, 'workflow.ts');
|
|
318
|
+
writeFileSync(sharedFile, `
|
|
319
|
+
import { readFile } from "node:fs/promises";
|
|
320
|
+
import path from "node:path";
|
|
321
|
+
|
|
322
|
+
export const isSupportedValue = (value) => value === "ok";
|
|
323
|
+
|
|
324
|
+
export async function readFixtureFile() {
|
|
325
|
+
return readFile(path.join(process.cwd(), "fixture.txt"), "utf8");
|
|
326
|
+
}
|
|
327
|
+
`);
|
|
328
|
+
writeFileSync(entryFile, `
|
|
329
|
+
import { isSupportedValue } from "./shared.js";
|
|
330
|
+
export function workflow() {
|
|
331
|
+
return isSupportedValue("ok");
|
|
332
|
+
}
|
|
333
|
+
`);
|
|
334
|
+
try {
|
|
335
|
+
const result = await esbuild.build({
|
|
336
|
+
entryPoints: [entryFile],
|
|
337
|
+
bundle: true,
|
|
338
|
+
write: false,
|
|
339
|
+
platform: 'neutral',
|
|
340
|
+
logLevel: 'silent',
|
|
341
|
+
plugins: [createNodeModuleErrorPlugin()],
|
|
342
|
+
});
|
|
343
|
+
expect(result.errors).toHaveLength(0);
|
|
344
|
+
}
|
|
345
|
+
finally {
|
|
346
|
+
rmSync(tempDir, { recursive: true, force: true });
|
|
347
|
+
}
|
|
348
|
+
});
|
|
349
|
+
it("should still error when a shared module's Node.js-using export is actually referenced", async () => {
|
|
350
|
+
// Counterpart to the previous test: when the workflow really does pull in
|
|
351
|
+
// the Node.js-using export (directly or transitively), the plugin must
|
|
352
|
+
// still emit the violation.
|
|
353
|
+
const tempDir = mkdtempSync(join(realTmpdir, 'node-module-plugin-test-'));
|
|
354
|
+
const sharedFile = join(tempDir, 'shared.ts');
|
|
355
|
+
const entryFile = join(tempDir, 'workflow.ts');
|
|
356
|
+
const relativeShared = relative(process.cwd(), sharedFile);
|
|
357
|
+
writeFileSync(sharedFile, `
|
|
358
|
+
import { readFile } from "node:fs/promises";
|
|
359
|
+
import path from "node:path";
|
|
360
|
+
|
|
361
|
+
export const isSupportedValue = (value) => value === "ok";
|
|
362
|
+
|
|
363
|
+
export async function readFixtureFile() {
|
|
364
|
+
return readFile(path.join(process.cwd(), "fixture.txt"), "utf8");
|
|
365
|
+
}
|
|
366
|
+
`);
|
|
367
|
+
writeFileSync(entryFile, `
|
|
368
|
+
import { isSupportedValue, readFixtureFile } from "./shared.js";
|
|
369
|
+
export async function workflow() {
|
|
370
|
+
if (!isSupportedValue("ok")) throw new Error("nope");
|
|
371
|
+
return readFixtureFile();
|
|
372
|
+
}
|
|
373
|
+
`);
|
|
374
|
+
try {
|
|
375
|
+
await esbuild.build({
|
|
376
|
+
entryPoints: [entryFile],
|
|
377
|
+
bundle: true,
|
|
378
|
+
write: false,
|
|
379
|
+
platform: 'neutral',
|
|
380
|
+
logLevel: 'silent',
|
|
381
|
+
plugins: [createNodeModuleErrorPlugin()],
|
|
382
|
+
});
|
|
383
|
+
throw new Error('Expected build to fail');
|
|
384
|
+
}
|
|
385
|
+
catch (error) {
|
|
386
|
+
if (error && typeof error === 'object' && 'errors' in error) {
|
|
387
|
+
const failure = error;
|
|
388
|
+
const paths = failure.errors.map((e) => e.text);
|
|
389
|
+
expect(paths.some((t) => t.includes('"node:fs/promises"'))).toBe(true);
|
|
390
|
+
expect(paths.some((t) => t.includes('"node:path"'))).toBe(true);
|
|
391
|
+
// Violations should be attributed to the shared module, not the entry.
|
|
392
|
+
for (const err of failure.errors) {
|
|
393
|
+
expect(err.location?.file).toBe(relativeShared);
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
else {
|
|
397
|
+
throw error;
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
finally {
|
|
401
|
+
rmSync(tempDir, { recursive: true, force: true });
|
|
402
|
+
}
|
|
403
|
+
});
|
|
308
404
|
it('should not point to JSDoc comments when finding usage', async () => {
|
|
309
405
|
const testCode = `
|
|
310
406
|
import { Writable } from "stream";
|
|
@@ -510,4 +606,4 @@ describe('workflow-node-module-error helper functions', () => {
|
|
|
510
606
|
});
|
|
511
607
|
});
|
|
512
608
|
});
|
|
513
|
-
//# sourceMappingURL=node-module-esbuild-plugin.test.js.map
|
|
609
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS1tb2R1bGUtZXNidWlsZC1wbHVnaW4udGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9ub2RlLW1vZHVsZS1lc2J1aWxkLXBsdWdpbi50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxXQUFXLEVBQ1gsWUFBWSxFQUNaLFlBQVksRUFDWixNQUFNLEVBQ04sYUFBYSxHQUNkLE1BQU0sU0FBUyxDQUFDO0FBSWpCLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDakMsT0FBTyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRXBELHdFQUF3RTtBQUN4RSxNQUFNLFVBQVUsR0FBRyxZQUFZLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztBQUUxQyxPQUFPLEtBQUssT0FBTyxNQUFNLFNBQVMsQ0FBQztBQUNuQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDOUMsT0FBTyxFQUNMLDJCQUEyQixFQUMzQixZQUFZLEVBQ1oscUJBQXFCLEVBQ3JCLGNBQWMsRUFDZCxvQkFBb0IsR0FDckIsTUFBTSxpQ0FBaUMsQ0FBQztBQUV6QyxLQUFLLFVBQVUsMEJBQTBCLENBQ3ZDLE1BQWMsRUFDZCxZQUEyQyxFQUFFO0lBRTdDLE1BQU0sT0FBTyxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLDBCQUEwQixDQUFDLENBQUMsQ0FBQztJQUMxRSxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLGFBQWEsQ0FBQyxDQUFDO0lBQy9DLGFBQWEsQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDakMsTUFBTSxhQUFhLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUV6RCxJQUFJLENBQUM7UUFDSCxN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ZW1wU3luYyxcbiAgcmVhZEZpbGVTeW5jLFxuICByZWFscGF0aFN5bmMsXG4gIHJtU3luYyxcbiAgd3JpdGVGaWxlU3luYyxcbn0gZnJvbSAnbm9kZTpmcyc7XG4vLyBAdHMtZXhwZWN0LWVycm9yIC0gSW50ZW50aW9uYWxseSB1bnVzZWQgaW1wb3J0IGZvciB0ZXN0aW5nIGdldFZpb2xhdGlvbkxvY2F0aW9uXG4vLyB3aXRoIGFuIGltcG9ydCB0aGF0IGV4aXN0cyBidXQgaXMgbmV2ZXIgcmVmZXJlbmNlZCBpbiBjb2RlXG5pbXBvcnQgaHR0cCBmcm9tICdub2RlOmh0dHAnO1xuaW1wb3J0IHsgdG1wZGlyIH0gZnJvbSAnbm9kZTpvcyc7XG5pbXBvcnQgeyBqb2luLCByZWxhdGl2ZSwgcmVzb2x2ZSB9IGZyb20gJ25vZGU6cGF0aCc7XG5cbi8vIFJlc29sdmUgc3ltbGlua3MgaW4gdG1wZGlyIHRvIGF2b2lkIG1hY09TIC92YXIgLT4gL3ByaXZhdGUvdmFyIGlzc3Vlc1xuY29uc3QgcmVhbFRtcGRpciA9IHJlYWxwYXRoU3luYyh0bXBkaXIoKSk7XG5cbmltcG9ydCAqIGFzIGVzYnVpbGQgZnJvbSAnZXNidWlsZCc7XG5pbXBvcnQgeyBkZXNjcmliZSwgZXhwZWN0LCBpdCB9IGZyb20gJ3ZpdGVzdCc7XG5pbXBvcnQge1xuICBjcmVhdGVOb2RlTW9kdWxlRXJyb3JQbHVnaW4sXG4gIGVzY2FwZVJlZ0V4cCxcbiAgZ2V0SW1wb3J0ZWRJZGVudGlmaWVyLFxuICBnZXRQYWNrYWdlTmFtZSxcbiAgZ2V0VmlvbGF0aW9uTG9jYXRpb24sXG59IGZyb20gJy4vbm9kZS1tb2R1bGUtZXNidWlsZC1wbHVnaW4uanMnO1xuXG5hc3luYyBmdW5jdGlvbiBidWlsZFdvcmtmbG93V2l0aFZpb2xhdGlvbihcbiAgc291cmNlOiBzdHJpbmcsXG4gIG92ZXJyaWRlczogUGFydGlhbDxlc2J1aWxkLkJ1aWxkT3B0aW9ucz4gPSB7fVxuKSB7XG4gIGNvbnN0IHRlbXBEaXIgPSBta2R0ZW1wU3luYyhqb2luKHJlYWxUbXBkaXIsICdub2RlLW1vZHVsZS1wbHVnaW4tdGVzdC0nKSk7XG4gIGNvbnN0IGVudHJ5RmlsZSA9IGpvaW4odGVtcERpciwgJ3dvcmtmbG93LnRzJyk7XG4gIHdyaXRlRmlsZVN5bmMoZW50cnlGaWxlLCBzb3VyY2UpO1xuICBjb25zdCByZWxhdGl2ZUVudHJ5ID0gcmVsYXRpdmUocHJvY2Vzcy5jd2QoKSwgZW50cnlGaWxlKTtcblxuICB0cnkge1xuICAgIGF3YWl0IGVzYnVpbGQuYnVpbGQoe1xuICAgICAgZW50cnlQb2ludHM6IFtlbnRyeUZpbGVdLFxuICAgICAgYnVuZGxlOiB0cnVlLFxuICAgICAgd3JpdGU6IGZhbHNlLFxuICAgICAgcGxhdGZvcm06ICduZXV0cmFsJyxcbiAgICAgIGxvZ0xldmVsOiAnc2lsZW50JyxcbiAgICAgIHBsdWdpbnM6IFtjcmVhdGVOb2RlTW9kdWxlRXJyb3JQbHVnaW4oKSwgLi4uKG92ZXJyaWRlcy5wbHVnaW5zID8/IFtdKV0sXG4gICAgICAuLi5vdmVycmlkZXMsXG4gICAgfSk7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCBidWlsZCB0byBmYWlsJyk7XG4gIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICBpZiAoZXJyb3IgJiYgdHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyAmJiAnZXJyb3JzJyBpbiBlcnJvcikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZmFpbHVyZTogZXJyb3IgYXMgZXNidWlsZC5CdWlsZEZhaWx1cmUsXG4gICAgICAgIHJlbGF0aXZlRW50cnksXG4gICAgICB9O1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfSBmaW5hbGx5IHtcbiAgICBybVN5bmModGVtcERpciwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICB9XG59XG5cbmRlc2NyaWJlKCd3b3JrZmxvdy1ub2RlLW1vZHVsZS1lcnJvciBwbHVnaW4nLCAoKSA9PiB7XG4gIGl0KCdzaG91bGQgZXJyb3Igb24gZnMgaW1wb3J0JywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHRlc3RDb2RlID0gYFxuICAgICAgaW1wb3J0IHsgcmVhZEZpbGUgfSBmcm9tIFwiZnNcIjtcbiAgICAgIGV4cG9ydCBmdW5jdGlvbiB3b3JrZmxvdygpIHtcbiAgICAgICAgcmV0dXJuIHJlYWRGaWxlKFwidGVzdC50eHRcIik7XG4gICAgICB9XG4gICAgYDtcblxuICAgIGNvbnN0IHsgZmFpbHVyZSwgcmVsYXRpdmVFbnRyeSB9ID1cbiAgICAgIGF3YWl0IGJ1aWxkV29ya2Zsb3dXaXRoVmlvbGF0aW9uKHRlc3RDb2RlKTtcblxuICAgIGV4cGVjdChmYWlsdXJlLmVycm9ycykudG9IYXZlTGVuZ3RoKDEpO1xuICAgIGNvbnN0IHZpb2xhdGlvbiA9IGZhaWx1cmUuZXJyb3JzWzBdO1xuICAgIGV4cGVjdCh2aW9sYXRpb24udGV4dCkudG9Db250YWluKFxuICAgICAgJ1lvdSBhcmUgYXR0ZW1wdGluZyB0byB1c2UgXCJmc1wiIHdoaWNoIGlzIGEgTm9kZS5qcyBtb2R1bGUnXG4gICAgKTtcbiAgICBleHBlY3QodmlvbGF0aW9uLmxvY2F0aW9uKS50b01hdGNoT2JqZWN0KHtcbiAgICAgIGZpbGU6IHJlbGF0aXZlRW50cnksXG4gICAgICBzdWdnZXN0aW9uOiAnTW92ZSB0aGlzIGZ1bmN0aW9uIGludG8gYSBzdGVwIGZ1bmN0aW9uLicsXG4gICAgfSk7XG4gICAgZXhwZWN0KHZpb2xhdGlvbi5sb2NhdGlvbj8ubGluZSkudG9CZUdyZWF0ZXJUaGFuKDApO1xuICAgIGV4cGVjdCh2aW9sYXRpb24ubG9jYXRpb24/LmNvbHVtbikudG9CZUdyZWF0ZXJUaGFuT3JFcXVhbCgwKTtcbiAgICBleHBlY3QodmlvbGF0aW9uLmxvY2F0aW9uPy5saW5lVGV4dCkudG9Db250YWluKCdyZWFkRmlsZScpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGVycm9yIG9uIG5vZGU6IHByZWZpeGVkIGltcG9ydHMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgdGVzdENvZGUgPSBgXG4gICAgICBpbXBvcnQgeyByZWFkRmlsZSB9IGZyb20gXCJub2RlOmZzXCI7XG4gICAgICBleHBvcnQgZnVuY3Rpb24gd29ya2Zsb3coKSB7XG4gICAgICAgIHJldHVybiByZWFkRmlsZTtcbiAgICAgIH1cbiAgICBgO1xuXG4gICAgY29uc3QgeyBmYWlsdXJlLCByZWxhdGl2ZUVudHJ5IH0gPSBhd2FpdCBidWlsZFdvcmtmbG93V2l0aFZpb2xhdGlvbihcbiAgICAgIHRlc3RDb2RlLFxuICAgICAgeyBmb3JtYXQ6ICdjanMnIH1cbiAgICApO1xuXG4gICAgZXhwZWN0KGZhaWx1cmUuZXJyb3JzKS50b0hhdmVMZW5ndGgoMSk7XG4gICAgY29uc3QgdmlvbGF0aW9uID0gZmFpbHVyZS5lcnJvcnNbMF07XG4gICAgZXhwZWN0KHZpb2xhdGlvbi50ZXh0KS50b0NvbnRhaW4oXG4gICAgICAnWW91IGFyZSBhdHRlbXB0aW5nIHRvIHVzZSBcIm5vZGU6ZnNcIiB3aGljaCBpcyBhIE5vZGUuanMgbW9kdWxlJ1xuICAgICk7XG4gICAgZXhwZWN0KHZpb2xhdGlvbi5sb2NhdGlvbikudG9NYXRjaE9iamVjdCh7XG4gICAgICBmaWxlOiByZWxhdGl2ZUVudHJ5LFxuICAgICAgc3VnZ2VzdGlvbjogJ01vdmUgdGhpcyBmdW5jdGlvbiBpbnRvIGEgc3RlcCBmdW5jdGlvbi4nLFxuICAgIH0pO1xuICAgIGV4cGVjdCh2aW9sYXRpb24ubG9jYXRpb24/LmxpbmVUZXh0KS50b0NvbnRhaW4oJ3JlYWRGaWxlJyk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgZXJyb3Igb24gbXVsdGlwbGUgTm9kZS5qcyBpbXBvcnRzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHRlc3RDb2RlID0gYFxuICAgICAgaW1wb3J0IHsgcmVhZEZpbGUgfSBmcm9tIFwiZnNcIjtcbiAgICAgIGltcG9ydCB7IGpvaW4gfSBmcm9tIFwicGF0aFwiO1xuICAgICAgZXhwb3J0IGZ1bmN0aW9uIHdvcmtmbG93KCkge1xuICAgICAgICByZXR1cm4gcmVhZEZpbGUoam9pbihcImFcIiwgXCJiXCIpKTtcbiAgICAgIH1cbiAgICBgO1xuXG4gICAgY29uc3QgeyBmYWlsdXJlLCByZWxhdGl2ZUVudHJ5IH0gPSBhd2FpdCBidWlsZFdvcmtmbG93V2l0aFZpb2xhdGlvbihcbiAgICAgIHRlc3RDb2RlLFxuICAgICAgeyBmb3JtYXQ6ICdjanMnIH1cbiAgICApO1xuXG4gICAgZXhwZWN0KGZhaWx1cmUuZXJyb3JzKS50b0hhdmVMZW5ndGgoMik7XG5cbiAgICBjb25zdCBwYWNrYWdlcyA9IGZhaWx1cmUuZXJyb3JzLm1hcCgoZXJyb3IpID0+ICh7XG4gICAgICB0ZXh0OiBlcnJvci50ZXh0LFxuICAgICAgbG9jYXRpb246IGVycm9yLmxvY2F0aW9uLFxuICAgIH0pKTtcblxuICAgIGNvbnN0IGZzVmlvbGF0aW9uID0gcGFja2FnZXMuZmluZCgocGtnKSA9PiBwa2cudGV4dC5pbmNsdWRlcygnXCJmc1wiJykpO1xuICAgIGNvbnN0IHBhdGhWaW9sYXRpb24gPSBwYWNrYWdlcy5maW5kKChwa2cpID0+IHBrZy50ZXh0LmluY2x1ZGVzKCdcInBhdGhcIicpKTtcblxuICAgIGV4cGVjdChmc1Zpb2xhdGlvbj8udGV4dCkudG9Db250YWluKCd3aGljaCBpcyBhIE5vZGUuanMgbW9kdWxlJyk7XG4gICAgZXhwZWN0KHBhdGhWaW9sYXRpb24/LnRleHQpLnRvQ29udGFpbignd2hpY2ggaXMgYSBOb2RlLmpzIG1vZHVsZScpO1xuXG4gICAgZXhwZWN0KGZzVmlvbGF0aW9uPy5sb2NhdGlvbikudG9NYXRjaE9iamVjdCh7XG4gICAgICBmaWxlOiByZWxhdGl2ZUVudHJ5LFxuICAgICAgc3VnZ2VzdGlvbjogJ01vdmUgdGhpcyBmdW5jdGlvbiBpbnRvIGEgc3RlcCBmdW5jdGlvbi4nLFxuICAgIH0pO1xuICAgIGV4cGVjdChmc1Zpb2xhdGlvbj8ubG9jYXRpb24/LmxpbmVUZXh0KS50b0NvbnRhaW4oJ3JlYWRGaWxlJyk7XG4gICAgZXhwZWN0KHBhdGhWaW9sYXRpb24/LmxvY2F0aW9uKS50b01hdGNoT2JqZWN0KHtcbiAgICAgIGZpbGU6IHJlbGF0aXZlRW50cnksXG4gICAgICBzdWdnZXN0aW9uOiAnTW92ZSB0aGlzIGZ1bmN0aW9uIGludG8gYSBzdGVwIGZ1bmN0aW9uLicsXG4gICAgfSk7XG4gICAgZXhwZWN0KHBhdGhWaW9sYXRpb24/LmxvY2F0aW9uPy5saW5lVGV4dCkudG9Db250YWluKCdqb2luJyk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgc2hvdyB0b3AtbGV2ZWwgcGFja2FnZSBuYW1lIGZvciBuZXN0ZWQgTm9kZS5qcyBpbXBvcnRzJywgYXN5bmMgKCkgPT4ge1xuICAgIC8vIFRoaXMgdGVzdCB2YWxpZGF0ZXMgdGhhdCB3aGVuIGEgcGFja2FnZSBpbiBub2RlX21vZHVsZXMgaW50ZXJuYWxseSB1c2VzXG4gICAgLy8gTm9kZS5qcyBidWlsdC1pbiBtb2R1bGVzLCB0aGUgZXJyb3IgbWVzc2FnZSBzaG93cyB0aGUgdG9wLWxldmVsIHBhY2thZ2UgbmFtZVxuICAgIC8vIChlLmcuLCBcImZha2UtcGFja2FnZVwiKSBpbnN0ZWFkIG9mIHRoZSBpbnRlcm5hbCBidWlsdC1pbiAoZS5nLiwgXCJzdHJlYW1cIikuXG4gICAgLy9cbiAgICAvLyBXZSBjcmVhdGUgYSByZWFsIG5vZGVfbW9kdWxlcyBkaXJlY3Rvcnkgc3RydWN0dXJlIHRvIHNpbXVsYXRlIHRoaXMgc2NlbmFyaW8uXG4gICAgY29uc3QgdGVtcERpciA9IG1rZHRlbXBTeW5jKGpvaW4ocmVhbFRtcGRpciwgJ25vZGUtbW9kdWxlLXBsdWdpbi10ZXN0LScpKTtcbiAgICBjb25zdCBub2RlTW9kdWxlc0RpciA9IGpvaW4odGVtcERpciwgJ25vZGVfbW9kdWxlcycsICdmYWtlLXBhY2thZ2UnKTtcbiAgICBjb25zdCB7IG1rZGlyU3luYyB9ID0gYXdhaXQgaW1wb3J0KCdub2RlOmZzJyk7XG4gICAgbWtkaXJTeW5jKG5vZGVNb2R1bGVzRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAgIGNvbnN0IGZha2VQYWNrYWdlQ29kZSA9IGBcbiAgICAgIGltcG9ydCB7IFN0cmVhbSB9IGZyb20gXCJzdHJlYW1cIjtcbiAgICAgIGV4cG9ydCBmdW5jdGlvbiBmYWtlUGFja2FnZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTdHJlYW0oKTtcbiAgICAgIH1cbiAgICBgO1xuICAgIHdyaXRlRmlsZVN5bmMoam9pbihub2RlTW9kdWxlc0RpciwgJ2luZGV4LmpzJyksIGZha2VQYWNrYWdlQ29kZSk7XG4gICAgd3JpdGVGaWxlU3luYyhcbiAgICAgIGpvaW4obm9kZU1vZHVsZXNEaXIsICdwYWNrYWdlLmpzb24nKSxcbiAgICAgIEpTT04uc3RyaW5naWZ5KHsgbmFtZTogJ2Zha2UtcGFja2FnZScsIG1haW46ICdpbmRleC5qcycgfSlcbiAgICApO1xuXG4gICAgY29uc3QgdGVzdENvZGUgPSBgXG4gICAgICBpbXBvcnQgeyBmYWtlUGFja2FnZSB9IGZyb20gXCJmYWtlLXBhY2thZ2VcIjtcbiAgICAgIGV4cG9ydCBmdW5jdGlvbiB3b3JrZmxvdygpIHtcbiAgICAgICAgcmV0dXJuIGZha2VQYWNrYWdlKCk7XG4gICAgICB9XG4gICAgYDtcbiAgICBjb25zdCBlbnRyeUZpbGUgPSBqb2luKHRlbXBEaXIsICd3b3JrZmxvdy50cycpO1xuICAgIHdyaXRlRmlsZVN5bmMoZW50cnlGaWxlLCB0ZXN0Q29kZSk7XG4gICAgY29uc3QgcmVsYXRpdmVFbnRyeSA9IHJlbGF0aXZlKHByb2Nlc3MuY3dkKCksIGVudHJ5RmlsZSk7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgZXNidWlsZC5idWlsZCh7XG4gICAgICAgIGVudHJ5UG9pbnRzOiBbZW50cnlGaWxlXSxcbiAgICAgICAgYnVuZGxlOiB0cnVlLFxuICAgICAgICB3cml0ZTogZmFsc2UsXG4gICAgICAgIHBsYXRmb3JtOiAnbmV1dHJhbCcsXG4gICAgICAgIGxvZ0xldmVsOiAnc2lsZW50JyxcbiAgICAgICAgcGx1Z2luczogW2NyZWF0ZU5vZGVNb2R1bGVFcnJvclBsdWdpbigpXSxcbiAgICAgIH0pO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCBidWlsZCB0byBmYWlsJyk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgaWYgKGVycm9yICYmIHR5cGVvZiBlcnJvciA9PT0gJ29iamVjdCcgJiYgJ2Vycm9ycycgaW4gZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZmFpbHVyZSA9IGVycm9yIGFzIGVzYnVpbGQuQnVpbGRGYWlsdXJlO1xuICAgICAgICBleHBlY3QoZmFpbHVyZS5lcnJvcnMpLnRvSGF2ZUxlbmd0aCgxKTtcbiAgICAgICAgY29uc3QgdmlvbGF0aW9uID0gZmFpbHVyZS5lcnJvcnNbMF07XG4gICAgICAgIC8vIFNob3VsZCBtZW50aW9uIHRoZSB0b3AtbGV2ZWwgcGFja2FnZSBcImZha2UtcGFja2FnZVwiLCBub3QgdGhlIGludGVybmFsIFwic3RyZWFtXCIgbW9kdWxlXG4gICAgICAgIGV4cGVjdCh2aW9sYXRpb24udGV4dCkudG9Db250YWluKCdcImZha2UtcGFja2FnZVwiJyk7XG4gICAgICAgIGV4cGVjdCh2aW9sYXRpb24udGV4dCkudG9Db250YWluKCd3aGljaCBkZXBlbmRzIG9uIE5vZGUuanMgbW9kdWxlcycpO1xuICAgICAgICBleHBlY3QodmlvbGF0aW9uLnRleHQpLm5vdC50b0NvbnRhaW4oJ1wic3RyZWFtXCInKTtcbiAgICAgICAgZXhwZWN0KHZpb2xhdGlvbi5sb2NhdGlvbikudG9NYXRjaE9iamVjdCh7XG4gICAgICAgICAgZmlsZTogcmVsYXRpdmVFbnRyeSxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgcm1TeW5jKHRlbXBEaXIsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgICB9XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgZGV0ZWN0IHBhY2thZ2VzIHdoZW4gZXNidWlsZCBhbmQgcmVzb2x2ZXIgY2hvb3NlIGRpZmZlcmVudCBlbnRyeSBmaWVsZHMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgdGVtcERpciA9IG1rZHRlbXBTeW5jKGpvaW4ocmVhbFRtcGRpciwgJ25vZGUtbW9kdWxlLXBsdWdpbi10ZXN0LScpKTtcbiAgICBjb25zdCBub2RlTW9kdWxlc0RpciA9IGpvaW4odGVtcERpciwgJ25vZGVfbW9kdWxlcycsICdkdWFsLWVudHJ5LXBhY2thZ2UnKTtcbiAgICBjb25zdCBlc21EaXIgPSBqb2luKG5vZGVNb2R1bGVzRGlyLCAnZXNtJyk7XG4gICAgY29uc3QgY2pzRGlyID0gam9pbihub2RlTW9kdWxlc0RpciwgJ2NqcycpO1xuICAgIGNvbnN0IHsgbWtkaXJTeW5jIH0gPSBhd2FpdCBpbXBvcnQoJ25vZGU6ZnMnKTtcbiAgICBta2RpclN5bmMoZXNtRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBta2RpclN5bmMoY2pzRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAgIHdyaXRlRmlsZVN5bmMoXG4gICAgICBqb2luKGVzbURpciwgJ2luZGV4LmpzJyksXG4gICAgICBgXG4gICAgICBpbXBvcnQgb3MgZnJvbSBcIm9zXCI7XG4gICAgICBleHBvcnQgZnVuY3Rpb24gZ2V0UGxhdGZvcm0oKSB7XG4gICAgICAgIHJldHVybiBvcy5wbGF0Zm9ybSgpO1xuICAgICAgfVxuICAgIGBcbiAgICApO1xuICAgIHdyaXRlRmlsZVN5bmMoXG4gICAgICBqb2luKGNqc0RpciwgJ2luZGV4LmNqcycpLFxuICAgICAgYFxuICAgICAgbW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgICAgIGdldFBsYXRmb3JtKCkge1xuICAgICAgICAgIHJldHVybiBcImNqc1wiO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIGBcbiAgICApO1xuICAgIHdyaXRlRmlsZVN5bmMoXG4gICAgICBqb2luKG5vZGVNb2R1bGVzRGlyLCAncGFja2FnZS5qc29uJyksXG4gICAgICBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIG5hbWU6ICdkdWFsLWVudHJ5LXBhY2thZ2UnLFxuICAgICAgICBtYWluOiAnY2pzL2luZGV4LmNqcycsXG4gICAgICAgIG1vZHVsZTogJ2VzbS9pbmRleC5qcycsXG4gICAgICB9KVxuICAgICk7XG5cbiAgICBjb25zdCB0ZXN0Q29kZSA9IGBcbiAgICAgIGltcG9ydCB7IGdldFBsYXRmb3JtIH0gZnJvbSBcImR1YWwtZW50cnktcGFja2FnZVwiO1xuICAgICAgZXhwb3J0IGZ1bmN0aW9uIHdvcmtmbG93KCkge1xuICAgICAgICByZXR1cm4gZ2V0UGxhdGZvcm0oKTtcbiAgICAgIH1cbiAgICBgO1xuICAgIGNvbnN0IGVudHJ5RmlsZSA9IGpvaW4odGVtcERpciwgJ3dvcmtmbG93LnRzJyk7XG4gICAgd3JpdGVGaWxlU3luYyhlbnRyeUZpbGUsIHRlc3RDb2RlKTtcbiAgICBjb25zdCByZWxhdGl2ZUVudHJ5ID0gcmVsYXRpdmUocHJvY2Vzcy5jd2QoKSwgZW50cnlGaWxlKTtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBlc2J1aWxkLmJ1aWxkKHtcbiAgICAgICAgZW50cnlQb2ludHM6IFtlbnRyeUZpbGVdLFxuICAgICAgICBidW5kbGU6IHRydWUsXG4gICAgICAgIHdyaXRlOiBmYWxzZSxcbiAgICAgICAgcGxhdGZvcm06ICduZXV0cmFsJyxcbiAgICAgICAgZm9ybWF0OiAnY2pzJyxcbiAgICAgICAgbWFpbkZpZWxkczogWydtb2R1bGUnLCAnbWFpbiddLFxuICAgICAgICBsb2dMZXZlbDogJ3NpbGVudCcsXG4gICAgICAgIHBsdWdpbnM6IFtjcmVhdGVOb2RlTW9kdWxlRXJyb3JQbHVnaW4oKV0sXG4gICAgICB9KTtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgYnVpbGQgdG8gZmFpbCcpO1xuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgIGlmIChlcnJvciAmJiB0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmICdlcnJvcnMnIGluIGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGZhaWx1cmUgPSBlcnJvciBhcyBlc2J1aWxkLkJ1aWxkRmFpbHVyZTtcbiAgICAgICAgZXhwZWN0KGZhaWx1cmUuZXJyb3JzKS50b0hhdmVMZW5ndGgoMSk7XG4gICAgICAgIGNvbnN0IHZpb2xhdGlvbiA9IGZhaWx1cmUuZXJyb3JzWzBdO1xuICAgICAgICBleHBlY3QodmlvbGF0aW9uLnRleHQpLnRvQ29udGFpbignXCJkdWFsLWVudHJ5LXBhY2thZ2VcIicpO1xuICAgICAgICBleHBlY3QodmlvbGF0aW9uLnRleHQpLnRvQ29udGFpbignZGVwZW5kcyBvbiBOb2RlLmpzIG1vZHVsZXMnKTtcbiAgICAgICAgZXhwZWN0KHZpb2xhdGlvbi5sb2NhdGlvbikudG9NYXRjaE9iamVjdCh7XG4gICAgICAgICAgZmlsZTogcmVsYXRpdmVFbnRyeSxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgcm1TeW5jKHRlbXBEaXIsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgICB9XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgZmluZCB1c2FnZSBvZiBuYW1lc3BhY2UgaW1wb3J0cycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB0ZXN0Q29kZSA9IGBcbiAgICAgIGltcG9ydCAqIGFzIGZzIGZyb20gXCJmc1wiO1xuICAgICAgZXhwb3J0IGZ1bmN0aW9uIHdvcmtmbG93KCkge1xuICAgICAgICByZXR1cm4gZnMucmVhZEZpbGUoXCJ0ZXN0LnR4dFwiKTtcbiAgICAgIH1cbiAgICBgO1xuXG4gICAgY29uc3QgeyBmYWlsdXJlLCByZWxhdGl2ZUVudHJ5IH0gPVxuICAgICAgYXdhaXQgYnVpbGRXb3JrZmxvd1dpdGhWaW9sYXRpb24odGVzdENvZGUpO1xuXG4gICAgZXhwZWN0KGZhaWx1cmUuZXJyb3JzKS50b0hhdmVMZW5ndGgoMSk7XG4gICAgY29uc3QgdmlvbGF0aW9uID0gZmFpbHVyZS5lcnJvcnNbMF07XG4gICAgZXhwZWN0KHZpb2xhdGlvbi50ZXh0KS50b0NvbnRhaW4oJ1wiZnNcIiB3aGljaCBpcyBhIE5vZGUuanMgbW9kdWxlJyk7XG4gICAgZXhwZWN0KHZpb2xhdGlvbi5sb2NhdGlvbikudG9NYXRjaE9iamVjdCh7XG4gICAgICBmaWxlOiByZWxhdGl2ZUVudHJ5LFxuICAgIH0pO1xuICAgIGV4cGVjdCh2aW9sYXRpb24ubG9jYXRpb24/LmxpbmVUZXh0KS50b0NvbnRhaW4oJ2ZzLnJlYWRGaWxlJyk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgZmluZCB1c2FnZSBvZiBkZWZhdWx0IGltcG9ydHMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgdGVzdENvZGUgPSBgXG4gICAgICBpbXBvcnQgZnMgZnJvbSBcImZzXCI7XG4gICAgICBleHBvcnQgZnVuY3Rpb24gd29ya2Zsb3coKSB7XG4gICAgICAgIHJldHVybiBmcy5yZWFkRmlsZShcInRlc3QudHh0XCIpO1xuICAgICAgfVxuICAgIGA7XG5cbiAgICBjb25zdCB7IGZhaWx1cmUsIHJlbGF0aXZlRW50cnkgfSA9XG4gICAgICBhd2FpdCBidWlsZFdvcmtmbG93V2l0aFZpb2xhdGlvbih0ZXN0Q29kZSk7XG5cbiAgICBleHBlY3QoZmFpbHVyZS5lcnJvcnMpLnRvSGF2ZUxlbmd0aCgxKTtcbiAgICBjb25zdCB2aW9sYXRpb24gPSBmYWlsdXJlLmVycm9yc1swXTtcbiAgICBleHBlY3QodmlvbGF0aW9uLnRleHQpLnRvQ29udGFpbignXCJmc1wiIHdoaWNoIGlzIGEgTm9kZS5qcyBtb2R1bGUnKTtcbiAgICBleHBlY3QodmlvbGF0aW9uLmxvY2F0aW9uKS50b01hdGNoT2JqZWN0KHtcbiAgICAgIGZpbGU6IHJlbGF0aXZlRW50cnksXG4gICAgfSk7XG4gICAgZXhwZWN0KHZpb2xhdGlvbi5sb2NhdGlvbj8ubGluZVRleHQpLnRvQ29udGFpbignZnMucmVhZEZpbGUnKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBmaW5kIHVzYWdlIG9mIGFsaWFzZWQgaW1wb3J0cycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB0ZXN0Q29kZSA9IGBcbiAgICAgIGltcG9ydCB7IHJlYWRGaWxlIGFzIHJlYWQgfSBmcm9tIFwiZnNcIjtcbiAgICAgIGV4cG9ydCBmdW5jdGlvbiB3b3JrZmxvdygpIHtcbiAgICAgICAgcmV0dXJuIHJlYWQoXCJ0ZXN0LnR4dFwiKTtcbiAgICAgIH1cbiAgICBgO1xuXG4gICAgY29uc3QgeyBmYWlsdXJlLCByZWxhdGl2ZUVudHJ5IH0gPVxuICAgICAgYXdhaXQgYnVpbGRXb3JrZmxvd1dpdGhWaW9sYXRpb24odGVzdENvZGUpO1xuXG4gICAgZXhwZWN0KGZhaWx1cmUuZXJyb3JzKS50b0hhdmVMZW5ndGgoMSk7XG4gICAgY29uc3QgdmlvbGF0aW9uID0gZmFpbHVyZS5lcnJvcnNbMF07XG4gICAgZXhwZWN0KHZpb2xhdGlvbi50ZXh0KS50b0NvbnRhaW4oJ1wiZnNcIiB3aGljaCBpcyBhIE5vZGUuanMgbW9kdWxlJyk7XG4gICAgZXhwZWN0KHZpb2xhdGlvbi5sb2NhdGlvbikudG9NYXRjaE9iamVjdCh7XG4gICAgICBmaWxlOiByZWxhdGl2ZUVudHJ5LFxuICAgIH0pO1xuICAgIC8vIFNob3VsZCBwb2ludCB0byB0aGUgYWxpYXNlZCBpZGVudGlmaWVyIFwicmVhZFwiLCBub3QgXCJyZWFkRmlsZVwiXG4gICAgZXhwZWN0KHZpb2xhdGlvbi5sb2NhdGlvbj8ubGluZVRleHQpLnRvQ29udGFpbigncmVhZCgnKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBub3QgZXJyb3Igd2hlbiBpbXBvcnQgaXMgdW51c2VkICh0cmVlLXNoYWtlbiknLCBhc3luYyAoKSA9PiB7XG4gICAgLy8gTm90ZTogZXNidWlsZCB0cmVlLXNoYWtlcyB1bnVzZWQgaW1wb3J0cywgc28gdGhleSBuZXZlciB0cmlnZ2VyIHJlc29sdXRpb24uXG4gICAgLy8gVGhpcyBpcyBleHBlY3RlZCBiZWhhdmlvciAtIGlmIHRoZSBpbXBvcnQgaXNuJ3QgdXNlZCwgdGhlIG1vZHVsZSB3b24ndCBiZSBidW5kbGVkLlxuICAgIGNvbnN0IHRlc3RDb2RlID0gYFxuICAgICAgaW1wb3J0IHsgcmVhZEZpbGUgfSBmcm9tIFwiZnNcIjtcbiAgICAgIGV4cG9ydCBmdW5jdGlvbiB3b3JrZmxvdygpIHtcbiAgICAgICAgcmV0dXJuIFwibm8gZnMgdXNhZ2VcIjtcbiAgICAgIH1cbiAgICBgO1xuXG4gICAgY29uc3QgdGVtcERpciA9IG1rZHRlbXBTeW5jKGpvaW4ocmVhbFRtcGRpciwgJ25vZGUtbW9kdWxlLXBsdWdpbi10ZXN0LScpKTtcbiAgICBjb25zdCBlbnRyeUZpbGUgPSBqb2luKHRlbXBEaXIsICd3b3JrZmxvdy50cycpO1xuICAgIHdyaXRlRmlsZVN5bmMoZW50cnlGaWxlLCB0ZXN0Q29kZSk7XG5cbiAgICB0cnkge1xuICAgICAgLy8gQnVpbGQgc2hvdWxkIHN1Y2NlZWQgYmVjYXVzZSB1bnVzZWQgaW1wb3J0cyBhcmUgdHJlZS1zaGFrZW5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGVzYnVpbGQuYnVpbGQoe1xuICAgICAgICBlbnRyeVBvaW50czogW2VudHJ5RmlsZV0sXG4gICAgICAgIGJ1bmRsZTogdHJ1ZSxcbiAgICAgICAgd3JpdGU6IGZhbHNlLFxuICAgICAgICBwbGF0Zm9ybTogJ25ldXRyYWwnLFxuICAgICAgICBsb2dMZXZlbDogJ3NpbGVudCcsXG4gICAgICAgIHBsdWdpbnM6IFtjcmVhdGVOb2RlTW9kdWxlRXJyb3JQbHVnaW4oKV0sXG4gICAgICB9KTtcbiAgICAgIGV4cGVjdChyZXN1bHQuZXJyb3JzKS50b0hhdmVMZW5ndGgoMCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHJtU3luYyh0ZW1wRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG4gICAgfVxuICB9KTtcblxuICBpdCgnc2hvdWxkIG5vdCBlcnJvciB3aGVuIGEgc2hhcmVkIG1vZHVsZSBleHBvc2VzIGEgd29ya2Zsb3ctc2FmZSBleHBvcnQgYWxvbmdzaWRlIGFuIHVudXNlZCBOb2RlLmpzLXVzaW5nIGV4cG9ydCcsIGFzeW5jICgpID0+IHtcbiAgICAvLyBSZXBybyBmb3IgaHR0cHM6Ly9naXRodWIuY29tL3ZlcmNlbC93b3JrZmxvdy9pc3N1ZXMvMTgxN1xuICAgIC8vXG4gICAgLy8gV2hlbiBhIHNoYXJlZCBtb2R1bGUgaGFzIGJvdGggYSB3b3JrZmxvdy1zYWZlIGV4cG9ydCBhbmQgYSBOb2RlLmpzLXVzaW5nXG4gICAgLy8gZXhwb3J0LCBhbmQgdGhlIHdvcmtmbG93IGJ1bmRsZSBvbmx5IHVzZXMgdGhlIHdvcmtmbG93LXNhZmUgb25lLCBlc2J1aWxkXG4gICAgLy8gc2hvdWxkIGJlIGFibGUgdG8gdHJlZS1zaGFrZSB0aGUgTm9kZS5qcy11c2luZyBleHBvcnQgKGFuZCBpdHMgaW1wb3J0cylcbiAgICAvLyBhbmQgdGhlIHBsdWdpbiBzaG91bGQgbm90IGVtaXQgYSBmYWxzZS1wb3NpdGl2ZSB2aW9sYXRpb24uXG4gICAgY29uc3QgdGVtcERpciA9IG1rZHRlbXBTeW5jKGpvaW4ocmVhbFRtcGRpciwgJ25vZGUtbW9kdWxlLXBsdWdpbi10ZXN0LScpKTtcbiAgICBjb25zdCBzaGFyZWRGaWxlID0gam9pbih0ZW1wRGlyLCAnc2hhcmVkLnRzJyk7XG4gICAgY29uc3QgZW50cnlGaWxlID0gam9pbih0ZW1wRGlyLCAnd29ya2Zsb3cudHMnKTtcblxuICAgIHdyaXRlRmlsZVN5bmMoXG4gICAgICBzaGFyZWRGaWxlLFxuICAgICAgYFxuICAgICAgaW1wb3J0IHsgcmVhZEZpbGUgfSBmcm9tIFwibm9kZTpmcy9wcm9taXNlc1wiO1xuICAgICAgaW1wb3J0IHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiO1xuXG4gICAgICBleHBvcnQgY29uc3QgaXNTdXBwb3J0ZWRWYWx1ZSA9ICh2YWx1ZSkgPT4gdmFsdWUgPT09IFwib2tcIjtcblxuICAgICAgZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWRGaXh0dXJlRmlsZSgpIHtcbiAgICAgICAgcmV0dXJuIHJlYWRGaWxlKHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCBcImZpeHR1cmUudHh0XCIpLCBcInV0ZjhcIik7XG4gICAgICB9XG4gICAgICBgXG4gICAgKTtcbiAgICB3cml0ZUZpbGVTeW5jKFxuICAgICAgZW50cnlGaWxlLFxuICAgICAgYFxuICAgICAgaW1wb3J0IHsgaXNTdXBwb3J0ZWRWYWx1ZSB9IGZyb20gXCIuL3NoYXJlZC5qc1wiO1xuICAgICAgZXhwb3J0IGZ1bmN0aW9uIHdvcmtmbG93KCkge1xuICAgICAgICByZXR1cm4gaXNTdXBwb3J0ZWRWYWx1ZShcIm9rXCIpO1xuICAgICAgfVxuICAgICAgYFxuICAgICk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZXNidWlsZC5idWlsZCh7XG4gICAgICAgIGVudHJ5UG9pbnRzOiBbZW50cnlGaWxlXSxcbiAgICAgICAgYnVuZGxlOiB0cnVlLFxuICAgICAgICB3cml0ZTogZmFsc2UsXG4gICAgICAgIHBsYXRmb3JtOiAnbmV1dHJhbCcsXG4gICAgICAgIGxvZ0xldmVsOiAnc2lsZW50JyxcbiAgICAgICAgcGx1Z2luczogW2NyZWF0ZU5vZGVNb2R1bGVFcnJvclBsdWdpbigpXSxcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KHJlc3VsdC5lcnJvcnMpLnRvSGF2ZUxlbmd0aCgwKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgcm1TeW5jKHRlbXBEaXIsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgICB9XG4gIH0pO1xuXG4gIGl0KFwic2hvdWxkIHN0aWxsIGVycm9yIHdoZW4gYSBzaGFyZWQgbW9kdWxlJ3MgTm9kZS5qcy11c2luZyBleHBvcnQgaXMgYWN0dWFsbHkgcmVmZXJlbmNlZFwiLCBhc3luYyAoKSA9PiB7XG4gICAgLy8gQ291bnRlcnBhcnQgdG8gdGhlIHByZXZpb3VzIHRlc3Q6IHdoZW4gdGhlIHdvcmtmbG93IHJlYWxseSBkb2VzIHB1bGwgaW5cbiAgICAvLyB0aGUgTm9kZS5qcy11c2luZyBleHBvcnQgKGRpcmVjdGx5IG9yIHRyYW5zaXRpdmVseSksIHRoZSBwbHVnaW4gbXVzdFxuICAgIC8vIHN0aWxsIGVtaXQgdGhlIHZpb2xhdGlvbi5cbiAgICBjb25zdCB0ZW1wRGlyID0gbWtkdGVtcFN5bmMoam9pbihyZWFsVG1wZGlyLCAnbm9kZS1tb2R1bGUtcGx1Z2luLXRlc3QtJykpO1xuICAgIGNvbnN0IHNoYXJlZEZpbGUgPSBqb2luKHRlbXBEaXIsICdzaGFyZWQudHMnKTtcbiAgICBjb25zdCBlbnRyeUZpbGUgPSBqb2luKHRlbXBEaXIsICd3b3JrZmxvdy50cycpO1xuICAgIGNvbnN0IHJlbGF0aXZlU2hhcmVkID0gcmVsYXRpdmUocHJvY2Vzcy5jd2QoKSwgc2hhcmVkRmlsZSk7XG5cbiAgICB3cml0ZUZpbGVTeW5jKFxuICAgICAgc2hhcmVkRmlsZSxcbiAgICAgIGBcbiAgICAgIGltcG9ydCB7IHJlYWRGaWxlIH0gZnJvbSBcIm5vZGU6ZnMvcHJvbWlzZXNcIjtcbiAgICAgIGltcG9ydCBwYXRoIGZyb20gXCJub2RlOnBhdGhcIjtcblxuICAgICAgZXhwb3J0IGNvbnN0IGlzU3VwcG9ydGVkVmFsdWUgPSAodmFsdWUpID0+IHZhbHVlID09PSBcIm9rXCI7XG5cbiAgICAgIGV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWFkRml4dHVyZUZpbGUoKSB7XG4gICAgICAgIHJldHVybiByZWFkRmlsZShwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgXCJmaXh0dXJlLnR4dFwiKSwgXCJ1dGY4XCIpO1xuICAgICAgfVxuICAgICAgYFxuICAgICk7XG4gICAgd3JpdGVGaWxlU3luYyhcbiAgICAgIGVudHJ5RmlsZSxcbiAgICAgIGBcbiAgICAgIGltcG9ydCB7IGlzU3VwcG9ydGVkVmFsdWUsIHJlYWRGaXh0dXJlRmlsZSB9IGZyb20gXCIuL3NoYXJlZC5qc1wiO1xuICAgICAgZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdvcmtmbG93KCkge1xuICAgICAgICBpZiAoIWlzU3VwcG9ydGVkVmFsdWUoXCJva1wiKSkgdGhyb3cgbmV3IEVycm9yKFwibm9wZVwiKTtcbiAgICAgICAgcmV0dXJuIHJlYWRGaXh0dXJlRmlsZSgpO1xuICAgICAgfVxuICAgICAgYFxuICAgICk7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgZXNidWlsZC5idWlsZCh7XG4gICAgICAgIGVudHJ5UG9pbnRzOiBbZW50cnlGaWxlXSxcbiAgICAgICAgYnVuZGxlOiB0cnVlLFxuICAgICAgICB3cml0ZTogZmFsc2UsXG4gICAgICAgIHBsYXRmb3JtOiAnbmV1dHJhbCcsXG4gICAgICAgIGxvZ0xldmVsOiAnc2lsZW50JyxcbiAgICAgICAgcGx1Z2luczogW2NyZWF0ZU5vZGVNb2R1bGVFcnJvclBsdWdpbigpXSxcbiAgICAgIH0pO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCBidWlsZCB0byBmYWlsJyk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgaWYgKGVycm9yICYmIHR5cGVvZiBlcnJvciA9PT0gJ29iamVjdCcgJiYgJ2Vycm9ycycgaW4gZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZmFpbHVyZSA9IGVycm9yIGFzIGVzYnVpbGQuQnVpbGRGYWlsdXJlO1xuICAgICAgICBjb25zdCBwYXRocyA9IGZhaWx1cmUuZXJyb3JzLm1hcCgoZSkgPT4gZS50ZXh0KTtcbiAgICAgICAgZXhwZWN0KHBhdGhzLnNvbWUoKHQpID0+IHQuaW5jbHVkZXMoJ1wibm9kZTpmcy9wcm9taXNlc1wiJykpKS50b0JlKHRydWUpO1xuICAgICAgICBleHBlY3QocGF0aHMuc29tZSgodCkgPT4gdC5pbmNsdWRlcygnXCJub2RlOnBhdGhcIicpKSkudG9CZSh0cnVlKTtcbiAgICAgICAgLy8gVmlvbGF0aW9ucyBzaG91bGQgYmUgYXR0cmlidXRlZCB0byB0aGUgc2hhcmVkIG1vZHVsZSwgbm90IHRoZSBlbnRyeS5cbiAgICAgICAgZm9yIChjb25zdCBlcnIgb2YgZmFpbHVyZS5lcnJvcnMpIHtcbiAgICAgICAgICBleHBlY3QoZXJyLmxvY2F0aW9uPy5maWxlKS50b0JlKHJlbGF0aXZlU2hhcmVkKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHJtU3luYyh0ZW1wRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG4gICAgfVxuICB9KTtcblxuICBpdCgnc2hvdWxkIG5vdCBwb2ludCB0byBKU0RvYyBjb21tZW50cyB3aGVuIGZpbmRpbmcgdXNhZ2UnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgdGVzdENvZGUgPSBgXG4gICAgICBpbXBvcnQgeyBXcml0YWJsZSB9IGZyb20gXCJzdHJlYW1cIjtcbiAgICAgIC8qKlxuICAgICAgICogQ29udmVydCBhIFdlYiBXcml0YWJsZVN0cmVhbTxzdHJpbmc+IGludG8gYSBOb2RlLmpzIFdyaXRhYmxlIHN0cmVhbVxuICAgICAgICovXG4gICAgICBleHBvcnQgZnVuY3Rpb24gd29ya2Zsb3coKSB7XG4gICAgICAgIHJldHVybiBuZXcgV3JpdGFibGUoKTtcbiAgICAgIH1cbiAgICBgO1xuXG4gICAgY29uc3QgeyBmYWlsdXJlIH0gPSBhd2FpdCBidWlsZFdvcmtmbG93V2l0aFZpb2xhdGlvbih0ZXN0Q29kZSk7XG5cbiAgICBleHBlY3QoZmFpbHVyZS5lcnJvcnMpLnRvSGF2ZUxlbmd0aCgxKTtcbiAgICBjb25zdCB2aW9sYXRpb24gPSBmYWlsdXJlLmVycm9yc1swXTtcbiAgICBleHBlY3QodmlvbGF0aW9uLnRleHQpLnRvQ29udGFpbignXCJzdHJlYW1cIiB3aGljaCBpcyBhIE5vZGUuanMgbW9kdWxlJyk7XG4gICAgLy8gU2hvdWxkIHBvaW50IHRvIHRoZSBhY3R1YWwgY29kZSB1c2FnZSwgbm90IHRoZSBKU0RvYyBjb21tZW50XG4gICAgZXhwZWN0KHZpb2xhdGlvbi5sb2NhdGlvbj8ubGluZVRleHQpLnRvQ29udGFpbignbmV3IFdyaXRhYmxlKCknKTtcbiAgICBleHBlY3QodmlvbGF0aW9uLmxvY2F0aW9uPy5saW5lVGV4dCkubm90LnRvQ29udGFpbignKicpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIG5vdCBwb2ludCB0byBzaW5nbGUtbGluZSBibG9jayBjb21tZW50cyB3aGVuIGZpbmRpbmcgdXNhZ2UnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgdGVzdENvZGUgPSBgXG4gICAgICBpbXBvcnQgeyBXcml0YWJsZSB9IGZyb20gXCJzdHJlYW1cIjtcbiAgICAgIC8qIFdyaXRhYmxlIGlzIHVzZWQgYmVsb3cgKi9cbiAgICAgIGV4cG9ydCBmdW5jdGlvbiB3b3JrZmxvdygpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBXcml0YWJsZSgpO1xuICAgICAgfVxuICAgIGA7XG5cbiAgICBjb25zdCB7IGZhaWx1cmUgfSA9IGF3YWl0IGJ1aWxkV29ya2Zsb3dXaXRoVmlvbGF0aW9uKHRlc3RDb2RlKTtcblxuICAgIGV4cGVjdChmYWlsdXJlLmVycm9ycykudG9IYXZlTGVuZ3RoKDEpO1xuICAgIGNvbnN0IHZpb2xhdGlvbiA9IGZhaWx1cmUuZXJyb3JzWzBdO1xuICAgIC8vIFNob3VsZCBwb2ludCB0byB0aGUgYWN0dWFsIGNvZGUgdXNhZ2UsIG5vdCB0aGUgY29tbWVudFxuICAgIGV4cGVjdCh2aW9sYXRpb24ubG9jYXRpb24/LmxpbmVUZXh0KS50b0NvbnRhaW4oJ25ldyBXcml0YWJsZSgpJyk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgbm90IHRyZWF0IGNvbW1lbnQgZGVsaW1pdGVycyBpbnNpZGUgc3RyaW5ncyBhcyBjb21tZW50cycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB0ZXN0Q29kZSA9IGBcbiAgICAgIGltcG9ydCB7IFdyaXRhYmxlIH0gZnJvbSBcInN0cmVhbVwiO1xuICAgICAgY29uc3QgcGF0dGVybiA9IFwiLyogV3JpdGFibGUgKi9cIjtcbiAgICAgIGV4cG9ydCBmdW5jdGlvbiB3b3JrZmxvdygpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBXcml0YWJsZSgpO1xuICAgICAgfVxuICAgIGA7XG5cbiAgICBjb25zdCB7IGZhaWx1cmUgfSA9IGF3YWl0IGJ1aWxkV29ya2Zsb3dXaXRoVmlvbGF0aW9uKHRlc3RDb2RlKTtcblxuICAgIGV4cGVjdChmYWlsdXJlLmVycm9ycykudG9IYXZlTGVuZ3RoKDEpO1xuICAgIGNvbnN0IHZpb2xhdGlvbiA9IGZhaWx1cmUuZXJyb3JzWzBdO1xuICAgIGV4cGVjdCh2aW9sYXRpb24udGV4dCkudG9Db250YWluKCdcInN0cmVhbVwiIHdoaWNoIGlzIGEgTm9kZS5qcyBtb2R1bGUnKTtcbiAgICAvLyBTaG91bGQgcG9pbnQgdG8gYWN0dWFsIGNvZGUsIG5vdCB0aGUgc3RyaW5nIGNvbnRhaW5pbmcgXCJXcml0YWJsZVwiXG4gICAgZXhwZWN0KHZpb2xhdGlvbi5sb2NhdGlvbj8ubGluZVRleHQpLnRvQ29udGFpbignbmV3IFdyaXRhYmxlKCknKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBlcnJvciBvbiBCdW4gbW9kdWxlIGltcG9ydHMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgdGVzdENvZGUgPSBgXG4gICAgICBpbXBvcnQgeyBzZXJ2ZSB9IGZyb20gXCJidW5cIjtcbiAgICAgIGV4cG9ydCBmdW5jdGlvbiB3b3JrZmxvdygpIHtcbiAgICAgICAgcmV0dXJuIHNlcnZlKHsgcG9ydDogMzAwMCB9KTtcbiAgICAgIH1cbiAgICBgO1xuXG4gICAgY29uc3QgeyBmYWlsdXJlLCByZWxhdGl2ZUVudHJ5IH0gPVxuICAgICAgYXdhaXQgYnVpbGRXb3JrZmxvd1dpdGhWaW9sYXRpb24odGVzdENvZGUpO1xuXG4gICAgZXhwZWN0KGZhaWx1cmUuZXJyb3JzKS50b0hhdmVMZW5ndGgoMSk7XG4gICAgY29uc3QgdmlvbGF0aW9uID0gZmFpbHVyZS5lcnJvcnNbMF07XG4gICAgZXhwZWN0KHZpb2xhdGlvbi50ZXh0KS50b0NvbnRhaW4oJ1wiYnVuXCIgd2hpY2ggaXMgYSBCdW4gbW9kdWxlJyk7XG4gICAgZXhwZWN0KHZpb2xhdGlvbi50ZXh0KS50b0NvbnRhaW4oJ0J1biBtb2R1bGVzIGFyZSBub3QgYXZhaWxhYmxlJyk7XG4gICAgZXhwZWN0KHZpb2xhdGlvbi5sb2NhdGlvbikudG9NYXRjaE9iamVjdCh7XG4gICAgICBmaWxlOiByZWxhdGl2ZUVudHJ5LFxuICAgIH0pO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGVycm9yIG9uIEJ1biBzdWJwYXRoIGltcG9ydHMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgdGVzdENvZGUgPSBgXG4gICAgICBpbXBvcnQgeyBEYXRhYmFzZSB9IGZyb20gXCJidW46c3FsaXRlXCI7XG4gICAgICBleHBvcnQgZnVuY3Rpb24gd29ya2Zsb3coKSB7XG4gICAgICAgIHJldHVybiBuZXcgRGF0YWJhc2UoXCJ0ZXN0LmRiXCIpO1xuICAgICAgfVxuICAgIGA7XG5cbiAgICBjb25zdCB7IGZhaWx1cmUsIHJlbGF0aXZlRW50cnkgfSA9XG4gICAgICBhd2FpdCBidWlsZFdvcmtmbG93V2l0aFZpb2xhdGlvbih0ZXN0Q29kZSk7XG5cbiAgICBleHBlY3QoZmFpbHVyZS5lcnJvcnMpLnRvSGF2ZUxlbmd0aCgxKTtcbiAgICBjb25zdCB2aW9sYXRpb24gPSBmYWlsdXJlLmVycm9yc1swXTtcbiAgICBleHBlY3QodmlvbGF0aW9uLnRleHQpLnRvQ29udGFpbignXCJidW46c3FsaXRlXCIgd2hpY2ggaXMgYSBCdW4gbW9kdWxlJyk7XG4gICAgZXhwZWN0KHZpb2xhdGlvbi50ZXh0KS50b0NvbnRhaW4oJ0J1biBtb2R1bGVzIGFyZSBub3QgYXZhaWxhYmxlJyk7XG4gICAgZXhwZWN0KHZpb2xhdGlvbi5sb2NhdGlvbikudG9NYXRjaE9iamVjdCh7XG4gICAgICBmaWxlOiByZWxhdGl2ZUVudHJ5LFxuICAgIH0pO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZSgnd29ya2Zsb3ctbm9kZS1tb2R1bGUtZXJyb3IgaGVscGVyIGZ1bmN0aW9ucycsICgpID0+IHtcbiAgZGVzY3JpYmUoJ2dldFBhY2thZ2VOYW1lJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgZ2V0IHRoZSBwYWNrYWdlIG5hbWUgZnJvbSBzaW1wbGUgbm9kZV9tb2R1bGVzIHBhdGgnLCAoKSA9PiB7XG4gICAgICBjb25zdCBwYWNrYWdlTmFtZSA9IGdldFBhY2thZ2VOYW1lKFxuICAgICAgICAnL1VzZXJzL2FkcmlhbmxhbS9HaXRIdWIvd29ya2Zsb3cvbm9kZV9tb2R1bGVzL25vZGUtZmV0Y2gvc3JjL2luZGV4LmpzJ1xuICAgICAgKTtcbiAgICAgIGV4cGVjdChwYWNrYWdlTmFtZSkudG9CZSgnbm9kZS1mZXRjaCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBnZXQgdGhlIHBhY2thZ2UgbmFtZSBmcm9tIHBucG0gbmVzdGVkIHBhdGgnLCAoKSA9PiB7XG4gICAgICBjb25zdCBwYWNrYWdlTmFtZSA9IGdldFBhY2thZ2VOYW1lKFxuICAgICAgICAnL1VzZXJzL2FkcmlhbmxhbS9HaXRIdWIvd29ya2Zsb3cvbm9kZV9tb2R1bGVzLy5wbnBtL25vZGUtZmV0Y2hAMy4zLjIvbm9kZV9tb2R1bGVzL25vZGUtZmV0Y2gvc3JjL2luZGV4LmpzJ1xuICAgICAgKTtcbiAgICAgIGV4cGVjdChwYWNrYWdlTmFtZSkudG9CZSgnbm9kZS1mZXRjaCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBnZXQgc2NvcGVkIHBhY2thZ2UgbmFtZScsICgpID0+IHtcbiAgICAgIGNvbnN0IHBhY2thZ2VOYW1lID0gZ2V0UGFja2FnZU5hbWUoXG4gICAgICAgICcvcHJvamVjdC9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL3N1cGFiYXNlLWpzL2Rpc3QvaW5kZXguanMnXG4gICAgICApO1xuICAgICAgZXhwZWN0KHBhY2thZ2VOYW1lKS50b0JlKCdAc3VwYWJhc2Uvc3VwYWJhc2UtanMnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIG51bGwgZm9yIHBhdGhzIHdpdGhvdXQgbm9kZV9tb2R1bGVzJywgKCkgPT4ge1xuICAgICAgY29uc3QgcGFja2FnZU5hbWUgPSBnZXRQYWNrYWdlTmFtZShcbiAgICAgICAgJy9Vc2Vycy9hZHJpYW5sYW0vR2l0SHViL3dvcmtmbG93L3NyYy9pbmRleC5qcydcbiAgICAgICk7XG4gICAgICBleHBlY3QocGFja2FnZU5hbWUpLnRvQmVOdWxsKCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdlc2NhcGVSZWdFeHAnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBlc2NhcGUgcmVnZXggc3BlY2lhbCBjaGFyYWN0ZXJzJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGVzY2FwZVJlZ0V4cCgndGVzdC5maWxlJykpLnRvQmUoJ3Rlc3RcXFxcLmZpbGUnKTtcbiAgICAgIGV4cGVjdChlc2NhcGVSZWdFeHAoJ3Rlc3QqZmlsZScpKS50b0JlKCd0ZXN0XFxcXCpmaWxlJyk7XG4gICAgICBleHBlY3QoZXNjYXBlUmVnRXhwKCd0ZXN0K2ZpbGUnKSkudG9CZSgndGVzdFxcXFwrZmlsZScpO1xuICAgICAgZXhwZWN0KGVzY2FwZVJlZ0V4cCgndGVzdD9maWxlJykpLnRvQmUoJ3Rlc3RcXFxcP2ZpbGUnKTtcbiAgICAgIGV4cGVjdChlc2NhcGVSZWdFeHAoJ3Rlc3ReZmlsZScpKS50b0JlKCd0ZXN0XFxcXF5maWxlJyk7XG4gICAgICBleHBlY3QoZXNjYXBlUmVnRXhwKCd0ZXN0JGZpbGUnKSkudG9CZSgndGVzdFxcXFwkZmlsZScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBlc2NhcGUgYnJhY2tldHMgYW5kIGJyYWNlcycsICgpID0+IHtcbiAgICAgIGV4cGVjdChlc2NhcGVSZWdFeHAoJ3Rlc3R7ZmlsZX0nKSkudG9CZSgndGVzdFxcXFx7ZmlsZVxcXFx9Jyk7XG4gICAgICBleHBlY3QoZXNjYXBlUmVnRXhwKCd0ZXN0W2ZpbGVdJykpLnRvQmUoJ3Rlc3RcXFxcW2ZpbGVcXFxcXScpO1xuICAgICAgZXhwZWN0KGVzY2FwZVJlZ0V4cCgndGVzdChmaWxlKScpKS50b0JlKCd0ZXN0XFxcXChmaWxlXFxcXCknKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZXNjYXBlIHBpcGVzIGFuZCBiYWNrc2xhc2hlcycsICgpID0+IHtcbiAgICAgIGV4cGVjdChlc2NhcGVSZWdFeHAoJ3Rlc3R8ZmlsZScpKS50b0JlKCd0ZXN0XFxcXHxmaWxlJyk7XG4gICAgICBleHBlY3QoZXNjYXBlUmVnRXhwKCd0ZXN0XFxcXGZpbGUnKSkudG9CZSgndGVzdFxcXFxcXFxcZmlsZScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgc3RyaW5ncyB3aXRob3V0IHNwZWNpYWwgY2hhcmFjdGVycycsICgpID0+IHtcbiAgICAgIGV4cGVjdChlc2NhcGVSZWdFeHAoJ3Rlc3RmaWxlJykpLnRvQmUoJ3Rlc3RmaWxlJyk7XG4gICAgICBleHBlY3QoZXNjYXBlUmVnRXhwKCd0ZXN0LWZpbGUnKSkudG9CZSgndGVzdC1maWxlJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhbmRsZSBwYWNrYWdlIG5hbWVzIHdpdGggc3BlY2lhbCBjaGFyYWN0ZXJzJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGVzY2FwZVJlZ0V4cCgnQHN1cGFiYXNlL3N1cGFiYXNlLWpzJykpLnRvQmUoXG4gICAgICAgICdAc3VwYWJhc2Uvc3VwYWJhc2UtanMnXG4gICAgICApO1xuICAgICAgZXhwZWN0KGVzY2FwZVJlZ0V4cCgncGFja2FnZS5uYW1lJykpLnRvQmUoJ3BhY2thZ2VcXFxcLm5hbWUnKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2dldEltcG9ydGVkSWRlbnRpZmllcicsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGV4dHJhY3QgbmFtZXNwYWNlIGltcG9ydCBpZGVudGlmaWVyJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGdldEltcG9ydGVkSWRlbnRpZmllcignKiBhcyBmcycpKS50b0JlKCdmcycpO1xuICAgICAgZXhwZWN0KGdldEltcG9ydGVkSWRlbnRpZmllcignKiAgIGFzICAgcGF0aCcpKS50b0JlKCdwYXRoJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGV4dHJhY3QgZmlyc3QgbmFtZWQgaW1wb3J0JywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGdldEltcG9ydGVkSWRlbnRpZmllcigneyByZWFkRmlsZSB9JykpLnRvQmUoJ3JlYWRGaWxlJyk7XG4gICAgICBleHBlY3QoZ2V0SW1wb3J0ZWRJZGVudGlmaWVyKCd7IHJlYWRGaWxlLCB3cml0ZUZpbGUgfScpKS50b0JlKCdyZWFkRmlsZScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBleHRyYWN0IGFsaWFzZWQgbmFtZWQgaW1wb3J0JywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGdldEltcG9ydGVkSWRlbnRpZmllcigneyByZWFkRmlsZSBhcyByZWFkIH0nKSkudG9CZSgncmVhZCcpO1xuICAgICAgZXhwZWN0KGdldEltcG9ydGVkSWRlbnRpZmllcigneyByZWFkRmlsZSBhcyByZWFkLCB3cml0ZUZpbGUgfScpKS50b0JlKFxuICAgICAgICAncmVhZCdcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGV4dHJhY3QgZGVmYXVsdCBpbXBvcnQnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoZ2V0SW1wb3J0ZWRJZGVudGlmaWVyKCdmcycpKS50b0JlKCdmcycpO1xuICAgICAgZXhwZWN0KGdldEltcG9ydGVkSWRlbnRpZmllcignbXlEZWZhdWx0JykpLnRvQmUoJ215RGVmYXVsdCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBleHRyYWN0IGZpcnN0IGlkZW50aWZpZXIgZnJvbSBtaXhlZCBpbXBvcnRzJywgKCkgPT4ge1xuICAgICAgLy8gVGhlIGZ1bmN0aW9uIGNoZWNrcyBmb3IgYnJhY2VzIGZpcnN0LCBzbyBpdCBleHRyYWN0cyBmcm9tIG5hbWVkIGltcG9ydHNcbiAgICAgIGV4cGVjdChnZXRJbXBvcnRlZElkZW50aWZpZXIoJ2ZzLCB7IHJlYWRGaWxlIH0nKSkudG9CZSgncmVhZEZpbGUnKTtcbiAgICAgIGV4cGVjdChnZXRJbXBvcnRlZElkZW50aWZpZXIoJ2RlZmF1bHRFeHBvcnQsIHsgbmFtZWQgfScpKS50b0JlKCduYW1lZCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgd2hpdGVzcGFjZSB2YXJpYXRpb25zJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGdldEltcG9ydGVkSWRlbnRpZmllcignICB7IHJlYWRGaWxlIH0gICcpKS50b0JlKCdyZWFkRmlsZScpO1xuICAgICAgZXhwZWN0KGdldEltcG9ydGVkSWRlbnRpZmllcigne3JlYWRGaWxlfScpKS50b0JlKCdyZWFkRmlsZScpO1xuICAgICAgZXhwZWN0KGdldEltcG9ydGVkSWRlbnRpZmllcigneyByZWFkRmlsZSAsIHdyaXRlRmlsZSB9JykpLnRvQmUoXG4gICAgICAgICdyZWFkRmlsZSdcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhbmRsZSBjb21wbGV4IG5hbWVkIGltcG9ydHMnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoZ2V0SW1wb3J0ZWRJZGVudGlmaWVyKCd0eXBlIHsgUmVhZFN0cmVhbSB9JykpLnRvQmUoJ1JlYWRTdHJlYW0nKTtcbiAgICAgIGV4cGVjdChnZXRJbXBvcnRlZElkZW50aWZpZXIoJ3sgZGVmYXVsdCBhcyBmcyB9JykpLnRvQmUoJ2ZzJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiB1bmRlZmluZWQgZm9yIGVkZ2UgY2FzZXMnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoZ2V0SW1wb3J0ZWRJZGVudGlmaWVyKCcqJykpLnRvQmVVbmRlZmluZWQoKTtcbiAgICAgIGV4cGVjdChnZXRJbXBvcnRlZElkZW50aWZpZXIoJycpKS50b0JlVW5kZWZpbmVkKCk7XG4gICAgICAvLyBFbXB0eSBicmFjZXMgc2hvdWxkIHJldHVybiB1bmRlZmluZWQgc2luY2UgdGhlcmUncyBubyB2YWxpZCBpZGVudGlmaWVyXG4gICAgICBleHBlY3QoZ2V0SW1wb3J0ZWRJZGVudGlmaWVyKCd7fScpKS50b0JlVW5kZWZpbmVkKCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdnZXRWaW9sYXRpb25Mb2NhdGlvbicsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGZpbmQgdmlvbGF0aW9uIGxvY2F0aW9uIGZvciBwYWNrYWdlIG5hbWUgdGhhdCBhcHBlYXJzIGluIGZpbGUnLCBhc3luYyAoKSA9PiB7XG4gICAgICAvLyBVc2UgdGhlIGFjdHVhbCBtb25vcmVwbyByb290IGFzIGN3ZFxuICAgICAgY29uc3QgY3dkID0gcHJvY2Vzcy5jd2QoKTtcbiAgICAgIGNvbnN0IHRlc3RGaWxlID0gJ3NyYy9ub2RlLW1vZHVsZS1lc2J1aWxkLXBsdWdpbi50ZXN0LnRzJztcblxuICAgICAgLy8gVGVzdCB3aXRoICd2aXRlc3QnIHdoaWNoIGlzIGFjdHVhbGx5IGltcG9ydGVkIGluIHRoaXMgZmlsZVxuICAgICAgY29uc3QgbG9jYXRpb24gPSBhd2FpdCBnZXRWaW9sYXRpb25Mb2NhdGlvbihjd2QsIHRlc3RGaWxlLCAndml0ZXN0Jyk7XG5cbiAgICAgIC8vIFRoZSBmdW5jdGlvbiBzaG91bGQgZmluZCAndml0ZXN0JyBpbiB0aGUgaW1wb3J0IHN0YXRlbWVudFxuICAgICAgZXhwZWN0KGxvY2F0aW9uKS50b0JlRGVmaW5lZCgpO1xuICAgICAgZXhwZWN0KGxvY2F0aW9uPy5maWxlKS50b0JlKHRlc3RGaWxlKTtcblxuICAgICAgY29uc3QgY29udGVudHMgPSByZWFkRmlsZVN5bmMocmVzb2x2ZShjd2QsIHRlc3RGaWxlKSwgJ3V0ZjgnKTtcbiAgICAgIGNvbnN0IGxpbmVzID0gY29udGVudHMuc3BsaXQoL1xccj9cXG4vKTtcbiAgICAgIGNvbnN0IGV4cGVjdGVkTGluZSA9XG4gICAgICAgIGxpbmVzLmZpbmRJbmRleCgobGluZSkgPT4gbGluZS5pbmNsdWRlcyhgZGVzY3JpYmUoYCkpICsgMTtcblxuICAgICAgZXhwZWN0KGxvY2F0aW9uPy5saW5lKS50b0JlKGV4cGVjdGVkTGluZSk7XG4gICAgICBleHBlY3QobG9jYXRpb24/LmNvbHVtbikudG9CZSgwKTtcbiAgICAgIGV4cGVjdChsb2NhdGlvbj8ubGluZVRleHQpLnRvQ29udGFpbihgZGVzY3JpYmUoYCk7XG4gICAgICBleHBlY3QobG9jYXRpb24/Lmxlbmd0aCkudG9CZSg4KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIHVuZGVmaW5lZCBmb3Igbm9uLWV4aXN0ZW50IGZpbGVzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgY3dkID0gcHJvY2Vzcy5jd2QoKTtcbiAgICAgIGNvbnN0IGxvY2F0aW9uID0gYXdhaXQgZ2V0VmlvbGF0aW9uTG9jYXRpb24oXG4gICAgICAgIGN3ZCxcbiAgICAgICAgJ25vbi1leGlzdGVudC1maWxlLnRzJyxcbiAgICAgICAgJ3NvbWUtcGFja2FnZSdcbiAgICAgICk7XG5cbiAgICAgIGV4cGVjdChsb2NhdGlvbikudG9CZVVuZGVmaW5lZCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdW5kZWZpbmVkIGZvciBmaWxlcyB3aXRob3V0IHRoZSBwYWNrYWdlIGltcG9ydCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGN3ZCA9IHByb2Nlc3MuY3dkKCk7XG4gICAgICBjb25zdCB0ZXN0RmlsZSA9ICdzcmMvbm9kZS1tb2R1bGUtZXNidWlsZC1wbHVnaW4udGVzdC50cyc7XG5cbiAgICAgIC8vIFRoaXMgcGFja2FnZSBpcyBub3QgaW1wb3J0ZWQgaW4gdGhlIHRlc3QgZmlsZVxuICAgICAgY29uc3QgbG9jYXRpb24gPSBhd2FpdCBnZXRWaW9sYXRpb25Mb2NhdGlvbihcbiAgICAgICAgY3dkLFxuICAgICAgICB0ZXN0RmlsZSxcbiAgICAgICAgJ25vbi1leGlzdGVudC1wYWNrYWdlJ1xuICAgICAgKTtcblxuICAgICAgZXhwZWN0KGxvY2F0aW9uKS50b0JlVW5kZWZpbmVkKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiB1bmRlZmluZWQgd2hlbiBpbXBvcnQgaXMgdW51c2VkIGV2ZW4gaWYgaXQgY2FuIGJlIHBhcnNlZCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGN3ZCA9IHByb2Nlc3MuY3dkKCk7XG4gICAgICBjb25zdCB0ZXN0RmlsZSA9ICdzcmMvbm9kZS1tb2R1bGUtZXNidWlsZC1wbHVnaW4udGVzdC50cyc7XG5cbiAgICAgIC8vIFRlc3Qgd2l0aCAnbm9kZTpodHRwJyB3aGljaCBpcyBpbXBvcnRlZCBpbiB0aGlzIGZpbGUgYnV0IG5ldmVyIHVzZWRcbiAgICAgIGNvbnN0IGxvY2F0aW9uID0gYXdhaXQgZ2V0VmlvbGF0aW9uTG9jYXRpb24oY3dkLCB0ZXN0RmlsZSwgJ25vZGU6aHR0cCcpO1xuXG4gICAgICAvLyBTaW5jZSB0aGUgaWRlbnRpZmllciBpcyBuZXZlciByZWZlcmVuY2VkIChvbmx5IGltcG9ydGVkKSwgd2Ugc2hvdWxkXG4gICAgICAvLyBub3QgcHJvZHVjZSBhIGxvY2F0aW9uIHByZXZpZXcuXG4gICAgICBleHBlY3QobG9jYXRpb24pLnRvQmVVbmRlZmluZWQoKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
|