@dollhousemcp/mcp-server 2.0.18 → 2.0.19

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/dist/generated/version.d.ts +2 -2
  3. package/dist/generated/version.js +3 -3
  4. package/dist/handlers/ElementCRUDHandler.d.ts +30 -0
  5. package/dist/handlers/ElementCRUDHandler.d.ts.map +1 -1
  6. package/dist/handlers/ElementCRUDHandler.js +141 -2
  7. package/dist/handlers/mcp-aql/MCPAQLHandler.d.ts +3 -0
  8. package/dist/handlers/mcp-aql/MCPAQLHandler.d.ts.map +1 -1
  9. package/dist/handlers/mcp-aql/MCPAQLHandler.js +98 -1
  10. package/dist/handlers/mcp-aql/OperationRouter.d.ts.map +1 -1
  11. package/dist/handlers/mcp-aql/OperationRouter.js +6 -1
  12. package/dist/handlers/mcp-aql/OperationSchema.d.ts.map +1 -1
  13. package/dist/handlers/mcp-aql/OperationSchema.js +17 -1
  14. package/dist/handlers/mcp-aql/policies/AgentToolPolicyTranslator.d.ts.map +1 -1
  15. package/dist/handlers/mcp-aql/policies/AgentToolPolicyTranslator.js +2 -1
  16. package/dist/handlers/mcp-aql/policies/ElementPolicies.d.ts.map +1 -1
  17. package/dist/handlers/mcp-aql/policies/ElementPolicies.js +2 -1
  18. package/dist/handlers/mcp-aql/policies/OperationPolicies.d.ts.map +1 -1
  19. package/dist/handlers/mcp-aql/policies/OperationPolicies.js +6 -1
  20. package/dist/handlers/mcp-aql/policies/ToolClassification.d.ts.map +1 -1
  21. package/dist/handlers/mcp-aql/policies/ToolClassification.js +2 -1
  22. package/dist/server/tools/MCPAQLTools.js +2 -1
  23. package/dist/web/console/IngestRoutes.d.ts +6 -0
  24. package/dist/web/console/IngestRoutes.d.ts.map +1 -1
  25. package/dist/web/console/IngestRoutes.js +38 -9
  26. package/dist/web/console/LeaderElection.d.ts +39 -0
  27. package/dist/web/console/LeaderElection.d.ts.map +1 -1
  28. package/dist/web/console/LeaderElection.js +147 -29
  29. package/dist/web/console/LeaderForwardingSink.d.ts.map +1 -1
  30. package/dist/web/console/LeaderForwardingSink.js +5 -1
  31. package/dist/web/console/PromotionManager.d.ts.map +1 -1
  32. package/dist/web/console/PromotionManager.js +3 -11
  33. package/dist/web/public/app.js +62 -1
  34. package/dist/web/public/index.html +19 -17
  35. package/dist/web/public/sessions.js +111 -0
  36. package/dist/web/server.d.ts.map +1 -1
  37. package/dist/web/server.js +12 -10
  38. package/package.json +1 -1
  39. package/server.json +2 -2
@@ -22,7 +22,9 @@ import { join } from 'node:path';
22
22
  import { mkdir, readFile, writeFile, rename, unlink } from 'node:fs/promises';
23
23
  import { UnicodeValidator } from '../../security/validators/unicodeValidator.js';
24
24
  import { env } from '../../config/env.js';
25
+ import { PACKAGE_VERSION } from '../../generated/version.js';
25
26
  import { logger } from '../../utils/logger.js';
27
+ import { compareVersions } from '../../utils/version.js';
26
28
  /** Directory for runtime state files */
27
29
  const RUN_DIR = join(homedir(), '.dollhouse', 'run');
28
30
  /**
@@ -54,6 +56,15 @@ const HEARTBEAT_INTERVAL_MS = 10_000;
54
56
  const HEARTBEAT_STALE_MS = 30_000;
55
57
  /** Current lock file schema version */
56
58
  export const LOCK_VERSION = 1;
59
+ /**
60
+ * Version of the leader-election/session metadata contract used by the
61
+ * authenticated web console. Older leaders will not have this field.
62
+ */
63
+ export const CONSOLE_PROTOCOL_VERSION = 1;
64
+ /** Missing protocol metadata means the leader predates version-aware election. */
65
+ export const LEGACY_CONSOLE_PROTOCOL_VERSION = 0;
66
+ /** Old lock files do not carry package version metadata. Treat them as oldest. */
67
+ export const LEGACY_SERVER_VERSION = '0.0.0';
57
68
  /**
58
69
  * Check whether a process with the given PID is alive.
59
70
  * Uses signal 0 which checks existence without sending a signal.
@@ -68,6 +79,95 @@ export function isProcessAlive(pid) {
68
79
  return err?.code === 'EPERM';
69
80
  }
70
81
  }
82
+ /**
83
+ * Normalize the server version present in the leader lock.
84
+ * Missing metadata means "legacy leader" for election purposes.
85
+ */
86
+ export function getLeaderServerVersion(info) {
87
+ if (typeof info.serverVersion === 'string' && info.serverVersion.trim().length > 0) {
88
+ return info.serverVersion.trim();
89
+ }
90
+ return LEGACY_SERVER_VERSION;
91
+ }
92
+ /**
93
+ * Normalize the console protocol version present in the leader lock.
94
+ * Missing metadata means a leader from before version-aware election.
95
+ */
96
+ export function getLeaderConsoleProtocolVersion(info) {
97
+ const raw = info.consoleProtocolVersion;
98
+ if (typeof raw === 'number' && Number.isInteger(raw) && raw >= 0) {
99
+ return raw;
100
+ }
101
+ return LEGACY_CONSOLE_PROTOCOL_VERSION;
102
+ }
103
+ /**
104
+ * Create this process's leader metadata in one place so all leadership paths
105
+ * publish the same version and protocol information.
106
+ */
107
+ export function createLeaderInfo(sessionId, port) {
108
+ const now = new Date().toISOString();
109
+ return {
110
+ version: LOCK_VERSION,
111
+ pid: process.pid,
112
+ port,
113
+ sessionId: UnicodeValidator.normalize(sessionId).normalizedContent,
114
+ startedAt: now,
115
+ heartbeat: now,
116
+ serverVersion: PACKAGE_VERSION,
117
+ consoleProtocolVersion: CONSOLE_PROTOCOL_VERSION,
118
+ };
119
+ }
120
+ /**
121
+ * Decide whether this process should replace the current live leader based on
122
+ * compatibility first, then package version.
123
+ */
124
+ export function evaluateLeaderPreference(candidate, existing) {
125
+ const candidateVersion = getLeaderServerVersion(candidate);
126
+ const existingVersion = getLeaderServerVersion(existing);
127
+ const candidateProtocolVersion = getLeaderConsoleProtocolVersion(candidate);
128
+ const existingProtocolVersion = getLeaderConsoleProtocolVersion(existing);
129
+ const compatible = existingProtocolVersion === candidateProtocolVersion ||
130
+ existingProtocolVersion === LEGACY_CONSOLE_PROTOCOL_VERSION;
131
+ if (!compatible) {
132
+ return {
133
+ shouldReplace: false,
134
+ reason: 'incompatible-protocol',
135
+ candidateVersion,
136
+ existingVersion,
137
+ candidateProtocolVersion,
138
+ existingProtocolVersion,
139
+ };
140
+ }
141
+ const versionComparison = compareVersions(candidateVersion, existingVersion);
142
+ if (versionComparison > 0) {
143
+ return {
144
+ shouldReplace: true,
145
+ reason: 'newer-compatible-version',
146
+ candidateVersion,
147
+ existingVersion,
148
+ candidateProtocolVersion,
149
+ existingProtocolVersion,
150
+ };
151
+ }
152
+ if (versionComparison === 0) {
153
+ return {
154
+ shouldReplace: false,
155
+ reason: 'same-version',
156
+ candidateVersion,
157
+ existingVersion,
158
+ candidateProtocolVersion,
159
+ existingProtocolVersion,
160
+ };
161
+ }
162
+ return {
163
+ shouldReplace: false,
164
+ reason: 'older-version',
165
+ candidateVersion,
166
+ existingVersion,
167
+ candidateProtocolVersion,
168
+ existingProtocolVersion,
169
+ };
170
+ }
71
171
  /**
72
172
  * Detect whether a legacy (pre-authentication) DollhouseMCP console is
73
173
  * currently running on this machine (#1794).
@@ -118,7 +218,13 @@ export async function readLeaderLock() {
118
218
  }
119
219
  return data;
120
220
  }
121
- catch {
221
+ catch (error) {
222
+ if (error.code !== 'ENOENT') {
223
+ logger.debug('[LeaderElection] Ignoring unreadable or invalid leader lock', {
224
+ lockFile: LOCK_FILE,
225
+ error: error instanceof Error ? error.message : String(error),
226
+ });
227
+ }
122
228
  return null;
123
229
  }
124
230
  }
@@ -180,17 +286,46 @@ export async function deleteLeaderLock() {
180
286
  * @returns Election result with role and leader info
181
287
  */
182
288
  export async function electLeader(sessionId, port) {
183
- sessionId = UnicodeValidator.normalize(sessionId).normalizedContent;
289
+ const myInfo = createLeaderInfo(sessionId, port);
290
+ sessionId = myInfo.sessionId;
184
291
  const existingLock = await readLeaderLock();
185
292
  if (existingLock && !isLockStale(existingLock)) {
186
- logger.info('[LeaderElection] Existing leader found — becoming follower', {
187
- leaderSession: existingLock.sessionId, leaderPid: existingLock.pid,
188
- leaderPort: existingLock.port, mySession: sessionId, myPid: process.pid,
189
- });
190
- return { role: 'follower', leaderInfo: existingLock };
293
+ const preference = evaluateLeaderPreference(myInfo, existingLock);
294
+ if (preference.shouldReplace) {
295
+ logger.info('[LeaderElection] Replacing leader with newer compatible version', {
296
+ staleSession: existingLock.sessionId,
297
+ stalePid: existingLock.pid,
298
+ stalePort: existingLock.port,
299
+ staleVersion: preference.existingVersion,
300
+ staleProtocolVersion: preference.existingProtocolVersion,
301
+ mySession: sessionId,
302
+ myPid: process.pid,
303
+ myVersion: preference.candidateVersion,
304
+ myProtocolVersion: preference.candidateProtocolVersion,
305
+ });
306
+ await deleteLeaderLock();
307
+ }
308
+ else {
309
+ logger.info('[LeaderElection] Existing leader found — becoming follower', {
310
+ leaderSession: existingLock.sessionId,
311
+ leaderPid: existingLock.pid,
312
+ leaderPort: existingLock.port,
313
+ leaderVersion: preference.existingVersion,
314
+ leaderProtocolVersion: preference.existingProtocolVersion,
315
+ mySession: sessionId,
316
+ myPid: process.pid,
317
+ myVersion: preference.candidateVersion,
318
+ myProtocolVersion: preference.candidateProtocolVersion,
319
+ reason: preference.reason,
320
+ });
321
+ return { role: 'follower', leaderInfo: existingLock };
322
+ }
191
323
  }
192
- // No valid leader — try to claim
193
- if (existingLock) {
324
+ if (existingLock && !isLockStale(existingLock)) {
325
+ // Leader was intentionally replaced above. Continue to the claim path.
326
+ }
327
+ else if (existingLock) {
328
+ // No valid leader — try to claim
194
329
  const alive = isProcessAlive(existingLock.pid);
195
330
  const heartbeatAge = Date.now() - new Date(existingLock.heartbeat).getTime();
196
331
  logger.info('[LeaderElection] Stale leader lock — taking over', {
@@ -199,15 +334,6 @@ export async function electLeader(sessionId, port) {
199
334
  });
200
335
  await deleteLeaderLock();
201
336
  }
202
- const now = new Date().toISOString();
203
- const myInfo = {
204
- version: LOCK_VERSION,
205
- pid: process.pid,
206
- port,
207
- sessionId,
208
- startedAt: now,
209
- heartbeat: now,
210
- };
211
337
  const claimed = await claimLeadership(myInfo);
212
338
  if (claimed) {
213
339
  logger.info('[LeaderElection] Claimed leadership', { sessionId, port, pid: process.pid });
@@ -223,7 +349,7 @@ export async function electLeader(sessionId, port) {
223
349
  }
224
350
  // Extremely unlikely: lock disappeared between our claim and re-read. Retry once.
225
351
  logger.warn('[LeaderElection] Lock vanished after failed claim. Retrying.');
226
- const retryInfo = { ...myInfo, heartbeat: new Date().toISOString() };
352
+ const retryInfo = { ...createLeaderInfo(sessionId, port) };
227
353
  const retryClaimed = await claimLeadership(retryInfo);
228
354
  if (retryClaimed) {
229
355
  return { role: 'leader', leaderInfo: retryInfo };
@@ -256,15 +382,7 @@ export async function isLeaderWebConsoleReachable(leaderInfo) {
256
382
  export async function forceClaimLeadership(sessionId, port) {
257
383
  logger.info('[LeaderElection] Forcing leadership takeover — existing leader has no web console');
258
384
  await deleteLeaderLock();
259
- const now = new Date().toISOString();
260
- const myInfo = {
261
- version: LOCK_VERSION,
262
- pid: process.pid,
263
- port,
264
- sessionId: UnicodeValidator.normalize(sessionId).normalizedContent,
265
- startedAt: now,
266
- heartbeat: now,
267
- };
385
+ const myInfo = createLeaderInfo(sessionId, port);
268
386
  const claimed = await claimLeadership(myInfo);
269
387
  if (claimed) {
270
388
  logger.info('[LeaderElection] Forced leadership claimed', { sessionId, port, pid: process.pid });
@@ -307,4 +425,4 @@ export function registerLeaderCleanup() {
307
425
  process.once('SIGINT', cleanup);
308
426
  process.once('SIGHUP', cleanup);
309
427
  }
310
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTGVhZGVyRWxlY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvd2ViL2NvbnNvbGUvTGVhZGVyRWxlY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtCRztBQUVILE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDbEMsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzlFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLCtDQUErQyxDQUFDO0FBQ2pGLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUMxQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFL0Msd0NBQXdDO0FBQ3hDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRSxZQUFZLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFFckQ7Ozs7Ozs7Ozs7R0FVRztBQUNILE1BQU0scUJBQXFCLEdBQUcsMEJBQTBCLENBQUM7QUFFekQseUZBQXlGO0FBQ3pGLE1BQU0sb0JBQW9CLEdBQUcscUJBQXFCLENBQUM7QUFFbkQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFNBQVMsR0FBRyxHQUFHLENBQUMsa0NBQWtDLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO0FBRWpHLGlGQUFpRjtBQUNqRixNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsb0JBQW9CLENBQUMsQ0FBQztBQUU3RCxzREFBc0Q7QUFDdEQsTUFBTSxxQkFBcUIsR0FBRyxNQUFNLENBQUM7QUFFckMsMkRBQTJEO0FBQzNELE1BQU0sa0JBQWtCLEdBQUcsTUFBTSxD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QUFRLENBQUMsQ0FBQztBQUN2QyxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLHFCQUFxQjtJQUNuQyxNQUFNLE9BQU8sR0FBRyxHQUFHLEVBQUUsR0FBRyxnQkFBZ0IsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsR0FBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM5RCxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztJQUM5QixPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUNqQyxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUNoQyxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUNsQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBMZWFkZXIgZWxlY3Rpb24gZm9yIHRoZSB1bmlmaWVkIHdlYiBjb25zb2xlLlxuICpcbiAqIFdoZW4gbXVsdGlwbGUgTUNQIHNlcnZlciBpbnN0YW5jZXMgcnVuIGNvbmN1cnJlbnRseSwgb25seSBvbmUgc2hvdWxkIGhvc3RcbiAqIHRoZSB3ZWIgY29uc29sZSAodGhlIFwibGVhZGVyXCIpLiBPdGhlcnMgYmVjb21lIFwiZm9sbG93ZXJzXCIgdGhhdCBmb3J3YXJkXG4gKiBldmVudHMgdG8gdGhlIGxlYWRlci4gVGhpcyBtb2R1bGUgaGFuZGxlczpcbiAqXG4gKiAxLiBSZWFkaW5nL3dyaXRpbmcgYSBsZWFkZXIgbG9jayBmaWxlIGF0IH4vLmRvbGxob3VzZS9ydW4vY29uc29sZS1sZWFkZXIubG9ja1xuICogMi4gQXRvbWljIGNsYWltIHZpYSB0ZW1wK3JlbmFtZSB0byBwcmV2ZW50IFRPQ1RPVSByYWNlc1xuICogMy4gUElELWJhc2VkIHN0YWxlIGRldGVjdGlvbiAoc2lnbmFsLTAgbGl2ZW5lc3MgY2hlY2spXG4gKiA0LiBIZWFydGJlYXQgdXBkYXRlcyAoMTBzIGludGVydmFsKSBzbyBmb2xsb3dlcnMgY2FuIGRldGVjdCBodW5nIGxlYWRlcnNcbiAqIDUuIENsZWFudXAgb24gcHJvY2VzcyBleGl0XG4gKlxuICogVGhlIGNvbmZpZ3VyZWQgcG9ydCBiaW5kaW5nIGlzIHRoZSB1bHRpbWF0ZSB0aWVicmVha2VyOiBldmVuIGlmIHR3b1xuICogcHJvY2Vzc2VzIGJvdGggd3JpdGUgdGhlIGxvY2sgZmlsZSwgb25seSBvbmUgY2FuIGJpbmQgdGhlIHBvcnQgKHNlZVxuICogYERPTExIT1VTRV9XRUJfQ09OU09MRV9QT1JUYCBpbiBgc3JjL2NvbmZpZy9lbnYudHNgKS5cbiAqXG4gKiBAc2luY2UgdjIuMS4wIOKAlCBJc3N1ZSAjMTcwMFxuICovXG5cbmltcG9ydCB7IGhvbWVkaXIgfSBmcm9tICdub2RlOm9zJztcbmltcG9ydCB7IGpvaW4gfSBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHsgbWtkaXIsIHJlYWRGaWxlLCB3cml0ZUZpbGUsIHJlbmFtZSwgdW5saW5rIH0gZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgeyBVbmljb2RlVmFsaWRhdG9yIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvdmFsaWRhdG9ycy91bmljb2RlVmFsaWRhdG9yLmpzJztcbmltcG9ydCB7IGVudiB9IGZyb20gJy4uLy4uL2NvbmZpZy9lbnYuanMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vLi4vdXRpbHMvbG9nZ2VyLmpzJztcblxuLyoqIERpcmVjdG9yeSBmb3IgcnVudGltZSBzdGF0ZSBmaWxlcyAqL1xuY29uc3QgUlVOX0RJUiA9IGpvaW4oaG9tZWRpcigpLCAnLmRvbGxob3VzZScsICdydW4nKTtcblxuLyoqXG4gKiBCdWlsdC1pbiBkZWZhdWx0IGZpbGVuYW1lIGZvciB0aGUgYXV0aGVudGljYXRlZCBjb25zb2xlJ3MgbGVhZGVyIGxvY2suXG4gKlxuICogVGhlIGAuYXV0aGAgc3VmZml4IGlzb2xhdGVzIHRoaXMgZnJvbSBhbnkgbGVnYWN5IG5vLWF1dGhlbnRpY2F0aW9uXG4gKiBEb2xsaG91c2VNQ1AgaW5zdGFsbGF0aW9uIHRoYXQgbWF5IGFsc28gYmUgcnVubmluZyBvbiB0aGUgc2FtZVxuICogbWFjaGluZS4gVGhvc2Ugb2xkZXIgaW5zdGFsbHMgdXNlIGBjb25zb2xlLWxlYWRlci5sb2NrYCAobm8gc3VmZml4KTtcbiAqIHRoZSBhdXRoZW50aWNhdGVkIGNvbnNvbGUgdXNlcyBgY29uc29sZS1sZWFkZXIuYXV0aC5sb2NrYC4gQ29tYmluZWRcbiAqIHdpdGggdGhlIHBvcnQgc2VwYXJhdGlvbiwgdGhpcyBtZWFucyB0aGUgdHdvIGdlbmVyYXRpb25zIG9mIHRoZVxuICogY29uc29sZSBjYW4gY29leGlzdCB3aXRoIHplcm8gaW50ZXJmZXJlbmNlIOKAlCBkaWZmZXJlbnQgcG9ydCwgZGlmZmVyZW50XG4gKiBsb2NrIGZpbGUsIGRpZmZlcmVudCB0b2tlbiBmaWxlLCBpbmRlcGVuZGVudCBsZWFkZXIgZWxlY3Rpb24gc3BhY2VzLlxuICovXG5jb25zdCBERUZBVUxUX0xPQ0tfRklMRU5BTUUgPSAnY29uc29sZS1sZWFkZXIuYXV0aC5sb2NrJztcblxuLyoqIExlZ2FjeSBsb2NrIGZpbGVuYW1lIGZyb20gdGhlIHByZS1hdXRoZW50aWNhdGlvbiBjb25zb2xlLiBVc2VkIG9ubHkgZm9yIGRldGVjdGlvbi4gKi9cbmNvbnN0IExFR0FDWV9MT0NLX0ZJTEVOQU1FID0gJ2NvbnNvbGUtbGVhZGVyLmxvY2snO1xuXG4vKipcbiAqIFBhdGggdG8gdGhlIGxlYWRlciBsb2NrIGZpbGUuIFByZWZlcnMgdGhlIGBET0xMSE9VU0VfQ09OU09MRV9MRUFERVJfTE9DS19GSUxFYFxuICogZW52IHZhciB3aGVuIHNldCwgb3RoZXJ3aXNlIHVzZXMgYERFRkFVTFRfTE9DS19GSUxFTkFNRWAgdW5kZXIgUlVOX0RJUi5cbiAqIFRoZSBlbnYgdmFyIGlzIHRoZSBzaW5nbGUgc291cmNlIG9mIHRydXRoIHdoZW4gcHJlc2VudCwgc28gYSBkZXBsb3ltZW50XG4gKiBjYW4gcmVsb2NhdGUgdGhlIGxvY2sgd2l0aG91dCBjb2RlIGNoYW5nZXMgKHNlZSBgc3JjL2NvbmZpZy9lbnYudHNgKS5cbiAqL1xuY29uc3QgTE9DS19GSUxFID0gZW52LkRPTExIT1VTRV9DT05TT0xFX0xFQURFUl9MT0NLX0ZJTEUgPz8gam9pbihSVU5fRElSLCBERUZBVUxUX0xPQ0tfRklMRU5BTUUpO1xuXG4vKiogUGF0aCB0byB0aGUgbGVnYWN5IHByZS1hdXRoIGxvY2sgZmlsZSAodXNlZCBieSBgZGV0ZWN0TGVnYWN5TGVhZGVyYCBvbmx5KS4gKi9cbmNvbnN0IExFR0FDWV9MT0NLX0ZJTEUgPSBqb2luKFJVTl9ESVIsIExFR0FDWV9MT0NLX0ZJTEVOQU1FKTtcblxuLyoqIEhvdyBvZnRlbiB0aGUgbGVhZGVyIHVwZGF0ZXMgaXRzIGhlYXJ0YmVhdCAobXMpICovXG5jb25zdCBIRUFSVEJFQVRfSU5URVJWQUxfTVMgPSAxMF8wMDA7XG5cbi8qKiBIb3cgbG9uZyBiZWZvcmUgYSBoZWFydGJlYXQgaXMgY29uc2lkZXJlZCBzdGFsZSAobXMpICovXG5jb25zdCBIRUFSVEJFQVRfU1RBTEVfTVMgPSAzMF8wMDA7XG5cbi8qKiBDdXJyZW50IGxvY2sgZmlsZSBzY2hlbWEgdmVyc2lvbiAqL1xuZXhwb3J0IGNvbnN0IExPQ0tfVkVSU0lPTiA9IDE7XG5cbi8qKlxuICogSW5mb3JtYXRpb24gc3RvcmVkIGluIHRoZSBsZWFkZXIgbG9jayBmaWxlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbnNvbGVMZWFkZXJJbmZvIHtcbiAgdmVyc2lvbjogbnVtYmVyO1xuICBwaWQ6IG51bWJlcjtcbiAgcG9ydDogbnVtYmVyO1xuICBzZXNzaW9uSWQ6IHN0cmluZztcbiAgc3RhcnRlZEF0OiBzdHJpbmc7XG4gIGhlYXJ0YmVhdDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFJlc3VsdCBvZiBhIGxlYWRlciBlbGVjdGlvbiBhdHRlbXB0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVsZWN0aW9uUmVzdWx0IHtcbiAgcm9sZTogJ2xlYWRlcicgfCAnZm9sbG93ZXInO1xuICAvKiogTGVhZGVyIGluZm8g4oCUIGZvciBmb2xsb3dlcnMsIHRoaXMgaXMgdGhlIGV4aXN0aW5nIGxlYWRlcidzIGluZm8gKi9cbiAgbGVhZGVySW5mbzogQ29uc29sZUxlYWRlckluZm87XG59XG5cbi8qKlxuICogQ2hlY2sgd2hldGhlciBhIHByb2Nlc3Mgd2l0aCB0aGUgZ2l2ZW4gUElEIGlzIGFsaXZlLlxuICogVXNlcyBzaWduYWwgMCB3aGljaCBjaGVja3MgZXhpc3RlbmNlIHdpdGhvdXQgc2VuZGluZyBhIHNpZ25hbC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUHJvY2Vzc0FsaXZlKHBpZDogbnVtYmVyKTogYm9vbGVhbiB7XG4gIHRyeSB7XG4gICAgcHJvY2Vzcy5raWxsKHBpZCwgMCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgLy8gRVBFUk0gPSBwcm9jZXNzIGV4aXN0cyBidXQgb3duZWQgYnkgYW5vdGhlciB1c2VyIOKAlCBzdGlsbCBhbGl2ZVxuICAgIHJldHVybiBlcnI/LmNvZGUgPT09ICdFUEVSTSc7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXN1bHQgb2YgYSBsZWdhY3ktbGVhZGVyIGRldGVjdGlvbiBzY2FuLlxuICogYGxlZ2FjeVJ1bm5pbmcgPT09IHRydWVgIG1lYW5zIGEgcHJlLWF1dGhlbnRpY2F0aW9uIERvbGxob3VzZU1DUCBjb25zb2xlXG4gKiBpcyBjdXJyZW50bHkgcnVubmluZyBvbiB0aGlzIG1hY2hpbmUgKGl0cyBsb2NrIGZpbGUgZXhpc3RzIGFuZCBpdHMgcGlkXG4gKiBpcyBhbGl2ZSkuIENhbGxlcnMgY2FuIHN1cmZhY2UgdGhpcyB0byB0aGUgdXNlciBhcyBhIHdhcm5pbmcuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGVnYWN5TGVhZGVySW5mbyB7XG4gIGxlZ2FjeVJ1bm5pbmc6IGJvb2xlYW47XG4gIHBpZD86IG51bWJlcjtcbiAgcG9ydD86IG51bWJlcjtcbiAgbG9ja1BhdGg6IHN0cmluZztcbn1cblxuLyoqXG4gKiBEZXRlY3Qgd2hldGhlciBhIGxlZ2FjeSAocHJlLWF1dGhlbnRpY2F0aW9uKSBEb2xsaG91c2VNQ1AgY29uc29sZSBpc1xuICogY3VycmVudGx5IHJ1bm5pbmcgb24gdGhpcyBtYWNoaW5lICgjMTc5NCkuXG4gKlxuICogVGhlIHByZS1hdXRoZW50aWNhdGlvbiBjb25zb2xlIHdyaXRlcyBpdHMgbG9jayB0b1xuICogYH4vLmRvbGxob3VzZS9ydW4vY29uc29sZS1sZWFkZXIubG9ja2AgKG5vIGAuYXV0aGAgc3VmZml4KS4gQW5cbiAqIGF1dGhlbnRpY2F0ZWQgY29uc29sZSBvbiBhIGRpZmZlcmVudCBwb3J0IHdpbGwgbm90IGludGVyZmVyZSB3aXRoXG4gKiBpdCDigJQgdGhleSBoYXZlIGZ1bGx5IGluZGVwZW5kZW50IHBvcnRzLCBsb2NrIGZpbGVzLCBhbmQgdG9rZW4gZmlsZXMg4oCUXG4gKiBidXQgdGhlIHVzZXIgcHJvYmFibHkgd2FudHMgdG8ga25vdyB0aGUgdHdvIGV4aXN0IHNpbXVsdGFuZW91c2x5XG4gKiBiZWNhdXNlIHRoZSBzZWN1cml0eSBwb3N0dXJlIG9mIGVhY2ggY29uc29sZSBpcyBkaWZmZXJlbnQuXG4gKlxuICogUmV0dXJucyBpbmZvIGFib3V0IHRoZSBsZWdhY3kgbGVhZGVyIGlmIG9uZSBpcyBkZXRlY3RlZCwgb3JcbiAqIGB7IGxlZ2FjeVJ1bm5pbmc6IGZhbHNlIH1gIG90aGVyd2lzZS5cbiAqXG4gKiBAcGFyYW0gbG9ja1BhdGggLSBPcHRpb25hbCBvdmVycmlkZSBmb3IgdGhlIGxlZ2FjeSBsb2NrIGZpbGUgcGF0aC5cbiAqICAgICAgICAgICAgICAgICAgIERlZmF1bHRzIHRvIHRoZSBidWlsdC1pbiBsZWdhY3kgbG9jYXRpb24uIFByaW1hcmlseVxuICogICAgICAgICAgICAgICAgICAgdXNlZCBieSB0ZXN0cyB0byBwb2ludCBhdCBhIHRlbXAgZGlyZWN0b3J5LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGV0ZWN0TGVnYWN5TGVhZGVyKGxvY2tQYXRoOiBzdHJpbmcgPSBMRUdBQ1lfTE9DS19GSUxFKTogUHJvbWlzZTxMZWdhY3lMZWFkZXJJbmZvPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgY29udGVudCA9IGF3YWl0IHJlYWRGaWxlKGxvY2tQYXRoLCAndXRmLTgnKTtcbiAgICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZShjb250ZW50KSBhcyBDb25zb2xlTGVhZGVySW5mbztcbiAgICBpZiAoIWRhdGEucGlkIHx8ICFpc1Byb2Nlc3NBbGl2ZShkYXRhLnBpZCkpIHtcbiAgICAgIHJldHVybiB7IGxlZ2FjeVJ1bm5pbmc6IGZhbHNlLCBsb2NrUGF0aCB9O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgbGVnYWN5UnVubmluZzogdHJ1ZSxcbiAgICAgIHBpZDogZGF0YS5waWQsXG4gICAgICBwb3J0OiBkYXRhLnBvcnQsXG4gICAgICBsb2NrUGF0aCxcbiAgICB9O1xuICB9IGNhdGNoIHtcbiAgICAvLyBGaWxlIG1pc3NpbmcsIHVucmVhZGFibGUsIG9yIGludmFsaWQgSlNPTiDigJQgbm8gbGVnYWN5IGxlYWRlciBkZXRlY3RlZFxuICAgIHJldHVybiB7IGxlZ2FjeVJ1bm5pbmc6IGZhbHNlLCBsb2NrUGF0aCB9O1xuICB9XG59XG5cbi8qKlxuICogUmVhZCBhbmQgcGFyc2UgdGhlIGxlYWRlciBsb2NrIGZpbGUuXG4gKiBSZXR1cm5zIG51bGwgaWYgdGhlIGZpbGUgZG9lc24ndCBleGlzdCwgaXMgdW5yZWFkYWJsZSwgb3IgaGFzIGludmFsaWQgY29udGVudC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWRMZWFkZXJMb2NrKCk6IFByb21pc2U8Q29uc29sZUxlYWRlckluZm8gfCBudWxsPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgY29udGVudCA9IGF3YWl0IHJlYWRGaWxlKExPQ0tfRklMRSwgJ3V0Zi04Jyk7XG4gICAgY29uc3QgZGF0YSA9IEpTT04ucGFyc2UoY29udGVudCkgYXMgQ29uc29sZUxlYWRlckluZm87XG4gICAgaWYgKGRhdGEudmVyc2lvbiAhPT0gTE9DS19WRVJTSU9OIHx8ICFkYXRhLnBpZCB8fCAhZGF0YS5wb3J0IHx8ICFkYXRhLnNlc3Npb25JZCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBkYXRhO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG4vKipcbiAqIENoZWNrIGlmIGEgbGVhZGVyIGxvY2sgaXMgc3RhbGUgKGRlYWQgcHJvY2VzcyBvciBleHBpcmVkIGhlYXJ0YmVhdCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0xvY2tTdGFsZShpbmZvOiBDb25zb2xlTGVhZGVySW5mbyk6IGJvb2xlYW4ge1xuICBpZiAoIWlzUHJvY2Vzc0FsaXZlKGluZm8ucGlkKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGNvbnN0IGhlYXJ0YmVhdEFnZSA9IERhdGUubm93KCkgLSBuZXcgRGF0ZShpbmZvLmhlYXJ0YmVhdCkuZ2V0VGltZSgpO1xuICByZXR1cm4gaGVhcnRiZWF0QWdlID4gSEVBUlRCRUFUX1NUQUxFX01TO1xufVxuXG4vKipcbiAqIEF0dGVtcHQgdG8gYXRvbWljYWxseSBjbGFpbSBsZWFkZXJzaGlwLlxuICpcbiAqIFdyaXRlcyB0byBhIHRlbXAgZmlsZSB0aGVuIHJlbmFtZXMgdG8gdGhlIGxvY2sgcGF0aC4gT24gUE9TSVggc3lzdGVtc1xuICogcmVuYW1lIGlzIGF0b21pYywgc28gb25seSBvbmUgd3JpdGVyIHdpbnMuIEFmdGVyIHJlbmFtaW5nLCByZS1yZWFkcyB0aGVcbiAqIGxvY2sgdG8gdmVyaWZ5IG91ciBQSUQgd29uLlxuICpcbiAqIEByZXR1cm5zIHRydWUgaWYgdGhpcyBwcm9jZXNzIHN1Y2Nlc3NmdWxseSBjbGFpbWVkIGxlYWRlcnNoaXBcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNsYWltTGVhZGVyc2hpcChpbmZvOiBDb25zb2xlTGVhZGVySW5mbyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBhd2FpdCBta2RpcihSVU5fRElSLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgY29uc3QgdG1wRmlsZSA9IGpvaW4oUlVOX0RJUiwgYGNvbnNvbGUtbGVhZGVyLmxvY2suJHtwcm9jZXNzLnBpZH0udG1wYCk7XG4gIHRyeSB7XG4gICAgYXdhaXQgd3JpdGVGaWxlKHRtcEZpbGUsIEpTT04uc3RyaW5naWZ5KGluZm8sIG51bGwsIDIpLCAndXRmLTgnKTtcbiAgICBhd2FpdCByZW5hbWUodG1wRmlsZSwgTE9DS19GSUxFKTtcblxuICAgIC8vIFZlcmlmeSB3ZSB3b24gdGhlIHJhY2VcbiAgICBjb25zdCB3cml0dGVuID0gYXdhaXQgcmVhZExlYWRlckxvY2soKTtcbiAgICByZXR1cm4gd3JpdHRlbiAhPT0gbnVsbCAmJiB3cml0dGVuLnBpZCA9PT0gaW5mby5waWQ7XG4gIH0gY2F0Y2gge1xuICAgIC8vIENsZWFuIHVwIHRlbXAgZmlsZSBvbiBmYWlsdXJlXG4gICAgdHJ5IHsgYXdhaXQgdW5saW5rKHRtcEZpbGUpOyB9IGNhdGNoIHsgLyogaWdub3JlICovIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBEZWxldGUgdGhlIGxlYWRlciBsb2NrIGZpbGUgKGZvciBjbGVhbnVwIG9yIHRha2VvdmVyKS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlbGV0ZUxlYWRlckxvY2soKTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7IGF3YWl0IHVubGluayhMT0NLX0ZJTEUpOyB9IGNhdGNoIHsgLyogYWxyZWFkeSBnb25lICovIH1cbn1cblxuLyoqXG4gKiBSdW4gdGhlIGxlYWRlciBlbGVjdGlvbiBwcm90b2NvbC5cbiAqXG4gKiAxLiBJZiBubyBsb2NrIGV4aXN0cyBvciBsb2NrIGlzIHN0YWxlIOKGkiBjbGFpbSBsZWFkZXJzaGlwXG4gKiAyLiBJZiBsb2NrIGV4aXN0cyB3aXRoIGEgbGl2ZSwgcmVzcG9uc2l2ZSBsZWFkZXIg4oaSIGJlY29tZSBmb2xsb3dlclxuICpcbiAqIEBwYXJhbSBzZXNzaW9uSWQgLSBUaGlzIHByb2Nlc3MncyB1bmlxdWUgc2Vzc2lvbiBpZGVudGlmaWVyXG4gKiBAcGFyYW0gcG9ydCAtIFRoZSBwb3J0IHRoaXMgcHJvY2VzcyB3b3VsZCB1c2UgYXMgbGVhZGVyIChzZWUgYERPTExIT1VTRV9XRUJfQ09OU09MRV9QT1JUYClcbiAqIEByZXR1cm5zIEVsZWN0aW9uIHJlc3VsdCB3aXRoIHJvbGUgYW5kIGxlYWRlciBpbmZvXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlbGVjdExlYWRlcihzZXNzaW9uSWQ6IHN0cmluZywgcG9ydDogbnVtYmVyKTogUHJvbWlzZTxFbGVjdGlvblJlc3VsdD4ge1xuICBzZXNzaW9uSWQgPSBVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZShzZXNzaW9uSWQpLm5vcm1hbGl6ZWRDb250ZW50O1xuICBjb25zdCBleGlzdGluZ0xvY2sgPSBhd2FpdCByZWFkTGVhZGVyTG9jaygpO1xuXG4gIGlmIChleGlzdGluZ0xvY2sgJiYgIWlzTG9ja1N0YWxlKGV4aXN0aW5nTG9jaykpIHtcbiAgICBsb2dnZXIuaW5mbygnW0xlYWRlckVsZWN0aW9uXSBFeGlzdGluZyBsZWFkZXIgZm91bmQg4oCUIGJlY29taW5nIGZvbGxvd2VyJywge1xuICAgICAgbGVhZGVyU2Vzc2lvbjogZXhpc3RpbmdMb2NrLnNlc3Npb25JZCwgbGVhZGVyUGlkOiBleGlzdGluZ0xvY2sucGlkLFxuICAgICAgbGVhZGVyUG9ydDogZXhpc3RpbmdMb2NrLnBvcnQsIG15U2Vzc2lvbjogc2Vzc2lvbklkLCBteVBpZDogcHJvY2Vzcy5waWQsXG4gICAgfSk7XG4gICAgcmV0dXJuIHsgcm9sZTogJ2ZvbGxvd2VyJywgbGVhZGVySW5mbzogZXhpc3RpbmdMb2NrIH07XG4gIH1cblxuICAvLyBObyB2YWxpZCBsZWFkZXIg4oCUIHRyeSB0byBjbGFpbVxuICBpZiAoZXhpc3RpbmdMb2NrKSB7XG4gICAgY29uc3QgYWxpdmUgPSBpc1Byb2Nlc3NBbGl2ZShleGlzdGluZ0xvY2sucGlkKTtcbiAgICBjb25zdCBoZWFydGJlYXRBZ2UgPSBEYXRlLm5vdygpIC0gbmV3IERhdGUoZXhpc3RpbmdMb2NrLmhlYXJ0YmVhdCkuZ2V0VGltZSgpO1xuICAgIGxvZ2dlci5pbmZvKCdbTGVhZGVyRWxlY3Rpb25dIFN0YWxlIGxlYWRlciBsb2NrIOKAlCB0YWtpbmcgb3ZlcicsIHtcbiAgICAgIHN0YWxlUGlkOiBleGlzdGluZ0xvY2sucGlkLCBhbGl2ZSwgaGVhcnRiZWF0QWdlTXM6IGhlYXJ0YmVhdEFnZSxcbiAgICAgIHN0YWxlU2Vzc2lvbjogZXhpc3RpbmdMb2NrLnNlc3Npb25JZCwgbXlTZXNzaW9uOiBzZXNzaW9uSWQsXG4gICAgfSk7XG4gICAgYXdhaXQgZGVsZXRlTGVhZGVyTG9jaygpO1xuICB9XG5cbiAgY29uc3Qgbm93ID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpO1xuICBjb25zdCBteUluZm86IENvbnNvbGVMZWFkZXJJbmZvID0ge1xuICAgIHZlcnNpb246IExPQ0tfVkVSU0lPTixcbiAgICBwaWQ6IHByb2Nlc3MucGlkLFxuICAgIHBvcnQsXG4gICAgc2Vzc2lvbklkLFxuICAgIHN0YXJ0ZWRBdDogbm93LFxuICAgIGhlYXJ0YmVhdDogbm93LFxuICB9O1xuXG4gIGNvbnN0IGNsYWltZWQgPSBhd2FpdCBjbGFpbUxlYWRlcnNoaXAobXlJbmZvKTtcbiAgaWYgKGNsYWltZWQpIHtcbiAgICBsb2dnZXIuaW5mbygnW0xlYWRlckVsZWN0aW9uXSBDbGFpbWVkIGxlYWRlcnNoaXAnLCB7IHNlc3Npb25JZCwgcG9ydCwgcGlkOiBwcm9jZXNzLnBpZCB9KTtcbiAgICByZXR1cm4geyByb2xlOiAnbGVhZGVyJywgbGVhZGVySW5mbzogbXlJbmZvIH07XG4gIH1cblxuICAvLyBBbm90aGVyIHByb2Nlc3Mgd29uIHRoZSByYWNlIOKAlCByZS1yZWFkIGFuZCBiZWNvbWUgZm9sbG93ZXJcbiAgY29uc3Qgd2lubmVyID0gYXdhaXQgcmVhZExlYWRlckxvY2soKTtcbiAgaWYgKHdpbm5lcikge1xuICAgIGxvZ2dlci5pbmZvKCdbTGVhZGVyRWxlY3Rpb25dIExvc3QgZWxlY3Rpb24g4oCUIGJlY29taW5nIGZvbGxvd2VyJywge1xuICAgICAgd2lubmVyUGlkOiB3aW5uZXIucGlkLCB3aW5uZXJTZXNzaW9uOiB3aW5uZXIuc2Vzc2lvbklkLCBteVNlc3Npb246IHNlc3Npb25JZCwgbXlQaWQ6IHByb2Nlc3MucGlkLFxuICAgIH0pO1xuICAgIHJldHVybiB7IHJvbGU6ICdmb2xsb3dlcicsIGxlYWRlckluZm86IHdpbm5lciB9O1xuICB9XG5cbiAgLy8gRXh0cmVtZWx5IHVubGlrZWx5OiBsb2NrIGRpc2FwcGVhcmVkIGJldHdlZW4gb3VyIGNsYWltIGFuZCByZS1yZWFkLiBSZXRyeSBvbmNlLlxuICBsb2dnZXIud2FybignW0xlYWRlckVsZWN0aW9uXSBMb2NrIHZhbmlzaGVkIGFmdGVyIGZhaWxlZCBjbGFpbS4gUmV0cnlpbmcuJyk7XG4gIGNvbnN0IHJldHJ5SW5mbzogQ29uc29sZUxlYWRlckluZm8gPSB7IC4uLm15SW5mbywgaGVhcnRiZWF0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkgfTtcbiAgY29uc3QgcmV0cnlDbGFpbWVkID0gYXdhaXQgY2xhaW1MZWFkZXJzaGlwKHJldHJ5SW5mbyk7XG4gIGlmIChyZXRyeUNsYWltZWQpIHtcbiAgICByZXR1cm4geyByb2xlOiAnbGVhZGVyJywgbGVhZGVySW5mbzogcmV0cnlJbmZvIH07XG4gIH1cbiAgY29uc3QgYWN0dWFsTGVhZGVyID0gYXdhaXQgcmVhZExlYWRlckxvY2soKTtcbiAgcmV0dXJuIHsgcm9sZTogJ2ZvbGxvd2VyJywgbGVhZGVySW5mbzogYWN0dWFsTGVhZGVyID8/IHJldHJ5SW5mbyB9O1xufVxuXG4vKipcbiAqIFByb2JlIHdoZXRoZXIgdGhlIGxlYWRlcidzIHdlYiBjb25zb2xlIGlzIHJlYWNoYWJsZS5cbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgbGVhZGVyJ3MgaW5nZXN0IGVuZHBvaW50IHJlc3BvbmRzLCBmYWxzZSBvdGhlcndpc2UuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpc0xlYWRlcldlYkNvbnNvbGVSZWFjaGFibGUobGVhZGVySW5mbzogQ29uc29sZUxlYWRlckluZm8pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgIGNvbnN0IHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IGNvbnRyb2xsZXIuYWJvcnQoKSwgMl8wMDApO1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKGBodHRwOi8vMTI3LjAuMC4xOiR7bGVhZGVySW5mby5wb3J0fS9hcGkvbG9ncy9zdGF0c2AsIHtcbiAgICAgIHNpZ25hbDogY29udHJvbGxlci5zaWduYWwsXG4gICAgfSk7XG4gICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgIHJldHVybiByZXMub2s7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIEZvcmNlIGNsYWltIGxlYWRlcnNoaXAgYnkgZGVsZXRpbmcgdGhlIGV4aXN0aW5nIGxvY2sgYW5kIGNsYWltaW5nLlxuICogVXNlZCB3aGVuIHRoZSBleGlzdGluZyBsZWFkZXIgaXMgYWxpdmUgYnV0IG5vdCBydW5uaW5nIGEgd2ViIGNvbnNvbGUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmb3JjZUNsYWltTGVhZGVyc2hpcChzZXNzaW9uSWQ6IHN0cmluZywgcG9ydDogbnVtYmVyKTogUHJvbWlzZTxFbGVjdGlvblJlc3VsdD4ge1xuICBsb2dnZXIuaW5mbygnW0xlYWRlckVsZWN0aW9uXSBGb3JjaW5nIGxlYWRlcnNoaXAgdGFrZW92ZXIg4oCUIGV4aXN0aW5nIGxlYWRlciBoYXMgbm8gd2ViIGNvbnNvbGUnKTtcbiAgYXdhaXQgZGVsZXRlTGVhZGVyTG9jaygpO1xuXG4gIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKTtcbiAgY29uc3QgbXlJbmZvOiBDb25zb2xlTGVhZGVySW5mbyA9IHtcbiAgICB2ZXJzaW9uOiBMT0NLX1ZFUlNJT04sXG4gICAgcGlkOiBwcm9jZXNzLnBpZCxcbiAgICBwb3J0LFxuICAgIHNlc3Npb25JZDogVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUoc2Vzc2lvbklkKS5ub3JtYWxpemVkQ29udGVudCxcbiAgICBzdGFydGVkQXQ6IG5vdyxcbiAgICBoZWFydGJlYXQ6IG5vdyxcbiAgfTtcblxuICBjb25zdCBjbGFpbWVkID0gYXdhaXQgY2xhaW1MZWFkZXJzaGlwKG15SW5mbyk7XG4gIGlmIChjbGFpbWVkKSB7XG4gICAgbG9nZ2VyLmluZm8oJ1tMZWFkZXJFbGVjdGlvbl0gRm9yY2VkIGxlYWRlcnNoaXAgY2xhaW1lZCcsIHsgc2Vzc2lvbklkLCBwb3J0LCBwaWQ6IHByb2Nlc3MucGlkIH0pO1xuICAgIHJldHVybiB7IHJvbGU6ICdsZWFkZXInLCBsZWFkZXJJbmZvOiBteUluZm8gfTtcbiAgfVxuXG4gIC8vIEZhaWxlZCDigJQgZmFsbCBiYWNrIHRvIGZvbGxvd2VyXG4gIGNvbnN0IHdpbm5lciA9IGF3YWl0IHJlYWRMZWFkZXJMb2NrKCk7XG4gIHJldHVybiB7IHJvbGU6ICdmb2xsb3dlcicsIGxlYWRlckluZm86IHdpbm5lciA/PyBteUluZm8gfTtcbn1cblxuLyoqXG4gKiBTdGFydCB0aGUgbGVhZGVyIGhlYXJ0YmVhdCBsb29wLlxuICogVXBkYXRlcyB0aGUgbG9jayBmaWxlIGV2ZXJ5IEhFQVJUQkVBVF9JTlRFUlZBTF9NUyBzbyBmb2xsb3dlcnMga25vdyB0aGUgbGVhZGVyIGlzIGFsaXZlLlxuICpcbiAqIEByZXR1cm5zIEEgc3RvcCBmdW5jdGlvbiB0byBjbGVhciB0aGUgaW50ZXJ2YWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0YXJ0SGVhcnRiZWF0KGluZm86IENvbnNvbGVMZWFkZXJJbmZvKTogKCkgPT4gdm9pZCB7XG4gIGNvbnN0IGludGVydmFsID0gc2V0SW50ZXJ2YWwoYXN5bmMgKCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB1cGRhdGVkOiBDb25zb2xlTGVhZGVySW5mbyA9IHsgLi4uaW5mbywgaGVhcnRiZWF0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkgfTtcbiAgICAgIGNvbnN0IHRtcEZpbGUgPSBqb2luKFJVTl9ESVIsIGBjb25zb2xlLWxlYWRlci5sb2NrLiR7cHJvY2Vzcy5waWR9LnRtcGApO1xuICAgICAgYXdhaXQgd3JpdGVGaWxlKHRtcEZpbGUsIEpTT04uc3RyaW5naWZ5KHVwZGF0ZWQsIG51bGwsIDIpLCAndXRmLTgnKTtcbiAgICAgIGF3YWl0IHJlbmFtZSh0bXBGaWxlLCBMT0NLX0ZJTEUpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgbG9nZ2VyLmRlYnVnKCdbTGVhZGVyRWxlY3Rpb25dIEhlYXJ0YmVhdCB3cml0ZSBmYWlsZWQ6JywgZXJyKTtcbiAgICB9XG4gIH0sIEhFQVJUQkVBVF9JTlRFUlZBTF9NUyk7XG5cbiAgLy8gRG9uJ3QgbGV0IHRoZSBoZWFydGJlYXQgaW50ZXJ2YWwga2VlcCB0aGUgcHJvY2VzcyBhbGl2ZVxuICBpbnRlcnZhbC51bnJlZigpO1xuXG4gIHJldHVybiAoKSA9PiBjbGVhckludGVydmFsKGludGVydmFsKTtcbn1cblxuLyoqXG4gKiBSZWdpc3RlciBjbGVhbnVwIGhhbmRsZXJzIHRvIHJlbW92ZSB0aGUgbGVhZGVyIGxvY2sgb24gcHJvY2VzcyBleGl0LlxuICogU2hvdWxkIG9ubHkgYmUgY2FsbGVkIGJ5IHRoZSBsZWFkZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckxlYWRlckNsZWFudXAoKTogdm9pZCB7XG4gIGNvbnN0IGNsZWFudXAgPSAoKSA9PiB7IGRlbGV0ZUxlYWRlckxvY2soKS5jYXRjaCgoKSA9PiB7fSk7IH07XG4gIHByb2Nlc3Mub25jZSgnZXhpdCcsIGNsZWFudXApO1xuICBwcm9jZXNzLm9uY2UoJ1NJR1RFUk0nLCBjbGVhbnVwKTtcbiAgcHJvY2Vzcy5vbmNlKCdTSUdJTlQnLCBjbGVhbnVwKTtcbiAgcHJvY2Vzcy5vbmNlKCdTSUdIVVAnLCBjbGVhbnVwKTtcbn1cbiJdfQ==
428
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTGVhZGVyRWxlY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvd2ViL2NvbnNvbGUvTGVhZGVyRWxlY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtCRztBQUVILE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDbEMsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzlFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLCtDQUErQyxDQUFDO0FBQ2pGLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUMxQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDN0QsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQy9DLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUV6RCx3Q0FBd0M7QUFDeEMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFLFlBQVksRUFBRSxLQUFLLENBQUMsQ0FBQztBQUVyRDs7Ozs7Ozs7OztHQVVHO0FBQ0gsTUFBTSxxQkFBcUIsR0FBRywwQkFBMEIsQ0FBQztBQUV6RCx5RkFBeUY7QUFDekYsTUFBTSxvQkFBb0IsR0FBRyxxQkFBcUIsQ0FBQztBQUVuRDs7Ozs7R0FLRztBQUNILE1BQU0sU0FBUyxHQUFHLEdBQUcsQ0FBQyxrQ0FBa0MsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLHFCQUFxQixDQUFDLENBQUM7QUFFakcsaUZBQWlGO0FBQ2pGLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxvQkFBb0IsQ0FBQyxDQUFDO0FB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QyxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLHFCQUFxQjtJQUNuQyxNQUFNLE9BQU8sR0FBRyxHQUFHLEVBQUUsR0FBRyxnQkFBZ0IsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsR0FBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM5RCxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztJQUM5QixPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUNqQyxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUNoQyxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUNsQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBMZWFkZXIgZWxlY3Rpb24gZm9yIHRoZSB1bmlmaWVkIHdlYiBjb25zb2xlLlxuICpcbiAqIFdoZW4gbXVsdGlwbGUgTUNQIHNlcnZlciBpbnN0YW5jZXMgcnVuIGNvbmN1cnJlbnRseSwgb25seSBvbmUgc2hvdWxkIGhvc3RcbiAqIHRoZSB3ZWIgY29uc29sZSAodGhlIFwibGVhZGVyXCIpLiBPdGhlcnMgYmVjb21lIFwiZm9sbG93ZXJzXCIgdGhhdCBmb3J3YXJkXG4gKiBldmVudHMgdG8gdGhlIGxlYWRlci4gVGhpcyBtb2R1bGUgaGFuZGxlczpcbiAqXG4gKiAxLiBSZWFkaW5nL3dyaXRpbmcgYSBsZWFkZXIgbG9jayBmaWxlIGF0IH4vLmRvbGxob3VzZS9ydW4vY29uc29sZS1sZWFkZXIubG9ja1xuICogMi4gQXRvbWljIGNsYWltIHZpYSB0ZW1wK3JlbmFtZSB0byBwcmV2ZW50IFRPQ1RPVSByYWNlc1xuICogMy4gUElELWJhc2VkIHN0YWxlIGRldGVjdGlvbiAoc2lnbmFsLTAgbGl2ZW5lc3MgY2hlY2spXG4gKiA0LiBIZWFydGJlYXQgdXBkYXRlcyAoMTBzIGludGVydmFsKSBzbyBmb2xsb3dlcnMgY2FuIGRldGVjdCBodW5nIGxlYWRlcnNcbiAqIDUuIENsZWFudXAgb24gcHJvY2VzcyBleGl0XG4gKlxuICogVGhlIGNvbmZpZ3VyZWQgcG9ydCBiaW5kaW5nIGlzIHRoZSB1bHRpbWF0ZSB0aWVicmVha2VyOiBldmVuIGlmIHR3b1xuICogcHJvY2Vzc2VzIGJvdGggd3JpdGUgdGhlIGxvY2sgZmlsZSwgb25seSBvbmUgY2FuIGJpbmQgdGhlIHBvcnQgKHNlZVxuICogYERPTExIT1VTRV9XRUJfQ09OU09MRV9QT1JUYCBpbiBgc3JjL2NvbmZpZy9lbnYudHNgKS5cbiAqXG4gKiBAc2luY2UgdjIuMS4wIOKAlCBJc3N1ZSAjMTcwMFxuICovXG5cbmltcG9ydCB7IGhvbWVkaXIgfSBmcm9tICdub2RlOm9zJztcbmltcG9ydCB7IGpvaW4gfSBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHsgbWtkaXIsIHJlYWRGaWxlLCB3cml0ZUZpbGUsIHJlbmFtZSwgdW5saW5rIH0gZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgeyBVbmljb2RlVmFsaWRhdG9yIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvdmFsaWRhdG9ycy91bmljb2RlVmFsaWRhdG9yLmpzJztcbmltcG9ydCB7IGVudiB9IGZyb20gJy4uLy4uL2NvbmZpZy9lbnYuanMnO1xuaW1wb3J0IHsgUEFDS0FHRV9WRVJTSU9OIH0gZnJvbSAnLi4vLi4vZ2VuZXJhdGVkL3ZlcnNpb24uanMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vLi4vdXRpbHMvbG9nZ2VyLmpzJztcbmltcG9ydCB7IGNvbXBhcmVWZXJzaW9ucyB9IGZyb20gJy4uLy4uL3V0aWxzL3ZlcnNpb24uanMnO1xuXG4vKiogRGlyZWN0b3J5IGZvciBydW50aW1lIHN0YXRlIGZpbGVzICovXG5jb25zdCBSVU5fRElSID0gam9pbihob21lZGlyKCksICcuZG9sbGhvdXNlJywgJ3J1bicpO1xuXG4vKipcbiAqIEJ1aWx0LWluIGRlZmF1bHQgZmlsZW5hbWUgZm9yIHRoZSBhdXRoZW50aWNhdGVkIGNvbnNvbGUncyBsZWFkZXIgbG9jay5cbiAqXG4gKiBUaGUgYC5hdXRoYCBzdWZmaXggaXNvbGF0ZXMgdGhpcyBmcm9tIGFueSBsZWdhY3kgbm8tYXV0aGVudGljYXRpb25cbiAqIERvbGxob3VzZU1DUCBpbnN0YWxsYXRpb24gdGhhdCBtYXkgYWxzbyBiZSBydW5uaW5nIG9uIHRoZSBzYW1lXG4gKiBtYWNoaW5lLiBUaG9zZSBvbGRlciBpbnN0YWxscyB1c2UgYGNvbnNvbGUtbGVhZGVyLmxvY2tgIChubyBzdWZmaXgpO1xuICogdGhlIGF1dGhlbnRpY2F0ZWQgY29uc29sZSB1c2VzIGBjb25zb2xlLWxlYWRlci5hdXRoLmxvY2tgLiBDb21iaW5lZFxuICogd2l0aCB0aGUgcG9ydCBzZXBhcmF0aW9uLCB0aGlzIG1lYW5zIHRoZSB0d28gZ2VuZXJhdGlvbnMgb2YgdGhlXG4gKiBjb25zb2xlIGNhbiBjb2V4aXN0IHdpdGggemVybyBpbnRlcmZlcmVuY2Ug4oCUIGRpZmZlcmVudCBwb3J0LCBkaWZmZXJlbnRcbiAqIGxvY2sgZmlsZSwgZGlmZmVyZW50IHRva2VuIGZpbGUsIGluZGVwZW5kZW50IGxlYWRlciBlbGVjdGlvbiBzcGFjZXMuXG4gKi9cbmNvbnN0IERFRkFVTFRfTE9DS19GSUxFTkFNRSA9ICdjb25zb2xlLWxlYWRlci5hdXRoLmxvY2snO1xuXG4vKiogTGVnYWN5IGxvY2sgZmlsZW5hbWUgZnJvbSB0aGUgcHJlLWF1dGhlbnRpY2F0aW9uIGNvbnNvbGUuIFVzZWQgb25seSBmb3IgZGV0ZWN0aW9uLiAqL1xuY29uc3QgTEVHQUNZX0xPQ0tfRklMRU5BTUUgPSAnY29uc29sZS1sZWFkZXIubG9jayc7XG5cbi8qKlxuICogUGF0aCB0byB0aGUgbGVhZGVyIGxvY2sgZmlsZS4gUHJlZmVycyB0aGUgYERPTExIT1VTRV9DT05TT0xFX0xFQURFUl9MT0NLX0ZJTEVgXG4gKiBlbnYgdmFyIHdoZW4gc2V0LCBvdGhlcndpc2UgdXNlcyBgREVGQVVMVF9MT0NLX0ZJTEVOQU1FYCB1bmRlciBSVU5fRElSLlxuICogVGhlIGVudiB2YXIgaXMgdGhlIHNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGggd2hlbiBwcmVzZW50LCBzbyBhIGRlcGxveW1lbnRcbiAqIGNhbiByZWxvY2F0ZSB0aGUgbG9jayB3aXRob3V0IGNvZGUgY2hhbmdlcyAoc2VlIGBzcmMvY29uZmlnL2Vudi50c2ApLlxuICovXG5jb25zdCBMT0NLX0ZJTEUgPSBlbnYuRE9MTEhPVVNFX0NPTlNPTEVfTEVBREVSX0xPQ0tfRklMRSA/PyBqb2luKFJVTl9ESVIsIERFRkFVTFRfTE9DS19GSUxFTkFNRSk7XG5cbi8qKiBQYXRoIHRvIHRoZSBsZWdhY3kgcHJlLWF1dGggbG9jayBmaWxlICh1c2VkIGJ5IGBkZXRlY3RMZWdhY3lMZWFkZXJgIG9ubHkpLiAqL1xuY29uc3QgTEVHQUNZX0xPQ0tfRklMRSA9IGpvaW4oUlVOX0RJUiwgTEVHQUNZX0xPQ0tfRklMRU5BTUUpO1xuXG4vKiogSG93IG9mdGVuIHRoZSBsZWFkZXIgdXBkYXRlcyBpdHMgaGVhcnRiZWF0IChtcykgKi9cbmNvbnN0IEhFQVJUQkVBVF9JTlRFUlZBTF9NUyA9IDEwXzAwMDtcblxuLyoqIEhvdyBsb25nIGJlZm9yZSBhIGhlYXJ0YmVhdCBpcyBjb25zaWRlcmVkIHN0YWxlIChtcykgKi9cbmNvbnN0IEhFQVJUQkVBVF9TVEFMRV9NUyA9IDMwXzAwMDtcblxuLyoqIEN1cnJlbnQgbG9jayBmaWxlIHNjaGVtYSB2ZXJzaW9uICovXG5leHBvcnQgY29uc3QgTE9DS19WRVJTSU9OID0gMTtcblxuLyoqXG4gKiBWZXJzaW9uIG9mIHRoZSBsZWFkZXItZWxlY3Rpb24vc2Vzc2lvbiBtZXRhZGF0YSBjb250cmFjdCB1c2VkIGJ5IHRoZVxuICogYXV0aGVudGljYXRlZCB3ZWIgY29uc29sZS4gT2xkZXIgbGVhZGVycyB3aWxsIG5vdCBoYXZlIHRoaXMgZmllbGQuXG4gKi9cbmV4cG9ydCBjb25zdCBDT05TT0xFX1BST1RPQ09MX1ZFUlNJT04gPSAxO1xuXG4vKiogTWlzc2luZyBwcm90b2NvbCBtZXRhZGF0YSBtZWFucyB0aGUgbGVhZGVyIHByZWRhdGVzIHZlcnNpb24tYXdhcmUgZWxlY3Rpb24uICovXG5leHBvcnQgY29uc3QgTEVHQUNZX0NPTlNPTEVfUFJPVE9DT0xfVkVSU0lPTiA9IDA7XG5cbi8qKiBPbGQgbG9jayBmaWxlcyBkbyBub3QgY2FycnkgcGFja2FnZSB2ZXJzaW9uIG1ldGFkYXRhLiBUcmVhdCB0aGVtIGFzIG9sZGVzdC4gKi9cbmV4cG9ydCBjb25zdCBMRUdBQ1lfU0VSVkVSX1ZFUlNJT04gPSAnMC4wLjAnO1xuXG4vKipcbiAqIEluZm9ybWF0aW9uIHN0b3JlZCBpbiB0aGUgbGVhZGVyIGxvY2sgZmlsZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb25zb2xlTGVhZGVySW5mbyB7XG4gIHZlcnNpb246IG51bWJlcjtcbiAgcGlkOiBudW1iZXI7XG4gIHBvcnQ6IG51bWJlcjtcbiAgc2Vzc2lvbklkOiBzdHJpbmc7XG4gIHN0YXJ0ZWRBdDogc3RyaW5nO1xuICBoZWFydGJlYXQ6IHN0cmluZztcbiAgc2VydmVyVmVyc2lvbj86IHN0cmluZztcbiAgY29uc29sZVByb3RvY29sVmVyc2lvbj86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBSZXN1bHQgb2YgYSBsZWFkZXIgZWxlY3Rpb24gYXR0ZW1wdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbGVjdGlvblJlc3VsdCB7XG4gIHJvbGU6ICdsZWFkZXInIHwgJ2ZvbGxvd2VyJztcbiAgLyoqIExlYWRlciBpbmZvIOKAlCBmb3IgZm9sbG93ZXJzLCB0aGlzIGlzIHRoZSBleGlzdGluZyBsZWFkZXIncyBpbmZvICovXG4gIGxlYWRlckluZm86IENvbnNvbGVMZWFkZXJJbmZvO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExlYWRlclByZWZlcmVuY2VEZWNpc2lvbiB7XG4gIHNob3VsZFJlcGxhY2U6IGJvb2xlYW47XG4gIHJlYXNvbjogJ25ld2VyLWNvbXBhdGlibGUtdmVyc2lvbicgfCAnc2FtZS12ZXJzaW9uJyB8ICdvbGRlci12ZXJzaW9uJyB8ICdpbmNvbXBhdGlibGUtcHJvdG9jb2wnO1xuICBjYW5kaWRhdGVWZXJzaW9uOiBzdHJpbmc7XG4gIGV4aXN0aW5nVmVyc2lvbjogc3RyaW5nO1xuICBjYW5kaWRhdGVQcm90b2NvbFZlcnNpb246IG51bWJlcjtcbiAgZXhpc3RpbmdQcm90b2NvbFZlcnNpb246IG51bWJlcjtcbn1cblxuLyoqXG4gKiBDaGVjayB3aGV0aGVyIGEgcHJvY2VzcyB3aXRoIHRoZSBnaXZlbiBQSUQgaXMgYWxpdmUuXG4gKiBVc2VzIHNpZ25hbCAwIHdoaWNoIGNoZWNrcyBleGlzdGVuY2Ugd2l0aG91dCBzZW5kaW5nIGEgc2lnbmFsLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNQcm9jZXNzQWxpdmUocGlkOiBudW1iZXIpOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICBwcm9jZXNzLmtpbGwocGlkLCAwKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAvLyBFUEVSTSA9IHByb2Nlc3MgZXhpc3RzIGJ1dCBvd25lZCBieSBhbm90aGVyIHVzZXIg4oCUIHN0aWxsIGFsaXZlXG4gICAgcmV0dXJuIGVycj8uY29kZSA9PT0gJ0VQRVJNJztcbiAgfVxufVxuXG4vKipcbiAqIE5vcm1hbGl6ZSB0aGUgc2VydmVyIHZlcnNpb24gcHJlc2VudCBpbiB0aGUgbGVhZGVyIGxvY2suXG4gKiBNaXNzaW5nIG1ldGFkYXRhIG1lYW5zIFwibGVnYWN5IGxlYWRlclwiIGZvciBlbGVjdGlvbiBwdXJwb3Nlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldExlYWRlclNlcnZlclZlcnNpb24oaW5mbzogQ29uc29sZUxlYWRlckluZm8pOiBzdHJpbmcge1xuICBpZiAodHlwZW9mIGluZm8uc2VydmVyVmVyc2lvbiA9PT0gJ3N0cmluZycgJiYgaW5mby5zZXJ2ZXJWZXJzaW9uLnRyaW0oKS5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIGluZm8uc2VydmVyVmVyc2lvbi50cmltKCk7XG4gIH1cbiAgcmV0dXJuIExFR0FDWV9TRVJWRVJfVkVSU0lPTjtcbn1cblxuLyoqXG4gKiBOb3JtYWxpemUgdGhlIGNvbnNvbGUgcHJvdG9jb2wgdmVyc2lvbiBwcmVzZW50IGluIHRoZSBsZWFkZXIgbG9jay5cbiAqIE1pc3NpbmcgbWV0YWRhdGEgbWVhbnMgYSBsZWFkZXIgZnJvbSBiZWZvcmUgdmVyc2lvbi1hd2FyZSBlbGVjdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldExlYWRlckNvbnNvbGVQcm90b2NvbFZlcnNpb24oaW5mbzogQ29uc29sZUxlYWRlckluZm8pOiBudW1iZXIge1xuICBjb25zdCByYXcgPSBpbmZvLmNvbnNvbGVQcm90b2NvbFZlcnNpb247XG4gIGlmICh0eXBlb2YgcmF3ID09PSAnbnVtYmVyJyAmJiBOdW1iZXIuaXNJbnRlZ2VyKHJhdykgJiYgcmF3ID49IDApIHtcbiAgICByZXR1cm4gcmF3O1xuICB9XG4gIHJldHVybiBMRUdBQ1lfQ09OU09MRV9QUk9UT0NPTF9WRVJTSU9OO1xufVxuXG4vKipcbiAqIENyZWF0ZSB0aGlzIHByb2Nlc3MncyBsZWFkZXIgbWV0YWRhdGEgaW4gb25lIHBsYWNlIHNvIGFsbCBsZWFkZXJzaGlwIHBhdGhzXG4gKiBwdWJsaXNoIHRoZSBzYW1lIHZlcnNpb24gYW5kIHByb3RvY29sIGluZm9ybWF0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTGVhZGVySW5mbyhzZXNzaW9uSWQ6IHN0cmluZywgcG9ydDogbnVtYmVyKTogQ29uc29sZUxlYWRlckluZm8ge1xuICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCk7XG4gIHJldHVybiB7XG4gICAgdmVyc2lvbjogTE9DS19WRVJTSU9OLFxuICAgIHBpZDogcHJvY2Vzcy5waWQsXG4gICAgcG9ydCxcbiAgICBzZXNzaW9uSWQ6IFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKHNlc3Npb25JZCkubm9ybWFsaXplZENvbnRlbnQsXG4gICAgc3RhcnRlZEF0OiBub3csXG4gICAgaGVhcnRiZWF0OiBub3csXG4gICAgc2VydmVyVmVyc2lvbjogUEFDS0FHRV9WRVJTSU9OLFxuICAgIGNvbnNvbGVQcm90b2NvbFZlcnNpb246IENPTlNPTEVfUFJPVE9DT0xfVkVSU0lPTixcbiAgfTtcbn1cblxuLyoqXG4gKiBEZWNpZGUgd2hldGhlciB0aGlzIHByb2Nlc3Mgc2hvdWxkIHJlcGxhY2UgdGhlIGN1cnJlbnQgbGl2ZSBsZWFkZXIgYmFzZWQgb25cbiAqIGNvbXBhdGliaWxpdHkgZmlyc3QsIHRoZW4gcGFja2FnZSB2ZXJzaW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXZhbHVhdGVMZWFkZXJQcmVmZXJlbmNlKFxuICBjYW5kaWRhdGU6IENvbnNvbGVMZWFkZXJJbmZvLFxuICBleGlzdGluZzogQ29uc29sZUxlYWRlckluZm8sXG4pOiBMZWFkZXJQcmVmZXJlbmNlRGVjaXNpb24ge1xuICBjb25zdCBjYW5kaWRhdGVWZXJzaW9uID0gZ2V0TGVhZGVyU2VydmVyVmVyc2lvbihjYW5kaWRhdGUpO1xuICBjb25zdCBleGlzdGluZ1ZlcnNpb24gPSBnZXRMZWFkZXJTZXJ2ZXJWZXJzaW9uKGV4aXN0aW5nKTtcbiAgY29uc3QgY2FuZGlkYXRlUHJvdG9jb2xWZXJzaW9uID0gZ2V0TGVhZGVyQ29uc29sZVByb3RvY29sVmVyc2lvbihjYW5kaWRhdGUpO1xuICBjb25zdCBleGlzdGluZ1Byb3RvY29sVmVyc2lvbiA9IGdldExlYWRlckNvbnNvbGVQcm90b2NvbFZlcnNpb24oZXhpc3RpbmcpO1xuXG4gIGNvbnN0IGNvbXBhdGlibGUgPVxuICAgIGV4aXN0aW5nUHJvdG9jb2xWZXJzaW9uID09PSBjYW5kaWRhdGVQcm90b2NvbFZlcnNpb24gfHxcbiAgICBleGlzdGluZ1Byb3RvY29sVmVyc2lvbiA9PT0gTEVHQUNZX0NPTlNPTEVfUFJPVE9DT0xfVkVSU0lPTjtcblxuICBpZiAoIWNvbXBhdGlibGUpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc2hvdWxkUmVwbGFjZTogZmFsc2UsXG4gICAgICByZWFzb246ICdpbmNvbXBhdGlibGUtcHJvdG9jb2wnLFxuICAgICAgY2FuZGlkYXRlVmVyc2lvbixcbiAgICAgIGV4aXN0aW5nVmVyc2lvbixcbiAgICAgIGNhbmRpZGF0ZVByb3RvY29sVmVyc2lvbixcbiAgICAgIGV4aXN0aW5nUHJvdG9jb2xWZXJzaW9uLFxuICAgIH07XG4gIH1cblxuICBjb25zdCB2ZXJzaW9uQ29tcGFyaXNvbiA9IGNvbXBhcmVWZXJzaW9ucyhjYW5kaWRhdGVWZXJzaW9uLCBleGlzdGluZ1ZlcnNpb24pO1xuICBpZiAodmVyc2lvbkNvbXBhcmlzb24gPiAwKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNob3VsZFJlcGxhY2U6IHRydWUsXG4gICAgICByZWFzb246ICduZXdlci1jb21wYXRpYmxlLXZlcnNpb24nLFxuICAgICAgY2FuZGlkYXRlVmVyc2lvbixcbiAgICAgIGV4aXN0aW5nVmVyc2lvbixcbiAgICAgIGNhbmRpZGF0ZVByb3RvY29sVmVyc2lvbixcbiAgICAgIGV4aXN0aW5nUHJvdG9jb2xWZXJzaW9uLFxuICAgIH07XG4gIH1cbiAgaWYgKHZlcnNpb25Db21wYXJpc29uID09PSAwKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNob3VsZFJlcGxhY2U6IGZhbHNlLFxuICAgICAgcmVhc29uOiAnc2FtZS12ZXJzaW9uJyxcbiAgICAgIGNhbmRpZGF0ZVZlcnNpb24sXG4gICAgICBleGlzdGluZ1ZlcnNpb24sXG4gICAgICBjYW5kaWRhdGVQcm90b2NvbFZlcnNpb24sXG4gICAgICBleGlzdGluZ1Byb3RvY29sVmVyc2lvbixcbiAgICB9O1xuICB9XG4gIHJldHVybiB7XG4gICAgc2hvdWxkUmVwbGFjZTogZmFsc2UsXG4gICAgcmVhc29uOiAnb2xkZXItdmVyc2lvbicsXG4gICAgY2FuZGlkYXRlVmVyc2lvbixcbiAgICBleGlzdGluZ1ZlcnNpb24sXG4gICAgY2FuZGlkYXRlUHJvdG9jb2xWZXJzaW9uLFxuICAgIGV4aXN0aW5nUHJvdG9jb2xWZXJzaW9uLFxuICB9O1xufVxuXG4vKipcbiAqIFJlc3VsdCBvZiBhIGxlZ2FjeS1sZWFkZXIgZGV0ZWN0aW9uIHNjYW4uXG4gKiBgbGVnYWN5UnVubmluZyA9PT0gdHJ1ZWAgbWVhbnMgYSBwcmUtYXV0aGVudGljYXRpb24gRG9sbGhvdXNlTUNQIGNvbnNvbGVcbiAqIGlzIGN1cnJlbnRseSBydW5uaW5nIG9uIHRoaXMgbWFjaGluZSAoaXRzIGxvY2sgZmlsZSBleGlzdHMgYW5kIGl0cyBwaWRcbiAqIGlzIGFsaXZlKS4gQ2FsbGVycyBjYW4gc3VyZmFjZSB0aGlzIHRvIHRoZSB1c2VyIGFzIGEgd2FybmluZy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMZWdhY3lMZWFkZXJJbmZvIHtcbiAgbGVnYWN5UnVubmluZzogYm9vbGVhbjtcbiAgcGlkPzogbnVtYmVyO1xuICBwb3J0PzogbnVtYmVyO1xuICBsb2NrUGF0aDogc3RyaW5nO1xufVxuXG4vKipcbiAqIERldGVjdCB3aGV0aGVyIGEgbGVnYWN5IChwcmUtYXV0aGVudGljYXRpb24pIERvbGxob3VzZU1DUCBjb25zb2xlIGlzXG4gKiBjdXJyZW50bHkgcnVubmluZyBvbiB0aGlzIG1hY2hpbmUgKCMxNzk0KS5cbiAqXG4gKiBUaGUgcHJlLWF1dGhlbnRpY2F0aW9uIGNvbnNvbGUgd3JpdGVzIGl0cyBsb2NrIHRvXG4gKiBgfi8uZG9sbGhvdXNlL3J1bi9jb25zb2xlLWxlYWRlci5sb2NrYCAobm8gYC5hdXRoYCBzdWZmaXgpLiBBblxuICogYXV0aGVudGljYXRlZCBjb25zb2xlIG9uIGEgZGlmZmVyZW50IHBvcnQgd2lsbCBub3QgaW50ZXJmZXJlIHdpdGhcbiAqIGl0IOKAlCB0aGV5IGhhdmUgZnVsbHkgaW5kZXBlbmRlbnQgcG9ydHMsIGxvY2sgZmlsZXMsIGFuZCB0b2tlbiBmaWxlcyDigJRcbiAqIGJ1dCB0aGUgdXNlciBwcm9iYWJseSB3YW50cyB0byBrbm93IHRoZSB0d28gZXhpc3Qgc2ltdWx0YW5lb3VzbHlcbiAqIGJlY2F1c2UgdGhlIHNlY3VyaXR5IHBvc3R1cmUgb2YgZWFjaCBjb25zb2xlIGlzIGRpZmZlcmVudC5cbiAqXG4gKiBSZXR1cm5zIGluZm8gYWJvdXQgdGhlIGxlZ2FjeSBsZWFkZXIgaWYgb25lIGlzIGRldGVjdGVkLCBvclxuICogYHsgbGVnYWN5UnVubmluZzogZmFsc2UgfWAgb3RoZXJ3aXNlLlxuICpcbiAqIEBwYXJhbSBsb2NrUGF0aCAtIE9wdGlvbmFsIG92ZXJyaWRlIGZvciB0aGUgbGVnYWN5IGxvY2sgZmlsZSBwYXRoLlxuICogICAgICAgICAgICAgICAgICAgRGVmYXVsdHMgdG8gdGhlIGJ1aWx0LWluIGxlZ2FjeSBsb2NhdGlvbi4gUHJpbWFyaWx5XG4gKiAgICAgICAgICAgICAgICAgICB1c2VkIGJ5IHRlc3RzIHRvIHBvaW50IGF0IGEgdGVtcCBkaXJlY3RvcnkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZXRlY3RMZWdhY3lMZWFkZXIobG9ja1BhdGg6IHN0cmluZyA9IExFR0FDWV9MT0NLX0ZJTEUpOiBQcm9taXNlPExlZ2FjeUxlYWRlckluZm8+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgcmVhZEZpbGUobG9ja1BhdGgsICd1dGYtOCcpO1xuICAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKGNvbnRlbnQpIGFzIENvbnNvbGVMZWFkZXJJbmZvO1xuICAgIGlmICghZGF0YS5waWQgfHwgIWlzUHJvY2Vzc0FsaXZlKGRhdGEucGlkKSkge1xuICAgICAgcmV0dXJuIHsgbGVnYWN5UnVubmluZzogZmFsc2UsIGxvY2tQYXRoIH07XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBsZWdhY3lSdW5uaW5nOiB0cnVlLFxuICAgICAgcGlkOiBkYXRhLnBpZCxcbiAgICAgIHBvcnQ6IGRhdGEucG9ydCxcbiAgICAgIGxvY2tQYXRoLFxuICAgIH07XG4gIH0gY2F0Y2gge1xuICAgIC8vIEZpbGUgbWlzc2luZywgdW5yZWFkYWJsZSwgb3IgaW52YWxpZCBKU09OIOKAlCBubyBsZWdhY3kgbGVhZGVyIGRldGVjdGVkXG4gICAgcmV0dXJuIHsgbGVnYWN5UnVubmluZzogZmFsc2UsIGxvY2tQYXRoIH07XG4gIH1cbn1cblxuLyoqXG4gKiBSZWFkIGFuZCBwYXJzZSB0aGUgbGVhZGVyIGxvY2sgZmlsZS5cbiAqIFJldHVybnMgbnVsbCBpZiB0aGUgZmlsZSBkb2Vzbid0IGV4aXN0LCBpcyB1bnJlYWRhYmxlLCBvciBoYXMgaW52YWxpZCBjb250ZW50LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVhZExlYWRlckxvY2soKTogUHJvbWlzZTxDb25zb2xlTGVhZGVySW5mbyB8IG51bGw+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgcmVhZEZpbGUoTE9DS19GSUxFLCAndXRmLTgnKTtcbiAgICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZShjb250ZW50KSBhcyBDb25zb2xlTGVhZGVySW5mbztcbiAgICBpZiAoZGF0YS52ZXJzaW9uICE9PSBMT0NLX1ZFUlNJT04gfHwgIWRhdGEucGlkIHx8ICFkYXRhLnBvcnQgfHwgIWRhdGEuc2Vzc2lvbklkKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGRhdGE7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKChlcnJvciBhcyBOb2RlSlMuRXJybm9FeGNlcHRpb24pLmNvZGUgIT09ICdFTk9FTlQnKSB7XG4gICAgICBsb2dnZXIuZGVidWcoJ1tMZWFkZXJFbGVjdGlvbl0gSWdub3JpbmcgdW5yZWFkYWJsZSBvciBpbnZhbGlkIGxlYWRlciBsb2NrJywge1xuICAgICAgICBsb2NrRmlsZTogTE9DS19GSUxFLFxuICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpLFxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgYSBsZWFkZXIgbG9jayBpcyBzdGFsZSAoZGVhZCBwcm9jZXNzIG9yIGV4cGlyZWQgaGVhcnRiZWF0KS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTG9ja1N0YWxlKGluZm86IENvbnNvbGVMZWFkZXJJbmZvKTogYm9vbGVhbiB7XG4gIGlmICghaXNQcm9jZXNzQWxpdmUoaW5mby5waWQpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgY29uc3QgaGVhcnRiZWF0QWdlID0gRGF0ZS5ub3coKSAtIG5ldyBEYXRlKGluZm8uaGVhcnRiZWF0KS5nZXRUaW1lKCk7XG4gIHJldHVybiBoZWFydGJlYXRBZ2UgPiBIRUFSVEJFQVRfU1RBTEVfTVM7XG59XG5cbi8qKlxuICogQXR0ZW1wdCB0byBhdG9taWNhbGx5IGNsYWltIGxlYWRlcnNoaXAuXG4gKlxuICogV3JpdGVzIHRvIGEgdGVtcCBmaWxlIHRoZW4gcmVuYW1lcyB0byB0aGUgbG9jayBwYXRoLiBPbiBQT1NJWCBzeXN0ZW1zXG4gKiByZW5hbWUgaXMgYXRvbWljLCBzbyBvbmx5IG9uZSB3cml0ZXIgd2lucy4gQWZ0ZXIgcmVuYW1pbmcsIHJlLXJlYWRzIHRoZVxuICogbG9jayB0byB2ZXJpZnkgb3VyIFBJRCB3b24uXG4gKlxuICogQHJldHVybnMgdHJ1ZSBpZiB0aGlzIHByb2Nlc3Mgc3VjY2Vzc2Z1bGx5IGNsYWltZWQgbGVhZGVyc2hpcFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY2xhaW1MZWFkZXJzaGlwKGluZm86IENvbnNvbGVMZWFkZXJJbmZvKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGF3YWl0IG1rZGlyKFJVTl9ESVIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBjb25zdCB0bXBGaWxlID0gam9pbihSVU5fRElSLCBgY29uc29sZS1sZWFkZXIubG9jay4ke3Byb2Nlc3MucGlkfS50bXBgKTtcbiAgdHJ5IHtcbiAgICBhd2FpdCB3cml0ZUZpbGUodG1wRmlsZSwgSlNPTi5zdHJpbmdpZnkoaW5mbywgbnVsbCwgMiksICd1dGYtOCcpO1xuICAgIGF3YWl0IHJlbmFtZSh0bXBGaWxlLCBMT0NLX0ZJTEUpO1xuXG4gICAgLy8gVmVyaWZ5IHdlIHdvbiB0aGUgcmFjZVxuICAgIGNvbnN0IHdyaXR0ZW4gPSBhd2FpdCByZWFkTGVhZGVyTG9jaygpO1xuICAgIHJldHVybiB3cml0dGVuICE9PSBudWxsICYmIHdyaXR0ZW4ucGlkID09PSBpbmZvLnBpZDtcbiAgfSBjYXRjaCB7XG4gICAgLy8gQ2xlYW4gdXAgdGVtcCBmaWxlIG9uIGZhaWx1cmVcbiAgICB0cnkgeyBhd2FpdCB1bmxpbmsodG1wRmlsZSk7IH0gY2F0Y2ggeyAvKiBpZ25vcmUgKi8gfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIERlbGV0ZSB0aGUgbGVhZGVyIGxvY2sgZmlsZSAoZm9yIGNsZWFudXAgb3IgdGFrZW92ZXIpLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVsZXRlTGVhZGVyTG9jaygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHsgYXdhaXQgdW5saW5rKExPQ0tfRklMRSk7IH0gY2F0Y2ggeyAvKiBhbHJlYWR5IGdvbmUgKi8gfVxufVxuXG4vKipcbiAqIFJ1biB0aGUgbGVhZGVyIGVsZWN0aW9uIHByb3RvY29sLlxuICpcbiAqIDEuIElmIG5vIGxvY2sgZXhpc3RzIG9yIGxvY2sgaXMgc3RhbGUg4oaSIGNsYWltIGxlYWRlcnNoaXBcbiAqIDIuIElmIGxvY2sgZXhpc3RzIHdpdGggYSBsaXZlLCByZXNwb25zaXZlIGxlYWRlciDihpIgYmVjb21lIGZvbGxvd2VyXG4gKlxuICogQHBhcmFtIHNlc3Npb25JZCAtIFRoaXMgcHJvY2VzcydzIHVuaXF1ZSBzZXNzaW9uIGlkZW50aWZpZXJcbiAqIEBwYXJhbSBwb3J0IC0gVGhlIHBvcnQgdGhpcyBwcm9jZXNzIHdvdWxkIHVzZSBhcyBsZWFkZXIgKHNlZSBgRE9MTEhPVVNFX1dFQl9DT05TT0xFX1BPUlRgKVxuICogQHJldHVybnMgRWxlY3Rpb24gcmVzdWx0IHdpdGggcm9sZSBhbmQgbGVhZGVyIGluZm9cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVsZWN0TGVhZGVyKHNlc3Npb25JZDogc3RyaW5nLCBwb3J0OiBudW1iZXIpOiBQcm9taXNlPEVsZWN0aW9uUmVzdWx0PiB7XG4gIGNvbnN0IG15SW5mbyA9IGNyZWF0ZUxlYWRlckluZm8oc2Vzc2lvbklkLCBwb3J0KTtcbiAgc2Vzc2lvbklkID0gbXlJbmZvLnNlc3Npb25JZDtcbiAgY29uc3QgZXhpc3RpbmdMb2NrID0gYXdhaXQgcmVhZExlYWRlckxvY2soKTtcblxuICBpZiAoZXhpc3RpbmdMb2NrICYmICFpc0xvY2tTdGFsZShleGlzdGluZ0xvY2spKSB7XG4gICAgY29uc3QgcHJlZmVyZW5jZSA9IGV2YWx1YXRlTGVhZGVyUHJlZmVyZW5jZShteUluZm8sIGV4aXN0aW5nTG9jayk7XG4gICAgaWYgKHByZWZlcmVuY2Uuc2hvdWxkUmVwbGFjZSkge1xuICAgICAgbG9nZ2VyLmluZm8oJ1tMZWFkZXJFbGVjdGlvbl0gUmVwbGFjaW5nIGxlYWRlciB3aXRoIG5ld2VyIGNvbXBhdGlibGUgdmVyc2lvbicsIHtcbiAgICAgICAgc3RhbGVTZXNzaW9uOiBleGlzdGluZ0xvY2suc2Vzc2lvbklkLFxuICAgICAgICBzdGFsZVBpZDogZXhpc3RpbmdMb2NrLnBpZCxcbiAgICAgICAgc3RhbGVQb3J0OiBleGlzdGluZ0xvY2sucG9ydCxcbiAgICAgICAgc3RhbGVWZXJzaW9uOiBwcmVmZXJlbmNlLmV4aXN0aW5nVmVyc2lvbixcbiAgICAgICAgc3RhbGVQcm90b2NvbFZlcnNpb246IHByZWZlcmVuY2UuZXhpc3RpbmdQcm90b2NvbFZlcnNpb24sXG4gICAgICAgIG15U2Vzc2lvbjogc2Vzc2lvbklkLFxuICAgICAgICBteVBpZDogcHJvY2Vzcy5waWQsXG4gICAgICAgIG15VmVyc2lvbjogcHJlZmVyZW5jZS5jYW5kaWRhdGVWZXJzaW9uLFxuICAgICAgICBteVByb3RvY29sVmVyc2lvbjogcHJlZmVyZW5jZS5jYW5kaWRhdGVQcm90b2NvbFZlcnNpb24sXG4gICAgICB9KTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxlYWRlckxvY2soKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nZ2VyLmluZm8oJ1tMZWFkZXJFbGVjdGlvbl0gRXhpc3RpbmcgbGVhZGVyIGZvdW5kIOKAlCBiZWNvbWluZyBmb2xsb3dlcicsIHtcbiAgICAgICAgbGVhZGVyU2Vzc2lvbjogZXhpc3RpbmdMb2NrLnNlc3Npb25JZCxcbiAgICAgICAgbGVhZGVyUGlkOiBleGlzdGluZ0xvY2sucGlkLFxuICAgICAgICBsZWFkZXJQb3J0OiBleGlzdGluZ0xvY2sucG9ydCxcbiAgICAgICAgbGVhZGVyVmVyc2lvbjogcHJlZmVyZW5jZS5leGlzdGluZ1ZlcnNpb24sXG4gICAgICAgIGxlYWRlclByb3RvY29sVmVyc2lvbjogcHJlZmVyZW5jZS5leGlzdGluZ1Byb3RvY29sVmVyc2lvbixcbiAgICAgICAgbXlTZXNzaW9uOiBzZXNzaW9uSWQsXG4gICAgICAgIG15UGlkOiBwcm9jZXNzLnBpZCxcbiAgICAgICAgbXlWZXJzaW9uOiBwcmVmZXJlbmNlLmNhbmRpZGF0ZVZlcnNpb24sXG4gICAgICAgIG15UHJvdG9jb2xWZXJzaW9uOiBwcmVmZXJlbmNlLmNhbmRpZGF0ZVByb3RvY29sVmVyc2lvbixcbiAgICAgICAgcmVhc29uOiBwcmVmZXJlbmNlLnJlYXNvbixcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHsgcm9sZTogJ2ZvbGxvd2VyJywgbGVhZGVySW5mbzogZXhpc3RpbmdMb2NrIH07XG4gICAgfVxuICB9XG5cbiAgaWYgKGV4aXN0aW5nTG9jayAmJiAhaXNMb2NrU3RhbGUoZXhpc3RpbmdMb2NrKSkge1xuICAgIC8vIExlYWRlciB3YXMgaW50ZW50aW9uYWxseSByZXBsYWNlZCBhYm92ZS4gQ29udGludWUgdG8gdGhlIGNsYWltIHBhdGguXG4gIH0gZWxzZSBpZiAoZXhpc3RpbmdMb2NrKSB7XG4gICAgLy8gTm8gdmFsaWQgbGVhZGVyIOKAlCB0cnkgdG8gY2xhaW1cbiAgICBjb25zdCBhbGl2ZSA9IGlzUHJvY2Vzc0FsaXZlKGV4aXN0aW5nTG9jay5waWQpO1xuICAgIGNvbnN0IGhlYXJ0YmVhdEFnZSA9IERhdGUubm93KCkgLSBuZXcgRGF0ZShleGlzdGluZ0xvY2suaGVhcnRiZWF0KS5nZXRUaW1lKCk7XG4gICAgbG9nZ2VyLmluZm8oJ1tMZWFkZXJFbGVjdGlvbl0gU3RhbGUgbGVhZGVyIGxvY2sg4oCUIHRha2luZyBvdmVyJywge1xuICAgICAgc3RhbGVQaWQ6IGV4aXN0aW5nTG9jay5waWQsIGFsaXZlLCBoZWFydGJlYXRBZ2VNczogaGVhcnRiZWF0QWdlLFxuICAgICAgc3RhbGVTZXNzaW9uOiBleGlzdGluZ0xvY2suc2Vzc2lvbklkLCBteVNlc3Npb246IHNlc3Npb25JZCxcbiAgICB9KTtcbiAgICBhd2FpdCBkZWxldGVMZWFkZXJMb2NrKCk7XG4gIH1cblxuICBjb25zdCBjbGFpbWVkID0gYXdhaXQgY2xhaW1MZWFkZXJzaGlwKG15SW5mbyk7XG4gIGlmIChjbGFpbWVkKSB7XG4gICAgbG9nZ2VyLmluZm8oJ1tMZWFkZXJFbGVjdGlvbl0gQ2xhaW1lZCBsZWFkZXJzaGlwJywgeyBzZXNzaW9uSWQsIHBvcnQsIHBpZDogcHJvY2Vzcy5waWQgfSk7XG4gICAgcmV0dXJuIHsgcm9sZTogJ2xlYWRlcicsIGxlYWRlckluZm86IG15SW5mbyB9O1xuICB9XG5cbiAgLy8gQW5vdGhlciBwcm9jZXNzIHdvbiB0aGUgcmFjZSDigJQgcmUtcmVhZCBhbmQgYmVjb21lIGZvbGxvd2VyXG4gIGNvbnN0IHdpbm5lciA9IGF3YWl0IHJlYWRMZWFkZXJMb2NrKCk7XG4gIGlmICh3aW5uZXIpIHtcbiAgICBsb2dnZXIuaW5mbygnW0xlYWRlckVsZWN0aW9uXSBMb3N0IGVsZWN0aW9uIOKAlCBiZWNvbWluZyBmb2xsb3dlcicsIHtcbiAgICAgIHdpbm5lclBpZDogd2lubmVyLnBpZCwgd2lubmVyU2Vzc2lvbjogd2lubmVyLnNlc3Npb25JZCwgbXlTZXNzaW9uOiBzZXNzaW9uSWQsIG15UGlkOiBwcm9jZXNzLnBpZCxcbiAgICB9KTtcbiAgICByZXR1cm4geyByb2xlOiAnZm9sbG93ZXInLCBsZWFkZXJJbmZvOiB3aW5uZXIgfTtcbiAgfVxuXG4gIC8vIEV4dHJlbWVseSB1bmxpa2VseTogbG9jayBkaXNhcHBlYXJlZCBiZXR3ZWVuIG91ciBjbGFpbSBhbmQgcmUtcmVhZC4gUmV0cnkgb25jZS5cbiAgbG9nZ2VyLndhcm4oJ1tMZWFkZXJFbGVjdGlvbl0gTG9jayB2YW5pc2hlZCBhZnRlciBmYWlsZWQgY2xhaW0uIFJldHJ5aW5nLicpO1xuICBjb25zdCByZXRyeUluZm86IENvbnNvbGVMZWFkZXJJbmZvID0geyAuLi5jcmVhdGVMZWFkZXJJbmZvKHNlc3Npb25JZCwgcG9ydCkgfTtcbiAgY29uc3QgcmV0cnlDbGFpbWVkID0gYXdhaXQgY2xhaW1MZWFkZXJzaGlwKHJldHJ5SW5mbyk7XG4gIGlmIChyZXRyeUNsYWltZWQpIHtcbiAgICByZXR1cm4geyByb2xlOiAnbGVhZGVyJywgbGVhZGVySW5mbzogcmV0cnlJbmZvIH07XG4gIH1cbiAgY29uc3QgYWN0dWFsTGVhZGVyID0gYXdhaXQgcmVhZExlYWRlckxvY2soKTtcbiAgcmV0dXJuIHsgcm9sZTogJ2ZvbGxvd2VyJywgbGVhZGVySW5mbzogYWN0dWFsTGVhZGVyID8/IHJldHJ5SW5mbyB9O1xufVxuXG4vKipcbiAqIFByb2JlIHdoZXRoZXIgdGhlIGxlYWRlcidzIHdlYiBjb25zb2xlIGlzIHJlYWNoYWJsZS5cbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgbGVhZGVyJ3MgaW5nZXN0IGVuZHBvaW50IHJlc3BvbmRzLCBmYWxzZSBvdGhlcndpc2UuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpc0xlYWRlcldlYkNvbnNvbGVSZWFjaGFibGUobGVhZGVySW5mbzogQ29uc29sZUxlYWRlckluZm8pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgIGNvbnN0IHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IGNvbnRyb2xsZXIuYWJvcnQoKSwgMl8wMDApO1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKGBodHRwOi8vMTI3LjAuMC4xOiR7bGVhZGVySW5mby5wb3J0fS9hcGkvbG9ncy9zdGF0c2AsIHtcbiAgICAgIHNpZ25hbDogY29udHJvbGxlci5zaWduYWwsXG4gICAgfSk7XG4gICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgIHJldHVybiByZXMub2s7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIEZvcmNlIGNsYWltIGxlYWRlcnNoaXAgYnkgZGVsZXRpbmcgdGhlIGV4aXN0aW5nIGxvY2sgYW5kIGNsYWltaW5nLlxuICogVXNlZCB3aGVuIHRoZSBleGlzdGluZyBsZWFkZXIgaXMgYWxpdmUgYnV0IG5vdCBydW5uaW5nIGEgd2ViIGNvbnNvbGUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmb3JjZUNsYWltTGVhZGVyc2hpcChzZXNzaW9uSWQ6IHN0cmluZywgcG9ydDogbnVtYmVyKTogUHJvbWlzZTxFbGVjdGlvblJlc3VsdD4ge1xuICBsb2dnZXIuaW5mbygnW0xlYWRlckVsZWN0aW9uXSBGb3JjaW5nIGxlYWRlcnNoaXAgdGFrZW92ZXIg4oCUIGV4aXN0aW5nIGxlYWRlciBoYXMgbm8gd2ViIGNvbnNvbGUnKTtcbiAgYXdhaXQgZGVsZXRlTGVhZGVyTG9jaygpO1xuICBjb25zdCBteUluZm8gPSBjcmVhdGVMZWFkZXJJbmZvKHNlc3Npb25JZCwgcG9ydCk7XG5cbiAgY29uc3QgY2xhaW1lZCA9IGF3YWl0IGNsYWltTGVhZGVyc2hpcChteUluZm8pO1xuICBpZiAoY2xhaW1lZCkge1xuICAgIGxvZ2dlci5pbmZvKCdbTGVhZGVyRWxlY3Rpb25dIEZvcmNlZCBsZWFkZXJzaGlwIGNsYWltZWQnLCB7IHNlc3Npb25JZCwgcG9ydCwgcGlkOiBwcm9jZXNzLnBpZCB9KTtcbiAgICByZXR1cm4geyByb2xlOiAnbGVhZGVyJywgbGVhZGVySW5mbzogbXlJbmZvIH07XG4gIH1cblxuICAvLyBGYWlsZWQg4oCUIGZhbGwgYmFjayB0byBmb2xsb3dlclxuICBjb25zdCB3aW5uZXIgPSBhd2FpdCByZWFkTGVhZGVyTG9jaygpO1xuICByZXR1cm4geyByb2xlOiAnZm9sbG93ZXInLCBsZWFkZXJJbmZvOiB3aW5uZXIgPz8gbXlJbmZvIH07XG59XG5cbi8qKlxuICogU3RhcnQgdGhlIGxlYWRlciBoZWFydGJlYXQgbG9vcC5cbiAqIFVwZGF0ZXMgdGhlIGxvY2sgZmlsZSBldmVyeSBIRUFSVEJFQVRfSU5URVJWQUxfTVMgc28gZm9sbG93ZXJzIGtub3cgdGhlIGxlYWRlciBpcyBhbGl2ZS5cbiAqXG4gKiBAcmV0dXJucyBBIHN0b3AgZnVuY3Rpb24gdG8gY2xlYXIgdGhlIGludGVydmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdGFydEhlYXJ0YmVhdChpbmZvOiBDb25zb2xlTGVhZGVySW5mbyk6ICgpID0+IHZvaWQge1xuICBjb25zdCBpbnRlcnZhbCA9IHNldEludGVydmFsKGFzeW5jICgpID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdXBkYXRlZDogQ29uc29sZUxlYWRlckluZm8gPSB7IC4uLmluZm8sIGhlYXJ0YmVhdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpIH07XG4gICAgICBjb25zdCB0bXBGaWxlID0gam9pbihSVU5fRElSLCBgY29uc29sZS1sZWFkZXIubG9jay4ke3Byb2Nlc3MucGlkfS50bXBgKTtcbiAgICAgIGF3YWl0IHdyaXRlRmlsZSh0bXBGaWxlLCBKU09OLnN0cmluZ2lmeSh1cGRhdGVkLCBudWxsLCAyKSwgJ3V0Zi04Jyk7XG4gICAgICBhd2FpdCByZW5hbWUodG1wRmlsZSwgTE9DS19GSUxFKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZygnW0xlYWRlckVsZWN0aW9uXSBIZWFydGJlYXQgd3JpdGUgZmFpbGVkOicsIGVycik7XG4gICAgfVxuICB9LCBIRUFSVEJFQVRfSU5URVJWQUxfTVMpO1xuXG4gIC8vIERvbid0IGxldCB0aGUgaGVhcnRiZWF0IGludGVydmFsIGtlZXAgdGhlIHByb2Nlc3MgYWxpdmVcbiAgaW50ZXJ2YWwudW5yZWYoKTtcblxuICByZXR1cm4gKCkgPT4gY2xlYXJJbnRlcnZhbChpbnRlcnZhbCk7XG59XG5cbi8qKlxuICogUmVnaXN0ZXIgY2xlYW51cCBoYW5kbGVycyB0byByZW1vdmUgdGhlIGxlYWRlciBsb2NrIG9uIHByb2Nlc3MgZXhpdC5cbiAqIFNob3VsZCBvbmx5IGJlIGNhbGxlZCBieSB0aGUgbGVhZGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJMZWFkZXJDbGVhbnVwKCk6IHZvaWQge1xuICBjb25zdCBjbGVhbnVwID0gKCkgPT4geyBkZWxldGVMZWFkZXJMb2NrKCkuY2F0Y2goKCkgPT4ge30pOyB9O1xuICBwcm9jZXNzLm9uY2UoJ2V4aXQnLCBjbGVhbnVwKTtcbiAgcHJvY2Vzcy5vbmNlKCdTSUdURVJNJywgY2xlYW51cCk7XG4gIHByb2Nlc3Mub25jZSgnU0lHSU5UJywgY2xlYW51cCk7XG4gIHByb2Nlc3Mub25jZSgnU0lHSFVQJywgY2xlYW51cCk7XG59XG4iXX0=
@@ -1 +1 @@
1
- {"version":3,"file":"LeaderForwardingSink.d.ts","sourceRoot":"","sources":["../../../src/web/console/LeaderForwardingSink.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACxE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAwC7D;;GAEG;AACH,qBAAa,uBAAwB,YAAW,QAAQ;IASpD,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,sFAAsF;IACtF,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,gGAAgG;IAChG,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC;IAbjC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAyB;IAChD,OAAO,CAAC,UAAU,CAA+C;IACjE,OAAO,CAAC,SAAS,CAAsB;IACvC,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,mBAAmB,CAAK;IAChC,OAAO,CAAC,MAAM,CAAS;gBAGJ,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM;IAClC,sFAAsF;IACrE,SAAS,GAAE,MAAM,GAAG,IAAW;IAChD,gGAAgG;IAC/E,aAAa,CAAC,GAAE,MAAM,IAAI,aAAA;IAO7C,KAAK,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI;IAkB7B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAItB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YAQd,WAAW;IAgCzB,OAAO,CAAC,YAAY;IAUpB,OAAO,CAAC,aAAa;CAwBtB;AAED;;GAEG;AACH,qBAAa,2BAA2B;IAEpC,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,sFAAsF;IACtF,OAAO,CAAC,QAAQ,CAAC,SAAS;gBAHT,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM;IAClC,sFAAsF;IACrE,SAAS,GAAE,MAAM,GAAG,IAAW;IAG5C,UAAU,CAAC,QAAQ,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;CAgB1D;AAED;;GAEG;AACH,qBAAa,gBAAgB;IAIzB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,sFAAsF;IACtF,OAAO,CAAC,QAAQ,CAAC,SAAS;IAP5B,OAAO,CAAC,cAAc,CAA+C;gBAGlD,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,MAAM;IAC5B,sFAAsF;IACrE,SAAS,GAAE,MAAM,GAAG,IAAW;IAGlD,sDAAsD;IAChD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAS5B,sDAAsD;IAChD,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;YAQb,SAAS;CAqBxB"}
1
+ {"version":3,"file":"LeaderForwardingSink.d.ts","sourceRoot":"","sources":["../../../src/web/console/LeaderForwardingSink.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACxE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AA0C7D;;GAEG;AACH,qBAAa,uBAAwB,YAAW,QAAQ;IASpD,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,sFAAsF;IACtF,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,gGAAgG;IAChG,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC;IAbjC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAyB;IAChD,OAAO,CAAC,UAAU,CAA+C;IACjE,OAAO,CAAC,SAAS,CAAsB;IACvC,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,mBAAmB,CAAK;IAChC,OAAO,CAAC,MAAM,CAAS;gBAGJ,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM;IAClC,sFAAsF;IACrE,SAAS,GAAE,MAAM,GAAG,IAAW;IAChD,gGAAgG;IAC/E,aAAa,CAAC,GAAE,MAAM,IAAI,aAAA;IAO7C,KAAK,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI;IAkB7B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAItB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YAQd,WAAW;IAgCzB,OAAO,CAAC,YAAY;IAUpB,OAAO,CAAC,aAAa;CAwBtB;AAED;;GAEG;AACH,qBAAa,2BAA2B;IAEpC,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,sFAAsF;IACtF,OAAO,CAAC,QAAQ,CAAC,SAAS;gBAHT,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM;IAClC,sFAAsF;IACrE,SAAS,GAAE,MAAM,GAAG,IAAW;IAG5C,UAAU,CAAC,QAAQ,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;CAgB1D;AAED;;GAEG;AACH,qBAAa,gBAAgB;IAIzB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,sFAAsF;IACtF,OAAO,CAAC,QAAQ,CAAC,SAAS;IAP5B,OAAO,CAAC,cAAc,CAA+C;gBAGlD,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,MAAM;IAC5B,sFAAsF;IACrE,SAAS,GAAE,MAAM,GAAG,IAAW;IAGlD,sDAAsD;IAChD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAS5B,sDAAsD;IAChD,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;YAQb,SAAS;CAuBxB"}
@@ -15,8 +15,10 @@
15
15
  * @since v2.1.0 — Issue #1700
16
16
  */
17
17
  import { UnicodeValidator } from '../../security/validators/unicodeValidator.js';
18
+ import { PACKAGE_VERSION } from '../../generated/version.js';
18
19
  import { logger } from '../../utils/logger.js';
19
20
  import { env } from '../../config/env.js';
21
+ import { CONSOLE_PROTOCOL_VERSION } from './LeaderElection.js';
20
22
  /** Maximum entries to buffer when leader is unreachable */
21
23
  const MAX_BUFFER_SIZE = 10_000;
22
24
  /** Batch size before flushing */
@@ -237,6 +239,8 @@ export class SessionHeartbeat {
237
239
  event,
238
240
  pid: this.pid,
239
241
  startedAt: new Date().toISOString(),
242
+ serverVersion: PACKAGE_VERSION,
243
+ consoleProtocolVersion: CONSOLE_PROTOCOL_VERSION,
240
244
  }),
241
245
  signal: controller.signal,
242
246
  });
@@ -247,4 +251,4 @@ export class SessionHeartbeat {
247
251
  }
248
252
  }
249
253
  }
250
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTGVhZGVyRm9yd2FyZGluZ1NpbmsuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvd2ViL2NvbnNvbGUvTGVhZGVyRm9yd2FyZGluZ1NpbmsudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBSUgsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sK0NBQStDLENBQUM7QUFDakYsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQy9DLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUUxQywyREFBMkQ7QUFDM0QsTUFBTSxlQUFlLEdBQUcsTUFBTSxDQUFDO0FBRS9CLGlDQUFpQztBQUNqQyxNQUFNLFVBQVUsR0FBRyxFQUFFLENBQUM7QUFFdEIscUNBQXFDO0FBQ3JDLE1BQU0saUJBQWlCLEdBQUcsS0FBSyxDQUFDO0FBRWhDLDRDQUE0QztBQUM1QyxNQUFNLGtCQUFrQixHQUFHLEtBQUssQ0FBQztBQUVqQyxpQ0FBaUM7QUFDakMsTUFBTSxjQUFjLEdBQUcsTUFBTSxDQUFDO0FBRTlCLDRGQUE0RjtBQUM1RixNQUFNLHdCQUF3QixHQUFHLEdBQUcsQ0FBQyxzQ0FBc0MsQ0FBQztBQUU1RSxnQ0FBZ0M7QUFDaEMsTUFBTSxrQkFBa0IsR0FBRyxLQUFLLENBQUM7QUFFakM7Ozs7O0dBS0c7QUFDSCxTQUFTLGtCQUFrQixDQUFDLEtBQW9CO0lBQzlDLE1BQU0sT0FBTyxHQUEyQixFQUFFLGNBQWMsRUFBRSxrQkFBa0IsRUFBRSxDQUFDO0lBQy9FLElBQUksS0FBSyxFQUFFLENBQUM7UUFDVixPQUFPLENBQUMsZUFBZSxDQUFDLEdBQUcsVUFBVSxLQUFLLEVBQUUsQ0FBQztJQUMvQyxDQUFDO0lBQ0QsT0FBTyxPQUFPLENBQUM7QUFDakIsQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxPQUFPLHVCQUF1QjtJQVNmO0lBQ0E7SUFFQTtJQUVBO0lB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bkIsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTO29CQUN6QixLQUFLO29CQUNMLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRztvQkFDYixTQUFTLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUU7aUJBQ3BDLENBQUM7Z0JBQ0YsTUFBTSxFQUFFLFVBQVUsQ0FBQyxNQUFNO2FBQzFCLENBQUMsQ0FBQztZQUNILFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN4QixDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1AsTUFBTSxDQUFDLEtBQUssQ0FBQyxxQ0FBcUMsS0FBSyxRQUFRLENBQUMsQ0FBQztRQUNuRSxDQUFDO0lBQ0gsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBGb3J3YXJkaW5nIHNpbmtzIGZvciBmb2xsb3dlciBNQ1Agc2VydmVycy5cbiAqXG4gKiBXaGVuIGEgc2VydmVyIGJlY29tZXMgYSBmb2xsb3dlciBpbiB0aGUgdW5pZmllZCBjb25zb2xlIGVsZWN0aW9uLCBpdFxuICogcmVnaXN0ZXJzIHRoZXNlIHNpbmtzIHdpdGggaXRzIExvZ01hbmFnZXIgYW5kIE1ldHJpY3NNYW5hZ2VyLiBJbnN0ZWFkXG4gKiBvZiBicm9hZGNhc3RpbmcgdG8gbG9jYWwgU1NFIGNsaWVudHMsIGVudHJpZXMgYXJlIGJhdGNoLVBPU1RlZCB0b1xuICogdGhlIGxlYWRlcidzIGluZ2VzdGlvbiBlbmRwb2ludHMuXG4gKlxuICogRmVhdHVyZXM6XG4gKiAtIEJhdGNoIGJ1ZmZlcmluZyAoNTAgZW50cmllcyBvciAxcyBmbHVzaCwgd2hpY2hldmVyIGNvbWVzIGZpcnN0KVxuICogLSBJbi1tZW1vcnkgYnVmZmVyIHVwIHRvIDEwLDAwMCBlbnRyaWVzIG9uIGxlYWRlciBmYWlsdXJlXG4gKiAtIEV4cG9uZW50aWFsIGJhY2tvZmYgb24gUE9TVCBmYWlsdXJlICgxcyDihpIgMnMg4oaSIDRzLCBtYXggMzBzKVxuICogLSBBdXRvbWF0aWMgZHJhaW4gb24gbGVhZGVyIHJlY292ZXJ5XG4gKlxuICogQHNpbmNlIHYyLjEuMCDigJQgSXNzdWUgIzE3MDBcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IElMb2dTaW5rLCBVbmlmaWVkTG9nRW50cnkgfSBmcm9tICcuLi8uLi9sb2dnaW5nL3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgTWV0cmljU25hcHNob3QgfSBmcm9tICcuLi8uLi9tZXRyaWNzL3R5cGVzLmpzJztcbmltcG9ydCB7IFVuaWNvZGVWYWxpZGF0b3IgfSBmcm9tICcuLi8uLi9zZWN1cml0eS92YWxpZGF0b3JzL3VuaWNvZGVWYWxpZGF0b3IuanMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vLi4vdXRpbHMvbG9nZ2VyLmpzJztcbmltcG9ydCB7IGVudiB9IGZyb20gJy4uLy4uL2NvbmZpZy9lbnYuanMnO1xuXG4vKiogTWF4aW11bSBlbnRyaWVzIHRvIGJ1ZmZlciB3aGVuIGxlYWRlciBpcyB1bnJlYWNoYWJsZSAqL1xuY29uc3QgTUFYX0JVRkZFUl9TSVpFID0gMTBfMDAwO1xuXG4vKiogQmF0Y2ggc2l6ZSBiZWZvcmUgZmx1c2hpbmcgKi9cbmNvbnN0IEJBVENIX1NJWkUgPSA1MDtcblxuLyoqIFRpbWUtYmFzZWQgZmx1c2ggaW50ZXJ2YWwgKG1zKSAqL1xuY29uc3QgRkxVU0hfSU5URVJWQUxfTVMgPSAxXzAwMDtcblxuLyoqIEluaXRpYWwgYmFja29mZiBkZWxheSBvbiBmYWlsdXJlIChtcykgKi9cbmNvbnN0IElOSVRJQUxfQkFDS09GRl9NUyA9IDFfMDAwO1xuXG4vKiogTWF4aW11bSBiYWNrb2ZmIGRlbGF5IChtcykgKi9cbmNvbnN0IE1BWF9CQUNLT0ZGX01TID0gMzBfMDAwO1xuXG4vKiogR2l2ZSB1cCBmb3J3YXJkaW5nIGFmdGVyIHRoaXMgbWFueSBjb25zZWN1dGl2ZSBmYWlsdXJlcyAoIzE4NTA6IGNvbmZpZ3VyYWJsZSB2aWEgZW52KSAqL1xuY29uc3QgTUFYX0NPTlNFQ1VUSVZFX0ZBSUxVUkVTID0gZW52LkRPTExIT1VTRV9DT05TT0xFX01BWF9GT1JXQVJEX0ZBSUxVUkVTO1xuXG4vKiogSFRUUCByZXF1ZXN0IHRpbWVvdXQgKG1zKSAqL1xuY29uc3QgUkVRVUVTVF9USU1FT1VUX01TID0gNV8wMDA7XG5cbi8qKlxuICogQnVpbGQgdGhlIEhUVFAgaGVhZGVycyBmb3IgaW5nZXN0IFBPU1RzLCBpbmNsdWRpbmcgdGhlIGNvbnNvbGUgYXV0aCB0b2tlblxuICogaWYgb25lIHdhcyBwcm92aWRlZCAoIzE3ODApLiBGb2xsb3dlcnMgcmVhZCB0aGUgdG9rZW4gZnJvbSB0aGUgc2hhcmVkIHRva2VuXG4gKiBmaWxlIG9uIHN0YXJ0dXAgYW5kIHBhc3MgaXQgdG8gZWFjaCBzaW5rOyB3aGVuIHRoZSBsZWFkZXIgaGFzIGF1dGggZGlzYWJsZWRcbiAqIG9yIHRoZSB0b2tlbiBmaWxlIGlzIG1pc3NpbmcsIHRoaXMgaXMgYSBuby1vcCB0aGF0IHNlbmRzIG9ubHkgQ29udGVudC1UeXBlLlxuICovXG5mdW5jdGlvbiBidWlsZEluZ2VzdEhlYWRlcnModG9rZW46IHN0cmluZyB8IG51bGwpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgY29uc3QgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9O1xuICBpZiAodG9rZW4pIHtcbiAgICBoZWFkZXJzWydBdXRob3JpemF0aW9uJ10gPSBgQmVhcmVyICR7dG9rZW59YDtcbiAgfVxuICByZXR1cm4gaGVhZGVycztcbn1cblxuLyoqXG4gKiBJTG9nU2luayB0aGF0IGJhdGNoLVBPU1RzIGVudHJpZXMgdG8gdGhlIGxlYWRlcidzIC9hcGkvaW5nZXN0L2xvZ3MuXG4gKi9cbmV4cG9ydCBjbGFzcyBMZWFkZXJGb3J3YXJkaW5nTG9nU2luayBpbXBsZW1lbnRzIElMb2dTaW5rIHtcbiAgcHJpdmF0ZSByZWFkb25seSBidWZmZXI6IFVuaWZpZWRMb2dFbnRyeVtdID0gW107XG4gIHByaXZhdGUgZmx1c2hUaW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0SW50ZXJ2YWw+IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgYmFja29mZk1zID0gSU5JVElBTF9CQUNLT0ZGX01TO1xuICBwcml2YXRlIGZsdXNoaW5nID0gZmFsc2U7XG4gIHByaXZhdGUgY29uc2VjdXRpdmVGYWlsdXJlcyA9IDA7XG4gIHByaXZhdGUgZ2F2ZVVwID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBsZWFkZXJVcmw6IHN0cmluZyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHNlc3Npb25JZDogc3RyaW5nLFxuICAgIC8qKiBPcHRpb25hbCBjb25zb2xlIGF1dGggdG9rZW4gKCMxNzgwKS4gSW5jbHVkZWQgYXMgQmVhcmVyIGhlYWRlciBvbiBpbmdlc3QgUE9TVHMuICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBhdXRoVG9rZW46IHN0cmluZyB8IG51bGwgPSBudWxsLFxuICAgIC8qKiBDYWxsYmFjayBpbnZva2VkIHdoZW4gdGhlIGxlYWRlciBpcyBwcmVzdW1lZCBkZWFkIGFmdGVyIE1BWF9DT05TRUNVVElWRV9GQUlMVVJFUyAoIzE4NTApLiAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgb25MZWFkZXJEZWF0aD86ICgpID0+IHZvaWQsXG4gICkge1xuICAgIHRoaXMuc2Vzc2lvbklkID0gVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUoc2Vzc2lvbklkKS5ub3JtYWxpemVkQ29udGVudDtcbiAgICB0aGlzLmZsdXNoVGltZXIgPSBzZXRJbnRlcnZhbCgoKSA9PiB0aGlzLmZsdXNoQnVmZmVyKCksIEZMVVNIX0lOVEVSVkFMX01TKTtcbiAgICB0aGlzLmZsdXNoVGltZXIudW5yZWYoKTtcbiAgfVxuXG4gIHdyaXRlKGVudHJ5OiBVbmlmaWVkTG9nRW50cnkpOiB2b2lkIHtcbiAgICAvLyBTdGFtcCBzZXNzaW9uIElEIGJlZm9yZSBidWZmZXJpbmdcbiAgICBjb25zdCBzdGFtcGVkOiBVbmlmaWVkTG9nRW50cnkgPSB7XG4gICAgICAuLi5lbnRyeSxcbiAgICAgIGRhdGE6IHsgLi4uZW50cnkuZGF0YSwgX3Nlc3Npb25JZDogdGhpcy5zZXNzaW9uSWQgfSxcbiAgICB9O1xuXG4gICAgaWYgKHRoaXMuYnVmZmVyLmxlbmd0aCA+PSBNQVhfQlVGRkVSX1NJWkUpIHtcbiAgICAgIC8vIEV2aWN0IG9sZGVzdCBlbnRyeSAoRklGTylcbiAgICAgIHRoaXMuYnVmZmVyLnNoaWZ0KCk7XG4gICAgfVxuICAgIHRoaXMuYnVmZmVyLnB1c2goc3RhbXBlZCk7XG5cbiAgICBpZiAodGhpcy5idWZmZXIubGVuZ3RoID49IEJBVENIX1NJWkUpIHtcbiAgICAgIHRoaXMuZmx1c2hCdWZmZXIoKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBmbHVzaCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmZsdXNoQnVmZmVyKCk7XG4gIH1cblxuICBhc3luYyBjbG9zZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5mbHVzaFRpbWVyKSB7XG4gICAgICBjbGVhckludGVydmFsKHRoaXMuZmx1c2hUaW1lcik7XG4gICAgICB0aGlzLmZsdXNoVGltZXIgPSBudWxsO1xuICAgIH1cbiAgICBhd2FpdCB0aGlzLmZsdXNoQnVmZmVyKCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGZsdXNoQnVmZmVyKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmZsdXNoaW5nIHx8IHRoaXMuYnVmZmVyLmxlbmd0aCA9PT0gMCB8fCB0aGlzLmdhdmVVcCkgcmV0dXJuO1xuICAgIHRoaXMuZmx1c2hpbmcgPSB0cnVlO1xuXG4gICAgY29uc3QgYmF0Y2ggPSB0aGlzLmJ1ZmZlci5zcGxpY2UoMCwgQkFUQ0hfU0laRSk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgICBjb25zdCB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiBjb250cm9sbGVyLmFib3J0KCksIFJFUVVFU1RfVElNRU9VVF9NUyk7XG5cbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYCR7dGhpcy5sZWFkZXJVcmx9L2FwaS9pbmdlc3QvbG9nc2AsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IGJ1aWxkSW5nZXN0SGVhZGVycyh0aGlzLmF1dGhUb2tlbiksXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgc2Vzc2lvbklkOiB0aGlzLnNlc3Npb25JZCwgZW50cmllczogYmF0Y2ggfSksXG4gICAgICAgIHNpZ25hbDogY29udHJvbGxlci5zaWduYWwsXG4gICAgICB9KTtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcblxuICAgICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICAgIHRoaXMuYmFja29mZk1zID0gSU5JVElBTF9CQUNLT0ZGX01TO1xuICAgICAgICB0aGlzLmNvbnNlY3V0aXZlRmFpbHVyZXMgPSAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5yZXF1ZXVlQmF0Y2goYmF0Y2gpO1xuICAgICAgICB0aGlzLmhhbmRsZUZhaWx1cmUoKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIHRoaXMucmVxdWV1ZUJhdGNoKGJhdGNoKTtcbiAgICAgIHRoaXMuaGFuZGxlRmFpbHVyZSgpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLmZsdXNoaW5nID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZXF1ZXVlQmF0Y2goYmF0Y2g6IFVuaWZpZWRMb2dFbnRyeVtdKTogdm9pZCB7XG4gICAgY29uc3Qgc3BhY2VBdmFpbGFibGUgPSBNQVhfQlVGRkVSX1NJWkUgLSB0aGlzLmJ1ZmZlci5sZW5ndGg7XG4gICAgaWYgKHNwYWNlQXZhaWxhYmxlID4gMCkge1xuICAgICAgY29uc3QgdG9SZXF1ZXVlID0gYmF0Y2guc2xpY2UoMCwgc3BhY2VBdmFpbGFibGUpO1xuICAgICAgdGhpcy5idWZmZXIudW5zaGlmdCguLi50b1JlcXVldWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsb2dnZXIud2FybihgW0ZvcndhcmRpbmdTaW5rXSBCdWZmZXIgZnVsbCAoJHtNQVhfQlVGRkVSX1NJWkV9KSwgZHJvcHBpbmcgJHtiYXRjaC5sZW5ndGh9IGVudHJpZXNgKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUZhaWx1cmUoKTogdm9pZCB7XG4gICAgdGhpcy5jb25zZWN1dGl2ZUZhaWx1cmVzKys7XG5cbiAgICBpZiAodGhpcy5jb25zZWN1dGl2ZUZhaWx1cmVzID49IE1BWF9DT05TRUNVVElWRV9GQUlMVVJFUykge1xuICAgICAgaWYgKCF0aGlzLmdhdmVVcCkge1xuICAgICAgICB0aGlzLmdhdmVVcCA9IHRydWU7XG4gICAgICAgIGxvZ2dlci5pbmZvKGBbRm9yd2FyZGluZ1NpbmtdIExlYWRlciBub3QgcnVubmluZyB3ZWIgY29uc29sZSDigJQgbG9nIGZvcndhcmRpbmcgZGlzYWJsZWQgYWZ0ZXIgJHt0aGlzLmNvbnNlY3V0aXZlRmFpbHVyZXN9IGZhaWxlZCBhdHRlbXB0cy4gQnVmZmVyZWQgJHt0aGlzLmJ1ZmZlci5sZW5ndGh9IGVudHJpZXMgZGlzY2FyZGVkLmApO1xuICAgICAgICB0aGlzLmJ1ZmZlci5sZW5ndGggPSAwO1xuICAgICAgICBpZiAodGhpcy5mbHVzaFRpbWVyKSB7XG4gICAgICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLmZsdXNoVGltZXIpO1xuICAgICAgICAgIHRoaXMuZmx1c2hUaW1lciA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgLy8gTm90aWZ5IHRoZSBvcmNoZXN0cmF0b3Igc28gaXQgY2FuIGF0dGVtcHQgZm9sbG93ZXItdG8tbGVhZGVyIHByb21vdGlvbiAoIzE4NTApLlxuICAgICAgICAvLyBGaXJlZCBhc3luY2hyb25vdXNseSBzbyBoYW5kbGVGYWlsdXJlIGNvbXBsZXRlcyBjbGVhbmx5IGJlZm9yZSBwcm9tb3Rpb24gcnVucy5cbiAgICAgICAgaWYgKHRoaXMub25MZWFkZXJEZWF0aCkge1xuICAgICAgICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHRoaXMub25MZWFkZXJEZWF0aCEoKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsb2dnZXIuZGVidWcoYFtGb3J3YXJkaW5nU2lua10gTGVhZGVyIHVucmVhY2hhYmxlLCBiYWNrb2ZmICR7dGhpcy5iYWNrb2ZmTXN9bXMgKGF0dGVtcHQgJHt0aGlzLmNvbnNlY3V0aXZlRmFpbHVyZXN9LyR7TUFYX0NPTlNFQ1VUSVZFX0ZBSUxVUkVTfSwgYnVmZmVyZWQ6ICR7dGhpcy5idWZmZXIubGVuZ3RofSlgKTtcbiAgICB0aGlzLmJhY2tvZmZNcyA9IE1hdGgubWluKHRoaXMuYmFja29mZk1zICogMiwgTUFYX0JBQ0tPRkZfTVMpO1xuICB9XG59XG5cbi8qKlxuICogRm9yd2FyZHMgbWV0cmljIHNuYXBzaG90cyB0byB0aGUgbGVhZGVyJ3MgL2FwaS9pbmdlc3QvbWV0cmljcy5cbiAqL1xuZXhwb3J0IGNsYXNzIExlYWRlckZvcndhcmRpbmdNZXRyaWNzU2luayB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgbGVhZGVyVXJsOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSByZWFkb25seSBzZXNzaW9uSWQ6IHN0cmluZyxcbiAgICAvKiogT3B0aW9uYWwgY29uc29sZSBhdXRoIHRva2VuICgjMTc4MCkuIEluY2x1ZGVkIGFzIEJlYXJlciBoZWFkZXIgb24gaW5nZXN0IFBPU1RzLiAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgYXV0aFRva2VuOiBzdHJpbmcgfCBudWxsID0gbnVsbCxcbiAgKSB7fVxuXG4gIGFzeW5jIG9uU25hcHNob3Qoc25hcHNob3Q6IE1ldHJpY1NuYXBzaG90KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgICBjb25zdCB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiBjb250cm9sbGVyLmFib3J0KCksIFJFUVVFU1RfVElNRU9VVF9NUyk7XG5cbiAgICAgIGF3YWl0IGZldGNoKGAke3RoaXMubGVhZGVyVXJsfS9hcGkvaW5nZXN0L21ldHJpY3NgLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBoZWFkZXJzOiBidWlsZEluZ2VzdEhlYWRlcnModGhpcy5hdXRoVG9rZW4pLFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHNlc3Npb25JZDogdGhpcy5zZXNzaW9uSWQsIHNuYXBzaG90IH0pLFxuICAgICAgICBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsLFxuICAgICAgfSk7XG4gICAgICBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICBsb2dnZXIuZGVidWcoJ1tGb3J3YXJkaW5nU2lua10gRmFpbGVkIHRvIGZvcndhcmQgbWV0cmljcyBzbmFwc2hvdCcpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFNlbmRzIHNlc3Npb24gbGlmZWN5Y2xlIGV2ZW50cyB0byB0aGUgbGVhZGVyLlxuICovXG5leHBvcnQgY2xhc3MgU2Vzc2lvbkhlYXJ0YmVhdCB7XG4gIHByaXZhdGUgaGVhcnRiZWF0VGltZXI6IFJldHVyblR5cGU8dHlwZW9mIHNldEludGVydmFsPiB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgbGVhZGVyVXJsOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSByZWFkb25seSBzZXNzaW9uSWQ6IHN0cmluZyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHBpZDogbnVtYmVyLFxuICAgIC8qKiBPcHRpb25hbCBjb25zb2xlIGF1dGggdG9rZW4gKCMxNzgwKS4gSW5jbHVkZWQgYXMgQmVhcmVyIGhlYWRlciBvbiBpbmdlc3QgUE9TVHMuICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBhdXRoVG9rZW46IHN0cmluZyB8IG51bGwgPSBudWxsLFxuICApIHt9XG5cbiAgLyoqIE5vdGlmeSB0aGUgbGVhZGVyIHRoYXQgdGhpcyBzZXNzaW9uIGhhcyBzdGFydGVkICovXG4gIGFzeW5jIHN0YXJ0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuc2VuZEV2ZW50KCdzdGFydGVkJyk7XG5cbiAgICB0aGlzLmhlYXJ0YmVhdFRpbWVyID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgdGhpcy5zZW5kRXZlbnQoJ2hlYXJ0YmVhdCcpLmNhdGNoKCgpID0+IHt9KTtcbiAgICB9LCAxMF8wMDApO1xuICAgIHRoaXMuaGVhcnRiZWF0VGltZXIudW5yZWYoKTtcbiAgfVxuXG4gIC8qKiBOb3RpZnkgdGhlIGxlYWRlciB0aGF0IHRoaXMgc2Vzc2lvbiBpcyBzdG9wcGluZyAqL1xuICBhc3luYyBzdG9wKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmhlYXJ0YmVhdFRpbWVyKSB7XG4gICAgICBjbGVhckludGVydmFsKHRoaXMuaGVhcnRiZWF0VGltZXIpO1xuICAgICAgdGhpcy5oZWFydGJlYXRUaW1lciA9IG51bGw7XG4gICAgfVxuICAgIGF3YWl0IHRoaXMuc2VuZEV2ZW50KCdzdG9wcGVkJyk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHNlbmRFdmVudChldmVudDogJ3N0YXJ0ZWQnIHwgJ3N0b3BwZWQnIHwgJ2hlYXJ0YmVhdCcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICAgIGNvbnN0IHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IGNvbnRyb2xsZXIuYWJvcnQoKSwgUkVRVUVTVF9USU1FT1VUX01TKTtcblxuICAgICAgYXdhaXQgZmV0Y2goYCR7dGhpcy5sZWFkZXJVcmx9L2FwaS9pbmdlc3Qvc2Vzc2lvbmAsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IGJ1aWxkSW5nZXN0SGVhZGVycyh0aGlzLmF1dGhUb2tlbiksXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICBzZXNzaW9uSWQ6IHRoaXMuc2Vzc2lvbklkLFxuICAgICAgICAgIGV2ZW50LFxuICAgICAgICAgIHBpZDogdGhpcy5waWQsXG4gICAgICAgICAgc3RhcnRlZEF0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICAgIH0pLFxuICAgICAgICBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsLFxuICAgICAgfSk7XG4gICAgICBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICBsb2dnZXIuZGVidWcoYFtTZXNzaW9uSGVhcnRiZWF0XSBGYWlsZWQgdG8gc2VuZCAke2V2ZW50fSBldmVudGApO1xuICAgIH1cbiAgfVxufVxuIl19
254
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTGVhZGVyRm9yd2FyZGluZ1NpbmsuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvd2ViL2NvbnNvbGUvTGVhZGVyRm9yd2FyZGluZ1NpbmsudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBSUgsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sK0NBQStDLENBQUM7QUFDakYsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzdELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDMUMsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFL0QsMkRBQTJEO0FBQzNELE1BQU0sZUFBZSxHQUFHLE1BQU0sQ0FBQztBQUUvQixpQ0FBaUM7QUFDakMsTUFBTSxVQUFVLEdBQUcsRUFBRSxDQUFDO0FBRXRCLHFDQUFxQztBQUNyQyxNQUFNLGlCQUFpQixHQUFHLEtBQUssQ0FBQztBQUVoQyw0Q0FBNEM7QUFDNUMsTUFBTSxrQkFBa0IsR0FBRyxLQUFLLENBQUM7QUFFakMsaUNBQWlDO0FBQ2pDLE1BQU0sY0FBYyxHQUFHLE1BQU0sQ0FBQztBQUU5Qiw0RkFBNEY7QUFDNUYsTUFBTSx3QkFBd0IsR0FBRyxHQUFHLENBQUMsc0NBQXNDLENBQUM7QUFFNUUsZ0NBQWdDO0FBQ2hDLE1BQU0sa0JBQWtCLEdBQUcsS0FBSyxDQUFDO0FBRWpDOzs7OztHQUtHO0FBQ0gsU0FBUyxrQkFBa0IsQ0FBQyxLQUFvQjtJQUM5QyxNQUFNLE9BQU8sR0FBMkIsRUFBRSxjQUFjLEVBQUUsa0JBQWtCLEVBQUUsQ0FBQztJQUMvRSxJQUFJLEtBQUssRUFBRSxDQUFDO1FBQ1YsT0FBTyxDQUFDLGVBQWUsQ0FBQyxHQUFHLFVBQVUsS0FBSyxFQUFFLENBQUM7SUFDL0MsQ0FBQztJQUNELE9BQU8sT0FBTyxDQUFDO0FBQ2pCLENBQUM7QUFFRDs7R0FFRztBQUNILE1BQU0sT0FBTyx1QkFBdUI7SUFTZjtJQUNBO0lBRUE7SUFFQTtJQWJGLE1BQU0sR0FBc0IsRUFBRSxDQUFDO0lBQ3hDLFVBQVUsR0FBMEMsSUFBSSxDQUFDO0lBQ3pELFNBQVMsR0FBRyxrQkFBa0IsQ0FBQztJQUMvQixRQUFRLEdBQUcsS0FBSyxDQUFDO0lBQ2pCLG1CQUFtQixHQUFHLENBQUMsQ0FBQztJQUN4QixNQUFNLEdBQUcsS0FBSyxDQUFDO0lBRXZCLFlBQ21CLFNBQWlCLEVBQ2pCLFNBQWlCO0lBQ2xDLHNGQUFzRjtJQUNyRSxZQUEyQixJQUFJO0lBQ2hELGdHQUFnRztJQUMvRSxhQUEwQjtRQUwxQixjQUFTLEdBQVQsU0FBUyxDQUFRO1FBQ2pCLGNBQVMsR0FBVCxTQUFTLENBQVE7UUFFakIsY0FBUyxHQUFULFNBQVMsQ0FBc0I7UUFFL0Isa0JBQWEsR0FBYixhQUFhLENBQWE7UUFFM0MsSUFBSSxDQUFDLFNBQVMsR0FBRyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsaUJBQWlCLENBQUM7UUFDekUsSUFBSSxDQUFDLFVBQVUsR0FBRyxXQUFXLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFFLGlCQUFpQixDQUFDLENBQUM7UUFDM0UsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRUQsS0FBSyxDQUFDLEtBQXNCO1FBQzFCLG9DQUFvQztRQUNwQyxNQUFNLE9BQU8sR0FBb0I7WUFDL0IsR0FBRyxLQUFLO1lBQ1IsSUFBSSxFQUFFLEVBQUUsR0FBRyxLQUFLLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFO1NBQ3BELENBQUM7UUFFRixJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxJQUFJLGVBQWUsRUFBRSxDQUFDO1lBQzFDLDRCQUE0QjtZQUM1QixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3RCLENBQUM7UUFDRCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUUxQixJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxJQUFJLFVBQVUsRUFBRSxDQUFDO1lBQ3JDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNyQixDQUFDO0lBQ0gsQ0FBQztJQUVELEtBQUssQ0FBQyxLQUFLO1FBQ1QsTUFBTSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVELEtBQUssQ0FBQyxLQUFLO1FBQ1QsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDcEIsYUFBYSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUMvQixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztRQUN6QixDQUFDO1FBQ0QsTUFBTSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVPLEtBQUssQ0FBQyxXQUFXO1FBQ3ZCLElBQUksSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLE1BQU07WUFBRSxPQUFPO1FBQ3JFLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO1FBRXJCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUNoRCxJQUFJLENBQUM7WUFDSCxNQUFNLFVBQVUsR0FBRyxJQUFJLGVBQWUsRUFBRSxDQUFDO1lBQ3pDLE1BQU0sT0FBTyxHQUFHLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztZQUV6RSxNQUFNLFFBQVEsR0FBRyxNQUFNLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLGtCQUFrQixFQUFFO2dCQUNoRSxNQUFNLEVBQUUsTUFBTTtnQkFDZCxPQUFPLEVBQUUsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQztnQkFDM0MsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUM7Z0JBQ25FLE1BQU0sRUFBRSxVQUFVLENBQUMsTUFBTTthQUMxQixDQUFDLENBQUM7WUFDSCxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7WUFFdEIsSUFBSSxRQUFRLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQ2hCLElBQUksQ0FBQyxTQUFTLEdBQUcsa0JBQWtCLENBQUM7Z0JBQ3BDLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxDQUFDLENBQUM7WUFDL0IsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3pCLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUN2QixDQUFDO1FBQ0gsQ0FBQztRQUFDLE1BQU0sQ0FBQztZQUNQLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDekIsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3ZCLENBQUM7Z0JBQVMsQ0FBQztZQUNULElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO1FBQ3hCLENBQUM7SUFDSCxDQUFDO0lBRU8sWUFBWSxDQUFDLEtBQXdCO1FBQzNDLE1BQU0sY0FBYyxHQUFHLGVBQWUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQztRQUM1RCxJQUFJLGNBQWMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN2QixNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxjQUFjLENBQUMsQ0FBQztZQUNqRCxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLFNBQVMsQ0FBQyxDQUFDO1FBQ3BDLENBQUM7YUFBTSxDQUFDO1lBQ04sTUFBTSxDQUFDLElBQUksQ0FBQyxpQ0FBaUMsZUFBZSxlQUFlLEtBQUssQ0FBQyxNQUFNLFVBQVUsQ0FBQyxDQUFDO1FBQ3JHLENBQUM7SUFDSCxDQUFDO0lBRU8sYUFBYTtRQUNuQixJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztRQUUzQixJQUFJLElBQUksQ0FBQyxtQkFBbUIsSUFBSSx3QkFBd0IsRUFBRSxDQUFDO1lBQ3pELElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ2pCLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO2dCQUNuQixNQUFNLENBQUMsSUFBSSxDQUFDLG1GQUFtRixJQUFJLENBQUMsbUJBQW1CLDhCQUE4QixJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0scUJBQXFCLENBQUMsQ0FBQztnQkFDOUwsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO2dCQUN2QixJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztvQkFDcEIsYUFBYSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztvQkFDL0IsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7Z0JBQ3pCLENBQUM7Z0JBQ0Qsa0ZBQWtGO2dCQUNsRixpRkFBaUY7Z0JBQ2pGLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO29CQUN2QixjQUFjLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGFBQWMsRUFBRSxDQUFDLENBQUM7Z0JBQzlDLENBQUM7WUFDSCxDQUFDO1lBQ0QsT0FBTztRQUNULENBQUM7UUFFRCxNQUFNLENBQUMsS0FBSyxDQUFDLGdEQUFnRCxJQUFJLENBQUMsU0FBUyxlQUFlLElBQUksQ0FBQyxtQkFBbUIsSUFBSSx3QkFBd0IsZUFBZSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDcEwsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxDQUFDO0lBQ2hFLENBQUM7Q0FDRjtBQUVEOztHQUVHO0FBQ0gsTUFBTSxPQUFPLDJCQUEyQjtJQUVuQjtJQUNBO0lBRUE7SUFKbkIsWUFDbUIsU0FBaUIsRUFDakIsU0FBaUI7SUFDbEMsc0ZBQXNGO0lBQ3JFLFlBQTJCLElBQUk7UUFIL0IsY0FBUyxHQUFULFNBQVMsQ0FBUTtRQUNqQixjQUFTLEdBQVQsU0FBUyxDQUFRO1FBRWpCLGNBQVMsR0FBVCxTQUFTLENBQXNCO0lBQy9DLENBQUM7SUFFSixLQUFLLENBQUMsVUFBVSxDQUFDLFFBQXdCO1FBQ3ZDLElBQUksQ0FBQztZQUNILE1BQU0sVUFBVSxHQUFHLElBQUksZUFBZSxFQUFFLENBQUM7WUFDekMsTUFBTSxPQUFPLEdBQUcsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO1lBRXpFLE1BQU0sS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMscUJBQXFCLEVBQUU7Z0JBQ2xELE1BQU0sRUFBRSxNQUFNO2dCQUNkLE9BQU8sRUFBRSxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDO2dCQUMzQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLFFBQVEsRUFBRSxDQUFDO2dCQUM3RCxNQUFNLEVBQUUsVUFBVSxDQUFDLE1BQU07YUFDMUIsQ0FBQyxDQUFDO1lBQ0gsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3hCLENBQUM7UUFBQyxNQUFNLENBQUM7WUFDUCxNQUFNLENBQUMsS0FBSyxDQUFDLHFEQUFxRCxDQUFDLENBQUM7UUFDdEUsQ0FBQztJQUNILENBQUM7Q0FDRjtBQUVEOztHQUVHO0FBQ0gsTUFBTSxPQUFPLGdCQUFnQjtJQUlSO0lBQ0E7SUFDQTtJQUVBO0lBUFgsY0FBYyxHQUEwQyxJQUFJLENBQUM7SUFFckUsWUFDbUIsU0FBaUIsRUFDakIsU0FBaUIsRUFDakIsR0FBVztJQUM1QixzRkFBc0Y7SUFDckUsWUFBMkIsSUFBSTtRQUovQixjQUFTLEdBQVQsU0FBUyxDQUFRO1FBQ2pCLGNBQVMsR0FBVCxTQUFTLENBQVE7UUFDakIsUUFBRyxHQUFILEdBQUcsQ0FBUTtRQUVYLGNBQVMsR0FBVCxTQUFTLENBQXNCO0lBQy9DLENBQUM7SUFFSixzREFBc0Q7SUFDdEQsS0FBSyxDQUFDLEtBQUs7UUFDVCxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFaEMsSUFBSSxDQUFDLGNBQWMsR0FBRyxXQUFXLENBQUMsR0FBRyxFQUFFO1lBQ3JDLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxHQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzlDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNYLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDOUIsQ0FBQztJQUVELHNEQUFzRDtJQUN0RCxLQUFLLENBQUMsSUFBSTtRQUNSLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3hCLGFBQWEsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDbkMsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7UUFDN0IsQ0FBQztRQUNELE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRU8sS0FBSyxDQUFDLFNBQVMsQ0FBQyxLQUEwQztRQUNoRSxJQUFJLENBQUM7WUFDSCxNQUFNLFVBQVUsR0FBRyxJQUFJLGVBQWUsRUFBRSxDQUFDO1lBQ3pDLE1BQU0sT0FBTyxHQUFHLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztZQUV6RSxNQUFNLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLHFCQUFxQixFQUFFO2dCQUNsRCxNQUFNLEVBQUUsTUFBTTtnQkFDZCxPQUFPLEVBQUUsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQztnQkFDM0MsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUM7b0JBQ25CLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUztvQkFDekIsS0FBSztvQkFDTCxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUc7b0JBQ2IsU0FBUyxFQUFFLElBQUksSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFO29CQUNuQyxhQUFhLEVBQUUsZUFBZTtvQkFDOUIsc0JBQXNCLEVBQUUsd0JBQXdCO2lCQUNqRCxDQUFDO2dCQUNGLE1BQU0sRUFBRSxVQUFVLENBQUMsTUFBTTthQUMxQixDQUFDLENBQUM7WUFDSCxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDeEIsQ0FBQztRQUFDLE1BQU0sQ0FBQztZQUNQLE1BQU0sQ0FBQyxLQUFLLENBQUMscUNBQXFDLEtBQUssUUFBUSxDQUFDLENBQUM7UUFDbkUsQ0FBQztJQUNILENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRm9yd2FyZGluZyBzaW5rcyBmb3IgZm9sbG93ZXIgTUNQIHNlcnZlcnMuXG4gKlxuICogV2hlbiBhIHNlcnZlciBiZWNvbWVzIGEgZm9sbG93ZXIgaW4gdGhlIHVuaWZpZWQgY29uc29sZSBlbGVjdGlvbiwgaXRcbiAqIHJlZ2lzdGVycyB0aGVzZSBzaW5rcyB3aXRoIGl0cyBMb2dNYW5hZ2VyIGFuZCBNZXRyaWNzTWFuYWdlci4gSW5zdGVhZFxuICogb2YgYnJvYWRjYXN0aW5nIHRvIGxvY2FsIFNTRSBjbGllbnRzLCBlbnRyaWVzIGFyZSBiYXRjaC1QT1NUZWQgdG9cbiAqIHRoZSBsZWFkZXIncyBpbmdlc3Rpb24gZW5kcG9pbnRzLlxuICpcbiAqIEZlYXR1cmVzOlxuICogLSBCYXRjaCBidWZmZXJpbmcgKDUwIGVudHJpZXMgb3IgMXMgZmx1c2gsIHdoaWNoZXZlciBjb21lcyBmaXJzdClcbiAqIC0gSW4tbWVtb3J5IGJ1ZmZlciB1cCB0byAxMCwwMDAgZW50cmllcyBvbiBsZWFkZXIgZmFpbHVyZVxuICogLSBFeHBvbmVudGlhbCBiYWNrb2ZmIG9uIFBPU1QgZmFpbHVyZSAoMXMg4oaSIDJzIOKGkiA0cywgbWF4IDMwcylcbiAqIC0gQXV0b21hdGljIGRyYWluIG9uIGxlYWRlciByZWNvdmVyeVxuICpcbiAqIEBzaW5jZSB2Mi4xLjAg4oCUIElzc3VlICMxNzAwXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBJTG9nU2luaywgVW5pZmllZExvZ0VudHJ5IH0gZnJvbSAnLi4vLi4vbG9nZ2luZy90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IE1ldHJpY1NuYXBzaG90IH0gZnJvbSAnLi4vLi4vbWV0cmljcy90eXBlcy5qcyc7XG5pbXBvcnQgeyBVbmljb2RlVmFsaWRhdG9yIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvdmFsaWRhdG9ycy91bmljb2RlVmFsaWRhdG9yLmpzJztcbmltcG9ydCB7IFBBQ0tBR0VfVkVSU0lPTiB9IGZyb20gJy4uLy4uL2dlbmVyYXRlZC92ZXJzaW9uLmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uLy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBlbnYgfSBmcm9tICcuLi8uLi9jb25maWcvZW52LmpzJztcbmltcG9ydCB7IENPTlNPTEVfUFJPVE9DT0xfVkVSU0lPTiB9IGZyb20gJy4vTGVhZGVyRWxlY3Rpb24uanMnO1xuXG4vKiogTWF4aW11bSBlbnRyaWVzIHRvIGJ1ZmZlciB3aGVuIGxlYWRlciBpcyB1bnJlYWNoYWJsZSAqL1xuY29uc3QgTUFYX0JVRkZFUl9TSVpFID0gMTBfMDAwO1xuXG4vKiogQmF0Y2ggc2l6ZSBiZWZvcmUgZmx1c2hpbmcgKi9cbmNvbnN0IEJBVENIX1NJWkUgPSA1MDtcblxuLyoqIFRpbWUtYmFzZWQgZmx1c2ggaW50ZXJ2YWwgKG1zKSAqL1xuY29uc3QgRkxVU0hfSU5URVJWQUxfTVMgPSAxXzAwMDtcblxuLyoqIEluaXRpYWwgYmFja29mZiBkZWxheSBvbiBmYWlsdXJlIChtcykgKi9cbmNvbnN0IElOSVRJQUxfQkFDS09GRl9NUyA9IDFfMDAwO1xuXG4vKiogTWF4aW11bSBiYWNrb2ZmIGRlbGF5IChtcykgKi9cbmNvbnN0IE1BWF9CQUNLT0ZGX01TID0gMzBfMDAwO1xuXG4vKiogR2l2ZSB1cCBmb3J3YXJkaW5nIGFmdGVyIHRoaXMgbWFueSBjb25zZWN1dGl2ZSBmYWlsdXJlcyAoIzE4NTA6IGNvbmZpZ3VyYWJsZSB2aWEgZW52KSAqL1xuY29uc3QgTUFYX0NPTlNFQ1VUSVZFX0ZBSUxVUkVTID0gZW52LkRPTExIT1VTRV9DT05TT0xFX01BWF9GT1JXQVJEX0ZBSUxVUkVTO1xuXG4vKiogSFRUUCByZXF1ZXN0IHRpbWVvdXQgKG1zKSAqL1xuY29uc3QgUkVRVUVTVF9USU1FT1VUX01TID0gNV8wMDA7XG5cbi8qKlxuICogQnVpbGQgdGhlIEhUVFAgaGVhZGVycyBmb3IgaW5nZXN0IFBPU1RzLCBpbmNsdWRpbmcgdGhlIGNvbnNvbGUgYXV0aCB0b2tlblxuICogaWYgb25lIHdhcyBwcm92aWRlZCAoIzE3ODApLiBGb2xsb3dlcnMgcmVhZCB0aGUgdG9rZW4gZnJvbSB0aGUgc2hhcmVkIHRva2VuXG4gKiBmaWxlIG9uIHN0YXJ0dXAgYW5kIHBhc3MgaXQgdG8gZWFjaCBzaW5rOyB3aGVuIHRoZSBsZWFkZXIgaGFzIGF1dGggZGlzYWJsZWRcbiAqIG9yIHRoZSB0b2tlbiBmaWxlIGlzIG1pc3NpbmcsIHRoaXMgaXMgYSBuby1vcCB0aGF0IHNlbmRzIG9ubHkgQ29udGVudC1UeXBlLlxuICovXG5mdW5jdGlvbiBidWlsZEluZ2VzdEhlYWRlcnModG9rZW46IHN0cmluZyB8IG51bGwpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgY29uc3QgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9O1xuICBpZiAodG9rZW4pIHtcbiAgICBoZWFkZXJzWydBdXRob3JpemF0aW9uJ10gPSBgQmVhcmVyICR7dG9rZW59YDtcbiAgfVxuICByZXR1cm4gaGVhZGVycztcbn1cblxuLyoqXG4gKiBJTG9nU2luayB0aGF0IGJhdGNoLVBPU1RzIGVudHJpZXMgdG8gdGhlIGxlYWRlcidzIC9hcGkvaW5nZXN0L2xvZ3MuXG4gKi9cbmV4cG9ydCBjbGFzcyBMZWFkZXJGb3J3YXJkaW5nTG9nU2luayBpbXBsZW1lbnRzIElMb2dTaW5rIHtcbiAgcHJpdmF0ZSByZWFkb25seSBidWZmZXI6IFVuaWZpZWRMb2dFbnRyeVtdID0gW107XG4gIHByaXZhdGUgZmx1c2hUaW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0SW50ZXJ2YWw+IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgYmFja29mZk1zID0gSU5JVElBTF9CQUNLT0ZGX01TO1xuICBwcml2YXRlIGZsdXNoaW5nID0gZmFsc2U7XG4gIHByaXZhdGUgY29uc2VjdXRpdmVGYWlsdXJlcyA9IDA7XG4gIHByaXZhdGUgZ2F2ZVVwID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBsZWFkZXJVcmw6IHN0cmluZyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHNlc3Npb25JZDogc3RyaW5nLFxuICAgIC8qKiBPcHRpb25hbCBjb25zb2xlIGF1dGggdG9rZW4gKCMxNzgwKS4gSW5jbHVkZWQgYXMgQmVhcmVyIGhlYWRlciBvbiBpbmdlc3QgUE9TVHMuICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBhdXRoVG9rZW46IHN0cmluZyB8IG51bGwgPSBudWxsLFxuICAgIC8qKiBDYWxsYmFjayBpbnZva2VkIHdoZW4gdGhlIGxlYWRlciBpcyBwcmVzdW1lZCBkZWFkIGFmdGVyIE1BWF9DT05TRUNVVElWRV9GQUlMVVJFUyAoIzE4NTApLiAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgb25MZWFkZXJEZWF0aD86ICgpID0+IHZvaWQsXG4gICkge1xuICAgIHRoaXMuc2Vzc2lvbklkID0gVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUoc2Vzc2lvbklkKS5ub3JtYWxpemVkQ29udGVudDtcbiAgICB0aGlzLmZsdXNoVGltZXIgPSBzZXRJbnRlcnZhbCgoKSA9PiB0aGlzLmZsdXNoQnVmZmVyKCksIEZMVVNIX0lOVEVSVkFMX01TKTtcbiAgICB0aGlzLmZsdXNoVGltZXIudW5yZWYoKTtcbiAgfVxuXG4gIHdyaXRlKGVudHJ5OiBVbmlmaWVkTG9nRW50cnkpOiB2b2lkIHtcbiAgICAvLyBTdGFtcCBzZXNzaW9uIElEIGJlZm9yZSBidWZmZXJpbmdcbiAgICBjb25zdCBzdGFtcGVkOiBVbmlmaWVkTG9nRW50cnkgPSB7XG4gICAgICAuLi5lbnRyeSxcbiAgICAgIGRhdGE6IHsgLi4uZW50cnkuZGF0YSwgX3Nlc3Npb25JZDogdGhpcy5zZXNzaW9uSWQgfSxcbiAgICB9O1xuXG4gICAgaWYgKHRoaXMuYnVmZmVyLmxlbmd0aCA+PSBNQVhfQlVGRkVSX1NJWkUpIHtcbiAgICAgIC8vIEV2aWN0IG9sZGVzdCBlbnRyeSAoRklGTylcbiAgICAgIHRoaXMuYnVmZmVyLnNoaWZ0KCk7XG4gICAgfVxuICAgIHRoaXMuYnVmZmVyLnB1c2goc3RhbXBlZCk7XG5cbiAgICBpZiAodGhpcy5idWZmZXIubGVuZ3RoID49IEJBVENIX1NJWkUpIHtcbiAgICAgIHRoaXMuZmx1c2hCdWZmZXIoKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBmbHVzaCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmZsdXNoQnVmZmVyKCk7XG4gIH1cblxuICBhc3luYyBjbG9zZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5mbHVzaFRpbWVyKSB7XG4gICAgICBjbGVhckludGVydmFsKHRoaXMuZmx1c2hUaW1lcik7XG4gICAgICB0aGlzLmZsdXNoVGltZXIgPSBudWxsO1xuICAgIH1cbiAgICBhd2FpdCB0aGlzLmZsdXNoQnVmZmVyKCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGZsdXNoQnVmZmVyKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmZsdXNoaW5nIHx8IHRoaXMuYnVmZmVyLmxlbmd0aCA9PT0gMCB8fCB0aGlzLmdhdmVVcCkgcmV0dXJuO1xuICAgIHRoaXMuZmx1c2hpbmcgPSB0cnVlO1xuXG4gICAgY29uc3QgYmF0Y2ggPSB0aGlzLmJ1ZmZlci5zcGxpY2UoMCwgQkFUQ0hfU0laRSk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgICBjb25zdCB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiBjb250cm9sbGVyLmFib3J0KCksIFJFUVVFU1RfVElNRU9VVF9NUyk7XG5cbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYCR7dGhpcy5sZWFkZXJVcmx9L2FwaS9pbmdlc3QvbG9nc2AsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IGJ1aWxkSW5nZXN0SGVhZGVycyh0aGlzLmF1dGhUb2tlbiksXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgc2Vzc2lvbklkOiB0aGlzLnNlc3Npb25JZCwgZW50cmllczogYmF0Y2ggfSksXG4gICAgICAgIHNpZ25hbDogY29udHJvbGxlci5zaWduYWwsXG4gICAgICB9KTtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcblxuICAgICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICAgIHRoaXMuYmFja29mZk1zID0gSU5JVElBTF9CQUNLT0ZGX01TO1xuICAgICAgICB0aGlzLmNvbnNlY3V0aXZlRmFpbHVyZXMgPSAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5yZXF1ZXVlQmF0Y2goYmF0Y2gpO1xuICAgICAgICB0aGlzLmhhbmRsZUZhaWx1cmUoKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIHRoaXMucmVxdWV1ZUJhdGNoKGJhdGNoKTtcbiAgICAgIHRoaXMuaGFuZGxlRmFpbHVyZSgpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLmZsdXNoaW5nID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZXF1ZXVlQmF0Y2goYmF0Y2g6IFVuaWZpZWRMb2dFbnRyeVtdKTogdm9pZCB7XG4gICAgY29uc3Qgc3BhY2VBdmFpbGFibGUgPSBNQVhfQlVGRkVSX1NJWkUgLSB0aGlzLmJ1ZmZlci5sZW5ndGg7XG4gICAgaWYgKHNwYWNlQXZhaWxhYmxlID4gMCkge1xuICAgICAgY29uc3QgdG9SZXF1ZXVlID0gYmF0Y2guc2xpY2UoMCwgc3BhY2VBdmFpbGFibGUpO1xuICAgICAgdGhpcy5idWZmZXIudW5zaGlmdCguLi50b1JlcXVldWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsb2dnZXIud2FybihgW0ZvcndhcmRpbmdTaW5rXSBCdWZmZXIgZnVsbCAoJHtNQVhfQlVGRkVSX1NJWkV9KSwgZHJvcHBpbmcgJHtiYXRjaC5sZW5ndGh9IGVudHJpZXNgKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUZhaWx1cmUoKTogdm9pZCB7XG4gICAgdGhpcy5jb25zZWN1dGl2ZUZhaWx1cmVzKys7XG5cbiAgICBpZiAodGhpcy5jb25zZWN1dGl2ZUZhaWx1cmVzID49IE1BWF9DT05TRUNVVElWRV9GQUlMVVJFUykge1xuICAgICAgaWYgKCF0aGlzLmdhdmVVcCkge1xuICAgICAgICB0aGlzLmdhdmVVcCA9IHRydWU7XG4gICAgICAgIGxvZ2dlci5pbmZvKGBbRm9yd2FyZGluZ1NpbmtdIExlYWRlciBub3QgcnVubmluZyB3ZWIgY29uc29sZSDigJQgbG9nIGZvcndhcmRpbmcgZGlzYWJsZWQgYWZ0ZXIgJHt0aGlzLmNvbnNlY3V0aXZlRmFpbHVyZXN9IGZhaWxlZCBhdHRlbXB0cy4gQnVmZmVyZWQgJHt0aGlzLmJ1ZmZlci5sZW5ndGh9IGVudHJpZXMgZGlzY2FyZGVkLmApO1xuICAgICAgICB0aGlzLmJ1ZmZlci5sZW5ndGggPSAwO1xuICAgICAgICBpZiAodGhpcy5mbHVzaFRpbWVyKSB7XG4gICAgICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLmZsdXNoVGltZXIpO1xuICAgICAgICAgIHRoaXMuZmx1c2hUaW1lciA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgLy8gTm90aWZ5IHRoZSBvcmNoZXN0cmF0b3Igc28gaXQgY2FuIGF0dGVtcHQgZm9sbG93ZXItdG8tbGVhZGVyIHByb21vdGlvbiAoIzE4NTApLlxuICAgICAgICAvLyBGaXJlZCBhc3luY2hyb25vdXNseSBzbyBoYW5kbGVGYWlsdXJlIGNvbXBsZXRlcyBjbGVhbmx5IGJlZm9yZSBwcm9tb3Rpb24gcnVucy5cbiAgICAgICAgaWYgKHRoaXMub25MZWFkZXJEZWF0aCkge1xuICAgICAgICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHRoaXMub25MZWFkZXJEZWF0aCEoKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsb2dnZXIuZGVidWcoYFtGb3J3YXJkaW5nU2lua10gTGVhZGVyIHVucmVhY2hhYmxlLCBiYWNrb2ZmICR7dGhpcy5iYWNrb2ZmTXN9bXMgKGF0dGVtcHQgJHt0aGlzLmNvbnNlY3V0aXZlRmFpbHVyZXN9LyR7TUFYX0NPTlNFQ1VUSVZFX0ZBSUxVUkVTfSwgYnVmZmVyZWQ6ICR7dGhpcy5idWZmZXIubGVuZ3RofSlgKTtcbiAgICB0aGlzLmJhY2tvZmZNcyA9IE1hdGgubWluKHRoaXMuYmFja29mZk1zICogMiwgTUFYX0JBQ0tPRkZfTVMpO1xuICB9XG59XG5cbi8qKlxuICogRm9yd2FyZHMgbWV0cmljIHNuYXBzaG90cyB0byB0aGUgbGVhZGVyJ3MgL2FwaS9pbmdlc3QvbWV0cmljcy5cbiAqL1xuZXhwb3J0IGNsYXNzIExlYWRlckZvcndhcmRpbmdNZXRyaWNzU2luayB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgbGVhZGVyVXJsOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSByZWFkb25seSBzZXNzaW9uSWQ6IHN0cmluZyxcbiAgICAvKiogT3B0aW9uYWwgY29uc29sZSBhdXRoIHRva2VuICgjMTc4MCkuIEluY2x1ZGVkIGFzIEJlYXJlciBoZWFkZXIgb24gaW5nZXN0IFBPU1RzLiAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgYXV0aFRva2VuOiBzdHJpbmcgfCBudWxsID0gbnVsbCxcbiAgKSB7fVxuXG4gIGFzeW5jIG9uU25hcHNob3Qoc25hcHNob3Q6IE1ldHJpY1NuYXBzaG90KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgICBjb25zdCB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiBjb250cm9sbGVyLmFib3J0KCksIFJFUVVFU1RfVElNRU9VVF9NUyk7XG5cbiAgICAgIGF3YWl0IGZldGNoKGAke3RoaXMubGVhZGVyVXJsfS9hcGkvaW5nZXN0L21ldHJpY3NgLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBoZWFkZXJzOiBidWlsZEluZ2VzdEhlYWRlcnModGhpcy5hdXRoVG9rZW4pLFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHNlc3Npb25JZDogdGhpcy5zZXNzaW9uSWQsIHNuYXBzaG90IH0pLFxuICAgICAgICBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsLFxuICAgICAgfSk7XG4gICAgICBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICBsb2dnZXIuZGVidWcoJ1tGb3J3YXJkaW5nU2lua10gRmFpbGVkIHRvIGZvcndhcmQgbWV0cmljcyBzbmFwc2hvdCcpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFNlbmRzIHNlc3Npb24gbGlmZWN5Y2xlIGV2ZW50cyB0byB0aGUgbGVhZGVyLlxuICovXG5leHBvcnQgY2xhc3MgU2Vzc2lvbkhlYXJ0YmVhdCB7XG4gIHByaXZhdGUgaGVhcnRiZWF0VGltZXI6IFJldHVyblR5cGU8dHlwZW9mIHNldEludGVydmFsPiB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgbGVhZGVyVXJsOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSByZWFkb25seSBzZXNzaW9uSWQ6IHN0cmluZyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHBpZDogbnVtYmVyLFxuICAgIC8qKiBPcHRpb25hbCBjb25zb2xlIGF1dGggdG9rZW4gKCMxNzgwKS4gSW5jbHVkZWQgYXMgQmVhcmVyIGhlYWRlciBvbiBpbmdlc3QgUE9TVHMuICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBhdXRoVG9rZW46IHN0cmluZyB8IG51bGwgPSBudWxsLFxuICApIHt9XG5cbiAgLyoqIE5vdGlmeSB0aGUgbGVhZGVyIHRoYXQgdGhpcyBzZXNzaW9uIGhhcyBzdGFydGVkICovXG4gIGFzeW5jIHN0YXJ0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuc2VuZEV2ZW50KCdzdGFydGVkJyk7XG5cbiAgICB0aGlzLmhlYXJ0YmVhdFRpbWVyID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgdGhpcy5zZW5kRXZlbnQoJ2hlYXJ0YmVhdCcpLmNhdGNoKCgpID0+IHt9KTtcbiAgICB9LCAxMF8wMDApO1xuICAgIHRoaXMuaGVhcnRiZWF0VGltZXIudW5yZWYoKTtcbiAgfVxuXG4gIC8qKiBOb3RpZnkgdGhlIGxlYWRlciB0aGF0IHRoaXMgc2Vzc2lvbiBpcyBzdG9wcGluZyAqL1xuICBhc3luYyBzdG9wKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmhlYXJ0YmVhdFRpbWVyKSB7XG4gICAgICBjbGVhckludGVydmFsKHRoaXMuaGVhcnRiZWF0VGltZXIpO1xuICAgICAgdGhpcy5oZWFydGJlYXRUaW1lciA9IG51bGw7XG4gICAgfVxuICAgIGF3YWl0IHRoaXMuc2VuZEV2ZW50KCdzdG9wcGVkJyk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHNlbmRFdmVudChldmVudDogJ3N0YXJ0ZWQnIHwgJ3N0b3BwZWQnIHwgJ2hlYXJ0YmVhdCcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICAgIGNvbnN0IHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IGNvbnRyb2xsZXIuYWJvcnQoKSwgUkVRVUVTVF9USU1FT1VUX01TKTtcblxuICAgICAgYXdhaXQgZmV0Y2goYCR7dGhpcy5sZWFkZXJVcmx9L2FwaS9pbmdlc3Qvc2Vzc2lvbmAsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IGJ1aWxkSW5nZXN0SGVhZGVycyh0aGlzLmF1dGhUb2tlbiksXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICBzZXNzaW9uSWQ6IHRoaXMuc2Vzc2lvbklkLFxuICAgICAgICAgIGV2ZW50LFxuICAgICAgICAgIHBpZDogdGhpcy5waWQsXG4gICAgICAgICAgc3RhcnRlZEF0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICAgICAgc2VydmVyVmVyc2lvbjogUEFDS0FHRV9WRVJTSU9OLFxuICAgICAgICAgIGNvbnNvbGVQcm90b2NvbFZlcnNpb246IENPTlNPTEVfUFJPVE9DT0xfVkVSU0lPTixcbiAgICAgICAgfSksXG4gICAgICAgIHNpZ25hbDogY29udHJvbGxlci5zaWduYWwsXG4gICAgICB9KTtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhgW1Nlc3Npb25IZWFydGJlYXRdIEZhaWxlZCB0byBzZW5kICR7ZXZlbnR9IGV2ZW50YCk7XG4gICAgfVxuICB9XG59XG4iXX0=
@@ -1 +1 @@
1
- {"version":3,"file":"PromotionManager.d.ts","sourceRoot":"","sources":["../../../src/web/console/PromotionManager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,EAKL,KAAK,cAAc,EAEpB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,uBAAuB,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC3F,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAIjE,qBAAa,gBAAgB;IAKzB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,aAAa;IAK9B,OAAO,CAAC,QAAQ,CAAC,eAAe;IAXlC,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,QAAQ,CAAK;gBAGF,OAAO,EAAE,qBAAqB,EAC9B,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,CAC9B,OAAO,EAAE,qBAAqB,EAC9B,QAAQ,EAAE,cAAc,EACxB,WAAW,EAAE,MAAM,KAChB,OAAO,CAAC,OAAO,CAAC,EACJ,eAAe,EAAE,CAChC,OAAO,EAAE,qBAAqB,EAC9B,QAAQ,EAAE,cAAc,EACxB,WAAW,EAAE,MAAM,KAChB,OAAO,CAAC,OAAO,CAAC;IAGvB;;;OAGG;IACG,OAAO,CACX,cAAc,EAAE,uBAAuB,EACvC,gBAAgB,EAAE,gBAAgB,GACjC,OAAO,CAAC,IAAI,CAAC;CAgEjB"}
1
+ {"version":3,"file":"PromotionManager.d.ts","sourceRoot":"","sources":["../../../src/web/console/PromotionManager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,EAKL,KAAK,cAAc,EACpB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,uBAAuB,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC3F,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAIjE,qBAAa,gBAAgB;IAKzB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,aAAa;IAK9B,OAAO,CAAC,QAAQ,CAAC,eAAe;IAXlC,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,QAAQ,CAAK;gBAGF,OAAO,EAAE,qBAAqB,EAC9B,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,CAC9B,OAAO,EAAE,qBAAqB,EAC9B,QAAQ,EAAE,cAAc,EACxB,WAAW,EAAE,MAAM,KAChB,OAAO,CAAC,OAAO,CAAC,EACJ,eAAe,EAAE,CAChC,OAAO,EAAE,qBAAqB,EAC9B,QAAQ,EAAE,cAAc,EACxB,WAAW,EAAE,MAAM,KAChB,OAAO,CAAC,OAAO,CAAC;IAGvB;;;OAGG;IACG,OAAO,CACX,cAAc,EAAE,uBAAuB,EACvC,gBAAgB,EAAE,gBAAgB,GACjC,OAAO,CAAC,IAAI,CAAC;CAwDjB"}
@@ -10,7 +10,7 @@
10
10
  * with each other's promotion budgets.
11
11
  */
12
12
  import { logger } from '../../utils/logger.js';
13
- import { deleteLeaderLock, claimLeadership, readLeaderLock, LOCK_VERSION, } from './LeaderElection.js';
13
+ import { deleteLeaderLock, claimLeadership, readLeaderLock, createLeaderInfo, } from './LeaderElection.js';
14
14
  const MAX_PROMOTION_ATTEMPTS = 3;
15
15
  export class PromotionManager {
16
16
  options;
@@ -48,15 +48,7 @@ export class PromotionManager {
48
48
  await sessionHeartbeat.stop();
49
49
  await forwardingSink.close();
50
50
  await deleteLeaderLock();
51
- const now = new Date().toISOString();
52
- const myInfo = {
53
- version: LOCK_VERSION,
54
- pid: process.pid,
55
- port: this.consolePort,
56
- sessionId: this.options.sessionId,
57
- startedAt: now,
58
- heartbeat: now,
59
- };
51
+ const myInfo = createLeaderInfo(this.options.sessionId, this.consolePort);
60
52
  const claimed = await claimLeadership(myInfo);
61
53
  const durationMs = Date.now() - startMs;
62
54
  if (claimed) {
@@ -91,4 +83,4 @@ export class PromotionManager {
91
83
  }
92
84
  }
93
85
  }
94
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUHJvbW90aW9uTWFuYWdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy93ZWIvY29uc29sZS9Qcm9tb3Rpb25NYW5hZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7O0dBVUc7QUFFSCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDL0MsT0FBTyxFQUNMLGdCQUFnQixFQUNoQixlQUFlLEVBQ2YsY0FBYyxFQUNkLFlBQVksR0FHYixNQUFNLHFCQUFxQixDQUFDO0FBSTdCLE1BQU0sc0JBQXNCLEdBQUcsQ0FBQyxDQUFDO0FBRWpDLE1BQU0sT0FBTyxnQkFBZ0I7SUFLUjtJQUNBO0lBQ0E7SUFLQTtJQVhYLFVBQVUsR0FBRyxLQUFLLENBQUM7SUFDbkIsUUFBUSxHQUFHLENBQUMsQ0FBQztJQUVyQixZQUNtQixPQUE4QixFQUM5QixXQUFtQixFQUNuQixhQUlJLEVBQ0osZUFJSTtRQVhKLFlBQU8sR0FBUCxPQUFPLENBQXVCO1FBQzlCLGdCQUFXLEdBQVgsV0FBVyxDQUFRO1FBQ25CLGtCQUFhLEdBQWIsYUFBYSxDQUlUO1FBQ0osb0JBQWUsR0FBZixlQUFlLENBSVg7SUFDcEIsQ0FBQztJQUVKOzs7T0FHRztJQUNILEtBQUssQ0FBQyxPQUFPLENBQ1gsY0FBdUMsRUFDdkMsZ0JBQWtDO1FBRWxDLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ3BCLE1BQU0sQ0FBQyxJQUFJLENBQUMsNkRBQTZELENBQUMsQ0FBQztZQUMzRSxPQUFPO1FBQ1QsQ0FBQztRQUVELElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNoQixJQUFJLElBQUksQ0FBQyxRQUFRLEdBQUcsc0JBQXNCLEVBQUUsQ0FBQztZQUMzQyxNQUFNLENBQUMsS0FBSyxDQUFDLDhCQUE4QixJQUFJLENBQUMsUUFBUSxpQkFBaUIsc0JBQXNCLGVBQWUsQ0FBQyxDQUFDO1lBQ2hILE9BQU87UUFDVCxDQUFDO1FBRUQsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7UUFDdkIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBRTNCLElBQUksQ0FBQztZQUNILE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0VBQWdFLElBQUksQ0FBQyxRQUFRLElBQUksc0JBQXNCLEVBQUUsRUFBRTtnQkFDckgsU0FBUyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLEdBQUcsRUFBRSxPQUFPLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsUUFBUTthQUNwRyxDQUFDLENBQUM7WUFFSCxNQUFNLGdCQUFnQixDQUFDLElBQUksRUFBRSxDQUFDO1lBQzlCLE1BQU0sY0FBYyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQzdCLE1BQU0sZ0JBQWdCLEVBQUUsQ0FBQztZQUV6QixNQUFNLEdBQUcsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3JDLE1BQU0sTUFBTSxHQUFzQjtnQkFDaEMsT0FBTyxFQUFFLFlBQVk7Z0JBQ3JCLEdBQUcsRUFBRSxPQUFPLENBQUMsR0FBRztnQkFDaEIsSUFBSSxFQUFFLElBQUksQ0FBQyxXQUFXO2dCQUN0QixTQUFTLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTO2dCQUNqQyxTQUFTLEVBQUUsR0FBRztnQkFDZCxTQUFTLEVBQUUsR0FBRzthQUNmLENBQUM7WUFFRixNQUFNLE9BQU8sR0FBRyxNQUFNLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUM5QyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsT0FBTyxDQUFDO1lBRXhDLElBQUksT0FBTyxFQUFFLENBQUM7Z0JBQ1osTUFBTSxDQUFDLElBQUksQ0FBQyw2REFBNkQsRUFBRTtvQkFDekUsU0FBUyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLFFBQVE7aUJBQzlGLENBQUMsQ0FBQztnQkFDSCxNQUFNLFFBQVEsR0FBbUIsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsQ0FBQztnQkFDeEUsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUNyRSxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sTUFBTSxDQUFDLElBQUksQ0FBQywrREFBK0QsRUFBRTtvQkFDM0UsU0FBUyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLFFBQVE7aUJBQ3RFLENBQUMsQ0FBQztnQkFDSCxNQUFNLFNBQVMsR0FBRyxNQUFNLGNBQWMsRUFBRSxDQUFDO2dCQUN6QyxJQUFJLFNBQVMsRUFBRSxDQUFDO29CQUNkLE1BQU0sUUFBUSxHQUFtQixFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxDQUFDO29CQUM3RSxNQUFNLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO2dCQUN2RSxDQUFDO3FCQUFNLENBQUM7b0JBQ04sTUFBTSxDQUFDLEtBQUssQ0FBQyx3REFBd0QsQ0FBQyxDQUFDO2dCQUN6RSxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7UUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1lBQ2IsTUFBTSxDQUFDLEtBQUssQ0FBQyxxQ0FBcUMsRUFBRTtnQkFDbEQsS0FBSyxFQUFFLEdBQUcsWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUM7Z0JBQ3ZELFVBQVUsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsUUFBUTthQUN6RCxDQUFDLENBQUM7UUFDTCxDQUFDO2dCQUFTLENBQUM7WUFDVCxJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztRQUMxQixDQUFDO0lBQ0gsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBGb2xsb3dlci10by1sZWFkZXIgcHJvbW90aW9uIG1hbmFnZXIgKCMxODUwKS5cbiAqXG4gKiBIYW5kbGVzIHRoZSBsaWZlY3ljbGUgb2YgcHJvbW90aW5nIGEgZm9sbG93ZXIgcHJvY2VzcyB0byBsZWFkZXIgd2hlbiB0aGVcbiAqIGN1cnJlbnQgbGVhZGVyIGJlY29tZXMgdW5yZWFjaGFibGUuIEV4dHJhY3RlZCBmcm9tIFVuaWZpZWRDb25zb2xlLnRzIHRvXG4gKiByZWR1Y2UgY29tcGxleGl0eSBhbmQgYWxsb3cgcGVyLWluc3RhbmNlIHN0YXRlIHRyYWNraW5nLlxuICpcbiAqIEVhY2ggUHJvbW90aW9uTWFuYWdlciBpbnN0YW5jZSB0cmFja3MgaXRzIG93biBhdHRlbXB0IGNvdW50ZXIsIHNvIG11bHRpcGxlXG4gKiBmb2xsb3dlcnMgaW4gdGhlIHNhbWUgcHJvY2VzcyAodW5saWtlbHkgYnV0IHBvc3NpYmxlKSBkb24ndCBpbnRlcmZlcmVcbiAqIHdpdGggZWFjaCBvdGhlcidzIHByb21vdGlvbiBidWRnZXRzLlxuICovXG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uLy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5pbXBvcnQge1xuICBkZWxldGVMZWFkZXJMb2NrLFxuICBjbGFpbUxlYWRlcnNoaXAsXG4gIHJlYWRMZWFkZXJMb2NrLFxuICBMT0NLX1ZFUlNJT04sXG4gIHR5cGUgRWxlY3Rpb25SZXN1bHQsXG4gIHR5cGUgQ29uc29sZUxlYWRlckluZm8sXG59IGZyb20gJy4vTGVhZGVyRWxlY3Rpb24uanMnO1xuaW1wb3J0IHR5cGUgeyBMZWFkZXJGb3J3YXJkaW5nTG9nU2luaywgU2Vzc2lvbkhlYXJ0YmVhdCB9IGZyb20gJy4vTGVhZGVyRm9yd2FyZGluZ1NpbmsuanMnO1xuaW1wb3J0IHR5cGUgeyBVbmlmaWVkQ29uc29sZU9wdGlvbnMgfSBmcm9tICcuL1VuaWZpZWRDb25zb2xlLmpzJztcblxuY29uc3QgTUFYX1BST01PVElPTl9BVFRFTVBUUyA9IDM7XG5cbmV4cG9ydCBjbGFzcyBQcm9tb3Rpb25NYW5hZ2VyIHtcbiAgcHJpdmF0ZSBpblByb2dyZXNzID0gZmFsc2U7XG4gIHByaXZhdGUgYXR0ZW1wdHMgPSAwO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgb3B0aW9uczogVW5pZmllZENvbnNvbGVPcHRpb25zLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY29uc29sZVBvcnQ6IG51bWJlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IHN0YXJ0QXNMZWFkZXI6IChcbiAgICAgIG9wdGlvbnM6IFVuaWZpZWRDb25zb2xlT3B0aW9ucyxcbiAgICAgIGVsZWN0aW9uOiBFbGVjdGlvblJlc3VsdCxcbiAgICAgIGNvbnNvbGVQb3J0OiBudW1iZXIsXG4gICAgKSA9PiBQcm9taXNlPHVua25vd24+LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgc3RhcnRBc0ZvbGxvd2VyOiAoXG4gICAgICBvcHRpb25zOiBVbmlmaWVkQ29uc29sZU9wdGlvbnMsXG4gICAgICBlbGVjdGlvbjogRWxlY3Rpb25SZXN1bHQsXG4gICAgICBjb25zb2xlUG9ydDogbnVtYmVyLFxuICAgICkgPT4gUHJvbWlzZTx1bmtub3duPixcbiAgKSB7fVxuXG4gIC8qKlxuICAgKiBBdHRlbXB0IHByb21vdGlvbi4gU2FmZSB0byBjYWxsIGZyb20gdGhlIEZvcndhcmRpbmdTaW5rIG9uTGVhZGVyRGVhdGhcbiAgICogY2FsbGJhY2sg4oCUIGd1YXJkcyBhZ2FpbnN0IGNvbmN1cnJlbnQgYW5kIGV4Y2Vzc2l2ZSBhdHRlbXB0cy5cbiAgICovXG4gIGFzeW5jIHByb21vdGUoXG4gICAgZm9yd2FyZGluZ1Npbms6IExlYWRlckZvcndhcmRpbmdMb2dTaW5rLFxuICAgIHNlc3Npb25IZWFydGJlYXQ6IFNlc3Npb25IZWFydGJlYXQsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmluUHJvZ3Jlc3MpIHtcbiAgICAgIGxvZ2dlci5pbmZvKCdbUHJvbW90aW9uTWFuYWdlcl0gUHJvbW90aW9uIGFscmVhZHkgaW4gcHJvZ3Jlc3Mg4oCUIHNraXBwaW5nJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5hdHRlbXB0cysrO1xuICAgIGlmICh0aGlzLmF0dGVtcHRzID4gTUFYX1BST01PVElPTl9BVFRFTVBUUykge1xuICAgICAgbG9nZ2VyLmVycm9yKGBbUHJvbW90aW9uTWFuYWdlcl0gQXR0ZW1wdCAke3RoaXMuYXR0ZW1wdHN9IGV4Y2VlZHMgbWF4ICgke01BWF9QUk9NT1RJT05fQVRURU1QVFN9KSDigJQgZ2l2aW5nIHVwYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5pblByb2dyZXNzID0gdHJ1ZTtcbiAgICBjb25zdCBzdGFydE1zID0gRGF0ZS5ub3coKTtcblxuICAgIHRyeSB7XG4gICAgICBsb2dnZXIud2FybihgW1Byb21vdGlvbk1hbmFnZXJdIExlYWRlciBkZWF0aCBkZXRlY3RlZCDigJQgcHJvbW90aW9uIGF0dGVtcHQgJHt0aGlzLmF0dGVtcHRzfS8ke01BWF9QUk9NT1RJT05fQVRURU1QVFN9YCwge1xuICAgICAgICBzZXNzaW9uSWQ6IHRoaXMub3B0aW9ucy5zZXNzaW9uSWQsIHBpZDogcHJvY2Vzcy5waWQsIHBvcnQ6IHRoaXMuY29uc29sZVBvcnQsIGF0dGVtcHQ6IHRoaXMuYXR0ZW1wdHMsXG4gICAgICB9KTtcblxuICAgICAgYXdhaXQgc2Vzc2lvbkhlYXJ0YmVhdC5zdG9wKCk7XG4gICAgICBhd2FpdCBmb3J3YXJkaW5nU2luay5jbG9zZSgpO1xuICAgICAgYXdhaXQgZGVsZXRlTGVhZGVyTG9jaygpO1xuXG4gICAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCk7XG4gICAgICBjb25zdCBteUluZm86IENvbnNvbGVMZWFkZXJJbmZvID0ge1xuICAgICAgICB2ZXJzaW9uOiBMT0NLX1ZFUlNJT04sXG4gICAgICAgIHBpZDogcHJvY2Vzcy5waWQsXG4gICAgICAgIHBvcnQ6IHRoaXMuY29uc29sZVBvcnQsXG4gICAgICAgIHNlc3Npb25JZDogdGhpcy5vcHRpb25zLnNlc3Npb25JZCxcbiAgICAgICAgc3RhcnRlZEF0OiBub3csXG4gICAgICAgIGhlYXJ0YmVhdDogbm93LFxuICAgICAgfTtcblxuICAgICAgY29uc3QgY2xhaW1lZCA9IGF3YWl0IGNsYWltTGVhZGVyc2hpcChteUluZm8pO1xuICAgICAgY29uc3QgZHVyYXRpb25NcyA9IERhdGUubm93KCkgLSBzdGFydE1zO1xuXG4gICAgICBpZiAoY2xhaW1lZCkge1xuICAgICAgICBsb2dnZXIuaW5mbygnW1Byb21vdGlvbk1hbmFnZXJdIFByb21vdGlvbiBzdWNjZWVkZWQg4oCUIHN0YXJ0aW5nIGFzIGxlYWRlcicsIHtcbiAgICAgICAgICBzZXNzaW9uSWQ6IHRoaXMub3B0aW9ucy5zZXNzaW9uSWQsIHBvcnQ6IHRoaXMuY29uc29sZVBvcnQsIGR1cmF0aW9uTXMsIGF0dGVtcHQ6IHRoaXMuYXR0ZW1wdHMsXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBlbGVjdGlvbjogRWxlY3Rpb25SZXN1bHQgPSB7IHJvbGU6ICdsZWFkZXInLCBsZWFkZXJJbmZvOiBteUluZm8gfTtcbiAgICAgICAgYXdhaXQgdGhpcy5zdGFydEFzTGVhZGVyKHRoaXMub3B0aW9ucywgZWxlY3Rpb24sIHRoaXMuY29uc29sZVBvcnQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oJ1tQcm9tb3Rpb25NYW5hZ2VyXSBMb3N0IHByb21vdGlvbiByYWNlIOKAlCBmb2xsb3dpbmcgbmV3IGxlYWRlcicsIHtcbiAgICAgICAgICBzZXNzaW9uSWQ6IHRoaXMub3B0aW9ucy5zZXNzaW9uSWQsIGR1cmF0aW9uTXMsIGF0dGVtcHQ6IHRoaXMuYXR0ZW1wdHMsXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBuZXdMZWFkZXIgPSBhd2FpdCByZWFkTGVhZGVyTG9jaygpO1xuICAgICAgICBpZiAobmV3TGVhZGVyKSB7XG4gICAgICAgICAgY29uc3QgZWxlY3Rpb246IEVsZWN0aW9uUmVzdWx0ID0geyByb2xlOiAnZm9sbG93ZXInLCBsZWFkZXJJbmZvOiBuZXdMZWFkZXIgfTtcbiAgICAgICAgICBhd2FpdCB0aGlzLnN0YXJ0QXNGb2xsb3dlcih0aGlzLm9wdGlvbnMsIGVsZWN0aW9uLCB0aGlzLmNvbnNvbGVQb3J0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsb2dnZXIuZXJyb3IoJ1tQcm9tb3Rpb25NYW5hZ2VyXSBObyBsZWFkZXIgYXZhaWxhYmxlIGFmdGVyIGxvc3QgcmFjZScpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoJ1tQcm9tb3Rpb25NYW5hZ2VyXSBQcm9tb3Rpb24gZmFpbGVkJywge1xuICAgICAgICBlcnJvcjogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpLFxuICAgICAgICBkdXJhdGlvbk1zOiBEYXRlLm5vdygpIC0gc3RhcnRNcywgYXR0ZW1wdDogdGhpcy5hdHRlbXB0cyxcbiAgICAgIH0pO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLmluUHJvZ3Jlc3MgPSBmYWxzZTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
86
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUHJvbW90aW9uTWFuYWdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy93ZWIvY29uc29sZS9Qcm9tb3Rpb25NYW5hZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7O0dBVUc7QUFFSCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDL0MsT0FBTyxFQUNMLGdCQUFnQixFQUNoQixlQUFlLEVBQ2YsY0FBYyxFQUNkLGdCQUFnQixHQUVqQixNQUFNLHFCQUFxQixDQUFDO0FBSTdCLE1BQU0sc0JBQXNCLEdBQUcsQ0FBQyxDQUFDO0FBRWpDLE1BQU0sT0FBTyxnQkFBZ0I7SUFLUjtJQUNBO0lBQ0E7SUFLQTtJQVhYLFVBQVUsR0FBRyxLQUFLLENBQUM7SUFDbkIsUUFBUSxHQUFHLENBQUMsQ0FBQztJQUVyQixZQUNtQixPQUE4QixFQUM5QixXQUFtQixFQUNuQixhQUlJLEVBQ0osZUFJSTtRQVhKLFlBQU8sR0FBUCxPQUFPLENBQXVCO1FBQzlCLGdCQUFXLEdBQVgsV0FBVyxDQUFRO1FBQ25CLGtCQUFhLEdBQWIsYUFBYSxDQUlUO1FBQ0osb0JBQWUsR0FBZixlQUFlLENBSVg7SUFDcEIsQ0FBQztJQUVKOzs7T0FHRztJQUNILEtBQUssQ0FBQyxPQUFPLENBQ1gsY0FBdUMsRUFDdkMsZ0JBQWtDO1FBRWxDLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ3BCLE1BQU0sQ0FBQyxJQUFJLENBQUMsNkRBQTZELENBQUMsQ0FBQztZQUMzRSxPQUFPO1FBQ1QsQ0FBQztRQUVELElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNoQixJQUFJLElBQUksQ0FBQyxRQUFRLEdBQUcsc0JBQXNCLEVBQUUsQ0FBQztZQUMzQyxNQUFNLENBQUMsS0FBSyxDQUFDLDhCQUE4QixJQUFJLENBQUMsUUFBUSxpQkFBaUIsc0JBQXNCLGVBQWUsQ0FBQyxDQUFDO1lBQ2hILE9BQU87UUFD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ZW50IjpbIi8qKlxuICogRm9sbG93ZXItdG8tbGVhZGVyIHByb21vdGlvbiBtYW5hZ2VyICgjMTg1MCkuXG4gKlxuICogSGFuZGxlcyB0aGUgbGlmZWN5Y2xlIG9mIHByb21vdGluZyBhIGZvbGxvd2VyIHByb2Nlc3MgdG8gbGVhZGVyIHdoZW4gdGhlXG4gKiBjdXJyZW50IGxlYWRlciBiZWNvbWVzIHVucmVhY2hhYmxlLiBFeHRyYWN0ZWQgZnJvbSBVbmlmaWVkQ29uc29sZS50cyB0b1xuICogcmVkdWNlIGNvbXBsZXhpdHkgYW5kIGFsbG93IHBlci1pbnN0YW5jZSBzdGF0ZSB0cmFja2luZy5cbiAqXG4gKiBFYWNoIFByb21vdGlvbk1hbmFnZXIgaW5zdGFuY2UgdHJhY2tzIGl0cyBvd24gYXR0ZW1wdCBjb3VudGVyLCBzbyBtdWx0aXBsZVxuICogZm9sbG93ZXJzIGluIHRoZSBzYW1lIHByb2Nlc3MgKHVubGlrZWx5IGJ1dCBwb3NzaWJsZSkgZG9uJ3QgaW50ZXJmZXJlXG4gKiB3aXRoIGVhY2ggb3RoZXIncyBwcm9tb3Rpb24gYnVkZ2V0cy5cbiAqL1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi8uLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IHtcbiAgZGVsZXRlTGVhZGVyTG9jayxcbiAgY2xhaW1MZWFkZXJzaGlwLFxuICByZWFkTGVhZGVyTG9jayxcbiAgY3JlYXRlTGVhZGVySW5mbyxcbiAgdHlwZSBFbGVjdGlvblJlc3VsdCxcbn0gZnJvbSAnLi9MZWFkZXJFbGVjdGlvbi5qcyc7XG5pbXBvcnQgdHlwZSB7IExlYWRlckZvcndhcmRpbmdMb2dTaW5rLCBTZXNzaW9uSGVhcnRiZWF0IH0gZnJvbSAnLi9MZWFkZXJGb3J3YXJkaW5nU2luay5qcyc7XG5pbXBvcnQgdHlwZSB7IFVuaWZpZWRDb25zb2xlT3B0aW9ucyB9IGZyb20gJy4vVW5pZmllZENvbnNvbGUuanMnO1xuXG5jb25zdCBNQVhfUFJPTU9USU9OX0FUVEVNUFRTID0gMztcblxuZXhwb3J0IGNsYXNzIFByb21vdGlvbk1hbmFnZXIge1xuICBwcml2YXRlIGluUHJvZ3Jlc3MgPSBmYWxzZTtcbiAgcHJpdmF0ZSBhdHRlbXB0cyA9IDA7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBvcHRpb25zOiBVbmlmaWVkQ29uc29sZU9wdGlvbnMsXG4gICAgcHJpdmF0ZSByZWFkb25seSBjb25zb2xlUG9ydDogbnVtYmVyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgc3RhcnRBc0xlYWRlcjogKFxuICAgICAgb3B0aW9uczogVW5pZmllZENvbnNvbGVPcHRpb25zLFxuICAgICAgZWxlY3Rpb246IEVsZWN0aW9uUmVzdWx0LFxuICAgICAgY29uc29sZVBvcnQ6IG51bWJlcixcbiAgICApID0+IFByb21pc2U8dW5rbm93bj4sXG4gICAgcHJpdmF0ZSByZWFkb25seSBzdGFydEFzRm9sbG93ZXI6IChcbiAgICAgIG9wdGlvbnM6IFVuaWZpZWRDb25zb2xlT3B0aW9ucyxcbiAgICAgIGVsZWN0aW9uOiBFbGVjdGlvblJlc3VsdCxcbiAgICAgIGNvbnNvbGVQb3J0OiBudW1iZXIsXG4gICAgKSA9PiBQcm9taXNlPHVua25vd24+LFxuICApIHt9XG5cbiAgLyoqXG4gICAqIEF0dGVtcHQgcHJvbW90aW9uLiBTYWZlIHRvIGNhbGwgZnJvbSB0aGUgRm9yd2FyZGluZ1Npbmsgb25MZWFkZXJEZWF0aFxuICAgKiBjYWxsYmFjayDigJQgZ3VhcmRzIGFnYWluc3QgY29uY3VycmVudCBhbmQgZXhjZXNzaXZlIGF0dGVtcHRzLlxuICAgKi9cbiAgYXN5bmMgcHJvbW90ZShcbiAgICBmb3J3YXJkaW5nU2luazogTGVhZGVyRm9yd2FyZGluZ0xvZ1NpbmssXG4gICAgc2Vzc2lvbkhlYXJ0YmVhdDogU2Vzc2lvbkhlYXJ0YmVhdCxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuaW5Qcm9ncmVzcykge1xuICAgICAgbG9nZ2VyLmluZm8oJ1tQcm9tb3Rpb25NYW5hZ2VyXSBQcm9tb3Rpb24gYWxyZWFkeSBpbiBwcm9ncmVzcyDigJQgc2tpcHBpbmcnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmF0dGVtcHRzKys7XG4gICAgaWYgKHRoaXMuYXR0ZW1wdHMgPiBNQVhfUFJPTU9USU9OX0FUVEVNUFRTKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoYFtQcm9tb3Rpb25NYW5hZ2VyXSBBdHRlbXB0ICR7dGhpcy5hdHRlbXB0c30gZXhjZWVkcyBtYXggKCR7TUFYX1BST01PVElPTl9BVFRFTVBUU30pIOKAlCBnaXZpbmcgdXBgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmluUHJvZ3Jlc3MgPSB0cnVlO1xuICAgIGNvbnN0IHN0YXJ0TXMgPSBEYXRlLm5vdygpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGxvZ2dlci53YXJuKGBbUHJvbW90aW9uTWFuYWdlcl0gTGVhZGVyIGRlYXRoIGRldGVjdGVkIOKAlCBwcm9tb3Rpb24gYXR0ZW1wdCAke3RoaXMuYXR0ZW1wdHN9LyR7TUFYX1BST01PVElPTl9BVFRFTVBUU31gLCB7XG4gICAgICAgIHNlc3Npb25JZDogdGhpcy5vcHRpb25zLnNlc3Npb25JZCwgcGlkOiBwcm9jZXNzLnBpZCwgcG9ydDogdGhpcy5jb25zb2xlUG9ydCwgYXR0ZW1wdDogdGhpcy5hdHRlbXB0cyxcbiAgICAgIH0pO1xuXG4gICAgICBhd2FpdCBzZXNzaW9uSGVhcnRiZWF0LnN0b3AoKTtcbiAgICAgIGF3YWl0IGZvcndhcmRpbmdTaW5rLmNsb3NlKCk7XG4gICAgICBhd2FpdCBkZWxldGVMZWFkZXJMb2NrKCk7XG5cbiAgICAgIGNvbnN0IG15SW5mbyA9IGNyZWF0ZUxlYWRlckluZm8odGhpcy5vcHRpb25zLnNlc3Npb25JZCwgdGhpcy5jb25zb2xlUG9ydCk7XG5cbiAgICAgIGNvbnN0IGNsYWltZWQgPSBhd2FpdCBjbGFpbUxlYWRlcnNoaXAobXlJbmZvKTtcbiAgICAgIGNvbnN0IGR1cmF0aW9uTXMgPSBEYXRlLm5vdygpIC0gc3RhcnRNcztcblxuICAgICAgaWYgKGNsYWltZWQpIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oJ1tQcm9tb3Rpb25NYW5hZ2VyXSBQcm9tb3Rpb24gc3VjY2VlZGVkIOKAlCBzdGFydGluZyBhcyBsZWFkZXInLCB7XG4gICAgICAgICAgc2Vzc2lvbklkOiB0aGlzLm9wdGlvbnMuc2Vzc2lvbklkLCBwb3J0OiB0aGlzLmNvbnNvbGVQb3J0LCBkdXJhdGlvbk1zLCBhdHRlbXB0OiB0aGlzLmF0dGVtcHRzLFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgZWxlY3Rpb246IEVsZWN0aW9uUmVzdWx0ID0geyByb2xlOiAnbGVhZGVyJywgbGVhZGVySW5mbzogbXlJbmZvIH07XG4gICAgICAgIGF3YWl0IHRoaXMuc3RhcnRBc0xlYWRlcih0aGlzLm9wdGlvbnMsIGVsZWN0aW9uLCB0aGlzLmNvbnNvbGVQb3J0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKCdbUHJvbW90aW9uTWFuYWdlcl0gTG9zdCBwcm9tb3Rpb24gcmFjZSDigJQgZm9sbG93aW5nIG5ldyBsZWFkZXInLCB7XG4gICAgICAgICAgc2Vzc2lvbklkOiB0aGlzLm9wdGlvbnMuc2Vzc2lvbklkLCBkdXJhdGlvbk1zLCBhdHRlbXB0OiB0aGlzLmF0dGVtcHRzLFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgbmV3TGVhZGVyID0gYXdhaXQgcmVhZExlYWRlckxvY2soKTtcbiAgICAgICAgaWYgKG5ld0xlYWRlcikge1xuICAgICAgICAgIGNvbnN0IGVsZWN0aW9uOiBFbGVjdGlvblJlc3VsdCA9IHsgcm9sZTogJ2ZvbGxvd2VyJywgbGVhZGVySW5mbzogbmV3TGVhZGVyIH07XG4gICAgICAgICAgYXdhaXQgdGhpcy5zdGFydEFzRm9sbG93ZXIodGhpcy5vcHRpb25zLCBlbGVjdGlvbiwgdGhpcy5jb25zb2xlUG9ydCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbG9nZ2VyLmVycm9yKCdbUHJvbW90aW9uTWFuYWdlcl0gTm8gbGVhZGVyIGF2YWlsYWJsZSBhZnRlciBsb3N0IHJhY2UnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgbG9nZ2VyLmVycm9yKCdbUHJvbW90aW9uTWFuYWdlcl0gUHJvbW90aW9uIGZhaWxlZCcsIHtcbiAgICAgICAgZXJyb3I6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSxcbiAgICAgICAgZHVyYXRpb25NczogRGF0ZS5ub3coKSAtIHN0YXJ0TXMsIGF0dGVtcHQ6IHRoaXMuYXR0ZW1wdHMsXG4gICAgICB9KTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5pblByb2dyZXNzID0gZmFsc2U7XG4gICAgfVxuICB9XG59XG4iXX0=