serverless-spy 0.0.34 → 0.0.36

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.
@@ -8,7 +8,9 @@ import * as events from 'aws-cdk-lib/aws-events';
8
8
  import * as targets from 'aws-cdk-lib/aws-events-targets';
9
9
  import * as lambda from 'aws-cdk-lib/aws-lambda';
10
10
  import * as dynamoDbStream from 'aws-cdk-lib/aws-lambda-event-sources';
11
+ import { SqsEventSource } from 'aws-cdk-lib/aws-lambda-event-sources';
11
12
  import * as lambdaNode from 'aws-cdk-lib/aws-lambda-nodejs';
13
+ import { NodejsFunction } from 'aws-cdk-lib/aws-lambda-nodejs';
12
14
  import * as s3 from 'aws-cdk-lib/aws-s3';
13
15
  import * as s3notif from 'aws-cdk-lib/aws-s3-notifications';
14
16
  import * as sns from 'aws-cdk-lib/aws-sns';
@@ -19,10 +21,12 @@ import { envVariableNames } from './common/envVariableNames';
19
21
  export class ServerlessSpy extends Construct {
20
22
  constructor(scope, id, props) {
21
23
  super(scope, id);
22
- this.ownContructs = [];
23
- this.functionSubscriptionPool = [];
24
- this.functionsSpied = [];
24
+ this.props = props;
25
+ this.createdResourcesBySSpy = [];
26
+ this.lambdaSubscriptionPool = [];
27
+ this.lambdasSpied = [];
25
28
  this.serviceKeys = [];
29
+ this.spiedNodes = [];
26
30
  this.extensionLayer = new lambda.LayerVersion(this, 'Extension', {
27
31
  compatibleRuntimes: [
28
32
  lambda.Runtime.NODEJS_12_X,
@@ -31,7 +35,7 @@ export class ServerlessSpy extends Construct {
31
35
  ],
32
36
  code: lambda.Code.fromAsset(this.getExtensionAssetLocation()),
33
37
  });
34
- this.ownContructs.push(this.extensionLayer);
38
+ this.createdResourcesBySSpy.push(this.extensionLayer);
35
39
  this.table = new dynamoDb.Table(this, 'WebSocket', {
36
40
  partitionKey: {
37
41
  name: 'connectionId',
@@ -39,41 +43,39 @@ export class ServerlessSpy extends Construct {
39
43
  },
40
44
  billingMode: dynamoDb.BillingMode.PAY_PER_REQUEST,
41
45
  });
42
- this.ownContructs.push(this.table);
46
+ this.createdResourcesBySSpy.push(this.table);
47
+ const envVars = this.getDafaultLambdaEnvironmentVariables();
48
+ if (this.props?.debugMode) {
49
+ envVars[envVariableNames.SSPY_DEBUG] = 'true';
50
+ }
43
51
  const functionOnConnect = new lambdaNode.NodejsFunction(this, 'OnConnect', {
44
52
  memorySize: 512,
45
53
  timeout: Duration.seconds(5),
46
54
  runtime: lambda.Runtime.NODEJS_16_X,
47
55
  handler: 'handler',
48
- entry: getAssetLocation('functions/onConnect.ts'),
49
- environment: {
50
- [envVariableNames.TABLE_NAME]: this.table.tableName,
51
- NODE_OPTIONS: '--enable-source-maps',
52
- },
56
+ entry: this.getAssetLocation('functions/onConnect.ts'),
57
+ environment: envVars,
53
58
  });
54
59
  this.table.grantWriteData(functionOnConnect);
55
- this.ownContructs.push(functionOnConnect);
60
+ this.createdResourcesBySSpy.push(functionOnConnect);
56
61
  const functionOnDisconnect = new lambdaNode.NodejsFunction(this, 'OnDisconnect', {
57
62
  memorySize: 512,
58
63
  timeout: Duration.seconds(5),
59
64
  runtime: lambda.Runtime.NODEJS_16_X,
60
65
  handler: 'handler',
61
- entry: getAssetLocation('functions/onDisconnect.ts'),
62
- environment: {
63
- [envVariableNames.TABLE_NAME]: this.table.tableName,
64
- NODE_OPTIONS: '--enable-source-maps',
65
- },
66
+ entry: this.getAssetLocation('functions/onDisconnect.ts'),
67
+ environment: envVars,
66
68
  });
67
69
  this.table.grantWriteData(functionOnDisconnect);
68
- this.ownContructs.push(functionOnDisconnect);
70
+ this.createdResourcesBySSpy.push(functionOnDisconnect);
69
71
  this.webSocketApi = new apiGwV2.WebSocketApi(this, 'ApiGwWebSocket');
70
- this.ownContructs.push(this.webSocketApi);
72
+ this.createdResourcesBySSpy.push(this.webSocketApi);
71
73
  this.webSocketStage = new apiGwV2.WebSocketStage(this, 'ApiGwWebSocketStage', {
72
74
  webSocketApi: this.webSocketApi,
73
75
  stageName: 'prod',
74
76
  autoDeploy: true,
75
77
  });
76
- this.ownContructs.push(this.webSocketStage);
78
+ this.createdResourcesBySSpy.push(this.webSocketStage);
77
79
  const webSocketApiRoute = this.webSocketApi.addRoute('$connect', {
78
80
  integration: new apiGwV2Int.WebSocketLambdaIntegration('$connect', functionOnConnect),
79
81
  });
@@ -82,24 +84,105 @@ export class ServerlessSpy extends Construct {
82
84
  this.webSocketApi.addRoute('$disconnect', {
83
85
  integration: new apiGwV2Int.WebSocketLambdaIntegration('$disconnect', functionOnDisconnect),
84
86
  });
85
- this.functionSubscriptionMain = this.provideFunctionForSubscription();
87
+ this.lambdaSubscriptionMain = this.provideFunctionForSubscription();
86
88
  this.webSocketApi.addRoute('sendmessage', {
87
- integration: new apiGwV2Int.WebSocketLambdaIntegration('SendMessage', this.functionSubscriptionMain.function),
89
+ integration: new apiGwV2Int.WebSocketLambdaIntegration('SendMessage', this.lambdaSubscriptionMain.function),
88
90
  });
89
- this.iterateAllElements(Stack.of(this));
90
- //set mapping property for all functions we created
91
- for (const func of this.functionSubscriptionPool) {
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));
96
- }
97
91
  this.wsUrl = `wss://${this.webSocketApi.apiId}.execute-api.${Stack.of(this).region}.amazonaws.com/${this.webSocketStage.stageName}`;
98
92
  new CfnOutput(Stack.of(this), 'ServerlessSpyWsUrl', {
99
93
  value: this.wsUrl,
100
94
  });
101
- if (props?.generateSpyEventsFileLocation) {
102
- this.writeSpyEventsClass(props?.generateSpyEventsFileLocation);
95
+ }
96
+ getDafaultLambdaEnvironmentVariables() {
97
+ return {
98
+ [envVariableNames.SSPY_WS_TABLE_NAME]: this.table.tableName,
99
+ NODE_OPTIONS: '--enable-source-maps',
100
+ };
101
+ }
102
+ /**
103
+ * Initalize spying on resources given as parameter.
104
+ * @param nodes Which reources and their children to spy on.
105
+ */
106
+ spyNodes(nodes) {
107
+ for (const node of nodes) {
108
+ let ns = this.getAllNodes(node);
109
+ this.internalSpyNodes(ns);
110
+ }
111
+ this.finializeSpy();
112
+ }
113
+ /**
114
+ * Initalize spying on resources.
115
+ * @param filter Limit which resources to spy on.
116
+ */
117
+ spy(filter) {
118
+ let nodes = this.getAllNodes(Stack.of(this));
119
+ const filterWithDefaults = {
120
+ spyLambda: true,
121
+ spySqs: true,
122
+ spySnsTopic: true,
123
+ spySnsSubsription: true,
124
+ spyEventBridge: true,
125
+ spyEventBridgeRule: true,
126
+ spyS3: true,
127
+ spyDynamoDB: true,
128
+ ...filter,
129
+ };
130
+ nodes = nodes.filter((node) => {
131
+ if (filterWithDefaults.spyLambda && node instanceof lambda.Function) {
132
+ return true;
133
+ }
134
+ else if (filterWithDefaults.spySnsTopic && node instanceof sns.Topic) {
135
+ return true;
136
+ }
137
+ else if (filterWithDefaults.spySnsSubsription &&
138
+ node instanceof sns.Subscription) {
139
+ return true;
140
+ }
141
+ else if (filterWithDefaults.spyS3 && node instanceof s3.Bucket) {
142
+ return true;
143
+ }
144
+ else if (filterWithDefaults.spyDynamoDB &&
145
+ node instanceof dynamoDb.Table) {
146
+ return true;
147
+ }
148
+ else if (filterWithDefaults.spyEventBridge &&
149
+ node instanceof events.EventBus) {
150
+ return true;
151
+ }
152
+ else if (filterWithDefaults.spyEventBridgeRule &&
153
+ node instanceof events.Rule) {
154
+ return true;
155
+ }
156
+ else if (filterWithDefaults.spySqs &&
157
+ node instanceof lambda.CfnEventSourceMapping) {
158
+ return true;
159
+ }
160
+ else if (filterWithDefaults.spySqs &&
161
+ this.props?.spySqsWithNoSubscriptionAndDropAllMessages &&
162
+ node instanceof sqs.Queue) {
163
+ return true;
164
+ }
165
+ return false;
166
+ });
167
+ this.internalSpyNodes(nodes);
168
+ this.finializeSpy();
169
+ }
170
+ internalSpyNodes(nodes) {
171
+ for (const node of nodes) {
172
+ this.internalSpyNode(node);
173
+ }
174
+ }
175
+ finializeSpy() {
176
+ //set mapping property for all functions we created
177
+ for (const func of this.lambdaSubscriptionPool) {
178
+ func.function.addEnvironment(envVariableNames.SSPY_INFRA_MAPPING, JSON.stringify(func.mapping));
179
+ }
180
+ //set mapping property for all functions we spy on
181
+ for (const func of this.lambdasSpied) {
182
+ func.function.addEnvironment(envVariableNames.SSPY_INFRA_MAPPING, JSON.stringify(func.mapping));
183
+ }
184
+ if (this.props?.generateSpyEventsFileLocation) {
185
+ this.writeSpyEventsClass(this.props?.generateSpyEventsFileLocation);
103
186
  }
104
187
  }
105
188
  getExtensionAssetLocation() {
@@ -135,43 +218,102 @@ export class ServerlessSpy extends Construct {
135
218
  const code = `/* eslint-disable */\nexport class ServerlessSpyEvents {\n${properties}}\n`;
136
219
  fs.writeFileSync(fileLocation, code);
137
220
  }
138
- iterateAllElements(parent) {
221
+ getAllNodes(parent) {
222
+ const nodes = [];
223
+ nodes.push(parent);
224
+ this.getAllNodesRecursive(parent, nodes);
225
+ return nodes;
226
+ }
227
+ getAllNodesRecursive(parent, nodes) {
139
228
  for (const node of parent.node.children) {
140
- if (this.ownContructs.includes(node)) {
141
- continue;
142
- }
143
- if (this.functionSubscriptionPool.find((s) => s.function === node)) {
144
- continue;
145
- }
146
- if (node instanceof lambda.Function) {
147
- this.spyFunction(node);
148
- }
149
- else if (node instanceof sns.Topic) {
150
- console.log('interceptSnsTopic');
151
- this.spySnsTopic(node);
152
- }
153
- else if (node instanceof sns.Subscription) {
154
- this.spySnsSubscription(node);
155
- }
156
- else if (node instanceof s3.Bucket) {
157
- this.spyS3(node);
158
- }
159
- else if (node instanceof dynamoDb.Table) {
160
- this.spyDynamodb(node);
161
- }
162
- else if (node instanceof events.EventBus) {
163
- this.spyEventBus(node);
164
- }
165
- else if (node instanceof events.Rule) {
166
- this.spyEventBusRule(node);
167
- }
168
- else if (node instanceof lambda.CfnEventSourceMapping) {
169
- this.spySqs(node);
229
+ nodes.push(node);
230
+ this.getAllNodesRecursive(node, nodes);
231
+ }
232
+ }
233
+ internalSpyNode(node) {
234
+ if (this.spiedNodes.includes(node)) {
235
+ return;
236
+ }
237
+ this.spiedNodes.push(node);
238
+ if (this.createdResourcesBySSpy.includes(node)) {
239
+ return;
240
+ }
241
+ if (this.lambdaSubscriptionPool.find((s) => s.function === node)) {
242
+ return;
243
+ }
244
+ if (this.props?.debugMode) {
245
+ console.info('Spy on node', this.getConstructName(node));
246
+ }
247
+ if (node instanceof lambda.Function) {
248
+ this.internalSpyLambda(node);
249
+ }
250
+ else if (node instanceof sns.Topic) {
251
+ this.internalSpySnsTopic(node);
252
+ }
253
+ else if (node instanceof sns.Subscription) {
254
+ this.internalSpySnsSubscription(node);
255
+ }
256
+ else if (node instanceof s3.Bucket) {
257
+ this.internalSpyS3(node);
258
+ }
259
+ else if (node instanceof dynamoDb.Table) {
260
+ this.internalSpyDynamodb(node);
261
+ }
262
+ else if (node instanceof events.EventBus) {
263
+ this.internalSpyEventBus(node);
264
+ }
265
+ else if (node instanceof events.Rule) {
266
+ this.internalSpyEventBusRule(node);
267
+ }
268
+ else if (node instanceof lambda.CfnEventSourceMapping) {
269
+ this.internalSpySqs(node);
270
+ }
271
+ else if (node instanceof sqs.Queue) {
272
+ if (this.props?.spySqsWithNoSubscriptionAndDropAllMessages) {
273
+ this.internalSpySpySqsWithNoSubscription(node);
170
274
  }
171
- this.iterateAllElements(node);
172
275
  }
173
276
  }
174
- spySqs(node) {
277
+ internalSpySpySqsWithNoSubscription(queue) {
278
+ const subscription = this.findElement((n) => n instanceof lambda.CfnEventSourceMapping &&
279
+ n.eventSourceArn === queue.queueArn);
280
+ if (subscription) {
281
+ return; //already have subscription
282
+ }
283
+ console.log('********** ADD LAMBDA *******************');
284
+ const queueName = this.getConstructName(queue);
285
+ const func = new NodejsFunction(this, `${queueName}SqsSubscriptionAndDropAllMessages`, {
286
+ memorySize: 512,
287
+ timeout: Duration.seconds(5),
288
+ runtime: lambda.Runtime.NODEJS_16_X,
289
+ handler: 'handler',
290
+ entry: this.getAssetLocation('functions/sqsSubscriptionAndDropAllMessages.ts'),
291
+ environment: this.getDafaultLambdaEnvironmentVariables(),
292
+ });
293
+ func.addEventSource(new SqsEventSource(queue));
294
+ //
295
+ func.addLayers(this.extensionLayer);
296
+ //const functionName = this.getConstructName(func);
297
+ //func.addEnvironment(envVariableNames.SSPY_FUNCTION_NAME, functionName);
298
+ func.addEnvironment('AWS_LAMBDA_EXEC_WRAPPER', '/opt/spy-wrapper');
299
+ func.addEnvironment(envVariableNames.SSPY_WS_ENDPOINT, this.getWsEndpoint());
300
+ if (this.props?.debugMode) {
301
+ func.addEnvironment(envVariableNames.SSPY_DEBUG, 'true');
302
+ }
303
+ this.table.grantWriteData(func);
304
+ this.table.grantReadData(func);
305
+ this.webSocketApi.grantManageConnections(func);
306
+ //
307
+ this.createdResourcesBySSpy.push(func);
308
+ const serviceKey = `Sqs#${queueName}`;
309
+ this.addMappingToFunction(func, {
310
+ key: queue.queueArn,
311
+ value: serviceKey,
312
+ });
313
+ this.serviceKeys.push(serviceKey);
314
+ func.addEnvironment(envVariableNames.SSPY_SUBSCRIBED_TO_SQS, 'true');
315
+ }
316
+ internalSpySqs(node) {
175
317
  const queue = this.findElement((n) => n instanceof sqs.Queue &&
176
318
  n.queueArn === node.eventSourceArn);
177
319
  const func = this.findElement((n) => n instanceof lambda.Function &&
@@ -179,14 +321,12 @@ export class ServerlessSpy extends Construct {
179
321
  if (queue && func) {
180
322
  const queueName = this.getConstructName(queue);
181
323
  const serviceKey = `Sqs#${queueName}`;
182
- //this.functionSubscriptionMain.mapping[queue.queueArn] = serviceKey;
183
- func.addEnvironment(envVariableNames.INFRA_MAPPING, JSON.stringify({}));
184
324
  this.addMappingToFunction(func, {
185
325
  key: queue.queueArn,
186
326
  value: serviceKey,
187
327
  });
188
328
  this.serviceKeys.push(serviceKey);
189
- func.addEnvironment(envVariableNames.FLUENT_TEST_SUBSCRIBED_TO_SQS, 'true');
329
+ func.addEnvironment(envVariableNames.SSPY_SUBSCRIBED_TO_SQS, 'true');
190
330
  }
191
331
  }
192
332
  createFunctionForSubscription(index) {
@@ -195,45 +335,45 @@ export class ServerlessSpy extends Construct {
195
335
  timeout: Duration.seconds(5),
196
336
  runtime: lambda.Runtime.NODEJS_16_X,
197
337
  handler: 'handler',
198
- entry: getAssetLocation('functions/sendMessage.ts'),
338
+ entry: this.getAssetLocation('functions/sendMessage.ts'),
199
339
  environment: {
200
- [envVariableNames.TABLE_NAME]: this.table.tableName,
340
+ [envVariableNames.SSPY_WS_TABLE_NAME]: this.table.tableName,
201
341
  NODE_OPTIONS: '--enable-source-maps',
202
342
  },
203
343
  });
204
344
  this.table.grantWriteData(func);
205
345
  this.table.grantReadData(func);
206
- func.addEnvironment(envVariableNames.WS_ENDPOINT, this.getWsEndpoint());
346
+ func.addEnvironment(envVariableNames.SSPY_WS_ENDPOINT, this.getWsEndpoint());
207
347
  this.webSocketApi.grantManageConnections(func);
208
348
  return func;
209
349
  }
210
350
  getWsEndpoint() {
211
351
  return `https://${this.webSocketApi.apiId}.execute-api.${Stack.of(this).region}.amazonaws.com/${this.webSocketStage.stageName}`;
212
352
  }
213
- spyS3(s3Bucket) {
214
- s3Bucket.addEventNotification(s3.EventType.OBJECT_CREATED_PUT, new s3notif.LambdaDestination(this.functionSubscriptionMain.function));
353
+ internalSpyS3(s3Bucket) {
354
+ s3Bucket.addEventNotification(s3.EventType.OBJECT_CREATED_PUT, new s3notif.LambdaDestination(this.lambdaSubscriptionMain.function));
215
355
  const name = this.getConstructName(s3Bucket);
216
356
  const serviceKey = `S3#${name}`;
217
- this.functionSubscriptionMain.mapping[s3Bucket.bucketArn] = serviceKey;
357
+ this.lambdaSubscriptionMain.mapping[s3Bucket.bucketArn] = serviceKey;
218
358
  this.serviceKeys.push(serviceKey);
219
359
  }
220
- spyDynamodb(table) {
360
+ internalSpyDynamodb(table) {
221
361
  // enable DynamoDB streams with a hack
222
362
  table.node.defaultChild.streamSpecification = {
223
363
  streamViewType: dynamoDb.StreamViewType.NEW_AND_OLD_IMAGES,
224
364
  };
225
365
  table.tableStreamArn = table.node.defaultChild.attrStreamArn;
226
- this.functionSubscriptionMain.function.addEventSource(new dynamoDbStream.DynamoEventSource(table, {
366
+ this.lambdaSubscriptionMain.function.addEventSource(new dynamoDbStream.DynamoEventSource(table, {
227
367
  startingPosition: lambda.StartingPosition.LATEST,
228
368
  batchSize: 1,
229
369
  retryAttempts: 0,
230
370
  }));
231
371
  const name = this.getConstructName(table);
232
372
  const serviceKey = `DynamoDB#${name}`;
233
- this.functionSubscriptionMain.mapping[table.tableArn] = serviceKey;
373
+ this.lambdaSubscriptionMain.mapping[table.tableArn] = serviceKey;
234
374
  this.serviceKeys.push(serviceKey);
235
375
  }
236
- spyEventBusRule(rule) {
376
+ internalSpyEventBusRule(rule) {
237
377
  const { eventBusName } = rule.node.defaultChild;
238
378
  const eventBridge = this.getEventBridge(rule.node.defaultChild.eventBusName);
239
379
  if (!eventBridge) {
@@ -248,7 +388,7 @@ export class ServerlessSpy extends Construct {
248
388
  functionSubscription.mapping.eventBridge = serviceKey;
249
389
  this.serviceKeys.push(serviceKey);
250
390
  }
251
- spyEventBus(eventBus) {
391
+ internalSpyEventBus(eventBus) {
252
392
  const functionSubscription = this.provideFunctionForSubscription((s) => !s.usedForEventBridge);
253
393
  functionSubscription.usedForEventBridge = true;
254
394
  const bridgeName = this.getConstructName(eventBus);
@@ -257,21 +397,22 @@ export class ServerlessSpy extends Construct {
257
397
  eventPattern: { version: ['0'] },
258
398
  targets: [new targets.LambdaFunction(functionSubscription.function)],
259
399
  });
260
- this.ownContructs.push(rule);
400
+ this.createdResourcesBySSpy.push(rule);
261
401
  const serviceKey = `EventBridge#${bridgeName}`;
262
402
  functionSubscription.mapping.eventBridge = serviceKey;
263
403
  this.serviceKeys.push(serviceKey);
264
404
  }
265
- spySnsTopic(topic) {
405
+ internalSpySnsTopic(topic) {
266
406
  const functionSubscription = this.provideFunctionForSubscription((s) => !s.subsribedTopics.includes(topic));
267
- topic.addSubscription(new snsSubs.LambdaSubscription(functionSubscription.function));
407
+ const subscription = topic.addSubscription(new snsSubs.LambdaSubscription(functionSubscription.function));
408
+ this.createdResourcesBySSpy.push(subscription);
268
409
  const topicName = this.getConstructName(topic);
269
410
  const serviceKey = `SnsTopic#${topicName}`;
270
411
  functionSubscription.mapping[topic.topicArn] = serviceKey;
271
412
  this.serviceKeys.push(serviceKey);
272
413
  functionSubscription.subsribedTopics.push(topic);
273
414
  }
274
- spySnsSubscription(subscription) {
415
+ internalSpySnsSubscription(subscription) {
275
416
  if (!subscription.node.scope) {
276
417
  return;
277
418
  }
@@ -285,7 +426,7 @@ export class ServerlessSpy extends Construct {
285
426
  const subscriptionClone = topic.addSubscription(new snsSubs.LambdaSubscription(functionSubscription.function));
286
427
  subscriptionClone.node.defaultChild.filterPolicy =
287
428
  filterPolicy;
288
- this.ownContructs.push(subscriptionClone);
429
+ this.createdResourcesBySSpy.push(subscriptionClone);
289
430
  const topicName = this.getConstructName(topic);
290
431
  const targetName = this.getConstructName(subscription.node.scope);
291
432
  functionSubscription.subsribedTopics.push(topic);
@@ -296,30 +437,32 @@ export class ServerlessSpy extends Construct {
296
437
  provideFunctionForSubscription(filterFunction) {
297
438
  let functionSubscription;
298
439
  if (filterFunction) {
299
- functionSubscription = this.functionSubscriptionPool.find(filterFunction);
440
+ functionSubscription = this.lambdaSubscriptionPool.find(filterFunction);
300
441
  }
301
- else if (this.functionSubscriptionPool.length > 0) {
302
- functionSubscription = this.functionSubscriptionPool[0];
442
+ else if (this.lambdaSubscriptionPool.length > 0) {
443
+ functionSubscription = this.lambdaSubscriptionPool[0];
303
444
  }
304
445
  if (!functionSubscription) {
305
446
  functionSubscription = {
306
447
  subsribedTopics: [],
307
448
  usedForEventBridge: false,
308
449
  mapping: {},
309
- function: this.createFunctionForSubscription(this.functionSubscriptionPool.length),
450
+ function: this.createFunctionForSubscription(this.lambdaSubscriptionPool.length),
310
451
  };
311
- this.functionSubscriptionPool.push(functionSubscription);
452
+ this.lambdaSubscriptionPool.push(functionSubscription);
312
453
  }
313
454
  return functionSubscription;
314
455
  }
315
- spyFunction(func) {
456
+ internalSpyLambda(func) {
316
457
  func.addLayers(this.extensionLayer);
317
458
  const functionName = this.getConstructName(func);
318
- func.addEnvironment(envVariableNames.FUNCTION_NAME, functionName);
459
+ func.addEnvironment(envVariableNames.SSPY_FUNCTION_NAME, functionName);
319
460
  func.addEnvironment('AWS_LAMBDA_EXEC_WRAPPER', '/opt/spy-wrapper');
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());
461
+ func.addEnvironment(envVariableNames.SSPY_WS_TABLE_NAME, this.table.tableName);
462
+ func.addEnvironment(envVariableNames.SSPY_WS_ENDPOINT, this.getWsEndpoint());
463
+ if (this.props?.debugMode) {
464
+ func.addEnvironment(envVariableNames.SSPY_DEBUG, 'true');
465
+ }
323
466
  this.table.grantWriteData(func);
324
467
  this.table.grantReadData(func);
325
468
  this.webSocketApi.grantManageConnections(func);
@@ -359,7 +502,7 @@ export class ServerlessSpy extends Construct {
359
502
  return undefined;
360
503
  }
361
504
  addMappingToFunction(func, keyValue) {
362
- for (const fs of this.functionsSpied) {
505
+ for (const fs of this.lambdasSpied) {
363
506
  if (fs.function === func) {
364
507
  if (keyValue) {
365
508
  fs.mapping[keyValue.key] = keyValue.value;
@@ -374,18 +517,18 @@ export class ServerlessSpy extends Construct {
374
517
  if (keyValue) {
375
518
  fs.mapping[keyValue.key] = keyValue.value;
376
519
  }
377
- this.functionsSpied.push(fs);
378
- }
379
- }
380
- function getAssetLocation(location) {
381
- const loc = path.join(__dirname, '../' + location);
382
- if (fs.existsSync(loc)) {
383
- return loc;
520
+ this.lambdasSpied.push(fs);
384
521
  }
385
- const loc2 = path.join(__dirname, '../../' + location);
386
- if (fs.existsSync(loc2)) {
387
- return loc2;
522
+ getAssetLocation(location) {
523
+ const loc = path.join(__dirname, '../' + location);
524
+ if (fs.existsSync(loc)) {
525
+ return loc;
526
+ }
527
+ const loc2 = path.join(__dirname, '../../' + location);
528
+ if (fs.existsSync(loc2)) {
529
+ return loc2;
530
+ }
531
+ throw new Error(`Location ${loc} and ${loc2} does not exists.`);
388
532
  }
389
- throw new Error(`Location ${loc} and ${loc2} does not exists.`);
390
533
  }
391
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2VydmVybGVzc1NweS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9TZXJ2ZXJsZXNzU3B5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQ3pCLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBQzdCLE9BQU8sS0FBSyxPQUFPLE1BQU0saUNBQWlDLENBQUM7QUFDM0QsT0FBTyxLQUFLLFVBQVUsTUFBTSw4Q0FBOEMsQ0FBQztBQUMzRSxPQUFPLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFekQsT0FBTyxLQUFLLFFBQVEsTUFBTSwwQkFBMEIsQ0FBQztBQUNyRCxPQUFPLEtBQUssTUFBTSxNQUFNLHdCQUF3QixDQUFDO0FBQ2pELE9BQU8sS0FBSyxPQUFPLE1BQU0sZ0NBQWdDLENBQUM7QUFDMUQsT0FBTyxLQUFLLE1BQU0sTUFBTSx3QkFBd0IsQ0FBQztBQUNqRCxPQUFPLEtBQUssY0FBYyxNQUFNLHNDQUFzQyxDQUFDO0FBQ3ZFLE9BQU8sS0FBSyxVQUFVLE1BQU0sK0JBQStCLENBQUM7QUFDNUQsT0FBTyxLQUFLLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUN6QyxPQUFPLEtBQUssT0FBTyxNQUFNLGtDQUFrQyxDQUFDO0FBQzVELE9BQU8sS0FBSyxHQUFHLE1BQU0scUJBQXFCLENBQUM7QUFDM0MsT0FBTyxLQUFLLE9BQU8sTUFBTSxtQ0FBbUMsQ0FBQztBQUM3RCxPQUFPLEtBQUssR0FBRyxNQUFNLHFCQUFxQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxTQUFTLEVBQWMsTUFBTSxZQUFZLENBQUM7QUFDbkQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFNN0QsTUFBTSxPQUFPLGFBQWMsU0FBUSxTQUFTO0lBWTFDLFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBMEI7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QyxDQUFDO0lBRXZELElBQUksRUFBRSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRTtRQUN2QixPQUFPLElBQUksQ0FBQztLQUNiO0lBRUQsTUFBTSxJQUFJLEtBQUssQ0FBQyxZQUFZLEdBQUcsUUFBUSxJQUFJLG1CQUFtQixDQUFDLENBQUM7QUFDbEUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgKiBhcyBhcGlHd1YyIGZyb20gJ0Bhd3MtY2RrL2F3cy1hcGlnYXRld2F5djItYWxwaGEnO1xuaW1wb3J0ICogYXMgYXBpR3dWMkludCBmcm9tICdAYXdzLWNkay9hd3MtYXBpZ2F0ZXdheXYyLWludGVncmF0aW9ucy1hbHBoYSc7XG5pbXBvcnQgeyBDZm5PdXRwdXQsIER1cmF0aW9uLCBTdGFjayB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCAqIGFzIGFndyBmcm9tICdhd3MtY2RrLWxpYi9hd3MtYXBpZ2F0ZXdheXYyJztcbmltcG9ydCAqIGFzIGR5bmFtb0RiIGZyb20gJ2F3cy1jZGstbGliL2F3cy1keW5hbW9kYic7XG5pbXBvcnQgKiBhcyBldmVudHMgZnJvbSAnYXdzLWNkay1saWIvYXdzLWV2ZW50cyc7XG5pbXBvcnQgKiBhcyB0YXJnZXRzIGZyb20gJ2F3cy1jZGstbGliL2F3cy1ldmVudHMtdGFyZ2V0cyc7XG5pbXBvcnQgKiBhcyBsYW1iZGEgZnJvbSAnYXdzLWNkay1saWIvYXdzLWxhbWJkYSc7XG5pbXBvcnQgKiBhcyBkeW5hbW9EYlN0cmVhbSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtbGFtYmRhLWV2ZW50LXNvdXJjZXMnO1xuaW1wb3J0ICogYXMgbGFtYmRhTm9kZSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtbGFtYmRhLW5vZGVqcyc7XG5pbXBvcnQgKiBhcyBzMyBmcm9tICdhd3MtY2RrLWxpYi9hd3MtczMnO1xuaW1wb3J0ICogYXMgczNub3RpZiBmcm9tICdhd3MtY2RrLWxpYi9hd3MtczMtbm90aWZpY2F0aW9ucyc7XG5pbXBvcnQgKiBhcyBzbnMgZnJvbSAnYXdzLWNkay1saWIvYXdzLXNucyc7XG5pbXBvcnQgKiBhcyBzbnNTdWJzIGZyb20gJ2F3cy1jZGstbGliL2F3cy1zbnMtc3Vic2NyaXB0aW9ucyc7XG5pbXBvcnQgKiBhcyBzcXMgZnJvbSAnYXdzLWNkay1saWIvYXdzLXNxcyc7XG5pbXBvcnQgeyBDb25zdHJ1Y3QsIElDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB7IGVudlZhcmlhYmxlTmFtZXMgfSBmcm9tICcuL2NvbW1vbi9lbnZWYXJpYWJsZU5hbWVzJztcblxuZXhwb3J0IGludGVyZmFjZSBTZXJ2ZXJsZXNzU3B5UHJvcHMge1xuICByZWFkb25seSBnZW5lcmF0ZVNweUV2ZW50c0ZpbGVMb2NhdGlvbj86IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIFNlcnZlcmxlc3NTcHkgZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICBwcml2YXRlIGV4dGVuc2lvbkxheWVyOiBsYW1iZGEuTGF5ZXJWZXJzaW9uO1xuICBwcml2YXRlIHRhYmxlOiBkeW5hbW9EYi5UYWJsZTtcbiAgcHJpdmF0ZSB3ZWJTb2NrZXRBcGk6IGFwaUd3VjIuV2ViU29ja2V0QXBpO1xuICBwcml2YXRlIG93bkNvbnRydWN0czogSUNvbnN0cnVjdFtdID0gW107XG4gIHByaXZhdGUgZnVuY3Rpb25TdWJzY3JpcHRpb25Qb29sOiBGdW5jdGlvblN1YnNjcmlwdGlvbltdID0gW107XG4gIHByaXZhdGUgZnVuY3Rpb25TdWJzY3JpcHRpb25NYWluOiBGdW5jdGlvblN1YnNjcmlwdGlvbjtcbiAgcHJpdmF0ZSBmdW5jdGlvbnNTcGllZDogRnVuY3Rpb25TcGllZFtdID0gW107XG4gIHByaXZhdGUgd2ViU29ja2V0U3RhZ2U6IGFwaUd3VjIuV2ViU29ja2V0U3RhZ2U7XG4gIHB1YmxpYyBzZXJ2aWNlS2V5czogc3RyaW5nW10gPSBbXTtcbiAgd3NVcmw6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wcz86IFNlcnZlcmxlc3NTcHlQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICB0aGlzLmV4dGVuc2lvbkxheWVyID0gbmV3IGxhbWJkYS5MYXllclZlcnNpb24odGhpcywgJ0V4dGVuc2lvbicsIHtcbiAgICAgIGNvbXBhdGlibGVSdW50aW1lczogW1xuICAgICAgICBsYW1iZGEuUnVudGltZS5OT0RFSlNfMTJfWCxcbiAgICAgICAgbGFtYmRhLlJ1bnRpbWUuTk9ERUpTXzE0X1gsXG4gICAgICAgIGxhbWJkYS5SdW50aW1lLk5PREVKU18xNl9YLFxuICAgICAgXSxcbiAgICAgIGNvZGU6IGxhbWJkYS5Db2RlLmZyb21Bc3NldCh0aGlzLmdldEV4dGVuc2lvbkFzc2V0TG9jYXRpb24oKSksXG4gICAgfSk7XG4gICAgdGhpcy5vd25Db250cnVjdHMucHVzaCh0aGlzLmV4dGVuc2lvbkxheWVyKTtcblxuICAgIHRoaXMudGFibGUgPSBuZXcgZHluYW1vRGIuVGFibGUodGhpcywgJ1dlYlNvY2tldCcsIHtcbiAgICAgIHBhcnRpdGlvbktleToge1xuICAgICAgICBuYW1lOiAnY29ubmVjdGlvbklkJyxcbiAgICAgICAgdHlwZTogZHluYW1vRGIuQXR0cmlidXRlVHlwZS5TVFJJTkcsXG4gICAgICB9LFxuICAgICAgYmlsbGluZ01vZGU6IGR5bmFtb0RiLkJpbGxpbmdNb2RlLlBBWV9QRVJfUkVRVUVTVCxcbiAgICB9KTtcbiAgICB0aGlzLm93bkNvbnRydWN0cy5wdXNoKHRoaXMudGFibGUpO1xuXG4gICAgY29uc3QgZnVuY3Rpb25PbkNvbm5lY3QgPSBuZXcgbGFtYmRhTm9kZS5Ob2RlanNGdW5jdGlvbih0aGlzLCAnT25Db25uZWN0Jywge1xuICAgICAgbWVtb3J5U2l6ZTogNTEyLFxuICAgICAgdGltZW91dDogRHVyYXRpb24uc2Vjb25kcyg1KSxcbiAgICAgIHJ1bnRpbWU6IGxhbWJkYS5SdW50aW1lLk5PREVKU18xNl9YLFxuICAgICAgaGFuZGxlcjogJ2hhbmRsZXInLFxuICAgICAgZW50cnk6IGdldEFzc2V0TG9jYXRpb24oJ2Z1bmN0aW9ucy9vbkNvbm5lY3QudHMnKSxcbiAgICAgIGVudmlyb25tZW50OiB7XG4gICAgICAgIFtlbnZWYXJpYWJsZU5hbWVzLlRBQkxFX05BTUVdOiB0aGlzLnRhYmxlLnRhYmxlTmFtZSxcbiAgICAgICAgTk9ERV9PUFRJT05TOiAnLS1lbmFibGUtc291cmNlLW1hcHMnLFxuICAgICAgfSxcbiAgICB9KTtcbiAgICB0aGlzLnRhYmxlLmdyYW50V3JpdGVEYXRhKGZ1bmN0aW9uT25Db25uZWN0KTtcbiAgICB0aGlzLm93bkNvbnRydWN0cy5wdXNoKGZ1bmN0aW9uT25Db25uZWN0KTtcblxuICAgIGNvbnN0IGZ1bmN0aW9uT25EaXNjb25uZWN0ID0gbmV3IGxhbWJkYU5vZGUuTm9kZWpzRnVuY3Rpb24oXG4gICAgICB0aGlzLFxuICAgICAgJ09uRGlzY29ubmVjdCcsXG4gICAgICB7XG4gICAgICAgIG1lbW9yeVNpemU6IDUxMixcbiAgICAgICAgdGltZW91dDogRHVyYXRpb24uc2Vjb25kcyg1KSxcbiAgICAgICAgcnVudGltZTogbGFtYmRhLlJ1bnRpbWUuTk9ERUpTXzE2X1gsXG4gICAgICAgIGhhbmRsZXI6ICdoYW5kbGVyJyxcbiAgICAgICAgZW50cnk6IGdldEFzc2V0TG9jYXRpb24oJ2Z1bmN0aW9ucy9vbkRpc2Nvbm5lY3QudHMnKSxcbiAgICAgICAgZW52aXJvbm1lbnQ6IHtcbiAgICAgICAgICBbZW52VmFyaWFibGVOYW1lcy5UQUJMRV9OQU1FXTogdGhpcy50YWJsZS50YWJsZU5hbWUsXG4gICAgICAgICAgTk9ERV9PUFRJT05TOiAnLS1lbmFibGUtc291cmNlLW1hcHMnLFxuICAgICAgICB9LFxuICAgICAgfVxuICAgICk7XG4gICAgdGhpcy50YWJsZS5ncmFudFdyaXRlRGF0YShmdW5jdGlvbk9uRGlzY29ubmVjdCk7XG4gICAgdGhpcy5vd25Db250cnVjdHMucHVzaChmdW5jdGlvbk9uRGlzY29ubmVjdCk7XG5cbiAgICB0aGlzLndlYlNvY2tldEFwaSA9IG5ldyBhcGlHd1YyLldlYlNvY2tldEFwaSh0aGlzLCAnQXBpR3dXZWJTb2NrZXQnKTtcbiAgICB0aGlzLm93bkNvbnRydWN0cy5wdXNoKHRoaXMud2ViU29ja2V0QXBpKTtcbiAgICB0aGlzLndlYlNvY2tldFN0YWdlID0gbmV3IGFwaUd3VjIuV2ViU29ja2V0U3RhZ2UoXG4gICAgICB0aGlzLFxuICAgICAgJ0FwaUd3V2ViU29ja2V0U3RhZ2UnLFxuICAgICAge1xuICAgICAgICB3ZWJTb2NrZXRBcGk6IHRoaXMud2ViU29ja2V0QXBpLFxuICAgICAgICBzdGFnZU5hbWU6ICdwcm9kJyxcbiAgICAgICAgYXV0b0RlcGxveTogdHJ1ZSxcbiAgICAgIH1cbiAgICApO1xuICAgIHRoaXMub3duQ29udHJ1Y3RzLnB1c2godGhpcy53ZWJTb2NrZXRTdGFnZSk7XG4gICAgY29uc3Qgd2ViU29ja2V0QXBpUm91dGUgPSB0aGlzLndlYlNvY2tldEFwaS5hZGRSb3V0ZSgnJGNvbm5lY3QnLCB7XG4gICAgICBpbnRlZ3JhdGlvbjogbmV3IGFwaUd3VjJJbnQuV2ViU29ja2V0TGFtYmRhSW50ZWdyYXRpb24oXG4gICAgICAgICckY29ubmVjdCcsXG4gICAgICAgIGZ1bmN0aW9uT25Db25uZWN0XG4gICAgICApLFxuICAgIH0pO1xuICAgICh3ZWJTb2NrZXRBcGlSb3V0ZS5ub2RlLmRlZmF1bHRDaGlsZCBhcyBhZ3cuQ2ZuUm91dGUpLmF1dGhvcml6YXRpb25UeXBlID1cbiAgICAgICdBV1NfSUFNJztcblxuICAgIHRoaXMud2ViU29ja2V0QXBpLmFkZFJvdXRlKCckZGlzY29ubmVjdCcsIHtcbiAgICAgIGludGVncmF0aW9uOiBuZXcgYXBpR3dWMkludC5XZWJTb2NrZXRMYW1iZGFJbnRlZ3JhdGlvbihcbiAgICAgICAgJyRkaXNjb25uZWN0JyxcbiAgICAgICAgZnVuY3Rpb25PbkRpc2Nvbm5lY3RcbiAgICAgICksXG4gICAgfSk7XG5cbiAgICB0aGlzLmZ1bmN0aW9uU3Vic2NyaXB0aW9uTWFpbiA9IHRoaXMucHJvdmlkZUZ1bmN0aW9uRm9yU3Vic2NyaXB0aW9uKCk7XG5cbiAgICB0aGlzLndlYlNvY2tldEFwaS5hZGRSb3V0ZSgnc2VuZG1lc3NhZ2UnLCB7XG4gICAgICBpbnRlZ3JhdGlvbjogbmV3IGFwaUd3VjJJbnQuV2ViU29ja2V0TGFtYmRhSW50ZWdyYXRpb24oXG4gICAgICAgICdTZW5kTWVzc2FnZScsXG4gICAgICAgIHRoaXMuZnVuY3Rpb25TdWJzY3JpcHRpb25NYWluLmZ1bmN0aW9uXG4gICAgICApLFxuICAgIH0pO1xuXG4gICAgdGhpcy5pdGVyYXRlQWxsRWxlbWVudHMoU3RhY2sub2YodGhpcykpO1xuXG4gICAgLy9zZXQgbWFwcGluZyBwcm9wZXJ0eSBmb3IgYWxsIGZ1bmN0aW9ucyB3ZSBjcmVhdGVkXG4gICAgZm9yIChjb25zdCBmdW5jIG9mIHRoaXMuZnVuY3Rpb25TdWJzY3JpcHRpb25Qb29sKSB7XG4gICAgICBmdW5jLmZ1bmN0aW9uLmFkZEVudmlyb25tZW50KFxuICAgICAgICBlbnZWYXJpYWJsZU5hbWVzLklORlJBX01BUFBJTkcsXG4gICAgICAgIEpTT04uc3RyaW5naWZ5KGZ1bmMubWFwcGluZylcbiAgICAgICk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBmdW5jIG9mIHRoaXMuZnVuY3Rpb25zU3BpZWQpIHtcbiAgICAgIGZ1bmMuZnVuY3Rpb24uYWRkRW52aXJvbm1lbnQoXG4gICAgICAgIGVudlZhcmlhYmxlTmFtZXMuSU5GUkFfTUFQUElORyxcbiAgICAgICAgSlNPTi5zdHJpbmdpZnkoZnVuYy5tYXBwaW5nKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLndzVXJsID0gYHdzczovLyR7dGhpcy53ZWJTb2NrZXRBcGkuYXBpSWR9LmV4ZWN1dGUtYXBpLiR7XG4gICAgICBTdGFjay5vZih0aGlzKS5yZWdpb25cbiAgICB9LmFtYXpvbmF3cy5jb20vJHt0aGlzLndlYlNvY2tldFN0YWdlLnN0YWdlTmFtZX1gO1xuXG4gICAgbmV3IENmbk91dHB1dChTdGFjay5vZih0aGlzKSwgJ1NlcnZlcmxlc3NTcHlXc1VybCcsIHtcbiAgICAgIHZhbHVlOiB0aGlzLndzVXJsLFxuICAgIH0pO1xuXG4gICAgaWYgKHByb3BzPy5nZW5lcmF0ZVNweUV2ZW50c0ZpbGVMb2NhdGlvbikge1xuICAgICAgdGhpcy53cml0ZVNweUV2ZW50c0NsYXNzKHByb3BzPy5nZW5lcmF0ZVNweUV2ZW50c0ZpbGVMb2NhdGlvbik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRFeHRlbnNpb25Bc3NldExvY2F0aW9uKCkge1xuICAgIGxldCBleHRlbnNpb25Bc3NldExvY2F0aW9uID0gcGF0aC5qb2luKFxuICAgICAgX19kaXJuYW1lLFxuICAgICAgJy4uL2V4dGVuc2lvbi9kaXN0L2xheWVyJ1xuICAgICk7XG5cbiAgICBjb25zdCBleHRlbnNpb25Bc3NldExvY2F0aW9uQWx0ID0gcGF0aC5qb2luKFxuICAgICAgX19kaXJuYW1lLFxuICAgICAgJy4uL2xpYi9leHRlbnNpb24vZGlzdC9sYXllcidcbiAgICApO1xuXG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKGV4dGVuc2lvbkFzc2V0TG9jYXRpb24pKSB7XG4gICAgICBpZiAoIWZzLmV4aXN0c1N5bmMoZXh0ZW5zaW9uQXNzZXRMb2NhdGlvbkFsdCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBGb2xkZXIgd2l0aCBhc3NldHMgZm9yIGV4dGVuc2lvbiBkb2VzIG5vdCBleGlzdHMgYXQgJHtleHRlbnNpb25Bc3NldExvY2F0aW9ufSBvciBhdCAke2V4dGVuc2lvbkFzc2V0TG9jYXRpb25BbHR9IGBcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGV4dGVuc2lvbkFzc2V0TG9jYXRpb24gPSBleHRlbnNpb25Bc3NldExvY2F0aW9uQWx0O1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGV4dGVuc2lvbkFzc2V0TG9jYXRpb25XcmFwZXIgPSBwYXRoLmpvaW4oXG4gICAgICBleHRlbnNpb25Bc3NldExvY2F0aW9uLFxuICAgICAgJ3NweS13cmFwcGVyJ1xuICAgICk7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKGV4dGVuc2lvbkFzc2V0TG9jYXRpb25XcmFwZXIpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBXcmFwZXIgc2NyaXB0IGZvciBleHRlbnNpb24gZG9lcyBub3QgZXhpc3RzICR7ZXh0ZW5zaW9uQXNzZXRMb2NhdGlvbn1gXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGV4dGVuc2lvbkFzc2V0TG9jYXRpb25Db2RlID0gcGF0aC5qb2luKFxuICAgICAgZXh0ZW5zaW9uQXNzZXRMb2NhdGlvbixcbiAgICAgICdub2RlanMvbm9kZV9tb2R1bGVzL2ludGVyY2VwdG9yLmpzJ1xuICAgICk7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKGV4dGVuc2lvbkFzc2V0TG9jYXRpb25Db2RlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgQ29kZSBmb3IgZXh0ZW5zaW9uIGRvZXMgbm90IGV4aXN0cyAke2V4dGVuc2lvbkFzc2V0TG9jYXRpb25Db2RlfWBcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBleHRlbnNpb25Bc3NldExvY2F0aW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIFdyaXRlIFNweUV2ZW50cyBjbGFzcywgd2hpY2ggaGVscHMgd2l0aCB3cml0aW5nIHRoZSBjb2RlIGZvciB0ZXN0cy5cbiAgICogQHBhcmFtIGZpbGVMb2NhdGlvblxuICAgKi9cbiAgcHJpdmF0ZSB3cml0ZVNweUV2ZW50c0NsYXNzKGZpbGVMb2NhdGlvbjogc3RyaW5nKSB7XG4gICAgZnMubWtkaXJTeW5jKHBhdGguZGlybmFtZShmaWxlTG9jYXRpb24pLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAgIGNvbnN0IHByb3BlcnRpZXMgPSB0aGlzLnNlcnZpY2VLZXlzXG4gICAgICAubWFwKChzaykgPT4gYCAgJHtzay5yZXBsYWNlKC8jL2csICcnKX06ICcke3NrfScgPSAnJHtza30nO1xcbmApXG4gICAgICAuam9pbignJyk7XG5cbiAgICBjb25zdCBjb2RlID0gYC8qIGVzbGludC1kaXNhYmxlICovXFxuZXhwb3J0IGNsYXNzIFNlcnZlcmxlc3NTcHlFdmVudHMge1xcbiR7cHJvcGVydGllc319XFxuYDtcblxuICAgIGZzLndyaXRlRmlsZVN5bmMoZmlsZUxvY2F0aW9uLCBjb2RlKTtcbiAgfVxuXG4gIHByaXZhdGUgaXRlcmF0ZUFsbEVsZW1lbnRzKHBhcmVudDogSUNvbnN0cnVjdCkge1xuICAgIGZvciAoY29uc3Qgbm9kZSBvZiBwYXJlbnQubm9kZS5jaGlsZHJlbikge1xuICAgICAgaWYgKHRoaXMub3duQ29udHJ1Y3RzLmluY2x1ZGVzKG5vZGUpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5mdW5jdGlvblN1YnNjcmlwdGlvblBvb2wuZmluZCgocykgPT4gcy5mdW5jdGlvbiA9PT0gbm9kZSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgbGFtYmRhLkZ1bmN0aW9uKSB7XG4gICAgICAgIHRoaXMuc3B5RnVuY3Rpb24obm9kZSk7XG4gICAgICB9IGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBzbnMuVG9waWMpIHtcbiAgICAgICAgY29uc29sZS5sb2coJ2ludGVyY2VwdFNuc1RvcGljJyk7XG4gICAgICAgIHRoaXMuc3B5U25zVG9waWMobm9kZSk7XG4gICAgICB9IGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBzbnMuU3Vic2NyaXB0aW9uKSB7XG4gICAgICAgIHRoaXMuc3B5U25zU3Vic2NyaXB0aW9uKG5vZGUpO1xuICAgICAgfSBlbHNlIGlmIChub2RlIGluc3RhbmNlb2YgczMuQnVja2V0KSB7XG4gICAgICAgIHRoaXMuc3B5UzMobm9kZSk7XG4gICAgICB9IGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBkeW5hbW9EYi5UYWJsZSkge1xuICAgICAgICB0aGlzLnNweUR5bmFtb2RiKG5vZGUpO1xuICAgICAgfSBlbHNlIGlmIChub2RlIGluc3RhbmNlb2YgZXZlbnRzLkV2ZW50QnVzKSB7XG4gICAgICAgIHRoaXMuc3B5RXZlbnRCdXMobm9kZSk7XG4gICAgICB9IGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBldmVudHMuUnVsZSkge1xuICAgICAgICB0aGlzLnNweUV2ZW50QnVzUnVsZShub2RlKTtcbiAgICAgIH0gZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIGxhbWJkYS5DZm5FdmVudFNvdXJjZU1hcHBpbmcpIHtcbiAgICAgICAgdGhpcy5zcHlTcXMobm9kZSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuaXRlcmF0ZUFsbEVsZW1lbnRzKG5vZGUpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc3B5U3FzKG5vZGU6IGxhbWJkYS5DZm5FdmVudFNvdXJjZU1hcHBpbmcpIHtcbiAgICBjb25zdCBxdWV1ZSA9IHRoaXMuZmluZEVsZW1lbnQ8c3FzLlF1ZXVlPihcbiAgICAgIChuOiBJQ29uc3RydWN0KSA9PlxuICAgICAgICBuIGluc3RhbmNlb2Ygc3FzLlF1ZXVlICYmXG4gICAgICAgIChuIGFzIHNxcy5RdWV1ZSkucXVldWVBcm4gPT09IG5vZGUuZXZlbnRTb3VyY2VBcm5cbiAgICApO1xuXG4gICAgY29uc3QgZnVuYyA9IHRoaXMuZmluZEVsZW1lbnQ8bGFtYmRhLkZ1bmN0aW9uPihcbiAgICAgIChuOiBJQ29uc3RydWN0KSA9PlxuICAgICAgICBuIGluc3RhbmNlb2YgbGFtYmRhLkZ1bmN0aW9uICYmXG4gICAgICAgIChuIGFzIGxhbWJkYS5GdW5jdGlvbikuZnVuY3Rpb25OYW1lID09PSBub2RlLmZ1bmN0aW9uTmFtZVxuICAgICk7XG5cbiAgICBpZiAocXVldWUgJiYgZnVuYykge1xuICAgICAgY29uc3QgcXVldWVOYW1lID0gdGhpcy5nZXRDb25zdHJ1Y3ROYW1lKHF1ZXVlKTtcblxuICAgICAgY29uc3Qgc2VydmljZUtleSA9IGBTcXMjJHtxdWV1ZU5hbWV9YDtcblxuICAgICAgLy90aGlzLmZ1bmN0aW9uU3Vic2NyaXB0aW9uTWFpbi5tYXBwaW5nW3F1ZXVlLnF1ZXVlQXJuXSA9IHNlcnZpY2VLZXk7XG4gICAgICBmdW5jLmFkZEVudmlyb25tZW50KGVudlZhcmlhYmxlTmFtZXMuSU5GUkFfTUFQUElORywgSlNPTi5zdHJpbmdpZnkoe30pKTtcbiAgICAgIHRoaXMuYWRkTWFwcGluZ1RvRnVuY3Rpb24oZnVuYywge1xuICAgICAgICBrZXk6IHF1ZXVlLnF1ZXVlQXJuLFxuICAgICAgICB2YWx1ZTogc2VydmljZUtleSxcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLnNlcnZpY2VLZXlzLnB1c2goc2VydmljZUtleSk7XG4gICAgICBmdW5jLmFkZEVudmlyb25tZW50KFxuICAgICAgICBlbnZWYXJpYWJsZU5hbWVzLkZMVUVOVF9URVNUX1NVQlNDUklCRURfVE9fU1FTLFxuICAgICAgICAndHJ1ZSdcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVGdW5jdGlvbkZvclN1YnNjcmlwdGlvbihpbmRleDogbnVtYmVyKSB7XG4gICAgY29uc3QgZnVuYyA9IG5ldyBsYW1iZGFOb2RlLk5vZGVqc0Z1bmN0aW9uKHRoaXMsIGBTdWJzY3JpcHRpb24ke2luZGV4fWAsIHtcbiAgICAgIG1lbW9yeVNpemU6IDUxMixcbiAgICAgIHRpbWVvdXQ6IER1cmF0aW9uLnNlY29uZHMoNSksXG4gICAgICBydW50aW1lOiBsYW1iZGEuUnVudGltZS5OT0RFSlNfMTZfWCxcbiAgICAgIGhhbmRsZXI6ICdoYW5kbGVyJyxcbiAgICAgIGVudHJ5OiBnZXRBc3NldExvY2F0aW9uKCdmdW5jdGlvbnMvc2VuZE1lc3NhZ2UudHMnKSxcbiAgICAgIGVudmlyb25tZW50OiB7XG4gICAgICAgIFtlbnZWYXJpYWJsZU5hbWVzLlRBQkxFX05BTUVdOiB0aGlzLnRhYmxlLnRhYmxlTmFtZSxcbiAgICAgICAgTk9ERV9PUFRJT05TOiAnLS1lbmFibGUtc291cmNlLW1hcHMnLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIHRoaXMudGFibGUuZ3JhbnRXcml0ZURhdGEoZnVuYyk7XG4gICAgdGhpcy50YWJsZS5ncmFudFJlYWREYXRhKGZ1bmMpO1xuICAgIGZ1bmMuYWRkRW52aXJvbm1lbnQoZW52VmFyaWFibGVOYW1lcy5XU19FTkRQT0lOVCwgdGhpcy5nZXRXc0VuZHBvaW50KCkpO1xuXG4gICAgdGhpcy53ZWJTb2NrZXRBcGkuZ3JhbnRNYW5hZ2VDb25uZWN0aW9ucyhmdW5jKTtcbiAgICByZXR1cm4gZnVuYztcbiAgfVxuXG4gIHByaXZhdGUgZ2V0V3NFbmRwb2ludCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgaHR0cHM6Ly8ke3RoaXMud2ViU29ja2V0QXBpLmFwaUlkfS5leGVjdXRlLWFwaS4ke1xuICAgICAgU3RhY2sub2YodGhpcykucmVnaW9uXG4gICAgfS5hbWF6b25hd3MuY29tLyR7dGhpcy53ZWJTb2NrZXRTdGFnZS5zdGFnZU5hbWV9YDtcbiAgfVxuXG4gIHByaXZhdGUgc3B5UzMoczNCdWNrZXQ6IHMzLkJ1Y2tldCkge1xuICAgIHMzQnVja2V0LmFkZEV2ZW50Tm90aWZpY2F0aW9uKFxuICAgICAgczMuRXZlbnRUeXBlLk9CSkVDVF9DUkVBVEVEX1BVVCxcbiAgICAgIG5ldyBzM25vdGlmLkxhbWJkYURlc3RpbmF0aW9uKHRoaXMuZnVuY3Rpb25TdWJzY3JpcHRpb25NYWluLmZ1bmN0aW9uKVxuICAgICk7XG5cbiAgICBjb25zdCBuYW1lID0gdGhpcy5nZXRDb25zdHJ1Y3ROYW1lKHMzQnVja2V0KTtcblxuICAgIGNvbnN0IHNlcnZpY2VLZXkgPSBgUzMjJHtuYW1lfWA7XG4gICAgdGhpcy5mdW5jdGlvblN1YnNjcmlwdGlvbk1haW4ubWFwcGluZ1tzM0J1Y2tldC5idWNrZXRBcm5dID0gc2VydmljZUtleTtcbiAgICB0aGlzLnNlcnZpY2VLZXlzLnB1c2goc2VydmljZUtleSk7XG4gIH1cblxuICBwcml2YXRlIHNweUR5bmFtb2RiKHRhYmxlOiBkeW5hbW9EYi5UYWJsZSkge1xuICAgIC8vIGVuYWJsZSBEeW5hbW9EQiBzdHJlYW1zIHdpdGggYSBoYWNrXG4gICAgKHRhYmxlLm5vZGUuZGVmYXVsdENoaWxkIGFzIGR5bmFtb0RiLkNmblRhYmxlKS5zdHJlYW1TcGVjaWZpY2F0aW9uID0ge1xuICAgICAgc3RyZWFtVmlld1R5cGU6IGR5bmFtb0RiLlN0cmVhbVZpZXdUeXBlLk5FV19BTkRfT0xEX0lNQUdFUyxcbiAgICB9O1xuICAgICh0YWJsZSBhcyBhbnkpLnRhYmxlU3RyZWFtQXJuID0gKFxuICAgICAgdGFibGUubm9kZS5kZWZhdWx0Q2hpbGQgYXMgZHluYW1vRGIuQ2ZuVGFibGVcbiAgICApLmF0dHJTdHJlYW1Bcm47XG5cbiAgICB0aGlzLmZ1bmN0aW9uU3Vic2NyaXB0aW9uTWFpbi5mdW5jdGlvbi5hZGRFdmVudFNvdXJjZShcbiAgICAgIG5ldyBkeW5hbW9EYlN0cmVhbS5EeW5hbW9FdmVudFNvdXJjZSh0YWJsZSwge1xuICAgICAgICBzdGFydGluZ1Bvc2l0aW9uOiBsYW1iZGEuU3RhcnRpbmdQb3NpdGlvbi5MQVRFU1QsXG4gICAgICAgIGJhdGNoU2l6ZTogMSxcbiAgICAgICAgcmV0cnlBdHRlbXB0czogMCxcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIGNvbnN0IG5hbWUgPSB0aGlzLmdldENvbnN0cnVjdE5hbWUodGFibGUpO1xuXG4gICAgY29uc3Qgc2VydmljZUtleSA9IGBEeW5hbW9EQiMke25hbWV9YDtcbiAgICB0aGlzLmZ1bmN0aW9uU3Vic2NyaXB0aW9uTWFpbi5tYXBwaW5nW3RhYmxlLnRhYmxlQXJuXSA9IHNlcnZpY2VLZXk7XG4gICAgdGhpcy5zZXJ2aWNlS2V5cy5wdXNoKHNlcnZpY2VLZXkpO1xuICB9XG5cbiAgcHJpdmF0ZSBzcHlFdmVudEJ1c1J1bGUocnVsZTogZXZlbnRzLlJ1bGUpIHtcbiAgICBjb25zdCB7IGV2ZW50QnVzTmFtZSB9ID0gcnVsZS5ub2RlLmRlZmF1bHRDaGlsZCBhcyBldmVudHMuQ2ZuUnVsZTtcbiAgICBjb25zdCBldmVudEJyaWRnZSA9IHRoaXMuZ2V0RXZlbnRCcmlkZ2UoXG4gICAgICAocnVsZS5ub2RlLmRlZmF1bHRDaGlsZCBhcyBhbnkpLmV2ZW50QnVzTmFtZVxuICAgICk7XG5cbiAgICBpZiAoIWV2ZW50QnJpZGdlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbiBub3QgZmluZCBFdmVudEJyaWRnZSB3aXRoIG5hbWUgXCIke2V2ZW50QnVzTmFtZX1cImApO1xuICAgIH1cblxuICAgIGNvbnN0IGZ1bmN0aW9uU3Vic2NyaXB0aW9uID0gdGhpcy5wcm92aWRlRnVuY3Rpb25Gb3JTdWJzY3JpcHRpb24oXG4gICAgICAocykgPT4gIXMudXNlZEZvckV2ZW50QnJpZGdlXG4gICAgKTtcbiAgICBmdW5jdGlvblN1YnNjcmlwdGlvbi51c2VkRm9yRXZlbnRCcmlkZ2UgPSB0cnVlO1xuXG4gICAgcnVsZS5hZGRUYXJnZXQobmV3IHRhcmdldHMuTGFtYmRhRnVuY3Rpb24oZnVuY3Rpb25TdWJzY3JpcHRpb24uZnVuY3Rpb24pKTtcblxuICAgIGNvbnN0IGJyaWRnZU5hbWUgPSB0aGlzLmdldENvbnN0cnVjdE5hbWUoZXZlbnRCcmlkZ2UpO1xuICAgIGNvbnN0IHJ1bGVOYW1lID0gdGhpcy5nZXRDb25zdHJ1Y3ROYW1lKHJ1bGUpO1xuICAgIGNvbnN0IHNlcnZpY2VLZXkgPSBgRXZlbnRCcmlkZ2VSdWxlIyR7YnJpZGdlTmFtZX0jJHtydWxlTmFtZX1gO1xuICAgIGZ1bmN0aW9uU3Vic2NyaXB0aW9uLm1hcHBpbmcuZXZlbnRCcmlkZ2UgPSBzZXJ2aWNlS2V5O1xuICAgIHRoaXMuc2VydmljZUtleXMucHVzaChzZXJ2aWNlS2V5KTtcbiAgfVxuXG4gIHByaXZhdGUgc3B5RXZlbnRCdXMoZXZlbnRCdXM6IGV2ZW50cy5FdmVudEJ1cykge1xuICAgIGNvbnN0IGZ1bmN0aW9uU3Vic2NyaXB0aW9uID0gdGhpcy5wcm92aWRlRnVuY3Rpb25Gb3JTdWJzY3JpcHRpb24oXG4gICAgICAocykgPT4gIXMudXNlZEZvckV2ZW50QnJpZGdlXG4gICAgKTtcbiAgICBmdW5jdGlvblN1YnNjcmlwdGlvbi51c2VkRm9yRXZlbnRCcmlkZ2UgPSB0cnVlO1xuXG4gICAgY29uc3QgYnJpZGdlTmFtZSA9IHRoaXMuZ2V0Q29uc3RydWN0TmFtZShldmVudEJ1cyk7XG4gICAgY29uc3QgcnVsZSA9IG5ldyBldmVudHMuUnVsZSh0aGlzLCBgUnVsZUFsbCR7YnJpZGdlTmFtZX1gLCB7XG4gICAgICBldmVudEJ1cyxcbiAgICAgIGV2ZW50UGF0dGVybjogeyB2ZXJzaW9uOiBbJzAnXSB9LFxuICAgICAgdGFyZ2V0czogW25ldyB0YXJnZXRzLkxhbWJkYUZ1bmN0aW9uKGZ1bmN0aW9uU3Vic2NyaXB0aW9uLmZ1bmN0aW9uKV0sXG4gICAgfSk7XG5cbiAgICB0aGlzLm93bkNvbnRydWN0cy5wdXNoKHJ1bGUpO1xuICAgIGNvbnN0IHNlcnZpY2VLZXkgPSBgRXZlbnRCcmlkZ2UjJHticmlkZ2VOYW1lfWA7XG4gICAgZnVuY3Rpb25TdWJzY3JpcHRpb24ubWFwcGluZy5ldmVudEJyaWRnZSA9IHNlcnZpY2VLZXk7XG4gICAgdGhpcy5zZXJ2aWNlS2V5cy5wdXNoKHNlcnZpY2VLZXkpO1xuICB9XG5cbiAgcHJpdmF0ZSBzcHlTbnNUb3BpYyh0b3BpYzogc25zLlRvcGljKSB7XG4gICAgY29uc3QgZnVuY3Rpb25TdWJzY3JpcHRpb24gPSB0aGlzLnByb3ZpZGVGdW5jdGlvbkZvclN1YnNjcmlwdGlvbihcbiAgICAgIChzKSA9PiAhcy5zdWJzcmliZWRUb3BpY3MuaW5jbHVkZXModG9waWMpXG4gICAgKTtcblxuICAgIHRvcGljLmFkZFN1YnNjcmlwdGlvbihcbiAgICAgIG5ldyBzbnNTdWJzLkxhbWJkYVN1YnNjcmlwdGlvbihmdW5jdGlvblN1YnNjcmlwdGlvbi5mdW5jdGlvbilcbiAgICApO1xuICAgIGNvbnN0IHRvcGljTmFtZSA9IHRoaXMuZ2V0Q29uc3RydWN0TmFtZSh0b3BpYyk7XG4gICAgY29uc3Qgc2VydmljZUtleSA9IGBTbnNUb3BpYyMke3RvcGljTmFtZX1gO1xuICAgIGZ1bmN0aW9uU3Vic2NyaXB0aW9uLm1hcHBpbmdbdG9waWMudG9waWNBcm5dID0gc2VydmljZUtleTtcbiAgICB0aGlzLnNlcnZpY2VLZXlzLnB1c2goc2VydmljZUtleSk7XG4gICAgZnVuY3Rpb25TdWJzY3JpcHRpb24uc3Vic3JpYmVkVG9waWNzLnB1c2godG9waWMpO1xuICB9XG5cbiAgcHJpdmF0ZSBzcHlTbnNTdWJzY3JpcHRpb24oc3Vic2NyaXB0aW9uOiBzbnMuU3Vic2NyaXB0aW9uKSB7XG4gICAgaWYgKCFzdWJzY3JpcHRpb24ubm9kZS5zY29wZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHRvcGljID0gdGhpcy5nZXRUb3BpYyhcbiAgICAgIChzdWJzY3JpcHRpb24ubm9kZS5kZWZhdWx0Q2hpbGQgYXMgc25zLkNmblN1YnNjcmlwdGlvbikudG9waWNBcm5cbiAgICApO1xuXG4gICAgaWYgKCF0b3BpYykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW4gbm90IGZpbmQgVG9waWMnKTtcbiAgICB9XG5cbiAgICBjb25zdCBmdW5jdGlvblN1YnNjcmlwdGlvbiA9IHRoaXMucHJvdmlkZUZ1bmN0aW9uRm9yU3Vic2NyaXB0aW9uKFxuICAgICAgKHMpID0+ICFzLnN1YnNyaWJlZFRvcGljcy5pbmNsdWRlcyh0b3BpYylcbiAgICApO1xuXG4gICAgY29uc3QgeyBmaWx0ZXJQb2xpY3kgfSA9IHN1YnNjcmlwdGlvbi5ub2RlXG4gICAgICAuZGVmYXVsdENoaWxkIGFzIHNucy5DZm5TdWJzY3JpcHRpb247XG5cbiAgICBjb25zdCBzdWJzY3JpcHRpb25DbG9uZSA9IHRvcGljLmFkZFN1YnNjcmlwdGlvbihcbiAgICAgIG5ldyBzbnNTdWJzLkxhbWJkYVN1YnNjcmlwdGlvbihmdW5jdGlvblN1YnNjcmlwdGlvbi5mdW5jdGlvbilcbiAgICApO1xuICAgIChzdWJzY3JpcHRpb25DbG9uZS5ub2RlLmRlZmF1bHRDaGlsZCBhcyBzbnMuQ2ZuU3Vic2NyaXB0aW9uKS5maWx0ZXJQb2xpY3kgPVxuICAgICAgZmlsdGVyUG9saWN5O1xuXG4gICAgdGhpcy5vd25Db250cnVjdHMucHVzaChzdWJzY3JpcHRpb25DbG9uZSk7XG5cbiAgICBjb25zdCB0b3BpY05hbWUgPSB0aGlzLmdldENvbnN0cnVjdE5hbWUodG9waWMpO1xuICAgIGNvbnN0IHRhcmdldE5hbWUgPSB0aGlzLmdldENvbnN0cnVjdE5hbWUoc3Vic2NyaXB0aW9uLm5vZGUuc2NvcGUpO1xuXG4gICAgZnVuY3Rpb25TdWJzY3JpcHRpb24uc3Vic3JpYmVkVG9waWNzLnB1c2godG9waWMpO1xuICAgIGNvbnN0IHNlcnZpY2VLZXkgPSBgU25zU3Vic2NyaXB0aW9uIyR7dG9waWNOYW1lfSMke3RhcmdldE5hbWV9YDtcbiAgICBmdW5jdGlvblN1YnNjcmlwdGlvbi5tYXBwaW5nW3RvcGljLnRvcGljQXJuXSA9IHNlcnZpY2VLZXk7XG4gICAgdGhpcy5zZXJ2aWNlS2V5cy5wdXNoKHNlcnZpY2VLZXkpO1xuICB9XG5cbiAgcHJpdmF0ZSBwcm92aWRlRnVuY3Rpb25Gb3JTdWJzY3JpcHRpb24oXG4gICAgZmlsdGVyRnVuY3Rpb24/OiAoc3Vic2NyaXB0aW9uOiBGdW5jdGlvblN1YnNjcmlwdGlvbikgPT4gYm9vbGVhblxuICApIHtcbiAgICBsZXQgZnVuY3Rpb25TdWJzY3JpcHRpb246IEZ1bmN0aW9uU3Vic2NyaXB0aW9uIHwgdW5kZWZpbmVkO1xuXG4gICAgaWYgKGZpbHRlckZ1bmN0aW9uKSB7XG4gICAgICBmdW5jdGlvblN1YnNjcmlwdGlvbiA9IHRoaXMuZnVuY3Rpb25TdWJzY3JpcHRpb25Qb29sLmZpbmQoZmlsdGVyRnVuY3Rpb24pO1xuICAgIH0gZWxzZSBpZiAodGhpcy5mdW5jdGlvblN1YnNjcmlwdGlvblBvb2wubGVuZ3RoID4gMCkge1xuICAgICAgZnVuY3Rpb25TdWJzY3JpcHRpb24gPSB0aGlzLmZ1bmN0aW9uU3Vic2NyaXB0aW9uUG9vbFswXTtcbiAgICB9XG5cbiAgICBpZiAoIWZ1bmN0aW9uU3Vic2NyaXB0aW9uKSB7XG4gICAgICBmdW5jdGlvblN1YnNjcmlwdGlvbiA9IHtcbiAgICAgICAgc3Vic3JpYmVkVG9waWNzOiBbXSxcbiAgICAgICAgdXNlZEZvckV2ZW50QnJpZGdlOiBmYWxzZSxcbiAgICAgICAgbWFwcGluZzoge30sXG4gICAgICAgIGZ1bmN0aW9uOiB0aGlzLmNyZWF0ZUZ1bmN0aW9uRm9yU3Vic2NyaXB0aW9uKFxuICAgICAgICAgIHRoaXMuZnVuY3Rpb25TdWJzY3JpcHRpb25Qb29sLmxlbmd0aFxuICAgICAgICApLFxuICAgICAgfTtcbiAgICAgIHRoaXMuZnVuY3Rpb25TdWJzY3JpcHRpb25Qb29sLnB1c2goZnVuY3Rpb25TdWJzY3JpcHRpb24pO1xuICAgIH1cbiAgICByZXR1cm4gZnVuY3Rpb25TdWJzY3JpcHRpb247XG4gIH1cblxuICBwcml2YXRlIHNweUZ1bmN0aW9uKGZ1bmM6IGxhbWJkYS5GdW5jdGlvbikge1xuICAgIGZ1bmMuYWRkTGF5ZXJzKHRoaXMuZXh0ZW5zaW9uTGF5ZXIpO1xuXG4gICAgY29uc3QgZnVuY3Rpb25OYW1lID0gdGhpcy5nZXRDb25zdHJ1Y3ROYW1lKGZ1bmMpO1xuXG4gICAgZnVuYy5hZGRFbnZpcm9ubWVudChlbnZWYXJpYWJsZU5hbWVzLkZVTkNUSU9OX05BTUUsIGZ1bmN0aW9uTmFtZSk7XG4gICAgZnVuYy5hZGRFbnZpcm9ubWVudCgnQVdTX0xBTUJEQV9FWEVDX1dSQVBQRVInLCAnL29wdC9zcHktd3JhcHBlcicpO1xuICAgIGZ1bmMuYWRkRW52aXJvbm1lbnQoXG4gICAgICBlbnZWYXJpYWJsZU5hbWVzLkZMVUVOVF9URVNUX1NFTkRfRlVOQ1RJT05fTkFNRSxcbiAgICAgIHRoaXMuZnVuY3Rpb25TdWJzY3JpcHRpb25NYWluLmZ1bmN0aW9uLmZ1bmN0aW9uTmFtZVxuICAgICk7XG4gICAgZnVuYy5hZGRFbnZpcm9ubWVudChlbnZWYXJpYWJsZU5hbWVzLlRBQkxFX05BTUUsIHRoaXMudGFibGUudGFibGVOYW1lKTtcbiAgICBmdW5jLmFkZEVudmlyb25tZW50KGVudlZhcmlhYmxlTmFtZXMuV1NfRU5EUE9JTlQsIHRoaXMuZ2V0V3NFbmRwb2ludCgpKTtcblxuICAgIHRoaXMudGFibGUuZ3JhbnRXcml0ZURhdGEoZnVuYyk7XG4gICAgdGhpcy50YWJsZS5ncmFudFJlYWREYXRhKGZ1bmMpO1xuICAgIHRoaXMud2ViU29ja2V0QXBpLmdyYW50TWFuYWdlQ29ubmVjdGlvbnMoZnVuYyk7XG5cbiAgICB0aGlzLnNlcnZpY2VLZXlzLnB1c2goYEZ1bmN0aW9uIyR7ZnVuY3Rpb25OYW1lfSNSZXF1ZXN0YCk7XG4gICAgdGhpcy5zZXJ2aWNlS2V5cy5wdXNoKGBGdW5jdGlvbiMke2Z1bmN0aW9uTmFtZX0jRXJyb3JgKTtcbiAgICB0aGlzLnNlcnZpY2VLZXlzLnB1c2goYEZ1bmN0aW9uIyR7ZnVuY3Rpb25OYW1lfSNDb25zb2xlYCk7XG4gICAgdGhpcy5zZXJ2aWNlS2V5cy5wdXNoKGBGdW5jdGlvbiMke2Z1bmN0aW9uTmFtZX0jUmVzcG9uc2VgKTtcblxuICAgIHRoaXMuYWRkTWFwcGluZ1RvRnVuY3Rpb24oZnVuYyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0Q29uc3RydWN0TmFtZShjb25zdHJ1Y3Q6IElDb25zdHJ1Y3QpIHtcbiAgICBsZXQgZnVuY3Rpb25OYW1lID0gY29uc3RydWN0Lm5vZGUucGF0aDtcbiAgICBjb25zdCB7IHN0YWNrTmFtZSB9ID0gU3RhY2sub2YodGhpcyk7XG5cbiAgICBpZiAoZnVuY3Rpb25OYW1lLnN0YXJ0c1dpdGgoc3RhY2tOYW1lKSkge1xuICAgICAgZnVuY3Rpb25OYW1lID0gZnVuY3Rpb25OYW1lLnN1YnN0cmluZyhzdGFja05hbWUubGVuZ3RoICsgMSk7XG4gICAgfVxuICAgIHJldHVybiBmdW5jdGlvbk5hbWU7XG4gIH1cblxuICBwcml2YXRlIGdldFRvcGljKHRvcGljQXJuOiBzdHJpbmcpOiBzbnMuVG9waWMgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHRvcGljID0gdGhpcy5maW5kRWxlbWVudDxzbnMuVG9waWM+KFxuICAgICAgKG5vZGU6IElDb25zdHJ1Y3QpID0+XG4gICAgICAgIG5vZGUgaW5zdGFuY2VvZiBzbnMuVG9waWMgJiYgKG5vZGUgYXMgc25zLlRvcGljKS50b3BpY0FybiA9PT0gdG9waWNBcm5cbiAgICApO1xuXG4gICAgcmV0dXJuIHRvcGljO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRFdmVudEJyaWRnZShldmVudEJ1c05hbWU6IHN0cmluZyk6IGV2ZW50cy5FdmVudEJ1cyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgZXZlbnRCcmlkZ2UgPSB0aGlzLmZpbmRFbGVtZW50PGV2ZW50cy5FdmVudEJ1cz4oXG4gICAgICAobm9kZTogSUNvbnN0cnVjdCkgPT5cbiAgICAgICAgbm9kZSBpbnN0YW5jZW9mIGV2ZW50cy5FdmVudEJ1cyAmJlxuICAgICAgICAobm9kZSBhcyBldmVudHMuRXZlbnRCdXMpLmV2ZW50QnVzTmFtZSA9PT0gZXZlbnRCdXNOYW1lXG4gICAgKTtcblxuICAgIHJldHVybiBldmVudEJyaWRnZTtcbiAgfVxuXG4gIHByaXZhdGUgZmluZEVsZW1lbnQ8VCBleHRlbmRzIElDb25zdHJ1Y3QgPSBJQ29uc3RydWN0PihcbiAgICBmaWx0ZXJGdW5jOiAobm9kZTogSUNvbnN0cnVjdCkgPT4gYm9vbGVhbixcbiAgICBwYXJlbnQ/OiBJQ29uc3RydWN0XG4gICk6IFQgfCB1bmRlZmluZWQge1xuICAgIGlmICghcGFyZW50KSB7XG4gICAgICBwYXJlbnQgPSBTdGFjay5vZih0aGlzKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IG5vZGUgb2YgcGFyZW50Lm5vZGUuY2hpbGRyZW4pIHtcbiAgICAgIGlmIChmaWx0ZXJGdW5jKG5vZGUpKSB7XG4gICAgICAgIHJldHVybiBub2RlIGFzIFQ7XG4gICAgICB9XG4gICAgICB0aGlzLmZpbmRFbGVtZW50PFQ+KGZpbHRlckZ1bmMsIG5vZGUpO1xuICAgIH1cblxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBwcml2YXRlIGFkZE1hcHBpbmdUb0Z1bmN0aW9uKFxuICAgIGZ1bmM6IGxhbWJkYS5GdW5jdGlvbixcbiAgICBrZXlWYWx1ZT86IHsga2V5OiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfVxuICApIHtcbiAgICBmb3IgKGNvbnN0IGZzIG9mIHRoaXMuZnVuY3Rpb25zU3BpZWQpIHtcbiAgICAgIGlmIChmcy5mdW5jdGlvbiA9PT0gZnVuYykge1xuICAgICAgICBpZiAoa2V5VmFsdWUpIHtcbiAgICAgICAgICBmcy5tYXBwaW5nW2tleVZhbHVlLmtleV0gPSBrZXlWYWx1ZS52YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgZnM6IEZ1bmN0aW9uU3BpZWQgPSB7XG4gICAgICBmdW5jdGlvbjogZnVuYyxcbiAgICAgIG1hcHBpbmc6IHt9LFxuICAgIH07XG5cbiAgICBpZiAoa2V5VmFsdWUpIHtcbiAgICAgIGZzLm1hcHBpbmdba2V5VmFsdWUua2V5XSA9IGtleVZhbHVlLnZhbHVlO1xuICAgIH1cblxuICAgIHRoaXMuZnVuY3Rpb25zU3BpZWQucHVzaChmcyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0QXNzZXRMb2NhdGlvbihsb2NhdGlvbjogc3RyaW5nKSB7XG4gIGNvbnN0IGxvYyA9IHBhdGguam9pbihfX2Rpcm5hbWUsICcuLi8nICsgbG9jYXRpb24pO1xuXG4gIGlmIChmcy5leGlzdHNTeW5jKGxvYykpIHtcbiAgICByZXR1cm4gbG9jO1xuICB9XG5cbiAgY29uc3QgbG9jMiA9IHBhdGguam9pbihfX2Rpcm5hbWUsICcuLi8uLi8nICsgbG9jYXRpb24pO1xuXG4gIGlmIChmcy5leGlzdHNTeW5jKGxvYzIpKSB7XG4gICAgcmV0dXJuIGxvYzI7XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoYExvY2F0aW9uICR7bG9jfSBhbmQgJHtsb2MyfSBkb2VzIG5vdCBleGlzdHMuYCk7XG59XG5cbnR5cGUgRnVuY3Rpb25TdWJzY3JpcHRpb24gPSB7XG4gIHN1YnNyaWJlZFRvcGljczogc25zLlRvcGljW107XG4gIHVzZWRGb3JFdmVudEJyaWRnZTogYm9vbGVhbjtcbiAgZnVuY3Rpb246IGxhbWJkYU5vZGUuTm9kZWpzRnVuY3Rpb247XG4gIG1hcHBpbmc6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG59O1xuXG50eXBlIEZ1bmN0aW9uU3BpZWQgPSB7XG4gIGZ1bmN0aW9uOiBsYW1iZGEuRnVuY3Rpb247XG4gIG1hcHBpbmc6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG59O1xuIl19
534
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2VydmVybGVzc1NweS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9TZXJ2ZXJsZXNzU3B5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQ3pCLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBQzdCLE9BQU8sS0FBSyxPQUFPLE1BQU0saUNBQWlDLENBQUM7QUFDM0QsT0FBTyxLQUFLLFVBQVUsTUFBTSw4Q0FBOEMsQ0FBQztBQUMzRSxPQUFPLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFekQsT0FBTyxLQUFLLFFBQVEsTUFBTSwwQkFBMEIsQ0FBQztBQUNyRCxPQUFPLEtBQUssTUFBTSxNQUFNLHdCQUF3QixDQUFDO0FBQ2pELE9BQU8sS0FBSyxPQUFPLE1BQU0sZ0NBQWdDLENBQUM7QUFDMUQsT0FBTyxLQUFLLE1BQU0sTUFBTSx3QkFBd0IsQ0FBQztBQUNqRCxPQUFPLEtBQUssY0FBYyxNQUFNLHNDQUFzQyxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUN0RSxPQUFPLEtBQUssVUFBVSxNQUFNLCtCQUErQixDQUFDO0FBQzVELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUMvRCxPQUFPLEtBQUssRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3pDLE9BQU8sS0FBSyxPQUFPLE1BQU0sa0NBQWtDLENBQUM7QUFDNUQsT0FBTyxLQUFLLEdBQUcsTUFBTSxxQkFBcUIsQ0FBQztBQUMzQyxPQUFPLEtBQUssT0FBTyxNQUFNLG1DQUFtQyxDQUFDO0FBQzdELE9BQU8sS0FBSyxHQUFHLE1BQU0scUJBQXFCLENBQUM7QUFDM0MsT0FBTyxFQUFFLFNBQVMsRUFBYyxNQUFNLFlBQVksQ0FBQztBQUNuRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUs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QzNDO2dCQUNELE9BQU87YUFDUjtTQUNGO1FBRUQsTUFBTSxFQUFFLEdBQWdCO1lBQ3RCLFFBQVEsRUFBRSxJQUFJO1lBQ2QsT0FBTyxFQUFFLEVBQUU7U0FDWixDQUFDO1FBRUYsSUFBSSxRQUFRLEVBQUU7WUFDWixFQUFFLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDO1NBQzNDO1FBRUQsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUVPLGdCQUFnQixDQUFDLFFBQWdCO1FBQ3ZDLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEtBQUssR0FBRyxRQUFRLENBQUMsQ0FBQztRQUVuRCxJQUFJLEVBQUUsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDdEIsT0FBTyxHQUFHLENBQUM7U0FDWjtRQUVELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLFFBQVEsR0FBRyxRQUFRLENBQUMsQ0FBQztRQUV2RCxJQUFJLEVBQUUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDdkIsT0FBTyxJQUFJLENBQUM7U0FDYjtRQUVELE1BQU0sSUFBSSxLQUFLLENBQUMsWUFBWSxHQUFHLFFBQVEsSUFBSSxtQkFBbUIsQ0FBQyxDQUFDO0lBQ2xFLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgKiBhcyBhcGlHd1YyIGZyb20gJ0Bhd3MtY2RrL2F3cy1hcGlnYXRld2F5djItYWxwaGEnO1xuaW1wb3J0ICogYXMgYXBpR3dWMkludCBmcm9tICdAYXdzLWNkay9hd3MtYXBpZ2F0ZXdheXYyLWludGVncmF0aW9ucy1hbHBoYSc7XG5pbXBvcnQgeyBDZm5PdXRwdXQsIER1cmF0aW9uLCBTdGFjayB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCAqIGFzIGFndyBmcm9tICdhd3MtY2RrLWxpYi9hd3MtYXBpZ2F0ZXdheXYyJztcbmltcG9ydCAqIGFzIGR5bmFtb0RiIGZyb20gJ2F3cy1jZGstbGliL2F3cy1keW5hbW9kYic7XG5pbXBvcnQgKiBhcyBldmVudHMgZnJvbSAnYXdzLWNkay1saWIvYXdzLWV2ZW50cyc7XG5pbXBvcnQgKiBhcyB0YXJnZXRzIGZyb20gJ2F3cy1jZGstbGliL2F3cy1ldmVudHMtdGFyZ2V0cyc7XG5pbXBvcnQgKiBhcyBsYW1iZGEgZnJvbSAnYXdzLWNkay1saWIvYXdzLWxhbWJkYSc7XG5pbXBvcnQgKiBhcyBkeW5hbW9EYlN0cmVhbSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtbGFtYmRhLWV2ZW50LXNvdXJjZXMnO1xuaW1wb3J0IHsgU3FzRXZlbnRTb3VyY2UgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtbGFtYmRhLWV2ZW50LXNvdXJjZXMnO1xuaW1wb3J0ICogYXMgbGFtYmRhTm9kZSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtbGFtYmRhLW5vZGVqcyc7XG5pbXBvcnQgeyBOb2RlanNGdW5jdGlvbiB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1sYW1iZGEtbm9kZWpzJztcbmltcG9ydCAqIGFzIHMzIGZyb20gJ2F3cy1jZGstbGliL2F3cy1zMyc7XG5pbXBvcnQgKiBhcyBzM25vdGlmIGZyb20gJ2F3cy1jZGstbGliL2F3cy1zMy1ub3RpZmljYXRpb25zJztcbmltcG9ydCAqIGFzIHNucyBmcm9tICdhd3MtY2RrLWxpYi9hd3Mtc25zJztcbmltcG9ydCAqIGFzIHNuc1N1YnMgZnJvbSAnYXdzLWNkay1saWIvYXdzLXNucy1zdWJzY3JpcHRpb25zJztcbmltcG9ydCAqIGFzIHNxcyBmcm9tICdhd3MtY2RrLWxpYi9hd3Mtc3FzJztcbmltcG9ydCB7IENvbnN0cnVjdCwgSUNvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgZW52VmFyaWFibGVOYW1lcyB9IGZyb20gJy4vY29tbW9uL2VudlZhcmlhYmxlTmFtZXMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZlcmxlc3NTcHlQcm9wcyB7XG4gIHJlYWRvbmx5IGdlbmVyYXRlU3B5RXZlbnRzRmlsZUxvY2F0aW9uPzogc3RyaW5nO1xuICByZWFkb25seSBzcHlTcXNXaXRoTm9TdWJzY3JpcHRpb25BbmREcm9wQWxsTWVzc2FnZXM/OiBib29sZWFuO1xuICByZWFkb25seSBkZWJ1Z01vZGU/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNweUZpbHRlciB7XG4gIHJlYWRvbmx5IHNweUxhbWJkYT86IGJvb2xlYW47XG4gIHJlYWRvbmx5IHNweVNxcz86IGJvb2xlYW47XG4gIHJlYWRvbmx5IHNweVNuc1RvcGljPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgc3B5U25zU3Vic3JpcHRpb24/OiBib29sZWFuO1xuICByZWFkb25seSBzcHlFdmVudEJyaWRnZT86IGJvb2xlYW47XG4gIHJlYWRvbmx5IHNweUV2ZW50QnJpZGdlUnVsZT86IGJvb2xlYW47XG4gIHJlYWRvbmx5IHNweVMzPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgc3B5RHluYW1vREI/OiBib29sZWFuO1xufVxuXG5leHBvcnQgY2xhc3MgU2VydmVybGVzc1NweSBleHRlbmRzIENvbnN0cnVjdCB7XG4gIHByaXZhdGUgZXh0ZW5zaW9uTGF5ZXI6IGxhbWJkYS5MYXllclZlcnNpb247XG4gIHByaXZhdGUgdGFibGU6IGR5bmFtb0RiLlRhYmxlO1xuICBwcml2YXRlIHdlYlNvY2tldEFwaTogYXBpR3dWMi5XZWJTb2NrZXRBcGk7XG4gIHByaXZhdGUgY3JlYXRlZFJlc291cmNlc0J5U1NweTogSUNvbnN0cnVjdFtdID0gW107XG4gIHByaXZhdGUgbGFtYmRhU3Vic2NyaXB0aW9uUG9vbDogTGFtYmRhU3Vic2NyaXB0aW9uW10gPSBbXTtcbiAgcHJpdmF0ZSBsYW1iZGFTdWJzY3JpcHRpb25NYWluOiBMYW1iZGFTdWJzY3JpcHRpb247XG4gIHByaXZhdGUgbGFtYmRhc1NwaWVkOiBMYW1iZGFTcGllZFtdID0gW107XG4gIHByaXZhdGUgd2ViU29ja2V0U3RhZ2U6IGFwaUd3VjIuV2ViU29ja2V0U3RhZ2U7XG4gIHB1YmxpYyBzZXJ2aWNlS2V5czogc3RyaW5nW10gPSBbXTtcbiAgcHJpdmF0ZSBzcGllZE5vZGVzOiBJQ29uc3RydWN0W10gPSBbXTtcbiAgd3NVcmw6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBzY29wZTogQ29uc3RydWN0LFxuICAgIGlkOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSBwcm9wcz86IFNlcnZlcmxlc3NTcHlQcm9wc1xuICApIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgdGhpcy5leHRlbnNpb25MYXllciA9IG5ldyBsYW1iZGEuTGF5ZXJWZXJzaW9uKHRoaXMsICdFeHRlbnNpb24nLCB7XG4gICAgICBjb21wYXRpYmxlUnVudGltZXM6IFtcbiAgICAgICAgbGFtYmRhLlJ1bnRpbWUuTk9ERUpTXzEyX1gsXG4gICAgICAgIGxhbWJkYS5SdW50aW1lLk5PREVKU18xNF9YLFxuICAgICAgICBsYW1iZGEuUnVudGltZS5OT0RFSlNfMTZfWCxcbiAgICAgIF0sXG4gICAgICBjb2RlOiBsYW1iZGEuQ29kZS5mcm9tQXNzZXQodGhpcy5nZXRFeHRlbnNpb25Bc3NldExvY2F0aW9uKCkpLFxuICAgIH0pO1xuICAgIHRoaXMuY3JlYXRlZFJlc291cmNlc0J5U1NweS5wdXNoKHRoaXMuZXh0ZW5zaW9uTGF5ZXIpO1xuXG4gICAgdGhpcy50YWJsZSA9IG5ldyBkeW5hbW9EYi5UYWJsZSh0aGlzLCAnV2ViU29ja2V0Jywge1xuICAgICAgcGFydGl0aW9uS2V5OiB7XG4gICAgICAgIG5hbWU6ICdjb25uZWN0aW9uSWQnLFxuICAgICAgICB0eXBlOiBkeW5hbW9EYi5BdHRyaWJ1dGVUeXBlLlNUUklORyxcbiAgICAgIH0sXG4gICAgICBiaWxsaW5nTW9kZTogZHluYW1vRGIuQmlsbGluZ01vZGUuUEFZX1BFUl9SRVFVRVNULFxuICAgIH0pO1xuICAgIHRoaXMuY3JlYXRlZFJlc291cmNlc0J5U1NweS5wdXNoKHRoaXMudGFibGUpO1xuXG4gICAgY29uc3QgZW52VmFycyA9IHRoaXMuZ2V0RGFmYXVsdExhbWJkYUVudmlyb25tZW50VmFyaWFibGVzKCk7XG5cbiAgICBpZiAodGhpcy5wcm9wcz8uZGVidWdNb2RlKSB7XG4gICAgICBlbnZWYXJzW2VudlZhcmlhYmxlTmFtZXMuU1NQWV9ERUJVR10gPSAndHJ1ZSc7XG4gICAgfVxuXG4gICAgY29uc3QgZnVuY3Rpb25PbkNvbm5lY3QgPSBuZXcgbGFtYmRhTm9kZS5Ob2RlanNGdW5jdGlvbih0aGlzLCAnT25Db25uZWN0Jywge1xuICAgICAgbWVtb3J5U2l6ZTogNTEyLFxuICAgICAgdGltZW91dDogRHVyYXRpb24uc2Vjb25kcyg1KSxcbiAgICAgIHJ1bnRpbWU6IGxhbWJkYS5SdW50aW1lLk5PREVKU18xNl9YLFxuICAgICAgaGFuZGxlcjogJ2hhbmRsZXInLFxuICAgICAgZW50cnk6IHRoaXMuZ2V0QXNzZXRMb2NhdGlvbignZnVuY3Rpb25zL29uQ29ubmVjdC50cycpLFxuICAgICAgZW52aXJvbm1lbnQ6IGVudlZhcnMsXG4gICAgfSk7XG4gICAgdGhpcy50YWJsZS5ncmFudFdyaXRlRGF0YShmdW5jdGlvbk9uQ29ubmVjdCk7XG4gICAgdGhpcy5jcmVhdGVkUmVzb3VyY2VzQnlTU3B5LnB1c2goZnVuY3Rpb25PbkNvbm5lY3QpO1xuXG4gICAgY29uc3QgZnVuY3Rpb25PbkRpc2Nvbm5lY3QgPSBuZXcgbGFtYmRhTm9kZS5Ob2RlanNGdW5jdGlvbihcbiAgICAgIHRoaXMsXG4gICAgICAnT25EaXNjb25uZWN0JyxcbiAgICAgIHtcbiAgICAgICAgbWVtb3J5U2l6ZTogNTEyLFxuICAgICAgICB0aW1lb3V0OiBEdXJhdGlvbi5zZWNvbmRzKDUpLFxuICAgICAgICBydW50aW1lOiBsYW1iZGEuUnVudGltZS5OT0RFSlNfMTZfWCxcbiAgICAgICAgaGFuZGxlcjogJ2hhbmRsZXInLFxuICAgICAgICBlbnRyeTogdGhpcy5nZXRBc3NldExvY2F0aW9uKCdmdW5jdGlvbnMvb25EaXNjb25uZWN0LnRzJyksXG4gICAgICAgIGVudmlyb25tZW50OiBlbnZWYXJzLFxuICAgICAgfVxuICAgICk7XG4gICAgdGhpcy50YWJsZS5ncmFudFdyaXRlRGF0YShmdW5jdGlvbk9uRGlzY29ubmVjdCk7XG4gICAgdGhpcy5jcmVhdGVkUmVzb3VyY2VzQnlTU3B5LnB1c2goZnVuY3Rpb25PbkRpc2Nvbm5lY3QpO1xuXG4gICAgdGhpcy53ZWJTb2NrZXRBcGkgPSBuZXcgYXBpR3dWMi5XZWJTb2NrZXRBcGkodGhpcywgJ0FwaUd3V2ViU29ja2V0Jyk7XG4gICAgdGhpcy5jcmVhdGVkUmVzb3VyY2VzQnlTU3B5LnB1c2godGhpcy53ZWJTb2NrZXRBcGkpO1xuICAgIHRoaXMud2ViU29ja2V0U3RhZ2UgPSBuZXcgYXBpR3dWMi5XZWJTb2NrZXRTdGFnZShcbiAgICAgIHRoaXMsXG4gICAgICAnQXBpR3dXZWJTb2NrZXRTdGFnZScsXG4gICAgICB7XG4gICAgICAgIHdlYlNvY2tldEFwaTogdGhpcy53ZWJTb2NrZXRBcGksXG4gICAgICAgIHN0YWdlTmFtZTogJ3Byb2QnLFxuICAgICAgICBhdXRvRGVwbG95OiB0cnVlLFxuICAgICAgfVxuICAgICk7XG4gICAgdGhpcy5jcmVhdGVkUmVzb3VyY2VzQnlTU3B5LnB1c2godGhpcy53ZWJTb2NrZXRTdGFnZSk7XG4gICAgY29uc3Qgd2ViU29ja2V0QXBpUm91dGUgPSB0aGlzLndlYlNvY2tldEFwaS5hZGRSb3V0ZSgnJGNvbm5lY3QnLCB7XG4gICAgICBpbnRlZ3JhdGlvbjogbmV3IGFwaUd3VjJJbnQuV2ViU29ja2V0TGFtYmRhSW50ZWdyYXRpb24oXG4gICAgICAgICckY29ubmVjdCcsXG4gICAgICAgIGZ1bmN0aW9uT25Db25uZWN0XG4gICAgICApLFxuICAgIH0pO1xuICAgICh3ZWJTb2NrZXRBcGlSb3V0ZS5ub2RlLmRlZmF1bHRDaGlsZCBhcyBhZ3cuQ2ZuUm91dGUpLmF1dGhvcml6YXRpb25UeXBlID1cbiAgICAgICdBV1NfSUFNJztcblxuICAgIHRoaXMud2ViU29ja2V0QXBpLmFkZFJvdXRlKCckZGlzY29ubmVjdCcsIHtcbiAgICAgIGludGVncmF0aW9uOiBuZXcgYXBpR3dWMkludC5XZWJTb2NrZXRMYW1iZGFJbnRlZ3JhdGlvbihcbiAgICAgICAgJyRkaXNjb25uZWN0JyxcbiAgICAgICAgZnVuY3Rpb25PbkRpc2Nvbm5lY3RcbiAgICAgICksXG4gICAgfSk7XG5cbiAgICB0aGlzLmxhbWJkYVN1YnNjcmlwdGlvbk1haW4gPSB0aGlzLnByb3ZpZGVGdW5jdGlvbkZvclN1YnNjcmlwdGlvbigpO1xuXG4gICAgdGhpcy53ZWJTb2NrZXRBcGkuYWRkUm91dGUoJ3NlbmRtZXNzYWdlJywge1xuICAgICAgaW50ZWdyYXRpb246IG5ldyBhcGlHd1YySW50LldlYlNvY2tldExhbWJkYUludGVncmF0aW9uKFxuICAgICAgICAnU2VuZE1lc3NhZ2UnLFxuICAgICAgICB0aGlzLmxhbWJkYVN1YnNjcmlwdGlvbk1haW4uZnVuY3Rpb25cbiAgICAgICksXG4gICAgfSk7XG5cbiAgICB0aGlzLndzVXJsID0gYHdzczovLyR7dGhpcy53ZWJTb2NrZXRBcGkuYXBpSWR9LmV4ZWN1dGUtYXBpLiR7XG4gICAgICBTdGFjay5vZih0aGlzKS5yZWdpb25cbiAgICB9LmFtYXpvbmF3cy5jb20vJHt0aGlzLndlYlNvY2tldFN0YWdlLnN0YWdlTmFtZX1gO1xuXG4gICAgbmV3IENmbk91dHB1dChTdGFjay5vZih0aGlzKSwgJ1NlcnZlcmxlc3NTcHlXc1VybCcsIHtcbiAgICAgIHZhbHVlOiB0aGlzLndzVXJsLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXREYWZhdWx0TGFtYmRhRW52aXJvbm1lbnRWYXJpYWJsZXMoKTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIFtlbnZWYXJpYWJsZU5hbWVzLlNTUFlfV1NfVEFCTEVfTkFNRV06IHRoaXMudGFibGUudGFibGVOYW1lLFxuICAgICAgTk9ERV9PUFRJT05TOiAnLS1lbmFibGUtc291cmNlLW1hcHMnLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogSW5pdGFsaXplIHNweWluZyBvbiByZXNvdXJjZXMgZ2l2ZW4gYXMgcGFyYW1ldGVyLlxuICAgKiBAcGFyYW0gbm9kZXMgV2hpY2ggcmVvdXJjZXMgYW5kIHRoZWlyIGNoaWxkcmVuIHRvIHNweSBvbi5cbiAgICovXG4gIHB1YmxpYyBzcHlOb2Rlcyhub2RlczogSUNvbnN0cnVjdFtdKSB7XG4gICAgZm9yIChjb25zdCBub2RlIG9mIG5vZGVzKSB7XG4gICAgICBsZXQgbnMgPSB0aGlzLmdldEFsbE5vZGVzKG5vZGUpO1xuICAgICAgdGhpcy5pbnRlcm5hbFNweU5vZGVzKG5zKTtcbiAgICB9XG5cbiAgICB0aGlzLmZpbmlhbGl6ZVNweSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRhbGl6ZSBzcHlpbmcgb24gcmVzb3VyY2VzLlxuICAgKiBAcGFyYW0gZmlsdGVyIExpbWl0IHdoaWNoIHJlc291cmNlcyB0byBzcHkgb24uXG4gICAqL1xuICBwdWJsaWMgc3B5KGZpbHRlcj86IFNweUZpbHRlcikge1xuICAgIGxldCBub2RlcyA9IHRoaXMuZ2V0QWxsTm9kZXMoU3RhY2sub2YodGhpcykpO1xuXG4gICAgY29uc3QgZmlsdGVyV2l0aERlZmF1bHRzOiBSZXF1aXJlZDxTcHlGaWx0ZXI+ID0ge1xuICAgICAgc3B5TGFtYmRhOiB0cnVlLFxuICAgICAgc3B5U3FzOiB0cnVlLFxuICAgICAgc3B5U25zVG9waWM6IHRydWUsXG4gICAgICBzcHlTbnNTdWJzcmlwdGlvbjogdHJ1ZSxcbiAgICAgIHNweUV2ZW50QnJpZGdlOiB0cnVlLFxuICAgICAgc3B5RXZlbnRCcmlkZ2VSdWxlOiB0cnVlLFxuICAgICAgc3B5UzM6IHRydWUsXG4gICAgICBzcHlEeW5hbW9EQjogdHJ1ZSxcbiAgICAgIC4uLmZpbHRlcixcbiAgICB9O1xuXG4gICAgbm9kZXMgPSBub2Rlcy5maWx0ZXIoKG5vZGUpID0+IHtcbiAgICAgIGlmIChmaWx0ZXJXaXRoRGVmYXVsdHMuc3B5TGFtYmRhICYmIG5vZGUgaW5zdGFuY2VvZiBsYW1iZGEuRnVuY3Rpb24pIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IGVsc2UgaWYgKGZpbHRlcldpdGhEZWZhdWx0cy5zcHlTbnNUb3BpYyAmJiBub2RlIGluc3RhbmNlb2Ygc25zLlRvcGljKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgZmlsdGVyV2l0aERlZmF1bHRzLnNweVNuc1N1YnNyaXB0aW9uICYmXG4gICAgICAgIG5vZGUgaW5zdGFuY2VvZiBzbnMuU3Vic2NyaXB0aW9uXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IGVsc2UgaWYgKGZpbHRlcldpdGhEZWZhdWx0cy5zcHlTMyAmJiBub2RlIGluc3RhbmNlb2YgczMuQnVja2V0KSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgZmlsdGVyV2l0aERlZmF1bHRzLnNweUR5bmFtb0RCICYmXG4gICAgICAgIG5vZGUgaW5zdGFuY2VvZiBkeW5hbW9EYi5UYWJsZVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgZmlsdGVyV2l0aERlZmF1bHRzLnNweUV2ZW50QnJpZGdlICYmXG4gICAgICAgIG5vZGUgaW5zdGFuY2VvZiBldmVudHMuRXZlbnRCdXNcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIGZpbHRlcldpdGhEZWZhdWx0cy5zcHlFdmVudEJyaWRnZVJ1bGUgJiZcbiAgICAgICAgbm9kZSBpbnN0YW5jZW9mIGV2ZW50cy5SdWxlXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICBmaWx0ZXJXaXRoRGVmYXVsdHMuc3B5U3FzICYmXG4gICAgICAgIG5vZGUgaW5zdGFuY2VvZiBsYW1iZGEuQ2ZuRXZlbnRTb3VyY2VNYXBwaW5nXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICBmaWx0ZXJXaXRoRGVmYXVsdHMuc3B5U3FzICYmXG4gICAgICAgIHRoaXMucHJvcHM/LnNweVNxc1dpdGhOb1N1YnNjcmlwdGlvbkFuZERyb3BBbGxNZXNzYWdlcyAmJlxuICAgICAgICBub2RlIGluc3RhbmNlb2Ygc3FzLlF1ZXVlXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9KTtcblxuICAgIHRoaXMuaW50ZXJuYWxTcHlOb2Rlcyhub2Rlcyk7XG4gICAgdGhpcy5maW5pYWxpemVTcHkoKTtcbiAgfVxuXG4gIHByaXZhdGUgaW50ZXJuYWxTcHlOb2Rlcyhub2RlczogSUNvbnN0cnVjdFtdKSB7XG4gICAgZm9yIChjb25zdCBub2RlIG9mIG5vZGVzKSB7XG4gICAgICB0aGlzLmludGVybmFsU3B5Tm9kZShub2RlKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGZpbmlhbGl6ZVNweSgpIHtcbiAgICAvL3NldCBtYXBwaW5nIHByb3BlcnR5IGZvciBhbGwgZnVuY3Rpb25zIHdlIGNyZWF0ZWRcbiAgICBmb3IgKGNvbnN0IGZ1bmMgb2YgdGhpcy5sYW1iZGFTdWJzY3JpcHRpb25Qb29sKSB7XG4gICAgICBmdW5jLmZ1bmN0aW9uLmFkZEVudmlyb25tZW50KFxuICAgICAgICBlbnZWYXJpYWJsZU5hbWVzLlNTUFlfSU5GUkFfTUFQUElORyxcbiAgICAgICAgSlNPTi5zdHJpbmdpZnkoZnVuYy5tYXBwaW5nKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvL3NldCBtYXBwaW5nIHByb3BlcnR5IGZvciBhbGwgZnVuY3Rpb25zIHdlIHNweSBvblxuICAgIGZvciAoY29uc3QgZnVuYyBvZiB0aGlzLmxhbWJkYXNTcGllZCkge1xuICAgICAgZnVuYy5mdW5jdGlvbi5hZGRFbnZpcm9ubWVudChcbiAgICAgICAgZW52VmFyaWFibGVOYW1lcy5TU1BZX0lORlJBX01BUFBJTkcsXG4gICAgICAgIEpTT04uc3RyaW5naWZ5KGZ1bmMubWFwcGluZylcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucHJvcHM/LmdlbmVyYXRlU3B5RXZlbnRzRmlsZUxvY2F0aW9uKSB7XG4gICAgICB0aGlzLndyaXRlU3B5RXZlbnRzQ2xhc3ModGhpcy5wcm9wcz8uZ2VuZXJhdGVTcHlFdmVudHNGaWxlTG9jYXRpb24pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0RXh0ZW5zaW9uQXNzZXRMb2NhdGlvbigpIHtcbiAgICBsZXQgZXh0ZW5zaW9uQXNzZXRMb2NhdGlvbiA9IHBhdGguam9pbihcbiAgICAgIF9fZGlybmFtZSxcbiAgICAgICcuLi9leHRlbnNpb24vZGlzdC9sYXllcidcbiAgICApO1xuXG4gICAgY29uc3QgZXh0ZW5zaW9uQXNzZXRMb2NhdGlvbkFsdCA9IHBhdGguam9pbihcbiAgICAgIF9fZGlybmFtZSxcbiAgICAgICcuLi9saWIvZXh0ZW5zaW9uL2Rpc3QvbGF5ZXInXG4gICAgKTtcblxuICAgIGlmICghZnMuZXhpc3RzU3luYyhleHRlbnNpb25Bc3NldExvY2F0aW9uKSkge1xuICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKGV4dGVuc2lvbkFzc2V0TG9jYXRpb25BbHQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgRm9sZGVyIHdpdGggYXNzZXRzIGZvciBleHRlbnNpb24gZG9lcyBub3QgZXhpc3RzIGF0ICR7ZXh0ZW5zaW9uQXNzZXRMb2NhdGlvbn0gb3IgYXQgJHtleHRlbnNpb25Bc3NldExvY2F0aW9uQWx0fSBgXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBleHRlbnNpb25Bc3NldExvY2F0aW9uID0gZXh0ZW5zaW9uQXNzZXRMb2NhdGlvbkFsdDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBleHRlbnNpb25Bc3NldExvY2F0aW9uV3JhcGVyID0gcGF0aC5qb2luKFxuICAgICAgZXh0ZW5zaW9uQXNzZXRMb2NhdGlvbixcbiAgICAgICdzcHktd3JhcHBlcidcbiAgICApO1xuICAgIGlmICghZnMuZXhpc3RzU3luYyhleHRlbnNpb25Bc3NldExvY2F0aW9uV3JhcGVyKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgV3JhcGVyIHNjcmlwdCBmb3IgZXh0ZW5zaW9uIGRvZXMgbm90IGV4aXN0cyAke2V4dGVuc2lvbkFzc2V0TG9jYXRpb259YFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBleHRlbnNpb25Bc3NldExvY2F0aW9uQ29kZSA9IHBhdGguam9pbihcbiAgICAgIGV4dGVuc2lvbkFzc2V0TG9jYXRpb24sXG4gICAgICAnbm9kZWpzL25vZGVfbW9kdWxlcy9pbnRlcmNlcHRvci5qcydcbiAgICApO1xuICAgIGlmICghZnMuZXhpc3RzU3luYyhleHRlbnNpb25Bc3NldExvY2F0aW9uQ29kZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYENvZGUgZm9yIGV4dGVuc2lvbiBkb2VzIG5vdCBleGlzdHMgJHtleHRlbnNpb25Bc3NldExvY2F0aW9uQ29kZX1gXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gZXh0ZW5zaW9uQXNzZXRMb2NhdGlvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBXcml0ZSBTcHlFdmVudHMgY2xhc3MsIHdoaWNoIGhlbHBzIHdpdGggd3JpdGluZyB0aGUgY29kZSBmb3IgdGVzdHMuXG4gICAqIEBwYXJhbSBmaWxlTG9jYXRpb25cbiAgICovXG4gIHByaXZhdGUgd3JpdGVTcHlFdmVudHNDbGFzcyhmaWxlTG9jYXRpb246IHN0cmluZykge1xuICAgIGZzLm1rZGlyU3luYyhwYXRoLmRpcm5hbWUoZmlsZUxvY2F0aW9uKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgICBjb25zdCBwcm9wZXJ0aWVzID0gdGhpcy5zZXJ2aWNlS2V5c1xuICAgICAgLm1hcCgoc2spID0+IGAgICR7c2sucmVwbGFjZSgvIy9nLCAnJyl9OiAnJHtza30nID0gJyR7c2t9JztcXG5gKVxuICAgICAgLmpvaW4oJycpO1xuXG4gICAgY29uc3QgY29kZSA9IGAvKiBlc2xpbnQtZGlzYWJsZSAqL1xcbmV4cG9ydCBjbGFzcyBTZXJ2ZXJsZXNzU3B5RXZlbnRzIHtcXG4ke3Byb3BlcnRpZXN9fVxcbmA7XG5cbiAgICBmcy53cml0ZUZpbGVTeW5jKGZpbGVMb2NhdGlvbiwgY29kZSk7XG4gIH1cblxuICBwcml2YXRlIGdldEFsbE5vZGVzKHBhcmVudDogSUNvbnN0cnVjdCkge1xuICAgIGNvbnN0IG5vZGVzOiBJQ29uc3RydWN0W10gPSBbXTtcbiAgICBub2Rlcy5wdXNoKHBhcmVudCk7XG4gICAgdGhpcy5nZXRBbGxOb2Rlc1JlY3Vyc2l2ZShwYXJlbnQsIG5vZGVzKTtcbiAgICByZXR1cm4gbm9kZXM7XG4gIH1cblxuICBwcml2YXRlIGdldEFsbE5vZGVzUmVjdXJzaXZlKHBhcmVudDogSUNvbnN0cnVjdCwgbm9kZXM6IElDb25zdHJ1Y3RbXSkge1xuICAgIGZvciAoY29uc3Qgbm9kZSBvZiBwYXJlbnQubm9kZS5jaGlsZHJlbikge1xuICAgICAgbm9kZXMucHVzaChub2RlKTtcbiAgICAgIHRoaXMuZ2V0QWxsTm9kZXNSZWN1cnNpdmUobm9kZSwgbm9kZXMpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaW50ZXJuYWxTcHlOb2RlKG5vZGU6IElDb25zdHJ1Y3QpIHtcbiAgICBpZiAodGhpcy5zcGllZE5vZGVzLmluY2x1ZGVzKG5vZGUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5zcGllZE5vZGVzLnB1c2gobm9kZSk7XG5cbiAgICBpZiAodGhpcy5jcmVhdGVkUmVzb3VyY2VzQnlTU3B5LmluY2x1ZGVzKG5vZGUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMubGFtYmRhU3Vic2NyaXB0aW9uUG9vbC5maW5kKChzKSA9PiBzLmZ1bmN0aW9uID09PSBub2RlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnByb3BzPy5kZWJ1Z01vZGUpIHtcbiAgICAgIGNvbnNvbGUuaW5mbygnU3B5IG9uIG5vZGUnLCB0aGlzLmdldENvbnN0cnVjdE5hbWUobm9kZSkpO1xuICAgIH1cblxuICAgIGlmIChub2RlIGluc3RhbmNlb2YgbGFtYmRhLkZ1bmN0aW9uKSB7XG4gICAgICB0aGlzLmludGVybmFsU3B5TGFtYmRhKG5vZGUpO1xuICAgIH0gZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIHNucy5Ub3BpYykge1xuICAgICAgdGhpcy5pbnRlcm5hbFNweVNuc1RvcGljKG5vZGUpO1xuICAgIH0gZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIHNucy5TdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuaW50ZXJuYWxTcHlTbnNTdWJzY3JpcHRpb24obm9kZSk7XG4gICAgfSBlbHNlIGlmIChub2RlIGluc3RhbmNlb2YgczMuQnVja2V0KSB7XG4gICAgICB0aGlzLmludGVybmFsU3B5UzMobm9kZSk7XG4gICAgfSBlbHNlIGlmIChub2RlIGluc3RhbmNlb2YgZHluYW1vRGIuVGFibGUpIHtcbiAgICAgIHRoaXMuaW50ZXJuYWxTcHlEeW5hbW9kYihub2RlKTtcbiAgICB9IGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBldmVudHMuRXZlbnRCdXMpIHtcbiAgICAgIHRoaXMuaW50ZXJuYWxTcHlFdmVudEJ1cyhub2RlKTtcbiAgICB9IGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBldmVudHMuUnVsZSkge1xuICAgICAgdGhpcy5pbnRlcm5hbFNweUV2ZW50QnVzUnVsZShub2RlKTtcbiAgICB9IGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBsYW1iZGEuQ2ZuRXZlbnRTb3VyY2VNYXBwaW5nKSB7XG4gICAgICB0aGlzLmludGVybmFsU3B5U3FzKG5vZGUpO1xuICAgIH0gZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIHNxcy5RdWV1ZSkge1xuICAgICAgaWYgKHRoaXMucHJvcHM/LnNweVNxc1dpdGhOb1N1YnNjcmlwdGlvbkFuZERyb3BBbGxNZXNzYWdlcykge1xuICAgICAgICB0aGlzLmludGVybmFsU3B5U3B5U3FzV2l0aE5vU3Vic2NyaXB0aW9uKG5vZGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaW50ZXJuYWxTcHlTcHlTcXNXaXRoTm9TdWJzY3JpcHRpb24ocXVldWU6IHNxcy5RdWV1ZSkge1xuICAgIGNvbnN0IHN1YnNjcmlwdGlvbiA9IHRoaXMuZmluZEVsZW1lbnQ8bGFtYmRhLkNmbkV2ZW50U291cmNlTWFwcGluZz4oXG4gICAgICAobjogSUNvbnN0cnVjdCkgPT5cbiAgICAgICAgbiBpbnN0YW5jZW9mIGxhbWJkYS5DZm5FdmVudFNvdXJjZU1hcHBpbmcgJiZcbiAgICAgICAgKG4gYXMgbGFtYmRhLkNmbkV2ZW50U291cmNlTWFwcGluZykuZXZlbnRTb3VyY2VBcm4gPT09IHF1ZXVlLnF1ZXVlQXJuXG4gICAgKTtcblxuICAgIGlmIChzdWJzY3JpcHRpb24pIHtcbiAgICAgIHJldHVybjsgLy9hbHJlYWR5IGhhdmUgc3Vic2NyaXB0aW9uXG4gICAgfVxuXG4gICAgY29uc29sZS5sb2coJyoqKioqKioqKiogQUREIExBTUJEQSAqKioqKioqKioqKioqKioqKioqJyk7XG4gICAgY29uc3QgcXVldWVOYW1lID0gdGhpcy5nZXRDb25zdHJ1Y3ROYW1lKHF1ZXVlKTtcbiAgICBjb25zdCBmdW5jID0gbmV3IE5vZGVqc0Z1bmN0aW9uKFxuICAgICAgdGhpcyxcbiAgICAgIGAke3F1ZXVlTmFtZX1TcXNTdWJzY3JpcHRpb25BbmREcm9wQWxsTWVzc2FnZXNgLFxuICAgICAge1xuICAgICAgICBtZW1vcnlTaXplOiA1MTIsXG4gICAgICAgIHRpbWVvdXQ6IER1cmF0aW9uLnNlY29uZHMoNSksXG4gICAgICAgIHJ1bnRpbWU6IGxhbWJkYS5SdW50aW1lLk5PREVKU18xNl9YLFxuICAgICAgICBoYW5kbGVyOiAnaGFuZGxlcicsXG4gICAgICAgIGVudHJ5OiB0aGlzLmdldEFzc2V0TG9jYXRpb24oXG4gICAgICAgICAgJ2Z1bmN0aW9ucy9zcXNTdWJzY3JpcHRpb25BbmREcm9wQWxsTWVzc2FnZXMudHMnXG4gICAgICAgICksXG4gICAgICAgIGVudmlyb25tZW50OiB0aGlzLmdldERhZmF1bHRMYW1iZGFFbnZpcm9ubWVudFZhcmlhYmxlcygpLFxuICAgICAgfVxuICAgICk7XG4gICAgZnVuYy5hZGRFdmVudFNvdXJjZShuZXcgU3FzRXZlbnRTb3VyY2UocXVldWUpKTtcblxuICAgIC8vXG4gICAgZnVuYy5hZGRMYXllcnModGhpcy5leHRlbnNpb25MYXllcik7XG5cbiAgICAvL2NvbnN0IGZ1bmN0aW9uTmFtZSA9IHRoaXMuZ2V0Q29uc3RydWN0TmFtZShmdW5jKTtcblxuICAgIC8vZnVuYy5hZGRFbnZpcm9ubWVudChlbnZWYXJpYWJsZU5hbWVzLlNTUFlfRlVOQ1RJT05fTkFNRSwgZnVuY3Rpb25OYW1lKTtcbiAgICBmdW5jLmFkZEVudmlyb25tZW50KCdBV1NfTEFNQkRBX0VYRUNfV1JBUFBFUicsICcvb3B0L3NweS13cmFwcGVyJyk7XG4gICAgZnVuYy5hZGRFbnZpcm9ubWVudChcbiAgICAgIGVudlZhcmlhYmxlTmFtZXMuU1NQWV9XU19FTkRQT0lOVCxcbiAgICAgIHRoaXMuZ2V0V3NFbmRwb2ludCgpXG4gICAgKTtcblxuICAgIGlmICh0aGlzLnByb3BzPy5kZWJ1Z01vZGUpIHtcbiAgICAgIGZ1bmMuYWRkRW52aXJvbm1lbnQoZW52VmFyaWFibGVOYW1lcy5TU1BZX0RFQlVHLCAndHJ1ZScpO1xuICAgIH1cblxuICAgIHRoaXMudGFibGUuZ3JhbnRXcml0ZURhdGEoZnVuYyk7XG4gICAgdGhpcy50YWJsZS5ncmFudFJlYWREYXRhKGZ1bmMpO1xuICAgIHRoaXMud2ViU29ja2V0QXBpLmdyYW50TWFuYWdlQ29ubmVjdGlvbnMoZnVuYyk7XG4gICAgLy9cblxuICAgIHRoaXMuY3JlYXRlZFJlc291cmNlc0J5U1NweS5wdXNoKGZ1bmMpO1xuXG4gICAgY29uc3Qgc2VydmljZUtleSA9IGBTcXMjJHtxdWV1ZU5hbWV9YDtcblxuICAgIHRoaXMuYWRkTWFwcGluZ1RvRnVuY3Rpb24oZnVuYywge1xuICAgICAga2V5OiBxdWV1ZS5xdWV1ZUFybixcbiAgICAgIHZhbHVlOiBzZXJ2aWNlS2V5LFxuICAgIH0pO1xuXG4gICAgdGhpcy5zZXJ2aWNlS2V5cy5wdXNoKHNlcnZpY2VLZXkpO1xuICAgIGZ1bmMuYWRkRW52aXJvbm1lbnQoZW52VmFyaWFibGVOYW1lcy5TU1BZX1NVQlNDUklCRURfVE9fU1FTLCAndHJ1ZScpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbnRlcm5hbFNweVNxcyhub2RlOiBsYW1iZGEuQ2ZuRXZlbnRTb3VyY2VNYXBwaW5nKSB7XG4gICAgY29uc3QgcXVldWUgPSB0aGlzLmZpbmRFbGVtZW50PHNxcy5RdWV1ZT4oXG4gICAgICAobjogSUNvbnN0cnVjdCkgPT5cbiAgICAgICAgbiBpbnN0YW5jZW9mIHNxcy5RdWV1ZSAmJlxuICAgICAgICAobiBhcyBzcXMuUXVldWUpLnF1ZXVlQXJuID09PSBub2RlLmV2ZW50U291cmNlQXJuXG4gICAgKTtcblxuICAgIGNvbnN0IGZ1bmMgPSB0aGlzLmZpbmRFbGVtZW50PGxhbWJkYS5GdW5jdGlvbj4oXG4gICAgICAobjogSUNvbnN0cnVjdCkgPT5cbiAgICAgICAgbiBpbnN0YW5jZW9mIGxhbWJkYS5GdW5jdGlvbiAmJlxuICAgICAgICAobiBhcyBsYW1iZGEuRnVuY3Rpb24pLmZ1bmN0aW9uTmFtZSA9PT0gbm9kZS5mdW5jdGlvbk5hbWVcbiAgICApO1xuXG4gICAgaWYgKHF1ZXVlICYmIGZ1bmMpIHtcbiAgICAgIGNvbnN0IHF1ZXVlTmFtZSA9IHRoaXMuZ2V0Q29uc3RydWN0TmFtZShxdWV1ZSk7XG5cbiAgICAgIGNvbnN0IHNlcnZpY2VLZXkgPSBgU3FzIyR7cXVldWVOYW1lfWA7XG5cbiAgICAgIHRoaXMuYWRkTWFwcGluZ1RvRnVuY3Rpb24oZnVuYywge1xuICAgICAgICBrZXk6IHF1ZXVlLnF1ZXVlQXJuLFxuICAgICAgICB2YWx1ZTogc2VydmljZUtleSxcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLnNlcnZpY2VLZXlzLnB1c2goc2VydmljZUtleSk7XG4gICAgICBmdW5jLmFkZEVudmlyb25tZW50KGVudlZhcmlhYmxlTmFtZXMuU1NQWV9TVUJTQ1JJQkVEX1RPX1NRUywgJ3RydWUnKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUZ1bmN0aW9uRm9yU3Vic2NyaXB0aW9uKGluZGV4OiBudW1iZXIpIHtcbiAgICBjb25zdCBmdW5jID0gbmV3IGxhbWJkYU5vZGUuTm9kZWpzRnVuY3Rpb24odGhpcywgYFN1YnNjcmlwdGlvbiR7aW5kZXh9YCwge1xuICAgICAgbWVtb3J5U2l6ZTogNTEyLFxuICAgICAgdGltZW91dDogRHVyYXRpb24uc2Vjb25kcyg1KSxcbiAgICAgIHJ1bnRpbWU6IGxhbWJkYS5SdW50aW1lLk5PREVKU18xNl9YLFxuICAgICAgaGFuZGxlcjogJ2hhbmRsZXInLFxuICAgICAgZW50cnk6IHRoaXMuZ2V0QXNzZXRMb2NhdGlvbignZnVuY3Rpb25zL3NlbmRNZXNzYWdlLnRzJyksXG4gICAgICBlbnZpcm9ubWVudDoge1xuICAgICAgICBbZW52VmFyaWFibGVOYW1lcy5TU1BZX1dTX1RBQkxFX05BTUVdOiB0aGlzLnRhYmxlLnRhYmxlTmFtZSxcbiAgICAgICAgTk9ERV9PUFRJT05TOiAnLS1lbmFibGUtc291cmNlLW1hcHMnLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIHRoaXMudGFibGUuZ3JhbnRXcml0ZURhdGEoZnVuYyk7XG4gICAgdGhpcy50YWJsZS5ncmFudFJlYWREYXRhKGZ1bmMpO1xuICAgIGZ1bmMuYWRkRW52aXJvbm1lbnQoXG4gICAgICBlbnZWYXJpYWJsZU5hbWVzLlNTUFlfV1NfRU5EUE9JTlQsXG4gICAgICB0aGlzLmdldFdzRW5kcG9pbnQoKVxuICAgICk7XG5cbiAgICB0aGlzLndlYlNvY2tldEFwaS5ncmFudE1hbmFnZUNvbm5lY3Rpb25zKGZ1bmMpO1xuICAgIHJldHVybiBmdW5jO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRXc0VuZHBvaW50KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBodHRwczovLyR7dGhpcy53ZWJTb2NrZXRBcGkuYXBpSWR9LmV4ZWN1dGUtYXBpLiR7XG4gICAgICBTdGFjay5vZih0aGlzKS5yZWdpb25cbiAgICB9LmFtYXpvbmF3cy5jb20vJHt0aGlzLndlYlNvY2tldFN0YWdlLnN0YWdlTmFtZX1gO1xuICB9XG5cbiAgcHJpdmF0ZSBpbnRlcm5hbFNweVMzKHMzQnVja2V0OiBzMy5CdWNrZXQpIHtcbiAgICBzM0J1Y2tldC5hZGRFdmVudE5vdGlmaWNhdGlvbihcbiAgICAgIHMzLkV2ZW50VHlwZS5PQkpFQ1RfQ1JFQVRFRF9QVVQsXG4gICAgICBuZXcgczNub3RpZi5MYW1iZGFEZXN0aW5hdGlvbih0aGlzLmxhbWJkYVN1YnNjcmlwdGlvbk1haW4uZnVuY3Rpb24pXG4gICAgKTtcblxuICAgIGNvbnN0IG5hbWUgPSB0aGlzLmdldENvbnN0cnVjdE5hbWUoczNCdWNrZXQpO1xuXG4gICAgY29uc3Qgc2VydmljZUtleSA9IGBTMyMke25hbWV9YDtcbiAgICB0aGlzLmxhbWJkYVN1YnNjcmlwdGlvbk1haW4ubWFwcGluZ1tzM0J1Y2tldC5idWNrZXRBcm5dID0gc2VydmljZUtleTtcbiAgICB0aGlzLnNlcnZpY2VLZXlzLnB1c2goc2VydmljZUtleSk7XG4gIH1cblxuICBwcml2YXRlIGludGVybmFsU3B5RHluYW1vZGIodGFibGU6IGR5bmFtb0RiLlRhYmxlKSB7XG4gICAgLy8gZW5hYmxlIER5bmFtb0RCIHN0cmVhbXMgd2l0aCBhIGhhY2tcbiAgICAodGFibGUubm9kZS5kZWZhdWx0Q2hpbGQgYXMgZHluYW1vRGIuQ2ZuVGFibGUpLnN0cmVhbVNwZWNpZmljYXRpb24gPSB7XG4gICAgICBzdHJlYW1WaWV3VHlwZTogZHluYW1vRGIuU3RyZWFtVmlld1R5cGUuTkVXX0FORF9PTERfSU1BR0VTLFxuICAgIH07XG4gICAgKHRhYmxlIGFzIGFueSkudGFibGVTdHJlYW1Bcm4gPSAoXG4gICAgICB0YWJsZS5ub2RlLmRlZmF1bHRDaGlsZCBhcyBkeW5hbW9EYi5DZm5UYWJsZVxuICAgICkuYXR0clN0cmVhbUFybjtcblxuICAgIHRoaXMubGFtYmRhU3Vic2NyaXB0aW9uTWFpbi5mdW5jdGlvbi5hZGRFdmVudFNvdXJjZShcbiAgICAgIG5ldyBkeW5hbW9EYlN0cmVhbS5EeW5hbW9FdmVudFNvdXJjZSh0YWJsZSwge1xuICAgICAgICBzdGFydGluZ1Bvc2l0aW9uOiBsYW1iZGEuU3RhcnRpbmdQb3NpdGlvbi5MQVRFU1QsXG4gICAgICAgIGJhdGNoU2l6ZTogMSxcbiAgICAgICAgcmV0cnlBdHRlbXB0czogMCxcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIGNvbnN0IG5hbWUgPSB0aGlzLmdldENvbnN0cnVjdE5hbWUodGFibGUpO1xuXG4gICAgY29uc3Qgc2VydmljZUtleSA9IGBEeW5hbW9EQiMke25hbWV9YDtcbiAgICB0aGlzLmxhbWJkYVN1YnNjcmlwdGlvbk1haW4ubWFwcGluZ1t0YWJsZS50YWJsZUFybl0gPSBzZXJ2aWNlS2V5O1xuICAgIHRoaXMuc2VydmljZUtleXMucHVzaChzZXJ2aWNlS2V5KTtcbiAgfVxuXG4gIHByaXZhdGUgaW50ZXJuYWxTcHlFdmVudEJ1c1J1bGUocnVsZTogZXZlbnRzLlJ1bGUpIHtcbiAgICBjb25zdCB7IGV2ZW50QnVzTmFtZSB9ID0gcnVsZS5ub2RlLmRlZmF1bHRDaGlsZCBhcyBldmVudHMuQ2ZuUnVsZTtcbiAgICBjb25zdCBldmVudEJyaWRnZSA9IHRoaXMuZ2V0RXZlbnRCcmlkZ2UoXG4gICAgICAocnVsZS5ub2RlLmRlZmF1bHRDaGlsZCBhcyBhbnkpLmV2ZW50QnVzTmFtZVxuICAgICk7XG5cbiAgICBpZiAoIWV2ZW50QnJpZGdlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbiBub3QgZmluZCBFdmVudEJyaWRnZSB3aXRoIG5hbWUgXCIke2V2ZW50QnVzTmFtZX1cImApO1xuICAgIH1cblxuICAgIGNvbnN0IGZ1bmN0aW9uU3Vic2NyaXB0aW9uID0gdGhpcy5wcm92aWRlRnVuY3Rpb25Gb3JTdWJzY3JpcHRpb24oXG4gICAgICAocykgPT4gIXMudXNlZEZvckV2ZW50QnJpZGdlXG4gICAgKTtcbiAgICBmdW5jdGlvblN1YnNjcmlwdGlvbi51c2VkRm9yRXZlbnRCcmlkZ2UgPSB0cnVlO1xuXG4gICAgcnVsZS5hZGRUYXJnZXQobmV3IHRhcmdldHMuTGFtYmRhRnVuY3Rpb24oZnVuY3Rpb25TdWJzY3JpcHRpb24uZnVuY3Rpb24pKTtcblxuICAgIGNvbnN0IGJyaWRnZU5hbWUgPSB0aGlzLmdldENvbnN0cnVjdE5hbWUoZXZlbnRCcmlkZ2UpO1xuICAgIGNvbnN0IHJ1bGVOYW1lID0gdGhpcy5nZXRDb25zdHJ1Y3ROYW1lKHJ1bGUpO1xuICAgIGNvbnN0IHNlcnZpY2VLZXkgPSBgRXZlbnRCcmlkZ2VSdWxlIyR7YnJpZGdlTmFtZX0jJHtydWxlTmFtZX1gO1xuICAgIGZ1bmN0aW9uU3Vic2NyaXB0aW9uLm1hcHBpbmcuZXZlbnRCcmlkZ2UgPSBzZXJ2aWNlS2V5O1xuICAgIHRoaXMuc2VydmljZUtleXMucHVzaChzZXJ2aWNlS2V5KTtcbiAgfVxuXG4gIHByaXZhdGUgaW50ZXJuYWxTcHlFdmVudEJ1cyhldmVudEJ1czogZXZlbnRzLkV2ZW50QnVzKSB7XG4gICAgY29uc3QgZnVuY3Rpb25TdWJzY3JpcHRpb24gPSB0aGlzLnByb3ZpZGVGdW5jdGlvbkZvclN1YnNjcmlwdGlvbihcbiAgICAgIChzKSA9PiAhcy51c2VkRm9yRXZlbnRCcmlkZ2VcbiAgICApO1xuICAgIGZ1bmN0aW9uU3Vic2NyaXB0aW9uLnVzZWRGb3JFdmVudEJyaWRnZSA9IHRydWU7XG5cbiAgICBjb25zdCBicmlkZ2VOYW1lID0gdGhpcy5nZXRDb25zdHJ1Y3ROYW1lKGV2ZW50QnVzKTtcbiAgICBjb25zdCBydWxlID0gbmV3IGV2ZW50cy5SdWxlKHRoaXMsIGBSdWxlQWxsJHticmlkZ2VOYW1lfWAsIHtcbiAgICAgIGV2ZW50QnVzLFxuICAgICAgZXZlbnRQYXR0ZXJuOiB7IHZlcnNpb246IFsnMCddIH0sXG4gICAgICB0YXJnZXRzOiBbbmV3IHRhcmdldHMuTGFtYmRhRnVuY3Rpb24oZnVuY3Rpb25TdWJzY3JpcHRpb24uZnVuY3Rpb24pXSxcbiAgICB9KTtcblxuICAgIHRoaXMuY3JlYXRlZFJlc291cmNlc0J5U1NweS5wdXNoKHJ1bGUpO1xuICAgIGNvbnN0IHNlcnZpY2VLZXkgPSBgRXZlbnRCcmlkZ2UjJHticmlkZ2VOYW1lfWA7XG4gICAgZnVuY3Rpb25TdWJzY3JpcHRpb24ubWFwcGluZy5ldmVudEJyaWRnZSA9IHNlcnZpY2VLZXk7XG4gICAgdGhpcy5zZXJ2aWNlS2V5cy5wdXNoKHNlcnZpY2VLZXkpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbnRlcm5hbFNweVNuc1RvcGljKHRvcGljOiBzbnMuVG9waWMpIHtcbiAgICBjb25zdCBmdW5jdGlvblN1YnNjcmlwdGlvbiA9IHRoaXMucHJvdmlkZUZ1bmN0aW9uRm9yU3Vic2NyaXB0aW9uKFxuICAgICAgKHMpID0+ICFzLnN1YnNyaWJlZFRvcGljcy5pbmNsdWRlcyh0b3BpYylcbiAgICApO1xuXG4gICAgY29uc3Qgc3Vic2NyaXB0aW9uID0gdG9waWMuYWRkU3Vic2NyaXB0aW9uKFxuICAgICAgbmV3IHNuc1N1YnMuTGFtYmRhU3Vic2NyaXB0aW9uKGZ1bmN0aW9uU3Vic2NyaXB0aW9uLmZ1bmN0aW9uKVxuICAgICk7XG4gICAgdGhpcy5jcmVhdGVkUmVzb3VyY2VzQnlTU3B5LnB1c2goc3Vic2NyaXB0aW9uKTtcbiAgICBjb25zdCB0b3BpY05hbWUgPSB0aGlzLmdldENvbnN0cnVjdE5hbWUodG9waWMpO1xuICAgIGNvbnN0IHNlcnZpY2VLZXkgPSBgU25zVG9waWMjJHt0b3BpY05hbWV9YDtcbiAgICBmdW5jdGlvblN1YnNjcmlwdGlvbi5tYXBwaW5nW3RvcGljLnRvcGljQXJuXSA9IHNlcnZpY2VLZXk7XG4gICAgdGhpcy5zZXJ2aWNlS2V5cy5wdXNoKHNlcnZpY2VLZXkpO1xuICAgIGZ1bmN0aW9uU3Vic2NyaXB0aW9uLnN1YnNyaWJlZFRvcGljcy5wdXNoKHRvcGljKTtcbiAgfVxuXG4gIHByaXZhdGUgaW50ZXJuYWxTcHlTbnNTdWJzY3JpcHRpb24oc3Vic2NyaXB0aW9uOiBzbnMuU3Vic2NyaXB0aW9uKSB7XG4gICAgaWYgKCFzdWJzY3JpcHRpb24ubm9kZS5zY29wZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHRvcGljID0gdGhpcy5nZXRUb3BpYyhcbiAgICAgIChzdWJzY3JpcHRpb24ubm9kZS5kZWZhdWx0Q2hpbGQgYXMgc25zLkNmblN1YnNjcmlwdGlvbikudG9waWNBcm5cbiAgICApO1xuXG4gICAgaWYgKCF0b3BpYykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW4gbm90IGZpbmQgVG9waWMnKTtcbiAgICB9XG5cbiAgICBjb25zdCBmdW5jdGlvblN1YnNjcmlwdGlvbiA9IHRoaXMucHJvdmlkZUZ1bmN0aW9uRm9yU3Vic2NyaXB0aW9uKFxuICAgICAgKHMpID0+ICFzLnN1YnNyaWJlZFRvcGljcy5pbmNsdWRlcyh0b3BpYylcbiAgICApO1xuXG4gICAgY29uc3QgeyBmaWx0ZXJQb2xpY3kgfSA9IHN1YnNjcmlwdGlvbi5ub2RlXG4gICAgICAuZGVmYXVsdENoaWxkIGFzIHNucy5DZm5TdWJzY3JpcHRpb247XG5cbiAgICBjb25zdCBzdWJzY3JpcHRpb25DbG9uZSA9IHRvcGljLmFkZFN1YnNjcmlwdGlvbihcbiAgICAgIG5ldyBzbnNTdWJzLkxhbWJkYVN1YnNjcmlwdGlvbihmdW5jdGlvblN1YnNjcmlwdGlvbi5mdW5jdGlvbilcbiAgICApO1xuICAgIChzdWJzY3JpcHRpb25DbG9uZS5ub2RlLmRlZmF1bHRDaGlsZCBhcyBzbnMuQ2ZuU3Vic2NyaXB0aW9uKS5maWx0ZXJQb2xpY3kgPVxuICAgICAgZmlsdGVyUG9saWN5O1xuXG4gICAgdGhpcy5jcmVhdGVkUmVzb3VyY2VzQnlTU3B5LnB1c2goc3Vic2NyaXB0aW9uQ2xvbmUpO1xuXG4gICAgY29uc3QgdG9waWNOYW1lID0gdGhpcy5nZXRDb25zdHJ1Y3ROYW1lKHRvcGljKTtcbiAgICBjb25zdCB0YXJnZXROYW1lID0gdGhpcy5nZXRDb25zdHJ1Y3ROYW1lKHN1YnNjcmlwdGlvbi5ub2RlLnNjb3BlKTtcblxuICAgIGZ1bmN0aW9uU3Vic2NyaXB0aW9uLnN1YnNyaWJlZFRvcGljcy5wdXNoKHRvcGljKTtcbiAgICBjb25zdCBzZXJ2aWNlS2V5ID0gYFNuc1N1YnNjcmlwdGlvbiMke3RvcGljTmFtZX0jJHt0YXJnZXROYW1lfWA7XG4gICAgZnVuY3Rpb25TdWJzY3JpcHRpb24ubWFwcGluZ1t0b3BpYy50b3BpY0Fybl0gPSBzZXJ2aWNlS2V5O1xuICAgIHRoaXMuc2VydmljZUtleXMucHVzaChzZXJ2aWNlS2V5KTtcbiAgfVxuXG4gIHByaXZhdGUgcHJvdmlkZUZ1bmN0aW9uRm9yU3Vic2NyaXB0aW9uKFxuICAgIGZpbHRlckZ1bmN0aW9uPzogKHN1YnNjcmlwdGlvbjogTGFtYmRhU3Vic2NyaXB0aW9uKSA9PiBib29sZWFuXG4gICkge1xuICAgIGxldCBmdW5jdGlvblN1YnNjcmlwdGlvbjogTGFtYmRhU3Vic2NyaXB0aW9uIHwgdW5kZWZpbmVkO1xuXG4gICAgaWYgKGZpbHRlckZ1bmN0aW9uKSB7XG4gICAgICBmdW5jdGlvblN1YnNjcmlwdGlvbiA9IHRoaXMubGFtYmRhU3Vic2NyaXB0aW9uUG9vbC5maW5kKGZpbHRlckZ1bmN0aW9uKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMubGFtYmRhU3Vic2NyaXB0aW9uUG9vbC5sZW5ndGggPiAwKSB7XG4gICAgICBmdW5jdGlvblN1YnNjcmlwdGlvbiA9IHRoaXMubGFtYmRhU3Vic2NyaXB0aW9uUG9vbFswXTtcbiAgICB9XG5cbiAgICBpZiAoIWZ1bmN0aW9uU3Vic2NyaXB0aW9uKSB7XG4gICAgICBmdW5jdGlvblN1YnNjcmlwdGlvbiA9IHtcbiAgICAgICAgc3Vic3JpYmVkVG9waWNzOiBbXSxcbiAgICAgICAgdXNlZEZvckV2ZW50QnJpZGdlOiBmYWxzZSxcbiAgICAgICAgbWFwcGluZzoge30sXG4gICAgICAgIGZ1bmN0aW9uOiB0aGlzLmNyZWF0ZUZ1bmN0aW9uRm9yU3Vic2NyaXB0aW9uKFxuICAgICAgICAgIHRoaXMubGFtYmRhU3Vic2NyaXB0aW9uUG9vbC5sZW5ndGhcbiAgICAgICAgKSxcbiAgICAgIH07XG4gICAgICB0aGlzLmxhbWJkYVN1YnNjcmlwdGlvblBvb2wucHVzaChmdW5jdGlvblN1YnNjcmlwdGlvbik7XG4gICAgfVxuICAgIHJldHVybiBmdW5jdGlvblN1YnNjcmlwdGlvbjtcbiAgfVxuXG4gIHByaXZhdGUgaW50ZXJuYWxTcHlMYW1iZGEoZnVuYzogbGFtYmRhLkZ1bmN0aW9uKSB7XG4gICAgZnVuYy5hZGRMYXllcnModGhpcy5leHRlbnNpb25MYXllcik7XG5cbiAgICBjb25zdCBmdW5jdGlvbk5hbWUgPSB0aGlzLmdldENvbnN0cnVjdE5hbWUoZnVuYyk7XG5cbiAgICBmdW5jLmFkZEVudmlyb25tZW50KGVudlZhcmlhYmxlTmFtZXMuU1NQWV9GVU5DVElPTl9OQU1FLCBmdW5jdGlvbk5hbWUpO1xuICAgIGZ1bmMuYWRkRW52aXJvbm1lbnQoJ0FXU19MQU1CREFfRVhFQ19XUkFQUEVSJywgJy9vcHQvc3B5LXdyYXBwZXInKTtcbiAgICBmdW5jLmFkZEVudmlyb25tZW50KFxuICAgICAgZW52VmFyaWFibGVOYW1lcy5TU1BZX1dTX1RBQkxFX05BTUUsXG4gICAgICB0aGlzLnRhYmxlLnRhYmxlTmFtZVxuICAgICk7XG4gICAgZnVuYy5hZGRFbnZpcm9ubWVudChcbiAgICAgIGVudlZhcmlhYmxlTmFtZXMuU1NQWV9XU19FTkRQT0lOVCxcbiAgICAgIHRoaXMuZ2V0V3NFbmRwb2ludCgpXG4gICAgKTtcblxuICAgIGlmICh0aGlzLnByb3BzPy5kZWJ1Z01vZGUpIHtcbiAgICAgIGZ1bmMuYWRkRW52aXJvbm1lbnQoZW52VmFyaWFibGVOYW1lcy5TU1BZX0RFQlVHLCAndHJ1ZScpO1xuICAgIH1cblxuICAgIHRoaXMudGFibGUuZ3JhbnRXcml0ZURhdGEoZnVuYyk7XG4gICAgdGhpcy50YWJsZS5ncmFudFJlYWREYXRhKGZ1bmMpO1xuICAgIHRoaXMud2ViU29ja2V0QXBpLmdyYW50TWFuYWdlQ29ubmVjdGlvbnMoZnVuYyk7XG5cbiAgICB0aGlzLnNlcnZpY2VLZXlzLnB1c2goYEZ1bmN0aW9uIyR7ZnVuY3Rpb25OYW1lfSNSZXF1ZXN0YCk7XG4gICAgdGhpcy5zZXJ2aWNlS2V5cy5wdXNoKGBGdW5jdGlvbiMke2Z1bmN0aW9uTmFtZX0jRXJyb3JgKTtcbiAgICB0aGlzLnNlcnZpY2VLZXlzLnB1c2goYEZ1bmN0aW9uIyR7ZnVuY3Rpb25OYW1lfSNDb25zb2xlYCk7XG4gICAgdGhpcy5zZXJ2aWNlS2V5cy5wdXNoKGBGdW5jdGlvbiMke2Z1bmN0aW9uTmFtZX0jUmVzcG9uc2VgKTtcblxuICAgIHRoaXMuYWRkTWFwcGluZ1RvRnVuY3Rpb24oZnVuYyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0Q29uc3RydWN0TmFtZShjb25zdHJ1Y3Q6IElDb25zdHJ1Y3QpIHtcbiAgICBsZXQgZnVuY3Rpb25OYW1lID0gY29uc3RydWN0Lm5vZGUucGF0aDtcbiAgICBjb25zdCB7IHN0YWNrTmFtZSB9ID0gU3RhY2sub2YodGhpcyk7XG5cbiAgICBpZiAoZnVuY3Rpb25OYW1lLnN0YXJ0c1dpdGgoc3RhY2tOYW1lKSkge1xuICAgICAgZnVuY3Rpb25OYW1lID0gZnVuY3Rpb25OYW1lLnN1YnN0cmluZyhzdGFja05hbWUubGVuZ3RoICsgMSk7XG4gICAgfVxuICAgIHJldHVybiBmdW5jdGlvbk5hbWU7XG4gIH1cblxuICBwcml2YXRlIGdldFRvcGljKHRvcGljQXJuOiBzdHJpbmcpOiBzbnMuVG9waWMgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHRvcGljID0gdGhpcy5maW5kRWxlbWVudDxzbnMuVG9waWM+KFxuICAgICAgKG5vZGU6IElDb25zdHJ1Y3QpID0+XG4gICAgICAgIG5vZGUgaW5zdGFuY2VvZiBzbnMuVG9waWMgJiYgKG5vZGUgYXMgc25zLlRvcGljKS50b3BpY0FybiA9PT0gdG9waWNBcm5cbiAgICApO1xuXG4gICAgcmV0dXJuIHRvcGljO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRFdmVudEJyaWRnZShldmVudEJ1c05hbWU6IHN0cmluZyk6IGV2ZW50cy5FdmVudEJ1cyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgZXZlbnRCcmlkZ2UgPSB0aGlzLmZpbmRFbGVtZW50PGV2ZW50cy5FdmVudEJ1cz4oXG4gICAgICAobm9kZTogSUNvbnN0cnVjdCkgPT5cbiAgICAgICAgbm9kZSBpbnN0YW5jZW9mIGV2ZW50cy5FdmVudEJ1cyAmJlxuICAgICAgICAobm9kZSBhcyBldmVudHMuRXZlbnRCdXMpLmV2ZW50QnVzTmFtZSA9PT0gZXZlbnRCdXNOYW1lXG4gICAgKTtcblxuICAgIHJldHVybiBldmVudEJyaWRnZTtcbiAgfVxuXG4gIHByaXZhdGUgZmluZEVsZW1lbnQ8VCBleHRlbmRzIElDb25zdHJ1Y3QgPSBJQ29uc3RydWN0PihcbiAgICBmaWx0ZXJGdW5jOiAobm9kZTogSUNvbnN0cnVjdCkgPT4gYm9vbGVhbixcbiAgICBwYXJlbnQ/OiBJQ29uc3RydWN0XG4gICk6IFQgfCB1bmRlZmluZWQge1xuICAgIGlmICghcGFyZW50KSB7XG4gICAgICBwYXJlbnQgPSBTdGFjay5vZih0aGlzKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IG5vZGUgb2YgcGFyZW50Lm5vZGUuY2hpbGRyZW4pIHtcbiAgICAgIGlmIChmaWx0ZXJGdW5jKG5vZGUpKSB7XG4gICAgICAgIHJldHVybiBub2RlIGFzIFQ7XG4gICAgICB9XG4gICAgICB0aGlzLmZpbmRFbGVtZW50PFQ+KGZpbHRlckZ1bmMsIG5vZGUpO1xuICAgIH1cblxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBwcml2YXRlIGFkZE1hcHBpbmdUb0Z1bmN0aW9uKFxuICAgIGZ1bmM6IGxhbWJkYS5GdW5jdGlvbixcbiAgICBrZXlWYWx1ZT86IHsga2V5OiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfVxuICApIHtcbiAgICBmb3IgKGNvbnN0IGZzIG9mIHRoaXMubGFtYmRhc1NwaWVkKSB7XG4gICAgICBpZiAoZnMuZnVuY3Rpb24gPT09IGZ1bmMpIHtcbiAgICAgICAgaWYgKGtleVZhbHVlKSB7XG4gICAgICAgICAgZnMubWFwcGluZ1trZXlWYWx1ZS5rZXldID0ga2V5VmFsdWUudmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGZzOiBMYW1iZGFTcGllZCA9IHtcbiAgICAgIGZ1bmN0aW9uOiBmdW5jLFxuICAgICAgbWFwcGluZzoge30sXG4gICAgfTtcblxuICAgIGlmIChrZXlWYWx1ZSkge1xuICAgICAgZnMubWFwcGluZ1trZXlWYWx1ZS5rZXldID0ga2V5VmFsdWUudmFsdWU7XG4gICAgfVxuXG4gICAgdGhpcy5sYW1iZGFzU3BpZWQucHVzaChmcyk7XG4gIH1cblxuICBwcml2YXRlIGdldEFzc2V0TG9jYXRpb24obG9jYXRpb246IHN0cmluZykge1xuICAgIGNvbnN0IGxvYyA9IHBhdGguam9pbihfX2Rpcm5hbWUsICcuLi8nICsgbG9jYXRpb24pO1xuXG4gICAgaWYgKGZzLmV4aXN0c1N5bmMobG9jKSkge1xuICAgICAgcmV0dXJuIGxvYztcbiAgICB9XG5cbiAgICBjb25zdCBsb2MyID0gcGF0aC5qb2luKF9fZGlybmFtZSwgJy4uLy4uLycgKyBsb2NhdGlvbik7XG5cbiAgICBpZiAoZnMuZXhpc3RzU3luYyhsb2MyKSkge1xuICAgICAgcmV0dXJuIGxvYzI7XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKGBMb2NhdGlvbiAke2xvY30gYW5kICR7bG9jMn0gZG9lcyBub3QgZXhpc3RzLmApO1xuICB9XG59XG5cbnR5cGUgTGFtYmRhU3Vic2NyaXB0aW9uID0ge1xuICBzdWJzcmliZWRUb3BpY3M6IHNucy5Ub3BpY1tdO1xuICB1c2VkRm9yRXZlbnRCcmlkZ2U6IGJvb2xlYW47XG4gIGZ1bmN0aW9uOiBsYW1iZGFOb2RlLk5vZGVqc0Z1bmN0aW9uO1xuICBtYXBwaW5nOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xufTtcblxudHlwZSBMYW1iZGFTcGllZCA9IHtcbiAgZnVuY3Rpb246IGxhbWJkYS5GdW5jdGlvbjtcbiAgbWFwcGluZzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbn07XG4iXX0=