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.
- package/README.md +45 -17
- package/lib/AccountLockout.js +11 -26
- package/lib/Adapters/AdapterLoader.js +8 -14
- package/lib/Adapters/Analytics/AnalyticsAdapter.js +2 -8
- package/lib/Adapters/Auth/AuthAdapter.js +7 -16
- package/lib/Adapters/Auth/OAuth1Client.js +32 -57
- package/lib/Adapters/Auth/apple.js +6 -22
- package/lib/Adapters/Auth/facebook.js +7 -37
- package/lib/Adapters/Auth/gcenter.js +8 -37
- package/lib/Adapters/Auth/github.js +7 -10
- package/lib/Adapters/Auth/google.js +11 -34
- package/lib/Adapters/Auth/gpgames.js +5 -8
- package/lib/Adapters/Auth/httpsRequest.js +1 -7
- package/lib/Adapters/Auth/index.js +20 -65
- package/lib/Adapters/Auth/instagram.js +5 -9
- package/lib/Adapters/Auth/janraincapture.js +8 -12
- package/lib/Adapters/Auth/janrainengage.js +7 -11
- package/lib/Adapters/Auth/keycloak.js +5 -19
- package/lib/Adapters/Auth/ldap.js +1 -15
- package/lib/Adapters/Auth/line.js +7 -10
- package/lib/Adapters/Auth/linkedin.js +7 -12
- package/lib/Adapters/Auth/meetup.js +7 -10
- package/lib/Adapters/Auth/microsoft.js +7 -10
- package/lib/Adapters/Auth/oauth2.js +6 -18
- package/lib/Adapters/Auth/phantauth.js +8 -10
- package/lib/Adapters/Auth/qq.js +7 -13
- package/lib/Adapters/Auth/spotify.js +7 -14
- package/lib/Adapters/Auth/twitter.js +5 -15
- package/lib/Adapters/Auth/vkontakte.js +9 -15
- package/lib/Adapters/Auth/wechat.js +7 -10
- package/lib/Adapters/Auth/weibo.js +7 -11
- package/lib/Adapters/Cache/CacheAdapter.js +4 -12
- package/lib/Adapters/Cache/InMemoryCache.js +5 -19
- package/lib/Adapters/Cache/InMemoryCacheAdapter.js +1 -11
- package/lib/Adapters/Cache/LRUCache.js +1 -11
- package/lib/Adapters/Cache/NullCacheAdapter.js +1 -8
- package/lib/Adapters/Cache/RedisCacheAdapter.js +46 -87
- package/lib/Adapters/Cache/SchemaCache.js +1 -6
- package/lib/Adapters/Email/MailAdapter.js +2 -7
- package/lib/Adapters/Files/FilesAdapter.js +7 -21
- package/lib/Adapters/Files/GridFSBucketAdapter.js +6 -44
- package/lib/Adapters/Files/GridStoreAdapter.js +1 -1
- package/lib/Adapters/Logger/LoggerAdapter.js +2 -11
- package/lib/Adapters/Logger/WinstonLogger.js +3 -30
- package/lib/Adapters/Logger/WinstonLoggerAdapter.js +5 -16
- package/lib/Adapters/MessageQueue/EventEmitterMQ.js +3 -20
- package/lib/Adapters/PubSub/EventEmitterPubSub.js +1 -16
- package/lib/Adapters/PubSub/PubSubAdapter.js +2 -9
- package/lib/Adapters/PubSub/RedisPubSub.js +13 -10
- package/lib/Adapters/Push/PushAdapter.js +2 -8
- package/lib/Adapters/Storage/Mongo/MongoCollection.js +12 -37
- package/lib/Adapters/Storage/Mongo/MongoSchemaCollection.js +26 -79
- package/lib/Adapters/Storage/Mongo/MongoStorageAdapter.js +78 -209
- package/lib/Adapters/Storage/Mongo/MongoTransform.js +82 -371
- package/lib/Adapters/Storage/Postgres/PostgresClient.js +1 -13
- package/lib/Adapters/Storage/Postgres/PostgresConfigParser.js +1 -20
- package/lib/Adapters/Storage/Postgres/PostgresStorageAdapter.js +119 -446
- package/lib/Adapters/Storage/Postgres/sql/index.js +4 -7
- package/lib/Adapters/Storage/StorageAdapter.js +1 -1
- package/lib/Adapters/WebSocketServer/WSAdapter.js +3 -12
- package/lib/Adapters/WebSocketServer/WSSAdapter.js +7 -12
- package/lib/Auth.js +54 -121
- package/lib/ClientSDK.js +3 -11
- package/lib/Config.js +69 -113
- package/lib/Controllers/AdaptableController.js +6 -18
- package/lib/Controllers/AnalyticsController.js +1 -9
- package/lib/Controllers/CacheController.js +3 -23
- package/lib/Controllers/DatabaseController.js +147 -345
- package/lib/Controllers/FilesController.js +5 -34
- package/lib/Controllers/HooksController.js +1 -51
- package/lib/Controllers/LiveQueryController.js +4 -23
- package/lib/Controllers/LoggerController.js +15 -54
- package/lib/Controllers/ParseGraphQLController.js +49 -104
- package/lib/Controllers/PushController.js +20 -59
- package/lib/Controllers/SchemaController.js +154 -344
- package/lib/Controllers/UserController.js +11 -72
- package/lib/Controllers/index.js +19 -68
- package/lib/Controllers/types.js +1 -1
- package/lib/Deprecator/Deprecations.js +1 -8
- package/lib/Deprecator/Deprecator.js +9 -18
- package/lib/GraphQL/ParseGraphQLSchema.js +16 -100
- package/lib/GraphQL/ParseGraphQLServer.js +2 -29
- package/lib/GraphQL/helpers/objectsMutations.js +2 -12
- package/lib/GraphQL/helpers/objectsQueries.js +18 -76
- package/lib/GraphQL/loaders/defaultGraphQLMutations.js +1 -9
- package/lib/GraphQL/loaders/defaultGraphQLQueries.js +1 -8
- package/lib/GraphQL/loaders/defaultGraphQLTypes.js +9 -115
- package/lib/GraphQL/loaders/defaultRelaySchema.js +6 -18
- package/lib/GraphQL/loaders/filesMutations.js +2 -19
- package/lib/GraphQL/loaders/functionsMutations.js +6 -17
- package/lib/GraphQL/loaders/parseClassMutations.js +6 -44
- package/lib/GraphQL/loaders/parseClassQueries.js +1 -26
- package/lib/GraphQL/loaders/parseClassTypes.js +10 -64
- package/lib/GraphQL/loaders/schemaDirectives.js +1 -17
- package/lib/GraphQL/loaders/schemaMutations.js +1 -20
- package/lib/GraphQL/loaders/schemaQueries.js +1 -14
- package/lib/GraphQL/loaders/schemaTypes.js +2 -6
- package/lib/GraphQL/loaders/usersMutations.js +6 -28
- package/lib/GraphQL/loaders/usersQueries.js +4 -26
- package/lib/GraphQL/parseGraphQLUtils.js +6 -19
- package/lib/GraphQL/transformers/className.js +1 -4
- package/lib/GraphQL/transformers/constraintType.js +1 -20
- package/lib/GraphQL/transformers/inputType.js +1 -20
- package/lib/GraphQL/transformers/mutation.js +6 -51
- package/lib/GraphQL/transformers/outputType.js +1 -20
- package/lib/GraphQL/transformers/query.js +6 -42
- package/lib/GraphQL/transformers/schemaFields.js +7 -34
- package/lib/KeyPromiseQueue.js +1 -12
- package/lib/LiveQuery/Client.js +1 -25
- package/lib/LiveQuery/Id.js +1 -7
- package/lib/LiveQuery/ParseCloudCodePublisher.js +13 -19
- package/lib/LiveQuery/ParseLiveQueryServer.js +92 -306
- package/lib/LiveQuery/ParsePubSub.js +1 -12
- package/lib/LiveQuery/ParseWebSocketServer.js +4 -26
- package/lib/LiveQuery/QueryTools.js +14 -116
- package/lib/LiveQuery/RequestSchema.js +1 -1
- package/lib/LiveQuery/SessionTokenCache.js +1 -17
- package/lib/LiveQuery/Subscription.js +4 -18
- package/lib/LiveQuery/equalObjects.js +2 -14
- package/lib/Options/Definitions.js +79 -10
- package/lib/Options/docs.js +23 -3
- package/lib/Options/index.js +4 -12
- package/lib/Options/parsers.js +1 -18
- package/lib/Page.js +1 -9
- package/lib/ParseMessageQueue.js +1 -10
- package/lib/ParseServer.js +144 -182
- package/lib/ParseServerRESTController.js +6 -33
- package/lib/PromiseRouter.js +16 -50
- package/lib/Push/PushQueue.js +3 -15
- package/lib/Push/PushWorker.js +7 -32
- package/lib/Push/utils.js +9 -38
- package/lib/RestQuery.js +105 -242
- package/lib/RestWrite.js +212 -377
- package/lib/Routers/AggregateRouter.js +14 -51
- package/lib/Routers/AnalyticsRouter.js +2 -8
- package/lib/Routers/AudiencesRouter.js +1 -15
- package/lib/Routers/ClassesRouter.js +3 -53
- package/lib/Routers/CloudCodeRouter.js +1 -19
- package/lib/Routers/FeaturesRouter.js +1 -10
- package/lib/Routers/FilesRouter.js +29 -76
- package/lib/Routers/FunctionsRouter.js +5 -28
- package/lib/Routers/GlobalConfigRouter.js +4 -18
- package/lib/Routers/GraphQLRouter.js +1 -14
- package/lib/Routers/HooksRouter.js +1 -29
- package/lib/Routers/IAPValidationRouter.js +6 -29
- package/lib/Routers/InstallationsRouter.js +2 -12
- package/lib/Routers/LogsRouter.js +4 -16
- package/lib/Routers/PagesRouter.js +69 -129
- package/lib/Routers/PublicAPIRouter.js +3 -62
- package/lib/Routers/PurgeRouter.js +1 -15
- package/lib/Routers/PushRouter.js +2 -18
- package/lib/Routers/RolesRouter.js +1 -7
- package/lib/Routers/SchemasRouter.js +4 -34
- package/lib/Routers/SecurityRouter.js +1 -12
- package/lib/Routers/SessionsRouter.js +3 -19
- package/lib/Routers/UsersRouter.js +58 -155
- package/lib/SchemaMigrations/DefinedSchemas.js +56 -115
- package/lib/SchemaMigrations/Migrations.js +2 -8
- package/lib/Security/Check.js +8 -16
- package/lib/Security/CheckGroup.js +4 -11
- package/lib/Security/CheckGroups/CheckGroupDatabase.js +8 -18
- package/lib/Security/CheckGroups/CheckGroupServerConfig.js +5 -15
- package/lib/Security/CheckGroups/CheckGroups.js +1 -4
- package/lib/Security/CheckRunner.js +22 -41
- package/lib/StatusHandler.js +12 -69
- package/lib/TestUtils.js +1 -6
- package/lib/Utils.js +27 -66
- package/lib/batch.js +17 -28
- package/lib/cache.js +1 -3
- package/lib/cli/definitions/parse-live-query-server.js +1 -3
- package/lib/cli/definitions/parse-server.js +1 -3
- package/lib/cli/parse-live-query-server.js +1 -6
- package/lib/cli/parse-server.js +11 -21
- package/lib/cli/utils/commander.js +13 -51
- package/lib/cli/utils/runner.js +1 -14
- package/lib/cloud-code/Parse.Cloud.js +71 -92
- package/lib/cryptoUtils.js +11 -19
- package/lib/defaults.js +2 -14
- package/lib/deprecated.js +1 -2
- package/lib/index.js +16 -34
- package/lib/logger.js +6 -13
- package/lib/middlewares.js +147 -151
- package/lib/password.js +6 -10
- package/lib/request.js +173 -2
- package/lib/requiredParameter.js +1 -3
- package/lib/rest.js +19 -41
- package/lib/triggers.js +54 -252
- package/lib/vendor/mongodbUrl.js +125 -305
- package/package.json +22 -19
- package/lib/cloud-code/HTTPResponse.js +0 -73
- package/lib/cloud-code/httpRequest.js +0 -192
|
@@ -4,73 +4,52 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.default = exports.UserController = void 0;
|
|
7
|
-
|
|
8
7
|
var _cryptoUtils = require("../cryptoUtils");
|
|
9
|
-
|
|
10
8
|
var _triggers = require("../triggers");
|
|
11
|
-
|
|
12
9
|
var _AdaptableController = _interopRequireDefault(require("./AdaptableController"));
|
|
13
|
-
|
|
14
10
|
var _MailAdapter = _interopRequireDefault(require("../Adapters/Email/MailAdapter"));
|
|
15
|
-
|
|
16
11
|
var _rest = _interopRequireDefault(require("../rest"));
|
|
17
|
-
|
|
18
12
|
var _node = _interopRequireDefault(require("parse/node"));
|
|
19
|
-
|
|
20
13
|
var _AccountLockout = _interopRequireDefault(require("../AccountLockout"));
|
|
21
|
-
|
|
22
14
|
var _Config = _interopRequireDefault(require("../Config"));
|
|
23
|
-
|
|
24
15
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
25
|
-
|
|
26
16
|
var RestQuery = require('../RestQuery');
|
|
27
|
-
|
|
28
17
|
var Auth = require('../Auth');
|
|
29
|
-
|
|
30
18
|
class UserController extends _AdaptableController.default {
|
|
31
19
|
constructor(adapter, appId, options = {}) {
|
|
32
20
|
super(adapter, appId, options);
|
|
33
21
|
}
|
|
34
|
-
|
|
35
22
|
get config() {
|
|
36
23
|
return _Config.default.get(this.appId);
|
|
37
24
|
}
|
|
38
|
-
|
|
39
25
|
validateAdapter(adapter) {
|
|
40
26
|
// Allow no adapter
|
|
41
27
|
if (!adapter && !this.shouldVerifyEmails) {
|
|
42
28
|
return;
|
|
43
29
|
}
|
|
44
|
-
|
|
45
30
|
super.validateAdapter(adapter);
|
|
46
31
|
}
|
|
47
|
-
|
|
48
32
|
expectedAdapterType() {
|
|
49
33
|
return _MailAdapter.default;
|
|
50
34
|
}
|
|
51
|
-
|
|
52
35
|
get shouldVerifyEmails() {
|
|
53
36
|
return this.options.verifyUserEmails;
|
|
54
37
|
}
|
|
55
|
-
|
|
56
38
|
setEmailVerifyToken(user) {
|
|
57
39
|
if (this.shouldVerifyEmails) {
|
|
58
40
|
user._email_verify_token = (0, _cryptoUtils.randomString)(25);
|
|
59
41
|
user.emailVerified = false;
|
|
60
|
-
|
|
61
42
|
if (this.config.emailVerifyTokenValidityDuration) {
|
|
62
43
|
user._email_verify_token_expires_at = _node.default._encode(this.config.generateEmailVerifyTokenExpiresAt());
|
|
63
44
|
}
|
|
64
45
|
}
|
|
65
46
|
}
|
|
66
|
-
|
|
67
47
|
verifyEmail(username, token) {
|
|
68
48
|
if (!this.shouldVerifyEmails) {
|
|
69
49
|
// Trying to verify email when not enabled
|
|
70
50
|
// TODO: Better error here.
|
|
71
51
|
throw undefined;
|
|
72
52
|
}
|
|
73
|
-
|
|
74
53
|
const query = {
|
|
75
54
|
username: username,
|
|
76
55
|
_email_verify_token: token
|
|
@@ -80,9 +59,10 @@ class UserController extends _AdaptableController.default {
|
|
|
80
59
|
_email_verify_token: {
|
|
81
60
|
__op: 'Delete'
|
|
82
61
|
}
|
|
83
|
-
};
|
|
84
|
-
// add additional query params and additional fields that need to be updated
|
|
62
|
+
};
|
|
85
63
|
|
|
64
|
+
// if the email verify token needs to be validated then
|
|
65
|
+
// add additional query params and additional fields that need to be updated
|
|
86
66
|
if (this.config.emailVerifyTokenValidityDuration) {
|
|
87
67
|
query.emailVerified = false;
|
|
88
68
|
query._email_verify_token_expires_at = {
|
|
@@ -92,7 +72,6 @@ class UserController extends _AdaptableController.default {
|
|
|
92
72
|
__op: 'Delete'
|
|
93
73
|
};
|
|
94
74
|
}
|
|
95
|
-
|
|
96
75
|
const masterAuth = Auth.master(this.config);
|
|
97
76
|
var findUserForEmailVerification = new RestQuery(this.config, Auth.master(this.config), '_User', {
|
|
98
77
|
username: username
|
|
@@ -103,11 +82,9 @@ class UserController extends _AdaptableController.default {
|
|
|
103
82
|
} else if (result.results.length) {
|
|
104
83
|
query.objectId = result.results[0].objectId;
|
|
105
84
|
}
|
|
106
|
-
|
|
107
85
|
return _rest.default.update(this.config, masterAuth, '_User', query, updateFields);
|
|
108
86
|
});
|
|
109
87
|
}
|
|
110
|
-
|
|
111
88
|
checkResetTokenValidity(username, token) {
|
|
112
89
|
return this.config.database.find('_User', {
|
|
113
90
|
username: username,
|
|
@@ -118,53 +95,41 @@ class UserController extends _AdaptableController.default {
|
|
|
118
95
|
if (results.length != 1) {
|
|
119
96
|
throw 'Failed to reset password: username / email / token is invalid';
|
|
120
97
|
}
|
|
121
|
-
|
|
122
98
|
if (this.config.passwordPolicy && this.config.passwordPolicy.resetTokenValidityDuration) {
|
|
123
99
|
let expiresDate = results[0]._perishable_token_expires_at;
|
|
124
|
-
|
|
125
100
|
if (expiresDate && expiresDate.__type == 'Date') {
|
|
126
101
|
expiresDate = new Date(expiresDate.iso);
|
|
127
102
|
}
|
|
128
|
-
|
|
129
103
|
if (expiresDate < new Date()) throw 'The password reset link has expired';
|
|
130
104
|
}
|
|
131
|
-
|
|
132
105
|
return results[0];
|
|
133
106
|
});
|
|
134
107
|
}
|
|
135
|
-
|
|
136
108
|
getUserIfNeeded(user) {
|
|
137
109
|
if (user.username && user.email) {
|
|
138
110
|
return Promise.resolve(user);
|
|
139
111
|
}
|
|
140
|
-
|
|
141
112
|
var where = {};
|
|
142
|
-
|
|
143
113
|
if (user.username) {
|
|
144
114
|
where.username = user.username;
|
|
145
115
|
}
|
|
146
|
-
|
|
147
116
|
if (user.email) {
|
|
148
117
|
where.email = user.email;
|
|
149
118
|
}
|
|
150
|
-
|
|
151
119
|
var query = new RestQuery(this.config, Auth.master(this.config), '_User', where);
|
|
152
120
|
return query.execute().then(function (result) {
|
|
153
121
|
if (result.results.length != 1) {
|
|
154
122
|
throw undefined;
|
|
155
123
|
}
|
|
156
|
-
|
|
157
124
|
return result.results[0];
|
|
158
125
|
});
|
|
159
126
|
}
|
|
160
|
-
|
|
161
127
|
sendVerificationEmail(user) {
|
|
162
128
|
if (!this.shouldVerifyEmails) {
|
|
163
129
|
return;
|
|
164
130
|
}
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
131
|
+
const token = encodeURIComponent(user._email_verify_token);
|
|
132
|
+
// We may need to fetch the user in case of update email
|
|
168
133
|
this.getUserIfNeeded(user).then(user => {
|
|
169
134
|
const username = encodeURIComponent(user.username);
|
|
170
135
|
const link = buildEmailLink(this.config.verifyEmailURL, username, token, this.config);
|
|
@@ -173,7 +138,6 @@ class UserController extends _AdaptableController.default {
|
|
|
173
138
|
link: link,
|
|
174
139
|
user: (0, _triggers.inflate)('_User', user)
|
|
175
140
|
};
|
|
176
|
-
|
|
177
141
|
if (this.adapter.sendVerificationEmail) {
|
|
178
142
|
this.adapter.sendVerificationEmail(options);
|
|
179
143
|
} else {
|
|
@@ -181,14 +145,13 @@ class UserController extends _AdaptableController.default {
|
|
|
181
145
|
}
|
|
182
146
|
});
|
|
183
147
|
}
|
|
148
|
+
|
|
184
149
|
/**
|
|
185
150
|
* Regenerates the given user's email verification token
|
|
186
151
|
*
|
|
187
152
|
* @param user
|
|
188
153
|
* @returns {*}
|
|
189
154
|
*/
|
|
190
|
-
|
|
191
|
-
|
|
192
155
|
regenerateEmailVerifyToken(user) {
|
|
193
156
|
const {
|
|
194
157
|
_email_verify_token
|
|
@@ -196,21 +159,17 @@ class UserController extends _AdaptableController.default {
|
|
|
196
159
|
let {
|
|
197
160
|
_email_verify_token_expires_at
|
|
198
161
|
} = user;
|
|
199
|
-
|
|
200
162
|
if (_email_verify_token_expires_at && _email_verify_token_expires_at.__type === 'Date') {
|
|
201
163
|
_email_verify_token_expires_at = _email_verify_token_expires_at.iso;
|
|
202
164
|
}
|
|
203
|
-
|
|
204
165
|
if (this.config.emailVerifyTokenReuseIfValid && this.config.emailVerifyTokenValidityDuration && _email_verify_token && new Date() < new Date(_email_verify_token_expires_at)) {
|
|
205
166
|
return Promise.resolve();
|
|
206
167
|
}
|
|
207
|
-
|
|
208
168
|
this.setEmailVerifyToken(user);
|
|
209
169
|
return this.config.database.update('_User', {
|
|
210
170
|
username: user.username
|
|
211
171
|
}, user);
|
|
212
172
|
}
|
|
213
|
-
|
|
214
173
|
resendVerificationEmail(username) {
|
|
215
174
|
return this.getUserIfNeeded({
|
|
216
175
|
username: username
|
|
@@ -218,22 +177,18 @@ class UserController extends _AdaptableController.default {
|
|
|
218
177
|
if (!aUser || aUser.emailVerified) {
|
|
219
178
|
throw undefined;
|
|
220
179
|
}
|
|
221
|
-
|
|
222
180
|
return this.regenerateEmailVerifyToken(aUser).then(() => {
|
|
223
181
|
this.sendVerificationEmail(aUser);
|
|
224
182
|
});
|
|
225
183
|
});
|
|
226
184
|
}
|
|
227
|
-
|
|
228
185
|
setPasswordResetToken(email) {
|
|
229
186
|
const token = {
|
|
230
187
|
_perishable_token: (0, _cryptoUtils.randomString)(25)
|
|
231
188
|
};
|
|
232
|
-
|
|
233
189
|
if (this.config.passwordPolicy && this.config.passwordPolicy.resetTokenValidityDuration) {
|
|
234
190
|
token._perishable_token_expires_at = _node.default._encode(this.config.generatePasswordResetTokenExpiresAt());
|
|
235
191
|
}
|
|
236
|
-
|
|
237
192
|
return this.config.database.update('_User', {
|
|
238
193
|
$or: [{
|
|
239
194
|
email
|
|
@@ -245,14 +200,13 @@ class UserController extends _AdaptableController.default {
|
|
|
245
200
|
}]
|
|
246
201
|
}, token, {}, true);
|
|
247
202
|
}
|
|
248
|
-
|
|
249
203
|
async sendPasswordResetEmail(email) {
|
|
250
204
|
if (!this.adapter) {
|
|
251
|
-
throw 'Trying to send a reset password but no adapter is set';
|
|
205
|
+
throw 'Trying to send a reset password but no adapter is set';
|
|
206
|
+
// TODO: No adapter?
|
|
252
207
|
}
|
|
253
208
|
|
|
254
209
|
let user;
|
|
255
|
-
|
|
256
210
|
if (this.config.passwordPolicy && this.config.passwordPolicy.resetTokenReuseIfValid && this.config.passwordPolicy.resetTokenValidityDuration) {
|
|
257
211
|
const results = await this.config.database.find('_User', {
|
|
258
212
|
$or: [{
|
|
@@ -272,24 +226,19 @@ class UserController extends _AdaptableController.default {
|
|
|
272
226
|
}, {
|
|
273
227
|
limit: 1
|
|
274
228
|
});
|
|
275
|
-
|
|
276
229
|
if (results.length == 1) {
|
|
277
230
|
let expiresDate = results[0]._perishable_token_expires_at;
|
|
278
|
-
|
|
279
231
|
if (expiresDate && expiresDate.__type == 'Date') {
|
|
280
232
|
expiresDate = new Date(expiresDate.iso);
|
|
281
233
|
}
|
|
282
|
-
|
|
283
234
|
if (expiresDate > new Date()) {
|
|
284
235
|
user = results[0];
|
|
285
236
|
}
|
|
286
237
|
}
|
|
287
238
|
}
|
|
288
|
-
|
|
289
239
|
if (!user || !user._perishable_token) {
|
|
290
240
|
user = await this.setPasswordResetToken(email);
|
|
291
241
|
}
|
|
292
|
-
|
|
293
242
|
const token = encodeURIComponent(user._perishable_token);
|
|
294
243
|
const username = encodeURIComponent(user.username);
|
|
295
244
|
const link = buildEmailLink(this.config.requestResetPasswordURL, username, token, this.config);
|
|
@@ -298,16 +247,13 @@ class UserController extends _AdaptableController.default {
|
|
|
298
247
|
link: link,
|
|
299
248
|
user: (0, _triggers.inflate)('_User', user)
|
|
300
249
|
};
|
|
301
|
-
|
|
302
250
|
if (this.adapter.sendPasswordResetEmail) {
|
|
303
251
|
this.adapter.sendPasswordResetEmail(options);
|
|
304
252
|
} else {
|
|
305
253
|
this.adapter.sendMail(this.defaultResetPasswordEmail(options));
|
|
306
254
|
}
|
|
307
|
-
|
|
308
255
|
return Promise.resolve(user);
|
|
309
256
|
}
|
|
310
|
-
|
|
311
257
|
updatePassword(username, token, password) {
|
|
312
258
|
return this.checkResetTokenValidity(username, token).then(user => updateUserPassword(user, password, this.config)).then(user => {
|
|
313
259
|
const accountLockoutPolicy = new _AccountLockout.default(user, this.config);
|
|
@@ -321,7 +267,6 @@ class UserController extends _AdaptableController.default {
|
|
|
321
267
|
}
|
|
322
268
|
});
|
|
323
269
|
}
|
|
324
|
-
|
|
325
270
|
defaultVerificationEmail({
|
|
326
271
|
link,
|
|
327
272
|
user,
|
|
@@ -336,7 +281,6 @@ class UserController extends _AdaptableController.default {
|
|
|
336
281
|
subject
|
|
337
282
|
};
|
|
338
283
|
}
|
|
339
|
-
|
|
340
284
|
defaultResetPasswordEmail({
|
|
341
285
|
link,
|
|
342
286
|
user,
|
|
@@ -351,12 +295,10 @@ class UserController extends _AdaptableController.default {
|
|
|
351
295
|
subject
|
|
352
296
|
};
|
|
353
297
|
}
|
|
298
|
+
}
|
|
354
299
|
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
300
|
+
// Mark this private
|
|
358
301
|
exports.UserController = UserController;
|
|
359
|
-
|
|
360
302
|
function updateUserPassword(user, password, config) {
|
|
361
303
|
return _rest.default.update(config, Auth.master(config), '_User', {
|
|
362
304
|
objectId: user.objectId
|
|
@@ -364,10 +306,8 @@ function updateUserPassword(user, password, config) {
|
|
|
364
306
|
password: password
|
|
365
307
|
}).then(() => user);
|
|
366
308
|
}
|
|
367
|
-
|
|
368
309
|
function buildEmailLink(destination, username, token, config) {
|
|
369
310
|
const usernameAndToken = `token=${token}&username=${username}`;
|
|
370
|
-
|
|
371
311
|
if (config.parseFrameURL) {
|
|
372
312
|
const destinationWithoutHost = destination.replace(config.publicServerURL, '');
|
|
373
313
|
return `${config.parseFrameURL}?link=${encodeURIComponent(destinationWithoutHost)}&${usernameAndToken}`;
|
|
@@ -375,7 +315,6 @@ function buildEmailLink(destination, username, token, config) {
|
|
|
375
315
|
return `${destination}?${usernameAndToken}`;
|
|
376
316
|
}
|
|
377
317
|
}
|
|
378
|
-
|
|
379
318
|
var _default = UserController;
|
|
380
319
|
exports.default = _default;
|
|
381
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9Db250cm9sbGVycy9Vc2VyQ29udHJvbGxlci5qcyJdLCJuYW1lcyI6WyJSZXN0UXVlcnkiLCJyZXF1aXJlIiwiQXV0aCIsIlVzZXJDb250cm9sbGVyIiwiQWRhcHRhYmxlQ29udHJvbGxlciIsImNvbnN0cnVjdG9yIiwiYWRhcHRlciIsImFwcElkIiwib3B0aW9ucyIsImNvbmZpZyIsIkNvbmZpZyIsImdldCIsInZhbGlkYXRlQWRhcHRlciIsInNob3VsZFZlcmlmeUVtYWlscyIsImV4cGVjdGVkQWRhcHRlclR5cGUiLCJNYWlsQWRhcHRlciIsInZlcmlmeVVzZXJFbWFpbHMiLCJzZXRFbWFpbFZlcmlmeVRva2VuIiwidXNlciIsIl9lbWFpbF92ZXJpZnlfdG9rZW4iLCJlbWFpbFZlcmlmaWVkIiwiZW1haWxWZXJpZnlUb2tlblZhbGlkaXR5RHVyYXRpb24iLCJfZW1haWxfdmVyaWZ5X3Rva2VuX2V4cGlyZXNfYXQiLCJQYXJzZSIsIl9lbmNvZGUiLCJnZW5lcmF0ZUVtYWlsVmVyaWZ5VG9rZW5FeHBpcmVzQXQiLCJ2ZXJpZnlFbWFpbCIsInVzZXJuYW1lIiwidG9rZW4iLCJ1bmRlZmluZWQiLCJxdWVyeSIsInVwZGF0ZUZpZWxkcyIsIl9fb3AiLCIkZ3QiLCJEYXRlIiwibWFzdGVyQXV0aCIsIm1hc3RlciIsImZpbmRVc2VyRm9yRW1haWxWZXJpZmljYXRpb24iLCJleGVjdXRlIiwidGhlbiIsInJlc3VsdCIsInJlc3VsdHMiLCJsZW5ndGgiLCJQcm9taXNlIiwicmVzb2x2ZSIsIm9iamVjdElkIiwicmVzdCIsInVwZGF0ZSIsImNoZWNrUmVzZXRUb2tlblZhbGlkaXR5IiwiZGF0YWJhc2UiLCJmaW5kIiwiX3BlcmlzaGFibGVfdG9rZW4iLCJsaW1pdCIsInBhc3N3b3JkUG9saWN5IiwicmVzZXRUb2tlblZhbGlkaXR5RHVyYXRpb24iLCJleHBpcmVzRGF0ZSIsIl9wZXJpc2hhYmxlX3Rva2VuX2V4cGlyZXNfYXQiLCJfX3R5cGUiLCJpc28iLCJnZXRVc2VySWZOZWVkZWQiLCJlbWFpbCIsIndoZXJlIiwic2VuZFZlcmlmaWNhdGlvbkVtYWlsIiwiZW5jb2RlVVJJQ29tcG9uZW50IiwibGluayIsImJ1aWxkRW1haWxMaW5rIiwidmVyaWZ5RW1haWxVUkwiLCJhcHBOYW1lIiwic2VuZE1haWwiLCJkZWZhdWx0VmVyaWZpY2F0aW9uRW1haWwiLCJyZWdlbmVyYXRlRW1haWxWZXJpZnlUb2tlbiIsImVtYWlsVmVyaWZ5VG9rZW5SZXVzZUlmVmFsaWQiLCJyZXNlbmRWZXJpZmljYXRpb25FbWFpbCIsImFVc2VyIiwic2V0UGFzc3dvcmRSZXNldFRva2VuIiwiZ2VuZXJhdGVQYXNzd29yZFJlc2V0VG9rZW5FeHBpcmVzQXQiLCIkb3IiLCIkZXhpc3RzIiwic2VuZFBhc3N3b3JkUmVzZXRFbWFpbCIsInJlc2V0VG9rZW5SZXVzZUlmVmFsaWQiLCJyZXF1ZXN0UmVzZXRQYXNzd29yZFVSTCIsImRlZmF1bHRSZXNldFBhc3N3b3JkRW1haWwiLCJ1cGRhdGVQYXNzd29yZCIsInBhc3N3b3JkIiwidXBkYXRlVXNlclBhc3N3b3JkIiwiYWNjb3VudExvY2tvdXRQb2xpY3kiLCJBY2NvdW50TG9ja291dCIsInVubG9ja0FjY291bnQiLCJjYXRjaCIsImVycm9yIiwibWVzc2FnZSIsInJlamVjdCIsInRleHQiLCJ0byIsInN1YmplY3QiLCJkZXN0aW5hdGlvbiIsInVzZXJuYW1lQW5kVG9rZW4iLCJwYXJzZUZyYW1lVVJMIiwiZGVzdGluYXRpb25XaXRob3V0SG9zdCIsInJlcGxhY2UiLCJwdWJsaWNTZXJ2ZXJVUkwiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7OztBQUVBLElBQUlBLFNBQVMsR0FBR0MsT0FBTyxDQUFDLGNBQUQsQ0FBdkI7O0FBQ0EsSUFBSUMsSUFBSSxHQUFHRCxPQUFPLENBQUMsU0FBRCxDQUFsQjs7QUFFTyxNQUFNRSxjQUFOLFNBQTZCQyw0QkFBN0Is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RUFLSDtBQUFFb0MsSUFBQUEsUUFBUSxFQUFFM0IsSUFBSSxDQUFDMkI7QUFBakIsR0FMRyxFQU1IO0FBQ0VzQyxJQUFBQSxRQUFRLEVBQUVBO0FBRFosR0FORyxFQVVKNUMsSUFWSSxDQVVDLE1BQU1yQixJQVZQLENBQVA7QUFXRDs7QUFFRCxTQUFTK0MsY0FBVCxDQUF3QjhCLFdBQXhCLEVBQXFDcEUsUUFBckMsRUFBK0NDLEtBQS9DLEVBQXNEbkIsTUFBdEQsRUFBOEQ7QUFDNUQsUUFBTXVGLGdCQUFnQixHQUFJLFNBQVFwRSxLQUFNLGFBQVlELFFBQVMsRUFBN0Q7O0FBRUEsTUFBSWxCLE1BQU0sQ0FBQ3dGLGFBQVgsRUFBMEI7QUFDeEIsVUFBTUMsc0JBQXNCLEdBQUdILFdBQVcsQ0FBQ0ksT0FBWixDQUFvQjFGLE1BQU0sQ0FBQzJGLGVBQTNCLEVBQTRDLEVBQTVDLENBQS9CO0FBRUEsV0FBUSxHQUFFM0YsTUFBTSxDQUFDd0YsYUFBYyxTQUFRbEMsa0JBQWtCLENBQ3ZEbUMsc0JBRHVELENBRXZELElBQUdGLGdCQUFpQixFQUZ0QjtBQUdELEdBTkQsTUFNTztBQUNMLFdBQVEsR0FBRUQsV0FBWSxJQUFHQyxnQkFBaUIsRUFBMUM7QUFDRDtBQUNGOztlQUVjN0YsYyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJhbmRvbVN0cmluZyB9IGZyb20gJy4uL2NyeXB0b1V0aWxzJztcbmltcG9ydCB7IGluZmxhdGUgfSBmcm9tICcuLi90cmlnZ2Vycyc7XG5pbXBvcnQgQWRhcHRhYmxlQ29udHJvbGxlciBmcm9tICcuL0FkYXB0YWJsZUNvbnRyb2xsZXInO1xuaW1wb3J0IE1haWxBZGFwdGVyIGZyb20gJy4uL0FkYXB0ZXJzL0VtYWlsL01haWxBZGFwdGVyJztcbmltcG9ydCByZXN0IGZyb20gJy4uL3Jlc3QnO1xuaW1wb3J0IFBhcnNlIGZyb20gJ3BhcnNlL25vZGUnO1xuaW1wb3J0IEFjY291bnRMb2Nrb3V0IGZyb20gJy4uL0FjY291bnRMb2Nrb3V0JztcbmltcG9ydCBDb25maWcgZnJvbSAnLi4vQ29uZmlnJztcblxudmFyIFJlc3RRdWVyeSA9IHJlcXVpcmUoJy4uL1Jlc3RRdWVyeScpO1xudmFyIEF1dGggPSByZXF1aXJlKCcuLi9BdXRoJyk7XG5cbmV4cG9ydCBjbGFzcyBVc2VyQ29udHJvbGxlciBleHRlbmRzIEFkYXB0YWJsZUNvbnRyb2xsZXIge1xuICBjb25zdHJ1Y3RvcihhZGFwdGVyLCBhcHBJZCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgc3VwZXIoYWRhcHRlciwgYXBwSWQsIG9wdGlvbnMpO1xuICB9XG5cbiAgZ2V0IGNvbmZpZygpIHtcbiAgICByZXR1cm4gQ29uZmlnLmdldCh0aGlzLmFwcElkKTtcbiAgfVxuXG4gIHZhbGlkYXRlQWRhcHRlcihhZGFwdGVyKSB7XG4gICAgLy8gQWxsb3cgbm8gYWRhcHRlclxuICAgIGlmICghYWRhcHRlciAmJiAhdGhpcy5zaG91bGRWZXJpZnlFbWFpbHMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc3VwZXIudmFsaWRhdGVBZGFwdGVyKGFkYXB0ZXIpO1xuICB9XG5cbiAgZXhwZWN0ZWRBZGFwdGVyVHlwZSgpIHtcbiAgICByZXR1cm4gTWFpbEFkYXB0ZXI7XG4gIH1cblxuICBnZXQgc2hvdWxkVmVyaWZ5RW1haWxzKCkge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMudmVyaWZ5VXNlckVtYWlscztcbiAgfVxuXG4gIHNldEVtYWlsVmVyaWZ5VG9rZW4odXNlcikge1xuICAgIGlmICh0aGlzLnNob3VsZFZlcmlmeUVtYWlscykge1xuICAgICAgdXNlci5fZW1haWxfdmVyaWZ5X3Rva2VuID0gcmFuZG9tU3RyaW5nKDI1KTtcbiAgICAgIHVzZXIuZW1haWxWZXJpZmllZCA9IGZhbHNlO1xuXG4gICAgICBpZiAodGhpcy5jb25maWcuZW1haWxWZXJpZnlUb2tlblZhbGlkaXR5RHVyYXRpb24pIHtcbiAgICAgICAgdXNlci5fZW1haWxfdmVyaWZ5X3Rva2VuX2V4cGlyZXNfYXQgPSBQYXJzZS5fZW5jb2RlKFxuICAgICAgICAgIHRoaXMuY29uZmlnLmdlbmVyYXRlRW1haWxWZXJpZnlUb2tlbkV4cGlyZXNBdCgpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmVyaWZ5RW1haWwodXNlcm5hbWUsIHRva2VuKSB7XG4gICAgaWYgKCF0aGlzLnNob3VsZFZlcmlmeUVtYWlscykge1xuICAgICAgLy8gVHJ5aW5nIHRvIHZlcmlmeSBlbWFpbCB3aGVuIG5vdCBlbmFibGVkXG4gICAgICAvLyBUT0RPOiBCZXR0ZXIgZXJyb3IgaGVyZS5cbiAgICAgIHRocm93IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBjb25zdCBxdWVyeSA9IHsgdXNlcm5hbWU6IHVzZXJuYW1lLCBfZW1haWxfdmVyaWZ5X3Rva2VuOiB0b2tlbiB9O1xuICAgIGNvbnN0IHVwZGF0ZUZpZWxkcyA9IHtcbiAgICAgIGVtYWlsVmVyaWZpZWQ6IHRydWUsXG4gICAgICBfZW1haWxfdmVyaWZ5X3Rva2VuOiB7IF9fb3A6ICdEZWxldGUnIH0sXG4gICAgfTtcblxuICAgIC8vIGlmIHRoZSBlbWFpbCB2ZXJpZnkgdG9rZW4gbmVlZHMgdG8gYmUgdmFsaWRhdGVkIHRoZW5cbiAgICAvLyBhZGQgYWRkaXRpb25hbCBxdWVyeSBwYXJhbXMgYW5kIGFkZGl0aW9uYWwgZmllbGRzIHRoYXQgbmVlZCB0byBiZSB1cGRhdGVkXG4gICAgaWYgKHRoaXMuY29uZmlnLmVtYWlsVmVyaWZ5VG9rZW5WYWxpZGl0eUR1cmF0aW9uKSB7XG4gICAgICBxdWVyeS5lbWFpbFZlcmlmaWVkID0gZmFsc2U7XG4gICAgICBxdWVyeS5fZW1haWxfdmVyaWZ5X3Rva2VuX2V4cGlyZXNfYXQgPSB7ICRndDogUGFyc2UuX2VuY29kZShuZXcgRGF0ZSgpKSB9O1xuXG4gICAgICB1cGRhdGVGaWVsZHMuX2VtYWlsX3ZlcmlmeV90b2tlbl9leHBpcmVzX2F0ID0geyBfX29wOiAnRGVsZXRlJyB9O1xuICAgIH1cbiAgICBjb25zdCBtYXN0ZXJBdXRoID0gQXV0aC5tYXN0ZXIodGhpcy5jb25maWcpO1xuICAgIHZhciBmaW5kVXNlckZvckVtYWlsVmVyaWZpY2F0aW9uID0gbmV3IFJlc3RRdWVyeShcbiAgICAgIHRoaXMuY29uZmlnLFxuICAgICAgQXV0aC5tYXN0ZXIodGhpcy5jb25maWcpLFxuICAgICAgJ19Vc2VyJyxcbiAgICAgIHsgdXNlcm5hbWU6IHVzZXJuYW1lIH1cbiAgICApO1xuICAgIHJldHVybiBmaW5kVXNlckZvckVtYWlsVmVyaWZpY2F0aW9uLmV4ZWN1dGUoKS50aGVuKHJlc3VsdCA9PiB7XG4gICAgICBpZiAocmVzdWx0LnJlc3VsdHMubGVuZ3RoICYmIHJlc3VsdC5yZXN1bHRzWzBdLmVtYWlsVmVyaWZpZWQpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShyZXN1bHQucmVzdWx0cy5sZW5ndGhbMF0pO1xuICAgICAgfSBlbHNlIGlmIChyZXN1bHQucmVzdWx0cy5sZW5ndGgpIHtcbiAgICAgICAgcXVlcnkub2JqZWN0SWQgPSByZXN1bHQucmVzdWx0c1swXS5vYmplY3RJZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN0LnVwZGF0ZSh0aGlzLmNvbmZpZywgbWFzdGVyQXV0aCwgJ19Vc2VyJywgcXVlcnksIHVwZGF0ZUZpZWxkcyk7XG4gICAgfSk7XG4gIH1cblxuICBjaGVja1Jlc2V0VG9rZW5WYWxpZGl0eSh1c2VybmFtZSwgdG9rZW4pIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcuZGF0YWJhc2VcbiAgICAgIC5maW5kKFxuICAgICAgICAnX1VzZXInLFxuICAgICAgICB7XG4gICAgICAgICAgdXNlcm5hbWU6IHVzZXJuYW1lLFxuICAgICAgICAgIF9wZXJpc2hhYmxlX3Rva2VuOiB0b2tlbixcbiAgICAgICAgfSxcbiAgICAgICAgeyBsaW1pdDogMSB9XG4gICAgICApXG4gICAgICAudGhlbihyZXN1bHRzID0+IHtcbiAgICAgICAgaWYgKHJlc3VsdHMubGVuZ3RoICE9IDEpIHtcbiAgICAgICAgICB0aHJvdyAnRmFpbGVkIHRvIHJlc2V0IHBhc3N3b3JkOiB1c2VybmFtZSAvIGVtYWlsIC8gdG9rZW4gaXMgaW52YWxpZCc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5jb25maWcucGFzc3dvcmRQb2xpY3kgJiYgdGhpcy5jb25maWcucGFzc3dvcmRQb2xpY3kucmVzZXRUb2tlblZhbGlkaXR5RHVyYXRpb24pIHtcbiAgICAgICAgICBsZXQgZXhwaXJlc0RhdGUgPSByZXN1bHRzWzBdLl9wZXJpc2hhYmxlX3Rva2VuX2V4cGlyZXNfYXQ7XG4gICAgICAgICAgaWYgKGV4cGlyZXNEYXRlICYmIGV4cGlyZXNEYXRlLl9fdHlwZSA9PSAnRGF0ZScpIHtcbiAgICAgICAgICAgIGV4cGlyZXNEYXRlID0gbmV3IERhdGUoZXhwaXJlc0RhdGUuaXNvKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGV4cGlyZXNEYXRlIDwgbmV3IERhdGUoKSkgdGhyb3cgJ1RoZSBwYXNzd29yZCByZXNldCBsaW5rIGhhcyBleHBpcmVkJztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0c1swXTtcbiAgICAgIH0pO1xuICB9XG5cbiAgZ2V0VXNlcklmTmVlZGVkKHVzZXIpIHtcbiAgICBpZiAodXNlci51c2VybmFtZSAmJiB1c2VyLmVtYWlsKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHVzZXIpO1xuICAgIH1cbiAgICB2YXIgd2hlcmUgPSB7fTtcbiAgICBpZiAodXNlci51c2VybmFtZSkge1xuICAgICAgd2hlcmUudXNlcm5hbWUgPSB1c2VyLnVzZXJuYW1lO1xuICAgIH1cbiAgICBpZiAodXNlci5lbWFpbCkge1xuICAgICAgd2hlcmUuZW1haWwgPSB1c2VyLmVtYWlsO1xuICAgIH1cblxuICAgIHZhciBxdWVyeSA9IG5ldyBSZXN0UXVlcnkodGhpcy5jb25maWcsIEF1dGgubWFzdGVyKHRoaXMuY29uZmlnKSwgJ19Vc2VyJywgd2hlcmUpO1xuICAgIHJldHVybiBxdWVyeS5leGVjdXRlKCkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgICBpZiAocmVzdWx0LnJlc3VsdHMubGVuZ3RoICE9IDEpIHtcbiAgICAgICAgdGhyb3cgdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdC5yZXN1bHRzWzBdO1xuICAgIH0pO1xuICB9XG5cbiAgc2VuZFZlcmlmaWNhdGlvbkVtYWlsKHVzZXIpIHtcbiAgICBpZiAoIXRoaXMuc2hvdWxkVmVyaWZ5RW1haWxzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHRva2VuID0gZW5jb2RlVVJJQ29tcG9uZW50KHVzZXIuX2VtYWlsX3ZlcmlmeV90b2tlbik7XG4gICAgLy8gV2UgbWF5IG5lZWQgdG8gZmV0Y2ggdGhlIHVzZXIgaW4gY2FzZSBvZiB1cGRhdGUgZW1haWxcbiAgICB0aGlzLmdldFVzZXJJZk5lZWRlZCh1c2VyKS50aGVuKHVzZXIgPT4ge1xuICAgICAgY29uc3QgdXNlcm5hbWUgPSBlbmNvZGVVUklDb21wb25lbnQodXNlci51c2VybmFtZSk7XG5cbiAgICAgIGNvbnN0IGxpbmsgPSBidWlsZEVtYWlsTGluayh0aGlzLmNvbmZpZy52ZXJpZnlFbWFpbFVSTCwgdXNlcm5hbWUsIHRva2VuLCB0aGlzLmNvbmZpZyk7XG4gICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBhcHBOYW1lOiB0aGlzLmNvbmZpZy5hcHBOYW1lLFxuICAgICAgICBsaW5rOiBsaW5rLFxuICAgICAgICB1c2VyOiBpbmZsYXRlKCdfVXNlcicsIHVzZXIpLFxuICAgICAgfTtcbiAgICAgIGlmICh0aGlzLmFkYXB0ZXIuc2VuZFZlcmlmaWNhdGlvbkVtYWlsKSB7XG4gICAgICAgIHRoaXMuYWRhcHRlci5zZW5kVmVyaWZpY2F0aW9uRW1haWwob3B0aW9ucyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmFkYXB0ZXIuc2VuZE1haWwodGhpcy5kZWZhdWx0VmVyaWZpY2F0aW9uRW1haWwob3B0aW9ucykpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2VuZXJhdGVzIHRoZSBnaXZlbiB1c2VyJ3MgZW1haWwgdmVyaWZpY2F0aW9uIHRva2VuXG4gICAqXG4gICAqIEBwYXJhbSB1c2VyXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgcmVnZW5lcmF0ZUVtYWlsVmVyaWZ5VG9rZW4odXNlcikge1xuICAgIGNvbnN0IHsgX2VtYWlsX3ZlcmlmeV90b2tlbiB9ID0gdXNlcjtcbiAgICBsZXQgeyBfZW1haWxfdmVyaWZ5X3Rva2VuX2V4cGlyZXNfYXQgfSA9IHVzZXI7XG4gICAgaWYgKF9lbWFpbF92ZXJpZnlfdG9rZW5fZXhwaXJlc19hdCAmJiBfZW1haWxfdmVyaWZ5X3Rva2VuX2V4cGlyZXNfYXQuX190eXBlID09PSAnRGF0ZScpIHtcbiAgICAgIF9lbWFpbF92ZXJpZnlfdG9rZW5fZXhwaXJlc19hdCA9IF9lbWFpbF92ZXJpZnlfdG9rZW5fZXhwaXJlc19hdC5pc287XG4gICAgfVxuICAgIGlmIChcbiAgICAgIHRoaXMuY29uZmlnLmVtYWlsVmVyaWZ5VG9rZW5SZXVzZUlmVmFsaWQgJiZcbiAgICAgIHRoaXMuY29uZmlnLmVtYWlsVmVyaWZ5VG9rZW5WYWxpZGl0eUR1cmF0aW9uICYmXG4gICAgICBfZW1haWxfdmVyaWZ5X3Rva2VuICYmXG4gICAgICBuZXcgRGF0ZSgpIDwgbmV3IERhdGUoX2VtYWlsX3ZlcmlmeV90b2tlbl9leHBpcmVzX2F0KVxuICAgICkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgIH1cbiAgICB0aGlzLnNldEVtYWlsVmVyaWZ5VG9rZW4odXNlcik7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLmRhdGFiYXNlLnVwZGF0ZSgnX1VzZXInLCB7IHVzZXJuYW1lOiB1c2VyLnVzZXJuYW1lIH0sIHVzZXIpO1xuICB9XG5cbiAgcmVzZW5kVmVyaWZpY2F0aW9uRW1haWwodXNlcm5hbWUpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRVc2VySWZOZWVkZWQoeyB1c2VybmFtZTogdXNlcm5hbWUgfSkudGhlbihhVXNlciA9PiB7XG4gICAgICBpZiAoIWFVc2VyIHx8IGFVc2VyLmVtYWlsVmVyaWZpZWQpIHtcbiAgICAgICAgdGhyb3cgdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMucmVnZW5lcmF0ZUVtYWlsVmVyaWZ5VG9rZW4oYVVzZXIpLnRoZW4oKCkgPT4ge1xuICAgICAgICB0aGlzLnNlbmRWZXJpZmljYXRpb25FbWFpbChhVXNlcik7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHNldFBhc3N3b3JkUmVzZXRUb2tlbihlbWFpbCkge1xuICAgIGNvbnN0IHRva2VuID0geyBfcGVyaXNoYWJsZV90b2tlbjogcmFuZG9tU3RyaW5nKDI1KSB9O1xuXG4gICAgaWYgKHRoaXMuY29uZmlnLnBhc3N3b3JkUG9saWN5ICYmIHRoaXMuY29uZmlnLnBhc3N3b3JkUG9saWN5LnJlc2V0VG9rZW5WYWxpZGl0eUR1cmF0aW9uKSB7XG4gICAgICB0b2tlbi5fcGVyaXNoYWJsZV90b2tlbl9leHBpcmVzX2F0ID0gUGFyc2UuX2VuY29kZShcbiAgICAgICAgdGhpcy5jb25maWcuZ2VuZXJhdGVQYXNzd29yZFJlc2V0VG9rZW5FeHBpcmVzQXQoKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5jb25maWcuZGF0YWJhc2UudXBkYXRlKFxuICAgICAgJ19Vc2VyJyxcbiAgICAgIHsgJG9yOiBbeyBlbWFpbCB9LCB7IHVzZXJuYW1lOiBlbWFpbCwgZW1haWw6IHsgJGV4aXN0czogZmFsc2UgfSB9XSB9LFxuICAgICAgdG9rZW4sXG4gICAgICB7fSxcbiAgICAgIHRydWVcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgc2VuZFBhc3N3b3JkUmVzZXRFbWFpbChlbWFpbCkge1xuICAgIGlmICghdGhpcy5hZGFwdGVyKSB7XG4gICAgICB0aHJvdyAnVHJ5aW5nIHRvIHNlbmQgYSByZXNldCBwYXNzd29yZCBidXQgbm8gYWRhcHRlciBpcyBzZXQnO1xuICAgICAgLy8gIFRPRE86IE5vIGFkYXB0ZXI/XG4gICAgfVxuICAgIGxldCB1c2VyO1xuICAgIGlmIChcbiAgICAgIHRoaXMuY29uZmlnLnBhc3N3b3JkUG9saWN5ICYmXG4gICAgICB0aGlzLmNvbmZpZy5wYXNzd29yZFBvbGljeS5yZXNldFRva2VuUmV1c2VJZlZhbGlkICYmXG4gICAgICB0aGlzLmNvbmZpZy5wYXNzd29yZFBvbGljeS5yZXNldFRva2VuVmFsaWRpdHlEdXJhdGlvblxuICAgICkge1xuICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IHRoaXMuY29uZmlnLmRhdGFiYXNlLmZpbmQoXG4gICAgICAgICdfVXNlcicsXG4gICAgICAgIHtcbiAgICAgICAgICAkb3I6IFtcbiAgICAgICAgICAgIHsgZW1haWwsIF9wZXJpc2hhYmxlX3Rva2VuOiB7ICRleGlzdHM6IHRydWUgfSB9LFxuICAgICAgICAgICAgeyB1c2VybmFtZTogZW1haWwsIGVtYWlsOiB7ICRleGlzdHM6IGZhbHNlIH0sIF9wZXJpc2hhYmxlX3Rva2VuOiB7ICRleGlzdHM6IHRydWUgfSB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICAgIHsgbGltaXQ6IDEgfVxuICAgICAgKTtcbiAgICAgIGlmIChyZXN1bHRzLmxlbmd0aCA9PSAxKSB7XG4gICAgICAgIGxldCBleHBpcmVzRGF0ZSA9IHJlc3VsdHNbMF0uX3BlcmlzaGFibGVfdG9rZW5fZXhwaXJlc19hdDtcbiAgICAgICAgaWYgKGV4cGlyZXNEYXRlICYmIGV4cGlyZXNEYXRlLl9fdHlwZSA9PSAnRGF0ZScpIHtcbiAgICAgICAgICBleHBpcmVzRGF0ZSA9IG5ldyBEYXRlKGV4cGlyZXNEYXRlLmlzbyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV4cGlyZXNEYXRlID4gbmV3IERhdGUoKSkge1xuICAgICAgICAgIHVzZXIgPSByZXN1bHRzWzBdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghdXNlciB8fCAhdXNlci5fcGVyaXNoYWJsZV90b2tlbikge1xuICAgICAgdXNlciA9IGF3YWl0IHRoaXMuc2V0UGFzc3dvcmRSZXNldFRva2VuKGVtYWlsKTtcbiAgICB9XG4gICAgY29uc3QgdG9rZW4gPSBlbmNvZGVVUklDb21wb25lbnQodXNlci5fcGVyaXNoYWJsZV90b2tlbik7XG4gICAgY29uc3QgdXNlcm5hbWUgPSBlbmNvZGVVUklDb21wb25lbnQodXNlci51c2VybmFtZSk7XG5cbiAgICBjb25zdCBsaW5rID0gYnVpbGRFbWFpbExpbmsodGhpcy5jb25maWcucmVxdWVzdFJlc2V0UGFzc3dvcmRVUkwsIHVzZXJuYW1lLCB0b2tlbiwgdGhpcy5jb25maWcpO1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICBhcHBOYW1lOiB0aGlzLmNvbmZpZy5hcHBOYW1lLFxuICAgICAgbGluazogbGluayxcbiAgICAgIHVzZXI6IGluZmxhdGUoJ19Vc2VyJywgdXNlciksXG4gICAgfTtcblxuICAgIGlmICh0aGlzLmFkYXB0ZXIuc2VuZFBhc3N3b3JkUmVzZXRFbWFpbCkge1xuICAgICAgdGhpcy5hZGFwdGVyLnNlbmRQYXNzd29yZFJlc2V0RW1haWwob3B0aW9ucyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYWRhcHRlci5zZW5kTWFpbCh0aGlzLmRlZmF1bHRSZXNldFBhc3N3b3JkRW1haWwob3B0aW9ucykpO1xuICAgIH1cblxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodXNlcik7XG4gIH1cblxuICB1cGRhdGVQYXNzd29yZCh1c2VybmFtZSwgdG9rZW4sIHBhc3N3b3JkKSB7XG4gICAgcmV0dXJuIHRoaXMuY2hlY2tSZXNldFRva2VuVmFsaWRpdHkodXNlcm5hbWUsIHRva2VuKVxuICAgICAgLnRoZW4odXNlciA9PiB1cGRhdGVVc2VyUGFzc3dvcmQodXNlciwgcGFzc3dvcmQsIHRoaXMuY29uZmlnKSlcbiAgICAgIC50aGVuKHVzZXIgPT4ge1xuICAgICAgICBjb25zdCBhY2NvdW50TG9ja291dFBvbGljeSA9IG5ldyBBY2NvdW50TG9ja291dCh1c2VyLCB0aGlzLmNvbmZpZyk7XG4gICAgICAgIHJldHVybiBhY2NvdW50TG9ja291dFBvbGljeS51bmxvY2tBY2NvdW50KCk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgaWYgKGVycm9yICYmIGVycm9yLm1lc3NhZ2UpIHtcbiAgICAgICAgICAvLyBpbiBjYXNlIG9mIFBhcnNlLkVycm9yLCBmYWlsIHdpdGggdGhlIGVycm9yIG1lc3NhZ2Ugb25seVxuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIGRlZmF1bHRWZXJpZmljYXRpb25FbWFpbCh7IGxpbmssIHVzZXIsIGFwcE5hbWUgfSkge1xuICAgIGNvbnN0IHRleHQgPVxuICAgICAgJ0hpLFxcblxcbicgK1xuICAgICAgJ1lvdSBhcmUgYmVpbmcgYXNrZWQgdG8gY29uZmlybSB0aGUgZS1tYWlsIGFkZHJlc3MgJyArXG4gICAgICB1c2VyLmdldCgnZW1haWwnKSArXG4gICAgICAnIHdpdGggJyArXG4gICAgICBhcHBOYW1lICtcbiAgICAgICdcXG5cXG4nICtcbiAgICAgICcnICtcbiAgICAgICdDbGljayBoZXJlIHRvIGNvbmZpcm0gaXQ6XFxuJyArXG4gICAgICBsaW5rO1xuICAgIGNvbnN0IHRvID0gdXNlci5nZXQoJ2VtYWlsJyk7XG4gICAgY29uc3Qgc3ViamVjdCA9ICdQbGVhc2UgdmVyaWZ5IHlvdXIgZS1tYWlsIGZvciAnICsgYXBwTmFtZTtcbiAgICByZXR1cm4geyB0ZXh0LCB0bywgc3ViamVjdCB9O1xuICB9XG5cbiAgZGVmYXVsdFJlc2V0UGFzc3dvcmRFbWFpbCh7IGxpbmssIHVzZXIsIGFwcE5hbWUgfSkge1xuICAgIGNvbnN0IHRleHQgPVxuICAgICAgJ0hpLFxcblxcbicgK1xuICAgICAgJ1lvdSByZXF1ZXN0ZWQgdG8gcmVzZXQgeW91ciBwYXNzd29yZCBmb3IgJyArXG4gICAgICBhcHBOYW1lICtcbiAgICAgICh1c2VyLmdldCgndXNlcm5hbWUnKSA/IFwiICh5b3VyIHVzZXJuYW1lIGlzICdcIiArIHVzZXIuZ2V0KCd1c2VybmFtZScpICsgXCInKVwiIDogJycpICtcbiAgICAgICcuXFxuXFxuJyArXG4gICAgICAnJyArXG4gICAgICAnQ2xpY2sgaGVyZSB0byByZXNldCBpdDpcXG4nICtcbiAgICAgIGxpbms7XG4gICAgY29uc3QgdG8gPSB1c2VyLmdldCgnZW1haWwnKSB8fCB1c2VyLmdldCgndXNlcm5hbWUnKTtcbiAgICBjb25zdCBzdWJqZWN0ID0gJ1Bhc3N3b3JkIFJlc2V0IGZvciAnICsgYXBwTmFtZTtcbiAgICByZXR1cm4geyB0ZXh0LCB0bywgc3ViamVjdCB9O1xuICB9XG59XG5cbi8vIE1hcmsgdGhpcyBwcml2YXRlXG5mdW5jdGlvbiB1cGRhdGVVc2VyUGFzc3dvcmQodXNlciwgcGFzc3dvcmQsIGNvbmZpZykge1xuICByZXR1cm4gcmVzdFxuICAgIC51cGRhdGUoXG4gICAgICBjb25maWcsXG4gICAgICBBdXRoLm1hc3Rlcihjb25maWcpLFxuICAgICAgJ19Vc2VyJyxcbiAgICAgIHsgb2JqZWN0SWQ6IHVzZXIub2JqZWN0SWQgfSxcbiAgICAgIHtcbiAgICAgICAgcGFzc3dvcmQ6IHBhc3N3b3JkLFxuICAgICAgfVxuICAgIClcbiAgICAudGhlbigoKSA9PiB1c2VyKTtcbn1cblxuZnVuY3Rpb24gYnVpbGRFbWFpbExpbmsoZGVzdGluYXRpb24sIHVzZXJuYW1lLCB0b2tlbiwgY29uZmlnKSB7XG4gIGNvbnN0IHVzZXJuYW1lQW5kVG9rZW4gPSBgdG9rZW49JHt0b2tlbn0mdXNlcm5hbWU9JHt1c2VybmFtZX1gO1xuXG4gIGlmIChjb25maWcucGFyc2VGcmFtZVVSTCkge1xuICAgIGNvbnN0IGRlc3RpbmF0aW9uV2l0aG91dEhvc3QgPSBkZXN0aW5hdGlvbi5yZXBsYWNlKGNvbmZpZy5wdWJsaWNTZXJ2ZXJVUkwsICcnKTtcblxuICAgIHJldHVybiBgJHtjb25maWcucGFyc2VGcmFtZVVSTH0/bGluaz0ke2VuY29kZVVSSUNvbXBvbmVudChcbiAgICAgIGRlc3RpbmF0aW9uV2l0aG91dEhvc3RcbiAgICApfSYke3VzZXJuYW1lQW5kVG9rZW59YDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gYCR7ZGVzdGluYXRpb259PyR7dXNlcm5hbWVBbmRUb2tlbn1gO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFVzZXJDb250cm9sbGVyO1xuIl19
|
|
320
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZXN0UXVlcnkiLCJyZXF1aXJlIiwiQXV0aCIsIlVzZXJDb250cm9sbGVyIiwiQWRhcHRhYmxlQ29udHJvbGxlciIsImNvbnN0cnVjdG9yIiwiYWRhcHRlciIsImFwcElkIiwib3B0aW9ucyIsImNvbmZpZyIsIkNvbmZpZyIsImdldCIsInZhbGlkYXRlQWRhcHRlciIsInNob3VsZFZlcmlmeUVtYWlscyIsImV4cGVjdGVkQWRhcHRlclR5cGUiLCJNYWlsQWRhcHRlciIsInZlcmlmeVVzZXJFbWFpbHMiLCJzZXRFbWFpbFZlcmlmeVRva2VuIiwidXNlciIsIl9lbWFpbF92ZXJpZnlfdG9rZW4iLCJyYW5kb21TdHJpbmciLCJlbWFpbFZlcmlmaWVkIiwiZW1haWxWZXJpZnlUb2tlblZhbGlkaXR5RHVyYXRpb24iLCJfZW1haWxfdmVyaWZ5X3Rva2VuX2V4cGlyZXNfYXQiLCJQYXJzZSIsIl9lbmNvZGUiLCJnZW5lcmF0ZUVtYWlsVmVyaWZ5VG9rZW5FeHBpcmVzQXQiLCJ2ZXJpZnlFbWFpbCIsInVzZXJuYW1lIiwidG9rZW4iLCJ1bmRlZmluZWQiLCJxdWVyeSIsInVwZGF0ZUZpZWxkcyIsIl9fb3AiLCIkZ3QiLCJEYXRlIiwibWFzdGVyQXV0aCIsIm1hc3RlciIsImZpbmRVc2VyRm9yRW1haWxWZXJpZmljYXRpb24iLCJleGVjdXRlIiwidGhlbiIsInJlc3VsdCIsInJlc3VsdHMiLCJsZW5ndGgiLCJQcm9taXNlIiwicmVzb2x2ZSIsIm9iamVjdElkIiwicmVzdCIsInVwZGF0ZSIsImNoZWNrUmVzZXRUb2tlblZhbGlkaXR5IiwiZGF0YWJhc2UiLCJmaW5kIiwiX3BlcmlzaGFibGVfdG9rZW4iLCJsaW1pdCIsInBhc3N3b3JkUG9saWN5IiwicmVzZXRUb2tlblZhbGlkaXR5RHVyYXRpb24iLCJleHBpcmVzRGF0ZSIsIl9wZXJpc2hhYmxlX3Rva2VuX2V4cGlyZXNfYXQiLCJfX3R5cGUiLCJpc28iLCJnZXRVc2VySWZOZWVkZWQiLCJlbWFpbCIsIndoZXJlIiwic2VuZFZlcmlmaWNhdGlvbkVtYWlsIiwiZW5jb2RlVVJJQ29tcG9uZW50IiwibGluayIsImJ1aWxkRW1haWxMaW5rIiwidmVyaWZ5RW1haWxVUkwiLCJhcHBOYW1lIiwiaW5mbGF0ZSIsInNlbmRNYWlsIiwiZGVmYXVsdFZlcmlmaWNhdGlvbkVtYWlsIiwicmVnZW5lcmF0ZUVtYWlsVmVyaWZ5VG9rZW4iLCJlbWFpbFZlcmlmeVRva2VuUmV1c2VJZlZhbGlkIiwicmVzZW5kVmVyaWZpY2F0aW9uRW1haWwiLCJhVXNlciIsInNldFBhc3N3b3JkUmVzZXRUb2tlbiIsImdlbmVyYXRlUGFzc3dvcmRSZXNldFRva2VuRXhwaXJlc0F0IiwiJG9yIiwiJGV4aXN0cyIsInNlbmRQYXNzd29yZFJlc2V0RW1haWwiLCJyZXNldFRva2VuUmV1c2VJZlZhbGlkIiwicmVxdWVzdFJlc2V0UGFzc3dvcmRVUkwiLCJkZWZhdWx0UmVzZXRQYXNzd29yZEVtYWlsIiwidXBkYXRlUGFzc3dvcmQiLCJwYXNzd29yZCIsInVwZGF0ZVVzZXJQYXNzd29yZCIsImFjY291bnRMb2Nrb3V0UG9saWN5IiwiQWNjb3VudExvY2tvdXQiLCJ1bmxvY2tBY2NvdW50IiwiY2F0Y2giLCJlcnJvciIsIm1lc3NhZ2UiLCJyZWplY3QiLCJ0ZXh0IiwidG8iLCJzdWJqZWN0IiwiZGVzdGluYXRpb24iLCJ1c2VybmFtZUFuZFRva2VuIiwicGFyc2VGcmFtZVVSTCIsImRlc3RpbmF0aW9uV2l0aG91dEhvc3QiLCJyZXBsYWNlIiwicHVibGljU2VydmVyVVJMIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL0NvbnRyb2xsZXJzL1VzZXJDb250cm9sbGVyLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJhbmRvbVN0cmluZyB9IGZyb20gJy4uL2NyeXB0b1V0aWxzJztcbmltcG9ydCB7IGluZmxhdGUgfSBmcm9tICcuLi90cmlnZ2Vycyc7XG5pbXBvcnQgQWRhcHRhYmxlQ29udHJvbGxlciBmcm9tICcuL0FkYXB0YWJsZUNvbnRyb2xsZXInO1xuaW1wb3J0IE1haWxBZGFwdGVyIGZyb20gJy4uL0FkYXB0ZXJzL0VtYWlsL01haWxBZGFwdGVyJztcbmltcG9ydCByZXN0IGZyb20gJy4uL3Jlc3QnO1xuaW1wb3J0IFBhcnNlIGZyb20gJ3BhcnNlL25vZGUnO1xuaW1wb3J0IEFjY291bnRMb2Nrb3V0IGZyb20gJy4uL0FjY291bnRMb2Nrb3V0JztcbmltcG9ydCBDb25maWcgZnJvbSAnLi4vQ29uZmlnJztcblxudmFyIFJlc3RRdWVyeSA9IHJlcXVpcmUoJy4uL1Jlc3RRdWVyeScpO1xudmFyIEF1dGggPSByZXF1aXJlKCcuLi9BdXRoJyk7XG5cbmV4cG9ydCBjbGFzcyBVc2VyQ29udHJvbGxlciBleHRlbmRzIEFkYXB0YWJsZUNvbnRyb2xsZXIge1xuICBjb25zdHJ1Y3RvcihhZGFwdGVyLCBhcHBJZCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgc3VwZXIoYWRhcHRlciwgYXBwSWQsIG9wdGlvbnMpO1xuICB9XG5cbiAgZ2V0IGNvbmZpZygpIHtcbiAgICByZXR1cm4gQ29uZmlnLmdldCh0aGlzLmFwcElkKTtcbiAgfVxuXG4gIHZhbGlkYXRlQWRhcHRlcihhZGFwdGVyKSB7XG4gICAgLy8gQWxsb3cgbm8gYWRhcHRlclxuICAgIGlmICghYWRhcHRlciAmJiAhdGhpcy5zaG91bGRWZXJpZnlFbWFpbHMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc3VwZXIudmFsaWRhdGVBZGFwdGVyKGFkYXB0ZXIpO1xuICB9XG5cbiAgZXhwZWN0ZWRBZGFwdGVyVHlwZSgpIHtcbiAgICByZXR1cm4gTWFpbEFkYXB0ZXI7XG4gIH1cblxuICBnZXQgc2hvdWxkVmVyaWZ5RW1haWxzKCkge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMudmVyaWZ5VXNlckVtYWlscztcbiAgfVxuXG4gIHNldEVtYWlsVmVyaWZ5VG9rZW4odXNlcikge1xuICAgIGlmICh0aGlzLnNob3VsZFZlcmlmeUVtYWlscykge1xuICAgICAgdXNlci5fZW1haWxfdmVyaWZ5X3Rva2VuID0gcmFuZG9tU3RyaW5nKDI1KTtcbiAgICAgIHVzZXIuZW1haWxWZXJpZmllZCA9IGZhbHNlO1xuXG4gICAgICBpZiAodGhpcy5jb25maWcuZW1haWxWZXJpZnlUb2tlblZhbGlkaXR5RHVyYXRpb24pIHtcbiAgICAgICAgdXNlci5fZW1haWxfdmVyaWZ5X3Rva2VuX2V4cGlyZXNfYXQgPSBQYXJzZS5fZW5jb2RlKFxuICAgICAgICAgIHRoaXMuY29uZmlnLmdlbmVyYXRlRW1haWxWZXJpZnlUb2tlbkV4cGlyZXNBdCgpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmVyaWZ5RW1haWwodXNlcm5hbWUsIHRva2VuKSB7XG4gICAgaWYgKCF0aGlzLnNob3VsZFZlcmlmeUVtYWlscykge1xuICAgICAgLy8gVHJ5aW5nIHRvIHZlcmlmeSBlbWFpbCB3aGVuIG5vdCBlbmFibGVkXG4gICAgICAvLyBUT0RPOiBCZXR0ZXIgZXJyb3IgaGVyZS5cbiAgICAgIHRocm93IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBjb25zdCBxdWVyeSA9IHsgdXNlcm5hbWU6IHVzZXJuYW1lLCBfZW1haWxfdmVyaWZ5X3Rva2VuOiB0b2tlbiB9O1xuICAgIGNvbnN0IHVwZGF0ZUZpZWxkcyA9IHtcbiAgICAgIGVtYWlsVmVyaWZpZWQ6IHRydWUsXG4gICAgICBfZW1haWxfdmVyaWZ5X3Rva2VuOiB7IF9fb3A6ICdEZWxldGUnIH0sXG4gICAgfTtcblxuICAgIC8vIGlmIHRoZSBlbWFpbCB2ZXJpZnkgdG9rZW4gbmVlZHMgdG8gYmUgdmFsaWRhdGVkIHRoZW5cbiAgICAvLyBhZGQgYWRkaXRpb25hbCBxdWVyeSBwYXJhbXMgYW5kIGFkZGl0aW9uYWwgZmllbGRzIHRoYXQgbmVlZCB0byBiZSB1cGRhdGVkXG4gICAgaWYgKHRoaXMuY29uZmlnLmVtYWlsVmVyaWZ5VG9rZW5WYWxpZGl0eUR1cmF0aW9uKSB7XG4gICAgICBxdWVyeS5lbWFpbFZlcmlmaWVkID0gZmFsc2U7XG4gICAgICBxdWVyeS5fZW1haWxfdmVyaWZ5X3Rva2VuX2V4cGlyZXNfYXQgPSB7ICRndDogUGFyc2UuX2VuY29kZShuZXcgRGF0ZSgpKSB9O1xuXG4gICAgICB1cGRhdGVGaWVsZHMuX2VtYWlsX3ZlcmlmeV90b2tlbl9leHBpcmVzX2F0ID0geyBfX29wOiAnRGVsZXRlJyB9O1xuICAgIH1cbiAgICBjb25zdCBtYXN0ZXJBdXRoID0gQXV0aC5tYXN0ZXIodGhpcy5jb25maWcpO1xuICAgIHZhciBmaW5kVXNlckZvckVtYWlsVmVyaWZpY2F0aW9uID0gbmV3IFJlc3RRdWVyeShcbiAgICAgIHRoaXMuY29uZmlnLFxuICAgICAgQXV0aC5tYXN0ZXIodGhpcy5jb25maWcpLFxuICAgICAgJ19Vc2VyJyxcbiAgICAgIHsgdXNlcm5hbWU6IHVzZXJuYW1lIH1cbiAgICApO1xuICAgIHJldHVybiBmaW5kVXNlckZvckVtYWlsVmVyaWZpY2F0aW9uLmV4ZWN1dGUoKS50aGVuKHJlc3VsdCA9PiB7XG4gICAgICBpZiAocmVzdWx0LnJlc3VsdHMubGVuZ3RoICYmIHJlc3VsdC5yZXN1bHRzWzBdLmVtYWlsVmVyaWZpZWQpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShyZXN1bHQucmVzdWx0cy5sZW5ndGhbMF0pO1xuICAgICAgfSBlbHNlIGlmIChyZXN1bHQucmVzdWx0cy5sZW5ndGgpIHtcbiAgICAgICAgcXVlcnkub2JqZWN0SWQgPSByZXN1bHQucmVzdWx0c1swXS5vYmplY3RJZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN0LnVwZGF0ZSh0aGlzLmNvbmZpZywgbWFzdGVyQXV0aCwgJ19Vc2VyJywgcXVlcnksIHVwZGF0ZUZpZWxkcyk7XG4gICAgfSk7XG4gIH1cblxuICBjaGVja1Jlc2V0VG9rZW5WYWxpZGl0eSh1c2VybmFtZSwgdG9rZW4pIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcuZGF0YWJhc2VcbiAgICAgIC5maW5kKFxuICAgICAgICAnX1VzZXInLFxuICAgICAgICB7XG4gICAgICAgICAgdXNlcm5hbWU6IHVzZXJuYW1lLFxuICAgICAgICAgIF9wZXJpc2hhYmxlX3Rva2VuOiB0b2tlbixcbiAgICAgICAgfSxcbiAgICAgICAgeyBsaW1pdDogMSB9XG4gICAgICApXG4gICAgICAudGhlbihyZXN1bHRzID0+IHtcbiAgICAgICAgaWYgKHJlc3VsdHMubGVuZ3RoICE9IDEpIHtcbiAgICAgICAgICB0aHJvdyAnRmFpbGVkIHRvIHJlc2V0IHBhc3N3b3JkOiB1c2VybmFtZSAvIGVtYWlsIC8gdG9rZW4gaXMgaW52YWxpZCc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5jb25maWcucGFzc3dvcmRQb2xpY3kgJiYgdGhpcy5jb25maWcucGFzc3dvcmRQb2xpY3kucmVzZXRUb2tlblZhbGlkaXR5RHVyYXRpb24pIHtcbiAgICAgICAgICBsZXQgZXhwaXJlc0RhdGUgPSByZXN1bHRzWzBdLl9wZXJpc2hhYmxlX3Rva2VuX2V4cGlyZXNfYXQ7XG4gICAgICAgICAgaWYgKGV4cGlyZXNEYXRlICYmIGV4cGlyZXNEYXRlLl9fdHlwZSA9PSAnRGF0ZScpIHtcbiAgICAgICAgICAgIGV4cGlyZXNEYXRlID0gbmV3IERhdGUoZXhwaXJlc0RhdGUuaXNvKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGV4cGlyZXNEYXRlIDwgbmV3IERhdGUoKSkgdGhyb3cgJ1RoZSBwYXNzd29yZCByZXNldCBsaW5rIGhhcyBleHBpcmVkJztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0c1swXTtcbiAgICAgIH0pO1xuICB9XG5cbiAgZ2V0VXNlcklmTmVlZGVkKHVzZXIpIHtcbiAgICBpZiAodXNlci51c2VybmFtZSAmJiB1c2VyLmVtYWlsKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHVzZXIpO1xuICAgIH1cbiAgICB2YXIgd2hlcmUgPSB7fTtcbiAgICBpZiAodXNlci51c2VybmFtZSkge1xuICAgICAgd2hlcmUudXNlcm5hbWUgPSB1c2VyLnVzZXJuYW1lO1xuICAgIH1cbiAgICBpZiAodXNlci5lbWFpbCkge1xuICAgICAgd2hlcmUuZW1haWwgPSB1c2VyLmVtYWlsO1xuICAgIH1cblxuICAgIHZhciBxdWVyeSA9IG5ldyBSZXN0UXVlcnkodGhpcy5jb25maWcsIEF1dGgubWFzdGVyKHRoaXMuY29uZmlnKSwgJ19Vc2VyJywgd2hlcmUpO1xuICAgIHJldHVybiBxdWVyeS5leGVjdXRlKCkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgICBpZiAocmVzdWx0LnJlc3VsdHMubGVuZ3RoICE9IDEpIHtcbiAgICAgICAgdGhyb3cgdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdC5yZXN1bHRzWzBdO1xuICAgIH0pO1xuICB9XG5cbiAgc2VuZFZlcmlmaWNhdGlvbkVtYWlsKHVzZXIpIHtcbiAgICBpZiAoIXRoaXMuc2hvdWxkVmVyaWZ5RW1haWxzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHRva2VuID0gZW5jb2RlVVJJQ29tcG9uZW50KHVzZXIuX2VtYWlsX3ZlcmlmeV90b2tlbik7XG4gICAgLy8gV2UgbWF5IG5lZWQgdG8gZmV0Y2ggdGhlIHVzZXIgaW4gY2FzZSBvZiB1cGRhdGUgZW1haWxcbiAgICB0aGlzLmdldFVzZXJJZk5lZWRlZCh1c2VyKS50aGVuKHVzZXIgPT4ge1xuICAgICAgY29uc3QgdXNlcm5hbWUgPSBlbmNvZGVVUklDb21wb25lbnQodXNlci51c2VybmFtZSk7XG5cbiAgICAgIGNvbnN0IGxpbmsgPSBidWlsZEVtYWlsTGluayh0aGlzLmNvbmZpZy52ZXJpZnlFbWFpbFVSTCwgdXNlcm5hbWUsIHRva2VuLCB0aGlzLmNvbmZpZyk7XG4gICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBhcHBOYW1lOiB0aGlzLmNvbmZpZy5hcHBOYW1lLFxuICAgICAgICBsaW5rOiBsaW5rLFxuICAgICAgICB1c2VyOiBpbmZsYXRlKCdfVXNlcicsIHVzZXIpLFxuICAgICAgfTtcbiAgICAgIGlmICh0aGlzLmFkYXB0ZXIuc2VuZFZlcmlmaWNhdGlvbkVtYWlsKSB7XG4gICAgICAgIHRoaXMuYWRhcHRlci5zZW5kVmVyaWZpY2F0aW9uRW1haWwob3B0aW9ucyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmFkYXB0ZXIuc2VuZE1haWwodGhpcy5kZWZhdWx0VmVyaWZpY2F0aW9uRW1haWwob3B0aW9ucykpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2VuZXJhdGVzIHRoZSBnaXZlbiB1c2VyJ3MgZW1haWwgdmVyaWZpY2F0aW9uIHRva2VuXG4gICAqXG4gICAqIEBwYXJhbSB1c2VyXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgcmVnZW5lcmF0ZUVtYWlsVmVyaWZ5VG9rZW4odXNlcikge1xuICAgIGNvbnN0IHsgX2VtYWlsX3ZlcmlmeV90b2tlbiB9ID0gdXNlcjtcbiAgICBsZXQgeyBfZW1haWxfdmVyaWZ5X3Rva2VuX2V4cGlyZXNfYXQgfSA9IHVzZXI7XG4gICAgaWYgKF9lbWFpbF92ZXJpZnlfdG9rZW5fZXhwaXJlc19hdCAmJiBfZW1haWxfdmVyaWZ5X3Rva2VuX2V4cGlyZXNfYXQuX190eXBlID09PSAnRGF0ZScpIHtcbiAgICAgIF9lbWFpbF92ZXJpZnlfdG9rZW5fZXhwaXJlc19hdCA9IF9lbWFpbF92ZXJpZnlfdG9rZW5fZXhwaXJlc19hdC5pc287XG4gICAgfVxuICAgIGlmIChcbiAgICAgIHRoaXMuY29uZmlnLmVtYWlsVmVyaWZ5VG9rZW5SZXVzZUlmVmFsaWQgJiZcbiAgICAgIHRoaXMuY29uZmlnLmVtYWlsVmVyaWZ5VG9rZW5WYWxpZGl0eUR1cmF0aW9uICYmXG4gICAgICBfZW1haWxfdmVyaWZ5X3Rva2VuICYmXG4gICAgICBuZXcgRGF0ZSgpIDwgbmV3IERhdGUoX2VtYWlsX3ZlcmlmeV90b2tlbl9leHBpcmVzX2F0KVxuICAgICkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgIH1cbiAgICB0aGlzLnNldEVtYWlsVmVyaWZ5VG9rZW4odXNlcik7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLmRhdGFiYXNlLnVwZGF0ZSgnX1VzZXInLCB7IHVzZXJuYW1lOiB1c2VyLnVzZXJuYW1lIH0sIHVzZXIpO1xuICB9XG5cbiAgcmVzZW5kVmVyaWZpY2F0aW9uRW1haWwodXNlcm5hbWUpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRVc2VySWZOZWVkZWQoeyB1c2VybmFtZTogdXNlcm5hbWUgfSkudGhlbihhVXNlciA9PiB7XG4gICAgICBpZiAoIWFVc2VyIHx8IGFVc2VyLmVtYWlsVmVyaWZpZWQpIHtcbiAgICAgICAgdGhyb3cgdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMucmVnZW5lcmF0ZUVtYWlsVmVyaWZ5VG9rZW4oYVVzZXIpLnRoZW4oKCkgPT4ge1xuICAgICAgICB0aGlzLnNlbmRWZXJpZmljYXRpb25FbWFpbChhVXNlcik7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHNldFBhc3N3b3JkUmVzZXRUb2tlbihlbWFpbCkge1xuICAgIGNvbnN0IHRva2VuID0geyBfcGVyaXNoYWJsZV90b2tlbjogcmFuZG9tU3RyaW5nKDI1KSB9O1xuXG4gICAgaWYgKHRoaXMuY29uZmlnLnBhc3N3b3JkUG9saWN5ICYmIHRoaXMuY29uZmlnLnBhc3N3b3JkUG9saWN5LnJlc2V0VG9rZW5WYWxpZGl0eUR1cmF0aW9uKSB7XG4gICAgICB0b2tlbi5fcGVyaXNoYWJsZV90b2tlbl9leHBpcmVzX2F0ID0gUGFyc2UuX2VuY29kZShcbiAgICAgICAgdGhpcy5jb25maWcuZ2VuZXJhdGVQYXNzd29yZFJlc2V0VG9rZW5FeHBpcmVzQXQoKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5jb25maWcuZGF0YWJhc2UudXBkYXRlKFxuICAgICAgJ19Vc2VyJyxcbiAgICAgIHsgJG9yOiBbeyBlbWFpbCB9LCB7IHVzZXJuYW1lOiBlbWFpbCwgZW1haWw6IHsgJGV4aXN0czogZmFsc2UgfSB9XSB9LFxuICAgICAgdG9rZW4sXG4gICAgICB7fSxcbiAgICAgIHRydWVcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgc2VuZFBhc3N3b3JkUmVzZXRFbWFpbChlbWFpbCkge1xuICAgIGlmICghdGhpcy5hZGFwdGVyKSB7XG4gICAgICB0aHJvdyAnVHJ5aW5nIHRvIHNlbmQgYSByZXNldCBwYXNzd29yZCBidXQgbm8gYWRhcHRlciBpcyBzZXQnO1xuICAgICAgLy8gIFRPRE86IE5vIGFkYXB0ZXI/XG4gICAgfVxuICAgIGxldCB1c2VyO1xuICAgIGlmIChcbiAgICAgIHRoaXMuY29uZmlnLnBhc3N3b3JkUG9saWN5ICYmXG4gICAgICB0aGlzLmNvbmZpZy5wYXNzd29yZFBvbGljeS5yZXNldFRva2VuUmV1c2VJZlZhbGlkICYmXG4gICAgICB0aGlzLmNvbmZpZy5wYXNzd29yZFBvbGljeS5yZXNldFRva2VuVmFsaWRpdHlEdXJhdGlvblxuICAgICkge1xuICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IHRoaXMuY29uZmlnLmRhdGFiYXNlLmZpbmQoXG4gICAgICAgICdfVXNlcicsXG4gICAgICAgIHtcbiAgICAgICAgICAkb3I6IFtcbiAgICAgICAgICAgIHsgZW1haWwsIF9wZXJpc2hhYmxlX3Rva2VuOiB7ICRleGlzdHM6IHRydWUgfSB9LFxuICAgICAgICAgICAgeyB1c2VybmFtZTogZW1haWwsIGVtYWlsOiB7ICRleGlzdHM6IGZhbHNlIH0sIF9wZXJpc2hhYmxlX3Rva2VuOiB7ICRleGlzdHM6IHRydWUgfSB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICAgIHsgbGltaXQ6IDEgfVxuICAgICAgKTtcbiAgICAgIGlmIChyZXN1bHRzLmxlbmd0aCA9PSAxKSB7XG4gICAgICAgIGxldCBleHBpcmVzRGF0ZSA9IHJlc3VsdHNbMF0uX3BlcmlzaGFibGVfdG9rZW5fZXhwaXJlc19hdDtcbiAgICAgICAgaWYgKGV4cGlyZXNEYXRlICYmIGV4cGlyZXNEYXRlLl9fdHlwZSA9PSAnRGF0ZScpIHtcbiAgICAgICAgICBleHBpcmVzRGF0ZSA9IG5ldyBEYXRlKGV4cGlyZXNEYXRlLmlzbyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV4cGlyZXNEYXRlID4gbmV3IERhdGUoKSkge1xuICAgICAgICAgIHVzZXIgPSByZXN1bHRzWzBdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghdXNlciB8fCAhdXNlci5fcGVyaXNoYWJsZV90b2tlbikge1xuICAgICAgdXNlciA9IGF3YWl0IHRoaXMuc2V0UGFzc3dvcmRSZXNldFRva2VuKGVtYWlsKTtcbiAgICB9XG4gICAgY29uc3QgdG9rZW4gPSBlbmNvZGVVUklDb21wb25lbnQodXNlci5fcGVyaXNoYWJsZV90b2tlbik7XG4gICAgY29uc3QgdXNlcm5hbWUgPSBlbmNvZGVVUklDb21wb25lbnQodXNlci51c2VybmFtZSk7XG5cbiAgICBjb25zdCBsaW5rID0gYnVpbGRFbWFpbExpbmsodGhpcy5jb25maWcucmVxdWVzdFJlc2V0UGFzc3dvcmRVUkwsIHVzZXJuYW1lLCB0b2tlbiwgdGhpcy5jb25maWcpO1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICBhcHBOYW1lOiB0aGlzLmNvbmZpZy5hcHBOYW1lLFxuICAgICAgbGluazogbGluayxcbiAgICAgIHVzZXI6IGluZmxhdGUoJ19Vc2VyJywgdXNlciksXG4gICAgfTtcblxuICAgIGlmICh0aGlzLmFkYXB0ZXIuc2VuZFBhc3N3b3JkUmVzZXRFbWFpbCkge1xuICAgICAgdGhpcy5hZGFwdGVyLnNlbmRQYXNzd29yZFJlc2V0RW1haWwob3B0aW9ucyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYWRhcHRlci5zZW5kTWFpbCh0aGlzLmRlZmF1bHRSZXNldFBhc3N3b3JkRW1haWwob3B0aW9ucykpO1xuICAgIH1cblxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodXNlcik7XG4gIH1cblxuICB1cGRhdGVQYXNzd29yZCh1c2VybmFtZSwgdG9rZW4sIHBhc3N3b3JkKSB7XG4gICAgcmV0dXJuIHRoaXMuY2hlY2tSZXNldFRva2VuVmFsaWRpdHkodXNlcm5hbWUsIHRva2VuKVxuICAgICAgLnRoZW4odXNlciA9PiB1cGRhdGVVc2VyUGFzc3dvcmQodXNlciwgcGFzc3dvcmQsIHRoaXMuY29uZmlnKSlcbiAgICAgIC50aGVuKHVzZXIgPT4ge1xuICAgICAgICBjb25zdCBhY2NvdW50TG9ja291dFBvbGljeSA9IG5ldyBBY2NvdW50TG9ja291dCh1c2VyLCB0aGlzLmNvbmZpZyk7XG4gICAgICAgIHJldHVybiBhY2NvdW50TG9ja291dFBvbGljeS51bmxvY2tBY2NvdW50KCk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgaWYgKGVycm9yICYmIGVycm9yLm1lc3NhZ2UpIHtcbiAgICAgICAgICAvLyBpbiBjYXNlIG9mIFBhcnNlLkVycm9yLCBmYWlsIHdpdGggdGhlIGVycm9yIG1lc3NhZ2Ugb25seVxuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIGRlZmF1bHRWZXJpZmljYXRpb25FbWFpbCh7IGxpbmssIHVzZXIsIGFwcE5hbWUgfSkge1xuICAgIGNvbnN0IHRleHQgPVxuICAgICAgJ0hpLFxcblxcbicgK1xuICAgICAgJ1lvdSBhcmUgYmVpbmcgYXNrZWQgdG8gY29uZmlybSB0aGUgZS1tYWlsIGFkZHJlc3MgJyArXG4gICAgICB1c2VyLmdldCgnZW1haWwnKSArXG4gICAgICAnIHdpdGggJyArXG4gICAgICBhcHBOYW1lICtcbiAgICAgICdcXG5cXG4nICtcbiAgICAgICcnICtcbiAgICAgICdDbGljayBoZXJlIHRvIGNvbmZpcm0gaXQ6XFxuJyArXG4gICAgICBsaW5rO1xuICAgIGNvbnN0IHRvID0gdXNlci5nZXQoJ2VtYWlsJyk7XG4gICAgY29uc3Qgc3ViamVjdCA9ICdQbGVhc2UgdmVyaWZ5IHlvdXIgZS1tYWlsIGZvciAnICsgYXBwTmFtZTtcbiAgICByZXR1cm4geyB0ZXh0LCB0bywgc3ViamVjdCB9O1xuICB9XG5cbiAgZGVmYXVsdFJlc2V0UGFzc3dvcmRFbWFpbCh7IGxpbmssIHVzZXIsIGFwcE5hbWUgfSkge1xuICAgIGNvbnN0IHRleHQgPVxuICAgICAgJ0hpLFxcblxcbicgK1xuICAgICAgJ1lvdSByZXF1ZXN0ZWQgdG8gcmVzZXQgeW91ciBwYXNzd29yZCBmb3IgJyArXG4gICAgICBhcHBOYW1lICtcbiAgICAgICh1c2VyLmdldCgndXNlcm5hbWUnKSA/IFwiICh5b3VyIHVzZXJuYW1lIGlzICdcIiArIHVzZXIuZ2V0KCd1c2VybmFtZScpICsgXCInKVwiIDogJycpICtcbiAgICAgICcuXFxuXFxuJyArXG4gICAgICAnJyArXG4gICAgICAnQ2xpY2sgaGVyZSB0byByZXNldCBpdDpcXG4nICtcbiAgICAgIGxpbms7XG4gICAgY29uc3QgdG8gPSB1c2VyLmdldCgnZW1haWwnKSB8fCB1c2VyLmdldCgndXNlcm5hbWUnKTtcbiAgICBjb25zdCBzdWJqZWN0ID0gJ1Bhc3N3b3JkIFJlc2V0IGZvciAnICsgYXBwTmFtZTtcbiAgICByZXR1cm4geyB0ZXh0LCB0bywgc3ViamVjdCB9O1xuICB9XG59XG5cbi8vIE1hcmsgdGhpcyBwcml2YXRlXG5mdW5jdGlvbiB1cGRhdGVVc2VyUGFzc3dvcmQodXNlciwgcGFzc3dvcmQsIGNvbmZpZykge1xuICByZXR1cm4gcmVzdFxuICAgIC51cGRhdGUoXG4gICAgICBjb25maWcsXG4gICAgICBBdXRoLm1hc3Rlcihjb25maWcpLFxuICAgICAgJ19Vc2VyJyxcbiAgICAgIHsgb2JqZWN0SWQ6IHVzZXIub2JqZWN0SWQgfSxcbiAgICAgIHtcbiAgICAgICAgcGFzc3dvcmQ6IHBhc3N3b3JkLFxuICAgICAgfVxuICAgIClcbiAgICAudGhlbigoKSA9PiB1c2VyKTtcbn1cblxuZnVuY3Rpb24gYnVpbGRFbWFpbExpbmsoZGVzdGluYXRpb24sIHVzZXJuYW1lLCB0b2tlbiwgY29uZmlnKSB7XG4gIGNvbnN0IHVzZXJuYW1lQW5kVG9rZW4gPSBgdG9rZW49JHt0b2tlbn0mdXNlcm5hbWU9JHt1c2VybmFtZX1gO1xuXG4gIGlmIChjb25maWcucGFyc2VGcmFtZVVSTCkge1xuICAgIGNvbnN0IGRlc3RpbmF0aW9uV2l0aG91dEhvc3QgPSBkZXN0aW5hdGlvbi5yZXBsYWNlKGNvbmZpZy5wdWJsaWNTZXJ2ZXJVUkwsICcnKTtcblxuICAgIHJldHVybiBgJHtjb25maWcucGFyc2VGcmFtZVVSTH0/bGluaz0ke2VuY29kZVVSSUNvbXBvbmVudChcbiAgICAgIGRlc3RpbmF0aW9uV2l0aG91dEhvc3RcbiAgICApfSYke3VzZXJuYW1lQW5kVG9rZW59YDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gYCR7ZGVzdGluYXRpb259PyR7dXNlcm5hbWVBbmRUb2tlbn1gO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFVzZXJDb250cm9sbGVyO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQStCO0FBRS9CLElBQUlBLFNBQVMsR0FBR0MsT0FBTyxDQUFDLGNBQWMsQ0FBQztBQUN2QyxJQUFJQyxJQUFJLEdBQUdELE9BQU8sQ0FBQyxTQUFTLENBQUM7QUFFdEIsTUFBTUUsY0FBYyxTQUFTQyw0QkFBbUIsQ0FBQztFQUN0REMsV0FBVyxDQUFDQyxPQUFPLEVBQUVDLEtBQUssRUFBRUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxFQUFFO0lBQ3hDLEtBQUssQ0FBQ0YsT0FBTyxFQUFFQyxLQUFLLEVBQUVDLE9BQU8sQ0FBQztFQUNoQztFQUVBLElBQUlDLE1BQU0sR0FBRztJQUNYLE9BQU9DLGVBQU0sQ0FBQ0MsR0FBRyxDQUFDLElBQUksQ0FBQ0osS0FBSyxDQUFDO0VBQy9CO0VBRUFLLGVBQWUsQ0FBQ04sT0FBTyxFQUFFO0lBQ3ZCO0lB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
|