@bitgo-beta/sdk-api 1.10.1-beta.162 → 1.10.1-beta.1621

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 (65) hide show
  1. package/dist/package.json +16 -25
  2. package/dist/src/api.d.ts +7 -5
  3. package/dist/src/api.d.ts.map +1 -1
  4. package/dist/src/api.js +86 -47
  5. package/dist/src/bitgoAPI.d.ts +53 -12
  6. package/dist/src/bitgoAPI.d.ts.map +1 -1
  7. package/dist/src/bitgoAPI.js +387 -142
  8. package/dist/src/encrypt.d.ts +4 -4
  9. package/dist/src/encrypt.d.ts.map +1 -1
  10. package/dist/src/encrypt.js +44 -7
  11. package/dist/src/index.js +6 -2
  12. package/dist/src/types.d.ts +56 -43
  13. package/dist/src/types.d.ts.map +1 -1
  14. package/dist/src/types.js +4 -2
  15. package/dist/src/util.d.ts +12 -0
  16. package/dist/src/util.d.ts.map +1 -1
  17. package/dist/src/util.js +57 -4
  18. package/dist/src/v1/blockchain.js +25 -12
  19. package/dist/src/v1/keychains.js +27 -22
  20. package/dist/src/v1/markets.js +10 -5
  21. package/dist/src/v1/pendingapproval.d.ts.map +1 -1
  22. package/dist/src/v1/pendingapproval.js +57 -18
  23. package/dist/src/v1/pendingapprovals.d.ts.map +1 -1
  24. package/dist/src/v1/pendingapprovals.js +41 -7
  25. package/dist/src/v1/signPsbt.d.ts +14 -0
  26. package/dist/src/v1/signPsbt.d.ts.map +1 -0
  27. package/dist/src/v1/signPsbt.js +69 -0
  28. package/dist/src/v1/transactionBuilder.js +214 -90
  29. package/dist/src/v1/travelRule.js +60 -23
  30. package/dist/src/v1/verifyAddress.d.ts +6 -0
  31. package/dist/src/v1/verifyAddress.d.ts.map +1 -0
  32. package/dist/src/v1/verifyAddress.js +50 -0
  33. package/dist/src/v1/wallet.d.ts.map +1 -1
  34. package/dist/src/v1/wallet.js +479 -224
  35. package/dist/src/v1/wallets.js +93 -37
  36. package/dist/test/unit/api.d.ts +2 -0
  37. package/dist/test/unit/api.d.ts.map +1 -0
  38. package/dist/test/unit/api.js +307 -0
  39. package/dist/test/unit/bitgoAPI.d.ts +2 -0
  40. package/dist/test/unit/bitgoAPI.d.ts.map +1 -0
  41. package/dist/test/unit/bitgoAPI.js +540 -0
  42. package/dist/test/unit/encrypt.d.ts +2 -0
  43. package/dist/test/unit/encrypt.d.ts.map +1 -0
  44. package/dist/test/unit/encrypt.js +62 -0
  45. package/dist/test/unit/utils.d.ts +2 -0
  46. package/dist/test/unit/utils.d.ts.map +1 -0
  47. package/dist/test/unit/utils.js +65 -0
  48. package/dist/test/unit/v1/fixtures/accelerate-tx.d.ts +4 -0
  49. package/dist/test/unit/v1/fixtures/accelerate-tx.d.ts.map +1 -0
  50. package/dist/test/unit/v1/fixtures/accelerate-tx.js +53 -0
  51. package/dist/test/unit/v1/fixtures/index.d.ts +3 -0
  52. package/dist/test/unit/v1/fixtures/index.d.ts.map +1 -0
  53. package/dist/test/unit/v1/fixtures/index.js +24 -0
  54. package/dist/test/unit/v1/signPsbt.d.ts +2 -0
  55. package/dist/test/unit/v1/signPsbt.d.ts.map +1 -0
  56. package/dist/test/unit/v1/signPsbt.js +53 -0
  57. package/dist/test/unit/v1/wallet.d.ts +2 -0
  58. package/dist/test/unit/v1/wallet.d.ts.map +1 -0
  59. package/dist/test/unit/v1/wallet.js +1603 -0
  60. package/dist/tsconfig.tsbuildinfo +1 -0
  61. package/package.json +16 -25
  62. package/.eslintignore +0 -5
  63. package/CHANGELOG.md +0 -478
  64. package/dist/web/main.js +0 -2
  65. package/dist/web/main.js.LICENSE.txt +0 -110
@@ -1,24 +1,57 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
2
38
  Object.defineProperty(exports, "__esModule", { value: true });
3
39
  exports.BitGoAPI = void 0;
4
40
  const sdk_core_1 = require("@bitgo-beta/sdk-core");
5
- const sjcl = require("@bitgo-beta/sjcl");
6
- const utxolib = require("@bitgo-beta/utxo-lib");
41
+ const sdkHmac = __importStar(require("@bitgo-beta/sdk-hmac"));
42
+ const utxolib = __importStar(require("@bitgo-beta/utxo-lib"));
7
43
  const utxo_lib_1 = require("@bitgo-beta/utxo-lib");
8
- const bitcoinMessage = require("bitcoinjs-message");
9
- const browser_or_node_1 = require("browser-or-node");
10
- const bs58 = require("bs58");
11
- const crypto_1 = require("crypto");
12
- const debug_1 = require("debug");
13
- const _ = require("lodash");
14
- const secp256k1 = require("secp256k1");
15
- const superagent = require("superagent");
16
- const urlLib = require("url");
44
+ const bitcoinMessage = __importStar(require("bitcoinjs-message"));
45
+ const debug_1 = __importDefault(require("debug"));
46
+ const _ = __importStar(require("lodash"));
47
+ const secp256k1 = __importStar(require("secp256k1"));
48
+ const superagent = __importStar(require("superagent"));
17
49
  const api_1 = require("./api");
18
50
  const encrypt_1 = require("./encrypt");
51
+ const verifyAddress_1 = require("./v1/verifyAddress");
19
52
  const shamir = require("secrets.js-grempe");
20
53
  const pjson = require("../package.json");
21
- const debug = debug_1.default('bitgo:api');
54
+ const debug = (0, debug_1.default)('bitgo:api');
22
55
  const Blockchain = require('./v1/blockchain');
23
56
  const Keychains = require('./v1/keychains');
24
57
  const Wallet = require("./v1/wallet");
@@ -27,17 +60,13 @@ const Markets = require('./v1/markets');
27
60
  const PendingApprovals = require('./v1/pendingapprovals');
28
61
  const TravelRule = require('./v1/travelRule');
29
62
  const TransactionBuilder = require('./v1/transactionBuilder');
30
- let proxyAgent;
31
- if (!browser_or_node_1.isBrowser && !browser_or_node_1.isWebWorker) {
32
- debug('enabling proxy-agent');
33
- proxyAgent = require('proxy-agent').ProxyAgent;
34
- }
35
- const patchedRequestMethods = ['get', 'post', 'put', 'del', 'patch'];
36
63
  class BitGoAPI {
37
64
  constructor(params = {}) {
38
65
  this._authVersion = 2;
39
66
  this._hmacVerification = true;
40
67
  this._version = pjson.version;
68
+ this.getAdditionalHeadersCb = params.getAdditionalHeadersCb;
69
+ this._requestIdPrefix = params.requestIdPrefix;
41
70
  this.cookiesPropagationEnabled = false;
42
71
  if (!sdk_core_1.common.validateParams(params, [], [
43
72
  'accessToken',
@@ -121,16 +150,47 @@ class BitGoAPI {
121
150
  this._baseUrl = sdk_core_1.common.Environments[env].uri;
122
151
  }
123
152
  this._env = this.env = env;
124
- const supportedApiTokens = ['etherscanApiToken', 'polygonscanApiToken', 'snowtraceApiToken'];
153
+ const supportedApiTokens = [
154
+ 'etherscanApiToken',
155
+ 'polygonscanApiToken',
156
+ 'arbiscanApiToken',
157
+ 'optimisticEtherscanApiToken',
158
+ 'zksyncExplorerApiToken',
159
+ 'bscscanApiToken',
160
+ 'coredaoExplorerApiToken',
161
+ 'oasExplorerApiToken',
162
+ 'baseethApiToken',
163
+ 'sgbExplorerApiToken',
164
+ 'flrExplorerApiToken',
165
+ 'xdcExplorerApiToken',
166
+ 'wemixExplorerApiToken',
167
+ 'monExplorerApiToken',
168
+ 'worldExplorerApiToken',
169
+ 'somniaExplorerApiToken',
170
+ 'soneiumExplorerApiToken',
171
+ ];
125
172
  Object.keys(params).forEach((key) => {
126
173
  if (supportedApiTokens.includes(key)) {
127
174
  sdk_core_1.common.Environments[env][key] = params[key];
128
175
  }
129
176
  });
177
+ if (params.evm) {
178
+ const evmConfig = sdk_core_1.common.Environments[env]['evm'] || {};
179
+ Object.keys(params.evm).forEach((key) => {
180
+ if (params.evm?.[key] && params.evm[key]['apiToken']) {
181
+ evmConfig[key] = evmConfig[key] || {};
182
+ evmConfig[key]['apiToken'] = params.evm[key]['apiToken'];
183
+ }
184
+ });
185
+ sdk_core_1.common.Environments[env]['evm'] = evmConfig;
186
+ }
130
187
  sdk_core_1.common.setNetwork(sdk_core_1.common.Environments[env].network);
131
188
  this._baseApiUrl = this._baseUrl + '/api/v1';
132
189
  this._baseApiUrlV2 = this._baseUrl + '/api/v2';
190
+ this._baseApiUrlV3 = this._baseUrl + '/api/v3';
133
191
  this._token = params.accessToken;
192
+ const clientConstants = params.clientConstants;
193
+ this._initializeClientConstants(clientConstants);
134
194
  this._userAgent = params.userAgent || 'BitGoJS-api/' + this.version();
135
195
  this._reqId = undefined;
136
196
  this._refreshToken = params.refreshToken;
@@ -150,23 +210,36 @@ class BitGoAPI {
150
210
  debug('HMAC verification explicitly disabled by constructor option');
151
211
  this._hmacVerification = params.hmacVerification;
152
212
  }
153
- if (!params.proxy && process.env.BITGO_USE_PROXY) {
154
- params.proxy = process.env.BITGO_USE_PROXY;
155
- }
156
- if (process.browser && params.proxy) {
157
- throw new Error('cannot use https proxy params while in browser');
213
+ if (process.browser && params.customProxyAgent) {
214
+ throw new Error('should not use https proxy while in browser');
215
+ }
216
+ this._customProxyAgent = params.customProxyAgent;
217
+ // Only fetch constants from constructor if clientConstants was not provided
218
+ if (!clientConstants) {
219
+ // capture outer stack so we have useful debug information if fetch constants fails
220
+ const e = new Error();
221
+ // Kick off first load of constants
222
+ this.fetchConstants().catch((err) => {
223
+ if (err) {
224
+ // make sure an error does not terminate the entire script
225
+ console.error('failed to fetch initial client constants from BitGo');
226
+ debug(e.stack);
227
+ }
228
+ });
158
229
  }
159
- this._proxy = params.proxy;
160
- // capture outer stack so we have useful debug information if fetch constants fails
161
- const e = new Error();
162
- // Kick off first load of constants
163
- this.fetchConstants().catch((err) => {
164
- if (err) {
165
- // make sure an error does not terminate the entire script
166
- console.error('failed to fetch initial client constants from BitGo');
167
- debug(e.stack);
230
+ }
231
+ /**
232
+ * Initialize client constants if provided.
233
+ * @param clientConstants - The client constants from params
234
+ * @private
235
+ */
236
+ _initializeClientConstants(clientConstants) {
237
+ if (clientConstants) {
238
+ if (!BitGoAPI._constants) {
239
+ BitGoAPI._constants = {};
168
240
  }
169
- });
241
+ BitGoAPI._constants[this.env] = 'constants' in clientConstants ? clientConstants.constants : clientConstants;
242
+ }
170
243
  }
171
244
  /**
172
245
  * Get a superagent request for specified http method and URL configured to the SDK configuration
@@ -206,23 +279,23 @@ class BitGoAPI {
206
279
  */
207
280
  requestPatch(method, url) {
208
281
  const req = this.getAgentRequest(method, url);
209
- if (this._proxy && proxyAgent !== undefined) {
210
- debug('proxying request through %s', this._proxy);
211
- const agent = new proxyAgent(this._proxy);
212
- if (agent) {
213
- req.agent(agent);
282
+ if (this._customProxyAgent) {
283
+ debug('using custom proxy agent');
284
+ if (this._customProxyAgent) {
285
+ req.agent(this._customProxyAgent);
214
286
  }
215
287
  }
216
288
  const originalThen = req.then.bind(req);
217
289
  req.then = (onfulfilled, onrejected) => {
218
- var _a, _b;
219
290
  // intercept a request before it's submitted to the server for v2 authentication (based on token)
220
291
  if (this._version) {
221
292
  // TODO - decide where to get version
222
293
  req.set('BitGo-SDK-Version', this._version);
223
294
  }
224
295
  if (!_.isUndefined(this._reqId)) {
225
- req.set('Request-ID', this._reqId.toString());
296
+ const reqId = this._reqId.toString();
297
+ const requestId = this._requestIdPrefix ? `${this._requestIdPrefix}${reqId}` : reqId;
298
+ req.set('Request-ID', requestId);
226
299
  // increment after setting the header so the sequence numbers start at 0
227
300
  this._reqId.inc();
228
301
  // request ids must be set before each request instead of being kept
@@ -232,7 +305,7 @@ class BitGoAPI {
232
305
  }
233
306
  // prevent IE from caching requests
234
307
  req.set('If-Modified-Since', 'Mon, 26 Jul 1997 05:00:00 GMT');
235
- if (!process.browser && this._userAgent) {
308
+ if (typeof window === 'undefined' && this._userAgent) {
236
309
  // If not in the browser, set the User-Agent. Browsers don't allow
237
310
  // setting of User-Agent, so we must disable this when run in the
238
311
  // browser (browserify sets process.browser).
@@ -248,26 +321,33 @@ class BitGoAPI {
248
321
  // use the old method
249
322
  req.isV2Authenticated = false;
250
323
  req.set('Authorization', 'Bearer ' + this._token);
251
- debug('sending v1 %s request to %s with token %s', method, url, (_a = this._token) === null || _a === void 0 ? void 0 : _a.substr(0, 8));
324
+ debug('sending v1 %s request to %s with token %s', method, url, this._token?.substr(0, 8));
252
325
  return originalThen(onfulfilled).catch(onrejected);
253
326
  }
254
327
  req.set('BitGo-Auth-Version', this._authVersion === 3 ? '3.0' : '2.0');
328
+ const data = (0, api_1.serializeRequestData)(req);
255
329
  if (this._token) {
256
- const data = api_1.serializeRequestData(req);
257
- api_1.setRequestQueryString(req);
330
+ (0, api_1.setRequestQueryString)(req);
258
331
  const requestProperties = this.calculateRequestHeaders({
259
332
  url: req.url,
260
333
  token: this._token,
261
334
  method,
262
335
  text: data || '',
336
+ authVersion: this._authVersion,
263
337
  });
264
338
  req.set('Auth-Timestamp', requestProperties.timestamp.toString());
265
339
  // we're not sending the actual token, but only its hash
266
340
  req.set('Authorization', 'Bearer ' + requestProperties.tokenHash);
267
- debug('sending v2 %s request to %s with token %s', method, url, (_b = this._token) === null || _b === void 0 ? void 0 : _b.substr(0, 8));
341
+ debug('sending v2 %s request to %s with token %s', method, url, this._token?.substr(0, 8));
268
342
  // set the HMAC
269
343
  req.set('HMAC', requestProperties.hmac);
270
344
  }
345
+ if (this.getAdditionalHeadersCb) {
346
+ const additionalHeaders = this.getAdditionalHeadersCb(method, url, data);
347
+ for (const { key, value } of additionalHeaders) {
348
+ req.set(key, value);
349
+ }
350
+ }
271
351
  /**
272
352
  * Verify the response before calling the original onfulfilled handler,
273
353
  * and make sure onrejected is called if a verification error is encountered
@@ -280,13 +360,13 @@ class BitGoAPI {
280
360
  if (!this._hmacVerification && !sdk_core_1.common.Environments[this.getEnv()].hmacVerificationEnforced) {
281
361
  return onfulfilled(response);
282
362
  }
283
- const verifiedResponse = api_1.verifyResponse(this, this._token, method, req, response);
363
+ const verifiedResponse = (0, api_1.verifyResponse)(this, this._token, method, req, response, this._authVersion);
284
364
  return onfulfilled(verifiedResponse);
285
365
  }
286
366
  : null;
287
367
  return originalThen(newOnFulfilled).catch(onrejected);
288
368
  };
289
- return api_1.toBitgoRequest(req);
369
+ return (0, api_1.toBitgoRequest)(req);
290
370
  }
291
371
  get(url) {
292
372
  return this.requestPatch('get', url);
@@ -303,6 +383,9 @@ class BitGoAPI {
303
383
  patch(url) {
304
384
  return this.requestPatch('patch', url);
305
385
  }
386
+ options(url) {
387
+ return this.requestPatch('options', url);
388
+ }
306
389
  /**
307
390
  * Calculate the HMAC for the given key and message
308
391
  * @param key {String} - the key to use for the HMAC
@@ -310,7 +393,7 @@ class BitGoAPI {
310
393
  * @returns {*} - the result of the HMAC operation
311
394
  */
312
395
  calculateHMAC(key, message) {
313
- return crypto_1.createHmac('sha256', key).update(message).digest('hex');
396
+ return sdkHmac.calculateHMAC(key, message);
314
397
  }
315
398
  /**
316
399
  * Calculate the subject string that is to be HMAC'ed for a HTTP request or response
@@ -319,69 +402,28 @@ class BitGoAPI {
319
402
  * @param timestamp request timestamp from `Date.now()`
320
403
  * @param statusCode Only set for HTTP responses, leave blank for requests
321
404
  * @param method request method
322
- * @returns {string}
405
+ * @returns {string | Buffer}
323
406
  */
324
- calculateHMACSubject({ urlPath, text, timestamp, statusCode, method }) {
325
- const urlDetails = urlLib.parse(urlPath);
326
- const queryPath = urlDetails.query && urlDetails.query.length > 0 ? urlDetails.path : urlDetails.pathname;
327
- if (!_.isUndefined(statusCode) && _.isInteger(statusCode) && _.isFinite(statusCode)) {
328
- if (this._authVersion === 3) {
329
- return [method.toUpperCase(), timestamp, queryPath, statusCode, text].join('|');
330
- }
331
- return [timestamp, queryPath, statusCode, text].join('|');
332
- }
333
- if (this._authVersion === 3) {
334
- return [method.toUpperCase(), timestamp, '3.0', queryPath, text].join('|');
335
- }
336
- return [timestamp, queryPath, text].join('|');
407
+ calculateHMACSubject(params) {
408
+ return sdkHmac.calculateHMACSubject({ ...params, authVersion: this._authVersion });
337
409
  }
338
410
  /**
339
411
  * Calculate the HMAC for an HTTP request
340
412
  */
341
- calculateRequestHMAC({ url: urlPath, text, timestamp, token, method }) {
342
- const signatureSubject = this.calculateHMACSubject({ urlPath, text, timestamp, method });
343
- // calculate the HMAC
344
- return this.calculateHMAC(token, signatureSubject);
413
+ calculateRequestHMAC(params) {
414
+ return sdkHmac.calculateRequestHMAC({ ...params, authVersion: this._authVersion });
345
415
  }
346
416
  /**
347
417
  * Calculate request headers with HMAC
348
418
  */
349
- calculateRequestHeaders({ url, text, token, method }) {
350
- const timestamp = Date.now();
351
- const hmac = this.calculateRequestHMAC({ url, text, timestamp, token, method });
352
- // calculate the SHA256 hash of the token
353
- const hashDigest = sjcl.hash.sha256.hash(token);
354
- const tokenHash = sjcl.codec.hex.fromBits(hashDigest);
355
- return {
356
- hmac,
357
- timestamp,
358
- tokenHash,
359
- };
419
+ calculateRequestHeaders(params) {
420
+ return sdkHmac.calculateRequestHeaders({ ...params, authVersion: this._authVersion });
360
421
  }
361
422
  /**
362
423
  * Verify the HMAC for an HTTP response
363
424
  */
364
- verifyResponse({ url: urlPath, statusCode, text, timestamp, token, hmac, method, }) {
365
- const signatureSubject = this.calculateHMACSubject({
366
- urlPath,
367
- text,
368
- timestamp,
369
- statusCode,
370
- method,
371
- });
372
- // calculate the HMAC
373
- const expectedHmac = this.calculateHMAC(token, signatureSubject);
374
- // determine if the response is still within the validity window (5 minute window)
375
- const now = Date.now();
376
- const isInResponseValidityWindow = timestamp >= now - 1000 * 60 * 5 && timestamp <= now;
377
- // verify the HMAC and timestamp
378
- return {
379
- isValid: expectedHmac === hmac,
380
- expectedHmac,
381
- signatureSubject,
382
- isInResponseValidityWindow,
383
- verificationTime: now,
384
- };
425
+ verifyResponse(params) {
426
+ return sdkHmac.verifyResponse({ ...params, authVersion: this._authVersion });
385
427
  }
386
428
  /**
387
429
  * Fetch useful constant values from the BitGo server.
@@ -390,15 +432,11 @@ class BitGoAPI {
390
432
  * so they can safely cached.
391
433
  */
392
434
  async fetchConstants() {
393
- var _a, _b;
394
435
  const env = this.getEnv();
395
- if (!BitGoAPI._constants) {
396
- BitGoAPI._constants = {};
397
- }
398
- if (!BitGoAPI._constantsExpire) {
399
- BitGoAPI._constantsExpire = {};
400
- }
401
- if (BitGoAPI._constants[env] && BitGoAPI._constantsExpire[env] && new Date() < BitGoAPI._constantsExpire[env]) {
436
+ // Check if we have cached constants that haven't expired
437
+ if (BitGoAPI._constants &&
438
+ BitGoAPI._constants[env] &&
439
+ (!BitGoAPI._constantsExpire || !BitGoAPI._constantsExpire[env] || new Date() < BitGoAPI._constantsExpire[env])) {
402
440
  return BitGoAPI._constants[env];
403
441
  }
404
442
  // client constants call cannot be authenticated using the normal HMAC validation
@@ -406,9 +444,24 @@ class BitGoAPI {
406
444
  // Proxy settings must still be respected however
407
445
  const resultPromise = this.getAgentRequest('get', this.url('/client/constants'));
408
446
  resultPromise.set('BitGo-SDK-Version', this._version);
409
- const result = await (this._proxy ? resultPromise.proxy(this._proxy) : resultPromise);
447
+ if (this._customProxyAgent) {
448
+ resultPromise.agent(this._customProxyAgent);
449
+ }
450
+ if (this.getAdditionalHeadersCb) {
451
+ const additionalHeaders = this.getAdditionalHeadersCb('get', this.url('/client/constants'));
452
+ for (const { key, value } of additionalHeaders) {
453
+ resultPromise.set(key, value);
454
+ }
455
+ }
456
+ const result = await resultPromise;
457
+ if (!BitGoAPI._constants) {
458
+ BitGoAPI._constants = {};
459
+ }
410
460
  BitGoAPI._constants[env] = result.body.constants;
411
- if (((_a = result.body) === null || _a === void 0 ? void 0 : _a.ttl) && typeof ((_b = result.body) === null || _b === void 0 ? void 0 : _b.ttl) === 'number') {
461
+ if (result.body?.ttl && typeof result.body?.ttl === 'number') {
462
+ if (!BitGoAPI._constantsExpire) {
463
+ BitGoAPI._constantsExpire = {};
464
+ }
412
465
  BitGoAPI._constantsExpire[env] = new Date(new Date().getTime() + result.body.ttl * 1000);
413
466
  }
414
467
  return BitGoAPI._constants[env];
@@ -419,7 +472,7 @@ class BitGoAPI {
419
472
  * @param version
420
473
  */
421
474
  url(path, version = 1) {
422
- const baseUrl = version === 2 ? this._baseApiUrlV2 : this._baseApiUrl;
475
+ const baseUrl = version === 3 ? this._baseApiUrlV3 : version === 2 ? this._baseApiUrlV2 : this._baseApiUrl;
423
476
  return baseUrl + path;
424
477
  }
425
478
  /**
@@ -456,11 +509,11 @@ class BitGoAPI {
456
509
  * Utility function to encrypt locally.
457
510
  */
458
511
  encrypt(params) {
459
- sdk_core_1.common.validateParams(params, ['input', 'password'], []);
512
+ sdk_core_1.common.validateParams(params, ['input', 'password'], ['adata']);
460
513
  if (!params.password) {
461
514
  throw new Error(`cannot encrypt without password`);
462
515
  }
463
- return encrypt_1.encrypt(params.password, params.input);
516
+ return (0, encrypt_1.encrypt)(params.password, params.input, { adata: params.adata });
464
517
  }
465
518
  /**
466
519
  * Decrypt an encrypted string locally.
@@ -472,7 +525,7 @@ class BitGoAPI {
472
525
  throw new Error(`cannot decrypt without password`);
473
526
  }
474
527
  try {
475
- return encrypt_1.decrypt(params.password, params.input);
528
+ return (0, encrypt_1.decrypt)(params.password, params.input);
476
529
  }
477
530
  catch (error) {
478
531
  if (error.message.includes("ccm: tag doesn't match")) {
@@ -481,6 +534,49 @@ class BitGoAPI {
481
534
  throw error;
482
535
  }
483
536
  }
537
+ /**
538
+ * Attempt to decrypt multiple wallet keys with the provided passphrase
539
+ * @param {DecryptKeysOptions} params - Parameters object containing wallet key pairs and password
540
+ * @param {Array<{walletId: string, encryptedPrv: string}>} params.walletIdEncryptedKeyPairs - Array of wallet ID and encrypted private key pairs
541
+ * @param {string} params.password - The passphrase to attempt decryption with
542
+ * @returns {string[]} - Array of wallet IDs for which decryption failed
543
+ */
544
+ decryptKeys(params) {
545
+ params = params || {};
546
+ if (!params.walletIdEncryptedKeyPairs) {
547
+ throw new Error('Missing parameter: walletIdEncryptedKeyPairs');
548
+ }
549
+ if (!params.password) {
550
+ throw new Error('Missing parameter: password');
551
+ }
552
+ if (!Array.isArray(params.walletIdEncryptedKeyPairs)) {
553
+ throw new Error('walletIdEncryptedKeyPairs must be an array');
554
+ }
555
+ if (params.walletIdEncryptedKeyPairs.length === 0) {
556
+ return [];
557
+ }
558
+ const failedWalletIds = [];
559
+ for (const keyPair of params.walletIdEncryptedKeyPairs) {
560
+ if (!keyPair.walletId || typeof keyPair.walletId !== 'string') {
561
+ throw new Error('each key pair must have a string walletId');
562
+ }
563
+ if (!keyPair.encryptedPrv || typeof keyPair.encryptedPrv !== 'string') {
564
+ throw new Error('each key pair must have a string encryptedPrv');
565
+ }
566
+ try {
567
+ this.decrypt({
568
+ input: keyPair.encryptedPrv,
569
+ password: params.password,
570
+ });
571
+ // If no error was thrown, decryption was successful
572
+ }
573
+ catch (error) {
574
+ // If decryption fails, add the walletId to the failed list
575
+ failedWalletIds.push(keyPair.walletId);
576
+ }
577
+ }
578
+ return failedWalletIds;
579
+ }
484
580
  /**
485
581
  * Serialize this BitGo object to a JSON object.
486
582
  *
@@ -521,7 +617,7 @@ class BitGoAPI {
521
617
  * Process the username, password and otp into an object containing the username and hashed password, ready to
522
618
  * send to bitgo for authentication.
523
619
  */
524
- preprocessAuthenticationParams({ username, password, otp, forceSMS, extensible, trust, }) {
620
+ preprocessAuthenticationParams({ username, password, otp, forceSMS, extensible, trust, forReset2FA, initialHash, fingerprintHash, }) {
525
621
  if (!_.isString(username)) {
526
622
  throw new Error('expected string username');
527
623
  }
@@ -543,12 +639,46 @@ class BitGoAPI {
543
639
  }
544
640
  }
545
641
  if (extensible) {
546
- this._extensionKey = sdk_core_1.makeRandomKey();
642
+ this._extensionKey = (0, sdk_core_1.makeRandomKey)();
547
643
  authParams.extensible = true;
548
- authParams.extensionAddress = sdk_core_1.getAddressP2PKH(this._extensionKey);
644
+ authParams.extensionAddress = (0, sdk_core_1.getAddressP2PKH)(this._extensionKey);
645
+ }
646
+ if (forReset2FA) {
647
+ authParams.forReset2FA = true;
648
+ }
649
+ if (initialHash) {
650
+ authParams.initialHash = initialHash;
651
+ }
652
+ if (fingerprintHash) {
653
+ authParams.fingerprintHash = fingerprintHash;
549
654
  }
550
655
  return authParams;
551
656
  }
657
+ /**
658
+ * Validate the passkey response is in the expected format
659
+ * Should be as is returned from navigator.credentials.get()
660
+ */
661
+ validatePasskeyResponse(passkeyResponse) {
662
+ const parsedPasskeyResponse = JSON.parse(passkeyResponse);
663
+ if (!parsedPasskeyResponse && !parsedPasskeyResponse.response) {
664
+ throw new Error('unexpected webauthnResponse');
665
+ }
666
+ if (!_.isString(parsedPasskeyResponse.id)) {
667
+ throw new Error('id is missing');
668
+ }
669
+ if (!_.isString(parsedPasskeyResponse.response.authenticatorData)) {
670
+ throw new Error('authenticatorData is missing');
671
+ }
672
+ if (!_.isString(parsedPasskeyResponse.response.clientDataJSON)) {
673
+ throw new Error('clientDataJSON is missing');
674
+ }
675
+ if (!_.isString(parsedPasskeyResponse.response.signature)) {
676
+ throw new Error('signature is missing');
677
+ }
678
+ if (!_.isString(parsedPasskeyResponse.response.userHandle)) {
679
+ throw new Error('userHandle is missing');
680
+ }
681
+ }
552
682
  /**
553
683
  * Synchronous method for activating an access token.
554
684
  */
@@ -663,18 +793,52 @@ class BitGoAPI {
663
793
  this._token = responseDetails.token;
664
794
  this._ecdhXprv = responseDetails.ecdhXprv;
665
795
  // verify the response's authenticity
666
- api_1.verifyResponse(this, responseDetails.token, 'post', request, response);
796
+ (0, api_1.verifyResponse)(this, responseDetails.token, 'post', request, response, this._authVersion);
667
797
  // add the remaining component for easier access
668
798
  response.body.access_token = this._token;
669
799
  }
670
800
  const userSettings = params.ensureEcdhKeychain ? await this.ensureUserEcdhKeychainIsCreated(password) : undefined;
671
- if (userSettings === null || userSettings === void 0 ? void 0 : userSettings.ecdhKeychain) {
801
+ if (userSettings?.ecdhKeychain) {
672
802
  response.body.user.ecdhKeychain = userSettings.ecdhKeychain;
673
803
  }
674
- return api_1.handleResponseResult()(response);
804
+ return (0, api_1.handleResponseResult)()(response);
805
+ }
806
+ catch (e) {
807
+ (0, api_1.handleResponseError)(e);
808
+ }
809
+ }
810
+ /**
811
+ * Login to the bitgo platform with passkey.
812
+ */
813
+ async authenticateWithPasskey(passkey, initialHash, fingerprintHash) {
814
+ try {
815
+ if (this._token) {
816
+ return new Error('already logged in');
817
+ }
818
+ const authUrl = this.microservicesUrl('/api/auth/v1/session');
819
+ const request = this.post(authUrl);
820
+ this.validatePasskeyResponse(passkey);
821
+ const userId = JSON.parse(passkey).response.userHandle;
822
+ const response = await request.send({
823
+ passkey: passkey,
824
+ userId: userId,
825
+ initialHash,
826
+ fingerprintHash,
827
+ });
828
+ // extract body and user information
829
+ const body = response.body;
830
+ this._user = body.user;
831
+ if (body.access_token) {
832
+ this._token = body.access_token;
833
+ response.body.access_token = body.access_token;
834
+ }
835
+ else {
836
+ throw new Error('Failed to login. Please contact support@bitgo.com');
837
+ }
838
+ return (0, api_1.handleResponseResult)()(response);
675
839
  }
676
840
  catch (e) {
677
- api_1.handleResponseError(e);
841
+ (0, api_1.handleResponseError)(e);
678
842
  }
679
843
  }
680
844
  /**
@@ -709,7 +873,7 @@ class BitGoAPI {
709
873
  const clientHDNode = utxo_lib_1.bip32.fromBase58(ecdhXprv);
710
874
  const serverHDNode = utxo_lib_1.bip32.fromBase58(serverXpub);
711
875
  // BIP32 derivation path is applied to both client and server master keys
712
- const derivationPath = sdk_core_1.sanitizeLegacyPath(responseBody.derivationPath);
876
+ const derivationPath = (0, sdk_core_1.sanitizeLegacyPath)(responseBody.derivationPath);
713
877
  const clientDerivedNode = clientHDNode.derivePath(derivationPath);
714
878
  const serverDerivedNode = serverHDNode.derivePath(derivationPath);
715
879
  const publicKey = serverDerivedNode.publicKey;
@@ -838,7 +1002,6 @@ class BitGoAPI {
838
1002
  * }
839
1003
  */
840
1004
  async addAccessToken(params) {
841
- var _a;
842
1005
  try {
843
1006
  if (!_.isString(params.label)) {
844
1007
  throw new Error('required string label');
@@ -880,21 +1043,21 @@ class BitGoAPI {
880
1043
  if (!this._ecdhXprv) {
881
1044
  // without a private key, the user cannot decrypt the new access token the server will send
882
1045
  request.forceV1Auth = true;
883
- debug('forcing v1 auth for adding access token using token %s', (_a = this._token) === null || _a === void 0 ? void 0 : _a.substr(0, 8));
1046
+ debug('forcing v1 auth for adding access token using token %s', this._token?.substr(0, 8));
884
1047
  }
885
1048
  const response = await request.send(params);
886
1049
  if (request.forceV1Auth) {
887
1050
  response.body.warning = 'A protocol downgrade has occurred because this is a legacy account.';
888
- return api_1.handleResponseResult()(response);
1051
+ return (0, api_1.handleResponseResult)()(response);
889
1052
  }
890
1053
  // verify the authenticity of the server's response before proceeding any further
891
- api_1.verifyResponse(this, this._token, 'post', request, response);
1054
+ (0, api_1.verifyResponse)(this, this._token, 'post', request, response, this._authVersion);
892
1055
  const responseDetails = this.handleTokenIssuance(response.body);
893
1056
  response.body.token = responseDetails.token;
894
- return api_1.handleResponseResult()(response);
1057
+ return (0, api_1.handleResponseResult)()(response);
895
1058
  }
896
1059
  catch (e) {
897
- api_1.handleResponseError(e);
1060
+ (0, api_1.handleResponseError)(e);
898
1061
  }
899
1062
  }
900
1063
  /**
@@ -949,8 +1112,7 @@ class BitGoAPI {
949
1112
  * @returns {String} base58 random password
950
1113
  */
951
1114
  generateRandomPassword(numWords = 5) {
952
- const bytes = sjcl.codec.bytes.fromBits(sjcl.random.randomWords(numWords));
953
- return bs58.encode(bytes);
1115
+ return (0, sdk_core_1.generateRandomPassword)(numWords);
954
1116
  }
955
1117
  /**
956
1118
  * Logout of BitGo
@@ -1053,7 +1215,7 @@ class BitGoAPI {
1053
1215
  * @param userId
1054
1216
  */
1055
1217
  async getSigningKeyForUser(enterpriseId, userId) {
1056
- const user = userId !== null && userId !== void 0 ? userId : 'me';
1218
+ const user = userId ?? 'me';
1057
1219
  return this.get(this.url(`/enterprise/${enterpriseId}/user/${user}/signingkey`, 2))
1058
1220
  .query({})
1059
1221
  .result();
@@ -1193,14 +1355,7 @@ class BitGoAPI {
1193
1355
  }
1194
1356
  const networkName = sdk_core_1.common.Environments[this.getEnv()].network;
1195
1357
  const network = utxolib.networks[networkName];
1196
- let address;
1197
- try {
1198
- address = utxolib.address.fromBase58Check(params.address, network);
1199
- }
1200
- catch (e) {
1201
- return false;
1202
- }
1203
- return address.version === network.pubKeyHash || address.version === network.scriptHash;
1358
+ return (0, verifyAddress_1.verifyAddress)(params.address, network);
1204
1359
  }
1205
1360
  /**
1206
1361
  * Split a secret into shards using Shamir Secret Sharing.
@@ -1335,7 +1490,7 @@ class BitGoAPI {
1335
1490
  if (!_.isObject(eckey)) {
1336
1491
  throw new Error('eckey object required');
1337
1492
  }
1338
- return sdk_core_1.getSharedSecret(eckey, Buffer.from(otherPubKeyHex, 'hex')).toString('hex');
1493
+ return (0, sdk_core_1.getSharedSecret)(eckey, Buffer.from(otherPubKeyHex, 'hex')).toString('hex');
1339
1494
  }
1340
1495
  /**
1341
1496
  * Gets the user's private ECDH keychain
@@ -1481,6 +1636,29 @@ class BitGoAPI {
1481
1636
  oldPassword: this.calculateHMAC(user.username, oldPassword),
1482
1637
  password: this.calculateHMAC(user.username, newPassword),
1483
1638
  };
1639
+ // Calculate payload size in KB
1640
+ const payloadSizeBytes = JSON.stringify(updatePasswordParams).length;
1641
+ const payloadSizeKB = Math.ceil(payloadSizeBytes / 1024);
1642
+ // Check if batching flow is enabled
1643
+ try {
1644
+ const batchingFlowCheck = await this.get(this.url('/user/checkBatchingPasswordFlow', 2))
1645
+ .query({ payloadSize: payloadSizeKB.toString() })
1646
+ .result();
1647
+ if (batchingFlowCheck.isBatchingFlowEnabled) {
1648
+ await this.processKeychainPasswordUpdatesInBatches(updatePasswordParams.keychains, updatePasswordParams.v2_keychains, batchingFlowCheck.noOfBatches, 3);
1649
+ // Call changepassword API without keychains for batching flow
1650
+ return this.post(this.url('/user/changepassword'))
1651
+ .send({
1652
+ version: updatePasswordParams.version,
1653
+ oldPassword: updatePasswordParams.oldPassword,
1654
+ password: updatePasswordParams.password,
1655
+ })
1656
+ .result();
1657
+ }
1658
+ }
1659
+ catch (error) {
1660
+ // batching flow check failed
1661
+ }
1484
1662
  return this.post(this.url('/user/changepassword')).send(updatePasswordParams).result();
1485
1663
  }
1486
1664
  /**
@@ -1675,10 +1853,77 @@ class BitGoAPI {
1675
1853
  console.trace(err);
1676
1854
  }
1677
1855
  });
1678
- // use defaultConstants as the backup for keys that are not set in this._constants
1679
- return _.merge({}, sdk_core_1.defaultConstants(this.getEnv()), BitGoAPI._constants[this.getEnv()]);
1856
+ // use defaultConstants as the backup for keys that are not set in BitGoAPI._constants
1857
+ return _.merge({}, (0, sdk_core_1.defaultConstants)(this.getEnv()), BitGoAPI._constants?.[this.getEnv()] || {});
1858
+ }
1859
+ /**
1860
+ * Execute an asset request which does not need HMAC validation
1861
+ * @param url The URL for the asset request
1862
+ * @returns {Promise<any>} The response body
1863
+ */
1864
+ async executeAssetRequest(url) {
1865
+ const req = this.getAgentRequest('get', url);
1866
+ req.set('BitGo-SDK-Version', this._version);
1867
+ if (this._customProxyAgent) {
1868
+ req.agent(this._customProxyAgent);
1869
+ }
1870
+ // Set the request timeout to just above 5 minutes by default
1871
+ req.timeout(process.env.BITGO_TIMEOUT * 1000 || 305 * 1000);
1872
+ if (this.getAdditionalHeadersCb) {
1873
+ const additionalHeaders = this.getAdditionalHeadersCb('get', url);
1874
+ for (const { key, value } of additionalHeaders) {
1875
+ req.set(key, value);
1876
+ }
1877
+ }
1878
+ const result = await req;
1879
+ return result.body;
1880
+ }
1881
+ /**
1882
+ * Process keychain password updates in batches with retry logic
1883
+ * @param keychains - The v1 keychains to update
1884
+ * @param v2Keychains - The v2 keychains to update
1885
+ * @param noOfBatches - Number of batches to split the keychains into
1886
+ * @param maxRetries - Maximum number of retries per batch
1887
+ * @private
1888
+ */
1889
+ async processKeychainPasswordUpdatesInBatches(keychains, v2Keychains, noOfBatches, maxRetries) {
1890
+ // Split keychains into batches
1891
+ const v1KeychainEntries = Object.entries(keychains);
1892
+ const v2KeychainEntries = Object.entries(v2Keychains);
1893
+ const v1BatchSize = Math.ceil(v1KeychainEntries.length / noOfBatches);
1894
+ const v2BatchSize = Math.ceil(v2KeychainEntries.length / noOfBatches);
1895
+ // Call batching API for each batch with retry logic
1896
+ for (let i = 0; i < noOfBatches; i++) {
1897
+ const v1Batch = Object.fromEntries(v1KeychainEntries.slice(i * v1BatchSize, (i + 1) * v1BatchSize));
1898
+ const v2Batch = Object.fromEntries(v2KeychainEntries.slice(i * v2BatchSize, (i + 1) * v2BatchSize));
1899
+ let retryCount = 0;
1900
+ let success = false;
1901
+ while (retryCount < maxRetries && !success) {
1902
+ try {
1903
+ const response = await this.put(this.url('/user/keychains', 2))
1904
+ .send({
1905
+ keychains: v1Batch,
1906
+ v2_keychains: v2Batch,
1907
+ })
1908
+ .result();
1909
+ // Check if there are any failed keychains in the response
1910
+ const hasFailed = (response.failed?.v1 && Object.keys(response.failed.v1).length > 0) ||
1911
+ (response.failed?.v2 && Object.keys(response.failed.v2).length > 0);
1912
+ if (hasFailed) {
1913
+ throw new Error(`Batch ${i + 1} had failed keychains: ${JSON.stringify(response.failed)}`);
1914
+ }
1915
+ success = true;
1916
+ }
1917
+ catch (error) {
1918
+ retryCount++;
1919
+ if (retryCount >= maxRetries) {
1920
+ throw new Error(`Batch ${i + 1} failed after ${maxRetries} retries: ${error.message}`);
1921
+ }
1922
+ }
1923
+ }
1924
+ }
1680
1925
  }
1681
1926
  }
1682
1927
  exports.BitGoAPI = BitGoAPI;
1683
1928
  BitGoAPI._testnetWarningMessage = false;
1684
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYml0Z29BUEkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYml0Z29BUEkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsbURBcUI4QjtBQUM5Qix5Q0FBeUM7QUFDekMsZ0RBQWdEO0FBQ2hELG1EQUE4RDtBQUM5RCxvREFBb0Q7QUFDcEQscURBQXlEO0FBQ3pELDZCQUE2QjtBQUM3QixtQ0FBb0M7QUFDcEMsaUNBQTZCO0FBQzdCLDRCQUE0QjtBQUM1Qix1Q0FBdUM7QUFDdkMseUNBQXlDO0FBQ3pDLDhCQUE4QjtBQUM5QiwrQkFPZTtBQUNmLHVDQUE2QztBQXlDN0MsNENBQTZDO0FBQzdDLHlDQUEwQztBQUMxQyxNQUFNLEtBQUssR0FBRyxlQUFRLENBQUMsV0FBVyxDQUFDLENBQUM7QUFFcEMsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLGlCQUFpQixDQUFDLENBQUM7QUFDOUMsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUM7QUFDNUMsc0NBQXVDO0FBRXZDLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQztBQUN4QyxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUM7QUFDeEMsTUFBTSxnQkFBZ0IsR0FBRyxPQUFPLENBQUMsdUJBQXVCLENBQUMsQ0FBQztBQUMxRCxNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsaUJBQWlCLENBQUMsQ0FBQztBQUM5QyxNQUFNLGtCQUFrQixHQUFHLE9BQU8sQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO0FBRTlELElBQUksVUFBZSxDQUFDO0FBQ3BCLElBQUksQ0FBQywyQkFBUyxJQUFJLENBQUMsNkJBQVcsRUFBRTtJQUM5QixLQUFLLENBQUMsc0JBQXNCLENBQUMsQ0FBQztJQUM5QixVQUFVLEdBQUcsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLFVBQVUsQ0FBQztDQUNoRDtBQUVELE1BQU0scUJBQXFCLEdB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TSxDQUFDLFNBQVMsRUFBRTtZQUNwQixJQUFJLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEVBQUU7Z0JBQ2pDLE1BQU0sSUFBSSxLQUFLLENBQUMsa0JBQWtCLENBQUMsQ0FBQzthQUNyQztZQUNELFdBQVcsQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQztTQUMxQztRQUNELElBQUksTUFBTSxDQUFDLE1BQU0sRUFBRTtZQUNqQixJQUFJLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUU7Z0JBQzlCLE1BQU0sSUFBSSxLQUFLLENBQUMsa0JBQWtCLENBQUMsQ0FBQzthQUNyQztZQUNELFdBQVcsQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztTQUNwQztRQUNELElBQUksTUFBTSxDQUFDLE1BQU0sRUFBRTtZQUNqQixJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUU7Z0JBQ2pDLE1BQU0sSUFBSSxLQUFLLENBQUMsa0JBQWtCLENBQUMsQ0FBQzthQUNyQztZQUNELFdBQVcsQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztTQUNwQztRQUNELElBQUksTUFBTSxDQUFDLE1BQU0sRUFBRTtZQUNqQixJQUFJLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUU7Z0JBQzlCLE1BQU0sSUFBSSxLQUFLLENBQUMsa0JBQWtCLENBQUMsQ0FBQzthQUNyQztZQUNELFdBQVcsQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztTQUNwQztRQUNELElBQUksTUFBTSxDQUFDLFNBQVMsRUFBRTtZQUNwQixJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEVBQUU7Z0JBQ2xDLE1BQU0sSUFBSSxLQUFLLENBQUMsa0JBQWtCLENBQUMsQ0FBQzthQUNyQztZQUNE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QUMsQ0FBQzthQUNwQjtRQUNILENBQUMsQ0FBQyxDQUFDO1FBRUgsa0ZBQWtGO1FBQ2xGLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsMkJBQWdCLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsUUFBUSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzFGLENBQUM7O0FBMzJESCw0QkE0MkRDO0FBajJEa0IsK0JBQXNCLEdBQUcsS0FBSyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWxpYXNFbnZpcm9ubWVudHMsXG4gIEJhc2VDb2luLFxuICBiaXRjb2luLFxuICBCaXRHb0Jhc2UsXG4gIEJpdEdvUmVxdWVzdCxcbiAgQ29pbkNvbnN0cnVjdG9yLFxuICBjb21tb24sXG4gIERlY3J5cHRPcHRpb25zLFxuICBkZWZhdWx0Q29uc3RhbnRzLFxuICBFY2RoRGVyaXZlZEtleXBhaXIsXG4gIEVuY3J5cHRPcHRpb25zLFxuICBFbnZpcm9ubWVudE5hbWUsXG4gIGdldEFkZHJlc3NQMlBLSCxcbiAgZ2V0U2hhcmVkU2VjcmV0LFxuICBHZXRTaGFyaW5nS2V5T3B0aW9ucyxcbiAgR2V0U2lnbmluZ0tleUFwaSxcbiAgR2xvYmFsQ29pbkZhY3RvcnksXG4gIElSZXF1ZXN0VHJhY2VyLFxuICBtYWtlUmFuZG9tS2V5LFxuICBzYW5pdGl6ZUxlZ2FjeVBhdGgsXG59IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCAqIGFzIHNqY2wgZnJvbSAnQGJpdGdvLWJldGEvc2pjbCc7XG5pbXBvcnQgKiBhcyB1dHhvbGliIGZyb20gJ0BiaXRnby1iZXRhL3V0eG8tbGliJztcbmltcG9ydCB7IGJpcDMyLCBFQ1BhaXJJbnRlcmZhY2UgfSBmcm9tICdAYml0Z28tYmV0YS91dHhvLWxpYic7XG5pbXBvcnQgKiBhcyBiaXRjb2luTWVzc2FnZSBmcm9tICdiaXRjb2luanMtbWVzc2FnZSc7XG5pbXBvcnQgeyBpc0Jyb3dzZXIsIGlzV2ViV29ya2VyIH0gZnJvbSAnYnJvd3Nlci1vci1ub2RlJztcbmltcG9ydCAqIGFzIGJzNTggZnJvbSAnYnM1OCc7XG5pbXBvcnQgeyBjcmVhdGVIbWFjIH0gZnJvbSAnY3J5cHRvJztcbmltcG9ydCBkZWJ1Z0xpYiBmcm9tICdkZWJ1Zyc7XG5pbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgKiBhcyBzZWNwMjU2azEgZnJvbSAnc2VjcDI1NmsxJztcbmltcG9ydCAqIGFzIHN1cGVyYWdlbnQgZnJvbSAnc3VwZXJhZ2VudCc7XG5pbXBvcnQgKiBhcyB1cmxMaWIgZnJvbSAndXJsJztcbmltcG9ydCB7XG4gIGhhbmRsZVJlc3BvbnNlRXJyb3IsXG4gIGhhbmRsZVJlc3BvbnNlUmVzdWx0LFxuICBzZXJpYWxpemVSZXF1ZXN0RGF0YSxcbiAgc2V0UmVxdWVzdFF1ZXJ5U3RyaW5nLFxuICB0b0JpdGdvUmVxdWVzdCxcbiAgdmVyaWZ5UmVzcG9uc2UsXG59IGZyb20gJy4vYXBpJztcbmltcG9ydCB7IGRlY3J5cHQsIGVuY3J5cHQgfSBmcm9tICcuL2VuY3J5cHQnO1xuaW1wb3J0IHtcbiAgQWNjZXNzVG9rZW5PcHRpb25zLFxuICBBZGRBY2Nlc3NUb2tlbk9wdGlvbnMsXG4gIEFkZEFjY2Vzc1Rva2VuUmVzcG9uc2UsXG4gIEF1dGhlbnRpY2F0ZU9wdGlvbnMsXG4gIEF1dGhlbnRpY2F0ZVdpdGhBdXRoQ29kZU9wdGlvbnMsXG4gIEJpdEdvQVBJT3B0aW9ucyxcbiAgQml0R29Kc29uLFxuICBCaXRHb1NpbXVsYXRlV2ViaG9va09wdGlvbnMsXG4gIENhbGN1bGF0ZUhtYWNTdWJqZWN0T3B0aW9ucyxcbiAgQ2FsY3VsYXRlUmVxdWVzdEhlYWRlcnNPcHRpb25zLFxuICBDYWxjdWxhdGVSZXF1ZXN0SG1hY09wdGlvbnMsXG4gIENoYW5nZVBhc3N3b3JkT3B0aW9ucyxcbiAgRGVwcmVjYXRlZFZlcmlmeUFkZHJlc3NPcHRpb25zLFxuICBFc3RpbWF0ZUZlZU9wdGlvbnMsXG4gIEV4dGVuZFRva2VuT3B0aW9ucyxcbiAgR2V0RWNkaFNlY3JldE9wdGlvbnMsXG4gIEdldFVzZXJPcHRpb25zLFxuICBMaXN0V2ViaG9va05vdGlmaWNhdGlvbnNPcHRpb25zLFxuICBMb2dpblJlc3BvbnNlLFxuICBQaW5nT3B0aW9ucyxcbiAgUHJvY2Vzc2VkQXV0aGVudGljYXRpb25PcHRpb25zLFxuICBSZWNvbnN0aXR1dGVkU2VjcmV0LFxuICBSZWNvbnN0aXR1dGVTZWNyZXRPcHRpb25zLFxuICBSZWdpc3RlclB1c2hUb2tlbk9wdGlvbnMsXG4gIFJlbW92ZUFjY2Vzc1Rva2VuT3B0aW9ucyxcbiAgUmVxdWVzdEhlYWRlcnMsXG4gIFNwbGl0U2VjcmV0LFxuICBTcGxpdFNlY3JldE9wdGlvbnMsXG4gIFRva2VuSXNzdWFuY2UsXG4gIFRva2VuSXNzdWFuY2VSZXNwb25zZSxcbiAgVW5sb2NrT3B0aW9ucyxcbiAgVXNlcixcbiAgVmVyaWZ5UGFzc3dvcmRPcHRpb25zLFxuICBWZXJpZnlQdXNoVG9rZW5PcHRpb25zLFxuICBWZXJpZnlSZXNwb25zZUluZm8sXG4gIFZlcmlmeVJlc3BvbnNlT3B0aW9ucyxcbiAgVmVyaWZ5U2hhcmRzT3B0aW9ucyxcbiAgV2ViaG9va09wdGlvbnMsXG59IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHNoYW1pciA9IHJlcXVpcmUoJ3NlY3JldHMuanMtZ3JlbXBlJyk7XG5pbXBvcnQgcGpzb24gPSByZXF1aXJlKCcuLi9wYWNrYWdlLmpzb24nKTtcbmNvbnN0IGRlYnVnID0gZGVidWdMaWIoJ2JpdGdvOmFwaScpO1xuXG5jb25zdCBCbG9ja2NoYWluID0gcmVxdWlyZSgnLi92MS9ibG9ja2NoYWluJyk7XG5jb25zdCBLZXljaGFpbnMgPSByZXF1aXJlKCcuL3YxL2tleWNoYWlucycpO1xuaW1wb3J0IFdhbGxldCA9IHJlcXVpcmUoJy4vdjEvd2FsbGV0Jyk7XG5cbmNvbnN0IFdhbGxldHMgPSByZXF1aXJlKCcuL3YxL3dhbGxldHMnKTtcbmNvbnN0IE1hcmtldHMgPSByZXF1aXJlKCcuL3YxL21hcmtldHMnKTtcbmNvbnN0IFBlbmRpbmdBcHByb3ZhbHMgPSByZXF1aXJlKCcuL3YxL3BlbmRpbmdhcHByb3ZhbHMnKTtcbmNvbnN0IFRyYXZlbFJ1bGUgPSByZXF1aXJlKCcuL3YxL3RyYXZlbFJ1bGUnKTtcbmNvbnN0IFRyYW5zYWN0aW9uQnVpbGRlciA9IHJlcXVpcmUoJy4vdjEvdHJhbnNhY3Rpb25CdWlsZGVyJyk7XG5cbmxldCBwcm94eUFnZW50OiBhbnk7XG5pZiAoIWlzQnJvd3NlciAmJiAhaXNXZWJXb3JrZXIpIHtcbiAgZGVidWcoJ2VuYWJsaW5nIHByb3h5LWFnZW50Jyk7XG4gIHByb3h5QWdlbnQgPSByZXF1aXJlKCdwcm94eS1hZ2VudCcpLlByb3h5QWdlbnQ7XG59XG5cbmNvbnN0IHBhdGNoZWRSZXF1ZXN0TWV0aG9kcyA9IFsnZ2V0JywgJ3Bvc3QnLCAncHV0JywgJ2RlbCcsICdwYXRjaCddIGFzIGNvbnN0O1xuXG5leHBvcnQgY2xhc3MgQml0R29BUEkgaW1wbGVtZW50cyBCaXRHb0Jhc2Uge1xuICAvLyB2MSB0eXBlc1xuICBwcm90ZWN0ZWQgX2tleWNoYWluczogYW55O1xuICBwcm90ZWN0ZWQgX3dhbGxldHM6IGFueTtcbiAgcHJvdGVjdGVkIF9tYXJrZXRzPzogYW55O1xuICBwcm90ZWN0ZWQgX2Jsb2NrY2hhaW4/OiBhbnk7XG4gIHByb3RlY3RlZCBfdHJhdmVsUnVsZT86IGFueTtcbiAgcHJvdGVjdGVkIF9wZW5kaW5nQXBwcm92YWxzPzogYW55O1xuXG4gIHByb3RlY3RlZCBzdGF0aWMgX2NvbnN0YW50czogYW55O1xuICBwcm90ZWN0ZWQgc3RhdGljIF9jb25zdGFudHNFeHBpcmU6IGFueTtcbiAgcHJvdGVjdGVkIHN0YXRpYyBfdGVzdG5ldFdhcm5pbmdNZXNzYWdlID0gZmFsc2U7XG4gIHB1YmxpYyByZWFkb25seSBlbnY6IEVudmlyb25tZW50TmFtZTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IF9iYXNlVXJsOiBzdHJpbmc7XG4gIHByb3RlY3RlZCByZWFkb25seSBfYmFzZUFwaVVybDogc3RyaW5nO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgX2Jhc2VBcGlVcmxWMjogc3RyaW5nO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgX2VudjogRW52aXJvbm1lbnROYW1lO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgX2F1dGhWZXJzaW9uOiBFeGNsdWRlPEJpdEdvQVBJT3B0aW9uc1snYXV0aFZlcnNpb24nXSwgdW5kZWZpbmVkPiA9IDI7XG4gIHByb3RlY3RlZCBfaG1hY1ZlcmlmaWNhdGlvbiA9IHRydWU7XG4gIHByb3RlY3RlZCByZWFkb25seSBfcHJveHk/OiBzdHJpbmc7XG4gIHByb3RlY3RlZCBfdXNlcj86IFVzZXI7XG4gIHByb3RlY3RlZCBfZXh0ZW5zaW9uS2V5PzogRUNQYWlySW50ZXJmYWNlO1xuICBwcm90ZWN0ZWQgX3JlcUlkPzogSVJlcXVlc3RUcmFjZXI7XG4gIHByb3RlY3RlZCBfdG9rZW4/OiBzdHJpbmc7XG4gIHByb3RlY3RlZCBfdmVyc2lvbiA9IHBqc29uLnZlcnNpb247XG4gIHByb3RlY3RlZCBfdXNlckFnZW50Pzogc3RyaW5nO1xuICBwcm90ZWN0ZWQgX2VjZGhYcHJ2Pzogc3RyaW5nO1xuICBwcm90ZWN0ZWQgX3JlZnJlc2hUb2tlbj86IHN0cmluZztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IF9jbGllbnRJZD86IHN0cmluZztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IF9jbGllbnRTZWNyZXQ/OiBzdHJpbmc7XG4gIHByb3RlY3RlZCBfdmFsaWRhdGU6IGJvb2xlYW47XG4gIHB1YmxpYyByZWFkb25seSBjb29raWVzUHJvcGFnYXRpb25FbmFibGVkOiBib29sZWFuO1xuXG4gIGNvbnN0cnVjdG9yKHBhcmFtczogQml0R29BUElPcHRpb25zID0ge30pIHtcbiAgICB0aGlzLmNvb2tpZXNQcm9wYWdhdGlvbkVuYWJsZWQgPSBmYWxzZTtcbiAgICBpZiAoXG4gICAgICAhY29tbW9uLnZhbGlkYXRlUGFyYW1zKFxuICAgICAgICBwYXJhbXMsXG4gICAgICAgIFtdLFxuICAgICAgICBbXG4gICAgICAgICAgJ2FjY2Vzc1Rva2VuJyxcbiAgICAgICAgICAndXNlckFnZW50JyxcbiAgICAgICAgICAnY3VzdG9tUm9vdFVSSScsXG4gICAgICAgICAgJ2N1c3RvbUJpdGNvaW5OZXR3b3JrJyxcbiAgICAgICAgICAnc2VydmVyWHB1YicsXG4gICAgICAgICAgJ3N0ZWxsYXJGZWRlcmF0aW9uU2VydmVyVXJsJyxcbiAgICAgICAgXVxuICAgICAgKSB8fFxuICAgICAgKHBhcmFtcy51c2VQcm9kdWN0aW9uICYmICFfLmlzQm9vbGVhbihwYXJhbXMudXNlUHJvZHVjdGlvbikpXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYXJndW1lbnQnKTtcbiAgICB9XG5cbiAgICAvLyBCeSBkZWZhdWx0LCB3ZSBvcGVyYXRlIG9uIHRoZSB0ZXN0IHNlcnZlci5cbiAgICAvLyBEZXByZWNhdGUgdXNlUHJvZHVjdGlvbiBpbiB0aGUgZnV0dXJlXG4gICAgbGV0IGVudjogRW52aXJvbm1lbnROYW1lO1xuXG4gICAgaWYgKHBhcmFtcy51c2VQcm9kdWN0aW9uKSB7XG4gICAgICBpZiAocGFyYW1zLmVudiAmJiBwYXJhbXMuZW52ICE9PSAncHJvZCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjYW5ub3QgdXNlIHVzZVByb2R1Y3Rpb24gd2hlbiBlbnY9JyArIHBhcmFtcy5lbnYpO1xuICAgICAgfVxuICAgICAgZW52ID0gJ3Byb2QnO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICBwYXJhbXMuY3VzdG9tUm9vdFVSSSB8fFxuICAgICAgcGFyYW1zLmN1c3RvbUJpdGNvaW5OZXR3b3JrIHx8XG4gICAgICBwYXJhbXMuY3VzdG9tU2lnbmluZ0FkZHJlc3MgfHxcbiAgICAgIHBhcmFtcy5zZXJ2ZXJYcHViIHx8XG4gICAgICBwcm9jZXNzLmVudi5CSVRHT19DVVNUT01fUk9PVF9VUkkgfHxcbiAgICAgIHByb2Nlc3MuZW52LkJJVEdPX0NVU1RPTV9CSVRDT0lOX05FVFdPUktcbiAgICApIHtcbiAgICAgIC8vIGZvciBicmFuY2ggZGVwbG95cywgd2Ugd2FudCB0byBiZSBhYmxlIHRvIHNwZWNpZnkgY3VzdG9tIGVuZHBvaW50cyB3aGlsZSBzdGlsbFxuICAgICAgLy8gbWFpbnRhaW5pbmcgdGhlIG5hbWUgb2Ygc3BlY2lmaWVkIHRoZSBlbnZpcm9ubWVudFxuICAgICAgZW52ID0gcGFyYW1zLmVudiA9PT0gJ2JyYW5jaCcgPyAnYnJhbmNoJyA6ICdjdXN0b20nO1xuICAgICAgaWYgKHBhcmFtcy5jdXN0b21Sb290VVJJKSB7XG4gICAgICAgIGNvbW1vbi5FbnZpcm9ubWVudHNbZW52XS51cmkgPSBwYXJhbXMuY3VzdG9tUm9vdFVSSTtcbiAgICAgIH1cbiAgICAgIGlmIChwYXJhbXMuY3VzdG9tQml0Y29pbk5ldHdvcmspIHtcbiAgICAgICAgY29tbW9uLkVudmlyb25tZW50c1tlbnZdLm5ldHdvcmsgPSBwYXJhbXMuY3VzdG9tQml0Y29pbk5ldHdvcms7XG4gICAgICB9XG4gICAgICBpZiAocGFyYW1zLmN1c3RvbVNpZ25pbmdBZGRyZXNzKSB7XG4gICAgICAgIChjb21tb24uRW52aXJvbm1lbnRzW2Vudl0gYXMgYW55KS5jdXN0b21TaWduaW5nQWRkcmVzcyA9IHBhcmFtcy5jdXN0b21TaWduaW5nQWRkcmVzcztcbiAgICAgIH1cbiAgICAgIGlmIChwYXJhbXMuc2VydmVyWHB1Yikge1xuICAgICAgICBjb21tb24uRW52aXJvbm1lbnRzW2Vudl0uc2VydmVyWHB1YiA9IHBhcmFtcy5zZXJ2ZXJYcHViO1xuICAgICAgfVxuICAgICAgaWYgKHBhcmFtcy5zdGVsbGFyRmVkZXJhdGlvblNlcnZlclVybCkge1xuICAgICAgICBjb21tb24uRW52aXJvbm1lbnRzW2Vudl0uc3RlbGxhckZlZGVyYXRpb25TZXJ2ZXJVcmwgPSBwYXJhbXMuc3RlbGxhckZlZGVyYXRpb25TZXJ2ZXJVcmw7XG4gICAgICB9XG4gICAgICBpZiAocGFyYW1zLmNvb2tpZXNQcm9wYWdhdGlvbkVuYWJsZWQpIHtcbiAgICAgICAgdGhpcy5jb29raWVzUHJvcGFnYXRpb25FbmFibGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgZW52ID0gcGFyYW1zLmVudiB8fCAocHJvY2Vzcy5lbnYuQklUR09fRU5WIGFzIEVudmlyb25tZW50TmFtZSk7XG4gICAgfVxuXG4gICAgLy8gaWYgdGhpcyBoYXNuJ3QgYmVlbiBzZXQgdG8gdHJ1ZSBhbHJlYWR5IHNvbWUgY29uZGl0aW9ucyBhcmUgbm90IG1ldFxuICAgIGlmIChwYXJhbXMuY29va2llc1Byb3BhZ2F0aW9uRW5hYmxlZCAmJiAhdGhpcy5jb29raWVzUHJvcGFnYXRpb25FbmFibGVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nvb2tpZXMgYXJlIG9ubHkgYWxsb3dlZCB3aGVuIGN1c3RvbSBVUklzIGFyZSBpbiB1c2UnKTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLmF1dGhWZXJzaW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuX2F1dGhWZXJzaW9uID0gcGFyYW1zLmF1dGhWZXJzaW9uO1xuICAgIH1cblxuICAgIC8vIGlmIHRoaXMgZW52IGlzIGFuIGFsaWFzLCBzd2FwIGl0IG91dCB3aXRoIHRoZSBlcXVpdmFsZW50IHN1cHBvcnRlZCBlbnZpcm9ubWVudFxuICAgIGlmIChlbnYgaW4gQWxpYXNFbnZpcm9ubWVudHMpIHtcbiAgICAgIGVudiA9IEFsaWFzRW52aXJvbm1lbnRzW2Vudl07XG4gICAgfVxuXG4gICAgaWYgKGVudiA9PT0gJ2N1c3RvbScgJiYgXy5pc1VuZGVmaW5lZChjb21tb24uRW52aXJvbm1lbnRzW2Vudl0udXJpKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnbXVzdCB1c2UgLS1jdXN0b21yb290dXJpIG9yIHNldCB0aGUgQklUR09fQ1VTVE9NX1JPT1RfVVJJIGVudmlyb25tZW50IHZhcmlhYmxlIHdoZW4gdXNpbmcgdGhlIGN1c3RvbSBlbnZpcm9ubWVudCdcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKGVudikge1xuICAgICAgaWYgKGNvbW1vbi5FbnZpcm9ubWVudHNbZW52XSkge1xuICAgICAgICB0aGlzLl9iYXNlVXJsID0gY29tbW9uLkVudmlyb25tZW50c1tlbnZdLnVyaTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBlbnZpcm9ubWVudCAnICsgZW52ICsgJy4gU3VwcG9ydGVkIGVudmlyb25tZW50czogcHJvZCwgdGVzdCwgZGV2LCBsYXRlc3QnKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgZW52ID0gJ3Rlc3QnO1xuICAgICAgaWYgKCFCaXRHb0FQSS5fdGVzdG5ldFdhcm5pbmdNZXNzYWdlKSB7XG4gICAgICAgIEJpdEdvQVBJLl90ZXN0bmV0V2FybmluZ01lc3NhZ2UgPSB0cnVlO1xuICAgICAgICBjb25zb2xlLmxvZygnQml0R28gU0RLIGVudiBub3Qgc2V0IC0gZGVmYXVsdGluZyB0byB0ZXN0IGF0IHRlc3QuYml0Z28uY29tLicpO1xuICAgICAgfVxuICAgICAgdGhpcy5fYmFzZVVybCA9IGNvbW1vbi5FbnZpcm9ubWVudHNbZW52XS51cmk7XG4gICAgfVxuICAgIHRoaXMuX2VudiA9IHRoaXMuZW52ID0gZW52O1xuXG4gICAgY29uc3Qgc3VwcG9ydGVkQXBpVG9rZW5zID0gWydldGhlcnNjYW5BcGlUb2tlbicsICdwb2x5Z29uc2NhbkFwaVRva2VuJywgJ3Nub3d0cmFjZUFwaVRva2VuJ107XG5cbiAgICBPYmplY3Qua2V5cyhwYXJhbXMpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgaWYgKHN1cHBvcnRlZEFwaVRva2Vucy5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgIGNvbW1vbi5FbnZpcm9ubWVudHNbZW52XVtrZXldID0gcGFyYW1zW2tleV07XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjb21tb24uc2V0TmV0d29yayhjb21tb24uRW52aXJvbm1lbnRzW2Vudl0ubmV0d29yayk7XG5cbiAgICB0aGlzLl9iYXNlQXBpVXJsID0gdGhpcy5fYmFzZVVybCArICcvYXBpL3YxJztcbiAgICB0aGlzLl9iYXNlQXBpVXJsVjIgPSB0aGlzLl9iYXNlVXJsICsgJy9hcGkvdjInO1xuICAgIHRoaXMuX3Rva2VuID0gcGFyYW1zLmFjY2Vzc1Rva2VuO1xuICAgIHRoaXMuX3VzZXJBZ2VudCA9IHBhcmFtcy51c2VyQWdlbnQgfHwgJ0JpdEdvSlMtYXBpLycgKyB0aGlzLnZlcnNpb24oKTtcbiAgICB0aGlzLl9yZXFJZCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9yZWZyZXNoVG9rZW4gPSBwYXJhbXMucmVmcmVzaFRva2VuO1xuICAgIHRoaXMuX2NsaWVudElkID0gcGFyYW1zLmNsaWVudElkO1xuICAgIHRoaXMuX2NsaWVudFNlY3JldCA9IHBhcmFtcy5jbGllbnRTZWNyZXQ7XG4gICAgdGhpcy5fa2V5Y2hhaW5zID0gbnVsbDtcbiAgICB0aGlzLl93YWxsZXRzID0gbnVsbDtcblxuICAgIC8vIHdoZXRoZXIgdG8gcGVyZm9ybSBleHRyYSBjbGllbnQtc2lkZSB2YWxpZGF0aW9uIGZvciBzb21lIHRoaW5ncywgc3VjaCBhc1xuICAgIC8vIGFkZHJlc3MgdmFsaWRhdGlvbiBvciBzaWduYXR1cmUgdmFsaWRhdGlvbi4gZGVmYXVsdHMgdG8gdHJ1ZSwgYnV0IGNhbiBiZVxuICAgIC8vIHR1cm5lZCBvZmYgYnkgc2V0dGluZyB0byBmYWxzZS4gY2FuIGFsc28gYmUgb3ZlcnJpZGRlbiBpbmRpdmlkdWFsbHkgaW4gdGhlXG4gICAgLy8gZnVuY3Rpb25zIHRoYXQgdXNlIGl0LlxuICAgIHRoaXMuX3ZhbGlkYXRlID0gcGFyYW1zLnZhbGlkYXRlID09PSB1bmRlZmluZWQgPyB0cnVlIDogcGFyYW1zLnZhbGlkYXRlO1xuXG4gICAgaWYgKCFwYXJhbXMuaG1hY1ZlcmlmaWNhdGlvbiAmJiBwYXJhbXMuaG1hY1ZlcmlmaWNhdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoKGVudiA9PSAncHJvZCcgfHwgZW52ID09ICdhZG1pblByb2QnKSAmJiBjb21tb24uRW52aXJvbm1lbnRzW2Vudl0uaG1hY1ZlcmlmaWNhdGlvbkVuZm9yY2VkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGRpc2FibGUgcmVxdWVzdCBITUFDIHZlcmlmaWNhdGlvbiBpbiBlbnZpcm9ubWVudCAke3RoaXMuZ2V0RW52KCl9YCk7XG4gICAgICB9XG4gICAgICBkZWJ1ZygnSE1BQyB2ZXJpZmljYXRpb24gZXhwbGljaXRseSBkaXNhYmxlZCBieSBjb25zdHJ1Y3RvciBvcHRpb24nKTtcbiAgICAgIHRoaXMuX2htYWNWZXJpZmljYXRpb24gPSBwYXJhbXMuaG1hY1ZlcmlmaWNhdGlvbjtcbiAgICB9XG4gICAgaWYgKCFwYXJhbXMucHJveHkgJiYgcHJvY2Vzcy5lbnYuQklUR09fVVNFX1BST1hZKSB7XG4gICAgICBwYXJhbXMucHJveHkgPSBwcm9jZXNzLmVudi5CSVRHT19VU0VfUFJPWFk7XG4gICAgfVxuXG4gICAgaWYgKChwcm9jZXNzIGFzIGFueSkuYnJvd3NlciAmJiBwYXJhbXMucHJveHkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignY2Fubm90IHVzZSBodHRwcyBwcm94eSBwYXJhbXMgd2hpbGUgaW4gYnJvd3NlcicpO1xuICAgIH1cblxuICAgIHRoaXMuX3Byb3h5ID0gcGFyYW1zLnByb3h5O1xuXG4gICAgLy8gY2FwdHVyZSBvdXRlciBzdGFjayBzbyB3ZSBoYXZlIHVzZWZ1bCBkZWJ1ZyBpbmZvcm1hdGlvbiBpZiBmZXRjaCBjb25zdGFudHMgZmFpbHNcbiAgICBjb25zdCBlID0gbmV3IEVycm9yKCk7XG5cbiAgICAvLyBLaWNrIG9mZiBmaXJzdCBsb2FkIG9mIGNvbnN0YW50c1xuICAgIHRoaXMuZmV0Y2hDb25zdGFudHMoKS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICBpZiAoZXJyKSB7XG4gICAgICAgIC8vIG1ha2Ugc3VyZSBhbiBlcnJvciBkb2VzIG5vdCB0ZXJtaW5hdGUgdGhlIGVudGlyZSBzY3JpcHRcbiAgICAgICAgY29uc29sZS5lcnJvcignZmFpbGVkIHRvIGZldGNoIGluaXRpYWwgY2xpZW50IGNvbnN0YW50cyBmcm9tIEJpdEdvJyk7XG4gICAgICAgIGRlYnVnKGUuc3RhY2spO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIHN1cGVyYWdlbnQgcmVxdWVzdCBmb3Igc3BlY2lmaWVkIGh0dHAgbWV0aG9kIGFuZCBVUkwgY29uZmlndXJlZCB0byB0aGUgU0RLIGNvbmZpZ3VyYXRpb25cbiAgICogQHBhcmFtIG1ldGhvZCAtIGh0dHAgbWV0aG9kIGZvciB0aGUgbmV3IHJlcXVlc3RcbiAgICogQHBhcmFtIHVybCAtIFVSTCBmb3IgdGhlIG5ldyByZXF1ZXN0XG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0QWdlbnRSZXF1ZXN0KG1ldGhvZDogKHR5cGVvZiBwYXRjaGVkUmVxdWVzdE1ldGhvZHMpW251bWJlcl0sIHVybDogc3RyaW5nKTogc3VwZXJhZ2VudC5TdXBlckFnZW50UmVxdWVzdCB7XG4gICAgbGV0IHJlcTogc3VwZXJhZ2VudC5TdXBlckFnZW50UmVxdWVzdCA9IHN1cGVyYWdlbnRbbWV0aG9kXSh1cmwpO1xuICAgIGlmICh0aGlzLmNvb2tpZXNQcm9wYWdhdGlvbkVuYWJsZWQpIHtcbiAgICAgIHJlcSA9IHJlcS53aXRoQ3JlZGVudGlhbHMoKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcTtcbiAgfVxuICAvKipcbiAgICogQ3JlYXRlIGEgYmFzZWNvaW4gb2JqZWN0XG4gICAqIEBwYXJhbSBuYW1lXG4gICAqL1xuICBwdWJsaWMgY29pbihuYW1lOiBzdHJpbmcpOiBCYXNlQ29pbiB7XG4gICAgcmV0dXJuIEdsb2JhbENvaW5GYWN0b3J5LmdldEluc3RhbmNlKHRoaXMsIG5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiB0aGUgY3VycmVudCBCaXRHbyBlbnZpcm9ubWVudFxuICAgKi9cbiAgZ2V0RW52KCk6IEVudmlyb25tZW50TmFtZSB7XG4gICAgcmV0dXJuIHRoaXMuX2VudjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIGN1cnJlbnQgYXV0aCB2ZXJzaW9uIHVzZWQgZm9yIHJlcXVlc3RzIHRvIHRoZSBCaXRHbyBzZXJ2ZXJcbiAgICovXG4gIGdldEF1dGhWZXJzaW9uKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2F1dGhWZXJzaW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgaXMgYSBwYXRjaGluZyBmdW5jdGlvbiB3aGljaCBjYW4gYXBwbHkgb3VyIGF1dGhvcml6YXRpb25cbiAgICogaGVhZGVycyB0byBhbnkgb3V0Ym91bmQgcmVxdWVzdC5cbiAgICogQHBhcmFtIG1ldGhvZFxuICAgKi9cbiAgcHJpdmF0ZSByZXF1ZXN0UGF0Y2gobWV0aG9kOiAodHlwZW9mIHBhdGNoZWRSZXF1ZXN0TWV0aG9kcylbbnVtYmVyXSwgdXJsOiBzdHJpbmcpIHtcbiAgICBjb25zdCByZXEgPSB0aGlzLmdldEFnZW50UmVxdWVzdChtZXRob2QsIHVybCk7XG4gICAgaWYgKHRoaXMuX3Byb3h5ICYmIHByb3h5QWdlbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgZGVidWcoJ3Byb3h5aW5nIHJlcXVlc3QgdGhyb3VnaCAlcycsIHRoaXMuX3Byb3h5KTtcbiAgICAgIGNvbnN0IGFnZW50ID0gbmV3IHByb3h5QWdlbnQodGhpcy5fcHJveHkpO1xuICAgICAgaWYgKGFnZW50KSB7XG4gICAgICAgIHJlcS5hZ2VudChhZ2VudCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgb3JpZ2luYWxUaGVuID0gcmVxLnRoZW4uYmluZChyZXEpO1xuICAgIHJlcS50aGVuID0gKG9uZnVsZmlsbGVkLCBvbnJlamVjdGVkKSA9PiB7XG4gICAgICAvLyBpbnRlcmNlcHQgYSByZXF1ZXN0IGJlZm9yZSBpdCdzIHN1Ym1pdHRlZCB0byB0aGUgc2VydmVyIGZvciB2MiBhdXRoZW50aWNhdGlvbiAoYmFzZWQgb24gdG9rZW4pXG4gICAgICBpZiAodGhpcy5fdmVyc2lvbikge1xuICAgICAgICAvLyBUT0RPIC0gZGVjaWRlIHdoZXJlIHRvIGdldCB2ZXJzaW9uXG4gICAgICAgIHJlcS5zZXQoJ0JpdEdvLVNESy1WZXJzaW9uJywgdGhpcy5fdmVyc2lvbik7XG4gICAgICB9XG5cbiAgICAgIGlmICghXy5pc1VuZGVmaW5lZCh0aGlzLl9yZXFJZCkpIHtcbiAgICAgICAgcmVxLnNldCgnUmVxdWVzdC1JRCcsIHRoaXMuX3JlcUlkLnRvU3RyaW5nKCkpO1xuXG4gICAgICAgIC8vIGluY3JlbWVudCBhZnRlciBzZXR0aW5nIHRoZSBoZWFkZXIgc28gdGhlIHNlcXVlbmNlIG51bWJlcnMgc3RhcnQgYXQgMFxuICAgICAgICB0aGlzLl9yZXFJZC5pbmMoKTtcblxuICAgICAgICAvLyByZXF1ZXN0IGlkcyBtdXN0IGJlIHNldCBiZWZvcmUgZWFjaCByZXF1ZXN0IGluc3RlYWQgb2YgYmVpbmcga2VwdFxuICAgICAgICAvLyBpbnNpZGUgdGhlIGJpdGdvIG9iamVjdC4gVGhpcyBpcyB0byBwcmV2ZW50IHJlZW50cmFuY3kgaXNzdWVzIHdoZXJlXG4gICAgICAgIC8vIG11bHRpcGxlIHNpbXVsdGFuZW91cyByZXF1ZXN0cyBjb3VsZCBjYXVzZSBpbmNvcnJlY3QgcmVxSWRzIHRvIGJlIHVzZWRcbiAgICAgICAgZGVsZXRlIHRoaXMuX3JlcUlkO1xuICAgICAgfVxuXG4gICAgICAvLyBwcmV2ZW50IElFIGZyb20gY2FjaGluZyByZXF1ZXN0c1xuICAgICAgcmVxLnNldCgnSWYtTW9kaWZpZWQtU2luY2UnLCAnTW9uLCAyNiBKdWwgMTk5NyAwNTowMDowMCBHTVQnKTtcblxuICAgICAgaWYgKCEocHJvY2VzcyBhcyBhbnkpLmJyb3dzZXIgJiYgdGhpcy5fdXNlckFnZW50KSB7XG4gICAgICAgIC8vIElmIG5vdCBpbiB0aGUgYnJvd3Nlciwgc2V0IHRoZSBVc2VyLUFnZW50LiBCcm93c2VycyBkb24ndCBhbGxvd1xuICAgICAgICAvLyBzZXR0aW5nIG9mIFVzZXItQWdlbnQsIHNvIHdlIG11c3QgZGlzYWJsZSB0aGlzIHdoZW4gcnVuIGluIHRoZVxuICAgICAgICAvLyBicm93c2VyIChicm93c2VyaWZ5IHNldHMgcHJvY2Vzcy5icm93c2VyKS5cbiAgICAgICAgcmVxLnNldCgnVXNlci1BZ2VudCcsIHRoaXMuX3VzZXJBZ2VudCk7XG4gICAgICB9XG5cbiAgICAgIC8vIFNldCB0aGUgcmVxdWVzdCB0aW1lb3V0IHRvIGp1c3QgYWJvdmUgNSBtaW51dGVzIGJ5IGRlZmF1bHRcbiAgICAgIHJlcS50aW1lb3V0KChwcm9jZXNzLmVudi5CSVRHT19USU1FT1VUIGFzIGFueSkgKiAxMDAwIHx8IDMwNSAqIDEwMDApO1xuXG4gICAgICAvLyBpZiB0aGVyZSBpcyBubyB0b2tlbiwgYW5kIHdlJ3JlIG5vdCBsb2dnZWQgaW4sIHRoZSByZXF1ZXN0IGNhbm5vdCBiZSB2MiBhdXRoZW50aWNhdGVkXG4gICAgICByZXEuaXNWMkF1dGhlbnRpY2F0ZWQgPSB0cnVlO1xuICAgICAgcmVxLmF1dGhlbnRpY2F0aW9uVG9rZW4gPSB0aGlzLl90b2tlbjtcbiAgICAgIC8vIHNvbWUgb2YgdGhlIG9sZGVyIHRva2VucyBhcHBlYXIgdG8gYmUgb25seSA0MCBjaGFyYWN0ZXJzIGxvbmdcbiAgICAgIGlmICgodGhpcy5fdG9rZW4gJiYgdGhpcy5fdG9rZW4ubGVuZ3RoICE9PSA2NyAmJiB0aGlzLl90b2tlbi5pbmRleE9mKCd2MngnKSAhPT0gMCkgfHwgcmVxLmZvcmNlVjFBdXRoKSB7XG4gICAgICAgIC8vIHVzZSB0aGUgb2xkIG1ldGhvZFxuICAgICAgICByZXEuaXNWMkF1dGhlbnRpY2F0ZWQgPSBmYWxzZTtcblxuICAgICAgICByZXEuc2V0KCdBdXRob3JpemF0aW9uJywgJ0JlYXJlciAnICsgdGhpcy5fdG9rZW4pO1xuICAgICAgICBkZWJ1Zygnc2VuZGluZyB2MSAlcyByZXF1ZXN0IHRvICVzIHdpdGggdG9rZW4gJXMnLCBtZXRob2QsIHVybCwgdGhpcy5fdG9rZW4/LnN1YnN0cigwLCA4KSk7XG4gICAgICAgIHJldHVybiBvcmlnaW5hbFRoZW4ob25mdWxmaWxsZWQpLmNhdGNoKG9ucmVqZWN0ZWQpO1xuICAgICAgfVxuXG4gICAgICByZXEuc2V0KCdCaXRHby1BdXRoLVZlcnNpb24nLCB0aGlzLl9hdXRoVmVyc2lvbiA9PT0gMyA/ICczLjAnIDogJzIuMCcpO1xuXG4gICAgICBpZiAodGhpcy5fdG9rZW4pIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IHNlcmlhbGl6ZVJlcXVlc3REYXRhKHJlcSk7XG4gICAgICAgIHNldFJlcXVlc3RRdWVyeVN0cmluZyhyZXEpO1xuXG4gICAgICAgIGNvbnN0IHJlcXVlc3RQcm9wZXJ0aWVzID0gdGhpcy5jYWxjdWxhdGVSZXF1ZXN0SGVhZGVycyh7XG4gICAgICAgICAgdXJsOiByZXEudXJsLFxuICAgICAgICAgIHRva2VuOiB0aGlzLl90b2tlbixcbiAgICAgICAgICBtZXRob2QsXG4gICAgICAgICAgdGV4dDogZGF0YSB8fCAnJyxcbiAgICAgICAgfSk7XG4gICAgICAgIHJlcS5zZXQoJ0F1dGgtVGltZXN0YW1wJywgcmVxdWVzdFByb3BlcnRpZXMudGltZXN0YW1wLnRvU3RyaW5nKCkpO1xuXG4gICAgICAgIC8vIHdlJ3JlIG5vdCBzZW5kaW5nIHRoZSBhY3R1YWwgdG9rZW4sIGJ1dCBvbmx5IGl0cyBoYXNoXG4gICAgICAgIHJlcS5zZXQoJ0F1dGhvcml6YXRpb24nLCAnQmVhcmVyICcgKyByZXF1ZXN0UHJvcGVydGllcy50b2tlbkhhc2gpO1xuICAgICAgICBkZWJ1Zygnc2VuZGluZyB2MiAlcyByZXF1ZXN0IHRvICVzIHdpdGggdG9rZW4gJXMnLCBtZXRob2QsIHVybCwgdGhpcy5fdG9rZW4/LnN1YnN0cigwLCA4KSk7XG5cbiAgICAgICAgLy8gc2V0IHRoZSBITUFDXG4gICAgICAgIHJlcS5zZXQoJ0hNQUMnLCByZXF1ZXN0UHJvcGVydGllcy5obWFjKTtcbiAgICAgIH1cblxuICAgICAgLyoqXG4gICAgICAgKiBWZXJpZnkgdGhlIHJlc3BvbnNlIGJlZm9yZSBjYWxsaW5nIHRoZSBvcmlnaW5hbCBvbmZ1bGZpbGxlZCBoYW5kbGVyLFxuICAgICAgICogYW5kIG1ha2Ugc3VyZSBvbnJlamVjdGVkIGlzIGNhbGxlZCBpZiBhIHZlcmlmaWNhdGlvbiBlcnJvciBpcyBlbmNvdW50ZXJlZFxuICAgICAgICovXG4gICAgICBjb25zdCBuZXdPbkZ1bGZpbGxlZCA9IG9uZnVsZmlsbGVkXG4gICAgICAgID8gKHJlc3BvbnNlOiBzdXBlcmFnZW50LlJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICAvLyBITUFDIHZlcmlmaWNhdGlvbiBpcyBvbmx5IGFsbG93ZWQgdG8gYmUgc2tpcHBlZCBpbiBjZXJ0YWluIGVudmlyb25tZW50cy5cbiAgICAgICAgICAgIC8vIFRoaXMgaXMgY2hlY2tlZCBpbiB0aGUgY29uc3RydWN0b3IsIGJ1dCBjaGVja2luZyBpdCBhZ2FpbiBhdCByZXF1ZXN0IHRpbWVcbiAgICAgICAgICAgIC8vIHdpbGwgaGVscCBwcmV2ZW50IGFnYWluc3QgdGFtcGVyaW5nIG9mIHRoaXMgcHJvcGVydHkgYWZ0ZXIgdGhlIG9iamVjdCBpcyBjcmVhdGVkXG4gICAgICAgICAgICBpZiAoIXRoaXMuX2htYWNWZXJpZmljYXRpb24gJiYgIWNvbW1vbi5FbnZpcm9ubWVudHNbdGhpcy5nZXRFbnYoKV0uaG1hY1ZlcmlmaWNhdGlvbkVuZm9yY2VkKSB7XG4gICAgICAgICAgICAgIHJldHVybiBvbmZ1bGZpbGxlZChyZXNwb25zZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHZlcmlmaWVkUmVzcG9uc2UgPSB2ZXJpZnlSZXNwb25zZSh0aGlzLCB0aGlzLl90b2tlbiwgbWV0aG9kLCByZXEsIHJlc3BvbnNlKTtcbiAgICAgICAgICAgIHJldHVybiBvbmZ1bGZpbGxlZCh2ZXJpZmllZFJlc3BvbnNlKTtcbiAgICAgICAgICB9XG4gICAgICAgIDogbnVsbDtcbiAgICAgIHJldHVybiBvcmlnaW5hbFRoZW4obmV3T25GdWxmaWxsZWQpLmNhdGNoKG9ucmVqZWN0ZWQpO1xuICAgIH07XG4gICAgcmV0dXJuIHRvQml0Z29SZXF1ZXN0KHJlcSk7XG4gIH1cblxuICBnZXQodXJsOiBzdHJpbmcpOiBCaXRHb1JlcXVlc3Qge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3RQYXRjaCgnZ2V0JywgdXJsKTtcbiAgfVxuICBwb3N0KHVybDogc3RyaW5nKTogQml0R29SZXF1ZXN0IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0UGF0Y2goJ3Bvc3QnLCB1cmwpO1xuICB9XG4gIHB1dCh1cmw6IHN0cmluZyk6IEJpdEdvUmVxdWVzdCB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdFBhdGNoKCdwdXQnLCB1cmwpO1xuICB9XG4gIGRlbCh1cmw6IHN0cmluZyk6IEJpdEdvUmVxdWVzdCB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdFBhdGNoKCdkZWwnLCB1cmwpO1xuICB9XG4gIHBhdGNoKHVybDogc3RyaW5nKTogQml0R29SZXF1ZXN0IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0UGF0Y2goJ3BhdGNoJywgdXJsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGUgdGhlIEhNQUMgZm9yIHRoZSBnaXZlbiBrZXkgYW5kIG1lc3NhZ2VcbiAgICogQHBhcmFtIGtleSB7U3RyaW5nfSAtIHRoZSBrZXkgdG8gdXNlIGZvciB0aGUgSE1BQ1xuICAgKiBAcGFyYW0gbWVzc2FnZSB7U3RyaW5nfSAtIHRoZSBhY3R1YWwgbWVzc2FnZSB0byBITUFDXG4gICAqIEByZXR1cm5zIHsqfSAtIHRoZSByZXN1bHQgb2YgdGhlIEhNQUMgb3BlcmF0aW9uXG4gICAqL1xuICBjYWxjdWxhdGVITUFDKGtleTogc3RyaW5nLCBtZXNzYWdlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBjcmVhdGVIbWFjKCdzaGEyNTYnLCBrZXkpLnVwZGF0ZShtZXNzYWdlKS5kaWdlc3QoJ2hleCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZSB0aGUgc3ViamVjdCBzdHJpbmcgdGhhdCBpcyB0byBiZSBITUFDJ2VkIGZvciBhIEhUVFAgcmVxdWVzdCBvciByZXNwb25zZVxuICAgKiBAcGFyYW0gdXJsUGF0aCByZXF1ZXN0IHVybCwgaW5jbHVkaW5nIHF1ZXJ5IHBhcmFtc1xuICAgKiBAcGFyYW0gdGV4dCByZXF1ZXN0IGJvZHkgdGV4dFxuICAgKiBAcGFyYW0gdGltZXN0YW1wIHJlcXVlc3QgdGltZXN0YW1wIGZyb20gYERhdGUubm93KClgXG4gICAqIEBwYXJhbSBzdGF0dXNDb2RlIE9ubHkgc2V0IGZvciBIVFRQIHJlc3BvbnNlcywgbGVhdmUgYmxhbmsgZm9yIHJlcXVlc3RzXG4gICAqIEBwYXJhbSBtZXRob2QgcmVxdWVzdCBtZXRob2RcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGNhbGN1bGF0ZUhNQUNTdWJqZWN0KHsgdXJsUGF0aCwgdGV4dCwgdGltZXN0YW1wLCBzdGF0dXNDb2RlLCBtZXRob2QgfTogQ2FsY3VsYXRlSG1hY1N1YmplY3RPcHRpb25zKTogc3RyaW5nIHtcbiAgICBjb25zdCB1cmxEZXRhaWxzID0gdXJsTGliLnBhcnNlKHVybFBhdGgpO1xuICAgIGNvbnN0IHF1ZXJ5UGF0aCA9IHVybERldGFpbHMucXVlcnkgJiYgdXJsRGV0YWlscy5xdWVyeS5sZW5ndGggPiAwID8gdXJsRGV0YWlscy5wYXRoIDogdXJsRGV0YWlscy5wYXRobmFtZTtcbiAgICBpZiAoIV8uaXNVbmRlZmluZWQoc3RhdHVzQ29kZSkgJiYgXy5pc0ludGVnZXIoc3RhdHVzQ29kZSkgJiYgXy5pc0Zpbml0ZShzdGF0dXNDb2RlKSkge1xuICAgICAgaWYgKHRoaXMuX2F1dGhWZXJzaW9uID09PSAzKSB7XG4gICAgICAgIHJldHVybiBbbWV0aG9kLnRvVXBwZXJDYXNlKCksIHRpbWVzdGFtcCwgcXVlcnlQYXRoLCBzdGF0dXNDb2RlLCB0ZXh0XS5qb2luKCd8Jyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gW3RpbWVzdGFtcCwgcXVlcnlQYXRoLCBzdGF0dXNDb2RlLCB0ZXh0XS5qb2luKCd8Jyk7XG4gICAgfVxuICAgIGlmICh0aGlzLl9hdXRoVmVyc2lvbiA9PT0gMykge1xuICAgICAgcmV0dXJuIFttZXRob2QudG9VcHBlckNhc2UoKSwgdGltZXN0YW1wLCAnMy4wJywgcXVlcnlQYXRoLCB0ZXh0XS5qb2luKCd8Jyk7XG4gICAgfVxuICAgIHJldHVybiBbdGltZXN0YW1wLCBxdWVyeVBhdGgsIHRleHRdLmpvaW4oJ3wnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGUgdGhlIEhNQUMgZm9yIGFuIEhUVFAgcmVxdWVzdFxuICAgKi9cbiAgY2FsY3VsYXRlUmVxdWVzdEhNQUMoeyB1cmw6IHVybFBhdGgsIHRleHQsIHRpbWVzdGFtcCwgdG9rZW4sIG1ldGhvZCB9OiBDYWxjdWxhdGVSZXF1ZXN0SG1hY09wdGlvbnMpOiBzdHJpbmcge1xuICAgIGNvbnN0IHNpZ25hdHVyZVN1YmplY3QgPSB0aGlzLmNhbGN1bGF0ZUhNQUNTdWJqZWN0KHsgdXJsUGF0aCwgdGV4dCwgdGltZXN0YW1wLCBtZXRob2QgfSk7XG5cbiAgICAvLyBjYWxjdWxhdGUgdGhlIEhNQUNcbiAgICByZXR1cm4gdGhpcy5jYWxjdWxhdGVITUFDKHRva2VuLCBzaWduYXR1cmVTdWJqZWN0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGUgcmVxdWVzdCBoZWFkZXJzIHdpdGggSE1BQ1xuICAgKi9cbiAgY2FsY3VsYXRlUmVxdWVzdEhlYWRlcnMoeyB1cmwsIHRleHQsIHRva2VuLCBtZXRob2QgfTogQ2FsY3VsYXRlUmVxdWVzdEhlYWRlcnNPcHRpb25zKTogUmVxdWVzdEhlYWRlcnMge1xuICAgIGNvbnN0IHRpbWVzdGFtcCA9IERhdGUubm93KCk7XG4gICAgY29uc3QgaG1hYyA9IHRoaXMuY2FsY3VsYXRlUmVxdWVzdEhNQUMoeyB1cmwsIHRleHQsIHRpbWVzdGFtcCwgdG9rZW4sIG1ldGhvZCB9KTtcblxuICAgIC8vIGNhbGN1bGF0ZSB0aGUgU0hBMjU2IGhhc2ggb2YgdGhlIHRva2VuXG4gICAgY29uc3QgaGFzaERpZ2VzdCA9IHNqY2wuaGFzaC5zaGEyNTYuaGFzaCh0b2tlbik7XG4gICAgY29uc3QgdG9rZW5IYXNoID0gc2pjbC5jb2RlYy5oZXguZnJvbUJpdHMoaGFzaERpZ2VzdCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGhtYWMsXG4gICAgICB0aW1lc3RhbXAsXG4gICAgICB0b2tlbkhhc2gsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZnkgdGhlIEhNQUMgZm9yIGFuIEhUVFAgcmVzcG9uc2VcbiAgICovXG4gIHZlcmlmeVJlc3BvbnNlKHtcbiAgICB1cmw6IHVybFBhdGgsXG4gICAgc3RhdHVzQ29kZSxcbiAgICB0ZXh0LFxuICAgIHRpbWVzdGFtcCxcbiAgICB0b2tlbixcbiAgICBobWFjLFxuICAgIG1ldGhvZCxcbiAgfTogVmVyaWZ5UmVzcG9uc2VPcHRpb25zKTogVmVyaWZ5UmVzcG9uc2VJbmZvIHtcbiAgICBjb25zdCBzaWduYXR1cmVTdWJqZWN0ID0gdGhpcy5jYWxjdWxhdGVITUFDU3ViamVjdCh7XG4gICAgICB1cmxQYXRoLFxuICAgICAgdGV4dCxcbiAgICAgIHRpbWVzdGFtcCxcbiAgICAgIHN0YXR1c0NvZGUsXG4gICAgICBtZXRob2QsXG4gICAgfSk7XG5cbiAgICAvLyBjYWxjdWxhdGUgdGhlIEhNQUNcbiAgICBjb25zdCBleHBlY3RlZEhtYWMgPSB0aGlzLmNhbGN1bGF0ZUhNQUModG9rZW4sIHNpZ25hdHVyZVN1YmplY3QpO1xuXG4gICAgLy8gZGV0ZXJtaW5lIGlmIHRoZSByZXNwb25zZSBpcyBzdGlsbCB3aXRoaW4gdGhlIHZhbGlkaXR5IHdpbmRvdyAoNSBtaW51dGUgd2luZG93KVxuICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgY29uc3QgaXNJblJlc3BvbnNlVmFsaWRpdHlXaW5kb3cgPSB0aW1lc3RhbXAgPj0gbm93IC0gMTAwMCAqIDYwICogNSAmJiB0aW1lc3RhbXAgPD0gbm93O1xuXG4gICAgLy8gdmVyaWZ5IHRoZSBITUFDIGFuZCB0aW1lc3RhbXBcbiAgICByZXR1cm4ge1xuICAgICAgaXNWYWxpZDogZXhwZWN0ZWRIbWFjID09PSBobWFjLFxuICAgICAgZXhwZWN0ZWRIbWFjLFxuICAgICAgc2lnbmF0dXJlU3ViamVjdCxcbiAgICAgIGlzSW5SZXNwb25zZVZhbGlkaXR5V2luZG93LFxuICAgICAgdmVyaWZpY2F0aW9uVGltZTogbm93LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2ggdXNlZnVsIGNvbnN0YW50IHZhbHVlcyBmcm9tIHRoZSBCaXRHbyBzZXJ2ZXIuXG4gICAqIFRoZXNlIHZhbHVlcyBkbyBjaGFuZ2UgaW5mcmVxdWVudGx5LCBzbyB0aGV5IG5lZWQgdG8gYmUgZmV0Y2hlZCxcbiAgICogYnV0IGFyZSB1bmxpa2VseSB0byBjaGFuZ2UgZHVyaW5nIHRoZSBsaWZldGltZSBvZiBhIEJpdEdvIG9iamVjdCxcbiAgICogc28gdGhleSBjYW4gc2FmZWx5IGNhY2hlZC5cbiAgICovXG4gIGFzeW5jIGZldGNoQ29uc3RhbnRzKCk6IFByb21pc2U8YW55PiB7XG4gICAgY29uc3QgZW52ID0gdGhpcy5nZXRFbnYoKTtcblxuICAgIGlmICghQml0R29BUEkuX2NvbnN0YW50cykge1xuICAgICAgQml0R29BUEkuX2NvbnN0YW50cyA9IHt9O1xuICAgIH1cbiAgICBpZiAoIUJpdEdvQVBJLl9jb25zdGFudHNFeHBpcmUpIHtcbiAgICAgIEJpdEdvQVBJLl9jb25zdGFudHNFeHBpcmUgPSB7fTtcbiAgICB9XG5cbiAgICBpZiAoQml0R29BUEkuX2NvbnN0YW50c1tlbnZdICYmIEJpdEdvQVBJLl9jb25zdGFudHNFeHBpcmVbZW52XSAmJiBuZXcgRGF0ZSgpIDwgQml0R29BUEkuX2NvbnN0YW50c0V4cGlyZVtlbnZdKSB7XG4gICAgICByZXR1cm4gQml0R29BUEkuX2NvbnN0YW50c1tlbnZdO1xuICAgIH1cblxuICAgIC8vIGNsaWVudCBjb25zdGFudHMgY2FsbCBjYW5ub3QgYmUgYXV0aGVudGljYXRlZCB1c2luZyB0aGUgbm9ybWFsIEhNQUMgdmFsaWRhdGlvblxuICAgIC8vIHNjaGVtZSwgc28gd2UgbmVlZCB0byB1c2UgYSByYXcgc3VwZXJhZ2VudCBpbnN0YW5jZSB0byBkbyB0aGlzIHJlcXVlc3QuXG4gICAgLy8gUHJveHkgc2V0dGluZ3MgbXVzdCBzdGlsbCBiZSByZXNwZWN0ZWQgaG93ZXZlclxuICAgIGNvbnN0IHJlc3VsdFByb21pc2UgPSB0aGlzLmdldEFnZW50UmVxdWVzdCgnZ2V0JywgdGhpcy51cmwoJy9jbGllbnQvY29uc3RhbnRzJykpO1xuICAgIHJlc3VsdFByb21pc2Uuc2V0KCdCaXRHby1TREstVmVyc2lvbicsIHRoaXMuX3ZlcnNpb24pO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0ICh0aGlzLl9wcm94eSA/IHJlc3VsdFByb21pc2UucHJveHkodGhpcy5fcHJveHkpIDogcmVzdWx0UHJvbWlzZSk7XG4gICAgQml0R29BUEkuX2NvbnN0YW50c1tlbnZdID0gcmVzdWx0LmJvZHkuY29uc3RhbnRzO1xuXG4gICAgaWYgKHJlc3VsdC5ib2R5Py50dGwgJiYgdHlwZW9mIHJlc3VsdC5ib2R5Py50dGwgPT09ICdudW1iZXInKSB7XG4gICAgICBCaXRHb0FQSS5fY29uc3RhbnRzRXhwaXJlW2Vudl0gPSBuZXcgRGF0ZShuZXcgRGF0ZSgpLmdldFRpbWUoKSArIChyZXN1bHQuYm9keS50dGwgYXMgbnVtYmVyKSAqIDEwMDApO1xuICAgIH1cblxuICAgIHJldHVybiBCaXRHb0FQSS5fY29uc3RhbnRzW2Vudl07XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgdXJsIGZvciBjYWxsaW5nIEJpdEdvIHBsYXRmb3JtIEFQSXNcbiAgICogQHBhcmFtIHBhdGhcbiAgICogQHBhcmFtIHZlcnNpb25cbiAgICovXG4gIHVybChwYXRoOiBzdHJpbmcsIHZlcnNpb24gPSAxKTogc3RyaW5nIHtcbiAgICBjb25zdCBiYXNlVXJsID0gdmVyc2lvbiA9PT0gMiA/IHRoaXMuX2Jhc2VBcGlVcmxWMiA6IHRoaXMuX2Jhc2VBcGlVcmw7XG4gICAgcmV0dXJuIGJhc2VVcmwgKyBwYXRoO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIHVybCBmb3IgY2FsbGluZyBCaXRHbyBtaWNyb3NlcnZpY2UgQVBJc1xuICAgKi9cbiAgbWljcm9zZXJ2aWNlc1VybChwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9iYXNlVXJsICsgcGF0aDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSB2ZXJzaW9uIG9mIHRoZSBCaXRHb0pTIHBhY2thZ2VcbiAgICovXG4gIHZlcnNpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fdmVyc2lvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBUZXN0IGNvbm5lY3Rpdml0eSB0byB0aGUgc2VydmVyXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICovXG4gIHBpbmcoeyByZXFJZCB9OiBQaW5nT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBpZiAocmVxSWQpIHtcbiAgICAgIHRoaXMuX3JlcUlkID0gcmVxSWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZ2V0KHRoaXMudXJsKCcvcGluZycpKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgYSByZXF1ZXN0IHRyYWNlciB0byBwcm92aWRlIHJlcXVlc3QgSURzIGR1cmluZyBtdWx0aS1yZXF1ZXN0IHdvcmtmbG93c1xuICAgKi9cbiAgc2V0UmVxdWVzdFRyYWNlcihyZXFUcmFjZXI6IElSZXF1ZXN0VHJhY2VyKTogdm9pZCB7XG4gICAgaWYgKHJlcVRyYWNlcikge1xuICAgICAgdGhpcy5fcmVxSWQgPSByZXFUcmFjZXI7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFV0aWxpdHkgZnVuY3Rpb24gdG8gZW5jcnlwdCBsb2NhbGx5LlxuICAgKi9cbiAgZW5jcnlwdChwYXJhbXM6IEVuY3J5cHRPcHRpb25zKTogc3RyaW5nIHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ2lucHV0JywgJ3Bhc3N3b3JkJ10sIFtdKTtcbiAgICBpZiAoIXBhcmFtcy5wYXNzd29yZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBjYW5ub3QgZW5jcnlwdCB3aXRob3V0IHBhc3N3b3JkYCk7XG4gICAgfVxuICAgIHJldHVybiBlbmNyeXB0KHBhcmFtcy5wYXNzd29yZCwgcGFyYW1zLmlucHV0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWNyeXB0IGFuIGVuY3J5cHRlZCBzdHJpbmcgbG9jYWxseS5cbiAgICovXG4gIGRlY3J5cHQocGFyYW1zOiBEZWNyeXB0T3B0aW9ucyk6IHN0cmluZyB7XG4gICAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnaW5wdXQnLCAncGFzc3dvcmQnXSwgW10pO1xuICAgIGlmICghcGFyYW1zLnBhc3N3b3JkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYGNhbm5vdCBkZWNyeXB0IHdpdGhvdXQgcGFzc3dvcmRgKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBkZWNyeXB0KHBhcmFtcy5wYXNzd29yZCwgcGFyYW1zLmlucHV0KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoXCJjY206IHRhZyBkb2Vzbid0IG1hdGNoXCIpKSB7XG4gICAgICAgIGVycm9yLm1lc3NhZ2UgPSAncGFzc3dvcmQgZXJyb3IgLSAnICsgZXJyb3IubWVzc2FnZTtcbiAgICAgIH1cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemUgdGhpcyBCaXRHbyBvYmplY3QgdG8gYSBKU09OIG9iamVjdC5cbiAgICpcbiAgICogQ2F1dGlvbjogY29udGFpbnMgc2Vuc2l0aXZlIGRhdGFcbiAgICovXG4gIHRvSlNPTigpOiBCaXRHb0pzb24ge1xuICAgIHJldHVybiB7XG4gICAgICB1c2VyOiB0aGlzLl91c2VyLFxuICAgICAgdG9rZW46IHRoaXMuX3Rva2VuLFxuICAgICAgZXh0ZW5zaW9uS2V5OiB0aGlzLl9leHRlbnNpb25LZXkgPyB0aGlzLl9leHRlbnNpb25LZXkudG9XSUYoKSA6IHVuZGVmaW5lZCxcbiAgICAgIGVjZGhYcHJ2OiB0aGlzLl9lY2RoWHBydixcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgY3VycmVudCB1c2VyXG4gICAqL1xuICB1c2VyKCk6IFVzZXIgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl91c2VyO1xuICB9XG5cbiAgLyoqXG4gICAqIERlc2VyaWFsaXplIGEgSlNPTiBzZXJpYWxpemVkIEJpdEdvIG9iamVjdC5cbiAgICpcbiAgICogT3ZlcndyaXRlcyB0aGUgcHJvcGVydGllcyBvbiB0aGUgY3VycmVudCBCaXRHbyBvYmplY3Qgd2l0aFxuICAgKiB0aG9zZSBvZiB0aGUgZGVzZXJpYWx6ZWQgb2JqZWN0LlxuICAgKlxuICAgKiBAcGFyYW0ganNvblxuICAgKi9cbiAgZnJvbUpTT04oanNvbjogQml0R29Kc29uKTogdm9pZCB7XG4gICAgdGhpcy5fdXNlciA9IGpzb24udXNlcjtcbiAgICB0aGlzLl90b2tlbiA9IGpzb24udG9rZW47XG4gICAgdGhpcy5fZWNkaFhwcnYgPSBqc29uLmVjZGhYcHJ2O1xuICAgIGlmIChqc29uLmV4dGVuc2lvbktleSkge1xuICAgICAgY29uc3QgbmV0d29yayA9IGNvbW1vbi5FbnZpcm9ubWVudHNbdGhpcy5nZXRFbnYoKV0ubmV0d29yaztcbiAgICAgIHRoaXMuX2V4dGVuc2lvbktleSA9IHV0eG9saWIuRUNQYWlyLmZyb21XSUYoXG4gICAgICAgIGpzb24uZXh0ZW5zaW9uS2V5LFxuICAgICAgICB1dHhvbGliLm5ldHdvcmtzW25ldHdvcmtdIGFzIHV0eG9saWIuQml0Y29pbkpTTmV0d29ya1xuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUHJvY2VzcyB0aGUgdXNlcm5hbWUsIHBhc3N3b3JkIGFuZCBvdHAgaW50byBhbiBvYmplY3QgY29udGFpbmluZyB0aGUgdXNlcm5hbWUgYW5kIGhhc2hlZCBwYXNzd29yZCwgcmVhZHkgdG9cbiAgICogc2VuZCB0byBiaXRnbyBmb3IgYXV0aGVudGljYXRpb24uXG4gICAqL1xuICBwcmVwcm9jZXNzQXV0aGVudGljYXRpb25QYXJhbXMoe1xuICAgIHVzZXJuYW1lLFxuICAgIHBhc3N3b3JkLFxuICAgIG90cCxcbiAgICBmb3JjZVNNUyxcbiAgICBleHRlbnNpYmxlLFxuICAgIHRydXN0LFxuICB9OiBBdXRoZW50aWNhdGVPcHRpb25zKTogUHJvY2Vzc2VkQXV0aGVudGljYXRpb25PcHRpb25zIHtcbiAgICBpZiAoIV8uaXNTdHJpbmcodXNlcm5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2V4cGVjdGVkIHN0cmluZyB1c2VybmFtZScpO1xuICAgIH1cblxuICAgIGlmICghXy5pc1N0cmluZyhwYXNzd29yZCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZXhwZWN0ZWQgc3RyaW5nIHBhc3N3b3JkJyk7XG4gICAgfVxuXG4gICAgY29uc3QgbG93ZXJOYW1lID0gdXNlcm5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAvLyBDYWxjdWxhdGUgdGhlIHBhc3N3b3JkIEhNQUMgc28gd2UgZG9uJ3Qgc2VuZCBjbGVhci10ZXh0IHBhc3N3b3Jkc1xuICAgIGNvbnN0IGhtYWNQYXNzd29yZCA9IHRoaXMuY2FsY3VsYXRlSE1BQyhsb3dlck5hbWUsIHBhc3N3b3JkKTtcblxuICAgIGNvbnN0IGF1dGhQYXJhbXM6IFByb2Nlc3NlZEF1dGhlbnRpY2F0aW9uT3B0aW9ucyA9IHtcbiAgICAgIGVtYWlsOiBsb3dlck5hbWUsXG4gICAgICBwYXNzd29yZDogaG1hY1Bhc3N3b3JkLFxuICAgICAgZm9yY2VTTVM6ICEhZm9yY2VTTVMsXG4gICAgfTtcblxuICAgIGlmIChvdHApIHtcbiAgICAgIGF1dGhQYXJhbXMub3RwID0gb3RwO1xuICAgICAgaWYgKHRydXN0KSB7XG4gICAgICAgIGF1dGhQYXJhbXMudHJ1c3QgPSAxO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChleHRlbnNpYmxlKSB7XG4gICAgICB0aGlzLl9leHRlbnNpb25LZXkgPSBtYWtlUmFuZG9tS2V5KCk7XG4gICAgICBhdXRoUGFyYW1zLmV4dGVuc2libGUgPSB0cnVlO1xuICAgICAgYXV0aFBhcmFtcy5leHRlbnNpb25BZGRyZXNzID0gZ2V0QWRkcmVzc1AyUEtIKHRoaXMuX2V4dGVuc2lvbktleSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGF1dGhQYXJhbXM7XG4gIH1cblxuICAvKipcbiAgICogU3luY2hyb25vdXMgbWV0aG9kIGZvciBhY3RpdmF0aW5nIGFuIGFjY2VzcyB0b2tlbi5cbiAgICovXG4gIGF1dGhlbnRpY2F0ZVdpdGhBY2Nlc3NUb2tlbih7IGFjY2Vzc1Rva2VuIH06IEFjY2Vzc1Rva2VuT3B0aW9ucyk6IHZvaWQge1xuICAgIGRlYnVnKCdub3cgYXV0aGVudGljYXRpbmcgd2l0aCBhY2Nlc3MgdG9rZW4gJXMnLCBhY2Nlc3NUb2tlbi5zdWJzdHJpbmcoMCwgOCkpO1xuICAgIHRoaXMuX3Rva2VuID0gYWNjZXNzVG9rZW47XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBFQ0RIIGtleWNoYWluIGZvciB0aGUgdXNlci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGxvZ2luUGFzc3dvcmQgLSBUaGUgdXNlcidzIGxvZ2luIHBhc3N3b3JkLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fSAtIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIG5ldyBFQ0RIIGtleWNoYWluIGRhdGEuXG4gICAqIEB0aHJvd3Mge0Vycm9yfSAtIFRocm93cyBhbiBlcnJvciBpZiB0aGVyZSBpcyBhbiBpc3N1ZSBjcmVhdGluZyB0aGUga2V5Y2hhaW4uXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgY3JlYXRlVXNlckVjZGhLZXljaGFpbihsb2dpblBhc3N3b3JkOiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IGtleURhdGEgPSB0aGlzLmtleWNoYWlucygpLmNyZWF0ZSgpO1xuICAgIGNvbnN0IGhkTm9kZSA9IGJpdGNvaW4uSEROb2RlLmZyb21CYXNlNTgoa2V5RGF0YS54cHJ2KTtcblxuICAgIC8qKlxuICAgICAqIEFkZCB0aGUgbmV3IEVDREgga2V5Y2hhaW4gdG8gdGhlIHVzZXIncyBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtQcm9taXNlPGFueT59IC0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgbmV3IEVDREgga2V5Y2hhaW4uXG4gICAgICovXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMua2V5Y2hhaW5zKCkuYWRkKHtcbiAgICAgIHNvdXJjZTogJ2VjZGgnLFxuICAgICAgeHB1YjogaGROb2RlLm5ldXRlcmVkKCkudG9CYXNlNTgoKSxcbiAgICAgIGVuY3J5cHRlZFhwcnY6IHRoaXMuZW5jcnlwdCh7XG4gICAgICAgIHBhc3N3b3JkOiBsb2dpblBhc3N3b3JkLFxuICAgICAgICBpbnB1dDogaGROb2RlLnRvQmFzZTU4KCksXG4gICAgICB9KSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIHRoZSB1c2VyJ3Mgc2V0dGluZ3Mgd2l0aCB0aGUgcHJvdmlkZWQgcGFyYW1ldGVycy5cbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIHRvIHVwZGF0ZSB0aGUgdXNlcidzIHNldHRpbmdzIHdpdGguXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59XG4gICAqIEB0aHJvd3Mge0Vycm9yfSAtIFRocm93cyBhbiBlcnJvciBpZiB0aGVyZSBpcyBhbiBpc3N1ZSB1cGRhdGluZyB0aGUgdXNlcidzIHNldHRpbmdzLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyB1cGRhdGVVc2VyU2V0dGluZ3MocGFyYW1zOiBhbnkpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLnB1dCh0aGlzLnVybCgnL3VzZXIvc2V0dGluZ3MnLCAyKSkuc2VuZChwYXJhbXMpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVuc3VyZXMgdGhhdCB0aGUgdXNlcidzIEVDREgga2V5Y2hhaW4gaXMgY3JlYXRlZCBmb3Igd2FsbGV0IHNoYXJpbmcgYW5kIFRTUyB3YWxsZXRzLlxuICAgKiBJZiB0aGUga2V5Y2hhaW4gZG9lcyBub3QgZXhpc3QsIGl0IHdpbGwgYmUgY3JlYXRlZCBhbmQgdGhlIHVzZXIncyBzZXR0aW5ncyB3aWxsIGJlIHVwZGF0ZWQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBsb2dpblBhc3N3b3JkIC0gVGhlIHVzZXIncyBsb2dpbiBwYXNzd29yZC5cbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn0gLSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSB1c2VyJ3Mgc2V0dGluZ3MgZW5zdXJpbmcgd2UgaGF2ZSB0aGUgZWNkaEtleWNoYWluIGluIHRoZXJlLlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBUaHJvd3MgYW4gZXJyb3IgaWYgdGhlcmUgaXMgYW4gaXNzdWUgY3JlYXRpbmcgdGhlIGtleWNoYWluIG9yIHVwZGF0aW5nIHRoZSB1c2VyJ3Mgc2V0dGluZ3MuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGVuc3VyZVVzZXJFY2RoS2V5Y2hhaW5Jc0NyZWF0ZWQobG9naW5QYXNzd29yZDogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHVzZXIncyBjdXJyZW50IHNldHRpbmdzLlxuICAgICAqL1xuICAgIGNvbnN0IHVzZXJTZXR0aW5ncyA9IGF3YWl0IHRoaXMuZ2V0KHRoaXMudXJsKCcvdXNlci9zZXR0aW5ncycpKS5yZXN1bHQoKTtcbiAgICAvKipcbiAgICAgKiBJZiB0aGUgdXNlcidzIEVDREgga2V5Y2hhaW4gZG9lcyBub3QgZXhpc3QsIGNyZWF0ZSBhIG5ldyBrZXljaGFpbiBhbmQgdXBkYXRlIHRoZSB1c2VyJ3Mgc2V0dGluZ3MuXG4gICAgICovXG4gICAgaWYgKCF1c2VyU2V0dGluZ3Muc2V0dGluZ3MuZWNkaEtleWNoYWluKSB7XG4gICAgICBjb25zdCBuZXdLZXljaGFpbiA9IGF3YWl0IHRoaXMuY3JlYXRlVXNlckVjZGhLZXljaGFpbihsb2dpblBhc3N3b3JkKTtcbiAgICAgIGF3YWl0IHRoaXMudXBkYXRlVXNlclNldHRpbmdzKHtcbiAgICAgICAgc2V0dGluZ3M6IHtcbiAgICAgICAgICBlY2RoS2V5Y2hhaW46IG5ld0tleWNoYWluLnhwdWIsXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICAgIC8qKlxuICAgICAgICogVXBkYXRlIHRoZSB1c2VyJ3Mgc2V0dGluZ3Mgb2JqZWN0IHdpdGggdGhlIG5ldyBFQ0RIIGtleWNoYWluLlxuICAgICAgICovXG4gICAgICB1c2VyU2V0dGluZ3Muc2V0dGluZ3MuZWNkaEtleWNoYWluID0gbmV3S2V5Y2hhaW4ueHB1YjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJuIHRoZSB1c2VyJ3MgRUNESCBrZXljaGFpbiBzZXR0aW5ncy5cbiAgICAgKi9cbiAgICByZXR1cm4gdXNlclNldHRpbmdzLnNldHRpbmdzO1xuICB9XG5cbiAgLyoqXG4gICAqIExvZ2luIHRvIHRoZSBiaXRnbyBwbGF0Zm9ybS5cbiAgICovXG4gIGFzeW5jIGF1dGhlbnRpY2F0ZShwYXJhbXM6IEF1dGhlbnRpY2F0ZU9wdGlvbnMpOiBQcm9taXNlPExvZ2luUmVzcG9uc2UgfCBhbnk+IHtcbiAgICB0cnkge1xuICAgICAgaWYgKCFfLmlzT2JqZWN0KHBhcmFtcykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdyZXF1aXJlZCBvYmplY3QgcGFyYW1zJyk7XG4gICAgICB9XG5cbiAgICAgIGlmICghXy5pc1N0cmluZyhwYXJhbXMucGFzc3dvcmQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignZXhwZWN0ZWQgc3RyaW5nIHBhc3N3b3JkJyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZvcmNlVjFBdXRoID0gISFwYXJhbXMuZm9yY2VWMUF1dGg7XG4gICAgICBjb25zdCBhdXRoUGFyYW1zID0gdGhpcy5wcmVwcm9jZXNzQXV0aGVudGljYXRpb25QYXJhbXMocGFyYW1zKTtcbiAgICAgIGNvbnN0IHBhc3N3b3JkID0gcGFyYW1zLnBhc3N3b3JkO1xuXG4gICAgICBpZiAodGhpcy5fdG9rZW4pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBFcnJvcignYWxyZWFkeSBsb2dnZWQgaW4nKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgYXV0aFVybCA9IHRoaXMubWljcm9zZXJ2aWNlc1VybCgnL2FwaS9hdXRoL3YxL3Nlc3Npb24nKTtcbiAgICAgIGNvbnN0IHJlcXVlc3QgPSB0aGlzLnBvc3QoYXV0aFVybCk7XG5cbiAgICAgIGlmIChmb3JjZVYxQXV0aCkge1xuICAgICAgICByZXF1ZXN0LmZvcmNlVjFBdXRoID0gdHJ1ZTtcbiAgICAgICAgLy8gdGVsbCB0aGUgc2VydmVyIHRoYXQgdGhlIGNsaWVudCB3YXMgZm9yY2VkIHRvIGRvd25ncmFkZSB0aGUgYXV0aGVudGljYXRpb24gcHJvdG9jb2xcbiAgICAgICAgYXV0aFBhcmFtcy5mb3JjZVYxQXV0aCA9IHRydWU7XG4gICAgICAgIGRlYnVnKCdmb3JjaW5nIHYxIGF1dGggZm9yIGNhbGwgdG8gYXV0aGVudGljYXRlJyk7XG4gICAgICB9XG4gICAgICBjb25zdCByZXNwb25zZTogc3VwZXJhZ2VudC5SZXNwb25zZSA9IGF3YWl0IHJlcXVlc3Quc2VuZChhdXRoUGFyYW1zKTtcbiAgICAgIC8vIGV4dHJhY3QgYm9keSBhbmQgdXNlciBpbmZvcm1hdGlvblxuICAgICAgY29uc3QgYm9keSA9IHJlc3BvbnNlLmJvZHk7XG4gICAgICB0aGlzLl91c2VyID0gYm9keS51c2VyO1xuXG4gICAgICBpZiAoYm9keS5hY2Nlc3NfdG9rZW4pIHtcbiAgICAgICAgdGhpcy5fdG9rZW4gPSBib2R5LmFjY2Vzc190b2tlbjtcbiAgICAgICAgLy8gaWYgdGhlIGRvd25ncmFkZSB3YXMgZm9yY2VkLCBhZGRpbmcgYSB3YXJuaW5nIG1lc3NhZ2UgbWlnaHQgYmUgcHJ1ZGVudFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gY2hlY2sgdGhlIHByZXNlbmNlIG9mIGFuIGVuY3J5cHRlZCBFQ0RIIHhwcnZcbiAgICAgICAgLy8gaWYgbm90IHByZXNlbnQsIGxlZ2FjeSBhY2NvdW50XG4gICAgICAgIGNvbnN0IGVuY3J5cHRlZFhwcnYgPSBib2R5LmVuY3J5cHRlZEVDREhYcHJ2O1xuICAgICAgICBpZiAoIWVuY3J5cHRlZFhwcnYpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0tleWNoYWluIG5lZWRzIGVuY3J5cHRlZFhwcnYgcHJvcGVydHknKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlRGV0YWlscyA9IHRoaXMuaGFuZGxlVG9rZW5Jc3N1YW5jZShyZXNwb25zZS5ib2R5LCBwYXNzd29yZCk7XG4gICAgICAgIHRoaXMuX3Rva2VuID0gcmVzcG9uc2VEZXRhaWxzLnRva2VuO1xuICAgICAgICB0aGlzLl9lY2RoWHBydiA9IHJlc3BvbnNlRGV0YWlscy5lY2RoWHBydjtcblxuICAgICAgICAvLyB2ZXJpZnkgdGhlIHJlc3BvbnNlJ3MgYXV0aGVudGljaXR5XG4gICAgICAgIHZlcmlmeVJlc3BvbnNlKHRoaXMsIHJlc3BvbnNlRGV0YWlscy50b2tlbiwgJ3Bvc3QnLCByZXF1ZXN0LCByZXNwb25zZSk7XG5cbiAgICAgICAgLy8gYWRkIHRoZSByZW1haW5pbmcgY29tcG9uZW50IGZvciBlYXNpZXIgYWNjZXNzXG4gICAgICAgIHJlc3BvbnNlLmJvZHkuYWNjZXNzX3Rva2VuID0gdGhpcy5fdG9rZW47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHVzZXJTZXR0aW5ncyA9IHBhcmFtcy5lbnN1cmVFY2RoS2V5Y2hhaW4gPyBhd2FpdCB0aGlzLmVuc3VyZVVzZXJFY2RoS2V5Y2hhaW5Jc0NyZWF0ZWQocGFzc3dvcmQpIDogdW5kZWZpbmVkO1xuICAgICAgaWYgKHVzZXJTZXR0aW5ncz8uZWNkaEtleWNoYWluKSB7XG4gICAgICAgIHJlc3BvbnNlLmJvZHkudXNlci5lY2RoS2V5Y2hhaW4gPSB1c2VyU2V0dGluZ3MuZWNkaEtleWNoYWluO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gaGFuZGxlUmVzcG9uc2VSZXN1bHQ8TG9naW5SZXNwb25zZT4oKShyZXNwb25zZSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaGFuZGxlUmVzcG9uc2VFcnJvcihlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHJlc3BvbnNlQm9keSBSZXNwb25zZSBib2R5IG9iamVjdFxuICAgKiBAcGFyYW0gcGFzc3dvcmQgUGFzc3dvcmQgZm9yIHRoZSBzeW1tZXRyaWMgZGVjcnlwdGlvblxuICAgKi9cbiAgaGFuZGxlVG9rZW5Jc3N1YW5jZShyZXNwb25zZUJvZHk6IFRva2VuSXNzdWFuY2VSZXNwb25zZSwgcGFzc3dvcmQ/OiBzdHJpbmcpOiBUb2tlbklzc3VhbmNlIHtcbiAgICAvLyBtYWtlIHN1cmUgdGhlIHJlc3BvbnNlIGJvZHkgY29udGFpbnMgdGhlIG5lY2Vzc2FyeSBwcm9wZXJ0aWVzXG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHJlc3BvbnNlQm9keSwgWydkZXJpdmF0aW9uUGF0aCddLCBbJ2VuY3J5cHRlZEVDREhYcHJ2J10pO1xuXG4gICAgY29uc3QgZW52aXJvbm1lbnQgPSB0aGlzLl9lbnY7XG4gICAgY29uc3QgZW52aXJvbm1lbnRDb25maWcgPSBjb21tb24uRW52aXJvbm1lbnRzW2Vudmlyb25tZW50XTtcbiAgICBjb25zdCBzZXJ2ZXJYcHViID0gZW52aXJvbm1lbnRDb25maWcuc2VydmVyWHB1YjtcbiAgICBsZXQgZWNkaFhwcnYgPSB0aGlzLl9lY2RoWHBydjtcbiAgICBpZiAoIWVjZGhYcHJ2KSB7XG4gICAgICBpZiAoIXBhc3N3b3JkIHx8ICFyZXNwb25zZUJvZHkuZW5jcnlwdGVkRUNESFhwcnYpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdlY2RoWHBydiBwcm9wZXJ0eSBtdXN0IGJlIHNldCBvciBwYXNzd29yZCBhbmQgZW5jcnlwdGVkIGVuY3J5cHRlZEVDREhYcHJ2IG11c3QgYmUgcHJvdmlkZWQnKTtcbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgIGVjZGhYcHJ2ID0gdGhpcy5kZWNyeXB0KHtcbiAgICAgICAgICBpbnB1dDogcmVzcG9uc2VCb2R5LmVuY3J5cHRlZEVDREhYcHJ2LFxuICAgICAgICAgIHBhc3N3b3JkOiBwYXNzd29yZCxcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGUuZXJyb3JDb2RlID0gJ2VjZGhfeHBydl9kZWNyeXB0aW9uX2ZhaWx1cmUnO1xuICAgICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gZGVjcnlwdCBlbmNyeXB0ZWRFQ0RIWHBydi4nKTtcbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBjb25zdHJ1Y3QgSEROb2RlIG9iamVjdHMgZm9yIGNsaWVudCdzIHhwcnYgYW5kIHNlcnZlcidzIHhwdWJcbiAgICBjb25zdCBjbGllbnRIRE5vZGUgPSBiaXAzMi5mcm9tQmFzZTU4KGVjZGhYcHJ2KTtcbiAgICBjb25zdCBzZXJ2ZXJIRE5vZGUgPSBiaXAzMi5mcm9tQmFzZTU4KHNlcnZlclhwdWIpO1xuXG4gICAgLy8gQklQMzIgZGVyaXZhdGlvbiBwYXRoIGlzIGFwcGxpZWQgdG8gYm90aCBjbGllbnQgYW5kIHNlcnZlciBtYXN0ZXIga2V5c1xuICAgIGNvbnN0IGRlcml2YXRpb25QYXRoID0gc2FuaXRpemVMZWdhY3lQYXRoKHJlc3BvbnNlQm9keS5kZXJpdmF0aW9uUGF0aCk7XG4gICAgY29uc3QgY2xpZW50RGVyaXZlZE5vZGUgPSBjbGllbnRIRE5vZGUuZGVyaXZlUGF0aChkZXJpdmF0aW9uUGF0aCk7XG4gICAgY29uc3Qgc2VydmVyRGVyaXZlZE5vZGUgPSBzZXJ2ZXJIRE5vZGUuZGVyaXZlUGF0aChkZXJpdmF0aW9uUGF0aCk7XG5cbiAgICBjb25zdCBwdWJsaWNLZXkgPSBzZXJ2ZXJEZXJpdmVkTm9kZS5wdWJsaWNLZXk7XG4gICAgY29uc3Qgc2VjcmV0S2V5ID0gY2xpZW50RGVyaXZlZE5vZGUucHJpdmF0ZUtleTtcbiAgICBpZiAoIXNlY3JldEtleSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdubyBjbGllbnQgcHJpdmF0ZSBLZXknKTtcbiAgICB9XG4gICAgY29uc3Qgc2VjcmV0ID0gQnVmZmVyLmZyb20oXG4gICAgICAvLyBGSVhNRShCRy0zNDM4Nik6IHdlIHNob3VsZCB1c2UgYHNlY3AyNTZrMS5lY2RoKClgIGluIHRoZSBmdXR1cmVcbiAgICAgIC8vICAgICAgICAgICAgICAgICAgc2VlIGRpc2N1c3Npb24gaGVyZSBodHRwczovL2dpdGh1Yi5jb20vYml0Y29pbi1jb3JlL3NlY3AyNTZrMS9pc3N1ZXMvMzUyXG4gICAgICBzZWNwMjU2azEucHVibGljS2V5VHdlYWtNdWwocHVibGljS2V5LCBzZWNyZXRLZXkpXG4gICAgKS50b1N0cmluZygnaGV4Jyk7XG5cbiAgICAvLyBkZWNyeXB0IHRva2VuIHdpdGggc3ltbWV0cmljIEVDREgga2V5XG4gICAgbGV0IHJlc3BvbnNlOiBUb2tlbklzc3VhbmNlO1xuICAgIHRyeSB7XG4gICAgICByZXNwb25zZSA9IHtcbiAgICAgICAgdG9rZW46IHRoaXMuZGVjcnlwdCh7XG4gICAgICAgICAgaW5wdXQ6IHJlc3BvbnNlQm9keS5lbmNyeXB0ZWRUb2tlbixcbiAgICAgICAgICBwYXNzd29yZDogc2VjcmV0LFxuICAgICAgICB9KSxcbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgZS5lcnJvckNvZGUgPSAndG9rZW5fZGVjcnlwdGlvbl9mYWlsdXJlJztcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBkZWNyeXB0IHRva2VuLicpO1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLl9lY2RoWHBydikge1xuICAgICAgcmVzcG9uc2UuZWNkaFhwcnYgPSBlY2RoWHBydjtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3BvbnNlO1xuICB9XG5cbiAgLyoqXG4gICAqL1xuICB2ZXJpZnlQYXNzd29yZChwYXJhbXM6IFZlcmlmeVBhc3N3b3JkT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBpZiAoIV8uaXNTdHJpbmcocGFyYW1zLnBhc3N3b3JkKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIHN0cmluZyBwYXNzd29yZCcpO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5fdXNlciB8fCAhdGhpcy5fdXNlci51c2VybmFtZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdubyBjdXJyZW50IHVzZXInKTtcbiAgICB9XG4gICAgY29uc3QgaG1hY1Bhc3N3b3JkID0gdGhpcy5jYWxjdWxhdGVITUFDKHRoaXMuX3VzZXIudXNlcm5hbWUsIHBhcmFtcy5wYXNzd29yZCk7XG5cbiAgICByZXR1cm4gdGhpcy5wb3N0KHRoaXMudXJsKCcvdXNlci92ZXJpZnlwYXNzd29yZCcpKS5zZW5kKHsgcGFzc3dvcmQ6IGhtYWNQYXNzd29yZCB9KS5yZXN1bHQoJ3ZhbGlkJyk7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXIgb3V0IGFsbCBzdGF0ZSBmcm9tIHRoaXMgQml0R28gb2JqZWN0LCBlZmZlY3RpdmVseSBsb2dnaW5nIG91dCB0aGUgY3VycmVudCB1c2VyLlxuICAgKi9cbiAgY2xlYXIoKTogdm9pZCB7XG4gICAgLy8gVE9ETzogYXJlIHRoZXJlIGFueSBvdGhlciBmaWVsZHMgd2hpY2ggc2hvdWxkIGJlIGNsZWFyZWQ/XG4gICAgdGhpcy5fdXNlciA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl90b2tlbiA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9yZWZyZXNoVG9rZW4gPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fZWNkaFhwcnYgPSB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogVXNlIHJlZnJlc2ggdG9rZW4gdG8gZ2V0IG5ldyBhY2Nlc3MgdG9rZW4uXG4gICAqIElmIHRoZSByZWZyZXNoIHRva2VuIGlzIG51bGwvZGVmaW5lZCwgdGhlbiB3ZSB1c2UgdGhlIHN0b3JlZCB0b2tlbiBmcm9tIGF1dGhcbiAgICovXG4gIGFzeW5jIHJlZnJlc2hUb2tlbihwYXJhbXM6IHsgcmVmcmVzaFRva2VuPzogc3RyaW5nIH0gPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFsncmVmcmVzaFRva2VuJ10pO1xuXG4gICAgY29uc3QgcmVmcmVzaFRva2VuID0gcGFyYW1zLnJlZnJlc2hUb2tlbiB8fCB0aGlzLl9yZWZyZXNoVG9rZW47XG5cbiAgICBpZiAoIXJlZnJlc2hUb2tlbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNdXN0IHByb3ZpZGUgcmVmcmVzaCB0b2tlbiBvciBoYXZlIGF1dGhlbnRpY2F0ZWQgd2l0aCBPYXV0aCBiZWZvcmUnKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuX2NsaWVudElkIHx8ICF0aGlzLl9jbGllbnRTZWNyZXQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTmVlZCBjbGllbnQgaWQgYW5kIHNlY3JldCBzZXQgZmlyc3QgdG8gdXNlIHRoaXMnKTtcbiAgICB9XG5cbiAgICBjb25zdCBib2R5ID0gYXdhaXQgdGhpcy5wb3N0KHRoaXMuX2Jhc2VVcmwgKyAnL29hdXRoL3Rva2VuJylcbiAgICAgIC5zZW5kKHtcbiAgICAgICAgZ3JhbnRfdHlwZTogJ3JlZnJlc2hfdG9rZW4nLFxuICAgICAgICByZWZyZXNoX3Rva2VuOiByZWZyZXNoVG9rZW4sXG4gICAgICAgIGNsaWVudF9pZDogdGhpcy5fY2xpZW50SWQsXG4gICAgICAgIGNsaWVudF9zZWNyZXQ6IHRoaXMuX2NsaWVudFNlY3JldCxcbiAgICAgIH0pXG4gICAgICAucmVzdWx0KCk7XG4gICAgdGhpcy5fdG9rZW4gPSBib2R5LmFjY2Vzc190b2tlbjtcbiAgICB0aGlzLl9yZWZyZXNoVG9rZW4gPSBib2R5LnJlZnJlc2hfdG9rZW47XG4gICAgcmV0dXJuIGJvZHk7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogbGlzdEFjY2Vzc1Rva2Vuc1xuICAgKiBHZXQgaW5mb3JtYXRpb24gb24gYWxsIG9mIHRoZSBCaXRHbyBhY2Nlc3MgdG9rZW5zIG9uIHRoZSB1c2VyXG4gICAqIEByZXR1cm4ge1xuICAgKiAgaWQ6IDxpZCBvZiB0aGUgdG9rZW4+XG4gICAqICBsYWJlbDogPHRoZSB1c2VyLXByb3ZpZGVkIGxhYmVsIGZvciB0aGlzIHRva2VuPlxuICAgKiAgdXNlcjogPGlkIG9mIHRoZSB1c2VyIG9uIHRoZSB0b2tlbj5cbiAgICogIGVudGVycHJpc2UgPGlkIG9mIHRoZSBlbnRlcnByaXNlIHRoaXMgdG9rZW4gaXMgdmFsaWQgZm9yPlxuICAgKiAgY2xpZW50OiA8dGhlIGF1dGggY2xpZW50IHRoYXQgdGhpcyB0b2tlbiBiZWxvbmdzIHRvPlxuICAgKiAgc2NvcGU6IDxsaXN0IG9mIGFsbG93ZWQgT0F1dGggc2NvcGUgdmFsdWVzPlxuICAgKiAgY3JlYXRlZDogPGRhdGUgdGhlIHRva2VuIHdhcyBjcmVhdGVkPlxuICAgKiAgZXhwaXJlczogPGRhdGUgdGhlIHRva2VuIHdpbGwgZXhwaXJlPlxuICAgKiAgb3JpZ2luOiA8dGhlIG9yaWdpbiBmb3Igd2hpY2ggdGhpcyB0b2tlbiBpcyB2YWxpZD5cbiAgICogIGlzRXh0ZW5zaWJsZTogPGZsYWcgaW5kaWNhdGluZyBpZiB0aGUgdG9rZW4gY2FuIGJlIGV4dGVuZGVkPlxuICAgKiAgZXh0ZW5zaW9uQWRkcmVzczogPGFkZHJlc3Mgd2hvc2UgcHJpdmF0ZSBrZXkncyBzaWduYXR1cmUgaXMgbmVjZXNzYXJ5IGZvciBleHRlbnNpb25zPlxuICAgKiAgdW5sb2NrOiA8aW5mbyBmb3IgYWN0aW9ucyB0aGF0IHJlcXVpcmUgYW4gdW5sb2NrIGJlZm9yZSBmaXJpbmc+XG4gICAqIH1cbiAgICovXG4gIGFzeW5jIGxpc3RBY2Nlc3NUb2tlbnMoKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5nZXQodGhpcy51cmwoJy91c2VyL2FjY2Vzc3Rva2VuJykpLnNlbmQoKS5yZXN1bHQoJ2FjY2Vzc1Rva2VucycpO1xuICB9XG5cbiAgLyoqXG4gICAqIGFkZEFjY2Vzc1Rva2VuXG4gICAqIEFkZCBhIEJpdEdvIEFQSSBBY2Nlc3MgVG9rZW4gdG8gdGhlIGN1cnJlbnQgdXNlciBhY2NvdW50XG4gICAqIEBwYXJhbSBwYXJhbXMge1xuICAgKiAgICBvdHA6IChyZXF1aXJlZCkgPHZhbGlkIG90cCBjb2RlPlxuICAgKiAgICBsYWJlbDogKHJlcXVpcmVkKSA8bGFiZWwgZm9yIHRoZSB0b2tlbj5cbiAgICogICAgZHVyYXRpb246IDxsZW5ndGggb2YgdGltZSBpbiBzZWNvbmRzIHRoZSB0b2tlbiB3aWxsIGJlIHZhbGlkIGZvcj5cbiAgICogICAgaXBSZXN0cmljdDogPGFycmF5IG9mIElQIGFkZHJlc3Mgc3RyaW5ncyB0byB3aGl0ZWxpc3Q+XG4gICAqICAgIHR4VmFsdWVMaW1pdDogPG51bWJlciBvZiBvdXRnb2luZyBzYXRvc2hpcyBhbGxvd2VkIG9uIHRoaXMgdG9rZW4+XG4gICAqICAgIHNjb3BlOiAocmVxdWlyZWQpIDxhdXRob3JpemF0aW9uIHNjb3BlIG9mIHRoZSByZXF1ZXN0ZWQgdG9rZW4+XG4gICAqIH1cbiAgICogQHJldHVybiB7XG4gICAqICAgIGlkOiA8aWQgb2YgdGhlIHRva2VuPlxuICAgKiAgICB0b2tlbjogPGFjY2VzcyB0b2tlbiBoZXggc3RyaW5nIHRvIGJlIHVzZWQgZm9yIEJpdEdvIEFQSSByZXF1ZXN0IHZlcmlmaWNhdGlvbj5cbiAgICogICAgbGFiZWw6IDx1c2VyLXByb3ZpZGVkIGxhYmVsIGZvciB0aGlzIHRva2VuPlxuICAgKiAgICB1c2VyOiA8aWQgb2YgdGhlIHVzZXIgb24gdGhlIHRva2VuPlxuICAgKiAgICBlbnRlcnByaXNlIDxpZCBvZiB0aGUgZW50ZXJwcmlzZSB0aGlzIHRva2VuIGlzIHZhbGlkIGZvcj5cbiAgICogICAgY2xpZW50OiA8dGhlIGF1dGggY2xpZW50IHRoYXQgdGhpcyB0b2tlbiBiZWxvbmdzIHRvPlxuICAgKiAgICBzY29wZTogPGxpc3Qgb2YgYWxsb3dlZCBPQXV0aCBzY29wZSB2YWx1ZXM+XG4gICAqICAgIGNyZWF0ZWQ6IDxkYXRlIHRoZSB0b2tlbiB3YXMgY3JlYXRlZD5cbiAgICogICAgZXhwaXJlczogPGRhdGUgdGhlIHRva2VuIHdpbGwgZXhwaXJlPlxuICAgKiAgICBvcmlnaW46IDx0aGUgb3JpZ2luIGZvciB3aGljaCB0aGlzIHRva2VuIGlzIHZhbGlkPlxuICAgKiAgICBpc0V4dGVuc2libGU6IDxmbGFnIGluZGljYXRpbmcgaWYgdGhlIHRva2VuIGNhbiBiZSBleHRlbmRlZD5cbiAgICogICAgZXh0ZW5zaW9uQWRkcmVzczogPGFkZHJlc3Mgd2hvc2UgcHJpdmF0ZSBrZXkncyBzaWduYXR1cmUgaXMgbmVjZXNzYXJ5IGZvciBleHRlbnNpb25zPlxuICAgKiAgICB1bmxvY2s6IDxpbmZvIGZvciBhY3Rpb25zIHRoYXQgcmVxdWlyZSBhbiB1bmxvY2sgYmVmb3JlIGZpcmluZz5cbiAgICogfVxuICAgKi9cbiAgYXN5bmMgYWRkQWNjZXNzVG9rZW4ocGFyYW1zOiBBZGRBY2Nlc3NUb2tlbk9wdGlvbnMpOiBQcm9taXNlPEFkZEFjY2Vzc1Rva2VuUmVzcG9uc2U+IHtcbiAgICB0cnkge1xuICAgICAgaWYgKCFfLmlzU3RyaW5nKHBhcmFtcy5sYWJlbCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdyZXF1aXJlZCBzdHJpbmcgbGFiZWwnKTtcbiAgICAgIH1cblxuICAgICAgLy8gY2hlY2sgbm9uLXN0cmluZyBwYXJhbXNcbiAgICAgIGlmIChwYXJhbXMuZHVyYXRpb24pIHtcbiAgICAgICAgaWYgKCFfLmlzTnVtYmVyKHBhcmFtcy5kdXJhdGlvbikgfHwgcGFyYW1zLmR1cmF0aW9uIDwgMCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignZHVyYXRpb24gbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBudW1iZXInKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHBhcmFtcy5pcFJlc3RyaWN0KSB7XG4gICAgICAgIGlmICghXy5pc0FycmF5KHBhcmFtcy5pcFJlc3RyaWN0KSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignaXBSZXN0cmljdCBtdXN0IGJlIGFuIGFycmF5Jyk7XG4gICAgICAgIH1cbiAgICAgICAgXy5mb3JFYWNoKHBhcmFtcy5pcFJlc3RyaWN0LCAoaXBBZGRyKSA9PiB7XG4gICAgICAgICAgaWYgKCFfLmlzU3RyaW5nKGlwQWRkcikpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignaXBSZXN0cmljdCBtdXN0IGJlIGFuIGFycmF5IG9mIElQIGFkZHJlc3Mgc3RyaW5ncycpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpZiAocGFyYW1zLnR4VmFsdWVMaW1pdCkge1xuICAgICAgICBpZiAoIV8uaXNOdW1iZXIocGFyYW1zLnR4VmFsdWVMaW1pdCkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3R4VmFsdWVMaW1pdCBtdXN0IGJlIGEgbnVtYmVyJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhcmFtcy50eFZhbHVlTGltaXQgPCAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd0eFZhbHVlTGltaXQgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBudW1iZXInKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHBhcmFtcy5zY29wZSAmJiBwYXJhbXMuc2NvcGUubGVuZ3RoID4gMCkge1xuICAgICAgICBpZiAoIV8uaXNBcnJheShwYXJhbXMuc2NvcGUpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdzY29wZSBtdXN0IGJlIGFuIGFycmF5Jyk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignbXVzdCBzcGVjaWZ5IHNjb3BlIGZvciB0b2tlbicpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBhdXRoVXJsID0gdGhpcy5taWNyb3NlcnZpY2VzVXJsKCcvYXBpL2F1dGgvdjEvYWNjZXNzdG9rZW4nKTtcbiAgICAgIGNvbnN0IHJlcXVlc3QgPSB0aGlzLnBvc3QoYXV0aFVybCk7XG5cbiAgICAgIGlmICghdGhpcy5fZWNkaFhwcnYpIHtcbiAgICAgICAgLy8gd2l0aG91dCBhIHByaXZhdGUga2V5LCB0aGUgdXNlciBjYW5ub3QgZGVjcnlwdCB0aGUgbmV3IGFjY2VzcyB0b2tlbiB0aGUgc2VydmVyIHdpbGwgc2VuZFxuICAgICAgICByZXF1ZXN0LmZvcmNlVjFBdXRoID0gdHJ1ZTtcbiAgICAgICAgZGVidWcoJ2ZvcmNpbmcgdjEgYXV0aCBmb3IgYWRkaW5nIGFjY2VzcyB0b2tlbiB1c2luZyB0b2tlbiAlcycsIHRoaXMuX3Rva2VuPy5zdWJzdHIoMCwgOCkpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHJlcXVlc3Quc2VuZChwYXJhbXMpO1xuICAgICAgaWYgKHJlcXVlc3QuZm9yY2VWMUF1dGgpIHtcbiAgICAgICAgKHJlc3BvbnNlIGFzIGFueSkuYm9keS53YXJuaW5nID0gJ0EgcHJvdG9jb2wgZG93bmdyYWRlIGhhcyBvY2N1cnJlZCBiZWNhdXNlIHRoaXMgaXMgYSBsZWdhY3kgYWNjb3VudC4nO1xuICAgICAgICByZXR1cm4gaGFuZGxlUmVzcG9uc2VSZXN1bHQ8QWRkQWNjZXNzVG9rZW5SZXNwb25zZT4oKShyZXNwb25zZSk7XG4gICAgICB9XG5cbiAgICAgIC8vIHZlcmlmeSB0aGUgYXV0aGVudGljaXR5IG9mIHRoZSBzZXJ2ZXIncyByZXNwb25zZSBiZWZvcmUgcHJvY2VlZGluZyBhbnkgZnVydGhlclxuICAgICAgdmVyaWZ5UmVzcG9uc2UodGhpcywgdGhpcy5fdG9rZW4sICdwb3N0JywgcmVxdWVzdCwgcmVzcG9uc2UpO1xuXG4gICAgICBjb25zdCByZXNwb25zZURldGFpbHMgPSB0aGlzLmhhbmRsZVRva2VuSXNzdWFuY2UocmVzcG9uc2UuYm9keSk7XG4gICAgICByZXNwb25zZS5ib2R5LnRva2VuID0gcmVzcG9uc2VEZXRhaWxzLnRva2VuO1xuXG4gICAgICByZXR1cm4gaGFuZGxlUmVzcG9uc2VSZXN1bHQ8QWRkQWNjZXNzVG9rZW5SZXNwb25zZT4oKShyZXNwb25zZSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaGFuZGxlUmVzcG9uc2VFcnJvcihlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgZXhwaXJlIHRpbWUgb2YgYW4gYWNjZXNzIHRva2VuIG1hdGNoaW5nIGVpdGhlciB0aGUgaWQgb3IgbGFiZWwgdG8gdGhlIGN1cnJlbnQgZGF0ZSwgZWZmZWN0aXZlbHkgZGVsZXRpbmcgaXRcbiAgICpcbiAgICogUGFyYW1zOlxuICAgKiBpZDogPGlkIG9mIHRoZSBhY2Nlc3MgdG9rZW4gdG8gYmUgZGVsZXRlZD5cbiAgICogbGFiZWw6IDxsYWJlbCBvZiB0aGUgYWNjZXNzIHRva2VuIHRvIGJlIGRlbGV0ZWQ+XG4gICAqXG4gICAqIFJldHVybnM6XG4gICAqIGlkOiA8aWQgb2YgdGhlIHRva2VuPlxuICAgKiBsYWJlbDogPHVzZXItcHJvdmlkZWQgbGFiZWwgZm9yIHRoaXMgdG9rZW4+XG4gICAqIHVzZXI6IDxpZCBvZiB0aGUgdXNlciBvbiB0aGUgdG9rZW4+XG4gICAqIGVudGVycHJpc2UgPGlkIG9mIHRoZSBlbnRlcnByaXNlIHRoaXMgdG9rZW4gaXMgdmFsaWQgZm9yPlxuICAgKiBjbGllbnQ6IDx0aGUgYXV0aCBjbGllbnQgdGhhdCB0aGlzIHRva2VuIGJlbG9uZ3MgdG8+XG4gICAqIHNjb3BlOiA8bGlzdCBvZiBhbGxvd2VkIE9BdXRoIHNjb3BlIHZhbHVlcz5cbiAgICogY3JlYXRlZDogPGRhdGUgdGhlIHRva2VuIHdhcyBjcmVhdGVkPlxuICAgKiBleHBpcmVzOiA8ZGF0ZSB0aGUgdG9rZW4gd2lsbCBleHBpcmU+XG4gICAqIG9yaWdpbjogPHRoZSBvcmlnaW4gZm9yIHdoaWNoIHRoaXMgdG9rZW4gaXMgdmFsaWQ+XG4gICAqIGlzRXh0ZW5zaWJsZTogPGZsYWcgaW5kaWNhdGluZyBpZiB0aGUgdG9rZW4gY2FuIGJlIGV4dGVuZGVkPlxuICAgKiBleHRlbnNpb25BZGRyZXNzOiA8YWRkcmVzcyB3aG9zZSBwcml2YXRlIGtleSdzIHNpZ25hdHVyZSBpcyBuZSpjZXNzYXJ5IGZvciBleHRlbnNpb25zPlxuICAgKiB1bmxvY2s6IDxpbmZvIGZvciBhY3Rpb25zIHRoYXQgcmVxdWlyZSBhbiB1bmxvY2sgYmVmb3JlIGZpcmluZz5cbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKi9cbiAgYXN5bmMgcmVtb3ZlQWNjZXNzVG9rZW4oeyBpZCwgbGFiZWwgfTogUmVtb3ZlQWNjZXNzVG9rZW5PcHRpb25zKTogUHJvbWlzZTxhbnk+IHtcbiAgICBpZiAoKCFpZCAmJiAhbGFiZWwpIHx8IChpZCAmJiBsYWJlbCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbXVzdCBwcm92aWRlIGV4YWN0bHkgb25lIG9mIGlkIG9yIGxhYmVsJyk7XG4gICAgfVxuICAgIGlmIChpZCkge1xuICAgICAgcmV0dXJuIHRoaXMuZGVsKHRoaXMudXJsKGAvdXNlci9hY2Nlc3N0b2tlbi8ke2lkfWApKVxuICAgICAgICAuc2VuZCgpXG4gICAgICAgIC5yZXN1bHQoKTtcbiAgICB9XG5cbiAgICBjb25zdCB0b2tlbnMgPSBhd2FpdCB0aGlzLmxpc3RBY2Nlc3NUb2tlbnMoKTtcblxuICAgIGlmICghdG9rZW5zKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Rva2VuIHdpdGggdGhpcyBsYWJlbCBkb2VzIG5vdCBleGlzdCcpO1xuICAgIH1cblxuICAgIGNvbnN0IG1hdGNoaW5nVG9rZW5zID0gXy5maWx0ZXIodG9rZW5zLCB7IGxhYmVsIH0pO1xuICAgIGlmIChtYXRjaGluZ1Rva2Vucy5sZW5ndGggPiAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2FtYmlndW91cyBjYWxsOiBtdWx0aXBsZSB0b2tlbnMgbWF0Y2hpbmcgdGhpcyBsYWJlbCcpO1xuICAgIH1cbiAgICBpZiAobWF0Y2hpbmdUb2tlbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Rva2VuIHdpdGggdGhpcyBsYWJlbCBkb2VzIG5vdCBleGlzdCcpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmRlbCh0aGlzLnVybChgL3VzZXIvYWNjZXNzdG9rZW4vJHttYXRjaGluZ1Rva2Vuc1swXS5pZH1gKSlcbiAgICAgIC5zZW5kKClcbiAgICAgIC5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSBhIHJhbmRvbSBwYXNzd29yZFxuICAgKiBAcGFyYW0gICB7TnVtYmVyfSBudW1Xb3JkcyAgICAgTnVtYmVyIG9mIDMyLWJpdCB3b3Jkc1xuICAgKiBAcmV0dXJucyB7U3RyaW5nfSAgICAgICAgICBiYXNlNTggcmFuZG9tIHBhc3N3b3JkXG4gICAqL1xuICBnZW5lcmF0ZVJhbmRvbVBhc3N3b3JkKG51bVdvcmRzID0gNSk6IHN0cmluZyB7XG4gICAgY29uc3QgYnl0ZXMgPSBzamNsLmNvZGVjLmJ5dGVzLmZyb21CaXRzKHNqY2wucmFuZG9tLnJhbmRvbVdvcmRzKG51bVdvcmRzKSk7XG4gICAgcmV0dXJuIGJzNTguZW5jb2RlKGJ5dGVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2dvdXQgb2YgQml0R29cbiAgICovXG4gIGFzeW5jIGxvZ291dCgpOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZ2V0KHRoaXMudXJsKCcvdXNlci9sb2dvdXQnKSkucmVzdWx0KCk7XG4gICAgdGhpcy5jbGVhcigpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgdXNlciBieSBJRCAobmFtZS9lbWFpbCBvbmx5KVxuICAgKiBAcGFyYW0gaWRcbiAgICpcbiAgICogQGRlcHJlY2F0ZWRcbiAgICovXG4gIGFzeW5jIGdldFVzZXIoeyBpZCB9OiBHZXRVc2VyT3B0aW9ucyk6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKCFfLmlzU3RyaW5nKGlkKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdleHBlY3RlZCBzdHJpbmcgaWQnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZ2V0KHRoaXMudXJsKGAvdXNlci8ke2lkfWApKS5yZXN1bHQoJ3VzZXInKTtcbiAgfVxuICAvKipcbiAgICogR2V0IHRoZSBjdXJyZW50IGxvZ2dlZCBpbiB1c2VyXG4gICAqL1xuICBhc3luYyBtZSgpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLmdldFVzZXIoeyBpZDogJ21lJyB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVbmxvY2sgdGhlIHNlc3Npb24gYnkgcHJvdmlkaW5nIE9UUFxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3RwIFJlcXVpcmVkIE9UUCBjb2RlIGZvciB0aGUgYWNjb3VudC5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGR1cmF0aW9uIERlc2lyZWQgZHVyYXRpb24gb2YgdGhlIHVubG9jayBpbiBzZWNvbmRzIChkZWZhdWx0PTYwMCwgbWF4PTM2MDApLlxuICAgKi9cbiAgYXN5bmMgdW5sb2NrKHsgb3RwLCBkdXJhdGlvbiB9OiBVbmxvY2tPcHRpb25zKTogUHJvbWlzZTxhbnk+IHtcbiAgICBpZiAob3RwICYmICFfLmlzU3RyaW5nKG90cCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZXhwZWN0ZWQgc3RyaW5nIG9yIHVuZGVmaW5lZCBvdHAnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMucG9zdCh0aGlzLnVybCgnL3VzZXIvdW5sb2NrJykpLnNlbmQoeyBvdHAsIGR1cmF0aW9uIH0pLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIExvY2sgdGhlIHNlc3Npb25cbiAgICovXG4gIGFzeW5jIGxvY2soKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5wb3N0KHRoaXMudXJsKCcvdXNlci9sb2NrJykpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgY3VycmVudCBzZXNzaW9uXG4gICAqL1xuICBhc3luYyBzZXNzaW9uKCk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KHRoaXMudXJsKCcvdXNlci9zZXNzaW9uJykpLnJlc3VsdCgnc2Vzc2lvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyaWdnZXIgYSBwdXNoL3NtcyBmb3IgdGhlIE9UUCBjb2RlXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gcGFyYW1zLmZvcmNlU01TIElmIHNldCB0byB0cnVlLCB3aWxsIHVzZSBTTVMgdG8gc2VuZCB0aGUgT1RQIHRvIHRoZSB1c2VyIGV2ZW4gaWYgdGhleSBoYXZlIG90aGVyIDJGQSBtZXRob2Qgc2V0IHVwLlxuICAgKiBAZGVwcmVjYXRlZFxuICAgKi9cbiAgYXN5bmMgc2VuZE9UUChwYXJhbXM6IHsgZm9yY2VTTVM/OiBib29sZWFuIH0gPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMucG9zdCh0aGlzLnVybCgnL3VzZXIvc2VuZG90cCcpKS5zZW5kKHBhcmFtcykucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogRXh0ZW5kIHRva2VuLCBwcm92aWRlZCB0aGUgY3VycmVudCB0b2tlbiBpcyBleHRlbmRhYmxlXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogLSBkdXJhdGlvbjogZHVyYXRpb24gaW4gc2Vjb25kcyBieSB3aGljaCB0byBleHRlbmQgdGhlIHRva2VuLCBzdGFydGluZyBhdCB0aGUgY3VycmVudCB0aW1lXG4gICAqL1xuICBhc3luYyBleHRlbmRUb2tlbihwYXJhbXM6IEV4dGVuZFRva2VuT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBpZiAoIXRoaXMuX2V4dGVuc2lvbktleSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIHByb3BlcnR5IF9leHRlbnNpb25LZXknKTtcbiAgICB9XG5cbiAgICBjb25zdCB0aW1lc3RhbXAgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IGR1cmF0aW9uID0gcGFyYW1zLmR1cmF0aW9uO1xuICAgIGNvbnN0IG1lc3NhZ2UgPSB0aW1lc3RhbXAgKyAnfCcgKyB0aGlzLl90b2tlbiArICd8JyArIGR1cmF0aW9uO1xuICAgIGNvbnN0IHByaXZhdGVLZXkgPSB0aGlzLl9leHRlbnNpb25LZXkucHJpdmF0ZUtleTtcbiAgICBpZiAoIXByaXZhdGVLZXkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbm8gcHJpdmF0ZUtleSBvbiBleHRlbnNpb25LZXknKTtcbiAgICB9XG4gICAgY29uc3QgaXNDb21wcmVzc2VkID0gdGhpcy5fZXh0ZW5zaW9uS2V5LmNvbXByZXNzZWQ7XG4gICAgY29uc3QgcHJlZml4ID0gdXR4b2xpYi5uZXR3b3Jrcy5iaXRjb2luLm1lc3NhZ2VQcmVmaXg7XG4gICAgY29uc3Qgc2lnbmF0dXJlID0gYml0Y29pbk1lc3NhZ2Uuc2lnbihtZXNzYWdlLCBwcml2YXRlS2V5LCBpc0NvbXByZXNzZWQsIHByZWZpeCkudG9TdHJpbmcoJ2hleCcpO1xuXG4gICAgcmV0dXJuIHRoaXMucG9zdCh0aGlzLnVybCgnL3VzZXIvZXh0ZW5kdG9rZW4nKSlcbiAgICAgIC5zZW5kKHBhcmFtcylcbiAgICAgIC5zZXQoJ3RpbWVzdGFtcCcsIHRpbWVzdGFtcC50b1N0cmluZygpKVxuICAgICAgLnNldCgnc2lnbmF0dXJlJywgc2lnbmF0dXJlKVxuICAgICAgLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIGtleSBmb3Igc2hhcmluZyBhIHdhbGxldCB3aXRoIGEgdXNlclxuICAgKiBAcGFyYW0gZW1haWwgZW1haWwgb2YgdXNlciB0byBzaGFyZSB3YWxsZXQgd2l0aFxuICAgKi9cbiAgYXN5bmMgZ2V0U2hhcmluZ0tleSh7IGVtYWlsIH06IEdldFNoYXJpbmdLZXlPcHRpb25zKTogUHJvbWlzZTxhbnk+IHtcbiAgICBpZiAoIV8uaXNTdHJpbmcoZW1haWwpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3JlcXVpcmVkIHN0cmluZyBlbWFpbCcpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnBvc3QodGhpcy51cmwoJy91c2VyL3NoYXJpbmdrZXknKSkuc2VuZCh7IGVtYWlsIH0pLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVzZXJzIHRoYXQgd2FudCB0byBzaWduIHdpdGggYSBrZXkgd2lsbCB1c2UgdGhpcyBhcGkgdG8gZmV0Y2ggdGhlIGtleWNoYWluIGFuZCB0aGUgcGF0aC5cbiAgICogVXNlcnMgdGhhdCB3YW50IHRvIHZlcmlmeSBhIHNpZ25hdHVyZSB3aWxsIHVzZSB0aGlzIGFwaSB0byBmZXRjaCBhbm90aGVyIHVzZXJzIGVjZGggcHVia2V5LlxuICAgKiBOb3RlOiBJZiB0aGUgdXNlciBpZCBpcyBub3QgcHJvdmlkZWQsIGl0IHdpbGwgZGVmYXVsdCB0byBnZXR0aW5nIHRoZSBjdXJyZW50IHVzZXIncyBrZXljaGFpbi5cbiAgICogQHBhcmFtIGJpdGdvXG4gICAqIEBwYXJhbSBlbnRlcnByaXNlSWRcbiAgICogQHBhcmFtIHVzZXJJZFxuICAgKi9cbiAgYXN5bmMgZ2V0U2lnbmluZ0tleUZvclVzZXIoZW50ZXJwcmlzZUlkOiBzdHJpbmcsIHVzZXJJZD86IHN0cmluZyk6IFByb21pc2U8R2V0U2lnbmluZ0tleUFwaT4ge1xuICAgIGNvbnN0IHVzZXIgPSB1c2VySWQgPz8gJ21lJztcbiAgICByZXR1cm4gdGhpcy5nZXQodGhpcy51cmwoYC9lbnRlcnByaXNlLyR7ZW50ZXJwcmlzZUlkfS91c2VyLyR7dXNlcn0vc2lnbmluZ2tleWAsIDIpKVxuICAgICAgLnF1ZXJ5KHt9KVxuICAgICAgLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqL1xuICBnZXRWYWxpZGF0ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsaWRhdGU7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICovXG4gIHNldFZhbGlkYXRlKHZhbGlkYXRlOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKCFfLmlzQm9vbGVhbih2YWxpZGF0ZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhcmd1bWVudCcpO1xuICAgIH1cbiAgICB0aGlzLl92YWxpZGF0ZSA9IHZhbGlkYXRlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVyIGEgbmV3IGNvaW4gaW5zdGFuY2Ugd2l0aCBpdHMgYnVpbGRlciBmYWN0b3J5XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIGNvaW4gbmFtZSBhcyBpdCB3YXMgcmVnaXN0ZXJlZCBpbiBAYml0Z28tYmV0YS9zdGF0aWNzXG4gICAqIEBwYXJhbSB7Q29pbkNvbnN0cnVjdG9yfSBjb2luIHRoZSBidWlsZGVyIGZhY3RvcnkgY2xhc3MgZm9yIHRoYXQgY29pblxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHB1YmxpYyByZWdpc3RlcihuYW1lOiBzdHJpbmcsIGNvaW46IENvaW5Db25zdHJ1Y3Rvcik6IHZvaWQge1xuICAgIEdsb2JhbENvaW5GYWN0b3J5LnJlZ2lzdGVyKG5hbWUsIGNvaW4pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBiaXRjb2luIG1hcmtldCBkYXRhXG4gICAqXG4gICAqIEBkZXByZWNhdGVkXG4gICAqL1xuICBtYXJrZXRzKCk6IGFueSB7XG4gICAgaWYgKCF0aGlzLl9tYXJrZXRzKSB7XG4gICAgICB0aGlzLl9tYXJrZXRzID0gbmV3IE1hcmtldHModGhpcyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9tYXJrZXRzO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgbGF0ZXN0IGJpdGNvaW4gcHJpY2VzXG4gICAqIChEZXByZWNhdGVkOiBXaWxsIGJlIHJlbW92ZWQgaW4gdGhlIGZ1dHVyZSkgdXNlIGBiaXRnby5tYXJrZXRzKCkubGF0ZXN0KClgXG4gICAqIEBkZXByZWNhdGVkXG4gICAqL1xuICAvLyBjYi1jb21wYXRcbiAgYXN5bmMgbWFya2V0KCk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KHRoaXMudXJsKCcvbWFya2V0L2xhdGVzdCcpKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgbWFya2V0IGRhdGEgZnJvbSB5ZXN0ZXJkYXlcbiAgICogKERlcHJlY2F0ZWQ6IFdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgZnV0dXJlKSB1c2UgYml0Z28ubWFya2V0cygpLnllc3RlcmRheSgpXG4gICAqIEBkZXByZWNhdGVkXG4gICAqL1xuICBhc3luYyB5ZXN0ZXJkYXkoKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5nZXQodGhpcy51cmwoJy9tYXJrZXQveWVzdGVyZGF5JykpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgYmxvY2tjaGFpbiBvYmplY3QuXG4gICAqIEBkZXByZWNhdGVkXG4gICAqL1xuICBibG9ja2NoYWluKCk6IGFueSB7XG4gICAgaWYgKCF0aGlzLl9ibG9ja2NoYWluKSB7XG4gICAgICB0aGlzLl9ibG9ja2NoYWluID0gbmV3IEJsb2NrY2hhaW4odGhpcyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9ibG9ja2NoYWluO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgdXNlcidzIGtleWNoYWlucyBvYmplY3QuXG4gICAqIEBkZXByZWNhdGVkXG4gICAqL1xuICBrZXljaGFpbnMoKTogYW55IHtcbiAgICBpZiAoIXRoaXMuX2tleWNoYWlucykge1xuICAgICAgdGhpcy5fa2V5Y2hhaW5zID0gbmV3IEtleWNoYWlucyh0aGlzKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2tleWNoYWlucztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHRyYXZlbCBydWxlIG9iamVjdFxuICAgKiBAZGVwcmVjYXRlZFxuICAgKi9cbiAgdHJhdmVsUnVsZSgpOiBhbnkge1xuICAgIGlmICghdGhpcy5fdHJhdmVsUnVsZSkge1xuICAgICAgdGhpcy5fdHJhdmVsUnVsZSA9IG5ldyBUcmF2ZWxSdWxlKHRoaXMpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fdHJhdmVsUnVsZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHVzZXIncyB3YWxsZXRzIG9iamVjdC5cbiAgICogQGRlcHJlY2F0ZWRcbiAgICovXG4gIHdhbGxldHMoKTogYW55IHtcbiAgICBpZiAoIXRoaXMuX3dhbGxldHMpIHtcbiAgICAgIHRoaXMuX3dhbGxldHMgPSBuZXcgV2FsbGV0cyh0aGlzKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldHM7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHBlbmRpbmcgYXBwcm92YWxzIHRoYXQgY2FuIGJlIGFwcHJvdmVkLyBvciByZWplY3RlZFxuICAgKiBAZGVwcmVjYXRlZFxuICAgKi9cbiAgcGVuZGluZ0FwcHJvdmFscygpOiBhbnkge1xuICAgIGlmICghdGhpcy5fcGVuZGluZ0FwcHJvdmFscykge1xuICAgICAgdGhpcy5fcGVuZGluZ0FwcHJvdmFscyA9IG5ldyBQZW5kaW5nQXBwcm92YWxzKHRoaXMpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fcGVuZGluZ0FwcHJvdmFscztcbiAgfVxuXG4gIC8qKlxuICAgKiBBIGZhY3RvcnkgbWV0aG9kIHRvIGNyZWF0ZSBhIG5ldyBXYWxsZXQgb2JqZWN0LCBpbml0aWFsaXplZCB3aXRoIHRoZSB3YWxsZXQgcGFyYW1zXG4gICAqIENhbiBiZSB1c2VkIHRvIHJlY29uc3RpdHV0ZSBhIHdhbGxldCBmcm9tIGNhY2hlZCBkYXRhXG4gICAqIEBwYXJhbSB3YWxsZXRQYXJhbXNcbiAgICogQGRlcHJlY2F0ZWRcbiAgICovXG4gIG5ld1dhbGxldE9iamVjdCh3YWxsZXRQYXJhbXMpOiBhbnkge1xuICAgIHJldHVybiBuZXcgV2FsbGV0KHRoaXMsIHdhbGxldFBhcmFtcyk7XG4gIH1cblxuICAvKipcbiAgICogVjEgbWV0aG9kIGZvciBjYWxjdWxhdGluZyBtaW5lciBmZWUgYW1vdW50cywgZ2l2ZW4gdGhlIG51bWJlciBhbmRcbiAgICogdHlwZSBvZiB0cmFuc2FjdGlvbiBpbnB1dHMsIGFsb25nIHdpdGggYSBmZWUgcmF0ZSBpbiBzYXRvc2hpcyBwZXIgdmtCLlxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIHVzZWQgZm9yIG5ldyBjb2RlLlxuICAgKlxuICAgKiBAZGVwcmVjYXRlZFxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEByZXR1cm4ge2FueX1cbiAgICovXG4gIGFzeW5jIGNhbGN1bGF0ZU1pbmVyRmVlSW5mbyhwYXJhbXM6IGFueSk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIFRyYW5zYWN0aW9uQnVpbGRlci5jYWxjdWxhdGVNaW5lckZlZUluZm8ocGFyYW1zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZnkgYSBCaXRjb2luIGFkZHJlc3MgaXMgYSB2YWxpZCBiYXNlNTggYWRkcmVzc1xuICAgKiBAZGVwcmVjYXRlZFxuICAgKi9cbiAgdmVyaWZ5QWRkcmVzcyhwYXJhbXM6IERlcHJlY2F0ZWRWZXJpZnlBZGRyZXNzT3B0aW9ucyA9IHt9KTogYm9vbGVhbiB7XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWydhZGRyZXNzJ10sIFtdKTtcblxuICAgIGlmICghXy5pc1N0cmluZyhwYXJhbXMuYWRkcmVzcykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyByZXF1aXJlZCBzdHJpbmcgYWRkcmVzcycpO1xuICAgIH1cblxuICAgIGNvbnN0IG5ldHdvcmtOYW1lID0gY29tbW9uLkVudmlyb25tZW50c1t0aGlzLmdldEVudigpXS5uZXR3b3JrO1xuICAgIGNvbnN0IG5ldHdvcmsgPSB1dHhvbGliLm5ldHdvcmtzW25ldHdvcmtOYW1lXTtcblxuICAgIGxldCBhZGRyZXNzO1xuICAgIHRyeSB7XG4gICAgICBhZGRyZXNzID0gdXR4b2xpYi5hZGRyZXNzLmZyb21CYXNlNThDaGVjayhwYXJhbXMuYWRkcmVzcywgbmV0d29yayk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiBhZGRyZXNzLnZlcnNpb24gPT09IG5ldHdvcmsucHViS2V5SGFzaCB8fCBhZGRyZXNzLnZlcnNpb24gPT09IG5ldHdvcmsuc2NyaXB0SGFzaDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTcGxpdCBhIHNlY3JldCBpbnRvIHNoYXJkcyB1c2luZyBTaGFtaXIgU2VjcmV0IFNoYXJpbmcuXG4gICAqIEBwYXJhbSBzZWVkIEEgaGV4YWRlY2ltYWwgc2VjcmV0IHRvIHNwbGl0XG4gICAqIEBwYXJhbSBwYXNzd29yZHMgQW4gYXJyYXkgb2YgdGhlIHBhc3N3b3JkcyB1c2VkIHRvIGVuY3J5cHQgZWFjaCBzaGFyZVxuICAgKiBAcGFyYW0gbSBUaGUgdGhyZXNob2xkIG51bWJlciBvZiBzaGFyZHMgbmVjZXNzYXJ5IHRvIHJlY29uc3RpdHV0ZSB0aGUgc2VjcmV0XG4gICAqL1xuICBzcGxpdFNlY3JldCh7IHNlZWQsIHBhc3N3b3JkcywgbSB9OiBTcGxpdFNlY3JldE9wdGlvbnMpOiBTcGxpdFNlY3JldCB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHBhc3N3b3JkcykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncGFzc3dvcmRzIG11c3QgYmUgYW4gYXJyYXknKTtcbiAgICB9XG4gICAgaWYgKCFfLmlzSW50ZWdlcihtKSB8fCBtIDwgMikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAyJyk7XG4gICAgfVxuXG4gICAgaWYgKHBhc3N3b3Jkcy5sZW5ndGggPCBtKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Bhc3N3b3JkcyBhcnJheSBsZW5ndGggY2Fubm90IGJlIGxlc3MgdGhhbiBtJyk7XG4gICAgfVxuXG4gICAgY29uc3QgbiA9IHBhc3N3b3Jkcy5sZW5ndGg7XG4gICAgY29uc3Qgc2VjcmV0czogc3RyaW5nW10gPSBzaGFtaXIuc2hhcmUoc2VlZCwgbiwgbSk7XG4gICAgY29uc3Qgc2hhcmRzID0gXy56aXBXaXRoKHNlY3JldHMsIHBhc3N3b3JkcywgKHNoYXJkLCBwYXNzd29yZCkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuZW5jcnlwdCh7IGlucHV0OiBzaGFyZCwgcGFzc3dvcmQgfSk7XG4gICAgfSk7XG4gICAgY29uc3Qgbm9kZSA9IGJpcDMyLmZyb21TZWVkKEJ1ZmZlci5mcm9tKHNlZWQsICdoZXgnKSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHhwdWI6IG5vZGUubmV1dGVyZWQoKS50b0Jhc2U1OCgpLFxuICAgICAgbSxcbiAgICAgIG4sXG4gICAgICBzZWVkU2hhcmVzOiBzaGFyZHMsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNvbnN0aXR1dGUgYSBzZWNyZXQgd2hpY2ggd2FzIHNoYXJkZWQgd2l0aCBgc3BsaXRTZWNyZXRgLlxuICAgKiBAcGFyYW0gc2hhcmRzXG4gICAqIEBwYXJhbSBwYXNzd29yZHNcbiAgICovXG4gIHJlY29uc3RpdHV0ZVNlY3JldCh7IHNoYXJkcywgcGFzc3dvcmRzIH06IFJlY29uc3RpdHV0ZVNlY3JldE9wdGlvbnMpOiBSZWNvbnN0aXR1dGVkU2VjcmV0IHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoc2hhcmRzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdzaGFyZHMgbXVzdCBiZSBhbiBhcnJheScpO1xuICAgIH1cbiAgICBpZiAoIUFycmF5LmlzQXJyYXkocGFzc3dvcmRzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdwYXNzd29yZHMgbXVzdCBiZSBhbiBhcnJheScpO1xuICAgIH1cblxuICAgIGlmIChzaGFyZHMubGVuZ3RoICE9PSBwYXNzd29yZHMubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3NoYXJkcyBhbmQgcGFzc3dvcmRzIGFycmF5cyBtdXN0IGhhdmUgc2FtZSBsZW5ndGgnKTtcbiAgICB9XG5cbiAgICBjb25zdCBzZWNyZXRzID0gXy56aXBXaXRoKHNoYXJkcywgcGFzc3dvcmRzLCAoc2hhcmQsIHBhc3N3b3JkKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5kZWNyeXB0KHsgaW5wdXQ6IHNoYXJkLCBwYXNzd29yZCB9KTtcbiAgICB9KTtcbiAgICBjb25zdCBzZWVkOiBzdHJpbmcgPSBzaGFtaXIuY29tYmluZShzZWNyZXRzKTtcbiAgICBjb25zdCBub2RlID0gYmlwMzIuZnJvbVNlZWQoQnVmZmVyLmZyb20oc2VlZCwgJ2hleCcpKTtcbiAgICByZXR1cm4ge1xuICAgICAgeHB1Yjogbm9kZS5uZXV0ZXJlZCgpLnRvQmFzZTU4KCkgYXMgc3RyaW5nLFxuICAgICAgeHBydjogbm9kZS50b0Jhc2U1OCgpIGFzIHN0cmluZyxcbiAgICAgIHNlZWQsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0gc2hhcmRzXG4gICAqIEBwYXJhbSBwYXNzd29yZHNcbiAgICogQHBhcmFtIG1cbiAgICogQHBhcmFtIHhwdWIgT3B0aW9uYWwgeHB1YiB0byB2ZXJpZnkgdGhlIHJlc3VsdHMgYWdhaW5zdFxuICAgKi9cbiAgdmVyaWZ5U2hhcmRzKHsgc2hhcmRzLCBwYXNzd29yZHMsIG0sIHhwdWIgfTogVmVyaWZ5U2hhcmRzT3B0aW9ucyk6IGJvb2xlYW4ge1xuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlIGFsbCBwb3NzaWJsZSBjb21iaW5hdGlvbnMgb2YgYSBnaXZlbiBhcnJheSdzIHZhbHVlcyBnaXZlbiBzdWJzZXQgc2l6ZSBtXG4gICAgICogQHBhcmFtIGFycmF5IFRoZSBhcnJheSB3aG9zZSB2YWx1ZXMgYXJlIHRvIGJlIGFycmFuZ2VkIGluIGFsbCBjb21iaW5hdGlvbnNcbiAgICAgKiBAcGFyYW0gbSBUaGUgc2l6ZSBvZiBlYWNoIHN1YnNldFxuICAgICAqIEBwYXJhbSBlbnRyeUluZGljZXMgUmVjdXJzaXZlbHkgdHJhaWxpbmcgc2V0IG9mIGN1cnJlbnRseSBjaG9zZW4gYXJyYXkgaW5kaWNlcyBmb3IgdGhlIGNvbWJpbmF0aW9uIHN1YnNldCB1bmRlciBjb25zdHJ1Y3Rpb25cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9XG4gICAgICovXG4gICAgY29uc3QgZ2VuZXJhdGVDb21iaW5hdGlvbnMgPSAoYXJyYXk6IHN0cmluZ1tdLCBtOiBudW1iZXIsIGVudHJ5SW5kaWNlczogbnVtYmVyW10gPSBbXSk6IHN0cmluZ1tdW10gPT4ge1xuICAgICAgbGV0IGNvbWJpbmF0aW9uczogc3RyaW5nW11bXSA9IFtdO1xuXG4gICAgICBpZiAoZW50cnlJbmRpY2VzLmxlbmd0aCA9PT0gbSkge1xuICAgICAgICBjb25zdCBjdXJyZW50Q29tYmluYXRpb24gPSBfLmF0KGFycmF5LCBlbnRyeUluZGljZXMpO1xuICAgICAgICByZXR1cm4gW2N1cnJlbnRDb21iaW5hdGlvbl07XG4gICAgICB9XG5cbiAgICAgIC8vIFRoZSBoaWdoZXN0IGluZGV4XG4gICAgICBsZXQgZW50cnlJbmRleCA9IF8ubGFzdChlbnRyeUluZGljZXMpO1xuICAgICAgLy8gSWYgdGhlcmUgYXJlIGN1cnJlbnRseSBubyBpbmRpY2VzLCBhc3N1bWUgLTFcbiAgICAgIGlmIChfLmlzVW5kZWZpbmVkKGVudHJ5SW5kZXgpKSB7XG4gICAgICAgIGVudHJ5SW5kZXggPSAtMTtcbiAgICAgIH1cbiAgICAgIGZvciAobGV0IGkgPSBlbnRyeUluZGV4ICsgMTsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIC8vIGFwcGVuZCB0aGUgY3VycmVudCBpbmRleCB0byB0aGUgdHJhaWxpbmcgaW5kaWNlc1xuICAgICAgICBjb25zdCBjdXJyZW50RW50cnlJbmRpY2VzID0gWy4uLmVudHJ5SW5kaWNlcywgaV07XG4gICAgICAgIGNvbnN0IG5ld0NvbWJpbmF0aW9ucyA9IGdlbmVyYXRlQ29tYmluYXRpb25zKGFycmF5LCBtLCBjdXJyZW50RW50cnlJbmRpY2VzKTtcbiAgICAgICAgY29tYmluYXRpb25zID0gWy4uLmNvbWJpbmF0aW9ucywgLi4ubmV3Q29tYmluYXRpb25zXTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGNvbWJpbmF0aW9ucztcbiAgICB9O1xuXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHNoYXJkcykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignc2hhcmRzIG11c3QgYmUgYW4gYXJyYXknKTtcbiAgICB9XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHBhc3N3b3JkcykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncGFzc3dvcmRzIG11c3QgYmUgYW4gYXJyYXknKTtcbiAgICB9XG5cbiAgICBpZiAoc2hhcmRzLmxlbmd0aCAhPT0gcGFzc3dvcmRzLmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdzaGFyZHMgYW5kIHBhc3N3b3JkcyBhcnJheXMgbXVzdCBoYXZlIHNhbWUgbGVuZ3RoJyk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2VjcmV0cyA9IF8uemlwV2l0aChzaGFyZHMsIHBhc3N3b3JkcywgKHNoYXJkLCBwYXNzd29yZCkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuZGVjcnlwdCh7IGlucHV0OiBzaGFyZCwgcGFzc3dvcmQgfSk7XG4gICAgfSk7XG4gICAgY29uc3Qgc2VjcmV0Q29tYmluYXRpb25zID0gZ2VuZXJhdGVDb21iaW5hdGlvbnMoc2VjcmV0cywgbSk7XG4gICAgY29uc3Qgc2VlZHMgPSBzZWNyZXRDb21iaW5hdGlvbnMubWFwKChjdXJyZW50Q29tYmluYXRpb24pID0+IHtcbiAgICAgIHJldHVybiBzaGFtaXIuY29tYmluZShjdXJyZW50Q29tYmluYXRpb24pO1xuICAgIH0pO1xuICAgIGNvbnN0IHVuaXF1ZVNlZWRzID0gXy51bmlxKHNlZWRzKTtcbiAgICBpZiAodW5pcXVlU2VlZHMubGVuZ3RoICE9PSAxKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IHNlZWQgPSBfLmZpcnN0KHVuaXF1ZVNlZWRzKTtcbiAgICBjb25zdCBub2RlID0gYmlwMzIuZnJvbVNlZWQoQnVmZmVyLmZyb20oc2VlZCwgJ2hleCcpKTtcbiAgICBjb25zdCByZXN0b3JlZFhwdWIgPSBub2RlLm5ldXRlcmVkKCkudG9CYXNlNTgoKTtcblxuICAgIGlmICghXy5pc1VuZGVmaW5lZCh4cHViKSkge1xuICAgICAgaWYgKCFfLmlzU3RyaW5nKHhwdWIpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigneHB1YiBtdXN0IGJlIGEgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgICBpZiAocmVzdG9yZWRYcHViICE9PSB4cHViKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCAtIHVzZSBgZ2V0U2hhcmVkU2VjcmV0KClgXG4gICAqL1xuICBnZXRFQ0RIU2VjcmV0KHsgb3RoZXJQdWJLZXlIZXgsIGVja2V5IH06IEdldEVjZGhTZWNyZXRPcHRpb25zKTogc3RyaW5nIHtcbiAgICBpZiAoIV8uaXNTdHJpbmcob3RoZXJQdWJLZXlIZXgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ290aGVyUHViS2V5SGV4IHN0cmluZyByZXF1aXJlZCcpO1xuICAgIH1cbiAgICBpZiAoIV8uaXNPYmplY3QoZWNrZXkpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Vja2V5IG9iamVjdCByZXF1aXJlZCcpO1xuICAgIH1cblxuICAgIHJldHVybiBnZXRTaGFyZWRTZWNyZXQoZWNrZXksIEJ1ZmZlci5mcm9tKG90aGVyUHViS2V5SGV4LCAnaGV4JykpLnRvU3RyaW5nKCdoZXgnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSB1c2VyJ3MgcHJpdmF0ZSBFQ0RIIGtleWNoYWluXG4gICAqL1xuICBhc3luYyBnZXRFQ0RIS2V5Y2hhaW4oZWNkaEtleWNoYWluUHViPzogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcbiAgICBpZiAoIWVjZGhLZXljaGFpblB1Yikge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5nZXQodGhpcy51cmwoJy91c2VyL3NldHRpbmdzJykpLnJlc3VsdCgpO1xuICAgICAgaWYgKCFyZXN1bHQuc2V0dGluZ3MuZWNkaEtleWNoYWluKSB7XG4gICAgICAgIHJldHVybiBuZXcgRXJyb3IoJ2VjZGgga2V5Y2hhaW4gbm90IGZvdW5kIGZvciB1c2VyJyk7XG4gICAgICB9XG4gICAgICBlY2RoS2V5Y2hhaW5QdWIgPSByZXN1bHQuc2V0dGluZ3MuZWNkaEtleWNoYWluO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5rZXljaGFpbnMoKS5nZXQoeyB4cHViOiBlY2RoS2V5Y2hhaW5QdWIgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgdXNlciBkZXJpdmVkIHB1YmxpYyBhbmQgcHJpdmF0ZSBFQ0RIIGtleXBhaXJcbiAgICogQHBhcmFtIHBhc3N3b3JkIHBhc3N3b3JkIHRvIGRlY3J5cHQgdGhlIHVzZXIncyBFQ0RIIGVuY3J5cHRlZCBwcml2YXRlIGtleVxuICAgKiBAcGFyYW0gZW50SWQ/IG9wdGlvbmFsIGVudGVycHJpc2UgaWQgdG8gY2hlY2sgZm9yIHBlcm1pc3Npb25zXG4gICAqL1xuICBhc3luYyBnZXRFY2RoS2V5cGFpclByaXZhdGUocGFzc3dvcmQ6IHN0cmluZywgZW50SWQ6IHN0cmluZyk6IFByb21pc2U8RWNkaERlcml2ZWRLZXlwYWlyPiB7XG4gICAgY29uc3QgdXNlclNpZ25pbmdLZXkgPSBhd2FpdCB0aGlzLmdldFNpZ25pbmdLZXlGb3JVc2VyKGVudElkKTtcbiAgICBjb25zdCBwdWJrZXlPZkFkbWluRWNkaEtleUhleCA9IHVzZXJTaWduaW5nS2V5LmRlcml2ZWRQdWJrZXk7XG4gICAgaWYgKCF1c2VyU2lnbmluZ0tleS5lY2RoS2V5Y2hhaW4gfHwgIXVzZXJTaWduaW5nS2V5LmRlcml2YXRpb25QYXRoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NvbWV0aGluZyB3ZW50IHdyb25nIHdpdGggdGhlIHVzZXIga2V5Y2hhaW4uIFBsZWFzZSBjb250YWN0IHN1cHBvcnRAYml0Z28uY29tLicpO1xuICAgIH1cbiAgICBjb25zdCB1c2VyRWNkaEtleWNoYWluID0gYXdhaXQgdGhpcy5nZXRFQ0RIS2V5Y2hhaW4odXNlclNpZ25pbmdLZXkuZWNkaEtleWNoYWluKTtcbiAgICBsZXQgeHBydjtcbiAgICB0cnkge1xuICAgICAgeHBydiA9IHRoaXMuZGVjcnlwdCh7XG4gICAgICAgIHBhc3N3b3JkOiBwYXNzd29yZCxcbiAgICAgICAgaW5wdXQ6IHVzZXJFY2RoS2V5Y2hhaW4uZW5jcnlwdGVkWHBydixcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW5jb3JyZWN0IHBhc3N3b3JkLiBQbGVhc2UgdHJ5IGFnYWluLicpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgZGVyaXZlZFB1YktleTogcHVia2V5T2ZBZG1pbkVjZGhLZXlIZXgsXG4gICAgICBkZXJpdmF0aW9uUGF0aDogdXNlclNpZ25pbmdLZXkuZGVyaXZhdGlvblBhdGgsXG4gICAgICB4cHJ2LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiAtIG9wZXJhdGluZ1N5c3RlbTogb25lIG9mIGlvcywgYW5kcm9pZFxuICAgKiAtIHB1c2hUb2tlbjogaGV4LWZvcm1hdHRlZCB0b2tlbiBmb3IgdGhlIHJlc3BlY3RpdmUgbmF0aXZlIHB1c2ggbm90aWZpY2F0aW9uIHNlcnZpY2VcbiAgICogQHJldHVybnMgeyp9XG4gICAqIEBkZXByZWNhdGVkXG4gICAqL1xuICBhc3luYyByZWdpc3RlclB1c2hUb2tlbihwYXJhbXM6IFJlZ2lzdGVyUHVzaFRva2VuT3B0aW9ucyk6IFByb21pc2U8YW55PiB7XG4gICAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsncHVzaFRva2VuJywgJ29wZXJhdGluZ1N5c3RlbSddLCBbXSk7XG5cbiAgICBpZiAoIXRoaXMuX3Rva2VuKSB7XG4gICAgICAvLyB0aGlzIGRldmljZSBoYXMgdG8gYmUgcmVnaXN0ZXJlZCB0byBhbiBleHRlbnNpYmxlIHNlc3Npb25cbiAgICAgIHRocm93IG5ldyBFcnJvcignbm90IGxvZ2dlZCBpbicpO1xuICAgIH1cblxuICAgIGNvbnN0IHBvc3RQYXJhbXMgPSBfLnBpY2socGFyYW1zLCBbJ3B1c2hUb2tlbicsICdvcGVyYXRpbmdTeXN0ZW0nXSk7XG5cbiAgICByZXR1cm4gdGhpcy5wb3N0KHRoaXMudXJsKCcvZGV2aWNlcycpKS5zZW5kKHBvc3RQYXJhbXMpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogLSBwdXNoVmVyaWZpY2F0aW9uVG9rZW46IHRoZSB0b2tlbiByZWNlaXZlZCB2aWEgcHVzaCBub3RpZmljYXRpb24gdG8gY29uZmlybSB0aGUgZGV2aWNlJ3MgbW9iaWxpdHlcbiAgICogQGRlcHJlY2F0ZWRcbiAgICovXG4gIHZlcmlmeVB1c2hUb2tlbihwYXJhbXM6IFZlcmlmeVB1c2hUb2tlbk9wdGlvbnMpOiBQcm9taXNlPGFueT4ge1xuICAgIGlmICghXy5pc09iamVjdChwYXJhbXMpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3JlcXVpcmVkIG9iamVjdCBwYXJhbXMnKTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNTdHJpbmcocGFyYW1zLnB1c2hWZXJpZmljYXRpb25Ub2tlbikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncmVxdWlyZWQgc3RyaW5nIHB1c2hWZXJpZmljYXRpb25Ub2tlbicpO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5fdG9rZW4pIHtcbiAgICAgIC8vIHRoaXMgZGV2aWNlIGhhcyB0byBiZSByZWdpc3RlcmVkIHRvIGFuIGV4dGVuc2libGUgc2Vzc2lvblxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdub3QgbG9nZ2VkIGluJyk7XG4gICAgfVxuXG4gICAgY29uc3QgcG9zdFBhcmFtcyA9IF8ucGljayhwYXJhbXMsICdwdXNoVmVyaWZpY2F0aW9uVG9rZW4nKTtcblxuICAgIHJldHVybiB0aGlzLnBvc3QodGhpcy51cmwoJy9kZXZpY2VzL3ZlcmlmeScpKS5zZW5kKHBvc3RQYXJhbXMpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIExvZ2luIHRvIHRoZSBiaXRnbyBzeXN0ZW0gdXNpbmcgYW4gYXV0aGNvZGUgZ2VuZXJhdGVkIHZpYSBPYXV0aFxuICAgKi9cbiAgYXN5bmMgYXV0aGVudGljYXRlV2l0aEF1dGhDb2RlKHBhcmFtczogQXV0aGVudGljYXRlV2l0aEF1dGhDb2RlT3B0aW9ucyk6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKCFfLmlzT2JqZWN0KHBhcmFtcykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncmVxdWlyZWQgb2JqZWN0IHBhcmFtcycpO1xuICAgIH1cblxuICAgIGlmICghXy5pc1N0cmluZyhwYXJhbXMuYXV0aENvZGUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3JlcXVpcmVkIHN0cmluZyBhdXRoQ29kZScpO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5fY2xpZW50SWQgfHwgIXRoaXMuX2NsaWVudFNlY3JldCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdOZWVkIGNsaWVudCBpZCBhbmQgc2VjcmV0IHNldCBmaXJzdCB0byB1c2UgdGhpcycpO1xuICAgIH1cblxuICAgIGNvbnN0IGF1dGhDb2RlID0gcGFyYW1zLmF1dGhDb2RlO1xuXG4gICAgaWYgKHRoaXMuX3Rva2VuKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2FscmVhZHkgbG9nZ2VkIGluJyk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVxdWVzdCA9IHRoaXMucG9zdCh0aGlzLl9iYXNlVXJsICsgJy9vYXV0aC90b2tlbicpO1xuICAgIHJlcXVlc3QuZm9yY2VWMUF1dGggPSB0cnVlOyAvLyBPQXV0aCBjdXJyZW50bHkgb25seSBzdXBwb3J0cyB2MSBhdXRoZW50aWNhdGlvblxuICAgIGNvbnN0IGJvZHkgPSBhd2FpdCByZXF1ZXN0XG4gICAgICAuc2VuZCh7XG4gICAgICAgIGdyYW50X3R5cGU6ICdhdXRob3JpemF0aW9uX2NvZGUnLFxuICAgICAgICBjb2RlOiBhdXRoQ29kZSxcbiAgICAgICAgY2xpZW50X2lkOiB0aGlzLl9jbGllbnRJZCxcbiAgICAgICAgY2xpZW50X3NlY3JldDogdGhpcy5fY2xpZW50U2VjcmV0LFxuICAgICAgfSlcbiAgICAgIC5yZXN1bHQoKTtcblxuICAgIHRoaXMuX3Rva2VuID0gYm9keS5hY2Nlc3NfdG9rZW47XG4gICAgdGhpcy5fcmVmcmVzaFRva2VuID0gYm9keS5yZWZyZXNoX3Rva2VuO1xuICAgIHRoaXMuX3VzZXIgPSBhd2FpdCB0aGlzLm1lKCk7XG4gICAgcmV0dXJuIGJvZHk7XG4gIH1cblxuICAvKipcbiAgICogQ2hhbmdlIHRoZSBwYXNzd29yZCBvZiB0aGUgY3VycmVudGx5IGxvZ2dlZCBpbiB1c2VyLlxuICAgKiBBbHNvIGNoYW5nZSBhbGwgdjEgYW5kIHYyIGtleWNoYWluIHBhc3N3b3JkcyBpZiB0aGV5IG1hdGNoIHRoZVxuICAgKiBnaXZlbiBvbGRQYXNzd29yZC4gUmV0dXJucyBub3RoaW5nIG9uIHN1Y2Nlc3MuXG4gICAqIEBwYXJhbSBvbGRQYXNzd29yZCB7U3RyaW5nfSAtIHRoZSBjdXJyZW50IHBhc3N3b3JkXG4gICAqIEBwYXJhbSBuZXdQYXNzd29yZCB7U3RyaW5nfSAtIHRoZSBuZXcgcGFzc3dvcmRcbiAgICovXG4gIGFzeW5jIGNoYW5nZVBhc3N3b3JkKHsgb2xkUGFzc3dvcmQsIG5ld1Bhc3N3b3JkIH06IENoYW5nZVBhc3N3b3JkT3B0aW9ucyk6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKCFfLmlzU3RyaW5nKG9sZFBhc3N3b3JkKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdleHBlY3RlZCBzdHJpbmcgb2xkUGFzc3dvcmQnKTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNTdHJpbmcobmV3UGFzc3dvcmQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2V4cGVjdGVkIHN0cmluZyBuZXdQYXNzd29yZCcpO1xuICAgIH1cblxuICAgIGNvbnN0IHVzZXIgPSB0aGlzLnVzZXIoKTtcbiAgICBpZiAodHlwZW9mIHVzZXIgIT09ICdvYmplY3QnIHx8ICF1c2VyLnVzZXJuYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcmVxdWlyZWQgb2JqZWN0IHVzZXInKTtcbiAgICB9XG5cbiAgICBjb25zdCB2YWxpZGF0aW9uID0gYXdhaXQgdGhpcy52ZXJpZnlQYXNzd29yZCh7IHBhc3N3b3JkOiBvbGRQYXNzd29yZCB9KTtcbiAgICBpZiAoIXZhbGlkYXRpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigndGhlIHByb3ZpZGVkIG9sZFBhc3N3b3JkIGlzIGluY29ycmVjdCcpO1xuICAgIH1cblxuICAgIC8vIGl0IGRvZXNuJ3QgbWF0dGVyIHdoaWNoIGNvaW4gd2UgY2hvb3NlIGJlY2F1c2UgdGhlIHYyIHVwZGF0ZVBhc3N3b3JkIGZ1bmN0aW9ucyB1cGRhdGVzIGFsbCB2MiBrZXljaGFpbnNcbiAgICAvLyB3ZSBqdXN0IG5lZWQgdG8gY2hvb3NlIGEgY29pbiB0aGF0IGV4aXN0cyBpbiB0aGUgY3VycmVudCBlbnZpcm9ubWVudFxuICAgIGNvbnN0IGNvaW4gPSBjb21tb24uRW52aXJvbm1lbnRzW3RoaXMuZ2V0RW52KCldLm5ldHdvcmsgPT09ICdiaXRjb2luJyA/ICdidGMnIDogJ3RidGMnO1xuXG4gICAgY29uc3QgdXBkYXRlS2V5Y2hhaW5QYXNzd29yZFBhcmFtcyA9IHsgb2xkUGFzc3dvcmQsIG5ld1Bhc3N3b3JkIH07XG4gICAgY29uc3QgdjFLZXljaGFpblVwZGF0ZVBXUmVzdWx0ID0gYXdhaXQgdGhpcy5rZXljaGFpbnMoKS51cGRhdGVQYXNzd29yZCh1cGRhdGVLZXljaGFpblBhc3N3b3JkUGFyYW1zKTtcbiAgICBjb25zdCB2MktleWNoYWlucyA9IGF3YWl0IHRoaXMuY29pbihjb2luKS5rZXljaGFpbnMoKS51cGRhdGVQYXNzd29yZCh1cGRhdGVLZXljaGFpblBhc3N3b3JkUGFyYW1zKTtcblxuICAgIGNvbnN0IHVwZGF0ZVBhc3N3b3JkUGFyYW1zID0ge1xuICAgICAga2V5Y2hhaW5zOiB2MUtleWNoYWluVXBkYXRlUFdSZXN1bHQua2V5Y2hhaW5zLFxuICAgICAgdjJfa2V5Y2hhaW5zOiB2MktleWNoYWlucyxcbiAgICAgIHZlcnNpb246IHYxS2V5Y2hhaW5VcGRhdGVQV1Jlc3VsdC52ZXJzaW9uLFxuICAgICAgb2xkUGFzc3dvcmQ6IHRoaXMuY2FsY3VsYXRlSE1BQyh1c2VyLnVzZXJuYW1lLCBvbGRQYXNzd29yZCksXG4gICAgICBwYXNzd29yZDogdGhpcy5jYWxjdWxhdGVITUFDKHVzZXIudXNlcm5hbWUsIG5ld1Bhc3N3b3JkKSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMucG9zdCh0aGlzLnVybCgnL3VzZXIvY2hhbmdlcGFzc3dvcmQnKSkuc2VuZCh1cGRhdGVQYXNzd29yZFBhcmFtcykucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFsbCB0aGUgYWRkcmVzcyBsYWJlbHMgb24gYWxsIG9mIHRoZSB1c2VyJ3Mgd2FsbGV0c1xuICAgKlxuICAgKiBAZGVwcmVjYXRlZFxuICAgKi9cbiAgYXN5bmMgbGFiZWxzKCk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KHRoaXMudXJsKCcvbGFiZWxzJykpLnJlc3VsdCgnbGFiZWxzJyk7XG4gIH1cblxuICAvKipcbiAgICogRXN0aW1hdGVzIGFwcHJveGltYXRlIGZlZSBwZXIga2IgbmVlZGVkIGZvciBhIHR4IHRvIGdldCBpbnRvIGEgYmxvY2tcbiAgICogQHBhcmFtIHtudW1iZXJ9IHBhcmFtcy5udW1CbG9ja3MgdGFyZ2V0IGJsb2NrcyBmb3IgdGhlIHRyYW5zYWN0aW9uIHRvIGJlIGNvbmZpcm1lZFxuICAgKiBAcGFyYW0ge251bWJlcn0gcGFyYW1zLm1heEZlZSBtYXhpbXVtIGZlZSB3aWxsaW5nIHRvIGJlIHBhaWQgKGZvciBzYWZldHkpXG4gICAqIEBwYXJhbSB7YXJyYXlbc3RyaW5nXX0gcGFyYW1zLmlucHV0cyBsaXN0IG9mIHVuY29uZmlybWVkIHR4SWRzIGZyb20gd2hpY2ggdGhpcyB0cmFuc2FjdGlvbiB1c2VzIGlucHV0c1xuICAgKiBAcGFyYW0ge251bWJlcn0gcGFyYW1zLnR4U2l6ZSBlc3RpbWF0ZWQgdHJhbnNhY3Rpb24gc2l6ZSBpbiBieXRlcywgb3B0aW9uYWwgcGFyYW1ldGVyIHVzZWQgZm9yIENQRlAgZXN0aW1hdGlvbi5cbiAgICogQHBhcmFtIHtib29sZWFufSBwYXJhbXMuY3BmcEF3YXJlIGZsYWcgaW5kaWNhdGluZyBmZWUgc2hvdWxkIHRha2UgaW50byBhY2NvdW50IENQRlBcbiAgICogQGRlcHJlY2F0ZWRcbiAgICovXG4gIGFzeW5jIGVzdGltYXRlRmVlKHBhcmFtczogRXN0aW1hdGVGZWVPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IHF1ZXJ5UGFyYW1zOiBhbnkgPSB7IHZlcnNpb246IDEyIH07XG4gICAgaWYgKHBhcmFtcy5udW1CbG9ja3MpIHtcbiAgICAgIGlmICghXy5pc051bWJlcihwYXJhbXMubnVtQmxvY2tzKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYXJndW1lbnQnKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5UGFyYW1zLm51bUJsb2NrcyA9IHBhcmFtcy5udW1CbG9ja3M7XG4gICAgfVxuICAgIGlmIChwYXJhbXMubWF4RmVlKSB7XG4gICAgICBpZiAoIV8uaXNOdW1iZXIocGFyYW1zLm1heEZlZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGFyZ3VtZW50Jyk7XG4gICAgICB9XG4gICAgICBxdWVyeVBhcmFtcy5tYXhGZWUgPSBwYXJhbXMubWF4RmVlO1xuICAgIH1cbiAgICBpZiAocGFyYW1zLmlucHV0cykge1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHBhcmFtcy5pbnB1dHMpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhcmd1bWVudCcpO1xuICAgICAgfVxuICAgICAgcXVlcnlQYXJhbXMuaW5wdXRzID0gcGFyYW1zLmlucHV0cztcbiAgICB9XG4gICAgaWYgKHBhcmFtcy50eFNpemUpIHtcbiAgICAgIGlmICghXy5pc051bWJlcihwYXJhbXMudHhTaXplKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYXJndW1lbnQnKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5UGFyYW1zLnR4U2l6ZSA9IHBhcmFtcy50eFNpemU7XG4gICAgfVxuICAgIGlmIChwYXJhbXMuY3BmcEF3YXJlKSB7XG4gICAgICBpZiAoIV8uaXNCb29sZWFuKHBhcmFtcy5jcGZwQXdhcmUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhcmd1bWVudCcpO1xuICAgICAgfVxuICAgICAgcXVlcnlQYXJhbXMuY3BmcEF3YXJlID0gcGFyYW1zLmNwZnBBd2FyZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5nZXQodGhpcy51cmwoJy90eC9mZWUnKSkucXVlcnkocXVlcnlQYXJhbXMpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBCaXRHbydzIGd1YXJhbnRlZSB1c2luZyBhbiBpbnN0YW50IGlkXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQGRlcHJlY2F0ZWRcbiAgICovXG4gIGFzeW5jIGluc3RhbnRHdWFyYW50ZWUocGFyYW1zOiB7IGlkOiBzdHJpbmcgfSk6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKCFfLmlzU3RyaW5nKHBhcmFtcy5pZCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncmVxdWlyZWQgc3RyaW5nIGlkJyk7XG4gICAgfVxuXG4gICAgY29uc3QgYm9keSA9IGF3YWl0IHRoaXMuZ2V0KHRoaXMudXJsKCcvaW5zdGFudC8nICsgcGFyYW1zLmlkKSkucmVzdWx0KCk7XG4gICAgaWYgKCFib2R5Lmd1YXJhbnRlZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdubyBndWFyYW50ZWUgZm91bmQgaW4gcmVzcG9uc2UgYm9keScpO1xuICAgIH1cbiAgICBpZiAoIWJvZHkuc2lnbmF0dXJlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ25vIHNpZ25hdHVyZSBmb3VuZCBpbiBndWFyYW50ZWUgcmVzcG9uc2UgYm9keScpO1xuICAgIH1cbiAgICBjb25zdCBzaWduaW5nQWRkcmVzcyA9IGNvbW1vbi5FbnZpcm9ubWVudHNbdGhpcy5nZXRFbnYoKV0uc2lnbmluZ0FkZHJlc3M7XG4gICAgY29uc3Qgc2lnbmF0dXJlQnVmZmVyID0gQnVmZmVyLmZyb20oYm9keS5zaWduYXR1cmUsICdoZXgnKTtcbiAgICBjb25zdCBwcmVmaXggPSB1dHhvbGliLm5ldHdvcmtzW2NvbW1vbi5FbnZpcm9ubWVudHNbdGhpcy5nZXRFbnYoKV0ubmV0d29ya10ubWVzc2FnZVByZWZpeDtcbiAgICBjb25zdCBpc1ZhbGlkU2lnbmF0dXJlID0gYml0Y29pbk1lc3NhZ2UudmVyaWZ5KGJvZHkuZ3VhcmFudGVlLCBzaWduaW5nQWRkcmVzcywgc2lnbmF0dXJlQnVmZmVyLCBwcmVmaXgpO1xuICAgIGlmICghaXNWYWxpZFNpZ25hdHVyZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbmNvcnJlY3Qgc2lnbmF0dXJlJyk7XG4gICAgfVxuICAgIHJldHVybiBib2R5O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIHRhcmdldCBhZGRyZXNzIGZvciBwYXltZW50IG9mIGEgQml0R28gZmVlXG4gICAqIEBkZXByZWNhdGVkXG4gICAqL1xuICBhc3luYyBnZXRCaXRHb0ZlZUFkZHJlc3MoKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5wb3N0KHRoaXMudXJsKCcvYmlsbGluZy9hZGRyZXNzJykpLnNlbmQoe30pLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYW4gYWRkcmVzcyBvYmplY3QgKGluY2x1ZGluZyB0aGUgd2FsbGV0IGlkKSBmb3IgYSBnaXZlbiBhZGRyZXNzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLmFkZHJlc3MgVGhlIGFkZHJlc3MgdG8gbG9vayB1cC5cbiAgICogQGRlcHJlY2F0ZWRcbiAgICovXG4gIGFzeW5jIGdldFdhbGxldEFkZHJlc3MoeyBhZGRyZXNzIH06IHsgYWRkcmVzczogc3RyaW5nIH0pOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLmdldCh0aGlzLnVybChgL3dhbGxldGFkZHJlc3MvJHthZGRyZXNzfWApKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaCBsaXN0IG9mIHVzZXIgd2ViaG9va3NcbiAgICpcbiAgICogQHJldHVybnMgeyp9XG4gICAqIEBkZXByZWNhdGVkXG4gICAqL1xuICBhc3luYyBsaXN0V2ViaG9va3MoKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5nZXQodGhpcy51cmwoJy93ZWJob29rcycpKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgbmV3IHVzZXIgd2ViaG9va1xuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKiBAZGVwcmVjYXRlZFxuICAgKi9cbiAgYXN5bmMgYWRkV2ViaG9vayhwYXJhbXM6IFdlYmhvb2tPcHRpb25zKTogUHJvbWlzZTxhbnk+IHtcbiAgICBpZiAoIV8uaXNTdHJpbmcocGFyYW1zLnVybCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncmVxdWlyZWQgc3RyaW5nIHVybCcpO1xuICAgIH1cblxuICAgIGlmICghXy5pc1N0cmluZyhwYXJhbXMudHlwZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncmVxdWlyZWQgc3RyaW5nIHR5cGUnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5wb3N0KHRoaXMudXJsKCcvd2ViaG9va3MnKSkuc2VuZChwYXJhbXMpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSB1c2VyIHdlYmhvb2tcbiAgICpcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICogQGRlcHJlY2F0ZWRcbiAgICovXG4gIGFzeW5jIHJlbW92ZVdlYmhvb2socGFyYW1zOiBXZWJob29rT3B0aW9ucyk6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKCFfLmlzU3RyaW5nKHBhcmFtcy51cmwpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3JlcXVpcmVkIHN0cmluZyB1cmwnKTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNTdHJpbmcocGFyYW1zLnR5cGUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3JlcXVpcmVkIHN0cmluZyB0eXBlJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZGVsKHRoaXMudXJsKCcvd2ViaG9va3MnKSkuc2VuZChwYXJhbXMpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoIGxpc3Qgb2Ygd2ViaG9vayBub3RpZmljYXRpb25zIGZvciB0aGUgdXNlclxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgYXN5bmMgbGlzdFdlYmhvb2tOb3RpZmljYXRpb25zKHBhcmFtczogTGlzdFdlYmhvb2tOb3RpZmljYXRpb25zT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCBxdWVyeTogYW55ID0ge307XG4gICAgaWYgKHBhcmFtcy5wcmV2SWQpIHtcbiAgICAgIGlmICghXy5pc1N0cmluZyhwYXJhbXMucHJldklkKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgcHJldklkIGFyZ3VtZW50LCBleHBlY3Rpbmcgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5wcmV2SWQgPSBwYXJhbXMucHJldklkO1xuICAgIH1cbiAgICBpZiAocGFyYW1zLmxpbWl0KSB7XG4gICAgICBpZiAoIV8uaXNOdW1iZXIocGFyYW1zLmxpbWl0KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgbGltaXQgYXJndW1lbnQsIGV4cGVjdGluZyBudW1iZXInKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LmxpbWl0ID0gcGFyYW1zLmxpbWl0O1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmdldCh0aGlzLnVybCgnL3dlYmhvb2tzL25vdGlmaWNhdGlvbnMnKSkucXVlcnkocXVlcnkpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNpbXVsYXRlIGEgdXNlciB3ZWJob29rXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBhc3luYyBzaW11bGF0ZVdlYmhvb2socGFyYW1zOiBCaXRHb1NpbXVsYXRlV2ViaG9va09wdGlvbnMpOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnd2ViaG9va0lkJywgJ2Jsb2NrSWQnXSwgW10pO1xuICAgIGlmICghXy5pc1N0cmluZyhwYXJhbXMud2ViaG9va0lkKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdyZXF1aXJlZCBzdHJpbmcgd2ViaG9va0lkJyk7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzU3RyaW5nKHBhcmFtcy5ibG9ja0lkKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdyZXF1aXJlZCBzdHJpbmcgYmxvY2tJZCcpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnBvc3QodGhpcy51cmwoYC93ZWJob29rcy8ke3BhcmFtcy53ZWJob29rSWR9L3NpbXVsYXRlYCkpXG4gICAgICAuc2VuZChwYXJhbXMpXG4gICAgICAucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogU3luY2hyb25vdXNseSBnZXQgY29uc3RhbnRzIHdoaWNoIGFyZSByZWxldmFudCB0byB0aGUgY2xpZW50LlxuICAgKlxuICAgKiBOb3RlOiBUaGlzIGZ1bmN0aW9uIGhhcyBhIGtub3duIHJhY2UgY29uZGl0aW9uLiBJdCBtYXkgcmV0dXJuIGRpZmZlcmVudCB2YWx1ZXMgb3ZlciB0aW1lLFxuICAgKiBlc3BlY2lhbGx5IGlmIGNhbGxlZCBzaG9ydGx5IGFmdGVyIGNyZWF0aW9uIG9mIHRoZSBCaXRHbyBvYmplY3QuXG4gICAqXG4gICAqIE5ldyBjb2RlIHNob3VsZCBjYWxsIGZldGNoQ29uc3RhbnRzKCkgZGlyZWN0bHkgaW5zdGVhZC5cbiAgICpcbiAgICogQGRlcHJlY2F0ZWRcbiAgICogQHJldHVybiB7T2JqZWN0fSBUaGUgY2xpZW50IGNvbnN0YW50cyBvYmplY3RcbiAgICovXG4gIGdldENvbnN0YW50cygpOiBhbnkge1xuICAgIC8vIGtpY2sgb2ZmIGEgZnJlc2ggcmVxdWVzdCBmb3IgdGhlIGNsaWVudCBjb25zdGFudHNcbiAgICB0aGlzLmZldGNoQ29uc3RhbnRzKCkuY2F0Y2goZnVuY3Rpb24gKGVycikge1xuICAgICAgaWYgKGVycikge1xuICAgICAgICAvLyBtYWtlIHN1cmUgYW4gZXJyb3IgZG9lcyBub3QgdGVybWluYXRlIHRoZSBlbnRpcmUgc2NyaXB0XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ2ZhaWxlZCB0byBmZXRjaCBjbGllbnQgY29uc3RhbnRzIGZyb20gQml0R28nKTtcbiAgICAgICAgY29uc29sZS50cmFjZShlcnIpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gdXNlIGRlZmF1bHRDb25zdGFudHMgYXMgdGhlIGJhY2t1cCBmb3Iga2V5cyB0aGF0IGFyZSBub3Qgc2V0IGluIHRoaXMuX2NvbnN0YW50c1xuICAgIHJldHVybiBfLm1lcmdlKHt9LCBkZWZhdWx0Q29uc3RhbnRzKHRoaXMuZ2V0RW52KCkpLCBCaXRHb0FQSS5fY29uc3RhbnRzW3RoaXMuZ2V0RW52KCldKTtcbiAgfVxufVxuIl19
1929
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYml0Z29BUEkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYml0Z29BUEkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsbURBdUI4QjtBQUM5Qiw4REFBZ0Q7QUFDaEQsOERBQWdEO0FBQ2hELG1EQUE4RDtBQUM5RCxrRUFBb0Q7QUFFcEQsa0RBQTZCO0FBQzdCLDBDQUE0QjtBQUM1QixxREFBdUM7QUFDdkMsdURBQXlDO0FBQ3pDLCtCQU9lO0FBQ2YsdUNBQTZDO0FBQzdDLHNEQUFtRDtBQTRDbkQsNENBQTZDO0FBQzdDLHlDQUEwQztBQUMxQyxNQUFNLEtBQUssR0FBRyxJQUFBLGVBQVEsRUFBQyxXQUFXLENBQUMsQ0FBQztBQUVwQyxNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsaUJBQWlCLENBQUMsQ0FBQztBQUM5QyxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztBQUM1QyxzQ0FBdUM7QUFFdkMsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDO0FBQ3hDLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQztBQUN4QyxNQUFNLGdCQUFnQixHQUFHLE9BQU8sQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO0FBQzFELE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0FBQzlDLE1BQU0sa0JBQWtCLEdBQUcsT0FBTyxDQUFDLHlCQUF5QixDQUFDLENBQUM7QUFFOUQsTUFBYSxRQUFRO0lBcUNuQixZQUFZLFNBQTBCLEVBQUU7UUFuQnJCLGlCQUFZLEdBQXVELENBQUMsQ0FBQztRQUM5RSxzQkFBaUIsR0FBRyxJQUFJLENBQUM7UUFNekIsYUFBUSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUM7UUFhakMsSUFBSSxDQUFDLHNCQUFzQixHQUFHLE1BQU0sQ0FBQyxz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QUFVLEVBQUUsQ0FBQztvQkFFYixJQUFJLFVBQVUsSUFBSSxVQUFVLEVBQUUsQ0FBQzt3QkFDN0IsTUFBTSxJQUFJLEtBQUssQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLGlCQUFpQixVQUFVLGFBQWEsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7b0JBQ3pGLENBQUM7Z0JBQ0gsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQzs7QUFubkVILDRCQW9uRUM7QUF6bUVrQiwrQkFBc0IsR0FBRyxLQUFLLEFBQVIsQ0FBUyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFsaWFzRW52aXJvbm1lbnRzLFxuICBCYXNlQ29pbixcbiAgYml0Y29pbixcbiAgQml0R29CYXNlLFxuICBCaXRHb1JlcXVlc3QsXG4gIENvaW5Db25zdHJ1Y3RvcixcbiAgY29tbW9uLFxuICBEZWNyeXB0S2V5c09wdGlvbnMsXG4gIERlY3J5cHRPcHRpb25zLFxuICBkZWZhdWx0Q29uc3RhbnRzLFxuICBFY2RoRGVyaXZlZEtleXBhaXIsXG4gIEVuY3J5cHRPcHRpb25zLFxuICBFbnZpcm9ubWVudE5hbWUsXG4gIGdlbmVyYXRlUmFuZG9tUGFzc3dvcmQsXG4gIGdldEFkZHJlc3NQMlBLSCxcbiAgZ2V0U2hhcmVkU2VjcmV0LFxuICBHZXRTaGFyaW5nS2V5T3B0aW9ucyxcbiAgR2V0U2lnbmluZ0tleUFwaSxcbiAgR2xvYmFsQ29pbkZhY3RvcnksXG4gIElSZXF1ZXN0VHJhY2VyLFxuICBtYWtlUmFuZG9tS2V5LFxuICBzYW5pdGl6ZUxlZ2FjeVBhdGgsXG59IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCAqIGFzIHNka0htYWMgZnJvbSAnQGJpdGdvLWJldGEvc2RrLWhtYWMnO1xuaW1wb3J0ICogYXMgdXR4b2xpYiBmcm9tICdAYml0Z28tYmV0YS91dHhvLWxpYic7XG5pbXBvcnQgeyBiaXAzMiwgRUNQYWlySW50ZXJmYWNlIH0gZnJvbSAnQGJpdGdvLWJldGEvdXR4by1saWInO1xuaW1wb3J0ICogYXMgYml0Y29pbk1lc3NhZ2UgZnJvbSAnYml0Y29pbmpzLW1lc3NhZ2UnO1xuaW1wb3J0IHsgdHlwZSBBZ2VudCB9IGZyb20gJ2h0dHAnO1xuaW1wb3J0IGRlYnVnTGliIGZyb20gJ2RlYnVnJztcbmltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCAqIGFzIHNlY3AyNTZrMSBmcm9tICdzZWNwMjU2azEnO1xuaW1wb3J0ICogYXMgc3VwZXJhZ2VudCBmcm9tICdzdXBlcmFnZW50JztcbmltcG9ydCB7XG4gIGhhbmRsZVJlc3BvbnNlRXJyb3IsXG4gIGhhbmRsZVJlc3BvbnNlUmVzdWx0LFxuICBzZXJpYWxpemVSZXF1ZXN0RGF0YSxcbiAgc2V0UmVxdWVzdFF1ZXJ5U3RyaW5nLFxuICB0b0JpdGdvUmVxdWVzdCxcbiAgdmVyaWZ5UmVzcG9uc2UsXG59IGZyb20gJy4vYXBpJztcbmltcG9ydCB7IGRlY3J5cHQsIGVuY3J5cHQgfSBmcm9tICcuL2VuY3J5cHQnO1xuaW1wb3J0IHsgdmVyaWZ5QWRkcmVzcyB9IGZyb20gJy4vdjEvdmVyaWZ5QWRkcmVzcyc7XG5pbXBvcnQge1xuICBBY2Nlc3NUb2tlbk9wdGlvbnMsXG4gIEFkZEFjY2Vzc1Rva2VuT3B0aW9ucyxcbiAgQWRkQWNjZXNzVG9rZW5SZXNwb25zZSxcbiAgQWRkaXRpb25hbEhlYWRlcnNDYWxsYmFjayxcbiAgQXV0aGVudGljYXRlT3B0aW9ucyxcbiAgQXV0aGVudGljYXRlV2l0aEF1dGhDb2RlT3B0aW9ucyxcbiAgQml0R29BUElPcHRpb25zLFxuICBCaXRHb0pzb24sXG4gIEJpdEdvU2ltdWxhdGVXZWJob29rT3B0aW9ucyxcbiAgQ2FsY3VsYXRlSG1hY1N1YmplY3RPcHRpb25zLFxuICBDYWxjdWxhdGVSZXF1ZXN0SGVhZGVyc09wdGlvbnMsXG4gIENhbGN1bGF0ZVJlcXVlc3RIbWFjT3B0aW9ucyxcbiAgQ2hhbmdlUGFzc3dvcmRPcHRpb25zLFxuICBDb25zdGFudHMsXG4gIERlcHJlY2F0ZWRWZXJpZnlBZGRyZXNzT3B0aW9ucyxcbiAgRXN0aW1hdGVGZWVPcHRpb25zLFxuICBFeHRlbmRUb2tlbk9wdGlvbnMsXG4gIEdldEVjZGhTZWNyZXRPcHRpb25zLFxuICBHZXRVc2VyT3B0aW9ucyxcbiAgTGlzdFdlYmhvb2tOb3RpZmljYXRpb25zT3B0aW9ucyxcbiAgTG9naW5SZXNwb25zZSxcbiAgUGluZ09wdGlvbnMsXG4gIFByb2Nlc3NlZEF1dGhlbnRpY2F0aW9uT3B0aW9ucyxcbiAgUmVjb25zdGl0dXRlZFNlY3JldCxcbiAgUmVjb25zdGl0dXRlU2VjcmV0T3B0aW9ucyxcbiAgUmVnaXN0ZXJQdXNoVG9rZW5PcHRpb25zLFxuICBSZW1vdmVBY2Nlc3NUb2tlbk9wdGlvbnMsXG4gIFJlcXVlc3RIZWFkZXJzLFxuICBSZXF1ZXN0TWV0aG9kcyxcbiAgU3BsaXRTZWNyZXQsXG4gIFNwbGl0U2VjcmV0T3B0aW9ucyxcbiAgVG9rZW5Jc3N1YW5jZSxcbiAgVG9rZW5Jc3N1YW5jZVJlc3BvbnNlLFxuICBVbmxvY2tPcHRpb25zLFxuICBVc2VyLFxuICBWZXJpZnlQYXNzd29yZE9wdGlvbnMsXG4gIFZlcmlmeVB1c2hUb2tlbk9wdGlvbnMsXG4gIFZlcmlmeVJlc3BvbnNlSW5mbyxcbiAgVmVyaWZ5UmVzcG9uc2VPcHRpb25zLFxuICBWZXJpZnlTaGFyZHNPcHRpb25zLFxuICBXZWJob29rT3B0aW9ucyxcbn0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgc2hhbWlyID0gcmVxdWlyZSgnc2VjcmV0cy5qcy1ncmVtcGUnKTtcbmltcG9ydCBwanNvbiA9IHJlcXVpcmUoJy4uL3BhY2thZ2UuanNvbicpO1xuY29uc3QgZGVidWcgPSBkZWJ1Z0xpYignYml0Z286YXBpJyk7XG5cbmNvbnN0IEJsb2NrY2hhaW4gPSByZXF1aXJlKCcuL3YxL2Jsb2NrY2hhaW4nKTtcbmNvbnN0IEtleWNoYWlucyA9IHJlcXVpcmUoJy4vdjEva2V5Y2hhaW5zJyk7XG5pbXBvcnQgV2FsbGV0ID0gcmVxdWlyZSgnLi92MS93YWxsZXQnKTtcblxuY29uc3QgV2FsbGV0cyA9IHJlcXVpcmUoJy4vdjEvd2FsbGV0cycpO1xuY29uc3QgTWFya2V0cyA9IHJlcXVpcmUoJy4vdjEvbWFya2V0cycpO1xuY29uc3QgUGVuZGluZ0FwcHJvdmFscyA9IHJlcXVpcmUoJy4vdjEvcGVuZGluZ2FwcHJvdmFscycpO1xuY29uc3QgVHJhdmVsUnVsZSA9IHJlcXVpcmUoJy4vdjEvdHJhdmVsUnVsZScpO1xuY29uc3QgVHJhbnNhY3Rpb25CdWlsZGVyID0gcmVxdWlyZSgnLi92MS90cmFuc2FjdGlvbkJ1aWxkZXInKTtcblxuZXhwb3J0IGNsYXNzIEJpdEdvQVBJIGltcGxlbWVudHMgQml0R29CYXNlIHtcbiAgLy8gdjEgdHlwZXNcbiAgcHJvdGVjdGVkIF9rZXljaGFpbnM6IGFueTtcbiAgcHJvdGVjdGVkIF93YWxsZXRzOiBhbnk7XG4gIHByb3RlY3RlZCBfbWFya2V0cz86IGFueTtcbiAgcHJvdGVjdGVkIF9ibG9ja2NoYWluPzogYW55O1xuICBwcm90ZWN0ZWQgX3RyYXZlbFJ1bGU/OiBhbnk7XG4gIHByb3RlY3RlZCBfcGVuZGluZ0FwcHJvdmFscz86IGFueTtcblxuICBwcm90ZWN0ZWQgc3RhdGljIF9jb25zdGFudHM6IGFueTtcbiAgcHJvdGVjdGVkIHN0YXRpYyBfY29uc3RhbnRzRXhwaXJlOiBhbnk7XG4gIHByb3RlY3RlZCBzdGF0aWMgX3Rlc3RuZXRXYXJuaW5nTWVzc2FnZSA9IGZhbHNlO1xuICBwdWJsaWMgcmVhZG9ubHkgZW52OiBFbnZpcm9ubWVudE5hbWU7XG4gIHByb3RlY3RlZCByZWFkb25seSBfYmFzZVVybDogc3RyaW5nO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgX2Jhc2VBcGlVcmw6IHN0cmluZztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IF9iYXNlQXBpVXJsVjI6IHN0cmluZztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IF9iYXNlQXBpVXJsVjM6IHN0cmluZztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IF9lbnY6IEVudmlyb25tZW50TmFtZTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IF9hdXRoVmVyc2lvbjogRXhjbHVkZTxCaXRHb0FQSU9wdGlvbnNbJ2F1dGhWZXJzaW9uJ10sIHVuZGVmaW5lZD4gPSAyO1xuICBwcm90ZWN0ZWQgX2htYWNWZXJpZmljYXRpb24gPSB0cnVlO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgX3Byb3h5Pzogc3RyaW5nO1xuICBwcm90ZWN0ZWQgX3VzZXI/OiBVc2VyO1xuICBwcm90ZWN0ZWQgX2V4dGVuc2lvbktleT86IEVDUGFpckludGVyZmFjZTtcbiAgcHJvdGVjdGVkIF9yZXFJZD86IElSZXF1ZXN0VHJhY2VyO1xuICBwcm90ZWN0ZWQgX3Rva2VuPzogc3RyaW5nO1xuICBwcm90ZWN0ZWQgX3ZlcnNpb24gPSBwanNvbi52ZXJzaW9uO1xuICBwcm90ZWN0ZWQgX3VzZXJBZ2VudD86IHN0cmluZztcbiAgcHJvdGVjdGVkIF9lY2RoWHBydj86IHN0cmluZztcbiAgcHJvdGVjdGVkIF9yZWZyZXNoVG9rZW4/OiBzdHJpbmc7XG4gIHByb3RlY3RlZCByZWFkb25seSBfY2xpZW50SWQ/OiBzdHJpbmc7XG4gIHByb3RlY3RlZCByZWFkb25seSBfY2xpZW50U2VjcmV0Pzogc3RyaW5nO1xuICBwcm90ZWN0ZWQgX3ZhbGlkYXRlOiBib29sZWFuO1xuICBwdWJsaWMgcmVhZG9ubHkgY29va2llc1Byb3BhZ2F0aW9uRW5hYmxlZDogYm9vbGVhbjtcbiAgcHJpdmF0ZSBfY3VzdG9tUHJveHlBZ2VudD86IEFnZW50O1xuICBwcml2YXRlIF9yZXF1ZXN0SWRQcmVmaXg/OiBzdHJpbmc7XG4gIHByaXZhdGUgZ2V0QWRkaXRpb25hbEhlYWRlcnNDYj86IEFkZGl0aW9uYWxIZWFkZXJzQ2FsbGJhY2s7XG5cbiAgY29uc3RydWN0b3IocGFyYW1zOiBCaXRHb0FQSU9wdGlvbnMgPSB7fSkge1xuICAgIHRoaXMuZ2V0QWRkaXRpb25hbEhlYWRlcnNDYiA9IHBhcmFtcy5nZXRBZGRpdGlvbmFsSGVhZGVyc0NiO1xuICAgIHRoaXMuX3JlcXVlc3RJZFByZWZpeCA9IHBhcmFtcy5yZXF1ZXN0SWRQcmVmaXg7XG4gICAgdGhpcy5jb29raWVzUHJvcGFnYXRpb25FbmFibGVkID0gZmFsc2U7XG4gICAgaWYgKFxuICAgICAgIWNvbW1vbi52YWxpZGF0ZVBhcmFtcyhcbiAgICAgICAgcGFyYW1zLFxuICAgICAgICBbXSxcbiAgICAgICAgW1xuICAgICAgICAgICdhY2Nlc3NUb2tlbicsXG4gICAgICAgICAgJ3VzZXJBZ2VudCcsXG4gICAgICAgICAgJ2N1c3RvbVJvb3RVUkknLFxuICAgICAgICAgICdjdXN0b21CaXRjb2luTmV0d29yaycsXG4gICAgICAgICAgJ3NlcnZlclhwdWInLFxuICAgICAgICAgICdzdGVsbGFyRmVkZXJhdGlvblNlcnZlclVybCcsXG4gICAgICAgIF1cbiAgICAgICkgfHxcbiAgICAgIChwYXJhbXMudXNlUHJvZHVjdGlvbiAmJiAhXy5pc0Jvb2xlYW4ocGFyYW1zLnVzZVByb2R1Y3Rpb24pKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGFyZ3VtZW50Jyk7XG4gICAgfVxuXG4gICAgLy8gQnkgZGVmYXVsdCwgd2Ugb3BlcmF0ZSBvbiB0aGUgdGVzdCBzZXJ2ZXIuXG4gICAgLy8gRGVwcmVjYXRlIHVzZVByb2R1Y3Rpb24gaW4gdGhlIGZ1dHVyZVxuICAgIGxldCBlbnY6IEVudmlyb25tZW50TmFtZTtcblxuICAgIGlmIChwYXJhbXMudXNlUHJvZHVjdGlvbikge1xuICAgICAgaWYgKHBhcmFtcy5lbnYgJiYgcGFyYW1zLmVudiAhPT0gJ3Byb2QnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignY2Fubm90IHVzZSB1c2VQcm9kdWN0aW9uIHdoZW4gZW52PScgKyBwYXJhbXMuZW52KTtcbiAgICAgIH1cbiAgICAgIGVudiA9ICdwcm9kJztcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgcGFyYW1zLmN1c3RvbVJvb3RVUkkgfHxcbiAgICAgIHBhcmFtcy5jdXN0b21CaXRjb2luTmV0d29yayB8fFxuICAgICAgcGFyYW1zLmN1c3RvbVNpZ25pbmdBZGRyZXNzIHx8XG4gICAgICBwYXJhbXMuc2VydmVyWHB1YiB8fFxuICAgICAgcHJvY2Vzcy5lbnYuQklUR09fQ1VTVE9NX1JPT1RfVVJJIHx8XG4gICAgICBwcm9jZXNzLmVudi5CSVRHT19DVVNUT01fQklUQ09JTl9ORVRXT1JLXG4gICAgKSB7XG4gICAgICAvLyBmb3IgYnJhbmNoIGRlcGxveXMsIHdlIHdhbnQgdG8gYmUgYWJsZSB0byBzcGVjaWZ5IGN1c3RvbSBlbmRwb2ludHMgd2hpbGUgc3RpbGxcbiAgICAgIC8vIG1haW50YWluaW5nIHRoZSBuYW1lIG9mIHNwZWNpZmllZCB0aGUgZW52aXJvbm1lbnRcbiAgICAgIGVudiA9IHBhcmFtcy5lbnYgPT09ICdicmFuY2gnID8gJ2JyYW5jaCcgOiAnY3VzdG9tJztcbiAgICAgIGlmIChwYXJhbXMuY3VzdG9tUm9vdFVSSSkge1xuICAgICAgICBjb21tb24uRW52aXJvbm1lbnRzW2Vudl0udXJpID0gcGFyYW1zLmN1c3RvbVJvb3RVUkk7XG4gICAgICB9XG4gICAgICBpZiAocGFyYW1zLmN1c3RvbUJpdGNvaW5OZXR3b3JrKSB7XG4gICAgICAgIGNvbW1vbi5FbnZpcm9ubWVudHNbZW52XS5uZXR3b3JrID0gcGFyYW1zLmN1c3RvbUJpdGNvaW5OZXR3b3JrO1xuICAgICAgfVxuICAgICAgaWYgKHBhcmFtcy5jdXN0b21TaWduaW5nQWRkcmVzcykge1xuICAgICAgICAoY29tbW9uLkVudmlyb25tZW50c1tlbnZdIGFzIGFueSkuY3VzdG9tU2lnbmluZ0FkZHJlc3MgPSBwYXJhbXMuY3VzdG9tU2lnbmluZ0FkZHJlc3M7XG4gICAgICB9XG4gICAgICBpZiAocGFyYW1zLnNlcnZlclhwdWIpIHtcbiAgICAgICAgY29tbW9uLkVudmlyb25tZW50c1tlbnZdLnNlcnZlclhwdWIgPSBwYXJhbXMuc2VydmVyWHB1YjtcbiAgICAgIH1cbiAgICAgIGlmIChwYXJhbXMuc3RlbGxhckZlZGVyYXRpb25TZXJ2ZXJVcmwpIHtcbiAgICAgICAgY29tbW9uLkVudmlyb25tZW50c1tlbnZdLnN0ZWxsYXJGZWRlcmF0aW9uU2VydmVyVXJsID0gcGFyYW1zLnN0ZWxsYXJGZWRlcmF0aW9uU2VydmVyVXJsO1xuICAgICAgfVxuICAgICAgaWYgKHBhcmFtcy5jb29raWVzUHJvcGFnYXRpb25FbmFibGVkKSB7XG4gICAgICAgIHRoaXMuY29va2llc1Byb3BhZ2F0aW9uRW5hYmxlZCA9IHRydWU7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGVudiA9IHBhcmFtcy5lbnYgfHwgKHByb2Nlc3MuZW52LkJJVEdPX0VOViBhcyBFbnZpcm9ubWVudE5hbWUpO1xuICAgIH1cblxuICAgIC8vIGlmIHRoaXMgaGFzbid0IGJlZW4gc2V0IHRvIHRydWUgYWxyZWFkeSBzb21lIGNvbmRpdGlvbnMgYXJlIG5vdCBtZXRcbiAgICBpZiAocGFyYW1zLmNvb2tpZXNQcm9wYWdhdGlvbkVuYWJsZWQgJiYgIXRoaXMuY29va2llc1Byb3BhZ2F0aW9uRW5hYmxlZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb29raWVzIGFyZSBvbmx5IGFsbG93ZWQgd2hlbiBjdXN0b20gVVJJcyBhcmUgaW4gdXNlJyk7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5hdXRoVmVyc2lvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLl9hdXRoVmVyc2lvbiA9IHBhcmFtcy5hdXRoVmVyc2lvbjtcbiAgICB9XG5cbiAgICAvLyBpZiB0aGlzIGVudiBpcyBhbiBhbGlhcywgc3dhcCBpdCBvdXQgd2l0aCB0aGUgZXF1aXZhbGVudCBzdXBwb3J0ZWQgZW52aXJvbm1lbnRcbiAgICBpZiAoZW52IGluIEFsaWFzRW52aXJvbm1lbnRzKSB7XG4gICAgICBlbnYgPSBBbGlhc0Vudmlyb25tZW50c1tlbnZdO1xuICAgIH1cblxuICAgIGlmIChlbnYgPT09ICdjdXN0b20nICYmIF8uaXNVbmRlZmluZWQoY29tbW9uLkVudmlyb25tZW50c1tlbnZdLnVyaSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ211c3QgdXNlIC0tY3VzdG9tcm9vdHVyaSBvciBzZXQgdGhlIEJJVEdPX0NVU1RPTV9ST09UX1VSSSBlbnZpcm9ubWVudCB2YXJpYWJsZSB3aGVuIHVzaW5nIHRoZSBjdXN0b20gZW52aXJvbm1lbnQnXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChlbnYpIHtcbiAgICAgIGlmIChjb21tb24uRW52aXJvbm1lbnRzW2Vudl0pIHtcbiAgICAgICAgdGhpcy5fYmFzZVVybCA9IGNvbW1vbi5FbnZpcm9ubWVudHNbZW52XS51cmk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgZW52aXJvbm1lbnQgJyArIGVudiArICcuIFN1cHBvcnRlZCBlbnZpcm9ubWVudHM6IHByb2QsIHRlc3QsIGRldiwgbGF0ZXN0Jyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGVudiA9ICd0ZXN0JztcbiAgICAgIGlmICghQml0R29BUEkuX3Rlc3RuZXRXYXJuaW5nTWVzc2FnZSkge1xuICAgICAgICBCaXRHb0FQSS5fdGVzdG5ldFdhcm5pbmdNZXNzYWdlID0gdHJ1ZTtcbiAgICAgICAgY29uc29sZS5sb2coJ0JpdEdvIFNESyBlbnYgbm90IHNldCAtIGRlZmF1bHRpbmcgdG8gdGVzdCBhdCB0ZXN0LmJpdGdvLmNvbS4nKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2Jhc2VVcmwgPSBjb21tb24uRW52aXJvbm1lbnRzW2Vudl0udXJpO1xuICAgIH1cbiAgICB0aGlzLl9lbnYgPSB0aGlzLmVudiA9IGVudjtcblxuICAgIGNvbnN0IHN1cHBvcnRlZEFwaVRva2VucyA9IFtcbiAgICAgICdldGhlcnNjYW5BcGlUb2tlbicsXG4gICAgICAncG9seWdvbnNjYW5BcGlUb2tlbicsXG4gICAgICAnYXJiaXNjYW5BcGlUb2tlbicsXG4gICAgICAnb3B0aW1pc3RpY0V0aGVyc2NhbkFwaVRva2VuJyxcbiAgICAgICd6a3N5bmNFeHBsb3JlckFwaVRva2VuJyxcbiAgICAgICdic2NzY2FuQXBpVG9rZW4nLFxuICAgICAgJ2NvcmVkYW9FeHBsb3JlckFwaVRva2VuJyxcbiAgICAgICdvYXNFeHBsb3JlckFwaVRva2VuJyxcbiAgICAgICdiYXNlZXRoQXBpVG9rZW4nLFxuICAgICAgJ3NnYkV4cGxvcmVyQXBpVG9rZW4nLFxuICAgICAgJ2ZsckV4cGxvcmVyQXBpVG9rZW4nLFxuICAgICAgJ3hkY0V4cGxvcmVyQXBpVG9rZW4nLFxuICAgICAgJ3dlbWl4RXhwbG9yZXJBcGlUb2tlbicsXG4gICAgICAnbW9uRXhwbG9yZXJBcGlUb2tlbicsXG4gICAgICAnd29ybGRFeHBsb3JlckFwaVRva2VuJyxcbiAgICAgICdzb21uaWFFeHBsb3JlckFwaVRva2VuJyxcbiAgICAgICdzb25laXVtRXhwbG9yZXJBcGlUb2tlbicsXG4gICAgXTtcblxuICAgIE9iamVjdC5rZXlzKHBhcmFtcykuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICBpZiAoc3VwcG9ydGVkQXBpVG9rZW5zLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgICAgY29tbW9uLkVudmlyb25tZW50c1tlbnZdW2tleV0gPSBwYXJhbXNba2V5XTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmIChwYXJhbXMuZXZtKSB7XG4gICAgICBjb25zdCBldm1Db25maWcgPSBjb21tb24uRW52aXJvbm1lbnRzW2Vudl1bJ2V2bSddIHx8IHt9O1xuICAgICAgT2JqZWN0LmtleXMocGFyYW1zLmV2bSkuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgIGlmIChwYXJhbXMuZXZtPy5ba2V5XSAmJiBwYXJhbXMuZXZtW2tleV1bJ2FwaVRva2VuJ10pIHtcbiAgICAgICAgICBldm1Db25maWdba2V5XSA9IGV2bUNvbmZpZ1trZXldIHx8IHt9O1xuICAgICAgICAgIGV2bUNvbmZpZ1trZXldWydhcGlUb2tlbiddID0gcGFyYW1zLmV2bVtrZXldWydhcGlUb2tlbiddO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGNvbW1vbi5FbnZpcm9ubWVudHNbZW52XVsnZXZtJ10gPSBldm1Db25maWc7XG4gICAgfVxuXG4gICAgY29tbW9uLnNldE5ldHdvcmsoY29tbW9uLkVudmlyb25tZW50c1tlbnZdLm5ldHdvcmspO1xuXG4gICAgdGhpcy5fYmFzZUFwaVVybCA9IHRoaXMuX2Jhc2VVcmwgKyAnL2FwaS92MSc7XG4gICAgdGhpcy5fYmFzZUFwaVVybFYyID0gdGhpcy5fYmFzZVVybCArICcvYXBpL3YyJztcbiAgICB0aGlzLl9iYXNlQXBpVXJsVjMgPSB0aGlzLl9iYXNlVXJsICsgJy9hcGkvdjMnO1xuICAgIHRoaXMuX3Rva2VuID0gcGFyYW1zLmFjY2Vzc1Rva2VuO1xuXG4gICAgY29uc3QgY2xpZW50Q29uc3RhbnRzID0gcGFyYW1zLmNsaWVudENvbnN0YW50cztcbiAgICB0aGlzLl9pbml0aWFsaXplQ2xpZW50Q29uc3RhbnRzKGNsaWVudENvbnN0YW50cyk7XG5cbiAgICB0aGlzLl91c2VyQWdlbnQgPSBwYXJhbXMudXNlckFnZW50IHx8ICdCaXRHb0pTLWFwaS8nICsgdGhpcy52ZXJzaW9uKCk7XG4gICAgdGhpcy5fcmVxSWQgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fcmVmcmVzaFRva2VuID0gcGFyYW1zLnJlZnJlc2hUb2tlbjtcbiAgICB0aGlzLl9jbGllbnRJZCA9IHBhcmFtcy5jbGllbnRJZDtcbiAgICB0aGlzLl9jbGllbnRTZWNyZXQgPSBwYXJhbXMuY2xpZW50U2VjcmV0O1xuICAgIHRoaXMuX2tleWNoYWlucyA9IG51bGw7XG4gICAgdGhpcy5fd2FsbGV0cyA9IG51bGw7XG5cbiAgICAvLyB3aGV0aGVyIHRvIHBlcmZvcm0gZXh0cmEgY2xpZW50LXNpZGUgdmFsaWRhdGlvbiBmb3Igc29tZSB0aGluZ3MsIHN1Y2ggYXNcbiAgICAvLyBhZGRyZXNzIHZhbGlkYXRpb24gb3Igc2lnbmF0dXJlIHZhbGlkYXRpb24uIGRlZmF1bHRzIHRvIHRydWUsIGJ1dCBjYW4gYmVcbiAgICAvLyB0dXJuZWQgb2ZmIGJ5IHNldHRpbmcgdG8gZmFsc2UuIGNhbiBhbHNvIGJlIG92ZXJyaWRkZW4gaW5kaXZpZHVhbGx5IGluIHRoZVxuICAgIC8vIGZ1bmN0aW9ucyB0aGF0IHVzZSBpdC5cbiAgICB0aGlzLl92YWxpZGF0ZSA9IHBhcmFtcy52YWxpZGF0ZSA9PT0gdW5kZWZpbmVkID8gdHJ1ZSA6IHBhcmFtcy52YWxpZGF0ZTtcblxuICAgIGlmICghcGFyYW1zLmhtYWNWZXJpZmljYXRpb24gJiYgcGFyYW1zLmhtYWNWZXJpZmljYXRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKChlbnYgPT0gJ3Byb2QnIHx8IGVudiA9PSAnYWRtaW5Qcm9kJykgJiYgY29tbW9uLkVudmlyb25tZW50c1tlbnZdLmhtYWNWZXJpZmljYXRpb25FbmZvcmNlZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBkaXNhYmxlIHJlcXVlc3QgSE1BQyB2ZXJpZmljYXRpb24gaW4gZW52aXJvbm1lbnQgJHt0aGlzLmdldEVudigpfWApO1xuICAgICAgfVxuICAgICAgZGVidWcoJ0hNQUMgdmVyaWZpY2F0aW9uIGV4cGxpY2l0bHkgZGlzYWJsZWQgYnkgY29uc3RydWN0b3Igb3B0aW9uJyk7XG4gICAgICB0aGlzLl9obWFjVmVyaWZpY2F0aW9uID0gcGFyYW1zLmhtYWNWZXJpZmljYXRpb247XG4gICAgfVxuXG4gICAgaWYgKChwcm9jZXNzIGFzIGFueSkuYnJvd3NlciAmJiBwYXJhbXMuY3VzdG9tUHJveHlBZ2VudCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdzaG91bGQgbm90IHVzZSBodHRwcyBwcm94eSB3aGlsZSBpbiBicm93c2VyJyk7XG4gICAgfVxuXG4gICAgdGhpcy5fY3VzdG9tUHJveHlBZ2VudCA9IHBhcmFtcy5jdXN0b21Qcm94eUFnZW50O1xuXG4gICAgLy8gT25seSBmZXRjaCBjb25zdGFudHMgZnJvbSBjb25zdHJ1Y3RvciBpZiBjbGllbnRDb25zdGFudHMgd2FzIG5vdCBwcm92aWRlZFxuICAgIGlmICghY2xpZW50Q29uc3RhbnRzKSB7XG4gICAgICAvLyBjYXB0dXJlIG91dGVyIHN0YWNrIHNvIHdlIGhhdmUgdXNlZnVsIGRlYnVnIGluZm9ybWF0aW9uIGlmIGZldGNoIGNvbnN0YW50cyBmYWlsc1xuICAgICAgY29uc3QgZSA9IG5ldyBFcnJvcigpO1xuXG4gICAgICAvLyBLaWNrIG9mZiBmaXJzdCBsb2FkIG9mIGNvbnN0YW50c1xuICAgICAgdGhpcy5mZXRjaENvbnN0YW50cygpLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgIC8vIG1ha2Ugc3VyZSBhbiBlcnJvciBkb2VzIG5vdCB0ZXJtaW5hdGUgdGhlIGVudGlyZSBzY3JpcHRcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdmYWlsZWQgdG8gZmV0Y2ggaW5pdGlhbCBjbGllbnQgY29uc3RhbnRzIGZyb20gQml0R28nKTtcbiAgICAgICAgICBkZWJ1ZyhlLnN0YWNrKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemUgY2xpZW50IGNvbnN0YW50cyBpZiBwcm92aWRlZC5cbiAgICogQHBhcmFtIGNsaWVudENvbnN0YW50cyAtIFRoZSBjbGllbnQgY29uc3RhbnRzIGZyb20gcGFyYW1zXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIF9pbml0aWFsaXplQ2xpZW50Q29uc3RhbnRzKGNsaWVudENvbnN0YW50czogYW55KTogdm9pZCB7XG4gICAgaWYgKGNsaWVudENvbnN0YW50cykge1xuICAgICAgaWYgKCFCaXRHb0FQSS5fY29uc3RhbnRzKSB7XG4gICAgICAgIEJpdEdvQVBJLl9jb25zdGFudHMgPSB7fTtcbiAgICAgIH1cbiAgICAgIEJpdEdvQVBJLl9jb25zdGFudHNbdGhpcy5lbnZdID0gJ2NvbnN0YW50cycgaW4gY2xpZW50Q29uc3RhbnRzID8gY2xpZW50Q29uc3RhbnRzLmNvbnN0YW50cyA6IGNsaWVudENvbnN0YW50cztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgc3VwZXJhZ2VudCByZXF1ZXN0IGZvciBzcGVjaWZpZWQgaHR0cCBtZXRob2QgYW5kIFVSTCBjb25maWd1cmVkIHRvIHRoZSBTREsgY29uZmlndXJhdGlvblxuICAgKiBAcGFyYW0gbWV0aG9kIC0gaHR0cCBtZXRob2QgZm9yIHRoZSBuZXcgcmVxdWVzdFxuICAgKiBAcGFyYW0gdXJsIC0gVVJMIGZvciB0aGUgbmV3IHJlcXVlc3RcbiAgICovXG4gIHByb3RlY3RlZCBnZXRBZ2VudFJlcXVlc3QobWV0aG9kOiBSZXF1ZXN0TWV0aG9kcywgdXJsOiBzdHJpbmcpOiBzdXBlcmFnZW50LlN1cGVyQWdlbnRSZXF1ZXN0IHtcbiAgICBsZXQgcmVxOiBzdXBlcmFnZW50LlN1cGVyQWdlbnRSZXF1ZXN0ID0gc3VwZXJhZ2VudFttZXRob2RdKHVybCk7XG4gICAgaWYgKHRoaXMuY29va2llc1Byb3BhZ2F0aW9uRW5hYmxlZCkge1xuICAgICAgcmVxID0gcmVxLndpdGhDcmVkZW50aWFscygpO1xuICAgIH1cbiAgICByZXR1cm4gcmVxO1xuICB9XG4gIC8qKlxuICAgKiBDcmVhdGUgYSBiYXNlY29pbiBvYmplY3RcbiAgICogQHBhcmFtIG5hbWVcbiAgICovXG4gIHB1YmxpYyBjb2luKG5hbWU6IHN0cmluZyk6IEJhc2VDb2luIHtcbiAgICByZXR1cm4gR2xvYmFsQ29pbkZhY3RvcnkuZ2V0SW5zdGFuY2UodGhpcywgbmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHRoZSBjdXJyZW50IEJpdEdvIGVudmlyb25tZW50XG4gICAqL1xuICBnZXRFbnYoKTogRW52aXJvbm1lbnROYW1lIHtcbiAgICByZXR1cm4gdGhpcy5fZW52O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiB0aGUgY3VycmVudCBhdXRoIHZlcnNpb24gdXNlZCBmb3IgcmVxdWVzdHMgdG8gdGhlIEJpdEdvIHNlcnZlclxuICAgKi9cbiAgZ2V0QXV0aFZlcnNpb24oKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fYXV0aFZlcnNpb247XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBpcyBhIHBhdGNoaW5nIGZ1bmN0aW9uIHdoaWNoIGNhbiBhcHBseSBvdXIgYXV0aG9yaXphdGlvblxuICAgKiBoZWFkZXJzIHRvIGFueSBvdXRib3VuZCByZXF1ZXN0LlxuICAgKiBAcGFyYW0gbWV0aG9kXG4gICAqL1xuICBwcml2YXRlIHJlcXVlc3RQYXRjaChtZXRob2Q6IFJlcXVlc3RNZXRob2RzLCB1cmw6IHN0cmluZykge1xuICAgIGNvbnN0IHJlcSA9IHRoaXMuZ2V0QWdlbnRSZXF1ZXN0KG1ldGhvZCwgdXJsKTtcbiAgICBpZiAodGhpcy5fY3VzdG9tUHJveHlBZ2VudCkge1xuICAgICAgZGVidWcoJ3VzaW5nIGN1c3RvbSBwcm94eSBhZ2VudCcpO1xuICAgICAgaWYgKHRoaXMuX2N1c3RvbVByb3h5QWdlbnQpIHtcbiAgICAgICAgcmVxLmFnZW50KHRoaXMuX2N1c3RvbVByb3h5QWdlbnQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IG9yaWdpbmFsVGhlbiA9IHJlcS50aGVuLmJpbmQocmVxKTtcbiAgICByZXEudGhlbiA9IChvbmZ1bGZpbGxlZCwgb25yZWplY3RlZCkgPT4ge1xuICAgICAgLy8gaW50ZXJjZXB0IGEgcmVxdWVzdCBiZWZvcmUgaXQncyBzdWJtaXR0ZWQgdG8gdGhlIHNlcnZlciBmb3IgdjIgYXV0aGVudGljYXRpb24gKGJhc2VkIG9uIHRva2VuKVxuICAgICAgaWYgKHRoaXMuX3ZlcnNpb24pIHtcbiAgICAgICAgLy8gVE9ETyAtIGRlY2lkZSB3aGVyZSB0byBnZXQgdmVyc2lvblxuICAgICAgICByZXEuc2V0KCdCaXRHby1TREstVmVyc2lvbicsIHRoaXMuX3ZlcnNpb24pO1xuICAgICAgfVxuXG4gICAgICBpZiAoIV8uaXNVbmRlZmluZWQodGhpcy5fcmVxSWQpKSB7XG4gICAgICAgIGNvbnN0IHJlcUlkID0gdGhpcy5fcmVxSWQudG9TdHJpbmcoKTtcbiAgICAgICAgY29uc3QgcmVxdWVzdElkID0gdGhpcy5fcmVxdWVzdElkUHJlZml4ID8gYCR7dGhpcy5fcmVxdWVzdElkUHJlZml4fSR7cmVxSWR9YCA6IHJlcUlkO1xuICAgICAgICByZXEuc2V0KCdSZXF1ZXN0LUlEJywgcmVxdWVzdElkKTtcblxuICAgICAgICAvLyBpbmNyZW1lbnQgYWZ0ZXIgc2V0dGluZyB0aGUgaGVhZGVyIHNvIHRoZSBzZXF1ZW5jZSBudW1iZXJzIHN0YXJ0IGF0IDBcbiAgICAgICAgdGhpcy5fcmVxSWQuaW5jKCk7XG5cbiAgICAgICAgLy8gcmVxdWVzdCBpZHMgbXVzdCBiZSBzZXQgYmVmb3JlIGVhY2ggcmVxdWVzdCBpbnN0ZWFkIG9mIGJlaW5nIGtlcHRcbiAgICAgICAgLy8gaW5zaWRlIHRoZSBiaXRnbyBvYmplY3QuIFRoaXMgaXMgdG8gcHJldmVudCByZWVudHJhbmN5IGlzc3VlcyB3aGVyZVxuICAgICAgICAvLyBtdWx0aXBsZSBzaW11bHRhbmVvdXMgcmVxdWVzdHMgY291bGQgY2F1c2UgaW5jb3JyZWN0IHJlcUlkcyB0byBiZSB1c2VkXG4gICAgICAgIGRlbGV0ZSB0aGlzLl9yZXFJZDtcbiAgICAgIH1cblxuICAgICAgLy8gcHJldmVudCBJRSBmcm9tIGNhY2hpbmcgcmVxdWVzdHNcbiAgICAgIHJlcS5zZXQoJ0lmLU1vZGlmaWVkLVNpbmNlJywgJ01vbiwgMjYgSnVsIDE5OTcgMDU6MDA6MDAgR01UJyk7XG5cbiAgICAgIGlmICh0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJyAmJiB0aGlzLl91c2VyQWdlbnQpIHtcbiAgICAgICAgLy8gSWYgbm90IGluIHRoZSBicm93c2VyLCBzZXQgdGhlIFVzZXItQWdlbnQuIEJyb3dzZXJzIGRvbid0IGFsbG93XG4gICAgICAgIC8vIHNldHRpbmcgb2YgVXNlci1BZ2VudCwgc28gd2UgbXVzdCBkaXNhYmxlIHRoaXMgd2hlbiBydW4gaW4gdGhlXG4gICAgICAgIC8vIGJyb3dzZXIgKGJyb3dzZXJpZnkgc2V0cyBwcm9jZXNzLmJyb3dzZXIpLlxuICAgICAgICByZXEuc2V0KCdVc2VyLUFnZW50JywgdGhpcy5fdXNlckFnZW50KTtcbiAgICAgIH1cblxuICAgICAgLy8gU2V0IHRoZSByZXF1ZXN0IHRpbWVvdXQgdG8ganVzdCBhYm92ZSA1IG1pbnV0ZXMgYnkgZGVmYXVsdFxuICAgICAgcmVxLnRpbWVvdXQoKHByb2Nlc3MuZW52LkJJVEdPX1RJTUVPVVQgYXMgYW55KSAqIDEwMDAgfHwgMzA1ICogMTAwMCk7XG5cbiAgICAgIC8vIGlmIHRoZXJlIGlzIG5vIHRva2VuLCBhbmQgd2UncmUgbm90IGxvZ2dlZCBpbiwgdGhlIHJlcXVlc3QgY2Fubm90IGJlIHYyIGF1dGhlbnRpY2F0ZWRcbiAgICAgIHJlcS5pc1YyQXV0aGVudGljYXRlZCA9IHRydWU7XG4gICAgICByZXEuYXV0aGVudGljYXRpb25Ub2tlbiA9IHRoaXMuX3Rva2VuO1xuICAgICAgLy8gc29tZSBvZiB0aGUgb2xkZXIgdG9rZW5zIGFwcGVhciB0byBiZSBvbmx5IDQwIGNoYXJhY3RlcnMgbG9uZ1xuICAgICAgaWYgKCh0aGlzLl90b2tlbiAmJiB0aGlzLl90b2tlbi5sZW5ndGggIT09IDY3ICYmIHRoaXMuX3Rva2VuLmluZGV4T2YoJ3YyeCcpICE9PSAwKSB8fCByZXEuZm9yY2VWMUF1dGgpIHtcbiAgICAgICAgLy8gdXNlIHRoZSBvbGQgbWV0aG9kXG4gICAgICAgIHJlcS5pc1YyQXV0aGVudGljYXRlZCA9IGZhbHNlO1xuXG4gICAgICAgIHJlcS5zZXQoJ0F1dGhvcml6YXRpb24nLCAnQmVhcmVyICcgKyB0aGlzLl90b2tlbik7XG4gICAgICAgIGRlYnVnKCdzZW5kaW5nIHYxICVzIHJlcXVlc3QgdG8gJXMgd2l0aCB0b2tlbiAlcycsIG1ldGhvZCwgdXJsLCB0aGlzLl90b2tlbj8uc3Vic3RyKDAsIDgpKTtcbiAgICAgICAgcmV0dXJuIG9yaWdpbmFsVGhlbihvbmZ1bGZpbGxlZCkuY2F0Y2gob25yZWplY3RlZCk7XG4gICAgICB9XG5cbiAgICAgIHJlcS5zZXQoJ0JpdEdvLUF1dGgtVmVyc2lvbicsIHRoaXMuX2F1dGhWZXJzaW9uID09PSAzID8gJzMuMCcgOiAnMi4wJyk7XG5cbiAgICAgIGNvbnN0IGRhdGEgPSBzZXJpYWxpemVSZXF1ZXN0RGF0YShyZXEpO1xuICAgICAgaWYgKHRoaXMuX3Rva2VuKSB7XG4gICAgICAgIHNldFJlcXVlc3RRdWVyeVN0cmluZyhyZXEpO1xuXG4gICAgICAgIGNvbnN0IHJlcXVlc3RQcm9wZXJ0aWVzID0gdGhpcy5jYWxjdWxhdGVSZXF1ZXN0SGVhZGVycyh7XG4gICAgICAgICAgdXJsOiByZXEudXJsLFxuICAgICAgICAgIHRva2VuOiB0aGlzLl90b2tlbixcbiAgICAgICAgICBtZXRob2QsXG4gICAgICAgICAgdGV4dDogZGF0YSB8fCAnJyxcbiAgICAgICAgICBhdXRoVmVyc2lvbjogdGhpcy5fYXV0aFZlcnNpb24sXG4gICAgICAgIH0pO1xuICAgICAgICByZXEuc2V0KCdBdXRoLVRpbWVzdGFtcCcsIHJlcXVlc3RQcm9wZXJ0aWVzLnRpbWVzdGFtcC50b1N0cmluZygpKTtcblxuICAgICAgICAvLyB3ZSdyZSBub3Qgc2VuZGluZyB0aGUgYWN0dWFsIHRva2VuLCBidXQgb25seSBpdHMgaGFzaFxuICAgICAgICByZXEuc2V0KCdBdXRob3JpemF0aW9uJywgJ0JlYXJlciAnICsgcmVxdWVzdFByb3BlcnRpZXMudG9rZW5IYXNoKTtcbiAgICAgICAgZGVidWcoJ3NlbmRpbmcgdjIgJXMgcmVxdWVzdCB0byAlcyB3aXRoIHRva2VuICVzJywgbWV0aG9kLCB1cmwsIHRoaXMuX3Rva2VuPy5zdWJzdHIoMCwgOCkpO1xuXG4gICAgICAgIC8vIHNldCB0aGUgSE1BQ1xuICAgICAgICByZXEuc2V0KCdITUFDJywgcmVxdWVzdFByb3BlcnRpZXMuaG1hYyk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmdldEFkZGl0aW9uYWxIZWFkZXJzQ2IpIHtcbiAgICAgICAgY29uc3QgYWRkaXRpb25hbEhlYWRlcnMgPSB0aGlzLmdldEFkZGl0aW9uYWxIZWFkZXJzQ2IobWV0aG9kLCB1cmwsIGRhdGEpO1xuICAgICAgICBmb3IgKGNvbnN0IHsga2V5LCB2YWx1ZSB9IG9mIGFkZGl0aW9uYWxIZWFkZXJzKSB7XG4gICAgICAgICAgcmVxLnNldChrZXksIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvKipcbiAgICAgICAqIFZlcmlmeSB0aGUgcmVzcG9uc2UgYmVmb3JlIGNhbGxpbmcgdGhlIG9yaWdpbmFsIG9uZnVsZmlsbGVkIGhhbmRsZXIsXG4gICAgICAgKiBhbmQgbWFrZSBzdXJlIG9ucmVqZWN0ZWQgaXMgY2FsbGVkIGlmIGEgdmVyaWZpY2F0aW9uIGVycm9yIGlzIGVuY291bnRlcmVkXG4gICAgICAgKi9cbiAgICAgIGNvbnN0IG5ld09uRnVsZmlsbGVkID0gb25mdWxmaWxsZWRcbiAgICAgICAgPyAocmVzcG9uc2U6IHN1cGVyYWdlbnQuUmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgIC8vIEhNQUMgdmVyaWZpY2F0aW9uIGlzIG9ubHkgYWxsb3dlZCB0byBiZSBza2lwcGVkIGluIGNlcnRhaW4gZW52aXJvbm1lbnRzLlxuICAgICAgICAgICAgLy8gVGhpcyBpcyBjaGVja2VkIGluIHRoZSBjb25zdHJ1Y3RvciwgYnV0IGNoZWNraW5nIGl0IGFnYWluIGF0IHJlcXVlc3QgdGltZVxuICAgICAgICAgICAgLy8gd2lsbCBoZWxwIHByZXZlbnQgYWdhaW5zdCB0YW1wZXJpbmcgb2YgdGhpcyBwcm9wZXJ0eSBhZnRlciB0aGUgb2JqZWN0IGlzIGNyZWF0ZWRcbiAgICAgICAgICAgIGlmICghdGhpcy5faG1hY1ZlcmlmaWNhdGlvbiAmJiAhY29tbW9uLkVudmlyb25tZW50c1t0aGlzLmdldEVudigpXS5obWFjVmVyaWZpY2F0aW9uRW5mb3JjZWQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG9uZnVsZmlsbGVkKHJlc3BvbnNlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgdmVyaWZpZWRSZXNwb25zZSA9IHZlcmlmeVJlc3BvbnNlKHRoaXMsIHRoaXMuX3Rva2VuLCBtZXRob2QsIHJlcSwgcmVzcG9uc2UsIHRoaXMuX2F1dGhWZXJzaW9uKTtcbiAgICAgICAgICAgIHJldHVybiBvbmZ1bGZpbGxlZCh2ZXJpZmllZFJlc3BvbnNlKTtcbiAgICAgICAgICB9XG4gICAgICAgIDogbnVsbDtcbiAgICAgIHJldHVybiBvcmlnaW5hbFRoZW4obmV3T25GdWxmaWxsZWQpLmNhdGNoKG9ucmVqZWN0ZWQpO1xuICAgIH07XG4gICAgcmV0dXJuIHRvQml0Z29SZXF1ZXN0KHJlcSk7XG4gIH1cblxuICBnZXQodXJsOiBzdHJpbmcpOiBCaXRHb1JlcXVlc3Qge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3RQYXRjaCgnZ2V0JywgdXJsKTtcbiAgfVxuICBwb3N0KHVybDogc3RyaW5nKTogQml0R29SZXF1ZXN0IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0UGF0Y2goJ3Bvc3QnLCB1cmwpO1xuICB9XG4gIHB1dCh1cmw6IHN0cmluZyk6IEJpdEdvUmVxdWVzdCB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdFBhdGNoKCdwdXQnLCB1cmwpO1xuICB9XG4gIGRlbCh1cmw6IHN0cmluZyk6IEJpdEdvUmVxdWVzdCB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdFBhdGNoKCdkZWwnLCB1cmwpO1xuICB9XG4gIHBhdGNoKHVybDogc3RyaW5nKTogQml0R29SZXF1ZXN0IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0UGF0Y2goJ3BhdGNoJywgdXJsKTtcbiAgfVxuICBvcHRpb25zKHVybDogc3RyaW5nKTogQml0R29SZXF1ZXN0IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0UGF0Y2goJ29wdGlvbnMnLCB1cmwpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZSB0aGUgSE1BQyBmb3IgdGhlIGdpdmVuIGtleSBhbmQgbWVzc2FnZVxuICAgKiBAcGFyYW0ga2V5IHtTdHJpbmd9IC0gdGhlIGtleSB0byB1c2UgZm9yIHRoZSBITUFDXG4gICAqIEBwYXJhbSBtZXNzYWdlIHtTdHJpbmd9IC0gdGhlIGFjdHVhbCBtZXNzYWdlIHRvIEhNQUNcbiAgICogQHJldHVybnMgeyp9IC0gdGhlIHJlc3VsdCBvZiB0aGUgSE1BQyBvcGVyYXRpb25cbiAgICovXG4gIGNhbGN1bGF0ZUhNQUMoa2V5OiBzdHJpbmcsIG1lc3NhZ2U6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHNka0htYWMuY2FsY3VsYXRlSE1BQyhrZXksIG1lc3NhZ2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZSB0aGUgc3ViamVjdCBzdHJpbmcgdGhhdCBpcyB0byBiZSBITUFDJ2VkIGZvciBhIEhUVFAgcmVxdWVzdCBvciByZXNwb25zZVxuICAgKiBAcGFyYW0gdXJsUGF0aCByZXF1ZXN0IHVybCwgaW5jbHVkaW5nIHF1ZXJ5IHBhcmFtc1xuICAgKiBAcGFyYW0gdGV4dCByZXF1ZXN0IGJvZHkgdGV4dFxuICAgKiBAcGFyYW0gdGltZXN0YW1wIHJlcXVlc3QgdGltZXN0YW1wIGZyb20gYERhdGUubm93KClgXG4gICAqIEBwYXJhbSBzdGF0dXNDb2RlIE9ubHkgc2V0IGZvciBIVFRQIHJlc3BvbnNlcywgbGVhdmUgYmxhbmsgZm9yIHJlcXVlc3RzXG4gICAqIEBwYXJhbSBtZXRob2QgcmVxdWVzdCBtZXRob2RcbiAgICogQHJldHVybnMge3N0cmluZyB8IEJ1ZmZlcn1cbiAgICovXG4gIGNhbGN1bGF0ZUhNQUNTdWJqZWN0PFQgZXh0ZW5kcyBzdHJpbmcgfCBCdWZmZXIgPSBzdHJpbmc+KHBhcmFtczogQ2FsY3VsYXRlSG1hY1N1YmplY3RPcHRpb25zPFQ+KTogVCB7XG4gICAgcmV0dXJuIHNka0htYWMuY2FsY3VsYXRlSE1BQ1N1YmplY3QoeyAuLi5wYXJhbXMsIGF1dGhWZXJzaW9uOiB0aGlzLl9hdXRoVmVyc2lvbiB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGUgdGhlIEhNQUMgZm9yIGFuIEhUVFAgcmVxdWVzdFxuICAgKi9cbiAgY2FsY3VsYXRlUmVxdWVzdEhNQUMocGFyYW1zOiBDYWxjdWxhdGVSZXF1ZXN0SG1hY09wdGlvbnMpOiBzdHJpbmcge1xuICAgIHJldHVybiBzZGtIbWFjLmNhbGN1bGF0ZVJlcXVlc3RITUFDKHsgLi4ucGFyYW1zLCBhdXRoVmVyc2lvbjogdGhpcy5fYXV0aFZlcnNpb24gfSk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsY3VsYXRlIHJlcXVlc3QgaGVhZGVycyB3aXRoIEhNQUNcbiAgICovXG4gIGNhbGN1bGF0ZVJlcXVlc3RIZWFkZXJzKHBhcmFtczogQ2FsY3VsYXRlUmVxdWVzdEhlYWRlcnNPcHRpb25zKTogUmVxdWVzdEhlYWRlcnMge1xuICAgIHJldHVybiBzZGtIbWFjLmNhbGN1bGF0ZVJlcXVlc3RIZWFkZXJzKHsgLi4ucGFyYW1zLCBhdXRoVmVyc2lvbjogdGhpcy5fYXV0aFZlcnNpb24gfSk7XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZ5IHRoZSBITUFDIGZvciBhbiBIVFRQIHJlc3BvbnNlXG4gICAqL1xuICB2ZXJpZnlSZXNwb25zZShwYXJhbXM6IFZlcmlmeVJlc3BvbnNlT3B0aW9ucyk6IFZlcmlmeVJlc3BvbnNlSW5mbyB7XG4gICAgcmV0dXJuIHNka0htYWMudmVyaWZ5UmVzcG9uc2UoeyAuLi5wYXJhbXMsIGF1dGhWZXJzaW9uOiB0aGlzLl9hdXRoVmVyc2lvbiB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaCB1c2VmdWwgY29uc3RhbnQgdmFsdWVzIGZyb20gdGhlIEJpdEdvIHNlcnZlci5cbiAgICogVGhlc2UgdmFsdWVzIGRvIGNoYW5nZSBpbmZyZXF1ZW50bHksIHNvIHRoZXkgbmVlZCB0byBiZSBmZXRjaGVkLFxuICAgKiBidXQgYXJlIHVubGlrZWx5IHRvIGNoYW5nZSBkdXJpbmcgdGhlIGxpZmV0aW1lIG9mIGEgQml0R28gb2JqZWN0LFxuICAgKiBzbyB0aGV5IGNhbiBzYWZlbHkgY2FjaGVkLlxuICAgKi9cbiAgYXN5bmMgZmV0Y2hDb25zdGFudHMoKTogUHJvbWlzZTxDb25zdGFudHM+IHtcbiAgICBjb25zdCBlbnYgPSB0aGlzLmdldEVudigpO1xuXG4gICAgLy8gQ2hlY2sgaWYgd2UgaGF2ZSBjYWNoZWQgY29uc3RhbnRzIHRoYXQgaGF2ZW4ndCBleHBpcmVkXG4gICAgaWYgKFxuICAgICAgQml0R29BUEkuX2NvbnN0YW50cyAmJlxuICAgICAgQml0R29BUEkuX2NvbnN0YW50c1tlbnZdICYmXG4gICAgICAoIUJpdEdvQVBJLl9jb25zdGFudHNFeHBpcmUgfHwgIUJpdEdvQVBJLl9jb25zdGFudHNFeHBpcmVbZW52XSB8fCBuZXcgRGF0ZSgpIDwgQml0R29BUEkuX2NvbnN0YW50c0V4cGlyZVtlbnZdKVxuICAgICkge1xuICAgICAgcmV0dXJuIEJpdEdvQVBJLl9jb25zdGFudHNbZW52XTtcbiAgICB9XG5cbiAgICAvLyBjbGllbnQgY29uc3RhbnRzIGNhbGwgY2Fubm90IGJlIGF1dGhlbnRpY2F0ZWQgdXNpbmcgdGhlIG5vcm1hbCBITUFDIHZhbGlkYXRpb25cbiAgICAvLyBzY2hlbWUsIHNvIHdlIG5lZWQgdG8gdXNlIGEgcmF3IHN1cGVyYWdlbnQgaW5zdGFuY2UgdG8gZG8gdGhpcyByZXF1ZXN0LlxuICAgIC8vIFByb3h5IHNldHRpbmdzIG11c3Qgc3RpbGwgYmUgcmVzcGVjdGVkIGhvd2V2ZXJcbiAgICBjb25zdCByZXN1bHRQcm9taXNlID0gdGhpcy5nZXRBZ2VudFJlcXVlc3QoJ2dldCcsIHRoaXMudXJsKCcvY2xpZW50L2NvbnN0YW50cycpKTtcbiAgICByZXN1bHRQcm9taXNlLnNldCgnQml0R28tU0RLLVZlcnNpb24nLCB0aGlzLl92ZXJzaW9uKTtcbiAgICBpZiAodGhpcy5fY3VzdG9tUHJveHlBZ2VudCkge1xuICAgICAgcmVzdWx0UHJvbWlzZS5hZ2VudCh0aGlzLl9jdXN0b21Qcm94eUFnZW50KTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZ2V0QWRkaXRpb25hbEhlYWRlcnNDYikge1xuICAgICAgY29uc3QgYWRkaXRpb25hbEhlYWRlcnMgPSB0aGlzLmdldEFkZGl0aW9uYWxIZWFkZXJzQ2IoJ2dldCcsIHRoaXMudXJsKCcvY2xpZW50L2NvbnN0YW50cycpKTtcbiAgICAgIGZvciAoY29uc3QgeyBrZXksIHZhbHVlIH0gb2YgYWRkaXRpb25hbEhlYWRlcnMpIHtcbiAgICAgICAgcmVzdWx0UHJvbWlzZS5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlc3VsdFByb21pc2U7XG5cbiAgICBpZiAoIUJpdEdvQVBJLl9jb25zdGFudHMpIHtcbiAgICAgIEJpdEdvQVBJLl9jb25zdGFudHMgPSB7fTtcbiAgICB9XG4gICAgQml0R29BUEkuX2NvbnN0YW50c1tlbnZdID0gcmVzdWx0LmJvZHkuY29uc3RhbnRzO1xuXG4gICAgaWYgKHJlc3VsdC5ib2R5Py50dGwgJiYgdHlwZW9mIHJlc3VsdC5ib2R5Py50dGwgPT09ICdudW1iZXInKSB7XG4gICAgICBpZiAoIUJpdEdvQVBJLl9jb25zdGFudHNFeHBpcmUpIHtcbiAgICAgICAgQml0R29BUEkuX2NvbnN0YW50c0V4cGlyZSA9IHt9O1xuICAgICAgfVxuICAgICAgQml0R29BUEkuX2NvbnN0YW50c0V4cGlyZVtlbnZdID0gbmV3IERhdGUobmV3IERhdGUoKS5nZXRUaW1lKCkgKyAocmVzdWx0LmJvZHkudHRsIGFzIG51bWJlcikgKiAxMDAwKTtcbiAgICB9XG5cbiAgICByZXR1cm4gQml0R29BUEkuX2NvbnN0YW50c1tlbnZdO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIHVybCBmb3IgY2FsbGluZyBCaXRHbyBwbGF0Zm9ybSBBUElzXG4gICAqIEBwYXJhbSBwYXRoXG4gICAqIEBwYXJhbSB2ZXJzaW9uXG4gICAqL1xuICB1cmwocGF0aDogc3RyaW5nLCB2ZXJzaW9uID0gMSk6IHN0cmluZyB7XG4gICAgY29uc3QgYmFzZVVybCA9IHZlcnNpb24gPT09IDMgPyB0aGlzLl9iYXNlQXBpVXJsVjMgOiB2ZXJzaW9uID09PSAyID8gdGhpcy5fYmFzZUFwaVVybFYyIDogdGhpcy5fYmFzZUFwaVVybDtcbiAgICByZXR1cm4gYmFzZVVybCArIHBhdGg7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgdXJsIGZvciBjYWxsaW5nIEJpdEdvIG1pY3Jvc2VydmljZSBBUElzXG4gICAqL1xuICBtaWNyb3NlcnZpY2VzVXJsKHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2Jhc2VVcmwgKyBwYXRoO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHZlcnNpb24gb2YgdGhlIEJpdEdvSlMgcGFja2FnZVxuICAgKi9cbiAgdmVyc2lvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl92ZXJzaW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIFRlc3QgY29ubmVjdGl2aXR5IHRvIHRoZSBzZXJ2ZXJcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKi9cbiAgcGluZyh7IHJlcUlkIH06IFBpbmdPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGlmIChyZXFJZCkge1xuICAgICAgdGhpcy5fcmVxSWQgPSByZXFJZDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5nZXQodGhpcy51cmwoJy9waW5nJykpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBhIHJlcXVlc3QgdHJhY2VyIHRvIHByb3ZpZGUgcmVxdWVzdCBJRHMgZHVyaW5nIG11bHRpLXJlcXVlc3Qgd29ya2Zsb3dzXG4gICAqL1xuICBzZXRSZXF1ZXN0VHJhY2VyKHJlcVRyYWNlcjogSVJlcXVlc3RUcmFjZXIpOiB2b2lkIHtcbiAgICBpZiAocmVxVHJhY2VyKSB7XG4gICAgICB0aGlzLl9yZXFJZCA9IHJlcVRyYWNlcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVXRpbGl0eSBmdW5jdGlvbiB0byBlbmNyeXB0IGxvY2FsbHkuXG4gICAqL1xuICBlbmNyeXB0KHBhcmFtczogRW5jcnlwdE9wdGlvbnMpOiBzdHJpbmcge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnaW5wdXQnLCAncGFzc3dvcmQnXSwgWydhZGF0YSddKTtcbiAgICBpZiAoIXBhcmFtcy5wYXNzd29yZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBjYW5ub3QgZW5jcnlwdCB3aXRob3V0IHBhc3N3b3JkYCk7XG4gICAgfVxuICAgIHJldHVybiBlbmNyeXB0KHBhcmFtcy5wYXNzd29yZCwgcGFyYW1zLmlucHV0LCB7IGFkYXRhOiBwYXJhbXMuYWRhdGEgfSk7XG4gIH1cblxuICAvKipcbiAgICogRGVjcnlwdCBhbiBlbmNyeXB0ZWQgc3RyaW5nIGxvY2FsbHkuXG4gICAqL1xuICBkZWNyeXB0KHBhcmFtczogRGVjcnlwdE9wdGlvbnMpOiBzdHJpbmcge1xuICAgIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ2lucHV0JywgJ3Bhc3N3b3JkJ10sIFtdKTtcbiAgICBpZiAoIXBhcmFtcy5wYXNzd29yZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBjYW5ub3QgZGVjcnlwdCB3aXRob3V0IHBhc3N3b3JkYCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gZGVjcnlwdChwYXJhbXMucGFzc3dvcmQsIHBhcmFtcy5pbnB1dCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChlcnJvci5tZXNzYWdlLmluY2x1ZGVzKFwiY2NtOiB0YWcgZG9lc24ndCBtYXRjaFwiKSkge1xuICAgICAgICBlcnJvci5tZXNzYWdlID0gJ3Bhc3N3b3JkIGVycm9yIC0gJyArIGVycm9yLm1lc3NhZ2U7XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQXR0ZW1wdCB0byBkZWNyeXB0IG11bHRpcGxlIHdhbGxldCBrZXlzIHdpdGggdGhlIHByb3ZpZGVkIHBhc3NwaHJhc2VcbiAgICogQHBhcmFtIHtEZWNyeXB0S2V5c09wdGlvbnN9IHBhcmFtcyAtIFBhcmFtZXRlcnMgb2JqZWN0IGNvbnRhaW5pbmcgd2FsbGV0IGtleSBwYWlycyBhbmQgcGFzc3dvcmRcbiAgICogQHBhcmFtIHtBcnJheTx7d2FsbGV0SWQ6IHN0cmluZywgZW5jcnlwdGVkUHJ2OiBzdHJpbmd9Pn0gcGFyYW1zLndhbGxldElkRW5jcnlwdGVkS2V5UGFpcnMgLSBBcnJheSBvZiB3YWxsZXQgSUQgYW5kIGVuY3J5cHRlZCBwcml2YXRlIGtleSBwYWlyc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLnBhc3N3b3JkIC0gVGhlIHBhc3NwaHJhc2UgdG8gYXR0ZW1wdCBkZWNyeXB0aW9uIHdpdGhcbiAgICogQHJldHVybnMge3N0cmluZ1tdfSAtIEFycmF5IG9mIHdhbGxldCBJRHMgZm9yIHdoaWNoIGRlY3J5cHRpb24gZmFpbGVkXG4gICAqL1xuICBkZWNyeXB0S2V5cyhwYXJhbXM6IERlY3J5cHRLZXlzT3B0aW9ucyk6IHN0cmluZ1tdIHtcbiAgICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gICAgaWYgKCFwYXJhbXMud2FsbGV0SWRFbmNyeXB0ZWRLZXlQYWlycykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIHBhcmFtZXRlcjogd2FsbGV0SWRFbmNyeXB0ZWRLZXlQYWlycycpO1xuICAgIH1cblxuICAgIGlmICghcGFyYW1zLnBhc3N3b3JkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgcGFyYW1ldGVyOiBwYXNzd29yZCcpO1xuICAgIH1cblxuICAgIGlmICghQXJyYXkuaXNBcnJheShwYXJhbXMud2FsbGV0SWRFbmNyeXB0ZWRLZXlQYWlycykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignd2FsbGV0SWRFbmNyeXB0ZWRLZXlQYWlycyBtdXN0IGJlIGFuIGFycmF5Jyk7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy53YWxsZXRJZEVuY3J5cHRlZEtleVBhaXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGNvbnN0IGZhaWxlZFdhbGxldElkczogc3RyaW5nW10gPSBbXTtcblxuICAgIGZvciAoY29uc3Qga2V5UGFpciBvZiBwYXJhbXMud2FsbGV0SWRFbmNyeXB0ZWRLZXlQYWlycykge1xuICAgICAgaWYgKCFrZXlQYWlyLndhbGxldElkIHx8IHR5cGVvZiBrZXlQYWlyLndhbGxldElkICE9PSAnc3RyaW5nJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2VhY2gga2V5IHBhaXIgbXVzdCBoYXZlIGEgc3RyaW5nIHdhbGxldElkJyk7XG4gICAgICB9XG5cbiAgICAgIGlmICgha2V5UGFpci5lbmNyeXB0ZWRQcnYgfHwgdHlwZW9mIGtleVBhaXIuZW5jcnlwdGVkUHJ2ICE9PSAnc3RyaW5nJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2VhY2gga2V5IHBhaXIgbXVzdCBoYXZlIGEgc3RyaW5nIGVuY3J5cHRlZFBydicpO1xuICAgICAgfVxuXG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLmRlY3J5cHQoe1xuICAgICAgICAgIGlucHV0OiBrZXlQYWlyLmVuY3J5cHRlZFBydixcbiAgICAgICAgICBwYXNzd29yZDogcGFyYW1zLnBhc3N3b3JkLFxuICAgICAgICB9KTtcbiAgICAgICAgLy8gSWYgbm8gZXJyb3Igd2FzIHRocm93biwgZGVjcnlwdGlvbiB3YXMgc3VjY2Vzc2Z1bFxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgLy8gSWYgZGVjcnlwdGlvbiBmYWlscywgYWRkIHRoZSB3YWxsZXRJZCB0byB0aGUgZmFpbGVkIGxpc3RcbiAgICAgICAgZmFpbGVkV2FsbGV0SWRzLnB1c2goa2V5UGFpci53YWxsZXRJZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhaWxlZFdhbGxldElkcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemUgdGhpcyBCaXRHbyBvYmplY3QgdG8gYSBKU09OIG9iamVjdC5cbiAgICpcbiAgICogQ2F1dGlvbjogY29udGFpbnMgc2Vuc2l0aXZlIGRhdGFcbiAgICovXG4gIHRvSlNPTigpOiBCaXRHb0pzb24ge1xuICAgIHJldHVybiB7XG4gICAgICB1c2VyOiB0aGlzLl91c2VyLFxuICAgICAgdG9rZW46IHRoaXMuX3Rva2VuLFxuICAgICAgZXh0ZW5zaW9uS2V5OiB0aGlzLl9leHRlbnNpb25LZXkgPyB0aGlzLl9leHRlbnNpb25LZXkudG9XSUYoKSA6IHVuZGVmaW5lZCxcbiAgICAgIGVjZGhYcHJ2OiB0aGlzLl9lY2RoWHBydixcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgY3VycmVudCB1c2VyXG4gICAqL1xuICB1c2VyKCk6IFVzZXIgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl91c2VyO1xuICB9XG5cbiAgLyoqXG4gICAqIERlc2VyaWFsaXplIGEgSlNPTiBzZXJpYWxpemVkIEJpdEdvIG9iamVjdC5cbiAgICpcbiAgICogT3ZlcndyaXRlcyB0aGUgcHJvcGVydGllcyBvbiB0aGUgY3VycmVudCBCaXRHbyBvYmplY3Qgd2l0aFxuICAgKiB0aG9zZSBvZiB0aGUgZGVzZXJpYWx6ZWQgb2JqZWN0LlxuICAgKlxuICAgKiBAcGFyYW0ganNvblxuICAgKi9cbiAgZnJvbUpTT04oanNvbjogQml0R29Kc29uKTogdm9pZCB7XG4gICAgdGhpcy5fdXNlciA9IGpzb24udXNlcjtcbiAgICB0aGlzLl90b2tlbiA9IGpzb24udG9rZW47XG4gICAgdGhpcy5fZWNkaFhwcnYgPSBqc29uLmVjZGhYcHJ2O1xuICAgIGlmIChqc29uLmV4dGVuc2lvbktleSkge1xuICAgICAgY29uc3QgbmV0d29yayA9IGNvbW1vbi5FbnZpcm9ubWVudHNbdGhpcy5nZXRFbnYoKV0ubmV0d29yaztcbiAgICAgIHRoaXMuX2V4dGVuc2lvbktleSA9IHV0eG9saWIuRUNQYWlyLmZyb21XSUYoXG4gICAgICAgIGpzb24uZXh0ZW5zaW9uS2V5LFxuICAgICAgICB1dHhvbGliLm5ldHdvcmtzW25ldHdvcmtdIGFzIHV0eG9saWIuQml0Y29pbkpTTmV0d29ya1xuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUHJvY2VzcyB0aGUgdXNlcm5hbWUsIHBhc3N3b3JkIGFuZCBvdHAgaW50byBhbiBvYmplY3QgY29udGFpbmluZyB0aGUgdXNlcm5hbWUgYW5kIGhhc2hlZCBwYXNzd29yZCwgcmVhZHkgdG9cbiAgICogc2VuZCB0byBiaXRnbyBmb3IgYXV0aGVudGljYXRpb24uXG4gICAqL1xuICBwcmVwcm9jZXNzQXV0aGVudGljYXRpb25QYXJhbXMoe1xuICAgIHVzZXJuYW1lLFxuICAgIHBhc3N3b3JkLFxuICAgIG90cCxcbiAgICBmb3JjZVNNUyxcbiAgICBleHRlbnNpYmxlLFxuICAgIHRydXN0LFxuICAgIGZvclJlc2V0MkZBLFxuICAgIGluaXRpYWxIYXNoLFxuICAgIGZpbmdlcnByaW50SGFzaCxcbiAgfTogQXV0aGVudGljYXRlT3B0aW9ucyk6IFByb2Nlc3NlZEF1dGhlbnRpY2F0aW9uT3B0aW9ucyB7XG4gICAgaWYgKCFfLmlzU3RyaW5nKHVzZXJuYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdleHBlY3RlZCBzdHJpbmcgdXNlcm5hbWUnKTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNTdHJpbmcocGFzc3dvcmQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2V4cGVjdGVkIHN0cmluZyBwYXNzd29yZCcpO1xuICAgIH1cblxuICAgIGNvbnN0IGxvd2VyTmFtZSA9IHVzZXJuYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgLy8gQ2FsY3VsYXRlIHRoZSBwYXNzd29yZCBITUFDIHNvIHdlIGRvbid0IHNlbmQgY2xlYXItdGV4dCBwYXNzd29yZHNcbiAgICBjb25zdCBobWFjUGFzc3dvcmQgPSB0aGlzLmNhbGN1bGF0ZUhNQUMobG93ZXJOYW1lLCBwYXNzd29yZCk7XG5cbiAgICBjb25zdCBhdXRoUGFyYW1zOiBQcm9jZXNzZWRBdXRoZW50aWNhdGlvbk9wdGlvbnMgPSB7XG4gICAgICBlbWFpbDogbG93ZXJOYW1lLFxuICAgICAgcGFzc3dvcmQ6IGhtYWNQYXNzd29yZCxcbiAgICAgIGZvcmNlU01TOiAhIWZvcmNlU01TLFxuICAgIH07XG5cbiAgICBpZiAob3RwKSB7XG4gICAgICBhdXRoUGFyYW1zLm90cCA9IG90cDtcbiAgICAgIGlmICh0cnVzdCkge1xuICAgICAgICBhdXRoUGFyYW1zLnRydXN0ID0gMTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZXh0ZW5zaWJsZSkge1xuICAgICAgdGhpcy5fZXh0ZW5zaW9uS2V5ID0gbWFrZVJhbmRvbUtleSgpO1xuICAgICAgYXV0aFBhcmFtcy5leHRlbnNpYmxlID0gdHJ1ZTtcbiAgICAgIGF1dGhQYXJhbXMuZXh0ZW5zaW9uQWRkcmVzcyA9IGdldEFkZHJlc3NQMlBLSCh0aGlzLl9leHRlbnNpb25LZXkpO1xuICAgIH1cblxuICAgIGlmIChmb3JSZXNldDJGQSkge1xuICAgICAgYXV0aFBhcmFtcy5mb3JSZXNldDJGQSA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKGluaXRpYWxIYXNoKSB7XG4gICAgICBhdXRoUGFyYW1zLmluaXRpYWxIYXNoID0gaW5pdGlhbEhhc2g7XG4gICAgfVxuXG4gICAgaWYgKGZpbmdlcnByaW50SGFzaCkge1xuICAgICAgYXV0aFBhcmFtcy5maW5nZXJwcmludEhhc2ggPSBmaW5nZXJwcmludEhhc2g7XG4gICAgfVxuXG4gICAgcmV0dXJuIGF1dGhQYXJhbXM7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgdGhlIHBhc3NrZXkgcmVzcG9uc2UgaXMgaW4gdGhlIGV4cGVjdGVkIGZvcm1hdFxuICAgKiBTaG91bGQgYmUgYXMgaXMgcmV0dXJuZWQgZnJvbSBuYXZpZ2F0b3IuY3JlZGVudGlhbHMuZ2V0KClcbiAgICovXG4gIHZhbGlkYXRlUGFzc2tleVJlc3BvbnNlKHBhc3NrZXlSZXNwb25zZTogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgcGFyc2VkUGFzc2tleVJlc3BvbnNlID0gSlNPTi5wYXJzZShwYXNza2V5UmVzcG9uc2UpO1xuICAgIGlmICghcGFyc2VkUGFzc2tleVJlc3BvbnNlICYmICFwYXJzZWRQYXNza2V5UmVzcG9uc2UucmVzcG9uc2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigndW5leHBlY3RlZCB3ZWJhdXRoblJlc3BvbnNlJyk7XG4gICAgfVxuICAgIGlmICghXy5pc1N0cmluZyhwYXJzZWRQYXNza2V5UmVzcG9uc2UuaWQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2lkIGlzIG1pc3NpbmcnKTtcbiAgICB9XG4gICAgaWYgKCFfLmlzU3RyaW5nKHBhcnNlZFBhc3NrZXlSZXNwb25zZS5yZXNwb25zZS5hdXRoZW50aWNhdG9yRGF0YSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignYXV0aGVudGljYXRvckRhdGEgaXMgbWlzc2luZycpO1xuICAgIH1cbiAgICBpZiAoIV8uaXNTdHJpbmcocGFyc2VkUGFzc2tleVJlc3BvbnNlLnJlc3BvbnNlLmNsaWVudERhdGFKU09OKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjbGllbnREYXRhSlNPTiBpcyBtaXNzaW5nJyk7XG4gICAgfVxuICAgIGlmICghXy5pc1N0cmluZyhwYXJzZWRQYXNza2V5UmVzcG9uc2UucmVzcG9uc2Uuc2lnbmF0dXJlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdzaWduYXR1cmUgaXMgbWlzc2luZycpO1xuICAgIH1cbiAgICBpZiAoIV8uaXNTdHJpbmcocGFyc2VkUGFzc2tleVJlc3BvbnNlLnJlc3BvbnNlLnVzZXJIYW5kbGUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3VzZXJIYW5kbGUgaXMgbWlzc2luZycpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTeW5jaHJvbm91cyBtZXRob2QgZm9yIGFjdGl2YXRpbmcgYW4gYWNjZXNzIHRva2VuLlxuICAgKi9cbiAgYXV0aGVudGljYXRlV2l0aEFjY2Vzc1Rva2VuKHsgYWNjZXNzVG9rZW4gfTogQWNjZXNzVG9rZW5PcHRpb25zKTogdm9pZCB7XG4gICAgZGVidWcoJ25vdyBhdXRoZW50aWNhdGluZyB3aXRoIGFjY2VzcyB0b2tlbiAlcycsIGFjY2Vzc1Rva2VuLnN1YnN0cmluZygwLCA4KSk7XG4gICAgdGhpcy5fdG9rZW4gPSBhY2Nlc3NUb2tlbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IEVDREgga2V5Y2hhaW4gZm9yIHRoZSB1c2VyLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbG9naW5QYXNzd29yZCAtIFRoZSB1c2VyJ3MgbG9naW4gcGFzc3dvcmQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59IC0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgbmV3IEVDREgga2V5Y2hhaW4gZGF0YS5cbiAgICogQHRocm93cyB7RXJyb3J9IC0gVGhyb3dzIGFuIGVycm9yIGlmIHRoZXJlIGlzIGFuIGlzc3VlIGNyZWF0aW5nIHRoZSBrZXljaGFpbi5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBjcmVhdGVVc2VyRWNkaEtleWNoYWluKGxvZ2luUGFzc3dvcmQ6IHN0cmluZyk6IFByb21pc2U8YW55PiB7XG4gICAgY29uc3Qga2V5RGF0YSA9IHRoaXMua2V5Y2hhaW5zKCkuY3JlYXRlKCk7XG4gICAgY29uc3QgaGROb2RlID0gYml0Y29pbi5IRE5vZGUuZnJvbUJhc2U1OChrZXlEYXRhLnhwcnYpO1xuXG4gICAgLyoqXG4gICAgICogQWRkIHRoZSBuZXcgRUNESCBrZXljaGFpbiB0byB0aGUgdXNlcidzIGFjY291bnQuXG4gICAgICogQHR5cGUge1Byb21pc2U8YW55Pn0gLSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBuZXcgRUNESCBrZXljaGFpbi5cbiAgICAgKi9cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5rZXljaGFpbnMoKS5hZGQoe1xuICAgICAgc291cmNlOiAnZWNkaCcsXG4gICAgICB4cHViOiBoZE5vZGUubmV1dGVyZWQoKS50b0Jhc2U1OCgpLFxuICAgICAgZW5jcnlwdGVkWHBydjogdGhpcy5lbmNyeXB0KHtcbiAgICAgICAgcGFzc3dvcmQ6IGxvZ2luUGFzc3dvcmQsXG4gICAgICAgIGlucHV0OiBoZE5vZGUudG9CYXNlNTgoKSxcbiAgICAgIH0pLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgdGhlIHVzZXIncyBzZXR0aW5ncyB3aXRoIHRoZSBwcm92aWRlZCBwYXJhbWV0ZXJzLlxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgdG8gdXBkYXRlIHRoZSB1c2VyJ3Mgc2V0dGluZ3Mgd2l0aC5cbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn1cbiAgICogQHRocm93cyB7RXJyb3J9IC0gVGhyb3dzIGFuIGVycm9yIGlmIHRoZXJlIGlzIGFuIGlzc3VlIHVwZGF0aW5nIHRoZSB1c2VyJ3Mgc2V0dGluZ3MuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHVwZGF0ZVVzZXJTZXR0aW5ncyhwYXJhbXM6IGFueSk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMucHV0KHRoaXMudXJsKCcvdXNlci9zZXR0aW5ncycsIDIpKS5zZW5kKHBhcmFtcykucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogRW5zdXJlcyB0aGF0IHRoZSB1c2VyJ3MgRUNESCBrZXljaGFpbiBpcyBjcmVhdGVkIGZvciB3YWxsZXQgc2hhcmluZyBhbmQgVFNTIHdhbGxldHMuXG4gICAqIElmIHRoZSBrZXljaGFpbiBkb2VzIG5vdCBleGlzdCwgaXQgd2lsbCBiZSBjcmVhdGVkIGFuZCB0aGUgdXNlcidzIHNldHRpbmdzIHdpbGwgYmUgdXBkYXRlZC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGxvZ2luUGFzc3dvcmQgLSBUaGUgdXNlcidzIGxvZ2luIHBhc3N3b3JkLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fSAtIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIHVzZXIncyBzZXR0aW5ncyBlbnN1cmluZyB3ZSBoYXZlIHRoZSBlY2RoS2V5Y2hhaW4gaW4gdGhlcmUuXG4gICAqIEB0aHJvd3Mge0Vycm9yfSAtIFRocm93cyBhbiBlcnJvciBpZiB0aGVyZSBpcyBhbiBpc3N1ZSBjcmVhdGluZyB0aGUga2V5Y2hhaW4gb3IgdXBkYXRpbmcgdGhlIHVzZXIncyBzZXR0aW5ncy5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZW5zdXJlVXNlckVjZGhLZXljaGFpbklzQ3JlYXRlZChsb2dpblBhc3N3b3JkOiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xuICAgIC8qKlxuICAgICAqIEdldCB0aGUgdXNlcidzIGN1cnJlbnQgc2V0dGluZ3MuXG4gICAgICovXG4gICAgY29uc3QgdXNlclNldHRpbmdzID0gYXdhaXQgdGhpcy5nZXQodGhpcy51cmwoJy91c2VyL3NldHRpbmdzJykpLnJlc3VsdCgpO1xuICAgIC8qKlxuICAgICAqIElmIHRoZSB1c2VyJ3MgRUNESCBrZXljaGFpbiBkb2VzIG5vdCBleGlzdCwgY3JlYXRlIGEgbmV3IGtleWNoYWluIGFuZCB1cGRhdGUgdGhlIHVzZXIncyBzZXR0aW5ncy5cbiAgICAgKi9cbiAgICBpZiAoIXVzZXJTZXR0aW5ncy5zZXR0aW5ncy5lY2RoS2V5Y2hhaW4pIHtcbiAgICAgIGNvbnN0IG5ld0tleWNoYWluID0gYXdhaXQgdGhpcy5jcmVhdGVVc2VyRWNkaEtleWNoYWluKGxvZ2luUGFzc3dvcmQpO1xuICAgICAgYXdhaXQgdGhpcy51cGRhdGVVc2VyU2V0dGluZ3Moe1xuICAgICAgICBzZXR0aW5nczoge1xuICAgICAgICAgIGVjZGhLZXljaGFpbjogbmV3S2V5Y2hhaW4ueHB1YixcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgLyoqXG4gICAgICAgKiBVcGRhdGUgdGhlIHVzZXIncyBzZXR0aW5ncyBvYmplY3Qgd2l0aCB0aGUgbmV3IEVDREgga2V5Y2hhaW4uXG4gICAgICAgKi9cbiAgICAgIHVzZXJTZXR0aW5ncy5zZXR0aW5ncy5lY2RoS2V5Y2hhaW4gPSBuZXdLZXljaGFpbi54cHViO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gdGhlIHVzZXIncyBFQ0RIIGtleWNoYWluIHNldHRpbmdzLlxuICAgICAqL1xuICAgIHJldHVybiB1c2VyU2V0dGluZ3Muc2V0dGluZ3M7XG4gIH1cblxuICAvKipcbiAgICogTG9naW4gdG8gdGhlIGJpdGdvIHBsYXRmb3JtLlxuICAgKi9cbiAgYXN5bmMgYXV0aGVudGljYXRlKHBhcmFtczogQXV0aGVudGljYXRlT3B0aW9ucyk6IFByb21pc2U8TG9naW5SZXNwb25zZSB8IGFueT4ge1xuICAgIHRyeSB7XG4gICAgICBpZiAoIV8uaXNPYmplY3QocGFyYW1zKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3JlcXVpcmVkIG9iamVjdCBwYXJhbXMnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFfLmlzU3RyaW5nKHBhcmFtcy5wYXNzd29yZCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdleHBlY3RlZCBzdHJpbmcgcGFzc3dvcmQnKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZm9yY2VWMUF1dGggPSAhIXBhcmFtcy5mb3JjZVYxQXV0aDtcbiAgICAgIGNvbnN0IGF1dGhQYXJhbXMgPSB0aGlzLnByZXByb2Nlc3NBdXRoZW50aWNhdGlvblBhcmFtcyhwYXJhbXMpO1xuICAgICAgY29uc3QgcGFzc3dvcmQgPSBwYXJhbXMucGFzc3dvcmQ7XG5cbiAgICAgIGlmICh0aGlzLl90b2tlbikge1xuICAgICAgICByZXR1cm4gbmV3IEVycm9yKCdhbHJlYWR5IGxvZ2dlZCBpbicpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBhdXRoVXJsID0gdGhpcy5taWNyb3NlcnZpY2VzVXJsKCcvYXBpL2F1dGgvdjEvc2Vzc2lvbicpO1xuICAgICAgY29uc3QgcmVxdWVzdCA9IHRoaXMucG9zdChhdXRoVXJsKTtcblxuICAgICAgaWYgKGZvcmNlVjFBdXRoKSB7XG4gICAgICAgIHJlcXVlc3QuZm9yY2VWMUF1dGggPSB0cnVlO1xuICAgICAgICAvLyB0ZWxsIHRoZSBzZXJ2ZXIgdGhhdCB0aGUgY2xpZW50IHdhcyBmb3JjZWQgdG8gZG93bmdyYWRlIHRoZSBhdXRoZW50aWNhdGlvbiBwcm90b2NvbFxuICAgICAgICBhdXRoUGFyYW1zLmZvcmNlVjFBdXRoID0gdHJ1ZTtcbiAgICAgICAgZGVidWcoJ2ZvcmNpbmcgdjEgYXV0aCBmb3IgY2FsbCB0byBhdXRoZW50aWNhdGUnKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlc3BvbnNlOiBzdXBlcmFnZW50LlJlc3BvbnNlID0gYXdhaXQgcmVxdWVzdC5zZW5kKGF1dGhQYXJhbXMpO1xuICAgICAgLy8gZXh0cmFjdCBib2R5IGFuZCB1c2VyIGluZm9ybWF0aW9uXG4gICAgICBjb25zdCBib2R5ID0gcmVzcG9uc2UuYm9keTtcbiAgICAgIHRoaXMuX3VzZXIgPSBib2R5LnVzZXI7XG5cbiAgICAgIGlmIChib2R5LmFjY2Vzc190b2tlbikge1xuICAgICAgICB0aGlzLl90b2tlbiA9IGJvZHkuYWNjZXNzX3Rva2VuO1xuICAgICAgICAvLyBpZiB0aGUgZG93bmdyYWRlIHdhcyBmb3JjZWQsIGFkZGluZyBhIHdhcm5pbmcgbWVzc2FnZSBtaWdodCBiZSBwcnVkZW50XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBjaGVjayB0aGUgcHJlc2VuY2Ugb2YgYW4gZW5jcnlwdGVkIEVDREggeHBydlxuICAgICAgICAvLyBpZiBub3QgcHJlc2VudCwgbGVnYWN5IGFjY291bnRcbiAgICAgICAgY29uc3QgZW5jcnlwdGVkWHBydiA9IGJvZHkuZW5jcnlwdGVkRUNESFhwcnY7XG4gICAgICAgIGlmICghZW5jcnlwdGVkWHBydikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignS2V5Y2hhaW4gbmVlZHMgZW5jcnlwdGVkWHBydiBwcm9wZXJ0eScpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzcG9uc2VEZXRhaWxzID0gdGhpcy5oYW5kbGVUb2tlbklzc3VhbmNlKHJlc3BvbnNlLmJvZHksIHBhc3N3b3JkKTtcbiAgICAgICAgdGhpcy5fdG9rZW4gPSByZXNwb25zZURldGFpbHMudG9rZW47XG4gICAgICAgIHRoaXMuX2VjZGhYcHJ2ID0gcmVzcG9uc2VEZXRhaWxzLmVjZGhYcHJ2O1xuXG4gICAgICAgIC8vIHZlcmlmeSB0aGUgcmVzcG9uc2UncyBhdXRoZW50aWNpdHlcbiAgICAgICAgdmVyaWZ5UmVzcG9uc2UodGhpcywgcmVzcG9uc2VEZXRhaWxzLnRva2VuLCAncG9zdCcsIHJlcXVlc3QsIHJlc3BvbnNlLCB0aGlzLl9hdXRoVmVyc2lvbik7XG5cbiAgICAgICAgLy8gYWRkIHRoZSByZW1haW5pbmcgY29tcG9uZW50IGZvciBlYXNpZXIgYWNjZXNzXG4gICAgICAgIHJlc3BvbnNlLmJvZHkuYWNjZXNzX3Rva2VuID0gdGhpcy5fdG9rZW47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHVzZXJTZXR0aW5ncyA9IHBhcmFtcy5lbnN1cmVFY2RoS2V5Y2hhaW4gPyBhd2FpdCB0aGlzLmVuc3VyZVVzZXJFY2RoS2V5Y2hhaW5Jc0NyZWF0ZWQocGFzc3dvcmQpIDogdW5kZWZpbmVkO1xuICAgICAgaWYgKHVzZXJTZXR0aW5ncz8uZWNkaEtleWNoYWluKSB7XG4gICAgICAgIHJlc3BvbnNlLmJvZHkudXNlci5lY2RoS2V5Y2hhaW4gPSB1c2VyU2V0dGluZ3MuZWNkaEtleWNoYWluO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gaGFuZGxlUmVzcG9uc2VSZXN1bHQ8TG9naW5SZXNwb25zZT4oKShyZXNwb25zZSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaGFuZGxlUmVzcG9uc2VFcnJvcihlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTG9naW4gdG8gdGhlIGJpdGdvIHBsYXRmb3JtIHdpdGggcGFzc2tleS5cbiAgICovXG4gIGFzeW5jIGF1dGhlbnRpY2F0ZVdpdGhQYXNza2V5KFxuICAgIHBhc3NrZXk6IHN0cmluZyxcbiAgICBpbml0aWFsSGFzaD86IHN0cmluZyxcbiAgICBmaW5nZXJwcmludEhhc2g/OiBzdHJpbmdcbiAgKTogUHJvbWlzZTxMb2dpblJlc3BvbnNlIHwgYW55PiB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICh0aGlzLl90b2tlbikge1xuICAgICAgICByZXR1cm4gbmV3IEVycm9yKCdhbHJlYWR5IGxvZ2dlZCBpbicpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBhdXRoVXJsID0gdGhpcy5taWNyb3NlcnZpY2VzVXJsKCcvYXBpL2F1dGgvdjEvc2Vzc2lvbicpO1xuICAgICAgY29uc3QgcmVxdWVzdCA9IHRoaXMucG9zdChhdXRoVXJsKTtcblxuICAgICAgdGhpcy52YWxpZGF0ZVBhc3NrZXlSZXNwb25zZShwYXNza2V5KTtcbiAgICAgIGNvbnN0IHVzZXJJZCA9IEpTT04ucGFyc2UocGFzc2tleSkucmVzcG9uc2UudXNlckhhbmRsZTtcblxuICAgICAgY29uc3QgcmVzcG9uc2U6IHN1cGVyYWdlbnQuUmVzcG9uc2UgPSBhd2FpdCByZXF1ZXN0LnNlbmQoe1xuICAgICAgICBwYXNza2V5OiBwYXNza2V5LFxuICAgICAgICB1c2VySWQ6IHVzZXJJZCxcbiAgICAgICAgaW5pdGlhbEhhc2gsXG4gICAgICAgIGZpbmdlcnByaW50SGFzaCxcbiAgICAgIH0pO1xuICAgICAgLy8gZXh0cmFjdCBib2R5IGFuZCB1c2VyIGluZm9ybWF0aW9uXG4gICAgICBjb25zdCBib2R5ID0gcmVzcG9uc2UuYm9keTtcbiAgICAgIHRoaXMuX3VzZXIgPSBib2R5LnVzZXI7XG5cbiAgICAgIGlmIChib2R5LmFjY2Vzc190b2tlbikge1xuICAgICAgICB0aGlzLl90b2tlbiA9IGJvZHkuYWNjZXNzX3Rva2VuO1xuICAgICAgICByZXNwb25zZS5ib2R5LmFjY2Vzc190b2tlbiA9IGJvZHkuYWNjZXNzX3Rva2VuO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gbG9naW4uIFBsZWFzZSBjb250YWN0IHN1cHBvcnRAYml0Z28uY29tJyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBoYW5kbGVSZXNwb25zZVJlc3VsdDxMb2dpblJlc3BvbnNlPigpKHJlc3BvbnNlKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBoYW5kbGVSZXNwb25zZUVycm9yKGUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0gcmVzcG9uc2VCb2R5IFJlc3BvbnNlIGJvZHkgb2JqZWN0XG4gICAqIEBwYXJhbSBwYXNzd29yZCBQYXNzd29yZCBmb3IgdGhlIHN5bW1ldHJpYyBkZWNyeXB0aW9uXG4gICAqL1xuICBoYW5kbGVUb2tlbklzc3VhbmNlKHJlc3BvbnNlQm9keTogVG9rZW5Jc3N1YW5jZVJlc3BvbnNlLCBwYXNzd29yZD86IHN0cmluZyk6IFRva2VuSXNzdWFuY2Uge1xuICAgIC8vIG1ha2Ugc3VyZSB0aGUgcmVzcG9uc2UgYm9keSBjb250YWlucyB0aGUgbmVjZXNzYXJ5IHByb3BlcnRpZXNcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocmVzcG9uc2VCb2R5LCBbJ2Rlcml2YXRpb25QYXRoJ10sIFsnZW5jcnlwdGVkRUNESFhwcnYnXSk7XG5cbiAgICBjb25zdCBlbnZpcm9ubWVudCA9IHRoaXMuX2VudjtcbiAgICBjb25zdCBlbnZpcm9ubWVudENvbmZpZyA9IGNvbW1vbi5FbnZpcm9ubWVudHNbZW52aXJvbm1lbnRdO1xuICAgIGNvbnN0IHNlcnZlclhwdWIgPSBlbnZpcm9ubWVudENvbmZpZy5zZXJ2ZXJYcHViO1xuICAgIGxldCBlY2RoWHBydiA9IHRoaXMuX2VjZGhYcHJ2O1xuICAgIGlmICghZWNkaFhwcnYpIHtcbiAgICAgIGlmICghcGFzc3dvcmQgfHwgIXJlc3BvbnNlQm9keS5lbmNyeXB0ZWRFQ0RIWHBydikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2VjZGhYcHJ2IHByb3BlcnR5IG11c3QgYmUgc2V0IG9yIHBhc3N3b3JkIGFuZCBlbmNyeXB0ZWQgZW5jcnlwdGVkRUNESFhwcnYgbXVzdCBiZSBwcm92aWRlZCcpO1xuICAgICAgfVxuICAgICAgdHJ5IHtcbiAgICAgICAgZWNkaFhwcnYgPSB0aGlzLmRlY3J5cHQoe1xuICAgICAgICAgIGlucHV0OiByZXNwb25zZUJvZHkuZW5jcnlwdGVkRUNESFhwcnYsXG4gICAgICAgICAgcGFzc3dvcmQ6IHBhc3N3b3JkLFxuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgZS5lcnJvckNvZGUgPSAnZWNkaF94cHJ2X2RlY3J5cHRpb25fZmFpbHVyZSc7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBkZWNyeXB0IGVuY3J5cHRlZEVDREhYcHJ2LicpO1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGNvbnN0cnVjdCBIRE5vZGUgb2JqZWN0cyBmb3IgY2xpZW50J3MgeHBydiBhbmQgc2VydmVyJ3MgeHB1YlxuICAgIGNvbnN0IGNsaWVudEhETm9kZSA9IGJpcDMyLmZyb21CYXNlNTgoZWNkaFhwcnYpO1xuICAgIGNvbnN0IHNlcnZlckhETm9kZSA9IGJpcDMyLmZyb21CYXNlNTgoc2VydmVyWHB1Yik7XG5cbiAgICAvLyBCSVAzMiBkZXJpdmF0aW9uIHBhdGggaXMgYXBwbGllZCB0byBib3RoIGNsaWVudCBhbmQgc2VydmVyIG1hc3RlciBrZXlzXG4gICAgY29uc3QgZGVyaXZhdGlvblBhdGggPSBzYW5pdGl6ZUxlZ2FjeVBhdGgocmVzcG9uc2VCb2R5LmRlcml2YXRpb25QYXRoKTtcbiAgICBjb25zdCBjbGllbnREZXJpdmVkTm9kZSA9IGNsaWVudEhETm9kZS5kZXJpdmVQYXRoKGRlcml2YXRpb25QYXRoKTtcbiAgICBjb25zdCBzZXJ2ZXJEZXJpdmVkTm9kZSA9IHNlcnZlckhETm9kZS5kZXJpdmVQYXRoKGRlcml2YXRpb25QYXRoKTtcblxuICAgIGNvbnN0IHB1YmxpY0tleSA9IHNlcnZlckRlcml2ZWROb2RlLnB1YmxpY0tleTtcbiAgICBjb25zdCBzZWNyZXRLZXkgPSBjbGllbnREZXJpdmVkTm9kZS5wcml2YXRlS2V5O1xuICAgIGlmICghc2VjcmV0S2V5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ25vIGNsaWVudCBwcml2YXRlIEtleScpO1xuICAgIH1cbiAgICBjb25zdCBzZWNyZXQgPSBCdWZmZXIuZnJvbShcbiAgICAgIC8vIEZJWE1FKEJHLTM0Mzg2KTogd2Ugc2hvdWxkIHVzZSBgc2VjcDI1NmsxLmVjZGgoKWAgaW4gdGhlIGZ1dHVyZVxuICAgICAgLy8gICAgICAgICAgICAgICAgICBzZWUgZGlzY3Vzc2lvbiBoZXJlIGh0dHBzOi8vZ2l0aHViLmNvbS9iaXRjb2luLWNvcmUvc2VjcDI1NmsxL2lzc3Vlcy8zNTJcbiAgICAgIHNlY3AyNTZrMS5wdWJsaWNLZXlUd2Vha011bChwdWJsaWNLZXksIHNlY3JldEtleSlcbiAgICApLnRvU3RyaW5nKCdoZXgnKTtcblxuICAgIC8vIGRlY3J5cHQgdG9rZW4gd2l0aCBzeW1tZXRyaWMgRUNESCBrZXlcbiAgICBsZXQgcmVzcG9uc2U6IFRva2VuSXNzdWFuY2U7XG4gICAgdHJ5IHtcbiAgICAgIHJlc3BvbnNlID0ge1xuICAgICAgICB0b2tlbjogdGhpcy5kZWNyeXB0KHtcbiAgICAgICAgICBpbnB1dDogcmVzcG9uc2VCb2R5LmVuY3J5cHRlZFRva2VuLFxuICAgICAgICAgIHBhc3N3b3JkOiBzZWNyZXQsXG4gICAgICAgIH0pLFxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBlLmVycm9yQ29kZSA9ICd0b2tlbl9kZWNyeXB0aW9uX2ZhaWx1cmUnO1xuICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGRlY3J5cHQgdG9rZW4uJyk7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuX2VjZGhYcHJ2KSB7XG4gICAgICByZXNwb25zZS5lY2RoWHBydiA9IGVjZGhYcHJ2O1xuICAgIH1cbiAgICByZXR1cm4gcmVzcG9uc2U7XG4gIH1cblxuICAvKipcbiAgICovXG4gIHZlcmlmeVBhc3N3b3JkKHBhcmFtczogVmVyaWZ5UGFzc3dvcmRPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGlmICghXy5pc1N0cmluZyhwYXJhbXMucGFzc3dvcmQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcmVxdWlyZWQgc3RyaW5nIHBhc3N3b3JkJyk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLl91c2VyIHx8ICF0aGlzLl91c2VyLnVzZXJuYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ25vIGN1cnJlbnQgdXNlcicpO1xuICAgIH1cbiAgICBjb25zdCBobWFjUGFzc3dvcmQgPSB0aGlzLmNhbGN1bGF0ZUhNQUModGhpcy5fdXNlci51c2VybmFtZSwgcGFyYW1zLnBhc3N3b3JkKTtcblxuICAgIHJldHVybiB0aGlzLnBvc3QodGhpcy51cmwoJy91c2VyL3ZlcmlmeXBhc3N3b3JkJykpLnNlbmQoeyBwYXNzd29yZDogaG1hY1Bhc3N3b3JkIH0pLnJlc3VsdCgndmFsaWQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhciBvdXQgYWxsIHN0YXRlIGZyb20gdGhpcyBCaXRHbyBvYmplY3QsIGVmZmVjdGl2ZWx5IGxvZ2dpbmcgb3V0IHRoZSBjdXJyZW50IHVzZXIuXG4gICAqL1xuICBjbGVhcigpOiB2b2lkIHtcbiAgICAvLyBUT0RPOiBhcmUgdGhlcmUgYW55IG90aGVyIGZpZWxkcyB3aGljaCBzaG91bGQgYmUgY2xlYXJlZD9cbiAgICB0aGlzLl91c2VyID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX3Rva2VuID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX3JlZnJlc2hUb2tlbiA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9lY2RoWHBydiA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBVc2UgcmVmcmVzaCB0b2tlbiB0byBnZXQgbmV3IGFjY2VzcyB0b2tlbi5cbiAgICogSWYgdGhlIHJlZnJlc2ggdG9rZW4gaXMgbnVsbC9kZWZpbmVkLCB0aGVuIHdlIHVzZSB0aGUgc3RvcmVkIHRva2VuIGZyb20gYXV0aFxuICAgKi9cbiAgYXN5bmMgcmVmcmVzaFRva2VuKHBhcmFtczogeyByZWZyZXNoVG9rZW4/OiBzdHJpbmcgfSA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbXSwgWydyZWZyZXNoVG9rZW4nXSk7XG5cbiAgICBjb25zdCByZWZyZXNoVG9rZW4gPSBwYXJhbXMucmVmcmVzaFRva2VuIHx8IHRoaXMuX3JlZnJlc2hUb2tlbjtcblxuICAgIGlmICghcmVmcmVzaFRva2VuKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ011c3QgcHJvdmlkZSByZWZyZXNoIHRva2VuIG9yIGhhdmUgYXV0aGVudGljYXRlZCB3aXRoIE9hdXRoIGJlZm9yZScpO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5fY2xpZW50SWQgfHwgIXRoaXMuX2NsaWVudFNlY3JldCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdOZWVkIGNsaWVudCBpZCBhbmQgc2VjcmV0IHNldCBmaXJzdCB0byB1c2UgdGhpcycpO1xuICAgIH1cblxuICAgIGNvbnN0IGJvZHkgPSBhd2FpdCB0aGlzLnBvc3QodGhpcy5fYmFzZVVybCArICcvb2F1dGgvdG9rZW4nKVxuICAgICAgLnNlbmQoe1xuICAgICAgICBncmFudF90eXBlOiAncmVmcmVzaF90b2tlbicsXG4gICAgICAgIHJlZnJlc2hfdG9rZW46IHJlZnJlc2hUb2tlbixcbiAgICAgICAgY2xpZW50X2lkOiB0aGlzLl9jbGllbnRJZCxcbiAgICAgICAgY2xpZW50X3NlY3JldDogdGhpcy5fY2xpZW50U2VjcmV0LFxuICAgICAgfSlcbiAgICAgIC5yZXN1bHQoKTtcbiAgICB0aGlzLl90b2tlbiA9IGJvZHkuYWNjZXNzX3Rva2VuO1xuICAgIHRoaXMuX3JlZnJlc2hUb2tlbiA9IGJvZHkucmVmcmVzaF90b2tlbjtcbiAgICByZXR1cm4gYm9keTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBsaXN0QWNjZXNzVG9rZW5zXG4gICAqIEdldCBpbmZvcm1hdGlvbiBvbiBhbGwgb2YgdGhlIEJpdEdvIGFjY2VzcyB0b2tlbnMgb24gdGhlIHVzZXJcbiAgICogQHJldHVybiB7XG4gICAqICBpZDogPGlkIG9mIHRoZSB0b2tlbj5cbiAgICogIGxhYmVsOiA8dGhlIHVzZXItcHJvdmlkZWQgbGFiZWwgZm9yIHRoaXMgdG9rZW4+XG4gICAqICB1c2VyOiA8aWQgb2YgdGhlIHVzZXIgb24gdGhlIHRva2VuPlxuICAgKiAgZW50ZXJwcmlzZSA8aWQgb2YgdGhlIGVudGVycHJpc2UgdGhpcyB0b2tlbiBpcyB2YWxpZCBmb3I+XG4gICAqICBjbGllbnQ6IDx0aGUgYXV0aCBjbGllbnQgdGhhdCB0aGlzIHRva2VuIGJlbG9uZ3MgdG8+XG4gICAqICBzY29wZTogPGxpc3Qgb2YgYWxsb3dlZCBPQXV0aCBzY29wZSB2YWx1ZXM+XG4gICAqICBjcmVhdGVkOiA8ZGF0ZSB0aGUgdG9rZW4gd2FzIGNyZWF0ZWQ+XG4gICAqICBleHBpcmVzOiA8ZGF0ZSB0aGUgdG9rZW4gd2lsbCBleHBpcmU+XG4gICAqICBvcmlnaW46IDx0aGUgb3JpZ2luIGZvciB3aGljaCB0aGlzIHRva2VuIGlzIHZhbGlkPlxuICAgKiAgaXNFeHRlbnNpYmxlOiA8ZmxhZyBpbmRpY2F0aW5nIGlmIHRoZSB0b2tlbiBjYW4gYmUgZXh0ZW5kZWQ+XG4gICAqICBleHRlbnNpb25BZGRyZXNzOiA8YWRkcmVzcyB3aG9zZSBwcml2YXRlIGtleSdzIHNpZ25hdHVyZSBpcyBuZWNlc3NhcnkgZm9yIGV4dGVuc2lvbnM+XG4gICAqICB1bmxvY2s6IDxpbmZvIGZvciBhY3Rpb25zIHRoYXQgcmVxdWlyZSBhbiB1bmxvY2sgYmVmb3JlIGZpcmluZz5cbiAgICogfVxuICAgKi9cbiAgYXN5bmMgbGlzdEFjY2Vzc1Rva2VucygpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLmdldCh0aGlzLnVybCgnL3VzZXIvYWNjZXNzdG9rZW4nKSkuc2VuZCgpLnJlc3VsdCgnYWNjZXNzVG9rZW5zJyk7XG4gIH1cblxuICAvKipcbiAgICogYWRkQWNjZXNzVG9rZW5cbiAgICogQWRkIGEgQml0R28gQVBJIEFjY2VzcyBUb2tlbiB0byB0aGUgY3VycmVudCB1c2VyIGFjY291bnRcbiAgICogQHBhcmFtIHBhcmFtcyB7XG4gICAqICAgIG90cDogKHJlcXVpcmVkKSA8dmFsaWQgb3RwIGNvZGU+XG4gICAqICAgIGxhYmVsOiAocmVxdWlyZWQpIDxsYWJlbCBmb3IgdGhlIHRva2VuPlxuICAgKiAgICBkdXJhdGlvbjogPGxlbmd0aCBvZiB0aW1lIGluIHNlY29uZHMgdGhlIHRva2VuIHdpbGwgYmUgdmFsaWQgZm9yPlxuICAgKiAgICBpcFJlc3RyaWN0OiA8YXJyYXkgb2YgSVAgYWRkcmVzcyBzdHJpbmdzIHRvIHdoaXRlbGlzdD5cbiAgICogICAgdHhWYWx1ZUxpbWl0OiA8bnVtYmVyIG9mIG91dGdvaW5nIHNhdG9zaGlzIGFsbG93ZWQgb24gdGhpcyB0b2tlbj5cbiAgICogICAgc2NvcGU6IChyZXF1aXJlZCkgPGF1dGhvcml6YXRpb24gc2NvcGUgb2YgdGhlIHJlcXVlc3RlZCB0b2tlbj5cbiAgICogfVxuICAgKiBAcmV0dXJuIHtcbiAgICogICAgaWQ6IDxpZCBvZiB0aGUgdG9rZW4+XG4gICAqICAgIHRva2VuOiA8YWNjZXNzIHRva2VuIGhleCBzdHJpbmcgdG8gYmUgdXNlZCBmb3IgQml0R28gQVBJIHJlcXVlc3QgdmVyaWZpY2F0aW9uPlxuICAgKiAgICBsYWJlbDogPHVzZXItcHJvdmlkZWQgbGFiZWwgZm9yIHRoaXMgdG9rZW4+XG4gICAqICAgIHVzZXI6IDxpZCBvZiB0aGUgdXNlciBvbiB0aGUgdG9rZW4+XG4gICAqICAgIGVudGVycHJpc2UgPGlkIG9mIHRoZSBlbnRlcnByaXNlIHRoaXMgdG9rZW4gaXMgdmFsaWQgZm9yPlxuICAgKiAgICBjbGllbnQ6IDx0aGUgYXV0aCBjbGllbnQgdGhhdCB0aGlzIHRva2VuIGJlbG9uZ3MgdG8+XG4gICAqICAgIHNjb3BlOiA8bGlzdCBvZiBhbGxvd2VkIE9BdXRoIHNjb3BlIHZhbHVlcz5cbiAgICogICAgY3JlYXRlZDogPGRhdGUgdGhlIHRva2VuIHdhcyBjcmVhdGVkPlxuICAgKiAgICBleHBpcmVzOiA8ZGF0ZSB0aGUgdG9rZW4gd2lsbCBleHBpcmU+XG4gICAqICAgIG9yaWdpbjogPHRoZSBvcmlnaW4gZm9yIHdoaWNoIHRoaXMgdG9rZW4gaXMgdmFsaWQ+XG4gICAqICAgIGlzRXh0ZW5zaWJsZTogPGZsYWcgaW5kaWNhdGluZyBpZiB0aGUgdG9rZW4gY2FuIGJlIGV4dGVuZGVkPlxuICAgKiAgICBleHRlbnNpb25BZGRyZXNzOiA8YWRkcmVzcyB3aG9zZSBwcml2YXRlIGtleSdzIHNpZ25hdHVyZSBpcyBuZWNlc3NhcnkgZm9yIGV4dGVuc2lvbnM+XG4gICAqICAgIHVubG9jazogPGluZm8gZm9yIGFjdGlvbnMgdGhhdCByZXF1aXJlIGFuIHVubG9jayBiZWZvcmUgZmlyaW5nPlxuICAgKiB9XG4gICAqL1xuICBhc3luYyBhZGRBY2Nlc3NUb2tlbihwYXJhbXM6IEFkZEFjY2Vzc1Rva2VuT3B0aW9ucyk6IFByb21pc2U8QWRkQWNjZXNzVG9rZW5SZXNwb25zZT4ge1xuICAgIHRyeSB7XG4gICAgICBpZiAoIV8uaXNTdHJpbmcocGFyYW1zLmxhYmVsKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3JlcXVpcmVkIHN0cmluZyBsYWJlbCcpO1xuICAgICAgfVxuXG4gICAgICAvLyBjaGVjayBub24tc3RyaW5nIHBhcmFtc1xuICAgICAgaWYgKHBhcmFtcy5kdXJhdGlvbikge1xuICAgICAgICBpZiAoIV8uaXNOdW1iZXIocGFyYW1zLmR1cmF0aW9uKSB8fCBwYXJhbXMuZHVyYXRpb24gPCAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdkdXJhdGlvbiBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIG51bWJlcicpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAocGFyYW1zLmlwUmVzdHJpY3QpIHtcbiAgICAgICAgaWYgKCFfLmlzQXJyYXkocGFyYW1zLmlwUmVzdHJpY3QpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpcFJlc3RyaWN0IG11c3QgYmUgYW4gYXJyYXknKTtcbiAgICAgICAgfVxuICAgICAgICBfLmZvckVhY2gocGFyYW1zLmlwUmVzdHJpY3QsIChpcEFkZHIpID0+IHtcbiAgICAgICAgICBpZiAoIV8uaXNTdHJpbmcoaXBBZGRyKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpcFJlc3RyaWN0IG11c3QgYmUgYW4gYXJyYXkgb2YgSVAgYWRkcmVzcyBzdHJpbmdzJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGlmIChwYXJhbXMudHhWYWx1ZUxpbWl0KSB7XG4gICAgICAgIGlmICghXy5pc051bWJlcihwYXJhbXMudHhWYWx1ZUxpbWl0KSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcigndHhWYWx1ZUxpbWl0IG11c3QgYmUgYSBudW1iZXInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFyYW1zLnR4VmFsdWVMaW1pdCA8IDApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3R4VmFsdWVMaW1pdCBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIG51bWJlcicpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAocGFyYW1zLnNjb3BlICYmIHBhcmFtcy5zY29wZS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGlmICghXy5pc0FycmF5KHBhcmFtcy5zY29wZSkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Njb3BlIG11c3QgYmUgYW4gYXJyYXknKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdtdXN0IHNwZWNpZnkgc2NvcGUgZm9yIHRva2VuJyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGF1dGhVcmwgPSB0aGlzLm1pY3Jvc2VydmljZXNVcmwoJy9hcGkvYXV0aC92MS9hY2Nlc3N0b2tlbicpO1xuICAgICAgY29uc3QgcmVxdWVzdCA9IHRoaXMucG9zdChhdXRoVXJsKTtcblxuICAgICAgaWYgKCF0aGlzLl9lY2RoWHBydikge1xuICAgICAgICAvLyB3aXRob3V0IGEgcHJpdmF0ZSBrZXksIHRoZSB1c2VyIGNhbm5vdCBkZWNyeXB0IHRoZSBuZXcgYWNjZXNzIHRva2VuIHRoZSBzZXJ2ZXIgd2lsbCBzZW5kXG4gICAgICAgIHJlcXVlc3QuZm9yY2VWMUF1dGggPSB0cnVlO1xuICAgICAgICBkZWJ1ZygnZm9yY2luZyB2MSBhdXRoIGZvciBhZGRpbmcgYWNjZXNzIHRva2VuIHVzaW5nIHRva2VuICVzJywgdGhpcy5fdG9rZW4/LnN1YnN0cigwLCA4KSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgcmVxdWVzdC5zZW5kKHBhcmFtcyk7XG4gICAgICBpZiAocmVxdWVzdC5mb3JjZVYxQXV0aCkge1xuICAgICAgICAocmVzcG9uc2UgYXMgYW55KS5ib2R5Lndhcm5pbmcgPSAnQSBwcm90b2NvbCBkb3duZ3JhZGUgaGFzIG9jY3VycmVkIGJlY2F1c2UgdGhpcyBpcyBhIGxlZ2FjeSBhY2NvdW50Lic7XG4gICAgICAgIHJldHVybiBoYW5kbGVSZXNwb25zZVJlc3VsdDxBZGRBY2Nlc3NUb2tlblJlc3BvbnNlPigpKHJlc3BvbnNlKTtcbiAgICAgIH1cblxuICAgICAgLy8gdmVyaWZ5IHRoZSBhdXRoZW50aWNpdHkgb2YgdGhlIHNlcnZlcidzIHJlc3BvbnNlIGJlZm9yZSBwcm9jZWVkaW5nIGFueSBmdXJ0aGVyXG4gICAgICB2ZXJpZnlSZXNwb25zZSh0aGlzLCB0aGlzLl90b2tlbiwgJ3Bvc3QnLCByZXF1ZXN0LCByZXNwb25zZSwgdGhpcy5fYXV0aFZlcnNpb24pO1xuXG4gICAgICBjb25zdCByZXNwb25zZURldGFpbHMgPSB0aGlzLmhhbmRsZVRva2VuSXNzdWFuY2UocmVzcG9uc2UuYm9keSk7XG4gICAgICByZXNwb25zZS5ib2R5LnRva2VuID0gcmVzcG9uc2VEZXRhaWxzLnRva2VuO1xuXG4gICAgICByZXR1cm4gaGFuZGxlUmVzcG9uc2VSZXN1bHQ8QWRkQWNjZXNzVG9rZW5SZXNwb25zZT4oKShyZXNwb25zZSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaGFuZGxlUmVzcG9uc2VFcnJvcihlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgZXhwaXJlIHRpbWUgb2YgYW4gYWNjZXNzIHRva2VuIG1hdGNoaW5nIGVpdGhlciB0aGUgaWQgb3IgbGFiZWwgdG8gdGhlIGN1cnJlbnQgZGF0ZSwgZWZmZWN0aXZlbHkgZGVsZXRpbmcgaXRcbiAgICpcbiAgICogUGFyYW1zOlxuICAgKiBpZDogPGlkIG9mIHRoZSBhY2Nlc3MgdG9rZW4gdG8gYmUgZGVsZXRlZD5cbiAgICogbGFiZWw6IDxsYWJlbCBvZiB0aGUgYWNjZXNzIHRva2VuIHRvIGJlIGRlbGV0ZWQ+XG4gICAqXG4gICAqIFJldHVybnM6XG4gICAqIGlkOiA8aWQgb2YgdGhlIHRva2VuPlxuICAgKiBsYWJlbDogPHVzZXItcHJvdmlkZWQgbGFiZWwgZm9yIHRoaXMgdG9rZW4+XG4gICAqIHVzZXI6IDxpZCBvZiB0aGUgdXNlciBvbiB0aGUgdG9rZW4+XG4gICAqIGVudGVycHJpc2UgPGlkIG9mIHRoZSBlbnRlcnByaXNlIHRoaXMgdG9rZW4gaXMgdmFsaWQgZm9yPlxuICAgKiBjbGllbnQ6IDx0aGUgYXV0aCBjbGllbnQgdGhhdCB0aGlzIHRva2VuIGJlbG9uZ3MgdG8+XG4gICAqIHNjb3BlOiA8bGlzdCBvZiBhbGxvd2VkIE9BdXRoIHNjb3BlIHZhbHVlcz5cbiAgICogY3JlYXRlZDogPGRhdGUgdGhlIHRva2VuIHdhcyBjcmVhdGVkPlxuICAgKiBleHBpcmVzOiA8ZGF0ZSB0aGUgdG9rZW4gd2lsbCBleHBpcmU+XG4gICAqIG9yaWdpbjogPHRoZSBvcmlnaW4gZm9yIHdoaWNoIHRoaXMgdG9rZW4gaXMgdmFsaWQ+XG4gICAqIGlzRXh0ZW5zaWJsZTogPGZsYWcgaW5kaWNhdGluZyBpZiB0aGUgdG9rZW4gY2FuIGJlIGV4dGVuZGVkPlxuICAgKiBleHRlbnNpb25BZGRyZXNzOiA8YWRkcmVzcyB3aG9zZSBwcml2YXRlIGtleSdzIHNpZ25hdHVyZSBpcyBuZSpjZXNzYXJ5IGZvciBleHRlbnNpb25zPlxuICAgKiB1bmxvY2s6IDxpbmZvIGZvciBhY3Rpb25zIHRoYXQgcmVxdWlyZSBhbiB1bmxvY2sgYmVmb3JlIGZpcmluZz5cbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKi9cbiAgYXN5bmMgcmVtb3ZlQWNjZXNzVG9rZW4oeyBpZCwgbGFiZWwgfTogUmVtb3ZlQWNjZXNzVG9rZW5PcHRpb25zKTogUHJvbWlzZTxhbnk+IHtcbiAgICBpZiAoKCFpZCAmJiAhbGFiZWwpIHx8IChpZCAmJiBsYWJlbCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbXVzdCBwcm92aWRlIGV4YWN0bHkgb25lIG9mIGlkIG9yIGxhYmVsJyk7XG4gICAgfVxuICAgIGlmIChpZCkge1xuICAgICAgcmV0dXJuIHRoaXMuZGVsKHRoaXMudXJsKGAvdXNlci9hY2Nlc3N0b2tlbi8ke2lkfWApKVxuICAgICAgICAuc2VuZCgpXG4gICAgICAgIC5yZXN1bHQoKTtcbiAgICB9XG5cbiAgICBjb25zdCB0b2tlbnMgPSBhd2FpdCB0aGlzLmxpc3RBY2Nlc3NUb2tlbnMoKTtcblxuICAgIGlmICghdG9rZW5zKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Rva2VuIHdpdGggdGhpcyBsYWJlbCBkb2VzIG5vdCBleGlzdCcpO1xuICAgIH1cblxuICAgIGNvbnN0IG1hdGNoaW5nVG9rZW5zID0gXy5maWx0ZXIodG9rZW5zLCB7IGxhYmVsIH0pO1xuICAgIGlmIChtYXRjaGluZ1Rva2Vucy5sZW5ndGggPiAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2FtYmlndW91cyBjYWxsOiBtdWx0aXBsZSB0b2tlbnMgbWF0Y2hpbmcgdGhpcyBsYWJlbCcpO1xuICAgIH1cbiAgICBpZiAobWF0Y2hpbmdUb2tlbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Rva2VuIHdpdGggdGhpcyBsYWJlbCBkb2VzIG5vdCBleGlzdCcpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmRlbCh0aGlzLnVybChgL3VzZXIvYWNjZXNzdG9rZW4vJHttYXRjaGluZ1Rva2Vuc1swXS5pZH1gKSlcbiAgICAgIC5zZW5kKClcbiAgICAgIC5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSBhIHJhbmRvbSBwYXNzd29yZFxuICAgKiBAcGFyYW0gICB7TnVtYmVyfSBudW1Xb3JkcyAgICAgTnVtYmVyIG9mIDMyLWJpdCB3b3Jkc1xuICAgKiBAcmV0dXJucyB7U3RyaW5nfSAgICAgICAgICBiYXNlNTggcmFuZG9tIHBhc3N3b3JkXG4gICAqL1xuICBnZW5lcmF0ZVJhbmRvbVBhc3N3b3JkKG51bVdvcmRzID0gNSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGdlbmVyYXRlUmFuZG9tUGFzc3dvcmQobnVtV29yZHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIExvZ291dCBvZiBCaXRHb1xuICAgKi9cbiAgYXN5bmMgbG9nb3V0KCk6IFByb21pc2U8YW55PiB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5nZXQodGhpcy51cmwoJy91c2VyL2xvZ291dCcpKS5yZXN1bHQoKTtcbiAgICB0aGlzLmNsZWFyKCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYSB1c2VyIGJ5IElEIChuYW1lL2VtYWlsIG9ubHkpXG4gICAqIEBwYXJhbSBpZFxuICAgKlxuICAgKiBAZGVwcmVjYXRlZFxuICAgKi9cbiAgYXN5bmMgZ2V0VXNlcih7IGlkIH06IEdldFVzZXJPcHRpb25zKTogUHJvbWlzZTxhbnk+IHtcbiAgICBpZiAoIV8uaXNTdHJpbmcoaWQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2V4cGVjdGVkIHN0cmluZyBpZCcpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5nZXQodGhpcy51cmwoYC91c2VyLyR7aWR9YCkpLnJlc3VsdCgndXNlcicpO1xuICB9XG4gIC8qKlxuICAgKiBHZXQgdGhlIGN1cnJlbnQgbG9nZ2VkIGluIHVzZXJcbiAgICovXG4gIGFzeW5jIG1lKCk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0VXNlcih7IGlkOiAnbWUnIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFVubG9jayB0aGUgc2Vzc2lvbiBieSBwcm92aWRpbmcgT1RQXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvdHAgUmVxdWlyZWQgT1RQIGNvZGUgZm9yIHRoZSBhY2NvdW50LlxuICAgKiBAcGFyYW0ge251bWJlcn0gZHVyYXRpb24gRGVzaXJlZCBkdXJhdGlvbiBvZiB0aGUgdW5sb2NrIGluIHNlY29uZHMgKGRlZmF1bHQ9NjAwLCBtYXg9MzYwMCkuXG4gICAqL1xuICBhc3luYyB1bmxvY2soeyBvdHAsIGR1cmF0aW9uIH06IFVubG9ja09wdGlvbnMpOiBQcm9taXNlPGFueT4ge1xuICAgIGlmIChvdHAgJiYgIV8uaXNTdHJpbmcob3RwKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdleHBlY3RlZCBzdHJpbmcgb3IgdW5kZWZpbmVkIG90cCcpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5wb3N0KHRoaXMudXJsKCcvdXNlci91bmxvY2snKSkuc2VuZCh7IG90cCwgZHVyYXRpb24gfSkucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogTG9jayB0aGUgc2Vzc2lvblxuICAgKi9cbiAgYXN5bmMgbG9jaygpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLnBvc3QodGhpcy51cmwoJy91c2VyL2xvY2snKSkucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBjdXJyZW50IHNlc3Npb25cbiAgICovXG4gIGFzeW5jIHNlc3Npb24oKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5nZXQodGhpcy51cmwoJy91c2VyL3Nlc3Npb24nKSkucmVzdWx0KCdzZXNzaW9uJyk7XG4gIH1cblxuICAvKipcbiAgICogVHJpZ2dlciBhIHB1c2gvc21zIGZvciB0aGUgT1RQIGNvZGVcbiAgICogQHBhcmFtIHtib29sZWFufSBwYXJhbXMuZm9yY2VTTVMgSWYgc2V0IHRvIHRydWUsIHdpbGwgdXNlIFNNUyB0byBzZW5kIHRoZSBPVFAgdG8gdGhlIHVzZXIgZXZlbiBpZiB0aGV5IGhhdmUgb3RoZXIgMkZBIG1ldGhvZCBzZXQgdXAuXG4gICAqIEBkZXByZWNhdGVkXG4gICAqL1xuICBhc3luYyBzZW5kT1RQKHBhcmFtczogeyBmb3JjZVNNUz86IGJvb2xlYW4gfSA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5wb3N0KHRoaXMudXJsKCcvdXNlci9zZW5kb3RwJykpLnNlbmQocGFyYW1zKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHRlbmQgdG9rZW4sIHByb3ZpZGVkIHRoZSBjdXJyZW50IHRva2VuIGlzIGV4dGVuZGFibGVcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiAtIGR1cmF0aW9uOiBkdXJhdGlvbiBpbiBzZWNvbmRzIGJ5IHdoaWNoIHRvIGV4dGVuZCB0aGUgdG9rZW4sIHN0YXJ0aW5nIGF0IHRoZSBjdXJyZW50IHRpbWVcbiAgICovXG4gIGFzeW5jIGV4dGVuZFRva2VuKHBhcmFtczogRXh0ZW5kVG9rZW5PcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGlmICghdGhpcy5fZXh0ZW5zaW9uS2V5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcmVxdWlyZWQgcHJvcGVydHkgX2V4dGVuc2lvbktleScpO1xuICAgIH1cblxuICAgIGNvbnN0IHRpbWVzdGFtcCA9IERhdGUubm93KCk7XG4gICAgY29uc3QgZHVyYXRpb24gPSBwYXJhbXMuZHVyYXRpb247XG4gICAgY29uc3QgbWVzc2FnZSA9IHRpbWVzdGFtcCArICd8JyArIHRoaXMuX3Rva2VuICsgJ3wnICsgZHVyYXRpb247XG4gICAgY29uc3QgcHJpdmF0ZUtleSA9IHRoaXMuX2V4dGVuc2lvbktleS5wcml2YXRlS2V5O1xuICAgIGlmICghcHJpdmF0ZUtleSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdubyBwcml2YXRlS2V5IG9uIGV4dGVuc2lvbktleScpO1xuICAgIH1cbiAgICBjb25zdCBpc0NvbXByZXNzZWQgPSB0aGlzLl9leHRlbnNpb25LZXkuY29tcHJlc3NlZDtcbiAgICBjb25zdCBwcmVmaXggPSB1dHhvbGliLm5ldHdvcmtzLmJpdGNvaW4ubWVzc2FnZVByZWZpeDtcbiAgICBjb25zdCBzaWduYXR1cmUgPSBiaXRjb2luTWVzc2FnZS5zaWduKG1lc3NhZ2UsIHByaXZhdGVLZXksIGlzQ29tcHJlc3NlZCwgcHJlZml4KS50b1N0cmluZygnaGV4Jyk7XG5cbiAgICByZXR1cm4gdGhpcy5wb3N0KHRoaXMudXJsKCcvdXNlci9leHRlbmR0b2tlbicpKVxuICAgICAgLnNlbmQocGFyYW1zKVxuICAgICAgLnNldCgndGltZXN0YW1wJywgdGltZXN0YW1wLnRvU3RyaW5nKCkpXG4gICAgICAuc2V0KCdzaWduYXR1cmUnLCBzaWduYXR1cmUpXG4gICAgICAucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEga2V5IGZvciBzaGFyaW5nIGEgd2FsbGV0IHdpdGggYSB1c2VyXG4gICAqIEBwYXJhbSBlbWFpbCBlbWFpbCBvZiB1c2VyIHRvIHNoYXJlIHdhbGxldCB3aXRoXG4gICAqL1xuICBhc3luYyBnZXRTaGFyaW5nS2V5KHsgZW1haWwgfTogR2V0U2hhcmluZ0tleU9wdGlvbnMpOiBQcm9taXNlPGFueT4ge1xuICAgIGlmICghXy5pc1N0cmluZyhlbWFpbCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncmVxdWlyZWQgc3RyaW5nIGVtYWlsJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMucG9zdCh0aGlzLnVybCgnL3VzZXIvc2hhcmluZ2tleScpKS5zZW5kKHsgZW1haWwgfSkucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogVXNlcnMgdGhhdCB3YW50IHRvIHNpZ24gd2l0aCBhIGtleSB3aWxsIHVzZSB0aGlzIGFwaSB0byBmZXRjaCB0aGUga2V5Y2hhaW4gYW5kIHRoZSBwYXRoLlxuICAgKiBVc2VycyB0aGF0IHdhbnQgdG8gdmVyaWZ5IGEgc2lnbmF0dXJlIHdpbGwgdXNlIHRoaXMgYXBpIHRvIGZldGNoIGFub3RoZXIgdXNlcnMgZWNkaCBwdWJrZXkuXG4gICAqIE5vdGU6IElmIHRoZSB1c2VyIGlkIGlzIG5vdCBwcm92aWRlZCwgaXQgd2lsbCBkZWZhdWx0IHRvIGdldHRpbmcgdGhlIGN1cnJlbnQgdXNlcidzIGtleWNoYWluLlxuICAgKiBAcGFyYW0gYml0Z29cbiAgICogQHBhcmFtIGVudGVycHJpc2VJZFxuICAgKiBAcGFyYW0gdXNlcklkXG4gICAqL1xuICBhc3luYyBnZXRTaWduaW5nS2V5Rm9yVXNlcihlbnRlcnByaXNlSWQ6IHN0cmluZywgdXNlcklkPzogc3RyaW5nKTogUHJvbWlzZTxHZXRTaWduaW5nS2V5QXBpPiB7XG4gICAgY29uc3QgdXNlciA9IHVzZXJJZCA/PyAnbWUnO1xuICAgIHJldHVybiB0aGlzLmdldCh0aGlzLnVybChgL2VudGVycHJpc2UvJHtlbnRlcnByaXNlSWR9L3VzZXIvJHt1c2VyfS9zaWduaW5na2V5YCwgMikpXG4gICAgICAucXVlcnkoe30pXG4gICAgICAucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICovXG4gIGdldFZhbGlkYXRlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl92YWxpZGF0ZTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKi9cbiAgc2V0VmFsaWRhdGUodmFsaWRhdGU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAoIV8uaXNCb29sZWFuKHZhbGlkYXRlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGFyZ3VtZW50Jyk7XG4gICAgfVxuICAgIHRoaXMuX3ZhbGlkYXRlID0gdmFsaWRhdGU7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXIgYSBuZXcgY29pbiBpbnN0YW5jZSB3aXRoIGl0cyBidWlsZGVyIGZhY3RvcnlcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgY29pbiBuYW1lIGFzIGl0IHdhcyByZWdpc3RlcmVkIGluIEBiaXRnby1iZXRhL3N0YXRpY3NcbiAgICogQHBhcmFtIHtDb2luQ29uc3RydWN0b3J9IGNvaW4gdGhlIGJ1aWxkZXIgZmFjdG9yeSBjbGFzcyBmb3IgdGhhdCBjb2luXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgcHVibGljIHJlZ2lzdGVyKG5hbWU6IHN0cmluZywgY29pbjogQ29pbkNvbnN0cnVjdG9yKTogdm9pZCB7XG4gICAgR2xvYmFsQ29pbkZhY3RvcnkucmVnaXN0ZXIobmFtZSwgY29pbik7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGJpdGNvaW4gbWFya2V0IGRhdGFcbiAgICpcbiAgICogQGRlcHJlY2F0ZWRcbiAgICovXG4gIG1hcmtldHMoKTogYW55IHtcbiAgICBpZiAoIXRoaXMuX21hcmtldHMpIHtcbiAgICAgIHRoaXMuX21hcmtldHMgPSBuZXcgTWFya2V0cyh0aGlzKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX21hcmtldHM7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBsYXRlc3QgYml0Y29pbiBwcmljZXNcbiAgICogKERlcHJlY2F0ZWQ6IFdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgZnV0dXJlKSB1c2UgYGJpdGdvLm1hcmtldHMoKS5sYXRlc3QoKWBcbiAgICogQGRlcHJlY2F0ZWRcbiAgICovXG4gIC8vIGNiLWNvbXBhdFxuICBhc3luYyBtYXJrZXQoKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5nZXQodGhpcy51cmwoJy9tYXJrZXQvbGF0ZXN0JykpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBtYXJrZXQgZGF0YSBmcm9tIHllc3RlcmRheVxuICAgKiAoRGVwcmVjYXRlZDogV2lsbCBiZSByZW1vdmVkIGluIHRoZSBmdXR1cmUpIHVzZSBiaXRnby5tYXJrZXRzKCkueWVzdGVyZGF5KClcbiAgICogQGRlcHJlY2F0ZWRcbiAgICovXG4gIGFzeW5jIHllc3RlcmRheSgpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLmdldCh0aGlzLnVybCgnL21hcmtldC95ZXN0ZXJkYXknKSkucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBibG9ja2NoYWluIG9iamVjdC5cbiAgICogQGRlcHJlY2F0ZWRcbiAgICovXG4gIGJsb2NrY2hhaW4oKTogYW55IHtcbiAgICBpZiAoIXRoaXMuX2Jsb2NrY2hhaW4pIHtcbiAgICAgIHRoaXMuX2Jsb2NrY2hhaW4gPSBuZXcgQmxvY2tjaGFpbih0aGlzKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2Jsb2NrY2hhaW47XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSB1c2VyJ3Mga2V5Y2hhaW5zIG9iamVjdC5cbiAgICogQGRlcHJlY2F0ZWRcbiAgICovXG4gIGtleWNoYWlucygpOiBhbnkge1xuICAgIGlmICghdGhpcy5fa2V5Y2hhaW5zKSB7XG4gICAgICB0aGlzLl9rZXljaGFpbnMgPSBuZXcgS2V5Y2hhaW5zKHRoaXMpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fa2V5Y2hhaW5zO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgdHJhdmVsIHJ1bGUgb2JqZWN0XG4gICAqIEBkZXByZWNhdGVkXG4gICAqL1xuICB0cmF2ZWxSdWxlKCk6IGFueSB7XG4gICAgaWYgKCF0aGlzLl90cmF2ZWxSdWxlKSB7XG4gICAgICB0aGlzLl90cmF2ZWxSdWxlID0gbmV3IFRyYXZlbFJ1bGUodGhpcyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl90cmF2ZWxSdWxlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgdXNlcidzIHdhbGxldHMgb2JqZWN0LlxuICAgKiBAZGVwcmVjYXRlZFxuICAgKi9cbiAgd2FsbGV0cygpOiBhbnkge1xuICAgIGlmICghdGhpcy5fd2FsbGV0cykge1xuICAgICAgdGhpcy5fd2FsbGV0cyA9IG5ldyBXYWxsZXRzKHRoaXMpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fd2FsbGV0cztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgcGVuZGluZyBhcHByb3ZhbHMgdGhhdCBjYW4gYmUgYXBwcm92ZWQvIG9yIHJlamVjdGVkXG4gICAqIEBkZXByZWNhdGVkXG4gICAqL1xuICBwZW5kaW5nQXBwcm92YWxzKCk6IGFueSB7XG4gICAgaWYgKCF0aGlzLl9wZW5kaW5nQXBwcm92YWxzKSB7XG4gICAgICB0aGlzLl9wZW5kaW5nQXBwcm92YWxzID0gbmV3IFBlbmRpbmdBcHByb3ZhbHModGhpcyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9wZW5kaW5nQXBwcm92YWxzO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgZmFjdG9yeSBtZXRob2QgdG8gY3JlYXRlIGEgbmV3IFdhbGxldCBvYmplY3QsIGluaXRpYWxpemVkIHdpdGggdGhlIHdhbGxldCBwYXJhbXNcbiAgICogQ2FuIGJlIHVzZWQgdG8gcmVjb25zdGl0dXRlIGEgd2FsbGV0IGZyb20gY2FjaGVkIGRhdGFcbiAgICogQHBhcmFtIHdhbGxldFBhcmFtc1xuICAgKiBAZGVwcmVjYXRlZFxuICAgKi9cbiAgbmV3V2FsbGV0T2JqZWN0KHdhbGxldFBhcmFtcyk6IGFueSB7XG4gICAgcmV0dXJuIG5ldyBXYWxsZXQodGhpcywgd2FsbGV0UGFyYW1zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWMSBtZXRob2QgZm9yIGNhbGN1bGF0aW5nIG1pbmVyIGZlZSBhbW91bnRzLCBnaXZlbiB0aGUgbnVtYmVyIGFuZFxuICAgKiB0eXBlIG9mIHRyYW5zYWN0aW9uIGlucHV0cywgYWxvbmcgd2l0aCBhIGZlZSByYXRlIGluIHNhdG9zaGlzIHBlciB2a0IuXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIHNob3VsZCBub3QgYmUgdXNlZCBmb3IgbmV3IGNvZGUuXG4gICAqXG4gICAqIEBkZXByZWNhdGVkXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybiB7YW55fVxuICAgKi9cbiAgYXN5bmMgY2FsY3VsYXRlTWluZXJGZWVJbmZvKHBhcmFtczogYW55KTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gVHJhbnNhY3Rpb25CdWlsZGVyLmNhbGN1bGF0ZU1pbmVyRmVlSW5mbyhwYXJhbXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmeSBhIEJpdGNvaW4gYWRkcmVzcyBpcyBhIHZhbGlkIGJhc2U1OCBhZGRyZXNzXG4gICAqIEBkZXByZWNhdGVkXG4gICAqL1xuICB2ZXJpZnlBZGRyZXNzKHBhcmFtczogRGVwcmVjYXRlZFZlcmlmeUFkZHJlc3NPcHRpb25zID0ge30pOiBib29sZWFuIHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ2FkZHJlc3MnXSwgW10pO1xuXG4gICAgaWYgKCFfLmlzU3RyaW5nKHBhcmFtcy5hZGRyZXNzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIHN0cmluZyBhZGRyZXNzJyk7XG4gICAgfVxuXG4gICAgY29uc3QgbmV0d29ya05hbWUgPSBjb21tb24uRW52aXJvbm1lbnRzW3RoaXMuZ2V0RW52KCldLm5ldHdvcms7XG4gICAgY29uc3QgbmV0d29yayA9IHV0eG9saWIubmV0d29ya3NbbmV0d29ya05hbWVdO1xuXG4gICAgcmV0dXJuIHZlcmlmeUFkZHJlc3MocGFyYW1zLmFkZHJlc3MsIG5ldHdvcmspO1xuICB9XG5cbiAgLyoqXG4gICAqIFNwbGl0IGEgc2VjcmV0IGludG8gc2hhcmRzIHVzaW5nIFNoYW1pciBTZWNyZXQgU2hhcmluZy5cbiAgICogQHBhcmFtIHNlZWQgQSBoZXhhZGVjaW1hbCBzZWNyZXQgdG8gc3BsaXRcbiAgICogQHBhcmFtIHBhc3N3b3JkcyBBbiBhcnJheSBvZiB0aGUgcGFzc3dvcmRzIHVzZWQgdG8gZW5jcnlwdCBlYWNoIHNoYXJlXG4gICAqIEBwYXJhbSBtIFRoZSB0aHJlc2hvbGQgbnVtYmVyIG9mIHNoYXJkcyBuZWNlc3NhcnkgdG8gcmVjb25zdGl0dXRlIHRoZSBzZWNyZXRcbiAgICovXG4gIHNwbGl0U2VjcmV0KHsgc2VlZCwgcGFzc3dvcmRzLCBtIH06IFNwbGl0U2VjcmV0T3B0aW9ucyk6IFNwbGl0U2VjcmV0IHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkocGFzc3dvcmRzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdwYXNzd29yZHMgbXVzdCBiZSBhbiBhcnJheScpO1xuICAgIH1cbiAgICBpZiAoIV8uaXNJbnRlZ2VyKG0pIHx8IG0gPCAyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ20gbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDInKTtcbiAgICB9XG5cbiAgICBpZiAocGFzc3dvcmRzLmxlbmd0aCA8IG0pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncGFzc3dvcmRzIGFycmF5IGxlbmd0aCBjYW5ub3QgYmUgbGVzcyB0aGFuIG0nKTtcbiAgICB9XG5cbiAgICBjb25zdCBuID0gcGFzc3dvcmRzLmxlbmd0aDtcbiAgICBjb25zdCBzZWNyZXRzOiBzdHJpbmdbXSA9IHNoYW1pci5zaGFyZShzZWVkLCBuLCBtKTtcbiAgICBjb25zdCBzaGFyZHMgPSBfLnppcFdpdGgoc2VjcmV0cywgcGFzc3dvcmRzLCAoc2hhcmQsIHBhc3N3b3JkKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5lbmNyeXB0KHsgaW5wdXQ6IHNoYXJkLCBwYXNzd29yZCB9KTtcbiAgICB9KTtcbiAgICBjb25zdCBub2RlID0gYmlwMzIuZnJvbVNlZWQoQnVmZmVyLmZyb20oc2VlZCwgJ2hleCcpKTtcbiAgICByZXR1cm4ge1xuICAgICAgeHB1Yjogbm9kZS5uZXV0ZXJlZCgpLnRvQmFzZTU4KCksXG4gICAgICBtLFxuICAgICAgbixcbiAgICAgIHNlZWRTaGFyZXM6IHNoYXJkcyxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlY29uc3RpdHV0ZSBhIHNlY3JldCB3aGljaCB3YXMgc2hhcmRlZCB3aXRoIGBzcGxpdFNlY3JldGAuXG4gICAqIEBwYXJhbSBzaGFyZHNcbiAgICogQHBhcmFtIHBhc3N3b3Jkc1xuICAgKi9cbiAgcmVjb25zdGl0dXRlU2VjcmV0KHsgc2hhcmRzLCBwYXNzd29yZHMgfTogUmVjb25zdGl0dXRlU2VjcmV0T3B0aW9ucyk6IFJlY29uc3RpdHV0ZWRTZWNyZXQge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShzaGFyZHMpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3NoYXJkcyBtdXN0IGJlIGFuIGFycmF5Jyk7XG4gICAgfVxuICAgIGlmICghQXJyYXkuaXNBcnJheShwYXNzd29yZHMpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Bhc3N3b3JkcyBtdXN0IGJlIGFuIGFycmF5Jyk7XG4gICAgfVxuXG4gICAgaWYgKHNoYXJkcy5sZW5ndGggIT09IHBhc3N3b3Jkcy5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignc2hhcmRzIGFuZCBwYXNzd29yZHMgYXJyYXlzIG11c3QgaGF2ZSBzYW1lIGxlbmd0aCcpO1xuICAgIH1cblxuICAgIGNvbnN0IHNlY3JldHMgPSBfLnppcFdpdGgoc2hhcmRzLCBwYXNzd29yZHMsIChzaGFyZCwgcGFzc3dvcmQpID0+IHtcbiAgICAgIHJldHVybiB0aGlzLmRlY3J5cHQoeyBpbnB1dDogc2hhcmQsIHBhc3N3b3JkIH0pO1xuICAgIH0pO1xuICAgIGNvbnN0IHNlZWQ6IHN0cmluZyA9IHNoYW1pci5jb21iaW5lKHNlY3JldHMpO1xuICAgIGNvbnN0IG5vZGUgPSBiaXAzMi5mcm9tU2VlZChCdWZmZXIuZnJvbShzZWVkLCAnaGV4JykpO1xuICAgIHJldHVybiB7XG4gICAgICB4cHViOiBub2RlLm5ldXRlcmVkKCkudG9CYXNlNTgoKSBhcyBzdHJpbmcsXG4gICAgICB4cHJ2OiBub2RlLnRvQmFzZTU4KCkgYXMgc3RyaW5nLFxuICAgICAgc2VlZCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSBzaGFyZHNcbiAgICogQHBhcmFtIHBhc3N3b3Jkc1xuICAgKiBAcGFyYW0gbVxuICAgKiBAcGFyYW0geHB1YiBPcHRpb25hbCB4cHViIHRvIHZlcmlmeSB0aGUgcmVzdWx0cyBhZ2FpbnN0XG4gICAqL1xuICB2ZXJpZnlTaGFyZHMoeyBzaGFyZHMsIHBhc3N3b3JkcywgbSwgeHB1YiB9OiBWZXJpZnlTaGFyZHNPcHRpb25zKTogYm9vbGVhbiB7XG4gICAgLyoqXG4gICAgICogR2VuZXJhdGUgYWxsIHBvc3NpYmxlIGNvbWJpbmF0aW9ucyBvZiBhIGdpdmVuIGFycmF5J3MgdmFsdWVzIGdpdmVuIHN1YnNldCBzaXplIG1cbiAgICAgKiBAcGFyYW0gYXJyYXkgVGhlIGFycmF5IHdob3NlIHZhbHVlcyBhcmUgdG8gYmUgYXJyYW5nZWQgaW4gYWxsIGNvbWJpbmF0aW9uc1xuICAgICAqIEBwYXJhbSBtIFRoZSBzaXplIG9mIGVhY2ggc3Vic2V0XG4gICAgICogQHBhcmFtIGVudHJ5SW5kaWNlcyBSZWN1cnNpdmVseSB0cmFpbGluZyBzZXQgb2YgY3VycmVudGx5IGNob3NlbiBhcnJheSBpbmRpY2VzIGZvciB0aGUgY29tYmluYXRpb24gc3Vic2V0IHVuZGVyIGNvbnN0cnVjdGlvblxuICAgICAqIEByZXR1cm5zIHtBcnJheX1cbiAgICAgKi9cbiAgICBjb25zdCBnZW5lcmF0ZUNvbWJpbmF0aW9ucyA9IChhcnJheTogc3RyaW5nW10sIG06IG51bWJlciwgZW50cnlJbmRpY2VzOiBudW1iZXJbXSA9IFtdKTogc3RyaW5nW11bXSA9PiB7XG4gICAgICBsZXQgY29tYmluYXRpb25zOiBzdHJpbmdbXVtdID0gW107XG5cbiAgICAgIGlmIChlbnRyeUluZGljZXMubGVuZ3RoID09PSBtKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRDb21iaW5hdGlvbiA9IF8uYXQoYXJyYXksIGVudHJ5SW5kaWNlcyk7XG4gICAgICAgIHJldHVybiBbY3VycmVudENvbWJpbmF0aW9uXTtcbiAgICAgIH1cblxuICAgICAgLy8gVGhlIGhpZ2hlc3QgaW5kZXhcbiAgICAgIGxldCBlbnRyeUluZGV4ID0gXy5sYXN0KGVudHJ5SW5kaWNlcyk7XG4gICAgICAvLyBJZiB0aGVyZSBhcmUgY3VycmVudGx5IG5vIGluZGljZXMsIGFzc3VtZSAtMVxuICAgICAgaWYgKF8uaXNVbmRlZmluZWQoZW50cnlJbmRleCkpIHtcbiAgICAgICAgZW50cnlJbmRleCA9IC0xO1xuICAgICAgfVxuICAgICAgZm9yIChsZXQgaSA9IGVudHJ5SW5kZXggKyAxOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgLy8gYXBwZW5kIHRoZSBjdXJyZW50IGluZGV4IHRvIHRoZSB0cmFpbGluZyBpbmRpY2VzXG4gICAgICAgIGNvbnN0IGN1cnJlbnRFbnRyeUluZGljZXMgPSBbLi4uZW50cnlJbmRpY2VzLCBpXTtcbiAgICAgICAgY29uc3QgbmV3Q29tYmluYXRpb25zID0gZ2VuZXJhdGVDb21iaW5hdGlvbnMoYXJyYXksIG0sIGN1cnJlbnRFbnRyeUluZGljZXMpO1xuICAgICAgICBjb21iaW5hdGlvbnMgPSBbLi4uY29tYmluYXRpb25zLCAuLi5uZXdDb21iaW5hdGlvbnNdO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gY29tYmluYXRpb25zO1xuICAgIH07XG5cbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoc2hhcmRzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdzaGFyZHMgbXVzdCBiZSBhbiBhcnJheScpO1xuICAgIH1cbiAgICBpZiAoIUFycmF5LmlzQXJyYXkocGFzc3dvcmRzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdwYXNzd29yZHMgbXVzdCBiZSBhbiBhcnJheScpO1xuICAgIH1cblxuICAgIGlmIChzaGFyZHMubGVuZ3RoICE9PSBwYXNzd29yZHMubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3NoYXJkcyBhbmQgcGFzc3dvcmRzIGFycmF5cyBtdXN0IGhhdmUgc2FtZSBsZW5ndGgnKTtcbiAgICB9XG5cbiAgICBjb25zdCBzZWNyZXRzID0gXy56aXBXaXRoKHNoYXJkcywgcGFzc3dvcmRzLCAoc2hhcmQsIHBhc3N3b3JkKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5kZWNyeXB0KHsgaW5wdXQ6IHNoYXJkLCBwYXNzd29yZCB9KTtcbiAgICB9KTtcbiAgICBjb25zdCBzZWNyZXRDb21iaW5hdGlvbnMgPSBnZW5lcmF0ZUNvbWJpbmF0aW9ucyhzZWNyZXRzLCBtKTtcbiAgICBjb25zdCBzZWVkcyA9IHNlY3JldENvbWJpbmF0aW9ucy5tYXAoKGN1cnJlbnRDb21iaW5hdGlvbikgPT4ge1xuICAgICAgcmV0dXJuIHNoYW1pci5jb21iaW5lKGN1cnJlbnRDb21iaW5hdGlvbik7XG4gICAgfSk7XG4gICAgY29uc3QgdW5pcXVlU2VlZHMgPSBfLnVuaXEoc2VlZHMpO1xuICAgIGlmICh1bmlxdWVTZWVkcy5sZW5ndGggIT09IDEpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3Qgc2VlZCA9IF8uZmlyc3QodW5pcXVlU2VlZHMpO1xuICAgIGNvbnN0IG5vZGUgPSBiaXAzMi5mcm9tU2VlZChCdWZmZXIuZnJvbShzZWVkLCAnaGV4JykpO1xuICAgIGNvbnN0IHJlc3RvcmVkWHB1YiA9IG5vZGUubmV1dGVyZWQoKS50b0Jhc2U1OCgpO1xuXG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKHhwdWIpKSB7XG4gICAgICBpZiAoIV8uaXNTdHJpbmcoeHB1YikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd4cHViIG11c3QgYmUgYSBzdHJpbmcnKTtcbiAgICAgIH1cbiAgICAgIGlmIChyZXN0b3JlZFhwdWIgIT09IHhwdWIpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIC0gdXNlIGBnZXRTaGFyZWRTZWNyZXQoKWBcbiAgICovXG4gIGdldEVDREhTZWNyZXQoeyBvdGhlclB1YktleUhleCwgZWNrZXkgfTogR2V0RWNkaFNlY3JldE9wdGlvbnMpOiBzdHJpbmcge1xuICAgIGlmICghXy5pc1N0cmluZyhvdGhlclB1YktleUhleCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignb3RoZXJQdWJLZXlIZXggc3RyaW5nIHJlcXVpcmVkJyk7XG4gICAgfVxuICAgIGlmICghXy5pc09iamVjdChlY2tleSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZWNrZXkgb2JqZWN0IHJlcXVpcmVkJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGdldFNoYXJlZFNlY3JldChlY2tleSwgQnVmZmVyLmZyb20ob3RoZXJQdWJLZXlIZXgsICdoZXgnKSkudG9TdHJpbmcoJ2hleCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHVzZXIncyBwcml2YXRlIEVDREgga2V5Y2hhaW5cbiAgICovXG4gIGFzeW5jIGdldEVDREhLZXljaGFpbihlY2RoS2V5Y2hhaW5QdWI/OiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xuICAgIGlmICghZWNkaEtleWNoYWluUHViKSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmdldCh0aGlzLnVybCgnL3VzZXIvc2V0dGluZ3MnKSkucmVzdWx0KCk7XG4gICAgICBpZiAoIXJlc3VsdC5zZXR0aW5ncy5lY2RoS2V5Y2hhaW4pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBFcnJvcignZWNkaCBrZXljaGFpbiBub3QgZm91bmQgZm9yIHVzZXInKTtcbiAgICAgIH1cbiAgICAgIGVjZGhLZXljaGFpblB1YiA9IHJlc3VsdC5zZXR0aW5ncy5lY2RoS2V5Y2hhaW47XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmtleWNoYWlucygpLmdldCh7IHhwdWI6IGVjZGhLZXljaGFpblB1YiB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSB1c2VyIGRlcml2ZWQgcHVibGljIGFuZCBwcml2YXRlIEVDREgga2V5cGFpclxuICAgKiBAcGFyYW0gcGFzc3dvcmQgcGFzc3dvcmQgdG8gZGVjcnlwdCB0aGUgdXNlcidzIEVDREggZW5jcnlwdGVkIHByaXZhdGUga2V5XG4gICAqIEBwYXJhbSBlbnRJZD8gb3B0aW9uYWwgZW50ZXJwcmlzZSBpZCB0byBjaGVjayBmb3IgcGVybWlzc2lvbnNcbiAgICovXG4gIGFzeW5jIGdldEVjZGhLZXlwYWlyUHJpdmF0ZShwYXNzd29yZDogc3RyaW5nLCBlbnRJZDogc3RyaW5nKTogUHJvbWlzZTxFY2RoRGVyaXZlZEtleXBhaXI+IHtcbiAgICBjb25zdCB1c2VyU2lnbmluZ0tleSA9IGF3YWl0IHRoaXMuZ2V0U2lnbmluZ0tleUZvclVzZXIoZW50SWQpO1xuICAgIGNvbnN0IHB1YmtleU9mQWRtaW5FY2RoS2V5SGV4ID0gdXNlclNpZ25pbmdLZXkuZGVyaXZlZFB1YmtleTtcbiAgICBpZiAoIXVzZXJTaWduaW5nS2V5LmVjZGhLZXljaGFpbiB8fCAhdXNlclNpZ25pbmdLZXkuZGVyaXZhdGlvblBhdGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignU29tZXRoaW5nIHdlbnQgd3Jvbmcgd2l0aCB0aGUgdXNlciBrZXljaGFpbi4gUGxlYXNlIGNvbnRhY3Qgc3VwcG9ydEBiaXRnby5jb20uJyk7XG4gICAgfVxuICAgIGNvbnN0IHVzZXJFY2RoS2V5Y2hhaW4gPSBhd2FpdCB0aGlzLmdldEVDREhLZXljaGFpbih1c2VyU2lnbmluZ0tleS5lY2RoS2V5Y2hhaW4pO1xuICAgIGxldCB4cHJ2O1xuICAgIHRyeSB7XG4gICAgICB4cHJ2ID0gdGhpcy5kZWNyeXB0KHtcbiAgICAgICAgcGFzc3dvcmQ6IHBhc3N3b3JkLFxuICAgICAgICBpbnB1dDogdXNlckVjZGhLZXljaGFpbi5lbmNyeXB0ZWRYcHJ2LFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbmNvcnJlY3QgcGFzc3dvcmQuIFBsZWFzZSB0cnkgYWdhaW4uJyk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBkZXJpdmVkUHViS2V5OiBwdWJrZXlPZkFkbWluRWNkaEtleUhleCxcbiAgICAgIGRlcml2YXRpb25QYXRoOiB1c2VyU2lnbmluZ0tleS5kZXJpdmF0aW9uUGF0aCxcbiAgICAgIHhwcnYsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIC0gb3BlcmF0aW5nU3lzdGVtOiBvbmUgb2YgaW9zLCBhbmRyb2lkXG4gICAqIC0gcHVzaFRva2VuOiBoZXgtZm9ybWF0dGVkIHRva2VuIGZvciB0aGUgcmVzcGVjdGl2ZSBuYXRpdmUgcHVzaCBub3RpZmljYXRpb24gc2VydmljZVxuICAgKiBAcmV0dXJucyB7Kn1cbiAgICogQGRlcHJlY2F0ZWRcbiAgICovXG4gIGFzeW5jIHJlZ2lzdGVyUHVzaFRva2VuKHBhcmFtczogUmVnaXN0ZXJQdXNoVG9rZW5PcHRpb25zKTogUHJvbWlzZTxhbnk+IHtcbiAgICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWydwdXNoVG9rZW4nLCAnb3BlcmF0aW5nU3lzdGVtJ10sIFtdKTtcblxuICAgIGlmICghdGhpcy5fdG9rZW4pIHtcbiAgICAgIC8vIHRoaXMgZGV2aWNlIGhhcyB0byBiZSByZWdpc3RlcmVkIHRvIGFuIGV4dGVuc2libGUgc2Vzc2lvblxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdub3QgbG9nZ2VkIGluJyk7XG4gICAgfVxuXG4gICAgY29uc3QgcG9zdFBhcmFtcyA9IF8ucGljayhwYXJhbXMsIFsncHVzaFRva2VuJywgJ29wZXJhdGluZ1N5c3RlbSddKTtcblxuICAgIHJldHVybiB0aGlzLnBvc3QodGhpcy51cmwoJy9kZXZpY2VzJykpLnNlbmQocG9zdFBhcmFtcykucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiAtIHB1c2hWZXJpZmljYXRpb25Ub2tlbjogdGhlIHRva2VuIHJlY2VpdmVkIHZpYSBwdXNoIG5vdGlmaWNhdGlvbiB0byBjb25maXJtIHRoZSBkZXZpY2UncyBtb2JpbGl0eVxuICAgKiBAZGVwcmVjYXRlZFxuICAgKi9cbiAgdmVyaWZ5UHVzaFRva2VuKHBhcmFtczogVmVyaWZ5UHVzaFRva2VuT3B0aW9ucyk6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKCFfLmlzT2JqZWN0KHBhcmFtcykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncmVxdWlyZWQgb2JqZWN0IHBhcmFtcycpO1xuICAgIH1cblxuICAgIGlmICghXy5pc1N0cmluZyhwYXJhbXMucHVzaFZlcmlmaWNhdGlvblRva2VuKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdyZXF1aXJlZCBzdHJpbmcgcHVzaFZlcmlmaWNhdGlvblRva2VuJyk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLl90b2tlbikge1xuICAgICAgLy8gdGhpcyBkZXZpY2UgaGFzIHRvIGJlIHJlZ2lzdGVyZWQgdG8gYW4gZXh0ZW5zaWJsZSBzZXNzaW9uXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ25vdCBsb2dnZWQgaW4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBwb3N0UGFyYW1zID0gXy5waWNrKHBhcmFtcywgJ3B1c2hWZXJpZmljYXRpb25Ub2tlbicpO1xuXG4gICAgcmV0dXJuIHRoaXMucG9zdCh0aGlzLnVybCgnL2RldmljZXMvdmVyaWZ5JykpLnNlbmQocG9zdFBhcmFtcykucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogTG9naW4gdG8gdGhlIGJpdGdvIHN5c3RlbSB1c2luZyBhbiBhdXRoY29kZSBnZW5lcmF0ZWQgdmlhIE9hdXRoXG4gICAqL1xuICBhc3luYyBhdXRoZW50aWNhdGVXaXRoQXV0aENvZGUocGFyYW1zOiBBdXRoZW50aWNhdGVXaXRoQXV0aENvZGVPcHRpb25zKTogUHJvbWlzZTxhbnk+IHtcbiAgICBpZiAoIV8uaXNPYmplY3QocGFyYW1zKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdyZXF1aXJlZCBvYmplY3QgcGFyYW1zJyk7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzU3RyaW5nKHBhcmFtcy5hdXRoQ29kZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncmVxdWlyZWQgc3RyaW5nIGF1dGhDb2RlJyk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLl9jbGllbnRJZCB8fCAhdGhpcy5fY2xpZW50U2VjcmV0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05lZWQgY2xpZW50IGlkIGFuZCBzZWNyZXQgc2V0IGZpcnN0IHRvIHVzZSB0aGlzJyk7XG4gICAgfVxuXG4gICAgY29uc3QgYXV0aENvZGUgPSBwYXJhbXMuYXV0aENvZGU7XG5cbiAgICBpZiAodGhpcy5fdG9rZW4pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignYWxyZWFkeSBsb2dnZWQgaW4nKTtcbiAgICB9XG5cbiAgICBjb25zdCByZXF1ZXN0ID0gdGhpcy5wb3N0KHRoaXMuX2Jhc2VVcmwgKyAnL29hdXRoL3Rva2VuJyk7XG4gICAgcmVxdWVzdC5mb3JjZVYxQXV0aCA9IHRydWU7IC8vIE9BdXRoIGN1cnJlbnRseSBvbmx5IHN1cHBvcnRzIHYxIGF1dGhlbnRpY2F0aW9uXG4gICAgY29uc3QgYm9keSA9IGF3YWl0IHJlcXVlc3RcbiAgICAgIC5zZW5kKHtcbiAgICAgICAgZ3JhbnRfdHlwZTogJ2F1dGhvcml6YXRpb25fY29kZScsXG4gICAgICAgIGNvZGU6IGF1dGhDb2RlLFxuICAgICAgICBjbGllbnRfaWQ6IHRoaXMuX2NsaWVudElkLFxuICAgICAgICBjbGllbnRfc2VjcmV0OiB0aGlzLl9jbGllbnRTZWNyZXQsXG4gICAgICB9KVxuICAgICAgLnJlc3VsdCgpO1xuXG4gICAgdGhpcy5fdG9rZW4gPSBib2R5LmFjY2Vzc190b2tlbjtcbiAgICB0aGlzLl9yZWZyZXNoVG9rZW4gPSBib2R5LnJlZnJlc2hfdG9rZW47XG4gICAgdGhpcy5fdXNlciA9IGF3YWl0IHRoaXMubWUoKTtcbiAgICByZXR1cm4gYm9keTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGFuZ2UgdGhlIHBhc3N3b3JkIG9mIHRoZSBjdXJyZW50bHkgbG9nZ2VkIGluIHVzZXIuXG4gICAqIEFsc28gY2hhbmdlIGFsbCB2MSBhbmQgdjIga2V5Y2hhaW4gcGFzc3dvcmRzIGlmIHRoZXkgbWF0Y2ggdGhlXG4gICAqIGdpdmVuIG9sZFBhc3N3b3JkLiBSZXR1cm5zIG5vdGhpbmcgb24gc3VjY2Vzcy5cbiAgICogQHBhcmFtIG9sZFBhc3N3b3JkIHtTdHJpbmd9IC0gdGhlIGN1cnJlbnQgcGFzc3dvcmRcbiAgICogQHBhcmFtIG5ld1Bhc3N3b3JkIHtTdHJpbmd9IC0gdGhlIG5ldyBwYXNzd29yZFxuICAgKi9cbiAgYXN5bmMgY2hhbmdlUGFzc3dvcmQoeyBvbGRQYXNzd29yZCwgbmV3UGFzc3dvcmQgfTogQ2hhbmdlUGFzc3dvcmRPcHRpb25zKTogUHJvbWlzZTxhbnk+IHtcbiAgICBpZiAoIV8uaXNTdHJpbmcob2xkUGFzc3dvcmQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2V4cGVjdGVkIHN0cmluZyBvbGRQYXNzd29yZCcpO1xuICAgIH1cblxuICAgIGlmICghXy5pc1N0cmluZyhuZXdQYXNzd29yZCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZXhwZWN0ZWQgc3RyaW5nIG5ld1Bhc3N3b3JkJyk7XG4gICAgfVxuXG4gICAgY29uc3QgdXNlciA9IHRoaXMudXNlcigpO1xuICAgIGlmICh0eXBlb2YgdXNlciAhPT0gJ29iamVjdCcgfHwgIXVzZXIudXNlcm5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyByZXF1aXJlZCBvYmplY3QgdXNlcicpO1xuICAgIH1cblxuICAgIGNvbnN0IHZhbGlkYXRpb24gPSBhd2FpdCB0aGlzLnZlcmlmeVBhc3N3b3JkKHsgcGFzc3dvcmQ6IG9sZFBhc3N3b3JkIH0pO1xuICAgIGlmICghdmFsaWRhdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd0aGUgcHJvdmlkZWQgb2xkUGFzc3dvcmQgaXMgaW5jb3JyZWN0Jyk7XG4gICAgfVxuXG4gICAgLy8gaXQgZG9lc24ndCBtYXR0ZXIgd2hpY2ggY29pbiB3ZSBjaG9vc2UgYmVjYXVzZSB0aGUgdjIgdXBkYXRlUGFzc3dvcmQgZnVuY3Rpb25zIHVwZGF0ZXMgYWxsIHYyIGtleWNoYWluc1xuICAgIC8vIHdlIGp1c3QgbmVlZCB0byBjaG9vc2UgYSBjb2luIHRoYXQgZXhpc3RzIGluIHRoZSBjdXJyZW50IGVudmlyb25tZW50XG4gICAgY29uc3QgY29pbiA9IGNvbW1vbi5FbnZpcm9ubWVudHNbdGhpcy5nZXRFbnYoKV0ubmV0d29yayA9PT0gJ2JpdGNvaW4nID8gJ2J0YycgOiAndGJ0Yyc7XG5cbiAgICBjb25zdCB1cGRhdGVLZXljaGFpblBhc3N3b3JkUGFyYW1zID0geyBvbGRQYXNzd29yZCwgbmV3UGFzc3dvcmQgfTtcbiAgICBjb25zdCB2MUtleWNoYWluVXBkYXRlUFdSZXN1bHQgPSBhd2FpdCB0aGlzLmtleWNoYWlucygpLnVwZGF0ZVBhc3N3b3JkKHVwZGF0ZUtleWNoYWluUGFzc3dvcmRQYXJhbXMpO1xuICAgIGNvbnN0IHYyS2V5Y2hhaW5zID0gYXdhaXQgdGhpcy5jb2luKGNvaW4pLmtleWNoYWlucygpLnVwZGF0ZVBhc3N3b3JkKHVwZGF0ZUtleWNoYWluUGFzc3dvcmRQYXJhbXMpO1xuXG4gICAgY29uc3QgdXBkYXRlUGFzc3dvcmRQYXJhbXMgPSB7XG4gICAgICBrZXljaGFpbnM6IHYxS2V5Y2hhaW5VcGRhdGVQV1Jlc3VsdC5rZXljaGFpbnMsXG4gICAgICB2Ml9rZXljaGFpbnM6IHYyS2V5Y2hhaW5zLFxuICAgICAgdmVyc2lvbjogdjFLZXljaGFpblVwZGF0ZVBXUmVzdWx0LnZlcnNpb24sXG4gICAgICBvbGRQYXNzd29yZDogdGhpcy5jYWxjdWxhdGVITUFDKHVzZXIudXNlcm5hbWUsIG9sZFBhc3N3b3JkKSxcbiAgICAgIHBhc3N3b3JkOiB0aGlzLmNhbGN1bGF0ZUhNQUModXNlci51c2VybmFtZSwgbmV3UGFzc3dvcmQpLFxuICAgIH07XG5cbiAgICAvLyBDYWxjdWxhdGUgcGF5bG9hZCBzaXplIGluIEtCXG4gICAgY29uc3QgcGF5bG9hZFNpemVCeXRlcyA9IEpTT04uc3RyaW5naWZ5KHVwZGF0ZVBhc3N3b3JkUGFyYW1zKS5sZW5ndGg7XG4gICAgY29uc3QgcGF5bG9hZFNpemVLQiA9IE1hdGguY2VpbChwYXlsb2FkU2l6ZUJ5dGVzIC8gMTAyNCk7XG5cbiAgICAvLyBDaGVjayBpZiBiYXRjaGluZyBmbG93IGlzIGVuYWJsZWRcbiAgICB0cnkge1xuICAgICAgY29uc3QgYmF0Y2hpbmdGbG93Q2hlY2sgPSBhd2FpdCB0aGlzLmdldCh0aGlzLnVybCgnL3VzZXIvY2hlY2tCYXRjaGluZ1Bhc3N3b3JkRmxvdycsIDIpKVxuICAgICAgICAucXVlcnkoeyBwYXlsb2FkU2l6ZTogcGF5bG9hZFNpemVLQi50b1N0cmluZygpIH0pXG4gICAgICAgIC5yZXN1bHQoKTtcblxuICAgICAgaWYgKGJhdGNoaW5nRmxvd0NoZWNrLmlzQmF0Y2hpbmdGbG93RW5hYmxlZCkge1xuICAgICAgICBhd2FpdCB0aGlzLnByb2Nlc3NLZXljaGFpblBhc3N3b3JkVXBkYXRlc0luQmF0Y2hlcyhcbiAgICAgICAgICB1cGRhdGVQYXNzd29yZFBhcmFtcy5rZXljaGFpbnMsXG4gICAgICAgICAgdXBkYXRlUGFzc3dvcmRQYXJhbXMudjJfa2V5Y2hhaW5zLFxuICAgICAgICAgIGJhdGNoaW5nRmxvd0NoZWNrLm5vT2ZCYXRjaGVzLFxuICAgICAgICAgIDNcbiAgICAgICAgKTtcbiAgICAgICAgLy8gQ2FsbCBjaGFuZ2VwYXNzd29yZCBBUEkgd2l0aG91dCBrZXljaGFpbnMgZm9yIGJhdGNoaW5nIGZsb3dcbiAgICAgICAgcmV0dXJuIHRoaXMucG9zdCh0aGlzLnVybCgnL3VzZXIvY2hhbmdlcGFzc3dvcmQnKSlcbiAgICAgICAgICAuc2VuZCh7XG4gICAgICAgICAgICB2ZXJzaW9uOiB1cGRhdGVQYXNzd29yZFBhcmFtcy52ZXJzaW9uLFxuICAgICAgICAgICAgb2xkUGFzc3dvcmQ6IHVwZGF0ZVBhc3N3b3JkUGFyYW1zLm9sZFBhc3N3b3JkLFxuICAgICAgICAgICAgcGFzc3dvcmQ6IHVwZGF0ZVBhc3N3b3JkUGFyYW1zLnBhc3N3b3JkLFxuICAgICAgICAgIH0pXG4gICAgICAgICAgLnJlc3VsdCgpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBiYXRjaGluZyBmbG93IGNoZWNrIGZhaWxlZFxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnBvc3QodGhpcy51cmwoJy91c2VyL2NoYW5nZXBhc3N3b3JkJykpLnNlbmQodXBkYXRlUGFzc3dvcmRQYXJhbXMpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbGwgdGhlIGFkZHJlc3MgbGFiZWxzIG9uIGFsbCBvZiB0aGUgdXNlcidzIHdhbGxldHNcbiAgICpcbiAgICogQGRlcHJlY2F0ZWRcbiAgICovXG4gIGFzeW5jIGxhYmVscygpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLmdldCh0aGlzLnVybCgnL2xhYmVscycpKS5yZXN1bHQoJ2xhYmVscycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVzdGltYXRlcyBhcHByb3hpbWF0ZSBmZWUgcGVyIGtiIG5lZWRlZCBmb3IgYSB0eCB0byBnZXQgaW50byBhIGJsb2NrXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBwYXJhbXMubnVtQmxvY2tzIHRhcmdldCBibG9ja3MgZm9yIHRoZSB0cmFuc2FjdGlvbiB0byBiZSBjb25maXJtZWRcbiAgICogQHBhcmFtIHtudW1iZXJ9IHBhcmFtcy5tYXhGZWUgbWF4aW11bSBmZWUgd2lsbGluZyB0byBiZSBwYWlkIChmb3Igc2FmZXR5KVxuICAgKiBAcGFyYW0ge2FycmF5W3N0cmluZ119IHBhcmFtcy5pbnB1dHMgbGlzdCBvZiB1bmNvbmZpcm1lZCB0eElkcyBmcm9tIHdoaWNoIHRoaXMgdHJhbnNhY3Rpb24gdXNlcyBpbnB1dHNcbiAgICogQHBhcmFtIHtudW1iZXJ9IHBhcmFtcy50eFNpemUgZXN0aW1hdGVkIHRyYW5zYWN0aW9uIHNpemUgaW4gYnl0ZXMsIG9wdGlvbmFsIHBhcmFtZXRlciB1c2VkIGZvciBDUEZQIGVzdGltYXRpb24uXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gcGFyYW1zLmNwZnBBd2FyZSBmbGFnIGluZGljYXRpbmcgZmVlIHNob3VsZCB0YWtlIGludG8gYWNjb3VudCBDUEZQXG4gICAqIEBkZXByZWNhdGVkXG4gICAqL1xuICBhc3luYyBlc3RpbWF0ZUZlZShwYXJhbXM6IEVzdGltYXRlRmVlT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCBxdWVyeVBhcmFtczogYW55ID0geyB2ZXJzaW9uOiAxMiB9O1xuICAgIGlmIChwYXJhbXMubnVtQmxvY2tzKSB7XG4gICAgICBpZiAoIV8uaXNOdW1iZXIocGFyYW1zLm51bUJsb2NrcykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGFyZ3VtZW50Jyk7XG4gICAgICB9XG4gICAgICBxdWVyeVBhcmFtcy5udW1CbG9ja3MgPSBwYXJhbXMubnVtQmxvY2tzO1xuICAgIH1cbiAgICBpZiAocGFyYW1zLm1heEZlZSkge1xuICAgICAgaWYgKCFfLmlzTnVtYmVyKHBhcmFtcy5tYXhGZWUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhcmd1bWVudCcpO1xuICAgICAgfVxuICAgICAgcXVlcnlQYXJhbXMubWF4RmVlID0gcGFyYW1zLm1heEZlZTtcbiAgICB9XG4gICAgaWYgKHBhcmFtcy5pbnB1dHMpIHtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShwYXJhbXMuaW5wdXRzKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYXJndW1lbnQnKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5UGFyYW1zLmlucHV0cyA9IHBhcmFtcy5pbnB1dHM7XG4gICAgfVxuICAgIGlmIChwYXJhbXMudHhTaXplKSB7XG4gICAgICBpZiAoIV8uaXNOdW1iZXIocGFyYW1zLnR4U2l6ZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGFyZ3VtZW50Jyk7XG4gICAgICB9XG4gICAgICBxdWVyeVBhcmFtcy50eFNpemUgPSBwYXJhbXMudHhTaXplO1xuICAgIH1cbiAgICBpZiAocGFyYW1zLmNwZnBBd2FyZSkge1xuICAgICAgaWYgKCFfLmlzQm9vbGVhbihwYXJhbXMuY3BmcEF3YXJlKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYXJndW1lbnQnKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5UGFyYW1zLmNwZnBBd2FyZSA9IHBhcmFtcy5jcGZwQXdhcmU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZ2V0KHRoaXMudXJsKCcvdHgvZmVlJykpLnF1ZXJ5KHF1ZXJ5UGFyYW1zKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgQml0R28ncyBndWFyYW50ZWUgdXNpbmcgYW4gaW5zdGFudCBpZFxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEBkZXByZWNhdGVkXG4gICAqL1xuICBhc3luYyBpbnN0YW50R3VhcmFudGVlKHBhcmFtczogeyBpZDogc3RyaW5nIH0pOiBQcm9taXNlPGFueT4ge1xuICAgIGlmICghXy5pc1N0cmluZyhwYXJhbXMuaWQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3JlcXVpcmVkIHN0cmluZyBpZCcpO1xuICAgIH1cblxuICAgIGNvbnN0IGJvZHkgPSBhd2FpdCB0aGlzLmdldCh0aGlzLnVybCgnL2luc3RhbnQvJyArIHBhcmFtcy5pZCkpLnJlc3VsdCgpO1xuICAgIGlmICghYm9keS5ndWFyYW50ZWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbm8gZ3VhcmFudGVlIGZvdW5kIGluIHJlc3BvbnNlIGJvZHknKTtcbiAgICB9XG4gICAgaWYgKCFib2R5LnNpZ25hdHVyZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdubyBzaWduYXR1cmUgZm91bmQgaW4gZ3VhcmFudGVlIHJlc3BvbnNlIGJvZHknKTtcbiAgICB9XG4gICAgY29uc3Qgc2lnbmluZ0FkZHJlc3MgPSBjb21tb24uRW52aXJvbm1lbnRzW3RoaXMuZ2V0RW52KCldLnNpZ25pbmdBZGRyZXNzO1xuICAgIGNvbnN0IHNpZ25hdHVyZUJ1ZmZlciA9IEJ1ZmZlci5mcm9tKGJvZHkuc2lnbmF0dXJlLCAnaGV4Jyk7XG4gICAgY29uc3QgcHJlZml4ID0gdXR4b2xpYi5uZXR3b3Jrc1tjb21tb24uRW52aXJvbm1lbnRzW3RoaXMuZ2V0RW52KCldLm5ldHdvcmtdLm1lc3NhZ2VQcmVmaXg7XG4gICAgY29uc3QgaXNWYWxpZFNpZ25hdHVyZSA9IGJpdGNvaW5NZXNzYWdlLnZlcmlmeShib2R5Lmd1YXJhbnRlZSwgc2lnbmluZ0FkZHJlc3MsIHNpZ25hdHVyZUJ1ZmZlciwgcHJlZml4KTtcbiAgICBpZiAoIWlzVmFsaWRTaWduYXR1cmUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW5jb3JyZWN0IHNpZ25hdHVyZScpO1xuICAgIH1cbiAgICByZXR1cm4gYm9keTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYSB0YXJnZXQgYWRkcmVzcyBmb3IgcGF5bWVudCBvZiBhIEJpdEdvIGZlZVxuICAgKiBAZGVwcmVjYXRlZFxuICAgKi9cbiAgYXN5bmMgZ2V0Qml0R29GZWVBZGRyZXNzKCk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMucG9zdCh0aGlzLnVybCgnL2JpbGxpbmcvYWRkcmVzcycpKS5zZW5kKHt9KS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGFuIGFkZHJlc3Mgb2JqZWN0IChpbmNsdWRpbmcgdGhlIHdhbGxldCBpZCkgZm9yIGEgZ2l2ZW4gYWRkcmVzcy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtcy5hZGRyZXNzIFRoZSBhZGRyZXNzIHRvIGxvb2sgdXAuXG4gICAqIEBkZXByZWNhdGVkXG4gICAqL1xuICBhc3luYyBnZXRXYWxsZXRBZGRyZXNzKHsgYWRkcmVzcyB9OiB7IGFkZHJlc3M6IHN0cmluZyB9KTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5nZXQodGhpcy51cmwoYC93YWxsZXRhZGRyZXNzLyR7YWRkcmVzc31gKSkucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2ggbGlzdCBvZiB1c2VyIHdlYmhvb2tzXG4gICAqXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKiBAZGVwcmVjYXRlZFxuICAgKi9cbiAgYXN5bmMgbGlzdFdlYmhvb2tzKCk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KHRoaXMudXJsKCcvd2ViaG9va3MnKSkucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIG5ldyB1c2VyIHdlYmhvb2tcbiAgICpcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICogQGRlcHJlY2F0ZWRcbiAgICovXG4gIGFzeW5jIGFkZFdlYmhvb2socGFyYW1zOiBXZWJob29rT3B0aW9ucyk6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKCFfLmlzU3RyaW5nKHBhcmFtcy51cmwpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3JlcXVpcmVkIHN0cmluZyB1cmwnKTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNTdHJpbmcocGFyYW1zLnR5cGUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3JlcXVpcmVkIHN0cmluZyB0eXBlJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMucG9zdCh0aGlzLnVybCgnL3dlYmhvb2tzJykpLnNlbmQocGFyYW1zKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgdXNlciB3ZWJob29rXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybnMgeyp9XG4gICAqIEBkZXByZWNhdGVkXG4gICAqL1xuICBhc3luYyByZW1vdmVXZWJob29rKHBhcmFtczogV2ViaG9va09wdGlvbnMpOiBQcm9taXNlPGFueT4ge1xuICAgIGlmICghXy5pc1N0cmluZyhwYXJhbXMudXJsKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdyZXF1aXJlZCBzdHJpbmcgdXJsJyk7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzU3RyaW5nKHBhcmFtcy50eXBlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdyZXF1aXJlZCBzdHJpbmcgdHlwZScpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmRlbCh0aGlzLnVybCgnL3dlYmhvb2tzJykpLnNlbmQocGFyYW1zKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaCBsaXN0IG9mIHdlYmhvb2sgbm90aWZpY2F0aW9ucyBmb3IgdGhlIHVzZXJcbiAgICpcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGFzeW5jIGxpc3RXZWJob29rTm90aWZpY2F0aW9ucyhwYXJhbXM6IExpc3RXZWJob29rTm90aWZpY2F0aW9uc09wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgY29uc3QgcXVlcnk6IGFueSA9IHt9O1xuICAgIGlmIChwYXJhbXMucHJldklkKSB7XG4gICAgICBpZiAoIV8uaXNTdHJpbmcocGFyYW1zLnByZXZJZCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHByZXZJZCBhcmd1bWVudCwgZXhwZWN0aW5nIHN0cmluZycpO1xuICAgICAgfVxuICAgICAgcXVlcnkucHJldklkID0gcGFyYW1zLnByZXZJZDtcbiAgICB9XG4gICAgaWYgKHBhcmFtcy5saW1pdCkge1xuICAgICAgaWYgKCFfLmlzTnVtYmVyKHBhcmFtcy5saW1pdCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGxpbWl0IGFyZ3VtZW50LCBleHBlY3RpbmcgbnVtYmVyJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5saW1pdCA9IHBhcmFtcy5saW1pdDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5nZXQodGhpcy51cmwoJy93ZWJob29rcy9ub3RpZmljYXRpb25zJykpLnF1ZXJ5KHF1ZXJ5KS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaW11bGF0ZSBhIHVzZXIgd2ViaG9va1xuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgYXN5bmMgc2ltdWxhdGVXZWJob29rKHBhcmFtczogQml0R29TaW11bGF0ZVdlYmhvb2tPcHRpb25zKTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ3dlYmhvb2tJZCcsICdibG9ja0lkJ10sIFtdKTtcbiAgICBpZiAoIV8uaXNTdHJpbmcocGFyYW1zLndlYmhvb2tJZCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncmVxdWlyZWQgc3RyaW5nIHdlYmhvb2tJZCcpO1xuICAgIH1cblxuICAgIGlmICghXy5pc1N0cmluZyhwYXJhbXMuYmxvY2tJZCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncmVxdWlyZWQgc3RyaW5nIGJsb2NrSWQnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5wb3N0KHRoaXMudXJsKGAvd2ViaG9va3MvJHtwYXJhbXMud2ViaG9va0lkfS9zaW11bGF0ZWApKVxuICAgICAgLnNlbmQocGFyYW1zKVxuICAgICAgLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN5bmNocm9ub3VzbHkgZ2V0IGNvbnN0YW50cyB3aGljaCBhcmUgcmVsZXZhbnQgdG8gdGhlIGNsaWVudC5cbiAgICpcbiAgICogTm90ZTogVGhpcyBmdW5jdGlvbiBoYXMgYSBrbm93biByYWNlIGNvbmRpdGlvbi4gSXQgbWF5IHJldHVybiBkaWZmZXJlbnQgdmFsdWVzIG92ZXIgdGltZSxcbiAgICogZXNwZWNpYWxseSBpZiBjYWxsZWQgc2hvcnRseSBhZnRlciBjcmVhdGlvbiBvZiB0aGUgQml0R28gb2JqZWN0LlxuICAgKlxuICAgKiBOZXcgY29kZSBzaG91bGQgY2FsbCBmZXRjaENvbnN0YW50cygpIGRpcmVjdGx5IGluc3RlYWQuXG4gICAqXG4gICAqIEBkZXByZWNhdGVkXG4gICAqIEByZXR1cm4ge09iamVjdH0gVGhlIGNsaWVudCBjb25zdGFudHMgb2JqZWN0XG4gICAqL1xuICBnZXRDb25zdGFudHMoKTogYW55IHtcbiAgICAvLyBraWNrIG9mZiBhIGZyZXNoIHJlcXVlc3QgZm9yIHRoZSBjbGllbnQgY29uc3RhbnRzXG4gICAgdGhpcy5mZXRjaENvbnN0YW50cygpLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgLy8gbWFrZSBzdXJlIGFuIGVycm9yIGRvZXMgbm90IHRlcm1pbmF0ZSB0aGUgZW50aXJlIHNjcmlwdFxuICAgICAgICBjb25zb2xlLmVycm9yKCdmYWlsZWQgdG8gZmV0Y2ggY2xpZW50IGNvbnN0YW50cyBmcm9tIEJpdEdvJyk7XG4gICAgICAgIGNvbnNvbGUudHJhY2UoZXJyKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIHVzZSBkZWZhdWx0Q29uc3RhbnRzIGFzIHRoZSBiYWNrdXAgZm9yIGtleXMgdGhhdCBhcmUgbm90IHNldCBpbiBCaXRHb0FQSS5fY29uc3RhbnRzXG4gICAgcmV0dXJuIF8ubWVyZ2Uoe30sIGRlZmF1bHRDb25zdGFudHModGhpcy5nZXRFbnYoKSksIEJpdEdvQVBJLl9jb25zdGFudHM/Llt0aGlzLmdldEVudigpXSB8fCB7fSk7XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZSBhbiBhc3NldCByZXF1ZXN0IHdoaWNoIGRvZXMgbm90IG5lZWQgSE1BQyB2YWxpZGF0aW9uXG4gICAqIEBwYXJhbSB1cmwgVGhlIFVSTCBmb3IgdGhlIGFzc2V0IHJlcXVlc3RcbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn0gVGhlIHJlc3BvbnNlIGJvZHlcbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBleGVjdXRlQXNzZXRSZXF1ZXN0KHVybDogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCByZXEgPSB0aGlzLmdldEFnZW50UmVxdWVzdCgnZ2V0JywgdXJsKTtcbiAgICByZXEuc2V0KCdCaXRHby1TREstVmVyc2lvbicsIHRoaXMuX3ZlcnNpb24pO1xuICAgIGlmICh0aGlzLl9jdXN0b21Qcm94eUFnZW50KSB7XG4gICAgICByZXEuYWdlbnQodGhpcy5fY3VzdG9tUHJveHlBZ2VudCk7XG4gICAgfVxuICAgIC8vIFNldCB0aGUgcmVxdWVzdCB0aW1lb3V0IHRvIGp1c3QgYWJvdmUgNSBtaW51dGVzIGJ5IGRlZmF1bHRcbiAgICByZXEudGltZW91dCgocHJvY2Vzcy5lbnYuQklUR09fVElNRU9VVCBhcyBhbnkpICogMTAwMCB8fCAzMDUgKiAxMDAwKTtcbiAgICBpZiAodGhpcy5nZXRBZGRpdGlvbmFsSGVhZGVyc0NiKSB7XG4gICAgICBjb25zdCBhZGRpdGlvbmFsSGVhZGVycyA9IHRoaXMuZ2V0QWRkaXRpb25hbEhlYWRlcnNDYignZ2V0JywgdXJsKTtcbiAgICAgIGZvciAoY29uc3QgeyBrZXksIHZhbHVlIH0gb2YgYWRkaXRpb25hbEhlYWRlcnMpIHtcbiAgICAgICAgcmVxLnNldChrZXksIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVxO1xuICAgIHJldHVybiByZXN1bHQuYm9keTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9jZXNzIGtleWNoYWluIHBhc3N3b3JkIHVwZGF0ZXMgaW4gYmF0Y2hlcyB3aXRoIHJldHJ5IGxvZ2ljXG4gICAqIEBwYXJhbSBrZXljaGFpbnMgLSBUaGUgdjEga2V5Y2hhaW5zIHRvIHVwZGF0ZVxuICAgKiBAcGFyYW0gdjJLZXljaGFpbnMgLSBUaGUgdjIga2V5Y2hhaW5zIHRvIHVwZGF0ZVxuICAgKiBAcGFyYW0gbm9PZkJhdGNoZXMgLSBOdW1iZXIgb2YgYmF0Y2hlcyB0byBzcGxpdCB0aGUga2V5Y2hhaW5zIGludG9cbiAgICogQHBhcmFtIG1heFJldHJpZXMgLSBNYXhpbXVtIG51bWJlciBvZiByZXRyaWVzIHBlciBiYXRjaFxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBwcm9jZXNzS2V5Y2hhaW5QYXNzd29yZFVwZGF0ZXNJbkJhdGNoZXMoXG4gICAga2V5Y2hhaW5zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICAgIHYyS2V5Y2hhaW5zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICAgIG5vT2ZCYXRjaGVzOiBudW1iZXIsXG4gICAgbWF4UmV0cmllczogbnVtYmVyXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIFNwbGl0IGtleWNoYWlucyBpbnRvIGJhdGNoZXNcbiAgICBjb25zdCB2MUtleWNoYWluRW50cmllcyA9IE9iamVjdC5lbnRyaWVzKGtleWNoYWlucyk7XG4gICAgY29uc3QgdjJLZXljaGFpbkVudHJpZXMgPSBPYmplY3QuZW50cmllcyh2MktleWNoYWlucyk7XG5cbiAgICBjb25zdCB2MUJhdGNoU2l6ZSA9IE1hdGguY2VpbCh2MUtleWNoYWluRW50cmllcy5sZW5ndGggLyBub09mQmF0Y2hlcyk7XG4gICAgY29uc3QgdjJCYXRjaFNpemUgPSBNYXRoLmNlaWwodjJLZXljaGFpbkVudHJpZXMubGVuZ3RoIC8gbm9PZkJhdGNoZXMpO1xuXG4gICAgLy8gQ2FsbCBiYXRjaGluZyBBUEkgZm9yIGVhY2ggYmF0Y2ggd2l0aCByZXRyeSBsb2dpY1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9PZkJhdGNoZXM7IGkrKykge1xuICAgICAgY29uc3QgdjFCYXRjaCA9IE9iamVjdC5mcm9tRW50cmllcyh2MUtleWNoYWluRW50cmllcy5zbGljZShpICogdjFCYXRjaFNpemUsIChpICsgMSkgKiB2MUJhdGNoU2l6ZSkpO1xuICAgICAgY29uc3QgdjJCYXRjaCA9IE9iamVjdC5mcm9tRW50cmllcyh2MktleWNoYWluRW50cmllcy5zbGljZShpICogdjJCYXRjaFNpemUsIChpICsgMSkgKiB2MkJhdGNoU2l6ZSkpO1xuXG4gICAgICBsZXQgcmV0cnlDb3VudCA9IDA7XG4gICAgICBsZXQgc3VjY2VzcyA9IGZhbHNlO1xuXG4gICAgICB3aGlsZSAocmV0cnlDb3VudCA8IG1heFJldHJpZXMgJiYgIXN1Y2Nlc3MpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMucHV0KHRoaXMudXJsKCcvdXNlci9rZXljaGFpbnMnLCAyKSlcbiAgICAgICAgICAgIC5zZW5kKHtcbiAgICAgICAgICAgICAga2V5Y2hhaW5zOiB2MUJhdGNoLFxuICAgICAgICAgICAgICB2Ml9rZXljaGFpbnM6IHYyQmF0Y2gsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLnJlc3VsdCgpO1xuXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlcmUgYXJlIGFueSBmYWlsZWQga2V5Y2hhaW5zIGluIHRoZSByZXNwb25zZVxuICAgICAgICAgIGNvbnN0IGhhc0ZhaWxlZCA9XG4gICAgICAgICAgICAocmVzcG9uc2UuZmFpbGVkPy52MSAmJiBPYmplY3Qua2V5cyhyZXNwb25zZS5mYWlsZWQudjEpLmxlbmd0aCA+IDApIHx8XG4gICAgICAgICAgICAocmVzcG9uc2UuZmFpbGVkPy52MiAmJiBPYmplY3Qua2V5cyhyZXNwb25zZS5mYWlsZWQudjIpLmxlbmd0aCA+IDApO1xuXG4gICAgICAgICAgaWYgKGhhc0ZhaWxlZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBCYXRjaCAke2kgKyAxfSBoYWQgZmFpbGVkIGtleWNoYWluczogJHtKU09OLnN0cmluZ2lmeShyZXNwb25zZS5mYWlsZWQpfWApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHN1Y2Nlc3MgPSB0cnVlO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIHJldHJ5Q291bnQrKztcblxuICAgICAgICAgIGlmIChyZXRyeUNvdW50ID49IG1heFJldHJpZXMpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQmF0Y2ggJHtpICsgMX0gZmFpbGVkIGFmdGVyICR7bWF4UmV0cmllc30gcmV0cmllczogJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIl19