parse-server 6.0.0-alpha.2 → 6.0.0-alpha.21

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 (191) hide show
  1. package/README.md +45 -17
  2. package/lib/AccountLockout.js +11 -26
  3. package/lib/Adapters/AdapterLoader.js +8 -14
  4. package/lib/Adapters/Analytics/AnalyticsAdapter.js +2 -8
  5. package/lib/Adapters/Auth/AuthAdapter.js +7 -16
  6. package/lib/Adapters/Auth/OAuth1Client.js +32 -57
  7. package/lib/Adapters/Auth/apple.js +6 -22
  8. package/lib/Adapters/Auth/facebook.js +7 -37
  9. package/lib/Adapters/Auth/gcenter.js +8 -37
  10. package/lib/Adapters/Auth/github.js +7 -10
  11. package/lib/Adapters/Auth/google.js +11 -34
  12. package/lib/Adapters/Auth/gpgames.js +5 -8
  13. package/lib/Adapters/Auth/httpsRequest.js +1 -7
  14. package/lib/Adapters/Auth/index.js +20 -65
  15. package/lib/Adapters/Auth/instagram.js +5 -9
  16. package/lib/Adapters/Auth/janraincapture.js +8 -12
  17. package/lib/Adapters/Auth/janrainengage.js +7 -11
  18. package/lib/Adapters/Auth/keycloak.js +5 -19
  19. package/lib/Adapters/Auth/ldap.js +1 -15
  20. package/lib/Adapters/Auth/line.js +7 -10
  21. package/lib/Adapters/Auth/linkedin.js +7 -12
  22. package/lib/Adapters/Auth/meetup.js +7 -10
  23. package/lib/Adapters/Auth/microsoft.js +7 -10
  24. package/lib/Adapters/Auth/oauth2.js +6 -18
  25. package/lib/Adapters/Auth/phantauth.js +8 -10
  26. package/lib/Adapters/Auth/qq.js +7 -13
  27. package/lib/Adapters/Auth/spotify.js +7 -14
  28. package/lib/Adapters/Auth/twitter.js +5 -15
  29. package/lib/Adapters/Auth/vkontakte.js +9 -15
  30. package/lib/Adapters/Auth/wechat.js +7 -10
  31. package/lib/Adapters/Auth/weibo.js +7 -11
  32. package/lib/Adapters/Cache/CacheAdapter.js +4 -12
  33. package/lib/Adapters/Cache/InMemoryCache.js +5 -19
  34. package/lib/Adapters/Cache/InMemoryCacheAdapter.js +1 -11
  35. package/lib/Adapters/Cache/LRUCache.js +1 -11
  36. package/lib/Adapters/Cache/NullCacheAdapter.js +1 -8
  37. package/lib/Adapters/Cache/RedisCacheAdapter.js +46 -87
  38. package/lib/Adapters/Cache/SchemaCache.js +1 -6
  39. package/lib/Adapters/Email/MailAdapter.js +2 -7
  40. package/lib/Adapters/Files/FilesAdapter.js +7 -21
  41. package/lib/Adapters/Files/GridFSBucketAdapter.js +6 -44
  42. package/lib/Adapters/Files/GridStoreAdapter.js +1 -1
  43. package/lib/Adapters/Logger/LoggerAdapter.js +2 -11
  44. package/lib/Adapters/Logger/WinstonLogger.js +3 -30
  45. package/lib/Adapters/Logger/WinstonLoggerAdapter.js +5 -16
  46. package/lib/Adapters/MessageQueue/EventEmitterMQ.js +3 -20
  47. package/lib/Adapters/PubSub/EventEmitterPubSub.js +1 -16
  48. package/lib/Adapters/PubSub/PubSubAdapter.js +2 -9
  49. package/lib/Adapters/PubSub/RedisPubSub.js +13 -10
  50. package/lib/Adapters/Push/PushAdapter.js +2 -8
  51. package/lib/Adapters/Storage/Mongo/MongoCollection.js +12 -37
  52. package/lib/Adapters/Storage/Mongo/MongoSchemaCollection.js +26 -79
  53. package/lib/Adapters/Storage/Mongo/MongoStorageAdapter.js +78 -209
  54. package/lib/Adapters/Storage/Mongo/MongoTransform.js +82 -371
  55. package/lib/Adapters/Storage/Postgres/PostgresClient.js +1 -13
  56. package/lib/Adapters/Storage/Postgres/PostgresConfigParser.js +1 -20
  57. package/lib/Adapters/Storage/Postgres/PostgresStorageAdapter.js +119 -446
  58. package/lib/Adapters/Storage/Postgres/sql/index.js +4 -7
  59. package/lib/Adapters/Storage/StorageAdapter.js +1 -1
  60. package/lib/Adapters/WebSocketServer/WSAdapter.js +3 -12
  61. package/lib/Adapters/WebSocketServer/WSSAdapter.js +7 -12
  62. package/lib/Auth.js +54 -121
  63. package/lib/ClientSDK.js +3 -11
  64. package/lib/Config.js +69 -113
  65. package/lib/Controllers/AdaptableController.js +6 -18
  66. package/lib/Controllers/AnalyticsController.js +1 -9
  67. package/lib/Controllers/CacheController.js +3 -23
  68. package/lib/Controllers/DatabaseController.js +147 -345
  69. package/lib/Controllers/FilesController.js +5 -34
  70. package/lib/Controllers/HooksController.js +1 -51
  71. package/lib/Controllers/LiveQueryController.js +4 -23
  72. package/lib/Controllers/LoggerController.js +15 -54
  73. package/lib/Controllers/ParseGraphQLController.js +49 -104
  74. package/lib/Controllers/PushController.js +20 -59
  75. package/lib/Controllers/SchemaController.js +154 -344
  76. package/lib/Controllers/UserController.js +11 -72
  77. package/lib/Controllers/index.js +19 -68
  78. package/lib/Controllers/types.js +1 -1
  79. package/lib/Deprecator/Deprecations.js +1 -8
  80. package/lib/Deprecator/Deprecator.js +9 -18
  81. package/lib/GraphQL/ParseGraphQLSchema.js +16 -100
  82. package/lib/GraphQL/ParseGraphQLServer.js +2 -29
  83. package/lib/GraphQL/helpers/objectsMutations.js +2 -12
  84. package/lib/GraphQL/helpers/objectsQueries.js +18 -76
  85. package/lib/GraphQL/loaders/defaultGraphQLMutations.js +1 -9
  86. package/lib/GraphQL/loaders/defaultGraphQLQueries.js +1 -8
  87. package/lib/GraphQL/loaders/defaultGraphQLTypes.js +9 -115
  88. package/lib/GraphQL/loaders/defaultRelaySchema.js +6 -18
  89. package/lib/GraphQL/loaders/filesMutations.js +2 -19
  90. package/lib/GraphQL/loaders/functionsMutations.js +6 -17
  91. package/lib/GraphQL/loaders/parseClassMutations.js +6 -44
  92. package/lib/GraphQL/loaders/parseClassQueries.js +1 -26
  93. package/lib/GraphQL/loaders/parseClassTypes.js +10 -64
  94. package/lib/GraphQL/loaders/schemaDirectives.js +1 -17
  95. package/lib/GraphQL/loaders/schemaMutations.js +1 -20
  96. package/lib/GraphQL/loaders/schemaQueries.js +1 -14
  97. package/lib/GraphQL/loaders/schemaTypes.js +2 -6
  98. package/lib/GraphQL/loaders/usersMutations.js +6 -28
  99. package/lib/GraphQL/loaders/usersQueries.js +4 -26
  100. package/lib/GraphQL/parseGraphQLUtils.js +6 -19
  101. package/lib/GraphQL/transformers/className.js +1 -4
  102. package/lib/GraphQL/transformers/constraintType.js +1 -20
  103. package/lib/GraphQL/transformers/inputType.js +1 -20
  104. package/lib/GraphQL/transformers/mutation.js +6 -51
  105. package/lib/GraphQL/transformers/outputType.js +1 -20
  106. package/lib/GraphQL/transformers/query.js +6 -42
  107. package/lib/GraphQL/transformers/schemaFields.js +7 -34
  108. package/lib/KeyPromiseQueue.js +1 -12
  109. package/lib/LiveQuery/Client.js +1 -25
  110. package/lib/LiveQuery/Id.js +1 -7
  111. package/lib/LiveQuery/ParseCloudCodePublisher.js +13 -19
  112. package/lib/LiveQuery/ParseLiveQueryServer.js +92 -306
  113. package/lib/LiveQuery/ParsePubSub.js +1 -12
  114. package/lib/LiveQuery/ParseWebSocketServer.js +4 -26
  115. package/lib/LiveQuery/QueryTools.js +14 -116
  116. package/lib/LiveQuery/RequestSchema.js +1 -1
  117. package/lib/LiveQuery/SessionTokenCache.js +1 -17
  118. package/lib/LiveQuery/Subscription.js +4 -18
  119. package/lib/LiveQuery/equalObjects.js +2 -14
  120. package/lib/Options/Definitions.js +79 -10
  121. package/lib/Options/docs.js +23 -3
  122. package/lib/Options/index.js +4 -12
  123. package/lib/Options/parsers.js +1 -18
  124. package/lib/Page.js +1 -9
  125. package/lib/ParseMessageQueue.js +1 -10
  126. package/lib/ParseServer.js +144 -182
  127. package/lib/ParseServerRESTController.js +6 -33
  128. package/lib/PromiseRouter.js +16 -50
  129. package/lib/Push/PushQueue.js +3 -15
  130. package/lib/Push/PushWorker.js +7 -32
  131. package/lib/Push/utils.js +9 -38
  132. package/lib/RestQuery.js +105 -242
  133. package/lib/RestWrite.js +212 -377
  134. package/lib/Routers/AggregateRouter.js +14 -51
  135. package/lib/Routers/AnalyticsRouter.js +2 -8
  136. package/lib/Routers/AudiencesRouter.js +1 -15
  137. package/lib/Routers/ClassesRouter.js +3 -53
  138. package/lib/Routers/CloudCodeRouter.js +1 -19
  139. package/lib/Routers/FeaturesRouter.js +1 -10
  140. package/lib/Routers/FilesRouter.js +29 -76
  141. package/lib/Routers/FunctionsRouter.js +5 -28
  142. package/lib/Routers/GlobalConfigRouter.js +4 -18
  143. package/lib/Routers/GraphQLRouter.js +1 -14
  144. package/lib/Routers/HooksRouter.js +1 -29
  145. package/lib/Routers/IAPValidationRouter.js +6 -29
  146. package/lib/Routers/InstallationsRouter.js +2 -12
  147. package/lib/Routers/LogsRouter.js +4 -16
  148. package/lib/Routers/PagesRouter.js +69 -129
  149. package/lib/Routers/PublicAPIRouter.js +3 -62
  150. package/lib/Routers/PurgeRouter.js +1 -15
  151. package/lib/Routers/PushRouter.js +2 -18
  152. package/lib/Routers/RolesRouter.js +1 -7
  153. package/lib/Routers/SchemasRouter.js +4 -34
  154. package/lib/Routers/SecurityRouter.js +1 -12
  155. package/lib/Routers/SessionsRouter.js +3 -19
  156. package/lib/Routers/UsersRouter.js +58 -155
  157. package/lib/SchemaMigrations/DefinedSchemas.js +56 -115
  158. package/lib/SchemaMigrations/Migrations.js +2 -8
  159. package/lib/Security/Check.js +8 -16
  160. package/lib/Security/CheckGroup.js +4 -11
  161. package/lib/Security/CheckGroups/CheckGroupDatabase.js +8 -18
  162. package/lib/Security/CheckGroups/CheckGroupServerConfig.js +5 -15
  163. package/lib/Security/CheckGroups/CheckGroups.js +1 -4
  164. package/lib/Security/CheckRunner.js +22 -41
  165. package/lib/StatusHandler.js +12 -69
  166. package/lib/TestUtils.js +1 -6
  167. package/lib/Utils.js +27 -66
  168. package/lib/batch.js +17 -28
  169. package/lib/cache.js +1 -3
  170. package/lib/cli/definitions/parse-live-query-server.js +1 -3
  171. package/lib/cli/definitions/parse-server.js +1 -3
  172. package/lib/cli/parse-live-query-server.js +1 -6
  173. package/lib/cli/parse-server.js +11 -21
  174. package/lib/cli/utils/commander.js +13 -51
  175. package/lib/cli/utils/runner.js +1 -14
  176. package/lib/cloud-code/Parse.Cloud.js +71 -92
  177. package/lib/cryptoUtils.js +11 -19
  178. package/lib/defaults.js +2 -14
  179. package/lib/deprecated.js +1 -2
  180. package/lib/index.js +16 -34
  181. package/lib/logger.js +6 -13
  182. package/lib/middlewares.js +147 -151
  183. package/lib/password.js +6 -10
  184. package/lib/request.js +173 -2
  185. package/lib/requiredParameter.js +1 -3
  186. package/lib/rest.js +19 -41
  187. package/lib/triggers.js +54 -252
  188. package/lib/vendor/mongodbUrl.js +125 -305
  189. package/package.json +22 -19
  190. package/lib/cloud-code/HTTPResponse.js +0 -73
  191. package/lib/cloud-code/httpRequest.js +0 -192
@@ -4,35 +4,24 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.CloudCodeRouter = void 0;
7
-
8
7
  var _PromiseRouter = _interopRequireDefault(require("../PromiseRouter"));
9
-
10
8
  var _node = _interopRequireDefault(require("parse/node"));
11
-
12
9
  var _rest = _interopRequireDefault(require("../rest"));
13
-
14
10
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
15
-
16
11
  const triggers = require('../triggers');
17
-
18
12
  const middleware = require('../middlewares');
19
-
20
13
  function formatJobSchedule(job_schedule) {
21
14
  if (typeof job_schedule.startAfter === 'undefined') {
22
15
  job_schedule.startAfter = new Date().toISOString();
23
16
  }
24
-
25
17
  return job_schedule;
26
18
  }
27
-
28
19
  function validateJobSchedule(config, job_schedule) {
29
20
  const jobs = triggers.getJobs(config.applicationId) || {};
30
-
31
21
  if (job_schedule.jobName && !jobs[job_schedule.jobName]) {
32
22
  throw new _node.default.Error(_node.default.Error.INTERNAL_SERVER_ERROR, 'Cannot Schedule a job that is not deployed');
33
23
  }
34
24
  }
35
-
36
25
  class CloudCodeRouter extends _PromiseRouter.default {
37
26
  mountRoutes() {
38
27
  this.route('GET', '/cloud_code/jobs', middleware.promiseEnforceMasterKeyAccess, CloudCodeRouter.getJobs);
@@ -41,7 +30,6 @@ class CloudCodeRouter extends _PromiseRouter.default {
41
30
  this.route('PUT', '/cloud_code/jobs/:objectId', middleware.promiseEnforceMasterKeyAccess, CloudCodeRouter.editJob);
42
31
  this.route('DELETE', '/cloud_code/jobs/:objectId', middleware.promiseEnforceMasterKeyAccess, CloudCodeRouter.deleteJob);
43
32
  }
44
-
45
33
  static getJobs(req) {
46
34
  return _rest.default.find(req.config, req.auth, '_JobSchedule', {}, {}).then(scheduledJobs => {
47
35
  return {
@@ -49,7 +37,6 @@ class CloudCodeRouter extends _PromiseRouter.default {
49
37
  };
50
38
  });
51
39
  }
52
-
53
40
  static getJobsData(req) {
54
41
  const config = req.config;
55
42
  const jobs = triggers.getJobs(config.applicationId) || {};
@@ -62,7 +49,6 @@ class CloudCodeRouter extends _PromiseRouter.default {
62
49
  };
63
50
  });
64
51
  }
65
-
66
52
  static createJob(req) {
67
53
  const {
68
54
  job_schedule
@@ -70,7 +56,6 @@ class CloudCodeRouter extends _PromiseRouter.default {
70
56
  validateJobSchedule(req.config, job_schedule);
71
57
  return _rest.default.create(req.config, req.auth, '_JobSchedule', formatJobSchedule(job_schedule), req.client, req.info.context);
72
58
  }
73
-
74
59
  static editJob(req) {
75
60
  const {
76
61
  objectId
@@ -87,7 +72,6 @@ class CloudCodeRouter extends _PromiseRouter.default {
87
72
  };
88
73
  });
89
74
  }
90
-
91
75
  static deleteJob(req) {
92
76
  const {
93
77
  objectId
@@ -98,8 +82,6 @@ class CloudCodeRouter extends _PromiseRouter.default {
98
82
  };
99
83
  });
100
84
  }
101
-
102
85
  }
103
-
104
86
  exports.CloudCodeRouter = CloudCodeRouter;
105
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9Sb3V0ZXJzL0Nsb3VkQ29kZVJvdXRlci5qcyJdLCJuYW1lcyI6WyJ0cmlnZ2VycyIsInJlcXVpcmUiLCJtaWRkbGV3YXJlIiwiZm9ybWF0Sm9iU2NoZWR1bGUiLCJqb2Jfc2NoZWR1bGUiLCJzdGFydEFmdGVyIiwiRGF0ZSIsInRvSVNPU3RyaW5nIiwidmFsaWRhdGVKb2JTY2hlZHVsZSIsImNvbmZpZyIsImpvYnMiLCJnZXRKb2JzIiwiYXBwbGljYXRpb25JZCIsImpvYk5hbWUiLCJQYXJzZSIsIkVycm9yIiwiSU5URVJOQUxfU0VSVkVSX0VSUk9SIiwiQ2xvdWRDb2RlUm91dGVyIiwiUHJvbWlzZVJvdXRlciIsIm1vdW50Um91dGVzIiwicm91dGUiLCJwcm9taXNlRW5mb3JjZU1hc3RlcktleUFjY2VzcyIsImdldEpvYnNEYXRhIiwiY3JlYXRlSm9iIiwiZWRpdEpvYiIsImRlbGV0ZUpvYiIsInJlcSIsInJlc3QiLCJmaW5kIiwiYXV0aCIsInRoZW4iLCJzY2hlZHVsZWRKb2JzIiwicmVzcG9uc2UiLCJyZXN1bHRzIiwiaW5fdXNlIiwibWFwIiwiam9iIiwiT2JqZWN0Iiwia2V5cyIsImJvZHkiLCJjcmVhdGUiLCJjbGllbnQiLCJpbmZvIiwiY29udGV4dCIsIm9iamVjdElkIiwicGFyYW1zIiwidXBkYXRlIiwidW5kZWZpbmVkIiwiZGVsIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7Ozs7QUFDQSxNQUFNQSxRQUFRLEdBQUdDLE9BQU8sQ0FBQyxhQUFELENBQXhCOztBQUNBLE1BQU1DLFVBQVUsR0FBR0QsT0FBTyxDQUFDLGdCQUFELENBQTFCOztBQUVBLFNBQVNFLGlCQUFULENBQTJCQyxZQUEzQixFQUF5QztBQUN2QyxNQUFJLE9BQU9BLFlBQVksQ0FBQ0MsVUFBcEIsS0FBbUMsV0FBdkMsRUFBb0Q7QUFDbERELElBQUFBLFlBQVksQ0FBQ0MsVUFBYixHQUEwQixJQUFJQyxJQUFKLEdBQVdDLFdBQVgsRUFB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Li4vUHJvbWlzZVJvdXRlcic7XG5pbXBvcnQgUGFyc2UgZnJvbSAncGFyc2Uvbm9kZSc7XG5pbXBvcnQgcmVzdCBmcm9tICcuLi9yZXN0JztcbmNvbnN0IHRyaWdnZXJzID0gcmVxdWlyZSgnLi4vdHJpZ2dlcnMnKTtcbmNvbnN0IG1pZGRsZXdhcmUgPSByZXF1aXJlKCcuLi9taWRkbGV3YXJlcycpO1xuXG5mdW5jdGlvbiBmb3JtYXRKb2JTY2hlZHVsZShqb2Jfc2NoZWR1bGUpIHtcbiAgaWYgKHR5cGVvZiBqb2Jfc2NoZWR1bGUuc3RhcnRBZnRlciA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBqb2Jfc2NoZWR1bGUuc3RhcnRBZnRlciA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKTtcbiAgfVxuICByZXR1cm4gam9iX3NjaGVkdWxlO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZUpvYlNjaGVkdWxlKGNvbmZpZywgam9iX3NjaGVkdWxlKSB7XG4gIGNvbnN0IGpvYnMgPSB0cmlnZ2Vycy5nZXRKb2JzKGNvbmZpZy5hcHBsaWNhdGlvbklkKSB8fCB7fTtcbiAgaWYgKGpvYl9zY2hlZHVsZS5qb2JOYW1lICYmICFqb2JzW2pvYl9zY2hlZHVsZS5qb2JOYW1lXSkge1xuICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihcbiAgICAgIFBhcnNlLkVycm9yLklOVEVSTkFMX1NFUlZFUl9FUlJPUixcbiAgICAgICdDYW5ub3QgU2NoZWR1bGUgYSBqb2IgdGhhdCBpcyBub3QgZGVwbG95ZWQnXG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ2xvdWRDb2RlUm91dGVyIGV4dGVuZHMgUHJvbWlzZVJvdXRlciB7XG4gIG1vdW50Um91dGVzKCkge1xuICAgIHRoaXMucm91dGUoXG4gICAgICAnR0VUJyxcbiAgICAgICcvY2xvdWRfY29kZS9qb2JzJyxcbiAgICAgIG1pZGRsZXdhcmUucHJvbWlzZUVuZm9yY2VNYXN0ZXJLZXlBY2Nlc3MsXG4gICAgICBDbG91ZENvZGVSb3V0ZXIuZ2V0Sm9ic1xuICAgICk7XG4gICAgdGhpcy5yb3V0ZShcbiAgICAgICdHRVQnLFxuICAgICAgJy9jbG91ZF9jb2RlL2pvYnMvZGF0YScsXG4gICAgICBtaWRkbGV3YXJlLnByb21pc2VFbmZvcmNlTWFzdGVyS2V5QWNjZXNzLFxuICAgICAgQ2xvdWRDb2RlUm91dGVyLmdldEpvYnNEYXRhXG4gICAgKTtcbiAgICB0aGlzLnJvdXRlKFxuICAgICAgJ1BPU1QnLFxuICAgICAgJy9jbG91ZF9jb2RlL2pvYnMnLFxuICAgICAgbWlkZGxld2FyZS5wcm9taXNlRW5mb3JjZU1hc3RlcktleUFjY2VzcyxcbiAgICAgIENsb3VkQ29kZVJvdXRlci5jcmVhdGVKb2JcbiAgICApO1xuICAgIHRoaXMucm91dGUoXG4gICAgICAnUFVUJyxcbiAgICAgICcvY2xvdWRfY29kZS9qb2JzLzpvYmplY3RJZCcsXG4gICAgICBtaWRkbGV3YXJlLnByb21pc2VFbmZvcmNlTWFzdGVyS2V5QWNjZXNzLFxuICAgICAgQ2xvdWRDb2RlUm91dGVyLmVkaXRKb2JcbiAgICApO1xuICAgIHRoaXMucm91dGUoXG4gICAgICAnREVMRVRFJyxcbiAgICAgICcvY2xvdWRfY29kZS9qb2JzLzpvYmplY3RJZCcsXG4gICAgICBtaWRkbGV3YXJlLnByb21pc2VFbmZvcmNlTWFzdGVyS2V5QWNjZXNzLFxuICAgICAgQ2xvdWRDb2RlUm91dGVyLmRlbGV0ZUpvYlxuICAgICk7XG4gIH1cblxuICBzdGF0aWMgZ2V0Sm9icyhyZXEpIHtcbiAgICByZXR1cm4gcmVzdC5maW5kKHJlcS5jb25maWcsIHJlcS5hdXRoLCAnX0pvYlNjaGVkdWxlJywge30sIHt9KS50aGVuKHNjaGVkdWxlZEpvYnMgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcmVzcG9uc2U6IHNjaGVkdWxlZEpvYnMucmVzdWx0cyxcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICBzdGF0aWMgZ2V0Sm9ic0RhdGEocmVxKSB7XG4gICAgY29uc3QgY29uZmlnID0gcmVxLmNvbmZpZztcbiAgICBjb25zdCBqb2JzID0gdHJpZ2dlcnMuZ2V0Sm9icyhjb25maWcuYXBwbGljYXRpb25JZCkgfHwge307XG4gICAgcmV0dXJuIHJlc3QuZmluZChyZXEuY29uZmlnLCByZXEuYXV0aCwgJ19Kb2JTY2hlZHVsZScsIHt9LCB7fSkudGhlbihzY2hlZHVsZWRKb2JzID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHJlc3BvbnNlOiB7XG4gICAgICAgICAgaW5fdXNlOiBzY2hlZHVsZWRKb2JzLnJlc3VsdHMubWFwKGpvYiA9PiBqb2Iuam9iTmFtZSksXG4gICAgICAgICAgam9iczogT2JqZWN0LmtleXMoam9icyksXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgc3RhdGljIGNyZWF0ZUpvYihyZXEpIHtcbiAgICBjb25zdCB7IGpvYl9zY2hlZHVsZSB9ID0gcmVxLmJvZHk7XG4gICAgdmFsaWRhdGVKb2JTY2hlZHVsZShyZXEuY29uZmlnLCBqb2Jfc2NoZWR1bGUpO1xuICAgIHJldHVybiByZXN0LmNyZWF0ZShcbiAgICAgIHJlcS5jb25maWcsXG4gICAgICByZXEuYXV0aCxcbiAgICAgICdfSm9iU2NoZWR1bGUnLFxuICAgICAgZm9ybWF0Sm9iU2NoZWR1bGUoam9iX3NjaGVkdWxlKSxcbiAgICAgIHJlcS5jbGllbnQsXG4gICAgICByZXEuaW5mby5jb250ZXh0XG4gICAgKTtcbiAgfVxuXG4gIHN0YXRpYyBlZGl0Sm9iKHJlcSkge1xuICAgIGNvbnN0IHsgb2JqZWN0SWQgfSA9IHJlcS5wYXJhbXM7XG4gICAgY29uc3QgeyBqb2Jfc2NoZWR1bGUgfSA9IHJlcS5ib2R5O1xuICAgIHZhbGlkYXRlSm9iU2NoZWR1bGUocmVxLmNvbmZpZywgam9iX3NjaGVkdWxlKTtcbiAgICByZXR1cm4gcmVzdFxuICAgICAgLnVwZGF0ZShcbiAgICAgICAgcmVxLmNvbmZpZyxcbiAgICAgICAgcmVxLmF1dGgsXG4gICAgICAgICdfSm9iU2NoZWR1bGUnLFxuICAgICAgICB7IG9iamVjdElkIH0sXG4gICAgICAgIGZvcm1hdEpvYlNjaGVkdWxlKGpvYl9zY2hlZHVsZSksXG4gICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgcmVxLmluZm8uY29udGV4dFxuICAgICAgKVxuICAgICAgLnRoZW4ocmVzcG9uc2UgPT4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHJlc3BvbnNlLFxuICAgICAgICB9O1xuICAgICAgfSk7XG4gIH1cblxuICBzdGF0aWMgZGVsZXRlSm9iKHJlcSkge1xuICAgIGNvbnN0IHsgb2JqZWN0SWQgfSA9IHJlcS5wYXJhbXM7XG4gICAgcmV0dXJuIHJlc3RcbiAgICAgIC5kZWwocmVxLmNvbmZpZywgcmVxLmF1dGgsICdfSm9iU2NoZWR1bGUnLCBvYmplY3RJZCwgcmVxLmluZm8uY29udGV4dClcbiAgICAgIC50aGVuKHJlc3BvbnNlID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICByZXNwb25zZSxcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICB9XG59XG4iXX0=
87
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ0cmlnZ2VycyIsInJlcXVpcmUiLCJtaWRkbGV3YXJlIiwiZm9ybWF0Sm9iU2NoZWR1bGUiLCJqb2Jfc2NoZWR1bGUiLCJzdGFydEFmdGVyIiwiRGF0ZSIsInRvSVNPU3RyaW5nIiwidmFsaWRhdGVKb2JTY2hlZHVsZSIsImNvbmZpZyIsImpvYnMiLCJnZXRKb2JzIiwiYXBwbGljYXRpb25JZCIsImpvYk5hbWUiLCJQYXJzZSIsIkVycm9yIiwiSU5URVJOQUxfU0VSVkVSX0VSUk9SIiwiQ2xvdWRDb2RlUm91dGVyIiwiUHJvbWlzZVJvdXRlciIsIm1vdW50Um91dGVzIiwicm91dGUiLCJwcm9taXNlRW5mb3JjZU1hc3RlcktleUFjY2VzcyIsImdldEpvYnNEYXRhIiwiY3JlYXRlSm9iIiwiZWRpdEpvYiIsImRlbGV0ZUpvYiIsInJlcSIsInJlc3QiLCJmaW5kIiwiYXV0aCIsInRoZW4iLCJzY2hlZHVsZWRKb2JzIiwicmVzcG9uc2UiLCJyZXN1bHRzIiwiaW5fdXNlIiwibWFwIiwiam9iIiwiT2JqZWN0Iiwia2V5cyIsImJvZHkiLCJjcmVhdGUiLCJjbGllbnQiLCJpbmZvIiwiY29udGV4dCIsIm9iamVjdElkIiwicGFyYW1zIiwidXBkYXRlIiwidW5kZWZpbmVkIiwiZGVsIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL1JvdXRlcnMvQ2xvdWRDb2RlUm91dGVyLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBQcm9taXNlUm91dGVyIGZyb20gJy4uL1Byb21pc2VSb3V0ZXInO1xuaW1wb3J0IFBhcnNlIGZyb20gJ3BhcnNlL25vZGUnO1xuaW1wb3J0IHJlc3QgZnJvbSAnLi4vcmVzdCc7XG5jb25zdCB0cmlnZ2VycyA9IHJlcXVpcmUoJy4uL3RyaWdnZXJzJyk7XG5jb25zdCBtaWRkbGV3YXJlID0gcmVxdWlyZSgnLi4vbWlkZGxld2FyZXMnKTtcblxuZnVuY3Rpb24gZm9ybWF0Sm9iU2NoZWR1bGUoam9iX3NjaGVkdWxlKSB7XG4gIGlmICh0eXBlb2Ygam9iX3NjaGVkdWxlLnN0YXJ0QWZ0ZXIgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgam9iX3NjaGVkdWxlLnN0YXJ0QWZ0ZXIgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCk7XG4gIH1cbiAgcmV0dXJuIGpvYl9zY2hlZHVsZTtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVKb2JTY2hlZHVsZShjb25maWcsIGpvYl9zY2hlZHVsZSkge1xuICBjb25zdCBqb2JzID0gdHJpZ2dlcnMuZ2V0Sm9icyhjb25maWcuYXBwbGljYXRpb25JZCkgfHwge307XG4gIGlmIChqb2Jfc2NoZWR1bGUuam9iTmFtZSAmJiAham9ic1tqb2Jfc2NoZWR1bGUuam9iTmFtZV0pIHtcbiAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoXG4gICAgICBQYXJzZS5FcnJvci5JTlRFUk5BTF9TRVJWRVJfRVJST1IsXG4gICAgICAnQ2Fubm90IFNjaGVkdWxlIGEgam9iIHRoYXQgaXMgbm90IGRlcGxveWVkJ1xuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIENsb3VkQ29kZVJvdXRlciBleHRlbmRzIFByb21pc2VSb3V0ZXIge1xuICBtb3VudFJvdXRlcygpIHtcbiAgICB0aGlzLnJvdXRlKFxuICAgICAgJ0dFVCcsXG4gICAgICAnL2Nsb3VkX2NvZGUvam9icycsXG4gICAgICBtaWRkbGV3YXJlLnByb21pc2VFbmZvcmNlTWFzdGVyS2V5QWNjZXNzLFxuICAgICAgQ2xvdWRDb2RlUm91dGVyLmdldEpvYnNcbiAgICApO1xuICAgIHRoaXMucm91dGUoXG4gICAgICAnR0VUJyxcbiAgICAgICcvY2xvdWRfY29kZS9qb2JzL2RhdGEnLFxuICAgICAgbWlkZGxld2FyZS5wcm9taXNlRW5mb3JjZU1hc3RlcktleUFjY2VzcyxcbiAgICAgIENsb3VkQ29kZVJvdXRlci5nZXRKb2JzRGF0YVxuICAgICk7XG4gICAgdGhpcy5yb3V0ZShcbiAgICAgICdQT1NUJyxcbiAgICAgICcvY2xvdWRfY29kZS9qb2JzJyxcbiAgICAgIG1pZGRsZXdhcmUucHJvbWlzZUVuZm9yY2VNYXN0ZXJLZXlBY2Nlc3MsXG4gICAgICBDbG91ZENvZGVSb3V0ZXIuY3JlYXRlSm9iXG4gICAgKTtcbiAgICB0aGlzLnJvdXRlKFxuICAgICAgJ1BVVCcsXG4gICAgICAnL2Nsb3VkX2NvZGUvam9icy86b2JqZWN0SWQnLFxuICAgICAgbWlkZGxld2FyZS5wcm9taXNlRW5mb3JjZU1hc3RlcktleUFjY2VzcyxcbiAgICAgIENsb3VkQ29kZVJvdXRlci5lZGl0Sm9iXG4gICAgKTtcbiAgICB0aGlzLnJvdXRlKFxuICAgICAgJ0RFTEVURScsXG4gICAgICAnL2Nsb3VkX2NvZGUvam9icy86b2JqZWN0SWQnLFxuICAgICAgbWlkZGxld2FyZS5wcm9taXNlRW5mb3JjZU1hc3RlcktleUFjY2VzcyxcbiAgICAgIENsb3VkQ29kZVJvdXRlci5kZWxldGVKb2JcbiAgICApO1xuICB9XG5cbiAgc3RhdGljIGdldEpvYnMocmVxKSB7XG4gICAgcmV0dXJuIHJlc3QuZmluZChyZXEuY29uZmlnLCByZXEuYXV0aCwgJ19Kb2JTY2hlZHVsZScsIHt9LCB7fSkudGhlbihzY2hlZHVsZWRKb2JzID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHJlc3BvbnNlOiBzY2hlZHVsZWRKb2JzLnJlc3VsdHMsXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgc3RhdGljIGdldEpvYnNEYXRhKHJlcSkge1xuICAgIGNvbnN0IGNvbmZpZyA9IHJlcS5jb25maWc7XG4gICAgY29uc3Qgam9icyA9IHRyaWdnZXJzLmdldEpvYnMoY29uZmlnLmFwcGxpY2F0aW9uSWQpIHx8IHt9O1xuICAgIHJldHVybiByZXN0LmZpbmQocmVxLmNvbmZpZywgcmVxLmF1dGgsICdfSm9iU2NoZWR1bGUnLCB7fSwge30pLnRoZW4oc2NoZWR1bGVkSm9icyA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICByZXNwb25zZToge1xuICAgICAgICAgIGluX3VzZTogc2NoZWR1bGVkSm9icy5yZXN1bHRzLm1hcChqb2IgPT4gam9iLmpvYk5hbWUpLFxuICAgICAgICAgIGpvYnM6IE9iamVjdC5rZXlzKGpvYnMpLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVKb2IocmVxKSB7XG4gICAgY29uc3QgeyBqb2Jfc2NoZWR1bGUgfSA9IHJlcS5ib2R5O1xuICAgIHZhbGlkYXRlSm9iU2NoZWR1bGUocmVxLmNvbmZpZywgam9iX3NjaGVkdWxlKTtcbiAgICByZXR1cm4gcmVzdC5jcmVhdGUoXG4gICAgICByZXEuY29uZmlnLFxuICAgICAgcmVxLmF1dGgsXG4gICAgICAnX0pvYlNjaGVkdWxlJyxcbiAgICAgIGZvcm1hdEpvYlNjaGVkdWxlKGpvYl9zY2hlZHVsZSksXG4gICAgICByZXEuY2xpZW50LFxuICAgICAgcmVxLmluZm8uY29udGV4dFxuICAgICk7XG4gIH1cblxuICBzdGF0aWMgZWRpdEpvYihyZXEpIHtcbiAgICBjb25zdCB7IG9iamVjdElkIH0gPSByZXEucGFyYW1zO1xuICAgIGNvbnN0IHsgam9iX3NjaGVkdWxlIH0gPSByZXEuYm9keTtcbiAgICB2YWxpZGF0ZUpvYlNjaGVkdWxlKHJlcS5jb25maWcsIGpvYl9zY2hlZHVsZSk7XG4gICAgcmV0dXJuIHJlc3RcbiAgICAgIC51cGRhdGUoXG4gICAgICAgIHJlcS5jb25maWcsXG4gICAgICAgIHJlcS5hdXRoLFxuICAgICAgICAnX0pvYlNjaGVkdWxlJyxcbiAgICAgICAgeyBvYmplY3RJZCB9LFxuICAgICAgICBmb3JtYXRKb2JTY2hlZHVsZShqb2Jfc2NoZWR1bGUpLFxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgIHJlcS5pbmZvLmNvbnRleHRcbiAgICAgIClcbiAgICAgIC50aGVuKHJlc3BvbnNlID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICByZXNwb25zZSxcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICB9XG5cbiAgc3RhdGljIGRlbGV0ZUpvYihyZXEpIHtcbiAgICBjb25zdCB7IG9iamVjdElkIH0gPSByZXEucGFyYW1zO1xuICAgIHJldHVybiByZXN0XG4gICAgICAuZGVsKHJlcS5jb25maWcsIHJlcS5hdXRoLCAnX0pvYlNjaGVkdWxlJywgb2JqZWN0SWQsIHJlcS5pbmZvLmNvbnRleHQpXG4gICAgICAudGhlbihyZXNwb25zZSA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgcmVzcG9uc2UsXG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFBMkI7QUFDM0IsTUFBTUEsUUFBUSxHQUFHQyxPQUFPLENBQUMsYUFBYSxDQUFDO0FBQ3ZDLE1BQU1DLFVBQVUsR0FBR0QsT0FBTyxDQUFDLGdCQUFnQixDQUFDO0FBRTVDLFNBQVNFLGlCQUFpQixDQUFDQyxZQUFZLEVBQUU7RUFDdkMsSUFBSSxPQUFPQSxZQUFZLENBQUNDLFVBQVUsS0FBSyxXQUFXLEVBQUU7SUFDbERELFlBQVksQ0FBQ0MsVUFBVSxHQUFHLElBQUlDLElBQUksRUFBRSxDQUFDQyxXQUFXLEVBQUU7RUFDcEQ7RUFDQSxPQUFPSCxZQUFZO0FBQ3JCO0FBRUEsU0FBU0ksbUJBQW1CLENBQUNDLE1BQU0sRUFBRUwsWUFBWSxFQUFFO0VBQ2pELE1BQU1NLElBQUksR0FBR1YsUUFBUSxDQUFDVyxPQUFPLENBQUNGLE1BQU0sQ0FBQ0csYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO0VBQ3pELElBQUlSLFlBQVksQ0FBQ1MsT0FBTyxJQUFJLENBQUNILElBQUksQ0FBQ04sWUFBWSxDQUFDUyxPQUFPLENBQUMsRUFBRTtJQUN2RCxNQUFNLElBQUlDLGFBQUssQ0FBQ0MsS0FBSyxDQUNuQkQsYUFBSyxDQUFDQyxLQUFLLENBQUNDLHFCQUFxQixFQUNqQyw0Q0FBNEMsQ0FDN0M7RUFDSDtBQUNGO0FBRU8sTUFBTUMsZUFBZSxTQUFTQyxzQkFBYSxDQUFDO0VBQ2pEQyxXQUFXLEdBQUc7SUFDWixJQUFJLENBQUNDLEtBQUssQ0FDUixLQUFLLEVBQ0wsa0JBQWtCLEVBQ2xCbEIsVUFBVSxDQUFDbUIsNkJBQTZCLEVBQ3hDSixlQUFlLENBQUNOLE9BQU8sQ0FDeEI7SUFDRCxJQUFJLENBQUNTLEtBQUssQ0FDUixLQUFLLEVBQ0wsdUJBQXVCLEVBQ3ZCbEIsVUFBVSxDQUFDbUIsNkJBQTZCLEVBQ3hDSixlQUFlLENBQUNLLFdBQVcsQ0FDNUI7SUFDRCxJQUFJLENBQUNGLEtBQUssQ0FDUixNQUFNLEVBQ04sa0JBQWtCLEVBQ2xCbEIsVUFBVSxDQUFDbUIsNkJBQTZCLEVBQ3hDSixlQUFlLENBQUNNLFNBQVMsQ0FDMUI7SUFDRCxJQUFJLENBQUNILEtBQUssQ0FDUixLQUFLLEVBQ0wsNEJBQTRCLEVBQzVCbEIsVUFBVSxDQUFDbUIsNkJBQTZCLEVBQ3hDSixlQUFlLENBQUNPLE9BQU8sQ0FDeEI7SUFDRCxJQUFJLENBQUNKLEtBQUssQ0FDUixRQUFRLEVBQ1IsNEJBQTRCLEVBQzVCbEIsVUFBVSxDQUFDbUIsNkJBQTZCLEVBQ3hDSixlQUFlLENBQUNRLFNBQVMsQ0FDMUI7RUFDSDtFQUVBLE9BQU9kLE9BQU8sQ0FBQ2UsR0FBRyxFQUFFO0lBQ2xCLE9BQU9DLGFBQUksQ0FBQ0MsSUFBSSxDQUFDRixHQUFHLENBQUNqQixNQUFNLEVBQUVpQixHQUFHLENBQUNHLElBQUksRUFBRSxjQUFjLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQ0MsSUFBSSxDQUFDQyxhQUFhLElBQUk7TUFDbkYsT0FBTztRQUNMQyxRQUFRLEVBQUVELGFBQWEsQ0FBQ0U7TUFDMUIsQ0FBQztJQUNILENBQUMsQ0FBQztFQUNKO0VBRUEsT0FBT1gsV0FBVyxDQUFDSSxHQUFHLEVBQUU7SUFDdEIsTUFBTWpCLE1BQU0sR0FBR2lCLEdBQUcsQ0FBQ2pCLE1BQU07SUFDekIsTUFBTUMsSUFBSSxHQUFHVixRQUFRLENBQUNXLE9BQU8sQ0FBQ0YsTUFBTSxDQUFDRyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDekQsT0FBT2UsYUFBSSxDQUFDQyxJQUFJLENBQUNGLEdBQUcsQ0FBQ2pCLE1BQU0sRUFBRWlCLEdBQUcsQ0FBQ0csSUFBSSxFQUFFLGNBQWMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDQyxJQUFJLENBQUNDLGFBQWEsSUFBSTtNQUNuRixPQUFPO1FBQ0xDLFFBQVEsRUFBRTtVQUNSRSxNQUFNLEVBQUVILGFBQWEsQ0FBQ0UsT0FBTyxDQUFDRSxHQUFHLENBQUNDLEdBQUcsSUFBSUEsR0FBRyxDQUFDdkIsT0FBTyxDQUFDO1VBQ3JESCxJQUFJLEVBQUUyQixNQUFNLENBQUNDLElBQUksQ0FBQzVCLElBQUk7UUFDeEI7TUFDRixDQUFDO0lBQ0gsQ0FBQyxDQUFDO0VBQ0o7RUFFQSxPQUFPYSxTQUFTLENBQUNHLEdBQUcsRUFBRTtJQUNwQixNQUFNO01BQUV0QjtJQUFhLENBQUMsR0FBR3NCLEdBQUcsQ0FBQ2EsSUFBSTtJQUNqQy9CLG1CQUFtQixDQUFDa0IsR0FBRyxDQUFDakIsTUFBTSxFQUFFTCxZQUFZLENBQUM7SUFDN0MsT0FBT3VCLGFBQUksQ0FBQ2EsTUFBTSxDQUNoQmQsR0FBRyxDQUFDakIsTUFBTSxFQUNWaUIsR0FBRyxDQUFDRyxJQUFJLEVBQ1IsY0FBYyxFQUNkMUIsaUJBQWlCLENBQUNDLFlBQVksQ0FBQyxFQUMvQnNCLEdBQUcsQ0FBQ2UsTUFBTSxFQUNWZixHQUFHLENBQUNnQixJQUFJLENBQUNDLE9BQU8sQ0FDakI7RUFDSDtFQUVBLE9BQU9uQixPQUFPLENBQUNFLEdBQUcsRUFBRTtJQUNsQixNQUFNO01BQUVrQjtJQUFTLENBQUMsR0FBR2xCLEdBQUcsQ0FBQ21CLE1BQU07SUFDL0IsTUFBTTtNQUFFekM7SUFBYSxDQUFDLEdBQUdzQixHQUFHLENBQUNhLElBQUk7SUFDakMvQixtQkFBbUIsQ0FBQ2tCLEdBQUcsQ0FBQ2pCLE1BQU0sRUFBRUwsWUFBWSxDQUFDO0lBQzdDLE9BQU91QixhQUFJLENBQ1JtQixNQUFNLENBQ0xwQixHQUFHLENBQUNqQixNQUFNLEVBQ1ZpQixHQUFHLENBQUNHLElBQUksRUFDUixjQUFjLEVBQ2Q7TUFBRWU7SUFBUyxDQUFDLEVBQ1p6QyxpQkFBaUIsQ0FBQ0MsWUFBWSxDQUFDLEVBQy9CMkMsU0FBUyxFQUNUckIsR0FBRyxDQUFDZ0IsSUFBSSxDQUFDQyxPQUFPLENBQ2pCLENBQ0FiLElBQUksQ0FBQ0UsUUFBUSxJQUFJO01BQ2hCLE9BQU87UUFDTEE7TUFDRixDQUFDO0lBQ0gsQ0FBQyxDQUFDO0VBQ047RUFFQSxPQUFPUCxTQUFTLENBQUNDLEdBQUcsRUFBRTtJQUNwQixNQUFNO01BQUVrQjtJQUFTLENBQUMsR0FBR2xCLEdBQUcsQ0FBQ21CLE1BQU07SUFDL0IsT0FBT2xCLGFBQUksQ0FDUnFCLEdBQUcsQ0FBQ3RCLEdBQUcsQ0FBQ2pCLE1BQU0sRUFBRWlCLEdBQUcsQ0FBQ0csSUFBSSxFQUFFLGNBQWMsRUFBRWUsUUFBUSxFQUFFbEIsR0FBRyxDQUFDZ0IsSUFBSSxDQUFDQyxPQUFPLENBQUMsQ0FDckViLElBQUksQ0FBQ0UsUUFBUSxJQUFJO01BQ2hCLE9BQU87UUFDTEE7TUFDRixDQUFDO0lBQ0gsQ0FBQyxDQUFDO0VBQ047QUFDRjtBQUFDIn0=
@@ -4,19 +4,12 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.FeaturesRouter = void 0;
7
-
8
7
  var _package = require("../../package.json");
9
-
10
8
  var _PromiseRouter = _interopRequireDefault(require("../PromiseRouter"));
11
-
12
9
  var middleware = _interopRequireWildcard(require("../middlewares"));
13
-
14
10
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
15
-
16
11
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
17
-
18
12
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
19
-
20
13
  class FeaturesRouter extends _PromiseRouter.default {
21
14
  mountRoutes() {
22
15
  this.route('GET', '/serverInfo', middleware.promiseEnforceMasterKeyAccess, req => {
@@ -72,8 +65,6 @@ class FeaturesRouter extends _PromiseRouter.default {
72
65
  };
73
66
  });
74
67
  }
75
-
76
68
  }
77
-
78
69
  exports.FeaturesRouter = FeaturesRouter;
79
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9Sb3V0ZXJzL0ZlYXR1cmVzUm91dGVyLmpzIl0sIm5hbWVzIjpbIkZlYXR1cmVzUm91dGVyIiwiUHJvbWlzZVJvdXRlciIsIm1vdW50Um91dGVzIiwicm91dGUiLCJtaWRkbGV3YXJlIiwicHJvbWlzZUVuZm9yY2VNYXN0ZXJLZXlBY2Nlc3MiLCJyZXEiLCJjb25maWciLCJmZWF0dXJlcyIsImdsb2JhbENvbmZpZyIsImNyZWF0ZSIsInJlYWQiLCJ1cGRhdGUiLCJkZWxldGUiLCJob29rcyIsImNsb3VkQ29kZSIsImpvYnMiLCJsb2dzIiwibGV2ZWwiLCJzaXplIiwib3JkZXIiLCJ1bnRpbCIsImZyb20iLCJwdXNoIiwiaW1tZWRpYXRlUHVzaCIsImhhc1B1c2hTdXBwb3J0Iiwic2NoZWR1bGVkUHVzaCIsImhhc1B1c2hTY2hlZHVsZWRTdXBwb3J0Iiwic3RvcmVkUHVzaERhdGEiLCJwdXNoQXVkaWVuY2VzIiwibG9jYWxpemF0aW9uIiwic2NoZW1hcyIsImFkZEZpZWxkIiwicmVtb3ZlRmllbGQiLCJhZGRDbGFzcyIsInJlbW92ZUNsYXNzIiwiY2xlYXJBbGxEYXRhRnJvbUNsYXNzIiwiZXhwb3J0Q2xhc3MiLCJlZGl0Q2xhc3NMZXZlbFBlcm1pc3Npb25zIiwiZWRpdFBvaW50ZXJQZXJtaXNzaW9ucyIsInJlc3BvbnNlIiwicGFyc2VTZXJ2ZXJWZXJzaW9uIiwidmVyc2lvbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBOztBQUNBOztBQUNBOzs7Ozs7OztBQUVPLE1BQU1BLGNBQU4sU0FBNkJDLHNCQUE3QixDQUEyQztBQUNoREMsRUFBQUEsV0FBVyxHQUFHO0FBQ1osU0FBS0MsS0FBTCxDQUFXLEtBQVgsRUFBa0IsYUFBbEIsRUFBaUNDLFVBQVUsQ0FBQ0MsNkJBQTVDLEVBQTJFQyxHQUFHLElBQUk7QUFDaEYsWUFBTTtBQUFFQyxRQUFBQTtBQUFGLFVBQWFELEdBQW5CO0FBQ0EsWUFBTUUsUUFBUSxHQUFHO0FBQ2ZDLFFBQUFBLFlBQVksRUFBRTtBQUNaQyxVQUFBQSxNQUFNLEVBQUUsSUFESTtBQUVaQyxVQUFBQSxJQUFJLEVBQUUsSUFGTTtBQUdaQyxVQUFBQSxNQUFNLEVBQUUsSUFISTtBQUlaQyxVQUFBQSxNQUFNLEVBQUU7QUFKSSxTQURDO0FBT2ZDLFFBQUFBLEtBQUssRUFBRTtBQUNMSixVQUFBQSxNQUFNLEVBQUUsSUFESDtBQUVMQyxVQUFBQSxJQUFJLEVBQUUsSUFGRDtBQUdMQyxVQUFBQSxNQUFNLEVBQUUsSUFISDtBQUlMQyxVQUFBQSxNQUFNLEVBQUU7QUFKSCxTQVBRO0FBYWZFLFFBQUFBLFNBQVMsRUFBRTtBQUNUQyxVQUFBQSxJQUFJLEVBQUU7QUFERyxTQWJJO0FBZ0JmQyxRQUFBQSxJQUFJLEVBQUU7QUFDSkMsVUFBQUEsS0FBSyxFQUFFLElBREg7QUFFSkMsVUFBQUEsSUFBSSxFQUFFLElBRkY7QUFHSkMsVUFBQUEsS0FBSyxFQUFFLElBSEg7QUFJSkMsVUFBQUEsS0FBSyxFQUFFLElBSkg7QUFLSkMsVUFBQUEsSUFBSSxFQUFFO0FBTEYsU0FoQlM7QUF1QmZDLFFBQUFBLElBQUksRUFBRTtBQUNKQyxVQUFBQSxhQUFhLEVBQUVqQixNQUFNLENBQUNrQixjQURsQjtBQUVKQyxVQUFBQSxhQUFhLEVBQUVuQixNQUFNLENBQUNvQix1QkFGbEI7QUFHSkMsVUFBQUEsY0FBYyxFQUFFckIsTUFBTSxDQUFDa0IsY0FIbkI7QUFJSkksVUFBQUEsYUFBYSxFQUFFLElBSlg7QUFLSkMsVUFBQUEsWUFBWSxFQUFFO0FBTFYsU0F2QlM7QUE4QmZDLFFBQUFBLE9BQU8sRUFBRTtBQUNQQyxVQUFBQSxRQUFRLEVBQUUsSUFESDtBQUVQQyxVQUFBQSxXQUFXLEVBQUUsSUFGTjtBQUdQQyxVQUFBQSxRQUFRLEVBQUUsSUFISDtBQUlQQyxVQUFBQSxXQUFXLEVBQUUsSUFKTjtBQUtQQyxVQUFBQSxxQkFBcUIsRUFBRSxJQUxoQjtBQU1QQyxVQUFBQSxXQUFXLEVBQUUsS0FOTjtBQU9QQyxVQUFBQSx5QkFBeUIsRUFBRSxJQVBwQjtBQVFQQyxVQUFBQSxzQkFBc0IsRUFBRTtBQVJqQjtBQTlCTSxPQUFqQjtBQTBDQSxhQUFPO0FBQ0xDLFFBQUFBLFFBQVEsRUFBRTtBQUNSaEMsVUFBQUEsUUFBUSxFQUFFQSxRQURGO0FBRVJpQyxVQUFBQSxrQkFBa0IsRUFBRUM7QUFGWjtBQURMLE9BQVA7QUFNRCxLQWxERDtBQW1ERDs7QUFyRCtDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdmVyc2lvbiB9IGZyb20gJy4uLy4uL3BhY2thZ2UuanNvbic7XG5pbXBvcnQgUHJvbWlzZVJvdXRlciBmcm9tICcuLi9Qcm9taXNlUm91dGVyJztcbmltcG9ydCAqIGFzIG1pZGRsZXdhcmUgZnJvbSAnLi4vbWlkZGxld2FyZXMnO1xuXG5leHBvcnQgY2xhc3MgRmVhdHVyZXNSb3V0ZXIgZXh0ZW5kcyBQcm9taXNlUm91dGVyIHtcbiAgbW91bnRSb3V0ZXMoKSB7XG4gICAgdGhpcy5yb3V0ZSgnR0VUJywgJy9zZXJ2ZXJJbmZvJywgbWlkZGxld2FyZS5wcm9taXNlRW5mb3JjZU1hc3RlcktleUFjY2VzcywgcmVxID0+IHtcbiAgICAgIGNvbnN0IHsgY29uZmlnIH0gPSByZXE7XG4gICAgICBjb25zdCBmZWF0dXJlcyA9IHtcbiAgICAgICAgZ2xvYmFsQ29uZmlnOiB7XG4gICAgICAgICAgY3JlYXRlOiB0cnVlLFxuICAgICAgICAgIHJlYWQ6IHRydWUsXG4gICAgICAgICAgdXBkYXRlOiB0cnVlLFxuICAgICAgICAgIGRlbGV0ZTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgICAgaG9va3M6IHtcbiAgICAgICAgICBjcmVhdGU6IHRydWUsXG4gICAgICAgICAgcmVhZDogdHJ1ZSxcbiAgICAgICAgICB1cGRhdGU6IHRydWUsXG4gICAgICAgICAgZGVsZXRlOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgICBjbG91ZENvZGU6IHtcbiAgICAgICAgICBqb2JzOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgICBsb2dzOiB7XG4gICAgICAgICAgbGV2ZWw6IHRydWUsXG4gICAgICAgICAgc2l6ZTogdHJ1ZSxcbiAgICAgICAgICBvcmRlcjogdHJ1ZSxcbiAgICAgICAgICB1bnRpbDogdHJ1ZSxcbiAgICAgICAgICBmcm9tOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgICBwdXNoOiB7XG4gICAgICAgICAgaW1tZWRpYXRlUHVzaDogY29uZmlnLmhhc1B1c2hTdXBwb3J0LFxuICAgICAgICAgIHNjaGVkdWxlZFB1c2g6IGNvbmZpZy5oYXNQdXNoU2NoZWR1bGVkU3VwcG9ydCxcbiAgICAgICAgICBzdG9yZWRQdXNoRGF0YTogY29uZmlnLmhhc1B1c2hTdXBwb3J0LFxuICAgICAgICAgIHB1c2hBdWRpZW5jZXM6IHRydWUsXG4gICAgICAgICAgbG9jYWxpemF0aW9uOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgICBzY2hlbWFzOiB7XG4gICAgICAgICAgYWRkRmllbGQ6IHRydWUsXG4gICAgICAgICAgcmVtb3ZlRmllbGQ6IHRydWUsXG4gICAgICAgICAgYWRkQ2xhc3M6IHRydWUsXG4gICAgICAgICAgcmVtb3ZlQ2xhc3M6IHRydWUsXG4gICAgICAgICAgY2xlYXJBbGxEYXRhRnJvbUNsYXNzOiB0cnVlLFxuICAgICAgICAgIGV4cG9ydENsYXNzOiBmYWxzZSxcbiAgICAgICAgICBlZGl0Q2xhc3NMZXZlbFBlcm1pc3Npb25zOiB0cnVlLFxuICAgICAgICAgIGVkaXRQb2ludGVyUGVybWlzc2lvbnM6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICB9O1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICByZXNwb25zZToge1xuICAgICAgICAgIGZlYXR1cmVzOiBmZWF0dXJlcyxcbiAgICAgICAgICBwYXJzZVNlcnZlclZlcnNpb246IHZlcnNpb24sXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG59XG4iXX0=
70
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJGZWF0dXJlc1JvdXRlciIsIlByb21pc2VSb3V0ZXIiLCJtb3VudFJvdXRlcyIsInJvdXRlIiwibWlkZGxld2FyZSIsInByb21pc2VFbmZvcmNlTWFzdGVyS2V5QWNjZXNzIiwicmVxIiwiY29uZmlnIiwiZmVhdHVyZXMiLCJnbG9iYWxDb25maWciLCJjcmVhdGUiLCJyZWFkIiwidXBkYXRlIiwiZGVsZXRlIiwiaG9va3MiLCJjbG91ZENvZGUiLCJqb2JzIiwibG9ncyIsImxldmVsIiwic2l6ZSIsIm9yZGVyIiwidW50aWwiLCJmcm9tIiwicHVzaCIsImltbWVkaWF0ZVB1c2giLCJoYXNQdXNoU3VwcG9ydCIsInNjaGVkdWxlZFB1c2giLCJoYXNQdXNoU2NoZWR1bGVkU3VwcG9ydCIsInN0b3JlZFB1c2hEYXRhIiwicHVzaEF1ZGllbmNlcyIsImxvY2FsaXphdGlvbiIsInNjaGVtYXMiLCJhZGRGaWVsZCIsInJlbW92ZUZpZWxkIiwiYWRkQ2xhc3MiLCJyZW1vdmVDbGFzcyIsImNsZWFyQWxsRGF0YUZyb21DbGFzcyIsImV4cG9ydENsYXNzIiwiZWRpdENsYXNzTGV2ZWxQZXJtaXNzaW9ucyIsImVkaXRQb2ludGVyUGVybWlzc2lvbnMiLCJyZXNwb25zZSIsInBhcnNlU2VydmVyVmVyc2lvbiIsInZlcnNpb24iXSwic291cmNlcyI6WyIuLi8uLi9zcmMvUm91dGVycy9GZWF0dXJlc1JvdXRlci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB2ZXJzaW9uIH0gZnJvbSAnLi4vLi4vcGFja2FnZS5qc29uJztcbmltcG9ydCBQcm9taXNlUm91dGVyIGZyb20gJy4uL1Byb21pc2VSb3V0ZXInO1xuaW1wb3J0ICogYXMgbWlkZGxld2FyZSBmcm9tICcuLi9taWRkbGV3YXJlcyc7XG5cbmV4cG9ydCBjbGFzcyBGZWF0dXJlc1JvdXRlciBleHRlbmRzIFByb21pc2VSb3V0ZXIge1xuICBtb3VudFJvdXRlcygpIHtcbiAgICB0aGlzLnJvdXRlKCdHRVQnLCAnL3NlcnZlckluZm8nLCBtaWRkbGV3YXJlLnByb21pc2VFbmZvcmNlTWFzdGVyS2V5QWNjZXNzLCByZXEgPT4ge1xuICAgICAgY29uc3QgeyBjb25maWcgfSA9IHJlcTtcbiAgICAgIGNvbnN0IGZlYXR1cmVzID0ge1xuICAgICAgICBnbG9iYWxDb25maWc6IHtcbiAgICAgICAgICBjcmVhdGU6IHRydWUsXG4gICAgICAgICAgcmVhZDogdHJ1ZSxcbiAgICAgICAgICB1cGRhdGU6IHRydWUsXG4gICAgICAgICAgZGVsZXRlOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgICBob29rczoge1xuICAgICAgICAgIGNyZWF0ZTogdHJ1ZSxcbiAgICAgICAgICByZWFkOiB0cnVlLFxuICAgICAgICAgIHVwZGF0ZTogdHJ1ZSxcbiAgICAgICAgICBkZWxldGU6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICAgIGNsb3VkQ29kZToge1xuICAgICAgICAgIGpvYnM6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICAgIGxvZ3M6IHtcbiAgICAgICAgICBsZXZlbDogdHJ1ZSxcbiAgICAgICAgICBzaXplOiB0cnVlLFxuICAgICAgICAgIG9yZGVyOiB0cnVlLFxuICAgICAgICAgIHVudGlsOiB0cnVlLFxuICAgICAgICAgIGZyb206IHRydWUsXG4gICAgICAgIH0sXG4gICAgICAgIHB1c2g6IHtcbiAgICAgICAgICBpbW1lZGlhdGVQdXNoOiBjb25maWcuaGFzUHVzaFN1cHBvcnQsXG4gICAgICAgICAgc2NoZWR1bGVkUHVzaDogY29uZmlnLmhhc1B1c2hTY2hlZHVsZWRTdXBwb3J0LFxuICAgICAgICAgIHN0b3JlZFB1c2hEYXRhOiBjb25maWcuaGFzUHVzaFN1cHBvcnQsXG4gICAgICAgICAgcHVzaEF1ZGllbmNlczogdHJ1ZSxcbiAgICAgICAgICBsb2NhbGl6YXRpb246IHRydWUsXG4gICAgICAgIH0sXG4gICAgICAgIHNjaGVtYXM6IHtcbiAgICAgICAgICBhZGRGaWVsZDogdHJ1ZSxcbiAgICAgICAgICByZW1vdmVGaWVsZDogdHJ1ZSxcbiAgICAgICAgICBhZGRDbGFzczogdHJ1ZSxcbiAgICAgICAgICByZW1vdmVDbGFzczogdHJ1ZSxcbiAgICAgICAgICBjbGVhckFsbERhdGFGcm9tQ2xhc3M6IHRydWUsXG4gICAgICAgICAgZXhwb3J0Q2xhc3M6IGZhbHNlLFxuICAgICAgICAgIGVkaXRDbGFzc0xldmVsUGVybWlzc2lvbnM6IHRydWUsXG4gICAgICAgICAgZWRpdFBvaW50ZXJQZXJtaXNzaW9uczogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHJlc3BvbnNlOiB7XG4gICAgICAgICAgZmVhdHVyZXM6IGZlYXR1cmVzLFxuICAgICAgICAgIHBhcnNlU2VydmVyVmVyc2lvbjogdmVyc2lvbixcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQTZDO0FBQUE7QUFBQTtBQUV0QyxNQUFNQSxjQUFjLFNBQVNDLHNCQUFhLENBQUM7RUFDaERDLFdBQVcsR0FBRztJQUNaLElBQUksQ0FBQ0MsS0FBSyxDQUFDLEtBQUssRUFBRSxhQUFhLEVBQUVDLFVBQVUsQ0FBQ0MsNkJBQTZCLEVBQUVDLEdBQUcsSUFBSTtNQUNoRixNQUFNO1FBQUVDO01BQU8sQ0FBQyxHQUFHRCxHQUFHO01BQ3RCLE1BQU1FLFFBQVEsR0FBRztRQUNmQyxZQUFZLEVBQUU7VUFDWkMsTUFBTSxFQUFFLElBQUk7VUFDWkMsSUFBSSxFQUFFLElBQUk7VUFDVkMsTUFBTSxFQUFFLElBQUk7VUFDWkMsTUFBTSxFQUFFO1FBQ1YsQ0FBQztRQUNEQyxLQUFLLEVBQUU7VUFDTEosTUFBTSxFQUFFLElBQUk7VUFDWkMsSUFBSSxFQUFFLElBQUk7VUFDVkMsTUFBTSxFQUFFLElBQUk7VUFDWkMsTUFBTSxFQUFFO1FBQ1YsQ0FBQztRQUNERSxTQUFTLEVBQUU7VUFDVEMsSUFBSSxFQUFFO1FBQ1IsQ0FBQztRQUNEQyxJQUFJLEVBQUU7VUFDSkMsS0FBSyxFQUFFLElBQUk7VUFDWEMsSUFBSSxFQUFFLElBQUk7VUFDVkMsS0FBSyxFQUFFLElBQUk7VUFDWEMsS0FBSyxFQUFFLElBQUk7VUFDWEMsSUFBSSxFQUFFO1FBQ1IsQ0FBQztRQUNEQyxJQUFJLEVBQUU7VUFDSkMsYUFBYSxFQUFFakIsTUFBTSxDQUFDa0IsY0FBYztVQUNwQ0MsYUFBYSxFQUFFbkIsTUFBTSxDQUFDb0IsdUJBQXVCO1VBQzdDQyxjQUFjLEVBQUVyQixNQUFNLENBQUNrQixjQUFjO1VBQ3JDSSxhQUFhLEVBQUUsSUFBSTtVQUNuQkMsWUFBWSxFQUFFO1FBQ2hCLENBQUM7UUFDREMsT0FBTyxFQUFFO1VBQ1BDLFFBQVEsRUFBRSxJQUFJO1VBQ2RDLFdBQVcsRUFBRSxJQUFJO1VBQ2pCQyxRQUFRLEVBQUUsSUFBSTtVQUNkQyxXQUFXLEVBQUUsSUFBSTtVQUNqQkMscUJBQXFCLEVBQUUsSUFBSTtVQUMzQkMsV0FBVyxFQUFFLEtBQUs7VUFDbEJDLHlCQUF5QixFQUFFLElBQUk7VUFDL0JDLHNCQUFzQixFQUFFO1FBQzFCO01BQ0YsQ0FBQztNQUVELE9BQU87UUFDTEMsUUFBUSxFQUFFO1VBQ1JoQyxRQUFRLEVBQUVBLFFBQVE7VUFDbEJpQyxrQkFBa0IsRUFBRUM7UUFDdEI7TUFDRixDQUFDO0lBQ0gsQ0FBQyxDQUFDO0VBQ0o7QUFDRjtBQUFDIn0=
@@ -4,33 +4,19 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.FilesRouter = void 0;
7
-
8
7
  var _express = _interopRequireDefault(require("express"));
9
-
10
8
  var _bodyParser = _interopRequireDefault(require("body-parser"));
11
-
12
9
  var Middlewares = _interopRequireWildcard(require("../middlewares"));
13
-
14
10
  var _node = _interopRequireDefault(require("parse/node"));
15
-
16
11
  var _Config = _interopRequireDefault(require("../Config"));
17
-
18
12
  var _mime = _interopRequireDefault(require("mime"));
19
-
20
13
  var _logger = _interopRequireDefault(require("../logger"));
21
-
22
14
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
23
-
24
15
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
25
-
26
16
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
27
-
28
17
  const triggers = require('../triggers');
29
-
30
18
  const http = require('http');
31
-
32
19
  const Utils = require('../Utils');
33
-
34
20
  const downloadFileFromURI = uri => {
35
21
  return new Promise((res, rej) => {
36
22
  http.get(uri, response => {
@@ -43,7 +29,6 @@ const downloadFileFromURI = uri => {
43
29
  });
44
30
  });
45
31
  };
46
-
47
32
  const addFileDataIfNeeded = async file => {
48
33
  if (file._source.format === 'uri') {
49
34
  const base64 = await downloadFileFromURI(file._source.uri);
@@ -51,16 +36,13 @@ const addFileDataIfNeeded = async file => {
51
36
  file._data = base64;
52
37
  file._requestTask = null;
53
38
  }
54
-
55
39
  return file;
56
40
  };
57
-
58
41
  class FilesRouter {
59
42
  expressRouter({
60
43
  maxUploadSize = '20Mb'
61
44
  } = {}) {
62
45
  var router = _express.default.Router();
63
-
64
46
  router.get('/files/:appId/:filename', this.getHandler);
65
47
  router.get('/files/:appId/metadata/:filename', this.metadataHandler);
66
48
  router.post('/files', function (req, res, next) {
@@ -71,15 +53,14 @@ class FilesRouter {
71
53
  return true;
72
54
  },
73
55
  limit: maxUploadSize
74
- }), // Allow uploads without Content-Type, or with any Content-Type.
75
- Middlewares.handleParseHeaders, this.createHandler);
76
- router.delete('/files/:filename', Middlewares.handleParseHeaders, Middlewares.enforceMasterKeyAccess, this.deleteHandler);
56
+ }),
57
+ // Allow uploads without Content-Type, or with any Content-Type.
58
+ Middlewares.handleParseHeaders, Middlewares.handleParseSession, this.createHandler);
59
+ router.delete('/files/:filename', Middlewares.handleParseHeaders, Middlewares.handleParseSession, Middlewares.enforceMasterKeyAccess, this.deleteHandler);
77
60
  return router;
78
61
  }
79
-
80
62
  getHandler(req, res) {
81
63
  const config = _Config.default.get(req.params.appId);
82
-
83
64
  if (!config) {
84
65
  res.status(403);
85
66
  const err = new _node.default.Error(_node.default.Error.OPERATION_FORBIDDEN, 'Invalid application ID.');
@@ -89,12 +70,9 @@ class FilesRouter {
89
70
  });
90
71
  return;
91
72
  }
92
-
93
73
  const filesController = config.filesController;
94
74
  const filename = req.params.filename;
95
-
96
75
  const contentType = _mime.default.getType(filename);
97
-
98
76
  if (isFileStreamable(req, filesController)) {
99
77
  filesController.handleFileStream(config, filename, req, res, contentType).catch(() => {
100
78
  res.status(404);
@@ -114,47 +92,37 @@ class FilesRouter {
114
92
  });
115
93
  }
116
94
  }
117
-
118
95
  async createHandler(req, res, next) {
119
96
  const config = req.config;
120
97
  const user = req.auth.user;
121
98
  const isMaster = req.auth.isMaster;
122
-
123
99
  const isLinked = user && _node.default.AnonymousUtils.isLinked(user);
124
-
125
100
  if (!isMaster && !config.fileUpload.enableForAnonymousUser && isLinked) {
126
101
  next(new _node.default.Error(_node.default.Error.FILE_SAVE_ERROR, 'File upload by anonymous user is disabled.'));
127
102
  return;
128
103
  }
129
-
130
104
  if (!isMaster && !config.fileUpload.enableForAuthenticatedUser && !isLinked && user) {
131
105
  next(new _node.default.Error(_node.default.Error.FILE_SAVE_ERROR, 'File upload by authenticated user is disabled.'));
132
106
  return;
133
107
  }
134
-
135
108
  if (!isMaster && !config.fileUpload.enableForPublic && !user) {
136
109
  next(new _node.default.Error(_node.default.Error.FILE_SAVE_ERROR, 'File upload by public is disabled.'));
137
110
  return;
138
111
  }
139
-
140
112
  const filesController = config.filesController;
141
113
  const {
142
114
  filename
143
115
  } = req.params;
144
116
  const contentType = req.get('Content-type');
145
-
146
117
  if (!req.body || !req.body.length) {
147
118
  next(new _node.default.Error(_node.default.Error.FILE_SAVE_ERROR, 'Invalid file upload.'));
148
119
  return;
149
120
  }
150
-
151
121
  const error = filesController.validateFilename(filename);
152
-
153
122
  if (error) {
154
123
  next(error);
155
124
  return;
156
125
  }
157
-
158
126
  const base64 = req.body.toString('base64');
159
127
  const file = new _node.default.File(filename, {
160
128
  base64
@@ -163,19 +131,16 @@ class FilesRouter {
163
131
  metadata = {},
164
132
  tags = {}
165
133
  } = req.fileData || {};
166
-
167
134
  if (req.config && req.config.requestKeywordDenylist) {
168
135
  // Scan request data for denied keywords
169
136
  for (const keyword of req.config.requestKeywordDenylist) {
170
137
  const match = Utils.objectContainsKeyValue(metadata, keyword.key, keyword.value) || Utils.objectContainsKeyValue(tags, keyword.key, keyword.value);
171
-
172
138
  if (match) {
173
139
  next(new _node.default.Error(_node.default.Error.INVALID_KEY_NAME, `Prohibited keyword in request data: ${JSON.stringify(keyword)}.`));
174
140
  return;
175
141
  }
176
142
  }
177
143
  }
178
-
179
144
  file.setTags(tags);
180
145
  file.setMetadata(metadata);
181
146
  const fileSize = Buffer.byteLength(req.body);
@@ -183,15 +148,13 @@ class FilesRouter {
183
148
  file,
184
149
  fileSize
185
150
  };
186
-
187
151
  try {
188
152
  // run beforeSaveFile trigger
189
153
  const triggerResult = await triggers.maybeRunFileTrigger(triggers.Types.beforeSave, fileObject, config, req.auth);
190
- let saveResult; // if a new ParseFile is returned check if it's an already saved file
191
-
154
+ let saveResult;
155
+ // if a new ParseFile is returned check if it's an already saved file
192
156
  if (triggerResult instanceof _node.default.File) {
193
157
  fileObject.file = triggerResult;
194
-
195
158
  if (triggerResult.url()) {
196
159
  // set fileSize to null because we wont know how big it is here
197
160
  fileObject.fileSize = null;
@@ -200,28 +163,27 @@ class FilesRouter {
200
163
  name: triggerResult._name
201
164
  };
202
165
  }
203
- } // if the file returned by the trigger has already been saved skip saving anything
204
-
205
-
166
+ }
167
+ // if the file returned by the trigger has already been saved skip saving anything
206
168
  if (!saveResult) {
207
169
  // if the ParseFile returned is type uri, download the file before saving it
208
- await addFileDataIfNeeded(fileObject.file); // update fileSize
209
-
170
+ await addFileDataIfNeeded(fileObject.file);
171
+ // update fileSize
210
172
  const bufferData = Buffer.from(fileObject.file._data, 'base64');
211
- fileObject.fileSize = Buffer.byteLength(bufferData); // prepare file options
212
-
173
+ fileObject.fileSize = Buffer.byteLength(bufferData);
174
+ // prepare file options
213
175
  const fileOptions = {
214
176
  metadata: fileObject.file._metadata
215
- }; // some s3-compatible providers (DigitalOcean, Linode) do not accept tags
177
+ };
178
+ // some s3-compatible providers (DigitalOcean, Linode) do not accept tags
216
179
  // so we do not include the tags option if it is empty.
217
-
218
180
  const fileTags = Object.keys(fileObject.file._tags).length > 0 ? {
219
181
  tags: fileObject.file._tags
220
182
  } : {};
221
- Object.assign(fileOptions, fileTags); // save file
222
-
223
- const createFileResult = await filesController.createFile(config, fileObject.file._name, bufferData, fileObject.file._source.type, fileOptions); // update file with new data
224
-
183
+ Object.assign(fileOptions, fileTags);
184
+ // save file
185
+ const createFileResult = await filesController.createFile(config, fileObject.file._name, bufferData, fileObject.file._source.type, fileOptions);
186
+ // update file with new data
225
187
  fileObject.file._name = createFileResult.name;
226
188
  fileObject.file._url = createFileResult.url;
227
189
  fileObject.file._requestTask = null;
@@ -230,16 +192,14 @@ class FilesRouter {
230
192
  url: createFileResult.url,
231
193
  name: createFileResult.name
232
194
  };
233
- } // run afterSaveFile trigger
234
-
235
-
195
+ }
196
+ // run afterSaveFile trigger
236
197
  await triggers.maybeRunFileTrigger(triggers.Types.afterSave, fileObject, config, req.auth);
237
198
  res.status(201);
238
199
  res.set('Location', saveResult.url);
239
200
  res.json(saveResult);
240
201
  } catch (e) {
241
202
  _logger.default.error('Error creating a file: ', e);
242
-
243
203
  const error = triggers.resolveError(e, {
244
204
  code: _node.default.Error.FILE_SAVE_ERROR,
245
205
  message: `Could not store file: ${fileObject.file._name}.`
@@ -247,7 +207,6 @@ class FilesRouter {
247
207
  next(error);
248
208
  }
249
209
  }
250
-
251
210
  async deleteHandler(req, res, next) {
252
211
  try {
253
212
  const {
@@ -255,25 +214,24 @@ class FilesRouter {
255
214
  } = req.config;
256
215
  const {
257
216
  filename
258
- } = req.params; // run beforeDeleteFile trigger
259
-
217
+ } = req.params;
218
+ // run beforeDeleteFile trigger
260
219
  const file = new _node.default.File(filename);
261
220
  file._url = filesController.adapter.getFileLocation(req.config, filename);
262
221
  const fileObject = {
263
222
  file,
264
223
  fileSize: null
265
224
  };
266
- await triggers.maybeRunFileTrigger(triggers.Types.beforeDelete, fileObject, req.config, req.auth); // delete file
267
-
268
- await filesController.deleteFile(req.config, filename); // run afterDeleteFile trigger
269
-
225
+ await triggers.maybeRunFileTrigger(triggers.Types.beforeDelete, fileObject, req.config, req.auth);
226
+ // delete file
227
+ await filesController.deleteFile(req.config, filename);
228
+ // run afterDeleteFile trigger
270
229
  await triggers.maybeRunFileTrigger(triggers.Types.afterDelete, fileObject, req.config, req.auth);
271
- res.status(200); // TODO: return useful JSON here?
272
-
230
+ res.status(200);
231
+ // TODO: return useful JSON here?
273
232
  res.end();
274
233
  } catch (e) {
275
234
  _logger.default.error('Error deleting a file: ', e);
276
-
277
235
  const error = triggers.resolveError(e, {
278
236
  code: _node.default.Error.FILE_DELETE_ERROR,
279
237
  message: 'Could not delete file.'
@@ -281,11 +239,9 @@ class FilesRouter {
281
239
  next(error);
282
240
  }
283
241
  }
284
-
285
242
  async metadataHandler(req, res) {
286
243
  try {
287
244
  const config = _Config.default.get(req.params.appId);
288
-
289
245
  const {
290
246
  filesController
291
247
  } = config;
@@ -300,15 +256,12 @@ class FilesRouter {
300
256
  res.json({});
301
257
  }
302
258
  }
303
-
304
259
  }
305
-
306
260
  exports.FilesRouter = FilesRouter;
307
-
308
261
  function isFileStreamable(req, filesController) {
309
262
  const range = (req.get('Range') || '/-/').split('-');
310
263
  const start = Number(range[0]);
311
264
  const end = Number(range[1]);
312
265
  return (!isNaN(start) || !isNaN(end)) && typeof filesController.adapter.handleFileStream === 'function';
313
266
  }
314
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9Sb3V0ZXJzL0ZpbGVzUm91dGVyLmpzIl0sIm5hbWVzIjpbInRyaWdnZXJzIiwicmVxdWlyZSIsImh0dHAiLCJVdGlscyIsImRvd25sb2FkRmlsZUZyb21VUkkiLCJ1cmkiLCJQcm9taXNlIiwicmVzIiwicmVqIiwiZ2V0IiwicmVzcG9uc2UiLCJzZXREZWZhdWx0RW5jb2RpbmciLCJib2R5IiwiaGVhZGVycyIsIm9uIiwiZGF0YSIsImUiLCJtZXNzYWdlIiwiYWRkRmlsZURhdGFJZk5lZWRlZCIsImZpbGUiLCJfc291cmNlIiwiZm9ybWF0IiwiYmFzZTY0IiwiX3ByZXZpb3VzU2F2ZSIsIl9kYXRhIiwiX3JlcXVlc3RUYXNrIiwiRmlsZXNSb3V0ZXIiLCJleHByZXNzUm91dGVyIiwibWF4VXBsb2FkU2l6ZSIsInJvdXRlciIsImV4cHJlc3MiLCJSb3V0ZXIiLCJnZXRIYW5kbGVyIiwibWV0YWRhdGFIYW5kbGVyIiwicG9zdCIsInJlcSIsIm5leHQiLCJQYXJzZSIsIkVycm9yIiwiSU5WQUxJRF9GSUxFX05BTUUiLCJCb2R5UGFyc2VyIiwicmF3IiwidHlwZSIsImxpbWl0IiwiTWlkZGxld2FyZXMiLCJoYW5kbGVQYXJzZUhlYWRlcnMiLCJjcmVhdGVIYW5kbGVyIiwiZGVsZXRlIiwiZW5mb3JjZU1hc3RlcktleUFjY2VzcyIsImRlbGV0ZUhhbmRsZXIiLCJjb25maWciLCJDb25maWciLCJwYXJhbXMiLCJhcHBJZCIsInN0YXR1cyIsImVyciIsIk9QRVJBVElPTl9GT1JCSURERU4iLCJqc29uIiwiY29kZSIsImVycm9yIiwiZmlsZXNDb250cm9sbGVyIiwiZmlsZW5hbWUiLCJjb250ZW50VHlwZSIsIm1pbWUiLCJnZXRUeXBlIiwiaXNGaWxlU3RyZWFtYWJsZSIsImhhbmRsZUZpbGVTdHJlYW0iLCJjYXRjaCIsInNldCIsImVuZCIsImdldEZpbGVEYXRhIiwidGhlbiIsImxlbmd0aCIsInVzZXIiLCJhdXRoIiwiaXNNYXN0ZXIiLCJpc0xpbmtlZCIsIkFub255bW91c1V0aWxzIiwiZmlsZVVwbG9hZCIsImVuYWJsZUZvckFub255bW91c1VzZXIiLCJGSUxFX1NBVkVfRVJST1IiLCJlbmFibGVGb3JBdXRoZW50aWNhdGVkVXNlciIsImVuYWJsZUZvclB1YmxpYyIsInZhbGlkYXRlRmlsZW5hbWUiLCJ0b1N0cmluZyIsIkZpbGUiLCJtZXRhZGF0YSIsInRhZ3MiLCJmaWxlRGF0YSIsInJlcXVlc3RLZXl3b3JkRGVueWxpc3QiLCJrZXl3b3JkIiwibWF0Y2giLCJvYmplY3RDb250YWluc0tleVZhbHVlIiwia2V5IiwidmFsdWUiLCJJTlZBTElEX0tFWV9OQU1FIiwiSlNPTiIsInN0cmluZ2lmeSIsInNldFRhZ3MiLCJzZXRNZXRhZGF0YSIsImZpbGVTaXplIiwiQnVmZmVyIiwiYnl0ZUxlbmd0aCIsImZpbGVPYmplY3QiLCJ0cmlnZ2VyUmVzdWx0IiwibWF5YmVSdW5GaWxlVHJpZ2dlciIsIlR5cGVzIiwiYmVmb3JlU2F2ZSIsInNhdmVSZXN1bHQiLCJ1cmwiLCJuYW1lIiwiX25hbWUiLCJidWZmZXJEYXRhIiwiZnJvbSIsImZpbGVPcHRpb25zIiwiX21ldGFkYXRhIiwiZmlsZVRhZ3MiLCJPYmplY3QiLCJrZXlzIiwiX3RhZ3MiLCJhc3NpZ24iLCJjcmVhdGVGaWxlUmVzdWx0IiwiY3JlYXRlRmlsZSIsIl91cmwiLCJyZXNvbHZlIiwiYWZ0ZXJTYXZlIiwibG9nZ2VyIiwicmVzb2x2ZUVycm9yIiwiYWRhcHRlciIsImdldEZpbGVMb2NhdGlvbiIsImJlZm9yZURlbGV0ZSIsImRlbGV0ZUZpbGUiLCJhZnRlckRlbGV0ZSIsIkZJTEVfREVMRVRFX0VSUk9SIiwiZ2V0TWV0YWRhdGEiLCJyYW5nZSIsInNwbGl0Iiwic3RhcnQiLCJOdW1iZXIiLCJpc05hTiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOzs7Ozs7OztBQUNBLE1BQU1BLFFBQVEsR0FBR0MsT0FBTyxDQUFDLGFBQUQs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QUFKLENBQVdDLEtBQXRCLENBQWY7O0FBQ0EsWUFBTTtBQUFFTyxRQUFBQTtBQUFGLFVBQXNCVixNQUE1QjtBQUNBLFlBQU07QUFBRVcsUUFBQUE7QUFBRixVQUFlMUIsR0FBRyxDQUFDaUIsTUFBekI7QUFDQSxZQUFNckMsSUFBSSxHQUFHLE1BQU02QyxlQUFlLENBQUMwRSxXQUFoQixDQUE0QnpFLFFBQTVCLENBQW5CO0FBQ0F0RCxNQUFBQSxHQUFHLENBQUMrQyxNQUFKLENBQVcsR0FBWDtBQUNBL0MsTUFBQUEsR0FBRyxDQUFDa0QsSUFBSixDQUFTMUMsSUFBVDtBQUNELEtBUEQsQ0FPRSxPQUFPQyxDQUFQLEVBQVU7QUFDVlQsTUFBQUEsR0FBRyxDQUFDK0MsTUFBSixDQUFXLEdBQVg7QUFDQS9DLE1BQUFBLEdBQUcsQ0FBQ2tELElBQUosQ0FBUyxFQUFUO0FBQ0Q7QUFDRjs7QUF0UHNCOzs7O0FBeVB6QixTQUFTUSxnQkFBVCxDQUEwQjlCLEdBQTFCLEVBQStCeUIsZUFBL0IsRUFBZ0Q7QUFDOUMsUUFBTTJFLEtBQUssR0FBRyxDQUFDcEcsR0FBRyxDQUFDMUIsR0FBSixDQUFRLE9BQVIsS0FBb0IsS0FBckIsRUFBNEIrSCxLQUE1QixDQUFrQyxHQUFsQyxDQUFkO0FBQ0EsUUFBTUMsS0FBSyxHQUFHQyxNQUFNLENBQUNILEtBQUssQ0FBQyxDQUFELENBQU4sQ0FBcEI7QUFDQSxRQUFNbEUsR0FBRyxHQUFHcUUsTUFBTSxDQUFDSCxLQUFLLENBQUMsQ0FBRCxDQUFOLENBQWxCO0FBQ0EsU0FDRSxDQUFDLENBQUNJLEtBQUssQ0FBQ0YsS0FBRCxDQUFOLElBQWlCLENBQUNFLEtBQUssQ0FBQ3RFLEdBQUQsQ0FBeEIsS0FBa0MsT0FBT1QsZUFBZSxDQUFDb0UsT0FBaEIsQ0FBd0I5RCxnQkFBL0IsS0FBb0QsVUFEeEY7QUFHRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBleHByZXNzIGZyb20gJ2V4cHJlc3MnO1xuaW1wb3J0IEJvZHlQYXJzZXIgZnJvbSAnYm9keS1wYXJzZXInO1xuaW1wb3J0ICogYXMgTWlkZGxld2FyZXMgZnJvbSAnLi4vbWlkZGxld2FyZXMnO1xuaW1wb3J0IFBhcnNlIGZyb20gJ3BhcnNlL25vZGUnO1xuaW1wb3J0IENvbmZpZyBmcm9tICcuLi9Db25maWcnO1xuaW1wb3J0IG1pbWUgZnJvbSAnbWltZSc7XG5pbXBvcnQgbG9nZ2VyIGZyb20gJy4uL2xvZ2dlcic7XG5jb25zdCB0cmlnZ2VycyA9IHJlcXVpcmUoJy4uL3RyaWdnZXJzJyk7XG5jb25zdCBodHRwID0gcmVxdWlyZSgnaHR0cCcpO1xuY29uc3QgVXRpbHMgPSByZXF1aXJlKCcuLi9VdGlscycpO1xuXG5jb25zdCBkb3dubG9hZEZpbGVGcm9tVVJJID0gdXJpID0+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXMsIHJlaikgPT4ge1xuICAgIGh0dHBcbiAgICAgIC5nZXQodXJpLCByZXNwb25zZSA9PiB7XG4gICAgICAgIHJlc3BvbnNlLnNldERlZmF1bHRFbmNvZGluZygnYmFzZTY0Jyk7XG4gICAgICAgIGxldCBib2R5ID0gYGRhdGE6JHtyZXNwb25zZS5oZWFkZXJzWydjb250ZW50LXR5cGUnXX07YmFzZTY0LGA7XG4gICAgICAgIHJlc3BvbnNlLm9uKCdkYXRhJywgZGF0YSA9PiAoYm9keSArPSBkYXRhKSk7XG4gICAgICAgIHJlc3BvbnNlLm9uKCdlbmQnLCAoKSA9PiByZXMoYm9keSkpO1xuICAgICAgfSlcbiAgICAgIC5vbignZXJyb3InLCBlID0+IHtcbiAgICAgICAgcmVqKGBFcnJvciBkb3dubG9hZGluZyBmaWxlIGZyb20gJHt1cml9OiAke2UubWVzc2FnZX1gKTtcbiAgICAgIH0pO1xuICB9KTtcbn07XG5cbmNvbnN0IGFkZEZpbGVEYXRhSWZOZWVkZWQgPSBhc3luYyBmaWxlID0+IHtcbiAgaWYgKGZpbGUuX3NvdXJjZS5mb3JtYXQgPT09ICd1cmknKSB7XG4gICAgY29uc3QgYmFzZTY0ID0gYXdhaXQgZG93bmxvYWRGaWxlRnJvbVVSSShmaWxlLl9zb3VyY2UudXJpKTtcbiAgICBmaWxlLl9wcmV2aW91c1NhdmUgPSBmaWxlO1xuICAgIGZpbGUuX2RhdGEgPSBiYXNlNjQ7XG4gICAgZmlsZS5fcmVxdWVzdFRhc2sgPSBudWxsO1xuICB9XG4gIHJldHVybiBmaWxlO1xufTtcblxuZXhwb3J0IGNsYXNzIEZpbGVzUm91dGVyIHtcbiAgZXhwcmVzc1JvdXRlcih7IG1heFVwbG9hZFNpemUgPSAnMjBNYicgfSA9IHt9KSB7XG4gICAgdmFyIHJvdXRlciA9IGV4cHJlc3MuUm91dGVyKCk7XG4gICAgcm91dGVyLmdldCgnL2ZpbGVzLzphcHBJZC86ZmlsZW5hbWUnLCB0aGlzLmdldEhhbmRsZXIpO1xuICAgIHJvdXRlci5nZXQoJy9maWxlcy86YXBwSWQvbWV0YWRhdGEvOmZpbGVuYW1lJywgdGhpcy5tZXRhZGF0YUhhbmRsZXIpO1xuXG4gICAgcm91dGVyLnBvc3QoJy9maWxlcycsIGZ1bmN0aW9uIChyZXEsIHJlcywgbmV4dCkge1xuICAgICAgbmV4dChuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuSU5WQUxJRF9GSUxFX05BTUUsICdGaWxlbmFtZSBub3QgcHJvdmlkZWQuJykpO1xuICAgIH0pO1xuXG4gICAgcm91dGVyLnBvc3QoXG4gICAgICAnL2ZpbGVzLzpmaWxlbmFtZScsXG4gICAgICBCb2R5UGFyc2VyLnJhdyh7XG4gICAgICAgIHR5cGU6ICgpID0+IHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSxcbiAgICAgICAgbGltaXQ6IG1heFVwbG9hZFNpemUsXG4gICAgICB9KSwgLy8gQWxsb3cgdXBsb2FkcyB3aXRob3V0IENvbnRlbnQtVHlwZSwgb3Igd2l0aCBhbnkgQ29udGVudC1UeXBlLlxuICAgICAgTWlkZGxld2FyZXMuaGFuZGxlUGFyc2VIZWFkZXJzLFxuICAgICAgdGhpcy5jcmVhdGVIYW5kbGVyXG4gICAgKTtcblxuICAgIHJvdXRlci5kZWxldGUoXG4gICAgICAnL2ZpbGVzLzpmaWxlbmFtZScsXG4gICAgICBNaWRkbGV3YXJlcy5oYW5kbGVQYXJzZUhlYWRlcnMsXG4gICAgICBNaWRkbGV3YXJlcy5lbmZvcmNlTWFzdGVyS2V5QWNjZXNzLFxuICAgICAgdGhpcy5kZWxldGVIYW5kbGVyXG4gICAgKTtcbiAgICByZXR1cm4gcm91dGVyO1xuICB9XG5cbiAgZ2V0SGFuZGxlcihyZXEsIHJlcykge1xuICAgIGNvbnN0IGNvbmZpZyA9IENvbmZpZy5nZXQocmVxLnBhcmFtcy5hcHBJZCk7XG4gICAgaWYgKCFjb25maWcpIHtcbiAgICAgIHJlcy5zdGF0dXMoNDAzKTtcbiAgICAgIGNvbnN0IGVyciA9IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5PUEVSQVRJT05fRk9SQklEREVOLCAnSW52YWxpZCBhcHBsaWNhdGlvbiBJRC4nKTtcbiAgICAgIHJlcy5qc29uKHsgY29kZTogZXJyLmNvZGUsIGVycm9yOiBlcnIubWVzc2FnZSB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZmlsZXNDb250cm9sbGVyID0gY29uZmlnLmZpbGVzQ29udHJvbGxlcjtcbiAgICBjb25zdCBmaWxlbmFtZSA9IHJlcS5wYXJhbXMuZmlsZW5hbWU7XG4gICAgY29uc3QgY29udGVudFR5cGUgPSBtaW1lLmdldFR5cGUoZmlsZW5hbWUpO1xuICAgIGlmIChpc0ZpbGVTdHJlYW1hYmxlKHJlcSwgZmlsZXNDb250cm9sbGVyKSkge1xuICAgICAgZmlsZXNDb250cm9sbGVyLmhhbmRsZUZpbGVTdHJlYW0oY29uZmlnLCBmaWxlbmFtZSwgcmVxLCByZXMsIGNvbnRlbnRUeXBlKS5jYXRjaCgoKSA9PiB7XG4gICAgICAgIHJlcy5zdGF0dXMoNDA0KTtcbiAgICAgICAgcmVzLnNldCgnQ29udGVudC1UeXBlJywgJ3RleHQvcGxhaW4nKTtcbiAgICAgICAgcmVzLmVuZCgnRmlsZSBub3QgZm91bmQuJyk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZmlsZXNDb250cm9sbGVyXG4gICAgICAgIC5nZXRGaWxlRGF0YShjb25maWcsIGZpbGVuYW1lKVxuICAgICAgICAudGhlbihkYXRhID0+IHtcbiAgICAgICAgICByZXMuc3RhdHVzKDIwMCk7XG4gICAgICAgICAgcmVzLnNldCgnQ29udGVudC1UeXBlJywgY29udGVudFR5cGUpO1xuICAgICAgICAgIHJlcy5zZXQoJ0NvbnRlbnQtTGVuZ3RoJywgZGF0YS5sZW5ndGgpO1xuICAgICAgICAgIHJlcy5lbmQoZGF0YSk7XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgcmVzLnN0YXR1cyg0MDQpO1xuICAgICAgICAgIHJlcy5zZXQoJ0NvbnRlbnQtVHlwZScsICd0ZXh0L3BsYWluJyk7XG4gICAgICAgICAgcmVzLmVuZCgnRmlsZSBub3QgZm91bmQuJyk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZUhhbmRsZXIocmVxLCByZXMsIG5leHQpIHtcbiAgICBjb25zdCBjb25maWcgPSByZXEuY29uZmlnO1xuICAgIGNvbnN0IHVzZXIgPSByZXEuYXV0aC51c2VyO1xuICAgIGNvbnN0IGlzTWFzdGVyID0gcmVxLmF1dGguaXNNYXN0ZXI7XG4gICAgY29uc3QgaXNMaW5rZWQgPSB1c2VyICYmIFBhcnNlLkFub255bW91c1V0aWxzLmlzTGlua2VkKHVzZXIpO1xuICAgIGlmICghaXNNYXN0ZXIgJiYgIWNvbmZpZy5maWxlVXBsb2FkLmVuYWJsZUZvckFub255bW91c1VzZXIgJiYgaXNMaW5rZWQpIHtcbiAgICAgIG5leHQoXG4gICAgICAgIG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5GSUxFX1NBVkVfRVJST1IsICdGaWxlIHVwbG9hZCBieSBhbm9ueW1vdXMgdXNlciBpcyBkaXNhYmxlZC4nKVxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCFpc01hc3RlciAmJiAhY29uZmlnLmZpbGVVcGxvYWQuZW5hYmxlRm9yQXV0aGVudGljYXRlZFVzZXIgJiYgIWlzTGlua2VkICYmIHVzZXIpIHtcbiAgICAgIG5leHQoXG4gICAgICAgIG5ldyBQYXJzZS5FcnJvcihcbiAgICAgICAgICBQYXJzZS5FcnJvci5GSUxFX1NBVkVfRVJST1IsXG4gICAgICAgICAgJ0ZpbGUgdXBsb2FkIGJ5IGF1dGhlbnRpY2F0ZWQgdXNlciBpcyBkaXNhYmxlZC4nXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghaXNNYXN0ZXIgJiYgIWNvbmZpZy5maWxlVXBsb2FkLmVuYWJsZUZvclB1YmxpYyAmJiAhdXNlcikge1xuICAgICAgbmV4dChuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuRklMRV9TQVZFX0VSUk9SLCAnRmlsZSB1cGxvYWQgYnkgcHVibGljIGlzIGRpc2FibGVkLicpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZmlsZXNDb250cm9sbGVyID0gY29uZmlnLmZpbGVzQ29udHJvbGxlcjtcbiAgICBjb25zdCB7IGZpbGVuYW1lIH0gPSByZXEucGFyYW1zO1xuICAgIGNvbnN0IGNvbnRlbnRUeXBlID0gcmVxLmdldCgnQ29udGVudC10eXBlJyk7XG5cbiAgICBpZiAoIXJlcS5ib2R5IHx8ICFyZXEuYm9keS5sZW5ndGgpIHtcbiAgICAgIG5leHQobmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLkZJTEVfU0FWRV9FUlJPUiwgJ0ludmFsaWQgZmlsZSB1cGxvYWQuJykpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGVycm9yID0gZmlsZXNDb250cm9sbGVyLnZhbGlkYXRlRmlsZW5hbWUoZmlsZW5hbWUpO1xuICAgIGlmIChlcnJvcikge1xuICAgICAgbmV4dChlcnJvcik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgYmFzZTY0ID0gcmVxLmJvZHkudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuICAgIGNvbnN0IGZpbGUgPSBuZXcgUGFyc2UuRmlsZShmaWxlbmFtZSwgeyBiYXNlNjQgfSwgY29udGVudFR5cGUpO1xuICAgIGNvbnN0IHsgbWV0YWRhdGEgPSB7fSwgdGFncyA9IHt9IH0gPSByZXEuZmlsZURhdGEgfHwge307XG4gICAgaWYgKHJlcS5jb25maWcgJiYgcmVxLmNvbmZpZy5yZXF1ZXN0S2V5d29yZERlbnlsaXN0KSB7XG4gICAgICAvLyBTY2FuIHJlcXVlc3QgZGF0YSBmb3IgZGVuaWVkIGtleXdvcmRzXG4gICAgICBmb3IgKGNvbnN0IGtleXdvcmQgb2YgcmVxLmNvbmZpZy5yZXF1ZXN0S2V5d29yZERlbnlsaXN0KSB7XG4gICAgICAgIGNvbnN0IG1hdGNoID1cbiAgICAgICAgICBVdGlscy5vYmplY3RDb250YWluc0tleVZhbHVlKG1ldGFkYXRhLCBrZXl3b3JkLmtleSwga2V5d29yZC52YWx1ZSkgfHxcbiAgICAgICAgICBVdGlscy5vYmplY3RDb250YWluc0tleVZhbHVlKHRhZ3MsIGtleXdvcmQua2V5LCBrZXl3b3JkLnZhbHVlKTtcbiAgICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgICAgbmV4dChcbiAgICAgICAgICAgIG5ldyBQYXJzZS5FcnJvcihcbiAgICAgICAgICAgICAgUGFyc2UuRXJyb3IuSU5WQUxJRF9LRVlfTkFNRSxcbiAgICAgICAgICAgICAgYFByb2hpYml0ZWQga2V5d29yZCBpbiByZXF1ZXN0IGRhdGE6ICR7SlNPTi5zdHJpbmdpZnkoa2V5d29yZCl9LmBcbiAgICAgICAgICAgIClcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBmaWxlLnNldFRhZ3ModGFncyk7XG4gICAgZmlsZS5zZXRNZXRhZGF0YShtZXRhZGF0YSk7XG4gICAgY29uc3QgZmlsZVNpemUgPSBCdWZmZXIuYnl0ZUxlbmd0aChyZXEuYm9keSk7XG4gICAgY29uc3QgZmlsZU9iamVjdCA9IHsgZmlsZSwgZmlsZVNpemUgfTtcbiAgICB0cnkge1xuICAgICAgLy8gcnVuIGJlZm9yZVNhdmVGaWxlIHRyaWdnZXJcbiAgICAgIGNvbnN0IHRyaWdnZXJSZXN1bHQgPSBhd2FpdCB0cmlnZ2Vycy5tYXliZVJ1bkZpbGVUcmlnZ2VyKFxuICAgICAgICB0cmlnZ2Vycy5UeXBlcy5iZWZvcmVTYXZlLFxuICAgICAgICBmaWxlT2JqZWN0LFxuICAgICAgICBjb25maWcsXG4gICAgICAgIHJlcS5hdXRoXG4gICAgICApO1xuICAgICAgbGV0IHNhdmVSZXN1bHQ7XG4gICAgICAvLyBpZiBhIG5ldyBQYXJzZUZpbGUgaXMgcmV0dXJuZWQgY2hlY2sgaWYgaXQncyBhbiBhbHJlYWR5IHNhdmVkIGZpbGVcbiAgICAgIGlmICh0cmlnZ2VyUmVzdWx0IGluc3RhbmNlb2YgUGFyc2UuRmlsZSkge1xuICAgICAgICBmaWxlT2JqZWN0LmZpbGUgPSB0cmlnZ2VyUmVzdWx0O1xuICAgICAgICBpZiAodHJpZ2dlclJlc3VsdC51cmwoKSkge1xuICAgICAgICAgIC8vIHNldCBmaWxlU2l6ZSB0byBudWxsIGJlY2F1c2Ugd2Ugd29udCBrbm93IGhvdyBiaWcgaXQgaXMgaGVyZVxuICAgICAgICAgIGZpbGVPYmplY3QuZmlsZVNpemUgPSBudWxsO1xuICAgICAgICAgIHNhdmVSZXN1bHQgPSB7XG4gICAgICAgICAgICB1cmw6IHRyaWdnZXJSZXN1bHQudXJsKCksXG4gICAgICAgICAgICBuYW1lOiB0cmlnZ2VyUmVzdWx0Ll9uYW1lLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIGlmIHRoZSBmaWxlIHJldHVybmVkIGJ5IHRoZSB0cmlnZ2VyIGhhcyBhbHJlYWR5IGJlZW4gc2F2ZWQgc2tpcCBzYXZpbmcgYW55dGhpbmdcbiAgICAgIGlmICghc2F2ZVJlc3VsdCkge1xuICAgICAgICAvLyBpZiB0aGUgUGFyc2VGaWxlIHJldHVybmVkIGlzIHR5cGUgdXJpLCBkb3dubG9hZCB0aGUgZmlsZSBiZWZvcmUgc2F2aW5nIGl0XG4gICAgICAgIGF3YWl0IGFkZEZpbGVEYXRhSWZOZWVkZWQoZmlsZU9iamVjdC5maWxlKTtcbiAgICAgICAgLy8gdXBkYXRlIGZpbGVTaXplXG4gICAgICAgIGNvbnN0IGJ1ZmZlckRhdGEgPSBCdWZmZXIuZnJvbShmaWxlT2JqZWN0LmZpbGUuX2RhdGEsICdiYXNlNjQnKTtcbiAgICAgICAgZmlsZU9iamVjdC5maWxlU2l6ZSA9IEJ1ZmZlci5ieXRlTGVuZ3RoKGJ1ZmZlckRhdGEpO1xuICAgICAgICAvLyBwcmVwYXJlIGZpbGUgb3B0aW9uc1xuICAgICAgICBjb25zdCBmaWxlT3B0aW9ucyA9IHtcbiAgICAgICAgICBtZXRhZGF0YTogZmlsZU9iamVjdC5maWxlLl9tZXRhZGF0YSxcbiAgICAgICAgfTtcbiAgICAgICAgLy8gc29tZSBzMy1jb21wYXRpYmxlIHByb3ZpZGVycyAoRGlnaXRhbE9jZWFuLCBMaW5vZGUpIGRvIG5vdCBhY2NlcHQgdGFnc1xuICAgICAgICAvLyBzbyB3ZSBkbyBub3QgaW5jbHVkZSB0aGUgdGFncyBvcHRpb24gaWYgaXQgaXMgZW1wdHkuXG4gICAgICAgIGNvbnN0IGZpbGVUYWdzID1cbiAgICAgICAgICBPYmplY3Qua2V5cyhmaWxlT2JqZWN0LmZpbGUuX3RhZ3MpLmxlbmd0aCA+IDAgPyB7IHRhZ3M6IGZpbGVPYmplY3QuZmlsZS5fdGFncyB9IDoge307XG4gICAgICAgIE9iamVjdC5hc3NpZ24oZmlsZU9wdGlvbnMsIGZpbGVUYWdzKTtcbiAgICAgICAgLy8gc2F2ZSBmaWxlXG4gICAgICAgIGNvbnN0IGNyZWF0ZUZpbGVSZXN1bHQgPSBhd2FpdCBmaWxlc0NvbnRyb2xsZXIuY3JlYXRlRmlsZShcbiAgICAgICAgICBjb25maWcsXG4gICAgICAgICAgZmlsZU9iamVjdC5maWxlLl9uYW1lLFxuICAgICAgICAgIGJ1ZmZlckRhdGEsXG4gICAgICAgICAgZmlsZU9iamVjdC5maWxlLl9zb3VyY2UudHlwZSxcbiAgICAgICAgICBmaWxlT3B0aW9uc1xuICAgICAgICApO1xuICAgICAgICAvLyB1cGRhdGUgZmlsZSB3aXRoIG5ldyBkYXRhXG4gICAgICAgIGZpbGVPYmplY3QuZmlsZS5fbmFtZSA9IGNyZWF0ZUZpbGVSZXN1bHQubmFtZTtcbiAgICAgICAgZmlsZU9iamVjdC5maWxlLl91cmwgPSBjcmVhdGVGaWxlUmVzdWx0LnVybDtcbiAgICAgICAgZmlsZU9iamVjdC5maWxlLl9yZXF1ZXN0VGFzayA9IG51bGw7XG4gICAgICAgIGZpbGVPYmplY3QuZmlsZS5fcHJldmlvdXNTYXZlID0gUHJvbWlzZS5yZXNvbHZlKGZpbGVPYmplY3QuZmlsZSk7XG4gICAgICAgIHNhdmVSZXN1bHQgPSB7XG4gICAgICAgICAgdXJsOiBjcmVhdGVGaWxlUmVzdWx0LnVybCxcbiAgICAgICAgICBuYW1lOiBjcmVhdGVGaWxlUmVzdWx0Lm5hbWUsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICAvLyBydW4gYWZ0ZXJTYXZlRmlsZSB0cmlnZ2VyXG4gICAgICBhd2FpdCB0cmlnZ2Vycy5tYXliZVJ1bkZpbGVUcmlnZ2VyKHRyaWdnZXJzLlR5cGVzLmFmdGVyU2F2ZSwgZmlsZU9iamVjdCwgY29uZmlnLCByZXEuYXV0aCk7XG4gICAgICByZXMuc3RhdHVzKDIwMSk7XG4gICAgICByZXMuc2V0KCdMb2NhdGlvbicsIHNhdmVSZXN1bHQudXJsKTtcbiAgICAgIHJlcy5qc29uKHNhdmVSZXN1bHQpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGxvZ2dlci5lcnJvcignRXJyb3IgY3JlYXRpbmcgYSBmaWxlOiAnLCBlKTtcbiAgICAgIGNvbnN0IGVycm9yID0gdHJpZ2dlcnMucmVzb2x2ZUVycm9yKGUsIHtcbiAgICAgICAgY29kZTogUGFyc2UuRXJyb3IuRklMRV9TQVZFX0VSUk9SLFxuICAgICAgICBtZXNzYWdlOiBgQ291bGQgbm90IHN0b3JlIGZpbGU6ICR7ZmlsZU9iamVjdC5maWxlLl9uYW1lfS5gLFxuICAgICAgfSk7XG4gICAgICBuZXh0KGVycm9yKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBkZWxldGVIYW5kbGVyKHJlcSwgcmVzLCBuZXh0KSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHsgZmlsZXNDb250cm9sbGVyIH0gPSByZXEuY29uZmlnO1xuICAgICAgY29uc3QgeyBmaWxlbmFtZSB9ID0gcmVxLnBhcmFtcztcbiAgICAgIC8vIHJ1biBiZWZvcmVEZWxldGVGaWxlIHRyaWdnZXJcbiAgICAgIGNvbnN0IGZpbGUgPSBuZXcgUGFyc2UuRmlsZShmaWxlbmFtZSk7XG4gICAgICBmaWxlLl91cmwgPSBmaWxlc0NvbnRyb2xsZXIuYWRhcHRlci5nZXRGaWxlTG9jYXRpb24ocmVxLmNvbmZpZywgZmlsZW5hbWUpO1xuICAgICAgY29uc3QgZmlsZU9iamVjdCA9IHsgZmlsZSwgZmlsZVNpemU6IG51bGwgfTtcbiAgICAgIGF3YWl0IHRyaWdnZXJzLm1heWJlUnVuRmlsZVRyaWdnZXIoXG4gICAgICAgIHRyaWdnZXJzLlR5cGVzLmJlZm9yZURlbGV0ZSxcbiAgICAgICAgZmlsZU9iamVjdCxcbiAgICAgICAgcmVxLmNvbmZpZyxcbiAgICAgICAgcmVxLmF1dGhcbiAgICAgICk7XG4gICAgICAvLyBkZWxldGUgZmlsZVxuICAgICAgYXdhaXQgZmlsZXNDb250cm9sbGVyLmRlbGV0ZUZpbGUocmVxLmNvbmZpZywgZmlsZW5hbWUpO1xuICAgICAgLy8gcnVuIGFmdGVyRGVsZXRlRmlsZSB0cmlnZ2VyXG4gICAgICBhd2FpdCB0cmlnZ2Vycy5tYXliZVJ1bkZpbGVUcmlnZ2VyKFxuICAgICAgICB0cmlnZ2Vycy5UeXBlcy5hZnRlckRlbGV0ZSxcbiAgICAgICAgZmlsZU9iamVjdCxcbiAgICAgICAgcmVxLmNvbmZpZyxcbiAgICAgICAgcmVxLmF1dGhcbiAgICAgICk7XG4gICAgICByZXMuc3RhdHVzKDIwMCk7XG4gICAgICAvLyBUT0RPOiByZXR1cm4gdXNlZnVsIEpTT04gaGVyZT9cbiAgICAgIHJlcy5lbmQoKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoJ0Vycm9yIGRlbGV0aW5nIGEgZmlsZTogJywgZSk7XG4gICAgICBjb25zdCBlcnJvciA9IHRyaWdnZXJzLnJlc29sdmVFcnJvcihlLCB7XG4gICAgICAgIGNvZGU6IFBhcnNlLkVycm9yLkZJTEVfREVMRVRFX0VSUk9SLFxuICAgICAgICBtZXNzYWdlOiAnQ291bGQgbm90IGRlbGV0ZSBmaWxlLicsXG4gICAgICB9KTtcbiAgICAgIG5leHQoZXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIG1ldGFkYXRhSGFuZGxlcihyZXEsIHJlcykge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb25maWcgPSBDb25maWcuZ2V0KHJlcS5wYXJhbXMuYXBwSWQpO1xuICAgICAgY29uc3QgeyBmaWxlc0NvbnRyb2xsZXIgfSA9IGNvbmZpZztcbiAgICAgIGNvbnN0IHsgZmlsZW5hbWUgfSA9IHJlcS5wYXJhbXM7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgZmlsZXNDb250cm9sbGVyLmdldE1ldGFkYXRhKGZpbGVuYW1lKTtcbiAgICAgIHJlcy5zdGF0dXMoMjAwKTtcbiAgICAgIHJlcy5qc29uKGRhdGEpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJlcy5zdGF0dXMoMjAwKTtcbiAgICAgIHJlcy5qc29uKHt9KTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNGaWxlU3RyZWFtYWJsZShyZXEsIGZpbGVzQ29udHJvbGxlcikge1xuICBjb25zdCByYW5nZSA9IChyZXEuZ2V0KCdSYW5nZScpIHx8ICcvLS8nKS5zcGxpdCgnLScpO1xuICBjb25zdCBzdGFydCA9IE51bWJlcihyYW5nZVswXSk7XG4gIGNvbnN0IGVuZCA9IE51bWJlcihyYW5nZVsxXSk7XG4gIHJldHVybiAoXG4gICAgKCFpc05hTihzdGFydCkgfHwgIWlzTmFOKGVuZCkpICYmIHR5cGVvZiBmaWxlc0NvbnRyb2xsZXIuYWRhcHRlci5oYW5kbGVGaWxlU3RyZWFtID09PSAnZnVuY3Rpb24nXG4gICk7XG59XG4iXX0=
267
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ0cmlnZ2VycyIsInJlcXVpcmUiLCJodHRwIiwiVXRpbHMiLCJkb3dubG9hZEZpbGVGcm9tVVJJIiwidXJpIiwiUHJvbWlzZSIsInJlcyIsInJlaiIsImdldCIsInJlc3BvbnNlIiwic2V0RGVmYXVsdEVuY29kaW5nIiwiYm9keSIsImhlYWRlcnMiLCJvbiIsImRhdGEiLCJlIiwibWVzc2FnZSIsImFkZEZpbGVEYXRhSWZOZWVkZWQiLCJmaWxlIiwiX3NvdXJjZSIsImZvcm1hdCIsImJhc2U2NCIsIl9wcmV2aW91c1NhdmUiLCJfZGF0YSIsIl9yZXF1ZXN0VGFzayIsIkZpbGVzUm91dGVyIiwiZXhwcmVzc1JvdXRlciIsIm1heFVwbG9hZFNpemUiLCJyb3V0ZXIiLCJleHByZXNzIiwiUm91dGVyIiwiZ2V0SGFuZGxlciIsIm1ldGFkYXRhSGFuZGxlciIsInBvc3QiLCJyZXEiLCJuZXh0IiwiUGFyc2UiLCJFcnJvciIsIklOVkFMSURfRklMRV9OQU1FIiwiQm9keVBhcnNlciIsInJhdyIsInR5cGUiLCJsaW1pdCIsIk1pZGRsZXdhcmVzIiwiaGFuZGxlUGFyc2VIZWFkZXJzIiwiaGFuZGxlUGFyc2VTZXNzaW9uIiwiY3JlYXRlSGFuZGxlciIsImRlbGV0ZSIsImVuZm9yY2VNYXN0ZXJLZXlBY2Nlc3MiLCJkZWxldGVIYW5kbGVyIiwiY29uZmlnIiwiQ29uZmlnIiwicGFyYW1zIiwiYXBwSWQiLCJzdGF0dXMiLCJlcnIiLCJPUEVSQVRJT05fRk9SQklEREVOIiwianNvbiIsImNvZGUiLCJlcnJvciIsImZpbGVzQ29udHJvbGxlciIsImZpbGVuYW1lIiwiY29udGVudFR5cGUiLCJtaW1lIiwiZ2V0VHlwZSIsImlzRmlsZVN0cmVhbWFibGUiLCJoYW5kbGVGaWxlU3RyZWFtIiwiY2F0Y2giLCJzZXQiLCJlbmQiLCJnZXRGaWxlRGF0YSIsInRoZW4iLCJsZW5ndGgiLCJ1c2VyIiwiYXV0aCIsImlzTWFzdGVyIiwiaXNMaW5rZWQiLCJBbm9ueW1vdXNVdGlscyIsImZpbGVVcGxvYWQiLCJlbmFibGVGb3JBbm9ueW1vdXNVc2VyIiwiRklMRV9TQVZFX0VSUk9SIiwiZW5hYmxlRm9yQXV0aGVudGljYXRlZFVzZXIiLCJlbmFibGVGb3JQdWJsaWMiLCJ2YWxpZGF0ZUZpbGVuYW1lIiwidG9TdHJpbmciLCJGaWxlIiwibWV0YWRhdGEiLCJ0YWdzIiwiZmlsZURhdGEiLCJyZXF1ZXN0S2V5d29yZERlbnlsaXN0Iiwia2V5d29yZCIsIm1hdGNoIiwib2JqZWN0Q29udGFpbnNLZXlWYWx1ZSIsImtleSIsInZhbHVlIiwiSU5WQUxJRF9LRVlfTkFNRSIsIkpTT04iLCJzdHJpbmdpZnkiLCJzZXRUYWdzIiwic2V0TWV0YWRhdGEiLCJmaWxlU2l6ZSIsIkJ1ZmZlciIsImJ5dGVMZW5ndGgiLCJmaWxlT2JqZWN0IiwidHJpZ2dlclJlc3VsdCIsIm1heWJlUnVuRmlsZVRyaWdnZXIiLCJUeXBlcyIsImJlZm9yZVNhdmUiLCJzYXZlUmVzdWx0IiwidXJsIiwibmFtZSIsIl9uYW1lIiwiYnVmZmVyRGF0YSIsImZyb20iLCJmaWxlT3B0aW9ucyIsIl9tZXRhZGF0YSIsImZpbGVUYWdzIiwiT2JqZWN0Iiwia2V5cyIsIl90YWdzIiwiYXNzaWduIiwiY3JlYXRlRmlsZVJlc3VsdCIsImNyZWF0ZUZpbGUiLCJfdXJsIiwicmVzb2x2ZSIsImFmdGVyU2F2ZSIsImxvZ2dlciIsInJlc29sdmVFcnJvciIsImFkYXB0ZXIiLCJnZXRGaWxlTG9jYXRpb24iLCJiZWZvcmVEZWxldGUiLCJkZWxldGVGaWxlIiwiYWZ0ZXJEZWxldGUiLCJGSUxFX0RFTEVURV9FUlJPUiIsImdldE1ldGFkYXRhIiwicmFuZ2UiLCJzcGxpdCIsInN0YXJ0IiwiTnVtYmVyIiwiaXNOYU4iXSwic291cmNlcyI6WyIuLi8uLi9zcmMvUm91dGVycy9GaWxlc1JvdXRlci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZXhwcmVzcyBmcm9tICdleHByZXNzJztcbmltcG9ydCBCb2R5UGFyc2VyIGZyb20gJ2JvZHktcGFyc2VyJztcbmltcG9ydCAqIGFzIE1pZGRsZXdhcmVzIGZyb20gJy4uL21pZGRsZXdhcmVzJztcbmltcG9ydCBQYXJzZSBmcm9tICdwYXJzZS9ub2RlJztcbmltcG9ydCBDb25maWcgZnJvbSAnLi4vQ29uZmlnJztcbmltcG9ydCBtaW1lIGZyb20gJ21pbWUnO1xuaW1wb3J0IGxvZ2dlciBmcm9tICcuLi9sb2dnZXInO1xuY29uc3QgdHJpZ2dlcnMgPSByZXF1aXJlKCcuLi90cmlnZ2VycycpO1xuY29uc3QgaHR0cCA9IHJlcXVpcmUoJ2h0dHAnKTtcbmNvbnN0IFV0aWxzID0gcmVxdWlyZSgnLi4vVXRpbHMnKTtcblxuY29uc3QgZG93bmxvYWRGaWxlRnJvbVVSSSA9IHVyaSA9PiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzLCByZWopID0+IHtcbiAgICBodHRwXG4gICAgICAuZ2V0KHVyaSwgcmVzcG9uc2UgPT4ge1xuICAgICAgICByZXNwb25zZS5zZXREZWZhdWx0RW5jb2RpbmcoJ2Jhc2U2NCcpO1xuICAgICAgICBsZXQgYm9keSA9IGBkYXRhOiR7cmVzcG9uc2UuaGVhZGVyc1snY29udGVudC10eXBlJ119O2Jhc2U2NCxgO1xuICAgICAgICByZXNwb25zZS5vbignZGF0YScsIGRhdGEgPT4gKGJvZHkgKz0gZGF0YSkpO1xuICAgICAgICByZXNwb25zZS5vbignZW5kJywgKCkgPT4gcmVzKGJvZHkpKTtcbiAgICAgIH0pXG4gICAgICAub24oJ2Vycm9yJywgZSA9PiB7XG4gICAgICAgIHJlaihgRXJyb3IgZG93bmxvYWRpbmcgZmlsZSBmcm9tICR7dXJpfTogJHtlLm1lc3NhZ2V9YCk7XG4gICAgICB9KTtcbiAgfSk7XG59O1xuXG5jb25zdCBhZGRGaWxlRGF0YUlmTmVlZGVkID0gYXN5bmMgZmlsZSA9PiB7XG4gIGlmIChmaWxlLl9zb3VyY2UuZm9ybWF0ID09PSAndXJpJykge1xuICAgIGNvbnN0IGJhc2U2NCA9IGF3YWl0IGRvd25sb2FkRmlsZUZyb21VUkkoZmlsZS5fc291cmNlLnVyaSk7XG4gICAgZmlsZS5fcHJldmlvdXNTYXZlID0gZmlsZTtcbiAgICBmaWxlLl9kYXRhID0gYmFzZTY0O1xuICAgIGZpbGUuX3JlcXVlc3RUYXNrID0gbnVsbDtcbiAgfVxuICByZXR1cm4gZmlsZTtcbn07XG5cbmV4cG9ydCBjbGFzcyBGaWxlc1JvdXRlciB7XG4gIGV4cHJlc3NSb3V0ZXIoeyBtYXhVcGxvYWRTaXplID0gJzIwTWInIH0gPSB7fSkge1xuICAgIHZhciByb3V0ZXIgPSBleHByZXNzLlJvdXRlcigpO1xuICAgIHJvdXRlci5nZXQoJy9maWxlcy86YXBwSWQvOmZpbGVuYW1lJywgdGhpcy5nZXRIYW5kbGVyKTtcbiAgICByb3V0ZXIuZ2V0KCcvZmlsZXMvOmFwcElkL21ldGFkYXRhLzpmaWxlbmFtZScsIHRoaXMubWV0YWRhdGFIYW5kbGVyKTtcblxuICAgIHJvdXRlci5wb3N0KCcvZmlsZXMnLCBmdW5jdGlvbiAocmVxLCByZXMsIG5leHQpIHtcbiAgICAgIG5leHQobmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLklOVkFMSURfRklMRV9OQU1FLCAnRmlsZW5hbWUgbm90IHByb3ZpZGVkLicpKTtcbiAgICB9KTtcblxuICAgIHJvdXRlci5wb3N0KFxuICAgICAgJy9maWxlcy86ZmlsZW5hbWUnLFxuICAgICAgQm9keVBhcnNlci5yYXcoe1xuICAgICAgICB0eXBlOiAoKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0sXG4gICAgICAgIGxpbWl0OiBtYXhVcGxvYWRTaXplLFxuICAgICAgfSksIC8vIEFsbG93IHVwbG9hZHMgd2l0aG91dCBDb250ZW50LVR5cGUsIG9yIHdpdGggYW55IENvbnRlbnQtVHlwZS5cbiAgICAgIE1pZGRsZXdhcmVzLmhhbmRsZVBhcnNlSGVhZGVycyxcbiAgICAgIE1pZGRsZXdhcmVzLmhhbmRsZVBhcnNlU2Vzc2lvbixcbiAgICAgIHRoaXMuY3JlYXRlSGFuZGxlclxuICAgICk7XG5cbiAgICByb3V0ZXIuZGVsZXRlKFxuICAgICAgJy9maWxlcy86ZmlsZW5hbWUnLFxuICAgICAgTWlkZGxld2FyZXMuaGFuZGxlUGFyc2VIZWFkZXJzLFxuICAgICAgTWlkZGxld2FyZXMuaGFuZGxlUGFyc2VTZXNzaW9uLFxuICAgICAgTWlkZGxld2FyZXMuZW5mb3JjZU1hc3RlcktleUFjY2VzcyxcbiAgICAgIHRoaXMuZGVsZXRlSGFuZGxlclxuICAgICk7XG4gICAgcmV0dXJuIHJvdXRlcjtcbiAgfVxuXG4gIGdldEhhbmRsZXIocmVxLCByZXMpIHtcbiAgICBjb25zdCBjb25maWcgPSBDb25maWcuZ2V0KHJlcS5wYXJhbXMuYXBwSWQpO1xuICAgIGlmICghY29uZmlnKSB7XG4gICAgICByZXMuc3RhdHVzKDQwMyk7XG4gICAgICBjb25zdCBlcnIgPSBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuT1BFUkFUSU9OX0ZPUkJJRERFTiwgJ0ludmFsaWQgYXBwbGljYXRpb24gSUQuJyk7XG4gICAgICByZXMuanNvbih7IGNvZGU6IGVyci5jb2RlLCBlcnJvcjogZXJyLm1lc3NhZ2UgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGZpbGVzQ29udHJvbGxlciA9IGNvbmZpZy5maWxlc0NvbnRyb2xsZXI7XG4gICAgY29uc3QgZmlsZW5hbWUgPSByZXEucGFyYW1zLmZpbGVuYW1lO1xuICAgIGNvbnN0IGNvbnRlbnRUeXBlID0gbWltZS5nZXRUeXBlKGZpbGVuYW1lKTtcbiAgICBpZiAoaXNGaWxlU3RyZWFtYWJsZShyZXEsIGZpbGVzQ29udHJvbGxlcikpIHtcbiAgICAgIGZpbGVzQ29udHJvbGxlci5oYW5kbGVGaWxlU3RyZWFtKGNvbmZpZywgZmlsZW5hbWUsIHJlcSwgcmVzLCBjb250ZW50VHlwZSkuY2F0Y2goKCkgPT4ge1xuICAgICAgICByZXMuc3RhdHVzKDQwNCk7XG4gICAgICAgIHJlcy5zZXQoJ0NvbnRlbnQtVHlwZScsICd0ZXh0L3BsYWluJyk7XG4gICAgICAgIHJlcy5lbmQoJ0ZpbGUgbm90IGZvdW5kLicpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZpbGVzQ29udHJvbGxlclxuICAgICAgICAuZ2V0RmlsZURhdGEoY29uZmlnLCBmaWxlbmFtZSlcbiAgICAgICAgLnRoZW4oZGF0YSA9PiB7XG4gICAgICAgICAgcmVzLnN0YXR1cygyMDApO1xuICAgICAgICAgIHJlcy5zZXQoJ0NvbnRlbnQtVHlwZScsIGNvbnRlbnRUeXBlKTtcbiAgICAgICAgICByZXMuc2V0KCdDb250ZW50LUxlbmd0aCcsIGRhdGEubGVuZ3RoKTtcbiAgICAgICAgICByZXMuZW5kKGRhdGEpO1xuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goKCkgPT4ge1xuICAgICAgICAgIHJlcy5zdGF0dXMoNDA0KTtcbiAgICAgICAgICByZXMuc2V0KCdDb250ZW50LVR5cGUnLCAndGV4dC9wbGFpbicpO1xuICAgICAgICAgIHJlcy5lbmQoJ0ZpbGUgbm90IGZvdW5kLicpO1xuICAgICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBjcmVhdGVIYW5kbGVyKHJlcSwgcmVzLCBuZXh0KSB7XG4gICAgY29uc3QgY29uZmlnID0gcmVxLmNvbmZpZztcbiAgICBjb25zdCB1c2VyID0gcmVxLmF1dGgudXNlcjtcbiAgICBjb25zdCBpc01hc3RlciA9IHJlcS5hdXRoLmlzTWFzdGVyO1xuICAgIGNvbnN0IGlzTGlua2VkID0gdXNlciAmJiBQYXJzZS5Bbm9ueW1vdXNVdGlscy5pc0xpbmtlZCh1c2VyKTtcbiAgICBpZiAoIWlzTWFzdGVyICYmICFjb25maWcuZmlsZVVwbG9hZC5lbmFibGVGb3JBbm9ueW1vdXNVc2VyICYmIGlzTGlua2VkKSB7XG4gICAgICBuZXh0KFxuICAgICAgICBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuRklMRV9TQVZFX0VSUk9SLCAnRmlsZSB1cGxvYWQgYnkgYW5vbnltb3VzIHVzZXIgaXMgZGlzYWJsZWQuJylcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghaXNNYXN0ZXIgJiYgIWNvbmZpZy5maWxlVXBsb2FkLmVuYWJsZUZvckF1dGhlbnRpY2F0ZWRVc2VyICYmICFpc0xpbmtlZCAmJiB1c2VyKSB7XG4gICAgICBuZXh0KFxuICAgICAgICBuZXcgUGFyc2UuRXJyb3IoXG4gICAgICAgICAgUGFyc2UuRXJyb3IuRklMRV9TQVZFX0VSUk9SLFxuICAgICAgICAgICdGaWxlIHVwbG9hZCBieSBhdXRoZW50aWNhdGVkIHVzZXIgaXMgZGlzYWJsZWQuJ1xuICAgICAgICApXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIWlzTWFzdGVyICYmICFjb25maWcuZmlsZVVwbG9hZC5lbmFibGVGb3JQdWJsaWMgJiYgIXVzZXIpIHtcbiAgICAgIG5leHQobmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLkZJTEVfU0FWRV9FUlJPUiwgJ0ZpbGUgdXBsb2FkIGJ5IHB1YmxpYyBpcyBkaXNhYmxlZC4nKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGZpbGVzQ29udHJvbGxlciA9IGNvbmZpZy5maWxlc0NvbnRyb2xsZXI7XG4gICAgY29uc3QgeyBmaWxlbmFtZSB9ID0gcmVxLnBhcmFtcztcbiAgICBjb25zdCBjb250ZW50VHlwZSA9IHJlcS5nZXQoJ0NvbnRlbnQtdHlwZScpO1xuXG4gICAgaWYgKCFyZXEuYm9keSB8fCAhcmVxLmJvZHkubGVuZ3RoKSB7XG4gICAgICBuZXh0KG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5GSUxFX1NBVkVfRVJST1IsICdJbnZhbGlkIGZpbGUgdXBsb2FkLicpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBlcnJvciA9IGZpbGVzQ29udHJvbGxlci52YWxpZGF0ZUZpbGVuYW1lKGZpbGVuYW1lKTtcbiAgICBpZiAoZXJyb3IpIHtcbiAgICAgIG5leHQoZXJyb3IpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGJhc2U2NCA9IHJlcS5ib2R5LnRvU3RyaW5nKCdiYXNlNjQnKTtcbiAgICBjb25zdCBmaWxlID0gbmV3IFBhcnNlLkZpbGUoZmlsZW5hbWUsIHsgYmFzZTY0IH0sIGNvbnRlbnRUeXBlKTtcbiAgICBjb25zdCB7IG1ldGFkYXRhID0ge30sIHRhZ3MgPSB7fSB9ID0gcmVxLmZpbGVEYXRhIHx8IHt9O1xuICAgIGlmIChyZXEuY29uZmlnICYmIHJlcS5jb25maWcucmVxdWVzdEtleXdvcmREZW55bGlzdCkge1xuICAgICAgLy8gU2NhbiByZXF1ZXN0IGRhdGEgZm9yIGRlbmllZCBrZXl3b3Jkc1xuICAgICAgZm9yIChjb25zdCBrZXl3b3JkIG9mIHJlcS5jb25maWcucmVxdWVzdEtleXdvcmREZW55bGlzdCkge1xuICAgICAgICBjb25zdCBtYXRjaCA9XG4gICAgICAgICAgVXRpbHMub2JqZWN0Q29udGFpbnNLZXlWYWx1ZShtZXRhZGF0YSwga2V5d29yZC5rZXksIGtleXdvcmQudmFsdWUpIHx8XG4gICAgICAgICAgVXRpbHMub2JqZWN0Q29udGFpbnNLZXlWYWx1ZSh0YWdzLCBrZXl3b3JkLmtleSwga2V5d29yZC52YWx1ZSk7XG4gICAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICAgIG5leHQoXG4gICAgICAgICAgICBuZXcgUGFyc2UuRXJyb3IoXG4gICAgICAgICAgICAgIFBhcnNlLkVycm9yLklOVkFMSURfS0VZX05BTUUsXG4gICAgICAgICAgICAgIGBQcm9oaWJpdGVkIGtleXdvcmQgaW4gcmVxdWVzdCBkYXRhOiAke0pTT04uc3RyaW5naWZ5KGtleXdvcmQpfS5gXG4gICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgZmlsZS5zZXRUYWdzKHRhZ3MpO1xuICAgIGZpbGUuc2V0TWV0YWRhdGEobWV0YWRhdGEpO1xuICAgIGNvbnN0IGZpbGVTaXplID0gQnVmZmVyLmJ5dGVMZW5ndGgocmVxLmJvZHkpO1xuICAgIGNvbnN0IGZpbGVPYmplY3QgPSB7IGZpbGUsIGZpbGVTaXplIH07XG4gICAgdHJ5IHtcbiAgICAgIC8vIHJ1biBiZWZvcmVTYXZlRmlsZSB0cmlnZ2VyXG4gICAgICBjb25zdCB0cmlnZ2VyUmVzdWx0ID0gYXdhaXQgdHJpZ2dlcnMubWF5YmVSdW5GaWxlVHJpZ2dlcihcbiAgICAgICAgdHJpZ2dlcnMuVHlwZXMuYmVmb3JlU2F2ZSxcbiAgICAgICAgZmlsZU9iamVjdCxcbiAgICAgICAgY29uZmlnLFxuICAgICAgICByZXEuYXV0aFxuICAgICAgKTtcbiAgICAgIGxldCBzYXZlUmVzdWx0O1xuICAgICAgLy8gaWYgYSBuZXcgUGFyc2VGaWxlIGlzIHJldHVybmVkIGNoZWNrIGlmIGl0J3MgYW4gYWxyZWFkeSBzYXZlZCBmaWxlXG4gICAgICBpZiAodHJpZ2dlclJlc3VsdCBpbnN0YW5jZW9mIFBhcnNlLkZpbGUpIHtcbiAgICAgICAgZmlsZU9iamVjdC5maWxlID0gdHJpZ2dlclJlc3VsdDtcbiAgICAgICAgaWYgKHRyaWdnZXJSZXN1bHQudXJsKCkpIHtcbiAgICAgICAgICAvLyBzZXQgZmlsZVNpemUgdG8gbnVsbCBiZWNhdXNlIHdlIHdvbnQga25vdyBob3cgYmlnIGl0IGlzIGhlcmVcbiAgICAgICAgICBmaWxlT2JqZWN0LmZpbGVTaXplID0gbnVsbDtcbiAgICAgICAgICBzYXZlUmVzdWx0ID0ge1xuICAgICAgICAgICAgdXJsOiB0cmlnZ2VyUmVzdWx0LnVybCgpLFxuICAgICAgICAgICAgbmFtZTogdHJpZ2dlclJlc3VsdC5fbmFtZSxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBpZiB0aGUgZmlsZSByZXR1cm5lZCBieSB0aGUgdHJpZ2dlciBoYXMgYWxyZWFkeSBiZWVuIHNhdmVkIHNraXAgc2F2aW5nIGFueXRoaW5nXG4gICAgICBpZiAoIXNhdmVSZXN1bHQpIHtcbiAgICAgICAgLy8gaWYgdGhlIFBhcnNlRmlsZSByZXR1cm5lZCBpcyB0eXBlIHVyaSwgZG93bmxvYWQgdGhlIGZpbGUgYmVmb3JlIHNhdmluZyBpdFxuICAgICAgICBhd2FpdCBhZGRGaWxlRGF0YUlmTmVlZGVkKGZpbGVPYmplY3QuZmlsZSk7XG4gICAgICAgIC8vIHVwZGF0ZSBmaWxlU2l6ZVxuICAgICAgICBjb25zdCBidWZmZXJEYXRhID0gQnVmZmVyLmZyb20oZmlsZU9iamVjdC5maWxlLl9kYXRhLCAnYmFzZTY0Jyk7XG4gICAgICAgIGZpbGVPYmplY3QuZmlsZVNpemUgPSBCdWZmZXIuYnl0ZUxlbmd0aChidWZmZXJEYXRhKTtcbiAgICAgICAgLy8gcHJlcGFyZSBmaWxlIG9wdGlvbnNcbiAgICAgICAgY29uc3QgZmlsZU9wdGlvbnMgPSB7XG4gICAgICAgICAgbWV0YWRhdGE6IGZpbGVPYmplY3QuZmlsZS5fbWV0YWRhdGEsXG4gICAgICAgIH07XG4gICAgICAgIC8vIHNvbWUgczMtY29tcGF0aWJsZSBwcm92aWRlcnMgKERpZ2l0YWxPY2VhbiwgTGlub2RlKSBkbyBub3QgYWNjZXB0IHRhZ3NcbiAgICAgICAgLy8gc28gd2UgZG8gbm90IGluY2x1ZGUgdGhlIHRhZ3Mgb3B0aW9uIGlmIGl0IGlzIGVtcHR5LlxuICAgICAgICBjb25zdCBmaWxlVGFncyA9XG4gICAgICAgICAgT2JqZWN0LmtleXMoZmlsZU9iamVjdC5maWxlLl90YWdzKS5sZW5ndGggPiAwID8geyB0YWdzOiBmaWxlT2JqZWN0LmZpbGUuX3RhZ3MgfSA6IHt9O1xuICAgICAgICBPYmplY3QuYXNzaWduKGZpbGVPcHRpb25zLCBmaWxlVGFncyk7XG4gICAgICAgIC8vIHNhdmUgZmlsZVxuICAgICAgICBjb25zdCBjcmVhdGVGaWxlUmVzdWx0ID0gYXdhaXQgZmlsZXNDb250cm9sbGVyLmNyZWF0ZUZpbGUoXG4gICAgICAgICAgY29uZmlnLFxuICAgICAgICAgIGZpbGVPYmplY3QuZmlsZS5fbmFtZSxcbiAgICAgICAgICBidWZmZXJEYXRhLFxuICAgICAgICAgIGZpbGVPYmplY3QuZmlsZS5fc291cmNlLnR5cGUsXG4gICAgICAgICAgZmlsZU9wdGlvbnNcbiAgICAgICAgKTtcbiAgICAgICAgLy8gdXBkYXRlIGZpbGUgd2l0aCBuZXcgZGF0YVxuICAgICAgICBmaWxlT2JqZWN0LmZpbGUuX25hbWUgPSBjcmVhdGVGaWxlUmVzdWx0Lm5hbWU7XG4gICAgICAgIGZpbGVPYmplY3QuZmlsZS5fdXJsID0gY3JlYXRlRmlsZVJlc3VsdC51cmw7XG4gICAgICAgIGZpbGVPYmplY3QuZmlsZS5fcmVxdWVzdFRhc2sgPSBudWxsO1xuICAgICAgICBmaWxlT2JqZWN0LmZpbGUuX3ByZXZpb3VzU2F2ZSA9IFByb21pc2UucmVzb2x2ZShmaWxlT2JqZWN0LmZpbGUpO1xuICAgICAgICBzYXZlUmVzdWx0ID0ge1xuICAgICAgICAgIHVybDogY3JlYXRlRmlsZVJlc3VsdC51cmwsXG4gICAgICAgICAgbmFtZTogY3JlYXRlRmlsZVJlc3VsdC5uYW1lLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgLy8gcnVuIGFmdGVyU2F2ZUZpbGUgdHJpZ2dlclxuICAgICAgYXdhaXQgdHJpZ2dlcnMubWF5YmVSdW5GaWxlVHJpZ2dlcih0cmlnZ2Vycy5UeXBlcy5hZnRlclNhdmUsIGZpbGVPYmplY3QsIGNvbmZpZywgcmVxLmF1dGgpO1xuICAgICAgcmVzLnN0YXR1cygyMDEpO1xuICAgICAgcmVzLnNldCgnTG9jYXRpb24nLCBzYXZlUmVzdWx0LnVybCk7XG4gICAgICByZXMuanNvbihzYXZlUmVzdWx0KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoJ0Vycm9yIGNyZWF0aW5nIGEgZmlsZTogJywgZSk7XG4gICAgICBjb25zdCBlcnJvciA9IHRyaWdnZXJzLnJlc29sdmVFcnJvcihlLCB7XG4gICAgICAgIGNvZGU6IFBhcnNlLkVycm9yLkZJTEVfU0FWRV9FUlJPUixcbiAgICAgICAgbWVzc2FnZTogYENvdWxkIG5vdCBzdG9yZSBmaWxlOiAke2ZpbGVPYmplY3QuZmlsZS5fbmFtZX0uYCxcbiAgICAgIH0pO1xuICAgICAgbmV4dChlcnJvcik7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZGVsZXRlSGFuZGxlcihyZXEsIHJlcywgbmV4dCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB7IGZpbGVzQ29udHJvbGxlciB9ID0gcmVxLmNvbmZpZztcbiAgICAgIGNvbnN0IHsgZmlsZW5hbWUgfSA9IHJlcS5wYXJhbXM7XG4gICAgICAvLyBydW4gYmVmb3JlRGVsZXRlRmlsZSB0cmlnZ2VyXG4gICAgICBjb25zdCBmaWxlID0gbmV3IFBhcnNlLkZpbGUoZmlsZW5hbWUpO1xuICAgICAgZmlsZS5fdXJsID0gZmlsZXNDb250cm9sbGVyLmFkYXB0ZXIuZ2V0RmlsZUxvY2F0aW9uKHJlcS5jb25maWcsIGZpbGVuYW1lKTtcbiAgICAgIGNvbnN0IGZpbGVPYmplY3QgPSB7IGZpbGUsIGZpbGVTaXplOiBudWxsIH07XG4gICAgICBhd2FpdCB0cmlnZ2Vycy5tYXliZVJ1bkZpbGVUcmlnZ2VyKFxuICAgICAgICB0cmlnZ2Vycy5UeXBlcy5iZWZvcmVEZWxldGUsXG4gICAgICAgIGZpbGVPYmplY3QsXG4gICAgICAgIHJlcS5jb25maWcsXG4gICAgICAgIHJlcS5hdXRoXG4gICAgICApO1xuICAgICAgLy8gZGVsZXRlIGZpbGVcbiAgICAgIGF3YWl0IGZpbGVzQ29udHJvbGxlci5kZWxldGVGaWxlKHJlcS5jb25maWcsIGZpbGVuYW1lKTtcbiAgICAgIC8vIHJ1biBhZnRlckRlbGV0ZUZpbGUgdHJpZ2dlclxuICAgICAgYXdhaXQgdHJpZ2dlcnMubWF5YmVSdW5GaWxlVHJpZ2dlcihcbiAgICAgICAgdHJpZ2dlcnMuVHlwZXMuYWZ0ZXJEZWxldGUsXG4gICAgICAgIGZpbGVPYmplY3QsXG4gICAgICAgIHJlcS5jb25maWcsXG4gICAgICAgIHJlcS5hdXRoXG4gICAgICApO1xuICAgICAgcmVzLnN0YXR1cygyMDApO1xuICAgICAgLy8gVE9ETzogcmV0dXJuIHVzZWZ1bCBKU09OIGhlcmU/XG4gICAgICByZXMuZW5kKCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgbG9nZ2VyLmVycm9yKCdFcnJvciBkZWxldGluZyBhIGZpbGU6ICcsIGUpO1xuICAgICAgY29uc3QgZXJyb3IgPSB0cmlnZ2Vycy5yZXNvbHZlRXJyb3IoZSwge1xuICAgICAgICBjb2RlOiBQYXJzZS5FcnJvci5GSUxFX0RFTEVURV9FUlJPUixcbiAgICAgICAgbWVzc2FnZTogJ0NvdWxkIG5vdCBkZWxldGUgZmlsZS4nLFxuICAgICAgfSk7XG4gICAgICBuZXh0KGVycm9yKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBtZXRhZGF0YUhhbmRsZXIocmVxLCByZXMpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY29uZmlnID0gQ29uZmlnLmdldChyZXEucGFyYW1zLmFwcElkKTtcbiAgICAgIGNvbnN0IHsgZmlsZXNDb250cm9sbGVyIH0gPSBjb25maWc7XG4gICAgICBjb25zdCB7IGZpbGVuYW1lIH0gPSByZXEucGFyYW1zO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IGZpbGVzQ29udHJvbGxlci5nZXRNZXRhZGF0YShmaWxlbmFtZSk7XG4gICAgICByZXMuc3RhdHVzKDIwMCk7XG4gICAgICByZXMuanNvbihkYXRhKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXMuc3RhdHVzKDIwMCk7XG4gICAgICByZXMuanNvbih7fSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGlzRmlsZVN0cmVhbWFibGUocmVxLCBmaWxlc0NvbnRyb2xsZXIpIHtcbiAgY29uc3QgcmFuZ2UgPSAocmVxLmdldCgnUmFuZ2UnKSB8fCAnLy0vJykuc3BsaXQoJy0nKTtcbiAgY29uc3Qgc3RhcnQgPSBOdW1iZXIocmFuZ2VbMF0pO1xuICBjb25zdCBlbmQgPSBOdW1iZXIocmFuZ2VbMV0pO1xuICByZXR1cm4gKFxuICAgICghaXNOYU4oc3RhcnQpIHx8ICFpc05hTihlbmQpKSAmJiB0eXBlb2YgZmlsZXNDb250cm9sbGVyLmFkYXB0ZXIuaGFuZGxlRmlsZVN0cmVhbSA9PT0gJ2Z1bmN0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