parse-server 6.0.0-alpha.3 → 6.0.0-alpha.31

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 +58 -34
  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 +46 -87
  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 +13 -10
  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 +77 -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 -8
  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 +90 -10
  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 +178 -202
  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 +59 -156
  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 +170 -151
  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 +25 -22
  192. package/PATENTS +0 -37
package/lib/Auth.js CHANGED
@@ -1,23 +1,16 @@
1
1
  "use strict";
2
2
 
3
3
  var _util = require("util");
4
-
5
4
  var _triggers = require("./triggers");
6
-
7
5
  var _Deprecator = _interopRequireDefault(require("./Deprecator/Deprecator"));
8
-
9
6
  var _logger = require("./logger");
10
-
11
7
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
12
-
13
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
14
-
15
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
16
-
17
- function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
18
-
8
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
9
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
10
+ function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
11
+ function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
12
+ function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
19
13
  const Parse = require('parse/node');
20
-
21
14
  // An Auth object tells you who is requesting something and whether
22
15
  // the master key was used.
23
16
  // userObject is a Parse.User and can be null if there's no user.
@@ -25,6 +18,7 @@ function Auth({
25
18
  config,
26
19
  cacheController = undefined,
27
20
  isMaster = false,
21
+ isMaintenance = false,
28
22
  isReadOnly = false,
29
23
  user,
30
24
  installationId
@@ -33,55 +27,66 @@ function Auth({
33
27
  this.cacheController = cacheController || config && config.cacheController;
34
28
  this.installationId = installationId;
35
29
  this.isMaster = isMaster;
30
+ this.isMaintenance = isMaintenance;
36
31
  this.user = user;
37
- this.isReadOnly = isReadOnly; // Assuming a users roles won't change during a single request, we'll
38
- // only load them once.
32
+ this.isReadOnly = isReadOnly;
39
33
 
34
+ // Assuming a users roles won't change during a single request, we'll
35
+ // only load them once.
40
36
  this.userRoles = [];
41
37
  this.fetchedRoles = false;
42
38
  this.rolePromise = null;
43
- } // Whether this auth could possibly modify the given user id.
44
- // It still could be forbidden via ACLs even if this returns true.
45
-
39
+ }
46
40
 
41
+ // Whether this auth could possibly modify the given user id.
42
+ // It still could be forbidden via ACLs even if this returns true.
47
43
  Auth.prototype.isUnauthenticated = function () {
48
44
  if (this.isMaster) {
49
45
  return false;
50
46
  }
51
-
47
+ if (this.isMaintenance) {
48
+ return false;
49
+ }
52
50
  if (this.user) {
53
51
  return false;
54
52
  }
55
-
56
53
  return true;
57
- }; // A helper to get a master-level Auth object
58
-
54
+ };
59
55
 
56
+ // A helper to get a master-level Auth object
60
57
  function master(config) {
61
58
  return new Auth({
62
59
  config,
63
60
  isMaster: true
64
61
  });
65
- } // A helper to get a master-level Auth object
62
+ }
66
63
 
64
+ // A helper to get a maintenance-level Auth object
65
+ function maintenance(config) {
66
+ return new Auth({
67
+ config,
68
+ isMaintenance: true
69
+ });
70
+ }
67
71
 
72
+ // A helper to get a master-level Auth object
68
73
  function readOnly(config) {
69
74
  return new Auth({
70
75
  config,
71
76
  isMaster: true,
72
77
  isReadOnly: true
73
78
  });
74
- } // A helper to get a nobody-level Auth object
75
-
79
+ }
76
80
 
81
+ // A helper to get a nobody-level Auth object
77
82
  function nobody(config) {
78
83
  return new Auth({
79
84
  config,
80
85
  isMaster: false
81
86
  });
82
- } // Returns a promise that resolves to an Auth object
83
-
87
+ }
84
88
 
89
+ // Returns a promise that resolves to an Auth object
85
90
  const getAuthForSessionToken = async function ({
86
91
  config,
87
92
  cacheController,
@@ -89,10 +94,8 @@ const getAuthForSessionToken = async function ({
89
94
  installationId
90
95
  }) {
91
96
  cacheController = cacheController || config && config.cacheController;
92
-
93
97
  if (cacheController) {
94
98
  const userJSON = await cacheController.user.get(sessionToken);
95
-
96
99
  if (userJSON) {
97
100
  const cachedUser = Parse.Object.fromJSON(userJSON);
98
101
  return Promise.resolve(new Auth({
@@ -104,17 +107,13 @@ const getAuthForSessionToken = async function ({
104
107
  }));
105
108
  }
106
109
  }
107
-
108
110
  let results;
109
-
110
111
  if (config) {
111
112
  const restOptions = {
112
113
  limit: 1,
113
114
  include: 'user'
114
115
  };
115
-
116
116
  const RestQuery = require('./RestQuery');
117
-
118
117
  const query = new RestQuery(config, master(config), '_Session', {
119
118
  sessionToken
120
119
  }, restOptions);
@@ -124,27 +123,21 @@ const getAuthForSessionToken = async function ({
124
123
  useMasterKey: true
125
124
  })).map(obj => obj.toJSON());
126
125
  }
127
-
128
126
  if (results.length !== 1 || !results[0]['user']) {
129
127
  throw new Parse.Error(Parse.Error.INVALID_SESSION_TOKEN, 'Invalid session token');
130
128
  }
131
-
132
129
  const now = new Date(),
133
- expiresAt = results[0].expiresAt ? new Date(results[0].expiresAt.iso) : undefined;
134
-
130
+ expiresAt = results[0].expiresAt ? new Date(results[0].expiresAt.iso) : undefined;
135
131
  if (expiresAt < now) {
136
132
  throw new Parse.Error(Parse.Error.INVALID_SESSION_TOKEN, 'Session token is expired.');
137
133
  }
138
-
139
134
  const obj = results[0]['user'];
140
135
  delete obj.password;
141
136
  obj['className'] = '_User';
142
137
  obj['sessionToken'] = sessionToken;
143
-
144
138
  if (cacheController) {
145
139
  cacheController.user.put(sessionToken, obj);
146
140
  }
147
-
148
141
  const userObject = Parse.Object.fromJSON(obj);
149
142
  return new Auth({
150
143
  config,
@@ -154,7 +147,6 @@ const getAuthForSessionToken = async function ({
154
147
  user: userObject
155
148
  });
156
149
  };
157
-
158
150
  var getAuthForLegacySessionToken = function ({
159
151
  config,
160
152
  sessionToken,
@@ -163,19 +155,15 @@ var getAuthForLegacySessionToken = function ({
163
155
  var restOptions = {
164
156
  limit: 1
165
157
  };
166
-
167
158
  const RestQuery = require('./RestQuery');
168
-
169
159
  var query = new RestQuery(config, master(config), '_User', {
170
160
  sessionToken
171
161
  }, restOptions);
172
162
  return query.execute().then(response => {
173
163
  var results = response.results;
174
-
175
164
  if (results.length !== 1) {
176
165
  throw new Parse.Error(Parse.Error.INVALID_SESSION_TOKEN, 'invalid legacy session token');
177
166
  }
178
-
179
167
  const obj = results[0];
180
168
  obj.className = '_User';
181
169
  const userObject = Parse.Object.fromJSON(obj);
@@ -186,30 +174,25 @@ var getAuthForLegacySessionToken = function ({
186
174
  user: userObject
187
175
  });
188
176
  });
189
- }; // Returns a promise that resolves to an array of role names
190
-
177
+ };
191
178
 
179
+ // Returns a promise that resolves to an array of role names
192
180
  Auth.prototype.getUserRoles = function () {
193
- if (this.isMaster || !this.user) {
181
+ if (this.isMaster || this.isMaintenance || !this.user) {
194
182
  return Promise.resolve([]);
195
183
  }
196
-
197
184
  if (this.fetchedRoles) {
198
185
  return Promise.resolve(this.userRoles);
199
186
  }
200
-
201
187
  if (this.rolePromise) {
202
188
  return this.rolePromise;
203
189
  }
204
-
205
190
  this.rolePromise = this._loadRoles();
206
191
  return this.rolePromise;
207
192
  };
208
-
209
193
  Auth.prototype.getRolesForUser = async function () {
210
194
  //Stack all Parse.Role
211
195
  const results = [];
212
-
213
196
  if (this.config) {
214
197
  const restWhere = {
215
198
  users: {
@@ -218,34 +201,29 @@ Auth.prototype.getRolesForUser = async function () {
218
201
  objectId: this.user.id
219
202
  }
220
203
  };
221
-
222
204
  const RestQuery = require('./RestQuery');
223
-
224
205
  await new RestQuery(this.config, master(this.config), '_Role', restWhere, {}).each(result => results.push(result));
225
206
  } else {
226
207
  await new Parse.Query(Parse.Role).equalTo('users', this.user).each(result => results.push(result.toJSON()), {
227
208
  useMasterKey: true
228
209
  });
229
210
  }
230
-
231
211
  return results;
232
- }; // Iterates through the role tree and compiles a user's roles
233
-
212
+ };
234
213
 
214
+ // Iterates through the role tree and compiles a user's roles
235
215
  Auth.prototype._loadRoles = async function () {
236
216
  if (this.cacheController) {
237
217
  const cachedRoles = await this.cacheController.role.get(this.user.id);
238
-
239
218
  if (cachedRoles != null) {
240
219
  this.fetchedRoles = true;
241
220
  this.userRoles = cachedRoles;
242
221
  return cachedRoles;
243
222
  }
244
- } // First get the role ids this user is directly a member of
245
-
223
+ }
246
224
 
225
+ // First get the role ids this user is directly a member of
247
226
  const results = await this.getRolesForUser();
248
-
249
227
  if (!results.length) {
250
228
  this.userRoles = [];
251
229
  this.fetchedRoles = true;
@@ -253,7 +231,6 @@ Auth.prototype._loadRoles = async function () {
253
231
  this.cacheRoles();
254
232
  return this.userRoles;
255
233
  }
256
-
257
234
  const rolesMap = results.reduce((m, r) => {
258
235
  m.names.push(r.name);
259
236
  m.ids.push(r.objectId);
@@ -261,8 +238,9 @@ Auth.prototype._loadRoles = async function () {
261
238
  }, {
262
239
  ids: [],
263
240
  names: []
264
- }); // run the recursive finding
241
+ });
265
242
 
243
+ // run the recursive finding
266
244
  const roleNames = await this._getAllRolesNamesForRoleIds(rolesMap.ids, rolesMap.names);
267
245
  this.userRoles = roleNames.map(r => {
268
246
  return 'role:' + r;
@@ -272,29 +250,24 @@ Auth.prototype._loadRoles = async function () {
272
250
  this.cacheRoles();
273
251
  return this.userRoles;
274
252
  };
275
-
276
253
  Auth.prototype.cacheRoles = function () {
277
254
  if (!this.cacheController) {
278
255
  return false;
279
256
  }
280
-
281
257
  this.cacheController.role.put(this.user.id, Array(...this.userRoles));
282
258
  return true;
283
259
  };
284
-
285
260
  Auth.prototype.clearRoleCache = function (sessionToken) {
286
261
  if (!this.cacheController) {
287
262
  return false;
288
263
  }
289
-
290
264
  this.cacheController.role.del(this.user.id);
291
265
  this.cacheController.user.del(sessionToken);
292
266
  return true;
293
267
  };
294
-
295
268
  Auth.prototype.getRolesByIds = async function (ins) {
296
- const results = []; // Build an OR query across all parentRoles
297
-
269
+ const results = [];
270
+ // Build an OR query across all parentRoles
298
271
  if (!this.config) {
299
272
  await new Parse.Query(Parse.Role).containedIn('roles', ins.map(id => {
300
273
  const role = new Parse.Object(Parse.Role);
@@ -316,34 +289,30 @@ Auth.prototype.getRolesByIds = async function (ins) {
316
289
  $in: roles
317
290
  }
318
291
  };
319
-
320
292
  const RestQuery = require('./RestQuery');
321
-
322
293
  await new RestQuery(this.config, master(this.config), '_Role', restWhere, {}).each(result => results.push(result));
323
294
  }
324
-
325
295
  return results;
326
- }; // Given a list of roleIds, find all the parent roles, returns a promise with all names
327
-
296
+ };
328
297
 
298
+ // Given a list of roleIds, find all the parent roles, returns a promise with all names
329
299
  Auth.prototype._getAllRolesNamesForRoleIds = function (roleIDs, names = [], queriedRoles = {}) {
330
300
  const ins = roleIDs.filter(roleID => {
331
301
  const wasQueried = queriedRoles[roleID] !== true;
332
302
  queriedRoles[roleID] = true;
333
303
  return wasQueried;
334
- }); // all roles are accounted for, return the names
304
+ });
335
305
 
306
+ // all roles are accounted for, return the names
336
307
  if (ins.length == 0) {
337
308
  return Promise.resolve([...new Set(names)]);
338
309
  }
339
-
340
310
  return this.getRolesByIds(ins).then(results => {
341
311
  // Nothing found
342
312
  if (!results.length) {
343
313
  return Promise.resolve(names);
344
- } // Map the results with all Ids and names
345
-
346
-
314
+ }
315
+ // Map the results with all Ids and names
347
316
  const resultMap = results.reduce((memo, role) => {
348
317
  memo.names.push(role.name);
349
318
  memo.ids.push(role.objectId);
@@ -351,23 +320,21 @@ Auth.prototype._getAllRolesNamesForRoleIds = function (roleIDs, names = [], quer
351
320
  }, {
352
321
  ids: [],
353
322
  names: []
354
- }); // store the new found names
355
-
356
- names = names.concat(resultMap.names); // find the next ones, circular roles will be cut
357
-
323
+ });
324
+ // store the new found names
325
+ names = names.concat(resultMap.names);
326
+ // find the next ones, circular roles will be cut
358
327
  return this._getAllRolesNamesForRoleIds(resultMap.ids, names, queriedRoles);
359
328
  }).then(names => {
360
329
  return Promise.resolve([...new Set(names)]);
361
330
  });
362
331
  };
363
-
364
332
  const findUsersWithAuthData = (config, authData) => {
365
333
  const providers = Object.keys(authData);
366
334
  const query = providers.reduce((memo, provider) => {
367
335
  if (!authData[provider] || authData && !authData[provider].id) {
368
336
  return memo;
369
337
  }
370
-
371
338
  const queryKey = `authData.${provider}.id`;
372
339
  const query = {};
373
340
  query[queryKey] = authData[provider].id;
@@ -382,7 +349,6 @@ const findUsersWithAuthData = (config, authData) => {
382
349
  limit: 2
383
350
  }) : Promise.resolve([]);
384
351
  };
385
-
386
352
  const hasMutatedAuthData = (authData, userAuthData) => {
387
353
  if (!userAuthData) return {
388
354
  hasMutatedAuthData: true,
@@ -394,7 +360,6 @@ const hasMutatedAuthData = (authData, userAuthData) => {
394
360
  if (provider === 'anonymous') return;
395
361
  const providerData = authData[provider];
396
362
  const userProviderAuthData = userAuthData[provider];
397
-
398
363
  if (!(0, _util.isDeepStrictEqual)(providerData, userProviderAuthData)) {
399
364
  mutatedAuthData[provider] = providerData;
400
365
  }
@@ -405,20 +370,19 @@ const hasMutatedAuthData = (authData, userAuthData) => {
405
370
  mutatedAuthData
406
371
  };
407
372
  };
408
-
409
373
  const checkIfUserHasProvidedConfiguredProvidersForLogin = (authData = {}, userAuthData = {}, config) => {
410
374
  const savedUserProviders = Object.keys(userAuthData).map(provider => ({
411
375
  name: provider,
412
376
  adapter: config.authDataManager.getValidatorForProvider(provider).adapter
413
377
  }));
414
- const hasProvidedASoloProvider = savedUserProviders.some(provider => provider && provider.adapter && provider.adapter.policy === 'solo' && authData[provider.name]); // Solo providers can be considered as safe, so we do not have to check if the user needs
378
+ const hasProvidedASoloProvider = savedUserProviders.some(provider => provider && provider.adapter && provider.adapter.policy === 'solo' && authData[provider.name]);
379
+
380
+ // Solo providers can be considered as safe, so we do not have to check if the user needs
415
381
  // to provide an additional provider to login. An auth adapter with "solo" (like webauthn) means
416
382
  // no "additional" auth needs to be provided to login (like OTP, MFA)
417
-
418
383
  if (hasProvidedASoloProvider) {
419
384
  return;
420
385
  }
421
-
422
386
  const additionProvidersNotFound = [];
423
387
  const hasProvidedAtLeastOneAdditionalProvider = savedUserProviders.some(provider => {
424
388
  if (provider && provider.adapter && provider.adapter.policy === 'additional') {
@@ -430,22 +394,20 @@ const checkIfUserHasProvidedConfiguredProvidersForLogin = (authData = {}, userAu
430
394
  }
431
395
  }
432
396
  });
433
-
434
397
  if (hasProvidedAtLeastOneAdditionalProvider || !additionProvidersNotFound.length) {
435
398
  return;
436
399
  }
437
-
438
400
  throw new Parse.Error(Parse.Error.OTHER_CAUSE, `Missing additional authData ${additionProvidersNotFound.join(',')}`);
439
- }; // Validate each authData step-by-step and return the provider responses
440
-
401
+ };
441
402
 
403
+ // Validate each authData step-by-step and return the provider responses
442
404
  const handleAuthDataValidation = async (authData, req, foundUser) => {
443
405
  let user;
444
-
445
406
  if (foundUser) {
446
407
  user = Parse.User.fromJSON(_objectSpread({
447
408
  className: '_User'
448
- }, foundUser)); // Find user by session and current objectId; only pass user if it's the current user or master key is provided
409
+ }, foundUser));
410
+ // Find user by session and current objectId; only pass user if it's the current user or master key is provided
449
411
  } else if (req.auth && req.auth.user && typeof req.getUserId === 'function' && req.getUserId() === req.auth.user.id || req.auth && req.auth.isMaster && typeof req.getUserId === 'function' && req.getUserId()) {
450
412
  user = new Parse.User();
451
413
  user.id = req.auth.isMaster ? req.getUserId() : req.auth.user.id;
@@ -453,68 +415,56 @@ const handleAuthDataValidation = async (authData, req, foundUser) => {
453
415
  useMasterKey: true
454
416
  });
455
417
  }
456
-
457
418
  const {
458
419
  originalObject,
459
420
  updatedObject
460
421
  } = req.buildParseObjects();
461
- const requestObject = (0, _triggers.getRequestObject)(undefined, req.auth, updatedObject, originalObject || user, req.config); // Perform validation as step-by-step pipeline for better error consistency
422
+ const requestObject = (0, _triggers.getRequestObject)(undefined, req.auth, updatedObject, originalObject || user, req.config);
423
+ // Perform validation as step-by-step pipeline for better error consistency
462
424
  // and also to avoid to trigger a provider (like OTP SMS) if another one fails
463
-
464
425
  const acc = {
465
426
  authData: {},
466
427
  authDataResponse: {}
467
428
  };
468
429
  const authKeys = Object.keys(authData).sort();
469
-
470
430
  for (const provider of authKeys) {
471
431
  let method = '';
472
-
473
432
  try {
474
433
  if (authData[provider] === null) {
475
434
  acc.authData[provider] = null;
476
435
  continue;
477
436
  }
478
-
479
437
  const {
480
438
  validator
481
439
  } = req.config.authDataManager.getValidatorForProvider(provider);
482
440
  const authProvider = (req.config.auth || {})[provider] || {};
483
-
484
441
  if (authProvider.enabled == null) {
485
442
  _Deprecator.default.logRuntimeDeprecation({
486
- usage: `auth.${provider}`,
487
- solution: `auth.${provider}.enabled: true`
443
+ usage: `Using the authentication adapter "${provider}" without explicitly enabling it`,
444
+ solution: `Enable the authentication adapter by setting the Parse Server option "auth.${provider}.enabled: true".`
488
445
  });
489
446
  }
490
-
491
447
  if (!validator || authProvider.enabled === false) {
492
448
  throw new Parse.Error(Parse.Error.UNSUPPORTED_SERVICE, 'This authentication method is unsupported.');
493
449
  }
494
-
495
450
  let validationResult = await validator(authData[provider], req, user, requestObject);
496
451
  method = validationResult && validationResult.method;
497
452
  requestObject.triggerName = method;
498
-
499
453
  if (validationResult && validationResult.validator) {
500
454
  validationResult = await validationResult.validator();
501
455
  }
502
-
503
456
  if (!validationResult) {
504
457
  acc.authData[provider] = authData[provider];
505
458
  continue;
506
459
  }
507
-
508
460
  if (!Object.keys(validationResult).length) {
509
461
  acc.authData[provider] = authData[provider];
510
462
  continue;
511
463
  }
512
-
513
464
  if (validationResult.response) {
514
465
  acc.authDataResponse[provider] = validationResult.response;
515
- } // Some auth providers after initialization will avoid to replace authData already stored
516
-
517
-
466
+ }
467
+ // Some auth providers after initialization will avoid to replace authData already stored
518
468
  if (!validationResult.doNotSave) {
519
469
  acc.authData[provider] = validationResult.save || authData[provider];
520
470
  }
@@ -524,24 +474,21 @@ const handleAuthDataValidation = async (authData, req, foundUser) => {
524
474
  message: 'Auth failed. Unknown error.'
525
475
  });
526
476
  const userString = req.auth && req.auth.user ? req.auth.user.id : req.data.objectId || undefined;
527
-
528
477
  _logger.logger.error(`Failed running auth step ${method} for ${provider} for user ${userString} with Error: ` + JSON.stringify(e), {
529
478
  authenticationStep: method,
530
479
  error: e,
531
480
  user: userString,
532
481
  provider
533
482
  });
534
-
535
483
  throw e;
536
484
  }
537
485
  }
538
-
539
486
  return acc;
540
487
  };
541
-
542
488
  module.exports = {
543
489
  Auth,
544
490
  master,
491
+ maintenance,
545
492
  nobody,
546
493
  readOnly,
547
494
  getAuthForSessionToken,
@@ -551,4 +498,4 @@ module.exports = {
551
498
  checkIfUserHasProvidedConfiguredProvidersForLogin,
552
499
  handleAuthDataValidation
553
500
  };
554
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9BdXRoLmpzIl0sIm5hbWVzIjpbIlBhcnNlIiwicmVxdWlyZSIsIkF1dGgiLCJjb25maWciLCJjYWNoZUNvbnRyb2xsZXIiLCJ1bmRlZmluZWQiLCJpc01hc3RlciIsImlzUmVhZE9ubHkiLCJ1c2VyIiwiaW5zdGFsbGF0aW9uSWQiLCJ1c2VyUm9sZXMiLCJmZXRjaGVkUm9sZXMiLCJyb2xlUHJvbWlzZSIsInByb3RvdHlwZSIsImlzVW5hdXRoZW50aWNhdGVkIiwibWFzdGVyIiwicmVhZE9ubHkiLCJub2JvZHkiLCJnZXRBdXRoRm9yU2Vzc2lvblRva2VuIiwic2Vzc2lvblRva2VuIiwidXNlckpTT04iLCJnZXQiLCJjYWNoZWRVc2VyIiwiT2JqZWN0IiwiZnJvbUpTT04iLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlc3VsdHMiLCJyZXN0T3B0aW9ucyIsImxpbWl0IiwiaW5jbHVkZSIsIlJlc3RRdWVyeSIsInF1ZXJ5IiwiZXhlY3V0ZSIsIlF1ZXJ5IiwiU2Vzc2lvbiIsImVxdWFsVG8iLCJmaW5kIiwidXNlTWFzdGVyS2V5IiwibWFwIiwib2JqIiwidG9KU09OIiwibGVuZ3RoIiwiRXJyb3IiLCJJTlZBTElEX1NFU1NJT05fVE9LRU4iLCJub3ciLCJEYXRlIiwiZXhwaXJlc0F0IiwiaXNvIiwicGFzc3dvcmQiLCJwdXQiLCJ1c2VyT2JqZWN0IiwiZ2V0QXV0aEZvckxlZ2FjeVNlc3Npb25Ub2tlbiIsInRoZW4iLCJyZXNwb25zZSIsImNsYXNzTmFtZSIsImdldFVzZXJSb2xlcyIsIl9sb2FkUm9sZXMiLCJnZXRSb2xlc0ZvclVzZXIiLCJyZXN0V2hlcmUiLCJ1c2VycyIsIl9fdHlwZSIsIm9iamVjdElkIiwiaWQiLCJlYWNoIiwicmVzdWx0IiwicHVzaCIsIlJvbGUiLCJjYWNoZWRSb2xlcyIsInJvbGUiLCJjYWNoZVJvbGVzIiwicm9sZXNNYXAiLCJyZWR1Y2UiLCJtIiwiciIsIm5hbWVzIiwibmFtZSIsImlkcyIsInJvbGVOYW1lcyIsIl9nZXRBbGxSb2xlc05hbWVzRm9yUm9sZUlkcyIsIkFycmF5IiwiY2xlYXJSb2xlQ2FjaGUiLCJkZWwiLCJnZXRSb2xlc0J5SWRzIiwiaW5zIiwiY29udGFpbmVkSW4iLCJyb2xlcyIsIiRpbiIsInJvbGVJRHMiLCJxdWVyaWVkUm9sZXMiLCJmaWx0ZXIiLCJyb2xlSUQiLCJ3YXNRdWVyaWVkIiwiU2V0IiwicmVzdWx0TWFwIiwibWVtbyIsImNvbmNhdCIsImZpbmRVc2Vyc1dpdGhBdXRoRGF0YSIsImF1dGhEYXRhIiwicHJvdmlkZXJzIiwia2V5cyIsInByb3ZpZGVyIiwicXVlcnlLZXkiLCJxIiwiZGF0YWJhc2UiLCIkb3IiLCJoYXNNdXRhdGVkQXV0aERhdGEiLCJ1c2VyQXV0aERhdGEiLCJtdXRhdGVkQXV0aERhdGEiLCJmb3JFYWNoIiwicHJvdmlkZXJEYXRhIiwidXNlclByb3ZpZGVyQXV0aERhdGEiLCJjaGVja0lmVXNlckhhc1Byb3ZpZGVkQ29uZmlndXJlZFByb3ZpZGVyc0ZvckxvZ2luIiwic2F2ZWRVc2VyUHJvdmlkZXJzIiwiYWRhcHRlciIsImF1dGhEYXRhTWFuYWdlciIsImdldFZhbGlkYXRvckZvclByb3ZpZGVyIiwiaGFzUHJvdmlkZWRBU29sb1Byb3ZpZGVyIiwic29tZSIsInBvbGljeSIsImFkZGl0aW9uUHJvdmlkZXJzTm90Rm91bmQiLCJoYXNQcm92aWRlZEF0TGVhc3RPbmVBZGRpdGlvbmFsUHJvdmlkZXIiLCJPVEhFUl9DQVVTRSIsImpvaW4iLCJoYW5kbGVBdXRoRGF0YVZhbGlkYXRpb24iLCJyZXEiLCJmb3VuZFVzZXIiLCJVc2VyIiwiYXV0aCIsImdldFVzZXJJZCIsImZldGNoIiwib3JpZ2luYWxPYmplY3QiLCJ1cGRhdGVkT2JqZWN0IiwiYnVpbGRQYXJzZU9iamVjdHMiLCJyZXF1ZXN0T2JqZWN0IiwiYWNjIiwiYXV0aERhdGFSZXNwb25zZSIsImF1dGhLZXlzIiwic29ydCIsIm1ldGhvZCIsInZhbGlkYXRvciIsImF1dGhQcm92aWRlciIsImVuYWJsZWQiLCJEZXByZWNhdG9yIiwibG9nUnVudGltZURlcHJlY2F0aW9uIiwidXNhZ2UiLCJzb2x1dGlvbiIsIlVOU1VQUE9SVEVEX1NFUlZJQ0UiLCJ2YWxpZGF0aW9uUmVzdWx0IiwidHJpZ2dlck5hbWUiLCJkb05vdFNhdmUiLCJzYXZlIiwiZXJyIiwiZSIsImNvZGUiLCJTQ1JJUFRfRkFJTEVEIiwibWVzc2FnZSIsInVzZXJTdHJpbmciLCJkYXRhIiwibG9nZ2VyIiwiZXJyb3IiLCJKU09OIiwic3RyaW5naWZ5IiwiYXV0aGVudGljYXRpb25TdGVwIiwibW9kdWxlIiwiZXhwb3J0cyJdLCJtYXBwaW5ncyI6Ijs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7Ozs7Ozs7OztBQUpBLE1BQU1BLEtBQUssR0FBR0MsT0FBTyxDQUFDLFlBQUQsQ0FBckI7O0FBTUE7QUFDQTtBQUNBO0FBQ0EsU0FBU0MsSUFBVCxDQUFjO0FBQ1pDLEVBQUFBLE1BRFk7QUFFWkMsRUFBQUEsZUFBZSxHQUFHQyxTQUZOO0FBR1pDLEVBQUFBLFFBQVEsR0FBRyxLQUhDO0FBSVpDLEVBQUFBLFVBQVUsR0FBRyxLQUpEO0FBS1pDLEVBQUFBLElBTFk7QUFNWkMsRUFBQUE7QUFOWSxDQUFkLEVBT0c7QUFDRCxPQUFLTixNQUFMLEdBQWNBLE1BQWQ7QUFDQSxPQUFLQyxlQUFMLEdBQXVCQSxlQUFlLElBQUtELE1BQU0sSUFBSUEsTUFBTSxDQUFDQyxlQUE1RDtBQUNBLE9BQUtLLGNBQUwsR0FBc0JBLGNBQXRCO0FBQ0EsT0FBS0gsUUFBTCxHQUFnQkEsUUFBaEI7QUFDQSxPQUFLRSxJQUFMLEdBQVlBLElBQVo7QUFDQSxPQUFLRCxVQUFMLEdBQWtCQSxVQUFsQixDQU5DLENBUUQ7QUFDQTs7QUFDQSxPQUFLRyxTQUFMLEdBQWlCLEVBQWpCO0FBQ0EsT0FBS0MsWUFBTCxHQUFvQixLQUFwQjtBQUNBLE9BQUtDLFdBQUwsR0FBbUIsSUFBbkI7QUFDRCxDLENBRUQ7QUFDQTs7O0FBQ0FWLElBQUksQ0FBQ1csU0FBTCxDQUFlQyxpQkFBZixHQUFtQyxZQUFZ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QUFTeEgsSUFBVCxDQUFjdUQsRUFBMUMsR0FBK0M4RCxHQUFHLENBQUNpQyxJQUFKLENBQVNoRyxRQUFULElBQXFCekQsU0FEdEU7O0FBRUEwSixxQkFBT0MsS0FBUCxDQUNHLDRCQUEyQnJCLE1BQU8sUUFBT3RDLFFBQVMsYUFBWXdELFVBQVcsZUFBMUUsR0FDRUksSUFBSSxDQUFDQyxTQUFMLENBQWVULENBQWYsQ0FGSixFQUdFO0FBQ0VVLFFBQUFBLGtCQUFrQixFQUFFeEIsTUFEdEI7QUFFRXFCLFFBQUFBLEtBQUssRUFBRVAsQ0FGVDtBQUdFakosUUFBQUEsSUFBSSxFQUFFcUosVUFIUjtBQUlFeEQsUUFBQUE7QUFKRixPQUhGOztBQVVBLFlBQU1vRCxDQUFOO0FBQ0Q7QUFDRjs7QUFDRCxTQUFPbEIsR0FBUDtBQUNELENBN0ZEOztBQStGQTZCLE1BQU0sQ0FBQ0MsT0FBUCxHQUFpQjtBQUNmbkssRUFBQUEsSUFEZTtBQUVmYSxFQUFBQSxNQUZlO0FBR2ZFLEVBQUFBLE1BSGU7QUFJZkQsRUFBQUEsUUFKZTtBQUtmRSxFQUFBQSxzQkFMZTtBQU1ma0MsRUFBQUEsNEJBTmU7QUFPZjZDLEVBQUFBLHFCQVBlO0FBUWZTLEVBQUFBLGtCQVJlO0FBU2ZNLEVBQUFBLGlEQVRlO0FBVWZZLEVBQUFBO0FBVmUsQ0FBakIiLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBQYXJzZSA9IHJlcXVpcmUoJ3BhcnNlL25vZGUnKTtcbmltcG9ydCB7IGlzRGVlcFN0cmljdEVxdWFsIH0gZnJvbSAndXRpbCc7XG5pbXBvcnQgeyBnZXRSZXF1ZXN0T2JqZWN0LCByZXNvbHZlRXJyb3IgfSBmcm9tICcuL3RyaWdnZXJzJztcbmltcG9ydCBEZXByZWNhdG9yIGZyb20gJy4vRGVwcmVjYXRvci9EZXByZWNhdG9yJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4vbG9nZ2VyJztcblxuLy8gQW4gQXV0aCBvYmplY3QgdGVsbHMgeW91IHdobyBpcyByZXF1ZXN0aW5nIHNvbWV0aGluZyBhbmQgd2hldGhlclxuLy8gdGhlIG1hc3RlciBrZXkgd2FzIHVzZWQuXG4vLyB1c2VyT2JqZWN0IGlzIGEgUGFyc2UuVXNlciBhbmQgY2FuIGJlIG51bGwgaWYgdGhlcmUncyBubyB1c2VyLlxuZnVuY3Rpb24gQXV0aCh7XG4gIGNvbmZpZyxcbiAgY2FjaGVDb250cm9sbGVyID0gdW5kZWZpbmVkLFxuICBpc01hc3RlciA9IGZhbHNlLFxuICBpc1JlYWRPbmx5ID0gZmFsc2UsXG4gIHVzZXIsXG4gIGluc3RhbGxhdGlvbklkLFxufSkge1xuICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcbiAgdGhpcy5jYWNoZUNvbnRyb2xsZXIgPSBjYWNoZUNvbnRyb2xsZXIgfHwgKGNvbmZpZyAmJiBjb25maWcuY2FjaGVDb250cm9sbGVyKTtcbiAgdGhpcy5pbnN0YWxsYXRpb25JZCA9IGluc3RhbGxhdGlvbklkO1xuICB0aGlzLmlzTWFzdGVyID0gaXNNYXN0ZXI7XG4gIHRoaXMudXNlciA9IHVzZXI7XG4gIHRoaXMuaXNSZWFkT25seSA9IGlzUmVhZE9ubHk7XG5cbiAgLy8gQXNzdW1pbmcgYSB1c2VycyByb2xlcyB3b24ndCBjaGFuZ2UgZHVyaW5nIGEgc2luZ2xlIHJlcXVlc3QsIHdlJ2xsXG4gIC8vIG9ubHkgbG9hZCB0aGVtIG9uY2UuXG4gIHRoaXMudXNlclJvbGVzID0gW107XG4gIHRoaXMuZmV0Y2hlZFJvbGVzID0gZmFsc2U7XG4gIHRoaXMucm9sZVByb21pc2UgPSBudWxsO1xufVxuXG4vLyBXaGV0aGVyIHRoaXMgYXV0aCBjb3VsZCBwb3NzaWJseSBtb2RpZnkgdGhlIGdpdmVuIHVzZXIgaWQuXG4vLyBJdCBzdGlsbCBjb3VsZCBiZSBmb3JiaWRkZW4gdmlhIEFDTHMgZXZlbiBpZiB0aGlzIHJldHVybnMgdHJ1ZS5cbkF1dGgucHJvdG90eXBlLmlzVW5hdXRoZW50aWNhdGVkID0gZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy5pc01hc3Rlcikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAodGhpcy51c2VyKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB0cnVlO1xufTtcblxuLy8gQSBoZWxwZXIgdG8gZ2V0IGEgbWFzdGVyLWxldmVsIEF1dGggb2JqZWN0XG5mdW5jdGlvbiBtYXN0ZXIoY29uZmlnKSB7XG4gIHJldHVybiBuZXcgQXV0aCh7IGNvbmZpZywgaXNNYXN0ZXI6IHRydWUgfSk7XG59XG5cbi8vIEEgaGVscGVyIHRvIGdldCBhIG1hc3Rlci1sZXZlbCBBdXRoIG9iamVjdFxuZnVuY3Rpb24gcmVhZE9ubHkoY29uZmlnKSB7XG4gIHJldHVybiBuZXcgQXV0aCh7IGNvbmZpZywgaXNNYXN0ZXI6IHRydWUsIGlzUmVhZE9ubHk6IHRydWUgfSk7XG59XG5cbi8vIEEgaGVscGVyIHRvIGdldCBhIG5vYm9keS1sZXZlbCBBdXRoIG9iamVjdFxuZnVuY3Rpb24gbm9ib2R5KGNvbmZpZykge1xuICByZXR1cm4gbmV3IEF1dGgoeyBjb25maWcsIGlzTWFzdGVyOiBmYWxzZSB9KTtcbn1cblxuLy8gUmV0dXJucyBhIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhbiBBdXRoIG9iamVjdFxuY29uc3QgZ2V0QXV0aEZvclNlc3Npb25Ub2tlbiA9IGFzeW5jIGZ1bmN0aW9uICh7XG4gIGNvbmZpZyxcbiAgY2FjaGVDb250cm9sbGVyLFxuICBzZXNzaW9uVG9rZW4sXG4gIGluc3RhbGxhdGlvbklkLFxufSkge1xuICBjYWNoZUNvbnRyb2xsZXIgPSBjYWNoZUNvbnRyb2xsZXIgfHwgKGNvbmZpZyAmJiBjb25maWcuY2FjaGVDb250cm9sbGVyKTtcbiAgaWYgKGNhY2hlQ29udHJvbGxlcikge1xuICAgIGNvbnN0IHVzZXJKU09OID0gYXdhaXQgY2FjaGVDb250cm9sbGVyLnVzZXIuZ2V0KHNlc3Npb25Ub2tlbik7XG4gICAgaWYgKHVzZXJKU09OKSB7XG4gICAgICBjb25zdCBjYWNoZWRVc2VyID0gUGFyc2UuT2JqZWN0LmZyb21KU09OKHVzZXJKU09OKTtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoXG4gICAgICAgIG5ldyBBdXRoKHtcbiAgICAgICAgICBjb25maWcsXG4gICAgICAgICAgY2FjaGVDb250cm9sbGVyLFxuICAgICAgICAgIGlzTWFzdGVyOiBmYWxzZSxcbiAgICAgICAgICBpbnN0YWxsYXRpb25JZCxcbiAgICAgICAgICB1c2VyOiBjYWNoZWRVc2VyLFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBsZXQgcmVzdWx0cztcbiAgaWYgKGNvbmZpZykge1xuICAgIGNvbnN0IHJlc3RPcHRpb25zID0ge1xuICAgICAgbGltaXQ6IDEsXG4gICAgICBpbmNsdWRlOiAndXNlcicsXG4gICAgfTtcbiAgICBjb25zdCBSZXN0UXVlcnkgPSByZXF1aXJlKCcuL1Jlc3RRdWVyeScpO1xuICAgIGNvbnN0IHF1ZXJ5ID0gbmV3IFJlc3RRdWVyeShjb25maWcsIG1hc3Rlcihjb25maWcpLCAnX1Nlc3Npb24nLCB7IHNlc3Npb25Ub2tlbiB9LCByZXN0T3B0aW9ucyk7XG4gICAgcmVzdWx0cyA9IChhd2FpdCBxdWVyeS5leGVjdXRlKCkpLnJlc3VsdHM7XG4gIH0gZWxzZSB7XG4gICAgcmVzdWx0cyA9IChcbiAgICAgIGF3YWl0IG5ldyBQYXJzZS5RdWVyeShQYXJzZS5TZXNzaW9uKVxuICAgICAgICAubGltaXQoMSlcbiAgICAgICAgLmluY2x1ZGUoJ3VzZXInKVxuICAgICAgICAuZXF1YWxUbygnc2Vzc2lvblRva2VuJywgc2Vzc2lvblRva2VuKVxuICAgICAgICAuZmluZCh7IHVzZU1hc3RlcktleTogdHJ1ZSB9KVxuICAgICkubWFwKG9iaiA9PiBvYmoudG9KU09OKCkpO1xuICB9XG5cbiAgaWYgKHJlc3VsdHMubGVuZ3RoICE9PSAxIHx8ICFyZXN1bHRzWzBdWyd1c2VyJ10pIHtcbiAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuSU5WQUxJRF9TRVNTSU9OX1RPS0VOLCAnSW52YWxpZCBzZXNzaW9uIHRva2VuJyk7XG4gIH1cbiAgY29uc3Qgbm93ID0gbmV3IERhdGUoKSxcbiAgICBleHBpcmVzQXQgPSByZXN1bHRzWzBdLmV4cGlyZXNBdCA/IG5ldyBEYXRlKHJlc3VsdHNbMF0uZXhwaXJlc0F0LmlzbykgOiB1bmRlZmluZWQ7XG4gIGlmIChleHBpcmVzQXQgPCBub3cpIHtcbiAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuSU5WQUxJRF9TRVNTSU9OX1RPS0VOLCAnU2Vzc2lvbiB0b2tlbiBpcyBleHBpcmVkLicpO1xuICB9XG4gIGNvbnN0IG9iaiA9IHJlc3VsdHNbMF1bJ3VzZXInXTtcbiAgZGVsZXRlIG9iai5wYXNzd29yZDtcbiAgb2JqWydjbGFzc05hbWUnXSA9ICdfVXNlcic7XG4gIG9ialsnc2Vzc2lvblRva2VuJ10gPSBzZXNzaW9uVG9rZW47XG4gIGlmIChjYWNoZUNvbnRyb2xsZXIpIHtcbiAgICBjYWNoZUNvbnRyb2xsZXIudXNlci5wdXQoc2Vzc2lvblRva2VuLCBvYmopO1xuICB9XG4gIGNvbnN0IHVzZXJPYmplY3QgPSBQYXJzZS5PYmplY3QuZnJvbUpTT04ob2JqKTtcbiAgcmV0dXJuIG5ldyBBdXRoKHtcbiAgICBjb25maWcsXG4gICAgY2FjaGVDb250cm9sbGVyLFxuICAgIGlzTWFzdGVyOiBmYWxzZSxcbiAgICBpbnN0YWxsYXRpb25JZCxcbiAgICB1c2VyOiB1c2VyT2JqZWN0LFxuICB9KTtcbn07XG5cbnZhciBnZXRBdXRoRm9yTGVnYWN5U2Vzc2lvblRva2VuID0gZnVuY3Rpb24gKHsgY29uZmlnLCBzZXNzaW9uVG9rZW4sIGluc3RhbGxhdGlvbklkIH0pIHtcbiAgdmFyIHJlc3RPcHRpb25zID0ge1xuICAgIGxpbWl0OiAxLFxuICB9O1xuICBjb25zdCBSZXN0UXVlcnkgPSByZXF1aXJlKCcuL1Jlc3RRdWVyeScpO1xuICB2YXIgcXVlcnkgPSBuZXcgUmVzdFF1ZXJ5KGNvbmZpZywgbWFzdGVyKGNvbmZpZyksICdfVXNlcicsIHsgc2Vzc2lvblRva2VuIH0sIHJlc3RPcHRpb25zKTtcbiAgcmV0dXJuIHF1ZXJ5LmV4ZWN1dGUoKS50aGVuKHJlc3BvbnNlID0+IHtcbiAgICB2YXIgcmVzdWx0cyA9IHJlc3BvbnNlLnJlc3VsdHM7XG4gICAgaWYgKHJlc3VsdHMubGVuZ3RoICE9PSAxKSB7XG4gICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuSU5WQUxJRF9TRVNTSU9OX1RPS0VOLCAnaW52YWxpZCBsZWdhY3kgc2Vzc2lvbiB0b2tlbicpO1xuICAgIH1cbiAgICBjb25zdCBvYmogPSByZXN1bHRzWzBdO1xuICAgIG9iai5jbGFzc05hbWUgPSAnX1VzZXInO1xuICAgIGNvbnN0IHVzZXJPYmplY3QgPSBQYXJzZS5PYmplY3QuZnJvbUpTT04ob2JqKTtcbiAgICByZXR1cm4gbmV3IEF1dGgoe1xuICAgICAgY29uZmlnLFxuICAgICAgaXNNYXN0ZXI6IGZhbHNlLFxuICAgICAgaW5zdGFsbGF0aW9uSWQsXG4gICAgICB1c2VyOiB1c2VyT2JqZWN0LFxuICAgIH0pO1xuICB9KTtcbn07XG5cbi8vIFJldHVybnMgYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYW4gYXJyYXkgb2Ygcm9sZSBuYW1lc1xuQXV0aC5wcm90b3R5cGUuZ2V0VXNlclJvbGVzID0gZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy5pc01hc3RlciB8fCAhdGhpcy51c2VyKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShbXSk7XG4gIH1cbiAgaWYgKHRoaXMuZmV0Y2hlZFJvbGVzKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLnVzZXJSb2xlcyk7XG4gIH1cbiAgaWYgKHRoaXMucm9sZVByb21pc2UpIHtcbiAgICByZXR1cm4gdGhpcy5yb2xlUHJvbWlzZTtcbiAgfVxuICB0aGlzLnJvbGVQcm9taXNlID0gdGhpcy5fbG9hZFJvbGVzKCk7XG4gIHJldHVybiB0aGlzLnJvbGVQcm9taXNlO1xufTtcblxuQXV0aC5wcm90b3R5cGUuZ2V0Um9sZXNGb3JVc2VyID0gYXN5bmMgZnVuY3Rpb24gKCkge1xuICAvL1N0YWNrIGFsbCBQYXJzZS5Sb2xlXG4gIGNvbnN0IHJlc3VsdHMgPSBbXTtcbiAgaWYgKHRoaXMuY29uZmlnKSB7XG4gICAgY29uc3QgcmVzdFdoZXJlID0ge1xuICAgICAgdXNlcnM6IHtcbiAgICAgICAgX190eXBlOiAnUG9pbnRlcicsXG4gICAgICAgIGNsYXNzTmFtZTogJ19Vc2VyJyxcbiAgICAgICAgb2JqZWN0SWQ6IHRoaXMudXNlci5pZCxcbiAgICAgIH0sXG4gICAgfTtcbiAgICBjb25zdCBSZXN0UXVlcnkgPSByZXF1aXJlKCcuL1Jlc3RRdWVyeScpO1xuICAgIGF3YWl0IG5ldyBSZXN0UXVlcnkodGhpcy5jb25maWcsIG1hc3Rlcih0aGlzLmNvbmZpZyksICdfUm9sZScsIHJlc3RXaGVyZSwge30pLmVhY2gocmVzdWx0ID0+XG4gICAgICByZXN1bHRzLnB1c2gocmVzdWx0KVxuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgYXdhaXQgbmV3IFBhcnNlLlF1ZXJ5KFBhcnNlLlJvbGUpXG4gICAgICAuZXF1YWxUbygndXNlcnMnLCB0aGlzLnVzZXIpXG4gICAgICAuZWFjaChyZXN1bHQgPT4gcmVzdWx0cy5wdXNoKHJlc3VsdC50b0pTT04oKSksIHsgdXNlTWFzdGVyS2V5OiB0cnVlIH0pO1xuICB9XG4gIHJldHVybiByZXN1bHRzO1xufTtcblxuLy8gSXRlcmF0ZXMgdGhyb3VnaCB0aGUgcm9sZSB0cmVlIGFuZCBjb21waWxlcyBhIHVzZXIncyByb2xlc1xuQXV0aC5wcm90b3R5cGUuX2xvYWRSb2xlcyA9IGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgaWYgKHRoaXMuY2FjaGVDb250cm9sbGVyKSB7XG4gICAgY29uc3QgY2FjaGVkUm9sZXMgPSBhd2FpdCB0aGlzLmNhY2hlQ29udHJvbGxlci5yb2xlLmdldCh0aGlzLnVzZXIuaWQpO1xuICAgIGlmIChjYWNoZWRSb2xlcyAhPSBudWxsKSB7XG4gICAgICB0aGlzLmZldGNoZWRSb2xlcyA9IHRydWU7XG4gICAgICB0aGlzLnVzZXJSb2xlcyA9IGNhY2hlZFJvbGVzO1xuICAgICAgcmV0dXJuIGNhY2hlZFJvbGVzO1xuICAgIH1cbiAgfVxuXG4gIC8vIEZpcnN0IGdldCB0aGUgcm9sZSBpZHMgdGhpcyB1c2VyIGlzIGRpcmVjdGx5IGEgbWVtYmVyIG9mXG4gIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCB0aGlzLmdldFJvbGVzRm9yVXNlcigpO1xuICBpZiAoIXJlc3VsdHMubGVuZ3RoKSB7XG4gICAgdGhpcy51c2VyUm9sZXMgPSBbXTtcbiAgICB0aGlzLmZldGNoZWRSb2xlcyA9IHRydWU7XG4gICAgdGhpcy5yb2xlUHJvbWlzZSA9IG51bGw7XG5cbiAgICB0aGlzLmNhY2hlUm9sZXMoKTtcbiAgICByZXR1cm4gdGhpcy51c2VyUm9sZXM7XG4gIH1cblxuICBjb25zdCByb2xlc01hcCA9IHJlc3VsdHMucmVkdWNlKFxuICAgIChtLCByKSA9PiB7XG4gICAgICBtLm5hbWVzLnB1c2goci5uYW1lKTtcbiAgICAgIG0uaWRzLnB1c2goci5vYmplY3RJZCk7XG4gICAgICByZXR1cm4gbTtcbiAgICB9LFxuICAgIHsgaWRzOiBbXSwgbmFtZXM6IFtdIH1cbiAgKTtcblxuICAvLyBydW4gdGhlIHJlY3Vyc2l2ZSBmaW5kaW5nXG4gIGNvbnN0IHJvbGVOYW1lcyA9IGF3YWl0IHRoaXMuX2dldEFsbFJvbGVzTmFtZXNGb3JSb2xlSWRzKHJvbGVzTWFwLmlkcywgcm9sZXNNYXAubmFtZXMpO1xuICB0aGlzLnVzZXJSb2xlcyA9IHJvbGVOYW1lcy5tYXAociA9PiB7XG4gICAgcmV0dXJuICdyb2xlOicgKyByO1xuICB9KTtcbiAgdGhpcy5mZXRjaGVkUm9sZXMgPSB0cnVlO1xuICB0aGlzLnJvbGVQcm9taXNlID0gbnVsbDtcbiAgdGhpcy5jYWNoZVJvbGVzKCk7XG4gIHJldHVybiB0aGlzLnVzZXJSb2xlcztcbn07XG5cbkF1dGgucHJvdG90eXBlLmNhY2hlUm9sZXMgPSBmdW5jdGlvbiAoKSB7XG4gIGlmICghdGhpcy5jYWNoZUNvbnRyb2xsZXIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdGhpcy5jYWNoZUNvbnRyb2xsZXIucm9sZS5wdXQodGhpcy51c2VyLmlkLCBBcnJheSguLi50aGlzLnVzZXJSb2xlcykpO1xuICByZXR1cm4gdHJ1ZTtcbn07XG5cbkF1dGgucHJvdG90eXBlLmNsZWFyUm9sZUNhY2hlID0gZnVuY3Rpb24gKHNlc3Npb25Ub2tlbikge1xuICBpZiAoIXRoaXMuY2FjaGVDb250cm9sbGVyKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHRoaXMuY2FjaGVDb250cm9sbGVyLnJvbGUuZGVsKHRoaXMudXNlci5pZCk7XG4gIHRoaXMuY2FjaGVDb250cm9sbGVyLnVzZXIuZGVsKHNlc3Npb25Ub2tlbik7XG4gIHJldHVybiB0cnVlO1xufTtcblxuQXV0aC5wcm90b3R5cGUuZ2V0Um9sZXNCeUlkcyA9IGFzeW5jIGZ1bmN0aW9uIChpbnMpIHtcbiAgY29uc3QgcmVzdWx0cyA9IFtdO1xuICAvLyBCdWlsZCBhbiBPUiBxdWVyeSBhY3Jvc3MgYWxsIHBhcmVudFJvbGVzXG4gIGlmICghdGhpcy5jb25maWcpIHtcbiAgICBhd2FpdCBuZXcgUGFyc2UuUXVlcnkoUGFyc2UuUm9sZSlcbiAgICAgIC5jb250YWluZWRJbihcbiAgICAgICAgJ3JvbGVzJyxcbiAgICAgICAgaW5zLm1hcChpZCA9PiB7XG4gICAgICAgICAgY29uc3Qgcm9sZSA9IG5ldyBQYXJzZS5PYmplY3QoUGFyc2UuUm9sZSk7XG4gICAgICAgICAgcm9sZS5pZCA9IGlkO1xuICAgICAgICAgIHJldHVybiByb2xlO1xuICAgICAgICB9KVxuICAgICAgKVxuICAgICAgLmVhY2gocmVzdWx0ID0+IHJlc3VsdHMucHVzaChyZXN1bHQudG9KU09OKCkpLCB7IHVzZU1hc3RlcktleTogdHJ1ZSB9KTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCByb2xlcyA9IGlucy5tYXAoaWQgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgX190eXBlOiAnUG9pbnRlcicsXG4gICAgICAgIGNsYXNzTmFtZTogJ19Sb2xlJyxcbiAgICAgICAgb2JqZWN0SWQ6IGlkLFxuICAgICAgfTtcbiAgICB9KTtcbiAgICBjb25zdCByZXN0V2hlcmUgPSB7IHJvbGVzOiB7ICRpbjogcm9sZXMgfSB9O1xuICAgIGNvbnN0IFJlc3RRdWVyeSA9IHJlcXVpcmUoJy4vUmVzdFF1ZXJ5Jyk7XG4gICAgYXdhaXQgbmV3IFJlc3RRdWVyeSh0aGlzLmNvbmZpZywgbWFzdGVyKHRoaXMuY29uZmlnKSwgJ19Sb2xlJywgcmVzdFdoZXJlLCB7fSkuZWFjaChyZXN1bHQgPT5cbiAgICAgIHJlc3VsdHMucHVzaChyZXN1bHQpXG4gICAgKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0cztcbn07XG5cbi8vIEdpdmVuIGEgbGlzdCBvZiByb2xlSWRzLCBmaW5kIGFsbCB0aGUgcGFyZW50IHJvbGVzLCByZXR1cm5zIGEgcHJvbWlzZSB3aXRoIGFsbCBuYW1lc1xuQXV0aC5wcm90b3R5cGUuX2dldEFsbFJvbGVzTmFtZXNGb3JSb2xlSWRzID0gZnVuY3Rpb24gKHJvbGVJRHMsIG5hbWVzID0gW10sIHF1ZXJpZWRSb2xlcyA9IHt9KSB7XG4gIGNvbnN0IGlucyA9IHJvbGVJRHMuZmlsdGVyKHJvbGVJRCA9PiB7XG4gICAgY29uc3Qgd2FzUXVlcmllZCA9IHF1ZXJpZWRSb2xlc1tyb2xlSURdICE9PSB0cnVlO1xuICAgIHF1ZXJpZWRSb2xlc1tyb2xlSURdID0gdHJ1ZTtcbiAgICByZXR1cm4gd2FzUXVlcmllZDtcbiAgfSk7XG5cbiAgLy8gYWxsIHJvbGVzIGFyZSBhY2NvdW50ZWQgZm9yLCByZXR1cm4gdGhlIG5hbWVzXG4gIGlmIChpbnMubGVuZ3RoID09IDApIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFsuLi5uZXcgU2V0KG5hbWVzKV0pO1xuICB9XG5cbiAgcmV0dXJuIHRoaXMuZ2V0Um9sZXNCeUlkcyhpbnMpXG4gICAgLnRoZW4ocmVzdWx0cyA9PiB7XG4gICAgICAvLyBOb3RoaW5nIGZvdW5kXG4gICAgICBpZiAoIXJlc3VsdHMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobmFtZXMpO1xuICAgICAgfVxuICAgICAgLy8gTWFwIHRoZSByZXN1bHRzIHdpdGggYWxsIElkcyBhbmQgbmFtZXNcbiAgICAgIGNvbnN0IHJlc3VsdE1hcCA9IHJlc3VsdHMucmVkdWNlKFxuICAgICAgICAobWVtbywgcm9sZSkgPT4ge1xuICAgICAgICAgIG1lbW8ubmFtZXMucHVzaChyb2xlLm5hbWUpO1xuICAgICAgICAgIG1lbW8uaWRzLnB1c2gocm9sZS5vYmplY3RJZCk7XG4gICAgICAgICAgcmV0dXJuIG1lbW87XG4gICAgICAgIH0sXG4gICAgICAgIHsgaWRzOiBbXSwgbmFtZXM6IFtdIH1cbiAgICAgICk7XG4gICAgICAvLyBzdG9yZSB0aGUgbmV3IGZvdW5kIG5hbWVzXG4gICAgICBuYW1lcyA9IG5hbWVzLmNvbmNhdChyZXN1bHRNYXAubmFtZXMpO1xuICAgICAgLy8gZmluZCB0aGUgbmV4dCBvbmVzLCBjaXJjdWxhciByb2xlcyB3aWxsIGJlIGN1dFxuICAgICAgcmV0dXJuIHRoaXMuX2dldEFsbFJvbGVzTmFtZXNGb3JSb2xlSWRzKHJlc3VsdE1hcC5pZHMsIG5hbWVzLCBxdWVyaWVkUm9sZXMpO1xuICAgIH0pXG4gICAgLnRoZW4obmFtZXMgPT4ge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShbLi4ubmV3IFNldChuYW1lcyldKTtcbiAgICB9KTtcbn07XG5cbmNvbnN0IGZpbmRVc2Vyc1dpdGhBdXRoRGF0YSA9IChjb25maWcsIGF1dGhEYXRhKSA9PiB7XG4gIGNvbnN0IHByb3ZpZGVycyA9IE9iamVjdC5rZXlzKGF1dGhEYXRhKTtcbiAgY29uc3QgcXVlcnkgPSBwcm92aWRlcnNcbiAgICAucmVkdWNlKChtZW1vLCBwcm92aWRlcikgPT4ge1xuICAgICAgaWYgKCFhdXRoRGF0YVtwcm92aWRlcl0gfHwgKGF1dGhEYXRhICYmICFhdXRoRGF0YVtwcm92aWRlcl0uaWQpKSB7XG4gICAgICAgIHJldHVybiBtZW1vO1xuICAgICAgfVxuICAgICAgY29uc3QgcXVlcnlLZXkgPSBgYXV0aERhdGEuJHtwcm92aWRlcn0uaWRgO1xuICAgICAgY29uc3QgcXVlcnkgPSB7fTtcbiAgICAgIHF1ZXJ5W3F1ZXJ5S2V5XSA9IGF1dGhEYXRhW3Byb3ZpZGVyXS5pZDtcbiAgICAgIG1lbW8ucHVzaChxdWVyeSk7XG4gICAgICByZXR1cm4gbWVtbztcbiAgICB9LCBbXSlcbiAgICAuZmlsdGVyKHEgPT4ge1xuICAgICAgcmV0dXJuIHR5cGVvZiBxICE9PSAndW5kZWZpbmVkJztcbiAgICB9KTtcblxuICByZXR1cm4gcXVlcnkubGVuZ3RoID4gMFxuICAgID8gY29uZmlnLmRhdGFiYXNlLmZpbmQoJ19Vc2VyJywgeyAkb3I6IHF1ZXJ5IH0sIHsgbGltaXQ6IDIgfSlcbiAgICA6IFByb21pc2UucmVzb2x2ZShbXSk7XG59O1xuXG5jb25zdCBoYXNNdXRhdGVkQXV0aERhdGEgPSAoYXV0aERhdGEsIHVzZXJBdXRoRGF0YSkgPT4ge1xuICBpZiAoIXVzZXJBdXRoRGF0YSkgcmV0dXJuIHsgaGFzTXV0YXRlZEF1dGhEYXRhOiB0cnVlLCBtdXRhdGVkQXV0aERhdGE6IGF1dGhEYXRhIH07XG4gIGNvbnN0IG11dGF0ZWRBdXRoRGF0YSA9IHt9O1xuICBPYmplY3Qua2V5cyhhdXRoRGF0YSkuZm9yRWFjaChwcm92aWRlciA9PiB7XG4gICAgLy8gQW5vbnltb3VzIHByb3ZpZGVyIGlzIG5vdCBoYW5kbGVkIHRoaXMgd2F5XG4gICAgaWYgKHByb3ZpZGVyID09PSAnYW5vbnltb3VzJykgcmV0dXJuO1xuICAgIGNvbnN0IHByb3ZpZGVyRGF0YSA9IGF1dGhEYXRhW3Byb3ZpZGVyXTtcbiAgICBjb25zdCB1c2VyUHJvdmlkZXJBdXRoRGF0YSA9IHVzZXJBdXRoRGF0YVtwcm92aWRlcl07XG4gICAgaWYgKCFpc0RlZXBTdHJpY3RFcXVhbChwcm92aWRlckRhdGEsIHVzZXJQcm92aWRlckF1dGhEYXRhKSkge1xuICAgICAgbXV0YXRlZEF1dGhEYXRhW3Byb3ZpZGVyXSA9IHByb3ZpZGVyRGF0YTtcbiAgICB9XG4gIH0pO1xuICBjb25zdCBoYXNNdXRhdGVkQXV0aERhdGEgPSBPYmplY3Qua2V5cyhtdXRhdGVkQXV0aERhdGEpLmxlbmd0aCAhPT0gMDtcbiAgcmV0dXJuIHsgaGFzTXV0YXRlZEF1dGhEYXRhLCBtdXRhdGVkQXV0aERhdGEgfTtcbn07XG5cbmNvbnN0IGNoZWNrSWZVc2VySGFzUHJvdmlkZWRDb25maWd1cmVkUHJvdmlkZXJzRm9yTG9naW4gPSAoXG4gIGF1dGhEYXRhID0ge30sXG4gIHVzZXJBdXRoRGF0YSA9IHt9LFxuICBjb25maWdcbikgPT4ge1xuICBjb25zdCBzYXZlZFVzZXJQcm92aWRlcnMgPSBPYmplY3Qua2V5cyh1c2VyQXV0aERhdGEpLm1hcChwcm92aWRlciA9PiAoe1xuICAgIG5hbWU6IHByb3ZpZGVyLFxuICAgIGFkYXB0ZXI6IGNvbmZpZy5hdXRoRGF0YU1hbmFnZXIuZ2V0VmFsaWRhdG9yRm9yUHJvdmlkZXIocHJvdmlkZXIpLmFkYXB0ZXIsXG4gIH0pKTtcblxuICBjb25zdCBoYXNQcm92aWRlZEFTb2xvUHJvdmlkZXIgPSBzYXZlZFVzZXJQcm92aWRlcnMuc29tZShcbiAgICBwcm92aWRlciA9PlxuICAgICAgcHJvdmlkZXIgJiYgcHJvdmlkZXIuYWRhcHRlciAmJiBwcm92aWRlci5hZGFwdGVyLnBvbGljeSA9PT0gJ3NvbG8nICYmIGF1dGhEYXRhW3Byb3ZpZGVyLm5hbWVdXG4gICk7XG5cbiAgLy8gU29sbyBwcm92aWRlcnMgY2FuIGJlIGNvbnNpZGVyZWQgYXMgc2FmZSwgc28gd2UgZG8gbm90IGhhdmUgdG8gY2hlY2sgaWYgdGhlIHVzZXIgbmVlZHNcbiAgLy8gdG8gcHJvdmlkZSBhbiBhZGRpdGlvbmFsIHByb3ZpZGVyIHRvIGxvZ2luLiBBbiBhdXRoIGFkYXB0ZXIgd2l0aCBcInNvbG9cIiAobGlrZSB3ZWJhdXRobikgbWVhbnNcbiAgLy8gbm8gXCJhZGRpdGlvbmFsXCIgYXV0aCBuZWVkcyB0byBiZSBwcm92aWRlZCB0byBsb2dpbiAobGlrZSBPVFAsIE1GQSlcbiAgaWYgKGhhc1Byb3ZpZGVkQVNvbG9Qcm92aWRlcikge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGFkZGl0aW9uUHJvdmlkZXJzTm90Rm91bmQgPSBbXTtcbiAgY29uc3QgaGFzUHJvdmlkZWRBdExlYXN0T25lQWRkaXRpb25hbFByb3ZpZGVyID0gc2F2ZWRVc2VyUHJvdmlkZXJzLnNvbWUocHJvdmlkZXIgPT4ge1xuICAgIGlmIChwcm92aWRlciAmJiBwcm92aWRlci5hZGFwdGVyICYmIHByb3ZpZGVyLmFkYXB0ZXIucG9saWN5ID09PSAnYWRkaXRpb25hbCcpIHtcbiAgICAgIGlmIChhdXRoRGF0YVtwcm92aWRlci5uYW1lXSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFB1c2ggbWlzc2luZyBwcm92aWRlciBmb3IgZXJyb3IgbWVzc2FnZVxuICAgICAgICBhZGRpdGlvblByb3ZpZGVyc05vdEZvdW5kLnB1c2gocHJvdmlkZXIubmFtZSk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbiAgaWYgKGhhc1Byb3ZpZGVkQXRMZWFzdE9uZUFkZGl0aW9uYWxQcm92aWRlciB8fCAhYWRkaXRpb25Qcm92aWRlcnNOb3RGb3VuZC5sZW5ndGgpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoXG4gICAgUGFyc2UuRXJyb3IuT1RIRVJfQ0FVU0UsXG4gICAgYE1pc3NpbmcgYWRkaXRpb25hbCBhdXRoRGF0YSAke2FkZGl0aW9uUHJvdmlkZXJzTm90Rm91bmQuam9pbignLCcpfWBcbiAgKTtcbn07XG5cbi8vIFZhbGlkYXRlIGVhY2ggYXV0aERhdGEgc3RlcC1ieS1zdGVwIGFuZCByZXR1cm4gdGhlIHByb3ZpZGVyIHJlc3BvbnNlc1xuY29uc3QgaGFuZGxlQXV0aERhdGFWYWxpZGF0aW9uID0gYXN5bmMgKGF1dGhEYXRhLCByZXEsIGZvdW5kVXNlcikgPT4ge1xuICBsZXQgdXNlcjtcbiAgaWYgKGZvdW5kVXNlcikge1xuICAgIHVzZXIgPSBQYXJzZS5Vc2VyLmZyb21KU09OKHsgY2xhc3NOYW1lOiAnX1VzZXInLCAuLi5mb3VuZFVzZXIgfSk7XG4gICAgLy8gRmluZCB1c2VyIGJ5IHNlc3Npb24gYW5kIGN1cnJlbnQgb2JqZWN0SWQ7IG9ubHkgcGFzcyB1c2VyIGlmIGl0J3MgdGhlIGN1cnJlbnQgdXNlciBvciBtYXN0ZXIga2V5IGlzIHByb3ZpZGVkXG4gIH0gZWxzZSBpZiAoXG4gICAgKHJlcS5hdXRoICYmXG4gICAgICByZXEuYXV0aC51c2VyICYmXG4gICAgICB0eXBlb2YgcmVxLmdldFVzZXJJZCA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgICAgcmVxLmdldFVzZXJJZCgpID09PSByZXEuYXV0aC51c2VyLmlkKSB8fFxuICAgIChyZXEuYXV0aCAmJiByZXEuYXV0aC5pc01hc3RlciAmJiB0eXBlb2YgcmVxLmdldFVzZXJJZCA9PT0gJ2Z1bmN0aW9uJyAmJiByZXEuZ2V0VXNlcklkKCkpXG4gICkge1xuICAgIHVzZXIgPSBuZXcgUGFyc2UuVXNlcigpO1xuICAgIHVzZXIuaWQgPSByZXEuYXV0aC5pc01hc3RlciA/IHJlcS5nZXRVc2VySWQoKSA6IHJlcS5hdXRoLnVzZXIuaWQ7XG4gICAgYXdhaXQgdXNlci5mZXRjaCh7IHVzZU1hc3RlcktleTogdHJ1ZSB9KTtcbiAgfVxuXG4gIGNvbnN0IHsgb3JpZ2luYWxPYmplY3QsIHVwZGF0ZWRPYmplY3QgfSA9IHJlcS5idWlsZFBhcnNlT2JqZWN0cygpO1xuICBjb25zdCByZXF1ZXN0T2JqZWN0ID0gZ2V0UmVxdWVzdE9iamVjdChcbiAgICB1bmRlZmluZWQsXG4gICAgcmVxLmF1dGgsXG4gICAgdXBkYXRlZE9iamVjdCxcbiAgICBvcmlnaW5hbE9iamVjdCB8fCB1c2VyLFxuICAgIHJlcS5jb25maWdcbiAgKTtcbiAgLy8gUGVyZm9ybSB2YWxpZGF0aW9uIGFzIHN0ZXAtYnktc3RlcCBwaXBlbGluZSBmb3IgYmV0dGVyIGVycm9yIGNvbnNpc3RlbmN5XG4gIC8vIGFuZCBhbHNvIHRvIGF2b2lkIHRvIHRyaWdnZXIgYSBwcm92aWRlciAobGlrZSBPVFAgU01TKSBpZiBhbm90aGVyIG9uZSBmYWlsc1xuICBjb25zdCBhY2MgPSB7IGF1dGhEYXRhOiB7fSwgYXV0aERhdGFSZXNwb25zZToge30gfTtcbiAgY29uc3QgYXV0aEtleXMgPSBPYmplY3Qua2V5cyhhdXRoRGF0YSkuc29ydCgpO1xuICBmb3IgKGNvbnN0IHByb3ZpZGVyIG9mIGF1dGhLZXlzKSB7XG4gICAgbGV0IG1ldGhvZCA9ICcnO1xuICAgIHRyeSB7XG4gICAgICBpZiAoYXV0aERhdGFbcHJvdmlkZXJdID09PSBudWxsKSB7XG4gICAgICAgIGFjYy5hdXRoRGF0YVtwcm92aWRlcl0gPSBudWxsO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHsgdmFsaWRhdG9yIH0gPSByZXEuY29uZmlnLmF1dGhEYXRhTWFuYWdlci5nZXRWYWxpZGF0b3JGb3JQcm92aWRlcihwcm92aWRlcik7XG4gICAgICBjb25zdCBhdXRoUHJvdmlkZXIgPSAocmVxLmNvbmZpZy5hdXRoIHx8IHt9KVtwcm92aWRlcl0gfHwge307XG4gICAgICBpZiAoYXV0aFByb3ZpZGVyLmVuYWJsZWQgPT0gbnVsbCkge1xuICAgICAgICBEZXByZWNhdG9yLmxvZ1J1bnRpbWVEZXByZWNhdGlvbih7XG4gICAgICAgICAgdXNhZ2U6IGBhdXRoLiR7cHJvdmlkZXJ9YCxcbiAgICAgICAgICBzb2x1dGlvbjogYGF1dGguJHtwcm92aWRlcn0uZW5hYmxlZDogdHJ1ZWAsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKCF2YWxpZGF0b3IgfHwgYXV0aFByb3ZpZGVyLmVuYWJsZWQgPT09IGZhbHNlKSB7XG4gICAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihcbiAgICAgICAgICBQYXJzZS5FcnJvci5VTlNVUFBPUlRFRF9TRVJWSUNFLFxuICAgICAgICAgICdUaGlzIGF1dGhlbnRpY2F0aW9uIG1ldGhvZCBpcyB1bnN1cHBvcnRlZC4nXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBsZXQgdmFsaWRhdGlvblJlc3VsdCA9IGF3YWl0IHZhbGlkYXRvcihhdXRoRGF0YVtwcm92aWRlcl0sIHJlcSwgdXNlciwgcmVxdWVzdE9iamVjdCk7XG4gICAgICBtZXRob2QgPSB2YWxpZGF0aW9uUmVzdWx0ICYmIHZhbGlkYXRpb25SZXN1bHQubWV0aG9kO1xuICAgICAgcmVxdWVzdE9iamVjdC50cmlnZ2VyTmFtZSA9IG1ldGhvZDtcbiAgICAgIGlmICh2YWxpZGF0aW9uUmVzdWx0ICYmIHZhbGlkYXRpb25SZXN1bHQudmFsaWRhdG9yKSB7XG4gICAgICAgIHZhbGlkYXRpb25SZXN1bHQgPSBhd2FpdCB2YWxpZGF0aW9uUmVzdWx0LnZhbGlkYXRvcigpO1xuICAgICAgfVxuICAgICAgaWYgKCF2YWxpZGF0aW9uUmVzdWx0KSB7XG4gICAgICAgIGFjYy5hdXRoRGF0YVtwcm92aWRlcl0gPSBhdXRoRGF0YVtwcm92aWRlcl07XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKCFPYmplY3Qua2V5cyh2YWxpZGF0aW9uUmVzdWx0KS5sZW5ndGgpIHtcbiAgICAgICAgYWNjLmF1dGhEYXRhW3Byb3ZpZGVyXSA9IGF1dGhEYXRhW3Byb3ZpZGVyXTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmICh2YWxpZGF0aW9uUmVzdWx0LnJlc3BvbnNlKSB7XG4gICAgICAgIGFjYy5hdXRoRGF0YVJlc3BvbnNlW3Byb3ZpZGVyXSA9IHZhbGlkYXRpb25SZXN1bHQucmVzcG9uc2U7XG4gICAgICB9XG4gICAgICAvLyBTb21lIGF1dGggcHJvdmlkZXJzIGFmdGVyIGluaXRpYWxpemF0aW9uIHdpbGwgYXZvaWQgdG8gcmVwbGFjZSBhdXRoRGF0YSBhbHJlYWR5IHN0b3JlZFxuICAgICAgaWYgKCF2YWxpZGF0aW9uUmVzdWx0LmRvTm90U2F2ZSkge1xuICAgICAgICBhY2MuYXV0aERhdGFbcHJvdmlkZXJdID0gdmFsaWRhdGlvblJlc3VsdC5zYXZlIHx8IGF1dGhEYXRhW3Byb3ZpZGVyXTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnN0IGUgPSByZXNvbHZlRXJyb3IoZXJyLCB7XG4gICAgICAgIGNvZGU6IFBhcnNlLkVycm9yLlNDUklQVF9GQUlMRUQsXG4gICAgICAgIG1lc3NhZ2U6ICdBdXRoIGZhaWxlZC4gVW5rbm93biBlcnJvci4nLFxuICAgICAgfSk7XG4gICAgICBjb25zdCB1c2VyU3RyaW5nID1cbiAgICAgICAgcmVxLmF1dGggJiYgcmVxLmF1dGgudXNlciA/IHJlcS5hdXRoLnVzZXIuaWQgOiByZXEuZGF0YS5vYmplY3RJZCB8fCB1bmRlZmluZWQ7XG4gICAgICBsb2dnZXIuZXJyb3IoXG4gICAgICAgIGBGYWlsZWQgcnVubmluZyBhdXRoIHN0ZXAgJHttZXRob2R9IGZvciAke3Byb3ZpZGVyfSBmb3IgdXNlciAke3VzZXJTdHJpbmd9IHdpdGggRXJyb3I6IGAgK1xuICAgICAgICAgIEpTT04uc3RyaW5naWZ5KGUpLFxuICAgICAgICB7XG4gICAgICAgICAgYXV0aGVudGljYXRpb25TdGVwOiBtZXRob2QsXG4gICAgICAgICAgZXJyb3I6IGUsXG4gICAgICAgICAgdXNlcjogdXNlclN0cmluZyxcbiAgICAgICAgICBwcm92aWRlcixcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuICB9XG4gIHJldHVybiBhY2M7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgQXV0aCxcbiAgbWFzdGVyLFxuICBub2JvZHksXG4gIHJlYWRPbmx5LFxuICBnZXRBdXRoRm9yU2Vzc2lvblRva2VuLFxuICBnZXRBdXRoRm9yTGVnYWN5U2Vzc2lvblRva2VuLFxuICBmaW5kVXNlcnNXaXRoQXV0aERhdGEsXG4gIGhhc011dGF0ZWRBdXRoRGF0YSxcbiAgY2hlY2tJZlVzZXJIYXNQcm92aWRlZENvbmZpZ3VyZWRQcm92aWRlcnNGb3JMb2dpbixcbiAgaGFuZGxlQXV0aERhdGFWYWxpZGF0aW9uLFxufTtcbiJdfQ==
501
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJQYXJzZSIsInJlcXVpcmUiLCJBdXRoIiwiY29uZmlnIiwiY2FjaGVDb250cm9sbGVyIiwidW5kZWZpbmVkIiwiaXNNYXN0ZXIiLCJpc01haW50ZW5hbmNlIiwiaXNSZWFkT25seSIsInVzZXIiLCJpbnN0YWxsYXRpb25JZCIsInVzZXJSb2xlcyIsImZldGNoZWRSb2xlcyIsInJvbGVQcm9taXNlIiwicHJvdG90eXBlIiwiaXNVbmF1dGhlbnRpY2F0ZWQiLCJtYXN0ZXIiLCJtYWludGVuYW5jZSIsInJlYWRPbmx5Iiwibm9ib2R5IiwiZ2V0QXV0aEZvclNlc3Npb25Ub2tlbiIsInNlc3Npb25Ub2tlbiIsInVzZXJKU09OIiwiZ2V0IiwiY2FjaGVkVXNlciIsIk9iamVjdCIsImZyb21KU09OIiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZXN1bHRzIiwicmVzdE9wdGlvbnMiLCJsaW1pdCIsImluY2x1ZGUiLCJSZXN0UXVlcnkiLCJxdWVyeSIsImV4ZWN1dGUiLCJRdWVyeSIsIlNlc3Npb24iLCJlcXVhbFRvIiwiZmluZCIsInVzZU1hc3RlcktleSIsIm1hcCIsIm9iaiIsInRvSlNPTiIsImxlbmd0aCIsIkVycm9yIiwiSU5WQUxJRF9TRVNTSU9OX1RPS0VOIiwibm93IiwiRGF0ZSIsImV4cGlyZXNBdCIsImlzbyIsInBhc3N3b3JkIiwicHV0IiwidXNlck9iamVjdCIsImdldEF1dGhGb3JMZWdhY3lTZXNzaW9uVG9rZW4iLCJ0aGVuIiwicmVzcG9uc2UiLCJjbGFzc05hbWUiLCJnZXRVc2VyUm9sZXMiLCJfbG9hZFJvbGVzIiwiZ2V0Um9sZXNGb3JVc2VyIiwicmVzdFdoZXJlIiwidXNlcnMiLCJfX3R5cGUiLCJvYmplY3RJZCIsImlkIiwiZWFjaCIsInJlc3VsdCIsInB1c2giLCJSb2xlIiwiY2FjaGVkUm9sZXMiLCJyb2xlIiwiY2FjaGVSb2xlcyIsInJvbGVzTWFwIiwicmVkdWNlIiwibSIsInIiLCJuYW1lcyIsIm5hbWUiLCJpZHMiLCJyb2xlTmFtZXMiLCJfZ2V0QWxsUm9sZXNOYW1lc0ZvclJvbGVJZHMiLCJBcnJheSIsImNsZWFyUm9sZUNhY2hlIiwiZGVsIiwiZ2V0Um9sZXNCeUlkcyIsImlucyIsImNvbnRhaW5lZEluIiwicm9sZXMiLCIkaW4iLCJyb2xlSURzIiwicXVlcmllZFJvbGVzIiwiZmlsdGVyIiwicm9sZUlEIiwid2FzUXVlcmllZCIsIlNldCIsInJlc3VsdE1hcCIsIm1lbW8iLCJjb25jYXQiLCJmaW5kVXNlcnNXaXRoQXV0aERhdGEiLCJhdXRoRGF0YSIsInByb3ZpZGVycyIsImtleXMiLCJwcm92aWRlciIsInF1ZXJ5S2V5IiwicSIsImRhdGFiYXNlIiwiJG9yIiwiaGFzTXV0YXRlZEF1dGhEYXRhIiwidXNlckF1dGhEYXRhIiwibXV0YXRlZEF1dGhEYXRhIiwiZm9yRWFjaCIsInByb3ZpZGVyRGF0YSIsInVzZXJQcm92aWRlckF1dGhEYXRhIiwiaXNEZWVwU3RyaWN0RXF1YWwiLCJjaGVja0lmVXNlckhhc1Byb3ZpZGVkQ29uZmlndXJlZFByb3ZpZGVyc0ZvckxvZ2luIiwic2F2ZWRVc2VyUHJvdmlkZXJzIiwiYWRhcHRlciIsImF1dGhEYXRhTWFuYWdlciIsImdldFZhbGlkYXRvckZvclByb3ZpZGVyIiwiaGFzUHJvdmlkZWRBU29sb1Byb3ZpZGVyIiwic29tZSIsInBvbGljeSIsImFkZGl0aW9uUHJvdmlkZXJzTm90Rm91bmQiLCJoYXNQcm92aWRlZEF0TGVhc3RPbmVBZGRpdGlvbmFsUHJvdmlkZXIiLCJPVEhFUl9DQVVTRSIsImpvaW4iLCJoYW5kbGVBdXRoRGF0YVZhbGlkYXRpb24iLCJyZXEiLCJmb3VuZFVzZXIiLCJVc2VyIiwiYXV0aCIsImdldFVzZXJJZCIsImZldGNoIiwib3JpZ2luYWxPYmplY3QiLCJ1cGRhdGVkT2JqZWN0IiwiYnVpbGRQYXJzZU9iamVjdHMiLCJyZXF1ZXN0T2JqZWN0IiwiZ2V0UmVxdWVzdE9iamVjdCIsImFjYyIsImF1dGhEYXRhUmVzcG9uc2UiLCJhdXRoS2V5cyIsInNvcnQiLCJtZXRob2QiLCJ2YWxpZGF0b3IiLCJhdXRoUHJvdmlkZXIiLCJlbmFibGVkIiwiRGVwcmVjYXRvciIsImxvZ1J1bnRpbWVEZXByZWNhdGlvbiIsInVzYWdlIiwic29sdXRpb24iLCJVTlNVUFBPUlRFRF9TRVJWSUNFIiwidmFsaWRhdGlvblJlc3VsdCIsInRyaWdnZXJOYW1lIiwiZG9Ob3RTYXZlIiwic2F2ZSIsImVyciIsImUiLCJyZXNvbHZlRXJyb3IiLCJjb2RlIiwiU0NSSVBUX0ZBSUxFRCIsIm1lc3NhZ2UiLCJ1c2VyU3RyaW5nIiwiZGF0YSIsImxvZ2dlciIsImVycm9yIiwiSlNPTiIsInN0cmluZ2lmeSIsImF1dGhlbnRpY2F0aW9uU3RlcCIsIm1vZHVsZSIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi9zcmMvQXV0aC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBQYXJzZSA9IHJlcXVpcmUoJ3BhcnNlL25vZGUnKTtcbmltcG9ydCB7IGlzRGVlcFN0cmljdEVxdWFsIH0gZnJvbSAndXRpbCc7XG5pbXBvcnQgeyBnZXRSZXF1ZXN0T2JqZWN0LCByZXNvbHZlRXJyb3IgfSBmcm9tICcuL3RyaWdnZXJzJztcbmltcG9ydCBEZXByZWNhdG9yIGZyb20gJy4vRGVwcmVjYXRvci9EZXByZWNhdG9yJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4vbG9nZ2VyJztcblxuLy8gQW4gQXV0aCBvYmplY3QgdGVsbHMgeW91IHdobyBpcyByZXF1ZXN0aW5nIHNvbWV0aGluZyBhbmQgd2hldGhlclxuLy8gdGhlIG1hc3RlciBrZXkgd2FzIHVzZWQuXG4vLyB1c2VyT2JqZWN0IGlzIGEgUGFyc2UuVXNlciBhbmQgY2FuIGJlIG51bGwgaWYgdGhlcmUncyBubyB1c2VyLlxuZnVuY3Rpb24gQXV0aCh7XG4gIGNvbmZpZyxcbiAgY2FjaGVDb250cm9sbGVyID0gdW5kZWZpbmVkLFxuICBpc01hc3RlciA9IGZhbHNlLFxuICBpc01haW50ZW5hbmNlID0gZmFsc2UsXG4gIGlzUmVhZE9ubHkgPSBmYWxzZSxcbiAgdXNlcixcbiAgaW5zdGFsbGF0aW9uSWQsXG59KSB7XG4gIHRoaXMuY29uZmlnID0gY29uZmlnO1xuICB0aGlzLmNhY2hlQ29udHJvbGxlciA9IGNhY2hlQ29udHJvbGxlciB8fCAoY29uZmlnICYmIGNvbmZpZy5jYWNoZUNvbnRyb2xsZXIpO1xuICB0aGlzLmluc3RhbGxhdGlvbklkID0gaW5zdGFsbGF0aW9uSWQ7XG4gIHRoaXMuaXNNYXN0ZXIgPSBpc01hc3RlcjtcbiAgdGhpcy5pc01haW50ZW5hbmNlID0gaXNNYWludGVuYW5jZTtcbiAgdGhpcy51c2VyID0gdXNlcjtcbiAgdGhpcy5pc1JlYWRPbmx5ID0gaXNSZWFkT25seTtcblxuICAvLyBBc3N1bWluZyBhIHVzZXJzIHJvbGVzIHdvbid0IGNoYW5nZSBkdXJpbmcgYSBzaW5nbGUgcmVxdWVzdCwgd2UnbGxcbiAgLy8gb25seSBsb2FkIHRoZW0gb25jZS5cbiAgdGhpcy51c2VyUm9sZXMgPSBbXTtcbiAgdGhpcy5mZXRjaGVkUm9sZXMgPSBmYWxzZTtcbiAgdGhpcy5yb2xlUHJvbWlzZSA9IG51bGw7XG59XG5cbi8vIFdoZXRoZXIgdGhpcyBhdXRoIGNvdWxkIHBvc3NpYmx5IG1vZGlmeSB0aGUgZ2l2ZW4gdXNlciBpZC5cbi8vIEl0IHN0aWxsIGNvdWxkIGJlIGZvcmJpZGRlbiB2aWEgQUNMcyBldmVuIGlmIHRoaXMgcmV0dXJucyB0cnVlLlxuQXV0aC5wcm90b3R5cGUuaXNVbmF1dGhlbnRpY2F0ZWQgPSBmdW5jdGlvbiAoKSB7XG4gIGlmICh0aGlzLmlzTWFzdGVyKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmICh0aGlzLmlzTWFpbnRlbmFuY2UpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKHRoaXMudXNlcikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8vIEEgaGVscGVyIHRvIGdldCBhIG1hc3Rlci1sZXZlbCBBdXRoIG9iamVjdFxuZnVuY3Rpb24gbWFzdGVyKGNvbmZpZykge1xuICByZXR1cm4gbmV3IEF1dGgoeyBjb25maWcsIGlzTWFzdGVyOiB0cnVlIH0pO1xufVxuXG4vLyBBIGhlbHBlciB0byBnZXQgYSBtYWludGVuYW5jZS1sZXZlbCBBdXRoIG9iamVjdFxuZnVuY3Rpb24gbWFpbnRlbmFuY2UoY29uZmlnKSB7XG4gIHJldHVybiBuZXcgQXV0aCh7IGNvbmZpZywgaXNNYWludGVuYW5jZTogdHJ1ZSB9KTtcbn1cblxuLy8gQSBoZWxwZXIgdG8gZ2V0IGEgbWFzdGVyLWxldmVsIEF1dGggb2JqZWN0XG5mdW5jdGlvbiByZWFkT25seShjb25maWcpIHtcbiAgcmV0dXJuIG5ldyBBdXRoKHsgY29uZmlnLCBpc01hc3RlcjogdHJ1ZSwgaXNSZWFkT25seTogdHJ1ZSB9KTtcbn1cblxuLy8gQSBoZWxwZXIgdG8gZ2V0IGEgbm9ib2R5LWxldmVsIEF1dGggb2JqZWN0XG5mdW5jdGlvbiBub2JvZHkoY29uZmlnKSB7XG4gIHJldHVybiBuZXcgQXV0aCh7IGNvbmZpZywgaXNNYXN0ZXI6IGZhbHNlIH0pO1xufVxuXG4vLyBSZXR1cm5zIGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGFuIEF1dGggb2JqZWN0XG5jb25zdCBnZXRBdXRoRm9yU2Vzc2lvblRva2VuID0gYXN5bmMgZnVuY3Rpb24gKHtcbiAgY29uZmlnLFxuICBjYWNoZUNvbnRyb2xsZXIsXG4gIHNlc3Npb25Ub2tlbixcbiAgaW5zdGFsbGF0aW9uSWQsXG59KSB7XG4gIGNhY2hlQ29udHJvbGxlciA9IGNhY2hlQ29udHJvbGxlciB8fCAoY29uZmlnICYmIGNvbmZpZy5jYWNoZUNvbnRyb2xsZXIpO1xuICBpZiAoY2FjaGVDb250cm9sbGVyKSB7XG4gICAgY29uc3QgdXNlckpTT04gPSBhd2FpdCBjYWNoZUNvbnRyb2xsZXIudXNlci5nZXQoc2Vzc2lvblRva2VuKTtcbiAgICBpZiAodXNlckpTT04pIHtcbiAgICAgIGNvbnN0IGNhY2hlZFVzZXIgPSBQYXJzZS5PYmplY3QuZnJvbUpTT04odXNlckpTT04pO1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShcbiAgICAgICAgbmV3IEF1dGgoe1xuICAgICAgICAgIGNvbmZpZyxcbiAgICAgICAgICBjYWNoZUNvbnRyb2xsZXIsXG4gICAgICAgICAgaXNNYXN0ZXI6IGZhbHNlLFxuICAgICAgICAgIGluc3RhbGxhdGlvbklkLFxuICAgICAgICAgIHVzZXI6IGNhY2hlZFVzZXIsXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGxldCByZXN1bHRzO1xuICBpZiAoY29uZmlnKSB7XG4gICAgY29uc3QgcmVzdE9wdGlvbnMgPSB7XG4gICAgICBsaW1pdDogMSxcbiAgICAgIGluY2x1ZGU6ICd1c2VyJyxcbiAgICB9O1xuICAgIGNvbnN0IFJlc3RRdWVyeSA9IHJlcXVpcmUoJy4vUmVzdFF1ZXJ5Jyk7XG4gICAgY29uc3QgcXVlcnkgPSBuZXcgUmVzdFF1ZXJ5KGNvbmZpZywgbWFzdGVyKGNvbmZpZyksICdfU2Vzc2lvbicsIHsgc2Vzc2lvblRva2VuIH0sIHJlc3RPcHRpb25zKTtcbiAgICByZXN1bHRzID0gKGF3YWl0IHF1ZXJ5LmV4ZWN1dGUoKSkucmVzdWx0cztcbiAgfSBlbHNlIHtcbiAgICByZXN1bHRzID0gKFxuICAgICAgYXdhaXQgbmV3IFBhcnNlLlF1ZXJ5KFBhcnNlLlNlc3Npb24pXG4gICAgICAgIC5saW1pdCgxKVxuICAgICAgICAuaW5jbHVkZSgndXNlcicpXG4gICAgICAgIC5lcXVhbFRvKCdzZXNzaW9uVG9rZW4nLCBzZXNzaW9uVG9rZW4pXG4gICAgICAgIC5maW5kKHsgdXNlTWFzdGVyS2V5OiB0cnVlIH0pXG4gICAgKS5tYXAob2JqID0+IG9iai50b0pTT04oKSk7XG4gIH1cblxuICBpZiAocmVzdWx0cy5sZW5ndGggIT09IDEgfHwgIXJlc3VsdHNbMF1bJ3VzZXInXSkge1xuICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5JTlZBTElEX1NFU1NJT05fVE9LRU4sICdJbnZhbGlkIHNlc3Npb24gdG9rZW4nKTtcbiAgfVxuICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpLFxuICAgIGV4cGlyZXNBdCA9IHJlc3VsdHNbMF0uZXhwaXJlc0F0ID8gbmV3IERhdGUocmVzdWx0c1swXS5leHBpcmVzQXQuaXNvKSA6IHVuZGVmaW5lZDtcbiAgaWYgKGV4cGlyZXNBdCA8IG5vdykge1xuICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5JTlZBTElEX1NFU1NJT05fVE9LRU4sICdTZXNzaW9uIHRva2VuIGlzIGV4cGlyZWQuJyk7XG4gIH1cbiAgY29uc3Qgb2JqID0gcmVzdWx0c1swXVsndXNlciddO1xuICBkZWxldGUgb2JqLnBhc3N3b3JkO1xuICBvYmpbJ2NsYXNzTmFtZSddID0gJ19Vc2VyJztcbiAgb2JqWydzZXNzaW9uVG9rZW4nXSA9IHNlc3Npb25Ub2tlbjtcbiAgaWYgKGNhY2hlQ29udHJvbGxlcikge1xuICAgIGNhY2hlQ29udHJvbGxlci51c2VyLnB1dChzZXNzaW9uVG9rZW4sIG9iaik7XG4gIH1cbiAgY29uc3QgdXNlck9iamVjdCA9IFBhcnNlLk9iamVjdC5mcm9tSlNPTihvYmopO1xuICByZXR1cm4gbmV3IEF1dGgoe1xuICAgIGNvbmZpZyxcbiAgICBjYWNoZUNvbnRyb2xsZXIsXG4gICAgaXNNYXN0ZXI6IGZhbHNlLFxuICAgIGluc3RhbGxhdGlvbklkLFxuICAgIHVzZXI6IHVzZXJPYmplY3QsXG4gIH0pO1xufTtcblxudmFyIGdldEF1dGhGb3JMZWdhY3lTZXNzaW9uVG9rZW4gPSBmdW5jdGlvbiAoeyBjb25maWcsIHNlc3Npb25Ub2tlbiwgaW5zdGFsbGF0aW9uSWQgfSkge1xuICB2YXIgcmVzdE9wdGlvbnMgPSB7XG4gICAgbGltaXQ6IDEsXG4gIH07XG4gIGNvbnN0IFJlc3RRdWVyeSA9IHJlcXVpcmUoJy4vUmVzdFF1ZXJ5Jyk7XG4gIHZhciBxdWVyeSA9IG5ldyBSZXN0UXVlcnkoY29uZmlnLCBtYXN0ZXIoY29uZmlnKSwgJ19Vc2VyJywgeyBzZXNzaW9uVG9rZW4gfSwgcmVzdE9wdGlvbnMpO1xuICByZXR1cm4gcXVlcnkuZXhlY3V0ZSgpLnRoZW4ocmVzcG9uc2UgPT4ge1xuICAgIHZhciByZXN1bHRzID0gcmVzcG9uc2UucmVzdWx0cztcbiAgICBpZiAocmVzdWx0cy5sZW5ndGggIT09IDEpIHtcbiAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5JTlZBTElEX1NFU1NJT05fVE9LRU4sICdpbnZhbGlkIGxlZ2FjeSBzZXNzaW9uIHRva2VuJyk7XG4gICAgfVxuICAgIGNvbnN0IG9iaiA9IHJlc3VsdHNbMF07XG4gICAgb2JqLmNsYXNzTmFtZSA9ICdfVXNlcic7XG4gICAgY29uc3QgdXNlck9iamVjdCA9IFBhcnNlLk9iamVjdC5mcm9tSlNPTihvYmopO1xuICAgIHJldHVybiBuZXcgQXV0aCh7XG4gICAgICBjb25maWcsXG4gICAgICBpc01hc3RlcjogZmFsc2UsXG4gICAgICBpbnN0YWxsYXRpb25JZCxcbiAgICAgIHVzZXI6IHVzZXJPYmplY3QsXG4gICAgfSk7XG4gIH0pO1xufTtcblxuLy8gUmV0dXJucyBhIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhbiBhcnJheSBvZiByb2xlIG5hbWVzXG5BdXRoLnByb3RvdHlwZS5nZXRVc2VyUm9sZXMgPSBmdW5jdGlvbiAoKSB7XG4gIGlmICh0aGlzLmlzTWFzdGVyIHx8IHRoaXMuaXNNYWludGVuYW5jZSB8fCAhdGhpcy51c2VyKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShbXSk7XG4gIH1cbiAgaWYgKHRoaXMuZmV0Y2hlZFJvbGVzKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLnVzZXJSb2xlcyk7XG4gIH1cbiAgaWYgKHRoaXMucm9sZVByb21pc2UpIHtcbiAgICByZXR1cm4gdGhpcy5yb2xlUHJvbWlzZTtcbiAgfVxuICB0aGlzLnJvbGVQcm9taXNlID0gdGhpcy5fbG9hZFJvbGVzKCk7XG4gIHJldHVybiB0aGlzLnJvbGVQcm9taXNlO1xufTtcblxuQXV0aC5wcm90b3R5cGUuZ2V0Um9sZXNGb3JVc2VyID0gYXN5bmMgZnVuY3Rpb24gKCkge1xuICAvL1N0YWNrIGFsbCBQYXJzZS5Sb2xlXG4gIGNvbnN0IHJlc3VsdHMgPSBbXTtcbiAgaWYgKHRoaXMuY29uZmlnKSB7XG4gICAgY29uc3QgcmVzdFdoZXJlID0ge1xuICAgICAgdXNlcnM6IHtcbiAgICAgICAgX190eXBlOiAnUG9pbnRlcicsXG4gICAgICAgIGNsYXNzTmFtZTogJ19Vc2VyJyxcbiAgICAgICAgb2JqZWN0SWQ6IHRoaXMudXNlci5pZCxcbiAgICAgIH0sXG4gICAgfTtcbiAgICBjb25zdCBSZXN0UXVlcnkgPSByZXF1aXJlKCcuL1Jlc3RRdWVyeScpO1xuICAgIGF3YWl0IG5ldyBSZXN0UXVlcnkodGhpcy5jb25maWcsIG1hc3Rlcih0aGlzLmNvbmZpZyksICdfUm9sZScsIHJlc3RXaGVyZSwge30pLmVhY2gocmVzdWx0ID0+XG4gICAgICByZXN1bHRzLnB1c2gocmVzdWx0KVxuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgYXdhaXQgbmV3IFBhcnNlLlF1ZXJ5KFBhcnNlLlJvbGUpXG4gICAgICAuZXF1YWxUbygndXNlcnMnLCB0aGlzLnVzZXIpXG4gICAgICAuZWFjaChyZXN1bHQgPT4gcmVzdWx0cy5wdXNoKHJlc3VsdC50b0pTT04oKSksIHsgdXNlTWFzdGVyS2V5OiB0cnVlIH0pO1xuICB9XG4gIHJldHVybiByZXN1bHRzO1xufTtcblxuLy8gSXRlcmF0ZXMgdGhyb3VnaCB0aGUgcm9sZSB0cmVlIGFuZCBjb21waWxlcyBhIHVzZXIncyByb2xlc1xuQXV0aC5wcm90b3R5cGUuX2xvYWRSb2xlcyA9IGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgaWYgKHRoaXMuY2FjaGVDb250cm9sbGVyKSB7XG4gICAgY29uc3QgY2FjaGVkUm9sZXMgPSBhd2FpdCB0aGlzLmNhY2hlQ29udHJvbGxlci5yb2xlLmdldCh0aGlzLnVzZXIuaWQpO1xuICAgIGlmIChjYWNoZWRSb2xlcyAhPSBudWxsKSB7XG4gICAgICB0aGlzLmZldGNoZWRSb2xlcyA9IHRydWU7XG4gICAgICB0aGlzLnVzZXJSb2xlcyA9IGNhY2hlZFJvbGVzO1xuICAgICAgcmV0dXJuIGNhY2hlZFJvbGVzO1xuICAgIH1cbiAgfVxuXG4gIC8vIEZpcnN0IGdldCB0aGUgcm9sZSBpZHMgdGhpcyB1c2VyIGlzIGRpcmVjdGx5IGEgbWVtYmVyIG9mXG4gIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCB0aGlzLmdldFJvbGVzRm9yVXNlcigpO1xuICBpZiAoIXJlc3VsdHMubGVuZ3RoKSB7XG4gICAgdGhpcy51c2VyUm9sZXMgPSBbXTtcbiAgICB0aGlzLmZldGNoZWRSb2xlcyA9IHRydWU7XG4gICAgdGhpcy5yb2xlUHJvbWlzZSA9IG51bGw7XG5cbiAgICB0aGlzLmNhY2hlUm9sZXMoKTtcbiAgICByZXR1cm4gdGhpcy51c2VyUm9sZXM7XG4gIH1cblxuICBjb25zdCByb2xlc01hcCA9IHJlc3VsdHMucmVkdWNlKFxuICAgIChtLCByKSA9PiB7XG4gICAgICBtLm5hbWVzLnB1c2goci5uYW1lKTtcbiAgICAgIG0uaWRzLnB1c2goci5vYmplY3RJZCk7XG4gICAgICByZXR1cm4gbTtcbiAgICB9LFxuICAgIHsgaWRzOiBbXSwgbmFtZXM6IFtdIH1cbiAgKTtcblxuICAvLyBydW4gdGhlIHJlY3Vyc2l2ZSBmaW5kaW5nXG4gIGNvbnN0IHJvbGVOYW1lcyA9IGF3YWl0IHRoaXMuX2dldEFsbFJvbGVzTmFtZXNGb3JSb2xlSWRzKHJvbGVzTWFwLmlkcywgcm9sZXNNYXAubmFtZXMpO1xuICB0aGlzLnVzZXJSb2xlcyA9IHJvbGVOYW1lcy5tYXAociA9PiB7XG4gICAgcmV0dXJuICdyb2xlOicgKyByO1xuICB9KTtcbiAgdGhpcy5mZXRjaGVkUm9sZXMgPSB0cnVlO1xuICB0aGlzLnJvbGVQcm9taXNlID0gbnVsbDtcbiAgdGhpcy5jYWNoZVJvbGVzKCk7XG4gIHJldHVybiB0aGlzLnVzZXJSb2xlcztcbn07XG5cbkF1dGgucHJvdG90eXBlLmNhY2hlUm9sZXMgPSBmdW5jdGlvbiAoKSB7XG4gIGlmICghdGhpcy5jYWNoZUNvbnRyb2xsZXIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdGhpcy5jYWNoZUNvbnRyb2xsZXIucm9sZS5wdXQodGhpcy51c2VyLmlkLCBBcnJheSguLi50aGlzLnVzZXJSb2xlcykpO1xuICByZXR1cm4gdHJ1ZTtcbn07XG5cbkF1dGgucHJvdG90eXBlLmNsZWFyUm9sZUNhY2hlID0gZnVuY3Rpb24gKHNlc3Npb25Ub2tlbikge1xuICBpZiAoIXRoaXMuY2FjaGVDb250cm9sbGVyKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHRoaXMuY2FjaGVDb250cm9sbGVyLnJvbGUuZGVsKHRoaXMudXNlci5pZCk7XG4gIHRoaXMuY2FjaGVDb250cm9sbGVyLnVzZXIuZGVsKHNlc3Npb25Ub2tlbik7XG4gIHJldHVybiB0cnVlO1xufTtcblxuQXV0aC5wcm90b3R5cGUuZ2V0Um9sZXNCeUlkcyA9IGFzeW5jIGZ1bmN0aW9uIChpbnMpIHtcbiAgY29uc3QgcmVzdWx0cyA9IFtdO1xuICAvLyBCdWlsZCBhbiBPUiBxdWVyeSBhY3Jvc3MgYWxsIHBhcmVudFJvbGVzXG4gIGlmICghdGhpcy5jb25maWcpIHtcbiAgICBhd2FpdCBuZXcgUGFyc2UuUXVlcnkoUGFyc2UuUm9sZSlcbiAgICAgIC5jb250YWluZWRJbihcbiAgICAgICAgJ3JvbGVzJyxcbiAgICAgICAgaW5zLm1hcChpZCA9PiB7XG4gICAgICAgICAgY29uc3Qgcm9sZSA9IG5ldyBQYXJzZS5PYmplY3QoUGFyc2UuUm9sZSk7XG4gICAgICAgICAgcm9sZS5pZCA9IGlkO1xuICAgICAgICAgIHJldHVybiByb2xlO1xuICAgICAgICB9KVxuICAgICAgKVxuICAgICAgLmVhY2gocmVzdWx0ID0+IHJlc3VsdHMucHVzaChyZXN1bHQudG9KU09OKCkpLCB7IHVzZU1hc3RlcktleTogdHJ1ZSB9KTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCByb2xlcyA9IGlucy5tYXAoaWQgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgX190eXBlOiAnUG9pbnRlcicsXG4gICAgICAgIGNsYXNzTmFtZTogJ19Sb2xlJyxcbiAgICAgICAgb2JqZWN0SWQ6IGlkLFxuICAgICAgfTtcbiAgICB9KTtcbiAgICBjb25zdCByZXN0V2hlcmUgPSB7IHJvbGVzOiB7ICRpbjogcm9sZXMgfSB9O1xuICAgIGNvbnN0IFJlc3RRdWVyeSA9IHJlcXVpcmUoJy4vUmVzdFF1ZXJ5Jyk7XG4gICAgYXdhaXQgbmV3IFJlc3RRdWVyeSh0aGlzLmNvbmZpZywgbWFzdGVyKHRoaXMuY29uZmlnKSwgJ19Sb2xlJywgcmVzdFdoZXJlLCB7fSkuZWFjaChyZXN1bHQgPT5cbiAgICAgIHJlc3VsdHMucHVzaChyZXN1bHQpXG4gICAgKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0cztcbn07XG5cbi8vIEdpdmVuIGEgbGlzdCBvZiByb2xlSWRzLCBmaW5kIGFsbCB0aGUgcGFyZW50IHJvbGVzLCByZXR1cm5zIGEgcHJvbWlzZSB3aXRoIGFsbCBuYW1lc1xuQXV0aC5wcm90b3R5cGUuX2dldEFsbFJvbGVzTmFtZXNGb3JSb2xlSWRzID0gZnVuY3Rpb24gKHJvbGVJRHMsIG5hbWVzID0gW10sIHF1ZXJpZWRSb2xlcyA9IHt9KSB7XG4gIGNvbnN0IGlucyA9IHJvbGVJRHMuZmlsdGVyKHJvbGVJRCA9PiB7XG4gICAgY29uc3Qgd2FzUXVlcmllZCA9IHF1ZXJpZWRSb2xlc1tyb2xlSURdICE9PSB0cnVlO1xuICAgIHF1ZXJpZWRSb2xlc1tyb2xlSURdID0gdHJ1ZTtcbiAgICByZXR1cm4gd2FzUXVlcmllZDtcbiAgfSk7XG5cbiAgLy8gYWxsIHJvbGVzIGFyZSBhY2NvdW50ZWQgZm9yLCByZXR1cm4gdGhlIG5hbWVzXG4gIGlmIChpbnMubGVuZ3RoID09IDApIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFsuLi5uZXcgU2V0KG5hbWVzKV0pO1xuICB9XG5cbiAgcmV0dXJuIHRoaXMuZ2V0Um9sZXNCeUlkcyhpbnMpXG4gICAgLnRoZW4ocmVzdWx0cyA9PiB7XG4gICAgICAvLyBOb3RoaW5nIGZvdW5kXG4gICAgICBpZiAoIXJlc3VsdHMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobmFtZXMpO1xuICAgICAgfVxuICAgICAgLy8gTWFwIHRoZSByZXN1bHRzIHdpdGggYWxsIElkcyBhbmQgbmFtZXNcbiAgICAgIGNvbnN0IHJlc3VsdE1hcCA9IHJlc3VsdHMucmVkdWNlKFxuICAgICAgICAobWVtbywgcm9sZSkgPT4ge1xuICAgICAgICAgIG1lbW8ubmFtZXMucHVzaChyb2xlLm5hbWUpO1xuICAgICAgICAgIG1lbW8uaWRzLnB1c2gocm9sZS5vYmplY3RJZCk7XG4gICAgICAgICAgcmV0dXJuIG1lbW87XG4gICAgICAgIH0sXG4gICAgICAgIHsgaWRzOiBbXSwgbmFtZXM6IFtdIH1cbiAgICAgICk7XG4gICAgICAvLyBzdG9yZSB0aGUgbmV3IGZvdW5kIG5hbWVzXG4gICAgICBuYW1lcyA9IG5hbWVzLmNvbmNhdChyZXN1bHRNYXAubmFtZXMpO1xuICAgICAgLy8gZmluZCB0aGUgbmV4dCBvbmVzLCBjaXJjdWxhciByb2xlcyB3aWxsIGJlIGN1dFxuICAgICAgcmV0dXJuIHRoaXMuX2dldEFsbFJvbGVzTmFtZXNGb3JSb2xlSWRzKHJlc3VsdE1hcC5pZHMsIG5hbWVzLCBxdWVyaWVkUm9sZXMpO1xuICAgIH0pXG4gICAgLnRoZW4obmFtZXMgPT4ge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShbLi4ubmV3IFNldChuYW1lcyldKTtcbiAgICB9KTtcbn07XG5cbmNvbnN0IGZpbmRVc2Vyc1dpdGhBdXRoRGF0YSA9IChjb25maWcsIGF1dGhEYXRhKSA9PiB7XG4gIGNvbnN0IHByb3ZpZGVycyA9IE9iamVjdC5rZXlzKGF1dGhEYXRhKTtcbiAgY29uc3QgcXVlcnkgPSBwcm92aWRlcnNcbiAgICAucmVkdWNlKChtZW1vLCBwcm92aWRlcikgPT4ge1xuICAgICAgaWYgKCFhdXRoRGF0YVtwcm92aWRlcl0gfHwgKGF1dGhEYXRhICYmICFhdXRoRGF0YVtwcm92aWRlcl0uaWQpKSB7XG4gICAgICAgIHJldHVybiBtZW1vO1xuICAgICAgfVxuICAgICAgY29uc3QgcXVlcnlLZXkgPSBgYXV0aERhdGEuJHtwcm92aWRlcn0uaWRgO1xuICAgICAgY29uc3QgcXVlcnkgPSB7fTtcbiAgICAgIHF1ZXJ5W3F1ZXJ5S2V5XSA9IGF1dGhEYXRhW3Byb3ZpZGVyXS5pZDtcbiAgICAgIG1lbW8ucHVzaChxdWVyeSk7XG4gICAgICByZXR1cm4gbWVtbztcbiAgICB9LCBbXSlcbiAgICAuZmlsdGVyKHEgPT4ge1xuICAgICAgcmV0dXJuIHR5cGVvZiBxICE9PSAndW5kZWZpbmVkJztcbiAgICB9KTtcblxuICByZXR1cm4gcXVlcnkubGVuZ3RoID4gMFxuICAgID8gY29uZmlnLmRhdGFiYXNlLmZpbmQoJ19Vc2VyJywgeyAkb3I6IHF1ZXJ5IH0sIHsgbGltaXQ6IDIgfSlcbiAgICA6IFByb21pc2UucmVzb2x2ZShbXSk7XG59O1xuXG5jb25zdCBoYXNNdXRhdGVkQXV0aERhdGEgPSAoYXV0aERhdGEsIHVzZXJBdXRoRGF0YSkgPT4ge1xuICBpZiAoIXVzZXJBdXRoRGF0YSkgcmV0dXJuIHsgaGFzTXV0YXRlZEF1dGhEYXRhOiB0cnVlLCBtdXRhdGVkQXV0aERhdGE6IGF1dGhEYXRhIH07XG4gIGNvbnN0IG11dGF0ZWRBdXRoRGF0YSA9IHt9O1xuICBPYmplY3Qua2V5cyhhdXRoRGF0YSkuZm9yRWFjaChwcm92aWRlciA9PiB7XG4gICAgLy8gQW5vbnltb3VzIHByb3ZpZGVyIGlzIG5vdCBoYW5kbGVkIHRoaXMgd2F5XG4gICAgaWYgKHByb3ZpZGVyID09PSAnYW5vbnltb3VzJykgcmV0dXJuO1xuICAgIGNvbnN0IHByb3ZpZGVyRGF0YSA9IGF1dGhEYXRhW3Byb3ZpZGVyXTtcbiAgICBjb25zdCB1c2VyUHJvdmlkZXJBdXRoRGF0YSA9IHVzZXJBdXRoRGF0YVtwcm92aWRlcl07XG4gICAgaWYgKCFpc0RlZXBTdHJpY3RFcXVhbChwcm92aWRlckRhdGEsIHVzZXJQcm92aWRlckF1dGhEYXRhKSkge1xuICAgICAgbXV0YXRlZEF1dGhEYXRhW3Byb3ZpZGVyXSA9IHByb3ZpZGVyRGF0YTtcbiAgICB9XG4gIH0pO1xuICBjb25zdCBoYXNNdXRhdGVkQXV0aERhdGEgPSBPYmplY3Qua2V5cyhtdXRhdGVkQXV0aERhdGEpLmxlbmd0aCAhPT0gMDtcbiAgcmV0dXJuIHsgaGFzTXV0YXRlZEF1dGhEYXRhLCBtdXRhdGVkQXV0aERhdGEgfTtcbn07XG5cbmNvbnN0IGNoZWNrSWZVc2VySGFzUHJvdmlkZWRDb25maWd1cmVkUHJvdmlkZXJzRm9yTG9naW4gPSAoXG4gIGF1dGhEYXRhID0ge30sXG4gIHVzZXJBdXRoRGF0YSA9IHt9LFxuICBjb25maWdcbikgPT4ge1xuICBjb25zdCBzYXZlZFVzZXJQcm92aWRlcnMgPSBPYmplY3Qua2V5cyh1c2VyQXV0aERhdGEpLm1hcChwcm92aWRlciA9PiAoe1xuICAgIG5hbWU6IHByb3ZpZGVyLFxuICAgIGFkYXB0ZXI6IGNvbmZpZy5hdXRoRGF0YU1hbmFnZXIuZ2V0VmFsaWRhdG9yRm9yUHJvdmlkZXIocHJvdmlkZXIpLmFkYXB0ZXIsXG4gIH0pKTtcblxuICBjb25zdCBoYXNQcm92aWRlZEFTb2xvUHJvdmlkZXIgPSBzYXZlZFVzZXJQcm92aWRlcnMuc29tZShcbiAgICBwcm92aWRlciA9PlxuICAgICAgcHJvdmlkZXIgJiYgcHJvdmlkZXIuYWRhcHRlciAmJiBwcm92aWRlci5hZGFwdGVyLnBvbGljeSA9PT0gJ3NvbG8nICYmIGF1dGhEYXRhW3Byb3ZpZGVyLm5hbWVdXG4gICk7XG5cbiAgLy8gU29sbyBwcm92aWRlcnMgY2FuIGJlIGNvbnNpZGVyZWQgYXMgc2FmZSwgc28gd2UgZG8gbm90IGhhdmUgdG8gY2hlY2sgaWYgdGhlIHVzZXIgbmVlZHNcbiAgLy8gdG8gcHJvdmlkZSBhbiBhZGRpdGlvbmFsIHByb3ZpZGVyIHRvIGxvZ2luLiBBbiBhdXRoIGFkYXB0ZXIgd2l0aCBcInNvbG9cIiAobGlrZSB3ZWJhdXRobikgbWVhbnNcbiAgLy8gbm8gXCJhZGRpdGlvbmFsXCIgYXV0aCBuZWVkcyB0byBiZSBwcm92aWRlZCB0byBsb2dpbiAobGlrZSBPVFAsIE1GQSlcbiAgaWYgKGhhc1Byb3ZpZGVkQVNvbG9Qcm92aWRlcikge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGFkZGl0aW9uUHJvdmlkZXJzTm90Rm91bmQgPSBbXTtcbiAgY29uc3QgaGFzUHJvdmlkZWRBdExlYXN0T25lQWRkaXRpb25hbFByb3ZpZGVyID0gc2F2ZWRVc2VyUHJvdmlkZXJzLnNvbWUocHJvdmlkZXIgPT4ge1xuICAgIGlmIChwcm92aWRlciAmJiBwcm92aWRlci5hZGFwdGVyICYmIHByb3ZpZGVyLmFkYXB0ZXIucG9saWN5ID09PSAnYWRkaXRpb25hbCcpIHtcbiAgICAgIGlmIChhdXRoRGF0YVtwcm92aWRlci5uYW1lXSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFB1c2ggbWlzc2luZyBwcm92aWRlciBmb3IgZXJyb3IgbWVzc2FnZVxuICAgICAgICBhZGRpdGlvblByb3ZpZGVyc05vdEZvdW5kLnB1c2gocHJvdmlkZXIubmFtZSk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbiAgaWYgKGhhc1Byb3ZpZGVkQXRMZWFzdE9uZUFkZGl0aW9uYWxQcm92aWRlciB8fCAhYWRkaXRpb25Qcm92aWRlcnNOb3RGb3VuZC5sZW5ndGgpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoXG4gICAgUGFyc2UuRXJyb3IuT1RIRVJfQ0FVU0UsXG4gICAgYE1pc3NpbmcgYWRkaXRpb25hbCBhdXRoRGF0YSAke2FkZGl0aW9uUHJvdmlkZXJzTm90Rm91bmQuam9pbignLCcpfWBcbiAgKTtcbn07XG5cbi8vIFZhbGlkYXRlIGVhY2ggYXV0aERhdGEgc3RlcC1ieS1zdGVwIGFuZCByZXR1cm4gdGhlIHByb3ZpZGVyIHJlc3BvbnNlc1xuY29uc3QgaGFuZGxlQXV0aERhdGFWYWxpZGF0aW9uID0gYXN5bmMgKGF1dGhEYXRhLCByZXEsIGZvdW5kVXNlcikgPT4ge1xuICBsZXQgdXNlcjtcbiAgaWYgKGZvdW5kVXNlcikge1xuICAgIHVzZXIgPSBQYXJzZS5Vc2VyLmZyb21KU09OKHsgY2xhc3NOYW1lOiAnX1VzZXInLCAuLi5mb3VuZFVzZXIgfSk7XG4gICAgLy8gRmluZCB1c2VyIGJ5IHNlc3Npb24gYW5kIGN1cnJlbnQgb2JqZWN0SWQ7IG9ubHkgcGFzcyB1c2VyIGlmIGl0J3MgdGhlIGN1cnJlbnQgdXNlciBvciBtYXN0ZXIga2V5IGlzIHByb3ZpZGVkXG4gIH0gZWxzZSBpZiAoXG4gICAgKHJlcS5hdXRoICYmXG4gICAgICByZXEuYXV0aC51c2VyICYmXG4gICAgICB0eXBlb2YgcmVxLmdldFVzZXJJZCA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgICAgcmVxLmdldFVzZXJJZCgpID09PSByZXEuYXV0aC51c2VyLmlkKSB8fFxuICAgIChyZXEuYXV0aCAmJiByZXEuYXV0aC5pc01hc3RlciAmJiB0eXBlb2YgcmVxLmdldFVzZXJJZCA9PT0gJ2Z1bmN0aW9uJyAmJiByZXEuZ2V0VXNlcklkKCkpXG4gICkge1xuICAgIHVzZXIgPSBuZXcgUGFyc2UuVXNlcigpO1xuICAgIHVzZXIuaWQgPSByZXEuYXV0aC5pc01hc3RlciA/IHJlcS5nZXRVc2VySWQoKSA6IHJlcS5hdXRoLnVzZXIuaWQ7XG4gICAgYXdhaXQgdXNlci5mZXRjaCh7IHVzZU1hc3RlcktleTogdHJ1ZSB9KTtcbiAgfVxuXG4gIGNvbnN0IHsgb3JpZ2luYWxPYmplY3QsIHVwZGF0ZWRPYmplY3QgfSA9IHJlcS5idWlsZFBhcnNlT2JqZWN0cygpO1xuICBjb25zdCByZXF1ZXN0T2JqZWN0ID0gZ2V0UmVxdWVzdE9iamVjdChcbiAgICB1bmRlZmluZWQsXG4gICAgcmVxLmF1dGgsXG4gICAgdXBkYXRlZE9iamVjdCxcbiAgICBvcmlnaW5hbE9iamVjdCB8fCB1c2VyLFxuICAgIHJlcS5jb25maWdcbiAgKTtcbiAgLy8gUGVyZm9ybSB2YWxpZGF0aW9uIGFzIHN0ZXAtYnktc3RlcCBwaXBlbGluZSBmb3IgYmV0dGVyIGVycm9yIGNvbnNpc3RlbmN5XG4gIC8vIGFuZCBhbHNvIHRvIGF2b2lkIHRvIHRyaWdnZXIgYSBwcm92aWRlciAobGlrZSBPVFAgU01TKSBpZiBhbm90aGVyIG9uZSBmYWlsc1xuICBjb25zdCBhY2MgPSB7IGF1dGhEYXRhOiB7fSwgYXV0aERhdGFSZXNwb25zZToge30gfTtcbiAgY29uc3QgYXV0aEtleXMgPSBPYmplY3Qua2V5cyhhdXRoRGF0YSkuc29ydCgpO1xuICBmb3IgKGNvbnN0IHByb3ZpZGVyIG9mIGF1dGhLZXlzKSB7XG4gICAgbGV0IG1ldGhvZCA9ICcnO1xuICAgIHRyeSB7XG4gICAgICBpZiAoYXV0aERhdGFbcHJvdmlkZXJdID09PSBudWxsKSB7XG4gICAgICAgIGFjYy5hdXRoRGF0YVtwcm92aWRlcl0gPSBudWxsO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHsgdmFsaWRhdG9yIH0gPSByZXEuY29uZmlnLmF1dGhEYXRhTWFuYWdlci5nZXRWYWxpZGF0b3JGb3JQcm92aWRlcihwcm92aWRlcik7XG4gICAgICBjb25zdCBhdXRoUHJvdmlkZXIgPSAocmVxLmNvbmZpZy5hdXRoIHx8IHt9KVtwcm92aWRlcl0gfHwge307XG4gICAgICBpZiAoYXV0aFByb3ZpZGVyLmVuYWJsZWQgPT0gbnVsbCkge1xuICAgICAgICBEZXByZWNhdG9yLmxvZ1J1bnRpbWVEZXByZWNhdGlvbih7XG4gICAgICAgICAgdXNhZ2U6IGBVc2luZyB0aGUgYXV0aGVudGljYXRpb24gYWRhcHRlciBcIiR7cHJvdmlkZXJ9XCIgd2l0aG91dCBleHBsaWNpdGx5IGVuYWJsaW5nIGl0YCxcbiAgICAgICAgICBzb2x1dGlvbjogYEVuYWJsZSB0aGUgYXV0aGVudGljYXRpb24gYWRhcHRlciBieSBzZXR0aW5nIHRoZSBQYXJzZSBTZXJ2ZXIgb3B0aW9uIFwiYXV0aC4ke3Byb3ZpZGVyfS5lbmFibGVkOiB0cnVlXCIuYCxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpZiAoIXZhbGlkYXRvciB8fCBhdXRoUHJvdmlkZXIuZW5hYmxlZCA9PT0gZmFsc2UpIHtcbiAgICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFxuICAgICAgICAgIFBhcnNlLkVycm9yLlVOU1VQUE9SVEVEX1NFUlZJQ0UsXG4gICAgICAgICAgJ1RoaXMgYXV0aGVudGljYXRpb24gbWV0aG9kIGlzIHVuc3VwcG9ydGVkLidcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGxldCB2YWxpZGF0aW9uUmVzdWx0ID0gYXdhaXQgdmFsaWRhdG9yKGF1dGhEYXRhW3Byb3ZpZGVyXSwgcmVxLCB1c2VyLCByZXF1ZXN0T2JqZWN0KTtcbiAgICAgIG1ldGhvZCA9IHZhbGlkYXRpb25SZXN1bHQgJiYgdmFsaWRhdGlvblJlc3VsdC5tZXRob2Q7XG4gICAgICByZXF1ZXN0T2JqZWN0LnRyaWdnZXJOYW1lID0gbWV0aG9kO1xuICAgICAgaWYgKHZhbGlkYXRpb25SZXN1bHQgJiYgdmFsaWRhdGlvblJlc3VsdC52YWxpZGF0b3IpIHtcbiAgICAgICAgdmFsaWRhdGlvblJlc3VsdCA9IGF3YWl0IHZhbGlkYXRpb25SZXN1bHQudmFsaWRhdG9yKCk7XG4gICAgICB9XG4gICAgICBpZiAoIXZhbGlkYXRpb25SZXN1bHQpIHtcbiAgICAgICAgYWNjLmF1dGhEYXRhW3Byb3ZpZGVyXSA9IGF1dGhEYXRhW3Byb3ZpZGVyXTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoIU9iamVjdC5rZXlzKHZhbGlkYXRpb25SZXN1bHQpLmxlbmd0aCkge1xuICAgICAgICBhY2MuYXV0aERhdGFbcHJvdmlkZXJdID0gYXV0aERhdGFbcHJvdmlkZXJdO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHZhbGlkYXRpb25SZXN1bHQucmVzcG9uc2UpIHtcbiAgICAgICAgYWNjLmF1dGhEYXRhUmVzcG9uc2VbcHJvdmlkZXJdID0gdmFsaWRhdGlvblJlc3VsdC5yZXNwb25zZTtcbiAgICAgIH1cbiAgICAgIC8vIFNvbWUgYXV0aCBwcm92aWRlcnMgYWZ0ZXIgaW5pdGlhbGl6YXRpb24gd2lsbCBhdm9pZCB0byByZXBsYWNlIGF1dGhEYXRhIGFscmVhZHkgc3RvcmVkXG4gICAgICBpZiAoIXZhbGlkYXRpb25SZXN1bHQuZG9Ob3RTYXZlKSB7XG4gICAgICAgIGFjYy5hdXRoRGF0YVtwcm92aWRlcl0gPSB2YWxpZGF0aW9uUmVzdWx0LnNhdmUgfHwgYXV0aERhdGFbcHJvdmlkZXJdO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc3QgZSA9IHJlc29sdmVFcnJvcihlcnIsIHtcbiAgICAgICAgY29kZTogUGFyc2UuRXJyb3IuU0NSSVBUX0ZBSUxFRCxcbiAgICAgICAgbWVzc2FnZTogJ0F1dGggZmFpbGVkLiBVbmtub3duIGVycm9yLicsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHVzZXJTdHJpbmcgPVxuICAgICAgICByZXEuYXV0aCAmJiByZXEuYXV0aC51c2VyID8gcmVxLmF1dGgudXNlci5pZCA6IHJlcS5kYXRhLm9iamVjdElkIHx8IHVuZGVmaW5lZDtcbiAgICAgIGxvZ2dlci5lcnJvcihcbiAgICAgICAgYEZhaWxlZCBydW5uaW5nIGF1dGggc3RlcCAke21ldGhvZH0gZm9yICR7cHJvdmlkZXJ9IGZvciB1c2VyICR7dXNlclN0cmluZ30gd2l0aCBFcnJvcjogYCArXG4gICAgICAgICAgSlNPTi5zdHJpbmdpZnkoZSksXG4gICAgICAgIHtcbiAgICAgICAgICBhdXRoZW50aWNhdGlvblN0ZXA6IG1ldGhvZCxcbiAgICAgICAgICBlcnJvcjogZSxcbiAgICAgICAgICB1c2VyOiB1c2VyU3RyaW5nLFxuICAgICAgICAgIHByb3ZpZGVyLFxuICAgICAgICB9XG4gICAgICApO1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGFjYztcbn07XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBBdXRoLFxuICBtYXN0ZXIsXG4gIG1haW50ZW5hbmNlLFxuICBub2JvZHksXG4gIHJlYWRPbmx5LFxuICBnZXRBdXRoRm9yU2Vzc2lvblRva2VuLFxuICBnZXRBdXRoRm9yTGVnYWN5U2Vzc2lvblRva2VuLFxuICBmaW5kVXNlcnNXaXRoQXV0aERhdGEsXG4gIGhhc011dGF0ZWRBdXRoRGF0YSxcbiAgY2hlY2tJZlVzZXJIYXNQcm92aWRlZENvbmZpZ3VyZWRQcm92aWRlcnNGb3JMb2dpbixcbiAgaGFuZGxlQXV0aERhdGFWYWxpZGF0aW9uLFxufTtcbiJdLCJtYXBwaW5ncyI6Ijs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFrQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFKbEMsTUFBTUEsS0FBSyxHQUFHQyxPQUFPLENBQUMsWUFBWSxDQUFDO0FBTW5DO0FBQ0E7QUFDQTtBQUNBLFNBQVNDLElBQUksQ0FBQztFQUNaQyxNQUFNO0VBQ05DLGVBQWUsR0FBR0MsU0FBUztFQUMzQkMsUUFBUSxHQUFHLEtBQUs7RUFDaEJDLGFBQWEsR0FBRyxLQUFLO0VBQ3JCQyxVQUFVLEdBQUcsS0FBSztFQUNsQkMsSUFBSTtFQUNKQztBQUNGLENBQUMsRUFBRTtFQUNELElBQUksQ0FBQ1AsTUFBTSxHQUFHQSxNQUFNO0VBQ3BCLElBQUksQ0FBQ0MsZUFBZSxHQUFHQSxlQUFlLElBQUtELE1BQU0sSUFBSUEsTUFBTSxDQUFDQyxlQUFnQjtFQUM1RSxJQUFJLENBQUNNLGNBQWMsR0FBR0EsY0FBYztFQUNwQyxJQUFJLENBQUNKLFFBQVEsR0FBR0EsUUFBUTtFQUN4QixJQUFJLENBQUNDLGFBQWEsR0FBR0EsYUFBYTtFQUNsQyxJQUFJLENBQUNFLElBQUksR0FBR0EsSUFBSTtFQUNoQixJQUFJLENBQUNELFVBQVUsR0FBR0EsVUFBVTs7RUFFNUI7RUFDQTtFQUNBLElBQUksQ0FBQ0csU0FBUyxHQUFHLEVB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