parse-server 2.8.4 → 8.6.2

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 (240) hide show
  1. package/LICENSE +167 -25
  2. package/NOTICE +10 -0
  3. package/README.md +929 -278
  4. package/lib/AccountLockout.js +47 -30
  5. package/lib/Adapters/AdapterLoader.js +21 -6
  6. package/lib/Adapters/Analytics/AnalyticsAdapter.js +15 -12
  7. package/lib/Adapters/Auth/AuthAdapter.js +116 -13
  8. package/lib/Adapters/Auth/BaseCodeAuthAdapter.js +99 -0
  9. package/lib/Adapters/Auth/OAuth1Client.js +27 -46
  10. package/lib/Adapters/Auth/apple.js +123 -0
  11. package/lib/Adapters/Auth/facebook.js +162 -35
  12. package/lib/Adapters/Auth/gcenter.js +217 -0
  13. package/lib/Adapters/Auth/github.js +118 -48
  14. package/lib/Adapters/Auth/google.js +160 -51
  15. package/lib/Adapters/Auth/gpgames.js +125 -0
  16. package/lib/Adapters/Auth/httpsRequest.js +6 -7
  17. package/lib/Adapters/Auth/index.js +170 -62
  18. package/lib/Adapters/Auth/instagram.js +114 -40
  19. package/lib/Adapters/Auth/janraincapture.js +52 -23
  20. package/lib/Adapters/Auth/janrainengage.js +19 -36
  21. package/lib/Adapters/Auth/keycloak.js +148 -0
  22. package/lib/Adapters/Auth/ldap.js +167 -0
  23. package/lib/Adapters/Auth/line.js +125 -0
  24. package/lib/Adapters/Auth/linkedin.js +111 -55
  25. package/lib/Adapters/Auth/meetup.js +24 -34
  26. package/lib/Adapters/Auth/mfa.js +324 -0
  27. package/lib/Adapters/Auth/microsoft.js +111 -0
  28. package/lib/Adapters/Auth/oauth2.js +97 -162
  29. package/lib/Adapters/Auth/phantauth.js +53 -0
  30. package/lib/Adapters/Auth/qq.js +108 -49
  31. package/lib/Adapters/Auth/spotify.js +107 -55
  32. package/lib/Adapters/Auth/twitter.js +188 -48
  33. package/lib/Adapters/Auth/utils.js +28 -0
  34. package/lib/Adapters/Auth/vkontakte.js +26 -39
  35. package/lib/Adapters/Auth/wechat.js +106 -44
  36. package/lib/Adapters/Auth/weibo.js +132 -58
  37. package/lib/Adapters/Cache/CacheAdapter.js +13 -8
  38. package/lib/Adapters/Cache/InMemoryCache.js +3 -13
  39. package/lib/Adapters/Cache/InMemoryCacheAdapter.js +5 -13
  40. package/lib/Adapters/Cache/LRUCache.js +13 -27
  41. package/lib/Adapters/Cache/NullCacheAdapter.js +3 -8
  42. package/lib/Adapters/Cache/RedisCacheAdapter.js +85 -76
  43. package/lib/Adapters/Cache/SchemaCache.js +25 -0
  44. package/lib/Adapters/Email/MailAdapter.js +10 -8
  45. package/lib/Adapters/Files/FilesAdapter.js +83 -25
  46. package/lib/Adapters/Files/GridFSBucketAdapter.js +231 -0
  47. package/lib/Adapters/Files/GridStoreAdapter.js +4 -91
  48. package/lib/Adapters/Logger/LoggerAdapter.js +18 -14
  49. package/lib/Adapters/Logger/WinstonLogger.js +69 -88
  50. package/lib/Adapters/Logger/WinstonLoggerAdapter.js +7 -16
  51. package/lib/Adapters/MessageQueue/EventEmitterMQ.js +8 -26
  52. package/lib/Adapters/PubSub/EventEmitterPubSub.js +12 -25
  53. package/lib/Adapters/PubSub/PubSubAdapter.js +34 -0
  54. package/lib/Adapters/PubSub/RedisPubSub.js +42 -19
  55. package/lib/Adapters/Push/PushAdapter.js +14 -7
  56. package/lib/Adapters/Storage/Mongo/MongoCollection.js +137 -45
  57. package/lib/Adapters/Storage/Mongo/MongoSchemaCollection.js +158 -63
  58. package/lib/Adapters/Storage/Mongo/MongoStorageAdapter.js +320 -168
  59. package/lib/Adapters/Storage/Mongo/MongoTransform.js +279 -306
  60. package/lib/Adapters/Storage/Postgres/PostgresClient.js +14 -10
  61. package/lib/Adapters/Storage/Postgres/PostgresConfigParser.js +47 -21
  62. package/lib/Adapters/Storage/Postgres/PostgresStorageAdapter.js +854 -468
  63. package/lib/Adapters/Storage/Postgres/sql/index.js +4 -6
  64. package/lib/Adapters/Storage/StorageAdapter.js +1 -1
  65. package/lib/Adapters/WebSocketServer/WSAdapter.js +35 -0
  66. package/lib/Adapters/WebSocketServer/WSSAdapter.js +66 -0
  67. package/lib/Auth.js +488 -125
  68. package/lib/ClientSDK.js +2 -6
  69. package/lib/Config.js +525 -94
  70. package/lib/Controllers/AdaptableController.js +5 -25
  71. package/lib/Controllers/AnalyticsController.js +22 -23
  72. package/lib/Controllers/CacheController.js +10 -31
  73. package/lib/Controllers/DatabaseController.js +767 -313
  74. package/lib/Controllers/FilesController.js +49 -54
  75. package/lib/Controllers/HooksController.js +80 -84
  76. package/lib/Controllers/LiveQueryController.js +35 -22
  77. package/lib/Controllers/LoggerController.js +22 -58
  78. package/lib/Controllers/ParseGraphQLController.js +293 -0
  79. package/lib/Controllers/PushController.js +58 -49
  80. package/lib/Controllers/SchemaController.js +916 -422
  81. package/lib/Controllers/UserController.js +265 -180
  82. package/lib/Controllers/index.js +90 -125
  83. package/lib/Controllers/types.js +1 -1
  84. package/lib/Deprecator/Deprecations.js +30 -0
  85. package/lib/Deprecator/Deprecator.js +127 -0
  86. package/lib/Error.js +48 -0
  87. package/lib/GraphQL/ParseGraphQLSchema.js +375 -0
  88. package/lib/GraphQL/ParseGraphQLServer.js +214 -0
  89. package/lib/GraphQL/helpers/objectsMutations.js +30 -0
  90. package/lib/GraphQL/helpers/objectsQueries.js +246 -0
  91. package/lib/GraphQL/loaders/configMutations.js +87 -0
  92. package/lib/GraphQL/loaders/configQueries.js +79 -0
  93. package/lib/GraphQL/loaders/defaultGraphQLMutations.js +21 -0
  94. package/lib/GraphQL/loaders/defaultGraphQLQueries.js +23 -0
  95. package/lib/GraphQL/loaders/defaultGraphQLTypes.js +1098 -0
  96. package/lib/GraphQL/loaders/defaultRelaySchema.js +53 -0
  97. package/lib/GraphQL/loaders/filesMutations.js +107 -0
  98. package/lib/GraphQL/loaders/functionsMutations.js +78 -0
  99. package/lib/GraphQL/loaders/parseClassMutations.js +268 -0
  100. package/lib/GraphQL/loaders/parseClassQueries.js +127 -0
  101. package/lib/GraphQL/loaders/parseClassTypes.js +493 -0
  102. package/lib/GraphQL/loaders/schemaDirectives.js +62 -0
  103. package/lib/GraphQL/loaders/schemaMutations.js +162 -0
  104. package/lib/GraphQL/loaders/schemaQueries.js +81 -0
  105. package/lib/GraphQL/loaders/schemaTypes.js +341 -0
  106. package/lib/GraphQL/loaders/usersMutations.js +433 -0
  107. package/lib/GraphQL/loaders/usersQueries.js +90 -0
  108. package/lib/GraphQL/parseGraphQLUtils.js +63 -0
  109. package/lib/GraphQL/transformers/className.js +14 -0
  110. package/lib/GraphQL/transformers/constraintType.js +53 -0
  111. package/lib/GraphQL/transformers/inputType.js +51 -0
  112. package/lib/GraphQL/transformers/mutation.js +274 -0
  113. package/lib/GraphQL/transformers/outputType.js +51 -0
  114. package/lib/GraphQL/transformers/query.js +237 -0
  115. package/lib/GraphQL/transformers/schemaFields.js +99 -0
  116. package/lib/KeyPromiseQueue.js +48 -0
  117. package/lib/LiveQuery/Client.js +25 -33
  118. package/lib/LiveQuery/Id.js +2 -5
  119. package/lib/LiveQuery/ParseCloudCodePublisher.js +26 -23
  120. package/lib/LiveQuery/ParseLiveQueryServer.js +560 -285
  121. package/lib/LiveQuery/ParsePubSub.js +7 -16
  122. package/lib/LiveQuery/ParseWebSocketServer.js +42 -39
  123. package/lib/LiveQuery/QueryTools.js +76 -15
  124. package/lib/LiveQuery/RequestSchema.js +111 -97
  125. package/lib/LiveQuery/SessionTokenCache.js +23 -36
  126. package/lib/LiveQuery/Subscription.js +8 -17
  127. package/lib/LiveQuery/equalObjects.js +2 -3
  128. package/lib/Options/Definitions.js +1355 -382
  129. package/lib/Options/docs.js +301 -62
  130. package/lib/Options/index.js +11 -1
  131. package/lib/Options/parsers.js +14 -10
  132. package/lib/Page.js +44 -0
  133. package/lib/ParseMessageQueue.js +6 -13
  134. package/lib/ParseServer.js +474 -235
  135. package/lib/ParseServerRESTController.js +102 -40
  136. package/lib/PromiseRouter.js +39 -50
  137. package/lib/Push/PushQueue.js +24 -30
  138. package/lib/Push/PushWorker.js +32 -56
  139. package/lib/Push/utils.js +22 -35
  140. package/lib/RestQuery.js +361 -139
  141. package/lib/RestWrite.js +713 -344
  142. package/lib/Routers/AggregateRouter.js +97 -71
  143. package/lib/Routers/AnalyticsRouter.js +8 -14
  144. package/lib/Routers/AudiencesRouter.js +16 -35
  145. package/lib/Routers/ClassesRouter.js +86 -72
  146. package/lib/Routers/CloudCodeRouter.js +28 -37
  147. package/lib/Routers/FeaturesRouter.js +22 -25
  148. package/lib/Routers/FilesRouter.js +266 -171
  149. package/lib/Routers/FunctionsRouter.js +87 -103
  150. package/lib/Routers/GlobalConfigRouter.js +94 -33
  151. package/lib/Routers/GraphQLRouter.js +41 -0
  152. package/lib/Routers/HooksRouter.js +43 -47
  153. package/lib/Routers/IAPValidationRouter.js +57 -70
  154. package/lib/Routers/InstallationsRouter.js +17 -25
  155. package/lib/Routers/LogsRouter.js +10 -25
  156. package/lib/Routers/PagesRouter.js +647 -0
  157. package/lib/Routers/PublicAPIRouter.js +104 -112
  158. package/lib/Routers/PurgeRouter.js +19 -29
  159. package/lib/Routers/PushRouter.js +14 -28
  160. package/lib/Routers/RolesRouter.js +7 -14
  161. package/lib/Routers/SchemasRouter.js +63 -42
  162. package/lib/Routers/SecurityRouter.js +34 -0
  163. package/lib/Routers/SessionsRouter.js +25 -38
  164. package/lib/Routers/UsersRouter.js +463 -190
  165. package/lib/SchemaMigrations/DefinedSchemas.js +379 -0
  166. package/lib/SchemaMigrations/Migrations.js +30 -0
  167. package/lib/Security/Check.js +109 -0
  168. package/lib/Security/CheckGroup.js +44 -0
  169. package/lib/Security/CheckGroups/CheckGroupDatabase.js +44 -0
  170. package/lib/Security/CheckGroups/CheckGroupServerConfig.js +96 -0
  171. package/lib/Security/CheckGroups/CheckGroups.js +21 -0
  172. package/lib/Security/CheckRunner.js +213 -0
  173. package/lib/SharedRest.js +29 -0
  174. package/lib/StatusHandler.js +96 -93
  175. package/lib/TestUtils.js +70 -14
  176. package/lib/Utils.js +468 -0
  177. package/lib/batch.js +74 -40
  178. package/lib/cache.js +8 -8
  179. package/lib/cli/definitions/parse-live-query-server.js +4 -3
  180. package/lib/cli/definitions/parse-server.js +4 -3
  181. package/lib/cli/parse-live-query-server.js +9 -17
  182. package/lib/cli/parse-server.js +49 -47
  183. package/lib/cli/utils/commander.js +20 -29
  184. package/lib/cli/utils/runner.js +31 -32
  185. package/lib/cloud-code/Parse.Cloud.js +711 -36
  186. package/lib/cloud-code/Parse.Server.js +21 -0
  187. package/lib/cryptoUtils.js +6 -11
  188. package/lib/defaults.js +21 -15
  189. package/lib/deprecated.js +1 -1
  190. package/lib/index.js +78 -67
  191. package/lib/logger.js +12 -20
  192. package/lib/middlewares.js +484 -160
  193. package/lib/password.js +10 -6
  194. package/lib/request.js +175 -0
  195. package/lib/requiredParameter.js +4 -3
  196. package/lib/rest.js +157 -82
  197. package/lib/triggers.js +627 -185
  198. package/lib/vendor/README.md +3 -3
  199. package/lib/vendor/mongodbUrl.js +224 -137
  200. package/package.json +135 -57
  201. package/postinstall.js +38 -50
  202. package/public_html/invalid_verification_link.html +3 -3
  203. package/types/@types/@parse/fs-files-adapter/index.d.ts +5 -0
  204. package/types/@types/deepcopy/index.d.ts +5 -0
  205. package/types/LiveQuery/ParseLiveQueryServer.d.ts +40 -0
  206. package/types/Options/index.d.ts +301 -0
  207. package/types/ParseServer.d.ts +65 -0
  208. package/types/eslint.config.mjs +30 -0
  209. package/types/index.d.ts +21 -0
  210. package/types/logger.d.ts +2 -0
  211. package/types/tests.ts +44 -0
  212. package/types/tsconfig.json +24 -0
  213. package/CHANGELOG.md +0 -1246
  214. package/PATENTS +0 -37
  215. package/bin/dev +0 -37
  216. package/lib/.DS_Store +0 -0
  217. package/lib/Adapters/Auth/common.js +0 -2
  218. package/lib/Adapters/Auth/facebookaccountkit.js +0 -69
  219. package/lib/Controllers/SchemaCache.js +0 -97
  220. package/lib/LiveQuery/.DS_Store +0 -0
  221. package/lib/cli/utils/parsers.js +0 -77
  222. package/lib/cloud-code/.DS_Store +0 -0
  223. package/lib/cloud-code/HTTPResponse.js +0 -57
  224. package/lib/cloud-code/Untitled-1 +0 -123
  225. package/lib/cloud-code/httpRequest.js +0 -102
  226. package/lib/cloud-code/team.html +0 -123
  227. package/lib/graphql/ParseClass.js +0 -234
  228. package/lib/graphql/Schema.js +0 -197
  229. package/lib/graphql/index.js +0 -1
  230. package/lib/graphql/types/ACL.js +0 -35
  231. package/lib/graphql/types/Date.js +0 -25
  232. package/lib/graphql/types/File.js +0 -24
  233. package/lib/graphql/types/GeoPoint.js +0 -35
  234. package/lib/graphql/types/JSONObject.js +0 -30
  235. package/lib/graphql/types/NumberInput.js +0 -43
  236. package/lib/graphql/types/NumberQuery.js +0 -42
  237. package/lib/graphql/types/Pointer.js +0 -35
  238. package/lib/graphql/types/QueryConstraint.js +0 -61
  239. package/lib/graphql/types/StringQuery.js +0 -39
  240. package/lib/graphql/types/index.js +0 -110
@@ -1,21 +1,12 @@
1
- 'use strict';
1
+ "use strict";
2
2
 
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
-
7
- var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
8
-
9
- var _MongoCollection = require('./MongoCollection');
10
-
11
- var _MongoCollection2 = _interopRequireDefault(_MongoCollection);
12
-
13
- var _node = require('parse/node');
14
-
15
- var _node2 = _interopRequireDefault(_node);
16
-
17
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
18
-
6
+ exports.default = void 0;
7
+ var _MongoCollection = _interopRequireDefault(require("./MongoCollection"));
8
+ var _node = _interopRequireDefault(require("parse/node"));
9
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
19
10
  function mongoFieldToParseSchemaField(type) {
20
11
  if (type[0] === '*') {
21
12
  return {
@@ -31,70 +22,128 @@ function mongoFieldToParseSchemaField(type) {
31
22
  }
32
23
  switch (type) {
33
24
  case 'number':
34
- return { type: 'Number' };
25
+ return {
26
+ type: 'Number'
27
+ };
35
28
  case 'string':
36
- return { type: 'String' };
29
+ return {
30
+ type: 'String'
31
+ };
37
32
  case 'boolean':
38
- return { type: 'Boolean' };
33
+ return {
34
+ type: 'Boolean'
35
+ };
39
36
  case 'date':
40
- return { type: 'Date' };
37
+ return {
38
+ type: 'Date'
39
+ };
41
40
  case 'map':
42
41
  case 'object':
43
- return { type: 'Object' };
42
+ return {
43
+ type: 'Object'
44
+ };
44
45
  case 'array':
45
- return { type: 'Array' };
46
+ return {
47
+ type: 'Array'
48
+ };
46
49
  case 'geopoint':
47
- return { type: 'GeoPoint' };
50
+ return {
51
+ type: 'GeoPoint'
52
+ };
48
53
  case 'file':
49
- return { type: 'File' };
54
+ return {
55
+ type: 'File'
56
+ };
50
57
  case 'bytes':
51
- return { type: 'Bytes' };
58
+ return {
59
+ type: 'Bytes'
60
+ };
52
61
  case 'polygon':
53
- return { type: 'Polygon' };
62
+ return {
63
+ type: 'Polygon'
64
+ };
54
65
  }
55
66
  }
56
-
57
67
  const nonFieldSchemaKeys = ['_id', '_metadata', '_client_permissions'];
58
68
  function mongoSchemaFieldsToParseSchemaFields(schema) {
59
69
  var fieldNames = Object.keys(schema).filter(key => nonFieldSchemaKeys.indexOf(key) === -1);
60
70
  var response = fieldNames.reduce((obj, fieldName) => {
61
71
  obj[fieldName] = mongoFieldToParseSchemaField(schema[fieldName]);
72
+ if (schema._metadata && schema._metadata.fields_options && schema._metadata.fields_options[fieldName]) {
73
+ obj[fieldName] = Object.assign({}, obj[fieldName], schema._metadata.fields_options[fieldName]);
74
+ }
62
75
  return obj;
63
76
  }, {});
64
- response.ACL = { type: 'ACL' };
65
- response.createdAt = { type: 'Date' };
66
- response.updatedAt = { type: 'Date' };
67
- response.objectId = { type: 'String' };
77
+ response.ACL = {
78
+ type: 'ACL'
79
+ };
80
+ response.createdAt = {
81
+ type: 'Date'
82
+ };
83
+ response.updatedAt = {
84
+ type: 'Date'
85
+ };
86
+ response.objectId = {
87
+ type: 'String'
88
+ };
68
89
  return response;
69
90
  }
70
-
71
91
  const emptyCLPS = Object.freeze({
72
92
  find: {},
93
+ count: {},
73
94
  get: {},
74
95
  create: {},
75
96
  update: {},
76
97
  delete: {},
77
- addField: {}
98
+ addField: {},
99
+ protectedFields: {}
78
100
  });
79
-
80
101
  const defaultCLPS = Object.freeze({
81
- find: { '*': true },
82
- get: { '*': true },
83
- create: { '*': true },
84
- update: { '*': true },
85
- delete: { '*': true },
86
- addField: { '*': true }
102
+ ACL: {
103
+ '*': {
104
+ read: true,
105
+ write: true
106
+ }
107
+ },
108
+ find: {
109
+ '*': true
110
+ },
111
+ count: {
112
+ '*': true
113
+ },
114
+ get: {
115
+ '*': true
116
+ },
117
+ create: {
118
+ '*': true
119
+ },
120
+ update: {
121
+ '*': true
122
+ },
123
+ delete: {
124
+ '*': true
125
+ },
126
+ addField: {
127
+ '*': true
128
+ },
129
+ protectedFields: {
130
+ '*': []
131
+ }
87
132
  });
88
-
89
133
  function mongoSchemaToParseSchema(mongoSchema) {
90
134
  let clps = defaultCLPS;
91
135
  let indexes = {};
92
136
  if (mongoSchema._metadata) {
93
137
  if (mongoSchema._metadata.class_permissions) {
94
- clps = _extends({}, emptyCLPS, mongoSchema._metadata.class_permissions);
138
+ clps = {
139
+ ...emptyCLPS,
140
+ ...mongoSchema._metadata.class_permissions
141
+ };
95
142
  }
96
143
  if (mongoSchema._metadata.indexes) {
97
- indexes = _extends({}, mongoSchema._metadata.indexes);
144
+ indexes = {
145
+ ...mongoSchema._metadata.indexes
146
+ };
98
147
  }
99
148
  }
100
149
  return {
@@ -104,9 +153,10 @@ function mongoSchemaToParseSchema(mongoSchema) {
104
153
  indexes: indexes
105
154
  };
106
155
  }
107
-
108
156
  function _mongoSchemaQueryFromNameQuery(name, query) {
109
- const object = { _id: name };
157
+ const object = {
158
+ _id: name
159
+ };
110
160
  if (query) {
111
161
  Object.keys(query).forEach(key => {
112
162
  object[key] = query[key];
@@ -117,7 +167,10 @@ function _mongoSchemaQueryFromNameQuery(name, query) {
117
167
 
118
168
  // Returns a type suitable for inserting into mongo _SCHEMA collection.
119
169
  // Does no validation. That is expected to be done in Parse Server.
120
- function parseFieldTypeToMongoFieldType({ type, targetClass }) {
170
+ function parseFieldTypeToMongoFieldType({
171
+ type,
172
+ targetClass
173
+ }) {
121
174
  switch (type) {
122
175
  case 'Pointer':
123
176
  return `*${targetClass}`;
@@ -145,19 +198,17 @@ function parseFieldTypeToMongoFieldType({ type, targetClass }) {
145
198
  return 'polygon';
146
199
  }
147
200
  }
148
-
149
201
  class MongoSchemaCollection {
150
-
151
202
  constructor(collection) {
152
203
  this._collection = collection;
153
204
  }
154
-
155
205
  _fetchAllSchemasFrom_SCHEMA() {
156
206
  return this._collection._rawFind({}).then(schemas => schemas.map(mongoSchemaToParseSchema));
157
207
  }
158
-
159
208
  _fetchOneSchemaFrom_SCHEMA(name) {
160
- return this._collection._rawFind(_mongoSchemaQueryFromNameQuery(name), { limit: 1 }).then(results => {
209
+ return this._collection._rawFind(_mongoSchemaQueryFromNameQuery(name), {
210
+ limit: 1
211
+ }).then(results => {
161
212
  if (results.length === 1) {
162
213
  return mongoSchemaToParseSchema(results[0]);
163
214
  } else {
@@ -168,24 +219,21 @@ class MongoSchemaCollection {
168
219
 
169
220
  // Atomically find and delete an object based on query.
170
221
  findAndDeleteSchema(name) {
171
- return this._collection._mongoCollection.findAndRemove(_mongoSchemaQueryFromNameQuery(name), []);
222
+ return this._collection._mongoCollection.findOneAndDelete(_mongoSchemaQueryFromNameQuery(name));
172
223
  }
173
-
174
224
  insertSchema(schema) {
175
- return this._collection.insertOne(schema).then(result => mongoSchemaToParseSchema(result.ops[0])).catch(error => {
225
+ return this._collection.insertOne(schema).then(() => mongoSchemaToParseSchema(schema)).catch(error => {
176
226
  if (error.code === 11000) {
177
227
  //Mongo's duplicate key error
178
- throw new _node2.default.Error(_node2.default.Error.DUPLICATE_VALUE, 'Class already exists.');
228
+ throw new _node.default.Error(_node.default.Error.DUPLICATE_VALUE, 'Class already exists.');
179
229
  } else {
180
230
  throw error;
181
231
  }
182
232
  });
183
233
  }
184
-
185
234
  updateSchema(name, update) {
186
235
  return this._collection.updateOne(_mongoSchemaQueryFromNameQuery(name), update);
187
236
  }
188
-
189
237
  upsertSchema(name, query, update) {
190
238
  return this._collection.upsertOne(_mongoSchemaQueryFromNameQuery(name, query), update);
191
239
  }
@@ -201,17 +249,17 @@ class MongoSchemaCollection {
201
249
  // Support additional types that Mongo doesn't, like Money, or something.
202
250
 
203
251
  // TODO: don't spend an extra query on finding the schema if the type we are trying to add isn't a GeoPoint.
204
- addFieldIfNotExists(className, fieldName, type) {
252
+ addFieldIfNotExists(className, fieldName, fieldType) {
205
253
  return this._fetchOneSchemaFrom_SCHEMA(className).then(schema => {
206
254
  // If a field with this name already exists, it will be handled elsewhere.
207
- if (schema.fields[fieldName] != undefined) {
255
+ if (schema.fields[fieldName] !== undefined) {
208
256
  return;
209
257
  }
210
258
  // The schema exists. Check for existing GeoPoints.
211
- if (type.type === 'GeoPoint') {
259
+ if (fieldType.type === 'GeoPoint') {
212
260
  // Make sure there are not other geopoint fields
213
261
  if (Object.keys(schema.fields).some(existingField => schema.fields[existingField].type === 'GeoPoint')) {
214
- throw new _node2.default.Error(_node2.default.Error.INCORRECT_TYPE, 'MongoDB only supports one GeoPoint field in a class.');
262
+ throw new _node.default.Error(_node.default.Error.INCORRECT_TYPE, 'MongoDB only supports one GeoPoint field in a class.');
215
263
  }
216
264
  }
217
265
  return;
@@ -223,9 +271,57 @@ class MongoSchemaCollection {
223
271
  }
224
272
  throw error;
225
273
  }).then(() => {
274
+ const {
275
+ type,
276
+ targetClass,
277
+ ...fieldOptions
278
+ } = fieldType;
226
279
  // We use $exists and $set to avoid overwriting the field type if it
227
280
  // already exists. (it could have added inbetween the last query and the update)
228
- return this.upsertSchema(className, { [fieldName]: { '$exists': false } }, { '$set': { [fieldName]: parseFieldTypeToMongoFieldType(type) } });
281
+ if (fieldOptions && Object.keys(fieldOptions).length > 0) {
282
+ return this.upsertSchema(className, {
283
+ [fieldName]: {
284
+ $exists: false
285
+ }
286
+ }, {
287
+ $set: {
288
+ [fieldName]: parseFieldTypeToMongoFieldType({
289
+ type,
290
+ targetClass
291
+ }),
292
+ [`_metadata.fields_options.${fieldName}`]: fieldOptions
293
+ }
294
+ });
295
+ } else {
296
+ return this.upsertSchema(className, {
297
+ [fieldName]: {
298
+ $exists: false
299
+ }
300
+ }, {
301
+ $set: {
302
+ [fieldName]: parseFieldTypeToMongoFieldType({
303
+ type,
304
+ targetClass
305
+ })
306
+ }
307
+ });
308
+ }
309
+ });
310
+ }
311
+ async updateFieldOptions(className, fieldName, fieldType) {
312
+ const {
313
+ ...fieldOptions
314
+ } = fieldType;
315
+ delete fieldOptions.type;
316
+ delete fieldOptions.targetClass;
317
+ await this.upsertSchema(className, {
318
+ [fieldName]: {
319
+ $exists: true
320
+ }
321
+ }, {
322
+ $set: {
323
+ [`_metadata.fields_options.${fieldName}`]: fieldOptions
324
+ }
229
325
  });
230
326
  }
231
327
  }
@@ -234,6 +330,5 @@ class MongoSchemaCollection {
234
330
  // related logic into the database adapter yet.
235
331
  MongoSchemaCollection._TESTmongoSchemaToParseSchema = mongoSchemaToParseSchema;
236
332
  MongoSchemaCollection.parseFieldTypeToMongoFieldType = parseFieldTypeToMongoFieldType;
237
-
238
- exports.default = MongoSchemaCollection;
239
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9BZGFwdGVycy9TdG9yYWdlL01vbmdvL01vbmdvU2NoZW1hQ29sbGVjdGlvbi5qcyJdLCJuYW1lcyI6WyJtb25nb0ZpZWxkVG9QYXJzZVNjaGVtYUZpZWxkIiwidHlwZSIsInRhcmdldENsYXNzIiwic2xpY2UiLCJzdGFydHNXaXRoIiwibGVuZ3RoIiwibm9uRmllbGRTY2hlbWFLZXlzIiwibW9uZ29TY2hlbWFGaWVsZHNUb1BhcnNlU2NoZW1hRmllbGRzIiwic2NoZW1hIiwiZmllbGROYW1lcyIsIk9iamVjdCIsImtleXMiLCJmaWx0ZXIiLCJrZXkiLCJpbmRleE9mIiwicmVzcG9uc2UiLCJyZWR1Y2UiLCJvYmoiLCJmaWVsZE5hbWUiLCJBQ0wiLCJjcmVhdGVkQXQiLCJ1cGRhdGVkQXQiLCJvYmplY3RJZCIsImVtcHR5Q0xQUyIsImZyZWV6ZSIsImZpbmQiLCJnZXQiLCJjcmVhdGUiLCJ1cGRhdGUiLCJkZWxldGUiLCJhZGRGaWVsZCIsImRlZmF1bHRDTFBTIiwibW9uZ29TY2hlbWFUb1BhcnNlU2NoZW1hIiwibW9uZ29TY2hlbWEiLCJjbHBzIiwiaW5kZXhlcyIsIl9tZXRhZGF0YSIsImNsYXNzX3Blcm1pc3Npb25zIiwiY2xhc3NOYW1lIiwiX2lkIiwiZmllbGRzIiwiY2xhc3NMZXZlbFBlcm1pc3Npb25zIiwiX21vbmdvU2NoZW1hUXVlcnlGcm9tTmFtZVF1ZXJ5IiwibmFtZSIsInF1ZXJ5Iiwib2JqZWN0IiwiZm9yRWFjaCIsInBhcnNlRmllbGRUeXBlVG9Nb25nb0ZpZWxkVHlwZSIsIk1vbmdvU2NoZW1hQ29sbGVjdGlvbiIsImNvbnN0cnVjdG9yIiwiY29sbGVjdGlvbiIsIl9jb2xsZWN0aW9uIiwiX2ZldGNoQWxsU2NoZW1hc0Zyb21fU0NIRU1BIiwiX3Jhd0ZpbmQiLCJ0aGVuIiwic2NoZW1hcyIsIm1hcCIsIl9mZXRjaE9uZVNjaGVtYUZyb21fU0NIRU1BIiwibGltaXQiLCJyZXN1bHRzIiwidW5kZWZpbmVkIiwiZmluZEFuZERlbGV0ZVNjaGVtYSIsIl9tb25nb0NvbGxlY3Rpb24iLCJmaW5kQW5kUmVtb3ZlIiwiaW5zZXJ0U2NoZW1hIiwiaW5zZXJ0T25lIiwicmVzdWx0Iiwib3BzIiwiY2F0Y2giLCJlcnJvciIsImNvZGUiLCJQYXJzZSIsIkVycm9yIiwiRFVQTElDQVRFX1ZBTFVFIiwidXBkYXRlU2NoZW1hIiwidXBkYXRlT25lIiwidXBzZXJ0U2NoZW1hIiwidXBzZXJ0T25lIiwiYWRkRmllbGRJZk5vdEV4aXN0cyIsInNvbWUiLCJleGlzdGluZ0ZpZWxkIiwiSU5DT1JSRUNUX1RZUEUiLCJfVEVTVG1vbmdvU2NoZW1hVG9QYXJzZVNjaGVtYSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQTs7OztBQUNBOzs7Ozs7QUFFQSxTQUFTQSw0QkFBVCxDQUFzQ0MsSUFBdEMsRUFBNEM7QUFDMUMsTUFBSUEsS0FBSyxDQUFMLE1BQVksR0FBaEIsRUFBcUI7QUFDbkIsV0FBTztBQUNMQSxZQUFNLFNBREQ7QUFFTEMsbUJBQWFELEtBQUtFLEtBQUwsQ0FBVyxDQUFYO0FBRlIsS0FBUDtBQUlEO0FBQ0QsTUFBSUYsS0FBS0csVUFBTCxDQUFnQixXQUFoQixDQUFKLEVBQWtDO0FBQ2hDLFdBQU87QUFDTEgsWUFBTSxVQUREO0FBRUxDLG1CQUFhRCxLQUFLRSxLQUFMLENBQVcsWUFBWUUsTUFBdkIsRUFBK0JKLEtBQUtJLE1BQUwsR0FBYyxDQUE3QztBQUZSLEtBQVA7QUFJRDtBQUNELFVBQVFKLElBQVI7QUFDQSxTQUFLLFFBQUw7QUFBaUIsYUFBTyxFQUFDQSxNQUFNLFFBQVAsRUFBUDtBQUNqQixTQUFLLFFBQUw7QUFBaUIsYUFBTyxFQUFDQSxNQUFNLFFBQVAsRUFBUDtBQUNqQixTQUFLLFNBQUw7QUFBaUIsYUFBTyxFQUFDQSxNQUFNLFNBQVAsRUFBUDtBQUNqQixTQUFLLE1BQUw7QUFBaUIsYUFBTyxFQUFDQSxNQUFNLE1BQVAsRUFBUDtBQUNqQixTQUFLLEtBQUw7QUFDQSxTQUFLLFFBQUw7QUFBaUIsYUFBTyxF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LHNCQUFzQmtDLDZCQUF0QixHQUFzRGxELHdCQUF0RDtBQUNBZ0Isc0JBQXNCRCw4QkFBdEIsR0FBdURBLDhCQUF2RDs7a0JBRWVDLHFCIiwiZmlsZSI6Ik1vbmdvU2NoZW1hQ29sbGVjdGlvbi5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBNb25nb0NvbGxlY3Rpb24gZnJvbSAnLi9Nb25nb0NvbGxlY3Rpb24nO1xuaW1wb3J0IFBhcnNlICAgICAgICAgICBmcm9tICdwYXJzZS9ub2RlJztcblxuZnVuY3Rpb24gbW9uZ29GaWVsZFRvUGFyc2VTY2hlbWFGaWVsZCh0eXBlKSB7XG4gIGlmICh0eXBlWzBdID09PSAnKicpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogJ1BvaW50ZXInLFxuICAgICAgdGFyZ2V0Q2xhc3M6IHR5cGUuc2xpY2UoMSksXG4gICAgfTtcbiAgfVxuICBpZiAodHlwZS5zdGFydHNXaXRoKCdyZWxhdGlvbjwnKSkge1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiAnUmVsYXRpb24nLFxuICAgICAgdGFyZ2V0Q2xhc3M6IHR5cGUuc2xpY2UoJ3JlbGF0aW9uPCcubGVuZ3RoLCB0eXBlLmxlbmd0aCAtIDEpLFxuICAgIH07XG4gIH1cbiAgc3dpdGNoICh0eXBlKSB7XG4gIGNhc2UgJ251bWJlcic6ICAgcmV0dXJuIHt0eXBlOiAnTnVtYmVyJ307XG4gIGNhc2UgJ3N0cmluZyc6ICAgcmV0dXJuIHt0eXBlOiAnU3RyaW5nJ307XG4gIGNhc2UgJ2Jvb2xlYW4nOiAgcmV0dXJuIHt0eXBlOiAnQm9vbGVhbid9O1xuICBjYXNlICdkYXRlJzogICAgIHJldHVybiB7dHlwZTogJ0RhdGUnfTtcbiAgY2FzZSAnbWFwJzpcbiAgY2FzZSAnb2JqZWN0JzogICByZXR1cm4ge3R5cGU6ICdPYmplY3QnfTtcbiAgY2FzZSAnYXJyYXknOiAgICByZXR1cm4ge3R5cGU6ICdBcnJheSd9O1xuICBjYXNlICdnZW9wb2ludCc6IHJldHVybiB7dHlwZTogJ0dlb1BvaW50J307XG4gIGNhc2UgJ2ZpbGUnOiAgICAgcmV0dXJuIHt0eXBlOiAnRmlsZSd9O1xuICBjYXNlICdieXRlcyc6ICAgIHJldHVybiB7dHlwZTogJ0J5dGVzJ307XG4gIGNhc2UgJ3BvbHlnb24nOiAgcmV0dXJuIHt0eXBlOiAnUG9seWdvbid9O1xuICB9XG59XG5cbmNvbnN0IG5vbkZpZWxkU2NoZW1hS2V5cyA9IFsnX2lkJywgJ19tZXRhZGF0YScsICdfY2xpZW50X3Blcm1pc3Npb25zJ107XG5mdW5jdGlvbiBtb25nb1NjaGVtYUZpZWxkc1RvUGFyc2VTY2hlbWFGaWVsZHMoc2NoZW1hKSB7XG4gIHZhciBmaWVsZE5hbWVzID0gT2JqZWN0LmtleXMoc2NoZW1hKS5maWx0ZXIoa2V5ID0+IG5vbkZpZWxkU2NoZW1hS2V5cy5pbmRleE9mKGtleSkgPT09IC0xKTtcbiAgdmFyIHJlc3BvbnNlID0gZmllbGROYW1lcy5yZWR1Y2UoKG9iaiwgZmllbGROYW1lKSA9PiB7XG4gICAgb2JqW2ZpZWxkTmFtZV0gPSBtb25nb0ZpZWxkVG9QYXJzZVNjaGVtYUZpZWxkKHNjaGVtYVtmaWVsZE5hbWVdKVxuICAgIHJldHVybiBvYmo7XG4gIH0sIHt9KTtcbiAgcmVzcG9uc2UuQUNMID0ge3R5cGU6ICdBQ0wnfTtcbiAgcmVzcG9uc2UuY3JlYXRlZEF0ID0ge3R5cGU6ICdEYXRlJ307XG4gIHJlc3BvbnNlLnVwZGF0ZWRBdCA9IHt0eXBlOiAnRGF0ZSd9O1xuICByZXNwb25zZS5vYmplY3RJZCA9IHt0eXBlOiAnU3RyaW5nJ307XG4gIHJldHVybiByZXNwb25zZTtcbn1cblxuY29uc3QgZW1wdHlDTFBTID0gT2JqZWN0LmZyZWV6ZSh7XG4gIGZpbmQ6IHt9LFxuICBnZXQ6IHt9LFxuICBjcmVhdGU6IHt9LFxuICB1cGRhdGU6IHt9LFxuICBkZWxldGU6IHt9LFxuICBhZGRGaWVsZDoge30sXG59KTtcblxuY29uc3QgZGVmYXVsdENMUFMgPSBPYmplY3QuZnJlZXplKHtcbiAgZmluZDogeycqJzogdHJ1ZX0sXG4gIGdldDogeycqJzogdHJ1ZX0sXG4gIGNyZWF0ZTogeycqJzogdHJ1ZX0sXG4gIHVwZGF0ZTogeycqJzogdHJ1ZX0sXG4gIGRlbGV0ZTogeycqJzogdHJ1ZX0sXG4gIGFkZEZpZWxkOiB7JyonOiB0cnVlfSxcbn0pO1xuXG5mdW5jdGlvbiBtb25nb1NjaGVtYVRvUGFyc2VTY2hlbWEobW9uZ29TY2hlbWEpIHtcbiAgbGV0IGNscHMgPSBkZWZhdWx0Q0xQUztcbiAgbGV0IGluZGV4ZXMgPSB7fVxuICBpZiAobW9uZ29TY2hlbWEuX21ldGFkYXRhKSB7XG4gICAgaWYgKG1vbmdvU2NoZW1hLl9tZXRhZGF0YS5jbGFzc19wZXJtaXNzaW9ucykge1xuICAgICAgY2xwcyA9IHsuLi5lbXB0eUNMUFMsIC4uLm1vbmdvU2NoZW1hLl9tZXRhZGF0YS5jbGFzc19wZXJtaXNzaW9uc307XG4gICAgfVxuICAgIGlmIChtb25nb1NjaGVtYS5fbWV0YWRhdGEuaW5kZXhlcykge1xuICAgICAgaW5kZXhlcyA9IHsuLi5tb25nb1NjaGVtYS5fbWV0YWRhdGEuaW5kZXhlc307XG4gICAgfVxuICB9XG4gIHJldHVybiB7XG4gICAgY2xhc3NOYW1lOiBtb25nb1NjaGVtYS5faWQsXG4gICAgZmllbGRzOiBtb25nb1NjaGVtYUZpZWxkc1RvUGFyc2VTY2hlbWFGaWVsZHMobW9uZ29TY2hlbWEpLFxuICAgIGNsYXNzTGV2ZWxQZXJtaXNzaW9uczogY2xwcyxcbiAgICBpbmRleGVzOiBpbmRleGVzLFxuICB9O1xufVxuXG5mdW5jdGlvbiBfbW9uZ29TY2hlbWFRdWVyeUZyb21OYW1lUXVlcnkobmFtZTogc3RyaW5nLCBxdWVyeSkge1xuICBjb25zdCBvYmplY3QgPSB7IF9pZDogbmFtZSB9O1xuICBpZiAocXVlcnkpIHtcbiAgICBPYmplY3Qua2V5cyhxdWVyeSkuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgb2JqZWN0W2tleV0gPSBxdWVyeVtrZXldO1xuICAgIH0pO1xuICB9XG4gIHJldHVybiBvYmplY3Q7XG59XG5cblxuLy8gUmV0dXJucyBhIHR5cGUgc3VpdGFibGUgZm9yIGluc2VydGluZyBpbnRvIG1vbmdvIF9TQ0hFTUEgY29sbGVjdGlvbi5cbi8vIERvZXMgbm8gdmFsaWRhdGlvbi4gVGhhdCBpcyBleHBlY3RlZCB0byBiZSBkb25lIGluIFBhcnNlIFNlcnZlci5cbmZ1bmN0aW9uIHBhcnNlRmllbGRUeXBlVG9Nb25nb0ZpZWxkVHlwZSh7IHR5cGUsIHRhcmdldENsYXNzIH0pIHtcbiAgc3dpdGNoICh0eXBlKSB7XG4gIGNhc2UgJ1BvaW50ZXInOiAgcmV0dXJuIGAqJHt0YXJnZXRDbGFzc31gO1xuICBjYXNlICdSZWxhdGlvbic6IHJldHVybiBgcmVsYXRpb248JHt0YXJnZXRDbGFzc30+YDtcbiAgY2FzZSAnTnVtYmVyJzogICByZXR1cm4gJ251bWJlcic7XG4gIGNhc2UgJ1N0cmluZyc6ICAgcmV0dXJuICdzdHJpbmcnO1xuICBjYXNlICdCb29sZWFuJzogIHJldHVybiAnYm9vbGVhbic7XG4gIGNhc2UgJ0RhdGUnOiAgICAgcmV0dXJuICdkYXRlJztcbiAgY2FzZSAnT2JqZWN0JzogICByZXR1cm4gJ29iamVjdCc7XG4gIGNhc2UgJ0FycmF5JzogICAgcmV0dXJuICdhcnJheSc7XG4gIGNhc2UgJ0dlb1BvaW50JzogcmV0dXJuICdnZW9wb2ludCc7XG4gIGNhc2UgJ0ZpbGUnOiAgICAgcmV0dXJuICdmaWxlJztcbiAgY2FzZSAnQnl0ZXMnOiAgICByZXR1cm4gJ2J5dGVzJztcbiAgY2FzZSAnUG9seWdvbic6ICByZXR1cm4gJ3BvbHlnb24nO1xuICB9XG59XG5cbmNsYXNzIE1vbmdvU2NoZW1hQ29sbGVjdGlvbiB7XG4gIF9jb2xsZWN0aW9uOiBNb25nb0NvbGxlY3Rpb247XG5cbiAgY29uc3RydWN0b3IoY29sbGVjdGlvbjogTW9uZ29Db2xsZWN0aW9uKSB7XG4gICAgdGhpcy5fY29sbGVjdGlvbiA9IGNvbGxlY3Rpb247XG4gIH1cblxuICBfZmV0Y2hBbGxTY2hlbWFzRnJvbV9TQ0hFTUEoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbGxlY3Rpb24uX3Jhd0ZpbmQoe30pXG4gICAgICAudGhlbihzY2hlbWFzID0+IHNjaGVtYXMubWFwKG1vbmdvU2NoZW1hVG9QYXJzZVNjaGVtYSkpO1xuICB9XG5cbiAgX2ZldGNoT25lU2NoZW1hRnJvbV9TQ0hFTUEobmFtZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbGxlY3Rpb24uX3Jhd0ZpbmQoX21vbmdvU2NoZW1hUXVlcnlGcm9tTmFtZVF1ZXJ5KG5hbWUpLCB7IGxpbWl0OiAxIH0pLnRoZW4ocmVzdWx0cyA9PiB7XG4gICAgICBpZiAocmVzdWx0cy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIG1vbmdvU2NoZW1hVG9QYXJzZVNjaGVtYShyZXN1bHRzWzBdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8vIEF0b21pY2FsbHkgZmluZCBhbmQgZGVsZXRlIGFuIG9iamVjdCBiYXNlZCBvbiBxdWVyeS5cbiAgZmluZEFuZERlbGV0ZVNjaGVtYShuYW1lOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5fY29sbGVjdGlvbi5fbW9uZ29Db2xsZWN0aW9uLmZpbmRBbmRSZW1vdmUoX21vbmdvU2NoZW1hUXVlcnlGcm9tTmFtZVF1ZXJ5KG5hbWUpLCBbXSk7XG4gIH1cblxuICBpbnNlcnRTY2hlbWEoc2NoZW1hOiBhbnkpIHtcbiAgICByZXR1cm4gdGhpcy5fY29sbGVjdGlvbi5pbnNlcnRPbmUoc2NoZW1hKVxuICAgICAgLnRoZW4ocmVzdWx0ID0+IG1vbmdvU2NoZW1hVG9QYXJzZVNjaGVtYShyZXN1bHQub3BzWzBdKSlcbiAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgIGlmIChlcnJvci5jb2RlID09PSAxMTAwMCkgeyAvL01vbmdvJ3MgZHVwbGljYXRlIGtleSBlcnJvclxuICAgICAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5EVVBMSUNBVEVfVkFMVUUsICdDbGFzcyBhbHJlYWR5IGV4aXN0cy4nKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgfVxuXG4gIHVwZGF0ZVNjaGVtYShuYW1lOiBzdHJpbmcsIHVwZGF0ZSkge1xuICAgIHJldHVybiB0aGlzLl9jb2xsZWN0aW9uLnVwZGF0ZU9uZShfbW9uZ29TY2hlbWFRdWVyeUZyb21OYW1lUXVlcnkobmFtZSksIHVwZGF0ZSk7XG4gIH1cblxuICB1cHNlcnRTY2hlbWEobmFtZTogc3RyaW5nLCBxdWVyeTogc3RyaW5nLCB1cGRhdGUpIHtcbiAgICByZXR1cm4gdGhpcy5fY29sbGVjdGlvbi51cHNlcnRPbmUoX21vbmdvU2NoZW1hUXVlcnlGcm9tTmFtZVF1ZXJ5KG5hbWUsIHF1ZXJ5KSwgdXBkYXRlKTtcbiAgfVxuXG4gIC8vIEFkZCBhIGZpZWxkIHRvIHRoZSBzY2hlbWEuIElmIGRhdGFiYXNlIGRvZXMgbm90IHN1cHBvcnQgdGhlIGZpZWxkXG4gIC8vIHR5cGUgKGUuZy4gbW9uZ28gZG9lc24ndCBzdXBwb3J0IG1vcmUgdGhhbiBvbmUgR2VvUG9pbnQgaW4gYSBjbGFzcykgcmVqZWN0IHdpdGggYW4gXCJJbmNvcnJlY3QgVHlwZVwiXG4gIC8vIFBhcnNlIGVycm9yIHdpdGggYSBkZXNjaXB0aXZlIG1lc3NhZ2UuIElmIHRoZSBmaWVsZCBhbHJlYWR5IGV4aXN0cywgdGhpcyBmdW5jdGlvbiBtdXN0XG4gIC8vIG5vdCBtb2RpZnkgdGhlIHNjaGVtYSwgYW5kIG11c3QgcmVqZWN0IHdpdGggRFVQTElDQVRFX1ZBTFVFIGVycm9yLlxuICAvLyBJZiB0aGlzIGlzIGNhbGxlZCBmb3IgYSBjbGFzcyB0aGF0IGRvZXNuJ3QgZXhpc3QsIHRoaXMgZnVuY3Rpb24gbXVzdCBjcmVhdGUgdGhhdCBjbGFzcy5cblxuICAvLyBUT0RPOiB0aHJvdyBhbiBlcnJvciBpZiBhbiB1bnN1cHBvcnRlZCBmaWVsZCB0eXBlIGlzIHBhc3NlZC4gRGVjaWRpbmcgd2hldGhlciBhIHR5cGUgaXMgc3VwcG9ydGVkXG4gIC8vIHNob3VsZCBiZSB0aGUgam9iIG9mIHRoZSBhZGFwdGVyLiBTb21lIGFkYXB0ZXJzIG1heSBub3Qgc3VwcG9ydCBHZW9Qb2ludCBhdCBhbGwuIE90aGVycyBtYXlcbiAgLy8gU3VwcG9ydCBhZGRpdGlvbmFsIHR5cGVzIHRoYXQgTW9uZ28gZG9lc24ndCwgbGlrZSBNb25leSwgb3Igc29tZXRoaW5nLlxuXG4gIC8vIFRPRE86IGRvbid0IHNwZW5kIGFuIGV4dHJhIHF1ZXJ5IG9uIGZpbmRpbmcgdGhlIHNjaGVtYSBpZiB0aGUgdHlwZSB3ZSBhcmUgdHJ5aW5nIHRvIGFkZCBpc24ndCBhIEdlb1BvaW50LlxuICBhZGRGaWVsZElmTm90RXhpc3RzKGNsYXNzTmFtZTogc3RyaW5nLCBmaWVsZE5hbWU6IHN0cmluZywgdHlwZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuX2ZldGNoT25lU2NoZW1hRnJvbV9TQ0hFTUEoY2xhc3NOYW1lKVxuICAgICAgLnRoZW4oc2NoZW1hID0+IHtcbiAgICAgICAgLy8gSWYgYSBmaWVsZCB3aXRoIHRoaXMgbmFtZSBhbHJlYWR5IGV4aXN0cywgaXQgd2lsbCBiZSBoYW5kbGVkIGVsc2V3aGVyZS5cbiAgICAgICAgaWYgKHNjaGVtYS5maWVsZHNbZmllbGROYW1lXSAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gVGhlIHNjaGVtYSBleGlzdHMuIENoZWNrIGZvciBleGlzdGluZyBHZW9Qb2ludHMuXG4gICAgICAgIGlmICh0eXBlLnR5cGUgPT09ICdHZW9Qb2ludCcpIHtcbiAgICAgICAgLy8gTWFrZSBzdXJlIHRoZXJlIGFyZSBub3Qgb3RoZXIgZ2VvcG9pbnQgZmllbGRzXG4gICAgICAgICAgaWYgKE9iamVjdC5rZXlzKHNjaGVtYS5maWVsZHMpLnNvbWUoZXhpc3RpbmdGaWVsZCA9PiBzY2hlbWEuZmllbGRzW2V4aXN0aW5nRmllbGRdLnR5cGUgPT09ICdHZW9Qb2ludCcpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuSU5DT1JSRUNUX1RZUEUsICdNb25nb0RCIG9ubHkgc3VwcG9ydHMgb25lIEdlb1BvaW50IGZpZWxkIGluIGEgY2xhc3MuJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0sIGVycm9yID0+IHtcbiAgICAgIC8vIElmIGVycm9yIGlzIHVuZGVmaW5lZCwgdGhlIHNjaGVtYSBkb2Vzbid0IGV4aXN0LCBhbmQgd2UgY2FuIGNyZWF0ZSB0aGUgc2NoZW1hIHdpdGggdGhlIGZpZWxkLlxuICAgICAgLy8gSWYgc29tZSBvdGhlciBlcnJvciwgcmVqZWN0IHdpdGggaXQuXG4gICAgICAgIGlmIChlcnJvciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfSlcbiAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgIC8vIFdlIHVzZSAkZXhpc3RzIGFuZCAkc2V0IHRvIGF2b2lkIG92ZXJ3cml0aW5nIHRoZSBmaWVsZCB0eXBlIGlmIGl0XG4gICAgICAvLyBhbHJlYWR5IGV4aXN0cy4gKGl0IGNvdWxkIGhhdmUgYWRkZWQgaW5iZXR3ZWVuIHRoZSBsYXN0IHF1ZXJ5IGFuZCB0aGUgdXBkYXRlKVxuICAgICAgICByZXR1cm4gdGhpcy51cHNlcnRTY2hlbWEoXG4gICAgICAgICAgY2xhc3NOYW1lLFxuICAgICAgICAgIHsgW2ZpZWxkTmFtZV06IHsgJyRleGlzdHMnOiBmYWxzZSB9IH0sXG4gICAgICAgICAgeyAnJHNldCcgOiB7IFtmaWVsZE5hbWVdOiBwYXJzZUZpZWxkVHlwZVRvTW9uZ29GaWVsZFR5cGUodHlwZSkgfSB9XG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgfVxufVxuXG4vLyBFeHBvcnRlZCBmb3IgdGVzdGluZyByZWFzb25zIGFuZCBiZWNhdXNlIHdlIGhhdmVuJ3QgbW92ZWQgYWxsIG1vbmdvIHNjaGVtYSBmb3JtYXRcbi8vIHJlbGF0ZWQgbG9naWMgaW50byB0aGUgZGF0YWJhc2UgYWRhcHRlciB5ZXQuXG5Nb25nb1NjaGVtYUNvbGxlY3Rpb24uX1RFU1Rtb25nb1NjaGVtYVRvUGFyc2VTY2hlbWEgPSBtb25nb1NjaGVtYVRvUGFyc2VTY2hlbWFcbk1vbmdvU2NoZW1hQ29sbGVjdGlvbi5wYXJzZUZpZWxkVHlwZVRvTW9uZ29GaWVsZFR5cGUgPSBwYXJzZUZpZWxkVHlwZVRvTW9uZ29GaWVsZFR5cGVcblxuZXhwb3J0IGRlZmF1bHQgTW9uZ29TY2hlbWFDb2xsZWN0aW9uXG4iXX0=
333
+ var _default = exports.default = MongoSchemaCollection;
334
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfTW9uZ29Db2xsZWN0aW9uIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfbm9kZSIsImUiLCJfX2VzTW9kdWxlIiwiZGVmYXVsdCIsIm1vbmdvRmllbGRUb1BhcnNlU2NoZW1hRmllbGQiLCJ0eXBlIiwidGFyZ2V0Q2xhc3MiLCJzbGljZSIsInN0YXJ0c1dpdGgiLCJsZW5ndGgiLCJub25GaWVsZFNjaGVtYUtleXMiLCJtb25nb1NjaGVtYUZpZWxkc1RvUGFyc2VTY2hlbWFGaWVsZHMiLCJzY2hlbWEiLCJmaWVsZE5hbWVzIiwiT2JqZWN0Iiwia2V5cyIsImZpbHRlciIsImtleSIsImluZGV4T2YiLCJyZXNwb25zZSIsInJlZHVjZSIsIm9iaiIsImZpZWxkTmFtZSIsIl9tZXRhZGF0YSIsImZpZWxkc19vcHRpb25zIiwiYXNzaWduIiwiQUNMIiwiY3JlYXRlZEF0IiwidXBkYXRlZEF0Iiwib2JqZWN0SWQiLCJlbXB0eUNMUFMiLCJmcmVlemUiLCJmaW5kIiwiY291bnQiLCJnZXQiLCJjcmVhdGUiLCJ1cGRhdGUiLCJkZWxldGUiLCJhZGRGaWVsZCIsInByb3RlY3RlZEZpZWxkcyIsImRlZmF1bHRDTFBTIiwicmVhZCIsIndyaXRlIiwibW9uZ29TY2hlbWFUb1BhcnNlU2NoZW1hIiwibW9uZ29TY2hlbWEiLCJjbHBzIiwiaW5kZXhlcyIsImNsYXNzX3Blcm1pc3Npb25zIiwiY2xhc3NOYW1lIiwiX2lkIiwiZmllbGRzIiwiY2xhc3NMZXZlbFBlcm1pc3Npb25zIiwiX21vbmdvU2NoZW1hUXVlcnlGcm9tTmFtZVF1ZXJ5IiwibmFtZSIsInF1ZXJ5Iiwib2JqZWN0IiwiZm9yRWFjaCIsInBhcnNlRmllbGRUeXBlVG9Nb25nb0ZpZWxkVHlwZSIsIk1vbmdvU2NoZW1hQ29sbGVjdGlvbiIsImNvbnN0cnVjdG9yIiwiY29sbGVjdGlvbiIsIl9jb2xsZWN0aW9uIiwiX2ZldGNoQWxsU2NoZW1hc0Zyb21fU0NIRU1BIiwiX3Jhd0ZpbmQiLCJ0aGVuIiwic2NoZW1hcyIsIm1hcCIsIl9mZXRjaE9uZVNjaGVtYUZyb21fU0NIRU1BIiwibGltaXQiLCJyZXN1bHRzIiwidW5kZWZpbmVkIiwiZmluZEFuZERlbGV0ZVNjaGVtYSIsIl9tb25nb0NvbGxlY3Rpb24iLCJmaW5kT25lQW5kRGVsZXRlIiwiaW5zZXJ0U2NoZW1hIiwiaW5zZXJ0T25lIiwiY2F0Y2giLCJlcnJvciIsImNvZGUiLCJQYXJzZSIsIkVycm9yIiwiRFVQTElDQVRFX1ZBTFVFIiwidXBkYXRlU2NoZW1hIiwidXBkYXRlT25lIiwidXBzZXJ0U2NoZW1hIiwidXBzZXJ0T25lIiwiYWRkRmllbGRJZk5vdEV4aXN0cyIsImZpZWxkVHlwZSIsInNvbWUiLCJleGlzdGluZ0ZpZWxkIiwiSU5DT1JSRUNUX1RZUEUiLCJmaWVsZE9wdGlvbnMiLCIkZXhpc3RzIiwiJHNldCIsInVwZGF0ZUZpZWxkT3B0aW9ucyIsIl9URVNUbW9uZ29TY2hlbWFUb1BhcnNlU2NoZW1hIiwiX2RlZmF1bHQiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL0FkYXB0ZXJzL1N0b3JhZ2UvTW9uZ28vTW9uZ29TY2hlbWFDb2xsZWN0aW9uLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBNb25nb0NvbGxlY3Rpb24gZnJvbSAnLi9Nb25nb0NvbGxlY3Rpb24nO1xuaW1wb3J0IFBhcnNlIGZyb20gJ3BhcnNlL25vZGUnO1xuXG5mdW5jdGlvbiBtb25nb0ZpZWxkVG9QYXJzZVNjaGVtYUZpZWxkKHR5cGUpIHtcbiAgaWYgKHR5cGVbMF0gPT09ICcqJykge1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiAnUG9pbnRlcicsXG4gICAgICB0YXJnZXRDbGFzczogdHlwZS5zbGljZSgxKSxcbiAgICB9O1xuICB9XG4gIGlmICh0eXBlLnN0YXJ0c1dpdGgoJ3JlbGF0aW9uPCcpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6ICdSZWxhdGlvbicsXG4gICAgICB0YXJnZXRDbGFzczogdHlwZS5zbGljZSgncmVsYXRpb248Jy5sZW5ndGgsIHR5cGUubGVuZ3RoIC0gMSksXG4gICAgfTtcbiAgfVxuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlICdudW1iZXInOlxuICAgICAgcmV0dXJuIHsgdHlwZTogJ051bWJlcicgfTtcbiAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgcmV0dXJuIHsgdHlwZTogJ1N0cmluZycgfTtcbiAgICBjYXNlICdib29sZWFuJzpcbiAgICAgIHJldHVybiB7IHR5cGU6ICdCb29sZWFuJyB9O1xuICAgIGNhc2UgJ2RhdGUnOlxuICAgICAgcmV0dXJuIHsgdHlwZTogJ0RhdGUnIH07XG4gICAgY2FzZSAnbWFwJzpcbiAgICBjYXNlICdvYmplY3QnOlxuICAgICAgcmV0dXJuIHsgdHlwZTogJ09iamVjdCcgfTtcbiAgICBjYXNlICdhcnJheSc6XG4gICAgICByZXR1cm4geyB0eXBlOiAnQXJyYXknIH07XG4gICAgY2FzZSAnZ2VvcG9pbnQnOlxuICAgICAgcmV0dXJuIHsgdHlwZTogJ0dlb1BvaW50JyB9O1xuICAgIGNhc2UgJ2ZpbGUnOlxuICAgICAgcmV0dXJuIHsgdHlwZTogJ0ZpbGUnIH07XG4gICAgY2FzZSAnYnl0ZXMnOlxuICAgICAgcmV0dXJuIHsgdHlwZTogJ0J5dGVzJyB9O1xuICAgIGNhc2UgJ3BvbHlnb24nOlxuICAgICAgcmV0dXJuIHsgdHlwZTogJ1BvbHlnb24nIH07XG4gIH1cbn1cblxuY29uc3Qgbm9uRmllbGRTY2hlbWFLZXlzID0gWydfaWQnLCAnX21ldGFkYXRhJywgJ19jbGllbnRfcGVybWlzc2lvbnMnXTtcbmZ1bmN0aW9uIG1vbmdvU2NoZW1hRmllbGRzVG9QYXJzZVNjaGVtYUZpZWxkcyhzY2hlbWEpIHtcbiAgdmFyIGZpZWxkTmFtZXMgPSBPYmplY3Qua2V5cyhzY2hlbWEpLmZpbHRlcihrZXkgPT4gbm9uRmllbGRTY2hlbWFLZXlzLmluZGV4T2Yoa2V5KSA9PT0gLTEpO1xuICB2YXIgcmVzcG9uc2UgPSBmaWVsZE5hbWVzLnJlZHVjZSgob2JqLCBmaWVsZE5hbWUpID0+IHtcbiAgICBvYmpbZmllbGROYW1lXSA9IG1vbmdvRmllbGRUb1BhcnNlU2NoZW1hRmllbGQoc2NoZW1hW2ZpZWxkTmFtZV0pO1xuICAgIGlmIChcbiAgICAgIHNjaGVtYS5fbWV0YWRhdGEgJiZcbiAgICAgIHNjaGVtYS5fbWV0YWRhdGEuZmllbGRzX29wdGlvbnMgJiZcbiAgICAgIHNjaGVtYS5fbWV0YWRhdGEuZmllbGRzX29wdGlvbnNbZmllbGROYW1lXVxuICAgICkge1xuICAgICAgb2JqW2ZpZWxkTmFtZV0gPSBPYmplY3QuYXNzaWduKFxuICAgICAgICB7fSxcbiAgICAgICAgb2JqW2ZpZWxkTmFtZV0sXG4gICAgICAgIHNjaGVtYS5fbWV0YWRhdGEuZmllbGRzX29wdGlvbnNbZmllbGROYW1lXVxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIG9iajtcbiAgfSwge30pO1xuICByZXNwb25zZS5BQ0wgPSB7IHR5cGU6ICdBQ0wnIH07XG4gIHJlc3BvbnNlLmNyZWF0ZWRBdCA9IHsgdHlwZTogJ0RhdGUnIH07XG4gIHJlc3BvbnNlLnVwZGF0ZWRBdCA9IHsgdHlwZTogJ0RhdGUnIH07XG4gIHJlc3BvbnNlLm9iamVjdElkID0geyB0eXBlOiAnU3RyaW5nJyB9O1xuICByZXR1cm4gcmVzcG9uc2U7XG59XG5cbmNvbnN0IGVtcHR5Q0xQUyA9IE9iamVjdC5mcmVlemUoe1xuICBmaW5kOiB7fSxcbiAgY291bnQ6IHt9LFxuICBnZXQ6IHt9LFxuICBjcmVhdGU6IHt9LFxuICB1cGRhdGU6IHt9LFxuICBkZWxldGU6IHt9LFxuICBhZGRGaWVsZDoge30sXG4gIHByb3RlY3RlZEZpZWxkczoge30sXG59KTtcblxuY29uc3QgZGVmYXVsdENMUFMgPSBPYmplY3QuZnJlZXplKHtcbiAgQUNMOiB7XG4gICAgJyonOiB7XG4gICAgICByZWFkOiB0cnVlLFxuICAgICAgd3JpdGU6IHRydWUsXG4gICAgfSxcbiAgfSxcbiAgZmluZDogeyAnKic6IHRydWUgfSxcbiAgY291bnQ6IHsgJyonOiB0cnVlIH0sXG4gIGdldDogeyAnKic6IHRydWUgfSxcbiAgY3JlYXRlOiB7ICcqJzogdHJ1ZSB9LFxuICB1cGRhdGU6IHsgJyonOiB0cnVlIH0sXG4gIGRlbGV0ZTogeyAnKic6IHRydWUgfSxcbiAgYWRkRmllbGQ6IHsgJyonOiB0cnVlIH0sXG4gIHByb3RlY3RlZEZpZWxkczogeyAnKic6IFtdIH0sXG59KTtcblxuZnVuY3Rpb24gbW9uZ29TY2hlbWFUb1BhcnNlU2NoZW1hKG1vbmdvU2NoZW1hKSB7XG4gIGxldCBjbHBzID0gZGVmYXVsdENMUFM7XG4gIGxldCBpbmRleGVzID0ge307XG4gIGlmIChtb25nb1NjaGVtYS5fbWV0YWRhdGEpIHtcbiAgICBpZiAobW9uZ29TY2hlbWEuX21ldGFkYXRhLmNsYXNzX3Blcm1pc3Npb25zKSB7XG4gICAgICBjbHBzID0geyAuLi5lbXB0eUNMUFMsIC4uLm1vbmdvU2NoZW1hLl9tZXRhZGF0YS5jbGFzc19wZXJtaXNzaW9ucyB9O1xuICAgIH1cbiAgICBpZiAobW9uZ29TY2hlbWEuX21ldGFkYXRhLmluZGV4ZXMpIHtcbiAgICAgIGluZGV4ZXMgPSB7IC4uLm1vbmdvU2NoZW1hLl9tZXRhZGF0YS5pbmRleGVzIH07XG4gICAgfVxuICB9XG4gIHJldHVybiB7XG4gICAgY2xhc3NOYW1lOiBtb25nb1NjaGVtYS5faWQsXG4gICAgZmllbGRzOiBtb25nb1NjaGVtYUZpZWxkc1RvUGFyc2VTY2hlbWFGaWVsZHMobW9uZ29TY2hlbWEpLFxuICAgIGNsYXNzTGV2ZWxQZXJtaXNzaW9uczogY2xwcyxcbiAgICBpbmRleGVzOiBpbmRleGVzLFxuICB9O1xufVxuXG5mdW5jdGlvbiBfbW9uZ29TY2hlbWFRdWVyeUZyb21OYW1lUXVlcnkobmFtZTogc3RyaW5nLCBxdWVyeSkge1xuICBjb25zdCBvYmplY3QgPSB7IF9pZDogbmFtZSB9O1xuICBpZiAocXVlcnkpIHtcbiAgICBPYmplY3Qua2V5cyhxdWVyeSkuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgb2JqZWN0W2tleV0gPSBxdWVyeVtrZXldO1xuICAgIH0pO1xuICB9XG4gIHJldHVybiBvYmplY3Q7XG59XG5cbi8vIFJldHVybnMgYSB0eXBlIHN1aXRhYmxlIGZvciBpbnNlcnRpbmcgaW50byBtb25nbyBfU0NIRU1BIGNvbGxlY3Rpb24uXG4vLyBEb2VzIG5vIHZhbGlkYXRpb24uIFRoYXQgaXMgZXhwZWN0ZWQgdG8gYmUgZG9uZSBpbiBQYXJzZSBTZXJ2ZXIuXG5mdW5jdGlvbiBwYXJzZUZpZWxkVHlwZVRvTW9uZ29GaWVsZFR5cGUoeyB0eXBlLCB0YXJnZXRDbGFzcyB9KSB7XG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgJ1BvaW50ZXInOlxuICAgICAgcmV0dXJuIGAqJHt0YXJnZXRDbGFzc31gO1xuICAgIGNhc2UgJ1JlbGF0aW9uJzpcbiAgICAgIHJldHVybiBgcmVsYXRpb248JHt0YXJnZXRDbGFzc30+YDtcbiAgICBjYXNlICdOdW1iZXInOlxuICAgICAgcmV0dXJuICdudW1iZXInO1xuICAgIGNhc2UgJ1N0cmluZyc6XG4gICAgICByZXR1cm4gJ3N0cmluZyc7XG4gICAgY2FzZSAnQm9vbGVhbic6XG4gICAgICByZXR1cm4gJ2Jvb2xlYW4nO1xuICAgIGNhc2UgJ0RhdGUnOlxuICAgICAgcmV0dXJuICdkYXRlJztcbiAgICBjYXNlICdPYmplY3QnOlxuICAgICAgcmV0dXJuICdvYmplY3QnO1xuICAgIGNhc2UgJ0FycmF5JzpcbiAgICAgIHJldHVybiAnYXJyYXknO1xuICAgIGNhc2UgJ0dlb1BvaW50JzpcbiAgICAgIHJldHVybiAnZ2VvcG9pbnQnO1xuICAgIGNhc2UgJ0ZpbGUnOlxuICAgICAgcmV0dXJuICdmaWxlJztcbiAgICBjYXNlICdCeXRlcyc6XG4gICAgICByZXR1cm4gJ2J5dGVzJztcbiAgICBjYXNlICdQb2x5Z29uJzpcbiAgICAgIHJldHVybiAncG9seWdvbic7XG4gIH1cbn1cblxuY2xhc3MgTW9uZ29TY2hlbWFDb2xsZWN0aW9uIHtcbiAgX2NvbGxlY3Rpb246IE1vbmdvQ29sbGVjdGlvbjtcblxuICBjb25zdHJ1Y3Rvcihjb2xsZWN0aW9uOiBNb25nb0NvbGxlY3Rpb24pIHtcbiAgICB0aGlzLl9jb2xsZWN0aW9uID0gY29sbGVjdGlvbjtcbiAgfVxuXG4gIF9mZXRjaEFsbFNjaGVtYXNGcm9tX1NDSEVNQSgpIHtcbiAgICByZXR1cm4gdGhpcy5fY29sbGVjdGlvbi5fcmF3RmluZCh7fSkudGhlbihzY2hlbWFzID0+IHNjaGVtYXMubWFwKG1vbmdvU2NoZW1hVG9QYXJzZVNjaGVtYSkpO1xuICB9XG5cbiAgX2ZldGNoT25lU2NoZW1hRnJvbV9TQ0hFTUEobmFtZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbGxlY3Rpb25cbiAgICAgIC5fcmF3RmluZChfbW9uZ29TY2hlbWFRdWVyeUZyb21OYW1lUXVlcnkobmFtZSksIHsgbGltaXQ6IDEgfSlcbiAgICAgIC50aGVuKHJlc3VsdHMgPT4ge1xuICAgICAgICBpZiAocmVzdWx0cy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICByZXR1cm4gbW9uZ29TY2hlbWFUb1BhcnNlU2NoZW1hKHJlc3VsdHNbMF0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICAvLyBBdG9taWNhbGx5IGZpbmQgYW5kIGRlbGV0ZSBhbiBvYmplY3QgYmFzZWQgb24gcXVlcnkuXG4gIGZpbmRBbmREZWxldGVTY2hlbWEobmFtZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbGxlY3Rpb24uX21vbmdvQ29sbGVjdGlvbi5maW5kT25lQW5kRGVsZXRlKF9tb25nb1NjaGVtYVF1ZXJ5RnJvbU5hbWVRdWVyeShuYW1lKSk7XG4gIH1cblxuICBpbnNlcnRTY2hlbWEoc2NoZW1hOiBhbnkpIHtcbiAgICByZXR1cm4gdGhpcy5fY29sbGVjdGlvblxuICAgICAgLmluc2VydE9uZShzY2hlbWEpXG4gICAgICAudGhlbigoKSA9PiBtb25nb1NjaGVtYVRvUGFyc2VTY2hlbWEoc2NoZW1hKSlcbiAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgIGlmIChlcnJvci5jb2RlID09PSAxMTAwMCkge1xuICAgICAgICAgIC8vTW9uZ28ncyBkdXBsaWNhdGUga2V5IGVycm9yXG4gICAgICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLkRVUExJQ0FURV9WQUxVRSwgJ0NsYXNzIGFscmVhZHkgZXhpc3RzLicpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIHVwZGF0ZVNjaGVtYShuYW1lOiBzdHJpbmcsIHVwZGF0ZSkge1xuICAgIHJldHVybiB0aGlzLl9jb2xsZWN0aW9uLnVwZGF0ZU9uZShfbW9uZ29TY2hlbWFRdWVyeUZyb21OYW1lUXVlcnkobmFtZSksIHVwZGF0ZSk7XG4gIH1cblxuICB1cHNlcnRTY2hlbWEobmFtZTogc3RyaW5nLCBxdWVyeTogc3RyaW5nLCB1cGRhdGUpIHtcbiAgICByZXR1cm4gdGhpcy5fY29sbGVjdGlvbi51cHNlcnRPbmUoX21vbmdvU2NoZW1hUXVlcnlGcm9tTmFtZVF1ZXJ5KG5hbWUsIHF1ZXJ5KSwgdXBkYXRlKTtcbiAgfVxuXG4gIC8vIEFkZCBhIGZpZWxkIHRvIHRoZSBzY2hlbWEuIElmIGRhdGFiYXNlIGRvZXMgbm90IHN1cHBvcnQgdGhlIGZpZWxkXG4gIC8vIHR5cGUgKGUuZy4gbW9uZ28gZG9lc24ndCBzdXBwb3J0IG1vcmUgdGhhbiBvbmUgR2VvUG9pbnQgaW4gYSBjbGFzcykgcmVqZWN0IHdpdGggYW4gXCJJbmNvcnJlY3QgVHlwZVwiXG4gIC8vIFBhcnNlIGVycm9yIHdpdGggYSBkZXNjaXB0aXZlIG1lc3NhZ2UuIElmIHRoZSBmaWVsZCBhbHJlYWR5IGV4aXN0cywgdGhpcyBmdW5jdGlvbiBtdXN0XG4gIC8vIG5vdCBtb2RpZnkgdGhlIHNjaGVtYSwgYW5kIG11c3QgcmVqZWN0IHdpdGggRFVQTElDQVRFX1ZBTFVFIGVycm9yLlxuICAvLyBJZiB0aGlzIGlzIGNhbGxlZCBmb3IgYSBjbGFzcyB0aGF0IGRvZXNuJ3QgZXhpc3QsIHRoaXMgZnVuY3Rpb24gbXVzdCBjcmVhdGUgdGhhdCBjbGFzcy5cblxuICAvLyBUT0RPOiB0aHJvdyBhbiBlcnJvciBpZiBhbiB1bnN1cHBvcnRlZCBmaWVsZCB0eXBlIGlzIHBhc3NlZC4gRGVjaWRpbmcgd2hldGhlciBhIHR5cGUgaXMgc3VwcG9ydGVkXG4gIC8vIHNob3VsZCBiZSB0aGUgam9iIG9mIHRoZSBhZGFwdGVyLiBTb21lIGFkYXB0ZXJzIG1heSBub3Qgc3VwcG9ydCBHZW9Qb2ludCBhdCBhbGwuIE90aGVycyBtYXlcbiAgLy8gU3VwcG9ydCBhZGRpdGlvbmFsIHR5cGVzIHRoYXQgTW9uZ28gZG9lc24ndCwgbGlrZSBNb25leSwgb3Igc29tZXRoaW5nLlxuXG4gIC8vIFRPRE86IGRvbid0IHNwZW5kIGFuIGV4dHJhIHF1ZXJ5IG9uIGZpbmRpbmcgdGhlIHNjaGVtYSBpZiB0aGUgdHlwZSB3ZSBhcmUgdHJ5aW5nIHRvIGFkZCBpc24ndCBhIEdlb1BvaW50LlxuICBhZGRGaWVsZElmTm90RXhpc3RzKGNsYXNzTmFtZTogc3RyaW5nLCBmaWVsZE5hbWU6IHN0cmluZywgZmllbGRUeXBlOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5fZmV0Y2hPbmVTY2hlbWFGcm9tX1NDSEVNQShjbGFzc05hbWUpXG4gICAgICAudGhlbihcbiAgICAgICAgc2NoZW1hID0+IHtcbiAgICAgICAgICAvLyBJZiBhIGZpZWxkIHdpdGggdGhpcyBuYW1lIGFscmVhZHkgZXhpc3RzLCBpdCB3aWxsIGJlIGhhbmRsZWQgZWxzZXdoZXJlLlxuICAgICAgICAgIGlmIChzY2hlbWEuZmllbGRzW2ZpZWxkTmFtZV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBUaGUgc2NoZW1hIGV4aXN0cy4gQ2hlY2sgZm9yIGV4aXN0aW5nIEdlb1BvaW50cy5cbiAgICAgICAgICBpZiAoZmllbGRUeXBlLnR5cGUgPT09ICdHZW9Qb2ludCcpIHtcbiAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGVyZSBhcmUgbm90IG90aGVyIGdlb3BvaW50IGZpZWxkc1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBPYmplY3Qua2V5cyhzY2hlbWEuZmllbGRzKS5zb21lKFxuICAgICAgICAgICAgICAgIGV4aXN0aW5nRmllbGQgPT4gc2NoZW1hLmZpZWxkc1tleGlzdGluZ0ZpZWxkXS50eXBlID09PSAnR2VvUG9pbnQnXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoXG4gICAgICAgICAgICAgICAgUGFyc2UuRXJyb3IuSU5DT1JSRUNUX1RZUEUsXG4gICAgICAgICAgICAgICAgJ01vbmdvREIgb25seSBzdXBwb3J0cyBvbmUgR2VvUG9pbnQgZmllbGQgaW4gYSBjbGFzcy4nXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3IgPT4ge1xuICAgICAgICAgIC8vIElmIGVycm9yIGlzIHVuZGVmaW5lZCwgdGhlIHNjaGVtYSBkb2Vzbid0IGV4aXN0LCBhbmQgd2UgY2FuIGNyZWF0ZSB0aGUgc2NoZW1hIHdpdGggdGhlIGZpZWxkLlxuICAgICAgICAgIC8vIElmIHNvbWUgb3RoZXIgZXJyb3IsIHJlamVjdCB3aXRoIGl0LlxuICAgICAgICAgIGlmIChlcnJvciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgICApXG4gICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgdHlwZSwgdGFyZ2V0Q2xhc3MsIC4uLmZpZWxkT3B0aW9ucyB9ID0gZmllbGRUeXBlO1xuICAgICAgICAvLyBXZSB1c2UgJGV4aXN0cyBhbmQgJHNldCB0byBhdm9pZCBvdmVyd3JpdGluZyB0aGUgZmllbGQgdHlwZSBpZiBpdFxuICAgICAgICAvLyBhbHJlYWR5IGV4aXN0cy4gKGl0IGNvdWxkIGhhdmUgYWRkZWQgaW5iZXR3ZWVuIHRoZSBsYXN0IHF1ZXJ5IGFuZCB0aGUgdXBkYXRlKVxuICAgICAgICBpZiAoZmllbGRPcHRpb25zICYmIE9iamVjdC5rZXlzKGZpZWxkT3B0aW9ucykubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLnVwc2VydFNjaGVtYShcbiAgICAgICAgICAgIGNsYXNzTmFtZSxcbiAgICAgICAgICAgIHsgW2ZpZWxkTmFtZV06IHsgJGV4aXN0czogZmFsc2UgfSB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAkc2V0OiB7XG4gICAgICAgICAgICAgICAgW2ZpZWxkTmFtZV06IHBhcnNlRmllbGRUeXBlVG9Nb25nb0ZpZWxkVHlwZSh7XG4gICAgICAgICAgICAgICAgICB0eXBlLFxuICAgICAgICAgICAgICAgICAgdGFyZ2V0Q2xhc3MsXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgW2BfbWV0YWRhdGEuZmllbGRzX29wdGlvbnMuJHtmaWVsZE5hbWV9YF06IGZpZWxkT3B0aW9ucyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiB0aGlzLnVwc2VydFNjaGVtYShcbiAgICAgICAgICAgIGNsYXNzTmFtZSxcbiAgICAgICAgICAgIHsgW2ZpZWxkTmFtZV06IHsgJGV4aXN0czogZmFsc2UgfSB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAkc2V0OiB7XG4gICAgICAgICAgICAgICAgW2ZpZWxkTmFtZV06IHBhcnNlRmllbGRUeXBlVG9Nb25nb0ZpZWxkVHlwZSh7XG4gICAgICAgICAgICAgICAgICB0eXBlLFxuICAgICAgICAgICAgICAgICAgdGFyZ2V0Q2xhc3MsXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9XG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICBhc3luYyB1cGRhdGVGaWVsZE9wdGlvbnMoY2xhc3NOYW1lOiBzdHJpbmcsIGZpZWxkTmFtZTogc3RyaW5nLCBmaWVsZFR5cGU6IGFueSkge1xuICAgIGNvbnN0IHsgLi4uZmllbGRPcHRpb25zIH0gPSBmaWVsZFR5cGU7XG4gICAgZGVsZXRlIGZpZWxkT3B0aW9ucy50eXBlO1xuICAgIGRlbGV0ZSBmaWVsZE9wdGlvbnMudGFyZ2V0Q2xhc3M7XG5cbiAgICBhd2FpdCB0aGlzLnVwc2VydFNjaGVtYShcbiAgICAgIGNsYXNzTmFtZSxcbiAgICAgIHsgW2ZpZWxkTmFtZV06IHsgJGV4aXN0czogdHJ1ZSB9IH0sXG4gICAgICB7XG4gICAgICAgICRzZXQ6IHtcbiAgICAgICAgICBbYF9tZXRhZGF0YS5maWVsZHNfb3B0aW9ucy4ke2ZpZWxkTmFtZX1gXTogZmllbGRPcHRpb25zLFxuICAgICAgICB9LFxuICAgICAgfVxuICAgICk7XG4gIH1cbn1cblxuLy8gRXhwb3J0ZWQgZm9yIHRlc3RpbmcgcmVhc29ucyBhbmQgYmVjYXVzZSB3ZSBoYXZlbid0IG1vdmVkIGFsbCBtb25nbyBzY2hlbWEgZm9ybWF0XG4vLyByZWxhdGVkIGxvZ2ljIGludG8gdGhlIGRhdGFiYXNlIGFkYXB0ZXIgeWV0LlxuTW9uZ29TY2hlbWFDb2xsZWN0aW9uLl9URVNUbW9uZ29TY2hlbWFUb1BhcnNlU2NoZW1hID0gbW9uZ29TY2hlbWFUb1BhcnNlU2NoZW1hO1xuTW9uZ29TY2hlbWFDb2xsZWN0aW9uLnBhcnNlRmllbGRUeXBlVG9Nb25nb0ZpZWxkVHlwZSA9IHBhcnNlRmllbGRUeXBlVG9Nb25nb0ZpZWxkVHlwZTtcblxuZXhwb3J0IGRlZmF1bHQgTW9uZ29TY2hlbWFDb2xsZWN0aW9uO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxJQUFBQSxnQkFBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsS0FBQSxHQUFBRixzQkFBQSxDQUFBQyxPQUFBO0FBQStCLFNBQUFELHVCQUFBRyxDQUFBLFdBQUFBLENBQUEsSUFBQUEsQ0FBQSxDQUFBQyxVQUFBLEdBQUFELENBQUEsS0FBQUUsT0FBQSxFQUFBRixDQUFBO0FBRS9CLFNBQVNHLDRCQUE0QkEsQ0FBQ0MsSUFBSSxFQUFFO0VBQzFDLElBQUlBLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLEVBQUU7SUFDbkIsT0FBTztNQUNMQSxJQUFJLEVBQUUsU0FBUztNQUNmQyxXQUFXLEVBQUVELElBQUksQ0FBQ0UsS0FBSyxDQUFDLENBQUM7SUFDM0IsQ0FBQztFQUNIO0VBQ0EsSUFBSUYsSUFBSSxDQUFDRyxVQUFVLENBQUMsV0FBVyxDQUFDLEVBQUU7SUFDaEMsT0FBTztNQUNMSCxJQUFJLEVBQUUsVUFBVTtNQUNoQkMsV0FBVyxFQUFFRCxJQUFJLENBQUNFLEtBQUssQ0FBQyxXQUFXLENBQUNFLE1BQU0sRUFBRUosSUFBSSxDQUFDSSxNQUFNLEdBQUcsQ0FBQztJQUM3RCxDQUFDO0VBQ0g7RUFDQSxRQUFRSixJQUFJO0lBQ1YsS0FBSyxRQUFRO01BQ1gsT0FBTztRQUFFQSxJQUFJLEVBQUU7TUFBUyxDQUFDO0lBQzNCLEtBQUssUUFBUTtNQUNYLE9BQU87UUFBRUEsSUFBSSxFQUFFO01BQVMsQ0FBQztJQUMzQixLQUFLLFNBQVM7TUFDWixPQUFPO1FBQUVBLElBQUksRUFBRTtNQUFVLENBQUM7SUFDNUIsS0FBSyxNQUFNO01BQ1QsT0FBTztRQUFFQSxJQUFJLEVBQUU7TUFBTyxDQUFDO0lBQ3pCLEtBQUssS0FBSztJQUNWLEtBQUssUUFBUTtNQUNYLE9BQU87UUFBRUEsSUFBSSxFQUFFO01BQVMsQ0FBQztJQUMzQixLQUFLLE9BQU87TUFDVixPQUFPO1FBQUVBLElBQUksRUFBRTtNQUFRLENBQUM7SUFDMUIsS0FBSyxVQUFVO01BQ2IsT0FBTztRQUFFQSxJQUFJLEVBQUU7TUFBVyxDQUFDO0lBQzdCLEtBQUssTUFBTTtNQUNULE9BQU87UUFBRUEsSUFBSSxFQUFFO01BQU8sQ0FBQztJQUN6QixLQUFLLE9BQU87TUFDVixPQUFPO1FBQUVBLElBQUksRUFBRTtNQUFRLENBQUM7SUFDMUIsS0FBSyxTQUFTO01BQ1osT0FBTztRQUFFQSxJQUFJLEVBQUU7TUFBVSxDQUFDO0VBQzlCO0FBQ0Y7QUFFQSxNQUFNSyxrQkFBa0IsR0FBRyxDQUFDLEtBQUssRUFBRSxXQUFXLEVBQUUscUJBQXFCLENBQUM7QUFDdEUsU0FBU0Msb0NBQW9DQSxDQUFDQyxNQUFNLEVBQUU7RUFDcEQsSUFBSUMsVUFBVSxHQUFHQyxNQUFNLENBQUNDLElBQUksQ0FBQ0gsTUFBTSxDQUFDLENBQUNJLE1BQU0sQ0FBQ0MsR0FBRyxJQUFJUCxrQkFBa0IsQ0FBQ1EsT0FBTyxDQUFDRCxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztFQUMxRixJQUFJRSxRQUFRLEdBQUdOLFVBQVUsQ0FBQ08sTUFBTSxDQUFDLENBQUNDLEdBQUcsRUFBRUMsU0FBUyxLQUFLO0lBQ25ERCxHQUFHLENBQUNDLFNBQVMsQ0FBQyxHQUFHbEIsNEJBQTRCLENBQUNRLE1BQU0sQ0FBQ1UsU0FBUyxDQUFDLENBQUM7SUFDaEUsSUFDRVYsTUFBTSxDQUFDVyxTQUFTLElBQ2hCWCxNQUFNLENBQUNXLFNBQVMsQ0FBQ0MsY0FBYyxJQUMvQlosTUFBTSxDQUFDVyxTQUFTLENBQUNDLGNBQWMsQ0FBQ0YsU0FBUyxDQUFDLEVBQzFDO01BQ0FELEdBQUcsQ0FBQ0MsU0FBUyxDQUFDLEdBQUdSLE1BQU0sQ0FBQ1csTUFBTSxDQUM1QixDQUFDLENBQUMsRUFDRkosR0FBRyxDQUFDQyxTQUFTLENBQUMsRUFDZFYsTUFBTSxDQUFDVyxTQUFTLENBQUNDLGNBQWMsQ0FBQ0YsU0FBUyxDQUMzQyxDQUFDO0lBQ0g7SUFDQSxPQUFPRCxHQUFHO0VBQ1osQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0VBQ05GLFFBQVEsQ0FBQ08sR0FBRyxHQUFHO0lBQUVyQixJQUFJLEVBQUU7RUFBTSxDQUFDO0VBQzlCYyxRQUFRLENBQUNRLFNBQVMsR0FBRztJQUFFdEIsSUFBSSxFQUFFO0VBQU8sQ0FBQztFQUNyQ2MsUUFBUSxDQUFDUyxTQUFTLEdBQUc7SUFBRXZCLElBQUksRUFBRTtFQUFPLENBQUM7RUFDckNjLFFBQVEsQ0FBQ1UsUUFBUSxHQUFHO0lBQUV4QixJQUFJLEVBQUU7RUFBUyxDQUFDO0VBQ3RDLE9BQU9jLFFBQVE7QUFDakI7QUFFQSxNQUFNVyxTQUFTLEdBQUdoQixNQUFNLENBQUNpQixNQUFNLENBQUM7RUFDOUJDLElBQUksRUFBRSxDQUFDLENBQUM7RUFDUkMsS0FBSyxFQUFFLENBQUMsQ0FBQztFQUNUQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO0VBQ1BDLE1BQU0sRUFBRSxDQUFDLENBQUM7RUFDVkMsTUFBTSxFQUFFLENBQUMsQ0FBQztFQUNWQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0VBQ1ZDLFFBQVEsRUFBRSxDQUFDLENBQUM7RUFDWkMsZUFBZSxFQUFFLENBQUM7QUFDcEIsQ0FBQyxDQUFDO0FBRUYsTUFBTUMsV0FBVyxHQUFHMUIsTUFBTSxDQUFDaUIsTUFBTSxDQUFDO0VBQ2hDTCxHQUFHLEVBQUU7SUFDSCxHQUFHLEVBQUU7TUFDSGUsSUFBSSxFQUFFLElBQUk7TUFDVkMsS0FBSyxFQUFFO0lBQ1Q7RUFDRixDQUFDO0VBQ0RWLElBQUksRUFBRTtJQUFFLEdBQUcsRUFBRTtFQUFLLENBQUM7RUFDbkJDLEtBQUssRUFBRTtJQUFFLEdBQUcsRUFBRTtFQUFLLENBQUM7RUFDcEJDLEdBQUcsRUFBRTtJQUFFLEdBQUcsRUFBRTtFQUFLLENBQUM7RUFDbEJDLE1BQU0sRUFBRTtJQUFFLEdBQUcsRUFBRTtFQUFLLENBQUM7RUFDckJDLE1BQU0sRUFBRTtJQUFFLEdBQUcsRUFBRTtFQUFLLENBQUM7RUFDckJDLE1BQU0sRUFBRTtJQUFFLEdBQUcsRUFBRTtFQUFLLENBQUM7RUFDckJDLFFBQVEsRUFBRTtJQUFFLEdBQUcsRUFBRTtFQUFLLENBQUM7RUFDdkJDLGVBQWUsRUFBRTtJQUFFLEdBQUcsRUFBRTtFQUFHO0FBQzdCLENBQUMsQ0FBQztBQUVGLFNBQVNJLHdCQUF3QkEsQ0FBQ0MsV0FBVyxFQUFFO0VBQzdDLElBQUlDLElBQUksR0FBR0wsV0FBVztFQUN0QixJQUFJTSxPQUFPLEdBQUcsQ0FBQyxDQUFDO0VBQ2hCLElBQUlGLFdBQVcsQ0FBQ3JCLFNBQVMsRUFBRTtJQUN6QixJQUFJcUIsV0FBVyxDQUFDckIsU0FBUyxDQUFDd0IsaUJBQWlCLEVBQUU7TUFDM0NGLElBQUksR0FBRztRQUFFLEdBQUdmLFNBQVM7UUFBRSxHQUFHYyxXQUFXLENBQUNyQixTQUFTLENBQUN3QjtNQUFrQixDQUFDO0lBQ3JFO0lBQ0EsSUFBSUgsV0FBVyxDQUFDckIsU0FBUyxDQUFDdUIsT0FBTyxFQUFFO01BQ2pDQSxPQUFPLEdBQUc7UUFBRSxHQUFHRixXQUFXLENBQUNyQixTQUFTLENBQUN1QjtNQUFRLENBQUM7SUFDaEQ7RUFDRjtFQUNBLE9BQU87SUFDTEUsU0FBUyxFQUFFSixXQUFXLENBQUNLLEdBQUc7SUFDMUJDLE1BQU0sRUFBRXZDLG9DQUFvQyxDQUFDaUMsV0FBVyxDQUFDO0lBQ3pETyxxQkFBcUIsRUFBRU4sSUFBSTtJQUMzQkMsT0FBTyxFQUFFQTtFQUNYLENBQUM7QUFDSDtBQUVBLFNBQVNNLDhCQUE4QkEsQ0FBQ0MsSUFBWSxFQUFFQyxLQUFLLEVBQUU7RUFDM0QsTUFBTUMsTUFBTSxHQUFHO0lBQUVOLEdBQUcsRUFBRUk7RUFBSyxDQUFDO0VBQzVCLElBQUlDLEtBQUssRUFBRTtJQUNUeEMsTUFBTSxDQUFDQyxJQUFJLENBQUN1QyxLQUFLLENBQUMsQ0FBQ0UsT0FBTyxDQUFDdkMsR0FBRyxJQUFJO01BQ2hDc0MsTUFBTSxDQUFDdEMsR0FBRyxDQUFDLEdBQUdxQyxLQUFLLENBQUNyQyxHQUFHLENBQUM7SUFDMUIsQ0FBQyxDQUFDO0VBQ0o7RUFDQSxPQUFPc0MsTUFBTTtBQUNmOztBQUVBO0FBQ0E7QUFDQSxTQUFTRSw4QkFBOEJBLENBQUM7RUFBRXBELElBQUk7RUFBRUM7QUFBWSxDQUFDLEVBQUU7RUFDN0QsUUFBUUQsSUFBSTtJQUNWLEtBQUssU0FBUztNQUNaLE9BQU8sSUFBSUMsV0FBVyxFQUFFO0lBQzFCLEtBQUssVUFBVTtNQUNiLE9BQU8sWUFBWUEsV0FBVyxHQUFHO0lBQ25DLEtBQUssUUFBUTtNQUNYLE9BQU8sUUFBUTtJQUNqQixLQUFLLFFBQVE7TUFDWCxPQUFPLFFBQVE7SUFDakIsS0FBSyxTQUFTO01BQ1osT0FBTyxTQUFTO0lBQ2xCLEtBQUssTUFBTTtNQUNULE9BQU8sTUFBTTtJQUNmLEtBQUssUUFBUTtNQUNYLE9BQU8sUUFBUTtJQUNqQixLQUFLLE9BQU87TUFDVixPQUFPLE9BQU87SUFDaEIsS0FBSyxVQUFVO01BQ2IsT0FBTyxVQUFVO0lBQ25CLEtBQUssTUFBTTtNQUNULE9BQU8sTUFBTTtJQUNmLEtBQUssT0FBTztNQUNWLE9BQU8sT0FBTztJQUNoQixLQUFLLFNBQVM7TUFDWixPQUFPLFNBQVM7RUFDcEI7QUFDRjtBQUVBLE1BQU1vRCxxQkFBcUIsQ0FBQztFQUcxQkMsV0FBV0EsQ0FBQ0MsVUFBMkIsRUFBRTtJQUN2QyxJQUFJLENBQUNDLFdBQVcsR0FBR0QsVUFBVTtFQUMvQjtFQUVBRSwyQkFBMkJBLENBQUEsRUFBRztJQUM1QixPQUFPLElBQUksQ0FBQ0QsV0FBVyxDQUFDRSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQ0MsSUFBSSxDQUFDQyxPQUFPLElBQUlBLE9BQU8sQ0FBQ0MsR0FBRyxDQUFDdkIsd0JBQXdCLENBQUMsQ0FBQztFQUM3RjtFQUVBd0IsMEJBQTBCQSxDQUFDZCxJQUFZLEVBQUU7SUFDdkMsT0FBTyxJQUFJLENBQUNRLFdBQVcsQ0FDcEJFLFFBQVEsQ0FBQ1gsOEJBQThCLENBQUNDLElBQUksQ0FBQyxFQUFFO01BQUVlLEtBQUssRUFBRTtJQUFFLENBQUMsQ0FBQyxDQUM1REosSUFBSSxDQUFDSyxPQUFPLElBQUk7TUFDZixJQUFJQSxPQUFPLENBQUM1RCxNQUFNLEtBQUssQ0FBQyxFQUFFO1FBQ3hCLE9BQU9rQyx3QkFBd0IsQ0FBQzBCLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUM3QyxDQUFDLE1BQU07UUFDTCxNQUFNQyxTQUFTO01BQ2pCO0lBQ0YsQ0FBQyxDQUFDO0VBQ047O0VBRUE7RUFDQUMsbUJBQW1CQSxDQUFDbEIsSUFBWSxFQUFFO0lBQ2hDLE9BQU8sSUFBSSxDQUFDUSxXQUFXLENBQUNXLGdCQUFnQixDQUFDQyxnQkFBZ0IsQ0FBQ3JCLDhCQUE4QixDQUFDQyxJQUFJLENBQUMsQ0FBQztFQUNqRztFQUVBcUIsWUFBWUEsQ0FBQzlELE1BQVcsRUFBRTtJQUN4QixPQUFPLElBQUksQ0FBQ2lELFdBQVcsQ0FDcEJjLFNBQVMsQ0FBQy9ELE1BQU0sQ0FBQyxDQUNqQm9ELElBQUksQ0FBQyxNQUFNckIsd0JBQXdCLENBQUMvQixNQUFNLENBQUMsQ0FBQyxDQUM1Q2dFLEtBQUssQ0FBQ0MsS0FBSyxJQUFJO01BQ2QsSUFBSUEsS0FBSyxDQUFDQyxJQUFJLEtBQUssS0FBSyxFQUFFO1FBQ3hCO1FBQ0EsTUFBTSxJQUFJQyxhQUFLLENBQUNDLEtBQUssQ0FBQ0QsYUFBSyxDQUFDQyxLQUFLLENBQUNDLGVBQWUsRUFBRSx1QkFBdUIsQ0FBQztNQUM3RSxDQUFDLE1BQU07UUFDTCxNQUFNSixLQUFLO01BQ2I7SUFDRixDQUFDLENBQUM7RUFDTjtFQUVBSyxZQUFZQSxDQUFDN0IsSUFBWSxFQUFFakIsTUFBTSxFQUFFO0lBQ2pDLE9BQU8sSUFBSSxDQUFDeUIsV0FBVyxDQUFDc0IsU0FBUyxDQUFDL0IsOEJBQThCLENBQUNDLElBQUksQ0FBQyxFQUFFakIsTUFBTSxDQUFDO0VBQ2pGO0VBRUFnRCxZQUFZQSxDQUFDL0IsSUFBWSxFQUFFQyxLQUFhLEVBQUVsQixNQUFNLEVBQUU7SUFDaEQsT0FBTyxJQUFJLENBQUN5QixXQUFXLENBQUN3QixTQUFTLENBQUNqQyw4QkFBOEIsQ0FBQ0MsSUFBSSxFQUFFQyxLQUFLLENBQUMsRUFBRWxCLE1BQU0sQ0FBQztFQUN4Rjs7RUFFQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVBO0VBQ0E7RUFDQTs7RUFFQTtFQUNBa0QsbUJBQW1CQSxDQUFDdEMsU0FBaUIsRUFBRTFCLFNBQWlCLEVBQUVpRSxTQUFpQixFQUFFO0lBQzNFLE9BQU8sSUFBSSxDQUFDcEIsMEJBQTBCLENBQUNuQixTQUFTLENBQUMsQ0FDOUNnQixJQUFJLENBQ0hwRCxNQUFNLElBQUk7TUFDUjtNQUNBLElBQUlBLE1BQU0sQ0FBQ3NDLE1BQU0sQ0FBQzVCLFNBQVMsQ0FBQyxLQUFLZ0QsU0FBUyxFQUFFO1FBQzFDO01BQ0Y7TUFDQTtNQUNBLElBQUlpQixTQUFTLENBQUNsRixJQUFJLEtBQUssVUFBVSxFQUFFO1FBQ2pDO1FBQ0EsSUFDRVMsTUFBTSxDQUFDQyxJQUFJLENBQUNILE1BQU0sQ0FBQ3NDLE1BQU0sQ0FBQyxDQUFDc0MsSUFBSSxDQUM3QkMsYUFBYSxJQUFJN0UsTUFBTSxDQUFDc0MsTUFBTSxDQUFDdUMsYUFBYSxDQUFDLENBQUNwRixJQUFJLEtBQUssVUFDekQsQ0FBQyxFQUNEO1VBQ0EsTUFBTSxJQUFJMEUsYUFBSyxDQUFDQyxLQUFLLENBQ25CRCxhQUFLLENBQUNDLEtBQUssQ0FBQ1UsY0FBYyxFQUMxQixzREFDRixDQUFDO1FBQ0g7TUFDRjtNQUNBO0lBQ0YsQ0FBQyxFQUNEYixLQUFLLElBQUk7TUFDUDtNQUNBO01BQ0EsSUFBSUEsS0FBSyxLQUFLUCxTQUFTLEVBQUU7UUFDdkI7TUFDRjtNQUNBLE1BQU1PLEtBQUs7SUFDYixDQUNGLENBQUMsQ0FDQWIsSUFBSSxDQUFDLE1BQU07TUFDVixNQUFNO1FBQUUzRCxJQUFJO1FBQUVDLFdBQVc7UUFBRSxHQUFHcUY7TUFBYSxDQUFDLEdBQUdKLFNBQVM7TUFDeEQ7TUFDQTtNQUNBLElBQUlJLFlBQVksSUFBSTdFLE1BQU0sQ0FBQ0MsSUFBSSxDQUFDNEUsWUFBWSxDQUFDLENBQUNsRixNQUFNLEdBQUcsQ0FBQyxFQUFFO1FBQ3hELE9BQU8sSUFBSSxDQUFDMkUsWUFBWSxDQUN0QnBDLFNBQVMsRUFDVDtVQUFFLENBQUMxQixTQUFTLEdBQUc7WUFBRXNFLE9BQU8sRUFBRTtVQUFNO1FBQUUsQ0FBQyxFQUNuQztVQUNFQyxJQUFJLEVBQUU7WUFDSixDQUFDdkUsU0FBUyxHQUFHbUMsOEJBQThCLENBQUM7Y0FDMUNwRCxJQUFJO2NBQ0pDO1lBQ0YsQ0FBQyxDQUFDO1lBQ0YsQ0FBQyw0QkFBNEJnQixTQUFTLEVBQUUsR0FBR3FFO1VBQzdDO1FBQ0YsQ0FDRixDQUFDO01BQ0gsQ0FBQyxNQUFNO1FBQ0wsT0FBTyxJQUFJLENBQUNQLFlBQVksQ0FDdEJwQyxTQUFTLEVBQ1Q7VUFBRSxDQUFDMUIsU0FBUyxHQUFHO1lBQUVzRSxPQUFPLEVBQUU7VUFBTTtRQUFFLENBQUMsRUFDbkM7VUFDRUMsSUFBSSxFQUFFO1lBQ0osQ0FBQ3ZFLFNBQVMsR0FBR21DLDhCQUE4QixDQUFDO2NBQzFDcEQsSUFBSTtjQUNKQztZQUNGLENBQUM7VUFDSDtRQUNGLENBQ0YsQ0FBQztNQUNIO0lBQ0YsQ0FBQyxDQUFDO0VBQ047RUFFQSxNQUFNd0Ysa0JBQWtCQSxDQUFDOUMsU0FBaUIsRUFBRTFCLFNBQWlCLEVBQUVpRSxTQUFjLEVBQUU7SUFDN0UsTUFBTTtNQUFFLEdBQUdJO0lBQWEsQ0FBQyxHQUFHSixTQUFTO0lBQ3JDLE9BQU9JLFlBQVksQ0FBQ3RGLElBQUk7SUFDeEIsT0FBT3NGLFlBQVksQ0FBQ3JGLFdBQVc7SUFFL0IsTUFBTSxJQUFJLENBQUM4RSxZQUFZLENBQ3JCcEMsU0FBUyxFQUNUO01BQUUsQ0FBQzFCLFNBQVMsR0FBRztRQUFFc0UsT0FBTyxFQUFFO01BQUs7SUFBRSxDQUFDLEVBQ2xDO01BQ0VDLElBQUksRUFBRTtRQUNKLENBQUMsNEJBQTRCdkUsU0FBUyxFQUFFLEdBQUdxRTtNQUM3QztJQUNGLENBQ0YsQ0FBQztFQUNIO0FBQ0Y7O0FBRUE7QUFDQTtBQUNBakMscUJBQXFCLENBQUNxQyw2QkFBNkIsR0FBR3BELHdCQUF3QjtBQUM5RWUscUJBQXFCLENBQUNELDhCQUE4QixHQUFHQSw4QkFBOEI7QUFBQyxJQUFBdUMsUUFBQSxHQUFBQyxPQUFBLENBQUE5RixPQUFBLEdBRXZFdUQscUJBQXFCIiwiaWdub3JlTGlzdCI6W119