parse-server 2.8.4 → 8.6.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +167 -25
- package/NOTICE +10 -0
- package/README.md +929 -278
- package/lib/AccountLockout.js +47 -30
- package/lib/Adapters/AdapterLoader.js +21 -6
- package/lib/Adapters/Analytics/AnalyticsAdapter.js +15 -12
- package/lib/Adapters/Auth/AuthAdapter.js +116 -13
- package/lib/Adapters/Auth/BaseCodeAuthAdapter.js +99 -0
- package/lib/Adapters/Auth/OAuth1Client.js +27 -46
- package/lib/Adapters/Auth/apple.js +123 -0
- package/lib/Adapters/Auth/facebook.js +162 -35
- package/lib/Adapters/Auth/gcenter.js +217 -0
- package/lib/Adapters/Auth/github.js +118 -48
- package/lib/Adapters/Auth/google.js +160 -51
- package/lib/Adapters/Auth/gpgames.js +125 -0
- package/lib/Adapters/Auth/httpsRequest.js +6 -7
- package/lib/Adapters/Auth/index.js +170 -62
- package/lib/Adapters/Auth/instagram.js +114 -40
- package/lib/Adapters/Auth/janraincapture.js +52 -23
- package/lib/Adapters/Auth/janrainengage.js +19 -36
- package/lib/Adapters/Auth/keycloak.js +148 -0
- package/lib/Adapters/Auth/ldap.js +167 -0
- package/lib/Adapters/Auth/line.js +125 -0
- package/lib/Adapters/Auth/linkedin.js +111 -55
- package/lib/Adapters/Auth/meetup.js +24 -34
- package/lib/Adapters/Auth/mfa.js +324 -0
- package/lib/Adapters/Auth/microsoft.js +111 -0
- package/lib/Adapters/Auth/oauth2.js +97 -162
- package/lib/Adapters/Auth/phantauth.js +53 -0
- package/lib/Adapters/Auth/qq.js +108 -49
- package/lib/Adapters/Auth/spotify.js +107 -55
- package/lib/Adapters/Auth/twitter.js +188 -48
- package/lib/Adapters/Auth/utils.js +28 -0
- package/lib/Adapters/Auth/vkontakte.js +26 -39
- package/lib/Adapters/Auth/wechat.js +106 -44
- package/lib/Adapters/Auth/weibo.js +132 -58
- package/lib/Adapters/Cache/CacheAdapter.js +13 -8
- package/lib/Adapters/Cache/InMemoryCache.js +3 -13
- package/lib/Adapters/Cache/InMemoryCacheAdapter.js +5 -13
- package/lib/Adapters/Cache/LRUCache.js +13 -27
- package/lib/Adapters/Cache/NullCacheAdapter.js +3 -8
- package/lib/Adapters/Cache/RedisCacheAdapter.js +85 -76
- package/lib/Adapters/Cache/SchemaCache.js +25 -0
- package/lib/Adapters/Email/MailAdapter.js +10 -8
- package/lib/Adapters/Files/FilesAdapter.js +83 -25
- package/lib/Adapters/Files/GridFSBucketAdapter.js +231 -0
- package/lib/Adapters/Files/GridStoreAdapter.js +4 -91
- package/lib/Adapters/Logger/LoggerAdapter.js +18 -14
- package/lib/Adapters/Logger/WinstonLogger.js +69 -88
- package/lib/Adapters/Logger/WinstonLoggerAdapter.js +7 -16
- package/lib/Adapters/MessageQueue/EventEmitterMQ.js +8 -26
- package/lib/Adapters/PubSub/EventEmitterPubSub.js +12 -25
- package/lib/Adapters/PubSub/PubSubAdapter.js +34 -0
- package/lib/Adapters/PubSub/RedisPubSub.js +42 -19
- package/lib/Adapters/Push/PushAdapter.js +14 -7
- package/lib/Adapters/Storage/Mongo/MongoCollection.js +137 -45
- package/lib/Adapters/Storage/Mongo/MongoSchemaCollection.js +158 -63
- package/lib/Adapters/Storage/Mongo/MongoStorageAdapter.js +320 -168
- package/lib/Adapters/Storage/Mongo/MongoTransform.js +279 -306
- package/lib/Adapters/Storage/Postgres/PostgresClient.js +14 -10
- package/lib/Adapters/Storage/Postgres/PostgresConfigParser.js +47 -21
- package/lib/Adapters/Storage/Postgres/PostgresStorageAdapter.js +854 -468
- package/lib/Adapters/Storage/Postgres/sql/index.js +4 -6
- package/lib/Adapters/Storage/StorageAdapter.js +1 -1
- package/lib/Adapters/WebSocketServer/WSAdapter.js +35 -0
- package/lib/Adapters/WebSocketServer/WSSAdapter.js +66 -0
- package/lib/Auth.js +488 -125
- package/lib/ClientSDK.js +2 -6
- package/lib/Config.js +525 -94
- package/lib/Controllers/AdaptableController.js +5 -25
- package/lib/Controllers/AnalyticsController.js +22 -23
- package/lib/Controllers/CacheController.js +10 -31
- package/lib/Controllers/DatabaseController.js +767 -313
- package/lib/Controllers/FilesController.js +49 -54
- package/lib/Controllers/HooksController.js +80 -84
- package/lib/Controllers/LiveQueryController.js +35 -22
- package/lib/Controllers/LoggerController.js +22 -58
- package/lib/Controllers/ParseGraphQLController.js +293 -0
- package/lib/Controllers/PushController.js +58 -49
- package/lib/Controllers/SchemaController.js +916 -422
- package/lib/Controllers/UserController.js +265 -180
- package/lib/Controllers/index.js +90 -125
- package/lib/Controllers/types.js +1 -1
- package/lib/Deprecator/Deprecations.js +30 -0
- package/lib/Deprecator/Deprecator.js +127 -0
- package/lib/Error.js +48 -0
- package/lib/GraphQL/ParseGraphQLSchema.js +375 -0
- package/lib/GraphQL/ParseGraphQLServer.js +214 -0
- package/lib/GraphQL/helpers/objectsMutations.js +30 -0
- package/lib/GraphQL/helpers/objectsQueries.js +246 -0
- package/lib/GraphQL/loaders/configMutations.js +87 -0
- package/lib/GraphQL/loaders/configQueries.js +79 -0
- package/lib/GraphQL/loaders/defaultGraphQLMutations.js +21 -0
- package/lib/GraphQL/loaders/defaultGraphQLQueries.js +23 -0
- package/lib/GraphQL/loaders/defaultGraphQLTypes.js +1098 -0
- package/lib/GraphQL/loaders/defaultRelaySchema.js +53 -0
- package/lib/GraphQL/loaders/filesMutations.js +107 -0
- package/lib/GraphQL/loaders/functionsMutations.js +78 -0
- package/lib/GraphQL/loaders/parseClassMutations.js +268 -0
- package/lib/GraphQL/loaders/parseClassQueries.js +127 -0
- package/lib/GraphQL/loaders/parseClassTypes.js +493 -0
- package/lib/GraphQL/loaders/schemaDirectives.js +62 -0
- package/lib/GraphQL/loaders/schemaMutations.js +162 -0
- package/lib/GraphQL/loaders/schemaQueries.js +81 -0
- package/lib/GraphQL/loaders/schemaTypes.js +341 -0
- package/lib/GraphQL/loaders/usersMutations.js +433 -0
- package/lib/GraphQL/loaders/usersQueries.js +90 -0
- package/lib/GraphQL/parseGraphQLUtils.js +63 -0
- package/lib/GraphQL/transformers/className.js +14 -0
- package/lib/GraphQL/transformers/constraintType.js +53 -0
- package/lib/GraphQL/transformers/inputType.js +51 -0
- package/lib/GraphQL/transformers/mutation.js +274 -0
- package/lib/GraphQL/transformers/outputType.js +51 -0
- package/lib/GraphQL/transformers/query.js +237 -0
- package/lib/GraphQL/transformers/schemaFields.js +99 -0
- package/lib/KeyPromiseQueue.js +48 -0
- package/lib/LiveQuery/Client.js +25 -33
- package/lib/LiveQuery/Id.js +2 -5
- package/lib/LiveQuery/ParseCloudCodePublisher.js +26 -23
- package/lib/LiveQuery/ParseLiveQueryServer.js +560 -285
- package/lib/LiveQuery/ParsePubSub.js +7 -16
- package/lib/LiveQuery/ParseWebSocketServer.js +42 -39
- package/lib/LiveQuery/QueryTools.js +76 -15
- package/lib/LiveQuery/RequestSchema.js +111 -97
- package/lib/LiveQuery/SessionTokenCache.js +23 -36
- package/lib/LiveQuery/Subscription.js +8 -17
- package/lib/LiveQuery/equalObjects.js +2 -3
- package/lib/Options/Definitions.js +1355 -382
- package/lib/Options/docs.js +301 -62
- package/lib/Options/index.js +11 -1
- package/lib/Options/parsers.js +14 -10
- package/lib/Page.js +44 -0
- package/lib/ParseMessageQueue.js +6 -13
- package/lib/ParseServer.js +474 -235
- package/lib/ParseServerRESTController.js +102 -40
- package/lib/PromiseRouter.js +39 -50
- package/lib/Push/PushQueue.js +24 -30
- package/lib/Push/PushWorker.js +32 -56
- package/lib/Push/utils.js +22 -35
- package/lib/RestQuery.js +361 -139
- package/lib/RestWrite.js +713 -344
- package/lib/Routers/AggregateRouter.js +97 -71
- package/lib/Routers/AnalyticsRouter.js +8 -14
- package/lib/Routers/AudiencesRouter.js +16 -35
- package/lib/Routers/ClassesRouter.js +86 -72
- package/lib/Routers/CloudCodeRouter.js +28 -37
- package/lib/Routers/FeaturesRouter.js +22 -25
- package/lib/Routers/FilesRouter.js +266 -171
- package/lib/Routers/FunctionsRouter.js +87 -103
- package/lib/Routers/GlobalConfigRouter.js +94 -33
- package/lib/Routers/GraphQLRouter.js +41 -0
- package/lib/Routers/HooksRouter.js +43 -47
- package/lib/Routers/IAPValidationRouter.js +57 -70
- package/lib/Routers/InstallationsRouter.js +17 -25
- package/lib/Routers/LogsRouter.js +10 -25
- package/lib/Routers/PagesRouter.js +647 -0
- package/lib/Routers/PublicAPIRouter.js +104 -112
- package/lib/Routers/PurgeRouter.js +19 -29
- package/lib/Routers/PushRouter.js +14 -28
- package/lib/Routers/RolesRouter.js +7 -14
- package/lib/Routers/SchemasRouter.js +63 -42
- package/lib/Routers/SecurityRouter.js +34 -0
- package/lib/Routers/SessionsRouter.js +25 -38
- package/lib/Routers/UsersRouter.js +463 -190
- package/lib/SchemaMigrations/DefinedSchemas.js +379 -0
- package/lib/SchemaMigrations/Migrations.js +30 -0
- package/lib/Security/Check.js +109 -0
- package/lib/Security/CheckGroup.js +44 -0
- package/lib/Security/CheckGroups/CheckGroupDatabase.js +44 -0
- package/lib/Security/CheckGroups/CheckGroupServerConfig.js +96 -0
- package/lib/Security/CheckGroups/CheckGroups.js +21 -0
- package/lib/Security/CheckRunner.js +213 -0
- package/lib/SharedRest.js +29 -0
- package/lib/StatusHandler.js +96 -93
- package/lib/TestUtils.js +70 -14
- package/lib/Utils.js +468 -0
- package/lib/batch.js +74 -40
- package/lib/cache.js +8 -8
- package/lib/cli/definitions/parse-live-query-server.js +4 -3
- package/lib/cli/definitions/parse-server.js +4 -3
- package/lib/cli/parse-live-query-server.js +9 -17
- package/lib/cli/parse-server.js +49 -47
- package/lib/cli/utils/commander.js +20 -29
- package/lib/cli/utils/runner.js +31 -32
- package/lib/cloud-code/Parse.Cloud.js +711 -36
- package/lib/cloud-code/Parse.Server.js +21 -0
- package/lib/cryptoUtils.js +6 -11
- package/lib/defaults.js +21 -15
- package/lib/deprecated.js +1 -1
- package/lib/index.js +78 -67
- package/lib/logger.js +12 -20
- package/lib/middlewares.js +484 -160
- package/lib/password.js +10 -6
- package/lib/request.js +175 -0
- package/lib/requiredParameter.js +4 -3
- package/lib/rest.js +157 -82
- package/lib/triggers.js +627 -185
- package/lib/vendor/README.md +3 -3
- package/lib/vendor/mongodbUrl.js +224 -137
- package/package.json +135 -57
- package/postinstall.js +38 -50
- package/public_html/invalid_verification_link.html +3 -3
- package/types/@types/@parse/fs-files-adapter/index.d.ts +5 -0
- package/types/@types/deepcopy/index.d.ts +5 -0
- package/types/LiveQuery/ParseLiveQueryServer.d.ts +40 -0
- package/types/Options/index.d.ts +301 -0
- package/types/ParseServer.d.ts +65 -0
- package/types/eslint.config.mjs +30 -0
- package/types/index.d.ts +21 -0
- package/types/logger.d.ts +2 -0
- package/types/tests.ts +44 -0
- package/types/tsconfig.json +24 -0
- package/CHANGELOG.md +0 -1246
- package/PATENTS +0 -37
- package/bin/dev +0 -37
- package/lib/.DS_Store +0 -0
- package/lib/Adapters/Auth/common.js +0 -2
- package/lib/Adapters/Auth/facebookaccountkit.js +0 -69
- package/lib/Controllers/SchemaCache.js +0 -97
- package/lib/LiveQuery/.DS_Store +0 -0
- package/lib/cli/utils/parsers.js +0 -77
- package/lib/cloud-code/.DS_Store +0 -0
- package/lib/cloud-code/HTTPResponse.js +0 -57
- package/lib/cloud-code/Untitled-1 +0 -123
- package/lib/cloud-code/httpRequest.js +0 -102
- package/lib/cloud-code/team.html +0 -123
- package/lib/graphql/ParseClass.js +0 -234
- package/lib/graphql/Schema.js +0 -197
- package/lib/graphql/index.js +0 -1
- package/lib/graphql/types/ACL.js +0 -35
- package/lib/graphql/types/Date.js +0 -25
- package/lib/graphql/types/File.js +0 -24
- package/lib/graphql/types/GeoPoint.js +0 -35
- package/lib/graphql/types/JSONObject.js +0 -30
- package/lib/graphql/types/NumberInput.js +0 -43
- package/lib/graphql/types/NumberQuery.js +0 -42
- package/lib/graphql/types/Pointer.js +0 -35
- package/lib/graphql/types/QueryConstraint.js +0 -61
- package/lib/graphql/types/StringQuery.js +0 -39
- package/lib/graphql/types/index.js +0 -110
package/lib/rest.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
"use strict";
|
|
2
2
|
|
|
3
3
|
// This file contains helpers for running operations in REST format.
|
|
4
4
|
// The goal is that handlers that explicitly handle an express route
|
|
@@ -10,171 +10,246 @@
|
|
|
10
10
|
// things.
|
|
11
11
|
|
|
12
12
|
var Parse = require('parse/node').Parse;
|
|
13
|
-
|
|
14
13
|
var RestQuery = require('./RestQuery');
|
|
15
14
|
var RestWrite = require('./RestWrite');
|
|
16
15
|
var triggers = require('./triggers');
|
|
17
|
-
|
|
16
|
+
const {
|
|
17
|
+
enforceRoleSecurity
|
|
18
|
+
} = require('./SharedRest');
|
|
19
|
+
const {
|
|
20
|
+
createSanitizedError
|
|
21
|
+
} = require('./Error');
|
|
18
22
|
function checkTriggers(className, config, types) {
|
|
19
23
|
return types.some(triggerType => {
|
|
20
24
|
return triggers.getTrigger(className, triggers.Types[triggerType], config.applicationId);
|
|
21
25
|
});
|
|
22
26
|
}
|
|
23
|
-
|
|
24
27
|
function checkLiveQuery(className, config) {
|
|
25
28
|
return config.liveQueryController && config.liveQueryController.hasLiveQuery(className);
|
|
26
29
|
}
|
|
30
|
+
async function runFindTriggers(config, auth, className, restWhere, restOptions, clientSDK, context, options = {}) {
|
|
31
|
+
const {
|
|
32
|
+
isGet
|
|
33
|
+
} = options;
|
|
34
|
+
if (restOptions && restOptions.explain && !auth.isMaster) {
|
|
35
|
+
const allowPublicExplain = config.databaseOptions?.allowPublicExplain ?? true;
|
|
36
|
+
if (!allowPublicExplain) {
|
|
37
|
+
throw new Parse.Error(Parse.Error.INVALID_QUERY, 'Using the explain query parameter requires the master key');
|
|
38
|
+
}
|
|
39
|
+
}
|
|
27
40
|
|
|
28
|
-
//
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
41
|
+
// Run beforeFind trigger - may modify query or return objects directly
|
|
42
|
+
const result = await triggers.maybeRunQueryTrigger(triggers.Types.beforeFind, className, restWhere, restOptions, config, auth, context, isGet);
|
|
43
|
+
restWhere = result.restWhere || restWhere;
|
|
44
|
+
restOptions = result.restOptions || restOptions;
|
|
45
|
+
|
|
46
|
+
// Short-circuit path: beforeFind returned objects directly
|
|
47
|
+
// Security risk: These objects may have been fetched with master privileges
|
|
48
|
+
if (result?.objects) {
|
|
49
|
+
const objectsFromBeforeFind = result.objects;
|
|
50
|
+
let objectsForAfterFind = objectsFromBeforeFind;
|
|
51
|
+
|
|
52
|
+
// Security check: Re-filter objects if not master to ensure ACL/CLP compliance
|
|
53
|
+
if (!auth?.isMaster && !auth?.isMaintenance) {
|
|
54
|
+
const ids = (Array.isArray(objectsFromBeforeFind) ? objectsFromBeforeFind : [objectsFromBeforeFind]).map(o => o && (o.id || o.objectId) || null).filter(Boolean);
|
|
55
|
+
|
|
56
|
+
// Objects without IDs are(normally) unsaved objects
|
|
57
|
+
// For unsaved objects, the ACL security does not apply, so no need to redo the query.
|
|
58
|
+
// For saved objects, we need to re-query to ensure proper ACL/CLP enforcement
|
|
59
|
+
if (ids.length > 0) {
|
|
60
|
+
const refilterWhere = isGet ? {
|
|
61
|
+
objectId: ids[0]
|
|
62
|
+
} : {
|
|
63
|
+
objectId: {
|
|
64
|
+
$in: ids
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
// Re-query with proper security: no triggers to avoid infinite loops
|
|
69
|
+
const refilterQuery = await RestQuery({
|
|
70
|
+
method: isGet ? RestQuery.Method.get : RestQuery.Method.find,
|
|
71
|
+
config,
|
|
72
|
+
auth,
|
|
73
|
+
className,
|
|
74
|
+
restWhere: refilterWhere,
|
|
75
|
+
restOptions,
|
|
76
|
+
clientSDK,
|
|
77
|
+
context,
|
|
78
|
+
runBeforeFind: false,
|
|
79
|
+
runAfterFind: false
|
|
80
|
+
});
|
|
81
|
+
const refiltered = await refilterQuery.execute();
|
|
82
|
+
objectsForAfterFind = refiltered && refiltered.results || [];
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// Run afterFind trigger on security-filtered objects
|
|
87
|
+
const afterFindProcessedObjects = await triggers.maybeRunAfterFindTrigger(triggers.Types.afterFind, auth, className, objectsForAfterFind, config, new Parse.Query(className).withJSON({
|
|
88
|
+
where: restWhere,
|
|
89
|
+
...restOptions
|
|
90
|
+
}), context, isGet);
|
|
91
|
+
return {
|
|
92
|
+
results: afterFindProcessedObjects
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
// Normal path: execute database query with modified conditions
|
|
97
|
+
const query = await RestQuery({
|
|
98
|
+
method: isGet ? RestQuery.Method.get : RestQuery.Method.find,
|
|
99
|
+
config,
|
|
100
|
+
auth,
|
|
101
|
+
className,
|
|
102
|
+
restWhere,
|
|
103
|
+
restOptions,
|
|
104
|
+
clientSDK,
|
|
105
|
+
context,
|
|
106
|
+
runBeforeFind: false
|
|
36
107
|
});
|
|
108
|
+
return query.execute();
|
|
37
109
|
}
|
|
38
110
|
|
|
111
|
+
// Returns a promise for an object with optional keys 'results' and 'count'.
|
|
112
|
+
const find = async (config, auth, className, restWhere, restOptions, clientSDK, context) => {
|
|
113
|
+
enforceRoleSecurity('find', className, auth, config);
|
|
114
|
+
return runFindTriggers(config, auth, className, restWhere, restOptions, clientSDK, context, {
|
|
115
|
+
isGet: false
|
|
116
|
+
});
|
|
117
|
+
};
|
|
118
|
+
|
|
39
119
|
// get is just like find but only queries an objectId.
|
|
40
|
-
const get = (config, auth, className, objectId, restOptions, clientSDK) => {
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
const query = new RestQuery(config, auth, className, restWhere, restOptions, clientSDK);
|
|
47
|
-
return query.execute();
|
|
120
|
+
const get = async (config, auth, className, objectId, restOptions, clientSDK, context) => {
|
|
121
|
+
enforceRoleSecurity('get', className, auth, config);
|
|
122
|
+
return runFindTriggers(config, auth, className, {
|
|
123
|
+
objectId
|
|
124
|
+
}, restOptions, clientSDK, context, {
|
|
125
|
+
isGet: true
|
|
48
126
|
});
|
|
49
127
|
};
|
|
50
128
|
|
|
51
129
|
// Returns a promise that doesn't resolve to any useful value.
|
|
52
|
-
function del(config, auth, className, objectId) {
|
|
130
|
+
function del(config, auth, className, objectId, context) {
|
|
53
131
|
if (typeof objectId !== 'string') {
|
|
54
132
|
throw new Parse.Error(Parse.Error.INVALID_JSON, 'bad objectId');
|
|
55
133
|
}
|
|
56
|
-
|
|
57
134
|
if (className === '_User' && auth.isUnauthenticated()) {
|
|
58
135
|
throw new Parse.Error(Parse.Error.SESSION_MISSING, 'Insufficient auth to delete user');
|
|
59
136
|
}
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
return Promise.resolve().then(() => {
|
|
137
|
+
enforceRoleSecurity('delete', className, auth, config);
|
|
138
|
+
let inflatedObject;
|
|
139
|
+
let schemaController;
|
|
140
|
+
return Promise.resolve().then(async () => {
|
|
66
141
|
const hasTriggers = checkTriggers(className, config, ['beforeDelete', 'afterDelete']);
|
|
67
142
|
const hasLiveQuery = checkLiveQuery(className, config);
|
|
68
143
|
if (hasTriggers || hasLiveQuery || className == '_Session') {
|
|
69
|
-
|
|
144
|
+
const query = await RestQuery({
|
|
145
|
+
method: RestQuery.Method.get,
|
|
146
|
+
config,
|
|
147
|
+
auth,
|
|
148
|
+
className,
|
|
149
|
+
restWhere: {
|
|
150
|
+
objectId
|
|
151
|
+
}
|
|
152
|
+
});
|
|
153
|
+
return query.execute({
|
|
154
|
+
op: 'delete'
|
|
155
|
+
}).then(response => {
|
|
70
156
|
if (response && response.results && response.results.length) {
|
|
71
157
|
const firstResult = response.results[0];
|
|
72
158
|
firstResult.className = className;
|
|
73
|
-
if (className === '_Session' && !auth.isMaster) {
|
|
159
|
+
if (className === '_Session' && !auth.isMaster && !auth.isMaintenance) {
|
|
74
160
|
if (!auth.user || firstResult.user.objectId !== auth.user.id) {
|
|
75
|
-
throw
|
|
161
|
+
throw createSanitizedError(Parse.Error.INVALID_SESSION_TOKEN, 'Invalid session token', config);
|
|
76
162
|
}
|
|
77
163
|
}
|
|
78
164
|
var cacheAdapter = config.cacheController;
|
|
79
165
|
cacheAdapter.user.del(firstResult.sessionToken);
|
|
80
166
|
inflatedObject = Parse.Object.fromJSON(firstResult);
|
|
81
|
-
|
|
82
|
-
config.liveQueryController.onAfterDelete(inflatedObject.className, inflatedObject);
|
|
83
|
-
return triggers.maybeRunTrigger(triggers.Types.beforeDelete, auth, inflatedObject, null, config);
|
|
167
|
+
return triggers.maybeRunTrigger(triggers.Types.beforeDelete, auth, inflatedObject, null, config, context);
|
|
84
168
|
}
|
|
85
169
|
throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'Object not found for delete.');
|
|
86
170
|
});
|
|
87
171
|
}
|
|
88
172
|
return Promise.resolve({});
|
|
89
173
|
}).then(() => {
|
|
90
|
-
if (!auth.isMaster) {
|
|
174
|
+
if (!auth.isMaster && !auth.isMaintenance) {
|
|
91
175
|
return auth.getUserRoles();
|
|
92
176
|
} else {
|
|
93
177
|
return;
|
|
94
178
|
}
|
|
95
|
-
}).then(() => {
|
|
96
|
-
|
|
97
|
-
|
|
179
|
+
}).then(() => config.database.loadSchema()).then(s => {
|
|
180
|
+
schemaController = s;
|
|
181
|
+
const options = {};
|
|
182
|
+
if (!auth.isMaster && !auth.isMaintenance) {
|
|
98
183
|
options.acl = ['*'];
|
|
99
184
|
if (auth.user) {
|
|
100
185
|
options.acl.push(auth.user.id);
|
|
101
186
|
options.acl = options.acl.concat(auth.userRoles);
|
|
102
187
|
}
|
|
103
188
|
}
|
|
104
|
-
|
|
105
189
|
return config.database.destroy(className, {
|
|
106
190
|
objectId: objectId
|
|
107
|
-
}, options);
|
|
191
|
+
}, options, schemaController);
|
|
108
192
|
}).then(() => {
|
|
109
|
-
|
|
193
|
+
// Notify LiveQuery server if possible
|
|
194
|
+
const perms = schemaController.getClassLevelPermissions(className);
|
|
195
|
+
config.liveQueryController.onAfterDelete(className, inflatedObject, null, perms);
|
|
196
|
+
return triggers.maybeRunTrigger(triggers.Types.afterDelete, auth, inflatedObject, null, config, context);
|
|
110
197
|
}).catch(error => {
|
|
111
|
-
handleSessionMissingError(error, className, auth);
|
|
198
|
+
handleSessionMissingError(error, className, auth, config);
|
|
112
199
|
});
|
|
113
200
|
}
|
|
114
201
|
|
|
115
202
|
// Returns a promise for a {response, status, location} object.
|
|
116
|
-
function create(config, auth, className, restObject, clientSDK) {
|
|
117
|
-
enforceRoleSecurity('create', className, auth);
|
|
118
|
-
var write = new RestWrite(config, auth, className, null, restObject, null, clientSDK);
|
|
203
|
+
function create(config, auth, className, restObject, clientSDK, context) {
|
|
204
|
+
enforceRoleSecurity('create', className, auth, config);
|
|
205
|
+
var write = new RestWrite(config, auth, className, null, restObject, null, clientSDK, context);
|
|
119
206
|
return write.execute();
|
|
120
207
|
}
|
|
121
208
|
|
|
122
209
|
// Returns a promise that contains the fields of the update that the
|
|
123
210
|
// REST API is supposed to return.
|
|
124
211
|
// Usually, this is just updatedAt.
|
|
125
|
-
function update(config, auth, className, restWhere, restObject, clientSDK) {
|
|
126
|
-
enforceRoleSecurity('update', className, auth);
|
|
127
|
-
|
|
128
|
-
return Promise.resolve().then(() => {
|
|
212
|
+
function update(config, auth, className, restWhere, restObject, clientSDK, context) {
|
|
213
|
+
enforceRoleSecurity('update', className, auth, config);
|
|
214
|
+
return Promise.resolve().then(async () => {
|
|
129
215
|
const hasTriggers = checkTriggers(className, config, ['beforeSave', 'afterSave']);
|
|
130
216
|
const hasLiveQuery = checkLiveQuery(className, config);
|
|
131
217
|
if (hasTriggers || hasLiveQuery) {
|
|
132
218
|
// Do not use find, as it runs the before finds
|
|
133
|
-
|
|
219
|
+
const query = await RestQuery({
|
|
220
|
+
method: RestQuery.Method.get,
|
|
221
|
+
config,
|
|
222
|
+
auth,
|
|
223
|
+
className,
|
|
224
|
+
restWhere,
|
|
225
|
+
runAfterFind: false,
|
|
226
|
+
runBeforeFind: false,
|
|
227
|
+
context
|
|
228
|
+
});
|
|
229
|
+
return query.execute({
|
|
230
|
+
op: 'update'
|
|
231
|
+
});
|
|
134
232
|
}
|
|
135
233
|
return Promise.resolve({});
|
|
136
|
-
}).then(({
|
|
234
|
+
}).then(({
|
|
235
|
+
results
|
|
236
|
+
}) => {
|
|
137
237
|
var originalRestObject;
|
|
138
238
|
if (results && results.length) {
|
|
139
239
|
originalRestObject = results[0];
|
|
140
240
|
}
|
|
141
|
-
return new RestWrite(config, auth, className, restWhere, restObject, originalRestObject, clientSDK).execute();
|
|
241
|
+
return new RestWrite(config, auth, className, restWhere, restObject, originalRestObject, clientSDK, context, 'update').execute();
|
|
142
242
|
}).catch(error => {
|
|
143
|
-
handleSessionMissingError(error, className, auth);
|
|
243
|
+
handleSessionMissingError(error, className, auth, config);
|
|
144
244
|
});
|
|
145
245
|
}
|
|
146
|
-
|
|
147
|
-
function handleSessionMissingError(error, className) {
|
|
246
|
+
function handleSessionMissingError(error, className, auth, config) {
|
|
148
247
|
// If we're trying to update a user without / with bad session token
|
|
149
|
-
if (className === '_User' && error.code === Parse.Error.OBJECT_NOT_FOUND) {
|
|
150
|
-
throw
|
|
248
|
+
if (className === '_User' && error.code === Parse.Error.OBJECT_NOT_FOUND && !auth.isMaster && !auth.isMaintenance) {
|
|
249
|
+
throw createSanitizedError(Parse.Error.SESSION_MISSING, 'Insufficient auth.', config);
|
|
151
250
|
}
|
|
152
251
|
throw error;
|
|
153
252
|
}
|
|
154
|
-
|
|
155
|
-
const classesWithMasterOnlyAccess = ['_JobStatus', '_PushStatus', '_Hooks', '_GlobalConfig', '_JobSchedule'];
|
|
156
|
-
// Disallowing access to the _Role collection except by master key
|
|
157
|
-
function enforceRoleSecurity(method, className, auth) {
|
|
158
|
-
if (className === '_Installation' && !auth.isMaster) {
|
|
159
|
-
if (method === 'delete' || method === 'find') {
|
|
160
|
-
const error = `Clients aren't allowed to perform the ${method} operation on the installation collection.`;
|
|
161
|
-
throw new Parse.Error(Parse.Error.OPERATION_FORBIDDEN, error);
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
//all volatileClasses are masterKey only
|
|
166
|
-
if (classesWithMasterOnlyAccess.indexOf(className) >= 0 && !auth.isMaster) {
|
|
167
|
-
const error = `Clients aren't allowed to perform the ${method} operation on the ${className} collection.`;
|
|
168
|
-
throw new Parse.Error(Parse.Error.OPERATION_FORBIDDEN, error);
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
// readOnly masterKey is not allowed
|
|
172
|
-
if (auth.isReadOnly && (method === 'delete' || method === 'create' || method === 'update')) {
|
|
173
|
-
const error = `read-only masterKey isn't allowed to perform the ${method} operation.`;
|
|
174
|
-
throw new Parse.Error(Parse.Error.OPERATION_FORBIDDEN, error);
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
|
|
178
253
|
module.exports = {
|
|
179
254
|
create,
|
|
180
255
|
del,
|
|
@@ -182,4 +257,4 @@ module.exports = {
|
|
|
182
257
|
get,
|
|
183
258
|
update
|
|
184
259
|
};
|
|
185
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9yZXN0LmpzIl0sIm5hbWVzIjpbIlBhcnNlIiwicmVxdWlyZSIsIlJlc3RRdWVyeSIsIlJlc3RXcml0ZSIsInRyaWdnZXJzIiwiY2hlY2tUcmlnZ2VycyIsImNsYXNzTmFtZSIsImNvbmZpZyIsInR5cGVzIiwic29tZSIsInRyaWdnZXJUeXBlIiwiZ2V0VHJpZ2dlciIsIlR5cGVzIiwiYXBwbGljYXRpb25JZCIsImNoZWNrTGl2ZVF1ZXJ5IiwibGl2ZVF1ZXJ5Q29udHJvbGxlciIsImhhc0xpdmVRdWVyeSIsImZpbmQiLCJhdXRoIiwicmVzdFdoZXJlIiwicmVzdE9wdGlvbnMiLCJjbGllbnRTREsiLCJlbmZvcmNlUm9sZVNlY3VyaXR5IiwibWF5YmVSdW5RdWVyeVRyaWdnZXIiLCJiZWZvcmVGaW5kIiwidGhlbiIsInJlc3VsdCIsInF1ZXJ5IiwiZXhlY3V0ZSIsImdldCIsIm9iamVjdElkIiwiZGVsIiwiRXJyb3IiLCJJTlZBTElEX0pTT04iLCJpc1VuYXV0aGVudGljYXRlZCIsIlNFU1NJT05fTUlTU0lORyIsImluZmxhdGVkT2JqZWN0IiwiUHJvbWlzZSIsInJlc29sdmUiLCJoYXNUcmlnZ2VycyIsImZvcldyaXRlIiwicmVzcG9uc2UiLCJyZXN1bHRzIiwibGVuZ3RoIiwiZmlyc3RSZXN1bHQiLCJpc01hc3RlciIsInVzZXIiLCJpZCIsIklOVkFMSURfU0VTU0lPTl9UT0tFTiIsImNhY2hlQWRhcHRlciIsImNhY2hlQ29udHJvbGxlciIsInNlc3Npb25Ub2tlbiIsIk9iamVjdCIsImZyb21KU09OIiwib25BZnRlckRlbGV0ZSIsIm1heWJlUnVuVHJpZ2dlciIsImJlZm9yZURlbGV0ZSIsIk9CSkVDVF9OT1RfRk9VTkQiLCJnZXRVc2VyUm9sZXMiLCJvcHRpb25zIiwiYWNsIiwicHVzaCIsImNvbmNhdCIsInVzZXJSb2xlcyIsImRhdGFiYXNlIiwiZGVzdHJveSIsImFmdGVyRGVsZXRlIiwiY2F0Y2giLCJlcnJvciIsImhhbmRsZVNlc3Npb25NaXNzaW5nRXJyb3IiLCJjcmVhdGUiLCJyZXN0T2JqZWN0Iiwid3JpdGUiLCJ1cGRhdGUiLCJvcmlnaW5hbFJlc3RPYmplY3QiLCJjb2RlIiwiY2xhc3Nlc1dpdGhNYXN0ZXJPbmx5QWNjZXNzIiwibWV0aG9kIiwiT1BFUkFUSU9OX0ZPUkJJRERFTiIsImluZGV4T2YiLCJpc1JlYWRPbmx5IiwibW9kdWxlIiwiZXhwb3J0cyJdLCJtYXBwaW5ncyI6Ijs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLElBQUlBLFFBQVFDLFFBQVEsWUFBUixFQUFzQkQsS0FBbEM7O0FBRUEsSUFBSUUsWUFBWUQsUUFBUSxhQUFSLENBQWhCO0FBQ0EsSUFBSUUsWUFBWUYsUUFBUSxhQUFSLENBQWhCO0FBQ0EsSUFBSUcsV0FBV0gsUUFBUSxZQUFSLENBQWY7O0FBRUEsU0FBU0ksYUFBVCxDQUF1QkMsU0FBdkIsRUFBa0NDLE1BQWxDLEVBQTBDQyxLQUExQyxFQUFpRDtBQUMvQyxTQUFPQSxNQUFNQyxJQUFOLENBQVlDLFdBQUQsSUFBaUI7QUFDakMsV0FBT04sU0FBU08sVUFBVCxDQUFvQkwsU0FBcEIsRUFBK0JGLFNBQVNRLEtBQVQsQ0FBZUYsV0FBZixDQUEvQixFQUE0REgsT0FBT00sYUFBbkUsQ0FBUDtBQUNELEdBRk0sQ0FBUDtBQUdEOztBQUVELFNBQVNDLGNBQVQsQ0FBd0JSLFNBQXhCLEVBQW1DQyxNQUFuQyxFQUEyQztBQUN6QyxTQUFPQSxPQUFPUSxtQkFBUCxJQUE4QlIsT0FBT1EsbUJBQVAsQ0FBMkJDLFlBQTNCLENBQXdDVixTQUF4QyxDQUFyQztBQUNEOztBQUVEO0FBQ0EsU0FBU1csSUFBVCxDQUFjVixNQUFkLEVBQXNCVyxJQUF0QixFQUE0QlosU0FBNUIsRUFBdUNhLFNBQXZDLEVBQWtEQyxXQUFsRCxFQUErREMsU0FBL0QsRUFBMEU7QUFDeEVDLHNCQUFvQixNQUFwQixFQUE0QmhCLFNBQTVCLEVBQXVDWSxJQUF2QztBQUNBLFNBQU9kLFNBQVNtQixvQkFB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RFYsS0FBakQsQ0FBTjtBQUNEOztBQUVEO0FBQ0EsTUFBSWxELEtBQUs4RCxVQUFMLEtBQW9CSCxXQUFXLFFBQVgsSUFBdUJBLFdBQVcsUUFBbEMsSUFBOENBLFdBQVcsUUFBN0UsQ0FBSixFQUE0RjtBQUMxRixVQUFNVCxRQUFTLG9EQUFtRFMsTUFBTyxhQUF6RTtBQUNBLFVBQU0sSUFBSTdFLE1BQU1nQyxLQUFWLENBQWdCaEMsTUFBTWdDLEtBQU4sQ0FBWThDLG1CQUE1QixFQUFpRFYsS0FBakQsQ0FBTjtBQUNEO0FBQ0Y7O0FBRURhLE9BQU9DLE9BQVAsR0FBaUI7QUFDZlosUUFEZTtBQUVmdkMsS0FGZTtBQUdmZCxNQUhlO0FBSWZZLEtBSmU7QUFLZjRDO0FBTGUsQ0FBakIiLCJmaWxlIjoicmVzdC5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8vIFRoaXMgZmlsZSBjb250YWlucyBoZWxwZXJzIGZvciBydW5uaW5nIG9wZXJhdGlvbnMgaW4gUkVTVCBmb3JtYXQuXG4vLyBUaGUgZ29hbCBpcyB0aGF0IGhhbmRsZXJzIHRoYXQgZXhwbGljaXRseSBoYW5kbGUgYW4gZXhwcmVzcyByb3V0ZVxuLy8gc2hvdWxkIGp1c3QgYmUgc2hhbGxvdyB3cmFwcGVycyBhcm91bmQgdGhpbmdzIGluIHRoaXMgZmlsZSwgYnV0XG4vLyB0aGVzZSBmdW5jdGlvbnMgc2hvdWxkIG5vdCBleHBsaWNpdGx5IGRlcGVuZCBvbiB0aGUgcmVxdWVzdFxuLy8gb2JqZWN0LlxuLy8gVGhpcyBtZWFucyB0aGF0IG9uZSBvZiB0aGVzZSBoYW5kbGVycyBjYW4gc3VwcG9ydCBtdWx0aXBsZVxuLy8gcm91dGVzLiBUaGF0J3MgdXNlZnVsIGZvciB0aGUgcm91dGVzIHRoYXQgZG8gcmVhbGx5IHNpbWlsYXJcbi8vIHRoaW5ncy5cblxudmFyIFBhcnNlID0gcmVxdWlyZSgncGFyc2Uvbm9kZScpLlBhcnNlO1xuXG52YXIgUmVzdFF1ZXJ5ID0gcmVxdWlyZSgnLi9SZXN0UXVlcnknKTtcbnZhciBSZXN0V3JpdGUgPSByZXF1aXJlKCcuL1Jlc3RXcml0ZScpO1xudmFyIHRyaWdnZXJzID0gcmVxdWlyZSgnLi90cmlnZ2VycycpO1xuXG5mdW5jdGlvbiBjaGVja1RyaWdnZXJzKGNsYXNzTmFtZSwgY29uZmlnLCB0eXBlcykge1xuICByZXR1cm4gdHlwZXMuc29tZSgodHJpZ2dlclR5cGUpID0+IHtcbiAgICByZXR1cm4gdHJpZ2dlcnMuZ2V0VHJpZ2dlcihjbGFzc05hbWUsIHRyaWdnZXJzLlR5cGVzW3RyaWdnZXJUeXBlXSwgY29uZmlnLmFwcGxpY2F0aW9uSWQpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gY2hlY2tMaXZlUXVlcnkoY2xhc3NOYW1lLCBjb25maWcpIHtcbiAgcmV0dXJuIGNvbmZpZy5saXZlUXVlcnlDb250cm9sbGVyICYmIGNvbmZpZy5saXZlUXVlcnlDb250cm9sbGVyLmhhc0xpdmVRdWVyeShjbGFzc05hbWUpXG59XG5cbi8vIFJldHVybnMgYSBwcm9taXNlIGZvciBhbiBvYmplY3Qgd2l0aCBvcHRpb25hbCBrZXlzICdyZXN1bHRzJyBhbmQgJ2NvdW50Jy5cbmZ1bmN0aW9uIGZpbmQoY29uZmlnLCBhdXRoLCBjbGFzc05hbWUsIHJlc3RXaGVyZSwgcmVzdE9wdGlvbnMsIGNsaWVudFNESykge1xuICBlbmZvcmNlUm9sZVNlY3VyaXR5KCdmaW5kJywgY2xhc3NOYW1lLCBhdXRoKTtcbiAgcmV0dXJuIHRyaWdnZXJzLm1heWJlUnVuUXVlcnlUcmlnZ2VyKHRyaWdnZXJzLlR5cGVzLmJlZm9yZUZpbmQsIGNsYXNzTmFtZSwgcmVzdFdoZXJlLCByZXN0T3B0aW9ucywgY29uZmlnLCBhdXRoKS50aGVuKChyZXN1bHQpID0+IHtcbiAgICByZXN0V2hlcmUgPSByZXN1bHQucmVzdFdoZXJlIHx8IHJlc3RXaGVyZTtcbiAgICByZXN0T3B0aW9ucyA9IHJlc3VsdC5yZXN0T3B0aW9ucyB8fCByZXN0T3B0aW9ucztcbiAgICBjb25zdCBxdWVyeSA9IG5ldyBSZXN0UXVlcnkoY29uZmlnLCBhdXRoLCBjbGFzc05hbWUsIHJlc3RXaGVyZSwgcmVzdE9wdGlvbnMsIGNsaWVudFNESyk7XG4gICAgcmV0dXJuIHF1ZXJ5LmV4ZWN1dGUoKTtcbiAgfSk7XG59XG5cbi8vIGdldCBpcyBqdXN0IGxpa2UgZmluZCBidXQgb25seSBxdWVyaWVzIGFuIG9iamVjdElkLlxuY29uc3QgZ2V0ID0gKGNvbmZpZywgYXV0aCwgY2xhc3NOYW1lLCBvYmplY3RJZCwgcmVzdE9wdGlvbnMsIGNsaWVudFNESykgPT4ge1xuICB2YXIgcmVzdFdoZXJlID0geyBvYmplY3RJZCB9O1xuICBlbmZvcmNlUm9sZVNlY3VyaXR5KCdnZXQnLCBjbGFzc05hbWUsIGF1dGgpO1xuICByZXR1cm4gdHJpZ2dlcnMubWF5YmVSdW5RdWVyeVRyaWdnZXIodHJpZ2dlcnMuVHlwZXMuYmVmb3JlRmluZCwgY2xhc3NOYW1lLCByZXN0V2hlcmUsIHJlc3RPcHRpb25zLCBjb25maWcsIGF1dGgsIHRydWUpLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgIHJlc3RXaGVyZSA9IHJlc3VsdC5yZXN0V2hlcmUgfHwgcmVzdFdoZXJlO1xuICAgIHJlc3RPcHRpb25zID0gcmVzdWx0LnJlc3RPcHRpb25zIHx8IHJlc3RPcHRpb25zO1xuICAgIGNvbnN0IHF1ZXJ5ID0gbmV3IFJlc3RRdWVyeShjb25maWcsIGF1dGgsIGNsYXNzTmFtZSwgcmVzdFdoZXJlLCByZXN0T3B0aW9ucywgY2xpZW50U0RLKTtcbiAgICByZXR1cm4gcXVlcnkuZXhlY3V0ZSgpO1xuICB9KTtcbn1cblxuLy8gUmV0dXJucyBhIHByb21pc2UgdGhhdCBkb2Vzbid0IHJlc29sdmUgdG8gYW55IHVzZWZ1bCB2YWx1ZS5cbmZ1bmN0aW9uIGRlbChjb25maWcsIGF1dGgsIGNsYXNzTmFtZSwgb2JqZWN0SWQpIHtcbiAgaWYgKHR5cGVvZiBvYmplY3RJZCAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuSU5WQUxJRF9KU09OLFxuICAgICAgJ2JhZCBvYmplY3RJZCcpO1xuICB9XG5cbiAgaWYgKGNsYXNzTmFtZSA9PT0gJ19Vc2VyJyAmJiBhdXRoLmlzVW5hdXRoZW50aWNhdGVkKCkpIHtcbiAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuU0VTU0lPTl9NSVNTSU5HLFxuICAgICAgJ0luc3VmZmljaWVudCBhdXRoIHRvIGRlbGV0ZSB1c2VyJyk7XG4gIH1cblxuICBlbmZvcmNlUm9sZVNlY3VyaXR5KCdkZWxldGUnLCBjbGFzc05hbWUsIGF1dGgpO1xuXG4gIHZhciBpbmZsYXRlZE9iamVjdDtcblxuICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB7XG4gICAgY29uc3QgaGFzVHJpZ2dlcnMgPSBjaGVja1RyaWdnZXJzKGNsYXNzTmFtZSwgY29uZmlnLCBbJ2JlZm9yZURlbGV0ZScsICdhZnRlckRlbGV0ZSddKTtcbiAgICBjb25zdCBoYXNMaXZlUXVlcnkgPSBjaGVja0xpdmVRdWVyeShjbGFzc05hbWUsIGNvbmZpZyk7XG4gICAgaWYgKGhhc1RyaWdnZXJzIHx8IGhhc0xpdmVRdWVyeSB8fCBjbGFzc05hbWUgPT0gJ19TZXNzaW9uJykge1xuICAgICAgcmV0dXJuIG5ldyBSZXN0UXVlcnkoY29uZmlnLCBhdXRoLCBjbGFzc05hbWUsIHsgb2JqZWN0SWQgfSlcbiAgICAgICAgLmZvcldyaXRlKClcbiAgICAgICAgLmV4ZWN1dGUoKVxuICAgICAgICAudGhlbigocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICBpZiAocmVzcG9uc2UgJiYgcmVzcG9uc2UucmVzdWx0cyAmJiByZXNwb25zZS5yZXN1bHRzLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgZmlyc3RSZXN1bHQgPSByZXNwb25zZS5yZXN1bHRzWzBdO1xuICAgICAgICAgICAgZmlyc3RSZXN1bHQuY2xhc3NOYW1lID0gY2xhc3NOYW1lO1xuICAgICAgICAgICAgaWYgKGNsYXNzTmFtZSA9PT0gJ19TZXNzaW9uJyAmJiAhYXV0aC5pc01hc3Rlcikge1xuICAgICAgICAgICAgICBpZiAoIWF1dGgudXNlciB8fCBmaXJzdFJlc3VsdC51c2VyLm9iamVjdElkICE9PSBhdXRoLnVzZXIuaWQpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuSU5WQUxJRF9TRVNTSU9OX1RPS0VOLCAnSW52YWxpZCBzZXNzaW9uIHRva2VuJyk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBjYWNoZUFkYXB0ZXIgPSBjb25maWcuY2FjaGVDb250cm9sbGVyO1xuICAgICAgICAgICAgY2FjaGVBZGFwdGVyLnVzZXIuZGVsKGZpcnN0UmVzdWx0LnNlc3Npb25Ub2tlbik7XG4gICAgICAgICAgICBpbmZsYXRlZE9iamVjdCA9IFBhcnNlLk9iamVjdC5mcm9tSlNPTihmaXJzdFJlc3VsdCk7XG4gICAgICAgICAgICAvLyBOb3RpZnkgTGl2ZVF1ZXJ5IHNlcnZlciBpZiBwb3NzaWJsZVxuICAgICAgICAgICAgY29uZmlnLmxpdmVRdWVyeUNvbnRyb2xsZXIub25BZnRlckRlbGV0ZShpbmZsYXRlZE9iamVjdC5jbGFzc05hbWUsIGluZmxhdGVkT2JqZWN0KTtcbiAgICAgICAgICAgIHJldHVybiB0cmlnZ2Vycy5tYXliZVJ1blRyaWdnZXIodHJpZ2dlcnMuVHlwZXMuYmVmb3JlRGVsZXRlLCBhdXRoLCBpbmZsYXRlZE9iamVjdCwgbnVsbCwgIGNvbmZpZyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5PQkpFQ1RfTk9UX0ZPVU5ELFxuICAgICAgICAgICAgJ09iamVjdCBub3QgZm91bmQgZm9yIGRlbGV0ZS4nKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoe30pO1xuICB9KS50aGVuKCgpID0+IHtcbiAgICBpZiAoIWF1dGguaXNNYXN0ZXIpIHtcbiAgICAgIHJldHVybiBhdXRoLmdldFVzZXJSb2xlcygpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9KS50aGVuKCgpID0+IHtcbiAgICB2YXIgb3B0aW9ucyA9IHt9O1xuICAgIGlmICghYXV0aC5pc01hc3Rlcikge1xuICAgICAgb3B0aW9ucy5hY2wgPSBbJyonXTtcbiAgICAgIGlmIChhdXRoLnVzZXIpIHtcbiAgICAgICAgb3B0aW9ucy5hY2wucHVzaChhdXRoLnVzZXIuaWQpO1xuICAgICAgICBvcHRpb25zLmFjbCA9IG9wdGlvbnMuYWNsLmNvbmNhdChhdXRoLnVzZXJSb2xlcyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbmZpZy5kYXRhYmFzZS5kZXN0cm95KGNsYXNzTmFtZSwge1xuICAgICAgb2JqZWN0SWQ6IG9iamVjdElkXG4gICAgfSwgb3B0aW9ucyk7XG4gIH0pLnRoZW4oKCkgPT4ge1xuICAgIHJldHVybiB0cmlnZ2Vycy5tYXliZVJ1blRyaWdnZXIodHJpZ2dlcnMuVHlwZXMuYWZ0ZXJEZWxldGUsIGF1dGgsIGluZmxhdGVkT2JqZWN0LCBudWxsLCBjb25maWcpO1xuICB9KS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICBoYW5kbGVTZXNzaW9uTWlzc2luZ0Vycm9yKGVycm9yLCBjbGFzc05hbWUsIGF1dGgpO1xuICB9KTtcbn1cblxuLy8gUmV0dXJucyBhIHByb21pc2UgZm9yIGEge3Jlc3BvbnNlLCBzdGF0dXMsIGxvY2F0aW9ufSBvYmplY3QuXG5mdW5jdGlvbiBjcmVhdGUoY29uZmlnLCBhdXRoLCBjbGFzc05hbWUsIHJlc3RPYmplY3QsIGNsaWVudFNESykge1xuICBlbmZvcmNlUm9sZVNlY3VyaXR5KCdjcmVhdGUnLCBjbGFzc05hbWUsIGF1dGgpO1xuICB2YXIgd3JpdGUgPSBuZXcgUmVzdFdyaXRlKGNvbmZpZywgYXV0aCwgY2xhc3NOYW1lLCBudWxsLCByZXN0T2JqZWN0LCBudWxsLCBjbGllbnRTREspO1xuICByZXR1cm4gd3JpdGUuZXhlY3V0ZSgpO1xufVxuXG4vLyBSZXR1cm5zIGEgcHJvbWlzZSB0aGF0IGNvbnRhaW5zIHRoZSBmaWVsZHMgb2YgdGhlIHVwZGF0ZSB0aGF0IHRoZVxuLy8gUkVTVCBBUEkgaXMgc3VwcG9zZWQgdG8gcmV0dXJuLlxuLy8gVXN1YWxseSwgdGhpcyBpcyBqdXN0IHVwZGF0ZWRBdC5cbmZ1bmN0aW9uIHVwZGF0ZShjb25maWcsIGF1dGgsIGNsYXNzTmFtZSwgcmVzdFdoZXJlLCByZXN0T2JqZWN0LCBjbGllbnRTREspIHtcbiAgZW5mb3JjZVJvbGVTZWN1cml0eSgndXBkYXRlJywgY2xhc3NOYW1lLCBhdXRoKTtcblxuICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB7XG4gICAgY29uc3QgaGFzVHJpZ2dlcnMgPSBjaGVja1RyaWdnZXJzKGNsYXNzTmFtZSwgY29uZmlnLCBbJ2JlZm9yZVNhdmUnLCAnYWZ0ZXJTYXZlJ10pO1xuICAgIGNvbnN0IGhhc0xpdmVRdWVyeSA9IGNoZWNrTGl2ZVF1ZXJ5KGNsYXNzTmFtZSwgY29uZmlnKTtcbiAgICBpZiAoaGFzVHJpZ2dlcnMgfHwgaGFzTGl2ZVF1ZXJ5KSB7XG4gICAgICAvLyBEbyBub3QgdXNlIGZpbmQsIGFzIGl0IHJ1bnMgdGhlIGJlZm9yZSBmaW5kc1xuICAgICAgcmV0dXJuIG5ldyBSZXN0UXVlcnkoY29uZmlnLCBhdXRoLCBjbGFzc05hbWUsIHJlc3RXaGVyZSlcbiAgICAgICAgLmZvcldyaXRlKClcbiAgICAgICAgLmV4ZWN1dGUoKTtcbiAgICB9XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7fSk7XG4gIH0pLnRoZW4oKHsgcmVzdWx0cyB9KSA9PiB7XG4gICAgdmFyIG9yaWdpbmFsUmVzdE9iamVjdDtcbiAgICBpZiAocmVzdWx0cyAmJiByZXN1bHRzLmxlbmd0aCkge1xuICAgICAgb3JpZ2luYWxSZXN0T2JqZWN0ID0gcmVzdWx0c1swXTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBSZXN0V3JpdGUoY29uZmlnLCBhdXRoLCBjbGFzc05hbWUsIHJlc3RXaGVyZSwgcmVzdE9iamVjdCwgb3JpZ2luYWxSZXN0T2JqZWN0LCBjbGllbnRTREspXG4gICAgICAuZXhlY3V0ZSgpO1xuICB9KS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICBoYW5kbGVTZXNzaW9uTWlzc2luZ0Vycm9yKGVycm9yLCBjbGFzc05hbWUsIGF1dGgpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gaGFuZGxlU2Vzc2lvbk1pc3NpbmdFcnJvcihlcnJvciwgY2xhc3NOYW1lKSB7XG4gIC8vIElmIHdlJ3JlIHRyeWluZyB0byB1cGRhdGUgYSB1c2VyIHdpdGhvdXQgLyB3aXRoIGJhZCBzZXNzaW9uIHRva2VuXG4gIGlmIChjbGFzc05hbWUgPT09ICdfVXNlcidcbiAgICAgICYmIGVycm9yLmNvZGUgPT09IFBhcnNlLkVycm9yLk9CSkVDVF9OT1RfRk9VTkQpIHtcbiAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuU0VTU0lPTl9NSVNTSU5HLCAnSW5zdWZmaWNpZW50IGF1dGguJyk7XG4gIH1cbiAgdGhyb3cgZXJyb3I7XG59XG5cbmNvbnN0IGNsYXNzZXNXaXRoTWFzdGVyT25seUFjY2VzcyA9IFsnX0pvYlN0YXR1cycsICdfUHVzaFN0YXR1cycsICdfSG9va3MnLCAnX0dsb2JhbENvbmZpZycsICdfSm9iU2NoZWR1bGUnXTtcbi8vIERpc2FsbG93aW5nIGFjY2VzcyB0byB0aGUgX1JvbGUgY29sbGVjdGlvbiBleGNlcHQgYnkgbWFzdGVyIGtleVxuZnVuY3Rpb24gZW5mb3JjZVJvbGVTZWN1cml0eShtZXRob2QsIGNsYXNzTmFtZSwgYXV0aCkge1xuICBpZiAoY2xhc3NOYW1lID09PSAnX0luc3RhbGxhdGlvbicgJiYgIWF1dGguaXNNYXN0ZXIpIHtcbiAgICBpZiAobWV0aG9kID09PSAnZGVsZXRlJyB8fCBtZXRob2QgPT09ICdmaW5kJykge1xuICAgICAgY29uc3QgZXJyb3IgPSBgQ2xpZW50cyBhcmVuJ3QgYWxsb3dlZCB0byBwZXJmb3JtIHRoZSAke21ldGhvZH0gb3BlcmF0aW9uIG9uIHRoZSBpbnN0YWxsYXRpb24gY29sbGVjdGlvbi5gXG4gICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuT1BFUkFUSU9OX0ZPUkJJRERFTiwgZXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIC8vYWxsIHZvbGF0aWxlQ2xhc3NlcyBhcmUgbWFzdGVyS2V5IG9ubHlcbiAgaWYoY2xhc3Nlc1dpdGhNYXN0ZXJPbmx5QWNjZXNzLmluZGV4T2YoY2xhc3NOYW1lKSA+PSAwICYmICFhdXRoLmlzTWFzdGVyKXtcbiAgICBjb25zdCBlcnJvciA9IGBDbGllbnRzIGFyZW4ndCBhbGxvd2VkIHRvIHBlcmZvcm0gdGhlICR7bWV0aG9kfSBvcGVyYXRpb24gb24gdGhlICR7Y2xhc3NOYW1lfSBjb2xsZWN0aW9uLmBcbiAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuT1BFUkFUSU9OX0ZPUkJJRERFTiwgZXJyb3IpO1xuICB9XG5cbiAgLy8gcmVhZE9ubHkgbWFzdGVyS2V5IGlzIG5vdCBhbGxvd2VkXG4gIGlmIChhdXRoLmlzUmVhZE9ubHkgJiYgKG1ldGhvZCA9PT0gJ2RlbGV0ZScgfHwgbWV0aG9kID09PSAnY3JlYXRlJyB8fCBtZXRob2QgPT09ICd1cGRhdGUnKSkge1xuICAgIGNvbnN0IGVycm9yID0gYHJlYWQtb25seSBtYXN0ZXJLZXkgaXNuJ3QgYWxsb3dlZCB0byBwZXJmb3JtIHRoZSAke21ldGhvZH0gb3BlcmF0aW9uLmBcbiAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuT1BFUkFUSU9OX0ZPUkJJRERFTiwgZXJyb3IpO1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBjcmVhdGUsXG4gIGRlbCxcbiAgZmluZCxcbiAgZ2V0LFxuICB1cGRhdGVcbn07XG4iXX0=
|
|
260
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJQYXJzZSIsInJlcXVpcmUiLCJSZXN0UXVlcnkiLCJSZXN0V3JpdGUiLCJ0cmlnZ2VycyIsImVuZm9yY2VSb2xlU2VjdXJpdHkiLCJjcmVhdGVTYW5pdGl6ZWRFcnJvciIsImNoZWNrVHJpZ2dlcnMiLCJjbGFzc05hbWUiLCJjb25maWciLCJ0eXBlcyIsInNvbWUiLCJ0cmlnZ2VyVHlwZSIsImdldFRyaWdnZXIiLCJUeXBlcyIsImFwcGxpY2F0aW9uSWQiLCJjaGVja0xpdmVRdWVyeSIsImxpdmVRdWVyeUNvbnRyb2xsZXIiLCJoYXNMaXZlUXVlcnkiLCJydW5GaW5kVHJpZ2dlcnMiLCJhdXRoIiwicmVzdFdoZXJlIiwicmVzdE9wdGlvbnMiLCJjbGllbnRTREsiLCJjb250ZXh0Iiwib3B0aW9ucyIsImlzR2V0IiwiZXhwbGFpbiIsImlzTWFzdGVyIiwiYWxsb3dQdWJsaWNFeHBsYWluIiwiZGF0YWJhc2VPcHRpb25zIiwiRXJyb3IiLCJJTlZBTElEX1FVRVJZIiwicmVzdWx0IiwibWF5YmVSdW5RdWVyeVRyaWdnZXIiLCJiZWZvcmVGaW5kIiwib2JqZWN0cyIsIm9iamVjdHNGcm9tQmVmb3JlRmluZCIsIm9iamVjdHNGb3JBZnRlckZpbmQiLCJpc01haW50ZW5hbmNlIiwiaWRzIiwiQXJyYXkiLCJpc0FycmF5IiwibWFwIiwibyIsImlkIiwib2JqZWN0SWQiLCJmaWx0ZXIiLCJCb29sZWFuIiwibGVuZ3RoIiwicmVmaWx0ZXJXaGVyZSIsIiRpbiIsInJlZmlsdGVyUXVlcnkiLCJtZXRob2QiLCJNZXRob2QiLCJnZXQiLCJmaW5kIiwicnVuQmVmb3JlRmluZCIsInJ1bkFmdGVyRmluZCIsInJlZmlsdGVyZWQiLCJleGVjdXRlIiwicmVzdWx0cyIsImFmdGVyRmluZFByb2Nlc3NlZE9iamVjdHMiLCJtYXliZVJ1bkFmdGVyRmluZFRyaWdnZXIiLCJhZnRlckZpbmQiLCJRdWVyeSIsIndpdGhKU09OIiwid2hlcmUiLCJxdWVyeSIsImRlbCIsIklOVkFMSURfSlNPTiIsImlzVW5hdXRoZW50aWNhdGVkIiwiU0VTU0lPTl9NSVNTSU5HIiwiaW5mbGF0ZWRPYmplY3QiLCJzY2hlbWFDb250cm9sbGVyIiwiUHJvbWlzZSIsInJlc29sdmUiLCJ0aGVuIiwiaGFzVHJpZ2dlcnMiLCJvcCIsInJlc3BvbnNlIiwiZmlyc3RSZXN1bHQiLCJ1c2VyIiwiSU5WQUxJRF9TRVNTSU9OX1RPS0VOIiwiY2FjaGVBZGFwdGVyIiwiY2FjaGVDb250cm9sbGVyIiwic2Vzc2lvblRva2VuIiwiT2JqZWN0IiwiZnJvbUpTT04iLCJtYXliZVJ1blRyaWdnZXIiLCJiZWZvcmVEZWxldGUiLCJPQkpFQ1RfTk9UX0ZPVU5EIiwiZ2V0VXNlclJvbGVzIiwiZGF0YWJhc2UiLCJsb2FkU2NoZW1hIiwicyIsImFjbCIsInB1c2giLCJjb25jYXQiLCJ1c2VyUm9sZXMiLCJkZXN0cm95IiwicGVybXMiLCJnZXRDbGFzc0xldmVsUGVybWlzc2lvbnMiLCJvbkFmdGVyRGVsZXRlIiwiYWZ0ZXJEZWxldGUiLCJjYXRjaCIsImVycm9yIiwiaGFuZGxlU2Vzc2lvbk1pc3NpbmdFcnJvciIsImNyZWF0ZSIsInJlc3RPYmplY3QiLCJ3cml0ZSIsInVwZGF0ZSIsIm9yaWdpbmFsUmVzdE9iamVjdCIsImNvZGUiLCJtb2R1bGUiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vc3JjL3Jlc3QuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gVGhpcyBmaWxlIGNvbnRhaW5zIGhlbHBlcnMgZm9yIHJ1bm5pbmcgb3BlcmF0aW9ucyBpbiBSRVNUIGZvcm1hdC5cbi8vIFRoZSBnb2FsIGlzIHRoYXQgaGFuZGxlcnMgdGhhdCBleHBsaWNpdGx5IGhhbmRsZSBhbiBleHByZXNzIHJvdXRlXG4vLyBzaG91bGQganVzdCBiZSBzaGFsbG93IHdyYXBwZXJzIGFyb3VuZCB0aGluZ3MgaW4gdGhpcyBmaWxlLCBidXRcbi8vIHRoZXNlIGZ1bmN0aW9ucyBzaG91bGQgbm90IGV4cGxpY2l0bHkgZGVwZW5kIG9uIHRoZSByZXF1ZXN0XG4vLyBvYmplY3QuXG4vLyBUaGlzIG1lYW5zIHRoYXQgb25lIG9mIHRoZXNlIGhhbmRsZXJzIGNhbiBzdXBwb3J0IG11bHRpcGxlXG4vLyByb3V0ZXMuIFRoYXQncyB1c2VmdWwgZm9yIHRoZSByb3V0ZXMgdGhhdCBkbyByZWFsbHkgc2ltaWxhclxuLy8gdGhpbmdzLlxuXG52YXIgUGFyc2UgPSByZXF1aXJlKCdwYXJzZS9ub2RlJykuUGFyc2U7XG5cbnZhciBSZXN0UXVlcnkgPSByZXF1aXJlKCcuL1Jlc3RRdWVyeScpO1xudmFyIFJlc3RXcml0ZSA9IHJlcXVpcmUoJy4vUmVzdFdyaXRlJyk7XG52YXIgdHJpZ2dlcnMgPSByZXF1aXJlKCcuL3RyaWdnZXJzJyk7XG5jb25zdCB7IGVuZm9yY2VSb2xlU2VjdXJpdHkgfSA9IHJlcXVpcmUoJy4vU2hhcmVkUmVzdCcpO1xuY29uc3QgeyBjcmVhdGVTYW5pdGl6ZWRFcnJvciB9ID0gcmVxdWlyZSgnLi9FcnJvcicpO1xuXG5mdW5jdGlvbiBjaGVja1RyaWdnZXJzKGNsYXNzTmFtZSwgY29uZmlnLCB0eXBlcykge1xuICByZXR1cm4gdHlwZXMuc29tZSh0cmlnZ2VyVHlwZSA9PiB7XG4gICAgcmV0dXJuIHRyaWdnZXJzLmdldFRyaWdnZXIoY2xhc3NOYW1lLCB0cmlnZ2Vycy5UeXBlc1t0cmlnZ2VyVHlwZV0sIGNvbmZpZy5hcHBsaWNhdGlvbklkKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGNoZWNrTGl2ZVF1ZXJ5KGNsYXNzTmFtZSwgY29uZmlnKSB7XG4gIHJldHVybiBjb25maWcubGl2ZVF1ZXJ5Q29udHJvbGxlciAmJiBjb25maWcubGl2ZVF1ZXJ5Q29udHJvbGxlci5oYXNMaXZlUXVlcnkoY2xhc3NOYW1lKTtcbn1cbmFzeW5jIGZ1bmN0aW9uIHJ1bkZpbmRUcmlnZ2VycyhcbiAgY29uZmlnLFxuICBhdXRoLFxuICBjbGFzc05hbWUsXG4gIHJlc3RXaGVyZSxcbiAgcmVzdE9wdGlvbnMsXG4gIGNsaWVudFNESyxcbiAgY29udGV4dCxcbiAgb3B0aW9ucyA9IHt9XG4pIHtcbiAgY29uc3QgeyBpc0dldCB9ID0gb3B0aW9ucztcblxuICBpZiAocmVzdE9wdGlvbnMgJiYgcmVzdE9wdGlvbnMuZXhwbGFpbiAmJiAhYXV0aC5pc01hc3Rlcikge1xuICAgIGNvbnN0IGFsbG93UHVibGljRXhwbGFpbiA9IGNvbmZpZy5kYXRhYmFzZU9wdGlvbnM/LmFsbG93UHVibGljRXhwbGFpbiA/PyB0cnVlO1xuXG4gICAgaWYgKCFhbGxvd1B1YmxpY0V4cGxhaW4pIHtcbiAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihcbiAgICAgICAgUGFyc2UuRXJyb3IuSU5WQUxJRF9RVUVSWSxcbiAgICAgICAgJ1VzaW5nIHRoZSBleHBsYWluIHF1ZXJ5IHBhcmFtZXRlciByZXF1aXJlcyB0aGUgbWFzdGVyIGtleSdcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLy8gUnVuIGJlZm9yZUZpbmQgdHJpZ2dlciAtIG1heSBtb2RpZnkgcXVlcnkgb3IgcmV0dXJuIG9iamVjdHMgZGlyZWN0bHlcbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdHJpZ2dlcnMubWF5YmVSdW5RdWVyeVRyaWdnZXIoXG4gICAgdHJpZ2dlcnMuVHlwZXMuYmVmb3JlRmluZCxcbiAgICBjbGFzc05hbWUsXG4gICAgcmVzdFdoZXJlLFxuICAgIHJlc3RPcHRpb25zLFxuICAgIGNvbmZpZyxcbiAgICBhdXRoLFxuICAgIGNvbnRleHQsXG4gICAgaXNHZXRcbiAgKTtcblxuICByZXN0V2hlcmUgPSByZXN1bHQucmVzdFdoZXJlIHx8IHJlc3RXaGVyZTtcbiAgcmVzdE9wdGlvbnMgPSByZXN1bHQucmVzdE9wdGlvbnMgfHwgcmVzdE9wdGlvbnM7XG5cbiAgLy8gU2hvcnQtY2lyY3VpdCBwYXRoOiBiZWZvcmVGaW5kIHJldHVybmVkIG9iamVjdHMgZGlyZWN0bHlcbiAgLy8gU2VjdXJpdHkgcmlzazogVGhlc2Ugb2JqZWN0cyBtYXkgaGF2ZSBiZWVuIGZldGNoZWQgd2l0aCBtYXN0ZXIgcHJpdmlsZWdlc1xuICBpZiAocmVzdWx0Py5vYmplY3RzKSB7XG4gICAgY29uc3Qgb2JqZWN0c0Zyb21CZWZvcmVGaW5kID0gcmVzdWx0Lm9iamVjdHM7XG5cbiAgICBsZXQgb2JqZWN0c0ZvckFmdGVyRmluZCA9IG9iamVjdHNGcm9tQmVmb3JlRmluZDtcblxuICAgIC8vIFNlY3VyaXR5IGNoZWNrOiBSZS1maWx0ZXIgb2JqZWN0cyBpZiBub3QgbWFzdGVyIHRvIGVuc3VyZSBBQ0wvQ0xQIGNvbXBsaWFuY2VcbiAgICBpZiAoIWF1dGg/LmlzTWFzdGVyICYmICFhdXRoPy5pc01haW50ZW5hbmNlKSB7XG4gICAgICBjb25zdCBpZHMgPSAoQXJyYXkuaXNBcnJheShvYmplY3RzRnJvbUJlZm9yZUZpbmQpID8gb2JqZWN0c0Zyb21CZWZvcmVGaW5kIDogW29iamVjdHNGcm9tQmVmb3JlRmluZF0pXG4gICAgICAgIC5tYXAobyA9PiAobyAmJiAoby5pZCB8fCBvLm9iamVjdElkKSkgfHwgbnVsbClcbiAgICAgICAgLmZpbHRlcihCb29sZWFuKTtcblxuICAgICAgLy8gT2JqZWN0cyB3aXRob3V0IElEcyBhcmUobm9ybWFsbHkpIHVuc2F2ZWQgb2JqZWN0c1xuICAgICAgLy8gRm9yIHVuc2F2ZWQgb2JqZWN0cywgdGhlIEFDTCBzZWN1cml0eSBkb2VzIG5vdCBhcHBseSwgc28gbm8gbmVlZCB0byByZWRvIHRoZSBxdWVyeS5cbiAgICAgIC8vIEZvciBzYXZlZCBvYmplY3RzLCB3ZSBuZWVkIHRvIHJlLXF1ZXJ5IHRvIGVuc3VyZSBwcm9wZXIgQUNML0NMUCBlbmZvcmNlbWVudFxuICAgICAgaWYgKGlkcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IHJlZmlsdGVyV2hlcmUgPSBpc0dldCA/IHsgb2JqZWN0SWQ6IGlkc1swXSB9IDogeyBvYmplY3RJZDogeyAkaW46IGlkcyB9IH07XG5cbiAgICAgICAgLy8gUmUtcXVlcnkgd2l0aCBwcm9wZXIgc2VjdXJpdHk6IG5vIHRyaWdnZXJzIHRvIGF2b2lkIGluZmluaXRlIGxvb3BzXG4gICAgICAgIGNvbnN0IHJlZmlsdGVyUXVlcnkgPSBhd2FpdCBSZXN0UXVlcnkoe1xuICAgICAgICAgIG1ldGhvZDogaXNHZXQgPyBSZXN0UXVlcnkuTWV0aG9kLmdldCA6IFJlc3RRdWVyeS5NZXRob2QuZmluZCxcbiAgICAgICAgICBjb25maWcsXG4gICAgICAgICAgYXV0aCxcbiAgICAgICAgICBjbGFzc05hbWUsXG4gICAgICAgICAgcmVzdFdoZXJlOiByZWZpbHRlcldoZXJlLFxuICAgICAgICAgIHJlc3RPcHRpb25zLFxuICAgICAgICAgIGNsaWVudFNESyxcbiAgICAgICAgICBjb250ZXh0LFxuICAgICAgICAgIHJ1bkJlZm9yZUZpbmQ6IGZhbHNlLFxuICAgICAgICAgIHJ1bkFmdGVyRmluZDogZmFsc2UsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHJlZmlsdGVyZWQgPSBhd2FpdCByZWZpbHRlclF1ZXJ5LmV4ZWN1dGUoKTtcbiAgICAgICAgb2JqZWN0c0ZvckFmdGVyRmluZCA9IChyZWZpbHRlcmVkICYmIHJlZmlsdGVyZWQucmVzdWx0cykgfHwgW107XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUnVuIGFmdGVyRmluZCB0cmlnZ2VyIG9uIHNlY3VyaXR5LWZpbHRlcmVkIG9iamVjdHNcbiAgICBjb25zdCBhZnRlckZpbmRQcm9jZXNzZWRPYmplY3RzID0gYXdhaXQgdHJpZ2dlcnMubWF5YmVSdW5BZnRlckZpbmRUcmlnZ2VyKFxuICAgICAgdHJpZ2dlcnMuVHlwZXMuYWZ0ZXJGaW5kLFxuICAgICAgYXV0aCxcbiAgICAgIGNsYXNzTmFtZSxcbiAgICAgIG9iamVjdHNGb3JBZnRlckZpbmQsXG4gICAgICBjb25maWcsXG4gICAgICBuZXcgUGFyc2UuUXVlcnkoY2xhc3NOYW1lKS53aXRoSlNPTih7IHdoZXJlOiByZXN0V2hlcmUsIC4uLnJlc3RPcHRpb25zIH0pLFxuICAgICAgY29udGV4dCxcbiAgICAgIGlzR2V0XG4gICAgKTtcblxuICAgIHJldHVybiB7XG4gICAgICByZXN1bHRzOiBhZnRlckZpbmRQcm9jZXNzZWRPYmplY3RzLFxuICAgIH07XG4gIH1cblxuICAvLyBOb3JtYWwgcGF0aDogZXhlY3V0ZSBkYXRhYmFzZSBxdWVyeSB3aXRoIG1vZGlmaWVkIGNvbmRpdGlvbnNcbiAgY29uc3QgcXVlcnkgPSBhd2FpdCBSZXN0UXVlcnkoe1xuICAgIG1ldGhvZDogaXNHZXQgPyBSZXN0UXVlcnkuTWV0aG9kLmdldCA6IFJlc3RRdWVyeS5NZXRob2QuZmluZCxcbiAgICBjb25maWcsXG4gICAgYXV0aCxcbiAgICBjbGFzc05hbWUsXG4gICAgcmVzdFdoZXJlLFxuICAgIHJlc3RPcHRpb25zLFxuICAgIGNsaWVudFNESyxcbiAgICBjb250ZXh0LFxuICAgIHJ1bkJlZm9yZUZpbmQ6IGZhbHNlLFxuICB9KTtcblxuICByZXR1cm4gcXVlcnkuZXhlY3V0ZSgpO1xufVxuXG4vLyBSZXR1cm5zIGEgcHJvbWlzZSBmb3IgYW4gb2JqZWN0IHdpdGggb3B0aW9uYWwga2V5cyAncmVzdWx0cycgYW5kICdjb3VudCcuXG5jb25zdCBmaW5kID0gYXN5bmMgKGNvbmZpZywgYXV0aCwgY2xhc3NOYW1lLCByZXN0V2hlcmUsIHJlc3RPcHRpb25zLCBjbGllbnRTREssIGNvbnRleHQpID0+IHtcbiAgZW5mb3JjZVJvbGVTZWN1cml0eSgnZmluZCcsIGNsYXNzTmFtZSwgYXV0aCwgY29uZmlnKTtcbiAgcmV0dXJuIHJ1bkZpbmRUcmlnZ2VycyhcbiAgICBjb25maWcsXG4gICAgYXV0aCxcbiAgICBjbGFzc05hbWUsXG4gICAgcmVzdFdoZXJlLFxuICAgIHJlc3RPcHRpb25zLFxuICAgIGNsaWVudFNESyxcbiAgICBjb250ZXh0LFxuICAgIHsgaXNHZXQ6IGZhbHNlIH1cbiAgKTtcbn07XG5cbi8vIGdldCBpcyBqdXN0IGxpa2UgZmluZCBidXQgb25seSBxdWVyaWVzIGFuIG9iamVjdElkLlxuY29uc3QgZ2V0ID0gYXN5bmMgKGNvbmZpZywgYXV0aCwgY2xhc3NOYW1lLCBvYmplY3RJZCwgcmVzdE9wdGlvbnMsIGNsaWVudFNESywgY29udGV4dCkgPT4ge1xuICBlbmZvcmNlUm9sZVNlY3VyaXR5KCdnZXQnLCBjbGFzc05hbWUsIGF1dGgsIGNvbmZpZyk7XG4gIHJldHVybiBydW5GaW5kVHJpZ2dlcnMoXG4gICAgY29uZmlnLFxuICAgIGF1dGgsXG4gICAgY2xhc3NOYW1lLFxuICAgIHsgb2JqZWN0SWQgfSxcbiAgICByZXN0T3B0aW9ucyxcbiAgICBjbGllbnRTREssXG4gICAgY29udGV4dCxcbiAgICB7IGlzR2V0OiB0cnVlIH1cbiAgKTtcbn07XG5cbi8vIFJldHVybnMgYSBwcm9taXNlIHRoYXQgZG9lc24ndCByZXNvbHZlIHRvIGFueSB1c2VmdWwgdmFsdWUuXG5mdW5jdGlvbiBkZWwoY29uZmlnLCBhdXRoLCBjbGFzc05hbWUsIG9iamVjdElkLCBjb250ZXh0KSB7XG4gIGlmICh0eXBlb2Ygb2JqZWN0SWQgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLklOVkFMSURfSlNPTiwgJ2JhZCBvYmplY3RJZCcpO1xuICB9XG5cbiAgaWYgKGNsYXNzTmFtZSA9PT0gJ19Vc2VyJyAmJiBhdXRoLmlzVW5hdXRoZW50aWNhdGVkKCkpIHtcbiAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuU0VTU0lPTl9NSVNTSU5HLCAnSW5zdWZmaWNpZW50IGF1dGggdG8gZGVsZXRlIHVzZXInKTtcbiAgfVxuXG4gIGVuZm9yY2VSb2xlU2VjdXJpdHkoJ2RlbGV0ZScsIGNsYXNzTmFtZSwgYXV0aCwgY29uZmlnKTtcblxuICBsZXQgaW5mbGF0ZWRPYmplY3Q7XG4gIGxldCBzY2hlbWFDb250cm9sbGVyO1xuXG4gIHJldHVybiBQcm9taXNlLnJlc29sdmUoKVxuICAgIC50aGVuKGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGhhc1RyaWdnZXJzID0gY2hlY2tUcmlnZ2VycyhjbGFzc05hbWUsIGNvbmZpZywgWydiZWZvcmVEZWxldGUnLCAnYWZ0ZXJEZWxldGUnXSk7XG4gICAgICBjb25zdCBoYXNMaXZlUXVlcnkgPSBjaGVja0xpdmVRdWVyeShjbGFzc05hbWUsIGNvbmZpZyk7XG4gICAgICBpZiAoaGFzVHJpZ2dlcnMgfHwgaGFzTGl2ZVF1ZXJ5IHx8IGNsYXNzTmFtZSA9PSAnX1Nlc3Npb24nKSB7XG4gICAgICAgIGNvbnN0IHF1ZXJ5ID0gYXdhaXQgUmVzdFF1ZXJ5KHtcbiAgICAgICAgICBtZXRob2Q6IFJlc3RRdWVyeS5NZXRob2QuZ2V0LFxuICAgICAgICAgIGNvbmZpZyxcbiAgICAgICAgICBhdXRoLFxuICAgICAgICAgIGNsYXNzTmFtZSxcbiAgICAgICAgICByZXN0V2hlcmU6IHsgb2JqZWN0SWQgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBxdWVyeS5leGVjdXRlKHsgb3A6ICdkZWxldGUnIH0pLnRoZW4ocmVzcG9uc2UgPT4ge1xuICAgICAgICAgIGlmIChyZXNwb25zZSAmJiByZXNwb25zZS5yZXN1bHRzICYmIHJlc3BvbnNlLnJlc3VsdHMubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCBmaXJzdFJlc3VsdCA9IHJlc3BvbnNlLnJlc3VsdHNbMF07XG4gICAgICAgICAgICBmaXJzdFJlc3VsdC5jbGFzc05hbWUgPSBjbGFzc05hbWU7XG4gICAgICAgICAgICBpZiAoY2xhc3NOYW1lID09PSAnX1Nlc3Npb24nICYmICFhdXRoLmlzTWFzdGVyICYmICFhdXRoLmlzTWFpbnRlbmFuY2UpIHtcbiAgICAgICAgICAgICAgaWYgKCFhdXRoLnVzZXIgfHwgZmlyc3RSZXN1bHQudXNlci5vYmplY3RJZCAhPT0gYXV0aC51c2VyLmlkKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgY3JlYXRlU2FuaXRpemVkRXJyb3IoUGFyc2UuRXJyb3IuSU5WQUxJRF9TRVNTSU9OX1RPS0VOLCAnSW52YWxpZCBzZXNzaW9uIHRva2VuJywgY29uZmlnKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGNhY2hlQWRhcHRlciA9IGNvbmZpZy5jYWNoZUNvbnRyb2xsZXI7XG4gICAgICAgICAgICBjYWNoZUFkYXB0ZXIudXNlci5kZWwoZmlyc3RSZXN1bHQuc2Vzc2lvblRva2VuKTtcbiAgICAgICAgICAgIGluZmxhdGVkT2JqZWN0ID0gUGFyc2UuT2JqZWN0LmZyb21KU09OKGZpcnN0UmVzdWx0KTtcbiAgICAgICAgICAgIHJldHVybiB0cmlnZ2Vycy5tYXliZVJ1blRyaWdnZXIoXG4gICAgICAgICAgICAgIHRyaWdnZXJzLlR5cGVzLmJlZm9yZURlbGV0ZSxcbiAgICAgICAgICAgICAgYXV0aCxcbiAgICAgICAgICAgICAgaW5mbGF0ZWRPYmplY3QsXG4gICAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICAgIGNvbmZpZyxcbiAgICAgICAgICAgICAgY29udGV4dFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLk9CSkVDVF9OT1RfRk9VTkQsICdPYmplY3Qgbm90IGZvdW5kIGZvciBkZWxldGUuJyk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7fSk7XG4gICAgfSlcbiAgICAudGhlbigoKSA9PiB7XG4gICAgICBpZiAoIWF1dGguaXNNYXN0ZXIgJiYgIWF1dGguaXNNYWludGVuYW5jZSkge1xuICAgICAgICByZXR1cm4gYXV0aC5nZXRVc2VyUm9sZXMoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9KVxuICAgIC50aGVuKCgpID0+IGNvbmZpZy5kYXRhYmFzZS5sb2FkU2NoZW1hKCkpXG4gICAgLnRoZW4ocyA9PiB7XG4gICAgICBzY2hlbWFDb250cm9sbGVyID0gcztcbiAgICAgIGNvbnN0IG9wdGlvbnMgPSB7fTtcbiAgICAgIGlmICghYXV0aC5pc01hc3RlciAmJiAhYXV0aC5pc01haW50ZW5hbmNlKSB7XG4gICAgICAgIG9wdGlvbnMuYWNsID0gWycqJ107XG4gICAgICAgIGlmIChhdXRoLnVzZXIpIHtcbiAgICAgICAgICBvcHRpb25zLmFjbC5wdXNoKGF1dGgudXNlci5pZCk7XG4gICAgICAgICAgb3B0aW9ucy5hY2wgPSBvcHRpb25zLmFjbC5jb25jYXQoYXV0aC51c2VyUm9sZXMpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjb25maWcuZGF0YWJhc2UuZGVzdHJveShcbiAgICAgICAgY2xhc3NOYW1lLFxuICAgICAgICB7XG4gICAgICAgICAgb2JqZWN0SWQ6IG9iamVjdElkLFxuICAgICAgICB9LFxuICAgICAgICBvcHRpb25zLFxuICAgICAgICBzY2hlbWFDb250cm9sbGVyXG4gICAgICApO1xuICAgIH0pXG4gICAgLnRoZW4oKCkgPT4ge1xuICAgICAgLy8gTm90aWZ5IExpdmVRdWVyeSBzZXJ2ZXIgaWYgcG9zc2libGVcbiAgICAgIGNvbnN0IHBlcm1zID0gc2NoZW1hQ29udHJvbGxlci5nZXRDbGFzc0xldmVsUGVybWlzc2lvbnMoY2xhc3NOYW1lKTtcbiAgICAgIGNvbmZpZy5saXZlUXVlcnlDb250cm9sbGVyLm9uQWZ0ZXJEZWxldGUoY2xhc3NOYW1lLCBpbmZsYXRlZE9iamVjdCwgbnVsbCwgcGVybXMpO1xuICAgICAgcmV0dXJuIHRyaWdnZXJzLm1heWJlUnVuVHJpZ2dlcihcbiAgICAgICAgdHJpZ2dlcnMuVHlwZXMuYWZ0ZXJEZWxldGUsXG4gICAgICAgIGF1dGgsXG4gICAgICAgIGluZmxhdGVkT2JqZWN0LFxuICAgICAgICBudWxsLFxuICAgICAgICBjb25maWcsXG4gICAgICAgIGNvbnRleHRcbiAgICAgICk7XG4gICAgfSlcbiAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgaGFuZGxlU2Vzc2lvbk1pc3NpbmdFcnJvcihlcnJvciwgY2xhc3NOYW1lLCBhdXRoLCBjb25maWcpO1xuICAgIH0pO1xufVxuXG4vLyBSZXR1cm5zIGEgcHJvbWlzZSBmb3IgYSB7cmVzcG9uc2UsIHN0YXR1cywgbG9jYXRpb259IG9iamVjdC5cbmZ1bmN0aW9uIGNyZWF0ZShjb25maWcsIGF1dGgsIGNsYXNzTmFtZSwgcmVzdE9iamVjdCwgY2xpZW50U0RLLCBjb250ZXh0KSB7XG4gIGVuZm9yY2VSb2xlU2VjdXJpdHkoJ2NyZWF0ZScsIGNsYXNzTmFtZSwgYXV0aCwgY29uZmlnKTtcbiAgdmFyIHdyaXRlID0gbmV3IFJlc3RXcml0ZShjb25maWcsIGF1dGgsIGNsYXNzTmFtZSwgbnVsbCwgcmVzdE9iamVjdCwgbnVsbCwgY2xpZW50U0RLLCBjb250ZXh0KTtcbiAgcmV0dXJuIHdyaXRlLmV4ZWN1dGUoKTtcbn1cblxuLy8gUmV0dXJucyBhIHByb21pc2UgdGhhdCBjb250YWlucyB0aGUgZmllbGRzIG9mIHRoZSB1cGRhdGUgdGhhdCB0aGVcbi8vIFJFU1QgQVBJIGlzIHN1cHBvc2VkIHRvIHJldHVybi5cbi8vIFVzdWFsbHksIHRoaXMgaXMganVzdCB1cGRhdGVkQXQuXG5mdW5jdGlvbiB1cGRhdGUoY29uZmlnLCBhdXRoLCBjbGFzc05hbWUsIHJlc3RXaGVyZSwgcmVzdE9iamVjdCwgY2xpZW50U0RLLCBjb250ZXh0KSB7XG4gIGVuZm9yY2VSb2xlU2VjdXJpdHkoJ3VwZGF0ZScsIGNsYXNzTmFtZSwgYXV0aCwgY29uZmlnKTtcblxuICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKClcbiAgICAudGhlbihhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBoYXNUcmlnZ2VycyA9IGNoZWNrVHJpZ2dlcnMoY2xhc3NOYW1lLCBjb25maWcsIFsnYmVmb3JlU2F2ZScsICdhZnRlclNhdmUnXSk7XG4gICAgICBjb25zdCBoYXNMaXZlUXVlcnkgPSBjaGVja0xpdmVRdWVyeShjbGFzc05hbWUsIGNvbmZpZyk7XG4gICAgICBpZiAoaGFzVHJpZ2dlcnMgfHwgaGFzTGl2ZVF1ZXJ5KSB7XG4gICAgICAgIC8vIERvIG5vdCB1c2UgZmluZCwgYXMgaXQgcnVucyB0aGUgYmVmb3JlIGZpbmRzXG4gICAgICAgIGNvbnN0IHF1ZXJ5ID0gYXdhaXQgUmVzdFF1ZXJ5KHtcbiAgICAgICAgICBtZXRob2Q6IFJlc3RRdWVyeS5NZXRob2QuZ2V0LFxuICAgICAgICAgIGNvbmZpZyxcbiAgICAgICAgICBhdXRoLFxuICAgICAgICAgIGNsYXNzTmFtZSxcbiAgICAgICAgICByZXN0V2hlcmUsXG4gICAgICAgICAgcnVuQWZ0ZXJGaW5kOiBmYWxzZSxcbiAgICAgICAgICBydW5CZWZvcmVGaW5kOiBmYWxzZSxcbiAgICAgICAgICBjb250ZXh0LFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHF1ZXJ5LmV4ZWN1dGUoe1xuICAgICAgICAgIG9wOiAndXBkYXRlJyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHt9KTtcbiAgICB9KVxuICAgIC50aGVuKCh7IHJlc3VsdHMgfSkgPT4ge1xuICAgICAgdmFyIG9yaWdpbmFsUmVzdE9iamVjdDtcbiAgICAgIGlmIChyZXN1bHRzICYmIHJlc3VsdHMubGVuZ3RoKSB7XG4gICAgICAgIG9yaWdpbmFsUmVzdE9iamVjdCA9IHJlc3VsdHNbMF07XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3IFJlc3RXcml0ZShcbiAgICAgICAgY29uZmlnLFxuICAgICAgICBhdXRoLFxuICAgICAgICBjbGFzc05hbWUsXG4gICAgICAgIHJlc3RXaGVyZSxcbiAgICAgICAgcmVzdE9iamVjdCxcbiAgICAgICAgb3JpZ2luYWxSZXN0T2JqZWN0LFxuICAgICAgICBjbGllbnRTREssXG4gICAgICAgIGNvbnRleHQsXG4gICAgICAgICd1cGRhdGUnXG4gICAgICApLmV4ZWN1dGUoKTtcbiAgICB9KVxuICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICBoYW5kbGVTZXNzaW9uTWlzc2luZ0Vycm9yKGVycm9yLCBjbGFzc05hbWUsIGF1dGgsIGNvbmZpZyk7XG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIGhhbmRsZVNlc3Npb25NaXNzaW5nRXJyb3IoZXJyb3IsIGNsYXNzTmFtZSwgYXV0aCwgY29uZmlnKSB7XG4gIC8vIElmIHdlJ3JlIHRyeWluZyB0byB1cGRhdGUgYSB1c2VyIHdpdGhvdXQgLyB3aXRoIGJhZCBzZXNzaW9uIHRva2VuXG4gIGlmIChcbiAgICBjbGFzc05hbWUgPT09ICdfVXNlcicgJiZcbiAgICBlcnJvci5jb2RlID09PSBQYXJzZS5FcnJvci5PQkpFQ1RfTk9UX0ZPVU5EICYmXG4gICAgIWF1dGguaXNNYXN0ZXIgJiZcbiAgICAhYXV0aC5pc01haW50ZW5hbmNlXG4gICkge1xuICAgIHRocm93IGNyZWF0ZVNhbml0aXplZEVycm9yKFBhcnNlLkVycm9yLlNFU1NJT05fTUlTU0lORywgJ0luc3VmZmljaWVudCBhdXRoLicsIGNvbmZpZyk7XG4gIH1cbiAgdGhyb3cgZXJyb3I7XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBjcmVhdGUsXG4gIGRlbCxcbiAgZmluZCxcbiAgZ2V0LFxuICB1cGRhdGUsXG59O1xuIl0sIm1hcHBpbmdzIjoiOztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsSUFBSUEsS0FBSyxHQUFHQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUNELEtBQUs7QUFFdkMsSUFBSUUsU0FBUyxHQUFHRCxPQUFPLENBQUMsYUFBYSxDQUFDO0FBQ3RDLElBQUlFLFNBQVMsR0FBR0YsT0FBTyxDQUFDLGFBQWEsQ0FBQztBQUN0QyxJQUFJRyxRQUFRLEdBQUdILE9BQU8sQ0FBQyxZQUFZLENBQUM7QUFDcEMsTUFBTTtFQUFFSTtBQUFvQixDQUFDLEdBQUdKLE9BQU8sQ0FBQyxjQUFjLENBQUM7QUFDdkQsTUFBTTtFQUFFSztBQUFxQixDQUFDLEdBQUdMLE9BQU8sQ0FBQyxTQUFTLENBQUM7QUFFbkQsU0FBU00sYUFBYUEsQ0FBQ0MsU0FBUyxFQUFFQyxNQUFNLEVBQUVDLEtBQUssRUFBRTtFQUMvQyxPQUFPQSxLQUFLLENBQUNDLElBQUksQ0FBQ0MsV0FB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QUFTLENBQUNvRCxNQUFNLENBQUNDLEdBQUc7UUFDNUI5QyxNQUFNO1FBQ05XLElBQUk7UUFDSlosU0FBUztRQUNUYSxTQUFTO1FBQ1RxQyxZQUFZLEVBQUUsS0FBSztRQUNuQkQsYUFBYSxFQUFFLEtBQUs7UUFDcEJqQztNQUNGLENBQUMsQ0FBQztNQUNGLE9BQU80QyxLQUFLLENBQUNSLE9BQU8sQ0FBQztRQUNuQm1CLEVBQUUsRUFBRTtNQUNOLENBQUMsQ0FBQztJQUNKO0lBQ0EsT0FBT0osT0FBTyxDQUFDQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDNUIsQ0FBQyxDQUFDLENBQ0RDLElBQUksQ0FBQyxDQUFDO0lBQUVoQjtFQUFRLENBQUMsS0FBSztJQUNyQixJQUFJbUQsa0JBQWtCO0lBQ3RCLElBQUluRCxPQUFPLElBQUlBLE9BQU8sQ0FBQ1osTUFBTSxFQUFFO01BQzdCK0Qsa0JBQWtCLEdBQUduRCxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQ2pDO0lBQ0EsT0FBTyxJQUFJMUQsU0FBUyxDQUNsQk0sTUFBTSxFQUNOVyxJQUFJLEVBQ0paLFNBQVMsRUFDVGEsU0FBUyxFQUNUd0YsVUFBVSxFQUNWRyxrQkFBa0IsRUFDbEJ6RixTQUFTLEVBQ1RDLE9BQU8sRUFDUCxRQUNGLENBQUMsQ0FBQ29DLE9BQU8sQ0FBQyxDQUFDO0VBQ2IsQ0FBQyxDQUFDLENBQ0Q2QyxLQUFLLENBQUNDLEtBQUssSUFBSTtJQUNkQyx5QkFBeUIsQ0FBQ0QsS0FBSyxFQUFFbEcsU0FBUyxFQUFFWSxJQUFJLEVBQUVYLE1BQU0sQ0FBQztFQUMzRCxDQUFDLENBQUM7QUFDTjtBQUVBLFNBQVNrRyx5QkFBeUJBLENBQUNELEtBQUssRUFBRWxHLFNBQVMsRUFBRVksSUFBSSxFQUFFWCxNQUFNLEVBQUU7RUFDakU7RUFDQSxJQUNFRCxTQUFTLEtBQUssT0FBTyxJQUNyQmtHLEtBQUssQ0FBQ08sSUFBSSxLQUFLakgsS0FBSyxDQUFDK0IsS0FBSyxDQUFDNEQsZ0JBQWdCLElBQzNDLENBQUN2RSxJQUFJLENBQUNRLFFBQVEsSUFDZCxDQUFDUixJQUFJLENBQUNtQixhQUFhLEVBQ25CO0lBQ0EsTUFBTWpDLG9CQUFvQixDQUFDTixLQUFLLENBQUMrQixLQUFLLENBQUN5QyxlQUFlLEVBQUUsb0JBQW9CLEVBQUUvRCxNQUFNLENBQUM7RUFDdkY7RUFDQSxNQUFNaUcsS0FBSztBQUNiO0FBRUFRLE1BQU0sQ0FBQ0MsT0FBTyxHQUFHO0VBQ2ZQLE1BQU07RUFDTnZDLEdBQUc7RUFDSGIsSUFBSTtFQUNKRCxHQUFHO0VBQ0h3RDtBQUNGLENBQUMiLCJpZ25vcmVMaXN0IjpbXX0=
|