parse-server 6.2.0 → 6.3.0-alpha.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -13,6 +13,11 @@ var _node = _interopRequireDefault(require("parse/node"));
13
13
  var _AccountLockout = _interopRequireDefault(require("../AccountLockout"));
14
14
  var _Config = _interopRequireDefault(require("../Config"));
15
15
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
16
+ 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; }
17
+ 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; }
18
+ 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; }
19
+ function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
20
+ 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); }
16
21
  var RestQuery = require('../RestQuery');
17
22
  var Auth = require('../Auth');
18
23
  class UserController extends _AdaptableController.default {
@@ -33,16 +38,26 @@ class UserController extends _AdaptableController.default {
33
38
  return _MailAdapter.default;
34
39
  }
35
40
  get shouldVerifyEmails() {
36
- return this.options.verifyUserEmails;
41
+ return (this.config || this.options).verifyUserEmails;
37
42
  }
38
- setEmailVerifyToken(user) {
39
- if (this.shouldVerifyEmails) {
40
- user._email_verify_token = (0, _cryptoUtils.randomString)(25);
43
+ async setEmailVerifyToken(user, req, storage = {}) {
44
+ let shouldSendEmail = this.shouldVerifyEmails;
45
+ if (typeof shouldSendEmail === 'function') {
46
+ const response = await Promise.resolve(shouldSendEmail(req));
47
+ shouldSendEmail = response !== false;
48
+ }
49
+ if (!shouldSendEmail) {
50
+ return false;
51
+ }
52
+ storage.sendVerificationEmail = true;
53
+ user._email_verify_token = (0, _cryptoUtils.randomString)(25);
54
+ if (!storage.fieldsChangedByTrigger || !storage.fieldsChangedByTrigger.includes('emailVerified')) {
41
55
  user.emailVerified = false;
42
- if (this.config.emailVerifyTokenValidityDuration) {
43
- user._email_verify_token_expires_at = _node.default._encode(this.config.generateEmailVerifyTokenExpiresAt());
44
- }
45
56
  }
57
+ if (this.config.emailVerifyTokenValidityDuration) {
58
+ user._email_verify_token_expires_at = _node.default._encode(this.config.generateEmailVerifyTokenExpiresAt());
59
+ }
60
+ return true;
46
61
  }
47
62
  verifyEmail(username, token) {
48
63
  if (!this.shouldVerifyEmails) {
@@ -124,26 +139,39 @@ class UserController extends _AdaptableController.default {
124
139
  return result.results[0];
125
140
  });
126
141
  }
127
- sendVerificationEmail(user) {
142
+ async sendVerificationEmail(user, req) {
128
143
  if (!this.shouldVerifyEmails) {
129
144
  return;
130
145
  }
131
146
  const token = encodeURIComponent(user._email_verify_token);
132
147
  // We may need to fetch the user in case of update email
133
- this.getUserIfNeeded(user).then(user => {
134
- const username = encodeURIComponent(user.username);
135
- const link = buildEmailLink(this.config.verifyEmailURL, username, token, this.config);
136
- const options = {
137
- appName: this.config.appName,
138
- link: link,
139
- user: (0, _triggers.inflate)('_User', user)
140
- };
141
- if (this.adapter.sendVerificationEmail) {
142
- this.adapter.sendVerificationEmail(options);
143
- } else {
144
- this.adapter.sendMail(this.defaultVerificationEmail(options));
145
- }
146
- });
148
+ const fetchedUser = await this.getUserIfNeeded(user);
149
+ let shouldSendEmail = this.config.sendUserEmailVerification;
150
+ if (typeof shouldSendEmail === 'function') {
151
+ var _req$auth;
152
+ const response = await Promise.resolve(this.config.sendUserEmailVerification({
153
+ user: _node.default.Object.fromJSON(_objectSpread({
154
+ className: '_User'
155
+ }, fetchedUser)),
156
+ master: (_req$auth = req.auth) === null || _req$auth === void 0 ? void 0 : _req$auth.isMaster
157
+ }));
158
+ shouldSendEmail = !!response;
159
+ }
160
+ if (!shouldSendEmail) {
161
+ return;
162
+ }
163
+ const username = encodeURIComponent(user.username);
164
+ const link = buildEmailLink(this.config.verifyEmailURL, username, token, this.config);
165
+ const options = {
166
+ appName: this.config.appName,
167
+ link: link,
168
+ user: (0, _triggers.inflate)('_User', fetchedUser)
169
+ };
170
+ if (this.adapter.sendVerificationEmail) {
171
+ this.adapter.sendVerificationEmail(options);
172
+ } else {
173
+ this.adapter.sendMail(this.defaultVerificationEmail(options));
174
+ }
147
175
  }
148
176
 
149
177
  /**
@@ -152,7 +180,7 @@ class UserController extends _AdaptableController.default {
152
180
  * @param user
153
181
  * @returns {*}
154
182
  */
155
- regenerateEmailVerifyToken(user) {
183
+ async regenerateEmailVerifyToken(user, master) {
156
184
  const {
157
185
  _email_verify_token
158
186
  } = user;
@@ -165,22 +193,29 @@ class UserController extends _AdaptableController.default {
165
193
  if (this.config.emailVerifyTokenReuseIfValid && this.config.emailVerifyTokenValidityDuration && _email_verify_token && new Date() < new Date(_email_verify_token_expires_at)) {
166
194
  return Promise.resolve();
167
195
  }
168
- this.setEmailVerifyToken(user);
196
+ const shouldSend = await this.setEmailVerifyToken(user, {
197
+ user,
198
+ master
199
+ });
200
+ if (!shouldSend) {
201
+ return;
202
+ }
169
203
  return this.config.database.update('_User', {
170
204
  username: user.username
171
205
  }, user);
172
206
  }
173
- resendVerificationEmail(username) {
174
- return this.getUserIfNeeded({
207
+ async resendVerificationEmail(username, req) {
208
+ var _req$auth2;
209
+ const aUser = await this.getUserIfNeeded({
175
210
  username: username
176
- }).then(aUser => {
177
- if (!aUser || aUser.emailVerified) {
178
- throw undefined;
179
- }
180
- return this.regenerateEmailVerifyToken(aUser).then(() => {
181
- this.sendVerificationEmail(aUser);
182
- });
183
211
  });
212
+ if (!aUser || aUser.emailVerified) {
213
+ throw undefined;
214
+ }
215
+ const generate = await this.regenerateEmailVerifyToken(aUser, (_req$auth2 = req.auth) === null || _req$auth2 === void 0 ? void 0 : _req$auth2.isMaster);
216
+ if (generate) {
217
+ this.sendVerificationEmail(aUser, req);
218
+ }
184
219
  }
185
220
  setPasswordResetToken(email) {
186
221
  const token = {
@@ -317,4 +352,4 @@ function buildEmailLink(destination, username, token, config) {
317
352
  }
318
353
  var _default = UserController;
319
354
  exports.default = _default;
320
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZXN0UXVlcnkiLCJyZXF1aXJlIiwiQXV0aCIsIlVzZXJDb250cm9sbGVyIiwiQWRhcHRhYmxlQ29udHJvbGxlciIsImNvbnN0cnVjdG9yIiwiYWRhcHRlciIsImFwcElkIiwib3B0aW9ucyIsImNvbmZpZyIsIkNvbmZpZyIsImdldCIsInZhbGlkYXRlQWRhcHRlciIsInNob3VsZFZlcmlmeUVtYWlscyIsImV4cGVjdGVkQWRhcHRlclR5cGUiLCJNYWlsQWRhcHRlciIsInZlcmlmeVVzZXJFbWFpbHMiLCJzZXRFbWFpbFZlcmlmeVRva2VuIiwidXNlciIsIl9lbWFpbF92ZXJpZnlfdG9rZW4iLCJyYW5kb21TdHJpbmciLCJlbWFpbFZlcmlmaWVkIiwiZW1haWxWZXJpZnlUb2tlblZhbGlkaXR5RHVyYXRpb24iLCJfZW1haWxfdmVyaWZ5X3Rva2VuX2V4cGlyZXNfYXQiLCJQYXJzZSIsIl9lbmNvZGUiLCJnZW5lcmF0ZUVtYWlsVmVyaWZ5VG9rZW5FeHBpcmVzQXQiLCJ2ZXJpZnlFbWFpbCIsInVzZXJuYW1lIiwidG9rZW4iLCJ1bmRlZmluZWQiLCJxdWVyeSIsInVwZGF0ZUZpZWxkcyIsIl9fb3AiLCIkZ3QiLCJEYXRlIiwibWFpbnRlbmFuY2VBdXRoIiwibWFpbnRlbmFuY2UiLCJmaW5kVXNlckZvckVtYWlsVmVyaWZpY2F0aW9uIiwiZXhlY3V0ZSIsInRoZW4iLCJyZXN1bHQiLCJyZXN1bHRzIiwibGVuZ3RoIiwiUHJvbWlzZSIsInJlc29sdmUiLCJvYmplY3RJZCIsInJlc3QiLCJ1cGRhdGUiLCJjaGVja1Jlc2V0VG9rZW5WYWxpZGl0eSIsImRhdGFiYXNlIiwiZmluZCIsIl9wZXJpc2hhYmxlX3Rva2VuIiwibGltaXQiLCJwYXNzd29yZFBvbGljeSIsInJlc2V0VG9rZW5WYWxpZGl0eUR1cmF0aW9uIiwiZXhwaXJlc0RhdGUiLCJfcGVyaXNoYWJsZV90b2tlbl9leHBpcmVzX2F0IiwiX190eXBlIiwiaXNvIiwiZ2V0VXNlcklmTmVlZGVkIiwiZW1haWwiLCJ3aGVyZSIsIm1hc3RlciIsInNlbmRWZXJpZmljYXRpb25FbWFpbCIsImVuY29kZVVSSUNvbXBvbmVudCIsImxpbmsiLCJidWlsZEVtYWlsTGluayIsInZlcmlmeUVtYWlsVVJMIiwiYXBwTmFtZSIsImluZmxhdGUiLCJzZW5kTWFpbCIsImRlZmF1bHRWZXJpZmljYXRpb25FbWFpbCIsInJlZ2VuZXJhdGVFbWFpbFZlcmlmeVRva2VuIiwiZW1haWxWZXJpZnlUb2tlblJldXNlSWZWYWxpZCIsInJlc2VuZFZlcmlmaWNhdGlvbkVtYWlsIiwiYVVzZXIiLCJzZXRQYXNzd29yZFJlc2V0VG9rZW4iLCJnZW5lcmF0ZVBhc3N3b3JkUmVzZXRUb2tlbkV4cGlyZXNBdCIsIiRvciIsIiRleGlzdHMiLCJzZW5kUGFzc3dvcmRSZXNldEVtYWlsIiwicmVzZXRUb2tlblJldXNlSWZWYWxpZCIsInJlcXVlc3RSZXNldFBhc3N3b3JkVVJMIiwiZGVmYXVsdFJlc2V0UGFzc3dvcmRFbWFpbCIsInVwZGF0ZVBhc3N3b3JkIiwicGFzc3dvcmQiLCJ1cGRhdGVVc2VyUGFzc3dvcmQiLCJhY2NvdW50TG9ja291dFBvbGljeSIsIkFjY291bnRMb2Nrb3V0IiwidW5sb2NrQWNjb3VudCIsImNhdGNoIiwiZXJyb3IiLCJtZXNzYWdlIiwicmVqZWN0IiwidGV4dCIsInRvIiwic3ViamVjdCIsImRlc3RpbmF0aW9uIiwidXNlcm5hbWVBbmRUb2tlbiIsInBhcnNlRnJhbWVVUkwiLCJkZXN0aW5hdGlvbldpdGhvdXRIb3N0IiwicmVwbGFjZSIsInB1YmxpY1NlcnZlclVSTCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9Db250cm9sbGVycy9Vc2VyQ29udHJvbGxlci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyByYW5kb21TdHJpbmcgfSBmcm9tICcuLi9jcnlwdG9VdGlscyc7XG5pbXBvcnQgeyBpbmZsYXRlIH0gZnJvbSAnLi4vdHJpZ2dlcnMnO1xuaW1wb3J0IEFkYXB0YWJsZUNvbnRyb2xsZXIgZnJvbSAnLi9BZGFwdGFibGVDb250cm9sbGVyJztcbmltcG9ydCBNYWlsQWRhcHRlciBmcm9tICcuLi9BZGFwdGVycy9FbWFpbC9NYWlsQWRhcHRlcic7XG5pbXBvcnQgcmVzdCBmcm9tICcuLi9yZXN0JztcbmltcG9ydCBQYXJzZSBmcm9tICdwYXJzZS9ub2RlJztcbmltcG9ydCBBY2NvdW50TG9ja291dCBmcm9tICcuLi9BY2NvdW50TG9ja291dCc7XG5pbXBvcnQgQ29uZmlnIGZyb20gJy4uL0NvbmZpZyc7XG5cbnZhciBSZXN0UXVlcnkgPSByZXF1aXJlKCcuLi9SZXN0UXVlcnknKTtcbnZhciBBdXRoID0gcmVxdWlyZSgnLi4vQXV0aCcpO1xuXG5leHBvcnQgY2xhc3MgVXNlckNvbnRyb2xsZXIgZXh0ZW5kcyBBZGFwdGFibGVDb250cm9sbGVyIHtcbiAgY29uc3RydWN0b3IoYWRhcHRlciwgYXBwSWQsIG9wdGlvbnMgPSB7fSkge1xuICAgIHN1cGVyKGFkYXB0ZXIsIGFwcElkLCBvcHRpb25zKTtcbiAgfVxuXG4gIGdldCBjb25maWcoKSB7XG4gICAgcmV0dXJuIENvbmZpZy5nZXQodGhpcy5hcHBJZCk7XG4gIH1cblxuICB2YWxpZGF0ZUFkYXB0ZXIoYWRhcHRlcikge1xuICAgIC8vIEFsbG93IG5vIGFkYXB0ZXJcbiAgICBpZiAoIWFkYXB0ZXIgJiYgIXRoaXMuc2hvdWxkVmVyaWZ5RW1haWxzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHN1cGVyLnZhbGlkYXRlQWRhcHRlcihhZGFwdGVyKTtcbiAgfVxuXG4gIGV4cGVjdGVkQWRhcHRlclR5cGUoKSB7XG4gICAgcmV0dXJuIE1haWxBZGFwdGVyO1xuICB9XG5cbiAgZ2V0IHNob3VsZFZlcmlmeUVtYWlscygpIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLnZlcmlmeVVzZXJFbWFpbHM7XG4gIH1cblxuICBzZXRFbWFpbFZlcmlmeVRva2VuKHVzZXIpIHtcbiAgICBpZiAodGhpcy5zaG91bGRWZXJpZnlFbWFpbHMpIHtcbiAgICAgIHVzZXIuX2VtYWlsX3ZlcmlmeV90b2tlbiA9IHJhbmRvbVN0cmluZygyNSk7XG4gICAgICB1c2VyLmVtYWlsVmVyaWZpZWQgPSBmYWxzZTtcblxuICAgICAgaWYgKHRoaXMuY29uZmlnLmVtYWlsVmVyaWZ5VG9rZW5WYWxpZGl0eUR1cmF0aW9uKSB7XG4gICAgICAgIHVzZXIuX2VtYWlsX3ZlcmlmeV90b2tlbl9leHBpcmVzX2F0ID0gUGFyc2UuX2VuY29kZShcbiAgICAgICAgICB0aGlzLmNvbmZpZy5nZW5lcmF0ZUVtYWlsVmVyaWZ5VG9rZW5FeHBpcmVzQXQoKVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHZlcmlmeUVtYWlsKHVzZXJuYW1lLCB0b2tlbikge1xuICAgIGlmICghdGhpcy5zaG91bGRWZXJpZnlFbWFpbHMpIHtcbiAgICAgIC8vIFRyeWluZyB0byB2ZXJpZnkgZW1haWwgd2hlbiBub3QgZW5hYmxlZFxuICAgICAgLy8gVE9ETzogQmV0dGVyIGVycm9yIGhlcmUuXG4gICAgICB0aHJvdyB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgY29uc3QgcXVlcnkgPSB7IHVzZXJuYW1lOiB1c2VybmFtZSwgX2VtYWlsX3ZlcmlmeV90b2tlbjogdG9rZW4gfTtcbiAgICBjb25zdCB1cGRhdGVGaWVsZHMgPSB7XG4gICAgICBlbWFpbFZlcmlmaWVkOiB0cnVlLFxuICAgICAgX2VtYWlsX3ZlcmlmeV90b2tlbjogeyBfX29wOiAnRGVsZXRlJyB9LFxuICAgIH07XG5cbiAgICAvLyBpZiB0aGUgZW1haWwgdmVyaWZ5IHRva2VuIG5lZWRzIHRvIGJlIHZhbGlkYXRlZCB0aGVuXG4gICAgLy8gYWRkIGFkZGl0aW9uYWwgcXVlcnkgcGFyYW1zIGFuZCBhZGRpdGlvbmFsIGZpZWxkcyB0aGF0IG5lZWQgdG8gYmUgdXBkYXRlZFxuICAgIGlmICh0aGlzLmNvbmZpZy5lbWFpbFZlcmlmeVRva2VuVmFsaWRpdHlEdXJhdGlvbikge1xuICAgICAgcXVlcnkuZW1haWxWZXJpZmllZCA9IGZhbHNlO1xuICAgICAgcXVlcnkuX2VtYWlsX3ZlcmlmeV90b2tlbl9leHBpcmVzX2F0ID0geyAkZ3Q6IFBhcnNlLl9lbmNvZGUobmV3IERhdGUoKSkgfTtcblxuICAgICAgdXBkYXRlRmllbGRzLl9lbWFpbF92ZXJpZnlfdG9rZW5fZXhwaXJlc19hdCA9IHsgX19vcDogJ0RlbGV0ZScgfTtcbiAgICB9XG4gICAgY29uc3QgbWFpbnRlbmFuY2VBdXRoID0gQXV0aC5tYWludGVuYW5jZSh0aGlzLmNvbmZpZyk7XG4gICAgdmFyIGZpbmRVc2VyRm9yRW1haWxWZXJpZmljYXRpb24gPSBuZXcgUmVzdFF1ZXJ5KHRoaXMuY29uZmlnLCBtYWludGVuYW5jZUF1dGgsICdfVXNlcicsIHtcbiAgICAgIHVzZXJuYW1lLFxuICAgIH0pO1xuICAgIHJldHVybiBmaW5kVXNlckZvckVtYWlsVmVyaWZpY2F0aW9uLmV4ZWN1dGUoKS50aGVuKHJlc3VsdCA9PiB7XG4gICAgICBpZiAocmVzdWx0LnJlc3VsdHMubGVuZ3RoICYmIHJlc3VsdC5yZXN1bHRzWzBdLmVtYWlsVmVyaWZpZWQpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShyZXN1bHQucmVzdWx0cy5sZW5ndGhbMF0pO1xuICAgICAgfSBlbHNlIGlmIChyZXN1bHQucmVzdWx0cy5sZW5ndGgpIHtcbiAgICAgICAgcXVlcnkub2JqZWN0SWQgPSByZXN1bHQucmVzdWx0c1swXS5vYmplY3RJZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN0LnVwZGF0ZSh0aGlzLmNvbmZpZywgbWFpbnRlbmFuY2VBdXRoLCAnX1VzZXInLCBxdWVyeSwgdXBkYXRlRmllbGRzKTtcbiAgICB9KTtcbiAgfVxuXG4gIGNoZWNrUmVzZXRUb2tlblZhbGlkaXR5KHVzZXJuYW1lLCB0b2tlbikge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5kYXRhYmFzZVxuICAgICAgLmZpbmQoXG4gICAgICAgICdfVXNlcicsXG4gICAgICAgIHtcbiAgICAgICAgICB1c2VybmFtZTogdXNlcm5hbWUsXG4gICAgICAgICAgX3BlcmlzaGFibGVfdG9rZW46IHRva2VuLFxuICAgICAgICB9LFxuICAgICAgICB7IGxpbWl0OiAxIH0sXG4gICAgICAgIEF1dGgubWFpbnRlbmFuY2UodGhpcy5jb25maWcpXG4gICAgICApXG4gICAgICAudGhlbihyZXN1bHRzID0+IHtcbiAgICAgICAgaWYgKHJlc3VsdHMubGVuZ3RoICE9IDEpIHtcbiAgICAgICAgICB0aHJvdyAnRmFpbGVkIHRvIHJlc2V0IHBhc3N3b3JkOiB1c2VybmFtZSAvIGVtYWlsIC8gdG9rZW4gaXMgaW52YWxpZCc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5jb25maWcucGFzc3dvcmRQb2xpY3kgJiYgdGhpcy5jb25maWcucGFzc3dvcmRQb2xpY3kucmVzZXRUb2tlblZhbGlkaXR5RHVyYXRpb24pIHtcbiAgICAgICAgICBsZXQgZXhwaXJlc0RhdGUgPSByZXN1bHRzWzBdLl9wZXJpc2hhYmxlX3Rva2VuX2V4cGlyZXNfYXQ7XG4gICAgICAgICAgaWYgKGV4cGlyZXNEYXRlICYmIGV4cGlyZXNEYXRlLl9fdHlwZSA9PSAnRGF0ZScpIHtcbiAgICAgICAgICAgIGV4cGlyZXNEYXRlID0gbmV3IERhdGUoZXhwaXJlc0RhdGUuaXNvKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGV4cGlyZXNEYXRlIDwgbmV3IERhdGUoKSkgdGhyb3cgJ1RoZSBwYXNzd29yZCByZXNldCBsaW5rIGhhcyBleHBpcmVkJztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0c1swXTtcbiAgICAgIH0pO1xuICB9XG5cbiAgZ2V0VXNlcklmTmVlZGVkKHVzZXIpIHtcbiAgICBpZiAodXNlci51c2VybmFtZSAmJiB1c2VyLmVtYWlsKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHVzZXIpO1xuICAgIH1cbiAgICB2YXIgd2hlcmUgPSB7fTtcbiAgICBpZiAodXNlci51c2VybmFtZSkge1xuICAgICAgd2hlcmUudXNlcm5hbWUgPSB1c2VyLnVzZXJuYW1lO1xuICAgIH1cbiAgICBpZiAodXNlci5lbWFpbCkge1xuICAgICAgd2hlcmUuZW1haWwgPSB1c2VyLmVtYWlsO1xuICAgIH1cblxuICAgIHZhciBxdWVyeSA9IG5ldyBSZXN0UXVlcnkodGhpcy5jb25maWcsIEF1dGgubWFzdGVyKHRoaXMuY29uZmlnKSwgJ19Vc2VyJywgd2hlcmUpO1xuICAgIHJldHVybiBxdWVyeS5leGVjdXRlKCkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgICBpZiAocmVzdWx0LnJlc3VsdHMubGVuZ3RoICE9IDEpIHtcbiAgICAgICAgdGhyb3cgdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdC5yZXN1bHRzWzBdO1xuICAgIH0pO1xuICB9XG5cbiAgc2VuZFZlcmlmaWNhdGlvbkVtYWlsKHVzZXIpIHtcbiAgICBpZiAoIXRoaXMuc2hvdWxkVmVyaWZ5RW1haWxzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHRva2VuID0gZW5jb2RlVVJJQ29tcG9uZW50KHVzZXIuX2VtYWlsX3ZlcmlmeV90b2tlbik7XG4gICAgLy8gV2UgbWF5IG5lZWQgdG8gZmV0Y2ggdGhlIHVzZXIgaW4gY2FzZSBvZiB1cGRhdGUgZW1haWxcbiAgICB0aGlzLmdldFVzZXJJZk5lZWRlZCh1c2VyKS50aGVuKHVzZXIgPT4ge1xuICAgICAgY29uc3QgdXNlcm5hbWUgPSBlbmNvZGVVUklDb21wb25lbnQodXNlci51c2VybmFtZSk7XG5cbiAgICAgIGNvbnN0IGxpbmsgPSBidWlsZEVtYWlsTGluayh0aGlzLmNvbmZpZy52ZXJpZnlFbWFpbFVSTCwgdXNlcm5hbWUsIHRva2VuLCB0aGlzLmNvbmZpZyk7XG4gICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBhcHBOYW1lOiB0aGlzLmNvbmZpZy5hcHBOYW1lLFxuICAgICAgICBsaW5rOiBsaW5rLFxuICAgICAgICB1c2VyOiBpbmZsYXRlKCdfVXNlcicsIHVzZXIpLFxuICAgICAgfTtcbiAgICAgIGlmICh0aGlzLmFkYXB0ZXIuc2VuZFZlcmlmaWNhdGlvbkVtYWlsKSB7XG4gICAgICAgIHRoaXMuYWRhcHRlci5zZW5kVmVyaWZpY2F0aW9uRW1haWwob3B0aW9ucyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmFkYXB0ZXIuc2VuZE1haWwodGhpcy5kZWZhdWx0VmVyaWZpY2F0aW9uRW1haWwob3B0aW9ucykpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2VuZXJhdGVzIHRoZSBnaXZlbiB1c2VyJ3MgZW1haWwgdmVyaWZpY2F0aW9uIHRva2VuXG4gICAqXG4gICAqIEBwYXJhbSB1c2VyXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgcmVnZW5lcmF0ZUVtYWlsVmVyaWZ5VG9rZW4odXNlcikge1xuICAgIGNvbnN0IHsgX2VtYWlsX3ZlcmlmeV90b2tlbiB9ID0gdXNlcjtcbiAgICBsZXQgeyBfZW1haWxfdmVyaWZ5X3Rva2VuX2V4cGlyZXNfYXQgfSA9IHVzZXI7XG4gICAgaWYgKF9lbWFpbF92ZXJpZnlfdG9rZW5fZXhwaXJlc19hdCAmJiBfZW1haWxfdmVyaWZ5X3Rva2VuX2V4cGlyZXNfYXQuX190eXBlID09PSAnRGF0ZScpIHtcbiAgICAgIF9lbWFpbF92ZXJpZnlfdG9rZW5fZXhwaXJlc19hdCA9IF9lbWFpbF92ZXJpZnlfdG9rZW5fZXhwaXJlc19hdC5pc287XG4gICAgfVxuICAgIGlmIChcbiAgICAgIHRoaXMuY29uZmlnLmVtYWlsVmVyaWZ5VG9rZW5SZXVzZUlmVmFsaWQgJiZcbiAgICAgIHRoaXMuY29uZmlnLmVtYWlsVmVyaWZ5VG9rZW5WYWxpZGl0eUR1cmF0aW9uICYmXG4gICAgICBfZW1haWxfdmVyaWZ5X3Rva2VuICYmXG4gICAgICBuZXcgRGF0ZSgpIDwgbmV3IERhdGUoX2VtYWlsX3ZlcmlmeV90b2tlbl9leHBpcmVzX2F0KVxuICAgICkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgIH1cbiAgICB0aGlzLnNldEVtYWlsVmVyaWZ5VG9rZW4odXNlcik7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLmRhdGFiYXNlLnVwZGF0ZSgnX1VzZXInLCB7IHVzZXJuYW1lOiB1c2VyLnVzZXJuYW1lIH0sIHVzZXIpO1xuICB9XG5cbiAgcmVzZW5kVmVyaWZpY2F0aW9uRW1haWwodXNlcm5hbWUpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRVc2VySWZOZWVkZWQoeyB1c2VybmFtZTogdXNlcm5hbWUgfSkudGhlbihhVXNlciA9PiB7XG4gICAgICBpZiAoIWFVc2VyIHx8IGFVc2VyLmVtYWlsVmVyaWZpZWQpIHtcbiAgICAgICAgdGhyb3cgdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMucmVnZW5lcmF0ZUVtYWlsVmVyaWZ5VG9rZW4oYVVzZXIpLnRoZW4oKCkgPT4ge1xuICAgICAgICB0aGlzLnNlbmRWZXJpZmljYXRpb25FbWFpbChhVXNlcik7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHNldFBhc3N3b3JkUmVzZXRUb2tlbihlbWFpbCkge1xuICAgIGNvbnN0IHRva2VuID0geyBfcGVyaXNoYWJsZV90b2tlbjogcmFuZG9tU3RyaW5nKDI1KSB9O1xuXG4gICAgaWYgKHRoaXMuY29uZmlnLnBhc3N3b3JkUG9saWN5ICYmIHRoaXMuY29uZmlnLnBhc3N3b3JkUG9saWN5LnJlc2V0VG9rZW5WYWxpZGl0eUR1cmF0aW9uKSB7XG4gICAgICB0b2tlbi5fcGVyaXNoYWJsZV90b2tlbl9leHBpcmVzX2F0ID0gUGFyc2UuX2VuY29kZShcbiAgICAgICAgdGhpcy5jb25maWcuZ2VuZXJhdGVQYXNzd29yZFJlc2V0VG9rZW5FeHBpcmVzQXQoKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5jb25maWcuZGF0YWJhc2UudXBkYXRlKFxuICAgICAgJ19Vc2VyJyxcbiAgICAgIHsgJG9yOiBbeyBlbWFpbCB9LCB7IHVzZXJuYW1lOiBlbWFpbCwgZW1haWw6IHsgJGV4aXN0czogZmFsc2UgfSB9XSB9LFxuICAgICAgdG9rZW4sXG4gICAgICB7fSxcbiAgICAgIHRydWVcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgc2VuZFBhc3N3b3JkUmVzZXRFbWFpbChlbWFpbCkge1xuICAgIGlmICghdGhpcy5hZGFwdGVyKSB7XG4gICAgICB0aHJvdyAnVHJ5aW5nIHRvIHNlbmQgYSByZXNldCBwYXNzd29yZCBidXQgbm8gYWRhcHRlciBpcyBzZXQnO1xuICAgICAgLy8gIFRPRE86IE5vIGFkYXB0ZXI/XG4gICAgfVxuICAgIGxldCB1c2VyO1xuICAgIGlmIChcbiAgICAgIHRoaXMuY29uZmlnLnBhc3N3b3JkUG9saWN5ICYmXG4gICAgICB0aGlzLmNvbmZpZy5wYXNzd29yZFBvbGljeS5yZXNldFRva2VuUmV1c2VJZlZhbGlkICYmXG4gICAgICB0aGlzLmNvbmZpZy5wYXNzd29yZFBvbGljeS5yZXNldFRva2VuVmFsaWRpdHlEdXJhdGlvblxuICAgICkge1xuICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IHRoaXMuY29uZmlnLmRhdGFiYXNlLmZpbmQoXG4gICAgICAgICdfVXNlcicsXG4gICAgICAgIHtcbiAgICAgICAgICAkb3I6IFtcbiAgICAgICAgICAgIHsgZW1haWwsIF9wZXJpc2hhYmxlX3Rva2VuOiB7ICRleGlzdHM6IHRydWUgfSB9LFxuICAgICAgICAgICAgeyB1c2VybmFtZTogZW1haWwsIGVtYWlsOiB7ICRleGlzdHM6IGZhbHNlIH0sIF9wZXJpc2hhYmxlX3Rva2VuOiB7ICRleGlzdHM6IHRydWUgfSB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICAgIHsgbGltaXQ6IDEgfSxcbiAgICAgICAgQXV0aC5tYWludGVuYW5jZSh0aGlzLmNvbmZpZylcbiAgICAgICk7XG4gICAgICBpZiAocmVzdWx0cy5sZW5ndGggPT0gMSkge1xuICAgICAgICBsZXQgZXhwaXJlc0RhdGUgPSByZXN1bHRzWzBdLl9wZXJpc2hhYmxlX3Rva2VuX2V4cGlyZXNfYXQ7XG4gICAgICAgIGlmIChleHBpcmVzRGF0ZSAmJiBleHBpcmVzRGF0ZS5fX3R5cGUgPT0gJ0RhdGUnKSB7XG4gICAgICAgICAgZXhwaXJlc0RhdGUgPSBuZXcgRGF0ZShleHBpcmVzRGF0ZS5pc28pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChleHBpcmVzRGF0ZSA+IG5ldyBEYXRlKCkpIHtcbiAgICAgICAgICB1c2VyID0gcmVzdWx0c1swXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIXVzZXIgfHwgIXVzZXIuX3BlcmlzaGFibGVfdG9rZW4pIHtcbiAgICAgIHVzZXIgPSBhd2FpdCB0aGlzLnNldFBhc3N3b3JkUmVzZXRUb2tlbihlbWFpbCk7XG4gICAgfVxuICAgIGNvbnN0IHRva2VuID0gZW5jb2RlVVJJQ29tcG9uZW50KHVzZXIuX3BlcmlzaGFibGVfdG9rZW4pO1xuICAgIGNvbnN0IHVzZXJuYW1lID0gZW5jb2RlVVJJQ29tcG9uZW50KHVzZXIudXNlcm5hbWUpO1xuXG4gICAgY29uc3QgbGluayA9IGJ1aWxkRW1haWxMaW5rKHRoaXMuY29uZmlnLnJlcXVlc3RSZXNldFBhc3N3b3JkVVJMLCB1c2VybmFtZSwgdG9rZW4sIHRoaXMuY29uZmlnKTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgYXBwTmFtZTogdGhpcy5jb25maWcuYXBwTmFtZSxcbiAgICAgIGxpbms6IGxpbmssXG4gICAgICB1c2VyOiBpbmZsYXRlKCdfVXNlcicsIHVzZXIpLFxuICAgIH07XG5cbiAgICBpZiAodGhpcy5hZGFwdGVyLnNlbmRQYXNzd29yZFJlc2V0RW1haWwpIHtcbiAgICAgIHRoaXMuYWRhcHRlci5zZW5kUGFzc3dvcmRSZXNldEVtYWlsKG9wdGlvbnMpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFkYXB0ZXIuc2VuZE1haWwodGhpcy5kZWZhdWx0UmVzZXRQYXNzd29yZEVtYWlsKG9wdGlvbnMpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHVzZXIpO1xuICB9XG5cbiAgdXBkYXRlUGFzc3dvcmQodXNlcm5hbWUsIHRva2VuLCBwYXNzd29yZCkge1xuICAgIHJldHVybiB0aGlzLmNoZWNrUmVzZXRUb2tlblZhbGlkaXR5KHVzZXJuYW1lLCB0b2tlbilcbiAgICAgIC50aGVuKHVzZXIgPT4gdXBkYXRlVXNlclBhc3N3b3JkKHVzZXIsIHBhc3N3b3JkLCB0aGlzLmNvbmZpZykpXG4gICAgICAudGhlbih1c2VyID0+IHtcbiAgICAgICAgY29uc3QgYWNjb3VudExvY2tvdXRQb2xpY3kgPSBuZXcgQWNjb3VudExvY2tvdXQodXNlciwgdGhpcy5jb25maWcpO1xuICAgICAgICByZXR1cm4gYWNjb3VudExvY2tvdXRQb2xpY3kudW5sb2NrQWNjb3VudCgpO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgIGlmIChlcnJvciAmJiBlcnJvci5tZXNzYWdlKSB7XG4gICAgICAgICAgLy8gaW4gY2FzZSBvZiBQYXJzZS5FcnJvciwgZmFpbCB3aXRoIHRoZSBlcnJvciBtZXNzYWdlIG9ubHlcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IubWVzc2FnZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICBkZWZhdWx0VmVyaWZpY2F0aW9uRW1haWwoeyBsaW5rLCB1c2VyLCBhcHBOYW1lIH0pIHtcbiAgICBjb25zdCB0ZXh0ID1cbiAgICAgICdIaSxcXG5cXG4nICtcbiAgICAgICdZb3UgYXJlIGJlaW5nIGFza2VkIHRvIGNvbmZpcm0gdGhlIGUtbWFpbCBhZGRyZXNzICcgK1xuICAgICAgdXNlci5nZXQoJ2VtYWlsJykgK1xuICAgICAgJyB3aXRoICcgK1xuICAgICAgYXBwTmFtZSArXG4gICAgICAnXFxuXFxuJyArXG4gICAgICAnJyArXG4gICAgICAnQ2xpY2sgaGVyZSB0byBjb25maXJtIGl0OlxcbicgK1xuICAgICAgbGluaztcbiAgICBjb25zdCB0byA9IHVzZXIuZ2V0KCdlbWFpbCcpO1xuICAgIGNvbnN0IHN1YmplY3QgPSAnUGxlYXNlIHZlcmlmeSB5b3VyIGUtbWFpbCBmb3IgJyArIGFwcE5hbWU7XG4gICAgcmV0dXJuIHsgdGV4dCwgdG8sIHN1YmplY3QgfTtcbiAgfVxuXG4gIGRlZmF1bHRSZXNldFBhc3N3b3JkRW1haWwoeyBsaW5rLCB1c2VyLCBhcHBOYW1lIH0pIHtcbiAgICBjb25zdCB0ZXh0ID1cbiAgICAgICdIaSxcXG5cXG4nICtcbiAgICAgICdZb3UgcmVxdWVzdGVkIHRvIHJlc2V0IHlvdXIgcGFzc3dvcmQgZm9yICcgK1xuICAgICAgYXBwTmFtZSArXG4gICAgICAodXNlci5nZXQoJ3VzZXJuYW1lJykgPyBcIiAoeW91ciB1c2VybmFtZSBpcyAnXCIgKyB1c2VyLmdldCgndXNlcm5hbWUnKSArIFwiJylcIiA6ICcnKSArXG4gICAgICAnLlxcblxcbicgK1xuICAgICAgJycgK1xuICAgICAgJ0NsaWNrIGhlcmUgdG8gcmVzZXQgaXQ6XFxuJyArXG4gICAgICBsaW5rO1xuICAgIGNvbnN0IHRvID0gdXNlci5nZXQoJ2VtYWlsJykgfHwgdXNlci5nZXQoJ3VzZXJuYW1lJyk7XG4gICAgY29uc3Qgc3ViamVjdCA9ICdQYXNzd29yZCBSZXNldCBmb3IgJyArIGFwcE5hbWU7XG4gICAgcmV0dXJuIHsgdGV4dCwgdG8sIHN1YmplY3QgfTtcbiAgfVxufVxuXG4vLyBNYXJrIHRoaXMgcHJpdmF0ZVxuZnVuY3Rpb24gdXBkYXRlVXNlclBhc3N3b3JkKHVzZXIsIHBhc3N3b3JkLCBjb25maWcpIHtcbiAgcmV0dXJuIHJlc3RcbiAgICAudXBkYXRlKFxuICAgICAgY29uZmlnLFxuICAgICAgQXV0aC5tYXN0ZXIoY29uZmlnKSxcbiAgICAgICdfVXNlcicsXG4gICAgICB7IG9iamVjdElkOiB1c2VyLm9iamVjdElkIH0sXG4gICAgICB7XG4gICAgICAgIHBhc3N3b3JkOiBwYXNzd29yZCxcbiAgICAgIH1cbiAgICApXG4gICAgLnRoZW4oKCkgPT4gdXNlcik7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkRW1haWxMaW5rKGRlc3RpbmF0aW9uLCB1c2VybmFtZSwgdG9rZW4sIGNvbmZpZykge1xuICBjb25zdCB1c2VybmFtZUFuZFRva2VuID0gYHRva2VuPSR7dG9rZW59JnVzZXJuYW1lPSR7dXNlcm5hbWV9YDtcblxuICBpZiAoY29uZmlnLnBhcnNlRnJhbWVVUkwpIHtcbiAgICBjb25zdCBkZXN0aW5hdGlvbldpdGhvdXRIb3N0ID0gZGVzdGluYXRpb24ucmVwbGFjZShjb25maWcucHVibGljU2VydmVyVVJMLCAnJyk7XG5cbiAgICByZXR1cm4gYCR7Y29uZmlnLnBhcnNlRnJhbWVVUkx9P2xpbms9JHtlbmNvZGVVUklDb21wb25lbnQoXG4gICAgICBkZXN0aW5hdGlvbldpdGhvdXRIb3N0XG4gICAgKX0mJHt1c2VybmFtZUFuZFRva2VufWA7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGAke2Rlc3RpbmF0aW9ufT8ke3VzZXJuYW1lQW5kVG9rZW59YDtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBVc2VyQ29udHJvbGxlcjtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUErQjtBQUUvQixJQUFJQSxTQUFTLEdBQUdDLE9BQU8sQ0FBQyxjQUFjLENBQUM7QUFDdkMsSUFBSUMsSUFBSSxHQUFHRCxPQUFPLENBQUMsU0FBUyxDQUFDO0FBRXRCLE1BQU1FLGNBQWMsU0FBU0MsNEJBQW1CLENBQUM7RUFDdERDLFdBQVcsQ0FBQ0MsT0FBTyxFQUFFQyxLQUFLLEVBQUVDLE9BQU8sR0FBRyxDQUFDLENBQUMsRUFBRTtJQUN4QyxLQUFLLENBQUNGLE9BQU8sRUFBRUMsS0FBSyxFQUFFQyxPQUFPLENBQUM7RUFDaEM7RUFFQSxJQUFJQyxNQUFNLEdBQUc7SUFDWCxPQUFPQyxlQUFNLENBQUND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
355
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZXN0UXVlcnkiLCJyZXF1aXJlIiwiQXV0aCIsIlVzZXJDb250cm9sbGVyIiwiQWRhcHRhYmxlQ29udHJvbGxlciIsImNvbnN0cnVjdG9yIiwiYWRhcHRlciIsImFwcElkIiwib3B0aW9ucyIsImNvbmZpZyIsIkNvbmZpZyIsImdldCIsInZhbGlkYXRlQWRhcHRlciIsInNob3VsZFZlcmlmeUVtYWlscyIsImV4cGVjdGVkQWRhcHRlclR5cGUiLCJNYWlsQWRhcHRlciIsInZlcmlmeVVzZXJFbWFpbHMiLCJzZXRFbWFpbFZlcmlmeVRva2VuIiwidXNlciIsInJlcSIsInN0b3JhZ2UiLCJzaG91bGRTZW5kRW1haWwiLCJyZXNwb25zZSIsIlByb21pc2UiLCJyZXNvbHZlIiwic2VuZFZlcmlmaWNhdGlvbkVtYWlsIiwiX2VtYWlsX3ZlcmlmeV90b2tlbiIsInJhbmRvbVN0cmluZyIsImZpZWxkc0NoYW5nZWRCeVRyaWdnZXIiLCJpbmNsdWRlcyIsImVtYWlsVmVyaWZpZWQiLCJlbWFpbFZlcmlmeVRva2VuVmFsaWRpdHlEdXJhdGlvbiIsIl9lbWFpbF92ZXJpZnlfdG9rZW5fZXhwaXJlc19hdCIsIlBhcnNlIiwiX2VuY29kZSIsImdlbmVyYXRlRW1haWxWZXJpZnlUb2tlbkV4cGlyZXNBdCIsInZlcmlmeUVtYWlsIiwidXNlcm5hbWUiLCJ0b2tlbiIsInVuZGVmaW5lZCIsInF1ZXJ5IiwidXBkYXRlRmllbGRzIiwiX19vcCIsIiRndCIsIkRhdGUiLCJtYWludGVuYW5jZUF1dGgiLCJtYWludGVuYW5jZSIsImZpbmRVc2VyRm9yRW1haWxWZXJpZmljYXRpb24iLCJleGVjdXRlIiwidGhlbiIsInJlc3VsdCIsInJlc3VsdHMiLCJsZW5ndGgiLCJvYmplY3RJZCIsInJlc3QiLCJ1cGRhdGUiLCJjaGVja1Jlc2V0VG9rZW5WYWxpZGl0eSIsImRhdGFiYXNlIiwiZmluZCIsIl9wZXJpc2hhYmxlX3Rva2VuIiwibGltaXQiLCJwYXNzd29yZFBvbGljeSIsInJlc2V0VG9rZW5WYWxpZGl0eUR1cmF0aW9uIiwiZXhwaXJlc0RhdGUiLCJfcGVyaXNoYWJsZV90b2tlbl9leHBpcmVzX2F0IiwiX190eXBlIiwiaXNvIiwiZ2V0VXNlcklmTmVlZGVkIiwiZW1haWwiLCJ3aGVyZSIsIm1hc3RlciIsImVuY29kZVVSSUNvbXBvbmVudCIsImZldGNoZWRVc2VyIiwic2VuZFVzZXJFbWFpbFZlcmlmaWNhdGlvbiIsIk9iamVjdCIsImZyb21KU09OIiwiY2xhc3NOYW1lIiwiYXV0aCIsImlzTWFzdGVyIiwibGluayIsImJ1aWxkRW1haWxMaW5rIiwidmVyaWZ5RW1haWxVUkwiLCJhcHBOYW1lIiwiaW5mbGF0ZSIsInNlbmRNYWlsIiwiZGVmYXVsdFZlcmlmaWNhdGlvbkVtYWlsIiwicmVnZW5lcmF0ZUVtYWlsVmVyaWZ5VG9rZW4iLCJlbWFpbFZlcmlmeVRva2VuUmV1c2VJZlZhbGlkIiwic2hvdWxkU2VuZCIsInJlc2VuZFZlcmlmaWNhdGlvbkVtYWlsIiwiYVVzZXIiLCJnZW5lcmF0ZSIsInNldFBhc3N3b3JkUmVzZXRUb2tlbiIsImdlbmVyYXRlUGFzc3dvcmRSZXNldFRva2VuRXhwaXJlc0F0IiwiJG9yIiwiJGV4aXN0cyIsInNlbmRQYXNzd29yZFJlc2V0RW1haWwiLCJyZXNldFRva2VuUmV1c2VJZlZhbGlkIiwicmVxdWVzdFJlc2V0UGFzc3dvcmRVUkwiLCJkZWZhdWx0UmVzZXRQYXNzd29yZEVtYWlsIiwidXBkYXRlUGFzc3dvcmQiLCJwYXNzd29yZCIsInVwZGF0ZVVzZXJQYXNzd29yZCIsImFjY291bnRMb2Nrb3V0UG9saWN5IiwiQWNjb3VudExvY2tvdXQiLCJ1bmxvY2tBY2NvdW50IiwiY2F0Y2giLCJlcnJvciIsIm1lc3NhZ2UiLCJyZWplY3QiLCJ0ZXh0IiwidG8iLCJzdWJqZWN0IiwiZGVzdGluYXRpb24iLCJ1c2VybmFtZUFuZFRva2VuIiwicGFyc2VGcmFtZVVSTCIsImRlc3RpbmF0aW9uV2l0aG91dEhvc3QiLCJyZXBsYWNlIiwicHVibGljU2VydmVyVVJMIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL0NvbnRyb2xsZXJzL1VzZXJDb250cm9sbGVyLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJhbmRvbVN0cmluZyB9IGZyb20gJy4uL2NyeXB0b1V0aWxzJztcbmltcG9ydCB7IGluZmxhdGUgfSBmcm9tICcuLi90cmlnZ2Vycyc7XG5pbXBvcnQgQWRhcHRhYmxlQ29udHJvbGxlciBmcm9tICcuL0FkYXB0YWJsZUNvbnRyb2xsZXInO1xuaW1wb3J0IE1haWxBZGFwdGVyIGZyb20gJy4uL0FkYXB0ZXJzL0VtYWlsL01haWxBZGFwdGVyJztcbmltcG9ydCByZXN0IGZyb20gJy4uL3Jlc3QnO1xuaW1wb3J0IFBhcnNlIGZyb20gJ3BhcnNlL25vZGUnO1xuaW1wb3J0IEFjY291bnRMb2Nrb3V0IGZyb20gJy4uL0FjY291bnRMb2Nrb3V0JztcbmltcG9ydCBDb25maWcgZnJvbSAnLi4vQ29uZmlnJztcblxudmFyIFJlc3RRdWVyeSA9IHJlcXVpcmUoJy4uL1Jlc3RRdWVyeScpO1xudmFyIEF1dGggPSByZXF1aXJlKCcuLi9BdXRoJyk7XG5cbmV4cG9ydCBjbGFzcyBVc2VyQ29udHJvbGxlciBleHRlbmRzIEFkYXB0YWJsZUNvbnRyb2xsZXIge1xuICBjb25zdHJ1Y3RvcihhZGFwdGVyLCBhcHBJZCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgc3VwZXIoYWRhcHRlciwgYXBwSWQsIG9wdGlvbnMpO1xuICB9XG5cbiAgZ2V0IGNvbmZpZygpIHtcbiAgICByZXR1cm4gQ29uZmlnLmdldCh0aGlzLmFwcElkKTtcbiAgfVxuXG4gIHZhbGlkYXRlQWRhcHRlcihhZGFwdGVyKSB7XG4gICAgLy8gQWxsb3cgbm8gYWRhcHRlclxuICAgIGlmICghYWRhcHRlciAmJiAhdGhpcy5zaG91bGRWZXJpZnlFbWFpbHMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc3VwZXIudmFsaWRhdGVBZGFwdGVyKGFkYXB0ZXIpO1xuICB9XG5cbiAgZXhwZWN0ZWRBZGFwdGVyVHlwZSgpIHtcbiAgICByZXR1cm4gTWFpbEFkYXB0ZXI7XG4gIH1cblxuICBnZXQgc2hvdWxkVmVyaWZ5RW1haWxzKCkge1xuICAgIHJldHVybiAodGhpcy5jb25maWcgfHwgdGhpcy5vcHRpb25zKS52ZXJpZnlVc2VyRW1haWxzO1xuICB9XG5cbiAgYXN5bmMgc2V0RW1haWxWZXJpZnlUb2tlbih1c2VyLCByZXEsIHN0b3JhZ2UgPSB7fSkge1xuICAgIGxldCBzaG91bGRTZW5kRW1haWwgPSB0aGlzLnNob3VsZFZlcmlmeUVtYWlscztcbiAgICBpZiAodHlwZW9mIHNob3VsZFNlbmRFbWFpbCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBQcm9taXNlLnJlc29sdmUoc2hvdWxkU2VuZEVtYWlsKHJlcSkpO1xuICAgICAgc2hvdWxkU2VuZEVtYWlsID0gcmVzcG9uc2UgIT09IGZhbHNlO1xuICAgIH1cbiAgICBpZiAoIXNob3VsZFNlbmRFbWFpbCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBzdG9yYWdlLnNlbmRWZXJpZmljYXRpb25FbWFpbCA9IHRydWU7XG4gICAgdXNlci5fZW1haWxfdmVyaWZ5X3Rva2VuID0gcmFuZG9tU3RyaW5nKDI1KTtcbiAgICBpZiAoXG4gICAgICAhc3RvcmFnZS5maWVsZHNDaGFuZ2VkQnlUcmlnZ2VyIHx8XG4gICAgICAhc3RvcmFnZS5maWVsZHNDaGFuZ2VkQnlUcmlnZ2VyLmluY2x1ZGVzKCdlbWFpbFZlcmlmaWVkJylcbiAgICApIHtcbiAgICAgIHVzZXIuZW1haWxWZXJpZmllZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmNvbmZpZy5lbWFpbFZlcmlmeVRva2VuVmFsaWRpdHlEdXJhdGlvbikge1xuICAgICAgdXNlci5fZW1haWxfdmVyaWZ5X3Rva2VuX2V4cGlyZXNfYXQgPSBQYXJzZS5fZW5jb2RlKFxuICAgICAgICB0aGlzLmNvbmZpZy5nZW5lcmF0ZUVtYWlsVmVyaWZ5VG9rZW5FeHBpcmVzQXQoKVxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICB2ZXJpZnlFbWFpbCh1c2VybmFtZSwgdG9rZW4pIHtcbiAgICBpZiAoIXRoaXMuc2hvdWxkVmVyaWZ5RW1haWxzKSB7XG4gICAgICAvLyBUcnlpbmcgdG8gdmVyaWZ5IGVtYWlsIHdoZW4gbm90IGVuYWJsZWRcbiAgICAgIC8vIFRPRE86IEJldHRlciBlcnJvciBoZXJlLlxuICAgICAgdGhyb3cgdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGNvbnN0IHF1ZXJ5ID0geyB1c2VybmFtZTogdXNlcm5hbWUsIF9lbWFpbF92ZXJpZnlfdG9rZW46IHRva2VuIH07XG4gICAgY29uc3QgdXBkYXRlRmllbGRzID0ge1xuICAgICAgZW1haWxWZXJpZmllZDogdHJ1ZSxcbiAgICAgIF9lbWFpbF92ZXJpZnlfdG9rZW46IHsgX19vcDogJ0RlbGV0ZScgfSxcbiAgICB9O1xuXG4gICAgLy8gaWYgdGhlIGVtYWlsIHZlcmlmeSB0b2tlbiBuZWVkcyB0byBiZSB2YWxpZGF0ZWQgdGhlblxuICAgIC8vIGFkZCBhZGRpdGlvbmFsIHF1ZXJ5IHBhcmFtcyBhbmQgYWRkaXRpb25hbCBmaWVsZHMgdGhhdCBuZWVkIHRvIGJlIHVwZGF0ZWRcbiAgICBpZiAodGhpcy5jb25maWcuZW1haWxWZXJpZnlUb2tlblZhbGlkaXR5RHVyYXRpb24pIHtcbiAgICAgIHF1ZXJ5LmVtYWlsVmVyaWZpZWQgPSBmYWxzZTtcbiAgICAgIHF1ZXJ5Ll9lbWFpbF92ZXJpZnlfdG9rZW5fZXhwaXJlc19hdCA9IHsgJGd0OiBQYXJzZS5fZW5jb2RlKG5ldyBEYXRlKCkpIH07XG5cbiAgICAgIHVwZGF0ZUZpZWxkcy5fZW1haWxfdmVyaWZ5X3Rva2VuX2V4cGlyZXNfYXQgPSB7IF9fb3A6ICdEZWxldGUnIH07XG4gICAgfVxuICAgIGNvbnN0IG1haW50ZW5hbmNlQXV0aCA9IEF1dGgubWFpbnRlbmFuY2UodGhpcy5jb25maWcpO1xuICAgIHZhciBmaW5kVXNlckZvckVtYWlsVmVyaWZpY2F0aW9uID0gbmV3IFJlc3RRdWVyeSh0aGlzLmNvbmZpZywgbWFpbnRlbmFuY2VBdXRoLCAnX1VzZXInLCB7XG4gICAgICB1c2VybmFtZSxcbiAgICB9KTtcbiAgICByZXR1cm4gZmluZFVzZXJGb3JFbWFpbFZlcmlmaWNhdGlvbi5leGVjdXRlKCkudGhlbihyZXN1bHQgPT4ge1xuICAgICAgaWYgKHJlc3VsdC5yZXN1bHRzLmxlbmd0aCAmJiByZXN1bHQucmVzdWx0c1swXS5lbWFpbFZlcmlmaWVkKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocmVzdWx0LnJlc3VsdHMubGVuZ3RoWzBdKTtcbiAgICAgIH0gZWxzZSBpZiAocmVzdWx0LnJlc3VsdHMubGVuZ3RoKSB7XG4gICAgICAgIHF1ZXJ5Lm9iamVjdElkID0gcmVzdWx0LnJlc3VsdHNbMF0ub2JqZWN0SWQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdC51cGRhdGUodGhpcy5jb25maWcsIG1haW50ZW5hbmNlQXV0aCwgJ19Vc2VyJywgcXVlcnksIHVwZGF0ZUZpZWxkcyk7XG4gICAgfSk7XG4gIH1cblxuICBjaGVja1Jlc2V0VG9rZW5WYWxpZGl0eSh1c2VybmFtZSwgdG9rZW4pIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcuZGF0YWJhc2VcbiAgICAgIC5maW5kKFxuICAgICAgICAnX1VzZXInLFxuICAgICAgICB7XG4gICAgICAgICAgdXNlcm5hbWU6IHVzZXJuYW1lLFxuICAgICAgICAgIF9wZXJpc2hhYmxlX3Rva2VuOiB0b2tlbixcbiAgICAgICAgfSxcbiAgICAgICAgeyBsaW1pdDogMSB9LFxuICAgICAgICBBdXRoLm1haW50ZW5hbmNlKHRoaXMuY29uZmlnKVxuICAgICAgKVxuICAgICAgLnRoZW4ocmVzdWx0cyA9PiB7XG4gICAgICAgIGlmIChyZXN1bHRzLmxlbmd0aCAhPSAxKSB7XG4gICAgICAgICAgdGhyb3cgJ0ZhaWxlZCB0byByZXNldCBwYXNzd29yZDogdXNlcm5hbWUgLyBlbWFpbCAvIHRva2VuIGlzIGludmFsaWQnO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuY29uZmlnLnBhc3N3b3JkUG9saWN5ICYmIHRoaXMuY29uZmlnLnBhc3N3b3JkUG9saWN5LnJlc2V0VG9rZW5WYWxpZGl0eUR1cmF0aW9uKSB7XG4gICAgICAgICAgbGV0IGV4cGlyZXNEYXRlID0gcmVzdWx0c1swXS5fcGVyaXNoYWJsZV90b2tlbl9leHBpcmVzX2F0O1xuICAgICAgICAgIGlmIChleHBpcmVzRGF0ZSAmJiBleHBpcmVzRGF0ZS5fX3R5cGUgPT0gJ0RhdGUnKSB7XG4gICAgICAgICAgICBleHBpcmVzRGF0ZSA9IG5ldyBEYXRlKGV4cGlyZXNEYXRlLmlzbyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChleHBpcmVzRGF0ZSA8IG5ldyBEYXRlKCkpIHRocm93ICdUaGUgcGFzc3dvcmQgcmVzZXQgbGluayBoYXMgZXhwaXJlZCc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdHNbMF07XG4gICAgICB9KTtcbiAgfVxuXG4gIGdldFVzZXJJZk5lZWRlZCh1c2VyKSB7XG4gICAgaWYgKHVzZXIudXNlcm5hbWUgJiYgdXNlci5lbWFpbCkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh1c2VyKTtcbiAgICB9XG4gICAgdmFyIHdoZXJlID0ge307XG4gICAgaWYgKHVzZXIudXNlcm5hbWUpIHtcbiAgICAgIHdoZXJlLnVzZXJuYW1lID0gdXNlci51c2VybmFtZTtcbiAgICB9XG4gICAgaWYgKHVzZXIuZW1haWwpIHtcbiAgICAgIHdoZXJlLmVtYWlsID0gdXNlci5lbWFpbDtcbiAgICB9XG5cbiAgICB2YXIgcXVlcnkgPSBuZXcgUmVzdFF1ZXJ5KHRoaXMuY29uZmlnLCBBdXRoLm1hc3Rlcih0aGlzLmNvbmZpZyksICdfVXNlcicsIHdoZXJlKTtcbiAgICByZXR1cm4gcXVlcnkuZXhlY3V0ZSgpLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgaWYgKHJlc3VsdC5yZXN1bHRzLmxlbmd0aCAhPSAxKSB7XG4gICAgICAgIHRocm93IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQucmVzdWx0c1swXTtcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIHNlbmRWZXJpZmljYXRpb25FbWFpbCh1c2VyLCByZXEpIHtcbiAgICBpZiAoIXRoaXMuc2hvdWxkVmVyaWZ5RW1haWxzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHRva2VuID0gZW5jb2RlVVJJQ29tcG9uZW50KHVzZXIuX2VtYWlsX3ZlcmlmeV90b2tlbik7XG4gICAgLy8gV2UgbWF5IG5lZWQgdG8gZmV0Y2ggdGhlIHVzZXIgaW4gY2FzZSBvZiB1cGRhdGUgZW1haWxcbiAgICBjb25zdCBmZXRjaGVkVXNlciA9IGF3YWl0IHRoaXMuZ2V0VXNlcklmTmVlZGVkKHVzZXIpO1xuICAgIGxldCBzaG91bGRTZW5kRW1haWwgPSB0aGlzLmNvbmZpZy5zZW5kVXNlckVtYWlsVmVyaWZpY2F0aW9uO1xuICAgIGlmICh0eXBlb2Ygc2hvdWxkU2VuZEVtYWlsID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IFByb21pc2UucmVzb2x2ZShcbiAgICAgICAgdGhpcy5jb25maWcuc2VuZFVzZXJFbWFpbFZlcmlmaWNhdGlvbih7XG4gICAgICAgICAgdXNlcjogUGFyc2UuT2JqZWN0LmZyb21KU09OKHsgY2xhc3NOYW1lOiAnX1VzZXInLCAuLi5mZXRjaGVkVXNlciB9KSxcbiAgICAgICAgICBtYXN0ZXI6IHJlcS5hdXRoPy5pc01hc3RlcixcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgICBzaG91bGRTZW5kRW1haWwgPSAhIXJlc3BvbnNlO1xuICAgIH1cbiAgICBpZiAoIXNob3VsZFNlbmRFbWFpbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB1c2VybmFtZSA9IGVuY29kZVVSSUNvbXBvbmVudCh1c2VyLnVzZXJuYW1lKTtcblxuICAgIGNvbnN0IGxpbmsgPSBidWlsZEVtYWlsTGluayh0aGlzLmNvbmZpZy52ZXJpZnlFbWFpbFVSTCwgdXNlcm5hbWUsIHRva2VuLCB0aGlzLmNvbmZpZyk7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgIGFwcE5hbWU6IHRoaXMuY29uZmlnLmFwcE5hbWUsXG4gICAgICBsaW5rOiBsaW5rLFxuICAgICAgdXNlcjogaW5mbGF0ZSgnX1VzZXInLCBmZXRjaGVkVXNlciksXG4gICAgfTtcbiAgICBpZiAodGhpcy5hZGFwdGVyLnNlbmRWZXJpZmljYXRpb25FbWFpbCkge1xuICAgICAgdGhpcy5hZGFwdGVyLnNlbmRWZXJpZmljYXRpb25FbWFpbChvcHRpb25zKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5hZGFwdGVyLnNlbmRNYWlsKHRoaXMuZGVmYXVsdFZlcmlmaWNhdGlvbkVtYWlsKG9wdGlvbnMpKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVnZW5lcmF0ZXMgdGhlIGdpdmVuIHVzZXIncyBlbWFpbCB2ZXJpZmljYXRpb24gdG9rZW5cbiAgICpcbiAgICogQHBhcmFtIHVzZXJcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBhc3luYyByZWdlbmVyYXRlRW1haWxWZXJpZnlUb2tlbih1c2VyLCBtYXN0ZXIpIHtcbiAgICBjb25zdCB7IF9lbWFpbF92ZXJpZnlfdG9rZW4gfSA9IHVzZXI7XG4gICAgbGV0IHsgX2VtYWlsX3ZlcmlmeV90b2tlbl9leHBpcmVzX2F0IH0gPSB1c2VyO1xuICAgIGlmIChfZW1haWxfdmVyaWZ5X3Rva2VuX2V4cGlyZXNfYXQgJiYgX2VtYWlsX3ZlcmlmeV90b2tlbl9leHBpcmVzX2F0Ll9fdHlwZSA9PT0gJ0RhdGUnKSB7XG4gICAgICBfZW1haWxfdmVyaWZ5X3Rva2VuX2V4cGlyZXNfYXQgPSBfZW1haWxfdmVyaWZ5X3Rva2VuX2V4cGlyZXNfYXQuaXNvO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICB0aGlzLmNvbmZpZy5lbWFpbFZlcmlmeVRva2VuUmV1c2VJZlZhbGlkICYmXG4gICAgICB0aGlzLmNvbmZpZy5lbWFpbFZlcmlmeVRva2VuVmFsaWRpdHlEdXJhdGlvbiAmJlxuICAgICAgX2VtYWlsX3ZlcmlmeV90b2tlbiAmJlxuICAgICAgbmV3IERhdGUoKSA8IG5ldyBEYXRlKF9lbWFpbF92ZXJpZnlfdG9rZW5fZXhwaXJlc19hdClcbiAgICApIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICB9XG4gICAgY29uc3Qgc2hvdWxkU2VuZCA9IGF3YWl0IHRoaXMuc2V0RW1haWxWZXJpZnlUb2tlbih1c2VyLCB7IHVzZXIsIG1hc3RlciB9KTtcbiAgICBpZiAoIXNob3VsZFNlbmQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLmRhdGFiYXNlLnVwZGF0ZSgnX1VzZXInLCB7IHVzZXJuYW1lOiB1c2VyLnVzZXJuYW1lIH0sIHVzZXIpO1xuICB9XG5cbiAgYXN5bmMgcmVzZW5kVmVyaWZpY2F0aW9uRW1haWwodXNlcm5hbWUsIHJlcSkge1xuICAgIGNvbnN0IGFVc2VyID0gYXdhaXQgdGhpcy5nZXRVc2VySWZOZWVkZWQoeyB1c2VybmFtZTogdXNlcm5hbWUgfSk7XG4gICAgaWYgKCFhVXNlciB8fCBhVXNlci5lbWFpbFZlcmlmaWVkKSB7XG4gICAgICB0aHJvdyB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGNvbnN0IGdlbmVyYXRlID0gYXdhaXQgdGhpcy5yZWdlbmVyYXRlRW1haWxWZXJpZnlUb2tlbihhVXNlciwgcmVxLmF1dGg/LmlzTWFzdGVyKTtcbiAgICBpZiAoZ2VuZXJhdGUpIHtcbiAgICAgIHRoaXMuc2VuZFZlcmlmaWNhdGlvbkVtYWlsKGFVc2VyLCByZXEpO1xuICAgIH1cbiAgfVxuXG4gIHNldFBhc3N3b3JkUmVzZXRUb2tlbihlbWFpbCkge1xuICAgIGNvbnN0IHRva2VuID0geyBfcGVyaXNoYWJsZV90b2tlbjogcmFuZG9tU3RyaW5nKDI1KSB9O1xuXG4gICAgaWYgKHRoaXMuY29uZmlnLnBhc3N3b3JkUG9saWN5ICYmIHRoaXMuY29uZmlnLnBhc3N3b3JkUG9saWN5LnJlc2V0VG9rZW5WYWxpZGl0eUR1cmF0aW9uKSB7XG4gICAgICB0b2tlbi5fcGVyaXNoYWJsZV90b2tlbl9leHBpcmVzX2F0ID0gUGFyc2UuX2VuY29kZShcbiAgICAgICAgdGhpcy5jb25maWcuZ2VuZXJhdGVQYXNzd29yZFJlc2V0VG9rZW5FeHBpcmVzQXQoKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5jb25maWcuZGF0YWJhc2UudXBkYXRlKFxuICAgICAgJ19Vc2VyJyxcbiAgICAgIHsgJG9yOiBbeyBlbWFpbCB9LCB7IHVzZXJuYW1lOiBlbWFpbCwgZW1haWw6IHsgJGV4aXN0czogZmFsc2UgfSB9XSB9LFxuICAgICAgdG9rZW4sXG4gICAgICB7fSxcbiAgICAgIHRydWVcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgc2VuZFBhc3N3b3JkUmVzZXRFbWFpbChlbWFpbCkge1xuICAgIGlmICghdGhpcy5hZGFwdGVyKSB7XG4gICAgICB0aHJvdyAnVHJ5aW5nIHRvIHNlbmQgYSByZXNldCBwYXNzd29yZCBidXQgbm8gYWRhcHRlciBpcyBzZXQnO1xuICAgICAgLy8gIFRPRE86IE5vIGFkYXB0ZXI/XG4gICAgfVxuICAgIGxldCB1c2VyO1xuICAgIGlmIChcbiAgICAgIHRoaXMuY29uZmlnLnBhc3N3b3JkUG9saWN5ICYmXG4gICAgICB0aGlzLmNvbmZpZy5wYXNzd29yZFBvbGljeS5yZXNldFRva2VuUmV1c2VJZlZhbGlkICYmXG4gICAgICB0aGlzLmNvbmZpZy5wYXNzd29yZFBvbGljeS5yZXNldFRva2VuVmFsaWRpdHlEdXJhdGlvblxuICAgICkge1xuICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IHRoaXMuY29uZmlnLmRhdGFiYXNlLmZpbmQoXG4gICAgICAgICdfVXNlcicsXG4gICAgICAgIHtcbiAgICAgICAgICAkb3I6IFtcbiAgICAgICAgICAgIHsgZW1haWwsIF9wZXJpc2hhYmxlX3Rva2VuOiB7ICRleGlzdHM6IHRydWUgfSB9LFxuICAgICAgICAgICAgeyB1c2VybmFtZTogZW1haWwsIGVtYWlsOiB7ICRleGlzdHM6IGZhbHNlIH0sIF9wZXJpc2hhYmxlX3Rva2VuOiB7ICRleGlzdHM6IHRydWUgfSB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICAgIHsgbGltaXQ6IDEgfSxcbiAgICAgICAgQXV0aC5tYWludGVuYW5jZSh0aGlzLmNvbmZpZylcbiAgICAgICk7XG4gICAgICBpZiAocmVzdWx0cy5sZW5ndGggPT0gMSkge1xuICAgICAgICBsZXQgZXhwaXJlc0RhdGUgPSByZXN1bHRzWzBdLl9wZXJpc2hhYmxlX3Rva2VuX2V4cGlyZXNfYXQ7XG4gICAgICAgIGlmIChleHBpcmVzRGF0ZSAmJiBleHBpcmVzRGF0ZS5fX3R5cGUgPT0gJ0RhdGUnKSB7XG4gICAgICAgICAgZXhwaXJlc0RhdGUgPSBuZXcgRGF0ZShleHBpcmVzRGF0ZS5pc28pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChleHBpcmVzRGF0ZSA+IG5ldyBEYXRlKCkpIHtcbiAgICAgICAgICB1c2VyID0gcmVzdWx0c1swXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIXVzZXIgfHwgIXVzZXIuX3BlcmlzaGFibGVfdG9rZW4pIHtcbiAgICAgIHVzZXIgPSBhd2FpdCB0aGlzLnNldFBhc3N3b3JkUmVzZXRUb2tlbihlbWFpbCk7XG4gICAgfVxuICAgIGNvbnN0IHRva2VuID0gZW5jb2RlVVJJQ29tcG9uZW50KHVzZXIuX3BlcmlzaGFibGVfdG9rZW4pO1xuICAgIGNvbnN0IHVzZXJuYW1lID0gZW5jb2RlVVJJQ29tcG9uZW50KHVzZXIudXNlcm5hbWUpO1xuXG4gICAgY29uc3QgbGluayA9IGJ1aWxkRW1haWxMaW5rKHRoaXMuY29uZmlnLnJlcXVlc3RSZXNldFBhc3N3b3JkVVJMLCB1c2VybmFtZSwgdG9rZW4sIHRoaXMuY29uZmlnKTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgYXBwTmFtZTogdGhpcy5jb25maWcuYXBwTmFtZSxcbiAgICAgIGxpbms6IGxpbmssXG4gICAgICB1c2VyOiBpbmZsYXRlKCdfVXNlcicsIHVzZXIpLFxuICAgIH07XG5cbiAgICBpZiAodGhpcy5hZGFwdGVyLnNlbmRQYXNzd29yZFJlc2V0RW1haWwpIHtcbiAgICAgIHRoaXMuYWRhcHRlci5zZW5kUGFzc3dvcmRSZXNldEVtYWlsKG9wdGlvbnMpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFkYXB0ZXIuc2VuZE1haWwodGhpcy5kZWZhdWx0UmVzZXRQYXNzd29yZEVtYWlsKG9wdGlvbnMpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHVzZXIpO1xuICB9XG5cbiAgdXBkYXRlUGFzc3dvcmQodXNlcm5hbWUsIHRva2VuLCBwYXNzd29yZCkge1xuICAgIHJldHVybiB0aGlzLmNoZWNrUmVzZXRUb2tlblZhbGlkaXR5KHVzZXJuYW1lLCB0b2tlbilcbiAgICAgIC50aGVuKHVzZXIgPT4gdXBkYXRlVXNlclBhc3N3b3JkKHVzZXIsIHBhc3N3b3JkLCB0aGlzLmNvbmZpZykpXG4gICAgICAudGhlbih1c2VyID0+IHtcbiAgICAgICAgY29uc3QgYWNjb3VudExvY2tvdXRQb2xpY3kgPSBuZXcgQWNjb3VudExvY2tvdXQodXNlciwgdGhpcy5jb25maWcpO1xuICAgICAgICByZXR1cm4gYWNjb3VudExvY2tvdXRQb2xpY3kudW5sb2NrQWNjb3VudCgpO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgIGlmIChlcnJvciAmJiBlcnJvci5tZXNzYWdlKSB7XG4gICAgICAgICAgLy8gaW4gY2FzZSBvZiBQYXJzZS5FcnJvciwgZmFpbCB3aXRoIHRoZSBlcnJvciBtZXNzYWdlIG9ubHlcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IubWVzc2FnZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICBkZWZhdWx0VmVyaWZpY2F0aW9uRW1haWwoeyBsaW5rLCB1c2VyLCBhcHBOYW1lIH0pIHtcbiAgICBjb25zdCB0ZXh0ID1cbiAgICAgICdIaSxcXG5cXG4nICtcbiAgICAgICdZb3UgYXJlIGJlaW5nIGFza2VkIHRvIGNvbmZpcm0gdGhlIGUtbWFpbCBhZGRyZXNzICcgK1xuICAgICAgdXNlci5nZXQoJ2VtYWlsJykgK1xuICAgICAgJyB3aXRoICcgK1xuICAgICAgYXBwTmFtZSArXG4gICAgICAnXFxuXFxuJyArXG4gICAgICAnJyArXG4gICAgICAnQ2xpY2sgaGVyZSB0byBjb25maXJtIGl0OlxcbicgK1xuICAgICAgbGluaztcbiAgICBjb25zdCB0byA9IHVzZXIuZ2V0KCdlbWFpbCcpO1xuICAgIGNvbnN0IHN1YmplY3QgPSAnUGxlYXNlIHZlcmlmeSB5b3VyIGUtbWFpbCBmb3IgJyArIGFwcE5hbWU7XG4gICAgcmV0dXJuIHsgdGV4dCwgdG8sIHN1YmplY3QgfTtcbiAgfVxuXG4gIGRlZmF1bHRSZXNldFBhc3N3b3JkRW1haWwoeyBsaW5rLCB1c2VyLCBhcHBOYW1lIH0pIHtcbiAgICBjb25zdCB0ZXh0ID1cbiAgICAgICdIaSxcXG5cXG4nICtcbiAgICAgICdZb3UgcmVxdWVzdGVkIHRvIHJlc2V0IHlvdXIgcGFzc3dvcmQgZm9yICcgK1xuICAgICAgYXBwTmFtZSArXG4gICAgICAodXNlci5nZXQoJ3VzZXJuYW1lJykgPyBcIiAoeW91ciB1c2VybmFtZSBpcyAnXCIgKyB1c2VyLmdldCgndXNlcm5hbWUnKSArIFwiJylcIiA6ICcnKSArXG4gICAgICAnLlxcblxcbicgK1xuICAgICAgJycgK1xuICAgICAgJ0NsaWNrIGhlcmUgdG8gcmVzZXQgaXQ6XFxuJyArXG4gICAgICBsaW5rO1xuICAgIGNvbnN0IHRvID0gdXNlci5nZXQoJ2VtYWlsJykgfHwgdXNlci5nZXQoJ3VzZXJuYW1lJyk7XG4gICAgY29uc3Qgc3ViamVjdCA9ICdQYXNzd29yZCBSZXNldCBmb3IgJyArIGFwcE5hbWU7XG4gICAgcmV0dXJuIHsgdGV4dCwgdG8sIHN1YmplY3QgfTtcbiAgfVxufVxuXG4vLyBNYXJrIHRoaXMgcHJpdmF0ZVxuZnVuY3Rpb24gdXBkYXRlVXNlclBhc3N3b3JkKHVzZXIsIHBhc3N3b3JkLCBjb25maWcpIHtcbiAgcmV0dXJuIHJlc3RcbiAgICAudXBkYXRlKFxuICAgICAgY29uZmlnLFxuICAgICAgQXV0aC5tYXN0ZXIoY29uZmlnKSxcbiAgICAgICdfVXNlcicsXG4gICAgICB7IG9iamVjdElkOiB1c2VyLm9iamVjdElkIH0sXG4gICAgICB7XG4gICAgICAgIHBhc3N3b3JkOiBwYXNzd29yZCxcbiAgICAgIH1cbiAgICApXG4gICAgLnRoZW4oKCkgPT4gdXNlcik7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkRW1haWxMaW5rKGRlc3RpbmF0aW9uLCB1c2VybmFtZSwgdG9rZW4sIGNvbmZpZykge1xuICBjb25zdCB1c2VybmFtZUFuZFRva2VuID0gYHRva2VuPSR7dG9rZW59JnVzZXJuYW1lPSR7dXNlcm5hbWV9YDtcblxuICBpZiAoY29uZmlnLnBhcnNlRnJhbWVVUkwpIHtcbiAgICBjb25zdCBkZXN0aW5hdGlvbldpdGhvdXRIb3N0ID0gZGVzdGluYXRpb24ucmVwbGFjZShjb25maWcucHVibGljU2VydmVyVVJMLCAnJyk7XG5cbiAgICByZXR1cm4gYCR7Y29uZmlnLnBhcnNlRnJhbWVVUkx9P2xpbms9JHtlbmNvZGVVUklDb21wb25lbnQoXG4gICAgICBkZXN0aW5hdGlvbldpdGhvdXRIb3N0XG4gICAgKX0mJHt1c2VybmFtZUFuZFRva2VufWA7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGAke2Rlc3RpbmF0aW9ufT8ke3VzZXJuYW1lQW5kVG9rZW59YDtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBVc2VyQ29udHJvbGxlcjtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUErQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFFL0IsSUFBSUEsU0FBUyxHQUFHQyxPQUFPLENBQUMsY0FBYyxDQUFDO0FBQ3ZDLElBQUlDLElBQUksR0FBR0QsT0FBTyxDQUFDLFNBQVMsQ0FBQztBQUV0QixNQUFNRSxjQUFjLFNBQVNDLDRCQUFtQixDQUFDO0VBQ3REQyxXQUFXLENBQUNDLE9BQU8sRUFBRUMsS0FBSyxFQUFFQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLEVBQUU7SUFDeEMsS0FBSyxDQUFDRixPQUFPLEVBQUVDLEtBQUssRUFBRUMsT0FBTyxDQUFDO0VBQ2hDO0VBRUEsSUFBSUMsTUFBTSxHQUFHO0lBQ1gsT0FBT0MsZUFBTSxDQUFDQyxHQUFHLENBQUMsSUFBSSxDQUFDSixLQUFLLENBQUM7RUFDL0I7RUFFQUssZUFBZSxDQUFDTixPQUFPLEVBQUU7SUFDdkI7SUFDQSxJQUFJLENBQUNBLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQ08sa0JBQWtCLEVBQUU7TUFDeEM7SUFDRjtJQUNBLEtBQUssQ0FBQ0QsZUFBZSxDQUFDTixPQUFPLENBQUM7RUFDaEM7RUFFQVEsbUJBQW1CLEdBQUc7SUFDcEIsT0FBT0Msb0JBQVc7RUFDcEI7RUFFQSxJQUFJRixrQkFBa0IsR0FBRztJQUN2QixPQUFPLENBQUMsSUFBSSxDQUFDSixNQUFNLElBQUksSUFBSSxDQUFDRCxPQUFPLEVBQUVRLGdCQUFnQjtFQUN2RDtFQUVBLE1BQU1DLG1CQUFtQixDQUFDQyxJQUFJLEVBQUVDLEdBQUcsRUFBRUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxFQUFFO0lBQ2pELElBQUlDLGVBQWUsR0FBRyxJQUFJLENBQUNSLGtCQUFrQjtJQUM3QyxJQUFJLE9BQU9RLGVBQWUsS0FBSyxVQUFVLEVBQUU7TUFDekMsTUFBTUMsUUFBUSxHQUFHLE1BQU1DLE9BQU8sQ0FBQ0MsT0FBTyxDQUFDSCxlQUFlLENBQUNGLEdBQUcsQ0FBQyxDQUFDO01BQzVERSxlQUFlLEdBQUdDLFFBQVEsS0FBSyxLQUFLO0lBQ3RDO0lBQ0EsSUFBSSxDQUFDRCxlQUFlLEVBQUU7TUFDcEIsT0FBTyxLQUFLO0lBQ2Q7SUFDQUQsT0FBTyxDQUFDSyxxQkFBcUIsR0FBRyxJQUFJO0lBQ3BDUCxJQUFJLENBQUNRLG1CQUFtQixHQUFHLElBQUFDLHlCQUFZLEVBQUMsRUFBRSxDQUFDO0lBQzNDLElBQ0UsQ0FBQ1AsT0FBTyxDQUFDUSxzQkFBc0IsSUFDL0IsQ0FBQ1IsT0FBTyxDQUFDUSxzQkFBc0IsQ0FBQ0MsUUFBUSxDQUFDLGVBQWUsQ0FBQyxFQUN6RDtNQUNBWCxJQUFJLENBQUNZLGFBQWEsR0FBRyxLQUFLO0lBQzVCO0lBRUEsSUFBSSxJQUFJLENBQUNyQixNQUFNLENBQUNzQixnQ0FBZ0MsRUFBRTtNQUNoRGIsSUFBSSxDQUFDYyw4QkFBOEIsR0FBR0MsYUFBSyxDQUFDQyxPQUFPLENBQ2pELElBQUksQ0FBQ3pCLE1BQU0sQ0FBQzBCLGlDQUFpQyxFQUFFLENBQ2hEO0lBQ0g7SUFDQSxPQUFPLElBQUk7RUFDYjtFQUVBQyxXQUFXLENBQUNDLFFBQVEsRUFBRUMsS0FBSyxFQUFFO0lBQzNCLElBQUksQ0FBQyxJQUFJLENBQUN6QixrQkFBa0IsRUFBRTtNQUM1QjtNQUNBO01BQ0EsTUFBTTBCLFNBQVM7SUFDakI7SUFFQSxNQUFNQyxLQUFLLEdBQUc7TUFBRUgsUUFBUSxFQUFFQSxRQUFRO01BQUVYLG1CQUFtQixFQUFFWTtJQUFNLENBQUM7SUFDaEUsTUFBTUcsWUFBWSxHQUFHO01BQ25CWCxhQUFhLEVBQUUsSUFBSTtNQUNuQkosbUJBQW1CLEVBQUU7UUFBRWdCLElBQUksRUFBRTtNQUFTO0lBQ3hDLENBQUM7O0lBRUQ7SUFDQTtJQUNBLElBQUksSUFBSSxDQUFDakMsTUFBTSxDQUFDc0IsZ0NBQWdDLEVBQUU7TUFDaERTLEtBQUssQ0FBQ1YsYUFBYSxHQUFHLEtBQUs7TUFDM0JVLEtBQUssQ0FBQ1IsOEJBQThCLEdBQUc7UUFBRVcsR0FBRyxFQUFFVixhQUFLLENBQUNDLE9BQU8sQ0FBQyxJQUFJVSxJQUFJLEVBQUU7TUFBRSxDQUFDO01BRXpFSCxZQUFZLENBQUNULDhCQUE4QixHQUFHO1FBQUVVLElBQUksRUFBRTtNQUFTLENBQUM7SUFDbEU7SUFDQSxNQUFNRyxlQUFlLEdBQUczQyxJQUFJLENBQUM0QyxXQUFXLENBQUMsSUFBSSxDQUFDckMsTUFBTSxDQUFDO0lBQ3JELElBQUlzQyw0QkFBNEIsR0FBRyxJQUFJL0MsU0FBUyxDQUFDLElBQUksQ0FBQ1MsTUFBTSxFQUFFb0MsZUFBZSxFQUFFLE9BQU8sRUFBRTtNQUN0RlI7SUFDRixDQUFDLENBQUM7SUFDRixPQUFPVSw0QkFBNEIsQ0FBQ0MsT0FBTyxFQUFFLENBQUNDLElBQUksQ0FBQ0MsTUFBTSxJQUFJO01BQzNELElBQUlBLE1BQU0sQ0FBQ0MsT0FBTyxDQUFDQyxNQUFNLElBQUlGLE1BQU0sQ0FBQ0MsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDckIsYUFBYSxFQUFFO1FBQzVELE9BQU9QLE9BQU8sQ0FBQ0MsT0FBTyxDQUFDMEIsTUFBTSxDQUFDQyxPQUFPLENBQUNDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNsRCxDQUFDLE1BQU0sSUFBSUYsTUFBTSxDQUFDQyxPQUFPLENBQUNDLE1BQU0sRUFBRTtRQUNoQ1osS0FBSyxDQUFDYSxRQUFRLEdBQUdILE1BQU0sQ0FBQ0MsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDRSxRQUFRO01BQzdDO01BQ0EsT0FBT0MsYUFBSSxDQUFDQyxNQUFNLENBQUMsSUFBSSxDQUFDOUMsTUFBTSxFQUFFb0MsZUFBZSxFQUFFLE9BQU8sRUFBRUwsS0FBSyxFQUFFQyxZQUFZLENBQUM7SUFDaEYsQ0FBQyxDQUFDO0VBQ0o7RUFFQWUsdUJBQXVCLENBQUNuQixRQUFRLEVBQUVDLEtBQUssRUFBRTtJQUN2QyxPQUFPLElBQUksQ0FBQzdCLE1BQU0sQ0FBQ2dELFFBQVEsQ0FDeEJDLElBQUksQ0FDSCxPQUFPLEVBQ1A7TUFDRXJCLFFBQVEsRUFBRUEsUUFBUTtNQUNsQnNCLGlCQUFpQixFQUFFckI7SUFDckIsQ0FBQyxFQUNEO01BQUVzQixLQUFLLEVBQUU7SUFBRSxDQUFDLEVBQ1oxRCxJQUFJLENBQUM0QyxXQUFXLENBQUMsSUFBSSxDQUFDckMsTUFBTSxDQUFDLENBQzlCLENBQ0F3QyxJQUFJLENBQUNFLE9BQU8sSUFBSTtNQUNmLElBQUlBLE9BQU8sQ0FBQ0MsTUFBTSxJQUFJLENBQUMsRUFBRTtRQUN2QixNQUFNLCtEQUErRDtNQUN2RTtNQUVBLElBQUksSUFBSSxDQUFDM0MsTUFBTSxDQUFDb0QsY0FBYyxJQUFJLElBQUksQ0FBQ3BELE1BQU0sQ0FBQ29ELGNBQWMsQ0FBQ0MsMEJBQTBCLEVBQUU7UUFDdkYsSUFBSUMsV0FBVyxHQUFHWixPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUNhLDRCQUE0QjtRQUN6RCxJQUFJRCxXQUFXLElBQUlBLFdBQVcsQ0FBQ0UsTUFBTSxJQUFJLE1BQU0sRUFBRTtVQUMvQ0YsV0FBVyxHQUFHLElBQUluQixJQUFJLENBQUNtQixXQUFXLENBQUNHLEdBQUcsQ0FBQztRQUN6QztRQUNBLElBQUlILFdBQVcsR0FBRyxJQUFJbkIsSUFBSSxFQUFFLEVBQUUsTUFBTSxxQ0FBcUM7TUFDM0U7TUFDQSxPQUFPTyxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQ25CLENBQUMsQ0FBQztFQUNOO0VBRUFnQixlQUFlLENBQUNqRCxJQUFJLEVBQUU7SUFDcEIsSUFBSUEsSUFBSSxDQUFDbUIsUUFBUSxJQUFJbkIsSUFBSSxDQUFDa0QsS0FBSyxFQUFFO01BQy9CLE9BQU83QyxPQUFPLENBQUNDLE9BQU8sQ0FBQ04sSUFBSSxDQUFDO0lBQzlCO0lBQ0EsSUFBSW1ELEtBQUssR0FBRyxDQUFDLENBQUM7SUFDZCxJQUFJbkQsSUFBSSxDQUFDbUIsUUFBUSxFQUFFO01BQ2pCZ0MsS0FBSyxDQUFDaEMsUUFBUSxHQUFHbkIsSUFBSSxDQUFDbUIsUUFBUTtJQUNoQztJQUNBLElBQUluQixJQUFJLENBQUNrRCxLQUFLLEVBQUU7TUFDZEMsS0FBSyxDQUFDRCxLQUFLLEdBQUdsRCxJQUFJLENBQUNrRCxLQUFLO0lBQzFCO0lBRUEsSUFBSTVCLEtBQUssR0FBRyxJQUFJeEMsU0FBUyxDQUFDLElBQUksQ0FBQ1MsTUFBTSxFQUFFUCxJQUFJLENBQUNvRSxNQUFNLENBQUMsSUFBSSxDQUFDN0QsTUFBTSxDQUFDLEVBQUUsT0FBTyxFQUFFNEQsS0FBSyxDQUFDO0lBQ2hGLE9BQU83QixLQUFLLENBQUNRLE9BQU8sRUFBRSxDQUFDQyxJQUFJLENBQUMsVUFBVUMsTUFBTSxFQUFFO01BQzVDLElBQUlBLE1BQU0sQ0FBQ0MsT0FBTyxDQUFDQyxNQUFNLElBQUksQ0FBQyxFQUFFO1FBQzlCLE1BQU1iLFNBQVM7TUFDakI7TUFDQSxPQUFPVyxNQUFNLENBQUNDLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDMUIsQ0FBQyxDQUFDO0VBQ0o7RUFFQSxNQUFNMUIscUJBQXFCLENBQUNQLElBQUksRUFBRUMsR0FBRyxFQUFFO0lBQ3JDLElBQUksQ0FBQyxJQUFJLENBQUNOLGtCQUFrQixFQUFFO01BQzVCO0lBQ0Y7SUFDQSxNQUFNeUIsS0FBSyxHQUFHaUMsa0JBQWtCLENBQUNyRCxJQUFJLENBQUNRLG1CQUFtQixDQUFDO0lBQzFEO0lBQ0EsTUFBTThDLFdBQVcsR0FBRyxNQUFNLElBQUksQ0FBQ0wsZUFBZSxDQUFDakQsSUFBSSxDQUFDO0lBQ3BELElBQUlHLGVBQWUsR0FBRyxJQUFJLENBQUNaLE1BQU0sQ0FBQ2dFLHlCQUF5QjtJQUMzRCxJQUFJLE9BQU9wRCxlQUFlLEtBQUssVUFBVSxFQUFFO01BQUE7TUFDekMsTUFBTUMsUUFBUSxHQUFHLE1BQU1DLE9BQU8sQ0FBQ0MsT0FBTyxDQUNwQyxJQUFJLENBQUNmLE1BQU0sQ0FBQ2dFLHlCQUF5QixDQUFDO1FBQ3BDdkQsSUFBSSxFQUFFZSxhQUFLLENBQUN5QyxNQUFNLENBQUNDLFFBQVE7VUFBR0MsU0FBUyxFQUFFO1FBQU8sR0FBS0osV0FBVyxFQUFHO1FBQ25FRixNQUFNLGVBQUVuRCxHQUFHLENBQUMwRCxJQUFJLDhDQUFSLFVBQVVDO01BQ3BCLENBQUMsQ0FBQyxDQUNIO01BQ0R6RCxlQUFlLEdBQUcsQ0FBQyxDQUFDQyxRQUFRO0lBQzlCO0lBQ0EsSUFBSSxDQUFDRCxlQUFlLEVBQUU7TUFDcEI7SUFDRjtJQUNBLE1BQU1nQixRQUFRLEdBQUdrQyxrQkFBa0IsQ0FBQ3JELElBQUksQ0FBQ21CLFFBQVEsQ0FBQztJQUVsRCxNQUFNMEMsSUFBSSxHQUFHQyxjQUFjLENBQUMsSUFBSSxDQUFDdkUsTUFBTSxDQUFDd0UsY0FBYyxFQUFFNUMsUUFBUSxFQUFFQyxLQUFLLEVBQUUsSUFBSSxDQUFDN0IsTUFBTSxDQUFDO0lBQ3JGLE1BQU1ELE9BQU8sR0FBRztNQUNkMEUsT0FBTyxFQUFFLElBQUksQ0FBQ3pFLE1BQU0sQ0FBQ3lFLE9BQU87TUFDNUJILElBQUksRUFBRUEsSUFBSTtNQUNWN0QsSUFBSSxFQUFFLElBQUFpRSxpQkFBTyxFQUFDLE9BQU8sRUFBRVgsV0FBVztJQUNwQyxDQUFDO0lBQ0QsSUFBSSxJQUFJLENBQUNsRSxPQUFPLENBQUNtQixxQkFBcUIsRUFBRTtNQUN0QyxJQUFJLENBQUNuQixPQUFPLENBQUNtQixxQkFBcUIsQ0FBQ2pCLE9BQU8sQ0FBQztJQUM3QyxDQUFDLE1BQU07TUFDTCxJQUFJLENBQUNGLE9BQU8sQ0FBQzhFLFFBQVEsQ0FBQyxJQUFJLENBQUNDLHdCQUF3QixDQUFDN0UsT0FBTyxDQUFDLENBQUM7SUFDL0Q7RUFDRjs7RUFFQTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDRSxNQUFNOEUsMEJBQTBCLENBQUNwRSxJQUFJLEVBQUVvRCxNQUFNLEVBQUU7SUFDN0MsTUFBTTtNQUFFNUM7SUFBb0IsQ0FBQyxHQUFHUixJQUFJO0lBQ3BDLElBQUk7TUFBRWM7SUFBK0IsQ0FBQyxHQUFHZCxJQUFJO0lBQzdDLElBQUljLDhCQUE4QixJQUFJQSw4QkFBOEIsQ0FBQ2lDLE1BQU0sS0FBSyxNQUFNLEVBQUU7TUFDdEZqQyw4QkFBOEIsR0FBR0EsOEJBQThCLENBQUNrQyxHQUFHO0lBQ3JFO0lBQ0EsSUFDRSxJQUFJLENBQUN6RCxNQUFNLENBQUM4RSw0QkFBNEIsSUFDeEMsSUFBSSxDQUFDOUUsTUFBTSxDQUFDc0IsZ0NBQWdDLElBQzVDTCxtQkFBbUIsSUFDbkIsSUFBSWtCLElBQUksRUFBRSxHQUFHLElBQUlBLElBQUksQ0FBQ1osOEJBQThCLENBQUMsRUFDckQ7TUFDQSxPQUFPVCxPQUFPLENBQUNDLE9BQU8sRUFBRTtJQUMxQjtJQUNBLE1BQU1nRSxVQUFVLEdBQUcsTUFBTSxJQUFJLENBQUN2RSxtQkFBbUIsQ0FBQ0MsSUFBSSxFQUFFO01BQUVBLElBQUk7TUFBRW9EO0lBQU8sQ0FBQyxDQUFDO0lBQ3pFLElBQUksQ0FBQ2tCLFVBQVUsRUFBRTtNQUNmO0lBQ0Y7SUFDQSxPQUFPLElBQUksQ0FBQy9FLE1BQU0sQ0FBQ2dELFFBQVEsQ0FBQ0YsTUFBTSxDQUFDLE9BQU8sRUFBRTtNQUFFbEIsUUFBUSxFQUFFbkIsSUFBSSxDQUFDbUI7SUFBUyxDQUFDLEVBQUVuQixJQUFJLENBQUM7RUFDaEY7RUFFQSxNQUFNdUUsdUJBQXVCLENBQUNwRCxRQUFRLEVBQUVsQixHQUFHLEVBQUU7SUFBQTtJQUMzQyxNQUFNdUUsS0FBSyxHQUFHLE1BQU0sSUFBSSxDQUFDdkIsZUFBZSxDQUFDO01BQUU5QixRQUFRLEVBQUVBO0lBQVMsQ0FBQyxDQUFDO0lBQ2hFLElBQUksQ0FBQ3FELEtBQUssSUFBSUEsS0FBSyxDQUFDNUQsYUFBYSxFQUFFO01BQ2pDLE1BQU1TLFNBQVM7SUFDakI7SUFDQSxNQUFNb0QsUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDTCwwQkFBMEIsQ0FBQ0ksS0FBSyxnQkFBRXZFLEdBQUcsQ0FBQzBELElBQUksK0NBQVIsV0FBVUMsUUFBUSxDQUFDO0lBQ2pGLElBQUlhLFFBQVEsRUFBRTtNQUNaLElBQUksQ0FBQ2xFLHFCQUFxQixDQUFDaUUsS0FBSyxFQUFFdkUsR0FBRyxDQUFDO0lBQ3hDO0VBQ0Y7RUFFQXlFLHFCQUFxQixDQUFDeEIsS0FBSyxFQUFFO0lBQzNCLE1BQU05QixLQUFLLEdBQUc7TUFBRXFCLGlCQUFpQixFQUFFLElBQUFoQyx5QkFBWSxFQUFDLEVBQUU7SUFBRSxDQUFDO0lBRXJELElBQUksSUFBSSxDQUFDbEIsTUFBTSxDQUFDb0QsY0FBYyxJQUFJLElBQUksQ0FBQ3BELE1BQU0sQ0FBQ29ELGNBQWMsQ0FBQ0MsMEJBQTBCLEVBQUU7TUFDdkZ4QixLQUFLLENBQUMwQiw0QkFBNEIsR0FBRy9CLGFBQUssQ0FBQ0MsT0FBTyxDQUNoRCxJQUFJLENBQUN6QixNQUFNLENBQUNvRixtQ0FBbUMsRUFBRSxDQUNsRDtJQUNIO0lBRUEsT0FBTyxJQUFJLENBQUNwRixNQUFNLENBQUNnRCxRQUFRLENBQUNGLE1BQU0sQ0FDaEMsT0FBTyxFQUNQO01BQUV1QyxHQUFHLEVBQUUsQ0FBQztRQUFFMUI7TUFBTSxDQUFDLEVBQUU7UUFBRS9CLFFBQVEsRUFBRStCLEtBQUs7UUFBRUEsS0FBSyxFQUFFO1VBQUUyQixPQUFPLEVBQUU7UUFBTTtNQUFFLENBQUM7SUFBRSxDQUFDLEVBQ3BFekQsS0FBSyxFQUNMLENBQUMsQ0FBQyxFQUNGLElBQUksQ0FDTDtFQUNIO0VBRUEsTUFBTTBELHNCQUFzQixDQUFDNUIsS0FBSyxFQUFFO0lBQ2xDLElBQUksQ0FBQyxJQUFJLENBQUM5RCxPQUFPLEVBQUU7TUFDakIsTUFBTSx1REFBdUQ7TUFDN0Q7SUFDRjs7SUFDQSxJQUFJWSxJQUFJO0lBQ1IsSUFDRSxJQUFJLENBQUNULE1BQU0sQ0FBQ29ELGNBQWMsSUFDMUIsSUFBSSxDQUFDcEQsTUFBTSxDQUFDb0QsY0FBYyxDQUFDb0Msc0JBQXNCLElBQ2pELElBQUksQ0FBQ3hGLE1BQU0sQ0FBQ29ELGNBQWMsQ0FBQ0MsMEJBQTBCLEVBQ3JEO01BQ0EsTUFBTVgsT0FBTyxHQUFHLE1BQU0sSUFBSSxDQUFDMUMsTUFBTSxDQUFDZ0QsUUFBUSxDQUFDQyxJQUFJLENBQzdDLE9BQU8sRUFDUDtRQUNFb0MsR0FBRyxFQUFFLENBQ0g7VUFBRTFCLEtBQUs7VUFBRVQsaUJBQWlCLEVBQUU7WUFBRW9DLE9BQU8sRUFBRTtVQUFLO1FBQUUsQ0FBQyxFQUMvQztVQUFFMUQsUUFBUSxFQUFFK0IsS0FBSztVQUFFQSxLQUFLLEVBQUU7WUFBRTJCLE9BQU8sRUFBRTtVQUFNLENBQUM7VUFBRXBDLGlCQUFpQixFQUFFO1lBQUVvQyxPQUFPLEVBQUU7VUFBSztRQUFFLENBQUM7TUFFeEYsQ0FBQyxFQUNEO1FBQUVuQyxLQUFLLEVBQUU7TUFBRSxDQUFDLEVBQ1oxRCxJQUFJLENBQUM0QyxXQUFXLENBQUMsSUFBSSxDQUFDckMsTUFBTSxDQUFDLENBQzlCO01BQ0QsSUFBSTBDLE9BQU8sQ0FBQ0MsTUFBTSxJQUFJLENBQUMsRUFBRTtRQUN2QixJQUFJVyxXQUFXLEdBQUdaLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQ2EsNEJBQTRCO1FBQ3pELElBQUlELFdBQVcsSUFBSUEsV0FBVyxDQUFDRSxNQUFNLElBQUksTUFBTSxFQUFFO1VBQy9DRixXQUFXLEdBQUcsSUFBSW5CLElBQUksQ0FBQ21CLFdBQVcsQ0FBQ0csR0FBRyxDQUFDO1FBQ3pDO1FBQ0EsSUFBSUgsV0FBVyxHQUFHLElBQUluQixJQUFJLEVBQUUsRUFBRTtVQUM1QjFCLElBQUksR0FBR2lDLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDbkI7TUFDRjtJQUNGO0lBQ0EsSUFBSSxDQUFDakMsSUFBSSxJQUFJLENBQUNBLElBQUksQ0FBQ3lDLGlCQUFpQixFQUFFO01BQ3BDekMsSUFBSSxHQUFHLE1BQU0sSUFBSSxDQUFDMEUscUJBQXFCLENBQUN4QixLQUFLLENBQUM7SUFDaEQ7SUFDQSxNQUFNOUIsS0FBSyxHQUFHaUMsa0JBQWtCLENBQUNyRCxJQUFJLENBQUN5QyxpQkFBaUIsQ0FBQztJQUN4RCxNQUFNdEIsUUFBUSxHQUFHa0Msa0JBQWtCLENBQUNyRCxJQUFJLENBQUNtQixRQUFRLENBQUM7SUFFbEQsTUFBTTBDLElBQUksR0FBR0MsY0FBYyxDQUFDLElBQUksQ0FBQ3ZFLE1BQU0sQ0FBQ3lGLHVCQUF1QixFQUFFN0QsUUFBUSxFQUFFQyxLQUFLLEVBQUUsSUFBSSxDQUFDN0IsTUFBTSxDQUFDO0lBQzlGLE1BQU1ELE9BQU8sR0FBRztNQUNkMEUsT0FBTyxFQUFFLElBQUksQ0FBQ3pFLE1BQU0sQ0FBQ3lFLE9BQU87TUFDNUJILElBQUksRUFBRUEsSUFBSTtNQUNWN0QsSUFBSSxFQUFFLElBQUFpRSxpQkFBTyxFQUFDLE9BQU8sRUFBRWpFLElBQUk7SUFDN0IsQ0FBQztJQUVELElBQUksSUFBSSxDQUFDWixPQUFPLENBQUMwRixzQkFBc0IsRUFBRTtNQUN2QyxJQUFJLENBQUMxRixPQUFPLENBQUMwRixzQkFBc0IsQ0FBQ3hGLE9BQU8sQ0FBQztJQUM5QyxDQUFDLE1BQU07TUFDTCxJQUFJLENBQUNGLE9BQU8sQ0FBQzhFLFFBQVEsQ0FBQyxJQUFJLENBQUNlLHlCQUF5QixDQUFDM0YsT0FBTyxDQUFDLENBQUM7SUFDaEU7SUFFQSxPQUFPZSxPQUFPLENBQUNDLE9BQU8sQ0FBQ04sSUFBSSxDQUFDO0VBQzlCO0VBRUFrRixjQUFjLENBQUMvRCxRQUFRLEVBQUVDLEtBQUssRUFBRStELFFBQVEsRUFBRTtJQUN4QyxPQUFPLElBQUksQ0FBQzdDLHVCQUF1QixDQUFDbkIsUUFBUSxFQUFFQyxLQUFLLENBQUMsQ0FDakRXLElBQUksQ0FBQy9CLElBQUksSUFBSW9GLGtCQUFrQixDQUFDcEYsSUFBSSxFQUFFbUYsUUFBUSxFQUFFLElBQUksQ0FBQzVGLE1BQU0sQ0FBQyxDQUFDLENBQzdEd0MsSUFBSSxDQUFDL0IsSUFBSSxJQUFJO01BQ1osTUFBTXFGLG9CQUFvQixHQUFHLElBQUlDLHVCQUFjLENBQUN0RixJQUFJLEVBQUUsSUFBSSxDQUFDVCxNQUFNLENBQUM7TUFDbEUsT0FBTzhGLG9CQUFvQixDQUFDRSxhQUFhLEVBQUU7SUFDN0MsQ0FBQyxDQUFDLENBQ0RDLEtBQUssQ0FBQ0MsS0FBSyxJQUFJO01BQ2QsSUFBSUEsS0FBSyxJQUFJQSxLQUFLLENBQUNDLE9BQU8sRUFBRTtRQUMxQjtRQUNBLE9BQU9yRixPQUFPLENBQUNzRixNQUFNLENBQUNGLEtBQUssQ0FBQ0MsT0FBTyxDQUFDO01BQ3RDLENBQUMsTUFBTTtRQUNMLE9BQU9yRixPQUFPLENBQUNzRixNQUFNLENBQUNGLEtBQUssQ0FBQztNQUM5QjtJQUNGLENBQUMsQ0FBQztFQUNOO0VBRUF0Qix3QkFBd0IsQ0FBQztJQUFFTixJQUFJO0lBQUU3RCxJQUFJO0lBQUVnRTtFQUFRLENBQUMsRUFBRTtJQUNoRCxNQUFNNEIsSUFBSSxHQUNSLFNBQVMsR0FDVCxvREFBb0QsR0FDcEQ1RixJQUFJLENBQUNQLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FDakIsUUFBUSxHQUNSdUUsT0FBTyxHQUNQLE1BQU0sR0FDTixFQUFFLEdBQ0YsNkJBQTZCLEdBQzdCSCxJQUFJO0lBQ04sTUFBTWdDLEVBQUUsR0FBRzdGLElBQUksQ0FBQ1AsR0FBRyxDQUFDLE9BQU8sQ0FBQztJQUM1QixNQUFNcUcsT0FBTyxHQUFHLGdDQUFnQyxHQUFHOUIsT0FBTztJQUMxRCxPQUFPO01BQUU0QixJQUFJO01BQUVDLEVBQUU7TUFBRUM7SUFBUSxDQUFDO0VBQzlCO0VBRUFiLHlCQUF5QixDQUFDO0lBQUVwQixJQUFJO0lBQUU3RCxJQUFJO0lBQUVnRTtFQUFRLENBQUMsRUFBRTtJQUNqRCxNQUFNNEIsSUFBSSxHQUNSLFNBQVMsR0FDVCwyQ0FBMkMsR0FDM0M1QixPQUFPLElBQ05oRSxJQUFJLENBQUNQLEdBQUcsQ0FBQyxVQUFVLENBQUMsR0FBRyxzQkFBc0IsR0FBR08sSUFBSSxDQUFDUCxHQUFHLENBQUMsVUFBVSxDQUFDLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQyxHQUNsRixPQUFPLEdBQ1AsRUFBRSxHQUNGLDJCQUEyQixHQUMzQm9FLElBQUk7SUFDTixNQUFNZ0MsRUFBRSxHQUFHN0YsSUFBSSxDQUFDUCxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUlPLElBQUksQ0FBQ1AsR0FBRyxDQUFDLFVBQVUsQ0FBQztJQUNwRCxNQUFNcUcsT0FBTyxHQUFHLHFCQUFxQixHQUFHOUIsT0FBTztJQUMvQyxPQUFPO01BQUU0QixJQUFJO01BQUVDLEVBQUU7TUFBRUM7SUFBUSxDQUFDO0VBQzlCO0FBQ0Y7O0FBRUE7QUFBQTtBQUNBLFNBQVNWLGtCQUFrQixDQUFDcEYsSUFBSSxFQUFFbUYsUUFBUSxFQUFFNUYsTUFBTSxFQUFFO0VBQ2xELE9BQU82QyxhQUFJLENBQ1JDLE1BQU0sQ0FDTDlDLE1BQU0sRUFDTlAsSUFBSSxDQUFDb0UsTUFBTSxDQUFDN0QsTUFBTSxDQUFDLEVBQ25CLE9BQU8sRUFDUDtJQUFFNEMsUUFBUSxFQUFFbkMsSUFBSSxDQUFDbUM7RUFBUyxDQUFDLEVBQzNCO0lBQ0VnRCxRQUFRLEVBQUVBO0VBQ1osQ0FBQyxDQUNGLENBQ0FwRCxJQUFJLENBQUMsTUFBTS9CLElBQUksQ0FBQztBQUNyQjtBQUVBLFNBQVM4RCxjQUFjLENBQUNpQyxXQUFXLEVBQUU1RSxRQUFRLEVBQUVDLEtBQUssRUFBRTdCLE1BQU0sRUFBRTtFQUM1RCxNQUFNeUcsZ0JBQWdCLEdBQUksU0FBUTVFLEtBQU0sYUFBWUQsUUFBUyxFQUFDO0VBRTlELElBQUk1QixNQUFNLENBQUMwRyxhQUFhLEVBQUU7SUFDeEIsTUFBTUMsc0JBQXNCLEdBQUdILFdBQVcsQ0FBQ0ksT0FBTyxDQUFDNUcsTUFBTSxDQUFDNkcsZUFBZSxFQUFFLEVBQUUsQ0FBQztJQUU5RSxPQUFRLEdBQUU3RyxNQUFNLENBQUMwRyxhQUFjLFNBQVE1QyxrQkFBa0IsQ0FDdkQ2QyxzQkFBc0IsQ0FDdEIsSUFBR0YsZ0JBQWlCLEVBQUM7RUFDekIsQ0FBQyxNQUFNO0lBQ0wsT0FBUSxHQUFFRCxXQUFZLElBQUdDLGdCQUFpQixFQUFDO0VBQzdDO0FBQ0Y7QUFBQyxlQUVjL0csY0FBYztBQUFBIn0=