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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (191) hide show
  1. package/README.md +45 -17
  2. package/lib/AccountLockout.js +11 -26
  3. package/lib/Adapters/AdapterLoader.js +8 -14
  4. package/lib/Adapters/Analytics/AnalyticsAdapter.js +2 -8
  5. package/lib/Adapters/Auth/AuthAdapter.js +7 -16
  6. package/lib/Adapters/Auth/OAuth1Client.js +32 -57
  7. package/lib/Adapters/Auth/apple.js +6 -22
  8. package/lib/Adapters/Auth/facebook.js +7 -37
  9. package/lib/Adapters/Auth/gcenter.js +8 -37
  10. package/lib/Adapters/Auth/github.js +7 -10
  11. package/lib/Adapters/Auth/google.js +11 -34
  12. package/lib/Adapters/Auth/gpgames.js +5 -8
  13. package/lib/Adapters/Auth/httpsRequest.js +1 -7
  14. package/lib/Adapters/Auth/index.js +20 -65
  15. package/lib/Adapters/Auth/instagram.js +5 -9
  16. package/lib/Adapters/Auth/janraincapture.js +8 -12
  17. package/lib/Adapters/Auth/janrainengage.js +7 -11
  18. package/lib/Adapters/Auth/keycloak.js +5 -19
  19. package/lib/Adapters/Auth/ldap.js +1 -15
  20. package/lib/Adapters/Auth/line.js +7 -10
  21. package/lib/Adapters/Auth/linkedin.js +7 -12
  22. package/lib/Adapters/Auth/meetup.js +7 -10
  23. package/lib/Adapters/Auth/microsoft.js +7 -10
  24. package/lib/Adapters/Auth/oauth2.js +6 -18
  25. package/lib/Adapters/Auth/phantauth.js +8 -10
  26. package/lib/Adapters/Auth/qq.js +7 -13
  27. package/lib/Adapters/Auth/spotify.js +7 -14
  28. package/lib/Adapters/Auth/twitter.js +5 -15
  29. package/lib/Adapters/Auth/vkontakte.js +9 -15
  30. package/lib/Adapters/Auth/wechat.js +7 -10
  31. package/lib/Adapters/Auth/weibo.js +7 -11
  32. package/lib/Adapters/Cache/CacheAdapter.js +4 -12
  33. package/lib/Adapters/Cache/InMemoryCache.js +5 -19
  34. package/lib/Adapters/Cache/InMemoryCacheAdapter.js +1 -11
  35. package/lib/Adapters/Cache/LRUCache.js +1 -11
  36. package/lib/Adapters/Cache/NullCacheAdapter.js +1 -8
  37. package/lib/Adapters/Cache/RedisCacheAdapter.js +46 -87
  38. package/lib/Adapters/Cache/SchemaCache.js +1 -6
  39. package/lib/Adapters/Email/MailAdapter.js +2 -7
  40. package/lib/Adapters/Files/FilesAdapter.js +7 -21
  41. package/lib/Adapters/Files/GridFSBucketAdapter.js +6 -44
  42. package/lib/Adapters/Files/GridStoreAdapter.js +1 -1
  43. package/lib/Adapters/Logger/LoggerAdapter.js +2 -11
  44. package/lib/Adapters/Logger/WinstonLogger.js +3 -30
  45. package/lib/Adapters/Logger/WinstonLoggerAdapter.js +5 -16
  46. package/lib/Adapters/MessageQueue/EventEmitterMQ.js +3 -20
  47. package/lib/Adapters/PubSub/EventEmitterPubSub.js +1 -16
  48. package/lib/Adapters/PubSub/PubSubAdapter.js +2 -9
  49. package/lib/Adapters/PubSub/RedisPubSub.js +13 -10
  50. package/lib/Adapters/Push/PushAdapter.js +2 -8
  51. package/lib/Adapters/Storage/Mongo/MongoCollection.js +12 -37
  52. package/lib/Adapters/Storage/Mongo/MongoSchemaCollection.js +26 -79
  53. package/lib/Adapters/Storage/Mongo/MongoStorageAdapter.js +78 -209
  54. package/lib/Adapters/Storage/Mongo/MongoTransform.js +82 -371
  55. package/lib/Adapters/Storage/Postgres/PostgresClient.js +1 -13
  56. package/lib/Adapters/Storage/Postgres/PostgresConfigParser.js +1 -20
  57. package/lib/Adapters/Storage/Postgres/PostgresStorageAdapter.js +119 -446
  58. package/lib/Adapters/Storage/Postgres/sql/index.js +4 -7
  59. package/lib/Adapters/Storage/StorageAdapter.js +1 -1
  60. package/lib/Adapters/WebSocketServer/WSAdapter.js +3 -12
  61. package/lib/Adapters/WebSocketServer/WSSAdapter.js +7 -12
  62. package/lib/Auth.js +54 -121
  63. package/lib/ClientSDK.js +3 -11
  64. package/lib/Config.js +69 -113
  65. package/lib/Controllers/AdaptableController.js +6 -18
  66. package/lib/Controllers/AnalyticsController.js +1 -9
  67. package/lib/Controllers/CacheController.js +3 -23
  68. package/lib/Controllers/DatabaseController.js +147 -345
  69. package/lib/Controllers/FilesController.js +5 -34
  70. package/lib/Controllers/HooksController.js +1 -51
  71. package/lib/Controllers/LiveQueryController.js +4 -23
  72. package/lib/Controllers/LoggerController.js +15 -54
  73. package/lib/Controllers/ParseGraphQLController.js +49 -104
  74. package/lib/Controllers/PushController.js +20 -59
  75. package/lib/Controllers/SchemaController.js +154 -344
  76. package/lib/Controllers/UserController.js +11 -72
  77. package/lib/Controllers/index.js +19 -68
  78. package/lib/Controllers/types.js +1 -1
  79. package/lib/Deprecator/Deprecations.js +1 -8
  80. package/lib/Deprecator/Deprecator.js +9 -18
  81. package/lib/GraphQL/ParseGraphQLSchema.js +16 -100
  82. package/lib/GraphQL/ParseGraphQLServer.js +2 -29
  83. package/lib/GraphQL/helpers/objectsMutations.js +2 -12
  84. package/lib/GraphQL/helpers/objectsQueries.js +18 -76
  85. package/lib/GraphQL/loaders/defaultGraphQLMutations.js +1 -9
  86. package/lib/GraphQL/loaders/defaultGraphQLQueries.js +1 -8
  87. package/lib/GraphQL/loaders/defaultGraphQLTypes.js +9 -115
  88. package/lib/GraphQL/loaders/defaultRelaySchema.js +6 -18
  89. package/lib/GraphQL/loaders/filesMutations.js +2 -19
  90. package/lib/GraphQL/loaders/functionsMutations.js +6 -17
  91. package/lib/GraphQL/loaders/parseClassMutations.js +6 -44
  92. package/lib/GraphQL/loaders/parseClassQueries.js +1 -26
  93. package/lib/GraphQL/loaders/parseClassTypes.js +10 -64
  94. package/lib/GraphQL/loaders/schemaDirectives.js +1 -17
  95. package/lib/GraphQL/loaders/schemaMutations.js +1 -20
  96. package/lib/GraphQL/loaders/schemaQueries.js +1 -14
  97. package/lib/GraphQL/loaders/schemaTypes.js +2 -6
  98. package/lib/GraphQL/loaders/usersMutations.js +6 -28
  99. package/lib/GraphQL/loaders/usersQueries.js +4 -26
  100. package/lib/GraphQL/parseGraphQLUtils.js +6 -19
  101. package/lib/GraphQL/transformers/className.js +1 -4
  102. package/lib/GraphQL/transformers/constraintType.js +1 -20
  103. package/lib/GraphQL/transformers/inputType.js +1 -20
  104. package/lib/GraphQL/transformers/mutation.js +6 -51
  105. package/lib/GraphQL/transformers/outputType.js +1 -20
  106. package/lib/GraphQL/transformers/query.js +6 -42
  107. package/lib/GraphQL/transformers/schemaFields.js +7 -34
  108. package/lib/KeyPromiseQueue.js +1 -12
  109. package/lib/LiveQuery/Client.js +1 -25
  110. package/lib/LiveQuery/Id.js +1 -7
  111. package/lib/LiveQuery/ParseCloudCodePublisher.js +13 -19
  112. package/lib/LiveQuery/ParseLiveQueryServer.js +92 -306
  113. package/lib/LiveQuery/ParsePubSub.js +1 -12
  114. package/lib/LiveQuery/ParseWebSocketServer.js +4 -26
  115. package/lib/LiveQuery/QueryTools.js +14 -116
  116. package/lib/LiveQuery/RequestSchema.js +1 -1
  117. package/lib/LiveQuery/SessionTokenCache.js +1 -17
  118. package/lib/LiveQuery/Subscription.js +4 -18
  119. package/lib/LiveQuery/equalObjects.js +2 -14
  120. package/lib/Options/Definitions.js +79 -10
  121. package/lib/Options/docs.js +23 -3
  122. package/lib/Options/index.js +4 -12
  123. package/lib/Options/parsers.js +1 -18
  124. package/lib/Page.js +1 -9
  125. package/lib/ParseMessageQueue.js +1 -10
  126. package/lib/ParseServer.js +144 -182
  127. package/lib/ParseServerRESTController.js +6 -33
  128. package/lib/PromiseRouter.js +16 -50
  129. package/lib/Push/PushQueue.js +3 -15
  130. package/lib/Push/PushWorker.js +7 -32
  131. package/lib/Push/utils.js +9 -38
  132. package/lib/RestQuery.js +105 -242
  133. package/lib/RestWrite.js +212 -377
  134. package/lib/Routers/AggregateRouter.js +14 -51
  135. package/lib/Routers/AnalyticsRouter.js +2 -8
  136. package/lib/Routers/AudiencesRouter.js +1 -15
  137. package/lib/Routers/ClassesRouter.js +3 -53
  138. package/lib/Routers/CloudCodeRouter.js +1 -19
  139. package/lib/Routers/FeaturesRouter.js +1 -10
  140. package/lib/Routers/FilesRouter.js +29 -76
  141. package/lib/Routers/FunctionsRouter.js +5 -28
  142. package/lib/Routers/GlobalConfigRouter.js +4 -18
  143. package/lib/Routers/GraphQLRouter.js +1 -14
  144. package/lib/Routers/HooksRouter.js +1 -29
  145. package/lib/Routers/IAPValidationRouter.js +6 -29
  146. package/lib/Routers/InstallationsRouter.js +2 -12
  147. package/lib/Routers/LogsRouter.js +4 -16
  148. package/lib/Routers/PagesRouter.js +69 -129
  149. package/lib/Routers/PublicAPIRouter.js +3 -62
  150. package/lib/Routers/PurgeRouter.js +1 -15
  151. package/lib/Routers/PushRouter.js +2 -18
  152. package/lib/Routers/RolesRouter.js +1 -7
  153. package/lib/Routers/SchemasRouter.js +4 -34
  154. package/lib/Routers/SecurityRouter.js +1 -12
  155. package/lib/Routers/SessionsRouter.js +3 -19
  156. package/lib/Routers/UsersRouter.js +58 -155
  157. package/lib/SchemaMigrations/DefinedSchemas.js +56 -115
  158. package/lib/SchemaMigrations/Migrations.js +2 -8
  159. package/lib/Security/Check.js +8 -16
  160. package/lib/Security/CheckGroup.js +4 -11
  161. package/lib/Security/CheckGroups/CheckGroupDatabase.js +8 -18
  162. package/lib/Security/CheckGroups/CheckGroupServerConfig.js +5 -15
  163. package/lib/Security/CheckGroups/CheckGroups.js +1 -4
  164. package/lib/Security/CheckRunner.js +22 -41
  165. package/lib/StatusHandler.js +12 -69
  166. package/lib/TestUtils.js +1 -6
  167. package/lib/Utils.js +27 -66
  168. package/lib/batch.js +17 -28
  169. package/lib/cache.js +1 -3
  170. package/lib/cli/definitions/parse-live-query-server.js +1 -3
  171. package/lib/cli/definitions/parse-server.js +1 -3
  172. package/lib/cli/parse-live-query-server.js +1 -6
  173. package/lib/cli/parse-server.js +11 -21
  174. package/lib/cli/utils/commander.js +13 -51
  175. package/lib/cli/utils/runner.js +1 -14
  176. package/lib/cloud-code/Parse.Cloud.js +71 -92
  177. package/lib/cryptoUtils.js +11 -19
  178. package/lib/defaults.js +2 -14
  179. package/lib/deprecated.js +1 -2
  180. package/lib/index.js +16 -34
  181. package/lib/logger.js +6 -13
  182. package/lib/middlewares.js +147 -151
  183. package/lib/password.js +6 -10
  184. package/lib/request.js +173 -2
  185. package/lib/requiredParameter.js +1 -3
  186. package/lib/rest.js +19 -41
  187. package/lib/triggers.js +54 -252
  188. package/lib/vendor/mongodbUrl.js +125 -305
  189. package/package.json +22 -19
  190. package/lib/cloud-code/HTTPResponse.js +0 -73
  191. package/lib/cloud-code/httpRequest.js +0 -192
package/lib/RestWrite.js CHANGED
@@ -4,46 +4,30 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = void 0;
7
-
8
7
  var _RestQuery = _interopRequireDefault(require("./RestQuery"));
9
-
10
8
  var _lodash = _interopRequireDefault(require("lodash"));
11
-
12
9
  var _logger = _interopRequireDefault(require("./logger"));
13
-
14
10
  var _SchemaController = require("./Controllers/SchemaController");
15
-
16
11
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
17
-
18
- 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; }
19
-
20
- 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; }
21
-
22
- 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; }
23
-
12
+ 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; }
13
+ 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; }
14
+ 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; }
15
+ function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
16
+ 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); }
24
17
  // A RestWrite encapsulates everything we need to run an operation
25
18
  // that writes to the database.
26
19
  // This could be either a "create" or an "update".
27
- var SchemaController = require('./Controllers/SchemaController');
28
20
 
21
+ var SchemaController = require('./Controllers/SchemaController');
29
22
  var deepcopy = require('deepcopy');
30
-
31
23
  const Auth = require('./Auth');
32
-
33
24
  const Utils = require('./Utils');
34
-
35
25
  var cryptoUtils = require('./cryptoUtils');
36
-
37
26
  var passwordCrypto = require('./password');
38
-
39
27
  var Parse = require('parse/node');
40
-
41
28
  var triggers = require('./triggers');
42
-
43
29
  var ClientSDK = require('./ClientSDK');
44
-
45
30
  const util = require('util');
46
-
47
31
  // query and data are both provided in REST API format. So data
48
32
  // types are encoded by plain old objects.
49
33
  // If query is null, this is a "create" and the data in data should be
@@ -57,7 +41,6 @@ function RestWrite(config, auth, className, query, data, originalData, clientSDK
57
41
  if (auth.isReadOnly) {
58
42
  throw new Parse.Error(Parse.Error.OPERATION_FORBIDDEN, 'Cannot perform a write operation when using readOnlyMasterKey');
59
43
  }
60
-
61
44
  this.config = config;
62
45
  this.auth = auth;
63
46
  this.className = className;
@@ -65,11 +48,9 @@ function RestWrite(config, auth, className, query, data, originalData, clientSDK
65
48
  this.storage = {};
66
49
  this.runOptions = {};
67
50
  this.context = context || {};
68
-
69
51
  if (action) {
70
52
  this.runOptions.action = action;
71
53
  }
72
-
73
54
  if (!query) {
74
55
  if (this.config.allowCustomObjectId) {
75
56
  if (Object.prototype.hasOwnProperty.call(data, 'objectId') && !data.objectId) {
@@ -79,38 +60,43 @@ function RestWrite(config, auth, className, query, data, originalData, clientSDK
79
60
  if (data.objectId) {
80
61
  throw new Parse.Error(Parse.Error.INVALID_KEY_NAME, 'objectId is an invalid field name.');
81
62
  }
82
-
83
63
  if (data.id) {
84
64
  throw new Parse.Error(Parse.Error.INVALID_KEY_NAME, 'id is an invalid field name.');
85
65
  }
86
66
  }
87
67
  }
68
+ this.checkProhibitedKeywords(data);
88
69
 
89
- this.checkProhibitedKeywords(data); // When the operation is complete, this.response may have several
70
+ // When the operation is complete, this.response may have several
90
71
  // fields.
91
72
  // response: the actual data to be returned
92
73
  // status: the http status code. if not present, treated like a 200
93
74
  // location: the location header. if not present, no location header
75
+ this.response = null;
94
76
 
95
- this.response = null; // Processing this operation may mutate our data, so we operate on a
77
+ // Processing this operation may mutate our data, so we operate on a
96
78
  // copy
97
-
98
79
  this.query = deepcopy(query);
99
- this.data = deepcopy(data); // We never change originalData, so we do not need a deep copy
80
+ this.data = deepcopy(data);
81
+ // We never change originalData, so we do not need a deep copy
82
+ this.originalData = originalData;
100
83
 
101
- this.originalData = originalData; // The timestamp we'll use for this whole operation
84
+ // The timestamp we'll use for this whole operation
85
+ this.updatedAt = Parse._encode(new Date()).iso;
102
86
 
103
- this.updatedAt = Parse._encode(new Date()).iso; // Shared SchemaController to be reused to reduce the number of loadSchema() calls per request
87
+ // Shared SchemaController to be reused to reduce the number of loadSchema() calls per request
104
88
  // Once set the schemaData should be immutable
105
-
106
89
  this.validSchemaController = null;
107
- this.pendingOps = {};
108
- } // A convenient method to perform all the steps of processing the
90
+ this.pendingOps = {
91
+ operations: null,
92
+ identifier: null
93
+ };
94
+ }
95
+
96
+ // A convenient method to perform all the steps of processing the
109
97
  // write, in order.
110
98
  // Returns a promise for a {response, status, location} object.
111
99
  // status and location are optional.
112
-
113
-
114
100
  RestWrite.prototype.execute = function () {
115
101
  return Promise.resolve().then(() => {
116
102
  return this.getUserAndRoleACL();
@@ -156,19 +142,16 @@ RestWrite.prototype.execute = function () {
156
142
  this.response.response.authDataResponse = this.authDataResponse;
157
143
  }
158
144
  }
159
-
160
145
  return this.response;
161
146
  });
162
- }; // Uses the Auth object to get the list of roles, adds the user id
163
-
147
+ };
164
148
 
149
+ // Uses the Auth object to get the list of roles, adds the user id
165
150
  RestWrite.prototype.getUserAndRoleACL = function () {
166
151
  if (this.auth.isMaster) {
167
152
  return Promise.resolve();
168
153
  }
169
-
170
154
  this.runOptions.acl = ['*'];
171
-
172
155
  if (this.auth.user) {
173
156
  return this.auth.getUserRoles().then(roles => {
174
157
  this.runOptions.acl = this.runOptions.acl.concat(roles, [this.auth.user.id]);
@@ -177,9 +160,9 @@ RestWrite.prototype.getUserAndRoleACL = function () {
177
160
  } else {
178
161
  return Promise.resolve();
179
162
  }
180
- }; // Validates this operation against the allowClientClassCreation config.
181
-
163
+ };
182
164
 
165
+ // Validates this operation against the allowClientClassCreation config.
183
166
  RestWrite.prototype.validateClientClassCreation = function () {
184
167
  if (this.config.allowClientClassCreation === false && !this.auth.isMaster && SchemaController.systemClasses.indexOf(this.className) === -1) {
185
168
  return this.config.database.loadSchema().then(schemaController => schemaController.hasClass(this.className)).then(hasClass => {
@@ -190,45 +173,46 @@ RestWrite.prototype.validateClientClassCreation = function () {
190
173
  } else {
191
174
  return Promise.resolve();
192
175
  }
193
- }; // Validates this operation against the schema.
194
-
176
+ };
195
177
 
178
+ // Validates this operation against the schema.
196
179
  RestWrite.prototype.validateSchema = function () {
197
180
  return this.config.database.validateObject(this.className, this.data, this.query, this.runOptions);
198
- }; // Runs any beforeSave triggers against this operation.
199
- // Any change leads to our data being mutated.
200
-
181
+ };
201
182
 
183
+ // Runs any beforeSave triggers against this operation.
184
+ // Any change leads to our data being mutated.
202
185
  RestWrite.prototype.runBeforeSaveTrigger = function () {
203
186
  if (this.response || this.runOptions.many) {
204
187
  return;
205
- } // Avoid doing any setup for triggers if there is no 'beforeSave' trigger for this class.
206
-
188
+ }
207
189
 
190
+ // Avoid doing any setup for triggers if there is no 'beforeSave' trigger for this class.
208
191
  if (!triggers.triggerExists(this.className, triggers.Types.beforeSave, this.config.applicationId)) {
209
192
  return Promise.resolve();
210
193
  }
211
-
212
194
  const {
213
195
  originalObject,
214
196
  updatedObject
215
197
  } = this.buildParseObjects();
198
+ const identifier = updatedObject._getStateIdentifier();
216
199
  const stateController = Parse.CoreManager.getObjectStateController();
217
- const [pending] = stateController.getPendingOps(updatedObject._getStateIdentifier());
218
- this.pendingOps = _objectSpread({}, pending);
200
+ const [pending] = stateController.getPendingOps(identifier);
201
+ this.pendingOps = {
202
+ operations: _objectSpread({}, pending),
203
+ identifier
204
+ };
219
205
  return Promise.resolve().then(() => {
220
206
  // Before calling the trigger, validate the permissions for the save operation
221
207
  let databasePromise = null;
222
-
223
208
  if (this.query) {
224
209
  // Validate for updating
225
210
  databasePromise = this.config.database.update(this.className, this.query, this.data, this.runOptions, true, true);
226
211
  } else {
227
212
  // Validate for creating
228
213
  databasePromise = this.config.database.create(this.className, this.data, this.runOptions, true);
229
- } // In the case that there is no permission for the operation, it throws an error
230
-
231
-
214
+ }
215
+ // In the case that there is no permission for the operation, it throws an error
232
216
  return databasePromise.then(result => {
233
217
  if (!result || result.length <= 0) {
234
218
  throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'Object not found.');
@@ -242,48 +226,44 @@ RestWrite.prototype.runBeforeSaveTrigger = function () {
242
226
  if (!_lodash.default.isEqual(this.data[key], value)) {
243
227
  result.push(key);
244
228
  }
245
-
246
229
  return result;
247
230
  }, []);
248
- this.data = response.object; // We should delete the objectId for an update write
249
-
231
+ this.data = response.object;
232
+ // We should delete the objectId for an update write
250
233
  if (this.query && this.query.objectId) {
251
234
  delete this.data.objectId;
252
235
  }
253
236
  }
254
-
255
237
  this.checkProhibitedKeywords(this.data);
256
238
  });
257
239
  };
258
-
259
240
  RestWrite.prototype.runBeforeLoginTrigger = async function (userData) {
260
241
  // Avoid doing any setup for triggers if there is no 'beforeLogin' trigger
261
242
  if (!triggers.triggerExists(this.className, triggers.Types.beforeLogin, this.config.applicationId)) {
262
243
  return;
263
- } // Cloud code gets a bit of extra data for its objects
264
-
244
+ }
265
245
 
246
+ // Cloud code gets a bit of extra data for its objects
266
247
  const extraData = {
267
248
  className: this.className
268
- }; // Expand file objects
249
+ };
269
250
 
251
+ // Expand file objects
270
252
  this.config.filesController.expandFilesInObject(this.config, userData);
271
- const user = triggers.inflate(extraData, userData); // no need to return a response
253
+ const user = triggers.inflate(extraData, userData);
272
254
 
255
+ // no need to return a response
273
256
  await triggers.maybeRunTrigger(triggers.Types.beforeLogin, this.auth, user, null, this.config, this.context);
274
257
  };
275
-
276
258
  RestWrite.prototype.setRequiredFieldsIfNeeded = function () {
277
259
  if (this.data) {
278
260
  return this.validSchemaController.getAllClasses().then(allClasses => {
279
261
  const schema = allClasses.find(oneClass => oneClass.className === this.className);
280
-
281
262
  const setRequiredFieldIfNeeded = (fieldName, setDefault) => {
282
263
  if (this.data[fieldName] === undefined || this.data[fieldName] === null || this.data[fieldName] === '' || typeof this.data[fieldName] === 'object' && this.data[fieldName].__op === 'Delete') {
283
264
  if (setDefault && schema.fields[fieldName] && schema.fields[fieldName].defaultValue !== null && schema.fields[fieldName].defaultValue !== undefined && (this.data[fieldName] === undefined || typeof this.data[fieldName] === 'object' && this.data[fieldName].__op === 'Delete')) {
284
265
  this.data[fieldName] = schema.fields[fieldName].defaultValue;
285
266
  this.storage.fieldsChangedByTrigger = this.storage.fieldsChangedByTrigger || [];
286
-
287
267
  if (this.storage.fieldsChangedByTrigger.indexOf(fieldName) < 0) {
288
268
  this.storage.fieldsChangedByTrigger.push(fieldName);
289
269
  }
@@ -291,18 +271,17 @@ RestWrite.prototype.setRequiredFieldsIfNeeded = function () {
291
271
  throw new Parse.Error(Parse.Error.VALIDATION_ERROR, `${fieldName} is required`);
292
272
  }
293
273
  }
294
- }; // Add default fields
295
-
274
+ };
296
275
 
276
+ // Add default fields
297
277
  this.data.updatedAt = this.updatedAt;
298
-
299
278
  if (!this.query) {
300
- this.data.createdAt = this.updatedAt; // Only assign new objectId if we are creating new object
279
+ this.data.createdAt = this.updatedAt;
301
280
 
281
+ // Only assign new objectId if we are creating new object
302
282
  if (!this.data.objectId) {
303
283
  this.data.objectId = cryptoUtils.newObjectId(this.config.objectIdSize);
304
284
  }
305
-
306
285
  if (schema) {
307
286
  Object.keys(schema.fields).forEach(fieldName => {
308
287
  setRequiredFieldIfNeeded(fieldName, true);
@@ -315,31 +294,26 @@ RestWrite.prototype.setRequiredFieldsIfNeeded = function () {
315
294
  }
316
295
  });
317
296
  }
318
-
319
297
  return Promise.resolve();
320
- }; // Transforms auth data for a user object.
298
+ };
299
+
300
+ // Transforms auth data for a user object.
321
301
  // Does nothing if this isn't a user object.
322
302
  // Returns a promise for when we're done if it can't finish this tick.
323
-
324
-
325
303
  RestWrite.prototype.validateAuthData = function () {
326
304
  if (this.className !== '_User') {
327
305
  return;
328
306
  }
329
-
330
307
  const authData = this.data.authData;
331
308
  const hasUsernameAndPassword = typeof this.data.username === 'string' && typeof this.data.password === 'string';
332
-
333
309
  if (!this.query && !authData) {
334
310
  if (typeof this.data.username !== 'string' || _lodash.default.isEmpty(this.data.username)) {
335
311
  throw new Parse.Error(Parse.Error.USERNAME_MISSING, 'bad or missing username');
336
312
  }
337
-
338
313
  if (typeof this.data.password !== 'string' || _lodash.default.isEmpty(this.data.password)) {
339
314
  throw new Parse.Error(Parse.Error.PASSWORD_MISSING, 'password is required');
340
315
  }
341
316
  }
342
-
343
317
  if (authData && !Object.keys(authData).length || !Object.prototype.hasOwnProperty.call(this.data, 'authData')) {
344
318
  // Nothing to validate here
345
319
  return;
@@ -347,104 +321,89 @@ RestWrite.prototype.validateAuthData = function () {
347
321
  // Handle saving authData to null
348
322
  throw new Parse.Error(Parse.Error.UNSUPPORTED_SERVICE, 'This authentication method is unsupported.');
349
323
  }
350
-
351
324
  var providers = Object.keys(authData);
352
-
353
325
  if (providers.length > 0) {
354
326
  const canHandleAuthData = providers.some(provider => {
355
327
  var providerAuthData = authData[provider];
356
328
  var hasToken = providerAuthData && providerAuthData.id;
357
329
  return hasToken || providerAuthData === null;
358
330
  });
359
-
360
331
  if (canHandleAuthData || hasUsernameAndPassword || this.auth.isMaster || this.getUserId()) {
361
332
  return this.handleAuthData(authData);
362
333
  }
363
334
  }
364
-
365
335
  throw new Parse.Error(Parse.Error.UNSUPPORTED_SERVICE, 'This authentication method is unsupported.');
366
336
  };
367
-
368
337
  RestWrite.prototype.filteredObjectsByACL = function (objects) {
369
338
  if (this.auth.isMaster) {
370
339
  return objects;
371
340
  }
372
-
373
341
  return objects.filter(object => {
374
342
  if (!object.ACL) {
375
343
  return true; // legacy users that have no ACL field on them
376
- } // Regular users that have been locked out.
377
-
378
-
344
+ }
345
+ // Regular users that have been locked out.
379
346
  return object.ACL && Object.keys(object.ACL).length > 0;
380
347
  });
381
348
  };
382
-
383
349
  RestWrite.prototype.getUserId = function () {
384
350
  if (this.query && this.query.objectId && this.className === '_User') {
385
351
  return this.query.objectId;
386
352
  } else if (this.auth && this.auth.user && this.auth.user.id) {
387
353
  return this.auth.user.id;
388
354
  }
389
- }; // Developers are allowed to change authData via before save trigger
355
+ };
356
+
357
+ // Developers are allowed to change authData via before save trigger
390
358
  // we need after before save to ensure that the developer
391
359
  // is not currently duplicating auth data ID
392
-
393
-
394
360
  RestWrite.prototype.ensureUniqueAuthDataId = async function () {
395
361
  if (this.className !== '_User' || !this.data.authData) {
396
362
  return;
397
363
  }
398
-
399
364
  const hasAuthDataId = Object.keys(this.data.authData).some(key => this.data.authData[key] && this.data.authData[key].id);
400
365
  if (!hasAuthDataId) return;
401
366
  const r = await Auth.findUsersWithAuthData(this.config, this.data.authData);
402
367
  const results = this.filteredObjectsByACL(r);
403
-
404
368
  if (results.length > 1) {
405
369
  throw new Parse.Error(Parse.Error.ACCOUNT_ALREADY_LINKED, 'this auth is already used');
406
- } // use data.objectId in case of login time and found user during handle validateAuthData
407
-
408
-
370
+ }
371
+ // use data.objectId in case of login time and found user during handle validateAuthData
409
372
  const userId = this.getUserId() || this.data.objectId;
410
-
411
373
  if (results.length === 1 && userId !== results[0].objectId) {
412
374
  throw new Parse.Error(Parse.Error.ACCOUNT_ALREADY_LINKED, 'this auth is already used');
413
375
  }
414
376
  };
415
-
416
377
  RestWrite.prototype.handleAuthData = async function (authData) {
417
378
  const r = await Auth.findUsersWithAuthData(this.config, authData);
418
379
  const results = this.filteredObjectsByACL(r);
419
-
420
380
  if (results.length > 1) {
421
381
  // To avoid https://github.com/parse-community/parse-server/security/advisories/GHSA-8w3j-g983-8jh5
422
382
  // Let's run some validation before throwing
423
383
  await Auth.handleAuthDataValidation(authData, this, results[0]);
424
384
  throw new Parse.Error(Parse.Error.ACCOUNT_ALREADY_LINKED, 'this auth is already used');
425
- } // No user found with provided authData we need to validate
426
-
385
+ }
427
386
 
387
+ // No user found with provided authData we need to validate
428
388
  if (!results.length) {
429
389
  const {
430
390
  authData: validatedAuthData,
431
391
  authDataResponse
432
392
  } = await Auth.handleAuthDataValidation(authData, this);
433
- this.authDataResponse = authDataResponse; // Replace current authData by the new validated one
434
-
393
+ this.authDataResponse = authDataResponse;
394
+ // Replace current authData by the new validated one
435
395
  this.data.authData = validatedAuthData;
436
396
  return;
437
- } // User found with provided authData
438
-
397
+ }
439
398
 
399
+ // User found with provided authData
440
400
  if (results.length === 1) {
441
401
  const userId = this.getUserId();
442
- const userResult = results[0]; // Prevent duplicate authData id
443
-
402
+ const userResult = results[0];
403
+ // Prevent duplicate authData id
444
404
  if (userId && userId !== userResult.objectId) {
445
405
  throw new Parse.Error(Parse.Error.ACCOUNT_ALREADY_LINKED, 'this auth is already used');
446
406
  }
447
-
448
407
  this.storage.authProvider = Object.keys(authData).join(',');
449
408
  const {
450
409
  hasMutatedAuthData,
@@ -452,56 +411,57 @@ RestWrite.prototype.handleAuthData = async function (authData) {
452
411
  } = Auth.hasMutatedAuthData(authData, userResult.authData);
453
412
  const isCurrentUserLoggedOrMaster = this.auth && this.auth.user && this.auth.user.id === userResult.objectId || this.auth.isMaster;
454
413
  const isLogin = !userId;
455
-
456
414
  if (isLogin || isCurrentUserLoggedOrMaster) {
457
415
  // no user making the call
458
416
  // OR the user making the call is the right one
459
417
  // Login with auth data
460
- delete results[0].password; // need to set the objectId first otherwise location has trailing undefined
418
+ delete results[0].password;
461
419
 
420
+ // need to set the objectId first otherwise location has trailing undefined
462
421
  this.data.objectId = userResult.objectId;
463
-
464
422
  if (!this.query || !this.query.objectId) {
465
423
  this.response = {
466
424
  response: userResult,
467
425
  location: this.location()
468
- }; // Run beforeLogin hook before storing any updates
426
+ };
427
+ // Run beforeLogin hook before storing any updates
469
428
  // to authData on the db; changes to userResult
470
429
  // will be ignored.
430
+ await this.runBeforeLoginTrigger(deepcopy(userResult));
471
431
 
472
- await this.runBeforeLoginTrigger(deepcopy(userResult)); // If we are in login operation via authData
432
+ // If we are in login operation via authData
473
433
  // we need to be sure that the user has provided
474
434
  // required authData
475
-
476
435
  Auth.checkIfUserHasProvidedConfiguredProvidersForLogin(authData, userResult.authData, this.config);
477
- } // Prevent validating if no mutated data detected on update
478
-
436
+ }
479
437
 
438
+ // Prevent validating if no mutated data detected on update
480
439
  if (!hasMutatedAuthData && isCurrentUserLoggedOrMaster) {
481
440
  return;
482
- } // Force to validate all provided authData on login
483
- // on update only validate mutated ones
484
-
441
+ }
485
442
 
443
+ // Force to validate all provided authData on login
444
+ // on update only validate mutated ones
486
445
  if (hasMutatedAuthData || !this.config.allowExpiredAuthDataToken) {
487
446
  const res = await Auth.handleAuthDataValidation(isLogin ? authData : mutatedAuthData, this, userResult);
488
447
  this.data.authData = res.authData;
489
448
  this.authDataResponse = res.authDataResponse;
490
- } // IF we are in login we'll skip the database operation / beforeSave / afterSave etc...
449
+ }
450
+
451
+ // IF we are in login we'll skip the database operation / beforeSave / afterSave etc...
491
452
  // we need to set it up there.
492
453
  // We are supposed to have a response only on LOGIN with authData, so we skip those
493
454
  // If we're not logging in, but just updating the current user, we can safely skip that part
494
-
495
-
496
455
  if (this.response) {
497
456
  // Assign the new authData in the response
498
457
  Object.keys(mutatedAuthData).forEach(provider => {
499
458
  this.response.response.authData[provider] = mutatedAuthData[provider];
500
- }); // Run the DB update directly, as 'master' only if authData contains some keys
459
+ });
460
+
461
+ // Run the DB update directly, as 'master' only if authData contains some keys
501
462
  // authData could not contains keys after validation if the authAdapter
502
463
  // uses the `doNotSave` option. Just update the authData part
503
464
  // Then we're good for the user, early exit of sorts
504
-
505
465
  if (Object.keys(this.data.authData).length) {
506
466
  await this.config.database.update(this.className, {
507
467
  objectId: this.data.objectId
@@ -512,22 +472,20 @@ RestWrite.prototype.handleAuthData = async function (authData) {
512
472
  }
513
473
  }
514
474
  }
515
- }; // The non-third-party parts of User transformation
516
-
475
+ };
517
476
 
477
+ // The non-third-party parts of User transformation
518
478
  RestWrite.prototype.transformUser = function () {
519
479
  var promise = Promise.resolve();
520
-
521
480
  if (this.className !== '_User') {
522
481
  return promise;
523
482
  }
524
-
525
483
  if (!this.auth.isMaster && 'emailVerified' in this.data) {
526
484
  const error = `Clients aren't allowed to manually update email verification.`;
527
485
  throw new Parse.Error(Parse.Error.OPERATION_FORBIDDEN, error);
528
- } // Do not cleanup session if objectId is not set
529
-
486
+ }
530
487
 
488
+ // Do not cleanup session if objectId is not set
531
489
  if (this.query && this.objectId()) {
532
490
  // If we're updating a _User object, we need to clear out the cache for that user. Find all their
533
491
  // session tokens, and remove them from the cache.
@@ -541,22 +499,19 @@ RestWrite.prototype.transformUser = function () {
541
499
  results.results.forEach(session => this.config.cacheController.user.del(session.sessionToken));
542
500
  });
543
501
  }
544
-
545
502
  return promise.then(() => {
546
503
  // Transform the password
547
504
  if (this.data.password === undefined) {
548
505
  // ignore only if undefined. should proceed if empty ('')
549
506
  return Promise.resolve();
550
507
  }
551
-
552
508
  if (this.query) {
553
- this.storage['clearSessions'] = true; // Generate a new session only if the user requested
554
-
509
+ this.storage['clearSessions'] = true;
510
+ // Generate a new session only if the user requested
555
511
  if (!this.auth.isMaster) {
556
512
  this.storage['generateNewSession'] = true;
557
513
  }
558
514
  }
559
-
560
515
  return this._validatePasswordPolicy().then(() => {
561
516
  return passwordCrypto.hash(this.data.password).then(hashedPassword => {
562
517
  this.data._hashed_password = hashedPassword;
@@ -569,7 +524,6 @@ RestWrite.prototype.transformUser = function () {
569
524
  return this._validateEmail();
570
525
  });
571
526
  };
572
-
573
527
  RestWrite.prototype._validateUserName = function () {
574
528
  // Check for username uniqueness
575
529
  if (!this.data.username) {
@@ -577,7 +531,6 @@ RestWrite.prototype._validateUserName = function () {
577
531
  this.data.username = cryptoUtils.randomString(25);
578
532
  this.responseShouldHaveUsername = true;
579
533
  }
580
-
581
534
  return Promise.resolve();
582
535
  }
583
536
  /*
@@ -586,8 +539,6 @@ RestWrite.prototype._validateUserName = function () {
586
539
  login using the case they entered. I.e. 'Snoopy' should preclude
587
540
  'snoopy' as a valid username.
588
541
  */
589
-
590
-
591
542
  return this.config.database.find(this.className, {
592
543
  username: this.data.username,
593
544
  objectId: {
@@ -600,10 +551,10 @@ RestWrite.prototype._validateUserName = function () {
600
551
  if (results.length > 0) {
601
552
  throw new Parse.Error(Parse.Error.USERNAME_TAKEN, 'Account already exists for this username.');
602
553
  }
603
-
604
554
  return;
605
555
  });
606
556
  };
557
+
607
558
  /*
608
559
  As with usernames, Parse should not allow case insensitive collisions of email.
609
560
  unlike with usernames (which can have case insensitive collisions in the case of
@@ -616,19 +567,15 @@ RestWrite.prototype._validateUserName = function () {
616
567
  Given that this lookup should be a relatively low use case and that the case sensitive
617
568
  unique index will be used by the db for the query, this is an adequate solution.
618
569
  */
619
-
620
-
621
570
  RestWrite.prototype._validateEmail = function () {
622
571
  if (!this.data.email || this.data.email.__op === 'Delete') {
623
572
  return Promise.resolve();
624
- } // Validate basic email address format
625
-
626
-
573
+ }
574
+ // Validate basic email address format
627
575
  if (!this.data.email.match(/^.+@.+$/)) {
628
576
  return Promise.reject(new Parse.Error(Parse.Error.INVALID_EMAIL_ADDRESS, 'Email address format is invalid.'));
629
- } // Case insensitive match, see note above function.
630
-
631
-
577
+ }
578
+ // Case insensitive match, see note above function.
632
579
  return this.config.database.find(this.className, {
633
580
  email: this.data.email,
634
581
  objectId: {
@@ -641,7 +588,6 @@ RestWrite.prototype._validateEmail = function () {
641
588
  if (results.length > 0) {
642
589
  throw new Parse.Error(Parse.Error.EMAIL_TAKEN, 'Account already exists for this email address.');
643
590
  }
644
-
645
591
  if (!this.data.authData || !Object.keys(this.data.authData).length || Object.keys(this.data.authData).length === 1 && Object.keys(this.data.authData)[0] === 'anonymous') {
646
592
  // We updated the email, send a new validation
647
593
  this.storage['sendVerificationEmail'] = true;
@@ -649,14 +595,12 @@ RestWrite.prototype._validateEmail = function () {
649
595
  }
650
596
  });
651
597
  };
652
-
653
598
  RestWrite.prototype._validatePasswordPolicy = function () {
654
599
  if (!this.config.passwordPolicy) return Promise.resolve();
655
600
  return this._validatePasswordRequirements().then(() => {
656
601
  return this._validatePasswordHistory();
657
602
  });
658
603
  };
659
-
660
604
  RestWrite.prototype._validatePasswordRequirements = function () {
661
605
  // check if the password conforms to the defined password policy if configured
662
606
  // If we specified a custom error in our configuration use it.
@@ -667,13 +611,14 @@ RestWrite.prototype._validatePasswordRequirements = function () {
667
611
  // a. making the user guess whats wrong
668
612
  // b. making a custom password reset page that shows the requirements
669
613
  const policyError = this.config.passwordPolicy.validationError ? this.config.passwordPolicy.validationError : 'Password does not meet the Password Policy requirements.';
670
- const containsUsernameError = 'Password cannot contain your username.'; // check whether the password meets the password strength requirements
614
+ const containsUsernameError = 'Password cannot contain your username.';
671
615
 
616
+ // check whether the password meets the password strength requirements
672
617
  if (this.config.passwordPolicy.patternValidator && !this.config.passwordPolicy.patternValidator(this.data.password) || this.config.passwordPolicy.validatorCallback && !this.config.passwordPolicy.validatorCallback(this.data.password)) {
673
618
  return Promise.reject(new Parse.Error(Parse.Error.VALIDATION_ERROR, policyError));
674
- } // check whether password contain username
675
-
619
+ }
676
620
 
621
+ // check whether password contain username
677
622
  if (this.config.passwordPolicy.doNotAllowUsername === true) {
678
623
  if (this.data.username) {
679
624
  // username is not passed during password reset
@@ -686,16 +631,13 @@ RestWrite.prototype._validatePasswordRequirements = function () {
686
631
  if (results.length != 1) {
687
632
  throw undefined;
688
633
  }
689
-
690
634
  if (this.data.password.indexOf(results[0].username) >= 0) return Promise.reject(new Parse.Error(Parse.Error.VALIDATION_ERROR, containsUsernameError));
691
635
  return Promise.resolve();
692
636
  });
693
637
  }
694
638
  }
695
-
696
639
  return Promise.resolve();
697
640
  };
698
-
699
641
  RestWrite.prototype._validatePasswordHistory = function () {
700
642
  // check whether password is repeating from specified history
701
643
  if (this.query && this.config.passwordPolicy.maxPasswordHistory) {
@@ -707,51 +649,49 @@ RestWrite.prototype._validatePasswordHistory = function () {
707
649
  if (results.length != 1) {
708
650
  throw undefined;
709
651
  }
710
-
711
652
  const user = results[0];
712
653
  let oldPasswords = [];
713
654
  if (user._password_history) oldPasswords = _lodash.default.take(user._password_history, this.config.passwordPolicy.maxPasswordHistory - 1);
714
655
  oldPasswords.push(user.password);
715
- const newPassword = this.data.password; // compare the new password hash with all old password hashes
716
-
656
+ const newPassword = this.data.password;
657
+ // compare the new password hash with all old password hashes
717
658
  const promises = oldPasswords.map(function (hash) {
718
659
  return passwordCrypto.compare(newPassword, hash).then(result => {
719
- if (result) // reject if there is a match
660
+ if (result)
661
+ // reject if there is a match
720
662
  return Promise.reject('REPEAT_PASSWORD');
721
663
  return Promise.resolve();
722
664
  });
723
- }); // wait for all comparisons to complete
724
-
665
+ });
666
+ // wait for all comparisons to complete
725
667
  return Promise.all(promises).then(() => {
726
668
  return Promise.resolve();
727
669
  }).catch(err => {
728
- if (err === 'REPEAT_PASSWORD') // a match was found
670
+ if (err === 'REPEAT_PASSWORD')
671
+ // a match was found
729
672
  return Promise.reject(new Parse.Error(Parse.Error.VALIDATION_ERROR, `New password should not be the same as last ${this.config.passwordPolicy.maxPasswordHistory} passwords.`));
730
673
  throw err;
731
674
  });
732
675
  });
733
676
  }
734
-
735
677
  return Promise.resolve();
736
678
  };
737
-
738
679
  RestWrite.prototype.createSessionTokenIfNeeded = function () {
739
680
  if (this.className !== '_User') {
740
681
  return;
741
- } // Don't generate session for updating user (this.query is set) unless authData exists
742
-
743
-
682
+ }
683
+ // Don't generate session for updating user (this.query is set) unless authData exists
744
684
  if (this.query && !this.data.authData) {
745
685
  return;
746
- } // Don't generate new sessionToken if linking via sessionToken
747
-
748
-
686
+ }
687
+ // Don't generate new sessionToken if linking via sessionToken
749
688
  if (this.auth.user && this.data.authData) {
750
689
  return;
751
690
  }
752
-
753
- if (!this.storage.authProvider && // signup call, with
754
- this.config.preventLoginWithUnverifiedEmail && // no login without verification
691
+ if (!this.storage.authProvider &&
692
+ // signup call, with
693
+ this.config.preventLoginWithUnverifiedEmail &&
694
+ // no login without verification
755
695
  this.config.verifyUserEmails) {
756
696
  // verification is on
757
697
  return; // do not create the session token in that case!
@@ -759,18 +699,15 @@ RestWrite.prototype.createSessionTokenIfNeeded = function () {
759
699
 
760
700
  return this.createSessionToken();
761
701
  };
762
-
763
702
  RestWrite.prototype.createSessionToken = async function () {
764
703
  // cloud installationId from Cloud Code,
765
704
  // never create session tokens from there.
766
705
  if (this.auth.installationId && this.auth.installationId === 'cloud') {
767
706
  return;
768
707
  }
769
-
770
708
  if (this.storage.authProvider == null && this.data.authData) {
771
709
  this.storage.authProvider = Object.keys(this.data.authData).join(',');
772
710
  }
773
-
774
711
  const {
775
712
  sessionData,
776
713
  createSession
@@ -782,14 +719,11 @@ RestWrite.prototype.createSessionToken = async function () {
782
719
  },
783
720
  installationId: this.auth.installationId
784
721
  });
785
-
786
722
  if (this.response && this.response.response) {
787
723
  this.response.response.sessionToken = sessionData.sessionToken;
788
724
  }
789
-
790
725
  return createSession();
791
726
  };
792
-
793
727
  RestWrite.createSession = function (config, {
794
728
  userId,
795
729
  createdWith,
@@ -808,25 +742,22 @@ RestWrite.createSession = function (config, {
808
742
  createdWith,
809
743
  expiresAt: Parse._encode(expiresAt)
810
744
  };
811
-
812
745
  if (installationId) {
813
746
  sessionData.installationId = installationId;
814
747
  }
815
-
816
748
  Object.assign(sessionData, additionalSessionData);
817
749
  return {
818
750
  sessionData,
819
751
  createSession: () => new RestWrite(config, Auth.master(config), '_Session', null, sessionData).execute()
820
752
  };
821
- }; // Delete email reset tokens if user is changing password or email.
822
-
753
+ };
823
754
 
755
+ // Delete email reset tokens if user is changing password or email.
824
756
  RestWrite.prototype.deleteEmailResetTokenIfNeeded = function () {
825
757
  if (this.className !== '_User' || this.query === null) {
826
758
  // null query means create
827
759
  return;
828
760
  }
829
-
830
761
  if ('password' in this.data || 'email' in this.data) {
831
762
  const addOps = {
832
763
  _perishable_token: {
@@ -839,28 +770,23 @@ RestWrite.prototype.deleteEmailResetTokenIfNeeded = function () {
839
770
  this.data = Object.assign(this.data, addOps);
840
771
  }
841
772
  };
842
-
843
773
  RestWrite.prototype.destroyDuplicatedSessions = function () {
844
774
  // Only for _Session, and at creation time
845
775
  if (this.className != '_Session' || this.query) {
846
776
  return;
847
- } // Destroy the sessions in 'Background'
848
-
849
-
777
+ }
778
+ // Destroy the sessions in 'Background'
850
779
  const {
851
780
  user,
852
781
  installationId,
853
782
  sessionToken
854
783
  } = this.data;
855
-
856
784
  if (!user || !installationId) {
857
785
  return;
858
786
  }
859
-
860
787
  if (!user.objectId) {
861
788
  return;
862
789
  }
863
-
864
790
  this.config.database.destroy('_Session', {
865
791
  user,
866
792
  installationId,
@@ -868,9 +794,9 @@ RestWrite.prototype.destroyDuplicatedSessions = function () {
868
794
  $ne: sessionToken
869
795
  }
870
796
  }, {}, this.validSchemaController);
871
- }; // Handles any followup logic
872
-
797
+ };
873
798
 
799
+ // Handles any followup logic
874
800
  RestWrite.prototype.handleFollowup = function () {
875
801
  if (this.storage && this.storage['clearSessions'] && this.config.revokeSessionOnPasswordReset) {
876
802
  var sessionQuery = {
@@ -883,36 +809,32 @@ RestWrite.prototype.handleFollowup = function () {
883
809
  delete this.storage['clearSessions'];
884
810
  return this.config.database.destroy('_Session', sessionQuery).then(this.handleFollowup.bind(this));
885
811
  }
886
-
887
812
  if (this.storage && this.storage['generateNewSession']) {
888
813
  delete this.storage['generateNewSession'];
889
814
  return this.createSessionToken().then(this.handleFollowup.bind(this));
890
815
  }
891
-
892
816
  if (this.storage && this.storage['sendVerificationEmail']) {
893
- delete this.storage['sendVerificationEmail']; // Fire and forget!
894
-
817
+ delete this.storage['sendVerificationEmail'];
818
+ // Fire and forget!
895
819
  this.config.userController.sendVerificationEmail(this.data);
896
820
  return this.handleFollowup.bind(this);
897
821
  }
898
- }; // Handles the _Session class specialness.
899
- // Does nothing if this isn't an _Session object.
900
-
822
+ };
901
823
 
824
+ // Handles the _Session class specialness.
825
+ // Does nothing if this isn't an _Session object.
902
826
  RestWrite.prototype.handleSession = function () {
903
827
  if (this.response || this.className !== '_Session') {
904
828
  return;
905
829
  }
906
-
907
830
  if (!this.auth.user && !this.auth.isMaster) {
908
831
  throw new Parse.Error(Parse.Error.INVALID_SESSION_TOKEN, 'Session token required.');
909
- } // TODO: Verify proper error to throw
910
-
832
+ }
911
833
 
834
+ // TODO: Verify proper error to throw
912
835
  if (this.data.ACL) {
913
836
  throw new Parse.Error(Parse.Error.INVALID_KEY_NAME, 'Cannot set ' + 'ACL on a Session.');
914
837
  }
915
-
916
838
  if (this.query) {
917
839
  if (this.data.user && !this.auth.isMaster && this.data.user.objectId != this.auth.user.id) {
918
840
  throw new Parse.Error(Parse.Error.INVALID_KEY_NAME);
@@ -921,7 +843,6 @@ RestWrite.prototype.handleSession = function () {
921
843
  } else if (this.data.sessionToken) {
922
844
  throw new Parse.Error(Parse.Error.INVALID_KEY_NAME);
923
845
  }
924
-
925
846
  if (!this.auth.isMaster) {
926
847
  this.query = {
927
848
  $and: [this.query, {
@@ -934,18 +855,14 @@ RestWrite.prototype.handleSession = function () {
934
855
  };
935
856
  }
936
857
  }
937
-
938
858
  if (!this.query && !this.auth.isMaster) {
939
859
  const additionalSessionData = {};
940
-
941
860
  for (var key in this.data) {
942
861
  if (key === 'objectId' || key === 'user') {
943
862
  continue;
944
863
  }
945
-
946
864
  additionalSessionData[key] = this.data[key];
947
865
  }
948
-
949
866
  const {
950
867
  sessionData,
951
868
  createSession
@@ -960,7 +877,6 @@ RestWrite.prototype.handleSession = function () {
960
877
  if (!results.response) {
961
878
  throw new Parse.Error(Parse.Error.INTERNAL_SERVER_ERROR, 'Error creating session.');
962
879
  }
963
-
964
880
  sessionData['objectId'] = results.response['objectId'];
965
881
  this.response = {
966
882
  status: 201,
@@ -969,79 +885,71 @@ RestWrite.prototype.handleSession = function () {
969
885
  };
970
886
  });
971
887
  }
972
- }; // Handles the _Installation class specialness.
888
+ };
889
+
890
+ // Handles the _Installation class specialness.
973
891
  // Does nothing if this isn't an installation object.
974
892
  // If an installation is found, this can mutate this.query and turn a create
975
893
  // into an update.
976
894
  // Returns a promise for when we're done if it can't finish this tick.
977
-
978
-
979
895
  RestWrite.prototype.handleInstallation = function () {
980
896
  if (this.response || this.className !== '_Installation') {
981
897
  return;
982
898
  }
983
-
984
899
  if (!this.query && !this.data.deviceToken && !this.data.installationId && !this.auth.installationId) {
985
900
  throw new Parse.Error(135, 'at least one ID field (deviceToken, installationId) ' + 'must be specified in this operation');
986
- } // If the device token is 64 characters long, we assume it is for iOS
987
- // and lowercase it.
988
-
901
+ }
989
902
 
903
+ // If the device token is 64 characters long, we assume it is for iOS
904
+ // and lowercase it.
990
905
  if (this.data.deviceToken && this.data.deviceToken.length == 64) {
991
906
  this.data.deviceToken = this.data.deviceToken.toLowerCase();
992
- } // We lowercase the installationId if present
993
-
907
+ }
994
908
 
909
+ // We lowercase the installationId if present
995
910
  if (this.data.installationId) {
996
911
  this.data.installationId = this.data.installationId.toLowerCase();
997
912
  }
913
+ let installationId = this.data.installationId;
998
914
 
999
- let installationId = this.data.installationId; // If data.installationId is not set and we're not master, we can lookup in auth
1000
-
915
+ // If data.installationId is not set and we're not master, we can lookup in auth
1001
916
  if (!installationId && !this.auth.isMaster) {
1002
917
  installationId = this.auth.installationId;
1003
918
  }
1004
-
1005
919
  if (installationId) {
1006
920
  installationId = installationId.toLowerCase();
1007
- } // Updating _Installation but not updating anything critical
1008
-
921
+ }
1009
922
 
923
+ // Updating _Installation but not updating anything critical
1010
924
  if (this.query && !this.data.deviceToken && !installationId && !this.data.deviceType) {
1011
925
  return;
1012
926
  }
1013
-
1014
927
  var promise = Promise.resolve();
1015
928
  var idMatch; // Will be a match on either objectId or installationId
1016
-
1017
929
  var objectIdMatch;
1018
930
  var installationIdMatch;
1019
- var deviceTokenMatches = []; // Instead of issuing 3 reads, let's do it with one OR.
931
+ var deviceTokenMatches = [];
1020
932
 
933
+ // Instead of issuing 3 reads, let's do it with one OR.
1021
934
  const orQueries = [];
1022
-
1023
935
  if (this.query && this.query.objectId) {
1024
936
  orQueries.push({
1025
937
  objectId: this.query.objectId
1026
938
  });
1027
939
  }
1028
-
1029
940
  if (installationId) {
1030
941
  orQueries.push({
1031
942
  installationId: installationId
1032
943
  });
1033
944
  }
1034
-
1035
945
  if (this.data.deviceToken) {
1036
946
  orQueries.push({
1037
947
  deviceToken: this.data.deviceToken
1038
948
  });
1039
949
  }
1040
-
1041
950
  if (orQueries.length == 0) {
1042
951
  return;
1043
952
  }
1044
-
1045
953
  promise = promise.then(() => {
1046
954
  return this.config.database.find('_Installation', {
1047
955
  $or: orQueries
@@ -1051,43 +959,36 @@ RestWrite.prototype.handleInstallation = function () {
1051
959
  if (this.query && this.query.objectId && result.objectId == this.query.objectId) {
1052
960
  objectIdMatch = result;
1053
961
  }
1054
-
1055
962
  if (result.installationId == installationId) {
1056
963
  installationIdMatch = result;
1057
964
  }
1058
-
1059
965
  if (result.deviceToken == this.data.deviceToken) {
1060
966
  deviceTokenMatches.push(result);
1061
967
  }
1062
- }); // Sanity checks when running a query
968
+ });
1063
969
 
970
+ // Sanity checks when running a query
1064
971
  if (this.query && this.query.objectId) {
1065
972
  if (!objectIdMatch) {
1066
973
  throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'Object not found for update.');
1067
974
  }
1068
-
1069
975
  if (this.data.installationId && objectIdMatch.installationId && this.data.installationId !== objectIdMatch.installationId) {
1070
976
  throw new Parse.Error(136, 'installationId may not be changed in this ' + 'operation');
1071
977
  }
1072
-
1073
978
  if (this.data.deviceToken && objectIdMatch.deviceToken && this.data.deviceToken !== objectIdMatch.deviceToken && !this.data.installationId && !objectIdMatch.installationId) {
1074
979
  throw new Parse.Error(136, 'deviceToken may not be changed in this ' + 'operation');
1075
980
  }
1076
-
1077
981
  if (this.data.deviceType && this.data.deviceType && this.data.deviceType !== objectIdMatch.deviceType) {
1078
982
  throw new Parse.Error(136, 'deviceType may not be changed in this ' + 'operation');
1079
983
  }
1080
984
  }
1081
-
1082
985
  if (this.query && this.query.objectId && objectIdMatch) {
1083
986
  idMatch = objectIdMatch;
1084
987
  }
1085
-
1086
988
  if (installationId && installationIdMatch) {
1087
989
  idMatch = installationIdMatch;
1088
- } // need to specify deviceType only if it's new
1089
-
1090
-
990
+ }
991
+ // need to specify deviceType only if it's new
1091
992
  if (!this.query && !this.data.deviceType && !idMatch) {
1092
993
  throw new Parse.Error(135, 'deviceType must be specified in this operation');
1093
994
  }
@@ -1114,18 +1015,15 @@ RestWrite.prototype.handleInstallation = function () {
1114
1015
  $ne: installationId
1115
1016
  }
1116
1017
  };
1117
-
1118
1018
  if (this.data.appIdentifier) {
1119
1019
  delQuery['appIdentifier'] = this.data.appIdentifier;
1120
1020
  }
1121
-
1122
1021
  this.config.database.destroy('_Installation', delQuery).catch(err => {
1123
1022
  if (err.code == Parse.Error.OBJECT_NOT_FOUND) {
1124
1023
  // no deletions were made. Can be ignored.
1125
1024
  return;
1126
- } // rethrow the error
1127
-
1128
-
1025
+ }
1026
+ // rethrow the error
1129
1027
  throw err;
1130
1028
  });
1131
1029
  return;
@@ -1144,9 +1042,8 @@ RestWrite.prototype.handleInstallation = function () {
1144
1042
  if (err.code == Parse.Error.OBJECT_NOT_FOUND) {
1145
1043
  // no deletions were made. Can be ignored
1146
1044
  return;
1147
- } // rethrow the error
1148
-
1149
-
1045
+ }
1046
+ // rethrow the error
1150
1047
  throw err;
1151
1048
  });
1152
1049
  } else {
@@ -1156,9 +1053,9 @@ RestWrite.prototype.handleInstallation = function () {
1156
1053
  // device token.
1157
1054
  const delQuery = {
1158
1055
  deviceToken: this.data.deviceToken
1159
- }; // We have a unique install Id, use that to preserve
1056
+ };
1057
+ // We have a unique install Id, use that to preserve
1160
1058
  // the interesting installation
1161
-
1162
1059
  if (this.data.installationId) {
1163
1060
  delQuery['installationId'] = {
1164
1061
  $ne: this.data.installationId
@@ -1172,23 +1069,19 @@ RestWrite.prototype.handleInstallation = function () {
1172
1069
  // What to do here? can't really clean up everything...
1173
1070
  return idMatch.objectId;
1174
1071
  }
1175
-
1176
1072
  if (this.data.appIdentifier) {
1177
1073
  delQuery['appIdentifier'] = this.data.appIdentifier;
1178
1074
  }
1179
-
1180
1075
  this.config.database.destroy('_Installation', delQuery).catch(err => {
1181
1076
  if (err.code == Parse.Error.OBJECT_NOT_FOUND) {
1182
1077
  // no deletions were made. Can be ignored.
1183
1078
  return;
1184
- } // rethrow the error
1185
-
1186
-
1079
+ }
1080
+ // rethrow the error
1187
1081
  throw err;
1188
1082
  });
1189
- } // In non-merge scenarios, just return the installation match id
1190
-
1191
-
1083
+ }
1084
+ // In non-merge scenarios, just return the installation match id
1192
1085
  return idMatch.objectId;
1193
1086
  }
1194
1087
  }
@@ -1199,49 +1092,44 @@ RestWrite.prototype.handleInstallation = function () {
1199
1092
  };
1200
1093
  delete this.data.objectId;
1201
1094
  delete this.data.createdAt;
1202
- } // TODO: Validate ops (add/remove on channels, $inc on badge, etc.)
1203
-
1095
+ }
1096
+ // TODO: Validate ops (add/remove on channels, $inc on badge, etc.)
1204
1097
  });
1098
+
1205
1099
  return promise;
1206
- }; // If we short-circuited the object response - then we need to make sure we expand all the files,
1100
+ };
1101
+
1102
+ // If we short-circuited the object response - then we need to make sure we expand all the files,
1207
1103
  // since this might not have a query, meaning it won't return the full result back.
1208
1104
  // TODO: (nlutsenko) This should die when we move to per-class based controllers on _Session/_User
1209
-
1210
-
1211
1105
  RestWrite.prototype.expandFilesForExistingObjects = function () {
1212
1106
  // Check whether we have a short-circuited response - only then run expansion.
1213
1107
  if (this.response && this.response.response) {
1214
1108
  this.config.filesController.expandFilesInObject(this.config, this.response.response);
1215
1109
  }
1216
1110
  };
1217
-
1218
1111
  RestWrite.prototype.runDatabaseOperation = function () {
1219
1112
  if (this.response) {
1220
1113
  return;
1221
1114
  }
1222
-
1223
1115
  if (this.className === '_Role') {
1224
1116
  this.config.cacheController.role.clear();
1225
-
1226
1117
  if (this.config.liveQueryController) {
1227
1118
  this.config.liveQueryController.clearCachedRoles(this.auth.user);
1228
1119
  }
1229
1120
  }
1230
-
1231
1121
  if (this.className === '_User' && this.query && this.auth.isUnauthenticated()) {
1232
1122
  throw new Parse.Error(Parse.Error.SESSION_MISSING, `Cannot modify user ${this.query.objectId}.`);
1233
1123
  }
1234
-
1235
1124
  if (this.className === '_Product' && this.data.download) {
1236
1125
  this.data.downloadName = this.data.download.name;
1237
- } // TODO: Add better detection for ACL, ensuring a user can't be locked from
1238
- // their own user record.
1239
-
1126
+ }
1240
1127
 
1128
+ // TODO: Add better detection for ACL, ensuring a user can't be locked from
1129
+ // their own user record.
1241
1130
  if (this.data.ACL && this.data.ACL['*unresolved']) {
1242
1131
  throw new Parse.Error(Parse.Error.INVALID_ACL, 'Invalid ACL.');
1243
1132
  }
1244
-
1245
1133
  if (this.query) {
1246
1134
  // Force the user to not lockout
1247
1135
  // Matched with parse.com
@@ -1250,17 +1138,15 @@ RestWrite.prototype.runDatabaseOperation = function () {
1250
1138
  read: true,
1251
1139
  write: true
1252
1140
  };
1253
- } // update password timestamp if user password is being changed
1254
-
1255
-
1141
+ }
1142
+ // update password timestamp if user password is being changed
1256
1143
  if (this.className === '_User' && this.data._hashed_password && this.config.passwordPolicy && this.config.passwordPolicy.maxPasswordAge) {
1257
1144
  this.data._password_changed_at = Parse._encode(new Date());
1258
- } // Ignore createdAt when update
1259
-
1260
-
1145
+ }
1146
+ // Ignore createdAt when update
1261
1147
  delete this.data.createdAt;
1262
- let defer = Promise.resolve(); // if password history is enabled then save the current password to history
1263
-
1148
+ let defer = Promise.resolve();
1149
+ // if password history is enabled then save the current password to history
1264
1150
  if (this.className === '_User' && this.data._hashed_password && this.config.passwordPolicy && this.config.passwordPolicy.maxPasswordHistory) {
1265
1151
  defer = this.config.database.find('_User', {
1266
1152
  objectId: this.objectId()
@@ -1270,31 +1156,24 @@ RestWrite.prototype.runDatabaseOperation = function () {
1270
1156
  if (results.length != 1) {
1271
1157
  throw undefined;
1272
1158
  }
1273
-
1274
1159
  const user = results[0];
1275
1160
  let oldPasswords = [];
1276
-
1277
1161
  if (user._password_history) {
1278
1162
  oldPasswords = _lodash.default.take(user._password_history, this.config.passwordPolicy.maxPasswordHistory);
1279
- } //n-1 passwords go into history including last password
1280
-
1281
-
1163
+ }
1164
+ //n-1 passwords go into history including last password
1282
1165
  while (oldPasswords.length > Math.max(0, this.config.passwordPolicy.maxPasswordHistory - 2)) {
1283
1166
  oldPasswords.shift();
1284
1167
  }
1285
-
1286
1168
  oldPasswords.push(user.password);
1287
1169
  this.data._password_history = oldPasswords;
1288
1170
  });
1289
1171
  }
1290
-
1291
1172
  return defer.then(() => {
1292
1173
  // Run an update
1293
1174
  return this.config.database.update(this.className, this.query, this.data, this.runOptions, false, false, this.validSchemaController).then(response => {
1294
1175
  response.updatedAt = this.updatedAt;
1295
-
1296
1176
  this._updateResponseWithData(response, this.data);
1297
-
1298
1177
  this.response = {
1299
1178
  response
1300
1179
  };
@@ -1303,50 +1182,47 @@ RestWrite.prototype.runDatabaseOperation = function () {
1303
1182
  } else {
1304
1183
  // Set the default ACL and password timestamp for the new _User
1305
1184
  if (this.className === '_User') {
1306
- var ACL = this.data.ACL; // default public r/w ACL
1307
-
1185
+ var ACL = this.data.ACL;
1186
+ // default public r/w ACL
1308
1187
  if (!ACL) {
1309
1188
  ACL = {};
1310
-
1311
1189
  if (!this.config.enforcePrivateUsers) {
1312
1190
  ACL['*'] = {
1313
1191
  read: true,
1314
1192
  write: false
1315
1193
  };
1316
1194
  }
1317
- } // make sure the user is not locked down
1318
-
1319
-
1195
+ }
1196
+ // make sure the user is not locked down
1320
1197
  ACL[this.data.objectId] = {
1321
1198
  read: true,
1322
1199
  write: true
1323
1200
  };
1324
- this.data.ACL = ACL; // password timestamp to be used when password expiry policy is enforced
1325
-
1201
+ this.data.ACL = ACL;
1202
+ // password timestamp to be used when password expiry policy is enforced
1326
1203
  if (this.config.passwordPolicy && this.config.passwordPolicy.maxPasswordAge) {
1327
1204
  this.data._password_changed_at = Parse._encode(new Date());
1328
1205
  }
1329
- } // Run a create
1330
-
1206
+ }
1331
1207
 
1208
+ // Run a create
1332
1209
  return this.config.database.create(this.className, this.data, this.runOptions, false, this.validSchemaController).catch(error => {
1333
1210
  if (this.className !== '_User' || error.code !== Parse.Error.DUPLICATE_VALUE) {
1334
1211
  throw error;
1335
- } // Quick check, if we were able to infer the duplicated field name
1336
-
1212
+ }
1337
1213
 
1214
+ // Quick check, if we were able to infer the duplicated field name
1338
1215
  if (error && error.userInfo && error.userInfo.duplicated_field === 'username') {
1339
1216
  throw new Parse.Error(Parse.Error.USERNAME_TAKEN, 'Account already exists for this username.');
1340
1217
  }
1341
-
1342
1218
  if (error && error.userInfo && error.userInfo.duplicated_field === 'email') {
1343
1219
  throw new Parse.Error(Parse.Error.EMAIL_TAKEN, 'Account already exists for this email address.');
1344
- } // If this was a failed user creation due to username or email already taken, we need to
1220
+ }
1221
+
1222
+ // If this was a failed user creation due to username or email already taken, we need to
1345
1223
  // check whether it was username or email and return the appropriate error.
1346
1224
  // Fallback to the original method
1347
1225
  // TODO: See if we can later do this without additional queries by using named indexes.
1348
-
1349
-
1350
1226
  return this.config.database.find(this.className, {
1351
1227
  username: this.data.username,
1352
1228
  objectId: {
@@ -1358,7 +1234,6 @@ RestWrite.prototype.runDatabaseOperation = function () {
1358
1234
  if (results.length > 0) {
1359
1235
  throw new Parse.Error(Parse.Error.USERNAME_TAKEN, 'Account already exists for this username.');
1360
1236
  }
1361
-
1362
1237
  return this.config.database.find(this.className, {
1363
1238
  email: this.data.email,
1364
1239
  objectId: {
@@ -1371,19 +1246,15 @@ RestWrite.prototype.runDatabaseOperation = function () {
1371
1246
  if (results.length > 0) {
1372
1247
  throw new Parse.Error(Parse.Error.EMAIL_TAKEN, 'Account already exists for this email address.');
1373
1248
  }
1374
-
1375
1249
  throw new Parse.Error(Parse.Error.DUPLICATE_VALUE, 'A duplicate value for a field with unique values was provided');
1376
1250
  });
1377
1251
  }).then(response => {
1378
1252
  response.objectId = this.data.objectId;
1379
1253
  response.createdAt = this.data.createdAt;
1380
-
1381
1254
  if (this.responseShouldHaveUsername) {
1382
1255
  response.username = this.data.username;
1383
1256
  }
1384
-
1385
1257
  this._updateResponseWithData(response, this.data);
1386
-
1387
1258
  this.response = {
1388
1259
  status: 201,
1389
1260
  response,
@@ -1391,40 +1262,36 @@ RestWrite.prototype.runDatabaseOperation = function () {
1391
1262
  };
1392
1263
  });
1393
1264
  }
1394
- }; // Returns nothing - doesn't wait for the trigger.
1395
-
1265
+ };
1396
1266
 
1267
+ // Returns nothing - doesn't wait for the trigger.
1397
1268
  RestWrite.prototype.runAfterSaveTrigger = function () {
1398
1269
  if (!this.response || !this.response.response || this.runOptions.many) {
1399
1270
  return;
1400
- } // Avoid doing any setup for triggers if there is no 'afterSave' trigger for this class.
1401
-
1271
+ }
1402
1272
 
1273
+ // Avoid doing any setup for triggers if there is no 'afterSave' trigger for this class.
1403
1274
  const hasAfterSaveHook = triggers.triggerExists(this.className, triggers.Types.afterSave, this.config.applicationId);
1404
1275
  const hasLiveQuery = this.config.liveQueryController.hasLiveQuery(this.className);
1405
-
1406
1276
  if (!hasAfterSaveHook && !hasLiveQuery) {
1407
1277
  return Promise.resolve();
1408
1278
  }
1409
-
1410
1279
  const {
1411
1280
  originalObject,
1412
1281
  updatedObject
1413
1282
  } = this.buildParseObjects();
1414
-
1415
1283
  updatedObject._handleSaveResponse(this.response.response, this.response.status || 200);
1416
-
1417
1284
  this.config.database.loadSchema().then(schemaController => {
1418
1285
  // Notifiy LiveQueryServer if possible
1419
1286
  const perms = schemaController.getClassLevelPermissions(updatedObject.className);
1420
1287
  this.config.liveQueryController.onAfterSave(updatedObject.className, updatedObject, originalObject, perms);
1421
- }); // Run afterSave trigger
1288
+ });
1422
1289
 
1290
+ // Run afterSave trigger
1423
1291
  return triggers.maybeRunTrigger(triggers.Types.afterSave, this.auth, updatedObject, originalObject, this.config, this.context).then(result => {
1424
1292
  const jsonReturned = result && !result._toFullJSON;
1425
-
1426
1293
  if (jsonReturned) {
1427
- this.pendingOps = {};
1294
+ this.pendingOps.operations = {};
1428
1295
  this.response.response = result;
1429
1296
  } else {
1430
1297
  this.response.response = this._updateResponseWithData((result || updatedObject).toJSON(), this.data);
@@ -1432,57 +1299,51 @@ RestWrite.prototype.runAfterSaveTrigger = function () {
1432
1299
  }).catch(function (err) {
1433
1300
  _logger.default.warn('afterSave caught an error', err);
1434
1301
  });
1435
- }; // A helper to figure out what location this operation happens at.
1436
-
1302
+ };
1437
1303
 
1304
+ // A helper to figure out what location this operation happens at.
1438
1305
  RestWrite.prototype.location = function () {
1439
1306
  var middle = this.className === '_User' ? '/users/' : '/classes/' + this.className + '/';
1440
1307
  const mount = this.config.mount || this.config.serverURL;
1441
1308
  return mount + middle + this.data.objectId;
1442
- }; // A helper to get the object id for this operation.
1443
- // Because it could be either on the query or on the data
1444
-
1309
+ };
1445
1310
 
1311
+ // A helper to get the object id for this operation.
1312
+ // Because it could be either on the query or on the data
1446
1313
  RestWrite.prototype.objectId = function () {
1447
1314
  return this.data.objectId || this.query.objectId;
1448
- }; // Returns a copy of the data and delete bad keys (_auth_data, _hashed_password...)
1449
-
1315
+ };
1450
1316
 
1317
+ // Returns a copy of the data and delete bad keys (_auth_data, _hashed_password...)
1451
1318
  RestWrite.prototype.sanitizedData = function () {
1452
1319
  const data = Object.keys(this.data).reduce((data, key) => {
1453
1320
  // Regexp comes from Parse.Object.prototype.validate
1454
1321
  if (!/^[A-Za-z][0-9A-Za-z_]*$/.test(key)) {
1455
1322
  delete data[key];
1456
1323
  }
1457
-
1458
1324
  return data;
1459
1325
  }, deepcopy(this.data));
1460
1326
  return Parse._decode(undefined, data);
1461
- }; // Returns an updated copy of the object
1462
-
1327
+ };
1463
1328
 
1329
+ // Returns an updated copy of the object
1464
1330
  RestWrite.prototype.buildParseObjects = function () {
1465
1331
  var _this$query;
1466
-
1467
1332
  const extraData = {
1468
1333
  className: this.className,
1469
1334
  objectId: (_this$query = this.query) === null || _this$query === void 0 ? void 0 : _this$query.objectId
1470
1335
  };
1471
1336
  let originalObject;
1472
-
1473
1337
  if (this.query && this.query.objectId) {
1474
1338
  originalObject = triggers.inflate(extraData, this.originalData);
1475
1339
  }
1476
-
1477
1340
  const className = Parse.Object.fromJSON(extraData);
1478
1341
  const readOnlyAttributes = className.constructor.readOnlyAttributes ? className.constructor.readOnlyAttributes() : [];
1479
-
1480
1342
  if (!this.originalData) {
1481
1343
  for (const attribute of readOnlyAttributes) {
1482
1344
  extraData[attribute] = this.data[attribute];
1483
1345
  }
1484
1346
  }
1485
-
1486
1347
  const updatedObject = triggers.inflate(extraData, this.originalData);
1487
1348
  Object.keys(this.data).reduce(function (data, key) {
1488
1349
  if (key.indexOf('.') > 0) {
@@ -1495,59 +1356,45 @@ RestWrite.prototype.buildParseObjects = function () {
1495
1356
  const splittedKey = key.split('.');
1496
1357
  const parentProp = splittedKey[0];
1497
1358
  let parentVal = updatedObject.get(parentProp);
1498
-
1499
1359
  if (typeof parentVal !== 'object') {
1500
1360
  parentVal = {};
1501
1361
  }
1502
-
1503
1362
  parentVal[splittedKey[1]] = data[key];
1504
1363
  updatedObject.set(parentProp, parentVal);
1505
1364
  }
1506
-
1507
1365
  delete data[key];
1508
1366
  }
1509
-
1510
1367
  return data;
1511
1368
  }, deepcopy(this.data));
1512
1369
  const sanitized = this.sanitizedData();
1513
-
1514
1370
  for (const attribute of readOnlyAttributes) {
1515
1371
  delete sanitized[attribute];
1516
1372
  }
1517
-
1518
1373
  updatedObject.set(sanitized);
1519
1374
  return {
1520
1375
  updatedObject,
1521
1376
  originalObject
1522
1377
  };
1523
1378
  };
1524
-
1525
1379
  RestWrite.prototype.cleanUserAuthData = function () {
1526
1380
  if (this.response && this.response.response && this.className === '_User') {
1527
1381
  const user = this.response.response;
1528
-
1529
1382
  if (user.authData) {
1530
1383
  Object.keys(user.authData).forEach(provider => {
1531
1384
  if (user.authData[provider] === null) {
1532
1385
  delete user.authData[provider];
1533
1386
  }
1534
1387
  });
1535
-
1536
1388
  if (Object.keys(user.authData).length == 0) {
1537
1389
  delete user.authData;
1538
1390
  }
1539
1391
  }
1540
1392
  }
1541
1393
  };
1542
-
1543
1394
  RestWrite.prototype._updateResponseWithData = function (response, data) {
1544
- const {
1545
- updatedObject
1546
- } = this.buildParseObjects();
1547
1395
  const stateController = Parse.CoreManager.getObjectStateController();
1548
- const [pending] = stateController.getPendingOps(updatedObject._getStateIdentifier());
1549
-
1550
- for (const key in this.pendingOps) {
1396
+ const [pending] = stateController.getPendingOps(this.pendingOps.identifier);
1397
+ for (const key in this.pendingOps.operations) {
1551
1398
  if (!pending[key]) {
1552
1399
  data[key] = this.originalData ? this.originalData[key] : {
1553
1400
  __op: 'Delete'
@@ -1555,44 +1402,35 @@ RestWrite.prototype._updateResponseWithData = function (response, data) {
1555
1402
  this.storage.fieldsChangedByTrigger.push(key);
1556
1403
  }
1557
1404
  }
1558
-
1559
1405
  const skipKeys = [...(_SchemaController.requiredColumns.read[this.className] || [])];
1560
-
1561
1406
  if (!this.query) {
1562
1407
  skipKeys.push('objectId', 'createdAt');
1563
1408
  } else {
1564
1409
  skipKeys.push('updatedAt');
1565
1410
  delete response.objectId;
1566
1411
  }
1567
-
1568
1412
  for (const key in response) {
1569
1413
  if (skipKeys.includes(key)) {
1570
1414
  continue;
1571
1415
  }
1572
-
1573
1416
  const value = response[key];
1574
-
1575
1417
  if (value == null || value.__type && value.__type === 'Pointer' || util.isDeepStrictEqual(data[key], value) || util.isDeepStrictEqual((this.originalData || {})[key], value)) {
1576
1418
  delete response[key];
1577
1419
  }
1578
1420
  }
1579
-
1580
1421
  if (_lodash.default.isEmpty(this.storage.fieldsChangedByTrigger)) {
1581
1422
  return response;
1582
1423
  }
1583
-
1584
1424
  const clientSupportsDelete = ClientSDK.supportsForwardDelete(this.clientSDK);
1585
1425
  this.storage.fieldsChangedByTrigger.forEach(fieldName => {
1586
1426
  const dataValue = data[fieldName];
1587
-
1588
1427
  if (!Object.prototype.hasOwnProperty.call(response, fieldName)) {
1589
1428
  response[fieldName] = dataValue;
1590
- } // Strips operations from responses
1591
-
1429
+ }
1592
1430
 
1431
+ // Strips operations from responses
1593
1432
  if (response[fieldName] && response[fieldName].__op) {
1594
1433
  delete response[fieldName];
1595
-
1596
1434
  if (clientSupportsDelete && dataValue.__op == 'Delete') {
1597
1435
  response[fieldName] = dataValue;
1598
1436
  }
@@ -1600,21 +1438,18 @@ RestWrite.prototype._updateResponseWithData = function (response, data) {
1600
1438
  });
1601
1439
  return response;
1602
1440
  };
1603
-
1604
1441
  RestWrite.prototype.checkProhibitedKeywords = function (data) {
1605
1442
  if (this.config.requestKeywordDenylist) {
1606
1443
  // Scan request data for denied keywords
1607
1444
  for (const keyword of this.config.requestKeywordDenylist) {
1608
1445
  const match = Utils.objectContainsKeyValue(data, keyword.key, keyword.value);
1609
-
1610
1446
  if (match) {
1611
1447
  throw new Parse.Error(Parse.Error.INVALID_KEY_NAME, `Prohibited keyword in request data: ${JSON.stringify(keyword)}.`);
1612
1448
  }
1613
1449
  }
1614
1450
  }
1615
1451
  };
1616
-
1617
1452
  var _default = RestWrite;
1618
1453
  exports.default = _default;
1619
1454
  module.exports = RestWrite;
1620
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9SZXN0V3JpdGUuanMiXSwibmFtZXMiOlsiU2NoZW1hQ29udHJvbGxlciIsInJlcXVpcmUiLCJkZWVwY29weSIsIkF1dGgiLCJVdGlscyIsImNyeXB0b1V0aWxzIiwicGFzc3dvcmRDcnlwdG8iLCJQYXJzZSIsInRyaWdnZXJzIiwiQ2xpZW50U0RLIiwidXRpbCIsIlJlc3RXcml0ZSIsImNvbmZpZyIsImF1dGgiLCJjbGFzc05hbWUiLCJxdWVyeSIsImRhdGEiLCJvcmlnaW5hbERhdGEiLCJjbGllbnRTREsiLCJjb250ZXh0IiwiYWN0aW9uIiwiaXNSZWFkT25seSIsIkVycm9yIiwiT1BFUkFUSU9OX0ZPUkJJRERFTiIsInN0b3JhZ2UiLCJydW5PcHRpb25zIiwiYWxsb3dDdXN0b21PYmplY3RJZCIsIk9iamVjdCIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsIm9iamVjdElkIiwiTUlTU0lOR19PQkpFQ1RfSUQiLCJJTlZBTElEX0tFWV9OQU1FIiwiaWQiLCJjaGVja1Byb2hpYml0ZWRLZXl3b3JkcyIsInJlc3BvbnNlIiwidXBkYXRlZEF0IiwiX2VuY29kZSIsIkRhdGUiLCJpc28iLCJ2YWxpZFNjaGVtYUNvbnRyb2xsZXIiLCJwZW5kaW5nT3BzIiwiZXhlY3V0ZSIsIlByb21pc2UiLCJyZXNvbHZlIiwidGhlbiIsImdldFVzZXJBbmRSb2xlQUNMIiwidmFsaWRhdGVDbGllbnRDbGFzc0NyZWF0aW9uIiwiaGFuZGxlSW5zdGFsbGF0aW9uIiwiaGFuZGxlU2Vzc2lvbiIsInZhbGlkYXRlQXV0aERhdGEiLCJydW5CZWZvcmVTYXZlVHJpZ2dlciIsImVuc3VyZVVuaXF1ZUF1dGhEYXRhSWQiLCJkZWxldGVFbWFpbFJlc2V0VG9rZW5JZk5lZWRlZCIsInZhbGlkYXRlU2NoZW1hIiwic2NoZW1hQ29udHJvbGxlciIsInNldFJlcXVpcmVkRmllbGRzSWZOZWVkZWQiLCJ0cmFuc2Zvcm1Vc2VyIiwiZXhwYW5kRmlsZXNGb3JFeGlzdGluZ09iamVjdHMiLCJkZXN0cm95RHVwbGljYXRlZFNlc3Npb25zIiwicnVuRGF0YWJhc2VPcGVyYXRpb24iLCJjcmVhdGVTZXNzaW9uVG9rZW5JZk5lZWRlZCIsImhhbmRsZUZvbGxvd3VwIiwicnVuQWZ0ZXJTYXZlVHJpZ2dlciIsImNsZWFuVXNlckF1dGhEYXRhIiwiYXV0aERhdGFSZXNwb25zZSIsImlzTWFzdGVyIiwiYWNsIiwidXNlciIsImdldFVzZXJSb2xlcyIsInJvbGVzIiwiY29uY2F0IiwiYWxsb3dDbGllbnRDbGFzc0NyZWF0aW9uIiwic3lzdGVtQ2xhc3NlcyIsImluZGV4T2YiLCJkYXRhYmFzZSIsImxvYWRTY2hlbWEiLCJoYXNDbGFzcyIsInZhbGlkYXRlT2JqZWN0IiwibWFueSIsInRyaWdnZXJFeGlzdHMiLCJUeXBlcyIsImJlZm9yZVNhdmUiLCJhcHBsaWNhdGlvbklkIiwib3JpZ2luYWxPYmplY3QiLCJ1cGRhdGVkT2JqZWN0IiwiYnVpbGRQYXJzZU9iamVjdHMiLCJzdGF0ZUNvbnRyb2xsZXIiLCJDb3JlTWFuYWdlciIsImdldE9iamVjdFN0YXRlQ29udHJvbGxlciIsInBlbmRpbmciLCJnZXRQZW5kaW5nT3BzIiwiX2dldFN0YXRlSWRlbnRpZmllciIsImRhdGFiYXNlUHJvbWlzZSIsInVwZGF0ZSIsImNyZWF0ZSIsInJlc3VsdCIsImxlbmd0aCIsIk9CSkVDVF9OT1RfRk9VTkQiLCJtYXliZVJ1blRyaWdnZXIiLCJvYmplY3QiLCJmaWVsZHNDaGFuZ2VkQnlUcmlnZ2VyIiwiXyIsInJlZHVjZSIsInZhbHVlIiwia2V5IiwiaXNFcXVhbCIsInB1c2giLCJydW5CZWZvcmVMb2dpblRyaWdnZXIiLCJ1c2VyRGF0YSIsImJlZm9yZUxvZ2luIiwiZXh0cmFEYXRhIiwiZmlsZXNDb250cm9sbGVyIiwiZXhwYW5kRmlsZXNJbk9iamVjdCIsImluZmxhdGUiLCJnZXRBbGxDbGFzc2VzIiwiYWxsQ2xhc3NlcyIsInNjaGVtYSIsImZpbmQiLCJvbmVDbGFzcyIsInNldFJlcXVpcmVkRmllbGRJZk5lZWRlZCIsImZpZWxkTmFtZSIsInNldERlZmF1bHQiLCJ1bmRlZmluZWQiLCJfX29wIiwiZmllbGRzIiwiZGVmYXVsdFZhbHVlIiwicmVxdWlyZWQiLCJWQUxJREFUSU9OX0VSUk9SIiwiY3JlYXRlZEF0IiwibmV3T2JqZWN0SWQiLCJvYmplY3RJZFNpemUiLCJrZXlzIiwiZm9yRWFjaCIsImF1dGhEYXRhIiwiaGFzVXNlcm5hbWVBbmRQYXNzd29yZCIsInVzZXJuYW1lIiwicGFzc3dvcmQiLCJpc0VtcHR5IiwiVVNFUk5BTUVfTUlTU0lORyIsIlBBU1NXT1JEX01JU1NJTkciLCJVTlNVUFBPUlRFRF9TRVJWSUNFIiwicHJvdmlkZXJzIiwiY2FuSGFuZGxlQXV0aERhdGEiLCJzb21lIiwicHJvdmlkZXIiLCJwcm92aWRlckF1dGhEYXRhIiwiaGFzVG9rZW4iLCJnZXRVc2VySWQiLCJoYW5kbGVBdXRoRGF0YSIsImZpbHRlcmVkT2JqZWN0c0J5QUNMIiwib2JqZWN0cyIsImZpbHRlciIsIkFDTCIsImhhc0F1dGhEYXRhSWQiLCJyIiwiZmluZFVzZXJzV2l0aEF1dGhEYXRhIiwicmVzdWx0cyIsIkFDQ09VTlRfQUxSRUFEWV9MSU5LRUQiLCJ1c2VySWQiLCJoYW5kbGVBdXRoRGF0YVZhbGlkYXRpb24iLCJ2YWxpZGF0ZWRBdXRoRGF0YSIsInVzZXJSZXN1bHQiLCJhdXRoUHJvdmlkZXIiLCJqb2luIiwiaGFzTXV0YXRlZEF1dGhEYXRhIiwibXV0YXRlZEF1dGhEYXRhIiwiaXNDdXJyZW50VXNlckxvZ2dlZE9yTWFzdGVyIiwiaXNMb2dpbiIsImxvY2F0aW9uIiwiY2hlY2tJZlVzZXJIYXNQcm92aWRlZENvbmZpZ3VyZWRQcm92aWRlcnNGb3JMb2dpbiIsImFsbG93RXhwaXJlZEF1dGhEYXRhVG9rZW4iLCJyZXMiLCJwcm9taXNlIiwiZXJyb3IiLCJSZXN0UXVlcnkiLCJtYXN0ZXIiLCJfX3R5cGUiLCJzZXNzaW9uIiwiY2FjaGVDb250cm9sbGVyIiwiZGVsIiwic2Vzc2lvblRva2VuIiwiX3ZhbGlkYXRlUGFzc3dvcmRQb2xpY3kiLCJoYXNoIiwiaGFzaGVkUGFzc3dvcmQiLCJfaGFzaGVkX3Bhc3N3b3JkIiwiX3ZhbGlkYXRlVXNlck5hbWUiLCJfdmFsaWRhdGVFbWFpbCIsInJhbmRvbVN0cmluZyIsInJlc3BvbnNlU2hvdWxkSGF2ZVVzZXJuYW1lIiwiJG5lIiwibGltaXQiLCJjYXNlSW5zZW5zaXRpdmUiLCJVU0VSTkFNRV9UQUtFTiIsImVtYWlsIiwibWF0Y2giLCJyZWplY3QiLCJJTlZBTElEX0VNQUlMX0FERFJFU1MiLCJFTUFJTF9UQUtFTiIsInVzZXJDb250cm9sbGVyIiwic2V0RW1haWxWZXJpZnlUb2tlbiIsInBhc3N3b3JkUG9saWN5IiwiX3ZhbGlkYXRlUGFzc3dvcmRSZXF1aXJlbWVudHMiLCJfdmFsaWRhdGVQYXNzd29yZEhpc3RvcnkiLCJwb2xpY3lFcnJvciIsInZhbGlkYXRpb25FcnJvciIsImNvbnRhaW5zVXNlcm5hbWVFcnJvciIsInBhdHRlcm5WYWxpZGF0b3IiLCJ2YWxpZGF0b3JDYWxsYmFjayIsImRvTm90QWxsb3dVc2VybmFtZSIsIm1heFBhc3N3b3JkSGlzdG9yeSIsIm9sZFBhc3N3b3JkcyIsIl9wYXNzd29yZF9oaXN0b3J5IiwidGFrZSIsIm5ld1Bhc3N3b3JkIiwicHJvbWlzZXMiLCJtYXAiLCJjb21wYXJlIiwiYWxsIiwiY2F0Y2giLCJlcnIiLCJwcmV2ZW50TG9naW5XaXRoVW52ZXJpZmllZEVtYWlsIiwidmVyaWZ5VXNlckVtYWlscyIsImNyZWF0ZVNlc3Npb25Ub2tlbiIsImluc3RhbGxhdGlvbklkIiwic2Vzc2lvbkRhdGEiLCJjcmVhdGVTZXNzaW9uIiwiY3JlYXRlZFdpdGgiLCJhZGRpdGlvbmFsU2Vzc2lvbkRhdGEiLCJ0b2tlbiIsIm5ld1Rva2VuIiwiZXhwaXJlc0F0IiwiZ2VuZXJhdGVTZXNzaW9uRXhwaXJlc0F0IiwiYXNzaWduIiwiYWRkT3BzIiwiX3BlcmlzaGFibGVfdG9rZW4iLCJfcGVyaXNoYWJsZV90b2tlbl9leHBpcmVzX2F0IiwiZGVzdHJveSIsInJldm9rZVNlc3Npb25PblBhc3N3b3JkUmVzZXQiLCJzZXNzaW9uUXVlcnkiLCJiaW5kIiwic2VuZFZlcmlmaWNhdGlvbkVtYWlsIiwiSU5WQUxJRF9TRVNTSU9OX1RPS0VOIiwiJGFuZCIsIklOVEVSTkFMX1NFUlZFUl9FUlJPUiIsInN0YXR1cyIsImRldmljZVRva2VuIiwidG9Mb3dlckNhc2UiLCJkZXZpY2VUeXBlIiwiaWRNYXRjaCIsIm9iamVjdElkTWF0Y2giLCJpbnN0YWxsYXRpb25JZE1hdGNoIiwiZGV2aWNlVG9rZW5NYXRjaGVzIiwib3JRdWVyaWVzIiwiJG9yIiwiZGVsUXVlcnkiLCJhcHBJZGVudGlmaWVyIiwiY29kZSIsIm9iaklkIiwicm9sZSIsImNsZWFyIiwibGl2ZVF1ZXJ5Q29udHJvbGxlciIsImNsZWFyQ2FjaGVkUm9sZXMiLCJpc1VuYXV0aGVudGljYXRlZCIsIlNFU1NJT05fTUlTU0lORyIsImRvd25sb2FkIiwiZG93bmxvYWROYW1lIiwibmFtZSIsIklOVkFMSURfQUNMIiwicmVhZCIsIndyaXRlIiwibWF4UGFzc3dvcmRBZ2UiLCJfcGFzc3dvcmRfY2hhbmdlZF9hdCIsImRlZmVyIiwiTWF0aCIsIm1heCIsInNoaWZ0IiwiX3VwZGF0ZVJlc3BvbnNlV2l0aERhdGEiLCJlbmZvcmNlUHJpdmF0ZVVzZXJzIiwiRFVQTElDQVRFX1ZBTFVFIiwidXNlckluZm8iLCJkdXBsaWNhdGVkX2ZpZWxkIiwiaGFzQWZ0ZXJTYXZlSG9vayIsImFmdGVyU2F2ZSIsImhhc0xpdmVRdWVyeSIsIl9oYW5kbGVTYXZlUmVzcG9uc2UiLCJwZXJtcyIsImdldENsYXNzTGV2ZWxQZXJtaXNzaW9ucyIsIm9uQWZ0ZXJTYXZlIiwianNvblJldHVybmVkIiwiX3RvRnVsbEpTT04iLCJ0b0pTT04iLCJsb2dnZXIiLCJ3YXJuIiwibWlkZGxlIiwibW91bnQiLCJzZXJ2ZXJVUkwiLCJzYW5pdGl6ZWREYXRhIiwidGVzdCIsIl9kZWNvZGUiLCJmcm9tSlNPTiIsInJlYWRPbmx5QXR0cmlidXRlcyIsImNvbnN0cnVjdG9yIiwiYXR0cmlidXRlIiwiaW5jbHVkZXMiLCJzZXQiLCJzcGxpdHRlZEtleSIsInNwbGl0IiwicGFyZW50UHJvcCIsInBhcmVudFZhbCIsImdldCIsInNhbml0aXplZCIsInNraXBLZXlzIiwicmVxdWlyZWRDb2x1bW5zIiwiaXNEZWVwU3RyaWN0RXF1YWwiLCJjbGllbnRTdXBwb3J0c0RlbGV0ZSIsInN1cHBvcnRzRm9yd2FyZERlbGV0ZSIsImRhdGFWYWx1ZSIsInJlcXVlc3RLZXl3b3JkRGVueWxpc3QiLCJrZXl3b3JkIiwib2JqZWN0Q29udGFpbnNLZXlWYWx1ZSIsIkpTT04iLCJzdHJpbmdpZnkiLCJtb2R1bGUiLCJleHBvcnRzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBZUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7Ozs7Ozs7Ozs7QUFsQkE7QUFDQTtBQUNBO0FBRUEsSUFBSUEsZ0JBQWdCLEdBQUdDLE9BQU8sQ0FBQyxnQ0FBRCxDQUE5Qjs7QUFDQSxJQUFJQyxRQUFRLEdBQUdELE9BQU8sQ0FBQyxVQUFELENBQXRCOztBQUVBLE1BQU1FLElBQUksR0FBR0YsT0FBTyxDQUFDLFFBQUQsQ0FBcEI7O0FBQ0EsTUFBTUcsS0FBSyxHQUFHSCxPQUFPLENBQUMsU0FBRCxDQUFyQjs7QUFDQSxJQUFJSSxXQUFXLEdBQUdKLE9BQU8sQ0FBQyxlQUFELENBQXpCOztBQUNBLElBQUlLLGNBQWMsR0FBR0wsT0FBTyxDQUFDLFlBQUQsQ0FBNUI7O0FBQ0EsSUFBSU0sS0FBSyxHQUFHTixPQUFPLENBQUMsWUFBRCxDQUFuQjs7QUFDQSxJQUFJTyxRQUFRLEdBQUdQLE9BQU8sQ0FBQyxZQUFELENBQXRCOztBQUNBLElBQUlRLFNBQVMsR0FBR1IsT0FBTyxDQUFDLGFBQUQsQ0FBdkI7O0FBQ0EsTUFBTVMsSUFBSSxHQUFHVCxPQUFPLENBQUMsTUFBRCxDQUFwQjs7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTVSxTQUFULENBQW1C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QzZULHNCQUFOLENBQTZCalQsSUFBN0IsRUFBbUNnVCxPQUFPLENBQUN0TixHQUEzQyxFQUFnRHNOLE9BQU8sQ0FBQ3ZOLEtBQXhELENBQWQ7O0FBQ0EsVUFBSTJGLEtBQUosRUFBVztBQUNULGNBQU0sSUFBSTdMLEtBQUssQ0FBQ2UsS0FBVixDQUNKZixLQUFLLENBQUNlLEtBQU4sQ0FBWVcsZ0JBRFIsRUFFSCx1Q0FBc0NpUyxJQUFJLENBQUNDLFNBQUwsQ0FBZUgsT0FBZixDQUF3QixHQUYzRCxDQUFOO0FBSUQ7QUFDRjtBQUNGO0FBQ0YsQ0FiRDs7ZUFlZXJULFM7O0FBQ2Z5VCxNQUFNLENBQUNDLE9BQVAsR0FBaUIxVCxTQUFqQiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEEgUmVzdFdyaXRlIGVuY2Fwc3VsYXRlcyBldmVyeXRoaW5nIHdlIG5lZWQgdG8gcnVuIGFuIG9wZXJhdGlvblxuLy8gdGhhdCB3cml0ZXMgdG8gdGhlIGRhdGFiYXNlLlxuLy8gVGhpcyBjb3VsZCBiZSBlaXRoZXIgYSBcImNyZWF0ZVwiIG9yIGFuIFwidXBkYXRlXCIuXG5cbnZhciBTY2hlbWFDb250cm9sbGVyID0gcmVxdWlyZSgnLi9Db250cm9sbGVycy9TY2hlbWFDb250cm9sbGVyJyk7XG52YXIgZGVlcGNvcHkgPSByZXF1aXJlKCdkZWVwY29weScpO1xuXG5jb25zdCBBdXRoID0gcmVxdWlyZSgnLi9BdXRoJyk7XG5jb25zdCBVdGlscyA9IHJlcXVpcmUoJy4vVXRpbHMnKTtcbnZhciBjcnlwdG9VdGlscyA9IHJlcXVpcmUoJy4vY3J5cHRvVXRpbHMnKTtcbnZhciBwYXNzd29yZENyeXB0byA9IHJlcXVpcmUoJy4vcGFzc3dvcmQnKTtcbnZhciBQYXJzZSA9IHJlcXVpcmUoJ3BhcnNlL25vZGUnKTtcbnZhciB0cmlnZ2VycyA9IHJlcXVpcmUoJy4vdHJpZ2dlcnMnKTtcbnZhciBDbGllbnRTREsgPSByZXF1aXJlKCcuL0NsaWVudFNESycpO1xuY29uc3QgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTtcbmltcG9ydCBSZXN0UXVlcnkgZnJvbSAnLi9SZXN0UXVlcnknO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBsb2dnZXIgZnJvbSAnLi9sb2dnZXInO1xuaW1wb3J0IHsgcmVxdWlyZWRDb2x1bW5zIH0gZnJvbSAnLi9Db250cm9sbGVycy9TY2hlbWFDb250cm9sbGVyJztcblxuLy8gcXVlcnkgYW5kIGRhdGEgYXJlIGJvdGggcHJvdmlkZWQgaW4gUkVTVCBBUEkgZm9ybWF0LiBTbyBkYXRhXG4vLyB0eXBlcyBhcmUgZW5jb2RlZCBieSBwbGFpbiBvbGQgb2JqZWN0cy5cbi8vIElmIHF1ZXJ5IGlzIG51bGwsIHRoaXMgaXMgYSBcImNyZWF0ZVwiIGFuZCB0aGUgZGF0YSBpbiBkYXRhIHNob3VsZCBiZVxuLy8gY3JlYXRlZC5cbi8vIE90aGVyd2lzZSB0aGlzIGlzIGFuIFwidXBkYXRlXCIgLSB0aGUgb2JqZWN0IG1hdGNoaW5nIHRoZSBxdWVyeVxuLy8gc2hvdWxkIGdldCB1cGRhdGVkIHdpdGggZGF0YS5cbi8vIFJlc3RXcml0ZSB3aWxsIGhhbmRsZSBvYmplY3RJZCwgY3JlYXRlZEF0LCBhbmQgdXBkYXRlZEF0IGZvclxuLy8gZXZlcnl0aGluZy4gSXQgYWxzbyBrbm93cyB0byB1c2UgdHJpZ2dlcnMgYW5kIHNwZWNpYWwgbW9kaWZpY2F0aW9uc1xuLy8gZm9yIHRoZSBfVXNlciBjbGFzcy5cbmZ1bmN0aW9uIFJlc3RXcml0ZShjb25maWcsIGF1dGgsIGNsYXNzTmFtZSwgcXVlcnksIGRhdGEsIG9yaWdpbmFsRGF0YSwgY2xpZW50U0RLLCBjb250ZXh0LCBhY3Rpb24pIHtcbiAgaWYgKGF1dGguaXNSZWFkT25seSkge1xuICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihcbiAgICAgIFBhcnNlLkVycm9yLk9QRVJBVElPTl9GT1JCSURERU4sXG4gICAgICAnQ2Fubm90IHBlcmZvcm0gYSB3cml0ZSBvcGVyYXRpb24gd2hlbiB1c2luZyByZWFkT25seU1hc3RlcktleSdcbiAgICApO1xuICB9XG4gIHRoaXMuY29uZmlnID0gY29uZmlnO1xuICB0aGlzLmF1dGggPSBhdXRoO1xuICB0aGlzLmNsYXNzTmFtZSA9IGNsYXNzTmFtZTtcbiAgdGhpcy5jbGllbnRTREsgPSBjbGllbnRTREs7XG4gIHRoaXMuc3RvcmFnZSA9IHt9O1xuICB0aGlzLnJ1bk9wdGlvbnMgPSB7fTtcbiAgdGhpcy5jb250ZXh0ID0gY29udGV4dCB8fCB7fTtcblxuICBpZiAoYWN0aW9uKSB7XG4gICAgdGhpcy5ydW5PcHRpb25zLmFjdGlvbiA9IGFjdGlvbjtcbiAgfVxuXG4gIGlmICghcXVlcnkpIHtcbiAgICBpZiAodGhpcy5jb25maWcuYWxsb3dDdXN0b21PYmplY3RJZCkge1xuICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkYXRhLCAnb2JqZWN0SWQnKSAmJiAhZGF0YS5vYmplY3RJZCkge1xuICAgICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoXG4gICAgICAgICAgUGFyc2UuRXJyb3IuTUlTU0lOR19PQkpFQ1RfSUQsXG4gICAgICAgICAgJ29iamVjdElkIG11c3Qgbm90IGJlIGVtcHR5LCBudWxsIG9yIHVuZGVmaW5lZCdcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGRhdGEub2JqZWN0SWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLklOVkFMSURfS0VZX05BTUUsICdvYmplY3RJZCBpcyBhbiBpbnZhbGlkIGZpZWxkIG5hbWUuJyk7XG4gICAgICB9XG4gICAgICBpZiAoZGF0YS5pZCkge1xuICAgICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuSU5WQUxJRF9LRVlfTkFNRSwgJ2lkIGlzIGFuIGludmFsaWQgZmllbGQgbmFtZS4nKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB0aGlzLmNoZWNrUHJvaGliaXRlZEtleXdvcmRzKGRhdGEpO1xuXG4gIC8vIFdoZW4gdGhlIG9wZXJhdGlvbiBpcyBjb21wbGV0ZSwgdGhpcy5yZXNwb25zZSBtYXkgaGF2ZSBzZXZlcmFsXG4gIC8vIGZpZWxkcy5cbiAgLy8gcmVzcG9uc2U6IHRoZSBhY3R1YWwgZGF0YSB0byBiZSByZXR1cm5lZFxuICAvLyBzdGF0dXM6IHRoZSBodHRwIHN0YXR1cyBjb2RlLiBpZiBub3QgcHJlc2VudCwgdHJlYXRlZCBsaWtlIGEgMjAwXG4gIC8vIGxvY2F0aW9uOiB0aGUgbG9jYXRpb24gaGVhZGVyLiBpZiBub3QgcHJlc2VudCwgbm8gbG9jYXRpb24gaGVhZGVyXG4gIHRoaXMucmVzcG9uc2UgPSBudWxsO1xuXG4gIC8vIFByb2Nlc3NpbmcgdGhpcyBvcGVyYXRpb24gbWF5IG11dGF0ZSBvdXIgZGF0YSwgc28gd2Ugb3BlcmF0ZSBvbiBhXG4gIC8vIGNvcHlcbiAgdGhpcy5xdWVyeSA9IGRlZXBjb3B5KHF1ZXJ5KTtcbiAgdGhpcy5kYXRhID0gZGVlcGNvcHkoZGF0YSk7XG4gIC8vIFdlIG5ldmVyIGNoYW5nZSBvcmlnaW5hbERhdGEsIHNvIHdlIGRvIG5vdCBuZWVkIGEgZGVlcCBjb3B5XG4gIHRoaXMub3JpZ2luYWxEYXRhID0gb3JpZ2luYWxEYXRhO1xuXG4gIC8vIFRoZSB0aW1lc3RhbXAgd2UnbGwgdXNlIGZvciB0aGlzIHdob2xlIG9wZXJhdGlvblxuICB0aGlzLnVwZGF0ZWRBdCA9IFBhcnNlLl9lbmNvZGUobmV3IERhdGUoKSkuaXNvO1xuXG4gIC8vIFNoYXJlZCBTY2hlbWFDb250cm9sbGVyIHRvIGJlIHJldXNlZCB0byByZWR1Y2UgdGhlIG51bWJlciBvZiBsb2FkU2NoZW1hKCkgY2FsbHMgcGVyIHJlcXVlc3RcbiAgLy8gT25jZSBzZXQgdGhlIHNjaGVtYURhdGEgc2hvdWxkIGJlIGltbXV0YWJsZVxuICB0aGlzLnZhbGlkU2NoZW1hQ29udHJvbGxlciA9IG51bGw7XG4gIHRoaXMucGVuZGluZ09wcyA9IHt9O1xufVxuXG4vLyBBIGNvbnZlbmllbnQgbWV0aG9kIHRvIHBlcmZvcm0gYWxsIHRoZSBzdGVwcyBvZiBwcm9jZXNzaW5nIHRoZVxuLy8gd3JpdGUsIGluIG9yZGVyLlxuLy8gUmV0dXJucyBhIHByb21pc2UgZm9yIGEge3Jlc3BvbnNlLCBzdGF0dXMsIGxvY2F0aW9ufSBvYmplY3QuXG4vLyBzdGF0dXMgYW5kIGxvY2F0aW9uIGFyZSBvcHRpb25hbC5cblJlc3RXcml0ZS5wcm90b3R5cGUuZXhlY3V0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpXG4gICAgLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0VXNlckFuZFJvbGVBQ0woKTtcbiAgICB9KVxuICAgIC50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybiB0aGlzLnZhbGlkYXRlQ2xpZW50Q2xhc3NDcmVhdGlvbigpO1xuICAgIH0pXG4gICAgLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlSW5zdGFsbGF0aW9uKCk7XG4gICAgfSlcbiAgICAudGhlbigoKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5oYW5kbGVTZXNzaW9uKCk7XG4gICAgfSlcbiAgICAudGhlbigoKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy52YWxpZGF0ZUF1dGhEYXRhKCk7XG4gICAgfSlcbiAgICAudGhlbigoKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5ydW5CZWZvcmVTYXZlVHJpZ2dlcigpO1xuICAgIH0pXG4gICAgLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuZW5zdXJlVW5pcXVlQXV0aERhdGFJZCgpO1xuICAgIH0pXG4gICAgLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuZGVsZXRlRW1haWxSZXNldFRva2VuSWZOZWVkZWQoKTtcbiAgICB9KVxuICAgIC50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybiB0aGlzLnZhbGlkYXRlU2NoZW1hKCk7XG4gICAgfSlcbiAgICAudGhlbihzY2hlbWFDb250cm9sbGVyID0+IHtcbiAgICAgIHRoaXMudmFsaWRTY2hlbWFDb250cm9sbGVyID0gc2NoZW1hQ29udHJvbGxlcjtcbiAgICAgIHJldHVybiB0aGlzLnNldFJlcXVpcmVkRmllbGRzSWZOZWVkZWQoKTtcbiAgICB9KVxuICAgIC50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVVzZXIoKTtcbiAgICB9KVxuICAgIC50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybiB0aGlzLmV4cGFuZEZpbGVzRm9yRXhpc3RpbmdPYmplY3RzKCk7XG4gICAgfSlcbiAgICAudGhlbigoKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5kZXN0cm95RHVwbGljYXRlZFNlc3Npb25zKCk7XG4gICAgfSlcbiAgICAudGhlbigoKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5ydW5EYXRhYmFzZU9wZXJhdGlvbigpO1xuICAgIH0pXG4gICAgLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlU2Vzc2lvblRva2VuSWZOZWVkZWQoKTtcbiAgICB9KVxuICAgIC50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybiB0aGlzLmhhbmRsZUZvbGxvd3VwKCk7XG4gICAgfSlcbiAgICAudGhlbigoKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5ydW5BZnRlclNhdmVUcmlnZ2VyKCk7XG4gICAgfSlcbiAgICAudGhlbigoKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5jbGVhblVzZXJBdXRoRGF0YSgpO1xuICAgIH0pXG4gICAgLnRoZW4oKCkgPT4ge1xuICAgICAgLy8gQXBwZW5kIHRoZSBhdXRoRGF0YVJlc3BvbnNlIGlmIGV4aXN0c1xuICAgICAgaWYgKHRoaXMuYXV0aERhdGFSZXNwb25zZSkge1xuICAgICAgICBpZiAodGhpcy5yZXNwb25zZSAmJiB0aGlzLnJlc3BvbnNlLnJlc3BvbnNlKSB7XG4gICAgICAgICAgdGhpcy5yZXNwb25zZS5yZXNwb25zZS5hdXRoRGF0YVJlc3BvbnNlID0gdGhpcy5hdXRoRGF0YVJlc3BvbnNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5yZXNwb25zZTtcbiAgICB9KTtcbn07XG5cbi8vIFVzZXMgdGhlIEF1dGggb2JqZWN0IHRvIGdldCB0aGUgbGlzdCBvZiByb2xlcywgYWRkcyB0aGUgdXNlciBpZFxuUmVzdFdyaXRlLnByb3RvdHlwZS5nZXRVc2VyQW5kUm9sZUFDTCA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKHRoaXMuYXV0aC5pc01hc3Rlcikge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgfVxuXG4gIHRoaXMucnVuT3B0aW9ucy5hY2wgPSBbJyonXTtcblxuICBpZiAodGhpcy5hdXRoLnVzZXIpIHtcbiAgICByZXR1cm4gdGhpcy5hdXRoLmdldFVzZXJSb2xlcygpLnRoZW4ocm9sZXMgPT4ge1xuICAgICAgdGhpcy5ydW5PcHRpb25zLmFjbCA9IHRoaXMucnVuT3B0aW9ucy5hY2wuY29uY2F0KHJvbGVzLCBbdGhpcy5hdXRoLnVzZXIuaWRdKTtcbiAgICAgIHJldHVybjtcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIH1cbn07XG5cbi8vIFZhbGlkYXRlcyB0aGlzIG9wZXJhdGlvbiBhZ2FpbnN0IHRoZSBhbGxvd0NsaWVudENsYXNzQ3JlYXRpb24gY29uZmlnLlxuUmVzdFdyaXRlLnByb3RvdHlwZS52YWxpZGF0ZUNsaWVudENsYXNzQ3JlYXRpb24gPSBmdW5jdGlvbiAoKSB7XG4gIGlmIChcbiAgICB0aGlzLmNvbmZpZy5hbGxvd0NsaWVudENsYXNzQ3JlYXRpb24gPT09IGZhbHNlICYmXG4gICAgIXRoaXMuYXV0aC5pc01hc3RlciAmJlxuICAgIFNjaGVtYUNvbnRyb2xsZXIuc3lzdGVtQ2xhc3Nlcy5pbmRleE9mKHRoaXMuY2xhc3NOYW1lKSA9PT0gLTFcbiAgKSB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLmRhdGFiYXNlXG4gICAgICAubG9hZFNjaGVtYSgpXG4gICAgICAudGhlbihzY2hlbWFDb250cm9sbGVyID0+IHNjaGVtYUNvbnRyb2xsZXIuaGFzQ2xhc3ModGhpcy5jbGFzc05hbWUpKVxuICAgICAgLnRoZW4oaGFzQ2xhc3MgPT4ge1xuICAgICAgICBpZiAoaGFzQ2xhc3MgIT09IHRydWUpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoXG4gICAgICAgICAgICBQYXJzZS5FcnJvci5PUEVSQVRJT05fRk9SQklEREVOLFxuICAgICAgICAgICAgJ1RoaXMgdXNlciBpcyBub3QgYWxsb3dlZCB0byBhY2Nlc3MgJyArICdub24tZXhpc3RlbnQgY2xhc3M6ICcgKyB0aGlzLmNsYXNzTmFtZVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgfVxufTtcblxuLy8gVmFsaWRhdGVzIHRoaXMgb3BlcmF0aW9uIGFnYWluc3QgdGhlIHNjaGVtYS5cblJlc3RXcml0ZS5wcm90b3R5cGUudmFsaWRhdGVTY2hlbWEgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLmNvbmZpZy5kYXRhYmFzZS52YWxpZGF0ZU9iamVjdChcbiAgICB0aGlzLmNsYXNzTmFtZSxcbiAgICB0aGlzLmRhdGEsXG4gICAgdGhpcy5xdWVyeSxcbiAgICB0aGlzLnJ1bk9wdGlvbnNcbiAgKTtcbn07XG5cbi8vIFJ1bnMgYW55IGJlZm9yZVNhdmUgdHJpZ2dlcnMgYWdhaW5zdCB0aGlzIG9wZXJhdGlvbi5cbi8vIEFueSBjaGFuZ2UgbGVhZHMgdG8gb3VyIGRhdGEgYmVpbmcgbXV0YXRlZC5cblJlc3RXcml0ZS5wcm90b3R5cGUucnVuQmVmb3JlU2F2ZVRyaWdnZXIgPSBmdW5jdGlvbiAoKSB7XG4gIGlmICh0aGlzLnJlc3BvbnNlIHx8IHRoaXMucnVuT3B0aW9ucy5tYW55KSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gQXZvaWQgZG9pbmcgYW55IHNldHVwIGZvciB0cmlnZ2VycyBpZiB0aGVyZSBpcyBubyAnYmVmb3JlU2F2ZScgdHJpZ2dlciBmb3IgdGhpcyBjbGFzcy5cbiAgaWYgKFxuICAgICF0cmlnZ2Vycy50cmlnZ2VyRXhpc3RzKHRoaXMuY2xhc3NOYW1lLCB0cmlnZ2Vycy5UeXBlcy5iZWZvcmVTYXZlLCB0aGlzLmNvbmZpZy5hcHBsaWNhdGlvbklkKVxuICApIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIH1cblxuICBjb25zdCB7IG9yaWdpbmFsT2JqZWN0LCB1cGRhdGVkT2JqZWN0IH0gPSB0aGlzLmJ1aWxkUGFyc2VPYmplY3RzKCk7XG5cbiAgY29uc3Qgc3RhdGVDb250cm9sbGVyID0gUGFyc2UuQ29yZU1hbmFnZXIuZ2V0T2JqZWN0U3RhdGVDb250cm9sbGVyKCk7XG4gIGNvbnN0IFtwZW5kaW5nXSA9IHN0YXRlQ29udHJvbGxlci5nZXRQZW5kaW5nT3BzKHVwZGF0ZWRPYmplY3QuX2dldFN0YXRlSWRlbnRpZmllcigpKTtcbiAgdGhpcy5wZW5kaW5nT3BzID0geyAuLi5wZW5kaW5nIH07XG5cbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpXG4gICAgLnRoZW4oKCkgPT4ge1xuICAgICAgLy8gQmVmb3JlIGNhbGxpbmcgdGhlIHRyaWdnZXIsIHZhbGlkYXRlIHRoZSBwZXJtaXNzaW9ucyBmb3IgdGhlIHNhdmUgb3BlcmF0aW9uXG4gICAgICBsZXQgZGF0YWJhc2VQcm9taXNlID0gbnVsbDtcbiAgICAgIGlmICh0aGlzLnF1ZXJ5KSB7XG4gICAgICAgIC8vIFZhbGlkYXRlIGZvciB1cGRhdGluZ1xuICAgICAgICBkYXRhYmFzZVByb21pc2UgPSB0aGlzLmNvbmZpZy5kYXRhYmFzZS51cGRhdGUoXG4gICAgICAgICAgdGhpcy5jbGFzc05hbWUsXG4gICAgICAgICAgdGhpcy5xdWVyeSxcbiAgICAgICAgICB0aGlzLmRhdGEsXG4gICAgICAgICAgdGhpcy5ydW5PcHRpb25zLFxuICAgICAgICAgIHRydWUsXG4gICAgICAgICAgdHJ1ZVxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVmFsaWRhdGUgZm9yIGNyZWF0aW5nXG4gICAgICAgIGRhdGFiYXNlUHJvbWlzZSA9IHRoaXMuY29uZmlnLmRhdGFiYXNlLmNyZWF0ZShcbiAgICAgICAgICB0aGlzLmNsYXNzTmFtZSxcbiAgICAgICAgICB0aGlzLmRhdGEsXG4gICAgICAgICAgdGhpcy5ydW5PcHRpb25zLFxuICAgICAgICAgIHRydWVcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIC8vIEluIHRoZSBjYXNlIHRoYXQgdGhlcmUgaXMgbm8gcGVybWlzc2lvbiBmb3IgdGhlIG9wZXJhdGlvbiwgaXQgdGhyb3dzIGFuIGVycm9yXG4gICAgICByZXR1cm4gZGF0YWJhc2VQcm9taXNlLnRoZW4ocmVzdWx0ID0+IHtcbiAgICAgICAgaWYgKCFyZXN1bHQgfHwgcmVzdWx0Lmxlbmd0aCA8PSAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLk9CSkVDVF9OT1RfRk9VTkQsICdPYmplY3Qgbm90IGZvdW5kLicpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KVxuICAgIC50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybiB0cmlnZ2Vycy5tYXliZVJ1blRyaWdnZXIoXG4gICAgICAgIHRyaWdnZXJzLlR5cGVzLmJlZm9yZVNhdmUsXG4gICAgICAgIHRoaXMuYXV0aCxcbiAgICAgICAgdXBkYXRlZE9iamVjdCxcbiAgICAgICAgb3JpZ2luYWxPYmplY3QsXG4gICAgICAgIHRoaXMuY29uZmlnLFxuICAgICAgICB0aGlzLmNvbnRleHRcbiAgICAgICk7XG4gICAgfSlcbiAgICAudGhlbihyZXNwb25zZSA9PiB7XG4gICAgICBpZiAocmVzcG9uc2UgJiYgcmVzcG9uc2Uub2JqZWN0KSB7XG4gICAgICAgIHRoaXMuc3RvcmFnZS5maWVsZHNDaGFuZ2VkQnlUcmlnZ2VyID0gXy5yZWR1Y2UoXG4gICAgICAgICAgcmVzcG9uc2Uub2JqZWN0LFxuICAgICAgICAgIChyZXN1bHQsIHZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgICAgIGlmICghXy5pc0VxdWFsKHRoaXMuZGF0YVtrZXldLCB2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgcmVzdWx0LnB1c2goa2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBbXVxuICAgICAgICApO1xuICAgICAgICB0aGlzLmRhdGEgPSByZXNwb25zZS5vYmplY3Q7XG4gICAgICAgIC8vIFdlIHNob3VsZCBkZWxldGUgdGhlIG9iamVjdElkIGZvciBhbiB1cGRhdGUgd3JpdGVcbiAgICAgICAgaWYgKHRoaXMucXVlcnkgJiYgdGhpcy5xdWVyeS5vYmplY3RJZCkge1xuICAgICAgICAgIGRlbGV0ZSB0aGlzLmRhdGEub2JqZWN0SWQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuY2hlY2tQcm9oaWJpdGVkS2V5d29yZHModGhpcy5kYXRhKTtcbiAgICB9KTtcbn07XG5cblJlc3RXcml0ZS5wcm90b3R5cGUucnVuQmVmb3JlTG9naW5UcmlnZ2VyID0gYXN5bmMgZnVuY3Rpb24gKHVzZXJEYXRhKSB7XG4gIC8vIEF2b2lkIGRvaW5nIGFueSBzZXR1cCBmb3IgdHJpZ2dlcnMgaWYgdGhlcmUgaXMgbm8gJ2JlZm9yZUxvZ2luJyB0cmlnZ2VyXG4gIGlmIChcbiAgICAhdHJpZ2dlcnMudHJpZ2dlckV4aXN0cyh0aGlzLmNsYXNzTmFtZSwgdHJpZ2dlcnMuVHlwZXMuYmVmb3JlTG9naW4sIHRoaXMuY29uZmlnLmFwcGxpY2F0aW9uSWQpXG4gICkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIENsb3VkIGNvZGUgZ2V0cyBhIGJpdCBvZiBleHRyYSBkYXRhIGZvciBpdHMgb2JqZWN0c1xuICBjb25zdCBleHRyYURhdGEgPSB7IGNsYXNzTmFtZTogdGhpcy5jbGFzc05hbWUgfTtcblxuICAvLyBFeHBhbmQgZmlsZSBvYmplY3RzXG4gIHRoaXMuY29uZmlnLmZpbGVzQ29udHJvbGxlci5leHBhbmRGaWxlc0luT2JqZWN0KHRoaXMuY29uZmlnLCB1c2VyRGF0YSk7XG5cbiAgY29uc3QgdXNlciA9IHRyaWdnZXJzLmluZmxhdGUoZXh0cmFEYXRhLCB1c2VyRGF0YSk7XG5cbiAgLy8gbm8gbmVlZCB0byByZXR1cm4gYSByZXNwb25zZVxuICBhd2FpdCB0cmlnZ2Vycy5tYXliZVJ1blRyaWdnZXIoXG4gICAgdHJpZ2dlcnMuVHlwZXMuYmVmb3JlTG9naW4sXG4gICAgdGhpcy5hdXRoLFxuICAgIHVzZXIsXG4gICAgbnVsbCxcbiAgICB0aGlzLmNvbmZpZyxcbiAgICB0aGlzLmNvbnRleHRcbiAgKTtcbn07XG5cblJlc3RXcml0ZS5wcm90b3R5cGUuc2V0UmVxdWlyZWRGaWVsZHNJZk5lZWRlZCA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKHRoaXMuZGF0YSkge1xuICAgIHJldHVybiB0aGlzLnZhbGlkU2NoZW1hQ29udHJvbGxlci5nZXRBbGxDbGFzc2VzKCkudGhlbihhbGxDbGFzc2VzID0+IHtcbiAgICAgIGNvbnN0IHNjaGVtYSA9IGFsbENsYXNzZXMuZmluZChvbmVDbGFzcyA9PiBvbmVDbGFzcy5jbGFzc05hbWUgPT09IHRoaXMuY2xhc3NOYW1lKTtcbiAgICAgIGNvbnN0IHNldFJlcXVpcmVkRmllbGRJZk5lZWRlZCA9IChmaWVsZE5hbWUsIHNldERlZmF1bHQpID0+IHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRoaXMuZGF0YVtmaWVsZE5hbWVdID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICB0aGlzLmRhdGFbZmllbGROYW1lXSA9PT0gbnVsbCB8fFxuICAgICAgICAgIHRoaXMuZGF0YVtmaWVsZE5hbWVdID09PSAnJyB8fFxuICAgICAgICAgICh0eXBlb2YgdGhpcy5kYXRhW2ZpZWxkTmFtZV0gPT09ICdvYmplY3QnICYmIHRoaXMuZGF0YVtmaWVsZE5hbWVdLl9fb3AgPT09ICdEZWxldGUnKVxuICAgICAgICApIHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBzZXREZWZhdWx0ICYmXG4gICAgICAgICAgICBzY2hlbWEuZmllbGRzW2ZpZWxkTmFtZV0gJiZcbiAgICAgICAgICAgIHNjaGVtYS5maWVsZHNbZmllbGROYW1lXS5kZWZhdWx0VmFsdWUgIT09IG51bGwgJiZcbiAgICAgICAgICAgIHNjaGVtYS5maWVsZHNbZmllbGROYW1lXS5kZWZhdWx0VmFsdWUgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgKHRoaXMuZGF0YVtmaWVsZE5hbWVdID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgICAgKHR5cGVvZiB0aGlzLmRhdGFbZmllbGROYW1lXSA9PT0gJ29iamVjdCcgJiYgdGhpcy5kYXRhW2ZpZWxkTmFtZV0uX19vcCA9PT0gJ0RlbGV0ZScpKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgdGhpcy5kYXRhW2ZpZWxkTmFtZV0gPSBzY2hlbWEuZmllbGRzW2ZpZWxkTmFtZV0uZGVmYXVsdFZhbHVlO1xuICAgICAgICAgICAgdGhpcy5zdG9yYWdlLmZpZWxkc0NoYW5nZWRCeVRyaWdnZXIgPSB0aGlzLnN0b3JhZ2UuZmllbGRzQ2hhbmdlZEJ5VHJpZ2dlciB8fCBbXTtcbiAgICAgICAgICAgIGlmICh0aGlzLnN0b3JhZ2UuZmllbGRzQ2hhbmdlZEJ5VHJpZ2dlci5pbmRleE9mKGZpZWxkTmFtZSkgPCAwKSB7XG4gICAgICAgICAgICAgIHRoaXMuc3RvcmFnZS5maWVsZHNDaGFuZ2VkQnlUcmlnZ2VyLnB1c2goZmllbGROYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKHNjaGVtYS5maWVsZHNbZmllbGROYW1lXSAmJiBzY2hlbWEuZmllbGRzW2ZpZWxkTmFtZV0ucmVxdWlyZWQgPT09IHRydWUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5WQUxJREFUSU9OX0VSUk9SLCBgJHtmaWVsZE5hbWV9IGlzIHJlcXVpcmVkYCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICAvLyBBZGQgZGVmYXVsdCBmaWVsZHNcbiAgICAgIHRoaXMuZGF0YS51cGRhdGVkQXQgPSB0aGlzLnVwZGF0ZWRBdDtcbiAgICAgIGlmICghdGhpcy5xdWVyeSkge1xuICAgICAgICB0aGlzLmRhdGEuY3JlYXRlZEF0ID0gdGhpcy51cGRhdGVkQXQ7XG5cbiAgICAgICAgLy8gT25seSBhc3NpZ24gbmV3IG9iamVjdElkIGlmIHdlIGFyZSBjcmVhdGluZyBuZXcgb2JqZWN0XG4gICAgICAgIGlmICghdGhpcy5kYXRhLm9iamVjdElkKSB7XG4gICAgICAgICAgdGhpcy5kYXRhLm9iamVjdElkID0gY3J5cHRvVXRpbHMubmV3T2JqZWN0SWQodGhpcy5jb25maWcub2JqZWN0SWRTaXplKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2NoZW1hKSB7XG4gICAgICAgICAgT2JqZWN0LmtleXMoc2NoZW1hLmZpZWxkcykuZm9yRWFjaChmaWVsZE5hbWUgPT4ge1xuICAgICAgICAgICAgc2V0UmVxdWlyZWRGaWVsZElmTmVlZGVkKGZpZWxkTmFtZSwgdHJ1ZSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoc2NoZW1hKSB7XG4gICAgICAgIE9iamVjdC5rZXlzKHRoaXMuZGF0YSkuZm9yRWFjaChmaWVsZE5hbWUgPT4ge1xuICAgICAgICAgIHNldFJlcXVpcmVkRmllbGRJZk5lZWRlZChmaWVsZE5hbWUsIGZhbHNlKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xufTtcblxuLy8gVHJhbnNmb3JtcyBhdXRoIGRhdGEgZm9yIGEgdXNlciBvYmplY3QuXG4vLyBEb2VzIG5vdGhpbmcgaWYgdGhpcyBpc24ndCBhIHVzZXIgb2JqZWN0LlxuLy8gUmV0dXJucyBhIHByb21pc2UgZm9yIHdoZW4gd2UncmUgZG9uZSBpZiBpdCBjYW4ndCBmaW5pc2ggdGhpcyB0aWNrLlxuUmVzdFdyaXRlLnByb3RvdHlwZS52YWxpZGF0ZUF1dGhEYXRhID0gZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy5jbGFzc05hbWUgIT09ICdfVXNlcicpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBhdXRoRGF0YSA9IHRoaXMuZGF0YS5hdXRoRGF0YTtcbiAgY29uc3QgaGFzVXNlcm5hbWVBbmRQYXNzd29yZCA9XG4gICAgdHlwZW9mIHRoaXMuZGF0YS51c2VybmFtZSA9PT0gJ3N0cmluZycgJiYgdHlwZW9mIHRoaXMuZGF0YS5wYXNzd29yZCA9PT0gJ3N0cmluZyc7XG5cbiAgaWYgKCF0aGlzLnF1ZXJ5ICYmICFhdXRoRGF0YSkge1xuICAgIGlmICh0eXBlb2YgdGhpcy5kYXRhLnVzZXJuYW1lICE9PSAnc3RyaW5nJyB8fCBfLmlzRW1wdHkodGhpcy5kYXRhLnVzZXJuYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLlVTRVJOQU1FX01JU1NJTkcsICdiYWQgb3IgbWlzc2luZyB1c2VybmFtZScpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHRoaXMuZGF0YS5wYXNzd29yZCAhPT0gJ3N0cmluZycgfHwgXy5pc0VtcHR5KHRoaXMuZGF0YS5wYXNzd29yZCkpIHtcbiAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5QQVNTV09SRF9NSVNTSU5HLCAncGFzc3dvcmQgaXMgcmVxdWlyZWQnKTtcbiAgICB9XG4gIH1cblxuICBpZiAoXG4gICAgKGF1dGhEYXRhICYmICFPYmplY3Qua2V5cyhhdXRoRGF0YSkubGVuZ3RoKSB8fFxuICAgICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGhpcy5kYXRhLCAnYXV0aERhdGEnKVxuICApIHtcbiAgICAvLyBOb3RoaW5nIHRvIHZhbGlkYXRlIGhlcmVcbiAgICByZXR1cm47XG4gIH0gZWxzZSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMuZGF0YSwgJ2F1dGhEYXRhJykgJiYgIXRoaXMuZGF0YS5hdXRoRGF0YSkge1xuICAgIC8vIEhhbmRsZSBzYXZpbmcgYXV0aERhdGEgdG8gbnVsbFxuICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihcbiAgICAgIFBhcnNlLkVycm9yLlVOU1VQUE9SVEVEX1NFUlZJQ0UsXG4gICAgICAnVGhpcyBhdXRoZW50aWNhdGlvbiBtZXRob2QgaXMgdW5zdXBwb3J0ZWQuJ1xuICAgICk7XG4gIH1cblxuICB2YXIgcHJvdmlkZXJzID0gT2JqZWN0LmtleXMoYXV0aERhdGEpO1xuICBpZiAocHJvdmlkZXJzLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBjYW5IYW5kbGVBdXRoRGF0YSA9IHByb3ZpZGVycy5zb21lKHByb3ZpZGVyID0+IHtcbiAgICAgIHZhciBwcm92aWRlckF1dGhEYXRhID0gYXV0aERhdGFbcHJvdmlkZXJdO1xuICAgICAgdmFyIGhhc1Rva2VuID0gcHJvdmlkZXJBdXRoRGF0YSAmJiBwcm92aWRlckF1dGhEYXRhLmlkO1xuICAgICAgcmV0dXJuIGhhc1Rva2VuIHx8IHByb3ZpZGVyQXV0aERhdGEgPT09IG51bGw7XG4gICAgfSk7XG4gICAgaWYgKGNhbkhhbmRsZUF1dGhEYXRhIHx8IGhhc1VzZXJuYW1lQW5kUGFzc3dvcmQgfHwgdGhpcy5hdXRoLmlzTWFzdGVyIHx8IHRoaXMuZ2V0VXNlcklkKCkpIHtcbiAgICAgIHJldHVybiB0aGlzLmhhbmRsZUF1dGhEYXRhKGF1dGhEYXRhKTtcbiAgICB9XG4gIH1cbiAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFxuICAgIFBhcnNlLkVycm9yLlVOU1VQUE9SVEVEX1NFUlZJQ0UsXG4gICAgJ1RoaXMgYXV0aGVudGljYXRpb24gbWV0aG9kIGlzIHVuc3VwcG9ydGVkLidcbiAgKTtcbn07XG5cblJlc3RXcml0ZS5wcm90b3R5cGUuZmlsdGVyZWRPYmplY3RzQnlBQ0wgPSBmdW5jdGlvbiAob2JqZWN0cykge1xuICBpZiAodGhpcy5hdXRoLmlzTWFzdGVyKSB7XG4gICAgcmV0dXJuIG9iamVjdHM7XG4gIH1cbiAgcmV0dXJuIG9iamVjdHMuZmlsdGVyKG9iamVjdCA9PiB7XG4gICAgaWYgKCFvYmplY3QuQUNMKSB7XG4gICAgICByZXR1cm4gdHJ1ZTsgLy8gbGVnYWN5IHVzZXJzIHRoYXQgaGF2ZSBubyBBQ0wgZmllbGQgb24gdGhlbVxuICAgIH1cbiAgICAvLyBSZWd1bGFyIHVzZXJzIHRoYXQgaGF2ZSBiZWVuIGxvY2tlZCBvdXQuXG4gICAgcmV0dXJuIG9iamVjdC5BQ0wgJiYgT2JqZWN0LmtleXMob2JqZWN0LkFDTCkubGVuZ3RoID4gMDtcbiAgfSk7XG59O1xuXG5SZXN0V3JpdGUucHJvdG90eXBlLmdldFVzZXJJZCA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKHRoaXMucXVlcnkgJiYgdGhpcy5xdWVyeS5vYmplY3RJZCAmJiB0aGlzLmNsYXNzTmFtZSA9PT0gJ19Vc2VyJykge1xuICAgIHJldHVybiB0aGlzLnF1ZXJ5Lm9iamVjdElkO1xuICB9IGVsc2UgaWYgKHRoaXMuYXV0aCAmJiB0aGlzLmF1dGgudXNlciAmJiB0aGlzLmF1dGgudXNlci5pZCkge1xuICAgIHJldHVybiB0aGlzLmF1dGgudXNlci5pZDtcbiAgfVxufTtcblxuLy8gRGV2ZWxvcGVycyBhcmUgYWxsb3dlZCB0byBjaGFuZ2UgYXV0aERhdGEgdmlhIGJlZm9yZSBzYXZlIHRyaWdnZXJcbi8vIHdlIG5lZWQgYWZ0ZXIgYmVmb3JlIHNhdmUgdG8gZW5zdXJlIHRoYXQgdGhlIGRldmVsb3BlclxuLy8gaXMgbm90IGN1cnJlbnRseSBkdXBsaWNhdGluZyBhdXRoIGRhdGEgSURcblJlc3RXcml0ZS5wcm90b3R5cGUuZW5zdXJlVW5pcXVlQXV0aERhdGFJZCA9IGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgaWYgKHRoaXMuY2xhc3NOYW1lICE9PSAnX1VzZXInIHx8ICF0aGlzLmRhdGEuYXV0aERhdGEpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBoYXNBdXRoRGF0YUlkID0gT2JqZWN0LmtleXModGhpcy5kYXRhLmF1dGhEYXRhKS5zb21lKFxuICAgIGtleSA9PiB0aGlzLmRhdGEuYXV0aERhdGFba2V5XSAmJiB0aGlzLmRhdGEuYXV0aERhdGFba2V5XS5pZFxuICApO1xuXG4gIGlmICghaGFzQXV0aERhdGFJZCkgcmV0dXJuO1xuXG4gIGNvbnN0IHIgPSBhd2FpdCBBdXRoLmZpbmRVc2Vyc1dpdGhBdXRoRGF0YSh0aGlzLmNvbmZpZywgdGhpcy5kYXRhLmF1dGhEYXRhKTtcbiAgY29uc3QgcmVzdWx0cyA9IHRoaXMuZmlsdGVyZWRPYmplY3RzQnlBQ0wocik7XG4gIGlmIChyZXN1bHRzLmxlbmd0aCA+IDEpIHtcbiAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuQUNDT1VOVF9BTFJFQURZX0xJTktFRCwgJ3RoaXMgYXV0aCBpcyBhbHJlYWR5IHVzZWQnKTtcbiAgfVxuICAvLyB1c2UgZGF0YS5vYmplY3RJZCBpbiBjYXNlIG9mIGxvZ2luIHRpbWUgYW5kIGZvdW5kIHVzZXIgZHVyaW5nIGhhbmRsZSB2YWxpZGF0ZUF1dGhEYXRhXG4gIGNvbnN0IHVzZXJJZCA9IHRoaXMuZ2V0VXNlcklkKCkgfHwgdGhpcy5kYXRhLm9iamVjdElkO1xuICBpZiAocmVzdWx0cy5sZW5ndGggPT09IDEgJiYgdXNlcklkICE9PSByZXN1bHRzWzBdLm9iamVjdElkKSB7XG4gICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLkFDQ09VTlRfQUxSRUFEWV9MSU5LRUQsICd0aGlzIGF1dGggaXMgYWxyZWFkeSB1c2VkJyk7XG4gIH1cbn07XG5cblJlc3RXcml0ZS5wcm90b3R5cGUuaGFuZGxlQXV0aERhdGEgPSBhc3luYyBmdW5jdGlvbiAoYXV0aERhdGEpIHtcbiAgY29uc3QgciA9IGF3YWl0IEF1dGguZmluZFVzZXJzV2l0aEF1dGhEYXRhKHRoaXMuY29uZmlnLCBhdXRoRGF0YSk7XG4gIGNvbnN0IHJlc3VsdHMgPSB0aGlzLmZpbHRlcmVkT2JqZWN0c0J5QUNMKHIpO1xuXG4gIGlmIChyZXN1bHRzLmxlbmd0aCA+IDEpIHtcbiAgICAvLyBUbyBhdm9pZCBodHRwczovL2dpdGh1Yi5jb20vcGFyc2UtY29tbXVuaXR5L3BhcnNlLXNlcnZlci9zZWN1cml0eS9hZHZpc29yaWVzL0dIU0EtOHczai1nOTgzLThqaDVcbiAgICAvLyBMZXQncyBydW4gc29tZSB2YWxpZGF0aW9uIGJlZm9yZSB0aHJvd2luZ1xuICAgIGF3YWl0IEF1dGguaGFuZGxlQXV0aERhdGFWYWxpZGF0aW9uKGF1dGhEYXRhLCB0aGlzLCByZXN1bHRzWzBdKTtcbiAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuQUNDT1VOVF9BTFJFQURZX0xJTktFRCwgJ3RoaXMgYXV0aCBpcyBhbHJlYWR5IHVzZWQnKTtcbiAgfVxuXG4gIC8vIE5vIHVzZXIgZm91bmQgd2l0aCBwcm92aWRlZCBhdXRoRGF0YSB3ZSBuZWVkIHRvIHZhbGlkYXRlXG4gIGlmICghcmVzdWx0cy5sZW5ndGgpIHtcbiAgICBjb25zdCB7IGF1dGhEYXRhOiB2YWxpZGF0ZWRBdXRoRGF0YSwgYXV0aERhdGFSZXNwb25zZSB9ID0gYXdhaXQgQXV0aC5oYW5kbGVBdXRoRGF0YVZhbGlkYXRpb24oXG4gICAgICBhdXRoRGF0YSxcbiAgICAgIHRoaXNcbiAgICApO1xuICAgIHRoaXMuYXV0aERhdGFSZXNwb25zZSA9IGF1dGhEYXRhUmVzcG9uc2U7XG4gICAgLy8gUmVwbGFjZSBjdXJyZW50IGF1dGhEYXRhIGJ5IHRoZSBuZXcgdmFsaWRhdGVkIG9uZVxuICAgIHRoaXMuZGF0YS5hdXRoRGF0YSA9IHZhbGlkYXRlZEF1dGhEYXRhO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIFVzZXIgZm91bmQgd2l0aCBwcm92aWRlZCBhdXRoRGF0YVxuICBpZiAocmVzdWx0cy5sZW5ndGggPT09IDEpIHtcbiAgICBjb25zdCB1c2VySWQgPSB0aGlzLmdldFVzZXJJZCgpO1xuICAgIGNvbnN0IHVzZXJSZXN1bHQgPSByZXN1bHRzWzBdO1xuICAgIC8vIFByZXZlbnQgZHVwbGljYXRlIGF1dGhEYXRhIGlkXG4gICAgaWYgKHVzZXJJZCAmJiB1c2VySWQgIT09IHVzZXJSZXN1bHQub2JqZWN0SWQpIHtcbiAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5BQ0NPVU5UX0FMUkVBRFlfTElOS0VELCAndGhpcyBhdXRoIGlzIGFscmVhZHkgdXNlZCcpO1xuICAgIH1cblxuICAgIHRoaXMuc3RvcmFnZS5hdXRoUHJvdmlkZXIgPSBPYmplY3Qua2V5cyhhdXRoRGF0YSkuam9pbignLCcpO1xuXG4gICAgY29uc3QgeyBoYXNNdXRhdGVkQXV0aERhdGEsIG11dGF0ZWRBdXRoRGF0YSB9ID0gQXV0aC5oYXNNdXRhdGVkQXV0aERhdGEoXG4gICAgICBhdXRoRGF0YSxcbiAgICAgIHVzZXJSZXN1bHQuYXV0aERhdGFcbiAgICApO1xuXG4gICAgY29uc3QgaXNDdXJyZW50VXNlckxvZ2dlZE9yTWFzdGVyID1cbiAgICAgICh0aGlzLmF1dGggJiYgdGhpcy5hdXRoLnVzZXIgJiYgdGhpcy5hdXRoLnVzZXIuaWQgPT09IHVzZXJSZXN1bHQub2JqZWN0SWQpIHx8XG4gICAgICB0aGlzLmF1dGguaXNNYXN0ZXI7XG5cbiAgICBjb25zdCBpc0xvZ2luID0gIXVzZXJJZDtcblxuICAgIGlmIChpc0xvZ2luIHx8IGlzQ3VycmVudFVzZXJMb2dnZWRPck1hc3Rlcikge1xuICAgICAgLy8gbm8gdXNlciBtYWtpbmcgdGhlIGNhbGxcbiAgICAgIC8vIE9SIHRoZSB1c2VyIG1ha2luZyB0aGUgY2FsbCBpcyB0aGUgcmlnaHQgb25lXG4gICAgICAvLyBMb2dpbiB3aXRoIGF1dGggZGF0YVxuICAgICAgZGVsZXRlIHJlc3VsdHNbMF0ucGFzc3dvcmQ7XG5cbiAgICAgIC8vIG5lZWQgdG8gc2V0IHRoZSBvYmplY3RJZCBmaXJzdCBvdGhlcndpc2UgbG9jYXRpb24gaGFzIHRyYWlsaW5nIHVuZGVmaW5lZFxuICAgICAgdGhpcy5kYXRhLm9iamVjdElkID0gdXNlclJlc3VsdC5vYmplY3RJZDtcblxuICAgICAgaWYgKCF0aGlzLnF1ZXJ5IHx8ICF0aGlzLnF1ZXJ5Lm9iamVjdElkKSB7XG4gICAgICAgIHRoaXMucmVzcG9uc2UgPSB7XG4gICAgICAgICAgcmVzcG9uc2U6IHVzZXJSZXN1bHQsXG4gICAgICAgICAgbG9jYXRpb246IHRoaXMubG9jYXRpb24oKSxcbiAgICAgICAgfTtcbiAgICAgICAgLy8gUnVuIGJlZm9yZUxvZ2luIGhvb2sgYmVmb3JlIHN0b3JpbmcgYW55IHVwZGF0ZXNcbiAgICAgICAgLy8gdG8gYXV0aERhdGEgb24gdGhlIGRiOyBjaGFuZ2VzIHRvIHVzZXJSZXN1bHRcbiAgICAgICAgLy8gd2lsbCBiZSBpZ25vcmVkLlxuICAgICAgICBhd2FpdCB0aGlzLnJ1bkJlZm9yZUxvZ2luVHJpZ2dlcihkZWVwY29weSh1c2VyUmVzdWx0KSk7XG5cbiAgICAgICAgLy8gSWYgd2UgYXJlIGluIGxvZ2luIG9wZXJhdGlvbiB2aWEgYXV0aERhdGFcbiAgICAgICAgLy8gd2UgbmVlZCB0byBiZSBzdXJlIHRoYXQgdGhlIHVzZXIgaGFzIHByb3ZpZGVkXG4gICAgICAgIC8vIHJlcXVpcmVkIGF1dGhEYXRhXG4gICAgICAgIEF1dGguY2hlY2tJZlVzZXJIYXNQcm92aWRlZENvbmZpZ3VyZWRQcm92aWRlcnNGb3JMb2dpbihcbiAgICAgICAgICBhdXRoRGF0YSxcbiAgICAgICAgICB1c2VyUmVzdWx0LmF1dGhEYXRhLFxuICAgICAgICAgIHRoaXMuY29uZmlnXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIFByZXZlbnQgdmFsaWRhdGluZyBpZiBubyBtdXRhdGVkIGRhdGEgZGV0ZWN0ZWQgb24gdXBkYXRlXG4gICAgICBpZiAoIWhhc011dGF0ZWRBdXRoRGF0YSAmJiBpc0N1cnJlbnRVc2VyTG9nZ2VkT3JNYXN0ZXIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBGb3JjZSB0byB2YWxpZGF0ZSBhbGwgcHJvdmlkZWQgYXV0aERhdGEgb24gbG9naW5cbiAgICAgIC8vIG9uIHVwZGF0ZSBvbmx5IHZhbGlkYXRlIG11dGF0ZWQgb25lc1xuICAgICAgaWYgKGhhc011dGF0ZWRBdXRoRGF0YSB8fCAhdGhpcy5jb25maWcuYWxsb3dFeHBpcmVkQXV0aERhdGFUb2tlbikge1xuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBBdXRoLmhhbmRsZUF1dGhEYXRhVmFsaWRhdGlvbihcbiAgICAgICAgICBpc0xvZ2luID8gYXV0aERhdGEgOiBtdXRhdGVkQXV0aERhdGEsXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICB1c2VyUmVzdWx0XG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuZGF0YS5hdXRoRGF0YSA9IHJlcy5hdXRoRGF0YTtcbiAgICAgICAgdGhpcy5hdXRoRGF0YVJlc3BvbnNlID0gcmVzLmF1dGhEYXRhUmVzcG9uc2U7XG4gICAgICB9XG5cbiAgICAgIC8vIElGIHdlIGFyZSBpbiBsb2dpbiB3ZSdsbCBza2lwIHRoZSBkYXRhYmFzZSBvcGVyYXRpb24gLyBiZWZvcmVTYXZlIC8gYWZ0ZXJTYXZlIGV0Yy4uLlxuICAgICAgLy8gd2UgbmVlZCB0byBzZXQgaXQgdXAgdGhlcmUuXG4gICAgICAvLyBXZSBhcmUgc3VwcG9zZWQgdG8gaGF2ZSBhIHJlc3BvbnNlIG9ubHkgb24gTE9HSU4gd2l0aCBhdXRoRGF0YSwgc28gd2Ugc2tpcCB0aG9zZVxuICAgICAgLy8gSWYgd2UncmUgbm90IGxvZ2dpbmcgaW4sIGJ1dCBqdXN0IHVwZGF0aW5nIHRoZSBjdXJyZW50IHVzZXIsIHdlIGNhbiBzYWZlbHkgc2tpcCB0aGF0IHBhcnRcbiAgICAgIGlmICh0aGlzLnJlc3BvbnNlKSB7XG4gICAgICAgIC8vIEFzc2lnbiB0aGUgbmV3IGF1dGhEYXRhIGluIHRoZSByZXNwb25zZVxuICAgICAgICBPYmplY3Qua2V5cyhtdXRhdGVkQXV0aERhdGEpLmZvckVhY2gocHJvdmlkZXIgPT4ge1xuICAgICAgICAgIHRoaXMucmVzcG9uc2UucmVzcG9uc2UuYXV0aERhdGFbcHJvdmlkZXJdID0gbXV0YXRlZEF1dGhEYXRhW3Byb3ZpZGVyXTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gUnVuIHRoZSBEQiB1cGRhdGUgZGlyZWN0bHksIGFzICdtYXN0ZXInIG9ubHkgaWYgYXV0aERhdGEgY29udGFpbnMgc29tZSBrZXlzXG4gICAgICAgIC8vIGF1dGhEYXRhIGNvdWxkIG5vdCBjb250YWlucyBrZXlzIGFmdGVyIHZhbGlkYXRpb24gaWYgdGhlIGF1dGhBZGFwdGVyXG4gICAgICAgIC8vIHVzZXMgdGhlIGBkb05vdFNhdmVgIG9wdGlvbi4gSnVzdCB1cGRhdGUgdGhlIGF1dGhEYXRhIHBhcnRcbiAgICAgICAgLy8gVGhlbiB3ZSdyZSBnb29kIGZvciB0aGUgdXNlciwgZWFybHkgZXhpdCBvZiBzb3J0c1xuICAgICAgICBpZiAoT2JqZWN0LmtleXModGhpcy5kYXRhLmF1dGhEYXRhKS5sZW5ndGgpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLmNvbmZpZy5kYXRhYmFzZS51cGRhdGUoXG4gICAgICAgICAgICB0aGlzLmNsYXNzTmFtZSxcbiAgICAgICAgICAgIHsgb2JqZWN0SWQ6IHRoaXMuZGF0YS5vYmplY3RJZCB9LFxuICAgICAgICAgICAgeyBhdXRoRGF0YTogdGhpcy5kYXRhLmF1dGhEYXRhIH0sXG4gICAgICAgICAgICB7fVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn07XG5cbi8vIFRoZSBub24tdGhpcmQtcGFydHkgcGFydHMgb2YgVXNlciB0cmFuc2Zvcm1hdGlvblxuUmVzdFdyaXRlLnByb3RvdHlwZS50cmFuc2Zvcm1Vc2VyID0gZnVuY3Rpb24gKCkge1xuICB2YXIgcHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZSgpO1xuICBpZiAodGhpcy5jbGFzc05hbWUgIT09ICdfVXNlcicpIHtcbiAgICByZXR1cm4gcHJvbWlzZTtcbiAgfVxuXG4gIGlmICghdGhpcy5hdXRoLmlzTWFzdGVyICYmICdlbWFpbFZlcmlmaWVkJyBpbiB0aGlzLmRhdGEpIHtcbiAgICBjb25zdCBlcnJvciA9IGBDbGllbnRzIGFyZW4ndCBhbGxvd2VkIHRvIG1hbnVhbGx5IHVwZGF0ZSBlbWFpbCB2ZXJpZmljYXRpb24uYDtcbiAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuT1BFUkFUSU9OX0ZPUkJJRERFTiwgZXJyb3IpO1xuICB9XG5cbiAgLy8gRG8gbm90IGNsZWFudXAgc2Vzc2lvbiBpZiBvYmplY3RJZCBpcyBub3Qgc2V0XG4gIGlmICh0aGlzLnF1ZXJ5ICYmIHRoaXMub2JqZWN0SWQoKSkge1xuICAgIC8vIElmIHdlJ3JlIHVwZGF0aW5nIGEgX1VzZXIgb2JqZWN0LCB3ZSBuZWVkIHRvIGNsZWFyIG91dCB0aGUgY2FjaGUgZm9yIHRoYXQgdXNlci4gRmluZCBhbGwgdGhlaXJcbiAgICAvLyBzZXNzaW9uIHRva2VucywgYW5kIHJlbW92ZSB0aGVtIGZyb20gdGhlIGNhY2hlLlxuICAgIHByb21pc2UgPSBuZXcgUmVzdFF1ZXJ5KHRoaXMuY29uZmlnLCBBdXRoLm1hc3Rlcih0aGlzLmNvbmZpZyksICdfU2Vzc2lvbicsIHtcbiAgICAgIHVzZXI6IHtcbiAgICAgICAgX190eXBlOiAnUG9pbnRlcicsXG4gICAgICAgIGNsYXNzTmFtZTogJ19Vc2VyJyxcbiAgICAgICAgb2JqZWN0SWQ6IHRoaXMub2JqZWN0SWQoKSxcbiAgICAgIH0sXG4gICAgfSlcbiAgICAgIC5leGVjdXRlKClcbiAgICAgIC50aGVuKHJlc3VsdHMgPT4ge1xuICAgICAgICByZXN1bHRzLnJlc3VsdHMuZm9yRWFjaChzZXNzaW9uID0+XG4gICAgICAgICAgdGhpcy5jb25maWcuY2FjaGVDb250cm9sbGVyLnVzZXIuZGVsKHNlc3Npb24uc2Vzc2lvblRva2VuKVxuICAgICAgICApO1xuICAgICAgfSk7XG4gIH1cblxuICByZXR1cm4gcHJvbWlzZVxuICAgIC50aGVuKCgpID0+IHtcbiAgICAgIC8vIFRyYW5zZm9ybSB0aGUgcGFzc3dvcmRcbiAgICAgIGlmICh0aGlzLmRhdGEucGFzc3dvcmQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyBpZ25vcmUgb25seSBpZiB1bmRlZmluZWQuIHNob3VsZCBwcm9jZWVkIGlmIGVtcHR5ICgnJylcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5xdWVyeSkge1xuICAgICAgICB0aGlzLnN0b3JhZ2VbJ2NsZWFyU2Vzc2lvbnMnXSA9IHRydWU7XG4gICAgICAgIC8vIEdlbmVyYXRlIGEgbmV3IHNlc3Npb24gb25seSBpZiB0aGUgdXNlciByZXF1ZXN0ZWRcbiAgICAgICAgaWYgKCF0aGlzLmF1dGguaXNNYXN0ZXIpIHtcbiAgICAgICAgICB0aGlzLnN0b3JhZ2VbJ2dlbmVyYXRlTmV3U2Vzc2lvbiddID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5fdmFsaWRhdGVQYXNzd29yZFBvbGljeSgpLnRoZW4oKCkgPT4ge1xuICAgICAgICByZXR1cm4gcGFzc3dvcmRDcnlwdG8uaGFzaCh0aGlzLmRhdGEucGFzc3dvcmQpLnRoZW4oaGFzaGVkUGFzc3dvcmQgPT4ge1xuICAgICAgICAgIHRoaXMuZGF0YS5faGFzaGVkX3Bhc3N3b3JkID0gaGFzaGVkUGFzc3dvcmQ7XG4gICAgICAgICAgZGVsZXRlIHRoaXMuZGF0YS5wYXNzd29yZDtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9KVxuICAgIC50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybiB0aGlzLl92YWxpZGF0ZVVzZXJOYW1lKCk7XG4gICAgfSlcbiAgICAudGhlbigoKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5fdmFsaWRhdGVFbWFpbCgpO1xuICAgIH0pO1xufTtcblxuUmVzdFdyaXRlLnByb3RvdHlwZS5fdmFsaWRhdGVVc2VyTmFtZSA9IGZ1bmN0aW9uICgpIHtcbiAgLy8gQ2hlY2sgZm9yIHVzZXJuYW1lIHVuaXF1ZW5lc3NcbiAgaWYgKCF0aGlzLmRhdGEudXNlcm5hbWUpIHtcbiAgICBpZiAoIXRoaXMucXVlcnkpIHtcbiAgICAgIHRoaXMuZGF0YS51c2VybmFtZSA9IGNyeXB0b1V0aWxzLnJhbmRvbVN0cmluZygyNSk7XG4gICAgICB0aGlzLnJlc3BvbnNlU2hvdWxkSGF2ZVVzZXJuYW1lID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICB9XG4gIC8qXG4gICAgVXNlcm5hbWVzIHNob3VsZCBiZSB1bmlxdWUgd2hlbiBjb21wYXJlZCBjYXNlIGluc2Vuc2l0aXZlbHlcblxuICAgIFVzZXJzIHNob3VsZCBiZSBhYmxlIHRvIG1ha2UgY2FzZSBzZW5zaXRpdmUgdXNlcm5hbWVzIGFuZFxuICAgIGxvZ2luIHVzaW5nIHRoZSBjYXNlIHRoZXkgZW50ZXJlZC4gIEkuZS4gJ1Nub29weScgc2hvdWxkIHByZWNsdWRlXG4gICAgJ3Nub29weScgYXMgYSB2YWxpZCB1c2VybmFtZS5cbiAgKi9cbiAgcmV0dXJuIHRoaXMuY29uZmlnLmRhdGFiYXNlXG4gICAgLmZpbmQoXG4gICAgICB0aGlzLmNsYXNzTmFtZSxcbiAgICAgIHtcbiAgICAgICAgdXNlcm5hbWU6IHRoaXMuZGF0YS51c2VybmFtZSxcbiAgICAgICAgb2JqZWN0SWQ6IHsgJG5lOiB0aGlzLm9iamVjdElkKCkgfSxcbiAgICAgIH0sXG4gICAgICB7IGxpbWl0OiAxLCBjYXNlSW5zZW5zaXRpdmU6IHRydWUgfSxcbiAgICAgIHt9LFxuICAgICAgdGhpcy52YWxpZFNjaGVtYUNvbnRyb2xsZXJcbiAgICApXG4gICAgLnRoZW4ocmVzdWx0cyA9PiB7XG4gICAgICBpZiAocmVzdWx0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihcbiAgICAgICAgICBQYXJzZS5FcnJvci5VU0VSTkFNRV9UQUtFTixcbiAgICAgICAgICAnQWNjb3VudCBhbHJlYWR5IGV4aXN0cyBmb3IgdGhpcyB1c2VybmFtZS4nXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfSk7XG59O1xuXG4vKlxuICBBcyB3aXRoIHVzZXJuYW1lcywgUGFyc2Ugc2hvdWxkIG5vdCBhbGxvdyBjYXNlIGluc2Vuc2l0aXZlIGNvbGxpc2lvbnMgb2YgZW1haWwuXG4gIHVubGlrZSB3aXRoIHVzZXJuYW1lcyAod2hpY2ggY2FuIGhhdmUgY2FzZSBpbnNlbnNpdGl2ZSBjb2xsaXNpb25zIGluIHRoZSBjYXNlIG9mXG4gIGF1dGggYWRhcHRlcnMpLCBlbWFpbHMgc2hvdWxkIG5ldmVyIGhhdmUgYSBjYXNlIGluc2Vuc2l0aXZlIGNvbGxpc2lvbi5cblxuICBUaGlzIGJlaGF2aW9yIGNhbiBiZSBlbmZvcmNlZCB0aHJvdWdoIGEgcHJvcGVybHkgY29uZmlndXJlZCBpbmRleCBzZWU6XG4gIGh0dHBzOi8vZG9jcy5tb25nb2RiLmNvbS9tYW51YWwvY29yZS9pbmRleC1jYXNlLWluc2Vuc2l0aXZlLyNjcmVhdGUtYS1jYXNlLWluc2Vuc2l0aXZlLWluZGV4XG4gIHdoaWNoIGNvdWxkIGJlIGltcGxlbWVudGVkIGluc3RlYWQgb2YgdGhpcyBjb2RlIGJhc2VkIHZhbGlkYXRpb24uXG5cbiAgR2l2ZW4gdGhhdCB0aGlzIGxvb2t1cCBzaG91bGQgYmUgYSByZWxhdGl2ZWx5IGxvdyB1c2UgY2FzZSBhbmQgdGhhdCB0aGUgY2FzZSBzZW5zaXRpdmVcbiAgdW5pcXVlIGluZGV4IHdpbGwgYmUgdXNlZCBieSB0aGUgZGIgZm9yIHRoZSBxdWVyeSwgdGhpcyBpcyBhbiBhZGVxdWF0ZSBzb2x1dGlvbi5cbiovXG5SZXN0V3JpdGUucHJvdG90eXBlLl92YWxpZGF0ZUVtYWlsID0gZnVuY3Rpb24gKCkge1xuICBpZiAoIXRoaXMuZGF0YS5lbWFpbCB8fCB0aGlzLmRhdGEuZW1haWwuX19vcCA9PT0gJ0RlbGV0ZScpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIH1cbiAgLy8gVmFsaWRhdGUgYmFzaWMgZW1haWwgYWRkcmVzcyBmb3JtYXRcbiAgaWYgKCF0aGlzLmRhdGEuZW1haWwubWF0Y2goL14uK0AuKyQvKSkge1xuICAgIHJldHVybiBQcm9taXNlLnJlamVjdChcbiAgICAgIG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5JTlZBTElEX0VNQUlMX0FERFJFU1MsICdFbWFpbCBhZGRyZXNzIGZvcm1hdCBpcyBpbnZhbGlkLicpXG4gICAgKTtcbiAgfVxuICAvLyBDYXNlIGluc2Vuc2l0aXZlIG1hdGNoLCBzZWUgbm90ZSBhYm92ZSBmdW5jdGlvbi5cbiAgcmV0dXJuIHRoaXMuY29uZmlnLmRhdGFiYXNlXG4gICAgLmZpbmQoXG4gICAgICB0aGlzLmNsYXNzTmFtZSxcbiAgICAgIHtcbiAgICAgICAgZW1haWw6IHRoaXMuZGF0YS5lbWFpbCxcbiAgICAgICAgb2JqZWN0SWQ6IHsgJG5lOiB0aGlzLm9iamVjdElkKCkgfSxcbiAgICAgIH0sXG4gICAgICB7IGxpbWl0OiAxLCBjYXNlSW5zZW5zaXRpdmU6IHRydWUgfSxcbiAgICAgIHt9LFxuICAgICAgdGhpcy52YWxpZFNjaGVtYUNvbnRyb2xsZXJcbiAgICApXG4gICAgLnRoZW4ocmVzdWx0cyA9PiB7XG4gICAgICBpZiAocmVzdWx0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihcbiAgICAgICAgICBQYXJzZS5FcnJvci5FTUFJTF9UQUtFTixcbiAgICAgICAgICAnQWNjb3VudCBhbHJlYWR5IGV4aXN0cyBmb3IgdGhpcyBlbWFpbCBhZGRyZXNzLidcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgIXRoaXMuZGF0YS5hdXRoRGF0YSB8fFxuICAgICAgICAhT2JqZWN0LmtleXModGhpcy5kYXRhLmF1dGhEYXRhKS5sZW5ndGggfHxcbiAgICAgICAgKE9iamVjdC5rZXlzKHRoaXMuZGF0YS5hdXRoRGF0YSkubGVuZ3RoID09PSAxICYmXG4gICAgICAgICAgT2JqZWN0LmtleXModGhpcy5kYXRhLmF1dGhEYXRhKVswXSA9PT0gJ2Fub255bW91cycpXG4gICAgICApIHtcbiAgICAgICAgLy8gV2UgdXBkYXRlZCB0aGUgZW1haWwsIHNlbmQgYSBuZXcgdmFsaWRhdGlvblxuICAgICAgICB0aGlzLnN0b3JhZ2VbJ3NlbmRWZXJpZmljYXRpb25FbWFpbCddID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5jb25maWcudXNlckNvbnRyb2xsZXIuc2V0RW1haWxWZXJpZnlUb2tlbih0aGlzLmRhdGEpO1xuICAgICAgfVxuICAgIH0pO1xufTtcblxuUmVzdFdyaXRlLnByb3RvdHlwZS5fdmFsaWRhdGVQYXNzd29yZFBvbGljeSA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKCF0aGlzLmNvbmZpZy5wYXNzd29yZFBvbGljeSkgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICByZXR1cm4gdGhpcy5fdmFsaWRhdGVQYXNzd29yZFJlcXVpcmVtZW50cygpLnRoZW4oKCkgPT4ge1xuICAgIHJldHVybiB0aGlzLl92YWxpZGF0ZVBhc3N3b3JkSGlzdG9yeSgpO1xuICB9KTtcbn07XG5cblJlc3RXcml0ZS5wcm90b3R5cGUuX3ZhbGlkYXRlUGFzc3dvcmRSZXF1aXJlbWVudHMgPSBmdW5jdGlvbiAoKSB7XG4gIC8vIGNoZWNrIGlmIHRoZSBwYXNzd29yZCBjb25mb3JtcyB0byB0aGUgZGVmaW5lZCBwYXNzd29yZCBwb2xpY3kgaWYgY29uZmlndXJlZFxuICAvLyBJZiB3ZSBzcGVjaWZpZWQgYSBjdXN0b20gZXJyb3IgaW4gb3VyIGNvbmZpZ3VyYXRpb24gdXNlIGl0LlxuICAvLyBFeGFtcGxlOiBcIlBhc3N3b3JkcyBtdXN0IGluY2x1ZGUgYSBDYXBpdGFsIExldHRlciwgTG93ZXJjYXNlIExldHRlciwgYW5kIGEgbnVtYmVyLlwiXG4gIC8vXG4gIC8vIFRoaXMgaXMgZXNwZWNpYWxseSB1c2VmdWwgb24gdGhlIGdlbmVyaWMgXCJwYXNzd29yZCByZXNldFwiIHBhZ2UsXG4gIC8vIGFzIGl0IGFsbG93cyB0aGUgcHJvZ3JhbW1lciB0byBjb21tdW5pY2F0ZSBzcGVjaWZpYyByZXF1aXJlbWVudHMgaW5zdGVhZCBvZjpcbiAgLy8gYS4gbWFraW5nIHRoZSB1c2VyIGd1ZXNzIHdoYXRzIHdyb25nXG4gIC8vIGIuIG1ha2luZyBhIGN1c3RvbSBwYXNzd29yZCByZXNldCBwYWdlIHRoYXQgc2hvd3MgdGhlIHJlcXVpcmVtZW50c1xuICBjb25zdCBwb2xpY3lFcnJvciA9IHRoaXMuY29uZmlnLnBhc3N3b3JkUG9saWN5LnZhbGlkYXRpb25FcnJvclxuICAgID8gdGhpcy5jb25maWcucGFzc3dvcmRQb2xpY3kudmFsaWRhdGlvbkVycm9yXG4gICAgOiAnUGFzc3dvcmQgZG9lcyBub3QgbWVldCB0aGUgUGFzc3dvcmQgUG9saWN5IHJlcXVpcmVtZW50cy4nO1xuICBjb25zdCBjb250YWluc1VzZXJuYW1lRXJyb3IgPSAnUGFzc3dvcmQgY2Fubm90IGNvbnRhaW4geW91ciB1c2VybmFtZS4nO1xuXG4gIC8vIGNoZWNrIHdoZXRoZXIgdGhlIHBhc3N3b3JkIG1lZXRzIHRoZSBwYXNzd29yZCBzdHJlbmd0aCByZXF1aXJlbWVudHNcbiAgaWYgKFxuICAgICh0aGlzLmNvbmZpZy5wYXNzd29yZFBvbGljeS5wYXR0ZXJuVmFsaWRhdG9yICYmXG4gICAgICAhdGhpcy5jb25maWcucGFzc3dvcmRQb2xpY3kucGF0dGVyblZhbGlkYXRvcih0aGlzLmRhdGEucGFzc3dvcmQpKSB8fFxuICAgICh0aGlzLmNvbmZpZy5wYXNzd29yZFBvbGljeS52YWxpZGF0b3JDYWxsYmFjayAmJlxuICAgICAgIXRoaXMuY29uZmlnLnBhc3N3b3JkUG9saWN5LnZhbGlkYXRvckNhbGxiYWNrKHRoaXMuZGF0YS5wYXNzd29yZCkpXG4gICkge1xuICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuVkFMSURBVElPTl9FUlJPUiwgcG9saWN5RXJyb3IpKTtcbiAgfVxuXG4gIC8vIGNoZWNrIHdoZXRoZXIgcGFzc3dvcmQgY29udGFpbiB1c2VybmFtZVxuICBpZiAodGhpcy5jb25maWcucGFzc3dvcmRQb2xpY3kuZG9Ob3RBbGxvd1VzZXJuYW1lID09PSB0cnVlKSB7XG4gICAgaWYgKHRoaXMuZGF0YS51c2VybmFtZSkge1xuICAgICAgLy8gdXNlcm5hbWUgaXMgbm90IHBhc3NlZCBkdXJpbmcgcGFzc3dvcmQgcmVzZXRcbiAgICAgIGlmICh0aGlzLmRhdGEucGFzc3dvcmQuaW5kZXhPZih0aGlzLmRhdGEudXNlcm5hbWUpID49IDApXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuVkFMSURBVElPTl9FUlJPUiwgY29udGFpbnNVc2VybmFtZUVycm9yKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHJldHJpZXZlIHRoZSBVc2VyIG9iamVjdCB1c2luZyBvYmplY3RJZCBkdXJpbmcgcGFzc3dvcmQgcmVzZXRcbiAgICAgIHJldHVybiB0aGlzLmNvbmZpZy5kYXRhYmFzZS5maW5kKCdfVXNlcicsIHsgb2JqZWN0SWQ6IHRoaXMub2JqZWN0SWQoKSB9KS50aGVuKHJlc3VsdHMgPT4ge1xuICAgICAgICBpZiAocmVzdWx0cy5sZW5ndGggIT0gMSkge1xuICAgICAgICAgIHRocm93IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5kYXRhLnBhc3N3b3JkLmluZGV4T2YocmVzdWx0c1swXS51c2VybmFtZSkgPj0gMClcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoXG4gICAgICAgICAgICBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuVkFMSURBVElPTl9FUlJPUiwgY29udGFpbnNVc2VybmFtZUVycm9yKVxuICAgICAgICAgICk7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG59O1xuXG5SZXN0V3JpdGUucHJvdG90eXBlLl92YWxpZGF0ZVBhc3N3b3JkSGlzdG9yeSA9IGZ1bmN0aW9uICgpIHtcbiAgLy8gY2hlY2sgd2hldGhlciBwYXNzd29yZCBpcyByZXBlYXRpbmcgZnJvbSBzcGVjaWZpZWQgaGlzdG9yeVxuICBpZiAodGhpcy5xdWVyeSAmJiB0aGlzLmNvbmZpZy5wYXNzd29yZFBvbGljeS5tYXhQYXNzd29yZEhpc3RvcnkpIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcuZGF0YWJhc2VcbiAgICAgIC5maW5kKFxuICAgICAgICAnX1VzZXInLFxuICAgICAgICB7IG9iamVjdElkOiB0aGlzLm9iamVjdElkKCkgfSxcbiAgICAgICAgeyBrZXlzOiBbJ19wYXNzd29yZF9oaXN0b3J5JywgJ19oYXNoZWRfcGFzc3dvcmQnXSB9XG4gICAgICApXG4gICAgICAudGhlbihyZXN1bHRzID0+IHtcbiAgICAgICAgaWYgKHJlc3VsdHMubGVuZ3RoICE9IDEpIHtcbiAgICAgICAgICB0aHJvdyB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXNlciA9IHJlc3VsdHNbMF07XG4gICAgICAgIGxldCBvbGRQYXNzd29yZHMgPSBbXTtcbiAgICAgICAgaWYgKHVzZXIuX3Bhc3N3b3JkX2hpc3RvcnkpXG4gICAgICAgICAgb2xkUGFzc3dvcmRzID0gXy50YWtlKFxuICAgICAgICAgICAgdXNlci5fcGFzc3dvcmRfaGlzdG9yeSxcbiAgICAgICAgICAgIHRoaXMuY29uZmlnLnBhc3N3b3JkUG9saWN5Lm1heFBhc3N3b3JkSGlzdG9yeSAtIDFcbiAgICAgICAgICApO1xuICAgICAgICBvbGRQYXNzd29yZHMucHVzaCh1c2VyLnBhc3N3b3JkKTtcbiAgICAgICAgY29uc3QgbmV3UGFzc3dvcmQgPSB0aGlzLmRhdGEucGFzc3dvcmQ7XG4gICAgICAgIC8vIGNvbXBhcmUgdGhlIG5ldyBwYXNzd29yZCBoYXNoIHdpdGggYWxsIG9sZCBwYXNzd29yZCBoYXNoZXNcbiAgICAgICAgY29uc3QgcHJvbWlzZXMgPSBvbGRQYXNzd29yZHMubWFwKGZ1bmN0aW9uIChoYXNoKSB7XG4gICAgICAgICAgcmV0dXJuIHBhc3N3b3JkQ3J5cHRvLmNvbXBhcmUobmV3UGFzc3dvcmQsIGhhc2gpLnRoZW4ocmVzdWx0ID0+IHtcbiAgICAgICAgICAgIGlmIChyZXN1bHQpXG4gICAgICAgICAgICAgIC8vIHJlamVjdCBpZiB0aGVyZSBpcyBhIG1hdGNoXG4gICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdCgnUkVQRUFUX1BBU1NXT1JEJyk7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICAvLyB3YWl0IGZvciBhbGwgY29tcGFyaXNvbnMgdG8gY29tcGxldGVcbiAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKHByb21pc2VzKVxuICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgICAgaWYgKGVyciA9PT0gJ1JFUEVBVF9QQVNTV09SRCcpXG4gICAgICAgICAgICAgIC8vIGEgbWF0Y2ggd2FzIGZvdW5kXG4gICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChcbiAgICAgICAgICAgICAgICBuZXcgUGFyc2UuRXJyb3IoXG4gICAgICAgICAgICAgICAgICBQYXJzZS5FcnJvci5WQUxJREFUSU9OX0VSUk9SLFxuICAgICAgICAgICAgICAgICAgYE5ldyBwYXNzd29yZCBzaG91bGQgbm90IGJlIHRoZSBzYW1lIGFzIGxhc3QgJHt0aGlzLmNvbmZpZy5wYXNzd29yZFBvbGljeS5tYXhQYXNzd29yZEhpc3Rvcnl9IHBhc3N3b3Jkcy5gXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgIH0pO1xuICAgICAgfSk7XG4gIH1cbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xufTtcblxuUmVzdFdyaXRlLnByb3RvdHlwZS5jcmVhdGVTZXNzaW9uVG9rZW5JZk5lZWRlZCA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKHRoaXMuY2xhc3NOYW1lICE9PSAnX1VzZXInKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIC8vIERvbid0IGdlbmVyYXRlIHNlc3Npb24gZm9yIHVwZGF0aW5nIHVzZXIgKHRoaXMucXVlcnkgaXMgc2V0KSB1bmxlc3MgYXV0aERhdGEgZXhpc3RzXG4gIGlmICh0aGlzLnF1ZXJ5ICYmICF0aGlzLmRhdGEuYXV0aERhdGEpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgLy8gRG9uJ3QgZ2VuZXJhdGUgbmV3IHNlc3Npb25Ub2tlbiBpZiBsaW5raW5nIHZpYSBzZXNzaW9uVG9rZW5cbiAgaWYgKHRoaXMuYXV0aC51c2VyICYmIHRoaXMuZGF0YS5hdXRoRGF0YSkge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoXG4gICAgIXRoaXMuc3RvcmFnZS5hdXRoUHJvdmlkZXIgJiYgLy8gc2lnbnVwIGNhbGwsIHdpdGhcbiAgICB0aGlzLmNvbmZpZy5wcmV2ZW50TG9naW5XaXRoVW52ZXJpZmllZEVtYWlsICYmIC8vIG5vIGxvZ2luIHdpdGhvdXQgdmVyaWZpY2F0aW9uXG4gICAgdGhpcy5jb25maWcudmVyaWZ5VXNlckVtYWlsc1xuICApIHtcbiAgICAvLyB2ZXJpZmljYXRpb24gaXMgb25cbiAgICByZXR1cm47IC8vIGRvIG5vdCBjcmVhdGUgdGhlIHNlc3Npb24gdG9rZW4gaW4gdGhhdCBjYXNlIVxuICB9XG4gIHJldHVybiB0aGlzLmNyZWF0ZVNlc3Npb25Ub2tlbigpO1xufTtcblxuUmVzdFdyaXRlLnByb3RvdHlwZS5jcmVhdGVTZXNzaW9uVG9rZW4gPSBhc3luYyBmdW5jdGlvbiAoKSB7XG4gIC8vIGNsb3VkIGluc3RhbGxhdGlvbklkIGZyb20gQ2xvdWQgQ29kZSxcbiAgLy8gbmV2ZXIgY3JlYXRlIHNlc3Npb24gdG9rZW5zIGZyb20gdGhlcmUuXG4gIGlmICh0aGlzLmF1dGguaW5zdGFsbGF0aW9uSWQgJiYgdGhpcy5hdXRoLmluc3RhbGxhdGlvbklkID09PSAnY2xvdWQnKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKHRoaXMuc3RvcmFnZS5hdXRoUHJvdmlkZXIgPT0gbnVsbCAmJiB0aGlzLmRhdGEuYXV0aERhdGEpIHtcbiAgICB0aGlzLnN0b3JhZ2UuYXV0aFByb3ZpZGVyID0gT2JqZWN0LmtleXModGhpcy5kYXRhLmF1dGhEYXRhKS5qb2luKCcsJyk7XG4gIH1cblxuICBjb25zdCB7IHNlc3Npb25EYXRhLCBjcmVhdGVTZXNzaW9uIH0gPSBSZXN0V3JpdGUuY3JlYXRlU2Vzc2lvbih0aGlzLmNvbmZpZywge1xuICAgIHVzZXJJZDogdGhpcy5vYmplY3RJZCgpLFxuICAgIGNyZWF0ZWRXaXRoOiB7XG4gICAgICBhY3Rpb246IHRoaXMuc3RvcmFnZS5hdXRoUHJvdmlkZXIgPyAnbG9naW4nIDogJ3NpZ251cCcsXG4gICAgICBhdXRoUHJvdmlkZXI6IHRoaXMuc3RvcmFnZS5hdXRoUHJvdmlkZXIgfHwgJ3Bhc3N3b3JkJyxcbiAgICB9LFxuICAgIGluc3RhbGxhdGlvbklkOiB0aGlzLmF1dGguaW5zdGFsbGF0aW9uSWQsXG4gIH0pO1xuXG4gIGlmICh0aGlzLnJlc3BvbnNlICYmIHRoaXMucmVzcG9uc2UucmVzcG9uc2UpIHtcbiAgICB0aGlzLnJlc3BvbnNlLnJlc3BvbnNlLnNlc3Npb25Ub2tlbiA9IHNlc3Npb25EYXRhLnNlc3Npb25Ub2tlbjtcbiAgfVxuXG4gIHJldHVybiBjcmVhdGVTZXNzaW9uKCk7XG59O1xuXG5SZXN0V3JpdGUuY3JlYXRlU2Vzc2lvbiA9IGZ1bmN0aW9uIChcbiAgY29uZmlnLFxuICB7IHVzZXJJZCwgY3JlYXRlZFdpdGgsIGluc3RhbGxhdGlvbklkLCBhZGRpdGlvbmFsU2Vzc2lvbkRhdGEgfVxuKSB7XG4gIGNvbnN0IHRva2VuID0gJ3I6JyArIGNyeXB0b1V0aWxzLm5ld1Rva2VuKCk7XG4gIGNvbnN0IGV4cGlyZXNBdCA9IGNvbmZpZy5nZW5lcmF0ZVNlc3Npb25FeHBpcmVzQXQoKTtcbiAgY29uc3Qgc2Vzc2lvbkRhdGEgPSB7XG4gICAgc2Vzc2lvblRva2VuOiB0b2tlbixcbiAgICB1c2VyOiB7XG4gICAgICBfX3R5cGU6ICdQb2ludGVyJyxcbiAgICAgIGNsYXNzTmFtZTogJ19Vc2VyJyxcbiAgICAgIG9iamVjdElkOiB1c2VySWQsXG4gICAgfSxcbiAgICBjcmVhdGVkV2l0aCxcbiAgICBleHBpcmVzQXQ6IFBhcnNlLl9lbmNvZGUoZXhwaXJlc0F0KSxcbiAgfTtcblxuICBpZiAoaW5zdGFsbGF0aW9uSWQpIHtcbiAgICBzZXNzaW9uRGF0YS5pbnN0YWxsYXRpb25JZCA9IGluc3RhbGxhdGlvbklkO1xuICB9XG5cbiAgT2JqZWN0LmFzc2lnbihzZXNzaW9uRGF0YSwgYWRkaXRpb25hbFNlc3Npb25EYXRhKTtcblxuICByZXR1cm4ge1xuICAgIHNlc3Npb25EYXRhLFxuICAgIGNyZWF0ZVNlc3Npb246ICgpID0+XG4gICAgICBuZXcgUmVzdFdyaXRlKGNvbmZpZywgQXV0aC5tYXN0ZXIoY29uZmlnKSwgJ19TZXNzaW9uJywgbnVsbCwgc2Vzc2lvbkRhdGEpLmV4ZWN1dGUoKSxcbiAgfTtcbn07XG5cbi8vIERlbGV0ZSBlbWFpbCByZXNldCB0b2tlbnMgaWYgdXNlciBpcyBjaGFuZ2luZyBwYXNzd29yZCBvciBlbWFpbC5cblJlc3RXcml0ZS5wcm90b3R5cGUuZGVsZXRlRW1haWxSZXNldFRva2VuSWZOZWVkZWQgPSBmdW5jdGlvbiAoKSB7XG4gIGlmICh0aGlzLmNsYXNzTmFtZSAhPT0gJ19Vc2VyJyB8fCB0aGlzLnF1ZXJ5ID09PSBudWxsKSB7XG4gICAgLy8gbnVsbCBxdWVyeSBtZWFucyBjcmVhdGVcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoJ3Bhc3N3b3JkJyBpbiB0aGlzLmRhdGEgfHwgJ2VtYWlsJyBpbiB0aGlzLmRhdGEpIHtcbiAgICBjb25zdCBhZGRPcHMgPSB7XG4gICAgICBfcGVyaXNoYWJsZV90b2tlbjogeyBfX29wOiAnRGVsZXRlJyB9LFxuICAgICAgX3BlcmlzaGFibGVfdG9rZW5fZXhwaXJlc19hdDogeyBfX29wOiAnRGVsZXRlJyB9LFxuICAgIH07XG4gICAgdGhpcy5kYXRhID0gT2JqZWN0LmFzc2lnbih0aGlzLmRhdGEsIGFkZE9wcyk7XG4gIH1cbn07XG5cblJlc3RXcml0ZS5wcm90b3R5cGUuZGVzdHJveUR1cGxpY2F0ZWRTZXNzaW9ucyA9IGZ1bmN0aW9uICgpIHtcbiAgLy8gT25seSBmb3IgX1Nlc3Npb24sIGFuZCBhdCBjcmVhdGlvbiB0aW1lXG4gIGlmICh0aGlzLmNsYXNzTmFtZSAhPSAnX1Nlc3Npb24nIHx8IHRoaXMucXVlcnkpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgLy8gRGVzdHJveSB0aGUgc2Vzc2lvbnMgaW4gJ0JhY2tncm91bmQnXG4gIGNvbnN0IHsgdXNlciwgaW5zdGFsbGF0aW9uSWQsIHNlc3Npb25Ub2tlbiB9ID0gdGhpcy5kYXRhO1xuICBpZiAoIXVzZXIgfHwgIWluc3RhbGxhdGlvbklkKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmICghdXNlci5vYmplY3RJZCkge1xuICAgIHJldHVybjtcbiAgfVxuICB0aGlzLmNvbmZpZy5kYXRhYmFzZS5kZXN0cm95KFxuICAgICdfU2Vzc2lvbicsXG4gICAge1xuICAgICAgdXNlcixcbiAgICAgIGluc3RhbGxhdGlvbklkLFxuICAgICAgc2Vzc2lvblRva2VuOiB7ICRuZTogc2Vzc2lvblRva2VuIH0sXG4gICAgfSxcbiAgICB7fSxcbiAgICB0aGlzLnZhbGlkU2NoZW1hQ29udHJvbGxlclxuICApO1xufTtcblxuLy8gSGFuZGxlcyBhbnkgZm9sbG93dXAgbG9naWNcblJlc3RXcml0ZS5wcm90b3R5cGUuaGFuZGxlRm9sbG93dXAgPSBmdW5jdGlvbiAoKSB7XG4gIGlmICh0aGlzLnN0b3JhZ2UgJiYgdGhpcy5zdG9yYWdlWydjbGVhclNlc3Npb25zJ10gJiYgdGhpcy5jb25maWcucmV2b2tlU2Vzc2lvbk9uUGFzc3dvcmRSZXNldCkge1xuICAgIHZhciBzZXNzaW9uUXVlcnkgPSB7XG4gICAgICB1c2VyOiB7XG4gICAgICAgIF9fdHlwZTogJ1BvaW50ZXInLFxuICAgICAgICBjbGFzc05hbWU6ICdfVXNlcicsXG4gICAgICAgIG9iamVjdElkOiB0aGlzLm9iamVjdElkKCksXG4gICAgICB9LFxuICAgIH07XG4gICAgZGVsZXRlIHRoaXMuc3RvcmFnZVsnY2xlYXJTZXNzaW9ucyddO1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5kYXRhYmFzZVxuICAgICAgLmRlc3Ryb3koJ19TZXNzaW9uJywgc2Vzc2lvblF1ZXJ5KVxuICAgICAgLnRoZW4odGhpcy5oYW5kbGVGb2xsb3d1cC5iaW5kKHRoaXMpKTtcbiAgfVxuXG4gIGlmICh0aGlzLnN0b3JhZ2UgJiYgdGhpcy5zdG9yYWdlWydnZW5lcmF0ZU5ld1Nlc3Npb24nXSkge1xuICAgIGRlbGV0ZSB0aGlzLnN0b3JhZ2VbJ2dlbmVyYXRlTmV3U2Vzc2lvbiddO1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZVNlc3Npb25Ub2tlbigpLnRoZW4odGhpcy5oYW5kbGVGb2xsb3d1cC5iaW5kKHRoaXMpKTtcbiAgfVxuXG4gIGlmICh0aGlzLnN0b3JhZ2UgJiYgdGhpcy5zdG9yYWdlWydzZW5kVmVyaWZpY2F0aW9uRW1haWwnXSkge1xuICAgIGRlbGV0ZSB0aGlzLnN0b3JhZ2VbJ3NlbmRWZXJpZmljYXRpb25FbWFpbCddO1xuICAgIC8vIEZpcmUgYW5kIGZvcmdldCFcbiAgICB0aGlzLmNvbmZpZy51c2VyQ29udHJvbGxlci5zZW5kVmVyaWZpY2F0aW9uRW1haWwodGhpcy5kYXRhKTtcbiAgICByZXR1cm4gdGhpcy5oYW5kbGVGb2xsb3d1cC5iaW5kKHRoaXMpO1xuICB9XG59O1xuXG4vLyBIYW5kbGVzIHRoZSBfU2Vzc2lvbiBjbGFzcyBzcGVjaWFsbmVzcy5cbi8vIERvZXMgbm90aGluZyBpZiB0aGlzIGlzbid0IGFuIF9TZXNzaW9uIG9iamVjdC5cblJlc3RXcml0ZS5wcm90b3R5cGUuaGFuZGxlU2Vzc2lvbiA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKHRoaXMucmVzcG9uc2UgfHwgdGhpcy5jbGFzc05hbWUgIT09ICdfU2Vzc2lvbicpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoIXRoaXMuYXV0aC51c2VyICYmICF0aGlzLmF1dGguaXNNYXN0ZXIpIHtcbiAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuSU5WQUxJRF9TRVNTSU9OX1RPS0VOLCAnU2Vzc2lvbiB0b2tlbiByZXF1aXJlZC4nKTtcbiAgfVxuXG4gIC8vIFRPRE86IFZlcmlmeSBwcm9wZXIgZXJyb3IgdG8gdGhyb3dcbiAgaWYgKHRoaXMuZGF0YS5BQ0wpIHtcbiAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuSU5WQUxJRF9LRVlfTkFNRSwgJ0Nhbm5vdCBzZXQgJyArICdBQ0wgb24gYSBTZXNzaW9uLicpO1xuICB9XG5cbiAgaWYgKHRoaXMucXVlcnkpIHtcbiAgICBpZiAodGhpcy5kYXRhLnVzZXIgJiYgIXRoaXMuYXV0aC5pc01hc3RlciAmJiB0aGlzLmRhdGEudXNlci5vYmplY3RJZCAhPSB0aGlzLmF1dGgudXNlci5pZCkge1xuICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLklOVkFMSURfS0VZX05BTUUpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5kYXRhLmluc3RhbGxhdGlvbklkKSB7XG4gICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuSU5WQUxJRF9LRVlfTkFNRSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmRhdGEuc2Vzc2lvblRva2VuKSB7XG4gICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuSU5WQUxJRF9LRVlfTkFNRSk7XG4gICAgfVxuICAgIGlmICghdGhpcy5hdXRoLmlzTWFzdGVyKSB7XG4gICAgICB0aGlzLnF1ZXJ5ID0ge1xuICAgICAgICAkYW5kOiBbXG4gICAgICAgICAgdGhpcy5xdWVyeSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB1c2VyOiB7XG4gICAgICAgICAgICAgIF9fdHlwZTogJ1BvaW50ZXInLFxuICAgICAgICAgICAgICBjbGFzc05hbWU6ICdfVXNlcicsXG4gICAgICAgICAgICAgIG9iamVjdElkOiB0aGlzLmF1dGgudXNlci5pZCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgaWYgKCF0aGlzLnF1ZXJ5ICYmICF0aGlzLmF1dGguaXNNYXN0ZXIpIHtcbiAgICBjb25zdCBhZGRpdGlvbmFsU2Vzc2lvbkRhdGEgPSB7fTtcbiAgICBmb3IgKHZhciBrZXkgaW4gdGhpcy5kYXRhKSB7XG4gICAgICBpZiAoa2V5ID09PSAnb2JqZWN0SWQnIHx8IGtleSA9PT0gJ3VzZXInKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgYWRkaXRpb25hbFNlc3Npb25EYXRhW2tleV0gPSB0aGlzLmRhdGFba2V5XTtcbiAgICB9XG5cbiAgICBjb25zdCB7IHNlc3Npb25EYXRhLCBjcmVhdGVTZXNzaW9uIH0gPSBSZXN0V3JpdGUuY3JlYXRlU2Vzc2lvbih0aGlzLmNvbmZpZywge1xuICAgICAgdXNlcklkOiB0aGlzLmF1dGgudXNlci5pZCxcbiAgICAgIGNyZWF0ZWRXaXRoOiB7XG4gICAgICAgIGFjdGlvbjogJ2NyZWF0ZScsXG4gICAgICB9LFxuICAgICAgYWRkaXRpb25hbFNlc3Npb25EYXRhLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGNyZWF0ZVNlc3Npb24oKS50aGVuKHJlc3VsdHMgPT4ge1xuICAgICAgaWYgKCFyZXN1bHRzLnJlc3BvbnNlKSB7XG4gICAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5JTlRFUk5BTF9TRVJWRVJfRVJST1IsICdFcnJvciBjcmVhdGluZyBzZXNzaW9uLicpO1xuICAgICAgfVxuICAgICAgc2Vzc2lvbkRhdGFbJ29iamVjdElkJ10gPSByZXN1bHRzLnJlc3BvbnNlWydvYmplY3RJZCddO1xuICAgICAgdGhpcy5yZXNwb25zZSA9IHtcbiAgICAgICAgc3RhdHVzOiAyMDEsXG4gICAgICAgIGxvY2F0aW9uOiByZXN1bHRzLmxvY2F0aW9uLFxuICAgICAgICByZXNwb25zZTogc2Vzc2lvbkRhdGEsXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG59O1xuXG4vLyBIYW5kbGVzIHRoZSBfSW5zdGFsbGF0aW9uIGNsYXNzIHNwZWNpYWxuZXNzLlxuLy8gRG9lcyBub3RoaW5nIGlmIHRoaXMgaXNuJ3QgYW4gaW5zdGFsbGF0aW9uIG9iamVjdC5cbi8vIElmIGFuIGluc3RhbGxhdGlvbiBpcyBmb3VuZCwgdGhpcyBjYW4gbXV0YXRlIHRoaXMucXVlcnkgYW5kIHR1cm4gYSBjcmVhdGVcbi8vIGludG8gYW4gdXBkYXRlLlxuLy8gUmV0dXJucyBhIHByb21pc2UgZm9yIHdoZW4gd2UncmUgZG9uZSBpZiBpdCBjYW4ndCBmaW5pc2ggdGhpcyB0aWNrLlxuUmVzdFdyaXRlLnByb3RvdHlwZS5oYW5kbGVJbnN0YWxsYXRpb24gPSBmdW5jdGlvbiAoKSB7XG4gIGlmICh0aGlzLnJlc3BvbnNlIHx8IHRoaXMuY2xhc3NOYW1lICE9PSAnX0luc3RhbGxhdGlvbicpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoXG4gICAgIXRoaXMucXVlcnkgJiZcbiAgICAhdGhpcy5kYXRhLmRldmljZVRva2VuICYmXG4gICAgIXRoaXMuZGF0YS5pbnN0YWxsYXRpb25JZCAmJlxuICAgICF0aGlzLmF1dGguaW5zdGFsbGF0aW9uSWRcbiAgKSB7XG4gICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFxuICAgICAgMTM1LFxuICAgICAgJ2F0IGxlYXN0IG9uZSBJRCBmaWVsZCAoZGV2aWNlVG9rZW4sIGluc3RhbGxhdGlvbklkKSAnICsgJ211c3QgYmUgc3BlY2lmaWVkIGluIHRoaXMgb3BlcmF0aW9uJ1xuICAgICk7XG4gIH1cblxuICAvLyBJZiB0aGUgZGV2aWNlIHRva2VuIGlzIDY0IGNoYXJhY3RlcnMgbG9uZywgd2UgYXNzdW1lIGl0IGlzIGZvciBpT1NcbiAgLy8gYW5kIGxvd2VyY2FzZSBpdC5cbiAgaWYgKHRoaXMuZGF0YS5kZXZpY2VUb2tlbiAmJiB0aGlzLmRhdGEuZGV2aWNlVG9rZW4ubGVuZ3RoID09IDY0KSB7XG4gICAgdGhpcy5kYXRhLmRldmljZVRva2VuID0gdGhpcy5kYXRhLmRldmljZVRva2VuLnRvTG93ZXJDYXNlKCk7XG4gIH1cblxuICAvLyBXZSBsb3dlcmNhc2UgdGhlIGluc3RhbGxhdGlvbklkIGlmIHByZXNlbnRcbiAgaWYgKHRoaXMuZGF0YS5pbnN0YWxsYXRpb25JZCkge1xuICAgIHRoaXMuZGF0YS5pbnN0YWxsYXRpb25JZCA9IHRoaXMuZGF0YS5pbnN0YWxsYXRpb25JZC50b0xvd2VyQ2FzZSgpO1xuICB9XG5cbiAgbGV0IGluc3RhbGxhdGlvbklkID0gdGhpcy5kYXRhLmluc3RhbGxhdGlvbklkO1xuXG4gIC8vIElmIGRhdGEuaW5zdGFsbGF0aW9uSWQgaXMgbm90IHNldCBhbmQgd2UncmUgbm90IG1hc3Rlciwgd2UgY2FuIGxvb2t1cCBpbiBhdXRoXG4gIGlmICghaW5zdGFsbGF0aW9uSWQgJiYgIXRoaXMuYXV0aC5pc01hc3Rlcikge1xuICAgIGluc3RhbGxhdGlvbklkID0gdGhpcy5hdXRoLmluc3RhbGxhdGlvbklkO1xuICB9XG5cbiAgaWYgKGluc3RhbGxhdGlvbklkKSB7XG4gICAgaW5zdGFsbGF0aW9uSWQgPSBpbnN0YWxsYXRpb25JZC50b0xvd2VyQ2FzZSgpO1xuICB9XG5cbiAgLy8gVXBkYXRpbmcgX0luc3RhbGxhdGlvbiBidXQgbm90IHVwZGF0aW5nIGFueXRoaW5nIGNyaXRpY2FsXG4gIGlmICh0aGlzLnF1ZXJ5ICYmICF0aGlzLmRhdGEuZGV2aWNlVG9rZW4gJiYgIWluc3RhbGxhdGlvbklkICYmICF0aGlzLmRhdGEuZGV2aWNlVHlwZSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBwcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKCk7XG5cbiAgdmFyIGlkTWF0Y2g7IC8vIFdpbGwgYmUgYSBtYXRjaCBvbiBlaXRoZXIgb2JqZWN0SWQgb3IgaW5zdGFsbGF0aW9uSWRcbiAgdmFyIG9iamVjdElkTWF0Y2g7XG4gIHZhciBpbnN0YWxsYXRpb25JZE1hdGNoO1xuICB2YXIgZGV2aWNlVG9rZW5NYXRjaGVzID0gW107XG5cbiAgLy8gSW5zdGVhZCBvZiBpc3N1aW5nIDMgcmVhZHMsIGxldCdzIGRvIGl0IHdpdGggb25lIE9SLlxuICBjb25zdCBvclF1ZXJpZXMgPSBbXTtcbiAgaWYgKHRoaXMucXVlcnkgJiYgdGhpcy5xdWVyeS5vYmplY3RJZCkge1xuICAgIG9yUXVlcmllcy5wdXNoKHtcbiAgICAgIG9iamVjdElkOiB0aGlzLnF1ZXJ5Lm9iamVjdElkLFxuICAgIH0pO1xuICB9XG4gIGlmIChpbnN0YWxsYXRpb25JZCkge1xuICAgIG9yUXVlcmllcy5wdXNoKHtcbiAgICAgIGluc3RhbGxhdGlvbklkOiBpbnN0YWxsYXRpb25JZCxcbiAgICB9KTtcbiAgfVxuICBpZiAodGhpcy5kYXRhLmRldmljZVRva2VuKSB7XG4gICAgb3JRdWVyaWVzLnB1c2goeyBkZXZpY2VUb2tlbjogdGhpcy5kYXRhLmRldmljZVRva2VuIH0pO1xuICB9XG5cbiAgaWYgKG9yUXVlcmllcy5sZW5ndGggPT0gMCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHByb21pc2UgPSBwcm9taXNlXG4gICAgLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuY29uZmlnLmRhdGFiYXNlLmZpbmQoXG4gICAgICAgICdfSW5zdGFsbGF0aW9uJyxcbiAgICAgICAge1xuICAgICAgICAgICRvcjogb3JRdWVyaWVzLFxuICAgICAgICB9LFxuICAgICAgICB7fVxuICAgICAgKTtcbiAgICB9KVxuICAgIC50aGVuKHJlc3VsdHMgPT4ge1xuICAgICAgcmVzdWx0cy5mb3JFYWNoKHJlc3VsdCA9PiB7XG4gICAgICAgIGlmICh0aGlzLnF1ZXJ5ICYmIHRoaXMucXVlcnkub2JqZWN0SWQgJiYgcmVzdWx0Lm9iamVjdElkID09IHRoaXMucXVlcnkub2JqZWN0SWQpIHtcbiAgICAgICAgICBvYmplY3RJZE1hdGNoID0gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXN1bHQuaW5zdGFsbGF0aW9uSWQgPT0gaW5zdGFsbGF0aW9uSWQpIHtcbiAgICAgICAgICBpbnN0YWxsYXRpb25JZE1hdGNoID0gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXN1bHQuZGV2aWNlVG9rZW4gPT0gdGhpcy5kYXRhLmRldmljZVRva2VuKSB7XG4gICAgICAgICAgZGV2aWNlVG9rZW5NYXRjaGVzLnB1c2gocmVzdWx0KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIFNhbml0eSBjaGVja3Mgd2hlbiBydW5uaW5nIGEgcXVlcnlcbiAgICAgIGlmICh0aGlzLnF1ZXJ5ICYmIHRoaXMucXVlcnkub2JqZWN0SWQpIHtcbiAgICAgICAgaWYgKCFvYmplY3RJZE1hdGNoKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLk9CSkVDVF9OT1RfRk9VTkQsICdPYmplY3Qgbm90IGZvdW5kIGZvciB1cGRhdGUuJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRoaXMuZGF0YS5pbnN0YWxsYXRpb25JZCAmJlxuICAgICAgICAgIG9iamVjdElkTWF0Y2guaW5zdGFsbGF0aW9uSWQgJiZcbiAgICAgICAgICB0aGlzLmRhdGEuaW5zdGFsbGF0aW9uSWQgIT09IG9iamVjdElkTWF0Y2guaW5zdGFsbGF0aW9uSWRcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKDEzNiwgJ2luc3RhbGxhdGlvbklkIG1heSBub3QgYmUgY2hhbmdlZCBpbiB0aGlzICcgKyAnb3BlcmF0aW9uJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRoaXMuZGF0YS5kZXZpY2VUb2tlbiAmJlxuICAgICAgICAgIG9iamVjdElkTWF0Y2guZGV2aWNlVG9rZW4gJiZcbiAgICAgICAgICB0aGlzLmRhdGEuZGV2aWNlVG9rZW4gIT09IG9iamVjdElkTWF0Y2guZGV2aWNlVG9rZW4gJiZcbiAgICAgICAgICAhdGhpcy5kYXRhLmluc3RhbGxhdGlvbklkICYmXG4gICAgICAgICAgIW9iamVjdElkTWF0Y2guaW5zdGFsbGF0aW9uSWRcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKDEzNiwgJ2RldmljZVRva2VuIG1heSBub3QgYmUgY2hhbmdlZCBpbiB0aGlzICcgKyAnb3BlcmF0aW9uJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRoaXMuZGF0YS5kZXZpY2VUeXBlICYmXG4gICAgICAgICAgdGhpcy5kYXRhLmRldmljZVR5cGUgJiZcbiAgICAgICAgICB0aGlzLmRhdGEuZGV2aWNlVHlwZSAhPT0gb2JqZWN0SWRNYXRjaC5kZXZpY2VUeXBlXG4gICAgICAgICkge1xuICAgICAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcigxMzYsICdkZXZpY2VUeXBlIG1heSBub3QgYmUgY2hhbmdlZCBpbiB0aGlzICcgKyAnb3BlcmF0aW9uJyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMucXVlcnkgJiYgdGhpcy5xdWVyeS5vYmplY3RJZCAmJiBvYmplY3RJZE1hdGNoKSB7XG4gICAgICAgIGlkTWF0Y2ggPSBvYmplY3RJZE1hdGNoO1xuICAgICAgfVxuXG4gICAgICBpZiAoaW5zdGFsbGF0aW9uSWQgJiYgaW5zdGFsbGF0aW9uSWRNYXRjaCkge1xuICAgICAgICBpZE1hdGNoID0gaW5zdGFsbGF0aW9uSWRNYXRjaDtcbiAgICAgIH1cbiAgICAgIC8vIG5lZWQgdG8gc3BlY2lmeSBkZXZpY2VUeXBlIG9ubHkgaWYgaXQncyBuZXdcbiAgICAgIGlmICghdGhpcy5xdWVyeSAmJiAhdGhpcy5kYXRhLmRldmljZVR5cGUgJiYgIWlkTWF0Y2gpIHtcbiAgICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKDEzNSwgJ2RldmljZVR5cGUgbXVzdCBiZSBzcGVjaWZpZWQgaW4gdGhpcyBvcGVyYXRpb24nKTtcbiAgICAgIH1cbiAgICB9KVxuICAgIC50aGVuKCgpID0+IHtcbiAgICAgIGlmICghaWRNYXRjaCkge1xuICAgICAgICBpZiAoIWRldmljZVRva2VuTWF0Y2hlcy5sZW5ndGgpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgZGV2aWNlVG9rZW5NYXRjaGVzLmxlbmd0aCA9PSAxICYmXG4gICAgICAgICAgKCFkZXZpY2VUb2tlbk1hdGNoZXNbMF1bJ2luc3RhbGxhdGlvbklkJ10gfHwgIWluc3RhbGxhdGlvbklkKVxuICAgICAgICApIHtcbiAgICAgICAgICAvLyBTaW5nbGUgbWF0Y2ggb24gZGV2aWNlIHRva2VuIGJ1dCBub25lIG9uIGluc3RhbGxhdGlvbklkLCBhbmQgZWl0aGVyXG4gICAgICAgICAgLy8gdGhlIHBhc3NlZCBvYmplY3Qgb3IgdGhlIG1hdGNoIGlzIG1pc3NpbmcgYW4gaW5zdGFsbGF0aW9uSWQsIHNvIHdlXG4gICAgICAgICAgLy8gY2FuIGp1c3QgcmV0dXJuIHRoZSBtYXRjaC5cbiAgICAgICAgICByZXR1cm4gZGV2aWNlVG9rZW5NYXRjaGVzWzBdWydvYmplY3RJZCddO1xuICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLmRhdGEuaW5zdGFsbGF0aW9uSWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoXG4gICAgICAgICAgICAxMzIsXG4gICAgICAgICAgICAnTXVzdCBzcGVjaWZ5IGluc3RhbGxhdGlvbklkIHdoZW4gZGV2aWNlVG9rZW4gJyArXG4gICAgICAgICAgICAgICdtYXRjaGVzIG11bHRpcGxlIEluc3RhbGxhdGlvbiBvYmplY3RzJ1xuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gTXVsdGlwbGUgZGV2aWNlIHRva2VuIG1hdGNoZXMgYW5kIHdlIHNwZWNpZmllZCBhbiBpbnN0YWxsYXRpb24gSUQsXG4gICAgICAgICAgLy8gb3IgYSBzaW5nbGUgbWF0Y2ggd2hlcmUgYm90aCB0aGUgcGFzc2VkIGFuZCBtYXRjaGluZyBvYmplY3RzIGhhdmVcbiAgICAgICAgICAvLyBhbiBpbnN0YWxsYXRpb24gSUQuIFRyeSBjbGVhbmluZyBvdXQgb2xkIGluc3RhbGxhdGlvbnMgdGhhdCBtYXRjaFxuICAgICAgICAgIC8vIHRoZSBkZXZpY2VUb2tlbiwgYW5kIHJldHVybiBuaWwgdG8gc2lnbmFsIHRoYXQgYSBuZXcgb2JqZWN0IHNob3VsZFxuICAgICAgICAgIC8vIGJlIGNyZWF0ZWQuXG4gICAgICAgICAgdmFyIGRlbFF1ZXJ5ID0ge1xuICAgICAgICAgICAgZGV2aWNlVG9rZW46IHRoaXMuZGF0YS5kZXZpY2VUb2tlbixcbiAgICAgICAgICAgIGluc3RhbGxhdGlvbklkOiB7XG4gICAgICAgICAgICAgICRuZTogaW5zdGFsbGF0aW9uSWQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH07XG4gICAgICAgICAgaWYgKHRoaXMuZGF0YS5hcHBJZGVudGlmaWVyKSB7XG4gICAgICAgICAgICBkZWxRdWVyeVsnYXBwSWRlbnRpZmllciddID0gdGhpcy5kYXRhLmFwcElkZW50aWZpZXI7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuY29uZmlnLmRhdGFiYXNlLmRlc3Ryb3koJ19JbnN0YWxsYXRpb24nLCBkZWxRdWVyeSkuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgICAgIGlmIChlcnIuY29kZSA9PSBQYXJzZS5FcnJvci5PQkpFQ1RfTk9UX0ZPVU5EKSB7XG4gICAgICAgICAgICAgIC8vIG5vIGRlbGV0aW9ucyB3ZXJlIG1hZGUuIENhbiBiZSBpZ25vcmVkLlxuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyByZXRocm93IHRoZSBlcnJvclxuICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGRldmljZVRva2VuTWF0Y2hlcy5sZW5ndGggPT0gMSAmJiAhZGV2aWNlVG9rZW5NYXRjaGVzWzBdWydpbnN0YWxsYXRpb25JZCddKSB7XG4gICAgICAgICAgLy8gRXhhY3RseSBvbmUgZGV2aWNlIHRva2VuIG1hdGNoIGFuZCBpdCBkb2Vzbid0IGhhdmUgYW4gaW5zdGFsbGF0aW9uXG4gICAgICAgICAgLy8gSUQuIFRoaXMgaXMgdGhlIG9uZSBjYXNlIHdoZXJlIHdlIHdhbnQgdG8gbWVyZ2Ugd2l0aCB0aGUgZXhpc3RpbmdcbiAgICAgICAgICAvLyBvYmplY3QuXG4gICAgICAgICAgY29uc3QgZGVsUXVlcnkgPSB7IG9iamVjdElkOiBpZE1hdGNoLm9iamVjdElkIH07XG4gICAgICAgICAgcmV0dXJuIHRoaXMuY29uZmlnLmRhdGFiYXNlXG4gICAgICAgICAgICAuZGVzdHJveSgnX0luc3RhbGxhdGlvbicsIGRlbFF1ZXJ5KVxuICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICByZXR1cm4gZGV2aWNlVG9rZW5NYXRjaGVzWzBdWydvYmplY3RJZCddO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgICAgICBpZiAoZXJyLmNvZGUgPT0gUGFyc2UuRXJyb3IuT0JKRUNUX05PVF9GT1VORCkge1xuICAgICAgICAgICAgICAgIC8vIG5vIGRlbGV0aW9ucyB3ZXJlIG1hZGUuIENhbiBiZSBpZ25vcmVkXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIC8vIHJldGhyb3cgdGhlIGVycm9yXG4gICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmICh0aGlzLmRhdGEuZGV2aWNlVG9rZW4gJiYgaWRNYXRjaC5kZXZpY2VUb2tlbiAhPSB0aGlzLmRhdGEuZGV2aWNlVG9rZW4pIHtcbiAgICAgICAgICAgIC8vIFdlJ3JlIHNldHRpbmcgdGhlIGRldmljZSB0b2tlbiBvbiBhbiBleGlzdGluZyBpbnN0YWxsYXRpb24sIHNvXG4gICAgICAgICAgICAvLyB3ZSBzaG91bGQgdHJ5IGNsZWFuaW5nIG91dCBvbGQgaW5zdGFsbGF0aW9ucyB0aGF0IG1hdGNoIHRoaXNcbiAgICAgICAgICAgIC8vIGRldmljZSB0b2tlbi5cbiAgICAgICAgICAgIGNvbnN0IGRlbFF1ZXJ5ID0ge1xuICAgICAgICAgICAgICBkZXZpY2VUb2tlbjogdGhpcy5kYXRhLmRldmljZVRva2VuLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIC8vIFdlIGhhdmUgYSB1bmlxdWUgaW5zdGFsbCBJZCwgdXNlIHRoYXQgdG8gcHJlc2VydmVcbiAgICAgICAgICAgIC8vIHRoZSBpbnRlcmVzdGluZyBpbnN0YWxsYXRpb25cbiAgICAgICAgICAgIGlmICh0aGlzLmRhdGEuaW5zdGFsbGF0aW9uSWQpIHtcbiAgICAgICAgICAgICAgZGVsUXVlcnlbJ2luc3RhbGxhdGlvbklkJ10gPSB7XG4gICAgICAgICAgICAgICAgJG5lOiB0aGlzLmRhdGEuaW5zdGFsbGF0aW9uSWQsXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICBpZE1hdGNoLm9iamVjdElkICYmXG4gICAgICAgICAgICAgIHRoaXMuZGF0YS5vYmplY3RJZCAmJlxuICAgICAgICAgICAgICBpZE1hdGNoLm9iamVjdElkID09IHRoaXMuZGF0YS5vYmplY3RJZFxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIC8vIHdlIHBhc3NlZCBhbiBvYmplY3RJZCwgcHJlc2VydmUgdGhhdCBpbnN0YWxhdGlvblxuICAgICAgICAgICAgICBkZWxRdWVyeVsnb2JqZWN0SWQnXSA9IHtcbiAgICAgICAgICAgICAgICAkbmU6IGlkTWF0Y2gub2JqZWN0SWQsXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBXaGF0IHRvIGRvIGhlcmU/IGNhbid0IHJlYWxseSBjbGVhbiB1cCBldmVyeXRoaW5nLi4uXG4gICAgICAgICAgICAgIHJldHVybiBpZE1hdGNoLm9iamVjdElkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuZGF0YS5hcHBJZGVudGlmaWVyKSB7XG4gICAgICAgICAgICAgIGRlbFF1ZXJ5WydhcHBJZGVudGlmaWVyJ10gPSB0aGlzLmRhdGEuYXBwSWRlbnRpZmllcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuY29uZmlnLmRhdGFiYXNlLmRlc3Ryb3koJ19JbnN0YWxsYXRpb24nLCBkZWxRdWVyeSkuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgICAgICAgaWYgKGVyci5jb2RlID09IFBhcnNlLkVycm9yLk9CSkVDVF9OT1RfRk9VTkQpIHtcbiAgICAgICAgICAgICAgICAvLyBubyBkZWxldGlvbnMgd2VyZSBtYWRlLiBDYW4gYmUgaWdub3JlZC5cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLy8gcmV0aHJvdyB0aGUgZXJyb3JcbiAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIEluIG5vbi1tZXJnZSBzY2VuYXJpb3MsIGp1c3QgcmV0dXJuIHRoZSBpbnN0YWxsYXRpb24gbWF0Y2ggaWRcbiAgICAgICAgICByZXR1cm4gaWRNYXRjaC5vYmplY3RJZDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pXG4gICAgLnRoZW4ob2JqSWQgPT4ge1xuICAgICAgaWYgKG9iaklkKSB7XG4gICAgICAgIHRoaXMucXVlcnkgPSB7IG9iamVjdElkOiBvYmpJZCB9O1xuICAgICAgICBkZWxldGUgdGhpcy5kYXRhLm9iamVjdElkO1xuICAgICAgICBkZWxldGUgdGhpcy5kYXRhLmNyZWF0ZWRBdDtcbiAgICAgIH1cbiAgICAgIC8vIFRPRE86IFZhbGlkYXRlIG9wcyAoYWRkL3JlbW92ZSBvbiBjaGFubmVscywgJGluYyBvbiBiYWRnZSwgZXRjLilcbiAgICB9KTtcbiAgcmV0dXJuIHByb21pc2U7XG59O1xuXG4vLyBJZiB3ZSBzaG9ydC1jaXJjdWl0ZWQgdGhlIG9iamVjdCByZXNwb25zZSAtIHRoZW4gd2UgbmVlZCB0byBtYWtlIHN1cmUgd2UgZXhwYW5kIGFsbCB0aGUgZmlsZXMsXG4vLyBzaW5jZSB0aGlzIG1pZ2h0IG5vdCBoYXZlIGEgcXVlcnksIG1lYW5pbmcgaXQgd29uJ3QgcmV0dXJuIHRoZSBmdWxsIHJlc3VsdCBiYWNrLlxuLy8gVE9ETzogKG5sdXRzZW5rbykgVGhpcyBzaG91bGQgZGllIHdoZW4gd2UgbW92ZSB0byBwZXItY2xhc3MgYmFzZWQgY29udHJvbGxlcnMgb24gX1Nlc3Npb24vX1VzZXJcblJlc3RXcml0ZS5wcm90b3R5cGUuZXhwYW5kRmlsZXNGb3JFeGlzdGluZ09iamVjdHMgPSBmdW5jdGlvbiAoKSB7XG4gIC8vIENoZWNrIHdoZXRoZXIgd2UgaGF2ZSBhIHNob3J0LWNpcmN1aXRlZCByZXNwb25zZSAtIG9ubHkgdGhlbiBydW4gZXhwYW5zaW9uLlxuICBpZiAodGhpcy5yZXNwb25zZSAmJiB0aGlzLnJlc3BvbnNlLnJlc3BvbnNlKSB7XG4gICAgdGhpcy5jb25maWcuZmlsZXNDb250cm9sbGVyLmV4cGFuZEZpbGVzSW5PYmplY3QodGhpcy5jb25maWcsIHRoaXMucmVzcG9uc2UucmVzcG9uc2UpO1xuICB9XG59O1xuXG5SZXN0V3JpdGUucHJvdG90eXBlLnJ1bkRhdGFiYXNlT3BlcmF0aW9uID0gZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy5yZXNwb25zZSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmICh0aGlzLmNsYXNzTmFtZSA9PT0gJ19Sb2xlJykge1xuICAgIHRoaXMuY29uZmlnLmNhY2hlQ29udHJvbGxlci5yb2xlLmNsZWFyKCk7XG4gICAgaWYgKHRoaXMuY29uZmlnLmxpdmVRdWVyeUNvbnRyb2xsZXIpIHtcbiAgICAgIHRoaXMuY29uZmlnLmxpdmVRdWVyeUNvbnRyb2xsZXIuY2xlYXJDYWNoZWRSb2xlcyh0aGlzLmF1dGgudXNlcik7XG4gICAgfVxuICB9XG5cbiAgaWYgKHRoaXMuY2xhc3NOYW1lID09PSAnX1VzZXInICYmIHRoaXMucXVlcnkgJiYgdGhpcy5hdXRoLmlzVW5hdXRoZW50aWNhdGVkKCkpIHtcbiAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoXG4gICAgICBQYXJzZS5FcnJvci5TRVNTSU9OX01JU1NJTkcsXG4gICAgICBgQ2Fubm90IG1vZGlmeSB1c2VyICR7dGhpcy5xdWVyeS5vYmplY3RJZH0uYFxuICAgICk7XG4gIH1cblxuICBpZiAodGhpcy5jbGFzc05hbWUgPT09ICdfUHJvZHVjdCcgJiYgdGhpcy5kYXRhLmRvd25sb2FkKSB7XG4gICAgdGhpcy5kYXRhLmRvd25sb2FkTmFtZSA9IHRoaXMuZGF0YS5kb3dubG9hZC5uYW1lO1xuICB9XG5cbiAgLy8gVE9ETzogQWRkIGJldHRlciBkZXRlY3Rpb24gZm9yIEFDTCwgZW5zdXJpbmcgYSB1c2VyIGNhbid0IGJlIGxvY2tlZCBmcm9tXG4gIC8vICAgICAgIHRoZWlyIG93biB1c2VyIHJlY29yZC5cbiAgaWYgKHRoaXMuZGF0YS5BQ0wgJiYgdGhpcy5kYXRhLkFDTFsnKnVucmVzb2x2ZWQnXSkge1xuICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5JTlZBTElEX0FDTCwgJ0ludmFsaWQgQUNMLicpO1xuICB9XG5cbiAgaWYgKHRoaXMucXVlcnkpIHtcbiAgICAvLyBGb3JjZSB0aGUgdXNlciB0byBub3QgbG9ja291dFxuICAgIC8vIE1hdGNoZWQgd2l0aCBwYXJzZS5jb21cbiAgICBpZiAodGhpcy5jbGFzc05hbWUgPT09ICdfVXNlcicgJiYgdGhpcy5kYXRhLkFDTCAmJiB0aGlzLmF1dGguaXNNYXN0ZXIgIT09IHRydWUpIHtcbiAgICAgIHRoaXMuZGF0YS5BQ0xbdGhpcy5xdWVyeS5vYmplY3RJZF0gPSB7IHJlYWQ6IHRydWUsIHdyaXRlOiB0cnVlIH07XG4gICAgfVxuICAgIC8vIHVwZGF0ZSBwYXNzd29yZCB0aW1lc3RhbXAgaWYgdXNlciBwYXNzd29yZCBpcyBiZWluZyBjaGFuZ2VkXG4gICAgaWYgKFxuICAgICAgdGhpcy5jbGFzc05hbWUgPT09ICdfVXNlcicgJiZcbiAgICAgIHRoaXMuZGF0YS5faGFzaGVkX3Bhc3N3b3JkICYmXG4gICAgICB0aGlzLmNvbmZpZy5wYXNzd29yZFBvbGljeSAmJlxuICAgICAgdGhpcy5jb25maWcucGFzc3dvcmRQb2xpY3kubWF4UGFzc3dvcmRBZ2VcbiAgICApIHtcbiAgICAgIHRoaXMuZGF0YS5fcGFzc3dvcmRfY2hhbmdlZF9hdCA9IFBhcnNlLl9lbmNvZGUobmV3IERhdGUoKSk7XG4gICAgfVxuICAgIC8vIElnbm9yZSBjcmVhdGVkQXQgd2hlbiB1cGRhdGVcbiAgICBkZWxldGUgdGhpcy5kYXRhLmNyZWF0ZWRBdDtcblxuICAgIGxldCBkZWZlciA9IFByb21pc2UucmVzb2x2ZSgpO1xuICAgIC8vIGlmIHBhc3N3b3JkIGhpc3RvcnkgaXMgZW5hYmxlZCB0aGVuIHNhdmUgdGhlIGN1cnJlbnQgcGFzc3dvcmQgdG8gaGlzdG9yeVxuICAgIGlmIChcbiAgICAgIHRoaXMuY2xhc3NOYW1lID09PSAnX1VzZXInICYmXG4gICAgICB0aGlzLmRhdGEuX2hhc2hlZF9wYXNzd29yZCAmJlxuICAgICAgdGhpcy5jb25maWcucGFzc3dvcmRQb2xpY3kgJiZcbiAgICAgIHRoaXMuY29uZmlnLnBhc3N3b3JkUG9saWN5Lm1heFBhc3N3b3JkSGlzdG9yeVxuICAgICkge1xuICAgICAgZGVmZXIgPSB0aGlzLmNvbmZpZy5kYXRhYmFzZVxuICAgICAgICAuZmluZChcbiAgICAgICAgICAnX1VzZXInLFxuICAgICAgICAgIHsgb2JqZWN0SWQ6IHRoaXMub2JqZWN0SWQoKSB9LFxuICAgICAgICAgIHsga2V5czogWydfcGFzc3dvcmRfaGlzdG9yeScsICdfaGFzaGVkX3Bhc3N3b3JkJ10gfVxuICAgICAgICApXG4gICAgICAgIC50aGVuKHJlc3VsdHMgPT4ge1xuICAgICAgICAgIGlmIChyZXN1bHRzLmxlbmd0aCAhPSAxKSB7XG4gICAgICAgICAgICB0aHJvdyB1bmRlZmluZWQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHVzZXIgPSByZXN1bHRzWzBdO1xuICAgICAgICAgIGxldCBvbGRQYXNzd29yZHMgPSBbXTtcbiAgICAgICAgICBpZiAodXNlci5fcGFzc3dvcmRfaGlzdG9yeSkge1xuICAgICAgICAgICAgb2xkUGFzc3dvcmRzID0gXy50YWtlKFxuICAgICAgICAgICAgICB1c2VyLl9wYXNzd29yZF9oaXN0b3J5LFxuICAgICAgICAgICAgICB0aGlzLmNvbmZpZy5wYXNzd29yZFBvbGljeS5tYXhQYXNzd29yZEhpc3RvcnlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vbi0xIHBhc3N3b3JkcyBnbyBpbnRvIGhpc3RvcnkgaW5jbHVkaW5nIGxhc3QgcGFzc3dvcmRcbiAgICAgICAgICB3aGlsZSAoXG4gICAgICAgICAgICBvbGRQYXNzd29yZHMubGVuZ3RoID4gTWF0aC5tYXgoMCwgdGhpcy5jb25maWcucGFzc3dvcmRQb2xpY3kubWF4UGFzc3dvcmRIaXN0b3J5IC0gMilcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIG9sZFBhc3N3b3Jkcy5zaGlmdCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBvbGRQYXNzd29yZHMucHVzaCh1c2VyLnBhc3N3b3JkKTtcbiAgICAgICAgICB0aGlzLmRhdGEuX3Bhc3N3b3JkX2hpc3RvcnkgPSBvbGRQYXNzd29yZHM7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBkZWZlci50aGVuKCgpID0+IHtcbiAgICAgIC8vIFJ1biBhbiB1cGRhdGVcbiAgICAgIHJldHVybiB0aGlzLmNvbmZpZy5kYXRhYmFzZVxuICAgICAgICAudXBkYXRlKFxuICAgICAgICAgIHRoaXMuY2xhc3NOYW1lLFxuICAgICAgICAgIHRoaXMucXVlcnksXG4gICAgICAgICAgdGhpcy5kYXRhLFxuICAgICAgICAgIHRoaXMucnVuT3B0aW9ucyxcbiAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICB0aGlzLnZhbGlkU2NoZW1hQ29udHJvbGxlclxuICAgICAgICApXG4gICAgICAgIC50aGVuKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICByZXNwb25zZS51cGRhdGVkQXQgPSB0aGlzLnVwZGF0ZWRBdDtcbiAgICAgICAgICB0aGlzLl91cGRhdGVSZXNwb25zZVdpdGhEYXRhKHJlc3BvbnNlLCB0aGlzLmRhdGEpO1xuICAgICAgICAgIHRoaXMucmVzcG9uc2UgPSB7IHJlc3BvbnNlIH07XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIC8vIFNldCB0aGUgZGVmYXVsdCBBQ0wgYW5kIHBhc3N3b3JkIHRpbWVzdGFtcCBmb3IgdGhlIG5ldyBfVXNlclxuICAgIGlmICh0aGlzLmNsYXNzTmFtZSA9PT0gJ19Vc2VyJykge1xuICAgICAgdmFyIEFDTCA9IHRoaXMuZGF0YS5BQ0w7XG4gICAgICAvLyBkZWZhdWx0IHB1YmxpYyByL3cgQUNMXG4gICAgICBpZiAoIUFDTCkge1xuICAgICAgICBBQ0wgPSB7fTtcbiAgICAgICAgaWYgKCF0aGlzLmNvbmZpZy5lbmZvcmNlUHJpdmF0ZVVzZXJzKSB7XG4gICAgICAgICAgQUNMWycqJ10gPSB7IHJlYWQ6IHRydWUsIHdyaXRlOiBmYWxzZSB9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBtYWtlIHN1cmUgdGhlIHVzZXIgaXMgbm90IGxvY2tlZCBkb3duXG4gICAgICBBQ0xbdGhpcy5kYXRhLm9iamVjdElkXSA9IHsgcmVhZDogdHJ1ZSwgd3JpdGU6IHRydWUgfTtcbiAgICAgIHRoaXMuZGF0YS5BQ0wgPSBBQ0w7XG4gICAgICAvLyBwYXNzd29yZCB0aW1lc3RhbXAgdG8gYmUgdXNlZCB3aGVuIHBhc3N3b3JkIGV4cGlyeSBwb2xpY3kgaXMgZW5mb3JjZWRcbiAgICAgIGlmICh0aGlzLmNvbmZpZy5wYXNzd29yZFBvbGljeSAmJiB0aGlzLmNvbmZpZy5wYXNzd29yZFBvbGljeS5tYXhQYXNzd29yZEFnZSkge1xuICAgICAgICB0aGlzLmRhdGEuX3Bhc3N3b3JkX2NoYW5nZWRfYXQgPSBQYXJzZS5fZW5jb2RlKG5ldyBEYXRlKCkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJ1biBhIGNyZWF0ZVxuICAgIHJldHVybiB0aGlzLmNvbmZpZy5kYXRhYmFzZVxuICAgICAgLmNyZWF0ZSh0aGlzLmNsYXNzTmFtZSwgdGhpcy5kYXRhLCB0aGlzLnJ1bk9wdGlvbnMsIGZhbHNlLCB0aGlzLnZhbGlkU2NoZW1hQ29udHJvbGxlcilcbiAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgIGlmICh0aGlzLmNsYXNzTmFtZSAhPT0gJ19Vc2VyJyB8fCBlcnJvci5jb2RlICE9PSBQYXJzZS5FcnJvci5EVVBMSUNBVEVfVkFMVUUpIHtcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFF1aWNrIGNoZWNrLCBpZiB3ZSB3ZXJlIGFibGUgdG8gaW5mZXIgdGhlIGR1cGxpY2F0ZWQgZmllbGQgbmFtZVxuICAgICAgICBpZiAoZXJyb3IgJiYgZXJyb3IudXNlckluZm8gJiYgZXJyb3IudXNlckluZm8uZHVwbGljYXRlZF9maWVsZCA9PT0gJ3VzZXJuYW1lJykge1xuICAgICAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihcbiAgICAgICAgICAgIFBhcnNlLkVycm9yLlVTRVJOQU1FX1RBS0VOLFxuICAgICAgICAgICAgJ0FjY291bnQgYWxyZWFkeSBleGlzdHMgZm9yIHRoaXMgdXNlcm5hbWUuJ1xuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXJyb3IgJiYgZXJyb3IudXNlckluZm8gJiYgZXJyb3IudXNlckluZm8uZHVwbGljYXRlZF9maWVsZCA9PT0gJ2VtYWlsJykge1xuICAgICAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihcbiAgICAgICAgICAgIFBhcnNlLkVycm9yLkVNQUlMX1RBS0VOLFxuICAgICAgICAgICAgJ0FjY291bnQgYWxyZWFkeSBleGlzdHMgZm9yIHRoaXMgZW1haWwgYWRkcmVzcy4nXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIHRoaXMgd2FzIGEgZmFpbGVkIHVzZXIgY3JlYXRpb24gZHVlIHRvIHVzZXJuYW1lIG9yIGVtYWlsIGFscmVhZHkgdGFrZW4sIHdlIG5lZWQgdG9cbiAgICAgICAgLy8gY2hlY2sgd2hldGhlciBpdCB3YXMgdXNlcm5hbWUgb3IgZW1haWwgYW5kIHJldHVybiB0aGUgYXBwcm9wcmlhdGUgZXJyb3IuXG4gICAgICAgIC8vIEZhbGxiYWNrIHRvIHRoZSBvcmlnaW5hbCBtZXRob2RcbiAgICAgICAgLy8gVE9ETzogU2VlIGlmIHdlIGNhbiBsYXRlciBkbyB0aGlzIHdpdGhvdXQgYWRkaXRpb25hbCBxdWVyaWVzIGJ5IHVzaW5nIG5hbWVkIGluZGV4ZXMuXG4gICAgICAgIHJldHVybiB0aGlzLmNvbmZpZy5kYXRhYmFzZVxuICAgICAgICAgIC5maW5kKFxuICAgICAgICAgICAgdGhpcy5jbGFzc05hbWUsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHVzZXJuYW1lOiB0aGlzLmRhdGEudXNlcm5hbWUsXG4gICAgICAgICAgICAgIG9iamVjdElkOiB7ICRuZTogdGhpcy5vYmplY3RJZCgpIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgeyBsaW1pdDogMSB9XG4gICAgICAgICAgKVxuICAgICAgICAgIC50aGVuKHJlc3VsdHMgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3VsdHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoXG4gICAgICAgICAgICAgICAgUGFyc2UuRXJyb3IuVVNFUk5BTUVfVEFLRU4sXG4gICAgICAgICAgICAgICAgJ0FjY291bnQgYWxyZWFkeSBleGlzdHMgZm9yIHRoaXMgdXNlcm5hbWUuJ1xuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29uZmlnLmRhdGFiYXNlLmZpbmQoXG4gICAgICAgICAgICAgIHRoaXMuY2xhc3NOYW1lLFxuICAgICAgICAgICAgICB7IGVtYWlsOiB0aGlzLmRhdGEuZW1haWwsIG9iamVjdElkOiB7ICRuZTogdGhpcy5vYmplY3RJZCgpIH0gfSxcbiAgICAgICAgICAgICAgeyBsaW1pdDogMSB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLnRoZW4ocmVzdWx0cyA9PiB7XG4gICAgICAgICAgICBpZiAocmVzdWx0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihcbiAgICAgICAgICAgICAgICBQYXJzZS5FcnJvci5FTUFJTF9UQUtFTixcbiAgICAgICAgICAgICAgICAnQWNjb3VudCBhbHJlYWR5IGV4aXN0cyBmb3IgdGhpcyBlbWFpbCBhZGRyZXNzLidcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihcbiAgICAgICAgICAgICAgUGFyc2UuRXJyb3IuRFVQTElDQVRFX1ZBTFVFLFxuICAgICAgICAgICAgICAnQSBkdXBsaWNhdGUgdmFsdWUgZm9yIGEgZmllbGQgd2l0aCB1bmlxdWUgdmFsdWVzIHdhcyBwcm92aWRlZCdcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSk7XG4gICAgICB9KVxuICAgICAgLnRoZW4ocmVzcG9uc2UgPT4ge1xuICAgICAgICByZXNwb25zZS5vYmplY3RJZCA9IHRoaXMuZGF0YS5vYmplY3RJZDtcbiAgICAgICAgcmVzcG9uc2UuY3JlYXRlZEF0ID0gdGhpcy5kYXRhLmNyZWF0ZWRBdDtcblxuICAgICAgICBpZiAodGhpcy5yZXNwb25zZVNob3VsZEhhdmVVc2VybmFtZSkge1xuICAgICAgICAgIHJlc3BvbnNlLnVzZXJuYW1lID0gdGhpcy5kYXRhLnVzZXJuYW1lO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3VwZGF0ZVJlc3BvbnNlV2l0aERhdGEocmVzcG9uc2UsIHRoaXMuZGF0YSk7XG4gICAgICAgIHRoaXMucmVzcG9uc2UgPSB7XG4gICAgICAgICAgc3RhdHVzOiAyMDEsXG4gICAgICAgICAgcmVzcG9uc2UsXG4gICAgICAgICAgbG9jYXRpb246IHRoaXMubG9jYXRpb24oKSxcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICB9XG59O1xuXG4vLyBSZXR1cm5zIG5vdGhpbmcgLSBkb2Vzbid0IHdhaXQgZm9yIHRoZSB0cmlnZ2VyLlxuUmVzdFdyaXRlLnByb3RvdHlwZS5ydW5BZnRlclNhdmVUcmlnZ2VyID0gZnVuY3Rpb24gKCkge1xuICBpZiAoIXRoaXMucmVzcG9uc2UgfHwgIXRoaXMucmVzcG9uc2UucmVzcG9uc2UgfHwgdGhpcy5ydW5PcHRpb25zLm1hbnkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBBdm9pZCBkb2luZyBhbnkgc2V0dXAgZm9yIHRyaWdnZXJzIGlmIHRoZXJlIGlzIG5vICdhZnRlclNhdmUnIHRyaWdnZXIgZm9yIHRoaXMgY2xhc3MuXG4gIGNvbnN0IGhhc0FmdGVyU2F2ZUhvb2sgPSB0cmlnZ2Vycy50cmlnZ2VyRXhpc3RzKFxuICAgIHRoaXMuY2xhc3NOYW1lLFxuICAgIHRyaWdnZXJzLlR5cGVzLmFmdGVyU2F2ZSxcbiAgICB0aGlzLmNvbmZpZy5hcHBsaWNhdGlvbklkXG4gICk7XG4gIGNvbnN0IGhhc0xpdmVRdWVyeSA9IHRoaXMuY29uZmlnLmxpdmVRdWVyeUNvbnRyb2xsZXIuaGFzTGl2ZVF1ZXJ5KHRoaXMuY2xhc3NOYW1lKTtcbiAgaWYgKCFoYXNBZnRlclNhdmVIb29rICYmICFoYXNMaXZlUXVlcnkpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIH1cblxuICBjb25zdCB7IG9yaWdpbmFsT2JqZWN0LCB1cGRhdGVkT2JqZWN0IH0gPSB0aGlzLmJ1aWxkUGFyc2VPYmplY3RzKCk7XG4gIHVwZGF0ZWRPYmplY3QuX2hhbmRsZVNhdmVSZXNwb25zZSh0aGlzLnJlc3BvbnNlLnJlc3BvbnNlLCB0aGlzLnJlc3BvbnNlLnN0YXR1cyB8fCAyMDApO1xuXG4gIHRoaXMuY29uZmlnLmRhdGFiYXNlLmxvYWRTY2hlbWEoKS50aGVuKHNjaGVtYUNvbnRyb2xsZXIgPT4ge1xuICAgIC8vIE5vdGlmaXkgTGl2ZVF1ZXJ5U2VydmVyIGlmIHBvc3NpYmxlXG4gICAgY29uc3QgcGVybXMgPSBzY2hlbWFDb250cm9sbGVyLmdldENsYXNzTGV2ZWxQZXJtaXNzaW9ucyh1cGRhdGVkT2JqZWN0LmNsYXNzTmFtZSk7XG4gICAgdGhpcy5jb25maWcubGl2ZVF1ZXJ5Q29udHJvbGxlci5vbkFmdGVyU2F2ZShcbiAgICAgIHVwZGF0ZWRPYmplY3QuY2xhc3NOYW1lLFxuICAgICAgdXBkYXRlZE9iamVjdCxcbiAgICAgIG9yaWdpbmFsT2JqZWN0LFxuICAgICAgcGVybXNcbiAgICApO1xuICB9KTtcblxuICAvLyBSdW4gYWZ0ZXJTYXZlIHRyaWdnZXJcbiAgcmV0dXJuIHRyaWdnZXJzXG4gICAgLm1heWJlUnVuVHJpZ2dlcihcbiAgICAgIHRyaWdnZXJzLlR5cGVzLmFmdGVyU2F2ZSxcbiAgICAgIHRoaXMuYXV0aCxcbiAgICAgIHVwZGF0ZWRPYmplY3QsXG4gICAgICBvcmlnaW5hbE9iamVjdCxcbiAgICAgIHRoaXMuY29uZmlnLFxuICAgICAgdGhpcy5jb250ZXh0XG4gICAgKVxuICAgIC50aGVuKHJlc3VsdCA9PiB7XG4gICAgICBjb25zdCBqc29uUmV0dXJuZWQgPSByZXN1bHQgJiYgIXJlc3VsdC5fdG9GdWxsSlNPTjtcbiAgICAgIGlmIChqc29uUmV0dXJuZWQpIHtcbiAgICAgICAgdGhpcy5wZW5kaW5nT3BzID0ge307XG4gICAgICAgIHRoaXMucmVzcG9uc2UucmVzcG9uc2UgPSByZXN1bHQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnJlc3BvbnNlLnJlc3BvbnNlID0gdGhpcy5fdXBkYXRlUmVzcG9uc2VXaXRoRGF0YShcbiAgICAgICAgICAocmVzdWx0IHx8IHVwZGF0ZWRPYmplY3QpLnRvSlNPTigpLFxuICAgICAgICAgIHRoaXMuZGF0YVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0pXG4gICAgLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgIGxvZ2dlci53YXJuKCdhZnRlclNhdmUgY2F1Z2h0IGFuIGVycm9yJywgZXJyKTtcbiAgICB9KTtcbn07XG5cbi8vIEEgaGVscGVyIHRvIGZpZ3VyZSBvdXQgd2hhdCBsb2NhdGlvbiB0aGlzIG9wZXJhdGlvbiBoYXBwZW5zIGF0LlxuUmVzdFdyaXRlLnByb3RvdHlwZS5sb2NhdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIG1pZGRsZSA9IHRoaXMuY2xhc3NOYW1lID09PSAnX1VzZXInID8gJy91c2Vycy8nIDogJy9jbGFzc2VzLycgKyB0aGlzLmNsYXNzTmFtZSArICcvJztcbiAgY29uc3QgbW91bnQgPSB0aGlzLmNvbmZpZy5tb3VudCB8fCB0aGlzLmNvbmZpZy5zZXJ2ZXJVUkw7XG4gIHJldHVybiBtb3VudCArIG1pZGRsZSArIHRoaXMuZGF0YS5vYmplY3RJZDtcbn07XG5cbi8vIEEgaGVscGVyIHRvIGdldCB0aGUgb2JqZWN0IGlkIGZvciB0aGlzIG9wZXJhdGlvbi5cbi8vIEJlY2F1c2UgaXQgY291bGQgYmUgZWl0aGVyIG9uIHRoZSBxdWVyeSBvciBvbiB0aGUgZGF0YVxuUmVzdFdyaXRlLnByb3RvdHlwZS5vYmplY3RJZCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMuZGF0YS5vYmplY3RJZCB8fCB0aGlzLnF1ZXJ5Lm9iamVjdElkO1xufTtcblxuLy8gUmV0dXJucyBhIGNvcHkgb2YgdGhlIGRhdGEgYW5kIGRlbGV0ZSBiYWQga2V5cyAoX2F1dGhfZGF0YSwgX2hhc2hlZF9wYXNzd29yZC4uLilcblJlc3RXcml0ZS5wcm90b3R5cGUuc2FuaXRpemVkRGF0YSA9IGZ1bmN0aW9uICgpIHtcbiAgY29uc3QgZGF0YSA9IE9iamVjdC5rZXlzKHRoaXMuZGF0YSkucmVkdWNlKChkYXRhLCBrZXkpID0+IHtcbiAgICAvLyBSZWdleHAgY29tZXMgZnJvbSBQYXJzZS5PYmplY3QucHJvdG90eXBlLnZhbGlkYXRlXG4gICAgaWYgKCEvXltBLVphLXpdWzAtOUEtWmEtel9dKiQvLnRlc3Qoa2V5KSkge1xuICAgICAgZGVsZXRlIGRhdGFba2V5XTtcbiAgICB9XG4gICAgcmV0dXJuIGRhdGE7XG4gIH0sIGRlZXBjb3B5KHRoaXMuZGF0YSkpO1xuICByZXR1cm4gUGFyc2UuX2RlY29kZSh1bmRlZmluZWQsIGRhdGEpO1xufTtcblxuLy8gUmV0dXJucyBhbiB1cGRhdGVkIGNvcHkgb2YgdGhlIG9iamVjdFxuUmVzdFdyaXRlLnByb3RvdHlwZS5idWlsZFBhcnNlT2JqZWN0cyA9IGZ1bmN0aW9uICgpIHtcbiAgY29uc3QgZXh0cmFEYXRhID0geyBjbGFzc05hbWU6IHRoaXMuY2xhc3NOYW1lLCBvYmplY3RJZDogdGhpcy5xdWVyeT8ub2JqZWN0SWQgfTtcbiAgbGV0IG9yaWdpbmFsT2JqZWN0O1xuICBpZiAodGhpcy5xdWVyeSAmJiB0aGlzLnF1ZXJ5Lm9iamVjdElkKSB7XG4gICAgb3JpZ2luYWxPYmplY3QgPSB0cmlnZ2Vycy5pbmZsYXRlKGV4dHJhRGF0YSwgdGhpcy5vcmlnaW5hbERhdGEpO1xuICB9XG5cbiAgY29uc3QgY2xhc3NOYW1lID0gUGFyc2UuT2JqZWN0LmZyb21KU09OKGV4dHJhRGF0YSk7XG4gIGNvbnN0IHJlYWRPbmx5QXR0cmlidXRlcyA9IGNsYXNzTmFtZS5jb25zdHJ1Y3Rvci5yZWFkT25seUF0dHJpYnV0ZXNcbiAgICA/IGNsYXNzTmFtZS5jb25zdHJ1Y3Rvci5yZWFkT25seUF0dHJpYnV0ZXMoKVxuICAgIDogW107XG4gIGlmICghdGhpcy5vcmlnaW5hbERhdGEpIHtcbiAgICBmb3IgKGNvbnN0IGF0dHJpYnV0ZSBvZiByZWFkT25seUF0dHJpYnV0ZXMpIHtcbiAgICAgIGV4dHJhRGF0YVthdHRyaWJ1dGVdID0gdGhpcy5kYXRhW2F0dHJpYnV0ZV07XG4gICAgfVxuICB9XG4gIGNvbnN0IHVwZGF0ZWRPYmplY3QgPSB0cmlnZ2Vycy5pbmZsYXRlKGV4dHJhRGF0YSwgdGhpcy5vcmlnaW5hbERhdGEpO1xuICBPYmplY3Qua2V5cyh0aGlzLmRhdGEpLnJlZHVjZShmdW5jdGlvbiAoZGF0YSwga2V5KSB7XG4gICAgaWYgKGtleS5pbmRleE9mKCcuJykgPiAwKSB7XG4gICAgICBpZiAodHlwZW9mIGRhdGFba2V5XS5fX29wID09PSAnc3RyaW5nJykge1xuICAgICAgICBpZiAoIXJlYWRPbmx5QXR0cmlidXRlcy5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgICAgdXBkYXRlZE9iamVjdC5zZXQoa2V5LCBkYXRhW2tleV0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBzdWJkb2N1bWVudCBrZXkgd2l0aCBkb3Qgbm90YXRpb24geyAneC55JzogdiB9ID0+IHsgJ3gnOiB7ICd5JyA6IHYgfSB9KVxuICAgICAgICBjb25zdCBzcGxpdHRlZEtleSA9IGtleS5zcGxpdCgnLicpO1xuICAgICAgICBjb25zdCBwYXJlbnRQcm9wID0gc3BsaXR0ZWRLZXlbMF07XG4gICAgICAgIGxldCBwYXJlbnRWYWwgPSB1cGRhdGVkT2JqZWN0LmdldChwYXJlbnRQcm9wKTtcbiAgICAgICAgaWYgKHR5cGVvZiBwYXJlbnRWYWwgIT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgcGFyZW50VmFsID0ge307XG4gICAgICAgIH1cbiAgICAgICAgcGFyZW50VmFsW3NwbGl0dGVkS2V5WzFdXSA9IGRhdGFba2V5XTtcbiAgICAgICAgdXBkYXRlZE9iamVjdC5zZXQocGFyZW50UHJvcCwgcGFyZW50VmFsKTtcbiAgICAgIH1cbiAgICAgIGRlbGV0ZSBkYXRhW2tleV07XG4gICAgfVxuICAgIHJldHVybiBkYXRhO1xuICB9LCBkZWVwY29weSh0aGlzLmRhdGEpKTtcblxuICBjb25zdCBzYW5pdGl6ZWQgPSB0aGlzLnNhbml0aXplZERhdGEoKTtcbiAgZm9yIChjb25zdCBhdHRyaWJ1dGUgb2YgcmVhZE9ubHlBdHRyaWJ1dGVzKSB7XG4gICAgZGVsZXRlIHNhbml0aXplZFthdHRyaWJ1dGVdO1xuICB9XG4gIHVwZGF0ZWRPYmplY3Quc2V0KHNhbml0aXplZCk7XG4gIHJldHVybiB7IHVwZGF0ZWRPYmplY3QsIG9yaWdpbmFsT2JqZWN0IH07XG59O1xuXG5SZXN0V3JpdGUucHJvdG90eXBlLmNsZWFuVXNlckF1dGhEYXRhID0gZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy5yZXNwb25zZSAmJiB0aGlzLnJlc3BvbnNlLnJlc3BvbnNlICYmIHRoaXMuY2xhc3NOYW1lID09PSAnX1VzZXInKSB7XG4gICAgY29uc3QgdXNlciA9IHRoaXMucmVzcG9uc2UucmVzcG9uc2U7XG4gICAgaWYgKHVzZXIuYXV0aERhdGEpIHtcbiAgICAgIE9iamVjdC5rZXlzKHVzZXIuYXV0aERhdGEpLmZvckVhY2gocHJvdmlkZXIgPT4ge1xuICAgICAgICBpZiAodXNlci5hdXRoRGF0YVtwcm92aWRlcl0gPT09IG51bGwpIHtcbiAgICAgICAgICBkZWxldGUgdXNlci5hdXRoRGF0YVtwcm92aWRlcl07XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgaWYgKE9iamVjdC5rZXlzKHVzZXIuYXV0aERhdGEpLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgIGRlbGV0ZSB1c2VyLmF1dGhEYXRhO1xuICAgICAgfVxuICAgIH1cbiAgfVxufTtcblxuUmVzdFdyaXRlLnByb3RvdHlwZS5fdXBkYXRlUmVzcG9uc2VXaXRoRGF0YSA9IGZ1bmN0aW9uIChyZXNwb25zZSwgZGF0YSkge1xuICBjb25zdCB7IHVwZGF0ZWRPYmplY3QgfSA9IHRoaXMuYnVpbGRQYXJzZU9iamVjdHMoKTtcbiAgY29uc3Qgc3RhdGVDb250cm9sbGVyID0gUGFyc2UuQ29yZU1hbmFnZXIuZ2V0T2JqZWN0U3RhdGVDb250cm9sbGVyKCk7XG4gIGNvbnN0IFtwZW5kaW5nXSA9IHN0YXRlQ29udHJvbGxlci5nZXRQZW5kaW5nT3BzKHVwZGF0ZWRPYmplY3QuX2dldFN0YXRlSWRlbnRpZmllcigpKTtcbiAgZm9yIChjb25zdCBrZXkgaW4gdGhpcy5wZW5kaW5nT3BzKSB7XG4gICAgaWYgKCFwZW5kaW5nW2tleV0pIHtcbiAgICAgIGRhdGFba2V5XSA9IHRoaXMub3JpZ2luYWxEYXRhID8gdGhpcy5vcmlnaW5hbERhdGFba2V5XSA6IHsgX19vcDogJ0RlbGV0ZScgfTtcbiAgICAgIHRoaXMuc3RvcmFnZS5maWVsZHNDaGFuZ2VkQnlUcmlnZ2VyLnB1c2goa2V5KTtcbiAgICB9XG4gIH1cbiAgY29uc3Qgc2tpcEtleXMgPSBbLi4uKHJlcXVpcmVkQ29sdW1ucy5yZWFkW3RoaXMuY2xhc3NOYW1lXSB8fCBbXSldO1xuICBpZiAoIXRoaXMucXVlcnkpIHtcbiAgICBza2lwS2V5cy5wdXNoKCdvYmplY3RJZCcsICdjcmVhdGVkQXQnKTtcbiAgfSBlbHNlIHtcbiAgICBza2lwS2V5cy5wdXNoKCd1cGRhdGVkQXQnKTtcbiAgICBkZWxldGUgcmVzcG9uc2Uub2JqZWN0SWQ7XG4gIH1cbiAgZm9yIChjb25zdCBrZXkgaW4gcmVzcG9uc2UpIHtcbiAgICBpZiAoc2tpcEtleXMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IHZhbHVlID0gcmVzcG9uc2Vba2V5XTtcbiAgICBpZiAoXG4gICAgICB2YWx1ZSA9PSBudWxsIHx8XG4gICAgICAodmFsdWUuX190eXBlICYmIHZhbHVlLl9fdHlwZSA9PT0gJ1BvaW50ZXInKSB8fFxuICAgICAgdXRpbC5pc0RlZXBTdHJpY3RFcXVhbChkYXRhW2tleV0sIHZhbHVlKSB8fFxuICAgICAgdXRpbC5pc0RlZXBTdHJpY3RFcXVhbCgodGhpcy5vcmlnaW5hbERhdGEgfHwge30pW2tleV0sIHZhbHVlKVxuICAgICkge1xuICAgICAgZGVsZXRlIHJlc3BvbnNlW2tleV07XG4gICAgfVxuICB9XG4gIGlmIChfLmlzRW1wdHkodGhpcy5zdG9yYWdlLmZpZWxkc0NoYW5nZWRCeVRyaWdnZXIpKSB7XG4gICAgcmV0dXJuIHJlc3BvbnNlO1xuICB9XG4gIGNvbnN0IGNsaWVudFN1cHBvcnRzRGVsZXRlID0gQ2xpZW50U0RLLnN1cHBvcnRzRm9yd2FyZERlbGV0ZSh0aGlzLmNsaWVudFNESyk7XG4gIHRoaXMuc3RvcmFnZS5maWVsZHNDaGFuZ2VkQnlUcmlnZ2VyLmZvckVhY2goZmllbGROYW1lID0+IHtcbiAgICBjb25zdCBkYXRhVmFsdWUgPSBkYXRhW2ZpZWxkTmFtZV07XG5cbiAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChyZXNwb25zZSwgZmllbGROYW1lKSkge1xuICAgICAgcmVzcG9uc2VbZmllbGROYW1lXSA9IGRhdGFWYWx1ZTtcbiAgICB9XG5cbiAgICAvLyBTdHJpcHMgb3BlcmF0aW9ucyBmcm9tIHJlc3BvbnNlc1xuICAgIGlmIChyZXNwb25zZVtmaWVsZE5hbWVdICYmIHJlc3BvbnNlW2ZpZWxkTmFtZV0uX19vcCkge1xuICAgICAgZGVsZXRlIHJlc3BvbnNlW2ZpZWxkTmFtZV07XG4gICAgICBpZiAoY2xpZW50U3VwcG9ydHNEZWxldGUgJiYgZGF0YVZhbHVlLl9fb3AgPT0gJ0RlbGV0ZScpIHtcbiAgICAgICAgcmVzcG9uc2VbZmllbGROYW1lXSA9IGRhdGFWYWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuICByZXR1cm4gcmVzcG9uc2U7XG59O1xuXG5SZXN0V3JpdGUucHJvdG90eXBlLmNoZWNrUHJvaGliaXRlZEtleXdvcmRzID0gZnVuY3Rpb24gKGRhdGEpIHtcbiAgaWYgKHRoaXMuY29uZmlnLnJlcXVlc3RLZXl3b3JkRGVueWxpc3QpIHtcbiAgICAvLyBTY2FuIHJlcXVlc3QgZGF0YSBmb3IgZGVuaWVkIGtleXdvcmRzXG4gICAgZm9yIChjb25zdCBrZXl3b3JkIG9mIHRoaXMuY29uZmlnLnJlcXVlc3RLZXl3b3JkRGVueWxpc3QpIHtcbiAgICAgIGNvbnN0IG1hdGNoID0gVXRpbHMub2JqZWN0Q29udGFpbnNLZXlWYWx1ZShkYXRhLCBrZXl3b3JkLmtleSwga2V5d29yZC52YWx1ZSk7XG4gICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFxuICAgICAgICAgIFBhcnNlLkVycm9yLklOVkFMSURfS0VZX05BTUUsXG4gICAgICAgICAgYFByb2hpYml0ZWQga2V5d29yZCBpbiByZXF1ZXN0IGRhdGE6ICR7SlNPTi5zdHJpbmdpZnkoa2V5d29yZCl9LmBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IFJlc3RXcml0ZTtcbm1vZHVsZS5leHBvcnRzID0gUmVzdFdyaXRlO1xuIl19
1455
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJTY2hlbWFDb250cm9sbGVyIiwicmVxdWlyZSIsImRlZXBjb3B5IiwiQXV0aCIsIlV0aWxzIiwiY3J5cHRvVXRpbHMiLCJwYXNzd29yZENyeXB0byIsIlBhcnNlIiwidHJpZ2dlcnMiLCJDbGllbnRTREsiLCJ1dGlsIiwiUmVzdFdyaXRlIiwiY29uZmlnIiwiYXV0aCIsImNsYXNzTmFtZSIsInF1ZXJ5IiwiZGF0YSIsIm9yaWdpbmFsRGF0YSIsImNsaWVudFNESyIsImNvbnRleHQiLCJhY3Rpb24iLCJpc1JlYWRPbmx5IiwiRXJyb3IiLCJPUEVSQVRJT05fRk9SQklEREVOIiwic3RvcmFnZSIsInJ1bk9wdGlvbnMiLCJhbGxvd0N1c3RvbU9iamVjdElkIiwiT2JqZWN0IiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwib2JqZWN0SWQiLCJNSVNTSU5HX09CSkVDVF9JRCIsIklOVkFMSURfS0VZX05BTUUiLCJpZCIsImNoZWNrUHJvaGliaXRlZEtleXdvcmRzIiwicmVzcG9uc2UiLCJ1cGRhdGVkQXQiLCJfZW5jb2RlIiwiRGF0ZSIsImlzbyIsInZhbGlkU2NoZW1hQ29udHJvbGxlciIsInBlbmRpbmdPcHMiLCJvcGVyYXRpb25zIiwiaWRlbnRpZmllciIsImV4ZWN1dGUiLCJQcm9taXNlIiwicmVzb2x2ZSIsInRoZW4iLCJnZXRVc2VyQW5kUm9sZUFDTCIsInZhbGlkYXRlQ2xpZW50Q2xhc3NDcmVhdGlvbiIsImhhbmRsZUluc3RhbGxhdGlvbiIsImhhbmRsZVNlc3Npb24iLCJ2YWxpZGF0ZUF1dGhEYXRhIiwicnVuQmVmb3JlU2F2ZVRyaWdnZXIiLCJlbnN1cmVVbmlxdWVBdXRoRGF0YUlkIiwiZGVsZXRlRW1haWxSZXNldFRva2VuSWZOZWVkZWQiLCJ2YWxpZGF0ZVNjaGVtYSIsInNjaGVtYUNvbnRyb2xsZXIiLCJzZXRSZXF1aXJlZEZpZWxkc0lmTmVlZGVkIiwidHJhbnNmb3JtVXNlciIsImV4cGFuZEZpbGVzRm9yRXhpc3RpbmdPYmplY3RzIiwiZGVzdHJveUR1cGxpY2F0ZWRTZXNzaW9ucyIsInJ1bkRhdGFiYXNlT3BlcmF0aW9uIiwiY3JlYXRlU2Vzc2lvblRva2VuSWZOZWVkZWQiLCJoYW5kbGVGb2xsb3d1cCIsInJ1bkFmdGVyU2F2ZVRyaWdnZXIiLCJjbGVhblVzZXJBdXRoRGF0YSIsImF1dGhEYXRhUmVzcG9uc2UiLCJpc01hc3RlciIsImFjbCIsInVzZXIiLCJnZXRVc2VyUm9sZXMiLCJyb2xlcyIsImNvbmNhdCIsImFsbG93Q2xpZW50Q2xhc3NDcmVhdGlvbiIsInN5c3RlbUNsYXNzZXMiLCJpbmRleE9mIiwiZGF0YWJhc2UiLCJsb2FkU2NoZW1hIiwiaGFzQ2xhc3MiLCJ2YWxpZGF0ZU9iamVjdCIsIm1hbnkiLCJ0cmlnZ2VyRXhpc3RzIiwiVHlwZXMiLCJiZWZvcmVTYXZlIiwiYXBwbGljYXRpb25JZCIsIm9yaWdpbmFsT2JqZWN0IiwidXBkYXRlZE9iamVjdCIsImJ1aWxkUGFyc2VPYmplY3RzIiwiX2dldFN0YXRlSWRlbnRpZmllciIsInN0YXRlQ29udHJvbGxlciIsIkNvcmVNYW5hZ2VyIiwiZ2V0T2JqZWN0U3RhdGVDb250cm9sbGVyIiwicGVuZGluZyIsImdldFBlbmRpbmdPcHMiLCJkYXRhYmFzZVByb21pc2UiLCJ1cGRhdGUiLCJjcmVhdGUiLCJyZXN1bHQiLCJsZW5ndGgiLCJPQkpFQ1RfTk9UX0ZPVU5EIiwibWF5YmVSdW5UcmlnZ2VyIiwib2JqZWN0IiwiZmllbGRzQ2hhbmdlZEJ5VHJpZ2dlciIsIl8iLCJyZWR1Y2UiLCJ2YWx1ZSIsImtleSIsImlzRXF1YWwiLCJwdXNoIiwicnVuQmVmb3JlTG9naW5UcmlnZ2VyIiwidXNlckRhdGEiLCJiZWZvcmVMb2dpbiIsImV4dHJhRGF0YSIsImZpbGVzQ29udHJvbGxlciIsImV4cGFuZEZpbGVzSW5PYmplY3QiLCJpbmZsYXRlIiwiZ2V0QWxsQ2xhc3NlcyIsImFsbENsYXNzZXMiLCJzY2hlbWEiLCJmaW5kIiwib25lQ2xhc3MiLCJzZXRSZXF1aXJlZEZpZWxkSWZOZWVkZWQiLCJmaWVsZE5hbWUiLCJzZXREZWZhdWx0IiwidW5kZWZpbmVkIiwiX19vcCIsImZpZWxkcyIsImRlZmF1bHRWYWx1ZSIsInJlcXVpcmVkIiwiVkFMSURBVElPTl9FUlJPUiIsImNyZWF0ZWRBdCIsIm5ld09iamVjdElkIiwib2JqZWN0SWRTaXplIiwia2V5cyIsImZvckVhY2giLCJhdXRoRGF0YSIsImhhc1VzZXJuYW1lQW5kUGFzc3dvcmQiLCJ1c2VybmFtZSIsInBhc3N3b3JkIiwiaXNFbXB0eSIsIlVTRVJOQU1FX01JU1NJTkciLCJQQVNTV09SRF9NSVNTSU5HIiwiVU5TVVBQT1JURURfU0VSVklDRSIsInByb3ZpZGVycyIsImNhbkhhbmRsZUF1dGhEYXRhIiwic29tZSIsInByb3ZpZGVyIiwicHJvdmlkZXJBdXRoRGF0YSIsImhhc1Rva2VuIiwiZ2V0VXNlcklkIiwiaGFuZGxlQXV0aERhdGEiLCJmaWx0ZXJlZE9iamVjdHNCeUFDTCIsIm9iamVjdHMiLCJmaWx0ZXIiLCJBQ0wiLCJoYXNBdXRoRGF0YUlkIiwiciIsImZpbmRVc2Vyc1dpdGhBdXRoRGF0YSIsInJlc3VsdHMiLCJBQ0NPVU5UX0FMUkVBRFlfTElOS0VEIiwidXNlcklkIiwiaGFuZGxlQXV0aERhdGFWYWxpZGF0aW9uIiwidmFsaWRhdGVkQXV0aERhdGEiLCJ1c2VyUmVzdWx0IiwiYXV0aFByb3ZpZGVyIiwiam9pbiIsImhhc011dGF0ZWRBdXRoRGF0YSIsIm11dGF0ZWRBdXRoRGF0YSIsImlzQ3VycmVudFVzZXJMb2dnZWRPck1hc3RlciIsImlzTG9naW4iLCJsb2NhdGlvbiIsImNoZWNrSWZVc2VySGFzUHJvdmlkZWRDb25maWd1cmVkUHJvdmlkZXJzRm9yTG9naW4iLCJhbGxvd0V4cGlyZWRBdXRoRGF0YVRva2VuIiwicmVzIiwicHJvbWlzZSIsImVycm9yIiwiUmVzdFF1ZXJ5IiwibWFzdGVyIiwiX190eXBlIiwic2Vzc2lvbiIsImNhY2hlQ29udHJvbGxlciIsImRlbCIsInNlc3Npb25Ub2tlbiIsIl92YWxpZGF0ZVBhc3N3b3JkUG9saWN5IiwiaGFzaCIsImhhc2hlZFBhc3N3b3JkIiwiX2hhc2hlZF9wYXNzd29yZCIsIl92YWxpZGF0ZVVzZXJOYW1lIiwiX3ZhbGlkYXRlRW1haWwiLCJyYW5kb21TdHJpbmciLCJyZXNwb25zZVNob3VsZEhhdmVVc2VybmFtZSIsIiRuZSIsImxpbWl0IiwiY2FzZUluc2Vuc2l0aXZlIiwiVVNFUk5BTUVfVEFLRU4iLCJlbWFpbCIsIm1hdGNoIiwicmVqZWN0IiwiSU5WQUxJRF9FTUFJTF9BRERSRVNTIiwiRU1BSUxfVEFLRU4iLCJ1c2VyQ29udHJvbGxlciIsInNldEVtYWlsVmVyaWZ5VG9rZW4iLCJwYXNzd29yZFBvbGljeSIsIl92YWxpZGF0ZVBhc3N3b3JkUmVxdWlyZW1lbnRzIiwiX3ZhbGlkYXRlUGFzc3dvcmRIaXN0b3J5IiwicG9saWN5RXJyb3IiLCJ2YWxpZGF0aW9uRXJyb3IiLCJjb250YWluc1VzZXJuYW1lRXJyb3IiLCJwYXR0ZXJuVmFsaWRhdG9yIiwidmFsaWRhdG9yQ2FsbGJhY2siLCJkb05vdEFsbG93VXNlcm5hbWUiLCJtYXhQYXNzd29yZEhpc3RvcnkiLCJvbGRQYXNzd29yZHMiLCJfcGFzc3dvcmRfaGlzdG9yeSIsInRha2UiLCJuZXdQYXNzd29yZCIsInByb21pc2VzIiwibWFwIiwiY29tcGFyZSIsImFsbCIsImNhdGNoIiwiZXJyIiwicHJldmVudExvZ2luV2l0aFVudmVyaWZpZWRFbWFpbCIsInZlcmlmeVVzZXJFbWFpbHMiLCJjcmVhdGVTZXNzaW9uVG9rZW4iLCJpbnN0YWxsYXRpb25JZCIsInNlc3Npb25EYXRhIiwiY3JlYXRlU2Vzc2lvbiIsImNyZWF0ZWRXaXRoIiwiYWRkaXRpb25hbFNlc3Npb25EYXRhIiwidG9rZW4iLCJuZXdUb2tlbiIsImV4cGlyZXNBdCIsImdlbmVyYXRlU2Vzc2lvbkV4cGlyZXNBdCIsImFzc2lnbiIsImFkZE9wcyIsIl9wZXJpc2hhYmxlX3Rva2VuIiwiX3BlcmlzaGFibGVfdG9rZW5fZXhwaXJlc19hdCIsImRlc3Ryb3kiLCJyZXZva2VTZXNzaW9uT25QYXNzd29yZFJlc2V0Iiwic2Vzc2lvblF1ZXJ5IiwiYmluZCIsInNlbmRWZXJpZmljYXRpb25FbWFpbCIsIklOVkFMSURfU0VTU0lPTl9UT0tFTiIsIiRhbmQiLCJJTlRFUk5BTF9TRVJWRVJfRVJST1IiLCJzdGF0dXMiLCJkZXZpY2VUb2tlbiIsInRvTG93ZXJDYXNlIiwiZGV2aWNlVHlwZSIsImlkTWF0Y2giLCJvYmplY3RJZE1hdGNoIiwiaW5zdGFsbGF0aW9uSWRNYXRjaCIsImRldmljZVRva2VuTWF0Y2hlcyIsIm9yUXVlcmllcyIsIiRvciIsImRlbFF1ZXJ5IiwiYXBwSWRlbnRpZmllciIsImNvZGUiLCJvYmpJZCIsInJvbGUiLCJjbGVhciIsImxpdmVRdWVyeUNvbnRyb2xsZXIiLCJjbGVhckNhY2hlZFJvbGVzIiwiaXNVbmF1dGhlbnRpY2F0ZWQiLCJTRVNTSU9OX01JU1NJTkciLCJkb3dubG9hZCIsImRvd25sb2FkTmFtZSIsIm5hbWUiLCJJTlZBTElEX0FDTCIsInJlYWQiLCJ3cml0ZSIsIm1heFBhc3N3b3JkQWdlIiwiX3Bhc3N3b3JkX2NoYW5nZWRfYXQiLCJkZWZlciIsIk1hdGgiLCJtYXgiLCJzaGlmdCIsIl91cGRhdGVSZXNwb25zZVdpdGhEYXRhIiwiZW5mb3JjZVByaXZhdGVVc2VycyIsIkRVUExJQ0FURV9WQUxVRSIsInVzZXJJbmZvIiwiZHVwbGljYXRlZF9maWVsZCIsImhhc0FmdGVyU2F2ZUhvb2siLCJhZnRlclNhdmUiLCJoYXNMaXZlUXVlcnkiLCJfaGFuZGxlU2F2ZVJlc3BvbnNlIiwicGVybXMiLCJnZXRDbGFzc0xldmVsUGVybWlzc2lvbnMiLCJvbkFmdGVyU2F2ZSIsImpzb25SZXR1cm5lZCIsIl90b0Z1bGxKU09OIiwidG9KU09OIiwibG9nZ2VyIiwid2FybiIsIm1pZGRsZSIsIm1vdW50Iiwic2VydmVyVVJMIiwic2FuaXRpemVkRGF0YSIsInRlc3QiLCJfZGVjb2RlIiwiZnJvbUpTT04iLCJyZWFkT25seUF0dHJpYnV0ZXMiLCJjb25zdHJ1Y3RvciIsImF0dHJpYnV0ZSIsImluY2x1ZGVzIiwic2V0Iiwic3BsaXR0ZWRLZXkiLCJzcGxpdCIsInBhcmVudFByb3AiLCJwYXJlbnRWYWwiLCJnZXQiLCJzYW5pdGl6ZWQiLCJza2lwS2V5cyIsInJlcXVpcmVkQ29sdW1ucyIsImlzRGVlcFN0cmljdEVxdWFsIiwiY2xpZW50U3VwcG9ydHNEZWxldGUiLCJzdXBwb3J0c0ZvcndhcmREZWxldGUiLCJkYXRhVmFsdWUiLCJyZXF1ZXN0S2V5d29yZERlbnlsaXN0Iiwia2V5d29yZCIsIm9iamVjdENvbnRhaW5zS2V5VmFsdWUiLCJKU09OIiwic3RyaW5naWZ5IiwibW9kdWxlIiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uL3NyYy9SZXN0V3JpdGUuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gQSBSZXN0V3JpdGUgZW5jYXBzdWxhdGVzIGV2ZXJ5dGhpbmcgd2UgbmVlZCB0byBydW4gYW4gb3BlcmF0aW9uXG4vLyB0aGF0IHdyaXRlcyB0byB0aGUgZGF0YWJhc2UuXG4vLyBUaGlzIGNvdWxkIGJlIGVpdGhlciBhIFwiY3JlYXRlXCIgb3IgYW4gXCJ1cGRhdGVcIi5cblxudmFyIFNjaGVtYUNvbnRyb2xsZXIgPSByZXF1aXJlKCcuL0NvbnRyb2xsZXJzL1NjaGVtYUNvbnRyb2xsZXInKTtcbnZhciBkZWVwY29weSA9IHJlcXVpcmUoJ2RlZXBjb3B5Jyk7XG5cbmNvbnN0IEF1dGggPSByZXF1aXJlKCcuL0F1dGgnKTtcbmNvbnN0IFV0aWxzID0gcmVxdWlyZSgnLi9VdGlscycpO1xudmFyIGNyeXB0b1V0aWxzID0gcmVxdWlyZSgnLi9jcnlwdG9VdGlscycpO1xudmFyIHBhc3N3b3JkQ3J5cHRvID0gcmVxdWlyZSgnLi9wYXNzd29yZCcpO1xudmFyIFBhcnNlID0gcmVxdWlyZSgncGFyc2Uvbm9kZScpO1xudmFyIHRyaWdnZXJzID0gcmVxdWlyZSgnLi90cmlnZ2VycycpO1xudmFyIENsaWVudFNESyA9IHJlcXVpcmUoJy4vQ2xpZW50U0RLJyk7XG5jb25zdCB1dGlsID0gcmVxdWlyZSgndXRpbCcpO1xuaW1wb3J0IFJlc3RRdWVyeSBmcm9tICcuL1Jlc3RRdWVyeSc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IGxvZ2dlciBmcm9tICcuL2xvZ2dlcic7XG5pbXBvcnQgeyByZXF1aXJlZENvbHVtbnMgfSBmcm9tICcuL0NvbnRyb2xsZXJzL1NjaGVtYUNvbnRyb2xsZXInO1xuXG4vLyBxdWVyeSBhbmQgZGF0YSBhcmUgYm90aCBwcm92aWRlZCBpbiBSRVNUIEFQSSBmb3JtYXQuIFNvIGRhdGFcbi8vIHR5cGVzIGFyZSBlbmNvZGVkIGJ5IHBsYWluIG9sZCBvYmplY3RzLlxuLy8gSWYgcXVlcnkgaXMgbnVsbCwgdGhpcyBpcyBhIFwiY3JlYXRlXCIgYW5kIHRoZSBkYXRhIGluIGRhdGEgc2hvdWxkIGJlXG4vLyBjcmVhdGVkLlxuLy8gT3RoZXJ3aXNlIHRoaXMgaXMgYW4gXCJ1cGRhdGVcIiAtIHRoZSBvYmplY3QgbWF0Y2hpbmcgdGhlIHF1ZXJ5XG4vLyBzaG91bGQgZ2V0IHVwZGF0ZWQgd2l0aCBkYXRhLlxuLy8gUmVzdFdyaXRlIHdpbGwgaGFuZGxlIG9iamVjdElkLCBjcmVhdGVkQXQsIGFuZCB1cGRhdGVkQXQgZm9yXG4vLyBldmVyeXRoaW5nLiBJdCBhbHNvIGtub3dzIHRvIHVzZSB0cmlnZ2VycyBhbmQgc3BlY2lhbCBtb2RpZmljYXRpb25zXG4vLyBmb3IgdGhlIF9Vc2VyIGNsYXNzLlxuZnVuY3Rpb24gUmVzdFdyaXRlKGNvbmZpZywgYXV0aCwgY2xhc3NOYW1lLCBxdWVyeSwgZGF0YSwgb3JpZ2luYWxEYXRhLCBjbGllbnRTREssIGNvbnRleHQsIGFjdGlvbikge1xuICBpZiAoYXV0aC5pc1JlYWRPbmx5KSB7XG4gICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFxuICAgICAgUGFyc2UuRXJyb3IuT1BFUkFUSU9OX0ZPUkJJRERFTixcbiAgICAgICdDYW5ub3QgcGVyZm9ybSBhIHdyaXRlIG9wZXJhdGlvbiB3aGVuIHVzaW5nIHJlYWRPbmx5TWFzdGVyS2V5J1xuICAgICk7XG4gIH1cbiAgdGhpcy5jb25maWcgPSBjb25maWc7XG4gIHRoaXMuYXV0aCA9IGF1dGg7XG4gIHRoaXMuY2xhc3NOYW1lID0gY2xhc3NOYW1lO1xuICB0aGlzLmNsaWVudFNESyA9IGNsaWVudFNESztcbiAgdGhpcy5zdG9yYWdlID0ge307XG4gIHRoaXMucnVuT3B0aW9ucyA9IHt9O1xuICB0aGlzLmNvbnRleHQgPSBjb250ZXh0IHx8IHt9O1xuXG4gIGlmIChhY3Rpb24pIHtcbiAgICB0aGlzLnJ1bk9wdGlvbnMuYWN0aW9uID0gYWN0aW9uO1xuICB9XG5cbiAgaWYgKCFxdWVyeSkge1xuICAgIGlmICh0aGlzLmNvbmZpZy5hbGxvd0N1c3RvbU9iamVjdElkKSB7XG4gICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGRhdGEsICdvYmplY3RJZCcpICYmICFkYXRhLm9iamVjdElkKSB7XG4gICAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihcbiAgICAgICAgICBQYXJzZS5FcnJvci5NSVNTSU5HX09CSkVDVF9JRCxcbiAgICAgICAgICAnb2JqZWN0SWQgbXVzdCBub3QgYmUgZW1wdHksIG51bGwgb3IgdW5kZWZpbmVkJ1xuICAgICAgICApO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoZGF0YS5vYmplY3RJZCkge1xuICAgICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuSU5WQUxJRF9LRVlfTkFNRSwgJ29iamVjdElkIGlzIGFuIGludmFsaWQgZmllbGQgbmFtZS4nKTtcbiAgICAgIH1cbiAgICAgIGlmIChkYXRhLmlkKSB7XG4gICAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5JTlZBTElEX0tFWV9OQU1FLCAnaWQgaXMgYW4gaW52YWxpZCBmaWVsZCBuYW1lLicpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHRoaXMuY2hlY2tQcm9oaWJpdGVkS2V5d29yZHMoZGF0YSk7XG5cbiAgLy8gV2hlbiB0aGUgb3BlcmF0aW9uIGlzIGNvbXBsZXRlLCB0aGlzLnJlc3BvbnNlIG1heSBoYXZlIHNldmVyYWxcbiAgLy8gZmllbGRzLlxuICAvLyByZXNwb25zZTogdGhlIGFjdHVhbCBkYXRhIHRvIGJlIHJldHVybmVkXG4gIC8vIHN0YXR1czogdGhlIGh0dHAgc3RhdHVzIGNvZGUuIGlmIG5vdCBwcmVzZW50LCB0cmVhdGVkIGxpa2UgYSAyMDBcbiAgLy8gbG9jYXRpb246IHRoZSBsb2NhdGlvbiBoZWFkZXIuIGlmIG5vdCBwcmVzZW50LCBubyBsb2NhdGlvbiBoZWFkZXJcbiAgdGhpcy5yZXNwb25zZSA9IG51bGw7XG5cbiAgLy8gUHJvY2Vzc2luZyB0aGlzIG9wZXJhdGlvbiBtYXkgbXV0YXRlIG91ciBkYXRhLCBzbyB3ZSBvcGVyYXRlIG9uIGFcbiAgLy8gY29weVxuICB0aGlzLnF1ZXJ5ID0gZGVlcGNvcHkocXVlcnkpO1xuICB0aGlzLmRhdGEgPSBkZWVwY29weShkYXRhKTtcbiAgLy8gV2UgbmV2ZXIgY2hhbmdlIG9yaWdpbmFsRGF0YSwgc28gd2UgZG8gbm90IG5lZWQgYSBkZWVwIGNvcHlcbiAgdGhpcy5vcmlnaW5hbERhdGEgPSBvcmlnaW5hbERhdGE7XG5cbiAgLy8gVGhlIHRpbWVzdGFtcCB3ZSdsbCB1c2UgZm9yIHRoaXMgd2hvbGUgb3BlcmF0aW9uXG4gIHRoaXMudXBkYXRlZEF0ID0gUGFyc2UuX2VuY29kZShuZXcgRGF0ZSgpKS5pc287XG5cbiAgLy8gU2hhcmVkIFNjaGVtYUNvbnRyb2xsZXIgdG8gYmUgcmV1c2VkIHRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIGxvYWRTY2hlbWEoKSBjYWxscyBwZXIgcmVxdWVzdFxuICAvLyBPbmNlIHNldCB0aGUgc2NoZW1hRGF0YSBzaG91bGQgYmUgaW1tdXRhYmxlXG4gIHRoaXMudmFsaWRTY2hlbWFDb250cm9sbGVyID0gbnVsbDtcbiAgdGhpcy5wZW5kaW5nT3BzID0ge1xuICAgIG9wZXJhdGlvbnM6IG51bGwsXG4gICAgaWRlbnRpZmllcjogbnVsbCxcbiAgfTtcbn1cblxuLy8gQSBjb252ZW5pZW50IG1ldGhvZCB0byBwZXJmb3JtIGFsbCB0aGUgc3RlcHMgb2YgcHJvY2Vzc2luZyB0aGVcbi8vIHdyaXRlLCBpbiBvcmRlci5cbi8vIFJldHVybnMgYSBwcm9taXNlIGZvciBhIHtyZXNwb25zZSwgc3RhdHVzLCBsb2NhdGlvbn0gb2JqZWN0LlxuLy8gc3RhdHVzIGFuZCBsb2NhdGlvbiBhcmUgb3B0aW9uYWwuXG5SZXN0V3JpdGUucHJvdG90eXBlLmV4ZWN1dGUgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBQcm9taXNlLnJlc29sdmUoKVxuICAgIC50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybiB0aGlzLmdldFVzZXJBbmRSb2xlQUNMKCk7XG4gICAgfSlcbiAgICAudGhlbigoKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy52YWxpZGF0ZUNsaWVudENsYXNzQ3JlYXRpb24oKTtcbiAgICB9KVxuICAgIC50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybiB0aGlzLmhhbmRsZUluc3RhbGxhdGlvbigpO1xuICAgIH0pXG4gICAgLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlU2Vzc2lvbigpO1xuICAgIH0pXG4gICAgLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMudmFsaWRhdGVBdXRoRGF0YSgpO1xuICAgIH0pXG4gICAgLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMucnVuQmVmb3JlU2F2ZVRyaWdnZXIoKTtcbiAgICB9KVxuICAgIC50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybiB0aGlzLmVuc3VyZVVuaXF1ZUF1dGhEYXRhSWQoKTtcbiAgICB9KVxuICAgIC50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybiB0aGlzLmRlbGV0ZUVtYWlsUmVzZXRUb2tlbklmTmVlZGVkKCk7XG4gICAgfSlcbiAgICAudGhlbigoKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy52YWxpZGF0ZVNjaGVtYSgpO1xuICAgIH0pXG4gICAgLnRoZW4oc2NoZW1hQ29udHJvbGxlciA9PiB7XG4gICAgICB0aGlzLnZhbGlkU2NoZW1hQ29udHJvbGxlciA9IHNjaGVtYUNvbnRyb2xsZXI7XG4gICAgICByZXR1cm4gdGhpcy5zZXRSZXF1aXJlZEZpZWxkc0lmTmVlZGVkKCk7XG4gICAgfSlcbiAgICAudGhlbigoKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1Vc2VyKCk7XG4gICAgfSlcbiAgICAudGhlbigoKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5leHBhbmRGaWxlc0ZvckV4aXN0aW5nT2JqZWN0cygpO1xuICAgIH0pXG4gICAgLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuZGVzdHJveUR1cGxpY2F0ZWRTZXNzaW9ucygpO1xuICAgIH0pXG4gICAgLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMucnVuRGF0YWJhc2VPcGVyYXRpb24oKTtcbiAgICB9KVxuICAgIC50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVNlc3Npb25Ub2tlbklmTmVlZGVkKCk7XG4gICAgfSlcbiAgICAudGhlbigoKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5oYW5kbGVGb2xsb3d1cCgpO1xuICAgIH0pXG4gICAgLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMucnVuQWZ0ZXJTYXZlVHJpZ2dlcigpO1xuICAgIH0pXG4gICAgLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuY2xlYW5Vc2VyQXV0aERhdGEoKTtcbiAgICB9KVxuICAgIC50aGVuKCgpID0+IHtcbiAgICAgIC8vIEFwcGVuZCB0aGUgYXV0aERhdGFSZXNwb25zZSBpZiBleGlzdHNcbiAgICAgIGlmICh0aGlzLmF1dGhEYXRhUmVzcG9uc2UpIHtcbiAgICAgICAgaWYgKHRoaXMucmVzcG9uc2UgJiYgdGhpcy5yZXNwb25zZS5yZXNwb25zZSkge1xuICAgICAgICAgIHRoaXMucmVzcG9uc2UucmVzcG9uc2UuYXV0aERhdGFSZXNwb25zZSA9IHRoaXMuYXV0aERhdGFSZXNwb25zZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMucmVzcG9uc2U7XG4gICAgfSk7XG59O1xuXG4vLyBVc2VzIHRoZSBBdXRoIG9iamVjdCB0byBnZXQgdGhlIGxpc3Qgb2Ygcm9sZXMsIGFkZHMgdGhlIHVzZXIgaWRcblJlc3RXcml0ZS5wcm90b3R5cGUuZ2V0VXNlckFuZFJvbGVBQ0wgPSBmdW5jdGlvbiAoKSB7XG4gIGlmICh0aGlzLmF1dGguaXNNYXN0ZXIpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIH1cblxuICB0aGlzLnJ1bk9wdGlvbnMuYWNsID0gWycqJ107XG5cbiAgaWYgKHRoaXMuYXV0aC51c2VyKSB7XG4gICAgcmV0dXJuIHRoaXMuYXV0aC5nZXRVc2VyUm9sZXMoKS50aGVuKHJvbGVzID0+IHtcbiAgICAgIHRoaXMucnVuT3B0aW9ucy5hY2wgPSB0aGlzLnJ1bk9wdGlvbnMuYWNsLmNvbmNhdChyb2xlcywgW3RoaXMuYXV0aC51c2VyLmlkXSk7XG4gICAgICByZXR1cm47XG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICB9XG59O1xuXG4vLyBWYWxpZGF0ZXMgdGhpcyBvcGVyYXRpb24gYWdhaW5zdCB0aGUgYWxsb3dDbGllbnRDbGFzc0NyZWF0aW9uIGNvbmZpZy5cblJlc3RXcml0ZS5wcm90b3R5cGUudmFsaWRhdGVDbGllbnRDbGFzc0NyZWF0aW9uID0gZnVuY3Rpb24gKCkge1xuICBpZiAoXG4gICAgdGhpcy5jb25maWcuYWxsb3dDbGllbnRDbGFzc0NyZWF0aW9uID09PSBmYWxzZSAmJlxuICAgICF0aGlzLmF1dGguaXNNYXN0ZXIgJiZcbiAgICBTY2hlbWFDb250cm9sbGVyLnN5c3RlbUNsYXNzZXMuaW5kZXhPZih0aGlzLmNsYXNzTmFtZSkgPT09IC0xXG4gICkge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5kYXRhYmFzZVxuICAgICAgLmxvYWRTY2hlbWEoKVxuICAgICAgLnRoZW4oc2NoZW1hQ29udHJvbGxlciA9PiBzY2hlbWFDb250cm9sbGVyLmhhc0NsYXNzKHRoaXMuY2xhc3NOYW1lKSlcbiAgICAgIC50aGVuKGhhc0NsYXNzID0+IHtcbiAgICAgICAgaWYgKGhhc0NsYXNzICE9PSB0cnVlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFxuICAgICAgICAgICAgUGFyc2UuRXJyb3IuT1BFUkFUSU9OX0ZPUkJJRERFTixcbiAgICAgICAgICAgICdUaGlzIHVzZXIgaXMgbm90IGFsbG93ZWQgdG8gYWNjZXNzICcgKyAnbm9uLWV4aXN0ZW50IGNsYXNzOiAnICsgdGhpcy5jbGFzc05hbWVcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIH1cbn07XG5cbi8vIFZhbGlkYXRlcyB0aGlzIG9wZXJhdGlvbiBhZ2FpbnN0IHRoZSBzY2hlbWEuXG5SZXN0V3JpdGUucHJvdG90eXBlLnZhbGlkYXRlU2NoZW1hID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5jb25maWcuZGF0YWJhc2UudmFsaWRhdGVPYmplY3QoXG4gICAgdGhpcy5jbGFzc05hbWUsXG4gICAgdGhpcy5kYXRhLFxuICAgIHRoaXMucXVlcnksXG4gICAgdGhpcy5ydW5PcHRpb25zXG4gICk7XG59O1xuXG4vLyBSdW5zIGFueSBiZWZvcmVTYXZlIHRyaWdnZXJzIGFnYWluc3QgdGhpcyBvcGVyYXRpb24uXG4vLyBBbnkgY2hhbmdlIGxlYWRzIHRvIG91ciBkYXRhIGJlaW5nIG11dGF0ZWQuXG5SZXN0V3JpdGUucHJvdG90eXBlLnJ1bkJlZm9yZVNhdmVUcmlnZ2VyID0gZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy5yZXNwb25zZSB8fCB0aGlzLnJ1bk9wdGlvbnMubWFueSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIEF2b2lkIGRvaW5nIGFueSBzZXR1cCBmb3IgdHJpZ2dlcnMgaWYgdGhlcmUgaXMgbm8gJ2JlZm9yZVNhdmUnIHRyaWdnZXIgZm9yIHRoaXMgY2xhc3MuXG4gIGlmIChcbiAgICAhdHJpZ2dlcnMudHJpZ2dlckV4aXN0cyh0aGlzLmNsYXNzTmFtZSwgdHJpZ2dlcnMuVHlwZXMuYmVmb3JlU2F2ZSwgdGhpcy5jb25maWcuYXBwbGljYXRpb25JZClcbiAgKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICB9XG5cbiAgY29uc3QgeyBvcmlnaW5hbE9iamVjdCwgdXBkYXRlZE9iamVjdCB9ID0gdGhpcy5idWlsZFBhcnNlT2JqZWN0cygpO1xuICBjb25zdCBpZGVudGlmaWVyID0gdXBkYXRlZE9iamVjdC5fZ2V0U3RhdGVJZGVudGlmaWVyKCk7XG4gIGNvbnN0IHN0YXRlQ29udHJvbGxlciA9IFBhcnNlLkNvcmVNYW5hZ2VyLmdldE9iamVjdFN0YXRlQ29udHJvbGxlcigpO1xuICBjb25zdCBbcGVuZGluZ10gPSBzdGF0ZUNvbnRyb2xsZXIuZ2V0UGVuZGluZ09wcyhpZGVudGlmaWVyKTtcbiAgdGhpcy5wZW5kaW5nT3BzID0ge1xuICAgIG9wZXJhdGlvbnM6IHsgLi4ucGVuZGluZyB9LFxuICAgIGlkZW50aWZpZXIsXG4gIH07XG5cbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpXG4gICAgLnRoZW4oKCkgPT4ge1xuICAgICAgLy8gQmVmb3JlIGNhbGxpbmcgdGhlIHRyaWdnZXIsIHZhbGlkYXRlIHRoZSBwZXJtaXNzaW9ucyBmb3IgdGhlIHNhdmUgb3BlcmF0aW9uXG4gICAgICBsZXQgZGF0YWJhc2VQcm9taXNlID0gbnVsbDtcbiAgICAgIGlmICh0aGlzLnF1ZXJ5KSB7XG4gICAgICAgIC8vIFZhbGlkYXRlIGZvciB1cGRhdGluZ1xuICAgICAgICBkYXRhYmFzZVByb21pc2UgPSB0aGlzLmNvbmZpZy5kYXRhYmFzZS51cGRhdGUoXG4gICAgICAgICAgdGhpcy5jbGFzc05hbWUsXG4gICAgICAgICAgdGhpcy5xdWVyeSxcbiAgICAgICAgICB0aGlzLmRhdGEsXG4gICAgICAgICAgdGhpcy5ydW5PcHRpb25zLFxuICAgICAgICAgIHRydWUsXG4gICAgICAgICAgdHJ1ZVxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVmFsaWRhdGUgZm9yIGNyZWF0aW5nXG4gICAgICAgIGRhdGFiYXNlUHJvbWlzZSA9IHRoaXMuY29uZmlnLmRhdGFiYXNlLmNyZWF0ZShcbiAgICAgICAgICB0aGlzLmNsYXNzTmFtZSxcbiAgICAgICAgICB0aGlzLmRhdGEsXG4gICAgICAgICAgdGhpcy5ydW5PcHRpb25zLFxuICAgICAgICAgIHRydWVcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIC8vIEluIHRoZSBjYXNlIHRoYXQgdGhlcmUgaXMgbm8gcGVybWlzc2lvbiBmb3IgdGhlIG9wZXJhdGlvbiwgaXQgdGhyb3dzIGFuIGVycm9yXG4gICAgICByZXR1cm4gZGF0YWJhc2VQcm9taXNlLnRoZW4ocmVzdWx0ID0+IHtcbiAgICAgICAgaWYgKCFyZXN1bHQgfHwgcmVzdWx0Lmxlbmd0aCA8PSAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLk9CSkVDVF9OT1RfRk9VTkQsICdPYmplY3Qgbm90IGZvdW5kLicpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KVxuICAgIC50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybiB0cmlnZ2Vycy5tYXliZVJ1blRyaWdnZXIoXG4gICAgICAgIHRyaWdnZXJzLlR5cGVzLmJlZm9yZVNhdmUsXG4gICAgICAgIHRoaXMuYXV0aCxcbiAgICAgICAgdXBkYXRlZE9iamVjdCxcbiAgICAgICAgb3JpZ2luYWxPYmplY3QsXG4gICAgICAgIHRoaXMuY29uZmlnLFxuICAgICAgICB0aGlzLmNvbnRleHRcbiAgICAgICk7XG4gICAgfSlcbiAgICAudGhlbihyZXNwb25zZSA9PiB7XG4gICAgICBpZiAocmVzcG9uc2UgJiYgcmVzcG9uc2Uub2JqZWN0KSB7XG4gICAgICAgIHRoaXMuc3RvcmFnZS5maWVsZHNDaGFuZ2VkQnlUcmlnZ2VyID0gXy5yZWR1Y2UoXG4gICAgICAgICAgcmVzcG9uc2Uub2JqZWN0LFxuICAgICAgICAgIChyZXN1bHQsIHZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgICAgIGlmICghXy5pc0VxdWFsKHRoaXMuZGF0YVtrZXldLCB2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgcmVzdWx0LnB1c2goa2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBbXVxuICAgICAgICApO1xuICAgICAgICB0aGlzLmRhdGEgPSByZXNwb25zZS5vYmplY3Q7XG4gICAgICAgIC8vIFdlIHNob3VsZCBkZWxldGUgdGhlIG9iamVjdElkIGZvciBhbiB1cGRhdGUgd3JpdGVcbiAgICAgICAgaWYgKHRoaXMucXVlcnkgJiYgdGhpcy5xdWVyeS5vYmplY3RJZCkge1xuICAgICAgICAgIGRlbGV0ZSB0aGlzLmRhdGEub2JqZWN0SWQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuY2hlY2tQcm9oaWJpdGVkS2V5d29yZHModGhpcy5kYXRhKTtcbiAgICB9KTtcbn07XG5cblJlc3RXcml0ZS5wcm90b3R5cGUucnVuQmVmb3JlTG9naW5UcmlnZ2VyID0gYXN5bmMgZnVuY3Rpb24gKHVzZXJEYXRhKSB7XG4gIC8vIEF2b2lkIGRvaW5nIGFueSBzZXR1cCBmb3IgdHJpZ2dlcnMgaWYgdGhlcmUgaXMgbm8gJ2JlZm9yZUxvZ2luJyB0cmlnZ2VyXG4gIGlmIChcbiAgICAhdHJpZ2dlcnMudHJpZ2dlckV4aXN0cyh0aGlzLmNsYXNzTmFtZSwgdHJpZ2dlcnMuVHlwZXMuYmVmb3JlTG9naW4sIHRoaXMuY29uZmlnLmFwcGxpY2F0aW9uSWQpXG4gICkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIENsb3VkIGNvZGUgZ2V0cyBhIGJpdCBvZiBleHRyYSBkYXRhIGZvciBpdHMgb2JqZWN0c1xuICBjb25zdCBleHRyYURhdGEgPSB7IGNsYXNzTmFtZTogdGhpcy5jbGFzc05hbWUgfTtcblxuICAvLyBFeHBhbmQgZmlsZSBvYmplY3RzXG4gIHRoaXMuY29uZmlnLmZpbGVzQ29udHJvbGxlci5leHBhbmRGaWxlc0luT2JqZWN0KHRoaXMuY29uZmlnLCB1c2VyRGF0YSk7XG5cbiAgY29uc3QgdXNlciA9IHRyaWdnZXJzLmluZmxhdGUoZXh0cmFEYXRhLCB1c2VyRGF0YSk7XG5cbiAgLy8gbm8gbmVlZCB0byByZXR1cm4gYSByZXNwb25zZVxuICBhd2FpdCB0cmlnZ2Vycy5tYXliZVJ1blRyaWdnZXIoXG4gICAgdHJpZ2dlcnMuVHlwZXMuYmVmb3JlTG9naW4sXG4gICAgdGhpcy5hdXRoLFxuICAgIHVzZXIsXG4gICAgbnVsbCxcbiAgICB0aGlzLmNvbmZpZyxcbiAgICB0aGlzLmNvbnRleHRcbiAgKTtcbn07XG5cblJlc3RXcml0ZS5wcm90b3R5cGUuc2V0UmVxdWlyZWRGaWVsZHNJZk5lZWRlZCA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKHRoaXMuZGF0YSkge1xuICAgIHJldHVybiB0aGlzLnZhbGlkU2NoZW1hQ29udHJvbGxlci5nZXRBbGxDbGFzc2VzKCkudGhlbihhbGxDbGFzc2VzID0+IHtcbiAgICAgIGNvbnN0IHNjaGVtYSA9IGFsbENsYXNzZXMuZmluZChvbmVDbGFzcyA9PiBvbmVDbGFzcy5jbGFzc05hbWUgPT09IHRoaXMuY2xhc3NOYW1lKTtcbiAgICAgIGNvbnN0IHNldFJlcXVpcmVkRmllbGRJZk5lZWRlZCA9IChmaWVsZE5hbWUsIHNldERlZmF1bHQpID0+IHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRoaXMuZGF0YVtmaWVsZE5hbWVdID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICB0aGlzLmRhdGFbZmllbGROYW1lXSA9PT0gbnVsbCB8fFxuICAgICAgICAgIHRoaXMuZGF0YVtmaWVsZE5hbWVdID09PSAnJyB8fFxuICAgICAgICAgICh0eXBlb2YgdGhpcy5kYXRhW2ZpZWxkTmFtZV0gPT09ICdvYmplY3QnICYmIHRoaXMuZGF0YVtmaWVsZE5hbWVdLl9fb3AgPT09ICdEZWxldGUnKVxuICAgICAgICApIHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBzZXREZWZhdWx0ICYmXG4gICAgICAgICAgICBzY2hlbWEuZmllbGRzW2ZpZWxkTmFtZV0gJiZcbiAgICAgICAgICAgIHNjaGVtYS5maWVsZHNbZmllbGROYW1lXS5kZWZhdWx0VmFsdWUgIT09IG51bGwgJiZcbiAgICAgICAgICAgIHNjaGVtYS5maWVsZHNbZmllbGROYW1lXS5kZWZhdWx0VmFsdWUgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgKHRoaXMuZGF0YVtmaWVsZE5hbWVdID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgICAgKHR5cGVvZiB0aGlzLmRhdGFbZmllbGROYW1lXSA9PT0gJ29iamVjdCcgJiYgdGhpcy5kYXRhW2ZpZWxkTmFtZV0uX19vcCA9PT0gJ0RlbGV0ZScpKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgdGhpcy5kYXRhW2ZpZWxkTmFtZV0gPSBzY2hlbWEuZmllbGRzW2ZpZWxkTmFtZV0uZGVmYXVsdFZhbHVlO1xuICAgICAgICAgICAgdGhpcy5zdG9yYWdlLmZpZWxkc0NoYW5nZWRCeVRyaWdnZXIgPSB0aGlzLnN0b3JhZ2UuZmllbGRzQ2hhbmdlZEJ5VHJpZ2dlciB8fCBbXTtcbiAgICAgICAgICAgIGlmICh0aGlzLnN0b3JhZ2UuZmllbGRzQ2hhbmdlZEJ5VHJpZ2dlci5pbmRleE9mKGZpZWxkTmFtZSkgPCAwKSB7XG4gICAgICAgICAgICAgIHRoaXMuc3RvcmFnZS5maWVsZHNDaGFuZ2VkQnlUcmlnZ2VyLnB1c2goZmllbGROYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKHNjaGVtYS5maWVsZHNbZmllbGROYW1lXSAmJiBzY2hlbWEuZmllbGRzW2ZpZWxkTmFtZV0ucmVxdWlyZWQgPT09IHRydWUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5WQUxJREFUSU9OX0VSUk9SLCBgJHtmaWVsZE5hbWV9IGlzIHJlcXVpcmVkYCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICAvLyBBZGQgZGVmYXVsdCBmaWVsZHNcbiAgICAgIHRoaXMuZGF0YS51cGRhdGVkQXQgPSB0aGlzLnVwZGF0ZWRBdDtcbiAgICAgIGlmICghdGhpcy5xdWVyeSkge1xuICAgICAgICB0aGlzLmRhdGEuY3JlYXRlZEF0ID0gdGhpcy51cGRhdGVkQXQ7XG5cbiAgICAgICAgLy8gT25seSBhc3NpZ24gbmV3IG9iamVjdElkIGlmIHdlIGFyZSBjcmVhdGluZyBuZXcgb2JqZWN0XG4gICAgICAgIGlmICghdGhpcy5kYXRhLm9iamVjdElkKSB7XG4gICAgICAgICAgdGhpcy5kYXRhLm9iamVjdElkID0gY3J5cHRvVXRpbHMubmV3T2JqZWN0SWQodGhpcy5jb25maWcub2JqZWN0SWRTaXplKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2NoZW1hKSB7XG4gICAgICAgICAgT2JqZWN0LmtleXMoc2NoZW1hLmZpZWxkcykuZm9yRWFjaChmaWVsZE5hbWUgPT4ge1xuICAgICAgICAgICAgc2V0UmVxdWlyZWRGaWVsZElmTmVlZGVkKGZpZWxkTmFtZSwgdHJ1ZSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoc2NoZW1hKSB7XG4gICAgICAgIE9iamVjdC5rZXlzKHRoaXMuZGF0YSkuZm9yRWFjaChmaWVsZE5hbWUgPT4ge1xuICAgICAgICAgIHNldFJlcXVpcmVkRmllbGRJZk5lZWRlZChmaWVsZE5hbWUsIGZhbHNlKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xufTtcblxuLy8gVHJhbnNmb3JtcyBhdXRoIGRhdGEgZm9yIGEgdXNlciBvYmplY3QuXG4vLyBEb2VzIG5vdGhpbmcgaWYgdGhpcyBpc24ndCBhIHVzZXIgb2JqZWN0LlxuLy8gUmV0dXJucyBhIHByb21pc2UgZm9yIHdoZW4gd2UncmUgZG9uZSBpZiBpdCBjYW4ndCBmaW5pc2ggdGhpcyB0aWNrLlxuUmVzdFdyaXRlLnByb3RvdHlwZS52YWxpZGF0ZUF1dGhEYXRhID0gZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy5jbGFzc05hbWUgIT09ICdfVXNlcicpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBhdXRoRGF0YSA9IHRoaXMuZGF0YS5hdXRoRGF0YTtcbiAgY29uc3QgaGFzVXNlcm5hbWVBbmRQYXNzd29yZCA9XG4gICAgdHlwZW9mIHRoaXMuZGF0YS51c2VybmFtZSA9PT0gJ3N0cmluZycgJiYgdHlwZW9mIHRoaXMuZGF0YS5wYXNzd29yZCA9PT0gJ3N0cmluZyc7XG5cbiAgaWYgKCF0aGlzLnF1ZXJ5ICYmICFhdXRoRGF0YSkge1xuICAgIGlmICh0eXBlb2YgdGhpcy5kYXRhLnVzZXJuYW1lICE9PSAnc3RyaW5nJyB8fCBfLmlzRW1wdHkodGhpcy5kYXRhLnVzZXJuYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLlVTRVJOQU1FX01JU1NJTkcsICdiYWQgb3IgbWlzc2luZyB1c2VybmFtZScpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHRoaXMuZGF0YS5wYXNzd29yZCAhPT0gJ3N0cmluZycgfHwgXy5pc0VtcHR5KHRoaXMuZGF0YS5wYXNzd29yZCkpIHtcbiAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5QQVNTV09SRF9NSVNTSU5HLCAncGFzc3dvcmQgaXMgcmVxdWlyZWQnKTtcbiAgICB9XG4gIH1cblxuICBpZiAoXG4gICAgKGF1dGhEYXRhICYmICFPYmplY3Qua2V5cyhhdXRoRGF0YSkubGVuZ3RoKSB8fFxuICAgICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGhpcy5kYXRhLCAnYXV0aERhdGEnKVxuICApIHtcbiAgICAvLyBOb3RoaW5nIHRvIHZhbGlkYXRlIGhlcmVcbiAgICByZXR1cm47XG4gIH0gZWxzZSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMuZGF0YSwgJ2F1dGhEYXRhJykgJiYgIXRoaXMuZGF0YS5hdXRoRGF0YSkge1xuICAgIC8vIEhhbmRsZSBzYXZpbmcgYXV0aERhdGEgdG8gbnVsbFxuICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihcbiAgICAgIFBhcnNlLkVycm9yLlVOU1VQUE9SVEVEX1NFUlZJQ0UsXG4gICAgICAnVGhpcyBhdXRoZW50aWNhdGlvbiBtZXRob2QgaXMgdW5zdXBwb3J0ZWQuJ1xuICAgICk7XG4gIH1cblxuICB2YXIgcHJvdmlkZXJzID0gT2JqZWN0LmtleXMoYXV0aERhdGEpO1xuICBpZiAocHJvdmlkZXJzLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBjYW5IYW5kbGVBdXRoRGF0YSA9IHByb3ZpZGVycy5zb21lKHByb3ZpZGVyID0+IHtcbiAgICAgIHZhciBwcm92aWRlckF1dGhEYXRhID0gYXV0aERhdGFbcHJvdmlkZXJdO1xuICAgICAgdmFyIGhhc1Rva2VuID0gcHJvdmlkZXJBdXRoRGF0YSAmJiBwcm92aWRlckF1dGhEYXRhLmlkO1xuICAgICAgcmV0dXJuIGhhc1Rva2VuIHx8IHByb3ZpZGVyQXV0aERhdGEgPT09IG51bGw7XG4gICAgfSk7XG4gICAgaWYgKGNhbkhhbmRsZUF1dGhEYXRhIHx8IGhhc1VzZXJuYW1lQW5kUGFzc3dvcmQgfHwgdGhpcy5hdXRoLmlzTWFzdGVyIHx8IHRoaXMuZ2V0VXNlcklkKCkpIHtcbiAgICAgIHJldHVybiB0aGlzLmhhbmRsZUF1dGhEYXRhKGF1dGhEYXRhKTtcbiAgICB9XG4gIH1cbiAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFxuICAgIFBhcnNlLkVycm9yLlVOU1VQUE9SVEVEX1NFUlZJQ0UsXG4gICAgJ1RoaXMgYXV0aGVudGljYXRpb24gbWV0aG9kIGlzIHVuc3VwcG9ydGVkLidcbiAgKTtcbn07XG5cblJlc3RXcml0ZS5wcm90b3R5cGUuZmlsdGVyZWRPYmplY3RzQnlBQ0wgPSBmdW5jdGlvbiAob2JqZWN0cykge1xuICBpZiAodGhpcy5hdXRoLmlzTWFzdGVyKSB7XG4gICAgcmV0dXJuIG9iamVjdHM7XG4gIH1cbiAgcmV0dXJuIG9iamVjdHMuZmlsdGVyKG9iamVjdCA9PiB7XG4gICAgaWYgKCFvYmplY3QuQUNMKSB7XG4gICAgICByZXR1cm4gdHJ1ZTsgLy8gbGVnYWN5IHVzZXJzIHRoYXQgaGF2ZSBubyBBQ0wgZmllbGQgb24gdGhlbVxuICAgIH1cbiAgICAvLyBSZWd1bGFyIHVzZXJzIHRoYXQgaGF2ZSBiZWVuIGxvY2tlZCBvdXQuXG4gICAgcmV0dXJuIG9iamVjdC5BQ0wgJiYgT2JqZWN0LmtleXMob2JqZWN0LkFDTCkubGVuZ3RoID4gMDtcbiAgfSk7XG59O1xuXG5SZXN0V3JpdGUucHJvdG90eXBlLmdldFVzZXJJZCA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKHRoaXMucXVlcnkgJiYgdGhpcy5xdWVyeS5vYmplY3RJZCAmJiB0aGlzLmNsYXNzTmFtZSA9PT0gJ19Vc2VyJykge1xuICAgIHJldHVybiB0aGlzLnF1ZXJ5Lm9iamVjdElkO1xuICB9IGVsc2UgaWYgKHRoaXMuYXV0aCAmJiB0aGlzLmF1dGgudXNlciAmJiB0aGlzLmF1dGgudXNlci5pZCkge1xuICAgIHJldHVybiB0aGlzLmF1dGgudXNlci5pZDtcbiAgfVxufTtcblxuLy8gRGV2ZWxvcGVycyBhcmUgYWxsb3dlZCB0byBjaGFuZ2UgYXV0aERhdGEgdmlhIGJlZm9yZSBzYXZlIHRyaWdnZXJcbi8vIHdlIG5lZWQgYWZ0ZXIgYmVmb3JlIHNhdmUgdG8gZW5zdXJlIHRoYXQgdGhlIGRldmVsb3BlclxuLy8gaXMgbm90IGN1cnJlbnRseSBkdXBsaWNhdGluZyBhdXRoIGRhdGEgSURcblJlc3RXcml0ZS5wcm90b3R5cGUuZW5zdXJlVW5pcXVlQXV0aERhdGFJZCA9IGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgaWYgKHRoaXMuY2xhc3NOYW1lICE9PSAnX1VzZXInIHx8ICF0aGlzLmRhdGEuYXV0aERhdGEpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBoYXNBdXRoRGF0YUlkID0gT2JqZWN0LmtleXModGhpcy5kYXRhLmF1dGhEYXRhKS5zb21lKFxuICAgIGtleSA9PiB0aGlzLmRhdGEuYXV0aERhdGFba2V5XSAmJiB0aGlzLmRhdGEuYXV0aERhdGFba2V5XS5pZFxuICApO1xuXG4gIGlmICghaGFzQXV0aERhdGFJZCkgcmV0dXJuO1xuXG4gIGNvbnN0IHIgPSBhd2FpdCBBdXRoLmZpbmRVc2Vyc1dpdGhBdXRoRGF0YSh0aGlzLmNvbmZpZywgdGhpcy5kYXRhLmF1dGhEYXRhKTtcbiAgY29uc3QgcmVzdWx0cyA9IHRoaXMuZmlsdGVyZWRPYmplY3RzQnlBQ0wocik7XG4gIGlmIChyZXN1bHRzLmxlbmd0aCA+IDEpIHtcbiAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuQUNDT1VOVF9BTFJFQURZX0xJTktFRCwgJ3RoaXMgYXV0aCBpcyBhbHJlYWR5IHVzZWQnKTtcbiAgfVxuICAvLyB1c2UgZGF0YS5vYmplY3RJZCBpbiBjYXNlIG9mIGxvZ2luIHRpbWUgYW5kIGZvdW5kIHVzZXIgZHVyaW5nIGhhbmRsZSB2YWxpZGF0ZUF1dGhEYXRhXG4gIGNvbnN0IHVzZXJJZCA9IHRoaXMuZ2V0VXNlcklkKCkgfHwgdGhpcy5kYXRhLm9iamVjdElkO1xuICBpZiAocmVzdWx0cy5sZW5ndGggPT09IDEgJiYgdXNlcklkICE9PSByZXN1bHRzWzBdLm9iamVjdElkKSB7XG4gICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLkFDQ09VTlRfQUxSRUFEWV9MSU5LRUQsICd0aGlzIGF1dGggaXMgYWxyZWFkeSB1c2VkJyk7XG4gIH1cbn07XG5cblJlc3RXcml0ZS5wcm90b3R5cGUuaGFuZGxlQXV0aERhdGEgPSBhc3luYyBmdW5jdGlvbiAoYXV0aERhdGEpIHtcbiAgY29uc3QgciA9IGF3YWl0IEF1dGguZmluZFVzZXJzV2l0aEF1dGhEYXRhKHRoaXMuY29uZmlnLCBhdXRoRGF0YSk7XG4gIGNvbnN0IHJlc3VsdHMgPSB0aGlzLmZpbHRlcmVkT2JqZWN0c0J5QUNMKHIpO1xuXG4gIGlmIChyZXN1bHRzLmxlbmd0aCA+IDEpIHtcbiAgICAvLyBUbyBhdm9pZCBodHRwczovL2dpdGh1Yi5jb20vcGFyc2UtY29tbXVuaXR5L3BhcnNlLXNlcnZlci9zZWN1cml0eS9hZHZpc29yaWVzL0dIU0EtOHczai1nOTgzLThqaDVcbiAgICAvLyBMZXQncyBydW4gc29tZSB2YWxpZGF0aW9uIGJlZm9yZSB0aHJvd2luZ1xuICAgIGF3YWl0IEF1dGguaGFuZGxlQXV0aERhdGFWYWxpZGF0aW9uKGF1dGhEYXRhLCB0aGlzLCByZXN1bHRzWzBdKTtcbiAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuQUNDT1VOVF9BTFJFQURZX0xJTktFRCwgJ3RoaXMgYXV0aCBpcyBhbHJlYWR5IHVzZWQnKTtcbiAgfVxuXG4gIC8vIE5vIHVzZXIgZm91bmQgd2l0aCBwcm92aWRlZCBhdXRoRGF0YSB3ZSBuZWVkIHRvIHZhbGlkYXRlXG4gIGlmICghcmVzdWx0cy5sZW5ndGgpIHtcbiAgICBjb25zdCB7IGF1dGhEYXRhOiB2YWxpZGF0ZWRBdXRoRGF0YSwgYXV0aERhdGFSZXNwb25zZSB9ID0gYXdhaXQgQXV0aC5oYW5kbGVBdXRoRGF0YVZhbGlkYXRpb24oXG4gICAgICBhdXRoRGF0YSxcbiAgICAgIHRoaXNcbiAgICApO1xuICAgIHRoaXMuYXV0aERhdGFSZXNwb25zZSA9IGF1dGhEYXRhUmVzcG9uc2U7XG4gICAgLy8gUmVwbGFjZSBjdXJyZW50IGF1dGhEYXRhIGJ5IHRoZSBuZXcgdmFsaWRhdGVkIG9uZVxuICAgIHRoaXMuZGF0YS5hdXRoRGF0YSA9IHZhbGlkYXRlZEF1dGhEYXRhO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIFVzZXIgZm91bmQgd2l0aCBwcm92aWRlZCBhdXRoRGF0YVxuICBpZiAocmVzdWx0cy5sZW5ndGggPT09IDEpIHtcbiAgICBjb25zdCB1c2VySWQgPSB0aGlzLmdldFVzZXJJZCgpO1xuICAgIGNvbnN0IHVzZXJSZXN1bHQgPSByZXN1bHRzWzBdO1xuICAgIC8vIFByZXZlbnQgZHVwbGljYXRlIGF1dGhEYXRhIGlkXG4gICAgaWYgKHVzZXJJZCAmJiB1c2VySWQgIT09IHVzZXJSZXN1bHQub2JqZWN0SWQpIHtcbiAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5BQ0NPVU5UX0FMUkVBRFlfTElOS0VELCAndGhpcyBhdXRoIGlzIGFscmVhZHkgdXNlZCcpO1xuICAgIH1cblxuICAgIHRoaXMuc3RvcmFnZS5hdXRoUHJvdmlkZXIgPSBPYmplY3Qua2V5cyhhdXRoRGF0YSkuam9pbignLCcpO1xuXG4gICAgY29uc3QgeyBoYXNNdXRhdGVkQXV0aERhdGEsIG11dGF0ZWRBdXRoRGF0YSB9ID0gQXV0aC5oYXNNdXRhdGVkQXV0aERhdGEoXG4gICAgICBhdXRoRGF0YSxcbiAgICAgIHVzZXJSZXN1bHQuYXV0aERhdGFcbiAgICApO1xuXG4gICAgY29uc3QgaXNDdXJyZW50VXNlckxvZ2dlZE9yTWFzdGVyID1cbiAgICAgICh0aGlzLmF1dGggJiYgdGhpcy5hdXRoLnVzZXIgJiYgdGhpcy5hdXRoLnVzZXIuaWQgPT09IHVzZXJSZXN1bHQub2JqZWN0SWQpIHx8XG4gICAgICB0aGlzLmF1dGguaXNNYXN0ZXI7XG5cbiAgICBjb25zdCBpc0xvZ2luID0gIXVzZXJJZDtcblxuICAgIGlmIChpc0xvZ2luIHx8IGlzQ3VycmVudFVzZXJMb2dnZWRPck1hc3Rlcikge1xuICAgICAgLy8gbm8gdXNlciBtYWtpbmcgdGhlIGNhbGxcbiAgICAgIC8vIE9SIHRoZSB1c2VyIG1ha2luZyB0aGUgY2FsbCBpcyB0aGUgcmlnaHQgb25lXG4gICAgICAvLyBMb2dpbiB3aXRoIGF1dGggZGF0YVxuICAgICAgZGVsZXRlIHJlc3VsdHNbMF0ucGFzc3dvcmQ7XG5cbiAgICAgIC8vIG5lZWQgdG8gc2V0IHRoZSBvYmplY3RJZCBmaXJzdCBvdGhlcndpc2UgbG9jYXRpb24gaGFzIHRyYWlsaW5nIHVuZGVmaW5lZFxuICAgICAgdGhpcy5kYXRhLm9iamVjdElkID0gdXNlclJlc3VsdC5vYmplY3RJZDtcblxuICAgICAgaWYgKCF0aGlzLnF1ZXJ5IHx8ICF0aGlzLnF1ZXJ5Lm9iamVjdElkKSB7XG4gICAgICAgIHRoaXMucmVzcG9uc2UgPSB7XG4gICAgICAgICAgcmVzcG9uc2U6IHVzZXJSZXN1bHQsXG4gICAgICAgICAgbG9jYXRpb246IHRoaXMubG9jYXRpb24oKSxcbiAgICAgICAgfTtcbiAgICAgICAgLy8gUnVuIGJlZm9yZUxvZ2luIGhvb2sgYmVmb3JlIHN0b3JpbmcgYW55IHVwZGF0ZXNcbiAgICAgICAgLy8gdG8gYXV0aERhdGEgb24gdGhlIGRiOyBjaGFuZ2VzIHRvIHVzZXJSZXN1bHRcbiAgICAgICAgLy8gd2lsbCBiZSBpZ25vcmVkLlxuICAgICAgICBhd2FpdCB0aGlzLnJ1bkJlZm9yZUxvZ2luVHJpZ2dlcihkZWVwY29weSh1c2VyUmVzdWx0KSk7XG5cbiAgICAgICAgLy8gSWYgd2UgYXJlIGluIGxvZ2luIG9wZXJhdGlvbiB2aWEgYXV0aERhdGFcbiAgICAgICAgLy8gd2UgbmVlZCB0byBiZSBzdXJlIHRoYXQgdGhlIHVzZXIgaGFzIHByb3ZpZGVkXG4gICAgICAgIC8vIHJlcXVpcmVkIGF1dGhEYXRhXG4gICAgICAgIEF1dGguY2hlY2tJZlVzZXJIYXNQcm92aWRlZENvbmZpZ3VyZWRQcm92aWRlcnNGb3JMb2dpbihcbiAgICAgICAgICBhdXRoRGF0YSxcbiAgICAgICAgICB1c2VyUmVzdWx0LmF1dGhEYXRhLFxuICAgICAgICAgIHRoaXMuY29uZmlnXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIFByZXZlbnQgdmFsaWRhdGluZyBpZiBubyBtdXRhdGVkIGRhdGEgZGV0ZWN0ZWQgb24gdXBkYXRlXG4gICAgICBpZiAoIWhhc011dGF0ZWRBdXRoRGF0YSAmJiBpc0N1cnJlbnRVc2VyTG9nZ2VkT3JNYXN0ZXIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBGb3JjZSB0byB2YWxpZGF0ZSBhbGwgcHJvdmlkZWQgYXV0aERhdGEgb24gbG9naW5cbiAgICAgIC8vIG9uIHVwZGF0ZSBvbmx5IHZhbGlkYXRlIG11dGF0ZWQgb25lc1xuICAgICAgaWYgKGhhc011dGF0ZWRBdXRoRGF0YSB8fCAhdGhpcy5jb25maWcuYWxsb3dFeHBpcmVkQXV0aERhdGFUb2tlbikge1xuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBBdXRoLmhhbmRsZUF1dGhEYXRhVmFsaWRhdGlvbihcbiAgICAgICAgICBpc0xvZ2luID8gYXV0aERhdGEgOiBtdXRhdGVkQXV0aERhdGEsXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICB1c2VyUmVzdWx0XG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuZGF0YS5hdXRoRGF0YSA9IHJlcy5hdXRoRGF0YTtcbiAgICAgICAgdGhpcy5hdXRoRGF0YVJlc3BvbnNlID0gcmVzLmF1dGhEYXRhUmVzcG9uc2U7XG4gICAgICB9XG5cbiAgICAgIC8vIElGIHdlIGFyZSBpbiBsb2dpbiB3ZSdsbCBza2lwIHRoZSBkYXRhYmFzZSBvcGVyYXRpb24gLyBiZWZvcmVTYXZlIC8gYWZ0ZXJTYXZlIGV0Yy4uLlxuICAgICAgLy8gd2UgbmVlZCB0byBzZXQgaXQgdXAgdGhlcmUuXG4gICAgICAvLyBXZSBhcmUgc3VwcG9zZWQgdG8gaGF2ZSBhIHJlc3BvbnNlIG9ubHkgb24gTE9HSU4gd2l0aCBhdXRoRGF0YSwgc28gd2Ugc2tpcCB0aG9zZVxuICAgICAgLy8gSWYgd2UncmUgbm90IGxvZ2dpbmcgaW4sIGJ1dCBqdXN0IHVwZGF0aW5nIHRoZSBjdXJyZW50IHVzZXIsIHdlIGNhbiBzYWZlbHkgc2tpcCB0aGF0IHBhcnRcbiAgICAgIGlmICh0aGlzLnJlc3BvbnNlKSB7XG4gICAgICAgIC8vIEFzc2lnbiB0aGUgbmV3IGF1dGhEYXRhIGluIHRoZSByZXNwb25zZVxuICAgICAgICBPYmplY3Qua2V5cyhtdXRhdGVkQXV0aERhdGEpLmZvckVhY2gocHJvdmlkZXIgPT4ge1xuICAgICAgICAgIHRoaXMucmVzcG9uc2UucmVzcG9uc2UuYXV0aERhdGFbcHJvdmlkZXJdID0gbXV0YXRlZEF1dGhEYXRhW3Byb3ZpZGVyXTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gUnVuIHRoZSBEQiB1cGRhdGUgZGlyZWN0bHksIGFzICdtYXN0ZXInIG9ubHkgaWYgYXV0aERhdGEgY29udGFpbnMgc29tZSBrZXlzXG4gICAgICAgIC8vIGF1dGhEYXRhIGNvdWxkIG5vdCBjb250YWlucyBrZXlzIGFmdGVyIHZhbGlkYXRpb24gaWYgdGhlIGF1dGhBZGFwdGVyXG4gICAgICAgIC8vIHVzZXMgdGhlIGBkb05vdFNhdmVgIG9wdGlvbi4gSnVzdCB1cGRhdGUgdGhlIGF1dGhEYXRhIHBhcnRcbiAgICAgICAgLy8gVGhlbiB3ZSdyZSBnb29kIGZvciB0aGUgdXNlciwgZWFybHkgZXhpdCBvZiBzb3J0c1xuICAgICAgICBpZiAoT2JqZWN0LmtleXModGhpcy5kYXRhLmF1dGhEYXRhKS5sZW5ndGgpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLmNvbmZpZy5kYXRhYmFzZS51cGRhdGUoXG4gICAgICAgICAgICB0aGlzLmNsYXNzTmFtZSxcbiAgICAgICAgICAgIHsgb2JqZWN0SWQ6IHRoaXMuZGF0YS5vYmplY3RJZCB9LFxuICAgICAgICAgICAgeyBhdXRoRGF0YTogdGhpcy5kYXRhLmF1dGhEYXRhIH0sXG4gICAgICAgICAgICB7fVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn07XG5cbi8vIFRoZSBub24tdGhpcmQtcGFydHkgcGFydHMgb2YgVXNlciB0cmFuc2Zvcm1hdGlvblxuUmVzdFdyaXRlLnByb3RvdHlwZS50cmFuc2Zvcm1Vc2VyID0gZnVuY3Rpb24gKCkge1xuICB2YXIgcHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZSgpO1xuICBpZiAodGhpcy5jbGFzc05hbWUgIT09ICdfVXNlcicpIHtcbiAgICByZXR1cm4gcHJvbWlzZTtcbiAgfVxuXG4gIGlmICghdGhpcy5hdXRoLmlzTWFzdGVyICYmICdlbWFpbFZlcmlmaWVkJyBpbiB0aGlzLmRhdGEpIHtcbiAgICBjb25zdCBlcnJvciA9IGBDbGllbnRzIGFyZW4ndCBhbGxvd2VkIHRvIG1hbnVhbGx5IHVwZGF0ZSBlbWFpbCB2ZXJpZmljYXRpb24uYDtcbiAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuT1BFUkFUSU9OX0ZPUkJJRERFTiwgZXJyb3IpO1xuICB9XG5cbiAgLy8gRG8gbm90IGNsZWFudXAgc2Vzc2lvbiBpZiBvYmplY3RJZCBpcyBub3Qgc2V0XG4gIGlmICh0aGlzLnF1ZXJ5ICYmIHRoaXMub2JqZWN0SWQoKSkge1xuICAgIC8vIElmIHdlJ3JlIHVwZGF0aW5nIGEgX1VzZXIgb2JqZWN0LCB3ZSBuZWVkIHRvIGNsZWFyIG91dCB0aGUgY2FjaGUgZm9yIHRoYXQgdXNlci4gRmluZCBhbGwgdGhlaXJcbiAgICAvLyBzZXNzaW9uIHRva2VucywgYW5kIHJlbW92ZSB0aGVtIGZyb20gdGhlIGNhY2hlLlxuICAgIHByb21pc2UgPSBuZXcgUmVzdFF1ZXJ5KHRoaXMuY29uZmlnLCBBdXRoLm1hc3Rlcih0aGlzLmNvbmZpZyksICdfU2Vzc2lvbicsIHtcbiAgICAgIHVzZXI6IHtcbiAgICAgICAgX190eXBlOiAnUG9pbnRlcicsXG4gICAgICAgIGNsYXNzTmFtZTogJ19Vc2VyJyxcbiAgICAgICAgb2JqZWN0SWQ6IHRoaXMub2JqZWN0SWQoKSxcbiAgICAgIH0sXG4gICAgfSlcbiAgICAgIC5leGVjdXRlKClcbiAgICAgIC50aGVuKHJlc3VsdHMgPT4ge1xuICAgICAgICByZXN1bHRzLnJlc3VsdHMuZm9yRWFjaChzZXNzaW9uID0+XG4gICAgICAgICAgdGhpcy5jb25maWcuY2FjaGVDb250cm9sbGVyLnVzZXIuZGVsKHNlc3Npb24uc2Vzc2lvblRva2VuKVxuICAgICAgICApO1xuICAgICAgfSk7XG4gIH1cblxuICByZXR1cm4gcHJvbWlzZVxuICAgIC50aGVuKCgpID0+IHtcbiAgICAgIC8vIFRyYW5zZm9ybSB0aGUgcGFzc3dvcmRcbiAgICAgIGlmICh0aGlzLmRhdGEucGFzc3dvcmQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyBpZ25vcmUgb25seSBpZiB1bmRlZmluZWQuIHNob3VsZCBwcm9jZWVkIGlmIGVtcHR5ICgnJylcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5xdWVyeSkge1xuICAgICAgICB0aGlzLnN0b3JhZ2VbJ2NsZWFyU2Vzc2lvbnMnXSA9IHRydWU7XG4gICAgICAgIC8vIEdlbmVyYXRlIGEgbmV3IHNlc3Npb24gb25seSBpZiB0aGUgdXNlciByZXF1ZXN0ZWRcbiAgICAgICAgaWYgKCF0aGlzLmF1dGguaXNNYXN0ZXIpIHtcbiAgICAgICAgICB0aGlzLnN0b3JhZ2VbJ2dlbmVyYXRlTmV3U2Vzc2lvbiddID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5fdmFsaWRhdGVQYXNzd29yZFBvbGljeSgpLnRoZW4oKCkgPT4ge1xuICAgICAgICByZXR1cm4gcGFzc3dvcmRDcnlwdG8uaGFzaCh0aGlzLmRhdGEucGFzc3dvcmQpLnRoZW4oaGFzaGVkUGFzc3dvcmQgPT4ge1xuICAgICAgICAgIHRoaXMuZGF0YS5faGFzaGVkX3Bhc3N3b3JkID0gaGFzaGVkUGFzc3dvcmQ7XG4gICAgICAgICAgZGVsZXRlIHRoaXMuZGF0YS5wYXNzd29yZDtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9KVxuICAgIC50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybiB0aGlzLl92YWxpZGF0ZVVzZXJOYW1lKCk7XG4gICAgfSlcbiAgICAudGhlbigoKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5fdmFsaWRhdGVFbWFpbCgpO1xuICAgIH0pO1xufTtcblxuUmVzdFdyaXRlLnByb3RvdHlwZS5fdmFsaWRhdGVVc2VyTmFtZSA9IGZ1bmN0aW9uICgpIHtcbiAgLy8gQ2hlY2sgZm9yIHVzZXJuYW1lIHVuaXF1ZW5lc3NcbiAgaWYgKCF0aGlzLmRhdGEudXNlcm5hbWUpIHtcbiAgICBpZiAoIXRoaXMucXVlcnkpIHtcbiAgICAgIHRoaXMuZGF0YS51c2VybmFtZSA9IGNyeXB0b1V0aWxzLnJhbmRvbVN0cmluZygyNSk7XG4gICAgICB0aGlzLnJlc3BvbnNlU2hvdWxkSGF2ZVVzZXJuYW1lID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICB9XG4gIC8qXG4gICAgVXNlcm5hbWVzIHNob3VsZCBiZSB1bmlxdWUgd2hlbiBjb21wYXJlZCBjYXNlIGluc2Vuc2l0aXZlbHlcblxuICAgIFVzZXJzIHNob3VsZCBiZSBhYmxlIHRvIG1ha2UgY2FzZSBzZW5zaXRpdmUgdXNlcm5hbWVzIGFuZFxuICAgIGxvZ2luIHVzaW5nIHRoZSBjYXNlIHRoZXkgZW50ZXJlZC4gIEkuZS4gJ1Nub29weScgc2hvdWxkIHByZWNsdWRlXG4gICAgJ3Nub29weScgYXMgYSB2YWxpZCB1c2VybmFtZS5cbiAgKi9cbiAgcmV0dXJuIHRoaXMuY29uZmlnLmRhdGFiYXNlXG4gICAgLmZpbmQoXG4gICAgICB0aGlzLmNsYXNzTmFtZSxcbiAgICAgIHtcbiAgICAgICAgdXNlcm5hbWU6IHRoaXMuZGF0YS51c2VybmFtZSxcbiAgICAgICAgb2JqZWN0SWQ6IHsgJG5lOiB0aGlzLm9iamVjdElkKCkgfSxcbiAgICAgIH0sXG4gICAgICB7IGxpbWl0OiAxLCBjYXNlSW5zZW5zaXRpdmU6IHRydWUgfSxcbiAgICAgIHt9LFxuICAgICAgdGhpcy52YWxpZFNjaGVtYUNvbnRyb2xsZXJcbiAgICApXG4gICAgLnRoZW4ocmVzdWx0cyA9PiB7XG4gICAgICBpZiAocmVzdWx0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihcbiAgICAgICAgICBQYXJzZS5FcnJvci5VU0VSTkFNRV9UQUtFTixcbiAgICAgICAgICAnQWNjb3VudCBhbHJlYWR5IGV4aXN0cyBmb3IgdGhpcyB1c2VybmFtZS4nXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfSk7XG59O1xuXG4vKlxuICBBcyB3aXRoIHVzZXJuYW1lcywgUGFyc2Ugc2hvdWxkIG5vdCBhbGxvdyBjYXNlIGluc2Vuc2l0aXZlIGNvbGxpc2lvbnMgb2YgZW1haWwuXG4gIHVubGlrZSB3aXRoIHVzZXJuYW1lcyAod2hpY2ggY2FuIGhhdmUgY2FzZSBpbnNlbnNpdGl2ZSBjb2xsaXNpb25zIGluIHRoZSBjYXNlIG9mXG4gIGF1dGggYWRhcHRlcnMpLCBlbWFpbHMgc2hvdWxkIG5ldmVyIGhhdmUgYSBjYXNlIGluc2Vuc2l0aXZlIGNvbGxpc2lvbi5cblxuICBUaGlzIGJlaGF2aW9yIGNhbiBiZSBlbmZvcmNlZCB0aHJvdWdoIGEgcHJvcGVybHkgY29uZmlndXJlZCBpbmRleCBzZWU6XG4gIGh0dHBzOi8vZG9jcy5tb25nb2RiLmNvbS9tYW51YWwvY29yZS9pbmRleC1jYXNlLWluc2Vuc2l0aXZlLyNjcmVhdGUtYS1jYXNlLWluc2Vuc2l0aXZlLWluZGV4XG4gIHdoaWNoIGNvdWxkIGJlIGltcGxlbWVudGVkIGluc3RlYWQgb2YgdGhpcyBjb2RlIGJhc2VkIHZhbGlkYXRpb24uXG5cbiAgR2l2ZW4gdGhhdCB0aGlzIGxvb2t1cCBzaG91bGQgYmUgYSByZWxhdGl2ZWx5IGxvdyB1c2UgY2FzZSBhbmQgdGhhdCB0aGUgY2FzZSBzZW5zaXRpdmVcbiAgdW5pcXVlIGluZGV4IHdpbGwgYmUgdXNlZCBieSB0aGUgZGIgZm9yIHRoZSBxdWVyeSwgdGhpcyBpcyBhbiBhZGVxdWF0ZSBzb2x1dGlvbi5cbiovXG5SZXN0V3JpdGUucHJvdG90eXBlLl92YWxpZGF0ZUVtYWlsID0gZnVuY3Rpb24gKCkge1xuICBpZiAoIXRoaXMuZGF0YS5lbWFpbCB8fCB0aGlzLmRhdGEuZW1haWwuX19vcCA9PT0gJ0RlbGV0ZScpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIH1cbiAgLy8gVmFsaWRhdGUgYmFzaWMgZW1haWwgYWRkcmVzcyBmb3JtYXRcbiAgaWYgKCF0aGlzLmRhdGEuZW1haWwubWF0Y2goL14uK0AuKyQvKSkge1xuICAgIHJldHVybiBQcm9taXNlLnJlamVjdChcbiAgICAgIG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5JTlZBTElEX0VNQUlMX0FERFJFU1MsICdFbWFpbCBhZGRyZXNzIGZvcm1hdCBpcyBpbnZhbGlkLicpXG4gICAgKTtcbiAgfVxuICAvLyBDYXNlIGluc2Vuc2l0aXZlIG1hdGNoLCBzZWUgbm90ZSBhYm92ZSBmdW5jdGlvbi5cbiAgcmV0dXJuIHRoaXMuY29uZmlnLmRhdGFiYXNlXG4gICAgLmZpbmQoXG4gICAgICB0aGlzLmNsYXNzTmFtZSxcbiAgICAgIHtcbiAgICAgICAgZW1haWw6IHRoaXMuZGF0YS5lbWFpbCxcbiAgICAgICAgb2JqZWN0SWQ6IHsgJG5lOiB0aGlzLm9iamVjdElkKCkgfSxcbiAgICAgIH0sXG4gICAgICB7IGxpbWl0OiAxLCBjYXNlSW5zZW5zaXRpdmU6IHRydWUgfSxcbiAgICAgIHt9LFxuICAgICAgdGhpcy52YWxpZFNjaGVtYUNvbnRyb2xsZXJcbiAgICApXG4gICAgLnRoZW4ocmVzdWx0cyA9PiB7XG4gICAgICBpZiAocmVzdWx0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihcbiAgICAgICAgICBQYXJzZS5FcnJvci5FTUFJTF9UQUtFTixcbiAgICAgICAgICAnQWNjb3VudCBhbHJlYWR5IGV4aXN0cyBmb3IgdGhpcyBlbWFpbCBhZGRyZXNzLidcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgIXRoaXMuZGF0YS5hdXRoRGF0YSB8fFxuICAgICAgICAhT2JqZWN0LmtleXModGhpcy5kYXRhLmF1dGhEYXRhKS5sZW5ndGggfHxcbiAgICAgICAgKE9iamVjdC5rZXlzKHRoaXMuZGF0YS5hdXRoRGF0YSkubGVuZ3RoID09PSAxICYmXG4gICAgICAgICAgT2JqZWN0LmtleXModGhpcy5kYXRhLmF1dGhEYXRhKVswXSA9PT0gJ2Fub255bW91cycpXG4gICAgICApIHtcbiAgICAgICAgLy8gV2UgdXBkYXRlZCB0aGUgZW1haWwsIHNlbmQgYSBuZXcgdmFsaWRhdGlvblxuICAgICAgICB0aGlzLnN0b3JhZ2VbJ3NlbmRWZXJpZmljYXRpb25FbWFpbCddID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5jb25maWcudXNlckNvbnRyb2xsZXIuc2V0RW1haWxWZXJpZnlUb2tlbih0aGlzLmRhdGEpO1xuICAgICAgfVxuICAgIH0pO1xufTtcblxuUmVzdFdyaXRlLnByb3RvdHlwZS5fdmFsaWRhdGVQYXNzd29yZFBvbGljeSA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKCF0aGlzLmNvbmZpZy5wYXNzd29yZFBvbGljeSkgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICByZXR1cm4gdGhpcy5fdmFsaWRhdGVQYXNzd29yZFJlcXVpcmVtZW50cygpLnRoZW4oKCkgPT4ge1xuICAgIHJldHVybiB0aGlzLl92YWxpZGF0ZVBhc3N3b3JkSGlzdG9yeSgpO1xuICB9KTtcbn07XG5cblJlc3RXcml0ZS5wcm90b3R5cGUuX3ZhbGlkYXRlUGFzc3dvcmRSZXF1aXJlbWVudHMgPSBmdW5jdGlvbiAoKSB7XG4gIC8vIGNoZWNrIGlmIHRoZSBwYXNzd29yZCBjb25mb3JtcyB0byB0aGUgZGVmaW5lZCBwYXNzd29yZCBwb2xpY3kgaWYgY29uZmlndXJlZFxuICAvLyBJZiB3ZSBzcGVjaWZpZWQgYSBjdXN0b20gZXJyb3IgaW4gb3VyIGNvbmZpZ3VyYXRpb24gdXNlIGl0LlxuICAvLyBFeGFtcGxlOiBcIlBhc3N3b3JkcyBtdXN0IGluY2x1ZGUgYSBDYXBpdGFsIExldHRlciwgTG93ZXJjYXNlIExldHRlciwgYW5kIGEgbnVtYmVyLlwiXG4gIC8vXG4gIC8vIFRoaXMgaXMgZXNwZWNpYWxseSB1c2VmdWwgb24gdGhlIGdlbmVyaWMgXCJwYXNzd29yZCByZXNldFwiIHBhZ2UsXG4gIC8vIGFzIGl0IGFsbG93cyB0aGUgcHJvZ3JhbW1lciB0byBjb21tdW5pY2F0ZSBzcGVjaWZpYyByZXF1aXJlbWVudHMgaW5zdGVhZCBvZjpcbiAgLy8gYS4gbWFraW5nIHRoZSB1c2VyIGd1ZXNzIHdoYXRzIHdyb25nXG4gIC8vIGIuIG1ha2luZyBhIGN1c3RvbSBwYXNzd29yZCByZXNldCBwYWdlIHRoYXQgc2hvd3MgdGhlIHJlcXVpcmVtZW50c1xuICBjb25zdCBwb2xpY3lFcnJvciA9IHRoaXMuY29uZmlnLnBhc3N3b3JkUG9saWN5LnZhbGlkYXRpb25FcnJvclxuICAgID8gdGhpcy5jb25maWcucGFzc3dvcmRQb2xpY3kudmFsaWRhdGlvbkVycm9yXG4gICAgOiAnUGFzc3dvcmQgZG9lcyBub3QgbWVldCB0aGUgUGFzc3dvcmQgUG9saWN5IHJlcXVpcmVtZW50cy4nO1xuICBjb25zdCBjb250YWluc1VzZXJuYW1lRXJyb3IgPSAnUGFzc3dvcmQgY2Fubm90IGNvbnRhaW4geW91ciB1c2VybmFtZS4nO1xuXG4gIC8vIGNoZWNrIHdoZXRoZXIgdGhlIHBhc3N3b3JkIG1lZXRzIHRoZSBwYXNzd29yZCBzdHJlbmd0aCByZXF1aXJlbWVudHNcbiAgaWYgKFxuICAgICh0aGlzLmNvbmZpZy5wYXNzd29yZFBvbGljeS5wYXR0ZXJuVmFsaWRhdG9yICYmXG4gICAgICAhdGhpcy5jb25maWcucGFzc3dvcmRQb2xpY3kucGF0dGVyblZhbGlkYXRvcih0aGlzLmRhdGEucGFzc3dvcmQpKSB8fFxuICAgICh0aGlzLmNvbmZpZy5wYXNzd29yZFBvbGljeS52YWxpZGF0b3JDYWxsYmFjayAmJlxuICAgICAgIXRoaXMuY29uZmlnLnBhc3N3b3JkUG9saWN5LnZhbGlkYXRvckNhbGxiYWNrKHRoaXMuZGF0YS5wYXNzd29yZCkpXG4gICkge1xuICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuVkFMSURBVElPTl9FUlJPUiwgcG9saWN5RXJyb3IpKTtcbiAgfVxuXG4gIC8vIGNoZWNrIHdoZXRoZXIgcGFzc3dvcmQgY29udGFpbiB1c2VybmFtZVxuICBpZiAodGhpcy5jb25maWcucGFzc3dvcmRQb2xpY3kuZG9Ob3RBbGxvd1VzZXJuYW1lID09PSB0cnVlKSB7XG4gICAgaWYgKHRoaXMuZGF0YS51c2VybmFtZSkge1xuICAgICAgLy8gdXNlcm5hbWUgaXMgbm90IHBhc3NlZCBkdXJpbmcgcGFzc3dvcmQgcmVzZXRcbiAgICAgIGlmICh0aGlzLmRhdGEucGFzc3dvcmQuaW5kZXhPZih0aGlzLmRhdGEudXNlcm5hbWUpID49IDApXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuVkFMSURBVElPTl9FUlJPUiwgY29udGFpbnNVc2VybmFtZUVycm9yKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHJldHJpZXZlIHRoZSBVc2VyIG9iamVjdCB1c2luZyBvYmplY3RJZCBkdXJpbmcgcGFzc3dvcmQgcmVzZXRcbiAgICAgIHJldHVybiB0aGlzLmNvbmZpZy5kYXRhYmFzZS5maW5kKCdfVXNlcicsIHsgb2JqZWN0SWQ6IHRoaXMub2JqZWN0SWQoKSB9KS50aGVuKHJlc3VsdHMgPT4ge1xuICAgICAgICBpZiAocmVzdWx0cy5sZW5ndGggIT0gMSkge1xuICAgICAgICAgIHRocm93IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5kYXRhLnBhc3N3b3JkLmluZGV4T2YocmVzdWx0c1swXS51c2VybmFtZSkgPj0gMClcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoXG4gICAgICAgICAgICBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuVkFMSURBVElPTl9FUlJPUiwgY29udGFpbnNVc2VybmFtZUVycm9yKVxuICAgICAgICAgICk7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG59O1xuXG5SZXN0V3JpdGUucHJvdG90eXBlLl92YWxpZGF0ZVBhc3N3b3JkSGlzdG9yeSA9IGZ1bmN0aW9uICgpIHtcbiAgLy8gY2hlY2sgd2hldGhlciBwYXNzd29yZCBpcyByZXBlYXRpbmcgZnJvbSBzcGVjaWZpZWQgaGlzdG9yeVxuICBpZiAodGhpcy5xdWVyeSAmJiB0aGlzLmNvbmZpZy5wYXNzd29yZFBvbGljeS5tYXhQYXNzd29yZEhpc3RvcnkpIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcuZGF0YWJhc2VcbiAgICAgIC5maW5kKFxuICAgICAgICAnX1VzZXInLFxuICAgICAgICB7IG9iamVjdElkOiB0aGlzLm9iamVjdElkKCkgfSxcbiAgICAgICAgeyBrZXlzOiBbJ19wYXNzd29yZF9oaXN0b3J5JywgJ19oYXNoZWRfcGFzc3dvcmQnXSB9XG4gICAgICApXG4gICAgICAudGhlbihyZXN1bHRzID0+IHtcbiAgICAgICAgaWYgKHJlc3VsdHMubGVuZ3RoICE9IDEpIHtcbiAgICAgICAgICB0aHJvdyB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXNlciA9IHJlc3VsdHNbMF07XG4gICAgICAgIGxldCBvbGRQYXNzd29yZHMgPSBbXTtcbiAgICAgICAgaWYgKHVzZXIuX3Bhc3N3b3JkX2hpc3RvcnkpXG4gICAgICAgICAgb2xkUGFzc3dvcmRzID0gXy50YWtlKFxuICAgICAgICAgICAgdXNlci5fcGFzc3dvcmRfaGlzdG9yeSxcbiAgICAgICAgICAgIHRoaXMuY29uZmlnLnBhc3N3b3JkUG9saWN5Lm1heFBhc3N3b3JkSGlzdG9yeSAtIDFcbiAgICAgICAgICApO1xuICAgICAgICBvbGRQYXNzd29yZHMucHVzaCh1c2VyLnBhc3N3b3JkKTtcbiAgICAgICAgY29uc3QgbmV3UGFzc3dvcmQgPSB0aGlzLmRhdGEucGFzc3dvcmQ7XG4gICAgICAgIC8vIGNvbXBhcmUgdGhlIG5ldyBwYXNzd29yZCBoYXNoIHdpdGggYWxsIG9sZCBwYXNzd29yZCBoYXNoZXNcbiAgICAgICAgY29uc3QgcHJvbWlzZXMgPSBvbGRQYXNzd29yZHMubWFwKGZ1bmN0aW9uIChoYXNoKSB7XG4gICAgICAgICAgcmV0dXJuIHBhc3N3b3JkQ3J5cHRvLmNvbXBhcmUobmV3UGFzc3dvcmQsIGhhc2gpLnRoZW4ocmVzdWx0ID0+IHtcbiAgICAgICAgICAgIGlmIChyZXN1bHQpXG4gICAgICAgICAgICAgIC8vIHJlamVjdCBpZiB0aGVyZSBpcyBhIG1hdGNoXG4gICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdCgnUkVQRUFUX1BBU1NXT1JEJyk7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICAvLyB3YWl0IGZvciBhbGwgY29tcGFyaXNvbnMgdG8gY29tcGxldGVcbiAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKHByb21pc2VzKVxuICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgICAgaWYgKGVyciA9PT0gJ1JFUEVBVF9QQVNTV09SRCcpXG4gICAgICAgICAgICAgIC8vIGEgbWF0Y2ggd2FzIGZvdW5kXG4gICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChcbiAgICAgICAgICAgICAgICBuZXcgUGFyc2UuRXJyb3IoXG4gICAgICAgICAgICAgICAgICBQYXJzZS5FcnJvci5WQUxJREFUSU9OX0VSUk9SLFxuICAgICAgICAgICAgICAgICAgYE5ldyBwYXNzd29yZCBzaG91bGQgbm90IGJlIHRoZSBzYW1lIGFzIGxhc3QgJHt0aGlzLmNvbmZpZy5wYXNzd29yZFBvbGljeS5tYXhQYXNzd29yZEhpc3Rvcnl9IHBhc3N3b3Jkcy5gXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgIH0pO1xuICAgICAgfSk7XG4gIH1cbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xufTtcblxuUmVzdFdyaXRlLnByb3RvdHlwZS5jcmVhdGVTZXNzaW9uVG9rZW5JZk5lZWRlZCA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKHRoaXMuY2xhc3NOYW1lICE9PSAnX1VzZXInKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIC8vIERvbid0IGdlbmVyYXRlIHNlc3Npb24gZm9yIHVwZGF0aW5nIHVzZXIgKHRoaXMucXVlcnkgaXMgc2V0KSB1bmxlc3MgYXV0aERhdGEgZXhpc3RzXG4gIGlmICh0aGlzLnF1ZXJ5ICYmICF0aGlzLmRhdGEuYXV0aERhdGEpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgLy8gRG9uJ3QgZ2VuZXJhdGUgbmV3IHNlc3Npb25Ub2tlbiBpZiBsaW5raW5nIHZpYSBzZXNzaW9uVG9rZW5cbiAgaWYgKHRoaXMuYXV0aC51c2VyICYmIHRoaXMuZGF0YS5hdXRoRGF0YSkge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoXG4gICAgIXRoaXMuc3RvcmFnZS5hdXRoUHJvdmlkZXIgJiYgLy8gc2lnbnVwIGNhbGwsIHdpdGhcbiAgICB0aGlzLmNvbmZpZy5wcmV2ZW50TG9naW5XaXRoVW52ZXJpZmllZEVtYWlsICYmIC8vIG5vIGxvZ2luIHdpdGhvdXQgdmVyaWZpY2F0aW9uXG4gICAgdGhpcy5jb25maWcudmVyaWZ5VXNlckVtYWlsc1xuICApIHtcbiAgICAvLyB2ZXJpZmljYXRpb24gaXMgb25cbiAgICByZXR1cm47IC8vIGRvIG5vdCBjcmVhdGUgdGhlIHNlc3Npb24gdG9rZW4gaW4gdGhhdCBjYXNlIVxuICB9XG4gIHJldHVybiB0aGlzLmNyZWF0ZVNlc3Npb25Ub2tlbigpO1xufTtcblxuUmVzdFdyaXRlLnByb3RvdHlwZS5jcmVhdGVTZXNzaW9uVG9rZW4gPSBhc3luYyBmdW5jdGlvbiAoKSB7XG4gIC8vIGNsb3VkIGluc3RhbGxhdGlvbklkIGZyb20gQ2xvdWQgQ29kZSxcbiAgLy8gbmV2ZXIgY3JlYXRlIHNlc3Npb24gdG9rZW5zIGZyb20gdGhlcmUuXG4gIGlmICh0aGlzLmF1dGguaW5zdGFsbGF0aW9uSWQgJiYgdGhpcy5hdXRoLmluc3RhbGxhdGlvbklkID09PSAnY2xvdWQnKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKHRoaXMuc3RvcmFnZS5hdXRoUHJvdmlkZXIgPT0gbnVsbCAmJiB0aGlzLmRhdGEuYXV0aERhdGEpIHtcbiAgICB0aGlzLnN0b3JhZ2UuYXV0aFByb3ZpZGVyID0gT2JqZWN0LmtleXModGhpcy5kYXRhLmF1dGhEYXRhKS5qb2luKCcsJyk7XG4gIH1cblxuICBjb25zdCB7IHNlc3Npb25EYXRhLCBjcmVhdGVTZXNzaW9uIH0gPSBSZXN0V3JpdGUuY3JlYXRlU2Vzc2lvbih0aGlzLmNvbmZpZywge1xuICAgIHVzZXJJZDogdGhpcy5vYmplY3RJZCgpLFxuICAgIGNyZWF0ZWRXaXRoOiB7XG4gICAgICBhY3Rpb246IHRoaXMuc3RvcmFnZS5hdXRoUHJvdmlkZXIgPyAnbG9naW4nIDogJ3NpZ251cCcsXG4gICAgICBhdXRoUHJvdmlkZXI6IHRoaXMuc3RvcmFnZS5hdXRoUHJvdmlkZXIgfHwgJ3Bhc3N3b3JkJyxcbiAgICB9LFxuICAgIGluc3RhbGxhdGlvbklkOiB0aGlzLmF1dGguaW5zdGFsbGF0aW9uSWQsXG4gIH0pO1xuXG4gIGlmICh0aGlzLnJlc3BvbnNlICYmIHRoaXMucmVzcG9uc2UucmVzcG9uc2UpIHtcbiAgICB0aGlzLnJlc3BvbnNlLnJlc3BvbnNlLnNlc3Npb25Ub2tlbiA9IHNlc3Npb25EYXRhLnNlc3Npb25Ub2tlbjtcbiAgfVxuXG4gIHJldHVybiBjcmVhdGVTZXNzaW9uKCk7XG59O1xuXG5SZXN0V3JpdGUuY3JlYXRlU2Vzc2lvbiA9IGZ1bmN0aW9uIChcbiAgY29uZmlnLFxuICB7IHVzZXJJZCwgY3JlYXRlZFdpdGgsIGluc3RhbGxhdGlvbklkLCBhZGRpdGlvbmFsU2Vzc2lvbkRhdGEgfVxuKSB7XG4gIGNvbnN0IHRva2VuID0gJ3I6JyArIGNyeXB0b1V0aWxzLm5ld1Rva2VuKCk7XG4gIGNvbnN0IGV4cGlyZXNBdCA9IGNvbmZpZy5nZW5lcmF0ZVNlc3Npb25FeHBpcmVzQXQoKTtcbiAgY29uc3Qgc2Vzc2lvbkRhdGEgPSB7XG4gICAgc2Vzc2lvblRva2VuOiB0b2tlbixcbiAgICB1c2VyOiB7XG4gICAgICBfX3R5cGU6ICdQb2ludGVyJyxcbiAgICAgIGNsYXNzTmFtZTogJ19Vc2VyJyxcbiAgICAgIG9iamVjdElkOiB1c2VySWQsXG4gICAgfSxcbiAgICBjcmVhdGVkV2l0aCxcbiAgICBleHBpcmVzQXQ6IFBhcnNlLl9lbmNvZGUoZXhwaXJlc0F0KSxcbiAgfTtcblxuICBpZiAoaW5zdGFsbGF0aW9uSWQpIHtcbiAgICBzZXNzaW9uRGF0YS5pbnN0YWxsYXRpb25JZCA9IGluc3RhbGxhdGlvbklkO1xuICB9XG5cbiAgT2JqZWN0LmFzc2lnbihzZXNzaW9uRGF0YSwgYWRkaXRpb25hbFNlc3Npb25EYXRhKTtcblxuICByZXR1cm4ge1xuICAgIHNlc3Npb25EYXRhLFxuICAgIGNyZWF0ZVNlc3Npb246ICgpID0+XG4gICAgICBuZXcgUmVzdFdyaXRlKGNvbmZpZywgQXV0aC5tYXN0ZXIoY29uZmlnKSwgJ19TZXNzaW9uJywgbnVsbCwgc2Vzc2lvbkRhdGEpLmV4ZWN1dGUoKSxcbiAgfTtcbn07XG5cbi8vIERlbGV0ZSBlbWFpbCByZXNldCB0b2tlbnMgaWYgdXNlciBpcyBjaGFuZ2luZyBwYXNzd29yZCBvciBlbWFpbC5cblJlc3RXcml0ZS5wcm90b3R5cGUuZGVsZXRlRW1haWxSZXNldFRva2VuSWZOZWVkZWQgPSBmdW5jdGlvbiAoKSB7XG4gIGlmICh0aGlzLmNsYXNzTmFtZSAhPT0gJ19Vc2VyJyB8fCB0aGlzLnF1ZXJ5ID09PSBudWxsKSB7XG4gICAgLy8gbnVsbCBxdWVyeSBtZWFucyBjcmVhdGVcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoJ3Bhc3N3b3JkJyBpbiB0aGlzLmRhdGEgfHwgJ2VtYWlsJyBpbiB0aGlzLmRhdGEpIHtcbiAgICBjb25zdCBhZGRPcHMgPSB7XG4gICAgICBfcGVyaXNoYWJsZV90b2tlbjogeyBfX29wOiAnRGVsZXRlJyB9LFxuICAgICAgX3BlcmlzaGFibGVfdG9rZW5fZXhwaXJlc19hdDogeyBfX29wOiAnRGVsZXRlJyB9LFxuICAgIH07XG4gICAgdGhpcy5kYXRhID0gT2JqZWN0LmFzc2lnbih0aGlzLmRhdGEsIGFkZE9wcyk7XG4gIH1cbn07XG5cblJlc3RXcml0ZS5wcm90b3R5cGUuZGVzdHJveUR1cGxpY2F0ZWRTZXNzaW9ucyA9IGZ1bmN0aW9uICgpIHtcbiAgLy8gT25seSBmb3IgX1Nlc3Npb24sIGFuZCBhdCBjcmVhdGlvbiB0aW1lXG4gIGlmICh0aGlzLmNsYXNzTmFtZSAhPSAnX1Nlc3Npb24nIHx8IHRoaXMucXVlcnkpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgLy8gRGVzdHJveSB0aGUgc2Vzc2lvbnMgaW4gJ0JhY2tncm91bmQnXG4gIGNvbnN0IHsgdXNlciwgaW5zdGFsbGF0aW9uSWQsIHNlc3Npb25Ub2tlbiB9ID0gdGhpcy5kYXRhO1xuICBpZiAoIXVzZXIgfHwgIWluc3RhbGxhdGlvbklkKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmICghdXNlci5vYmplY3RJZCkge1xuICAgIHJldHVybjtcbiAgfVxuICB0aGlzLmNvbmZpZy5kYXRhYmFzZS5kZXN0cm95KFxuICAgICdfU2Vzc2lvbicsXG4gICAge1xuICAgICAgdXNlcixcbiAgICAgIGluc3RhbGxhdGlvbklkLFxuICAgICAgc2Vzc2lvblRva2VuOiB7ICRuZTogc2Vzc2lvblRva2VuIH0sXG4gICAgfSxcbiAgICB7fSxcbiAgICB0aGlzLnZhbGlkU2NoZW1hQ29udHJvbGxlclxuICApO1xufTtcblxuLy8gSGFuZGxlcyBhbnkgZm9sbG93dXAgbG9naWNcblJlc3RXcml0ZS5wcm90b3R5cGUuaGFuZGxlRm9sbG93dXAgPSBmdW5jdGlvbiAoKSB7XG4gIGlmICh0aGlzLnN0b3JhZ2UgJiYgdGhpcy5zdG9yYWdlWydjbGVhclNlc3Npb25zJ10gJiYgdGhpcy5jb25maWcucmV2b2tlU2Vzc2lvbk9uUGFzc3dvcmRSZXNldCkge1xuICAgIHZhciBzZXNzaW9uUXVlcnkgPSB7XG4gICAgICB1c2VyOiB7XG4gICAgICAgIF9fdHlwZTogJ1BvaW50ZXInLFxuICAgICAgICBjbGFzc05hbWU6ICdfVXNlcicsXG4gICAgICAgIG9iamVjdElkOiB0aGlzLm9iamVjdElkKCksXG4gICAgICB9LFxuICAgIH07XG4gICAgZGVsZXRlIHRoaXMuc3RvcmFnZVsnY2xlYXJTZXNzaW9ucyddO1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5kYXRhYmFzZVxuICAgICAgLmRlc3Ryb3koJ19TZXNzaW9uJywgc2Vzc2lvblF1ZXJ5KVxuICAgICAgLnRoZW4odGhpcy5oYW5kbGVGb2xsb3d1cC5iaW5kKHRoaXMpKTtcbiAgfVxuXG4gIGlmICh0aGlzLnN0b3JhZ2UgJiYgdGhpcy5zdG9yYWdlWydnZW5lcmF0ZU5ld1Nlc3Npb24nXSkge1xuICAgIGRlbGV0ZSB0aGlzLnN0b3JhZ2VbJ2dlbmVyYXRlTmV3U2Vzc2lvbiddO1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZVNlc3Npb25Ub2tlbigpLnRoZW4odGhpcy5oYW5kbGVGb2xsb3d1cC5iaW5kKHRoaXMpKTtcbiAgfVxuXG4gIGlmICh0aGlzLnN0b3JhZ2UgJiYgdGhpcy5zdG9yYWdlWydzZW5kVmVyaWZpY2F0aW9uRW1haWwnXSkge1xuICAgIGRlbGV0ZSB0aGlzLnN0b3JhZ2VbJ3NlbmRWZXJpZmljYXRpb25FbWFpbCddO1xuICAgIC8vIEZpcmUgYW5kIGZvcmdldCFcbiAgICB0aGlzLmNvbmZpZy51c2VyQ29udHJvbGxlci5zZW5kVmVyaWZpY2F0aW9uRW1haWwodGhpcy5kYXRhKTtcbiAgICByZXR1cm4gdGhpcy5oYW5kbGVGb2xsb3d1cC5iaW5kKHRoaXMpO1xuICB9XG59O1xuXG4vLyBIYW5kbGVzIHRoZSBfU2Vzc2lvbiBjbGFzcyBzcGVjaWFsbmVzcy5cbi8vIERvZXMgbm90aGluZyBpZiB0aGlzIGlzbid0IGFuIF9TZXNzaW9uIG9iamVjdC5cblJlc3RXcml0ZS5wcm90b3R5cGUuaGFuZGxlU2Vzc2lvbiA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKHRoaXMucmVzcG9uc2UgfHwgdGhpcy5jbGFzc05hbWUgIT09ICdfU2Vzc2lvbicpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoIXRoaXMuYXV0aC51c2VyICYmICF0aGlzLmF1dGguaXNNYXN0ZXIpIHtcbiAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuSU5WQUxJRF9TRVNTSU9OX1RPS0VOLCAnU2Vzc2lvbiB0b2tlbiByZXF1aXJlZC4nKTtcbiAgfVxuXG4gIC8vIFRPRE86IFZlcmlmeSBwcm9wZXIgZXJyb3IgdG8gdGhyb3dcbiAgaWYgKHRoaXMuZGF0YS5BQ0wpIHtcbiAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuSU5WQUxJRF9LRVlfTkFNRSwgJ0Nhbm5vdCBzZXQgJyArICdBQ0wgb24gYSBTZXNzaW9uLicpO1xuICB9XG5cbiAgaWYgKHRoaXMucXVlcnkpIHtcbiAgICBpZiAodGhpcy5kYXRhLnVzZXIgJiYgIXRoaXMuYXV0aC5pc01hc3RlciAmJiB0aGlzLmRhdGEudXNlci5vYmplY3RJZCAhPSB0aGlzLmF1dGgudXNlci5pZCkge1xuICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLklOVkFMSURfS0VZX05BTUUpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5kYXRhLmluc3RhbGxhdGlvbklkKSB7XG4gICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuSU5WQUxJRF9LRVlfTkFNRSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmRhdGEuc2Vzc2lvblRva2VuKSB7XG4gICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuSU5WQUxJRF9LRVlfTkFNRSk7XG4gICAgfVxuICAgIGlmICghdGhpcy5hdXRoLmlzTWFzdGVyKSB7XG4gICAgICB0aGlzLnF1ZXJ5ID0ge1xuICAgICAgICAkYW5kOiBbXG4gICAgICAgICAgdGhpcy5xdWVyeSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB1c2VyOiB7XG4gICAgICAgICAgICAgIF9fdHlwZTogJ1BvaW50ZXInLFxuICAgICAgICAgICAgICBjbGFzc05hbWU6ICdfVXNlcicsXG4gICAgICAgICAgICAgIG9iamVjdElkOiB0aGlzLmF1dGgudXNlci5pZCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgaWYgKCF0aGlzLnF1ZXJ5ICYmICF0aGlzLmF1dGguaXNNYXN0ZXIpIHtcbiAgICBjb25zdCBhZGRpdGlvbmFsU2Vzc2lvbkRhdGEgPSB7fTtcbiAgICBmb3IgKHZhciBrZXkgaW4gdGhpcy5kYXRhKSB7XG4gICAgICBpZiAoa2V5ID09PSAnb2JqZWN0SWQnIHx8IGtleSA9PT0gJ3VzZXInKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgYWRkaXRpb25hbFNlc3Npb25EYXRhW2tleV0gPSB0aGlzLmRhdGFba2V5XTtcbiAgICB9XG5cbiAgICBjb25zdCB7IHNlc3Npb25EYXRhLCBjcmVhdGVTZXNzaW9uIH0gPSBSZXN0V3JpdGUuY3JlYXRlU2Vzc2lvbih0aGlzLmNvbmZpZywge1xuICAgICAgdXNlcklkOiB0aGlzLmF1dGgudXNlci5pZCxcbiAgICAgIGNyZWF0ZWRXaXRoOiB7XG4gICAgICAgIGFjdGlvbjogJ2NyZWF0ZScsXG4gICAgICB9LFxuICAgICAgYWRkaXRpb25hbFNlc3Npb25EYXRhLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGNyZWF0ZVNlc3Npb24oKS50aGVuKHJlc3VsdHMgPT4ge1xuICAgICAgaWYgKCFyZXN1bHRzLnJlc3BvbnNlKSB7XG4gICAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5JTlRFUk5BTF9TRVJWRVJfRVJST1IsICdFcnJvciBjcmVhdGluZyBzZXNzaW9uLicpO1xuICAgICAgfVxuICAgICAgc2Vzc2lvbkRhdGFbJ29iamVjdElkJ10gPSByZXN1bHRzLnJlc3BvbnNlWydvYmplY3RJZCddO1xuICAgICAgdGhpcy5yZXNwb25zZSA9IHtcbiAgICAgICAgc3RhdHVzOiAyMDEsXG4gICAgICAgIGxvY2F0aW9uOiByZXN1bHRzLmxvY2F0aW9uLFxuICAgICAgICByZXNwb25zZTogc2Vzc2lvbkRhdGEsXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG59O1xuXG4vLyBIYW5kbGVzIHRoZSBfSW5zdGFsbGF0aW9uIGNsYXNzIHNwZWNpYWxuZXNzLlxuLy8gRG9lcyBub3RoaW5nIGlmIHRoaXMgaXNuJ3QgYW4gaW5zdGFsbGF0aW9uIG9iamVjdC5cbi8vIElmIGFuIGluc3RhbGxhdGlvbiBpcyBmb3VuZCwgdGhpcyBjYW4gbXV0YXRlIHRoaXMucXVlcnkgYW5kIHR1cm4gYSBjcmVhdGVcbi8vIGludG8gYW4gdXBkYXRlLlxuLy8gUmV0dXJucyBhIHByb21pc2UgZm9yIHdoZW4gd2UncmUgZG9uZSBpZiBpdCBjYW4ndCBmaW5pc2ggdGhpcyB0aWNrLlxuUmVzdFdyaXRlLnByb3RvdHlwZS5oYW5kbGVJbnN0YWxsYXRpb24gPSBmdW5jdGlvbiAoKSB7XG4gIGlmICh0aGlzLnJlc3BvbnNlIHx8IHRoaXMuY2xhc3NOYW1lICE9PSAnX0luc3RhbGxhdGlvbicpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoXG4gICAgIXRoaXMucXVlcnkgJiZcbiAgICAhdGhpcy5kYXRhLmRldmljZVRva2VuICYmXG4gICAgIXRoaXMuZGF0YS5pbnN0YWxsYXRpb25JZCAmJlxuICAgICF0aGlzLmF1dGguaW5zdGFsbGF0aW9uSWRcbiAgKSB7XG4gICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFxuICAgICAgMTM1LFxuICAgICAgJ2F0IGxlYXN0IG9uZSBJRCBmaWVsZCAoZGV2aWNlVG9rZW4sIGluc3RhbGxhdGlvbklkKSAnICsgJ211c3QgYmUgc3BlY2lmaWVkIGluIHRoaXMgb3BlcmF0aW9uJ1xuICAgICk7XG4gIH1cblxuICAvLyBJZiB0aGUgZGV2aWNlIHRva2VuIGlzIDY0IGNoYXJhY3RlcnMgbG9uZywgd2UgYXNzdW1lIGl0IGlzIGZvciBpT1NcbiAgLy8gYW5kIGxvd2VyY2FzZSBpdC5cbiAgaWYgKHRoaXMuZGF0YS5kZXZpY2VUb2tlbiAmJiB0aGlzLmRhdGEuZGV2aWNlVG9rZW4ubGVuZ3RoID09IDY0KSB7XG4gICAgdGhpcy5kYXRhLmRldmljZVRva2VuID0gdGhpcy5kYXRhLmRldmljZVRva2VuLnRvTG93ZXJDYXNlKCk7XG4gIH1cblxuICAvLyBXZSBsb3dlcmNhc2UgdGhlIGluc3RhbGxhdGlvbklkIGlmIHByZXNlbnRcbiAgaWYgKHRoaXMuZGF0YS5pbnN0YWxsYXRpb25JZCkge1xuICAgIHRoaXMuZGF0YS5pbnN0YWxsYXRpb25JZCA9IHRoaXMuZGF0YS5pbnN0YWxsYXRpb25JZC50b0xvd2VyQ2FzZSgpO1xuICB9XG5cbiAgbGV0IGluc3RhbGxhdGlvbklkID0gdGhpcy5kYXRhLmluc3RhbGxhdGlvbklkO1xuXG4gIC8vIElmIGRhdGEuaW5zdGFsbGF0aW9uSWQgaXMgbm90IHNldCBhbmQgd2UncmUgbm90IG1hc3Rlciwgd2UgY2FuIGxvb2t1cCBpbiBhdXRoXG4gIGlmICghaW5zdGFsbGF0aW9uSWQgJiYgIXRoaXMuYXV0aC5pc01hc3Rlcikge1xuICAgIGluc3RhbGxhdGlvbklkID0gdGhpcy5hdXRoLmluc3RhbGxhdGlvbklkO1xuICB9XG5cbiAgaWYgKGluc3RhbGxhdGlvbklkKSB7XG4gICAgaW5zdGFsbGF0aW9uSWQgPSBpbnN0YWxsYXRpb25JZC50b0xvd2VyQ2FzZSgpO1xuICB9XG5cbiAgLy8gVXBkYXRpbmcgX0luc3RhbGxhdGlvbiBidXQgbm90IHVwZGF0aW5nIGFueXRoaW5nIGNyaXRpY2FsXG4gIGlmICh0aGlzLnF1ZXJ5ICYmICF0aGlzLmRhdGEuZGV2aWNlVG9rZW4gJiYgIWluc3RhbGxhdGlvbklkICYmICF0aGlzLmRhdGEuZGV2aWNlVHlwZSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBwcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKCk7XG5cbiAgdmFyIGlkTWF0Y2g7IC8vIFdpbGwgYmUgYSBtYXRjaCBvbiBlaXRoZXIgb2JqZWN0SWQgb3IgaW5zdGFsbGF0aW9uSWRcbiAgdmFyIG9iamVjdElkTWF0Y2g7XG4gIHZhciBpbnN0YWxsYXRpb25JZE1hdGNoO1xuICB2YXIgZGV2aWNlVG9rZW5NYXRjaGVzID0gW107XG5cbiAgLy8gSW5zdGVhZCBvZiBpc3N1aW5nIDMgcmVhZHMsIGxldCdzIGRvIGl0IHdpdGggb25lIE9SLlxuICBjb25zdCBvclF1ZXJpZXMgPSBbXTtcbiAgaWYgKHRoaXMucXVlcnkgJiYgdGhpcy5xdWVyeS5vYmplY3RJZCkge1xuICAgIG9yUXVlcmllcy5wdXNoKHtcbiAgICAgIG9iamVjdElkOiB0aGlzLnF1ZXJ5Lm9iamVjdElkLFxuICAgIH0pO1xuICB9XG4gIGlmIChpbnN0YWxsYXRpb25JZCkge1xuICAgIG9yUXVlcmllcy5wdXNoKHtcbiAgICAgIGluc3RhbGxhdGlvbklkOiBpbnN0YWxsYXRpb25JZCxcbiAgICB9KTtcbiAgfVxuICBpZiAodGhpcy5kYXRhLmRldmljZVRva2VuKSB7XG4gICAgb3JRdWVyaWVzLnB1c2goeyBkZXZpY2VUb2tlbjogdGhpcy5kYXRhLmRldmljZVRva2VuIH0pO1xuICB9XG5cbiAgaWYgKG9yUXVlcmllcy5sZW5ndGggPT0gMCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHByb21pc2UgPSBwcm9taXNlXG4gICAgLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuY29uZmlnLmRhdGFiYXNlLmZpbmQoXG4gICAgICAgICdfSW5zdGFsbGF0aW9uJyxcbiAgICAgICAge1xuICAgICAgICAgICRvcjogb3JRdWVyaWVzLFxuICAgICAgICB9LFxuICAgICAgICB7fVxuICAgICAgKTtcbiAgICB9KVxuICAgIC50aGVuKHJlc3VsdHMgPT4ge1xuICAgICAgcmVzdWx0cy5mb3JFYWNoKHJlc3VsdCA9PiB7XG4gICAgICAgIGlmICh0aGlzLnF1ZXJ5ICYmIHRoaXMucXVlcnkub2JqZWN0SWQgJiYgcmVzdWx0Lm9iamVjdElkID09IHRoaXMucXVlcnkub2JqZWN0SWQpIHtcbiAgICAgICAgICBvYmplY3RJZE1hdGNoID0gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXN1bHQuaW5zdGFsbGF0aW9uSWQgPT0gaW5zdGFsbGF0aW9uSWQpIHtcbiAgICAgICAgICBpbnN0YWxsYXRpb25JZE1hdGNoID0gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXN1bHQuZGV2aWNlVG9rZW4gPT0gdGhpcy5kYXRhLmRldmljZVRva2VuKSB7XG4gICAgICAgICAgZGV2aWNlVG9rZW5NYXRjaGVzLnB1c2gocmVzdWx0KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIFNhbml0eSBjaGVja3Mgd2hlbiBydW5uaW5nIGEgcXVlcnlcbiAgICAgIGlmICh0aGlzLnF1ZXJ5ICYmIHRoaXMucXVlcnkub2JqZWN0SWQpIHtcbiAgICAgICAgaWYgKCFvYmplY3RJZE1hdGNoKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLk9CSkVDVF9OT1RfRk9VTkQsICdPYmplY3Qgbm90IGZvdW5kIGZvciB1cGRhdGUuJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRoaXMuZGF0YS5pbnN0YWxsYXRpb25JZCAmJlxuICAgICAgICAgIG9iamVjdElkTWF0Y2guaW5zdGFsbGF0aW9uSWQgJiZcbiAgICAgICAgICB0aGlzLmRhdGEuaW5zdGFsbGF0aW9uSWQgIT09IG9iamVjdElkTWF0Y2guaW5zdGFsbGF0aW9uSWRcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKDEzNiwgJ2luc3RhbGxhdGlvbklkIG1heSBub3QgYmUgY2hhbmdlZCBpbiB0aGlzICcgKyAnb3BlcmF0aW9uJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRoaXMuZGF0YS5kZXZpY2VUb2tlbiAmJlxuICAgICAgICAgIG9iamVjdElkTWF0Y2guZGV2aWNlVG9rZW4gJiZcbiAgICAgICAgICB0aGlzLmRhdGEuZGV2aWNlVG9rZW4gIT09IG9iamVjdElkTWF0Y2guZGV2aWNlVG9rZW4gJiZcbiAgICAgICAgICAhdGhpcy5kYXRhLmluc3RhbGxhdGlvbklkICYmXG4gICAgICAgICAgIW9iamVjdElkTWF0Y2guaW5zdGFsbGF0aW9uSWRcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKDEzNiwgJ2RldmljZVRva2VuIG1heSBub3QgYmUgY2hhbmdlZCBpbiB0aGlzICcgKyAnb3BlcmF0aW9uJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRoaXMuZGF0YS5kZXZpY2VUeXBlICYmXG4gICAgICAgICAgdGhpcy5kYXRhLmRldmljZVR5cGUgJiZcbiAgICAgICAgICB0aGlzLmRhdGEuZGV2aWNlVHlwZSAhPT0gb2JqZWN0SWRNYXRjaC5kZXZpY2VUeXBlXG4gICAgICAgICkge1xuICAgICAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcigxMzYsICdkZXZpY2VUeXBlIG1heSBub3QgYmUgY2hhbmdlZCBpbiB0aGlzICcgKyAnb3BlcmF0aW9uJyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMucXVlcnkgJiYgdGhpcy5xdWVyeS5vYmplY3RJZCAmJiBvYmplY3RJZE1hdGNoKSB7XG4gICAgICAgIGlkTWF0Y2ggPSBvYmplY3RJZE1hdGNoO1xuICAgICAgfVxuXG4gICAgICBpZiAoaW5zdGFsbGF0aW9uSWQgJiYgaW5zdGFsbGF0aW9uSWRNYXRjaCkge1xuICAgICAgICBpZE1hdGNoID0gaW5zdGFsbGF0aW9uSWRNYXRjaDtcbiAgICAgIH1cbiAgICAgIC8vIG5lZWQgdG8gc3BlY2lmeSBkZXZpY2VUeXBlIG9ubHkgaWYgaXQncyBuZXdcbiAgICAgIGlmICghdGhpcy5xdWVyeSAmJiAhdGhpcy5kYXRhLmRldmljZVR5cGUgJiYgIWlkTWF0Y2gpIHtcbiAgICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKDEzNSwgJ2RldmljZVR5cGUgbXVzdCBiZSBzcGVjaWZpZWQgaW4gdGhpcyBvcGVyYXRpb24nKTtcbiAgICAgIH1cbiAgICB9KVxuICAgIC50aGVuKCgpID0+IHtcbiAgICAgIGlmICghaWRNYXRjaCkge1xuICAgICAgICBpZiAoIWRldmljZVRva2VuTWF0Y2hlcy5sZW5ndGgpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgZGV2aWNlVG9rZW5NYXRjaGVzLmxlbmd0aCA9PSAxICYmXG4gICAgICAgICAgKCFkZXZpY2VUb2tlbk1hdGNoZXNbMF1bJ2luc3RhbGxhdGlvbklkJ10gfHwgIWluc3RhbGxhdGlvbklkKVxuICAgICAgICApIHtcbiAgICAgICAgICAvLyBTaW5nbGUgbWF0Y2ggb24gZGV2aWNlIHRva2VuIGJ1dCBub25lIG9uIGluc3RhbGxhdGlvbklkLCBhbmQgZWl0aGVyXG4gICAgICAgICAgLy8gdGhlIHBhc3NlZCBvYmplY3Qgb3IgdGhlIG1hdGNoIGlzIG1pc3NpbmcgYW4gaW5zdGFsbGF0aW9uSWQsIHNvIHdlXG4gICAgICAgICAgLy8gY2FuIGp1c3QgcmV0dXJuIHRoZSBtYXRjaC5cbiAgICAgICAgICByZXR1cm4gZGV2aWNlVG9rZW5NYXRjaGVzWzBdWydvYmplY3RJZCddO1xuICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLmRhdGEuaW5zdGFsbGF0aW9uSWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoXG4gICAgICAgICAgICAxMzIsXG4gICAgICAgICAgICAnTXVzdCBzcGVjaWZ5IGluc3RhbGxhdGlvbklkIHdoZW4gZGV2aWNlVG9rZW4gJyArXG4gICAgICAgICAgICAgICdtYXRjaGVzIG11bHRpcGxlIEluc3RhbGxhdGlvbiBvYmplY3RzJ1xuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gTXVsdGlwbGUgZGV2aWNlIHRva2VuIG1hdGNoZXMgYW5kIHdlIHNwZWNpZmllZCBhbiBpbnN0YWxsYXRpb24gSUQsXG4gICAgICAgICAgLy8gb3IgYSBzaW5nbGUgbWF0Y2ggd2hlcmUgYm90aCB0aGUgcGFzc2VkIGFuZCBtYXRjaGluZyBvYmplY3RzIGhhdmVcbiAgICAgICAgICAvLyBhbiBpbnN0YWxsYXRpb24gSUQuIFRyeSBjbGVhbmluZyBvdXQgb2xkIGluc3RhbGxhdGlvbnMgdGhhdCBtYXRjaFxuICAgICAgICAgIC8vIHRoZSBkZXZpY2VUb2tlbiwgYW5kIHJldHVybiBuaWwgdG8gc2lnbmFsIHRoYXQgYSBuZXcgb2JqZWN0IHNob3VsZFxuICAgICAgICAgIC8vIGJlIGNyZWF0ZWQuXG4gICAgICAgICAgdmFyIGRlbFF1ZXJ5ID0ge1xuICAgICAgICAgICAgZGV2aWNlVG9rZW46IHRoaXMuZGF0YS5kZXZpY2VUb2tlbixcbiAgICAgICAgICAgIGluc3RhbGxhdGlvbklkOiB7XG4gICAgICAgICAgICAgICRuZTogaW5zdGFsbGF0aW9uSWQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH07XG4gICAgICAgICAgaWYgKHRoaXMuZGF0YS5hcHBJZGVudGlmaWVyKSB7XG4gICAgICAgICAgICBkZWxRdWVyeVsnYXBwSWRlbnRpZmllciddID0gdGhpcy5kYXRhLmFwcElkZW50aWZpZXI7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuY29uZmlnLmRhdGFiYXNlLmRlc3Ryb3koJ19JbnN0YWxsYXRpb24nLCBkZWxRdWVyeSkuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgICAgIGlmIChlcnIuY29kZSA9PSBQYXJzZS5FcnJvci5PQkpFQ1RfTk9UX0ZPVU5EKSB7XG4gICAgICAgICAgICAgIC8vIG5vIGRlbGV0aW9ucyB3ZXJlIG1hZGUuIENhbiBiZSBpZ25vcmVkLlxuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyByZXRocm93IHRoZSBlcnJvclxuICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGRldmljZVRva2VuTWF0Y2hlcy5sZW5ndGggPT0gMSAmJiAhZGV2aWNlVG9rZW5NYXRjaGVzWzBdWydpbnN0YWxsYXRpb25JZCddKSB7XG4gICAgICAgICAgLy8gRXhhY3RseSBvbmUgZGV2aWNlIHRva2VuIG1hdGNoIGFuZCBpdCBkb2Vzbid0IGhhdmUgYW4gaW5zdGFsbGF0aW9uXG4gICAgICAgICAgLy8gSUQuIFRoaXMgaXMgdGhlIG9uZSBjYXNlIHdoZXJlIHdlIHdhbnQgdG8gbWVyZ2Ugd2l0aCB0aGUgZXhpc3RpbmdcbiAgICAgICAgICAvLyBvYmplY3QuXG4gICAgICAgICAgY29uc3QgZGVsUXVlcnkgPSB7IG9iamVjdElkOiBpZE1hdGNoLm9iamVjdElkIH07XG4gICAgICAgICAgcmV0dXJuIHRoaXMuY29uZmlnLmRhdGFiYXNlXG4gICAgICAgICAgICAuZGVzdHJveSgnX0luc3RhbGxhdGlvbicsIGRlbFF1ZXJ5KVxuICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICByZXR1cm4gZGV2aWNlVG9rZW5NYXRjaGVzWzBdWydvYmplY3RJZCddO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgICAgICBpZiAoZXJyLmNvZGUgPT0gUGFyc2UuRXJyb3IuT0JKRUNUX05PVF9GT1VORCkge1xuICAgICAgICAgICAgICAgIC8vIG5vIGRlbGV0aW9ucyB3ZXJlIG1hZGUuIENhbiBiZSBpZ25vcmVkXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIC8vIHJldGhyb3cgdGhlIGVycm9yXG4gICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmICh0aGlzLmRhdGEuZGV2aWNlVG9rZW4gJiYgaWRNYXRjaC5kZXZpY2VUb2tlbiAhPSB0aGlzLmRhdGEuZGV2aWNlVG9rZW4pIHtcbiAgICAgICAgICAgIC8vIFdlJ3JlIHNldHRpbmcgdGhlIGRldmljZSB0b2tlbiBvbiBhbiBleGlzdGluZyBpbnN0YWxsYXRpb24sIHNvXG4gICAgICAgICAgICAvLyB3ZSBzaG91bGQgdHJ5IGNsZWFuaW5nIG91dCBvbGQgaW5zdGFsbGF0aW9ucyB0aGF0IG1hdGNoIHRoaXNcbiAgICAgICAgICAgIC8vIGRldmljZSB0b2tlbi5cbiAgICAgICAgICAgIGNvbnN0IGRlbFF1ZXJ5ID0ge1xuICAgICAgICAgICAgICBkZXZpY2VUb2tlbjogdGhpcy5kYXRhLmRldmljZVRva2VuLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIC8vIFdlIGhhdmUgYSB1bmlxdWUgaW5zdGFsbCBJZCwgdXNlIHRoYXQgdG8gcHJlc2VydmVcbiAgICAgICAgICAgIC8vIHRoZSBpbnRlcmVzdGluZyBpbnN0YWxsYXRpb25cbiAgICAgICAgICAgIGlmICh0aGlzLmRhdGEuaW5zdGFsbGF0aW9uSWQpIHtcbiAgICAgICAgICAgICAgZGVsUXVlcnlbJ2luc3RhbGxhdGlvbklkJ10gPSB7XG4gICAgICAgICAgICAgICAgJG5lOiB0aGlzLmRhdGEuaW5zdGFsbGF0aW9uSWQsXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICBpZE1hdGNoLm9iamVjdElkICYmXG4gICAgICAgICAgICAgIHRoaXMuZGF0YS5vYmplY3RJZCAmJlxuICAgICAgICAgICAgICBpZE1hdGNoLm9iamVjdElkID09IHRoaXMuZGF0YS5vYmplY3RJZFxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIC8vIHdlIHBhc3NlZCBhbiBvYmplY3RJZCwgcHJlc2VydmUgdGhhdCBpbnN0YWxhdGlvblxuICAgICAgICAgICAgICBkZWxRdWVyeVsnb2JqZWN0SWQnXSA9IHtcbiAgICAgICAgICAgICAgICAkbmU6IGlkTWF0Y2gub2JqZWN0SWQsXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBXaGF0IHRvIGRvIGhlcmU/IGNhbid0IHJlYWxseSBjbGVhbiB1cCBldmVyeXRoaW5nLi4uXG4gICAgICAgICAgICAgIHJldHVybiBpZE1hdGNoLm9iamVjdElkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuZGF0YS5hcHBJZGVudGlmaWVyKSB7XG4gICAgICAgICAgICAgIGRlbFF1ZXJ5WydhcHBJZGVudGlmaWVyJ10gPSB0aGlzLmRhdGEuYXBwSWRlbnRpZmllcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuY29uZmlnLmRhdGFiYXNlLmRlc3Ryb3koJ19JbnN0YWxsYXRpb24nLCBkZWxRdWVyeSkuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgICAgICAgaWYgKGVyci5jb2RlID09IFBhcnNlLkVycm9yLk9CSkVDVF9OT1RfRk9VTkQpIHtcbiAgICAgICAgICAgICAgICAvLyBubyBkZWxldGlvbnMgd2VyZSBtYWRlLiBDYW4gYmUgaWdub3JlZC5cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLy8gcmV0aHJvdyB0aGUgZXJyb3JcbiAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIEluIG5vbi1tZXJnZSBzY2VuYXJpb3MsIGp1c3QgcmV0dXJuIHRoZSBpbnN0YWxsYXRpb24gbWF0Y2ggaWRcbiAgICAgICAgICByZXR1cm4gaWRNYXRjaC5vYmplY3RJZDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pXG4gICAgLnRoZW4ob2JqSWQgPT4ge1xuICAgICAgaWYgKG9iaklkKSB7XG4gICAgICAgIHRoaXMucXVlcnkgPSB7IG9iamVjdElkOiBvYmpJZCB9O1xuICAgICAgICBkZWxldGUgdGhpcy5kYXRhLm9iamVjdElkO1xuICAgICAgICBkZWxldGUgdGhpcy5kYXRhLmNyZWF0ZWRBdDtcbiAgICAgIH1cbiAgICAgIC8vIFRPRE86IFZhbGlkYXRlIG9wcyAoYWRkL3JlbW92ZSBvbiBjaGFubmVscywgJGluYyBvbiBiYWRnZSwgZXRjLilcbiAgICB9KTtcbiAgcmV0dXJuIHByb21pc2U7XG59O1xuXG4vLyBJZiB3ZSBzaG9ydC1jaXJjdWl0ZWQgdGhlIG9iamVjdCByZXNwb25zZSAtIHRoZW4gd2UgbmVlZCB0byBtYWtlIHN1cmUgd2UgZXhwYW5kIGFsbCB0aGUgZmlsZXMsXG4vLyBzaW5jZSB0aGlzIG1pZ2h0IG5vdCBoYXZlIGEgcXVlcnksIG1lYW5pbmcgaXQgd29uJ3QgcmV0dXJuIHRoZSBmdWxsIHJlc3VsdCBiYWNrLlxuLy8gVE9ETzogKG5sdXRzZW5rbykgVGhpcyBzaG91bGQgZGllIHdoZW4gd2UgbW92ZSB0byBwZXItY2xhc3MgYmFzZWQgY29udHJvbGxlcnMgb24gX1Nlc3Npb24vX1VzZXJcblJlc3RXcml0ZS5wcm90b3R5cGUuZXhwYW5kRmlsZXNGb3JFeGlzdGluZ09iamVjdHMgPSBmdW5jdGlvbiAoKSB7XG4gIC8vIENoZWNrIHdoZXRoZXIgd2UgaGF2ZSBhIHNob3J0LWNpcmN1aXRlZCByZXNwb25zZSAtIG9ubHkgdGhlbiBydW4gZXhwYW5zaW9uLlxuICBpZiAodGhpcy5yZXNwb25zZSAmJiB0aGlzLnJlc3BvbnNlLnJlc3BvbnNlKSB7XG4gICAgdGhpcy5jb25maWcuZmlsZXNDb250cm9sbGVyLmV4cGFuZEZpbGVzSW5PYmplY3QodGhpcy5jb25maWcsIHRoaXMucmVzcG9uc2UucmVzcG9uc2UpO1xuICB9XG59O1xuXG5SZXN0V3JpdGUucHJvdG90eXBlLnJ1bkRhdGFiYXNlT3BlcmF0aW9uID0gZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy5yZXNwb25zZSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmICh0aGlzLmNsYXNzTmFtZSA9PT0gJ19Sb2xlJykge1xuICAgIHRoaXMuY29uZmlnLmNhY2hlQ29udHJvbGxlci5yb2xlLmNsZWFyKCk7XG4gICAgaWYgKHRoaXMuY29uZmlnLmxpdmVRdWVyeUNvbnRyb2xsZXIpIHtcbiAgICAgIHRoaXMuY29uZmlnLmxpdmVRdWVyeUNvbnRyb2xsZXIuY2xlYXJDYWNoZWRSb2xlcyh0aGlzLmF1dGgudXNlcik7XG4gICAgfVxuICB9XG5cbiAgaWYgKHRoaXMuY2xhc3NOYW1lID09PSAnX1VzZXInICYmIHRoaXMucXVlcnkgJiYgdGhpcy5hdXRoLmlzVW5hdXRoZW50aWNhdGVkKCkpIHtcbiAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoXG4gICAgICBQYXJzZS5FcnJvci5TRVNTSU9OX01JU1NJTkcsXG4gICAgICBgQ2Fubm90IG1vZGlmeSB1c2VyICR7dGhpcy5xdWVyeS5vYmplY3RJZH0uYFxuICAgICk7XG4gIH1cblxuICBpZiAodGhpcy5jbGFzc05hbWUgPT09ICdfUHJvZHVjdCcgJiYgdGhpcy5kYXRhLmRvd25sb2FkKSB7XG4gICAgdGhpcy5kYXRhLmRvd25sb2FkTmFtZSA9IHRoaXMuZGF0YS5kb3dubG9hZC5uYW1lO1xuICB9XG5cbiAgLy8gVE9ETzogQWRkIGJldHRlciBkZXRlY3Rpb24gZm9yIEFDTCwgZW5zdXJpbmcgYSB1c2VyIGNhbid0IGJlIGxvY2tlZCBmcm9tXG4gIC8vICAgICAgIHRoZWlyIG93biB1c2VyIHJlY29yZC5cbiAgaWYgKHRoaXMuZGF0YS5BQ0wgJiYgdGhpcy5kYXRhLkFDTFsnKnVucmVzb2x2ZWQnXSkge1xuICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5JTlZBTElEX0FDTCwgJ0ludmFsaWQgQUNMLicpO1xuICB9XG5cbiAgaWYgKHRoaXMucXVlcnkpIHtcbiAgICAvLyBGb3JjZSB0aGUgdXNlciB0byBub3QgbG9ja291dFxuICAgIC8vIE1hdGNoZWQgd2l0aCBwYXJzZS5jb21cbiAgICBpZiAodGhpcy5jbGFzc05hbWUgPT09ICdfVXNlcicgJiYgdGhpcy5kYXRhLkFDTCAmJiB0aGlzLmF1dGguaXNNYXN0ZXIgIT09IHRydWUpIHtcbiAgICAgIHRoaXMuZGF0YS5BQ0xbdGhpcy5xdWVyeS5vYmplY3RJZF0gPSB7IHJlYWQ6IHRydWUsIHdyaXRlOiB0cnVlIH07XG4gICAgfVxuICAgIC8vIHVwZGF0ZSBwYXNzd29yZCB0aW1lc3RhbXAgaWYgdXNlciBwYXNzd29yZCBpcyBiZWluZyBjaGFuZ2VkXG4gICAgaWYgKFxuICAgICAgdGhpcy5jbGFzc05hbWUgPT09ICdfVXNlcicgJiZcbiAgICAgIHRoaXMuZGF0YS5faGFzaGVkX3Bhc3N3b3JkICYmXG4gICAgICB0aGlzLmNvbmZpZy5wYXNzd29yZFBvbGljeSAmJlxuICAgICAgdGhpcy5jb25maWcucGFzc3dvcmRQb2xpY3kubWF4UGFzc3dvcmRBZ2VcbiAgICApIHtcbiAgICAgIHRoaXMuZGF0YS5fcGFzc3dvcmRfY2hhbmdlZF9hdCA9IFBhcnNlLl9lbmNvZGUobmV3IERhdGUoKSk7XG4gICAgfVxuICAgIC8vIElnbm9yZSBjcmVhdGVkQXQgd2hlbiB1cGRhdGVcbiAgICBkZWxldGUgdGhpcy5kYXRhLmNyZWF0ZWRBdDtcblxuICAgIGxldCBkZWZlciA9IFByb21pc2UucmVzb2x2ZSgpO1xuICAgIC8vIGlmIHBhc3N3b3JkIGhpc3RvcnkgaXMgZW5hYmxlZCB0aGVuIHNhdmUgdGhlIGN1cnJlbnQgcGFzc3dvcmQgdG8gaGlzdG9yeVxuICAgIGlmIChcbiAgICAgIHRoaXMuY2xhc3NOYW1lID09PSAnX1VzZXInICYmXG4gICAgICB0aGlzLmRhdGEuX2hhc2hlZF9wYXNzd29yZCAmJlxuICAgICAgdGhpcy5jb25maWcucGFzc3dvcmRQb2xpY3kgJiZcbiAgICAgIHRoaXMuY29uZmlnLnBhc3N3b3JkUG9saWN5Lm1heFBhc3N3b3JkSGlzdG9yeVxuICAgICkge1xuICAgICAgZGVmZXIgPSB0aGlzLmNvbmZpZy5kYXRhYmFzZVxuICAgICAgICAuZmluZChcbiAgICAgICAgICAnX1VzZXInLFxuICAgICAgICAgIHsgb2JqZWN0SWQ6IHRoaXMub2JqZWN0SWQoKSB9LFxuICAgICAgICAgIHsga2V5czogWydfcGFzc3dvcmRfaGlzdG9yeScsICdfaGFzaGVkX3Bhc3N3b3JkJ10gfVxuICAgICAgICApXG4gICAgICAgIC50aGVuKHJlc3VsdHMgPT4ge1xuICAgICAgICAgIGlmIChyZXN1bHRzLmxlbmd0aCAhPSAxKSB7XG4gICAgICAgICAgICB0aHJvdyB1bmRlZmluZWQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHVzZXIgPSByZXN1bHRzWzBdO1xuICAgICAgICAgIGxldCBvbGRQYXNzd29yZHMgPSBbXTtcbiAgICAgICAgICBpZiAodXNlci5fcGFzc3dvcmRfaGlzdG9yeSkge1xuICAgICAgICAgICAgb2xkUGFzc3dvcmRzID0gXy50YWtlKFxuICAgICAgICAgICAgICB1c2VyLl9wYXNzd29yZF9oaXN0b3J5LFxuICAgICAgICAgICAgICB0aGlzLmNvbmZpZy5wYXNzd29yZFBvbGljeS5tYXhQYXNzd29yZEhpc3RvcnlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vbi0xIHBhc3N3b3JkcyBnbyBpbnRvIGhpc3RvcnkgaW5jbHVkaW5nIGxhc3QgcGFzc3dvcmRcbiAgICAgICAgICB3aGlsZSAoXG4gICAgICAgICAgICBvbGRQYXNzd29yZHMubGVuZ3RoID4gTWF0aC5tYXgoMCwgdGhpcy5jb25maWcucGFzc3dvcmRQb2xpY3kubWF4UGFzc3dvcmRIaXN0b3J5IC0gMilcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIG9sZFBhc3N3b3Jkcy5zaGlmdCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBvbGRQYXNzd29yZHMucHVzaCh1c2VyLnBhc3N3b3JkKTtcbiAgICAgICAgICB0aGlzLmRhdGEuX3Bhc3N3b3JkX2hpc3RvcnkgPSBvbGRQYXNzd29yZHM7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBkZWZlci50aGVuKCgpID0+IHtcbiAgICAgIC8vIFJ1biBhbiB1cGRhdGVcbiAgICAgIHJldHVybiB0aGlzLmNvbmZpZy5kYXRhYmFzZVxuICAgICAgICAudXBkYXRlKFxuICAgICAgICAgIHRoaXMuY2xhc3NOYW1lLFxuICAgICAgICAgIHRoaXMucXVlcnksXG4gICAgICAgICAgdGhpcy5kYXRhLFxuICAgICAgICAgIHRoaXMucnVuT3B0aW9ucyxcbiAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICB0aGlzLnZhbGlkU2NoZW1hQ29udHJvbGxlclxuICAgICAgICApXG4gICAgICAgIC50aGVuKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICByZXNwb25zZS51cGRhdGVkQXQgPSB0aGlzLnVwZGF0ZWRBdDtcbiAgICAgICAgICB0aGlzLl91cGRhdGVSZXNwb25zZVdpdGhEYXRhKHJlc3BvbnNlLCB0aGlzLmRhdGEpO1xuICAgICAgICAgIHRoaXMucmVzcG9uc2UgPSB7IHJlc3BvbnNlIH07XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIC8vIFNldCB0aGUgZGVmYXVsdCBBQ0wgYW5kIHBhc3N3b3JkIHRpbWVzdGFtcCBmb3IgdGhlIG5ldyBfVXNlclxuICAgIGlmICh0aGlzLmNsYXNzTmFtZSA9PT0gJ19Vc2VyJykge1xuICAgICAgdmFyIEFDTCA9IHRoaXMuZGF0YS5BQ0w7XG4gICAgICAvLyBkZWZhdWx0IHB1YmxpYyByL3cgQUNMXG4gICAgICBpZiAoIUFDTCkge1xuICAgICAgICBBQ0wgPSB7fTtcbiAgICAgICAgaWYgKCF0aGlzLmNvbmZpZy5lbmZvcmNlUHJpdmF0ZVVzZXJzKSB7XG4gICAgICAgICAgQUNMWycqJ10gPSB7IHJlYWQ6IHRydWUsIHdyaXRlOiBmYWxzZSB9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBtYWtlIHN1cmUgdGhlIHVzZXIgaXMgbm90IGxvY2tlZCBkb3duXG4gICAgICBBQ0xbdGhpcy5kYXRhLm9iamVjdElkXSA9IHsgcmVhZDogdHJ1ZSwgd3JpdGU6IHRydWUgfTtcbiAgICAgIHRoaXMuZGF0YS5BQ0wgPSBBQ0w7XG4gICAgICAvLyBwYXNzd29yZCB0aW1lc3RhbXAgdG8gYmUgdXNlZCB3aGVuIHBhc3N3b3JkIGV4cGlyeSBwb2xpY3kgaXMgZW5mb3JjZWRcbiAgICAgIGlmICh0aGlzLmNvbmZpZy5wYXNzd29yZFBvbGljeSAmJiB0aGlzLmNvbmZpZy5wYXNzd29yZFBvbGljeS5tYXhQYXNzd29yZEFnZSkge1xuICAgICAgICB0aGlzLmRhdGEuX3Bhc3N3b3JkX2NoYW5nZWRfYXQgPSBQYXJzZS5fZW5jb2RlKG5ldyBEYXRlKCkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJ1biBhIGNyZWF0ZVxuICAgIHJldHVybiB0aGlzLmNvbmZpZy5kYXRhYmFzZVxuICAgICAgLmNyZWF0ZSh0aGlzLmNsYXNzTmFtZSwgdGhpcy5kYXRhLCB0aGlzLnJ1bk9wdGlvbnMsIGZhbHNlLCB0aGlzLnZhbGlkU2NoZW1hQ29udHJvbGxlcilcbiAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgIGlmICh0aGlzLmNsYXNzTmFtZSAhPT0gJ19Vc2VyJyB8fCBlcnJvci5jb2RlICE9PSBQYXJzZS5FcnJvci5EVVBMSUNBVEVfVkFMVUUpIHtcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFF1aWNrIGNoZWNrLCBpZiB3ZSB3ZXJlIGFibGUgdG8gaW5mZXIgdGhlIGR1cGxpY2F0ZWQgZmllbGQgbmFtZVxuICAgICAgICBpZiAoZXJyb3IgJiYgZXJyb3IudXNlckluZm8gJiYgZXJyb3IudXNlckluZm8uZHVwbGljYXRlZF9maWVsZCA9PT0gJ3VzZXJuYW1lJykge1xuICAgICAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihcbiAgICAgICAgICAgIFBhcnNlLkVycm9yLlVTRVJOQU1FX1RBS0VOLFxuICAgICAgICAgICAgJ0FjY291bnQgYWxyZWFkeSBleGlzdHMgZm9yIHRoaXMgdXNlcm5hbWUuJ1xuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXJyb3IgJiYgZXJyb3IudXNlckluZm8gJiYgZXJyb3IudXNlckluZm8uZHVwbGljYXRlZF9maWVsZCA9PT0gJ2VtYWlsJykge1xuICAgICAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihcbiAgICAgICAgICAgIFBhcnNlLkVycm9yLkVNQUlMX1RBS0VOLFxuICAgICAgICAgICAgJ0FjY291bnQgYWxyZWFkeSBleGlzdHMgZm9yIHRoaXMgZW1haWwgYWRkcmVzcy4nXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIHRoaXMgd2FzIGEgZmFpbGVkIHVzZXIgY3JlYXRpb24gZHVlIHRvIHVzZXJuYW1lIG9yIGVtYWlsIGFscmVhZHkgdGFrZW4sIHdlIG5lZWQgdG9cbiAgICAgICAgLy8gY2hlY2sgd2hldGhlciBpdCB3YXMgdXNlcm5hbWUgb3IgZW1haWwgYW5kIHJldHVybiB0aGUgYXBwcm9wcmlhdGUgZXJyb3IuXG4gICAgICAgIC8vIEZhbGxiYWNrIHRvIHRoZSBvcmlnaW5hbCBtZXRob2RcbiAgICAgICAgLy8gVE9ETzogU2VlIGlmIHdlIGNhbiBsYXRlciBkbyB0aGlzIHdpdGhvdXQgYWRkaXRpb25hbCBxdWVyaWVzIGJ5IHVzaW5nIG5hbWVkIGluZGV4ZXMuXG4gICAgICAgIHJldHVybiB0aGlzLmNvbmZpZy5kYXRhYmFzZVxuICAgICAgICAgIC5maW5kKFxuICAgICAgICAgICAgdGhpcy5jbGFzc05hbWUsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHVzZXJuYW1lOiB0aGlzLmRhdGEudXNlcm5hbWUsXG4gICAgICAgICAgICAgIG9iamVjdElkOiB7ICRuZTogdGhpcy5vYmplY3RJZCgpIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgeyBsaW1pdDogMSB9XG4gICAgICAgICAgKVxuICAgICAgICAgIC50aGVuKHJlc3VsdHMgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3VsdHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoXG4gICAgICAgICAgICAgICAgUGFyc2UuRXJyb3IuVVNFUk5BTUVfVEFLRU4sXG4gICAgICAgICAgICAgICAgJ0FjY291bnQgYWxyZWFkeSBleGlzdHMgZm9yIHRoaXMgdXNlcm5hbWUuJ1xuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29uZmlnLmRhdGFiYXNlLmZpbmQoXG4gICAgICAgICAgICAgIHRoaXMuY2xhc3NOYW1lLFxuICAgICAgICAgICAgICB7IGVtYWlsOiB0aGlzLmRhdGEuZW1haWwsIG9iamVjdElkOiB7ICRuZTogdGhpcy5vYmplY3RJZCgpIH0gfSxcbiAgICAgICAgICAgICAgeyBsaW1pdDogMSB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLnRoZW4ocmVzdWx0cyA9PiB7XG4gICAgICAgICAgICBpZiAocmVzdWx0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihcbiAgICAgICAgICAgICAgICBQYXJzZS5FcnJvci5FTUFJTF9UQUtFTixcbiAgICAgICAgICAgICAgICAnQWNjb3VudCBhbHJlYWR5IGV4aXN0cyBmb3IgdGhpcyBlbWFpbCBhZGRyZXNzLidcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihcbiAgICAgICAgICAgICAgUGFyc2UuRXJyb3IuRFVQTElDQVRFX1ZBTFVFLFxuICAgICAgICAgICAgICAnQSBkdXBsaWNhdGUgdmFsdWUgZm9yIGEgZmllbGQgd2l0aCB1bmlxdWUgdmFsdWVzIHdhcyBwcm92aWRlZCdcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSk7XG4gICAgICB9KVxuICAgICAgLnRoZW4ocmVzcG9uc2UgPT4ge1xuICAgICAgICByZXNwb25zZS5vYmplY3RJZCA9IHRoaXMuZGF0YS5vYmplY3RJZDtcbiAgICAgICAgcmVzcG9uc2UuY3JlYXRlZEF0ID0gdGhpcy5kYXRhLmNyZWF0ZWRBdDtcblxuICAgICAgICBpZiAodGhpcy5yZXNwb25zZVNob3VsZEhhdmVVc2VybmFtZSkge1xuICAgICAgICAgIHJlc3BvbnNlLnVzZXJuYW1lID0gdGhpcy5kYXRhLnVzZXJuYW1lO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3VwZGF0ZVJlc3BvbnNlV2l0aERhdGEocmVzcG9uc2UsIHRoaXMuZGF0YSk7XG4gICAgICAgIHRoaXMucmVzcG9uc2UgPSB7XG4gICAgICAgICAgc3RhdHVzOiAyMDEsXG4gICAgICAgICAgcmVzcG9uc2UsXG4gICAgICAgICAgbG9jYXRpb246IHRoaXMubG9jYXRpb24oKSxcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICB9XG59O1xuXG4vLyBSZXR1cm5zIG5vdGhpbmcgLSBkb2Vzbid0IHdhaXQgZm9yIHRoZSB0cmlnZ2VyLlxuUmVzdFdyaXRlLnByb3RvdHlwZS5ydW5BZnRlclNhdmVUcmlnZ2VyID0gZnVuY3Rpb24gKCkge1xuICBpZiAoIXRoaXMucmVzcG9uc2UgfHwgIXRoaXMucmVzcG9uc2UucmVzcG9uc2UgfHwgdGhpcy5ydW5PcHRpb25zLm1hbnkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBBdm9pZCBkb2luZyBhbnkgc2V0dXAgZm9yIHRyaWdnZXJzIGlmIHRoZXJlIGlzIG5vICdhZnRlclNhdmUnIHRyaWdnZXIgZm9yIHRoaXMgY2xhc3MuXG4gIGNvbnN0IGhhc0FmdGVyU2F2ZUhvb2sgPSB0cmlnZ2Vycy50cmlnZ2VyRXhpc3RzKFxuICAgIHRoaXMuY2xhc3NOYW1lLFxuICAgIHRyaWdnZXJzLlR5cGVzLmFmdGVyU2F2ZSxcbiAgICB0aGlzLmNvbmZpZy5hcHBsaWNhdGlvbklkXG4gICk7XG4gIGNvbnN0IGhhc0xpdmVRdWVyeSA9IHRoaXMuY29uZmlnLmxpdmVRdWVyeUNvbnRyb2xsZXIuaGFzTGl2ZVF1ZXJ5KHRoaXMuY2xhc3NOYW1lKTtcbiAgaWYgKCFoYXNBZnRlclNhdmVIb29rICYmICFoYXNMaXZlUXVlcnkpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIH1cblxuICBjb25zdCB7IG9yaWdpbmFsT2JqZWN0LCB1cGRhdGVkT2JqZWN0IH0gPSB0aGlzLmJ1aWxkUGFyc2VPYmplY3RzKCk7XG4gIHVwZGF0ZWRPYmplY3QuX2hhbmRsZVNhdmVSZXNwb25zZSh0aGlzLnJlc3BvbnNlLnJlc3BvbnNlLCB0aGlzLnJlc3BvbnNlLnN0YXR1cyB8fCAyMDApO1xuXG4gIHRoaXMuY29uZmlnLmRhdGFiYXNlLmxvYWRTY2hlbWEoKS50aGVuKHNjaGVtYUNvbnRyb2xsZXIgPT4ge1xuICAgIC8vIE5vdGlmaXkgTGl2ZVF1ZXJ5U2VydmVyIGlmIHBvc3NpYmxlXG4gICAgY29uc3QgcGVybXMgPSBzY2hlbWFDb250cm9sbGVyLmdldENsYXNzTGV2ZWxQZXJtaXNzaW9ucyh1cGRhdGVkT2JqZWN0LmNsYXNzTmFtZSk7XG4gICAgdGhpcy5jb25maWcubGl2ZVF1ZXJ5Q29udHJvbGxlci5vbkFmdGVyU2F2ZShcbiAgICAgIHVwZGF0ZWRPYmplY3QuY2xhc3NOYW1lLFxuICAgICAgdXBkYXRlZE9iamVjdCxcbiAgICAgIG9yaWdpbmFsT2JqZWN0LFxuICAgICAgcGVybXNcbiAgICApO1xuICB9KTtcblxuICAvLyBSdW4gYWZ0ZXJTYXZlIHRyaWdnZXJcbiAgcmV0dXJuIHRyaWdnZXJzXG4gICAgLm1heWJlUnVuVHJpZ2dlcihcbiAgICAgIHRyaWdnZXJzLlR5cGVzLmFmdGVyU2F2ZSxcbiAgICAgIHRoaXMuYXV0aCxcbiAgICAgIHVwZGF0ZWRPYmplY3QsXG4gICAgICBvcmlnaW5hbE9iamVjdCxcbiAgICAgIHRoaXMuY29uZmlnLFxuICAgICAgdGhpcy5jb250ZXh0XG4gICAgKVxuICAgIC50aGVuKHJlc3VsdCA9PiB7XG4gICAgICBjb25zdCBqc29uUmV0dXJuZWQgPSByZXN1bHQgJiYgIXJlc3VsdC5fdG9GdWxsSlNPTjtcbiAgICAgIGlmIChqc29uUmV0dXJuZWQpIHtcbiAgICAgICAgdGhpcy5wZW5kaW5nT3BzLm9wZXJhdGlvbnMgPSB7fTtcbiAgICAgICAgdGhpcy5yZXNwb25zZS5yZXNwb25zZSA9IHJlc3VsdDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucmVzcG9uc2UucmVzcG9uc2UgPSB0aGlzLl91cGRhdGVSZXNwb25zZVdpdGhEYXRhKFxuICAgICAgICAgIChyZXN1bHQgfHwgdXBkYXRlZE9iamVjdCkudG9KU09OKCksXG4gICAgICAgICAgdGhpcy5kYXRhXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSlcbiAgICAuY2F0Y2goZnVuY3Rpb24gKGVycikge1xuICAgICAgbG9nZ2VyLndhcm4oJ2FmdGVyU2F2ZSBjYXVnaHQgYW4gZXJyb3InLCBlcnIpO1xuICAgIH0pO1xufTtcblxuLy8gQSBoZWxwZXIgdG8gZmlndXJlIG91dCB3aGF0IGxvY2F0aW9uIHRoaXMgb3BlcmF0aW9uIGhhcHBlbnMgYXQuXG5SZXN0V3JpdGUucHJvdG90eXBlLmxvY2F0aW9uID0gZnVuY3Rpb24gKCkge1xuICB2YXIgbWlkZGxlID0gdGhpcy5jbGFzc05hbWUgPT09ICdfVXNlcicgPyAnL3VzZXJzLycgOiAnL2NsYXNzZXMvJyArIHRoaXMuY2xhc3NOYW1lICsgJy8nO1xuICBjb25zdCBtb3VudCA9IHRoaXMuY29uZmlnLm1vdW50IHx8IHRoaXMuY29uZmlnLnNlcnZlclVSTDtcbiAgcmV0dXJuIG1vdW50ICsgbWlkZGxlICsgdGhpcy5kYXRhLm9iamVjdElkO1xufTtcblxuLy8gQSBoZWxwZXIgdG8gZ2V0IHRoZSBvYmplY3QgaWQgZm9yIHRoaXMgb3BlcmF0aW9uLlxuLy8gQmVjYXVzZSBpdCBjb3VsZCBiZSBlaXRoZXIgb24gdGhlIHF1ZXJ5IG9yIG9uIHRoZSBkYXRhXG5SZXN0V3JpdGUucHJvdG90eXBlLm9iamVjdElkID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5kYXRhLm9iamVjdElkIHx8IHRoaXMucXVlcnkub2JqZWN0SWQ7XG59O1xuXG4vLyBSZXR1cm5zIGEgY29weSBvZiB0aGUgZGF0YSBhbmQgZGVsZXRlIGJhZCBrZXlzIChfYXV0aF9kYXRhLCBfaGFzaGVkX3Bhc3N3b3JkLi4uKVxuUmVzdFdyaXRlLnByb3RvdHlwZS5zYW5pdGl6ZWREYXRhID0gZnVuY3Rpb24gKCkge1xuICBjb25zdCBkYXRhID0gT2JqZWN0LmtleXModGhpcy5kYXRhKS5yZWR1Y2UoKGRhdGEsIGtleSkgPT4ge1xuICAgIC8vIFJlZ2V4cCBjb21lcyBmcm9tIFBhcnNlLk9iamVjdC5wcm90b3R5cGUudmFsaWRhdGVcbiAgICBpZiAoIS9eW0EtWmEtel1bMC05QS1aYS16X10qJC8udGVzdChrZXkpKSB7XG4gICAgICBkZWxldGUgZGF0YVtrZXldO1xuICAgIH1cbiAgICByZXR1cm4gZGF0YTtcbiAgfSwgZGVlcGNvcHkodGhpcy5kYXRhKSk7XG4gIHJldHVybiBQYXJzZS5fZGVjb2RlKHVuZGVmaW5lZCwgZGF0YSk7XG59O1xuXG4vLyBSZXR1cm5zIGFuIHVwZGF0ZWQgY29weSBvZiB0aGUgb2JqZWN0XG5SZXN0V3JpdGUucHJvdG90eXBlLmJ1aWxkUGFyc2VPYmplY3RzID0gZnVuY3Rpb24gKCkge1xuICBjb25zdCBleHRyYURhdGEgPSB7IGNsYXNzTmFtZTogdGhpcy5jbGFzc05hbWUsIG9iamVjdElkOiB0aGlzLnF1ZXJ5Py5vYmplY3RJZCB9O1xuICBsZXQgb3JpZ2luYWxPYmplY3Q7XG4gIGlmICh0aGlzLnF1ZXJ5ICYmIHRoaXMucXVlcnkub2JqZWN0SWQpIHtcbiAgICBvcmlnaW5hbE9iamVjdCA9IHRyaWdnZXJzLmluZmxhdGUoZXh0cmFEYXRhLCB0aGlzLm9yaWdpbmFsRGF0YSk7XG4gIH1cblxuICBjb25zdCBjbGFzc05hbWUgPSBQYXJzZS5PYmplY3QuZnJvbUpTT04oZXh0cmFEYXRhKTtcbiAgY29uc3QgcmVhZE9ubHlBdHRyaWJ1dGVzID0gY2xhc3NOYW1lLmNvbnN0cnVjdG9yLnJlYWRPbmx5QXR0cmlidXRlc1xuICAgID8gY2xhc3NOYW1lLmNvbnN0cnVjdG9yLnJlYWRPbmx5QXR0cmlidXRlcygpXG4gICAgOiBbXTtcbiAgaWYgKCF0aGlzLm9yaWdpbmFsRGF0YSkge1xuICAgIGZvciAoY29uc3QgYXR0cmlidXRlIG9mIHJlYWRPbmx5QXR0cmlidXRlcykge1xuICAgICAgZXh0cmFEYXRhW2F0dHJpYnV0ZV0gPSB0aGlzLmRhdGFbYXR0cmlidXRlXTtcbiAgICB9XG4gIH1cbiAgY29uc3QgdXBkYXRlZE9iamVjdCA9IHRyaWdnZXJzLmluZmxhdGUoZXh0cmFEYXRhLCB0aGlzLm9yaWdpbmFsRGF0YSk7XG4gIE9iamVjdC5rZXlzKHRoaXMuZGF0YSkucmVkdWNlKGZ1bmN0aW9uIChkYXRhLCBrZXkpIHtcbiAgICBpZiAoa2V5LmluZGV4T2YoJy4nKSA+IDApIHtcbiAgICAgIGlmICh0eXBlb2YgZGF0YVtrZXldLl9fb3AgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGlmICghcmVhZE9ubHlBdHRyaWJ1dGVzLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgICAgICB1cGRhdGVkT2JqZWN0LnNldChrZXksIGRhdGFba2V5XSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHN1YmRvY3VtZW50IGtleSB3aXRoIGRvdCBub3RhdGlvbiB7ICd4LnknOiB2IH0gPT4geyAneCc6IHsgJ3knIDogdiB9IH0pXG4gICAgICAgIGNvbnN0IHNwbGl0dGVkS2V5ID0ga2V5LnNwbGl0KCcuJyk7XG4gICAgICAgIGNvbnN0IHBhcmVudFByb3AgPSBzcGxpdHRlZEtleVswXTtcbiAgICAgICAgbGV0IHBhcmVudFZhbCA9IHVwZGF0ZWRPYmplY3QuZ2V0KHBhcmVudFByb3ApO1xuICAgICAgICBpZiAodHlwZW9mIHBhcmVudFZhbCAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgICBwYXJlbnRWYWwgPSB7fTtcbiAgICAgICAgfVxuICAgICAgICBwYXJlbnRWYWxbc3BsaXR0ZWRLZXlbMV1dID0gZGF0YVtrZXldO1xuICAgICAgICB1cGRhdGVkT2JqZWN0LnNldChwYXJlbnRQcm9wLCBwYXJlbnRWYWwpO1xuICAgICAgfVxuICAgICAgZGVsZXRlIGRhdGFba2V5XTtcbiAgICB9XG4gICAgcmV0dXJuIGRhdGE7XG4gIH0sIGRlZXBjb3B5KHRoaXMuZGF0YSkpO1xuXG4gIGNvbnN0IHNhbml0aXplZCA9IHRoaXMuc2FuaXRpemVkRGF0YSgpO1xuICBmb3IgKGNvbnN0IGF0dHJpYnV0ZSBvZiByZWFkT25seUF0dHJpYnV0ZXMpIHtcbiAgICBkZWxldGUgc2FuaXRpemVkW2F0dHJpYnV0ZV07XG4gIH1cbiAgdXBkYXRlZE9iamVjdC5zZXQoc2FuaXRpemVkKTtcbiAgcmV0dXJuIHsgdXBkYXRlZE9iamVjdCwgb3JpZ2luYWxPYmplY3QgfTtcbn07XG5cblJlc3RXcml0ZS5wcm90b3R5cGUuY2xlYW5Vc2VyQXV0aERhdGEgPSBmdW5jdGlvbiAoKSB7XG4gIGlmICh0aGlzLnJlc3BvbnNlICYmIHRoaXMucmVzcG9uc2UucmVzcG9uc2UgJiYgdGhpcy5jbGFzc05hbWUgPT09ICdfVXNlcicpIHtcbiAgICBjb25zdCB1c2VyID0gdGhpcy5yZXNwb25zZS5yZXNwb25zZTtcbiAgICBpZiAodXNlci5hdXRoRGF0YSkge1xuICAgICAgT2JqZWN0LmtleXModXNlci5hdXRoRGF0YSkuZm9yRWFjaChwcm92aWRlciA9PiB7XG4gICAgICAgIGlmICh1c2VyLmF1dGhEYXRhW3Byb3ZpZGVyXSA9PT0gbnVsbCkge1xuICAgICAgICAgIGRlbGV0ZSB1c2VyLmF1dGhEYXRhW3Byb3ZpZGVyXTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBpZiAoT2JqZWN0LmtleXModXNlci5hdXRoRGF0YSkubGVuZ3RoID09IDApIHtcbiAgICAgICAgZGVsZXRlIHVzZXIuYXV0aERhdGE7XG4gICAgICB9XG4gICAgfVxuICB9XG59O1xuXG5SZXN0V3JpdGUucHJvdG90eXBlLl91cGRhdGVSZXNwb25zZVdpdGhEYXRhID0gZnVuY3Rpb24gKHJlc3BvbnNlLCBkYXRhKSB7XG4gIGNvbnN0IHN0YXRlQ29udHJvbGxlciA9IFBhcnNlLkNvcmVNYW5hZ2VyLmdldE9iamVjdFN0YXRlQ29udHJvbGxlcigpO1xuICBjb25zdCBbcGVuZGluZ10gPSBzdGF0ZUNvbnRyb2xsZXIuZ2V0UGVuZGluZ09wcyh0aGlzLnBlbmRpbmdPcHMuaWRlbnRpZmllcik7XG4gIGZvciAoY29uc3Qga2V5IGluIHRoaXMucGVuZGluZ09wcy5vcGVyYXRpb25zKSB7XG4gICAgaWYgKCFwZW5kaW5nW2tleV0pIHtcbiAgICAgIGRhdGFba2V5XSA9IHRoaXMub3JpZ2luYWxEYXRhID8gdGhpcy5vcmlnaW5hbERhdGFba2V5XSA6IHsgX19vcDogJ0RlbGV0ZScgfTtcbiAgICAgIHRoaXMuc3RvcmFnZS5maWVsZHNDaGFuZ2VkQnlUcmlnZ2VyLnB1c2goa2V5KTtcbiAgICB9XG4gIH1cbiAgY29uc3Qgc2tpcEtleXMgPSBbLi4uKHJlcXVpcmVkQ29sdW1ucy5yZWFkW3RoaXMuY2xhc3NOYW1lXSB8fCBbXSldO1xuICBpZiAoIXRoaXMucXVlcnkpIHtcbiAgICBza2lwS2V5cy5wdXNoKCdvYmplY3RJZCcsICdjcmVhdGVkQXQnKTtcbiAgfSBlbHNlIHtcbiAgICBza2lwS2V5cy5wdXNoKCd1cGRhdGVkQXQnKTtcbiAgICBkZWxldGUgcmVzcG9uc2Uub2JqZWN0SWQ7XG4gIH1cbiAgZm9yIChjb25zdCBrZXkgaW4gcmVzcG9uc2UpIHtcbiAgICBpZiAoc2tpcEtleXMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IHZhbHVlID0gcmVzcG9uc2Vba2V5XTtcbiAgICBpZiAoXG4gICAgICB2YWx1ZSA9PSBudWxsIHx8XG4gICAgICAodmFsdWUuX190eXBlICYmIHZhbHVlLl9fdHlwZSA9PT0gJ1BvaW50ZXInKSB8fFxuICAgICAgdXRpbC5pc0RlZXBTdHJpY3RFcXVhbChkYXRhW2tleV0sIHZhbHVlKSB8fFxuICAgICAgdXRpbC5pc0RlZXBTdHJpY3RFcXVhbCgodGhpcy5vcmlnaW5hbERhdGEgfHwge30pW2tleV0sIHZhbHVlKVxuICAgICkge1xuICAgICAgZGVsZXRlIHJlc3BvbnNlW2tleV07XG4gICAgfVxuICB9XG4gIGlmIChfLmlzRW1wdHkodGhpcy5zdG9yYWdlLmZpZWxkc0NoYW5nZWRCeVRyaWdnZXIpKSB7XG4gICAgcmV0dXJuIHJlc3BvbnNlO1xuICB9XG4gIGNvbnN0IGNsaWVudFN1cHBvcnRzRGVsZXRlID0gQ2xpZW50U0RLLnN1cHBvcnRzRm9yd2FyZERlbGV0ZSh0aGlzLmNsaWVudFNESyk7XG4gIHRoaXMuc3RvcmFnZS5maWVsZHNDaGFuZ2VkQnlUcmlnZ2VyLmZvckVhY2goZmllbGROYW1lID0+IHtcbiAgICBjb25zdCBkYXRhVmFsdWUgPSBkYXRhW2ZpZWxkTmFtZV07XG5cbiAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChyZXNwb25zZSwgZmllbGROYW1lKSkge1xuICAgICAgcmVzcG9uc2VbZmllbGROYW1lXSA9IGRhdGFWYWx1ZTtcbiAgICB9XG5cbiAgICAvLyBTdHJpcHMgb3BlcmF0aW9ucyBmcm9tIHJlc3BvbnNlc1xuICAgIGlmIChyZXNwb25zZVtmaWVsZE5hbWVdICYmIHJlc3BvbnNlW2ZpZWxkTmFtZV0uX19vcCkge1xuICAgICAgZGVsZXRlIHJlc3BvbnNlW2ZpZWxkTmFtZV07XG4gICAgICBpZiAoY2xpZW50U3VwcG9ydHNEZWxldGUgJiYgZGF0YVZhbHVlLl9fb3AgPT0gJ0RlbGV0ZScpIHtcbiAgICAgICAgcmVzcG9uc2VbZmllbGROYW1lXSA9IGRhdGFWYWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuICByZXR1cm4gcmVzcG9uc2U7XG59O1xuXG5SZXN0V3JpdGUucHJvdG90eXBlLmNoZWNrUHJvaGliaXRlZEtleXdvcmRzID0gZnVuY3Rpb24gKGRhdGEpIHtcbiAgaWYgKHRoaXMuY29uZmlnLnJlcXVlc3RLZXl3b3JkRGVueWxpc3QpIHtcbiAgICAvLyBTY2FuIHJlcXVlc3QgZGF0YSBmb3IgZGVuaWVkIGtleXdvcmRzXG4gICAgZm9yIChjb25zdCBrZXl3b3JkIG9mIHRoaXMuY29uZmlnLnJlcXVlc3RLZXl3b3JkRGVueWxpc3QpIHtcbiAgICAgIGNvbnN0IG1hdGNoID0gVXRpbHMub2JqZWN0Q29udGFpbnNLZXlWYWx1ZShkYXRhLCBrZXl3b3JkLmtleSwga2V5d29yZC52YWx1ZSk7XG4gICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFxuICAgICAgICAgIFBhcnNlLkVycm9yLklOVkFMSURfS0VZX05BTUUsXG4gICAgICAgICAgYFByb2hpYml0ZWQga2V5d29yZCBpbiByZXF1ZXN0IGRhdGE6ICR7SlNPTi5zdHJpbmdpZnkoa2V5d29yZCl9LmBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IFJlc3RXcml0ZTtcbm1vZHVsZS5leHBvcnRzID0gUmVzdFdyaXRlO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFlQTtBQUNBO0FBQ0E7QUFDQTtBQUFpRTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFsQmpFO0FBQ0E7QUFDQTs7QUFFQSxJQUFJQSxnQkFBZ0IsR0FBR0MsT0FBTyxDQUFDLGdDQUFnQyxDQUFDO0FBQ2hFLElBQUlDLFFBQVEsR0FBR0QsT0FBTyxDQUFDLFVB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