aws-cdk 2.20.0 → 2.22.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 (33) hide show
  1. package/THIRD_PARTY_LICENSES +8 -28
  2. package/build-info.json +2 -2
  3. package/does-not-exist.json +1 -1
  4. package/lib/api/aws-auth/account-cache.d.ts +1 -1
  5. package/lib/api/aws-auth/account-cache.js +2 -2
  6. package/lib/api/deploy-stack.js +18 -6
  7. package/lib/api/util/cloudformation/stack-activity-monitor.d.ts +5 -0
  8. package/lib/api/util/cloudformation/stack-activity-monitor.js +19 -3
  9. package/lib/api/util/cloudformation.d.ts +6 -3
  10. package/lib/api/util/cloudformation.js +27 -8
  11. package/lib/api/util/display.d.ts +2 -1
  12. package/lib/api/util/display.js +14 -19
  13. package/lib/cli.js +2 -3
  14. package/lib/index.js +8351 -5344
  15. package/lib/init-templates/v1/app/csharp/README.md +1 -1
  16. package/lib/init-templates/v1/app/fsharp/README.md +1 -1
  17. package/lib/init-templates/v1/app/go/README.md +1 -1
  18. package/lib/init-templates/v1/app/java/README.md +1 -1
  19. package/lib/init-templates/v1/app/javascript/README.md +1 -1
  20. package/lib/init-templates/v1/app/python/README.template.md +1 -1
  21. package/lib/init-templates/v1/app/typescript/README.md +1 -1
  22. package/lib/init-templates/v2/app/csharp/README.md +1 -1
  23. package/lib/init-templates/v2/app/fsharp/README.md +1 -1
  24. package/lib/init-templates/v2/app/go/README.md +1 -1
  25. package/lib/init-templates/v2/app/java/README.md +1 -1
  26. package/lib/init-templates/v2/app/javascript/README.md +1 -1
  27. package/lib/init-templates/v2/app/python/README.template.md +1 -1
  28. package/lib/init-templates/v2/app/typescript/README.md +1 -1
  29. package/lib/notices.d.ts +1 -0
  30. package/lib/notices.js +43 -21
  31. package/package.json +11 -11
  32. package/test/api/util/display.test.js +21 -1
  33. package/test/notices.test.js +35 -21
@@ -1,6 +1,6 @@
1
1
  # Welcome to your CDK C# project!
2
2
 
3
- This is a blank project for C# development with CDK.
3
+ This is a blank project for CDK development with C#.
4
4
 
5
5
  The `cdk.json` file tells the CDK Toolkit how to execute your app.
6
6
 
@@ -1,6 +1,6 @@
1
1
  ## Welcome to your CDK F# project!
2
2
 
3
- This is a blank project for F# development with CDK.
3
+ This is a blank project for CDK development with F#.
4
4
 
5
5
  The `cdk.json` file tells the CDK Toolkit how to execute your app.
6
6
 
@@ -1,6 +1,6 @@
1
1
  # Welcome to your CDK Go project!
2
2
 
3
- This is a blank project for Go development with CDK.
3
+ This is a blank project for CDK development with Go.
4
4
 
5
5
  **NOTICE**: Go support is still in Developer Preview. This implies that APIs may
6
6
  change while we address early feedback from the community. We would love to hear
@@ -1,6 +1,6 @@
1
1
  # Welcome to your CDK Java project!
2
2
 
3
- This is a blank project for Java development with CDK.
3
+ This is a blank project for CDK development with Java.
4
4
 
5
5
  The `cdk.json` file tells the CDK Toolkit how to execute your app.
6
6
 
@@ -1,6 +1,6 @@
1
1
  # Welcome to your CDK JavaScript project
2
2
 
3
- This is a blank project for JavaScript development with CDK.
3
+ This is a blank project for CDK development with JavaScript.
4
4
 
5
5
  The `cdk.json` file tells the CDK Toolkit how to execute your app. The build step is not required when using JavaScript.
6
6
 
@@ -1,7 +1,7 @@
1
1
 
2
2
  # Welcome to your CDK Python project!
3
3
 
4
- This is a blank project for Python development with CDK.
4
+ This is a blank project for CDK development with Python.
5
5
 
6
6
  The `cdk.json` file tells the CDK Toolkit how to execute your app.
7
7
 
@@ -1,6 +1,6 @@
1
1
  # Welcome to your CDK TypeScript project
2
2
 
3
- This is a blank project for TypeScript development with CDK.
3
+ This is a blank project for CDK development with TypeScript.
4
4
 
5
5
  The `cdk.json` file tells the CDK Toolkit how to execute your app.
6
6
 
@@ -1,6 +1,6 @@
1
1
  # Welcome to your CDK C# project!
2
2
 
3
- This is a blank project for C# development with CDK.
3
+ This is a blank project for CDK development with C#.
4
4
 
5
5
  The `cdk.json` file tells the CDK Toolkit how to execute your app.
6
6
 
@@ -1,6 +1,6 @@
1
1
  ## Welcome to your CDK F# project!
2
2
 
3
- This is a blank project for F# development with CDK.
3
+ This is a blank project for CDK development with F#.
4
4
 
5
5
  The `cdk.json` file tells the CDK Toolkit how to execute your app.
6
6
 
@@ -1,6 +1,6 @@
1
1
  # Welcome to your CDK Go project!
2
2
 
3
- This is a blank project for Go development with CDK.
3
+ This is a blank project for CDK development with Go.
4
4
 
5
5
  **NOTICE**: Go support is still in Developer Preview. This implies that APIs may
6
6
  change while we address early feedback from the community. We would love to hear
@@ -1,6 +1,6 @@
1
1
  # Welcome to your CDK Java project!
2
2
 
3
- This is a blank project for Java development with CDK.
3
+ This is a blank project for CDK development with Java.
4
4
 
5
5
  The `cdk.json` file tells the CDK Toolkit how to execute your app.
6
6
 
@@ -1,6 +1,6 @@
1
1
  # Welcome to your CDK JavaScript project
2
2
 
3
- This is a blank project for JavaScript development with CDK.
3
+ This is a blank project for CDK development with JavaScript.
4
4
 
5
5
  The `cdk.json` file tells the CDK Toolkit how to execute your app. The build step is not required when using JavaScript.
6
6
 
@@ -1,7 +1,7 @@
1
1
 
2
2
  # Welcome to your CDK Python project!
3
3
 
4
- This is a blank project for Python development with CDK.
4
+ This is a blank project for CDK development with Python.
5
5
 
6
6
  The `cdk.json` file tells the CDK Toolkit how to execute your app.
7
7
 
@@ -1,6 +1,6 @@
1
1
  # Welcome to your CDK TypeScript project
2
2
 
3
- This is a blank project for TypeScript development with CDK.
3
+ This is a blank project for CDK development with TypeScript.
4
4
 
5
5
  The `cdk.json` file tells the CDK Toolkit how to execute your app.
6
6
 
package/lib/notices.d.ts CHANGED
@@ -50,6 +50,7 @@ export declare class CachedDataSource implements NoticeDataSource {
50
50
  private readonly skipCache?;
51
51
  constructor(fileName: string, dataSource: NoticeDataSource, skipCache?: boolean | undefined);
52
52
  fetch(): Promise<Notice[]>;
53
+ private fetchInner;
53
54
  private load;
54
55
  private save;
55
56
  }
package/lib/notices.js CHANGED
@@ -62,8 +62,7 @@ exports.formatNotices = formatNotices;
62
62
  class WebsiteNoticeDataSource {
63
63
  fetch() {
64
64
  const timeout = 3000;
65
- return new Promise((resolve) => {
66
- setTimeout(() => resolve([]), timeout);
65
+ return new Promise((resolve, reject) => {
67
66
  try {
68
67
  const req = https.get('https://cli.cdk.dev-tools.aws.dev/notices.json', { timeout }, res => {
69
68
  if (res.statusCode === 200) {
@@ -75,38 +74,48 @@ class WebsiteNoticeDataSource {
75
74
  res.on('end', () => {
76
75
  try {
77
76
  const data = JSON.parse(rawData).notices;
77
+ if (!data) {
78
+ throw new Error("'notices' key is missing");
79
+ }
80
+ logging_1.debug('Notices refreshed');
78
81
  resolve(data !== null && data !== void 0 ? data : []);
79
82
  }
80
83
  catch (e) {
81
- logging_1.debug(`Failed to parse notices: ${e}`);
82
- resolve([]);
84
+ reject(new Error(`Failed to parse notices: ${e.message}`));
83
85
  }
84
86
  });
85
87
  res.on('error', e => {
86
- logging_1.debug(`Failed to fetch notices: ${e}`);
87
- resolve([]);
88
+ reject(new Error(`Failed to fetch notices: ${e.message}`));
88
89
  });
89
90
  }
90
91
  else {
91
- logging_1.debug(`Failed to fetch notices. Status code: ${res.statusCode}`);
92
- resolve([]);
92
+ reject(new Error(`Failed to fetch notices. Status code: ${res.statusCode}`));
93
93
  }
94
94
  });
95
- req.on('error', e => {
96
- logging_1.debug(`Error on request: ${e}`);
97
- resolve([]);
95
+ req.on('error', reject);
96
+ req.on('timeout', () => {
97
+ // The 'timeout' event doesn't stop anything by itself, it just
98
+ // notifies that it has been long time since we saw bytes.
99
+ // In our case, we want to give up.
100
+ req.destroy(new Error('Request timed out'));
98
101
  });
99
- req.on('timeout', _ => resolve([]));
102
+ // It's not like I don't *trust* the 'timeout' event... but I don't trust it.
103
+ // Add a backup timer that will destroy the request after all.
104
+ // (This is at least necessary to make the tests pass, but that's probably because of 'nock'.
105
+ // It's not clear whether users will hit this).
106
+ setTimeout(() => {
107
+ req.destroy(new Error('Request timed out. You should never see this message; if you do, please let us know at https://github.com/aws/aws-cdk/issues'));
108
+ }, timeout + 200);
100
109
  }
101
110
  catch (e) {
102
- logging_1.debug(`HTTPS 'get' call threw an error: ${e}`);
103
- resolve([]);
111
+ reject(new Error(`HTTPS 'get' call threw an error: ${e.message}`));
104
112
  }
105
113
  });
106
114
  }
107
115
  }
108
116
  exports.WebsiteNoticeDataSource = WebsiteNoticeDataSource;
109
- const TIME_TO_LIVE = 60 * 60 * 1000; // 1 hour
117
+ const TIME_TO_LIVE_SUCCESS = 60 * 60 * 1000; // 1 hour
118
+ const TIME_TO_LIVE_ERROR = 1 * 60 * 1000; // 1 minute
110
119
  class CachedDataSource {
111
120
  constructor(fileName, dataSource, skipCache) {
112
121
  this.fileName = fileName;
@@ -119,17 +128,30 @@ class CachedDataSource {
119
128
  const data = cachedData.notices;
120
129
  const expiration = (_a = cachedData.expiration) !== null && _a !== void 0 ? _a : 0;
121
130
  if (Date.now() > expiration || this.skipCache) {
122
- const freshData = {
123
- expiration: Date.now() + TIME_TO_LIVE,
124
- notices: await this.dataSource.fetch(),
125
- };
131
+ const freshData = await this.fetchInner();
126
132
  await this.save(freshData);
127
133
  return freshData.notices;
128
134
  }
129
135
  else {
136
+ logging_1.debug(`Reading cached notices from ${this.fileName}`);
130
137
  return data;
131
138
  }
132
139
  }
140
+ async fetchInner() {
141
+ try {
142
+ return {
143
+ expiration: Date.now() + TIME_TO_LIVE_SUCCESS,
144
+ notices: await this.dataSource.fetch(),
145
+ };
146
+ }
147
+ catch (e) {
148
+ logging_1.debug(`Could not refresh notices: ${e}`);
149
+ return {
150
+ expiration: Date.now() + TIME_TO_LIVE_ERROR,
151
+ notices: [],
152
+ };
153
+ }
154
+ }
133
155
  async load() {
134
156
  const defaultValue = {
135
157
  expiration: 0,
@@ -260,7 +282,7 @@ function loadTree(outdir) {
260
282
  return fs.readJSONSync(path.join(outdir, 'tree.json'));
261
283
  }
262
284
  catch (e) {
263
- logging_1.debug(`Failed to get tree.json file: ${e}`);
285
+ logging_1.trace(`Failed to get tree.json file: ${e}. Proceeding with empty tree.`);
264
286
  return {};
265
287
  }
266
288
  }
@@ -278,4 +300,4 @@ function some(node, predicate) {
278
300
  return false;
279
301
  }
280
302
  }
281
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90aWNlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIm5vdGljZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsK0JBQStCO0FBQy9CLDZCQUE2QjtBQUM3QiwrQkFBK0I7QUFDL0IsaUNBQWlDO0FBQ2pDLHVDQUF5QztBQUN6QyxpQ0FBaUM7QUFDakMsb0RBQWlEO0FBQ2pELHVDQUEwQztBQUUxQyxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLHlCQUFXLEVBQUUsRUFBRSxjQUFjLENBQUMsQ0FBQztBQXVCMUQsS0FBSyxVQUFVLGNBQWM7SUFDbEMsTUFBTSxVQUFVLEdBQUcsbUJBQW1CLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDOUMsT0FBTyxVQUFVLENBQUMsS0FBSyxFQUFFLENBQUM7QUFDNUIsQ0FBQztBQUhELHdDQUdDO0FBRU0sS0FBSyxVQUFVLGNBQWMsQ0FBQyxLQUEwQjs7SUFDN0QsTUFBTSxVQUFVLEdBQUcsbUJBQW1CLE9BQUMsS0FBSyxDQUFDLFdBQVcsbUNBQUksS0FBSyxDQUFDLENBQUM7SUFDbkUsZUFBSyxDQUFDLE1BQU0sZUFBZSxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ2hELE9BQU8sQ0FBQyxDQUFDO0FBQ1gsQ0FBQztBQUpELHdDQUlDO0FBRU0sS0FBSyxVQUFVLGVBQWUsQ0FBQyxVQUE0QixFQUFFLEtBQTBCO0lBQzVGLE1BQU0sSUFBSSxHQUFHLE1BQU0sVUFBVSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ3RDLE1BQU0sZUFBZSxHQUFHLGFBQWEsQ0FBQyxJQUFJLEVBQUU7UUFDMUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFNO1FBQ3BCLHdCQUF3QixFQUFFLElBQUksR0FBRyxDQUFDLEtBQUssQ0FBQyx3QkFBd0IsQ0FBQztLQUNsRSxDQUFDLENBQUM7SUFFSCxJQUFJLGVBQWUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1FBQzlCLE1BQU0sa0JBQWtC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QyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDO0tBQ3hEO0lBQUMsT0FBTyxDQUFDLEVBQUU7UUFDVixlQUFLLENBQUMsaUNBQWlDLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDNUMsT0FBTyxFQUFFLENBQUM7S0FDWDtBQUNILENBQUM7QUEwQkQsU0FBUyxJQUFJLENBQUMsSUFBdUIsRUFBRSxTQUE0QztJQUNqRixPQUFPLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksY0FBYyxFQUFFLENBQUMsQ0FBQztJQUU3RCxTQUFTLGNBQWM7UUFDckIsSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksRUFBRTtZQUFFLE9BQU8sS0FBSyxDQUFDO1NBQUU7UUFFNUMsS0FBSyxNQUFNLElBQUksSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2hDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsU0FBUyxDQUFDLEVBQUU7Z0JBQ3hDLE9BQU8sSUFBSSxDQUFDO2FBQ2I7U0FDRjtRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBodHRwcyBmcm9tICdodHRwcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMtZXh0cmEnO1xuaW1wb3J0ICogYXMgc2VtdmVyIGZyb20gJ3NlbXZlcic7XG5pbXBvcnQgeyBkZWJ1ZywgcHJpbnQgfSBmcm9tICcuL2xvZ2dpbmcnO1xuaW1wb3J0IHsgZmxhdE1hcCB9IGZyb20gJy4vdXRpbCc7XG5pbXBvcnQgeyBjZGtDYWNoZURpciB9IGZyb20gJy4vdXRpbC9kaXJlY3Rvcmllcyc7XG5pbXBvcnQgeyB2ZXJzaW9uTnVtYmVyIH0gZnJvbSAnLi92ZXJzaW9uJztcblxuY29uc3QgQ0FDSEVfRklMRV9QQVRIID0gcGF0aC5qb2luKGNka0NhY2hlRGlyKCksICdub3RpY2VzLmpzb24nKTtcblxuZXhwb3J0IGludGVyZmFjZSBEaXNwbGF5Tm90aWNlc1Byb3BzIHtcbiAgLyoqXG4gICAqIFRoZSBjbG91ZCBhc3NlbWJseSBkaXJlY3RvcnkuIFVzdWFsbHkgJ2Nkay5vdXQnLlxuICAgKi9cbiAgcmVhZG9ubHkgb3V0ZGlyOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIElzc3VlIG51bWJlcnMgb2Ygbm90aWNlcyB0aGF0IGhhdmUgYmVlbiBhY2tub3dsZWRnZWQgYnkgYSB1c2VyXG4gICAqIG9mIHRoZSBjdXJyZW50IENESyByZXBvc2l0b3J5LiBUaGVzZSBub3RpY2VzIHdpbGwgYmUgc2tpcHBlZC5cbiAgICovXG4gIHJlYWRvbmx5IGFja25vd2xlZGdlZElzc3VlTnVtYmVyczogbnVtYmVyW107XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgY2FjaGVkIG5vdGljZXMgc2hvdWxkIGJlIGlnbm9yZWQuIFNldHRpbmcgdGhpcyBwcm9wZXJ0eVxuICAgKiB0byB0cnVlIHdpbGwgZm9yY2UgdGhlIENMSSB0byBkb3dubG9hZCBmcmVzaCBkYXRhXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBpZ25vcmVDYWNoZT86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWZyZXNoTm90aWNlcygpIHtcbiAgY29uc3QgZGF0YVNvdXJjZSA9IGRhdGFTb3VyY2VSZWZlcmVuY2UoZmFsc2UpO1xuICByZXR1cm4gZGF0YVNvdXJjZS5mZXRjaCgpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGlzcGxheU5vdGljZXMocHJvcHM6IERpc3BsYXlOb3RpY2VzUHJvcHMpIHtcbiAgY29uc3QgZGF0YVNvdXJjZSA9IGRhdGFTb3VyY2VSZWZlcmVuY2UocHJvcHMuaWdub3JlQ2FjaGUgPz8gZmFsc2UpO1xuICBwcmludChhd2FpdCBnZW5lcmF0ZU1lc3NhZ2UoZGF0YVNvdXJjZSwgcHJvcHMpKTtcbiAgcmV0dXJuIDA7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZU1lc3NhZ2UoZGF0YVNvdXJjZTogTm90aWNlRGF0YVNvdXJjZSwgcHJvcHM6IERpc3BsYXlOb3RpY2VzUHJvcHMpIHtcbiAgY29uc3QgZGF0YSA9IGF3YWl0IGRhdGFTb3VyY2UuZmV0Y2goKTtcbiAgY29uc3QgZmlsdGVyZWROb3RpY2VzID0gZmlsdGVyTm90aWNlcyhkYXRhLCB7XG4gICAgb3V0ZGlyOiBwcm9wcy5vdXRkaXIsXG4gICAgYWNrbm93bGVkZ2VkSXNzdWVOdW1iZXJzOiBuZXcgU2V0KHByb3BzLmFja25vd2xlZGdlZElzc3VlTnVtYmVycyksXG4gIH0pO1xuXG4gIGlmIChmaWx0ZXJlZE5vdGljZXMubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IGluZGl2aWR1YWxNZXNzYWdlcyA9IGZvcm1hdE5vdGljZXMoZmlsdGVyZWROb3RpY2VzKTtcbiAgICByZXR1cm4gZmluYWxNZXNzYWdlKGluZGl2aWR1YWxNZXNzYWdlcywgZmlsdGVyZWROb3RpY2VzWzBdLmlzc3VlTnVtYmVyKTtcbiAgfVxuICByZXR1cm4gJyc7XG59XG5cbmZ1bmN0aW9uIGRhdGFTb3VyY2VSZWZlcmVuY2UoaWdub3JlQ2FjaGU6IGJvb2xlYW4pOiBOb3RpY2VEYXRhU291cmNlIHtcbiAgcmV0dXJuIG5ldyBDYWNoZWREYXRhU291cmNlKENBQ0hFX0ZJTEVfUEFUSCwgbmV3IFdlYnNpdGVOb3RpY2VEYXRhU291cmNlKCksIGlnbm9yZUNhY2hlKTtcbn1cblxuZnVuY3Rpb24gZmluYWxNZXNzYWdlKGluZGl2aWR1YWxNZXNzYWdlczogc3RyaW5nW10sIGV4YW1wbGVOdW1iZXI6IG51bWJlcik6IHN0cmluZyB7XG4gIHJldHVybiBbXG4gICAgJ1xcbk5PVElDRVMnLFxuICAgIC4uLmluZGl2aWR1YWxNZXNzYWdlcyxcbiAgICBgSWYgeW91IGRvbuKAmXQgd2FudCB0byBzZWUgYSBub3RpY2UgYW55bW9yZSwgdXNlIFwiY2RrIGFja25vd2xlZGdlIDxpZD5cIi4gRm9yIGV4YW1wbGUsIFwiY2RrIGFja25vd2xlZGdlICR7ZXhhbXBsZU51bWJlcn1cIi5gLFxuICBdLmpvaW4oJ1xcblxcbicpO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZpbHRlck5vdGljZU9wdGlvbnMge1xuICBvdXRkaXI/OiBzdHJpbmcsXG4gIGNsaVZlcnNpb24/OiBzdHJpbmcsXG4gIGZyYW1ld29ya1ZlcnNpb24/OiBzdHJpbmcsXG4gIGFja25vd2xlZGdlZElzc3VlTnVtYmVycz86IFNldDxudW1iZXI+LFxufVxuXG5leHBvcnQgZnVuY3Rpb24gZmlsdGVyTm90aWNlcyhkYXRhOiBOb3RpY2VbXSwgb3B0aW9uczogRmlsdGVyTm90aWNlT3B0aW9ucyk6IE5vdGljZVtdIHtcbiAgY29uc3QgZmlsdGVyID0gbmV3IE5vdGljZUZpbHRlcih7XG4gICAgY2xpVmVyc2lvbjogb3B0aW9ucy5jbGlWZXJzaW9uID8/IHZlcnNpb25OdW1iZXIoKSxcbiAgICBhY2tub3dsZWRnZWRJc3N1ZU51bWJlcnM6IG9wdGlvbnMuYWNrbm93bGVkZ2VkSXNzdWVOdW1iZXJzID8/IG5ldyBTZXQoKSxcbiAgICB0cmVlOiBsb2FkVHJlZShvcHRpb25zLm91dGRpciA/PyAnY2RrLm91dCcpLnRyZWUsXG4gIH0pO1xuICByZXR1cm4gZGF0YS5maWx0ZXIobm90aWNlID0+IGZpbHRlci5hcHBseShub3RpY2UpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdE5vdGljZXMoZGF0YTogTm90aWNlW10pOiBzdHJpbmdbXSB7XG4gIHJldHVybiBkYXRhLm1hcChmb3JtYXROb3RpY2UpO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbXBvbmVudCB7XG4gIG5hbWU6IHN0cmluZztcbiAgdmVyc2lvbjogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE5vdGljZSB7XG4gIHRpdGxlOiBzdHJpbmc7XG4gIGlzc3VlTnVtYmVyOiBudW1iZXI7XG4gIG92ZXJ2aWV3OiBzdHJpbmc7XG4gIGNvbXBvbmVudHM6IENvbXBvbmVudFtdO1xuICBzY2hlbWFWZXJzaW9uOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTm90aWNlRGF0YVNvdXJjZSB7XG4gIGZldGNoKCk6IFByb21pc2U8Tm90aWNlW10+LFxufVxuXG5leHBvcnQgY2xhc3MgV2Vic2l0ZU5vdGljZURhdGFTb3VyY2UgaW1wbGVtZW50cyBOb3RpY2VEYXRhU291cmNlIHtcbiAgZmV0Y2goKTogUHJvbWlzZTxOb3RpY2VbXT4ge1xuICAgIGNvbnN0IHRpbWVvdXQgPSAzMDAwO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHJlc29sdmUoW10pLCB0aW1lb3V0KTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlcSA9IGh0dHBzLmdldCgnaHR0cHM6Ly9jbGkuY2RrLmRldi10b29scy5hd3MuZGV2L25vdGljZXMuanNvbicsXG4gICAgICAgICAgeyB0aW1lb3V0IH0sXG4gICAgICAgICAgcmVzID0+IHtcbiAgICAgICAgICAgIGlmIChyZXMuc3RhdHVzQ29kZSA9PT0gMjAwKSB7XG4gICAgICAgICAgICAgIHJlcy5zZXRFbmNvZGluZygndXRmOCcpO1xuICAgICAgICAgICAgICBsZXQgcmF3RGF0YSA9ICcnO1xuICAgICAgICAgICAgICByZXMub24oJ2RhdGEnLCAoY2h1bmspID0+IHtcbiAgICAgICAgICAgICAgICByYXdEYXRhICs9IGNodW5rO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgcmVzLm9uKCdlbmQnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKHJhd0RhdGEpLm5vdGljZXMgYXMgTm90aWNlW107XG4gICAgICAgICAgICAgICAgICByZXNvbHZlKGRhdGEgPz8gW10pO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgIGRlYnVnKGBGYWlsZWQgdG8gcGFyc2Ugbm90aWNlczogJHtlfWApO1xuICAgICAgICAgICAgICAgICAgcmVzb2x2ZShbXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgcmVzLm9uKCdlcnJvcicsIGUgPT4ge1xuICAgICAgICAgICAgICAgIGRlYnVnKGBGYWlsZWQgdG8gZmV0Y2ggbm90aWNlczogJHtlfWApO1xuICAgICAgICAgICAgICAgIHJlc29sdmUoW10pO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGRlYnVnKGBGYWlsZWQgdG8gZmV0Y2ggbm90aWNlcy4gU3RhdHVzIGNvZGU6ICR7cmVzLnN0YXR1c0NvZGV9YCk7XG4gICAgICAgICAgICAgIHJlc29sdmUoW10pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICByZXEub24oJ2Vycm9yJywgZSA9PiB7XG4gICAgICAgICAgZGVidWcoYEVycm9yIG9uIHJlcXVlc3Q6ICR7ZX1gKTtcbiAgICAgICAgICByZXNvbHZlKFtdKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJlcS5vbigndGltZW91dCcsIF8gPT4gcmVzb2x2ZShbXSkpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBkZWJ1ZyhgSFRUUFMgJ2dldCcgY2FsbCB0aHJldyBhbiBlcnJvcjogJHtlfWApO1xuICAgICAgICByZXNvbHZlKFtdKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuXG5pbnRlcmZhY2UgQ2FjaGVkTm90aWNlcyB7XG4gIGV4cGlyYXRpb246IG51bWJlcixcbiAgbm90aWNlczogTm90aWNlW10sXG59XG5cbmNvbnN0IFRJTUVfVE9fTElWRSA9IDYwICogNjAgKiAxMDAwOyAvLyAxIGhvdXJcblxuZXhwb3J0IGNsYXNzIENhY2hlZERhdGFTb3VyY2UgaW1wbGVtZW50cyBOb3RpY2VEYXRhU291cmNlIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBmaWxlTmFtZTogc3RyaW5nLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZGF0YVNvdXJjZTogTm90aWNlRGF0YVNvdXJjZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHNraXBDYWNoZT86IGJvb2xlYW4pIHtcbiAgfVxuXG4gIGFzeW5jIGZldGNoKCk6IFByb21pc2U8Tm90aWNlW10+IHtcbiAgICBjb25zdCBjYWNoZWREYXRhID0gYXdhaXQgdGhpcy5sb2FkKCk7XG4gICAgY29uc3QgZGF0YSA9IGNhY2hlZERhdGEubm90aWNlcztcbiAgICBjb25zdCBleHBpcmF0aW9uID0gY2FjaGVkRGF0YS5leHBpcmF0aW9uID8/IDA7XG5cbiAgICBpZiAoRGF0ZS5ub3coKSA+IGV4cGlyYXRpb24gfHwgdGhpcy5za2lwQ2FjaGUpIHtcbiAgICAgIGNvbnN0IGZyZXNoRGF0YSA9IHtcbiAgICAgICAgZXhwaXJhdGlvbjogRGF0ZS5ub3coKSArIFRJTUVfVE9fTElWRSxcbiAgICAgICAgbm90aWNlczogYXdhaXQgdGhpcy5kYXRhU291cmNlLmZldGNoKCksXG4gICAgICB9O1xuICAgICAgYXdhaXQgdGhpcy5zYXZlKGZyZXNoRGF0YSk7XG4gICAgICByZXR1cm4gZnJlc2hEYXRhLm5vdGljZXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgbG9hZCgpOiBQcm9taXNlPENhY2hlZE5vdGljZXM+IHtcbiAgICBjb25zdCBkZWZhdWx0VmFsdWUgPSB7XG4gICAgICBleHBpcmF0aW9uOiAwLFxuICAgICAgbm90aWNlczogW10sXG4gICAgfTtcblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gZnMuZXhpc3RzU3luYyh0aGlzLmZpbGVOYW1lKVxuICAgICAgICA/IGF3YWl0IGZzLnJlYWRKU09OKHRoaXMuZmlsZU5hbWUpIGFzIENhY2hlZE5vdGljZXNcbiAgICAgICAgOiBkZWZhdWx0VmFsdWU7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgZGVidWcoYEZhaWxlZCB0byBsb2FkIG5vdGljZXMgZnJvbSBjYWNoZTogJHtlfWApO1xuICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHNhdmUoY2FjaGVkOiBDYWNoZWROb3RpY2VzKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGZzLndyaXRlSlNPTih0aGlzLmZpbGVOYW1lLCBjYWNoZWQpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGRlYnVnKGBGYWlsZWQgdG8gc3RvcmUgbm90aWNlcyBpbiB0aGUgY2FjaGU6ICR7ZX1gKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBOb3RpY2VGaWx0ZXJQcm9wcyB7XG4gIGNsaVZlcnNpb246IHN0cmluZyxcbiAgYWNrbm93bGVkZ2VkSXNzdWVOdW1iZXJzOiBTZXQ8bnVtYmVyPixcbiAgdHJlZTogQ29uc3RydWN0VHJlZU5vZGUsXG59XG5cbmV4cG9ydCBjbGFzcyBOb3RpY2VGaWx0ZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IGFja25vd2xlZGdlZElzc3VlTnVtYmVyczogU2V0PG51bWJlcj47XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBwcm9wczogTm90aWNlRmlsdGVyUHJvcHMpIHtcbiAgICB0aGlzLmFja25vd2xlZGdlZElzc3VlTnVtYmVycyA9IHByb3BzLmFja25vd2xlZGdlZElzc3VlTnVtYmVycztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWZmIHdlIHNob3VsZCBzaG93IHRoaXMgbm90aWNlLlxuICAgKi9cbiAgYXBwbHkobm90aWNlOiBOb3RpY2UpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5hY2tub3dsZWRnZWRJc3N1ZU51bWJlcnMuaGFzKG5vdGljZS5pc3N1ZU51bWJlcikpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5hcHBseVZlcnNpb24obm90aWNlLCAnY2xpJywgdGhpcy5wcm9wcy5jbGlWZXJzaW9uKSB8fFxuICAgICAgbWF0Y2gocmVzb2x2ZUFsaWFzZXMobm90aWNlLmNvbXBvbmVudHMpLCB0aGlzLnByb3BzLnRyZWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZmYgd2Ugc2hvdWxkIHNob3cgdGhlIG5vdGljZS5cbiAgICovXG4gIHByaXZhdGUgYXBwbHlWZXJzaW9uKG5vdGljZTogTm90aWNlLCBuYW1lOiBzdHJpbmcsIGNvbXBhcmVUb1ZlcnNpb246IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICAgIGlmIChjb21wYXJlVG9WZXJzaW9uID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIGZhbHNlOyB9XG5cbiAgICBjb25zdCBhZmZlY3RlZENvbXBvbmVudCA9IG5vdGljZS5jb21wb25lbnRzLmZpbmQoY29tcG9uZW50ID0+IGNvbXBvbmVudC5uYW1lID09PSBuYW1lKTtcbiAgICBjb25zdCBhZmZlY3RlZFJhbmdlID0gYWZmZWN0ZWRDb21wb25lbnQ/LnZlcnNpb247XG4gICAgcmV0dXJuIGFmZmVjdGVkUmFuZ2UgIT0gbnVsbCAmJiBzZW12ZXIuc2F0aXNmaWVzKGNvbXBhcmVUb1ZlcnNpb24sIGFmZmVjdGVkUmFuZ2UpO1xuICB9XG59XG5cbi8qKlxuICogU29tZSBjb21wb25lbnQgbmFtZXMgYXJlIGFsaWFzZXMgdG8gYWN0dWFsIGNvbXBvbmVudCBuYW1lcy4gRm9yIGV4YW1wbGUgXCJmcmFtZXdvcmtcIlxuICogaXMgYW4gYWxpYXMgZm9yIGVpdGhlciB0aGUgY29yZSBsaWJyYXJ5ICh2MSkgb3IgdGhlIHdob2xlIENESyBsaWJyYXJ5ICh2MikuXG4gKlxuICogVGhpcyBmdW5jdGlvbiBjb252ZXJ0cyBhbGwgYWxpYXNlcyB0byB0aGVpciBhY3R1YWwgY291bnRlcnBhcnQgbmFtZXMsIHRvIGJlIHVzZWQgdG9cbiAqIG1hdGNoIGFnYWluc3QgdGhlIGNvbnN0cnVjdCB0cmVlLlxuICpcbiAqIEBwYXJhbSBjb21wb25lbnRzIGEgbGlzdCBvZiBjb21wb25lbnRzLiBDb21wb25lbnRzIHdob3NlIG5hbWUgaXMgYW4gYWxpYXMgd2lsbCBiZVxuICogdHJhbnNmb3JtZWQgYW5kIGFsbCBvdGhlcnMgd2lsbCBiZSBsZWZ0IGludGFjdC5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZUFsaWFzZXMoY29tcG9uZW50czogQ29tcG9uZW50W10pOiBDb21wb25lbnRbXSB7XG4gIHJldHVybiBmbGF0TWFwKGNvbXBvbmVudHMsIGNvbXBvbmVudCA9PiB7XG4gICAgaWYgKGNvbXBvbmVudC5uYW1lID09PSAnZnJhbWV3b3JrJykge1xuICAgICAgcmV0dXJuIFt7XG4gICAgICAgIG5hbWU6ICdAYXdzLWNkay9jb3JlLicsXG4gICAgICAgIHZlcnNpb246IGNvbXBvbmVudC52ZXJzaW9uLFxuICAgICAgfSwge1xuICAgICAgICBuYW1lOiAnYXdzLWNkay1saWIuJyxcbiAgICAgICAgdmVyc2lvbjogY29tcG9uZW50LnZlcnNpb24sXG4gICAgICB9XTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFtjb21wb25lbnRdO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdE5vdGljZShub3RpY2U6IE5vdGljZSk6IHN0cmluZyB7XG4gIGNvbnN0IGNvbXBvbmVudHNWYWx1ZSA9IG5vdGljZS5jb21wb25lbnRzLm1hcChjID0+IGAke2MubmFtZX06ICR7Yy52ZXJzaW9ufWApLmpvaW4oJywgJyk7XG4gIHJldHVybiBbXG4gICAgYCR7bm90aWNlLmlzc3VlTnVtYmVyfVxcdCR7bm90aWNlLnRpdGxlfWAsXG4gICAgZm9ybWF0T3ZlcnZpZXcobm90aWNlLm92ZXJ2aWV3KSxcbiAgICBgXFx0QWZmZWN0ZWQgdmVyc2lvbnM6ICR7Y29tcG9uZW50c1ZhbHVlfWAsXG4gICAgYFxcdE1vcmUgaW5mb3JtYXRpb24gYXQ6IGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvYXdzLWNkay9pc3N1ZXMvJHtub3RpY2UuaXNzdWVOdW1iZXJ9YCxcbiAgXS5qb2luKCdcXG5cXG4nKSArICdcXG4nO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRPdmVydmlldyh0ZXh0OiBzdHJpbmcpIHtcbiAgY29uc3Qgd3JhcCA9IChzOiBzdHJpbmcpID0+IHMucmVwbGFjZSgvKD8hW15cXG5dezEsNjB9JCkoW15cXG5dezEsNjB9KVxccy9nLCAnJDFcXG4nKTtcblxuICBjb25zdCBoZWFkaW5nID0gJ092ZXJ2aWV3OiAnO1xuICBjb25zdCBzZXBhcmF0b3IgPSBgXFxuXFx0JHsnICcucmVwZWF0KGhlYWRpbmcubGVuZ3RoKX1gO1xuICBjb25zdCBjb250ZW50ID0gd3JhcCh0ZXh0KVxuICAgIC5zcGxpdCgnXFxuJylcbiAgICAuam9pbihzZXBhcmF0b3IpO1xuXG4gIHJldHVybiAnXFx0JyArIGhlYWRpbmcgKyBjb250ZW50O1xufVxuXG4vKipcbiAqIFdoZXRoZXIgYW55IGNvbXBvbmVudCBpbiB0aGUgdHJlZSBtYXRjaGVzIGFueSBjb21wb25lbnQgaW4gdGhlIHF1ZXJ5LlxuICogQSBtYXRjaCBoYXBwZW5zIHdoZW46XG4gKlxuICogMS4gVGhlIHZlcnNpb24gb2YgdGhlIG5vZGUgbWF0Y2hlcyB0aGUgdmVyc2lvbiBpbiB0aGUgcXVlcnksIGludGVycHJldGVkXG4gKiBhcyBhIHNlbXZlciByYW5nZS5cbiAqXG4gKiAyLiBUaGUgbmFtZSBpbiB0aGUgcXVlcnkgaXMgYSBwcmVmaXggb2YgdGhlIG5vZGUgbmFtZSB3aGVuIHRoZSBxdWVyeSBlbmRzIGluICcuJyxcbiAqIG9yIHRoZSB0d28gbmFtZXMgYXJlIGV4YWN0bHkgdGhlIHNhbWUsIG90aGVyd2lzZS5cbiAqL1xuZnVuY3Rpb24gbWF0Y2gocXVlcnk6IENvbXBvbmVudFtdLCB0cmVlOiBDb25zdHJ1Y3RUcmVlTm9kZSk6IGJvb2xlYW4ge1xuICByZXR1cm4gc29tZSh0cmVlLCBub2RlID0+IHtcbiAgICByZXR1cm4gcXVlcnkuc29tZShjb21wb25lbnQgPT5cbiAgICAgIGNvbXBhcmVOYW1lcyhjb21wb25lbnQubmFtZSwgbm9kZS5jb25zdHJ1Y3RJbmZvPy5mcW4pICYmXG4gICAgICBjb21wYXJlVmVyc2lvbnMoY29tcG9uZW50LnZlcnNpb24sIG5vZGUuY29uc3RydWN0SW5mbz8udmVyc2lvbikpO1xuICB9KTtcblxuICBmdW5jdGlvbiBjb21wYXJlTmFtZXMocGF0dGVybjogc3RyaW5nLCB0YXJnZXQ6IHN0cmluZyB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICAgIGlmICh0YXJnZXQgPT0gbnVsbCkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICByZXR1cm4gcGF0dGVybi5lbmRzV2l0aCgnLicpID8gdGFyZ2V0LnN0YXJ0c1dpdGgocGF0dGVybikgOiBwYXR0ZXJuID09PSB0YXJnZXQ7XG4gIH1cblxuICBmdW5jdGlvbiBjb21wYXJlVmVyc2lvbnMocGF0dGVybjogc3RyaW5nLCB0YXJnZXQ6IHN0cmluZyB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBzZW12ZXIuc2F0aXNmaWVzKHRhcmdldCA/PyAnJywgcGF0dGVybik7XG4gIH1cbn1cblxuZnVuY3Rpb24gbG9hZFRyZWUob3V0ZGlyOiBzdHJpbmcpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZnMucmVhZEpTT05TeW5jKHBhdGguam9pbihvdXRkaXIsICd0cmVlLmpzb24nKSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBkZWJ1ZyhgRmFpbGVkIHRvIGdldCB0cmVlLmpzb24gZmlsZTogJHtlfWApO1xuICAgIHJldHVybiB7fTtcbiAgfVxufVxuXG4vKipcbiAqIFNvdXJjZSBpbmZvcm1hdGlvbiBvbiBhIGNvbnN0cnVjdCAoY2xhc3MgZnFuIGFuZCB2ZXJzaW9uKVxuICovXG5pbnRlcmZhY2UgQ29uc3RydWN0SW5mbyB7XG4gIHJlYWRvbmx5IGZxbjogc3RyaW5nO1xuICByZWFkb25seSB2ZXJzaW9uOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSBub2RlIGluIHRoZSBjb25zdHJ1Y3QgdHJlZS5cbiAqIEBpbnRlcm5hbFxuICovXG5pbnRlcmZhY2UgQ29uc3RydWN0VHJlZU5vZGUge1xuICByZWFkb25seSBpZDogc3RyaW5nO1xuICByZWFkb25seSBwYXRoOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGNoaWxkcmVuPzogeyBba2V5OiBzdHJpbmddOiBDb25zdHJ1Y3RUcmVlTm9kZSB9O1xuICByZWFkb25seSBhdHRyaWJ1dGVzPzogeyBba2V5OiBzdHJpbmddOiBhbnkgfTtcblxuICAvKipcbiAgICogSW5mb3JtYXRpb24gb24gdGhlIGNvbnN0cnVjdCBjbGFzcyB0aGF0IGxlZCB0byB0aGlzIG5vZGUsIGlmIGF2YWlsYWJsZVxuICAgKi9cbiAgcmVhZG9ubHkgY29uc3RydWN0SW5mbz86IENvbnN0cnVjdEluZm87XG59XG5cbmZ1bmN0aW9uIHNvbWUobm9kZTogQ29uc3RydWN0VHJlZU5vZGUsIHByZWRpY2F0ZTogKG46IENvbnN0cnVjdFRyZWVOb2RlKSA9PiBib29sZWFuKTogYm9vbGVhbiB7XG4gIHJldHVybiBub2RlICE9IG51bGwgJiYgKHByZWRpY2F0ZShub2RlKSB8fCBmaW5kSW5DaGlsZHJlbigpKTtcblxuICBmdW5jdGlvbiBmaW5kSW5DaGlsZHJlbigpOiBib29sZWFuIHtcbiAgICBpZiAobm9kZS5jaGlsZHJlbiA9PSBudWxsKSB7IHJldHVybiBmYWxzZTsgfVxuXG4gICAgZm9yIChjb25zdCBuYW1lIGluIG5vZGUuY2hpbGRyZW4pIHtcbiAgICAgIGlmIChzb21lKG5vZGUuY2hpbGRyZW5bbmFtZV0sIHByZWRpY2F0ZSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuIl19
303
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90aWNlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIm5vdGljZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsK0JBQStCO0FBQy9CLDZCQUE2QjtBQUM3QiwrQkFBK0I7QUFDL0IsaUNBQWlDO0FBQ2pDLHVDQUFnRDtBQUNoRCxpQ0FBaUM7QUFDakMsb0RBQWlEO0FBQ2pELHVDQUEwQztBQUUxQyxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLHlCQUFXLEVBQUUsRUFBRSxjQUFjLENBQUMsQ0FBQztBQXVCMUQsS0FBSyxVQUFVLGNBQWM7SUFDbEMsTUFBTSxVQUFVLEdBQUcsbUJBQW1CLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDOUMsT0FBTyxVQUFVLENBQUMsS0FBSyxFQUFFLENBQUM7QUFDNUIsQ0FBQztBQUhELHdDQUdDO0FBRU0sS0FBSyxVQUFVLGNBQWMsQ0FBQyxLQUEwQjs7SUFDN0QsTUFBTSxVQUFVLEdBQUcsbUJBQW1CLE9BQUMsS0FBSyxDQUFDLFdBQVcsbUNBQUksS0FBSyxDQUFDLENBQUM7SUFDbkUsZUFBSyxDQUFDLE1BQU0sZUFBZSxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ2hELE9BQU8sQ0FBQyxDQUFDO0FBQ1gsQ0FBQztBQUpELHdDQUlDO0FBRU0sS0FBSyxVQUFVLGVBQWUsQ0FBQyxVQUE0QixFQUFFLEtBQTBCO0lBQzVGLE1BQU0sSUFBSSxHQUFHLE1BQU0sVUFBVSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ3RDLE1BQU0sZUFBZSxHQUFHLGFBQWEsQ0FBQyxJQUFJLEVBQUU7UUFDMUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFNO1FBQ3BCLHdCQUF3QixFQUFFLElBQUksR0FBRyxDQUFDLEtBQUssQ0FBQyx3QkFBd0IsQ0FBQztLQUNsRSxDQUFDLENBQUM7SUFFSCxJQUFJLGVBQWUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1FBQzlCLE1BQU0sa0JBQWtC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SSxJQUFJLEVBQUU7WUFBRSxPQUFPLEtBQUssQ0FBQztTQUFFO1FBRTVDLEtBQUssTUFBTSxJQUFJLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNoQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFO2dCQUN4QyxPQUFPLElBQUksQ0FBQzthQUNiO1NBQ0Y7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgaHR0cHMgZnJvbSAnaHR0cHMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzLWV4dHJhJztcbmltcG9ydCAqIGFzIHNlbXZlciBmcm9tICdzZW12ZXInO1xuaW1wb3J0IHsgZGVidWcsIHByaW50LCB0cmFjZSB9IGZyb20gJy4vbG9nZ2luZyc7XG5pbXBvcnQgeyBmbGF0TWFwIH0gZnJvbSAnLi91dGlsJztcbmltcG9ydCB7IGNka0NhY2hlRGlyIH0gZnJvbSAnLi91dGlsL2RpcmVjdG9yaWVzJztcbmltcG9ydCB7IHZlcnNpb25OdW1iZXIgfSBmcm9tICcuL3ZlcnNpb24nO1xuXG5jb25zdCBDQUNIRV9GSUxFX1BBVEggPSBwYXRoLmpvaW4oY2RrQ2FjaGVEaXIoKSwgJ25vdGljZXMuanNvbicpO1xuXG5leHBvcnQgaW50ZXJmYWNlIERpc3BsYXlOb3RpY2VzUHJvcHMge1xuICAvKipcbiAgICogVGhlIGNsb3VkIGFzc2VtYmx5IGRpcmVjdG9yeS4gVXN1YWxseSAnY2RrLm91dCcuXG4gICAqL1xuICByZWFkb25seSBvdXRkaXI6IHN0cmluZztcblxuICAvKipcbiAgICogSXNzdWUgbnVtYmVycyBvZiBub3RpY2VzIHRoYXQgaGF2ZSBiZWVuIGFja25vd2xlZGdlZCBieSBhIHVzZXJcbiAgICogb2YgdGhlIGN1cnJlbnQgQ0RLIHJlcG9zaXRvcnkuIFRoZXNlIG5vdGljZXMgd2lsbCBiZSBza2lwcGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgYWNrbm93bGVkZ2VkSXNzdWVOdW1iZXJzOiBudW1iZXJbXTtcblxuICAvKipcbiAgICogV2hldGhlciBjYWNoZWQgbm90aWNlcyBzaG91bGQgYmUgaWdub3JlZC4gU2V0dGluZyB0aGlzIHByb3BlcnR5XG4gICAqIHRvIHRydWUgd2lsbCBmb3JjZSB0aGUgQ0xJIHRvIGRvd25sb2FkIGZyZXNoIGRhdGFcbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGlnbm9yZUNhY2hlPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlZnJlc2hOb3RpY2VzKCkge1xuICBjb25zdCBkYXRhU291cmNlID0gZGF0YVNvdXJjZVJlZmVyZW5jZShmYWxzZSk7XG4gIHJldHVybiBkYXRhU291cmNlLmZldGNoKCk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkaXNwbGF5Tm90aWNlcyhwcm9wczogRGlzcGxheU5vdGljZXNQcm9wcykge1xuICBjb25zdCBkYXRhU291cmNlID0gZGF0YVNvdXJjZVJlZmVyZW5jZShwcm9wcy5pZ25vcmVDYWNoZSA/PyBmYWxzZSk7XG4gIHByaW50KGF3YWl0IGdlbmVyYXRlTWVzc2FnZShkYXRhU291cmNlLCBwcm9wcykpO1xuICByZXR1cm4gMDtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlTWVzc2FnZShkYXRhU291cmNlOiBOb3RpY2VEYXRhU291cmNlLCBwcm9wczogRGlzcGxheU5vdGljZXNQcm9wcykge1xuICBjb25zdCBkYXRhID0gYXdhaXQgZGF0YVNvdXJjZS5mZXRjaCgpO1xuICBjb25zdCBmaWx0ZXJlZE5vdGljZXMgPSBmaWx0ZXJOb3RpY2VzKGRhdGEsIHtcbiAgICBvdXRkaXI6IHByb3BzLm91dGRpcixcbiAgICBhY2tub3dsZWRnZWRJc3N1ZU51bWJlcnM6IG5ldyBTZXQocHJvcHMuYWNrbm93bGVkZ2VkSXNzdWVOdW1iZXJzKSxcbiAgfSk7XG5cbiAgaWYgKGZpbHRlcmVkTm90aWNlcy5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgaW5kaXZpZHVhbE1lc3NhZ2VzID0gZm9ybWF0Tm90aWNlcyhmaWx0ZXJlZE5vdGljZXMpO1xuICAgIHJldHVybiBmaW5hbE1lc3NhZ2UoaW5kaXZpZHVhbE1lc3NhZ2VzLCBmaWx0ZXJlZE5vdGljZXNbMF0uaXNzdWVOdW1iZXIpO1xuICB9XG4gIHJldHVybiAnJztcbn1cblxuZnVuY3Rpb24gZGF0YVNvdXJjZVJlZmVyZW5jZShpZ25vcmVDYWNoZTogYm9vbGVhbik6IE5vdGljZURhdGFTb3VyY2Uge1xuICByZXR1cm4gbmV3IENhY2hlZERhdGFTb3VyY2UoQ0FDSEVfRklMRV9QQVRILCBuZXcgV2Vic2l0ZU5vdGljZURhdGFTb3VyY2UoKSwgaWdub3JlQ2FjaGUpO1xufVxuXG5mdW5jdGlvbiBmaW5hbE1lc3NhZ2UoaW5kaXZpZHVhbE1lc3NhZ2VzOiBzdHJpbmdbXSwgZXhhbXBsZU51bWJlcjogbnVtYmVyKTogc3RyaW5nIHtcbiAgcmV0dXJuIFtcbiAgICAnXFxuTk9USUNFUycsXG4gICAgLi4uaW5kaXZpZHVhbE1lc3NhZ2VzLFxuICAgIGBJZiB5b3UgZG9u4oCZdCB3YW50IHRvIHNlZSBhIG5vdGljZSBhbnltb3JlLCB1c2UgXCJjZGsgYWNrbm93bGVkZ2UgPGlkPlwiLiBGb3IgZXhhbXBsZSwgXCJjZGsgYWNrbm93bGVkZ2UgJHtleGFtcGxlTnVtYmVyfVwiLmAsXG4gIF0uam9pbignXFxuXFxuJyk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmlsdGVyTm90aWNlT3B0aW9ucyB7XG4gIG91dGRpcj86IHN0cmluZyxcbiAgY2xpVmVyc2lvbj86IHN0cmluZyxcbiAgZnJhbWV3b3JrVmVyc2lvbj86IHN0cmluZyxcbiAgYWNrbm93bGVkZ2VkSXNzdWVOdW1iZXJzPzogU2V0PG51bWJlcj4sXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaWx0ZXJOb3RpY2VzKGRhdGE6IE5vdGljZVtdLCBvcHRpb25zOiBGaWx0ZXJOb3RpY2VPcHRpb25zKTogTm90aWNlW10ge1xuICBjb25zdCBmaWx0ZXIgPSBuZXcgTm90aWNlRmlsdGVyKHtcbiAgICBjbGlWZXJzaW9uOiBvcHRpb25zLmNsaVZlcnNpb24gPz8gdmVyc2lvbk51bWJlcigpLFxuICAgIGFja25vd2xlZGdlZElzc3VlTnVtYmVyczogb3B0aW9ucy5hY2tub3dsZWRnZWRJc3N1ZU51bWJlcnMgPz8gbmV3IFNldCgpLFxuICAgIHRyZWU6IGxvYWRUcmVlKG9wdGlvbnMub3V0ZGlyID8/ICdjZGsub3V0JykudHJlZSxcbiAgfSk7XG4gIHJldHVybiBkYXRhLmZpbHRlcihub3RpY2UgPT4gZmlsdGVyLmFwcGx5KG5vdGljZSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0Tm90aWNlcyhkYXRhOiBOb3RpY2VbXSk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIGRhdGEubWFwKGZvcm1hdE5vdGljZSk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcG9uZW50IHtcbiAgbmFtZTogc3RyaW5nO1xuICB2ZXJzaW9uOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTm90aWNlIHtcbiAgdGl0bGU6IHN0cmluZztcbiAgaXNzdWVOdW1iZXI6IG51bWJlcjtcbiAgb3ZlcnZpZXc6IHN0cmluZztcbiAgY29tcG9uZW50czogQ29tcG9uZW50W107XG4gIHNjaGVtYVZlcnNpb246IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBOb3RpY2VEYXRhU291cmNlIHtcbiAgZmV0Y2goKTogUHJvbWlzZTxOb3RpY2VbXT4sXG59XG5cbmV4cG9ydCBjbGFzcyBXZWJzaXRlTm90aWNlRGF0YVNvdXJjZSBpbXBsZW1lbnRzIE5vdGljZURhdGFTb3VyY2Uge1xuICBmZXRjaCgpOiBQcm9taXNlPE5vdGljZVtdPiB7XG4gICAgY29uc3QgdGltZW91dCA9IDMwMDA7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlcSA9IGh0dHBzLmdldCgnaHR0cHM6Ly9jbGkuY2RrLmRldi10b29scy5hd3MuZGV2L25vdGljZXMuanNvbicsXG4gICAgICAgICAgeyB0aW1lb3V0IH0sXG4gICAgICAgICAgcmVzID0+IHtcbiAgICAgICAgICAgIGlmIChyZXMuc3RhdHVzQ29kZSA9PT0gMjAwKSB7XG4gICAgICAgICAgICAgIHJlcy5zZXRFbmNvZGluZygndXRmOCcpO1xuICAgICAgICAgICAgICBsZXQgcmF3RGF0YSA9ICcnO1xuICAgICAgICAgICAgICByZXMub24oJ2RhdGEnLCAoY2h1bmspID0+IHtcbiAgICAgICAgICAgICAgICByYXdEYXRhICs9IGNodW5rO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgcmVzLm9uKCdlbmQnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKHJhd0RhdGEpLm5vdGljZXMgYXMgTm90aWNlW107XG4gICAgICAgICAgICAgICAgICBpZiAoIWRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiJ25vdGljZXMnIGtleSBpcyBtaXNzaW5nXCIpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgZGVidWcoJ05vdGljZXMgcmVmcmVzaGVkJyk7XG4gICAgICAgICAgICAgICAgICByZXNvbHZlKGRhdGEgPz8gW10pO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoYEZhaWxlZCB0byBwYXJzZSBub3RpY2VzOiAke2UubWVzc2FnZX1gKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgcmVzLm9uKCdlcnJvcicsIGUgPT4ge1xuICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoYEZhaWxlZCB0byBmZXRjaCBub3RpY2VzOiAke2UubWVzc2FnZX1gKSk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgRmFpbGVkIHRvIGZldGNoIG5vdGljZXMuIFN0YXR1cyBjb2RlOiAke3Jlcy5zdGF0dXNDb2RlfWApKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgcmVxLm9uKCdlcnJvcicsIHJlamVjdCk7XG4gICAgICAgIHJlcS5vbigndGltZW91dCcsICgpID0+IHtcbiAgICAgICAgICAvLyBUaGUgJ3RpbWVvdXQnIGV2ZW50IGRvZXNuJ3Qgc3RvcCBhbnl0aGluZyBieSBpdHNlbGYsIGl0IGp1c3RcbiAgICAgICAgICAvLyBub3RpZmllcyB0aGF0IGl0IGhhcyBiZWVuIGxvbmcgdGltZSBzaW5jZSB3ZSBzYXcgYnl0ZXMuXG4gICAgICAgICAgLy8gSW4gb3VyIGNhc2UsIHdlIHdhbnQgdG8gZ2l2ZSB1cC5cbiAgICAgICAgICByZXEuZGVzdHJveShuZXcgRXJyb3IoJ1JlcXVlc3QgdGltZWQgb3V0JykpO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBJdCdzIG5vdCBsaWtlIEkgZG9uJ3QgKnRydXN0KiB0aGUgJ3RpbWVvdXQnIGV2ZW50Li4uIGJ1dCBJIGRvbid0IHRydXN0IGl0LlxuICAgICAgICAvLyBBZGQgYSBiYWNrdXAgdGltZXIgdGhhdCB3aWxsIGRlc3Ryb3kgdGhlIHJlcXVlc3QgYWZ0ZXIgYWxsLlxuICAgICAgICAvLyAoVGhpcyBpcyBhdCBsZWFzdCBuZWNlc3NhcnkgdG8gbWFrZSB0aGUgdGVzdHMgcGFzcywgYnV0IHRoYXQncyBwcm9iYWJseSBiZWNhdXNlIG9mICdub2NrJy5cbiAgICAgICAgLy8gSXQncyBub3QgY2xlYXIgd2hldGhlciB1c2VycyB3aWxsIGhpdCB0aGlzKS5cbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgcmVxLmRlc3Ryb3kobmV3IEVycm9yKCdSZXF1ZXN0IHRpbWVkIG91dC4gWW91IHNob3VsZCBuZXZlciBzZWUgdGhpcyBtZXNzYWdlOyBpZiB5b3UgZG8sIHBsZWFzZSBsZXQgdXMga25vdyBhdCBodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1jZGsvaXNzdWVzJykpO1xuICAgICAgICB9LCB0aW1lb3V0ICsgMjAwKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgSFRUUFMgJ2dldCcgY2FsbCB0aHJldyBhbiBlcnJvcjogJHtlLm1lc3NhZ2V9YCkpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG5cbmludGVyZmFjZSBDYWNoZWROb3RpY2VzIHtcbiAgZXhwaXJhdGlvbjogbnVtYmVyLFxuICBub3RpY2VzOiBOb3RpY2VbXSxcbn1cblxuY29uc3QgVElNRV9UT19MSVZFX1NVQ0NFU1MgPSA2MCAqIDYwICogMTAwMDsgLy8gMSBob3VyXG5jb25zdCBUSU1FX1RPX0xJVkVfRVJST1IgPSAxICogNjAgKiAxMDAwOyAvLyAxIG1pbnV0ZVxuXG5leHBvcnQgY2xhc3MgQ2FjaGVkRGF0YVNvdXJjZSBpbXBsZW1lbnRzIE5vdGljZURhdGFTb3VyY2Uge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGZpbGVOYW1lOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSByZWFkb25seSBkYXRhU291cmNlOiBOb3RpY2VEYXRhU291cmNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgc2tpcENhY2hlPzogYm9vbGVhbikge1xuICB9XG5cbiAgYXN5bmMgZmV0Y2goKTogUHJvbWlzZTxOb3RpY2VbXT4ge1xuICAgIGNvbnN0IGNhY2hlZERhdGEgPSBhd2FpdCB0aGlzLmxvYWQoKTtcbiAgICBjb25zdCBkYXRhID0gY2FjaGVkRGF0YS5ub3RpY2VzO1xuICAgIGNvbnN0IGV4cGlyYXRpb24gPSBjYWNoZWREYXRhLmV4cGlyYXRpb24gPz8gMDtcblxuICAgIGlmIChEYXRlLm5vdygpID4gZXhwaXJhdGlvbiB8fCB0aGlzLnNraXBDYWNoZSkge1xuICAgICAgY29uc3QgZnJlc2hEYXRhID0gYXdhaXQgdGhpcy5mZXRjaElubmVyKCk7XG4gICAgICBhd2FpdCB0aGlzLnNhdmUoZnJlc2hEYXRhKTtcbiAgICAgIHJldHVybiBmcmVzaERhdGEubm90aWNlcztcbiAgICB9IGVsc2Uge1xuICAgICAgZGVidWcoYFJlYWRpbmcgY2FjaGVkIG5vdGljZXMgZnJvbSAke3RoaXMuZmlsZU5hbWV9YCk7XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGZldGNoSW5uZXIoKTogUHJvbWlzZTxDYWNoZWROb3RpY2VzPiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGV4cGlyYXRpb246IERhdGUubm93KCkgKyBUSU1FX1RPX0xJVkVfU1VDQ0VTUyxcbiAgICAgICAgbm90aWNlczogYXdhaXQgdGhpcy5kYXRhU291cmNlLmZldGNoKCksXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGRlYnVnKGBDb3VsZCBub3QgcmVmcmVzaCBub3RpY2VzOiAke2V9YCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBleHBpcmF0aW9uOiBEYXRlLm5vdygpICsgVElNRV9UT19MSVZFX0VSUk9SLFxuICAgICAgICBub3RpY2VzOiBbXSxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBsb2FkKCk6IFByb21pc2U8Q2FjaGVkTm90aWNlcz4ge1xuICAgIGNvbnN0IGRlZmF1bHRWYWx1ZSA9IHtcbiAgICAgIGV4cGlyYXRpb246IDAsXG4gICAgICBub3RpY2VzOiBbXSxcbiAgICB9O1xuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBmcy5leGlzdHNTeW5jKHRoaXMuZmlsZU5hbWUpXG4gICAgICAgID8gYXdhaXQgZnMucmVhZEpTT04odGhpcy5maWxlTmFtZSkgYXMgQ2FjaGVkTm90aWNlc1xuICAgICAgICA6IGRlZmF1bHRWYWx1ZTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBkZWJ1ZyhgRmFpbGVkIHRvIGxvYWQgbm90aWNlcyBmcm9tIGNhY2hlOiAke2V9YCk7XG4gICAgICByZXR1cm4gZGVmYXVsdFZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgc2F2ZShjYWNoZWQ6IENhY2hlZE5vdGljZXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgZnMud3JpdGVKU09OKHRoaXMuZmlsZU5hbWUsIGNhY2hlZCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgZGVidWcoYEZhaWxlZCB0byBzdG9yZSBub3RpY2VzIGluIHRoZSBjYWNoZTogJHtlfWApO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIE5vdGljZUZpbHRlclByb3BzIHtcbiAgY2xpVmVyc2lvbjogc3RyaW5nLFxuICBhY2tub3dsZWRnZWRJc3N1ZU51bWJlcnM6IFNldDxudW1iZXI+LFxuICB0cmVlOiBDb25zdHJ1Y3RUcmVlTm9kZSxcbn1cblxuZXhwb3J0IGNsYXNzIE5vdGljZUZpbHRlciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYWNrbm93bGVkZ2VkSXNzdWVOdW1iZXJzOiBTZXQ8bnVtYmVyPjtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHByb3BzOiBOb3RpY2VGaWx0ZXJQcm9wcykge1xuICAgIHRoaXMuYWNrbm93bGVkZ2VkSXNzdWVOdW1iZXJzID0gcHJvcHMuYWNrbm93bGVkZ2VkSXNzdWVOdW1iZXJzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZmYgd2Ugc2hvdWxkIHNob3cgdGhpcyBub3RpY2UuXG4gICAqL1xuICBhcHBseShub3RpY2U6IE5vdGljZSk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmFja25vd2xlZGdlZElzc3VlTnVtYmVycy5oYXMobm90aWNlLmlzc3VlTnVtYmVyKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmFwcGx5VmVyc2lvbihub3RpY2UsICdjbGknLCB0aGlzLnByb3BzLmNsaVZlcnNpb24pIHx8XG4gICAgICBtYXRjaChyZXNvbHZlQWxpYXNlcyhub3RpY2UuY29tcG9uZW50cyksIHRoaXMucHJvcHMudHJlZSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmZiB3ZSBzaG91bGQgc2hvdyB0aGUgbm90aWNlLlxuICAgKi9cbiAgcHJpdmF0ZSBhcHBseVZlcnNpb24obm90aWNlOiBOb3RpY2UsIG5hbWU6IHN0cmluZywgY29tcGFyZVRvVmVyc2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKGNvbXBhcmVUb1ZlcnNpb24gPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gZmFsc2U7IH1cblxuICAgIGNvbnN0IGFmZmVjdGVkQ29tcG9uZW50ID0gbm90aWNlLmNvbXBvbmVudHMuZmluZChjb21wb25lbnQgPT4gY29tcG9uZW50Lm5hbWUgPT09IG5hbWUpO1xuICAgIGNvbnN0IGFmZmVjdGVkUmFuZ2UgPSBhZmZlY3RlZENvbXBvbmVudD8udmVyc2lvbjtcbiAgICByZXR1cm4gYWZmZWN0ZWRSYW5nZSAhPSBudWxsICYmIHNlbXZlci5zYXRpc2ZpZXMoY29tcGFyZVRvVmVyc2lvbiwgYWZmZWN0ZWRSYW5nZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBTb21lIGNvbXBvbmVudCBuYW1lcyBhcmUgYWxpYXNlcyB0byBhY3R1YWwgY29tcG9uZW50IG5hbWVzLiBGb3IgZXhhbXBsZSBcImZyYW1ld29ya1wiXG4gKiBpcyBhbiBhbGlhcyBmb3IgZWl0aGVyIHRoZSBjb3JlIGxpYnJhcnkgKHYxKSBvciB0aGUgd2hvbGUgQ0RLIGxpYnJhcnkgKHYyKS5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIGNvbnZlcnRzIGFsbCBhbGlhc2VzIHRvIHRoZWlyIGFjdHVhbCBjb3VudGVycGFydCBuYW1lcywgdG8gYmUgdXNlZCB0b1xuICogbWF0Y2ggYWdhaW5zdCB0aGUgY29uc3RydWN0IHRyZWUuXG4gKlxuICogQHBhcmFtIGNvbXBvbmVudHMgYSBsaXN0IG9mIGNvbXBvbmVudHMuIENvbXBvbmVudHMgd2hvc2UgbmFtZSBpcyBhbiBhbGlhcyB3aWxsIGJlXG4gKiB0cmFuc2Zvcm1lZCBhbmQgYWxsIG90aGVycyB3aWxsIGJlIGxlZnQgaW50YWN0LlxuICovXG5mdW5jdGlvbiByZXNvbHZlQWxpYXNlcyhjb21wb25lbnRzOiBDb21wb25lbnRbXSk6IENvbXBvbmVudFtdIHtcbiAgcmV0dXJuIGZsYXRNYXAoY29tcG9uZW50cywgY29tcG9uZW50ID0+IHtcbiAgICBpZiAoY29tcG9uZW50Lm5hbWUgPT09ICdmcmFtZXdvcmsnKSB7XG4gICAgICByZXR1cm4gW3tcbiAgICAgICAgbmFtZTogJ0Bhd3MtY2RrL2NvcmUuJyxcbiAgICAgICAgdmVyc2lvbjogY29tcG9uZW50LnZlcnNpb24sXG4gICAgICB9LCB7XG4gICAgICAgIG5hbWU6ICdhd3MtY2RrLWxpYi4nLFxuICAgICAgICB2ZXJzaW9uOiBjb21wb25lbnQudmVyc2lvbixcbiAgICAgIH1dO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gW2NvbXBvbmVudF07XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0Tm90aWNlKG5vdGljZTogTm90aWNlKTogc3RyaW5nIHtcbiAgY29uc3QgY29tcG9uZW50c1ZhbHVlID0gbm90aWNlLmNvbXBvbmVudHMubWFwKGMgPT4gYCR7Yy5uYW1lfTogJHtjLnZlcnNpb259YCkuam9pbignLCAnKTtcbiAgcmV0dXJuIFtcbiAgICBgJHtub3RpY2UuaXNzdWVOdW1iZXJ9XFx0JHtub3RpY2UudGl0bGV9YCxcbiAgICBmb3JtYXRPdmVydmlldyhub3RpY2Uub3ZlcnZpZXcpLFxuICAgIGBcXHRBZmZlY3RlZCB2ZXJzaW9uczogJHtjb21wb25lbnRzVmFsdWV9YCxcbiAgICBgXFx0TW9yZSBpbmZvcm1hdGlvbiBhdDogaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY2RrL2lzc3Vlcy8ke25vdGljZS5pc3N1ZU51bWJlcn1gLFxuICBdLmpvaW4oJ1xcblxcbicpICsgJ1xcbic7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdE92ZXJ2aWV3KHRleHQ6IHN0cmluZykge1xuICBjb25zdCB3cmFwID0gKHM6IHN0cmluZykgPT4gcy5yZXBsYWNlKC8oPyFbXlxcbl17MSw2MH0kKShbXlxcbl17MSw2MH0pXFxzL2csICckMVxcbicpO1xuXG4gIGNvbnN0IGhlYWRpbmcgPSAnT3ZlcnZpZXc6ICc7XG4gIGNvbnN0IHNlcGFyYXRvciA9IGBcXG5cXHQkeycgJy5yZXBlYXQoaGVhZGluZy5sZW5ndGgpfWA7XG4gIGNvbnN0IGNvbnRlbnQgPSB3cmFwKHRleHQpXG4gICAgLnNwbGl0KCdcXG4nKVxuICAgIC5qb2luKHNlcGFyYXRvcik7XG5cbiAgcmV0dXJuICdcXHQnICsgaGVhZGluZyArIGNvbnRlbnQ7XG59XG5cbi8qKlxuICogV2hldGhlciBhbnkgY29tcG9uZW50IGluIHRoZSB0cmVlIG1hdGNoZXMgYW55IGNvbXBvbmVudCBpbiB0aGUgcXVlcnkuXG4gKiBBIG1hdGNoIGhhcHBlbnMgd2hlbjpcbiAqXG4gKiAxLiBUaGUgdmVyc2lvbiBvZiB0aGUgbm9kZSBtYXRjaGVzIHRoZSB2ZXJzaW9uIGluIHRoZSBxdWVyeSwgaW50ZXJwcmV0ZWRcbiAqIGFzIGEgc2VtdmVyIHJhbmdlLlxuICpcbiAqIDIuIFRoZSBuYW1lIGluIHRoZSBxdWVyeSBpcyBhIHByZWZpeCBvZiB0aGUgbm9kZSBuYW1lIHdoZW4gdGhlIHF1ZXJ5IGVuZHMgaW4gJy4nLFxuICogb3IgdGhlIHR3byBuYW1lcyBhcmUgZXhhY3RseSB0aGUgc2FtZSwgb3RoZXJ3aXNlLlxuICovXG5mdW5jdGlvbiBtYXRjaChxdWVyeTogQ29tcG9uZW50W10sIHRyZWU6IENvbnN0cnVjdFRyZWVOb2RlKTogYm9vbGVhbiB7XG4gIHJldHVybiBzb21lKHRyZWUsIG5vZGUgPT4ge1xuICAgIHJldHVybiBxdWVyeS5zb21lKGNvbXBvbmVudCA9PlxuICAgICAgY29tcGFyZU5hbWVzKGNvbXBvbmVudC5uYW1lLCBub2RlLmNvbnN0cnVjdEluZm8/LmZxbikgJiZcbiAgICAgIGNvbXBhcmVWZXJzaW9ucyhjb21wb25lbnQudmVyc2lvbiwgbm9kZS5jb25zdHJ1Y3RJbmZvPy52ZXJzaW9uKSk7XG4gIH0pO1xuXG4gIGZ1bmN0aW9uIGNvbXBhcmVOYW1lcyhwYXR0ZXJuOiBzdHJpbmcsIHRhcmdldDogc3RyaW5nIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gICAgaWYgKHRhcmdldCA9PSBudWxsKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIHJldHVybiBwYXR0ZXJuLmVuZHNXaXRoKCcuJykgPyB0YXJnZXQuc3RhcnRzV2l0aChwYXR0ZXJuKSA6IHBhdHRlcm4gPT09IHRhcmdldDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNvbXBhcmVWZXJzaW9ucyhwYXR0ZXJuOiBzdHJpbmcsIHRhcmdldDogc3RyaW5nIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHNlbXZlci5zYXRpc2ZpZXModGFyZ2V0ID8/ICcnLCBwYXR0ZXJuKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBsb2FkVHJlZShvdXRkaXI6IHN0cmluZykge1xuICB0cnkge1xuICAgIHJldHVybiBmcy5yZWFkSlNPTlN5bmMocGF0aC5qb2luKG91dGRpciwgJ3RyZWUuanNvbicpKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRyYWNlKGBGYWlsZWQgdG8gZ2V0IHRyZWUuanNvbiBmaWxlOiAke2V9LiBQcm9jZWVkaW5nIHdpdGggZW1wdHkgdHJlZS5gKTtcbiAgICByZXR1cm4ge307XG4gIH1cbn1cblxuLyoqXG4gKiBTb3VyY2UgaW5mb3JtYXRpb24gb24gYSBjb25zdHJ1Y3QgKGNsYXNzIGZxbiBhbmQgdmVyc2lvbilcbiAqL1xuaW50ZXJmYWNlIENvbnN0cnVjdEluZm8ge1xuICByZWFkb25seSBmcW46IHN0cmluZztcbiAgcmVhZG9ubHkgdmVyc2lvbjogc3RyaW5nO1xufVxuXG4vKipcbiAqIEEgbm9kZSBpbiB0aGUgY29uc3RydWN0IHRyZWUuXG4gKiBAaW50ZXJuYWxcbiAqL1xuaW50ZXJmYWNlIENvbnN0cnVjdFRyZWVOb2RlIHtcbiAgcmVhZG9ubHkgaWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgcGF0aDogc3RyaW5nO1xuICByZWFkb25seSBjaGlsZHJlbj86IHsgW2tleTogc3RyaW5nXTogQ29uc3RydWN0VHJlZU5vZGUgfTtcbiAgcmVhZG9ubHkgYXR0cmlidXRlcz86IHsgW2tleTogc3RyaW5nXTogYW55IH07XG5cbiAgLyoqXG4gICAqIEluZm9ybWF0aW9uIG9uIHRoZSBjb25zdHJ1Y3QgY2xhc3MgdGhhdCBsZWQgdG8gdGhpcyBub2RlLCBpZiBhdmFpbGFibGVcbiAgICovXG4gIHJlYWRvbmx5IGNvbnN0cnVjdEluZm8/OiBDb25zdHJ1Y3RJbmZvO1xufVxuXG5mdW5jdGlvbiBzb21lKG5vZGU6IENvbnN0cnVjdFRyZWVOb2RlLCBwcmVkaWNhdGU6IChuOiBDb25zdHJ1Y3RUcmVlTm9kZSkgPT4gYm9vbGVhbik6IGJvb2xlYW4ge1xuICByZXR1cm4gbm9kZSAhPSBudWxsICYmIChwcmVkaWNhdGUobm9kZSkgfHwgZmluZEluQ2hpbGRyZW4oKSk7XG5cbiAgZnVuY3Rpb24gZmluZEluQ2hpbGRyZW4oKTogYm9vbGVhbiB7XG4gICAgaWYgKG5vZGUuY2hpbGRyZW4gPT0gbnVsbCkgeyByZXR1cm4gZmFsc2U7IH1cblxuICAgIGZvciAoY29uc3QgbmFtZSBpbiBub2RlLmNoaWxkcmVuKSB7XG4gICAgICBpZiAoc29tZShub2RlLmNoaWxkcmVuW25hbWVdLCBwcmVkaWNhdGUpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbiJdfQ==
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "aws-cdk",
3
3
  "description": "CDK Toolkit, the command line tool for CDK apps",
4
- "version": "2.20.0",
4
+ "version": "2.22.0",
5
5
  "bin": {
6
6
  "cdk": "bin/cdk"
7
7
  },
@@ -58,7 +58,7 @@
58
58
  },
59
59
  "license": "Apache-2.0",
60
60
  "devDependencies": {
61
- "@aws-cdk/core": "2.20.0",
61
+ "@aws-cdk/core": "2.22.0",
62
62
  "@octokit/rest": "^18.12.0",
63
63
  "@types/archiver": "^5.3.1",
64
64
  "@types/fs-extra": "^8.1.2",
@@ -75,28 +75,28 @@
75
75
  "@types/wrap-ansi": "^3.0.0",
76
76
  "@types/yargs": "^15.0.14",
77
77
  "aws-sdk-mock": "5.6.0",
78
- "@aws-cdk/cdk-build-tools": "2.20.0",
78
+ "@aws-cdk/cdk-build-tools": "2.22.0",
79
79
  "jest": "^27.5.1",
80
80
  "madge": "^5.0.1",
81
81
  "constructs": "^10.0.0",
82
82
  "make-runnable": "^1.3.10",
83
83
  "mockery": "^2.1.0",
84
84
  "nock": "^13.2.4",
85
- "@aws-cdk/pkglint": "2.20.0",
85
+ "@aws-cdk/pkglint": "2.22.0",
86
86
  "sinon": "^9.2.4",
87
87
  "ts-jest": "^27.1.4",
88
88
  "ts-mock-imports": "^1.3.8",
89
89
  "xml-js": "^1.6.11",
90
90
  "axios": "^0.26.1",
91
- "@aws-cdk/cloud-assembly-schema": "2.20.0",
92
- "@aws-cdk/cloudformation-diff": "2.20.0",
93
- "@aws-cdk/cx-api": "2.20.0",
94
- "@aws-cdk/region-info": "2.20.0",
95
- "@jsii/check-node": "1.55.1",
91
+ "@aws-cdk/cloud-assembly-schema": "2.22.0",
92
+ "@aws-cdk/cloudformation-diff": "2.22.0",
93
+ "@aws-cdk/cx-api": "2.22.0",
94
+ "@aws-cdk/region-info": "2.22.0",
95
+ "@jsii/check-node": "1.56.0",
96
96
  "archiver": "^5.3.0",
97
97
  "aws-sdk": "^2.1093.0",
98
98
  "camelcase": "^6.3.0",
99
- "cdk-assets": "2.20.0",
99
+ "cdk-assets": "2.22.0",
100
100
  "chokidar": "^3.5.3",
101
101
  "chalk": "^4",
102
102
  "decamelize": "^5.0.1",
@@ -106,7 +106,7 @@
106
106
  "minimatch": ">=3.1",
107
107
  "promptly": "^3.2.0",
108
108
  "proxy-agent": "^5.0.0",
109
- "semver": "^7.3.5",
109
+ "semver": "^7.3.6",
110
110
  "source-map-support": "^0.5.21",
111
111
  "strip-ansi": "^6.0.1",
112
112
  "table": "^6.8.0",
@@ -30,5 +30,25 @@ describe('Rewritable Block Tests', () => {
30
30
  });
31
31
  expect(output.length).toEqual(6);
32
32
  });
33
+ test('display accounts for newlines in output', () => {
34
+ const output = console_listener_1.stderr.inspectSync(() => {
35
+ block.displayLines(['before\nafter']);
36
+ });
37
+ expect(output.length).toEqual(3); // cursorup + 2 lines
38
+ });
39
+ test('removeEmptyLines only removes trailing lines', () => {
40
+ console_listener_1.stderr.inspectSync(() => {
41
+ block.displayLines(Array.from(Array(5).keys()).map(x => `${x}`));
42
+ });
43
+ console_listener_1.stderr.inspectSync(() => {
44
+ // Leaves 3 empty lines
45
+ block.displayLines(Array.from(Array(2).keys()).map(x => `${x}`));
46
+ });
47
+ const output = console_listener_1.stderr.inspectSync(() => {
48
+ block.removeEmptyLines();
49
+ });
50
+ const expectedEmptyLines = 3;
51
+ expect(JSON.stringify(output)).toEqual(JSON.stringify([`\u001b[${expectedEmptyLines}A`]));
52
+ });
33
53
  });
34
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlzcGxheS50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZGlzcGxheS50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsMkRBQWdFO0FBQ2hFLDBEQUE2QztBQUc3QyxRQUFRLENBQUMsd0JBQXdCLEVBQUUsR0FBRyxFQUFFO0lBQ3RDLElBQUksS0FBc0IsQ0FBQztJQUMzQixVQUFVLENBQUMsR0FBRyxFQUFFO1FBQ2QsS0FBSyxHQUFHLElBQUkseUJBQWUsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDNUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDO0lBQzNCLENBQUMsQ0FBQyxDQUFDO0lBRUgsSUFBSSxDQUFDLG1GQUFtRixFQUFFLEdBQUcsRUFBRTtRQUM3RixNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQ3pFLE1BQU0sTUFBTSxHQUFHLHlCQUFNLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRTtZQUNyQyxLQUFLLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzVCLENBQUMsQ0FBQyxDQUFDO1FBRUgsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLE1BQU8sQ0FBQyxDQUFDO0lBQy9DLENBQUMsQ0FBQyxDQUFDO0lBRUgsSUFBSSxDQUFDLDJGQUEyRixFQUFFLEdBQUcsRUFBRTtRQUNyRyxNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQ3hFLE1BQU0sTUFBTSxHQUFHLHlCQUFNLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRTtZQUNyQyxLQUFLLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzVCLENBQUMsQ0FBQyxDQUFDO1FBRUgsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDcEMsQ0FBQyxDQUFDLENBQUM7SUFFSCxJQUFJLENBQUMsOEVBQThFLEVBQUUsR0FBRyxFQUFFO1FBQ3hGLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDdkUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEdBQUcsU0FBUyxDQUFDO1FBQ2hDLE1BQU0sTUFBTSxHQUFHLHlCQUFNLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRTtZQUNyQyxLQUFLLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzVCLENBQUMsQ0FBQyxDQUFDO1FBRUgsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbkMsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFJld3JpdGFibGVCbG9jayB9IGZyb20gJy4uLy4uLy4uL2xpYi9hcGkvdXRpbC9kaXNwbGF5JztcbmltcG9ydCB7IHN0ZGVyciB9IGZyb20gJy4uL2NvbnNvbGUtbGlzdGVuZXInO1xuXG5cbmRlc2NyaWJlKCdSZXdyaXRhYmxlIEJsb2NrIFRlc3RzJywgKCkgPT4ge1xuICBsZXQgYmxvY2s6IFJld3JpdGFibGVCbG9jaztcbiAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgYmxvY2sgPSBuZXcgUmV3cml0YWJsZUJsb2NrKHByb2Nlc3Muc3RkZXJyKTtcbiAgICBwcm9jZXNzLnN0ZGVyci5yb3dzID0gODA7XG4gIH0pO1xuXG4gIHRlc3QoJ2Rpc3BsYXlMaW5lcyB3cml0ZXMgbWF4aW11bSBsaW5lcyBiYXNlZCBvbiByb3dzIGlmIHRoZXJlIGFyZSBtb3JlIGxpbmVzIHRoYW4gcm93cycsICgpID0+IHtcbiAgICBjb25zdCBsaW5lcyA9IEFycmF5LmZyb20oQXJyYXkoMTAwKS5rZXlzKCkpLm1hcChsaW5lID0+IGxpbmUudG9TdHJpbmcoKSk7XG4gICAgY29uc3Qgb3V0cHV0ID0gc3RkZXJyLmluc3BlY3RTeW5jKCgpID0+IHtcbiAgICAgIGJsb2NrLmRpc3BsYXlMaW5lcyhsaW5lcyk7XG4gICAgfSk7XG5cbiAgICBleHBlY3Qob3V0cHV0Lmxlbmd0aCkudG9FcXVhbChibG9jay5oZWlnaHQhKTtcbiAgfSk7XG5cbiAgdGVzdCgnZGlzcGxheUxpbmVzIHdyaXRlcyBtYXhpbXVtIGxpbmVzIGJhc2VkIG9uIGxpbmVzIGxlbmd0aCBpZiB0aGVyZSBhcmUgbGVzcyBsaW5lcyB0aGFuIHJvd3MnLCAoKSA9PiB7XG4gICAgY29uc3QgbGluZXMgPSBBcnJheS5mcm9tKEFycmF5KDQ1KS5rZXlzKCkpLm1hcChsaW5lID0+IGxpbmUudG9TdHJpbmcoKSk7XG4gICAgY29uc3Qgb3V0cHV0ID0gc3RkZXJyLmluc3BlY3RTeW5jKCgpID0+IHtcbiAgICAgIGJsb2NrLmRpc3BsYXlMaW5lcyhsaW5lcyk7XG4gICAgfSk7XG5cbiAgICBleHBlY3Qob3V0cHV0Lmxlbmd0aCkudG9FcXVhbCg0Nik7XG4gIH0pO1xuXG4gIHRlc3QoJ2Rpc3BsYXlMaW5lcyB3cml0ZXMgbWF4aW11bSBsaW5lcyBiYXNlZCBvbiBsaW5lcyBsZW5ndGggaWYgcm93cyBpcyB1bmRlZmluZWQnLCAoKSA9PiB7XG4gICAgY29uc3QgbGluZXMgPSBBcnJheS5mcm9tKEFycmF5KDUpLmtleXMoKSkubWFwKGxpbmUgPT4gbGluZS50b1N0cmluZygpKTtcbiAgICBwcm9jZXNzLnN0ZGVyci5yb3dzID0gdW5kZWZpbmVkO1xuICAgIGNvbnN0IG91dHB1dCA9IHN0ZGVyci5pbnNwZWN0U3luYygoKSA9PiB7XG4gICAgICBibG9jay5kaXNwbGF5TGluZXMobGluZXMpO1xuICAgIH0pO1xuXG4gICAgZXhwZWN0KG91dHB1dC5sZW5ndGgpLnRvRXF1YWwoNik7XG4gIH0pO1xufSk7Il19
54
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlzcGxheS50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZGlzcGxheS50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsMkRBQWdFO0FBQ2hFLDBEQUE2QztBQUc3QyxRQUFRLENBQUMsd0JBQXdCLEVBQUUsR0FBRyxFQUFFO0lBQ3RDLElBQUksS0FBc0IsQ0FBQztJQUMzQixVQUFVLENBQUMsR0FBRyxFQUFFO1FBQ2QsS0FBSyxHQUFHLElBQUkseUJBQWUsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDNUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDO0lBQzNCLENBQUMsQ0FBQyxDQUFDO0lBRUgsSUFBSSxDQUFDLG1GQUFtRixFQUFFLEdBQUcsRUFBRTtRQUM3RixNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQ3pFLE1BQU0sTUFBTSxHQUFHLHlCQUFNLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRTtZQUNyQyxLQUFLLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzVCLENBQUMsQ0FBQyxDQUFDO1FBRUgsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLE1BQU8sQ0FBQyxDQUFDO0lBQy9DLENBQUMsQ0FBQyxDQUFDO0lBRUgsSUFBSSxDQUFDLDJGQUEyRixFQUFFLEdBQUcsRUFBRTtRQUNyRyxNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQ3hFLE1BQU0sTUFBTSxHQUFHLHlCQUFNLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRTtZQUNyQyxLQUFLLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzVCLENBQUMsQ0FBQyxDQUFDO1FBRUgsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDcEMsQ0FBQyxDQUFDLENBQUM7SUFFSCxJQUFJLENBQUMsOEVBQThFLEVBQUUsR0FBRyxFQUFFO1FBQ3hGLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDdkUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEdBQUcsU0FBUyxDQUFDO1FBQ2hDLE1BQU0sTUFBTSxHQUFHLHlCQUFNLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRTtZQUNyQyxLQUFLLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzVCLENBQUMsQ0FBQyxDQUFDO1FBRUgsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbkMsQ0FBQyxDQUFDLENBQUM7SUFFSCxJQUFJLENBQUMseUNBQXlDLEVBQUUsR0FBRyxFQUFFO1FBQ25ELE1BQU0sTUFBTSxHQUFHLHlCQUFNLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRTtZQUNyQyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQztRQUN4QyxDQUFDLENBQUMsQ0FBQztRQUNILE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMscUJBQXFCO0lBQ3pELENBQUMsQ0FBQyxDQUFDO0lBRUgsSUFBSSxDQUFDLDhDQUE4QyxFQUFFLEdBQUcsRUFBRTtRQUN4RCx5QkFBTSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUU7WUFDdEIsS0FBSyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ25FLENBQUMsQ0FBQyxDQUFDO1FBQ0gseUJBQU0sQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFO1lBQ3RCLHVCQUF1QjtZQUN2QixLQUFLLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDbkUsQ0FBQyxDQUFDLENBQUM7UUFFSCxNQUFNLE1BQU0sR0FBRyx5QkFBTSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUU7WUFDckMsS0FBSyxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDM0IsQ0FBQyxDQUFDLENBQUM7UUFDSCxNQUFNLGtCQUFrQixHQUFHLENBQUMsQ0FBQztRQUM3QixNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsVUFBVSxrQkFBa0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzVGLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBSZXdyaXRhYmxlQmxvY2sgfSBmcm9tICcuLi8uLi8uLi9saWIvYXBpL3V0aWwvZGlzcGxheSc7XG5pbXBvcnQgeyBzdGRlcnIgfSBmcm9tICcuLi9jb25zb2xlLWxpc3RlbmVyJztcblxuXG5kZXNjcmliZSgnUmV3cml0YWJsZSBCbG9jayBUZXN0cycsICgpID0+IHtcbiAgbGV0IGJsb2NrOiBSZXdyaXRhYmxlQmxvY2s7XG4gIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgIGJsb2NrID0gbmV3IFJld3JpdGFibGVCbG9jayhwcm9jZXNzLnN0ZGVycik7XG4gICAgcHJvY2Vzcy5zdGRlcnIucm93cyA9IDgwO1xuICB9KTtcblxuICB0ZXN0KCdkaXNwbGF5TGluZXMgd3JpdGVzIG1heGltdW0gbGluZXMgYmFzZWQgb24gcm93cyBpZiB0aGVyZSBhcmUgbW9yZSBsaW5lcyB0aGFuIHJvd3MnLCAoKSA9PiB7XG4gICAgY29uc3QgbGluZXMgPSBBcnJheS5mcm9tKEFycmF5KDEwMCkua2V5cygpKS5tYXAobGluZSA9PiBsaW5lLnRvU3RyaW5nKCkpO1xuICAgIGNvbnN0IG91dHB1dCA9IHN0ZGVyci5pbnNwZWN0U3luYygoKSA9PiB7XG4gICAgICBibG9jay5kaXNwbGF5TGluZXMobGluZXMpO1xuICAgIH0pO1xuXG4gICAgZXhwZWN0KG91dHB1dC5sZW5ndGgpLnRvRXF1YWwoYmxvY2suaGVpZ2h0ISk7XG4gIH0pO1xuXG4gIHRlc3QoJ2Rpc3BsYXlMaW5lcyB3cml0ZXMgbWF4aW11bSBsaW5lcyBiYXNlZCBvbiBsaW5lcyBsZW5ndGggaWYgdGhlcmUgYXJlIGxlc3MgbGluZXMgdGhhbiByb3dzJywgKCkgPT4ge1xuICAgIGNvbnN0IGxpbmVzID0gQXJyYXkuZnJvbShBcnJheSg0NSkua2V5cygpKS5tYXAobGluZSA9PiBsaW5lLnRvU3RyaW5nKCkpO1xuICAgIGNvbnN0IG91dHB1dCA9IHN0ZGVyci5pbnNwZWN0U3luYygoKSA9PiB7XG4gICAgICBibG9jay5kaXNwbGF5TGluZXMobGluZXMpO1xuICAgIH0pO1xuXG4gICAgZXhwZWN0KG91dHB1dC5sZW5ndGgpLnRvRXF1YWwoNDYpO1xuICB9KTtcblxuICB0ZXN0KCdkaXNwbGF5TGluZXMgd3JpdGVzIG1heGltdW0gbGluZXMgYmFzZWQgb24gbGluZXMgbGVuZ3RoIGlmIHJvd3MgaXMgdW5kZWZpbmVkJywgKCkgPT4ge1xuICAgIGNvbnN0IGxpbmVzID0gQXJyYXkuZnJvbShBcnJheSg1KS5rZXlzKCkpLm1hcChsaW5lID0+IGxpbmUudG9TdHJpbmcoKSk7XG4gICAgcHJvY2Vzcy5zdGRlcnIucm93cyA9IHVuZGVmaW5lZDtcbiAgICBjb25zdCBvdXRwdXQgPSBzdGRlcnIuaW5zcGVjdFN5bmMoKCkgPT4ge1xuICAgICAgYmxvY2suZGlzcGxheUxpbmVzKGxpbmVzKTtcbiAgICB9KTtcblxuICAgIGV4cGVjdChvdXRwdXQubGVuZ3RoKS50b0VxdWFsKDYpO1xuICB9KTtcblxuICB0ZXN0KCdkaXNwbGF5IGFjY291bnRzIGZvciBuZXdsaW5lcyBpbiBvdXRwdXQnLCAoKSA9PiB7XG4gICAgY29uc3Qgb3V0cHV0ID0gc3RkZXJyLmluc3BlY3RTeW5jKCgpID0+IHtcbiAgICAgIGJsb2NrLmRpc3BsYXlMaW5lcyhbJ2JlZm9yZVxcbmFmdGVyJ10pO1xuICAgIH0pO1xuICAgIGV4cGVjdChvdXRwdXQubGVuZ3RoKS50b0VxdWFsKDMpOyAvLyBjdXJzb3J1cCArIDIgbGluZXNcbiAgfSk7XG5cbiAgdGVzdCgncmVtb3ZlRW1wdHlMaW5lcyBvbmx5IHJlbW92ZXMgdHJhaWxpbmcgbGluZXMnLCAoKSA9PiB7XG4gICAgc3RkZXJyLmluc3BlY3RTeW5jKCgpID0+IHtcbiAgICAgIGJsb2NrLmRpc3BsYXlMaW5lcyhBcnJheS5mcm9tKEFycmF5KDUpLmtleXMoKSkubWFwKHggPT4gYCR7eH1gKSk7XG4gICAgfSk7XG4gICAgc3RkZXJyLmluc3BlY3RTeW5jKCgpID0+IHtcbiAgICAgIC8vIExlYXZlcyAzIGVtcHR5IGxpbmVzXG4gICAgICBibG9jay5kaXNwbGF5TGluZXMoQXJyYXkuZnJvbShBcnJheSgyKS5rZXlzKCkpLm1hcCh4ID0+IGAke3h9YCkpO1xuICAgIH0pO1xuXG4gICAgY29uc3Qgb3V0cHV0ID0gc3RkZXJyLmluc3BlY3RTeW5jKCgpID0+IHtcbiAgICAgIGJsb2NrLnJlbW92ZUVtcHR5TGluZXMoKTtcbiAgICB9KTtcbiAgICBjb25zdCBleHBlY3RlZEVtcHR5TGluZXMgPSAzO1xuICAgIGV4cGVjdChKU09OLnN0cmluZ2lmeShvdXRwdXQpKS50b0VxdWFsKEpTT04uc3RyaW5naWZ5KFtgXFx1MDAxYlske2V4cGVjdGVkRW1wdHlMaW5lc31BYF0pKTtcbiAgfSk7XG59KTsiXX0=