@raspect/workflow-sdk 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/worker.d.ts CHANGED
@@ -39,7 +39,6 @@ export declare class Worker implements WorkerInterface {
39
39
  private heartbeatIntervalMs;
40
40
  private resultTopic;
41
41
  private maxConcurrentWorkflows;
42
- private activeWorkflows;
43
42
  constructor(config: WorkerConfig);
44
43
  /**
45
44
  * Register workflows and activities.
@@ -61,7 +60,6 @@ export declare class Worker implements WorkerInterface {
61
60
  private startHeartbeat;
62
61
  private disconnectFromServer;
63
62
  private processMessage;
64
- private processWorkflowTask;
65
63
  private executeWorkflow;
66
64
  private processActivityTask;
67
65
  private sendWorkflowResult;
package/dist/worker.js CHANGED
@@ -79,7 +79,6 @@ class Worker {
79
79
  heartbeatIntervalMs = 30000;
80
80
  resultTopic = null;
81
81
  maxConcurrentWorkflows;
82
- activeWorkflows = 0;
83
82
  constructor(config) {
84
83
  this.config = {
85
84
  ...config,
@@ -132,17 +131,31 @@ class Worker {
132
131
  console.log(`Registered activities: ${Array.from(this.activities.keys()).join(', ')}`);
133
132
  // Start heartbeat
134
133
  this.startHeartbeat();
135
- // Start consuming messages
134
+ // Start consuming messages with worker-level concurrency control
135
+ // partitionsConsumedConcurrently limits how many messages can be processed at once
136
+ // Commit immediately after fetch - workflows can run for hours, so we can't wait
137
+ // If worker crashes mid-workflow, use server's /resume API to recover
136
138
  await this.consumer.run({
137
- eachMessage: async ({ message }) => {
139
+ autoCommit: false,
140
+ partitionsConsumedConcurrently: this.maxConcurrentWorkflows,
141
+ eachMessage: async ({ topic, partition, message }) => {
138
142
  if (!this.running)
139
143
  return;
144
+ // Commit immediately after receiving - the message is now "in progress"
145
+ // This prevents Kafka rebalance during long-running workflows (hours)
146
+ // Pending messages in queue stay safe, in-progress workflows tracked in MongoDB
147
+ await this.consumer?.commitOffsets([{
148
+ topic,
149
+ partition,
150
+ offset: (BigInt(message.offset) + 1n).toString(),
151
+ }]);
140
152
  try {
141
153
  const data = JSON.parse(message.value?.toString() || '{}');
142
154
  await this.processMessage(data, resultTopic);
143
155
  }
144
156
  catch (error) {
145
157
  console.error('Error processing message:', error);
158
+ // Workflow failed - state is in MongoDB, can be resumed via server API
146
159
  }
147
160
  },
148
161
  });
@@ -284,29 +297,14 @@ class Worker {
284
297
  }
285
298
  const taskType = data.task_type || 'activity';
286
299
  if (taskType === 'workflow') {
287
- // Process workflow in background (don't block message loop)
288
- this.processWorkflowTask(data, resultTopic).catch((error) => {
289
- console.error('Error processing workflow task:', error);
290
- });
300
+ // Concurrency is controlled by partitionsConsumedConcurrently in consumer.run()
301
+ await this.executeWorkflow(data, resultTopic);
291
302
  }
292
303
  else {
293
304
  // Activity tasks can be processed inline
294
305
  await this.processActivityTask(data, resultTopic);
295
306
  }
296
307
  }
297
- async processWorkflowTask(data, resultTopic) {
298
- // Check concurrency limit
299
- while (this.activeWorkflows >= this.maxConcurrentWorkflows) {
300
- await new Promise((resolve) => setTimeout(resolve, 100));
301
- }
302
- this.activeWorkflows++;
303
- try {
304
- await this.executeWorkflow(data, resultTopic);
305
- }
306
- finally {
307
- this.activeWorkflows--;
308
- }
309
- }
310
308
  async executeWorkflow(task, resultTopic) {
311
309
  console.log(`Received workflow task ${task.task_id}: ${task.workflow_name}`);
312
310
  // Find the workflow class
@@ -612,4 +610,4 @@ class Worker {
612
610
  }
613
611
  }
614
612
  exports.Worker = Worker;
615
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29ya2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3dvcmtlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEseUVBQXlFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFekUscUNBQTJFO0FBQzNFLDJFQUFzRjtBQUN0Rix1Q0FBeUI7QUFlekIseUNBQW1IO0FBQ25ILHlDQUE2QztBQUU3Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBd0JHO0FBQ0gsTUFBYSxNQUFNO0lBQ1QsTUFBTSxDQUFlO0lBQ3JCLFNBQVMsR0FBK0IsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUNsRCxVQUFVLEdBQWlDLElBQUksR0FBRyxFQUFFLENBQUM7SUFFckQsUUFBUSxHQUFrQixJQUFJLENBQUM7SUFDL0IsVUFBVSxHQUFrQixJQUFJLENBQUM7SUFDakMsT0FBTyxHQUFHLEtBQUssQ0FBQztJQUNoQixLQUFLLEdBQWlCLElBQUksQ0FBQztJQUMzQixRQUFRLEdBQW9CLElBQUksQ0FBQztJQUNqQyxRQUFRLEdBQW9CLElBQUksQ0FBQztJQUNqQyxpQkFBaUIsR0FBMEIsSUFBSSxDQUFDO0lBQ2hELG1CQUFtQixHQUFHLEtBQUssQ0FBQztJQUM1QixXQUFXLEdBQWtCLElBQUksQ0FBQztJQUNsQyxzQkFBc0IsQ0FBUztJQUMvQixlQUFlLEdBQUcsQ0FBQyxDQUFDO0lBRTVCLFlBQVksTUFBb0I7UUFDOUIsSUFBSSxDQUFDLE1BQU0sR0FBRztZQUNaLEdBQUcsTUFBTTtZQUNULFNBQVMsRUFBRSxNQUFNLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDO1NBQy9DLENBQUM7UUFDRixJQUFJLENBQUMsc0JBQXNCLEdBQUcsTUFBTSxDQUFDLHNCQUFzQixJQUFJLEVBQUUsQ0FBQztJQUNwRSxDQUFDO0lBRUQ7O09BRUc7SUFDSCxRQUFRLENBQUMsT0FHUjtRQUNDLEtBQUssTUFBTSxLQUFLLElB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QUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDO1lBQ2xFLFlBQVksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksR0FBRyxpQkFBaUIsRUFBRSxlQUFlLENBQUMsQ0FBQztRQUM3RSxDQUFDO0lBQ0gsQ0FBQztJQUVPLEtBQUssQ0FBQyxPQUFPO1FBQ25CLGlCQUFpQjtRQUNqQixJQUFJLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBQzNCLGFBQWEsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUN4QyxDQUFDO1FBRUQseUJBQXlCO1FBQ3pCLE1BQU0sSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFFbEMscUJBQXFCO1FBQ3JCLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2xCLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNuQyxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDbEIsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ25DLENBQUM7UUFFRCxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsSUFBSSxDQUFDLFFBQVEsVUFBVSxDQUFDLENBQUM7SUFDakQsQ0FBQztDQUNGO0FBNXNCRCx3QkE0c0JDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gV29ya2VyIC0gTm9kZS5qcyBpbXBsZW1lbnRhdGlvbiBmb3IgZXhlY3V0aW5nIHdvcmtmbG93cyBhbmQgYWN0aXZpdGllc1xuXG5pbXBvcnQgeyBLYWZrYSwgQ29uc3VtZXIsIFByb2R1Y2VyLCBTQVNMT3B0aW9ucywgbG9nTGV2ZWwgfSBmcm9tICdrYWZrYWpzJztcbmltcG9ydCB7IGdlbmVyYXRlQXV0aFRva2VuRnJvbUNyZWRlbnRpYWxzUHJvdmlkZXIgfSBmcm9tICdhd3MtbXNrLWlhbS1zYXNsLXNpZ25lci1qcyc7XG5pbXBvcnQgKiBhcyBvcyBmcm9tICdvcyc7XG5pbXBvcnQgdHlwZSB7XG4gIFdvcmtlckNvbmZpZyxcbiAgQWN0aXZpdHlIYW5kbGVyLFxuICBEZWNvcmF0ZWRBY3Rpdml0eSxcbiAgV29ya2Zsb3dDbGFzcyxcbiAgV29ya2Zsb3dUYXNrLFxuICBBY3Rpdml0eVRhc2ssXG4gIFdvcmtmbG93UmVzdWx0LFxuICBBY3Rpdml0eVJlc3VsdCxcbiAgV29ya2Zsb3dFcnJvcixcbiAgQWN0aXZpdHlFcnJvcixcbiAgS2Fma2FDb25maWcsXG4gIENvbm5lY3RSZXNwb25zZSxcbn0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBXb3JrZmxvd0NvbnRleHQsIHJ1bldpdGhDb250ZXh0LCBnZXRXb3JrZmxvd05hbWUsIGZpbmRSdW5NZXRob2QsIHR5cGUgV29ya2VySW50ZXJmYWNlIH0gZnJvbSAnLi93b3JrZmxvdyc7XG5pbXBvcnQgeyBnZXRBY3Rpdml0eU5hbWUgfSBmcm9tICcuL2FjdGl2aXR5JztcblxuLyoqXG4gKiBXb3JrZXIgdGhhdCBleGVjdXRlcyB3b3JrZmxvd3MgYW5kIGFjdGl2aXRpZXMuXG4gKiBcbiAqIFVzYWdlOlxuICogICBpbXBvcnQgeyBXb3JrZXIsIHdvcmtmbG93LCBhY3Rpdml0eSB9IGZyb20gJ0BpbnNwZWN0aWNhL3dvcmtmbG93LXNkayc7XG4gKiAgIFxuICogICBjb25zdCBzYXlIZWxsbyA9IGFjdGl2aXR5LmRlZm4oYXN5bmMgKGlucHV0OiB7IG5hbWU6IHN0cmluZyB9KSA9PiB7XG4gKiAgICAgcmV0dXJuIHsgbWVzc2FnZTogYEhlbGxvLCAke2lucHV0Lm5hbWV9IWAgfTtcbiAqICAgfSk7XG4gKiAgIFxuICogICBAd29ya2Zsb3cuZGVmblxuICogICBjbGFzcyBIZWxsb1dvcmxkV29ya2Zsb3cge1xuICogICAgIEB3b3JrZmxvdy5ydW5cbiAqICAgICBhc3luYyBydW4oaW5wdXQ6IHsgbmFtZTogc3RyaW5nIH0pIHtcbiAqICAgICAgIHJldHVybiBhd2FpdCB3b3JrZmxvdy5leGVjdXRlQWN0aXZpdHkoc2F5SGVsbG8sIGlucHV0KTtcbiAqICAgICB9XG4gKiAgIH1cbiAqICAgXG4gKiAgIGNvbnN0IHdvcmtlciA9IG5ldyBXb3JrZXIoe1xuICogICAgIHNlcnZlclVybDogJ2h0dHBzOi8vd29ya2Zsb3cuZXhhbXBsZS5jb20nLFxuICogICAgIGFwaUtleTogJ3drX2FiYzEyMy4uLicsXG4gKiAgIH0pO1xuICogICB3b3JrZXIucmVnaXN0ZXIoeyB3b3JrZmxvd3M6IFtIZWxsb1dvcmxkV29ya2Zsb3ddLCBhY3Rpdml0aWVzOiBbc2F5SGVsbG9dIH0pO1xuICogICBhd2FpdCB3b3JrZXIucnVuKCk7XG4gKi9cbmV4cG9ydCBjbGFzcyBXb3JrZXIgaW1wbGVtZW50cyBXb3JrZXJJbnRlcmZhY2Uge1xuICBwcml2YXRlIGNvbmZpZzogV29ya2VyQ29uZmlnO1xuICBwcml2YXRlIHdvcmtmbG93czogTWFwPHN0cmluZywgV29ya2Zsb3dDbGFzcz4gPSBuZXcgTWFwKCk7XG4gIHByaXZhdGUgYWN0aXZpdGllczogTWFwPHN0cmluZywgQWN0aXZpdHlIYW5kbGVyPiA9IG5ldyBNYXAoKTtcbiAgXG4gIHByaXZhdGUgd29ya2VySWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGluc3RhbmNlSWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHJ1bm5pbmcgPSBmYWxzZTtcbiAgcHJpdmF0ZSBrYWZrYTogS2Fma2EgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBjb25zdW1lcjogQ29uc3VtZXIgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBwcm9kdWNlcjogUHJvZHVjZXIgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBoZWFydGJlYXRJbnRlcnZhbDogTm9kZUpTLlRpbWVvdXQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBoZWFydGJlYXRJbnRlcnZhbE1zID0gMzAwMDA7XG4gIHByaXZhdGUgcmVzdWx0VG9waWM6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIG1heENvbmN1cnJlbnRXb3JrZmxvd3M6IG51bWJlcjtcbiAgcHJpdmF0ZSBhY3RpdmVXb3JrZmxvd3MgPSAwO1xuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogV29ya2VyQ29uZmlnKSB7XG4gICAgdGhpcy5jb25maWcgPSB7XG4gICAgICAuLi5jb25maWcsXG4gICAgICBzZXJ2ZXJVcmw6IGNvbmZpZy5zZXJ2ZXJVcmwucmVwbGFjZSgvXFwvJC8sICcnKSxcbiAgICB9O1xuICAgIHRoaXMubWF4Q29uY3VycmVudFdvcmtmbG93cyA9IGNvbmZpZy5tYXhDb25jdXJyZW50V29ya2Zsb3dzIHx8IDEwO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVyIHdvcmtmbG93cyBhbmQgYWN0aXZpdGllcy5cbiAgICovXG4gIHJlZ2lzdGVyKG9wdGlvbnM6IHtcbiAgICB3b3JrZmxvd3M/OiBXb3JrZmxvd0NsYXNzW107XG4gICAgYWN0aXZpdGllcz86IERlY29yYXRlZEFjdGl2aXR5W107XG4gIH0pOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IHdmQ2xzIG9mIG9wdGlvbnMud29ya2Zsb3dzIHx8IFtdKSB7XG4gICAgICBjb25zdCB3Zk5hbWUgPSBnZXRXb3JrZmxvd05hbWUod2ZDbHMpO1xuICAgICAgdGhpcy53b3JrZmxvd3Muc2V0KHdmTmFtZSwgd2ZDbHMpO1xuICAgICAgY29uc29sZS5sb2coYFJlZ2lzdGVyZWQgd29ya2Zsb3c6ICR7d2ZOYW1lfWApO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgYWN0aXZpdHlGbiBvZiBvcHRpb25zLmFjdGl2aXRpZXMgfHwgW10pIHtcbiAgICAgIGNvbnN0IGFjdGl2aXR5TmFtZSA9IGdldEFjdGl2aXR5TmFtZShhY3Rpdml0eUZuKTtcbiAgICAgIHRoaXMuYWN0aXZpdGllcy5zZXQoYWN0aXZpdHlOYW1lLCBhY3Rpdml0eUZuKTtcbiAgICAgIGNvbnNvbGUubG9nKGBSZWdpc3RlcmVkIGFjdGl2aXR5OiAke2FjdGl2aXR5TmFtZX1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU3RhcnQgdGhlIHdvcmtlciAoYmxvY2tpbmcpLlxuICAgKi9cbiAgYXN5bmMgcnVuKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMucnVubmluZyA9IHRydWU7XG5cbiAgICAvLyBTZXR1cCBzaWduYWwgaGFuZGxlcnNcbiAgICBwcm9jZXNzLm9uKCdTSUdJTlQnLCAoKSA9PiB0aGlzLnN0b3AoKSk7XG4gICAgcHJvY2Vzcy5vbignU0lHVEVSTScsICgpID0+IHRoaXMuc3RvcCgpKTtcblxuICAgIC8vIENvbm5lY3QgdG8gc2VydmVyIGFuZCBnZXQgS2Fma2EgY29uZmlnXG4gICAgY29uc3Qgc2VydmVyS2Fma2FDb25maWcgPSBhd2FpdCB0aGlzLmNvbm5lY3RUb1NlcnZlcigpO1xuICAgIGNvbnN0IHdvcmtlclRvcGljID0gc2VydmVyS2Fma2FDb25maWcud29ya2VyX3RvcGljO1xuICAgIGNvbnN0IHJlc3VsdFRvcGljID0gc2VydmVyS2Fma2FDb25maWcucmVzdWx0X3RvcGljO1xuICAgIHRoaXMucmVzdWx0VG9waWMgPSByZXN1bHRUb3BpYztcblxuICAgIC8vIENyZWF0ZSBLYWZrYSBjbGllbnRcbiAgICB0aGlzLmthZmthID0gdGhpcy5jcmVhdGVLYWZrYUNsaWVudChzZXJ2ZXJLYWZrYUNvbmZpZyk7XG4gICAgXG4gICAgLy8gQ3JlYXRlIGNvbnN1bWVyXG4gICAgY29uc3QgY29uc3VtZXJHcm91cElkID0gdGhpcy5jb25maWcuZ3JvdXBJZCB8fCBgd29ya2Zsb3ctd29ya2VyLSR7dGhpcy53b3JrZXJJZH1gO1xuICAgIHRoaXMuY29uc3VtZXIgPSB0aGlzLmthZmthLmNvbnN1bWVyKHsgZ3JvdXBJZDogY29uc3VtZXJHcm91cElkIH0pO1xuICAgIFxuICAgIC8vIENyZWF0ZSBwcm9kdWNlclxuICAgIHRoaXMucHJvZHVjZXIgPSB0aGlzLmthZmthLnByb2R1Y2VyKCk7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5jb25zdW1lci5jb25uZWN0KCk7XG4gICAgICBhd2FpdCB0aGlzLnByb2R1Y2VyLmNvbm5lY3QoKTtcbiAgICAgIGF3YWl0IHRoaXMuY29uc3VtZXIuc3Vic2NyaWJlKHsgdG9waWM6IHdvcmtlclRvcGljLCBmcm9tQmVnaW5uaW5nOiBmYWxzZSB9KTtcblxuICAgICAgY29uc29sZS5sb2coYFdvcmtlciAke3RoaXMud29ya2VySWR9IHN0YXJ0ZWQsIGNvbnN1bWluZyBmcm9tICR7d29ya2VyVG9waWN9YCk7XG4gICAgICBjb25zb2xlLmxvZyhgTWF4IGNvbmN1cnJlbnQgd29ya2Zsb3dzOiAke3RoaXMubWF4Q29uY3VycmVudFdvcmtmbG93c31gKTtcbiAgICAgIGNvbnNvbGUubG9nKGBSZWdpc3RlcmVkIHdvcmtmbG93czogJHtBcnJheS5mcm9tKHRoaXMud29ya2Zsb3dzLmtleXMoKSkuam9pbignLCAnKX1gKTtcbiAgICAgIGNvbnNvbGUubG9nKGBSZWdpc3RlcmVkIGFjdGl2aXRpZXM6ICR7QXJyYXkuZnJvbSh0aGlzLmFjdGl2aXRpZXMua2V5cygpKS5qb2luKCcsICcpfWApO1xuXG4gICAgICAvLyBTdGFydCBoZWFydGJlYXRcbiAgICAgIHRoaXMuc3RhcnRIZWFydGJlYXQoKTtcblxuICAgICAgLy8gU3RhcnQgY29uc3VtaW5nIG1lc3NhZ2VzXG4gICAgICBhd2FpdCB0aGlzLmNvbnN1bWVyLnJ1bih7XG4gICAgICAgIGVhY2hNZXNzYWdlOiBhc3luYyAoeyBtZXNzYWdlIH0pID0+IHtcbiAgICAgICAgICBpZiAoIXRoaXMucnVubmluZykgcmV0dXJuO1xuICAgICAgICAgIFxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZShtZXNzYWdlLnZhbHVlPy50b1N0cmluZygpIHx8ICd7fScpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5wcm9jZXNzTWVzc2FnZShkYXRhLCByZXN1bHRUb3BpYyk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHByb2Nlc3NpbmcgbWVzc2FnZTonLCBlcnJvcik7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIC8vIEtlZXAgcnVubmluZyB1bnRpbCBzdG9wcGVkXG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgICBjb25zdCBjaGVja0ludGVydmFsID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgICAgIGlmICghdGhpcy5ydW5uaW5nKSB7XG4gICAgICAgICAgICBjbGVhckludGVydmFsKGNoZWNrSW50ZXJ2YWwpO1xuICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSwgMTAwKTtcbiAgICAgIH0pO1xuXG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IHRoaXMuY2xlYW51cCgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTdG9wIHRoZSB3b3JrZXIgZ3JhY2VmdWxseS5cbiAgICovXG4gIGFzeW5jIHN0b3AoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc29sZS5sb2coJ1N0b3BwaW5nIHdvcmtlci4uLicpO1xuICAgIHRoaXMucnVubmluZyA9IGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjb25uZWN0VG9TZXJ2ZXIoKTogUHJvbWlzZTxLYWZrYUNvbmZpZz4ge1xuICAgIGNvbnN0IGhvc3RuYW1lID0gb3MuaG9zdG5hbWUoKTtcbiAgICBcbiAgICBjb25zdCBjb25uZWN0UGF5bG9hZCA9IHtcbiAgICAgIHdvcmtmbG93czogQXJyYXkuZnJvbSh0aGlzLndvcmtmbG93cy5rZXlzKCkpLFxuICAgICAgYWN0aXZpdGllczogQXJyYXkuZnJvbSh0aGlzLmFjdGl2aXRpZXMua2V5cygpKSxcbiAgICAgIGhvc3RuYW1lLFxuICAgIH07XG5cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGAke3RoaXMuY29uZmlnLnNlcnZlclVybH0vd29ya2Zsb3cvYXBpL3YxL3dvcmtlcnMvY29ubmVjdGAsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVyczoge1xuICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAnQXV0aG9yaXphdGlvbic6IGBCZWFyZXIgJHt0aGlzLmNvbmZpZy5hcGlLZXl9YCxcbiAgICAgIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShjb25uZWN0UGF5bG9hZCksXG4gICAgfSk7XG5cbiAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICBjb25zdCBlcnJvciA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGNvbm5lY3QgdG8gc2VydmVyOiAke3Jlc3BvbnNlLnN0YXR1c30gLSAke2Vycm9yfWApO1xuICAgIH1cblxuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCkgYXMgQ29ubmVjdFJlc3BvbnNlO1xuICAgIFxuICAgIHRoaXMud29ya2VySWQgPSBkYXRhLndvcmtlcl9pZDtcbiAgICB0aGlzLmluc3RhbmNlSWQgPSBkYXRhLmluc3RhbmNlX2lkO1xuICAgIHRoaXMuaGVhcnRiZWF0SW50ZXJ2YWxNcyA9IGRhdGEuaGVhcnRiZWF0X2ludGVydmFsX21zIHx8IDMwMDAwO1xuXG4gICAgY29uc29sZS5sb2coYENvbm5lY3RlZCB0byBzZXJ2ZXIgYXMgd29ya2VyX2lkPSR7dGhpcy53b3JrZXJJZH0sIGluc3RhbmNlX2lkPSR7dGhpcy5pbnN0YW5jZUlkfWApO1xuXG4gICAgcmV0dXJuIGRhdGEua2Fma2E7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUthZmthQ2xpZW50KGthZmthQ29uZmlnOiBLYWZrYUNvbmZpZyk6IEthZmthIHtcbiAgICBjb25zdCBhdXRoID0ga2Fma2FDb25maWcuYXV0aDtcbiAgICBcbiAgICAvLyBTZXJ2ZXIgcmV0dXJucyBicm9rZXJzIGFzIGNvbW1hLXNlcGFyYXRlZCBzdHJpbmcsIGNvbnZlcnQgdG8gYXJyYXlcbiAgICBjb25zdCBicm9rZXJzID0gdHlwZW9mIGthZmthQ29uZmlnLmJyb2tlcnMgPT09ICdzdHJpbmcnXG4gICAgICA/IChrYWZrYUNvbmZpZy5icm9rZXJzIGFzIHN0cmluZykuc3BsaXQoJywnKS5tYXAoYiA9PiBiLnRyaW0oKSkuZmlsdGVyKGIgPT4gYilcbiAgICAgIDoga2Fma2FDb25maWcuYnJva2VycztcbiAgICBcbiAgICBjb25zdCBjb25maWc6IGFueSA9IHtcbiAgICAgIGNsaWVudElkOiBgd29ya2Zsb3ctd29ya2VyLSR7dGhpcy53b3JrZXJJZH1gLFxuICAgICAgYnJva2VycyxcbiAgICAgIGxvZ0xldmVsOiBsb2dMZXZlbC5XQVJOLFxuICAgIH07XG5cbiAgICBpZiAoYXV0aD8udHlwZSA9PT0gJ21za19pYW0nKSB7XG4gICAgICBjb25maWcuc3NsID0gdHJ1ZTtcbiAgICAgIGNvbmZpZy5zYXNsID0ge1xuICAgICAgICBtZWNoYW5pc206ICdvYXV0aGJlYXJlcicsXG4gICAgICAgIG9hdXRoQmVhcmVyUHJvdmlkZXI6IGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCB0b2tlbiA9IGF3YWl0IGdlbmVyYXRlQXV0aFRva2VuRnJvbUNyZWRlbnRpYWxzUHJvdmlkZXIoe1xuICAgICAgICAgICAgcmVnaW9uOiBhdXRoLnJlZ2lvbiEsXG4gICAgICAgICAgICBhd3NDcmVkZW50aWFsc1Byb3ZpZGVyOiBhc3luYyAoKSA9PiAoe1xuICAgICAgICAgICAgICBhY2Nlc3NLZXlJZDogYXV0aC5hY2Nlc3Nfa2V5X2lkISxcbiAgICAgICAgICAgICAgc2VjcmV0QWNjZXNzS2V5OiBhdXRoLnNlY3JldF9hY2Nlc3Nfa2V5ISxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiB7IHZhbHVlOiB0b2tlbi50b2tlbiB9O1xuICAgICAgICB9LFxuICAgICAgfSBhcyBTQVNMT3B0aW9ucztcbiAgICB9IGVsc2UgaWYgKGF1dGg/LnR5cGUgPT09ICdzYXNsJykge1xuICAgICAgaWYgKGF1dGguc2VjdXJpdHlfcHJvdG9jb2w/LmluY2x1ZGVzKCdTU0wnKSkge1xuICAgICAgICBjb25maWcuc3NsID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChhdXRoLnNhc2xfbWVjaGFuaXNtICYmIGF1dGguc2FzbF91c2VybmFtZSAmJiBhdXRoLnNhc2xfcGFzc3dvcmQpIHtcbiAgICAgICAgY29uZmlnLnNhc2wgPSB7XG4gICAgICAgICAgbWVjaGFuaXNtOiBhdXRoLnNhc2xfbWVjaGFuaXNtLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgnLScsICcnKSxcbiAgICAgICAgICB1c2VybmFtZTogYXV0aC5zYXNsX3VzZXJuYW1lLFxuICAgICAgICAgIHBhc3N3b3JkOiBhdXRoLnNhc2xfcGFzc3dvcmQsXG4gICAgICAgIH0gYXMgU0FTTE9wdGlvbnM7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBLYWZrYShjb25maWcpO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGFydEhlYXJ0YmVhdCgpOiB2b2lkIHtcbiAgICB0aGlzLmhlYXJ0YmVhdEludGVydmFsID0gc2V0SW50ZXJ2YWwoYXN5bmMgKCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLnJ1bm5pbmcpIHJldHVybjtcbiAgICAgIFxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgJHt0aGlzLmNvbmZpZy5zZXJ2ZXJVcmx9L3dvcmtmbG93L2FwaS92MS93b3JrZXJzL2hlYXJ0YmVhdGAsIHtcbiAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgJ0F1dGhvcml6YXRpb24nOiBgQmVhcmVyICR7dGhpcy5jb25maWcuYXBpS2V5fWAsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGluc3RhbmNlX2lkOiB0aGlzLmluc3RhbmNlSWQgfSksXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oYEhlYXJ0YmVhdCBmYWlsZWQ6ICR7cmVzcG9uc2Uuc3RhdHVzfWApO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLndhcm4oJ0hlYXJ0YmVhdCBlcnJvcjonLCBlcnJvcik7XG4gICAgICB9XG4gICAgfSwgdGhpcy5oZWFydGJlYXRJbnRlcnZhbE1zKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZGlzY29ubmVjdEZyb21TZXJ2ZXIoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLmluc3RhbmNlSWQpIHJldHVybjtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGAke3RoaXMuY29uZmlnLnNlcnZlclVybH0vd29ya2Zsb3cvYXBpL3YxL3dvcmtlcnMvZGlzY29ubmVjdGAsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICdBdXRob3JpemF0aW9uJzogYEJlYXJlciAke3RoaXMuY29uZmlnLmFwaUtleX1gLFxuICAgICAgICB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGluc3RhbmNlX2lkOiB0aGlzLmluc3RhbmNlSWQgfSksXG4gICAgICB9KTtcblxuICAgICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdEaXNjb25uZWN0ZWQgZnJvbSBzZXJ2ZXInKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKCdGYWlsZWQgdG8gZGlzY29ubmVjdCBmcm9tIHNlcnZlcjonLCBlcnJvcik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBwcm9jZXNzTWVzc2FnZShkYXRhOiBhbnksIHJlc3VsdFRvcGljOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBDaGVjayBpZiB0aGlzIGlzIGFuIGFjdGl2aXR5IHJlc3VsdCAocmVzcG9uc2UgZnJvbSBhbm90aGVyIHdvcmtlciB2aWEgc2VydmVyKVxuICAgIGlmIChkYXRhLnN0YXR1cyAmJiBkYXRhLmNvbXBsZXRlZF9hdCAmJiAhZGF0YS50YXNrX3R5cGUpIHtcbiAgICAgIGNvbnNvbGUuZGVidWcoJ1JlY2VpdmVkIGFjdGl2aXR5IHJlc3VsdCBvbiB3b3JrZXIgdG9waWMgKGlnbm9yZWQgLSB1c2luZyBwb2xsaW5nKScpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHRhc2tUeXBlID0gZGF0YS50YXNrX3R5cGUgfHwgJ2FjdGl2aXR5JztcblxuICAgIGlmICh0YXNrVHlwZSA9PT0gJ3dvcmtmbG93Jykge1xuICAgICAgLy8gUHJvY2VzcyB3b3JrZmxvdyBpbiBiYWNrZ3JvdW5kIChkb24ndCBibG9jayBtZXNzYWdlIGxvb3ApXG4gICAgICB0aGlzLnByb2Nlc3NXb3JrZmxvd1Rhc2soZGF0YSwgcmVzdWx0VG9waWMpLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBwcm9jZXNzaW5nIHdvcmtmbG93IHRhc2s6JywgZXJyb3IpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEFjdGl2aXR5IHRhc2tzIGNhbiBiZSBwcm9jZXNzZWQgaW5saW5lXG4gICAgICBhd2FpdCB0aGlzLnByb2Nlc3NBY3Rpdml0eVRhc2soZGF0YSwgcmVzdWx0VG9waWMpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcHJvY2Vzc1dvcmtmbG93VGFzayhkYXRhOiBXb3JrZmxvd1Rhc2ssIHJlc3VsdFRvcGljOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBDaGVjayBjb25jdXJyZW5jeSBsaW1pdFxuICAgIHdoaWxlICh0aGlzLmFjdGl2ZVdvcmtmbG93cyA+PSB0aGlzLm1heENvbmN1cnJlbnRXb3JrZmxvd3MpIHtcbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDEwMCkpO1xuICAgIH1cbiAgICB0aGlzLmFjdGl2ZVdvcmtmbG93cysrO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuZXhlY3V0ZVdvcmtmbG93KGRhdGEsIHJlc3VsdFRvcGljKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5hY3RpdmVXb3JrZmxvd3MtLTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGV4ZWN1dGVXb3JrZmxvdyh0YXNrOiBXb3JrZmxvd1Rhc2ssIHJlc3VsdFRvcGljOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zb2xlLmxvZyhgUmVjZWl2ZWQgd29ya2Zsb3cgdGFzayAke3Rhc2sudGFza19pZH06ICR7dGFzay53b3JrZmxvd19uYW1lfWApO1xuXG4gICAgLy8gRmluZCB0aGUgd29ya2Zsb3cgY2xhc3NcbiAgICBjb25zdCB3b3JrZmxvd0NscyA9IHRoaXMud29ya2Zsb3dzLmdldCh0YXNrLndvcmtmbG93X25hbWUpO1xuICAgIGlmICghd29ya2Zsb3dDbHMpIHtcbiAgICAgIGNvbnNvbGUud2FybihgVW5rbm93biB3b3JrZmxvdzogJHt0YXNrLndvcmtmbG93X25hbWV9YCk7XG4gICAgICBhd2FpdCB0aGlzLnNlbmRXb3JrZmxvd1Jlc3VsdCh0YXNrLCByZXN1bHRUb3BpYywgJ2ZhaWxlZCcsIHVuZGVmaW5lZCwge1xuICAgICAgICB0eXBlOiAnVW5rbm93bldvcmtmbG93JyxcbiAgICAgICAgbWVzc2FnZTogYFdvcmtmbG93ICcke3Rhc2sud29ya2Zsb3dfbmFtZX0nIG5vdCByZWdpc3RlcmVkYCxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEZpbmQgdGhlIHJ1biBtZXRob2RcbiAgICBjb25zdCBydW5NZXRob2QgPSBmaW5kUnVuTWV0aG9kKHdvcmtmbG93Q2xzKTtcbiAgICBpZiAoIXJ1bk1ldGhvZCkge1xuICAgICAgYXdhaXQgdGhpcy5zZW5kV29ya2Zsb3dSZXN1bHQodGFzaywgcmVzdWx0VG9waWMsICdmYWlsZWQnLCB1bmRlZmluZWQsIHtcbiAgICAgICAgdHlwZTogJ05vUnVuTWV0aG9kJyxcbiAgICAgICAgbWVzc2FnZTogYFdvcmtmbG93ICcke3Rhc2sud29ya2Zsb3dfbmFtZX0nIGhhcyBubyBydW4gbWV0aG9kYCxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEV4ZWN1dGUgdGhlIHdvcmtmbG93XG4gICAgY29uc3Qgc3RhcnRlZEF0ID0gbmV3IERhdGUoKTtcbiAgICB0cnkge1xuICAgICAgLy8gQnVpbGQgY29tcGxldGVkIGFjdGl2aXRpZXMgbWFwIGZvciByZXBsYXlcbiAgICAgIGNvbnN0IGNvbXBsZXRlZEFjdGl2aXRpZXNNYXAgPSBuZXcgTWFwPG51bWJlciwgdW5rbm93bj4oKTtcbiAgICAgIGlmICh0YXNrLmNvbXBsZXRlZF9hY3Rpdml0aWVzKSB7XG4gICAgICAgIGZvciAoY29uc3QgY2Egb2YgdGFzay5jb21wbGV0ZWRfYWN0aXZpdGllcykge1xuICAgICAgICAgIGNvbXBsZXRlZEFjdGl2aXRpZXNNYXAuc2V0KGNhLmluZGV4LCBjYS5vdXRwdXQpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgIGBSZXN1bWluZyB3b3JrZmxvdyAke3Rhc2sud29ya2Zsb3dfaWR9IHdpdGggJHtjb21wbGV0ZWRBY3Rpdml0aWVzTWFwLnNpemV9IGNvbXBsZXRlZCBhY3Rpdml0aWVzYFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBDcmVhdGUgd29ya2Zsb3cgY29udGV4dFxuICAgICAgY29uc3QgY3R4ID0gbmV3IFdvcmtmbG93Q29udGV4dChcbiAgICAgICAgdGhpcy5hY3Rpdml0aWVzLFxuICAgICAgICB0YXNrLndvcmtmbG93X2lkLFxuICAgICAgICB0aGlzLFxuICAgICAgICBjb21wbGV0ZWRBY3Rpdml0aWVzTWFwLnNpemUgPiAwID8gY29tcGxldGVkQWN0aXZpdGllc01hcCA6IG51bGwsXG4gICAgICAgIHRhc2subWV0YWRhdGFcbiAgICAgICk7XG5cbiAgICAgIC8vIEV4ZWN1dGUgd2l0aGluIGNvbnRleHRcbiAgICAgIGNvbnN0IG91dHB1dCA9IGF3YWl0IHJ1bldpdGhDb250ZXh0KGN0eCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgUHJvbWlzZS5yYWNlKFtcbiAgICAgICAgICBydW5NZXRob2QodGFzay5pbnB1dCksXG4gICAgICAgICAgbmV3IFByb21pc2U8bmV2ZXI+KChfLCByZWplY3QpID0+XG4gICAgICAgICAgICBzZXRUaW1lb3V0KFxuICAgICAgICAgICAgICAoKSA9PiByZWplY3QobmV3IEVycm9yKGBXb3JrZmxvdyB0aW1lZCBvdXQgYWZ0ZXIgJHt0YXNrLnRpbWVvdXRfbXN9bXNgKSksXG4gICAgICAgICAgICAgIHRhc2sudGltZW91dF9tc1xuICAgICAgICAgICAgKVxuICAgICAgICAgICksXG4gICAgICAgIF0pO1xuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGNvbXBsZXRlZEF0ID0gbmV3IERhdGUoKTtcbiAgICAgIGNvbnN0IGR1cmF0aW9uTXMgPSBjb21wbGV0ZWRBdC5nZXRUaW1lKCkgLSBzdGFydGVkQXQuZ2V0VGltZSgpO1xuXG4gICAgICBjb25zb2xlLmxvZyhgV29ya2Zsb3cgJHt0YXNrLnRhc2tfaWR9IGNvbXBsZXRlZCBpbiAke2R1cmF0aW9uTXN9bXNgKTtcblxuICAgICAgYXdhaXQgdGhpcy5zZW5kV29ya2Zsb3dSZXN1bHQoXG4gICAgICAgIHRhc2ssXG4gICAgICAgIHJlc3VsdFRvcGljLFxuICAgICAgICAnY29tcGxldGVkJyxcbiAgICAgICAgb3V0cHV0LFxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgIHN0YXJ0ZWRBdCxcbiAgICAgICAgY29tcGxldGVkQXQsXG4gICAgICAgIGR1cmF0aW9uTXNcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnN0IGNvbXBsZXRlZEF0ID0gbmV3IERhdGUoKTtcbiAgICAgIGNvbnN0IGR1cmF0aW9uTXMgPSBjb21wbGV0ZWRBdC5nZXRUaW1lKCkgLSBzdGFydGVkQXQuZ2V0VGltZSgpO1xuICAgICAgY29uc3QgZXJyID0gZXJyb3IgYXMgRXJyb3I7XG5cbiAgICAgIGNvbnNvbGUuZXJyb3IoYFdvcmtmbG93ICR7dGFzay50YXNrX2lkfSBmYWlsZWQ6YCwgZXJyLm1lc3NhZ2UpO1xuXG4gICAgICBhd2FpdCB0aGlzLnNlbmRXb3JrZmxvd1Jlc3VsdChcbiAgICAgICAgdGFzayxcbiAgICAgICAgcmVzdWx0VG9waWMsXG4gICAgICAgICdmYWlsZWQnLFxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiBlcnIubmFtZSB8fCAnRXJyb3InLFxuICAgICAgICAgIG1lc3NhZ2U6IGVyci5tZXNzYWdlLFxuICAgICAgICAgIHN0YWNrX3RyYWNlOiBlcnIuc3RhY2ssXG4gICAgICAgIH0sXG4gICAgICAgIHN0YXJ0ZWRBdCxcbiAgICAgICAgY29tcGxldGVkQXQsXG4gICAgICAgIGR1cmF0aW9uTXNcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBwcm9jZXNzQWN0aXZpdHlUYXNrKGRhdGE6IEFjdGl2aXR5VGFzaywgcmVzdWx0VG9waWM6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHRhc2sgPSBkYXRhO1xuICAgIGNvbnNvbGUubG9nKFxuICAgICAgYFJlY2VpdmVkIGFjdGl2aXR5IHRhc2sgJHt0YXNrLnRhc2tfaWR9OiAke3Rhc2suYWN0aXZpdHlfbmFtZX0gKHdvcmtmbG93PSR7dGFzay53b3JrZmxvd19pZH0pYFxuICAgICk7XG5cbiAgICAvLyBGaW5kIHRoZSBhY3Rpdml0eSBoYW5kbGVyXG4gICAgY29uc3QgYWN0aXZpdHlGbiA9IHRoaXMuYWN0aXZpdGllcy5nZXQodGFzay5hY3Rpdml0eV9uYW1lKTtcbiAgICBpZiAoIWFjdGl2aXR5Rm4pIHtcbiAgICAgIGNvbnNvbGUud2FybihgVW5rbm93biBhY3Rpdml0eTogJHt0YXNrLmFjdGl2aXR5X25hbWV9YCk7XG4gICAgICBhd2FpdCB0aGlzLnNlbmRBY3Rpdml0eVJlc3VsdCh0YXNrLCByZXN1bHRUb3BpYywgJ2ZhaWxlZCcsIHVuZGVmaW5lZCwge1xuICAgICAgICB0eXBlOiAnVW5rbm93bkFjdGl2aXR5JyxcbiAgICAgICAgbWVzc2FnZTogYEFjdGl2aXR5ICcke3Rhc2suYWN0aXZpdHlfbmFtZX0nIG5vdCByZWdpc3RlcmVkYCxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEV4ZWN1dGUgdGhlIGFjdGl2aXR5XG4gICAgY29uc3Qgc3RhcnRlZEF0ID0gbmV3IERhdGUoKTtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgb3V0cHV0ID0gYXdhaXQgUHJvbWlzZS5yYWNlKFtcbiAgICAgICAgUHJvbWlzZS5yZXNvbHZlKGFjdGl2aXR5Rm4odGFzay5pbnB1dCkpLFxuICAgICAgICBuZXcgUHJvbWlzZTxuZXZlcj4oKF8sIHJlamVjdCkgPT5cbiAgICAgICAgICBzZXRUaW1lb3V0KFxuICAgICAgICAgICAgKCkgPT4gcmVqZWN0KG5ldyBFcnJvcihgQWN0aXZpdHkgdGltZWQgb3V0IGFmdGVyICR7dGFzay50aW1lb3V0X21zfW1zYCkpLFxuICAgICAgICAgICAgdGFzay50aW1lb3V0X21zXG4gICAgICAgICAgKVxuICAgICAgICApLFxuICAgICAgXSk7XG5cbiAgICAgIGNvbnN0IGNvbXBsZXRlZEF0ID0gbmV3IERhdGUoKTtcbiAgICAgIGNvbnN0IGR1cmF0aW9uTXMgPSBjb21wbGV0ZWRBdC5nZXRUaW1lKCkgLSBzdGFydGVkQXQuZ2V0VGltZSgpO1xuXG4gICAgICBjb25zb2xlLmxvZyhgQWN0aXZpdHkgJHt0YXNrLnRhc2tfaWR9IGNvbXBsZXRlZCBpbiAke2R1cmF0aW9uTXN9bXNgKTtcblxuICAgICAgYXdhaXQgdGhpcy5zZW5kQWN0aXZpdHlSZXN1bHQoXG4gICAgICAgIHRhc2ssXG4gICAgICAgIHJlc3VsdFRvcGljLFxuICAgICAgICAnY29tcGxldGVkJyxcbiAgICAgICAgb3V0cHV0LFxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgIHN0YXJ0ZWRBdCxcbiAgICAgICAgY29tcGxldGVkQXQsXG4gICAgICAgIGR1cmF0aW9uTXNcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnN0IGNvbXBsZXRlZEF0ID0gbmV3IERhdGUoKTtcbiAgICAgIGNvbnN0IGR1cmF0aW9uTXMgPSBjb21wbGV0ZWRBdC5nZXRUaW1lKCkgLSBzdGFydGVkQXQuZ2V0VGltZSgpO1xuICAgICAgY29uc3QgZXJyID0gZXJyb3IgYXMgRXJyb3I7XG5cbiAgICAgIGNvbnNvbGUuZXJyb3IoYEFjdGl2aXR5ICR7dGFzay50YXNrX2lkfSBmYWlsZWQ6YCwgZXJyLm1lc3NhZ2UpO1xuXG4gICAgICBhd2FpdCB0aGlzLnNlbmRBY3Rpdml0eVJlc3VsdChcbiAgICAgICAgdGFzayxcbiAgICAgICAgcmVzdWx0VG9waWMsXG4gICAgICAgICdmYWlsZWQnLFxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiBlcnIubmFtZSB8fCAnRXJyb3InLFxuICAgICAgICAgIG1lc3NhZ2U6IGVyci5tZXNzYWdlLFxuICAgICAgICAgIHN0YWNrX3RyYWNlOiBlcnIuc3RhY2ssXG4gICAgICAgIH0sXG4gICAgICAgIHN0YXJ0ZWRBdCxcbiAgICAgICAgY29tcGxldGVkQXQsXG4gICAgICAgIGR1cmF0aW9uTXNcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzZW5kV29ya2Zsb3dSZXN1bHQoXG4gICAgdGFzazogV29ya2Zsb3dUYXNrLFxuICAgIHJlc3VsdFRvcGljOiBzdHJpbmcsXG4gICAgc3RhdHVzOiAnY29tcGxldGVkJyB8ICdmYWlsZWQnLFxuICAgIG91dHB1dD86IHVua25vd24sXG4gICAgZXJyb3I/OiBXb3JrZmxvd0Vycm9yLFxuICAgIHN0YXJ0ZWRBdD86IERhdGUsXG4gICAgY29tcGxldGVkQXQ/OiBEYXRlLFxuICAgIGR1cmF0aW9uTXMgPSAwXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCk7XG4gICAgY29uc3QgcmVzdWx0OiBXb3JrZmxvd1Jlc3VsdCA9IHtcbiAgICAgIHRhc2tfaWQ6IHRhc2sudGFza19pZCxcbiAgICAgIHdvcmtmbG93X2lkOiB0YXNrLndvcmtmbG93X2lkLFxuICAgICAgd29ya2Zsb3dfbmFtZTogdGFzay53b3JrZmxvd19uYW1lLFxuICAgICAgc3RhdHVzLFxuICAgICAgb3V0cHV0LFxuICAgICAgZXJyb3IsXG4gICAgICBzdGFydGVkX2F0OiAoc3RhcnRlZEF0IHx8IG5vdykudG9JU09TdHJpbmcoKSxcbiAgICAgIGNvbXBsZXRlZF9hdDogKGNvbXBsZXRlZEF0IHx8IG5vdykudG9JU09TdHJpbmcoKSxcbiAgICAgIGR1cmF0aW9uX21zOiBkdXJhdGlvbk1zLFxuICAgICAgd29ya2VyX2lkOiB0aGlzLndvcmtlcklkISxcbiAgICB9O1xuXG4gICAgaWYgKHRoaXMucHJvZHVjZXIpIHtcbiAgICAgIGF3YWl0IHRoaXMucHJvZHVjZXIuc2VuZCh7XG4gICAgICAgIHRvcGljOiByZXN1bHRUb3BpYyxcbiAgICAgICAgbWVzc2FnZXM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBrZXk6IHRhc2sud29ya2Zsb3dfaWQsXG4gICAgICAgICAgICB2YWx1ZTogSlNPTi5zdHJpbmdpZnkocmVzdWx0KSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSk7XG4gICAgICBjb25zb2xlLmRlYnVnKGBTZW50IHdvcmtmbG93IHJlc3VsdCBmb3IgdGFzayAke3Rhc2sudGFza19pZH1gKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHNlbmRBY3Rpdml0eVJlc3VsdChcbiAgICB0YXNrOiBBY3Rpdml0eVRhc2ssXG4gICAgcmVzdWx0VG9waWM6IHN0cmluZyxcbiAgICBzdGF0dXM6ICdjb21wbGV0ZWQnIHwgJ2ZhaWxlZCcsXG4gICAgb3V0cHV0PzogdW5rbm93bixcbiAgICBlcnJvcj86IEFjdGl2aXR5RXJyb3IsXG4gICAgc3RhcnRlZEF0PzogRGF0ZSxcbiAgICBjb21wbGV0ZWRBdD86IERhdGUsXG4gICAgZHVyYXRpb25NcyA9IDBcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKTtcbiAgICBjb25zdCByZXN1bHQ6IEFjdGl2aXR5UmVzdWx0ID0ge1xuICAgICAgdGFza19pZDogdGFzay50YXNrX2lkLFxuICAgICAgd29ya2Zsb3dfaWQ6IHRhc2sud29ya2Zsb3dfaWQsXG4gICAgICBhY3Rpdml0eV9uYW1lOiB0YXNrLmFjdGl2aXR5X25hbWUsXG4gICAgICBhY3Rpdml0eV9pbmRleDogdGFzay5hY3Rpdml0eV9pbmRleCxcbiAgICAgIGZhbl9vdXRfaW5kZXg6IHRhc2suZmFuX291dF9pbmRleCxcbiAgICAgIHN0YXR1cyxcbiAgICAgIG91dHB1dCxcbiAgICAgIGVycm9yLFxuICAgICAgc3RhcnRlZF9hdDogKHN0YXJ0ZWRBdCB8fCBub3cpLnRvSVNPU3RyaW5nKCksXG4gICAgICBjb21wbGV0ZWRfYXQ6IChjb21wbGV0ZWRBdCB8fCBub3cpLnRvSVNPU3RyaW5nKCksXG4gICAgICBkdXJhdGlvbl9tczogZHVyYXRpb25NcyxcbiAgICAgIHdvcmtlcl9pZDogdGhpcy53b3JrZXJJZCEsXG4gICAgICByZXF1ZXN0ZXJfd29ya2VyX2lkOiB0YXNrLnJlcXVlc3Rlcl93b3JrZXJfaWQsXG4gICAgICBjb3JyZWxhdGlvbl9pZDogdGFzay5jb3JyZWxhdGlvbl9pZCxcbiAgICB9O1xuXG4gICAgaWYgKHRoaXMucHJvZHVjZXIpIHtcbiAgICAgIGF3YWl0IHRoaXMucHJvZHVjZXIuc2VuZCh7XG4gICAgICAgIHRvcGljOiByZXN1bHRUb3BpYyxcbiAgICAgICAgbWVzc2FnZXM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBrZXk6IHRhc2sud29ya2Zsb3dfaWQsXG4gICAgICAgICAgICB2YWx1ZTogSlNPTi5zdHJpbmdpZnkocmVzdWx0KSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSk7XG4gICAgICBjb25zb2xlLmRlYnVnKGBTZW50IGFjdGl2aXR5IHJlc3VsdCBmb3IgdGFzayAke3Rhc2sudGFza19pZH1gKTtcbiAgICB9XG4gIH1cblxuICAvLyBXb3JrZXJJbnRlcmZhY2UgaW1wbGVtZW50YXRpb24gZm9yIFdvcmtmbG93Q29udGV4dFxuXG4gIGFzeW5jIHJlcG9ydExvY2FsQWN0aXZpdHlDb21wbGV0aW9uKFxuICAgIHdvcmtmbG93SWQ6IHN0cmluZyxcbiAgICBhY3Rpdml0eU5hbWU6IHN0cmluZyxcbiAgICBhY3Rpdml0eUluZGV4OiBudW1iZXIsXG4gICAgb3V0cHV0OiB1bmtub3duLFxuICAgIGR1cmF0aW9uTXM6IG51bWJlclxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMucHJvZHVjZXIgfHwgIXRoaXMucmVzdWx0VG9waWMpIHtcbiAgICAgIGNvbnNvbGUuZGVidWcoJ0Nhbm5vdCByZXBvcnQgbG9jYWwgYWN0aXZpdHkgLSBwcm9kdWNlciBub3QgaW5pdGlhbGl6ZWQnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjb21wbGV0ZWRBdCA9IG5ldyBEYXRlKCk7XG4gICAgY29uc3Qgc3RhcnRlZEF0ID0gbmV3IERhdGUoY29tcGxldGVkQXQuZ2V0VGltZSgpIC0gZHVyYXRpb25Ncyk7XG5cbiAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICB0YXNrX2lkOiBgbG9jYWwtJHt3b3JrZmxvd0lkfS0ke2FjdGl2aXR5SW5kZXh9YCxcbiAgICAgIHdvcmtmbG93X2lkOiB3b3JrZmxvd0lkLFxuICAgICAgYWN0aXZpdHlfbmFtZTogYWN0aXZpdHlOYW1lLFxuICAgICAgYWN0aXZpdHlfaW5kZXg6IGFjdGl2aXR5SW5kZXgsXG4gICAgICBzdGF0dXM6ICdjb21wbGV0ZWQnLFxuICAgICAgb3V0cHV0LFxuICAgICAgc3RhcnRlZF9hdDogc3RhcnRlZEF0LnRvSVNPU3RyaW5nKCksXG4gICAgICBjb21wbGV0ZWRfYXQ6IGNvbXBsZXRlZEF0LnRvSVNPU3RyaW5nKCksXG4gICAgICBkdXJhdGlvbl9tczogZHVyYXRpb25NcyxcbiAgICAgIHdvcmtlcl9pZDogdGhpcy53b3JrZXJJZCxcbiAgICB9O1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMucHJvZHVjZXIuc2VuZCh7XG4gICAgICAgIHRvcGljOiB0aGlzLnJlc3VsdFRvcGljLFxuICAgICAgICBtZXNzYWdlczogW3sga2V5OiB3b3JrZmxvd0lkLCB2YWx1ZTogSlNPTi5zdHJpbmdpZnkocmVzdWx0KSB9XSxcbiAgICAgIH0pO1xuICAgICAgY29uc29sZS5kZWJ1ZyhcbiAgICAgICAgYFJlcG9ydGVkIGxvY2FsIGFjdGl2aXR5IGNvbXBsZXRpb246IHdvcmtmbG93X2lkPSR7d29ya2Zsb3dJZH0sIGFjdGl2aXR5PSR7YWN0aXZpdHlOYW1lfSwgaW5kZXg9JHthY3Rpdml0eUluZGV4fWBcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUud2FybignRmFpbGVkIHRvIHJlcG9ydCBsb2NhbCBhY3Rpdml0eSBjb21wbGV0aW9uOicsIGVycm9yKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyByZXBvcnRMb2NhbEFjdGl2aXR5RmFpbHVyZShcbiAgICB3b3JrZmxvd0lkOiBzdHJpbmcsXG4gICAgYWN0aXZpdHlOYW1lOiBzdHJpbmcsXG4gICAgYWN0aXZpdHlJbmRleDogbnVtYmVyLFxuICAgIGVycm9yOiBzdHJpbmcsXG4gICAgZXJyb3JUeXBlOiBzdHJpbmcsXG4gICAgZHVyYXRpb25NczogbnVtYmVyXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5wcm9kdWNlciB8fCAhdGhpcy5yZXN1bHRUb3BpYykge1xuICAgICAgY29uc29sZS5kZWJ1ZygnQ2Fubm90IHJlcG9ydCBsb2NhbCBhY3Rpdml0eSBmYWlsdXJlIC0gcHJvZHVjZXIgbm90IGluaXRpYWxpemVkJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY29tcGxldGVkQXQgPSBuZXcgRGF0ZSgpO1xuICAgIGNvbnN0IHN0YXJ0ZWRBdCA9IG5ldyBEYXRlKGNvbXBsZXRlZEF0LmdldFRpbWUoKSAtIGR1cmF0aW9uTXMpO1xuXG4gICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgdGFza19pZDogYGxvY2FsLSR7d29ya2Zsb3dJZH0tJHthY3Rpdml0eUluZGV4fWAsXG4gICAgICB3b3JrZmxvd19pZDogd29ya2Zsb3dJZCxcbiAgICAgIGFjdGl2aXR5X25hbWU6IGFjdGl2aXR5TmFtZSxcbiAgICAgIGFjdGl2aXR5X2luZGV4OiBhY3Rpdml0eUluZGV4LFxuICAgICAgc3RhdHVzOiAnZmFpbGVkJyxcbiAgICAgIG91dHB1dDogbnVsbCxcbiAgICAgIGVycm9yOiB7IHR5cGU6IGVycm9yVHlwZSwgbWVzc2FnZTogZXJyb3IgfSxcbiAgICAgIHN0YXJ0ZWRfYXQ6IHN0YXJ0ZWRBdC50b0lTT1N0cmluZygpLFxuICAgICAgY29tcGxldGVkX2F0OiBjb21wbGV0ZWRBdC50b0lTT1N0cmluZygpLFxuICAgICAgZHVyYXRpb25fbXM6IGR1cmF0aW9uTXMsXG4gICAgICB3b3JrZXJfaWQ6IHRoaXMud29ya2VySWQsXG4gICAgfTtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLnByb2R1Y2VyLnNlbmQoe1xuICAgICAgICB0b3BpYzogdGhpcy5yZXN1bHRUb3BpYyxcbiAgICAgICAgbWVzc2FnZXM6IFt7IGtleTogd29ya2Zsb3dJZCwgdmFsdWU6IEpTT04uc3RyaW5naWZ5KHJlc3VsdCkgfV0sXG4gICAgICB9KTtcbiAgICAgIGNvbnNvbGUuZGVidWcoXG4gICAgICAgIGBSZXBvcnRlZCBsb2NhbCBhY3Rpdml0eSBmYWlsdXJlOiB3b3JrZmxvd19pZD0ke3dvcmtmbG93SWR9LCBhY3Rpdml0eT0ke2FjdGl2aXR5TmFtZX0sIGluZGV4PSR7YWN0aXZpdHlJbmRleH1gXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ0ZhaWxlZCB0byByZXBvcnQgbG9jYWwgYWN0aXZpdHkgZmFpbHVyZTonLCBlcnJvcik7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZXhlY3V0ZVJlbW90ZUFjdGl2aXR5KFxuICAgIHdvcmtmbG93SWQ6IHN0cmluZyxcbiAgICBhY3Rpdml0eU5hbWU6IHN0cmluZyxcbiAgICBhY3Rpdml0eUluZGV4OiBudW1iZXIsXG4gICAgaW5wdXREYXRhOiB1bmtub3duLFxuICAgIHRpbWVvdXRNczogbnVtYmVyXG4gICk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIGlmICghdGhpcy5wcm9kdWNlciB8fCAhdGhpcy5yZXN1bHRUb3BpYykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdLYWZrYSBwcm9kdWNlciBub3QgaW5pdGlhbGl6ZWQnKTtcbiAgICB9XG5cbiAgICAvLyBTZW5kIEFjdGl2aXR5UmVxdWVzdCB0byBzZXJ2ZXIgdmlhIEthZmthXG4gICAgY29uc3QgcmVxdWVzdFBheWxvYWQgPSB7XG4gICAgICByZXF1ZXN0X3R5cGU6ICdhY3Rpdml0eV9yZXF1ZXN0JyxcbiAgICAgIHJlcXVlc3RfaWQ6IGNyeXB0by5yYW5kb21VVUlEKCksXG4gICAgICB3b3JrZmxvd19pZDogd29ya2Zsb3dJZCxcbiAgICAgIGFjdGl2aXR5X25hbWU6IGFjdGl2aXR5TmFtZSxcbiAgICAgIGFjdGl2aXR5X2luZGV4OiBhY3Rpdml0eUluZGV4LFxuICAgICAgaW5wdXQ6IGlucHV0RGF0YSxcbiAgICAgIHRpbWVvdXRfbXM6IHRpbWVvdXRNcyxcbiAgICAgIHJlcXVlc3Rlcl93b3JrZXJfaWQ6IHRoaXMud29ya2VySWQsXG4gICAgICBjb3JyZWxhdGlvbl9pZDogY3J5cHRvLnJhbmRvbVVVSUQoKSxcbiAgICAgIGNyZWF0ZWRfYXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICB9O1xuXG4gICAgYXdhaXQgdGhpcy5wcm9kdWNlci5zZW5kKHtcbiAgICAgIHRvcGljOiB0aGlzLnJlc3VsdFRvcGljLFxuICAgICAgbWVzc2FnZXM6IFt7IGtleTogd29ya2Zsb3dJZCwgdmFsdWU6IEpTT04uc3RyaW5naWZ5KHJlcXVlc3RQYXlsb2FkKSB9XSxcbiAgICB9KTtcblxuICAgIGNvbnNvbGUubG9nKFxuICAgICAgYEFjdGl2aXR5IHJlcXVlc3Qgc2VudCB2aWEgS2Fma2E6IGFjdGl2aXR5PSR7YWN0aXZpdHlOYW1lfSwgd29ya2Zsb3dfaWQ9JHt3b3JrZmxvd0lkfSwgYWN0aXZpdHlfaW5kZXg9JHthY3Rpdml0eUluZGV4fWBcbiAgICApO1xuXG4gICAgLy8gUG9sbCBzZXJ2ZXIgZm9yIHJlc3VsdCB3aXRoIGV4cG9uZW50aWFsIGJhY2tvZmZcbiAgICBsZXQgcG9sbEludGVydmFsID0gMjAwMDsgLy8gU3RhcnQgYXQgMiBzZWNvbmRzXG4gICAgY29uc3QgbWF4UG9sbEludGVydmFsID0gOTAwMDAwOyAvLyBNYXggMTUgbWludXRlc1xuICAgIGNvbnN0IGJhY2tvZmZNdWx0aXBsaWVyID0gMS41O1xuICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgY29uc3QgdGltZW91dFNlY29uZHMgPSB0aW1lb3V0TXM7XG5cbiAgICBjb25zdCBwb2xsVXJsID0gYCR7dGhpcy5jb25maWcuc2VydmVyVXJsfS93b3JrZmxvdy9hcGkvdjEvd29ya2Zsb3dzLyR7d29ya2Zsb3dJZH0vYWN0aXZpdGllcy8ke2FjdGl2aXR5SW5kZXh9L3Jlc3VsdGA7XG4gICAgY29uc3QgaGVhZGVycyA9IHsgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke3RoaXMuY29uZmlnLmFwaUtleX1gIH07XG5cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgY29uc3QgZWxhcHNlZCA9IERhdGUubm93KCkgLSBzdGFydFRpbWU7XG4gICAgICBpZiAoZWxhcHNlZCA+PSB0aW1lb3V0U2Vjb25kcykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEFjdGl2aXR5ICR7YWN0aXZpdHlOYW1lfSB0aW1lZCBvdXQgYWZ0ZXIgJHt0aW1lb3V0TXN9bXNgKTtcbiAgICAgIH1cblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChwb2xsVXJsLCB7IGhlYWRlcnMgfSk7XG5cbiAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVzcG9uc2UuanNvbigpIGFzIHsgc3RhdHVzOiBzdHJpbmc7IG91dHB1dD86IHVua25vd247IGVycm9yPzogc3RyaW5nIH07XG4gICAgICAgICAgaWYgKHJlc3VsdC5zdGF0dXMgPT09ICdjb21wbGV0ZWQnKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgQWN0aXZpdHkgJHthY3Rpdml0eU5hbWV9IGNvbXBsZXRlZCBmb3Igd29ya2Zsb3cgJHt3b3JrZmxvd0lkfWApO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5vdXRwdXQ7XG4gICAgICAgICAgfSBlbHNlIGlmIChyZXN1bHQuc3RhdHVzID09PSAnZmFpbGVkJykge1xuICAgICAgICAgICAgY29uc3QgZXJyb3JNc2cgPSByZXN1bHQuZXJyb3IgfHwgJ0FjdGl2aXR5IGZhaWxlZCc7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGBBY3Rpdml0eSAke2FjdGl2aXR5TmFtZX0gZmFpbGVkOiAke2Vycm9yTXNnfWApO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGVycm9yTXNnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSAyMDIpIHtcbiAgICAgICAgICAvLyBTdGlsbCBwZW5kaW5nL3J1bm5pbmcsIGNvbnRpbnVlIHBvbGxpbmdcbiAgICAgICAgICBjb25zb2xlLmRlYnVnKGBBY3Rpdml0eSAke2FjdGl2aXR5TmFtZX0gc3RpbGwgcnVubmluZywgcG9sbGluZyBhZ2FpbiBpbiAke3BvbGxJbnRlcnZhbH1tc2ApO1xuICAgICAgICB9IGVsc2UgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICAgICAgLy8gQWN0aXZpdHkgbm90IGZvdW5kIHlldFxuICAgICAgICAgIGNvbnNvbGUuZGVidWcoYEFjdGl2aXR5ICR7YWN0aXZpdHlOYW1lfSBub3QgZm91bmQgeWV0LCBwb2xsaW5nIGFnYWluIGluICR7cG9sbEludGVydmFsfW1zYCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKGBVbmV4cGVjdGVkIHJlc3BvbnNlICR7cmVzcG9uc2Uuc3RhdHVzfSB3aGVuIHBvbGxpbmcgYWN0aXZpdHkgcmVzdWx0YCk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmICgoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2UuaW5jbHVkZXMoJ3RpbWVkIG91dCcpIHx8IChlcnJvciBhcyBFcnJvcikubWVzc2FnZS5pbmNsdWRlcygnZmFpbGVkJykpIHtcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLndhcm4oJ0Vycm9yIHBvbGxpbmcgYWN0aXZpdHkgcmVzdWx0OicsIGVycm9yKTtcbiAgICAgIH1cblxuICAgICAgLy8gV2FpdCB3aXRoIGV4cG9uZW50aWFsIGJhY2tvZmZcbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIHBvbGxJbnRlcnZhbCkpO1xuICAgICAgcG9sbEludGVydmFsID0gTWF0aC5taW4ocG9sbEludGVydmFsICogYmFja29mZk11bHRpcGxpZXIsIG1heFBvbGxJbnRlcnZhbCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjbGVhbnVwKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIFN0b3AgaGVhcnRiZWF0XG4gICAgaWYgKHRoaXMuaGVhcnRiZWF0SW50ZXJ2YWwpIHtcbiAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5oZWFydGJlYXRJbnRlcnZhbCk7XG4gICAgfVxuXG4gICAgLy8gRGlzY29ubmVjdCBmcm9tIHNlcnZlclxuICAgIGF3YWl0IHRoaXMuZGlzY29ubmVjdEZyb21TZXJ2ZXIoKTtcblxuICAgIC8vIFN0b3AgS2Fma2EgY2xpZW50c1xuICAgIGlmICh0aGlzLmNvbnN1bWVyKSB7XG4gICAgICBhd2FpdCB0aGlzLmNvbnN1bWVyLmRpc2Nvbm5lY3QoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMucHJvZHVjZXIpIHtcbiAgICAgIGF3YWl0IHRoaXMucHJvZHVjZXIuZGlzY29ubmVjdCgpO1xuICAgIH1cblxuICAgIGNvbnNvbGUubG9nKGBXb3JrZXIgJHt0aGlzLndvcmtlcklkfSBzdG9wcGVkYCk7XG4gIH1cbn1cbiJdfQ==
613
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29ya2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3dvcmtlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEseUVBQXlFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFekUscUNBQTJFO0FBQzNFLDJFQUFzRjtBQUN0Rix1Q0FBeUI7QUFlekIseUNBQW1IO0FBQ25ILHlDQUE2QztBQUU3Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBd0JHO0FBQ0gsTUFBYSxNQUFNO0lBQ1QsTUFBTSxDQUFlO0lBQ3JCLFNBQVMsR0FBK0IsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUNsRCxVQUFVLEdBQWlDLElBQUksR0FBRyxFQUFFLENBQUM7SUFFckQsUUFBUSxHQUFrQixJQUFJLENBQUM7SUFDL0IsVUFBVSxHQUFrQixJQUFJLENBQUM7SUFDakMsT0FBTyxHQUFHLEtBQUssQ0FBQztJQUNoQixLQUFLLEdBQWlCLElBQUksQ0FBQztJQUMzQixRQUFRLEdBQW9CLElBQUksQ0FBQztJQUNqQyxRQUFRLEdBQW9CLElBQUksQ0FBQztJQUNqQyxpQkFBaUIsR0FBMEIsSUFBSSxDQUFDO0lBQ2hELG1CQUFtQixHQUFHLEtBQUssQ0FBQztJQUM1QixXQUFXLEdBQWtCLElBQUksQ0FBQztJQUNsQyxzQkFBc0IsQ0FBUztJQUV2QyxZQUFZLE1BQW9CO1FBQzlCLElBQUksQ0FBQyxNQUFNLEdBQUc7WUFDWixHQUFHLE1BQU07WUFDVCxTQUFTLEVBQUUsTUFBTSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQztTQUMvQyxDQUFDO1FBQ0YsSUFBSSxDQUFDLHNCQUFzQixHQUFHLE1BQU0sQ0FBQyxzQkFBc0IsSUFBSSxFQUFFLENBQUM7SUFDcEUsQ0FBQztJQUVEOztPQUVHO0lBQ0gsUUFBUSxDQUFDLE9BR1I7UUFDQyxLQUFLLE1BQU0sS0FBSyxJQUFJLE9BQU8sQ0FBQyxTQUFTLElBQUksRUFB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Q2pCLElBQUksSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDM0IsYUFBYSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQ3hDLENBQUM7UUFFRCx5QkFBeUI7UUFDekIsTUFBTSxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztRQUVsQyxxQkFBcUI7UUFDckIsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDbEIsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ25DLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNsQixNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDbkMsQ0FBQztRQUVELE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxJQUFJLENBQUMsUUFBUSxVQUFVLENBQUMsQ0FBQztJQUNqRCxDQUFDO0NBQ0Y7QUExc0JELHdCQTBzQkMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBXb3JrZXIgLSBOb2RlLmpzIGltcGxlbWVudGF0aW9uIGZvciBleGVjdXRpbmcgd29ya2Zsb3dzIGFuZCBhY3Rpdml0aWVzXG5cbmltcG9ydCB7IEthZmthLCBDb25zdW1lciwgUHJvZHVjZXIsIFNBU0xPcHRpb25zLCBsb2dMZXZlbCB9IGZyb20gJ2thZmthanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVBdXRoVG9rZW5Gcm9tQ3JlZGVudGlhbHNQcm92aWRlciB9IGZyb20gJ2F3cy1tc2staWFtLXNhc2wtc2lnbmVyLWpzJztcbmltcG9ydCAqIGFzIG9zIGZyb20gJ29zJztcbmltcG9ydCB0eXBlIHtcbiAgV29ya2VyQ29uZmlnLFxuICBBY3Rpdml0eUhhbmRsZXIsXG4gIERlY29yYXRlZEFjdGl2aXR5LFxuICBXb3JrZmxvd0NsYXNzLFxuICBXb3JrZmxvd1Rhc2ssXG4gIEFjdGl2aXR5VGFzayxcbiAgV29ya2Zsb3dSZXN1bHQsXG4gIEFjdGl2aXR5UmVzdWx0LFxuICBXb3JrZmxvd0Vycm9yLFxuICBBY3Rpdml0eUVycm9yLFxuICBLYWZrYUNvbmZpZyxcbiAgQ29ubmVjdFJlc3BvbnNlLFxufSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IFdvcmtmbG93Q29udGV4dCwgcnVuV2l0aENvbnRleHQsIGdldFdvcmtmbG93TmFtZSwgZmluZFJ1bk1ldGhvZCwgdHlwZSBXb3JrZXJJbnRlcmZhY2UgfSBmcm9tICcuL3dvcmtmbG93JztcbmltcG9ydCB7IGdldEFjdGl2aXR5TmFtZSB9IGZyb20gJy4vYWN0aXZpdHknO1xuXG4vKipcbiAqIFdvcmtlciB0aGF0IGV4ZWN1dGVzIHdvcmtmbG93cyBhbmQgYWN0aXZpdGllcy5cbiAqIFxuICogVXNhZ2U6XG4gKiAgIGltcG9ydCB7IFdvcmtlciwgd29ya2Zsb3csIGFjdGl2aXR5IH0gZnJvbSAnQGluc3BlY3RpY2Evd29ya2Zsb3ctc2RrJztcbiAqICAgXG4gKiAgIGNvbnN0IHNheUhlbGxvID0gYWN0aXZpdHkuZGVmbihhc3luYyAoaW5wdXQ6IHsgbmFtZTogc3RyaW5nIH0pID0+IHtcbiAqICAgICByZXR1cm4geyBtZXNzYWdlOiBgSGVsbG8sICR7aW5wdXQubmFtZX0hYCB9O1xuICogICB9KTtcbiAqICAgXG4gKiAgIEB3b3JrZmxvdy5kZWZuXG4gKiAgIGNsYXNzIEhlbGxvV29ybGRXb3JrZmxvdyB7XG4gKiAgICAgQHdvcmtmbG93LnJ1blxuICogICAgIGFzeW5jIHJ1bihpbnB1dDogeyBuYW1lOiBzdHJpbmcgfSkge1xuICogICAgICAgcmV0dXJuIGF3YWl0IHdvcmtmbG93LmV4ZWN1dGVBY3Rpdml0eShzYXlIZWxsbywgaW5wdXQpO1xuICogICAgIH1cbiAqICAgfVxuICogICBcbiAqICAgY29uc3Qgd29ya2VyID0gbmV3IFdvcmtlcih7XG4gKiAgICAgc2VydmVyVXJsOiAnaHR0cHM6Ly93b3JrZmxvdy5leGFtcGxlLmNvbScsXG4gKiAgICAgYXBpS2V5OiAnd2tfYWJjMTIzLi4uJyxcbiAqICAgfSk7XG4gKiAgIHdvcmtlci5yZWdpc3Rlcih7IHdvcmtmbG93czogW0hlbGxvV29ybGRXb3JrZmxvd10sIGFjdGl2aXRpZXM6IFtzYXlIZWxsb10gfSk7XG4gKiAgIGF3YWl0IHdvcmtlci5ydW4oKTtcbiAqL1xuZXhwb3J0IGNsYXNzIFdvcmtlciBpbXBsZW1lbnRzIFdvcmtlckludGVyZmFjZSB7XG4gIHByaXZhdGUgY29uZmlnOiBXb3JrZXJDb25maWc7XG4gIHByaXZhdGUgd29ya2Zsb3dzOiBNYXA8c3RyaW5nLCBXb3JrZmxvd0NsYXNzPiA9IG5ldyBNYXAoKTtcbiAgcHJpdmF0ZSBhY3Rpdml0aWVzOiBNYXA8c3RyaW5nLCBBY3Rpdml0eUhhbmRsZXI+ID0gbmV3IE1hcCgpO1xuICBcbiAgcHJpdmF0ZSB3b3JrZXJJZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgaW5zdGFuY2VJZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcnVubmluZyA9IGZhbHNlO1xuICBwcml2YXRlIGthZmthOiBLYWZrYSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGNvbnN1bWVyOiBDb25zdW1lciB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHByb2R1Y2VyOiBQcm9kdWNlciB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGhlYXJ0YmVhdEludGVydmFsOiBOb2RlSlMuVGltZW91dCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGhlYXJ0YmVhdEludGVydmFsTXMgPSAzMDAwMDtcbiAgcHJpdmF0ZSByZXN1bHRUb3BpYzogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgbWF4Q29uY3VycmVudFdvcmtmbG93czogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogV29ya2VyQ29uZmlnKSB7XG4gICAgdGhpcy5jb25maWcgPSB7XG4gICAgICAuLi5jb25maWcsXG4gICAgICBzZXJ2ZXJVcmw6IGNvbmZpZy5zZXJ2ZXJVcmwucmVwbGFjZSgvXFwvJC8sICcnKSxcbiAgICB9O1xuICAgIHRoaXMubWF4Q29uY3VycmVudFdvcmtmbG93cyA9IGNvbmZpZy5tYXhDb25jdXJyZW50V29ya2Zsb3dzIHx8IDEwO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVyIHdvcmtmbG93cyBhbmQgYWN0aXZpdGllcy5cbiAgICovXG4gIHJlZ2lzdGVyKG9wdGlvbnM6IHtcbiAgICB3b3JrZmxvd3M/OiBXb3JrZmxvd0NsYXNzW107XG4gICAgYWN0aXZpdGllcz86IERlY29yYXRlZEFjdGl2aXR5W107XG4gIH0pOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IHdmQ2xzIG9mIG9wdGlvbnMud29ya2Zsb3dzIHx8IFtdKSB7XG4gICAgICBjb25zdCB3Zk5hbWUgPSBnZXRXb3JrZmxvd05hbWUod2ZDbHMpO1xuICAgICAgdGhpcy53b3JrZmxvd3Muc2V0KHdmTmFtZSwgd2ZDbHMpO1xuICAgICAgY29uc29sZS5sb2coYFJlZ2lzdGVyZWQgd29ya2Zsb3c6ICR7d2ZOYW1lfWApO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgYWN0aXZpdHlGbiBvZiBvcHRpb25zLmFjdGl2aXRpZXMgfHwgW10pIHtcbiAgICAgIGNvbnN0IGFjdGl2aXR5TmFtZSA9IGdldEFjdGl2aXR5TmFtZShhY3Rpdml0eUZuKTtcbiAgICAgIHRoaXMuYWN0aXZpdGllcy5zZXQoYWN0aXZpdHlOYW1lLCBhY3Rpdml0eUZuKTtcbiAgICAgIGNvbnNvbGUubG9nKGBSZWdpc3RlcmVkIGFjdGl2aXR5OiAke2FjdGl2aXR5TmFtZX1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU3RhcnQgdGhlIHdvcmtlciAoYmxvY2tpbmcpLlxuICAgKi9cbiAgYXN5bmMgcnVuKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMucnVubmluZyA9IHRydWU7XG5cbiAgICAvLyBTZXR1cCBzaWduYWwgaGFuZGxlcnNcbiAgICBwcm9jZXNzLm9uKCdTSUdJTlQnLCAoKSA9PiB0aGlzLnN0b3AoKSk7XG4gICAgcHJvY2Vzcy5vbignU0lHVEVSTScsICgpID0+IHRoaXMuc3RvcCgpKTtcblxuICAgIC8vIENvbm5lY3QgdG8gc2VydmVyIGFuZCBnZXQgS2Fma2EgY29uZmlnXG4gICAgY29uc3Qgc2VydmVyS2Fma2FDb25maWcgPSBhd2FpdCB0aGlzLmNvbm5lY3RUb1NlcnZlcigpO1xuICAgIGNvbnN0IHdvcmtlclRvcGljID0gc2VydmVyS2Fma2FDb25maWcud29ya2VyX3RvcGljO1xuICAgIGNvbnN0IHJlc3VsdFRvcGljID0gc2VydmVyS2Fma2FDb25maWcucmVzdWx0X3RvcGljO1xuICAgIHRoaXMucmVzdWx0VG9waWMgPSByZXN1bHRUb3BpYztcblxuICAgIC8vIENyZWF0ZSBLYWZrYSBjbGllbnRcbiAgICB0aGlzLmthZmthID0gdGhpcy5jcmVhdGVLYWZrYUNsaWVudChzZXJ2ZXJLYWZrYUNvbmZpZyk7XG4gICAgXG4gICAgLy8gQ3JlYXRlIGNvbnN1bWVyXG4gICAgY29uc3QgY29uc3VtZXJHcm91cElkID0gdGhpcy5jb25maWcuZ3JvdXBJZCB8fCBgd29ya2Zsb3ctd29ya2VyLSR7dGhpcy53b3JrZXJJZH1gO1xuICAgIHRoaXMuY29uc3VtZXIgPSB0aGlzLmthZmthLmNvbnN1bWVyKHsgZ3JvdXBJZDogY29uc3VtZXJHcm91cElkIH0pO1xuICAgIFxuICAgIC8vIENyZWF0ZSBwcm9kdWNlclxuICAgIHRoaXMucHJvZHVjZXIgPSB0aGlzLmthZmthLnByb2R1Y2VyKCk7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5jb25zdW1lci5jb25uZWN0KCk7XG4gICAgICBhd2FpdCB0aGlzLnByb2R1Y2VyLmNvbm5lY3QoKTtcbiAgICAgIGF3YWl0IHRoaXMuY29uc3VtZXIuc3Vic2NyaWJlKHsgdG9waWM6IHdvcmtlclRvcGljLCBmcm9tQmVnaW5uaW5nOiBmYWxzZSB9KTtcblxuICAgICAgY29uc29sZS5sb2coYFdvcmtlciAke3RoaXMud29ya2VySWR9IHN0YXJ0ZWQsIGNvbnN1bWluZyBmcm9tICR7d29ya2VyVG9waWN9YCk7XG4gICAgICBjb25zb2xlLmxvZyhgTWF4IGNvbmN1cnJlbnQgd29ya2Zsb3dzOiAke3RoaXMubWF4Q29uY3VycmVudFdvcmtmbG93c31gKTtcbiAgICAgIGNvbnNvbGUubG9nKGBSZWdpc3RlcmVkIHdvcmtmbG93czogJHtBcnJheS5mcm9tKHRoaXMud29ya2Zsb3dzLmtleXMoKSkuam9pbignLCAnKX1gKTtcbiAgICAgIGNvbnNvbGUubG9nKGBSZWdpc3RlcmVkIGFjdGl2aXRpZXM6ICR7QXJyYXkuZnJvbSh0aGlzLmFjdGl2aXRpZXMua2V5cygpKS5qb2luKCcsICcpfWApO1xuXG4gICAgICAvLyBTdGFydCBoZWFydGJlYXRcbiAgICAgIHRoaXMuc3RhcnRIZWFydGJlYXQoKTtcblxuICAgICAgLy8gU3RhcnQgY29uc3VtaW5nIG1lc3NhZ2VzIHdpdGggd29ya2VyLWxldmVsIGNvbmN1cnJlbmN5IGNvbnRyb2xcbiAgICAgIC8vIHBhcnRpdGlvbnNDb25zdW1lZENvbmN1cnJlbnRseSBsaW1pdHMgaG93IG1hbnkgbWVzc2FnZXMgY2FuIGJlIHByb2Nlc3NlZCBhdCBvbmNlXG4gICAgICAvLyBDb21taXQgaW1tZWRpYXRlbHkgYWZ0ZXIgZmV0Y2ggLSB3b3JrZmxvd3MgY2FuIHJ1biBmb3IgaG91cnMsIHNvIHdlIGNhbid0IHdhaXRcbiAgICAgIC8vIElmIHdvcmtlciBjcmFzaGVzIG1pZC13b3JrZmxvdywgdXNlIHNlcnZlcidzIC9yZXN1bWUgQVBJIHRvIHJlY292ZXJcbiAgICAgIGF3YWl0IHRoaXMuY29uc3VtZXIucnVuKHtcbiAgICAgICAgYXV0b0NvbW1pdDogZmFsc2UsXG4gICAgICAgIHBhcnRpdGlvbnNDb25zdW1lZENvbmN1cnJlbnRseTogdGhpcy5tYXhDb25jdXJyZW50V29ya2Zsb3dzLFxuICAgICAgICBlYWNoTWVzc2FnZTogYXN5bmMgKHsgdG9waWMsIHBhcnRpdGlvbiwgbWVzc2FnZSB9KSA9PiB7XG4gICAgICAgICAgaWYgKCF0aGlzLnJ1bm5pbmcpIHJldHVybjtcbiAgICAgICAgICBcbiAgICAgICAgICAvLyBDb21taXQgaW1tZWRpYXRlbHkgYWZ0ZXIgcmVjZWl2aW5nIC0gdGhlIG1lc3NhZ2UgaXMgbm93IFwiaW4gcHJvZ3Jlc3NcIlxuICAgICAgICAgIC8vIFRoaXMgcHJldmVudHMgS2Fma2EgcmViYWxhbmNlIGR1cmluZyBsb25nLXJ1bm5pbmcgd29ya2Zsb3dzIChob3VycylcbiAgICAgICAgICAvLyBQZW5kaW5nIG1lc3NhZ2VzIGluIHF1ZXVlIHN0YXkgc2FmZSwgaW4tcHJvZ3Jlc3Mgd29ya2Zsb3dzIHRyYWNrZWQgaW4gTW9uZ29EQlxuICAgICAgICAgIGF3YWl0IHRoaXMuY29uc3VtZXI/LmNvbW1pdE9mZnNldHMoW3tcbiAgICAgICAgICAgIHRvcGljLFxuICAgICAgICAgICAgcGFydGl0aW9uLFxuICAgICAgICAgICAgb2Zmc2V0OiAoQmlnSW50KG1lc3NhZ2Uub2Zmc2V0KSArIDFuKS50b1N0cmluZygpLFxuICAgICAgICAgIH1dKTtcbiAgICAgICAgICBcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgZGF0YSA9IEpTT04ucGFyc2UobWVzc2FnZS52YWx1ZT8udG9TdHJpbmcoKSB8fCAne30nKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucHJvY2Vzc01lc3NhZ2UoZGF0YSwgcmVzdWx0VG9waWMpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBwcm9jZXNzaW5nIG1lc3NhZ2U6JywgZXJyb3IpO1xuICAgICAgICAgICAgLy8gV29ya2Zsb3cgZmFpbGVkIC0gc3RhdGUgaXMgaW4gTW9uZ29EQiwgY2FuIGJlIHJlc3VtZWQgdmlhIHNlcnZlciBBUElcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgLy8gS2VlcCBydW5uaW5nIHVudGlsIHN0b3BwZWRcbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgICAgIGNvbnN0IGNoZWNrSW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICAgICAgaWYgKCF0aGlzLnJ1bm5pbmcpIHtcbiAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoY2hlY2tJbnRlcnZhbCk7XG4gICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LCAxMDApO1xuICAgICAgfSk7XG5cbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgdGhpcy5jbGVhbnVwKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFN0b3AgdGhlIHdvcmtlciBncmFjZWZ1bGx5LlxuICAgKi9cbiAgYXN5bmMgc3RvcCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zb2xlLmxvZygnU3RvcHBpbmcgd29ya2VyLi4uJyk7XG4gICAgdGhpcy5ydW5uaW5nID0gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNvbm5lY3RUb1NlcnZlcigpOiBQcm9taXNlPEthZmthQ29uZmlnPiB7XG4gICAgY29uc3QgaG9zdG5hbWUgPSBvcy5ob3N0bmFtZSgpO1xuICAgIFxuICAgIGNvbnN0IGNvbm5lY3RQYXlsb2FkID0ge1xuICAgICAgd29ya2Zsb3dzOiBBcnJheS5mcm9tKHRoaXMud29ya2Zsb3dzLmtleXMoKSksXG4gICAgICBhY3Rpdml0aWVzOiBBcnJheS5mcm9tKHRoaXMuYWN0aXZpdGllcy5rZXlzKCkpLFxuICAgICAgaG9zdG5hbWUsXG4gICAgfTtcblxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYCR7dGhpcy5jb25maWcuc2VydmVyVXJsfS93b3JrZmxvdy9hcGkvdjEvd29ya2Vycy9jb25uZWN0YCwge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICdBdXRob3JpemF0aW9uJzogYEJlYXJlciAke3RoaXMuY29uZmlnLmFwaUtleX1gLFxuICAgICAgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGNvbm5lY3RQYXlsb2FkKSxcbiAgICB9KTtcblxuICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgIGNvbnN0IGVycm9yID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gY29ubmVjdCB0byBzZXJ2ZXI6ICR7cmVzcG9uc2Uuc3RhdHVzfSAtICR7ZXJyb3J9YCk7XG4gICAgfVxuXG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKSBhcyBDb25uZWN0UmVzcG9uc2U7XG4gICAgXG4gICAgdGhpcy53b3JrZXJJZCA9IGRhdGEud29ya2VyX2lkO1xuICAgIHRoaXMuaW5zdGFuY2VJZCA9IGRhdGEuaW5zdGFuY2VfaWQ7XG4gICAgdGhpcy5oZWFydGJlYXRJbnRlcnZhbE1zID0gZGF0YS5oZWFydGJlYXRfaW50ZXJ2YWxfbXMgfHwgMzAwMDA7XG5cbiAgICBjb25zb2xlLmxvZyhgQ29ubmVjdGVkIHRvIHNlcnZlciBhcyB3b3JrZXJfaWQ9JHt0aGlzLndvcmtlcklkfSwgaW5zdGFuY2VfaWQ9JHt0aGlzLmluc3RhbmNlSWR9YCk7XG5cbiAgICByZXR1cm4gZGF0YS5rYWZrYTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlS2Fma2FDbGllbnQoa2Fma2FDb25maWc6IEthZmthQ29uZmlnKTogS2Fma2Ege1xuICAgIGNvbnN0IGF1dGggPSBrYWZrYUNvbmZpZy5hdXRoO1xuICAgIFxuICAgIC8vIFNlcnZlciByZXR1cm5zIGJyb2tlcnMgYXMgY29tbWEtc2VwYXJhdGVkIHN0cmluZywgY29udmVydCB0byBhcnJheVxuICAgIGNvbnN0IGJyb2tlcnMgPSB0eXBlb2Yga2Fma2FDb25maWcuYnJva2VycyA9PT0gJ3N0cmluZydcbiAgICAgID8gKGthZmthQ29uZmlnLmJyb2tlcnMgYXMgc3RyaW5nKS5zcGxpdCgnLCcpLm1hcChiID0+IGIudHJpbSgpKS5maWx0ZXIoYiA9PiBiKVxuICAgICAgOiBrYWZrYUNvbmZpZy5icm9rZXJzO1xuICAgIFxuICAgIGNvbnN0IGNvbmZpZzogYW55ID0ge1xuICAgICAgY2xpZW50SWQ6IGB3b3JrZmxvdy13b3JrZXItJHt0aGlzLndvcmtlcklkfWAsXG4gICAgICBicm9rZXJzLFxuICAgICAgbG9nTGV2ZWw6IGxvZ0xldmVsLldBUk4sXG4gICAgfTtcblxuICAgIGlmIChhdXRoPy50eXBlID09PSAnbXNrX2lhbScpIHtcbiAgICAgIGNvbmZpZy5zc2wgPSB0cnVlO1xuICAgICAgY29uZmlnLnNhc2wgPSB7XG4gICAgICAgIG1lY2hhbmlzbTogJ29hdXRoYmVhcmVyJyxcbiAgICAgICAgb2F1dGhCZWFyZXJQcm92aWRlcjogYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHRva2VuID0gYXdhaXQgZ2VuZXJhdGVBdXRoVG9rZW5Gcm9tQ3JlZGVudGlhbHNQcm92aWRlcih7XG4gICAgICAgICAgICByZWdpb246IGF1dGgucmVnaW9uISxcbiAgICAgICAgICAgIGF3c0NyZWRlbnRpYWxzUHJvdmlkZXI6IGFzeW5jICgpID0+ICh7XG4gICAgICAgICAgICAgIGFjY2Vzc0tleUlkOiBhdXRoLmFjY2Vzc19rZXlfaWQhLFxuICAgICAgICAgICAgICBzZWNyZXRBY2Nlc3NLZXk6IGF1dGguc2VjcmV0X2FjY2Vzc19rZXkhLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IHRva2VuLnRva2VuIH07XG4gICAgICAgIH0sXG4gICAgICB9IGFzIFNBU0xPcHRpb25zO1xuICAgIH0gZWxzZSBpZiAoYXV0aD8udHlwZSA9PT0gJ3Nhc2wnKSB7XG4gICAgICBpZiAoYXV0aC5zZWN1cml0eV9wcm90b2NvbD8uaW5jbHVkZXMoJ1NTTCcpKSB7XG4gICAgICAgIGNvbmZpZy5zc2wgPSB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKGF1dGguc2FzbF9tZWNoYW5pc20gJiYgYXV0aC5zYXNsX3VzZXJuYW1lICYmIGF1dGguc2FzbF9wYXNzd29yZCkge1xuICAgICAgICBjb25maWcuc2FzbCA9IHtcbiAgICAgICAgICBtZWNoYW5pc206IGF1dGguc2FzbF9tZWNoYW5pc20udG9Mb3dlckNhc2UoKS5yZXBsYWNlKCctJywgJycpLFxuICAgICAgICAgIHVzZXJuYW1lOiBhdXRoLnNhc2xfdXNlcm5hbWUsXG4gICAgICAgICAgcGFzc3dvcmQ6IGF1dGguc2FzbF9wYXNzd29yZCxcbiAgICAgICAgfSBhcyBTQVNMT3B0aW9ucztcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IEthZmthKGNvbmZpZyk7XG4gIH1cblxuICBwcml2YXRlIHN0YXJ0SGVhcnRiZWF0KCk6IHZvaWQge1xuICAgIHRoaXMuaGVhcnRiZWF0SW50ZXJ2YWwgPSBzZXRJbnRlcnZhbChhc3luYyAoKSA9PiB7XG4gICAgICBpZiAoIXRoaXMucnVubmluZykgcmV0dXJuO1xuICAgICAgXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGAke3RoaXMuY29uZmlnLnNlcnZlclVybH0vd29ya2Zsb3cvYXBpL3YxL3dvcmtlcnMvaGVhcnRiZWF0YCwge1xuICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICAnQXV0aG9yaXphdGlvbic6IGBCZWFyZXIgJHt0aGlzLmNvbmZpZy5hcGlLZXl9YCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgaW5zdGFuY2VfaWQ6IHRoaXMuaW5zdGFuY2VJZCB9KSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICAgIGNvbnNvbGUud2FybihgSGVhcnRiZWF0IGZhaWxlZDogJHtyZXNwb25zZS5zdGF0dXN9YCk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignSGVhcnRiZWF0IGVycm9yOicsIGVycm9yKTtcbiAgICAgIH1cbiAgICB9LCB0aGlzLmhlYXJ0YmVhdEludGVydmFsTXMpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBkaXNjb25uZWN0RnJvbVNlcnZlcigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMuaW5zdGFuY2VJZCkgcmV0dXJuO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYCR7dGhpcy5jb25maWcuc2VydmVyVXJsfS93b3JrZmxvdy9hcGkvdjEvd29ya2Vycy9kaXNjb25uZWN0YCwge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgJ0F1dGhvcml6YXRpb24nOiBgQmVhcmVyICR7dGhpcy5jb25maWcuYXBpS2V5fWAsXG4gICAgICAgIH0sXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgaW5zdGFuY2VfaWQ6IHRoaXMuaW5zdGFuY2VJZCB9KSxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAocmVzcG9uc2Uub2spIHtcbiAgICAgICAgY29uc29sZS5sb2coJ0Rpc2Nvbm5lY3RlZCBmcm9tIHNlcnZlcicpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ0ZhaWxlZCB0byBkaXNjb25uZWN0IGZyb20gc2VydmVyOicsIGVycm9yKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHByb2Nlc3NNZXNzYWdlKGRhdGE6IGFueSwgcmVzdWx0VG9waWM6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIENoZWNrIGlmIHRoaXMgaXMgYW4gYWN0aXZpdHkgcmVzdWx0IChyZXNwb25zZSBmcm9tIGFub3RoZXIgd29ya2VyIHZpYSBzZXJ2ZXIpXG4gICAgaWYgKGRhdGEuc3RhdHVzICYmIGRhdGEuY29tcGxldGVkX2F0ICYmICFkYXRhLnRhc2tfdHlwZSkge1xuICAgICAgY29uc29sZS5kZWJ1ZygnUmVjZWl2ZWQgYWN0aXZpdHkgcmVzdWx0IG9uIHdvcmtlciB0b3BpYyAoaWdub3JlZCAtIHVzaW5nIHBvbGxpbmcpJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdGFza1R5cGUgPSBkYXRhLnRhc2tfdHlwZSB8fCAnYWN0aXZpdHknO1xuXG4gICAgaWYgKHRhc2tUeXBlID09PSAnd29ya2Zsb3cnKSB7XG4gICAgICAvLyBDb25jdXJyZW5jeSBpcyBjb250cm9sbGVkIGJ5IHBhcnRpdGlvbnNDb25zdW1lZENvbmN1cnJlbnRseSBpbiBjb25zdW1lci5ydW4oKVxuICAgICAgYXdhaXQgdGhpcy5leGVjdXRlV29ya2Zsb3coZGF0YSBhcyBXb3JrZmxvd1Rhc2ssIHJlc3VsdFRvcGljKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQWN0aXZpdHkgdGFza3MgY2FuIGJlIHByb2Nlc3NlZCBpbmxpbmVcbiAgICAgIGF3YWl0IHRoaXMucHJvY2Vzc0FjdGl2aXR5VGFzayhkYXRhLCByZXN1bHRUb3BpYyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBleGVjdXRlV29ya2Zsb3codGFzazogV29ya2Zsb3dUYXNrLCByZXN1bHRUb3BpYzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc29sZS5sb2coYFJlY2VpdmVkIHdvcmtmbG93IHRhc2sgJHt0YXNrLnRhc2tfaWR9OiAke3Rhc2sud29ya2Zsb3dfbmFtZX1gKTtcblxuICAgIC8vIEZpbmQgdGhlIHdvcmtmbG93IGNsYXNzXG4gICAgY29uc3Qgd29ya2Zsb3dDbHMgPSB0aGlzLndvcmtmbG93cy5nZXQodGFzay53b3JrZmxvd19uYW1lKTtcbiAgICBpZiAoIXdvcmtmbG93Q2xzKSB7XG4gICAgICBjb25zb2xlLndhcm4oYFVua25vd24gd29ya2Zsb3c6ICR7dGFzay53b3JrZmxvd19uYW1lfWApO1xuICAgICAgYXdhaXQgdGhpcy5zZW5kV29ya2Zsb3dSZXN1bHQodGFzaywgcmVzdWx0VG9waWMsICdmYWlsZWQnLCB1bmRlZmluZWQsIHtcbiAgICAgICAgdHlwZTogJ1Vua25vd25Xb3JrZmxvdycsXG4gICAgICAgIG1lc3NhZ2U6IGBXb3JrZmxvdyAnJHt0YXNrLndvcmtmbG93X25hbWV9JyBub3QgcmVnaXN0ZXJlZGAsXG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBGaW5kIHRoZSBydW4gbWV0aG9kXG4gICAgY29uc3QgcnVuTWV0aG9kID0gZmluZFJ1bk1ldGhvZCh3b3JrZmxvd0Nscyk7XG4gICAgaWYgKCFydW5NZXRob2QpIHtcbiAgICAgIGF3YWl0IHRoaXMuc2VuZFdvcmtmbG93UmVzdWx0KHRhc2ssIHJlc3VsdFRvcGljLCAnZmFpbGVkJywgdW5kZWZpbmVkLCB7XG4gICAgICAgIHR5cGU6ICdOb1J1bk1ldGhvZCcsXG4gICAgICAgIG1lc3NhZ2U6IGBXb3JrZmxvdyAnJHt0YXNrLndvcmtmbG93X25hbWV9JyBoYXMgbm8gcnVuIG1ldGhvZGAsXG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBFeGVjdXRlIHRoZSB3b3JrZmxvd1xuICAgIGNvbnN0IHN0YXJ0ZWRBdCA9IG5ldyBEYXRlKCk7XG4gICAgdHJ5IHtcbiAgICAgIC8vIEJ1aWxkIGNvbXBsZXRlZCBhY3Rpdml0aWVzIG1hcCBmb3IgcmVwbGF5XG4gICAgICBjb25zdCBjb21wbGV0ZWRBY3Rpdml0aWVzTWFwID0gbmV3IE1hcDxudW1iZXIsIHVua25vd24+KCk7XG4gICAgICBpZiAodGFzay5jb21wbGV0ZWRfYWN0aXZpdGllcykge1xuICAgICAgICBmb3IgKGNvbnN0IGNhIG9mIHRhc2suY29tcGxldGVkX2FjdGl2aXRpZXMpIHtcbiAgICAgICAgICBjb21wbGV0ZWRBY3Rpdml0aWVzTWFwLnNldChjYS5pbmRleCwgY2Eub3V0cHV0KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICBgUmVzdW1pbmcgd29ya2Zsb3cgJHt0YXNrLndvcmtmbG93X2lkfSB3aXRoICR7Y29tcGxldGVkQWN0aXZpdGllc01hcC5zaXplfSBjb21wbGV0ZWQgYWN0aXZpdGllc2BcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ3JlYXRlIHdvcmtmbG93IGNvbnRleHRcbiAgICAgIGNvbnN0IGN0eCA9IG5ldyBXb3JrZmxvd0NvbnRleHQoXG4gICAgICAgIHRoaXMuYWN0aXZpdGllcyxcbiAgICAgICAgdGFzay53b3JrZmxvd19pZCxcbiAgICAgICAgdGhpcyxcbiAgICAgICAgY29tcGxldGVkQWN0aXZpdGllc01hcC5zaXplID4gMCA/IGNvbXBsZXRlZEFjdGl2aXRpZXNNYXAgOiBudWxsLFxuICAgICAgICB0YXNrLm1ldGFkYXRhXG4gICAgICApO1xuXG4gICAgICAvLyBFeGVjdXRlIHdpdGhpbiBjb250ZXh0XG4gICAgICBjb25zdCBvdXRwdXQgPSBhd2FpdCBydW5XaXRoQ29udGV4dChjdHgsIGFzeW5jICgpID0+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IFByb21pc2UucmFjZShbXG4gICAgICAgICAgcnVuTWV0aG9kKHRhc2suaW5wdXQpLFxuICAgICAgICAgIG5ldyBQcm9taXNlPG5ldmVyPigoXywgcmVqZWN0KSA9PlxuICAgICAgICAgICAgc2V0VGltZW91dChcbiAgICAgICAgICAgICAgKCkgPT4gcmVqZWN0KG5ldyBFcnJvcihgV29ya2Zsb3cgdGltZWQgb3V0IGFmdGVyICR7dGFzay50aW1lb3V0X21zfW1zYCkpLFxuICAgICAgICAgICAgICB0YXNrLnRpbWVvdXRfbXNcbiAgICAgICAgICAgIClcbiAgICAgICAgICApLFxuICAgICAgICBdKTtcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBjb21wbGV0ZWRBdCA9IG5ldyBEYXRlKCk7XG4gICAgICBjb25zdCBkdXJhdGlvbk1zID0gY29tcGxldGVkQXQuZ2V0VGltZSgpIC0gc3RhcnRlZEF0LmdldFRpbWUoKTtcblxuICAgICAgY29uc29sZS5sb2coYFdvcmtmbG93ICR7dGFzay50YXNrX2lkfSBjb21wbGV0ZWQgaW4gJHtkdXJhdGlvbk1zfW1zYCk7XG5cbiAgICAgIGF3YWl0IHRoaXMuc2VuZFdvcmtmbG93UmVzdWx0KFxuICAgICAgICB0YXNrLFxuICAgICAgICByZXN1bHRUb3BpYyxcbiAgICAgICAgJ2NvbXBsZXRlZCcsXG4gICAgICAgIG91dHB1dCxcbiAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICBzdGFydGVkQXQsXG4gICAgICAgIGNvbXBsZXRlZEF0LFxuICAgICAgICBkdXJhdGlvbk1zXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCBjb21wbGV0ZWRBdCA9IG5ldyBEYXRlKCk7XG4gICAgICBjb25zdCBkdXJhdGlvbk1zID0gY29tcGxldGVkQXQuZ2V0VGltZSgpIC0gc3RhcnRlZEF0LmdldFRpbWUoKTtcbiAgICAgIGNvbnN0IGVyciA9IGVycm9yIGFzIEVycm9yO1xuXG4gICAgICBjb25zb2xlLmVycm9yKGBXb3JrZmxvdyAke3Rhc2sudGFza19pZH0gZmFpbGVkOmAsIGVyci5tZXNzYWdlKTtcblxuICAgICAgYXdhaXQgdGhpcy5zZW5kV29ya2Zsb3dSZXN1bHQoXG4gICAgICAgIHRhc2ssXG4gICAgICAgIHJlc3VsdFRvcGljLFxuICAgICAgICAnZmFpbGVkJyxcbiAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogZXJyLm5hbWUgfHwgJ0Vycm9yJyxcbiAgICAgICAgICBtZXNzYWdlOiBlcnIubWVzc2FnZSxcbiAgICAgICAgICBzdGFja190cmFjZTogZXJyLnN0YWNrLFxuICAgICAgICB9LFxuICAgICAgICBzdGFydGVkQXQsXG4gICAgICAgIGNvbXBsZXRlZEF0LFxuICAgICAgICBkdXJhdGlvbk1zXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcHJvY2Vzc0FjdGl2aXR5VGFzayhkYXRhOiBBY3Rpdml0eVRhc2ssIHJlc3VsdFRvcGljOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB0YXNrID0gZGF0YTtcbiAgICBjb25zb2xlLmxvZyhcbiAgICAgIGBSZWNlaXZlZCBhY3Rpdml0eSB0YXNrICR7dGFzay50YXNrX2lkfTogJHt0YXNrLmFjdGl2aXR5X25hbWV9ICh3b3JrZmxvdz0ke3Rhc2sud29ya2Zsb3dfaWR9KWBcbiAgICApO1xuXG4gICAgLy8gRmluZCB0aGUgYWN0aXZpdHkgaGFuZGxlclxuICAgIGNvbnN0IGFjdGl2aXR5Rm4gPSB0aGlzLmFjdGl2aXRpZXMuZ2V0KHRhc2suYWN0aXZpdHlfbmFtZSk7XG4gICAgaWYgKCFhY3Rpdml0eUZuKSB7XG4gICAgICBjb25zb2xlLndhcm4oYFVua25vd24gYWN0aXZpdHk6ICR7dGFzay5hY3Rpdml0eV9uYW1lfWApO1xuICAgICAgYXdhaXQgdGhpcy5zZW5kQWN0aXZpdHlSZXN1bHQodGFzaywgcmVzdWx0VG9waWMsICdmYWlsZWQnLCB1bmRlZmluZWQsIHtcbiAgICAgICAgdHlwZTogJ1Vua25vd25BY3Rpdml0eScsXG4gICAgICAgIG1lc3NhZ2U6IGBBY3Rpdml0eSAnJHt0YXNrLmFjdGl2aXR5X25hbWV9JyBub3QgcmVnaXN0ZXJlZGAsXG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBFeGVjdXRlIHRoZSBhY3Rpdml0eVxuICAgIGNvbnN0IHN0YXJ0ZWRBdCA9IG5ldyBEYXRlKCk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG91dHB1dCA9IGF3YWl0IFByb21pc2UucmFjZShbXG4gICAgICAgIFByb21pc2UucmVzb2x2ZShhY3Rpdml0eUZuKHRhc2suaW5wdXQpKSxcbiAgICAgICAgbmV3IFByb21pc2U8bmV2ZXI+KChfLCByZWplY3QpID0+XG4gICAgICAgICAgc2V0VGltZW91dChcbiAgICAgICAgICAgICgpID0+IHJlamVjdChuZXcgRXJyb3IoYEFjdGl2aXR5IHRpbWVkIG91dCBhZnRlciAke3Rhc2sudGltZW91dF9tc31tc2ApKSxcbiAgICAgICAgICAgIHRhc2sudGltZW91dF9tc1xuICAgICAgICAgIClcbiAgICAgICAgKSxcbiAgICAgIF0pO1xuXG4gICAgICBjb25zdCBjb21wbGV0ZWRBdCA9IG5ldyBEYXRlKCk7XG4gICAgICBjb25zdCBkdXJhdGlvbk1zID0gY29tcGxldGVkQXQuZ2V0VGltZSgpIC0gc3RhcnRlZEF0LmdldFRpbWUoKTtcblxuICAgICAgY29uc29sZS5sb2coYEFjdGl2aXR5ICR7dGFzay50YXNrX2lkfSBjb21wbGV0ZWQgaW4gJHtkdXJhdGlvbk1zfW1zYCk7XG5cbiAgICAgIGF3YWl0IHRoaXMuc2VuZEFjdGl2aXR5UmVzdWx0KFxuICAgICAgICB0YXNrLFxuICAgICAgICByZXN1bHRUb3BpYyxcbiAgICAgICAgJ2NvbXBsZXRlZCcsXG4gICAgICAgIG91dHB1dCxcbiAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICBzdGFydGVkQXQsXG4gICAgICAgIGNvbXBsZXRlZEF0LFxuICAgICAgICBkdXJhdGlvbk1zXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCBjb21wbGV0ZWRBdCA9IG5ldyBEYXRlKCk7XG4gICAgICBjb25zdCBkdXJhdGlvbk1zID0gY29tcGxldGVkQXQuZ2V0VGltZSgpIC0gc3RhcnRlZEF0LmdldFRpbWUoKTtcbiAgICAgIGNvbnN0IGVyciA9IGVycm9yIGFzIEVycm9yO1xuXG4gICAgICBjb25zb2xlLmVycm9yKGBBY3Rpdml0eSAke3Rhc2sudGFza19pZH0gZmFpbGVkOmAsIGVyci5tZXNzYWdlKTtcblxuICAgICAgYXdhaXQgdGhpcy5zZW5kQWN0aXZpdHlSZXN1bHQoXG4gICAgICAgIHRhc2ssXG4gICAgICAgIHJlc3VsdFRvcGljLFxuICAgICAgICAnZmFpbGVkJyxcbiAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogZXJyLm5hbWUgfHwgJ0Vycm9yJyxcbiAgICAgICAgICBtZXNzYWdlOiBlcnIubWVzc2FnZSxcbiAgICAgICAgICBzdGFja190cmFjZTogZXJyLnN0YWNrLFxuICAgICAgICB9LFxuICAgICAgICBzdGFydGVkQXQsXG4gICAgICAgIGNvbXBsZXRlZEF0LFxuICAgICAgICBkdXJhdGlvbk1zXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgc2VuZFdvcmtmbG93UmVzdWx0KFxuICAgIHRhc2s6IFdvcmtmbG93VGFzayxcbiAgICByZXN1bHRUb3BpYzogc3RyaW5nLFxuICAgIHN0YXR1czogJ2NvbXBsZXRlZCcgfCAnZmFpbGVkJyxcbiAgICBvdXRwdXQ/OiB1bmtub3duLFxuICAgIGVycm9yPzogV29ya2Zsb3dFcnJvcixcbiAgICBzdGFydGVkQXQ/OiBEYXRlLFxuICAgIGNvbXBsZXRlZEF0PzogRGF0ZSxcbiAgICBkdXJhdGlvbk1zID0gMFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xuICAgIGNvbnN0IHJlc3VsdDogV29ya2Zsb3dSZXN1bHQgPSB7XG4gICAgICB0YXNrX2lkOiB0YXNrLnRhc2tfaWQsXG4gICAgICB3b3JrZmxvd19pZDogdGFzay53b3JrZmxvd19pZCxcbiAgICAgIHdvcmtmbG93X25hbWU6IHRhc2sud29ya2Zsb3dfbmFtZSxcbiAgICAgIHN0YXR1cyxcbiAgICAgIG91dHB1dCxcbiAgICAgIGVycm9yLFxuICAgICAgc3RhcnRlZF9hdDogKHN0YXJ0ZWRBdCB8fCBub3cpLnRvSVNPU3RyaW5nKCksXG4gICAgICBjb21wbGV0ZWRfYXQ6IChjb21wbGV0ZWRBdCB8fCBub3cpLnRvSVNPU3RyaW5nKCksXG4gICAgICBkdXJhdGlvbl9tczogZHVyYXRpb25NcyxcbiAgICAgIHdvcmtlcl9pZDogdGhpcy53b3JrZXJJZCEsXG4gICAgfTtcblxuICAgIGlmICh0aGlzLnByb2R1Y2VyKSB7XG4gICAgICBhd2FpdCB0aGlzLnByb2R1Y2VyLnNlbmQoe1xuICAgICAgICB0b3BpYzogcmVzdWx0VG9waWMsXG4gICAgICAgIG1lc3NhZ2VzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAga2V5OiB0YXNrLndvcmtmbG93X2lkLFxuICAgICAgICAgICAgdmFsdWU6IEpTT04uc3RyaW5naWZ5KHJlc3VsdCksXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0pO1xuICAgICAgY29uc29sZS5kZWJ1ZyhgU2VudCB3b3JrZmxvdyByZXN1bHQgZm9yIHRhc2sgJHt0YXNrLnRhc2tfaWR9YCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzZW5kQWN0aXZpdHlSZXN1bHQoXG4gICAgdGFzazogQWN0aXZpdHlUYXNrLFxuICAgIHJlc3VsdFRvcGljOiBzdHJpbmcsXG4gICAgc3RhdHVzOiAnY29tcGxldGVkJyB8ICdmYWlsZWQnLFxuICAgIG91dHB1dD86IHVua25vd24sXG4gICAgZXJyb3I/OiBBY3Rpdml0eUVycm9yLFxuICAgIHN0YXJ0ZWRBdD86IERhdGUsXG4gICAgY29tcGxldGVkQXQ/OiBEYXRlLFxuICAgIGR1cmF0aW9uTXMgPSAwXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCk7XG4gICAgY29uc3QgcmVzdWx0OiBBY3Rpdml0eVJlc3VsdCA9IHtcbiAgICAgIHRhc2tfaWQ6IHRhc2sudGFza19pZCxcbiAgICAgIHdvcmtmbG93X2lkOiB0YXNrLndvcmtmbG93X2lkLFxuICAgICAgYWN0aXZpdHlfbmFtZTogdGFzay5hY3Rpdml0eV9uYW1lLFxuICAgICAgYWN0aXZpdHlfaW5kZXg6IHRhc2suYWN0aXZpdHlfaW5kZXgsXG4gICAgICBmYW5fb3V0X2luZGV4OiB0YXNrLmZhbl9vdXRfaW5kZXgsXG4gICAgICBzdGF0dXMsXG4gICAgICBvdXRwdXQsXG4gICAgICBlcnJvcixcbiAgICAgIHN0YXJ0ZWRfYXQ6IChzdGFydGVkQXQgfHwgbm93KS50b0lTT1N0cmluZygpLFxuICAgICAgY29tcGxldGVkX2F0OiAoY29tcGxldGVkQXQgfHwgbm93KS50b0lTT1N0cmluZygpLFxuICAgICAgZHVyYXRpb25fbXM6IGR1cmF0aW9uTXMsXG4gICAgICB3b3JrZXJfaWQ6IHRoaXMud29ya2VySWQhLFxuICAgICAgcmVxdWVzdGVyX3dvcmtlcl9pZDogdGFzay5yZXF1ZXN0ZXJfd29ya2VyX2lkLFxuICAgICAgY29ycmVsYXRpb25faWQ6IHRhc2suY29ycmVsYXRpb25faWQsXG4gICAgfTtcblxuICAgIGlmICh0aGlzLnByb2R1Y2VyKSB7XG4gICAgICBhd2FpdCB0aGlzLnByb2R1Y2VyLnNlbmQoe1xuICAgICAgICB0b3BpYzogcmVzdWx0VG9waWMsXG4gICAgICAgIG1lc3NhZ2VzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAga2V5OiB0YXNrLndvcmtmbG93X2lkLFxuICAgICAgICAgICAgdmFsdWU6IEpTT04uc3RyaW5naWZ5KHJlc3VsdCksXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0pO1xuICAgICAgY29uc29sZS5kZWJ1ZyhgU2VudCBhY3Rpdml0eSByZXN1bHQgZm9yIHRhc2sgJHt0YXNrLnRhc2tfaWR9YCk7XG4gICAgfVxuICB9XG5cbiAgLy8gV29ya2VySW50ZXJmYWNlIGltcGxlbWVudGF0aW9uIGZvciBXb3JrZmxvd0NvbnRleHRcblxuICBhc3luYyByZXBvcnRMb2NhbEFjdGl2aXR5Q29tcGxldGlvbihcbiAgICB3b3JrZmxvd0lkOiBzdHJpbmcsXG4gICAgYWN0aXZpdHlOYW1lOiBzdHJpbmcsXG4gICAgYWN0aXZpdHlJbmRleDogbnVtYmVyLFxuICAgIG91dHB1dDogdW5rbm93bixcbiAgICBkdXJhdGlvbk1zOiBudW1iZXJcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLnByb2R1Y2VyIHx8ICF0aGlzLnJlc3VsdFRvcGljKSB7XG4gICAgICBjb25zb2xlLmRlYnVnKCdDYW5ub3QgcmVwb3J0IGxvY2FsIGFjdGl2aXR5IC0gcHJvZHVjZXIgbm90IGluaXRpYWxpemVkJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY29tcGxldGVkQXQgPSBuZXcgRGF0ZSgpO1xuICAgIGNvbnN0IHN0YXJ0ZWRBdCA9IG5ldyBEYXRlKGNvbXBsZXRlZEF0LmdldFRpbWUoKSAtIGR1cmF0aW9uTXMpO1xuXG4gICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgdGFza19pZDogYGxvY2FsLSR7d29ya2Zsb3dJZH0tJHthY3Rpdml0eUluZGV4fWAsXG4gICAgICB3b3JrZmxvd19pZDogd29ya2Zsb3dJZCxcbiAgICAgIGFjdGl2aXR5X25hbWU6IGFjdGl2aXR5TmFtZSxcbiAgICAgIGFjdGl2aXR5X2luZGV4OiBhY3Rpdml0eUluZGV4LFxuICAgICAgc3RhdHVzOiAnY29tcGxldGVkJyxcbiAgICAgIG91dHB1dCxcbiAgICAgIHN0YXJ0ZWRfYXQ6IHN0YXJ0ZWRBdC50b0lTT1N0cmluZygpLFxuICAgICAgY29tcGxldGVkX2F0OiBjb21wbGV0ZWRBdC50b0lTT1N0cmluZygpLFxuICAgICAgZHVyYXRpb25fbXM6IGR1cmF0aW9uTXMsXG4gICAgICB3b3JrZXJfaWQ6IHRoaXMud29ya2VySWQsXG4gICAgfTtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLnByb2R1Y2VyLnNlbmQoe1xuICAgICAgICB0b3BpYzogdGhpcy5yZXN1bHRUb3BpYyxcbiAgICAgICAgbWVzc2FnZXM6IFt7IGtleTogd29ya2Zsb3dJZCwgdmFsdWU6IEpTT04uc3RyaW5naWZ5KHJlc3VsdCkgfV0sXG4gICAgICB9KTtcbiAgICAgIGNvbnNvbGUuZGVidWcoXG4gICAgICAgIGBSZXBvcnRlZCBsb2NhbCBhY3Rpdml0eSBjb21wbGV0aW9uOiB3b3JrZmxvd19pZD0ke3dvcmtmbG93SWR9LCBhY3Rpdml0eT0ke2FjdGl2aXR5TmFtZX0sIGluZGV4PSR7YWN0aXZpdHlJbmRleH1gXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ0ZhaWxlZCB0byByZXBvcnQgbG9jYWwgYWN0aXZpdHkgY29tcGxldGlvbjonLCBlcnJvcik7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgcmVwb3J0TG9jYWxBY3Rpdml0eUZhaWx1cmUoXG4gICAgd29ya2Zsb3dJZDogc3RyaW5nLFxuICAgIGFjdGl2aXR5TmFtZTogc3RyaW5nLFxuICAgIGFjdGl2aXR5SW5kZXg6IG51bWJlcixcbiAgICBlcnJvcjogc3RyaW5nLFxuICAgIGVycm9yVHlwZTogc3RyaW5nLFxuICAgIGR1cmF0aW9uTXM6IG51bWJlclxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMucHJvZHVjZXIgfHwgIXRoaXMucmVzdWx0VG9waWMpIHtcbiAgICAgIGNvbnNvbGUuZGVidWcoJ0Nhbm5vdCByZXBvcnQgbG9jYWwgYWN0aXZpdHkgZmFpbHVyZSAtIHByb2R1Y2VyIG5vdCBpbml0aWFsaXplZCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbXBsZXRlZEF0ID0gbmV3IERhdGUoKTtcbiAgICBjb25zdCBzdGFydGVkQXQgPSBuZXcgRGF0ZShjb21wbGV0ZWRBdC5nZXRUaW1lKCkgLSBkdXJhdGlvbk1zKTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgIHRhc2tfaWQ6IGBsb2NhbC0ke3dvcmtmbG93SWR9LSR7YWN0aXZpdHlJbmRleH1gLFxuICAgICAgd29ya2Zsb3dfaWQ6IHdvcmtmbG93SWQsXG4gICAgICBhY3Rpdml0eV9uYW1lOiBhY3Rpdml0eU5hbWUsXG4gICAgICBhY3Rpdml0eV9pbmRleDogYWN0aXZpdHlJbmRleCxcbiAgICAgIHN0YXR1czogJ2ZhaWxlZCcsXG4gICAgICBvdXRwdXQ6IG51bGwsXG4gICAgICBlcnJvcjogeyB0eXBlOiBlcnJvclR5cGUsIG1lc3NhZ2U6IGVycm9yIH0sXG4gICAgICBzdGFydGVkX2F0OiBzdGFydGVkQXQudG9JU09TdHJpbmcoKSxcbiAgICAgIGNvbXBsZXRlZF9hdDogY29tcGxldGVkQXQudG9JU09TdHJpbmcoKSxcbiAgICAgIGR1cmF0aW9uX21zOiBkdXJhdGlvbk1zLFxuICAgICAgd29ya2VyX2lkOiB0aGlzLndvcmtlcklkLFxuICAgIH07XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5wcm9kdWNlci5zZW5kKHtcbiAgICAgICAgdG9waWM6IHRoaXMucmVzdWx0VG9waWMsXG4gICAgICAgIG1lc3NhZ2VzOiBbeyBrZXk6IHdvcmtmbG93SWQsIHZhbHVlOiBKU09OLnN0cmluZ2lmeShyZXN1bHQpIH1dLFxuICAgICAgfSk7XG4gICAgICBjb25zb2xlLmRlYnVnKFxuICAgICAgICBgUmVwb3J0ZWQgbG9jYWwgYWN0aXZpdHkgZmFpbHVyZTogd29ya2Zsb3dfaWQ9JHt3b3JrZmxvd0lkfSwgYWN0aXZpdHk9JHthY3Rpdml0eU5hbWV9LCBpbmRleD0ke2FjdGl2aXR5SW5kZXh9YFxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKCdGYWlsZWQgdG8gcmVwb3J0IGxvY2FsIGFjdGl2aXR5IGZhaWx1cmU6JywgZXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGV4ZWN1dGVSZW1vdGVBY3Rpdml0eShcbiAgICB3b3JrZmxvd0lkOiBzdHJpbmcsXG4gICAgYWN0aXZpdHlOYW1lOiBzdHJpbmcsXG4gICAgYWN0aXZpdHlJbmRleDogbnVtYmVyLFxuICAgIGlucHV0RGF0YTogdW5rbm93bixcbiAgICB0aW1lb3V0TXM6IG51bWJlclxuICApOiBQcm9taXNlPHVua25vd24+IHtcbiAgICBpZiAoIXRoaXMucHJvZHVjZXIgfHwgIXRoaXMucmVzdWx0VG9waWMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignS2Fma2EgcHJvZHVjZXIgbm90IGluaXRpYWxpemVkJyk7XG4gICAgfVxuXG4gICAgLy8gU2VuZCBBY3Rpdml0eVJlcXVlc3QgdG8gc2VydmVyIHZpYSBLYWZrYVxuICAgIGNvbnN0IHJlcXVlc3RQYXlsb2FkID0ge1xuICAgICAgcmVxdWVzdF90eXBlOiAnYWN0aXZpdHlfcmVxdWVzdCcsXG4gICAgICByZXF1ZXN0X2lkOiBjcnlwdG8ucmFuZG9tVVVJRCgpLFxuICAgICAgd29ya2Zsb3dfaWQ6IHdvcmtmbG93SWQsXG4gICAgICBhY3Rpdml0eV9uYW1lOiBhY3Rpdml0eU5hbWUsXG4gICAgICBhY3Rpdml0eV9pbmRleDogYWN0aXZpdHlJbmRleCxcbiAgICAgIGlucHV0OiBpbnB1dERhdGEsXG4gICAgICB0aW1lb3V0X21zOiB0aW1lb3V0TXMsXG4gICAgICByZXF1ZXN0ZXJfd29ya2VyX2lkOiB0aGlzLndvcmtlcklkLFxuICAgICAgY29ycmVsYXRpb25faWQ6IGNyeXB0by5yYW5kb21VVUlEKCksXG4gICAgICBjcmVhdGVkX2F0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgfTtcblxuICAgIGF3YWl0IHRoaXMucHJvZHVjZXIuc2VuZCh7XG4gICAgICB0b3BpYzogdGhpcy5yZXN1bHRUb3BpYyxcbiAgICAgIG1lc3NhZ2VzOiBbeyBrZXk6IHdvcmtmbG93SWQsIHZhbHVlOiBKU09OLnN0cmluZ2lmeShyZXF1ZXN0UGF5bG9hZCkgfV0sXG4gICAgfSk7XG5cbiAgICBjb25zb2xlLmxvZyhcbiAgICAgIGBBY3Rpdml0eSByZXF1ZXN0IHNlbnQgdmlhIEthZmthOiBhY3Rpdml0eT0ke2FjdGl2aXR5TmFtZX0sIHdvcmtmbG93X2lkPSR7d29ya2Zsb3dJZH0sIGFjdGl2aXR5X2luZGV4PSR7YWN0aXZpdHlJbmRleH1gXG4gICAgKTtcblxuICAgIC8vIFBvbGwgc2VydmVyIGZvciByZXN1bHQgd2l0aCBleHBvbmVudGlhbCBiYWNrb2ZmXG4gICAgbGV0IHBvbGxJbnRlcnZhbCA9IDIwMDA7IC8vIFN0YXJ0IGF0IDIgc2Vjb25kc1xuICAgIGNvbnN0IG1heFBvbGxJbnRlcnZhbCA9IDkwMDAwMDsgLy8gTWF4IDE1IG1pbnV0ZXNcbiAgICBjb25zdCBiYWNrb2ZmTXVsdGlwbGllciA9IDEuNTtcbiAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IHRpbWVvdXRTZWNvbmRzID0gdGltZW91dE1zO1xuXG4gICAgY29uc3QgcG9sbFVybCA9IGAke3RoaXMuY29uZmlnLnNlcnZlclVybH0vd29ya2Zsb3cvYXBpL3YxL3dvcmtmbG93cy8ke3dvcmtmbG93SWR9L2FjdGl2aXRpZXMvJHthY3Rpdml0eUluZGV4fS9yZXN1bHRgO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7IEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHt0aGlzLmNvbmZpZy5hcGlLZXl9YCB9O1xuXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGNvbnN0IGVsYXBzZWQgPSBEYXRlLm5vdygpIC0gc3RhcnRUaW1lO1xuICAgICAgaWYgKGVsYXBzZWQgPj0gdGltZW91dFNlY29uZHMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBBY3Rpdml0eSAke2FjdGl2aXR5TmFtZX0gdGltZWQgb3V0IGFmdGVyICR7dGltZW91dE1zfW1zYCk7XG4gICAgICB9XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2gocG9sbFVybCwgeyBoZWFkZXJzIH0pO1xuXG4gICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKSBhcyB7IHN0YXR1czogc3RyaW5nOyBvdXRwdXQ/OiB1bmtub3duOyBlcnJvcj86IHN0cmluZyB9O1xuICAgICAgICAgIGlmIChyZXN1bHQuc3RhdHVzID09PSAnY29tcGxldGVkJykge1xuICAgICAgICAgICAgY29uc29sZS5sb2coYEFjdGl2aXR5ICR7YWN0aXZpdHlOYW1lfSBjb21wbGV0ZWQgZm9yIHdvcmtmbG93ICR7d29ya2Zsb3dJZH1gKTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQub3V0cHV0O1xuICAgICAgICAgIH0gZWxzZSBpZiAocmVzdWx0LnN0YXR1cyA9PT0gJ2ZhaWxlZCcpIHtcbiAgICAgICAgICAgIGNvbnN0IGVycm9yTXNnID0gcmVzdWx0LmVycm9yIHx8ICdBY3Rpdml0eSBmYWlsZWQnO1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgQWN0aXZpdHkgJHthY3Rpdml0eU5hbWV9IGZhaWxlZDogJHtlcnJvck1zZ31gKTtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvck1zZyk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gMjAyKSB7XG4gICAgICAgICAgLy8gU3RpbGwgcGVuZGluZy9ydW5uaW5nLCBjb250aW51ZSBwb2xsaW5nXG4gICAgICAgICAgY29uc29sZS5kZWJ1ZyhgQWN0aXZpdHkgJHthY3Rpdml0eU5hbWV9IHN0aWxsIHJ1bm5pbmcsIHBvbGxpbmcgYWdhaW4gaW4gJHtwb2xsSW50ZXJ2YWx9bXNgKTtcbiAgICAgICAgfSBlbHNlIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IDQwNCkge1xuICAgICAgICAgIC8vIEFjdGl2aXR5IG5vdCBmb3VuZCB5ZXRcbiAgICAgICAgICBjb25zb2xlLmRlYnVnKGBBY3Rpdml0eSAke2FjdGl2aXR5TmFtZX0gbm90IGZvdW5kIHlldCwgcG9sbGluZyBhZ2FpbiBpbiAke3BvbGxJbnRlcnZhbH1tc2ApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUud2FybihgVW5leHBlY3RlZCByZXNwb25zZSAke3Jlc3BvbnNlLnN0YXR1c30gd2hlbiBwb2xsaW5nIGFjdGl2aXR5IHJlc3VsdGApO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAoKGVycm9yIGFzIEVycm9yKS5tZXNzYWdlLmluY2x1ZGVzKCd0aW1lZCBvdXQnKSB8fCAoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2UuaW5jbHVkZXMoJ2ZhaWxlZCcpKSB7XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZS53YXJuKCdFcnJvciBwb2xsaW5nIGFjdGl2aXR5IHJlc3VsdDonLCBlcnJvcik7XG4gICAgICB9XG5cbiAgICAgIC8vIFdhaXQgd2l0aCBleHBvbmVudGlhbCBiYWNrb2ZmXG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCBwb2xsSW50ZXJ2YWwpKTtcbiAgICAgIHBvbGxJbnRlcnZhbCA9IE1hdGgubWluKHBvbGxJbnRlcnZhbCAqIGJhY2tvZmZNdWx0aXBsaWVyLCBtYXhQb2xsSW50ZXJ2YWwpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY2xlYW51cCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBTdG9wIGhlYXJ0YmVhdFxuICAgIGlmICh0aGlzLmhlYXJ0YmVhdEludGVydmFsKSB7XG4gICAgICBjbGVhckludGVydmFsKHRoaXMuaGVhcnRiZWF0SW50ZXJ2YWwpO1xuICAgIH1cblxuICAgIC8vIERpc2Nvbm5lY3QgZnJvbSBzZXJ2ZXJcbiAgICBhd2FpdCB0aGlzLmRpc2Nvbm5lY3RGcm9tU2VydmVyKCk7XG5cbiAgICAvLyBTdG9wIEthZmthIGNsaWVudHNcbiAgICBpZiAodGhpcy5jb25zdW1lcikge1xuICAgICAgYXdhaXQgdGhpcy5jb25zdW1lci5kaXNjb25uZWN0KCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnByb2R1Y2VyKSB7XG4gICAgICBhd2FpdCB0aGlzLnByb2R1Y2VyLmRpc2Nvbm5lY3QoKTtcbiAgICB9XG5cbiAgICBjb25zb2xlLmxvZyhgV29ya2VyICR7dGhpcy53b3JrZXJJZH0gc3RvcHBlZGApO1xuICB9XG59XG4iXX0=
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@raspect/workflow-sdk",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "description": "Node.js SDK for Inspectica Workflow Server - Activity worker implementation",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",