parse-server 6.0.0-alpha.9 → 6.0.0-beta.1

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 (192) hide show
  1. package/LICENSE +167 -25
  2. package/NOTICE +10 -0
  3. package/README.md +57 -33
  4. package/lib/AccountLockout.js +11 -26
  5. package/lib/Adapters/AdapterLoader.js +8 -14
  6. package/lib/Adapters/Analytics/AnalyticsAdapter.js +2 -8
  7. package/lib/Adapters/Auth/AuthAdapter.js +7 -16
  8. package/lib/Adapters/Auth/OAuth1Client.js +32 -57
  9. package/lib/Adapters/Auth/apple.js +6 -22
  10. package/lib/Adapters/Auth/facebook.js +7 -37
  11. package/lib/Adapters/Auth/gcenter.js +8 -37
  12. package/lib/Adapters/Auth/github.js +7 -10
  13. package/lib/Adapters/Auth/google.js +11 -34
  14. package/lib/Adapters/Auth/gpgames.js +5 -8
  15. package/lib/Adapters/Auth/httpsRequest.js +1 -7
  16. package/lib/Adapters/Auth/index.js +20 -65
  17. package/lib/Adapters/Auth/instagram.js +5 -9
  18. package/lib/Adapters/Auth/janraincapture.js +8 -12
  19. package/lib/Adapters/Auth/janrainengage.js +7 -11
  20. package/lib/Adapters/Auth/keycloak.js +5 -19
  21. package/lib/Adapters/Auth/ldap.js +1 -15
  22. package/lib/Adapters/Auth/line.js +7 -10
  23. package/lib/Adapters/Auth/linkedin.js +7 -12
  24. package/lib/Adapters/Auth/meetup.js +7 -10
  25. package/lib/Adapters/Auth/microsoft.js +7 -10
  26. package/lib/Adapters/Auth/oauth2.js +6 -18
  27. package/lib/Adapters/Auth/phantauth.js +8 -10
  28. package/lib/Adapters/Auth/qq.js +7 -13
  29. package/lib/Adapters/Auth/spotify.js +7 -14
  30. package/lib/Adapters/Auth/twitter.js +5 -15
  31. package/lib/Adapters/Auth/vkontakte.js +9 -15
  32. package/lib/Adapters/Auth/wechat.js +7 -10
  33. package/lib/Adapters/Auth/weibo.js +7 -11
  34. package/lib/Adapters/Cache/CacheAdapter.js +4 -12
  35. package/lib/Adapters/Cache/InMemoryCache.js +5 -19
  36. package/lib/Adapters/Cache/InMemoryCacheAdapter.js +1 -11
  37. package/lib/Adapters/Cache/LRUCache.js +1 -11
  38. package/lib/Adapters/Cache/NullCacheAdapter.js +1 -8
  39. package/lib/Adapters/Cache/RedisCacheAdapter.js +3 -30
  40. package/lib/Adapters/Cache/SchemaCache.js +1 -6
  41. package/lib/Adapters/Email/MailAdapter.js +2 -7
  42. package/lib/Adapters/Files/FilesAdapter.js +7 -21
  43. package/lib/Adapters/Files/GridFSBucketAdapter.js +6 -44
  44. package/lib/Adapters/Files/GridStoreAdapter.js +1 -1
  45. package/lib/Adapters/Logger/LoggerAdapter.js +2 -11
  46. package/lib/Adapters/Logger/WinstonLogger.js +3 -30
  47. package/lib/Adapters/Logger/WinstonLoggerAdapter.js +5 -16
  48. package/lib/Adapters/MessageQueue/EventEmitterMQ.js +3 -20
  49. package/lib/Adapters/PubSub/EventEmitterPubSub.js +1 -16
  50. package/lib/Adapters/PubSub/PubSubAdapter.js +2 -9
  51. package/lib/Adapters/PubSub/RedisPubSub.js +12 -7
  52. package/lib/Adapters/Push/PushAdapter.js +2 -8
  53. package/lib/Adapters/Storage/Mongo/MongoCollection.js +12 -37
  54. package/lib/Adapters/Storage/Mongo/MongoSchemaCollection.js +26 -79
  55. package/lib/Adapters/Storage/Mongo/MongoStorageAdapter.js +78 -209
  56. package/lib/Adapters/Storage/Mongo/MongoTransform.js +82 -371
  57. package/lib/Adapters/Storage/Postgres/PostgresClient.js +1 -13
  58. package/lib/Adapters/Storage/Postgres/PostgresConfigParser.js +1 -20
  59. package/lib/Adapters/Storage/Postgres/PostgresStorageAdapter.js +119 -446
  60. package/lib/Adapters/Storage/Postgres/sql/index.js +4 -7
  61. package/lib/Adapters/Storage/StorageAdapter.js +1 -1
  62. package/lib/Adapters/WebSocketServer/WSAdapter.js +3 -12
  63. package/lib/Adapters/WebSocketServer/WSSAdapter.js +7 -12
  64. package/lib/Auth.js +68 -121
  65. package/lib/ClientSDK.js +3 -11
  66. package/lib/Config.js +73 -115
  67. package/lib/Controllers/AdaptableController.js +6 -18
  68. package/lib/Controllers/AnalyticsController.js +1 -9
  69. package/lib/Controllers/CacheController.js +3 -23
  70. package/lib/Controllers/DatabaseController.js +171 -364
  71. package/lib/Controllers/FilesController.js +5 -34
  72. package/lib/Controllers/HooksController.js +1 -51
  73. package/lib/Controllers/LiveQueryController.js +4 -23
  74. package/lib/Controllers/LoggerController.js +15 -54
  75. package/lib/Controllers/ParseGraphQLController.js +49 -104
  76. package/lib/Controllers/PushController.js +20 -59
  77. package/lib/Controllers/SchemaController.js +162 -348
  78. package/lib/Controllers/UserController.js +17 -78
  79. package/lib/Controllers/index.js +19 -68
  80. package/lib/Controllers/types.js +1 -1
  81. package/lib/Deprecator/Deprecations.js +1 -1
  82. package/lib/Deprecator/Deprecator.js +9 -18
  83. package/lib/GraphQL/ParseGraphQLSchema.js +16 -100
  84. package/lib/GraphQL/ParseGraphQLServer.js +2 -29
  85. package/lib/GraphQL/helpers/objectsMutations.js +2 -12
  86. package/lib/GraphQL/helpers/objectsQueries.js +18 -76
  87. package/lib/GraphQL/loaders/defaultGraphQLMutations.js +1 -9
  88. package/lib/GraphQL/loaders/defaultGraphQLQueries.js +1 -8
  89. package/lib/GraphQL/loaders/defaultGraphQLTypes.js +9 -115
  90. package/lib/GraphQL/loaders/defaultRelaySchema.js +6 -18
  91. package/lib/GraphQL/loaders/filesMutations.js +2 -19
  92. package/lib/GraphQL/loaders/functionsMutations.js +6 -17
  93. package/lib/GraphQL/loaders/parseClassMutations.js +6 -44
  94. package/lib/GraphQL/loaders/parseClassQueries.js +1 -26
  95. package/lib/GraphQL/loaders/parseClassTypes.js +10 -64
  96. package/lib/GraphQL/loaders/schemaDirectives.js +1 -17
  97. package/lib/GraphQL/loaders/schemaMutations.js +1 -20
  98. package/lib/GraphQL/loaders/schemaQueries.js +1 -14
  99. package/lib/GraphQL/loaders/schemaTypes.js +2 -6
  100. package/lib/GraphQL/loaders/usersMutations.js +6 -28
  101. package/lib/GraphQL/loaders/usersQueries.js +4 -26
  102. package/lib/GraphQL/parseGraphQLUtils.js +6 -19
  103. package/lib/GraphQL/transformers/className.js +1 -4
  104. package/lib/GraphQL/transformers/constraintType.js +1 -20
  105. package/lib/GraphQL/transformers/inputType.js +1 -20
  106. package/lib/GraphQL/transformers/mutation.js +6 -51
  107. package/lib/GraphQL/transformers/outputType.js +1 -20
  108. package/lib/GraphQL/transformers/query.js +6 -42
  109. package/lib/GraphQL/transformers/schemaFields.js +7 -34
  110. package/lib/KeyPromiseQueue.js +1 -12
  111. package/lib/LiveQuery/Client.js +1 -25
  112. package/lib/LiveQuery/Id.js +1 -7
  113. package/lib/LiveQuery/ParseCloudCodePublisher.js +13 -19
  114. package/lib/LiveQuery/ParseLiveQueryServer.js +111 -307
  115. package/lib/LiveQuery/ParsePubSub.js +1 -12
  116. package/lib/LiveQuery/ParseWebSocketServer.js +4 -26
  117. package/lib/LiveQuery/QueryTools.js +14 -116
  118. package/lib/LiveQuery/RequestSchema.js +1 -1
  119. package/lib/LiveQuery/SessionTokenCache.js +1 -17
  120. package/lib/LiveQuery/Subscription.js +4 -18
  121. package/lib/LiveQuery/equalObjects.js +2 -14
  122. package/lib/Options/Definitions.js +88 -8
  123. package/lib/Options/docs.js +25 -3
  124. package/lib/Options/index.js +4 -12
  125. package/lib/Options/parsers.js +1 -18
  126. package/lib/Page.js +1 -9
  127. package/lib/ParseMessageQueue.js +1 -10
  128. package/lib/ParseServer.js +175 -207
  129. package/lib/ParseServerRESTController.js +6 -33
  130. package/lib/PromiseRouter.js +16 -50
  131. package/lib/Push/PushQueue.js +3 -15
  132. package/lib/Push/PushWorker.js +7 -32
  133. package/lib/Push/utils.js +9 -38
  134. package/lib/RestQuery.js +105 -242
  135. package/lib/RestWrite.js +224 -389
  136. package/lib/Routers/AggregateRouter.js +14 -51
  137. package/lib/Routers/AnalyticsRouter.js +2 -8
  138. package/lib/Routers/AudiencesRouter.js +1 -15
  139. package/lib/Routers/ClassesRouter.js +3 -53
  140. package/lib/Routers/CloudCodeRouter.js +1 -19
  141. package/lib/Routers/FeaturesRouter.js +1 -10
  142. package/lib/Routers/FilesRouter.js +29 -76
  143. package/lib/Routers/FunctionsRouter.js +5 -28
  144. package/lib/Routers/GlobalConfigRouter.js +4 -18
  145. package/lib/Routers/GraphQLRouter.js +1 -14
  146. package/lib/Routers/HooksRouter.js +1 -29
  147. package/lib/Routers/IAPValidationRouter.js +6 -29
  148. package/lib/Routers/InstallationsRouter.js +2 -12
  149. package/lib/Routers/LogsRouter.js +4 -16
  150. package/lib/Routers/PagesRouter.js +69 -129
  151. package/lib/Routers/PublicAPIRouter.js +3 -62
  152. package/lib/Routers/PurgeRouter.js +1 -15
  153. package/lib/Routers/PushRouter.js +2 -18
  154. package/lib/Routers/RolesRouter.js +1 -7
  155. package/lib/Routers/SchemasRouter.js +4 -34
  156. package/lib/Routers/SecurityRouter.js +1 -12
  157. package/lib/Routers/SessionsRouter.js +3 -19
  158. package/lib/Routers/UsersRouter.js +48 -135
  159. package/lib/SchemaMigrations/DefinedSchemas.js +56 -115
  160. package/lib/SchemaMigrations/Migrations.js +2 -8
  161. package/lib/Security/Check.js +8 -16
  162. package/lib/Security/CheckGroup.js +4 -11
  163. package/lib/Security/CheckGroups/CheckGroupDatabase.js +8 -18
  164. package/lib/Security/CheckGroups/CheckGroupServerConfig.js +5 -15
  165. package/lib/Security/CheckGroups/CheckGroups.js +1 -4
  166. package/lib/Security/CheckRunner.js +22 -41
  167. package/lib/StatusHandler.js +12 -69
  168. package/lib/TestUtils.js +1 -6
  169. package/lib/Utils.js +27 -66
  170. package/lib/batch.js +17 -28
  171. package/lib/cache.js +1 -3
  172. package/lib/cli/definitions/parse-live-query-server.js +1 -3
  173. package/lib/cli/definitions/parse-server.js +1 -3
  174. package/lib/cli/parse-live-query-server.js +1 -6
  175. package/lib/cli/parse-server.js +11 -21
  176. package/lib/cli/utils/commander.js +13 -51
  177. package/lib/cli/utils/runner.js +1 -14
  178. package/lib/cloud-code/Parse.Cloud.js +71 -81
  179. package/lib/cryptoUtils.js +11 -19
  180. package/lib/defaults.js +2 -14
  181. package/lib/deprecated.js +1 -2
  182. package/lib/index.js +16 -34
  183. package/lib/logger.js +6 -13
  184. package/lib/middlewares.js +166 -148
  185. package/lib/password.js +6 -10
  186. package/lib/request.js +8 -42
  187. package/lib/requiredParameter.js +1 -3
  188. package/lib/rest.js +25 -47
  189. package/lib/triggers.js +54 -252
  190. package/lib/vendor/mongodbUrl.js +129 -310
  191. package/package.json +13 -10
  192. package/PATENTS +0 -37
package/lib/password.js CHANGED
@@ -3,36 +3,32 @@
3
3
  // Tools for encrypting and decrypting passwords.
4
4
  // Basically promise-friendly wrappers for bcrypt.
5
5
  var bcrypt = require('bcryptjs');
6
-
7
6
  try {
8
7
  const _bcrypt = require('@node-rs/bcrypt');
9
-
10
8
  bcrypt = {
11
9
  hash: _bcrypt.hash,
12
10
  compare: _bcrypt.verify
13
11
  };
14
12
  } catch (e) {
15
13
  /* */
16
- } // Returns a promise for a hashed password string.
17
-
14
+ }
18
15
 
16
+ // Returns a promise for a hashed password string.
19
17
  function hash(password) {
20
18
  return bcrypt.hash(password, 10);
21
- } // Returns a promise for whether this password compares to equal this
22
- // hashed password.
23
-
19
+ }
24
20
 
21
+ // Returns a promise for whether this password compares to equal this
22
+ // hashed password.
25
23
  function compare(password, hashedPassword) {
26
24
  // Cannot bcrypt compare when one is undefined
27
25
  if (!password || !hashedPassword) {
28
26
  return Promise.resolve(false);
29
27
  }
30
-
31
28
  return bcrypt.compare(password, hashedPassword);
32
29
  }
33
-
34
30
  module.exports = {
35
31
  hash: hash,
36
32
  compare: compare
37
33
  };
38
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9wYXNzd29yZC5qcyJdLCJuYW1lcyI6WyJiY3J5cHQiLCJyZXF1aXJlIiwiX2JjcnlwdCIsImhhc2giLCJjb21wYXJlIiwidmVyaWZ5IiwiZSIsInBhc3N3b3JkIiwiaGFzaGVkUGFzc3dvcmQiLCJQcm9taXNlIiwicmVzb2x2ZSIsIm1vZHVsZSIsImV4cG9ydHMiXSwibWFwcGluZ3MiOiI7O0FBQUE7QUFDQTtBQUNBLElBQUlBLE1BQU0sR0FBR0MsT0FBTyxDQUFDLFVBQUQsQ0FBcEI7O0FBRUEsSUFBSTtBQUNGLFFBQU1DLE9BQU8sR0FBR0QsT0FBTyxDQUFDLGlCQUFELENBQXZCOztBQUNBRCxFQUFBQSxNQUFNLEdBQUc7QUFDUEcsSUFBQUEsSUFBSSxFQUFFRCxPQUFPLENBQUNDLElBRFA7QUFFUEMsSUFBQUEsT0FBTyxFQUFFRixPQUFPLENBQUNHO0FBRlYsR0FBVDtBQUlELENBTkQsQ0FNRSxPQUFPQyxDQUFQLEVBQVU7QUFDVjtBQUNELEMsQ0FFRDs7O0FBQ0EsU0FBU0gsSUFBVCxDQUFjSSxRQUFkLEVBQXdCO0FBQ3RCLFNBQU9QLE1BQU0sQ0FBQ0csSUFBUCxDQUFZSSxRQUFaLEVBQXNCLEVBQXRCLENBQVA7QUFDRCxDLENBRUQ7QUFDQTs7O0FBQ0EsU0FBU0gsT0FBVCxDQUFpQkcsUUFBakIsRUFBMkJDLGNBQTNCLEVBQTJDO0FBQ3pDO0FBQ0EsTUFBSSxDQUFDRCxRQUFELElBQWEsQ0FBQ0MsY0FBbEIsRUFBa0M7QUFDaEMsV0FBT0MsT0FBTyxDQUFDQyxPQUFSLENBQWdCLEtBQWhCLENBQVA7QUFDRDs7QUFDRCxTQUFPVixNQUFNLENBQUNJLE9BQVAsQ0FBZUcsUUFBZixFQUF5QkMsY0FBekIsQ0FBUDtBQUNEOztBQUVERyxNQUFNLENBQUNDLE9BQVAsR0FBaUI7QUFDZlQsRUFBQUEsSUFBSSxFQUFFQSxJQURTO0FBRWZDLEVBQUFBLE9BQU8sRUFBRUE7QUFGTSxDQUFqQiIsInNvdXJjZXNDb250ZW50IjpbIi8vIFRvb2xzIGZvciBlbmNyeXB0aW5nIGFuZCBkZWNyeXB0aW5nIHBhc3N3b3Jkcy5cbi8vIEJhc2ljYWxseSBwcm9taXNlLWZyaWVuZGx5IHdyYXBwZXJzIGZvciBiY3J5cHQuXG52YXIgYmNyeXB0ID0gcmVxdWlyZSgnYmNyeXB0anMnKTtcblxudHJ5IHtcbiAgY29uc3QgX2JjcnlwdCA9IHJlcXVpcmUoJ0Bub2RlLXJzL2JjcnlwdCcpO1xuICBiY3J5cHQgPSB7XG4gICAgaGFzaDogX2JjcnlwdC5oYXNoLFxuICAgIGNvbXBhcmU6IF9iY3J5cHQudmVyaWZ5LFxuICB9O1xufSBjYXRjaCAoZSkge1xuICAvKiAqL1xufVxuXG4vLyBSZXR1cm5zIGEgcHJvbWlzZSBmb3IgYSBoYXNoZWQgcGFzc3dvcmQgc3RyaW5nLlxuZnVuY3Rpb24gaGFzaChwYXNzd29yZCkge1xuICByZXR1cm4gYmNyeXB0Lmhhc2gocGFzc3dvcmQsIDEwKTtcbn1cblxuLy8gUmV0dXJucyBhIHByb21pc2UgZm9yIHdoZXRoZXIgdGhpcyBwYXNzd29yZCBjb21wYXJlcyB0byBlcXVhbCB0aGlzXG4vLyBoYXNoZWQgcGFzc3dvcmQuXG5mdW5jdGlvbiBjb21wYXJlKHBhc3N3b3JkLCBoYXNoZWRQYXNzd29yZCkge1xuICAvLyBDYW5ub3QgYmNyeXB0IGNvbXBhcmUgd2hlbiBvbmUgaXMgdW5kZWZpbmVkXG4gIGlmICghcGFzc3dvcmQgfHwgIWhhc2hlZFBhc3N3b3JkKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShmYWxzZSk7XG4gIH1cbiAgcmV0dXJuIGJjcnlwdC5jb21wYXJlKHBhc3N3b3JkLCBoYXNoZWRQYXNzd29yZCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBoYXNoOiBoYXNoLFxuICBjb21wYXJlOiBjb21wYXJlLFxufTtcbiJdfQ==
34
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJiY3J5cHQiLCJyZXF1aXJlIiwiX2JjcnlwdCIsImhhc2giLCJjb21wYXJlIiwidmVyaWZ5IiwiZSIsInBhc3N3b3JkIiwiaGFzaGVkUGFzc3dvcmQiLCJQcm9taXNlIiwicmVzb2x2ZSIsIm1vZHVsZSIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi9zcmMvcGFzc3dvcmQuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gVG9vbHMgZm9yIGVuY3J5cHRpbmcgYW5kIGRlY3J5cHRpbmcgcGFzc3dvcmRzLlxuLy8gQmFzaWNhbGx5IHByb21pc2UtZnJpZW5kbHkgd3JhcHBlcnMgZm9yIGJjcnlwdC5cbnZhciBiY3J5cHQgPSByZXF1aXJlKCdiY3J5cHRqcycpO1xuXG50cnkge1xuICBjb25zdCBfYmNyeXB0ID0gcmVxdWlyZSgnQG5vZGUtcnMvYmNyeXB0Jyk7XG4gIGJjcnlwdCA9IHtcbiAgICBoYXNoOiBfYmNyeXB0Lmhhc2gsXG4gICAgY29tcGFyZTogX2JjcnlwdC52ZXJpZnksXG4gIH07XG59IGNhdGNoIChlKSB7XG4gIC8qICovXG59XG5cbi8vIFJldHVybnMgYSBwcm9taXNlIGZvciBhIGhhc2hlZCBwYXNzd29yZCBzdHJpbmcuXG5mdW5jdGlvbiBoYXNoKHBhc3N3b3JkKSB7XG4gIHJldHVybiBiY3J5cHQuaGFzaChwYXNzd29yZCwgMTApO1xufVxuXG4vLyBSZXR1cm5zIGEgcHJvbWlzZSBmb3Igd2hldGhlciB0aGlzIHBhc3N3b3JkIGNvbXBhcmVzIHRvIGVxdWFsIHRoaXNcbi8vIGhhc2hlZCBwYXNzd29yZC5cbmZ1bmN0aW9uIGNvbXBhcmUocGFzc3dvcmQsIGhhc2hlZFBhc3N3b3JkKSB7XG4gIC8vIENhbm5vdCBiY3J5cHQgY29tcGFyZSB3aGVuIG9uZSBpcyB1bmRlZmluZWRcbiAgaWYgKCFwYXNzd29yZCB8fCAhaGFzaGVkUGFzc3dvcmQpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcbiAgfVxuICByZXR1cm4gYmNyeXB0LmNvbXBhcmUocGFzc3dvcmQsIGhhc2hlZFBhc3N3b3JkKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGhhc2g6IGhhc2gsXG4gIGNvbXBhcmU6IGNvbXBhcmUsXG59O1xuIl0sIm1hcHBpbmdzIjoiOztBQUFBO0FBQ0E7QUFDQSxJQUFJQSxNQUFNLEdBQUdDLE9BQU8sQ0FBQyxVQUFVLENBQUM7QUFFaEMsSUFBSTtFQUNGLE1BQU1DLE9BQU8sR0FBR0QsT0FBTyxDQUFDLGlCQUFpQixDQUFDO0VBQzFDRCxNQUFNLEdBQUc7SUFDUEcsSUFBSSxFQUFFRCxPQUFPLENBQUNDLElBQUk7SUFDbEJDLE9BQU8sRUFBRUYsT0FBTyxDQUFDRztFQUNuQixDQUFDO0FBQ0gsQ0FBQyxDQUFDLE9BQU9DLENBQUMsRUFBRTtFQUNWO0FBQUE7O0FBR0Y7QUFDQSxTQUFTSCxJQUFJLENBQUNJLFFBQVEsRUFBRTtFQUN0QixPQUFPUCxNQUFNLENBQUNHLElBQUksQ0FBQ0ksUUFBUSxFQUFFLEVBQUUsQ0FBQztBQUNsQzs7QUFFQTtBQUNBO0FBQ0EsU0FBU0gsT0FBTyxDQUFDRyxRQUFRLEVBQUVDLGNBQWMsRUFBRTtFQUN6QztFQUNBLElBQUksQ0FBQ0QsUUFBUSxJQUFJLENBQUNDLGNBQWMsRUFBRTtJQUNoQyxPQUFPQyxPQUFPLENBQUNDLE9BQU8sQ0FBQyxLQUFLLENBQUM7RUFDL0I7RUFDQSxPQUFPVixNQUFNLENBQUNJLE9BQU8sQ0FBQ0csUUFBUSxFQUFFQyxjQUFjLENBQUM7QUFDakQ7QUFFQUcsTUFBTSxDQUFDQyxPQUFPLEdBQUc7RUFDZlQsSUFBSSxFQUFFQSxJQUFJO0VBQ1ZDLE9BQU8sRUFBRUE7QUFDWCxDQUFDIn0=
package/lib/request.js CHANGED
@@ -1,23 +1,16 @@
1
1
  "use strict";
2
2
 
3
3
  var _querystring = _interopRequireDefault(require("querystring"));
4
-
5
4
  var _logger = _interopRequireDefault(require("./logger"));
6
-
7
5
  var _followRedirects = require("follow-redirects");
8
-
9
6
  var _url = require("url");
10
-
11
7
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
12
-
13
8
  class HTTPResponse {
14
9
  constructor(response, body) {
15
10
  let _text, _data;
16
-
17
11
  this.status = response.statusCode;
18
12
  this.headers = response.headers || {};
19
13
  this.cookies = this.headers['set-cookie'];
20
-
21
14
  if (typeof body == 'string') {
22
15
  _text = body;
23
16
  } else if (Buffer.isBuffer(body)) {
@@ -25,17 +18,14 @@ class HTTPResponse {
25
18
  } else if (typeof body == 'object') {
26
19
  _data = body;
27
20
  }
28
-
29
21
  const getText = () => {
30
22
  if (!_text && this.buffer) {
31
23
  _text = this.buffer.toString('utf-8');
32
24
  } else if (!_text && _data) {
33
25
  _text = JSON.stringify(_data);
34
26
  }
35
-
36
27
  return _text;
37
28
  };
38
-
39
29
  const getData = () => {
40
30
  if (!_data) {
41
31
  try {
@@ -44,10 +34,8 @@ class HTTPResponse {
44
34
  /* */
45
35
  }
46
36
  }
47
-
48
37
  return _data;
49
38
  };
50
-
51
39
  Object.defineProperty(this, 'body', {
52
40
  get: () => {
53
41
  return body;
@@ -62,14 +50,11 @@ class HTTPResponse {
62
50
  get: getData
63
51
  });
64
52
  }
65
-
66
53
  }
67
-
68
54
  const clients = {
69
55
  'http:': _followRedirects.http,
70
56
  'https:': _followRedirects.https
71
57
  };
72
-
73
58
  function makeCallback(resolve, reject) {
74
59
  return function (response) {
75
60
  const chunks = [];
@@ -78,8 +63,9 @@ function makeCallback(resolve, reject) {
78
63
  });
79
64
  response.on('end', () => {
80
65
  const body = Buffer.concat(chunks);
81
- const httpResponse = new HTTPResponse(response, body); // Consider <200 && >= 400 as errors
66
+ const httpResponse = new HTTPResponse(response, body);
82
67
 
68
+ // Consider <200 && >= 400 as errors
83
69
  if (httpResponse.status < 200 || httpResponse.status >= 400) {
84
70
  return reject(httpResponse);
85
71
  } else {
@@ -89,7 +75,6 @@ function makeCallback(resolve, reject) {
89
75
  response.on('error', reject);
90
76
  };
91
77
  }
92
-
93
78
  const encodeBody = function ({
94
79
  body,
95
80
  headers = {}
@@ -100,61 +85,51 @@ const encodeBody = function ({
100
85
  headers
101
86
  };
102
87
  }
103
-
104
88
  var contentTypeKeys = Object.keys(headers).filter(key => {
105
89
  return key.match(/content-type/i) != null;
106
90
  });
107
-
108
91
  if (contentTypeKeys.length == 0) {
109
92
  // no content type
110
93
  // As per https://parse.com/docs/cloudcode/guide#cloud-code-advanced-sending-a-post-request the default encoding is supposedly x-www-form-urlencoded
94
+
111
95
  body = _querystring.default.stringify(body);
112
96
  headers['Content-Type'] = 'application/x-www-form-urlencoded';
113
97
  } else {
114
98
  /* istanbul ignore next */
115
99
  if (contentTypeKeys.length > 1) {
116
100
  _logger.default.error('Parse.Cloud.httpRequest', 'multiple content-type headers are set.');
117
- } // There maybe many, we'll just take the 1st one
118
-
119
-
101
+ }
102
+ // There maybe many, we'll just take the 1st one
120
103
  var contentType = contentTypeKeys[0];
121
-
122
104
  if (headers[contentType].match(/application\/json/i)) {
123
105
  body = JSON.stringify(body);
124
106
  } else if (headers[contentType].match(/application\/x-www-form-urlencoded/i)) {
125
107
  body = _querystring.default.stringify(body);
126
108
  }
127
109
  }
128
-
129
110
  return {
130
111
  body,
131
112
  headers
132
113
  };
133
114
  };
134
-
135
115
  function httpRequest(options) {
136
116
  let url;
137
-
138
117
  try {
139
118
  url = (0, _url.parse)(options.url);
140
119
  } catch (e) {
141
120
  return Promise.reject(e);
142
121
  }
143
-
144
- options = Object.assign(options, encodeBody(options)); // support params options
145
-
122
+ options = Object.assign(options, encodeBody(options));
123
+ // support params options
146
124
  if (typeof options.params === 'object') {
147
125
  options.qs = options.params;
148
126
  } else if (typeof options.params === 'string') {
149
127
  options.qs = _querystring.default.parse(options.params);
150
128
  }
151
-
152
129
  const client = clients[url.protocol];
153
-
154
130
  if (!client) {
155
131
  return Promise.reject(`Unsupported protocol ${url.protocol}`);
156
132
  }
157
-
158
133
  const requestOptions = {
159
134
  method: options.method,
160
135
  port: Number(url.port),
@@ -164,7 +139,6 @@ function httpRequest(options) {
164
139
  encoding: null,
165
140
  followRedirects: options.followRedirects === true
166
141
  };
167
-
168
142
  if (requestOptions.headers) {
169
143
  Object.keys(requestOptions.headers).forEach(key => {
170
144
  if (typeof requestOptions.headers[key] === 'undefined') {
@@ -172,38 +146,30 @@ function httpRequest(options) {
172
146
  }
173
147
  });
174
148
  }
175
-
176
149
  if (url.search) {
177
150
  options.qs = Object.assign({}, options.qs, _querystring.default.parse(url.query));
178
151
  }
179
-
180
152
  if (url.auth) {
181
153
  requestOptions.auth = url.auth;
182
154
  }
183
-
184
155
  if (options.qs) {
185
156
  requestOptions.path += `?${_querystring.default.stringify(options.qs)}`;
186
157
  }
187
-
188
158
  if (options.agent) {
189
159
  requestOptions.agent = options.agent;
190
160
  }
191
-
192
161
  return new Promise((resolve, reject) => {
193
162
  const req = client.request(requestOptions, makeCallback(resolve, reject, options));
194
-
195
163
  if (options.body) {
196
164
  req.write(options.body);
197
165
  }
198
-
199
166
  req.on('error', error => {
200
167
  reject(error);
201
168
  });
202
169
  req.end();
203
170
  });
204
171
  }
205
-
206
172
  module.exports = httpRequest;
207
173
  module.exports.encodeBody = encodeBody;
208
174
  module.exports.HTTPResponse = HTTPResponse;
209
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9yZXF1ZXN0LmpzIl0sIm5hbWVzIjpbIkhUVFBSZXNwb25zZSIsImNvbnN0cnVjdG9yIiwicmVzcG9uc2UiLCJib2R5IiwiX3RleHQiLCJfZGF0YSIsInN0YXR1cyIsInN0YXR1c0NvZGUiLCJoZWFkZXJzIiwiY29va2llcyIsIkJ1ZmZlciIsImlzQnVmZmVyIiwiYnVmZmVyIiwiZ2V0VGV4dCIsInRvU3RyaW5nIiwiSlNPTiIsInN0cmluZ2lmeSIsImdldERhdGEiLCJwYXJzZSIsImUiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldCIsImVudW1lcmFibGUiLCJjbGllbnRzIiwiaHR0cCIsImh0dHBzIiwibWFrZUNhbGxiYWNrIiwicmVzb2x2ZSIsInJlamVjdCIsImNodW5rcyIsIm9uIiwiY2h1bmsiLCJwdXNoIiwiY29uY2F0IiwiaHR0cFJlc3BvbnNlIiwiZW5jb2RlQm9keSIsImNvbnRlbnRUeXBlS2V5cyIsImtleXMiLCJmaWx0ZXIiLCJrZXkiLCJtYXRjaCIsImxlbmd0aCIsInF1ZXJ5c3RyaW5nIiwibG9nIiwiZXJyb3IiLCJjb250ZW50VHlwZSIsImh0dHBSZXF1ZXN0Iiwib3B0aW9ucyIsInVybCIsIlByb21pc2UiLCJhc3NpZ24iLCJwYXJhbXMiLCJxcyIsImNsaWVudCIsInByb3RvY29sIiwicmVxdWVzdE9wdGlvbnMiLCJtZXRob2QiLCJwb3J0IiwiTnVtYmVyIiwicGF0aCIsInBhdGhuYW1lIiwiaG9zdG5hbWUiLCJlbmNvZGluZyIsImZvbGxvd1JlZGlyZWN0cyIsImZvckVhY2giLCJzZWFyY2giLCJxdWVyeSIsImF1dGgiLCJhZ2VudCIsInJlcSIsInJlcXVlc3QiLCJ3cml0ZSIsImVuZCIsIm1vZHVsZSIsImV4cG9ydHMiXSwibWFwcGluZ3MiOiI7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7Ozs7QUFFQSxNQUFNQSxZQUFOLENBQW1CO0FBQ2pCQyxFQUFBQSxXQUFXLENBQUNDLFFBQUQsRUFBV0MsSUFBWCxFQUFp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QUNZLElBQWYsR0FBc0JuQixHQUFHLENBQUNtQixJQUExQjtBQUNEOztBQUNELE1BQUlwQixPQUFPLENBQUNLLEVBQVosRUFBZ0I7QUFDZEcsSUFBQUEsY0FBYyxDQUFDSSxJQUFmLElBQXdCLElBQUdqQixxQkFBWTNCLFNBQVosQ0FBc0JnQyxPQUFPLENBQUNLLEVBQTlCLENBQWtDLEVBQTdEO0FBQ0Q7O0FBQ0QsTUFBSUwsT0FBTyxDQUFDcUIsS0FBWixFQUFtQjtBQUNqQmIsSUFBQUEsY0FBYyxDQUFDYSxLQUFmLEdBQXVCckIsT0FBTyxDQUFDcUIsS0FBL0I7QUFDRDs7QUFDRCxTQUFPLElBQUluQixPQUFKLENBQVksQ0FBQ3RCLE9BQUQsRUFBVUMsTUFBVixLQUFxQjtBQUN0QyxVQUFNeUMsR0FBRyxHQUFHaEIsTUFBTSxDQUFDaUIsT0FBUCxDQUFlZixjQUFmLEVBQStCN0IsWUFBWSxDQUFDQyxPQUFELEVBQVVDLE1BQVYsRUFBa0JtQixPQUFsQixDQUEzQyxDQUFaOztBQUNBLFFBQUlBLE9BQU8sQ0FBQzdDLElBQVosRUFBa0I7QUFDaEJtRSxNQUFBQSxHQUFHLENBQUNFLEtBQUosQ0FBVXhCLE9BQU8sQ0FBQzdDLElBQWxCO0FBQ0Q7O0FBQ0RtRSxJQUFBQSxHQUFHLENBQUN2QyxFQUFKLENBQU8sT0FBUCxFQUFnQmMsS0FBSyxJQUFJO0FBQ3ZCaEIsTUFBQUEsTUFBTSxDQUFDZ0IsS0FBRCxDQUFOO0FBQ0QsS0FGRDtBQUdBeUIsSUFBQUEsR0FBRyxDQUFDRyxHQUFKO0FBQ0QsR0FUTSxDQUFQO0FBVUQ7O0FBQ0RDLE1BQU0sQ0FBQ0MsT0FBUCxHQUFpQjVCLFdBQWpCO0FBQ0EyQixNQUFNLENBQUNDLE9BQVAsQ0FBZXZDLFVBQWYsR0FBNEJBLFVBQTVCO0FBQ0FzQyxNQUFNLENBQUNDLE9BQVAsQ0FBZTNFLFlBQWYsR0FBOEJBLFlBQTlCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHF1ZXJ5c3RyaW5nIGZyb20gJ3F1ZXJ5c3RyaW5nJztcbmltcG9ydCBsb2cgZnJvbSAnLi9sb2dnZXInO1xuaW1wb3J0IHsgaHR0cCwgaHR0cHMgfSBmcm9tICdmb2xsb3ctcmVkaXJlY3RzJztcbmltcG9ydCB7IHBhcnNlIH0gZnJvbSAndXJsJztcblxuY2xhc3MgSFRUUFJlc3BvbnNlIHtcbiAgY29uc3RydWN0b3IocmVzcG9uc2UsIGJvZHkpIHtcbiAgICBsZXQgX3RleHQsIF9kYXRhO1xuICAgIHRoaXMuc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzQ29kZTtcbiAgICB0aGlzLmhlYWRlcnMgPSByZXNwb25zZS5oZWFkZXJzIHx8IHt9O1xuICAgIHRoaXMuY29va2llcyA9IHRoaXMuaGVhZGVyc1snc2V0LWNvb2tpZSddO1xuXG4gICAgaWYgKHR5cGVvZiBib2R5ID09ICdzdHJpbmcnKSB7XG4gICAgICBfdGV4dCA9IGJvZHk7XG4gICAgfSBlbHNlIGlmIChCdWZmZXIuaXNCdWZmZXIoYm9keSkpIHtcbiAgICAgIHRoaXMuYnVmZmVyID0gYm9keTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBib2R5ID09ICdvYmplY3QnKSB7XG4gICAgICBfZGF0YSA9IGJvZHk7XG4gICAgfVxuXG4gICAgY29uc3QgZ2V0VGV4dCA9ICgpID0+IHtcbiAgICAgIGlmICghX3RleHQgJiYgdGhpcy5idWZmZXIpIHtcbiAgICAgICAgX3RleHQgPSB0aGlzLmJ1ZmZlci50b1N0cmluZygndXRmLTgnKTtcbiAgICAgIH0gZWxzZSBpZiAoIV90ZXh0ICYmIF9kYXRhKSB7XG4gICAgICAgIF90ZXh0ID0gSlNPTi5zdHJpbmdpZnkoX2RhdGEpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIF90ZXh0O1xuICAgIH07XG5cbiAgICBjb25zdCBnZXREYXRhID0gKCkgPT4ge1xuICAgICAgaWYgKCFfZGF0YSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIF9kYXRhID0gSlNPTi5wYXJzZShnZXRUZXh0KCkpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgLyogKi9cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIF9kYXRhO1xuICAgIH07XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ2JvZHknLCB7XG4gICAgICBnZXQ6ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIGJvZHk7XG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICd0ZXh0Jywge1xuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIGdldDogZ2V0VGV4dCxcbiAgICB9KTtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnZGF0YScsIHtcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICBnZXQ6IGdldERhdGEsXG4gICAgfSk7XG4gIH1cbn1cblxuY29uc3QgY2xpZW50cyA9IHtcbiAgJ2h0dHA6JzogaHR0cCxcbiAgJ2h0dHBzOic6IGh0dHBzLFxufTtcblxuZnVuY3Rpb24gbWFrZUNhbGxiYWNrKHJlc29sdmUsIHJlamVjdCkge1xuICByZXR1cm4gZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG4gICAgY29uc3QgY2h1bmtzID0gW107XG4gICAgcmVzcG9uc2Uub24oJ2RhdGEnLCBjaHVuayA9PiB7XG4gICAgICBjaHVua3MucHVzaChjaHVuayk7XG4gICAgfSk7XG4gICAgcmVzcG9uc2Uub24oJ2VuZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IGJvZHkgPSBCdWZmZXIuY29uY2F0KGNodW5rcyk7XG4gICAgICBjb25zdCBodHRwUmVzcG9uc2UgPSBuZXcgSFRUUFJlc3BvbnNlKHJlc3BvbnNlLCBib2R5KTtcblxuICAgICAgLy8gQ29uc2lkZXIgPDIwMCAmJiA+PSA0MDAgYXMgZXJyb3JzXG4gICAgICBpZiAoaHR0cFJlc3BvbnNlLnN0YXR1cyA8IDIwMCB8fCBodHRwUmVzcG9uc2Uuc3RhdHVzID49IDQwMCkge1xuICAgICAgICByZXR1cm4gcmVqZWN0KGh0dHBSZXNwb25zZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gcmVzb2x2ZShodHRwUmVzcG9uc2UpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJlc3BvbnNlLm9uKCdlcnJvcicsIHJlamVjdCk7XG4gIH07XG59XG5cbmNvbnN0IGVuY29kZUJvZHkgPSBmdW5jdGlvbiAoeyBib2R5LCBoZWFkZXJzID0ge30gfSkge1xuICBpZiAodHlwZW9mIGJvZHkgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIHsgYm9keSwgaGVhZGVycyB9O1xuICB9XG4gIHZhciBjb250ZW50VHlwZUtleXMgPSBPYmplY3Qua2V5cyhoZWFkZXJzKS5maWx0ZXIoa2V5ID0+IHtcbiAgICByZXR1cm4ga2V5Lm1hdGNoKC9jb250ZW50LXR5cGUvaSkgIT0gbnVsbDtcbiAgfSk7XG5cbiAgaWYgKGNvbnRlbnRUeXBlS2V5cy5sZW5ndGggPT0gMCkge1xuICAgIC8vIG5vIGNvbnRlbnQgdHlwZVxuICAgIC8vICBBcyBwZXIgaHR0cHM6Ly9wYXJzZS5jb20vZG9jcy9jbG91ZGNvZGUvZ3VpZGUjY2xvdWQtY29kZS1hZHZhbmNlZC1zZW5kaW5nLWEtcG9zdC1yZXF1ZXN0IHRoZSBkZWZhdWx0IGVuY29kaW5nIGlzIHN1cHBvc2VkbHkgeC13d3ctZm9ybS11cmxlbmNvZGVkXG5cbiAgICBib2R5ID0gcXVlcnlzdHJpbmcuc3RyaW5naWZ5KGJvZHkpO1xuICAgIGhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCc7XG4gIH0gZWxzZSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICBpZiAoY29udGVudFR5cGVLZXlzLmxlbmd0aCA+IDEpIHtcbiAgICAgIGxvZy5lcnJvcignUGFyc2UuQ2xvdWQuaHR0cFJlcXVlc3QnLCAnbXVsdGlwbGUgY29udGVudC10eXBlIGhlYWRlcnMgYXJlIHNldC4nKTtcbiAgICB9XG4gICAgLy8gVGhlcmUgbWF5YmUgbWFueSwgd2UnbGwganVzdCB0YWtlIHRoZSAxc3Qgb25lXG4gICAgdmFyIGNvbnRlbnRUeXBlID0gY29udGVudFR5cGVLZXlzWzBdO1xuICAgIGlmIChoZWFkZXJzW2NvbnRlbnRUeXBlXS5tYXRjaCgvYXBwbGljYXRpb25cXC9qc29uL2kpKSB7XG4gICAgICBib2R5ID0gSlNPTi5zdHJpbmdpZnkoYm9keSk7XG4gICAgfSBlbHNlIGlmIChoZWFkZXJzW2NvbnRlbnRUeXBlXS5tYXRjaCgvYXBwbGljYXRpb25cXC94LXd3dy1mb3JtLXVybGVuY29kZWQvaSkpIHtcbiAgICAgIGJvZHkgPSBxdWVyeXN0cmluZy5zdHJpbmdpZnkoYm9keSk7XG4gICAgfVxuICB9XG4gIHJldHVybiB7IGJvZHksIGhlYWRlcnMgfTtcbn07XG5cbmZ1bmN0aW9uIGh0dHBSZXF1ZXN0KG9wdGlvbnMpIHtcbiAgbGV0IHVybDtcbiAgdHJ5IHtcbiAgICB1cmwgPSBwYXJzZShvcHRpb25zLnVybCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZSk7XG4gIH1cbiAgb3B0aW9ucyA9IE9iamVjdC5hc3NpZ24ob3B0aW9ucywgZW5jb2RlQm9keShvcHRpb25zKSk7XG4gIC8vIHN1cHBvcnQgcGFyYW1zIG9wdGlvbnNcbiAgaWYgKHR5cGVvZiBvcHRpb25zLnBhcmFtcyA9PT0gJ29iamVjdCcpIHtcbiAgICBvcHRpb25zLnFzID0gb3B0aW9ucy5wYXJhbXM7XG4gIH0gZWxzZSBpZiAodHlwZW9mIG9wdGlvbnMucGFyYW1zID09PSAnc3RyaW5nJykge1xuICAgIG9wdGlvbnMucXMgPSBxdWVyeXN0cmluZy5wYXJzZShvcHRpb25zLnBhcmFtcyk7XG4gIH1cbiAgY29uc3QgY2xpZW50ID0gY2xpZW50c1t1cmwucHJvdG9jb2xdO1xuICBpZiAoIWNsaWVudCkge1xuICAgIHJldHVybiBQcm9taXNlLnJlamVjdChgVW5zdXBwb3J0ZWQgcHJvdG9jb2wgJHt1cmwucHJvdG9jb2x9YCk7XG4gIH1cbiAgY29uc3QgcmVxdWVzdE9wdGlvbnMgPSB7XG4gICAgbWV0aG9kOiBvcHRpb25zLm1ldGhvZCxcbiAgICBwb3J0OiBOdW1iZXIodXJsLnBvcnQpLFxuICAgIHBhdGg6IHVybC5wYXRobmFtZSxcbiAgICBob3N0bmFtZTogdXJsLmhvc3RuYW1lLFxuICAgIGhlYWRlcnM6IG9wdGlvbnMuaGVhZGVycyxcbiAgICBlbmNvZGluZzogbnVsbCxcbiAgICBmb2xsb3dSZWRpcmVjdHM6IG9wdGlvbnMuZm9sbG93UmVkaXJlY3RzID09PSB0cnVlLFxuICB9O1xuICBpZiAocmVxdWVzdE9wdGlvbnMuaGVhZGVycykge1xuICAgIE9iamVjdC5rZXlzKHJlcXVlc3RPcHRpb25zLmhlYWRlcnMpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgIGlmICh0eXBlb2YgcmVxdWVzdE9wdGlvbnMuaGVhZGVyc1trZXldID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICBkZWxldGUgcmVxdWVzdE9wdGlvbnMuaGVhZGVyc1trZXldO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIGlmICh1cmwuc2VhcmNoKSB7XG4gICAgb3B0aW9ucy5xcyA9IE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMucXMsIHF1ZXJ5c3RyaW5nLnBhcnNlKHVybC5xdWVyeSkpO1xuICB9XG4gIGlmICh1cmwuYXV0aCkge1xuICAgIHJlcXVlc3RPcHRpb25zLmF1dGggPSB1cmwuYXV0aDtcbiAgfVxuICBpZiAob3B0aW9ucy5xcykge1xuICAgIHJlcXVlc3RPcHRpb25zLnBhdGggKz0gYD8ke3F1ZXJ5c3RyaW5nLnN0cmluZ2lmeShvcHRpb25zLnFzKX1gO1xuICB9XG4gIGlmIChvcHRpb25zLmFnZW50KSB7XG4gICAgcmVxdWVzdE9wdGlvbnMuYWdlbnQgPSBvcHRpb25zLmFnZW50O1xuICB9XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3QgcmVxID0gY2xpZW50LnJlcXVlc3QocmVxdWVzdE9wdGlvbnMsIG1ha2VDYWxsYmFjayhyZXNvbHZlLCByZWplY3QsIG9wdGlvbnMpKTtcbiAgICBpZiAob3B0aW9ucy5ib2R5KSB7XG4gICAgICByZXEud3JpdGUob3B0aW9ucy5ib2R5KTtcbiAgICB9XG4gICAgcmVxLm9uKCdlcnJvcicsIGVycm9yID0+IHtcbiAgICAgIHJlamVjdChlcnJvcik7XG4gICAgfSk7XG4gICAgcmVxLmVuZCgpO1xuICB9KTtcbn1cbm1vZHVsZS5leHBvcnRzID0gaHR0cFJlcXVlc3Q7XG5tb2R1bGUuZXhwb3J0cy5lbmNvZGVCb2R5ID0gZW5jb2RlQm9keTtcbm1vZHVsZS5leHBvcnRzLkhUVFBSZXNwb25zZSA9IEhUVFBSZXNwb25zZTtcbiJdfQ==
175
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJIVFRQUmVzcG9uc2UiLCJjb25zdHJ1Y3RvciIsInJlc3BvbnNlIiwiYm9keSIsIl90ZXh0IiwiX2RhdGEiLCJzdGF0dXMiLCJzdGF0dXNDb2RlIiwiaGVhZGVycyIsImNvb2tpZXMiLCJCdWZmZXIiLCJpc0J1ZmZlciIsImJ1ZmZlciIsImdldFRleHQiLCJ0b1N0cmluZyIsIkpTT04iLCJzdHJpbmdpZnkiLCJnZXREYXRhIiwicGFyc2UiLCJlIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXQiLCJlbnVtZXJhYmxlIiwiY2xpZW50cyIsImh0dHAiLCJodHRwcyIsIm1ha2VDYWxsYmFjayIsInJlc29sdmUiLCJyZWplY3QiLCJjaHVua3MiLCJvbiIsImNodW5rIiwicHVzaCIsImNvbmNhdCIsImh0dHBSZXNwb25zZSIsImVuY29kZUJvZHkiLCJjb250ZW50VHlwZUtleXMiLCJrZXlzIiwiZmlsdGVyIiwia2V5IiwibWF0Y2giLCJsZW5ndGgiLCJxdWVyeXN0cmluZyIsImxvZyIsImVycm9yIiwiY29udGVudFR5cGUiLCJodHRwUmVxdWVzdCIsIm9wdGlvbnMiLCJ1cmwiLCJQcm9taXNlIiwiYXNzaWduIiwicGFyYW1zIiwicXMiLCJjbGllbnQiLCJwcm90b2NvbCIsInJlcXVlc3RPcHRpb25zIiwibWV0aG9kIiwicG9ydCIsIk51bWJlciIsInBhdGgiLCJwYXRobmFtZSIsImhvc3RuYW1lIiwiZW5jb2RpbmciLCJmb2xsb3dSZWRpcmVjdHMiLCJmb3JFYWNoIiwic2VhcmNoIiwicXVlcnkiLCJhdXRoIiwiYWdlbnQiLCJyZXEiLCJyZXF1ZXN0Iiwid3JpdGUiLCJlbmQiLCJtb2R1bGUiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vc3JjL3JlcXVlc3QuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHF1ZXJ5c3RyaW5nIGZyb20gJ3F1ZXJ5c3RyaW5nJztcbmltcG9ydCBsb2cgZnJvbSAnLi9sb2dnZXInO1xuaW1wb3J0IHsgaHR0cCwgaHR0cHMgfSBmcm9tICdmb2xsb3ctcmVkaXJlY3RzJztcbmltcG9ydCB7IHBhcnNlIH0gZnJvbSAndXJsJztcblxuY2xhc3MgSFRUUFJlc3BvbnNlIHtcbiAgY29uc3RydWN0b3IocmVzcG9uc2UsIGJvZHkpIHtcbiAgICBsZXQgX3RleHQsIF9kYXRhO1xuICAgIHRoaXMuc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzQ29kZTtcbiAgICB0aGlzLmhlYWRlcnMgPSByZXNwb25zZS5oZWFkZXJzIHx8IHt9O1xuICAgIHRoaXMuY29va2llcyA9IHRoaXMuaGVhZGVyc1snc2V0LWNvb2tpZSddO1xuXG4gICAgaWYgKHR5cGVvZiBib2R5ID09ICdzdHJpbmcnKSB7XG4gICAgICBfdGV4dCA9IGJvZHk7XG4gICAgfSBlbHNlIGlmIChCdWZmZXIuaXNCdWZmZXIoYm9keSkpIHtcbiAgICAgIHRoaXMuYnVmZmVyID0gYm9keTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBib2R5ID09ICdvYmplY3QnKSB7XG4gICAgICBfZGF0YSA9IGJvZHk7XG4gICAgfVxuXG4gICAgY29uc3QgZ2V0VGV4dCA9ICgpID0+IHtcbiAgICAgIGlmICghX3RleHQgJiYgdGhpcy5idWZmZXIpIHtcbiAgICAgICAgX3RleHQgPSB0aGlzLmJ1ZmZlci50b1N0cmluZygndXRmLTgnKTtcbiAgICAgIH0gZWxzZSBpZiAoIV90ZXh0ICYmIF9kYXRhKSB7XG4gICAgICAgIF90ZXh0ID0gSlNPTi5zdHJpbmdpZnkoX2RhdGEpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIF90ZXh0O1xuICAgIH07XG5cbiAgICBjb25zdCBnZXREYXRhID0gKCkgPT4ge1xuICAgICAgaWYgKCFfZGF0YSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIF9kYXRhID0gSlNPTi5wYXJzZShnZXRUZXh0KCkpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgLyogKi9cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIF9kYXRhO1xuICAgIH07XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ2JvZHknLCB7XG4gICAgICBnZXQ6ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIGJvZHk7XG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICd0ZXh0Jywge1xuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIGdldDogZ2V0VGV4dCxcbiAgICB9KTtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnZGF0YScsIHtcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICBnZXQ6IGdldERhdGEsXG4gICAgfSk7XG4gIH1cbn1cblxuY29uc3QgY2xpZW50cyA9IHtcbiAgJ2h0dHA6JzogaHR0cCxcbiAgJ2h0dHBzOic6IGh0dHBzLFxufTtcblxuZnVuY3Rpb24gbWFrZUNhbGxiYWNrKHJlc29sdmUsIHJlamVjdCkge1xuICByZXR1cm4gZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG4gICAgY29uc3QgY2h1bmtzID0gW107XG4gICAgcmVzcG9uc2Uub24oJ2RhdGEnLCBjaHVuayA9PiB7XG4gICAgICBjaHVua3MucHVzaChjaHVuayk7XG4gICAgfSk7XG4gICAgcmVzcG9uc2Uub24oJ2VuZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IGJvZHkgPSBCdWZmZXIuY29uY2F0KGNodW5rcyk7XG4gICAgICBjb25zdCBodHRwUmVzcG9uc2UgPSBuZXcgSFRUUFJlc3BvbnNlKHJlc3BvbnNlLCBib2R5KTtcblxuICAgICAgLy8gQ29uc2lkZXIgPDIwMCAmJiA+PSA0MDAgYXMgZXJyb3JzXG4gICAgICBpZiAoaHR0cFJlc3BvbnNlLnN0YXR1cyA8IDIwMCB8fCBodHRwUmVzcG9uc2Uuc3RhdHVzID49IDQwMCkge1xuICAgICAgICByZXR1cm4gcmVqZWN0KGh0dHBSZXNwb25zZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gcmVzb2x2ZShodHRwUmVzcG9uc2UpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJlc3BvbnNlLm9uKCdlcnJvcicsIHJlamVjdCk7XG4gIH07XG59XG5cbmNvbnN0IGVuY29kZUJvZHkgPSBmdW5jdGlvbiAoeyBib2R5LCBoZWFkZXJzID0ge30gfSkge1xuICBpZiAodHlwZW9mIGJvZHkgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIHsgYm9keSwgaGVhZGVycyB9O1xuICB9XG4gIHZhciBjb250ZW50VHlwZUtleXMgPSBPYmplY3Qua2V5cyhoZWFkZXJzKS5maWx0ZXIoa2V5ID0+IHtcbiAgICByZXR1cm4ga2V5Lm1hdGNoKC9jb250ZW50LXR5cGUvaSkgIT0gbnVsbDtcbiAgfSk7XG5cbiAgaWYgKGNvbnRlbnRUeXBlS2V5cy5sZW5ndGggPT0gMCkge1xuICAgIC8vIG5vIGNvbnRlbnQgdHlwZVxuICAgIC8vICBBcyBwZXIgaHR0cHM6Ly9wYXJzZS5jb20vZG9jcy9jbG91ZGNvZGUvZ3VpZGUjY2xvdWQtY29kZS1hZHZhbmNlZC1zZW5kaW5nLWEtcG9zdC1yZXF1ZXN0IHRoZSBkZWZhdWx0IGVuY29kaW5nIGlzIHN1cHBvc2VkbHkgeC13d3ctZm9ybS11cmxlbmNvZGVkXG5cbiAgICBib2R5ID0gcXVlcnlzdHJpbmcuc3RyaW5naWZ5KGJvZHkpO1xuICAgIGhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCc7XG4gIH0gZWxzZSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICBpZiAoY29udGVudFR5cGVLZXlzLmxlbmd0aCA+IDEpIHtcbiAgICAgIGxvZy5lcnJvcignUGFyc2UuQ2xvdWQuaHR0cFJlcXVlc3QnLCAnbXVsdGlwbGUgY29udGVudC10eXBlIGhlYWRlcnMgYXJlIHNldC4nKTtcbiAgICB9XG4gICAgLy8gVGhlcmUgbWF5YmUgbWFueSwgd2UnbGwganVzdCB0YWtlIHRoZSAxc3Qgb25lXG4gICAgdmFyIGNvbnRlbnRUeXBlID0gY29udGVudFR5cGVLZXlzWzBdO1xuICAgIGlmIChoZWFkZXJzW2NvbnRlbnRUeXBlXS5tYXRjaCgvYXBwbGljYXRpb25cXC9qc29uL2kpKSB7XG4gICAgICBib2R5ID0gSlNPTi5zdHJpbmdpZnkoYm9keSk7XG4gICAgfSBlbHNlIGlmIChoZWFkZXJzW2NvbnRlbnRUeXBlXS5tYXRjaCgvYXBwbGljYXRpb25cXC94LXd3dy1mb3JtLXVybGVuY29kZWQvaSkpIHtcbiAgICAgIGJvZHkgPSBxdWVyeXN0cmluZy5zdHJpbmdpZnkoYm9keSk7XG4gICAgfVxuICB9XG4gIHJldHVybiB7IGJvZHksIGhlYWRlcnMgfTtcbn07XG5cbmZ1bmN0aW9uIGh0dHBSZXF1ZXN0KG9wdGlvbnMpIHtcbiAgbGV0IHVybDtcbiAgdHJ5IHtcbiAgICB1cmwgPSBwYXJzZShvcHRpb25zLnVybCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZSk7XG4gIH1cbiAgb3B0aW9ucyA9IE9iamVjdC5hc3NpZ24ob3B0aW9ucywgZW5jb2RlQm9keShvcHRpb25zKSk7XG4gIC8vIHN1cHBvcnQgcGFyYW1zIG9wdGlvbnNcbiAgaWYgKHR5cGVvZiBvcHRpb25zLnBhcmFtcyA9PT0gJ29iamVjdCcpIHtcbiAgICBvcHRpb25zLnFzID0gb3B0aW9ucy5wYXJhbXM7XG4gIH0gZWxzZSBpZiAodHlwZW9mIG9wdGlvbnMucGFyYW1zID09PSAnc3RyaW5nJykge1xuICAgIG9wdGlvbnMucXMgPSBxdWVyeXN0cmluZy5wYXJzZShvcHRpb25zLnBhcmFtcyk7XG4gIH1cbiAgY29uc3QgY2xpZW50ID0gY2xpZW50c1t1cmwucHJvdG9jb2xdO1xuICBpZiAoIWNsaWVudCkge1xuICAgIHJldHVybiBQcm9taXNlLnJlamVjdChgVW5zdXBwb3J0ZWQgcHJvdG9jb2wgJHt1cmwucHJvdG9jb2x9YCk7XG4gIH1cbiAgY29uc3QgcmVxdWVzdE9wdGlvbnMgPSB7XG4gICAgbWV0aG9kOiBvcHRpb25zLm1ldGhvZCxcbiAgICBwb3J0OiBOdW1iZXIodXJsLnBvcnQpLFxuICAgIHBhdGg6IHVybC5wYXRobmFtZSxcbiAgICBob3N0bmFtZTogdXJsLmhvc3RuYW1lLFxuICAgIGhlYWRlcnM6IG9wdGlvbnMuaGVhZGVycyxcbiAgICBlbmNvZGluZzogbnVsbCxcbiAgICBmb2xsb3dSZWRpcmVjdHM6IG9wdGlvbnMuZm9sbG93UmVkaXJlY3RzID09PSB0cnVlLFxuICB9O1xuICBpZiAocmVxdWVzdE9wdGlvbnMuaGVhZGVycykge1xuICAgIE9iamVjdC5rZXlzKHJlcXVlc3RPcHRpb25zLmhlYWRlcnMpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgIGlmICh0eXBlb2YgcmVxdWVzdE9wdGlvbnMuaGVhZGVyc1trZXldID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICBkZWxldGUgcmVxdWVzdE9wdGlvbnMuaGVhZGVyc1trZXldO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIGlmICh1cmwuc2VhcmNoKSB7XG4gICAgb3B0aW9ucy5xcyA9IE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMucXMsIHF1ZXJ5c3RyaW5nLnBhcnNlKHVybC5xdWVyeSkpO1xuICB9XG4gIGlmICh1cmwuYXV0aCkge1xuICAgIHJlcXVlc3RPcHRpb25zLmF1dGggPSB1cmwuYXV0aDtcbiAgfVxuICBpZiAob3B0aW9ucy5xcykge1xuICAgIHJlcXVlc3RPcHRpb25zLnBhdGggKz0gYD8ke3F1ZXJ5c3RyaW5nLnN0cmluZ2lmeShvcHRpb25zLnFzKX1gO1xuICB9XG4gIGlmIChvcHRpb25zLmFnZW50KSB7XG4gICAgcmVxdWVzdE9wdGlvbnMuYWdlbnQgPSBvcHRpb25zLmFnZW50O1xuICB9XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3QgcmVxID0gY2xpZW50LnJlcXVlc3QocmVxdWVzdE9wdGlvbnMsIG1ha2VDYWxsYmFjayhyZXNvbHZlLCByZWplY3QsIG9wdGlvbnMpKTtcbiAgICBpZiAob3B0aW9ucy5ib2R5KSB7XG4gICAgICByZXEud3JpdGUob3B0aW9ucy5ib2R5KTtcbiAgICB9XG4gICAgcmVxLm9uKCdlcnJvcicsIGVycm9yID0+IHtcbiAgICAgIHJlamVjdChlcnJvcik7XG4gICAgfSk7XG4gICAgcmVxLmVuZCgpO1xuICB9KTtcbn1cbm1vZHVsZS5leHBvcnRzID0gaHR0cFJlcXVlc3Q7XG5tb2R1bGUuZXhwb3J0cy5lbmNvZGVCb2R5ID0gZW5jb2RlQm9keTtcbm1vZHVsZS5leHBvcnRzLkhUVFBSZXNwb25zZSA9IEhUVFBSZXNwb25zZTtcbiJdLCJtYXBwaW5ncyI6Ijs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUE0QjtBQUU1QixNQUFNQSxZQUFZLENBQUM7RUFDakJDLFdBQVcsQ0FBQ0MsUUFBUSxFQUFFQyxJQUFJLEVBQUU7SUFDMUIsSUFBSUMsS0FBSyxFQUFFQyxLQUFLO0lBQ2hCLElBQUksQ0FBQ0MsTUFBTSxHQUFHSixRQUFRLENBQUNLLFVBQVU7SUFDakMsSUFBSSxDQUFDQyxPQUFPLEdBQUdOLFFBQVEsQ0FBQ00sT0FBTyxJQUFJLENBQUMsQ0FBQztJQUNyQyxJQUFJLENBQUNDLE9BQU8sR0FBRyxJQUFJLENBQUNELE9BQU8sQ0FBQyxZQUFZLENBQUM7SUFFekMsSUFBSSxPQUFPTCxJQUFJLElBQUksUUFBUSxFQUFFO01BQzNCQyxLQUFLLEdBQUdELElBQUk7SUFDZCxDQUFDLE1BQU0sSUFBSU8sTUFBTSxDQUFDQyxRQUFRLENBQUNSLElBQUksQ0FBQyxFQUFFO01BQ2hDLElBQUksQ0FBQ1MsTUFBTSxHQUFHVCxJQUFJO0lBQ3BCLENBQUMsTUFBTSxJQUFJLE9BQU9BLElBQUksSUFBSSxRQUFRLEVBQUU7TUFDbENFLEtBQUssR0FBR0YsSUFBSTtJQUNkO0lBRUEsTUFBTVUsT0FBTyxHQUFHLE1BQU07TUFDcEIsSUFBSSxDQUFDVCxLQUFLLElBQUksSUFBSSxDQUFDUSxNQUFNLEVBQUU7UUFDekJSLEtBQUssR0FBRyxJQUFJLENBQUNRLE1BQU0sQ0FBQ0UsUUFBUSxDQUFDLE9BQU8sQ0FBQztNQUN2QyxD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
@@ -4,10 +4,8 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = void 0;
7
-
8
7
  var _default = errorMessage => {
9
8
  throw errorMessage;
10
9
  };
11
-
12
10
  exports.default = _default;
13
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9yZXF1aXJlZFBhcmFtZXRlci5qcyJdLCJuYW1lcyI6WyJlcnJvck1lc3NhZ2UiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7ZUFDZ0JBLFlBQUQsSUFBK0I7QUFDNUMsUUFBTUEsWUFBTjtBQUNELEMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiogQGZsb3cgKi9cbmV4cG9ydCBkZWZhdWx0IChlcnJvck1lc3NhZ2U6IHN0cmluZyk6IGFueSA9PiB7XG4gIHRocm93IGVycm9yTWVzc2FnZTtcbn07XG4iXX0=
11
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJlcnJvck1lc3NhZ2UiXSwic291cmNlcyI6WyIuLi9zcmMvcmVxdWlyZWRQYXJhbWV0ZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqIEBmbG93ICovXG5leHBvcnQgZGVmYXVsdCAoZXJyb3JNZXNzYWdlOiBzdHJpbmcpOiBhbnkgPT4ge1xuICB0aHJvdyBlcnJvck1lc3NhZ2U7XG59O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7ZUFDZ0JBLFlBQW9CLElBQVU7RUFDNUMsTUFBTUEsWUFBWTtBQUNwQixDQUFDO0FBQUEifQ==
package/lib/rest.js CHANGED
@@ -8,25 +8,21 @@
8
8
  // This means that one of these handlers can support multiple
9
9
  // routes. That's useful for the routes that do really similar
10
10
  // things.
11
- var Parse = require('parse/node').Parse;
12
11
 
12
+ var Parse = require('parse/node').Parse;
13
13
  var RestQuery = require('./RestQuery');
14
-
15
14
  var RestWrite = require('./RestWrite');
16
-
17
15
  var triggers = require('./triggers');
18
-
19
16
  function checkTriggers(className, config, types) {
20
17
  return types.some(triggerType => {
21
18
  return triggers.getTrigger(className, triggers.Types[triggerType], config.applicationId);
22
19
  });
23
20
  }
24
-
25
21
  function checkLiveQuery(className, config) {
26
22
  return config.liveQueryController && config.liveQueryController.hasLiveQuery(className);
27
- } // Returns a promise for an object with optional keys 'results' and 'count'.
28
-
23
+ }
29
24
 
25
+ // Returns a promise for an object with optional keys 'results' and 'count'.
30
26
  function find(config, auth, className, restWhere, restOptions, clientSDK, context) {
31
27
  enforceRoleSecurity('find', className, auth);
32
28
  return triggers.maybeRunQueryTrigger(triggers.Types.beforeFind, className, restWhere, restOptions, config, auth, context).then(result => {
@@ -35,9 +31,9 @@ function find(config, auth, className, restWhere, restOptions, clientSDK, contex
35
31
  const query = new RestQuery(config, auth, className, restWhere, restOptions, clientSDK, true, context);
36
32
  return query.execute();
37
33
  });
38
- } // get is just like find but only queries an objectId.
39
-
34
+ }
40
35
 
36
+ // get is just like find but only queries an objectId.
41
37
  const get = (config, auth, className, objectId, restOptions, clientSDK, context) => {
42
38
  var restWhere = {
43
39
  objectId
@@ -49,25 +45,22 @@ const get = (config, auth, className, objectId, restOptions, clientSDK, context)
49
45
  const query = new RestQuery(config, auth, className, restWhere, restOptions, clientSDK, true, context);
50
46
  return query.execute();
51
47
  });
52
- }; // Returns a promise that doesn't resolve to any useful value.
53
-
48
+ };
54
49
 
50
+ // Returns a promise that doesn't resolve to any useful value.
55
51
  function del(config, auth, className, objectId, context) {
56
52
  if (typeof objectId !== 'string') {
57
53
  throw new Parse.Error(Parse.Error.INVALID_JSON, 'bad objectId');
58
54
  }
59
-
60
55
  if (className === '_User' && auth.isUnauthenticated()) {
61
56
  throw new Parse.Error(Parse.Error.SESSION_MISSING, 'Insufficient auth to delete user');
62
57
  }
63
-
64
58
  enforceRoleSecurity('delete', className, auth);
65
59
  let inflatedObject;
66
60
  let schemaController;
67
61
  return Promise.resolve().then(() => {
68
62
  const hasTriggers = checkTriggers(className, config, ['beforeDelete', 'afterDelete']);
69
63
  const hasLiveQuery = checkLiveQuery(className, config);
70
-
71
64
  if (hasTriggers || hasLiveQuery || className == '_Session') {
72
65
  return new RestQuery(config, auth, className, {
73
66
  objectId
@@ -77,26 +70,22 @@ function del(config, auth, className, objectId, context) {
77
70
  if (response && response.results && response.results.length) {
78
71
  const firstResult = response.results[0];
79
72
  firstResult.className = className;
80
-
81
- if (className === '_Session' && !auth.isMaster) {
73
+ if (className === '_Session' && !auth.isMaster && !auth.isMaintenance) {
82
74
  if (!auth.user || firstResult.user.objectId !== auth.user.id) {
83
75
  throw new Parse.Error(Parse.Error.INVALID_SESSION_TOKEN, 'Invalid session token');
84
76
  }
85
77
  }
86
-
87
78
  var cacheAdapter = config.cacheController;
88
79
  cacheAdapter.user.del(firstResult.sessionToken);
89
80
  inflatedObject = Parse.Object.fromJSON(firstResult);
90
81
  return triggers.maybeRunTrigger(triggers.Types.beforeDelete, auth, inflatedObject, null, config, context);
91
82
  }
92
-
93
83
  throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'Object not found for delete.');
94
84
  });
95
85
  }
96
-
97
86
  return Promise.resolve({});
98
87
  }).then(() => {
99
- if (!auth.isMaster) {
88
+ if (!auth.isMaster && !auth.isMaintenance) {
100
89
  return auth.getUserRoles();
101
90
  } else {
102
91
  return;
@@ -104,16 +93,13 @@ function del(config, auth, className, objectId, context) {
104
93
  }).then(() => config.database.loadSchema()).then(s => {
105
94
  schemaController = s;
106
95
  const options = {};
107
-
108
- if (!auth.isMaster) {
96
+ if (!auth.isMaster && !auth.isMaintenance) {
109
97
  options.acl = ['*'];
110
-
111
98
  if (auth.user) {
112
99
  options.acl.push(auth.user.id);
113
100
  options.acl = options.acl.concat(auth.userRoles);
114
101
  }
115
102
  }
116
-
117
103
  return config.database.destroy(className, {
118
104
  objectId: objectId
119
105
  }, options, schemaController);
@@ -125,79 +111,71 @@ function del(config, auth, className, objectId, context) {
125
111
  }).catch(error => {
126
112
  handleSessionMissingError(error, className, auth);
127
113
  });
128
- } // Returns a promise for a {response, status, location} object.
129
-
114
+ }
130
115
 
116
+ // Returns a promise for a {response, status, location} object.
131
117
  function create(config, auth, className, restObject, clientSDK, context) {
132
118
  enforceRoleSecurity('create', className, auth);
133
119
  var write = new RestWrite(config, auth, className, null, restObject, null, clientSDK, context);
134
120
  return write.execute();
135
- } // Returns a promise that contains the fields of the update that the
121
+ }
122
+
123
+ // Returns a promise that contains the fields of the update that the
136
124
  // REST API is supposed to return.
137
125
  // Usually, this is just updatedAt.
138
-
139
-
140
126
  function update(config, auth, className, restWhere, restObject, clientSDK, context) {
141
127
  enforceRoleSecurity('update', className, auth);
142
128
  return Promise.resolve().then(() => {
143
129
  const hasTriggers = checkTriggers(className, config, ['beforeSave', 'afterSave']);
144
130
  const hasLiveQuery = checkLiveQuery(className, config);
145
-
146
131
  if (hasTriggers || hasLiveQuery) {
147
132
  // Do not use find, as it runs the before finds
148
133
  return new RestQuery(config, auth, className, restWhere, undefined, undefined, false, context).execute({
149
134
  op: 'update'
150
135
  });
151
136
  }
152
-
153
137
  return Promise.resolve({});
154
138
  }).then(({
155
139
  results
156
140
  }) => {
157
141
  var originalRestObject;
158
-
159
142
  if (results && results.length) {
160
143
  originalRestObject = results[0];
161
144
  }
162
-
163
145
  return new RestWrite(config, auth, className, restWhere, restObject, originalRestObject, clientSDK, context, 'update').execute();
164
146
  }).catch(error => {
165
147
  handleSessionMissingError(error, className, auth);
166
148
  });
167
149
  }
168
-
169
150
  function handleSessionMissingError(error, className, auth) {
170
151
  // If we're trying to update a user without / with bad session token
171
- if (className === '_User' && error.code === Parse.Error.OBJECT_NOT_FOUND && !auth.isMaster) {
152
+ if (className === '_User' && error.code === Parse.Error.OBJECT_NOT_FOUND && !auth.isMaster && !auth.isMaintenance) {
172
153
  throw new Parse.Error(Parse.Error.SESSION_MISSING, 'Insufficient auth.');
173
154
  }
174
-
175
155
  throw error;
176
156
  }
177
-
178
- const classesWithMasterOnlyAccess = ['_JobStatus', '_PushStatus', '_Hooks', '_GlobalConfig', '_JobSchedule', '_Idempotency']; // Disallowing access to the _Role collection except by master key
179
-
157
+ const classesWithMasterOnlyAccess = ['_JobStatus', '_PushStatus', '_Hooks', '_GlobalConfig', '_JobSchedule', '_Idempotency'];
158
+ // Disallowing access to the _Role collection except by master key
180
159
  function enforceRoleSecurity(method, className, auth) {
181
- if (className === '_Installation' && !auth.isMaster) {
160
+ if (className === '_Installation' && !auth.isMaster && !auth.isMaintenance) {
182
161
  if (method === 'delete' || method === 'find') {
183
162
  const error = `Clients aren't allowed to perform the ${method} operation on the installation collection.`;
184
163
  throw new Parse.Error(Parse.Error.OPERATION_FORBIDDEN, error);
185
164
  }
186
- } //all volatileClasses are masterKey only
187
-
165
+ }
188
166
 
189
- if (classesWithMasterOnlyAccess.indexOf(className) >= 0 && !auth.isMaster) {
167
+ //all volatileClasses are masterKey only
168
+ if (classesWithMasterOnlyAccess.indexOf(className) >= 0 && !auth.isMaster && !auth.isMaintenance) {
190
169
  const error = `Clients aren't allowed to perform the ${method} operation on the ${className} collection.`;
191
170
  throw new Parse.Error(Parse.Error.OPERATION_FORBIDDEN, error);
192
- } // readOnly masterKey is not allowed
193
-
171
+ }
194
172
 
173
+ // readOnly masterKey is not allowed
195
174
  if (auth.isReadOnly && (method === 'delete' || method === 'create' || method === 'update')) {
196
175
  const error = `read-only masterKey isn't allowed to perform the ${method} operation.`;
197
176
  throw new Parse.Error(Parse.Error.OPERATION_FORBIDDEN, error);
198
177
  }
199
178
  }
200
-
201
179
  module.exports = {
202
180
  create,
203
181
  del,
@@ -205,4 +183,4 @@ module.exports = {
205
183
  get,
206
184
  update
207
185
  };
208
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9yZXN0LmpzIl0sIm5hbWVzIjpbIlBhcnNlIiwicmVxdWlyZSIsIlJlc3RRdWVyeSIsIlJlc3RXcml0ZSIsInRyaWdnZXJzIiwiY2hlY2tUcmlnZ2VycyIsImNsYXNzTmFtZSIsImNvbmZpZyIsInR5cGVzIiwic29tZSIsInRyaWdnZXJUeXBlIiwiZ2V0VHJpZ2dlciIsIlR5cGVzIiwiYXBwbGljYXRpb25JZCIsImNoZWNrTGl2ZVF1ZXJ5IiwibGl2ZVF1ZXJ5Q29udHJvbGxlciIsImhhc0xpdmVRdWVyeSIsImZpbmQiLCJhdXRoIiwicmVzdFdoZXJlIiwicmVzdE9wdGlvbnMiLCJjbGllbnRTREsiLCJjb250ZXh0IiwiZW5mb3JjZVJvbGVTZWN1cml0eSIsIm1heWJlUnVuUXVlcnlUcmlnZ2VyIiwiYmVmb3JlRmluZCIsInRoZW4iLCJyZXN1bHQiLCJxdWVyeSIsImV4ZWN1dGUiLCJnZXQiLCJvYmplY3RJZCIsImRlbCIsIkVycm9yIiwiSU5WQUxJRF9KU09OIiwiaXNVbmF1dGhlbnRpY2F0ZWQiLCJTRVNTSU9OX01JU1NJTkciLCJpbmZsYXRlZE9iamVjdCIsInNjaGVtYUNvbnRyb2xsZXIiLCJQcm9taXNlIiwicmVzb2x2ZSIsImhhc1RyaWdnZXJzIiwib3AiLCJyZXNwb25zZSIsInJlc3VsdHMiLCJsZW5ndGgiLCJmaXJzdFJlc3VsdCIsImlzTWFzdGVyIiwidXNlciIsImlkIiwiSU5WQUxJRF9TRVNTSU9OX1RPS0VOIiwiY2FjaGVBZGFwdGVyIiwiY2FjaGVDb250cm9sbGVyIiwic2Vzc2lvblRva2VuIiwiT2JqZWN0IiwiZnJvbUpTT04iLCJtYXliZVJ1blRyaWdnZXIiLCJiZWZvcmVEZWxldGUiLCJPQkpFQ1RfTk9UX0ZPVU5EIiwiZ2V0VXNlclJvbGVzIiwiZGF0YWJhc2UiLCJsb2FkU2NoZW1hIiwicyIsIm9wdGlvbnMiLCJhY2wiLCJwdXNoIiwiY29uY2F0IiwidXNlclJvbGVzIiwiZGVzdHJveSIsInBlcm1zIiwiZ2V0Q2xhc3NMZXZlbFBlcm1pc3Npb25zIiwib25BZnRlckRlbGV0ZSIsImFmdGVyRGVsZXRlIiwiY2F0Y2giLCJlcnJvciIsImhhbmRsZVNlc3Npb25NaXNzaW5nRXJyb3IiLCJjcmVhdGUiLCJyZXN0T2JqZWN0Iiwid3JpdGUiLCJ1cGRhdGUiLCJ1bmRlZmluZWQiLCJvcmlnaW5hbFJlc3RPYmplY3QiLCJjb2RlIiwiY2xhc3Nlc1dpdGhNYXN0ZXJPbmx5QWNjZXNzIiwibWV0aG9kIiwiT1BFUkFUSU9OX0ZPUkJJRERFTiIsImluZGV4T2YiLCJpc1JlYWRPbmx5IiwibW9kdWxlIiwiZXhwb3J0cyJdLCJtYXBwaW5ncyI6Ijs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUEsSUFBSUEsS0FBSyxHQUFHQyxPQUFPLENBQUMsWUFBRCxDQUFQLENBQXNCRCxLQUFsQzs7QUFFQSxJQUFJRSxTQUFTLEdBQUdELE9BQU8sQ0FBQyxhQUFELENBQXZCOztBQUNBLElBQUlFLFNBQVMsR0FBR0YsT0FBTyxDQUFDLGFBQUQsQ0FBdkI7O0FBQ0EsSUFBSUcsUUFBUSxHQUFHSCxPQUFPLENBQUMsWUFBRCxDQUF0Qjs7QUFFQSxTQUFTSSxhQUFULENBQXVCQyxTQUF2QixFQUFrQ0MsTUFBbEMsRUFBMENDLEtBQTFDLEVBQWlEO0FBQy9DLFNBQU9BLEtBQUssQ0FBQ0MsSUFBTixDQUFXQyxXQUFXLElBQUk7QUFDL0IsV0FBT04sUUFBUSxDQUFDTyxVQUFULENBQW9CTCxTQUFwQixFQUErQkYsUUFBUSxDQUFDUSxLQUFULENBQWVGLFdBQWYsQ0FBL0IsRUFBNERILE1BQU0sQ0FBQ00sYUFBbkUsQ0FBUDtBQUNELEdBRk0sQ0FBUDtBQUdEOztBQUVELFNBQVNDLGNBQVQsQ0FBd0JSLFNBQXhCLEVBQW1DQyxNQUFuQyxFQUEyQztBQUN6QyxTQUFPQSxNQUFNLENBQUNRLG1CQUFQLElBQThCUixNQUFNLENBQUNRLG1CQUFQLENBQTJCQyxZQUEzQixDQUF3Q1YsU0FBeEMsQ0FBckM7QUFDRCxDLENBRUQ7OztB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bHBlcnMgZm9yIHJ1bm5pbmcgb3BlcmF0aW9ucyBpbiBSRVNUIGZvcm1hdC5cbi8vIFRoZSBnb2FsIGlzIHRoYXQgaGFuZGxlcnMgdGhhdCBleHBsaWNpdGx5IGhhbmRsZSBhbiBleHByZXNzIHJvdXRlXG4vLyBzaG91bGQganVzdCBiZSBzaGFsbG93IHdyYXBwZXJzIGFyb3VuZCB0aGluZ3MgaW4gdGhpcyBmaWxlLCBidXRcbi8vIHRoZXNlIGZ1bmN0aW9ucyBzaG91bGQgbm90IGV4cGxpY2l0bHkgZGVwZW5kIG9uIHRoZSByZXF1ZXN0XG4vLyBvYmplY3QuXG4vLyBUaGlzIG1lYW5zIHRoYXQgb25lIG9mIHRoZXNlIGhhbmRsZXJzIGNhbiBzdXBwb3J0IG11bHRpcGxlXG4vLyByb3V0ZXMuIFRoYXQncyB1c2VmdWwgZm9yIHRoZSByb3V0ZXMgdGhhdCBkbyByZWFsbHkgc2ltaWxhclxuLy8gdGhpbmdzLlxuXG52YXIgUGFyc2UgPSByZXF1aXJlKCdwYXJzZS9ub2RlJykuUGFyc2U7XG5cbnZhciBSZXN0UXVlcnkgPSByZXF1aXJlKCcuL1Jlc3RRdWVyeScpO1xudmFyIFJlc3RXcml0ZSA9IHJlcXVpcmUoJy4vUmVzdFdyaXRlJyk7XG52YXIgdHJpZ2dlcnMgPSByZXF1aXJlKCcuL3RyaWdnZXJzJyk7XG5cbmZ1bmN0aW9uIGNoZWNrVHJpZ2dlcnMoY2xhc3NOYW1lLCBjb25maWcsIHR5cGVzKSB7XG4gIHJldHVybiB0eXBlcy5zb21lKHRyaWdnZXJUeXBlID0+IHtcbiAgICByZXR1cm4gdHJpZ2dlcnMuZ2V0VHJpZ2dlcihjbGFzc05hbWUsIHRyaWdnZXJzLlR5cGVzW3RyaWdnZXJUeXBlXSwgY29uZmlnLmFwcGxpY2F0aW9uSWQpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gY2hlY2tMaXZlUXVlcnkoY2xhc3NOYW1lLCBjb25maWcpIHtcbiAgcmV0dXJuIGNvbmZpZy5saXZlUXVlcnlDb250cm9sbGVyICYmIGNvbmZpZy5saXZlUXVlcnlDb250cm9sbGVyLmhhc0xpdmVRdWVyeShjbGFzc05hbWUpO1xufVxuXG4vLyBSZXR1cm5zIGEgcHJvbWlzZSBmb3IgYW4gb2JqZWN0IHdpdGggb3B0aW9uYWwga2V5cyAncmVzdWx0cycgYW5kICdjb3VudCcuXG5mdW5jdGlvbiBmaW5kKGNvbmZpZywgYXV0aCwgY2xhc3NOYW1lLCByZXN0V2hlcmUsIHJlc3RPcHRpb25zLCBjbGllbnRTREssIGNvbnRleHQpIHtcbiAgZW5mb3JjZVJvbGVTZWN1cml0eSgnZmluZCcsIGNsYXNzTmFtZSwgYXV0aCk7XG4gIHJldHVybiB0cmlnZ2Vyc1xuICAgIC5tYXliZVJ1blF1ZXJ5VHJpZ2dlcihcbiAgICAgIHRyaWdnZXJzLlR5cGVzLmJlZm9yZUZpbmQsXG4gICAgICBjbGFzc05hbWUsXG4gICAgICByZXN0V2hlcmUsXG4gICAgICByZXN0T3B0aW9ucyxcbiAgICAgIGNvbmZpZyxcbiAgICAgIGF1dGgsXG4gICAgICBjb250ZXh0XG4gICAgKVxuICAgIC50aGVuKHJlc3VsdCA9PiB7XG4gICAgICByZXN0V2hlcmUgPSByZXN1bHQucmVzdFdoZXJlIHx8IHJlc3RXaGVyZTtcbiAgICAgIHJlc3RPcHRpb25zID0gcmVzdWx0LnJlc3RPcHRpb25zIHx8IHJlc3RPcHRpb25zO1xuICAgICAgY29uc3QgcXVlcnkgPSBuZXcgUmVzdFF1ZXJ5KFxuICAgICAgICBjb25maWcsXG4gICAgICAgIGF1dGgsXG4gICAgICAgIGNsYXNzTmFtZSxcbiAgICAgICAgcmVzdFdoZXJlLFxuICAgICAgICByZXN0T3B0aW9ucyxcbiAgICAgICAgY2xpZW50U0RLLFxuICAgICAgICB0cnVlLFxuICAgICAgICBjb250ZXh0XG4gICAgICApO1xuICAgICAgcmV0dXJuIHF1ZXJ5LmV4ZWN1dGUoKTtcbiAgICB9KTtcbn1cblxuLy8gZ2V0IGlzIGp1c3QgbGlrZSBmaW5kIGJ1dCBvbmx5IHF1ZXJpZXMgYW4gb2JqZWN0SWQuXG5jb25zdCBnZXQgPSAoY29uZmlnLCBhdXRoLCBjbGFzc05hbWUsIG9iamVjdElkLCByZXN0T3B0aW9ucywgY2xpZW50U0RLLCBjb250ZXh0KSA9PiB7XG4gIHZhciByZXN0V2hlcmUgPSB7IG9iamVjdElkIH07XG4gIGVuZm9yY2VSb2xlU2VjdXJpdHkoJ2dldCcsIGNsYXNzTmFtZSwgYXV0aCk7XG4gIHJldHVybiB0cmlnZ2Vyc1xuICAgIC5tYXliZVJ1blF1ZXJ5VHJpZ2dlcihcbiAgICAgIHRyaWdnZXJzLlR5cGVzLmJlZm9yZUZpbmQsXG4gICAgICBjbGFzc05hbWUsXG4gICAgICByZXN0V2hlcmUsXG4gICAgICByZXN0T3B0aW9ucyxcbiAgICAgIGNvbmZpZyxcbiAgICAgIGF1dGgsXG4gICAgICBjb250ZXh0LFxuICAgICAgdHJ1ZVxuICAgIClcbiAgICAudGhlbihyZXN1bHQgPT4ge1xuICAgICAgcmVzdFdoZXJlID0gcmVzdWx0LnJlc3RXaGVyZSB8fCByZXN0V2hlcmU7XG4gICAgICByZXN0T3B0aW9ucyA9IHJlc3VsdC5yZXN0T3B0aW9ucyB8fCByZXN0T3B0aW9ucztcbiAgICAgIGNvbnN0IHF1ZXJ5ID0gbmV3IFJlc3RRdWVyeShcbiAgICAgICAgY29uZmlnLFxuICAgICAgICBhdXRoLFxuICAgICAgICBjbGFzc05hbWUsXG4gICAgICAgIHJlc3RXaGVyZSxcbiAgICAgICAgcmVzdE9wdGlvbnMsXG4gICAgICAgIGNsaWVudFNESyxcbiAgICAgICAgdHJ1ZSxcbiAgICAgICAgY29udGV4dFxuICAgICAgKTtcbiAgICAgIHJldHVybiBxdWVyeS5leGVjdXRlKCk7XG4gICAgfSk7XG59O1xuXG4vLyBSZXR1cm5zIGEgcHJvbWlzZSB0aGF0IGRvZXNuJ3QgcmVzb2x2ZSB0byBhbnkgdXNlZnVsIHZhbHVlLlxuZnVuY3Rpb24gZGVsKGNvbmZpZywgYXV0aCwgY2xhc3NOYW1lLCBvYmplY3RJZCwgY29udGV4dCkge1xuICBpZiAodHlwZW9mIG9iamVjdElkICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5JTlZBTElEX0pTT04sICdiYWQgb2JqZWN0SWQnKTtcbiAgfVxuXG4gIGlmIChjbGFzc05hbWUgPT09ICdfVXNlcicgJiYgYXV0aC5pc1VuYXV0aGVudGljYXRlZCgpKSB7XG4gICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLlNFU1NJT05fTUlTU0lORywgJ0luc3VmZmljaWVudCBhdXRoIHRvIGRlbGV0ZSB1c2VyJyk7XG4gIH1cblxuICBlbmZvcmNlUm9sZVNlY3VyaXR5KCdkZWxldGUnLCBjbGFzc05hbWUsIGF1dGgpO1xuXG4gIGxldCBpbmZsYXRlZE9iamVjdDtcbiAgbGV0IHNjaGVtYUNvbnRyb2xsZXI7XG5cbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpXG4gICAgLnRoZW4oKCkgPT4ge1xuICAgICAgY29uc3QgaGFzVHJpZ2dlcnMgPSBjaGVja1RyaWdnZXJzKGNsYXNzTmFtZSwgY29uZmlnLCBbJ2JlZm9yZURlbGV0ZScsICdhZnRlckRlbGV0ZSddKTtcbiAgICAgIGNvbnN0IGhhc0xpdmVRdWVyeSA9IGNoZWNrTGl2ZVF1ZXJ5KGNsYXNzTmFtZSwgY29uZmlnKTtcbiAgICAgIGlmIChoYXNUcmlnZ2VycyB8fCBoYXNMaXZlUXVlcnkgfHwgY2xhc3NOYW1lID09ICdfU2Vzc2lvbicpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBSZXN0UXVlcnkoY29uZmlnLCBhdXRoLCBjbGFzc05hbWUsIHsgb2JqZWN0SWQgfSlcbiAgICAgICAgICAuZXhlY3V0ZSh7IG9wOiAnZGVsZXRlJyB9KVxuICAgICAgICAgIC50aGVuKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZSAmJiByZXNwb25zZS5yZXN1bHRzICYmIHJlc3BvbnNlLnJlc3VsdHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGZpcnN0UmVzdWx0ID0gcmVzcG9uc2UucmVzdWx0c1swXTtcbiAgICAgICAgICAgICAgZmlyc3RSZXN1bHQuY2xhc3NOYW1lID0gY2xhc3NOYW1lO1xuICAgICAgICAgICAgICBpZiAoY2xhc3NOYW1lID09PSAnX1Nlc3Npb24nICYmICFhdXRoLmlzTWFzdGVyKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFhdXRoLnVzZXIgfHwgZmlyc3RSZXN1bHQudXNlci5vYmplY3RJZCAhPT0gYXV0aC51c2VyLmlkKSB7XG4gICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuSU5WQUxJRF9TRVNTSU9OX1RPS0VOLCAnSW52YWxpZCBzZXNzaW9uIHRva2VuJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHZhciBjYWNoZUFkYXB0ZXIgPSBjb25maWcuY2FjaGVDb250cm9sbGVyO1xuICAgICAgICAgICAgICBjYWNoZUFkYXB0ZXIudXNlci5kZWwoZmlyc3RSZXN1bHQuc2Vzc2lvblRva2VuKTtcbiAgICAgICAgICAgICAgaW5mbGF0ZWRPYmplY3QgPSBQYXJzZS5PYmplY3QuZnJvbUpTT04oZmlyc3RSZXN1bHQpO1xuICAgICAgICAgICAgICByZXR1cm4gdHJpZ2dlcnMubWF5YmVSdW5UcmlnZ2VyKFxuICAgICAgICAgICAgICAgIHRyaWdnZXJzLlR5cGVzLmJlZm9yZURlbGV0ZSxcbiAgICAgICAgICAgICAgICBhdXRoLFxuICAgICAgICAgICAgICAgIGluZmxhdGVkT2JqZWN0LFxuICAgICAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICAgICAgY29uZmlnLFxuICAgICAgICAgICAgICAgIGNvbnRleHRcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5PQkpFQ1RfTk9UX0ZPVU5ELCAnT2JqZWN0IG5vdCBmb3VuZCBmb3IgZGVsZXRlLicpO1xuICAgICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7fSk7XG4gICAgfSlcbiAgICAudGhlbigoKSA9PiB7XG4gICAgICBpZiAoIWF1dGguaXNNYXN0ZXIpIHtcbiAgICAgICAgcmV0dXJuIGF1dGguZ2V0VXNlclJvbGVzKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfSlcbiAgICAudGhlbigoKSA9PiBjb25maWcuZGF0YWJhc2UubG9hZFNjaGVtYSgpKVxuICAgIC50aGVuKHMgPT4ge1xuICAgICAgc2NoZW1hQ29udHJvbGxlciA9IHM7XG4gICAgICBjb25zdCBvcHRpb25zID0ge307XG4gICAgICBpZiAoIWF1dGguaXNNYXN0ZXIpIHtcbiAgICAgICAgb3B0aW9ucy5hY2wgPSBbJyonXTtcbiAgICAgICAgaWYgKGF1dGgudXNlcikge1xuICAgICAgICAgIG9wdGlvbnMuYWNsLnB1c2goYXV0aC51c2VyLmlkKTtcbiAgICAgICAgICBvcHRpb25zLmFjbCA9IG9wdGlvbnMuYWNsLmNvbmNhdChhdXRoLnVzZXJSb2xlcyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGNvbmZpZy5kYXRhYmFzZS5kZXN0cm95KFxuICAgICAgICBjbGFzc05hbWUsXG4gICAgICAgIHtcbiAgICAgICAgICBvYmplY3RJZDogb2JqZWN0SWQsXG4gICAgICAgIH0sXG4gICAgICAgIG9wdGlvbnMsXG4gICAgICAgIHNjaGVtYUNvbnRyb2xsZXJcbiAgICAgICk7XG4gICAgfSlcbiAgICAudGhlbigoKSA9PiB7XG4gICAgICAvLyBOb3RpZnkgTGl2ZVF1ZXJ5IHNlcnZlciBpZiBwb3NzaWJsZVxuICAgICAgY29uc3QgcGVybXMgPSBzY2hlbWFDb250cm9sbGVyLmdldENsYXNzTGV2ZWxQZXJtaXNzaW9ucyhjbGFzc05hbWUpO1xuICAgICAgY29uZmlnLmxpdmVRdWVyeUNvbnRyb2xsZXIub25BZnRlckRlbGV0ZShjbGFzc05hbWUsIGluZmxhdGVkT2JqZWN0LCBudWxsLCBwZXJtcyk7XG4gICAgICByZXR1cm4gdHJpZ2dlcnMubWF5YmVSdW5UcmlnZ2VyKFxuICAgICAgICB0cmlnZ2Vycy5UeXBlcy5hZnRlckRlbGV0ZSxcbiAgICAgICAgYXV0aCxcbiAgICAgICAgaW5mbGF0ZWRPYmplY3QsXG4gICAgICAgIG51bGwsXG4gICAgICAgIGNvbmZpZyxcbiAgICAgICAgY29udGV4dFxuICAgICAgKTtcbiAgICB9KVxuICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICBoYW5kbGVTZXNzaW9uTWlzc2luZ0Vycm9yKGVycm9yLCBjbGFzc05hbWUsIGF1dGgpO1xuICAgIH0pO1xufVxuXG4vLyBSZXR1cm5zIGEgcHJvbWlzZSBmb3IgYSB7cmVzcG9uc2UsIHN0YXR1cywgbG9jYXRpb259IG9iamVjdC5cbmZ1bmN0aW9uIGNyZWF0ZShjb25maWcsIGF1dGgsIGNsYXNzTmFtZSwgcmVzdE9iamVjdCwgY2xpZW50U0RLLCBjb250ZXh0KSB7XG4gIGVuZm9yY2VSb2xlU2VjdXJpdHkoJ2NyZWF0ZScsIGNsYXNzTmFtZSwgYXV0aCk7XG4gIHZhciB3cml0ZSA9IG5ldyBSZXN0V3JpdGUoY29uZmlnLCBhdXRoLCBjbGFzc05hbWUsIG51bGwsIHJlc3RPYmplY3QsIG51bGwsIGNsaWVudFNESywgY29udGV4dCk7XG4gIHJldHVybiB3cml0ZS5leGVjdXRlKCk7XG59XG5cbi8vIFJldHVybnMgYSBwcm9taXNlIHRoYXQgY29udGFpbnMgdGhlIGZpZWxkcyBvZiB0aGUgdXBkYXRlIHRoYXQgdGhlXG4vLyBSRVNUIEFQSSBpcyBzdXBwb3NlZCB0byByZXR1cm4uXG4vLyBVc3VhbGx5LCB0aGlzIGlzIGp1c3QgdXBkYXRlZEF0LlxuZnVuY3Rpb24gdXBkYXRlKGNvbmZpZywgYXV0aCwgY2xhc3NOYW1lLCByZXN0V2hlcmUsIHJlc3RPYmplY3QsIGNsaWVudFNESywgY29udGV4dCkge1xuICBlbmZvcmNlUm9sZVNlY3VyaXR5KCd1cGRhdGUnLCBjbGFzc05hbWUsIGF1dGgpO1xuXG4gIHJldHVybiBQcm9taXNlLnJlc29sdmUoKVxuICAgIC50aGVuKCgpID0+IHtcbiAgICAgIGNvbnN0IGhhc1RyaWdnZXJzID0gY2hlY2tUcmlnZ2VycyhjbGFzc05hbWUsIGNvbmZpZywgWydiZWZvcmVTYXZlJywgJ2FmdGVyU2F2ZSddKTtcbiAgICAgIGNvbnN0IGhhc0xpdmVRdWVyeSA9IGNoZWNrTGl2ZVF1ZXJ5KGNsYXNzTmFtZSwgY29uZmlnKTtcbiAgICAgIGlmIChoYXNUcmlnZ2VycyB8fCBoYXNMaXZlUXVlcnkpIHtcbiAgICAgICAgLy8gRG8gbm90IHVzZSBmaW5kLCBhcyBpdCBydW5zIHRoZSBiZWZvcmUgZmluZHNcbiAgICAgICAgcmV0dXJuIG5ldyBSZXN0UXVlcnkoXG4gICAgICAgICAgY29uZmlnLFxuICAgICAgICAgIGF1dGgsXG4gICAgICAgICAgY2xhc3NOYW1lLFxuICAgICAgICAgIHJlc3RXaGVyZSxcbiAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgIGNvbnRleHRcbiAgICAgICAgKS5leGVjdXRlKHtcbiAgICAgICAgICBvcDogJ3VwZGF0ZScsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7fSk7XG4gICAgfSlcbiAgICAudGhlbigoeyByZXN1bHRzIH0pID0+IHtcbiAgICAgIHZhciBvcmlnaW5hbFJlc3RPYmplY3Q7XG4gICAgICBpZiAocmVzdWx0cyAmJiByZXN1bHRzLmxlbmd0aCkge1xuICAgICAgICBvcmlnaW5hbFJlc3RPYmplY3QgPSByZXN1bHRzWzBdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5ldyBSZXN0V3JpdGUoXG4gICAgICAgIGNvbmZpZyxcbiAgICAgICAgYXV0aCxcbiAgICAgICAgY2xhc3NOYW1lLFxuICAgICAgICByZXN0V2hlcmUsXG4gICAgICAgIHJlc3RPYmplY3QsXG4gICAgICAgIG9yaWdpbmFsUmVzdE9iamVjdCxcbiAgICAgICAgY2xpZW50U0RLLFxuICAgICAgICBjb250ZXh0LFxuICAgICAgICAndXBkYXRlJ1xuICAgICAgKS5leGVjdXRlKCk7XG4gICAgfSlcbiAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgaGFuZGxlU2Vzc2lvbk1pc3NpbmdFcnJvcihlcnJvciwgY2xhc3NOYW1lLCBhdXRoKTtcbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gaGFuZGxlU2Vzc2lvbk1pc3NpbmdFcnJvcihlcnJvciwgY2xhc3NOYW1lLCBhdXRoKSB7XG4gIC8vIElmIHdlJ3JlIHRyeWluZyB0byB1cGRhdGUgYSB1c2VyIHdpdGhvdXQgLyB3aXRoIGJhZCBzZXNzaW9uIHRva2VuXG4gIGlmIChjbGFzc05hbWUgPT09ICdfVXNlcicgJiYgZXJyb3IuY29kZSA9PT0gUGFyc2UuRXJyb3IuT0JKRUNUX05PVF9GT1VORCAmJiAhYXV0aC5pc01hc3Rlcikge1xuICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5TRVNTSU9OX01JU1NJTkcsICdJbnN1ZmZpY2llbnQgYXV0aC4nKTtcbiAgfVxuICB0aHJvdyBlcnJvcjtcbn1cblxuY29uc3QgY2xhc3Nlc1dpdGhNYXN0ZXJPbmx5QWNjZXNzID0gW1xuICAnX0pvYlN0YXR1cycsXG4gICdfUHVzaFN0YXR1cycsXG4gICdfSG9va3MnLFxuICAnX0dsb2JhbENvbmZpZycsXG4gICdfSm9iU2NoZWR1bGUnLFxuICAnX0lkZW1wb3RlbmN5Jyxcbl07XG4vLyBEaXNhbGxvd2luZyBhY2Nlc3MgdG8gdGhlIF9Sb2xlIGNvbGxlY3Rpb24gZXhjZXB0IGJ5IG1hc3RlciBrZXlcbmZ1bmN0aW9uIGVuZm9yY2VSb2xlU2VjdXJpdHkobWV0aG9kLCBjbGFzc05hbWUsIGF1dGgpIHtcbiAgaWYgKGNsYXNzTmFtZSA9PT0gJ19JbnN0YWxsYXRpb24nICYmICFhdXRoLmlzTWFzdGVyKSB7XG4gICAgaWYgKG1ldGhvZCA9PT0gJ2RlbGV0ZScgfHwgbWV0aG9kID09PSAnZmluZCcpIHtcbiAgICAgIGNvbnN0IGVycm9yID0gYENsaWVudHMgYXJlbid0IGFsbG93ZWQgdG8gcGVyZm9ybSB0aGUgJHttZXRob2R9IG9wZXJhdGlvbiBvbiB0aGUgaW5zdGFsbGF0aW9uIGNvbGxlY3Rpb24uYDtcbiAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5PUEVSQVRJT05fRk9SQklEREVOLCBlcnJvcik7XG4gICAgfVxuICB9XG5cbiAgLy9hbGwgdm9sYXRpbGVDbGFzc2VzIGFyZSBtYXN0ZXJLZXkgb25seVxuICBpZiAoY2xhc3Nlc1dpdGhNYXN0ZXJPbmx5QWNjZXNzLmluZGV4T2YoY2xhc3NOYW1lKSA+PSAwICYmICFhdXRoLmlzTWFzdGVyKSB7XG4gICAgY29uc3QgZXJyb3IgPSBgQ2xpZW50cyBhcmVuJ3QgYWxsb3dlZCB0byBwZXJmb3JtIHRoZSAke21ldGhvZH0gb3BlcmF0aW9uIG9uIHRoZSAke2NsYXNzTmFtZX0gY29sbGVjdGlvbi5gO1xuICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5PUEVSQVRJT05fRk9SQklEREVOLCBlcnJvcik7XG4gIH1cblxuICAvLyByZWFkT25seSBtYXN0ZXJLZXkgaXMgbm90IGFsbG93ZWRcbiAgaWYgKGF1dGguaXNSZWFkT25seSAmJiAobWV0aG9kID09PSAnZGVsZXRlJyB8fCBtZXRob2QgPT09ICdjcmVhdGUnIHx8IG1ldGhvZCA9PT0gJ3VwZGF0ZScpKSB7XG4gICAgY29uc3QgZXJyb3IgPSBgcmVhZC1vbmx5IG1hc3RlcktleSBpc24ndCBhbGxvd2VkIHRvIHBlcmZvcm0gdGhlICR7bWV0aG9kfSBvcGVyYXRpb24uYDtcbiAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuT1BFUkFUSU9OX0ZPUkJJRERFTiwgZXJyb3IpO1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBjcmVhdGUsXG4gIGRlbCxcbiAgZmluZCxcbiAgZ2V0LFxuICB1cGRhdGUsXG59O1xuIl19
186
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJQYXJzZSIsInJlcXVpcmUiLCJSZXN0UXVlcnkiLCJSZXN0V3JpdGUiLCJ0cmlnZ2VycyIsImNoZWNrVHJpZ2dlcnMiLCJjbGFzc05hbWUiLCJjb25maWciLCJ0eXBlcyIsInNvbWUiLCJ0cmlnZ2VyVHlwZSIsImdldFRyaWdnZXIiLCJUeXBlcyIsImFwcGxpY2F0aW9uSWQiLCJjaGVja0xpdmVRdWVyeSIsImxpdmVRdWVyeUNvbnRyb2xsZXIiLCJoYXNMaXZlUXVlcnkiLCJmaW5kIiwiYXV0aCIsInJlc3RXaGVyZSIsInJlc3RPcHRpb25zIiwiY2xpZW50U0RLIiwiY29udGV4dCIsImVuZm9yY2VSb2xlU2VjdXJpdHkiLCJtYXliZVJ1blF1ZXJ5VHJpZ2dlciIsImJlZm9yZUZpbmQiLCJ0aGVuIiwicmVzdWx0IiwicXVlcnkiLCJleGVjdXRlIiwiZ2V0Iiwib2JqZWN0SWQiLCJkZWwiLCJFcnJvciIsIklOVkFMSURfSlNPTiIsImlzVW5hdXRoZW50aWNhdGVkIiwiU0VTU0lPTl9NSVNTSU5HIiwiaW5mbGF0ZWRPYmplY3QiLCJzY2hlbWFDb250cm9sbGVyIiwiUHJvbWlzZSIsInJlc29sdmUiLCJoYXNUcmlnZ2VycyIsIm9wIiwicmVzcG9uc2UiLCJyZXN1bHRzIiwibGVuZ3RoIiwiZmlyc3RSZXN1bHQiLCJpc01hc3RlciIsImlzTWFpbnRlbmFuY2UiLCJ1c2VyIiwiaWQiLCJJTlZBTElEX1NFU1NJT05fVE9LRU4iLCJjYWNoZUFkYXB0ZXIiLCJjYWNoZUNvbnRyb2xsZXIiLCJzZXNzaW9uVG9rZW4iLCJPYmplY3QiLCJmcm9tSlNPTiIsIm1heWJlUnVuVHJpZ2dlciIsImJlZm9yZURlbGV0ZSIsIk9CSkVDVF9OT1RfRk9VTkQiLCJnZXRVc2VyUm9sZXMiLCJkYXRhYmFzZSIsImxvYWRTY2hlbWEiLCJzIiwib3B0aW9ucyIsImFjbCIsInB1c2giLCJjb25jYXQiLCJ1c2VyUm9sZXMiLCJkZXN0cm95IiwicGVybXMiLCJnZXRDbGFzc0xldmVsUGVybWlzc2lvbnMiLCJvbkFmdGVyRGVsZXRlIiwiYWZ0ZXJEZWxldGUiLCJjYXRjaCIsImVycm9yIiwiaGFuZGxlU2Vzc2lvbk1pc3NpbmdFcnJvciIsImNyZWF0ZSIsInJlc3RPYmplY3QiLCJ3cml0ZSIsInVwZGF0ZSIsInVuZGVmaW5lZCIsIm9yaWdpbmFsUmVzdE9iamVjdCIsImNvZGUiLCJjbGFzc2VzV2l0aE1hc3Rlck9ubHlBY2Nlc3MiLCJtZXRob2QiLCJPUEVSQVRJT05fRk9SQklEREVOIiwiaW5kZXhPZiIsImlzUmVhZE9ubHkiLCJtb2R1bGUiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vc3JjL3Jlc3QuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gVGhpcyBmaWxlIGNvbnRhaW5zIGhlbHBlcnMgZm9yIHJ1bm5pbmcgb3BlcmF0aW9ucyBpbiBSRVNUIGZvcm1hdC5cbi8vIFRoZSBnb2FsIGlzIHRoYXQgaGFuZGxlcnMgdGhhdCBleHBsaWNpdGx5IGhhbmRsZSBhbiBleHByZXNzIHJvdXRlXG4vLyBzaG91bGQganVzdCBiZSBzaGFsbG93IHdyYXBwZXJzIGFyb3VuZCB0aGluZ3MgaW4gdGhpcyBmaWxlLCBidXRcbi8vIHRoZXNlIGZ1bmN0aW9ucyBzaG91bGQgbm90IGV4cGxpY2l0bHkgZGVwZW5kIG9uIHRoZSByZXF1ZXN0XG4vLyBvYmplY3QuXG4vLyBUaGlzIG1lYW5zIHRoYXQgb25lIG9mIHRoZXNlIGhhbmRsZXJzIGNhbiBzdXBwb3J0IG11bHRpcGxlXG4vLyByb3V0ZXMuIFRoYXQncyB1c2VmdWwgZm9yIHRoZSByb3V0ZXMgdGhhdCBkbyByZWFsbHkgc2ltaWxhclxuLy8gdGhpbmdzLlxuXG52YXIgUGFyc2UgPSByZXF1aXJlKCdwYXJzZS9ub2RlJykuUGFyc2U7XG5cbnZhciBSZXN0UXVlcnkgPSByZXF1aXJlKCcuL1Jlc3RRdWVyeScpO1xudmFyIFJlc3RXcml0ZSA9IHJlcXVpcmUoJy4vUmVzdFdyaXRlJyk7XG52YXIgdHJpZ2dlcnMgPSByZXF1aXJlKCcuL3RyaWdnZXJzJyk7XG5cbmZ1bmN0aW9uIGNoZWNrVHJpZ2dlcnMoY2xhc3NOYW1lLCBjb25maWcsIHR5cGVzKSB7XG4gIHJldHVybiB0eXBlcy5zb21lKHRyaWdnZXJUeXBlID0+IHtcbiAgICByZXR1cm4gdHJpZ2dlcnMuZ2V0VHJpZ2dlcihjbGFzc05hbWUsIHRyaWdnZXJzLlR5cGVzW3RyaWdnZXJUeXBlXSwgY29uZmlnLmFwcGxpY2F0aW9uSWQpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gY2hlY2tMaXZlUXVlcnkoY2xhc3NOYW1lLCBjb25maWcpIHtcbiAgcmV0dXJuIGNvbmZpZy5saXZlUXVlcnlDb250cm9sbGVyICYmIGNvbmZpZy5saXZlUXVlcnlDb250cm9sbGVyLmhhc0xpdmVRdWVyeShjbGFzc05hbWUpO1xufVxuXG4vLyBSZXR1cm5zIGEgcHJvbWlzZSBmb3IgYW4gb2JqZWN0IHdpdGggb3B0aW9uYWwga2V5cyAncmVzdWx0cycgYW5kICdjb3VudCcuXG5mdW5jdGlvbiBmaW5kKGNvbmZpZywgYXV0aCwgY2xhc3NOYW1lLCByZXN0V2hlcmUsIHJlc3RPcHRpb25zLCBjbGllbnRTREssIGNvbnRleHQpIHtcbiAgZW5mb3JjZVJvbGVTZWN1cml0eSgnZmluZCcsIGNsYXNzTmFtZSwgYXV0aCk7XG4gIHJldHVybiB0cmlnZ2Vyc1xuICAgIC5tYXliZVJ1blF1ZXJ5VHJpZ2dlcihcbiAgICAgIHRyaWdnZXJzLlR5cGVzLmJlZm9yZUZpbmQsXG4gICAgICBjbGFzc05hbWUsXG4gICAgICByZXN0V2hlcmUsXG4gICAgICByZXN0T3B0aW9ucyxcbiAgICAgIGNvbmZpZyxcbiAgICAgIGF1dGgsXG4gICAgICBjb250ZXh0XG4gICAgKVxuICAgIC50aGVuKHJlc3VsdCA9PiB7XG4gICAgICByZXN0V2hlcmUgPSByZXN1bHQucmVzdFdoZXJlIHx8IHJlc3RXaGVyZTtcbiAgICAgIHJlc3RPcHRpb25zID0gcmVzdWx0LnJlc3RPcHRpb25zIHx8IHJlc3RPcHRpb25zO1xuICAgICAgY29uc3QgcXVlcnkgPSBuZXcgUmVzdFF1ZXJ5KFxuICAgICAgICBjb25maWcsXG4gICAgICAgIGF1dGgsXG4gICAgICAgIGNsYXNzTmFtZSxcbiAgICAgICAgcmVzdFdoZXJlLFxuICAgICAgICByZXN0T3B0aW9ucyxcbiAgICAgICAgY2xpZW50U0RLLFxuICAgICAgICB0cnVlLFxuICAgICAgICBjb250ZXh0XG4gICAgICApO1xuICAgICAgcmV0dXJuIHF1ZXJ5LmV4ZWN1dGUoKTtcbiAgICB9KTtcbn1cblxuLy8gZ2V0IGlzIGp1c3QgbGlrZSBmaW5kIGJ1dCBvbmx5IHF1ZXJpZXMgYW4gb2JqZWN0SWQuXG5jb25zdCBnZXQgPSAoY29uZmlnLCBhdXRoLCBjbGFzc05hbWUsIG9iamVjdElkLCByZXN0T3B0aW9ucywgY2xpZW50U0RLLCBjb250ZXh0KSA9PiB7XG4gIHZhciByZXN0V2hlcmUgPSB7IG9iamVjdElkIH07XG4gIGVuZm9yY2VSb2xlU2VjdXJpdHkoJ2dldCcsIGNsYXNzTmFtZSwgYXV0aCk7XG4gIHJldHVybiB0cmlnZ2Vyc1xuICAgIC5tYXliZVJ1blF1ZXJ5VHJpZ2dlcihcbiAgICAgIHRyaWdnZXJzLlR5cGVzLmJlZm9yZUZpbmQsXG4gICAgICBjbGFzc05hbWUsXG4gICAgICByZXN0V2hlcmUsXG4gICAgICByZXN0T3B0aW9ucyxcbiAgICAgIGNvbmZpZyxcbiAgICAgIGF1dGgsXG4gICAgICBjb250ZXh0LFxuICAgICAgdHJ1ZVxuICAgIClcbiAgICAudGhlbihyZXN1bHQgPT4ge1xuICAgICAgcmVzdFdoZXJlID0gcmVzdWx0LnJlc3RXaGVyZSB8fCByZXN0V2hlcmU7XG4gICAgICByZXN0T3B0aW9ucyA9IHJlc3VsdC5yZXN0T3B0aW9ucyB8fCByZXN0T3B0aW9ucztcbiAgICAgIGNvbnN0IHF1ZXJ5ID0gbmV3IFJlc3RRdWVyeShcbiAgICAgICAgY29uZmlnLFxuICAgICAgICBhdXRoLFxuICAgICAgICBjbGFzc05hbWUsXG4gICAgICAgIHJlc3RXaGVyZSxcbiAgICAgICAgcmVzdE9wdGlvbnMsXG4gICAgICAgIGNsaWVudFNESyxcbiAgICAgICAgdHJ1ZSxcbiAgICAgICAgY29udGV4dFxuICAgICAgKTtcbiAgICAgIHJldHVybiBxdWVyeS5leGVjdXRlKCk7XG4gICAgfSk7XG59O1xuXG4vLyBSZXR1cm5zIGEgcHJvbWlzZSB0aGF0IGRvZXNuJ3QgcmVzb2x2ZSB0byBhbnkgdXNlZnVsIHZhbHVlLlxuZnVuY3Rpb24gZGVsKGNvbmZpZywgYXV0aCwgY2xhc3NOYW1lLCBvYmplY3RJZCwgY29udGV4dCkge1xuICBpZiAodHlwZW9mIG9iamVjdElkICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5JTlZBTElEX0pTT04sICdiYWQgb2JqZWN0SWQnKTtcbiAgfVxuXG4gIGlmIChjbGFzc05hbWUgPT09ICdfVXNlcicgJiYgYXV0aC5pc1VuYXV0aGVudGljYXRlZCgpKSB7XG4gICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLlNFU1NJT05fTUlTU0lORywgJ0luc3VmZmljaWVudCBhdXRoIHRvIGRlbGV0ZSB1c2VyJyk7XG4gIH1cblxuICBlbmZvcmNlUm9sZVNlY3VyaXR5KCdkZWxldGUnLCBjbGFzc05hbWUsIGF1dGgpO1xuXG4gIGxldCBpbmZsYXRlZE9iamVjdDtcbiAgbGV0IHNjaGVtYUNvbnRyb2xsZXI7XG5cbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpXG4gICAgLnRoZW4oKCkgPT4ge1xuICAgICAgY29uc3QgaGFzVHJpZ2dlcnMgPSBjaGVja1RyaWdnZXJzKGNsYXNzTmFtZSwgY29uZmlnLCBbJ2JlZm9yZURlbGV0ZScsICdhZnRlckRlbGV0ZSddKTtcbiAgICAgIGNvbnN0IGhhc0xpdmVRdWVyeSA9IGNoZWNrTGl2ZVF1ZXJ5KGNsYXNzTmFtZSwgY29uZmlnKTtcbiAgICAgIGlmIChoYXNUcmlnZ2VycyB8fCBoYXNMaXZlUXVlcnkgfHwgY2xhc3NOYW1lID09ICdfU2Vzc2lvbicpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBSZXN0UXVlcnkoY29uZmlnLCBhdXRoLCBjbGFzc05hbWUsIHsgb2JqZWN0SWQgfSlcbiAgICAgICAgICAuZXhlY3V0ZSh7IG9wOiAnZGVsZXRlJyB9KVxuICAgICAgICAgIC50aGVuKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZSAmJiByZXNwb25zZS5yZXN1bHRzICYmIHJlc3BvbnNlLnJlc3VsdHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGZpcnN0UmVzdWx0ID0gcmVzcG9uc2UucmVzdWx0c1swXTtcbiAgICAgICAgICAgICAgZmlyc3RSZXN1bHQuY2xhc3NOYW1lID0gY2xhc3NOYW1lO1xuICAgICAgICAgICAgICBpZiAoY2xhc3NOYW1lID09PSAnX1Nlc3Npb24nICYmICFhdXRoLmlzTWFzdGVyICYmICFhdXRoLmlzTWFpbnRlbmFuY2UpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWF1dGgudXNlciB8fCBmaXJzdFJlc3VsdC51c2VyLm9iamVjdElkICE9PSBhdXRoLnVzZXIuaWQpIHtcbiAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5JTlZBTElEX1NFU1NJT05fVE9LRU4sICdJbnZhbGlkIHNlc3Npb24gdG9rZW4nKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdmFyIGNhY2hlQWRhcHRlciA9IGNvbmZpZy5jYWNoZUNvbnRyb2xsZXI7XG4gICAgICAgICAgICAgIGNhY2hlQWRhcHRlci51c2VyLmRlbChmaXJzdFJlc3VsdC5zZXNzaW9uVG9rZW4pO1xuICAgICAgICAgICAgICBpbmZsYXRlZE9iamVjdCA9IFBhcnNlLk9iamVjdC5mcm9tSlNPTihmaXJzdFJlc3VsdCk7XG4gICAgICAgICAgICAgIHJldHVybiB0cmlnZ2Vycy5tYXliZVJ1blRyaWdnZXIoXG4gICAgICAgICAgICAgICAgdHJpZ2dlcnMuVHlwZXMuYmVmb3JlRGVsZXRlLFxuICAgICAgICAgICAgICAgIGF1dGgsXG4gICAgICAgICAgICAgICAgaW5mbGF0ZWRPYmplY3QsXG4gICAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgICBjb25maWcsXG4gICAgICAgICAgICAgICAgY29udGV4dFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLk9CSkVDVF9OT1RfRk9VTkQsICdPYmplY3Qgbm90IGZvdW5kIGZvciBkZWxldGUuJyk7XG4gICAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHt9KTtcbiAgICB9KVxuICAgIC50aGVuKCgpID0+IHtcbiAgICAgIGlmICghYXV0aC5pc01hc3RlciAmJiAhYXV0aC5pc01haW50ZW5hbmNlKSB7XG4gICAgICAgIHJldHVybiBhdXRoLmdldFVzZXJSb2xlcygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH0pXG4gICAgLnRoZW4oKCkgPT4gY29uZmlnLmRhdGFiYXNlLmxvYWRTY2hlbWEoKSlcbiAgICAudGhlbihzID0+IHtcbiAgICAgIHNjaGVtYUNvbnRyb2xsZXIgPSBzO1xuICAgICAgY29uc3Qgb3B0aW9ucyA9IHt9O1xuICAgICAgaWYgKCFhdXRoLmlzTWFzdGVyICYmICFhdXRoLmlzTWFpbnRlbmFuY2UpIHtcbiAgICAgICAgb3B0aW9ucy5hY2wgPSBbJyonXTtcbiAgICAgICAgaWYgKGF1dGgudXNlcikge1xuICAgICAgICAgIG9wdGlvbnMuYWNsLnB1c2goYXV0aC51c2VyLmlkKTtcbiAgICAgICAgICBvcHRpb25zLmFjbCA9IG9wdGlvbnMuYWNsLmNvbmNhdChhdXRoLnVzZXJSb2xlcyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGNvbmZpZy5kYXRhYmFzZS5kZXN0cm95KFxuICAgICAgICBjbGFzc05hbWUsXG4gICAgICAgIHtcbiAgICAgICAgICBvYmplY3RJZDogb2JqZWN0SWQsXG4gICAgICAgIH0sXG4gICAgICAgIG9wdGlvbnMsXG4gICAgICAgIHNjaGVtYUNvbnRyb2xsZXJcbiAgICAgICk7XG4gICAgfSlcbiAgICAudGhlbigoKSA9PiB7XG4gICAgICAvLyBOb3RpZnkgTGl2ZVF1ZXJ5IHNlcnZlciBpZiBwb3NzaWJsZVxuICAgICAgY29uc3QgcGVybXMgPSBzY2hlbWFDb250cm9sbGVyLmdldENsYXNzTGV2ZWxQZXJtaXNzaW9ucyhjbGFzc05hbWUpO1xuICAgICAgY29uZmlnLmxpdmVRdWVyeUNvbnRyb2xsZXIub25BZnRlckRlbGV0ZShjbGFzc05hbWUsIGluZmxhdGVkT2JqZWN0LCBudWxsLCBwZXJtcyk7XG4gICAgICByZXR1cm4gdHJpZ2dlcnMubWF5YmVSdW5UcmlnZ2VyKFxuICAgICAgICB0cmlnZ2Vycy5UeXBlcy5hZnRlckRlbGV0ZSxcbiAgICAgICAgYXV0aCxcbiAgICAgICAgaW5mbGF0ZWRPYmplY3QsXG4gICAgICAgIG51bGwsXG4gICAgICAgIGNvbmZpZyxcbiAgICAgICAgY29udGV4dFxuICAgICAgKTtcbiAgICB9KVxuICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICBoYW5kbGVTZXNzaW9uTWlzc2luZ0Vycm9yKGVycm9yLCBjbGFzc05hbWUsIGF1dGgpO1xuICAgIH0pO1xufVxuXG4vLyBSZXR1cm5zIGEgcHJvbWlzZSBmb3IgYSB7cmVzcG9uc2UsIHN0YXR1cywgbG9jYXRpb259IG9iamVjdC5cbmZ1bmN0aW9uIGNyZWF0ZShjb25maWcsIGF1dGgsIGNsYXNzTmFtZSwgcmVzdE9iamVjdCwgY2xpZW50U0RLLCBjb250ZXh0KSB7XG4gIGVuZm9yY2VSb2xlU2VjdXJpdHkoJ2NyZWF0ZScsIGNsYXNzTmFtZSwgYXV0aCk7XG4gIHZhciB3cml0ZSA9IG5ldyBSZXN0V3JpdGUoY29uZmlnLCBhdXRoLCBjbGFzc05hbWUsIG51bGwsIHJlc3RPYmplY3QsIG51bGwsIGNsaWVudFNESywgY29udGV4dCk7XG4gIHJldHVybiB3cml0ZS5leGVjdXRlKCk7XG59XG5cbi8vIFJldHVybnMgYSBwcm9taXNlIHRoYXQgY29udGFpbnMgdGhlIGZpZWxkcyBvZiB0aGUgdXBkYXRlIHRoYXQgdGhlXG4vLyBSRVNUIEFQSSBpcyBzdXBwb3NlZCB0byByZXR1cm4uXG4vLyBVc3VhbGx5LCB0aGlzIGlzIGp1c3QgdXBkYXRlZEF0LlxuZnVuY3Rpb24gdXBkYXRlKGNvbmZpZywgYXV0aCwgY2xhc3NOYW1lLCByZXN0V2hlcmUsIHJlc3RPYmplY3QsIGNsaWVudFNESywgY29udGV4dCkge1xuICBlbmZvcmNlUm9sZVNlY3VyaXR5KCd1cGRhdGUnLCBjbGFzc05hbWUsIGF1dGgpO1xuXG4gIHJldHVybiBQcm9taXNlLnJlc29sdmUoKVxuICAgIC50aGVuKCgpID0+IHtcbiAgICAgIGNvbnN0IGhhc1RyaWdnZXJzID0gY2hlY2tUcmlnZ2VycyhjbGFzc05hbWUsIGNvbmZpZywgWydiZWZvcmVTYXZlJywgJ2FmdGVyU2F2ZSddKTtcbiAgICAgIGNvbnN0IGhhc0xpdmVRdWVyeSA9IGNoZWNrTGl2ZVF1ZXJ5KGNsYXNzTmFtZSwgY29uZmlnKTtcbiAgICAgIGlmIChoYXNUcmlnZ2VycyB8fCBoYXNMaXZlUXVlcnkpIHtcbiAgICAgICAgLy8gRG8gbm90IHVzZSBmaW5kLCBhcyBpdCBydW5zIHRoZSBiZWZvcmUgZmluZHNcbiAgICAgICAgcmV0dXJuIG5ldyBSZXN0UXVlcnkoXG4gICAgICAgICAgY29uZmlnLFxuICAgICAgICAgIGF1dGgsXG4gICAgICAgICAgY2xhc3NOYW1lLFxuICAgICAgICAgIHJlc3RXaGVyZSxcbiAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgIGNvbnRleHRcbiAgICAgICAgKS5leGVjdXRlKHtcbiAgICAgICAgICBvcDogJ3VwZGF0ZScsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7fSk7XG4gICAgfSlcbiAgICAudGhlbigoeyByZXN1bHRzIH0pID0+IHtcbiAgICAgIHZhciBvcmlnaW5hbFJlc3RPYmplY3Q7XG4gICAgICBpZiAocmVzdWx0cyAmJiByZXN1bHRzLmxlbmd0aCkge1xuICAgICAgICBvcmlnaW5hbFJlc3RPYmplY3QgPSByZXN1bHRzWzBdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5ldyBSZXN0V3JpdGUoXG4gICAgICAgIGNvbmZpZyxcbiAgICAgICAgYXV0aCxcbiAgICAgICAgY2xhc3NOYW1lLFxuICAgICAgICByZXN0V2hlcmUsXG4gICAgICAgIHJlc3RPYmplY3QsXG4gICAgICAgIG9yaWdpbmFsUmVzdE9iamVjdCxcbiAgICAgICAgY2xpZW50U0RLLFxuICAgICAgICBjb250ZXh0LFxuICAgICAgICAndXBkYXRlJ1xuICAgICAgKS5leGVjdXRlKCk7XG4gICAgfSlcbiAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgaGFuZGxlU2Vzc2lvbk1pc3NpbmdFcnJvcihlcnJvciwgY2xhc3NOYW1lLCBhdXRoKTtcbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gaGFuZGxlU2Vzc2lvbk1pc3NpbmdFcnJvcihlcnJvciwgY2xhc3NOYW1lLCBhdXRoKSB7XG4gIC8vIElmIHdlJ3JlIHRyeWluZyB0byB1cGRhdGUgYSB1c2VyIHdpdGhvdXQgLyB3aXRoIGJhZCBzZXNzaW9uIHRva2VuXG4gIGlmIChcbiAgICBjbGFzc05hbWUgPT09ICdfVXNlcicgJiZcbiAgICBlcnJvci5jb2RlID09PSBQYXJzZS5FcnJvci5PQkpFQ1RfTk9UX0ZPVU5EICYmXG4gICAgIWF1dGguaXNNYXN0ZXIgJiZcbiAgICAhYXV0aC5pc01haW50ZW5hbmNlXG4gICkge1xuICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5TRVNTSU9OX01JU1NJTkcsICdJbnN1ZmZpY2llbnQgYXV0aC4nKTtcbiAgfVxuICB0aHJvdyBlcnJvcjtcbn1cblxuY29uc3QgY2xhc3Nlc1dpdGhNYXN0ZXJPbmx5QWNjZXNzID0gW1xuICAnX0pvYlN0YXR1cycsXG4gICdfUHVzaFN0YXR1cycsXG4gICdfSG9va3MnLFxuICAnX0dsb2JhbENvbmZpZycsXG4gICdfSm9iU2NoZWR1bGUnLFxuICAnX0lkZW1wb3RlbmN5Jyxcbl07XG4vLyBEaXNhbGxvd2luZyBhY2Nlc3MgdG8gdGhlIF9Sb2xlIGNvbGxlY3Rpb24gZXhjZXB0IGJ5IG1hc3RlciBrZXlcbmZ1bmN0aW9uIGVuZm9yY2VSb2xlU2VjdXJpdHkobWV0aG9kLCBjbGFzc05hbWUsIGF1dGgpIHtcbiAgaWYgKGNsYXNzTmFtZSA9PT0gJ19JbnN0YWxsYXRpb24nICYmICFhdXRoLmlzTWFzdGVyICYmICFhdXRoLmlzTWFpbnRlbmFuY2UpIHtcbiAgICBpZiAobWV0aG9kID09PSAnZGVsZXRlJyB8fCBtZXRob2QgPT09ICdmaW5kJykge1xuICAgICAgY29uc3QgZXJyb3IgPSBgQ2xpZW50cyBhcmVuJ3QgYWxsb3dlZCB0byBwZXJmb3JtIHRoZSAke21ldGhvZH0gb3BlcmF0aW9uIG9uIHRoZSBpbnN0YWxsYXRpb24gY29sbGVjdGlvbi5gO1xuICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLk9QRVJBVElPTl9GT1JCSURERU4sIGVycm9yKTtcbiAgICB9XG4gIH1cblxuICAvL2FsbCB2b2xhdGlsZUNsYXNzZXMgYXJlIG1hc3RlcktleSBvbmx5XG4gIGlmIChcbiAgICBjbGFzc2VzV2l0aE1hc3Rlck9ubHlBY2Nlc3MuaW5kZXhPZihjbGFzc05hbWUpID49IDAgJiZcbiAgICAhYXV0aC5pc01hc3RlciAmJlxuICAgICFhdXRoLmlzTWFpbnRlbmFuY2VcbiAgKSB7XG4gICAgY29uc3QgZXJyb3IgPSBgQ2xpZW50cyBhcmVuJ3QgYWxsb3dlZCB0byBwZXJmb3JtIHRoZSAke21ldGhvZH0gb3BlcmF0aW9uIG9uIHRoZSAke2NsYXNzTmFtZX0gY29sbGVjdGlvbi5gO1xuICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5PUEVSQVRJT05fRk9SQklEREVOLCBlcnJvcik7XG4gIH1cblxuICAvLyByZWFkT25seSBtYXN0ZXJLZXkgaXMgbm90IGFsbG93ZWRcbiAgaWYgKGF1dGguaXNSZWFkT25seSAmJiAobWV0aG9kID09PSAnZGVsZXRlJyB8fCBtZXRob2QgPT09ICdjcmVhdGUnIHx8IG1ldGhvZCA9PT0gJ3VwZGF0ZScpKSB7XG4gICAgY29uc3QgZXJyb3IgPSBgcmVhZC1vbmx5IG1hc3RlcktleSBpc24ndCBhbGxvd2VkIHRvIHBlcmZvcm0gdGhlICR7bWV0aG9kfSBvcGVyYXRpb24uYDtcbiAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuT1BFUkFUSU9OX0ZPUkJJRERFTiwgZXJyb3IpO1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBjcmVhdGUsXG4gIGRlbCxcbiAgZmluZCxcbiAgZ2V0LFxuICB1cGRhdGUsXG59O1xuIl0sIm1hcHBpbmdzIjoiOztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsSUFBSUEsS0FBSyxHQUFHQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUNELEtBQUs7QUFFdkMsSUFBSUUsU0FBUyxHQUFHRCxPQUFPLENBQUMsYUFBYSxDQUFDO0FBQ3RDLElBQUlFLFNBQVMsR0FBR0YsT0FBTyxDQUFDLGFBQWEsQ0FBQztBQUN0QyxJQUFJRyxRQUFRLEdBQUdILE9BQU8sQ0FBQyxZQUFZLENBQUM7QUFFcEMsU0FBU0ksYUFBYSxDQUFDQyxTQUFTLEVBQUVDLE1BQU0sRUFBRUMsS0FBSyxFQUFFO0VBQy9DLE9BQU9BLEtBQUssQ0FBQ0MsSUFBSSxDQUFDQyxXQUFXLElBQUk7SUFDL0IsT0FBT04sUUFBUSxDQUFDTyxVQUFVLENBQUNMLFNBQVMsRUFBRUYsUUFBUSxDQUFDUSxLQUFLLENBQUNGLFdBQVcsQ0FBQyxFQUFFSCxNQUFNLENBQUNNLGFBQWEsQ0FBQztFQUMxRixDQUFDLENBQUM7QUFDSjtBQUVBLFNBQVNDLGNBQWMs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