@appium/base-driver 8.1.2 → 8.2.3

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 (70) hide show
  1. package/build/lib/basedriver/capabilities.js +3 -1
  2. package/build/lib/basedriver/commands/index.js +2 -4
  3. package/build/lib/basedriver/driver.js +8 -10
  4. package/build/lib/basedriver/helpers.js +140 -82
  5. package/build/lib/express/express-logging.js +2 -2
  6. package/build/lib/index.js +126 -0
  7. package/build/lib/jsonwp-proxy/protocol-converter.js +2 -5
  8. package/build/lib/jsonwp-proxy/proxy.js +2 -5
  9. package/build/lib/protocol/errors.js +4 -2
  10. package/build/lib/protocol/helpers.js +3 -20
  11. package/build/lib/protocol/index.js +13 -1
  12. package/build/lib/protocol/protocol.js +26 -25
  13. package/build/lib/protocol/routes.js +1 -10
  14. package/build/test/basedriver/capability-specs.js +10 -10
  15. package/build/test/basedriver/commands/event-specs.js +10 -10
  16. package/build/test/basedriver/driver-e2e-specs.js +3 -3
  17. package/build/test/basedriver/driver-e2e-tests.js +6 -223
  18. package/build/test/basedriver/driver-specs.js +3 -3
  19. package/build/test/basedriver/driver-tests.js +6 -6
  20. package/build/test/basedriver/helpers-specs.js +5 -1
  21. package/build/test/basedriver/timeout-specs.js +7 -7
  22. package/build/test/basedriver/websockets-e2e-specs.js +5 -5
  23. package/build/test/express/server-e2e-specs.js +156 -0
  24. package/build/test/express/server-specs.js +151 -0
  25. package/build/test/express/static-specs.js +23 -0
  26. package/build/test/helpers.js +57 -0
  27. package/build/test/jsonwp-proxy/mock-request.js +93 -0
  28. package/build/test/jsonwp-proxy/protocol-converter-specs.js +173 -0
  29. package/build/test/jsonwp-proxy/proxy-e2e-specs.js +61 -0
  30. package/build/test/jsonwp-proxy/proxy-specs.js +294 -0
  31. package/build/test/jsonwp-proxy/url-specs.js +167 -0
  32. package/build/test/jsonwp-status/status-specs.js +36 -0
  33. package/build/test/protocol/errors-specs.js +388 -0
  34. package/build/test/protocol/fake-driver.js +168 -0
  35. package/build/test/protocol/helpers.js +27 -0
  36. package/build/test/protocol/protocol-e2e-specs.js +1182 -0
  37. package/build/test/protocol/routes-specs.js +82 -0
  38. package/build/test/protocol/validator-specs.js +151 -0
  39. package/index.d.ts +5 -3
  40. package/index.js +1 -62
  41. package/lib/basedriver/capabilities.js +3 -0
  42. package/lib/basedriver/commands/index.js +0 -2
  43. package/lib/basedriver/driver.js +6 -26
  44. package/lib/basedriver/helpers.js +202 -85
  45. package/lib/express/express-logging.js +1 -1
  46. package/lib/index.js +64 -0
  47. package/lib/jsonwp-proxy/protocol-converter.js +1 -5
  48. package/lib/jsonwp-proxy/proxy.js +1 -3
  49. package/lib/protocol/errors.js +1 -1
  50. package/lib/protocol/helpers.js +5 -25
  51. package/lib/protocol/index.js +3 -1
  52. package/lib/protocol/protocol.js +26 -31
  53. package/lib/protocol/routes.js +0 -3
  54. package/package.json +8 -16
  55. package/test/basedriver/capability-specs.js +1 -1
  56. package/test/basedriver/commands/event-specs.js +1 -1
  57. package/test/basedriver/driver-e2e-specs.js +1 -1
  58. package/test/basedriver/driver-e2e-tests.js +1 -179
  59. package/test/basedriver/driver-specs.js +1 -1
  60. package/test/basedriver/driver-tests.js +3 -3
  61. package/test/basedriver/helpers-specs.js +4 -0
  62. package/test/basedriver/timeout-specs.js +1 -1
  63. package/test/basedriver/websockets-e2e-specs.js +1 -1
  64. package/build/index.js +0 -120
  65. package/build/lib/basedriver/commands/execute-child.js +0 -137
  66. package/build/lib/basedriver/commands/execute.js +0 -119
  67. package/build/test/basedriver/fixtures/custom-element-finder-bad.js +0 -12
  68. package/build/test/basedriver/fixtures/custom-element-finder.js +0 -36
  69. package/lib/basedriver/commands/execute-child.js +0 -132
  70. package/lib/basedriver/commands/execute.js +0 -126
@@ -5,7 +5,7 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
5
5
  Object.defineProperty(exports, "__esModule", {
6
6
  value: true
7
7
  });
8
- exports.Protocol = void 0;
8
+ exports.Protocol = exports.GET_STATUS_COMMAND = exports.DELETE_SESSION_COMMAND = exports.CREATE_SESSION_COMMAND = void 0;
9
9
  exports.determineProtocol = determineProtocol;
10
10
  exports.driverShouldDoJwpProxy = driverShouldDoJwpProxy;
11
11
  exports.isSessionCommand = isSessionCommand;
@@ -32,7 +32,11 @@ var _constants = require("../constants");
32
32
  var _sessionsCache = _interopRequireDefault(require("./sessions-cache"));
33
33
 
34
34
  const CREATE_SESSION_COMMAND = 'createSession';
35
+ exports.CREATE_SESSION_COMMAND = CREATE_SESSION_COMMAND;
35
36
  const DELETE_SESSION_COMMAND = 'deleteSession';
37
+ exports.DELETE_SESSION_COMMAND = DELETE_SESSION_COMMAND;
38
+ const GET_STATUS_COMMAND = 'getStatus';
39
+ exports.GET_STATUS_COMMAND = GET_STATUS_COMMAND;
36
40
 
37
41
  class Protocol {}
38
42
 
@@ -199,9 +203,17 @@ function buildHandler(app, method, path, spec, driver, isSessCmd) {
199
203
  throw new _errors.errors.NoSuchDriverError();
200
204
  }
201
205
 
206
+ let didPluginOverrideProxy = false;
207
+
202
208
  if (isSessCmd && !spec.neverProxy && driverShouldDoJwpProxy(driver, req, spec.command)) {
203
- await doJwpProxy(driver, req, res);
204
- return;
209
+ if (!driver.pluginsToHandleCmd || driver.pluginsToHandleCmd(spec.command, req.params.sessionId).length === 0) {
210
+ await doJwpProxy(driver, req, res);
211
+ return;
212
+ }
213
+
214
+ _sessionsCache.default.getLogger(req.params.sessionId, currentProtocol).debug(`Would have proxied ` + `command directly, but a plugin exists which might require its value, so will let ` + `its value be collected internally and made part of plugin chain`);
215
+
216
+ didPluginOverrideProxy = true;
205
217
  }
206
218
 
207
219
  if (!spec.command) {
@@ -232,12 +244,13 @@ function buildHandler(app, method, path, spec, driver, isSessCmd) {
232
244
  length: _constants.MAX_LOG_BODY_LENGTH
233
245
  }));
234
246
 
235
- if (driver.executeCommand) {
236
- driverRes = await driver.executeCommand(spec.command, ...args);
237
- } else {
238
- driverRes = await driver.execute(spec.command, ...args);
247
+ if (didPluginOverrideProxy) {
248
+ args.push({
249
+ reqForProxy: req
250
+ });
239
251
  }
240
252
 
253
+ driverRes = await driver.executeCommand(spec.command, ...args);
241
254
  currentProtocol = extractProtocol(driver, req.params.sessionId) || currentProtocol;
242
255
 
243
256
  if (_lodash.default.isPlainObject(driverRes) && _lodash.default.has(driverRes, 'protocol')) {
@@ -310,18 +323,7 @@ function buildHandler(app, method, path, spec, driver, isSessCmd) {
310
323
  _sessionsCache.default.getLogger(req.params.sessionId || newSessionId, currentProtocol).debug(`Encountered internal error running command: ${errMsg}`);
311
324
  }
312
325
 
313
- if (currentProtocol === _constants.PROTOCOLS.W3C) {
314
- [httpStatus, httpResBody] = (0, _errors.getResponseForW3CError)(actualErr);
315
- } else if (currentProtocol === _constants.PROTOCOLS.MJSONWP) {
316
- [httpStatus, httpResBody] = (0, _errors.getResponseForJsonwpError)(actualErr);
317
- } else {
318
- let jsonwpRes = (0, _errors.getResponseForJsonwpError)(actualErr);
319
- let w3cRes = (0, _errors.getResponseForW3CError)(actualErr);
320
- httpResBody = { ...jsonwpRes[1],
321
- ...w3cRes[1]
322
- };
323
- httpStatus = jsonwpRes[0];
324
- }
326
+ [httpStatus, httpResBody] = (0, _errors.getResponseForW3CError)(actualErr);
325
327
  }
326
328
 
327
329
  if (_lodash.default.isString(httpResBody)) {
@@ -341,7 +343,7 @@ function buildHandler(app, method, path, spec, driver, isSessCmd) {
341
343
  delete httpResBody.sessionId;
342
344
  }
343
345
 
344
- httpResBody = (0, _helpers.formatStatus)(httpResBody, httpStatus, currentProtocol);
346
+ httpResBody = (0, _helpers.formatStatus)(httpResBody);
345
347
  res.status(httpStatus).json(httpResBody);
346
348
  }
347
349
  };
@@ -356,7 +358,7 @@ function driverShouldDoJwpProxy(driver, req, command) {
356
358
  return false;
357
359
  }
358
360
 
359
- if (command === 'deleteSession') {
361
+ if (command === DELETE_SESSION_COMMAND) {
360
362
  return false;
361
363
  }
362
364
 
@@ -371,12 +373,11 @@ async function doJwpProxy(driver, req, res) {
371
373
  _sessionsCache.default.getLogger(req.params.sessionId, extractProtocol(driver, req.params.sessionId)).info('Driver proxy active, passing request on via HTTP proxy');
372
374
 
373
375
  if (!driver.canProxy(req.params.sessionId)) {
374
- throw new Error('Trying to proxy to a JSONWP server but driver is unable to proxy');
376
+ throw new Error('Trying to proxy to a server but the driver is unable to proxy');
375
377
  }
376
378
 
377
379
  try {
378
- const proxiedRes = await driver.executeCommand('proxyReqRes', req, res, req.params.sessionId);
379
- if (proxiedRes && proxiedRes.error) throw proxiedRes.error;
380
+ await driver.executeCommand('proxyReqRes', req, res, req.params.sessionId);
380
381
  } catch (err) {
381
382
  if ((0, _errors.isErrorType)(err, _errors.errors.ProxyRequestError)) {
382
383
  throw err;
@@ -387,4 +388,4 @@ async function doJwpProxy(driver, req, res) {
387
388
  }require('source-map-support').install();
388
389
 
389
390
 
390
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9wcm90b2NvbC9wcm90b2NvbC5qcyJdLCJuYW1lcyI6WyJDUkVBVEVfU0VTU0lPTl9DT01NQU5EIiwiREVMRVRFX1NFU1NJT05fQ09NTUFORCIsIlByb3RvY29sIiwiZGV0ZXJtaW5lUHJvdG9jb2wiLCJkZXNpcmVkQ2FwYWJpbGl0aWVzIiwicmVxdWlyZWRDYXBhYmlsaXRpZXMiLCJjYXBhYmlsaXRpZXMiLCJfIiwiaXNQbGFpbk9iamVjdCIsIlBST1RPQ09MUyIsIlczQyIsIk1KU09OV1AiLCJleHRyYWN0UHJvdG9jb2wiLCJkcml2ZXIiLCJzZXNzaW9uSWQiLCJkc3REcml2ZXIiLCJpc0Z1bmN0aW9uIiwiZHJpdmVyRm9yU2Vzc2lvbiIsInByb3RvY29sIiwiU0VTU0lPTlNfQ0FDSEUiLCJnZXRQcm90b2NvbCIsImlzU2Vzc2lvbkNvbW1hbmQiLCJjb21tYW5kIiwiaW5jbHVkZXMiLCJOT19TRVNTSU9OX0lEX0NPTU1BTkRTIiwid3JhcFBhcmFtcyIsInBhcmFtU2V0cyIsImpzb25PYmoiLCJyZXMiLCJpc0FycmF5IiwiaXNPYmplY3QiLCJ3cmFwIiwidW53cmFwUGFyYW1zIiwidW53cmFwIiwiY2hlY2tQYXJhbXMiLCJyZXF1aXJlZFBhcmFtcyIsIm9wdGlvbmFsUGFyYW1zIiwicmVjZWl2ZWRQYXJhbXMiLCJrZXlzIiwicmVxdWlyZWQiLCJmaXJzdCIsIm9wdGlvbmFsIiwidmFsaWRhdGUiLCJtZXNzYWdlIiwiZXJyb3JzIiwiQmFkUGFyYW1ldGVyc0Vycm9yIiwibGVuZ3RoIiwiaW5kZXhPZiIsInB1c2giLCJwYXJhbXMiLCJkaWZmZXJlbmNlIiwibWFrZUFyZ3MiLCJyZXF1ZXN0UGFyYW1zIiwicGF5bG9hZFBhcmFtcyIsInVybFBhcmFtcyIsInJldmVyc2UiLCJ3aXRob3V0IiwiYXJncyIsImZsYXR0ZW4iLCJtYXAiLCJwIiwiY29uY2F0IiwidSIsInJvdXRlQ29uZmlndXJpbmdGdW5jdGlvbiIsInNlc3Npb25FeGlzdHMiLCJFcnJvciIsImV4ZWN1dGVDb21tYW5kIiwiZXhlY3V0ZSIsImFkZFJvdXRlcyIsImFwcCIsImJhc2VQYXRoIiwiREVGQVVMVF9CQVNFX1BBVEgiLCJleHRyYU1ldGhvZE1hcCIsImFsbE1ldGhvZHMiLCJNRVRIT0RfTUFQIiwicGF0aCIsIm1ldGhvZHMiLCJ0b1BhaXJzIiwibWV0aG9kIiwic3BlYyIsImJ1aWxkSGFuZGxlciIsImlzU2Vzc0NtZCIsImFzeW5jSGFuZGxlciIsInJlcSIsImJvZHkiLCJodHRwUmVzQm9keSIsImh0dHBTdGF0dXMiLCJuZXdTZXNzaW9uSWQiLCJjdXJyZW50UHJvdG9jb2wiLCJOb1N1Y2hEcml2ZXJFcnJvciIsIm5ldmVyUHJveHkiLCJkcml2ZXJTaG91bGREb0p3cFByb3h5IiwiZG9Kd3BQcm94eSIsIk5vdEltcGxlbWVudGVkRXJyb3IiLCJkcml2ZXJSZXMiLCJ2YWxpZGF0b3JzIiwiZ2V0TG9nZ2VyIiwiZGVidWciLCJjb25zdHJ1Y3RvciIsIm5hbWUiLCJ0cnVuY2F0ZSIsIkpTT04iLCJzdHJpbmdpZnkiLCJNQVhfTE9HX0JPRFlfTEVOR1RIIiwiaGFzIiwiZXJyb3IiLCJ2YWx1ZSIsInB1dFNlc3Npb24iLCJ1dGlsIiwiaGFzVmFsdWUiLCJzdGF0dXMiLCJpc05hTiIsInBhcnNlSW50Iiwic3RhY2t0cmFjZSIsInJlc2V0TG9nZ2VyIiwiZXJyIiwiYWN0dWFsRXJyIiwiZXJyTXNnIiwic3RhY2siLCJQcm94eVJlcXVlc3RFcnJvciIsImdldEFjdHVhbEVycm9yIiwianNvbndwUmVzIiwidzNjUmVzIiwiaXNTdHJpbmciLCJzZW5kIiwianNvbiIsInRvTG93ZXJDYXNlIiwiQiIsInJlc29sdmUiLCJkb25lIiwicHJveHlBY3RpdmUiLCJwcm94eVJvdXRlSXNBdm9pZGVkIiwib3JpZ2luYWxVcmwiLCJpbmZvIiwiY2FuUHJveHkiLCJwcm94aWVkUmVzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFJQTs7QUFDQTs7QUFDQTs7QUFHQTs7QUFDQTs7QUFHQSxNQUFNQSxzQkFBc0IsR0FBRyxlQUEvQjtBQUNBLE1BQU1DLHNCQUFzQixHQUFHLGVBQS9COztBQUVBLE1BQU1DLFFBQU4sQ0FBZTs7OztBQUVmLFNBQVNDLGlCQUFULENBQTRCQyxtQkFBNUIsRUFBaURDLG9CQUFqRCxFQUF1RUMsWUFBdkUsRUFBcUY7QUFDbkYsU0FBT0MsZ0JBQUVDLGFBQUYsQ0FBZ0JGLFlBQWhCLElBQ0xHLHFCQUFVQyxHQURMLEdBRUxELHFCQUFVRSxPQUZaO0FBR0Q7O0FBRUQsU0FBU0MsZUFBVCxDQUEwQkMsTUFBMUIsRUFBa0NDLFNBQVMsR0FBRyxJQUE5QyxFQUFvRDtBQUNsRCxRQUFNQyxTQUFTLEdBQUdSLGdCQUFFUyxVQUFGLENBQWFILE1BQU0sQ0FBQ0ksZ0JBQXBCLElBQ2RKLE1BQU0sQ0FBQ0ksZ0JBQVAsQ0FBd0JILFNBQXhCLENBRGMsR0FFZEQsTUFGSjs7QUFHQSxNQUFJRSxTQUFTLEtBQUtGLE1BQWxCLEVBQTBCO0FBSXhCLFdBQU9BLE1BQU0sQ0FBQ0ssUUFBZDtBQUNEOztBQUdELFNBQU9ILFNBQVMsR0FBR0EsU0FBUyxDQUFDRyxRQUFiLEdBQXdCQyx1QkFBZUMsV0FBZixDQUEyQk4sU0FBM0IsQ0FBeEM7QUFDRDs7QUFFRCxTQUFTTyxnQkFBVCxDQUEyQkMsT0FBM0IsRUFBb0M7QUFDbEMsU0FBTyxDQUFDZixnQkFBRWdCLFFBQUYsQ0FBV0MsOEJBQVgsRUFBbUNGLE9BQW5DLENBQVI7QUFDRDs7QUFFRCxTQUFTRyxVQUFULENBQXFCQyxTQUFyQixFQUFnQ0MsT0FBaEMsRUFBeUM7QUFPdkMsTUFBSUMsR0FBRyxHQUFHRCxPQUFWOztBQUNBLE1BQUlwQixnQkFBRXNCLE9BQUYsQ0FBVUYsT0FBVixLQUFzQixDQUFDcEIsZ0JBQUV1QixRQUFGLENBQVdILE9BQVgsQ0FBM0IsRUFBZ0Q7QUFDOUNDLElBQUFBLEdBQUcsR0FBRyxFQUFOO0FBQ0FBLElBQUFBLEdBQUcsQ0FBQ0YsU0FBUyxDQUFDSyxJQUFYLENBQUgsR0FBc0JKLE9BQXRCO0FBQ0Q7O0FBQ0QsU0FBT0MsR0FBUDtBQUNEOztBQUVELFNBQVNJLFlBQVQsQ0FBdUJOLFNBQXZCLEVBQWtDQyxPQUFsQyxFQUEyQztBQUl6QyxNQUFJQyxHQUFHLEdBQUdELE9BQVY7O0FBQ0EsTUFBSXBCLGdCQUFFdUIsUUFBRixDQUFXSCxPQUFYLENBQUosRUFBeUI7QUFFdkIsUUFBSUEsT0FBTyxDQUFDRCxTQUFTLENBQUNPLE1BQVgsQ0FBWCxFQUErQjtBQUM3QkwsTUFBQUEsR0FBRyxHQUFHRCxPQUFPLENBQUNELFNBQVMsQ0FBQ08sTUFBWCxDQUFiO0FBQ0Q7QUFDRjs7QUFDRCxTQUFPTCxHQUFQO0FBQ0Q7O0FBRUQsU0FBU00sV0FBVCxDQUFzQlIsU0FBdEIsRUFBaUNDLE9BQWpDLEVBQTBDVCxRQUExQyxFQUFvRDtBQUNsRCxNQUFJaUIsY0FBYyxHQUFHLEVBQXJCO0FBQ0EsTUFBSUMsY0FBYyxHQUFHLEVBQXJCOztBQUNBLE1BQUlDLGNBQWMsR0FBRzlCLGdCQUFFK0IsSUFBRixDQUFPWCxPQUFQLENBQXJCOztBQUVBLE1BQUlELFNBQUosRUFBZTtBQUNiLFFBQUlBLFNBQVMsQ0FBQ2EsUUFBZCxFQUF3QjtBQUd0QixVQUFJLENBQUNoQyxnQkFBRXNCLE9BQUYsQ0FBVXRCLGdCQUFFaUMsS0FBRixDQUFRZCxTQUFTLENBQUNhLFFBQWxCLENBQVYsQ0FBTCxFQUE2QztBQUMzQ0osUUFBQUEsY0FBYyxHQUFHLENBQUNULFNBQVMsQ0FBQ2EsUUFBWCxDQUFqQjtBQUNELE9BRkQsTUFFTztBQUNMSixRQUFBQSxjQUFjLEdBQUdULFNBQVMsQ0FBQ2EsUUFBM0I7QUFDRDtBQUNGOztBQUVELFFBQUliLFNBQVMsQ0FBQ2UsUUFBZCxFQUF3QjtBQUN0QkwsTUFBQUEsY0FBYyxHQUFHVixTQUFTLENBQUNlLFFBQTNCO0FBQ0Q7O0FBTUQsUUFBSWYsU0FBUyxDQUFDZ0IsUUFBZCxFQUF3QjtBQUN0QixVQUFJQyxPQUFPLEdBQUdqQixTQUFTLENBQUNnQixRQUFWLENBQW1CZixPQUFuQixFQUE0QlQsUUFBNUIsQ0FBZDs7QUFDQSxVQUFJeUIsT0FBSixFQUFhO0FBQ1gsY0FBTSxJQUFJQyxlQUFPQyxrQkFBWCxDQUE4QkYsT0FBOUIsRUFBdUNoQixPQUF2QyxDQUFOO0FBQ0Q7QUFDRjtBQUNGOztBQUdELE1BQUlRLGNBQWMsQ0FBQ1csTUFBZixLQUEwQixDQUE5QixFQUFpQztBQUMvQjtBQUNEOztBQUdELE1BQUlWLGNBQWMsQ0FBQ1csT0FBZixDQUF1QixXQUF2QixNQUF3QyxDQUFDLENBQTdDLEVBQWdEO0FBQzlDWCxJQUFBQSxjQUFjLENBQUNZLElBQWYsQ0FBb0IsV0FBcEI7QUFDRDs7QUFHRCxNQUFJWixjQUFjLENBQUNXLE9BQWYsQ0FBdUIsSUFBdkIsTUFBaUMsQ0FBQyxDQUF0QyxFQUF5QztBQUN2Q1gsSUFBQUEsY0FBYyxDQUFDWSxJQUFmLENBQW9CLElBQXBCO0FBQ0Q7O0FBR0QsT0FBSyxJQUFJQyxNQUFULElBQW1CZCxjQUFuQixFQUFtQztBQUNqQyxRQUFJNUIsZ0JBQUUyQyxVQUFGLENBQWFiLGNBQWIsRUFBNkJZLE1BQTdCLEVBQXFDYixjQUFyQyxFQUFxRFUsTUFBckQsS0FBZ0UsQ0FBaEUsSUFDQXZDLGdCQUFFMkMsVUFBRixDQUFhRCxNQUFiLEVBQXFCWixjQUFyQixFQUFxQ1MsTUFBckMsS0FBZ0QsQ0FEcEQsRUFDdUQ7QUFHckQ7QUFDRDtBQUNGOztBQUNELFFBQU0sSUFBSUYsZUFBT0Msa0JBQVgsQ0FBOEJuQixTQUE5QixFQUF5Q1csY0FBekMsQ0FBTjtBQUNEOztBQVNELFNBQVNjLFFBQVQsQ0FBbUJDLGFBQW5CLEVBQWtDekIsT0FBbEMsRUFBMkMwQixhQUEzQyxFQUEwRG5DLFFBQTFELEVBQW9FO0FBS2xFLE1BQUlvQyxTQUFTLEdBQUcvQyxnQkFBRStCLElBQUYsQ0FBT2MsYUFBUCxFQUFzQkcsT0FBdEIsRUFBaEI7O0FBTUEsTUFBSXBCLGNBQWMsR0FBR2tCLGFBQWEsQ0FBQ2QsUUFBbkM7O0FBQ0EsTUFBSWhDLGdCQUFFc0IsT0FBRixDQUFVdEIsZ0JBQUVpQyxLQUFGLENBQVFhLGFBQWEsQ0FBQ2QsUUFBdEIsQ0FBVixDQUFKLEVBQWdEO0FBSzlDLFFBQUlELElBQUksR0FBRy9CLGdCQUFFK0IsSUFBRixDQUFPWCxPQUFQLENBQVg7O0FBQ0EsU0FBSyxJQUFJc0IsTUFBVCxJQUFtQkksYUFBYSxDQUFDZCxRQUFqQyxFQUEyQztBQUN6QyxVQUFJaEMsZ0JBQUVpRCxPQUFGLENBQVVQLE1BQVYsRUFBa0IsR0FBR1gsSUFBckIsRUFBMkJRLE1BQTNCLEtBQXNDLENBQTFDLEVBQTZDO0FBQzNDWCxRQUFBQSxjQUFjLEdBQUdjLE1BQWpCO0FBQ0E7QUFDRDtBQUNGO0FBQ0Y7O0FBR0QsTUFBSVEsSUFBSjs7QUFDQSxNQUFJbEQsZ0JBQUVTLFVBQUYsQ0FBYXFDLGFBQWEsQ0FBQ0YsUUFBM0IsQ0FBSixFQUEwQztBQU94Q00sSUFBQUEsSUFBSSxHQUFHSixhQUFhLENBQUNGLFFBQWQsQ0FBdUJ4QixPQUF2QixFQUFnQ1QsUUFBaEMsQ0FBUDtBQUNELEdBUkQsTUFRTztBQUdMdUMsSUFBQUEsSUFBSSxHQUFHbEQsZ0JBQUVtRCxPQUFGLENBQVV2QixjQUFWLEVBQTBCd0IsR0FBMUIsQ0FBK0JDLENBQUQsSUFBT2pDLE9BQU8sQ0FBQ2lDLENBQUQsQ0FBNUMsQ0FBUDs7QUFDQSxRQUFJUCxhQUFhLENBQUNaLFFBQWxCLEVBQTRCO0FBQzFCZ0IsTUFBQUEsSUFBSSxHQUFHQSxJQUFJLENBQUNJLE1BQUwsQ0FBWXRELGdCQUFFbUQsT0FBRixDQUFVTCxhQUFhLENBQUNaLFFBQXhCLEVBQWtDa0IsR0FBbEMsQ0FBdUNDLENBQUQsSUFBT2pDLE9BQU8sQ0FBQ2lDLENBQUQsQ0FBcEQsQ0FBWixDQUFQO0FBQ0Q7QUFDRjs7QUFHREgsRUFBQUEsSUFBSSxHQUFHQSxJQUFJLENBQUNJLE1BQUwsQ0FBWVAsU0FBUyxDQUFDSyxHQUFWLENBQWVHLENBQUQsSUFBT1YsYUFBYSxDQUFDVSxDQUFELENBQWxDLENBQVosQ0FBUDtBQUNBLFNBQU9MLElBQVA7QUFDRDs7QUFFRCxTQUFTTSx3QkFBVCxDQUFtQ2xELE1BQW5DLEVBQTJDO0FBQ3pDLE1BQUksQ0FBQ0EsTUFBTSxDQUFDbUQsYUFBWixFQUEyQjtBQUN6QixVQUFNLElBQUlDLEtBQUosQ0FBVSwwREFBVixDQUFOO0FBQ0Q7O0FBRUQsTUFBSSxFQUFFcEQsTUFBTSxDQUFDcUQsY0FBUCxJQUF5QnJELE1BQU0sQ0FBQ3NELE9BQWxDLENBQUosRUFBZ0Q7QUFDOUMsVUFBTSxJQUFJRixLQUFKLENBQVUsd0VBQVYsQ0FBTjtBQUNEOztBQUlELFNBQU8sU0FBU0csU0FBVCxDQUFvQkMsR0FBcEIsRUFBeUI7QUFBQ0MsSUFBQUEsUUFBUSxHQUFHQyw0QkFBWjtBQUErQkMsSUFBQUEsY0FBYyxHQUFHO0FBQWhELEdBQXpCLEVBQThFO0FBR25GM0QsSUFBQUEsTUFBTSxDQUFDeUQsUUFBUCxHQUFrQkEsUUFBbEI7QUFFQSxVQUFNRyxVQUFVLEdBQUcsRUFBQyxHQUFHQyxrQkFBSjtBQUFnQixTQUFHRjtBQUFuQixLQUFuQjs7QUFFQSxTQUFLLE1BQU0sQ0FBQ0csSUFBRCxFQUFPQyxPQUFQLENBQVgsSUFBOEJyRSxnQkFBRXNFLE9BQUYsQ0FBVUosVUFBVixDQUE5QixFQUFxRDtBQUNuRCxXQUFLLE1BQU0sQ0FBQ0ssTUFBRCxFQUFTQyxJQUFULENBQVgsSUFBNkJ4RSxnQkFBRXNFLE9BQUYsQ0FBVUQsT0FBVixDQUE3QixFQUFpRDtBQUUvQ0ksUUFBQUEsWUFBWSxDQUFDWCxHQUFELEVBQU1TLE1BQU4sRUFBZSxHQUFFUixRQUFTLEdBQUVLLElBQUssRUFBakMsRUFBb0NJLElBQXBDLEVBQTBDbEUsTUFBMUMsRUFBa0RRLGdCQUFnQixDQUFDMEQsSUFBSSxDQUFDekQsT0FBTixDQUFsRSxDQUFaO0FBQ0Q7QUFDRjtBQUNGLEdBYkQ7QUFjRDs7QUFFRCxTQUFTMEQsWUFBVCxDQUF1QlgsR0FBdkIsRUFBNEJTLE1BQTVCLEVBQW9DSCxJQUFwQyxFQUEwQ0ksSUFBMUMsRUFBZ0RsRSxNQUFoRCxFQUF3RG9FLFNBQXhELEVBQW1FO0FBQ2pFLE1BQUlDLFlBQVksR0FBRyxPQUFPQyxHQUFQLEVBQVl2RCxHQUFaLEtBQW9CO0FBQ3JDLFFBQUlELE9BQU8sR0FBR3dELEdBQUcsQ0FBQ0MsSUFBbEI7QUFDQSxRQUFJQyxXQUFXLEdBQUcsRUFBbEI7QUFDQSxRQUFJQyxVQUFVLEdBQUcsR0FBakI7QUFDQSxRQUFJQyxZQUFKO0FBQ0EsUUFBSUMsZUFBZSxHQUFHNUUsZUFBZSxDQUFDQyxNQUFELEVBQVNzRSxHQUFHLENBQUNsQyxNQUFKLENBQVduQyxTQUFwQixDQUFyQzs7QUFFQSxRQUFJO0FBR0YsVUFBSW1FLFNBQVMsSUFBSSxDQUFDcEUsTUFBTSxDQUFDbUQsYUFBUCxDQUFxQm1CLEdBQUcsQ0FBQ2xDLE1BQUosQ0FBV25DLFNBQWhDLENBQWxCLEVBQThEO0FBQzVELGNBQU0sSUFBSThCLGVBQU82QyxpQkFBWCxFQUFOO0FBQ0Q7O0FBVUQsVUFBSVIsU0FBUyxJQUFJLENBQUNGLElBQUksQ0FBQ1csVUFBbkIsSUFBaUNDLHNCQUFzQixDQUFDOUUsTUFBRCxFQUFTc0UsR0FBVCxFQUFjSixJQUFJLENBQUN6RCxPQUFuQixDQUEzRCxFQUF3RjtBQUN0RixjQUFNc0UsVUFBVSxDQUFDL0UsTUFBRCxFQUFTc0UsR0FBVCxFQUFjdkQsR0FBZCxDQUFoQjtBQUNBO0FBQ0Q7O0FBSUQsVUFBSSxDQUFDbUQsSUFBSSxDQUFDekQsT0FBVixFQUFtQjtBQUNqQixjQUFNLElBQUlzQixlQUFPaUQsbUJBQVgsRUFBTjtBQUNEOztBQUdELFVBQUlkLElBQUksQ0FBQzFCLGFBQUwsSUFBc0IwQixJQUFJLENBQUMxQixhQUFMLENBQW1CdEIsSUFBN0MsRUFBbUQ7QUFDakRKLFFBQUFBLE9BQU8sR0FBR0YsVUFBVSxDQUFDc0QsSUFBSSxDQUFDMUIsYUFBTixFQUFxQjFCLE9BQXJCLENBQXBCO0FBQ0Q7O0FBR0QsVUFBSW9ELElBQUksQ0FBQzFCLGFBQUwsSUFBc0IwQixJQUFJLENBQUMxQixhQUFMLENBQW1CcEIsTUFBN0MsRUFBcUQ7QUFDbkROLFFBQUFBLE9BQU8sR0FBR0ssWUFBWSxDQUFDK0MsSUFBSSxDQUFDMUIsYUFBTixFQUFxQjFCLE9BQXJCLENBQXRCO0FBQ0Q7O0FBRUQsVUFBSW9ELElBQUksQ0FBQ3pELE9BQUwsS0FBaUJ0QixzQkFBckIsRUFBNkM7QUFHM0N3RixRQUFBQSxlQUFlLEdBQUdyRixpQkFBaUIsQ0FBQyxHQUFHZ0QsUUFBUSxDQUFDZ0MsR0FBRyxDQUFDbEMsTUFBTCxFQUFhdEIsT0FBYixFQUFzQm9ELElBQUksQ0FBQzFCLGFBQUwsSUFBc0IsRUFBNUMsQ0FBWixDQUFuQztBQUNEOztBQUdEbkIsTUFBQUEsV0FBVyxDQUFDNkMsSUFBSSxDQUFDMUIsYUFBTixFQUFxQjFCLE9BQXJCLEVBQThCNkQsZUFBOUIsQ0FBWDtBQUlBLFVBQUkvQixJQUFJLEdBQUdOLFFBQVEsQ0FBQ2dDLEdBQUcsQ0FBQ2xDLE1BQUwsRUFBYXRCLE9BQWIsRUFBc0JvRCxJQUFJLENBQUMxQixhQUFMLElBQXNCLEVBQTVDLEVBQWdEbUMsZUFBaEQsQ0FBbkI7QUFDQSxVQUFJTSxTQUFKOztBQUVBLFVBQUlDLHVCQUFXaEIsSUFBSSxDQUFDekQsT0FBaEIsQ0FBSixFQUE4QjtBQUM1QnlFLCtCQUFXaEIsSUFBSSxDQUFDekQsT0FBaEIsRUFBeUIsR0FBR21DLElBQTVCO0FBQ0Q7O0FBR0R0Qyw2QkFBZTZFLFNBQWYsQ0FBeUJiLEdBQUcsQ0FBQ2xDLE1BQUosQ0FBV25DLFNBQXBDLEVBQStDMEUsZUFBL0MsRUFBZ0VTLEtBQWhFLENBQXVFLFVBQUQsR0FDbkUsR0FBRXBGLE1BQU0sQ0FBQ3FGLFdBQVAsQ0FBbUJDLElBQUssSUFBR3BCLElBQUksQ0FBQ3pELE9BQVEsZ0JBRHlCLEdBRXBFZixnQkFBRTZGLFFBQUYsQ0FBV0MsSUFBSSxDQUFDQyxTQUFMLENBQWU3QyxJQUFmLENBQVgsRUFBaUM7QUFBQ1gsUUFBQUEsTUFBTSxFQUFFeUQ7QUFBVCxPQUFqQyxDQUZGOztBQUlBLFVBQUkxRixNQUFNLENBQUNxRCxjQUFYLEVBQTJCO0FBQ3pCNEIsUUFBQUEsU0FBUyxHQUFHLE1BQU1qRixNQUFNLENBQUNxRCxjQUFQLENBQXNCYSxJQUFJLENBQUN6RCxPQUEzQixFQUFvQyxHQUFHbUMsSUFBdkMsQ0FBbEI7QUFDRCxPQUZELE1BRU87QUFDTHFDLFFBQUFBLFNBQVMsR0FBRyxNQUFNakYsTUFBTSxDQUFDc0QsT0FBUCxDQUFlWSxJQUFJLENBQUN6RCxPQUFwQixFQUE2QixHQUFHbUMsSUFBaEMsQ0FBbEI7QUFDRDs7QUFHRCtCLE1BQUFBLGVBQWUsR0FBRzVFLGVBQWUsQ0FBQ0MsTUFBRCxFQUFTc0UsR0FBRyxDQUFDbEMsTUFBSixDQUFXbkMsU0FBcEIsQ0FBZixJQUFpRDBFLGVBQW5FOztBQUlBLFVBQUlqRixnQkFBRUMsYUFBRixDQUFnQnNGLFNBQWhCLEtBQThCdkYsZ0JBQUVpRyxHQUFGLENBQU1WLFNBQU4sRUFBaUIsVUFBakIsQ0FBbEMsRUFBZ0U7QUFDOUROLFFBQUFBLGVBQWUsR0FBR00sU0FBUyxDQUFDNUUsUUFBVixJQUFzQnNFLGVBQXhDOztBQUNBLFlBQUlNLFNBQVMsQ0FBQ1csS0FBZCxFQUFxQjtBQUNuQixnQkFBTVgsU0FBUyxDQUFDVyxLQUFoQjtBQUNEOztBQUNEWCxRQUFBQSxTQUFTLEdBQUdBLFNBQVMsQ0FBQ1ksS0FBdEI7QUFDRDs7QUFHRCxVQUFJM0IsSUFBSSxDQUFDekQsT0FBTCxLQUFpQnRCLHNCQUFyQixFQUE2QztBQUMzQ3VGLFFBQUFBLFlBQVksR0FBR08sU0FBUyxDQUFDLENBQUQsQ0FBeEI7O0FBQ0EzRSwrQkFBZXdGLFVBQWYsQ0FBMEJwQixZQUExQixFQUF3Q0MsZUFBeEM7O0FBQ0FyRSwrQkFBZTZFLFNBQWYsQ0FBeUJULFlBQXpCLEVBQXVDQyxlQUF2QyxFQUNHUyxLQURILENBQ1UsOEJBQTZCVCxlQUFnQix5QkFBd0JELFlBQWEsRUFENUY7O0FBRUEsWUFBSUMsZUFBZSxLQUFLL0UscUJBQVVFLE9BQWxDLEVBQTJDO0FBQ3pDbUYsVUFBQUEsU0FBUyxHQUFHQSxTQUFTLENBQUMsQ0FBRCxDQUFyQjtBQUNELFNBRkQsTUFFTyxJQUFJTixlQUFlLEtBQUsvRSxxQkFBVUMsR0FBbEMsRUFBdUM7QUFDNUNvRixVQUFBQSxTQUFTLEdBQUc7QUFDVnhGLFlBQUFBLFlBQVksRUFBRXdGLFNBQVMsQ0FBQyxDQUFEO0FBRGIsV0FBWjtBQUdEO0FBQ0Y7O0FBRURBLE1BQUFBLFNBQVMsR0FBRyxrQ0FBb0JBLFNBQXBCLENBQVo7O0FBR0EsVUFBSWYsSUFBSSxDQUFDekQsT0FBTCxLQUFpQnJCLHNCQUFyQixFQUE2QztBQUMzQ2tCLCtCQUFlNkUsU0FBZixDQUF5QmIsR0FBRyxDQUFDbEMsTUFBSixDQUFXbkMsU0FBcEMsRUFBK0MwRSxlQUEvQyxFQUNHUyxLQURILENBQ1Usc0JBQXFCMUYsZ0JBQUU2RixRQUFGLENBQVdDLElBQUksQ0FBQ0MsU0FBTCxDQUFlUixTQUFmLENBQVgsRUFBc0M7QUFBQ2hELFVBQUFBLE1BQU0sRUFBRXlEO0FBQVQsU0FBdEMsQ0FBcUUsRUFEcEc7O0FBRUFwRiwrQkFBZTZFLFNBQWYsQ0FBeUJiLEdBQUcsQ0FBQ2xDLE1BQUosQ0FBV25DLFNBQXBDLEVBQStDMEUsZUFBL0MsRUFBZ0VTLEtBQWhFLENBQXNFLHdDQUF0RTs7QUFDQUgsUUFBQUEsU0FBUyxHQUFHLElBQVo7QUFDRDs7QUFHRCxVQUFJYyxjQUFLQyxRQUFMLENBQWNmLFNBQWQsQ0FBSixFQUE4QjtBQUM1QixZQUFJYyxjQUFLQyxRQUFMLENBQWNmLFNBQVMsQ0FBQ2dCLE1BQXhCLEtBQW1DLENBQUNDLEtBQUssQ0FBQ2pCLFNBQVMsQ0FBQ2dCLE1BQVgsQ0FBekMsSUFBK0RFLFFBQVEsQ0FBQ2xCLFNBQVMsQ0FBQ2dCLE1BQVgsRUFBbUIsRUFBbkIsQ0FBUixLQUFtQyxDQUF0RyxFQUF5RztBQUN2RyxnQkFBTSx3Q0FBMkJoQixTQUFTLENBQUNnQixNQUFyQyxFQUE2Q2hCLFNBQVMsQ0FBQ1ksS0FBdkQsQ0FBTjtBQUNELFNBRkQsTUFFTyxJQUFJbkcsZ0JBQUVDLGFBQUYsQ0FBZ0JzRixTQUFTLENBQUNZLEtBQTFCLEtBQW9DWixTQUFTLENBQUNZLEtBQVYsQ0FBZ0JELEtBQXhELEVBQStEO0FBQ3BFLGdCQUFNLGtDQUFxQlgsU0FBUyxDQUFDWSxLQUFWLENBQWdCRCxLQUFyQyxFQUE0Q1gsU0FBUyxDQUFDWSxLQUFWLENBQWdCL0QsT0FBNUQsRUFBcUVtRCxTQUFTLENBQUNZLEtBQVYsQ0FBZ0JPLFVBQXJGLENBQU47QUFDRDtBQUNGOztBQUVENUIsTUFBQUEsV0FBVyxDQUFDcUIsS0FBWixHQUFvQlosU0FBcEI7O0FBQ0EzRSw2QkFBZTZFLFNBQWYsQ0FBeUJiLEdBQUcsQ0FBQ2xDLE1BQUosQ0FBV25DLFNBQVgsSUFBd0J5RSxZQUFqRCxFQUErREMsZUFBL0QsRUFBZ0ZTLEtBQWhGLENBQXVGLGFBQUQsR0FDbkYseUJBQXdCbEIsSUFBSSxDQUFDekQsT0FBUSxjQUFhZixnQkFBRTZGLFFBQUYsQ0FBV0MsSUFBSSxDQUFDQyxTQUFMLENBQWVSLFNBQWYsQ0FBWCxFQUFzQztBQUFDaEQsUUFBQUEsTUFBTSxFQUFFeUQ7QUFBVCxPQUF0QyxDQUFxRSxFQUQxSDs7QUFHQSxVQUFJeEIsSUFBSSxDQUFDekQsT0FBTCxLQUFpQnJCLHNCQUFyQixFQUE2QztBQUkzQ2tCLCtCQUFlK0YsV0FBZixDQUEyQi9CLEdBQUcsQ0FBQ2xDLE1BQUosQ0FBV25DLFNBQXRDO0FBQ0Q7QUFDRixLQTFIRCxDQTBIRSxPQUFPcUcsR0FBUCxFQUFZO0FBR1osVUFBSUMsU0FBUyxHQUFHRCxHQUFoQjtBQUVBM0IsTUFBQUEsZUFBZSxHQUFHQSxlQUFlLElBQUk1RSxlQUFlLENBQUNDLE1BQUQsRUFBU3NFLEdBQUcsQ0FBQ2xDLE1BQUosQ0FBV25DLFNBQVgsSUFBd0J5RSxZQUFqQyxDQUFwRDtBQUVBLFVBQUk4QixNQUFNLEdBQUdGLEdBQUcsQ0FBQ0YsVUFBSixJQUFrQkUsR0FBRyxDQUFDRyxLQUFuQzs7QUFDQSxVQUFJLENBQUMvRyxnQkFBRWdCLFFBQUYsQ0FBVzhGLE1BQVgsRUFBbUJGLEdBQUcsQ0FBQ3hFLE9BQXZCLENBQUwsRUFBc0M7QUFHcEMwRSxRQUFBQSxNQUFNLEdBQUksR0FBRUYsR0FBRyxDQUFDeEUsT0FBUSxHQUFFMEUsTUFBTSxHQUFJLE9BQU9BLE1BQVgsR0FBcUIsRUFBRyxFQUF4RDtBQUNEOztBQUNELFVBQUkseUJBQVlGLEdBQVosRUFBaUJ2RSxlQUFPMkUsaUJBQXhCLENBQUosRUFBZ0Q7QUFDOUNILFFBQUFBLFNBQVMsR0FBR0QsR0FBRyxDQUFDSyxjQUFKLEVBQVo7QUFDRCxPQUZELE1BRU87QUFDTHJHLCtCQUFlNkUsU0FBZixDQUF5QmIsR0FBRyxDQUFDbEMsTUFBSixDQUFXbkMsU0FBWCxJQUF3QnlFLFlBQWpELEVBQStEQyxlQUEvRCxFQUNHUyxLQURILENBQ1UsK0NBQThDb0IsTUFBTyxFQUQvRDtBQUVEOztBQUVELFVBQUk3QixlQUFlLEtBQUsvRSxxQkFBVUMsR0FBbEMsRUFBdUM7QUFDckMsU0FBQzRFLFVBQUQsRUFBYUQsV0FBYixJQUE0QixvQ0FBdUIrQixTQUF2QixDQUE1QjtBQUNELE9BRkQsTUFFTyxJQUFJNUIsZUFBZSxLQUFLL0UscUJBQVVFLE9BQWxDLEVBQTJDO0FBQ2hELFNBQUMyRSxVQUFELEVBQWFELFdBQWIsSUFBNEIsdUNBQTBCK0IsU0FBMUIsQ0FBNUI7QUFDRCxPQUZNLE1BRUE7QUFHTCxZQUFJSyxTQUFTLEdBQUcsdUNBQTBCTCxTQUExQixDQUFoQjtBQUNBLFlBQUlNLE1BQU0sR0FBRyxvQ0FBdUJOLFNBQXZCLENBQWI7QUFFQS9CLFFBQUFBLFdBQVcsR0FBRyxFQUNaLEdBQUdvQyxTQUFTLENBQUMsQ0FBRCxDQURBO0FBRVosYUFBR0MsTUFBTSxDQUFDLENBQUQ7QUFGRyxTQUFkO0FBTUFwQyxRQUFBQSxVQUFVLEdBQUdtQyxTQUFTLENBQUMsQ0FBRCxDQUF0QjtBQUNEO0FBQ0Y7O0FBR0QsUUFBSWxILGdCQUFFb0gsUUFBRixDQUFXdEMsV0FBWCxDQUFKLEVBQTZCO0FBQzNCekQsTUFBQUEsR0FBRyxDQUFDa0YsTUFBSixDQUFXeEIsVUFBWCxFQUF1QnNDLElBQXZCLENBQTRCdkMsV0FBNUI7QUFDRCxLQUZELE1BRU87QUFDTCxVQUFJRSxZQUFKLEVBQWtCO0FBQ2hCLFlBQUlDLGVBQWUsS0FBSy9FLHFCQUFVQyxHQUFsQyxFQUF1QztBQUNyQzJFLFVBQUFBLFdBQVcsQ0FBQ3FCLEtBQVosQ0FBa0I1RixTQUFsQixHQUE4QnlFLFlBQTlCO0FBQ0QsU0FGRCxNQUVPO0FBQ0xGLFVBQUFBLFdBQVcsQ0FBQ3ZFLFNBQVosR0FBd0J5RSxZQUF4QjtBQUNEO0FBQ0YsT0FORCxNQU1PO0FBQ0xGLFFBQUFBLFdBQVcsQ0FBQ3ZFLFNBQVosR0FBd0JxRSxHQUFHLENBQUNsQyxNQUFKLENBQVduQyxTQUFYLElBQXdCLElBQWhEO0FBQ0Q7O0FBRUQsVUFBSTBFLGVBQWUsS0FBSy9FLHFCQUFVQyxHQUFsQyxFQUF1QztBQUNyQyxlQUFPMkUsV0FBVyxDQUFDdkUsU0FBbkI7QUFDRDs7QUFFRHVFLE1BQUFBLFdBQVcsR0FBRywyQkFBYUEsV0FBYixFQUEwQkMsVUFBMUIsRUFBc0NFLGVBQXRDLENBQWQ7QUFDQTVELE1BQUFBLEdBQUcsQ0FBQ2tGLE1BQUosQ0FBV3hCLFVBQVgsRUFBdUJ1QyxJQUF2QixDQUE0QnhDLFdBQTVCO0FBQ0Q7QUFDRixHQTlMRDs7QUFnTUFoQixFQUFBQSxHQUFHLENBQUNTLE1BQU0sQ0FBQ2dELFdBQVAsRUFBRCxDQUFILENBQTBCbkQsSUFBMUIsRUFBZ0MsQ0FBQ1EsR0FBRCxFQUFNdkQsR0FBTixLQUFjO0FBQzVDbUcsc0JBQUVDLE9BQUYsQ0FBVTlDLFlBQVksQ0FBQ0MsR0FBRCxFQUFNdkQsR0FBTixDQUF0QixFQUFrQ3FHLElBQWxDO0FBQ0QsR0FGRDtBQUdEOztBQUVELFNBQVN0QyxzQkFBVCxDQUFpQzlFLE1BQWpDLEVBQXlDc0UsR0FBekMsRUFBOEM3RCxPQUE5QyxFQUF1RDtBQUVyRCxNQUFJLENBQUNULE1BQU0sQ0FBQ3FILFdBQVAsQ0FBbUIvQyxHQUFHLENBQUNsQyxNQUFKLENBQVduQyxTQUE5QixDQUFMLEVBQStDO0FBQzdDLFdBQU8sS0FBUDtBQUNEOztBQUlELE1BQUlRLE9BQU8sS0FBSyxlQUFoQixFQUFpQztBQUMvQixXQUFPLEtBQVA7QUFDRDs7QUFJRCxNQUFJVCxNQUFNLENBQUNzSCxtQkFBUCxDQUEyQmhELEdBQUcsQ0FBQ2xDLE1BQUosQ0FBV25DLFNBQXRDLEVBQWlEcUUsR0FBRyxDQUFDTCxNQUFyRCxFQUE2REssR0FBRyxDQUFDaUQsV0FBakUsRUFBOEVqRCxHQUFHLENBQUNDLElBQWxGLENBQUosRUFBNkY7QUFDM0YsV0FBTyxLQUFQO0FBQ0Q7O0FBRUQsU0FBTyxJQUFQO0FBQ0Q7O0FBRUQsZUFBZVEsVUFBZixDQUEyQi9FLE1BQTNCLEVBQW1Dc0UsR0FBbkMsRUFBd0N2RCxHQUF4QyxFQUE2QztBQUMzQ1QseUJBQWU2RSxTQUFmLENBQXlCYixHQUFHLENBQUNsQyxNQUFKLENBQVduQyxTQUFwQyxFQUErQ0YsZUFBZSxDQUFDQyxNQUFELEVBQVNzRSxHQUFHLENBQUNsQyxNQUFKLENBQVduQyxTQUFwQixDQUE5RCxFQUNHdUgsSUFESCxDQUNRLHdEQURSOztBQUlBLE1BQUksQ0FBQ3hILE1BQU0sQ0FBQ3lILFFBQVAsQ0FBZ0JuRCxHQUFHLENBQUNsQyxNQUFKLENBQVduQyxTQUEzQixDQUFMLEVBQTRDO0FBQzFDLFVBQU0sSUFBSW1ELEtBQUosQ0FBVSxrRUFBVixDQUFOO0FBQ0Q7O0FBQ0QsTUFBSTtBQUNGLFVBQU1zRSxVQUFVLEdBQUcsTUFBTTFILE1BQU0sQ0FBQ3FELGNBQVAsQ0FBc0IsYUFBdEIsRUFBcUNpQixHQUFyQyxFQUEwQ3ZELEdBQTFDLEVBQStDdUQsR0FBRyxDQUFDbEMsTUFBSixDQUFXbkMsU0FBMUQsQ0FBekI7QUFDQSxRQUFJeUgsVUFBVSxJQUFJQSxVQUFVLENBQUM5QixLQUE3QixFQUFvQyxNQUFNOEIsVUFBVSxDQUFDOUIsS0FBakI7QUFDckMsR0FIRCxDQUdFLE9BQU9VLEdBQVAsRUFBWTtBQUNaLFFBQUkseUJBQVlBLEdBQVosRUFBaUJ2RSxlQUFPMkUsaUJBQXhCLENBQUosRUFBZ0Q7QUFDOUMsWUFBTUosR0FBTjtBQUNELEtBRkQsTUFFTztBQUNMLFlBQU0sSUFBSWxELEtBQUosQ0FBVyxpQ0FBZ0NrRCxHQUFHLENBQUN4RSxPQUFRLEVBQXZELENBQU47QUFDRDtBQUNGO0FBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgdXRpbCB9IGZyb20gJ0BhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgeyB2YWxpZGF0b3JzIH0gZnJvbSAnLi92YWxpZGF0b3JzJztcbmltcG9ydCB7XG4gIGVycm9ycywgaXNFcnJvclR5cGUsIGdldFJlc3BvbnNlRm9yVzNDRXJyb3IsIGdldFJlc3BvbnNlRm9ySnNvbndwRXJyb3IsXG4gIGVycm9yRnJvbU1KU09OV1BTdGF0dXNDb2RlLCBlcnJvckZyb21XM0NKc29uQ29kZSxcbn0gZnJvbSAnLi9lcnJvcnMnO1xuaW1wb3J0IHsgTUVUSE9EX01BUCwgTk9fU0VTU0lPTl9JRF9DT01NQU5EUyB9IGZyb20gJy4vcm91dGVzJztcbmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcbmltcG9ydCB7XG4gIGZvcm1hdFJlc3BvbnNlVmFsdWUsIGZvcm1hdFN0YXR1cyxcbn0gZnJvbSAnLi9oZWxwZXJzJztcbmltcG9ydCB7IE1BWF9MT0dfQk9EWV9MRU5HVEgsIFBST1RPQ09MUywgREVGQVVMVF9CQVNFX1BBVEggfSBmcm9tICcuLi9jb25zdGFudHMnO1xuaW1wb3J0IFNFU1NJT05TX0NBQ0hFIGZyb20gJy4vc2Vzc2lvbnMtY2FjaGUnO1xuXG5cbmNvbnN0IENSRUFURV9TRVNTSU9OX0NPTU1BTkQgPSAnY3JlYXRlU2Vzc2lvbic7XG5jb25zdCBERUxFVEVfU0VTU0lPTl9DT01NQU5EID0gJ2RlbGV0ZVNlc3Npb24nO1xuXG5jbGFzcyBQcm90b2NvbCB7fVxuXG5mdW5jdGlvbiBkZXRlcm1pbmVQcm90b2NvbCAoZGVzaXJlZENhcGFiaWxpdGllcywgcmVxdWlyZWRDYXBhYmlsaXRpZXMsIGNhcGFiaWxpdGllcykge1xuICByZXR1cm4gXy5pc1BsYWluT2JqZWN0KGNhcGFiaWxpdGllcykgP1xuICAgIFBST1RPQ09MUy5XM0MgOlxuICAgIFBST1RPQ09MUy5NSlNPTldQO1xufVxuXG5mdW5jdGlvbiBleHRyYWN0UHJvdG9jb2wgKGRyaXZlciwgc2Vzc2lvbklkID0gbnVsbCkge1xuICBjb25zdCBkc3REcml2ZXIgPSBfLmlzRnVuY3Rpb24oZHJpdmVyLmRyaXZlckZvclNlc3Npb24pXG4gICAgPyBkcml2ZXIuZHJpdmVyRm9yU2Vzc2lvbihzZXNzaW9uSWQpXG4gICAgOiBkcml2ZXI7XG4gIGlmIChkc3REcml2ZXIgPT09IGRyaXZlcikge1xuICAgIC8vIFNob3J0Y2lyY3VpdCBpZiB0aGUgZHJpdmVyIGluc3RhbmNlIGlzIG5vdCBhbiB1bWJyZWxsYSBkcml2ZXJcbiAgICAvLyBvciBpdCBpcyBGYWtlIGRyaXZlciBpbnN0YW5jZSwgd2hlcmUgYGRyaXZlci5kcml2ZXJGb3JTZXNzaW9uYFxuICAgIC8vIGFsd2F5cyByZXR1cm5zIHNlbGYgaW5zdGFuY2VcbiAgICByZXR1cm4gZHJpdmVyLnByb3RvY29sO1xuICB9XG5cbiAgLy8gRXh0cmFjdCB0aGUgcHJvdG9jb2wgZm9yIHRoZSBjdXJyZW50IHNlc3Npb24gaWYgdGhlIGdpdmVuIGRyaXZlciBpcyB0aGUgdW1icmVsbGEgb25lXG4gIHJldHVybiBkc3REcml2ZXIgPyBkc3REcml2ZXIucHJvdG9jb2wgOiBTRVNTSU9OU19DQUNIRS5nZXRQcm90b2NvbChzZXNzaW9uSWQpO1xufVxuXG5mdW5jdGlvbiBpc1Nlc3Npb25Db21tYW5kIChjb21tYW5kKSB7XG4gIHJldHVybiAhXy5pbmNsdWRlcyhOT19TRVNTSU9OX0lEX0NPTU1BTkRTLCBjb21tYW5kKTtcbn1cblxuZnVuY3Rpb24gd3JhcFBhcmFtcyAocGFyYW1TZXRzLCBqc29uT2JqKSB7XG4gIC8qIFRoZXJlIGFyZSBjb21tYW5kcyBsaWtlIHBlcmZvcm1Ub3VjaCB3aGljaCB0YWtlIGEgc2luZ2xlIHBhcmFtZXRlciAocHJpbWl0aXZlIHR5cGUgb3IgYXJyYXkpLlxuICAgKiBTb21lIGRyaXZlcnMgY2hvb3NlIHRvIHBhc3MgdGhpcyBwYXJhbWV0ZXIgYXMgYSB2YWx1ZSAoZWcuIFthY3Rpb24xLCBhY3Rpb24yLi4uXSkgd2hpbGUgb3RoZXJzIHRvXG4gICAqIHdyYXAgaXQgd2l0aGluIGFuIG9iamVjdChlZycge2dlc3R1cmU6ICBbYWN0aW9uMSwgYWN0aW9uMi4uLl19KSwgd2hpY2ggbWFrZXMgaXQgaGFyZCB0byB2YWxpZGF0ZS5cbiAgICogVGhlIHdyYXAgb3B0aW9uIGluIHRoZSBzcGVjIGVuZm9yY2Ugd3JhcHBpbmcgYmVmb3JlIHZhbGlkYXRpb24sIHNvIHRoYXQgYWxsIHBhcmFtcyBhcmUgd3JhcHBlZCBhdFxuICAgKiB0aGUgdGltZSB0aGV5IGFyZSB2YWxpZGF0ZWQgYW5kIGxhdGVyIHBhc3NlZCB0byB0aGUgY29tbWFuZHMuXG4gICAqL1xuICBsZXQgcmVzID0ganNvbk9iajtcbiAgaWYgKF8uaXNBcnJheShqc29uT2JqKSB8fCAhXy5pc09iamVjdChqc29uT2JqKSkge1xuICAgIHJlcyA9IHt9O1xuICAgIHJlc1twYXJhbVNldHMud3JhcF0gPSBqc29uT2JqO1xuICB9XG4gIHJldHVybiByZXM7XG59XG5cbmZ1bmN0aW9uIHVud3JhcFBhcmFtcyAocGFyYW1TZXRzLCBqc29uT2JqKSB7XG4gIC8qIFRoZXJlIGFyZSBjb21tYW5kcyBsaWtlIHNldE5ldHdvcmtDb25uZWN0aW9uIHdoaWNoIHNlbmQgcGFyYW1ldGVycyB3cmFwcGVkIGluc2lkZSBhIGtleSBzdWNoIGFzXG4gICAqIFwicGFyYW1ldGVyc1wiLiBUaGlzIGZ1bmN0aW9uIHVud3JhcHMgdGhlbSAoZWcuIHtcInBhcmFtZXRlcnNcIjoge1widHlwZVwiOiAxfX0gYmVjb21lcyB7XCJ0eXBlXCI6IDF9KS5cbiAgICovXG4gIGxldCByZXMgPSBqc29uT2JqO1xuICBpZiAoXy5pc09iamVjdChqc29uT2JqKSkge1xuICAgIC8vIHNvbWUgY2xpZW50cywgbGlrZSBydWJ5LCBkb24ndCB3cmFwXG4gICAgaWYgKGpzb25PYmpbcGFyYW1TZXRzLnVud3JhcF0pIHtcbiAgICAgIHJlcyA9IGpzb25PYmpbcGFyYW1TZXRzLnVud3JhcF07XG4gICAgfVxuICB9XG4gIHJldHVybiByZXM7XG59XG5cbmZ1bmN0aW9uIGNoZWNrUGFyYW1zIChwYXJhbVNldHMsIGpzb25PYmosIHByb3RvY29sKSB7XG4gIGxldCByZXF1aXJlZFBhcmFtcyA9IFtdO1xuICBsZXQgb3B0aW9uYWxQYXJhbXMgPSBbXTtcbiAgbGV0IHJlY2VpdmVkUGFyYW1zID0gXy5rZXlzKGpzb25PYmopO1xuXG4gIGlmIChwYXJhbVNldHMpIHtcbiAgICBpZiAocGFyYW1TZXRzLnJlcXVpcmVkKSB7XG4gICAgICAvLyB3ZSBtaWdodCBoYXZlIGFuIGFycmF5IG9mIHBhcmFtZXRlcnMsXG4gICAgICAvLyBvciBhbiBhcnJheSBvZiBhcnJheXMgb2YgcGFyYW1ldGVycywgc28gc3RhbmRhcmRpemVcbiAgICAgIGlmICghXy5pc0FycmF5KF8uZmlyc3QocGFyYW1TZXRzLnJlcXVpcmVkKSkpIHtcbiAgICAgICAgcmVxdWlyZWRQYXJhbXMgPSBbcGFyYW1TZXRzLnJlcXVpcmVkXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlcXVpcmVkUGFyYW1zID0gcGFyYW1TZXRzLnJlcXVpcmVkO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBvcHRpb25hbCBwYXJhbWV0ZXJzIGFyZSBqdXN0IGFuIGFycmF5XG4gICAgaWYgKHBhcmFtU2V0cy5vcHRpb25hbCkge1xuICAgICAgb3B0aW9uYWxQYXJhbXMgPSBwYXJhbVNldHMub3B0aW9uYWw7XG4gICAgfVxuXG4gICAgLy8gSWYgYSBmdW5jdGlvbiB3YXMgcHJvdmlkZWQgYXMgdGhlICd2YWxpZGF0ZScga2V5LCBpdCB3aWxsIGhlcmUgYmUgY2FsbGVkIHdpdGhcbiAgICAvLyBqc29uT2JqIGFzIHRoZSBwYXJhbS4gSWYgaXQgcmV0dXJucyBzb21ldGhpbmcgZmFsc3ksIHZlcmlmaWNhdGlvbiB3aWxsIGJlXG4gICAgLy8gY29uc2lkZXJlZCB0byBoYXZlIHBhc3NlZC4gSWYgaXQgcmV0dXJucyBzb21ldGhpbmcgZWxzZSwgdGhhdCB3aWxsIGJlIHRoZVxuICAgIC8vIGFyZ3VtZW50IHRvIGFuIGVycm9yIHdoaWNoIGlzIHRocm93biB0byB0aGUgdXNlclxuICAgIGlmIChwYXJhbVNldHMudmFsaWRhdGUpIHtcbiAgICAgIGxldCBtZXNzYWdlID0gcGFyYW1TZXRzLnZhbGlkYXRlKGpzb25PYmosIHByb3RvY29sKTtcbiAgICAgIGlmIChtZXNzYWdlKSB7XG4gICAgICAgIHRocm93IG5ldyBlcnJvcnMuQmFkUGFyYW1ldGVyc0Vycm9yKG1lc3NhZ2UsIGpzb25PYmopO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIGlmIHdlIGhhdmUgbm8gcmVxdWlyZWQgcGFyYW1ldGVycywgYWxsIGlzIHdlbGxcbiAgaWYgKHJlcXVpcmVkUGFyYW1zLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIHNvbWUgY2xpZW50cyBwYXNzIGluIHRoZSBzZXNzaW9uIGlkIGluIHRoZSBwYXJhbXNcbiAgaWYgKG9wdGlvbmFsUGFyYW1zLmluZGV4T2YoJ3Nlc3Npb25JZCcpID09PSAtMSkge1xuICAgIG9wdGlvbmFsUGFyYW1zLnB1c2goJ3Nlc3Npb25JZCcpO1xuICB9XG5cbiAgLy8gc29tZSBjbGllbnRzIHBhc3MgaW4gYW4gZWxlbWVudCBpZCBpbiB0aGUgcGFyYW1zXG4gIGlmIChvcHRpb25hbFBhcmFtcy5pbmRleE9mKCdpZCcpID09PSAtMSkge1xuICAgIG9wdGlvbmFsUGFyYW1zLnB1c2goJ2lkJyk7XG4gIH1cblxuICAvLyBnbyB0aHJvdWdoIHRoZSByZXF1aXJlZCBwYXJhbWV0ZXJzIGFuZCBjaGVjayBhZ2FpbnN0IG91ciBhcmd1bWVudHNcbiAgZm9yIChsZXQgcGFyYW1zIG9mIHJlcXVpcmVkUGFyYW1zKSB7XG4gICAgaWYgKF8uZGlmZmVyZW5jZShyZWNlaXZlZFBhcmFtcywgcGFyYW1zLCBvcHRpb25hbFBhcmFtcykubGVuZ3RoID09PSAwICYmXG4gICAgICAgIF8uZGlmZmVyZW5jZShwYXJhbXMsIHJlY2VpdmVkUGFyYW1zKS5sZW5ndGggPT09IDApIHtcbiAgICAgIC8vIHdlIGhhdmUgYSBzZXQgb2YgcGFyYW1ldGVycyB0aGF0IGlzIGNvcnJlY3RcbiAgICAgIC8vIHNvIHNob3J0LWNpcmN1aXRcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cbiAgdGhyb3cgbmV3IGVycm9ycy5CYWRQYXJhbWV0ZXJzRXJyb3IocGFyYW1TZXRzLCByZWNlaXZlZFBhcmFtcyk7XG59XG5cbi8qXG4gKiBUaGlzIG1ldGhvZCB0YWtlcyAzIHBpZWNlcyBvZiBkYXRhOiByZXF1ZXN0IHBhcmFtZXRlcnMgKCdyZXF1ZXN0UGFyYW1zJyksXG4gKiBhIHJlcXVlc3QgSlNPTiBib2R5ICgnanNvbk9iaicpLCBhbmQgJ3BheWxvYWRQYXJhbXMnLCB3aGljaCBpcyB0aGUgc2VjdGlvblxuICogZnJvbSB0aGUgcm91dGUgZGVmaW5pdGlvbiBmb3IgYSBwYXJ0aWN1bGFyIGVuZHBvaW50IHdoaWNoIGhhcyBpbnN0cnVjdGlvbnNcbiAqIG9uIGhhbmRsaW5nIHBhcmFtZXRlcnMuIFRoaXMgbWV0aG9kIHJldHVybnMgYW4gYXJyYXkgb2YgYXJndW1lbnRzIHdoaWNoIHdpbGxcbiAqIGJlIGFwcGxpZWQgdG8gYSBjb21tYW5kLlxuICovXG5mdW5jdGlvbiBtYWtlQXJncyAocmVxdWVzdFBhcmFtcywganNvbk9iaiwgcGF5bG9hZFBhcmFtcywgcHJvdG9jb2wpIHtcbiAgLy8gV2Ugd2FudCB0byBwYXNzIHRoZSBcInVybFwiIHBhcmFtZXRlcnMgdG8gdGhlIGNvbW1hbmRzIGluIHJldmVyc2Ugb3JkZXJcbiAgLy8gc2luY2UgdGhlIGNvbW1hbmQgd2lsbCBzb21ldGltZXMgd2FudCB0byBpZ25vcmUsIHNheSwgdGhlIHNlc3Npb25JZC5cbiAgLy8gVGhpcyBoYXMgdGhlIGVmZmVjdCBvZiBwdXR0aW5nIHNlc3Npb25JZCBsYXN0LCB3aGljaCBtZWFucyBpbiBKUyB3ZSBjYW5cbiAgLy8gb21pdCBpdCBmcm9tIHRoZSBmdW5jdGlvbiBzaWduYXR1cmUgaWYgd2UncmUgbm90IGdvaW5nIHRvIHVzZSBpdC5cbiAgbGV0IHVybFBhcmFtcyA9IF8ua2V5cyhyZXF1ZXN0UGFyYW1zKS5yZXZlcnNlKCk7XG5cbiAgLy8gSW4gdGhlIHNpbXBsZSBjYXNlLCB0aGUgcmVxdWlyZWQgcGFyYW1ldGVycyBhcmUgYSBiYXNpYyBhcnJheSBpblxuICAvLyBwYXlsb2FkUGFyYW1zLnJlcXVpcmVkLCBzbyBzdGFydCB0aGVyZS4gSXQncyBwb3NzaWJsZSB0aGF0IHRoZXJlIGFyZVxuICAvLyBtdWx0aXBsZSBvcHRpb25hbCBzZXRzIG9mIHJlcXVpcmVkIHBhcmFtcywgdGhvdWdoLCBzbyBoYW5kbGUgdGhhdCBjYXNlXG4gIC8vIHRvby5cbiAgbGV0IHJlcXVpcmVkUGFyYW1zID0gcGF5bG9hZFBhcmFtcy5yZXF1aXJlZDtcbiAgaWYgKF8uaXNBcnJheShfLmZpcnN0KHBheWxvYWRQYXJhbXMucmVxdWlyZWQpKSkge1xuICAgIC8vIElmIHRoZXJlIGFyZSBvcHRpb25hbCBzZXRzIG9mIHJlcXVpcmVkIHBhcmFtcywgdGhlbiB3ZSB3aWxsIGhhdmUgYW5cbiAgICAvLyBhcnJheSBvZiBhcnJheXMgaW4gcGF5bG9hZFBhcmFtcy5yZXF1aXJlZCwgc28gbG9vcCB0aHJvdWdoIGVhY2ggc2V0IGFuZFxuICAgIC8vIHBpY2sgdGhlIG9uZSB0aGF0IG1hdGNoZXMgd2hpY2ggSlNPTiBwYXJhbXMgd2VyZSBhY3R1YWxseSBzZW50LiBXZSd2ZVxuICAgIC8vIGFscmVhZHkgYmVlbiB0aHJvdWdoIHZhbGlkYXRpb24gc28gd2UncmUgZ3VhcmFudGVlZCB0byBmaW5kIGEgbWF0Y2guXG4gICAgbGV0IGtleXMgPSBfLmtleXMoanNvbk9iaik7XG4gICAgZm9yIChsZXQgcGFyYW1zIG9mIHBheWxvYWRQYXJhbXMucmVxdWlyZWQpIHtcbiAgICAgIGlmIChfLndpdGhvdXQocGFyYW1zLCAuLi5rZXlzKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmVxdWlyZWRQYXJhbXMgPSBwYXJhbXM7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIE5vdyB3ZSBjb25zdHJ1Y3Qgb3VyIGxpc3Qgb2YgYXJndW1lbnRzIHdoaWNoIHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBjb21tYW5kXG4gIGxldCBhcmdzO1xuICBpZiAoXy5pc0Z1bmN0aW9uKHBheWxvYWRQYXJhbXMubWFrZUFyZ3MpKSB7XG4gICAgLy8gSW4gdGhlIHJvdXRlIHNwZWMsIGEgcGFydGljdWxhciByb3V0ZSBtaWdodCBkZWZpbmUgYSAnbWFrZUFyZ3MnIGZ1bmN0aW9uXG4gICAgLy8gaWYgaXQgd2FudHMgZnVsbCBjb250cm9sIG92ZXIgaG93IHRvIHR1cm4gSlNPTiBwYXJhbWV0ZXJzIGludG8gY29tbWFuZFxuICAgIC8vIGFyZ3VtZW50cy4gU28gd2UgcGFzcyBpdCB0aGUgSlNPTiBwYXJhbWV0ZXJzIGFuZCBpdCByZXR1cm5zIGFuIGFycmF5XG4gICAgLy8gd2hpY2ggd2lsbCBiZSBhcHBsaWVkIHRvIHRoZSBoYW5kbGluZyBjb21tYW5kLiBGb3IgZXhhbXBsZSBpZiBpdCByZXR1cm5zXG4gICAgLy8gWzEsIDIsIDNdLCB3ZSB3aWxsIGNhbGwgYGNvbW1hbmQoMSwgMiwgMywgLi4uKWAgKHVybCBwYXJhbXMgYXJlIHNlcGFyYXRlXG4gICAgLy8gZnJvbSBKU09OIHBhcmFtcyBhbmQgZ2V0IGNvbmNhdGVuYXRlZCBiZWxvdykuXG4gICAgYXJncyA9IHBheWxvYWRQYXJhbXMubWFrZUFyZ3MoanNvbk9iaiwgcHJvdG9jb2wpO1xuICB9IGVsc2Uge1xuICAgIC8vIE90aGVyd2lzZSwgY29sbGVjdCBhbGwgdGhlIHJlcXVpcmVkIGFuZCBvcHRpb25hbCBwYXJhbXMgYW5kIGZsYXR0ZW4gdGhlbVxuICAgIC8vIGludG8gYW4gYXJndW1lbnQgYXJyYXlcbiAgICBhcmdzID0gXy5mbGF0dGVuKHJlcXVpcmVkUGFyYW1zKS5tYXAoKHApID0+IGpzb25PYmpbcF0pO1xuICAgIGlmIChwYXlsb2FkUGFyYW1zLm9wdGlvbmFsKSB7XG4gICAgICBhcmdzID0gYXJncy5jb25jYXQoXy5mbGF0dGVuKHBheWxvYWRQYXJhbXMub3B0aW9uYWwpLm1hcCgocCkgPT4ganNvbk9ialtwXSkpO1xuICAgIH1cbiAgfVxuICAvLyBGaW5hbGx5LCBnZXQgb3VyIHVybCBwYXJhbXMgKHNlc3Npb24gaWQsIGVsZW1lbnQgaWQsIGV0Yy4uLikgb24gdGhlIGVuZCBvZlxuICAvLyB0aGUgbGlzdFxuICBhcmdzID0gYXJncy5jb25jYXQodXJsUGFyYW1zLm1hcCgodSkgPT4gcmVxdWVzdFBhcmFtc1t1XSkpO1xuICByZXR1cm4gYXJncztcbn1cblxuZnVuY3Rpb24gcm91dGVDb25maWd1cmluZ0Z1bmN0aW9uIChkcml2ZXIpIHtcbiAgaWYgKCFkcml2ZXIuc2Vzc2lvbkV4aXN0cykge1xuICAgIHRocm93IG5ldyBFcnJvcignRHJpdmVycyB1c2VkIHdpdGggTUpTT05XUCBtdXN0IGltcGxlbWVudCBgc2Vzc2lvbkV4aXN0c2AnKTtcbiAgfVxuXG4gIGlmICghKGRyaXZlci5leGVjdXRlQ29tbWFuZCB8fCBkcml2ZXIuZXhlY3V0ZSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0RyaXZlcnMgdXNlZCB3aXRoIE1KU09OV1AgbXVzdCBpbXBsZW1lbnQgYGV4ZWN1dGVDb21tYW5kYCBvciBgZXhlY3V0ZWAnKTtcbiAgfVxuXG4gIC8vIHJldHVybiBhIGZ1bmN0aW9uIHdoaWNoIHdpbGwgYWRkIGFsbCB0aGUgcm91dGVzIHRvIHRoZSBkcml2ZXIuIEhlcmUgZXh0cmFNZXRob2RzIG1pZ2h0IGJlXG4gIC8vIHBhc3NlZCBpbiBhcyBkZWZpbmVkIGJ5IEFwcGl1bSBwbHVnaW5zLCBzbyB3ZSBuZWVkIHRvIGFkZCB0aG9zZSB0byB0aGUgZGVmYXVsdCBsaXN0XG4gIHJldHVybiBmdW5jdGlvbiBhZGRSb3V0ZXMgKGFwcCwge2Jhc2VQYXRoID0gREVGQVVMVF9CQVNFX1BBVEgsIGV4dHJhTWV0aG9kTWFwID0ge319KSB7XG4gICAgLy8gc3RvcmUgYmFzZVBhdGggb24gdGhlIGRyaXZlciBpbnN0YW5jZSBzbyBpdCBjYW4gdXNlIGl0IGlmIG5lY2Vzc2FyeVxuICAgIC8vIGZvciBleGFtcGxlIGluIGRldGVybWluaW5nIHByb3h5IGF2b2lkYW5jZVxuICAgIGRyaXZlci5iYXNlUGF0aCA9IGJhc2VQYXRoO1xuXG4gICAgY29uc3QgYWxsTWV0aG9kcyA9IHsuLi5NRVRIT0RfTUFQLCAuLi5leHRyYU1ldGhvZE1hcH07XG5cbiAgICBmb3IgKGNvbnN0IFtwYXRoLCBtZXRob2RzXSBvZiBfLnRvUGFpcnMoYWxsTWV0aG9kcykpIHtcbiAgICAgIGZvciAoY29uc3QgW21ldGhvZCwgc3BlY10gb2YgXy50b1BhaXJzKG1ldGhvZHMpKSB7XG4gICAgICAgIC8vIHNldCB1cCB0aGUgZXhwcmVzcyByb3V0ZSBoYW5kbGVyXG4gICAgICAgIGJ1aWxkSGFuZGxlcihhcHAsIG1ldGhvZCwgYCR7YmFzZVBhdGh9JHtwYXRofWAsIHNwZWMsIGRyaXZlciwgaXNTZXNzaW9uQ29tbWFuZChzcGVjLmNvbW1hbmQpKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG59XG5cbmZ1bmN0aW9uIGJ1aWxkSGFuZGxlciAoYXBwLCBtZXRob2QsIHBhdGgsIHNwZWMsIGRyaXZlciwgaXNTZXNzQ21kKSB7XG4gIGxldCBhc3luY0hhbmRsZXIgPSBhc3luYyAocmVxLCByZXMpID0+IHtcbiAgICBsZXQganNvbk9iaiA9IHJlcS5ib2R5O1xuICAgIGxldCBodHRwUmVzQm9keSA9IHt9O1xuICAgIGxldCBodHRwU3RhdHVzID0gMjAwO1xuICAgIGxldCBuZXdTZXNzaW9uSWQ7XG4gICAgbGV0IGN1cnJlbnRQcm90b2NvbCA9IGV4dHJhY3RQcm90b2NvbChkcml2ZXIsIHJlcS5wYXJhbXMuc2Vzc2lvbklkKTtcblxuICAgIHRyeSB7XG4gICAgICAvLyBpZiB0aGlzIGlzIGEgc2Vzc2lvbiBjb21tYW5kIGJ1dCB3ZSBkb24ndCBoYXZlIGEgc2Vzc2lvbixcbiAgICAgIC8vIGVycm9yIG91dCBlYXJseSAoZXNwZWNpYWxseSBiZWZvcmUgcHJveHlpbmcpXG4gICAgICBpZiAoaXNTZXNzQ21kICYmICFkcml2ZXIuc2Vzc2lvbkV4aXN0cyhyZXEucGFyYW1zLnNlc3Npb25JZCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IGVycm9ycy5Ob1N1Y2hEcml2ZXJFcnJvcigpO1xuICAgICAgfVxuXG4gICAgICAvLyBpZiB0aGUgZHJpdmVyIGlzIGN1cnJlbnRseSBwcm94eWluZyBjb21tYW5kcyB0byBhbm90aGVyIEpTT05XUCBzZXJ2ZXIsIGJ5cGFzcyBhbGwgb3VyXG4gICAgICAvLyBjaGVja3MgYW5kIGFzc3VtZSB0aGUgdXBzdHJlYW0gc2VydmVyIGtub3dzIHdoYXQgaXQncyBkb2luZy4gQnV0IGtlZXAgdGhpcyBpbiB0aGVcbiAgICAgIC8vIHRyeS9jYXRjaCBibG9jayBzbyBpZiBwcm94eWluZyBpdHNlbGYgZmFpbHMsIHdlIGdpdmUgYSBtZXNzYWdlIHRvIHRoZSBjbGllbnQuIE9mIGNvdXJzZSB3ZVxuICAgICAgLy8gb25seSB3YW50IHRvIGRvIHRoZXNlIHdoZW4gd2UgaGF2ZSBhIHNlc3Npb24gY29tbWFuZDsgdGhlIEFwcGl1bSBkcml2ZXIgbXVzdCBiZVxuICAgICAgLy8gcmVzcG9uc2libGUgZm9yIHN0YXJ0L3N0b3Agc2Vzc2lvbiwgZXRjLi4uIFdlIGFsc28gYWxsb3cgdGhlIGNvbW1hbmQgc3BlYyB0byBkZWNsYXJlIHRoYXRcbiAgICAgIC8vIHRoaXMgY29tbWFuZCBzaG91bGQgbmV2ZXIgYmUgcHJveGllZCAod2hpY2ggaXMgdXNlZnVsIGZvciBwbHVnaW4gZGV2ZWxvcGVycyB3aG8gYWRkXG4gICAgICAvLyBjb21tYW5kcyBhbmQgZ2VuZXJhbGx5IHdvdWxkIG5vdCB3YW50IHRoYXQgY29tbWFuZCB0byBiZSBwcm94aWVkIGluc3RlYWQgb2YgaGFuZGxlZCBieSB0aGVcbiAgICAgIC8vIHBsdWdpbilcbiAgICAgIGlmIChpc1Nlc3NDbWQgJiYgIXNwZWMubmV2ZXJQcm94eSAmJiBkcml2ZXJTaG91bGREb0p3cFByb3h5KGRyaXZlciwgcmVxLCBzcGVjLmNvbW1hbmQpKSB7XG4gICAgICAgIGF3YWl0IGRvSndwUHJveHkoZHJpdmVyLCByZXEsIHJlcyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gaWYgYSBjb21tYW5kIGlzIG5vdCBpbiBvdXIgbWV0aG9kIG1hcCwgaXQncyBiZWNhdXNlIHdlXG4gICAgICAvLyBoYXZlIG5vIHBsYW5zIHRvIGV2ZXIgaW1wbGVtZW50IGl0XG4gICAgICBpZiAoIXNwZWMuY29tbWFuZCkge1xuICAgICAgICB0aHJvdyBuZXcgZXJyb3JzLk5vdEltcGxlbWVudGVkRXJyb3IoKTtcbiAgICAgIH1cblxuICAgICAgLy8gd3JhcCBwYXJhbXMgaWYgbmVjZXNzYXJ5XG4gICAgICBpZiAoc3BlYy5wYXlsb2FkUGFyYW1zICYmIHNwZWMucGF5bG9hZFBhcmFtcy53cmFwKSB7XG4gICAgICAgIGpzb25PYmogPSB3cmFwUGFyYW1zKHNwZWMucGF5bG9hZFBhcmFtcywganNvbk9iaik7XG4gICAgICB9XG5cbiAgICAgIC8vIHVud3JhcCBwYXJhbXMgaWYgbmVjZXNzYXJ5XG4gICAgICBpZiAoc3BlYy5wYXlsb2FkUGFyYW1zICYmIHNwZWMucGF5bG9hZFBhcmFtcy51bndyYXApIHtcbiAgICAgICAganNvbk9iaiA9IHVud3JhcFBhcmFtcyhzcGVjLnBheWxvYWRQYXJhbXMsIGpzb25PYmopO1xuICAgICAgfVxuXG4gICAgICBpZiAoc3BlYy5jb21tYW5kID09PSBDUkVBVEVfU0VTU0lPTl9DT01NQU5EKSB7XG4gICAgICAgIC8vIHRyeSB0byBkZXRlcm1pbmUgcHJvdG9jb2wgYnkgc2Vzc2lvbiBjcmVhdGlvbiBhcmdzLCBzbyB3ZSBjYW4gdGhyb3cgYVxuICAgICAgICAvLyBwcm9wZXJseSBmb3JtYXR0ZWQgZXJyb3IgaWYgYXJndW1lbnRzIHZhbGlkYXRpb24gZmFpbHNcbiAgICAgICAgY3VycmVudFByb3RvY29sID0gZGV0ZXJtaW5lUHJvdG9jb2woLi4ubWFrZUFyZ3MocmVxLnBhcmFtcywganNvbk9iaiwgc3BlYy5wYXlsb2FkUGFyYW1zIHx8IHt9KSk7XG4gICAgICB9XG5cbiAgICAgIC8vIGVuc3VyZSB0aGF0IHRoZSBqc29uIHBheWxvYWQgY29uZm9ybXMgdG8gdGhlIHNwZWNcbiAgICAgIGNoZWNrUGFyYW1zKHNwZWMucGF5bG9hZFBhcmFtcywganNvbk9iaiwgY3VycmVudFByb3RvY29sKTtcblxuICAgICAgLy8gdHVybiB0aGUgY29tbWFuZCBhbmQganNvbiBwYXlsb2FkIGludG8gYW4gYXJndW1lbnQgbGlzdCBmb3JcbiAgICAgIC8vIHRoZSBkcml2ZXIgbWV0aG9kc1xuICAgICAgbGV0IGFyZ3MgPSBtYWtlQXJncyhyZXEucGFyYW1zLCBqc29uT2JqLCBzcGVjLnBheWxvYWRQYXJhbXMgfHwge30sIGN1cnJlbnRQcm90b2NvbCk7XG4gICAgICBsZXQgZHJpdmVyUmVzO1xuICAgICAgLy8gdmFsaWRhdGUgY29tbWFuZCBhcmdzIGFjY29yZGluZyB0byBNSlNPTldQXG4gICAgICBpZiAodmFsaWRhdG9yc1tzcGVjLmNvbW1hbmRdKSB7XG4gICAgICAgIHZhbGlkYXRvcnNbc3BlYy5jb21tYW5kXSguLi5hcmdzKTtcbiAgICAgIH1cblxuICAgICAgLy8gcnVuIHRoZSBkcml2ZXIgY29tbWFuZCB3cmFwcGVkIGluc2lkZSB0aGUgYXJndW1lbnQgdmFsaWRhdG9yc1xuICAgICAgU0VTU0lPTlNfQ0FDSEUuZ2V0TG9nZ2VyKHJlcS5wYXJhbXMuc2Vzc2lvbklkLCBjdXJyZW50UHJvdG9jb2wpLmRlYnVnKGBDYWxsaW5nIGAgK1xuICAgICAgICBgJHtkcml2ZXIuY29uc3RydWN0b3IubmFtZX0uJHtzcGVjLmNvbW1hbmR9KCkgd2l0aCBhcmdzOiBgICtcbiAgICAgICAgXy50cnVuY2F0ZShKU09OLnN0cmluZ2lmeShhcmdzKSwge2xlbmd0aDogTUFYX0xPR19CT0RZX0xFTkdUSH0pKTtcblxuICAgICAgaWYgKGRyaXZlci5leGVjdXRlQ29tbWFuZCkge1xuICAgICAgICBkcml2ZXJSZXMgPSBhd2FpdCBkcml2ZXIuZXhlY3V0ZUNvbW1hbmQoc3BlYy5jb21tYW5kLCAuLi5hcmdzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRyaXZlclJlcyA9IGF3YWl0IGRyaXZlci5leGVjdXRlKHNwZWMuY29tbWFuZCwgLi4uYXJncyk7XG4gICAgICB9XG5cbiAgICAgIC8vIEdldCB0aGUgcHJvdG9jb2wgYWZ0ZXIgZXhlY3V0ZUNvbW1hbmRcbiAgICAgIGN1cnJlbnRQcm90b2NvbCA9IGV4dHJhY3RQcm90b2NvbChkcml2ZXIsIHJlcS5wYXJhbXMuc2Vzc2lvbklkKSB8fCBjdXJyZW50UHJvdG9jb2w7XG5cbiAgICAgIC8vIElmIGBleGVjdXRlQ29tbWFuZGAgd2FzIG92ZXJyaWRkZW4gYW5kIHRoZSBtZXRob2QgcmV0dXJucyBhbiBvYmplY3RcbiAgICAgIC8vIHdpdGggYSBwcm90b2NvbCBhbmQgdmFsdWUvZXJyb3IgcHJvcGVydHksIHJlLWFzc2lnbiB0aGUgcHJvdG9jb2xcbiAgICAgIGlmIChfLmlzUGxhaW5PYmplY3QoZHJpdmVyUmVzKSAmJiBfLmhhcyhkcml2ZXJSZXMsICdwcm90b2NvbCcpKSB7XG4gICAgICAgIGN1cnJlbnRQcm90b2NvbCA9IGRyaXZlclJlcy5wcm90b2NvbCB8fCBjdXJyZW50UHJvdG9jb2w7XG4gICAgICAgIGlmIChkcml2ZXJSZXMuZXJyb3IpIHtcbiAgICAgICAgICB0aHJvdyBkcml2ZXJSZXMuZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgZHJpdmVyUmVzID0gZHJpdmVyUmVzLnZhbHVlO1xuICAgICAgfVxuXG4gICAgICAvLyB1bnBhY2sgY3JlYXRlU2Vzc2lvbiByZXNwb25zZVxuICAgICAgaWYgKHNwZWMuY29tbWFuZCA9PT0gQ1JFQVRFX1NFU1NJT05fQ09NTUFORCkge1xuICAgICAgICBuZXdTZXNzaW9uSWQgPSBkcml2ZXJSZXNbMF07XG4gICAgICAgIFNFU1NJT05TX0NBQ0hFLnB1dFNlc3Npb24obmV3U2Vzc2lvbklkLCBjdXJyZW50UHJvdG9jb2wpO1xuICAgICAgICBTRVNTSU9OU19DQUNIRS5nZXRMb2dnZXIobmV3U2Vzc2lvbklkLCBjdXJyZW50UHJvdG9jb2wpXG4gICAgICAgICAgLmRlYnVnKGBDYWNoZWQgdGhlIHByb3RvY29sIHZhbHVlICcke2N1cnJlbnRQcm90b2NvbH0nIGZvciB0aGUgbmV3IHNlc3Npb24gJHtuZXdTZXNzaW9uSWR9YCk7XG4gICAgICAgIGlmIChjdXJyZW50UHJvdG9jb2wgPT09IFBST1RPQ09MUy5NSlNPTldQKSB7XG4gICAgICAgICAgZHJpdmVyUmVzID0gZHJpdmVyUmVzWzFdO1xuICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRQcm90b2NvbCA9PT0gUFJPVE9DT0xTLlczQykge1xuICAgICAgICAgIGRyaXZlclJlcyA9IHtcbiAgICAgICAgICAgIGNhcGFiaWxpdGllczogZHJpdmVyUmVzWzFdLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZHJpdmVyUmVzID0gZm9ybWF0UmVzcG9uc2VWYWx1ZShkcml2ZXJSZXMpO1xuXG4gICAgICAvLyBkZWxldGUgc2hvdWxkIG5vdCByZXR1cm4gYW55dGhpbmcgZXZlbiBpZiBzdWNjZXNzZnVsXG4gICAgICBpZiAoc3BlYy5jb21tYW5kID09PSBERUxFVEVfU0VTU0lPTl9DT01NQU5EKSB7XG4gICAgICAgIFNFU1NJT05TX0NBQ0hFLmdldExvZ2dlcihyZXEucGFyYW1zLnNlc3Npb25JZCwgY3VycmVudFByb3RvY29sKVxuICAgICAgICAgIC5kZWJ1ZyhgUmVjZWl2ZWQgcmVzcG9uc2U6ICR7Xy50cnVuY2F0ZShKU09OLnN0cmluZ2lmeShkcml2ZXJSZXMpLCB7bGVuZ3RoOiBNQVhfTE9HX0JPRFlfTEVOR1RIfSl9YCk7XG4gICAgICAgIFNFU1NJT05TX0NBQ0hFLmdldExvZ2dlcihyZXEucGFyYW1zLnNlc3Npb25JZCwgY3VycmVudFByb3RvY29sKS5kZWJ1ZygnQnV0IGRlbGV0aW5nIHNlc3Npb24sIHNvIG5vdCByZXR1cm5pbmcnKTtcbiAgICAgICAgZHJpdmVyUmVzID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgLy8gaWYgdGhlIHN0YXR1cyBpcyBub3QgMCwgIHRocm93IHRoZSBhcHByb3ByaWF0ZSBlcnJvciBmb3Igc3RhdHVzIGNvZGUuXG4gICAgICBpZiAodXRpbC5oYXNWYWx1ZShkcml2ZXJSZXMpKSB7XG4gICAgICAgIGlmICh1dGlsLmhhc1ZhbHVlKGRyaXZlclJlcy5zdGF0dXMpICYmICFpc05hTihkcml2ZXJSZXMuc3RhdHVzKSAmJiBwYXJzZUludChkcml2ZXJSZXMuc3RhdHVzLCAxMCkgIT09IDApIHtcbiAgICAgICAgICB0aHJvdyBlcnJvckZyb21NSlNPTldQU3RhdHVzQ29kZShkcml2ZXJSZXMuc3RhdHVzLCBkcml2ZXJSZXMudmFsdWUpO1xuICAgICAgICB9IGVsc2UgaWYgKF8uaXNQbGFpbk9iamVjdChkcml2ZXJSZXMudmFsdWUpICYmIGRyaXZlclJlcy52YWx1ZS5lcnJvcikge1xuICAgICAgICAgIHRocm93IGVycm9yRnJvbVczQ0pzb25Db2RlKGRyaXZlclJlcy52YWx1ZS5lcnJvciwgZHJpdmVyUmVzLnZhbHVlLm1lc3NhZ2UsIGRyaXZlclJlcy52YWx1ZS5zdGFja3RyYWNlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBodHRwUmVzQm9keS52YWx1ZSA9IGRyaXZlclJlcztcbiAgICAgIFNFU1NJT05TX0NBQ0hFLmdldExvZ2dlcihyZXEucGFyYW1zLnNlc3Npb25JZCB8fCBuZXdTZXNzaW9uSWQsIGN1cnJlbnRQcm90b2NvbCkuZGVidWcoYFJlc3BvbmRpbmcgYCArXG4gICAgICAgIGB0byBjbGllbnQgd2l0aCBkcml2ZXIuJHtzcGVjLmNvbW1hbmR9KCkgcmVzdWx0OiAke18udHJ1bmNhdGUoSlNPTi5zdHJpbmdpZnkoZHJpdmVyUmVzKSwge2xlbmd0aDogTUFYX0xPR19CT0RZX0xFTkdUSH0pfWApO1xuXG4gICAgICBpZiAoc3BlYy5jb21tYW5kID09PSBERUxFVEVfU0VTU0lPTl9DT01NQU5EKSB7XG4gICAgICAgIC8vIFdlIGRvbid0IHdhbnQgdG8ga2VlcCB0aGUgbG9nZ2VyIGluc3RhbmNlIGluIHRoZSBjYWNoZVxuICAgICAgICAvLyBhZnRlciB0aGUgc2Vzc2lvbiBpcyBkZWxldGVkLCBiZWNhdXNlIGl0IGNvbnRhaW5zIHRoZSBsb2dnaW5nIGhpc3RvcnlcbiAgICAgICAgLy8gYW5kIGNvbnN1bWVzIHRoZSBtZW1vcnlcbiAgICAgICAgU0VTU0lPTlNfQ0FDSEUucmVzZXRMb2dnZXIocmVxLnBhcmFtcy5zZXNzaW9uSWQpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgLy8gaWYgYW55dGhpbmcgZ29lcyB3cm9uZywgZmlndXJlIG91dCB3aGF0IG91ciByZXNwb25zZSBzaG91bGQgYmVcbiAgICAgIC8vIGJhc2VkIG9uIHRoZSB0eXBlIG9mIGVycm9yIHRoYXQgd2UgZW5jb3VudGVyZWRcbiAgICAgIGxldCBhY3R1YWxFcnIgPSBlcnI7XG5cbiAgICAgIGN1cnJlbnRQcm90b2NvbCA9IGN1cnJlbnRQcm90b2NvbCB8fCBleHRyYWN0UHJvdG9jb2woZHJpdmVyLCByZXEucGFyYW1zLnNlc3Npb25JZCB8fCBuZXdTZXNzaW9uSWQpO1xuXG4gICAgICBsZXQgZXJyTXNnID0gZXJyLnN0YWNrdHJhY2UgfHwgZXJyLnN0YWNrO1xuICAgICAgaWYgKCFfLmluY2x1ZGVzKGVyck1zZywgZXJyLm1lc3NhZ2UpKSB7XG4gICAgICAgIC8vIGlmIHRoZSBtZXNzYWdlIGhhcyBtb3JlIGluZm9ybWF0aW9uLCBhZGQgaXQuIGJ1dCBvZnRlbiB0aGUgbWVzc2FnZVxuICAgICAgICAvLyBpcyB0aGUgZmlyc3QgcGFydCBvZiB0aGUgc3RhY2sgdHJhY2VcbiAgICAgICAgZXJyTXNnID0gYCR7ZXJyLm1lc3NhZ2V9JHtlcnJNc2cgPyAoJ1xcbicgKyBlcnJNc2cpIDogJyd9YDtcbiAgICAgIH1cbiAgICAgIGlmIChpc0Vycm9yVHlwZShlcnIsIGVycm9ycy5Qcm94eVJlcXVlc3RFcnJvcikpIHtcbiAgICAgICAgYWN0dWFsRXJyID0gZXJyLmdldEFjdHVhbEVycm9yKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBTRVNTSU9OU19DQUNIRS5nZXRMb2dnZXIocmVxLnBhcmFtcy5zZXNzaW9uSWQgfHwgbmV3U2Vzc2lvbklkLCBjdXJyZW50UHJvdG9jb2wpXG4gICAgICAgICAgLmRlYnVnKGBFbmNvdW50ZXJlZCBpbnRlcm5hbCBlcnJvciBydW5uaW5nIGNvbW1hbmQ6ICR7ZXJyTXNnfWApO1xuICAgICAgfVxuXG4gICAgICBpZiAoY3VycmVudFByb3RvY29sID09PSBQUk9UT0NPTFMuVzNDKSB7XG4gICAgICAgIFtodHRwU3RhdHVzLCBodHRwUmVzQm9keV0gPSBnZXRSZXNwb25zZUZvclczQ0Vycm9yKGFjdHVhbEVycik7XG4gICAgICB9IGVsc2UgaWYgKGN1cnJlbnRQcm90b2NvbCA9PT0gUFJPVE9DT0xTLk1KU09OV1ApIHtcbiAgICAgICAgW2h0dHBTdGF0dXMsIGh0dHBSZXNCb2R5XSA9IGdldFJlc3BvbnNlRm9ySnNvbndwRXJyb3IoYWN0dWFsRXJyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIElmIGl0J3MgdW5rbm93biB3aGF0IHRoZSBwcm90b2NvbCBpcyAobGlrZSBpZiBpdCdzIGBnZXRTdGF0dXNgIHByaW9yIHRvIGBjcmVhdGVTZXNzaW9uYCksIG1lcmdlIHRoZSByZXNwb25zZXNcbiAgICAgICAgLy8gdG9nZXRoZXIgdG8gYmUgcHJvdG9jb2wtYWdub3N0aWNcbiAgICAgICAgbGV0IGpzb253cFJlcyA9IGdldFJlc3BvbnNlRm9ySnNvbndwRXJyb3IoYWN0dWFsRXJyKTtcbiAgICAgICAgbGV0IHczY1JlcyA9IGdldFJlc3BvbnNlRm9yVzNDRXJyb3IoYWN0dWFsRXJyKTtcblxuICAgICAgICBodHRwUmVzQm9keSA9IHtcbiAgICAgICAgICAuLi5qc29ud3BSZXNbMV0sXG4gICAgICAgICAgLi4udzNjUmVzWzFdLFxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIFVzZSB0aGUgSlNPTldQIHN0YXR1cyBjb2RlICh3aGljaCBpcyB1c3VhbGx5IDUwMClcbiAgICAgICAgaHR0cFN0YXR1cyA9IGpzb253cFJlc1swXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBkZWNvZGUgdGhlIHJlc3BvbnNlLCB3aGljaCBpcyBlaXRoZXIgYSBzdHJpbmcgb3IganNvblxuICAgIGlmIChfLmlzU3RyaW5nKGh0dHBSZXNCb2R5KSkge1xuICAgICAgcmVzLnN0YXR1cyhodHRwU3RhdHVzKS5zZW5kKGh0dHBSZXNCb2R5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKG5ld1Nlc3Npb25JZCkge1xuICAgICAgICBpZiAoY3VycmVudFByb3RvY29sID09PSBQUk9UT0NPTFMuVzNDKSB7XG4gICAgICAgICAgaHR0cFJlc0JvZHkudmFsdWUuc2Vzc2lvbklkID0gbmV3U2Vzc2lvbklkO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGh0dHBSZXNCb2R5LnNlc3Npb25JZCA9IG5ld1Nlc3Npb25JZDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaHR0cFJlc0JvZHkuc2Vzc2lvbklkID0gcmVxLnBhcmFtcy5zZXNzaW9uSWQgfHwgbnVsbDtcbiAgICAgIH1cbiAgICAgIC8vIERvbid0IGluY2x1ZGUgc2Vzc2lvbklkIGluIFczQyByZXNwb25zZXNcbiAgICAgIGlmIChjdXJyZW50UHJvdG9jb2wgPT09IFBST1RPQ09MUy5XM0MpIHtcbiAgICAgICAgZGVsZXRlIGh0dHBSZXNCb2R5LnNlc3Npb25JZDtcbiAgICAgIH1cblxuICAgICAgaHR0cFJlc0JvZHkgPSBmb3JtYXRTdGF0dXMoaHR0cFJlc0JvZHksIGh0dHBTdGF0dXMsIGN1cnJlbnRQcm90b2NvbCk7XG4gICAgICByZXMuc3RhdHVzKGh0dHBTdGF0dXMpLmpzb24oaHR0cFJlc0JvZHkpO1xuICAgIH1cbiAgfTtcbiAgLy8gYWRkIHRoZSBtZXRob2QgdG8gdGhlIGFwcFxuICBhcHBbbWV0aG9kLnRvTG93ZXJDYXNlKCldKHBhdGgsIChyZXEsIHJlcykgPT4ge1xuICAgIEIucmVzb2x2ZShhc3luY0hhbmRsZXIocmVxLCByZXMpKS5kb25lKCk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBkcml2ZXJTaG91bGREb0p3cFByb3h5IChkcml2ZXIsIHJlcSwgY29tbWFuZCkge1xuICAvLyBkcml2ZXJzIG5lZWQgdG8gZXhwbGljaXRseSBzYXkgd2hlbiB0aGUgcHJveHkgaXMgYWN0aXZlXG4gIGlmICghZHJpdmVyLnByb3h5QWN0aXZlKHJlcS5wYXJhbXMuc2Vzc2lvbklkKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIHdlIHNob3VsZCBuZXZlciBwcm94eSBkZWxldGVTZXNzaW9uIGJlY2F1c2Ugd2UgbmVlZCB0byBnaXZlIHRoZSBjb250YWluaW5nXG4gIC8vIGRyaXZlciBhbiBvcHBvcnR1bml0eSB0byBjbGVhbiBpdHNlbGYgdXBcbiAgaWYgKGNvbW1hbmQgPT09ICdkZWxldGVTZXNzaW9uJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIHZhbGlkYXRlIGF2b2lkYW5jZSBzY2hlbWEsIGFuZCBzYXkgd2Ugc2hvdWxkbid0IHByb3h5IGlmIGFueXRoaW5nIGluIHRoZVxuICAvLyBhdm9pZCBsaXN0IG1hdGNoZXMgb3VyIHJlcVxuICBpZiAoZHJpdmVyLnByb3h5Um91dGVJc0F2b2lkZWQocmVxLnBhcmFtcy5zZXNzaW9uSWQsIHJlcS5tZXRob2QsIHJlcS5vcmlnaW5hbFVybCwgcmVxLmJvZHkpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGRvSndwUHJveHkgKGRyaXZlciwgcmVxLCByZXMpIHtcbiAgU0VTU0lPTlNfQ0FDSEUuZ2V0TG9nZ2VyKHJlcS5wYXJhbXMuc2Vzc2lvbklkLCBleHRyYWN0UHJvdG9jb2woZHJpdmVyLCByZXEucGFyYW1zLnNlc3Npb25JZCkpXG4gICAgLmluZm8oJ0RyaXZlciBwcm94eSBhY3RpdmUsIHBhc3NpbmcgcmVxdWVzdCBvbiB2aWEgSFRUUCBwcm94eScpO1xuXG4gIC8vIGNoZWNrIHRoYXQgdGhlIGlubmVyIGRyaXZlciBoYXMgYSBwcm94eSBmdW5jdGlvblxuICBpZiAoIWRyaXZlci5jYW5Qcm94eShyZXEucGFyYW1zLnNlc3Npb25JZCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1RyeWluZyB0byBwcm94eSB0byBhIEpTT05XUCBzZXJ2ZXIgYnV0IGRyaXZlciBpcyB1bmFibGUgdG8gcHJveHknKTtcbiAgfVxuICB0cnkge1xuICAgIGNvbnN0IHByb3hpZWRSZXMgPSBhd2FpdCBkcml2ZXIuZXhlY3V0ZUNvbW1hbmQoJ3Byb3h5UmVxUmVzJywgcmVxLCByZXMsIHJlcS5wYXJhbXMuc2Vzc2lvbklkKTtcbiAgICBpZiAocHJveGllZFJlcyAmJiBwcm94aWVkUmVzLmVycm9yKSB0aHJvdyBwcm94aWVkUmVzLmVycm9yOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGN1cmx5XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmIChpc0Vycm9yVHlwZShlcnIsIGVycm9ycy5Qcm94eVJlcXVlc3RFcnJvcikpIHtcbiAgICAgIHRocm93IGVycjtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgcHJveHkuIFByb3h5IGVycm9yOiAke2Vyci5tZXNzYWdlfWApO1xuICAgIH1cbiAgfVxufVxuXG5cbmV4cG9ydCB7XG4gIFByb3RvY29sLCByb3V0ZUNvbmZpZ3VyaW5nRnVuY3Rpb24sIGlzU2Vzc2lvbkNvbW1hbmQsXG4gIGRyaXZlclNob3VsZERvSndwUHJveHksIGRldGVybWluZVByb3RvY29sXG59O1xuIl0sImZpbGUiOiJsaWIvcHJvdG9jb2wvcHJvdG9jb2wuanMiLCJzb3VyY2VSb290IjoiLi4vLi4vLi4ifQ==
391
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9wcm90b2NvbC9wcm90b2NvbC5qcyJdLCJuYW1lcyI6WyJDUkVBVEVfU0VTU0lPTl9DT01NQU5EIiwiREVMRVRFX1NFU1NJT05fQ09NTUFORCIsIkdFVF9TVEFUVVNfQ09NTUFORCIsIlByb3RvY29sIiwiZGV0ZXJtaW5lUHJvdG9jb2wiLCJkZXNpcmVkQ2FwYWJpbGl0aWVzIiwicmVxdWlyZWRDYXBhYmlsaXRpZXMiLCJjYXBhYmlsaXRpZXMiLCJfIiwiaXNQbGFpbk9iamVjdCIsIlBST1RPQ09MUyIsIlczQyIsIk1KU09OV1AiLCJleHRyYWN0UHJvdG9jb2wiLCJkcml2ZXIiLCJzZXNzaW9uSWQiLCJkc3REcml2ZXIiLCJpc0Z1bmN0aW9uIiwiZHJpdmVyRm9yU2Vzc2lvbiIsInByb3RvY29sIiwiU0VTU0lPTlNfQ0FDSEUiLCJnZXRQcm90b2NvbCIsImlzU2Vzc2lvbkNvbW1hbmQiLCJjb21tYW5kIiwiaW5jbHVkZXMiLCJOT19TRVNTSU9OX0lEX0NPTU1BTkRTIiwid3JhcFBhcmFtcyIsInBhcmFtU2V0cyIsImpzb25PYmoiLCJyZXMiLCJpc0FycmF5IiwiaXNPYmplY3QiLCJ3cmFwIiwidW53cmFwUGFyYW1zIiwidW53cmFwIiwiY2hlY2tQYXJhbXMiLCJyZXF1aXJlZFBhcmFtcyIsIm9wdGlvbmFsUGFyYW1zIiwicmVjZWl2ZWRQYXJhbXMiLCJrZXlzIiwicmVxdWlyZWQiLCJmaXJzdCIsIm9wdGlvbmFsIiwidmFsaWRhdGUiLCJtZXNzYWdlIiwiZXJyb3JzIiwiQmFkUGFyYW1ldGVyc0Vycm9yIiwibGVuZ3RoIiwiaW5kZXhPZiIsInB1c2giLCJwYXJhbXMiLCJkaWZmZXJlbmNlIiwibWFrZUFyZ3MiLCJyZXF1ZXN0UGFyYW1zIiwicGF5bG9hZFBhcmFtcyIsInVybFBhcmFtcyIsInJldmVyc2UiLCJ3aXRob3V0IiwiYXJncyIsImZsYXR0ZW4iLCJtYXAiLCJwIiwiY29uY2F0IiwidSIsInJvdXRlQ29uZmlndXJpbmdGdW5jdGlvbiIsInNlc3Npb25FeGlzdHMiLCJFcnJvciIsImV4ZWN1dGVDb21tYW5kIiwiZXhlY3V0ZSIsImFkZFJvdXRlcyIsImFwcCIsImJhc2VQYXRoIiwiREVGQVVMVF9CQVNFX1BBVEgiLCJleHRyYU1ldGhvZE1hcCIsImFsbE1ldGhvZHMiLCJNRVRIT0RfTUFQIiwicGF0aCIsIm1ldGhvZHMiLCJ0b1BhaXJzIiwibWV0aG9kIiwic3BlYyIsImJ1aWxkSGFuZGxlciIsImlzU2Vzc0NtZCIsImFzeW5jSGFuZGxlciIsInJlcSIsImJvZHkiLCJodHRwUmVzQm9keSIsImh0dHBTdGF0dXMiLCJuZXdTZXNzaW9uSWQiLCJjdXJyZW50UHJvdG9jb2wiLCJOb1N1Y2hEcml2ZXJFcnJvciIsImRpZFBsdWdpbk92ZXJyaWRlUHJveHkiLCJuZXZlclByb3h5IiwiZHJpdmVyU2hvdWxkRG9Kd3BQcm94eSIsInBsdWdpbnNUb0hhbmRsZUNtZCIsImRvSndwUHJveHkiLCJnZXRMb2dnZXIiLCJkZWJ1ZyIsIk5vdEltcGxlbWVudGVkRXJyb3IiLCJkcml2ZXJSZXMiLCJ2YWxpZGF0b3JzIiwiY29uc3RydWN0b3IiLCJuYW1lIiwidHJ1bmNhdGUiLCJKU09OIiwic3RyaW5naWZ5IiwiTUFYX0xPR19CT0RZX0xFTkdUSCIsInJlcUZvclByb3h5IiwiaGFzIiwiZXJyb3IiLCJ2YWx1ZSIsInB1dFNlc3Npb24iLCJ1dGlsIiwiaGFzVmFsdWUiLCJzdGF0dXMiLCJpc05hTiIsInBhcnNlSW50Iiwic3RhY2t0cmFjZSIsInJlc2V0TG9nZ2VyIiwiZXJyIiwiYWN0dWFsRXJyIiwiZXJyTXNnIiwic3RhY2siLCJQcm94eVJlcXVlc3RFcnJvciIsImdldEFjdHVhbEVycm9yIiwiaXNTdHJpbmciLCJzZW5kIiwianNvbiIsInRvTG93ZXJDYXNlIiwiQiIsInJlc29sdmUiLCJkb25lIiwicHJveHlBY3RpdmUiLCJwcm94eVJvdXRlSXNBdm9pZGVkIiwib3JpZ2luYWxVcmwiLCJpbmZvIiwiY2FuUHJveHkiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7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XG5pbXBvcnQgeyB1dGlsIH0gZnJvbSAnQGFwcGl1bS9zdXBwb3J0JztcbmltcG9ydCB7IHZhbGlkYXRvcnMgfSBmcm9tICcuL3ZhbGlkYXRvcnMnO1xuaW1wb3J0IHtcbiAgZXJyb3JzLCBpc0Vycm9yVHlwZSwgZ2V0UmVzcG9uc2VGb3JXM0NFcnJvcixcbiAgZXJyb3JGcm9tTUpTT05XUFN0YXR1c0NvZGUsIGVycm9yRnJvbVczQ0pzb25Db2RlLFxufSBmcm9tICcuL2Vycm9ycyc7XG5pbXBvcnQgeyBNRVRIT0RfTUFQLCBOT19TRVNTSU9OX0lEX0NPTU1BTkRTIH0gZnJvbSAnLi9yb3V0ZXMnO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IHtcbiAgZm9ybWF0UmVzcG9uc2VWYWx1ZSwgZm9ybWF0U3RhdHVzLFxufSBmcm9tICcuL2hlbHBlcnMnO1xuaW1wb3J0IHsgTUFYX0xPR19CT0RZX0xFTkdUSCwgUFJPVE9DT0xTLCBERUZBVUxUX0JBU0VfUEFUSCB9IGZyb20gJy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgU0VTU0lPTlNfQ0FDSEUgZnJvbSAnLi9zZXNzaW9ucy1jYWNoZSc7XG5cblxuY29uc3QgQ1JFQVRFX1NFU1NJT05fQ09NTUFORCA9ICdjcmVhdGVTZXNzaW9uJztcbmNvbnN0IERFTEVURV9TRVNTSU9OX0NPTU1BTkQgPSAnZGVsZXRlU2Vzc2lvbic7XG5jb25zdCBHRVRfU1RBVFVTX0NPTU1BTkQgPSAnZ2V0U3RhdHVzJztcblxuY2xhc3MgUHJvdG9jb2wge31cblxuZnVuY3Rpb24gZGV0ZXJtaW5lUHJvdG9jb2wgKGRlc2lyZWRDYXBhYmlsaXRpZXMsIHJlcXVpcmVkQ2FwYWJpbGl0aWVzLCBjYXBhYmlsaXRpZXMpIHtcbiAgcmV0dXJuIF8uaXNQbGFpbk9iamVjdChjYXBhYmlsaXRpZXMpID9cbiAgICBQUk9UT0NPTFMuVzNDIDpcbiAgICBQUk9UT0NPTFMuTUpTT05XUDtcbn1cblxuZnVuY3Rpb24gZXh0cmFjdFByb3RvY29sIChkcml2ZXIsIHNlc3Npb25JZCA9IG51bGwpIHtcbiAgY29uc3QgZHN0RHJpdmVyID0gXy5pc0Z1bmN0aW9uKGRyaXZlci5kcml2ZXJGb3JTZXNzaW9uKVxuICAgID8gZHJpdmVyLmRyaXZlckZvclNlc3Npb24oc2Vzc2lvbklkKVxuICAgIDogZHJpdmVyO1xuICBpZiAoZHN0RHJpdmVyID09PSBkcml2ZXIpIHtcbiAgICAvLyBTaG9ydGNpcmN1aXQgaWYgdGhlIGRyaXZlciBpbnN0YW5jZSBpcyBub3QgYW4gdW1icmVsbGEgZHJpdmVyXG4gICAgLy8gb3IgaXQgaXMgRmFrZSBkcml2ZXIgaW5zdGFuY2UsIHdoZXJlIGBkcml2ZXIuZHJpdmVyRm9yU2Vzc2lvbmBcbiAgICAvLyBhbHdheXMgcmV0dXJucyBzZWxmIGluc3RhbmNlXG4gICAgcmV0dXJuIGRyaXZlci5wcm90b2NvbDtcbiAgfVxuXG4gIC8vIEV4dHJhY3QgdGhlIHByb3RvY29sIGZvciB0aGUgY3VycmVudCBzZXNzaW9uIGlmIHRoZSBnaXZlbiBkcml2ZXIgaXMgdGhlIHVtYnJlbGxhIG9uZVxuICByZXR1cm4gZHN0RHJpdmVyID8gZHN0RHJpdmVyLnByb3RvY29sIDogU0VTU0lPTlNfQ0FDSEUuZ2V0UHJvdG9jb2woc2Vzc2lvbklkKTtcbn1cblxuZnVuY3Rpb24gaXNTZXNzaW9uQ29tbWFuZCAoY29tbWFuZCkge1xuICByZXR1cm4gIV8uaW5jbHVkZXMoTk9fU0VTU0lPTl9JRF9DT01NQU5EUywgY29tbWFuZCk7XG59XG5cbmZ1bmN0aW9uIHdyYXBQYXJhbXMgKHBhcmFtU2V0cywganNvbk9iaikge1xuICAvKiBUaGVyZSBhcmUgY29tbWFuZHMgbGlrZSBwZXJmb3JtVG91Y2ggd2hpY2ggdGFrZSBhIHNpbmdsZSBwYXJhbWV0ZXIgKHByaW1pdGl2ZSB0eXBlIG9yIGFycmF5KS5cbiAgICogU29tZSBkcml2ZXJzIGNob29zZSB0byBwYXNzIHRoaXMgcGFyYW1ldGVyIGFzIGEgdmFsdWUgKGVnLiBbYWN0aW9uMSwgYWN0aW9uMi4uLl0pIHdoaWxlIG90aGVycyB0b1xuICAgKiB3cmFwIGl0IHdpdGhpbiBhbiBvYmplY3QoZWcnIHtnZXN0dXJlOiAgW2FjdGlvbjEsIGFjdGlvbjIuLi5dfSksIHdoaWNoIG1ha2VzIGl0IGhhcmQgdG8gdmFsaWRhdGUuXG4gICAqIFRoZSB3cmFwIG9wdGlvbiBpbiB0aGUgc3BlYyBlbmZvcmNlIHdyYXBwaW5nIGJlZm9yZSB2YWxpZGF0aW9uLCBzbyB0aGF0IGFsbCBwYXJhbXMgYXJlIHdyYXBwZWQgYXRcbiAgICogdGhlIHRpbWUgdGhleSBhcmUgdmFsaWRhdGVkIGFuZCBsYXRlciBwYXNzZWQgdG8gdGhlIGNvbW1hbmRzLlxuICAgKi9cbiAgbGV0IHJlcyA9IGpzb25PYmo7XG4gIGlmIChfLmlzQXJyYXkoanNvbk9iaikgfHwgIV8uaXNPYmplY3QoanNvbk9iaikpIHtcbiAgICByZXMgPSB7fTtcbiAgICByZXNbcGFyYW1TZXRzLndyYXBdID0ganNvbk9iajtcbiAgfVxuICByZXR1cm4gcmVzO1xufVxuXG5mdW5jdGlvbiB1bndyYXBQYXJhbXMgKHBhcmFtU2V0cywganNvbk9iaikge1xuICAvKiBUaGVyZSBhcmUgY29tbWFuZHMgbGlrZSBzZXROZXR3b3JrQ29ubmVjdGlvbiB3aGljaCBzZW5kIHBhcmFtZXRlcnMgd3JhcHBlZCBpbnNpZGUgYSBrZXkgc3VjaCBhc1xuICAgKiBcInBhcmFtZXRlcnNcIi4gVGhpcyBmdW5jdGlvbiB1bndyYXBzIHRoZW0gKGVnLiB7XCJwYXJhbWV0ZXJzXCI6IHtcInR5cGVcIjogMX19IGJlY29tZXMge1widHlwZVwiOiAxfSkuXG4gICAqL1xuICBsZXQgcmVzID0ganNvbk9iajtcbiAgaWYgKF8uaXNPYmplY3QoanNvbk9iaikpIHtcbiAgICAvLyBzb21lIGNsaWVudHMsIGxpa2UgcnVieSwgZG9uJ3Qgd3JhcFxuICAgIGlmIChqc29uT2JqW3BhcmFtU2V0cy51bndyYXBdKSB7XG4gICAgICByZXMgPSBqc29uT2JqW3BhcmFtU2V0cy51bndyYXBdO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzO1xufVxuXG5mdW5jdGlvbiBjaGVja1BhcmFtcyAocGFyYW1TZXRzLCBqc29uT2JqLCBwcm90b2NvbCkge1xuICBsZXQgcmVxdWlyZWRQYXJhbXMgPSBbXTtcbiAgbGV0IG9wdGlvbmFsUGFyYW1zID0gW107XG4gIGxldCByZWNlaXZlZFBhcmFtcyA9IF8ua2V5cyhqc29uT2JqKTtcblxuICBpZiAocGFyYW1TZXRzKSB7XG4gICAgaWYgKHBhcmFtU2V0cy5yZXF1aXJlZCkge1xuICAgICAgLy8gd2UgbWlnaHQgaGF2ZSBhbiBhcnJheSBvZiBwYXJhbWV0ZXJzLFxuICAgICAgLy8gb3IgYW4gYXJyYXkgb2YgYXJyYXlzIG9mIHBhcmFtZXRlcnMsIHNvIHN0YW5kYXJkaXplXG4gICAgICBpZiAoIV8uaXNBcnJheShfLmZpcnN0KHBhcmFtU2V0cy5yZXF1aXJlZCkpKSB7XG4gICAgICAgIHJlcXVpcmVkUGFyYW1zID0gW3BhcmFtU2V0cy5yZXF1aXJlZF07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXF1aXJlZFBhcmFtcyA9IHBhcmFtU2V0cy5yZXF1aXJlZDtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gb3B0aW9uYWwgcGFyYW1ldGVycyBhcmUganVzdCBhbiBhcnJheVxuICAgIGlmIChwYXJhbVNldHMub3B0aW9uYWwpIHtcbiAgICAgIG9wdGlvbmFsUGFyYW1zID0gcGFyYW1TZXRzLm9wdGlvbmFsO1xuICAgIH1cblxuICAgIC8vIElmIGEgZnVuY3Rpb24gd2FzIHByb3ZpZGVkIGFzIHRoZSAndmFsaWRhdGUnIGtleSwgaXQgd2lsbCBoZXJlIGJlIGNhbGxlZCB3aXRoXG4gICAgLy8ganNvbk9iaiBhcyB0aGUgcGFyYW0uIElmIGl0IHJldHVybnMgc29tZXRoaW5nIGZhbHN5LCB2ZXJpZmljYXRpb24gd2lsbCBiZVxuICAgIC8vIGNvbnNpZGVyZWQgdG8gaGF2ZSBwYXNzZWQuIElmIGl0IHJldHVybnMgc29tZXRoaW5nIGVsc2UsIHRoYXQgd2lsbCBiZSB0aGVcbiAgICAvLyBhcmd1bWVudCB0byBhbiBlcnJvciB3aGljaCBpcyB0aHJvd24gdG8gdGhlIHVzZXJcbiAgICBpZiAocGFyYW1TZXRzLnZhbGlkYXRlKSB7XG4gICAgICBsZXQgbWVzc2FnZSA9IHBhcmFtU2V0cy52YWxpZGF0ZShqc29uT2JqLCBwcm90b2NvbCk7XG4gICAgICBpZiAobWVzc2FnZSkge1xuICAgICAgICB0aHJvdyBuZXcgZXJyb3JzLkJhZFBhcmFtZXRlcnNFcnJvcihtZXNzYWdlLCBqc29uT2JqKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBpZiB3ZSBoYXZlIG5vIHJlcXVpcmVkIHBhcmFtZXRlcnMsIGFsbCBpcyB3ZWxsXG4gIGlmIChyZXF1aXJlZFBhcmFtcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBzb21lIGNsaWVudHMgcGFzcyBpbiB0aGUgc2Vzc2lvbiBpZCBpbiB0aGUgcGFyYW1zXG4gIGlmIChvcHRpb25hbFBhcmFtcy5pbmRleE9mKCdzZXNzaW9uSWQnKSA9PT0gLTEpIHtcbiAgICBvcHRpb25hbFBhcmFtcy5wdXNoKCdzZXNzaW9uSWQnKTtcbiAgfVxuXG4gIC8vIHNvbWUgY2xpZW50cyBwYXNzIGluIGFuIGVsZW1lbnQgaWQgaW4gdGhlIHBhcmFtc1xuICBpZiAob3B0aW9uYWxQYXJhbXMuaW5kZXhPZignaWQnKSA9PT0gLTEpIHtcbiAgICBvcHRpb25hbFBhcmFtcy5wdXNoKCdpZCcpO1xuICB9XG5cbiAgLy8gZ28gdGhyb3VnaCB0aGUgcmVxdWlyZWQgcGFyYW1ldGVycyBhbmQgY2hlY2sgYWdhaW5zdCBvdXIgYXJndW1lbnRzXG4gIGZvciAobGV0IHBhcmFtcyBvZiByZXF1aXJlZFBhcmFtcykge1xuICAgIGlmIChfLmRpZmZlcmVuY2UocmVjZWl2ZWRQYXJhbXMsIHBhcmFtcywgb3B0aW9uYWxQYXJhbXMpLmxlbmd0aCA9PT0gMCAmJlxuICAgICAgICBfLmRpZmZlcmVuY2UocGFyYW1zLCByZWNlaXZlZFBhcmFtcykubGVuZ3RoID09PSAwKSB7XG4gICAgICAvLyB3ZSBoYXZlIGEgc2V0IG9mIHBhcmFtZXRlcnMgdGhhdCBpcyBjb3JyZWN0XG4gICAgICAvLyBzbyBzaG9ydC1jaXJjdWl0XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG4gIHRocm93IG5ldyBlcnJvcnMuQmFkUGFyYW1ldGVyc0Vycm9yKHBhcmFtU2V0cywgcmVjZWl2ZWRQYXJhbXMpO1xufVxuXG4vKlxuICogVGhpcyBtZXRob2QgdGFrZXMgMyBwaWVjZXMgb2YgZGF0YTogcmVxdWVzdCBwYXJhbWV0ZXJzICgncmVxdWVzdFBhcmFtcycpLFxuICogYSByZXF1ZXN0IEpTT04gYm9keSAoJ2pzb25PYmonKSwgYW5kICdwYXlsb2FkUGFyYW1zJywgd2hpY2ggaXMgdGhlIHNlY3Rpb25cbiAqIGZyb20gdGhlIHJvdXRlIGRlZmluaXRpb24gZm9yIGEgcGFydGljdWxhciBlbmRwb2ludCB3aGljaCBoYXMgaW5zdHJ1Y3Rpb25zXG4gKiBvbiBoYW5kbGluZyBwYXJhbWV0ZXJzLiBUaGlzIG1ldGhvZCByZXR1cm5zIGFuIGFycmF5IG9mIGFyZ3VtZW50cyB3aGljaCB3aWxsXG4gKiBiZSBhcHBsaWVkIHRvIGEgY29tbWFuZC5cbiAqL1xuZnVuY3Rpb24gbWFrZUFyZ3MgKHJlcXVlc3RQYXJhbXMsIGpzb25PYmosIHBheWxvYWRQYXJhbXMsIHByb3RvY29sKSB7XG4gIC8vIFdlIHdhbnQgdG8gcGFzcyB0aGUgXCJ1cmxcIiBwYXJhbWV0ZXJzIHRvIHRoZSBjb21tYW5kcyBpbiByZXZlcnNlIG9yZGVyXG4gIC8vIHNpbmNlIHRoZSBjb21tYW5kIHdpbGwgc29tZXRpbWVzIHdhbnQgdG8gaWdub3JlLCBzYXksIHRoZSBzZXNzaW9uSWQuXG4gIC8vIFRoaXMgaGFzIHRoZSBlZmZlY3Qgb2YgcHV0dGluZyBzZXNzaW9uSWQgbGFzdCwgd2hpY2ggbWVhbnMgaW4gSlMgd2UgY2FuXG4gIC8vIG9taXQgaXQgZnJvbSB0aGUgZnVuY3Rpb24gc2lnbmF0dXJlIGlmIHdlJ3JlIG5vdCBnb2luZyB0byB1c2UgaXQuXG4gIGxldCB1cmxQYXJhbXMgPSBfLmtleXMocmVxdWVzdFBhcmFtcykucmV2ZXJzZSgpO1xuXG4gIC8vIEluIHRoZSBzaW1wbGUgY2FzZSwgdGhlIHJlcXVpcmVkIHBhcmFtZXRlcnMgYXJlIGEgYmFzaWMgYXJyYXkgaW5cbiAgLy8gcGF5bG9hZFBhcmFtcy5yZXF1aXJlZCwgc28gc3RhcnQgdGhlcmUuIEl0J3MgcG9zc2libGUgdGhhdCB0aGVyZSBhcmVcbiAgLy8gbXVsdGlwbGUgb3B0aW9uYWwgc2V0cyBvZiByZXF1aXJlZCBwYXJhbXMsIHRob3VnaCwgc28gaGFuZGxlIHRoYXQgY2FzZVxuICAvLyB0b28uXG4gIGxldCByZXF1aXJlZFBhcmFtcyA9IHBheWxvYWRQYXJhbXMucmVxdWlyZWQ7XG4gIGlmIChfLmlzQXJyYXkoXy5maXJzdChwYXlsb2FkUGFyYW1zLnJlcXVpcmVkKSkpIHtcbiAgICAvLyBJZiB0aGVyZSBhcmUgb3B0aW9uYWwgc2V0cyBvZiByZXF1aXJlZCBwYXJhbXMsIHRoZW4gd2Ugd2lsbCBoYXZlIGFuXG4gICAgLy8gYXJyYXkgb2YgYXJyYXlzIGluIHBheWxvYWRQYXJhbXMucmVxdWlyZWQsIHNvIGxvb3AgdGhyb3VnaCBlYWNoIHNldCBhbmRcbiAgICAvLyBwaWNrIHRoZSBvbmUgdGhhdCBtYXRjaGVzIHdoaWNoIEpTT04gcGFyYW1zIHdlcmUgYWN0dWFsbHkgc2VudC4gV2UndmVcbiAgICAvLyBhbHJlYWR5IGJlZW4gdGhyb3VnaCB2YWxpZGF0aW9uIHNvIHdlJ3JlIGd1YXJhbnRlZWQgdG8gZmluZCBhIG1hdGNoLlxuICAgIGxldCBrZXlzID0gXy5rZXlzKGpzb25PYmopO1xuICAgIGZvciAobGV0IHBhcmFtcyBvZiBwYXlsb2FkUGFyYW1zLnJlcXVpcmVkKSB7XG4gICAgICBpZiAoXy53aXRob3V0KHBhcmFtcywgLi4ua2V5cykubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJlcXVpcmVkUGFyYW1zID0gcGFyYW1zO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBOb3cgd2UgY29uc3RydWN0IG91ciBsaXN0IG9mIGFyZ3VtZW50cyB3aGljaCB3aWxsIGJlIHBhc3NlZCB0byB0aGUgY29tbWFuZFxuICBsZXQgYXJncztcbiAgaWYgKF8uaXNGdW5jdGlvbihwYXlsb2FkUGFyYW1zLm1ha2VBcmdzKSkge1xuICAgIC8vIEluIHRoZSByb3V0ZSBzcGVjLCBhIHBhcnRpY3VsYXIgcm91dGUgbWlnaHQgZGVmaW5lIGEgJ21ha2VBcmdzJyBmdW5jdGlvblxuICAgIC8vIGlmIGl0IHdhbnRzIGZ1bGwgY29udHJvbCBvdmVyIGhvdyB0byB0dXJuIEpTT04gcGFyYW1ldGVycyBpbnRvIGNvbW1hbmRcbiAgICAvLyBhcmd1bWVudHMuIFNvIHdlIHBhc3MgaXQgdGhlIEpTT04gcGFyYW1ldGVycyBhbmQgaXQgcmV0dXJucyBhbiBhcnJheVxuICAgIC8vIHdoaWNoIHdpbGwgYmUgYXBwbGllZCB0byB0aGUgaGFuZGxpbmcgY29tbWFuZC4gRm9yIGV4YW1wbGUgaWYgaXQgcmV0dXJuc1xuICAgIC8vIFsxLCAyLCAzXSwgd2Ugd2lsbCBjYWxsIGBjb21tYW5kKDEsIDIsIDMsIC4uLilgICh1cmwgcGFyYW1zIGFyZSBzZXBhcmF0ZVxuICAgIC8vIGZyb20gSlNPTiBwYXJhbXMgYW5kIGdldCBjb25jYXRlbmF0ZWQgYmVsb3cpLlxuICAgIGFyZ3MgPSBwYXlsb2FkUGFyYW1zLm1ha2VBcmdzKGpzb25PYmosIHByb3RvY29sKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBPdGhlcndpc2UsIGNvbGxlY3QgYWxsIHRoZSByZXF1aXJlZCBhbmQgb3B0aW9uYWwgcGFyYW1zIGFuZCBmbGF0dGVuIHRoZW1cbiAgICAvLyBpbnRvIGFuIGFyZ3VtZW50IGFycmF5XG4gICAgYXJncyA9IF8uZmxhdHRlbihyZXF1aXJlZFBhcmFtcykubWFwKChwKSA9PiBqc29uT2JqW3BdKTtcbiAgICBpZiAocGF5bG9hZFBhcmFtcy5vcHRpb25hbCkge1xuICAgICAgYXJncyA9IGFyZ3MuY29uY2F0KF8uZmxhdHRlbihwYXlsb2FkUGFyYW1zLm9wdGlvbmFsKS5tYXAoKHApID0+IGpzb25PYmpbcF0pKTtcbiAgICB9XG4gIH1cbiAgLy8gRmluYWxseSwgZ2V0IG91ciB1cmwgcGFyYW1zIChzZXNzaW9uIGlkLCBlbGVtZW50IGlkLCBldGMuLi4pIG9uIHRoZSBlbmQgb2ZcbiAgLy8gdGhlIGxpc3RcbiAgYXJncyA9IGFyZ3MuY29uY2F0KHVybFBhcmFtcy5tYXAoKHUpID0+IHJlcXVlc3RQYXJhbXNbdV0pKTtcbiAgcmV0dXJuIGFyZ3M7XG59XG5cbmZ1bmN0aW9uIHJvdXRlQ29uZmlndXJpbmdGdW5jdGlvbiAoZHJpdmVyKSB7XG4gIGlmICghZHJpdmVyLnNlc3Npb25FeGlzdHMpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0RyaXZlcnMgdXNlZCB3aXRoIE1KU09OV1AgbXVzdCBpbXBsZW1lbnQgYHNlc3Npb25FeGlzdHNgJyk7XG4gIH1cblxuICBpZiAoIShkcml2ZXIuZXhlY3V0ZUNvbW1hbmQgfHwgZHJpdmVyLmV4ZWN1dGUpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdEcml2ZXJzIHVzZWQgd2l0aCBNSlNPTldQIG11c3QgaW1wbGVtZW50IGBleGVjdXRlQ29tbWFuZGAgb3IgYGV4ZWN1dGVgJyk7XG4gIH1cblxuICAvLyByZXR1cm4gYSBmdW5jdGlvbiB3aGljaCB3aWxsIGFkZCBhbGwgdGhlIHJvdXRlcyB0byB0aGUgZHJpdmVyLiBIZXJlIGV4dHJhTWV0aG9kcyBtaWdodCBiZVxuICAvLyBwYXNzZWQgaW4gYXMgZGVmaW5lZCBieSBBcHBpdW0gcGx1Z2lucywgc28gd2UgbmVlZCB0byBhZGQgdGhvc2UgdG8gdGhlIGRlZmF1bHQgbGlzdFxuICByZXR1cm4gZnVuY3Rpb24gYWRkUm91dGVzIChhcHAsIHtiYXNlUGF0aCA9IERFRkFVTFRfQkFTRV9QQVRILCBleHRyYU1ldGhvZE1hcCA9IHt9fSkge1xuICAgIC8vIHN0b3JlIGJhc2VQYXRoIG9uIHRoZSBkcml2ZXIgaW5zdGFuY2Ugc28gaXQgY2FuIHVzZSBpdCBpZiBuZWNlc3NhcnlcbiAgICAvLyBmb3IgZXhhbXBsZSBpbiBkZXRlcm1pbmluZyBwcm94eSBhdm9pZGFuY2VcbiAgICBkcml2ZXIuYmFzZVBhdGggPSBiYXNlUGF0aDtcblxuICAgIGNvbnN0IGFsbE1ldGhvZHMgPSB7Li4uTUVUSE9EX01BUCwgLi4uZXh0cmFNZXRob2RNYXB9O1xuXG4gICAgZm9yIChjb25zdCBbcGF0aCwgbWV0aG9kc10gb2YgXy50b1BhaXJzKGFsbE1ldGhvZHMpKSB7XG4gICAgICBmb3IgKGNvbnN0IFttZXRob2QsIHNwZWNdIG9mIF8udG9QYWlycyhtZXRob2RzKSkge1xuICAgICAgICAvLyBzZXQgdXAgdGhlIGV4cHJlc3Mgcm91dGUgaGFuZGxlclxuICAgICAgICBidWlsZEhhbmRsZXIoYXBwLCBtZXRob2QsIGAke2Jhc2VQYXRofSR7cGF0aH1gLCBzcGVjLCBkcml2ZXIsIGlzU2Vzc2lvbkNvbW1hbmQoc3BlYy5jb21tYW5kKSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xufVxuXG5mdW5jdGlvbiBidWlsZEhhbmRsZXIgKGFwcCwgbWV0aG9kLCBwYXRoLCBzcGVjLCBkcml2ZXIsIGlzU2Vzc0NtZCkge1xuICBsZXQgYXN5bmNIYW5kbGVyID0gYXN5bmMgKHJlcSwgcmVzKSA9PiB7XG4gICAgbGV0IGpzb25PYmogPSByZXEuYm9keTtcbiAgICBsZXQgaHR0cFJlc0JvZHkgPSB7fTtcbiAgICBsZXQgaHR0cFN0YXR1cyA9IDIwMDtcbiAgICBsZXQgbmV3U2Vzc2lvbklkO1xuICAgIGxldCBjdXJyZW50UHJvdG9jb2wgPSBleHRyYWN0UHJvdG9jb2woZHJpdmVyLCByZXEucGFyYW1zLnNlc3Npb25JZCk7XG5cbiAgICB0cnkge1xuICAgICAgLy8gaWYgdGhpcyBpcyBhIHNlc3Npb24gY29tbWFuZCBidXQgd2UgZG9uJ3QgaGF2ZSBhIHNlc3Npb24sXG4gICAgICAvLyBlcnJvciBvdXQgZWFybHkgKGVzcGVjaWFsbHkgYmVmb3JlIHByb3h5aW5nKVxuICAgICAgaWYgKGlzU2Vzc0NtZCAmJiAhZHJpdmVyLnNlc3Npb25FeGlzdHMocmVxLnBhcmFtcy5zZXNzaW9uSWQpKSB7XG4gICAgICAgIHRocm93IG5ldyBlcnJvcnMuTm9TdWNoRHJpdmVyRXJyb3IoKTtcbiAgICAgIH1cblxuICAgICAgLy8gaWYgdGhlIGRyaXZlciBpcyBjdXJyZW50bHkgcHJveHlpbmcgY29tbWFuZHMgdG8gYW5vdGhlciBKU09OV1Agc2VydmVyLCBieXBhc3MgYWxsIG91clxuICAgICAgLy8gY2hlY2tzIGFuZCBhc3N1bWUgdGhlIHVwc3RyZWFtIHNlcnZlciBrbm93cyB3aGF0IGl0J3MgZG9pbmcuIEJ1dCBrZWVwIHRoaXMgaW4gdGhlXG4gICAgICAvLyB0cnkvY2F0Y2ggYmxvY2sgc28gaWYgcHJveHlpbmcgaXRzZWxmIGZhaWxzLCB3ZSBnaXZlIGEgbWVzc2FnZSB0byB0aGUgY2xpZW50LiBPZiBjb3Vyc2Ugd2VcbiAgICAgIC8vIG9ubHkgd2FudCB0byBkbyB0aGVzZSB3aGVuIHdlIGhhdmUgYSBzZXNzaW9uIGNvbW1hbmQ7IHRoZSBBcHBpdW0gZHJpdmVyIG11c3QgYmVcbiAgICAgIC8vIHJlc3BvbnNpYmxlIGZvciBzdGFydC9zdG9wIHNlc3Npb24sIGV0Yy4uLiBXZSBhbHNvIGFsbG93IHRoZSBjb21tYW5kIHNwZWMgdG8gZGVjbGFyZSB0aGF0XG4gICAgICAvLyB0aGlzIGNvbW1hbmQgc2hvdWxkIG5ldmVyIGJlIHByb3hpZWQgKHdoaWNoIGlzIHVzZWZ1bCBmb3IgcGx1Z2luIGRldmVsb3BlcnMgd2hvIGFkZFxuICAgICAgLy8gY29tbWFuZHMgYW5kIGdlbmVyYWxseSB3b3VsZCBub3Qgd2FudCB0aGF0IGNvbW1hbmQgdG8gYmUgcHJveGllZCBpbnN0ZWFkIG9mIGhhbmRsZWQgYnkgdGhlXG4gICAgICAvLyBwbHVnaW4pXG4gICAgICBsZXQgZGlkUGx1Z2luT3ZlcnJpZGVQcm94eSA9IGZhbHNlO1xuICAgICAgaWYgKGlzU2Vzc0NtZCAmJiAhc3BlYy5uZXZlclByb3h5ICYmIGRyaXZlclNob3VsZERvSndwUHJveHkoZHJpdmVyLCByZXEsIHNwZWMuY29tbWFuZCkpIHtcbiAgICAgICAgaWYgKCFkcml2ZXIucGx1Z2luc1RvSGFuZGxlQ21kIHx8XG4gICAgICAgICAgICBkcml2ZXIucGx1Z2luc1RvSGFuZGxlQ21kKHNwZWMuY29tbWFuZCwgcmVxLnBhcmFtcy5zZXNzaW9uSWQpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIGF3YWl0IGRvSndwUHJveHkoZHJpdmVyLCByZXEsIHJlcyk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIFNFU1NJT05TX0NBQ0hFLmdldExvZ2dlcihyZXEucGFyYW1zLnNlc3Npb25JZCwgY3VycmVudFByb3RvY29sKS5kZWJ1ZyhgV291bGQgaGF2ZSBwcm94aWVkIGAgK1xuICAgICAgICAgIGBjb21tYW5kIGRpcmVjdGx5LCBidXQgYSBwbHVnaW4gZXhpc3RzIHdoaWNoIG1pZ2h0IHJlcXVpcmUgaXRzIHZhbHVlLCBzbyB3aWxsIGxldCBgICtcbiAgICAgICAgICBgaXRzIHZhbHVlIGJlIGNvbGxlY3RlZCBpbnRlcm5hbGx5IGFuZCBtYWRlIHBhcnQgb2YgcGx1Z2luIGNoYWluYCk7XG4gICAgICAgIGRpZFBsdWdpbk92ZXJyaWRlUHJveHkgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBpZiBhIGNvbW1hbmQgaXMgbm90IGluIG91ciBtZXRob2QgbWFwLCBpdCdzIGJlY2F1c2Ugd2VcbiAgICAgIC8vIGhhdmUgbm8gcGxhbnMgdG8gZXZlciBpbXBsZW1lbnQgaXRcbiAgICAgIGlmICghc3BlYy5jb21tYW5kKSB7XG4gICAgICAgIHRocm93IG5ldyBlcnJvcnMuTm90SW1wbGVtZW50ZWRFcnJvcigpO1xuICAgICAgfVxuXG4gICAgICAvLyB3cmFwIHBhcmFtcyBpZiBuZWNlc3NhcnlcbiAgICAgIGlmIChzcGVjLnBheWxvYWRQYXJhbXMgJiYgc3BlYy5wYXlsb2FkUGFyYW1zLndyYXApIHtcbiAgICAgICAganNvbk9iaiA9IHdyYXBQYXJhbXMoc3BlYy5wYXlsb2FkUGFyYW1zLCBqc29uT2JqKTtcbiAgICAgIH1cblxuICAgICAgLy8gdW53cmFwIHBhcmFtcyBpZiBuZWNlc3NhcnlcbiAgICAgIGlmIChzcGVjLnBheWxvYWRQYXJhbXMgJiYgc3BlYy5wYXlsb2FkUGFyYW1zLnVud3JhcCkge1xuICAgICAgICBqc29uT2JqID0gdW53cmFwUGFyYW1zKHNwZWMucGF5bG9hZFBhcmFtcywganNvbk9iaik7XG4gICAgICB9XG5cbiAgICAgIGlmIChzcGVjLmNvbW1hbmQgPT09IENSRUFURV9TRVNTSU9OX0NPTU1BTkQpIHtcbiAgICAgICAgLy8gdHJ5IHRvIGRldGVybWluZSBwcm90b2NvbCBieSBzZXNzaW9uIGNyZWF0aW9uIGFyZ3MsIHNvIHdlIGNhbiB0aHJvdyBhXG4gICAgICAgIC8vIHByb3Blcmx5IGZvcm1hdHRlZCBlcnJvciBpZiBhcmd1bWVudHMgdmFsaWRhdGlvbiBmYWlsc1xuICAgICAgICBjdXJyZW50UHJvdG9jb2wgPSBkZXRlcm1pbmVQcm90b2NvbCguLi5tYWtlQXJncyhyZXEucGFyYW1zLCBqc29uT2JqLCBzcGVjLnBheWxvYWRQYXJhbXMgfHwge30pKTtcbiAgICAgIH1cblxuICAgICAgLy8gZW5zdXJlIHRoYXQgdGhlIGpzb24gcGF5bG9hZCBjb25mb3JtcyB0byB0aGUgc3BlY1xuICAgICAgY2hlY2tQYXJhbXMoc3BlYy5wYXlsb2FkUGFyYW1zLCBqc29uT2JqLCBjdXJyZW50UHJvdG9jb2wpO1xuXG4gICAgICAvLyB0dXJuIHRoZSBjb21tYW5kIGFuZCBqc29uIHBheWxvYWQgaW50byBhbiBhcmd1bWVudCBsaXN0IGZvclxuICAgICAgLy8gdGhlIGRyaXZlciBtZXRob2RzXG4gICAgICBsZXQgYXJncyA9IG1ha2VBcmdzKHJlcS5wYXJhbXMsIGpzb25PYmosIHNwZWMucGF5bG9hZFBhcmFtcyB8fCB7fSwgY3VycmVudFByb3RvY29sKTtcbiAgICAgIGxldCBkcml2ZXJSZXM7XG4gICAgICAvLyB2YWxpZGF0ZSBjb21tYW5kIGFyZ3MgYWNjb3JkaW5nIHRvIE1KU09OV1BcbiAgICAgIGlmICh2YWxpZGF0b3JzW3NwZWMuY29tbWFuZF0pIHtcbiAgICAgICAgdmFsaWRhdG9yc1tzcGVjLmNvbW1hbmRdKC4uLmFyZ3MpO1xuICAgICAgfVxuXG4gICAgICAvLyBydW4gdGhlIGRyaXZlciBjb21tYW5kIHdyYXBwZWQgaW5zaWRlIHRoZSBhcmd1bWVudCB2YWxpZGF0b3JzXG4gICAgICBTRVNTSU9OU19DQUNIRS5nZXRMb2dnZXIocmVxLnBhcmFtcy5zZXNzaW9uSWQsIGN1cnJlbnRQcm90b2NvbCkuZGVidWcoYENhbGxpbmcgYCArXG4gICAgICAgIGAke2RyaXZlci5jb25zdHJ1Y3Rvci5uYW1lfS4ke3NwZWMuY29tbWFuZH0oKSB3aXRoIGFyZ3M6IGAgK1xuICAgICAgICBfLnRydW5jYXRlKEpTT04uc3RyaW5naWZ5KGFyZ3MpLCB7bGVuZ3RoOiBNQVhfTE9HX0JPRFlfTEVOR1RIfSkpO1xuXG4gICAgICBpZiAoZGlkUGx1Z2luT3ZlcnJpZGVQcm94eSkge1xuICAgICAgICAvLyBUT0RPIGZvciBub3cgd2UgYWRkIHRoaXMgaW5mb3JtYXRpb24gb24gdGhlIGFyZ3MgbGlzdCwgYnV0IHRoYXQncyBtaXhpbmcgcHVycG9zZXMgaGVyZS5cbiAgICAgICAgLy8gV2UgcmVhbGx5IHNob3VsZCBhZGQgYW5vdGhlciAnb3B0aW9ucycgcGFyYW1ldGVyIHRvICdleGVjdXRlQ29tbWFuZCcsIGJ1dCB0aGlzIHdvdWxkIGJlXG4gICAgICAgIC8vIGEgYnJlYWtpbmcgY2hhbmdlIGZvciBhbGwgZHJpdmVycyBzbyB3b3VsZCBuZWVkIHRvIGJlIGhhbmRsZWQgY2FyZWZ1bGx5LlxuICAgICAgICBhcmdzLnB1c2goe3JlcUZvclByb3h5OiByZXF9KTtcbiAgICAgIH1cblxuICAgICAgZHJpdmVyUmVzID0gYXdhaXQgZHJpdmVyLmV4ZWN1dGVDb21tYW5kKHNwZWMuY29tbWFuZCwgLi4uYXJncyk7XG5cbiAgICAgIC8vIEdldCB0aGUgcHJvdG9jb2wgYWZ0ZXIgZXhlY3V0ZUNvbW1hbmRcbiAgICAgIGN1cnJlbnRQcm90b2NvbCA9IGV4dHJhY3RQcm90b2NvbChkcml2ZXIsIHJlcS5wYXJhbXMuc2Vzc2lvbklkKSB8fCBjdXJyZW50UHJvdG9jb2w7XG5cbiAgICAgIC8vIElmIGBleGVjdXRlQ29tbWFuZGAgd2FzIG92ZXJyaWRkZW4gYW5kIHRoZSBtZXRob2QgcmV0dXJucyBhbiBvYmplY3RcbiAgICAgIC8vIHdpdGggYSBwcm90b2NvbCBhbmQgdmFsdWUvZXJyb3IgcHJvcGVydHksIHJlLWFzc2lnbiB0aGUgcHJvdG9jb2xcbiAgICAgIGlmIChfLmlzUGxhaW5PYmplY3QoZHJpdmVyUmVzKSAmJiBfLmhhcyhkcml2ZXJSZXMsICdwcm90b2NvbCcpKSB7XG4gICAgICAgIGN1cnJlbnRQcm90b2NvbCA9IGRyaXZlclJlcy5wcm90b2NvbCB8fCBjdXJyZW50UHJvdG9jb2w7XG4gICAgICAgIGlmIChkcml2ZXJSZXMuZXJyb3IpIHtcbiAgICAgICAgICB0aHJvdyBkcml2ZXJSZXMuZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgZHJpdmVyUmVzID0gZHJpdmVyUmVzLnZhbHVlO1xuICAgICAgfVxuXG4gICAgICAvLyB1bnBhY2sgY3JlYXRlU2Vzc2lvbiByZXNwb25zZVxuICAgICAgaWYgKHNwZWMuY29tbWFuZCA9PT0gQ1JFQVRFX1NFU1NJT05fQ09NTUFORCkge1xuICAgICAgICBuZXdTZXNzaW9uSWQgPSBkcml2ZXJSZXNbMF07XG4gICAgICAgIFNFU1NJT05TX0NBQ0hFLnB1dFNlc3Npb24obmV3U2Vzc2lvbklkLCBjdXJyZW50UHJvdG9jb2wpO1xuICAgICAgICBTRVNTSU9OU19DQUNIRS5nZXRMb2dnZXIobmV3U2Vzc2lvbklkLCBjdXJyZW50UHJvdG9jb2wpXG4gICAgICAgICAgLmRlYnVnKGBDYWNoZWQgdGhlIHByb3RvY29sIHZhbHVlICcke2N1cnJlbnRQcm90b2NvbH0nIGZvciB0aGUgbmV3IHNlc3Npb24gJHtuZXdTZXNzaW9uSWR9YCk7XG4gICAgICAgIGlmIChjdXJyZW50UHJvdG9jb2wgPT09IFBST1RPQ09MUy5NSlNPTldQKSB7XG4gICAgICAgICAgZHJpdmVyUmVzID0gZHJpdmVyUmVzWzFdO1xuICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRQcm90b2NvbCA9PT0gUFJPVE9DT0xTLlczQykge1xuICAgICAgICAgIGRyaXZlclJlcyA9IHtcbiAgICAgICAgICAgIGNhcGFiaWxpdGllczogZHJpdmVyUmVzWzFdLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZHJpdmVyUmVzID0gZm9ybWF0UmVzcG9uc2VWYWx1ZShkcml2ZXJSZXMpO1xuXG4gICAgICAvLyBkZWxldGUgc2hvdWxkIG5vdCByZXR1cm4gYW55dGhpbmcgZXZlbiBpZiBzdWNjZXNzZnVsXG4gICAgICBpZiAoc3BlYy5jb21tYW5kID09PSBERUxFVEVfU0VTU0lPTl9DT01NQU5EKSB7XG4gICAgICAgIFNFU1NJT05TX0NBQ0hFLmdldExvZ2dlcihyZXEucGFyYW1zLnNlc3Npb25JZCwgY3VycmVudFByb3RvY29sKVxuICAgICAgICAgIC5kZWJ1ZyhgUmVjZWl2ZWQgcmVzcG9uc2U6ICR7Xy50cnVuY2F0ZShKU09OLnN0cmluZ2lmeShkcml2ZXJSZXMpLCB7bGVuZ3RoOiBNQVhfTE9HX0JPRFlfTEVOR1RIfSl9YCk7XG4gICAgICAgIFNFU1NJT05TX0NBQ0hFLmdldExvZ2dlcihyZXEucGFyYW1zLnNlc3Npb25JZCwgY3VycmVudFByb3RvY29sKS5kZWJ1ZygnQnV0IGRlbGV0aW5nIHNlc3Npb24sIHNvIG5vdCByZXR1cm5pbmcnKTtcbiAgICAgICAgZHJpdmVyUmVzID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgLy8gaWYgdGhlIHN0YXR1cyBpcyBub3QgMCwgIHRocm93IHRoZSBhcHByb3ByaWF0ZSBlcnJvciBmb3Igc3RhdHVzIGNvZGUuXG4gICAgICBpZiAodXRpbC5oYXNWYWx1ZShkcml2ZXJSZXMpKSB7XG4gICAgICAgIGlmICh1dGlsLmhhc1ZhbHVlKGRyaXZlclJlcy5zdGF0dXMpICYmICFpc05hTihkcml2ZXJSZXMuc3RhdHVzKSAmJiBwYXJzZUludChkcml2ZXJSZXMuc3RhdHVzLCAxMCkgIT09IDApIHtcbiAgICAgICAgICB0aHJvdyBlcnJvckZyb21NSlNPTldQU3RhdHVzQ29kZShkcml2ZXJSZXMuc3RhdHVzLCBkcml2ZXJSZXMudmFsdWUpO1xuICAgICAgICB9IGVsc2UgaWYgKF8uaXNQbGFpbk9iamVjdChkcml2ZXJSZXMudmFsdWUpICYmIGRyaXZlclJlcy52YWx1ZS5lcnJvcikge1xuICAgICAgICAgIHRocm93IGVycm9yRnJvbVczQ0pzb25Db2RlKGRyaXZlclJlcy52YWx1ZS5lcnJvciwgZHJpdmVyUmVzLnZhbHVlLm1lc3NhZ2UsIGRyaXZlclJlcy52YWx1ZS5zdGFja3RyYWNlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBodHRwUmVzQm9keS52YWx1ZSA9IGRyaXZlclJlcztcbiAgICAgIFNFU1NJT05TX0NBQ0hFLmdldExvZ2dlcihyZXEucGFyYW1zLnNlc3Npb25JZCB8fCBuZXdTZXNzaW9uSWQsIGN1cnJlbnRQcm90b2NvbCkuZGVidWcoYFJlc3BvbmRpbmcgYCArXG4gICAgICAgIGB0byBjbGllbnQgd2l0aCBkcml2ZXIuJHtzcGVjLmNvbW1hbmR9KCkgcmVzdWx0OiAke18udHJ1bmNhdGUoSlNPTi5zdHJpbmdpZnkoZHJpdmVyUmVzKSwge2xlbmd0aDogTUFYX0xPR19CT0RZX0xFTkdUSH0pfWApO1xuXG4gICAgICBpZiAoc3BlYy5jb21tYW5kID09PSBERUxFVEVfU0VTU0lPTl9DT01NQU5EKSB7XG4gICAgICAgIC8vIFdlIGRvbid0IHdhbnQgdG8ga2VlcCB0aGUgbG9nZ2VyIGluc3RhbmNlIGluIHRoZSBjYWNoZVxuICAgICAgICAvLyBhZnRlciB0aGUgc2Vzc2lvbiBpcyBkZWxldGVkLCBiZWNhdXNlIGl0IGNvbnRhaW5zIHRoZSBsb2dnaW5nIGhpc3RvcnlcbiAgICAgICAgLy8gYW5kIGNvbnN1bWVzIHRoZSBtZW1vcnlcbiAgICAgICAgU0VTU0lPTlNfQ0FDSEUucmVzZXRMb2dnZXIocmVxLnBhcmFtcy5zZXNzaW9uSWQpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgLy8gaWYgYW55dGhpbmcgZ29lcyB3cm9uZywgZmlndXJlIG91dCB3aGF0IG91ciByZXNwb25zZSBzaG91bGQgYmVcbiAgICAgIC8vIGJhc2VkIG9uIHRoZSB0eXBlIG9mIGVycm9yIHRoYXQgd2UgZW5jb3VudGVyZWRcbiAgICAgIGxldCBhY3R1YWxFcnIgPSBlcnI7XG5cbiAgICAgIGN1cnJlbnRQcm90b2NvbCA9IGN1cnJlbnRQcm90b2NvbCB8fCBleHRyYWN0UHJvdG9jb2woZHJpdmVyLCByZXEucGFyYW1zLnNlc3Npb25JZCB8fCBuZXdTZXNzaW9uSWQpO1xuXG4gICAgICBsZXQgZXJyTXNnID0gZXJyLnN0YWNrdHJhY2UgfHwgZXJyLnN0YWNrO1xuICAgICAgaWYgKCFfLmluY2x1ZGVzKGVyck1zZywgZXJyLm1lc3NhZ2UpKSB7XG4gICAgICAgIC8vIGlmIHRoZSBtZXNzYWdlIGhhcyBtb3JlIGluZm9ybWF0aW9uLCBhZGQgaXQuIGJ1dCBvZnRlbiB0aGUgbWVzc2FnZVxuICAgICAgICAvLyBpcyB0aGUgZmlyc3QgcGFydCBvZiB0aGUgc3RhY2sgdHJhY2VcbiAgICAgICAgZXJyTXNnID0gYCR7ZXJyLm1lc3NhZ2V9JHtlcnJNc2cgPyAoJ1xcbicgKyBlcnJNc2cpIDogJyd9YDtcbiAgICAgIH1cbiAgICAgIGlmIChpc0Vycm9yVHlwZShlcnIsIGVycm9ycy5Qcm94eVJlcXVlc3RFcnJvcikpIHtcbiAgICAgICAgYWN0dWFsRXJyID0gZXJyLmdldEFjdHVhbEVycm9yKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBTRVNTSU9OU19DQUNIRS5nZXRMb2dnZXIocmVxLnBhcmFtcy5zZXNzaW9uSWQgfHwgbmV3U2Vzc2lvbklkLCBjdXJyZW50UHJvdG9jb2wpXG4gICAgICAgICAgLmRlYnVnKGBFbmNvdW50ZXJlZCBpbnRlcm5hbCBlcnJvciBydW5uaW5nIGNvbW1hbmQ6ICR7ZXJyTXNnfWApO1xuICAgICAgfVxuXG4gICAgICBbaHR0cFN0YXR1cywgaHR0cFJlc0JvZHldID0gZ2V0UmVzcG9uc2VGb3JXM0NFcnJvcihhY3R1YWxFcnIpO1xuICAgIH1cblxuICAgIC8vIGRlY29kZSB0aGUgcmVzcG9uc2UsIHdoaWNoIGlzIGVpdGhlciBhIHN0cmluZyBvciBqc29uXG4gICAgaWYgKF8uaXNTdHJpbmcoaHR0cFJlc0JvZHkpKSB7XG4gICAgICByZXMuc3RhdHVzKGh0dHBTdGF0dXMpLnNlbmQoaHR0cFJlc0JvZHkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAobmV3U2Vzc2lvbklkKSB7XG4gICAgICAgIGlmIChjdXJyZW50UHJvdG9jb2wgPT09IFBST1RPQ09MUy5XM0MpIHtcbiAgICAgICAgICBodHRwUmVzQm9keS52YWx1ZS5zZXNzaW9uSWQgPSBuZXdTZXNzaW9uSWQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaHR0cFJlc0JvZHkuc2Vzc2lvbklkID0gbmV3U2Vzc2lvbklkO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBodHRwUmVzQm9keS5zZXNzaW9uSWQgPSByZXEucGFyYW1zLnNlc3Npb25JZCB8fCBudWxsO1xuICAgICAgfVxuICAgICAgLy8gRG9uJ3QgaW5jbHVkZSBzZXNzaW9uSWQgaW4gVzNDIHJlc3BvbnNlc1xuICAgICAgaWYgKGN1cnJlbnRQcm90b2NvbCA9PT0gUFJPVE9DT0xTLlczQykge1xuICAgICAgICBkZWxldGUgaHR0cFJlc0JvZHkuc2Vzc2lvbklkO1xuICAgICAgfVxuXG4gICAgICBodHRwUmVzQm9keSA9IGZvcm1hdFN0YXR1cyhodHRwUmVzQm9keSk7XG4gICAgICByZXMuc3RhdHVzKGh0dHBTdGF0dXMpLmpzb24oaHR0cFJlc0JvZHkpO1xuICAgIH1cbiAgfTtcbiAgLy8gYWRkIHRoZSBtZXRob2QgdG8gdGhlIGFwcFxuICBhcHBbbWV0aG9kLnRvTG93ZXJDYXNlKCldKHBhdGgsIChyZXEsIHJlcykgPT4ge1xuICAgIEIucmVzb2x2ZShhc3luY0hhbmRsZXIocmVxLCByZXMpKS5kb25lKCk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBkcml2ZXJTaG91bGREb0p3cFByb3h5IChkcml2ZXIsIHJlcSwgY29tbWFuZCkge1xuICAvLyBkcml2ZXJzIG5lZWQgdG8gZXhwbGljaXRseSBzYXkgd2hlbiB0aGUgcHJveHkgaXMgYWN0aXZlXG4gIGlmICghZHJpdmVyLnByb3h5QWN0aXZlKHJlcS5wYXJhbXMuc2Vzc2lvbklkKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIHdlIHNob3VsZCBuZXZlciBwcm94eSBkZWxldGVTZXNzaW9uIGJlY2F1c2Ugd2UgbmVlZCB0byBnaXZlIHRoZSBjb250YWluaW5nXG4gIC8vIGRyaXZlciBhbiBvcHBvcnR1bml0eSB0byBjbGVhbiBpdHNlbGYgdXBcbiAgaWYgKGNvbW1hbmQgPT09IERFTEVURV9TRVNTSU9OX0NPTU1BTkQpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyB2YWxpZGF0ZSBhdm9pZGFuY2Ugc2NoZW1hLCBhbmQgc2F5IHdlIHNob3VsZG4ndCBwcm94eSBpZiBhbnl0aGluZyBpbiB0aGVcbiAgLy8gYXZvaWQgbGlzdCBtYXRjaGVzIG91ciByZXFcbiAgaWYgKGRyaXZlci5wcm94eVJvdXRlSXNBdm9pZGVkKHJlcS5wYXJhbXMuc2Vzc2lvbklkLCByZXEubWV0aG9kLCByZXEub3JpZ2luYWxVcmwsIHJlcS5ib2R5KSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5hc3luYyBmdW5jdGlvbiBkb0p3cFByb3h5IChkcml2ZXIsIHJlcSwgcmVzKSB7XG4gIFNFU1NJT05TX0NBQ0hFLmdldExvZ2dlcihyZXEucGFyYW1zLnNlc3Npb25JZCwgZXh0cmFjdFByb3RvY29sKGRyaXZlciwgcmVxLnBhcmFtcy5zZXNzaW9uSWQpKVxuICAgIC5pbmZvKCdEcml2ZXIgcHJveHkgYWN0aXZlLCBwYXNzaW5nIHJlcXVlc3Qgb24gdmlhIEhUVFAgcHJveHknKTtcblxuICAvLyBjaGVjayB0aGF0IHRoZSBpbm5lciBkcml2ZXIgaGFzIGEgcHJveHkgZnVuY3Rpb25cbiAgaWYgKCFkcml2ZXIuY2FuUHJveHkocmVxLnBhcmFtcy5zZXNzaW9uSWQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdUcnlpbmcgdG8gcHJveHkgdG8gYSBzZXJ2ZXIgYnV0IHRoZSBkcml2ZXIgaXMgdW5hYmxlIHRvIHByb3h5Jyk7XG4gIH1cbiAgdHJ5IHtcbiAgICBhd2FpdCBkcml2ZXIuZXhlY3V0ZUNvbW1hbmQoJ3Byb3h5UmVxUmVzJywgcmVxLCByZXMsIHJlcS5wYXJhbXMuc2Vzc2lvbklkKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgaWYgKGlzRXJyb3JUeXBlKGVyciwgZXJyb3JzLlByb3h5UmVxdWVzdEVycm9yKSkge1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBwcm94eS4gUHJveHkgZXJyb3I6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgfVxuICB9XG59XG5cblxuZXhwb3J0IHtcbiAgUHJvdG9jb2wsIHJvdXRlQ29uZmlndXJpbmdGdW5jdGlvbiwgaXNTZXNzaW9uQ29tbWFuZCxcbiAgZHJpdmVyU2hvdWxkRG9Kd3BQcm94eSwgZGV0ZXJtaW5lUHJvdG9jb2wsIENSRUFURV9TRVNTSU9OX0NPTU1BTkQsXG4gIERFTEVURV9TRVNTSU9OX0NPTU1BTkQsIEdFVF9TVEFUVVNfQ09NTUFORCxcbn07XG4iXSwiZmlsZSI6ImxpYi9wcm90b2NvbC9wcm90b2NvbC5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLi8uLiJ9