aws-cdk 2.177.0 → 2.178.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/THIRD_PARTY_LICENSES +5518 -181
- package/build-info.json +2 -2
- package/db.json.gz +0 -0
- package/lib/api/aws-auth/sdk-logger.d.ts +4 -0
- package/lib/api/aws-auth/sdk-logger.js +18 -7
- package/lib/api/aws-auth/sdk-provider.js +4 -3
- package/lib/api/aws-auth/sdk.d.ts +1 -0
- package/lib/api/aws-auth/sdk.js +4 -3
- package/lib/api/aws-auth/tracing.d.ts +11 -0
- package/lib/api/aws-auth/tracing.js +60 -0
- package/lib/api/deployments/asset-publishing.js +7 -1
- package/lib/cli/cdk-toolkit.d.ts +6 -0
- package/lib/cli/cdk-toolkit.js +11 -10
- package/lib/cli/cli.js +10 -5
- package/lib/cli/parse-command-line-arguments.js +11 -15
- package/lib/cli/user-input.d.ts +4 -4
- package/lib/cli/user-input.js +1 -1
- package/lib/commands/context.js +2 -2
- package/lib/index.js +204 -158
- package/lib/index_bg.wasm +0 -0
- package/lib/init-templates/.init-version.json +1 -1
- package/lib/init-templates/.recommended-feature-flags.json +2 -1
- package/lib/legacy-exports-source.d.ts +1 -1
- package/lib/legacy-exports-source.js +3 -3
- package/lib/logging.d.ts +6 -13
- package/lib/logging.js +25 -70
- package/lib/toolkit/cli-io-host.d.ts +16 -12
- package/lib/toolkit/cli-io-host.js +127 -30
- package/package.json +10 -10
- package/test/_helpers/prompts.d.ts +11 -0
- package/test/_helpers/prompts.js +22 -0
- package/test/api/aws-auth/sdk-logger.test.js +16 -11
- package/test/api/logs/logging.test.js +4 -54
- package/test/cli/cdk-toolkit.test.js +7 -7
- package/test/cli/cli-arguments.test.js +4 -4
- package/test/cli/cli.test.js +2 -2
- package/test/cli/user-config.test.js +28 -1
- package/test/toolkit/cli-io-host-corked.test.d.ts +1 -0
- package/test/toolkit/cli-io-host-corked.test.js +73 -0
- package/test/toolkit/cli-io-host.test.js +164 -60
- package/lib/util/tracing.d.ts +0 -9
- package/lib/util/tracing.js +0 -58
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
const chalk = require("chalk");
|
|
4
4
|
const cli_io_host_1 = require("../../lib/toolkit/cli-io-host");
|
|
5
|
+
const prompts_1 = require("../_helpers/prompts");
|
|
5
6
|
const ioHost = cli_io_host_1.CliIoHost.instance({
|
|
6
7
|
logLevel: 'trace',
|
|
7
8
|
});
|
|
@@ -66,17 +67,16 @@ describe('CliIoHost', () => {
|
|
|
66
67
|
expect(mockStderr).toHaveBeenCalledWith(chalk.red('error message') + '\n');
|
|
67
68
|
expect(mockStdout).not.toHaveBeenCalled();
|
|
68
69
|
});
|
|
69
|
-
test('writes to stdout
|
|
70
|
+
test('writes to stdout for result level', async () => {
|
|
70
71
|
ioHost.isTTY = true;
|
|
71
72
|
await ioHost.notify({
|
|
72
73
|
time: new Date(),
|
|
73
|
-
level: '
|
|
74
|
+
level: 'result',
|
|
74
75
|
action: 'synth',
|
|
75
76
|
code: 'CDK_TOOLKIT_I0001',
|
|
76
|
-
message: '
|
|
77
|
-
forceStdout: true,
|
|
77
|
+
message: 'result message',
|
|
78
78
|
});
|
|
79
|
-
expect(mockStdout).toHaveBeenCalledWith(chalk.white('
|
|
79
|
+
expect(mockStdout).toHaveBeenCalledWith(chalk.white('result message') + '\n');
|
|
80
80
|
expect(mockStderr).not.toHaveBeenCalled();
|
|
81
81
|
});
|
|
82
82
|
});
|
|
@@ -88,46 +88,44 @@ describe('CliIoHost', () => {
|
|
|
88
88
|
await ioHost.notify({
|
|
89
89
|
...defaultMessage,
|
|
90
90
|
level: 'debug',
|
|
91
|
-
forceStdout: true,
|
|
92
91
|
});
|
|
93
|
-
expect(
|
|
92
|
+
expect(mockStderr).toHaveBeenCalledWith(`[12:00:00] ${chalk.gray('test message')}\n`);
|
|
94
93
|
});
|
|
95
94
|
test('formats trace messages with timestamp', async () => {
|
|
96
95
|
await ioHost.notify({
|
|
97
96
|
...defaultMessage,
|
|
98
97
|
level: 'trace',
|
|
99
|
-
forceStdout: true,
|
|
100
98
|
});
|
|
101
|
-
expect(
|
|
99
|
+
expect(mockStderr).toHaveBeenCalledWith(`[12:00:00] ${chalk.gray('test message')}\n`);
|
|
102
100
|
});
|
|
103
101
|
test('applies no styling when TTY is false', async () => {
|
|
104
102
|
ioHost.isTTY = false;
|
|
105
103
|
await ioHost.notify({
|
|
106
104
|
...defaultMessage,
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
];
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
level,
|
|
123
|
-
forceStdout: true,
|
|
124
|
-
});
|
|
125
|
-
const expectedOutput = level === 'debug' || level === 'trace'
|
|
126
|
-
? `[12:00:00] ${style('test message')}\n`
|
|
127
|
-
: `${style('test message')}\n`;
|
|
128
|
-
expect(mockStdout).toHaveBeenCalledWith(expectedOutput);
|
|
129
|
-
mockStdout.mockClear();
|
|
105
|
+
});
|
|
106
|
+
expect(mockStderr).toHaveBeenCalledWith('test message\n');
|
|
107
|
+
});
|
|
108
|
+
test.each([
|
|
109
|
+
['error', 'red', false],
|
|
110
|
+
['warn', 'yellow', false],
|
|
111
|
+
['info', 'white', false],
|
|
112
|
+
['debug', 'gray', true],
|
|
113
|
+
['trace', 'gray', true],
|
|
114
|
+
])('outputs %ss in %s color ', async (level, color, shouldAddTime) => {
|
|
115
|
+
// Given
|
|
116
|
+
const style = chalk[color];
|
|
117
|
+
let expectedOutput = `${style('test message')}\n`;
|
|
118
|
+
if (shouldAddTime) {
|
|
119
|
+
expectedOutput = `[12:00:00] ${expectedOutput}`;
|
|
130
120
|
}
|
|
121
|
+
// When
|
|
122
|
+
await ioHost.notify({
|
|
123
|
+
...defaultMessage,
|
|
124
|
+
level,
|
|
125
|
+
});
|
|
126
|
+
// Then
|
|
127
|
+
expect(mockStderr).toHaveBeenCalledWith(expectedOutput);
|
|
128
|
+
mockStdout.mockClear();
|
|
131
129
|
});
|
|
132
130
|
});
|
|
133
131
|
describe('action handling', () => {
|
|
@@ -176,9 +174,8 @@ describe('CliIoHost', () => {
|
|
|
176
174
|
action: 'synth',
|
|
177
175
|
code: 'CDK_TOOLKIT_I0001',
|
|
178
176
|
message: 'debug message',
|
|
179
|
-
forceStdout: true,
|
|
180
177
|
});
|
|
181
|
-
expect(
|
|
178
|
+
expect(mockStderr).toHaveBeenCalledWith(`[12:34:56] ${chalk.gray('debug message')}\n`);
|
|
182
179
|
});
|
|
183
180
|
test('excludes timestamp for other levels but includes color', async () => {
|
|
184
181
|
const testDate = new Date('2024-01-01T12:34:56');
|
|
@@ -188,42 +185,149 @@ describe('CliIoHost', () => {
|
|
|
188
185
|
action: 'synth',
|
|
189
186
|
code: 'CDK_TOOLKIT_I0001',
|
|
190
187
|
message: 'info message',
|
|
191
|
-
forceStdout: true,
|
|
192
188
|
});
|
|
193
|
-
expect(
|
|
194
|
-
});
|
|
195
|
-
});
|
|
196
|
-
describe('error handling', () => {
|
|
197
|
-
test('rejects on write error', async () => {
|
|
198
|
-
jest.spyOn(process.stdout, 'write').mockImplementation((_, callback) => {
|
|
199
|
-
if (callback)
|
|
200
|
-
callback(new Error('Write failed'));
|
|
201
|
-
return true;
|
|
202
|
-
});
|
|
203
|
-
await expect(ioHost.notify({
|
|
204
|
-
time: new Date(),
|
|
205
|
-
level: 'info',
|
|
206
|
-
action: 'synth',
|
|
207
|
-
code: 'CDK_TOOLKIT_I0001',
|
|
208
|
-
message: 'test message',
|
|
209
|
-
forceStdout: true,
|
|
210
|
-
})).rejects.toThrow('Write failed');
|
|
189
|
+
expect(mockStderr).toHaveBeenCalledWith(chalk.white('info message') + '\n');
|
|
211
190
|
});
|
|
212
191
|
});
|
|
213
192
|
describe('requestResponse', () => {
|
|
214
|
-
|
|
193
|
+
beforeEach(() => {
|
|
215
194
|
ioHost.isTTY = true;
|
|
216
|
-
|
|
195
|
+
ioHost.isCI = false;
|
|
196
|
+
});
|
|
197
|
+
test('fail if concurrency is > 1', async () => {
|
|
198
|
+
await expect(() => ioHost.requestResponse({
|
|
217
199
|
time: new Date(),
|
|
218
200
|
level: 'info',
|
|
219
201
|
action: 'synth',
|
|
220
202
|
code: 'CDK_TOOLKIT_I0001',
|
|
221
|
-
message: '
|
|
222
|
-
defaultResponse:
|
|
203
|
+
message: 'Continue?',
|
|
204
|
+
defaultResponse: true,
|
|
205
|
+
data: {
|
|
206
|
+
concurrency: 3,
|
|
207
|
+
},
|
|
208
|
+
})).rejects.toThrow('but concurrency is greater than 1');
|
|
209
|
+
});
|
|
210
|
+
describe('boolean', () => {
|
|
211
|
+
test('respond "yes" to a confirmation prompt', async () => {
|
|
212
|
+
(0, prompts_1.sendResponse)('y');
|
|
213
|
+
const response = await ioHost.requestResponse({
|
|
214
|
+
time: new Date(),
|
|
215
|
+
level: 'info',
|
|
216
|
+
action: 'synth',
|
|
217
|
+
code: 'CDK_TOOLKIT_I0001',
|
|
218
|
+
message: 'Continue?',
|
|
219
|
+
defaultResponse: true,
|
|
220
|
+
});
|
|
221
|
+
expect(mockStdout).toHaveBeenCalledWith(chalk.cyan('Continue?') + ' (y/n) ');
|
|
222
|
+
expect(response).toBe(true);
|
|
223
|
+
});
|
|
224
|
+
test('respond "no" to a confirmation prompt', async () => {
|
|
225
|
+
(0, prompts_1.sendResponse)('n');
|
|
226
|
+
await expect(() => ioHost.requestResponse({
|
|
227
|
+
time: new Date(),
|
|
228
|
+
level: 'info',
|
|
229
|
+
action: 'synth',
|
|
230
|
+
code: 'CDK_TOOLKIT_I0001',
|
|
231
|
+
message: 'Continue?',
|
|
232
|
+
defaultResponse: true,
|
|
233
|
+
})).rejects.toThrow('Aborted by user');
|
|
234
|
+
expect(mockStdout).toHaveBeenCalledWith(chalk.cyan('Continue?') + ' (y/n) ');
|
|
235
|
+
});
|
|
236
|
+
});
|
|
237
|
+
describe('string', () => {
|
|
238
|
+
test.each([
|
|
239
|
+
['bear', 'bear'],
|
|
240
|
+
['giraffe', 'giraffe'],
|
|
241
|
+
// simulate the enter key
|
|
242
|
+
['\x0A', 'cat'],
|
|
243
|
+
])('receives %p and returns %p', async (input, expectedResponse) => {
|
|
244
|
+
(0, prompts_1.sendResponse)(input);
|
|
245
|
+
const response = await ioHost.requestResponse({
|
|
246
|
+
time: new Date(),
|
|
247
|
+
level: 'info',
|
|
248
|
+
action: 'synth',
|
|
249
|
+
code: 'CDK_TOOLKIT_I0001',
|
|
250
|
+
message: 'Favorite animal',
|
|
251
|
+
defaultResponse: 'cat',
|
|
252
|
+
});
|
|
253
|
+
expect(mockStdout).toHaveBeenCalledWith(chalk.cyan('Favorite animal') + ' (cat) ');
|
|
254
|
+
expect(response).toBe(expectedResponse);
|
|
255
|
+
});
|
|
256
|
+
});
|
|
257
|
+
describe('number', () => {
|
|
258
|
+
test.each([
|
|
259
|
+
['3', 3],
|
|
260
|
+
// simulate the enter key
|
|
261
|
+
['\x0A', 1],
|
|
262
|
+
])('receives %p and return %p', async (input, expectedResponse) => {
|
|
263
|
+
(0, prompts_1.sendResponse)(input);
|
|
264
|
+
const response = await ioHost.requestResponse({
|
|
265
|
+
time: new Date(),
|
|
266
|
+
level: 'info',
|
|
267
|
+
action: 'synth',
|
|
268
|
+
code: 'CDK_TOOLKIT_I0001',
|
|
269
|
+
message: 'How many would you like?',
|
|
270
|
+
defaultResponse: 1,
|
|
271
|
+
});
|
|
272
|
+
expect(mockStdout).toHaveBeenCalledWith(chalk.cyan('How many would you like?') + ' (1) ');
|
|
273
|
+
expect(response).toBe(expectedResponse);
|
|
274
|
+
});
|
|
275
|
+
});
|
|
276
|
+
describe('non-promptable data', () => {
|
|
277
|
+
test('logs messages and returns default unchanged', async () => {
|
|
278
|
+
const response = await ioHost.requestResponse({
|
|
279
|
+
time: new Date(),
|
|
280
|
+
level: 'info',
|
|
281
|
+
action: 'synth',
|
|
282
|
+
code: 'CDK_TOOLKIT_I0001',
|
|
283
|
+
message: 'test message',
|
|
284
|
+
defaultResponse: [1, 2, 3],
|
|
285
|
+
});
|
|
286
|
+
expect(mockStderr).toHaveBeenCalledWith(chalk.white('test message') + '\n');
|
|
287
|
+
expect(response).toEqual([1, 2, 3]);
|
|
288
|
+
});
|
|
289
|
+
});
|
|
290
|
+
describe('non TTY environment', () => {
|
|
291
|
+
beforeEach(() => {
|
|
292
|
+
ioHost.isTTY = false;
|
|
293
|
+
ioHost.isCI = false;
|
|
294
|
+
});
|
|
295
|
+
test('fail for all prompts', async () => {
|
|
296
|
+
await expect(() => ioHost.requestResponse({
|
|
297
|
+
time: new Date(),
|
|
298
|
+
level: 'info',
|
|
299
|
+
action: 'synth',
|
|
300
|
+
code: 'CDK_TOOLKIT_I0001',
|
|
301
|
+
message: 'Continue?',
|
|
302
|
+
defaultResponse: true,
|
|
303
|
+
})).rejects.toThrow('User input is needed');
|
|
304
|
+
});
|
|
305
|
+
test('fail with specific motivation', async () => {
|
|
306
|
+
await expect(() => ioHost.requestResponse({
|
|
307
|
+
time: new Date(),
|
|
308
|
+
level: 'info',
|
|
309
|
+
action: 'synth',
|
|
310
|
+
code: 'CDK_TOOLKIT_I0001',
|
|
311
|
+
message: 'Continue?',
|
|
312
|
+
defaultResponse: true,
|
|
313
|
+
data: {
|
|
314
|
+
motivation: 'Bananas are yellow',
|
|
315
|
+
},
|
|
316
|
+
})).rejects.toThrow('Bananas are yellow');
|
|
317
|
+
});
|
|
318
|
+
test('returns the default for non-promptable requests', async () => {
|
|
319
|
+
const response = await ioHost.requestResponse({
|
|
320
|
+
time: new Date(),
|
|
321
|
+
level: 'info',
|
|
322
|
+
action: 'synth',
|
|
323
|
+
code: 'CDK_TOOLKIT_I0001',
|
|
324
|
+
message: 'test message',
|
|
325
|
+
defaultResponse: [1, 2, 3],
|
|
326
|
+
});
|
|
327
|
+
expect(mockStderr).toHaveBeenCalledWith('test message\n');
|
|
328
|
+
expect(response).toEqual([1, 2, 3]);
|
|
223
329
|
});
|
|
224
|
-
expect(mockStderr).toHaveBeenCalledWith(chalk.white('test message') + '\n');
|
|
225
|
-
expect(response).toBe('default response');
|
|
226
330
|
});
|
|
227
331
|
});
|
|
228
332
|
});
|
|
229
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLWlvLWhvc3QudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImNsaS1pby1ob3N0LnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSwrQkFBK0I7QUFDL0IsK0RBQXFFO0FBRXJFLE1BQU0sTUFBTSxHQUFHLHVCQUFTLENBQUMsUUFBUSxDQUFDO0lBQ2hDLFFBQVEsRUFBRSxPQUFPO0NBQ2xCLENBQUMsQ0FBQztBQUVILFFBQVEsQ0FBQyxXQUFXLEVBQUUsR0FBRyxFQUFFO0lBQ3pCLElBQUksVUFBcUIsQ0FBQztJQUMxQixJQUFJLFVBQXFCLENBQUM7SUFDMUIsSUFBSSxjQUFrQyxDQUFDO0lBRXZDLFVBQVUsQ0FBQyxHQUFHLEVBQUU7UUFDZCxVQUFVLEdBQUcsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ3ZCLFVBQVUsR0FBRyxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUM7UUFFdkIsd0JBQXdCO1FBQ3hCLE1BQU0sQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLElBQUksS0FBSyxDQUFDO1FBQzdDLE1BQU0sQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDO1FBQ3BCLE1BQU0sQ0FBQyxhQUFhLEdBQUcsT0FBTyxDQUFDO1FBRS9CLGNBQWMsR0FBRztZQUNmLElBQUksRUFBRSxJQUFJLElBQUksQ0FBQyxxQkFBcUIsQ0FBQztZQUNyQyxLQUFLLEVBQUUsTUFBTTtZQUNiLE1BQU0sRUFBRSxPQUFPO1lBQ2YsSUFBSSxFQUFFLG1CQUFtQjtZQUN6QixPQUFPLEVBQUUsY0FBYztTQUN4QixDQUFDO1FBRUYsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUMsR0FBUSxFQUFFLFFBQWMsRUFBRSxFQUFRLEVBQUUsRUFBRTtZQUM1RixVQUFVLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7WUFDM0IsTUFB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RSxHQUFHLEVBQUU7UUFDL0IsSUFBSSxDQUFDLG1DQUFtQyxFQUFFLEtBQUssSUFBSSxFQUFFO1lBQ25ELE1BQU0sQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO1lBQ3BCLE1BQU0sUUFBUSxHQUFHLE1BQU0sTUFBTSxDQUFDLGVBQWUsQ0FBQztnQkFDNUMsSUFBSSxFQUFFLElBQUksSUFBSSxFQUFFO2dCQUNoQixLQUFLLEVBQUUsTUFBTTtnQkFDYixNQUFNLEVBQUUsT0FBTztnQkFDZixJQUFJLEVBQUUsbUJBQW1CO2dCQUN6QixPQUFPLEVBQUUsY0FBYztnQkFDdkIsZUFBZSxFQUFFLGtCQUFrQjthQUNwQyxDQUFDLENBQUM7WUFFSCxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsb0JBQW9CLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztZQUM1RSxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDNUMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHsgQ2xpSW9Ib3N0LCBJb01lc3NhZ2UgfSBmcm9tICcuLi8uLi9saWIvdG9vbGtpdC9jbGktaW8taG9zdCc7XG5cbmNvbnN0IGlvSG9zdCA9IENsaUlvSG9zdC5pbnN0YW5jZSh7XG4gIGxvZ0xldmVsOiAndHJhY2UnLFxufSk7XG5cbmRlc2NyaWJlKCdDbGlJb0hvc3QnLCAoKSA9PiB7XG4gIGxldCBtb2NrU3Rkb3V0OiBqZXN0Lk1vY2s7XG4gIGxldCBtb2NrU3RkZXJyOiBqZXN0Lk1vY2s7XG4gIGxldCBkZWZhdWx0TWVzc2FnZTogSW9NZXNzYWdlPHVua25vd24+O1xuXG4gIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgIG1vY2tTdGRvdXQgPSBqZXN0LmZuKCk7XG4gICAgbW9ja1N0ZGVyciA9IGplc3QuZm4oKTtcblxuICAgIC8vIFJlc2V0IHNpbmdsZXRvbiBzdGF0ZVxuICAgIGlvSG9zdC5pc1RUWSA9IHByb2Nlc3Muc3Rkb3V0LmlzVFRZID8/IGZhbHNlO1xuICAgIGlvSG9zdC5pc0NJID0gZmFsc2U7XG4gICAgaW9Ib3N0LmN1cnJlbnRBY3Rpb24gPSAnc3ludGgnO1xuXG4gICAgZGVmYXVsdE1lc3NhZ2UgPSB7XG4gICAgICB0aW1lOiBuZXcgRGF0ZSgnMjAyNC0wMS0wMVQxMjowMDowMCcpLFxuICAgICAgbGV2ZWw6ICdpbmZvJyxcbiAgICAgIGFjdGlvbjogJ3N5bnRoJyxcbiAgICAgIGNvZGU6ICdDREtfVE9PTEtJVF9JMDAwMScsXG4gICAgICBtZXNzYWdlOiAndGVzdCBtZXNzYWdlJyxcbiAgICB9O1xuXG4gICAgamVzdC5zcHlPbihwcm9jZXNzLnN0ZG91dCwgJ3dyaXRlJykubW9ja0ltcGxlbWVudGF0aW9uKChzdHI6IGFueSwgZW5jb2Rpbmc/OiBhbnksIGNiPzogYW55KSA9PiB7XG4gICAgICBtb2NrU3Rkb3V0KHN0ci50b1N0cmluZygpKTtcbiAgICAgIGNvbnN0IGNhbGxiYWNrID0gdHlwZW9mIGVuY29kaW5nID09PSAnZnVuY3Rpb24nID8gZW5jb2RpbmcgOiBjYjtcbiAgICAgIGlmIChjYWxsYmFjaykgY2FsbGJhY2soKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0pO1xuXG4gICAgamVzdC5zcHlPbihwcm9jZXNzLnN0ZGVyciwgJ3dyaXRlJykubW9ja0ltcGxlbWVudGF0aW9uKChzdHI6IGFueSwgZW5jb2Rpbmc/OiBhbnksIGNiPzogYW55KSA9PiB7XG4gICAgICBtb2NrU3RkZXJyKHN0ci50b1N0cmluZygpKTtcbiAgICAgIGNvbnN0IGNhbGxiYWNrID0gdHlwZW9mIGVuY29kaW5nID09PSAnZnVuY3Rpb24nID8gZW5jb2RpbmcgOiBjYjtcbiAgICAgIGlmIChjYWxsYmFjaykgY2FsbGJhY2soKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0pO1xuICB9KTtcblxuICBhZnRlckVhY2goKCkgPT4ge1xuICAgIGplc3QucmVzdG9yZUFsbE1vY2tzKCk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdzdHJlYW0gc2VsZWN0aW9uJywgKCkgPT4ge1xuICAgIHRlc3QoJ3dyaXRlcyB0byBzdGRlcnIgYnkgZGVmYXVsdCBmb3Igbm9uLWVycm9yIG1lc3NhZ2VzIGluIG5vbi1DSSBtb2RlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgaW9Ib3N0LmlzVFRZID0gdHJ1ZTtcbiAgICAgIGF3YWl0IGlvSG9zdC5ub3RpZnkoe1xuICAgICAgICB0aW1lOiBuZXcgRGF0ZSgpLFxuICAgICAgICBsZXZlbDogJ2luZm8nLFxuICAgICAgICBhY3Rpb246ICdzeW50aCcsXG4gICAgICAgIGNvZGU6ICdDREtfVE9PTEtJVF9JMDAwMScsXG4gICAgICAgIG1lc3NhZ2U6ICd0ZXN0IG1lc3NhZ2UnLFxuICAgICAgfSk7XG5cbiAgICAgIGV4cGVjdChtb2NrU3RkZXJyKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChjaGFsay53aGl0ZSgndGVzdCBtZXNzYWdlJykgKyAnXFxuJyk7XG4gICAgICBleHBlY3QobW9ja1N0ZG91dCkubm90LnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICB9KTtcblxuICAgIHRlc3QoJ3dyaXRlcyB0byBzdGRlcnIgZm9yIGVycm9yIGxldmVsIHdpdGggcmVkIGNvbG9yJywgYXN5bmMgKCkgPT4ge1xuICAgICAgaW9Ib3N0LmlzVFRZID0gdHJ1ZTtcbiAgICAgIGF3YWl0IGlvSG9zdC5ub3RpZnkoe1xuICAgICAgICB0aW1lOiBuZXcgRGF0ZSgpLFxuICAgICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgICAgYWN0aW9uOiAnc3ludGgnLFxuICAgICAgICBjb2RlOiAnQ0RLX1RPT0xLSVRfRTAwMDEnLFxuICAgICAgICBtZXNzYWdlOiAnZXJyb3IgbWVzc2FnZScsXG4gICAgICB9KTtcblxuICAgICAgZXhwZWN0KG1vY2tTdGRlcnIpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKGNoYWxrLnJlZCgnZXJyb3IgbWVzc2FnZScpICsgJ1xcbicpO1xuICAgICAgZXhwZWN0KG1vY2tTdGRvdXQpLm5vdC50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgfSk7XG5cbiAgICB0ZXN0KCd3cml0ZXMgdG8gc3Rkb3V0IHdoZW4gZm9yY2VTdGRvdXQgaXMgdHJ1ZScsIGFzeW5jICgpID0+IHtcbiAgICAgIGlvSG9zdC5pc1RUWSA9IHRydWU7XG4gICAgICBhd2FpdCBpb0hvc3Qubm90aWZ5KHtcbiAgICAgICAgdGltZTogbmV3IERhdGUoKSxcbiAgICAgICAgbGV2ZWw6ICdpbmZvJyxcbiAgICAgICAgYWN0aW9uOiAnc3ludGgnLFxuICAgICAgICBjb2RlOiAnQ0RLX1RPT0xLSVRfSTAwMDEnLFxuICAgICAgICBtZXNzYWdlOiAnZm9yY2VkIG1lc3NhZ2UnLFxuICAgICAgICBmb3JjZVN0ZG91dDogdHJ1ZSxcbiAgICAgIH0pO1xuXG4gICAgICBleHBlY3QobW9ja1N0ZG91dCkudG9IYXZlQmVlbkNhbGxlZFdpdGgoY2hhbGsud2hpdGUoJ2ZvcmNlZCBtZXNzYWdlJykgKyAnXFxuJyk7XG4gICAgICBleHBlY3QobW9ja1N0ZGVycikubm90LnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ21lc3NhZ2UgZm9ybWF0dGluZycsICgpID0+IHtcbiAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgIGlvSG9zdC5pc1RUWSA9IHRydWU7XG4gICAgfSk7XG5cbiAgICB0ZXN0KCdmb3JtYXRzIGRlYnVnIG1lc3NhZ2VzIHdpdGggdGltZXN0YW1wJywgYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgaW9Ib3N0Lm5vdGlmeSh7XG4gICAgICAgIC4uLmRlZmF1bHRNZXNzYWdlLFxuICAgICAgICBsZXZlbDogJ2RlYnVnJyxcbiAgICAgICAgZm9yY2VTdGRvdXQ6IHRydWUsXG4gICAgICB9KTtcblxuICAgICAgZXhwZWN0KG1vY2tTdGRvdXQpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKGBbMTI6MDA6MDBdICR7Y2hhbGsuZ3JheSgndGVzdCBtZXNzYWdlJyl9XFxuYCk7XG4gICAgfSk7XG5cbiAgICB0ZXN0KCdmb3JtYXRzIHRyYWNlIG1lc3NhZ2VzIHdpdGggdGltZXN0YW1wJywgYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgaW9Ib3N0Lm5vdGlmeSh7XG4gICAgICAgIC4uLmRlZmF1bHRNZXNzYWdlLFxuICAgICAgICBsZXZlbDogJ3RyYWNlJyxcbiAgICAgICAgZm9yY2VTdGRvdXQ6IHRydWUsXG4gICAgICB9KTtcblxuICAgICAgZXhwZWN0KG1vY2tTdGRvdXQpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKGBbMTI6MDA6MDBdICR7Y2hhbGsuZ3JheSgndGVzdCBtZXNzYWdlJyl9XFxuYCk7XG4gICAgfSk7XG5cbiAgICB0ZXN0KCdhcHBsaWVzIG5vIHN0eWxpbmcgd2hlbiBUVFkgaXMgZmFsc2UnLCBhc3luYyAoKSA9PiB7XG4gICAgICBpb0hvc3QuaXNUVFkgPSBmYWxzZTtcbiAgICAgIGF3YWl0IGlvSG9zdC5ub3RpZnkoe1xuICAgICAgICAuLi5kZWZhdWx0TWVzc2FnZSxcbiAgICAgICAgZm9yY2VTdGRvdXQ6IHRydWUsXG4gICAgICB9KTtcblxuICAgICAgZXhwZWN0KG1vY2tTdGRvdXQpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKCd0ZXN0IG1lc3NhZ2VcXG4nKTtcbiAgICB9KTtcblxuICAgIHRlc3QoJ2FwcGxpZXMgY29ycmVjdCBjb2xvciBzdHlsZXMgZm9yIGRpZmZlcmVudCBtZXNzYWdlIGxldmVscycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHRlc3RDYXNlcyA9IFtcbiAgICAgICAgeyBsZXZlbDogJ2Vycm9yJyBhcyBjb25zdCwgc3R5bGU6IGNoYWxrLnJlZCB9LFxuICAgICAgICB7IGxldmVsOiAnd2FybicgYXMgY29uc3QsIHN0eWxlOiBjaGFsay55ZWxsb3cgfSxcbiAgICAgICAgeyBsZXZlbDogJ2luZm8nIGFzIGNvbnN0LCBzdHlsZTogY2hhbGsud2hpdGUgfSxcbiAgICAgICAgeyBsZXZlbDogJ2RlYnVnJyBhcyBjb25zdCwgc3R5bGU6IGNoYWxrLmdyYXkgfSxcbiAgICAgICAgeyBsZXZlbDogJ3RyYWNlJyBhcyBjb25zdCwgc3R5bGU6IGNoYWxrLmdyYXkgfSxcbiAgICAgIF07XG5cbiAgICAgIGZvciAoY29uc3QgeyBsZXZlbCwgc3R5bGUgfSBvZiB0ZXN0Q2FzZXMpIHtcbiAgICAgICAgYXdhaXQgaW9Ib3N0Lm5vdGlmeSh7XG4gICAgICAgICAgLi4uZGVmYXVsdE1lc3NhZ2UsXG4gICAgICAgICAgbGV2ZWwsXG4gICAgICAgICAgZm9yY2VTdGRvdXQ6IHRydWUsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGV4cGVjdGVkT3V0cHV0ID0gbGV2ZWwgPT09ICdkZWJ1ZycgfHwgbGV2ZWwgPT09ICd0cmFjZSdcbiAgICAgICAgICA/IGBbMTI6MDA6MDBdICR7c3R5bGUoJ3Rlc3QgbWVzc2FnZScpfVxcbmBcbiAgICAgICAgICA6IGAke3N0eWxlKCd0ZXN0IG1lc3NhZ2UnKX1cXG5gO1xuXG4gICAgICAgIGV4cGVjdChtb2NrU3Rkb3V0KS50b0hhdmVCZWVuQ2FsbGVkV2l0aChleHBlY3RlZE91dHB1dCk7XG4gICAgICAgIG1vY2tTdGRvdXQubW9ja0NsZWFyKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdhY3Rpb24gaGFuZGxpbmcnLCAoKSA9PiB7XG4gICAgdGVzdCgnc2V0cyBhbmQgZ2V0cyBjdXJyZW50IGFjdGlvbicsICgpID0+IHtcbiAgICAgIGlvSG9zdC5jdXJyZW50QWN0aW9uID0gJ2RlcGxveSc7XG4gICAgICBleHBlY3QoaW9Ib3N0LmN1cnJlbnRBY3Rpb24pLnRvQmUoJ2RlcGxveScpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnQ0kgbW9kZSBiZWhhdmlvcicsICgpID0+IHtcbiAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgIGlvSG9zdC5pc1RUWSA9IHRydWU7XG4gICAgICBpb0hvc3QuaXNDSSA9IHRydWU7XG4gICAgfSk7XG5cbiAgICB0ZXN0KCd3cml0ZXMgdG8gc3Rkb3V0IGluIENJIG1vZGUgd2hlbiBsZXZlbCBpcyBub3QgZXJyb3InLCBhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCBpb0hvc3Qubm90aWZ5KHtcbiAgICAgICAgdGltZTogbmV3IERhdGUoKSxcbiAgICAgICAgbGV2ZWw6ICdpbmZvJyxcbiAgICAgICAgYWN0aW9uOiAnc3ludGgnLFxuICAgICAgICBjb2RlOiAnQ0RLX1RPT0xLSVRfVzAwMDEnLFxuICAgICAgICBtZXNzYWdlOiAnY2kgbWVzc2FnZScsXG4gICAgICB9KTtcblxuICAgICAgZXhwZWN0KG1vY2tTdGRvdXQpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKGNoYWxrLndoaXRlKCdjaSBtZXNzYWdlJykgKyAnXFxuJyk7XG4gICAgICBleHBlY3QobW9ja1N0ZGVycikubm90LnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICB9KTtcblxuICAgIHRlc3QoJ3dyaXRlcyB0byBzdGRlcnIgZm9yIGVycm9yIGxldmVsIGluIENJIG1vZGUnLCBhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCBpb0hvc3Qubm90aWZ5KHtcbiAgICAgICAgdGltZTogbmV3IERhdGUoKSxcbiAgICAgICAgbGV2ZWw6ICdlcnJvcicsXG4gICAgICAgIGFjdGlvbjogJ3N5bnRoJyxcbiAgICAgICAgY29kZTogJ0NES19UT09MS0lUX0UwMDAxJyxcbiAgICAgICAgbWVzc2FnZTogJ2NpIGVycm9yIG1lc3NhZ2UnLFxuICAgICAgfSk7XG5cbiAgICAgIGV4cGVjdChtb2NrU3RkZXJyKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChjaGFsay5yZWQoJ2NpIGVycm9yIG1lc3NhZ2UnKSArICdcXG4nKTtcbiAgICAgIGV4cGVjdChtb2NrU3Rkb3V0KS5ub3QudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgndGltZXN0YW1wIGhhbmRsaW5nJywgKCkgPT4ge1xuICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgaW9Ib3N0LmlzVFRZID0gdHJ1ZTtcbiAgICB9KTtcblxuICAgIHRlc3QoJ2luY2x1ZGVzIHRpbWVzdGFtcCBmb3IgREVCVUcgbGV2ZWwgd2l0aCBncmF5IGNvbG9yJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdGVzdERhdGUgPSBuZXcgRGF0ZSgnMjAyNC0wMS0wMVQxMjozNDo1NicpO1xuICAgICAgYXdhaXQgaW9Ib3N0Lm5vdGlmeSh7XG4gICAgICAgIHRpbWU6IHRlc3REYXRlLFxuICAgICAgICBsZXZlbDogJ2RlYnVnJyxcbiAgICAgICAgYWN0aW9uOiAnc3ludGgnLFxuICAgICAgICBjb2RlOiAnQ0RLX1RPT0xLSVRfSTAwMDEnLFxuICAgICAgICBtZXNzYWdlOiAnZGVidWcgbWVzc2FnZScsXG4gICAgICAgIGZvcmNlU3Rkb3V0OiB0cnVlLFxuICAgICAgfSk7XG5cbiAgICAgIGV4cGVjdChtb2NrU3Rkb3V0KS50b0hhdmVCZWVuQ2FsbGVkV2l0aChgWzEyOjM0OjU2XSAke2NoYWxrLmdyYXkoJ2RlYnVnIG1lc3NhZ2UnKX1cXG5gKTtcbiAgICB9KTtcblxuICAgIHRlc3QoJ2V4Y2x1ZGVzIHRpbWVzdGFtcCBmb3Igb3RoZXIgbGV2ZWxzIGJ1dCBpbmNsdWRlcyBjb2xvcicsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHRlc3REYXRlID0gbmV3IERhdGUoJzIwMjQtMDEtMDFUMTI6MzQ6NTYnKTtcbiAgICAgIGF3YWl0IGlvSG9zdC5ub3RpZnkoe1xuICAgICAgICB0aW1lOiB0ZXN0RGF0ZSxcbiAgICAgICAgbGV2ZWw6ICdpbmZvJyxcbiAgICAgICAgYWN0aW9uOiAnc3ludGgnLFxuICAgICAgICBjb2RlOiAnQ0RLX1RPT0xLSVRfSTAwMDEnLFxuICAgICAgICBtZXNzYWdlOiAnaW5mbyBtZXNzYWdlJyxcbiAgICAgICAgZm9yY2VTdGRvdXQ6IHRydWUsXG4gICAgICB9KTtcblxuICAgICAgZXhwZWN0KG1vY2tTdGRvdXQpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKGNoYWxrLndoaXRlKCdpbmZvIG1lc3NhZ2UnKSArICdcXG4nKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2Vycm9yIGhhbmRsaW5nJywgKCkgPT4ge1xuICAgIHRlc3QoJ3JlamVjdHMgb24gd3JpdGUgZXJyb3InLCBhc3luYyAoKSA9PiB7XG4gICAgICBqZXN0LnNweU9uKHByb2Nlc3Muc3Rkb3V0LCAnd3JpdGUnKS5tb2NrSW1wbGVtZW50YXRpb24oKF86IGFueSwgY2FsbGJhY2s6IGFueSkgPT4ge1xuICAgICAgICBpZiAoY2FsbGJhY2spIGNhbGxiYWNrKG5ldyBFcnJvcignV3JpdGUgZmFpbGVkJykpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0pO1xuXG4gICAgICBhd2FpdCBleHBlY3QoaW9Ib3N0Lm5vdGlmeSh7XG4gICAgICAgIHRpbWU6IG5ldyBEYXRlKCksXG4gICAgICAgIGxldmVsOiAnaW5mbycsXG4gICAgICAgIGFjdGlvbjogJ3N5bnRoJyxcbiAgICAgICAgY29kZTogJ0NES19UT09MS0lUX0kwMDAxJyxcbiAgICAgICAgbWVzc2FnZTogJ3Rlc3QgbWVzc2FnZScsXG4gICAgICAgIGZvcmNlU3Rkb3V0OiB0cnVlLFxuICAgICAgfSkpLnJlamVjdHMudG9UaHJvdygnV3JpdGUgZmFpbGVkJyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdyZXF1ZXN0UmVzcG9uc2UnLCAoKSA9PiB7XG4gICAgdGVzdCgnbG9ncyBtZXNzYWdlcyBhbmQgcmV0dXJucyBkZWZhdWx0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgaW9Ib3N0LmlzVFRZID0gdHJ1ZTtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgaW9Ib3N0LnJlcXVlc3RSZXNwb25zZSh7XG4gICAgICAgIHRpbWU6IG5ldyBEYXRlKCksXG4gICAgICAgIGxldmVsOiAnaW5mbycsXG4gICAgICAgIGFjdGlvbjogJ3N5bnRoJyxcbiAgICAgICAgY29kZTogJ0NES19UT09MS0lUX0kwMDAxJyxcbiAgICAgICAgbWVzc2FnZTogJ3Rlc3QgbWVzc2FnZScsXG4gICAgICAgIGRlZmF1bHRSZXNwb25zZTogJ2RlZmF1bHQgcmVzcG9uc2UnLFxuICAgICAgfSk7XG5cbiAgICAgIGV4cGVjdChtb2NrU3RkZXJyKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChjaGFsay53aGl0ZSgndGVzdCBtZXNzYWdlJykgKyAnXFxuJyk7XG4gICAgICBleHBlY3QocmVzcG9uc2UpLnRvQmUoJ2RlZmF1bHQgcmVzcG9uc2UnKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
|
|
333
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLWlvLWhvc3QudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImNsaS1pby1ob3N0LnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSwrQkFBK0I7QUFDL0IsK0RBQXFGO0FBQ3JGLGlEQUFtRDtBQUVuRCxNQUFNLE1BQU0sR0FBRyx1QkFBUyxDQUFDLFFBQVEsQ0FBQztJQUNoQyxRQUFRLEVBQUUsT0FBTztDQUNsQixDQUFDLENBQUM7QUFFSCxRQUFRLENBQUMsV0FBVyxFQUFFLEdBQUcsRUFBRTtJQUN6QixJQUFJLFVBQXFCLENBQUM7SUFDMUIsSUFBSSxVQUFxQixDQUFDO0lBQzFCLElBQUksY0FBa0MsQ0FBQztJQUV2QyxVQUFVLENBQUMsR0FBRyxFQUFFO1FBQ2QsVUFBVSxHQUFHLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUN2QixVQUFVLEdBQUcsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBRXZCLHdCQUF3QjtRQUN4QixNQUFNLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQztRQUM3QyxNQUFNLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQztRQUNwQixNQUFNLENBQUMsYUFBYSxHQUFHLE9BQU8sQ0FBQztRQUUvQixjQUFjLEdBQUc7WUFDZixJQUFJLEVBQUUsSUFBSSxJQUFJLENBQUMscUJBQXFCLENBQUM7WUFDckMsS0FBSyxFQUFFLE1BQU07WUFDYixNQUFNLEVBQUUsT0FBTztZQUNmLElBQUksRUFBRSxtQkFBbUI7WUFDekIsT0FBTyxFQUFFLGNBQWM7U0FDeEIsQ0FBQztRQUVGLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLEdBQVEsRUFBRSxRQUFjLEVBQUUsRUFBUSxFQUFFLEVBQUU7WUFDNUYsVUFBVSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxD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M0IsQ0FBQyxDQUFDO2dCQUVILE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUMxRCxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3RDLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHsgQ2xpSW9Ib3N0LCBJb01lc3NhZ2UsIElvTWVzc2FnZUxldmVsIH0gZnJvbSAnLi4vLi4vbGliL3Rvb2xraXQvY2xpLWlvLWhvc3QnO1xuaW1wb3J0IHsgc2VuZFJlc3BvbnNlIH0gZnJvbSAnLi4vX2hlbHBlcnMvcHJvbXB0cyc7XG5cbmNvbnN0IGlvSG9zdCA9IENsaUlvSG9zdC5pbnN0YW5jZSh7XG4gIGxvZ0xldmVsOiAndHJhY2UnLFxufSk7XG5cbmRlc2NyaWJlKCdDbGlJb0hvc3QnLCAoKSA9PiB7XG4gIGxldCBtb2NrU3Rkb3V0OiBqZXN0Lk1vY2s7XG4gIGxldCBtb2NrU3RkZXJyOiBqZXN0Lk1vY2s7XG4gIGxldCBkZWZhdWx0TWVzc2FnZTogSW9NZXNzYWdlPHVua25vd24+O1xuXG4gIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgIG1vY2tTdGRvdXQgPSBqZXN0LmZuKCk7XG4gICAgbW9ja1N0ZGVyciA9IGplc3QuZm4oKTtcblxuICAgIC8vIFJlc2V0IHNpbmdsZXRvbiBzdGF0ZVxuICAgIGlvSG9zdC5pc1RUWSA9IHByb2Nlc3Muc3Rkb3V0LmlzVFRZID8/IGZhbHNlO1xuICAgIGlvSG9zdC5pc0NJID0gZmFsc2U7XG4gICAgaW9Ib3N0LmN1cnJlbnRBY3Rpb24gPSAnc3ludGgnO1xuXG4gICAgZGVmYXVsdE1lc3NhZ2UgPSB7XG4gICAgICB0aW1lOiBuZXcgRGF0ZSgnMjAyNC0wMS0wMVQxMjowMDowMCcpLFxuICAgICAgbGV2ZWw6ICdpbmZvJyxcbiAgICAgIGFjdGlvbjogJ3N5bnRoJyxcbiAgICAgIGNvZGU6ICdDREtfVE9PTEtJVF9JMDAwMScsXG4gICAgICBtZXNzYWdlOiAndGVzdCBtZXNzYWdlJyxcbiAgICB9O1xuXG4gICAgamVzdC5zcHlPbihwcm9jZXNzLnN0ZG91dCwgJ3dyaXRlJykubW9ja0ltcGxlbWVudGF0aW9uKChzdHI6IGFueSwgZW5jb2Rpbmc/OiBhbnksIGNiPzogYW55KSA9PiB7XG4gICAgICBtb2NrU3Rkb3V0KHN0ci50b1N0cmluZygpKTtcbiAgICAgIGNvbnN0IGNhbGxiYWNrID0gdHlwZW9mIGVuY29kaW5nID09PSAnZnVuY3Rpb24nID8gZW5jb2RpbmcgOiBjYjtcbiAgICAgIGlmIChjYWxsYmFjaykgY2FsbGJhY2soKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0pO1xuXG4gICAgamVzdC5zcHlPbihwcm9jZXNzLnN0ZGVyciwgJ3dyaXRlJykubW9ja0ltcGxlbWVudGF0aW9uKChzdHI6IGFueSwgZW5jb2Rpbmc/OiBhbnksIGNiPzogYW55KSA9PiB7XG4gICAgICBtb2NrU3RkZXJyKHN0ci50b1N0cmluZygpKTtcbiAgICAgIGNvbnN0IGNhbGxiYWNrID0gdHlwZW9mIGVuY29kaW5nID09PSAnZnVuY3Rpb24nID8gZW5jb2RpbmcgOiBjYjtcbiAgICAgIGlmIChjYWxsYmFjaykgY2FsbGJhY2soKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0pO1xuICB9KTtcblxuICBhZnRlckVhY2goKCkgPT4ge1xuICAgIGplc3QucmVzdG9yZUFsbE1vY2tzKCk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdzdHJlYW0gc2VsZWN0aW9uJywgKCkgPT4ge1xuICAgIHRlc3QoJ3dyaXRlcyB0byBzdGRlcnIgYnkgZGVmYXVsdCBmb3Igbm9uLWVycm9yIG1lc3NhZ2VzIGluIG5vbi1DSSBtb2RlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgaW9Ib3N0LmlzVFRZID0gdHJ1ZTtcbiAgICAgIGF3YWl0IGlvSG9zdC5ub3RpZnkoe1xuICAgICAgICB0aW1lOiBuZXcgRGF0ZSgpLFxuICAgICAgICBsZXZlbDogJ2luZm8nLFxuICAgICAgICBhY3Rpb246ICdzeW50aCcsXG4gICAgICAgIGNvZGU6ICdDREtfVE9PTEtJVF9JMDAwMScsXG4gICAgICAgIG1lc3NhZ2U6ICd0ZXN0IG1lc3NhZ2UnLFxuICAgICAgfSk7XG5cbiAgICAgIGV4cGVjdChtb2NrU3RkZXJyKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChjaGFsay53aGl0ZSgndGVzdCBtZXNzYWdlJykgKyAnXFxuJyk7XG4gICAgICBleHBlY3QobW9ja1N0ZG91dCkubm90LnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICB9KTtcblxuICAgIHRlc3QoJ3dyaXRlcyB0byBzdGRlcnIgZm9yIGVycm9yIGxldmVsIHdpdGggcmVkIGNvbG9yJywgYXN5bmMgKCkgPT4ge1xuICAgICAgaW9Ib3N0LmlzVFRZID0gdHJ1ZTtcbiAgICAgIGF3YWl0IGlvSG9zdC5ub3RpZnkoe1xuICAgICAgICB0aW1lOiBuZXcgRGF0ZSgpLFxuICAgICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgICAgYWN0aW9uOiAnc3ludGgnLFxuICAgICAgICBjb2RlOiAnQ0RLX1RPT0xLSVRfRTAwMDEnLFxuICAgICAgICBtZXNzYWdlOiAnZXJyb3IgbWVzc2FnZScsXG4gICAgICB9KTtcblxuICAgICAgZXhwZWN0KG1vY2tTdGRlcnIpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKGNoYWxrLnJlZCgnZXJyb3IgbWVzc2FnZScpICsgJ1xcbicpO1xuICAgICAgZXhwZWN0KG1vY2tTdGRvdXQpLm5vdC50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgfSk7XG5cbiAgICB0ZXN0KCd3cml0ZXMgdG8gc3Rkb3V0IGZvciByZXN1bHQgbGV2ZWwnLCBhc3luYyAoKSA9PiB7XG4gICAgICBpb0hvc3QuaXNUVFkgPSB0cnVlO1xuICAgICAgYXdhaXQgaW9Ib3N0Lm5vdGlmeSh7XG4gICAgICAgIHRpbWU6IG5ldyBEYXRlKCksXG4gICAgICAgIGxldmVsOiAncmVzdWx0JyxcbiAgICAgICAgYWN0aW9uOiAnc3ludGgnLFxuICAgICAgICBjb2RlOiAnQ0RLX1RPT0xLSVRfSTAwMDEnLFxuICAgICAgICBtZXNzYWdlOiAncmVzdWx0IG1lc3NhZ2UnLFxuICAgICAgfSk7XG5cbiAgICAgIGV4cGVjdChtb2NrU3Rkb3V0KS50b0hhdmVCZWVuQ2FsbGVkV2l0aChjaGFsay53aGl0ZSgncmVzdWx0IG1lc3NhZ2UnKSArICdcXG4nKTtcbiAgICAgIGV4cGVjdChtb2NrU3RkZXJyKS5ub3QudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnbWVzc2FnZSBmb3JtYXR0aW5nJywgKCkgPT4ge1xuICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgaW9Ib3N0LmlzVFRZID0gdHJ1ZTtcbiAgICB9KTtcblxuICAgIHRlc3QoJ2Zvcm1hdHMgZGVidWcgbWVzc2FnZXMgd2l0aCB0aW1lc3RhbXAnLCBhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCBpb0hvc3Qubm90aWZ5KHtcbiAgICAgICAgLi4uZGVmYXVsdE1lc3NhZ2UsXG4gICAgICAgIGxldmVsOiAnZGVidWcnLFxuICAgICAgfSk7XG5cbiAgICAgIGV4cGVjdChtb2NrU3RkZXJyKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChgWzEyOjAwOjAwXSAke2NoYWxrLmdyYXkoJ3Rlc3QgbWVzc2FnZScpfVxcbmApO1xuICAgIH0pO1xuXG4gICAgdGVzdCgnZm9ybWF0cyB0cmFjZSBtZXNzYWdlcyB3aXRoIHRpbWVzdGFtcCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IGlvSG9zdC5ub3RpZnkoe1xuICAgICAgICAuLi5kZWZhdWx0TWVzc2FnZSxcbiAgICAgICAgbGV2ZWw6ICd0cmFjZScsXG4gICAgICB9KTtcblxuICAgICAgZXhwZWN0KG1vY2tTdGRlcnIpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKGBbMTI6MDA6MDBdICR7Y2hhbGsuZ3JheSgndGVzdCBtZXNzYWdlJyl9XFxuYCk7XG4gICAgfSk7XG5cbiAgICB0ZXN0KCdhcHBsaWVzIG5vIHN0eWxpbmcgd2hlbiBUVFkgaXMgZmFsc2UnLCBhc3luYyAoKSA9PiB7XG4gICAgICBpb0hvc3QuaXNUVFkgPSBmYWxzZTtcbiAgICAgIGF3YWl0IGlvSG9zdC5ub3RpZnkoe1xuICAgICAgICAuLi5kZWZhdWx0TWVzc2FnZSxcbiAgICAgIH0pO1xuXG4gICAgICBleHBlY3QobW9ja1N0ZGVycikudG9IYXZlQmVlbkNhbGxlZFdpdGgoJ3Rlc3QgbWVzc2FnZVxcbicpO1xuICAgIH0pO1xuXG4gICAgdGVzdC5lYWNoKFtcbiAgICAgIFsnZXJyb3InLCAncmVkJywgZmFsc2VdLFxuICAgICAgWyd3YXJuJywgJ3llbGxvdycsIGZhbHNlXSxcbiAgICAgIFsnaW5mbycsICd3aGl0ZScsIGZhbHNlXSxcbiAgICAgIFsnZGVidWcnLCAnZ3JheScsIHRydWVdLFxuICAgICAgWyd0cmFjZScsICdncmF5JywgdHJ1ZV0sXG4gICAgXSBhcyBBcnJheTxbSW9NZXNzYWdlTGV2ZWwsIHR5cGVvZiBjaGFsay5Gb3JlZ3JvdW5kQ29sb3IsIGJvb2xlYW5dPikoJ291dHB1dHMgJXNzIGluICVzIGNvbG9yICcsIGFzeW5jIChsZXZlbCwgY29sb3IsIHNob3VsZEFkZFRpbWUpID0+IHtcbiAgICAgIC8vIEdpdmVuXG4gICAgICBjb25zdCBzdHlsZSA9IGNoYWxrW2NvbG9yXTtcbiAgICAgIGxldCBleHBlY3RlZE91dHB1dCA9IGAke3N0eWxlKCd0ZXN0IG1lc3NhZ2UnKX1cXG5gO1xuICAgICAgaWYgKHNob3VsZEFkZFRpbWUpIHtcbiAgICAgICAgZXhwZWN0ZWRPdXRwdXQgPSBgWzEyOjAwOjAwXSAke2V4cGVjdGVkT3V0cHV0fWA7XG4gICAgICB9XG5cbiAgICAgIC8vIFdoZW5cbiAgICAgIGF3YWl0IGlvSG9zdC5ub3RpZnkoe1xuICAgICAgICAuLi5kZWZhdWx0TWVzc2FnZSxcbiAgICAgICAgbGV2ZWwsXG4gICAgICB9KTtcblxuICAgICAgLy8gVGhlblxuICAgICAgZXhwZWN0KG1vY2tTdGRlcnIpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKGV4cGVjdGVkT3V0cHV0KTtcbiAgICAgIG1vY2tTdGRvdXQubW9ja0NsZWFyKCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdhY3Rpb24gaGFuZGxpbmcnLCAoKSA9PiB7XG4gICAgdGVzdCgnc2V0cyBhbmQgZ2V0cyBjdXJyZW50IGFjdGlvbicsICgpID0+IHtcbiAgICAgIGlvSG9zdC5jdXJyZW50QWN0aW9uID0gJ2RlcGxveSc7XG4gICAgICBleHBlY3QoaW9Ib3N0LmN1cnJlbnRBY3Rpb24pLnRvQmUoJ2RlcGxveScpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnQ0kgbW9kZSBiZWhhdmlvcicsICgpID0+IHtcbiAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgIGlvSG9zdC5pc1RUWSA9IHRydWU7XG4gICAgICBpb0hvc3QuaXNDSSA9IHRydWU7XG4gICAgfSk7XG5cbiAgICB0ZXN0KCd3cml0ZXMgdG8gc3Rkb3V0IGluIENJIG1vZGUgd2hlbiBsZXZlbCBpcyBub3QgZXJyb3InLCBhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCBpb0hvc3Qubm90aWZ5KHtcbiAgICAgICAgdGltZTogbmV3IERhdGUoKSxcbiAgICAgICAgbGV2ZWw6ICdpbmZvJyxcbiAgICAgICAgYWN0aW9uOiAnc3ludGgnLFxuICAgICAgICBjb2RlOiAnQ0RLX1RPT0xLSVRfVzAwMDEnLFxuICAgICAgICBtZXNzYWdlOiAnY2kgbWVzc2FnZScsXG4gICAgICB9KTtcblxuICAgICAgZXhwZWN0KG1vY2tTdGRvdXQpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKGNoYWxrLndoaXRlKCdjaSBtZXNzYWdlJykgKyAnXFxuJyk7XG4gICAgICBleHBlY3QobW9ja1N0ZGVycikubm90LnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICB9KTtcblxuICAgIHRlc3QoJ3dyaXRlcyB0byBzdGRlcnIgZm9yIGVycm9yIGxldmVsIGluIENJIG1vZGUnLCBhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCBpb0hvc3Qubm90aWZ5KHtcbiAgICAgICAgdGltZTogbmV3IERhdGUoKSxcbiAgICAgICAgbGV2ZWw6ICdlcnJvcicsXG4gICAgICAgIGFjdGlvbjogJ3N5bnRoJyxcbiAgICAgICAgY29kZTogJ0NES19UT09MS0lUX0UwMDAxJyxcbiAgICAgICAgbWVzc2FnZTogJ2NpIGVycm9yIG1lc3NhZ2UnLFxuICAgICAgfSk7XG5cbiAgICAgIGV4cGVjdChtb2NrU3RkZXJyKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChjaGFsay5yZWQoJ2NpIGVycm9yIG1lc3NhZ2UnKSArICdcXG4nKTtcbiAgICAgIGV4cGVjdChtb2NrU3Rkb3V0KS5ub3QudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgndGltZXN0YW1wIGhhbmRsaW5nJywgKCkgPT4ge1xuICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgaW9Ib3N0LmlzVFRZID0gdHJ1ZTtcbiAgICB9KTtcblxuICAgIHRlc3QoJ2luY2x1ZGVzIHRpbWVzdGFtcCBmb3IgREVCVUcgbGV2ZWwgd2l0aCBncmF5IGNvbG9yJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdGVzdERhdGUgPSBuZXcgRGF0ZSgnMjAyNC0wMS0wMVQxMjozNDo1NicpO1xuICAgICAgYXdhaXQgaW9Ib3N0Lm5vdGlmeSh7XG4gICAgICAgIHRpbWU6IHRlc3REYXRlLFxuICAgICAgICBsZXZlbDogJ2RlYnVnJyxcbiAgICAgICAgYWN0aW9uOiAnc3ludGgnLFxuICAgICAgICBjb2RlOiAnQ0RLX1RPT0xLSVRfSTAwMDEnLFxuICAgICAgICBtZXNzYWdlOiAnZGVidWcgbWVzc2FnZScsXG4gICAgICB9KTtcblxuICAgICAgZXhwZWN0KG1vY2tTdGRlcnIpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKGBbMTI6MzQ6NTZdICR7Y2hhbGsuZ3JheSgnZGVidWcgbWVzc2FnZScpfVxcbmApO1xuICAgIH0pO1xuXG4gICAgdGVzdCgnZXhjbHVkZXMgdGltZXN0YW1wIGZvciBvdGhlciBsZXZlbHMgYnV0IGluY2x1ZGVzIGNvbG9yJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdGVzdERhdGUgPSBuZXcgRGF0ZSgnMjAyNC0wMS0wMVQxMjozNDo1NicpO1xuICAgICAgYXdhaXQgaW9Ib3N0Lm5vdGlmeSh7XG4gICAgICAgIHRpbWU6IHRlc3REYXRlLFxuICAgICAgICBsZXZlbDogJ2luZm8nLFxuICAgICAgICBhY3Rpb246ICdzeW50aCcsXG4gICAgICAgIGNvZGU6ICdDREtfVE9PTEtJVF9JMDAwMScsXG4gICAgICAgIG1lc3NhZ2U6ICdpbmZvIG1lc3NhZ2UnLFxuICAgICAgfSk7XG5cbiAgICAgIGV4cGVjdChtb2NrU3RkZXJyKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChjaGFsay53aGl0ZSgnaW5mbyBtZXNzYWdlJykgKyAnXFxuJyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdyZXF1ZXN0UmVzcG9uc2UnLCAoKSA9PiB7XG4gICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICBpb0hvc3QuaXNUVFkgPSB0cnVlO1xuICAgICAgaW9Ib3N0LmlzQ0kgPSBmYWxzZTtcbiAgICB9KTtcblxuICAgIHRlc3QoJ2ZhaWwgaWYgY29uY3VycmVuY3kgaXMgPiAxJywgYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgZXhwZWN0KCgpID0+IGlvSG9zdC5yZXF1ZXN0UmVzcG9uc2Uoe1xuICAgICAgICB0aW1lOiBuZXcgRGF0ZSgpLFxuICAgICAgICBsZXZlbDogJ2luZm8nLFxuICAgICAgICBhY3Rpb246ICdzeW50aCcsXG4gICAgICAgIGNvZGU6ICdDREtfVE9PTEtJVF9JMDAwMScsXG4gICAgICAgIG1lc3NhZ2U6ICdDb250aW51ZT8nLFxuICAgICAgICBkZWZhdWx0UmVzcG9uc2U6IHRydWUsXG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICBjb25jdXJyZW5jeTogMyxcbiAgICAgICAgfSxcbiAgICAgIH0pKS5yZWplY3RzLnRvVGhyb3coJ2J1dCBjb25jdXJyZW5jeSBpcyBncmVhdGVyIHRoYW4gMScpO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ2Jvb2xlYW4nLCAoKSA9PiB7XG4gICAgICB0ZXN0KCdyZXNwb25kIFwieWVzXCIgdG8gYSBjb25maXJtYXRpb24gcHJvbXB0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBzZW5kUmVzcG9uc2UoJ3knKTtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBpb0hvc3QucmVxdWVzdFJlc3BvbnNlKHtcbiAgICAgICAgICB0aW1lOiBuZXcgRGF0ZSgpLFxuICAgICAgICAgIGxldmVsOiAnaW5mbycsXG4gICAgICAgICAgYWN0aW9uOiAnc3ludGgnLFxuICAgICAgICAgIGNvZGU6ICdDREtfVE9PTEtJVF9JMDAwMScsXG4gICAgICAgICAgbWVzc2FnZTogJ0NvbnRpbnVlPycsXG4gICAgICAgICAgZGVmYXVsdFJlc3BvbnNlOiB0cnVlLFxuICAgICAgICB9KTtcblxuICAgICAgICBleHBlY3QobW9ja1N0ZG91dCkudG9IYXZlQmVlbkNhbGxlZFdpdGgoY2hhbGsuY3lhbignQ29udGludWU/JykgKyAnICh5L24pICcpO1xuICAgICAgICBleHBlY3QocmVzcG9uc2UpLnRvQmUodHJ1ZSk7XG4gICAgICB9KTtcblxuICAgICAgdGVzdCgncmVzcG9uZCBcIm5vXCIgdG8gYSBjb25maXJtYXRpb24gcHJvbXB0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBzZW5kUmVzcG9uc2UoJ24nKTtcbiAgICAgICAgYXdhaXQgZXhwZWN0KCgpID0+IGlvSG9zdC5yZXF1ZXN0UmVzcG9uc2Uoe1xuICAgICAgICAgIHRpbWU6IG5ldyBEYXRlKCksXG4gICAgICAgICAgbGV2ZWw6ICdpbmZvJyxcbiAgICAgICAgICBhY3Rpb246ICdzeW50aCcsXG4gICAgICAgICAgY29kZTogJ0NES19UT09MS0lUX0kwMDAxJyxcbiAgICAgICAgICBtZXNzYWdlOiAnQ29udGludWU/JyxcbiAgICAgICAgICBkZWZhdWx0UmVzcG9uc2U6IHRydWUsXG4gICAgICAgIH0pKS5yZWplY3RzLnRvVGhyb3coJ0Fib3J0ZWQgYnkgdXNlcicpO1xuXG4gICAgICAgIGV4cGVjdChtb2NrU3Rkb3V0KS50b0hhdmVCZWVuQ2FsbGVkV2l0aChjaGFsay5jeWFuKCdDb250aW51ZT8nKSArICcgKHkvbikgJyk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdzdHJpbmcnLCAoKSA9PiB7XG4gICAgICB0ZXN0LmVhY2goW1xuICAgICAgICBbJ2JlYXInLCAnYmVhciddLFxuICAgICAgICBbJ2dpcmFmZmUnLCAnZ2lyYWZmZSddLFxuICAgICAgICAvLyBzaW11bGF0ZSB0aGUgZW50ZXIga2V5XG4gICAgICAgIFsnXFx4MEEnLCAnY2F0J10sXG4gICAgICBdKSgncmVjZWl2ZXMgJXAgYW5kIHJldHVybnMgJXAnLCBhc3luYyAoaW5wdXQsIGV4cGVjdGVkUmVzcG9uc2UpID0+IHtcbiAgICAgICAgc2VuZFJlc3BvbnNlKGlucHV0KTtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBpb0hvc3QucmVxdWVzdFJlc3BvbnNlKHtcbiAgICAgICAgICB0aW1lOiBuZXcgRGF0ZSgpLFxuICAgICAgICAgIGxldmVsOiAnaW5mbycsXG4gICAgICAgICAgYWN0aW9uOiAnc3ludGgnLFxuICAgICAgICAgIGNvZGU6ICdDREtfVE9PTEtJVF9JMDAwMScsXG4gICAgICAgICAgbWVzc2FnZTogJ0Zhdm9yaXRlIGFuaW1hbCcsXG4gICAgICAgICAgZGVmYXVsdFJlc3BvbnNlOiAnY2F0JyxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZXhwZWN0KG1vY2tTdGRvdXQpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKGNoYWxrLmN5YW4oJ0Zhdm9yaXRlIGFuaW1hbCcpICsgJyAoY2F0KSAnKTtcbiAgICAgICAgZXhwZWN0KHJlc3BvbnNlKS50b0JlKGV4cGVjdGVkUmVzcG9uc2UpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnbnVtYmVyJywgKCkgPT4ge1xuICAgICAgdGVzdC5lYWNoKFtcbiAgICAgICAgWyczJywgM10sXG4gICAgICAgIC8vIHNpbXVsYXRlIHRoZSBlbnRlciBrZXlcbiAgICAgICAgWydcXHgwQScsIDFdLFxuICAgICAgXSkoJ3JlY2VpdmVzICVwIGFuZCByZXR1cm4gJXAnLCBhc3luYyAoaW5wdXQsIGV4cGVjdGVkUmVzcG9uc2UpID0+IHtcbiAgICAgICAgc2VuZFJlc3BvbnNlKGlucHV0KTtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBpb0hvc3QucmVxdWVzdFJlc3BvbnNlKHtcbiAgICAgICAgICB0aW1lOiBuZXcgRGF0ZSgpLFxuICAgICAgICAgIGxldmVsOiAnaW5mbycsXG4gICAgICAgICAgYWN0aW9uOiAnc3ludGgnLFxuICAgICAgICAgIGNvZGU6ICdDREtfVE9PTEtJVF9JMDAwMScsXG4gICAgICAgICAgbWVzc2FnZTogJ0hvdyBtYW55IHdvdWxkIHlvdSBsaWtlPycsXG4gICAgICAgICAgZGVmYXVsdFJlc3BvbnNlOiAxLFxuICAgICAgICB9KTtcblxuICAgICAgICBleHBlY3QobW9ja1N0ZG91dCkudG9IYXZlQmVlbkNhbGxlZFdpdGgoY2hhbGsuY3lhbignSG93IG1hbnkgd291bGQgeW91IGxpa2U/JykgKyAnICgxKSAnKTtcbiAgICAgICAgZXhwZWN0KHJlc3BvbnNlKS50b0JlKGV4cGVjdGVkUmVzcG9uc2UpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnbm9uLXByb21wdGFibGUgZGF0YScsICgpID0+IHtcbiAgICAgIHRlc3QoJ2xvZ3MgbWVzc2FnZXMgYW5kIHJldHVybnMgZGVmYXVsdCB1bmNoYW5nZWQnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgaW9Ib3N0LnJlcXVlc3RSZXNwb25zZSh7XG4gICAgICAgICAgdGltZTogbmV3IERhdGUoKSxcbiAgICAgICAgICBsZXZlbDogJ2luZm8nLFxuICAgICAgICAgIGFjdGlvbjogJ3N5bnRoJyxcbiAgICAgICAgICBjb2RlOiAnQ0RLX1RPT0xLSVRfSTAwMDEnLFxuICAgICAgICAgIG1lc3NhZ2U6ICd0ZXN0IG1lc3NhZ2UnLFxuICAgICAgICAgIGRlZmF1bHRSZXNwb25zZTogWzEsIDIsIDNdLFxuICAgICAgICB9KTtcblxuICAgICAgICBleHBlY3QobW9ja1N0ZGVycikudG9IYXZlQmVlbkNhbGxlZFdpdGgoY2hhbGsud2hpdGUoJ3Rlc3QgbWVzc2FnZScpICsgJ1xcbicpO1xuICAgICAgICBleHBlY3QocmVzcG9uc2UpLnRvRXF1YWwoWzEsIDIsIDNdKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ25vbiBUVFkgZW52aXJvbm1lbnQnLCAoKSA9PiB7XG4gICAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgICAgaW9Ib3N0LmlzVFRZID0gZmFsc2U7XG4gICAgICAgIGlvSG9zdC5pc0NJID0gZmFsc2U7XG4gICAgICB9KTtcblxuICAgICAgdGVzdCgnZmFpbCBmb3IgYWxsIHByb21wdHMnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IGV4cGVjdCgoKSA9PiBpb0hvc3QucmVxdWVzdFJlc3BvbnNlKHtcbiAgICAgICAgICB0aW1lOiBuZXcgRGF0ZSgpLFxuICAgICAgICAgIGxldmVsOiAnaW5mbycsXG4gICAgICAgICAgYWN0aW9uOiAnc3ludGgnLFxuICAgICAgICAgIGNvZGU6ICdDREtfVE9PTEtJVF9JMDAwMScsXG4gICAgICAgICAgbWVzc2FnZTogJ0NvbnRpbnVlPycsXG4gICAgICAgICAgZGVmYXVsdFJlc3BvbnNlOiB0cnVlLFxuICAgICAgICB9KSkucmVqZWN0cy50b1Rocm93KCdVc2VyIGlucHV0IGlzIG5lZWRlZCcpO1xuICAgICAgfSk7XG5cbiAgICAgIHRlc3QoJ2ZhaWwgd2l0aCBzcGVjaWZpYyBtb3RpdmF0aW9uJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCBleHBlY3QoKCkgPT4gaW9Ib3N0LnJlcXVlc3RSZXNwb25zZSh7XG4gICAgICAgICAgdGltZTogbmV3IERhdGUoKSxcbiAgICAgICAgICBsZXZlbDogJ2luZm8nLFxuICAgICAgICAgIGFjdGlvbjogJ3N5bnRoJyxcbiAgICAgICAgICBjb2RlOiAnQ0RLX1RPT0xLSVRfSTAwMDEnLFxuICAgICAgICAgIG1lc3NhZ2U6ICdDb250aW51ZT8nLFxuICAgICAgICAgIGRlZmF1bHRSZXNwb25zZTogdHJ1ZSxcbiAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICBtb3RpdmF0aW9uOiAnQmFuYW5hcyBhcmUgeWVsbG93JyxcbiAgICAgICAgICB9LFxuICAgICAgICB9KSkucmVqZWN0cy50b1Rocm93KCdCYW5hbmFzIGFyZSB5ZWxsb3cnKTtcbiAgICAgIH0pO1xuXG4gICAgICB0ZXN0KCdyZXR1cm5zIHRoZSBkZWZhdWx0IGZvciBub24tcHJvbXB0YWJsZSByZXF1ZXN0cycsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBpb0hvc3QucmVxdWVzdFJlc3BvbnNlKHtcbiAgICAgICAgICB0aW1lOiBuZXcgRGF0ZSgpLFxuICAgICAgICAgIGxldmVsOiAnaW5mbycsXG4gICAgICAgICAgYWN0aW9uOiAnc3ludGgnLFxuICAgICAgICAgIGNvZGU6ICdDREtfVE9PTEtJVF9JMDAwMScsXG4gICAgICAgICAgbWVzc2FnZTogJ3Rlc3QgbWVzc2FnZScsXG4gICAgICAgICAgZGVmYXVsdFJlc3BvbnNlOiBbMSwgMiwgM10sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGV4cGVjdChtb2NrU3RkZXJyKS50b0hhdmVCZWVuQ2FsbGVkV2l0aCgndGVzdCBtZXNzYWdlXFxuJyk7XG4gICAgICAgIGV4cGVjdChyZXNwb25zZSkudG9FcXVhbChbMSwgMiwgM10pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=
|
package/lib/util/tracing.d.ts
DELETED
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
export declare function enableTracing(enabled: boolean): void;
|
|
2
|
-
/**
|
|
3
|
-
* Method decorator to trace a single static or member method, any time it's called
|
|
4
|
-
*/
|
|
5
|
-
export declare function traceCall(receiver: object, _propertyKey: string, descriptor: PropertyDescriptor, parentClassName?: string): PropertyDescriptor;
|
|
6
|
-
/**
|
|
7
|
-
* Class decorator, enable tracing for all methods on this class
|
|
8
|
-
*/
|
|
9
|
-
export declare function traceMethods(constructor: Function): void;
|
package/lib/util/tracing.js
DELETED
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.enableTracing = enableTracing;
|
|
4
|
-
exports.traceCall = traceCall;
|
|
5
|
-
exports.traceMethods = traceMethods;
|
|
6
|
-
const logging_1 = require("../logging");
|
|
7
|
-
let ENABLED = false;
|
|
8
|
-
let INDENT = 0;
|
|
9
|
-
function enableTracing(enabled) {
|
|
10
|
-
ENABLED = enabled;
|
|
11
|
-
}
|
|
12
|
-
/**
|
|
13
|
-
* Method decorator to trace a single static or member method, any time it's called
|
|
14
|
-
*/
|
|
15
|
-
function traceCall(receiver, _propertyKey, descriptor, parentClassName) {
|
|
16
|
-
const fn = descriptor.value;
|
|
17
|
-
const className = typeof receiver === 'function' ? receiver.name : parentClassName;
|
|
18
|
-
descriptor.value = function (...args) {
|
|
19
|
-
if (!ENABLED) {
|
|
20
|
-
return fn.apply(this, args);
|
|
21
|
-
}
|
|
22
|
-
(0, logging_1.debug)(`[trace] ${' '.repeat(INDENT)}${className || this.constructor.name || '(anonymous)'}#${fn.name}()`);
|
|
23
|
-
INDENT += 2;
|
|
24
|
-
const ret = fn.apply(this, args);
|
|
25
|
-
if (ret instanceof Promise) {
|
|
26
|
-
return ret.finally(() => {
|
|
27
|
-
INDENT -= 2;
|
|
28
|
-
});
|
|
29
|
-
}
|
|
30
|
-
else {
|
|
31
|
-
INDENT -= 2;
|
|
32
|
-
return ret;
|
|
33
|
-
}
|
|
34
|
-
};
|
|
35
|
-
return descriptor;
|
|
36
|
-
}
|
|
37
|
-
/**
|
|
38
|
-
* Class decorator, enable tracing for all methods on this class
|
|
39
|
-
*/
|
|
40
|
-
function traceMethods(constructor) {
|
|
41
|
-
// Statics
|
|
42
|
-
for (const [name, descriptor] of Object.entries(Object.getOwnPropertyDescriptors(constructor))) {
|
|
43
|
-
if (typeof descriptor.value !== 'function') {
|
|
44
|
-
continue;
|
|
45
|
-
}
|
|
46
|
-
const newDescriptor = traceCall(constructor, name, descriptor, constructor.name) ?? descriptor;
|
|
47
|
-
Object.defineProperty(constructor, name, newDescriptor);
|
|
48
|
-
}
|
|
49
|
-
// Instancne members
|
|
50
|
-
for (const [name, descriptor] of Object.entries(Object.getOwnPropertyDescriptors(constructor.prototype))) {
|
|
51
|
-
if (typeof descriptor.value !== 'function') {
|
|
52
|
-
continue;
|
|
53
|
-
}
|
|
54
|
-
const newDescriptor = traceCall(constructor.prototype, name, descriptor, constructor.name) ?? descriptor;
|
|
55
|
-
Object.defineProperty(constructor.prototype, name, newDescriptor);
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhY2luZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInRyYWNpbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFLQSxzQ0FFQztBQUtELDhCQXFCQztBQUtELG9DQWNDO0FBcERELHdDQUFtQztBQUVuQyxJQUFJLE9BQU8sR0FBRyxLQUFLLENBQUM7QUFDcEIsSUFBSSxNQUFNLEdBQUcsQ0FBQyxDQUFDO0FBRWYsU0FBZ0IsYUFBYSxDQUFDLE9BQWdCO0lBQzVDLE9BQU8sR0FBRyxPQUFPLENBQUM7QUFDcEIsQ0FBQztBQUVEOztHQUVHO0FBQ0gsU0FBZ0IsU0FBUyxDQUFDLFFBQWdCLEVBQUUsWUFBb0IsRUFBRSxVQUE4QixFQUFFLGVBQXdCO0lBQ3hILE1BQU0sRUFBRSxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUM7SUFDNUIsTUFBTSxTQUFTLEdBQUcsT0FBTyxRQUFRLEtBQUssVUFBVSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUM7SUFFbkYsVUFBVSxDQUFDLEtBQUssR0FBRyxVQUFVLEdBQUcsSUFBVztRQUN6QyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFBQyxPQUFPLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQUMsQ0FBQztRQUU5QyxJQUFBLGVBQUssRUFBQyxXQUFXLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsU0FBUyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxJQUFJLGFBQWEsSUFBSSxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQztRQUMxRyxNQUFNLElBQUksQ0FBQyxDQUFDO1FBRVosTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDakMsSUFBSSxHQUFHLFlBQVksT0FBTyxFQUFFLENBQUM7WUFDM0IsT0FBTyxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRTtnQkFDdEIsTUFBTSxJQUFJLENBQUMsQ0FBQztZQUNkLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQzthQUFNLENBQUM7WUFDTixNQUFNLElBQUksQ0FBQyxDQUFDO1lBQ1osT0FBTyxHQUFHLENBQUM7UUFDYixDQUFDO0lBQ0gsQ0FBQyxDQUFDO0lBQ0YsT0FBTyxVQUFVLENBQUM7QUFDcEIsQ0FBQztBQUVEOztHQUVHO0FBQ0gsU0FBZ0IsWUFBWSxDQUFDLFdBQXFCO0lBQ2hELFVBQVU7SUFDVixLQUFLLE1BQU0sQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMseUJBQXlCLENBQUMsV0FBVyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQy9GLElBQUksT0FBTyxVQUFVLENBQUMsS0FBSyxLQUFLLFVBQVUsRUFBRSxDQUFDO1lBQUMsU0FBUztRQUFDLENBQUM7UUFDekQsTUFBTSxhQUFhLEdBQUcsU0FBUyxDQUFDLFdBQVcsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxVQUFVLENBQUM7UUFDL0YsTUFBTSxDQUFDLGNBQWMsQ0FBQyxXQUFXLEVBQUUsSUFBSSxFQUFFLGFBQWEsQ0FBQyxDQUFDO0lBQzFELENBQUM7SUFFRCxvQkFBb0I7SUFDcEIsS0FBSyxNQUFNLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLHlCQUF5QixDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDekcsSUFBSSxPQUFPLFVBQVUsQ0FBQyxLQUFLLEtBQUssVUFBVSxFQUFFLENBQUM7WUFBQyxTQUFTO1FBQUMsQ0FBQztRQUN6RCxNQUFNLGFBQWEsR0FBRyxTQUFTLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxVQUFVLENBQUM7UUFDekcsTUFBTSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxhQUFhLENBQUMsQ0FBQztJQUNwRSxDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGRlYnVnIH0gZnJvbSAnLi4vbG9nZ2luZyc7XG5cbmxldCBFTkFCTEVEID0gZmFsc2U7XG5sZXQgSU5ERU5UID0gMDtcblxuZXhwb3J0IGZ1bmN0aW9uIGVuYWJsZVRyYWNpbmcoZW5hYmxlZDogYm9vbGVhbikge1xuICBFTkFCTEVEID0gZW5hYmxlZDtcbn1cblxuLyoqXG4gKiBNZXRob2QgZGVjb3JhdG9yIHRvIHRyYWNlIGEgc2luZ2xlIHN0YXRpYyBvciBtZW1iZXIgbWV0aG9kLCBhbnkgdGltZSBpdCdzIGNhbGxlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gdHJhY2VDYWxsKHJlY2VpdmVyOiBvYmplY3QsIF9wcm9wZXJ0eUtleTogc3RyaW5nLCBkZXNjcmlwdG9yOiBQcm9wZXJ0eURlc2NyaXB0b3IsIHBhcmVudENsYXNzTmFtZT86IHN0cmluZykge1xuICBjb25zdCBmbiA9IGRlc2NyaXB0b3IudmFsdWU7XG4gIGNvbnN0IGNsYXNzTmFtZSA9IHR5cGVvZiByZWNlaXZlciA9PT0gJ2Z1bmN0aW9uJyA/IHJlY2VpdmVyLm5hbWUgOiBwYXJlbnRDbGFzc05hbWU7XG5cbiAgZGVzY3JpcHRvci52YWx1ZSA9IGZ1bmN0aW9uICguLi5hcmdzOiBhbnlbXSkge1xuICAgIGlmICghRU5BQkxFRCkgeyByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJncyk7IH1cblxuICAgIGRlYnVnKGBbdHJhY2VdICR7JyAnLnJlcGVhdChJTkRFTlQpfSR7Y2xhc3NOYW1lIHx8IHRoaXMuY29uc3RydWN0b3IubmFtZSB8fCAnKGFub255bW91cyknfSMke2ZuLm5hbWV9KClgKTtcbiAgICBJTkRFTlQgKz0gMjtcblxuICAgIGNvbnN0IHJldCA9IGZuLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgIGlmIChyZXQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICByZXR1cm4gcmV0LmZpbmFsbHkoKCkgPT4ge1xuICAgICAgICBJTkRFTlQgLT0gMjtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBJTkRFTlQgLT0gMjtcbiAgICAgIHJldHVybiByZXQ7XG4gICAgfVxuICB9O1xuICByZXR1cm4gZGVzY3JpcHRvcjtcbn1cblxuLyoqXG4gKiBDbGFzcyBkZWNvcmF0b3IsIGVuYWJsZSB0cmFjaW5nIGZvciBhbGwgbWV0aG9kcyBvbiB0aGlzIGNsYXNzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmFjZU1ldGhvZHMoY29uc3RydWN0b3I6IEZ1bmN0aW9uKSB7XG4gIC8vIFN0YXRpY3NcbiAgZm9yIChjb25zdCBbbmFtZSwgZGVzY3JpcHRvcl0gb2YgT2JqZWN0LmVudHJpZXMoT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoY29uc3RydWN0b3IpKSkge1xuICAgIGlmICh0eXBlb2YgZGVzY3JpcHRvci52YWx1ZSAhPT0gJ2Z1bmN0aW9uJykgeyBjb250aW51ZTsgfVxuICAgIGNvbnN0IG5ld0Rlc2NyaXB0b3IgPSB0cmFjZUNhbGwoY29uc3RydWN0b3IsIG5hbWUsIGRlc2NyaXB0b3IsIGNvbnN0cnVjdG9yLm5hbWUpID8/IGRlc2NyaXB0b3I7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvbnN0cnVjdG9yLCBuYW1lLCBuZXdEZXNjcmlwdG9yKTtcbiAgfVxuXG4gIC8vIEluc3RhbmNuZSBtZW1iZXJzXG4gIGZvciAoY29uc3QgW25hbWUsIGRlc2NyaXB0b3JdIG9mIE9iamVjdC5lbnRyaWVzKE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKGNvbnN0cnVjdG9yLnByb3RvdHlwZSkpKSB7XG4gICAgaWYgKHR5cGVvZiBkZXNjcmlwdG9yLnZhbHVlICE9PSAnZnVuY3Rpb24nKSB7IGNvbnRpbnVlOyB9XG4gICAgY29uc3QgbmV3RGVzY3JpcHRvciA9IHRyYWNlQ2FsbChjb25zdHJ1Y3Rvci5wcm90b3R5cGUsIG5hbWUsIGRlc2NyaXB0b3IsIGNvbnN0cnVjdG9yLm5hbWUpID8/IGRlc2NyaXB0b3I7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvbnN0cnVjdG9yLnByb3RvdHlwZSwgbmFtZSwgbmV3RGVzY3JpcHRvcik7XG4gIH1cbn1cbiJdfQ==
|