@ditojs/server 0.272.0 → 0.275.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (78) hide show
  1. package/lib/app/Application.js +48 -8
  2. package/lib/app/SessionStore.js +3 -1
  3. package/lib/app/Validator.js +13 -1
  4. package/lib/app/index.js +7 -1
  5. package/lib/cli/console.js +14 -4
  6. package/lib/cli/db/createMigration.js +16 -4
  7. package/lib/cli/db/index.js +7 -1
  8. package/lib/cli/db/migrate.js +3 -3
  9. package/lib/cli/db/reset.js +3 -3
  10. package/lib/cli/db/rollback.js +3 -3
  11. package/lib/cli/db/seed.js +14 -6
  12. package/lib/cli/db/unlock.js +3 -3
  13. package/lib/cli/index.js +9 -5
  14. package/lib/controllers/AdminController.js +12 -2
  15. package/lib/controllers/CollectionController.js +15 -1
  16. package/lib/controllers/Controller.js +28 -4
  17. package/lib/controllers/ControllerAction.js +23 -14
  18. package/lib/controllers/RelationController.js +9 -3
  19. package/lib/controllers/UserController.js +15 -1
  20. package/lib/controllers/index.js +7 -1
  21. package/lib/decorators/index.js +7 -1
  22. package/lib/decorators/parameters.js +3 -1
  23. package/lib/decorators/returns.js +3 -1
  24. package/lib/errors/DatabaseError.js +5 -19
  25. package/lib/errors/ResponseError.js +4 -16
  26. package/lib/errors/index.js +7 -1
  27. package/lib/graph/DitoGraphProcessor.js +5 -1
  28. package/lib/graph/expression.js +5 -1
  29. package/lib/graph/graph.js +18 -2
  30. package/lib/graph/index.js +7 -1
  31. package/lib/index.js +7 -1
  32. package/lib/lib/index.js +7 -1
  33. package/lib/middleware/findRoute.js +7 -1
  34. package/lib/middleware/index.js +7 -1
  35. package/lib/middleware/logRequests.js +4 -4
  36. package/lib/mixins/AssetMixin.js +4 -4
  37. package/lib/mixins/SessionMixin.js +4 -4
  38. package/lib/mixins/TimeStampedMixin.js +4 -4
  39. package/lib/mixins/UserMixin.js +10 -4
  40. package/lib/mixins/index.js +7 -1
  41. package/lib/models/Model.js +21 -4
  42. package/lib/models/definitions/filters.js +9 -1
  43. package/lib/models/definitions/properties.js +7 -1
  44. package/lib/models/definitions/scopes.js +9 -1
  45. package/lib/models/index.js +7 -1
  46. package/lib/query/QueryBuilder.js +11 -1
  47. package/lib/query/QueryFilters.js +11 -1
  48. package/lib/query/index.js +7 -1
  49. package/lib/schema/formats/index.js +7 -1
  50. package/lib/schema/index.js +10 -2
  51. package/lib/schema/keywords/index.js +7 -1
  52. package/lib/schema/properties.js +11 -1
  53. package/lib/schema/relations.js +18 -4
  54. package/lib/services/index.js +7 -1
  55. package/lib/storage/DiskStorage.js +7 -1
  56. package/lib/storage/Storage.js +5 -1
  57. package/lib/storage/index.js +7 -1
  58. package/lib/utils/emitter.js +5 -1
  59. package/lib/utils/index.js +7 -1
  60. package/lib/utils/object.js +9 -3
  61. package/package.json +31 -31
  62. package/src/app/Application.js +39 -9
  63. package/src/cli/console.js +3 -3
  64. package/src/cli/db/createMigration.js +3 -3
  65. package/src/cli/db/migrate.js +4 -4
  66. package/src/cli/db/reset.js +4 -4
  67. package/src/cli/db/rollback.js +4 -4
  68. package/src/cli/db/seed.js +6 -6
  69. package/src/cli/db/unlock.js +2 -2
  70. package/src/cli/index.js +3 -3
  71. package/src/controllers/AdminController.js +1 -1
  72. package/src/controllers/Controller.js +8 -8
  73. package/src/controllers/ControllerAction.js +7 -13
  74. package/src/controllers/RelationController.js +2 -2
  75. package/src/errors/DatabaseError.js +2 -23
  76. package/src/errors/ResponseError.js +1 -9
  77. package/src/middleware/logRequests.js +9 -9
  78. package/src/models/Model.js +10 -8
@@ -3,6 +3,26 @@
3
3
  exports.__esModule = true;
4
4
  exports.Application = void 0;
5
5
 
6
+ require("core-js/modules/esnext.async-iterator.filter.js");
7
+
8
+ require("core-js/modules/esnext.iterator.constructor.js");
9
+
10
+ require("core-js/modules/esnext.iterator.filter.js");
11
+
12
+ require("core-js/modules/es.error.cause.js");
13
+
14
+ require("core-js/modules/esnext.async-iterator.reduce.js");
15
+
16
+ require("core-js/modules/esnext.iterator.reduce.js");
17
+
18
+ require("core-js/modules/esnext.async-iterator.find.js");
19
+
20
+ require("core-js/modules/esnext.iterator.find.js");
21
+
22
+ require("core-js/modules/esnext.async-iterator.map.js");
23
+
24
+ require("core-js/modules/esnext.iterator.map.js");
25
+
6
26
  var _koa = _interopRequireDefault(require("koa"));
7
27
 
8
28
  var _knex2 = _interopRequireDefault(require("knex"));
@@ -11,7 +31,7 @@ var _util = _interopRequireDefault(require("util"));
11
31
 
12
32
  var _axios = _interopRequireDefault(require("axios"));
13
33
 
14
- var _chalk = _interopRequireDefault(require("chalk"));
34
+ var _picocolors = _interopRequireDefault(require("picocolors"));
15
35
 
16
36
  var _zlib = _interopRequireDefault(require("zlib"));
17
37
 
@@ -181,7 +201,7 @@ class Application extends _koa.default {
181
201
  }
182
202
 
183
203
  if (Object.keys(data).length > 0) {
184
- console.info(_chalk.default.yellow.bold(`\n${modelClass.name}:\n`), _util.default.inspect(data, {
204
+ console.info(_picocolors.default.yellow.bold(`\n${modelClass.name}:\n`), _util.default.inspect(data, {
185
205
  colors: true,
186
206
  depth: null,
187
207
  maxArrayLength: null
@@ -487,12 +507,26 @@ class Application extends _koa.default {
487
507
  type,
488
508
  message,
489
509
  errors,
490
- options
510
+ options,
511
+ json
491
512
  }) {
513
+ var _this$config$log$erro;
514
+
492
515
  return new _errors.ValidationError({
493
516
  type,
494
517
  message,
495
- errors: this.validator.parseErrors(errors, options)
518
+ errors: this.validator.parseErrors(errors, options),
519
+ json: (_this$config$log$erro = this.config.log.errors) != null && _this$config$log$erro.json ? json : undefined
520
+ });
521
+ }
522
+
523
+ createDatabaseError(error) {
524
+ var _this$config$log$erro2;
525
+
526
+ const [, sql, message] = error.message.match(/^([\s\S]*) - ([\s\S]*?)$/) || [null, null, error.message];
527
+ return new _errors.DatabaseError(error, {
528
+ message,
529
+ sql: (_this$config$log$erro2 = this.config.log.errors) != null && _this$config$log$erro2.sql ? sql : undefined
496
530
  });
497
531
  }
498
532
 
@@ -625,6 +659,12 @@ class Application extends _koa.default {
625
659
 
626
660
  this.knex = (0, _knex2.default)(knex);
627
661
 
662
+ if (knex.client === 'postgresql' && knex.typeParsers && this.knex.client.driver) {
663
+ for (const [type, parser] of Object.entries(knex.typeParsers)) {
664
+ this.knex.client.driver.types.setTypeParser(type, parser);
665
+ }
666
+ }
667
+
628
668
  if (log.sql) {
629
669
  this.setupKnexLogging();
630
670
  }
@@ -687,11 +727,11 @@ class Application extends _koa.default {
687
727
  }
688
728
 
689
729
  formatError(err) {
690
- var _this$config$log$erro;
730
+ var _this$config$log$erro3;
691
731
 
692
732
  const message = err.toJSON ? (0, _utils.formatJson)(err.toJSON()) : err.message || err;
693
733
  const str = `${err.name}: ${message}`;
694
- return err.stack && ((_this$config$log$erro = this.config.log.errors) == null ? void 0 : _this$config$log$erro.stack) !== false ? `${str}\n${err.stack.split(/\n|\r\n|\r/).slice(1).join(_os.default.EOL)}` : str;
734
+ return err.stack && ((_this$config$log$erro3 = this.config.log.errors) == null ? void 0 : _this$config$log$erro3.stack) !== false ? `${str}\n${err.stack.split(/\n|\r\n|\r/).slice(1).join(_os.default.EOL)}` : str;
695
735
  }
696
736
 
697
737
  logError(err, ctx) {
@@ -833,7 +873,7 @@ class Application extends _koa.default {
833
873
  } = file;
834
874
 
835
875
  if (!data) {
836
- console.info(`${_chalk.default.red('INFO:')} Asset ${_chalk.default.green(`'${file.name}'`)} is from a foreign source, fetching from ${_chalk.default.green(`'${file.url}'`)} and adding to storage ${_chalk.default.green(`'${storage.name}'`)}...`);
876
+ console.info(`${_picocolors.default.red('INFO:')} Asset ${_picocolors.default.green(`'${file.name}'`)} is from a foreign source, fetching from ${_picocolors.default.green(`'${file.url}'`)} and adding to storage ${_picocolors.default.green(`'${storage.name}'`)}...`);
837
877
  const response = await _axios.default.request({
838
878
  method: 'get',
839
879
  url: file.url,
@@ -918,4 +958,4 @@ _lib.EventEmitter.mixin(Application.prototype);
918
958
  function getOptions(options) {
919
959
  return (0, _utils2.isObject)(options) ? options : {};
920
960
  }
921
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcHAvQXBwbGljYXRpb24uanMiXSwibmFtZXMiOlsiQXBwbGljYXRpb24iLCJLb2EiLCJjb25zdHJ1Y3RvciIsImNvbmZpZyIsInZhbGlkYXRvciIsInJvdXRlciIsImV2ZW50cyIsIm1pZGRsZXdhcmUiLCJtb2RlbHMiLCJzZXJ2aWNlcyIsImNvbnRyb2xsZXJzIiwiX3NldHVwRW1pdHRlciIsImFwcCIsImtleXMiLCJsb2ciLCJyZXN0Iiwic2lsZW50IiwicHJvY2VzcyIsImVudiIsIkRJVE9fU0lMRU5UIiwicHJveHkiLCJWYWxpZGF0b3IiLCJSb3V0ZXIiLCJzdG9yYWdlcyIsIk9iamVjdCIsImNyZWF0ZSIsImhhc0NvbnRyb2xsZXJNaWRkbGV3YXJlIiwic2V0dXBMb2dnZXIiLCJzZXR1cEtuZXgiLCJzZXR1cEdsb2JhbE1pZGRsZXdhcmUiLCJ1c2UiLCJhZGRTdG9yYWdlcyIsImFkZE1vZGVscyIsImFkZFNlcnZpY2VzIiwiYWRkQ29udHJvbGxlcnMiLCJhZGRSb3V0ZSIsInZlcmIiLCJwYXRoIiwidHJhbnNhY3RlZCIsImhhbmRsZXJzIiwiY29udHJvbGxlciIsImFjdGlvbiIsImhhbmRsZXIiLCJsZW5ndGgiLCJyb3V0ZSIsIm1vZGVsQ2xhc3MiLCJ2YWx1ZXMiLCJhZGRNb2RlbCIsInNvcnRNb2RlbHMiLCJzb3J0ZWRNb2RlbHMiLCJmaWx0ZXIiLCJuYW1lIiwic2V0dXAiLCJrbmV4IiwiaW5pdGlhbGl6ZSIsImFkZFNjaGVtYSIsImdldEpzb25TY2hlbWEiLCJzY2hlbWEiLCJyZWxhdGlvbnMiLCJzaG91bGRMb2ciLCJvcHRpb24iLCJpbmNsdWRlcyIsImRhdGEiLCJyZWxhdGlvbk1hcHBpbmdzIiwidmFsdWUiLCJNb2RlbCIsImlzUHJvdG90eXBlT2YiLCJjb25zb2xlIiwiaW5mbyIsImNoYWxrIiwieWVsbG93IiwiYm9sZCIsInV0aWwiLCJpbnNwZWN0IiwiY29sb3JzIiwiZGVwdGgiLCJtYXhBcnJheUxlbmd0aCIsIkVycm9yIiwic29ydEJ5UmVsYXRpb25zIiwibGlzdCIsImNvbGxlY3RlZCIsImV4Y2x1ZGVkIiwicmVsYXRpb24iLCJnZXRSZWxhdGlvbnMiLCJCZWxvbmdzVG9PbmVSZWxhdGlvbiIsInJlbGF0ZWRNb2RlbENsYXNzIiwiam9pblRhYmxlTW9kZWxDbGFzcyIsInJlbGF0ZWQiLCJyZXZlcnNlIiwicmVkdWNlIiwiZ2V0TW9kZWwiLCJlbmRzV2l0aCIsImZpbmRNb2RlbCIsImNhbGxiYWNrIiwiZmluZCIsInNlcnZpY2UiLCJlbnRyaWVzIiwiYWRkU2VydmljZSIsIlNlcnZpY2UiLCJ1bmRlZmluZWQiLCJnZXRTZXJ2aWNlIiwiZmluZFNlcnZpY2UiLCJmb3JFYWNoU2VydmljZSIsIlByb21pc2UiLCJhbGwiLCJtYXAiLCJuYW1lc3BhY2UiLCJrZXkiLCJhZGRDb250cm9sbGVyIiwic2V0dXBDb250cm9sbGVyTWlkZGxld2FyZSIsIkNvbnRyb2xsZXIiLCJ1cmwiLCJjb21wb3NlIiwiZ2V0Q29udHJvbGxlciIsImZpbmRDb250cm9sbGVyIiwiZ2V0QWRtaW5Db250cm9sbGVyIiwiQWRtaW5Db250cm9sbGVyIiwiZ2V0QWRtaW5WdWVDb25maWciLCJnZXRWdWVDb25maWciLCJnZXRBc3NldENvbmZpZyIsIm5vcm1hbGl6ZURiTmFtZXMiLCJhc3NldENvbmZpZyIsIm1vZGVsTmFtZSIsImFzc2V0cyIsImRlZmluaXRpb24iLCJub3JtYWxpemVkTW9kZWxOYW1lIiwibm9ybWFsaXplSWRlbnRpZmllciIsImNvbnZlcnRlZEFzc2V0cyIsImFzc2V0RGF0YVBhdGgiLCJwcm9wZXJ0eSIsIm5lc3RlZERhdGFQYXRoIiwiaW5kZXgiLCJnZXRQcm9wZXJ0eU9yUmVsYXRpb25BdERhdGFQYXRoIiwibm9ybWFsaXplZE5hbWUiLCJkYXRhUGF0aCIsImFzc2V0Q29uZmlncyIsImFkZFN0b3JhZ2UiLCJzdG9yYWdlIiwic3RvcmFnZUNsYXNzIiwiU3RvcmFnZSIsImdldCIsInR5cGUiLCJnZXRTdG9yYWdlIiwiY29tcGlsZVZhbGlkYXRvciIsImpzb25TY2hlbWEiLCJvcHRpb25zIiwiY29tcGlsZSIsImNvbXBpbGVQYXJhbWV0ZXJzVmFsaWRhdG9yIiwicGFyYW1ldGVycyIsImRhdGFOYW1lIiwicHJvcGVydGllcyIsImFkZFBhcmFtZXRlciIsInB1c2giLCJtZW1iZXIiLCJhc09iamVjdCIsInZhbGlkYXRlIiwiY29lcmNlVHlwZXMiLCJjdHgiLCJjYWxsIiwiY3JlYXRlVmFsaWRhdGlvbkVycm9yIiwibWVzc2FnZSIsImVycm9ycyIsIlZhbGlkYXRpb25FcnJvciIsInBhcnNlRXJyb3JzIiwibG9nZ2VyIiwicmVzcG9uc2VUaW1lIiwiZ2V0T3B0aW9ucyIsInJlcXVlc3RzIiwiaGVsbWV0IiwiY29ycyIsImNvbXByZXNzIiwiYnIiLCJwYXJhbXMiLCJ6bGliIiwiY29uc3RhbnRzIiwiQlJPVExJX1BBUkFNX1FVQUxJVFkiLCJldGFnIiwiYm9keVBhcnNlciIsInNlc3Npb24iLCJDb250ZXh0U3RvcmUiLCJwYXNzcG9ydCIsImVyciIsInJlcSIsInJlcyIsInBpbm8iLCJzdGRTZXJpYWxpemVycyIsInVzZXIiLCJpZCIsInNlcmlhbGl6ZXJzIiwibGV2ZWwiLCJwcmV0dHlQcmludCIsImlnbm9yZSIsInRyYW5zbGF0ZVRpbWUiLCJyZWRhY3QiLCJiYXNlIiwiY2hpbGQiLCJjbGllbnQiLCJzbmFrZUNhc2VPcHRpb25zIiwic3FsIiwic2V0dXBLbmV4TG9nZ2luZyIsInN0YXJ0VGltZXMiLCJlbmQiLCJxdWVyeSIsInJlc3BvbnNlIiwiZXJyb3IiLCJfX2tuZXhRdWVyeVVpZCIsImRpZmYiLCJocnRpbWUiLCJkdXJhdGlvbiIsImJpbmRpbmdzIiwiZnJvbUVudHJpZXMiLCJzdGFydHNXaXRoIiwib24iLCJpZGVudGlmaWVyIiwid3JhcElkZW50aWZpZXIiLCJyZXBsYWNlIiwiZGVub3JtYWxpemVJZGVudGlmaWVyIiwib2JqIiwicG9zdFByb2Nlc3NSZXNwb25zZSIsIm5vcm1hbGl6ZVBhdGgiLCJub3JtYWxpemVQYXRocyIsImZvcm1hdEVycm9yIiwidG9KU09OIiwic3RyIiwic3RhY2siLCJzcGxpdCIsInNsaWNlIiwiam9pbiIsIm9zIiwiRU9MIiwibG9nRXJyb3IiLCJleHBvc2UiLCJ0ZXh0IiwiUmVzcG9uc2VFcnJvciIsInN0YXR1cyIsImUiLCJzdGFydCIsImVtaXQiLCJzZXJ2ZXIiLCJob3N0IiwicG9ydCIsInJlc29sdmUiLCJyZWplY3QiLCJsaXN0ZW4iLCJhZGRyZXNzIiwic3RvcCIsImNsb3NlIiwic2V0SW1tZWRpYXRlIiwib2ZmIiwic3RhcnRPckV4aXQiLCJleGl0IiwiY3JlYXRlQXNzZXRzIiwiZmlsZXMiLCJjb3VudCIsInRyeCIsIkFzc2V0TW9kZWwiLCJmaWxlIiwiaW5zZXJ0IiwiaGFuZGxlQWRkZGVkQW5kUmVtb3ZlZEFzc2V0cyIsImFkZGVkRmlsZXMiLCJyZW1vdmVkRmlsZXMiLCJjbGVhbnVwVGltZVRocmVzaG9sZCIsInRpbWVUaHJlc2hvbGQiLCJpbXBvcnRlZEZpbGVzIiwiYWRkRm9yZWlnbkFzc2V0cyIsImNoYW5nZUNvdW50IiwiaW5jcmVtZW50Iiwid2hlcmVJbiIsInNldFRpbWVvdXQiLCJyZWxlYXNlVW51c2VkQXNzZXRzIiwiYXNzZXQiLCJmaW5kT25lIiwicmVkIiwiZ3JlZW4iLCJheGlvcyIsInJlcXVlc3QiLCJtZXRob2QiLCJyZXNwb25zZVR5cGUiLCJpbXBvcnRlZEZpbGUiLCJhZGRGaWxlIiwiYXNzaWduIiwiQXNzZXRFcnJvciIsImhhbmRsZU1vZGlmaWVkQXNzZXRzIiwibW9kaWZpZWRGaWxlcyIsImNoYW5nZWRGaWxlIiwidHJhbnNhY3Rpb24iLCJkYXRlIiwiRGF0ZSIsInNldE1pbGxpc2Vjb25kcyIsImdldE1pbGxpc2Vjb25kcyIsIm9ycGhhbmVkQXNzZXRzIiwid2hlcmUiLCJhbmRXaGVyZSIsIm9ycGhhbmVkS2V5cyIsInJlbW92ZUZpbGUiLCJkZWxldGUiLCJFdmVudEVtaXR0ZXIiLCJtaXhpbiIsInByb3RvdHlwZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFB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RixjQUFjLENBQUN2UCxNQUFmLEdBQXdCLENBQTVCLEVBQStCO0FBQzdCLGdCQUFNMFAsWUFBWSxHQUFHLE1BQU05TCxPQUFPLENBQUNDLEdBQVIsQ0FDekIwTCxjQUFjLENBQUN6TCxHQUFmLENBQW1CLE1BQU1xSyxLQUFOLElBQWU7QUFDaEMsZ0JBQUk7QUFDRixvQkFBTSxLQUFLaEksVUFBTCxDQUFnQmdJLEtBQUssQ0FBQ3JJLE9BQXRCLEVBQStCNkosVUFBL0IsQ0FBMEN4QixLQUFLLENBQUNkLElBQWhELENBQU47QUFDRCxhQUZELENBRUUsT0FBT3BELEtBQVAsRUFBYztBQUNkLG1CQUFLaUMsSUFBTCxDQUFVLE9BQVYsRUFBbUJqQyxLQUFuQjtBQUNBa0UsY0FBQUEsS0FBSyxDQUFDbEUsS0FBTixHQUFjQSxLQUFkO0FBQ0Q7O0FBQ0QsbUJBQU9rRSxLQUFLLENBQUNuSyxHQUFiO0FBQ0QsV0FSRCxDQUR5QixDQUEzQjtBQVdBLGdCQUFNb0osVUFBVSxDQUNickQsS0FERyxDQUNHb0QsR0FESCxFQUVIeUMsTUFGRyxHQUdINUIsT0FIRyxDQUdLLEtBSEwsRUFHWTBCLFlBSFosQ0FBTjtBQUlEOztBQUNELGVBQU9ILGNBQVA7QUFDRCxPQTlCTSxDQUFQO0FBK0JEO0FBQ0Y7O0FBMTNCa0M7Ozs7QUErM0JyQ00sa0JBQWFDLEtBQWIsQ0FBbUJ6UyxXQUFXLENBQUMwUyxTQUEvQjs7QUFFQSxTQUFTcEksVUFBVCxDQUFvQnJCLE9BQXBCLEVBQTZCO0FBQzNCLFNBQU8sc0JBQVNBLE9BQVQsSUFBb0JBLE9BQXBCLEdBQThCLEVBQXJDO0FBQ0QiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgS29hIGZyb20gJ2tvYSdcbmltcG9ydCBLbmV4IGZyb20gJ2tuZXgnXG5pbXBvcnQgdXRpbCBmcm9tICd1dGlsJ1xuaW1wb3J0IGF4aW9zIGZyb20gJ2F4aW9zJ1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJ1xuaW1wb3J0IHpsaWIgZnJvbSAnemxpYidcbmltcG9ydCBwaW5vIGZyb20gJ3Bpbm8nXG5pbXBvcnQgb3MgZnJvbSAnb3MnXG5pbXBvcnQgcGFyc2VEdXJhdGlvbiBmcm9tICdwYXJzZS1kdXJhdGlvbidcbmltcG9ydCBib2R5UGFyc2VyIGZyb20gJ2tvYS1ib2R5cGFyc2VyJ1xuaW1wb3J0IGNvcnMgZnJvbSAnQGtvYS9jb3JzJ1xuaW1wb3J0IGNvbXBvc2UgZnJvbSAna29hLWNvbXBvc2UnXG5pbXBvcnQgY29tcHJlc3MgZnJvbSAna29hLWNvbXByZXNzJ1xuaW1wb3J0IGNvbmRpdGlvbmFsIGZyb20gJ2tvYS1jb25kaXRpb25hbC1nZXQnXG5pbXBvcnQgcGFzc3BvcnQgZnJvbSAna29hLXBhc3Nwb3J0J1xuaW1wb3J0IHNlc3Npb24gZnJvbSAna29hLXNlc3Npb24nXG5pbXBvcnQgZXRhZyBmcm9tICdrb2EtZXRhZydcbmltcG9ydCBoZWxtZXQgZnJvbSAna29hLWhlbG1ldCdcbmltcG9ydCByZXNwb25zZVRpbWUgZnJvbSAna29hLXJlc3BvbnNlLXRpbWUnXG5pbXBvcnQgUm91dGVyIGZyb20gJ0BkaXRvanMvcm91dGVyJ1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQC9saWInXG5pbXBvcnQgeyBDb250cm9sbGVyLCBBZG1pbkNvbnRyb2xsZXIgfSBmcm9tICdAL2NvbnRyb2xsZXJzJ1xuaW1wb3J0IHsgU2VydmljZSB9IGZyb20gJ0Avc2VydmljZXMnXG5pbXBvcnQgeyBTdG9yYWdlIH0gZnJvbSAnQC9zdG9yYWdlJ1xuaW1wb3J0IHsgY29udmVydFNjaGVtYSB9IGZyb20gJ0Avc2NoZW1hJ1xuaW1wb3J0IHsgZm9ybWF0SnNvbiB9IGZyb20gJ0AvdXRpbHMnXG5pbXBvcnQgeyBSZXNwb25zZUVycm9yLCBWYWxpZGF0aW9uRXJyb3IsIEFzc2V0RXJyb3IgfSBmcm9tICdAL2Vycm9ycydcbmltcG9ydCBTZXNzaW9uU3RvcmUgZnJvbSAnLi9TZXNzaW9uU3RvcmUnXG5pbXBvcnQgeyBWYWxpZGF0b3IgfSBmcm9tICcuL1ZhbGlkYXRvcidcbmltcG9ydCB7XG4gIGF0dGFjaExvZ2dlcixcbiAgY3JlYXRlVHJhbnNhY3Rpb24sXG4gIGZpbmRSb3V0ZSxcbiAgaGFuZGxlRXJyb3IsXG4gIGhhbmRsZVJvdXRlLFxuICBoYW5kbGVVc2VyLFxuICBsb2dSZXF1ZXN0c1xufSBmcm9tICdAL21pZGRsZXdhcmUnXG5pbXBvcnQge1xuICBpc0FycmF5LCBpc09iamVjdCwgaXNTdHJpbmcsIGFzQXJyYXksIGlzUGxhaW5PYmplY3QsIGh5cGhlbmF0ZSwgY2xvbmUsIG1lcmdlLFxuICBwYXJzZURhdGFQYXRoLCBub3JtYWxpemVEYXRhUGF0aFxufSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuaW1wb3J0IHtcbiAgTW9kZWwsXG4gIEJlbG9uZ3NUb09uZVJlbGF0aW9uLFxuICBrbmV4U25ha2VDYXNlTWFwcGVycyxcbiAgcmVmXG59IGZyb20gJ29iamVjdGlvbidcblxuZXhwb3J0IGNsYXNzIEFwcGxpY2F0aW9uIGV4dGVuZHMgS29hIHtcbiAgY29uc3RydWN0b3Ioe1xuICAgIGNvbmZpZyA9IHt9LFxuICAgIHZhbGlkYXRvcixcbiAgICByb3V0ZXIsXG4gICAgZXZlbnRzLFxuICAgIG1pZGRsZXdhcmUsXG4gICAgbW9kZWxzLFxuICAgIHNlcnZpY2VzLFxuICAgIGNvbnRyb2xsZXJzXG4gIH0gPSB7fSkge1xuICAgIHN1cGVyKClcbiAgICB0aGlzLl9zZXR1cEVtaXR0ZXIoZXZlbnRzKVxuICAgIGNvbnN0IHtcbiAgICAgIC8vIFBsdWNrIGtleXMgb3V0IG9mIGBjb25maWcuYXBwYCB0byBrZWVwIHRoZW0gc2VjcmV0XG4gICAgICBhcHA6IHsga2V5cywgLi4uYXBwIH0gPSB7fSxcbiAgICAgIGxvZyA9IHt9LFxuICAgICAgLi4ucmVzdFxuICAgIH0gPSBjb25maWdcbiAgICB0aGlzLmNvbmZpZyA9IHtcbiAgICAgIGFwcCxcbiAgICAgIGxvZzogbG9nLnNpbGVudCB8fCBwcm9jZXNzLmVudi5ESVRPX1NJTEVOVCA/IHt9IDogbG9nLFxuICAgICAgLi4ucmVzdFxuICAgIH1cbiAgICB0aGlzLmtleXMgPSBrZXlzXG4gICAgdGhpcy5wcm94eSA9ICEhYXBwLnByb3h5XG4gICAgdGhpcy52YWxpZGF0b3IgPSB2YWxpZGF0b3IgfHwgbmV3IFZhbGlkYXRvcigpXG4gICAgdGhpcy5yb3V0ZXIgPSByb3V0ZXIgfHwgbmV3IFJvdXRlcigpXG4gICAgdGhpcy52YWxpZGF0b3IuYXBwID0gdGhpc1xuICAgIHRoaXMuc3RvcmFnZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpXG4gICAgdGhpcy5tb2RlbHMgPSBPYmplY3QuY3JlYXRlKG51bGwpXG4gICAgdGhpcy5zZXJ2aWNlcyA9IE9iamVjdC5jcmVhdGUobnVsbClcbiAgICB0aGlzLmNvbnRyb2xsZXJzID0gT2JqZWN0LmNyZWF0ZShudWxsKVxuICAgIHRoaXMuaGFzQ29udHJvbGxlck1pZGRsZXdhcmUgPSBmYWxzZVxuICAgIHRoaXMuc2V0dXBMb2dnZXIoKVxuICAgIHRoaXMuc2V0dXBLbmV4KClcbiAgICB0aGlzLnNldHVwR2xvYmFsTWlkZGxld2FyZSgpXG4gICAgaWYgKG1pZGRsZXdhcmUpIHtcbiAgICAgIHRoaXMudXNlKG1pZGRsZXdhcmUpXG4gICAgfVxuICAgIGlmIChjb25maWcuc3RvcmFnZXMpIHtcbiAgICAgIHRoaXMuYWRkU3RvcmFnZXMoY29uZmlnLnN0b3JhZ2VzKVxuICAgIH1cbiAgICBpZiAobW9kZWxzKSB7XG4gICAgICB0aGlzLmFkZE1vZGVscyhtb2RlbHMpXG4gICAgfVxuICAgIGlmIChzZXJ2aWNlcykge1xuICAgICAgdGhpcy5hZGRTZXJ2aWNlcyhzZXJ2aWNlcylcbiAgICB9XG4gICAgaWYgKGNvbnRyb2xsZXJzKSB7XG4gICAgICB0aGlzLmFkZENvbnRyb2xsZXJzKGNvbnRyb2xsZXJzKVxuICAgIH1cbiAgfVxuXG4gIGFkZFJvdXRlKHZlcmIsIHBhdGgsIHRyYW5zYWN0ZWQsIGhhbmRsZXJzLCBjb250cm9sbGVyID0gbnVsbCwgYWN0aW9uID0gbnVsbCkge1xuICAgIGhhbmRsZXJzID0gYXNBcnJheShoYW5kbGVycylcbiAgICBjb25zdCBoYW5kbGVyID0gaGFuZGxlcnMubGVuZ3RoID4gMSA/IGNvbXBvc2UoaGFuZGxlcnMpIDogaGFuZGxlcnNbMF1cbiAgICAvLyBJbnN0ZWFkIG9mIGRpcmVjdGx5IHBhc3NpbmcgYGhhbmRsZXJgLCBwYXNzIGEgYHJvdXRlYCBvYmplY3QgdGhhdCBhbHNvXG4gICAgLy8gd2lsbCBiZSBleHBvc2VkIHRocm91Z2ggYGN0eC5yb3V0ZWAsIHNlZSBgcm91dGVySGFuZGxlcigpYDpcbiAgICBjb25zdCByb3V0ZSA9IHtcbiAgICAgIHZlcmIsXG4gICAgICBwYXRoLFxuICAgICAgdHJhbnNhY3RlZCxcbiAgICAgIGhhbmRsZXIsXG4gICAgICBjb250cm9sbGVyLFxuICAgICAgYWN0aW9uXG4gICAgfVxuICAgIHRoaXMucm91dGVyW3ZlcmJdKHBhdGgsIHJvdXRlKVxuICB9XG5cbiAgYWRkTW9kZWxzKG1vZGVscykge1xuICAgIC8vIEZpcnN0IGFkZCBhbGwgbW9kZWxzIHRoZW4gY2FsbCBpbml0aWFsaXplKCkgZm9yIGVhY2ggaW4gYSBzZWNvbmQgbG9vcCxcbiAgICAvLyBzaW5jZSB0aGV5IG1heSBiZSByZWZlcmVuY2luZyBlYWNoIG90aGVyIGluIHJlbGF0aW9ucy5cbiAgICBmb3IgKGNvbnN0IG1vZGVsQ2xhc3Mgb2YgT2JqZWN0LnZhbHVlcyhtb2RlbHMpKSB7XG4gICAgICB0aGlzLmFkZE1vZGVsKG1vZGVsQ2xhc3MpXG4gICAgfVxuICAgIC8vIE5vdyAocmUtKXNvcnQgYWxsIG1vZGVscyBiYXNlZCBvbiB0aGVpciByZWxhdGlvbnMuXG4gICAgdGhpcy5tb2RlbHMgPSB0aGlzLnNvcnRNb2RlbHModGhpcy5tb2RlbHMpXG4gICAgLy8gRmlsdGVyIHRocm91Z2ggYWxsIHNvcnRlZCBtb2RlbHMsIGtlZXBpbmcgb25seSB0aGUgbmV3bHkgYWRkZWQgb25lcy5cbiAgICBjb25zdCBzb3J0ZWRNb2RlbHMgPSBPYmplY3QudmFsdWVzKHRoaXMubW9kZWxzKS5maWx0ZXIoXG4gICAgICBtb2RlbENsYXNzID0+IG1vZGVsc1ttb2RlbENsYXNzLm5hbWVdID09PSBtb2RlbENsYXNzXG4gICAgKVxuICAgIC8vIEluaXRpYWxpemUgdGhlIGFkZGVkIG1vZGVscyBpbiBjb3JyZWN0IHNvcnRlZCBzZXF1ZW5jZSwgc28gdGhhdCBmb3IgZXZlcnlcbiAgICAvLyBtb2RlbCwgZ2V0UmVsYXRlZFJlbGF0aW9ucygpIHJldHVybnMgdGhlIGZ1bGwgbGlzdCBvZiByZWxhdGluZyByZWxhdGlvbnMuXG4gICAgZm9yIChjb25zdCBtb2RlbENsYXNzIG9mIHNvcnRlZE1vZGVscykge1xuICAgICAgaWYgKG1vZGVsc1ttb2RlbENsYXNzLm5hbWVdID09PSBtb2RlbENsYXNzKSB7XG4gICAgICAgIG1vZGVsQ2xhc3Muc2V0dXAodGhpcy5rbmV4KVxuICAgICAgICAvLyBOb3cgdGhhdCB0aGUgbW9kZWxDbGFzcyBpcyBzZXQgdXAsIGNhbGwgYGluaXRpYWxpemUoKWAsIHdoaWNoIGNhbiBiZVxuICAgICAgICAvLyBvdmVycmlkZGVuIGJ5IHN1Yi1jbGFzc2VzLHdpdGhvdXQgaGF2aW5nIHRvIGNhbGwgYHN1cGVyLmluaXRpYWxpemUoKWBcbiAgICAgICAgbW9kZWxDbGFzcy5pbml0aWFsaXplKClcbiAgICAgICAgdGhpcy52YWxpZGF0b3IuYWRkU2NoZW1hKG1vZGVsQ2xhc3MuZ2V0SnNvblNjaGVtYSgpKVxuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCB7IGxvZyB9ID0gdGhpcy5jb25maWdcbiAgICBpZiAobG9nLnNjaGVtYSB8fCBsb2cucmVsYXRpb25zKSB7XG4gICAgICBmb3IgKGNvbnN0IG1vZGVsQ2xhc3Mgb2Ygc29ydGVkTW9kZWxzKSB7XG4gICAgICAgIGNvbnN0IHNob3VsZExvZyA9IG9wdGlvbiA9PiAoXG4gICAgICAgICAgb3B0aW9uID09PSB0cnVlIHx8XG4gICAgICAgICAgYXNBcnJheShvcHRpb24pLmluY2x1ZGVzKG1vZGVsQ2xhc3MubmFtZSlcbiAgICAgICAgKVxuICAgICAgICBjb25zdCBkYXRhID0ge31cbiAgICAgICAgaWYgKHNob3VsZExvZyhsb2cuc2NoZW1hKSkge1xuICAgICAgICAgIGRhdGEuc2NoZW1hID0gbW9kZWxDbGFzcy5nZXRKc29uU2NoZW1hKClcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2hvdWxkTG9nKGxvZy5yZWxhdGlvbnMpKSB7XG4gICAgICAgICAgZGF0YS5yZWxhdGlvbnMgPSBjbG9uZShtb2RlbENsYXNzLnJlbGF0aW9uTWFwcGluZ3MsIHZhbHVlID0+XG4gICAgICAgICAgICBNb2RlbC5pc1Byb3RvdHlwZU9mKHZhbHVlKSA/IGBbTW9kZWw6ICR7dmFsdWUubmFtZX1dYCA6IHZhbHVlXG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhkYXRhKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29uc29sZS5pbmZvKFxuICAgICAgICAgICAgY2hhbGsueWVsbG93LmJvbGQoYFxcbiR7bW9kZWxDbGFzcy5uYW1lfTpcXG5gKSxcbiAgICAgICAgICAgIHV0aWwuaW5zcGVjdChkYXRhLCB7XG4gICAgICAgICAgICAgIGNvbG9yczogdHJ1ZSxcbiAgICAgICAgICAgICAgZGVwdGg6IG51bGwsXG4gICAgICAgICAgICAgIG1heEFycmF5TGVuZ3RoOiBudWxsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFkZE1vZGVsKG1vZGVsQ2xhc3MpIHtcbiAgICBpZiAoTW9kZWwuaXNQcm90b3R5cGVPZihtb2RlbENsYXNzKSkge1xuICAgICAgbW9kZWxDbGFzcy5hcHAgPSB0aGlzXG4gICAgICB0aGlzLm1vZGVsc1ttb2RlbENsYXNzLm5hbWVdID0gbW9kZWxDbGFzc1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgbW9kZWwgY2xhc3M6ICR7bW9kZWxDbGFzc31gKVxuICAgIH1cbiAgfVxuXG4gIHNvcnRNb2RlbHMobW9kZWxzKSB7XG4gICAgY29uc3Qgc29ydEJ5UmVsYXRpb25zID0gKGxpc3QsIGNvbGxlY3RlZCA9IHt9LCBleGNsdWRlZCA9IHt9KSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IG1vZGVsQ2xhc3Mgb2YgbGlzdCkge1xuICAgICAgICBjb25zdCB7IG5hbWUgfSA9IG1vZGVsQ2xhc3NcbiAgICAgICAgaWYgKCFjb2xsZWN0ZWRbbmFtZV0gJiYgIWV4Y2x1ZGVkW25hbWVdKSB7XG4gICAgICAgICAgZm9yIChjb25zdCByZWxhdGlvbiBvZiBPYmplY3QudmFsdWVzKG1vZGVsQ2xhc3MuZ2V0UmVsYXRpb25zKCkpKSB7XG4gICAgICAgICAgICBpZiAoIShyZWxhdGlvbiBpbnN0YW5jZW9mIEJlbG9uZ3NUb09uZVJlbGF0aW9uKSkge1xuICAgICAgICAgICAgICBjb25zdCB7IHJlbGF0ZWRNb2RlbENsYXNzLCBqb2luVGFibGVNb2RlbENsYXNzIH0gPSByZWxhdGlvblxuICAgICAgICAgICAgICBmb3IgKGNvbnN0IHJlbGF0ZWQgb2YgW2pvaW5UYWJsZU1vZGVsQ2xhc3MsIHJlbGF0ZWRNb2RlbENsYXNzXSkge1xuICAgICAgICAgICAgICAgIC8vIEV4Y2x1ZGUgc2VsZi1yZWZlcmVuY2VzIGFuZCBnZW5lcmF0ZWQgam9pbiBtb2RlbHM6XG4gICAgICAgICAgICAgICAgaWYgKHJlbGF0ZWQgJiYgcmVsYXRlZCAhPT0gbW9kZWxDbGFzcyAmJiBtb2RlbHNbcmVsYXRlZC5uYW1lXSkge1xuICAgICAgICAgICAgICAgICAgc29ydEJ5UmVsYXRpb25zKFtyZWxhdGVkXSwgY29sbGVjdGVkLCB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEV4Y2x1ZGUgbW9kZWxDbGFzcyB0byBwcmV2ZW50IGVuZGxlc3MgcmVjdXJzaW9uczpcbiAgICAgICAgICAgICAgICAgICAgW25hbWVdOiBtb2RlbENsYXNzLFxuICAgICAgICAgICAgICAgICAgICAuLi5leGNsdWRlZFxuICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgY29sbGVjdGVkW25hbWVdID0gbW9kZWxDbGFzc1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyhjb2xsZWN0ZWQpXG4gICAgfVxuICAgIC8vIFJldHVybiBhIG5ldyBvYmplY3Qgd2l0aCB0aGUgc29ydGVkIG1vZGVscyBhcyBpdHMga2V5L3ZhbHVlIHBhaXJzLlxuICAgIC8vIE5PVEU6IFdlIG5lZWQgdG8gcmV2ZXJzZSBmb3IgdGhlIGFib3ZlIGFsZ29yaXRobSB0byBzb3J0IHByb3Blcmx5LFxuICAgIC8vIGFuZCB0aGVuIHJldmVyc2UgdGhlIHJlc3VsdCBiYWNrLlxuICAgIHJldHVybiBzb3J0QnlSZWxhdGlvbnMoT2JqZWN0LnZhbHVlcyhtb2RlbHMpLnJldmVyc2UoKSkucmV2ZXJzZSgpLnJlZHVjZShcbiAgICAgIChtb2RlbHMsIG1vZGVsQ2xhc3MpID0+IHtcbiAgICAgICAgbW9kZWxzW21vZGVsQ2xhc3MubmFtZV0gPSBtb2RlbENsYXNzXG4gICAgICAgIHJldHVybiBtb2RlbHNcbiAgICAgIH0sXG4gICAgICBPYmplY3QuY3JlYXRlKG51bGwpXG4gICAgKVxuICB9XG5cbiAgZ2V0TW9kZWwobmFtZSkge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLm1vZGVsc1tuYW1lXSB8fFxuICAgICAgIW5hbWUuZW5kc1dpdGgoJ01vZGVsJykgJiYgdGhpcy5tb2RlbHNbYCR7bmFtZX1Nb2RlbGBdIHx8XG4gICAgICBudWxsXG4gICAgKVxuICB9XG5cbiAgZmluZE1vZGVsKGNhbGxiYWNrKSB7XG4gICAgcmV0dXJuIE9iamVjdC52YWx1ZXModGhpcy5tb2RlbHMpLmZpbmQoY2FsbGJhY2spXG4gIH1cblxuICBhZGRTZXJ2aWNlcyhzZXJ2aWNlcykge1xuICAgIGZvciAoY29uc3QgW25hbWUsIHNlcnZpY2VdIG9mIE9iamVjdC5lbnRyaWVzKHNlcnZpY2VzKSkge1xuICAgICAgLy8gSGFuZGxlIEVTNiBtb2R1bGUgd2VpcmRuZXNzIHRoYXQgY2FuIGhhcHBlbiwgYXBwYXJlbnRseTpcbiAgICAgIGlmIChuYW1lID09PSAnZGVmYXVsdCcgJiYgaXNQbGFpbk9iamVjdChzZXJ2aWNlKSkge1xuICAgICAgICB0aGlzLmFkZFNlcnZpY2VzKHNlcnZpY2UpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmFkZFNlcnZpY2Uoc2VydmljZSwgbmFtZSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhZGRTZXJ2aWNlKHNlcnZpY2UsIG5hbWUpIHtcbiAgICAvLyBBdXRvLWluc3RhbnRpYXRlIGNvbnRyb2xsZXIgY2xhc3NlczpcbiAgICBpZiAoU2VydmljZS5pc1Byb3RvdHlwZU9mKHNlcnZpY2UpKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbmV3LWNhcFxuICAgICAgc2VydmljZSA9IG5ldyBzZXJ2aWNlKHRoaXMsIG5hbWUpXG4gICAgfVxuICAgIGlmICghKHNlcnZpY2UgaW5zdGFuY2VvZiBTZXJ2aWNlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHNlcnZpY2U6ICR7c2VydmljZX1gKVxuICAgIH1cbiAgICAvLyBPbmx5IGFmdGVyIHRoZSBjb25zdHJ1Y3RvciBpcyBjYWxsZWQsIGBzZXJ2aWNlLm5hbWVgIGlzIGd1YXJhbnRlZWQgdG8gYmVcbiAgICAvLyBzZXQgdG8gdGhlIGNvcnJlY3QgdmFsdWUsIGUuZy4gd2l0aCBhbiBhZnRlci1jb25zdHJ1Y3RvciBjbGFzcyBwcm9wZXJ0eS5cbiAgICAoeyBuYW1lIH0gPSBzZXJ2aWNlKVxuICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuY29uZmlnLnNlcnZpY2VzW25hbWVdXG4gICAgaWYgKGNvbmZpZyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvbmZpZ3VyYXRpb24gbWlzc2luZyBmb3Igc2VydmljZSAnJHtuYW1lfSdgKVxuICAgIH1cbiAgICAvLyBBcyBhIGNvbnZlbnRpb24sIHRoZSBjb25maWd1cmF0aW9uIG9mIGEgc2VydmljZSBjYW4gYmUgc2V0IHRvIGBmYWxzZWBcbiAgICAvLyBpbiBvcmRlciB0byBlbnRpcmVseSBkZWFjdGl2YXRlIHRoZSBzZXJ2aWNlLlxuICAgIGlmIChjb25maWcgIT09IGZhbHNlKSB7XG4gICAgICBzZXJ2aWNlLnNldHVwKGNvbmZpZylcbiAgICAgIHRoaXMuc2VydmljZXNbbmFtZV0gPSBzZXJ2aWNlXG4gICAgICAvLyBOb3cgdGhhdCB0aGUgc2VydmljZSBpcyBzZXQgdXAsIGNhbGwgYGluaXRpYWxpemUoKWAgd2hpY2ggY2FuIGJlXG4gICAgICAvLyBvdmVycmlkZGVuIGJ5IHNlcnZpY2VzLlxuICAgICAgc2VydmljZS5pbml0aWFsaXplKClcbiAgICB9XG4gIH1cblxuICBnZXRTZXJ2aWNlKG5hbWUpIHtcbiAgICByZXR1cm4gdGhpcy5zZXJ2aWNlc1tuYW1lXSB8fCBudWxsXG4gIH1cblxuICBmaW5kU2VydmljZShjYWxsYmFjaykge1xuICAgIHJldHVybiBPYmplY3QudmFsdWVzKHRoaXMuc2VydmljZXMpLmZpbmQoY2FsbGJhY2spXG4gIH1cblxuICBmb3JFYWNoU2VydmljZShjYWxsYmFjaykge1xuICAgIHJldHVybiBQcm9taXNlLmFsbChPYmplY3QudmFsdWVzKHRoaXMuc2VydmljZXMpLm1hcChjYWxsYmFjaykpXG4gIH1cblxuICBhZGRDb250cm9sbGVycyhjb250cm9sbGVycywgbmFtZXNwYWNlKSB7XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoY29udHJvbGxlcnMpKSB7XG4gICAgICBpZiAoaXNQbGFpbk9iamVjdCh2YWx1ZSkpIHtcbiAgICAgICAgdGhpcy5hZGRDb250cm9sbGVycyh2YWx1ZSwgbmFtZXNwYWNlID8gYCR7bmFtZXNwYWNlfS8ke2tleX1gIDoga2V5KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5hZGRDb250cm9sbGVyKHZhbHVlLCBuYW1lc3BhY2UpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYWRkQ29udHJvbGxlcihjb250cm9sbGVyLCBuYW1lc3BhY2UpIHtcbiAgICAvLyBDb250cm9sbGVycyByZXF1aXJlIGFkZGl0aW9uYWwgbWlkZGxld2FyZSB0byBiZSBpbnN0YWxsZWQgb25jZS5cbiAgICB0aGlzLnNldHVwQ29udHJvbGxlck1pZGRsZXdhcmUoKVxuICAgIC8vIEF1dG8taW5zdGFudGlhdGUgY29udHJvbGxlciBjbGFzc2VzOlxuICAgIGlmIChDb250cm9sbGVyLmlzUHJvdG90eXBlT2YoY29udHJvbGxlcikpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuZXctY2FwXG4gICAgICBjb250cm9sbGVyID0gbmV3IGNvbnRyb2xsZXIodGhpcywgbmFtZXNwYWNlKVxuICAgIH1cbiAgICBpZiAoIShjb250cm9sbGVyIGluc3RhbmNlb2YgQ29udHJvbGxlcikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBjb250cm9sbGVyOiAke2NvbnRyb2xsZXJ9YClcbiAgICB9XG4gICAgLy8gSW5oZXJpdGFuY2Ugb2YgYWN0aW9uIG1ldGhvZHMgY2Fubm90IGhhcHBlbiBpbiB0aGUgY29uc3RydWN0b3IgaXRzZWxmLFxuICAgIC8vIHNvIGNhbGwgc2VwYXJhdGUgYHNldHVwKClgIG1ldGhvZCBhZnRlciBpbiBvcmRlciB0byB0YWtlIGNhcmUgb2YgaXQuXG4gICAgY29udHJvbGxlci5zZXR1cCgpXG4gICAgdGhpcy5jb250cm9sbGVyc1tjb250cm9sbGVyLnVybF0gPSBjb250cm9sbGVyXG4gICAgLy8gTm93IHRoYXQgdGhlIGNvbnRyb2xsZXIgaXMgc2V0IHVwLCBjYWxsIGBpbml0aWFsaXplKClgIHdoaWNoIGNhbiBiZVxuICAgIC8vIG92ZXJyaWRkZW4gYnkgY29udHJvbGxlcnMuXG4gICAgY29udHJvbGxlci5pbml0aWFsaXplKClcbiAgICAvLyBFYWNoIGNvbnRyb2xsZXIgY2FuIGFsc28gcHJvdmlkZSBmdXJ0aGVyIG1pZGRsZXdhcmUsIGUuZy5cbiAgICAvLyBgQWRtaW5Db250cm9sbGVyYDpcbiAgICBjb25zdCBtaWRkbGV3YXJlID0gY29udHJvbGxlci5jb21wb3NlKClcbiAgICBpZiAobWlkZGxld2FyZSkge1xuICAgICAgdGhpcy51c2UobWlkZGxld2FyZSlcbiAgICB9XG4gIH1cblxuICBnZXRDb250cm9sbGVyKHVybCkge1xuICAgIHJldHVybiB0aGlzLmNvbnRyb2xsZXJzW3VybF0gfHwgbnVsbFxuICB9XG5cbiAgZmluZENvbnRyb2xsZXIoY2FsbGJhY2spIHtcbiAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyh0aGlzLmNvbnRyb2xsZXJzKS5maW5kKGNhbGxiYWNrKVxuICB9XG5cbiAgZ2V0QWRtaW5Db250cm9sbGVyKCkge1xuICAgIHJldHVybiB0aGlzLmZpbmRDb250cm9sbGVyKFxuICAgICAgY29udHJvbGxlciA9PiBjb250cm9sbGVyIGluc3RhbmNlb2YgQWRtaW5Db250cm9sbGVyXG4gICAgKVxuICB9XG5cbiAgZ2V0QWRtaW5WdWVDb25maWcoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0QWRtaW5Db250cm9sbGVyKCk/LmdldFZ1ZUNvbmZpZygpIHx8IG51bGxcbiAgfVxuXG4gIGdldEFzc2V0Q29uZmlnKHtcbiAgICBtb2RlbHMgPSBPYmplY3Qua2V5cyh0aGlzLm1vZGVscyksXG4gICAgbm9ybWFsaXplRGJOYW1lcyA9IHRoaXMuY29uZmlnLmtuZXgubm9ybWFsaXplRGJOYW1lc1xuICB9ID0ge30pIHtcbiAgICBjb25zdCBhc3NldENvbmZpZyA9IHt9XG4gICAgZm9yIChjb25zdCBtb2RlbE5hbWUgb2YgbW9kZWxzKSB7XG4gICAgICBjb25zdCBtb2RlbENsYXNzID0gdGhpcy5tb2RlbHNbbW9kZWxOYW1lXVxuICAgICAgY29uc3QgeyBhc3NldHMgfSA9IG1vZGVsQ2xhc3MuZGVmaW5pdGlvblxuICAgICAgaWYgKGFzc2V0cykge1xuICAgICAgICBjb25zdCBub3JtYWxpemVkTW9kZWxOYW1lID0gbm9ybWFsaXplRGJOYW1lc1xuICAgICAgICAgID8gdGhpcy5ub3JtYWxpemVJZGVudGlmaWVyKG1vZGVsTmFtZSlcbiAgICAgICAgICA6IG1vZGVsTmFtZVxuICAgICAgICBjb25zdCBjb252ZXJ0ZWRBc3NldHMgPSB7fVxuICAgICAgICBmb3IgKGNvbnN0IFthc3NldERhdGFQYXRoLCBjb25maWddIG9mIE9iamVjdC5lbnRyaWVzKGFzc2V0cykpIHtcbiAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICBwcm9wZXJ0eSxcbiAgICAgICAgICAgIG5lc3RlZERhdGFQYXRoLFxuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIGluZGV4XG4gICAgICAgICAgfSA9IG1vZGVsQ2xhc3MuZ2V0UHJvcGVydHlPclJlbGF0aW9uQXREYXRhUGF0aChhc3NldERhdGFQYXRoKVxuICAgICAgICAgIGlmIChwcm9wZXJ0eSAmJiBpbmRleCA9PT0gMCkge1xuICAgICAgICAgICAgY29uc3Qgbm9ybWFsaXplZE5hbWUgPSBub3JtYWxpemVEYk5hbWVzXG4gICAgICAgICAgICAgID8gdGhpcy5ub3JtYWxpemVJZGVudGlmaWVyKG5hbWUpXG4gICAgICAgICAgICAgIDogbmFtZVxuICAgICAgICAgICAgY29uc3QgZGF0YVBhdGggPSBub3JtYWxpemVEYXRhUGF0aChbXG4gICAgICAgICAgICAgIG5vcm1hbGl6ZWROYW1lLFxuICAgICAgICAgICAgICAuLi5wYXJzZURhdGFQYXRoKG5lc3RlZERhdGFQYXRoKVxuICAgICAgICAgICAgXSlcbiAgICAgICAgICAgIGNvbnN0IGFzc2V0Q29uZmlncyA9IGNvbnZlcnRlZEFzc2V0c1tub3JtYWxpemVkTmFtZV0gfHw9IHt9XG4gICAgICAgICAgICBhc3NldENvbmZpZ3NbZGF0YVBhdGhdID0gY29uZmlnXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTmVzdGVkIGdyYXBoIHByb3BlcnRpZXMgYXJlIG5vdCBzdXBwb3J0ZWQgeWV0JylcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYXNzZXRDb25maWdbbm9ybWFsaXplZE1vZGVsTmFtZV0gPSBjb252ZXJ0ZWRBc3NldHNcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGFzc2V0Q29uZmlnXG4gIH1cblxuICBhZGRTdG9yYWdlcyhzdG9yYWdlcykge1xuICAgIGZvciAoY29uc3QgW25hbWUsIGNvbmZpZ10gb2YgT2JqZWN0LmVudHJpZXMoc3RvcmFnZXMpKSB7XG4gICAgICB0aGlzLmFkZFN0b3JhZ2UoY29uZmlnLCBuYW1lKVxuICAgIH1cbiAgfVxuXG4gIGFkZFN0b3JhZ2UoY29uZmlnLCBuYW1lKSB7XG4gICAgbGV0IHN0b3JhZ2UgPSBudWxsXG4gICAgaWYgKGlzUGxhaW5PYmplY3QoY29uZmlnKSkge1xuICAgICAgY29uc3Qgc3RvcmFnZUNsYXNzID0gU3RvcmFnZS5nZXQoY29uZmlnLnR5cGUpXG4gICAgICBpZiAoIXN0b3JhZ2VDbGFzcykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIHN0b3JhZ2U6ICR7Y29uZmlnfWApXG4gICAgICB9XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbmV3LWNhcFxuICAgICAgc3RvcmFnZSA9IG5ldyBzdG9yYWdlQ2xhc3ModGhpcywgY29uZmlnKVxuICAgIH0gZWxzZSBpZiAoY29uZmlnIGluc3RhbmNlb2YgU3RvcmFnZSkge1xuICAgICAgc3RvcmFnZSA9IGNvbmZpZ1xuICAgIH1cbiAgICBpZiAoc3RvcmFnZSkge1xuICAgICAgaWYgKG5hbWUpIHtcbiAgICAgICAgc3RvcmFnZS5uYW1lID0gbmFtZVxuICAgICAgfVxuICAgICAgdGhpcy5zdG9yYWdlc1tzdG9yYWdlLm5hbWVdID0gc3RvcmFnZVxuICAgIH1cbiAgICByZXR1cm4gc3RvcmFnZVxuICB9XG5cbiAgZ2V0U3RvcmFnZShuYW1lKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmFnZXNbbmFtZV0gfHwgbnVsbFxuICB9XG5cbiAgY29tcGlsZVZhbGlkYXRvcihqc29uU2NoZW1hLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIGpzb25TY2hlbWFcbiAgICAgID8gdGhpcy52YWxpZGF0b3IuY29tcGlsZShqc29uU2NoZW1hLCBvcHRpb25zKVxuICAgICAgOiBudWxsXG4gIH1cblxuICBjb21waWxlUGFyYW1ldGVyc1ZhbGlkYXRvcihwYXJhbWV0ZXJzLCBvcHRpb25zID0ge30pIHtcbiAgICBjb25zdCBsaXN0ID0gW11cbiAgICBjb25zdCB7IGRhdGFOYW1lID0gJ2RhdGEnIH0gPSBvcHRpb25zXG5cbiAgICBsZXQgcHJvcGVydGllcyA9IG51bGxcbiAgICBjb25zdCBhZGRQYXJhbWV0ZXIgPSAobmFtZSwgc2NoZW1hKSA9PiB7XG4gICAgICBsaXN0LnB1c2goe1xuICAgICAgICBuYW1lOiBuYW1lID8/IG51bGwsXG4gICAgICAgIC4uLnNjaGVtYVxuICAgICAgfSlcbiAgICAgIGlmICghc2NoZW1hLm1lbWJlcikge1xuICAgICAgICBwcm9wZXJ0aWVzIHx8PSB7fVxuICAgICAgICBwcm9wZXJ0aWVzW25hbWUgfHwgZGF0YU5hbWVdID0gc2NoZW1hXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gU3VwcG9ydCB0d28gZm9ybWF0cyBvZiBwYXJhbWV0ZXJzIGRlZmluaXRpb25zOlxuICAgIC8vIC0gQW4gYXJyYXkgb2YgcGFyYW1ldGVyIHNjaGVtYXMsIG5hbWVkIGJ5IHRoZWlyIGBuYW1lYCBrZXkuXG4gICAgLy8gLSBBbiBvYmplY3Qgb2YgcGFyYW1ldGVyIHNjaGVtYXMsIG5hbWVkIGJ5IHRoZSBrZXkgdW5kZXIgd2hpY2ggZWFjaFxuICAgIC8vICAgc2NoZW1hIGlzIHN0b3JlZCBpbiB0aGUgcm9vdCBvYmplY3QuXG4gICAgLy8gSWYgYW4gYXJyYXkgaXMgcGFzc2VkLCB0aGVuIHRoZSBjb250cm9sbGVyIGFjdGlvbnMgcmVjZWl2ZXMgdGhlXG4gICAgLy8gcGFyYW1ldGVycyBhcyBzZXBhcmF0ZSBhcmd1bWVudHMuIElmIGFuIG9iamVjdCBpcyBwYXNzZWQsIHRoZW4gdGhlXG4gICAgLy8gYWN0aW9ucyByZWNlaXZlcyBvbmUgcGFyYW1ldGVyIG9iamVjdCB3aGVyZSB1bmRlciB0aGUgc2FtZSBrZXlzIHRoZVxuICAgIC8vIHNwZWNpZmllZCBwYXJhbWV0ZXIgdmFsdWVzIGFyZSBzdG9yZWQuXG4gICAgbGV0IGFzT2JqZWN0ID0gZmFsc2VcbiAgICBpZiAoaXNBcnJheShwYXJhbWV0ZXJzKSkge1xuICAgICAgZm9yIChjb25zdCB7IG5hbWUsIC4uLnNjaGVtYSB9IG9mIHBhcmFtZXRlcnMpIHtcbiAgICAgICAgYWRkUGFyYW1ldGVyKG5hbWUsIHNjaGVtYSlcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGlzT2JqZWN0KHBhcmFtZXRlcnMpKSB7XG4gICAgICBhc09iamVjdCA9IHRydWVcbiAgICAgIGZvciAoY29uc3QgW25hbWUsIHNjaGVtYV0gb2YgT2JqZWN0LmVudHJpZXMocGFyYW1ldGVycykpIHtcbiAgICAgICAgaWYgKHNjaGVtYSkge1xuICAgICAgICAgIGFkZFBhcmFtZXRlcihuYW1lLCBzY2hlbWEpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHBhcmFtZXRlcnMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBwYXJhbWV0ZXJzIGRlZmluaXRpb246ICR7cGFyYW1ldGVyc31gKVxuICAgIH1cbiAgICAvLyBOT1RFOiBJZiBwcm9wZXJ0aWVzIGlzIG51bGwsIHNjaGVtYSBhbmQgdmFsaWRhdGUgd2lsbCBiZWNvbWUgbnVsbCB0b28uXG4gICAgLy8gTk9URTogSWYgaXQgaXMgbm90IG51bGwsIGl0IHdpbGwgZ2V0IGV4cGFuZGVkIHRvIGFuIG9iamVjdCBzY2hlbWEuXG4gICAgY29uc3Qgc2NoZW1hID0gY29udmVydFNjaGVtYShwcm9wZXJ0aWVzLCBvcHRpb25zKVxuICAgIGNvbnN0IHZhbGlkYXRlID0gdGhpcy5jb21waWxlVmFsaWRhdG9yKHNjaGVtYSwge1xuICAgICAgLy8gRm9yIHBhcmFtZXRlcnMsIGFsd2F5cyBjb2VyY2UgdHlwZXMsIGluY2x1ZGluZyBhcnJheXMuXG4gICAgICBjb2VyY2VUeXBlczogJ2FycmF5JyxcbiAgICAgIC4uLm9wdGlvbnNcbiAgICB9KVxuICAgIGNvbnN0IGN0eCA9IHtcbiAgICAgIGFwcDogdGhpcyxcbiAgICAgIHZhbGlkYXRvcjogdGhpcy52YWxpZGF0b3IsXG4gICAgICBvcHRpb25zXG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBsaXN0LFxuICAgICAgc2NoZW1hLFxuICAgICAgYXNPYmplY3QsXG4gICAgICBkYXRhTmFtZSxcbiAgICAgIHZhbGlkYXRlOiB2YWxpZGF0ZVxuICAgICAgICAvLyBVc2UgYGNhbGwoKWAgdG8gcGFzcyBjdHggYXMgY29udGV4dCB0byBBanYsIHNlZSBwYXNzQ29udGV4dDpcbiAgICAgICAgPyBkYXRhID0+IHZhbGlkYXRlLmNhbGwoY3R4LCBkYXRhKVxuICAgICAgICA6IG51bGxcbiAgICB9XG4gIH1cblxuICBjcmVhdGVWYWxpZGF0aW9uRXJyb3IoeyB0eXBlLCBtZXNzYWdlLCBlcnJvcnMsIG9wdGlvbnMgfSkge1xuICAgIHJldHVybiBuZXcgVmFsaWRhdGlvbkVycm9yKHtcbiAgICAgIHR5cGUsXG4gICAgICBtZXNzYWdlLFxuICAgICAgZXJyb3JzOiB0aGlzLnZhbGlkYXRvci5wYXJzZUVycm9ycyhlcnJvcnMsIG9wdGlvbnMpXG4gICAgfSlcbiAgfVxuXG4gIHNldHVwR2xvYmFsTWlkZGxld2FyZSgpIHtcbiAgICBjb25zdCB7IGFwcCwgbG9nIH0gPSB0aGlzLmNvbmZpZ1xuXG4gICAgdGhpcy51c2UoYXR0YWNoTG9nZ2VyKHRoaXMubG9nZ2VyKSlcblxuICAgIGlmIChhcHAucmVzcG9uc2VUaW1lICE9PSBmYWxzZSkge1xuICAgICAgdGhpcy51c2UocmVzcG9uc2VUaW1lKGdldE9wdGlvbnMoYXBwLnJlc3BvbnNlVGltZSkpKVxuICAgIH1cbiAgICBpZiAobG9nLnJlcXVlc3RzKSB7XG4gICAgICB0aGlzLnVzZShsb2dSZXF1ZXN0cygpKVxuICAgIH1cbiAgICAvLyBOZWVkcyB0byBiZSBwb3NpdGlvbmVkIGFmdGVyIHRoZSByZXF1ZXN0IGxvZ2dlciB0byBsb2cgdGhlIGNvcnJlY3RcbiAgICAvLyByZXNwb25zZSBzdGF0dXMuXG4gICAgdGhpcy51c2UoaGFuZGxlRXJyb3IoKSlcbiAgICBpZiAoYXBwLmhlbG1ldCAhPT0gZmFsc2UpIHtcbiAgICAgIHRoaXMudXNlKGhlbG1ldChnZXRPcHRpb25zKGFwcC5oZWxtZXQpKSlcbiAgICB9XG4gICAgaWYgKGFwcC5jb3JzICE9PSBmYWxzZSkge1xuICAgICAgdGhpcy51c2UoY29ycyhnZXRPcHRpb25zKGFwcC5jb3JzKSkpXG4gICAgfVxuICAgIGlmIChhcHAuY29tcHJlc3MgIT09IGZhbHNlKSB7XG4gICAgICB0aGlzLnVzZShjb21wcmVzcyhtZXJnZShcbiAgICAgICAge1xuICAgICAgICAgIC8vIFVzZSBhIHJlYXNvbmFibGUgZGVmYXVsdCBmb3IgQnJvdGxpIGNvbXByZXNzaW9uLlxuICAgICAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20va29hanMvY29tcHJlc3MvaXNzdWVzLzEyNlxuICAgICAgICAgIGJyOiB7XG4gICAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgICAgW3psaWIuY29uc3RhbnRzLkJST1RMSV9QQVJBTV9RVUFMSVRZXTogNFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZ2V0T3B0aW9ucyhhcHAuY29tcHJlc3MpXG4gICAgICApKSlcbiAgICB9XG4gICAgaWYgKGFwcC5ldGFnICE9PSBmYWxzZSkge1xuICAgICAgdGhpcy51c2UoY29uZGl0aW9uYWwoKSlcbiAgICAgIHRoaXMudXNlKGV0YWcoKSlcbiAgICB9XG4gIH1cblxuICBzZXR1cENvbnRyb2xsZXJNaWRkbGV3YXJlKCkge1xuICAgIC8vIE5PVEU6IFRoaXMgaXMgbm90IHBhcnQgb2YgdGhlIGF1dG9tYXRpYyBgc2V0dXBHbG9iYWxNaWRkbGV3YXJlKClgIHNvIHRoYXRcbiAgICAvLyBhcHBzIGNhbiBzZXQgdXAgdGhlIHN0YXRpYyBzZXJ2aW5nIG9mIGFzc2V0cyBiZWZvcmUgaW5zdGFsbGluZyB0aGVcbiAgICAvLyBzZXNzaW9uIGFuZCBwYXNzcG9ydCBtaWRkbGV3YXJlLiBJdCBpcyBjYWxsZWQgZnJvbSBgYWRkQ29udHJvbGxlcigpYC5cbiAgICAvLyBVc2UgYSBmbGFnIHRvIG9ubHkgaW5zdGFsbCB0aGUgbWlkZGxld2FyZSBvbmNlOlxuICAgIGlmICghdGhpcy5oYXNDb250cm9sbGVyTWlkZGxld2FyZSkge1xuICAgICAgY29uc3QgeyBhcHAgfSA9IHRoaXMuY29uZmlnXG4gICAgICAvLyBTZXF1ZW5jZSBpcyBpbXBvcnRhbnQ6XG4gICAgICAvLyAxLiBib2R5IHBhcnNlclxuICAgICAgdGhpcy51c2UoYm9keVBhcnNlcihnZXRPcHRpb25zKGFwcC5ib2R5UGFyc2VyKSkpXG4gICAgICAvLyAyLiBmaW5kIHJvdXRlIGZyb20gcm91dGVzIGluc3RhbGxlZCBieSBjb250cm9sbGVycy5cbiAgICAgIHRoaXMudXNlKGZpbmRSb3V0ZSh0aGlzLnJvdXRlcikpXG4gICAgICAvLyAzLiByZXNwZWN0IHRyYW5zYWN0ZWQgc2V0dGluZ3MsIGNyZWF0ZSBhbmQgaGFuZGxlIHRyYW5zYWN0aW9ucy5cbiAgICAgIHRoaXMudXNlKGNyZWF0ZVRyYW5zYWN0aW9uKCkpXG4gICAgICAvLyA0LiBzZXNzaW9uXG4gICAgICBpZiAoYXBwLnNlc3Npb24pIHtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIG1vZGVsQ2xhc3MsXG4gICAgICAgICAgLi4ub3B0aW9uc1xuICAgICAgICB9ID0gZ2V0T3B0aW9ucyhhcHAuc2Vzc2lvbilcbiAgICAgICAgaWYgKG1vZGVsQ2xhc3MpIHtcbiAgICAgICAgICAvLyBDcmVhdGUgYSBDb250ZXh0U3RvcmUgdGhhdCByZXNvbHZlZCB0aGUgc3BlY2lmaWVkIG1vZGVsIGNsYXNzLFxuICAgICAgICAgIC8vIHVzZXMgaXQgdG8gcGVyc2lzdCBhbmQgcmV0cmlldmUgdGhlIHNlc3Npb24sIGFuZCBhdXRvbWF0aWNhbGx5XG4gICAgICAgICAgLy8gYmluZHMgYWxsIGRiIG9wZXJhdGlvbnMgdG8gYGN0eC50cmFuc2FjdGlvbmAsIGlmIGl0IGlzIHNldC5cbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbmV3LWNhcFxuICAgICAgICAgIG9wdGlvbnMuQ29udGV4dFN0b3JlID0gU2Vzc2lvblN0b3JlKG1vZGVsQ2xhc3MpXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51c2Uoc2Vzc2lvbihvcHRpb25zLCB0aGlzKSlcbiAgICAgIH1cbiAgICAgIC8vIDUuIHBhc3Nwb3J0XG4gICAgICBpZiAoYXBwLnBhc3Nwb3J0KSB7XG4gICAgICAgIHRoaXMudXNlKHBhc3Nwb3J0LmluaXRpYWxpemUoKSlcbiAgICAgICAgaWYgKGFwcC5zZXNzaW9uKSB7XG4gICAgICAgICAgdGhpcy51c2UocGFzc3BvcnQuc2Vzc2lvbigpKVxuICAgICAgICB9XG4gICAgICAgIHRoaXMudXNlKGhhbmRsZVVzZXIoKSlcbiAgICAgIH1cblxuICAgICAgLy8gNi4gZmluYWxseSBoYW5kbGUgdGhlIGZvdW5kIHJvdXRlLCBvciBzZXQgc3RhdHVzIC8gYWxsb3cgYWNjb3JkaW5nbHkuXG4gICAgICB0aGlzLnVzZShoYW5kbGVSb3V0ZSgpKVxuICAgICAgdGhpcy5oYXNDb250cm9sbGVyTWlkZGxld2FyZSA9IHRydWVcbiAgICB9XG4gIH1cblxuICBzZXR1cExvZ2dlcigpIHtcbiAgICBjb25zdCB7IGVyciwgcmVxLCByZXMgfSA9IHBpbm8uc3RkU2VyaWFsaXplcnNcbiAgICAvLyBPbmx5IGluY2x1ZGUgYGlkYCBmcm9tIHRoZSB1c2VyLCB0byBub3QgaW5hZHZlcnRlbnRseSBsb2cgUElJLlxuICAgIGNvbnN0IHVzZXIgPSB1c2VyID0+ICh7IGlkOiB1c2VyLmlkIH0pXG4gICAgY29uc3Qgc2VyaWFsaXplcnMgPSB7IGVyciwgcmVxLCByZXMsIHVzZXIgfVxuXG4gICAgY29uc3QgbG9nZ2VyID0gcGlubyhtZXJnZShcbiAgICAgIHtcbiAgICAgICAgbGV2ZWw6ICdpbmZvJyxcbiAgICAgICAgc2VyaWFsaXplcnMsXG4gICAgICAgIHByZXR0eVByaW50OiB7XG4gICAgICAgICAgLy8gTGlzdCBvZiBrZXlzIHRvIGlnbm9yZSBpbiBwcmV0dHkgbW9kZS5cbiAgICAgICAgICBpZ25vcmU6ICdyZXEscmVzLGR1cmF0aW9uTXMsdXNlcixyZXF1ZXN0SWQnLFxuICAgICAgICAgIC8vIFNZUyB0byB1c2Ugc3lzdGVtIHRpbWUgYW5kIG5vdCBVVEMuXG4gICAgICAgICAgdHJhbnNsYXRlVGltZTogJ1NZUzpISDpNTTpzcy5sJ1xuICAgICAgICB9LFxuICAgICAgICAvLyBSZWRhY3QgY29tbW9uIHNlbnNpdGl2ZSBoZWFkZXJzLlxuICAgICAgICByZWRhY3Q6IFtcbiAgICAgICAgICAnKi5oZWFkZXJzW1wiY29va2llXCJdJyxcbiAgICAgICAgICAnKi5oZWFkZXJzW1wic2V0LWNvb2tpZVwiXScsXG4gICAgICAgICAgJyouaGVhZGVyc1tcImF1dGhvcml6YXRpb25cIl0nXG4gICAgICAgIF0sXG4gICAgICAgIGJhc2U6IG51bGwgLy8gbm8gcGlkLGhvc3RuYW1lLG5hbWVcbiAgICAgIH0sXG4gICAgICBnZXRPcHRpb25zKHRoaXMuY29uZmlnLmxvZ2dlcilcbiAgICApKVxuXG4gICAgdGhpcy5sb2dnZXIgPSBsb2dnZXIuY2hpbGQoeyBuYW1lOiAnYXBwJyB9KVxuICB9XG5cbiAgc2V0dXBLbmV4KCkge1xuICAgIGxldCB7IGtuZXgsIGxvZyB9ID0gdGhpcy5jb25maWdcbiAgICBpZiAoa25leD8uY2xpZW50KSB7XG4gICAgICBjb25zdCBzbmFrZUNhc2VPcHRpb25zID0ga25leC5ub3JtYWxpemVEYk5hbWVzID09PSB0cnVlXG4gICAgICAgID8ge31cbiAgICAgICAgOiBrbmV4Lm5vcm1hbGl6ZURiTmFtZXNcbiAgICAgIGlmIChzbmFrZUNhc2VPcHRpb25zKSB7XG4gICAgICAgIGtuZXggPSB7XG4gICAgICAgICAgLi4ua25leCxcbiAgICAgICAgICAuLi5rbmV4U25ha2VDYXNlTWFwcGVycyhzbmFrZUNhc2VPcHRpb25zKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLmtuZXggPSBLbmV4KGtuZXgpXG4gICAgICBpZiAobG9nLnNxbCkge1xuICAgICAgICB0aGlzLnNldHVwS25leExvZ2dpbmcoKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHNldHVwS25leExvZ2dpbmcoKSB7XG4gICAgY29uc3Qgc3RhcnRUaW1lcyA9IHt9XG4gICAgY29uc3QgbG9nZ2VyID0gdGhpcy5sb2dnZXIuY2hpbGQoeyBuYW1lOiAnc3FsJyB9KVxuICAgIGZ1bmN0aW9uIGVuZChxdWVyeSwgeyByZXNwb25zZSwgZXJyb3IgfSkge1xuICAgICAgY29uc3QgaWQgPSBxdWVyeS5fX2tuZXhRdWVyeVVpZFxuICAgICAgY29uc3QgZGlmZiA9IHByb2Nlc3MuaHJ0aW1lKHN0YXJ0VGltZXNbaWRdKVxuICAgICAgY29uc3QgZHVyYXRpb24gPSBkaWZmWzBdICogMWUzICsgZGlmZlsxXSAvIDFlNlxuICAgICAgZGVsZXRlIHN0YXJ0VGltZXNbaWRdXG4gICAgICBjb25zdCB7IHNxbCwgYmluZGluZ3MgfSA9IHF1ZXJ5XG4gICAgICByZXNwb25zZSA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgT2JqZWN0LmVudHJpZXMocmVzcG9uc2UpLmZpbHRlcihcbiAgICAgICAgICAoW2tleV0pID0+ICFrZXkuc3RhcnRzV2l0aCgnXycpXG4gICAgICAgIClcbiAgICAgIClcbiAgICAgIGxvZ2dlci5pbmZvKHsgZHVyYXRpb24sIGJpbmRpbmdzLCByZXNwb25zZSwgZXJyb3IgfSwgc3FsKVxuICAgIH1cblxuICAgIHRoaXMua25leFxuICAgICAgLm9uKCdxdWVyeScsIHF1ZXJ5ID0+IHtcbiAgICAgICAgc3RhcnRUaW1lc1txdWVyeS5fX2tuZXhRdWVyeVVpZF0gPSBwcm9jZXNzLmhydGltZSgpXG4gICAgICB9KVxuICAgICAgLm9uKCdxdWVyeS1yZXNwb25zZScsIChyZXNwb25zZSwgcXVlcnkpID0+IHtcbiAgICAgICAgZW5kKHF1ZXJ5LCB7IHJlc3BvbnNlIH0pXG4gICAgICB9KVxuICAgICAgLm9uKCdxdWVyeS1lcnJvcicsIChlcnJvciwgcXVlcnkpID0+IHtcbiAgICAgICAgZW5kKHF1ZXJ5LCB7IGVycm9yIH0pXG4gICAgICB9KVxuICB9XG5cbiAgbm9ybWFsaXplSWRlbnRpZmllcihpZGVudGlmaWVyKSB7XG4gICAgcmV0dXJuIHRoaXMua25leC5jbGllbnQud3JhcElkZW50aWZpZXIoaWRlbnRpZmllcikucmVwbGFjZSgvWydgXCJdL2csICcnKVxuICB9XG5cbiAgZGVub3JtYWxpemVJZGVudGlmaWVyKGlkZW50aWZpZXIpIHtcbiAgICBjb25zdCBvYmogPSB0aGlzLmtuZXguY2xpZW50LnBvc3RQcm9jZXNzUmVzcG9uc2UoeyBbaWRlbnRpZmllcl06IDEgfSlcbiAgICByZXR1cm4gT2JqZWN0LmtleXMob2JqKVswXVxuICB9XG5cbiAgbm9ybWFsaXplUGF0aChwYXRoKSB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLmFwcC5ub3JtYWxpemVQYXRocyA/IGh5cGhlbmF0ZShwYXRoKSA6IHBhdGhcbiAgfVxuXG4gIGZvcm1hdEVycm9yKGVycikge1xuICAgIGNvbnN0IG1lc3NhZ2UgPSBlcnIudG9KU09OXG4gICAgICA/IGZvcm1hdEpzb24oZXJyLnRvSlNPTigpKVxuICAgICAgOiBlcnIubWVzc2FnZSB8fCBlcnJcbiAgICBjb25zdCBzdHIgPSBgJHtlcnIubmFtZX06ICR7bWVzc2FnZX1gXG4gICAgcmV0dXJuIGVyci5zdGFjayAmJiB0aGlzLmNvbmZpZy5sb2cuZXJyb3JzPy5zdGFjayAhPT0gZmFsc2VcbiAgICAgID8gYCR7c3RyfVxcbiR7ZXJyLnN0YWNrLnNwbGl0KC9cXG58XFxyXFxufFxcci8pLnNsaWNlKDEpLmpvaW4ob3MuRU9MKX1gXG4gICAgICA6IHN0clxuICB9XG5cbiAgbG9nRXJyb3IoZXJyLCBjdHgpIHtcbiAgICBpZiAoIWVyci5leHBvc2UgJiYgIXRoaXMuc2lsZW50KSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB0ZXh0ID0gdGhpcy5mb3JtYXRFcnJvcihlcnIpXG4gICAgICAgIGNvbnN0IGxldmVsID1cbiAgICAgICAgICBlcnIgaW5zdGFuY2VvZiBSZXNwb25zZUVycm9yICYmIGVyci5zdGF0dXMgPCA1MDAgPyAnaW5mbycgOiAnZXJyb3InXG4gICAgICAgIGNvbnN0IGxvZ2dlciA9IGN0eD8ubG9nZ2VyIHx8IHRoaXMubG9nZ2VyXG4gICAgICAgIGxvZ2dlcltsZXZlbF0odGV4dClcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignQ291bGQgbm90IGxvZyBlcnJvcicsIGUpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgc3RhcnQoKSB7XG4gICAgaWYgKHRoaXMuY29uZmlnLmxvZy5lcnJvcnMgIT09IGZhbHNlKSB7XG4gICAgICB0aGlzLm9uKCdlcnJvcicsIHRoaXMubG9nRXJyb3IpXG4gICAgfVxuICAgIGF3YWl0IHRoaXMuZW1pdCgnYmVmb3JlOnN0YXJ0JylcbiAgICBhd2FpdCB0aGlzLmZvckVhY2hTZXJ2aWNlKHNlcnZpY2UgPT4gc2VydmljZS5zdGFydCgpKVxuICAgIGNvbnN0IHtcbiAgICAgIHNlcnZlcjogeyBob3N0LCBwb3J0IH0sXG4gICAgICBlbnZcbiAgICB9ID0gdGhpcy5jb25maWdcbiAgICB0aGlzLnNlcnZlciA9IGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IHNlcnZlciA9IHRoaXMubGlzdGVuKHBvcnQsIGhvc3QsICgpID0+IHtcbiAgICAgICAgY29uc3QgeyBwb3J0IH0gPSBzZXJ2ZXIuYWRkcmVzcygpXG4gICAgICAgIGNvbnNvbGUuaW5mbyhcbiAgICAgICAgICBgJHtlbnZ9IHNlcnZlciBzdGFydGVkIGF0IGh0dHA6Ly8ke2hvc3R9OiR7cG9ydH1gXG4gICAgICAgIClcbiAgICAgICAgcmVzb2x2ZShzZXJ2ZXIpXG4gICAgICB9KVxuICAgICAgaWYgKCFzZXJ2ZXIpIHtcbiAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgVW5hYmxlIHRvIHN0YXJ0IHNlcnZlciBhdCBodHRwOi8vJHtob3N0fToke3BvcnR9YCkpXG4gICAgICB9XG4gICAgfSlcbiAgICBhd2FpdCB0aGlzLmVtaXQoJ2FmdGVyOnN0YXJ0JylcbiAgfVxuXG4gIGFzeW5jIHN0b3AoKSB7XG4gICAgYXdhaXQgdGhpcy5lbWl0KCdiZWZvcmU6c3RvcCcpXG4gICAgdGhpcy5zZXJ2ZXIgPSBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCB7IHNlcnZlciB9ID0gdGhpc1xuICAgICAgaWYgKHNlcnZlcikge1xuICAgICAgICBzZXJ2ZXIuY2xvc2UoZXJyID0+IHtcbiAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICByZWplY3QoZXJyKVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXNvbHZlKG51bGwpXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICAvLyBIYWNrIHRvIG1ha2Ugc3VyZSB0aGF0IHdlIGNsb3NlIHRoZSBzZXJ2ZXIsXG4gICAgICAgIC8vICBldmVuIGlmIHNvY2tldHMgYXJlIHN0aWxsIG9wZW4uXG4gICAgICAgIC8vICBUYWtlbiBmcm9tIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8zNjgzMDA3Mi5cbiAgICAgICAgLy8gIEEgcHJvcGVyIHNvbHV0aW9uIHdvdWxkIGJlIHRvIHVzZSBhIGxpYnJhcnksIGV4OiBodHRwczovL2dpdGh1Yi5jb20vZ29kYWRkeS90ZXJtaW51c1xuICAgICAgICBzZXRJbW1lZGlhdGUoKCkgPT4gc2VydmVyLmVtaXQoJ2Nsb3NlJykpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZWplY3QobmV3IEVycm9yKCdTZXJ2ZXIgaXMgbm90IHJ1bm5pbmcnKSlcbiAgICAgIH1cbiAgICB9KVxuICAgIGF3YWl0IHRoaXMuZm9yRWFjaFNlcnZpY2Uoc2VydmljZSA9PiBzZXJ2aWNlLnN0b3AoKSlcbiAgICBhd2FpdCB0aGlzLmVtaXQoJ2FmdGVyOnN0b3AnKVxuICAgIGlmICh0aGlzLmNvbmZpZy5sb2cuZXJyb3JzICE9PSBmYWxzZSkge1xuICAgICAgdGhpcy5vZmYoJ2Vycm9yJywgdGhpcy5sb2dFcnJvcilcbiAgICB9XG4gIH1cblxuICBhc3luYyBzdGFydE9yRXhpdCgpIHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5zdGFydCgpXG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aGlzLmxvZ0Vycm9yKGVycilcbiAgICAgIHByb2Nlc3MuZXhpdCgtMSlcbiAgICB9XG4gIH1cblxuICAvLyBBc3NldHMgaGFuZGxpbmdcblxuICBhc3luYyBjcmVhdGVBc3NldHMoc3RvcmFnZSwgZmlsZXMsIGNvdW50ID0gMCwgdHJ4ID0gbnVsbCkge1xuICAgIGNvbnN0IEFzc2V0TW9kZWwgPSB0aGlzLmdldE1vZGVsKCdBc3NldCcpXG4gICAgaWYgKEFzc2V0TW9kZWwpIHtcbiAgICAgIGNvbnN0IGFzc2V0cyA9IGZpbGVzLm1hcChmaWxlID0+ICh7XG4gICAgICAgIGtleTogZmlsZS5rZXksXG4gICAgICAgIGZpbGUsXG4gICAgICAgIHN0b3JhZ2U6IHN0b3JhZ2UubmFtZSxcbiAgICAgICAgY291bnRcbiAgICAgIH0pKVxuICAgICAgcmV0dXJuIEFzc2V0TW9kZWxcbiAgICAgICAgLnF1ZXJ5KHRyeClcbiAgICAgICAgLmluc2VydChhc3NldHMpXG4gICAgfVxuICAgIHJldHVybiBudWxsXG4gIH1cblxuICBhc3luYyBoYW5kbGVBZGRkZWRBbmRSZW1vdmVkQXNzZXRzKFxuICAgIHN0b3JhZ2UsXG4gICAgYWRkZWRGaWxlcyxcbiAgICByZW1vdmVkRmlsZXMsXG4gICAgdHJ4ID0gbnVsbFxuICApIHtcbiAgICBjb25zdCB7XG4gICAgICBhc3NldHM6IHtcbiAgICAgICAgY2xlYW51cFRpbWVUaHJlc2hvbGQgPSAwXG4gICAgICB9ID0ge31cbiAgICB9ID0gdGhpcy5jb25maWdcbiAgICAvLyBPbmx5IHJlbW92ZSB1bnVzZWQgYXNzZXRzIHRoYXQgaGF2ZW4ndCBzZWVuIGNoYW5nZXMgZm9yIGdpdmVuIHRpbWVmcmFtZS5cbiAgICBjb25zdCB0aW1lVGhyZXNob2xkID0gaXNTdHJpbmcoY2xlYW51cFRpbWVUaHJlc2hvbGQpXG4gICAgICA/IHBhcnNlRHVyYXRpb24oY2xlYW51cFRpbWVUaHJlc2hvbGQpXG4gICAgICA6IGNsZWFudXBUaW1lVGhyZXNob2xkXG5cbiAgICBjb25zdCBpbXBvcnRlZEZpbGVzID0gW11cbiAgICBjb25zdCBBc3NldE1vZGVsID0gdGhpcy5nZXRNb2RlbCgnQXNzZXQnKVxuICAgIGlmIChBc3NldE1vZGVsKSB7XG4gICAgICBpbXBvcnRlZEZpbGVzLnB1c2goXG4gICAgICAgIC4uLmF3YWl0IHRoaXMuYWRkRm9yZWlnbkFzc2V0cyhzdG9yYWdlLCBhZGRlZEZpbGVzLCB0cngpXG4gICAgICApXG4gICAgICBpZiAoXG4gICAgICAgIGFkZGVkRmlsZXMubGVuZ3RoID4gMCB8fFxuICAgICAgICByZW1vdmVkRmlsZXMubGVuZ3RoID4gMFxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IGNoYW5nZUNvdW50ID0gKGZpbGVzLCBpbmNyZW1lbnQpID0+IChcbiAgICAgICAgICBmaWxlcy5sZW5ndGggPiAwICYmXG4gICAgICAgICAgQXNzZXRNb2RlbC5xdWVyeSh0cngpXG4gICAgICAgICAgICAud2hlcmVJbigna2V5JywgZmlsZXMubWFwKGZpbGUgPT4gZmlsZS5rZXkpKVxuICAgICAgICAgICAgLmluY3JlbWVudCgnY291bnQnLCBpbmNyZW1lbnQpXG4gICAgICAgIClcbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICAgIGNoYW5nZUNvdW50KGFkZGVkRmlsZXMsIDEpLFxuICAgICAgICAgIGNoYW5nZUNvdW50KHJlbW92ZWRGaWxlcywgLTEpXG4gICAgICAgIF0pXG4gICAgICAgIGlmICh0aW1lVGhyZXNob2xkID4gMCkge1xuICAgICAgICAgIHNldFRpbWVvdXQoXG4gICAgICAgICAgICAvLyBEb24ndCBwYXNzIGB0cnhgIGhlcmUsIGFzIHdlIHdhbnQgdGhpcyBkZWxheWVkIGV4ZWN1dGlvbiB0b1xuICAgICAgICAgICAgLy8gY3JlYXRlIGl0cyBvd24gdHJhbnNhY3Rpb24uXG4gICAgICAgICAgICAoKSA9PiB0aGlzLnJlbGVhc2VVbnVzZWRBc3NldHModGltZVRocmVzaG9sZCksXG4gICAgICAgICAgICB0aW1lVGhyZXNob2xkXG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBBbHNvIGV4ZWN1dGUgcmVsZWFzZVVudXNlZEFzc2V0cygpIGltbWVkaWF0ZWx5IGluIHRoZSBzYW1lXG4gICAgICAvLyB0cmFuc2FjdGlvbiwgdG8gcG90ZW50aWFsbHkgY2xlYW4gdXAgb3RoZXIgcGVuZGluZyBhc3NldHMuXG4gICAgICBhd2FpdCB0aGlzLnJlbGVhc2VVbnVzZWRBc3NldHModGltZVRocmVzaG9sZCwgdHJ4KVxuICAgICAgcmV0dXJuIGltcG9ydGVkRmlsZXNcbiAgICB9XG4gIH1cblxuICBhc3luYyBhZGRGb3JlaWduQXNzZXRzKHN0b3JhZ2UsIGZpbGVzLCB0cnggPSBudWxsKSB7XG4gICAgY29uc3QgaW1wb3J0ZWRGaWxlcyA9IFtdXG4gICAgY29uc3QgQXNzZXRNb2RlbCA9IHRoaXMuZ2V0TW9kZWwoJ0Fzc2V0JylcbiAgICBpZiAoQXNzZXRNb2RlbCkge1xuICAgICAgLy8gRmluZCBtaXNzaW5nIGFzc2V0cyAoY29waWVkIGZyb20gYW5vdGhlciBzeXN0ZW0pLCBhbmQgYWRkIHRoZW0uXG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgZmlsZXMubWFwKGFzeW5jIGZpbGUgPT4ge1xuICAgICAgICAgIGNvbnN0IGFzc2V0ID0gYXdhaXQgQXNzZXRNb2RlbC5xdWVyeSh0cngpLmZpbmRPbmUoJ2tleScsIGZpbGUua2V5KVxuICAgICAgICAgIGlmICghYXNzZXQpIHtcbiAgICAgICAgICAgIGlmIChmaWxlLmRhdGEgfHwgZmlsZS51cmwpIHtcbiAgICAgICAgICAgICAgbGV0IHsgZGF0YSB9ID0gZmlsZVxuICAgICAgICAgICAgICBpZiAoIWRhdGEpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmluZm8oXG4gICAgICAgICAgICAgICAgICBgJHtcbiAgICAgICAgICAgICAgICAgICAgY2hhbGsucmVkKCdJTkZPOicpXG4gICAgICAgICAgICAgICAgICB9IEFzc2V0ICR7XG4gICAgICAgICAgICAgICAgICAgIGNoYWxrLmdyZWVuKGAnJHtmaWxlLm5hbWV9J2ApXG4gICAgICAgICAgICAgICAgICB9IGlzIGZyb20gYSBmb3JlaWduIHNvdXJjZSwgZmV0Y2hpbmcgZnJvbSAke1xuICAgICAgICAgICAgICAgICAgICBjaGFsay5ncmVlbihgJyR7ZmlsZS51cmx9J2ApXG4gICAgICAgICAgICAgICAgICB9IGFuZCBhZGRpbmcgdG8gc3RvcmFnZSAke1xuICAgICAgICAgICAgICAgICAgICBjaGFsay5ncmVlbihgJyR7c3RvcmFnZS5uYW1lfSdgKVxuICAgICAgICAgICAgICAgICAgfS4uLmBcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvcy5yZXF1ZXN0KHtcbiAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ2dldCcsXG4gICAgICAgICAgICAgICAgICB1cmw6IGZpbGUudXJsLFxuICAgICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiAnYXJyYXlidWZmZXInXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICBkYXRhID0gcmVzcG9uc2UuZGF0YVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbnN0IGltcG9ydGVkRmlsZSA9IGF3YWl0IHN0b3JhZ2UuYWRkRmlsZShmaWxlLCBkYXRhKVxuICAgICAgICAgICAgICBhd2FpdCB0aGlzLmNyZWF0ZUFzc2V0cyhzdG9yYWdlLCBbaW1wb3J0ZWRGaWxlXSwgMCwgdHJ4KVxuICAgICAgICAgICAgICAvLyBNZXJnZSBiYWNrIHRoZSBjaGFuZ2VkIGZpbGUgcHJvcGVydGllcyBpbnRvIHRoZSBhY3R1YWwgZmlsZXNcbiAgICAgICAgICAgICAgLy8gb2JqZWN0LCBzbyB0aGF0IHRoZSBkYXRhIGZyb20gdGhlIHN0YXRpYyBtb2RlbCBob29rIGNhbiBiZSB1c2VkXG4gICAgICAgICAgICAgIC8vIGRpcmVjdGx5IGZvciB0aGUgYWN0dWFsIHJ1bm5pbmcgcXVlcnkuXG4gICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oZmlsZSwgaW1wb3J0ZWRGaWxlKVxuICAgICAgICAgICAgICBpbXBvcnRlZEZpbGVzLnB1c2goaW1wb3J0ZWRGaWxlKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2V0RXJyb3IoXG4gICAgICAgICAgICAgICAgYFVuYWJsZSB0byBpbXBvcnQgYXNzZXQgZnJvbSBmb3JlaWduIHNvdXJjZTogJyR7XG4gICAgICAgICAgICAgICAgICBmaWxlLm5hbWVcbiAgICAgICAgICAgICAgICB9JyAoJyR7XG4gICAgICAgICAgICAgICAgICBmaWxlLmtleVxuICAgICAgICAgICAgICAgIH0nKWBcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBBc3NldCBpcyBmcm9tIGEgZm9yZWlnbiBzb3VyY2UsIGJ1dCB3YXMgYWxyZWFkeSBpbXBvcnRlZCBhbmQgY2FuXG4gICAgICAgICAgICAvLyBiZSByZXVzZWQuIFNlZSBhYm92ZSBmb3IgYW4gZXhwbGFuYXRpb24gb2YgdGhpcyBtZXJnZS5cbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oZmlsZSwgYXNzZXQuZmlsZSlcbiAgICAgICAgICAgIC8vIE5PVEU6IE5vIG5lZWQgdG8gYWRkIGBmaWxlYCB0byBgaW1wb3J0ZWRGaWxlc2AsIHNpbmNlIGl0J3NcbiAgICAgICAgICAgIC8vIGFscmVhZHkgYmVlbiBpbXBvcnRlZCB0byB0aGUgc3RvcmFnZSBiZWZvcmUuXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgKVxuICAgIH1cbiAgICByZXR1cm4gaW1wb3J0ZWRGaWxlc1xuICB9XG5cbiAgYXN5bmMgaGFuZGxlTW9kaWZpZWRBc3NldHMoc3RvcmFnZSwgZmlsZXMsIHRyeCA9IG51bGwpIHtcbiAgICBjb25zdCBtb2RpZmllZEZpbGVzID0gW11cbiAgICBjb25zdCBBc3NldE1vZGVsID0gdGhpcy5nZXRNb2RlbCgnQXNzZXQnKVxuICAgIGlmIChBc3NldE1vZGVsKSB7XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgZmlsZXMubWFwKGFzeW5jIGZpbGUgPT4ge1xuICAgICAgICAgIGlmIChmaWxlLmRhdGEpIHtcbiAgICAgICAgICAgIGNvbnN0IGFzc2V0ID0gYXdhaXQgQXNzZXRNb2RlbC5xdWVyeSh0cngpLmZpbmRPbmUoJ2tleScsIGZpbGUua2V5KVxuICAgICAgICAgICAgaWYgKGFzc2V0KSB7XG4gICAgICAgICAgICAgIGNvbnN0IGNoYW5nZWRGaWxlID0gYXdhaXQgc3RvcmFnZS5hZGRGaWxlKGZpbGUsIGZpbGUuZGF0YSlcbiAgICAgICAgICAgICAgLy8gTWVyZ2UgYmFjayB0aGUgY2hhbmdlZCBmaWxlIHByb3BlcnRpZXMgaW50byB0aGUgYWN0dWFsIGZpbGVzXG4gICAgICAgICAgICAgIC8vIG9iamVjdCwgc28gdGhhdCB0aGUgZGF0YSBmcm9tIHRoZSBzdGF0aWMgbW9kZWwgaG9vayBjYW4gYmUgdXNlZFxuICAgICAgICAgICAgICAvLyBkaXJlY3RseSBmb3IgdGhlIGFjdHVhbCBydW5uaW5nIHF1ZXJ5LlxuICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKGZpbGUsIGNoYW5nZWRGaWxlKVxuICAgICAgICAgICAgICBtb2RpZmllZEZpbGVzLnB1c2goY2hhbmdlZEZpbGUpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXRFcnJvcihcbiAgICAgICAgICAgICAgICBgVW5hYmxlIHRvIHVwZGF0ZSBtb2RpZmllZCBhc3NldCBmcm9tIG1lbW9yeSBzb3VyY2U6ICcke1xuICAgICAgICAgICAgICAgICAgZmlsZS5uYW1lXG4gICAgICAgICAgICAgICAgfScgKCcke1xuICAgICAgICAgICAgICAgICAgZmlsZS5rZXlcbiAgICAgICAgICAgICAgICB9JylgXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICApXG4gICAgfVxuICAgIHJldHVybiBtb2RpZmllZEZpbGVzXG4gIH1cblxuICBhc3luYyByZWxlYXNlVW51c2VkQXNzZXRzKHRpbWVUaHJlc2hvbGQgPSAwLCB0cnggPSBudWxsKSB7XG4gICAgY29uc3QgQXNzZXRNb2RlbCA9IHRoaXMuZ2V0TW9kZWwoJ0Fzc2V0JylcbiAgICBpZiAoQXNzZXRNb2RlbCkge1xuICAgICAgcmV0dXJuIEFzc2V0TW9kZWwudHJhbnNhY3Rpb24odHJ4LCBhc3luYyB0cnggPT4ge1xuICAgICAgICAvLyBEZXRlcm1pbmUgdGhlIHRpbWUgdGhyZXNob2xkIGluIEpTIGluc3RlYWQgb2YgU1FMLCBhcyB0aGVyZSBpcyBub1xuICAgICAgICAvLyBlYXN5IGNyb3NzLVNRTCB3YXkgdG8gZG8gYG5vdygpIC0gaW50ZXJ2YWwgWCBob3Vyc2A6XG4gICAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSgpXG4gICAgICAgIGRhdGUuc2V0TWlsbGlzZWNvbmRzKGRhdGUuZ2V0TWlsbGlzZWNvbmRzKCkgLSB0aW1lVGhyZXNob2xkKVxuICAgICAgICBjb25zdCBvcnBoYW5lZEFzc2V0cyA9IGF3YWl0IEFzc2V0TW9kZWxcbiAgICAgICAgICAucXVlcnkodHJ4KVxuICAgICAgICAgIC53aGVyZSgnY291bnQnLCAwKVxuICAgICAgICAgIC5hbmRXaGVyZSgndXBkYXRlZEF0JywgJzw9JywgZGF0ZSlcbiAgICAgICAgICAvLyBQcm90ZWN0IGZyZXNobHkgY3JlYXRlZCBhc3NldHMgZnJvbSBiZWluZyBkZWxldGVkIGFnYWluIHJpZ2h0IGF3YXksXG4gICAgICAgICAgLy8gLmUuZy4gd2hlbiBgY29uZmlnLmFzc2V0cy5jbGVhbnVwVGltZVRocmVzaG9sZCA9IDBgXG4gICAgICAgICAgLmFuZFdoZXJlKCd1cGRhdGVkQXQnLCAnPicsIHJlZignY3JlYXRlZEF0JykpXG4gICAgICAgIGlmIChvcnBoYW5lZEFzc2V0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29uc3Qgb3JwaGFuZWRLZXlzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgICBvcnBoYW5lZEFzc2V0cy5tYXAoYXN5bmMgYXNzZXQgPT4ge1xuICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZ2V0U3RvcmFnZShhc3NldC5zdG9yYWdlKS5yZW1vdmVGaWxlKGFzc2V0LmZpbGUpXG4gICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdlcnJvcicsIGVycm9yKVxuICAgICAgICAgICAgICAgIGFzc2V0LmVycm9yID0gZXJyb3JcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gYXNzZXQua2V5XG4gICAgICAgICAgICB9KVxuICAgICAgICAgIClcbiAgICAgICAgICBhd2FpdCBBc3NldE1vZGVsXG4gICAgICAgICAgICAucXVlcnkodHJ4KVxuICAgICAgICAgICAgLmRlbGV0ZSgpXG4gICAgICAgICAgICAud2hlcmVJbigna2V5Jywgb3JwaGFuZWRLZXlzKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvcnBoYW5lZEFzc2V0c1xuICAgICAgfSlcbiAgICB9XG4gIH1cbn1cblxuLy8gT3ZlcnJpZGUgS29hJ3MgZXZlbnRzIHdpdGggb3VyIG93biBFdmVudEVtaXR0ZXIgdGhhdCBhZGRzIHN1cHBvcnQgZm9yXG4vLyBhc3luY2hyb25vdXMgZXZlbnRzLlxuRXZlbnRFbWl0dGVyLm1peGluKEFwcGxpY2F0aW9uLnByb3RvdHlwZSlcblxuZnVuY3Rpb24gZ2V0T3B0aW9ucyhvcHRpb25zKSB7XG4gIHJldHVybiBpc09iamVjdChvcHRpb25zKSA/IG9wdGlvbnMgOiB7fVxufVxuIl19
961
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcHAvQXBwbGljYXRpb24uanMiXSwibmFtZXMiOlsiQXBwbGljYXRpb24iLCJLb2EiLCJjb25zdHJ1Y3RvciIsImNvbmZpZyIsInZhbGlkYXRvciIsInJvdXRlciIsImV2ZW50cyIsIm1pZGRsZXdhcmUiLCJtb2RlbHMiLCJzZXJ2aWNlcyIsImNvbnRyb2xsZXJzIiwiX3NldHVwRW1pdHRlciIsImFwcCIsImtleXMiLCJsb2ciLCJyZXN0Iiwic2lsZW50IiwicHJvY2VzcyIsImVudiIsIkRJVE9fU0lMRU5UIiwicHJveHkiLCJWYWxpZGF0b3IiLCJSb3V0ZXIiLCJzdG9yYWdlcyIsIk9iamVjdCIsImNyZWF0ZSIsImhhc0NvbnRyb2xsZXJNaWRkbGV3YXJlIiwic2V0dXBMb2dnZXIiLCJzZXR1cEtuZXgiLCJzZXR1cEdsb2JhbE1pZGRsZXdhcmUiLCJ1c2UiLCJhZGRTdG9yYWdlcyIsImFkZE1vZGVscyIsImFkZFNlcnZpY2VzIiwiYWRkQ29udHJvbGxlcnMiLCJhZGRSb3V0ZSIsInZlcmIiLCJwYXRoIiwidHJhbnNhY3RlZCIsImhhbmRsZXJzIiwiY29udHJvbGxlciIsImFjdGlvbiIsImhhbmRsZXIiLCJsZW5ndGgiLCJyb3V0ZSIsIm1vZGVsQ2xhc3MiLCJ2YWx1ZXMiLCJhZGRNb2RlbCIsInNvcnRNb2RlbHMiLCJzb3J0ZWRNb2RlbHMiLCJmaWx0ZXIiLCJuYW1lIiwic2V0dXAiLCJrbmV4IiwiaW5pdGlhbGl6ZSIsImFkZFNjaGVtYSIsImdldEpzb25TY2hlbWEiLCJzY2hlbWEiLCJyZWxhdGlvbnMiLCJzaG91bGRMb2ciLCJvcHRpb24iLCJpbmNsdWRlcyIsImRhdGEiLCJyZWxhdGlvbk1hcHBpbmdzIiwidmFsdWUiLCJNb2RlbCIsImlzUHJvdG90eXBlT2YiLCJjb25zb2xlIiwiaW5mbyIsInBpY28iLCJ5ZWxsb3ciLCJib2xkIiwidXRpbCIsImluc3BlY3QiLCJjb2xvcnMiLCJkZXB0aCIsIm1heEFycmF5TGVuZ3RoIiwiRXJyb3IiLCJzb3J0QnlSZWxhdGlvbnMiLCJsaXN0IiwiY29sbGVjdGVkIiwiZXhjbHVkZWQiLCJyZWxhdGlvbiIsImdldFJlbGF0aW9ucyIsIkJlbG9uZ3NUb09uZVJlbGF0aW9uIiwicmVsYXRlZE1vZGVsQ2xhc3MiLCJqb2luVGFibGVNb2RlbENsYXNzIiwicmVsYXRlZCIsInJldmVyc2UiLCJyZWR1Y2UiLCJnZXRNb2RlbCIsImVuZHNXaXRoIiwiZmluZE1vZGVsIiwiY2FsbGJhY2siLCJmaW5kIiwic2VydmljZSIsImVudHJpZXMiLCJhZGRTZXJ2aWNlIiwiU2VydmljZSIsInVuZGVmaW5lZCIsImdldFNlcnZpY2UiLCJmaW5kU2VydmljZSIsImZvckVhY2hTZXJ2aWNlIiwiUHJvbWlzZSIsImFsbCIsIm1hcCIsIm5hbWVzcGFjZSIsImtleSIsImFkZENvbnRyb2xsZXIiLCJzZXR1cENvbnRyb2xsZXJNaWRkbGV3YXJlIiwiQ29udHJvbGxlciIsInVybCIsImNvbXBvc2UiLCJnZXRDb250cm9sbGVyIiwiZmluZENvbnRyb2xsZXIiLCJnZXRBZG1pbkNvbnRyb2xsZXIiLCJBZG1pbkNvbnRyb2xsZXIiLCJnZXRBZG1pblZ1ZUNvbmZpZyIsImdldFZ1ZUNvbmZpZyIsImdldEFzc2V0Q29uZmlnIiwibm9ybWFsaXplRGJOYW1lcyIsImFzc2V0Q29uZmlnIiwibW9kZWxOYW1lIiwiYXNzZXRzIiwiZGVmaW5pdGlvbiIsIm5vcm1hbGl6ZWRNb2RlbE5hbWUiLCJub3JtYWxpemVJZGVudGlmaWVyIiwiY29udmVydGVkQXNzZXRzIiwiYXNzZXREYXRhUGF0aCIsInByb3BlcnR5IiwibmVzdGVkRGF0YVBhdGgiLCJpbmRleCIsImdldFByb3BlcnR5T3JSZWxhdGlvbkF0RGF0YVBhdGgiLCJub3JtYWxpemVkTmFtZSIsImRhdGFQYXRoIiwiYXNzZXRDb25maWdzIiwiYWRkU3RvcmFnZSIsInN0b3JhZ2UiLCJzdG9yYWdlQ2xhc3MiLCJTdG9yYWdlIiwiZ2V0IiwidHlwZSIsImdldFN0b3JhZ2UiLCJjb21waWxlVmFsaWRhdG9yIiwianNvblNjaGVtYSIsIm9wdGlvbnMiLCJjb21waWxlIiwiY29tcGlsZVBhcmFtZXRlcnNWYWxpZGF0b3IiLCJwYXJhbWV0ZXJzIiwiZGF0YU5hbWUiLCJwcm9wZXJ0aWVzIiwiYWRkUGFyYW1ldGVyIiwicHVzaCIsIm1lbWJlciIsImFzT2JqZWN0IiwidmFsaWRhdGUiLCJjb2VyY2VUeXBlcyIsImN0eCIsImNhbGwiLCJjcmVhdGVWYWxpZGF0aW9uRXJyb3IiLCJtZXNzYWdlIiwiZXJyb3JzIiwianNvbiIsIlZhbGlkYXRpb25FcnJvciIsInBhcnNlRXJyb3JzIiwiY3JlYXRlRGF0YWJhc2VFcnJvciIsImVycm9yIiwic3FsIiwibWF0Y2giLCJEYXRhYmFzZUVycm9yIiwibG9nZ2VyIiwicmVzcG9uc2VUaW1lIiwiZ2V0T3B0aW9ucyIsInJlcXVlc3RzIiwiaGVsbWV0IiwiY29ycyIsImNvbXByZXNzIiwiYnIiLCJwYXJhbXMiLCJ6bGliIiwiY29uc3RhbnRzIiwiQlJPVExJX1BBUkFNX1FVQUxJVFkiLCJldGFnIiwiYm9keVBhcnNlciIsInNlc3Npb24iLCJDb250ZXh0U3RvcmUiLCJwYXNzcG9ydCIsImVyciIsInJlcSIsInJlcyIsInBpbm8iLCJzdGRTZXJpYWxpemVycyIsInVzZXIiLCJpZCIsInNlcmlhbGl6ZXJzIiwibGV2ZWwiLCJwcmV0dHlQcmludCIsImlnbm9yZSIsInRyYW5zbGF0ZVRpbWUiLCJyZWRhY3QiLCJiYXNlIiwiY2hpbGQiLCJjbGllbnQiLCJzbmFrZUNhc2VPcHRpb25zIiwidHlwZVBhcnNlcnMiLCJkcml2ZXIiLCJwYXJzZXIiLCJ0eXBlcyIsInNldFR5cGVQYXJzZXIiLCJzZXR1cEtuZXhMb2dnaW5nIiwic3RhcnRUaW1lcyIsImVuZCIsInF1ZXJ5IiwicmVzcG9uc2UiLCJfX2tuZXhRdWVyeVVpZCIsImRpZmYiLCJocnRpbWUiLCJkdXJhdGlvbiIsImJpbmRpbmdzIiwiZnJvbUVudHJpZXMiLCJzdGFydHNXaXRoIiwib24iLCJpZGVudGlmaWVyIiwid3JhcElkZW50aWZpZXIiLCJyZXBsYWNlIiwiZGVub3JtYWxpemVJZGVudGlmaWVyIiwib2JqIiwicG9zdFByb2Nlc3NSZXNwb25zZSIsIm5vcm1hbGl6ZVBhdGgiLCJub3JtYWxpemVQYXRocyIsImZvcm1hdEVycm9yIiwidG9KU09OIiwic3RyIiwic3RhY2siLCJzcGxpdCIsInNsaWNlIiwiam9pbiIsIm9zIiwiRU9MIiwibG9nRXJyb3IiLCJleHBvc2UiLCJ0ZXh0IiwiUmVzcG9uc2VFcnJvciIsInN0YXR1cyIsImUiLCJzdGFydCIsImVtaXQiLCJzZXJ2ZXIiLCJob3N0IiwicG9ydCIsInJlc29sdmUiLCJyZWplY3QiLCJsaXN0ZW4iLCJhZGRyZXNzIiwic3RvcCIsImNsb3NlIiwic2V0SW1tZWRpYXRlIiwib2ZmIiwic3RhcnRPckV4aXQiLCJleGl0IiwiY3JlYXRlQXNzZXRzIiwiZmlsZXMiLCJjb3VudCIsInRyeCIsIkFzc2V0TW9kZWwiLCJmaWxlIiwiaW5zZXJ0IiwiaGFuZGxlQWRkZGVkQW5kUmVtb3ZlZEFzc2V0cyIsImFkZGVkRmlsZXMiLCJyZW1vdmVkRmlsZXMiLCJjbGVhbnVwVGltZVRocmVzaG9sZCIsInRpbWVUaHJlc2hvbGQiLCJpbXBvcnRlZEZpbGVzIiwiYWRkRm9yZWlnbkFzc2V0cyIsImNoYW5nZUNvdW50IiwiaW5jcmVtZW50Iiwid2hlcmVJbiIsInNldFRpbWVvdXQiLCJyZWxlYXNlVW51c2VkQXNzZXRzIiwiYXNzZXQiLCJmaW5kT25lIiwicmVkIiwiZ3JlZW4iLCJheGlvcyIsInJlcXVlc3QiLCJtZXRob2QiLCJyZXNwb25zZVR5cGUiLCJpbXBvcnRlZEZpbGUiLCJhZGRGaWxlIiwiYXNzaWduIiwiQXNzZXRFcnJvciIsImhhbmRsZU1vZGlmaWVkQXNzZXRzIiwibW9kaWZpZWRGaWxlcyIsImNoYW5nZWRGaWxlIiwidHJhbnNhY3Rpb24iLCJkYXRlIiwiRGF0ZSIsInNldE1pbGxpc2Vjb25kcyIsImdldE1pbGxpc2Vjb25kcyIsIm9ycGhhbmVkQXNzZXRzIiwid2hlcmUiLCJhbmRXaGVyZSIsIm9ycGhhbmVkS2V5cyIsInJlbW92ZUZpbGUiLCJkZWxldGUiLCJFdmVudEVtaXR0ZXIiLCJtaXhpbiIsInByb3RvdHlwZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQU1BOztBQUNBOztBQUNBOztBQVNBOztBQUlBOzs7O0FBT08sTUFBTUEsV0FBTixTQUEwQkMsWUFBMUIsQ0FBOEI7QUFDbkNDLEVBQUFBLFdBQVcsQ0FBQztBQUNWQyxJQUFBQSxNQUFNLEdBQUcsRUFEQztBQUVWQyxJQUFBQSxTQUZVO0FBR1ZDLElBQUFBLE1BSFU7QUFJVkMsSUFBQUEsTUFKVTtBQUtWQyxJQUFBQSxVQUxVO0FBTVZDLElBQUFBLE1BTlU7QUFPVkMsSUFBQUEsUUFQVTtBQVFWQyxJQUFBQTtBQVJVLE1BU1IsRUFUTyxFQVNIO0FBQ047O0FBQ0EsU0FBS0MsYUFBTCxDQUFtQkwsTUFBbkI7O0FBQ0EsVUFBTTtBQUVKTSxNQUFBQSxHQUFHLEVBQUU7QUFBRUMsUUFBQUEsSUFBRjtBQUFRLFdBQUdEO0FBQVgsVUFBbUIsRUFGcEI7QUFHSkUsTUFBQUEsR0FBRyxHQUFHLEVBSEY7QUFJSixTQUFHQztBQUpDLFFBS0ZaLE1BTEo7QUFNQSxTQUFLQSxNQUFMLEdBQWM7QUFDWlMsTUFBQUEsR0FEWTtBQUVaRSxNQUFBQSxHQUFHLEVBQUVBLEdBQUcsQ0FBQ0UsTUFBSixJQUFjQyxPQUFPLENBQUNDLEdBQVIsQ0FBWUMsV0FBMUIsR0FBd0MsRUFBeEMsR0FBNkNMLEdBRnRDO0FBR1osU0FBR0M7QUFIUyxLQUFkO0FBS0EsU0FBS0YsSUFBTCxHQUFZQSxJQUFaO0FBQ0EsU0FBS08s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TmlCLEVBTUosR0FOSSxFQU1DLG9CQUFJLFdBQUosQ0FORCxDQUE3Qjs7QUFPQSxZQUFJRixjQUFjLENBQUNoUSxNQUFmLEdBQXdCLENBQTVCLEVBQStCO0FBQzdCLGdCQUFNbVEsWUFBWSxHQUFHLE1BQU12TSxPQUFPLENBQUNDLEdBQVIsQ0FDekJtTSxjQUFjLENBQUNsTSxHQUFmLENBQW1CLE1BQU04SyxLQUFOLElBQWU7QUFDaEMsZ0JBQUk7QUFDRixvQkFBTSxLQUFLekksVUFBTCxDQUFnQnlJLEtBQUssQ0FBQzlJLE9BQXRCLEVBQStCc0ssVUFBL0IsQ0FBMEN4QixLQUFLLENBQUNkLElBQWhELENBQU47QUFDRCxhQUZELENBRUUsT0FBT25HLEtBQVAsRUFBYztBQUNkLG1CQUFLZ0YsSUFBTCxDQUFVLE9BQVYsRUFBbUJoRixLQUFuQjtBQUNBaUgsY0FBQUEsS0FBSyxDQUFDakgsS0FBTixHQUFjQSxLQUFkO0FBQ0Q7O0FBQ0QsbUJBQU9pSCxLQUFLLENBQUM1SyxHQUFiO0FBQ0QsV0FSRCxDQUR5QixDQUEzQjtBQVdBLGdCQUFNNkosVUFBVSxDQUNicEQsS0FERyxDQUNHbUQsR0FESCxFQUVIeUMsTUFGRyxHQUdINUIsT0FIRyxDQUdLLEtBSEwsRUFHWTBCLFlBSFosQ0FBTjtBQUlEOztBQUNELGVBQU9ILGNBQVA7QUFDRCxPQTlCTSxDQUFQO0FBK0JEO0FBQ0Y7O0FBbjVCa0M7Ozs7QUF3NUJyQ00sa0JBQWFDLEtBQWIsQ0FBbUJsVCxXQUFXLENBQUNtVCxTQUEvQjs7QUFFQSxTQUFTdkksVUFBVCxDQUFvQjNCLE9BQXBCLEVBQTZCO0FBQzNCLFNBQU8sc0JBQVNBLE9BQVQsSUFBb0JBLE9BQXBCLEdBQThCLEVBQXJDO0FBQ0QiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgS29hIGZyb20gJ2tvYSdcbmltcG9ydCBLbmV4IGZyb20gJ2tuZXgnXG5pbXBvcnQgdXRpbCBmcm9tICd1dGlsJ1xuaW1wb3J0IGF4aW9zIGZyb20gJ2F4aW9zJ1xuaW1wb3J0IHBpY28gZnJvbSAncGljb2NvbG9ycydcbmltcG9ydCB6bGliIGZyb20gJ3psaWInXG5pbXBvcnQgcGlubyBmcm9tICdwaW5vJ1xuaW1wb3J0IG9zIGZyb20gJ29zJ1xuaW1wb3J0IHBhcnNlRHVyYXRpb24gZnJvbSAncGFyc2UtZHVyYXRpb24nXG5pbXBvcnQgYm9keVBhcnNlciBmcm9tICdrb2EtYm9keXBhcnNlcidcbmltcG9ydCBjb3JzIGZyb20gJ0Brb2EvY29ycydcbmltcG9ydCBjb21wb3NlIGZyb20gJ2tvYS1jb21wb3NlJ1xuaW1wb3J0IGNvbXByZXNzIGZyb20gJ2tvYS1jb21wcmVzcydcbmltcG9ydCBjb25kaXRpb25hbCBmcm9tICdrb2EtY29uZGl0aW9uYWwtZ2V0J1xuaW1wb3J0IHBhc3Nwb3J0IGZyb20gJ2tvYS1wYXNzcG9ydCdcbmltcG9ydCBzZXNzaW9uIGZyb20gJ2tvYS1zZXNzaW9uJ1xuaW1wb3J0IGV0YWcgZnJvbSAna29hLWV0YWcnXG5pbXBvcnQgaGVsbWV0IGZyb20gJ2tvYS1oZWxtZXQnXG5pbXBvcnQgcmVzcG9uc2VUaW1lIGZyb20gJ2tvYS1yZXNwb25zZS10aW1lJ1xuaW1wb3J0IFJvdXRlciBmcm9tICdAZGl0b2pzL3JvdXRlcidcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJ0AvbGliJ1xuaW1wb3J0IHsgQ29udHJvbGxlciwgQWRtaW5Db250cm9sbGVyIH0gZnJvbSAnQC9jb250cm9sbGVycydcbmltcG9ydCB7IFNlcnZpY2UgfSBmcm9tICdAL3NlcnZpY2VzJ1xuaW1wb3J0IHsgU3RvcmFnZSB9IGZyb20gJ0Avc3RvcmFnZSdcbmltcG9ydCB7IGNvbnZlcnRTY2hlbWEgfSBmcm9tICdAL3NjaGVtYSdcbmltcG9ydCB7IGZvcm1hdEpzb24gfSBmcm9tICdAL3V0aWxzJ1xuaW1wb3J0IHtcbiAgUmVzcG9uc2VFcnJvcixcbiAgVmFsaWRhdGlvbkVycm9yLFxuICBEYXRhYmFzZUVycm9yLFxuICBBc3NldEVycm9yXG59IGZyb20gJ0AvZXJyb3JzJ1xuaW1wb3J0IFNlc3Npb25TdG9yZSBmcm9tICcuL1Nlc3Npb25TdG9yZSdcbmltcG9ydCB7IFZhbGlkYXRvciB9IGZyb20gJy4vVmFsaWRhdG9yJ1xuaW1wb3J0IHtcbiAgYXR0YWNoTG9nZ2VyLFxuICBjcmVhdGVUcmFuc2FjdGlvbixcbiAgZmluZFJvdXRlLFxuICBoYW5kbGVFcnJvcixcbiAgaGFuZGxlUm91dGUsXG4gIGhhbmRsZVVzZXIsXG4gIGxvZ1JlcXVlc3RzXG59IGZyb20gJ0AvbWlkZGxld2FyZSdcbmltcG9ydCB7XG4gIGlzQXJyYXksIGlzT2JqZWN0LCBpc1N0cmluZywgYXNBcnJheSwgaXNQbGFpbk9iamVjdCwgaHlwaGVuYXRlLCBjbG9uZSwgbWVyZ2UsXG4gIHBhcnNlRGF0YVBhdGgsIG5vcm1hbGl6ZURhdGFQYXRoXG59IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5pbXBvcnQge1xuICBNb2RlbCxcbiAgQmVsb25nc1RvT25lUmVsYXRpb24sXG4gIGtuZXhTbmFrZUNhc2VNYXBwZXJzLFxuICByZWZcbn0gZnJvbSAnb2JqZWN0aW9uJ1xuXG5leHBvcnQgY2xhc3MgQXBwbGljYXRpb24gZXh0ZW5kcyBLb2Ege1xuICBjb25zdHJ1Y3Rvcih7XG4gICAgY29uZmlnID0ge30sXG4gICAgdmFsaWRhdG9yLFxuICAgIHJvdXRlcixcbiAgICBldmVudHMsXG4gICAgbWlkZGxld2FyZSxcbiAgICBtb2RlbHMsXG4gICAgc2VydmljZXMsXG4gICAgY29udHJvbGxlcnNcbiAgfSA9IHt9KSB7XG4gICAgc3VwZXIoKVxuICAgIHRoaXMuX3NldHVwRW1pdHRlcihldmVudHMpXG4gICAgY29uc3Qge1xuICAgICAgLy8gUGx1Y2sga2V5cyBvdXQgb2YgYGNvbmZpZy5hcHBgIHRvIGtlZXAgdGhlbSBzZWNyZXRcbiAgICAgIGFwcDogeyBrZXlzLCAuLi5hcHAgfSA9IHt9LFxuICAgICAgbG9nID0ge30sXG4gICAgICAuLi5yZXN0XG4gICAgfSA9IGNvbmZpZ1xuICAgIHRoaXMuY29uZmlnID0ge1xuICAgICAgYXBwLFxuICAgICAgbG9nOiBsb2cuc2lsZW50IHx8IHByb2Nlc3MuZW52LkRJVE9fU0lMRU5UID8ge30gOiBsb2csXG4gICAgICAuLi5yZXN0XG4gICAgfVxuICAgIHRoaXMua2V5cyA9IGtleXNcbiAgICB0aGlzLnByb3h5ID0gISFhcHAucHJveHlcbiAgICB0aGlzLnZhbGlkYXRvciA9IHZhbGlkYXRvciB8fCBuZXcgVmFsaWRhdG9yKClcbiAgICB0aGlzLnJvdXRlciA9IHJvdXRlciB8fCBuZXcgUm91dGVyKClcbiAgICB0aGlzLnZhbGlkYXRvci5hcHAgPSB0aGlzXG4gICAgdGhpcy5zdG9yYWdlcyA9IE9iamVjdC5jcmVhdGUobnVsbClcbiAgICB0aGlzLm1vZGVscyA9IE9iamVjdC5jcmVhdGUobnVsbClcbiAgICB0aGlzLnNlcnZpY2VzID0gT2JqZWN0LmNyZWF0ZShudWxsKVxuICAgIHRoaXMuY29udHJvbGxlcnMgPSBPYmplY3QuY3JlYXRlKG51bGwpXG4gICAgdGhpcy5oYXNDb250cm9sbGVyTWlkZGxld2FyZSA9IGZhbHNlXG4gICAgdGhpcy5zZXR1cExvZ2dlcigpXG4gICAgdGhpcy5zZXR1cEtuZXgoKVxuICAgIHRoaXMuc2V0dXBHbG9iYWxNaWRkbGV3YXJlKClcbiAgICBpZiAobWlkZGxld2FyZSkge1xuICAgICAgdGhpcy51c2UobWlkZGxld2FyZSlcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5zdG9yYWdlcykge1xuICAgICAgdGhpcy5hZGRTdG9yYWdlcyhjb25maWcuc3RvcmFnZXMpXG4gICAgfVxuICAgIGlmIChtb2RlbHMpIHtcbiAgICAgIHRoaXMuYWRkTW9kZWxzKG1vZGVscylcbiAgICB9XG4gICAgaWYgKHNlcnZpY2VzKSB7XG4gICAgICB0aGlzLmFkZFNlcnZpY2VzKHNlcnZpY2VzKVxuICAgIH1cbiAgICBpZiAoY29udHJvbGxlcnMpIHtcbiAgICAgIHRoaXMuYWRkQ29udHJvbGxlcnMoY29udHJvbGxlcnMpXG4gICAgfVxuICB9XG5cbiAgYWRkUm91dGUodmVyYiwgcGF0aCwgdHJhbnNhY3RlZCwgaGFuZGxlcnMsIGNvbnRyb2xsZXIgPSBudWxsLCBhY3Rpb24gPSBudWxsKSB7XG4gICAgaGFuZGxlcnMgPSBhc0FycmF5KGhhbmRsZXJzKVxuICAgIGNvbnN0IGhhbmRsZXIgPSBoYW5kbGVycy5sZW5ndGggPiAxID8gY29tcG9zZShoYW5kbGVycykgOiBoYW5kbGVyc1swXVxuICAgIC8vIEluc3RlYWQgb2YgZGlyZWN0bHkgcGFzc2luZyBgaGFuZGxlcmAsIHBhc3MgYSBgcm91dGVgIG9iamVjdCB0aGF0IGFsc29cbiAgICAvLyB3aWxsIGJlIGV4cG9zZWQgdGhyb3VnaCBgY3R4LnJvdXRlYCwgc2VlIGByb3V0ZXJIYW5kbGVyKClgOlxuICAgIGNvbnN0IHJvdXRlID0ge1xuICAgICAgdmVyYixcbiAgICAgIHBhdGgsXG4gICAgICB0cmFuc2FjdGVkLFxuICAgICAgaGFuZGxlcixcbiAgICAgIGNvbnRyb2xsZXIsXG4gICAgICBhY3Rpb25cbiAgICB9XG4gICAgdGhpcy5yb3V0ZXJbdmVyYl0ocGF0aCwgcm91dGUpXG4gIH1cblxuICBhZGRNb2RlbHMobW9kZWxzKSB7XG4gICAgLy8gRmlyc3QgYWRkIGFsbCBtb2RlbHMgdGhlbiBjYWxsIGluaXRpYWxpemUoKSBmb3IgZWFjaCBpbiBhIHNlY29uZCBsb29wLFxuICAgIC8vIHNpbmNlIHRoZXkgbWF5IGJlIHJlZmVyZW5jaW5nIGVhY2ggb3RoZXIgaW4gcmVsYXRpb25zLlxuICAgIGZvciAoY29uc3QgbW9kZWxDbGFzcyBvZiBPYmplY3QudmFsdWVzKG1vZGVscykpIHtcbiAgICAgIHRoaXMuYWRkTW9kZWwobW9kZWxDbGFzcylcbiAgICB9XG4gICAgLy8gTm93IChyZS0pc29ydCBhbGwgbW9kZWxzIGJhc2VkIG9uIHRoZWlyIHJlbGF0aW9ucy5cbiAgICB0aGlzLm1vZGVscyA9IHRoaXMuc29ydE1vZGVscyh0aGlzLm1vZGVscylcbiAgICAvLyBGaWx0ZXIgdGhyb3VnaCBhbGwgc29ydGVkIG1vZGVscywga2VlcGluZyBvbmx5IHRoZSBuZXdseSBhZGRlZCBvbmVzLlxuICAgIGNvbnN0IHNvcnRlZE1vZGVscyA9IE9iamVjdC52YWx1ZXModGhpcy5tb2RlbHMpLmZpbHRlcihcbiAgICAgIG1vZGVsQ2xhc3MgPT4gbW9kZWxzW21vZGVsQ2xhc3MubmFtZV0gPT09IG1vZGVsQ2xhc3NcbiAgICApXG4gICAgLy8gSW5pdGlhbGl6ZSB0aGUgYWRkZWQgbW9kZWxzIGluIGNvcnJlY3Qgc29ydGVkIHNlcXVlbmNlLCBzbyB0aGF0IGZvciBldmVyeVxuICAgIC8vIG1vZGVsLCBnZXRSZWxhdGVkUmVsYXRpb25zKCkgcmV0dXJucyB0aGUgZnVsbCBsaXN0IG9mIHJlbGF0aW5nIHJlbGF0aW9ucy5cbiAgICBmb3IgKGNvbnN0IG1vZGVsQ2xhc3Mgb2Ygc29ydGVkTW9kZWxzKSB7XG4gICAgICBpZiAobW9kZWxzW21vZGVsQ2xhc3MubmFtZV0gPT09IG1vZGVsQ2xhc3MpIHtcbiAgICAgICAgbW9kZWxDbGFzcy5zZXR1cCh0aGlzLmtuZXgpXG4gICAgICAgIC8vIE5vdyB0aGF0IHRoZSBtb2RlbENsYXNzIGlzIHNldCB1cCwgY2FsbCBgaW5pdGlhbGl6ZSgpYCwgd2hpY2ggY2FuIGJlXG4gICAgICAgIC8vIG92ZXJyaWRkZW4gYnkgc3ViLWNsYXNzZXMsd2l0aG91dCBoYXZpbmcgdG8gY2FsbCBgc3VwZXIuaW5pdGlhbGl6ZSgpYFxuICAgICAgICBtb2RlbENsYXNzLmluaXRpYWxpemUoKVxuICAgICAgICB0aGlzLnZhbGlkYXRvci5hZGRTY2hlbWEobW9kZWxDbGFzcy5nZXRKc29uU2NoZW1hKCkpXG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHsgbG9nIH0gPSB0aGlzLmNvbmZpZ1xuICAgIGlmIChsb2cuc2NoZW1hIHx8IGxvZy5yZWxhdGlvbnMpIHtcbiAgICAgIGZvciAoY29uc3QgbW9kZWxDbGFzcyBvZiBzb3J0ZWRNb2RlbHMpIHtcbiAgICAgICAgY29uc3Qgc2hvdWxkTG9nID0gb3B0aW9uID0+IChcbiAgICAgICAgICBvcHRpb24gPT09IHRydWUgfHxcbiAgICAgICAgICBhc0FycmF5KG9wdGlvbikuaW5jbHVkZXMobW9kZWxDbGFzcy5uYW1lKVxuICAgICAgICApXG4gICAgICAgIGNvbnN0IGRhdGEgPSB7fVxuICAgICAgICBpZiAoc2hvdWxkTG9nKGxvZy5zY2hlbWEpKSB7XG4gICAgICAgICAgZGF0YS5zY2hlbWEgPSBtb2RlbENsYXNzLmdldEpzb25TY2hlbWEoKVxuICAgICAgICB9XG4gICAgICAgIGlmIChzaG91bGRMb2cobG9nLnJlbGF0aW9ucykpIHtcbiAgICAgICAgICBkYXRhLnJlbGF0aW9ucyA9IGNsb25lKG1vZGVsQ2xhc3MucmVsYXRpb25NYXBwaW5ncywgdmFsdWUgPT5cbiAgICAgICAgICAgIE1vZGVsLmlzUHJvdG90eXBlT2YodmFsdWUpID8gYFtNb2RlbDogJHt2YWx1ZS5uYW1lfV1gIDogdmFsdWVcbiAgICAgICAgICApXG4gICAgICAgIH1cbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKGRhdGEpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zb2xlLmluZm8oXG4gICAgICAgICAgICBwaWNvLnllbGxvdy5ib2xkKGBcXG4ke21vZGVsQ2xhc3MubmFtZX06XFxuYCksXG4gICAgICAgICAgICB1dGlsLmluc3BlY3QoZGF0YSwge1xuICAgICAgICAgICAgICBjb2xvcnM6IHRydWUsXG4gICAgICAgICAgICAgIGRlcHRoOiBudWxsLFxuICAgICAgICAgICAgICBtYXhBcnJheUxlbmd0aDogbnVsbFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICApXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhZGRNb2RlbChtb2RlbENsYXNzKSB7XG4gICAgaWYgKE1vZGVsLmlzUHJvdG90eXBlT2YobW9kZWxDbGFzcykpIHtcbiAgICAgIG1vZGVsQ2xhc3MuYXBwID0gdGhpc1xuICAgICAgdGhpcy5tb2RlbHNbbW9kZWxDbGFzcy5uYW1lXSA9IG1vZGVsQ2xhc3NcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIG1vZGVsIGNsYXNzOiAke21vZGVsQ2xhc3N9YClcbiAgICB9XG4gIH1cblxuICBzb3J0TW9kZWxzKG1vZGVscykge1xuICAgIGNvbnN0IHNvcnRCeVJlbGF0aW9ucyA9IChsaXN0LCBjb2xsZWN0ZWQgPSB7fSwgZXhjbHVkZWQgPSB7fSkgPT4ge1xuICAgICAgZm9yIChjb25zdCBtb2RlbENsYXNzIG9mIGxpc3QpIHtcbiAgICAgICAgY29uc3QgeyBuYW1lIH0gPSBtb2RlbENsYXNzXG4gICAgICAgIGlmICghY29sbGVjdGVkW25hbWVdICYmICFleGNsdWRlZFtuYW1lXSkge1xuICAgICAgICAgIGZvciAoY29uc3QgcmVsYXRpb24gb2YgT2JqZWN0LnZhbHVlcyhtb2RlbENsYXNzLmdldFJlbGF0aW9ucygpKSkge1xuICAgICAgICAgICAgaWYgKCEocmVsYXRpb24gaW5zdGFuY2VvZiBCZWxvbmdzVG9PbmVSZWxhdGlvbikpIHtcbiAgICAgICAgICAgICAgY29uc3QgeyByZWxhdGVkTW9kZWxDbGFzcywgam9pblRhYmxlTW9kZWxDbGFzcyB9ID0gcmVsYXRpb25cbiAgICAgICAgICAgICAgZm9yIChjb25zdCByZWxhdGVkIG9mIFtqb2luVGFibGVNb2RlbENsYXNzLCByZWxhdGVkTW9kZWxDbGFzc10pIHtcbiAgICAgICAgICAgICAgICAvLyBFeGNsdWRlIHNlbGYtcmVmZXJlbmNlcyBhbmQgZ2VuZXJhdGVkIGpvaW4gbW9kZWxzOlxuICAgICAgICAgICAgICAgIGlmIChyZWxhdGVkICYmIHJlbGF0ZWQgIT09IG1vZGVsQ2xhc3MgJiYgbW9kZWxzW3JlbGF0ZWQubmFtZV0pIHtcbiAgICAgICAgICAgICAgICAgIHNvcnRCeVJlbGF0aW9ucyhbcmVsYXRlZF0sIGNvbGxlY3RlZCwge1xuICAgICAgICAgICAgICAgICAgICAvLyBFeGNsdWRlIG1vZGVsQ2xhc3MgdG8gcHJldmVudCBlbmRsZXNzIHJlY3Vyc2lvbnM6XG4gICAgICAgICAgICAgICAgICAgIFtuYW1lXTogbW9kZWxDbGFzcyxcbiAgICAgICAgICAgICAgICAgICAgLi4uZXhjbHVkZWRcbiAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbGxlY3RlZFtuYW1lXSA9IG1vZGVsQ2xhc3NcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIE9iamVjdC52YWx1ZXMoY29sbGVjdGVkKVxuICAgIH1cbiAgICAvLyBSZXR1cm4gYSBuZXcgb2JqZWN0IHdpdGggdGhlIHNvcnRlZCBtb2RlbHMgYXMgaXRzIGtleS92YWx1ZSBwYWlycy5cbiAgICAvLyBOT1RFOiBXZSBuZWVkIHRvIHJldmVyc2UgZm9yIHRoZSBhYm92ZSBhbGdvcml0aG0gdG8gc29ydCBwcm9wZXJseSxcbiAgICAvLyBhbmQgdGhlbiByZXZlcnNlIHRoZSByZXN1bHQgYmFjay5cbiAgICByZXR1cm4gc29ydEJ5UmVsYXRpb25zKE9iamVjdC52YWx1ZXMobW9kZWxzKS5yZXZlcnNlKCkpLnJldmVyc2UoKS5yZWR1Y2UoXG4gICAgICAobW9kZWxzLCBtb2RlbENsYXNzKSA9PiB7XG4gICAgICAgIG1vZGVsc1ttb2RlbENsYXNzLm5hbWVdID0gbW9kZWxDbGFzc1xuICAgICAgICByZXR1cm4gbW9kZWxzXG4gICAgICB9LFxuICAgICAgT2JqZWN0LmNyZWF0ZShudWxsKVxuICAgIClcbiAgfVxuXG4gIGdldE1vZGVsKG5hbWUpIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5tb2RlbHNbbmFtZV0gfHxcbiAgICAgICFuYW1lLmVuZHNXaXRoKCdNb2RlbCcpICYmIHRoaXMubW9kZWxzW2Ake25hbWV9TW9kZWxgXSB8fFxuICAgICAgbnVsbFxuICAgIClcbiAgfVxuXG4gIGZpbmRNb2RlbChjYWxsYmFjaykge1xuICAgIHJldHVybiBPYmplY3QudmFsdWVzKHRoaXMubW9kZWxzKS5maW5kKGNhbGxiYWNrKVxuICB9XG5cbiAgYWRkU2VydmljZXMoc2VydmljZXMpIHtcbiAgICBmb3IgKGNvbnN0IFtuYW1lLCBzZXJ2aWNlXSBvZiBPYmplY3QuZW50cmllcyhzZXJ2aWNlcykpIHtcbiAgICAgIC8vIEhhbmRsZSBFUzYgbW9kdWxlIHdlaXJkbmVzcyB0aGF0IGNhbiBoYXBwZW4sIGFwcGFyZW50bHk6XG4gICAgICBpZiAobmFtZSA9PT0gJ2RlZmF1bHQnICYmIGlzUGxhaW5PYmplY3Qoc2VydmljZSkpIHtcbiAgICAgICAgdGhpcy5hZGRTZXJ2aWNlcyhzZXJ2aWNlKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5hZGRTZXJ2aWNlKHNlcnZpY2UsIG5hbWUpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYWRkU2VydmljZShzZXJ2aWNlLCBuYW1lKSB7XG4gICAgLy8gQXV0by1pbnN0YW50aWF0ZSBjb250cm9sbGVyIGNsYXNzZXM6XG4gICAgaWYgKFNlcnZpY2UuaXNQcm90b3R5cGVPZihzZXJ2aWNlKSkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5ldy1jYXBcbiAgICAgIHNlcnZpY2UgPSBuZXcgc2VydmljZSh0aGlzLCBuYW1lKVxuICAgIH1cbiAgICBpZiAoIShzZXJ2aWNlIGluc3RhbmNlb2YgU2VydmljZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBzZXJ2aWNlOiAke3NlcnZpY2V9YClcbiAgICB9XG4gICAgLy8gT25seSBhZnRlciB0aGUgY29uc3RydWN0b3IgaXMgY2FsbGVkLCBgc2VydmljZS5uYW1lYCBpcyBndWFyYW50ZWVkIHRvIGJlXG4gICAgLy8gc2V0IHRvIHRoZSBjb3JyZWN0IHZhbHVlLCBlLmcuIHdpdGggYW4gYWZ0ZXItY29uc3RydWN0b3IgY2xhc3MgcHJvcGVydHkuXG4gICAgKHsgbmFtZSB9ID0gc2VydmljZSlcbiAgICBjb25zdCBjb25maWcgPSB0aGlzLmNvbmZpZy5zZXJ2aWNlc1tuYW1lXVxuICAgIGlmIChjb25maWcgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb25maWd1cmF0aW9uIG1pc3NpbmcgZm9yIHNlcnZpY2UgJyR7bmFtZX0nYClcbiAgICB9XG4gICAgLy8gQXMgYSBjb252ZW50aW9uLCB0aGUgY29uZmlndXJhdGlvbiBvZiBhIHNlcnZpY2UgY2FuIGJlIHNldCB0byBgZmFsc2VgXG4gICAgLy8gaW4gb3JkZXIgdG8gZW50aXJlbHkgZGVhY3RpdmF0ZSB0aGUgc2VydmljZS5cbiAgICBpZiAoY29uZmlnICE9PSBmYWxzZSkge1xuICAgICAgc2VydmljZS5zZXR1cChjb25maWcpXG4gICAgICB0aGlzLnNlcnZpY2VzW25hbWVdID0gc2VydmljZVxuICAgICAgLy8gTm93IHRoYXQgdGhlIHNlcnZpY2UgaXMgc2V0IHVwLCBjYWxsIGBpbml0aWFsaXplKClgIHdoaWNoIGNhbiBiZVxuICAgICAgLy8gb3ZlcnJpZGRlbiBieSBzZXJ2aWNlcy5cbiAgICAgIHNlcnZpY2UuaW5pdGlhbGl6ZSgpXG4gICAgfVxuICB9XG5cbiAgZ2V0U2VydmljZShuYW1lKSB7XG4gICAgcmV0dXJuIHRoaXMuc2VydmljZXNbbmFtZV0gfHwgbnVsbFxuICB9XG5cbiAgZmluZFNlcnZpY2UoY2FsbGJhY2spIHtcbiAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyh0aGlzLnNlcnZpY2VzKS5maW5kKGNhbGxiYWNrKVxuICB9XG5cbiAgZm9yRWFjaFNlcnZpY2UoY2FsbGJhY2spIHtcbiAgICByZXR1cm4gUHJvbWlzZS5hbGwoT2JqZWN0LnZhbHVlcyh0aGlzLnNlcnZpY2VzKS5tYXAoY2FsbGJhY2spKVxuICB9XG5cbiAgYWRkQ29udHJvbGxlcnMoY29udHJvbGxlcnMsIG5hbWVzcGFjZSkge1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGNvbnRyb2xsZXJzKSkge1xuICAgICAgaWYgKGlzUGxhaW5PYmplY3QodmFsdWUpKSB7XG4gICAgICAgIHRoaXMuYWRkQ29udHJvbGxlcnModmFsdWUsIG5hbWVzcGFjZSA/IGAke25hbWVzcGFjZX0vJHtrZXl9YCA6IGtleSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuYWRkQ29udHJvbGxlcih2YWx1ZSwgbmFtZXNwYWNlKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFkZENvbnRyb2xsZXIoY29udHJvbGxlciwgbmFtZXNwYWNlKSB7XG4gICAgLy8gQ29udHJvbGxlcnMgcmVxdWlyZSBhZGRpdGlvbmFsIG1pZGRsZXdhcmUgdG8gYmUgaW5zdGFsbGVkIG9uY2UuXG4gICAgdGhpcy5zZXR1cENvbnRyb2xsZXJNaWRkbGV3YXJlKClcbiAgICAvLyBBdXRvLWluc3RhbnRpYXRlIGNvbnRyb2xsZXIgY2xhc3NlczpcbiAgICBpZiAoQ29udHJvbGxlci5pc1Byb3RvdHlwZU9mKGNvbnRyb2xsZXIpKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbmV3LWNhcFxuICAgICAgY29udHJvbGxlciA9IG5ldyBjb250cm9sbGVyKHRoaXMsIG5hbWVzcGFjZSlcbiAgICB9XG4gICAgaWYgKCEoY29udHJvbGxlciBpbnN0YW5jZW9mIENvbnRyb2xsZXIpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgY29udHJvbGxlcjogJHtjb250cm9sbGVyfWApXG4gICAgfVxuICAgIC8vIEluaGVyaXRhbmNlIG9mIGFjdGlvbiBtZXRob2RzIGNhbm5vdCBoYXBwZW4gaW4gdGhlIGNvbnN0cnVjdG9yIGl0c2VsZixcbiAgICAvLyBzbyBjYWxsIHNlcGFyYXRlIGBzZXR1cCgpYCBtZXRob2QgYWZ0ZXIgaW4gb3JkZXIgdG8gdGFrZSBjYXJlIG9mIGl0LlxuICAgIGNvbnRyb2xsZXIuc2V0dXAoKVxuICAgIHRoaXMuY29udHJvbGxlcnNbY29udHJvbGxlci51cmxdID0gY29udHJvbGxlclxuICAgIC8vIE5vdyB0aGF0IHRoZSBjb250cm9sbGVyIGlzIHNldCB1cCwgY2FsbCBgaW5pdGlhbGl6ZSgpYCB3aGljaCBjYW4gYmVcbiAgICAvLyBvdmVycmlkZGVuIGJ5IGNvbnRyb2xsZXJzLlxuICAgIGNvbnRyb2xsZXIuaW5pdGlhbGl6ZSgpXG4gICAgLy8gRWFjaCBjb250cm9sbGVyIGNhbiBhbHNvIHByb3ZpZGUgZnVydGhlciBtaWRkbGV3YXJlLCBlLmcuXG4gICAgLy8gYEFkbWluQ29udHJvbGxlcmA6XG4gICAgY29uc3QgbWlkZGxld2FyZSA9IGNvbnRyb2xsZXIuY29tcG9zZSgpXG4gICAgaWYgKG1pZGRsZXdhcmUpIHtcbiAgICAgIHRoaXMudXNlKG1pZGRsZXdhcmUpXG4gICAgfVxuICB9XG5cbiAgZ2V0Q29udHJvbGxlcih1cmwpIHtcbiAgICByZXR1cm4gdGhpcy5jb250cm9sbGVyc1t1cmxdIHx8IG51bGxcbiAgfVxuXG4gIGZpbmRDb250cm9sbGVyKGNhbGxiYWNrKSB7XG4gICAgcmV0dXJuIE9iamVjdC52YWx1ZXModGhpcy5jb250cm9sbGVycykuZmluZChjYWxsYmFjaylcbiAgfVxuXG4gIGdldEFkbWluQ29udHJvbGxlcigpIHtcbiAgICByZXR1cm4gdGhpcy5maW5kQ29udHJvbGxlcihcbiAgICAgIGNvbnRyb2xsZXIgPT4gY29udHJvbGxlciBpbnN0YW5jZW9mIEFkbWluQ29udHJvbGxlclxuICAgIClcbiAgfVxuXG4gIGdldEFkbWluVnVlQ29uZmlnKCkge1xuICAgIHJldHVybiB0aGlzLmdldEFkbWluQ29udHJvbGxlcigpPy5nZXRWdWVDb25maWcoKSB8fCBudWxsXG4gIH1cblxuICBnZXRBc3NldENvbmZpZyh7XG4gICAgbW9kZWxzID0gT2JqZWN0LmtleXModGhpcy5tb2RlbHMpLFxuICAgIG5vcm1hbGl6ZURiTmFtZXMgPSB0aGlzLmNvbmZpZy5rbmV4Lm5vcm1hbGl6ZURiTmFtZXNcbiAgfSA9IHt9KSB7XG4gICAgY29uc3QgYXNzZXRDb25maWcgPSB7fVxuICAgIGZvciAoY29uc3QgbW9kZWxOYW1lIG9mIG1vZGVscykge1xuICAgICAgY29uc3QgbW9kZWxDbGFzcyA9IHRoaXMubW9kZWxzW21vZGVsTmFtZV1cbiAgICAgIGNvbnN0IHsgYXNzZXRzIH0gPSBtb2RlbENsYXNzLmRlZmluaXRpb25cbiAgICAgIGlmIChhc3NldHMpIHtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZE1vZGVsTmFtZSA9IG5vcm1hbGl6ZURiTmFtZXNcbiAgICAgICAgICA/IHRoaXMubm9ybWFsaXplSWRlbnRpZmllcihtb2RlbE5hbWUpXG4gICAgICAgICAgOiBtb2RlbE5hbWVcbiAgICAgICAgY29uc3QgY29udmVydGVkQXNzZXRzID0ge31cbiAgICAgICAgZm9yIChjb25zdCBbYXNzZXREYXRhUGF0aCwgY29uZmlnXSBvZiBPYmplY3QuZW50cmllcyhhc3NldHMpKSB7XG4gICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgcHJvcGVydHksXG4gICAgICAgICAgICBuZXN0ZWREYXRhUGF0aCxcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICBpbmRleFxuICAgICAgICAgIH0gPSBtb2RlbENsYXNzLmdldFByb3BlcnR5T3JSZWxhdGlvbkF0RGF0YVBhdGgoYXNzZXREYXRhUGF0aClcbiAgICAgICAgICBpZiAocHJvcGVydHkgJiYgaW5kZXggPT09IDApIHtcbiAgICAgICAgICAgIGNvbnN0IG5vcm1hbGl6ZWROYW1lID0gbm9ybWFsaXplRGJOYW1lc1xuICAgICAgICAgICAgICA/IHRoaXMubm9ybWFsaXplSWRlbnRpZmllcihuYW1lKVxuICAgICAgICAgICAgICA6IG5hbWVcbiAgICAgICAgICAgIGNvbnN0IGRhdGFQYXRoID0gbm9ybWFsaXplRGF0YVBhdGgoW1xuICAgICAgICAgICAgICBub3JtYWxpemVkTmFtZSxcbiAgICAgICAgICAgICAgLi4ucGFyc2VEYXRhUGF0aChuZXN0ZWREYXRhUGF0aClcbiAgICAgICAgICAgIF0pXG4gICAgICAgICAgICBjb25zdCBhc3NldENvbmZpZ3MgPSBjb252ZXJ0ZWRBc3NldHNbbm9ybWFsaXplZE5hbWVdIHx8PSB7fVxuICAgICAgICAgICAgYXNzZXRDb25maWdzW2RhdGFQYXRoXSA9IGNvbmZpZ1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05lc3RlZCBncmFwaCBwcm9wZXJ0aWVzIGFyZSBub3Qgc3VwcG9ydGVkIHlldCcpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGFzc2V0Q29uZmlnW25vcm1hbGl6ZWRNb2RlbE5hbWVdID0gY29udmVydGVkQXNzZXRzXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhc3NldENvbmZpZ1xuICB9XG5cbiAgYWRkU3RvcmFnZXMoc3RvcmFnZXMpIHtcbiAgICBmb3IgKGNvbnN0IFtuYW1lLCBjb25maWddIG9mIE9iamVjdC5lbnRyaWVzKHN0b3JhZ2VzKSkge1xuICAgICAgdGhpcy5hZGRTdG9yYWdlKGNvbmZpZywgbmFtZSlcbiAgICB9XG4gIH1cblxuICBhZGRTdG9yYWdlKGNvbmZpZywgbmFtZSkge1xuICAgIGxldCBzdG9yYWdlID0gbnVsbFxuICAgIGlmIChpc1BsYWluT2JqZWN0KGNvbmZpZykpIHtcbiAgICAgIGNvbnN0IHN0b3JhZ2VDbGFzcyA9IFN0b3JhZ2UuZ2V0KGNvbmZpZy50eXBlKVxuICAgICAgaWYgKCFzdG9yYWdlQ2xhc3MpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBzdG9yYWdlOiAke2NvbmZpZ31gKVxuICAgICAgfVxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5ldy1jYXBcbiAgICAgIHN0b3JhZ2UgPSBuZXcgc3RvcmFnZUNsYXNzKHRoaXMsIGNvbmZpZylcbiAgICB9IGVsc2UgaWYgKGNvbmZpZyBpbnN0YW5jZW9mIFN0b3JhZ2UpIHtcbiAgICAgIHN0b3JhZ2UgPSBjb25maWdcbiAgICB9XG4gICAgaWYgKHN0b3JhZ2UpIHtcbiAgICAgIGlmIChuYW1lKSB7XG4gICAgICAgIHN0b3JhZ2UubmFtZSA9IG5hbWVcbiAgICAgIH1cbiAgICAgIHRoaXMuc3RvcmFnZXNbc3RvcmFnZS5uYW1lXSA9IHN0b3JhZ2VcbiAgICB9XG4gICAgcmV0dXJuIHN0b3JhZ2VcbiAgfVxuXG4gIGdldFN0b3JhZ2UobmFtZSkge1xuICAgIHJldHVybiB0aGlzLnN0b3JhZ2VzW25hbWVdIHx8IG51bGxcbiAgfVxuXG4gIGNvbXBpbGVWYWxpZGF0b3IoanNvblNjaGVtYSwgb3B0aW9ucykge1xuICAgIHJldHVybiBqc29uU2NoZW1hXG4gICAgICA/IHRoaXMudmFsaWRhdG9yLmNvbXBpbGUoanNvblNjaGVtYSwgb3B0aW9ucylcbiAgICAgIDogbnVsbFxuICB9XG5cbiAgY29tcGlsZVBhcmFtZXRlcnNWYWxpZGF0b3IocGFyYW1ldGVycywgb3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3QgbGlzdCA9IFtdXG4gICAgY29uc3QgeyBkYXRhTmFtZSA9ICdkYXRhJyB9ID0gb3B0aW9uc1xuXG4gICAgbGV0IHByb3BlcnRpZXMgPSBudWxsXG4gICAgY29uc3QgYWRkUGFyYW1ldGVyID0gKG5hbWUsIHNjaGVtYSkgPT4ge1xuICAgICAgbGlzdC5wdXNoKHtcbiAgICAgICAgbmFtZTogbmFtZSA/PyBudWxsLFxuICAgICAgICAuLi5zY2hlbWFcbiAgICAgIH0pXG4gICAgICBpZiAoIXNjaGVtYS5tZW1iZXIpIHtcbiAgICAgICAgcHJvcGVydGllcyB8fD0ge31cbiAgICAgICAgcHJvcGVydGllc1tuYW1lIHx8IGRhdGFOYW1lXSA9IHNjaGVtYVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFN1cHBvcnQgdHdvIGZvcm1hdHMgb2YgcGFyYW1ldGVycyBkZWZpbml0aW9uczpcbiAgICAvLyAtIEFuIGFycmF5IG9mIHBhcmFtZXRlciBzY2hlbWFzLCBuYW1lZCBieSB0aGVpciBgbmFtZWAga2V5LlxuICAgIC8vIC0gQW4gb2JqZWN0IG9mIHBhcmFtZXRlciBzY2hlbWFzLCBuYW1lZCBieSB0aGUga2V5IHVuZGVyIHdoaWNoIGVhY2hcbiAgICAvLyAgIHNjaGVtYSBpcyBzdG9yZWQgaW4gdGhlIHJvb3Qgb2JqZWN0LlxuICAgIC8vIElmIGFuIGFycmF5IGlzIHBhc3NlZCwgdGhlbiB0aGUgY29udHJvbGxlciBhY3Rpb25zIHJlY2VpdmVzIHRoZVxuICAgIC8vIHBhcmFtZXRlcnMgYXMgc2VwYXJhdGUgYXJndW1lbnRzLiBJZiBhbiBvYmplY3QgaXMgcGFzc2VkLCB0aGVuIHRoZVxuICAgIC8vIGFjdGlvbnMgcmVjZWl2ZXMgb25lIHBhcmFtZXRlciBvYmplY3Qgd2hlcmUgdW5kZXIgdGhlIHNhbWUga2V5cyB0aGVcbiAgICAvLyBzcGVjaWZpZWQgcGFyYW1ldGVyIHZhbHVlcyBhcmUgc3RvcmVkLlxuICAgIGxldCBhc09iamVjdCA9IGZhbHNlXG4gICAgaWYgKGlzQXJyYXkocGFyYW1ldGVycykpIHtcbiAgICAgIGZvciAoY29uc3QgeyBuYW1lLCAuLi5zY2hlbWEgfSBvZiBwYXJhbWV0ZXJzKSB7XG4gICAgICAgIGFkZFBhcmFtZXRlcihuYW1lLCBzY2hlbWEpXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpc09iamVjdChwYXJhbWV0ZXJzKSkge1xuICAgICAgYXNPYmplY3QgPSB0cnVlXG4gICAgICBmb3IgKGNvbnN0IFtuYW1lLCBzY2hlbWFdIG9mIE9iamVjdC5lbnRyaWVzKHBhcmFtZXRlcnMpKSB7XG4gICAgICAgIGlmIChzY2hlbWEpIHtcbiAgICAgICAgICBhZGRQYXJhbWV0ZXIobmFtZSwgc2NoZW1hKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwYXJhbWV0ZXJzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcGFyYW1ldGVycyBkZWZpbml0aW9uOiAke3BhcmFtZXRlcnN9YClcbiAgICB9XG4gICAgLy8gTk9URTogSWYgcHJvcGVydGllcyBpcyBudWxsLCBzY2hlbWEgYW5kIHZhbGlkYXRlIHdpbGwgYmVjb21lIG51bGwgdG9vLlxuICAgIC8vIE5PVEU6IElmIGl0IGlzIG5vdCBudWxsLCBpdCB3aWxsIGdldCBleHBhbmRlZCB0byBhbiBvYmplY3Qgc2NoZW1hLlxuICAgIGNvbnN0IHNjaGVtYSA9IGNvbnZlcnRTY2hlbWEocHJvcGVydGllcywgb3B0aW9ucylcbiAgICBjb25zdCB2YWxpZGF0ZSA9IHRoaXMuY29tcGlsZVZhbGlkYXRvcihzY2hlbWEsIHtcbiAgICAgIC8vIEZvciBwYXJhbWV0ZXJzLCBhbHdheXMgY29lcmNlIHR5cGVzLCBpbmNsdWRpbmcgYXJyYXlzLlxuICAgICAgY29lcmNlVHlwZXM6ICdhcnJheScsXG4gICAgICAuLi5vcHRpb25zXG4gICAgfSlcbiAgICBjb25zdCBjdHggPSB7XG4gICAgICBhcHA6IHRoaXMsXG4gICAgICB2YWxpZGF0b3I6IHRoaXMudmFsaWRhdG9yLFxuICAgICAgb3B0aW9uc1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgbGlzdCxcbiAgICAgIHNjaGVtYSxcbiAgICAgIGFzT2JqZWN0LFxuICAgICAgZGF0YU5hbWUsXG4gICAgICB2YWxpZGF0ZTogdmFsaWRhdGVcbiAgICAgICAgLy8gVXNlIGBjYWxsKClgIHRvIHBhc3MgY3R4IGFzIGNvbnRleHQgdG8gQWp2LCBzZWUgcGFzc0NvbnRleHQ6XG4gICAgICAgID8gZGF0YSA9PiB2YWxpZGF0ZS5jYWxsKGN0eCwgZGF0YSlcbiAgICAgICAgOiBudWxsXG4gICAgfVxuICB9XG5cbiAgY3JlYXRlVmFsaWRhdGlvbkVycm9yKHsgdHlwZSwgbWVzc2FnZSwgZXJyb3JzLCBvcHRpb25zLCBqc29uIH0pIHtcbiAgICByZXR1cm4gbmV3IFZhbGlkYXRpb25FcnJvcih7XG4gICAgICB0eXBlLFxuICAgICAgbWVzc2FnZSxcbiAgICAgIGVycm9yczogdGhpcy52YWxpZGF0b3IucGFyc2VFcnJvcnMoZXJyb3JzLCBvcHRpb25zKSxcbiAgICAgIC8vIE9ubHkgaW5jbHVkZSB0aGUgSlNPTiBkYXRhIGluIHRoZSBlcnJvciBpZiBgbG9nLmVycm9ycy5qc29uYGlzIHNldC5cbiAgICAgIGpzb246IHRoaXMuY29uZmlnLmxvZy5lcnJvcnM/Lmpzb24gPyBqc29uIDogdW5kZWZpbmVkXG4gICAgfSlcbiAgfVxuXG4gIGNyZWF0ZURhdGFiYXNlRXJyb3IoZXJyb3IpIHtcbiAgICAvLyBSZW1vdmUga25leCBTUUwgcXVlcnkgYW5kIG1vdmUgdG8gc2VwYXJhdGUgYHNxbGAgcHJvcGVydHkuXG4gICAgLy8gVE9ETzogRml4IHRoaXMgcHJvcGVybHkgaW4gS25leCAvIE9iamVjdGlvbiBpbnN0ZWFkLCBzZWU6XG4gICAgLy8gaHR0cHM6Ly9naXR0ZXIuaW0vVmluY2l0L29iamVjdGlvbi5qcz9hdD01YTY4NzI4ZjVhOWViZTRmNzVjYTQwYjBcbiAgICBjb25zdCBbLCBzcWwsIG1lc3NhZ2VdID0gZXJyb3IubWVzc2FnZS5tYXRjaCgvXihbXFxzXFxTXSopIC0gKFtcXHNcXFNdKj8pJC8pIHx8XG4gICAgICBbbnVsbCwgbnVsbCwgZXJyb3IubWVzc2FnZV1cbiAgICByZXR1cm4gbmV3IERhdGFiYXNlRXJyb3IoZXJyb3IsIHtcbiAgICAgIG1lc3NhZ2UsXG4gICAgICAvLyBPbmx5IGluY2x1ZGUgdGhlIFNRTCBxdWVyeSBpbiB0aGUgZXJyb3IgaWYgYGxvZy5lcnJvcnMuc3FsYGlzIHNldC5cbiAgICAgIHNxbDogdGhpcy5jb25maWcubG9nLmVycm9ycz8uc3FsID8gc3FsIDogdW5kZWZpbmVkXG4gICAgfSlcbiAgfVxuXG4gIHNldHVwR2xvYmFsTWlkZGxld2FyZSgpIHtcbiAgICBjb25zdCB7IGFwcCwgbG9nIH0gPSB0aGlzLmNvbmZpZ1xuXG4gICAgdGhpcy51c2UoYXR0YWNoTG9nZ2VyKHRoaXMubG9nZ2VyKSlcblxuICAgIGlmIChhcHAucmVzcG9uc2VUaW1lICE9PSBmYWxzZSkge1xuICAgICAgdGhpcy51c2UocmVzcG9uc2VUaW1lKGdldE9wdGlvbnMoYXBwLnJlc3BvbnNlVGltZSkpKVxuICAgIH1cbiAgICBpZiAobG9nLnJlcXVlc3RzKSB7XG4gICAgICB0aGlzLnVzZShsb2dSZXF1ZXN0cygpKVxuICAgIH1cbiAgICAvLyBOZWVkcyB0byBiZSBwb3NpdGlvbmVkIGFmdGVyIHRoZSByZXF1ZXN0IGxvZ2dlciB0byBsb2cgdGhlIGNvcnJlY3RcbiAgICAvLyByZXNwb25zZSBzdGF0dXMuXG4gICAgdGhpcy51c2UoaGFuZGxlRXJyb3IoKSlcbiAgICBpZiAoYXBwLmhlbG1ldCAhPT0gZmFsc2UpIHtcbiAgICAgIHRoaXMudXNlKGhlbG1ldChnZXRPcHRpb25zKGFwcC5oZWxtZXQpKSlcbiAgICB9XG4gICAgaWYgKGFwcC5jb3JzICE9PSBmYWxzZSkge1xuICAgICAgdGhpcy51c2UoY29ycyhnZXRPcHRpb25zKGFwcC5jb3JzKSkpXG4gICAgfVxuICAgIGlmIChhcHAuY29tcHJlc3MgIT09IGZhbHNlKSB7XG4gICAgICB0aGlzLnVzZShjb21wcmVzcyhtZXJnZShcbiAgICAgICAge1xuICAgICAgICAgIC8vIFVzZSBhIHJlYXNvbmFibGUgZGVmYXVsdCBmb3IgQnJvdGxpIGNvbXByZXNzaW9uLlxuICAgICAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20va29hanMvY29tcHJlc3MvaXNzdWVzLzEyNlxuICAgICAgICAgIGJyOiB7XG4gICAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgICAgW3psaWIuY29uc3RhbnRzLkJST1RMSV9QQVJBTV9RVUFMSVRZXTogNFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZ2V0T3B0aW9ucyhhcHAuY29tcHJlc3MpXG4gICAgICApKSlcbiAgICB9XG4gICAgaWYgKGFwcC5ldGFnICE9PSBmYWxzZSkge1xuICAgICAgdGhpcy51c2UoY29uZGl0aW9uYWwoKSlcbiAgICAgIHRoaXMudXNlKGV0YWcoKSlcbiAgICB9XG4gIH1cblxuICBzZXR1cENvbnRyb2xsZXJNaWRkbGV3YXJlKCkge1xuICAgIC8vIE5PVEU6IFRoaXMgaXMgbm90IHBhcnQgb2YgdGhlIGF1dG9tYXRpYyBgc2V0dXBHbG9iYWxNaWRkbGV3YXJlKClgIHNvIHRoYXRcbiAgICAvLyBhcHBzIGNhbiBzZXQgdXAgdGhlIHN0YXRpYyBzZXJ2aW5nIG9mIGFzc2V0cyBiZWZvcmUgaW5zdGFsbGluZyB0aGVcbiAgICAvLyBzZXNzaW9uIGFuZCBwYXNzcG9ydCBtaWRkbGV3YXJlLiBJdCBpcyBjYWxsZWQgZnJvbSBgYWRkQ29udHJvbGxlcigpYC5cbiAgICAvLyBVc2UgYSBmbGFnIHRvIG9ubHkgaW5zdGFsbCB0aGUgbWlkZGxld2FyZSBvbmNlOlxuICAgIGlmICghdGhpcy5oYXNDb250cm9sbGVyTWlkZGxld2FyZSkge1xuICAgICAgY29uc3QgeyBhcHAgfSA9IHRoaXMuY29uZmlnXG4gICAgICAvLyBTZXF1ZW5jZSBpcyBpbXBvcnRhbnQ6XG4gICAgICAvLyAxLiBib2R5IHBhcnNlclxuICAgICAgdGhpcy51c2UoYm9keVBhcnNlcihnZXRPcHRpb25zKGFwcC5ib2R5UGFyc2VyKSkpXG4gICAgICAvLyAyLiBmaW5kIHJvdXRlIGZyb20gcm91dGVzIGluc3RhbGxlZCBieSBjb250cm9sbGVycy5cbiAgICAgIHRoaXMudXNlKGZpbmRSb3V0ZSh0aGlzLnJvdXRlcikpXG4gICAgICAvLyAzLiByZXNwZWN0IHRyYW5zYWN0ZWQgc2V0dGluZ3MsIGNyZWF0ZSBhbmQgaGFuZGxlIHRyYW5zYWN0aW9ucy5cbiAgICAgIHRoaXMudXNlKGNyZWF0ZVRyYW5zYWN0aW9uKCkpXG4gICAgICAvLyA0LiBzZXNzaW9uXG4gICAgICBpZiAoYXBwLnNlc3Npb24pIHtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIG1vZGVsQ2xhc3MsXG4gICAgICAgICAgLi4ub3B0aW9uc1xuICAgICAgICB9ID0gZ2V0T3B0aW9ucyhhcHAuc2Vzc2lvbilcbiAgICAgICAgaWYgKG1vZGVsQ2xhc3MpIHtcbiAgICAgICAgICAvLyBDcmVhdGUgYSBDb250ZXh0U3RvcmUgdGhhdCByZXNvbHZlZCB0aGUgc3BlY2lmaWVkIG1vZGVsIGNsYXNzLFxuICAgICAgICAgIC8vIHVzZXMgaXQgdG8gcGVyc2lzdCBhbmQgcmV0cmlldmUgdGhlIHNlc3Npb24sIGFuZCBhdXRvbWF0aWNhbGx5XG4gICAgICAgICAgLy8gYmluZHMgYWxsIGRiIG9wZXJhdGlvbnMgdG8gYGN0eC50cmFuc2FjdGlvbmAsIGlmIGl0IGlzIHNldC5cbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbmV3LWNhcFxuICAgICAgICAgIG9wdGlvbnMuQ29udGV4dFN0b3JlID0gU2Vzc2lvblN0b3JlKG1vZGVsQ2xhc3MpXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51c2Uoc2Vzc2lvbihvcHRpb25zLCB0aGlzKSlcbiAgICAgIH1cbiAgICAgIC8vIDUuIHBhc3Nwb3J0XG4gICAgICBpZiAoYXBwLnBhc3Nwb3J0KSB7XG4gICAgICAgIHRoaXMudXNlKHBhc3Nwb3J0LmluaXRpYWxpemUoKSlcbiAgICAgICAgaWYgKGFwcC5zZXNzaW9uKSB7XG4gICAgICAgICAgdGhpcy51c2UocGFzc3BvcnQuc2Vzc2lvbigpKVxuICAgICAgICB9XG4gICAgICAgIHRoaXMudXNlKGhhbmRsZVVzZXIoKSlcbiAgICAgIH1cblxuICAgICAgLy8gNi4gZmluYWxseSBoYW5kbGUgdGhlIGZvdW5kIHJvdXRlLCBvciBzZXQgc3RhdHVzIC8gYWxsb3cgYWNjb3JkaW5nbHkuXG4gICAgICB0aGlzLnVzZShoYW5kbGVSb3V0ZSgpKVxuICAgICAgdGhpcy5oYXNDb250cm9sbGVyTWlkZGxld2FyZSA9IHRydWVcbiAgICB9XG4gIH1cblxuICBzZXR1cExvZ2dlcigpIHtcbiAgICBjb25zdCB7IGVyciwgcmVxLCByZXMgfSA9IHBpbm8uc3RkU2VyaWFsaXplcnNcbiAgICAvLyBPbmx5IGluY2x1ZGUgYGlkYCBmcm9tIHRoZSB1c2VyLCB0byBub3QgaW5hZHZlcnRlbnRseSBsb2cgUElJLlxuICAgIGNvbnN0IHVzZXIgPSB1c2VyID0+ICh7IGlkOiB1c2VyLmlkIH0pXG4gICAgY29uc3Qgc2VyaWFsaXplcnMgPSB7IGVyciwgcmVxLCByZXMsIHVzZXIgfVxuXG4gICAgY29uc3QgbG9nZ2VyID0gcGlubyhtZXJnZShcbiAgICAgIHtcbiAgICAgICAgbGV2ZWw6ICdpbmZvJyxcbiAgICAgICAgc2VyaWFsaXplcnMsXG4gICAgICAgIHByZXR0eVByaW50OiB7XG4gICAgICAgICAgLy8gTGlzdCBvZiBrZXlzIHRvIGlnbm9yZSBpbiBwcmV0dHkgbW9kZS5cbiAgICAgICAgICBpZ25vcmU6ICdyZXEscmVzLGR1cmF0aW9uTXMsdXNlcixyZXF1ZXN0SWQnLFxuICAgICAgICAgIC8vIFNZUyB0byB1c2Ugc3lzdGVtIHRpbWUgYW5kIG5vdCBVVEMuXG4gICAgICAgICAgdHJhbnNsYXRlVGltZTogJ1NZUzpISDpNTTpzcy5sJ1xuICAgICAgICB9LFxuICAgICAgICAvLyBSZWRhY3QgY29tbW9uIHNlbnNpdGl2ZSBoZWFkZXJzLlxuICAgICAgICByZWRhY3Q6IFtcbiAgICAgICAgICAnKi5oZWFkZXJzW1wiY29va2llXCJdJyxcbiAgICAgICAgICAnKi5oZWFkZXJzW1wic2V0LWNvb2tpZVwiXScsXG4gICAgICAgICAgJyouaGVhZGVyc1tcImF1dGhvcml6YXRpb25cIl0nXG4gICAgICAgIF0sXG4gICAgICAgIGJhc2U6IG51bGwgLy8gbm8gcGlkLGhvc3RuYW1lLG5hbWVcbiAgICAgIH0sXG4gICAgICBnZXRPcHRpb25zKHRoaXMuY29uZmlnLmxvZ2dlcilcbiAgICApKVxuXG4gICAgdGhpcy5sb2dnZXIgPSBsb2dnZXIuY2hpbGQoeyBuYW1lOiAnYXBwJyB9KVxuICB9XG5cbiAgc2V0dXBLbmV4KCkge1xuICAgIGxldCB7IGtuZXgsIGxvZyB9ID0gdGhpcy5jb25maWdcbiAgICBpZiAoa25leD8uY2xpZW50KSB7XG4gICAgICBjb25zdCBzbmFrZUNhc2VPcHRpb25zID0ga25leC5ub3JtYWxpemVEYk5hbWVzID09PSB0cnVlXG4gICAgICAgID8ge31cbiAgICAgICAgOiBrbmV4Lm5vcm1hbGl6ZURiTmFtZXNcbiAgICAgIGlmIChzbmFrZUNhc2VPcHRpb25zKSB7XG4gICAgICAgIGtuZXggPSB7XG4gICAgICAgICAgLi4ua25leCxcbiAgICAgICAgICAuLi5rbmV4U25ha2VDYXNlTWFwcGVycyhzbmFrZUNhc2VPcHRpb25zKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLmtuZXggPSBLbmV4KGtuZXgpXG4gICAgICAvLyBTdXBwb3J0IFBvc3RncmVTUUwgdHlwZSBwYXJzZXIgbWFwcGluZ3MgaW4gdGhlIGNvbmZpZy5cbiAgICAgIGlmIChcbiAgICAgICAga25leC5jbGllbnQgPT09ICdwb3N0Z3Jlc3FsJyAmJlxuICAgICAgICBrbmV4LnR5cGVQYXJzZXJzICYmXG4gICAgICAgIHRoaXMua25leC5jbGllbnQuZHJpdmVyXG4gICAgICApIHtcbiAgICAgICAgZm9yIChjb25zdCBbdHlwZSwgcGFyc2VyXSBvZiBPYmplY3QuZW50cmllcyhrbmV4LnR5cGVQYXJzZXJzKSkge1xuICAgICAgICAgIHRoaXMua25leC5jbGllbnQuZHJpdmVyLnR5cGVzLnNldFR5cGVQYXJzZXIodHlwZSwgcGFyc2VyKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAobG9nLnNxbCkge1xuICAgICAgICB0aGlzLnNldHVwS25leExvZ2dpbmcoKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHNldHVwS25leExvZ2dpbmcoKSB7XG4gICAgY29uc3Qgc3RhcnRUaW1lcyA9IHt9XG4gICAgY29uc3QgbG9nZ2VyID0gdGhpcy5sb2dnZXIuY2hpbGQoeyBuYW1lOiAnc3FsJyB9KVxuICAgIGZ1bmN0aW9uIGVuZChxdWVyeSwgeyByZXNwb25zZSwgZXJyb3IgfSkge1xuICAgICAgY29uc3QgaWQgPSBxdWVyeS5fX2tuZXhRdWVyeVVpZFxuICAgICAgY29uc3QgZGlmZiA9IHByb2Nlc3MuaHJ0aW1lKHN0YXJ0VGltZXNbaWRdKVxuICAgICAgY29uc3QgZHVyYXRpb24gPSBkaWZmWzBdICogMWUzICsgZGlmZlsxXSAvIDFlNlxuICAgICAgZGVsZXRlIHN0YXJ0VGltZXNbaWRdXG4gICAgICBjb25zdCB7IHNxbCwgYmluZGluZ3MgfSA9IHF1ZXJ5XG4gICAgICByZXNwb25zZSA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgT2JqZWN0LmVudHJpZXMocmVzcG9uc2UpLmZpbHRlcihcbiAgICAgICAgICAoW2tleV0pID0+ICFrZXkuc3RhcnRzV2l0aCgnXycpXG4gICAgICAgIClcbiAgICAgIClcbiAgICAgIGxvZ2dlci5pbmZvKHsgZHVyYXRpb24sIGJpbmRpbmdzLCByZXNwb25zZSwgZXJyb3IgfSwgc3FsKVxuICAgIH1cblxuICAgIHRoaXMua25leFxuICAgICAgLm9uKCdxdWVyeScsIHF1ZXJ5ID0+IHtcbiAgICAgICAgc3RhcnRUaW1lc1txdWVyeS5fX2tuZXhRdWVyeVVpZF0gPSBwcm9jZXNzLmhydGltZSgpXG4gICAgICB9KVxuICAgICAgLm9uKCdxdWVyeS1yZXNwb25zZScsIChyZXNwb25zZSwgcXVlcnkpID0+IHtcbiAgICAgICAgZW5kKHF1ZXJ5LCB7IHJlc3BvbnNlIH0pXG4gICAgICB9KVxuICAgICAgLm9uKCdxdWVyeS1lcnJvcicsIChlcnJvciwgcXVlcnkpID0+IHtcbiAgICAgICAgZW5kKHF1ZXJ5LCB7IGVycm9yIH0pXG4gICAgICB9KVxuICB9XG5cbiAgbm9ybWFsaXplSWRlbnRpZmllcihpZGVudGlmaWVyKSB7XG4gICAgcmV0dXJuIHRoaXMua25leC5jbGllbnQud3JhcElkZW50aWZpZXIoaWRlbnRpZmllcikucmVwbGFjZSgvWydgXCJdL2csICcnKVxuICB9XG5cbiAgZGVub3JtYWxpemVJZGVudGlmaWVyKGlkZW50aWZpZXIpIHtcbiAgICBjb25zdCBvYmogPSB0aGlzLmtuZXguY2xpZW50LnBvc3RQcm9jZXNzUmVzcG9uc2UoeyBbaWRlbnRpZmllcl06IDEgfSlcbiAgICByZXR1cm4gT2JqZWN0LmtleXMob2JqKVswXVxuICB9XG5cbiAgbm9ybWFsaXplUGF0aChwYXRoKSB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLmFwcC5ub3JtYWxpemVQYXRocyA/IGh5cGhlbmF0ZShwYXRoKSA6IHBhdGhcbiAgfVxuXG4gIGZvcm1hdEVycm9yKGVycikge1xuICAgIGNvbnN0IG1lc3NhZ2UgPSBlcnIudG9KU09OXG4gICAgICA/IGZvcm1hdEpzb24oZXJyLnRvSlNPTigpKVxuICAgICAgOiBlcnIubWVzc2FnZSB8fCBlcnJcbiAgICBjb25zdCBzdHIgPSBgJHtlcnIubmFtZX06ICR7bWVzc2FnZX1gXG4gICAgcmV0dXJuIGVyci5zdGFjayAmJiB0aGlzLmNvbmZpZy5sb2cuZXJyb3JzPy5zdGFjayAhPT0gZmFsc2VcbiAgICAgID8gYCR7c3RyfVxcbiR7ZXJyLnN0YWNrLnNwbGl0KC9cXG58XFxyXFxufFxcci8pLnNsaWNlKDEpLmpvaW4ob3MuRU9MKX1gXG4gICAgICA6IHN0clxuICB9XG5cbiAgbG9nRXJyb3IoZXJyLCBjdHgpIHtcbiAgICBpZiAoIWVyci5leHBvc2UgJiYgIXRoaXMuc2lsZW50KSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB0ZXh0ID0gdGhpcy5mb3JtYXRFcnJvcihlcnIpXG4gICAgICAgIGNvbnN0IGxldmVsID1cbiAgICAgICAgICBlcnIgaW5zdGFuY2VvZiBSZXNwb25zZUVycm9yICYmIGVyci5zdGF0dXMgPCA1MDAgPyAnaW5mbycgOiAnZXJyb3InXG4gICAgICAgIGNvbnN0IGxvZ2dlciA9IGN0eD8ubG9nZ2VyIHx8IHRoaXMubG9nZ2VyXG4gICAgICAgIGxvZ2dlcltsZXZlbF0odGV4dClcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignQ291bGQgbm90IGxvZyBlcnJvcicsIGUpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgc3RhcnQoKSB7XG4gICAgaWYgKHRoaXMuY29uZmlnLmxvZy5lcnJvcnMgIT09IGZhbHNlKSB7XG4gICAgICB0aGlzLm9uKCdlcnJvcicsIHRoaXMubG9nRXJyb3IpXG4gICAgfVxuICAgIGF3YWl0IHRoaXMuZW1pdCgnYmVmb3JlOnN0YXJ0JylcbiAgICBhd2FpdCB0aGlzLmZvckVhY2hTZXJ2aWNlKHNlcnZpY2UgPT4gc2VydmljZS5zdGFydCgpKVxuICAgIGNvbnN0IHtcbiAgICAgIHNlcnZlcjogeyBob3N0LCBwb3J0IH0sXG4gICAgICBlbnZcbiAgICB9ID0gdGhpcy5jb25maWdcbiAgICB0aGlzLnNlcnZlciA9IGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IHNlcnZlciA9IHRoaXMubGlzdGVuKHBvcnQsIGhvc3QsICgpID0+IHtcbiAgICAgICAgY29uc3QgeyBwb3J0IH0gPSBzZXJ2ZXIuYWRkcmVzcygpXG4gICAgICAgIGNvbnNvbGUuaW5mbyhcbiAgICAgICAgICBgJHtlbnZ9IHNlcnZlciBzdGFydGVkIGF0IGh0dHA6Ly8ke2hvc3R9OiR7cG9ydH1gXG4gICAgICAgIClcbiAgICAgICAgcmVzb2x2ZShzZXJ2ZXIpXG4gICAgICB9KVxuICAgICAgaWYgKCFzZXJ2ZXIpIHtcbiAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgVW5hYmxlIHRvIHN0YXJ0IHNlcnZlciBhdCBodHRwOi8vJHtob3N0fToke3BvcnR9YCkpXG4gICAgICB9XG4gICAgfSlcbiAgICBhd2FpdCB0aGlzLmVtaXQoJ2FmdGVyOnN0YXJ0JylcbiAgfVxuXG4gIGFzeW5jIHN0b3AoKSB7XG4gICAgYXdhaXQgdGhpcy5lbWl0KCdiZWZvcmU6c3RvcCcpXG4gICAgdGhpcy5zZXJ2ZXIgPSBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCB7IHNlcnZlciB9ID0gdGhpc1xuICAgICAgaWYgKHNlcnZlcikge1xuICAgICAgICBzZXJ2ZXIuY2xvc2UoZXJyID0+IHtcbiAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICByZWplY3QoZXJyKVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXNvbHZlKG51bGwpXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICAvLyBIYWNrIHRvIG1ha2Ugc3VyZSB0aGF0IHdlIGNsb3NlIHRoZSBzZXJ2ZXIsXG4gICAgICAgIC8vICBldmVuIGlmIHNvY2tldHMgYXJlIHN0aWxsIG9wZW4uXG4gICAgICAgIC8vICBUYWtlbiBmcm9tIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8zNjgzMDA3Mi5cbiAgICAgICAgLy8gIEEgcHJvcGVyIHNvbHV0aW9uIHdvdWxkIGJlIHRvIHVzZSBhIGxpYnJhcnksIGV4OiBodHRwczovL2dpdGh1Yi5jb20vZ29kYWRkeS90ZXJtaW51c1xuICAgICAgICBzZXRJbW1lZGlhdGUoKCkgPT4gc2VydmVyLmVtaXQoJ2Nsb3NlJykpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZWplY3QobmV3IEVycm9yKCdTZXJ2ZXIgaXMgbm90IHJ1bm5pbmcnKSlcbiAgICAgIH1cbiAgICB9KVxuICAgIGF3YWl0IHRoaXMuZm9yRWFjaFNlcnZpY2Uoc2VydmljZSA9PiBzZXJ2aWNlLnN0b3AoKSlcbiAgICBhd2FpdCB0aGlzLmVtaXQoJ2FmdGVyOnN0b3AnKVxuICAgIGlmICh0aGlzLmNvbmZpZy5sb2cuZXJyb3JzICE9PSBmYWxzZSkge1xuICAgICAgdGhpcy5vZmYoJ2Vycm9yJywgdGhpcy5sb2dFcnJvcilcbiAgICB9XG4gIH1cblxuICBhc3luYyBzdGFydE9yRXhpdCgpIHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5zdGFydCgpXG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aGlzLmxvZ0Vycm9yKGVycilcbiAgICAgIHByb2Nlc3MuZXhpdCgtMSlcbiAgICB9XG4gIH1cblxuICAvLyBBc3NldHMgaGFuZGxpbmdcblxuICBhc3luYyBjcmVhdGVBc3NldHMoc3RvcmFnZSwgZmlsZXMsIGNvdW50ID0gMCwgdHJ4ID0gbnVsbCkge1xuICAgIGNvbnN0IEFzc2V0TW9kZWwgPSB0aGlzLmdldE1vZGVsKCdBc3NldCcpXG4gICAgaWYgKEFzc2V0TW9kZWwpIHtcbiAgICAgIGNvbnN0IGFzc2V0cyA9IGZpbGVzLm1hcChmaWxlID0+ICh7XG4gICAgICAgIGtleTogZmlsZS5rZXksXG4gICAgICAgIGZpbGUsXG4gICAgICAgIHN0b3JhZ2U6IHN0b3JhZ2UubmFtZSxcbiAgICAgICAgY291bnRcbiAgICAgIH0pKVxuICAgICAgcmV0dXJuIEFzc2V0TW9kZWxcbiAgICAgICAgLnF1ZXJ5KHRyeClcbiAgICAgICAgLmluc2VydChhc3NldHMpXG4gICAgfVxuICAgIHJldHVybiBudWxsXG4gIH1cblxuICBhc3luYyBoYW5kbGVBZGRkZWRBbmRSZW1vdmVkQXNzZXRzKFxuICAgIHN0b3JhZ2UsXG4gICAgYWRkZWRGaWxlcyxcbiAgICByZW1vdmVkRmlsZXMsXG4gICAgdHJ4ID0gbnVsbFxuICApIHtcbiAgICBjb25zdCB7XG4gICAgICBhc3NldHM6IHtcbiAgICAgICAgY2xlYW51cFRpbWVUaHJlc2hvbGQgPSAwXG4gICAgICB9ID0ge31cbiAgICB9ID0gdGhpcy5jb25maWdcbiAgICAvLyBPbmx5IHJlbW92ZSB1bnVzZWQgYXNzZXRzIHRoYXQgaGF2ZW4ndCBzZWVuIGNoYW5nZXMgZm9yIGdpdmVuIHRpbWVmcmFtZS5cbiAgICBjb25zdCB0aW1lVGhyZXNob2xkID0gaXNTdHJpbmcoY2xlYW51cFRpbWVUaHJlc2hvbGQpXG4gICAgICA/IHBhcnNlRHVyYXRpb24oY2xlYW51cFRpbWVUaHJlc2hvbGQpXG4gICAgICA6IGNsZWFudXBUaW1lVGhyZXNob2xkXG5cbiAgICBjb25zdCBpbXBvcnRlZEZpbGVzID0gW11cbiAgICBjb25zdCBBc3NldE1vZGVsID0gdGhpcy5nZXRNb2RlbCgnQXNzZXQnKVxuICAgIGlmIChBc3NldE1vZGVsKSB7XG4gICAgICBpbXBvcnRlZEZpbGVzLnB1c2goXG4gICAgICAgIC4uLmF3YWl0IHRoaXMuYWRkRm9yZWlnbkFzc2V0cyhzdG9yYWdlLCBhZGRlZEZpbGVzLCB0cngpXG4gICAgICApXG4gICAgICBpZiAoXG4gICAgICAgIGFkZGVkRmlsZXMubGVuZ3RoID4gMCB8fFxuICAgICAgICByZW1vdmVkRmlsZXMubGVuZ3RoID4gMFxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IGNoYW5nZUNvdW50ID0gKGZpbGVzLCBpbmNyZW1lbnQpID0+IChcbiAgICAgICAgICBmaWxlcy5sZW5ndGggPiAwICYmXG4gICAgICAgICAgQXNzZXRNb2RlbC5xdWVyeSh0cngpXG4gICAgICAgICAgICAud2hlcmVJbigna2V5JywgZmlsZXMubWFwKGZpbGUgPT4gZmlsZS5rZXkpKVxuICAgICAgICAgICAgLmluY3JlbWVudCgnY291bnQnLCBpbmNyZW1lbnQpXG4gICAgICAgIClcbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICAgIGNoYW5nZUNvdW50KGFkZGVkRmlsZXMsIDEpLFxuICAgICAgICAgIGNoYW5nZUNvdW50KHJlbW92ZWRGaWxlcywgLTEpXG4gICAgICAgIF0pXG4gICAgICAgIGlmICh0aW1lVGhyZXNob2xkID4gMCkge1xuICAgICAgICAgIHNldFRpbWVvdXQoXG4gICAgICAgICAgICAvLyBEb24ndCBwYXNzIGB0cnhgIGhlcmUsIGFzIHdlIHdhbnQgdGhpcyBkZWxheWVkIGV4ZWN1dGlvbiB0b1xuICAgICAgICAgICAgLy8gY3JlYXRlIGl0cyBvd24gdHJhbnNhY3Rpb24uXG4gICAgICAgICAgICAoKSA9PiB0aGlzLnJlbGVhc2VVbnVzZWRBc3NldHModGltZVRocmVzaG9sZCksXG4gICAgICAgICAgICB0aW1lVGhyZXNob2xkXG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBBbHNvIGV4ZWN1dGUgcmVsZWFzZVVudXNlZEFzc2V0cygpIGltbWVkaWF0ZWx5IGluIHRoZSBzYW1lXG4gICAgICAvLyB0cmFuc2FjdGlvbiwgdG8gcG90ZW50aWFsbHkgY2xlYW4gdXAgb3RoZXIgcGVuZGluZyBhc3NldHMuXG4gICAgICBhd2FpdCB0aGlzLnJlbGVhc2VVbnVzZWRBc3NldHModGltZVRocmVzaG9sZCwgdHJ4KVxuICAgICAgcmV0dXJuIGltcG9ydGVkRmlsZXNcbiAgICB9XG4gIH1cblxuICBhc3luYyBhZGRGb3JlaWduQXNzZXRzKHN0b3JhZ2UsIGZpbGVzLCB0cnggPSBudWxsKSB7XG4gICAgY29uc3QgaW1wb3J0ZWRGaWxlcyA9IFtdXG4gICAgY29uc3QgQXNzZXRNb2RlbCA9IHRoaXMuZ2V0TW9kZWwoJ0Fzc2V0JylcbiAgICBpZiAoQXNzZXRNb2RlbCkge1xuICAgICAgLy8gRmluZCBtaXNzaW5nIGFzc2V0cyAoY29waWVkIGZyb20gYW5vdGhlciBzeXN0ZW0pLCBhbmQgYWRkIHRoZW0uXG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgZmlsZXMubWFwKGFzeW5jIGZpbGUgPT4ge1xuICAgICAgICAgIGNvbnN0IGFzc2V0ID0gYXdhaXQgQXNzZXRNb2RlbC5xdWVyeSh0cngpLmZpbmRPbmUoJ2tleScsIGZpbGUua2V5KVxuICAgICAgICAgIGlmICghYXNzZXQpIHtcbiAgICAgICAgICAgIGlmIChmaWxlLmRhdGEgfHwgZmlsZS51cmwpIHtcbiAgICAgICAgICAgICAgbGV0IHsgZGF0YSB9ID0gZmlsZVxuICAgICAgICAgICAgICBpZiAoIWRhdGEpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmluZm8oXG4gICAgICAgICAgICAgICAgICBgJHtcbiAgICAgICAgICAgICAgICAgICAgcGljby5yZWQoJ0lORk86JylcbiAgICAgICAgICAgICAgICAgIH0gQXNzZXQgJHtcbiAgICAgICAgICAgICAgICAgICAgcGljby5ncmVlbihgJyR7ZmlsZS5uYW1lfSdgKVxuICAgICAgICAgICAgICAgICAgfSBpcyBmcm9tIGEgZm9yZWlnbiBzb3VyY2UsIGZldGNoaW5nIGZyb20gJHtcbiAgICAgICAgICAgICAgICAgICAgcGljby5ncmVlbihgJyR7ZmlsZS51cmx9J2ApXG4gICAgICAgICAgICAgICAgICB9IGFuZCBhZGRpbmcgdG8gc3RvcmFnZSAke1xuICAgICAgICAgICAgICAgICAgICBwaWNvLmdyZWVuKGAnJHtzdG9yYWdlLm5hbWV9J2ApXG4gICAgICAgICAgICAgICAgICB9Li4uYFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zLnJlcXVlc3Qoe1xuICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnZ2V0JyxcbiAgICAgICAgICAgICAgICAgIHVybDogZmlsZS51cmwsXG4gICAgICAgICAgICAgICAgICByZXNwb25zZVR5cGU6ICdhcnJheWJ1ZmZlcidcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIGRhdGEgPSByZXNwb25zZS5kYXRhXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY29uc3QgaW1wb3J0ZWRGaWxlID0gYXdhaXQgc3RvcmFnZS5hZGRGaWxlKGZpbGUsIGRhdGEpXG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuY3JlYXRlQXNzZXRzKHN0b3JhZ2UsIFtpbXBvcnRlZEZpbGVdLCAwLCB0cngpXG4gICAgICAgICAgICAgIC8vIE1lcmdlIGJhY2sgdGhlIGNoYW5nZWQgZmlsZSBwcm9wZXJ0aWVzIGludG8gdGhlIGFjdHVhbCBmaWxlc1xuICAgICAgICAgICAgICAvLyBvYmplY3QsIHNvIHRoYXQgdGhlIGRhdGEgZnJvbSB0aGUgc3RhdGljIG1vZGVsIGhvb2sgY2FuIGJlIHVzZWRcbiAgICAgICAgICAgICAgLy8gZGlyZWN0bHkgZm9yIHRoZSBhY3R1YWwgcnVubmluZyBxdWVyeS5cbiAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihmaWxlLCBpbXBvcnRlZEZpbGUpXG4gICAgICAgICAgICAgIGltcG9ydGVkRmlsZXMucHVzaChpbXBvcnRlZEZpbGUpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXRFcnJvcihcbiAgICAgICAgICAgICAgICBgVW5hYmxlIHRvIGltcG9ydCBhc3NldCBmcm9tIGZvcmVpZ24gc291cmNlOiAnJHtcbiAgICAgICAgICAgICAgICAgIGZpbGUubmFtZVxuICAgICAgICAgICAgICAgIH0nICgnJHtcbiAgICAgICAgICAgICAgICAgIGZpbGUua2V5XG4gICAgICAgICAgICAgICAgfScpYFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIEFzc2V0IGlzIGZyb20gYSBmb3JlaWduIHNvdXJjZSwgYnV0IHdhcyBhbHJlYWR5IGltcG9ydGVkIGFuZCBjYW5cbiAgICAgICAgICAgIC8vIGJlIHJldXNlZC4gU2VlIGFib3ZlIGZvciBhbiBleHBsYW5hdGlvbiBvZiB0aGlzIG1lcmdlLlxuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihmaWxlLCBhc3NldC5maWxlKVxuICAgICAgICAgICAgLy8gTk9URTogTm8gbmVlZCB0byBhZGQgYGZpbGVgIHRvIGBpbXBvcnRlZEZpbGVzYCwgc2luY2UgaXQnc1xuICAgICAgICAgICAgLy8gYWxyZWFkeSBiZWVuIGltcG9ydGVkIHRvIHRoZSBzdG9yYWdlIGJlZm9yZS5cbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICApXG4gICAgfVxuICAgIHJldHVybiBpbXBvcnRlZEZpbGVzXG4gIH1cblxuICBhc3luYyBoYW5kbGVNb2RpZmllZEFzc2V0cyhzdG9yYWdlLCBmaWxlcywgdHJ4ID0gbnVsbCkge1xuICAgIGNvbnN0IG1vZGlmaWVkRmlsZXMgPSBbXVxuICAgIGNvbnN0IEFzc2V0TW9kZWwgPSB0aGlzLmdldE1vZGVsKCdBc3NldCcpXG4gICAgaWYgKEFzc2V0TW9kZWwpIHtcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICBmaWxlcy5tYXAoYXN5bmMgZmlsZSA9PiB7XG4gICAgICAgICAgaWYgKGZpbGUuZGF0YSkge1xuICAgICAgICAgICAgY29uc3QgYXNzZXQgPSBhd2FpdCBBc3NldE1vZGVsLnF1ZXJ5KHRyeCkuZmluZE9uZSgna2V5JywgZmlsZS5rZXkpXG4gICAgICAgICAgICBpZiAoYXNzZXQpIHtcbiAgICAgICAgICAgICAgY29uc3QgY2hhbmdlZEZpbGUgPSBhd2FpdCBzdG9yYWdlLmFkZEZpbGUoZmlsZSwgZmlsZS5kYXRhKVxuICAgICAgICAgICAgICAvLyBNZXJnZSBiYWNrIHRoZSBjaGFuZ2VkIGZpbGUgcHJvcGVydGllcyBpbnRvIHRoZSBhY3R1YWwgZmlsZXNcbiAgICAgICAgICAgICAgLy8gb2JqZWN0LCBzbyB0aGF0IHRoZSBkYXRhIGZyb20gdGhlIHN0YXRpYyBtb2RlbCBob29rIGNhbiBiZSB1c2VkXG4gICAgICAgICAgICAgIC8vIGRpcmVjdGx5IGZvciB0aGUgYWN0dWFsIHJ1bm5pbmcgcXVlcnkuXG4gICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oZmlsZSwgY2hhbmdlZEZpbGUpXG4gICAgICAgICAgICAgIG1vZGlmaWVkRmlsZXMucHVzaChjaGFuZ2VkRmlsZSlcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBBc3NldEVycm9yKFxuICAgICAgICAgICAgICAgIGBVbmFibGUgdG8gdXBkYXRlIG1vZGlmaWVkIGFzc2V0IGZyb20gbWVtb3J5IHNvdXJjZTogJyR7XG4gICAgICAgICAgICAgICAgICBmaWxlLm5hbWVcbiAgICAgICAgICAgICAgICB9JyAoJyR7XG4gICAgICAgICAgICAgICAgICBmaWxlLmtleVxuICAgICAgICAgICAgICAgIH0nKWBcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIClcbiAgICB9XG4gICAgcmV0dXJuIG1vZGlmaWVkRmlsZXNcbiAgfVxuXG4gIGFzeW5jIHJlbGVhc2VVbnVzZWRBc3NldHModGltZVRocmVzaG9sZCA9IDAsIHRyeCA9IG51bGwpIHtcbiAgICBjb25zdCBBc3NldE1vZGVsID0gdGhpcy5nZXRNb2RlbCgnQXNzZXQnKVxuICAgIGlmIChBc3NldE1vZGVsKSB7XG4gICAgICByZXR1cm4gQXNzZXRNb2RlbC50cmFuc2FjdGlvbih0cngsIGFzeW5jIHRyeCA9PiB7XG4gICAgICAgIC8vIERldGVybWluZSB0aGUgdGltZSB0aHJlc2hvbGQgaW4gSlMgaW5zdGVhZCBvZiBTUUwsIGFzIHRoZXJlIGlzIG5vXG4gICAgICAgIC8vIGVhc3kgY3Jvc3MtU1FMIHdheSB0byBkbyBgbm93KCkgLSBpbnRlcnZhbCBYIGhvdXJzYDpcbiAgICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKClcbiAgICAgICAgZGF0ZS5zZXRNaWxsaXNlY29uZHMoZGF0ZS5nZXRNaWxsaXNlY29uZHMoKSAtIHRpbWVUaHJlc2hvbGQpXG4gICAgICAgIGNvbnN0IG9ycGhhbmVkQXNzZXRzID0gYXdhaXQgQXNzZXRNb2RlbFxuICAgICAgICAgIC5xdWVyeSh0cngpXG4gICAgICAgICAgLndoZXJlKCdjb3VudCcsIDApXG4gICAgICAgICAgLmFuZFdoZXJlKCd1cGRhdGVkQXQnLCAnPD0nLCBkYXRlKVxuICAgICAgICAgIC8vIFByb3RlY3QgZnJlc2hseSBjcmVhdGVkIGFzc2V0cyBmcm9tIGJlaW5nIGRlbGV0ZWQgYWdhaW4gcmlnaHQgYXdheSxcbiAgICAgICAgICAvLyAuZS5nLiB3aGVuIGBjb25maWcuYXNzZXRzLmNsZWFudXBUaW1lVGhyZXNob2xkID0gMGBcbiAgICAgICAgICAuYW5kV2hlcmUoJ3VwZGF0ZWRBdCcsICc+JywgcmVmKCdjcmVhdGVkQXQnKSlcbiAgICAgICAgaWYgKG9ycGhhbmVkQXNzZXRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zdCBvcnBoYW5lZEtleXMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICAgIG9ycGhhbmVkQXNzZXRzLm1hcChhc3luYyBhc3NldCA9PiB7XG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5nZXRTdG9yYWdlKGFzc2V0LnN0b3JhZ2UpLnJlbW92ZUZpbGUoYXNzZXQuZmlsZSlcbiAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyb3IpXG4gICAgICAgICAgICAgICAgYXNzZXQuZXJyb3IgPSBlcnJvclxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBhc3NldC5rZXlcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKVxuICAgICAgICAgIGF3YWl0IEFzc2V0TW9kZWxcbiAgICAgICAgICAgIC5xdWVyeSh0cngpXG4gICAgICAgICAgICAuZGVsZXRlKClcbiAgICAgICAgICAgIC53aGVyZUluKCdrZXknLCBvcnBoYW5lZEtleXMpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG9ycGhhbmVkQXNzZXRzXG4gICAgICB9KVxuICAgIH1cbiAgfVxufVxuXG4vLyBPdmVycmlkZSBLb2EncyBldmVudHMgd2l0aCBvdXIgb3duIEV2ZW50RW1pdHRlciB0aGF0IGFkZHMgc3VwcG9ydCBmb3Jcbi8vIGFzeW5jaHJvbm91cyBldmVudHMuXG5FdmVudEVtaXR0ZXIubWl4aW4oQXBwbGljYXRpb24ucHJvdG90eXBlKVxuXG5mdW5jdGlvbiBnZXRPcHRpb25zKG9wdGlvbnMpIHtcbiAgcmV0dXJuIGlzT2JqZWN0KG9wdGlvbnMpID8gb3B0aW9ucyA6IHt9XG59XG4iXX0=
@@ -3,6 +3,8 @@
3
3
  exports.__esModule = true;
4
4
  exports.default = void 0;
5
5
 
6
+ require("core-js/modules/es.error.cause.js");
7
+
6
8
  var _default = modelName => class SessionStore {
7
9
  constructor(ctx) {
8
10
  this.ctx = ctx;
@@ -35,4 +37,4 @@ var _default = modelName => class SessionStore {
35
37
  };
36
38
 
37
39
  exports.default = _default;
38
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcHAvU2Vzc2lvblN0b3JlLmpzIl0sIm5hbWVzIjpbIm1vZGVsTmFtZSIsIlNlc3Npb25TdG9yZSIsImNvbnN0cnVjdG9yIiwiY3R4IiwibW9kZWxDbGFzcyIsImFwcCIsIm1vZGVscyIsIkVycm9yIiwicXVlcnkiLCJ0cmFuc2FjdGlvbiIsImdldCIsImlkIiwic2Vzc2lvbiIsImZpbmRCeUlkIiwidmFsdWUiLCJzZXQiLCJ1cHNlcnQiLCJnZXRSZWZlcmVuY2UiLCJkZXN0cm95Iiwia2V5IiwiZGVsZXRlQnlJZCJdLCJtYXBwaW5ncyI6Ijs7Ozs7ZUFBZUEsU0FBUyxJQUFJLE1BQU1DLFlBQU4sQ0FBbUI7QUFDN0NDLEVBQUFBLFdBQVcsQ0FBQ0MsR0FBRCxFQUFNO0FBQ2YsU0FBS0EsR0FBTCxHQUFXQSxHQUFYO0FBQ0EsU0FBS0MsVUFBTCxHQUFrQkQsR0FBRyxDQUFDRSxHQUFKLENBQVFDLE1BQVIsQ0FBZU4sU0FBZixDQUFsQjs7QUFDQSxRQUFJLENBQUMsS0FBS0ksVUFBVixFQUFzQjtBQUNwQixZQUFNLElBQUlHLEtBQUosQ0FBVyxnQ0FBK0JQLFNBQVUsR0FBcEQsQ0FBTjtBQUNEO0FBQ0Y7O0FBRURRLEVBQUFBLEtBQUssR0FBRztBQUNOLFdBQU8sS0FBS0osVUFBTCxDQUFnQkksS0FBaEIsQ0FBc0IsS0FBS0wsR0FBTCxDQUFTTSxXQUEvQixDQUFQO0FBQ0Q7O0FBRVEsUUFBSEMsR0FBRyxDQUFDQyxFQUFELEVBQUs7QUFDWixVQUFNQyxPQUFPLEdBQUcsTUFBTSxLQUFLSixLQUFMLEdBQWFLLFFBQWIsQ0FBc0JGLEVBQXRCLENBQXRCO0FBQ0EsV0FBTyxDQUFBQyxPQUFPLFFBQVAsWUFBQUEsT0FBTyxDQUFFRSxLQUFULEtBQWtCLEVBQXpCO0FBQ0Q7O0FBRVEsUUFBSEMsR0FBRyxDQUFDSixFQUFELEVBQUtHLEtBQUwsRUFBWTtBQUNuQixVQUFNLEtBQUtOLEtBQUwsR0FDSEssUUFERyxDQUNNRixFQUROLEVBRUhLLE1BRkcsQ0FFSSxFQUNOLEdBQUcsS0FBS1osVUFBTCxDQUFnQmEsWUFBaEIsQ0FBNkJOLEVBQTdCLENBREc7QUFFTkcsTUFBQUE7QUFGTSxLQUZKLENBQU47QUFNRDs7QUFFWSxRQUFQSSxPQUFPLENBQUNDLEdBQUQsRUFBTTtBQUNqQixXQUFPLEtBQUtYLEtBQUwsR0FBYVksVUFBYixDQUF3QkQsR0FBeEIsQ0FBUDtBQUNEOztBQTdCNEMsQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBkZWZhdWx0IG1vZGVsTmFtZSA9PiBjbGFzcyBTZXNzaW9uU3RvcmUge1xuICBjb25zdHJ1Y3RvcihjdHgpIHtcbiAgICB0aGlzLmN0eCA9IGN0eFxuICAgIHRoaXMubW9kZWxDbGFzcyA9IGN0eC5hcHAubW9kZWxzW21vZGVsTmFtZV1cbiAgICBpZiAoIXRoaXMubW9kZWxDbGFzcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gZmluZCBtb2RlbCBjbGFzczogJyR7bW9kZWxOYW1lfSdgKVxuICAgIH1cbiAgfVxuXG4gIHF1ZXJ5KCkge1xuICAgIHJldHVybiB0aGlzLm1vZGVsQ2xhc3MucXVlcnkodGhpcy5jdHgudHJhbnNhY3Rpb24pXG4gIH1cblxuICBhc3luYyBnZXQoaWQpIHtcbiAgICBjb25zdCBzZXNzaW9uID0gYXdhaXQgdGhpcy5xdWVyeSgpLmZpbmRCeUlkKGlkKVxuICAgIHJldHVybiBzZXNzaW9uPy52YWx1ZSB8fCB7fVxuICB9XG5cbiAgYXN5bmMgc2V0KGlkLCB2YWx1ZSkge1xuICAgIGF3YWl0IHRoaXMucXVlcnkoKVxuICAgICAgLmZpbmRCeUlkKGlkKVxuICAgICAgLnVwc2VydCh7XG4gICAgICAgIC4uLnRoaXMubW9kZWxDbGFzcy5nZXRSZWZlcmVuY2UoaWQpLFxuICAgICAgICB2YWx1ZVxuICAgICAgfSlcbiAgfVxuXG4gIGFzeW5jIGRlc3Ryb3koa2V5KSB7XG4gICAgcmV0dXJuIHRoaXMucXVlcnkoKS5kZWxldGVCeUlkKGtleSlcbiAgfVxufVxuIl19
40
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcHAvU2Vzc2lvblN0b3JlLmpzIl0sIm5hbWVzIjpbIm1vZGVsTmFtZSIsIlNlc3Npb25TdG9yZSIsImNvbnN0cnVjdG9yIiwiY3R4IiwibW9kZWxDbGFzcyIsImFwcCIsIm1vZGVscyIsIkVycm9yIiwicXVlcnkiLCJ0cmFuc2FjdGlvbiIsImdldCIsImlkIiwic2Vzc2lvbiIsImZpbmRCeUlkIiwidmFsdWUiLCJzZXQiLCJ1cHNlcnQiLCJnZXRSZWZlcmVuY2UiLCJkZXN0cm95Iiwia2V5IiwiZGVsZXRlQnlJZCJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztlQUFlQSxTQUFTLElBQUksTUFBTUMsWUFBTixDQUFtQjtBQUM3Q0MsRUFBQUEsV0FBVyxDQUFDQyxHQUFELEVBQU07QUFDZixTQUFLQSxHQUFMLEdBQVdBLEdBQVg7QUFDQSxTQUFLQyxVQUFMLEdBQWtCRCxHQUFHLENBQUNFLEdBQUosQ0FBUUMsTUFBUixDQUFlTixTQUFmLENBQWxCOztBQUNBLFFBQUksQ0FBQyxLQUFLSSxVQUFWLEVBQXNCO0FBQ3BCLFlBQU0sSUFBSUcsS0FBSixDQUFXLGdDQUErQlAsU0FBVSxHQUFwRCxDQUFOO0FBQ0Q7QUFDRjs7QUFFRFEsRUFBQUEsS0FBSyxHQUFHO0FBQ04sV0FBTyxLQUFLSixVQUFMLENBQWdCSSxLQUFoQixDQUFzQixLQUFLTCxHQUFMLENBQVNNLFdBQS9CLENBQVA7QUFDRDs7QUFFUSxRQUFIQyxHQUFHLENBQUNDLEVBQUQsRUFBSztBQUNaLFVBQU1DLE9BQU8sR0FBRyxNQUFNLEtBQUtKLEtBQUwsR0FBYUssUUFBYixDQUFzQkYsRUFBdEIsQ0FBdEI7QUFDQSxXQUFPLENBQUFDLE9BQU8sUUFBUCxZQUFBQSxPQUFPLENBQUVFLEtBQVQsS0FBa0IsRUFBekI7QUFDRDs7QUFFUSxRQUFIQyxHQUFHLENBQUNKLEVBQUQsRUFBS0csS0FBTCxFQUFZO0FBQ25CLFVBQU0sS0FBS04sS0FBTCxHQUNISyxRQURHLENBQ01GLEVBRE4sRUFFSEssTUFGRyxDQUVJLEVBQ04sR0FBRyxLQUFLWixVQUFMLENBQWdCYSxZQUFoQixDQUE2Qk4sRUFBN0IsQ0FERztBQUVORyxNQUFBQTtBQUZNLEtBRkosQ0FBTjtBQU1EOztBQUVZLFFBQVBJLE9BQU8sQ0FBQ0MsR0FBRCxFQUFNO0FBQ2pCLFdBQU8sS0FBS1gsS0FBTCxHQUFhWSxVQUFiLENBQXdCRCxHQUF4QixDQUFQO0FBQ0Q7O0FBN0I0QyxDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgbW9kZWxOYW1lID0+IGNsYXNzIFNlc3Npb25TdG9yZSB7XG4gIGNvbnN0cnVjdG9yKGN0eCkge1xuICAgIHRoaXMuY3R4ID0gY3R4XG4gICAgdGhpcy5tb2RlbENsYXNzID0gY3R4LmFwcC5tb2RlbHNbbW9kZWxOYW1lXVxuICAgIGlmICghdGhpcy5tb2RlbENsYXNzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byBmaW5kIG1vZGVsIGNsYXNzOiAnJHttb2RlbE5hbWV9J2ApXG4gICAgfVxuICB9XG5cbiAgcXVlcnkoKSB7XG4gICAgcmV0dXJuIHRoaXMubW9kZWxDbGFzcy5xdWVyeSh0aGlzLmN0eC50cmFuc2FjdGlvbilcbiAgfVxuXG4gIGFzeW5jIGdldChpZCkge1xuICAgIGNvbnN0IHNlc3Npb24gPSBhd2FpdCB0aGlzLnF1ZXJ5KCkuZmluZEJ5SWQoaWQpXG4gICAgcmV0dXJuIHNlc3Npb24/LnZhbHVlIHx8IHt9XG4gIH1cblxuICBhc3luYyBzZXQoaWQsIHZhbHVlKSB7XG4gICAgYXdhaXQgdGhpcy5xdWVyeSgpXG4gICAgICAuZmluZEJ5SWQoaWQpXG4gICAgICAudXBzZXJ0KHtcbiAgICAgICAgLi4udGhpcy5tb2RlbENsYXNzLmdldFJlZmVyZW5jZShpZCksXG4gICAgICAgIHZhbHVlXG4gICAgICB9KVxuICB9XG5cbiAgYXN5bmMgZGVzdHJveShrZXkpIHtcbiAgICByZXR1cm4gdGhpcy5xdWVyeSgpLmRlbGV0ZUJ5SWQoa2V5KVxuICB9XG59XG4iXX0=