@aws-cdk/toolkit-lib 1.2.3 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/build-info.json +2 -2
  2. package/db.json.gz +0 -0
  3. package/lib/actions/diff/index.d.ts +7 -0
  4. package/lib/actions/diff/index.js +1 -1
  5. package/lib/actions/diff/private/helpers.js +7 -1
  6. package/lib/actions/refactor/index.d.ts +15 -34
  7. package/lib/actions/refactor/index.js +1 -54
  8. package/lib/actions/refactor/private/mapping-helpers.d.ts +11 -0
  9. package/lib/actions/refactor/private/mapping-helpers.js +44 -0
  10. package/lib/api/cloud-assembly/private/context-aware-source.js +3 -16
  11. package/lib/api/cloud-assembly/private/exec.js +12 -3
  12. package/lib/api/cloud-assembly/private/prepare-source.d.ts +29 -5
  13. package/lib/api/cloud-assembly/private/prepare-source.js +45 -20
  14. package/lib/api/cloud-assembly/source-builder.d.ts +11 -0
  15. package/lib/api/cloud-assembly/source-builder.js +11 -10
  16. package/lib/api/cloud-assembly/stack-collection.js +2 -1
  17. package/lib/api/diff/diff-formatter.d.ts +8 -0
  18. package/lib/api/diff/diff-formatter.js +29 -7
  19. package/lib/api/io/private/message-maker.d.ts +5 -5
  20. package/lib/api/io/private/messages.d.ts +1 -0
  21. package/lib/api/io/private/messages.js +6 -1
  22. package/lib/api/io/toolkit-action.d.ts +1 -1
  23. package/lib/api/io/toolkit-action.js +1 -1
  24. package/lib/api/refactoring/cloudformation.d.ts +1 -0
  25. package/lib/api/refactoring/cloudformation.js +6 -4
  26. package/lib/api/refactoring/context.d.ts +4 -5
  27. package/lib/api/refactoring/context.js +122 -52
  28. package/lib/api/refactoring/digest.d.ts +7 -12
  29. package/lib/api/refactoring/digest.js +22 -42
  30. package/lib/api/refactoring/graph.d.ts +6 -1
  31. package/lib/api/refactoring/graph.js +21 -8
  32. package/lib/api/refactoring/index.d.ts +13 -4
  33. package/lib/api/refactoring/index.js +38 -18
  34. package/lib/api/tree.js +1 -1
  35. package/lib/context-providers/cc-api-provider.js +23 -14
  36. package/lib/index_bg.wasm +0 -0
  37. package/lib/payloads/refactor.d.ts +1 -1
  38. package/lib/payloads/refactor.js +1 -1
  39. package/lib/payloads/stack-details.d.ts +4 -0
  40. package/lib/payloads/stack-details.js +1 -1
  41. package/lib/toolkit/toolkit.d.ts +6 -2
  42. package/lib/toolkit/toolkit.js +114 -79
  43. package/lib/toolkit/types.d.ts +7 -0
  44. package/lib/toolkit/types.js +1 -1
  45. package/lib/util/arrays.d.ts +1 -0
  46. package/lib/util/arrays.js +16 -1
  47. package/lib/util/sets.d.ts +5 -0
  48. package/lib/util/sets.js +18 -0
  49. package/package.json +9 -9
@@ -4,6 +4,7 @@ exports.RefactoringContext = void 0;
4
4
  const cloudformation_1 = require("./cloudformation");
5
5
  const digest_1 = require("./digest");
6
6
  const toolkit_error_1 = require("../../toolkit/toolkit-error");
7
+ const sets_1 = require("../../util/sets");
7
8
  /**
8
9
  * Encapsulates the information for refactoring resources in a single environment.
9
10
  */
@@ -13,19 +14,12 @@ class RefactoringContext {
13
14
  environment;
14
15
  constructor(props) {
15
16
  this.environment = props.environment;
16
- if (props.mappings != null) {
17
- this._mappings = props.mappings;
18
- }
19
- else {
20
- const moves = resourceMoves(props.deployedStacks, props.localStacks);
21
- this.ambiguousMoves = ambiguousMoves(moves);
22
- if (!this.isAmbiguous) {
23
- this._mappings = resourceMappings(resourceMoves(props.deployedStacks, props.localStacks), props.filteredStacks);
24
- }
25
- }
26
- }
27
- get isAmbiguous() {
28
- return this.ambiguousMoves.length > 0;
17
+ const moves = resourceMoves(props.deployedStacks, props.localStacks, 'direct', props.ignoreModifications);
18
+ const additionalOverrides = structuralOverrides(props.deployedStacks, props.localStacks);
19
+ const overrides = (props.overrides ?? []).concat(additionalOverrides);
20
+ const [nonAmbiguousMoves, ambiguousMoves] = partitionByAmbiguity(overrides, moves);
21
+ this.ambiguousMoves = ambiguousMoves;
22
+ this._mappings = resourceMappings(nonAmbiguousMoves);
29
23
  }
30
24
  get ambiguousPaths() {
31
25
  return this.ambiguousMoves.map(([a, b]) => [convert(a), convert(b)]);
@@ -34,19 +28,61 @@ class RefactoringContext {
34
28
  }
35
29
  }
36
30
  get mappings() {
37
- if (this.isAmbiguous) {
38
- throw new toolkit_error_1.ToolkitError('Cannot access mappings when there are ambiguous resource moves. Please resolve the ambiguity first.');
39
- }
40
31
  return this._mappings;
41
32
  }
42
33
  }
43
34
  exports.RefactoringContext = RefactoringContext;
44
- function resourceMoves(before, after) {
45
- return Object.values(removeUnmovedResources(zip(groupByKey(resourceDigests(before)), groupByKey(resourceDigests(after)))));
35
+ /**
36
+ * Generates an automatic list of overrides that can be deduced from the structure of the opposite resource graph.
37
+ * Suppose we have the following resource graph:
38
+ *
39
+ * A --> B
40
+ * C --> D
41
+ *
42
+ * such that B and D are identical, but A is different from C. Then digest(B) = digest(D). If both resources are moved,
43
+ * we have an ambiguity. But if we reverse the arrows:
44
+ *
45
+ * A <-- B
46
+ * C <-- D
47
+ *
48
+ * then digest(B) ≠ digest(D), because they now have different dependencies. If we compute the mappings from this
49
+ * opposite graph, we can use them as a set of overrides to disambiguate the original moves.
50
+ *
51
+ */
52
+ function structuralOverrides(deployedStacks, localStacks) {
53
+ const moves = resourceMoves(deployedStacks, localStacks, 'opposite', true);
54
+ const [nonAmbiguousMoves] = partitionByAmbiguity([], moves);
55
+ return resourceMappings(nonAmbiguousMoves);
56
+ }
57
+ function resourceMoves(before, after, direction = 'direct', ignoreModifications = false) {
58
+ const digestsBefore = resourceDigests(before, direction);
59
+ const digestsAfter = resourceDigests(after, direction);
60
+ const stackNames = (stacks) => stacks
61
+ .map((s) => s.stackName)
62
+ .sort()
63
+ .join(', ');
64
+ if (!(ignoreModifications || isomorphic(digestsBefore, digestsAfter))) {
65
+ const message = [
66
+ 'A refactor operation cannot add, remove or update resources. Only resource moves and renames are allowed. ',
67
+ "Run 'cdk diff' to compare the local templates to the deployed stacks.\n",
68
+ `Deployed stacks: ${stackNames(before)}`,
69
+ `Local stacks: ${stackNames(after)}`,
70
+ ];
71
+ throw new toolkit_error_1.ToolkitError(message.join('\n'));
72
+ }
73
+ return Object.values(removeUnmovedResources(zip(digestsBefore, digestsAfter)));
46
74
  }
47
- function removeUnmovedResources(m) {
75
+ /**
76
+ * Whether two sets of resources have the same elements (uniquely identified by the digest), and
77
+ * each element is in the same number of locations. The locations themselves may be different.
78
+ */
79
+ function isomorphic(a, b) {
80
+ const sameKeys = (0, sets_1.equalSets)(new Set(Object.keys(a)), new Set(Object.keys(b)));
81
+ return sameKeys && Object.entries(a).every(([digest, locations]) => locations.length === b[digest].length);
82
+ }
83
+ function removeUnmovedResources(moves) {
48
84
  const result = {};
49
- for (const [hash, [before, after]] of Object.entries(m)) {
85
+ for (const [hash, [before, after]] of Object.entries(moves)) {
50
86
  const common = before.filter((b) => after.some((a) => a.equalTo(b)));
51
87
  result[hash] = [
52
88
  before.filter((b) => !common.some((c) => b.equalTo(c))),
@@ -76,54 +112,88 @@ function zip(m1, m2) {
76
112
  }
77
113
  return result;
78
114
  }
79
- function groupByKey(entries) {
80
- const result = {};
81
- for (const [hash, location] of entries) {
82
- if (hash in result) {
83
- result[hash].push(location);
84
- }
85
- else {
86
- result[hash] = [location];
87
- }
88
- }
89
- return result;
90
- }
91
115
  /**
92
116
  * Computes a list of pairs [digest, location] for each resource in the stack.
93
117
  */
94
- function resourceDigests(stacks) {
118
+ function resourceDigests(stacks, direction) {
95
119
  // index stacks by name
96
120
  const stacksByName = new Map();
97
121
  for (const stack of stacks) {
98
122
  stacksByName.set(stack.stackName, stack);
99
123
  }
100
- const digests = (0, digest_1.computeResourceDigests)(stacks);
101
- return Object.entries(digests).map(([loc, digest]) => {
124
+ const digests = (0, digest_1.computeResourceDigests)(stacks, direction);
125
+ return groupByKey(Object.entries(digests).map(([loc, digest]) => {
102
126
  const [stackName, logicalId] = loc.split('.');
103
127
  const location = new cloudformation_1.ResourceLocation(stacksByName.get(stackName), logicalId);
104
128
  return [digest, location];
105
- });
129
+ }));
130
+ function groupByKey(entries) {
131
+ const result = {};
132
+ for (const [key, value] of entries) {
133
+ if (key in result) {
134
+ result[key].push(value);
135
+ }
136
+ else {
137
+ result[key] = [value];
138
+ }
139
+ }
140
+ return result;
141
+ }
106
142
  }
107
- function ambiguousMoves(movements) {
143
+ function isAmbiguousMove(move) {
144
+ const [pre, post] = move;
108
145
  // A move is considered ambiguous if two conditions are met:
109
146
  // 1. Both sides have at least one element (otherwise, it's just addition or deletion)
110
147
  // 2. At least one side has more than one element
111
- return movements
112
- .filter(([pre, post]) => pre.length > 0 && post.length > 0)
113
- .filter(([pre, post]) => pre.length > 1 || post.length > 1);
148
+ return pre.length > 0 && post.length > 0 && (pre.length > 1 || post.length > 1);
114
149
  }
115
- function resourceMappings(movements, stacks) {
116
- const stacksPredicate = stacks == null
117
- ? () => true
118
- : (m) => {
119
- // Any movement that involves one of the selected stacks (either moving from or to)
120
- // is considered a candidate for refactoring.
121
- const stackNames = [m.source.stack.stackName, m.destination.stack.stackName];
122
- return stacks.some((stack) => stackNames.includes(stack.stackName));
123
- };
150
+ function resourceMappings(movements) {
124
151
  return movements
125
152
  .filter(([pre, post]) => pre.length === 1 && post.length === 1 && !pre[0].equalTo(post[0]))
126
- .map(([pre, post]) => new cloudformation_1.ResourceMapping(pre[0], post[0]))
127
- .filter(stacksPredicate);
153
+ .map(([pre, post]) => new cloudformation_1.ResourceMapping(pre[0], post[0]));
154
+ }
155
+ /**
156
+ * Partitions a list of moves into non-ambiguous and ambiguous moves.
157
+ * @param overrides - The list of overrides to disambiguate moves
158
+ * @param moves - a pair of lists of moves. First: non-ambiguous, second: ambiguous
159
+ */
160
+ function partitionByAmbiguity(overrides, moves) {
161
+ const ambiguous = [];
162
+ const nonAmbiguous = [];
163
+ for (let move of moves) {
164
+ if (!isAmbiguousMove(move)) {
165
+ nonAmbiguous.push(move);
166
+ }
167
+ else {
168
+ for (const override of overrides) {
169
+ const resolvedMove = resolve(override, move);
170
+ if (resolvedMove != null) {
171
+ nonAmbiguous.push(resolvedMove);
172
+ move = remove(override, move);
173
+ }
174
+ }
175
+ // One last chance to be non-ambiguous
176
+ if (!isAmbiguousMove(move)) {
177
+ nonAmbiguous.push(move);
178
+ }
179
+ else {
180
+ ambiguous.push(move);
181
+ }
182
+ }
183
+ }
184
+ function resolve(override, move) {
185
+ const [pre, post] = move;
186
+ const source = pre.find((loc) => loc.equalTo(override.source));
187
+ const destination = post.find((loc) => loc.equalTo(override.destination));
188
+ return (source && destination) ? [[source], [destination]] : undefined;
189
+ }
190
+ function remove(override, move) {
191
+ const [pre, post] = move;
192
+ return [
193
+ pre.filter(loc => !loc.equalTo(override.source)),
194
+ post.filter(loc => !loc.equalTo(override.destination)),
195
+ ];
196
+ }
197
+ return [nonAmbiguous, ambiguous];
128
198
  }
129
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGV4dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImNvbnRleHQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBRUEscURBQXFFO0FBQ3JFLHFDQUFrRDtBQUNsRCwrREFBMkQ7QUFpQjNEOztHQUVHO0FBQ0gsTUFBYSxrQkFBa0I7SUFDWixTQUFTLEdBQXNCLEVBQUUsQ0FBQztJQUNsQyxjQUFjLEdBQW1CLEVBQUUsQ0FBQztJQUNyQyxXQUFXLENBQWM7SUFFekMsWUFBWSxLQUE2QjtRQUN2QyxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQyxXQUFXLENBQUM7UUFDckMsSUFBSSxLQUFLLENBQUMsUUFBUSxJQUFJLElBQUksRUFBRSxDQUFDO1lBQzNCLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQztRQUNsQyxDQUFDO2FBQU0sQ0FBQztZQUNOLE1BQU0sS0FBSyxHQUFHLGFBQWEsQ0FBQyxLQUFLLENBQUMsY0FBYyxFQUFFLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUNyRSxJQUFJLENBQUMsY0FBYyxHQUFHLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUU1QyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO2dCQUN0QixJQUFJLENBQUMsU0FBUyxHQUFHLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsY0FBYyxFQUFFLEtBQUssQ0FBQyxXQUFXLENBQUMsRUFBRSxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDbEgsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQsSUFBVyxXQUFXO1FBQ3BCLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFRCxJQUFXLGNBQWM7UUFDdkIsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRXJFLFNBQVMsT0FBTyxDQUFDLFNBQTZCO1lBQzVDLE9BQU8sU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDMUMsQ0FBQztJQUNILENBQUM7SUFFRCxJQUFXLFFBQVE7UUFDakIsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDckIsTUFBTSxJQUFJLDRCQUFZLENBQ3BCLHFHQUFxRyxDQUN0RyxDQUFDO1FBQ0osQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUN4QixDQUFDO0NBQ0Y7QUF2Q0QsZ0RBdUNDO0FBRUQsU0FBUyxhQUFhLENBQUMsTUFBNkIsRUFBRSxLQUE0QjtJQUNoRixPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQ2xCLHNCQUFzQixDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FDckcsQ0FBQztBQUNKLENBQUM7QUFFRCxTQUFTLHNCQUFzQixDQUFDLENBQStCO0lBQzdELE1BQU0sTUFBTSxHQUFpQyxFQUFFLENBQUM7SUFDaEQsS0FBSyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3hELE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3JFLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRztZQUNiLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3ZELEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ3ZELENBQUM7SUFDSixDQUFDO0lBRUQsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQVMsR0FBRyxDQUNWLEVBQXNDLEVBQ3RDLEVBQXNDO0lBRXRDLE1BQU0sTUFBTSxHQUFpQyxFQUFFLENBQUM7SUFFaEQsS0FBSyxNQUFNLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztRQUNuRCxJQUFJLElBQUksSUFBSSxFQUFFLEVBQUUsQ0FBQztZQUNmLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUN2QyxDQUFDO2FBQU0sQ0FBQztZQUNOLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNqQyxDQUFDO0lBQ0gsQ0FBQztJQUVELEtBQUssTUFBTSxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7UUFDbkQsSUFBSSxDQUFDLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDbEIsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ2pDLENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVELFNBQVMsVUFBVSxDQUFJLE9BQXNCO0lBQzNDLE1BQU0sTUFBTSxHQUF3QixFQUFFLENBQUM7SUFFdkMsS0FBSyxNQUFNLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQ3ZDLElBQUksSUFBSSxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQ25CLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDOUIsQ0FBQzthQUFNLENBQUM7WUFDTixNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM1QixDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFFRDs7R0FFRztBQUNILFNBQVMsZUFBZSxDQUFDLE1BQTZCO0lBQ3BELHVCQUF1QjtJQUN2QixNQUFNLFlBQVksR0FBRyxJQUFJLEdBQUcsRUFBK0IsQ0FBQztJQUM1RCxLQUFLLE1BQU0sS0FBSyxJQUFJLE1BQU0sRUFBRSxDQUFDO1FBQzNCLFlBQVksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBRUQsTUFBTSxPQUFPLEdBQUcsSUFBQSwrQkFBc0IsRUFBQyxNQUFNLENBQUMsQ0FBQztJQUUvQyxPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLEVBQUUsRUFBRTtRQUNuRCxNQUFNLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDOUMsTUFBTSxRQUFRLEdBQXFCLElBQUksaUNBQWdCLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUUsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUNqRyxPQUFPLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQzVCLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVELFNBQVMsY0FBYyxDQUFDLFNBQXlCO0lBQy9DLDREQUE0RDtJQUM1RCx1RkFBdUY7SUFDdkYsa0RBQWtEO0lBQ2xELE9BQU8sU0FBUztTQUNiLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztTQUMxRCxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNoRSxDQUFDO0FBRUQsU0FBUyxnQkFBZ0IsQ0FBQyxTQUF5QixFQUFFLE1BQThCO0lBQ2pGLE1BQU0sZUFBZSxHQUNuQixNQUFNLElBQUksSUFBSTtRQUNaLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJO1FBQ1osQ0FBQyxDQUFDLENBQUMsQ0FBa0IsRUFBRSxFQUFFO1lBQ3ZCLG1GQUFtRjtZQUNuRiw2Q0FBNkM7WUFDN0MsTUFBTSxVQUFVLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDN0UsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1FBQ3RFLENBQUMsQ0FBQztJQUVOLE9BQU8sU0FBUztTQUNiLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDMUYsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksZ0NBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDMUQsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0FBQzdCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEVudmlyb25tZW50IH0gZnJvbSAnQGF3cy1jZGsvY3gtYXBpJztcbmltcG9ydCB0eXBlIHsgQ2xvdWRGb3JtYXRpb25TdGFjayB9IGZyb20gJy4vY2xvdWRmb3JtYXRpb24nO1xuaW1wb3J0IHsgUmVzb3VyY2VMb2NhdGlvbiwgUmVzb3VyY2VNYXBwaW5nIH0gZnJvbSAnLi9jbG91ZGZvcm1hdGlvbic7XG5pbXBvcnQgeyBjb21wdXRlUmVzb3VyY2VEaWdlc3RzIH0gZnJvbSAnLi9kaWdlc3QnO1xuaW1wb3J0IHsgVG9vbGtpdEVycm9yIH0gZnJvbSAnLi4vLi4vdG9vbGtpdC90b29sa2l0LWVycm9yJztcblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgc2V0IG9mIHBvc3NpYmxlIG1vdmVzIG9mIGEgcmVzb3VyY2UgZnJvbSBvbmUgbG9jYXRpb25cbiAqIHRvIGFub3RoZXIuIEluIHRoZSBpZGVhbCBjYXNlLCB0aGVyZSBpcyBvbmx5IG9uZSBzb3VyY2UgYW5kIG9ubHkgb25lXG4gKiBkZXN0aW5hdGlvbi5cbiAqL1xudHlwZSBSZXNvdXJjZU1vdmUgPSBbUmVzb3VyY2VMb2NhdGlvbltdLCBSZXNvdXJjZUxvY2F0aW9uW11dO1xuXG5leHBvcnQgaW50ZXJmYWNlIFJlZmFjdG9yTWFuYWdlck9wdGlvbnMge1xuICBlbnZpcm9ubWVudDogRW52aXJvbm1lbnQ7XG4gIGxvY2FsU3RhY2tzOiBDbG91ZEZvcm1hdGlvblN0YWNrW107XG4gIGRlcGxveWVkU3RhY2tzOiBDbG91ZEZvcm1hdGlvblN0YWNrW107XG4gIG1hcHBpbmdzPzogUmVzb3VyY2VNYXBwaW5nW107XG4gIGZpbHRlcmVkU3RhY2tzPzogQ2xvdWRGb3JtYXRpb25TdGFja1tdO1xufVxuXG4vKipcbiAqIEVuY2Fwc3VsYXRlcyB0aGUgaW5mb3JtYXRpb24gZm9yIHJlZmFjdG9yaW5nIHJlc291cmNlcyBpbiBhIHNpbmdsZSBlbnZpcm9ubWVudC5cbiAqL1xuZXhwb3J0IGNsYXNzIFJlZmFjdG9yaW5nQ29udGV4dCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgX21hcHBpbmdzOiBSZXNvdXJjZU1hcHBpbmdbXSA9IFtdO1xuICBwcml2YXRlIHJlYWRvbmx5IGFtYmlndW91c01vdmVzOiBSZXNvdXJjZU1vdmVbXSA9IFtdO1xuICBwdWJsaWMgcmVhZG9ubHkgZW52aXJvbm1lbnQ6IEVudmlyb25tZW50O1xuXG4gIGNvbnN0cnVjdG9yKHByb3BzOiBSZWZhY3Rvck1hbmFnZXJPcHRpb25zKSB7XG4gICAgdGhpcy5lbnZpcm9ubWVudCA9IHByb3BzLmVudmlyb25tZW50O1xuICAgIGlmIChwcm9wcy5tYXBwaW5ncyAhPSBudWxsKSB7XG4gICAgICB0aGlzLl9tYXBwaW5ncyA9IHByb3BzLm1hcHBpbmdzO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBtb3ZlcyA9IHJlc291cmNlTW92ZXMocHJvcHMuZGVwbG95ZWRTdGFja3MsIHByb3BzLmxvY2FsU3RhY2tzKTtcbiAgICAgIHRoaXMuYW1iaWd1b3VzTW92ZXMgPSBhbWJpZ3VvdXNNb3Zlcyhtb3Zlcyk7XG5cbiAgICAgIGlmICghdGhpcy5pc0FtYmlndW91cykge1xuICAgICAgICB0aGlzLl9tYXBwaW5ncyA9IHJlc291cmNlTWFwcGluZ3MocmVzb3VyY2VNb3Zlcyhwcm9wcy5kZXBsb3llZFN0YWNrcywgcHJvcHMubG9jYWxTdGFja3MpLCBwcm9wcy5maWx0ZXJlZFN0YWNrcyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldCBpc0FtYmlndW91cygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5hbWJpZ3VvdXNNb3Zlcy5sZW5ndGggPiAwO1xuICB9XG5cbiAgcHVibGljIGdldCBhbWJpZ3VvdXNQYXRocygpOiBbc3RyaW5nW10sIHN0cmluZ1tdXVtdIHtcbiAgICByZXR1cm4gdGhpcy5hbWJpZ3VvdXNNb3Zlcy5tYXAoKFthLCBiXSkgPT4gW2NvbnZlcnQoYSksIGNvbnZlcnQoYildKTtcblxuICAgIGZ1bmN0aW9uIGNvbnZlcnQobG9jYXRpb25zOiBSZXNvdXJjZUxvY2F0aW9uW10pOiBzdHJpbmdbXSB7XG4gICAgICByZXR1cm4gbG9jYXRpb25zLm1hcCgobCkgPT4gbC50b1BhdGgoKSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldCBtYXBwaW5ncygpOiBSZXNvdXJjZU1hcHBpbmdbXSB7XG4gICAgaWYgKHRoaXMuaXNBbWJpZ3VvdXMpIHtcbiAgICAgIHRocm93IG5ldyBUb29sa2l0RXJyb3IoXG4gICAgICAgICdDYW5ub3QgYWNjZXNzIG1hcHBpbmdzIHdoZW4gdGhlcmUgYXJlIGFtYmlndW91cyByZXNvdXJjZSBtb3Zlcy4gUGxlYXNlIHJlc29sdmUgdGhlIGFtYmlndWl0eSBmaXJzdC4nLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX21hcHBpbmdzO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlc291cmNlTW92ZXMoYmVmb3JlOiBDbG91ZEZvcm1hdGlvblN0YWNrW10sIGFmdGVyOiBDbG91ZEZvcm1hdGlvblN0YWNrW10pOiBSZXNvdXJjZU1vdmVbXSB7XG4gIHJldHVybiBPYmplY3QudmFsdWVzKFxuICAgIHJlbW92ZVVubW92ZWRSZXNvdXJjZXMoemlwKGdyb3VwQnlLZXkocmVzb3VyY2VEaWdlc3RzKGJlZm9yZSkpLCBncm91cEJ5S2V5KHJlc291cmNlRGlnZXN0cyhhZnRlcikpKSksXG4gICk7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZVVubW92ZWRSZXNvdXJjZXMobTogUmVjb3JkPHN0cmluZywgUmVzb3VyY2VNb3ZlPik6IFJlY29yZDxzdHJpbmcsIFJlc291cmNlTW92ZT4ge1xuICBjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIFJlc291cmNlTW92ZT4gPSB7fTtcbiAgZm9yIChjb25zdCBbaGFzaCwgW2JlZm9yZSwgYWZ0ZXJdXSBvZiBPYmplY3QuZW50cmllcyhtKSkge1xuICAgIGNvbnN0IGNvbW1vbiA9IGJlZm9yZS5maWx0ZXIoKGIpID0+IGFmdGVyLnNvbWUoKGEpID0+IGEuZXF1YWxUbyhiKSkpO1xuICAgIHJlc3VsdFtoYXNoXSA9IFtcbiAgICAgIGJlZm9yZS5maWx0ZXIoKGIpID0+ICFjb21tb24uc29tZSgoYykgPT4gYi5lcXVhbFRvKGMpKSksXG4gICAgICBhZnRlci5maWx0ZXIoKGEpID0+ICFjb21tb24uc29tZSgoYykgPT4gYS5lcXVhbFRvKGMpKSksXG4gICAgXTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogRm9yIGVhY2ggaGFzaCwgaWRlbnRpZnlpbmcgYSBzaW5nbGUgcmVzb3VyY2UsIHppcCB0aGUgdHdvIGxpc3RzIG9mIGxvY2F0aW9ucyxcbiAqIHByb2R1Y2luZyBhIHJlc291cmNlIG1vdmVcbiAqL1xuZnVuY3Rpb24gemlwKFxuICBtMTogUmVjb3JkPHN0cmluZywgUmVzb3VyY2VMb2NhdGlvbltdPixcbiAgbTI6IFJlY29yZDxzdHJpbmcsIFJlc291cmNlTG9jYXRpb25bXT4sXG4pOiBSZWNvcmQ8c3RyaW5nLCBSZXNvdXJjZU1vdmU+IHtcbiAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCBSZXNvdXJjZU1vdmU+ID0ge307XG5cbiAgZm9yIChjb25zdCBbaGFzaCwgbG9jYXRpb25zXSBvZiBPYmplY3QuZW50cmllcyhtMSkpIHtcbiAgICBpZiAoaGFzaCBpbiBtMikge1xuICAgICAgcmVzdWx0W2hhc2hdID0gW2xvY2F0aW9ucywgbTJbaGFzaF1dO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHRbaGFzaF0gPSBbbG9jYXRpb25zLCBbXV07XG4gICAgfVxuICB9XG5cbiAgZm9yIChjb25zdCBbaGFzaCwgbG9jYXRpb25zXSBvZiBPYmplY3QuZW50cmllcyhtMikpIHtcbiAgICBpZiAoIShoYXNoIGluIG0xKSkge1xuICAgICAgcmVzdWx0W2hhc2hdID0gW1tdLCBsb2NhdGlvbnNdO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIGdyb3VwQnlLZXk8QT4oZW50cmllczogW3N0cmluZywgQV1bXSk6IFJlY29yZDxzdHJpbmcsIEFbXT4ge1xuICBjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIEFbXT4gPSB7fTtcblxuICBmb3IgKGNvbnN0IFtoYXNoLCBsb2NhdGlvbl0gb2YgZW50cmllcykge1xuICAgIGlmIChoYXNoIGluIHJlc3VsdCkge1xuICAgICAgcmVzdWx0W2hhc2hdLnB1c2gobG9jYXRpb24pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHRbaGFzaF0gPSBbbG9jYXRpb25dO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogQ29tcHV0ZXMgYSBsaXN0IG9mIHBhaXJzIFtkaWdlc3QsIGxvY2F0aW9uXSBmb3IgZWFjaCByZXNvdXJjZSBpbiB0aGUgc3RhY2suXG4gKi9cbmZ1bmN0aW9uIHJlc291cmNlRGlnZXN0cyhzdGFja3M6IENsb3VkRm9ybWF0aW9uU3RhY2tbXSk6IFtzdHJpbmcsIFJlc291cmNlTG9jYXRpb25dW10ge1xuICAvLyBpbmRleCBzdGFja3MgYnkgbmFtZVxuICBjb25zdCBzdGFja3NCeU5hbWUgPSBuZXcgTWFwPHN0cmluZywgQ2xvdWRGb3JtYXRpb25TdGFjaz4oKTtcbiAgZm9yIChjb25zdCBzdGFjayBvZiBzdGFja3MpIHtcbiAgICBzdGFja3NCeU5hbWUuc2V0KHN0YWNrLnN0YWNrTmFtZSwgc3RhY2spO1xuICB9XG5cbiAgY29uc3QgZGlnZXN0cyA9IGNvbXB1dGVSZXNvdXJjZURpZ2VzdHMoc3RhY2tzKTtcblxuICByZXR1cm4gT2JqZWN0LmVudHJpZXMoZGlnZXN0cykubWFwKChbbG9jLCBkaWdlc3RdKSA9PiB7XG4gICAgY29uc3QgW3N0YWNrTmFtZSwgbG9naWNhbElkXSA9IGxvYy5zcGxpdCgnLicpO1xuICAgIGNvbnN0IGxvY2F0aW9uOiBSZXNvdXJjZUxvY2F0aW9uID0gbmV3IFJlc291cmNlTG9jYXRpb24oc3RhY2tzQnlOYW1lLmdldChzdGFja05hbWUpISwgbG9naWNhbElkKTtcbiAgICByZXR1cm4gW2RpZ2VzdCwgbG9jYXRpb25dO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gYW1iaWd1b3VzTW92ZXMobW92ZW1lbnRzOiBSZXNvdXJjZU1vdmVbXSkge1xuICAvLyBBIG1vdmUgaXMgY29uc2lkZXJlZCBhbWJpZ3VvdXMgaWYgdHdvIGNvbmRpdGlvbnMgYXJlIG1ldDpcbiAgLy8gIDEuIEJvdGggc2lkZXMgaGF2ZSBhdCBsZWFzdCBvbmUgZWxlbWVudCAob3RoZXJ3aXNlLCBpdCdzIGp1c3QgYWRkaXRpb24gb3IgZGVsZXRpb24pXG4gIC8vICAyLiBBdCBsZWFzdCBvbmUgc2lkZSBoYXMgbW9yZSB0aGFuIG9uZSBlbGVtZW50XG4gIHJldHVybiBtb3ZlbWVudHNcbiAgICAuZmlsdGVyKChbcHJlLCBwb3N0XSkgPT4gcHJlLmxlbmd0aCA+IDAgJiYgcG9zdC5sZW5ndGggPiAwKVxuICAgIC5maWx0ZXIoKFtwcmUsIHBvc3RdKSA9PiBwcmUubGVuZ3RoID4gMSB8fCBwb3N0Lmxlbmd0aCA+IDEpO1xufVxuXG5mdW5jdGlvbiByZXNvdXJjZU1hcHBpbmdzKG1vdmVtZW50czogUmVzb3VyY2VNb3ZlW10sIHN0YWNrcz86IENsb3VkRm9ybWF0aW9uU3RhY2tbXSk6IFJlc291cmNlTWFwcGluZ1tdIHtcbiAgY29uc3Qgc3RhY2tzUHJlZGljYXRlID1cbiAgICBzdGFja3MgPT0gbnVsbFxuICAgICAgPyAoKSA9PiB0cnVlXG4gICAgICA6IChtOiBSZXNvdXJjZU1hcHBpbmcpID0+IHtcbiAgICAgICAgLy8gQW55IG1vdmVtZW50IHRoYXQgaW52b2x2ZXMgb25lIG9mIHRoZSBzZWxlY3RlZCBzdGFja3MgKGVpdGhlciBtb3ZpbmcgZnJvbSBvciB0bylcbiAgICAgICAgLy8gaXMgY29uc2lkZXJlZCBhIGNhbmRpZGF0ZSBmb3IgcmVmYWN0b3JpbmcuXG4gICAgICAgIGNvbnN0IHN0YWNrTmFtZXMgPSBbbS5zb3VyY2Uuc3RhY2suc3RhY2tOYW1lLCBtLmRlc3RpbmF0aW9uLnN0YWNrLnN0YWNrTmFtZV07XG4gICAgICAgIHJldHVybiBzdGFja3Muc29tZSgoc3RhY2spID0+IHN0YWNrTmFtZXMuaW5jbHVkZXMoc3RhY2suc3RhY2tOYW1lKSk7XG4gICAgICB9O1xuXG4gIHJldHVybiBtb3ZlbWVudHNcbiAgICAuZmlsdGVyKChbcHJlLCBwb3N0XSkgPT4gcHJlLmxlbmd0aCA9PT0gMSAmJiBwb3N0Lmxlbmd0aCA9PT0gMSAmJiAhcHJlWzBdLmVxdWFsVG8ocG9zdFswXSkpXG4gICAgLm1hcCgoW3ByZSwgcG9zdF0pID0+IG5ldyBSZXNvdXJjZU1hcHBpbmcocHJlWzBdLCBwb3N0WzBdKSlcbiAgICAuZmlsdGVyKHN0YWNrc1ByZWRpY2F0ZSk7XG59XG4iXX0=
199
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGV4dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImNvbnRleHQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBRUEscURBQXFFO0FBRXJFLHFDQUFrRDtBQUNsRCwrREFBMkQ7QUFDM0QsMENBQTRDO0FBaUI1Qzs7R0FFRztBQUNILE1BQWEsa0JBQWtCO0lBQ1osU0FBUyxHQUFzQixFQUFFLENBQUM7SUFDbEMsY0FBYyxHQUFtQixFQUFFLENBQUM7SUFDckMsV0FBVyxDQUFjO0lBRXpDLFlBQVksS0FBZ0M7UUFDMUMsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUMsV0FBVyxDQUFDO1FBQ3JDLE1BQU0sS0FBSyxHQUFHLGFBQWEsQ0FBQyxLQUFLLENBQUMsY0FBYyxFQUFFLEtBQUssQ0FBQyxXQUFXLEVBQUUsUUFBUSxFQUFFLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBQzFHLE1BQU0sbUJBQW1CLEdBQUcsbUJBQW1CLENBQUMsS0FBSyxDQUFDLGNBQWMsRUFBRSxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDekYsTUFBTSxTQUFTLEdBQUcsQ0FBQyxLQUFLLENBQUMsU0FBUyxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBQ3RFLE1BQU0sQ0FBQyxpQkFBaUIsRUFBRSxjQUFjLENBQUMsR0FBRyxvQkFBb0IsQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDbkYsSUFBSSxDQUFDLGNBQWMsR0FBRyxjQUFjLENBQUM7UUFFckMsSUFBSSxDQUFDLFNBQVMsR0FBRyxnQkFBZ0IsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFFRCxJQUFXLGNBQWM7UUFDdkIsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFB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QUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQy9ELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7UUFDMUUsT0FBTyxDQUFDLE1BQU0sSUFBSSxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQ3pFLENBQUM7SUFFRCxTQUFTLE1BQU0sQ0FBQyxRQUF5QixFQUFFLElBQWtCO1FBQzNELE1BQU0sQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDO1FBQ3pCLE9BQU87WUFDTCxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNoRCxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQztTQUN2RCxDQUFDO0lBQ0osQ0FBQztJQUVELE9BQU8sQ0FBQyxZQUFZLEVBQUUsU0FBUyxDQUFDLENBQUM7QUFDbkMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgRW52aXJvbm1lbnQgfSBmcm9tICdAYXdzLWNkay9jeC1hcGknO1xuaW1wb3J0IHR5cGUgeyBDbG91ZEZvcm1hdGlvblN0YWNrIH0gZnJvbSAnLi9jbG91ZGZvcm1hdGlvbic7XG5pbXBvcnQgeyBSZXNvdXJjZUxvY2F0aW9uLCBSZXNvdXJjZU1hcHBpbmcgfSBmcm9tICcuL2Nsb3VkZm9ybWF0aW9uJztcbmltcG9ydCB0eXBlIHsgR3JhcGhEaXJlY3Rpb24gfSBmcm9tICcuL2RpZ2VzdCc7XG5pbXBvcnQgeyBjb21wdXRlUmVzb3VyY2VEaWdlc3RzIH0gZnJvbSAnLi9kaWdlc3QnO1xuaW1wb3J0IHsgVG9vbGtpdEVycm9yIH0gZnJvbSAnLi4vLi4vdG9vbGtpdC90b29sa2l0LWVycm9yJztcbmltcG9ydCB7IGVxdWFsU2V0cyB9IGZyb20gJy4uLy4uL3V0aWwvc2V0cyc7XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIHNldCBvZiBwb3NzaWJsZSBtb3ZlcyBvZiBhIHJlc291cmNlIGZyb20gb25lIGxvY2F0aW9uXG4gKiB0byBhbm90aGVyLiBJbiB0aGUgaWRlYWwgY2FzZSwgdGhlcmUgaXMgb25seSBvbmUgc291cmNlIGFuZCBvbmx5IG9uZVxuICogZGVzdGluYXRpb24uXG4gKi9cbnR5cGUgUmVzb3VyY2VNb3ZlID0gW1Jlc291cmNlTG9jYXRpb25bXSwgUmVzb3VyY2VMb2NhdGlvbltdXTtcblxuZXhwb3J0IGludGVyZmFjZSBSZWZhY3RvcmluZ0NvbnRleHRPcHRpb25zIHtcbiAgZW52aXJvbm1lbnQ6IEVudmlyb25tZW50O1xuICBsb2NhbFN0YWNrczogQ2xvdWRGb3JtYXRpb25TdGFja1tdO1xuICBkZXBsb3llZFN0YWNrczogQ2xvdWRGb3JtYXRpb25TdGFja1tdO1xuICBvdmVycmlkZXM/OiBSZXNvdXJjZU1hcHBpbmdbXTtcbiAgaWdub3JlTW9kaWZpY2F0aW9ucz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogRW5jYXBzdWxhdGVzIHRoZSBpbmZvcm1hdGlvbiBmb3IgcmVmYWN0b3JpbmcgcmVzb3VyY2VzIGluIGEgc2luZ2xlIGVudmlyb25tZW50LlxuICovXG5leHBvcnQgY2xhc3MgUmVmYWN0b3JpbmdDb250ZXh0IHtcbiAgcHJpdmF0ZSByZWFkb25seSBfbWFwcGluZ3M6IFJlc291cmNlTWFwcGluZ1tdID0gW107XG4gIHByaXZhdGUgcmVhZG9ubHkgYW1iaWd1b3VzTW92ZXM6IFJlc291cmNlTW92ZVtdID0gW107XG4gIHB1YmxpYyByZWFkb25seSBlbnZpcm9ubWVudDogRW52aXJvbm1lbnQ7XG5cbiAgY29uc3RydWN0b3IocHJvcHM6IFJlZmFjdG9yaW5nQ29udGV4dE9wdGlvbnMpIHtcbiAgICB0aGlzLmVudmlyb25tZW50ID0gcHJvcHMuZW52aXJvbm1lbnQ7XG4gICAgY29uc3QgbW92ZXMgPSByZXNvdXJjZU1vdmVzKHByb3BzLmRlcGxveWVkU3RhY2tzLCBwcm9wcy5sb2NhbFN0YWNrcywgJ2RpcmVjdCcsIHByb3BzLmlnbm9yZU1vZGlmaWNhdGlvbnMpO1xuICAgIGNvbnN0IGFkZGl0aW9uYWxPdmVycmlkZXMgPSBzdHJ1Y3R1cmFsT3ZlcnJpZGVzKHByb3BzLmRlcGxveWVkU3RhY2tzLCBwcm9wcy5sb2NhbFN0YWNrcyk7XG4gICAgY29uc3Qgb3ZlcnJpZGVzID0gKHByb3BzLm92ZXJyaWRlcyA/PyBbXSkuY29uY2F0KGFkZGl0aW9uYWxPdmVycmlkZXMpO1xuICAgIGNvbnN0IFtub25BbWJpZ3VvdXNNb3ZlcywgYW1iaWd1b3VzTW92ZXNdID0gcGFydGl0aW9uQnlBbWJpZ3VpdHkob3ZlcnJpZGVzLCBtb3Zlcyk7XG4gICAgdGhpcy5hbWJpZ3VvdXNNb3ZlcyA9IGFtYmlndW91c01vdmVzO1xuXG4gICAgdGhpcy5fbWFwcGluZ3MgPSByZXNvdXJjZU1hcHBpbmdzKG5vbkFtYmlndW91c01vdmVzKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYW1iaWd1b3VzUGF0aHMoKTogW3N0cmluZ1tdLCBzdHJpbmdbXV1bXSB7XG4gICAgcmV0dXJuIHRoaXMuYW1iaWd1b3VzTW92ZXMubWFwKChbYSwgYl0pID0+IFtjb252ZXJ0KGEpLCBjb252ZXJ0KGIpXSk7XG5cbiAgICBmdW5jdGlvbiBjb252ZXJ0KGxvY2F0aW9uczogUmVzb3VyY2VMb2NhdGlvbltdKTogc3RyaW5nW10ge1xuICAgICAgcmV0dXJuIGxvY2F0aW9ucy5tYXAoKGwpID0+IGwudG9QYXRoKCkpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXQgbWFwcGluZ3MoKTogUmVzb3VyY2VNYXBwaW5nW10ge1xuICAgIHJldHVybiB0aGlzLl9tYXBwaW5ncztcbiAgfVxufVxuXG4vKipcbiAqIEdlbmVyYXRlcyBhbiBhdXRvbWF0aWMgbGlzdCBvZiBvdmVycmlkZXMgdGhhdCBjYW4gYmUgZGVkdWNlZCBmcm9tIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIG9wcG9zaXRlIHJlc291cmNlIGdyYXBoLlxuICogU3VwcG9zZSB3ZSBoYXZlIHRoZSBmb2xsb3dpbmcgcmVzb3VyY2UgZ3JhcGg6XG4gKlxuICogICAgIEEgLS0+IEJcbiAqICAgICBDIC0tPiBEXG4gKlxuICogc3VjaCB0aGF0IEIgYW5kIEQgYXJlIGlkZW50aWNhbCwgYnV0IEEgaXMgZGlmZmVyZW50IGZyb20gQy4gVGhlbiBkaWdlc3QoQikgPSBkaWdlc3QoRCkuIElmIGJvdGggcmVzb3VyY2VzIGFyZSBtb3ZlZCxcbiAqIHdlIGhhdmUgYW4gYW1iaWd1aXR5LiBCdXQgaWYgd2UgcmV2ZXJzZSB0aGUgYXJyb3dzOlxuICpcbiAqICAgICBBIDwtLSBCXG4gKiAgICAgQyA8LS0gRFxuICpcbiAqIHRoZW4gZGlnZXN0KEIpIOKJoCBkaWdlc3QoRCksIGJlY2F1c2UgdGhleSBub3cgaGF2ZSBkaWZmZXJlbnQgZGVwZW5kZW5jaWVzLiBJZiB3ZSBjb21wdXRlIHRoZSBtYXBwaW5ncyBmcm9tIHRoaXNcbiAqIG9wcG9zaXRlIGdyYXBoLCB3ZSBjYW4gdXNlIHRoZW0gYXMgYSBzZXQgb2Ygb3ZlcnJpZGVzIHRvIGRpc2FtYmlndWF0ZSB0aGUgb3JpZ2luYWwgbW92ZXMuXG4gKlxuICovXG5mdW5jdGlvbiBzdHJ1Y3R1cmFsT3ZlcnJpZGVzKGRlcGxveWVkU3RhY2tzOiBDbG91ZEZvcm1hdGlvblN0YWNrW10sIGxvY2FsU3RhY2tzOiBDbG91ZEZvcm1hdGlvblN0YWNrW10pOiBSZXNvdXJjZU1hcHBpbmdbXSB7XG4gIGNvbnN0IG1vdmVzID0gcmVzb3VyY2VNb3ZlcyhkZXBsb3llZFN0YWNrcywgbG9jYWxTdGFja3MsICdvcHBvc2l0ZScsIHRydWUpO1xuICBjb25zdCBbbm9uQW1iaWd1b3VzTW92ZXNdID0gcGFydGl0aW9uQnlBbWJpZ3VpdHkoW10sIG1vdmVzKTtcbiAgcmV0dXJuIHJlc291cmNlTWFwcGluZ3Mobm9uQW1iaWd1b3VzTW92ZXMpO1xufVxuXG5mdW5jdGlvbiByZXNvdXJjZU1vdmVzKFxuICBiZWZvcmU6IENsb3VkRm9ybWF0aW9uU3RhY2tbXSxcbiAgYWZ0ZXI6IENsb3VkRm9ybWF0aW9uU3RhY2tbXSxcbiAgZGlyZWN0aW9uOiBHcmFwaERpcmVjdGlvbiA9ICdkaXJlY3QnLFxuICBpZ25vcmVNb2RpZmljYXRpb25zOiBib29sZWFuID0gZmFsc2UpOiBSZXNvdXJjZU1vdmVbXSB7XG4gIGNvbnN0IGRpZ2VzdHNCZWZvcmUgPSByZXNvdXJjZURpZ2VzdHMoYmVmb3JlLCBkaXJlY3Rpb24pO1xuICBjb25zdCBkaWdlc3RzQWZ0ZXIgPSByZXNvdXJjZURpZ2VzdHMoYWZ0ZXIsIGRpcmVjdGlvbik7XG5cbiAgY29uc3Qgc3RhY2tOYW1lcyA9IChzdGFja3M6IENsb3VkRm9ybWF0aW9uU3RhY2tbXSkgPT5cbiAgICBzdGFja3NcbiAgICAgIC5tYXAoKHMpID0+IHMuc3RhY2tOYW1lKVxuICAgICAgLnNvcnQoKVxuICAgICAgLmpvaW4oJywgJyk7XG4gIGlmICghKGlnbm9yZU1vZGlmaWNhdGlvbnMgfHwgaXNvbW9ycGhpYyhkaWdlc3RzQmVmb3JlLCBkaWdlc3RzQWZ0ZXIpKSkge1xuICAgIGNvbnN0IG1lc3NhZ2UgPSBbXG4gICAgICAnQSByZWZhY3RvciBvcGVyYXRpb24gY2Fubm90IGFkZCwgcmVtb3ZlIG9yIHVwZGF0ZSByZXNvdXJjZXMuIE9ubHkgcmVzb3VyY2UgbW92ZXMgYW5kIHJlbmFtZXMgYXJlIGFsbG93ZWQuICcsXG4gICAgICBcIlJ1biAnY2RrIGRpZmYnIHRvIGNvbXBhcmUgdGhlIGxvY2FsIHRlbXBsYXRlcyB0byB0aGUgZGVwbG95ZWQgc3RhY2tzLlxcblwiLFxuICAgICAgYERlcGxveWVkIHN0YWNrczogJHtzdGFja05hbWVzKGJlZm9yZSl9YCxcbiAgICAgIGBMb2NhbCBzdGFja3M6ICR7c3RhY2tOYW1lcyhhZnRlcil9YCxcbiAgICBdO1xuXG4gICAgdGhyb3cgbmV3IFRvb2xraXRFcnJvcihtZXNzYWdlLmpvaW4oJ1xcbicpKTtcbiAgfVxuXG4gIHJldHVybiBPYmplY3QudmFsdWVzKHJlbW92ZVVubW92ZWRSZXNvdXJjZXMoemlwKGRpZ2VzdHNCZWZvcmUsIGRpZ2VzdHNBZnRlcikpKTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIHR3byBzZXRzIG9mIHJlc291cmNlcyBoYXZlIHRoZSBzYW1lIGVsZW1lbnRzICh1bmlxdWVseSBpZGVudGlmaWVkIGJ5IHRoZSBkaWdlc3QpLCBhbmRcbiAqIGVhY2ggZWxlbWVudCBpcyBpbiB0aGUgc2FtZSBudW1iZXIgb2YgbG9jYXRpb25zLiBUaGUgbG9jYXRpb25zIHRoZW1zZWx2ZXMgbWF5IGJlIGRpZmZlcmVudC5cbiAqL1xuZnVuY3Rpb24gaXNvbW9ycGhpYyhhOiBSZWNvcmQ8c3RyaW5nLCBSZXNvdXJjZUxvY2F0aW9uW10+LCBiOiBSZWNvcmQ8c3RyaW5nLCBSZXNvdXJjZUxvY2F0aW9uW10+KTogYm9vbGVhbiB7XG4gIGNvbnN0IHNhbWVLZXlzID0gZXF1YWxTZXRzKG5ldyBTZXQoT2JqZWN0LmtleXMoYSkpLCBuZXcgU2V0KE9iamVjdC5rZXlzKGIpKSk7XG4gIHJldHVybiBzYW1lS2V5cyAmJiBPYmplY3QuZW50cmllcyhhKS5ldmVyeSgoW2RpZ2VzdCwgbG9jYXRpb25zXSkgPT4gbG9jYXRpb25zLmxlbmd0aCA9PT0gYltkaWdlc3RdLmxlbmd0aCk7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZVVubW92ZWRSZXNvdXJjZXMobW92ZXM6IFJlY29yZDxzdHJpbmcsIFJlc291cmNlTW92ZT4pOiBSZWNvcmQ8c3RyaW5nLCBSZXNvdXJjZU1vdmU+IHtcbiAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCBSZXNvdXJjZU1vdmU+ID0ge307XG4gIGZvciAoY29uc3QgW2hhc2gsIFtiZWZvcmUsIGFmdGVyXV0gb2YgT2JqZWN0LmVudHJpZXMobW92ZXMpKSB7XG4gICAgY29uc3QgY29tbW9uID0gYmVmb3JlLmZpbHRlcigoYikgPT4gYWZ0ZXIuc29tZSgoYSkgPT4gYS5lcXVhbFRvKGIpKSk7XG4gICAgcmVzdWx0W2hhc2hdID0gW1xuICAgICAgYmVmb3JlLmZpbHRlcigoYikgPT4gIWNvbW1vbi5zb21lKChjKSA9PiBiLmVxdWFsVG8oYykpKSxcbiAgICAgIGFmdGVyLmZpbHRlcigoYSkgPT4gIWNvbW1vbi5zb21lKChjKSA9PiBhLmVxdWFsVG8oYykpKSxcbiAgICBdO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBGb3IgZWFjaCBoYXNoLCBpZGVudGlmeWluZyBhIHNpbmdsZSByZXNvdXJjZSwgemlwIHRoZSB0d28gbGlzdHMgb2YgbG9jYXRpb25zLFxuICogcHJvZHVjaW5nIGEgcmVzb3VyY2UgbW92ZVxuICovXG5mdW5jdGlvbiB6aXAoXG4gIG0xOiBSZWNvcmQ8c3RyaW5nLCBSZXNvdXJjZUxvY2F0aW9uW10+LFxuICBtMjogUmVjb3JkPHN0cmluZywgUmVzb3VyY2VMb2NhdGlvbltdPixcbik6IFJlY29yZDxzdHJpbmcsIFJlc291cmNlTW92ZT4ge1xuICBjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIFJlc291cmNlTW92ZT4gPSB7fTtcblxuICBmb3IgKGNvbnN0IFtoYXNoLCBsb2NhdGlvbnNdIG9mIE9iamVjdC5lbnRyaWVzKG0xKSkge1xuICAgIGlmIChoYXNoIGluIG0yKSB7XG4gICAgICByZXN1bHRbaGFzaF0gPSBbbG9jYXRpb25zLCBtMltoYXNoXV07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdFtoYXNoXSA9IFtsb2NhdGlvbnMsIFtdXTtcbiAgICB9XG4gIH1cblxuICBmb3IgKGNvbnN0IFtoYXNoLCBsb2NhdGlvbnNdIG9mIE9iamVjdC5lbnRyaWVzKG0yKSkge1xuICAgIGlmICghKGhhc2ggaW4gbTEpKSB7XG4gICAgICByZXN1bHRbaGFzaF0gPSBbW10sIGxvY2F0aW9uc107XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBDb21wdXRlcyBhIGxpc3Qgb2YgcGFpcnMgW2RpZ2VzdCwgbG9jYXRpb25dIGZvciBlYWNoIHJlc291cmNlIGluIHRoZSBzdGFjay5cbiAqL1xuZnVuY3Rpb24gcmVzb3VyY2VEaWdlc3RzKHN0YWNrczogQ2xvdWRGb3JtYXRpb25TdGFja1tdLCBkaXJlY3Rpb246IEdyYXBoRGlyZWN0aW9uKTogUmVjb3JkPHN0cmluZywgUmVzb3VyY2VMb2NhdGlvbltdPiB7XG4gIC8vIGluZGV4IHN0YWNrcyBieSBuYW1lXG4gIGNvbnN0IHN0YWNrc0J5TmFtZSA9IG5ldyBNYXA8c3RyaW5nLCBDbG91ZEZvcm1hdGlvblN0YWNrPigpO1xuICBmb3IgKGNvbnN0IHN0YWNrIG9mIHN0YWNrcykge1xuICAgIHN0YWNrc0J5TmFtZS5zZXQoc3RhY2suc3RhY2tOYW1lLCBzdGFjayk7XG4gIH1cblxuICBjb25zdCBkaWdlc3RzID0gY29tcHV0ZVJlc291cmNlRGlnZXN0cyhzdGFja3MsIGRpcmVjdGlvbik7XG5cbiAgcmV0dXJuIGdyb3VwQnlLZXkoXG4gICAgT2JqZWN0LmVudHJpZXMoZGlnZXN0cykubWFwKChbbG9jLCBkaWdlc3RdKSA9PiB7XG4gICAgICBjb25zdCBbc3RhY2tOYW1lLCBsb2dpY2FsSWRdID0gbG9jLnNwbGl0KCcuJyk7XG4gICAgICBjb25zdCBsb2NhdGlvbjogUmVzb3VyY2VMb2NhdGlvbiA9IG5ldyBSZXNvdXJjZUxvY2F0aW9uKHN0YWNrc0J5TmFtZS5nZXQoc3RhY2tOYW1lKSEsIGxvZ2ljYWxJZCk7XG4gICAgICByZXR1cm4gW2RpZ2VzdCwgbG9jYXRpb25dO1xuICAgIH0pLFxuICApO1xuXG4gIGZ1bmN0aW9uIGdyb3VwQnlLZXk8QT4oZW50cmllczogW3N0cmluZywgQV1bXSk6IFJlY29yZDxzdHJpbmcsIEFbXT4ge1xuICAgIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgQVtdPiA9IHt9O1xuXG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgZW50cmllcykge1xuICAgICAgaWYgKGtleSBpbiByZXN1bHQpIHtcbiAgICAgICAgcmVzdWx0W2tleV0ucHVzaCh2YWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHRba2V5XSA9IFt2YWx1ZV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc0FtYmlndW91c01vdmUobW92ZTogUmVzb3VyY2VNb3ZlKTogYm9vbGVhbiB7XG4gIGNvbnN0IFtwcmUsIHBvc3RdID0gbW92ZTtcblxuICAvLyBBIG1vdmUgaXMgY29uc2lkZXJlZCBhbWJpZ3VvdXMgaWYgdHdvIGNvbmRpdGlvbnMgYXJlIG1ldDpcbiAgLy8gIDEuIEJvdGggc2lkZXMgaGF2ZSBhdCBsZWFzdCBvbmUgZWxlbWVudCAob3RoZXJ3aXNlLCBpdCdzIGp1c3QgYWRkaXRpb24gb3IgZGVsZXRpb24pXG4gIC8vICAyLiBBdCBsZWFzdCBvbmUgc2lkZSBoYXMgbW9yZSB0aGFuIG9uZSBlbGVtZW50XG4gIHJldHVybiBwcmUubGVuZ3RoID4gMCAmJiBwb3N0Lmxlbmd0aCA+IDAgJiYgKHByZS5sZW5ndGggPiAxIHx8IHBvc3QubGVuZ3RoID4gMSk7XG59XG5cbmZ1bmN0aW9uIHJlc291cmNlTWFwcGluZ3MobW92ZW1lbnRzOiBSZXNvdXJjZU1vdmVbXSk6IFJlc291cmNlTWFwcGluZ1tdIHtcbiAgcmV0dXJuIG1vdmVtZW50c1xuICAgIC5maWx0ZXIoKFtwcmUsIHBvc3RdKSA9PiBwcmUubGVuZ3RoID09PSAxICYmIHBvc3QubGVuZ3RoID09PSAxICYmICFwcmVbMF0uZXF1YWxUbyhwb3N0WzBdKSlcbiAgICAubWFwKChbcHJlLCBwb3N0XSkgPT4gbmV3IFJlc291cmNlTWFwcGluZyhwcmVbMF0sIHBvc3RbMF0pKTtcbn1cblxuLyoqXG4gKiBQYXJ0aXRpb25zIGEgbGlzdCBvZiBtb3ZlcyBpbnRvIG5vbi1hbWJpZ3VvdXMgYW5kIGFtYmlndW91cyBtb3Zlcy5cbiAqIEBwYXJhbSBvdmVycmlkZXMgLSBUaGUgbGlzdCBvZiBvdmVycmlkZXMgdG8gZGlzYW1iaWd1YXRlIG1vdmVzXG4gKiBAcGFyYW0gbW92ZXMgLSBhIHBhaXIgb2YgbGlzdHMgb2YgbW92ZXMuIEZpcnN0OiBub24tYW1iaWd1b3VzLCBzZWNvbmQ6IGFtYmlndW91c1xuICovXG5mdW5jdGlvbiBwYXJ0aXRpb25CeUFtYmlndWl0eShvdmVycmlkZXM6IFJlc291cmNlTWFwcGluZ1tdLCBtb3ZlczogUmVzb3VyY2VNb3ZlW10pOiBbUmVzb3VyY2VNb3ZlW10sIFJlc291cmNlTW92ZVtdXSB7XG4gIGNvbnN0IGFtYmlndW91czogUmVzb3VyY2VNb3ZlW10gPSBbXTtcbiAgY29uc3Qgbm9uQW1iaWd1b3VzOiBSZXNvdXJjZU1vdmVbXSA9IFtdO1xuXG4gIGZvciAobGV0IG1vdmUgb2YgbW92ZXMpIHtcbiAgICBpZiAoIWlzQW1iaWd1b3VzTW92ZShtb3ZlKSkge1xuICAgICAgbm9uQW1iaWd1b3VzLnB1c2gobW92ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAoY29uc3Qgb3ZlcnJpZGUgb2Ygb3ZlcnJpZGVzKSB7XG4gICAgICAgIGNvbnN0IHJlc29sdmVkTW92ZSA9IHJlc29sdmUob3ZlcnJpZGUsIG1vdmUpO1xuICAgICAgICBpZiAocmVzb2x2ZWRNb3ZlICE9IG51bGwpIHtcbiAgICAgICAgICBub25BbWJpZ3VvdXMucHVzaChyZXNvbHZlZE1vdmUpO1xuICAgICAgICAgIG1vdmUgPSByZW1vdmUob3ZlcnJpZGUsIG1vdmUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBPbmUgbGFzdCBjaGFuY2UgdG8gYmUgbm9uLWFtYmlndW91c1xuICAgICAgaWYgKCFpc0FtYmlndW91c01vdmUobW92ZSkpIHtcbiAgICAgICAgbm9uQW1iaWd1b3VzLnB1c2gobW92ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhbWJpZ3VvdXMucHVzaChtb3ZlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiByZXNvbHZlKG92ZXJyaWRlOiBSZXNvdXJjZU1hcHBpbmcsIG1vdmU6IFJlc291cmNlTW92ZSk6IFJlc291cmNlTW92ZSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgW3ByZSwgcG9zdF0gPSBtb3ZlO1xuICAgIGNvbnN0IHNvdXJjZSA9IHByZS5maW5kKChsb2MpID0+IGxvYy5lcXVhbFRvKG92ZXJyaWRlLnNvdXJjZSkpO1xuICAgIGNvbnN0IGRlc3RpbmF0aW9uID0gcG9zdC5maW5kKChsb2MpID0+IGxvYy5lcXVhbFRvKG92ZXJyaWRlLmRlc3RpbmF0aW9uKSk7XG4gICAgcmV0dXJuIChzb3VyY2UgJiYgZGVzdGluYXRpb24pID8gW1tzb3VyY2VdLCBbZGVzdGluYXRpb25dXSA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlbW92ZShvdmVycmlkZTogUmVzb3VyY2VNYXBwaW5nLCBtb3ZlOiBSZXNvdXJjZU1vdmUpOiBSZXNvdXJjZU1vdmUge1xuICAgIGNvbnN0IFtwcmUsIHBvc3RdID0gbW92ZTtcbiAgICByZXR1cm4gW1xuICAgICAgcHJlLmZpbHRlcihsb2MgPT4gIWxvYy5lcXVhbFRvKG92ZXJyaWRlLnNvdXJjZSkpLFxuICAgICAgcG9zdC5maWx0ZXIobG9jID0+ICFsb2MuZXF1YWxUbyhvdmVycmlkZS5kZXN0aW5hdGlvbikpLFxuICAgIF07XG4gIH1cblxuICByZXR1cm4gW25vbkFtYmlndW91cywgYW1iaWd1b3VzXTtcbn1cbiJdfQ==
@@ -1,27 +1,22 @@
1
1
  import type { CloudFormationStack } from './cloudformation';
2
+ export type GraphDirection = 'direct' | 'opposite';
2
3
  /**
3
4
  * Computes the digest for each resource in the template.
4
5
  *
5
6
  * Conceptually, the digest is computed as:
6
7
  *
7
- * d(resource) = hash(type + physicalId) , if physicalId is defined
8
- * = hash(type + properties + dependencies.map(d)) , otherwise
8
+ * digest(resource) = hash(type + properties + dependencies.map(d))
9
9
  *
10
- * where `hash` is a cryptographic hash function. In other words, if a resource has
11
- * a physical ID, we use the physical ID plus its type to uniquely identify
12
- * that resource. In this case, the digest can be computed from these two fields
13
- * alone. A corollary is that such resources can be renamed and have their
14
- * properties updated at the same time, and still be considered equivalent.
15
- *
16
- * Otherwise, the digest is computed from its type, its own properties (that is,
17
- * excluding properties that refer to other resources), and the digests of each of
18
- * its dependencies.
10
+ * where `hash` is a cryptographic hash function. In other words, the digest of a
11
+ * resource is computed from its type, its own properties (that is, excluding
12
+ * properties that refer to other resources), and the digests of each of its
13
+ * dependencies.
19
14
  *
20
15
  * The digest of a resource, defined recursively this way, remains stable even if
21
16
  * one or more of its dependencies gets renamed. Since the resources in a
22
17
  * CloudFormation template form a directed acyclic graph, this function is
23
18
  * well-defined.
24
19
  */
25
- export declare function computeResourceDigests(stacks: CloudFormationStack[]): Record<string, string>;
20
+ export declare function computeResourceDigests(stacks: CloudFormationStack[], direction?: GraphDirection): Record<string, string>;
26
21
  export declare function hashObject(obj: any): string;
27
22
  //# sourceMappingURL=digest.d.ts.map
@@ -3,63 +3,46 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.computeResourceDigests = computeResourceDigests;
4
4
  exports.hashObject = hashObject;
5
5
  const crypto = require("node:crypto");
6
- const util_1 = require("@aws-cdk/cloudformation-diff/lib/diff/util");
7
6
  const graph_1 = require("./graph");
8
7
  /**
9
8
  * Computes the digest for each resource in the template.
10
9
  *
11
10
  * Conceptually, the digest is computed as:
12
11
  *
13
- * d(resource) = hash(type + physicalId) , if physicalId is defined
14
- * = hash(type + properties + dependencies.map(d)) , otherwise
12
+ * digest(resource) = hash(type + properties + dependencies.map(d))
15
13
  *
16
- * where `hash` is a cryptographic hash function. In other words, if a resource has
17
- * a physical ID, we use the physical ID plus its type to uniquely identify
18
- * that resource. In this case, the digest can be computed from these two fields
19
- * alone. A corollary is that such resources can be renamed and have their
20
- * properties updated at the same time, and still be considered equivalent.
21
- *
22
- * Otherwise, the digest is computed from its type, its own properties (that is,
23
- * excluding properties that refer to other resources), and the digests of each of
24
- * its dependencies.
14
+ * where `hash` is a cryptographic hash function. In other words, the digest of a
15
+ * resource is computed from its type, its own properties (that is, excluding
16
+ * properties that refer to other resources), and the digests of each of its
17
+ * dependencies.
25
18
  *
26
19
  * The digest of a resource, defined recursively this way, remains stable even if
27
20
  * one or more of its dependencies gets renamed. Since the resources in a
28
21
  * CloudFormation template form a directed acyclic graph, this function is
29
22
  * well-defined.
30
23
  */
31
- function computeResourceDigests(stacks) {
24
+ function computeResourceDigests(stacks, direction = 'direct') {
32
25
  const exports = Object.fromEntries(stacks.flatMap((s) => Object.values(s.template.Outputs ?? {})
33
26
  .filter((o) => o.Export != null && typeof o.Export.Name === 'string')
34
27
  .map((o) => [o.Export.Name, { stackName: s.stackName, value: o.Value }])));
35
- const resources = Object.fromEntries(stacks.flatMap((s) => Object.entries(s.template.Resources ?? {}).map(([id, res]) => [`${s.stackName}.${id}`, res])));
36
- const graph = new graph_1.ResourceGraph(stacks);
37
- const nodes = graph.sortedNodes;
38
- // 4. Compute digests in sorted order
28
+ const resources = Object.fromEntries(stacks.flatMap((s) => {
29
+ return Object.entries(s.template.Resources ?? {})
30
+ .filter(([_, res]) => res.Type !== 'AWS::CDK::Metadata')
31
+ .map(([id, res]) => [`${s.stackName}.${id}`, res]);
32
+ }));
33
+ const graph = direction == 'direct'
34
+ ? graph_1.ResourceGraph.fromStacks(stacks)
35
+ : graph_1.ResourceGraph.fromStacks(stacks).opposite();
36
+ return computeDigestsInTopologicalOrder(graph, resources, exports);
37
+ }
38
+ function computeDigestsInTopologicalOrder(graph, resources, exports) {
39
+ const nodes = graph.sortedNodes.filter(n => resources[n] != null);
39
40
  const result = {};
40
41
  for (const id of nodes) {
41
42
  const resource = resources[id];
42
- const resourceProperties = resource.Properties ?? {};
43
- const model = (0, util_1.loadResourceModel)(resource.Type);
44
- const identifier = intersection(Object.keys(resourceProperties), model?.primaryIdentifier ?? []);
45
- let toHash;
46
- if (identifier.length === model?.primaryIdentifier?.length) {
47
- // The resource has a physical ID defined, so we can
48
- // use the ID and the type as the identity of the resource.
49
- toHash =
50
- resource.Type +
51
- identifier
52
- .sort()
53
- .map((attr) => JSON.stringify(resourceProperties[attr]))
54
- .join('');
55
- }
56
- else {
57
- // The resource does not have a physical ID defined, so we need to
58
- // compute the digest based on its properties and dependencies.
59
- const depDigests = Array.from(graph.outNeighbors(id)).map((d) => result[d]);
60
- const propertiesHash = hashObject(stripReferences(stripConstructPath(resource), exports));
61
- toHash = resource.Type + propertiesHash + depDigests.join('');
62
- }
43
+ const depDigests = Array.from(graph.outNeighbors(id)).map((d) => result[d]);
44
+ const propertiesHash = hashObject(stripReferences(stripConstructPath(resource), exports));
45
+ const toHash = resource.Type + propertiesHash + depDigests.join('');
63
46
  result[id] = crypto.createHash('sha256').update(toHash).digest('hex');
64
47
  }
65
48
  return result;
@@ -133,7 +116,4 @@ function stripConstructPath(resource) {
133
116
  delete copy.Metadata['aws:cdk:path'];
134
117
  return copy;
135
118
  }
136
- function intersection(a, b) {
137
- return a.filter((value) => b.includes(value));
138
- }
139
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlnZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZGlnZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBNEJBLHdEQWlEQztBQUVELGdDQXdCQztBQXZHRCxzQ0FBc0M7QUFDdEMscUVBQStFO0FBRS9FLG1DQUF3QztBQUV4Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXNCRztBQUNILFNBQWdCLHNCQUFzQixDQUFDLE1BQTZCO0lBQ2xFLE1BQU0sT0FBTyxHQUF1RCxNQUFNLENBQUMsV0FBVyxDQUNwRixNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FDbkIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUM7U0FDcEMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxJQUFJLElBQUksSUFBSSxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLFFBQVEsQ0FBQztTQUNwRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFnRCxDQUFDLENBQzFILENBQ0YsQ0FBQztJQUVGLE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQ2xDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUNuQixNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsU0FBUyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FDNUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLElBQUksRUFBRSxF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O1xuaW1wb3J0IHsgbG9hZFJlc291cmNlTW9kZWwgfSBmcm9tICdAYXdzLWNkay9jbG91ZGZvcm1hdGlvbi1kaWZmL2xpYi9kaWZmL3V0aWwnO1xuaW1wb3J0IHR5cGUgeyBDbG91ZEZvcm1hdGlvblJlc291cmNlLCBDbG91ZEZvcm1hdGlvblN0YWNrIH0gZnJvbSAnLi9jbG91ZGZvcm1hdGlvbic7XG5pbXBvcnQgeyBSZXNvdXJjZUdyYXBoIH0gZnJvbSAnLi9ncmFwaCc7XG5cbi8qKlxuICogQ29tcHV0ZXMgdGhlIGRpZ2VzdCBmb3IgZWFjaCByZXNvdXJjZSBpbiB0aGUgdGVtcGxhdGUuXG4gKlxuICogQ29uY2VwdHVhbGx5LCB0aGUgZGlnZXN0IGlzIGNvbXB1dGVkIGFzOlxuICpcbiAqICAgICBkKHJlc291cmNlKSA9IGhhc2godHlwZSArIHBoeXNpY2FsSWQpICAgICAgICAgICAgICAgICAgICAgICAsIGlmIHBoeXNpY2FsSWQgaXMgZGVmaW5lZFxuICogICAgICAgICAgICAgICAgID0gaGFzaCh0eXBlICsgcHJvcGVydGllcyArIGRlcGVuZGVuY2llcy5tYXAoZCkpICwgb3RoZXJ3aXNlXG4gKlxuICogd2hlcmUgYGhhc2hgIGlzIGEgY3J5cHRvZ3JhcGhpYyBoYXNoIGZ1bmN0aW9uLiBJbiBvdGhlciB3b3JkcywgaWYgYSByZXNvdXJjZSBoYXNcbiAqIGEgcGh5c2ljYWwgSUQsIHdlIHVzZSB0aGUgcGh5c2ljYWwgSUQgcGx1cyBpdHMgdHlwZSB0byB1bmlxdWVseSBpZGVudGlmeVxuICogdGhhdCByZXNvdXJjZS4gSW4gdGhpcyBjYXNlLCB0aGUgZGlnZXN0IGNhbiBiZSBjb21wdXRlZCBmcm9tIHRoZXNlIHR3byBmaWVsZHNcbiAqIGFsb25lLiBBIGNvcm9sbGFyeSBpcyB0aGF0IHN1Y2ggcmVzb3VyY2VzIGNhbiBiZSByZW5hbWVkIGFuZCBoYXZlIHRoZWlyXG4gKiBwcm9wZXJ0aWVzIHVwZGF0ZWQgYXQgdGhlIHNhbWUgdGltZSwgYW5kIHN0aWxsIGJlIGNvbnNpZGVyZWQgZXF1aXZhbGVudC5cbiAqXG4gKiBPdGhlcndpc2UsIHRoZSBkaWdlc3QgaXMgY29tcHV0ZWQgZnJvbSBpdHMgdHlwZSwgaXRzIG93biBwcm9wZXJ0aWVzICh0aGF0IGlzLFxuICogZXhjbHVkaW5nIHByb3BlcnRpZXMgdGhhdCByZWZlciB0byBvdGhlciByZXNvdXJjZXMpLCBhbmQgdGhlIGRpZ2VzdHMgb2YgZWFjaCBvZlxuICogaXRzIGRlcGVuZGVuY2llcy5cbiAqXG4gKiBUaGUgZGlnZXN0IG9mIGEgcmVzb3VyY2UsIGRlZmluZWQgcmVjdXJzaXZlbHkgdGhpcyB3YXksIHJlbWFpbnMgc3RhYmxlIGV2ZW4gaWZcbiAqIG9uZSBvciBtb3JlIG9mIGl0cyBkZXBlbmRlbmNpZXMgZ2V0cyByZW5hbWVkLiBTaW5jZSB0aGUgcmVzb3VyY2VzIGluIGFcbiAqIENsb3VkRm9ybWF0aW9uIHRlbXBsYXRlIGZvcm0gYSBkaXJlY3RlZCBhY3ljbGljIGdyYXBoLCB0aGlzIGZ1bmN0aW9uIGlzXG4gKiB3ZWxsLWRlZmluZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlUmVzb3VyY2VEaWdlc3RzKHN0YWNrczogQ2xvdWRGb3JtYXRpb25TdGFja1tdKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGNvbnN0IGV4cG9ydHM6IHsgW3A6IHN0cmluZ106IHsgc3RhY2tOYW1lOiBzdHJpbmc7IHZhbHVlOiBhbnkgfSB9ID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgIHN0YWNrcy5mbGF0TWFwKChzKSA9PlxuICAgICAgT2JqZWN0LnZhbHVlcyhzLnRlbXBsYXRlLk91dHB1dHMgPz8ge30pXG4gICAgICAgIC5maWx0ZXIoKG8pID0+IG8uRXhwb3J0ICE9IG51bGwgJiYgdHlwZW9mIG8uRXhwb3J0Lk5hbWUgPT09ICdzdHJpbmcnKVxuICAgICAgICAubWFwKChvKSA9PiBbby5FeHBvcnQuTmFtZSwgeyBzdGFja05hbWU6IHMuc3RhY2tOYW1lLCB2YWx1ZTogby5WYWx1ZSB9XSBhcyBbc3RyaW5nLCB7IHN0YWNrTmFtZTogc3RyaW5nOyB2YWx1ZTogYW55IH1dKSxcbiAgICApLFxuICApO1xuXG4gIGNvbnN0IHJlc291cmNlcyA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICBzdGFja3MuZmxhdE1hcCgocykgPT5cbiAgICAgIE9iamVjdC5lbnRyaWVzKHMudGVtcGxhdGUuUmVzb3VyY2VzID8/IHt9KS5tYXAoXG4gICAgICAgIChbaWQsIHJlc10pID0+IFtgJHtzLnN0YWNrTmFtZX0uJHtpZH1gLCByZXNdIGFzIFtzdHJpbmcsIENsb3VkRm9ybWF0aW9uUmVzb3VyY2VdLFxuICAgICAgKSxcbiAgICApLFxuICApO1xuXG4gIGNvbnN0IGdyYXBoID0gbmV3IFJlc291cmNlR3JhcGgoc3RhY2tzKTtcbiAgY29uc3Qgbm9kZXMgPSBncmFwaC5zb3J0ZWROb2RlcztcbiAgLy8gNC4gQ29tcHV0ZSBkaWdlc3RzIGluIHNvcnRlZCBvcmRlclxuICBjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgZm9yIChjb25zdCBpZCBvZiBub2Rlcykge1xuICAgIGNvbnN0IHJlc291cmNlID0gcmVzb3VyY2VzW2lkXTtcbiAgICBjb25zdCByZXNvdXJjZVByb3BlcnRpZXMgPSByZXNvdXJjZS5Qcm9wZXJ0aWVzID8/IHt9O1xuICAgIGNvbnN0IG1vZGVsID0gbG9hZFJlc291cmNlTW9kZWwocmVzb3VyY2UuVHlwZSk7XG4gICAgY29uc3QgaWRlbnRpZmllciA9IGludGVyc2VjdGlvbihPYmplY3Qua2V5cyhyZXNvdXJjZVByb3BlcnRpZXMpLCBtb2RlbD8ucHJpbWFyeUlkZW50aWZpZXIgPz8gW10pO1xuICAgIGxldCB0b0hhc2g6IHN0cmluZztcblxuICAgIGlmIChpZGVudGlmaWVyLmxlbmd0aCA9PT0gbW9kZWw/LnByaW1hcnlJZGVudGlmaWVyPy5sZW5ndGgpIHtcbiAgICAgIC8vIFRoZSByZXNvdXJjZSBoYXMgYSBwaHlzaWNhbCBJRCBkZWZpbmVkLCBzbyB3ZSBjYW5cbiAgICAgIC8vIHVzZSB0aGUgSUQgYW5kIHRoZSB0eXBlIGFzIHRoZSBpZGVudGl0eSBvZiB0aGUgcmVzb3VyY2UuXG4gICAgICB0b0hhc2ggPVxuICAgICAgICByZXNvdXJjZS5UeXBlICtcbiAgICAgICAgaWRlbnRpZmllclxuICAgICAgICAgIC5zb3J0KClcbiAgICAgICAgICAubWFwKChhdHRyKSA9PiBKU09OLnN0cmluZ2lmeShyZXNvdXJjZVByb3BlcnRpZXNbYXR0cl0pKVxuICAgICAgICAgIC5qb2luKCcnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVGhlIHJlc291cmNlIGRvZXMgbm90IGhhdmUgYSBwaHlzaWNhbCBJRCBkZWZpbmVkLCBzbyB3ZSBuZWVkIHRvXG4gICAgICAvLyBjb21wdXRlIHRoZSBkaWdlc3QgYmFzZWQgb24gaXRzIHByb3BlcnRpZXMgYW5kIGRlcGVuZGVuY2llcy5cbiAgICAgIGNvbnN0IGRlcERpZ2VzdHMgPSBBcnJheS5mcm9tKGdyYXBoLm91dE5laWdoYm9ycyhpZCkpLm1hcCgoZCkgPT4gcmVzdWx0W2RdKTtcbiAgICAgIGNvbnN0IHByb3BlcnRpZXNIYXNoID0gaGFzaE9iamVjdChzdHJpcFJlZmVyZW5jZXMoc3RyaXBDb25zdHJ1Y3RQYXRoKHJlc291cmNlKSwgZXhwb3J0cykpO1xuICAgICAgdG9IYXNoID0gcmVzb3VyY2UuVHlwZSArIHByb3BlcnRpZXNIYXNoICsgZGVwRGlnZXN0cy5qb2luKCcnKTtcbiAgICB9XG5cbiAgICByZXN1bHRbaWRdID0gY3J5cHRvLmNyZWF0ZUhhc2goJ3NoYTI1NicpLnVwZGF0ZSh0b0hhc2gpLmRpZ2VzdCgnaGV4Jyk7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaGFzaE9iamVjdChvYmo6IGFueSk6IHN0cmluZyB7XG4gIGNvbnN0IGhhc2ggPSBjcnlwdG8uY3JlYXRlSGFzaCgnc2hhMjU2Jyk7XG5cbiAgZnVuY3Rpb24gYWRkVG9IYXNoKHZhbHVlOiBhbnkpIHtcbiAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgICAgYWRkVG9IYXNoKCdudWxsJyk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgdmFsdWUuZm9yRWFjaChhZGRUb0hhc2gpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgT2JqZWN0LmtleXModmFsdWUpXG4gICAgICAgICAgLnNvcnQoKVxuICAgICAgICAgIC5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgICAgIGhhc2gudXBkYXRlKGtleSk7XG4gICAgICAgICAgICBhZGRUb0hhc2godmFsdWVba2V5XSk7XG4gICAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGhhc2gudXBkYXRlKHR5cGVvZiB2YWx1ZSArIHZhbHVlLnRvU3RyaW5nKCkpO1xuICAgIH1cbiAgfVxuXG4gIGFkZFRvSGFzaChvYmopO1xuICByZXR1cm4gaGFzaC5kaWdlc3QoJ2hleCcpO1xufVxuXG4vKipcbiAqIFJlbW92ZXMgc3ViLXByb3BlcnRpZXMgY29udGFpbmluZyBSZWYgb3IgRm46OkdldEF0dCB0byBhdm9pZCBoYXNoaW5nXG4gKiByZWZlcmVuY2VzIHRoZW1zZWx2ZXMgYnV0IGtlZXBzIHRoZSBwcm9wZXJ0eSBzdHJ1Y3R1cmUuXG4gKi9cbmZ1bmN0aW9uIHN0cmlwUmVmZXJlbmNlcyh2YWx1ZTogYW55LCBleHBvcnRzOiB7IFtwOiBzdHJpbmddOiB7IHN0YWNrTmFtZTogc3RyaW5nOyB2YWx1ZTogYW55IH0gfSk6IGFueSB7XG4gIGlmICghdmFsdWUgfHwgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JykgcmV0dXJuIHZhbHVlO1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gdmFsdWUubWFwKHggPT4gc3RyaXBSZWZlcmVuY2VzKHgsIGV4cG9ydHMpKTtcbiAgfVxuICBpZiAoJ1JlZicgaW4gdmFsdWUpIHtcbiAgICByZXR1cm4geyBfX2Nsb3VkX3JlZl9fOiAnUmVmJyB9O1xuICB9XG4gIGlmICgnRm46OkdldEF0dCcgaW4gdmFsdWUpIHtcbiAgICByZXR1cm4geyBfX2Nsb3VkX3JlZl9fOiAnRm46OkdldEF0dCcgfTtcbiAgfVxuICBpZiAoJ0RlcGVuZHNPbicgaW4gdmFsdWUpIHtcbiAgICByZXR1cm4geyBfX2Nsb3VkX3JlZl9fOiAnRGVwZW5kc09uJyB9O1xuICB9XG4gIGlmICgnRm46OkltcG9ydFZhbHVlJyBpbiB2YWx1ZSkge1xuICAgIGNvbnN0IHYgPSBleHBvcnRzW3ZhbHVlWydGbjo6SW1wb3J0VmFsdWUnXV0udmFsdWU7XG4gICAgLy8gVHJlYXQgRm46OkltcG9ydFZhbHVlIGFzIGlmIGl0IHdlcmUgYSByZWZlcmVuY2Ugd2l0aCB0aGUgc2FtZSBzdGFja1xuICAgIGlmICgnUmVmJyBpbiB2KSB7XG4gICAgICByZXR1cm4geyBfX2Nsb3VkX3JlZl9fOiAnUmVmJyB9O1xuICAgIH0gZWxzZSBpZiAoJ0ZuOjpHZXRBdHQnIGluIHYpIHtcbiAgICAgIHJldHVybiB7IF9fY2xvdWRfcmVmX186ICdGbjo6R2V0QXR0JyB9O1xuICAgIH1cbiAgfVxuICBjb25zdCByZXN1bHQ6IGFueSA9IHt9O1xuICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyh2YWx1ZSkpIHtcbiAgICByZXN1bHRba10gPSBzdHJpcFJlZmVyZW5jZXModiwgZXhwb3J0cyk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gc3RyaXBDb25zdHJ1Y3RQYXRoKHJlc291cmNlOiBhbnkpOiBhbnkge1xuICBpZiAocmVzb3VyY2U/Lk1ldGFkYXRhPy5bJ2F3czpjZGs6cGF0aCddID09IG51bGwpIHtcbiAgICByZXR1cm4gcmVzb3VyY2U7XG4gIH1cblxuICBjb25zdCBjb3B5ID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShyZXNvdXJjZSkpO1xuICBkZWxldGUgY29weS5NZXRhZGF0YVsnYXdzOmNkazpwYXRoJ107XG4gIHJldHVybiBjb3B5O1xufVxuXG5mdW5jdGlvbiBpbnRlcnNlY3Rpb248VD4oYTogVFtdLCBiOiBUW10pOiBUW10ge1xuICByZXR1cm4gYS5maWx0ZXIoKHZhbHVlKSA9PiBiLmluY2x1ZGVzKHZhbHVlKSk7XG59XG4iXX0=
119
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlnZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZGlnZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBeUJBLHdEQXlCQztBQW1CRCxnQ0F3QkM7QUE3RkQsc0NBQXNDO0FBRXRDLG1DQUF3QztBQU14Qzs7Ozs7Ozs7Ozs7Ozs7OztHQWdCRztBQUNILFNBQWdCLHNCQUFzQixDQUFDLE1BQTZCLEVBQUUsWUFBNEIsUUFBUTtJQUN4RyxNQUFNLE9BQU8sR0FBdUQsTUFBTSxDQUFDLFdBQVcsQ0FDcEYsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQ25CLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDO1NBQ3BDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxJQUFJLElBQUksT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxRQUFRLENBQUM7U0FDcEUsR0FBRyxDQUNGLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FDSixDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxTQUFTLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBZ0QsQ0FDN0csQ0FDSixDQUNGLENBQUM7SUFFRixNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUNsQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7UUFDbkIsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsU0FBUyxJQUFJLEVBQUUsQ0FBQzthQUM5QyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksS0FBSyxvQkFBb0IsQ0FBQzth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QztJQUNILENBQUM7SUFDRCxNQUFNLE1BQU0sR0FBUSxFQUFFLENBQUM7SUFDdkIsS0FBSyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUMzQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsZUFBZSxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBQ0QsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVELFNBQVMsa0JBQWtCLENBQUMsUUFBYTtJQUN2QyxJQUFJLFFBQVEsRUFBRSxRQUFRLEVBQUUsQ0FBQyxjQUFjLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUNqRCxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0lBRUQsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFDbEQsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQ3JDLE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGNyeXB0byBmcm9tICdub2RlOmNyeXB0byc7XG5pbXBvcnQgdHlwZSB7IENsb3VkRm9ybWF0aW9uUmVzb3VyY2UsIENsb3VkRm9ybWF0aW9uU3RhY2sgfSBmcm9tICcuL2Nsb3VkZm9ybWF0aW9uJztcbmltcG9ydCB7IFJlc291cmNlR3JhcGggfSBmcm9tICcuL2dyYXBoJztcblxuZXhwb3J0IHR5cGUgR3JhcGhEaXJlY3Rpb24gPVxuICAnZGlyZWN0JyAvLyBFZGdlIEEgLT4gQiBtZWFuIHRoYXQgQSBkZXBlbmRzIG9uIEJcbiAgfCAnb3Bwb3NpdGUnOyAvLyBFZGdlIEEgLT4gQiBtZWFuIHRoYXQgQiBkZXBlbmRzIG9uIEFcblxuLyoqXG4gKiBDb21wdXRlcyB0aGUgZGlnZXN0IGZvciBlYWNoIHJlc291cmNlIGluIHRoZSB0ZW1wbGF0ZS5cbiAqXG4gKiBDb25jZXB0dWFsbHksIHRoZSBkaWdlc3QgaXMgY29tcHV0ZWQgYXM6XG4gKlxuICogICAgIGRpZ2VzdChyZXNvdXJjZSkgPSBoYXNoKHR5cGUgKyBwcm9wZXJ0aWVzICsgZGVwZW5kZW5jaWVzLm1hcChkKSlcbiAqXG4gKiB3aGVyZSBgaGFzaGAgaXMgYSBjcnlwdG9ncmFwaGljIGhhc2ggZnVuY3Rpb24uIEluIG90aGVyIHdvcmRzLCB0aGUgZGlnZXN0IG9mIGFcbiAqIHJlc291cmNlIGlzIGNvbXB1dGVkIGZyb20gaXRzIHR5cGUsIGl0cyBvd24gcHJvcGVydGllcyAodGhhdCBpcywgZXhjbHVkaW5nXG4gKiBwcm9wZXJ0aWVzIHRoYXQgcmVmZXIgdG8gb3RoZXIgcmVzb3VyY2VzKSwgYW5kIHRoZSBkaWdlc3RzIG9mIGVhY2ggb2YgaXRzXG4gKiBkZXBlbmRlbmNpZXMuXG4gKlxuICogVGhlIGRpZ2VzdCBvZiBhIHJlc291cmNlLCBkZWZpbmVkIHJlY3Vyc2l2ZWx5IHRoaXMgd2F5LCByZW1haW5zIHN0YWJsZSBldmVuIGlmXG4gKiBvbmUgb3IgbW9yZSBvZiBpdHMgZGVwZW5kZW5jaWVzIGdldHMgcmVuYW1lZC4gU2luY2UgdGhlIHJlc291cmNlcyBpbiBhXG4gKiBDbG91ZEZvcm1hdGlvbiB0ZW1wbGF0ZSBmb3JtIGEgZGlyZWN0ZWQgYWN5Y2xpYyBncmFwaCwgdGhpcyBmdW5jdGlvbiBpc1xuICogd2VsbC1kZWZpbmVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZVJlc291cmNlRGlnZXN0cyhzdGFja3M6IENsb3VkRm9ybWF0aW9uU3RhY2tbXSwgZGlyZWN0aW9uOiBHcmFwaERpcmVjdGlvbiA9ICdkaXJlY3QnKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGNvbnN0IGV4cG9ydHM6IHsgW3A6IHN0cmluZ106IHsgc3RhY2tOYW1lOiBzdHJpbmc7IHZhbHVlOiBhbnkgfSB9ID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgIHN0YWNrcy5mbGF0TWFwKChzKSA9PlxuICAgICAgT2JqZWN0LnZhbHVlcyhzLnRlbXBsYXRlLk91dHB1dHMgPz8ge30pXG4gICAgICAgIC5maWx0ZXIoKG8pID0+IG8uRXhwb3J0ICE9IG51bGwgJiYgdHlwZW9mIG8uRXhwb3J0Lk5hbWUgPT09ICdzdHJpbmcnKVxuICAgICAgICAubWFwKFxuICAgICAgICAgIChvKSA9PlxuICAgICAgICAgICAgW28uRXhwb3J0Lk5hbWUsIHsgc3RhY2tOYW1lOiBzLnN0YWNrTmFtZSwgdmFsdWU6IG8uVmFsdWUgfV0gYXMgW3N0cmluZywgeyBzdGFja05hbWU6IHN0cmluZzsgdmFsdWU6IGFueSB9XSxcbiAgICAgICAgKSxcbiAgICApLFxuICApO1xuXG4gIGNvbnN0IHJlc291cmNlcyA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICBzdGFja3MuZmxhdE1hcCgocykgPT4ge1xuICAgICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHMudGVtcGxhdGUuUmVzb3VyY2VzID8/IHt9KVxuICAgICAgICAuZmlsdGVyKChbXywgcmVzXSkgPT4gcmVzLlR5cGUgIT09ICdBV1M6OkNESzo6TWV0YWRhdGEnKVxuICAgICAgICAubWFwKChbaWQsIHJlc10pID0+IFtgJHtzLnN0YWNrTmFtZX0uJHtpZH1gLCByZXNdIGFzIFtzdHJpbmcsIENsb3VkRm9ybWF0aW9uUmVzb3VyY2VdKTtcbiAgICB9KSxcbiAgKTtcblxuICBjb25zdCBncmFwaCA9IGRpcmVjdGlvbiA9PSAnZGlyZWN0J1xuICAgID8gUmVzb3VyY2VHcmFwaC5mcm9tU3RhY2tzKHN0YWNrcylcbiAgICA6IFJlc291cmNlR3JhcGguZnJvbVN0YWNrcyhzdGFja3MpLm9wcG9zaXRlKCk7XG5cbiAgcmV0dXJuIGNvbXB1dGVEaWdlc3RzSW5Ub3BvbG9naWNhbE9yZGVyKGdyYXBoLCByZXNvdXJjZXMsIGV4cG9ydHMpO1xufVxuXG5mdW5jdGlvbiBjb21wdXRlRGlnZXN0c0luVG9wb2xvZ2ljYWxPcmRlcihcbiAgZ3JhcGg6IFJlc291cmNlR3JhcGgsXG4gIHJlc291cmNlczogUmVjb3JkPHN0cmluZywgQ2xvdWRGb3JtYXRpb25SZXNvdXJjZT4sXG4gIGV4cG9ydHM6IFJlY29yZDxzdHJpbmcsIHsgc3RhY2tOYW1lOiBzdHJpbmc7IHZhbHVlOiBhbnkgfT4pOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgY29uc3Qgbm9kZXMgPSBncmFwaC5zb3J0ZWROb2Rlcy5maWx0ZXIobiA9PiByZXNvdXJjZXNbbl0gIT0gbnVsbCk7XG4gIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBmb3IgKGNvbnN0IGlkIG9mIG5vZGVzKSB7XG4gICAgY29uc3QgcmVzb3VyY2UgPSByZXNvdXJjZXNbaWRdO1xuICAgIGNvbnN0IGRlcERpZ2VzdHMgPSBBcnJheS5mcm9tKGdyYXBoLm91dE5laWdoYm9ycyhpZCkpLm1hcCgoZCkgPT4gcmVzdWx0W2RdKTtcbiAgICBjb25zdCBwcm9wZXJ0aWVzSGFzaCA9IGhhc2hPYmplY3Qoc3RyaXBSZWZlcmVuY2VzKHN0cmlwQ29uc3RydWN0UGF0aChyZXNvdXJjZSksIGV4cG9ydHMpKTtcbiAgICBjb25zdCB0b0hhc2ggPSByZXNvdXJjZS5UeXBlICsgcHJvcGVydGllc0hhc2ggKyBkZXBEaWdlc3RzLmpvaW4oJycpO1xuICAgIHJlc3VsdFtpZF0gPSBjcnlwdG8uY3JlYXRlSGFzaCgnc2hhMjU2JykudXBkYXRlKHRvSGFzaCkuZGlnZXN0KCdoZXgnKTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoYXNoT2JqZWN0KG9iajogYW55KTogc3RyaW5nIHtcbiAgY29uc3QgaGFzaCA9IGNyeXB0by5jcmVhdGVIYXNoKCdzaGEyNTYnKTtcblxuICBmdW5jdGlvbiBhZGRUb0hhc2godmFsdWU6IGFueSkge1xuICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICBhZGRUb0hhc2goJ251bGwnKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICB2YWx1ZS5mb3JFYWNoKGFkZFRvSGFzaCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBPYmplY3Qua2V5cyh2YWx1ZSlcbiAgICAgICAgICAuc29ydCgpXG4gICAgICAgICAgLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICAgICAgaGFzaC51cGRhdGUoa2V5KTtcbiAgICAgICAgICAgIGFkZFRvSGFzaCh2YWx1ZVtrZXldKTtcbiAgICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaGFzaC51cGRhdGUodHlwZW9mIHZhbHVlICsgdmFsdWUudG9TdHJpbmcoKSk7XG4gICAgfVxuICB9XG5cbiAgYWRkVG9IYXNoKG9iaik7XG4gIHJldHVybiBoYXNoLmRpZ2VzdCgnaGV4Jyk7XG59XG5cbi8qKlxuICogUmVtb3ZlcyBzdWItcHJvcGVydGllcyBjb250YWluaW5nIFJlZiBvciBGbjo6R2V0QXR0IHRvIGF2b2lkIGhhc2hpbmdcbiAqIHJlZmVyZW5jZXMgdGhlbXNlbHZlcyBidXQga2VlcHMgdGhlIHByb3BlcnR5IHN0cnVjdHVyZS5cbiAqL1xuZnVuY3Rpb24gc3RyaXBSZWZlcmVuY2VzKHZhbHVlOiBhbnksIGV4cG9ydHM6IHsgW3A6IHN0cmluZ106IHsgc3RhY2tOYW1lOiBzdHJpbmc7IHZhbHVlOiBhbnkgfSB9KTogYW55IHtcbiAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSByZXR1cm4gdmFsdWU7XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIHJldHVybiB2YWx1ZS5tYXAoeCA9PiBzdHJpcFJlZmVyZW5jZXMoeCwgZXhwb3J0cykpO1xuICB9XG4gIGlmICgnUmVmJyBpbiB2YWx1ZSkge1xuICAgIHJldHVybiB7IF9fY2xvdWRfcmVmX186ICdSZWYnIH07XG4gIH1cbiAgaWYgKCdGbjo6R2V0QXR0JyBpbiB2YWx1ZSkge1xuICAgIHJldHVybiB7IF9fY2xvdWRfcmVmX186ICdGbjo6R2V0QXR0JyB9O1xuICB9XG4gIGlmICgnRGVwZW5kc09uJyBpbiB2YWx1ZSkge1xuICAgIHJldHVybiB7IF9fY2xvdWRfcmVmX186ICdEZXBlbmRzT24nIH07XG4gIH1cbiAgaWYgKCdGbjo6SW1wb3J0VmFsdWUnIGluIHZhbHVlKSB7XG4gICAgY29uc3QgdiA9IGV4cG9ydHNbdmFsdWVbJ0ZuOjpJbXBvcnRWYWx1ZSddXS52YWx1ZTtcbiAgICAvLyBUcmVhdCBGbjo6SW1wb3J0VmFsdWUgYXMgaWYgaXQgd2VyZSBhIHJlZmVyZW5jZSB3aXRoIHRoZSBzYW1lIHN0YWNrXG4gICAgaWYgKCdSZWYnIGluIHYpIHtcbiAgICAgIHJldHVybiB7IF9fY2xvdWRfcmVmX186ICdSZWYnIH07XG4gICAgfSBlbHNlIGlmICgnRm46OkdldEF0dCcgaW4gdikge1xuICAgICAgcmV0dXJuIHsgX19jbG91ZF9yZWZfXzogJ0ZuOjpHZXRBdHQnIH07XG4gICAgfVxuICB9XG4gIGNvbnN0IHJlc3VsdDogYW55ID0ge307XG4gIGZvciAoY29uc3QgW2ssIHZdIG9mIE9iamVjdC5lbnRyaWVzKHZhbHVlKSkge1xuICAgIHJlc3VsdFtrXSA9IHN0cmlwUmVmZXJlbmNlcyh2LCBleHBvcnRzKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBzdHJpcENvbnN0cnVjdFBhdGgocmVzb3VyY2U6IGFueSk6IGFueSB7XG4gIGlmIChyZXNvdXJjZT8uTWV0YWRhdGE/LlsnYXdzOmNkazpwYXRoJ10gPT0gbnVsbCkge1xuICAgIHJldHVybiByZXNvdXJjZTtcbiAgfVxuXG4gIGNvbnN0IGNvcHkgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHJlc291cmNlKSk7XG4gIGRlbGV0ZSBjb3B5Lk1ldGFkYXRhWydhd3M6Y2RrOnBhdGgnXTtcbiAgcmV0dXJuIGNvcHk7XG59XG4iXX0=
@@ -3,14 +3,19 @@ import type { CloudFormationStack } from './cloudformation';
3
3
  * An immutable directed graph of resources from multiple CloudFormation stacks.
4
4
  */
5
5
  export declare class ResourceGraph {
6
+ static fromStacks(stacks: Omit<CloudFormationStack, 'environment'>[]): ResourceGraph;
6
7
  private readonly edges;
7
8
  private readonly reverseEdges;
8
- constructor(stacks: Omit<CloudFormationStack, 'environment'>[]);
9
+ private constructor();
9
10
  /**
10
11
  * Returns the sorted nodes in topological order.
11
12
  */
12
13
  get sortedNodes(): string[];
13
14
  inNeighbors(node: string): string[];
14
15
  outNeighbors(node: string): string[];
16
+ /**
17
+ * Returns another graph with the same nodes, but with the edges inverted
18
+ */
19
+ opposite(): ResourceGraph;
15
20
  }
16
21
  //# sourceMappingURL=graph.d.ts.map
@@ -6,17 +6,17 @@ const toolkit_error_1 = require("../../toolkit/toolkit-error");
6
6
  * An immutable directed graph of resources from multiple CloudFormation stacks.
7
7
  */
8
8
  class ResourceGraph {
9
- edges = {};
10
- reverseEdges = {};
11
- constructor(stacks) {
9
+ static fromStacks(stacks) {
12
10
  const exports = Object.fromEntries(stacks.flatMap((s) => Object.values(s.template.Outputs ?? {})
13
11
  .filter((o) => o.Export != null && typeof o.Export.Name === 'string')
14
12
  .map((o) => [o.Export.Name, { stackName: s.stackName, value: o.Value }])));
15
13
  const resources = Object.fromEntries(stacks.flatMap((s) => Object.entries(s.template.Resources ?? {}).map(([id, res]) => [`${s.stackName}.${id}`, res])));
16
14
  // 1. Build adjacency lists
15
+ const edges = {};
16
+ const reverseEdges = {};
17
17
  for (const id of Object.keys(resources)) {
18
- this.edges[id] = new Set();
19
- this.reverseEdges[id] = new Set();
18
+ edges[id] = new Set();
19
+ reverseEdges[id] = new Set();
20
20
  }
21
21
  // 2. Detect dependencies by searching for Ref/Fn::GetAtt
22
22
  const findDependencies = (stackName, value) => {
@@ -63,11 +63,18 @@ class ResourceGraph {
63
63
  const deps = findDependencies(stackName, res || {});
64
64
  for (const dep of deps) {
65
65
  if (dep in resources && dep !== id) {
66
- this.edges[id].add(dep);
67
- this.reverseEdges[dep].add(id);
66
+ edges[id].add(dep);
67
+ reverseEdges[dep].add(id);
68
68
  }
69
69
  }
70
70
  }
71
+ return new ResourceGraph(edges, reverseEdges);
72
+ }
73
+ edges = {};
74
+ reverseEdges = {};
75
+ constructor(edges, reverseEdges) {
76
+ this.edges = edges;
77
+ this.reverseEdges = reverseEdges;
71
78
  }
72
79
  /**
73
80
  * Returns the sorted nodes in topological order.
@@ -103,6 +110,12 @@ class ResourceGraph {
103
110
  }
104
111
  return Array.from(this.edges[node] || []);
105
112
  }
113
+ /**
114
+ * Returns another graph with the same nodes, but with the edges inverted
115
+ */
116
+ opposite() {
117
+ return new ResourceGraph(this.reverseEdges, this.edges);
118
+ }
106
119
  }
107
120
  exports.ResourceGraph = ResourceGraph;
108
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JhcGguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJncmFwaC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSwrREFBMkQ7QUFFM0Q7O0dBRUc7QUFDSCxNQUFhLGFBQWE7SUFDUCxLQUFLLEdBQWdDLEVBQUUsQ0FBQztJQUN4QyxZQUFZLEdBQWdDLEVBQUUsQ0FBQztJQUVoRSxZQUFZLE1BQWtEO1FBQzVELE1BQU0sT0FBTyxHQUF1RCxNQUFNLENBQUMsV0FBVyxDQUNwRixNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FDbkIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUM7YUFDcEMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxJQUFJLElBQUksSUFBSSxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLFFBQVEsQ0FBQzthQUNwRSxHQUFHLENBQ0YsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUNKLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQU16RCxDQUNKLENBQ0osQ0FDRixDQUFDO1FBRUYsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FDbEMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQ25CLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxTQUFTLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxDQUM1QyxDQUFDLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsSUFBSSxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQXFD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QUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUVNLFlBQVksQ0FBQyxJQUFZO1FBQzlCLElBQUksQ0FBQyxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUMxQixNQUFNLElBQUksNEJBQVksQ0FBQyxRQUFRLElBQUkseUJBQXlCLENBQUMsQ0FBQztRQUNoRSxDQUFDO1FBQ0QsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7SUFDNUMsQ0FBQztDQUNGO0FBN0hELHNDQTZIQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgQ2xvdWRGb3JtYXRpb25SZXNvdXJjZSwgQ2xvdWRGb3JtYXRpb25TdGFjayB9IGZyb20gJy4vY2xvdWRmb3JtYXRpb24nO1xuaW1wb3J0IHsgVG9vbGtpdEVycm9yIH0gZnJvbSAnLi4vLi4vdG9vbGtpdC90b29sa2l0LWVycm9yJztcblxuLyoqXG4gKiBBbiBpbW11dGFibGUgZGlyZWN0ZWQgZ3JhcGggb2YgcmVzb3VyY2VzIGZyb20gbXVsdGlwbGUgQ2xvdWRGb3JtYXRpb24gc3RhY2tzLlxuICovXG5leHBvcnQgY2xhc3MgUmVzb3VyY2VHcmFwaCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgZWRnZXM6IFJlY29yZDxzdHJpbmcsIFNldDxzdHJpbmc+PiA9IHt9O1xuICBwcml2YXRlIHJlYWRvbmx5IHJldmVyc2VFZGdlczogUmVjb3JkPHN0cmluZywgU2V0PHN0cmluZz4+ID0ge307XG5cbiAgY29uc3RydWN0b3Ioc3RhY2tzOiBPbWl0PENsb3VkRm9ybWF0aW9uU3RhY2ssICdlbnZpcm9ubWVudCc+W10pIHtcbiAgICBjb25zdCBleHBvcnRzOiB7IFtwOiBzdHJpbmddOiB7IHN0YWNrTmFtZTogc3RyaW5nOyB2YWx1ZTogYW55IH0gfSA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgIHN0YWNrcy5mbGF0TWFwKChzKSA9PlxuICAgICAgICBPYmplY3QudmFsdWVzKHMudGVtcGxhdGUuT3V0cHV0cyA/PyB7fSlcbiAgICAgICAgICAuZmlsdGVyKChvKSA9PiBvLkV4cG9ydCAhPSBudWxsICYmIHR5cGVvZiBvLkV4cG9ydC5OYW1lID09PSAnc3RyaW5nJylcbiAgICAgICAgICAubWFwKFxuICAgICAgICAgICAgKG8pID0+XG4gICAgICAgICAgICAgIFtvLkV4cG9ydC5OYW1lLCB7IHN0YWNrTmFtZTogcy5zdGFja05hbWUsIHZhbHVlOiBvLlZhbHVlIH1dIGFzIFtcbiAgICAgICAgICAgICAgICBzdHJpbmcsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgc3RhY2tOYW1lOiBzdHJpbmc7XG4gICAgICAgICAgICAgICAgICB2YWx1ZTogYW55O1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgKSxcbiAgICAgICksXG4gICAgKTtcblxuICAgIGNvbnN0IHJlc291cmNlcyA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgIHN0YWNrcy5mbGF0TWFwKChzKSA9PlxuICAgICAgICBPYmplY3QuZW50cmllcyhzLnRlbXBsYXRlLlJlc291cmNlcyA/PyB7fSkubWFwKFxuICAgICAgICAgIChbaWQsIHJlc10pID0+IFtgJHtzLnN0YWNrTmFtZX0uJHtpZH1gLCByZXNdIGFzIFtzdHJpbmcsIENsb3VkRm9ybWF0aW9uUmVzb3VyY2VdLFxuICAgICAgICApLFxuICAgICAgKSxcbiAgICApO1xuXG4gICAgLy8gMS4gQnVpbGQgYWRqYWNlbmN5IGxpc3RzXG4gICAgZm9yIChjb25zdCBpZCBvZiBPYmplY3Qua2V5cyhyZXNvdXJjZXMpKSB7XG4gICAgICB0aGlzLmVkZ2VzW2lkXSA9IG5ldyBTZXQoKTtcbiAgICAgIHRoaXMucmV2ZXJzZUVkZ2VzW2lkXSA9IG5ldyBTZXQoKTtcbiAgICB9XG5cbiAgICAvLyAyLiBEZXRlY3QgZGVwZW5kZW5jaWVzIGJ5IHNlYXJjaGluZyBmb3IgUmVmL0ZuOjpHZXRBdHRcbiAgICBjb25zdCBmaW5kRGVwZW5kZW5jaWVzID0gKHN0YWNrTmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KTogc3RyaW5nW10gPT4ge1xuICAgICAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSByZXR1cm4gW107XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlLmZsYXRNYXAoKHJlcykgPT4gZmluZERlcGVuZGVuY2llcyhzdGFja05hbWUsIHJlcykpO1xuICAgICAgfVxuICAgICAgaWYgKCdSZWYnIGluIHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBbYCR7c3RhY2tOYW1lfS4ke3ZhbHVlLlJlZn1gXTtcbiAgICAgIH1cbiAgICAgIGlmICgnRm46OkdldEF0dCcgaW4gdmFsdWUpIHtcbiAgICAgICAgY29uc3QgcmVmVGFyZ2V0ID0gQXJyYXkuaXNBcnJheSh2YWx1ZVsnRm46OkdldEF0dCddKVxuICAgICAgICAgID8gdmFsdWVbJ0ZuOjpHZXRBdHQnXVswXVxuICAgICAgICAgIDogdmFsdWVbJ0ZuOjpHZXRBdHQnXS5zcGxpdCgnLicpWzBdO1xuICAgICAgICByZXR1cm4gW2Ake3N0YWNrTmFtZX0uJHtyZWZUYXJnZXR9YF07XG4gICAgICB9XG4gICAgICBpZiAoJ0ZuOjpJbXBvcnRWYWx1ZScgaW4gdmFsdWUpIHtcbiAgICAgICAgY29uc3QgZXhwID0gZXhwb3J0c1t2YWx1ZVsnRm46OkltcG9ydFZhbHVlJ11dO1xuICAgICAgICBjb25zdCB2ID0gZXhwLnZhbHVlO1xuICAgICAgICBpZiAoJ0ZuOjpHZXRBdHQnIGluIHYpIHtcbiAgICAgICAgICBjb25zdCBpZCA9IEFycmF5LmlzQXJyYXkodlsnRm46OkdldEF0dCddKSA/IHZbJ0ZuOjpHZXRBdHQnXVswXSA6IHZbJ0ZuOjpHZXRBdHQnXS5zcGxpdCgnLicpWzBdO1xuICAgICAgICAgIHJldHVybiBbYCR7ZXhwLnN0YWNrTmFtZX0uJHtpZH1gXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoJ1JlZicgaW4gdikge1xuICAgICAgICAgIHJldHVybiBbYCR7ZXhwLnN0YWNrTmFtZX0uJHt2LlJlZn1gXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW2Ake2V4cC5zdGFja05hbWV9LiR7dn1gXTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlc3VsdDogc3RyaW5nW10gPSBbXTtcbiAgICAgIGlmICgnRGVwZW5kc09uJyBpbiB2YWx1ZSkge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZS5EZXBlbmRzT24pKSB7XG4gICAgICAgICAgcmVzdWx0LnB1c2goLi4udmFsdWUuRGVwZW5kc09uLm1hcCgocjogc3RyaW5nKSA9PiBgJHtzdGFja05hbWV9LiR7cn1gKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzdWx0LnB1c2goYCR7c3RhY2tOYW1lfS4ke3ZhbHVlLkRlcGVuZHNPbn1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmVzdWx0LnB1c2goLi4uT2JqZWN0LnZhbHVlcyh2YWx1ZSkuZmxhdE1hcCgocmVzKSA9PiBmaW5kRGVwZW5kZW5jaWVzKHN0YWNrTmFtZSwgcmVzKSkpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuXG4gICAgZm9yIChjb25zdCBbaWQsIHJlc10gb2YgT2JqZWN0LmVudHJpZXMocmVzb3VyY2VzKSkge1xuICAgICAgY29uc3Qgc3RhY2tOYW1lID0gaWQuc3BsaXQoJy4nKVswXTtcbiAgICAgIGNvbnN0IGRlcHMgPSBmaW5kRGVwZW5kZW5jaWVzKHN0YWNrTmFtZSwgcmVzIHx8IHt9KTtcbiAgICAgIGZvciAoY29uc3QgZGVwIG9mIGRlcHMpIHtcbiAgICAgICAgaWYgKGRlcCBpbiByZXNvdXJjZXMgJiYgZGVwICE9PSBpZCkge1xuICAgICAgICAgIHRoaXMuZWRnZXNbaWRdLmFkZChkZXApO1xuICAgICAgICAgIHRoaXMucmV2ZXJzZUVkZ2VzW2RlcF0uYWRkKGlkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBzb3J0ZWQgbm9kZXMgaW4gdG9wb2xvZ2ljYWwgb3JkZXIuXG4gICAqL1xuICBnZXQgc29ydGVkTm9kZXMoKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHJlc3VsdDogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCBvdXREZWdyZWUgPSBPYmplY3Qua2V5cyh0aGlzLmVkZ2VzKS5yZWR1Y2UoKGFjYywgaykgPT4ge1xuICAgICAgYWNjW2tdID0gdGhpcy5lZGdlc1trXS5zaXplO1xuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCB7fSBhcyBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+KTtcblxuICAgIGNvbnN0IHF1ZXVlID0gT2JqZWN0LmtleXMob3V0RGVncmVlKS5maWx0ZXIoKGspID0+IG91dERlZ3JlZVtrXSA9PT0gMCk7XG5cbiAgICB3aGlsZSAocXVldWUubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3Qgbm9kZSA9IHF1ZXVlLnNoaWZ0KCkhO1xuICAgICAgcmVzdWx0LnB1c2gobm9kZSk7XG4gICAgICBmb3IgKGNvbnN0IG54dCBvZiB0aGlzLnJldmVyc2VFZGdlc1tub2RlXSkge1xuICAgICAgICBvdXREZWdyZWVbbnh0XS0tO1xuICAgICAgICBpZiAob3V0RGVncmVlW254dF0gPT09IDApIHtcbiAgICAgICAgICBxdWV1ZS5wdXNoKG54dCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHB1YmxpYyBpbk5laWdoYm9ycyhub2RlOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gICAgaWYgKCEobm9kZSBpbiB0aGlzLmVkZ2VzKSkge1xuICAgICAgdGhyb3cgbmV3IFRvb2xraXRFcnJvcihgTm9kZSAke25vZGV9IG5vdCBmb3VuZCBpbiB0aGUgZ3JhcGhgKTtcbiAgICB9XG4gICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5yZXZlcnNlRWRnZXNbbm9kZV0gfHwgW10pO1xuICB9XG5cbiAgcHVibGljIG91dE5laWdoYm9ycyhub2RlOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gICAgaWYgKCEobm9kZSBpbiB0aGlzLmVkZ2VzKSkge1xuICAgICAgdGhyb3cgbmV3IFRvb2xraXRFcnJvcihgTm9kZSAke25vZGV9IG5vdCBmb3VuZCBpbiB0aGUgZ3JhcGhgKTtcbiAgICB9XG4gICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5lZGdlc1tub2RlXSB8fCBbXSk7XG4gIH1cbn1cbiJdfQ==
121
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JhcGguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJncmFwaC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSwrREFBMkQ7QUFFM0Q7O0dBRUc7QUFDSCxNQUFhLGFBQWE7SUFDakIsTUFBTSxDQUFDLFVBQVUsQ0FBQyxNQUFrRDtRQUN6RSxNQUFNLE9BQU8sR0FBdUQsTUFBTSxDQUFDLFdBQVcsQ0FDcEYsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQ25CLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDO2FBQ3BDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxJQUFJLElBQUksT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxRQUFRLENBQUM7YUFDcEUsR0FBRyxDQUNGLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FDSixDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxTQUFTLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FNekQsQ0FDSixDQUNKLENBQ0YsQ0FBQztRQUVGLE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQ2xDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUNuQixNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsU0FBUyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FDNUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLElBQUksRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFxQyxDQUNqRixDQUNGLENBQ0YsQ0FBQztRQUVGLDJCQUEyQjtRQUMz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Q0FBQztRQUNILENBQUM7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRU0sV0FBVyxDQUFDLElBQVk7UUFDN0IsSUFBSSxDQUFDLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzFCLE1BQU0sSUFBSSw0QkFBWSxDQUFDLFFBQVEsSUFBSSx5QkFBeUIsQ0FBQyxDQUFDO1FBQ2hFLENBQUM7UUFDRCxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBRU0sWUFBWSxDQUFDLElBQVk7UUFDOUIsSUFBSSxDQUFDLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzFCLE1BQU0sSUFBSSw0QkFBWSxDQUFDLFFBQVEsSUFBSSx5QkFBeUIsQ0FBQyxDQUFDO1FBQ2hFLENBQUM7UUFDRCxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBRUQ7O09BRUc7SUFDSSxRQUFRO1FBQ2IsT0FBTyxJQUFJLGFBQWEsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMxRCxDQUFDO0NBQ0Y7QUE3SUQsc0NBNklDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBDbG91ZEZvcm1hdGlvblJlc291cmNlLCBDbG91ZEZvcm1hdGlvblN0YWNrIH0gZnJvbSAnLi9jbG91ZGZvcm1hdGlvbic7XG5pbXBvcnQgeyBUb29sa2l0RXJyb3IgfSBmcm9tICcuLi8uLi90b29sa2l0L3Rvb2xraXQtZXJyb3InO1xuXG4vKipcbiAqIEFuIGltbXV0YWJsZSBkaXJlY3RlZCBncmFwaCBvZiByZXNvdXJjZXMgZnJvbSBtdWx0aXBsZSBDbG91ZEZvcm1hdGlvbiBzdGFja3MuXG4gKi9cbmV4cG9ydCBjbGFzcyBSZXNvdXJjZUdyYXBoIHtcbiAgcHVibGljIHN0YXRpYyBmcm9tU3RhY2tzKHN0YWNrczogT21pdDxDbG91ZEZvcm1hdGlvblN0YWNrLCAnZW52aXJvbm1lbnQnPltdKTogUmVzb3VyY2VHcmFwaCB7XG4gICAgY29uc3QgZXhwb3J0czogeyBbcDogc3RyaW5nXTogeyBzdGFja05hbWU6IHN0cmluZzsgdmFsdWU6IGFueSB9IH0gPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICBzdGFja3MuZmxhdE1hcCgocykgPT5cbiAgICAgICAgT2JqZWN0LnZhbHVlcyhzLnRlbXBsYXRlLk91dHB1dHMgPz8ge30pXG4gICAgICAgICAgLmZpbHRlcigobykgPT4gby5FeHBvcnQgIT0gbnVsbCAmJiB0eXBlb2Ygby5FeHBvcnQuTmFtZSA9PT0gJ3N0cmluZycpXG4gICAgICAgICAgLm1hcChcbiAgICAgICAgICAgIChvKSA9PlxuICAgICAgICAgICAgICBbby5FeHBvcnQuTmFtZSwgeyBzdGFja05hbWU6IHMuc3RhY2tOYW1lLCB2YWx1ZTogby5WYWx1ZSB9XSBhcyBbXG4gICAgICAgICAgICAgICAgc3RyaW5nLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIHN0YWNrTmFtZTogc3RyaW5nO1xuICAgICAgICAgICAgICAgICAgdmFsdWU6IGFueTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBdLFxuICAgICAgICAgICksXG4gICAgICApLFxuICAgICk7XG5cbiAgICBjb25zdCByZXNvdXJjZXMgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICBzdGFja3MuZmxhdE1hcCgocykgPT5cbiAgICAgICAgT2JqZWN0LmVudHJpZXMocy50ZW1wbGF0ZS5SZXNvdXJjZXMgPz8ge30pLm1hcChcbiAgICAgICAgICAoW2lkLCByZXNdKSA9PiBbYCR7cy5zdGFja05hbWV9LiR7aWR9YCwgcmVzXSBhcyBbc3RyaW5nLCBDbG91ZEZvcm1hdGlvblJlc291cmNlXSxcbiAgICAgICAgKSxcbiAgICAgICksXG4gICAgKTtcblxuICAgIC8vIDEuIEJ1aWxkIGFkamFjZW5jeSBsaXN0c1xuICAgIGNvbnN0IGVkZ2VzOiBSZWNvcmQ8c3RyaW5nLCBTZXQ8c3RyaW5nPj4gPSB7fTtcbiAgICBjb25zdCByZXZlcnNlRWRnZXM6IFJlY29yZDxzdHJpbmcsIFNldDxzdHJpbmc+PiA9IHt9O1xuICAgIGZvciAoY29uc3QgaWQgb2YgT2JqZWN0LmtleXMocmVzb3VyY2VzKSkge1xuICAgICAgZWRnZXNbaWRdID0gbmV3IFNldCgpO1xuICAgICAgcmV2ZXJzZUVkZ2VzW2lkXSA9IG5ldyBTZXQoKTtcbiAgICB9XG5cbiAgICAvLyAyLiBEZXRlY3QgZGVwZW5kZW5jaWVzIGJ5IHNlYXJjaGluZyBmb3IgUmVmL0ZuOjpHZXRBdHRcbiAgICBjb25zdCBmaW5kRGVwZW5kZW5jaWVzID0gKHN0YWNrTmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KTogc3RyaW5nW10gPT4ge1xuICAgICAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSByZXR1cm4gW107XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlLmZsYXRNYXAoKHJlcykgPT4gZmluZERlcGVuZGVuY2llcyhzdGFja05hbWUsIHJlcykpO1xuICAgICAgfVxuICAgICAgaWYgKCdSZWYnIGluIHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBbYCR7c3RhY2tOYW1lfS4ke3ZhbHVlLlJlZn1gXTtcbiAgICAgIH1cbiAgICAgIGlmICgnRm46OkdldEF0dCcgaW4gdmFsdWUpIHtcbiAgICAgICAgY29uc3QgcmVmVGFyZ2V0ID0gQXJyYXkuaXNBcnJheSh2YWx1ZVsnRm46OkdldEF0dCddKVxuICAgICAgICAgID8gdmFsdWVbJ0ZuOjpHZXRBdHQnXVswXVxuICAgICAgICAgIDogdmFsdWVbJ0ZuOjpHZXRBdHQnXS5zcGxpdCgnLicpWzBdO1xuICAgICAgICByZXR1cm4gW2Ake3N0YWNrTmFtZX0uJHtyZWZUYXJnZXR9YF07XG4gICAgICB9XG4gICAgICBpZiAoJ0ZuOjpJbXBvcnRWYWx1ZScgaW4gdmFsdWUpIHtcbiAgICAgICAgY29uc3QgZXhwID0gZXhwb3J0c1t2YWx1ZVsnRm46OkltcG9ydFZhbHVlJ11dO1xuICAgICAgICBjb25zdCB2ID0gZXhwLnZhbHVlO1xuICAgICAgICBpZiAoJ0ZuOjpHZXRBdHQnIGluIHYpIHtcbiAgICAgICAgICBjb25zdCBpZCA9IEFycmF5LmlzQXJyYXkodlsnRm46OkdldEF0dCddKSA/IHZbJ0ZuOjpHZXRBdHQnXVswXSA6IHZbJ0ZuOjpHZXRBdHQnXS5zcGxpdCgnLicpWzBdO1xuICAgICAgICAgIHJldHVybiBbYCR7ZXhwLnN0YWNrTmFtZX0uJHtpZH1gXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoJ1JlZicgaW4gdikge1xuICAgICAgICAgIHJldHVybiBbYCR7ZXhwLnN0YWNrTmFtZX0uJHt2LlJlZn1gXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW2Ake2V4cC5zdGFja05hbWV9LiR7dn1gXTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlc3VsdDogc3RyaW5nW10gPSBbXTtcbiAgICAgIGlmICgnRGVwZW5kc09uJyBpbiB2YWx1ZSkge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZS5EZXBlbmRzT24pKSB7XG4gICAgICAgICAgcmVzdWx0LnB1c2goLi4udmFsdWUuRGVwZW5kc09uLm1hcCgocjogc3RyaW5nKSA9PiBgJHtzdGFja05hbWV9LiR7cn1gKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzdWx0LnB1c2goYCR7c3RhY2tOYW1lfS4ke3ZhbHVlLkRlcGVuZHNPbn1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmVzdWx0LnB1c2goLi4uT2JqZWN0LnZhbHVlcyh2YWx1ZSkuZmxhdE1hcCgocmVzKSA9PiBmaW5kRGVwZW5kZW5jaWVzKHN0YWNrTmFtZSwgcmVzKSkpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuXG4gICAgZm9yIChjb25zdCBbaWQsIHJlc10gb2YgT2JqZWN0LmVudHJpZXMocmVzb3VyY2VzKSkge1xuICAgICAgY29uc3Qgc3RhY2tOYW1lID0gaWQuc3BsaXQoJy4nKVswXTtcbiAgICAgIGNvbnN0IGRlcHMgPSBmaW5kRGVwZW5kZW5jaWVzKHN0YWNrTmFtZSwgcmVzIHx8IHt9KTtcbiAgICAgIGZvciAoY29uc3QgZGVwIG9mIGRlcHMpIHtcbiAgICAgICAgaWYgKGRlcCBpbiByZXNvdXJjZXMgJiYgZGVwICE9PSBpZCkge1xuICAgICAgICAgIGVkZ2VzW2lkXS5hZGQoZGVwKTtcbiAgICAgICAgICByZXZlcnNlRWRnZXNbZGVwXS5hZGQoaWQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBSZXNvdXJjZUdyYXBoKGVkZ2VzLCByZXZlcnNlRWRnZXMpO1xuICB9XG5cbiAgcHJpdmF0ZSByZWFkb25seSBlZGdlczogUmVjb3JkPHN0cmluZywgU2V0PHN0cmluZz4+ID0ge307XG4gIHByaXZhdGUgcmVhZG9ubHkgcmV2ZXJzZUVkZ2VzOiBSZWNvcmQ8c3RyaW5nLCBTZXQ8c3RyaW5nPj4gPSB7fTtcblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKGVkZ2VzOiBSZWNvcmQ8c3RyaW5nLCBTZXQ8c3RyaW5nPj4sIHJldmVyc2VFZGdlczogUmVjb3JkPHN0cmluZywgU2V0PHN0cmluZz4+KSB7XG4gICAgdGhpcy5lZGdlcyA9IGVkZ2VzO1xuICAgIHRoaXMucmV2ZXJzZUVkZ2VzID0gcmV2ZXJzZUVkZ2VzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHNvcnRlZCBub2RlcyBpbiB0b3BvbG9naWNhbCBvcmRlci5cbiAgICovXG4gIGdldCBzb3J0ZWROb2RlcygpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgcmVzdWx0OiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IG91dERlZ3JlZSA9IE9iamVjdC5rZXlzKHRoaXMuZWRnZXMpLnJlZHVjZSgoYWNjLCBrKSA9PiB7XG4gICAgICBhY2Nba10gPSB0aGlzLmVkZ2VzW2tdLnNpemU7XG4gICAgICByZXR1cm4gYWNjO1xuICAgIH0sIHt9IGFzIFJlY29yZDxzdHJpbmcsIG51bWJlcj4pO1xuXG4gICAgY29uc3QgcXVldWUgPSBPYmplY3Qua2V5cyhvdXREZWdyZWUpLmZpbHRlcigoaykgPT4gb3V0RGVncmVlW2tdID09PSAwKTtcblxuICAgIHdoaWxlIChxdWV1ZS5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBub2RlID0gcXVldWUuc2hpZnQoKSE7XG4gICAgICByZXN1bHQucHVzaChub2RlKTtcbiAgICAgIGZvciAoY29uc3Qgbnh0IG9mIHRoaXMucmV2ZXJzZUVkZ2VzW25vZGVdKSB7XG4gICAgICAgIG91dERlZ3JlZVtueHRdLS07XG4gICAgICAgIGlmIChvdXREZWdyZWVbbnh0XSA9PT0gMCkge1xuICAgICAgICAgIHF1ZXVlLnB1c2gobnh0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHVibGljIGluTmVpZ2hib3JzKG5vZGU6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICBpZiAoIShub2RlIGluIHRoaXMuZWRnZXMpKSB7XG4gICAgICB0aHJvdyBuZXcgVG9vbGtpdEVycm9yKGBOb2RlICR7bm9kZX0gbm90IGZvdW5kIGluIHRoZSBncmFwaGApO1xuICAgIH1cbiAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLnJldmVyc2VFZGdlc1tub2RlXSB8fCBbXSk7XG4gIH1cblxuICBwdWJsaWMgb3V0TmVpZ2hib3JzKG5vZGU6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICBpZiAoIShub2RlIGluIHRoaXMuZWRnZXMpKSB7XG4gICAgICB0aHJvdyBuZXcgVG9vbGtpdEVycm9yKGBOb2RlICR7bm9kZX0gbm90IGZvdW5kIGluIHRoZSBncmFwaGApO1xuICAgIH1cbiAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLmVkZ2VzW25vZGVdIHx8IFtdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFub3RoZXIgZ3JhcGggd2l0aCB0aGUgc2FtZSBub2RlcywgYnV0IHdpdGggdGhlIGVkZ2VzIGludmVydGVkXG4gICAqL1xuICBwdWJsaWMgb3Bwb3NpdGUoKTogUmVzb3VyY2VHcmFwaCB7XG4gICAgcmV0dXJuIG5ldyBSZXNvdXJjZUdyYXBoKHRoaXMucmV2ZXJzZUVkZ2VzLCB0aGlzLmVkZ2VzKTtcbiAgfVxufVxuIl19