serverless-spy 0.0.33 → 0.0.34

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/.jsii +9 -9
  2. package/common/publishSpyEvent.ts +269 -0
  3. package/dist/releasetag.txt +1 -1
  4. package/extension/interceptor.ts +24 -13
  5. package/functions/onConnect.ts +2 -1
  6. package/functions/onDisconnect.ts +2 -1
  7. package/functions/sendMessage.ts +3 -268
  8. package/lib/common/publishSpyEvent.d.ts +4 -0
  9. package/lib/common/publishSpyEvent.js +211 -0
  10. package/lib/common/publishSpyEvent.mjs +205 -0
  11. package/lib/extension/dist/layer/nodejs/node_modules/interceptor.js +13890 -13
  12. package/lib/extension/dist/layer/nodejs/node_modules/interceptor.js.map +4 -4
  13. package/lib/listener/{SpyListener.d.ts → ServerlessSpyListener.d.ts} +12 -12
  14. package/lib/listener/ServerlessSpyListener.js +3 -0
  15. package/lib/listener/ServerlessSpyListener.mjs +2 -0
  16. package/lib/listener/ServerlessSpyListenerParams.d.ts +5 -0
  17. package/lib/listener/ServerlessSpyListenerParams.js +3 -0
  18. package/lib/listener/ServerlessSpyListenerParams.mjs +2 -0
  19. package/lib/listener/SpyHandlers.ts.d.ts +1 -1
  20. package/lib/listener/SpyHandlers.ts.js +1 -1
  21. package/lib/listener/SpyHandlers.ts.mjs +1 -1
  22. package/lib/listener/WaitForParams.d.ts +5 -0
  23. package/lib/listener/WaitForParams.js +3 -0
  24. package/lib/listener/WaitForParams.mjs +2 -0
  25. package/lib/listener/WsListener.d.ts +38 -0
  26. package/lib/listener/WsListener.js +185 -0
  27. package/lib/listener/WsListener.mjs +181 -0
  28. package/lib/listener/createServerlessSpyListener.d.ts +2 -13
  29. package/lib/listener/createServerlessSpyListener.js +5 -163
  30. package/lib/listener/createServerlessSpyListener.mjs +5 -163
  31. package/lib/listener/index.d.ts +1 -1
  32. package/lib/listener/index.js +2 -2
  33. package/lib/listener/index.mjs +2 -2
  34. package/lib/src/ServerlessSpy.d.ts +16 -8
  35. package/lib/src/ServerlessSpy.js +94 -53
  36. package/lib/src/ServerlessSpy.mjs +93 -52
  37. package/lib/src/common/envVariableNames.d.ts +8 -0
  38. package/lib/src/common/envVariableNames.js +15 -0
  39. package/lib/src/common/envVariableNames.mjs +12 -0
  40. package/listener/{SpyListener.ts → ServerlessSpyListener.ts} +12 -13
  41. package/listener/ServerlessSpyListenerParams.ts +6 -0
  42. package/listener/SpyHandlers.ts.ts +1 -1
  43. package/listener/WaitForParams.ts +6 -0
  44. package/listener/WsListener.ts +273 -0
  45. package/listener/createServerlessSpyListener.ts +5 -265
  46. package/listener/index.ts +1 -1
  47. package/package.json +1 -1
  48. package/lib/listener/SpyListener.js +0 -3
  49. package/lib/listener/SpyListener.mjs +0 -2
@@ -15,37 +15,21 @@ import * as sns from 'aws-cdk-lib/aws-sns';
15
15
  import * as snsSubs from 'aws-cdk-lib/aws-sns-subscriptions';
16
16
  import * as sqs from 'aws-cdk-lib/aws-sqs';
17
17
  import { Construct } from 'constructs';
18
+ import { envVariableNames } from './common/envVariableNames';
18
19
  export class ServerlessSpy extends Construct {
19
20
  constructor(scope, id, props) {
20
21
  super(scope, id);
21
22
  this.ownContructs = [];
22
23
  this.functionSubscriptionPool = [];
24
+ this.functionsSpied = [];
23
25
  this.serviceKeys = [];
24
- let extensionAssetLocation = path.join(__dirname, '../extension/dist/layer');
25
- const extensionAssetLocationAlt = path.join(__dirname, '../lib/extension/dist/layer');
26
- if (!fs.existsSync(extensionAssetLocation)) {
27
- if (!fs.existsSync(extensionAssetLocationAlt)) {
28
- throw new Error(`Folder with assets for extension does not exists at ${extensionAssetLocation} or at ${extensionAssetLocationAlt} `);
29
- }
30
- else {
31
- extensionAssetLocation = extensionAssetLocationAlt;
32
- }
33
- }
34
- const extensionAssetLocationWraper = path.join(extensionAssetLocation, 'spy-wrapper');
35
- if (!fs.existsSync(extensionAssetLocationWraper)) {
36
- throw new Error(`Wraper script for extension does not exists ${extensionAssetLocation}`);
37
- }
38
- const extensionAssetLocationCode = path.join(extensionAssetLocation, 'nodejs/node_modules/interceptor.js');
39
- if (!fs.existsSync(extensionAssetLocationCode)) {
40
- throw new Error(`Code for extension does not exists ${extensionAssetLocationCode}`);
41
- }
42
26
  this.extensionLayer = new lambda.LayerVersion(this, 'Extension', {
43
27
  compatibleRuntimes: [
44
28
  lambda.Runtime.NODEJS_12_X,
45
29
  lambda.Runtime.NODEJS_14_X,
46
30
  lambda.Runtime.NODEJS_16_X,
47
31
  ],
48
- code: lambda.Code.fromAsset(extensionAssetLocation),
32
+ code: lambda.Code.fromAsset(this.getExtensionAssetLocation()),
49
33
  });
50
34
  this.ownContructs.push(this.extensionLayer);
51
35
  this.table = new dynamoDb.Table(this, 'WebSocket', {
@@ -63,7 +47,8 @@ export class ServerlessSpy extends Construct {
63
47
  handler: 'handler',
64
48
  entry: getAssetLocation('functions/onConnect.ts'),
65
49
  environment: {
66
- TABLE_NAME: this.table.tableName,
50
+ [envVariableNames.TABLE_NAME]: this.table.tableName,
51
+ NODE_OPTIONS: '--enable-source-maps',
67
52
  },
68
53
  });
69
54
  this.table.grantWriteData(functionOnConnect);
@@ -75,7 +60,8 @@ export class ServerlessSpy extends Construct {
75
60
  handler: 'handler',
76
61
  entry: getAssetLocation('functions/onDisconnect.ts'),
77
62
  environment: {
78
- TABLE_NAME: this.table.tableName,
63
+ [envVariableNames.TABLE_NAME]: this.table.tableName,
64
+ NODE_OPTIONS: '--enable-source-maps',
79
65
  },
80
66
  });
81
67
  this.table.grantWriteData(functionOnDisconnect);
@@ -101,20 +87,46 @@ export class ServerlessSpy extends Construct {
101
87
  integration: new apiGwV2Int.WebSocketLambdaIntegration('SendMessage', this.functionSubscriptionMain.function),
102
88
  });
103
89
  this.iterateAllElements(Stack.of(this));
90
+ //set mapping property for all functions we created
104
91
  for (const func of this.functionSubscriptionPool) {
105
- func.function.addEnvironment('INFRA_MAPPING', JSON.stringify(func.mapping));
92
+ func.function.addEnvironment(envVariableNames.INFRA_MAPPING, JSON.stringify(func.mapping));
93
+ }
94
+ for (const func of this.functionsSpied) {
95
+ func.function.addEnvironment(envVariableNames.INFRA_MAPPING, JSON.stringify(func.mapping));
106
96
  }
107
97
  this.wsUrl = `wss://${this.webSocketApi.apiId}.execute-api.${Stack.of(this).region}.amazonaws.com/${this.webSocketStage.stageName}`;
108
98
  new CfnOutput(Stack.of(this), 'ServerlessSpyWsUrl', {
109
99
  value: this.wsUrl,
110
100
  });
111
- // new CfnOutput(this, "API_URL", {
112
- // value: this.wsUrl,
113
- // });
114
101
  if (props?.generateSpyEventsFileLocation) {
115
102
  this.writeSpyEventsClass(props?.generateSpyEventsFileLocation);
116
103
  }
117
104
  }
105
+ getExtensionAssetLocation() {
106
+ let extensionAssetLocation = path.join(__dirname, '../extension/dist/layer');
107
+ const extensionAssetLocationAlt = path.join(__dirname, '../lib/extension/dist/layer');
108
+ if (!fs.existsSync(extensionAssetLocation)) {
109
+ if (!fs.existsSync(extensionAssetLocationAlt)) {
110
+ throw new Error(`Folder with assets for extension does not exists at ${extensionAssetLocation} or at ${extensionAssetLocationAlt} `);
111
+ }
112
+ else {
113
+ extensionAssetLocation = extensionAssetLocationAlt;
114
+ }
115
+ }
116
+ const extensionAssetLocationWraper = path.join(extensionAssetLocation, 'spy-wrapper');
117
+ if (!fs.existsSync(extensionAssetLocationWraper)) {
118
+ throw new Error(`Wraper script for extension does not exists ${extensionAssetLocation}`);
119
+ }
120
+ const extensionAssetLocationCode = path.join(extensionAssetLocation, 'nodejs/node_modules/interceptor.js');
121
+ if (!fs.existsSync(extensionAssetLocationCode)) {
122
+ throw new Error(`Code for extension does not exists ${extensionAssetLocationCode}`);
123
+ }
124
+ return extensionAssetLocation;
125
+ }
126
+ /**
127
+ * Write SpyEvents class, which helps with writing the code for tests.
128
+ * @param fileLocation
129
+ */
118
130
  writeSpyEventsClass(fileLocation) {
119
131
  fs.mkdirSync(path.dirname(fileLocation), { recursive: true });
120
132
  const properties = this.serviceKeys
@@ -132,37 +144,34 @@ export class ServerlessSpy extends Construct {
132
144
  continue;
133
145
  }
134
146
  if (node instanceof lambda.Function) {
135
- this.interceptFunction(node);
147
+ this.spyFunction(node);
136
148
  }
137
149
  else if (node instanceof sns.Topic) {
138
150
  console.log('interceptSnsTopic');
139
- this.interceptSnsTopic(node);
151
+ this.spySnsTopic(node);
140
152
  }
141
153
  else if (node instanceof sns.Subscription) {
142
- this.interceptSnsSubscription(node);
154
+ this.spySnsSubscription(node);
143
155
  }
144
156
  else if (node instanceof s3.Bucket) {
145
- this.interceptS3(node);
157
+ this.spyS3(node);
146
158
  }
147
159
  else if (node instanceof dynamoDb.Table) {
148
- this.interceptDynamodb(node);
160
+ this.spyDynamodb(node);
149
161
  }
150
162
  else if (node instanceof events.EventBus) {
151
- this.interceptEventBus(node);
163
+ this.spyEventBus(node);
152
164
  }
153
165
  else if (node instanceof events.Rule) {
154
- this.interceptEventBusRule(node);
166
+ this.spyEventBusRule(node);
155
167
  }
156
168
  else if (node instanceof lambda.CfnEventSourceMapping) {
157
- this.interceptSqs(node);
158
- }
159
- else {
160
- // console.log('NO MATCH', node);
169
+ this.spySqs(node);
161
170
  }
162
171
  this.iterateAllElements(node);
163
172
  }
164
173
  }
165
- interceptSqs(node) {
174
+ spySqs(node) {
166
175
  const queue = this.findElement((n) => n instanceof sqs.Queue &&
167
176
  n.queueArn === node.eventSourceArn);
168
177
  const func = this.findElement((n) => n instanceof lambda.Function &&
@@ -170,9 +179,14 @@ export class ServerlessSpy extends Construct {
170
179
  if (queue && func) {
171
180
  const queueName = this.getConstructName(queue);
172
181
  const serviceKey = `Sqs#${queueName}`;
173
- this.functionSubscriptionMain.mapping[queue.queueArn] = serviceKey;
182
+ //this.functionSubscriptionMain.mapping[queue.queueArn] = serviceKey;
183
+ func.addEnvironment(envVariableNames.INFRA_MAPPING, JSON.stringify({}));
184
+ this.addMappingToFunction(func, {
185
+ key: queue.queueArn,
186
+ value: serviceKey,
187
+ });
174
188
  this.serviceKeys.push(serviceKey);
175
- func.addEnvironment('FLUENT_TEST_SUBSCRIBED_TO_SQS', 'true');
189
+ func.addEnvironment(envVariableNames.FLUENT_TEST_SUBSCRIBED_TO_SQS, 'true');
176
190
  }
177
191
  }
178
192
  createFunctionForSubscription(index) {
@@ -183,23 +197,27 @@ export class ServerlessSpy extends Construct {
183
197
  handler: 'handler',
184
198
  entry: getAssetLocation('functions/sendMessage.ts'),
185
199
  environment: {
186
- TABLE_NAME: this.table.tableName,
200
+ [envVariableNames.TABLE_NAME]: this.table.tableName,
201
+ NODE_OPTIONS: '--enable-source-maps',
187
202
  },
188
203
  });
189
204
  this.table.grantWriteData(func);
190
205
  this.table.grantReadData(func);
191
- func.addEnvironment('WS_ENDPOINT', `https://${this.webSocketApi.apiId}.execute-api.${Stack.of(this).region}.amazonaws.com/${this.webSocketStage.stageName}`);
206
+ func.addEnvironment(envVariableNames.WS_ENDPOINT, this.getWsEndpoint());
192
207
  this.webSocketApi.grantManageConnections(func);
193
208
  return func;
194
209
  }
195
- interceptS3(s3Bucket) {
210
+ getWsEndpoint() {
211
+ return `https://${this.webSocketApi.apiId}.execute-api.${Stack.of(this).region}.amazonaws.com/${this.webSocketStage.stageName}`;
212
+ }
213
+ spyS3(s3Bucket) {
196
214
  s3Bucket.addEventNotification(s3.EventType.OBJECT_CREATED_PUT, new s3notif.LambdaDestination(this.functionSubscriptionMain.function));
197
215
  const name = this.getConstructName(s3Bucket);
198
216
  const serviceKey = `S3#${name}`;
199
217
  this.functionSubscriptionMain.mapping[s3Bucket.bucketArn] = serviceKey;
200
218
  this.serviceKeys.push(serviceKey);
201
219
  }
202
- interceptDynamodb(table) {
220
+ spyDynamodb(table) {
203
221
  // enable DynamoDB streams with a hack
204
222
  table.node.defaultChild.streamSpecification = {
205
223
  streamViewType: dynamoDb.StreamViewType.NEW_AND_OLD_IMAGES,
@@ -215,7 +233,7 @@ export class ServerlessSpy extends Construct {
215
233
  this.functionSubscriptionMain.mapping[table.tableArn] = serviceKey;
216
234
  this.serviceKeys.push(serviceKey);
217
235
  }
218
- interceptEventBusRule(rule) {
236
+ spyEventBusRule(rule) {
219
237
  const { eventBusName } = rule.node.defaultChild;
220
238
  const eventBridge = this.getEventBridge(rule.node.defaultChild.eventBusName);
221
239
  if (!eventBridge) {
@@ -230,7 +248,7 @@ export class ServerlessSpy extends Construct {
230
248
  functionSubscription.mapping.eventBridge = serviceKey;
231
249
  this.serviceKeys.push(serviceKey);
232
250
  }
233
- interceptEventBus(eventBus) {
251
+ spyEventBus(eventBus) {
234
252
  const functionSubscription = this.provideFunctionForSubscription((s) => !s.usedForEventBridge);
235
253
  functionSubscription.usedForEventBridge = true;
236
254
  const bridgeName = this.getConstructName(eventBus);
@@ -244,7 +262,7 @@ export class ServerlessSpy extends Construct {
244
262
  functionSubscription.mapping.eventBridge = serviceKey;
245
263
  this.serviceKeys.push(serviceKey);
246
264
  }
247
- interceptSnsTopic(topic) {
265
+ spySnsTopic(topic) {
248
266
  const functionSubscription = this.provideFunctionForSubscription((s) => !s.subsribedTopics.includes(topic));
249
267
  topic.addSubscription(new snsSubs.LambdaSubscription(functionSubscription.function));
250
268
  const topicName = this.getConstructName(topic);
@@ -253,7 +271,7 @@ export class ServerlessSpy extends Construct {
253
271
  this.serviceKeys.push(serviceKey);
254
272
  functionSubscription.subsribedTopics.push(topic);
255
273
  }
256
- interceptSnsSubscription(subscription) {
274
+ spySnsSubscription(subscription) {
257
275
  if (!subscription.node.scope) {
258
276
  return;
259
277
  }
@@ -294,17 +312,22 @@ export class ServerlessSpy extends Construct {
294
312
  }
295
313
  return functionSubscription;
296
314
  }
297
- interceptFunction(func) {
315
+ spyFunction(func) {
298
316
  func.addLayers(this.extensionLayer);
299
- this.functionSubscriptionMain.function.grantInvoke(func);
300
317
  const functionName = this.getConstructName(func);
301
- func.addEnvironment('FUNCTION_NAME', functionName);
318
+ func.addEnvironment(envVariableNames.FUNCTION_NAME, functionName);
302
319
  func.addEnvironment('AWS_LAMBDA_EXEC_WRAPPER', '/opt/spy-wrapper');
303
- func.addEnvironment('FLUENT_TEST_SEND_FUNCTION_NAME', this.functionSubscriptionMain.function.functionName);
320
+ func.addEnvironment(envVariableNames.FLUENT_TEST_SEND_FUNCTION_NAME, this.functionSubscriptionMain.function.functionName);
321
+ func.addEnvironment(envVariableNames.TABLE_NAME, this.table.tableName);
322
+ func.addEnvironment(envVariableNames.WS_ENDPOINT, this.getWsEndpoint());
323
+ this.table.grantWriteData(func);
324
+ this.table.grantReadData(func);
325
+ this.webSocketApi.grantManageConnections(func);
304
326
  this.serviceKeys.push(`Function#${functionName}#Request`);
305
327
  this.serviceKeys.push(`Function#${functionName}#Error`);
306
328
  this.serviceKeys.push(`Function#${functionName}#Console`);
307
329
  this.serviceKeys.push(`Function#${functionName}#Response`);
330
+ this.addMappingToFunction(func);
308
331
  }
309
332
  getConstructName(construct) {
310
333
  let functionName = construct.node.path;
@@ -335,6 +358,24 @@ export class ServerlessSpy extends Construct {
335
358
  }
336
359
  return undefined;
337
360
  }
361
+ addMappingToFunction(func, keyValue) {
362
+ for (const fs of this.functionsSpied) {
363
+ if (fs.function === func) {
364
+ if (keyValue) {
365
+ fs.mapping[keyValue.key] = keyValue.value;
366
+ }
367
+ return;
368
+ }
369
+ }
370
+ const fs = {
371
+ function: func,
372
+ mapping: {},
373
+ };
374
+ if (keyValue) {
375
+ fs.mapping[keyValue.key] = keyValue.value;
376
+ }
377
+ this.functionsSpied.push(fs);
378
+ }
338
379
  }
339
380
  function getAssetLocation(location) {
340
381
  const loc = path.join(__dirname, '../' + location);
@@ -347,4 +388,4 @@ function getAssetLocation(location) {
347
388
  }
348
389
  throw new Error(`Location ${loc} and ${loc2} does not exists.`);
349
390
  }
350
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2VydmVybGVzc1NweS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9TZXJ2ZXJsZXNzU3B5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQ3pCLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBQzdCLE9BQU8sS0FBSyxPQUFPLE1BQU0saUNBQWlDLENBQUM7QUFDM0QsT0FBTyxLQUFLLFVBQVUsTUFBTSw4Q0FBOEMsQ0FBQztBQUMzRSxPQUFPLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFekQsT0FBTyxLQUFLLFFBQVEsTUFBTSwwQkFBMEIsQ0FBQztBQUNyRCxPQUFPLEtBQUssTUFBTSxNQUFNLHdCQUF3QixDQUFDO0FBQ2pELE9BQU8sS0FBSyxPQUFPLE1BQU0sZ0NBQWdDLENBQUM7QUFDMUQsT0FBTyxLQUFLLE1BQU0sTUFBTSx3QkFBd0IsQ0FBQztBQUNqRCxPQUFPLEtBQUssY0FBYyxNQUFNLHNDQUFzQyxDQUFDO0FBQ3ZFLE9BQU8sS0FBSyxVQUFVLE1BQU0sK0JBQStCLENBQUM7QUFDNUQsT0FBTyxLQUFLLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUN6QyxPQUFPLEtBQUssT0FBTyxNQUFNLGtDQUFrQyxDQUFDO0FBQzVELE9BQU8sS0FBSyxHQUFHLE1BQU0scUJBQXFCLENBQUM7QUFDM0MsT0FBTyxLQUFLLE9BQU8sTUFBTSxtQ0FBbUMsQ0FBQztBQUM3RCxPQUFPLEtBQUssR0FBRyxNQUFNLHFCQUFxQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxTQUFTLEVBQWMsTUFBTSxZQUFZLENBQUM7QUFNbkQsTUFBTSxPQUFPLGFBQWMsU0FBUSxTQUFTO0lBbUIxQyxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQTBCO1FBQ2xFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFi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RTtZQUN2QyxJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDcEIsT0FBTyxJQUFTLENBQUM7YUFDbEI7WUFDRCxJQUFJLENBQUMsV0FBVyxDQUFJLFVBQVUsRUFBRSxJQUFJLENBQUMsQ0FBQztTQUN2QztRQUVELE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7Q0FDRjtBQVNELFNBQVMsZ0JBQWdCLENBQUMsUUFBZ0I7SUFDeEMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsS0FBSyxHQUFHLFFBQVEsQ0FBQyxDQUFDO0lBRW5ELElBQUksRUFBRSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsRUFBRTtRQUN0QixPQUFPLEdBQUcsQ0FBQztLQUNaO0lBRUQsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsUUFBUSxHQUFHLFFBQVEsQ0FBQyxDQUFDO0lBRXZELElBQUksRUFBRSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRTtRQUN2QixPQUFPLElBQUksQ0FBQztLQUNiO0lBRUQsTUFBTSxJQUFJLEtBQUssQ0FBQyxZQUFZLEdBQUcsUUFBUSxJQUFJLG1CQUFtQixDQUFDLENBQUM7QUFDbEUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgKiBhcyBhcGlHd1YyIGZyb20gJ0Bhd3MtY2RrL2F3cy1hcGlnYXRld2F5djItYWxwaGEnO1xuaW1wb3J0ICogYXMgYXBpR3dWMkludCBmcm9tICdAYXdzLWNkay9hd3MtYXBpZ2F0ZXdheXYyLWludGVncmF0aW9ucy1hbHBoYSc7XG5pbXBvcnQgeyBDZm5PdXRwdXQsIER1cmF0aW9uLCBTdGFjayB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCAqIGFzIGFndyBmcm9tICdhd3MtY2RrLWxpYi9hd3MtYXBpZ2F0ZXdheXYyJztcbmltcG9ydCAqIGFzIGR5bmFtb0RiIGZyb20gJ2F3cy1jZGstbGliL2F3cy1keW5hbW9kYic7XG5pbXBvcnQgKiBhcyBldmVudHMgZnJvbSAnYXdzLWNkay1saWIvYXdzLWV2ZW50cyc7XG5pbXBvcnQgKiBhcyB0YXJnZXRzIGZyb20gJ2F3cy1jZGstbGliL2F3cy1ldmVudHMtdGFyZ2V0cyc7XG5pbXBvcnQgKiBhcyBsYW1iZGEgZnJvbSAnYXdzLWNkay1saWIvYXdzLWxhbWJkYSc7XG5pbXBvcnQgKiBhcyBkeW5hbW9EYlN0cmVhbSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtbGFtYmRhLWV2ZW50LXNvdXJjZXMnO1xuaW1wb3J0ICogYXMgbGFtYmRhTm9kZSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtbGFtYmRhLW5vZGVqcyc7XG5pbXBvcnQgKiBhcyBzMyBmcm9tICdhd3MtY2RrLWxpYi9hd3MtczMnO1xuaW1wb3J0ICogYXMgczNub3RpZiBmcm9tICdhd3MtY2RrLWxpYi9hd3MtczMtbm90aWZpY2F0aW9ucyc7XG5pbXBvcnQgKiBhcyBzbnMgZnJvbSAnYXdzLWNkay1saWIvYXdzLXNucyc7XG5pbXBvcnQgKiBhcyBzbnNTdWJzIGZyb20gJ2F3cy1jZGstbGliL2F3cy1zbnMtc3Vic2NyaXB0aW9ucyc7XG5pbXBvcnQgKiBhcyBzcXMgZnJvbSAnYXdzLWNkay1saWIvYXdzLXNxcyc7XG5pbXBvcnQgeyBDb25zdHJ1Y3QsIElDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcblxuZXhwb3J0IGludGVyZmFjZSBTZXJ2ZXJsZXNzU3B5UHJvcHMge1xuICByZWFkb25seSBnZW5lcmF0ZVNweUV2ZW50c0ZpbGVMb2NhdGlvbj86IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIFNlcnZlcmxlc3NTcHkgZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICBwcml2YXRlIGV4dGVuc2lvbkxheWVyOiBsYW1iZGEuTGF5ZXJWZXJzaW9uO1xuXG4gIHByaXZhdGUgdGFibGU6IGR5bmFtb0RiLlRhYmxlO1xuXG4gIHByaXZhdGUgd2ViU29ja2V0QXBpOiBhcGlHd1YyLldlYlNvY2tldEFwaTtcblxuICBwcml2YXRlIG93bkNvbnRydWN0czogSUNvbnN0cnVjdFtdID0gW107XG5cbiAgcHJpdmF0ZSBmdW5jdGlvblN1YnNjcmlwdGlvblBvb2w6IEZ1bmN0aW9uU3Vic2NyaXB0aW9uW10gPSBbXTtcblxuICBwcml2YXRlIGZ1bmN0aW9uU3Vic2NyaXB0aW9uTWFpbjogRnVuY3Rpb25TdWJzY3JpcHRpb247XG5cbiAgcHJpdmF0ZSB3ZWJTb2NrZXRTdGFnZTogYXBpR3dWMi5XZWJTb2NrZXRTdGFnZTtcblxuICBwdWJsaWMgc2VydmljZUtleXM6IHN0cmluZ1tdID0gW107XG5cbiAgd3NVcmw6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wcz86IFNlcnZlcmxlc3NTcHlQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICBsZXQgZXh0ZW5zaW9uQXNzZXRMb2NhdGlvbiA9IHBhdGguam9pbihcbiAgICAgIF9fZGlybmFtZSxcbiAgICAgICcuLi9leHRlbnNpb24vZGlzdC9sYXllcidcbiAgICApO1xuXG4gICAgY29uc3QgZXh0ZW5zaW9uQXNzZXRMb2NhdGlvbkFsdCA9IHBhdGguam9pbihcbiAgICAgIF9fZGlybmFtZSxcbiAgICAgICcuLi9saWIvZXh0ZW5zaW9uL2Rpc3QvbGF5ZXInXG4gICAgKTtcblxuICAgIGlmICghZnMuZXhpc3RzU3luYyhleHRlbnNpb25Bc3NldExvY2F0aW9uKSkge1xuICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKGV4dGVuc2lvbkFzc2V0TG9jYXRpb25BbHQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgRm9sZGVyIHdpdGggYXNzZXRzIGZvciBleHRlbnNpb24gZG9lcyBub3QgZXhpc3RzIGF0ICR7ZXh0ZW5zaW9uQXNzZXRMb2NhdGlvbn0gb3IgYXQgJHtleHRlbnNpb25Bc3NldExvY2F0aW9uQWx0fSBgXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBleHRlbnNpb25Bc3NldExvY2F0aW9uID0gZXh0ZW5zaW9uQXNzZXRMb2NhdGlvbkFsdDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBleHRlbnNpb25Bc3NldExvY2F0aW9uV3JhcGVyID0gcGF0aC5qb2luKFxuICAgICAgZXh0ZW5zaW9uQXNzZXRMb2NhdGlvbixcbiAgICAgICdzcHktd3JhcHBlcidcbiAgICApO1xuICAgIGlmICghZnMuZXhpc3RzU3luYyhleHRlbnNpb25Bc3NldExvY2F0aW9uV3JhcGVyKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgV3JhcGVyIHNjcmlwdCBmb3IgZXh0ZW5zaW9uIGRvZXMgbm90IGV4aXN0cyAke2V4dGVuc2lvbkFzc2V0TG9jYXRpb259YFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBleHRlbnNpb25Bc3NldExvY2F0aW9uQ29kZSA9IHBhdGguam9pbihcbiAgICAgIGV4dGVuc2lvbkFzc2V0TG9jYXRpb24sXG4gICAgICAnbm9kZWpzL25vZGVfbW9kdWxlcy9pbnRlcmNlcHRvci5qcydcbiAgICApO1xuICAgIGlmICghZnMuZXhpc3RzU3luYyhleHRlbnNpb25Bc3NldExvY2F0aW9uQ29kZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYENvZGUgZm9yIGV4dGVuc2lvbiBkb2VzIG5vdCBleGlzdHMgJHtleHRlbnNpb25Bc3NldExvY2F0aW9uQ29kZX1gXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMuZXh0ZW5zaW9uTGF5ZXIgPSBuZXcgbGFtYmRhLkxheWVyVmVyc2lvbih0aGlzLCAnRXh0ZW5zaW9uJywge1xuICAgICAgY29tcGF0aWJsZVJ1bnRpbWVzOiBbXG4gICAgICAgIGxhbWJkYS5SdW50aW1lLk5PREVKU18xMl9YLFxuICAgICAgICBsYW1iZGEuUnVudGltZS5OT0RFSlNfMTRfWCxcbiAgICAgICAgbGFtYmRhLlJ1bnRpbWUuTk9ERUpTXzE2X1gsXG4gICAgICBdLFxuICAgICAgY29kZTogbGFtYmRhLkNvZGUuZnJvbUFzc2V0KGV4dGVuc2lvbkFzc2V0TG9jYXRpb24pLFxuICAgIH0pO1xuICAgIHRoaXMub3duQ29udHJ1Y3RzLnB1c2godGhpcy5leHRlbnNpb25MYXllcik7XG5cbiAgICB0aGlzLnRhYmxlID0gbmV3IGR5bmFtb0RiLlRhYmxlKHRoaXMsICdXZWJTb2NrZXQnLCB7XG4gICAgICBwYXJ0aXRpb25LZXk6IHtcbiAgICAgICAgbmFtZTogJ2Nvbm5lY3Rpb25JZCcsXG4gICAgICAgIHR5cGU6IGR5bmFtb0RiLkF0dHJpYnV0ZVR5cGUuU1RSSU5HLFxuICAgICAgfSxcbiAgICAgIGJpbGxpbmdNb2RlOiBkeW5hbW9EYi5CaWxsaW5nTW9kZS5QQVlfUEVSX1JFUVVFU1QsXG4gICAgfSk7XG4gICAgdGhpcy5vd25Db250cnVjdHMucHVzaCh0aGlzLnRhYmxlKTtcblxuICAgIGNvbnN0IGZ1bmN0aW9uT25Db25uZWN0ID0gbmV3IGxhbWJkYU5vZGUuTm9kZWpzRnVuY3Rpb24odGhpcywgJ09uQ29ubmVjdCcsIHtcbiAgICAgIG1lbW9yeVNpemU6IDUxMixcbiAgICAgIHRpbWVvdXQ6IER1cmF0aW9uLnNlY29uZHMoNSksXG4gICAgICBydW50aW1lOiBsYW1iZGEuUnVudGltZS5OT0RFSlNfMTZfWCxcbiAgICAgIGhhbmRsZXI6ICdoYW5kbGVyJyxcbiAgICAgIGVudHJ5OiBnZXRBc3NldExvY2F0aW9uKCdmdW5jdGlvbnMvb25Db25uZWN0LnRzJyksXG4gICAgICBlbnZpcm9ubWVudDoge1xuICAgICAgICBUQUJMRV9OQU1FOiB0aGlzLnRhYmxlLnRhYmxlTmFtZSxcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgdGhpcy50YWJsZS5ncmFudFdyaXRlRGF0YShmdW5jdGlvbk9uQ29ubmVjdCk7XG4gICAgdGhpcy5vd25Db250cnVjdHMucHVzaChmdW5jdGlvbk9uQ29ubmVjdCk7XG5cbiAgICBjb25zdCBmdW5jdGlvbk9uRGlzY29ubmVjdCA9IG5ldyBsYW1iZGFOb2RlLk5vZGVqc0Z1bmN0aW9uKFxuICAgICAgdGhpcyxcbiAgICAgICdPbkRpc2Nvbm5lY3QnLFxuICAgICAge1xuICAgICAgICBtZW1vcnlTaXplOiA1MTIsXG4gICAgICAgIHRpbWVvdXQ6IER1cmF0aW9uLnNlY29uZHMoNSksXG4gICAgICAgIHJ1bnRpbWU6IGxhbWJkYS5SdW50aW1lLk5PREVKU18xNl9YLFxuICAgICAgICBoYW5kbGVyOiAnaGFuZGxlcicsXG4gICAgICAgIGVudHJ5OiBnZXRBc3NldExvY2F0aW9uKCdmdW5jdGlvbnMvb25EaXNjb25uZWN0LnRzJyksXG4gICAgICAgIGVudmlyb25tZW50OiB7XG4gICAgICAgICAgVEFCTEVfTkFNRTogdGhpcy50YWJsZS50YWJsZU5hbWUsXG4gICAgICAgIH0sXG4gICAgICB9XG4gICAgKTtcbiAgICB0aGlzLnRhYmxlLmdyYW50V3JpdGVEYXRhKGZ1bmN0aW9uT25EaXNjb25uZWN0KTtcbiAgICB0aGlzLm93bkNvbnRydWN0cy5wdXNoKGZ1bmN0aW9uT25EaXNjb25uZWN0KTtcblxuICAgIHRoaXMud2ViU29ja2V0QXBpID0gbmV3IGFwaUd3VjIuV2ViU29ja2V0QXBpKHRoaXMsICdBcGlHd1dlYlNvY2tldCcpO1xuICAgIHRoaXMub3duQ29udHJ1Y3RzLnB1c2godGhpcy53ZWJTb2NrZXRBcGkpO1xuICAgIHRoaXMud2ViU29ja2V0U3RhZ2UgPSBuZXcgYXBpR3dWMi5XZWJTb2NrZXRTdGFnZShcbiAgICAgIHRoaXMsXG4gICAgICAnQXBpR3dXZWJTb2NrZXRTdGFnZScsXG4gICAgICB7XG4gICAgICAgIHdlYlNvY2tldEFwaTogdGhpcy53ZWJTb2NrZXRBcGksXG4gICAgICAgIHN0YWdlTmFtZTogJ3Byb2QnLFxuICAgICAgICBhdXRvRGVwbG95OiB0cnVlLFxuICAgICAgfVxuICAgICk7XG4gICAgdGhpcy5vd25Db250cnVjdHMucHVzaCh0aGlzLndlYlNvY2tldFN0YWdlKTtcbiAgICBjb25zdCB3ZWJTb2NrZXRBcGlSb3V0ZSA9IHRoaXMud2ViU29ja2V0QXBpLmFkZFJvdXRlKCckY29ubmVjdCcsIHtcbiAgICAgIGludGVncmF0aW9uOiBuZXcgYXBpR3dWMkludC5XZWJTb2NrZXRMYW1iZGFJbnRlZ3JhdGlvbihcbiAgICAgICAgJyRjb25uZWN0JyxcbiAgICAgICAgZnVuY3Rpb25PbkNvbm5lY3RcbiAgICAgICksXG4gICAgfSk7XG4gICAgKHdlYlNvY2tldEFwaVJvdXRlLm5vZGUuZGVmYXVsdENoaWxkIGFzIGFndy5DZm5Sb3V0ZSkuYXV0aG9yaXphdGlvblR5cGUgPVxuICAgICAgJ0FXU19JQU0nO1xuXG4gICAgdGhpcy53ZWJTb2NrZXRBcGkuYWRkUm91dGUoJyRkaXNjb25uZWN0Jywge1xuICAgICAgaW50ZWdyYXRpb246IG5ldyBhcGlHd1YySW50LldlYlNvY2tldExhbWJkYUludGVncmF0aW9uKFxuICAgICAgICAnJGRpc2Nvbm5lY3QnLFxuICAgICAgICBmdW5jdGlvbk9uRGlzY29ubmVjdFxuICAgICAgKSxcbiAgICB9KTtcblxuICAgIHRoaXMuZnVuY3Rpb25TdWJzY3JpcHRpb25NYWluID0gdGhpcy5wcm92aWRlRnVuY3Rpb25Gb3JTdWJzY3JpcHRpb24oKTtcblxuICAgIHRoaXMud2ViU29ja2V0QXBpLmFkZFJvdXRlKCdzZW5kbWVzc2FnZScsIHtcbiAgICAgIGludGVncmF0aW9uOiBuZXcgYXBpR3dWMkludC5XZWJTb2NrZXRMYW1iZGFJbnRlZ3JhdGlvbihcbiAgICAgICAgJ1NlbmRNZXNzYWdlJyxcbiAgICAgICAgdGhpcy5mdW5jdGlvblN1YnNjcmlwdGlvbk1haW4uZnVuY3Rpb25cbiAgICAgICksXG4gICAgfSk7XG5cbiAgICB0aGlzLml0ZXJhdGVBbGxFbGVtZW50cyhTdGFjay5vZih0aGlzKSk7XG5cbiAgICBmb3IgKGNvbnN0IGZ1bmMgb2YgdGhpcy5mdW5jdGlvblN1YnNjcmlwdGlvblBvb2wpIHtcbiAgICAgIGZ1bmMuZnVuY3Rpb24uYWRkRW52aXJvbm1lbnQoXG4gICAgICAgICdJTkZSQV9NQVBQSU5HJyxcbiAgICAgICAgSlNPTi5zdHJpbmdpZnkoZnVuYy5tYXBwaW5nKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLndzVXJsID0gYHdzczovLyR7dGhpcy53ZWJTb2NrZXRBcGkuYXBpSWR9LmV4ZWN1dGUtYXBpLiR7XG4gICAgICBTdGFjay5vZih0aGlzKS5yZWdpb25cbiAgICB9LmFtYXpvbmF3cy5jb20vJHt0aGlzLndlYlNvY2tldFN0YWdlLnN0YWdlTmFtZX1gO1xuXG4gICAgbmV3IENmbk91dHB1dChTdGFjay5vZih0aGlzKSwgJ1NlcnZlcmxlc3NTcHlXc1VybCcsIHtcbiAgICAgIHZhbHVlOiB0aGlzLndzVXJsLFxuICAgIH0pO1xuXG4gICAgLy8gbmV3IENmbk91dHB1dCh0aGlzLCBcIkFQSV9VUkxcIiwge1xuICAgIC8vICAgdmFsdWU6IHRoaXMud3NVcmwsXG4gICAgLy8gfSk7XG5cbiAgICBpZiAocHJvcHM/LmdlbmVyYXRlU3B5RXZlbnRzRmlsZUxvY2F0aW9uKSB7XG4gICAgICB0aGlzLndyaXRlU3B5RXZlbnRzQ2xhc3MocHJvcHM/LmdlbmVyYXRlU3B5RXZlbnRzRmlsZUxvY2F0aW9uKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHdyaXRlU3B5RXZlbnRzQ2xhc3MoZmlsZUxvY2F0aW9uOiBzdHJpbmcpIHtcbiAgICBmcy5ta2RpclN5bmMocGF0aC5kaXJuYW1lKGZpbGVMb2NhdGlvbiksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gICAgY29uc3QgcHJvcGVydGllcyA9IHRoaXMuc2VydmljZUtleXNcbiAgICAgIC5tYXAoKHNrKSA9PiBgICAke3NrLnJlcGxhY2UoLyMvZywgJycpfTogJyR7c2t9JyA9ICcke3NrfSc7XFxuYClcbiAgICAgIC5qb2luKCcnKTtcblxuICAgIGNvbnN0IGNvZGUgPSBgLyogZXNsaW50LWRpc2FibGUgKi9cXG5leHBvcnQgY2xhc3MgU2VydmVybGVzc1NweUV2ZW50cyB7XFxuJHtwcm9wZXJ0aWVzfX1cXG5gO1xuXG4gICAgZnMud3JpdGVGaWxlU3luYyhmaWxlTG9jYXRpb24sIGNvZGUpO1xuICB9XG5cbiAgcHJpdmF0ZSBpdGVyYXRlQWxsRWxlbWVudHMocGFyZW50OiBJQ29uc3RydWN0KSB7XG4gICAgZm9yIChjb25zdCBub2RlIG9mIHBhcmVudC5ub2RlLmNoaWxkcmVuKSB7XG4gICAgICBpZiAodGhpcy5vd25Db250cnVjdHMuaW5jbHVkZXMobm9kZSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmZ1bmN0aW9uU3Vic2NyaXB0aW9uUG9vbC5maW5kKChzKSA9PiBzLmZ1bmN0aW9uID09PSBub2RlKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBsYW1iZGEuRnVuY3Rpb24pIHtcbiAgICAgICAgdGhpcy5pbnRlcmNlcHRGdW5jdGlvbihub2RlKTtcbiAgICAgIH0gZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIHNucy5Ub3BpYykge1xuICAgICAgICBjb25zb2xlLmxvZygnaW50ZXJjZXB0U25zVG9waWMnKTtcbiAgICAgICAgdGhpcy5pbnRlcmNlcHRTbnNUb3BpYyhub2RlKTtcbiAgICAgIH0gZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIHNucy5TdWJzY3JpcHRpb24pIHtcbiAgICAgICAgdGhpcy5pbnRlcmNlcHRTbnNTdWJzY3JpcHRpb24obm9kZSk7XG4gICAgICB9IGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBzMy5CdWNrZXQpIHtcbiAgICAgICAgdGhpcy5pbnRlcmNlcHRTMyhub2RlKTtcbiAgICAgIH0gZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIGR5bmFtb0RiLlRhYmxlKSB7XG4gICAgICAgIHRoaXMuaW50ZXJjZXB0RHluYW1vZGIobm9kZSk7XG4gICAgICB9IGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBldmVudHMuRXZlbnRCdXMpIHtcbiAgICAgICAgdGhpcy5pbnRlcmNlcHRFdmVudEJ1cyhub2RlKTtcbiAgICAgIH0gZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIGV2ZW50cy5SdWxlKSB7XG4gICAgICAgIHRoaXMuaW50ZXJjZXB0RXZlbnRCdXNSdWxlKG5vZGUpO1xuICAgICAgfSBlbHNlIGlmIChub2RlIGluc3RhbmNlb2YgbGFtYmRhLkNmbkV2ZW50U291cmNlTWFwcGluZykge1xuICAgICAgICB0aGlzLmludGVyY2VwdFNxcyhub2RlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCdOTyBNQVRDSCcsIG5vZGUpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLml0ZXJhdGVBbGxFbGVtZW50cyhub2RlKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGludGVyY2VwdFNxcyhub2RlOiBsYW1iZGEuQ2ZuRXZlbnRTb3VyY2VNYXBwaW5nKSB7XG4gICAgY29uc3QgcXVldWUgPSB0aGlzLmZpbmRFbGVtZW50PHNxcy5RdWV1ZT4oXG4gICAgICAobjogSUNvbnN0cnVjdCkgPT5cbiAgICAgICAgbiBpbnN0YW5jZW9mIHNxcy5RdWV1ZSAmJlxuICAgICAgICAobiBhcyBzcXMuUXVldWUpLnF1ZXVlQXJuID09PSBub2RlLmV2ZW50U291cmNlQXJuXG4gICAgKTtcblxuICAgIGNvbnN0IGZ1bmMgPSB0aGlzLmZpbmRFbGVtZW50PGxhbWJkYS5GdW5jdGlvbj4oXG4gICAgICAobjogSUNvbnN0cnVjdCkgPT5cbiAgICAgICAgbiBpbnN0YW5jZW9mIGxhbWJkYS5GdW5jdGlvbiAmJlxuICAgICAgICAobiBhcyBsYW1iZGEuRnVuY3Rpb24pLmZ1bmN0aW9uTmFtZSA9PT0gbm9kZS5mdW5jdGlvbk5hbWVcbiAgICApO1xuXG4gICAgaWYgKHF1ZXVlICYmIGZ1bmMpIHtcbiAgICAgIGNvbnN0IHF1ZXVlTmFtZSA9IHRoaXMuZ2V0Q29uc3RydWN0TmFtZShxdWV1ZSk7XG5cbiAgICAgIGNvbnN0IHNlcnZpY2VLZXkgPSBgU3FzIyR7cXVldWVOYW1lfWA7XG4gICAgICB0aGlzLmZ1bmN0aW9uU3Vic2NyaXB0aW9uTWFpbi5tYXBwaW5nW3F1ZXVlLnF1ZXVlQXJuXSA9IHNlcnZpY2VLZXk7XG4gICAgICB0aGlzLnNlcnZpY2VLZXlzLnB1c2goc2VydmljZUtleSk7XG4gICAgICBmdW5jLmFkZEVudmlyb25tZW50KCdGTFVFTlRfVEVTVF9TVUJTQ1JJQkVEX1RPX1NRUycsICd0cnVlJyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVGdW5jdGlvbkZvclN1YnNjcmlwdGlvbihpbmRleDogbnVtYmVyKSB7XG4gICAgY29uc3QgZnVuYyA9IG5ldyBsYW1iZGFOb2RlLk5vZGVqc0Z1bmN0aW9uKHRoaXMsIGBTdWJzY3JpcHRpb24ke2luZGV4fWAsIHtcbiAgICAgIG1lbW9yeVNpemU6IDUxMixcbiAgICAgIHRpbWVvdXQ6IER1cmF0aW9uLnNlY29uZHMoNSksXG4gICAgICBydW50aW1lOiBsYW1iZGEuUnVudGltZS5OT0RFSlNfMTZfWCxcbiAgICAgIGhhbmRsZXI6ICdoYW5kbGVyJyxcbiAgICAgIGVudHJ5OiBnZXRBc3NldExvY2F0aW9uKCdmdW5jdGlvbnMvc2VuZE1lc3NhZ2UudHMnKSxcbiAgICAgIGVudmlyb25tZW50OiB7XG4gICAgICAgIFRBQkxFX05BTUU6IHRoaXMudGFibGUudGFibGVOYW1lLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIHRoaXMudGFibGUuZ3JhbnRXcml0ZURhdGEoZnVuYyk7XG4gICAgdGhpcy50YWJsZS5ncmFudFJlYWREYXRhKGZ1bmMpO1xuICAgIGZ1bmMuYWRkRW52aXJvbm1lbnQoXG4gICAgICAnV1NfRU5EUE9JTlQnLFxuICAgICAgYGh0dHBzOi8vJHt0aGlzLndlYlNvY2tldEFwaS5hcGlJZH0uZXhlY3V0ZS1hcGkuJHtcbiAgICAgICAgU3RhY2sub2YodGhpcykucmVnaW9uXG4gICAgICB9LmFtYXpvbmF3cy5jb20vJHt0aGlzLndlYlNvY2tldFN0YWdlLnN0YWdlTmFtZX1gXG4gICAgKTtcblxuICAgIHRoaXMud2ViU29ja2V0QXBpLmdyYW50TWFuYWdlQ29ubmVjdGlvbnMoZnVuYyk7XG4gICAgcmV0dXJuIGZ1bmM7XG4gIH1cblxuICBwcml2YXRlIGludGVyY2VwdFMzKHMzQnVja2V0OiBzMy5CdWNrZXQpIHtcbiAgICBzM0J1Y2tldC5hZGRFdmVudE5vdGlmaWNhdGlvbihcbiAgICAgIHMzLkV2ZW50VHlwZS5PQkpFQ1RfQ1JFQVRFRF9QVVQsXG4gICAgICBuZXcgczNub3RpZi5MYW1iZGFEZXN0aW5hdGlvbih0aGlzLmZ1bmN0aW9uU3Vic2NyaXB0aW9uTWFpbi5mdW5jdGlvbilcbiAgICApO1xuXG4gICAgY29uc3QgbmFtZSA9IHRoaXMuZ2V0Q29uc3RydWN0TmFtZShzM0J1Y2tldCk7XG5cbiAgICBjb25zdCBzZXJ2aWNlS2V5ID0gYFMzIyR7bmFtZX1gO1xuICAgIHRoaXMuZnVuY3Rpb25TdWJzY3JpcHRpb25NYWluLm1hcHBpbmdbczNCdWNrZXQuYnVja2V0QXJuXSA9IHNlcnZpY2VLZXk7XG4gICAgdGhpcy5zZXJ2aWNlS2V5cy5wdXNoKHNlcnZpY2VLZXkpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbnRlcmNlcHREeW5hbW9kYih0YWJsZTogZHluYW1vRGIuVGFibGUpIHtcbiAgICAvLyBlbmFibGUgRHluYW1vREIgc3RyZWFtcyB3aXRoIGEgaGFja1xuICAgICh0YWJsZS5ub2RlLmRlZmF1bHRDaGlsZCBhcyBkeW5hbW9EYi5DZm5UYWJsZSkuc3RyZWFtU3BlY2lmaWNhdGlvbiA9IHtcbiAgICAgIHN0cmVhbVZpZXdUeXBlOiBkeW5hbW9EYi5TdHJlYW1WaWV3VHlwZS5ORVdfQU5EX09MRF9JTUFHRVMsXG4gICAgfTtcbiAgICAodGFibGUgYXMgYW55KS50YWJsZVN0cmVhbUFybiA9IChcbiAgICAgIHRhYmxlLm5vZGUuZGVmYXVsdENoaWxkIGFzIGR5bmFtb0RiLkNmblRhYmxlXG4gICAgKS5hdHRyU3RyZWFtQXJuO1xuXG4gICAgdGhpcy5mdW5jdGlvblN1YnNjcmlwdGlvbk1haW4uZnVuY3Rpb24uYWRkRXZlbnRTb3VyY2UoXG4gICAgICBuZXcgZHluYW1vRGJTdHJlYW0uRHluYW1vRXZlbnRTb3VyY2UodGFibGUsIHtcbiAgICAgICAgc3RhcnRpbmdQb3NpdGlvbjogbGFtYmRhLlN0YXJ0aW5nUG9zaXRpb24uTEFURVNULFxuICAgICAgICBiYXRjaFNpemU6IDEsXG4gICAgICAgIHJldHJ5QXR0ZW1wdHM6IDAsXG4gICAgICB9KVxuICAgICk7XG5cbiAgICBjb25zdCBuYW1lID0gdGhpcy5nZXRDb25zdHJ1Y3ROYW1lKHRhYmxlKTtcblxuICAgIGNvbnN0IHNlcnZpY2VLZXkgPSBgRHluYW1vREIjJHtuYW1lfWA7XG4gICAgdGhpcy5mdW5jdGlvblN1YnNjcmlwdGlvbk1haW4ubWFwcGluZ1t0YWJsZS50YWJsZUFybl0gPSBzZXJ2aWNlS2V5O1xuICAgIHRoaXMuc2VydmljZUtleXMucHVzaChzZXJ2aWNlS2V5KTtcbiAgfVxuXG4gIHByaXZhdGUgaW50ZXJjZXB0RXZlbnRCdXNSdWxlKHJ1bGU6IGV2ZW50cy5SdWxlKSB7XG4gICAgY29uc3QgeyBldmVudEJ1c05hbWUgfSA9IHJ1bGUubm9kZS5kZWZhdWx0Q2hpbGQgYXMgZXZlbnRzLkNmblJ1bGU7XG4gICAgY29uc3QgZXZlbnRCcmlkZ2UgPSB0aGlzLmdldEV2ZW50QnJpZGdlKFxuICAgICAgKHJ1bGUubm9kZS5kZWZhdWx0Q2hpbGQgYXMgYW55KS5ldmVudEJ1c05hbWVcbiAgICApO1xuXG4gICAgaWYgKCFldmVudEJyaWRnZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW4gbm90IGZpbmQgRXZlbnRCcmlkZ2Ugd2l0aCBuYW1lIFwiJHtldmVudEJ1c05hbWV9XCJgKTtcbiAgICB9XG5cbiAgICBjb25zdCBmdW5jdGlvblN1YnNjcmlwdGlvbiA9IHRoaXMucHJvdmlkZUZ1bmN0aW9uRm9yU3Vic2NyaXB0aW9uKFxuICAgICAgKHMpID0+ICFzLnVzZWRGb3JFdmVudEJyaWRnZVxuICAgICk7XG4gICAgZnVuY3Rpb25TdWJzY3JpcHRpb24udXNlZEZvckV2ZW50QnJpZGdlID0gdHJ1ZTtcblxuICAgIHJ1bGUuYWRkVGFyZ2V0KG5ldyB0YXJnZXRzLkxhbWJkYUZ1bmN0aW9uKGZ1bmN0aW9uU3Vic2NyaXB0aW9uLmZ1bmN0aW9uKSk7XG5cbiAgICBjb25zdCBicmlkZ2VOYW1lID0gdGhpcy5nZXRDb25zdHJ1Y3ROYW1lKGV2ZW50QnJpZGdlKTtcbiAgICBjb25zdCBydWxlTmFtZSA9IHRoaXMuZ2V0Q29uc3RydWN0TmFtZShydWxlKTtcbiAgICBjb25zdCBzZXJ2aWNlS2V5ID0gYEV2ZW50QnJpZGdlUnVsZSMke2JyaWRnZU5hbWV9IyR7cnVsZU5hbWV9YDtcbiAgICBmdW5jdGlvblN1YnNjcmlwdGlvbi5tYXBwaW5nLmV2ZW50QnJpZGdlID0gc2VydmljZUtleTtcbiAgICB0aGlzLnNlcnZpY2VLZXlzLnB1c2goc2VydmljZUtleSk7XG4gIH1cblxuICBwcml2YXRlIGludGVyY2VwdEV2ZW50QnVzKGV2ZW50QnVzOiBldmVudHMuRXZlbnRCdXMpIHtcbiAgICBjb25zdCBmdW5jdGlvblN1YnNjcmlwdGlvbiA9IHRoaXMucHJvdmlkZUZ1bmN0aW9uRm9yU3Vic2NyaXB0aW9uKFxuICAgICAgKHMpID0+ICFzLnVzZWRGb3JFdmVudEJyaWRnZVxuICAgICk7XG4gICAgZnVuY3Rpb25TdWJzY3JpcHRpb24udXNlZEZvckV2ZW50QnJpZGdlID0gdHJ1ZTtcblxuICAgIGNvbnN0IGJyaWRnZU5hbWUgPSB0aGlzLmdldENvbnN0cnVjdE5hbWUoZXZlbnRCdXMpO1xuICAgIGNvbnN0IHJ1bGUgPSBuZXcgZXZlbnRzLlJ1bGUodGhpcywgYFJ1bGVBbGwke2JyaWRnZU5hbWV9YCwge1xuICAgICAgZXZlbnRCdXMsXG4gICAgICBldmVudFBhdHRlcm46IHsgdmVyc2lvbjogWycwJ10gfSxcbiAgICAgIHRhcmdldHM6IFtuZXcgdGFyZ2V0cy5MYW1iZGFGdW5jdGlvbihmdW5jdGlvblN1YnNjcmlwdGlvbi5mdW5jdGlvbildLFxuICAgIH0pO1xuXG4gICAgdGhpcy5vd25Db250cnVjdHMucHVzaChydWxlKTtcbiAgICBjb25zdCBzZXJ2aWNlS2V5ID0gYEV2ZW50QnJpZGdlIyR7YnJpZGdlTmFtZX1gO1xuICAgIGZ1bmN0aW9uU3Vic2NyaXB0aW9uLm1hcHBpbmcuZXZlbnRCcmlkZ2UgPSBzZXJ2aWNlS2V5O1xuICAgIHRoaXMuc2VydmljZUtleXMucHVzaChzZXJ2aWNlS2V5KTtcbiAgfVxuXG4gIHByaXZhdGUgaW50ZXJjZXB0U25zVG9waWModG9waWM6IHNucy5Ub3BpYykge1xuICAgIGNvbnN0IGZ1bmN0aW9uU3Vic2NyaXB0aW9uID0gdGhpcy5wcm92aWRlRnVuY3Rpb25Gb3JTdWJzY3JpcHRpb24oXG4gICAgICAocykgPT4gIXMuc3Vic3JpYmVkVG9waWNzLmluY2x1ZGVzKHRvcGljKVxuICAgICk7XG5cbiAgICB0b3BpYy5hZGRTdWJzY3JpcHRpb24oXG4gICAgICBuZXcgc25zU3Vicy5MYW1iZGFTdWJzY3JpcHRpb24oZnVuY3Rpb25TdWJzY3JpcHRpb24uZnVuY3Rpb24pXG4gICAgKTtcbiAgICBjb25zdCB0b3BpY05hbWUgPSB0aGlzLmdldENvbnN0cnVjdE5hbWUodG9waWMpO1xuICAgIGNvbnN0IHNlcnZpY2VLZXkgPSBgU25zVG9waWMjJHt0b3BpY05hbWV9YDtcbiAgICBmdW5jdGlvblN1YnNjcmlwdGlvbi5tYXBwaW5nW3RvcGljLnRvcGljQXJuXSA9IHNlcnZpY2VLZXk7XG4gICAgdGhpcy5zZXJ2aWNlS2V5cy5wdXNoKHNlcnZpY2VLZXkpO1xuICAgIGZ1bmN0aW9uU3Vic2NyaXB0aW9uLnN1YnNyaWJlZFRvcGljcy5wdXNoKHRvcGljKTtcbiAgfVxuXG4gIHByaXZhdGUgaW50ZXJjZXB0U25zU3Vic2NyaXB0aW9uKHN1YnNjcmlwdGlvbjogc25zLlN1YnNjcmlwdGlvbikge1xuICAgIGlmICghc3Vic2NyaXB0aW9uLm5vZGUuc2NvcGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB0b3BpYyA9IHRoaXMuZ2V0VG9waWMoXG4gICAgICAoc3Vic2NyaXB0aW9uLm5vZGUuZGVmYXVsdENoaWxkIGFzIHNucy5DZm5TdWJzY3JpcHRpb24pLnRvcGljQXJuXG4gICAgKTtcblxuICAgIGlmICghdG9waWMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2FuIG5vdCBmaW5kIFRvcGljJyk7XG4gICAgfVxuXG4gICAgY29uc3QgZnVuY3Rpb25TdWJzY3JpcHRpb24gPSB0aGlzLnByb3ZpZGVGdW5jdGlvbkZvclN1YnNjcmlwdGlvbihcbiAgICAgIChzKSA9PiAhcy5zdWJzcmliZWRUb3BpY3MuaW5jbHVkZXModG9waWMpXG4gICAgKTtcblxuICAgIGNvbnN0IHsgZmlsdGVyUG9saWN5IH0gPSBzdWJzY3JpcHRpb24ubm9kZVxuICAgICAgLmRlZmF1bHRDaGlsZCBhcyBzbnMuQ2ZuU3Vic2NyaXB0aW9uO1xuXG4gICAgY29uc3Qgc3Vic2NyaXB0aW9uQ2xvbmUgPSB0b3BpYy5hZGRTdWJzY3JpcHRpb24oXG4gICAgICBuZXcgc25zU3Vicy5MYW1iZGFTdWJzY3JpcHRpb24oZnVuY3Rpb25TdWJzY3JpcHRpb24uZnVuY3Rpb24pXG4gICAgKTtcbiAgICAoc3Vic2NyaXB0aW9uQ2xvbmUubm9kZS5kZWZhdWx0Q2hpbGQgYXMgc25zLkNmblN1YnNjcmlwdGlvbikuZmlsdGVyUG9saWN5ID1cbiAgICAgIGZpbHRlclBvbGljeTtcblxuICAgIHRoaXMub3duQ29udHJ1Y3RzLnB1c2goc3Vic2NyaXB0aW9uQ2xvbmUpO1xuXG4gICAgY29uc3QgdG9waWNOYW1lID0gdGhpcy5nZXRDb25zdHJ1Y3ROYW1lKHRvcGljKTtcbiAgICBjb25zdCB0YXJnZXROYW1lID0gdGhpcy5nZXRDb25zdHJ1Y3ROYW1lKHN1YnNjcmlwdGlvbi5ub2RlLnNjb3BlKTtcblxuICAgIGZ1bmN0aW9uU3Vic2NyaXB0aW9uLnN1YnNyaWJlZFRvcGljcy5wdXNoKHRvcGljKTtcbiAgICBjb25zdCBzZXJ2aWNlS2V5ID0gYFNuc1N1YnNjcmlwdGlvbiMke3RvcGljTmFtZX0jJHt0YXJnZXROYW1lfWA7XG4gICAgZnVuY3Rpb25TdWJzY3JpcHRpb24ubWFwcGluZ1t0b3BpYy50b3BpY0Fybl0gPSBzZXJ2aWNlS2V5O1xuICAgIHRoaXMuc2VydmljZUtleXMucHVzaChzZXJ2aWNlS2V5KTtcbiAgfVxuXG4gIHByaXZhdGUgcHJvdmlkZUZ1bmN0aW9uRm9yU3Vic2NyaXB0aW9uKFxuICAgIGZpbHRlckZ1bmN0aW9uPzogKHN1YnNjcmlwdGlvbjogRnVuY3Rpb25TdWJzY3JpcHRpb24pID0+IGJvb2xlYW5cbiAgKSB7XG4gICAgbGV0IGZ1bmN0aW9uU3Vic2NyaXB0aW9uOiBGdW5jdGlvblN1YnNjcmlwdGlvbiB8IHVuZGVmaW5lZDtcblxuICAgIGlmIChmaWx0ZXJGdW5jdGlvbikge1xuICAgICAgZnVuY3Rpb25TdWJzY3JpcHRpb24gPSB0aGlzLmZ1bmN0aW9uU3Vic2NyaXB0aW9uUG9vbC5maW5kKGZpbHRlckZ1bmN0aW9uKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuZnVuY3Rpb25TdWJzY3JpcHRpb25Qb29sLmxlbmd0aCA+IDApIHtcbiAgICAgIGZ1bmN0aW9uU3Vic2NyaXB0aW9uID0gdGhpcy5mdW5jdGlvblN1YnNjcmlwdGlvblBvb2xbMF07XG4gICAgfVxuXG4gICAgaWYgKCFmdW5jdGlvblN1YnNjcmlwdGlvbikge1xuICAgICAgZnVuY3Rpb25TdWJzY3JpcHRpb24gPSB7XG4gICAgICAgIHN1YnNyaWJlZFRvcGljczogW10sXG4gICAgICAgIHVzZWRGb3JFdmVudEJyaWRnZTogZmFsc2UsXG4gICAgICAgIG1hcHBpbmc6IHt9LFxuICAgICAgICBmdW5jdGlvbjogdGhpcy5jcmVhdGVGdW5jdGlvbkZvclN1YnNjcmlwdGlvbihcbiAgICAgICAgICB0aGlzLmZ1bmN0aW9uU3Vic2NyaXB0aW9uUG9vbC5sZW5ndGhcbiAgICAgICAgKSxcbiAgICAgIH07XG4gICAgICB0aGlzLmZ1bmN0aW9uU3Vic2NyaXB0aW9uUG9vbC5wdXNoKGZ1bmN0aW9uU3Vic2NyaXB0aW9uKTtcbiAgICB9XG4gICAgcmV0dXJuIGZ1bmN0aW9uU3Vic2NyaXB0aW9uO1xuICB9XG5cbiAgcHJpdmF0ZSBpbnRlcmNlcHRGdW5jdGlvbihmdW5jOiBsYW1iZGEuRnVuY3Rpb24pIHtcbiAgICBmdW5jLmFkZExheWVycyh0aGlzLmV4dGVuc2lvbkxheWVyKTtcbiAgICB0aGlzLmZ1bmN0aW9uU3Vic2NyaXB0aW9uTWFpbi5mdW5jdGlvbi5ncmFudEludm9rZShmdW5jKTtcblxuICAgIGNvbnN0IGZ1bmN0aW9uTmFtZSA9IHRoaXMuZ2V0Q29uc3RydWN0TmFtZShmdW5jKTtcblxuICAgIGZ1bmMuYWRkRW52aXJvbm1lbnQoJ0ZVTkNUSU9OX05BTUUnLCBmdW5jdGlvbk5hbWUpO1xuICAgIGZ1bmMuYWRkRW52aXJvbm1lbnQoJ0FXU19MQU1CREFfRVhFQ19XUkFQUEVSJywgJy9vcHQvc3B5LXdyYXBwZXInKTtcbiAgICBmdW5jLmFkZEVudmlyb25tZW50KFxuICAgICAgJ0ZMVUVOVF9URVNUX1NFTkRfRlVOQ1RJT05fTkFNRScsXG4gICAgICB0aGlzLmZ1bmN0aW9uU3Vic2NyaXB0aW9uTWFpbi5mdW5jdGlvbi5mdW5jdGlvbk5hbWVcbiAgICApO1xuXG4gICAgdGhpcy5zZXJ2aWNlS2V5cy5wdXNoKGBGdW5jdGlvbiMke2Z1bmN0aW9uTmFtZX0jUmVxdWVzdGApO1xuICAgIHRoaXMuc2VydmljZUtleXMucHVzaChgRnVuY3Rpb24jJHtmdW5jdGlvbk5hbWV9I0Vycm9yYCk7XG4gICAgdGhpcy5zZXJ2aWNlS2V5cy5wdXNoKGBGdW5jdGlvbiMke2Z1bmN0aW9uTmFtZX0jQ29uc29sZWApO1xuICAgIHRoaXMuc2VydmljZUtleXMucHVzaChgRnVuY3Rpb24jJHtmdW5jdGlvbk5hbWV9I1Jlc3BvbnNlYCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0Q29uc3RydWN0TmFtZShjb25zdHJ1Y3Q6IElDb25zdHJ1Y3QpIHtcbiAgICBsZXQgZnVuY3Rpb25OYW1lID0gY29uc3RydWN0Lm5vZGUucGF0aDtcbiAgICBjb25zdCB7IHN0YWNrTmFtZSB9ID0gU3RhY2sub2YodGhpcyk7XG5cbiAgICBpZiAoZnVuY3Rpb25OYW1lLnN0YXJ0c1dpdGgoc3RhY2tOYW1lKSkge1xuICAgICAgZnVuY3Rpb25OYW1lID0gZnVuY3Rpb25OYW1lLnN1YnN0cmluZyhzdGFja05hbWUubGVuZ3RoICsgMSk7XG4gICAgfVxuICAgIHJldHVybiBmdW5jdGlvbk5hbWU7XG4gIH1cblxuICBwcml2YXRlIGdldFRvcGljKHRvcGljQXJuOiBzdHJpbmcpOiBzbnMuVG9waWMgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHRvcGljID0gdGhpcy5maW5kRWxlbWVudDxzbnMuVG9waWM+KFxuICAgICAgKG5vZGU6IElDb25zdHJ1Y3QpID0+XG4gICAgICAgIG5vZGUgaW5zdGFuY2VvZiBzbnMuVG9waWMgJiYgKG5vZGUgYXMgc25zLlRvcGljKS50b3BpY0FybiA9PT0gdG9waWNBcm5cbiAgICApO1xuXG4gICAgcmV0dXJuIHRvcGljO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRFdmVudEJyaWRnZShldmVudEJ1c05hbWU6IHN0cmluZyk6IGV2ZW50cy5FdmVudEJ1cyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgZXZlbnRCcmlkZ2UgPSB0aGlzLmZpbmRFbGVtZW50PGV2ZW50cy5FdmVudEJ1cz4oXG4gICAgICAobm9kZTogSUNvbnN0cnVjdCkgPT5cbiAgICAgICAgbm9kZSBpbnN0YW5jZW9mIGV2ZW50cy5FdmVudEJ1cyAmJlxuICAgICAgICAobm9kZSBhcyBldmVudHMuRXZlbnRCdXMpLmV2ZW50QnVzTmFtZSA9PT0gZXZlbnRCdXNOYW1lXG4gICAgKTtcblxuICAgIHJldHVybiBldmVudEJyaWRnZTtcbiAgfVxuXG4gIHByaXZhdGUgZmluZEVsZW1lbnQ8VCBleHRlbmRzIElDb25zdHJ1Y3QgPSBJQ29uc3RydWN0PihcbiAgICBmaWx0ZXJGdW5jOiAobm9kZTogSUNvbnN0cnVjdCkgPT4gYm9vbGVhbixcbiAgICBwYXJlbnQ/OiBJQ29uc3RydWN0XG4gICk6IFQgfCB1bmRlZmluZWQge1xuICAgIGlmICghcGFyZW50KSB7XG4gICAgICBwYXJlbnQgPSBTdGFjay5vZih0aGlzKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IG5vZGUgb2YgcGFyZW50Lm5vZGUuY2hpbGRyZW4pIHtcbiAgICAgIGlmIChmaWx0ZXJGdW5jKG5vZGUpKSB7XG4gICAgICAgIHJldHVybiBub2RlIGFzIFQ7XG4gICAgICB9XG4gICAgICB0aGlzLmZpbmRFbGVtZW50PFQ+KGZpbHRlckZ1bmMsIG5vZGUpO1xuICAgIH1cblxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxudHlwZSBGdW5jdGlvblN1YnNjcmlwdGlvbiA9IHtcbiAgc3Vic3JpYmVkVG9waWNzOiBzbnMuVG9waWNbXTtcbiAgdXNlZEZvckV2ZW50QnJpZGdlOiBib29sZWFuO1xuICBmdW5jdGlvbjogbGFtYmRhTm9kZS5Ob2RlanNGdW5jdGlvbjtcbiAgbWFwcGluZzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbn07XG5cbmZ1bmN0aW9uIGdldEFzc2V0TG9jYXRpb24obG9jYXRpb246IHN0cmluZykge1xuICBjb25zdCBsb2MgPSBwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4vJyArIGxvY2F0aW9uKTtcblxuICBpZiAoZnMuZXhpc3RzU3luYyhsb2MpKSB7XG4gICAgcmV0dXJuIGxvYztcbiAgfVxuXG4gIGNvbnN0IGxvYzIgPSBwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4vLi4vJyArIGxvY2F0aW9uKTtcblxuICBpZiAoZnMuZXhpc3RzU3luYyhsb2MyKSkge1xuICAgIHJldHVybiBsb2MyO1xuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKGBMb2NhdGlvbiAke2xvY30gYW5kICR7bG9jMn0gZG9lcyBub3QgZXhpc3RzLmApO1xufVxuIl19
391
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2VydmVybGVzc1NweS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9TZXJ2ZXJsZXNzU3B5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQ3pCLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBQzdCLE9BQU8sS0FBSyxPQUFPLE1BQU0saUNBQWlDLENBQUM7QUFDM0QsT0FBTyxLQUFLLFVBQVUsTUFBTSw4Q0FBOEMsQ0FBQztBQUMzRSxPQUFPLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFekQsT0FBTyxLQUFLLFFBQVEsTUFBTSwwQkFBMEIsQ0FBQztBQUNyRCxPQUFPLEtBQUssTUFBTSxNQUFNLHdCQUF3QixDQUFDO0FBQ2pELE9BQU8sS0FBSyxPQUFPLE1BQU0sZ0NBQWdDLENBQUM7QUFDMUQsT0FBTyxLQUFLLE1BQU0sTUFBTSx3QkFBd0IsQ0FBQztBQUNqRCxPQUFPLEtBQUssY0FBYyxNQUFNLHNDQUFzQyxDQUFDO0FBQ3ZFLE9BQU8sS0FBSyxVQUFVLE1BQU0sK0JBQStCLENBQUM7QUFDNUQsT0FBTyxLQUFLLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUN6QyxPQUFPLEtBQUssT0FBTyxNQUFNLGtDQUFrQyxDQUFDO0FBQzVELE9BQU8sS0FBSyxHQUFHLE1BQU0scUJBQXFCLENBQUM7QUFDM0MsT0FBTyxLQUFLLE9BQU8sTUFBTSxtQ0FBbUMsQ0FBQztBQUM3RCxPQUFPLEtBQUssR0FBRyxNQUFNLHFCQUFxQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxTQUFTLEVBQWMsTUFBTSxZQUFZLENBQUM7QUFDbkQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFNN0QsTUFBTSxPQUFPLGFBQWMsU0FBUSxTQUFTO0lBWTFDLFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBMEI7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QyxDQUFDO0lBRXZELElBQUksRUFBRSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRTtRQUN2QixPQUFPLElBQUksQ0FBQztLQUNiO0lBRUQsTUFBTSxJQUFJLEtBQUssQ0FBQyxZQUFZLEdBQUcsUUFBUSxJQUFJLG1CQUFtQixDQUFDLENBQUM7QUFDbEUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgKiBhcyBhcGlHd1YyIGZyb20gJ0Bhd3MtY2RrL2F3cy1hcGlnYXRld2F5djItYWxwaGEnO1xuaW1wb3J0ICogYXMgYXBpR3dWMkludCBmcm9tICdAYXdzLWNkay9hd3MtYXBpZ2F0ZXdheXYyLWludGVncmF0aW9ucy1hbHBoYSc7XG5pbXBvcnQgeyBDZm5PdXRwdXQsIER1cmF0aW9uLCBTdGFjayB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCAqIGFzIGFndyBmcm9tICdhd3MtY2RrLWxpYi9hd3MtYXBpZ2F0ZXdheXYyJztcbmltcG9ydCAqIGFzIGR5bmFtb0RiIGZyb20gJ2F3cy1jZGstbGliL2F3cy1keW5hbW9kYic7XG5pbXBvcnQgKiBhcyBldmVudHMgZnJvbSAnYXdzLWNkay1saWIvYXdzLWV2ZW50cyc7XG5pbXBvcnQgKiBhcyB0YXJnZXRzIGZyb20gJ2F3cy1jZGstbGliL2F3cy1ldmVudHMtdGFyZ2V0cyc7XG5pbXBvcnQgKiBhcyBsYW1iZGEgZnJvbSAnYXdzLWNkay1saWIvYXdzLWxhbWJkYSc7XG5pbXBvcnQgKiBhcyBkeW5hbW9EYlN0cmVhbSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtbGFtYmRhLWV2ZW50LXNvdXJjZXMnO1xuaW1wb3J0ICogYXMgbGFtYmRhTm9kZSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtbGFtYmRhLW5vZGVqcyc7XG5pbXBvcnQgKiBhcyBzMyBmcm9tICdhd3MtY2RrLWxpYi9hd3MtczMnO1xuaW1wb3J0ICogYXMgczNub3RpZiBmcm9tICdhd3MtY2RrLWxpYi9hd3MtczMtbm90aWZpY2F0aW9ucyc7XG5pbXBvcnQgKiBhcyBzbnMgZnJvbSAnYXdzLWNkay1saWIvYXdzLXNucyc7XG5pbXBvcnQgKiBhcyBzbnNTdWJzIGZyb20gJ2F3cy1jZGstbGliL2F3cy1zbnMtc3Vic2NyaXB0aW9ucyc7XG5pbXBvcnQgKiBhcyBzcXMgZnJvbSAnYXdzLWNkay1saWIvYXdzLXNxcyc7XG5pbXBvcnQgeyBDb25zdHJ1Y3QsIElDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB7IGVudlZhcmlhYmxlTmFtZXMgfSBmcm9tICcuL2NvbW1vbi9lbnZWYXJpYWJsZU5hbWVzJztcblxuZXhwb3J0IGludGVyZmFjZSBTZXJ2ZXJsZXNzU3B5UHJvcHMge1xuICByZWFkb25seSBnZW5lcmF0ZVNweUV2ZW50c0ZpbGVMb2NhdGlvbj86IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIFNlcnZlcmxlc3NTcHkgZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICBwcml2YXRlIGV4dGVuc2lvbkxheWVyOiBsYW1iZGEuTGF5ZXJWZXJzaW9uO1xuICBwcml2YXRlIHRhYmxlOiBkeW5hbW9EYi5UYWJsZTtcbiAgcHJpdmF0ZSB3ZWJTb2NrZXRBcGk6IGFwaUd3VjIuV2ViU29ja2V0QXBpO1xuICBwcml2YXRlIG93bkNvbnRydWN0czogSUNvbnN0cnVjdFtdID0gW107XG4gIHByaXZhdGUgZnVuY3Rpb25TdWJzY3JpcHRpb25Qb29sOiBGdW5jdGlvblN1YnNjcmlwdGlvbltdID0gW107XG4gIHByaXZhdGUgZnVuY3Rpb25TdWJzY3JpcHRpb25NYWluOiBGdW5jdGlvblN1YnNjcmlwdGlvbjtcbiAgcHJpdmF0ZSBmdW5jdGlvbnNTcGllZDogRnVuY3Rpb25TcGllZFtdID0gW107XG4gIHByaXZhdGUgd2ViU29ja2V0U3RhZ2U6IGFwaUd3VjIuV2ViU29ja2V0U3RhZ2U7XG4gIHB1YmxpYyBzZXJ2aWNlS2V5czogc3RyaW5nW10gPSBbXTtcbiAgd3NVcmw6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wcz86IFNlcnZlcmxlc3NTcHlQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICB0aGlzLmV4dGVuc2lvbkxheWVyID0gbmV3IGxhbWJkYS5MYXllclZlcnNpb24odGhpcywgJ0V4dGVuc2lvbicsIHtcbiAgICAgIGNvbXBhdGlibGVSdW50aW1lczogW1xuICAgICAgICBsYW1iZGEuUnVudGltZS5OT0RFSlNfMTJfWCxcbiAgICAgICAgbGFtYmRhLlJ1bnRpbWUuTk9ERUpTXzE0X1gsXG4gICAgICAgIGxhbWJkYS5SdW50aW1lLk5PREVKU18xNl9YLFxuICAgICAgXSxcbiAgICAgIGNvZGU6IGxhbWJkYS5Db2RlLmZyb21Bc3NldCh0aGlzLmdldEV4dGVuc2lvbkFzc2V0TG9jYXRpb24oKSksXG4gICAgfSk7XG4gICAgdGhpcy5vd25Db250cnVjdHMucHVzaCh0aGlzLmV4dGVuc2lvbkxheWVyKTtcblxuICAgIHRoaXMudGFibGUgPSBuZXcgZHluYW1vRGIuVGFibGUodGhpcywgJ1dlYlNvY2tldCcsIHtcbiAgICAgIHBhcnRpdGlvbktleToge1xuICAgICAgICBuYW1lOiAnY29ubmVjdGlvbklkJyxcbiAgICAgICAgdHlwZTogZHluYW1vRGIuQXR0cmlidXRlVHlwZS5TVFJJTkcsXG4gICAgICB9LFxuICAgICAgYmlsbGluZ01vZGU6IGR5bmFtb0RiLkJpbGxpbmdNb2RlLlBBWV9QRVJfUkVRVUVTVCxcbiAgICB9KTtcbiAgICB0aGlzLm93bkNvbnRydWN0cy5wdXNoKHRoaXMudGFibGUpO1xuXG4gICAgY29uc3QgZnVuY3Rpb25PbkNvbm5lY3QgPSBuZXcgbGFtYmRhTm9kZS5Ob2RlanNGdW5jdGlvbih0aGlzLCAnT25Db25uZWN0Jywge1xuICAgICAgbWVtb3J5U2l6ZTogNTEyLFxuICAgICAgdGltZW91dDogRHVyYXRpb24uc2Vjb25kcyg1KSxcbiAgICAgIHJ1bnRpbWU6IGxhbWJkYS5SdW50aW1lLk5PREVKU18xNl9YLFxuICAgICAgaGFuZGxlcjogJ2hhbmRsZXInLFxuICAgICAgZW50cnk6IGdldEFzc2V0TG9jYXRpb24oJ2Z1bmN0aW9ucy9vbkNvbm5lY3QudHMnKSxcbiAgICAgIGVudmlyb25tZW50OiB7XG4gICAgICAgIFtlbnZWYXJpYWJsZU5hbWVzLlRBQkxFX05BTUVdOiB0aGlzLnRhYmxlLnRhYmxlTmFtZSxcbiAgICAgICAgTk9ERV9PUFRJT05TOiAnLS1lbmFibGUtc291cmNlLW1hcHMnLFxuICAgICAgfSxcbiAgICB9KTtcbiAgICB0aGlzLnRhYmxlLmdyYW50V3JpdGVEYXRhKGZ1bmN0aW9uT25Db25uZWN0KTtcbiAgICB0aGlzLm93bkNvbnRydWN0cy5wdXNoKGZ1bmN0aW9uT25Db25uZWN0KTtcblxuICAgIGNvbnN0IGZ1bmN0aW9uT25EaXNjb25uZWN0ID0gbmV3IGxhbWJkYU5vZGUuTm9kZWpzRnVuY3Rpb24oXG4gICAgICB0aGlzLFxuICAgICAgJ09uRGlzY29ubmVjdCcsXG4gICAgICB7XG4gICAgICAgIG1lbW9yeVNpemU6IDUxMixcbiAgICAgICAgdGltZW91dDogRHVyYXRpb24uc2Vjb25kcyg1KSxcbiAgICAgICAgcnVudGltZTogbGFtYmRhLlJ1bnRpbWUuTk9ERUpTXzE2X1gsXG4gICAgICAgIGhhbmRsZXI6ICdoYW5kbGVyJyxcbiAgICAgICAgZW50cnk6IGdldEFzc2V0TG9jYXRpb24oJ2Z1bmN0aW9ucy9vbkRpc2Nvbm5lY3QudHMnKSxcbiAgICAgICAgZW52aXJvbm1lbnQ6IHtcbiAgICAgICAgICBbZW52VmFyaWFibGVOYW1lcy5UQUJMRV9OQU1FXTogdGhpcy50YWJsZS50YWJsZU5hbWUsXG4gICAgICAgICAgTk9ERV9PUFRJT05TOiAnLS1lbmFibGUtc291cmNlLW1hcHMnLFxuICAgICAgICB9LFxuICAgICAgfVxuICAgICk7XG4gICAgdGhpcy50YWJsZS5ncmFudFdyaXRlRGF0YShmdW5jdGlvbk9uRGlzY29ubmVjdCk7XG4gICAgdGhpcy5vd25Db250cnVjdHMucHVzaChmdW5jdGlvbk9uRGlzY29ubmVjdCk7XG5cbiAgICB0aGlzLndlYlNvY2tldEFwaSA9IG5ldyBhcGlHd1YyLldlYlNvY2tldEFwaSh0aGlzLCAnQXBpR3dXZWJTb2NrZXQnKTtcbiAgICB0aGlzLm93bkNvbnRydWN0cy5wdXNoKHRoaXMud2ViU29ja2V0QXBpKTtcbiAgICB0aGlzLndlYlNvY2tldFN0YWdlID0gbmV3IGFwaUd3VjIuV2ViU29ja2V0U3RhZ2UoXG4gICAgICB0aGlzLFxuICAgICAgJ0FwaUd3V2ViU29ja2V0U3RhZ2UnLFxuICAgICAge1xuICAgICAgICB3ZWJTb2NrZXRBcGk6IHRoaXMud2ViU29ja2V0QXBpLFxuICAgICAgICBzdGFnZU5hbWU6ICdwcm9kJyxcbiAgICAgICAgYXV0b0RlcGxveTogdHJ1ZSxcbiAgICAgIH1cbiAgICApO1xuICAgIHRoaXMub3duQ29udHJ1Y3RzLnB1c2godGhpcy53ZWJTb2NrZXRTdGFnZSk7XG4gICAgY29uc3Qgd2ViU29ja2V0QXBpUm91dGUgPSB0aGlzLndlYlNvY2tldEFwaS5hZGRSb3V0ZSgnJGNvbm5lY3QnLCB7XG4gICAgICBpbnRlZ3JhdGlvbjogbmV3IGFwaUd3VjJJbnQuV2ViU29ja2V0TGFtYmRhSW50ZWdyYXRpb24oXG4gICAgICAgICckY29ubmVjdCcsXG4gICAgICAgIGZ1bmN0aW9uT25Db25uZWN0XG4gICAgICApLFxuICAgIH0pO1xuICAgICh3ZWJTb2NrZXRBcGlSb3V0ZS5ub2RlLmRlZmF1bHRDaGlsZCBhcyBhZ3cuQ2ZuUm91dGUpLmF1dGhvcml6YXRpb25UeXBlID1cbiAgICAgICdBV1NfSUFNJztcblxuICAgIHRoaXMud2ViU29ja2V0QXBpLmFkZFJvdXRlKCckZGlzY29ubmVjdCcsIHtcbiAgICAgIGludGVncmF0aW9uOiBuZXcgYXBpR3dWMkludC5XZWJTb2NrZXRMYW1iZGFJbnRlZ3JhdGlvbihcbiAgICAgICAgJyRkaXNjb25uZWN0JyxcbiAgICAgICAgZnVuY3Rpb25PbkRpc2Nvbm5lY3RcbiAgICAgICksXG4gICAgfSk7XG5cbiAgICB0aGlzLmZ1bmN0aW9uU3Vic2NyaXB0aW9uTWFpbiA9IHRoaXMucHJvdmlkZUZ1bmN0aW9uRm9yU3Vic2NyaXB0aW9uKCk7XG5cbiAgICB0aGlzLndlYlNvY2tldEFwaS5hZGRSb3V0ZSgnc2VuZG1lc3NhZ2UnLCB7XG4gICAgICBpbnRlZ3JhdGlvbjogbmV3IGFwaUd3VjJJbnQuV2ViU29ja2V0TGFtYmRhSW50ZWdyYXRpb24oXG4gICAgICAgICdTZW5kTWVzc2FnZScsXG4gICAgICAgIHRoaXMuZnVuY3Rpb25TdWJzY3JpcHRpb25NYWluLmZ1bmN0aW9uXG4gICAgICApLFxuICAgIH0pO1xuXG4gICAgdGhpcy5pdGVyYXRlQWxsRWxlbWVudHMoU3RhY2sub2YodGhpcykpO1xuXG4gICAgLy9zZXQgbWFwcGluZyBwcm9wZXJ0eSBmb3IgYWxsIGZ1bmN0aW9ucyB3ZSBjcmVhdGVkXG4gICAgZm9yIChjb25zdCBmdW5jIG9mIHRoaXMuZnVuY3Rpb25TdWJzY3JpcHRpb25Qb29sKSB7XG4gICAgICBmdW5jLmZ1bmN0aW9uLmFkZEVudmlyb25tZW50KFxuICAgICAgICBlbnZWYXJpYWJsZU5hbWVzLklORlJBX01BUFBJTkcsXG4gICAgICAgIEpTT04uc3RyaW5naWZ5KGZ1bmMubWFwcGluZylcbiAgICAgICk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBmdW5jIG9mIHRoaXMuZnVuY3Rpb25zU3BpZWQpIHtcbiAgICAgIGZ1bmMuZnVuY3Rpb24uYWRkRW52aXJvbm1lbnQoXG4gICAgICAgIGVudlZhcmlhYmxlTmFtZXMuSU5GUkFfTUFQUElORyxcbiAgICAgICAgSlNPTi5zdHJpbmdpZnkoZnVuYy5tYXBwaW5nKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLndzVXJsID0gYHdzczovLyR7dGhpcy53ZWJTb2NrZXRBcGkuYXBpSWR9LmV4ZWN1dGUtYXBpLiR7XG4gICAgICBTdGFjay5vZih0aGlzKS5yZWdpb25cbiAgICB9LmFtYXpvbmF3cy5jb20vJHt0aGlzLndlYlNvY2tldFN0YWdlLnN0YWdlTmFtZX1gO1xuXG4gICAgbmV3IENmbk91dHB1dChTdGFjay5vZih0aGlzKSwgJ1NlcnZlcmxlc3NTcHlXc1VybCcsIHtcbiAgICAgIHZhbHVlOiB0aGlzLndzVXJsLFxuICAgIH0pO1xuXG4gICAgaWYgKHByb3BzPy5nZW5lcmF0ZVNweUV2ZW50c0ZpbGVMb2NhdGlvbikge1xuICAgICAgdGhpcy53cml0ZVNweUV2ZW50c0NsYXNzKHByb3BzPy5nZW5lcmF0ZVNweUV2ZW50c0ZpbGVMb2NhdGlvbik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRFeHRlbnNpb25Bc3NldExvY2F0aW9uKCkge1xuICAgIGxldCBleHRlbnNpb25Bc3NldExvY2F0aW9uID0gcGF0aC5qb2luKFxuICAgICAgX19kaXJuYW1lLFxuICAgICAgJy4uL2V4dGVuc2lvbi9kaXN0L2xheWVyJ1xuICAgICk7XG5cbiAgICBjb25zdCBleHRlbnNpb25Bc3NldExvY2F0aW9uQWx0ID0gcGF0aC5qb2luKFxuICAgICAgX19kaXJuYW1lLFxuICAgICAgJy4uL2xpYi9leHRlbnNpb24vZGlzdC9sYXllcidcbiAgICApO1xuXG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKGV4dGVuc2lvbkFzc2V0TG9jYXRpb24pKSB7XG4gICAgICBpZiAoIWZzLmV4aXN0c1N5bmMoZXh0ZW5zaW9uQXNzZXRMb2NhdGlvbkFsdCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBGb2xkZXIgd2l0aCBhc3NldHMgZm9yIGV4dGVuc2lvbiBkb2VzIG5vdCBleGlzdHMgYXQgJHtleHRlbnNpb25Bc3NldExvY2F0aW9ufSBvciBhdCAke2V4dGVuc2lvbkFzc2V0TG9jYXRpb25BbHR9IGBcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGV4dGVuc2lvbkFzc2V0TG9jYXRpb24gPSBleHRlbnNpb25Bc3NldExvY2F0aW9uQWx0O1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGV4dGVuc2lvbkFzc2V0TG9jYXRpb25XcmFwZXIgPSBwYXRoLmpvaW4oXG4gICAgICBleHRlbnNpb25Bc3NldExvY2F0aW9uLFxuICAgICAgJ3NweS13cmFwcGVyJ1xuICAgICk7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKGV4dGVuc2lvbkFzc2V0TG9jYXRpb25XcmFwZXIpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBXcmFwZXIgc2NyaXB0IGZvciBleHRlbnNpb24gZG9lcyBub3QgZXhpc3RzICR7ZXh0ZW5zaW9uQXNzZXRMb2NhdGlvbn1gXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGV4dGVuc2lvbkFzc2V0TG9jYXRpb25Db2RlID0gcGF0aC5qb2luKFxuICAgICAgZXh0ZW5zaW9uQXNzZXRMb2NhdGlvbixcbiAgICAgICdub2RlanMvbm9kZV9tb2R1bGVzL2ludGVyY2VwdG9yLmpzJ1xuICAgICk7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKGV4dGVuc2lvbkFzc2V0TG9jYXRpb25Db2RlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgQ29kZSBmb3IgZXh0ZW5zaW9uIGRvZXMgbm90IGV4aXN0cyAke2V4dGVuc2lvbkFzc2V0TG9jYXRpb25Db2RlfWBcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBleHRlbnNpb25Bc3NldExvY2F0aW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIFdyaXRlIFNweUV2ZW50cyBjbGFzcywgd2hpY2ggaGVscHMgd2l0aCB3cml0aW5nIHRoZSBjb2RlIGZvciB0ZXN0cy5cbiAgICogQHBhcmFtIGZpbGVMb2NhdGlvblxuICAgKi9cbiAgcHJpdmF0ZSB3cml0ZVNweUV2ZW50c0NsYXNzKGZpbGVMb2NhdGlvbjogc3RyaW5nKSB7XG4gICAgZnMubWtkaXJTeW5jKHBhdGguZGlybmFtZShmaWxlTG9jYXRpb24pLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAgIGNvbnN0IHByb3BlcnRpZXMgPSB0aGlzLnNlcnZpY2VLZXlzXG4gICAgICAubWFwKChzaykgPT4gYCAgJHtzay5yZXBsYWNlKC8jL2csICcnKX06ICcke3NrfScgPSAnJHtza30nO1xcbmApXG4gICAgICAuam9pbignJyk7XG5cbiAgICBjb25zdCBjb2RlID0gYC8qIGVzbGludC1kaXNhYmxlICovXFxuZXhwb3J0IGNsYXNzIFNlcnZlcmxlc3NTcHlFdmVudHMge1xcbiR7cHJvcGVydGllc319XFxuYDtcblxuICAgIGZzLndyaXRlRmlsZVN5bmMoZmlsZUxvY2F0aW9uLCBjb2RlKTtcbiAgfVxuXG4gIHByaXZhdGUgaXRlcmF0ZUFsbEVsZW1lbnRzKHBhcmVudDogSUNvbnN0cnVjdCkge1xuICAgIGZvciAoY29uc3Qgbm9kZSBvZiBwYXJlbnQubm9kZS5jaGlsZHJlbikge1xuICAgICAgaWYgKHRoaXMub3duQ29udHJ1Y3RzLmluY2x1ZGVzKG5vZGUpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5mdW5jdGlvblN1YnNjcmlwdGlvblBvb2wuZmluZCgocykgPT4gcy5mdW5jdGlvbiA9PT0gbm9kZSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgbGFtYmRhLkZ1bmN0aW9uKSB7XG4gICAgICAgIHRoaXMuc3B5RnVuY3Rpb24obm9kZSk7XG4gICAgICB9IGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBzbnMuVG9waWMpIHtcbiAgICAgICAgY29uc29sZS5sb2coJ2ludGVyY2VwdFNuc1RvcGljJyk7XG4gICAgICAgIHRoaXMuc3B5U25zVG9waWMobm9kZSk7XG4gICAgICB9IGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBzbnMuU3Vic2NyaXB0aW9uKSB7XG4gICAgICAgIHRoaXMuc3B5U25zU3Vic2NyaXB0aW9uKG5vZGUpO1xuICAgICAgfSBlbHNlIGlmIChub2RlIGluc3RhbmNlb2YgczMuQnVja2V0KSB7XG4gICAgICAgIHRoaXMuc3B5UzMobm9kZSk7XG4gICAgICB9IGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBkeW5hbW9EYi5UYWJsZSkge1xuICAgICAgICB0aGlzLnNweUR5bmFtb2RiKG5vZGUpO1xuICAgICAgfSBlbHNlIGlmIChub2RlIGluc3RhbmNlb2YgZXZlbnRzLkV2ZW50QnVzKSB7XG4gICAgICAgIHRoaXMuc3B5RXZlbnRCdXMobm9kZSk7XG4gICAgICB9IGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBldmVudHMuUnVsZSkge1xuICAgICAgICB0aGlzLnNweUV2ZW50QnVzUnVsZShub2RlKTtcbiAgICAgIH0gZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIGxhbWJkYS5DZm5FdmVudFNvdXJjZU1hcHBpbmcpIHtcbiAgICAgICAgdGhpcy5zcHlTcXMobm9kZSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuaXRlcmF0ZUFsbEVsZW1lbnRzKG5vZGUpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc3B5U3FzKG5vZGU6IGxhbWJkYS5DZm5FdmVudFNvdXJjZU1hcHBpbmcpIHtcbiAgICBjb25zdCBxdWV1ZSA9IHRoaXMuZmluZEVsZW1lbnQ8c3FzLlF1ZXVlPihcbiAgICAgIChuOiBJQ29uc3RydWN0KSA9PlxuICAgICAgICBuIGluc3RhbmNlb2Ygc3FzLlF1ZXVlICYmXG4gICAgICAgIChuIGFzIHNxcy5RdWV1ZSkucXVldWVBcm4gPT09IG5vZGUuZXZlbnRTb3VyY2VBcm5cbiAgICApO1xuXG4gICAgY29uc3QgZnVuYyA9IHRoaXMuZmluZEVsZW1lbnQ8bGFtYmRhLkZ1bmN0aW9uPihcbiAgICAgIChuOiBJQ29uc3RydWN0KSA9PlxuICAgICAgICBuIGluc3RhbmNlb2YgbGFtYmRhLkZ1bmN0aW9uICYmXG4gICAgICAgIChuIGFzIGxhbWJkYS5GdW5jdGlvbikuZnVuY3Rpb25OYW1lID09PSBub2RlLmZ1bmN0aW9uTmFtZVxuICAgICk7XG5cbiAgICBpZiAocXVldWUgJiYgZnVuYykge1xuICAgICAgY29uc3QgcXVldWVOYW1lID0gdGhpcy5nZXRDb25zdHJ1Y3ROYW1lKHF1ZXVlKTtcblxuICAgICAgY29uc3Qgc2VydmljZUtleSA9IGBTcXMjJHtxdWV1ZU5hbWV9YDtcblxuICAgICAgLy90aGlzLmZ1bmN0aW9uU3Vic2NyaXB0aW9uTWFpbi5tYXBwaW5nW3F1ZXVlLnF1ZXVlQXJuXSA9IHNlcnZpY2VLZXk7XG4gICAgICBmdW5jLmFkZEVudmlyb25tZW50KGVudlZhcmlhYmxlTmFtZXMuSU5GUkFfTUFQUElORywgSlNPTi5zdHJpbmdpZnkoe30pKTtcbiAgICAgIHRoaXMuYWRkTWFwcGluZ1RvRnVuY3Rpb24oZnVuYywge1xuICAgICAgICBrZXk6IHF1ZXVlLnF1ZXVlQXJuLFxuICAgICAgICB2YWx1ZTogc2VydmljZUtleSxcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLnNlcnZpY2VLZXlzLnB1c2goc2VydmljZUtleSk7XG4gICAgICBmdW5jLmFkZEVudmlyb25tZW50KFxuICAgICAgICBlbnZWYXJpYWJsZU5hbWVzLkZMVUVOVF9URVNUX1NVQlNDUklCRURfVE9fU1FTLFxuICAgICAgICAndHJ1ZSdcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVGdW5jdGlvbkZvclN1YnNjcmlwdGlvbihpbmRleDogbnVtYmVyKSB7XG4gICAgY29uc3QgZnVuYyA9IG5ldyBsYW1iZGFOb2RlLk5vZGVqc0Z1bmN0aW9uKHRoaXMsIGBTdWJzY3JpcHRpb24ke2luZGV4fWAsIHtcbiAgICAgIG1lbW9yeVNpemU6IDUxMixcbiAgICAgIHRpbWVvdXQ6IER1cmF0aW9uLnNlY29uZHMoNSksXG4gICAgICBydW50aW1lOiBsYW1iZGEuUnVudGltZS5OT0RFSlNfMTZfWCxcbiAgICAgIGhhbmRsZXI6ICdoYW5kbGVyJyxcbiAgICAgIGVudHJ5OiBnZXRBc3NldExvY2F0aW9uKCdmdW5jdGlvbnMvc2VuZE1lc3NhZ2UudHMnKSxcbiAgICAgIGVudmlyb25tZW50OiB7XG4gICAgICAgIFtlbnZWYXJpYWJsZU5hbWVzLlRBQkxFX05BTUVdOiB0aGlzLnRhYmxlLnRhYmxlTmFtZSxcbiAgICAgICAgTk9ERV9PUFRJT05TOiAnLS1lbmFibGUtc291cmNlLW1hcHMnLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIHRoaXMudGFibGUuZ3JhbnRXcml0ZURhdGEoZnVuYyk7XG4gICAgdGhpcy50YWJsZS5ncmFudFJlYWREYXRhKGZ1bmMpO1xuICAgIGZ1bmMuYWRkRW52aXJvbm1lbnQoZW52VmFyaWFibGVOYW1lcy5XU19FTkRQT0lOVCwgdGhpcy5nZXRXc0VuZHBvaW50KCkpO1xuXG4gICAgdGhpcy53ZWJTb2NrZXRBcGkuZ3JhbnRNYW5hZ2VDb25uZWN0aW9ucyhmdW5jKTtcbiAgICByZXR1cm4gZnVuYztcbiAgfVxuXG4gIHByaXZhdGUgZ2V0V3NFbmRwb2ludCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgaHR0cHM6Ly8ke3RoaXMud2ViU29ja2V0QXBpLmFwaUlkfS5leGVjdXRlLWFwaS4ke1xuICAgICAgU3RhY2sub2YodGhpcykucmVnaW9uXG4gICAgfS5hbWF6b25hd3MuY29tLyR7dGhpcy53ZWJTb2NrZXRTdGFnZS5zdGFnZU5hbWV9YDtcbiAgfVxuXG4gIHByaXZhdGUgc3B5UzMoczNCdWNrZXQ6IHMzLkJ1Y2tldCkge1xuICAgIHMzQnVja2V0LmFkZEV2ZW50Tm90aWZpY2F0aW9uKFxuICAgICAgczMuRXZlbnRUeXBlLk9CSkVDVF9DUkVBVEVEX1BVVCxcbiAgICAgIG5ldyBzM25vdGlmLkxhbWJkYURlc3RpbmF0aW9uKHRoaXMuZnVuY3Rpb25TdWJzY3JpcHRpb25NYWluLmZ1bmN0aW9uKVxuICAgICk7XG5cbiAgICBjb25zdCBuYW1lID0gdGhpcy5nZXRDb25zdHJ1Y3ROYW1lKHMzQnVja2V0KTtcblxuICAgIGNvbnN0IHNlcnZpY2VLZXkgPSBgUzMjJHtuYW1lfWA7XG4gICAgdGhpcy5mdW5jdGlvblN1YnNjcmlwdGlvbk1haW4ubWFwcGluZ1tzM0J1Y2tldC5idWNrZXRBcm5dID0gc2VydmljZUtleTtcbiAgICB0aGlzLnNlcnZpY2VLZXlzLnB1c2goc2VydmljZUtleSk7XG4gIH1cblxuICBwcml2YXRlIHNweUR5bmFtb2RiKHRhYmxlOiBkeW5hbW9EYi5UYWJsZSkge1xuICAgIC8vIGVuYWJsZSBEeW5hbW9EQiBzdHJlYW1zIHdpdGggYSBoYWNrXG4gICAgKHRhYmxlLm5vZGUuZGVmYXVsdENoaWxkIGFzIGR5bmFtb0RiLkNmblRhYmxlKS5zdHJlYW1TcGVjaWZpY2F0aW9uID0ge1xuICAgICAgc3RyZWFtVmlld1R5cGU6IGR5bmFtb0RiLlN0cmVhbVZpZXdUeXBlLk5FV19BTkRfT0xEX0lNQUdFUyxcbiAgICB9O1xuICAgICh0YWJsZSBhcyBhbnkpLnRhYmxlU3RyZWFtQXJuID0gKFxuICAgICAgdGFibGUubm9kZS5kZWZhdWx0Q2hpbGQgYXMgZHluYW1vRGIuQ2ZuVGFibGVcbiAgICApLmF0dHJTdHJlYW1Bcm47XG5cbiAgICB0aGlzLmZ1bmN0aW9uU3Vic2NyaXB0aW9uTWFpbi5mdW5jdGlvbi5hZGRFdmVudFNvdXJjZShcbiAgICAgIG5ldyBkeW5hbW9EYlN0cmVhbS5EeW5hbW9FdmVudFNvdXJjZSh0YWJsZSwge1xuICAgICAgICBzdGFydGluZ1Bvc2l0aW9uOiBsYW1iZGEuU3RhcnRpbmdQb3NpdGlvbi5MQVRFU1QsXG4gICAgICAgIGJhdGNoU2l6ZTogMSxcbiAgICAgICAgcmV0cnlBdHRlbXB0czogMCxcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIGNvbnN0IG5hbWUgPSB0aGlzLmdldENvbnN0cnVjdE5hbWUodGFibGUpO1xuXG4gICAgY29uc3Qgc2VydmljZUtleSA9IGBEeW5hbW9EQiMke25hbWV9YDtcbiAgICB0aGlzLmZ1bmN0aW9uU3Vic2NyaXB0aW9uTWFpbi5tYXBwaW5nW3RhYmxlLnRhYmxlQXJuXSA9IHNlcnZpY2VLZXk7XG4gICAgdGhpcy5zZXJ2aWNlS2V5cy5wdXNoKHNlcnZpY2VLZXkpO1xuICB9XG5cbiAgcHJpdmF0ZSBzcHlFdmVudEJ1c1J1bGUocnVsZTogZXZlbnRzLlJ1bGUpIHtcbiAgICBjb25zdCB7IGV2ZW50QnVzTmFtZSB9ID0gcnVsZS5ub2RlLmRlZmF1bHRDaGlsZCBhcyBldmVudHMuQ2ZuUnVsZTtcbiAgICBjb25zdCBldmVudEJyaWRnZSA9IHRoaXMuZ2V0RXZlbnRCcmlkZ2UoXG4gICAgICAocnVsZS5ub2RlLmRlZmF1bHRDaGlsZCBhcyBhbnkpLmV2ZW50QnVzTmFtZVxuICAgICk7XG5cbiAgICBpZiAoIWV2ZW50QnJpZGdlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbiBub3QgZmluZCBFdmVudEJyaWRnZSB3aXRoIG5hbWUgXCIke2V2ZW50QnVzTmFtZX1cImApO1xuICAgIH1cblxuICAgIGNvbnN0IGZ1bmN0aW9uU3Vic2NyaXB0aW9uID0gdGhpcy5wcm92aWRlRnVuY3Rpb25Gb3JTdWJzY3JpcHRpb24oXG4gICAgICAocykgPT4gIXMudXNlZEZvckV2ZW50QnJpZGdlXG4gICAgKTtcbiAgICBmdW5jdGlvblN1YnNjcmlwdGlvbi51c2VkRm9yRXZlbnRCcmlkZ2UgPSB0cnVlO1xuXG4gICAgcnVsZS5hZGRUYXJnZXQobmV3IHRhcmdldHMuTGFtYmRhRnVuY3Rpb24oZnVuY3Rpb25TdWJzY3JpcHRpb24uZnVuY3Rpb24pKTtcblxuICAgIGNvbnN0IGJyaWRnZU5hbWUgPSB0aGlzLmdldENvbnN0cnVjdE5hbWUoZXZlbnRCcmlkZ2UpO1xuICAgIGNvbnN0IHJ1bGVOYW1lID0gdGhpcy5nZXRDb25zdHJ1Y3ROYW1lKHJ1bGUpO1xuICAgIGNvbnN0IHNlcnZpY2VLZXkgPSBgRXZlbnRCcmlkZ2VSdWxlIyR7YnJpZGdlTmFtZX0jJHtydWxlTmFtZX1gO1xuICAgIGZ1bmN0aW9uU3Vic2NyaXB0aW9uLm1hcHBpbmcuZXZlbnRCcmlkZ2UgPSBzZXJ2aWNlS2V5O1xuICAgIHRoaXMuc2VydmljZUtleXMucHVzaChzZXJ2aWNlS2V5KTtcbiAgfVxuXG4gIHByaXZhdGUgc3B5RXZlbnRCdXMoZXZlbnRCdXM6IGV2ZW50cy5FdmVudEJ1cykge1xuICAgIGNvbnN0IGZ1bmN0aW9uU3Vic2NyaXB0aW9uID0gdGhpcy5wcm92aWRlRnVuY3Rpb25Gb3JTdWJzY3JpcHRpb24oXG4gICAgICAocykgPT4gIXMudXNlZEZvckV2ZW50QnJpZGdlXG4gICAgKTtcbiAgICBmdW5jdGlvblN1YnNjcmlwdGlvbi51c2VkRm9yRXZlbnRCcmlkZ2UgPSB0cnVlO1xuXG4gICAgY29uc3QgYnJpZGdlTmFtZSA9IHRoaXMuZ2V0Q29uc3RydWN0TmFtZShldmVudEJ1cyk7XG4gICAgY29uc3QgcnVsZSA9IG5ldyBldmVudHMuUnVsZSh0aGlzLCBgUnVsZUFsbCR7YnJpZGdlTmFtZX1gLCB7XG4gICAgICBldmVudEJ1cyxcbiAgICAgIGV2ZW50UGF0dGVybjogeyB2ZXJzaW9uOiBbJzAnXSB9LFxuICAgICAgdGFyZ2V0czogW25ldyB0YXJnZXRzLkxhbWJkYUZ1bmN0aW9uKGZ1bmN0aW9uU3Vic2NyaXB0aW9uLmZ1bmN0aW9uKV0sXG4gICAgfSk7XG5cbiAgICB0aGlzLm93bkNvbnRydWN0cy5wdXNoKHJ1bGUpO1xuICAgIGNvbnN0IHNlcnZpY2VLZXkgPSBgRXZlbnRCcmlkZ2UjJHticmlkZ2VOYW1lfWA7XG4gICAgZnVuY3Rpb25TdWJzY3JpcHRpb24ubWFwcGluZy5ldmVudEJyaWRnZSA9IHNlcnZpY2VLZXk7XG4gICAgdGhpcy5zZXJ2aWNlS2V5cy5wdXNoKHNlcnZpY2VLZXkpO1xuICB9XG5cbiAgcHJpdmF0ZSBzcHlTbnNUb3BpYyh0b3BpYzogc25zLlRvcGljKSB7XG4gICAgY29uc3QgZnVuY3Rpb25TdWJzY3JpcHRpb24gPSB0aGlzLnByb3ZpZGVGdW5jdGlvbkZvclN1YnNjcmlwdGlvbihcbiAgICAgIChzKSA9PiAhcy5zdWJzcmliZWRUb3BpY3MuaW5jbHVkZXModG9waWMpXG4gICAgKTtcblxuICAgIHRvcGljLmFkZFN1YnNjcmlwdGlvbihcbiAgICAgIG5ldyBzbnNTdWJzLkxhbWJkYVN1YnNjcmlwdGlvbihmdW5jdGlvblN1YnNjcmlwdGlvbi5mdW5jdGlvbilcbiAgICApO1xuICAgIGNvbnN0IHRvcGljTmFtZSA9IHRoaXMuZ2V0Q29uc3RydWN0TmFtZSh0b3BpYyk7XG4gICAgY29uc3Qgc2VydmljZUtleSA9IGBTbnNUb3BpYyMke3RvcGljTmFtZX1gO1xuICAgIGZ1bmN0aW9uU3Vic2NyaXB0aW9uLm1hcHBpbmdbdG9waWMudG9waWNBcm5dID0gc2VydmljZUtleTtcbiAgICB0aGlzLnNlcnZpY2VLZXlzLnB1c2goc2VydmljZUtleSk7XG4gICAgZnVuY3Rpb25TdWJzY3JpcHRpb24uc3Vic3JpYmVkVG9waWNzLnB1c2godG9waWMpO1xuICB9XG5cbiAgcHJpdmF0ZSBzcHlTbnNTdWJzY3JpcHRpb24oc3Vic2NyaXB0aW9uOiBzbnMuU3Vic2NyaXB0aW9uKSB7XG4gICAgaWYgKCFzdWJzY3JpcHRpb24ubm9kZS5zY29wZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHRvcGljID0gdGhpcy5nZXRUb3BpYyhcbiAgICAgIChzdWJzY3JpcHRpb24ubm9kZS5kZWZhdWx0Q2hpbGQgYXMgc25zLkNmblN1YnNjcmlwdGlvbikudG9waWNBcm5cbiAgICApO1xuXG4gICAgaWYgKCF0b3BpYykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW4gbm90IGZpbmQgVG9waWMnKTtcbiAgICB9XG5cbiAgICBjb25zdCBmdW5jdGlvblN1YnNjcmlwdGlvbiA9IHRoaXMucHJvdmlkZUZ1bmN0aW9uRm9yU3Vic2NyaXB0aW9uKFxuICAgICAgKHMpID0+ICFzLnN1YnNyaWJlZFRvcGljcy5pbmNsdWRlcyh0b3BpYylcbiAgICApO1xuXG4gICAgY29uc3QgeyBmaWx0ZXJQb2xpY3kgfSA9IHN1YnNjcmlwdGlvbi5ub2RlXG4gICAgICAuZGVmYXVsdENoaWxkIGFzIHNucy5DZm5TdWJzY3JpcHRpb247XG5cbiAgICBjb25zdCBzdWJzY3JpcHRpb25DbG9uZSA9IHRvcGljLmFkZFN1YnNjcmlwdGlvbihcbiAgICAgIG5ldyBzbnNTdWJzLkxhbWJkYVN1YnNjcmlwdGlvbihmdW5jdGlvblN1YnNjcmlwdGlvbi5mdW5jdGlvbilcbiAgICApO1xuICAgIChzdWJzY3JpcHRpb25DbG9uZS5ub2RlLmRlZmF1bHRDaGlsZCBhcyBzbnMuQ2ZuU3Vic2NyaXB0aW9uKS5maWx0ZXJQb2xpY3kgPVxuICAgICAgZmlsdGVyUG9saWN5O1xuXG4gICAgdGhpcy5vd25Db250cnVjdHMucHVzaChzdWJzY3JpcHRpb25DbG9uZSk7XG5cbiAgICBjb25zdCB0b3BpY05hbWUgPSB0aGlzLmdldENvbnN0cnVjdE5hbWUodG9waWMpO1xuICAgIGNvbnN0IHRhcmdldE5hbWUgPSB0aGlzLmdldENvbnN0cnVjdE5hbWUoc3Vic2NyaXB0aW9uLm5vZGUuc2NvcGUpO1xuXG4gICAgZnVuY3Rpb25TdWJzY3JpcHRpb24uc3Vic3JpYmVkVG9waWNzLnB1c2godG9waWMpO1xuICAgIGNvbnN0IHNlcnZpY2VLZXkgPSBgU25zU3Vic2NyaXB0aW9uIyR7dG9waWNOYW1lfSMke3RhcmdldE5hbWV9YDtcbiAgICBmdW5jdGlvblN1YnNjcmlwdGlvbi5tYXBwaW5nW3RvcGljLnRvcGljQXJuXSA9IHNlcnZpY2VLZXk7XG4gICAgdGhpcy5zZXJ2aWNlS2V5cy5wdXNoKHNlcnZpY2VLZXkpO1xuICB9XG5cbiAgcHJpdmF0ZSBwcm92aWRlRnVuY3Rpb25Gb3JTdWJzY3JpcHRpb24oXG4gICAgZmlsdGVyRnVuY3Rpb24/OiAoc3Vic2NyaXB0aW9uOiBGdW5jdGlvblN1YnNjcmlwdGlvbikgPT4gYm9vbGVhblxuICApIHtcbiAgICBsZXQgZnVuY3Rpb25TdWJzY3JpcHRpb246IEZ1bmN0aW9uU3Vic2NyaXB0aW9uIHwgdW5kZWZpbmVkO1xuXG4gICAgaWYgKGZpbHRlckZ1bmN0aW9uKSB7XG4gICAgICBmdW5jdGlvblN1YnNjcmlwdGlvbiA9IHRoaXMuZnVuY3Rpb25TdWJzY3JpcHRpb25Qb29sLmZpbmQoZmlsdGVyRnVuY3Rpb24pO1xuICAgIH0gZWxzZSBpZiAodGhpcy5mdW5jdGlvblN1YnNjcmlwdGlvblBvb2wubGVuZ3RoID4gMCkge1xuICAgICAgZnVuY3Rpb25TdWJzY3JpcHRpb24gPSB0aGlzLmZ1bmN0aW9uU3Vic2NyaXB0aW9uUG9vbFswXTtcbiAgICB9XG5cbiAgICBpZiAoIWZ1bmN0aW9uU3Vic2NyaXB0aW9uKSB7XG4gICAgICBmdW5jdGlvblN1YnNjcmlwdGlvbiA9IHtcbiAgICAgICAgc3Vic3JpYmVkVG9waWNzOiBbXSxcbiAgICAgICAgdXNlZEZvckV2ZW50QnJpZGdlOiBmYWxzZSxcbiAgICAgICAgbWFwcGluZzoge30sXG4gICAgICAgIGZ1bmN0aW9uOiB0aGlzLmNyZWF0ZUZ1bmN0aW9uRm9yU3Vic2NyaXB0aW9uKFxuICAgICAgICAgIHRoaXMuZnVuY3Rpb25TdWJzY3JpcHRpb25Qb29sLmxlbmd0aFxuICAgICAgICApLFxuICAgICAgfTtcbiAgICAgIHRoaXMuZnVuY3Rpb25TdWJzY3JpcHRpb25Qb29sLnB1c2goZnVuY3Rpb25TdWJzY3JpcHRpb24pO1xuICAgIH1cbiAgICByZXR1cm4gZnVuY3Rpb25TdWJzY3JpcHRpb247XG4gIH1cblxuICBwcml2YXRlIHNweUZ1bmN0aW9uKGZ1bmM6IGxhbWJkYS5GdW5jdGlvbikge1xuICAgIGZ1bmMuYWRkTGF5ZXJzKHRoaXMuZXh0ZW5zaW9uTGF5ZXIpO1xuXG4gICAgY29uc3QgZnVuY3Rpb25OYW1lID0gdGhpcy5nZXRDb25zdHJ1Y3ROYW1lKGZ1bmMpO1xuXG4gICAgZnVuYy5hZGRFbnZpcm9ubWVudChlbnZWYXJpYWJsZU5hbWVzLkZVTkNUSU9OX05BTUUsIGZ1bmN0aW9uTmFtZSk7XG4gICAgZnVuYy5hZGRFbnZpcm9ubWVudCgnQVdTX0xBTUJEQV9FWEVDX1dSQVBQRVInLCAnL29wdC9zcHktd3JhcHBlcicpO1xuICAgIGZ1bmMuYWRkRW52aXJvbm1lbnQoXG4gICAgICBlbnZWYXJpYWJsZU5hbWVzLkZMVUVOVF9URVNUX1NFTkRfRlVOQ1RJT05fTkFNRSxcbiAgICAgIHRoaXMuZnVuY3Rpb25TdWJzY3JpcHRpb25NYWluLmZ1bmN0aW9uLmZ1bmN0aW9uTmFtZVxuICAgICk7XG4gICAgZnVuYy5hZGRFbnZpcm9ubWVudChlbnZWYXJpYWJsZU5hbWVzLlRBQkxFX05BTUUsIHRoaXMudGFibGUudGFibGVOYW1lKTtcbiAgICBmdW5jLmFkZEVudmlyb25tZW50KGVudlZhcmlhYmxlTmFtZXMuV1NfRU5EUE9JTlQsIHRoaXMuZ2V0V3NFbmRwb2ludCgpKTtcblxuICAgIHRoaXMudGFibGUuZ3JhbnRXcml0ZURhdGEoZnVuYyk7XG4gICAgdGhpcy50YWJsZS5ncmFudFJlYWREYXRhKGZ1bmMpO1xuICAgIHRoaXMud2ViU29ja2V0QXBpLmdyYW50TWFuYWdlQ29ubmVjdGlvbnMoZnVuYyk7XG5cbiAgICB0aGlzLnNlcnZpY2VLZXlzLnB1c2goYEZ1bmN0aW9uIyR7ZnVuY3Rpb25OYW1lfSNSZXF1ZXN0YCk7XG4gICAgdGhpcy5zZXJ2aWNlS2V5cy5wdXNoKGBGdW5jdGlvbiMke2Z1bmN0aW9uTmFtZX0jRXJyb3JgKTtcbiAgICB0aGlzLnNlcnZpY2VLZXlzLnB1c2goYEZ1bmN0aW9uIyR7ZnVuY3Rpb25OYW1lfSNDb25zb2xlYCk7XG4gICAgdGhpcy5zZXJ2aWNlS2V5cy5wdXNoKGBGdW5jdGlvbiMke2Z1bmN0aW9uTmFtZX0jUmVzcG9uc2VgKTtcblxuICAgIHRoaXMuYWRkTWFwcGluZ1RvRnVuY3Rpb24oZnVuYyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0Q29uc3RydWN0TmFtZShjb25zdHJ1Y3Q6IElDb25zdHJ1Y3QpIHtcbiAgICBsZXQgZnVuY3Rpb25OYW1lID0gY29uc3RydWN0Lm5vZGUucGF0aDtcbiAgICBjb25zdCB7IHN0YWNrTmFtZSB9ID0gU3RhY2sub2YodGhpcyk7XG5cbiAgICBpZiAoZnVuY3Rpb25OYW1lLnN0YXJ0c1dpdGgoc3RhY2tOYW1lKSkge1xuICAgICAgZnVuY3Rpb25OYW1lID0gZnVuY3Rpb25OYW1lLnN1YnN0cmluZyhzdGFja05hbWUubGVuZ3RoICsgMSk7XG4gICAgfVxuICAgIHJldHVybiBmdW5jdGlvbk5hbWU7XG4gIH1cblxuICBwcml2YXRlIGdldFRvcGljKHRvcGljQXJuOiBzdHJpbmcpOiBzbnMuVG9waWMgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHRvcGljID0gdGhpcy5maW5kRWxlbWVudDxzbnMuVG9waWM+KFxuICAgICAgKG5vZGU6IElDb25zdHJ1Y3QpID0+XG4gICAgICAgIG5vZGUgaW5zdGFuY2VvZiBzbnMuVG9waWMgJiYgKG5vZGUgYXMgc25zLlRvcGljKS50b3BpY0FybiA9PT0gdG9waWNBcm5cbiAgICApO1xuXG4gICAgcmV0dXJuIHRvcGljO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRFdmVudEJyaWRnZShldmVudEJ1c05hbWU6IHN0cmluZyk6IGV2ZW50cy5FdmVudEJ1cyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgZXZlbnRCcmlkZ2UgPSB0aGlzLmZpbmRFbGVtZW50PGV2ZW50cy5FdmVudEJ1cz4oXG4gICAgICAobm9kZTogSUNvbnN0cnVjdCkgPT5cbiAgICAgICAgbm9kZSBpbnN0YW5jZW9mIGV2ZW50cy5FdmVudEJ1cyAmJlxuICAgICAgICAobm9kZSBhcyBldmVudHMuRXZlbnRCdXMpLmV2ZW50QnVzTmFtZSA9PT0gZXZlbnRCdXNOYW1lXG4gICAgKTtcblxuICAgIHJldHVybiBldmVudEJyaWRnZTtcbiAgfVxuXG4gIHByaXZhdGUgZmluZEVsZW1lbnQ8VCBleHRlbmRzIElDb25zdHJ1Y3QgPSBJQ29uc3RydWN0PihcbiAgICBmaWx0ZXJGdW5jOiAobm9kZTogSUNvbnN0cnVjdCkgPT4gYm9vbGVhbixcbiAgICBwYXJlbnQ/OiBJQ29uc3RydWN0XG4gICk6IFQgfCB1bmRlZmluZWQge1xuICAgIGlmICghcGFyZW50KSB7XG4gICAgICBwYXJlbnQgPSBTdGFjay5vZih0aGlzKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IG5vZGUgb2YgcGFyZW50Lm5vZGUuY2hpbGRyZW4pIHtcbiAgICAgIGlmIChmaWx0ZXJGdW5jKG5vZGUpKSB7XG4gICAgICAgIHJldHVybiBub2RlIGFzIFQ7XG4gICAgICB9XG4gICAgICB0aGlzLmZpbmRFbGVtZW50PFQ+KGZpbHRlckZ1bmMsIG5vZGUpO1xuICAgIH1cblxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBwcml2YXRlIGFkZE1hcHBpbmdUb0Z1bmN0aW9uKFxuICAgIGZ1bmM6IGxhbWJkYS5GdW5jdGlvbixcbiAgICBrZXlWYWx1ZT86IHsga2V5OiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfVxuICApIHtcbiAgICBmb3IgKGNvbnN0IGZzIG9mIHRoaXMuZnVuY3Rpb25zU3BpZWQpIHtcbiAgICAgIGlmIChmcy5mdW5jdGlvbiA9PT0gZnVuYykge1xuICAgICAgICBpZiAoa2V5VmFsdWUpIHtcbiAgICAgICAgICBmcy5tYXBwaW5nW2tleVZhbHVlLmtleV0gPSBrZXlWYWx1ZS52YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgZnM6IEZ1bmN0aW9uU3BpZWQgPSB7XG4gICAgICBmdW5jdGlvbjogZnVuYyxcbiAgICAgIG1hcHBpbmc6IHt9LFxuICAgIH07XG5cbiAgICBpZiAoa2V5VmFsdWUpIHtcbiAgICAgIGZzLm1hcHBpbmdba2V5VmFsdWUua2V5XSA9IGtleVZhbHVlLnZhbHVlO1xuICAgIH1cblxuICAgIHRoaXMuZnVuY3Rpb25zU3BpZWQucHVzaChmcyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0QXNzZXRMb2NhdGlvbihsb2NhdGlvbjogc3RyaW5nKSB7XG4gIGNvbnN0IGxvYyA9IHBhdGguam9pbihfX2Rpcm5hbWUsICcuLi8nICsgbG9jYXRpb24pO1xuXG4gIGlmIChmcy5leGlzdHNTeW5jKGxvYykpIHtcbiAgICByZXR1cm4gbG9jO1xuICB9XG5cbiAgY29uc3QgbG9jMiA9IHBhdGguam9pbihfX2Rpcm5hbWUsICcuLi8uLi8nICsgbG9jYXRpb24pO1xuXG4gIGlmIChmcy5leGlzdHNTeW5jKGxvYzIpKSB7XG4gICAgcmV0dXJuIGxvYzI7XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoYExvY2F0aW9uICR7bG9jfSBhbmQgJHtsb2MyfSBkb2VzIG5vdCBleGlzdHMuYCk7XG59XG5cbnR5cGUgRnVuY3Rpb25TdWJzY3JpcHRpb24gPSB7XG4gIHN1YnNyaWJlZFRvcGljczogc25zLlRvcGljW107XG4gIHVzZWRGb3JFdmVudEJyaWRnZTogYm9vbGVhbjtcbiAgZnVuY3Rpb246IGxhbWJkYU5vZGUuTm9kZWpzRnVuY3Rpb247XG4gIG1hcHBpbmc6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG59O1xuXG50eXBlIEZ1bmN0aW9uU3BpZWQgPSB7XG4gIGZ1bmN0aW9uOiBsYW1iZGEuRnVuY3Rpb247XG4gIG1hcHBpbmc6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG59O1xuIl19
@@ -0,0 +1,8 @@
1
+ export declare enum envVariableNames {
2
+ FLUENT_TEST_SUBSCRIBED_TO_SQS = "FLUENT_TEST_SUBSCRIBED_TO_SQS",
3
+ INFRA_MAPPING = "INFRA_MAPPING",
4
+ WS_ENDPOINT = "WS_ENDPOINT",
5
+ FUNCTION_NAME = "FUNCTION_NAME",
6
+ FLUENT_TEST_SEND_FUNCTION_NAME = "FLUENT_TEST_SEND_FUNCTION_NAME",
7
+ TABLE_NAME = "TABLE_NAME"
8
+ }
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ //this file is not under root -> common folder because jsii does not allow
3
+ //changing tsconfing.json to remove rootDir property
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ exports.envVariableNames = void 0;
6
+ var envVariableNames;
7
+ (function (envVariableNames) {
8
+ envVariableNames["FLUENT_TEST_SUBSCRIBED_TO_SQS"] = "FLUENT_TEST_SUBSCRIBED_TO_SQS";
9
+ envVariableNames["INFRA_MAPPING"] = "INFRA_MAPPING";
10
+ envVariableNames["WS_ENDPOINT"] = "WS_ENDPOINT";
11
+ envVariableNames["FUNCTION_NAME"] = "FUNCTION_NAME";
12
+ envVariableNames["FLUENT_TEST_SEND_FUNCTION_NAME"] = "FLUENT_TEST_SEND_FUNCTION_NAME";
13
+ envVariableNames["TABLE_NAME"] = "TABLE_NAME";
14
+ })(envVariableNames = exports.envVariableNames || (exports.envVariableNames = {}));
15
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW52VmFyaWFibGVOYW1lcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21tb24vZW52VmFyaWFibGVOYW1lcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsMEVBQTBFO0FBQzFFLG9EQUFvRDs7O0FBRXBELElBQVksZ0JBT1g7QUFQRCxXQUFZLGdCQUFnQjtJQUMxQixtRkFBK0QsQ0FBQTtJQUMvRCxtREFBK0IsQ0FBQTtJQUMvQiwrQ0FBMkIsQ0FBQTtJQUMzQixtREFBK0IsQ0FBQTtJQUMvQixxRkFBaUUsQ0FBQTtJQUNqRSw2Q0FBeUIsQ0FBQTtBQUMzQixDQUFDLEVBUFcsZ0JBQWdCLEdBQWhCLHdCQUFnQixLQUFoQix3QkFBZ0IsUUFPM0IiLCJzb3VyY2VzQ29udGVudCI6WyIvL3RoaXMgZmlsZSBpcyBub3QgdW5kZXIgcm9vdCAtPiBjb21tb24gZm9sZGVyIGJlY2F1c2UganNpaSBkb2VzIG5vdCBhbGxvd1xuLy9jaGFuZ2luZyB0c2NvbmZpbmcuanNvbiB0byByZW1vdmUgcm9vdERpciBwcm9wZXJ0eVxuXG5leHBvcnQgZW51bSBlbnZWYXJpYWJsZU5hbWVzIHtcbiAgRkxVRU5UX1RFU1RfU1VCU0NSSUJFRF9UT19TUVMgPSAnRkxVRU5UX1RFU1RfU1VCU0NSSUJFRF9UT19TUVMnLFxuICBJTkZSQV9NQVBQSU5HID0gJ0lORlJBX01BUFBJTkcnLFxuICBXU19FTkRQT0lOVCA9ICdXU19FTkRQT0lOVCcsXG4gIEZVTkNUSU9OX05BTUUgPSAnRlVOQ1RJT05fTkFNRScsXG4gIEZMVUVOVF9URVNUX1NFTkRfRlVOQ1RJT05fTkFNRSA9ICdGTFVFTlRfVEVTVF9TRU5EX0ZVTkNUSU9OX05BTUUnLFxuICBUQUJMRV9OQU1FID0gJ1RBQkxFX05BTUUnLFxufVxuIl19
@@ -0,0 +1,12 @@
1
+ //this file is not under root -> common folder because jsii does not allow
2
+ //changing tsconfing.json to remove rootDir property
3
+ export var envVariableNames;
4
+ (function (envVariableNames) {
5
+ envVariableNames["FLUENT_TEST_SUBSCRIBED_TO_SQS"] = "FLUENT_TEST_SUBSCRIBED_TO_SQS";
6
+ envVariableNames["INFRA_MAPPING"] = "INFRA_MAPPING";
7
+ envVariableNames["WS_ENDPOINT"] = "WS_ENDPOINT";
8
+ envVariableNames["FUNCTION_NAME"] = "FUNCTION_NAME";
9
+ envVariableNames["FLUENT_TEST_SEND_FUNCTION_NAME"] = "FLUENT_TEST_SEND_FUNCTION_NAME";
10
+ envVariableNames["TABLE_NAME"] = "TABLE_NAME";
11
+ })(envVariableNames || (envVariableNames = {}));
12
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW52VmFyaWFibGVOYW1lcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21tb24vZW52VmFyaWFibGVOYW1lcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwwRUFBMEU7QUFDMUUsb0RBQW9EO0FBRXBELE1BQU0sQ0FBTixJQUFZLGdCQU9YO0FBUEQsV0FBWSxnQkFBZ0I7SUFDMUIsbUZBQStELENBQUE7SUFDL0QsbURBQStCLENBQUE7SUFDL0IsK0NBQTJCLENBQUE7SUFDM0IsbURBQStCLENBQUE7SUFDL0IscUZBQWlFLENBQUE7SUFDakUsNkNBQXlCLENBQUE7QUFDM0IsQ0FBQyxFQVBXLGdCQUFnQixLQUFoQixnQkFBZ0IsUUFPM0IiLCJzb3VyY2VzQ29udGVudCI6WyIvL3RoaXMgZmlsZSBpcyBub3QgdW5kZXIgcm9vdCAtPiBjb21tb24gZm9sZGVyIGJlY2F1c2UganNpaSBkb2VzIG5vdCBhbGxvd1xuLy9jaGFuZ2luZyB0c2NvbmZpbmcuanNvbiB0byByZW1vdmUgcm9vdERpciBwcm9wZXJ0eVxuXG5leHBvcnQgZW51bSBlbnZWYXJpYWJsZU5hbWVzIHtcbiAgRkxVRU5UX1RFU1RfU1VCU0NSSUJFRF9UT19TUVMgPSAnRkxVRU5UX1RFU1RfU1VCU0NSSUJFRF9UT19TUVMnLFxuICBJTkZSQV9NQVBQSU5HID0gJ0lORlJBX01BUFBJTkcnLFxuICBXU19FTkRQT0lOVCA9ICdXU19FTkRQT0lOVCcsXG4gIEZVTkNUSU9OX05BTUUgPSAnRlVOQ1RJT05fTkFNRScsXG4gIEZMVUVOVF9URVNUX1NFTkRfRlVOQ1RJT05fTkFNRSA9ICdGTFVFTlRfVEVTVF9TRU5EX0ZVTkNUSU9OX05BTUUnLFxuICBUQUJMRV9OQU1FID0gJ1RBQkxFX05BTUUnLFxufVxuIl19
@@ -1,15 +1,13 @@
1
- import { DynamoDBSpyEvent } from './../common/spyEvents/DynamoDBSpyEvent';
2
- import { EventBridgeRuleSpyEvent } from './../common/spyEvents/EventBridgeRuleSpyEvent';
3
- import { EventBridgeSpyEvent } from './../common/spyEvents/EventBridgeSpyEvent';
4
- import { FunctionConsoleSpyEvent } from './../common/spyEvents/FunctionConsoleSpyEvent';
5
- import { FunctionRequestSpyEvent } from './../common/spyEvents/FunctionRequestSpyEvent';
6
- import { FunctionResponseSpyEvent } from './../common/spyEvents/FunctionResponseSpyEvent';
7
- import { S3SpyEvent } from './../common/spyEvents/S3SpyEvent';
8
- import { SnsSubscriptionSpyEvent } from './../common/spyEvents/SnsSubscriptionSpyEvent';
9
- import { SnsTopicSpyEvent } from './../common/spyEvents/SnsTopicSpyEvent';
10
- import { SqsSpyEvent } from './../common/spyEvents/SqsSpyEvent';
11
-
12
- import { WaitForParams } from './createServerlessSpyListener';
1
+ import { DynamoDBSpyEvent } from '../common/spyEvents/DynamoDBSpyEvent';
2
+ import { EventBridgeRuleSpyEvent } from '../common/spyEvents/EventBridgeRuleSpyEvent';
3
+ import { EventBridgeSpyEvent } from '../common/spyEvents/EventBridgeSpyEvent';
4
+ import { FunctionConsoleSpyEvent } from '../common/spyEvents/FunctionConsoleSpyEvent';
5
+ import { FunctionRequestSpyEvent } from '../common/spyEvents/FunctionRequestSpyEvent';
6
+ import { FunctionResponseSpyEvent } from '../common/spyEvents/FunctionResponseSpyEvent';
7
+ import { S3SpyEvent } from '../common/spyEvents/S3SpyEvent';
8
+ import { SnsSubscriptionSpyEvent } from '../common/spyEvents/SnsSubscriptionSpyEvent';
9
+ import { SnsTopicSpyEvent } from '../common/spyEvents/SnsTopicSpyEvent';
10
+ import { SqsSpyEvent } from '../common/spyEvents/SqsSpyEvent';
13
11
  import { PrettifyForDisplay } from './PrettifyForDisplay';
14
12
  import {
15
13
  DynamoDBSpyHandler,
@@ -23,8 +21,9 @@ import {
23
21
  FunctionConsoleSpyHandler,
24
22
  FunctionResponseSpyHandler,
25
23
  } from './SpyHandlers.ts';
24
+ import { WaitForParams } from './WaitForParams';
26
25
 
27
- export type SpyListener<TSpyEvents> = {
26
+ export type ServerlessSpyListener<TSpyEvents> = {
28
27
  [P in keyof FilterConditionally<TSpyEvents, `DynamoDB#${any}`> &
29
28
  string as `waitFor${P}`]: <T = any>(
30
29
  param?: PrettifyForDisplay<
@@ -0,0 +1,6 @@
1
+ import { Credentials } from '@aws-sdk/types';
2
+
3
+ export type ServerlessSpyListenerParams = {
4
+ serverlessSpyWsUrl: string;
5
+ credentials?: Credentials;
6
+ };
@@ -127,7 +127,7 @@ export interface FunctionBaseSpyHandler<TData = any>
127
127
  // PrettifyForDisplay<FunctionResponseSpyEvent<TData, TDataResponse>>
128
128
  // >
129
129
  // >
130
- param: {
130
+ param?: {
131
131
  condition?: (event: {
132
132
  spyEventType: 'FunctionResponse';
133
133
  request: TData;
@@ -0,0 +1,6 @@
1
+ import { SpyEvent } from '../common/spyEvents/SpyEvent';
2
+
3
+ export interface WaitForParams<TSpyEvent extends SpyEvent = SpyEvent> {
4
+ condition?: (event: TSpyEvent) => boolean;
5
+ timoutMs?: number;
6
+ }