@beiguancyc/parse-server 9.9.0-ruixiang.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 (251) hide show
  1. package/LICENSE +176 -0
  2. package/NOTICE +10 -0
  3. package/README.md +1311 -0
  4. package/bin/parse-live-query-server +3 -0
  5. package/bin/parse-server +3 -0
  6. package/lib/AccountLockout.js +149 -0
  7. package/lib/Adapters/AdapterLoader.js +60 -0
  8. package/lib/Adapters/Analytics/AnalyticsAdapter.js +32 -0
  9. package/lib/Adapters/Auth/AuthAdapter.js +132 -0
  10. package/lib/Adapters/Auth/BaseCodeAuthAdapter.js +119 -0
  11. package/lib/Adapters/Auth/OAuth1Client.js +204 -0
  12. package/lib/Adapters/Auth/apple.js +125 -0
  13. package/lib/Adapters/Auth/facebook.js +187 -0
  14. package/lib/Adapters/Auth/gcenter.js +217 -0
  15. package/lib/Adapters/Auth/github.js +125 -0
  16. package/lib/Adapters/Auth/google.js +122 -0
  17. package/lib/Adapters/Auth/gpgames.js +125 -0
  18. package/lib/Adapters/Auth/httpsRequest.js +41 -0
  19. package/lib/Adapters/Auth/index.js +248 -0
  20. package/lib/Adapters/Auth/instagram.js +118 -0
  21. package/lib/Adapters/Auth/janraincapture.js +85 -0
  22. package/lib/Adapters/Auth/janrainengage.js +57 -0
  23. package/lib/Adapters/Auth/keycloak.js +168 -0
  24. package/lib/Adapters/Auth/ldap.js +193 -0
  25. package/lib/Adapters/Auth/line.js +125 -0
  26. package/lib/Adapters/Auth/linkedin.js +117 -0
  27. package/lib/Adapters/Auth/meetup.js +44 -0
  28. package/lib/Adapters/Auth/mfa.js +334 -0
  29. package/lib/Adapters/Auth/microsoft.js +111 -0
  30. package/lib/Adapters/Auth/oauth2.js +115 -0
  31. package/lib/Adapters/Auth/phantauth.js +53 -0
  32. package/lib/Adapters/Auth/qq.js +113 -0
  33. package/lib/Adapters/Auth/spotify.js +115 -0
  34. package/lib/Adapters/Auth/twitter.js +197 -0
  35. package/lib/Adapters/Auth/utils.js +28 -0
  36. package/lib/Adapters/Auth/vkontakte.js +55 -0
  37. package/lib/Adapters/Auth/wechat.js +110 -0
  38. package/lib/Adapters/Auth/weibo.js +141 -0
  39. package/lib/Adapters/Cache/CacheAdapter.js +40 -0
  40. package/lib/Adapters/Cache/InMemoryCache.js +61 -0
  41. package/lib/Adapters/Cache/InMemoryCacheAdapter.js +34 -0
  42. package/lib/Adapters/Cache/LRUCache.js +35 -0
  43. package/lib/Adapters/Cache/NullCacheAdapter.js +26 -0
  44. package/lib/Adapters/Cache/RedisCacheAdapter.js +109 -0
  45. package/lib/Adapters/Cache/SchemaCache.js +25 -0
  46. package/lib/Adapters/Email/MailAdapter.js +32 -0
  47. package/lib/Adapters/Files/FilesAdapter.js +129 -0
  48. package/lib/Adapters/Files/GridFSBucketAdapter.js +280 -0
  49. package/lib/Adapters/Files/GridStoreAdapter.js +5 -0
  50. package/lib/Adapters/Logger/LoggerAdapter.js +27 -0
  51. package/lib/Adapters/Logger/WinstonLogger.js +107 -0
  52. package/lib/Adapters/Logger/WinstonLoggerAdapter.js +63 -0
  53. package/lib/Adapters/MessageQueue/EventEmitterMQ.js +55 -0
  54. package/lib/Adapters/PubSub/EventEmitterPubSub.js +53 -0
  55. package/lib/Adapters/PubSub/PubSubAdapter.js +34 -0
  56. package/lib/Adapters/PubSub/RedisPubSub.js +49 -0
  57. package/lib/Adapters/Push/PushAdapter.js +40 -0
  58. package/lib/Adapters/Storage/Mongo/MongoCollection.js +212 -0
  59. package/lib/Adapters/Storage/Mongo/MongoSchemaCollection.js +334 -0
  60. package/lib/Adapters/Storage/Mongo/MongoStorageAdapter.js +1047 -0
  61. package/lib/Adapters/Storage/Mongo/MongoTransform.js +1397 -0
  62. package/lib/Adapters/Storage/Postgres/PostgresClient.js +38 -0
  63. package/lib/Adapters/Storage/Postgres/PostgresConfigParser.js +73 -0
  64. package/lib/Adapters/Storage/Postgres/PostgresStorageAdapter.js +2409 -0
  65. package/lib/Adapters/Storage/Postgres/sql/array/add-unique.sql +11 -0
  66. package/lib/Adapters/Storage/Postgres/sql/array/add.sql +11 -0
  67. package/lib/Adapters/Storage/Postgres/sql/array/contains-all-regex.sql +14 -0
  68. package/lib/Adapters/Storage/Postgres/sql/array/contains-all.sql +14 -0
  69. package/lib/Adapters/Storage/Postgres/sql/array/contains.sql +11 -0
  70. package/lib/Adapters/Storage/Postgres/sql/array/remove.sql +11 -0
  71. package/lib/Adapters/Storage/Postgres/sql/index.js +32 -0
  72. package/lib/Adapters/Storage/Postgres/sql/misc/json-object-set-keys.sql +19 -0
  73. package/lib/Adapters/Storage/StorageAdapter.js +2 -0
  74. package/lib/Adapters/WebSocketServer/WSAdapter.js +35 -0
  75. package/lib/Adapters/WebSocketServer/WSSAdapter.js +66 -0
  76. package/lib/Auth.js +687 -0
  77. package/lib/AuthDataLock.js +53 -0
  78. package/lib/ClientSDK.js +39 -0
  79. package/lib/Config.js +879 -0
  80. package/lib/Controllers/AdaptableController.js +72 -0
  81. package/lib/Controllers/AnalyticsController.js +43 -0
  82. package/lib/Controllers/CacheController.js +71 -0
  83. package/lib/Controllers/DatabaseController.js +1685 -0
  84. package/lib/Controllers/FilesController.js +122 -0
  85. package/lib/Controllers/HooksController.js +254 -0
  86. package/lib/Controllers/LiveQueryController.js +72 -0
  87. package/lib/Controllers/LoggerController.js +222 -0
  88. package/lib/Controllers/ParseGraphQLController.js +294 -0
  89. package/lib/Controllers/PushController.js +224 -0
  90. package/lib/Controllers/SchemaController.js +1563 -0
  91. package/lib/Controllers/UserController.js +364 -0
  92. package/lib/Controllers/index.js +251 -0
  93. package/lib/Controllers/types.js +2 -0
  94. package/lib/Deprecator/Deprecations.js +100 -0
  95. package/lib/Deprecator/Deprecator.js +140 -0
  96. package/lib/Error.js +50 -0
  97. package/lib/FileUrlValidator.js +69 -0
  98. package/lib/GraphQL/ParseGraphQLSchema.js +375 -0
  99. package/lib/GraphQL/ParseGraphQLServer.js +241 -0
  100. package/lib/GraphQL/helpers/objectsMutations.js +30 -0
  101. package/lib/GraphQL/helpers/objectsQueries.js +246 -0
  102. package/lib/GraphQL/helpers/queryComplexity.js +138 -0
  103. package/lib/GraphQL/loaders/configMutations.js +87 -0
  104. package/lib/GraphQL/loaders/configQueries.js +79 -0
  105. package/lib/GraphQL/loaders/defaultGraphQLMutations.js +21 -0
  106. package/lib/GraphQL/loaders/defaultGraphQLQueries.js +23 -0
  107. package/lib/GraphQL/loaders/defaultGraphQLTypes.js +1099 -0
  108. package/lib/GraphQL/loaders/defaultRelaySchema.js +53 -0
  109. package/lib/GraphQL/loaders/filesMutations.js +107 -0
  110. package/lib/GraphQL/loaders/functionsMutations.js +77 -0
  111. package/lib/GraphQL/loaders/parseClassMutations.js +267 -0
  112. package/lib/GraphQL/loaders/parseClassQueries.js +126 -0
  113. package/lib/GraphQL/loaders/parseClassTypes.js +493 -0
  114. package/lib/GraphQL/loaders/schemaDirectives.js +62 -0
  115. package/lib/GraphQL/loaders/schemaMutations.js +161 -0
  116. package/lib/GraphQL/loaders/schemaQueries.js +80 -0
  117. package/lib/GraphQL/loaders/schemaTypes.js +341 -0
  118. package/lib/GraphQL/loaders/usersMutations.js +433 -0
  119. package/lib/GraphQL/loaders/usersQueries.js +90 -0
  120. package/lib/GraphQL/parseGraphQLUtils.js +71 -0
  121. package/lib/GraphQL/transformers/className.js +14 -0
  122. package/lib/GraphQL/transformers/constraintType.js +53 -0
  123. package/lib/GraphQL/transformers/inputType.js +51 -0
  124. package/lib/GraphQL/transformers/mutation.js +280 -0
  125. package/lib/GraphQL/transformers/outputType.js +51 -0
  126. package/lib/GraphQL/transformers/query.js +237 -0
  127. package/lib/GraphQL/transformers/schemaFields.js +99 -0
  128. package/lib/InstallationDedup.js +178 -0
  129. package/lib/KeyPromiseQueue.js +48 -0
  130. package/lib/LiveQuery/Client.js +90 -0
  131. package/lib/LiveQuery/Id.js +20 -0
  132. package/lib/LiveQuery/ParseCloudCodePublisher.js +54 -0
  133. package/lib/LiveQuery/ParseLiveQueryServer.js +1071 -0
  134. package/lib/LiveQuery/ParsePubSub.js +37 -0
  135. package/lib/LiveQuery/ParseWebSocketServer.js +66 -0
  136. package/lib/LiveQuery/QueryTools.js +443 -0
  137. package/lib/LiveQuery/RequestSchema.js +161 -0
  138. package/lib/LiveQuery/SessionTokenCache.js +51 -0
  139. package/lib/LiveQuery/Subscription.js +47 -0
  140. package/lib/LiveQuery/equalObjects.js +50 -0
  141. package/lib/Options/Definitions.js +1599 -0
  142. package/lib/Options/docs.js +389 -0
  143. package/lib/Options/index.js +12 -0
  144. package/lib/Options/parsers.js +89 -0
  145. package/lib/Page.js +44 -0
  146. package/lib/ParseMessageQueue.js +24 -0
  147. package/lib/ParseServer.js +632 -0
  148. package/lib/ParseServerRESTController.js +173 -0
  149. package/lib/PromiseRouter.js +208 -0
  150. package/lib/Push/PushQueue.js +67 -0
  151. package/lib/Push/PushWorker.js +101 -0
  152. package/lib/Push/utils.js +129 -0
  153. package/lib/RestQuery.js +1208 -0
  154. package/lib/RestWrite.js +1671 -0
  155. package/lib/Routers/AggregateRouter.js +150 -0
  156. package/lib/Routers/AnalyticsRouter.js +26 -0
  157. package/lib/Routers/AudiencesRouter.js +54 -0
  158. package/lib/Routers/ClassesRouter.js +191 -0
  159. package/lib/Routers/CloudCodeRouter.js +87 -0
  160. package/lib/Routers/FeaturesRouter.js +72 -0
  161. package/lib/Routers/FilesRouter.js +772 -0
  162. package/lib/Routers/FunctionsRouter.js +341 -0
  163. package/lib/Routers/GlobalConfigRouter.js +123 -0
  164. package/lib/Routers/GraphQLRouter.js +41 -0
  165. package/lib/Routers/HooksRouter.js +121 -0
  166. package/lib/Routers/IAPValidationRouter.js +113 -0
  167. package/lib/Routers/InstallationsRouter.js +46 -0
  168. package/lib/Routers/LogsRouter.js +57 -0
  169. package/lib/Routers/PagesRouter.js +676 -0
  170. package/lib/Routers/PurgeRouter.js +45 -0
  171. package/lib/Routers/PushRouter.js +75 -0
  172. package/lib/Routers/RolesRouter.js +33 -0
  173. package/lib/Routers/SchemasRouter.js +118 -0
  174. package/lib/Routers/SecurityRouter.js +34 -0
  175. package/lib/Routers/SessionsRouter.js +126 -0
  176. package/lib/Routers/UsersRouter.js +733 -0
  177. package/lib/SchemaMigrations/DefinedSchemas.js +379 -0
  178. package/lib/SchemaMigrations/Migrations.js +30 -0
  179. package/lib/Security/Check.js +109 -0
  180. package/lib/Security/CheckGroup.js +44 -0
  181. package/lib/Security/CheckGroups/CheckGroupDatabase.js +44 -0
  182. package/lib/Security/CheckGroups/CheckGroupServerConfig.js +160 -0
  183. package/lib/Security/CheckGroups/CheckGroups.js +21 -0
  184. package/lib/Security/CheckRunner.js +213 -0
  185. package/lib/SharedRest.js +34 -0
  186. package/lib/StatusHandler.js +329 -0
  187. package/lib/TestUtils.js +87 -0
  188. package/lib/Utils.js +577 -0
  189. package/lib/batch.js +185 -0
  190. package/lib/cache.js +12 -0
  191. package/lib/cli/definitions/parse-live-query-server.js +9 -0
  192. package/lib/cli/definitions/parse-server.js +9 -0
  193. package/lib/cli/parse-live-query-server.js +14 -0
  194. package/lib/cli/parse-server.js +101 -0
  195. package/lib/cli/utils/commander.js +132 -0
  196. package/lib/cli/utils/runner.js +53 -0
  197. package/lib/cloud-code/Parse.Cloud.js +797 -0
  198. package/lib/cloud-code/Parse.Server.js +21 -0
  199. package/lib/cryptoUtils.js +54 -0
  200. package/lib/defaults.js +58 -0
  201. package/lib/deprecated.js +12 -0
  202. package/lib/index.js +89 -0
  203. package/lib/logger.js +40 -0
  204. package/lib/middlewares.js +810 -0
  205. package/lib/password.js +40 -0
  206. package/lib/request.js +175 -0
  207. package/lib/requiredParameter.js +11 -0
  208. package/lib/rest.js +264 -0
  209. package/lib/triggers.js +949 -0
  210. package/lib/vendor/README.md +8 -0
  211. package/lib/vendor/mongodbUrl.js +1012 -0
  212. package/package.json +172 -0
  213. package/postinstall.js +38 -0
  214. package/public/custom_json.html +17 -0
  215. package/public/custom_json.json +23 -0
  216. package/public/custom_page.html +15 -0
  217. package/public/de/email_verification_link_expired.html +24 -0
  218. package/public/de/email_verification_link_invalid.html +21 -0
  219. package/public/de/email_verification_send_fail.html +21 -0
  220. package/public/de/email_verification_send_success.html +19 -0
  221. package/public/de/email_verification_success.html +18 -0
  222. package/public/de/password_reset.html +65 -0
  223. package/public/de/password_reset_link_invalid.html +19 -0
  224. package/public/de/password_reset_success.html +18 -0
  225. package/public/de-AT/email_verification_link_expired.html +24 -0
  226. package/public/de-AT/email_verification_link_invalid.html +21 -0
  227. package/public/de-AT/email_verification_send_fail.html +21 -0
  228. package/public/de-AT/email_verification_send_success.html +19 -0
  229. package/public/de-AT/email_verification_success.html +18 -0
  230. package/public/de-AT/password_reset.html +65 -0
  231. package/public/de-AT/password_reset_link_invalid.html +19 -0
  232. package/public/de-AT/password_reset_success.html +18 -0
  233. package/public/email_verification_link_expired.html +24 -0
  234. package/public/email_verification_link_invalid.html +21 -0
  235. package/public/email_verification_send_fail.html +21 -0
  236. package/public/email_verification_send_success.html +19 -0
  237. package/public/email_verification_success.html +18 -0
  238. package/public/password_reset.html +65 -0
  239. package/public/password_reset_link_invalid.html +19 -0
  240. package/public/password_reset_success.html +18 -0
  241. package/types/@types/@parse/fs-files-adapter/index.d.ts +5 -0
  242. package/types/@types/deepcopy/index.d.ts +5 -0
  243. package/types/LiveQuery/ParseLiveQueryServer.d.ts +40 -0
  244. package/types/Options/index.d.ts +320 -0
  245. package/types/ParseServer.d.ts +65 -0
  246. package/types/eslint.config.mjs +30 -0
  247. package/types/index.d.ts +21 -0
  248. package/types/logger.d.ts +2 -0
  249. package/types/tests.ts +44 -0
  250. package/types/tsconfig.json +24 -0
  251. package/views/choose_password +215 -0
@@ -0,0 +1,129 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.applyDeviceTokenExists = applyDeviceTokenExists;
7
+ exports.bodiesPerLocales = bodiesPerLocales;
8
+ exports.getLocalesFromPush = getLocalesFromPush;
9
+ exports.groupByLocaleIdentifier = groupByLocaleIdentifier;
10
+ exports.isPushIncrementing = isPushIncrementing;
11
+ exports.stripLocalesFromBody = stripLocalesFromBody;
12
+ exports.transformPushBodyForLocale = transformPushBodyForLocale;
13
+ exports.validatePushType = validatePushType;
14
+ var _node = _interopRequireDefault(require("parse/node"));
15
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
16
+ function isPushIncrementing(body) {
17
+ if (!body.data || !body.data.badge) {
18
+ return false;
19
+ }
20
+ const badge = body.data.badge;
21
+ if (typeof badge == 'string' && badge.toLowerCase() == 'increment') {
22
+ return true;
23
+ }
24
+ return typeof badge == 'object' && typeof badge.__op == 'string' && badge.__op.toLowerCase() == 'increment' && Number(badge.amount);
25
+ }
26
+ const localizableKeys = ['alert', 'title'];
27
+ function getLocalesFromPush(body) {
28
+ const data = body.data;
29
+ if (!data) {
30
+ return [];
31
+ }
32
+ return [...new Set(Object.keys(data).reduce((memo, key) => {
33
+ localizableKeys.forEach(localizableKey => {
34
+ if (key.indexOf(`${localizableKey}-`) == 0) {
35
+ memo.push(key.slice(localizableKey.length + 1));
36
+ }
37
+ });
38
+ return memo;
39
+ }, []))];
40
+ }
41
+ function transformPushBodyForLocale(body, locale) {
42
+ const data = body.data;
43
+ if (!data) {
44
+ return body;
45
+ }
46
+ body = structuredClone(body);
47
+ localizableKeys.forEach(key => {
48
+ const localeValue = body.data[`${key}-${locale}`];
49
+ if (localeValue) {
50
+ body.data[key] = localeValue;
51
+ }
52
+ });
53
+ return stripLocalesFromBody(body);
54
+ }
55
+ function stripLocalesFromBody(body) {
56
+ if (!body.data) {
57
+ return body;
58
+ }
59
+ Object.keys(body.data).forEach(key => {
60
+ localizableKeys.forEach(localizableKey => {
61
+ if (key.indexOf(`${localizableKey}-`) == 0) {
62
+ delete body.data[key];
63
+ }
64
+ });
65
+ });
66
+ return body;
67
+ }
68
+ function bodiesPerLocales(body, locales = []) {
69
+ // Get all tranformed bodies for each locale
70
+ const result = locales.reduce((memo, locale) => {
71
+ memo[locale] = transformPushBodyForLocale(body, locale);
72
+ return memo;
73
+ }, {});
74
+ // Set the default locale, with the stripped body
75
+ result.default = stripLocalesFromBody(body);
76
+ return result;
77
+ }
78
+ function groupByLocaleIdentifier(installations, locales = []) {
79
+ return installations.reduce((map, installation) => {
80
+ let added = false;
81
+ locales.forEach(locale => {
82
+ if (added) {
83
+ return;
84
+ }
85
+ if (installation.localeIdentifier && installation.localeIdentifier.indexOf(locale) === 0) {
86
+ added = true;
87
+ map[locale] = map[locale] || [];
88
+ map[locale].push(installation);
89
+ }
90
+ });
91
+ if (!added) {
92
+ map.default.push(installation);
93
+ }
94
+ return map;
95
+ }, {
96
+ default: []
97
+ });
98
+ }
99
+
100
+ /**
101
+ * Check whether the deviceType parameter in qury condition is valid or not.
102
+ * @param {Object} where A query condition
103
+ * @param {Array} validPushTypes An array of valid push types(string)
104
+ */
105
+ function validatePushType(where = {}, validPushTypes = []) {
106
+ var deviceTypeField = where.deviceType || {};
107
+ var deviceTypes = [];
108
+ if (typeof deviceTypeField === 'string') {
109
+ deviceTypes.push(deviceTypeField);
110
+ } else if (Array.isArray(deviceTypeField['$in'])) {
111
+ deviceTypes.concat(deviceTypeField['$in']);
112
+ }
113
+ for (var i = 0; i < deviceTypes.length; i++) {
114
+ var deviceType = deviceTypes[i];
115
+ if (validPushTypes.indexOf(deviceType) < 0) {
116
+ throw new _node.default.Error(_node.default.Error.PUSH_MISCONFIGURED, deviceType + ' is not supported push type.');
117
+ }
118
+ }
119
+ }
120
+ function applyDeviceTokenExists(where) {
121
+ where = structuredClone(where);
122
+ if (!Object.prototype.hasOwnProperty.call(where, 'deviceToken')) {
123
+ where['deviceToken'] = {
124
+ $exists: true
125
+ };
126
+ }
127
+ return where;
128
+ }
129
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbm9kZSIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJyZXF1aXJlIiwiZSIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0IiwiaXNQdXNoSW5jcmVtZW50aW5nIiwiYm9keSIsImRhdGEiLCJiYWRnZSIsInRvTG93ZXJDYXNlIiwiX19vcCIsIk51bWJlciIsImFtb3VudCIsImxvY2FsaXphYmxlS2V5cyIsImdldExvY2FsZXNGcm9tUHVzaCIsIlNldCIsIk9iamVjdCIsImtleXMiLCJyZWR1Y2UiLCJtZW1vIiwia2V5IiwiZm9yRWFjaCIsImxvY2FsaXphYmxlS2V5IiwiaW5kZXhPZiIsInB1c2giLCJzbGljZSIsImxlbmd0aCIsInRyYW5zZm9ybVB1c2hCb2R5Rm9yTG9jYWxlIiwibG9jYWxlIiwic3RydWN0dXJlZENsb25lIiwibG9jYWxlVmFsdWUiLCJzdHJpcExvY2FsZXNGcm9tQm9keSIsImJvZGllc1BlckxvY2FsZXMiLCJsb2NhbGVzIiwicmVzdWx0IiwiZ3JvdXBCeUxvY2FsZUlkZW50aWZpZXIiLCJpbnN0YWxsYXRpb25zIiwibWFwIiwiaW5zdGFsbGF0aW9uIiwiYWRkZWQiLCJsb2NhbGVJZGVudGlmaWVyIiwidmFsaWRhdGVQdXNoVHlwZSIsIndoZXJlIiwidmFsaWRQdXNoVHlwZXMiLCJkZXZpY2VUeXBlRmllbGQiLCJkZXZpY2VUeXBlIiwiZGV2aWNlVHlwZXMiLCJBcnJheSIsImlzQXJyYXkiLCJjb25jYXQiLCJpIiwiUGFyc2UiLCJFcnJvciIsIlBVU0hfTUlTQ09ORklHVVJFRCIsImFwcGx5RGV2aWNlVG9rZW5FeGlzdHMiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCIkZXhpc3RzIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL1B1c2gvdXRpbHMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFBhcnNlIGZyb20gJ3BhcnNlL25vZGUnO1xuXG5cbmV4cG9ydCBmdW5jdGlvbiBpc1B1c2hJbmNyZW1lbnRpbmcoYm9keSkge1xuICBpZiAoIWJvZHkuZGF0YSB8fCAhYm9keS5kYXRhLmJhZGdlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgYmFkZ2UgPSBib2R5LmRhdGEuYmFkZ2U7XG4gIGlmICh0eXBlb2YgYmFkZ2UgPT0gJ3N0cmluZycgJiYgYmFkZ2UudG9Mb3dlckNhc2UoKSA9PSAnaW5jcmVtZW50Jykge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIChcbiAgICB0eXBlb2YgYmFkZ2UgPT0gJ29iamVjdCcgJiZcbiAgICB0eXBlb2YgYmFkZ2UuX19vcCA9PSAnc3RyaW5nJyAmJlxuICAgIGJhZGdlLl9fb3AudG9Mb3dlckNhc2UoKSA9PSAnaW5jcmVtZW50JyAmJlxuICAgIE51bWJlcihiYWRnZS5hbW91bnQpXG4gICk7XG59XG5cbmNvbnN0IGxvY2FsaXphYmxlS2V5cyA9IFsnYWxlcnQnLCAndGl0bGUnXTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldExvY2FsZXNGcm9tUHVzaChib2R5KSB7XG4gIGNvbnN0IGRhdGEgPSBib2R5LmRhdGE7XG4gIGlmICghZGF0YSkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICByZXR1cm4gW1xuICAgIC4uLm5ldyBTZXQoXG4gICAgICBPYmplY3Qua2V5cyhkYXRhKS5yZWR1Y2UoKG1lbW8sIGtleSkgPT4ge1xuICAgICAgICBsb2NhbGl6YWJsZUtleXMuZm9yRWFjaChsb2NhbGl6YWJsZUtleSA9PiB7XG4gICAgICAgICAgaWYgKGtleS5pbmRleE9mKGAke2xvY2FsaXphYmxlS2V5fS1gKSA9PSAwKSB7XG4gICAgICAgICAgICBtZW1vLnB1c2goa2V5LnNsaWNlKGxvY2FsaXphYmxlS2V5Lmxlbmd0aCArIDEpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gbWVtbztcbiAgICAgIH0sIFtdKVxuICAgICksXG4gIF07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2Zvcm1QdXNoQm9keUZvckxvY2FsZShib2R5LCBsb2NhbGUpIHtcbiAgY29uc3QgZGF0YSA9IGJvZHkuZGF0YTtcbiAgaWYgKCFkYXRhKSB7XG4gICAgcmV0dXJuIGJvZHk7XG4gIH1cbiAgYm9keSA9IHN0cnVjdHVyZWRDbG9uZShib2R5KTtcbiAgbG9jYWxpemFibGVLZXlzLmZvckVhY2goa2V5ID0+IHtcbiAgICBjb25zdCBsb2NhbGVWYWx1ZSA9IGJvZHkuZGF0YVtgJHtrZXl9LSR7bG9jYWxlfWBdO1xuICAgIGlmIChsb2NhbGVWYWx1ZSkge1xuICAgICAgYm9keS5kYXRhW2tleV0gPSBsb2NhbGVWYWx1ZTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gc3RyaXBMb2NhbGVzRnJvbUJvZHkoYm9keSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzdHJpcExvY2FsZXNGcm9tQm9keShib2R5KSB7XG4gIGlmICghYm9keS5kYXRhKSB7XG4gICAgcmV0dXJuIGJvZHk7XG4gIH1cbiAgT2JqZWN0LmtleXMoYm9keS5kYXRhKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgbG9jYWxpemFibGVLZXlzLmZvckVhY2gobG9jYWxpemFibGVLZXkgPT4ge1xuICAgICAgaWYgKGtleS5pbmRleE9mKGAke2xvY2FsaXphYmxlS2V5fS1gKSA9PSAwKSB7XG4gICAgICAgIGRlbGV0ZSBib2R5LmRhdGFba2V5XTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG4gIHJldHVybiBib2R5O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYm9kaWVzUGVyTG9jYWxlcyhib2R5LCBsb2NhbGVzID0gW10pIHtcbiAgLy8gR2V0IGFsbCB0cmFuZm9ybWVkIGJvZGllcyBmb3IgZWFjaCBsb2NhbGVcbiAgY29uc3QgcmVzdWx0ID0gbG9jYWxlcy5yZWR1Y2UoKG1lbW8sIGxvY2FsZSkgPT4ge1xuICAgIG1lbW9bbG9jYWxlXSA9IHRyYW5zZm9ybVB1c2hCb2R5Rm9yTG9jYWxlKGJvZHksIGxvY2FsZSk7XG4gICAgcmV0dXJuIG1lbW87XG4gIH0sIHt9KTtcbiAgLy8gU2V0IHRoZSBkZWZhdWx0IGxvY2FsZSwgd2l0aCB0aGUgc3RyaXBwZWQgYm9keVxuICByZXN1bHQuZGVmYXVsdCA9IHN0cmlwTG9jYWxlc0Zyb21Cb2R5KGJvZHkpO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ3JvdXBCeUxvY2FsZUlkZW50aWZpZXIoaW5zdGFsbGF0aW9ucywgbG9jYWxlcyA9IFtdKSB7XG4gIHJldHVybiBpbnN0YWxsYXRpb25zLnJlZHVjZShcbiAgICAobWFwLCBpbnN0YWxsYXRpb24pID0+IHtcbiAgICAgIGxldCBhZGRlZCA9IGZhbHNlO1xuICAgICAgbG9jYWxlcy5mb3JFYWNoKGxvY2FsZSA9PiB7XG4gICAgICAgIGlmIChhZGRlZCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaW5zdGFsbGF0aW9uLmxvY2FsZUlkZW50aWZpZXIgJiYgaW5zdGFsbGF0aW9uLmxvY2FsZUlkZW50aWZpZXIuaW5kZXhPZihsb2NhbGUpID09PSAwKSB7XG4gICAgICAgICAgYWRkZWQgPSB0cnVlO1xuICAgICAgICAgIG1hcFtsb2NhbGVdID0gbWFwW2xvY2FsZV0gfHwgW107XG4gICAgICAgICAgbWFwW2xvY2FsZV0ucHVzaChpbnN0YWxsYXRpb24pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGlmICghYWRkZWQpIHtcbiAgICAgICAgbWFwLmRlZmF1bHQucHVzaChpbnN0YWxsYXRpb24pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG1hcDtcbiAgICB9LFxuICAgIHsgZGVmYXVsdDogW10gfVxuICApO1xufVxuXG4vKipcbiAqIENoZWNrIHdoZXRoZXIgdGhlIGRldmljZVR5cGUgcGFyYW1ldGVyIGluIHF1cnkgY29uZGl0aW9uIGlzIHZhbGlkIG9yIG5vdC5cbiAqIEBwYXJhbSB7T2JqZWN0fSB3aGVyZSBBIHF1ZXJ5IGNvbmRpdGlvblxuICogQHBhcmFtIHtBcnJheX0gdmFsaWRQdXNoVHlwZXMgQW4gYXJyYXkgb2YgdmFsaWQgcHVzaCB0eXBlcyhzdHJpbmcpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVB1c2hUeXBlKHdoZXJlID0ge30sIHZhbGlkUHVzaFR5cGVzID0gW10pIHtcbiAgdmFyIGRldmljZVR5cGVGaWVsZCA9IHdoZXJlLmRldmljZVR5cGUgfHwge307XG4gIHZhciBkZXZpY2VUeXBlcyA9IFtdO1xuICBpZiAodHlwZW9mIGRldmljZVR5cGVGaWVsZCA9PT0gJ3N0cmluZycpIHtcbiAgICBkZXZpY2VUeXBlcy5wdXNoKGRldmljZVR5cGVGaWVsZCk7XG4gIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShkZXZpY2VUeXBlRmllbGRbJyRpbiddKSkge1xuICAgIGRldmljZVR5cGVzLmNvbmNhdChkZXZpY2VUeXBlRmllbGRbJyRpbiddKTtcbiAgfVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGRldmljZVR5cGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGRldmljZVR5cGUgPSBkZXZpY2VUeXBlc1tpXTtcbiAgICBpZiAodmFsaWRQdXNoVHlwZXMuaW5kZXhPZihkZXZpY2VUeXBlKSA8IDApIHtcbiAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihcbiAgICAgICAgUGFyc2UuRXJyb3IuUFVTSF9NSVNDT05GSUdVUkVELFxuICAgICAgICBkZXZpY2VUeXBlICsgJyBpcyBub3Qgc3VwcG9ydGVkIHB1c2ggdHlwZS4nXG4gICAgICApO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlEZXZpY2VUb2tlbkV4aXN0cyh3aGVyZSkge1xuICB3aGVyZSA9IHN0cnVjdHVyZWRDbG9uZSh3aGVyZSk7XG4gIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHdoZXJlLCAnZGV2aWNlVG9rZW4nKSkge1xuICAgIHdoZXJlWydkZXZpY2VUb2tlbiddID0geyAkZXhpc3RzOiB0cnVlIH07XG4gIH1cbiAgcmV0dXJuIHdoZXJlO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7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