@stemy/backend 2.9.8 → 3.0.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.
@@ -20,21 +20,21 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
20
20
  });
21
21
  };
22
22
  import { inject, injectable, injectAll, Lifecycle, scoped } from "tsyringe";
23
- import { Queue, Scheduler, Worker } from "node-resque";
24
23
  import { schedule, validate } from "node-cron";
25
- import ioredis from "ioredis";
24
+ import { socket } from "zeromq";
25
+ import { ObjectId } from "bson";
26
26
  import { DI_CONTAINER, JOB } from "../common-types";
27
- import { getConstructorName, isArray, isObject } from "../utils";
27
+ import { getConstructorName, isArray, isObject, jsonHighlight, promiseTimeout } from "../utils";
28
28
  import { Configuration } from "./configuration";
29
- const IORedis = ioredis;
30
29
  let JobManager = class JobManager {
31
30
  constructor(config, container, jobTypes) {
32
31
  this.config = config;
33
32
  this.container = container;
34
33
  this.jobTypes = jobTypes || [];
35
34
  this.jobs = this.jobTypes.reduce((res, jobType) => {
36
- res[getConstructorName(jobType)] = {
37
- perform: this.toPerformFunction(jobType)
35
+ res[getConstructorName(jobType)] = (jobParams) => {
36
+ const job = this.resolveJobInstance(jobType, jobParams);
37
+ return job.process();
38
38
  };
39
39
  return res;
40
40
  }, {});
@@ -52,31 +52,25 @@ let JobManager = class JobManager {
52
52
  return instance.process();
53
53
  });
54
54
  }
55
- enqueueWithName(name, params = {}, que = "main") {
55
+ enqueueWithName(name, params = {}) {
56
56
  return __awaiter(this, void 0, void 0, function* () {
57
57
  const jobName = yield this.tryResolveFromName(name, params);
58
- yield this.queue.enqueue(que, jobName, [params]);
58
+ return this.sendToWorkers(jobName, params);
59
59
  });
60
60
  }
61
- enqueue(jobType, params = {}, que = "main") {
61
+ enqueue(jobType, params = {}) {
62
62
  return __awaiter(this, void 0, void 0, function* () {
63
63
  const jobName = yield this.tryResolveAndConnect(jobType, params);
64
- yield this.queue.enqueue(que, jobName, [params]);
64
+ return this.sendToWorkers(jobName, params);
65
65
  });
66
66
  }
67
- enqueueAt(timestamp, jobType, params = {}, que = "main") {
67
+ sendToWorkers(jobName, params) {
68
68
  return __awaiter(this, void 0, void 0, function* () {
69
- const jobName = yield this.tryResolveAndConnect(jobType, params);
70
- yield this.queue.enqueueAt(timestamp, que, jobName, [params]);
71
- });
72
- }
73
- enqueueIn(time, jobType, params = {}, que = "main") {
74
- return __awaiter(this, void 0, void 0, function* () {
75
- const jobName = yield this.tryResolveAndConnect(jobType, params);
76
- yield this.queue.enqueueIn(time, que, jobName, [params]);
69
+ const publisher = yield this.scheduler;
70
+ yield publisher.send([jobName, JSON.stringify(params), new ObjectId().toHexString()]);
77
71
  });
78
72
  }
79
- schedule(minute, hour, dayOfMonth, month, dayOfWeek, jobType, params = {}, que = "main") {
73
+ schedule(minute, hour, dayOfMonth, month, dayOfWeek, jobType, params = {}) {
80
74
  const expression = [minute, hour, dayOfMonth, month, dayOfWeek].map(t => {
81
75
  if (isObject(t)) {
82
76
  const range = t;
@@ -93,19 +87,38 @@ let JobManager = class JobManager {
93
87
  return null;
94
88
  }
95
89
  return schedule(expression, () => {
96
- this.enqueue(jobType, params, que).catch(e => {
90
+ this.enqueue(jobType, params).catch(e => {
97
91
  console.log(`Can't enqueue job: '${jobName}' because: ${e}`);
98
92
  });
99
93
  });
100
94
  }
101
95
  startProcessing() {
102
- return __awaiter(this, void 0, void 0, function* () {
103
- this.initialize();
104
- yield this.worker.connect();
105
- yield this.worker.start();
106
- yield this.scheduler.connect();
107
- yield this.scheduler.start();
108
- });
96
+ const host = this.config.resolve("zmqRemoteHost");
97
+ this.worker = socket("pull");
98
+ this.worker.connect(host);
99
+ this.worker.on("message", (name, args, uniqueId) => __awaiter(this, void 0, void 0, function* () {
100
+ try {
101
+ const jobName = name.toString("utf8");
102
+ const jobParams = JSON.parse(args.toString("utf8"));
103
+ const timerId = uniqueId === null || uniqueId === void 0 ? void 0 : uniqueId.toString("utf8");
104
+ const jobNameLog = `\x1b[36m"${jobName}"\x1b[0m`;
105
+ const jobArgsLog = `\n${jsonHighlight(jobParams)}\n`;
106
+ console.time(timerId);
107
+ console.timeLog(timerId, `Started working on background job: ${jobNameLog} with args: ${jobArgsLog}`);
108
+ try {
109
+ yield Promise.race([this.jobs[jobName](jobParams), promiseTimeout(15000, true)]);
110
+ console.timeLog(timerId, `Finished working on background job: ${jobNameLog} with args: ${jobArgsLog}`);
111
+ }
112
+ catch (e) {
113
+ console.timeLog(timerId, `Background job failed: ${jobNameLog} with args: ${jobArgsLog}${e.message}\n\n`);
114
+ }
115
+ console.timeEnd(timerId);
116
+ }
117
+ catch (e) {
118
+ console.log(`Failed to start job: ${e.message}`);
119
+ }
120
+ }));
121
+ console.log(`Waiting for jobs at: ${host}`);
109
122
  }
110
123
  tryResolve(jobType, params) {
111
124
  const jobName = getConstructorName(jobType);
@@ -120,47 +133,6 @@ let JobManager = class JobManager {
120
133
  }
121
134
  return jobName;
122
135
  }
123
- initialize() {
124
- if (this.queue)
125
- return;
126
- const config = this.config;
127
- const options = { password: config.resolve("redisPassword") };
128
- const sentinels = config.resolve("redisSentinels");
129
- const redis = !sentinels
130
- ? null
131
- : new IORedis({
132
- sentinels,
133
- name: config.resolve("redisCluster"),
134
- });
135
- const connection = {
136
- pkg: "ioredis",
137
- host: config.resolve("redisHost"),
138
- password: options.password,
139
- port: config.resolve("redisPort"),
140
- namespace: config.resolve("redisNamespace"),
141
- redis,
142
- options
143
- };
144
- const queues = config.resolve("workQueues");
145
- this.queue = new Queue({ connection }, this.jobs);
146
- this.worker = new Worker({ connection, queues }, this.jobs);
147
- this.worker.on("job", (queue, job) => {
148
- console.log(`working job ${queue} ${JSON.stringify(job)}`);
149
- });
150
- this.worker.on("reEnqueue", (queue, job, plugin) => {
151
- console.log(`reEnqueue job (${plugin}) ${queue} ${JSON.stringify(job)}`);
152
- });
153
- this.worker.on("success", (queue, job, result, duration) => {
154
- console.log(`job success ${queue} ${JSON.stringify(job)} >> ${result} (${duration}ms)`);
155
- });
156
- this.worker.on("failure", (queue, job, failure, duration) => {
157
- console.log(`job failure ${queue} ${JSON.stringify(job)} >> ${failure} (${duration}ms)`);
158
- });
159
- this.worker.on("error", (error, queue, job) => {
160
- console.log(`error ${queue} ${JSON.stringify(job)} >> ${error}`);
161
- });
162
- this.scheduler = new Scheduler({ connection }, this.jobs);
163
- }
164
136
  tryResolveFromName(jobName, params) {
165
137
  const jobType = this.jobTypes.find(type => {
166
138
  return getConstructorName(type) == jobName;
@@ -172,10 +144,14 @@ let JobManager = class JobManager {
172
144
  }
173
145
  tryResolveAndConnect(jobType, params) {
174
146
  return __awaiter(this, void 0, void 0, function* () {
175
- this.initialize();
176
- const jobName = this.tryResolve(jobType, params);
177
- yield this.queue.connect();
178
- return jobName;
147
+ this.scheduler = this.scheduler || new Promise((resolve) => __awaiter(this, void 0, void 0, function* () {
148
+ const port = this.config.resolve("zmqPort");
149
+ const publisher = socket("push");
150
+ yield publisher.bind(`tcp://0.0.0.0:${port}`);
151
+ console.log(`Publisher bound to port: ${port}`);
152
+ resolve(publisher);
153
+ }));
154
+ return this.tryResolve(jobType, params);
179
155
  });
180
156
  }
181
157
  resolveJobInstance(jobType, params) {
@@ -186,12 +162,6 @@ let JobManager = class JobManager {
186
162
  container.register(jobType, jobType);
187
163
  return container.resolve(jobType);
188
164
  }
189
- toPerformFunction(jobType) {
190
- return (jobParams) => {
191
- const job = this.resolveJobInstance(jobType, jobParams);
192
- return job.process();
193
- };
194
- }
195
165
  };
196
166
  JobManager = __decorate([
197
167
  injectable(),
@@ -200,4 +170,4 @@ JobManager = __decorate([
200
170
  __metadata("design:paramtypes", [Configuration, Object, Array])
201
171
  ], JobManager);
202
172
  export { JobManager };
203
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiam9iLW1hbmFnZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmljZXMvam9iLW1hbmFnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsT0FBTyxFQUFzQixNQUFNLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBQy9GLE9BQU8sRUFBQyxLQUFLLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUNyRCxPQUFPLEVBQUMsUUFBUSxFQUFFLFFBQVEsRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUM3QyxPQUFPLE9BQU8sTUFBTSxTQUFTLENBQUM7QUFDOUIsT0FBTyxFQUFDLFlBQVksRUFBa0IsR0FBRyxFQUFxRCxNQUFNLGlCQUFpQixDQUFDO0FBQ3RILE9BQU8sRUFBQyxrQkFBa0IsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBQy9ELE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUU5QyxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUM7SUFJWCxVQUFVLFNBQVYsVUFBVTtJQVFuQixZQUFxQixNQUFxQixFQUFpQyxTQUE4QixFQUFrQixRQUFzQjtRQUE1SCxXQUFNLEdBQU4sTUFBTSxDQUFlO1FBQWlDLGNBQVMsR0FBVCxTQUFTLENBQXFCO1FBQ3JHLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxJQUFJLEVBQUUsQ0FBQztRQUMvQixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLE9BQU8sRUFBRSxFQUFFO1lBQzlDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHO2dCQUMvQixPQUFPLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9B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RUFBRSxDQUFDO1lBQzNCLE9BQU8sT0FBTyxDQUFDO1FBQ25CLENBQUM7S0FBQTtJQUVTLGtCQUFrQixDQUFDLE9BQW1CLEVBQUUsTUFBaUI7UUFDL0QsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBQ3hELE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDN0IsU0FBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFDLENBQUMsQ0FBQztRQUN2RCxDQUFDLENBQUMsQ0FBQztRQUNILFNBQVMsQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBRXJDLE9BQU8sU0FBUyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQVMsQ0FBQztJQUM5QyxDQUFDO0lBRVMsaUJBQWlCLENBQUMsT0FBbUI7UUFDM0MsT0FBTyxDQUFDLFNBQW9CLEVBQUUsRUFBRTtZQUM1QixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQ3hELE9BQU8sR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3pCLENBQUMsQ0FBQTtJQUNMLENBQUM7Q0FDSixDQUFBO0FBN0tZLFVBQVU7SUFGdEIsVUFBVSxFQUFFO0lBQ1osTUFBTSxDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUM7SUFTZSxXQUFBLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQSxFQUEyQyxXQUFBLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQTtxQ0FBN0YsYUFBYTtHQVJqQyxVQUFVLENBNkt0QjtTQTdLWSxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtEZXBlbmRlbmN5Q29udGFpbmVyLCBpbmplY3QsIGluamVjdGFibGUsIGluamVjdEFsbCwgTGlmZWN5Y2xlLCBzY29wZWR9IGZyb20gXCJ0c3lyaW5nZVwiO1xyXG5pbXBvcnQge1F1ZXVlLCBTY2hlZHVsZXIsIFdvcmtlcn0gZnJvbSBcIm5vZGUtcmVzcXVlXCI7XHJcbmltcG9ydCB7c2NoZWR1bGUsIHZhbGlkYXRlfSBmcm9tIFwibm9kZS1jcm9uXCI7XHJcbmltcG9ydCBpb3JlZGlzIGZyb20gXCJpb3JlZGlzXCI7XHJcbmltcG9ydCB7RElfQ09OVEFJTkVSLCBJSm9iLCBJSm9iVGFzaywgSk9CLCBKb2JQYXJhbXMsIEpvYlNjaGVkdWxlUmFuZ2UsIEpvYlNjaGVkdWxlVGltZSwgVHlwZX0gZnJvbSBcIi4uL2NvbW1vbi10eXBlc1wiO1xyXG5pbXBvcnQge2dldENvbnN0cnVjdG9yTmFtZSwgaXNBcnJheSwgaXNPYmplY3R9IGZyb20gXCIuLi91dGlsc1wiO1xyXG5pbXBvcnQge0NvbmZpZ3VyYXRpb259IGZyb20gXCIuL2NvbmZpZ3VyYXRpb25cIjtcclxuXHJcbmNvbnN0IElPUmVkaXMgPSBpb3JlZGlzO1xyXG5cclxuQGluamVjdGFibGUoKVxyXG5Ac2NvcGVkKExpZmVjeWNsZS5Db250YWluZXJTY29wZWQpXHJcbmV4cG9ydCBjbGFzcyBKb2JNYW5hZ2VyIHtcclxuXHJcbiAgICBwcm90ZWN0ZWQgam9iczogYW55O1xyXG4gICAgcHJvdGVjdGVkIHF1ZXVlOiBRdWV1ZTtcclxuICAgIHByb3RlY3RlZCB3b3JrZXI6IFdvcmtlcjtcclxuICAgIHByb3RlY3RlZCBzY2hlZHVsZXI6IFNjaGVkdWxlcjtcclxuICAgIHByb3RlY3RlZCBqb2JUeXBlczogVHlwZTxJSm9iPltdO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHJlYWRvbmx5IGNvbmZpZzogQ29uZmlndXJhdGlvbiwgQGluamVjdChESV9DT05UQUlORVIpIHJlYWRvbmx5IGNvbnRhaW5lcjogRGVwZW5kZW5jeUNvbnRhaW5lciwgQGluamVjdEFsbChKT0IpIGpvYlR5cGVzOiBUeXBlPElKb2I+W10pIHtcclxuICAgICAgICB0aGlzLmpvYlR5cGVzID0gam9iVHlwZXMgfHwgW107XHJcbiAgICAgICAgdGhpcy5qb2JzID0gdGhpcy5qb2JUeXBlcy5yZWR1Y2UoKHJlcywgam9iVHlwZSkgPT4ge1xyXG4gICAgICAgICAgICByZXNbZ2V0Q29uc3RydWN0b3JOYW1lKGpvYlR5cGUpXSA9IHtcclxuICAgICAgICAgICAgICAgIHBlcmZvcm06IHRoaXMudG9QZXJmb3JtRnVuY3Rpb24oam9iVHlwZSlcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgcmV0dXJuIHJlcztcclxuICAgICAgICB9LCB7fSk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgcHJvY2Vzcyhqb2JUeXBlOiBUeXBlPElKb2I+LCBwYXJhbXM6IEpvYlBhcmFtcyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcclxuICAgICAgICBsZXQgaW5zdGFuY2U6IElKb2IgPSBudWxsO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGluc3RhbmNlID0gdGhpcy5yZXNvbHZlSm9iSW5zdGFuY2Uoam9iVHlwZSwgcGFyYW1zKTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGpvYk5hbWUgPSBnZXRDb25zdHJ1Y3Rvck5hbWUoam9iVHlwZSk7XHJcbiAgICAgICAgICAgIHRocm93IGBDYW4ndCByZXNvbHZlIHBhcmFtcyBmb3Igam9iOiAke2pvYk5hbWV9LCB3aXRoIHBhcmFtczogJHtKU09OLnN0cmluZ2lmeShwYXJhbXMpfS4gUmVhc29uOiAke2V9YDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGluc3RhbmNlLnByb2Nlc3MoKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBlbnF1ZXVlV2l0aE5hbWUobmFtZTogc3RyaW5nLCBwYXJhbXM6IEpvYlBhcmFtcyA9IHt9LCBxdWU6IHN0cmluZyA9IFwibWFpblwiKTogUHJvbWlzZTxhbnk+IHtcclxuICAgICAgICBjb25zdCBqb2JOYW1lID0gYXdhaXQgdGhpcy50cnlSZXNvbHZlRnJvbU5hbWUobmFtZSwgcGFyYW1zKTtcclxuICAgICAgICBhd2FpdCB0aGlzLnF1ZXVlLmVucXVldWUocXVlLCBqb2JOYW1lLCBbcGFyYW1zXSk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgZW5xdWV1ZShqb2JUeXBlOiBUeXBlPElKb2I+LCBwYXJhbXM6IEpvYlBhcmFtcyA9IHt9LCBxdWU6IHN0cmluZyA9IFwibWFpblwiKTogUHJvbWlzZTxhbnk+IHtcclxuICAgICAgICBjb25zdCBqb2JOYW1lID0gYXdhaXQgdGhpcy50cnlSZXNvbHZlQW5kQ29ubmVjdChqb2JUeXBlLCBwYXJhbXMpO1xyXG4gICAgICAgIGF3YWl0IHRoaXMucXVldWUuZW5xdWV1ZShxdWUsIGpvYk5hbWUsIFtwYXJhbXNdKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBlbnF1ZXVlQXQodGltZXN0YW1wOiBudW1iZXIsIGpvYlR5cGU6IFR5cGU8SUpvYj4sIHBhcmFtczogSm9iUGFyYW1zID0ge30sIHF1ZTogc3RyaW5nID0gXCJtYWluXCIpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgICAgIGNvbnN0IGpvYk5hbWUgPSBhd2FpdCB0aGlzLnRyeVJlc29sdmVBbmRDb25uZWN0KGpvYlR5cGUsIHBhcmFtcyk7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5xdWV1ZS5lbnF1ZXVlQXQodGltZXN0YW1wLCBxdWUsIGpvYk5hbWUsIFtwYXJhbXNdKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBlbnF1ZXVlSW4odGltZTogbnVtYmVyLCBqb2JUeXBlOiBUeXBlPElKb2I+LCBwYXJhbXM6IEpvYlBhcmFtcyA9IHt9LCBxdWU6IHN0cmluZyA9IFwibWFpblwiKTogUHJvbWlzZTxhbnk+IHtcclxuICAgICAgICBjb25zdCBqb2JOYW1lID0gYXdhaXQgdGhpcy50cnlSZXNvbHZlQW5kQ29ubmVjdChqb2JUeXBlLCBwYXJhbXMpO1xyXG4gICAgICAgIGF3YWl0IHRoaXMucXVldWUuZW5xdWV1ZUluKHRpbWUsIHF1ZSwgam9iTmFtZSwgW3BhcmFtc10pO1xyXG4gICAgfVxyXG5cclxuICAgIHNjaGVkdWxlKG1pbnV0ZTogSm9iU2NoZWR1bGVUaW1lLCBob3VyOiBKb2JTY2hlZHVsZVRpbWUsIGRheU9mTW9udGg6IEpvYlNjaGVkdWxlVGltZSwgbW9udGg6IEpvYlNjaGVkdWxlVGltZSwgZGF5T2ZXZWVrOiBKb2JTY2hlZHVsZVRpbWUsIGpvYlR5cGU6IFR5cGU8SUpvYj4sIHBhcmFtczogSm9iUGFyYW1zID0ge30sIHF1ZTogc3RyaW5nID0gXCJtYWluXCIpOiBJSm9iVGFzayB7XHJcbiAgICAgICAgY29uc3QgZXhwcmVzc2lvbiA9IFttaW51dGUsIGhvdXIsIGRheU9mTW9udGgsIG1vbnRoLCBkYXlPZldlZWtdLm1hcCh0ID0+IHtcclxuICAgICAgICAgICAgaWYgKGlzT2JqZWN0KHQpKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCByYW5nZSA9IHQgYXMgSm9iU2NoZWR1bGVSYW5nZTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBgJHtyYW5nZS5taW4gfHwgMH0tJHtyYW5nZS5tYXggfHwgMH1gO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChpc0FycmF5KHQpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdC5qb2luKFwiLFwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gYCR7dH1gO1xyXG4gICAgICAgIH0pLmpvaW4oXCIgXCIpO1xyXG4gICAgICAgIGNvbnN0IGpvYk5hbWUgPSBnZXRDb25zdHJ1Y3Rvck5hbWUoam9iVHlwZSk7XHJcbiAgICAgICAgaWYgKCF2YWxpZGF0ZShleHByZXNzaW9uKSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgQ2FuJ3Qgc2NoZWR1bGUgdGhlIHRhc2s6ICcke2pvYk5hbWV9JyBiZWNhdXNlIHRpbWUgZXhwcmVzc2lvbiBpcyBpbnZhbGlkLmApO1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHNjaGVkdWxlKGV4cHJlc3Npb24sICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5lbnF1ZXVlKGpvYlR5cGUsIHBhcmFtcywgcXVlKS5jYXRjaChlID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBDYW4ndCBlbnF1ZXVlIGpvYjogJyR7am9iTmFtZX0nIGJlY2F1c2U6ICR7ZX1gKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgc3RhcnRQcm9jZXNzaW5nKCk6IFByb21pc2U8YW55PiB7XHJcbiAgICAgICAgdGhpcy5pbml0aWFsaXplKCk7XHJcbiAgICAgICAgYXdhaXQgdGhpcy53b3JrZXIuY29ubmVjdCgpO1xyXG4gICAgICAgIGF3YWl0IHRoaXMud29ya2VyLnN0YXJ0KCk7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5zY2hlZHVsZXIuY29ubmVjdCgpO1xyXG4gICAgICAgIGF3YWl0IHRoaXMuc2NoZWR1bGVyLnN0YXJ0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgdHJ5UmVzb2x2ZShqb2JUeXBlOiBUeXBlPElKb2I+LCBwYXJhbXM6IEpvYlBhcmFtcyk6IHN0cmluZyB7XHJcbiAgICAgICAgY29uc3Qgam9iTmFtZSA9IGdldENvbnN0cnVjdG9yTmFtZShqb2JUeXBlKTtcclxuICAgICAgICBpZiAoIXRoaXMuam9ic1tqb2JOYW1lXSkge1xyXG4gICAgICAgICAgICB0aHJvdyBgQ2FuJ3QgZmluZCBqb2Igd2l0aCBuYW1lOiAke2pvYk5hbWV9IHNvIGl0IGNhbid0IGJlIGVucXVldWVkIWA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVzb2x2ZUpvYkluc3RhbmNlKGpvYlR5cGUsIHBhcmFtcyk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICB0aHJvdyBgQ2FuJ3QgcmVzb2x2ZSBwYXJhbXMgZm9yIGpvYjogJHtqb2JOYW1lfSwgd2l0aCBwYXJhbXM6ICR7SlNPTi5zdHJpbmdpZnkocGFyYW1zKX0uIFJlYXNvbjogJHtlfWA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBqb2JOYW1lO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBpbml0aWFsaXplKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLnF1ZXVlKSByZXR1cm47XHJcbiAgICAgICAgY29uc3QgY29uZmlnID0gdGhpcy5jb25maWc7XHJcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtwYXNzd29yZDogY29uZmlnLnJlc29sdmUoXCJyZWRpc1Bhc3N3b3JkXCIpfTtcclxuICAgICAgICBjb25zdCBzZW50aW5lbHM6IEFycmF5PHtob3N0OiBzdHJpbmcsIHBvcnQ6IG51bWJlcn0+ID0gY29uZmlnLnJlc29sdmUoXCJyZWRpc1NlbnRpbmVsc1wiKTtcclxuICAgICAgICBjb25zdCByZWRpcyA9ICFzZW50aW5lbHNcclxuICAgICAgICAgICAgPyBudWxsXHJcbiAgICAgICAgICAgIDogbmV3IElPUmVkaXMoe1xyXG4gICAgICAgICAgICAgICAgc2VudGluZWxzLFxyXG4gICAgICAgICAgICAgICAgbmFtZTogY29uZmlnLnJlc29sdmUoXCJyZWRpc0NsdXN0ZXJcIiksXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIGNvbnN0IGNvbm5lY3Rpb24gPSB7XHJcbiAgICAgICAgICAgIHBrZzogXCJpb3JlZGlzXCIsXHJcbiAgICAgICAgICAgIGhvc3Q6IGNvbmZpZy5yZXNvbHZlKFwicmVkaXNIb3N0XCIpLFxyXG4gICAgICAgICAgICBwYXNzd29yZDogb3B0aW9ucy5wYXNzd29yZCxcclxuICAgICAgICAgICAgcG9ydDogY29uZmlnLnJlc29sdmUoXCJyZWRpc1BvcnRcIiksXHJcbiAgICAgICAgICAgIG5hbWVzcGFjZTogY29uZmlnLnJlc29sdmUoXCJyZWRpc05hbWVzcGFjZVwiKSxcclxuICAgICAgICAgICAgcmVkaXMsXHJcbiAgICAgICAgICAgIG9wdGlvbnNcclxuICAgICAgICB9O1xyXG4gICAgICAgIGNvbnN0IHF1ZXVlcyA9IGNvbmZpZy5yZXNvbHZlKFwid29ya1F1ZXVlc1wiKTtcclxuICAgICAgICB0aGlzLnF1ZXVlID0gbmV3IFF1ZXVlKHtjb25uZWN0aW9ufSwgdGhpcy5qb2JzKTtcclxuICAgICAgICB0aGlzLndvcmtlciA9IG5ldyBXb3JrZXIoe2Nvbm5lY3Rpb24sIHF1ZXVlc30sIHRoaXMuam9icyk7XHJcbiAgICAgICAgdGhpcy53b3JrZXIub24oXCJqb2JcIiwgKHF1ZXVlLCBqb2IpID0+IHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coYHdvcmtpbmcgam9iICR7cXVldWV9ICR7SlNPTi5zdHJpbmdpZnkoam9iKX1gKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLndvcmtlci5vbihcInJlRW5xdWV1ZVwiLCAocXVldWUsIGpvYiwgcGx1Z2luKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGByZUVucXVldWUgam9iICgke3BsdWdpbn0pICR7cXVldWV9ICR7SlNPTi5zdHJpbmdpZnkoam9iKX1gKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLndvcmtlci5vbihcInN1Y2Nlc3NcIiwgKHF1ZXVlLCBqb2IsIHJlc3VsdCwgZHVyYXRpb24pID0+IHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXHJcbiAgICAgICAgICAgICAgICBgam9iIHN1Y2Nlc3MgJHtxdWV1ZX0gJHtKU09OLnN0cmluZ2lmeShqb2IpfSA+PiAke3Jlc3VsdH0gKCR7ZHVyYXRpb259bXMpYFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMud29ya2VyLm9uKFwiZmFpbHVyZVwiLCAocXVldWUsIGpvYiwgZmFpbHVyZSwgZHVyYXRpb24pID0+IHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXHJcbiAgICAgICAgICAgICAgICBgam9iIGZhaWx1cmUgJHtxdWV1ZX0gJHtKU09OLnN0cmluZ2lmeShcclxuICAgICAgICAgICAgICAgICAgICBqb2JcclxuICAgICAgICAgICAgICAgICl9ID4+ICR7ZmFpbHVyZX0gKCR7ZHVyYXRpb259bXMpYFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMud29ya2VyLm9uKFwiZXJyb3JcIiwgKGVycm9yLCBxdWV1ZSwgam9iKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBlcnJvciAke3F1ZXVlfSAke0pTT04uc3RyaW5naWZ5KGpvYil9ICA+PiAke2Vycm9yfWApO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMuc2NoZWR1bGVyID0gbmV3IFNjaGVkdWxlcih7Y29ubmVjdGlvbn0sIHRoaXMuam9icyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHRyeVJlc29sdmVGcm9tTmFtZShqb2JOYW1lOiBzdHJpbmcsIHBhcmFtczogSm9iUGFyYW1zKTogUHJvbWlzZTxzdHJpbmc+IHtcclxuICAgICAgICBjb25zdCBqb2JUeXBlID0gdGhpcy5qb2JUeXBlcy5maW5kKHR5cGUgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gZ2V0Q29uc3RydWN0b3JOYW1lKHR5cGUpID09IGpvYk5hbWU7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKCFqb2JUeXBlKSB7XHJcbiAgICAgICAgICAgIHRocm93IGBDYW4ndCBmaW5kIGpvYiB0eXBlIHdpdGggbmFtZTogJHtqb2JOYW1lfSBzbyBpdCBjYW4ndCBiZSBlbnF1ZXVlZCFgO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy50cnlSZXNvbHZlQW5kQ29ubmVjdChqb2JUeXBlLCBwYXJhbXMpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBhc3luYyB0cnlSZXNvbHZlQW5kQ29ubmVjdChqb2JUeXBlOiBUeXBlPElKb2I+LCBwYXJhbXM6IEpvYlBhcmFtcyk6IFByb21pc2U8c3RyaW5nPiB7XHJcbiAgICAgICAgdGhpcy5pbml0aWFsaXplKCk7XHJcbiAgICAgICAgY29uc3Qgam9iTmFtZSA9IHRoaXMudHJ5UmVzb2x2ZShqb2JUeXBlLCBwYXJhbXMpO1xyXG4gICAgICAgIGF3YWl0IHRoaXMucXVldWUuY29ubmVjdCgpO1xyXG4gICAgICAgIHJldHVybiBqb2JOYW1lO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCByZXNvbHZlSm9iSW5zdGFuY2Uoam9iVHlwZTogVHlwZTxJSm9iPiwgcGFyYW1zOiBKb2JQYXJhbXMpOiBJSm9iIHtcclxuICAgICAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLmNvbnRhaW5lci5jcmVhdGVDaGlsZENvbnRhaW5lcigpO1xyXG4gICAgICAgIE9iamVjdC5rZXlzKHBhcmFtcykubWFwKChuYW1lKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnRhaW5lci5yZWdpc3RlcihuYW1lLCB7dXNlVmFsdWU6IHBhcmFtc1tuYW1lXX0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGNvbnRhaW5lci5yZWdpc3Rlcihqb2JUeXBlLCBqb2JUeXBlKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGNvbnRhaW5lci5yZXNvbHZlKGpvYlR5cGUpIGFzIElKb2I7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHRvUGVyZm9ybUZ1bmN0aW9uKGpvYlR5cGU6IFR5cGU8SUpvYj4pOiBGdW5jdGlvbiB7XHJcbiAgICAgICAgcmV0dXJuIChqb2JQYXJhbXM6IEpvYlBhcmFtcykgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBqb2IgPSB0aGlzLnJlc29sdmVKb2JJbnN0YW5jZShqb2JUeXBlLCBqb2JQYXJhbXMpO1xyXG4gICAgICAgICAgICByZXR1cm4gam9iLnByb2Nlc3MoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuIl19
173
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiam9iLW1hbmFnZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmljZXMvam9iLW1hbmFnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsT0FBTyxFQUFzQixNQUFNLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBQy9GLE9BQU8sRUFBQyxRQUFRLEVBQUUsUUFBUSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQzdDLE9BQU8sRUFBQyxNQUFNLEVBQVMsTUFBTSxRQUFRLENBQUM7QUFDdEMsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUM5QixPQUFPLEVBQUMsWUFBWSxFQUFrQixHQUFHLEVBQXFELE1BQU0saUJBQWlCLENBQUM7QUFDdEgsT0FBTyxFQUFDLGtCQUFrQixFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsYUFBYSxFQUFFLGNBQWMsRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUM5RixPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0saUJBQWlCLENBQUM7SUFJakMsVUFBVSxTQUFWLFVBQVU7SUFPbkIsWUFBcUIsTUFBcUIsRUFBaUMsU0FBOEIsRUFBa0IsUUFBc0I7UUFBNUgsV0FBTSxHQUFOLE1BQU0sQ0FBZTtRQUFpQyxjQUFTLEdBQVQsU0FBUyxDQUFxQjtRQUNyRyxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsSUFBSSxFQUFFLENBQUM7UUFDL0IsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxPQUFPLEVBQUUsRUFBRTtZQUM5QyxHQUFHLENBQUMsa0JBQWtCLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLFNBQW9CLEVBQUUsRUFBRTtnQkFDeEQsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixD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QUFvQixFQUFFLENBQUM7UUFDeEQsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUM3QixTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUMsQ0FBQyxDQUFDO1FBQ3ZELENBQUMsQ0FBQyxDQUFDO1FBQ0gsU0FBUyxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDckMsT0FBTyxTQUFTLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBUyxDQUFDO0lBQzlDLENBQUM7Q0FDSixDQUFBO0FBeklZLFVBQVU7SUFGdEIsVUFBVSxFQUFFO0lBQ1osTUFBTSxDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUM7SUFRZSxXQUFBLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQSxFQUEyQyxXQUFBLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQTtxQ0FBN0YsYUFBYTtHQVBqQyxVQUFVLENBeUl0QjtTQXpJWSxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtEZXBlbmRlbmN5Q29udGFpbmVyLCBpbmplY3QsIGluamVjdGFibGUsIGluamVjdEFsbCwgTGlmZWN5Y2xlLCBzY29wZWR9IGZyb20gXCJ0c3lyaW5nZVwiO1xyXG5pbXBvcnQge3NjaGVkdWxlLCB2YWxpZGF0ZX0gZnJvbSBcIm5vZGUtY3JvblwiO1xyXG5pbXBvcnQge3NvY2tldCwgU29ja2V0fSBmcm9tIFwiemVyb21xXCI7XHJcbmltcG9ydCB7T2JqZWN0SWR9IGZyb20gXCJic29uXCI7XHJcbmltcG9ydCB7RElfQ09OVEFJTkVSLCBJSm9iLCBJSm9iVGFzaywgSk9CLCBKb2JQYXJhbXMsIEpvYlNjaGVkdWxlUmFuZ2UsIEpvYlNjaGVkdWxlVGltZSwgVHlwZX0gZnJvbSBcIi4uL2NvbW1vbi10eXBlc1wiO1xyXG5pbXBvcnQge2dldENvbnN0cnVjdG9yTmFtZSwgaXNBcnJheSwgaXNPYmplY3QsIGpzb25IaWdobGlnaHQsIHByb21pc2VUaW1lb3V0fSBmcm9tIFwiLi4vdXRpbHNcIjtcclxuaW1wb3J0IHtDb25maWd1cmF0aW9ufSBmcm9tIFwiLi9jb25maWd1cmF0aW9uXCI7XHJcblxyXG5AaW5qZWN0YWJsZSgpXHJcbkBzY29wZWQoTGlmZWN5Y2xlLkNvbnRhaW5lclNjb3BlZClcclxuZXhwb3J0IGNsYXNzIEpvYk1hbmFnZXIge1xyXG5cclxuICAgIHByb3RlY3RlZCBqb2JzOiB7W25hbWU6IHN0cmluZ106IChqb2JQYXJhbXM6IEpvYlBhcmFtcykgPT4gUHJvbWlzZTxhbnk+fTtcclxuICAgIHByb3RlY3RlZCBzY2hlZHVsZXI6IFByb21pc2U8U29ja2V0PjtcclxuICAgIHByb3RlY3RlZCB3b3JrZXI6IFNvY2tldDtcclxuICAgIHByb3RlY3RlZCBqb2JUeXBlczogVHlwZTxJSm9iPltdO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHJlYWRvbmx5IGNvbmZpZzogQ29uZmlndXJhdGlvbiwgQGluamVjdChESV9DT05UQUlORVIpIHJlYWRvbmx5IGNvbnRhaW5lcjogRGVwZW5kZW5jeUNvbnRhaW5lciwgQGluamVjdEFsbChKT0IpIGpvYlR5cGVzOiBUeXBlPElKb2I+W10pIHtcclxuICAgICAgICB0aGlzLmpvYlR5cGVzID0gam9iVHlwZXMgfHwgW107XHJcbiAgICAgICAgdGhpcy5qb2JzID0gdGhpcy5qb2JUeXBlcy5yZWR1Y2UoKHJlcywgam9iVHlwZSkgPT4ge1xyXG4gICAgICAgICAgICByZXNbZ2V0Q29uc3RydWN0b3JOYW1lKGpvYlR5cGUpXSA9IChqb2JQYXJhbXM6IEpvYlBhcmFtcykgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgam9iID0gdGhpcy5yZXNvbHZlSm9iSW5zdGFuY2Uoam9iVHlwZSwgam9iUGFyYW1zKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBqb2IucHJvY2VzcygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgICAgfSwge30pO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHByb2Nlc3Moam9iVHlwZTogVHlwZTxJSm9iPiwgcGFyYW1zOiBKb2JQYXJhbXMgPSB7fSk6IFByb21pc2U8YW55PiB7XHJcbiAgICAgICAgbGV0IGluc3RhbmNlOiBJSm9iID0gbnVsbDtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpbnN0YW5jZSA9IHRoaXMucmVzb2x2ZUpvYkluc3RhbmNlKGpvYlR5cGUsIHBhcmFtcyk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBjb25zdCBqb2JOYW1lID0gZ2V0Q29uc3RydWN0b3JOYW1lKGpvYlR5cGUpO1xyXG4gICAgICAgICAgICB0aHJvdyBgQ2FuJ3QgcmVzb2x2ZSBwYXJhbXMgZm9yIGpvYjogJHtqb2JOYW1lfSwgd2l0aCBwYXJhbXM6ICR7SlNPTi5zdHJpbmdpZnkocGFyYW1zKX0uIFJlYXNvbjogJHtlfWA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBpbnN0YW5jZS5wcm9jZXNzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgZW5xdWV1ZVdpdGhOYW1lKG5hbWU6IHN0cmluZywgcGFyYW1zOiBKb2JQYXJhbXMgPSB7fSk6IFByb21pc2U8YW55PiB7XHJcbiAgICAgICAgY29uc3Qgam9iTmFtZSA9IGF3YWl0IHRoaXMudHJ5UmVzb2x2ZUZyb21OYW1lKG5hbWUsIHBhcmFtcyk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VuZFRvV29ya2Vycyhqb2JOYW1lLCBwYXJhbXMpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGVucXVldWUoam9iVHlwZTogVHlwZTxJSm9iPiwgcGFyYW1zOiBKb2JQYXJhbXMgPSB7fSk6IFByb21pc2U8YW55PiB7XHJcbiAgICAgICAgY29uc3Qgam9iTmFtZSA9IGF3YWl0IHRoaXMudHJ5UmVzb2x2ZUFuZENvbm5lY3Qoam9iVHlwZSwgcGFyYW1zKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Xb3JrZXJzKGpvYk5hbWUsIHBhcmFtcyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGFzeW5jIHNlbmRUb1dvcmtlcnMoam9iTmFtZTogc3RyaW5nLCBwYXJhbXM6IEpvYlBhcmFtcyk6IFByb21pc2U8YW55PiB7XHJcbiAgICAgICAgY29uc3QgcHVibGlzaGVyID0gYXdhaXQgdGhpcy5zY2hlZHVsZXI7XHJcbiAgICAgICAgYXdhaXQgcHVibGlzaGVyLnNlbmQoW2pvYk5hbWUsIEpTT04uc3RyaW5naWZ5KHBhcmFtcyksIG5ldyBPYmplY3RJZCgpLnRvSGV4U3RyaW5nKCldKTtcclxuICAgIH1cclxuXHJcbiAgICBzY2hlZHVsZShtaW51dGU6IEpvYlNjaGVkdWxlVGltZSwgaG91cjogSm9iU2NoZWR1bGVUaW1lLCBkYXlPZk1vbnRoOiBKb2JTY2hlZHVsZVRpbWUsIG1vbnRoOiBKb2JTY2hlZHVsZVRpbWUsIGRheU9mV2VlazogSm9iU2NoZWR1bGVUaW1lLCBqb2JUeXBlOiBUeXBlPElKb2I+LCBwYXJhbXM6IEpvYlBhcmFtcyA9IHt9KTogSUpvYlRhc2sge1xyXG4gICAgICAgIGNvbnN0IGV4cHJlc3Npb24gPSBbbWludXRlLCBob3VyLCBkYXlPZk1vbnRoLCBtb250aCwgZGF5T2ZXZWVrXS5tYXAodCA9PiB7XHJcbiAgICAgICAgICAgIGlmIChpc09iamVjdCh0KSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcmFuZ2UgPSB0IGFzIEpvYlNjaGVkdWxlUmFuZ2U7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYCR7cmFuZ2UubWluIHx8IDB9LSR7cmFuZ2UubWF4IHx8IDB9YDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoaXNBcnJheSh0KSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHQuam9pbihcIixcIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGAke3R9YDtcclxuICAgICAgICB9KS5qb2luKFwiIFwiKTtcclxuICAgICAgICBjb25zdCBqb2JOYW1lID0gZ2V0Q29uc3RydWN0b3JOYW1lKGpvYlR5cGUpO1xyXG4gICAgICAgIGlmICghdmFsaWRhdGUoZXhwcmVzc2lvbikpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coYENhbid0IHNjaGVkdWxlIHRoZSB0YXNrOiAnJHtqb2JOYW1lfScgYmVjYXVzZSB0aW1lIGV4cHJlc3Npb24gaXMgaW52YWxpZC5gKTtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBzY2hlZHVsZShleHByZXNzaW9uLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuZW5xdWV1ZShqb2JUeXBlLCBwYXJhbXMpLmNhdGNoKGUgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coYENhbid0IGVucXVldWUgam9iOiAnJHtqb2JOYW1lfScgYmVjYXVzZTogJHtlfWApO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBzdGFydFByb2Nlc3NpbmcoKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgaG9zdCA9IHRoaXMuY29uZmlnLnJlc29sdmUoXCJ6bXFSZW1vdGVIb3N0XCIpO1xyXG4gICAgICAgIHRoaXMud29ya2VyID0gc29ja2V0KFwicHVsbFwiKTtcclxuICAgICAgICB0aGlzLndvcmtlci5jb25uZWN0KGhvc3QpO1xyXG4gICAgICAgIHRoaXMud29ya2VyLm9uKFwibWVzc2FnZVwiLCBhc3luYyAobmFtZTogQnVmZmVyLCBhcmdzOiBCdWZmZXIsIHVuaXF1ZUlkOiBCdWZmZXIpID0+IHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGpvYk5hbWUgPSBuYW1lLnRvU3RyaW5nKFwidXRmOFwiKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGpvYlBhcmFtcyA9IEpTT04ucGFyc2UoYXJncy50b1N0cmluZyhcInV0ZjhcIikpIGFzIEpvYlBhcmFtcztcclxuICAgICAgICAgICAgICAgIGNvbnN0IHRpbWVySWQgPSB1bmlxdWVJZD8udG9TdHJpbmcoXCJ1dGY4XCIpO1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgam9iTmFtZUxvZyA9IGBcXHgxYlszNm1cIiR7am9iTmFtZX1cIlxceDFiWzBtYDtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGpvYkFyZ3NMb2cgPSBgXFxuJHtqc29uSGlnaGxpZ2h0KGpvYlBhcmFtcyl9XFxuYDtcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLnRpbWUodGltZXJJZCk7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLnRpbWVMb2codGltZXJJZCwgYFN0YXJ0ZWQgd29ya2luZyBvbiBiYWNrZ3JvdW5kIGpvYjogJHtqb2JOYW1lTG9nfSB3aXRoIGFyZ3M6ICR7am9iQXJnc0xvZ31gKTtcclxuICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5yYWNlKFt0aGlzLmpvYnNbam9iTmFtZV0oam9iUGFyYW1zKSwgcHJvbWlzZVRpbWVvdXQoMTUwMDAsIHRydWUpXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS50aW1lTG9nKHRpbWVySWQsIGBGaW5pc2hlZCB3b3JraW5nIG9uIGJhY2tncm91bmQgam9iOiAke2pvYk5hbWVMb2d9IHdpdGggYXJnczogJHtqb2JBcmdzTG9nfWApO1xyXG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUudGltZUxvZyh0aW1lcklkLCBgQmFja2dyb3VuZCBqb2IgZmFpbGVkOiAke2pvYk5hbWVMb2d9IHdpdGggYXJnczogJHtqb2JBcmdzTG9nfSR7ZS5tZXNzYWdlfVxcblxcbmApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY29uc29sZS50aW1lRW5kKHRpbWVySWQpO1xyXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgRmFpbGVkIHRvIHN0YXJ0IGpvYjogJHtlLm1lc3NhZ2V9YCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICBjb25zb2xlLmxvZyhgV2FpdGluZyBmb3Igam9icyBhdDogJHtob3N0fWApO1xyXG4gICAgfVxyXG5cclxuICAgIHRyeVJlc29sdmUoam9iVHlwZTogVHlwZTxJSm9iPiwgcGFyYW1zOiBKb2JQYXJhbXMpOiBzdHJpbmcge1xyXG4gICAgICAgIGNvbnN0IGpvYk5hbWUgPSBnZXRDb25zdHJ1Y3Rvck5hbWUoam9iVHlwZSk7XHJcbiAgICAgICAgaWYgKCF0aGlzLmpvYnNbam9iTmFtZV0pIHtcclxuICAgICAgICAgICAgdGhyb3cgYENhbid0IGZpbmQgam9iIHdpdGggbmFtZTogJHtqb2JOYW1lfSBzbyBpdCBjYW4ndCBiZSBlbnF1ZXVlZCFgO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB0aGlzLnJlc29sdmVKb2JJbnN0YW5jZShqb2JUeXBlLCBwYXJhbXMpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgdGhyb3cgYENhbid0IHJlc29sdmUgcGFyYW1zIGZvciBqb2I6ICR7am9iTmFtZX0sIHdpdGggcGFyYW1zOiAke0pTT04uc3RyaW5naWZ5KHBhcmFtcyl9LiBSZWFzb246ICR7ZX1gO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gam9iTmFtZTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgdHJ5UmVzb2x2ZUZyb21OYW1lKGpvYk5hbWU6IHN0cmluZywgcGFyYW1zOiBKb2JQYXJhbXMpOiBQcm9taXNlPHN0cmluZz4ge1xyXG4gICAgICAgIGNvbnN0IGpvYlR5cGUgPSB0aGlzLmpvYlR5cGVzLmZpbmQodHlwZSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiBnZXRDb25zdHJ1Y3Rvck5hbWUodHlwZSkgPT0gam9iTmFtZTtcclxuICAgICAgICB9KTtcclxuICAgICAgICBpZiAoIWpvYlR5cGUpIHtcclxuICAgICAgICAgICAgdGhyb3cgYENhbid0IGZpbmQgam9iIHR5cGUgd2l0aCBuYW1lOiAke2pvYk5hbWV9IHNvIGl0IGNhbid0IGJlIGVucXVldWVkIWA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLnRyeVJlc29sdmVBbmRDb25uZWN0KGpvYlR5cGUsIHBhcmFtcyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGFzeW5jIHRyeVJlc29sdmVBbmRDb25uZWN0KGpvYlR5cGU6IFR5cGU8SUpvYj4sIHBhcmFtczogSm9iUGFyYW1zKTogUHJvbWlzZTxzdHJpbmc+IHtcclxuICAgICAgICB0aGlzLnNjaGVkdWxlciA9IHRoaXMuc2NoZWR1bGVyIHx8IG5ldyBQcm9taXNlPGFueT4oYXN5bmMgcmVzb2x2ZSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHBvcnQgPSB0aGlzLmNvbmZpZy5yZXNvbHZlKFwiem1xUG9ydFwiKTtcclxuICAgICAgICAgICAgY29uc3QgcHVibGlzaGVyID0gc29ja2V0KFwicHVzaFwiKTtcclxuICAgICAgICAgICAgYXdhaXQgcHVibGlzaGVyLmJpbmQoYHRjcDovLzAuMC4wLjA6JHtwb3J0fWApXHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBQdWJsaXNoZXIgYm91bmQgdG8gcG9ydDogJHtwb3J0fWApO1xyXG4gICAgICAgICAgICByZXNvbHZlKHB1Ymxpc2hlcik7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudHJ5UmVzb2x2ZShqb2JUeXBlLCBwYXJhbXMpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCByZXNvbHZlSm9iSW5zdGFuY2Uoam9iVHlwZTogVHlwZTxJSm9iPiwgcGFyYW1zOiBKb2JQYXJhbXMpOiBJSm9iIHtcclxuICAgICAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLmNvbnRhaW5lci5jcmVhdGVDaGlsZENvbnRhaW5lcigpO1xyXG4gICAgICAgIE9iamVjdC5rZXlzKHBhcmFtcykubWFwKChuYW1lKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnRhaW5lci5yZWdpc3RlcihuYW1lLCB7dXNlVmFsdWU6IHBhcmFtc1tuYW1lXX0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGNvbnRhaW5lci5yZWdpc3Rlcihqb2JUeXBlLCBqb2JUeXBlKTtcclxuICAgICAgICByZXR1cm4gY29udGFpbmVyLnJlc29sdmUoam9iVHlwZSkgYXMgSUpvYjtcclxuICAgIH1cclxufVxyXG4iXX0=