@aws-cdk/toolkit-lib 0.2.0 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/build-info.json +2 -2
  2. package/lib/actions/bootstrap/index.js +69 -5
  3. package/lib/actions/diff/index.d.ts +8 -0
  4. package/lib/actions/diff/index.js +1 -1
  5. package/lib/actions/diff/private/helpers.d.ts +16 -0
  6. package/lib/actions/diff/private/helpers.js +31 -6
  7. package/lib/actions/index.d.ts +1 -0
  8. package/lib/actions/index.js +2 -1
  9. package/lib/actions/refactor/index.d.ts +15 -0
  10. package/lib/actions/refactor/index.js +3 -0
  11. package/lib/api/cloud-assembly/cached-source.d.ts +37 -0
  12. package/lib/api/cloud-assembly/cached-source.js +53 -0
  13. package/lib/api/cloud-assembly/index.d.ts +1 -0
  14. package/lib/api/cloud-assembly/index.js +2 -1
  15. package/lib/api/cloud-assembly/private/borrowed-assembly.d.ts +15 -0
  16. package/lib/api/cloud-assembly/private/borrowed-assembly.js +23 -0
  17. package/lib/api/cloud-assembly/private/context-aware-source.d.ts +18 -5
  18. package/lib/api/cloud-assembly/private/context-aware-source.js +25 -8
  19. package/lib/api/cloud-assembly/private/index.d.ts +0 -2
  20. package/lib/api/cloud-assembly/private/index.js +1 -3
  21. package/lib/api/cloud-assembly/private/prepare-source.d.ts +38 -8
  22. package/lib/api/cloud-assembly/private/prepare-source.js +77 -17
  23. package/lib/api/cloud-assembly/private/readable-assembly.d.ts +26 -0
  24. package/lib/api/cloud-assembly/private/readable-assembly.js +34 -0
  25. package/lib/api/cloud-assembly/private/source-builder.d.ts +27 -0
  26. package/lib/api/cloud-assembly/private/source-builder.js +139 -30
  27. package/lib/api/cloud-assembly/private/stack-assembly.d.ts +10 -4
  28. package/lib/api/cloud-assembly/private/stack-assembly.js +18 -3
  29. package/lib/api/cloud-assembly/source-builder.d.ts +6 -0
  30. package/lib/api/cloud-assembly/source-builder.js +1 -1
  31. package/lib/api/cloud-assembly/types.d.ts +32 -1
  32. package/lib/api/cloud-assembly/types.js +1 -1
  33. package/lib/api/shared-private.js +373 -20
  34. package/lib/api/shared-private.js.map +4 -4
  35. package/lib/api/shared-public.d.ts +82 -61
  36. package/lib/index_bg.wasm +0 -0
  37. package/lib/toolkit/private/index.d.ts +4 -0
  38. package/lib/toolkit/private/index.js +7 -2
  39. package/lib/toolkit/toolkit.d.ts +16 -2
  40. package/lib/toolkit/toolkit.js +327 -162
  41. package/package.json +11 -11
  42. package/lib/api/cloud-assembly/private/cached-source.d.ts +0 -15
  43. package/lib/api/cloud-assembly/private/cached-source.js +0 -25
  44. package/lib/api/cloud-assembly/private/identity-source.d.ts +0 -10
  45. package/lib/api/cloud-assembly/private/identity-source.js +0 -17
@@ -1,14 +1,28 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ContextAwareCloudAssembly = void 0;
3
+ exports.ContextAwareCloudAssemblySource = void 0;
4
4
  const private_1 = require("../../io/private");
5
5
  const shared_private_1 = require("../../shared-private");
6
6
  const shared_private_2 = require("../../shared-private");
7
7
  const shared_public_1 = require("../../shared-public");
8
8
  /**
9
- * Represent the Cloud Executable and the synthesis we can do on it
9
+ * A CloudAssemblySource that wraps another CloudAssemblySource and runs a lookup loop on it
10
+ *
11
+ * This means that if the underlying CloudAssemblySource produces a manifest
12
+ * with provider queries in it, the `ContextAwareCloudAssemblySource` will
13
+ * perform the necessary context lookups and invoke the underlying
14
+ * `CloudAssemblySource` again with thew missing context information.
15
+ *
16
+ * This is only useful if the underlying `CloudAssemblySource` can respond to
17
+ * this new context information (it must be a CDK app source); if it is just a
18
+ * static directory, then the contents of the assembly won't change in response
19
+ * to context.
20
+ *
21
+ * The context is passed between `ContextAwareCloudAssemblySource` and the wrapped
22
+ * cloud assembly source via a contex file on disk, so the wrapped assembly source
23
+ * should re-read the context file on every invocation.
10
24
  */
11
- class ContextAwareCloudAssembly {
25
+ class ContextAwareCloudAssemblySource {
12
26
  source;
13
27
  props;
14
28
  canLookup;
@@ -33,7 +47,8 @@ class ContextAwareCloudAssembly {
33
47
  // again, until it doesn't complain anymore or we've stopped making progress).
34
48
  let previouslyMissingKeys;
35
49
  while (true) {
36
- const assembly = await this.source.produce();
50
+ const readableAsm = await this.source.produce();
51
+ const assembly = readableAsm.cloudAssembly;
37
52
  if (assembly.manifest.missing && assembly.manifest.missing.length > 0) {
38
53
  const missingKeysSet = missingContextKeys(assembly.manifest.missing);
39
54
  const missingKeys = Array.from(missingKeysSet);
@@ -57,15 +72,17 @@ class ContextAwareCloudAssembly {
57
72
  context: this.context.all,
58
73
  }));
59
74
  await this.context.save(this.contextFile);
60
- // Execute again
75
+ // Execute again. Unlock the assembly here so that the producer can acquire
76
+ // a read lock on the directory again.
77
+ await readableAsm._unlock();
61
78
  continue;
62
79
  }
63
80
  }
64
- return assembly;
81
+ return readableAsm;
65
82
  }
66
83
  }
67
84
  }
68
- exports.ContextAwareCloudAssembly = ContextAwareCloudAssembly;
85
+ exports.ContextAwareCloudAssemblySource = ContextAwareCloudAssemblySource;
69
86
  /**
70
87
  * Return all keys of missing context items
71
88
  */
@@ -86,4 +103,4 @@ function equalSets(a, b) {
86
103
  }
87
104
  return true;
88
105
  }
89
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGV4dC1hd2FyZS1zb3VyY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJjb250ZXh0LWF3YXJlLXNvdXJjZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFHQSw4Q0FBc0M7QUFDdEMseURBQXdEO0FBQ3hELHlEQUFvRjtBQUNwRix1REFBbUQ7QUFnQ25EOztHQUVHO0FBQ0gsTUFBYSx5QkFBeUI7SUFNUDtJQUErQztJQUxwRSxTQUFTLENBQVU7SUFDbkIsT0FBTyxDQUFVO0lBQ2pCLFdBQVcsQ0FBUztJQUNwQixRQUFRLENBQVc7SUFFM0IsWUFBNkIsTUFBNEIsRUFBbUIsS0FBcUM7UUFBcEYsV0FBTSxHQUFOLE1BQU0sQ0FBc0I7UUFBbUIsVUFBSyxHQUFMLEtBQUssQ0FBZ0M7UUFDL0csSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQztRQUN2QyxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUM7UUFDN0IsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUMsV0FBVyxJQUFJLGdDQUFlLENBQUMsQ0FBQyx5Q0FBeUM7UUFDbEcsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQztJQUMxQyxDQUFDO0lBRUQ7O09BRUc7SUFDSSxLQUFLLENBQUMsT0FBTztRQUNsQixzR0FBc0c7UUFDdEcsZ0ZBQWdGO1FBQ2hGLG1GQUFtRjtRQUNuRiw4RUFBOEU7UUFDOUUsSUFBSSxxQkFBOEMsQ0FBQztRQUNuRCxPQUFPLElBQUksRUFBRSxDQUFDO1lBQ1osTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBRTdDLElBQUksUUFBUSxDQUFDLFFBQVEsQ0FBQyxPQUFPLElBQUksUUFBUSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUN0RSxNQUFNLGNBQWMsR0FBRyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUNyRSxNQUFNLFdBQVcsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO2dCQUUvQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO29CQUNwQixNQUFNLElBQUksNEJBQVksQ0FDcEIsc0NBQXNDOzBCQUNwQyxzS0FBc0s7MEJBQ3RLLDBCQUEwQixXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDM0QsQ0FBQztnQkFFRCxJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUM7Z0JBQ3JCLElBQUkscUJBQXFCLElBQUksU0FBUyxDQUFDLGNBQWMsRUFBRSxxQkFBcUIsQ0FBQyxFQUFFLENBQUM7b0JBQzlFLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsWUFBRSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyx5RUFBeUUsRUFBRSxFQUFFLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQztvQkFDbEosU0FBUyxHQUFHLEtBQUssQ0FBQztnQkFDcEIsQ0FBQztnQkFFRCxxQkFBcUIsR0FBRyxjQUFjLENBQUM7Z0JBRXZDLElBQUksU0FBUyxFQUFFLENBQUM7b0JBQ2QsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxZQUFFLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLGtEQUFrRCxFQUFFLEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDO29CQUMzSCxNQUFNLGlDQUFnQixDQUFDLG9CQUFvQixDQUN6QyxRQUFRLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFDekIsSUFBSSxDQUFDLE9BQU8sRUFDWixJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQy9CLElBQUksQ0FBQyxRQUFRLENBQ2QsQ0FBQztvQkFFRixnQ0FBZ0M7b0JBQ2hDLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsWUFBRSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyw4QkFBOEIsSUFBSSxDQUFDLFdBQVcsS0FBSyxFQUFFO3dCQUN4RyxXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVc7d0JBQzdCLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUc7cUJBQzFCLENBQUMsQ0FBQyxDQUFDO29CQUNKLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO29CQUUxQyxnQkFBZ0I7b0JBQ2hCLFNBQVM7Z0JBQ1gsQ0FBQztZQUNILENBQUM7WUFFRCxPQUFPLFFBQVEsQ0FBQztRQUNsQixDQUFDO0lBQ0gsQ0FBQztDQUNGO0FBcEVELDhEQW9FQztBQUVEOztHQUVHO0FBQ0gsU0FBUyxrQkFBa0IsQ0FBQyxPQUEwQjtJQUNwRCxPQUFPLElBQUksR0FBRyxDQUFDLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ2xELENBQUM7QUFFRDs7R0FFRztBQUNILFNBQVMsU0FBUyxDQUFJLENBQVMsRUFBRSxDQUFTO0lBQ3hDLElBQUksQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDdEIsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBQ0QsS0FBSyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUNsQixJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ2QsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO0lBQ0gsQ0FBQztJQUNELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgTWlzc2luZ0NvbnRleHQgfSBmcm9tICdAYXdzLWNkay9jbG91ZC1hc3NlbWJseS1zY2hlbWEnO1xuaW1wb3J0IHR5cGUgKiBhcyBjeGFwaSBmcm9tICdAYXdzLWNkay9jeC1hcGknO1xuaW1wb3J0IHR5cGUgeyBUb29sa2l0U2VydmljZXMgfSBmcm9tICcuLi8uLi8uLi90b29sa2l0L3ByaXZhdGUnO1xuaW1wb3J0IHsgSU8gfSBmcm9tICcuLi8uLi9pby9wcml2YXRlJztcbmltcG9ydCB7IGNvbnRleHRwcm92aWRlcnMgfSBmcm9tICcuLi8uLi9zaGFyZWQtcHJpdmF0ZSc7XG5pbXBvcnQgeyBQUk9KRUNUX0NPTlRFWFQsIHR5cGUgQ29udGV4dCwgdHlwZSBJb0hlbHBlciB9IGZyb20gJy4uLy4uL3NoYXJlZC1wcml2YXRlJztcbmltcG9ydCB7IFRvb2xraXRFcnJvciB9IGZyb20gJy4uLy4uL3NoYXJlZC1wdWJsaWMnO1xuaW1wb3J0IHR5cGUgeyBJQ2xvdWRBc3NlbWJseVNvdXJjZSB9IGZyb20gJy4uL3R5cGVzJztcblxuZXhwb3J0IGludGVyZmFjZSBDb250ZXh0QXdhcmVDbG91ZEFzc2VtYmx5UHJvcHMge1xuICAvKipcbiAgICogQVdTIG9iamVjdCAodXNlZCBieSBjb250ZXh0cHJvdmlkZXIpXG4gICAqIEBkZXByZWNhdGVkIGNvbnRleHQgc2hvdWxkIGJlIG1vdmVkIHRvIHRoZSB0b29sa2l0IGl0c2VsZlxuICAgKi9cbiAgcmVhZG9ubHkgc2VydmljZXM6IFRvb2xraXRTZXJ2aWNlcztcblxuICAvKipcbiAgICogQXBwbGljYXRpb24gY29udGV4dFxuICAgKi9cbiAgcmVhZG9ubHkgY29udGV4dDogQ29udGV4dDtcblxuICAvKipcbiAgICogVGhlIGZpbGUgdXNlZCB0byBzdG9yZSBhcHBsaWNhdGlvbiBjb250ZXh0IGluIChyZWxhdGl2ZSB0byBjd2QpLlxuICAgKlxuICAgKiBAZGVmYXVsdCBcImNkay5jb250ZXh0Lmpzb25cIlxuICAgKi9cbiAgcmVhZG9ubHkgY29udGV4dEZpbGU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEVuYWJsZSBjb250ZXh0IGxvb2t1cHMuXG4gICAqXG4gICAqIFByb2R1Y2luZyBhIGBjeGFwaS5DbG91ZEFzc2VtYmx5YCB3aWxsIGZhaWwgaWYgdGhpcyBpcyBkaXNhYmxlZCBhbmQgY29udGV4dCBsb29rdXBzIG5lZWQgdG8gYmUgcGVyZm9ybWVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICByZWFkb25seSBsb29rdXBzPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBSZXByZXNlbnQgdGhlIENsb3VkIEV4ZWN1dGFibGUgYW5kIHRoZSBzeW50aGVzaXMgd2UgY2FuIGRvIG9uIGl0XG4gKi9cbmV4cG9ydCBjbGFzcyBDb250ZXh0QXdhcmVDbG91ZEFzc2VtYmx5IGltcGxlbWVudHMgSUNsb3VkQXNzZW1ibHlTb3VyY2Uge1xuICBwcml2YXRlIGNhbkxvb2t1cDogYm9vbGVhbjtcbiAgcHJpdmF0ZSBjb250ZXh0OiBDb250ZXh0O1xuICBwcml2YXRlIGNvbnRleHRGaWxlOiBzdHJpbmc7XG4gIHByaXZhdGUgaW9IZWxwZXI6IElvSGVscGVyO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgc291cmNlOiBJQ2xvdWRBc3NlbWJseVNvdXJjZSwgcHJpdmF0ZSByZWFkb25seSBwcm9wczogQ29udGV4dEF3YXJlQ2xvdWRBc3NlbWJseVByb3BzKSB7XG4gICAgdGhpcy5jYW5Mb29rdXAgPSBwcm9wcy5sb29rdXBzID8/IHRydWU7XG4gICAgdGhpcy5jb250ZXh0ID0gcHJvcHMuY29udGV4dDtcbiAgICB0aGlzLmNvbnRleHRGaWxlID0gcHJvcHMuY29udGV4dEZpbGUgPz8gUFJPSkVDVF9DT05URVhUOyAvLyBAdG9kbyBuZXcgZmVhdHVyZSBub3QgbmVlZGVkIHJpZ2h0IG5vd1xuICAgIHRoaXMuaW9IZWxwZXIgPSBwcm9wcy5zZXJ2aWNlcy5pb0hlbHBlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9kdWNlIGEgQ2xvdWQgQXNzZW1ibHksIGkuZS4gYSBzZXQgb2Ygc3RhY2tzXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcHJvZHVjZSgpOiBQcm9taXNlPGN4YXBpLkNsb3VkQXNzZW1ibHk+IHtcbiAgICAvLyBXZSBtYXkgbmVlZCB0byBydW4gdGhlIGNsb3VkIGFzc2VtYmx5IHNvdXJjZSBtdWx0aXBsZSB0aW1lcyBpbiBvcmRlciB0byBzYXRpc2Z5IGFsbCBtaXNzaW5nIGNvbnRleHRcbiAgICAvLyAoV2hlbiB0aGUgc291cmNlIHByb2R1Y2VyIHJ1bnMsIGl0IHdpbGwgdGVsbCB1cyBhYm91dCBjb250ZXh0IGl0IHdhbnRzIHRvIHVzZVxuICAgIC8vIGJ1dCBpdCBtaXNzaW5nLiBXZSdsbCB0aGVuIGxvb2sgdXAgdGhlIGNvbnRleHQgYW5kIHJ1biB0aGUgZXhlY3V0YWJsZSBhZ2FpbiwgYW5kXG4gICAgLy8gYWdhaW4sIHVudGlsIGl0IGRvZXNuJ3QgY29tcGxhaW4gYW55bW9yZSBvciB3ZSd2ZSBzdG9wcGVkIG1ha2luZyBwcm9ncmVzcykuXG4gICAgbGV0IHByZXZpb3VzbHlNaXNzaW5nS2V5czogU2V0PHN0cmluZz4gfCB1bmRlZmluZWQ7XG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGNvbnN0IGFzc2VtYmx5ID0gYXdhaXQgdGhpcy5zb3VyY2UucHJvZHVjZSgpO1xuXG4gICAgICBpZiAoYXNzZW1ibHkubWFuaWZlc3QubWlzc2luZyAmJiBhc3NlbWJseS5tYW5pZmVzdC5taXNzaW5nLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgbWlzc2luZ0tleXNTZXQgPSBtaXNzaW5nQ29udGV4dEtleXMoYXNzZW1ibHkubWFuaWZlc3QubWlzc2luZyk7XG4gICAgICAgIGNvbnN0IG1pc3NpbmdLZXlzID0gQXJyYXkuZnJvbShtaXNzaW5nS2V5c1NldCk7XG5cbiAgICAgICAgaWYgKCF0aGlzLmNhbkxvb2t1cCkge1xuICAgICAgICAgIHRocm93IG5ldyBUb29sa2l0RXJyb3IoXG4gICAgICAgICAgICAnQ29udGV4dCBsb29rdXBzIGhhdmUgYmVlbiBkaXNhYmxlZC4gJ1xuICAgICAgICAgICAgKyAnTWFrZSBzdXJlIGFsbCBuZWNlc3NhcnkgY29udGV4dCBpcyBhbHJlYWR5IGluIFxcJ2Nkay5jb250ZXh0Lmpzb25cXCcgYnkgcnVubmluZyBcXCdjZGsgc3ludGhcXCcgb24gYSBtYWNoaW5lIHdpdGggc3VmZmljaWVudCBBV1MgY3JlZGVudGlhbHMgYW5kIGNvbW1pdHRpbmcgdGhlIHJlc3VsdC4gJ1xuICAgICAgICAgICAgKyBgTWlzc2luZyBjb250ZXh0IGtleXM6ICcke21pc3NpbmdLZXlzLmpvaW4oJywgJyl9J2ApO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHRyeUxvb2t1cCA9IHRydWU7XG4gICAgICAgIGlmIChwcmV2aW91c2x5TWlzc2luZ0tleXMgJiYgZXF1YWxTZXRzKG1pc3NpbmdLZXlzU2V0LCBwcmV2aW91c2x5TWlzc2luZ0tleXMpKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5pb0hlbHBlci5ub3RpZnkoSU8uQ0RLX0FTU0VNQkxZX0kwMjQwLm1zZygnTm90IG1ha2luZyBwcm9ncmVzcyB0cnlpbmcgdG8gcmVzb2x2ZSBlbnZpcm9ubWVudGFsIGNvbnRleHQuIEdpdmluZyB1cC4nLCB7IG1pc3NpbmdLZXlzIH0pKTtcbiAgICAgICAgICB0cnlMb29rdXAgPSBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHByZXZpb3VzbHlNaXNzaW5nS2V5cyA9IG1pc3NpbmdLZXlzU2V0O1xuXG4gICAgICAgIGlmICh0cnlMb29rdXApIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLmlvSGVscGVyLm5vdGlmeShJTy5DREtfQVNTRU1CTFlfSTAyNDEubXNnKCdTb21lIGNvbnRleHQgaW5mb3JtYXRpb24gaXMgbWlzc2luZy4gRmV0Y2hpbmcuLi4nLCB7IG1pc3NpbmdLZXlzIH0pKTtcbiAgICAgICAgICBhd2FpdCBjb250ZXh0cHJvdmlkZXJzLnByb3ZpZGVDb250ZXh0VmFsdWVzKFxuICAgICAgICAgICAgYXNzZW1ibHkubWFuaWZlc3QubWlzc2luZyxcbiAgICAgICAgICAgIHRoaXMuY29udGV4dCxcbiAgICAgICAgICAgIHRoaXMucHJvcHMuc2VydmljZXMuc2RrUHJvdmlkZXIsXG4gICAgICAgICAgICB0aGlzLmlvSGVscGVyLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICAvLyBDYWNoZSB0aGUgbmV3IGNvbnRleHQgdG8gZGlza1xuICAgICAgICAgIGF3YWl0IHRoaXMuaW9IZWxwZXIubm90aWZ5KElPLkNES19BU1NFTUJMWV9JMDA0Mi5tc2coYFdyaXRpbmcgdXBkYXRlZCBjb250ZXh0IHRvICR7dGhpcy5jb250ZXh0RmlsZX0uLi5gLCB7XG4gICAgICAgICAgICBjb250ZXh0RmlsZTogdGhpcy5jb250ZXh0RmlsZSxcbiAgICAgICAgICAgIGNvbnRleHQ6IHRoaXMuY29udGV4dC5hbGwsXG4gICAgICAgICAgfSkpO1xuICAgICAgICAgIGF3YWl0IHRoaXMuY29udGV4dC5zYXZlKHRoaXMuY29udGV4dEZpbGUpO1xuXG4gICAgICAgICAgLy8gRXhlY3V0ZSBhZ2FpblxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhc3NlbWJseTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBSZXR1cm4gYWxsIGtleXMgb2YgbWlzc2luZyBjb250ZXh0IGl0ZW1zXG4gKi9cbmZ1bmN0aW9uIG1pc3NpbmdDb250ZXh0S2V5cyhtaXNzaW5nPzogTWlzc2luZ0NvbnRleHRbXSk6IFNldDxzdHJpbmc+IHtcbiAgcmV0dXJuIG5ldyBTZXQoKG1pc3NpbmcgfHwgW10pLm1hcChtID0+IG0ua2V5KSk7XG59XG5cbi8qKlxuICogQXJlIHR3byBzZXRzIGVxdWFsIHRvIGVhY2ggb3RoZXJcbiAqL1xuZnVuY3Rpb24gZXF1YWxTZXRzPEE+KGE6IFNldDxBPiwgYjogU2V0PEE+KSB7XG4gIGlmIChhLnNpemUgIT09IGIuc2l6ZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBmb3IgKGNvbnN0IHggb2YgYSkge1xuICAgIGlmICghYi5oYXMoeCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG4iXX0=
106
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGV4dC1hd2FyZS1zb3VyY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJjb250ZXh0LWF3YXJlLXNvdXJjZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFFQSw4Q0FBc0M7QUFDdEMseURBQXdEO0FBQ3hELHlEQUFvRjtBQUNwRix1REFBbUQ7QUFnQ25EOzs7Ozs7Ozs7Ozs7Ozs7O0dBZ0JHO0FBQ0gsTUFBYSwrQkFBK0I7SUFNYjtJQUErQztJQUxwRSxTQUFTLENBQVU7SUFDbkIsT0FBTyxDQUFVO0lBQ2pCLFdBQVcsQ0FBUztJQUNwQixRQUFRLENBQVc7SUFFM0IsWUFBNkIsTUFBNEIsRUFBbUIsS0FBcUM7UUFBcEYsV0FBTSxHQUFOLE1BQU0sQ0FBc0I7UUFBbUIsVUFBSyxHQUFMLEtBQUssQ0FBZ0M7UUFDL0csSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQztRQUN2QyxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUM7UUFDN0IsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUMsV0FBVyxJQUFJLGdDQUFlLENBQUMsQ0FBQyx5Q0FBeUM7UUFDbEcsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQztJQUMxQyxDQUFDO0lBRUQ7O09BRUc7SUFDSSxLQUFLLENBQUMsT0FBTztRQUNsQixzR0FBc0c7UUFDdEcsZ0ZBQWdGO1FBQ2hGLG1GQUFtRjtRQUNuRiw4RUFBOEU7UUFDOUUsSUFBSSxxQkFBOEMsQ0FBQztRQUNuRCxPQUFPLElBQUksRUFBRSxDQUFDO1lBQ1osTUFBTSxXQUFXLEdBQUcsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBRWhELE1BQU0sUUFBUSxHQUFHLFdBQVcsQ0FBQyxhQUFhLENBQUM7WUFDM0MsSUFBSSxRQUFRLENBQUMsUUFBUSxDQUFDLE9BQU8sSUFBSSxRQUFRLENB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LENBQUM7QUFDZCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBNaXNzaW5nQ29udGV4dCB9IGZyb20gJ0Bhd3MtY2RrL2Nsb3VkLWFzc2VtYmx5LXNjaGVtYSc7XG5pbXBvcnQgdHlwZSB7IFRvb2xraXRTZXJ2aWNlcyB9IGZyb20gJy4uLy4uLy4uL3Rvb2xraXQvcHJpdmF0ZSc7XG5pbXBvcnQgeyBJTyB9IGZyb20gJy4uLy4uL2lvL3ByaXZhdGUnO1xuaW1wb3J0IHsgY29udGV4dHByb3ZpZGVycyB9IGZyb20gJy4uLy4uL3NoYXJlZC1wcml2YXRlJztcbmltcG9ydCB7IFBST0pFQ1RfQ09OVEVYVCwgdHlwZSBDb250ZXh0LCB0eXBlIElvSGVscGVyIH0gZnJvbSAnLi4vLi4vc2hhcmVkLXByaXZhdGUnO1xuaW1wb3J0IHsgVG9vbGtpdEVycm9yIH0gZnJvbSAnLi4vLi4vc2hhcmVkLXB1YmxpYyc7XG5pbXBvcnQgdHlwZSB7IElDbG91ZEFzc2VtYmx5U291cmNlLCBJUmVhZGFibGVDbG91ZEFzc2VtYmx5IH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIENvbnRleHRBd2FyZUNsb3VkQXNzZW1ibHlQcm9wcyB7XG4gIC8qKlxuICAgKiBBV1Mgb2JqZWN0ICh1c2VkIGJ5IGNvbnRleHRwcm92aWRlcilcbiAgICogQGRlcHJlY2F0ZWQgY29udGV4dCBzaG91bGQgYmUgbW92ZWQgdG8gdGhlIHRvb2xraXQgaXRzZWxmXG4gICAqL1xuICByZWFkb25seSBzZXJ2aWNlczogVG9vbGtpdFNlcnZpY2VzO1xuXG4gIC8qKlxuICAgKiBBcHBsaWNhdGlvbiBjb250ZXh0XG4gICAqL1xuICByZWFkb25seSBjb250ZXh0OiBDb250ZXh0O1xuXG4gIC8qKlxuICAgKiBUaGUgZmlsZSB1c2VkIHRvIHN0b3JlIGFwcGxpY2F0aW9uIGNvbnRleHQgaW4gKHJlbGF0aXZlIHRvIGN3ZCkuXG4gICAqXG4gICAqIEBkZWZhdWx0IFwiY2RrLmNvbnRleHQuanNvblwiXG4gICAqL1xuICByZWFkb25seSBjb250ZXh0RmlsZT86IHN0cmluZztcblxuICAvKipcbiAgICogRW5hYmxlIGNvbnRleHQgbG9va3Vwcy5cbiAgICpcbiAgICogUHJvZHVjaW5nIGEgYGN4YXBpLkNsb3VkQXNzZW1ibHlgIHdpbGwgZmFpbCBpZiB0aGlzIGlzIGRpc2FibGVkIGFuZCBjb250ZXh0IGxvb2t1cHMgbmVlZCB0byBiZSBwZXJmb3JtZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IGxvb2t1cHM/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIEEgQ2xvdWRBc3NlbWJseVNvdXJjZSB0aGF0IHdyYXBzIGFub3RoZXIgQ2xvdWRBc3NlbWJseVNvdXJjZSBhbmQgcnVucyBhIGxvb2t1cCBsb29wIG9uIGl0XG4gKlxuICogVGhpcyBtZWFucyB0aGF0IGlmIHRoZSB1bmRlcmx5aW5nIENsb3VkQXNzZW1ibHlTb3VyY2UgcHJvZHVjZXMgYSBtYW5pZmVzdFxuICogd2l0aCBwcm92aWRlciBxdWVyaWVzIGluIGl0LCB0aGUgYENvbnRleHRBd2FyZUNsb3VkQXNzZW1ibHlTb3VyY2VgIHdpbGxcbiAqIHBlcmZvcm0gdGhlIG5lY2Vzc2FyeSBjb250ZXh0IGxvb2t1cHMgYW5kIGludm9rZSB0aGUgdW5kZXJseWluZ1xuICogYENsb3VkQXNzZW1ibHlTb3VyY2VgIGFnYWluIHdpdGggdGhldyBtaXNzaW5nIGNvbnRleHQgaW5mb3JtYXRpb24uXG4gKlxuICogVGhpcyBpcyBvbmx5IHVzZWZ1bCBpZiB0aGUgdW5kZXJseWluZyBgQ2xvdWRBc3NlbWJseVNvdXJjZWAgY2FuIHJlc3BvbmQgdG9cbiAqIHRoaXMgbmV3IGNvbnRleHQgaW5mb3JtYXRpb24gKGl0IG11c3QgYmUgYSBDREsgYXBwIHNvdXJjZSk7IGlmIGl0IGlzIGp1c3QgYVxuICogc3RhdGljIGRpcmVjdG9yeSwgdGhlbiB0aGUgY29udGVudHMgb2YgdGhlIGFzc2VtYmx5IHdvbid0IGNoYW5nZSBpbiByZXNwb25zZVxuICogdG8gY29udGV4dC5cbiAqXG4gKiBUaGUgY29udGV4dCBpcyBwYXNzZWQgYmV0d2VlbiBgQ29udGV4dEF3YXJlQ2xvdWRBc3NlbWJseVNvdXJjZWAgYW5kIHRoZSB3cmFwcGVkXG4gKiBjbG91ZCBhc3NlbWJseSBzb3VyY2UgdmlhIGEgY29udGV4IGZpbGUgb24gZGlzaywgc28gdGhlIHdyYXBwZWQgYXNzZW1ibHkgc291cmNlXG4gKiBzaG91bGQgcmUtcmVhZCB0aGUgY29udGV4dCBmaWxlIG9uIGV2ZXJ5IGludm9jYXRpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBDb250ZXh0QXdhcmVDbG91ZEFzc2VtYmx5U291cmNlIGltcGxlbWVudHMgSUNsb3VkQXNzZW1ibHlTb3VyY2Uge1xuICBwcml2YXRlIGNhbkxvb2t1cDogYm9vbGVhbjtcbiAgcHJpdmF0ZSBjb250ZXh0OiBDb250ZXh0O1xuICBwcml2YXRlIGNvbnRleHRGaWxlOiBzdHJpbmc7XG4gIHByaXZhdGUgaW9IZWxwZXI6IElvSGVscGVyO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgc291cmNlOiBJQ2xvdWRBc3NlbWJseVNvdXJjZSwgcHJpdmF0ZSByZWFkb25seSBwcm9wczogQ29udGV4dEF3YXJlQ2xvdWRBc3NlbWJseVByb3BzKSB7XG4gICAgdGhpcy5jYW5Mb29rdXAgPSBwcm9wcy5sb29rdXBzID8/IHRydWU7XG4gICAgdGhpcy5jb250ZXh0ID0gcHJvcHMuY29udGV4dDtcbiAgICB0aGlzLmNvbnRleHRGaWxlID0gcHJvcHMuY29udGV4dEZpbGUgPz8gUFJPSkVDVF9DT05URVhUOyAvLyBAdG9kbyBuZXcgZmVhdHVyZSBub3QgbmVlZGVkIHJpZ2h0IG5vd1xuICAgIHRoaXMuaW9IZWxwZXIgPSBwcm9wcy5zZXJ2aWNlcy5pb0hlbHBlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9kdWNlIGEgQ2xvdWQgQXNzZW1ibHksIGkuZS4gYSBzZXQgb2Ygc3RhY2tzXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcHJvZHVjZSgpOiBQcm9taXNlPElSZWFkYWJsZUNsb3VkQXNzZW1ibHk+IHtcbiAgICAvLyBXZSBtYXkgbmVlZCB0byBydW4gdGhlIGNsb3VkIGFzc2VtYmx5IHNvdXJjZSBtdWx0aXBsZSB0aW1lcyBpbiBvcmRlciB0byBzYXRpc2Z5IGFsbCBtaXNzaW5nIGNvbnRleHRcbiAgICAvLyAoV2hlbiB0aGUgc291cmNlIHByb2R1Y2VyIHJ1bnMsIGl0IHdpbGwgdGVsbCB1cyBhYm91dCBjb250ZXh0IGl0IHdhbnRzIHRvIHVzZVxuICAgIC8vIGJ1dCBpdCBtaXNzaW5nLiBXZSdsbCB0aGVuIGxvb2sgdXAgdGhlIGNvbnRleHQgYW5kIHJ1biB0aGUgZXhlY3V0YWJsZSBhZ2FpbiwgYW5kXG4gICAgLy8gYWdhaW4sIHVudGlsIGl0IGRvZXNuJ3QgY29tcGxhaW4gYW55bW9yZSBvciB3ZSd2ZSBzdG9wcGVkIG1ha2luZyBwcm9ncmVzcykuXG4gICAgbGV0IHByZXZpb3VzbHlNaXNzaW5nS2V5czogU2V0PHN0cmluZz4gfCB1bmRlZmluZWQ7XG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGNvbnN0IHJlYWRhYmxlQXNtID0gYXdhaXQgdGhpcy5zb3VyY2UucHJvZHVjZSgpO1xuXG4gICAgICBjb25zdCBhc3NlbWJseSA9IHJlYWRhYmxlQXNtLmNsb3VkQXNzZW1ibHk7XG4gICAgICBpZiAoYXNzZW1ibHkubWFuaWZlc3QubWlzc2luZyAmJiBhc3NlbWJseS5tYW5pZmVzdC5taXNzaW5nLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgbWlzc2luZ0tleXNTZXQgPSBtaXNzaW5nQ29udGV4dEtleXMoYXNzZW1ibHkubWFuaWZlc3QubWlzc2luZyk7XG4gICAgICAgIGNvbnN0IG1pc3NpbmdLZXlzID0gQXJyYXkuZnJvbShtaXNzaW5nS2V5c1NldCk7XG5cbiAgICAgICAgaWYgKCF0aGlzLmNhbkxvb2t1cCkge1xuICAgICAgICAgIHRocm93IG5ldyBUb29sa2l0RXJyb3IoXG4gICAgICAgICAgICAnQ29udGV4dCBsb29rdXBzIGhhdmUgYmVlbiBkaXNhYmxlZC4gJ1xuICAgICAgICAgICAgKyAnTWFrZSBzdXJlIGFsbCBuZWNlc3NhcnkgY29udGV4dCBpcyBhbHJlYWR5IGluIFxcJ2Nkay5jb250ZXh0Lmpzb25cXCcgYnkgcnVubmluZyBcXCdjZGsgc3ludGhcXCcgb24gYSBtYWNoaW5lIHdpdGggc3VmZmljaWVudCBBV1MgY3JlZGVudGlhbHMgYW5kIGNvbW1pdHRpbmcgdGhlIHJlc3VsdC4gJ1xuICAgICAgICAgICAgKyBgTWlzc2luZyBjb250ZXh0IGtleXM6ICcke21pc3NpbmdLZXlzLmpvaW4oJywgJyl9J2ApO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHRyeUxvb2t1cCA9IHRydWU7XG4gICAgICAgIGlmIChwcmV2aW91c2x5TWlzc2luZ0tleXMgJiYgZXF1YWxTZXRzKG1pc3NpbmdLZXlzU2V0LCBwcmV2aW91c2x5TWlzc2luZ0tleXMpKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5pb0hlbHBlci5ub3RpZnkoSU8uQ0RLX0FTU0VNQkxZX0kwMjQwLm1zZygnTm90IG1ha2luZyBwcm9ncmVzcyB0cnlpbmcgdG8gcmVzb2x2ZSBlbnZpcm9ubWVudGFsIGNvbnRleHQuIEdpdmluZyB1cC4nLCB7IG1pc3NpbmdLZXlzIH0pKTtcbiAgICAgICAgICB0cnlMb29rdXAgPSBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHByZXZpb3VzbHlNaXNzaW5nS2V5cyA9IG1pc3NpbmdLZXlzU2V0O1xuXG4gICAgICAgIGlmICh0cnlMb29rdXApIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLmlvSGVscGVyLm5vdGlmeShJTy5DREtfQVNTRU1CTFlfSTAyNDEubXNnKCdTb21lIGNvbnRleHQgaW5mb3JtYXRpb24gaXMgbWlzc2luZy4gRmV0Y2hpbmcuLi4nLCB7IG1pc3NpbmdLZXlzIH0pKTtcbiAgICAgICAgICBhd2FpdCBjb250ZXh0cHJvdmlkZXJzLnByb3ZpZGVDb250ZXh0VmFsdWVzKFxuICAgICAgICAgICAgYXNzZW1ibHkubWFuaWZlc3QubWlzc2luZyxcbiAgICAgICAgICAgIHRoaXMuY29udGV4dCxcbiAgICAgICAgICAgIHRoaXMucHJvcHMuc2VydmljZXMuc2RrUHJvdmlkZXIsXG4gICAgICAgICAgICB0aGlzLmlvSGVscGVyLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICAvLyBDYWNoZSB0aGUgbmV3IGNvbnRleHQgdG8gZGlza1xuICAgICAgICAgIGF3YWl0IHRoaXMuaW9IZWxwZXIubm90aWZ5KElPLkNES19BU1NFTUJMWV9JMDA0Mi5tc2coYFdyaXRpbmcgdXBkYXRlZCBjb250ZXh0IHRvICR7dGhpcy5jb250ZXh0RmlsZX0uLi5gLCB7XG4gICAgICAgICAgICBjb250ZXh0RmlsZTogdGhpcy5jb250ZXh0RmlsZSxcbiAgICAgICAgICAgIGNvbnRleHQ6IHRoaXMuY29udGV4dC5hbGwsXG4gICAgICAgICAgfSkpO1xuICAgICAgICAgIGF3YWl0IHRoaXMuY29udGV4dC5zYXZlKHRoaXMuY29udGV4dEZpbGUpO1xuXG4gICAgICAgICAgLy8gRXhlY3V0ZSBhZ2Fpbi4gVW5sb2NrIHRoZSBhc3NlbWJseSBoZXJlIHNvIHRoYXQgdGhlIHByb2R1Y2VyIGNhbiBhY3F1aXJlXG4gICAgICAgICAgLy8gYSByZWFkIGxvY2sgb24gdGhlIGRpcmVjdG9yeSBhZ2Fpbi5cbiAgICAgICAgICBhd2FpdCByZWFkYWJsZUFzbS5fdW5sb2NrKCk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlYWRhYmxlQXNtO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFJldHVybiBhbGwga2V5cyBvZiBtaXNzaW5nIGNvbnRleHQgaXRlbXNcbiAqL1xuZnVuY3Rpb24gbWlzc2luZ0NvbnRleHRLZXlzKG1pc3Npbmc/OiBNaXNzaW5nQ29udGV4dFtdKTogU2V0PHN0cmluZz4ge1xuICByZXR1cm4gbmV3IFNldCgobWlzc2luZyB8fCBbXSkubWFwKG0gPT4gbS5rZXkpKTtcbn1cblxuLyoqXG4gKiBBcmUgdHdvIHNldHMgZXF1YWwgdG8gZWFjaCBvdGhlclxuICovXG5mdW5jdGlvbiBlcXVhbFNldHM8QT4oYTogU2V0PEE+LCBiOiBTZXQ8QT4pIHtcbiAgaWYgKGEuc2l6ZSAhPT0gYi5zaXplKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGZvciAoY29uc3QgeCBvZiBhKSB7XG4gICAgaWYgKCFiLmhhcyh4KSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cbiJdfQ==
@@ -1,6 +1,4 @@
1
1
  export * from './context-aware-source';
2
- export * from './cached-source';
3
- export * from './identity-source';
4
2
  export * from './stack-assembly';
5
3
  export * from './exec';
6
4
  export * from './prepare-source';
@@ -15,11 +15,9 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./context-aware-source"), exports);
18
- __exportStar(require("./cached-source"), exports);
19
- __exportStar(require("./identity-source"), exports);
20
18
  __exportStar(require("./stack-assembly"), exports);
21
19
  __exportStar(require("./exec"), exports);
22
20
  __exportStar(require("./prepare-source"), exports);
23
21
  __exportStar(require("./source-builder"), exports);
24
22
  __exportStar(require("./stack-selectors"), exports);
25
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUEseURBQXVDO0FBQ3ZDLGtEQUFnQztBQUNoQyxvREFBa0M7QUFDbEMsbURBQWlDO0FBQ2pDLHlDQUF1QjtBQUN2QixtREFBaUM7QUFDakMsbURBQWlDO0FBQ2pDLG9EQUFrQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vY29udGV4dC1hd2FyZS1zb3VyY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9jYWNoZWQtc291cmNlJztcbmV4cG9ydCAqIGZyb20gJy4vaWRlbnRpdHktc291cmNlJztcbmV4cG9ydCAqIGZyb20gJy4vc3RhY2stYXNzZW1ibHknO1xuZXhwb3J0ICogZnJvbSAnLi9leGVjJztcbmV4cG9ydCAqIGZyb20gJy4vcHJlcGFyZS1zb3VyY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9zb3VyY2UtYnVpbGRlcic7XG5leHBvcnQgKiBmcm9tICcuL3N0YWNrLXNlbGVjdG9ycyc7XG4iXX0=
23
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUEseURBQXVDO0FBQ3ZDLG1EQUFpQztBQUNqQyx5Q0FBdUI7QUFDdkIsbURBQWlDO0FBQ2pDLG1EQUFpQztBQUNqQyxvREFBa0MiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2NvbnRleHQtYXdhcmUtc291cmNlJztcbmV4cG9ydCAqIGZyb20gJy4vc3RhY2stYXNzZW1ibHknO1xuZXhwb3J0ICogZnJvbSAnLi9leGVjJztcbmV4cG9ydCAqIGZyb20gJy4vcHJlcGFyZS1zb3VyY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9zb3VyY2UtYnVpbGRlcic7XG5leHBvcnQgKiBmcm9tICcuL3N0YWNrLXNlbGVjdG9ycyc7XG4iXX0=
@@ -1,5 +1,6 @@
1
+ import '../../../private/dispose-polyfill';
1
2
  import * as cxapi from '@aws-cdk/cx-api';
2
- import { type IoHelper } from '../../../api/shared-private';
3
+ import { type IReadLock, type IoHelper } from '../../../api/shared-private';
3
4
  import type { ToolkitServices } from '../../../toolkit/private';
4
5
  import type { AppSynthOptions, LoadAssemblyOptions } from '../source-builder';
5
6
  type Env = {
@@ -8,18 +9,47 @@ type Env = {
8
9
  type Context = {
9
10
  [key: string]: any;
10
11
  };
11
- export declare class ExecutionEnvironment {
12
+ export declare class ExecutionEnvironment implements AsyncDisposable {
13
+ readonly outdir: string;
14
+ readonly outDirIsTemporary: boolean;
15
+ /**
16
+ * Create an ExecutionEnvironment
17
+ *
18
+ * An ExecutionEnvironment holds a writer lock on the given directory which will
19
+ * be cleaned up when the object is disposed.
20
+ *
21
+ * A temporary directory will be created if none is supplied, which will be cleaned
22
+ * up when this object is disposed.
23
+ *
24
+ * If `markSuccessful()` is called, the writer lock is converted to a reader lock
25
+ * and temporary directories will not be cleaned up anymore.
26
+ */
27
+ static create(services: ToolkitServices, props?: {
28
+ outdir?: string;
29
+ }): Promise<ExecutionEnvironment>;
12
30
  private readonly ioHelper;
13
31
  private readonly sdkProvider;
14
32
  private readonly debugFn;
15
- private _outdir;
16
- constructor(services: ToolkitServices, props?: {
17
- outdir?: string;
18
- });
33
+ private lock;
34
+ private shouldClean;
35
+ private constructor();
36
+ [Symbol.asyncDispose](): Promise<void>;
19
37
  /**
20
- * Turn the given optional output directory into a fixed output directory
38
+ * Mark the execution as successful, which stops the writer lock from being released upon disposal
39
+ */
40
+ markSuccessful(): Promise<{
41
+ readLock: IReadLock;
42
+ }>;
43
+ /**
44
+ * Begin an execution in this environment
45
+ *
46
+ * This will acquire a write lock on the given environment. The write lock
47
+ * will be released automatically when the return object is disposed, unless it
48
+ * is converted to a reader lock.
21
49
  */
22
- get outdir(): string;
50
+ beginExecution(): Promise<{
51
+ writeToReadLock(): Promise<IReadLock>;
52
+ } & AsyncDisposable>;
23
53
  /**
24
54
  * Guess the executable from the command-line argument
25
55
  *
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.ExecutionEnvironment = void 0;
4
4
  exports.assemblyFromDirectory = assemblyFromDirectory;
5
+ require("../../../private/dispose-polyfill");
5
6
  const os = require("node:os");
6
7
  const path = require("node:path");
7
8
  const node_util_1 = require("node:util");
@@ -15,25 +16,84 @@ const util_1 = require("../../../private/util");
15
16
  const private_1 = require("../../io/private");
16
17
  const shared_public_1 = require("../../shared-public");
17
18
  class ExecutionEnvironment {
19
+ outdir;
20
+ outDirIsTemporary;
21
+ /**
22
+ * Create an ExecutionEnvironment
23
+ *
24
+ * An ExecutionEnvironment holds a writer lock on the given directory which will
25
+ * be cleaned up when the object is disposed.
26
+ *
27
+ * A temporary directory will be created if none is supplied, which will be cleaned
28
+ * up when this object is disposed.
29
+ *
30
+ * If `markSuccessful()` is called, the writer lock is converted to a reader lock
31
+ * and temporary directories will not be cleaned up anymore.
32
+ */
33
+ static async create(services, props = {}) {
34
+ let tempDir = false;
35
+ let dir = props.outdir;
36
+ if (!dir) {
37
+ tempDir = true;
38
+ dir = fs.mkdtempSync(path.join(fs.realpathSync(os.tmpdir()), 'cdk.out'));
39
+ }
40
+ const lock = await new shared_private_1.RWLock(dir).acquireWrite();
41
+ return new ExecutionEnvironment(services, dir, tempDir, lock);
42
+ }
18
43
  ioHelper;
19
44
  sdkProvider;
20
45
  debugFn;
21
- _outdir;
22
- constructor(services, props = {}) {
46
+ lock;
47
+ shouldClean;
48
+ constructor(services, outdir, outDirIsTemporary, lock) {
49
+ this.outdir = outdir;
50
+ this.outDirIsTemporary = outDirIsTemporary;
23
51
  this.ioHelper = services.ioHelper;
24
52
  this.sdkProvider = services.sdkProvider;
25
53
  this.debugFn = (msg) => this.ioHelper.notify(private_1.IO.DEFAULT_ASSEMBLY_DEBUG.msg(msg));
26
- this._outdir = props.outdir;
54
+ this.lock = lock;
55
+ this.shouldClean = outDirIsTemporary;
56
+ }
57
+ async [Symbol.asyncDispose]() {
58
+ await this.lock?.release();
59
+ if (this.shouldClean) {
60
+ await fs.rm(this.outdir, { recursive: true, force: true });
61
+ }
27
62
  }
28
63
  /**
29
- * Turn the given optional output directory into a fixed output directory
64
+ * Mark the execution as successful, which stops the writer lock from being released upon disposal
30
65
  */
31
- get outdir() {
32
- if (!this._outdir) {
33
- const outdir = fs.mkdtempSync(path.join(fs.realpathSync(os.tmpdir()), 'cdk.out'));
34
- this._outdir = outdir;
66
+ async markSuccessful() {
67
+ if (!this.lock) {
68
+ throw new TypeError('Cannot mark successful more than once');
35
69
  }
36
- return this._outdir;
70
+ const readLock = await this.lock.convertToReaderLock();
71
+ this.lock = undefined;
72
+ this.shouldClean = false;
73
+ return { readLock };
74
+ }
75
+ /**
76
+ * Begin an execution in this environment
77
+ *
78
+ * This will acquire a write lock on the given environment. The write lock
79
+ * will be released automatically when the return object is disposed, unless it
80
+ * is converted to a reader lock.
81
+ */
82
+ async beginExecution() {
83
+ const lock = await new shared_private_1.RWLock(this.outdir).acquireWrite();
84
+ let converted = false;
85
+ return {
86
+ async writeToReadLock() {
87
+ converted = true;
88
+ return lock.convertToReaderLock();
89
+ },
90
+ [Symbol.asyncDispose]: async () => {
91
+ // Release if not converted
92
+ if (!converted) {
93
+ await lock.release();
94
+ }
95
+ },
96
+ };
37
97
  }
38
98
  /**
39
99
  * Guess the executable from the command-line argument
@@ -46,7 +106,7 @@ class ExecutionEnvironment {
46
106
  * file type, so we'll assume the worst and take control.
47
107
  */
48
108
  guessExecutable(app) {
49
- return (0, shared_private_1.guessExecutable)(app, this.debugFn);
109
+ return (0, shared_private_2.guessExecutable)(app, this.debugFn);
50
110
  }
51
111
  /**
52
112
  * If we don't have region/account defined in context, we fall back to the default SDK behavior
@@ -60,7 +120,7 @@ class ExecutionEnvironment {
60
120
  */
61
121
  async defaultEnvVars() {
62
122
  const debugFn = (msg) => this.ioHelper.notify(private_1.IO.CDK_ASSEMBLY_I0010.msg(msg));
63
- const env = await (0, shared_private_1.prepareDefaultEnvironment)(this.sdkProvider, debugFn);
123
+ const env = await (0, shared_private_2.prepareDefaultEnvironment)(this.sdkProvider, debugFn);
64
124
  env[cxapi.OUTDIR_ENV] = this.outdir;
65
125
  await debugFn((0, node_util_1.format)('outdir:', this.outdir));
66
126
  // CLI version information
@@ -106,11 +166,11 @@ class ExecutionEnvironment {
106
166
  * Run code with context setup inside the environment
107
167
  */
108
168
  async withContext(inputContext, env, synthOpts = {}, block) {
109
- const context = await (0, shared_private_1.prepareContext)(synthOptsDefaults(synthOpts), inputContext, env, this.debugFn);
169
+ const context = await (0, shared_private_2.prepareContext)(synthOptsDefaults(synthOpts), inputContext, env, this.debugFn);
110
170
  let contextOverflowLocation = null;
111
171
  try {
112
172
  const envVariableSizeLimit = os.platform() === 'win32' ? 32760 : 131072;
113
- const [smallContext, overflow] = (0, util_1.splitBySize)(context, (0, shared_private_1.spaceAvailableForContext)(env, envVariableSizeLimit));
173
+ const [smallContext, overflow] = (0, util_1.splitBySize)(context, (0, shared_private_2.spaceAvailableForContext)(env, envVariableSizeLimit));
114
174
  // Store the safe part in the environment variable
115
175
  env[cxapi.CONTEXT_ENV] = JSON.stringify(smallContext);
116
176
  // If there was any overflow, write it to a temporary file
@@ -138,8 +198,8 @@ exports.ExecutionEnvironment = ExecutionEnvironment;
138
198
  */
139
199
  async function checkContextOverflowSupport(assembly, ioHelper) {
140
200
  const traceFn = (msg) => ioHelper.notify(private_1.IO.DEFAULT_ASSEMBLY_TRACE.msg(msg));
141
- const tree = await (0, shared_private_2.loadTree)(assembly, traceFn);
142
- const frameworkDoesNotSupportContextOverflow = (0, shared_private_2.some)(tree, node => {
201
+ const tree = await (0, shared_private_1.loadTree)(assembly, traceFn);
202
+ const frameworkDoesNotSupportContextOverflow = (0, shared_private_1.some)(tree, node => {
143
203
  const fqn = node.constructInfo?.fqn;
144
204
  const version = node.constructInfo?.version;
145
205
  return (fqn === 'aws-cdk-lib.App' && version != null && (0, semver_1.lte)(version, '2.38.0')) // v2
@@ -177,7 +237,7 @@ async function assemblyFromDirectory(assemblyDir, ioHelper, loadOptions = {}) {
177
237
  }
178
238
  }
179
239
  function synthOptsDefaults(synthOpts = {}) {
180
- return new shared_private_2.Settings({
240
+ return new shared_private_1.Settings({
181
241
  debug: false,
182
242
  pathMetadata: true,
183
243
  versionReporting: true,
@@ -186,4 +246,4 @@ function synthOptsDefaults(synthOpts = {}) {
186
246
  ...synthOpts,
187
247
  }, true);
188
248
  }
189
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJlcGFyZS1zb3VyY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJwcmVwYXJlLXNvdXJjZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFrTEEsc0RBb0JDO0FBdE1ELDhCQUE4QjtBQUM5QixrQ0FBa0M7QUFDbEMseUNBQW1DO0FBQ25DLDJEQUEyRDtBQUMzRCx5Q0FBeUM7QUFDekMsK0JBQStCO0FBQy9CLG1DQUE2QjtBQUM3QixnRUFBaUo7QUFDakosZ0VBQXdHO0FBQ3hHLGdEQUFtRTtBQUVuRSw4Q0FBc0M7QUFDdEMsdURBQW1EO0FBTW5ELE1BQWEsb0JBQW9CO0lBQ2QsUUFBUSxDQUFXO0lBQ25CLFdBQVcsQ0FBYztJQUN6QixPQUFPLENBQWlDO0lBQ2pELE9BQU8sQ0FBcUI7SUFFcEMsWUFBbUIsUUFBeUIsRUFBRSxRQUE2QixFQUFFO1FBQzNFLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQztRQUNsQyxJQUFJLENBQUMsV0FBVyxHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUM7UUFDeEMsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLEdBQVcsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsWUFBRSxDQUFDLHNCQUFzQixDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3pGLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQztJQUM5QixDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFXLE1BQU07UUFDZixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2xCLE1BQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFDbEYsSUFBSSxDQUFDLE9BQU8s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QUNoRCx1QkFBdUI7WUFDdkIsUUFBUSxFQUFFLEtBQUs7U0FDaEIsQ0FBQyxDQUFDO1FBQ0gsTUFBTSwyQkFBMkIsQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDdEQsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQztJQUFDLE9BQU8sR0FBUSxFQUFFLENBQUM7UUFDbEIsSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDO1lBQ3BELHlDQUF5QztZQUN6QyxtQ0FBbUM7WUFDbkMsTUFBTSxPQUFPLEdBQUcsaUlBQWlJLENBQUM7WUFDbEosTUFBTSxRQUFRLENBQUMsTUFBTSxDQUFDLFlBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUMxRSxNQUFNLElBQUksNEJBQVksQ0FBQyxHQUFHLE9BQU8sTUFBTSxHQUFHLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUN4RCxDQUFDO1FBQ0QsTUFBTSxHQUFHLENBQUM7SUFDWixDQUFDO0FBQ0gsQ0FBQztBQUVELFNBQVMsaUJBQWlCLENBQUMsWUFBNkIsRUFBRTtJQUN4RCxPQUFPLElBQUkseUJBQVEsQ0FBQztRQUNsQixLQUFLLEVBQUUsS0FBSztRQUNaLFlBQVksRUFBRSxJQUFJO1FBQ2xCLGdCQUFnQixFQUFFLElBQUk7UUFDdEIsYUFBYSxFQUFFLElBQUk7UUFDbkIsWUFBWSxFQUFFLElBQUk7UUFDbEIsR0FBRyxTQUFTO0tBQ2IsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUNYLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBvcyBmcm9tICdub2RlOm9zJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7IGZvcm1hdCB9IGZyb20gJ25vZGU6dXRpbCc7XG5pbXBvcnQgKiBhcyBjeHNjaGVtYSBmcm9tICdAYXdzLWNkay9jbG91ZC1hc3NlbWJseS1zY2hlbWEnO1xuaW1wb3J0ICogYXMgY3hhcGkgZnJvbSAnQGF3cy1jZGsvY3gtYXBpJztcbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzLWV4dHJhJztcbmltcG9ydCB7IGx0ZSB9IGZyb20gJ3NlbXZlcic7XG5pbXBvcnQgeyBwcmVwYXJlRGVmYXVsdEVudmlyb25tZW50IGFzIG9sZFByZXBhcmUsIHByZXBhcmVDb250ZXh0LCBzcGFjZUF2YWlsYWJsZUZvckNvbnRleHQsIGd1ZXNzRXhlY3V0YWJsZSB9IGZyb20gJy4uLy4uLy4uL2FwaS9zaGFyZWQtcHJpdmF0ZSc7XG5pbXBvcnQgeyB0eXBlIFNka1Byb3ZpZGVyLCB0eXBlIElvSGVscGVyLCBsb2FkVHJlZSwgc29tZSwgU2V0dGluZ3MgfSBmcm9tICcuLi8uLi8uLi9hcGkvc2hhcmVkLXByaXZhdGUnO1xuaW1wb3J0IHsgc3BsaXRCeVNpemUsIHZlcnNpb25OdW1iZXIgfSBmcm9tICcuLi8uLi8uLi9wcml2YXRlL3V0aWwnO1xuaW1wb3J0IHR5cGUgeyBUb29sa2l0U2VydmljZXMgfSBmcm9tICcuLi8uLi8uLi90b29sa2l0L3ByaXZhdGUnO1xuaW1wb3J0IHsgSU8gfSBmcm9tICcuLi8uLi9pby9wcml2YXRlJztcbmltcG9ydCB7IFRvb2xraXRFcnJvciB9IGZyb20gJy4uLy4uL3NoYXJlZC1wdWJsaWMnO1xuaW1wb3J0IHR5cGUgeyBBcHBTeW50aE9wdGlvbnMsIExvYWRBc3NlbWJseU9wdGlvbnMgfSBmcm9tICcuLi9zb3VyY2UtYnVpbGRlcic7XG5cbnR5cGUgRW52ID0geyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTtcbnR5cGUgQ29udGV4dCA9IHsgW2tleTogc3RyaW5nXTogYW55IH07XG5cbmV4cG9ydCBjbGFzcyBFeGVjdXRpb25FbnZpcm9ubWVudCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgaW9IZWxwZXI6IElvSGVscGVyO1xuICBwcml2YXRlIHJlYWRvbmx5IHNka1Byb3ZpZGVyOiBTZGtQcm92aWRlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBkZWJ1Z0ZuOiAobXNnOiBzdHJpbmcpID0+IFByb21pc2U8dm9pZD47XG4gIHByaXZhdGUgX291dGRpcjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihzZXJ2aWNlczogVG9vbGtpdFNlcnZpY2VzLCBwcm9wczogeyBvdXRkaXI/OiBzdHJpbmcgfSA9IHt9KSB7XG4gICAgdGhpcy5pb0hlbHBlciA9IHNlcnZpY2VzLmlvSGVscGVyO1xuICAgIHRoaXMuc2RrUHJvdmlkZXIgPSBzZXJ2aWNlcy5zZGtQcm92aWRlcjtcbiAgICB0aGlzLmRlYnVnRm4gPSAobXNnOiBzdHJpbmcpID0+IHRoaXMuaW9IZWxwZXIubm90aWZ5KElPLkRFRkFVTFRfQVNTRU1CTFlfREVCVUcubXNnKG1zZykpO1xuICAgIHRoaXMuX291dGRpciA9IHByb3BzLm91dGRpcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBUdXJuIHRoZSBnaXZlbiBvcHRpb25hbCBvdXRwdXQgZGlyZWN0b3J5IGludG8gYSBmaXhlZCBvdXRwdXQgZGlyZWN0b3J5XG4gICAqL1xuICBwdWJsaWMgZ2V0IG91dGRpcigpOiBzdHJpbmcge1xuICAgIGlmICghdGhpcy5fb3V0ZGlyKSB7XG4gICAgICBjb25zdCBvdXRkaXIgPSBmcy5ta2R0ZW1wU3luYyhwYXRoLmpvaW4oZnMucmVhbHBhdGhTeW5jKG9zLnRtcGRpcigpKSwgJ2Nkay5vdXQnKSk7XG4gICAgICB0aGlzLl9vdXRkaXIgPSBvdXRkaXI7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9vdXRkaXI7XG4gIH1cblxuICAvKipcbiAgICogR3Vlc3MgdGhlIGV4ZWN1dGFibGUgZnJvbSB0aGUgY29tbWFuZC1saW5lIGFyZ3VtZW50XG4gICAqXG4gICAqIE9ubHkgZG8gdGhpcyBpZiB0aGUgZmlsZSBpcyBOT1QgbWFya2VkIGFzIGV4ZWN1dGFibGUuIElmIGl0IGlzLFxuICAgKiB3ZSdsbCBkZWZlciB0byB0aGUgc2hlYmFuZyBpbnNpZGUgdGhlIGZpbGUgaXRzZWxmLlxuICAgKlxuICAgKiBJZiB3ZSdyZSBvbiBXaW5kb3dzLCB3ZSBBTFdBWVMgdGFrZSB0aGUgaGFuZGxlciwgc2luY2UgaXQncyBoYXJkIHRvXG4gICAqIHZlcmlmeSBpZiByZWdpc3RyeSBhc3NvY2lhdGlvbnMgaGF2ZSBvciBoYXZlIG5vdCBiZWVuIHNldCB1cCBmb3IgdGhpc1xuICAgKiBmaWxlIHR5cGUsIHNvIHdlJ2xsIGFzc3VtZSB0aGUgd29yc3QgYW5kIHRha2UgY29udHJvbC5cbiAgICovXG4gIHB1YmxpYyBndWVzc0V4ZWN1dGFibGUoYXBwOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gZ3Vlc3NFeGVjdXRhYmxlKGFwcCwgdGhpcy5kZWJ1Z0ZuKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJZiB3ZSBkb24ndCBoYXZlIHJlZ2lvbi9hY2NvdW50IGRlZmluZWQgaW4gY29udGV4dCwgd2UgZmFsbCBiYWNrIHRvIHRoZSBkZWZhdWx0IFNESyBiZWhhdmlvclxuICAgKiB3aGVyZSByZWdpb24gaXMgcmV0cmlldmVkIGZyb20gfi8uYXdzL2NvbmZpZyBhbmQgYWNjb3VudCBpcyBiYXNlZCBvbiBkZWZhdWx0IGNyZWRlbnRpYWxzIHByb3ZpZGVyXG4gICAqIGNoYWluIGFuZCB0aGVuIFNUUyBpcyBxdWVyaWVkLlxuICAgKlxuICAgKiBUaGlzIGlzIGRvbmUgb3Bwb3J0dW5pc3RpY2FsbHk6IGZvciBleGFtcGxlLCBpZiB3ZSBjYW4ndCBhY2Nlc3MgU1RTIGZvciBzb21lIHJlYXNvbiBvciB0aGUgcmVnaW9uXG4gICAqIGlzIG5vdCBjb25maWd1cmVkLCB0aGUgY29udGV4dCB2YWx1ZSB3aWxsIGJlICdudWxsJyBhbmQgdGhlcmUgY291bGQgZmFpbHVyZXMgZG93biB0aGUgbGluZS4gSW5cbiAgICogc29tZSBjYXNlcywgc3ludGhlc2lzIGRvZXMgbm90IHJlcXVpcmUgcmVnaW9uL2FjY291bnQgaW5mb3JtYXRpb24gYXQgYWxsLCBzbyB0aGF0IG1pZ2h0IGJlIHBlcmZlY3RseVxuICAgKiBmaW5lIGluIGNlcnRhaW4gc2NlbmFyaW9zLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGRlZmF1bHRFbnZWYXJzKCk6IFByb21pc2U8RW52PiB7XG4gICAgY29uc3QgZGVidWdGbiA9IChtc2c6IHN0cmluZykgPT4gdGhpcy5pb0hlbHBlci5ub3RpZnkoSU8uQ0RLX0FTU0VNQkxZX0kwMDEwLm1zZyhtc2cpKTtcbiAgICBjb25zdCBlbnYgPSBhd2FpdCBvbGRQcmVwYXJlKHRoaXMuc2RrUHJvdmlkZXIsIGRlYnVnRm4pO1xuXG4gICAgZW52W2N4YXBpLk9VVERJUl9FTlZdID0gdGhpcy5vdXRkaXI7XG4gICAgYXdhaXQgZGVidWdGbihmb3JtYXQoJ291dGRpcjonLCB0aGlzLm91dGRpcikpO1xuXG4gICAgLy8gQ0xJIHZlcnNpb24gaW5mb3JtYXRpb25cbiAgICBlbnZbY3hhcGkuQ0xJX0FTTV9WRVJTSU9OX0VOVl0gPSBjeHNjaGVtYS5NYW5pZmVzdC52ZXJzaW9uKCk7XG4gICAgZW52W2N4YXBpLkNMSV9WRVJTSU9OX0VOVl0gPSB2ZXJzaW9uTnVtYmVyKCk7XG5cbiAgICBhd2FpdCBkZWJ1Z0ZuKGZvcm1hdCgnZW52OicsIGVudikpO1xuICAgIHJldHVybiBlbnY7XG4gIH1cblxuICAvKipcbiAgICogUnVuIGNvZGUgZnJvbSBhIGRpZmZlcmVudCB3b3JraW5nIGRpcmVjdG9yeVxuICAgKi9cbiAgcHVibGljIGFzeW5jIGNoYW5nZURpcjxUPihibG9jazogKCkgPT4gUHJvbWlzZTxUPiwgd29ya2luZ0Rpcj86IHN0cmluZykge1xuICAgIGNvbnN0IG9yaWdpbmFsV29ya2luZ0RpciA9IHByb2Nlc3MuY3dkKCk7XG4gICAgdHJ5IHtcbiAgICAgIGlmICh3b3JraW5nRGlyKSB7XG4gICAgICAgIHByb2Nlc3MuY2hkaXIod29ya2luZ0Rpcik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhd2FpdCBibG9jaygpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpZiAod29ya2luZ0Rpcikge1xuICAgICAgICBwcm9jZXNzLmNoZGlyKG9yaWdpbmFsV29ya2luZ0Rpcik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1biBjb2RlIHdpdGggYWRkaXRpb25hbCBlbnZpcm9ubWVudCB2YXJpYWJsZXNcbiAgICovXG4gIHB1YmxpYyBhc3luYyB3aXRoRW52PFQ+KGVudjogRW52ID0ge30sIGJsb2NrOiAoKSA9PiBQcm9taXNlPFQ+KSB7XG4gICAgY29uc3Qgb3JpZ2luYWxFbnYgPSBwcm9jZXNzLmVudjtcbiAgICB0cnkge1xuICAgICAgcHJvY2Vzcy5lbnYgPSB7XG4gICAgICAgIC4uLm9yaWdpbmFsRW52LFxuICAgICAgICAuLi5lbnYsXG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gYXdhaXQgYmxvY2soKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgcHJvY2Vzcy5lbnYgPSBvcmlnaW5hbEVudjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVuIGNvZGUgd2l0aCBjb250ZXh0IHNldHVwIGluc2lkZSB0aGUgZW52aXJvbm1lbnRcbiAgICovXG4gIHB1YmxpYyBhc3luYyB3aXRoQ29udGV4dDxUPihcbiAgICBpbnB1dENvbnRleHQ6IENvbnRleHQsXG4gICAgZW52OiBFbnYsXG4gICAgc3ludGhPcHRzOiBBcHBTeW50aE9wdGlvbnMgPSB7fSxcbiAgICBibG9jazogKGVudjogRW52LCBjb250ZXh0OiBDb250ZXh0KSA9PiBQcm9taXNlPFQ+LFxuICApIHtcbiAgICBjb25zdCBjb250ZXh0ID0gYXdhaXQgcHJlcGFyZUNvbnRleHQoc3ludGhPcHRzRGVmYXVsdHMoc3ludGhPcHRzKSwgaW5wdXRDb250ZXh0LCBlbnYsIHRoaXMuZGVidWdGbik7XG4gICAgbGV0IGNvbnRleHRPdmVyZmxvd0xvY2F0aW9uID0gbnVsbDtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBlbnZWYXJpYWJsZVNpemVMaW1pdCA9IG9zLnBsYXRmb3JtKCkgPT09ICd3aW4zMicgPyAzMjc2MCA6IDEzMTA3MjtcbiAgICAgIGNvbnN0IFtzbWFsbENvbnRleHQsIG92ZXJmbG93XSA9IHNwbGl0QnlTaXplKGNvbnRleHQsIHNwYWNlQXZhaWxhYmxlRm9yQ29udGV4dChlbnYsIGVudlZhcmlhYmxlU2l6ZUxpbWl0KSk7XG5cbiAgICAgIC8vIFN0b3JlIHRoZSBzYWZlIHBhcnQgaW4gdGhlIGVudmlyb25tZW50IHZhcmlhYmxlXG4gICAgICBlbnZbY3hhcGkuQ09OVEVYVF9FTlZdID0gSlNPTi5zdHJpbmdpZnkoc21hbGxDb250ZXh0KTtcblxuICAgICAgLy8gSWYgdGhlcmUgd2FzIGFueSBvdmVyZmxvdywgd3JpdGUgaXQgdG8gYSB0ZW1wb3JhcnkgZmlsZVxuICAgICAgaWYgKE9iamVjdC5rZXlzKG92ZXJmbG93ID8/IHt9KS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IGNvbnRleHREaXIgPSBmcy5ta2R0ZW1wU3luYyhwYXRoLmpvaW4ob3MudG1wZGlyKCksICdjZGstY29udGV4dCcpKTtcbiAgICAgICAgY29udGV4dE92ZXJmbG93TG9jYXRpb24gPSBwYXRoLmpvaW4oY29udGV4dERpciwgJ2NvbnRleHQtb3ZlcmZsb3cuanNvbicpO1xuICAgICAgICBmcy53cml0ZUpTT05TeW5jKGNvbnRleHRPdmVyZmxvd0xvY2F0aW9uLCBvdmVyZmxvdyk7XG4gICAgICAgIGVudltjeGFwaS5DT05URVhUX09WRVJGTE9XX0xPQ0FUSU9OX0VOVl0gPSBjb250ZXh0T3ZlcmZsb3dMb2NhdGlvbjtcbiAgICAgIH1cblxuICAgICAgLy8gY2FsbCB0aGUgYmxvY2sgY29kZSB3aXRoIG5ldyBlbnZpcm9ubWVudFxuICAgICAgcmV0dXJuIGF3YWl0IGJsb2NrKGVudiwgY29udGV4dCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlmIChjb250ZXh0T3ZlcmZsb3dMb2NhdGlvbikge1xuICAgICAgICBmcy5yZW1vdmVTeW5jKHBhdGguZGlybmFtZShjb250ZXh0T3ZlcmZsb3dMb2NhdGlvbikpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIENoZWNrcyBpZiBhIGdpdmVuIGFzc2VtYmx5IHN1cHBvcnRzIGNvbnRleHQgb3ZlcmZsb3csIHdhcm4gb3RoZXJ3aXNlLlxuICpcbiAqIEBwYXJhbSBhc3NlbWJseSB0aGUgYXNzZW1ibHkgdG8gY2hlY2tcbiAqL1xuYXN5bmMgZnVuY3Rpb24gY2hlY2tDb250ZXh0T3ZlcmZsb3dTdXBwb3J0KGFzc2VtYmx5OiBjeGFwaS5DbG91ZEFzc2VtYmx5LCBpb0hlbHBlcjogSW9IZWxwZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgdHJhY2VGbiA9IChtc2c6IHN0cmluZykgPT4gaW9IZWxwZXIubm90aWZ5KElPLkRFRkFVTFRfQVNTRU1CTFlfVFJBQ0UubXNnKG1zZykpO1xuICBjb25zdCB0cmVlID0gYXdhaXQgbG9hZFRyZWUoYXNzZW1ibHksIHRyYWNlRm4pO1xuICBjb25zdCBmcmFtZXdvcmtEb2VzTm90U3VwcG9ydENvbnRleHRPdmVyZmxvdyA9IHNvbWUodHJlZSwgbm9kZSA9PiB7XG4gICAgY29uc3QgZnFuID0gbm9kZS5jb25zdHJ1Y3RJbmZvPy5mcW47XG4gICAgY29uc3QgdmVyc2lvbiA9IG5vZGUuY29uc3RydWN0SW5mbz8udmVyc2lvbjtcbiAgICByZXR1cm4gKGZxbiA9PT0gJ2F3cy1jZGstbGliLkFwcCcgJiYgdmVyc2lvbiAhPSBudWxsICYmIGx0ZSh2ZXJzaW9uLCAnMi4zOC4wJykpIC8vIHYyXG4gICAgfHwgZnFuID09PSAnQGF3cy1jZGsvY29yZS5BcHAnOyAvLyB2MVxuICB9KTtcblxuICAvLyBXZSdyZSBkZWFsaW5nIHdpdGggYW4gb2xkIHZlcnNpb24gb2YgdGhlIGZyYW1ld29yayBoZXJlLiBJdCBpcyB1bmF3YXJlIG9mIHRoZSB0ZW1wb3JhcnlcbiAgLy8gZmlsZSwgd2hpY2ggbWVhbnMgdGhhdCBpdCB3aWxsIGlnbm9yZSB0aGUgY29udGV4dCBvdmVyZmxvdy5cbiAgaWYgKGZyYW1ld29ya0RvZXNOb3RTdXBwb3J0Q29udGV4dE92ZXJmbG93KSB7XG4gICAgYXdhaXQgaW9IZWxwZXIubm90aWZ5KElPLkNES19BU1NFTUJMWV9XMDAxMC5tc2coJ1BhcnQgb2YgdGhlIGNvbnRleHQgY291bGQgbm90IGJlIHNlbnQgdG8gdGhlIGFwcGxpY2F0aW9uLiBQbGVhc2UgdXBkYXRlIHRoZSBBV1MgQ0RLIGxpYnJhcnkgdG8gdGhlIGxhdGVzdCB2ZXJzaW9uLicpKTtcbiAgfVxufVxuXG4vKipcbiAqIFNhZmVseSBjcmVhdGUgYW4gYXNzZW1ibHkgZnJvbSBhIGNsb3VkIGFzc2VtYmx5IGRpcmVjdG9yeVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYXNzZW1ibHlGcm9tRGlyZWN0b3J5KGFzc2VtYmx5RGlyOiBzdHJpbmcsIGlvSGVscGVyOiBJb0hlbHBlciwgbG9hZE9wdGlvbnM6IExvYWRBc3NlbWJseU9wdGlvbnMgPSB7fSkge1xuICB0cnkge1xuICAgIGNvbnN0IGFzc2VtYmx5ID0gbmV3IGN4YXBpLkNsb3VkQXNzZW1ibHkoYXNzZW1ibHlEaXIsIHtcbiAgICAgIHNraXBWZXJzaW9uQ2hlY2s6ICEobG9hZE9wdGlvbnMuY2hlY2tWZXJzaW9uID8/IHRydWUpLFxuICAgICAgc2tpcEVudW1DaGVjazogIShsb2FkT3B0aW9ucy5jaGVja0VudW1zID8/IHRydWUpLFxuICAgICAgLy8gV2Ugc29ydCBhcyB3ZSBkZXBsb3lcbiAgICAgIHRvcG9Tb3J0OiBmYWxzZSxcbiAgICB9KTtcbiAgICBhd2FpdCBjaGVja0NvbnRleHRPdmVyZmxvd1N1cHBvcnQoYXNzZW1ibHksIGlvSGVscGVyKTtcbiAgICByZXR1cm4gYXNzZW1ibHk7XG4gIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgaWYgKGVyci5tZXNzYWdlLmluY2x1ZGVzKGN4c2NoZW1hLlZFUlNJT05fTUlTTUFUQ0gpKSB7XG4gICAgICAvLyB0aGlzIG1lYW5zIHRoZSBDTEkgdmVyc2lvbiBpcyB0b28gb2xkLlxuICAgICAgLy8gd2UgaW5zdHJ1Y3QgdGhlIHVzZXIgdG8gdXBncmFkZS5cbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSAnVGhpcyBBV1MgQ0RLIFRvb2xraXQgaXMgbm90IGNvbXBhdGlibGUgd2l0aCB0aGUgQVdTIENESyBsaWJyYXJ5IHVzZWQgYnkgeW91ciBhcHBsaWNhdGlvbi4gUGxlYXNlIHVwZ3JhZGUgdG8gdGhlIGxhdGVzdCB2ZXJzaW9uLic7XG4gICAgICBhd2FpdCBpb0hlbHBlci5ub3RpZnkoSU8uQ0RLX0FTU0VNQkxZX0UxMTExLm1zZyhtZXNzYWdlLCB7IGVycm9yOiBlcnIgfSkpO1xuICAgICAgdGhyb3cgbmV3IFRvb2xraXRFcnJvcihgJHttZXNzYWdlfVxcbigke2Vyci5tZXNzYWdlfWApO1xuICAgIH1cbiAgICB0aHJvdyBlcnI7XG4gIH1cbn1cblxuZnVuY3Rpb24gc3ludGhPcHRzRGVmYXVsdHMoc3ludGhPcHRzOiBBcHBTeW50aE9wdGlvbnMgPSB7fSk6IFNldHRpbmdzIHtcbiAgcmV0dXJuIG5ldyBTZXR0aW5ncyh7XG4gICAgZGVidWc6IGZhbHNlLFxuICAgIHBhdGhNZXRhZGF0YTogdHJ1ZSxcbiAgICB2ZXJzaW9uUmVwb3J0aW5nOiB0cnVlLFxuICAgIGFzc2V0TWV0YWRhdGE6IHRydWUsXG4gICAgYXNzZXRTdGFnaW5nOiB0cnVlLFxuICAgIC4uLnN5bnRoT3B0cyxcbiAgfSwgdHJ1ZSk7XG59XG4iXX0=
249
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJlcGFyZS1zb3VyY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJwcmVwYXJlLXNvdXJjZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFxUEEsc0RBb0JDO0FBelFELDZDQUEyQztBQUMzQyw4QkFBOEI7QUFDOUIsa0NBQWtDO0FBQ2xDLHlDQUFtQztBQUNuQywyREFBMkQ7QUFDM0QseUNBQXlDO0FBQ3pDLCtCQUErQjtBQUMvQixtQ0FBNkI7QUFDN0IsZ0VBQWlKO0FBQ2pKLGdFQUFpSjtBQUNqSixnREFBbUU7QUFFbkUsOENBQXNDO0FBQ3RDLHVEQUFtRDtBQU1uRCxNQUFhLG9CQUFvQjtJQWlDYjtJQUNBO0lBakNsQjs7Ozs7Ozs7Ozs7T0FXRztJQUNJLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFFBQXlCLEVBQUUsUUFBNkIsRUFBRTtRQUNuRixJQUFJLE9BQU8sR0FBRyxLQUFLLENBQUM7UUFDcEIsSUFBSSxHQUFHLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQztRQUN2QixJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDVCxPQUFPLEdBQUcsSUFBSSxDQUFDO1lBQ2YsR0FBRyxHQUFHLEVBQUUsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUM7UUFDM0UsQ0FBQztRQUVELE1BQU0sSUFBSSxHQUFHLE1BQU0sSUFBSSx1QkFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ2xELE9BQU8sSUFBSSxvQkFBb0IsQ0FBQyxRQUFRLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNoRSxDQUFDO0lBRWdCLFFBQVEsQ0FBVztJQUNuQixXQUFXLENBQWM7SUFDekIsT0FBTyxDQUFpQztJQUNqRCxJQUFJLENBQXlCO0lBQzdCLFdBQVcs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QUFDO1FBQ3hELENBQUM7UUFDRCxNQUFNLEdBQUcsQ0FBQztJQUNaLENBQUM7QUFDSCxDQUFDO0FBRUQsU0FBUyxpQkFBaUIsQ0FBQyxZQUE2QixFQUFFO0lBQ3hELE9BQU8sSUFBSSx5QkFBUSxDQUFDO1FBQ2xCLEtBQUssRUFBRSxLQUFLO1FBQ1osWUFBWSxFQUFFLElBQUk7UUFDbEIsZ0JBQWdCLEVBQUUsSUFBSTtRQUN0QixhQUFhLEVBQUUsSUFBSTtRQUNuQixZQUFZLEVBQUUsSUFBSTtRQUNsQixHQUFHLFNBQVM7S0FDYixFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ1gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAnLi4vLi4vLi4vcHJpdmF0ZS9kaXNwb3NlLXBvbHlmaWxsJztcbmltcG9ydCAqIGFzIG9zIGZyb20gJ25vZGU6b3MnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHsgZm9ybWF0IH0gZnJvbSAnbm9kZTp1dGlsJztcbmltcG9ydCAqIGFzIGN4c2NoZW1hIGZyb20gJ0Bhd3MtY2RrL2Nsb3VkLWFzc2VtYmx5LXNjaGVtYSc7XG5pbXBvcnQgKiBhcyBjeGFwaSBmcm9tICdAYXdzLWNkay9jeC1hcGknO1xuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMtZXh0cmEnO1xuaW1wb3J0IHsgbHRlIH0gZnJvbSAnc2VtdmVyJztcbmltcG9ydCB7IHR5cGUgSVJlYWRMb2NrLCB0eXBlIElXcml0ZUxvY2ssIHR5cGUgU2RrUHJvdmlkZXIsIHR5cGUgSW9IZWxwZXIsIGxvYWRUcmVlLCBzb21lLCBTZXR0aW5ncywgUldMb2NrIH0gZnJvbSAnLi4vLi4vLi4vYXBpL3NoYXJlZC1wcml2YXRlJztcbmltcG9ydCB7IHByZXBhcmVEZWZhdWx0RW52aXJvbm1lbnQgYXMgb2xkUHJlcGFyZSwgcHJlcGFyZUNvbnRleHQsIHNwYWNlQXZhaWxhYmxlRm9yQ29udGV4dCwgZ3Vlc3NFeGVjdXRhYmxlIH0gZnJvbSAnLi4vLi4vLi4vYXBpL3NoYXJlZC1wcml2YXRlJztcbmltcG9ydCB7IHNwbGl0QnlTaXplLCB2ZXJzaW9uTnVtYmVyIH0gZnJvbSAnLi4vLi4vLi4vcHJpdmF0ZS91dGlsJztcbmltcG9ydCB0eXBlIHsgVG9vbGtpdFNlcnZpY2VzIH0gZnJvbSAnLi4vLi4vLi4vdG9vbGtpdC9wcml2YXRlJztcbmltcG9ydCB7IElPIH0gZnJvbSAnLi4vLi4vaW8vcHJpdmF0ZSc7XG5pbXBvcnQgeyBUb29sa2l0RXJyb3IgfSBmcm9tICcuLi8uLi9zaGFyZWQtcHVibGljJztcbmltcG9ydCB0eXBlIHsgQXBwU3ludGhPcHRpb25zLCBMb2FkQXNzZW1ibHlPcHRpb25zIH0gZnJvbSAnLi4vc291cmNlLWJ1aWxkZXInO1xuXG50eXBlIEVudiA9IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG50eXBlIENvbnRleHQgPSB7IFtrZXk6IHN0cmluZ106IGFueSB9O1xuXG5leHBvcnQgY2xhc3MgRXhlY3V0aW9uRW52aXJvbm1lbnQgaW1wbGVtZW50cyBBc3luY0Rpc3Bvc2FibGUge1xuICAvKipcbiAgICogQ3JlYXRlIGFuIEV4ZWN1dGlvbkVudmlyb25tZW50XG4gICAqXG4gICAqIEFuIEV4ZWN1dGlvbkVudmlyb25tZW50IGhvbGRzIGEgd3JpdGVyIGxvY2sgb24gdGhlIGdpdmVuIGRpcmVjdG9yeSB3aGljaCB3aWxsXG4gICAqIGJlIGNsZWFuZWQgdXAgd2hlbiB0aGUgb2JqZWN0IGlzIGRpc3Bvc2VkLlxuICAgKlxuICAgKiBBIHRlbXBvcmFyeSBkaXJlY3Rvcnkgd2lsbCBiZSBjcmVhdGVkIGlmIG5vbmUgaXMgc3VwcGxpZWQsIHdoaWNoIHdpbGwgYmUgY2xlYW5lZFxuICAgKiB1cCB3aGVuIHRoaXMgb2JqZWN0IGlzIGRpc3Bvc2VkLlxuICAgKlxuICAgKiBJZiBgbWFya1N1Y2Nlc3NmdWwoKWAgaXMgY2FsbGVkLCB0aGUgd3JpdGVyIGxvY2sgaXMgY29udmVydGVkIHRvIGEgcmVhZGVyIGxvY2tcbiAgICogYW5kIHRlbXBvcmFyeSBkaXJlY3RvcmllcyB3aWxsIG5vdCBiZSBjbGVhbmVkIHVwIGFueW1vcmUuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGFzeW5jIGNyZWF0ZShzZXJ2aWNlczogVG9vbGtpdFNlcnZpY2VzLCBwcm9wczogeyBvdXRkaXI/OiBzdHJpbmcgfSA9IHt9KSB7XG4gICAgbGV0IHRlbXBEaXIgPSBmYWxzZTtcbiAgICBsZXQgZGlyID0gcHJvcHMub3V0ZGlyO1xuICAgIGlmICghZGlyKSB7XG4gICAgICB0ZW1wRGlyID0gdHJ1ZTtcbiAgICAgIGRpciA9IGZzLm1rZHRlbXBTeW5jKHBhdGguam9pbihmcy5yZWFscGF0aFN5bmMob3MudG1wZGlyKCkpLCAnY2RrLm91dCcpKTtcbiAgICB9XG5cbiAgICBjb25zdCBsb2NrID0gYXdhaXQgbmV3IFJXTG9jayhkaXIpLmFjcXVpcmVXcml0ZSgpO1xuICAgIHJldHVybiBuZXcgRXhlY3V0aW9uRW52aXJvbm1lbnQoc2VydmljZXMsIGRpciwgdGVtcERpciwgbG9jayk7XG4gIH1cblxuICBwcml2YXRlIHJlYWRvbmx5IGlvSGVscGVyOiBJb0hlbHBlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBzZGtQcm92aWRlcjogU2RrUHJvdmlkZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVidWdGbjogKG1zZzogc3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+O1xuICBwcml2YXRlIGxvY2s6IElXcml0ZUxvY2sgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgc2hvdWxkQ2xlYW46IGJvb2xlYW47XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihcbiAgICBzZXJ2aWNlczogVG9vbGtpdFNlcnZpY2VzLFxuICAgIHB1YmxpYyByZWFkb25seSBvdXRkaXI6IHN0cmluZyxcbiAgICBwdWJsaWMgcmVhZG9ubHkgb3V0RGlySXNUZW1wb3Jhcnk6IGJvb2xlYW4sXG4gICAgbG9jazogSVdyaXRlTG9jayxcbiAgKSB7XG4gICAgdGhpcy5pb0hlbHBlciA9IHNlcnZpY2VzLmlvSGVscGVyO1xuICAgIHRoaXMuc2RrUHJvdmlkZXIgPSBzZXJ2aWNlcy5zZGtQcm92aWRlcjtcbiAgICB0aGlzLmRlYnVnRm4gPSAobXNnOiBzdHJpbmcpID0+IHRoaXMuaW9IZWxwZXIubm90aWZ5KElPLkRFRkFVTFRfQVNTRU1CTFlfREVCVUcubXNnKG1zZykpO1xuICAgIHRoaXMubG9jayA9IGxvY2s7XG4gICAgdGhpcy5zaG91bGRDbGVhbiA9IG91dERpcklzVGVtcG9yYXJ5O1xuICB9XG5cbiAgcHVibGljIGFzeW5jIFtTeW1ib2wuYXN5bmNEaXNwb3NlXSgpIHtcbiAgICBhd2FpdCB0aGlzLmxvY2s/LnJlbGVhc2UoKTtcblxuICAgIGlmICh0aGlzLnNob3VsZENsZWFuKSB7XG4gICAgICBhd2FpdCBmcy5ybSh0aGlzLm91dGRpciwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBNYXJrIHRoZSBleGVjdXRpb24gYXMgc3VjY2Vzc2Z1bCwgd2hpY2ggc3RvcHMgdGhlIHdyaXRlciBsb2NrIGZyb20gYmVpbmcgcmVsZWFzZWQgdXBvbiBkaXNwb3NhbFxuICAgKi9cbiAgcHVibGljIGFzeW5jIG1hcmtTdWNjZXNzZnVsKCkge1xuICAgIGlmICghdGhpcy5sb2NrKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdDYW5ub3QgbWFyayBzdWNjZXNzZnVsIG1vcmUgdGhhbiBvbmNlJyk7XG4gICAgfVxuICAgIGNvbnN0IHJlYWRMb2NrID0gYXdhaXQgdGhpcy5sb2NrLmNvbnZlcnRUb1JlYWRlckxvY2soKTtcbiAgICB0aGlzLmxvY2sgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5zaG91bGRDbGVhbiA9IGZhbHNlO1xuICAgIHJldHVybiB7IHJlYWRMb2NrIH07XG4gIH1cblxuICAvKipcbiAgICogQmVnaW4gYW4gZXhlY3V0aW9uIGluIHRoaXMgZW52aXJvbm1lbnRcbiAgICpcbiAgICogVGhpcyB3aWxsIGFjcXVpcmUgYSB3cml0ZSBsb2NrIG9uIHRoZSBnaXZlbiBlbnZpcm9ubWVudC4gVGhlIHdyaXRlIGxvY2tcbiAgICogd2lsbCBiZSByZWxlYXNlZCBhdXRvbWF0aWNhbGx5IHdoZW4gdGhlIHJldHVybiBvYmplY3QgaXMgZGlzcG9zZWQsIHVubGVzcyBpdFxuICAgKiBpcyBjb252ZXJ0ZWQgdG8gYSByZWFkZXIgbG9jay5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBiZWdpbkV4ZWN1dGlvbigpOiBQcm9taXNlPHsgd3JpdGVUb1JlYWRMb2NrKCk6IFByb21pc2U8SVJlYWRMb2NrPiB9ICYgQXN5bmNEaXNwb3NhYmxlPiB7XG4gICAgY29uc3QgbG9jayA9IGF3YWl0IG5ldyBSV0xvY2sodGhpcy5vdXRkaXIpLmFjcXVpcmVXcml0ZSgpO1xuXG4gICAgbGV0IGNvbnZlcnRlZCA9IGZhbHNlO1xuICAgIHJldHVybiB7XG4gICAgICBhc3luYyB3cml0ZVRvUmVhZExvY2soKSB7XG4gICAgICAgIGNvbnZlcnRlZCA9IHRydWU7XG4gICAgICAgIHJldHVybiBsb2NrLmNvbnZlcnRUb1JlYWRlckxvY2soKTtcbiAgICAgIH0sXG4gICAgICBbU3ltYm9sLmFzeW5jRGlzcG9zZV06IGFzeW5jICgpID0+IHtcbiAgICAgICAgLy8gUmVsZWFzZSBpZiBub3QgY29udmVydGVkXG4gICAgICAgIGlmICghY29udmVydGVkKSB7XG4gICAgICAgICAgYXdhaXQgbG9jay5yZWxlYXNlKCk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHdWVzcyB0aGUgZXhlY3V0YWJsZSBmcm9tIHRoZSBjb21tYW5kLWxpbmUgYXJndW1lbnRcbiAgICpcbiAgICogT25seSBkbyB0aGlzIGlmIHRoZSBmaWxlIGlzIE5PVCBtYXJrZWQgYXMgZXhlY3V0YWJsZS4gSWYgaXQgaXMsXG4gICAqIHdlJ2xsIGRlZmVyIHRvIHRoZSBzaGViYW5nIGluc2lkZSB0aGUgZmlsZSBpdHNlbGYuXG4gICAqXG4gICAqIElmIHdlJ3JlIG9uIFdpbmRvd3MsIHdlIEFMV0FZUyB0YWtlIHRoZSBoYW5kbGVyLCBzaW5jZSBpdCdzIGhhcmQgdG9cbiAgICogdmVyaWZ5IGlmIHJlZ2lzdHJ5IGFzc29jaWF0aW9ucyBoYXZlIG9yIGhhdmUgbm90IGJlZW4gc2V0IHVwIGZvciB0aGlzXG4gICAqIGZpbGUgdHlwZSwgc28gd2UnbGwgYXNzdW1lIHRoZSB3b3JzdCBhbmQgdGFrZSBjb250cm9sLlxuICAgKi9cbiAgcHVibGljIGd1ZXNzRXhlY3V0YWJsZShhcHA6IHN0cmluZykge1xuICAgIHJldHVybiBndWVzc0V4ZWN1dGFibGUoYXBwLCB0aGlzLmRlYnVnRm4pO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIHdlIGRvbid0IGhhdmUgcmVnaW9uL2FjY291bnQgZGVmaW5lZCBpbiBjb250ZXh0LCB3ZSBmYWxsIGJhY2sgdG8gdGhlIGRlZmF1bHQgU0RLIGJlaGF2aW9yXG4gICAqIHdoZXJlIHJlZ2lvbiBpcyByZXRyaWV2ZWQgZnJvbSB+Ly5hd3MvY29uZmlnIGFuZCBhY2NvdW50IGlzIGJhc2VkIG9uIGRlZmF1bHQgY3JlZGVudGlhbHMgcHJvdmlkZXJcbiAgICogY2hhaW4gYW5kIHRoZW4gU1RTIGlzIHF1ZXJpZWQuXG4gICAqXG4gICAqIFRoaXMgaXMgZG9uZSBvcHBvcnR1bmlzdGljYWxseTogZm9yIGV4YW1wbGUsIGlmIHdlIGNhbid0IGFjY2VzcyBTVFMgZm9yIHNvbWUgcmVhc29uIG9yIHRoZSByZWdpb25cbiAgICogaXMgbm90IGNvbmZpZ3VyZWQsIHRoZSBjb250ZXh0IHZhbHVlIHdpbGwgYmUgJ251bGwnIGFuZCB0aGVyZSBjb3VsZCBmYWlsdXJlcyBkb3duIHRoZSBsaW5lLiBJblxuICAgKiBzb21lIGNhc2VzLCBzeW50aGVzaXMgZG9lcyBub3QgcmVxdWlyZSByZWdpb24vYWNjb3VudCBpbmZvcm1hdGlvbiBhdCBhbGwsIHNvIHRoYXQgbWlnaHQgYmUgcGVyZmVjdGx5XG4gICAqIGZpbmUgaW4gY2VydGFpbiBzY2VuYXJpb3MuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZGVmYXVsdEVudlZhcnMoKTogUHJvbWlzZTxFbnY+IHtcbiAgICBjb25zdCBkZWJ1Z0ZuID0gKG1zZzogc3RyaW5nKSA9PiB0aGlzLmlvSGVscGVyLm5vdGlmeShJTy5DREtfQVNTRU1CTFlfSTAwMTAubXNnKG1zZykpO1xuICAgIGNvbnN0IGVudiA9IGF3YWl0IG9sZFByZXBhcmUodGhpcy5zZGtQcm92aWRlciwgZGVidWdGbik7XG5cbiAgICBlbnZbY3hhcGkuT1VURElSX0VOVl0gPSB0aGlzLm91dGRpcjtcbiAgICBhd2FpdCBkZWJ1Z0ZuKGZvcm1hdCgnb3V0ZGlyOicsIHRoaXMub3V0ZGlyKSk7XG5cbiAgICAvLyBDTEkgdmVyc2lvbiBpbmZvcm1hdGlvblxuICAgIGVudltjeGFwaS5DTElfQVNNX1ZFUlNJT05fRU5WXSA9IGN4c2NoZW1hLk1hbmlmZXN0LnZlcnNpb24oKTtcbiAgICBlbnZbY3hhcGkuQ0xJX1ZFUlNJT05fRU5WXSA9IHZlcnNpb25OdW1iZXIoKTtcblxuICAgIGF3YWl0IGRlYnVnRm4oZm9ybWF0KCdlbnY6JywgZW52KSk7XG4gICAgcmV0dXJuIGVudjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW4gY29kZSBmcm9tIGEgZGlmZmVyZW50IHdvcmtpbmcgZGlyZWN0b3J5XG4gICAqL1xuICBwdWJsaWMgYXN5bmMgY2hhbmdlRGlyPFQ+KGJsb2NrOiAoKSA9PiBQcm9taXNlPFQ+LCB3b3JraW5nRGlyPzogc3RyaW5nKSB7XG4gICAgY29uc3Qgb3JpZ2luYWxXb3JraW5nRGlyID0gcHJvY2Vzcy5jd2QoKTtcbiAgICB0cnkge1xuICAgICAgaWYgKHdvcmtpbmdEaXIpIHtcbiAgICAgICAgcHJvY2Vzcy5jaGRpcih3b3JraW5nRGlyKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGF3YWl0IGJsb2NrKCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlmICh3b3JraW5nRGlyKSB7XG4gICAgICAgIHByb2Nlc3MuY2hkaXIob3JpZ2luYWxXb3JraW5nRGlyKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVuIGNvZGUgd2l0aCBhZGRpdGlvbmFsIGVudmlyb25tZW50IHZhcmlhYmxlc1xuICAgKi9cbiAgcHVibGljIGFzeW5jIHdpdGhFbnY8VD4oZW52OiBFbnYgPSB7fSwgYmxvY2s6ICgpID0+IFByb21pc2U8VD4pIHtcbiAgICBjb25zdCBvcmlnaW5hbEVudiA9IHByb2Nlc3MuZW52O1xuICAgIHRyeSB7XG4gICAgICBwcm9jZXNzLmVudiA9IHtcbiAgICAgICAgLi4ub3JpZ2luYWxFbnYsXG4gICAgICAgIC4uLmVudixcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiBhd2FpdCBibG9jaygpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBwcm9jZXNzLmVudiA9IG9yaWdpbmFsRW52O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW4gY29kZSB3aXRoIGNvbnRleHQgc2V0dXAgaW5zaWRlIHRoZSBlbnZpcm9ubWVudFxuICAgKi9cbiAgcHVibGljIGFzeW5jIHdpdGhDb250ZXh0PFQ+KFxuICAgIGlucHV0Q29udGV4dDogQ29udGV4dCxcbiAgICBlbnY6IEVudixcbiAgICBzeW50aE9wdHM6IEFwcFN5bnRoT3B0aW9ucyA9IHt9LFxuICAgIGJsb2NrOiAoZW52OiBFbnYsIGNvbnRleHQ6IENvbnRleHQpID0+IFByb21pc2U8VD4sXG4gICkge1xuICAgIGNvbnN0IGNvbnRleHQgPSBhd2FpdCBwcmVwYXJlQ29udGV4dChzeW50aE9wdHNEZWZhdWx0cyhzeW50aE9wdHMpLCBpbnB1dENvbnRleHQsIGVudiwgdGhpcy5kZWJ1Z0ZuKTtcbiAgICBsZXQgY29udGV4dE92ZXJmbG93TG9jYXRpb24gPSBudWxsO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGVudlZhcmlhYmxlU2l6ZUxpbWl0ID0gb3MucGxhdGZvcm0oKSA9PT0gJ3dpbjMyJyA/IDMyNzYwIDogMTMxMDcyO1xuICAgICAgY29uc3QgW3NtYWxsQ29udGV4dCwgb3ZlcmZsb3ddID0gc3BsaXRCeVNpemUoY29udGV4dCwgc3BhY2VBdmFpbGFibGVGb3JDb250ZXh0KGVudiwgZW52VmFyaWFibGVTaXplTGltaXQpKTtcblxuICAgICAgLy8gU3RvcmUgdGhlIHNhZmUgcGFydCBpbiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVcbiAgICAgIGVudltjeGFwaS5DT05URVhUX0VOVl0gPSBKU09OLnN0cmluZ2lmeShzbWFsbENvbnRleHQpO1xuXG4gICAgICAvLyBJZiB0aGVyZSB3YXMgYW55IG92ZXJmbG93LCB3cml0ZSBpdCB0byBhIHRlbXBvcmFyeSBmaWxlXG4gICAgICBpZiAoT2JqZWN0LmtleXMob3ZlcmZsb3cgPz8ge30pLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgY29udGV4dERpciA9IGZzLm1rZHRlbXBTeW5jKHBhdGguam9pbihvcy50bXBkaXIoKSwgJ2Nkay1jb250ZXh0JykpO1xuICAgICAgICBjb250ZXh0T3ZlcmZsb3dMb2NhdGlvbiA9IHBhdGguam9pbihjb250ZXh0RGlyLCAnY29udGV4dC1vdmVyZmxvdy5qc29uJyk7XG4gICAgICAgIGZzLndyaXRlSlNPTlN5bmMoY29udGV4dE92ZXJmbG93TG9jYXRpb24sIG92ZXJmbG93KTtcbiAgICAgICAgZW52W2N4YXBpLkNPTlRFWFRfT1ZFUkZMT1dfTE9DQVRJT05fRU5WXSA9IGNvbnRleHRPdmVyZmxvd0xvY2F0aW9uO1xuICAgICAgfVxuXG4gICAgICAvLyBjYWxsIHRoZSBibG9jayBjb2RlIHdpdGggbmV3IGVudmlyb25tZW50XG4gICAgICByZXR1cm4gYXdhaXQgYmxvY2soZW52LCBjb250ZXh0KTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaWYgKGNvbnRleHRPdmVyZmxvd0xvY2F0aW9uKSB7XG4gICAgICAgIGZzLnJlbW92ZVN5bmMocGF0aC5kaXJuYW1lKGNvbnRleHRPdmVyZmxvd0xvY2F0aW9uKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgZ2l2ZW4gYXNzZW1ibHkgc3VwcG9ydHMgY29udGV4dCBvdmVyZmxvdywgd2FybiBvdGhlcndpc2UuXG4gKlxuICogQHBhcmFtIGFzc2VtYmx5IHRoZSBhc3NlbWJseSB0byBjaGVja1xuICovXG5hc3luYyBmdW5jdGlvbiBjaGVja0NvbnRleHRPdmVyZmxvd1N1cHBvcnQoYXNzZW1ibHk6IGN4YXBpLkNsb3VkQXNzZW1ibHksIGlvSGVscGVyOiBJb0hlbHBlcik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB0cmFjZUZuID0gKG1zZzogc3RyaW5nKSA9PiBpb0hlbHBlci5ub3RpZnkoSU8uREVGQVVMVF9BU1NFTUJMWV9UUkFDRS5tc2cobXNnKSk7XG4gIGNvbnN0IHRyZWUgPSBhd2FpdCBsb2FkVHJlZShhc3NlbWJseSwgdHJhY2VGbik7XG4gIGNvbnN0IGZyYW1ld29ya0RvZXNOb3RTdXBwb3J0Q29udGV4dE92ZXJmbG93ID0gc29tZSh0cmVlLCBub2RlID0+IHtcbiAgICBjb25zdCBmcW4gPSBub2RlLmNvbnN0cnVjdEluZm8/LmZxbjtcbiAgICBjb25zdCB2ZXJzaW9uID0gbm9kZS5jb25zdHJ1Y3RJbmZvPy52ZXJzaW9uO1xuICAgIHJldHVybiAoZnFuID09PSAnYXdzLWNkay1saWIuQXBwJyAmJiB2ZXJzaW9uICE9IG51bGwgJiYgbHRlKHZlcnNpb24sICcyLjM4LjAnKSkgLy8gdjJcbiAgICB8fCBmcW4gPT09ICdAYXdzLWNkay9jb3JlLkFwcCc7IC8vIHYxXG4gIH0pO1xuXG4gIC8vIFdlJ3JlIGRlYWxpbmcgd2l0aCBhbiBvbGQgdmVyc2lvbiBvZiB0aGUgZnJhbWV3b3JrIGhlcmUuIEl0IGlzIHVuYXdhcmUgb2YgdGhlIHRlbXBvcmFyeVxuICAvLyBmaWxlLCB3aGljaCBtZWFucyB0aGF0IGl0IHdpbGwgaWdub3JlIHRoZSBjb250ZXh0IG92ZXJmbG93LlxuICBpZiAoZnJhbWV3b3JrRG9lc05vdFN1cHBvcnRDb250ZXh0T3ZlcmZsb3cpIHtcbiAgICBhd2FpdCBpb0hlbHBlci5ub3RpZnkoSU8uQ0RLX0FTU0VNQkxZX1cwMDEwLm1zZygnUGFydCBvZiB0aGUgY29udGV4dCBjb3VsZCBub3QgYmUgc2VudCB0byB0aGUgYXBwbGljYXRpb24uIFBsZWFzZSB1cGRhdGUgdGhlIEFXUyBDREsgbGlicmFyeSB0byB0aGUgbGF0ZXN0IHZlcnNpb24uJykpO1xuICB9XG59XG5cbi8qKlxuICogU2FmZWx5IGNyZWF0ZSBhbiBhc3NlbWJseSBmcm9tIGEgY2xvdWQgYXNzZW1ibHkgZGlyZWN0b3J5XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhc3NlbWJseUZyb21EaXJlY3RvcnkoYXNzZW1ibHlEaXI6IHN0cmluZywgaW9IZWxwZXI6IElvSGVscGVyLCBsb2FkT3B0aW9uczogTG9hZEFzc2VtYmx5T3B0aW9ucyA9IHt9KSB7XG4gIHRyeSB7XG4gICAgY29uc3QgYXNzZW1ibHkgPSBuZXcgY3hhcGkuQ2xvdWRBc3NlbWJseShhc3NlbWJseURpciwge1xuICAgICAgc2tpcFZlcnNpb25DaGVjazogIShsb2FkT3B0aW9ucy5jaGVja1ZlcnNpb24gPz8gdHJ1ZSksXG4gICAgICBza2lwRW51bUNoZWNrOiAhKGxvYWRPcHRpb25zLmNoZWNrRW51bXMgPz8gdHJ1ZSksXG4gICAgICAvLyBXZSBzb3J0IGFzIHdlIGRlcGxveVxuICAgICAgdG9wb1NvcnQ6IGZhbHNlLFxuICAgIH0pO1xuICAgIGF3YWl0IGNoZWNrQ29udGV4dE92ZXJmbG93U3VwcG9ydChhc3NlbWJseSwgaW9IZWxwZXIpO1xuICAgIHJldHVybiBhc3NlbWJseTtcbiAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICBpZiAoZXJyLm1lc3NhZ2UuaW5jbHVkZXMoY3hzY2hlbWEuVkVSU0lPTl9NSVNNQVRDSCkpIHtcbiAgICAgIC8vIHRoaXMgbWVhbnMgdGhlIENMSSB2ZXJzaW9uIGlzIHRvbyBvbGQuXG4gICAgICAvLyB3ZSBpbnN0cnVjdCB0aGUgdXNlciB0byB1cGdyYWRlLlxuICAgICAgY29uc3QgbWVzc2FnZSA9ICdUaGlzIEFXUyBDREsgVG9vbGtpdCBpcyBub3QgY29tcGF0aWJsZSB3aXRoIHRoZSBBV1MgQ0RLIGxpYnJhcnkgdXNlZCBieSB5b3VyIGFwcGxpY2F0aW9uLiBQbGVhc2UgdXBncmFkZSB0byB0aGUgbGF0ZXN0IHZlcnNpb24uJztcbiAgICAgIGF3YWl0IGlvSGVscGVyLm5vdGlmeShJTy5DREtfQVNTRU1CTFlfRTExMTEubXNnKG1lc3NhZ2UsIHsgZXJyb3I6IGVyciB9KSk7XG4gICAgICB0aHJvdyBuZXcgVG9vbGtpdEVycm9yKGAke21lc3NhZ2V9XFxuKCR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgfVxuICAgIHRocm93IGVycjtcbiAgfVxufVxuXG5mdW5jdGlvbiBzeW50aE9wdHNEZWZhdWx0cyhzeW50aE9wdHM6IEFwcFN5bnRoT3B0aW9ucyA9IHt9KTogU2V0dGluZ3Mge1xuICByZXR1cm4gbmV3IFNldHRpbmdzKHtcbiAgICBkZWJ1ZzogZmFsc2UsXG4gICAgcGF0aE1ldGFkYXRhOiB0cnVlLFxuICAgIHZlcnNpb25SZXBvcnRpbmc6IHRydWUsXG4gICAgYXNzZXRNZXRhZGF0YTogdHJ1ZSxcbiAgICBhc3NldFN0YWdpbmc6IHRydWUsXG4gICAgLi4uc3ludGhPcHRzLFxuICB9LCB0cnVlKTtcbn1cbiJdfQ==
@@ -0,0 +1,26 @@
1
+ import type * as cxapi from '@aws-cdk/cx-api';
2
+ import type { IReadLock } from '../../shared-private';
3
+ import type { IReadableCloudAssembly } from '../types';
4
+ export interface ReadableCloudAssemblyOptions {
5
+ /**
6
+ * Delete the Cloud Assembly directory when the object is disposed
7
+ *
8
+ * @default false
9
+ */
10
+ readonly deleteOnDispose?: boolean;
11
+ }
12
+ /**
13
+ * The canonical implementation of `IReadableCloudAssembly`
14
+ *
15
+ * Holds a read lock that is unlocked on disposal, as well as optionally deletes the
16
+ * cloud assembly directory.
17
+ */
18
+ export declare class ReadableCloudAssembly implements IReadableCloudAssembly {
19
+ readonly cloudAssembly: cxapi.CloudAssembly;
20
+ private readonly lock;
21
+ private readonly options?;
22
+ constructor(cloudAssembly: cxapi.CloudAssembly, lock: IReadLock, options?: ReadableCloudAssemblyOptions | undefined);
23
+ _unlock(): Promise<void>;
24
+ dispose(): Promise<void>;
25
+ [Symbol.asyncDispose](): Promise<void>;
26
+ }
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ReadableCloudAssembly = void 0;
4
+ const node_fs_1 = require("node:fs");
5
+ /**
6
+ * The canonical implementation of `IReadableCloudAssembly`
7
+ *
8
+ * Holds a read lock that is unlocked on disposal, as well as optionally deletes the
9
+ * cloud assembly directory.
10
+ */
11
+ class ReadableCloudAssembly {
12
+ cloudAssembly;
13
+ lock;
14
+ options;
15
+ constructor(cloudAssembly, lock, options) {
16
+ this.cloudAssembly = cloudAssembly;
17
+ this.lock = lock;
18
+ this.options = options;
19
+ }
20
+ async _unlock() {
21
+ return this.lock.release();
22
+ }
23
+ async dispose() {
24
+ await this.lock.release();
25
+ if (this.options?.deleteOnDispose) {
26
+ await node_fs_1.promises.rm(this.cloudAssembly.directory, { recursive: true, force: true });
27
+ }
28
+ }
29
+ [Symbol.asyncDispose]() {
30
+ return this.dispose();
31
+ }
32
+ }
33
+ exports.ReadableCloudAssembly = ReadableCloudAssembly;
34
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVhZGFibGUtYXNzZW1ibHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJyZWFkYWJsZS1hc3NlbWJseS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxxQ0FBeUM7QUFjekM7Ozs7O0dBS0c7QUFDSCxNQUFhLHFCQUFxQjtJQUVkO0lBQ0M7SUFDQTtJQUhuQixZQUNrQixhQUFrQyxFQUNqQyxJQUFlLEVBQ2YsT0FBc0M7UUFGdkMsa0JBQWEsR0FBYixhQUFhLENBQXFCO1FBQ2pDLFNBQUksR0FBSixJQUFJLENBQVc7UUFDZixZQUFPLEdBQVAsT0FBTyxDQUErQjtJQUV6RCxDQUFDO0lBRU0sS0FBSyxDQUFDLE9BQU87UUFDbEIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQzdCLENBQUM7SUFFTSxLQUFLLENBQUMsT0FBTztRQUNsQixNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDMUIsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLGVBQWUsRUFBRSxDQUFDO1lBQ2xDLE1BQU0sa0JBQUUsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQzlFLENBQUM7SUFDSCxDQUFDO0lBRU0sQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDO1FBQzFCLE9BQU8sSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ3hCLENBQUM7Q0FDRjtBQXRCRCxzREFzQkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBwcm9taXNlcyBhcyBmcyB9IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHR5cGUgKiBhcyBjeGFwaSBmcm9tICdAYXdzLWNkay9jeC1hcGknO1xuaW1wb3J0IHR5cGUgeyBJUmVhZExvY2sgfSBmcm9tICcuLi8uLi9zaGFyZWQtcHJpdmF0ZSc7XG5pbXBvcnQgdHlwZSB7IElSZWFkYWJsZUNsb3VkQXNzZW1ibHkgfSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVhZGFibGVDbG91ZEFzc2VtYmx5T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBEZWxldGUgdGhlIENsb3VkIEFzc2VtYmx5IGRpcmVjdG9yeSB3aGVuIHRoZSBvYmplY3QgaXMgZGlzcG9zZWRcbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGRlbGV0ZU9uRGlzcG9zZT86IGJvb2xlYW47XG59XG5cbi8qKlxuICogVGhlIGNhbm9uaWNhbCBpbXBsZW1lbnRhdGlvbiBvZiBgSVJlYWRhYmxlQ2xvdWRBc3NlbWJseWBcbiAqXG4gKiBIb2xkcyBhIHJlYWQgbG9jayB0aGF0IGlzIHVubG9ja2VkIG9uIGRpc3Bvc2FsLCBhcyB3ZWxsIGFzIG9wdGlvbmFsbHkgZGVsZXRlcyB0aGVcbiAqIGNsb3VkIGFzc2VtYmx5IGRpcmVjdG9yeS5cbiAqL1xuZXhwb3J0IGNsYXNzIFJlYWRhYmxlQ2xvdWRBc3NlbWJseSBpbXBsZW1lbnRzIElSZWFkYWJsZUNsb3VkQXNzZW1ibHkge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgcmVhZG9ubHkgY2xvdWRBc3NlbWJseTogY3hhcGkuQ2xvdWRBc3NlbWJseSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGxvY2s6IElSZWFkTG9jayxcbiAgICBwcml2YXRlIHJlYWRvbmx5IG9wdGlvbnM/OiBSZWFkYWJsZUNsb3VkQXNzZW1ibHlPcHRpb25zLFxuICApIHtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBfdW5sb2NrKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmxvY2sucmVsZWFzZSgpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGRpc3Bvc2UoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5sb2NrLnJlbGVhc2UoKTtcbiAgICBpZiAodGhpcy5vcHRpb25zPy5kZWxldGVPbkRpc3Bvc2UpIHtcbiAgICAgIGF3YWl0IGZzLnJtKHRoaXMuY2xvdWRBc3NlbWJseS5kaXJlY3RvcnksIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgW1N5bWJvbC5hc3luY0Rpc3Bvc2VdKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmRpc3Bvc2UoKTtcbiAgfVxufVxuIl19
@@ -3,6 +3,17 @@ import type { AssemblyBuilder } from '../source-builder';
3
3
  export declare abstract class CloudAssemblySourceBuilder {
4
4
  /**
5
5
  * Create a Cloud Assembly from a Cloud Assembly builder function.
6
+ *
7
+ * A temporary output directory will be created if no output directory is
8
+ * explicitly given. This directory will be cleaned up if synthesis fails, or
9
+ * when the Cloud Assembly produced by this source is disposed.
10
+ *
11
+ * A write lock will be acquired on the output directory for the duration of
12
+ * the CDK app synthesis (which means that no two apps can synthesize at the
13
+ * same time), and after synthesis a read lock will be acquired on the
14
+ * directory. This means that while the CloudAssembly is being used, no CDK
15
+ * app synthesis can take place into that directory.
16
+ *
6
17
  * @param builder the builder function
7
18
  * @param props additional configuration properties
8
19
  * @returns the CloudAssembly source
@@ -10,12 +21,28 @@ export declare abstract class CloudAssemblySourceBuilder {
10
21
  fromAssemblyBuilder(builder: AssemblyBuilder, props?: AssemblySourceProps): Promise<ICloudAssemblySource>;
11
22
  /**
12
23
  * Creates a Cloud Assembly from an existing assembly directory.
24
+ *
25
+ * A read lock will be acquired for the directory. This means that while
26
+ * the CloudAssembly is being used, no CDK app synthesis can take place into
27
+ * that directory.
28
+ *
13
29
  * @param directory the directory of a already produced Cloud Assembly.
14
30
  * @returns the CloudAssembly source
15
31
  */
16
32
  fromAssemblyDirectory(directory: string, props?: AssemblyDirectoryProps): Promise<ICloudAssemblySource>;
17
33
  /**
18
34
  * Use a directory containing an AWS CDK app as source.
35
+ *
36
+ * A temporary output directory will be created if no output directory is
37
+ * explicitly given. This directory will be cleaned up if synthesis fails, or
38
+ * when the Cloud Assembly produced by this source is disposed.
39
+ *
40
+ * A write lock will be acquired on the output directory for the duration of
41
+ * the CDK app synthesis (which means that no two apps can synthesize at the
42
+ * same time), and after synthesis a read lock will be acquired on the
43
+ * directory. This means that while the CloudAssembly is being used, no CDK
44
+ * app synthesis can take place into that directory.
45
+ *
19
46
  * @param props additional configuration properties
20
47
  * @returns the CloudAssembly source
21
48
  */