@discordeno/gateway 19.0.0-next.97be09d → 19.0.0-next.991609d

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,8 +1,17 @@
1
- # Standalone WS / Proxy WS
1
+ # Discordeno WS
2
2
 
3
- This WS service is meant for ADVANCED DEVELOPERS ONLY!
3
+ <img align="right" src="https://raw.githubusercontent.com/discordeno/discordeno/main/website/static/img/logo.png" height="150px" />
4
4
 
5
- ## Benefits
5
+ Discord API library for [Node.JS](https://nodejs.org), [Deno](https://deno.land) & [Bun](https://bun.sh/)
6
+
7
+ [![Discord](https://img.shields.io/discord/785384884197392384?color=7289da&logo=discord&logoColor=dark)](https://discord.com/invite/5vBgXk3UcZ)
8
+ [![codecov](https://codecov.io/gh/discordeno/discordeno/branch/main/graph/badge.svg?token=SQI9OYJ7AK)](https://codecov.io/gh/discordeno/discordeno)
9
+ ![action status](https://github.com/discordeno/discordeno/actions/workflows/lib-check.yml/badge.svg?event=push)
10
+
11
+ > [!WARNING]
12
+ > Using a Standalone / Proxy WS is mean for advanced developers only
13
+
14
+ Standalone WebSocket to connect to the Discord API.
6
15
 
7
16
  - **Zero Downtime Updates**:
8
17
 
@@ -48,14 +57,8 @@ This WS service is meant for ADVANCED DEVELOPERS ONLY!
48
57
  - Take full advantage of all your CPU cores by using workers to spread the load. Control how many shards per worker
49
58
  and how many workers to maximize efficiency!
50
59
 
51
- ## Usage
52
-
53
- ```ts
54
- createGatewayManager({
55
- // TODO: (docs) Fill this out
56
- })
57
- ```
58
-
59
- ## API/Docs
60
+ ## Links
60
61
 
61
- // TODO: (docs) Fill this out. List all props/methods.
62
+ - [Website](https://discordeno.js.org/)
63
+ - [Documentation](https://doc.deno.land/https/deno.land/x/discordeno/mod.ts)
64
+ - [Discord](https://discord.com/invite/5vBgXk3UcZ)
@@ -1,4 +1,4 @@
1
- /* eslint-disable @typescript-eslint/no-confusing-void-expression */ "use strict";
1
+ "use strict";
2
2
  Object.defineProperty(exports, "__esModule", {
3
3
  value: true
4
4
  });
@@ -16,9 +16,9 @@ _export(exports, {
16
16
  return _default;
17
17
  }
18
18
  });
19
+ const _nodezlib = require("node:zlib");
19
20
  const _types = require("@discordeno/types");
20
21
  const _utils = require("@discordeno/utils");
21
- const _nodezlib = require("node:zlib");
22
22
  const _ws = /*#__PURE__*/ _interop_require_default(require("ws"));
23
23
  const _types1 = require("./types.cjs");
24
24
  function _interop_require_default(obj) {
@@ -39,6 +39,7 @@ let DiscordenoShard = class DiscordenoShard {
39
39
  this.id = options.id;
40
40
  this.connection = options.connection;
41
41
  this.events = options.events;
42
+ this.logger = options.logger ?? _utils.logger;
42
43
  this.heart = {
43
44
  acknowledged: false,
44
45
  interval: 45000
@@ -48,7 +49,8 @@ let DiscordenoShard = class DiscordenoShard {
48
49
  this.bucket = new _utils.LeakyBucket({
49
50
  max: this.calculateSafeRequests(),
50
51
  refillAmount: this.calculateSafeRequests(),
51
- refillInterval: 60000
52
+ refillInterval: 60000,
53
+ logger: this.logger
52
54
  });
53
55
  }
54
56
  /** The gateway configuration which is used to connect to Discord. */ get gatewayConfig() {
@@ -118,7 +120,7 @@ let DiscordenoShard = class DiscordenoShard {
118
120
  // A new identify has been requested even though there is already a connection open.
119
121
  // Therefore we need to close the old connection and heartbeating before creating a new one.
120
122
  if (this.isOpen()) {
121
- _utils.logger.debug(`CLOSING EXISTING SHARD: #${this.id}`);
123
+ this.logger.debug(`CLOSING EXISTING SHARD: #${this.id}`);
122
124
  this.close(_types1.ShardSocketCloseCodes.ReIdentifying, 'Re-identifying closure of old connection.');
123
125
  }
124
126
  this.state = _types1.ShardState.Identifying;
@@ -163,24 +165,23 @@ let DiscordenoShard = class DiscordenoShard {
163
165
  return this.socket?.readyState === _ws.default.OPEN;
164
166
  }
165
167
  /** Attempt to resume the previous shards session with the gateway. */ async resume() {
166
- _utils.logger.debug(`[Gateway] Resuming Shard #${this.id}`);
168
+ this.logger.debug(`[Gateway] Resuming Shard #${this.id}`);
167
169
  // It has been requested to resume the Shards session.
168
170
  // It's possible that the shard is still connected with Discord's gateway therefore we need to forcefully close it.
169
171
  if (this.isOpen()) {
170
- _utils.logger.debug(`[Gateway] Resuming Shard #${this.id} in isOpen`);
172
+ this.logger.debug(`[Gateway] Resuming Shard #${this.id} in isOpen`);
171
173
  this.close(_types1.ShardSocketCloseCodes.ResumeClosingOldConnection, 'Reconnecting the shard, closing old connection.');
172
174
  }
173
175
  // Shard has never identified, so we cannot resume.
174
176
  if (!this.sessionId) {
175
- _utils.logger.debug(`[Shard] Trying to resume a shard #${this.id} that was NOT first identified. (No session id found)`);
177
+ this.logger.debug(`[Shard] Trying to resume a shard #${this.id} that was NOT first identified. (No session id found)`);
176
178
  return await this.identify();
177
179
  }
178
180
  this.state = _types1.ShardState.Resuming;
179
- _utils.logger.debug(`[Gateway] Resuming Shard #${this.id}, before connecting`);
181
+ this.logger.debug(`[Gateway] Resuming Shard #${this.id}, before connecting`);
180
182
  // Before we can resume, we need to create a new connection with Discord's gateway.
181
183
  await this.connect();
182
- _utils.logger.debug(// eslint-disable-next-line @typescript-eslint/restrict-template-expressions
183
- `[Gateway] Resuming Shard #${this.id}, after connecting. ${this.gatewayConfig.token} | ${this.sessionId} | ${this.previousSequenceNumber}`);
184
+ this.logger.debug(`[Gateway] Resuming Shard #${this.id}, after connecting. ${this.sessionId} | ${this.previousSequenceNumber}`);
184
185
  this.send({
185
186
  op: _types.GatewayOpcodes.Resume,
186
187
  d: {
@@ -189,7 +190,7 @@ let DiscordenoShard = class DiscordenoShard {
189
190
  seq: this.previousSequenceNumber ?? 0
190
191
  }
191
192
  }, true);
192
- _utils.logger.debug(`[Gateway] Resuming Shard #${this.id} after send resumg`);
193
+ this.logger.debug(`[Gateway] Resuming Shard #${this.id} after send resumg`);
193
194
  return await new Promise((resolve)=>{
194
195
  this.resolves.set('RESUMED', ()=>resolve());
195
196
  // If it is attempted to resume with an invalid session id,
@@ -219,6 +220,7 @@ let DiscordenoShard = class DiscordenoShard {
219
220
  /** Handle a gateway connection close. */ async handleClose(close) {
220
221
  // gateway.debug("GW CLOSED", { shardId, payload: event });
221
222
  this.stopHeartbeating();
223
+ this.logger.debug(`[Shard] Gateway connection closed with code ${close.code}.`);
222
224
  switch(close.code){
223
225
  case _types1.ShardSocketCloseCodes.TestingFinished:
224
226
  {
@@ -245,7 +247,7 @@ let DiscordenoShard = class DiscordenoShard {
245
247
  case _types.GatewayCloseEventCodes.RateLimited:
246
248
  case _types.GatewayCloseEventCodes.SessionTimedOut:
247
249
  {
248
- _utils.logger.debug(`[Shard] Gateway connection closing requiring re-identify. Code: ${close.code}`);
250
+ this.logger.debug('[Shard] Gateway connection closing requiring re-identify.');
249
251
  this.state = _types1.ShardState.Identifying;
250
252
  this.events.disconnected?.(this);
251
253
  return await this.identify();
@@ -269,7 +271,7 @@ let DiscordenoShard = class DiscordenoShard {
269
271
  case _types.GatewayCloseEventCodes.AlreadyAuthenticated:
270
272
  default:
271
273
  {
272
- _utils.logger.info(`[Shard] closed shard #${this.id}. Resuming...`);
274
+ this.logger.info(`[Shard] Closed shard #${this.id} with code ${close.code}. Attempting to resume...`);
273
275
  this.state = _types1.ShardState.Resuming;
274
276
  this.events.disconnected?.(this);
275
277
  return await this.resume();
@@ -279,10 +281,6 @@ let DiscordenoShard = class DiscordenoShard {
279
281
  /** Handles a incoming gateway packet. */ async handleDiscordPacket(packet) {
280
282
  // Edge case start: https://github.com/discordeno/discordeno/issues/2311
281
283
  this.heart.lastAck = Date.now();
282
- // Manually calculating the round trip time for users who need it.
283
- if (this.heart.lastBeat && !this.heart.acknowledged) {
284
- this.heart.rtt = this.heart.lastAck - this.heart.lastBeat;
285
- }
286
284
  this.heart.acknowledged = true;
287
285
  // Edge case end!
288
286
  switch(packet.op){
@@ -303,7 +301,7 @@ let DiscordenoShard = class DiscordenoShard {
303
301
  case _types.GatewayOpcodes.Hello:
304
302
  {
305
303
  const interval = packet.d.heartbeat_interval;
306
- _utils.logger.debug(`[Gateway] Hello on Shard #${this.id}`);
304
+ this.logger.debug(`[Gateway] Hello on Shard #${this.id}`);
307
305
  this.startHeartbeating(interval);
308
306
  if (this.state !== _types1.ShardState.Resuming) {
309
307
  const currentQueue = [
@@ -325,6 +323,10 @@ let DiscordenoShard = class DiscordenoShard {
325
323
  }
326
324
  case _types.GatewayOpcodes.HeartbeatACK:
327
325
  {
326
+ // Manually calculating the round trip time for users who need it.
327
+ if (this.heart.lastBeat) {
328
+ this.heart.rtt = this.heart.lastAck - this.heart.lastBeat;
329
+ }
328
330
  this.events.heartbeatAck?.(this);
329
331
  break;
330
332
  }
@@ -338,7 +340,7 @@ let DiscordenoShard = class DiscordenoShard {
338
340
  case _types.GatewayOpcodes.InvalidSession:
339
341
  {
340
342
  const resumable = packet.d;
341
- _utils.logger.debug(`[Shard] Received Invalid Session for Shard #${this.id} with resumeable as ${resumable.toString()}`);
343
+ this.logger.debug(`[Shard] Received Invalid Session for Shard #${this.id} with resumeable as ${resumable.toString()}`);
342
344
  this.events.invalidSession?.(this, resumable);
343
345
  // We need to wait for a random amount of time between 1 and 5
344
346
  // Reference: https://discord.com/developers/docs/topics/gateway#resuming
@@ -408,13 +410,12 @@ let DiscordenoShard = class DiscordenoShard {
408
410
  * async in case devs create the presence based on eg. database values.
409
411
  * Passing the shard's id there to make it easier for the dev to use this function.
410
412
  */ async makePresence() {
411
- // eslint-disable-next-line no-useless-return
412
413
  return;
413
414
  }
414
415
  /** This function communicates with the management process, in order to know whether its free to identify. When this function resolves, this means that the shard is allowed to send an identify payload to discord. */ async requestIdentify() {}
415
416
  /** This function communicates with the management process, in order to tell it can identify the next shard. */ async shardIsReady() {}
416
417
  /** Start sending heartbeat payloads to Discord in the provided interval. */ startHeartbeating(interval) {
417
- _utils.logger.debug(`[Gateway] Start Heartbeating Shard #${this.id}`);
418
+ this.logger.debug(`[Gateway] Start Heartbeating Shard #${this.id}`);
418
419
  // If old heartbeast exist like after resume, clear the old ones.
419
420
  if (this.heart.intervalId) clearInterval(this.heart.intervalId);
420
421
  if (this.heart.timeoutId) clearTimeout(this.heart.timeoutId);
@@ -425,7 +426,7 @@ let DiscordenoShard = class DiscordenoShard {
425
426
  _types1.ShardState.Disconnected,
426
427
  _types1.ShardState.Offline
427
428
  ].includes(this.state)) {
428
- _utils.logger.debug(`[Gateway] Start Heartbeating Shard #${this.id} a`);
429
+ this.logger.debug(`[Gateway] Start Heartbeating Shard #${this.id} a`);
429
430
  this.state = _types1.ShardState.Unidentified;
430
431
  }
431
432
  // The first heartbeat needs to be send with a random delay between `0` and `interval`
@@ -434,22 +435,22 @@ let DiscordenoShard = class DiscordenoShard {
434
435
  // Reference: https://discord.com/developers/docs/topics/gateway#heartbeating
435
436
  const jitter = Math.ceil(this.heart.interval * (Math.random() || 0.5));
436
437
  this.heart.timeoutId = setTimeout(()=>{
437
- _utils.logger.debug(`[Gateway] Start Heartbeating Shard #${this.id} b`);
438
+ this.logger.debug(`[Gateway] Start Heartbeating Shard #${this.id} b`);
438
439
  if (!this.isOpen()) return;
439
- _utils.logger.debug(`[Gateway] Start Heartbeating Shard #${this.id} c ${this.previousSequenceNumber}`);
440
+ this.logger.debug(`[Gateway] Start Heartbeating Shard #${this.id} c ${this.previousSequenceNumber}`);
440
441
  // Using a direct socket.send call here because heartbeat requests are reserved by us.
441
442
  this.socket?.send(JSON.stringify({
442
443
  op: _types.GatewayOpcodes.Heartbeat,
443
444
  d: this.previousSequenceNumber
444
445
  }));
445
- _utils.logger.debug(`[Gateway] Start Heartbeating Shard #${this.id} d`);
446
+ this.logger.debug(`[Gateway] Start Heartbeating Shard #${this.id} d`);
446
447
  this.heart.lastBeat = Date.now();
447
448
  this.heart.acknowledged = false;
448
449
  // After the random heartbeat jitter we can start a normal interval.
449
450
  this.heart.intervalId = setInterval(async ()=>{
450
- _utils.logger.debug(`[Gateway] Start Heartbeating Shard #${this.id} e`);
451
+ this.logger.debug(`[Gateway] Start Heartbeating Shard #${this.id} e`);
451
452
  if (!this.isOpen()) return;
452
- _utils.logger.debug(`[Gateway] Start Heartbeating Shard #${this.id} f`);
453
+ this.logger.debug(`[Gateway] Start Heartbeating Shard #${this.id} f`);
453
454
  // gateway.debug("GW DEBUG", `Running setInterval in heartbeat file. Shard: ${shardId}`);
454
455
  // gateway.debug("GW HEARTBEATING", { shardId, shard: currentShard });
455
456
  // The Shard did not receive a heartbeat ACK from Discord in time,
@@ -457,18 +458,18 @@ let DiscordenoShard = class DiscordenoShard {
457
458
  // The Shard needs to start a re-identify action accordingly.
458
459
  // Reference: https://discord.com/developers/docs/topics/gateway#heartbeating-example-gateway-heartbeat-ack
459
460
  if (!this.heart.acknowledged) {
460
- _utils.logger.debug(`[Shard] Heartbeat not acknowledged for shard #${this.id}.`);
461
+ this.logger.debug(`[Shard] Heartbeat not acknowledged for shard #${this.id}.`);
461
462
  this.close(_types1.ShardSocketCloseCodes.ZombiedConnection, 'Zombied connection, did not receive an heartbeat ACK in time.');
462
463
  return await this.identify();
463
464
  }
464
465
  this.heart.acknowledged = false;
465
- _utils.logger.debug(`[Gateway] Start Heartbeating Shard #${this.id} g`);
466
+ this.logger.debug(`[Gateway] Start Heartbeating Shard #${this.id} g`);
466
467
  // Using a direct socket.send call here because heartbeat requests are reserved by us.
467
468
  this.socket?.send(JSON.stringify({
468
469
  op: _types.GatewayOpcodes.Heartbeat,
469
470
  d: this.previousSequenceNumber
470
471
  }));
471
- _utils.logger.debug(`[Gateway] Start Heartbeating Shard #${this.id} h`);
472
+ this.logger.debug(`[Gateway] Start Heartbeating Shard #${this.id} h`);
472
473
  this.heart.lastBeat = Date.now();
473
474
  this.events.heartbeat?.(this);
474
475
  }, this.heart.interval);
@@ -484,4 +485,4 @@ let DiscordenoShard = class DiscordenoShard {
484
485
  };
485
486
  const _default = DiscordenoShard;
486
487
 
487
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9TaGFyZC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tY29uZnVzaW5nLXZvaWQtZXhwcmVzc2lvbiAqL1xuaW1wb3J0IHR5cGUgeyBEaXNjb3JkR2F0ZXdheVBheWxvYWQsIERpc2NvcmRIZWxsbywgRGlzY29yZFJlYWR5IH0gZnJvbSAnQGRpc2NvcmRlbm8vdHlwZXMnXG5pbXBvcnQgeyBHYXRld2F5Q2xvc2VFdmVudENvZGVzLCBHYXRld2F5T3Bjb2RlcyB9IGZyb20gJ0BkaXNjb3JkZW5vL3R5cGVzJ1xuaW1wb3J0IHsgY2FtZWxpemUsIGRlbGF5LCBMZWFreUJ1Y2tldCwgbG9nZ2VyIH0gZnJvbSAnQGRpc2NvcmRlbm8vdXRpbHMnXG5pbXBvcnQgeyBpbmZsYXRlU3luYyB9IGZyb20gJ25vZGU6emxpYidcbmltcG9ydCBOb2RlV2ViU29ja2V0IGZyb20gJ3dzJ1xuaW1wb3J0IHR5cGUgeyBCb3RTdGF0dXNVcGRhdGUsIFNoYXJkRXZlbnRzLCBTaGFyZEdhdGV3YXlDb25maWcsIFNoYXJkSGVhcnQsIFNoYXJkU29ja2V0UmVxdWVzdCB9IGZyb20gJy4vdHlwZXMuanMnXG5pbXBvcnQgeyBTaGFyZFNvY2tldENsb3NlQ29kZXMsIFNoYXJkU3RhdGUgfSBmcm9tICcuL3R5cGVzLmpzJ1xuXG5kZWNsYXJlIGxldCBXZWJTb2NrZXQ6IGFueVxuXG5leHBvcnQgY2xhc3MgRGlzY29yZGVub1NoYXJkIHtcbiAgLyoqIFRoZSBpZCBvZiB0aGUgc2hhcmQgKi9cbiAgaWQ6IG51bWJlclxuICAvKiogVGhlIGNvbm5lY3Rpb24gY29uZmlnIGRldGFpbHMgdGhhdCB0aGlzIHNoYXJkIHdpbGwgdXNlZCB0byBjb25uZWN0IHRvIGRpc2NvcmQuICovXG4gIGNvbm5lY3Rpb246IFNoYXJkR2F0ZXdheUNvbmZpZ1xuICAvKiogVGhpcyBjb250YWlucyBhbGwgdGhlIGhlYXJ0YmVhdCBpbmZvcm1hdGlvbiAqL1xuICBoZWFydDogU2hhcmRIZWFydFxuICAvKiogVGhlIG1heGltdW0gb2YgcmVxdWVzdHMgd2hpY2ggY2FuIGJlIHNlbmQgdG8gZGlzY29yZCBwZXIgcmF0ZSBsaW1pdCB0aWNrLiBUeXBpY2FsbHkgdGhpcyB2YWx1ZSBzaG91bGQgbm90IGJlIGNoYW5nZWQuICovXG4gIG1heFJlcXVlc3RzUGVyUmF0ZUxpbWl0VGljazogbnVtYmVyID0gMTIwXG4gIC8qKiBUaGUgcHJldmlvdXMgcGF5bG9hZCBzZXF1ZW5jZSBudW1iZXIuICovXG4gIHByZXZpb3VzU2VxdWVuY2VOdW1iZXI6IG51bWJlciB8IG51bGwgPSBudWxsXG4gIC8qKiBJbiB3aGljaCBpbnRlcnZhbCAoaW4gbWlsbGlzZWNvbmRzKSB0aGUgZ2F0ZXdheSByZXNldHMgaXQncyByYXRlIGxpbWl0LiAqL1xuICByYXRlTGltaXRSZXNldEludGVydmFsOiBudW1iZXIgPSA2MDAwMFxuICAvKiogQ3VycmVudCBzZXNzaW9uIGlkIG9mIHRoZSBzaGFyZCBpZiBwcmVzZW50LiAqL1xuICBzZXNzaW9uSWQ/OiBzdHJpbmdcbiAgLyoqIFRoaXMgY29udGFpbnMgdGhlIFdlYlNvY2tldCBjb25uZWN0aW9uIHRvIERpc2NvcmQsIGlmIGN1cnJlbnRseSBjb25uZWN0ZWQuICovXG4gIHNvY2tldD86IE5vZGVXZWJTb2NrZXRcbiAgLyoqIEN1cnJlbnQgaW50ZXJuYWwgc3RhdGUgb2YgdGhlIHRoaXMuICovXG4gIHN0YXRlID0gU2hhcmRTdGF0ZS5PZmZsaW5lXG4gIC8qKiBUaGUgdXJsIHByb3ZpZGVkIGJ5IGRpc2NvcmQgdG8gdXNlIHdoZW4gcmVzdW1pbmcgYSBjb25uZWN0aW9uIGZvciB0aGlzIHRoaXMuICovXG4gIHJlc3VtZUdhdGV3YXlVcmw6IHN0cmluZyA9ICcnXG4gIC8qKiBUaGUgc2hhcmQgcmVsYXRlZCBldmVudCBoYW5kbGVycy4gKi9cbiAgZXZlbnRzOiBTaGFyZEV2ZW50cyA9IHt9XG4gIC8qKiBDYWNoZSBmb3IgcGVuZGluZyBnYXRld2F5IHJlcXVlc3RzIHdoaWNoIHNob3VsZCBoYXZlIGJlZW4gc2VuZCB3aGlsZSB0aGUgZ2F0ZXdheSB3ZW50IG9mZmxpbmUuICovXG4gIG9mZmxpbmVTZW5kUXVldWU6IEFycmF5PChfPzogdW5rbm93bikgPT4gdm9pZD4gPSBbXVxuICAvKiogUmVzb2x2ZSBpbnRlcm5hbCB3YWl0aW5nIHN0YXRlcy4gTWFwcGVkIGJ5IFNlbGVjdGVkRXZlbnRzID0+IFJlc29sdmVGdW5jdGlvbiAqL1xuICByZXNvbHZlcyA9IG5ldyBNYXA8J1JFQURZJyB8ICdSRVNVTUVEJyB8ICdJTlZBTElEX1NFU1NJT04nLCAocGF5bG9hZDogRGlzY29yZEdhdGV3YXlQYXlsb2FkKSA9PiB2b2lkPigpXG4gIC8qKiBTaGFyZCBidWNrZXQuIE9ubHkgYWNjZXNzIHRoaXMgaWYgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nLiBCdWNrZXQgZm9yIGhhbmRsaW5nIHNoYXJkIHJlcXVlc3QgcmF0ZSBsaW1pdHMuICovXG4gIGJ1Y2tldDogTGVha3lCdWNrZXRcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBTaGFyZENyZWF0ZU9wdGlvbnMpIHtcbiAgICB0aGlzLmlkID0gb3B0aW9ucy5pZFxuICAgIHRoaXMuY29ubmVjdGlvbiA9IG9wdGlvbnMuY29ubmVjdGlvblxuICAgIHRoaXMuZXZlbnRzID0gb3B0aW9ucy5ldmVudHNcblxuICAgIHRoaXMuaGVhcnQgPSB7XG4gICAgICBhY2tub3dsZWRnZWQ6IGZhbHNlLFxuICAgICAgaW50ZXJ2YWw6IDQ1MDAwLFxuICAgIH1cblxuICAgIGlmIChvcHRpb25zLnJlcXVlc3RJZGVudGlmeSkgdGhpcy5yZXF1ZXN0SWRlbnRpZnkgPSBvcHRpb25zLnJlcXVlc3RJZGVudGlmeVxuICAgIGlmIChvcHRpb25zLnNoYXJkSXNSZWFkeSkgdGhpcy5zaGFyZElzUmVhZHkgPSBvcHRpb25zLnNoYXJkSXNSZWFkeVxuXG4gICAgdGhpcy5idWNrZXQgPSBuZXcgTGVha3lCdWNrZXQoe1xuICAgICAgbWF4OiB0aGlzLmNhbGN1bGF0ZVNhZmVSZXF1ZXN0cygpLFxuICAgICAgcmVmaWxsQW1vdW50OiB0aGlzLmNhbGN1bGF0ZVNhZmVSZXF1ZXN0cygpLFxuICAgICAgcmVmaWxsSW50ZXJ2YWw6IDYwMDAwLFxuICAgIH0pXG4gIH1cblxuICAvKiogVGhlIGdhdGV3YXkgY29uZmlndXJhdGlvbiB3aGljaCBpcyB1c2VkIHRvIGNvbm5lY3QgdG8gRGlzY29yZC4gKi9cbiAgZ2V0IGdhdGV3YXlDb25maWcoKTogU2hhcmRHYXRld2F5Q29uZmlnIHtcbiAgICByZXR1cm4gdGhpcy5jb25uZWN0aW9uXG4gIH1cblxuICAvKiogVGhlIHVybCB0byBjb25uZWN0IHRvLiBJbml0aWFsbHkgdGhpcyBpcyB0aGUgZGlzY29yZCBnYXRld2F5IHVybCwgYW5kIHRoZW4gaXMgc3dpdGNoZWQgdG8gcmVzdW1lIGdhdGV3YXkgdXJsIG9uY2UgYSBSRUFEWSBpcyByZWNlaXZlZC4gKi9cbiAgZ2V0IGNvbm5lY3Rpb25VcmwoKTogc3RyaW5nIHtcbiAgICAvLyBVc2UgfHwgYW5kIG5vdCA/PyBoZXJlLiA/PyB3aWxsIGNhdXNlIGEgYnVnLlxuICAgIHJldHVybiB0aGlzLnJlc3VtZUdhdGV3YXlVcmwgfHwgdGhpcy5nYXRld2F5Q29uZmlnLnVybFxuICB9XG5cbiAgLyoqIENhbGN1bGF0ZSB0aGUgYW1vdW50IG9mIHJlcXVlc3RzIHdoaWNoIGNhbiBzYWZlbHkgYmUgbWFkZSBwZXIgcmF0ZSBsaW1pdCBpbnRlcnZhbCwgYmVmb3JlIHRoZSBnYXRld2F5IGdldHMgZGlzY29ubmVjdGVkIGR1ZSB0byBhbiBleGNlZWRlZCByYXRlIGxpbWl0LiAqL1xuICBjYWxjdWxhdGVTYWZlUmVxdWVzdHMoKTogbnVtYmVyIHtcbiAgICAvLyAqIDIgYWRkcyBleHRyYSBzYWZldHkgbGF5ZXIgZm9yIGRpc2NvcmRzIE9QIDEgcmVxdWVzdHMgdGhhdCB3ZSBuZWVkIHRvIHJlc3BvbmQgdG9cbiAgICBjb25zdCBzYWZlUmVxdWVzdHMgPSB0aGlzLm1heFJlcXVlc3RzUGVyUmF0ZUxpbWl0VGljayAtIE1hdGguY2VpbCh0aGlzLnJhdGVMaW1pdFJlc2V0SW50ZXJ2YWwgLyB0aGlzLmhlYXJ0LmludGVydmFsKSAqIDJcblxuICAgIHJldHVybiBzYWZlUmVxdWVzdHMgPCAwID8gMCA6IHNhZmVSZXF1ZXN0c1xuICB9XG5cbiAgYXN5bmMgY2hlY2tPZmZsaW5lKGhpZ2hQcmlvcml0eTogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5pc09wZW4oKSkge1xuICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgLy8gSGlnaGVyIHByaW9yaXR5IHJlcXVlc3RzIGdldCBhZGRlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBhcnJheS5cbiAgICAgICAgaWYgKGhpZ2hQcmlvcml0eSkgdGhpcy5vZmZsaW5lU2VuZFF1ZXVlLnVuc2hpZnQocmVzb2x2ZSlcbiAgICAgICAgZWxzZSB0aGlzLm9mZmxpbmVTZW5kUXVldWUucHVzaChyZXNvbHZlKVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICAvKiogQ2xvc2UgdGhlIHNvY2tldCBjb25uZWN0aW9uIHRvIGRpc2NvcmQgaWYgcHJlc2VudC4gKi9cbiAgY2xvc2UoY29kZTogbnVtYmVyLCByZWFzb246IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICh0aGlzLnNvY2tldD8ucmVhZHlTdGF0ZSAhPT0gTm9kZVdlYlNvY2tldC5PUEVOKSByZXR1cm5cblxuICAgIHRoaXMuc29ja2V0Py5jbG9zZShjb2RlLCByZWFzb24pXG4gIH1cblxuICAvKiogQ29ubmVjdCB0aGUgc2hhcmQgd2l0aCB0aGUgZ2F0ZXdheSBhbmQgc3RhcnQgaGVhcnRiZWF0aW5nLiBUaGlzIHdpbGwgbm90IGlkZW50aWZ5IHRoZSBzaGFyZCB0byB0aGUgZ2F0ZXdheS4gKi9cbiAgYXN5bmMgY29ubmVjdCgpOiBQcm9taXNlPERpc2NvcmRlbm9TaGFyZD4ge1xuICAgIC8vIE9ubHkgc2V0IHRoZSBzaGFyZCB0byBgQ29ubmVjdGluZ2Agc3RhdGUsXG4gICAgLy8gaWYgdGhlIGNvbm5lY3Rpb24gcmVxdWVzdCBkb2VzIG5vdCBjb21lIGZyb20gYW4gaWRlbnRpZnkgb3IgcmVzdW1lIGFjdGlvbi5cbiAgICBpZiAoIVtTaGFyZFN0YXRlLklkZW50aWZ5aW5nLCBTaGFyZFN0YXRlLlJlc3VtaW5nXS5pbmNsdWRlcyh0aGlzLnN0YXRlKSkge1xuICAgICAgdGhpcy5zdGF0ZSA9IFNoYXJkU3RhdGUuQ29ubmVjdGluZ1xuICAgIH1cbiAgICB0aGlzLmV2ZW50cy5jb25uZWN0aW5nPy4odGhpcylcblxuICAgIGNvbnN0IHVybCA9IG5ldyBVUkwodGhpcy5jb25uZWN0aW9uVXJsKVxuICAgIHVybC5zZWFyY2hQYXJhbXMuc2V0KCd2JywgdGhpcy5nYXRld2F5Q29uZmlnLnZlcnNpb24udG9TdHJpbmcoKSlcbiAgICB1cmwuc2VhcmNoUGFyYW1zLnNldCgnZW5jb2RpbmcnLCAnanNvbicpXG5cbiAgICBjb25zdCBzb2NrZXQ6IE5vZGVXZWJTb2NrZXQgPVxuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBEZW5vXG4gICAgICBnbG9iYWxUaGlzLkRlbm8gIT09IHVuZGVmaW5lZCAmJiBSZWZsZWN0LmhhcyhnbG9iYWxUaGlzLCAnRGVubycpID8gbmV3IFdlYlNvY2tldCh1cmwudG9TdHJpbmcoKSkgOiBuZXcgTm9kZVdlYlNvY2tldCh1cmwudG9TdHJpbmcoKSlcbiAgICB0aGlzLnNvY2tldCA9IHNvY2tldFxuXG4gICAgLy8gVE9ETzogcHJvcGVyIGV2ZW50IGhhbmRsaW5nXG4gICAgc29ja2V0Lm9uZXJyb3IgPSAoZXZlbnQ6IE5vZGVXZWJTb2NrZXQuRXJyb3JFdmVudCkgPT4gY29uc29sZS5sb2coeyBlcnJvcjogZXZlbnQsIHNoYXJkSWQ6IHRoaXMuaWQgfSlcbiAgICBzb2NrZXQub25jbG9zZSA9IGFzeW5jIChldmVudDogTm9kZVdlYlNvY2tldC5DbG9zZUV2ZW50KSA9PiBhd2FpdCB0aGlzLmhhbmRsZUNsb3NlKGV2ZW50KVxuICAgIHNvY2tldC5vbm1lc3NhZ2UgPSBhc3luYyAobWVzc2FnZTogTm9kZVdlYlNvY2tldC5NZXNzYWdlRXZlbnQpID0+IGF3YWl0IHRoaXMuaGFuZGxlTWVzc2FnZShtZXNzYWdlKVxuXG4gICAgcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICBzb2NrZXQub25vcGVuID0gKCkgPT4ge1xuICAgICAgICAvLyBPbmx5IHNldCB0aGUgc2hhcmQgdG8gYFVuaWRlbnRpZmllZGAgc3RhdGUsXG4gICAgICAgIC8vIGlmIHRoZSBjb25uZWN0aW9uIHJlcXVlc3QgZG9lcyBub3QgY29tZSBmcm9tIGFuIGlkZW50aWZ5IG9yIHJlc3VtZSBhY3Rpb24uXG4gICAgICAgIGlmICghW1NoYXJkU3RhdGUuSWRlbnRpZnlpbmcsIFNoYXJkU3RhdGUuUmVzdW1pbmddLmluY2x1ZGVzKHRoaXMuc3RhdGUpKSB7XG4gICAgICAgICAgdGhpcy5zdGF0ZSA9IFNoYXJkU3RhdGUuVW5pZGVudGlmaWVkXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5ldmVudHMuY29ubmVjdGVkPy4odGhpcylcblxuICAgICAgICByZXNvbHZlKHRoaXMpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKiBJZGVudGlmeSB0aGUgc2hhcmQgdG8gdGhlIGdhdGV3YXkuIElmIG5vdCBjb25uZWN0ZWQsIHRoaXMgd2lsbCBhbHNvIGNvbm5lY3QgdGhlIHNoYXJkIHRvIHRoZSBnYXRld2F5LiAqL1xuICBhc3luYyBpZGVudGlmeSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBBIG5ldyBpZGVudGlmeSBoYXMgYmVlbiByZXF1ZXN0ZWQgZXZlbiB0aG91Z2ggdGhlcmUgaXMgYWxyZWFkeSBhIGNvbm5lY3Rpb24gb3Blbi5cbiAgICAvLyBUaGVyZWZvcmUgd2UgbmVlZCB0byBjbG9zZSB0aGUgb2xkIGNvbm5lY3Rpb24gYW5kIGhlYXJ0YmVhdGluZyBiZWZvcmUgY3JlYXRpbmcgYSBuZXcgb25lLlxuICAgIGlmICh0aGlzLmlzT3BlbigpKSB7XG4gICAgICBsb2dnZXIuZGVidWcoYENMT1NJTkcgRVhJU1RJTkcgU0hBUkQ6ICMke3RoaXMuaWR9YClcbiAgICAgIHRoaXMuY2xvc2UoU2hhcmRTb2NrZXRDbG9zZUNvZGVzLlJlSWRlbnRpZnlpbmcsICdSZS1pZGVudGlmeWluZyBjbG9zdXJlIG9mIG9sZCBjb25uZWN0aW9uLicpXG4gICAgfVxuXG4gICAgdGhpcy5zdGF0ZSA9IFNoYXJkU3RhdGUuSWRlbnRpZnlpbmdcbiAgICB0aGlzLmV2ZW50cy5pZGVudGlmeWluZz8uKHRoaXMpXG5cbiAgICAvLyBJdCBpcyBwb3NzaWJsZSB0aGF0IHRoZSBzaGFyZCBpcyBpbiBIZWFydGJlYXRpbmcgc3RhdGUgYnV0IG5vdCBpZGVudGlmaWVkLFxuICAgIC8vIHNvIGNoZWNrIHdoZXRoZXIgdGhlcmUgaXMgYWxyZWFkeSBhIGdhdGV3YXkgY29ubmVjdGlvbiBleGlzdGluZy5cbiAgICAvLyBJZiBub3Qgd2UgbmVlZCB0byBjcmVhdGUgb25lIGJlZm9yZSB3ZSBpZGVudGlmeS5cbiAgICBpZiAoIXRoaXMuaXNPcGVuKCkpIHtcbiAgICAgIGF3YWl0IHRoaXMuY29ubmVjdCgpXG4gICAgfVxuXG4gICAgdGhpcy5zZW5kKFxuICAgICAge1xuICAgICAgICBvcDogR2F0ZXdheU9wY29kZXMuSWRlbnRpZnksXG4gICAgICAgIGQ6IHtcbiAgICAgICAgICB0b2tlbjogYEJvdCAke3RoaXMuZ2F0ZXdheUNvbmZpZy50b2tlbn1gLFxuICAgICAgICAgIGNvbXByZXNzOiB0aGlzLmdhdGV3YXlDb25maWcuY29tcHJlc3MsXG4gICAgICAgICAgcHJvcGVydGllczogdGhpcy5nYXRld2F5Q29uZmlnLnByb3BlcnRpZXMsXG4gICAgICAgICAgaW50ZW50czogdGhpcy5nYXRld2F5Q29uZmlnLmludGVudHMsXG4gICAgICAgICAgc2hhcmQ6IFt0aGlzLmlkLCB0aGlzLmdhdGV3YXlDb25maWcudG90YWxTaGFyZHNdLFxuICAgICAgICAgIHByZXNlbmNlOiBhd2FpdCB0aGlzLm1ha2VQcmVzZW5jZT8uKCksXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgdHJ1ZSxcbiAgICApXG5cbiAgICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIHRoaXMucmVzb2x2ZXMuc2V0KCdSRUFEWScsICgpID0+IHtcbiAgICAgICAgdGhpcy5ldmVudHMuaWRlbnRpZmllZD8uKHRoaXMpXG4gICAgICAgIC8vIFRlbGxzIHRoZSBtYW5hZ2VyIHRoYXQgdGhpcyBzaGFyZCBpcyByZWFkeVxuICAgICAgICB0aGlzLnNoYXJkSXNSZWFkeSgpXG4gICAgICAgIHJlc29sdmUoKVxuICAgICAgfSlcbiAgICAgIC8vIFdoZW4gaWRlbnRpZnlpbmcgdG9vIGZhc3QsXG4gICAgICAvLyBEaXNjb3JkIHNlbmRzIGFuIGludmFsaWQgc2Vzc2lvbiBwYXlsb2FkLlxuICAgICAgLy8gVGhpcyBjYW4gc2FmZWx5IGJlIGlnbm9yZWQgdGhvdWdoIGFuZCB0aGUgc2hhcmQgc3RhcnRzIGEgbmV3IGlkZW50aWZ5IGFjdGlvbi5cbiAgICAgIHRoaXMucmVzb2x2ZXMuc2V0KCdJTlZBTElEX1NFU1NJT04nLCAoKSA9PiB7XG4gICAgICAgIHRoaXMucmVzb2x2ZXMuZGVsZXRlKCdSRUFEWScpXG4gICAgICAgIHJlc29sdmUoKVxuICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgLyoqIENoZWNrIHdoZXRoZXIgdGhlIGNvbm5lY3Rpb24gdG8gRGlzY29yZCBpcyBjdXJyZW50bHkgb3Blbi4gKi9cbiAgaXNPcGVuKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNvY2tldD8ucmVhZHlTdGF0ZSA9PT0gTm9kZVdlYlNvY2tldC5PUEVOXG4gIH1cblxuICAvKiogQXR0ZW1wdCB0byByZXN1bWUgdGhlIHByZXZpb3VzIHNoYXJkcyBzZXNzaW9uIHdpdGggdGhlIGdhdGV3YXkuICovXG4gIGFzeW5jIHJlc3VtZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsb2dnZXIuZGVidWcoYFtHYXRld2F5XSBSZXN1bWluZyBTaGFyZCAjJHt0aGlzLmlkfWApXG4gICAgLy8gSXQgaGFzIGJlZW4gcmVxdWVzdGVkIHRvIHJlc3VtZSB0aGUgU2hhcmRzIHNlc3Npb24uXG4gICAgLy8gSXQncyBwb3NzaWJsZSB0aGF0IHRoZSBzaGFyZCBpcyBzdGlsbCBjb25uZWN0ZWQgd2l0aCBEaXNjb3JkJ3MgZ2F0ZXdheSB0aGVyZWZvcmUgd2UgbmVlZCB0byBmb3JjZWZ1bGx5IGNsb3NlIGl0LlxuICAgIGlmICh0aGlzLmlzT3BlbigpKSB7XG4gICAgICBsb2dnZXIuZGVidWcoYFtHYXRld2F5XSBSZXN1bWluZyBTaGFyZCAjJHt0aGlzLmlkfSBpbiBpc09wZW5gKVxuICAgICAgdGhpcy5jbG9zZShTaGFyZFNvY2tldENsb3NlQ29kZXMuUmVzdW1lQ2xvc2luZ09sZENvbm5lY3Rpb24sICdSZWNvbm5lY3RpbmcgdGhlIHNoYXJkLCBjbG9zaW5nIG9sZCBjb25uZWN0aW9uLicpXG4gICAgfVxuXG4gICAgLy8gU2hhcmQgaGFzIG5ldmVyIGlkZW50aWZpZWQsIHNvIHdlIGNhbm5vdCByZXN1bWUuXG4gICAgaWYgKCF0aGlzLnNlc3Npb25JZCkge1xuICAgICAgbG9nZ2VyLmRlYnVnKGBbU2hhcmRdIFRyeWluZyB0byByZXN1bWUgYSBzaGFyZCAjJHt0aGlzLmlkfSB0aGF0IHdhcyBOT1QgZmlyc3QgaWRlbnRpZmllZC4gKE5vIHNlc3Npb24gaWQgZm91bmQpYClcblxuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuaWRlbnRpZnkoKVxuICAgIH1cblxuICAgIHRoaXMuc3RhdGUgPSBTaGFyZFN0YXRlLlJlc3VtaW5nXG5cbiAgICBsb2dnZXIuZGVidWcoYFtHYXRld2F5XSBSZXN1bWluZyBTaGFyZCAjJHt0aGlzLmlkfSwgYmVmb3JlIGNvbm5lY3RpbmdgKVxuICAgIC8vIEJlZm9yZSB3ZSBjYW4gcmVzdW1lLCB3ZSBuZWVkIHRvIGNyZWF0ZSBhIG5ldyBjb25uZWN0aW9uIHdpdGggRGlzY29yZCdzIGdhdGV3YXkuXG4gICAgYXdhaXQgdGhpcy5jb25uZWN0KClcbiAgICBsb2dnZXIuZGVidWcoXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3Jlc3RyaWN0LXRlbXBsYXRlLWV4cHJlc3Npb25zXG4gICAgICBgW0dhdGV3YXldIFJlc3VtaW5nIFNoYXJkICMke3RoaXMuaWR9LCBhZnRlciBjb25uZWN0aW5nLiAke3RoaXMuZ2F0ZXdheUNvbmZpZy50b2tlbn0gfCAke3RoaXMuc2Vzc2lvbklkfSB8ICR7dGhpcy5wcmV2aW91c1NlcXVlbmNlTnVtYmVyfWAsXG4gICAgKVxuXG4gICAgdGhpcy5zZW5kKFxuICAgICAge1xuICAgICAgICBvcDogR2F0ZXdheU9wY29kZXMuUmVzdW1lLFxuICAgICAgICBkOiB7XG4gICAgICAgICAgdG9rZW46IGBCb3QgJHt0aGlzLmdhdGV3YXlDb25maWcudG9rZW59YCxcbiAgICAgICAgICBzZXNzaW9uX2lkOiB0aGlzLnNlc3Npb25JZCxcbiAgICAgICAgICBzZXE6IHRoaXMucHJldmlvdXNTZXF1ZW5jZU51bWJlciA/PyAwLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHRydWUsXG4gICAgKVxuICAgIGxvZ2dlci5kZWJ1ZyhgW0dhdGV3YXldIFJlc3VtaW5nIFNoYXJkICMke3RoaXMuaWR9IGFmdGVyIHNlbmQgcmVzdW1nYClcblxuICAgIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgdGhpcy5yZXNvbHZlcy5zZXQoJ1JFU1VNRUQnLCAoKSA9PiByZXNvbHZlKCkpXG4gICAgICAvLyBJZiBpdCBpcyBhdHRlbXB0ZWQgdG8gcmVzdW1lIHdpdGggYW4gaW52YWxpZCBzZXNzaW9uIGlkLFxuICAgICAgLy8gRGlzY29yZCBzZW5kcyBhbiBpbnZhbGlkIHNlc3Npb24gcGF5bG9hZFxuICAgICAgLy8gTm90IGVycm9yaW5nIGhlcmUgc2luY2UgaXQgaXMgZWFzeSB0aGF0IHRoaXMgaGFwcGVucywgYWxzbyBpdCB3b3VsZCBiZSBub3QgY2F0Y2hhYmxlXG4gICAgICB0aGlzLnJlc29sdmVzLnNldCgnSU5WQUxJRF9TRVNTSU9OJywgKCkgPT4ge1xuICAgICAgICB0aGlzLnJlc29sdmVzLmRlbGV0ZSgnUkVTVU1FRCcpXG4gICAgICAgIHJlc29sdmUoKVxuICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgLyoqIFNlbmQgYSBtZXNzYWdlIHRvIERpc2NvcmQuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2hpZ2hQcmlvcml0eT1mYWxzZV0gLSBXaGV0aGVyIHRoaXMgbWVzc2FnZSBzaG91bGQgYmUgc2VuZCBhc2FwLlxuICAgKi9cbiAgYXN5bmMgc2VuZChtZXNzYWdlOiBTaGFyZFNvY2tldFJlcXVlc3QsIGhpZ2hQcmlvcml0eTogYm9vbGVhbiA9IGZhbHNlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gQmVmb3JlIGFjcXVpcmluZyBhIHRva2VuIGZyb20gdGhlIGJ1Y2tldCwgY2hlY2sgd2hldGhlciB0aGUgc2hhcmQgaXMgY3VycmVudGx5IG9mZmxpbmUgb3Igbm90LlxuICAgIC8vIEVsc2UgYnVja2V0IGFuZCB0b2tlbiB3YWl0IHRpbWUganVzdCBnZXQgd2FzdGVkLlxuICAgIGF3YWl0IHRoaXMuY2hlY2tPZmZsaW5lKGhpZ2hQcmlvcml0eSlcblxuICAgIGF3YWl0IHRoaXMuYnVja2V0LmFjcXVpcmUoaGlnaFByaW9yaXR5KVxuXG4gICAgLy8gSXQncyBwb3NzaWJsZSwgdGhhdCB0aGUgc2hhcmQgd2VudCBvZmZsaW5lIGFmdGVyIGEgdG9rZW4gaGFzIGJlZW4gYWNxdWlyZWQgZnJvbSB0aGUgYnVja2V0LlxuICAgIGF3YWl0IHRoaXMuY2hlY2tPZmZsaW5lKGhpZ2hQcmlvcml0eSlcblxuICAgIHRoaXMuc29ja2V0Py5zZW5kKEpTT04uc3RyaW5naWZ5KG1lc3NhZ2UpKVxuICB9XG5cbiAgLyoqIFNodXRkb3duIHRoZSB0aGlzLiBGb3JjZWZ1bGx5IGRpc2Nvbm5lY3QgdGhlIHNoYXJkIGZyb20gRGlzY29yZC4gVGhlIHNoYXJkIG1heSBub3QgYXR0ZW1wdCB0byByZWNvbm5lY3Qgd2l0aCBEaXNjb3JkLiAqL1xuICBhc3luYyBzaHV0ZG93bigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmNsb3NlKFNoYXJkU29ja2V0Q2xvc2VDb2Rlcy5TaHV0ZG93biwgJ1NoYXJkIHNodXR0aW5nIGRvd24uJylcbiAgICB0aGlzLnN0YXRlID0gU2hhcmRTdGF0ZS5PZmZsaW5lXG4gIH1cblxuICAvKiogSGFuZGxlIGEgZ2F0ZXdheSBjb25uZWN0aW9uIGNsb3NlLiAqL1xuICBhc3luYyBoYW5kbGVDbG9zZShjbG9zZTogTm9kZVdlYlNvY2tldC5DbG9zZUV2ZW50KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gICBnYXRld2F5LmRlYnVnKFwiR1cgQ0xPU0VEXCIsIHsgc2hhcmRJZCwgcGF5bG9hZDogZXZlbnQgfSk7XG5cbiAgICB0aGlzLnN0b3BIZWFydGJlYXRpbmcoKVxuXG4gICAgc3dpdGNoIChjbG9zZS5jb2RlKSB7XG4gICAgICBjYXNlIFNoYXJkU29ja2V0Q2xvc2VDb2Rlcy5UZXN0aW5nRmluaXNoZWQ6IHtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IFNoYXJkU3RhdGUuT2ZmbGluZVxuICAgICAgICB0aGlzLmV2ZW50cy5kaXNjb25uZWN0ZWQ/Lih0aGlzKVxuXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgLy8gT24gdGhlc2UgY29kZXMgYSBtYW51YWwgc3RhcnQgd2lsbCBiZSBkb25lLlxuICAgICAgY2FzZSBTaGFyZFNvY2tldENsb3NlQ29kZXMuU2h1dGRvd246XG4gICAgICBjYXNlIFNoYXJkU29ja2V0Q2xvc2VDb2Rlcy5SZUlkZW50aWZ5aW5nOlxuICAgICAgY2FzZSBTaGFyZFNvY2tldENsb3NlQ29kZXMuUmVzaGFyZGVkOlxuICAgICAgY2FzZSBTaGFyZFNvY2tldENsb3NlQ29kZXMuUmVzdW1lQ2xvc2luZ09sZENvbm5lY3Rpb246XG4gICAgICBjYXNlIFNoYXJkU29ja2V0Q2xvc2VDb2Rlcy5ab21iaWVkQ29ubmVjdGlvbjoge1xuICAgICAgICB0aGlzLnN0YXRlID0gU2hhcmRTdGF0ZS5EaXNjb25uZWN0ZWRcbiAgICAgICAgdGhpcy5ldmVudHMuZGlzY29ubmVjdGVkPy4odGhpcylcblxuICAgICAgICAvLyBnYXRld2F5LmRlYnVnKFwiR1cgQ0xPU0VEX1JFQ09OTkVDVFwiLCB7IHNoYXJkSWQsIHBheWxvYWQ6IGV2ZW50IH0pO1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIC8vIEdhdGV3YXkgY29ubmVjdGlvbiBjbG9zZXMgd2hpY2ggcmVxdWlyZSBhIG5ldyBpZGVudGlmeS5cbiAgICAgIGNhc2UgR2F0ZXdheUNsb3NlRXZlbnRDb2Rlcy5Vbmtub3duT3Bjb2RlOlxuICAgICAgY2FzZSBHYXRld2F5Q2xvc2VFdmVudENvZGVzLk5vdEF1dGhlbnRpY2F0ZWQ6XG4gICAgICBjYXNlIEdhdGV3YXlDbG9zZUV2ZW50Q29kZXMuSW52YWxpZFNlcTpcbiAgICAgIGNhc2UgR2F0ZXdheUNsb3NlRXZlbnRDb2Rlcy5SYXRlTGltaXRlZDpcbiAgICAgIGNhc2UgR2F0ZXdheUNsb3NlRXZlbnRDb2Rlcy5TZXNzaW9uVGltZWRPdXQ6IHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKGBbU2hhcmRdIEdhdGV3YXkgY29ubmVjdGlvbiBjbG9zaW5nIHJlcXVpcmluZyByZS1pZGVudGlmeS4gQ29kZTogJHtjbG9zZS5jb2RlfWApXG4gICAgICAgIHRoaXMuc3RhdGUgPSBTaGFyZFN0YXRlLklkZW50aWZ5aW5nXG4gICAgICAgIHRoaXMuZXZlbnRzLmRpc2Nvbm5lY3RlZD8uKHRoaXMpXG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuaWRlbnRpZnkoKVxuICAgICAgfVxuICAgICAgLy8gV2hlbiB0aGVzZSBjb2RlcyBhcmUgcmVjZWl2ZWQgc29tZXRoaW5nIHdlbnQgcmVhbGx5IHdyb25nLlxuICAgICAgLy8gT24gdGhvc2Ugd2UgY2Fubm90IHN0YXJ0IGEgcmVjb25uZWN0IGF0dGVtcHQuXG4gICAgICBjYXNlIEdhdGV3YXlDbG9zZUV2ZW50Q29kZXMuQXV0aGVudGljYXRpb25GYWlsZWQ6XG4gICAgICBjYXNlIEdhdGV3YXlDbG9zZUV2ZW50Q29kZXMuSW52YWxpZFNoYXJkOlxuICAgICAgY2FzZSBHYXRld2F5Q2xvc2VFdmVudENvZGVzLlNoYXJkaW5nUmVxdWlyZWQ6XG4gICAgICBjYXNlIEdhdGV3YXlDbG9zZUV2ZW50Q29kZXMuSW52YWxpZEFwaVZlcnNpb246XG4gICAgICBjYXNlIEdhdGV3YXlDbG9zZUV2ZW50Q29kZXMuSW52YWxpZEludGVudHM6XG4gICAgICBjYXNlIEdhdGV3YXlDbG9zZUV2ZW50Q29kZXMuRGlzYWxsb3dlZEludGVudHM6IHtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IFNoYXJkU3RhdGUuT2ZmbGluZVxuICAgICAgICB0aGlzLmV2ZW50cy5kaXNjb25uZWN0ZWQ/Lih0aGlzKVxuXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihjbG9zZS5yZWFzb24gfHwgJ0Rpc2NvcmQgZ2F2ZSBubyByZWFzb24hIEdHISBZb3UgYnJva2UgRGlzY29yZCEnKVxuICAgICAgfVxuICAgICAgLy8gR2F0ZXdheSBjb25uZWN0aW9uIGNsb3NlcyBvbiB3aGljaCBhIHJlc3VtZSBpcyBhbGxvd2VkLlxuICAgICAgY2FzZSBHYXRld2F5Q2xvc2VFdmVudENvZGVzLlVua25vd25FcnJvcjpcbiAgICAgIGNhc2UgR2F0ZXdheUNsb3NlRXZlbnRDb2Rlcy5EZWNvZGVFcnJvcjpcbiAgICAgIGNhc2UgR2F0ZXdheUNsb3NlRXZlbnRDb2Rlcy5BbHJlYWR5QXV0aGVudGljYXRlZDpcbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgbG9nZ2VyLmluZm8oYFtTaGFyZF0gY2xvc2VkIHNoYXJkICMke3RoaXMuaWR9LiBSZXN1bWluZy4uLmApXG4gICAgICAgIHRoaXMuc3RhdGUgPSBTaGFyZFN0YXRlLlJlc3VtaW5nXG4gICAgICAgIHRoaXMuZXZlbnRzLmRpc2Nvbm5lY3RlZD8uKHRoaXMpXG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMucmVzdW1lKClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKiogSGFuZGxlcyBhIGluY29taW5nIGdhdGV3YXkgcGFja2V0LiAqL1xuICBhc3luYyBoYW5kbGVEaXNjb3JkUGFja2V0KHBhY2tldDogRGlzY29yZEdhdGV3YXlQYXlsb2FkKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gRWRnZSBjYXNlIHN0YXJ0OiBodHRwczovL2dpdGh1Yi5jb20vZGlzY29yZGVuby9kaXNjb3JkZW5vL2lzc3Vlcy8yMzExXG4gICAgdGhpcy5oZWFydC5sYXN0QWNrID0gRGF0ZS5ub3coKVxuICAgIC8vIE1hbnVhbGx5IGNhbGN1bGF0aW5nIHRoZSByb3VuZCB0cmlwIHRpbWUgZm9yIHVzZXJzIHdobyBuZWVkIGl0LlxuICAgIGlmICh0aGlzLmhlYXJ0Lmxhc3RCZWF0ICYmICF0aGlzLmhlYXJ0LmFja25vd2xlZGdlZCkge1xuICAgICAgdGhpcy5oZWFydC5ydHQgPSB0aGlzLmhlYXJ0Lmxhc3RBY2sgLSB0aGlzLmhlYXJ0Lmxhc3RCZWF0XG4gICAgfVxuICAgIHRoaXMuaGVhcnQuYWNrbm93bGVkZ2VkID0gdHJ1ZVxuICAgIC8vIEVkZ2UgY2FzZSBlbmQhXG5cbiAgICBzd2l0Y2ggKHBhY2tldC5vcCkge1xuICAgICAgY2FzZSBHYXRld2F5T3Bjb2Rlcy5IZWFydGJlYXQ6IHtcbiAgICAgICAgLy8gVE9ETzogY2FuIHRoaXMgYWN0dWFsbHkgaGFwcGVuXG4gICAgICAgIGlmICghdGhpcy5pc09wZW4oKSkgcmV0dXJuXG5cbiAgICAgICAgdGhpcy5oZWFydC5sYXN0QmVhdCA9IERhdGUubm93KClcbiAgICAgICAgLy8gRGlzY29yZCByYW5kb21seSBzZW5kcyB0aGlzIHJlcXVpcmluZyBhbiBpbW1lZGlhdGUgaGVhcnRiZWF0IGJhY2suXG4gICAgICAgIC8vIFVzaW5nIGEgZGlyZWN0IHNvY2tldC5zZW5kIGNhbGwgaGVyZSBiZWNhdXNlIGhlYXJ0YmVhdCByZXF1ZXN0cyBhcmUgcmVzZXJ2ZWQgYnkgdXMuXG4gICAgICAgIHRoaXMuc29ja2V0Py5zZW5kKFxuICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgIG9wOiBHYXRld2F5T3Bjb2Rlcy5IZWFydGJlYXQsXG4gICAgICAgICAgICBkOiB0aGlzLnByZXZpb3VzU2VxdWVuY2VOdW1iZXIsXG4gICAgICAgICAgfSksXG4gICAgICAgIClcbiAgICAgICAgdGhpcy5ldmVudHMuaGVhcnRiZWF0Py4odGhpcylcblxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgICAgY2FzZSBHYXRld2F5T3Bjb2Rlcy5IZWxsbzoge1xuICAgICAgICBjb25zdCBpbnRlcnZhbCA9IChwYWNrZXQuZCBhcyBEaXNjb3JkSGVsbG8pLmhlYXJ0YmVhdF9pbnRlcnZhbFxuICAgICAgICBsb2dnZXIuZGVidWcoYFtHYXRld2F5XSBIZWxsbyBvbiBTaGFyZCAjJHt0aGlzLmlkfWApXG4gICAgICAgIHRoaXMuc3RhcnRIZWFydGJlYXRpbmcoaW50ZXJ2YWwpXG5cbiAgICAgICAgaWYgKHRoaXMuc3RhdGUgIT09IFNoYXJkU3RhdGUuUmVzdW1pbmcpIHtcbiAgICAgICAgICBjb25zdCBjdXJyZW50UXVldWUgPSBbLi4udGhpcy5idWNrZXQucXVldWVdXG4gICAgICAgICAgLy8gSEVMTE8gaGFzIGJlZW4gc2VuZCBvbiBhIG5vbiByZXN1bWUgYWN0aW9uLlxuICAgICAgICAgIC8vIFRoaXMgbWVhbnMgdGhhdCB0aGUgc2hhcmQgc3RhcnRzIGEgbmV3IHNlc3Npb24sXG4gICAgICAgICAgLy8gdGhlcmVmb3JlIHRoZSByYXRlIGxpbWl0IGludGVydmFsIGhhcyBiZWVuIHJlc2V0IHRvby5cbiAgICAgICAgICB0aGlzLmJ1Y2tldCA9IG5ldyBMZWFreUJ1Y2tldCh7XG4gICAgICAgICAgICBtYXg6IHRoaXMuY2FsY3VsYXRlU2FmZVJlcXVlc3RzKCksXG4gICAgICAgICAgICByZWZpbGxJbnRlcnZhbDogNjAwMDAsXG4gICAgICAgICAgICByZWZpbGxBbW91bnQ6IHRoaXMuY2FsY3VsYXRlU2FmZVJlcXVlc3RzKCksXG4gICAgICAgICAgfSlcblxuICAgICAgICAgIC8vIFF1ZXVlIHNob3VsZCBub3QgYmUgbG9zdCBvbiBhIHJlLWlkZW50aWZ5LlxuICAgICAgICAgIHRoaXMuYnVja2V0LnF1ZXVlLnVuc2hpZnQoLi4uY3VycmVudFF1ZXVlKVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5ldmVudHMuaGVsbG8/Lih0aGlzKVxuXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgICBjYXNlIEdhdGV3YXlPcGNvZGVzLkhlYXJ0YmVhdEFDSzoge1xuICAgICAgICB0aGlzLmV2ZW50cy5oZWFydGJlYXRBY2s/Lih0aGlzKVxuXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgICBjYXNlIEdhdGV3YXlPcGNvZGVzLlJlY29ubmVjdDoge1xuICAgICAgICAvLyAgIGdhdGV3YXkuZGVidWcoXCJHVyBSRUNPTk5FQ1RcIiwgeyBzaGFyZElkIH0pO1xuXG4gICAgICAgIHRoaXMuZXZlbnRzLnJlcXVlc3RlZFJlY29ubmVjdD8uKHRoaXMpXG5cbiAgICAgICAgYXdhaXQgdGhpcy5yZXN1bWUoKVxuXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgICBjYXNlIEdhdGV3YXlPcGNvZGVzLkludmFsaWRTZXNzaW9uOiB7XG4gICAgICAgIGNvbnN0IHJlc3VtYWJsZSA9IHBhY2tldC5kIGFzIGJvb2xlYW5cbiAgICAgICAgbG9nZ2VyLmRlYnVnKGBbU2hhcmRdIFJlY2VpdmVkIEludmFsaWQgU2Vzc2lvbiBmb3IgU2hhcmQgIyR7dGhpcy5pZH0gd2l0aCByZXN1bWVhYmxlIGFzICR7cmVzdW1hYmxlLnRvU3RyaW5nKCl9YClcblxuICAgICAgICB0aGlzLmV2ZW50cy5pbnZhbGlkU2Vzc2lvbj8uKHRoaXMsIHJlc3VtYWJsZSlcblxuICAgICAgICAvLyBXZSBuZWVkIHRvIHdhaXQgZm9yIGEgcmFuZG9tIGFtb3VudCBvZiB0aW1lIGJldHdlZW4gMSBhbmQgNVxuICAgICAgICAvLyBSZWZlcmVuY2U6IGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3RvcGljcy9nYXRld2F5I3Jlc3VtaW5nXG4gICAgICAgIGF3YWl0IGRlbGF5KE1hdGguZmxvb3IoKE1hdGgucmFuZG9tKCkgKiA0ICsgMSkgKiAxMDAwKSlcblxuICAgICAgICB0aGlzLnJlc29sdmVzLmdldCgnSU5WQUxJRF9TRVNTSU9OJyk/LihwYWNrZXQpXG4gICAgICAgIHRoaXMucmVzb2x2ZXMuZGVsZXRlKCdJTlZBTElEX1NFU1NJT04nKVxuXG4gICAgICAgIC8vIFdoZW4gcmVzdW1hYmxlIGlzIGZhbHNlIHdlIG5lZWQgdG8gcmUtaWRlbnRpZnlcbiAgICAgICAgaWYgKCFyZXN1bWFibGUpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLnJlcXVlc3RJZGVudGlmeSgpXG5cbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVGhlIHNlc3Npb24gaXMgaW52YWxpZCBidXQgYXBwYXJlbnRseSBpdCBpcyByZXN1bWFibGVcbiAgICAgICAgYXdhaXQgdGhpcy5yZXN1bWUoKVxuXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfVxuXG4gICAgc3dpdGNoIChwYWNrZXQudCkge1xuICAgICAgY2FzZSAnUkVTVU1FRCc6XG4gICAgICAgIHRoaXMuc3RhdGUgPSBTaGFyZFN0YXRlLkNvbm5lY3RlZFxuICAgICAgICB0aGlzLmV2ZW50cy5yZXN1bWVkPy4odGhpcylcblxuICAgICAgICAvLyBDb250aW51ZSB0aGUgcmVxdWVzdHMgd2hpY2ggaGF2ZSBiZWVuIHF1ZXVlZCBzaW5jZSB0aGUgc2hhcmQgd2VudCBvZmZsaW5lLlxuICAgICAgICB0aGlzLm9mZmxpbmVTZW5kUXVldWUubWFwKChyZXNvbHZlKSA9PiByZXNvbHZlKCkpXG5cbiAgICAgICAgdGhpcy5yZXNvbHZlcy5nZXQoJ1JFU1VNRUQnKT8uKHBhY2tldClcbiAgICAgICAgdGhpcy5yZXNvbHZlcy5kZWxldGUoJ1JFU1VNRUQnKVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSAnUkVBRFknOiB7XG4gICAgICAgIC8vIEltcG9ydGFudCBmb3IgZnV0dXJlIHJlc3VtZXMuXG4gICAgICAgIGNvbnN0IHBheWxvYWQgPSBwYWNrZXQuZCBhcyBEaXNjb3JkUmVhZHlcblxuICAgICAgICB0aGlzLnJlc3VtZUdhdGV3YXlVcmwgPSBwYXlsb2FkLnJlc3VtZV9nYXRld2F5X3VybFxuXG4gICAgICAgIHRoaXMuc2Vzc2lvbklkID0gcGF5bG9hZC5zZXNzaW9uX2lkXG4gICAgICAgIHRoaXMuc3RhdGUgPSBTaGFyZFN0YXRlLkNvbm5lY3RlZFxuXG4gICAgICAgIC8vIENvbnRpbnVlIHRoZSByZXF1ZXN0cyB3aGljaCBoYXZlIGJlZW4gcXVldWVkIHNpbmNlIHRoZSBzaGFyZCB3ZW50IG9mZmxpbmUuXG4gICAgICAgIC8vIEltcG9ydGFudCB3aGVuIHRoaXMgaXMgYSByZS1pZGVudGlmeVxuICAgICAgICB0aGlzLm9mZmxpbmVTZW5kUXVldWUubWFwKChyZXNvbHZlKSA9PiByZXNvbHZlKCkpXG5cbiAgICAgICAgdGhpcy5yZXNvbHZlcy5nZXQoJ1JFQURZJyk/LihwYWNrZXQpXG4gICAgICAgIHRoaXMucmVzb2x2ZXMuZGVsZXRlKCdSRUFEWScpXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIHRoZSBzZXF1ZW5jZSBudW1iZXIgaWYgaXQgaXMgcHJlc2VudFxuICAgIC8vIGBzYCBjYW4gYmUgZWl0aGVyIGBudWxsYCBvciBhIGBudW1iZXJgLlxuICAgIC8vIEluIG9yZGVyIHRvIHByZXZlbnQgdXBkYXRlIG1pc3NlcyB3aGVuIGBzYCBpcyBgMGAgd2UgY2hlY2sgYWdhaW5zdCBudWxsLlxuICAgIGlmIChwYWNrZXQucyAhPT0gbnVsbCkge1xuICAgICAgdGhpcy5wcmV2aW91c1NlcXVlbmNlTnVtYmVyID0gcGFja2V0LnNcbiAgICB9XG5cbiAgICB0aGlzLmZvcndhcmRUb0JvdChwYWNrZXQpXG4gIH1cblxuICBmb3J3YXJkVG9Cb3QocGFja2V0OiBEaXNjb3JkR2F0ZXdheVBheWxvYWQpOiB2b2lkIHtcbiAgICAvLyBUaGUgbmVjZXNzYXJ5IGhhbmRsaW5nIHJlcXVpcmVkIGZvciB0aGUgU2hhcmRzIGNvbm5lY3Rpb24gaGFzIGJlZW4gZmluaXNoZWQuXG4gICAgLy8gTm93IHRoZSBldmVudCBjYW4gYmUgc2FmZWx5IGZvcndhcmRlZC5cbiAgICB0aGlzLmV2ZW50cy5tZXNzYWdlPy4odGhpcywgY2FtZWxpemUocGFja2V0KSlcbiAgfVxuXG4gIC8qKiBIYW5kbGUgYW4gaW5jb21pbmcgZ2F0ZXdheSBtZXNzYWdlLiAqL1xuICBhc3luYyBoYW5kbGVNZXNzYWdlKG1lc3NhZ2U6IE5vZGVXZWJTb2NrZXQuTWVzc2FnZUV2ZW50KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbGV0IHByZVByb2Nlc3NNZXNzYWdlID0gbWVzc2FnZS5kYXRhXG5cbiAgICAvLyBJZiBtZXNzYWdlIGNvbXByZXNzaW9uIGlzIGVuYWJsZWQsXG4gICAgLy8gRGlzY29yZCBtaWdodCBzZW5kIHpsaWIgY29tcHJlc3NlZCBwYXlsb2Fkcy5cbiAgICBpZiAodGhpcy5nYXRld2F5Q29uZmlnLmNvbXByZXNzICYmIHByZVByb2Nlc3NNZXNzYWdlIGluc3RhbmNlb2YgQmxvYikge1xuICAgICAgcHJlUHJvY2Vzc01lc3NhZ2UgPSBpbmZsYXRlU3luYyhhd2FpdCBwcmVQcm9jZXNzTWVzc2FnZS5hcnJheUJ1ZmZlcigpKS50b1N0cmluZygpXG4gICAgfVxuXG4gICAgLy8gU2FmZWd1YXJkIGluY2FzZSBkZWNvbXByZXNzaW9uIGZhaWxlZCB0byBtYWtlIGEgc3RyaW5nLlxuICAgIGlmICh0eXBlb2YgcHJlUHJvY2Vzc01lc3NhZ2UgIT09ICdzdHJpbmcnKSByZXR1cm5cblxuICAgIHJldHVybiBhd2FpdCB0aGlzLmhhbmRsZURpc2NvcmRQYWNrZXQoSlNPTi5wYXJzZShwcmVQcm9jZXNzTWVzc2FnZSkgYXMgRGlzY29yZEdhdGV3YXlQYXlsb2FkKVxuICB9XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIGluIG9yZGVyIHRvIG1ha2UgdGhlIHNoYXJkcyBwcmVzZW5jZS5cbiAgICogYXN5bmMgaW4gY2FzZSBkZXZzIGNyZWF0ZSB0aGUgcHJlc2VuY2UgYmFzZWQgb24gZWcuIGRhdGFiYXNlIHZhbHVlcy5cbiAgICogUGFzc2luZyB0aGUgc2hhcmQncyBpZCB0aGVyZSB0byBtYWtlIGl0IGVhc2llciBmb3IgdGhlIGRldiB0byB1c2UgdGhpcyBmdW5jdGlvbi5cbiAgICovXG4gIGFzeW5jIG1ha2VQcmVzZW5jZSgpOiBQcm9taXNlPEJvdFN0YXR1c1VwZGF0ZSB8IHVuZGVmaW5lZD4ge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2VsZXNzLXJldHVyblxuICAgIHJldHVyblxuICB9XG5cbiAgLyoqIFRoaXMgZnVuY3Rpb24gY29tbXVuaWNhdGVzIHdpdGggdGhlIG1hbmFnZW1lbnQgcHJvY2VzcywgaW4gb3JkZXIgdG8ga25vdyB3aGV0aGVyIGl0cyBmcmVlIHRvIGlkZW50aWZ5LiBXaGVuIHRoaXMgZnVuY3Rpb24gcmVzb2x2ZXMsIHRoaXMgbWVhbnMgdGhhdCB0aGUgc2hhcmQgaXMgYWxsb3dlZCB0byBzZW5kIGFuIGlkZW50aWZ5IHBheWxvYWQgdG8gZGlzY29yZC4gKi9cbiAgYXN5bmMgcmVxdWVzdElkZW50aWZ5KCk6IFByb21pc2U8dm9pZD4ge31cblxuICAvKiogVGhpcyBmdW5jdGlvbiBjb21tdW5pY2F0ZXMgd2l0aCB0aGUgbWFuYWdlbWVudCBwcm9jZXNzLCBpbiBvcmRlciB0byB0ZWxsIGl0IGNhbiBpZGVudGlmeSB0aGUgbmV4dCBzaGFyZC4gKi9cbiAgYXN5bmMgc2hhcmRJc1JlYWR5KCk6IFByb21pc2U8dm9pZD4ge31cblxuICAvKiogU3RhcnQgc2VuZGluZyBoZWFydGJlYXQgcGF5bG9hZHMgdG8gRGlzY29yZCBpbiB0aGUgcHJvdmlkZWQgaW50ZXJ2YWwuICovXG4gIHN0YXJ0SGVhcnRiZWF0aW5nKGludGVydmFsOiBudW1iZXIpOiB2b2lkIHtcbiAgICBsb2dnZXIuZGVidWcoYFtHYXRld2F5XSBTdGFydCBIZWFydGJlYXRpbmcgU2hhcmQgIyR7dGhpcy5pZH1gKVxuICAgIC8vIElmIG9sZCBoZWFydGJlYXN0IGV4aXN0IGxpa2UgYWZ0ZXIgcmVzdW1lLCBjbGVhciB0aGUgb2xkIG9uZXMuXG4gICAgaWYgKHRoaXMuaGVhcnQuaW50ZXJ2YWxJZCkgY2xlYXJJbnRlcnZhbCh0aGlzLmhlYXJ0LmludGVydmFsSWQpXG4gICAgaWYgKHRoaXMuaGVhcnQudGltZW91dElkKSBjbGVhclRpbWVvdXQodGhpcy5oZWFydC50aW1lb3V0SWQpXG5cbiAgICB0aGlzLmhlYXJ0LmludGVydmFsID0gaW50ZXJ2YWxcblxuICAgIC8vIE9ubHkgc2V0IHRoZSBzaGFyZCdzIHN0YXRlIHRvIGBVbmlkZW50aWZpZWRgXG4gICAgLy8gaWYgaGVhcnRiZWF0aW5nIGhhcyBub3QgYmVlbiBzdGFydGVkIGR1ZSB0byBhbiBpZGVudGlmeSBvciByZXN1bWUgYWN0aW9uLlxuICAgIGlmIChbU2hhcmRTdGF0ZS5EaXNjb25uZWN0ZWQsIFNoYXJkU3RhdGUuT2ZmbGluZV0uaW5jbHVkZXModGhpcy5zdGF0ZSkpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhgW0dhdGV3YXldIFN0YXJ0IEhlYXJ0YmVhdGluZyBTaGFyZCAjJHt0aGlzLmlkfSBhYClcbiAgICAgIHRoaXMuc3RhdGUgPSBTaGFyZFN0YXRlLlVuaWRlbnRpZmllZFxuICAgIH1cblxuICAgIC8vIFRoZSBmaXJzdCBoZWFydGJlYXQgbmVlZHMgdG8gYmUgc2VuZCB3aXRoIGEgcmFuZG9tIGRlbGF5IGJldHdlZW4gYDBgIGFuZCBgaW50ZXJ2YWxgXG4gICAgLy8gVXNpbmcgYSBgc2V0VGltZW91dChfLCBqaXR0ZXIpYCBoZXJlIHRvIGFjY29tcGxpc2ggdGhhdC5cbiAgICAvLyBgTWF0aC5yYW5kb20oKWAgY2FuIGJlIGAwYCBzbyB3ZSB1c2UgYDAuNWAgaWYgdGhpcyBoYXBwZW5zXG4gICAgLy8gUmVmZXJlbmNlOiBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy90b3BpY3MvZ2F0ZXdheSNoZWFydGJlYXRpbmdcbiAgICBjb25zdCBqaXR0ZXIgPSBNYXRoLmNlaWwodGhpcy5oZWFydC5pbnRlcnZhbCAqIChNYXRoLnJhbmRvbSgpIHx8IDAuNSkpXG4gICAgdGhpcy5oZWFydC50aW1lb3V0SWQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhgW0dhdGV3YXldIFN0YXJ0IEhlYXJ0YmVhdGluZyBTaGFyZCAjJHt0aGlzLmlkfSBiYClcbiAgICAgIGlmICghdGhpcy5pc09wZW4oKSkgcmV0dXJuXG4gICAgICBsb2dnZXIuZGVidWcoYFtHYXRld2F5XSBTdGFydCBIZWFydGJlYXRpbmcgU2hhcmQgIyR7dGhpcy5pZH0gYyAke3RoaXMucHJldmlvdXNTZXF1ZW5jZU51bWJlciF9YClcblxuICAgICAgLy8gVXNpbmcgYSBkaXJlY3Qgc29ja2V0LnNlbmQgY2FsbCBoZXJlIGJlY2F1c2UgaGVhcnRiZWF0IHJlcXVlc3RzIGFyZSByZXNlcnZlZCBieSB1cy5cbiAgICAgIHRoaXMuc29ja2V0Py5zZW5kKFxuICAgICAgICBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgb3A6IEdhdGV3YXlPcGNvZGVzLkhlYXJ0YmVhdCxcbiAgICAgICAgICBkOiB0aGlzLnByZXZpb3VzU2VxdWVuY2VOdW1iZXIsXG4gICAgICAgIH0pLFxuICAgICAgKVxuXG4gICAgICBsb2dnZXIuZGVidWcoYFtHYXRld2F5XSBTdGFydCBIZWFydGJlYXRpbmcgU2hhcmQgIyR7dGhpcy5pZH0gZGApXG4gICAgICB0aGlzLmhlYXJ0Lmxhc3RCZWF0ID0gRGF0ZS5ub3coKVxuICAgICAgdGhpcy5oZWFydC5hY2tub3dsZWRnZWQgPSBmYWxzZVxuXG4gICAgICAvLyBBZnRlciB0aGUgcmFuZG9tIGhlYXJ0YmVhdCBqaXR0ZXIgd2UgY2FuIHN0YXJ0IGEgbm9ybWFsIGludGVydmFsLlxuICAgICAgdGhpcy5oZWFydC5pbnRlcnZhbElkID0gc2V0SW50ZXJ2YWwoYXN5bmMgKCkgPT4ge1xuICAgICAgICBsb2dnZXIuZGVidWcoYFtHYXRld2F5XSBTdGFydCBIZWFydGJlYXRpbmcgU2hhcmQgIyR7dGhpcy5pZH0gZWApXG4gICAgICAgIGlmICghdGhpcy5pc09wZW4oKSkgcmV0dXJuXG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgW0dhdGV3YXldIFN0YXJ0IEhlYXJ0YmVhdGluZyBTaGFyZCAjJHt0aGlzLmlkfSBmYClcbiAgICAgICAgLy8gZ2F0ZXdheS5kZWJ1ZyhcIkdXIERFQlVHXCIsIGBSdW5uaW5nIHNldEludGVydmFsIGluIGhlYXJ0YmVhdCBmaWxlLiBTaGFyZDogJHtzaGFyZElkfWApO1xuXG4gICAgICAgIC8vIGdhdGV3YXkuZGVidWcoXCJHVyBIRUFSVEJFQVRJTkdcIiwgeyBzaGFyZElkLCBzaGFyZDogY3VycmVudFNoYXJkIH0pO1xuXG4gICAgICAgIC8vIFRoZSBTaGFyZCBkaWQgbm90IHJlY2VpdmUgYSBoZWFydGJlYXQgQUNLIGZyb20gRGlzY29yZCBpbiB0aW1lLFxuICAgICAgICAvLyB0aGVyZWZvcmUgd2UgaGF2ZSB0byBhc3N1bWUgdGhhdCB0aGUgY29ubmVjdGlvbiBoYXMgZmFpbGVkIG9yIGdvdCBcInpvbWJpZWRcIi5cbiAgICAgICAgLy8gVGhlIFNoYXJkIG5lZWRzIHRvIHN0YXJ0IGEgcmUtaWRlbnRpZnkgYWN0aW9uIGFjY29yZGluZ2x5LlxuICAgICAgICAvLyBSZWZlcmVuY2U6IGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3RvcGljcy9nYXRld2F5I2hlYXJ0YmVhdGluZy1leGFtcGxlLWdhdGV3YXktaGVhcnRiZWF0LWFja1xuICAgICAgICBpZiAoIXRoaXMuaGVhcnQuYWNrbm93bGVkZ2VkKSB7XG4gICAgICAgICAgbG9nZ2VyLmRlYnVnKGBbU2hhcmRdIEhlYXJ0YmVhdCBub3QgYWNrbm93bGVkZ2VkIGZvciBzaGFyZCAjJHt0aGlzLmlkfS5gKVxuICAgICAgICAgIHRoaXMuY2xvc2UoU2hhcmRTb2NrZXRDbG9zZUNvZGVzLlpvbWJpZWRDb25uZWN0aW9uLCAnWm9tYmllZCBjb25uZWN0aW9uLCBkaWQgbm90IHJlY2VpdmUgYW4gaGVhcnRiZWF0IEFDSyBpbiB0aW1lLicpXG5cbiAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5pZGVudGlmeSgpXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmhlYXJ0LmFja25vd2xlZGdlZCA9IGZhbHNlXG5cbiAgICAgICAgbG9nZ2VyLmRlYnVnKGBbR2F0ZXdheV0gU3RhcnQgSGVhcnRiZWF0aW5nIFNoYXJkICMke3RoaXMuaWR9IGdgKVxuICAgICAgICAvLyBVc2luZyBhIGRpcmVjdCBzb2NrZXQuc2VuZCBjYWxsIGhlcmUgYmVjYXVzZSBoZWFydGJlYXQgcmVxdWVzdHMgYXJlIHJlc2VydmVkIGJ5IHVzLlxuICAgICAgICB0aGlzLnNvY2tldD8uc2VuZChcbiAgICAgICAgICBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICBvcDogR2F0ZXdheU9wY29kZXMuSGVhcnRiZWF0LFxuICAgICAgICAgICAgZDogdGhpcy5wcmV2aW91c1NlcXVlbmNlTnVtYmVyLFxuICAgICAgICAgIH0pLFxuICAgICAgICApXG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgW0dhdGV3YXldIFN0YXJ0IEhlYXJ0YmVhdGluZyBTaGFyZCAjJHt0aGlzLmlkfSBoYClcblxuICAgICAgICB0aGlzLmhlYXJ0Lmxhc3RCZWF0ID0gRGF0ZS5ub3coKVxuXG4gICAgICAgIHRoaXMuZXZlbnRzLmhlYXJ0YmVhdD8uKHRoaXMpXG4gICAgICB9LCB0aGlzLmhlYXJ0LmludGVydmFsKVxuICAgIH0sIGppdHRlcilcbiAgfVxuXG4gIC8qKiBTdG9wIHRoZSBoZWFydGJlYXRpbmcgcHJvY2VzcyB3aXRoIGRpc2NvcmQuICovXG4gIHN0b3BIZWFydGJlYXRpbmcoKTogdm9pZCB7XG4gICAgLy8gQ2xlYXIgdGhlIHJlZ3VsYXIgaGVhcnRiZWF0IGludGVydmFsLlxuICAgIGNsZWFySW50ZXJ2YWwodGhpcy5oZWFydC5pbnRlcnZhbElkKVxuICAgIC8vIEl0J3MgcG9zc2libGUgdGhhdCB0aGUgU2hhcmQgZ290IGNsb3NlZCBiZWZvcmUgdGhlIGZpcnN0IGppdHRlcmVkIGhlYXJ0YmVhdC5cbiAgICAvLyBUbyBnbyBzYWZlIHdlIHNob3VsZCBjbGVhciB0aGUgcmVsYXRlZCB0aW1lb3V0IHRvby5cbiAgICBjbGVhclRpbWVvdXQodGhpcy5oZWFydC50aW1lb3V0SWQpXG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBTaGFyZENyZWF0ZU9wdGlvbnMge1xuICAvKiogVGhlIHNoYXJkIGlkICovXG4gIGlkOiBudW1iZXJcbiAgLyoqIFRoZSBjb25uZWN0aW9uIGRldGFpbHMgKi9cbiAgY29ubmVjdGlvbjogU2hhcmRHYXRld2F5Q29uZmlnXG4gIC8qKiBUaGUgZXZlbnQgaGFuZGxlcnMgZm9yIGV2ZW50cyBvbiB0aGUgc2hhcmQuICovXG4gIGV2ZW50czogU2hhcmRFdmVudHNcbiAgLyoqIFRoZSBoYW5kbGVyIHRvIHJlcXVlc3QgYSBzcGFjZSB0byBtYWtlIGFuIGlkZW50aWZ5IHJlcXVlc3QuICovXG4gIHJlcXVlc3RJZGVudGlmeT86ICgpID0+IFByb21pc2U8dm9pZD5cbiAgLyoqIFRoZSBoYW5kbGVyIHRvIGFsZXJ0IHRoZSBnYXRld2F5IG1hbmFnZXIgdGhhdCB0aGlzIHNoYXJkIGhhcyByZWNlaXZlZCBhIFJFQURZIGV2ZW50LiAqL1xuICBzaGFyZElzUmVhZHk/OiAoKSA9PiBQcm9taXNlPHZvaWQ+XG59XG5cbmV4cG9ydCBkZWZhdWx0IERpc2NvcmRlbm9TaGFyZFxuIl0sIm5hbWVzIjpbIkRpc2NvcmRlbm9TaGFyZCIsImNvbnN0cnVjdG9yIiwib3B0aW9ucyIsIm1heFJlcXVlc3RzUGVyUmF0ZUxpbWl0VGljayIsInByZXZpb3VzU2VxdWVuY2VOdW1iZXIiLCJyYXRlTGltaXRSZXNldEludGVydmFsIiwic3RhdGUiLCJTaGFyZFN0YXRlIiwiT2ZmbGluZSIsInJlc3VtZUdhdGV3YXlVcmwiLCJldmVudHMiLCJvZmZsaW5lU2VuZFF1ZXVlIiwicmVzb2x2ZXMiLCJNYXAiLCJpZCIsImNvbm5lY3Rpb24iLCJoZWFydCIsImFja25vd2xlZGdlZCIsImludGVydmFsIiwicmVxdWVzdElkZW50aWZ5Iiwic2hhcmRJc1JlYWR5IiwiYnVja2V0IiwiTGVha3lCdWNrZXQiLCJtYXgiLCJjYWxjdWxhdGVTYWZlUmVxdWVzdHMiLCJyZWZpbGxBbW91bnQiLCJyZWZpbGxJbnRlcnZhbCIsImdhdGV3YXlDb25maWciLCJjb25uZWN0aW9uVXJsIiwidXJsIiwic2FmZVJlcXVlc3RzIiwiTWF0aCIsImNlaWwiLCJjaGVja09mZmxpbmUiLCJoaWdoUHJpb3JpdHkiLCJpc09wZW4iLCJQcm9taXNlIiwicmVzb2x2ZSIsInVuc2hpZnQiLCJwdXNoIiwiY2xvc2UiLCJjb2RlIiwicmVhc29uIiwic29ja2V0IiwicmVhZHlTdGF0ZSIsIk5vZGVXZWJTb2NrZXQiLCJPUEVOIiwiY29ubmVjdCIsIklkZW50aWZ5aW5nIiwiUmVzdW1pbmciLCJpbmNsdWRlcyIsIkNvbm5lY3RpbmciLCJjb25uZWN0aW5nIiwiVVJMIiwic2VhcmNoUGFyYW1zIiwic2V0IiwidmVyc2lvbiIsInRvU3RyaW5nIiwiZ2xvYmFsVGhpcyIsIkRlbm8iLCJ1bmRlZmluZWQiLCJSZWZsZWN0IiwiaGFzIiwiV2ViU29ja2V0Iiwib25lcnJvciIsImV2ZW50IiwiY29uc29sZSIsImxvZyIsImVycm9yIiwic2hhcmRJZCIsIm9uY2xvc2UiLCJoYW5kbGVDbG9zZSIsIm9ubWVzc2FnZSIsIm1lc3NhZ2UiLCJoYW5kbGVNZXNzYWdlIiwib25vcGVuIiwiVW5pZGVudGlmaWVkIiwiY29ubmVjdGVkIiwiaWRlbnRpZnkiLCJsb2dnZXIiLCJkZWJ1ZyIsIlNoYXJkU29ja2V0Q2xvc2VDb2RlcyIsIlJlSWRlbnRpZnlpbmciLCJpZGVudGlmeWluZyIsInNlbmQiLCJvcCIsIkdhdGV3YXlPcGNvZGVzIiwiSWRlbnRpZnkiLCJkIiwidG9rZW4iLCJjb21wcmVzcyIsInByb3BlcnRpZXMiLCJpbnRlbnRzIiwic2hhcmQiLCJ0b3RhbFNoYXJkcyIsInByZXNlbmNlIiwibWFrZVByZXNlbmNlIiwiaWRlbnRpZmllZCIsImRlbGV0ZSIsInJlc3VtZSIsIlJlc3VtZUNsb3NpbmdPbGRDb25uZWN0aW9uIiwic2Vzc2lvbklkIiwiUmVzdW1lIiwic2Vzc2lvbl9pZCIsInNlcSIsImFjcXVpcmUiLCJKU09OIiwic3RyaW5naWZ5Iiwic2h1dGRvd24iLCJTaHV0ZG93biIsInN0b3BIZWFydGJlYXRpbmciLCJUZXN0aW5nRmluaXNoZWQiLCJkaXNjb25uZWN0ZWQiLCJSZXNoYXJkZWQiLCJab21iaWVkQ29ubmVjdGlvbiIsIkRpc2Nvbm5lY3RlZCIsIkdhdGV3YXlDbG9zZUV2ZW50Q29kZXMiLCJVbmtub3duT3Bjb2RlIiwiTm90QXV0aGVudGljYXRlZCIsIkludmFsaWRTZXEiLCJSYXRlTGltaXRlZCIsIlNlc3Npb25UaW1lZE91dCIsIkF1dGhlbnRpY2F0aW9uRmFpbGVkIiwiSW52YWxpZFNoYXJkIiwiU2hhcmRpbmdSZXF1aXJlZCIsIkludmFsaWRBcGlWZXJzaW9uIiwiSW52YWxpZEludGVudHMiLCJEaXNhbGxvd2VkSW50ZW50cyIsIkVycm9yIiwiVW5rbm93bkVycm9yIiwiRGVjb2RlRXJyb3IiLCJBbHJlYWR5QXV0aGVudGljYXRlZCIsImluZm8iLCJoYW5kbGVEaXNjb3JkUGFja2V0IiwicGFja2V0IiwibGFzdEFjayIsIkRhdGUiLCJub3ciLCJsYXN0QmVhdCIsInJ0dCIsIkhlYXJ0YmVhdCIsImhlYXJ0YmVhdCIsIkhlbGxvIiwiaGVhcnRiZWF0X2ludGVydmFsIiwic3RhcnRIZWFydGJlYXRpbmciLCJjdXJyZW50UXVldWUiLCJxdWV1ZSIsImhlbGxvIiwiSGVhcnRiZWF0QUNLIiwiaGVhcnRiZWF0QWNrIiwiUmVjb25uZWN0IiwicmVxdWVzdGVkUmVjb25uZWN0IiwiSW52YWxpZFNlc3Npb24iLCJyZXN1bWFibGUiLCJpbnZhbGlkU2Vzc2lvbiIsImRlbGF5IiwiZmxvb3IiLCJyYW5kb20iLCJnZXQiLCJ0IiwiQ29ubmVjdGVkIiwicmVzdW1lZCIsIm1hcCIsInBheWxvYWQiLCJyZXN1bWVfZ2F0ZXdheV91cmwiLCJzIiwiZm9yd2FyZFRvQm90IiwiY2FtZWxpemUiLCJwcmVQcm9jZXNzTWVzc2FnZSIsImRhdGEiLCJCbG9iIiwiaW5mbGF0ZVN5bmMiLCJhcnJheUJ1ZmZlciIsInBhcnNlIiwiaW50ZXJ2YWxJZCIsImNsZWFySW50ZXJ2YWwiLCJ0aW1lb3V0SWQiLCJjbGVhclRpbWVvdXQiLCJqaXR0ZXIiLCJzZXRUaW1lb3V0Iiwic2V0SW50ZXJ2YWwiXSwibWFwcGluZ3MiOiJBQUFBLGtFQUFrRTs7Ozs7Ozs7Ozs7SUFXckRBLGVBQWU7ZUFBZkE7O0lBNmtCYixPQUE4QjtlQUE5Qjs7O3VCQXRsQnVEO3VCQUNGOzBCQUN6QjsyREFDRjt3QkFFd0I7Ozs7OztBQUkzQyxJQUFBLEFBQU1BLGtCQUFOLE1BQU1BO0lBOEJYQyxZQUFZQyxPQUEyQixDQUFFO1FBdkJ6QywwSEFBMEgsUUFDMUhDLDhCQUFzQztRQUN0QywwQ0FBMEMsUUFDMUNDLHlCQUF3QztRQUN4Qyw0RUFBNEUsUUFDNUVDLHlCQUFpQztRQUtqQyx3Q0FBd0MsUUFDeENDLFFBQVFDLGtCQUFVLENBQUNDLE9BQU87UUFDMUIsaUZBQWlGLFFBQ2pGQyxtQkFBMkI7UUFDM0Isc0NBQXNDLFFBQ3RDQyxTQUFzQixDQUFDO1FBQ3ZCLG1HQUFtRyxRQUNuR0MsbUJBQWlELEVBQUU7UUFDbkQsaUZBQWlGLFFBQ2pGQyxXQUFXLElBQUlDO1FBS2IsSUFBSSxDQUFDQyxFQUFFLEdBQUdaLFFBQVFZLEVBQUU7UUFDcEIsSUFBSSxDQUFDQyxVQUFV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
488
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9TaGFyZC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpbmZsYXRlU3luYyB9IGZyb20gJ25vZGU6emxpYidcbmltcG9ydCB0eXBlIHsgRGlzY29yZEdhdGV3YXlQYXlsb2FkLCBEaXNjb3JkSGVsbG8sIERpc2NvcmRSZWFkeSB9IGZyb20gJ0BkaXNjb3JkZW5vL3R5cGVzJ1xuaW1wb3J0IHsgR2F0ZXdheUNsb3NlRXZlbnRDb2RlcywgR2F0ZXdheU9wY29kZXMgfSBmcm9tICdAZGlzY29yZGVuby90eXBlcydcbmltcG9ydCB7IExlYWt5QnVja2V0LCBjYW1lbGl6ZSwgZGVsYXksIGxvZ2dlciB9IGZyb20gJ0BkaXNjb3JkZW5vL3V0aWxzJ1xuaW1wb3J0IE5vZGVXZWJTb2NrZXQgZnJvbSAnd3MnXG5pbXBvcnQgdHlwZSB7IEJvdFN0YXR1c1VwZGF0ZSwgU2hhcmRFdmVudHMsIFNoYXJkR2F0ZXdheUNvbmZpZywgU2hhcmRIZWFydCwgU2hhcmRTb2NrZXRSZXF1ZXN0IH0gZnJvbSAnLi90eXBlcy5qcydcbmltcG9ydCB7IFNoYXJkU29ja2V0Q2xvc2VDb2RlcywgU2hhcmRTdGF0ZSB9IGZyb20gJy4vdHlwZXMuanMnXG5cbmRlY2xhcmUgbGV0IFdlYlNvY2tldDogYW55XG5cbmV4cG9ydCBjbGFzcyBEaXNjb3JkZW5vU2hhcmQge1xuICAvKiogVGhlIGlkIG9mIHRoZSBzaGFyZCAqL1xuICBpZDogbnVtYmVyXG4gIC8qKiBUaGUgY29ubmVjdGlvbiBjb25maWcgZGV0YWlscyB0aGF0IHRoaXMgc2hhcmQgd2lsbCB1c2VkIHRvIGNvbm5lY3QgdG8gZGlzY29yZC4gKi9cbiAgY29ubmVjdGlvbjogU2hhcmRHYXRld2F5Q29uZmlnXG4gIC8qKiBUaGlzIGNvbnRhaW5zIGFsbCB0aGUgaGVhcnRiZWF0IGluZm9ybWF0aW9uICovXG4gIGhlYXJ0OiBTaGFyZEhlYXJ0XG4gIC8qKiBUaGUgbWF4aW11bSBvZiByZXF1ZXN0cyB3aGljaCBjYW4gYmUgc2VuZCB0byBkaXNjb3JkIHBlciByYXRlIGxpbWl0IHRpY2suIFR5cGljYWxseSB0aGlzIHZhbHVlIHNob3VsZCBub3QgYmUgY2hhbmdlZC4gKi9cbiAgbWF4UmVxdWVzdHNQZXJSYXRlTGltaXRUaWNrOiBudW1iZXIgPSAxMjBcbiAgLyoqIFRoZSBwcmV2aW91cyBwYXlsb2FkIHNlcXVlbmNlIG51bWJlci4gKi9cbiAgcHJldmlvdXNTZXF1ZW5jZU51bWJlcjogbnVtYmVyIHwgbnVsbCA9IG51bGxcbiAgLyoqIEluIHdoaWNoIGludGVydmFsIChpbiBtaWxsaXNlY29uZHMpIHRoZSBnYXRld2F5IHJlc2V0cyBpdCdzIHJhdGUgbGltaXQuICovXG4gIHJhdGVMaW1pdFJlc2V0SW50ZXJ2YWw6IG51bWJlciA9IDYwMDAwXG4gIC8qKiBDdXJyZW50IHNlc3Npb24gaWQgb2YgdGhlIHNoYXJkIGlmIHByZXNlbnQuICovXG4gIHNlc3Npb25JZD86IHN0cmluZ1xuICAvKiogVGhpcyBjb250YWlucyB0aGUgV2ViU29ja2V0IGNvbm5lY3Rpb24gdG8gRGlzY29yZCwgaWYgY3VycmVudGx5IGNvbm5lY3RlZC4gKi9cbiAgc29ja2V0PzogTm9kZVdlYlNvY2tldFxuICAvKiogQ3VycmVudCBpbnRlcm5hbCBzdGF0ZSBvZiB0aGUgdGhpcy4gKi9cbiAgc3RhdGUgPSBTaGFyZFN0YXRlLk9mZmxpbmVcbiAgLyoqIFRoZSB1cmwgcHJvdmlkZWQgYnkgZGlzY29yZCB0byB1c2Ugd2hlbiByZXN1bWluZyBhIGNvbm5lY3Rpb24gZm9yIHRoaXMgdGhpcy4gKi9cbiAgcmVzdW1lR2F0ZXdheVVybDogc3RyaW5nID0gJydcbiAgLyoqIFRoZSBzaGFyZCByZWxhdGVkIGV2ZW50IGhhbmRsZXJzLiAqL1xuICBldmVudHM6IFNoYXJkRXZlbnRzID0ge31cbiAgLyoqIENhY2hlIGZvciBwZW5kaW5nIGdhdGV3YXkgcmVxdWVzdHMgd2hpY2ggc2hvdWxkIGhhdmUgYmVlbiBzZW5kIHdoaWxlIHRoZSBnYXRld2F5IHdlbnQgb2ZmbGluZS4gKi9cbiAgb2ZmbGluZVNlbmRRdWV1ZTogQXJyYXk8KF8/OiB1bmtub3duKSA9PiB2b2lkPiA9IFtdXG4gIC8qKiBSZXNvbHZlIGludGVybmFsIHdhaXRpbmcgc3RhdGVzLiBNYXBwZWQgYnkgU2VsZWN0ZWRFdmVudHMgPT4gUmVzb2x2ZUZ1bmN0aW9uICovXG4gIHJlc29sdmVzID0gbmV3IE1hcDwnUkVBRFknIHwgJ1JFU1VNRUQnIHwgJ0lOVkFMSURfU0VTU0lPTicsIChwYXlsb2FkOiBEaXNjb3JkR2F0ZXdheVBheWxvYWQpID0+IHZvaWQ+KClcbiAgLyoqIFNoYXJkIGJ1Y2tldC4gT25seSBhY2Nlc3MgdGhpcyBpZiB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcuIEJ1Y2tldCBmb3IgaGFuZGxpbmcgc2hhcmQgcmVxdWVzdCByYXRlIGxpbWl0cy4gKi9cbiAgYnVja2V0OiBMZWFreUJ1Y2tldFxuICAvKiogTG9nZ2VyIGZvciB0aGUgYnVja2V0ICovXG4gIGxvZ2dlcjogUGljazx0eXBlb2YgbG9nZ2VyLCAnZGVidWcnIHwgJ2luZm8nIHwgJ3dhcm4nIHwgJ2Vycm9yJyB8ICdmYXRhbCc+XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogU2hhcmRDcmVhdGVPcHRpb25zKSB7XG4gICAgdGhpcy5pZCA9IG9wdGlvbnMuaWRcbiAgICB0aGlzLmNvbm5lY3Rpb24gPSBvcHRpb25zLmNvbm5lY3Rpb25cbiAgICB0aGlzLmV2ZW50cyA9IG9wdGlvbnMuZXZlbnRzXG4gICAgdGhpcy5sb2dnZXIgPSBvcHRpb25zLmxvZ2dlciA/PyBsb2dnZXJcblxuICAgIHRoaXMuaGVhcnQgPSB7XG4gICAgICBhY2tub3dsZWRnZWQ6IGZhbHNlLFxuICAgICAgaW50ZXJ2YWw6IDQ1MDAwLFxuICAgIH1cblxuICAgIGlmIChvcHRpb25zLnJlcXVlc3RJZGVudGlmeSkgdGhpcy5yZXF1ZXN0SWRlbnRpZnkgPSBvcHRpb25zLnJlcXVlc3RJZGVudGlmeVxuICAgIGlmIChvcHRpb25zLnNoYXJkSXNSZWFkeSkgdGhpcy5zaGFyZElzUmVhZHkgPSBvcHRpb25zLnNoYXJkSXNSZWFkeVxuXG4gICAgdGhpcy5idWNrZXQgPSBuZXcgTGVha3lCdWNrZXQoe1xuICAgICAgbWF4OiB0aGlzLmNhbGN1bGF0ZVNhZmVSZXF1ZXN0cygpLFxuICAgICAgcmVmaWxsQW1vdW50OiB0aGlzLmNhbGN1bGF0ZVNhZmVSZXF1ZXN0cygpLFxuICAgICAgcmVmaWxsSW50ZXJ2YWw6IDYwMDAwLFxuICAgICAgbG9nZ2VyOiB0aGlzLmxvZ2dlcixcbiAgICB9KVxuICB9XG5cbiAgLyoqIFRoZSBnYXRld2F5IGNvbmZpZ3VyYXRpb24gd2hpY2ggaXMgdXNlZCB0byBjb25uZWN0IHRvIERpc2NvcmQuICovXG4gIGdldCBnYXRld2F5Q29uZmlnKCk6IFNoYXJkR2F0ZXdheUNvbmZpZyB7XG4gICAgcmV0dXJuIHRoaXMuY29ubmVjdGlvblxuICB9XG5cbiAgLyoqIFRoZSB1cmwgdG8gY29ubmVjdCB0by4gSW5pdGlhbGx5IHRoaXMgaXMgdGhlIGRpc2NvcmQgZ2F0ZXdheSB1cmwsIGFuZCB0aGVuIGlzIHN3aXRjaGVkIHRvIHJlc3VtZSBnYXRld2F5IHVybCBvbmNlIGEgUkVBRFkgaXMgcmVjZWl2ZWQuICovXG4gIGdldCBjb25uZWN0aW9uVXJsKCk6IHN0cmluZyB7XG4gICAgLy8gVXNlIHx8IGFuZCBub3QgPz8gaGVyZS4gPz8gd2lsbCBjYXVzZSBhIGJ1Zy5cbiAgICByZXR1cm4gdGhpcy5yZXN1bWVHYXRld2F5VXJsIHx8IHRoaXMuZ2F0ZXdheUNvbmZpZy51cmxcbiAgfVxuXG4gIC8qKiBDYWxjdWxhdGUgdGhlIGFtb3VudCBvZiByZXF1ZXN0cyB3aGljaCBjYW4gc2FmZWx5IGJlIG1hZGUgcGVyIHJhdGUgbGltaXQgaW50ZXJ2YWwsIGJlZm9yZSB0aGUgZ2F0ZXdheSBnZXRzIGRpc2Nvbm5lY3RlZCBkdWUgdG8gYW4gZXhjZWVkZWQgcmF0ZSBsaW1pdC4gKi9cbiAgY2FsY3VsYXRlU2FmZVJlcXVlc3RzKCk6IG51bWJlciB7XG4gICAgLy8gKiAyIGFkZHMgZXh0cmEgc2FmZXR5IGxheWVyIGZvciBkaXNjb3JkcyBPUCAxIHJlcXVlc3RzIHRoYXQgd2UgbmVlZCB0byByZXNwb25kIHRvXG4gICAgY29uc3Qgc2FmZVJlcXVlc3RzID0gdGhpcy5tYXhSZXF1ZXN0c1BlclJhdGVMaW1pdFRpY2sgLSBNYXRoLmNlaWwodGhpcy5yYXRlTGltaXRSZXNldEludGVydmFsIC8gdGhpcy5oZWFydC5pbnRlcnZhbCkgKiAyXG5cbiAgICByZXR1cm4gc2FmZVJlcXVlc3RzIDwgMCA/IDAgOiBzYWZlUmVxdWVzdHNcbiAgfVxuXG4gIGFzeW5jIGNoZWNrT2ZmbGluZShoaWdoUHJpb3JpdHk6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMuaXNPcGVuKCkpIHtcbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgIC8vIEhpZ2hlciBwcmlvcml0eSByZXF1ZXN0cyBnZXQgYWRkZWQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgYXJyYXkuXG4gICAgICAgIGlmIChoaWdoUHJpb3JpdHkpIHRoaXMub2ZmbGluZVNlbmRRdWV1ZS51bnNoaWZ0KHJlc29sdmUpXG4gICAgICAgIGVsc2UgdGhpcy5vZmZsaW5lU2VuZFF1ZXVlLnB1c2gocmVzb2x2ZSlcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgLyoqIENsb3NlIHRoZSBzb2NrZXQgY29ubmVjdGlvbiB0byBkaXNjb3JkIGlmIHByZXNlbnQuICovXG4gIGNsb3NlKGNvZGU6IG51bWJlciwgcmVhc29uOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zb2NrZXQ/LnJlYWR5U3RhdGUgIT09IE5vZGVXZWJTb2NrZXQuT1BFTikgcmV0dXJuXG5cbiAgICB0aGlzLnNvY2tldD8uY2xvc2UoY29kZSwgcmVhc29uKVxuICB9XG5cbiAgLyoqIENvbm5lY3QgdGhlIHNoYXJkIHdpdGggdGhlIGdhdGV3YXkgYW5kIHN0YXJ0IGhlYXJ0YmVhdGluZy4gVGhpcyB3aWxsIG5vdCBpZGVudGlmeSB0aGUgc2hhcmQgdG8gdGhlIGdhdGV3YXkuICovXG4gIGFzeW5jIGNvbm5lY3QoKTogUHJvbWlzZTxEaXNjb3JkZW5vU2hhcmQ+IHtcbiAgICAvLyBPbmx5IHNldCB0aGUgc2hhcmQgdG8gYENvbm5lY3RpbmdgIHN0YXRlLFxuICAgIC8vIGlmIHRoZSBjb25uZWN0aW9uIHJlcXVlc3QgZG9lcyBub3QgY29tZSBmcm9tIGFuIGlkZW50aWZ5IG9yIHJlc3VtZSBhY3Rpb24uXG4gICAgaWYgKCFbU2hhcmRTdGF0ZS5JZGVudGlmeWluZywgU2hhcmRTdGF0ZS5SZXN1bWluZ10uaW5jbHVkZXModGhpcy5zdGF0ZSkpIHtcbiAgICAgIHRoaXMuc3RhdGUgPSBTaGFyZFN0YXRlLkNvbm5lY3RpbmdcbiAgICB9XG4gICAgdGhpcy5ldmVudHMuY29ubmVjdGluZz8uKHRoaXMpXG5cbiAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHRoaXMuY29ubmVjdGlvblVybClcbiAgICB1cmwuc2VhcmNoUGFyYW1zLnNldCgndicsIHRoaXMuZ2F0ZXdheUNvbmZpZy52ZXJzaW9uLnRvU3RyaW5nKCkpXG4gICAgdXJsLnNlYXJjaFBhcmFtcy5zZXQoJ2VuY29kaW5nJywgJ2pzb24nKVxuXG4gICAgY29uc3Qgc29ja2V0OiBOb2RlV2ViU29ja2V0ID1cbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgRGVub1xuICAgICAgZ2xvYmFsVGhpcy5EZW5vICE9PSB1bmRlZmluZWQgJiYgUmVmbGVjdC5oYXMoZ2xvYmFsVGhpcywgJ0Rlbm8nKSA/IG5ldyBXZWJTb2NrZXQodXJsLnRvU3RyaW5nKCkpIDogbmV3IE5vZGVXZWJTb2NrZXQodXJsLnRvU3RyaW5nKCkpXG4gICAgdGhpcy5zb2NrZXQgPSBzb2NrZXRcblxuICAgIC8vIFRPRE86IHByb3BlciBldmVudCBoYW5kbGluZ1xuICAgIHNvY2tldC5vbmVycm9yID0gKGV2ZW50OiBOb2RlV2ViU29ja2V0LkVycm9yRXZlbnQpID0+IGNvbnNvbGUubG9nKHsgZXJyb3I6IGV2ZW50LCBzaGFyZElkOiB0aGlzLmlkIH0pXG4gICAgc29ja2V0Lm9uY2xvc2UgPSBhc3luYyAoZXZlbnQ6IE5vZGVXZWJTb2NrZXQuQ2xvc2VFdmVudCkgPT4gYXdhaXQgdGhpcy5oYW5kbGVDbG9zZShldmVudClcbiAgICBzb2NrZXQub25tZXNzYWdlID0gYXN5bmMgKG1lc3NhZ2U6IE5vZGVXZWJTb2NrZXQuTWVzc2FnZUV2ZW50KSA9PiBhd2FpdCB0aGlzLmhhbmRsZU1lc3NhZ2UobWVzc2FnZSlcblxuICAgIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgc29ja2V0Lm9ub3BlbiA9ICgpID0+IHtcbiAgICAgICAgLy8gT25seSBzZXQgdGhlIHNoYXJkIHRvIGBVbmlkZW50aWZpZWRgIHN0YXRlLFxuICAgICAgICAvLyBpZiB0aGUgY29ubmVjdGlvbiByZXF1ZXN0IGRvZXMgbm90IGNvbWUgZnJvbSBhbiBpZGVudGlmeSBvciByZXN1bWUgYWN0aW9uLlxuICAgICAgICBpZiAoIVtTaGFyZFN0YXRlLklkZW50aWZ5aW5nLCBTaGFyZFN0YXRlLlJlc3VtaW5nXS5pbmNsdWRlcyh0aGlzLnN0YXRlKSkge1xuICAgICAgICAgIHRoaXMuc3RhdGUgPSBTaGFyZFN0YXRlLlVuaWRlbnRpZmllZFxuICAgICAgICB9XG4gICAgICAgIHRoaXMuZXZlbnRzLmNvbm5lY3RlZD8uKHRoaXMpXG5cbiAgICAgICAgcmVzb2x2ZSh0aGlzKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKiogSWRlbnRpZnkgdGhlIHNoYXJkIHRvIHRoZSBnYXRld2F5LiBJZiBub3QgY29ubmVjdGVkLCB0aGlzIHdpbGwgYWxzbyBjb25uZWN0IHRoZSBzaGFyZCB0byB0aGUgZ2F0ZXdheS4gKi9cbiAgYXN5bmMgaWRlbnRpZnkoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gQSBuZXcgaWRlbnRpZnkgaGFzIGJlZW4gcmVxdWVzdGVkIGV2ZW4gdGhvdWdoIHRoZXJlIGlzIGFscmVhZHkgYSBjb25uZWN0aW9uIG9wZW4uXG4gICAgLy8gVGhlcmVmb3JlIHdlIG5lZWQgdG8gY2xvc2UgdGhlIG9sZCBjb25uZWN0aW9uIGFuZCBoZWFydGJlYXRpbmcgYmVmb3JlIGNyZWF0aW5nIGEgbmV3IG9uZS5cbiAgICBpZiAodGhpcy5pc09wZW4oKSkge1xuICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYENMT1NJTkcgRVhJU1RJTkcgU0hBUkQ6ICMke3RoaXMuaWR9YClcbiAgICAgIHRoaXMuY2xvc2UoU2hhcmRTb2NrZXRDbG9zZUNvZGVzLlJlSWRlbnRpZnlpbmcsICdSZS1pZGVudGlmeWluZyBjbG9zdXJlIG9mIG9sZCBjb25uZWN0aW9uLicpXG4gICAgfVxuXG4gICAgdGhpcy5zdGF0ZSA9IFNoYXJkU3RhdGUuSWRlbnRpZnlpbmdcbiAgICB0aGlzLmV2ZW50cy5pZGVudGlmeWluZz8uKHRoaXMpXG5cbiAgICAvLyBJdCBpcyBwb3NzaWJsZSB0aGF0IHRoZSBzaGFyZCBpcyBpbiBIZWFydGJlYXRpbmcgc3RhdGUgYnV0IG5vdCBpZGVudGlmaWVkLFxuICAgIC8vIHNvIGNoZWNrIHdoZXRoZXIgdGhlcmUgaXMgYWxyZWFkeSBhIGdhdGV3YXkgY29ubmVjdGlvbiBleGlzdGluZy5cbiAgICAvLyBJZiBub3Qgd2UgbmVlZCB0byBjcmVhdGUgb25lIGJlZm9yZSB3ZSBpZGVudGlmeS5cbiAgICBpZiAoIXRoaXMuaXNPcGVuKCkpIHtcbiAgICAgIGF3YWl0IHRoaXMuY29ubmVjdCgpXG4gICAgfVxuXG4gICAgdGhpcy5zZW5kKFxuICAgICAge1xuICAgICAgICBvcDogR2F0ZXdheU9wY29kZXMuSWRlbnRpZnksXG4gICAgICAgIGQ6IHtcbiAgICAgICAgICB0b2tlbjogYEJvdCAke3RoaXMuZ2F0ZXdheUNvbmZpZy50b2tlbn1gLFxuICAgICAgICAgIGNvbXByZXNzOiB0aGlzLmdhdGV3YXlDb25maWcuY29tcHJlc3MsXG4gICAgICAgICAgcHJvcGVydGllczogdGhpcy5nYXRld2F5Q29uZmlnLnByb3BlcnRpZXMsXG4gICAgICAgICAgaW50ZW50czogdGhpcy5nYXRld2F5Q29uZmlnLmludGVudHMsXG4gICAgICAgICAgc2hhcmQ6IFt0aGlzLmlkLCB0aGlzLmdhdGV3YXlDb25maWcudG90YWxTaGFyZHNdLFxuICAgICAgICAgIHByZXNlbmNlOiBhd2FpdCB0aGlzLm1ha2VQcmVzZW5jZT8uKCksXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgdHJ1ZSxcbiAgICApXG5cbiAgICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIHRoaXMucmVzb2x2ZXMuc2V0KCdSRUFEWScsICgpID0+IHtcbiAgICAgICAgdGhpcy5ldmVudHMuaWRlbnRpZmllZD8uKHRoaXMpXG4gICAgICAgIC8vIFRlbGxzIHRoZSBtYW5hZ2VyIHRoYXQgdGhpcyBzaGFyZCBpcyByZWFkeVxuICAgICAgICB0aGlzLnNoYXJkSXNSZWFkeSgpXG4gICAgICAgIHJlc29sdmUoKVxuICAgICAgfSlcbiAgICAgIC8vIFdoZW4gaWRlbnRpZnlpbmcgdG9vIGZhc3QsXG4gICAgICAvLyBEaXNjb3JkIHNlbmRzIGFuIGludmFsaWQgc2Vzc2lvbiBwYXlsb2FkLlxuICAgICAgLy8gVGhpcyBjYW4gc2FmZWx5IGJlIGlnbm9yZWQgdGhvdWdoIGFuZCB0aGUgc2hhcmQgc3RhcnRzIGEgbmV3IGlkZW50aWZ5IGFjdGlvbi5cbiAgICAgIHRoaXMucmVzb2x2ZXMuc2V0KCdJTlZBTElEX1NFU1NJT04nLCAoKSA9PiB7XG4gICAgICAgIHRoaXMucmVzb2x2ZXMuZGVsZXRlKCdSRUFEWScpXG4gICAgICAgIHJlc29sdmUoKVxuICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgLyoqIENoZWNrIHdoZXRoZXIgdGhlIGNvbm5lY3Rpb24gdG8gRGlzY29yZCBpcyBjdXJyZW50bHkgb3Blbi4gKi9cbiAgaXNPcGVuKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNvY2tldD8ucmVhZHlTdGF0ZSA9PT0gTm9kZVdlYlNvY2tldC5PUEVOXG4gIH1cblxuICAvKiogQXR0ZW1wdCB0byByZXN1bWUgdGhlIHByZXZpb3VzIHNoYXJkcyBzZXNzaW9uIHdpdGggdGhlIGdhdGV3YXkuICovXG4gIGFzeW5jIHJlc3VtZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgW0dhdGV3YXldIFJlc3VtaW5nIFNoYXJkICMke3RoaXMuaWR9YClcbiAgICAvLyBJdCBoYXMgYmVlbiByZXF1ZXN0ZWQgdG8gcmVzdW1lIHRoZSBTaGFyZHMgc2Vzc2lvbi5cbiAgICAvLyBJdCdzIHBvc3NpYmxlIHRoYXQgdGhlIHNoYXJkIGlzIHN0aWxsIGNvbm5lY3RlZCB3aXRoIERpc2NvcmQncyBnYXRld2F5IHRoZXJlZm9yZSB3ZSBuZWVkIHRvIGZvcmNlZnVsbHkgY2xvc2UgaXQuXG4gICAgaWYgKHRoaXMuaXNPcGVuKCkpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBbR2F0ZXdheV0gUmVzdW1pbmcgU2hhcmQgIyR7dGhpcy5pZH0gaW4gaXNPcGVuYClcbiAgICAgIHRoaXMuY2xvc2UoU2hhcmRTb2NrZXRDbG9zZUNvZGVzLlJlc3VtZUNsb3NpbmdPbGRDb25uZWN0aW9uLCAnUmVjb25uZWN0aW5nIHRoZSBzaGFyZCwgY2xvc2luZyBvbGQgY29ubmVjdGlvbi4nKVxuICAgIH1cblxuICAgIC8vIFNoYXJkIGhhcyBuZXZlciBpZGVudGlmaWVkLCBzbyB3ZSBjYW5ub3QgcmVzdW1lLlxuICAgIGlmICghdGhpcy5zZXNzaW9uSWQpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBbU2hhcmRdIFRyeWluZyB0byByZXN1bWUgYSBzaGFyZCAjJHt0aGlzLmlkfSB0aGF0IHdhcyBOT1QgZmlyc3QgaWRlbnRpZmllZC4gKE5vIHNlc3Npb24gaWQgZm91bmQpYClcblxuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuaWRlbnRpZnkoKVxuICAgIH1cblxuICAgIHRoaXMuc3RhdGUgPSBTaGFyZFN0YXRlLlJlc3VtaW5nXG5cbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgW0dhdGV3YXldIFJlc3VtaW5nIFNoYXJkICMke3RoaXMuaWR9LCBiZWZvcmUgY29ubmVjdGluZ2ApXG4gICAgLy8gQmVmb3JlIHdlIGNhbiByZXN1bWUsIHdlIG5lZWQgdG8gY3JlYXRlIGEgbmV3IGNvbm5lY3Rpb24gd2l0aCBEaXNjb3JkJ3MgZ2F0ZXdheS5cbiAgICBhd2FpdCB0aGlzLmNvbm5lY3QoKVxuICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBbR2F0ZXdheV0gUmVzdW1pbmcgU2hhcmQgIyR7dGhpcy5pZH0sIGFmdGVyIGNvbm5lY3RpbmcuICR7dGhpcy5zZXNzaW9uSWR9IHwgJHt0aGlzLnByZXZpb3VzU2VxdWVuY2VOdW1iZXJ9YClcblxuICAgIHRoaXMuc2VuZChcbiAgICAgIHtcbiAgICAgICAgb3A6IEdhdGV3YXlPcGNvZGVzLlJlc3VtZSxcbiAgICAgICAgZDoge1xuICAgICAgICAgIHRva2VuOiBgQm90ICR7dGhpcy5nYXRld2F5Q29uZmlnLnRva2VufWAsXG4gICAgICAgICAgc2Vzc2lvbl9pZDogdGhpcy5zZXNzaW9uSWQsXG4gICAgICAgICAgc2VxOiB0aGlzLnByZXZpb3VzU2VxdWVuY2VOdW1iZXIgPz8gMCxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB0cnVlLFxuICAgIClcbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgW0dhdGV3YXldIFJlc3VtaW5nIFNoYXJkICMke3RoaXMuaWR9IGFmdGVyIHNlbmQgcmVzdW1nYClcblxuICAgIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgdGhpcy5yZXNvbHZlcy5zZXQoJ1JFU1VNRUQnLCAoKSA9PiByZXNvbHZlKCkpXG4gICAgICAvLyBJZiBpdCBpcyBhdHRlbXB0ZWQgdG8gcmVzdW1lIHdpdGggYW4gaW52YWxpZCBzZXNzaW9uIGlkLFxuICAgICAgLy8gRGlzY29yZCBzZW5kcyBhbiBpbnZhbGlkIHNlc3Npb24gcGF5bG9hZFxuICAgICAgLy8gTm90IGVycm9yaW5nIGhlcmUgc2luY2UgaXQgaXMgZWFzeSB0aGF0IHRoaXMgaGFwcGVucywgYWxzbyBpdCB3b3VsZCBiZSBub3QgY2F0Y2hhYmxlXG4gICAgICB0aGlzLnJlc29sdmVzLnNldCgnSU5WQUxJRF9TRVNTSU9OJywgKCkgPT4ge1xuICAgICAgICB0aGlzLnJlc29sdmVzLmRlbGV0ZSgnUkVTVU1FRCcpXG4gICAgICAgIHJlc29sdmUoKVxuICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgLyoqIFNlbmQgYSBtZXNzYWdlIHRvIERpc2NvcmQuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2hpZ2hQcmlvcml0eT1mYWxzZV0gLSBXaGV0aGVyIHRoaXMgbWVzc2FnZSBzaG91bGQgYmUgc2VuZCBhc2FwLlxuICAgKi9cbiAgYXN5bmMgc2VuZChtZXNzYWdlOiBTaGFyZFNvY2tldFJlcXVlc3QsIGhpZ2hQcmlvcml0eTogYm9vbGVhbiA9IGZhbHNlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gQmVmb3JlIGFjcXVpcmluZyBhIHRva2VuIGZyb20gdGhlIGJ1Y2tldCwgY2hlY2sgd2hldGhlciB0aGUgc2hhcmQgaXMgY3VycmVudGx5IG9mZmxpbmUgb3Igbm90LlxuICAgIC8vIEVsc2UgYnVja2V0IGFuZCB0b2tlbiB3YWl0IHRpbWUganVzdCBnZXQgd2FzdGVkLlxuICAgIGF3YWl0IHRoaXMuY2hlY2tPZmZsaW5lKGhpZ2hQcmlvcml0eSlcblxuICAgIGF3YWl0IHRoaXMuYnVja2V0LmFjcXVpcmUoaGlnaFByaW9yaXR5KVxuXG4gICAgLy8gSXQncyBwb3NzaWJsZSwgdGhhdCB0aGUgc2hhcmQgd2VudCBvZmZsaW5lIGFmdGVyIGEgdG9rZW4gaGFzIGJlZW4gYWNxdWlyZWQgZnJvbSB0aGUgYnVja2V0LlxuICAgIGF3YWl0IHRoaXMuY2hlY2tPZmZsaW5lKGhpZ2hQcmlvcml0eSlcblxuICAgIHRoaXMuc29ja2V0Py5zZW5kKEpTT04uc3RyaW5naWZ5KG1lc3NhZ2UpKVxuICB9XG5cbiAgLyoqIFNodXRkb3duIHRoZSB0aGlzLiBGb3JjZWZ1bGx5IGRpc2Nvbm5lY3QgdGhlIHNoYXJkIGZyb20gRGlzY29yZC4gVGhlIHNoYXJkIG1heSBub3QgYXR0ZW1wdCB0byByZWNvbm5lY3Qgd2l0aCBEaXNjb3JkLiAqL1xuICBhc3luYyBzaHV0ZG93bigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmNsb3NlKFNoYXJkU29ja2V0Q2xvc2VDb2Rlcy5TaHV0ZG93biwgJ1NoYXJkIHNodXR0aW5nIGRvd24uJylcbiAgICB0aGlzLnN0YXRlID0gU2hhcmRTdGF0ZS5PZmZsaW5lXG4gIH1cblxuICAvKiogSGFuZGxlIGEgZ2F0ZXdheSBjb25uZWN0aW9uIGNsb3NlLiAqL1xuICBhc3luYyBoYW5kbGVDbG9zZShjbG9zZTogTm9kZVdlYlNvY2tldC5DbG9zZUV2ZW50KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gICBnYXRld2F5LmRlYnVnKFwiR1cgQ0xPU0VEXCIsIHsgc2hhcmRJZCwgcGF5bG9hZDogZXZlbnQgfSk7XG5cbiAgICB0aGlzLnN0b3BIZWFydGJlYXRpbmcoKVxuICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBbU2hhcmRdIEdhdGV3YXkgY29ubmVjdGlvbiBjbG9zZWQgd2l0aCBjb2RlICR7Y2xvc2UuY29kZX0uYClcblxuICAgIHN3aXRjaCAoY2xvc2UuY29kZSkge1xuICAgICAgY2FzZSBTaGFyZFNvY2tldENsb3NlQ29kZXMuVGVzdGluZ0ZpbmlzaGVkOiB7XG4gICAgICAgIHRoaXMuc3RhdGUgPSBTaGFyZFN0YXRlLk9mZmxpbmVcbiAgICAgICAgdGhpcy5ldmVudHMuZGlzY29ubmVjdGVkPy4odGhpcylcblxuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIC8vIE9uIHRoZXNlIGNvZGVzIGEgbWFudWFsIHN0YXJ0IHdpbGwgYmUgZG9uZS5cbiAgICAgIGNhc2UgU2hhcmRTb2NrZXRDbG9zZUNvZGVzLlNodXRkb3duOlxuICAgICAgY2FzZSBTaGFyZFNvY2tldENsb3NlQ29kZXMuUmVJZGVudGlmeWluZzpcbiAgICAgIGNhc2UgU2hhcmRTb2NrZXRDbG9zZUNvZGVzLlJlc2hhcmRlZDpcbiAgICAgIGNhc2UgU2hhcmRTb2NrZXRDbG9zZUNvZGVzLlJlc3VtZUNsb3NpbmdPbGRDb25uZWN0aW9uOlxuICAgICAgY2FzZSBTaGFyZFNvY2tldENsb3NlQ29kZXMuWm9tYmllZENvbm5lY3Rpb246IHtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IFNoYXJkU3RhdGUuRGlzY29ubmVjdGVkXG4gICAgICAgIHRoaXMuZXZlbnRzLmRpc2Nvbm5lY3RlZD8uKHRoaXMpXG5cbiAgICAgICAgLy8gZ2F0ZXdheS5kZWJ1ZyhcIkdXIENMT1NFRF9SRUNPTk5FQ1RcIiwgeyBzaGFyZElkLCBwYXlsb2FkOiBldmVudCB9KTtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICAvLyBHYXRld2F5IGNvbm5lY3Rpb24gY2xvc2VzIHdoaWNoIHJlcXVpcmUgYSBuZXcgaWRlbnRpZnkuXG4gICAgICBjYXNlIEdhdGV3YXlDbG9zZUV2ZW50Q29kZXMuVW5rbm93bk9wY29kZTpcbiAgICAgIGNhc2UgR2F0ZXdheUNsb3NlRXZlbnRDb2Rlcy5Ob3RBdXRoZW50aWNhdGVkOlxuICAgICAgY2FzZSBHYXRld2F5Q2xvc2VFdmVudENvZGVzLkludmFsaWRTZXE6XG4gICAgICBjYXNlIEdhdGV3YXlDbG9zZUV2ZW50Q29kZXMuUmF0ZUxpbWl0ZWQ6XG4gICAgICBjYXNlIEdhdGV3YXlDbG9zZUV2ZW50Q29kZXMuU2Vzc2lvblRpbWVkT3V0OiB7XG4gICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdbU2hhcmRdIEdhdGV3YXkgY29ubmVjdGlvbiBjbG9zaW5nIHJlcXVpcmluZyByZS1pZGVudGlmeS4nKVxuICAgICAgICB0aGlzLnN0YXRlID0gU2hhcmRTdGF0ZS5JZGVudGlmeWluZ1xuICAgICAgICB0aGlzLmV2ZW50cy5kaXNjb25uZWN0ZWQ/Lih0aGlzKVxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmlkZW50aWZ5KClcbiAgICAgIH1cbiAgICAgIC8vIFdoZW4gdGhlc2UgY29kZXMgYXJlIHJlY2VpdmVkIHNvbWV0aGluZyB3ZW50IHJlYWxseSB3cm9uZy5cbiAgICAgIC8vIE9uIHRob3NlIHdlIGNhbm5vdCBzdGFydCBhIHJlY29ubmVjdCBhdHRlbXB0LlxuICAgICAgY2FzZSBHYXRld2F5Q2xvc2VFdmVudENvZGVzLkF1dGhlbnRpY2F0aW9uRmFpbGVkOlxuICAgICAgY2FzZSBHYXRld2F5Q2xvc2VFdmVudENvZGVzLkludmFsaWRTaGFyZDpcbiAgICAgIGNhc2UgR2F0ZXdheUNsb3NlRXZlbnRDb2Rlcy5TaGFyZGluZ1JlcXVpcmVkOlxuICAgICAgY2FzZSBHYXRld2F5Q2xvc2VFdmVudENvZGVzLkludmFsaWRBcGlWZXJzaW9uOlxuICAgICAgY2FzZSBHYXRld2F5Q2xvc2VFdmVudENvZGVzLkludmFsaWRJbnRlbnRzOlxuICAgICAgY2FzZSBHYXRld2F5Q2xvc2VFdmVudENvZGVzLkRpc2FsbG93ZWRJbnRlbnRzOiB7XG4gICAgICAgIHRoaXMuc3RhdGUgPSBTaGFyZFN0YXRlLk9mZmxpbmVcbiAgICAgICAgdGhpcy5ldmVudHMuZGlzY29ubmVjdGVkPy4odGhpcylcblxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoY2xvc2UucmVhc29uIHx8ICdEaXNjb3JkIGdhdmUgbm8gcmVhc29uISBHRyEgWW91IGJyb2tlIERpc2NvcmQhJylcbiAgICAgIH1cbiAgICAgIC8vIEdhdGV3YXkgY29ubmVjdGlvbiBjbG9zZXMgb24gd2hpY2ggYSByZXN1bWUgaXMgYWxsb3dlZC5cbiAgICAgIGNhc2UgR2F0ZXdheUNsb3NlRXZlbnRDb2Rlcy5Vbmtub3duRXJyb3I6XG4gICAgICBjYXNlIEdhdGV3YXlDbG9zZUV2ZW50Q29kZXMuRGVjb2RlRXJyb3I6XG4gICAgICBjYXNlIEdhdGV3YXlDbG9zZUV2ZW50Q29kZXMuQWxyZWFkeUF1dGhlbnRpY2F0ZWQ6XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIHRoaXMubG9nZ2VyLmluZm8oYFtTaGFyZF0gQ2xvc2VkIHNoYXJkICMke3RoaXMuaWR9IHdpdGggY29kZSAke2Nsb3NlLmNvZGV9LiBBdHRlbXB0aW5nIHRvIHJlc3VtZS4uLmApXG4gICAgICAgIHRoaXMuc3RhdGUgPSBTaGFyZFN0YXRlLlJlc3VtaW5nXG4gICAgICAgIHRoaXMuZXZlbnRzLmRpc2Nvbm5lY3RlZD8uKHRoaXMpXG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMucmVzdW1lKClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKiogSGFuZGxlcyBhIGluY29taW5nIGdhdGV3YXkgcGFja2V0LiAqL1xuICBhc3luYyBoYW5kbGVEaXNjb3JkUGFja2V0KHBhY2tldDogRGlzY29yZEdhdGV3YXlQYXlsb2FkKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gRWRnZSBjYXNlIHN0YXJ0OiBodHRwczovL2dpdGh1Yi5jb20vZGlzY29yZGVuby9kaXNjb3JkZW5vL2lzc3Vlcy8yMzExXG4gICAgdGhpcy5oZWFydC5sYXN0QWNrID0gRGF0ZS5ub3coKVxuICAgIHRoaXMuaGVhcnQuYWNrbm93bGVkZ2VkID0gdHJ1ZVxuICAgIC8vIEVkZ2UgY2FzZSBlbmQhXG5cbiAgICBzd2l0Y2ggKHBhY2tldC5vcCkge1xuICAgICAgY2FzZSBHYXRld2F5T3Bjb2Rlcy5IZWFydGJlYXQ6IHtcbiAgICAgICAgLy8gVE9ETzogY2FuIHRoaXMgYWN0dWFsbHkgaGFwcGVuXG4gICAgICAgIGlmICghdGhpcy5pc09wZW4oKSkgcmV0dXJuXG5cbiAgICAgICAgdGhpcy5oZWFydC5sYXN0QmVhdCA9IERhdGUubm93KClcbiAgICAgICAgLy8gRGlzY29yZCByYW5kb21seSBzZW5kcyB0aGlzIHJlcXVpcmluZyBhbiBpbW1lZGlhdGUgaGVhcnRiZWF0IGJhY2suXG4gICAgICAgIC8vIFVzaW5nIGEgZGlyZWN0IHNvY2tldC5zZW5kIGNhbGwgaGVyZSBiZWNhdXNlIGhlYXJ0YmVhdCByZXF1ZXN0cyBhcmUgcmVzZXJ2ZWQgYnkgdXMuXG4gICAgICAgIHRoaXMuc29ja2V0Py5zZW5kKFxuICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgIG9wOiBHYXRld2F5T3Bjb2Rlcy5IZWFydGJlYXQsXG4gICAgICAgICAgICBkOiB0aGlzLnByZXZpb3VzU2VxdWVuY2VOdW1iZXIsXG4gICAgICAgICAgfSksXG4gICAgICAgIClcbiAgICAgICAgdGhpcy5ldmVudHMuaGVhcnRiZWF0Py4odGhpcylcblxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgICAgY2FzZSBHYXRld2F5T3Bjb2Rlcy5IZWxsbzoge1xuICAgICAgICBjb25zdCBpbnRlcnZhbCA9IChwYWNrZXQuZCBhcyBEaXNjb3JkSGVsbG8pLmhlYXJ0YmVhdF9pbnRlcnZhbFxuICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgW0dhdGV3YXldIEhlbGxvIG9uIFNoYXJkICMke3RoaXMuaWR9YClcbiAgICAgICAgdGhpcy5zdGFydEhlYXJ0YmVhdGluZyhpbnRlcnZhbClcblxuICAgICAgICBpZiAodGhpcy5zdGF0ZSAhPT0gU2hhcmRTdGF0ZS5SZXN1bWluZykge1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRRdWV1ZSA9IFsuLi50aGlzLmJ1Y2tldC5xdWV1ZV1cbiAgICAgICAgICAvLyBIRUxMTyBoYXMgYmVlbiBzZW5kIG9uIGEgbm9uIHJlc3VtZSBhY3Rpb24uXG4gICAgICAgICAgLy8gVGhpcyBtZWFucyB0aGF0IHRoZSBzaGFyZCBzdGFydHMgYSBuZXcgc2Vzc2lvbixcbiAgICAgICAgICAvLyB0aGVyZWZvcmUgdGhlIHJhdGUgbGltaXQgaW50ZXJ2YWwgaGFzIGJlZW4gcmVzZXQgdG9vLlxuICAgICAgICAgIHRoaXMuYnVja2V0ID0gbmV3IExlYWt5QnVja2V0KHtcbiAgICAgICAgICAgIG1heDogdGhpcy5jYWxjdWxhdGVTYWZlUmVxdWVzdHMoKSxcbiAgICAgICAgICAgIHJlZmlsbEludGVydmFsOiA2MDAwMCxcbiAgICAgICAgICAgIHJlZmlsbEFtb3VudDogdGhpcy5jYWxjdWxhdGVTYWZlUmVxdWVzdHMoKSxcbiAgICAgICAgICB9KVxuXG4gICAgICAgICAgLy8gUXVldWUgc2hvdWxkIG5vdCBiZSBsb3N0IG9uIGEgcmUtaWRlbnRpZnkuXG4gICAgICAgICAgdGhpcy5idWNrZXQucXVldWUudW5zaGlmdCguLi5jdXJyZW50UXVldWUpXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmV2ZW50cy5oZWxsbz8uKHRoaXMpXG5cbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICAgIGNhc2UgR2F0ZXdheU9wY29kZXMuSGVhcnRiZWF0QUNLOiB7XG4gICAgICAgIC8vIE1hbnVhbGx5IGNhbGN1bGF0aW5nIHRoZSByb3VuZCB0cmlwIHRpbWUgZm9yIHVzZXJzIHdobyBuZWVkIGl0LlxuICAgICAgICBpZiAodGhpcy5oZWFydC5sYXN0QmVhdCkge1xuICAgICAgICAgIHRoaXMuaGVhcnQucnR0ID0gdGhpcy5oZWFydC5sYXN0QWNrIC0gdGhpcy5oZWFydC5sYXN0QmVhdFxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5ldmVudHMuaGVhcnRiZWF0QWNrPy4odGhpcylcblxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgICAgY2FzZSBHYXRld2F5T3Bjb2Rlcy5SZWNvbm5lY3Q6IHtcbiAgICAgICAgLy8gICBnYXRld2F5LmRlYnVnKFwiR1cgUkVDT05ORUNUXCIsIHsgc2hhcmRJZCB9KTtcblxuICAgICAgICB0aGlzLmV2ZW50cy5yZXF1ZXN0ZWRSZWNvbm5lY3Q/Lih0aGlzKVxuXG4gICAgICAgIGF3YWl0IHRoaXMucmVzdW1lKClcblxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgICAgY2FzZSBHYXRld2F5T3Bjb2Rlcy5JbnZhbGlkU2Vzc2lvbjoge1xuICAgICAgICBjb25zdCByZXN1bWFibGUgPSBwYWNrZXQuZCBhcyBib29sZWFuXG4gICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBbU2hhcmRdIFJlY2VpdmVkIEludmFsaWQgU2Vzc2lvbiBmb3IgU2hhcmQgIyR7dGhpcy5pZH0gd2l0aCByZXN1bWVhYmxlIGFzICR7cmVzdW1hYmxlLnRvU3RyaW5nKCl9YClcblxuICAgICAgICB0aGlzLmV2ZW50cy5pbnZhbGlkU2Vzc2lvbj8uKHRoaXMsIHJlc3VtYWJsZSlcblxuICAgICAgICAvLyBXZSBuZWVkIHRvIHdhaXQgZm9yIGEgcmFuZG9tIGFtb3VudCBvZiB0aW1lIGJldHdlZW4gMSBhbmQgNVxuICAgICAgICAvLyBSZWZlcmVuY2U6IGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3RvcGljcy9nYXRld2F5I3Jlc3VtaW5nXG4gICAgICAgIGF3YWl0IGRlbGF5KE1hdGguZmxvb3IoKE1hdGgucmFuZG9tKCkgKiA0ICsgMSkgKiAxMDAwKSlcblxuICAgICAgICB0aGlzLnJlc29sdmVzLmdldCgnSU5WQUxJRF9TRVNTSU9OJyk/LihwYWNrZXQpXG4gICAgICAgIHRoaXMucmVzb2x2ZXMuZGVsZXRlKCdJTlZBTElEX1NFU1NJT04nKVxuXG4gICAgICAgIC8vIFdoZW4gcmVzdW1hYmxlIGlzIGZhbHNlIHdlIG5lZWQgdG8gcmUtaWRlbnRpZnlcbiAgICAgICAgaWYgKCFyZXN1bWFibGUpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLnJlcXVlc3RJZGVudGlmeSgpXG5cbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVGhlIHNlc3Npb24gaXMgaW52YWxpZCBidXQgYXBwYXJlbnRseSBpdCBpcyByZXN1bWFibGVcbiAgICAgICAgYXdhaXQgdGhpcy5yZXN1bWUoKVxuXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfVxuXG4gICAgc3dpdGNoIChwYWNrZXQudCkge1xuICAgICAgY2FzZSAnUkVTVU1FRCc6XG4gICAgICAgIHRoaXMuc3RhdGUgPSBTaGFyZFN0YXRlLkNvbm5lY3RlZFxuICAgICAgICB0aGlzLmV2ZW50cy5yZXN1bWVkPy4odGhpcylcblxuICAgICAgICAvLyBDb250aW51ZSB0aGUgcmVxdWVzdHMgd2hpY2ggaGF2ZSBiZWVuIHF1ZXVlZCBzaW5jZSB0aGUgc2hhcmQgd2VudCBvZmZsaW5lLlxuICAgICAgICB0aGlzLm9mZmxpbmVTZW5kUXVldWUubWFwKChyZXNvbHZlKSA9PiByZXNvbHZlKCkpXG5cbiAgICAgICAgdGhpcy5yZXNvbHZlcy5nZXQoJ1JFU1VNRUQnKT8uKHBhY2tldClcbiAgICAgICAgdGhpcy5yZXNvbHZlcy5kZWxldGUoJ1JFU1VNRUQnKVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSAnUkVBRFknOiB7XG4gICAgICAgIC8vIEltcG9ydGFudCBmb3IgZnV0dXJlIHJlc3VtZXMuXG4gICAgICAgIGNvbnN0IHBheWxvYWQgPSBwYWNrZXQuZCBhcyBEaXNjb3JkUmVhZHlcblxuICAgICAgICB0aGlzLnJlc3VtZUdhdGV3YXlVcmwgPSBwYXlsb2FkLnJlc3VtZV9nYXRld2F5X3VybFxuXG4gICAgICAgIHRoaXMuc2Vzc2lvbklkID0gcGF5bG9hZC5zZXNzaW9uX2lkXG4gICAgICAgIHRoaXMuc3RhdGUgPSBTaGFyZFN0YXRlLkNvbm5lY3RlZFxuXG4gICAgICAgIC8vIENvbnRpbnVlIHRoZSByZXF1ZXN0cyB3aGljaCBoYXZlIGJlZW4gcXVldWVkIHNpbmNlIHRoZSBzaGFyZCB3ZW50IG9mZmxpbmUuXG4gICAgICAgIC8vIEltcG9ydGFudCB3aGVuIHRoaXMgaXMgYSByZS1pZGVudGlmeVxuICAgICAgICB0aGlzLm9mZmxpbmVTZW5kUXVldWUubWFwKChyZXNvbHZlKSA9PiByZXNvbHZlKCkpXG5cbiAgICAgICAgdGhpcy5yZXNvbHZlcy5nZXQoJ1JFQURZJyk/LihwYWNrZXQpXG4gICAgICAgIHRoaXMucmVzb2x2ZXMuZGVsZXRlKCdSRUFEWScpXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIHRoZSBzZXF1ZW5jZSBudW1iZXIgaWYgaXQgaXMgcHJlc2VudFxuICAgIC8vIGBzYCBjYW4gYmUgZWl0aGVyIGBudWxsYCBvciBhIGBudW1iZXJgLlxuICAgIC8vIEluIG9yZGVyIHRvIHByZXZlbnQgdXBkYXRlIG1pc3NlcyB3aGVuIGBzYCBpcyBgMGAgd2UgY2hlY2sgYWdhaW5zdCBudWxsLlxuICAgIGlmIChwYWNrZXQucyAhPT0gbnVsbCkge1xuICAgICAgdGhpcy5wcmV2aW91c1NlcXVlbmNlTnVtYmVyID0gcGFja2V0LnNcbiAgICB9XG5cbiAgICB0aGlzLmZvcndhcmRUb0JvdChwYWNrZXQpXG4gIH1cblxuICBmb3J3YXJkVG9Cb3QocGFja2V0OiBEaXNjb3JkR2F0ZXdheVBheWxvYWQpOiB2b2lkIHtcbiAgICAvLyBUaGUgbmVjZXNzYXJ5IGhhbmRsaW5nIHJlcXVpcmVkIGZvciB0aGUgU2hhcmRzIGNvbm5lY3Rpb24gaGFzIGJlZW4gZmluaXNoZWQuXG4gICAgLy8gTm93IHRoZSBldmVudCBjYW4gYmUgc2FmZWx5IGZvcndhcmRlZC5cbiAgICB0aGlzLmV2ZW50cy5tZXNzYWdlPy4odGhpcywgY2FtZWxpemUocGFja2V0KSlcbiAgfVxuXG4gIC8qKiBIYW5kbGUgYW4gaW5jb21pbmcgZ2F0ZXdheSBtZXNzYWdlLiAqL1xuICBhc3luYyBoYW5kbGVNZXNzYWdlKG1lc3NhZ2U6IE5vZGVXZWJTb2NrZXQuTWVzc2FnZUV2ZW50KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbGV0IHByZVByb2Nlc3NNZXNzYWdlID0gbWVzc2FnZS5kYXRhXG5cbiAgICAvLyBJZiBtZXNzYWdlIGNvbXByZXNzaW9uIGlzIGVuYWJsZWQsXG4gICAgLy8gRGlzY29yZCBtaWdodCBzZW5kIHpsaWIgY29tcHJlc3NlZCBwYXlsb2Fkcy5cbiAgICBpZiAodGhpcy5nYXRld2F5Q29uZmlnLmNvbXByZXNzICYmIHByZVByb2Nlc3NNZXNzYWdlIGluc3RhbmNlb2YgQmxvYikge1xuICAgICAgcHJlUHJvY2Vzc01lc3NhZ2UgPSBpbmZsYXRlU3luYyhhd2FpdCBwcmVQcm9jZXNzTWVzc2FnZS5hcnJheUJ1ZmZlcigpKS50b1N0cmluZygpXG4gICAgfVxuXG4gICAgLy8gU2FmZWd1YXJkIGluY2FzZSBkZWNvbXByZXNzaW9uIGZhaWxlZCB0byBtYWtlIGEgc3RyaW5nLlxuICAgIGlmICh0eXBlb2YgcHJlUHJvY2Vzc01lc3NhZ2UgIT09ICdzdHJpbmcnKSByZXR1cm5cblxuICAgIHJldHVybiBhd2FpdCB0aGlzLmhhbmRsZURpc2NvcmRQYWNrZXQoSlNPTi5wYXJzZShwcmVQcm9jZXNzTWVzc2FnZSkgYXMgRGlzY29yZEdhdGV3YXlQYXlsb2FkKVxuICB9XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIGluIG9yZGVyIHRvIG1ha2UgdGhlIHNoYXJkcyBwcmVzZW5jZS5cbiAgICogYXN5bmMgaW4gY2FzZSBkZXZzIGNyZWF0ZSB0aGUgcHJlc2VuY2UgYmFzZWQgb24gZWcuIGRhdGFiYXNlIHZhbHVlcy5cbiAgICogUGFzc2luZyB0aGUgc2hhcmQncyBpZCB0aGVyZSB0byBtYWtlIGl0IGVhc2llciBmb3IgdGhlIGRldiB0byB1c2UgdGhpcyBmdW5jdGlvbi5cbiAgICovXG4gIGFzeW5jIG1ha2VQcmVzZW5jZSgpOiBQcm9taXNlPEJvdFN0YXR1c1VwZGF0ZSB8IHVuZGVmaW5lZD4ge1xuICAgIHJldHVyblxuICB9XG5cbiAgLyoqIFRoaXMgZnVuY3Rpb24gY29tbXVuaWNhdGVzIHdpdGggdGhlIG1hbmFnZW1lbnQgcHJvY2VzcywgaW4gb3JkZXIgdG8ga25vdyB3aGV0aGVyIGl0cyBmcmVlIHRvIGlkZW50aWZ5LiBXaGVuIHRoaXMgZnVuY3Rpb24gcmVzb2x2ZXMsIHRoaXMgbWVhbnMgdGhhdCB0aGUgc2hhcmQgaXMgYWxsb3dlZCB0byBzZW5kIGFuIGlkZW50aWZ5IHBheWxvYWQgdG8gZGlzY29yZC4gKi9cbiAgYXN5bmMgcmVxdWVzdElkZW50aWZ5KCk6IFByb21pc2U8dm9pZD4ge31cblxuICAvKiogVGhpcyBmdW5jdGlvbiBjb21tdW5pY2F0ZXMgd2l0aCB0aGUgbWFuYWdlbWVudCBwcm9jZXNzLCBpbiBvcmRlciB0byB0ZWxsIGl0IGNhbiBpZGVudGlmeSB0aGUgbmV4dCBzaGFyZC4gKi9cbiAgYXN5bmMgc2hhcmRJc1JlYWR5KCk6IFByb21pc2U8dm9pZD4ge31cblxuICAvKiogU3RhcnQgc2VuZGluZyBoZWFydGJlYXQgcGF5bG9hZHMgdG8gRGlzY29yZCBpbiB0aGUgcHJvdmlkZWQgaW50ZXJ2YWwuICovXG4gIHN0YXJ0SGVhcnRiZWF0aW5nKGludGVydmFsOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgW0dhdGV3YXldIFN0YXJ0IEhlYXJ0YmVhdGluZyBTaGFyZCAjJHt0aGlzLmlkfWApXG4gICAgLy8gSWYgb2xkIGhlYXJ0YmVhc3QgZXhpc3QgbGlrZSBhZnRlciByZXN1bWUsIGNsZWFyIHRoZSBvbGQgb25lcy5cbiAgICBpZiAodGhpcy5oZWFydC5pbnRlcnZhbElkKSBjbGVhckludGVydmFsKHRoaXMuaGVhcnQuaW50ZXJ2YWxJZClcbiAgICBpZiAodGhpcy5oZWFydC50aW1lb3V0SWQpIGNsZWFyVGltZW91dCh0aGlzLmhlYXJ0LnRpbWVvdXRJZClcblxuICAgIHRoaXMuaGVhcnQuaW50ZXJ2YWwgPSBpbnRlcnZhbFxuXG4gICAgLy8gT25seSBzZXQgdGhlIHNoYXJkJ3Mgc3RhdGUgdG8gYFVuaWRlbnRpZmllZGBcbiAgICAvLyBpZiBoZWFydGJlYXRpbmcgaGFzIG5vdCBiZWVuIHN0YXJ0ZWQgZHVlIHRvIGFuIGlkZW50aWZ5IG9yIHJlc3VtZSBhY3Rpb24uXG4gICAgaWYgKFtTaGFyZFN0YXRlLkRpc2Nvbm5lY3RlZCwgU2hhcmRTdGF0ZS5PZmZsaW5lXS5pbmNsdWRlcyh0aGlzLnN0YXRlKSkge1xuICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYFtHYXRld2F5XSBTdGFydCBIZWFydGJlYXRpbmcgU2hhcmQgIyR7dGhpcy5pZH0gYWApXG4gICAgICB0aGlzLnN0YXRlID0gU2hhcmRTdGF0ZS5VbmlkZW50aWZpZWRcbiAgICB9XG5cbiAgICAvLyBUaGUgZmlyc3QgaGVhcnRiZWF0IG5lZWRzIHRvIGJlIHNlbmQgd2l0aCBhIHJhbmRvbSBkZWxheSBiZXR3ZWVuIGAwYCBhbmQgYGludGVydmFsYFxuICAgIC8vIFVzaW5nIGEgYHNldFRpbWVvdXQoXywgaml0dGVyKWAgaGVyZSB0byBhY2NvbXBsaXNoIHRoYXQuXG4gICAgLy8gYE1hdGgucmFuZG9tKClgIGNhbiBiZSBgMGAgc28gd2UgdXNlIGAwLjVgIGlmIHRoaXMgaGFwcGVuc1xuICAgIC8vIFJlZmVyZW5jZTogaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvdG9waWNzL2dhdGV3YXkjaGVhcnRiZWF0aW5nXG4gICAgY29uc3Qgaml0dGVyID0gTWF0aC5jZWlsKHRoaXMuaGVhcnQuaW50ZXJ2YWwgKiAoTWF0aC5yYW5kb20oKSB8fCAwLjUpKVxuICAgIHRoaXMuaGVhcnQudGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgW0dhdGV3YXldIFN0YXJ0IEhlYXJ0YmVhdGluZyBTaGFyZCAjJHt0aGlzLmlkfSBiYClcbiAgICAgIGlmICghdGhpcy5pc09wZW4oKSkgcmV0dXJuXG4gICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgW0dhdGV3YXldIFN0YXJ0IEhlYXJ0YmVhdGluZyBTaGFyZCAjJHt0aGlzLmlkfSBjICR7dGhpcy5wcmV2aW91c1NlcXVlbmNlTnVtYmVyIX1gKVxuXG4gICAgICAvLyBVc2luZyBhIGRpcmVjdCBzb2NrZXQuc2VuZCBjYWxsIGhlcmUgYmVjYXVzZSBoZWFydGJlYXQgcmVxdWVzdHMgYXJlIHJlc2VydmVkIGJ5IHVzLlxuICAgICAgdGhpcy5zb2NrZXQ/LnNlbmQoXG4gICAgICAgIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICBvcDogR2F0ZXdheU9wY29kZXMuSGVhcnRiZWF0LFxuICAgICAgICAgIGQ6IHRoaXMucHJldmlvdXNTZXF1ZW5jZU51bWJlcixcbiAgICAgICAgfSksXG4gICAgICApXG5cbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBbR2F0ZXdheV0gU3RhcnQgSGVhcnRiZWF0aW5nIFNoYXJkICMke3RoaXMuaWR9IGRgKVxuICAgICAgdGhpcy5oZWFydC5sYXN0QmVhdCA9IERhdGUubm93KClcbiAgICAgIHRoaXMuaGVhcnQuYWNrbm93bGVkZ2VkID0gZmFsc2VcblxuICAgICAgLy8gQWZ0ZXIgdGhlIHJhbmRvbSBoZWFydGJlYXQgaml0dGVyIHdlIGNhbiBzdGFydCBhIG5vcm1hbCBpbnRlcnZhbC5cbiAgICAgIHRoaXMuaGVhcnQuaW50ZXJ2YWxJZCA9IHNldEludGVydmFsKGFzeW5jICgpID0+IHtcbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYFtHYXRld2F5XSBTdGFydCBIZWFydGJlYXRpbmcgU2hhcmQgIyR7dGhpcy5pZH0gZWApXG4gICAgICAgIGlmICghdGhpcy5pc09wZW4oKSkgcmV0dXJuXG4gICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBbR2F0ZXdheV0gU3RhcnQgSGVhcnRiZWF0aW5nIFNoYXJkICMke3RoaXMuaWR9IGZgKVxuICAgICAgICAvLyBnYXRld2F5LmRlYnVnKFwiR1cgREVCVUdcIiwgYFJ1bm5pbmcgc2V0SW50ZXJ2YWwgaW4gaGVhcnRiZWF0IGZpbGUuIFNoYXJkOiAke3NoYXJkSWR9YCk7XG5cbiAgICAgICAgLy8gZ2F0ZXdheS5kZWJ1ZyhcIkdXIEhFQVJUQkVBVElOR1wiLCB7IHNoYXJkSWQsIHNoYXJkOiBjdXJyZW50U2hhcmQgfSk7XG5cbiAgICAgICAgLy8gVGhlIFNoYXJkIGRpZCBub3QgcmVjZWl2ZSBhIGhlYXJ0YmVhdCBBQ0sgZnJvbSBEaXNjb3JkIGluIHRpbWUsXG4gICAgICAgIC8vIHRoZXJlZm9yZSB3ZSBoYXZlIHRvIGFzc3VtZSB0aGF0IHRoZSBjb25uZWN0aW9uIGhhcyBmYWlsZWQgb3IgZ290IFwiem9tYmllZFwiLlxuICAgICAgICAvLyBUaGUgU2hhcmQgbmVlZHMgdG8gc3RhcnQgYSByZS1pZGVudGlmeSBhY3Rpb24gYWNjb3JkaW5nbHkuXG4gICAgICAgIC8vIFJlZmVyZW5jZTogaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvdG9waWNzL2dhdGV3YXkjaGVhcnRiZWF0aW5nLWV4YW1wbGUtZ2F0ZXdheS1oZWFydGJlYXQtYWNrXG4gICAgICAgIGlmICghdGhpcy5oZWFydC5hY2tub3dsZWRnZWQpIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgW1NoYXJkXSBIZWFydGJlYXQgbm90IGFja25vd2xlZGdlZCBmb3Igc2hhcmQgIyR7dGhpcy5pZH0uYClcbiAgICAgICAgICB0aGlzLmNsb3NlKFNoYXJkU29ja2V0Q2xvc2VDb2Rlcy5ab21iaWVkQ29ubmVjdGlvbiwgJ1pvbWJpZWQgY29ubmVjdGlvbiwgZGlkIG5vdCByZWNlaXZlIGFuIGhlYXJ0YmVhdCBBQ0sgaW4gdGltZS4nKVxuXG4gICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuaWRlbnRpZnkoKVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5oZWFydC5hY2tub3dsZWRnZWQgPSBmYWxzZVxuXG4gICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBbR2F0ZXdheV0gU3RhcnQgSGVhcnRiZWF0aW5nIFNoYXJkICMke3RoaXMuaWR9IGdgKVxuICAgICAgICAvLyBVc2luZyBhIGRpcmVjdCBzb2NrZXQuc2VuZCBjYWxsIGhlcmUgYmVjYXVzZSBoZWFydGJlYXQgcmVxdWVzdHMgYXJlIHJlc2VydmVkIGJ5IHVzLlxuICAgICAgICB0aGlzLnNvY2tldD8uc2VuZChcbiAgICAgICAgICBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICBvcDogR2F0ZXdheU9wY29kZXMuSGVhcnRiZWF0LFxuICAgICAgICAgICAgZDogdGhpcy5wcmV2aW91c1NlcXVlbmNlTnVtYmVyLFxuICAgICAgICAgIH0pLFxuICAgICAgICApXG4gICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBbR2F0ZXdheV0gU3RhcnQgSGVhcnRiZWF0aW5nIFNoYXJkICMke3RoaXMuaWR9IGhgKVxuXG4gICAgICAgIHRoaXMuaGVhcnQubGFzdEJlYXQgPSBEYXRlLm5vdygpXG5cbiAgICAgICAgdGhpcy5ldmVudHMuaGVhcnRiZWF0Py4odGhpcylcbiAgICAgIH0sIHRoaXMuaGVhcnQuaW50ZXJ2YWwpXG4gICAgfSwgaml0dGVyKVxuICB9XG5cbiAgLyoqIFN0b3AgdGhlIGhlYXJ0YmVhdGluZyBwcm9jZXNzIHdpdGggZGlzY29yZC4gKi9cbiAgc3RvcEhlYXJ0YmVhdGluZygpOiB2b2lkIHtcbiAgICAvLyBDbGVhciB0aGUgcmVndWxhciBoZWFydGJlYXQgaW50ZXJ2YWwuXG4gICAgY2xlYXJJbnRlcnZhbCh0aGlzLmhlYXJ0LmludGVydmFsSWQpXG4gICAgLy8gSXQncyBwb3NzaWJsZSB0aGF0IHRoZSBTaGFyZCBnb3QgY2xvc2VkIGJlZm9yZSB0aGUgZmlyc3Qgaml0dGVyZWQgaGVhcnRiZWF0LlxuICAgIC8vIFRvIGdvIHNhZmUgd2Ugc2hvdWxkIGNsZWFyIHRoZSByZWxhdGVkIHRpbWVvdXQgdG9vLlxuICAgIGNsZWFyVGltZW91dCh0aGlzLmhlYXJ0LnRpbWVvdXRJZClcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNoYXJkQ3JlYXRlT3B0aW9ucyB7XG4gIC8qKiBUaGUgc2hhcmQgaWQgKi9cbiAgaWQ6IG51bWJlclxuICAvKiogVGhlIGNvbm5lY3Rpb24gZGV0YWlscyAqL1xuICBjb25uZWN0aW9uOiBTaGFyZEdhdGV3YXlDb25maWdcbiAgLyoqIFRoZSBldmVudCBoYW5kbGVycyBmb3IgZXZlbnRzIG9uIHRoZSBzaGFyZC4gKi9cbiAgZXZlbnRzOiBTaGFyZEV2ZW50c1xuICAvKiogVGhlIGxvZ2dlciBmb3IgdGhlIHNoYXJkICovXG4gIGxvZ2dlcj86IFBpY2s8dHlwZW9mIGxvZ2dlciwgJ2RlYnVnJyB8ICdpbmZvJyB8ICd3YXJuJyB8ICdlcnJvcicgfCAnZmF0YWwnPlxuICAvKiogVGhlIGhhbmRsZXIgdG8gcmVxdWVzdCBhIHNwYWNlIHRvIG1ha2UgYW4gaWRlbnRpZnkgcmVxdWVzdC4gKi9cbiAgcmVxdWVzdElkZW50aWZ5PzogKCkgPT4gUHJvbWlzZTx2b2lkPlxuICAvKiogVGhlIGhhbmRsZXIgdG8gYWxlcnQgdGhlIGdhdGV3YXkgbWFuYWdlciB0aGF0IHRoaXMgc2hhcmQgaGFzIHJlY2VpdmVkIGEgUkVBRFkgZXZlbnQuICovXG4gIHNoYXJkSXNSZWFkeT86ICgpID0+IFByb21pc2U8dm9pZD5cbn1cblxuZXhwb3J0IGRlZmF1bHQgRGlzY29yZGVub1NoYXJkXG4iXSwibmFtZXMiOlsiRGlzY29yZGVub1NoYXJkIiwiY29uc3RydWN0b3IiLCJvcHRpb25zIiwibWF4UmVxdWVzdHNQZXJSYXRlTGltaXRUaWNrIiwicHJldmlvdXNTZXF1ZW5jZU51bWJlciIsInJhdGVMaW1pdFJlc2V0SW50ZXJ2YWwiLCJzdGF0ZSIsIlNoYXJkU3RhdGUiLCJPZmZsaW5lIiwicmVzdW1lR2F0ZXdheVVybCIsImV2ZW50cyIsIm9mZmxpbmVTZW5kUXVldWUiLCJyZXNvbHZlcyIsIk1hcCIsImlkIiwiY29ubmVjdGlvbiIsImxvZ2dlciIsImhlYXJ0IiwiYWNrbm93bGVkZ2VkIiwiaW50ZXJ2YWwiLCJyZXF1ZXN0SWRlbnRpZnkiLCJzaGFyZElzUmVhZHkiLCJidWNrZXQiLCJMZWFreUJ1Y2tldCIsIm1heCIsImNhbGN1bGF0ZVNhZmVSZXF1ZXN0cyIsInJlZmlsbEFtb3VudCIsInJlZmlsbEludGVydmFsIiwiZ2F0ZXdheUNvbmZpZyIsImNvbm5lY3Rpb25VcmwiLCJ1cmwiLCJzYWZlUmVxdWVzdHMiLCJNYXRoIiwiY2VpbCIsImNoZWNrT2ZmbGluZSIsImhpZ2hQcmlvcml0eSIsImlzT3BlbiIsIlByb21pc2UiLCJyZXNvbHZlIiwidW5zaGlmdCIsInB1c2giLCJjbG9zZSIsImNvZGUiLCJyZWFzb24iLCJzb2NrZXQiLCJyZWFkeVN0YXRlIiwiTm9kZVdlYlNvY2tldCIsIk9QRU4iLCJjb25uZWN0IiwiSWRlbnRpZnlpbmciLCJSZXN1bWluZyIsImluY2x1ZGVzIiwiQ29ubmVjdGluZyIsImNvbm5lY3RpbmciLCJVUkwiLCJzZWFyY2hQYXJhbXMiLCJzZXQiLCJ2ZXJzaW9uIiwidG9TdHJpbmciLCJnbG9iYWxUaGlzIiwiRGVubyIsInVuZGVmaW5lZCIsIlJlZmxlY3QiLCJoYXMiLCJXZWJTb2NrZXQiLCJvbmVycm9yIiwiZXZlbnQiLCJjb25zb2xlIiwibG9nIiwiZXJyb3IiLCJzaGFyZElkIiwib25jbG9zZSIsImhhbmRsZUNsb3NlIiwib25tZXNzYWdlIiwibWVzc2FnZSIsImhhbmRsZU1lc3NhZ2UiLCJvbm9wZW4iLCJVbmlkZW50aWZpZWQiLCJjb25uZWN0ZWQiLCJpZGVudGlmeSIsImRlYnVnIiwiU2hhcmRTb2NrZXRDbG9zZUNvZGVzIiwiUmVJZGVudGlmeWluZyIsImlkZW50aWZ5aW5nIiwic2VuZCIsIm9wIiwiR2F0ZXdheU9wY29kZXMiLCJJZGVudGlmeSIsImQiLCJ0b2tlbiIsImNvbXByZXNzIiwicHJvcGVydGllcyIsImludGVudHMiLCJzaGFyZCIsInRvdGFsU2hhcmRzIiwicHJlc2VuY2UiLCJtYWtlUHJlc2VuY2UiLCJpZGVudGlmaWVkIiwiZGVsZXRlIiwicmVzdW1lIiwiUmVzdW1lQ2xvc2luZ09sZENvbm5lY3Rpb24iLCJzZXNzaW9uSWQiLCJSZXN1bWUiLCJzZXNzaW9uX2lkIiwic2VxIiwiYWNxdWlyZSIsIkpTT04iLCJzdHJpbmdpZnkiLCJzaHV0ZG93biIsIlNodXRkb3duIiwic3RvcEhlYXJ0YmVhdGluZyIsIlRlc3RpbmdGaW5pc2hlZCIsImRpc2Nvbm5lY3RlZCIsIlJlc2hhcmRlZCIsIlpvbWJpZWRDb25uZWN0aW9uIiwiRGlzY29ubmVjdGVkIiwiR2F0ZXdheUNsb3NlRXZlbnRDb2RlcyIsIlVua25vd25PcGNvZGUiLCJOb3RBdXRoZW50aWNhdGVkIiwiSW52YWxpZFNlcSIsIlJhdGVMaW1pdGVkIiwiU2Vzc2lvblRpbWVkT3V0IiwiQXV0aGVudGljYXRpb25GYWlsZWQiLCJJbnZhbGlkU2hhcmQiLCJTaGFyZGluZ1JlcXVpcmVkIiwiSW52YWxpZEFwaVZlcnNpb24iLCJJbnZhbGlkSW50ZW50cyIsIkRpc2FsbG93ZWRJbnRlbnRzIiwiRXJyb3IiLCJVbmtub3duRXJyb3IiLCJEZWNvZGVFcnJvciIsIkFscmVhZHlBdXRoZW50aWNhdGVkIiwiaW5mbyIsImhhbmRsZURpc2NvcmRQYWNrZXQiLCJwYWNrZXQiLCJsYXN0QWNrIiwiRGF0ZSIsIm5vdyIsIkhlYXJ0YmVhdCIsImxhc3RCZWF0IiwiaGVhcnRiZWF0IiwiSGVsbG8iLCJoZWFydGJlYXRfaW50ZXJ2YWwiLCJzdGFydEhlYXJ0YmVhdGluZyIsImN1cnJlbnRRdWV1ZSIsInF1ZXVlIiwiaGVsbG8iLCJIZWFydGJlYXRBQ0siLCJydHQiLCJoZWFydGJlYXRBY2siLCJSZWNvbm5lY3QiLCJyZXF1ZXN0ZWRSZWNvbm5lY3QiLCJJbnZhbGlkU2Vzc2lvbiIsInJlc3VtYWJsZSIsImludmFsaWRTZXNzaW9uIiwiZGVsYXkiLCJmbG9vciIsInJhbmRvbSIsImdldCIsInQiLCJDb25uZWN0ZWQiLCJyZXN1bWVkIiwibWFwIiwicGF5bG9hZCIsInJlc3VtZV9nYXRld2F5X3VybCIsInMiLCJmb3J3YXJkVG9Cb3QiLCJjYW1lbGl6ZSIsInByZVByb2Nlc3NNZXNzYWdlIiwiZGF0YSIsIkJsb2IiLCJpbmZsYXRlU3luYyIsImFycmF5QnVmZmVyIiwicGFyc2UiLCJpbnRlcnZhbElkIiwiY2xlYXJJbnRlcnZhbCIsInRpbWVvdXRJZCIsImNsZWFyVGltZW91dCIsImppdHRlciIsInNldFRpbWVvdXQiLCJzZXRJbnRlcnZhbCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7SUFVYUEsZUFBZTtlQUFmQTs7SUFpbEJiLE9BQThCO2VBQTlCOzs7MEJBM2xCNEI7dUJBRTJCO3VCQUNGOzJEQUMzQjt3QkFFd0I7Ozs7OztBQUkzQyxJQUFBLEFBQU1BLGtCQUFOLE1BQU1BO0lBZ0NYQyxZQUFZQyxPQUEyQixDQUFFO1FBekJ6QywwSEFBMEgsUUFDMUhDLDhCQUFzQztRQUN0QywwQ0FBMEMsUUFDMUNDLHlCQUF3QztRQUN4Qyw0RUFBNEUsUUFDNUVD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