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,87 +4,62 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.default = exports.PostgresStorageAdapter = void 0;
|
|
7
|
-
|
|
8
7
|
var _PostgresClient = require("./PostgresClient");
|
|
9
|
-
|
|
10
8
|
var _node = _interopRequireDefault(require("parse/node"));
|
|
11
|
-
|
|
12
9
|
var _lodash = _interopRequireDefault(require("lodash"));
|
|
13
|
-
|
|
14
10
|
var _uuid = require("uuid");
|
|
15
|
-
|
|
16
11
|
var _sql = _interopRequireDefault(require("./sql"));
|
|
17
|
-
|
|
18
12
|
var _StorageAdapter = require("../StorageAdapter");
|
|
19
|
-
|
|
20
13
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
21
|
-
|
|
22
|
-
function
|
|
23
|
-
|
|
24
|
-
function
|
|
25
|
-
|
|
26
|
-
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
27
|
-
|
|
14
|
+
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
|
15
|
+
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
|
|
16
|
+
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
17
|
+
function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
|
|
18
|
+
function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
|
|
28
19
|
const Utils = require('../../../Utils');
|
|
29
|
-
|
|
30
20
|
const PostgresRelationDoesNotExistError = '42P01';
|
|
31
21
|
const PostgresDuplicateRelationError = '42P07';
|
|
32
22
|
const PostgresDuplicateColumnError = '42701';
|
|
33
23
|
const PostgresMissingColumnError = '42703';
|
|
34
24
|
const PostgresUniqueIndexViolationError = '23505';
|
|
35
|
-
|
|
36
25
|
const logger = require('../../../logger');
|
|
37
|
-
|
|
38
26
|
const debug = function (...args) {
|
|
39
27
|
args = ['PG: ' + arguments[0]].concat(args.slice(1, args.length));
|
|
40
28
|
const log = logger.getLogger();
|
|
41
29
|
log.debug.apply(log, args);
|
|
42
30
|
};
|
|
43
|
-
|
|
44
31
|
const parseTypeToPostgresType = type => {
|
|
45
32
|
switch (type.type) {
|
|
46
33
|
case 'String':
|
|
47
34
|
return 'text';
|
|
48
|
-
|
|
49
35
|
case 'Date':
|
|
50
36
|
return 'timestamp with time zone';
|
|
51
|
-
|
|
52
37
|
case 'Object':
|
|
53
38
|
return 'jsonb';
|
|
54
|
-
|
|
55
39
|
case 'File':
|
|
56
40
|
return 'text';
|
|
57
|
-
|
|
58
41
|
case 'Boolean':
|
|
59
42
|
return 'boolean';
|
|
60
|
-
|
|
61
43
|
case 'Pointer':
|
|
62
44
|
return 'text';
|
|
63
|
-
|
|
64
45
|
case 'Number':
|
|
65
46
|
return 'double precision';
|
|
66
|
-
|
|
67
47
|
case 'GeoPoint':
|
|
68
48
|
return 'point';
|
|
69
|
-
|
|
70
49
|
case 'Bytes':
|
|
71
50
|
return 'jsonb';
|
|
72
|
-
|
|
73
51
|
case 'Polygon':
|
|
74
52
|
return 'polygon';
|
|
75
|
-
|
|
76
53
|
case 'Array':
|
|
77
54
|
if (type.contents && type.contents.type === 'String') {
|
|
78
55
|
return 'text[]';
|
|
79
56
|
} else {
|
|
80
57
|
return 'jsonb';
|
|
81
58
|
}
|
|
82
|
-
|
|
83
59
|
default:
|
|
84
60
|
throw `no type for ${JSON.stringify(type)} yet`;
|
|
85
61
|
}
|
|
86
62
|
};
|
|
87
|
-
|
|
88
63
|
const ParseToPosgresComparator = {
|
|
89
64
|
$gt: '>',
|
|
90
65
|
$lt: '<',
|
|
@@ -105,50 +80,40 @@ const mongoAggregateToPostgres = {
|
|
|
105
80
|
$week: 'WEEK',
|
|
106
81
|
$year: 'YEAR'
|
|
107
82
|
};
|
|
108
|
-
|
|
109
83
|
const toPostgresValue = value => {
|
|
110
84
|
if (typeof value === 'object') {
|
|
111
85
|
if (value.__type === 'Date') {
|
|
112
86
|
return value.iso;
|
|
113
87
|
}
|
|
114
|
-
|
|
115
88
|
if (value.__type === 'File') {
|
|
116
89
|
return value.name;
|
|
117
90
|
}
|
|
118
91
|
}
|
|
119
|
-
|
|
120
92
|
return value;
|
|
121
93
|
};
|
|
122
|
-
|
|
123
94
|
const toPostgresValueCastType = value => {
|
|
124
95
|
const postgresValue = toPostgresValue(value);
|
|
125
96
|
let castType;
|
|
126
|
-
|
|
127
97
|
switch (typeof postgresValue) {
|
|
128
98
|
case 'number':
|
|
129
99
|
castType = 'double precision';
|
|
130
100
|
break;
|
|
131
|
-
|
|
132
101
|
case 'boolean':
|
|
133
102
|
castType = 'boolean';
|
|
134
103
|
break;
|
|
135
|
-
|
|
136
104
|
default:
|
|
137
105
|
castType = undefined;
|
|
138
106
|
}
|
|
139
|
-
|
|
140
107
|
return castType;
|
|
141
108
|
};
|
|
142
|
-
|
|
143
109
|
const transformValue = value => {
|
|
144
110
|
if (typeof value === 'object' && value.__type === 'Pointer') {
|
|
145
111
|
return value.objectId;
|
|
146
112
|
}
|
|
147
|
-
|
|
148
113
|
return value;
|
|
149
|
-
};
|
|
150
|
-
|
|
114
|
+
};
|
|
151
115
|
|
|
116
|
+
// Duplicate from then mongo adapter...
|
|
152
117
|
const emptyCLPS = Object.freeze({
|
|
153
118
|
find: {},
|
|
154
119
|
get: {},
|
|
@@ -185,29 +150,22 @@ const defaultCLPS = Object.freeze({
|
|
|
185
150
|
'*': []
|
|
186
151
|
}
|
|
187
152
|
});
|
|
188
|
-
|
|
189
153
|
const toParseSchema = schema => {
|
|
190
154
|
if (schema.className === '_User') {
|
|
191
155
|
delete schema.fields._hashed_password;
|
|
192
156
|
}
|
|
193
|
-
|
|
194
157
|
if (schema.fields) {
|
|
195
158
|
delete schema.fields._wperm;
|
|
196
159
|
delete schema.fields._rperm;
|
|
197
160
|
}
|
|
198
|
-
|
|
199
161
|
let clps = defaultCLPS;
|
|
200
|
-
|
|
201
162
|
if (schema.classLevelPermissions) {
|
|
202
163
|
clps = _objectSpread(_objectSpread({}, emptyCLPS), schema.classLevelPermissions);
|
|
203
164
|
}
|
|
204
|
-
|
|
205
165
|
let indexes = {};
|
|
206
|
-
|
|
207
166
|
if (schema.indexes) {
|
|
208
167
|
indexes = _objectSpread({}, schema.indexes);
|
|
209
168
|
}
|
|
210
|
-
|
|
211
169
|
return {
|
|
212
170
|
className: schema.className,
|
|
213
171
|
fields: schema.fields,
|
|
@@ -215,12 +173,10 @@ const toParseSchema = schema => {
|
|
|
215
173
|
indexes
|
|
216
174
|
};
|
|
217
175
|
};
|
|
218
|
-
|
|
219
176
|
const toPostgresSchema = schema => {
|
|
220
177
|
if (!schema) {
|
|
221
178
|
return schema;
|
|
222
179
|
}
|
|
223
|
-
|
|
224
180
|
schema.fields = schema.fields || {};
|
|
225
181
|
schema.fields._wperm = {
|
|
226
182
|
type: 'Array',
|
|
@@ -234,7 +190,6 @@ const toPostgresSchema = schema => {
|
|
|
234
190
|
type: 'String'
|
|
235
191
|
}
|
|
236
192
|
};
|
|
237
|
-
|
|
238
193
|
if (schema.className === '_User') {
|
|
239
194
|
schema.fields._hashed_password = {
|
|
240
195
|
type: 'String'
|
|
@@ -243,10 +198,8 @@ const toPostgresSchema = schema => {
|
|
|
243
198
|
type: 'Array'
|
|
244
199
|
};
|
|
245
200
|
}
|
|
246
|
-
|
|
247
201
|
return schema;
|
|
248
202
|
};
|
|
249
|
-
|
|
250
203
|
const handleDotFields = object => {
|
|
251
204
|
Object.keys(object).forEach(fieldName => {
|
|
252
205
|
if (fieldName.indexOf('.') > -1) {
|
|
@@ -256,85 +209,68 @@ const handleDotFields = object => {
|
|
|
256
209
|
let currentObj = object[first];
|
|
257
210
|
let next;
|
|
258
211
|
let value = object[fieldName];
|
|
259
|
-
|
|
260
212
|
if (value && value.__op === 'Delete') {
|
|
261
213
|
value = undefined;
|
|
262
214
|
}
|
|
263
215
|
/* eslint-disable no-cond-assign */
|
|
264
|
-
|
|
265
|
-
|
|
266
216
|
while (next = components.shift()) {
|
|
267
217
|
/* eslint-enable no-cond-assign */
|
|
268
218
|
currentObj[next] = currentObj[next] || {};
|
|
269
|
-
|
|
270
219
|
if (components.length === 0) {
|
|
271
220
|
currentObj[next] = value;
|
|
272
221
|
}
|
|
273
|
-
|
|
274
222
|
currentObj = currentObj[next];
|
|
275
223
|
}
|
|
276
|
-
|
|
277
224
|
delete object[fieldName];
|
|
278
225
|
}
|
|
279
226
|
});
|
|
280
227
|
return object;
|
|
281
228
|
};
|
|
282
|
-
|
|
283
229
|
const transformDotFieldToComponents = fieldName => {
|
|
284
230
|
return fieldName.split('.').map((cmpt, index) => {
|
|
285
231
|
if (index === 0) {
|
|
286
232
|
return `"${cmpt}"`;
|
|
287
233
|
}
|
|
288
|
-
|
|
289
234
|
return `'${cmpt}'`;
|
|
290
235
|
});
|
|
291
236
|
};
|
|
292
|
-
|
|
293
237
|
const transformDotField = fieldName => {
|
|
294
238
|
if (fieldName.indexOf('.') === -1) {
|
|
295
239
|
return `"${fieldName}"`;
|
|
296
240
|
}
|
|
297
|
-
|
|
298
241
|
const components = transformDotFieldToComponents(fieldName);
|
|
299
242
|
let name = components.slice(0, components.length - 1).join('->');
|
|
300
243
|
name += '->>' + components[components.length - 1];
|
|
301
244
|
return name;
|
|
302
245
|
};
|
|
303
|
-
|
|
304
246
|
const transformAggregateField = fieldName => {
|
|
305
247
|
if (typeof fieldName !== 'string') {
|
|
306
248
|
return fieldName;
|
|
307
249
|
}
|
|
308
|
-
|
|
309
250
|
if (fieldName === '$_created_at') {
|
|
310
251
|
return 'createdAt';
|
|
311
252
|
}
|
|
312
|
-
|
|
313
253
|
if (fieldName === '$_updated_at') {
|
|
314
254
|
return 'updatedAt';
|
|
315
255
|
}
|
|
316
|
-
|
|
317
256
|
return fieldName.substr(1);
|
|
318
257
|
};
|
|
319
|
-
|
|
320
258
|
const validateKeys = object => {
|
|
321
259
|
if (typeof object == 'object') {
|
|
322
260
|
for (const key in object) {
|
|
323
261
|
if (typeof object[key] == 'object') {
|
|
324
262
|
validateKeys(object[key]);
|
|
325
263
|
}
|
|
326
|
-
|
|
327
264
|
if (key.includes('$') || key.includes('.')) {
|
|
328
265
|
throw new _node.default.Error(_node.default.Error.INVALID_NESTED_KEY, "Nested keys should not contain the '$' or '.' characters");
|
|
329
266
|
}
|
|
330
267
|
}
|
|
331
268
|
}
|
|
332
|
-
};
|
|
333
|
-
|
|
269
|
+
};
|
|
334
270
|
|
|
271
|
+
// Returns the list of join tables on a schema
|
|
335
272
|
const joinTablesForSchema = schema => {
|
|
336
273
|
const list = [];
|
|
337
|
-
|
|
338
274
|
if (schema) {
|
|
339
275
|
Object.keys(schema.fields).forEach(field => {
|
|
340
276
|
if (schema.fields[field].type === 'Relation') {
|
|
@@ -342,10 +278,8 @@ const joinTablesForSchema = schema => {
|
|
|
342
278
|
}
|
|
343
279
|
});
|
|
344
280
|
}
|
|
345
|
-
|
|
346
281
|
return list;
|
|
347
282
|
};
|
|
348
|
-
|
|
349
283
|
const buildWhereClause = ({
|
|
350
284
|
schema,
|
|
351
285
|
query,
|
|
@@ -356,21 +290,19 @@ const buildWhereClause = ({
|
|
|
356
290
|
let values = [];
|
|
357
291
|
const sorts = [];
|
|
358
292
|
schema = toPostgresSchema(schema);
|
|
359
|
-
|
|
360
293
|
for (const fieldName in query) {
|
|
361
294
|
const isArrayField = schema.fields && schema.fields[fieldName] && schema.fields[fieldName].type === 'Array';
|
|
362
295
|
const initialPatternsLength = patterns.length;
|
|
363
|
-
const fieldValue = query[fieldName];
|
|
296
|
+
const fieldValue = query[fieldName];
|
|
364
297
|
|
|
298
|
+
// nothing in the schema, it's gonna blow up
|
|
365
299
|
if (!schema.fields[fieldName]) {
|
|
366
300
|
// as it won't exist
|
|
367
301
|
if (fieldValue && fieldValue.$exists === false) {
|
|
368
302
|
continue;
|
|
369
303
|
}
|
|
370
304
|
}
|
|
371
|
-
|
|
372
305
|
const authDataMatch = fieldName.match(/^_auth_data_([a-zA-Z0-9_]+)$/);
|
|
373
|
-
|
|
374
306
|
if (authDataMatch) {
|
|
375
307
|
// TODO: Handle querying by _auth_data_provider, authData is stored in authData field
|
|
376
308
|
continue;
|
|
@@ -380,7 +312,6 @@ const buildWhereClause = ({
|
|
|
380
312
|
index += 2;
|
|
381
313
|
} else if (fieldName.indexOf('.') >= 0) {
|
|
382
314
|
let name = transformDotField(fieldName);
|
|
383
|
-
|
|
384
315
|
if (fieldValue === null) {
|
|
385
316
|
patterns.push(`$${index}:raw IS NULL`);
|
|
386
317
|
values.push(name);
|
|
@@ -392,7 +323,8 @@ const buildWhereClause = ({
|
|
|
392
323
|
patterns.push(`($${index}:raw)::jsonb @> $${index + 1}::jsonb`);
|
|
393
324
|
values.push(name, JSON.stringify(fieldValue.$in));
|
|
394
325
|
index += 2;
|
|
395
|
-
} else if (fieldValue.$regex) {
|
|
326
|
+
} else if (fieldValue.$regex) {
|
|
327
|
+
// Handle later
|
|
396
328
|
} else if (typeof fieldValue !== 'object') {
|
|
397
329
|
patterns.push(`$${index}:raw = $${index + 1}::text`);
|
|
398
330
|
values.push(name, fieldValue);
|
|
@@ -409,8 +341,8 @@ const buildWhereClause = ({
|
|
|
409
341
|
values.push(fieldName, fieldValue);
|
|
410
342
|
index += 2;
|
|
411
343
|
} else if (typeof fieldValue === 'boolean') {
|
|
412
|
-
patterns.push(`$${index}:name = $${index + 1}`);
|
|
413
|
-
|
|
344
|
+
patterns.push(`$${index}:name = $${index + 1}`);
|
|
345
|
+
// Can't cast boolean to double precision
|
|
414
346
|
if (schema.fields[fieldName] && schema.fields[fieldName].type === 'Number') {
|
|
415
347
|
// Should always return zero results
|
|
416
348
|
const MAX_INT_PLUS_ONE = 9223372036854775808;
|
|
@@ -418,7 +350,6 @@ const buildWhereClause = ({
|
|
|
418
350
|
} else {
|
|
419
351
|
values.push(fieldName, fieldValue);
|
|
420
352
|
}
|
|
421
|
-
|
|
422
353
|
index += 2;
|
|
423
354
|
} else if (typeof fieldValue === 'number') {
|
|
424
355
|
patterns.push(`$${index}:name = $${index + 1}`);
|
|
@@ -434,7 +365,6 @@ const buildWhereClause = ({
|
|
|
434
365
|
index,
|
|
435
366
|
caseInsensitive
|
|
436
367
|
});
|
|
437
|
-
|
|
438
368
|
if (clause.pattern.length > 0) {
|
|
439
369
|
clauses.push(clause.pattern);
|
|
440
370
|
clauseValues.push(...clause.values);
|
|
@@ -446,7 +376,6 @@ const buildWhereClause = ({
|
|
|
446
376
|
patterns.push(`${not}(${clauses.join(orOrAnd)})`);
|
|
447
377
|
values.push(...clauseValues);
|
|
448
378
|
}
|
|
449
|
-
|
|
450
379
|
if (fieldValue.$ne !== undefined) {
|
|
451
380
|
if (isArrayField) {
|
|
452
381
|
fieldValue.$ne = JSON.stringify([fieldValue.$ne]);
|
|
@@ -474,7 +403,6 @@ const buildWhereClause = ({
|
|
|
474
403
|
}
|
|
475
404
|
}
|
|
476
405
|
}
|
|
477
|
-
|
|
478
406
|
if (fieldValue.$ne.__type === 'GeoPoint') {
|
|
479
407
|
const point = fieldValue.$ne;
|
|
480
408
|
values.push(fieldName, point.longitude, point.latitude);
|
|
@@ -485,7 +413,6 @@ const buildWhereClause = ({
|
|
|
485
413
|
index += 2;
|
|
486
414
|
}
|
|
487
415
|
}
|
|
488
|
-
|
|
489
416
|
if (fieldValue.$eq !== undefined) {
|
|
490
417
|
if (fieldValue.$eq === null) {
|
|
491
418
|
patterns.push(`$${index}:name IS NULL`);
|
|
@@ -506,9 +433,7 @@ const buildWhereClause = ({
|
|
|
506
433
|
}
|
|
507
434
|
}
|
|
508
435
|
}
|
|
509
|
-
|
|
510
436
|
const isInOrNin = Array.isArray(fieldValue.$in) || Array.isArray(fieldValue.$nin);
|
|
511
|
-
|
|
512
437
|
if (Array.isArray(fieldValue.$in) && isArrayField && schema.fields[fieldName].contents && schema.fields[fieldName].contents.type === 'String') {
|
|
513
438
|
const inPatterns = [];
|
|
514
439
|
let allowNull = false;
|
|
@@ -521,18 +446,15 @@ const buildWhereClause = ({
|
|
|
521
446
|
inPatterns.push(`$${index + 1 + listIndex - (allowNull ? 1 : 0)}`);
|
|
522
447
|
}
|
|
523
448
|
});
|
|
524
|
-
|
|
525
449
|
if (allowNull) {
|
|
526
450
|
patterns.push(`($${index}:name IS NULL OR $${index}:name && ARRAY[${inPatterns.join()}])`);
|
|
527
451
|
} else {
|
|
528
452
|
patterns.push(`$${index}:name && ARRAY[${inPatterns.join()}]`);
|
|
529
453
|
}
|
|
530
|
-
|
|
531
454
|
index = index + 1 + inPatterns.length;
|
|
532
455
|
} else if (isInOrNin) {
|
|
533
456
|
var createConstraint = (baseArray, notIn) => {
|
|
534
457
|
const not = notIn ? ' NOT ' : '';
|
|
535
|
-
|
|
536
458
|
if (baseArray.length > 0) {
|
|
537
459
|
if (isArrayField) {
|
|
538
460
|
patterns.push(`${not} array_contains($${index}:name, $${index + 1})`);
|
|
@@ -543,7 +465,6 @@ const buildWhereClause = ({
|
|
|
543
465
|
if (fieldName.indexOf('.') >= 0) {
|
|
544
466
|
return;
|
|
545
467
|
}
|
|
546
|
-
|
|
547
468
|
const inPatterns = [];
|
|
548
469
|
values.push(fieldName);
|
|
549
470
|
baseArray.forEach((listElem, listIndex) => {
|
|
@@ -572,7 +493,6 @@ const buildWhereClause = ({
|
|
|
572
493
|
if (fieldValue.$in) {
|
|
573
494
|
createConstraint(_lodash.default.flatMap(fieldValue.$in, elt => elt), false);
|
|
574
495
|
}
|
|
575
|
-
|
|
576
496
|
if (fieldValue.$nin) {
|
|
577
497
|
createConstraint(_lodash.default.flatMap(fieldValue.$nin, elt => elt), true);
|
|
578
498
|
}
|
|
@@ -581,23 +501,19 @@ const buildWhereClause = ({
|
|
|
581
501
|
} else if (typeof fieldValue.$nin !== 'undefined') {
|
|
582
502
|
throw new _node.default.Error(_node.default.Error.INVALID_JSON, 'bad $nin value');
|
|
583
503
|
}
|
|
584
|
-
|
|
585
504
|
if (Array.isArray(fieldValue.$all) && isArrayField) {
|
|
586
505
|
if (isAnyValueRegexStartsWith(fieldValue.$all)) {
|
|
587
506
|
if (!isAllValuesRegexOrNone(fieldValue.$all)) {
|
|
588
507
|
throw new _node.default.Error(_node.default.Error.INVALID_JSON, 'All $all values must be of regex type or none: ' + fieldValue.$all);
|
|
589
508
|
}
|
|
590
|
-
|
|
591
509
|
for (let i = 0; i < fieldValue.$all.length; i += 1) {
|
|
592
510
|
const value = processRegexPattern(fieldValue.$all[i].$regex);
|
|
593
511
|
fieldValue.$all[i] = value.substring(1) + '%';
|
|
594
512
|
}
|
|
595
|
-
|
|
596
513
|
patterns.push(`array_contains_all_regex($${index}:name, $${index + 1}::jsonb)`);
|
|
597
514
|
} else {
|
|
598
515
|
patterns.push(`array_contains_all($${index}:name, $${index + 1}::jsonb)`);
|
|
599
516
|
}
|
|
600
|
-
|
|
601
517
|
values.push(fieldName, JSON.stringify(fieldValue.$all));
|
|
602
518
|
index += 2;
|
|
603
519
|
} else if (Array.isArray(fieldValue.$all)) {
|
|
@@ -607,7 +523,6 @@ const buildWhereClause = ({
|
|
|
607
523
|
index += 2;
|
|
608
524
|
}
|
|
609
525
|
}
|
|
610
|
-
|
|
611
526
|
if (typeof fieldValue.$exists !== 'undefined') {
|
|
612
527
|
if (typeof fieldValue.$exists === 'object' && fieldValue.$exists.$relativeTime) {
|
|
613
528
|
throw new _node.default.Error(_node.default.Error.INVALID_JSON, '$relativeTime can only be used with the $lt, $lte, $gt, and $gte operators');
|
|
@@ -616,58 +531,46 @@ const buildWhereClause = ({
|
|
|
616
531
|
} else {
|
|
617
532
|
patterns.push(`$${index}:name IS NULL`);
|
|
618
533
|
}
|
|
619
|
-
|
|
620
534
|
values.push(fieldName);
|
|
621
535
|
index += 1;
|
|
622
536
|
}
|
|
623
|
-
|
|
624
537
|
if (fieldValue.$containedBy) {
|
|
625
538
|
const arr = fieldValue.$containedBy;
|
|
626
|
-
|
|
627
539
|
if (!(arr instanceof Array)) {
|
|
628
540
|
throw new _node.default.Error(_node.default.Error.INVALID_JSON, `bad $containedBy: should be an array`);
|
|
629
541
|
}
|
|
630
|
-
|
|
631
542
|
patterns.push(`$${index}:name <@ $${index + 1}::jsonb`);
|
|
632
543
|
values.push(fieldName, JSON.stringify(arr));
|
|
633
544
|
index += 2;
|
|
634
545
|
}
|
|
635
|
-
|
|
636
546
|
if (fieldValue.$text) {
|
|
637
547
|
const search = fieldValue.$text.$search;
|
|
638
548
|
let language = 'english';
|
|
639
|
-
|
|
640
549
|
if (typeof search !== 'object') {
|
|
641
550
|
throw new _node.default.Error(_node.default.Error.INVALID_JSON, `bad $text: $search, should be object`);
|
|
642
551
|
}
|
|
643
|
-
|
|
644
552
|
if (!search.$term || typeof search.$term !== 'string') {
|
|
645
553
|
throw new _node.default.Error(_node.default.Error.INVALID_JSON, `bad $text: $term, should be string`);
|
|
646
554
|
}
|
|
647
|
-
|
|
648
555
|
if (search.$language && typeof search.$language !== 'string') {
|
|
649
556
|
throw new _node.default.Error(_node.default.Error.INVALID_JSON, `bad $text: $language, should be string`);
|
|
650
557
|
} else if (search.$language) {
|
|
651
558
|
language = search.$language;
|
|
652
559
|
}
|
|
653
|
-
|
|
654
560
|
if (search.$caseSensitive && typeof search.$caseSensitive !== 'boolean') {
|
|
655
561
|
throw new _node.default.Error(_node.default.Error.INVALID_JSON, `bad $text: $caseSensitive, should be boolean`);
|
|
656
562
|
} else if (search.$caseSensitive) {
|
|
657
563
|
throw new _node.default.Error(_node.default.Error.INVALID_JSON, `bad $text: $caseSensitive not supported, please use $regex or create a separate lower case column.`);
|
|
658
564
|
}
|
|
659
|
-
|
|
660
565
|
if (search.$diacriticSensitive && typeof search.$diacriticSensitive !== 'boolean') {
|
|
661
566
|
throw new _node.default.Error(_node.default.Error.INVALID_JSON, `bad $text: $diacriticSensitive, should be boolean`);
|
|
662
567
|
} else if (search.$diacriticSensitive === false) {
|
|
663
568
|
throw new _node.default.Error(_node.default.Error.INVALID_JSON, `bad $text: $diacriticSensitive - false not supported, install Postgres Unaccent Extension`);
|
|
664
569
|
}
|
|
665
|
-
|
|
666
570
|
patterns.push(`to_tsvector($${index}, $${index + 1}:name) @@ to_tsquery($${index + 2}, $${index + 3})`);
|
|
667
571
|
values.push(language, fieldName, language, search.$term);
|
|
668
572
|
index += 4;
|
|
669
573
|
}
|
|
670
|
-
|
|
671
574
|
if (fieldValue.$nearSphere) {
|
|
672
575
|
const point = fieldValue.$nearSphere;
|
|
673
576
|
const distance = fieldValue.$maxDistance;
|
|
@@ -677,7 +580,6 @@ const buildWhereClause = ({
|
|
|
677
580
|
values.push(fieldName, point.longitude, point.latitude, distanceInKM);
|
|
678
581
|
index += 4;
|
|
679
582
|
}
|
|
680
|
-
|
|
681
583
|
if (fieldValue.$within && fieldValue.$within.$box) {
|
|
682
584
|
const box = fieldValue.$within.$box;
|
|
683
585
|
const left = box[0].longitude;
|
|
@@ -688,114 +590,90 @@ const buildWhereClause = ({
|
|
|
688
590
|
values.push(fieldName, `((${left}, ${bottom}), (${right}, ${top}))`);
|
|
689
591
|
index += 2;
|
|
690
592
|
}
|
|
691
|
-
|
|
692
593
|
if (fieldValue.$geoWithin && fieldValue.$geoWithin.$centerSphere) {
|
|
693
594
|
const centerSphere = fieldValue.$geoWithin.$centerSphere;
|
|
694
|
-
|
|
695
595
|
if (!(centerSphere instanceof Array) || centerSphere.length < 2) {
|
|
696
596
|
throw new _node.default.Error(_node.default.Error.INVALID_JSON, 'bad $geoWithin value; $centerSphere should be an array of Parse.GeoPoint and distance');
|
|
697
|
-
}
|
|
698
|
-
|
|
699
|
-
|
|
597
|
+
}
|
|
598
|
+
// Get point, convert to geo point if necessary and validate
|
|
700
599
|
let point = centerSphere[0];
|
|
701
|
-
|
|
702
600
|
if (point instanceof Array && point.length === 2) {
|
|
703
601
|
point = new _node.default.GeoPoint(point[1], point[0]);
|
|
704
602
|
} else if (!GeoPointCoder.isValidJSON(point)) {
|
|
705
603
|
throw new _node.default.Error(_node.default.Error.INVALID_JSON, 'bad $geoWithin value; $centerSphere geo point invalid');
|
|
706
604
|
}
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
605
|
+
_node.default.GeoPoint._validate(point.latitude, point.longitude);
|
|
606
|
+
// Get distance and validate
|
|
711
607
|
const distance = centerSphere[1];
|
|
712
|
-
|
|
713
608
|
if (isNaN(distance) || distance < 0) {
|
|
714
609
|
throw new _node.default.Error(_node.default.Error.INVALID_JSON, 'bad $geoWithin value; $centerSphere distance invalid');
|
|
715
610
|
}
|
|
716
|
-
|
|
717
611
|
const distanceInKM = distance * 6371 * 1000;
|
|
718
612
|
patterns.push(`ST_DistanceSphere($${index}:name::geometry, POINT($${index + 1}, $${index + 2})::geometry) <= $${index + 3}`);
|
|
719
613
|
values.push(fieldName, point.longitude, point.latitude, distanceInKM);
|
|
720
614
|
index += 4;
|
|
721
615
|
}
|
|
722
|
-
|
|
723
616
|
if (fieldValue.$geoWithin && fieldValue.$geoWithin.$polygon) {
|
|
724
617
|
const polygon = fieldValue.$geoWithin.$polygon;
|
|
725
618
|
let points;
|
|
726
|
-
|
|
727
619
|
if (typeof polygon === 'object' && polygon.__type === 'Polygon') {
|
|
728
620
|
if (!polygon.coordinates || polygon.coordinates.length < 3) {
|
|
729
621
|
throw new _node.default.Error(_node.default.Error.INVALID_JSON, 'bad $geoWithin value; Polygon.coordinates should contain at least 3 lon/lat pairs');
|
|
730
622
|
}
|
|
731
|
-
|
|
732
623
|
points = polygon.coordinates;
|
|
733
624
|
} else if (polygon instanceof Array) {
|
|
734
625
|
if (polygon.length < 3) {
|
|
735
626
|
throw new _node.default.Error(_node.default.Error.INVALID_JSON, 'bad $geoWithin value; $polygon should contain at least 3 GeoPoints');
|
|
736
627
|
}
|
|
737
|
-
|
|
738
628
|
points = polygon;
|
|
739
629
|
} else {
|
|
740
630
|
throw new _node.default.Error(_node.default.Error.INVALID_JSON, "bad $geoWithin value; $polygon should be Polygon object or Array of Parse.GeoPoint's");
|
|
741
631
|
}
|
|
742
|
-
|
|
743
632
|
points = points.map(point => {
|
|
744
633
|
if (point instanceof Array && point.length === 2) {
|
|
745
634
|
_node.default.GeoPoint._validate(point[1], point[0]);
|
|
746
|
-
|
|
747
635
|
return `(${point[0]}, ${point[1]})`;
|
|
748
636
|
}
|
|
749
|
-
|
|
750
637
|
if (typeof point !== 'object' || point.__type !== 'GeoPoint') {
|
|
751
638
|
throw new _node.default.Error(_node.default.Error.INVALID_JSON, 'bad $geoWithin value');
|
|
752
639
|
} else {
|
|
753
640
|
_node.default.GeoPoint._validate(point.latitude, point.longitude);
|
|
754
641
|
}
|
|
755
|
-
|
|
756
642
|
return `(${point.longitude}, ${point.latitude})`;
|
|
757
643
|
}).join(', ');
|
|
758
644
|
patterns.push(`$${index}:name::point <@ $${index + 1}::polygon`);
|
|
759
645
|
values.push(fieldName, `(${points})`);
|
|
760
646
|
index += 2;
|
|
761
647
|
}
|
|
762
|
-
|
|
763
648
|
if (fieldValue.$geoIntersects && fieldValue.$geoIntersects.$point) {
|
|
764
649
|
const point = fieldValue.$geoIntersects.$point;
|
|
765
|
-
|
|
766
650
|
if (typeof point !== 'object' || point.__type !== 'GeoPoint') {
|
|
767
651
|
throw new _node.default.Error(_node.default.Error.INVALID_JSON, 'bad $geoIntersect value; $point should be GeoPoint');
|
|
768
652
|
} else {
|
|
769
653
|
_node.default.GeoPoint._validate(point.latitude, point.longitude);
|
|
770
654
|
}
|
|
771
|
-
|
|
772
655
|
patterns.push(`$${index}:name::polygon @> $${index + 1}::point`);
|
|
773
656
|
values.push(fieldName, `(${point.longitude}, ${point.latitude})`);
|
|
774
657
|
index += 2;
|
|
775
658
|
}
|
|
776
|
-
|
|
777
659
|
if (fieldValue.$regex) {
|
|
778
660
|
let regex = fieldValue.$regex;
|
|
779
661
|
let operator = '~';
|
|
780
662
|
const opts = fieldValue.$options;
|
|
781
|
-
|
|
782
663
|
if (opts) {
|
|
783
664
|
if (opts.indexOf('i') >= 0) {
|
|
784
665
|
operator = '~*';
|
|
785
666
|
}
|
|
786
|
-
|
|
787
667
|
if (opts.indexOf('x') >= 0) {
|
|
788
668
|
regex = removeWhiteSpace(regex);
|
|
789
669
|
}
|
|
790
670
|
}
|
|
791
|
-
|
|
792
671
|
const name = transformDotField(fieldName);
|
|
793
672
|
regex = processRegexPattern(regex);
|
|
794
673
|
patterns.push(`$${index}:raw ${operator} '$${index + 1}:raw'`);
|
|
795
674
|
values.push(name, regex);
|
|
796
675
|
index += 2;
|
|
797
676
|
}
|
|
798
|
-
|
|
799
677
|
if (fieldValue.__type === 'Pointer') {
|
|
800
678
|
if (isArrayField) {
|
|
801
679
|
patterns.push(`array_contains($${index}:name, $${index + 1})`);
|
|
@@ -807,32 +685,27 @@ const buildWhereClause = ({
|
|
|
807
685
|
index += 2;
|
|
808
686
|
}
|
|
809
687
|
}
|
|
810
|
-
|
|
811
688
|
if (fieldValue.__type === 'Date') {
|
|
812
689
|
patterns.push(`$${index}:name = $${index + 1}`);
|
|
813
690
|
values.push(fieldName, fieldValue.iso);
|
|
814
691
|
index += 2;
|
|
815
692
|
}
|
|
816
|
-
|
|
817
693
|
if (fieldValue.__type === 'GeoPoint') {
|
|
818
694
|
patterns.push(`$${index}:name ~= POINT($${index + 1}, $${index + 2})`);
|
|
819
695
|
values.push(fieldName, fieldValue.longitude, fieldValue.latitude);
|
|
820
696
|
index += 3;
|
|
821
697
|
}
|
|
822
|
-
|
|
823
698
|
if (fieldValue.__type === 'Polygon') {
|
|
824
699
|
const value = convertPolygonToSQL(fieldValue.coordinates);
|
|
825
700
|
patterns.push(`$${index}:name ~= $${index + 1}::polygon`);
|
|
826
701
|
values.push(fieldName, value);
|
|
827
702
|
index += 2;
|
|
828
703
|
}
|
|
829
|
-
|
|
830
704
|
Object.keys(ParseToPosgresComparator).forEach(cmp => {
|
|
831
705
|
if (fieldValue[cmp] || fieldValue[cmp] === 0) {
|
|
832
706
|
const pgComparator = ParseToPosgresComparator[cmp];
|
|
833
707
|
let constraintFieldName;
|
|
834
708
|
let postgresValue = toPostgresValue(fieldValue[cmp]);
|
|
835
|
-
|
|
836
709
|
if (fieldName.indexOf('.') >= 0) {
|
|
837
710
|
const castType = toPostgresValueCastType(fieldValue[cmp]);
|
|
838
711
|
constraintFieldName = castType ? `CAST ((${transformDotField(fieldName)}) AS ${castType})` : transformDotField(fieldName);
|
|
@@ -841,9 +714,7 @@ const buildWhereClause = ({
|
|
|
841
714
|
if (schema.fields[fieldName].type !== 'Date') {
|
|
842
715
|
throw new _node.default.Error(_node.default.Error.INVALID_JSON, '$relativeTime can only be used with Date field');
|
|
843
716
|
}
|
|
844
|
-
|
|
845
717
|
const parserResult = Utils.relativeTimeToDate(postgresValue.$relativeTime);
|
|
846
|
-
|
|
847
718
|
if (parserResult.status === 'success') {
|
|
848
719
|
postgresValue = toPostgresValue(parserResult.result);
|
|
849
720
|
} else {
|
|
@@ -851,21 +722,17 @@ const buildWhereClause = ({
|
|
|
851
722
|
throw new _node.default.Error(_node.default.Error.INVALID_JSON, `bad $relativeTime (${postgresValue.$relativeTime}) value. ${parserResult.info}`);
|
|
852
723
|
}
|
|
853
724
|
}
|
|
854
|
-
|
|
855
725
|
constraintFieldName = `$${index++}:name`;
|
|
856
726
|
values.push(fieldName);
|
|
857
727
|
}
|
|
858
|
-
|
|
859
728
|
values.push(postgresValue);
|
|
860
729
|
patterns.push(`${constraintFieldName} ${pgComparator} $${index++}`);
|
|
861
730
|
}
|
|
862
731
|
});
|
|
863
|
-
|
|
864
732
|
if (initialPatternsLength === patterns.length) {
|
|
865
733
|
throw new _node.default.Error(_node.default.Error.OPERATION_FORBIDDEN, `Postgres doesn't support this query type yet ${JSON.stringify(fieldValue)}`);
|
|
866
734
|
}
|
|
867
735
|
}
|
|
868
|
-
|
|
869
736
|
values = values.map(transformValue);
|
|
870
737
|
return {
|
|
871
738
|
pattern: patterns.join(' AND '),
|
|
@@ -873,9 +740,9 @@ const buildWhereClause = ({
|
|
|
873
740
|
sorts
|
|
874
741
|
};
|
|
875
742
|
};
|
|
876
|
-
|
|
877
743
|
class PostgresStorageAdapter {
|
|
878
744
|
// Private
|
|
745
|
+
|
|
879
746
|
constructor({
|
|
880
747
|
uri,
|
|
881
748
|
collectionPrefix = '',
|
|
@@ -889,19 +756,16 @@ class PostgresStorageAdapter {
|
|
|
889
756
|
pgp
|
|
890
757
|
} = (0, _PostgresClient.createClient)(uri, databaseOptions);
|
|
891
758
|
this._client = client;
|
|
892
|
-
|
|
893
759
|
this._onchange = () => {};
|
|
894
|
-
|
|
895
760
|
this._pgp = pgp;
|
|
896
761
|
this._uuid = (0, _uuid.v4)();
|
|
897
762
|
this.canSortOnJoinTables = false;
|
|
898
763
|
}
|
|
899
|
-
|
|
900
764
|
watch(callback) {
|
|
901
765
|
this._onchange = callback;
|
|
902
|
-
}
|
|
903
|
-
|
|
766
|
+
}
|
|
904
767
|
|
|
768
|
+
//Note that analyze=true will run the query, executing INSERTS, DELETES, etc.
|
|
905
769
|
createExplainableQuery(query, analyze = false) {
|
|
906
770
|
if (analyze) {
|
|
907
771
|
return 'EXPLAIN (ANALYZE, FORMAT JSON) ' + query;
|
|
@@ -909,39 +773,30 @@ class PostgresStorageAdapter {
|
|
|
909
773
|
return 'EXPLAIN (FORMAT JSON) ' + query;
|
|
910
774
|
}
|
|
911
775
|
}
|
|
912
|
-
|
|
913
776
|
handleShutdown() {
|
|
914
777
|
if (this._stream) {
|
|
915
778
|
this._stream.done();
|
|
916
|
-
|
|
917
779
|
delete this._stream;
|
|
918
780
|
}
|
|
919
|
-
|
|
920
781
|
if (!this._client) {
|
|
921
782
|
return;
|
|
922
783
|
}
|
|
923
|
-
|
|
924
784
|
this._client.$pool.end();
|
|
925
785
|
}
|
|
926
|
-
|
|
927
786
|
async _listenToSchema() {
|
|
928
787
|
if (!this._stream && this.enableSchemaHooks) {
|
|
929
788
|
this._stream = await this._client.connect({
|
|
930
789
|
direct: true
|
|
931
790
|
});
|
|
932
|
-
|
|
933
791
|
this._stream.client.on('notification', data => {
|
|
934
792
|
const payload = JSON.parse(data.payload);
|
|
935
|
-
|
|
936
793
|
if (payload.senderId !== this._uuid) {
|
|
937
794
|
this._onchange();
|
|
938
795
|
}
|
|
939
796
|
});
|
|
940
|
-
|
|
941
797
|
await this._stream.none('LISTEN $1~', 'schema.change');
|
|
942
798
|
}
|
|
943
799
|
}
|
|
944
|
-
|
|
945
800
|
_notifySchemaChange() {
|
|
946
801
|
if (this._stream) {
|
|
947
802
|
this._stream.none('NOTIFY $1~, $2', ['schema.change', {
|
|
@@ -958,28 +813,22 @@ class PostgresStorageAdapter {
|
|
|
958
813
|
throw error;
|
|
959
814
|
});
|
|
960
815
|
}
|
|
961
|
-
|
|
962
816
|
async classExists(name) {
|
|
963
817
|
return this._client.one('SELECT EXISTS (SELECT 1 FROM information_schema.tables WHERE table_name = $1)', [name], a => a.exists);
|
|
964
818
|
}
|
|
965
|
-
|
|
966
819
|
async setClassLevelPermissions(className, CLPs) {
|
|
967
820
|
await this._client.task('set-class-level-permissions', async t => {
|
|
968
821
|
const values = [className, 'schema', 'classLevelPermissions', JSON.stringify(CLPs)];
|
|
969
822
|
await t.none(`UPDATE "_SCHEMA" SET $2:name = json_object_set_key($2:name, $3::text, $4::jsonb) WHERE "className" = $1`, values);
|
|
970
823
|
});
|
|
971
|
-
|
|
972
824
|
this._notifySchemaChange();
|
|
973
825
|
}
|
|
974
|
-
|
|
975
826
|
async setIndexesWithSchemaFormat(className, submittedIndexes, existingIndexes = {}, fields, conn) {
|
|
976
827
|
conn = conn || this._client;
|
|
977
828
|
const self = this;
|
|
978
|
-
|
|
979
829
|
if (submittedIndexes === undefined) {
|
|
980
830
|
return Promise.resolve();
|
|
981
831
|
}
|
|
982
|
-
|
|
983
832
|
if (Object.keys(existingIndexes).length === 0) {
|
|
984
833
|
existingIndexes = {
|
|
985
834
|
_id_: {
|
|
@@ -987,20 +836,16 @@ class PostgresStorageAdapter {
|
|
|
987
836
|
}
|
|
988
837
|
};
|
|
989
838
|
}
|
|
990
|
-
|
|
991
839
|
const deletedIndexes = [];
|
|
992
840
|
const insertedIndexes = [];
|
|
993
841
|
Object.keys(submittedIndexes).forEach(name => {
|
|
994
842
|
const field = submittedIndexes[name];
|
|
995
|
-
|
|
996
843
|
if (existingIndexes[name] && field.__op !== 'Delete') {
|
|
997
844
|
throw new _node.default.Error(_node.default.Error.INVALID_QUERY, `Index ${name} exists, cannot update.`);
|
|
998
845
|
}
|
|
999
|
-
|
|
1000
846
|
if (!existingIndexes[name] && field.__op === 'Delete') {
|
|
1001
847
|
throw new _node.default.Error(_node.default.Error.INVALID_QUERY, `Index ${name} does not exist, cannot delete.`);
|
|
1002
848
|
}
|
|
1003
|
-
|
|
1004
849
|
if (field.__op === 'Delete') {
|
|
1005
850
|
deletedIndexes.push(name);
|
|
1006
851
|
delete existingIndexes[name];
|
|
@@ -1021,17 +866,13 @@ class PostgresStorageAdapter {
|
|
|
1021
866
|
if (insertedIndexes.length > 0) {
|
|
1022
867
|
await self.createIndexes(className, insertedIndexes, t);
|
|
1023
868
|
}
|
|
1024
|
-
|
|
1025
869
|
if (deletedIndexes.length > 0) {
|
|
1026
870
|
await self.dropIndexes(className, deletedIndexes, t);
|
|
1027
871
|
}
|
|
1028
|
-
|
|
1029
872
|
await t.none('UPDATE "_SCHEMA" SET $2:name = json_object_set_key($2:name, $3::text, $4::jsonb) WHERE "className" = $1', [className, 'schema', 'indexes', JSON.stringify(existingIndexes)]);
|
|
1030
873
|
});
|
|
1031
|
-
|
|
1032
874
|
this._notifySchemaChange();
|
|
1033
875
|
}
|
|
1034
|
-
|
|
1035
876
|
async createClass(className, schema, conn) {
|
|
1036
877
|
conn = conn || this._client;
|
|
1037
878
|
const parseSchema = await conn.tx('create-class', async t => {
|
|
@@ -1046,23 +887,19 @@ class PostgresStorageAdapter {
|
|
|
1046
887
|
if (err.code === PostgresUniqueIndexViolationError && err.detail.includes(className)) {
|
|
1047
888
|
throw new _node.default.Error(_node.default.Error.DUPLICATE_VALUE, `Class ${className} already exists.`);
|
|
1048
889
|
}
|
|
1049
|
-
|
|
1050
890
|
throw err;
|
|
1051
891
|
});
|
|
1052
|
-
|
|
1053
892
|
this._notifySchemaChange();
|
|
1054
|
-
|
|
1055
893
|
return parseSchema;
|
|
1056
|
-
}
|
|
1057
|
-
|
|
894
|
+
}
|
|
1058
895
|
|
|
896
|
+
// Just create a table, do not insert in schema
|
|
1059
897
|
async createTable(className, schema, conn) {
|
|
1060
898
|
conn = conn || this._client;
|
|
1061
899
|
debug('createTable');
|
|
1062
900
|
const valuesArray = [];
|
|
1063
901
|
const patternsArray = [];
|
|
1064
902
|
const fields = Object.assign({}, schema.fields);
|
|
1065
|
-
|
|
1066
903
|
if (className === '_User') {
|
|
1067
904
|
fields._email_verify_token_expires_at = {
|
|
1068
905
|
type: 'Date'
|
|
@@ -1089,32 +926,27 @@ class PostgresStorageAdapter {
|
|
|
1089
926
|
type: 'Array'
|
|
1090
927
|
};
|
|
1091
928
|
}
|
|
1092
|
-
|
|
1093
929
|
let index = 2;
|
|
1094
930
|
const relations = [];
|
|
1095
931
|
Object.keys(fields).forEach(fieldName => {
|
|
1096
|
-
const parseType = fields[fieldName];
|
|
932
|
+
const parseType = fields[fieldName];
|
|
933
|
+
// Skip when it's a relation
|
|
1097
934
|
// We'll create the tables later
|
|
1098
|
-
|
|
1099
935
|
if (parseType.type === 'Relation') {
|
|
1100
936
|
relations.push(fieldName);
|
|
1101
937
|
return;
|
|
1102
938
|
}
|
|
1103
|
-
|
|
1104
939
|
if (['_rperm', '_wperm'].indexOf(fieldName) >= 0) {
|
|
1105
940
|
parseType.contents = {
|
|
1106
941
|
type: 'String'
|
|
1107
942
|
};
|
|
1108
943
|
}
|
|
1109
|
-
|
|
1110
944
|
valuesArray.push(fieldName);
|
|
1111
945
|
valuesArray.push(parseTypeToPostgresType(parseType));
|
|
1112
946
|
patternsArray.push(`$${index}:name $${index + 1}:raw`);
|
|
1113
|
-
|
|
1114
947
|
if (fieldName === 'objectId') {
|
|
1115
948
|
patternsArray.push(`PRIMARY KEY ($${index}:name)`);
|
|
1116
949
|
}
|
|
1117
|
-
|
|
1118
950
|
index = index + 2;
|
|
1119
951
|
});
|
|
1120
952
|
const qs = `CREATE TABLE IF NOT EXISTS $1:name (${patternsArray.join()})`;
|
|
@@ -1125,8 +957,8 @@ class PostgresStorageAdapter {
|
|
|
1125
957
|
} catch (error) {
|
|
1126
958
|
if (error.code !== PostgresDuplicateRelationError) {
|
|
1127
959
|
throw error;
|
|
1128
|
-
}
|
|
1129
|
-
|
|
960
|
+
}
|
|
961
|
+
// ELSE: Table already exists, must have been created by a different request. Ignore the error.
|
|
1130
962
|
}
|
|
1131
963
|
|
|
1132
964
|
await t.tx('create-table-tx', tx => {
|
|
@@ -1138,7 +970,6 @@ class PostgresStorageAdapter {
|
|
|
1138
970
|
});
|
|
1139
971
|
});
|
|
1140
972
|
}
|
|
1141
|
-
|
|
1142
973
|
async schemaUpgrade(className, schema, conn) {
|
|
1143
974
|
debug('schemaUpgrade');
|
|
1144
975
|
conn = conn || this._client;
|
|
@@ -1151,7 +982,6 @@ class PostgresStorageAdapter {
|
|
|
1151
982
|
await t.batch(newColumns);
|
|
1152
983
|
});
|
|
1153
984
|
}
|
|
1154
|
-
|
|
1155
985
|
async addFieldIfNotExists(className, fieldName, type) {
|
|
1156
986
|
// TODO: Must be revised for invalid logic...
|
|
1157
987
|
debug('addFieldIfNotExists');
|
|
@@ -1172,23 +1002,20 @@ class PostgresStorageAdapter {
|
|
|
1172
1002
|
}
|
|
1173
1003
|
}, t);
|
|
1174
1004
|
}
|
|
1175
|
-
|
|
1176
1005
|
if (error.code !== PostgresDuplicateColumnError) {
|
|
1177
1006
|
throw error;
|
|
1178
|
-
}
|
|
1179
|
-
|
|
1007
|
+
}
|
|
1008
|
+
// Column already exists, created by other request. Carry on to see if it's the right type.
|
|
1180
1009
|
}
|
|
1181
1010
|
} else {
|
|
1182
1011
|
await t.none('CREATE TABLE IF NOT EXISTS $<joinTable:name> ("relatedId" varChar(120), "owningId" varChar(120), PRIMARY KEY("relatedId", "owningId") )', {
|
|
1183
1012
|
joinTable: `_Join:${fieldName}:${className}`
|
|
1184
1013
|
});
|
|
1185
1014
|
}
|
|
1186
|
-
|
|
1187
1015
|
const result = await t.any('SELECT "schema" FROM "_SCHEMA" WHERE "className" = $<className> and ("schema"::json->\'fields\'->$<fieldName>) is not null', {
|
|
1188
1016
|
className,
|
|
1189
1017
|
fieldName
|
|
1190
1018
|
});
|
|
1191
|
-
|
|
1192
1019
|
if (result[0]) {
|
|
1193
1020
|
throw 'Attempted to add a field that already exists';
|
|
1194
1021
|
} else {
|
|
@@ -1200,10 +1027,8 @@ class PostgresStorageAdapter {
|
|
|
1200
1027
|
});
|
|
1201
1028
|
}
|
|
1202
1029
|
});
|
|
1203
|
-
|
|
1204
1030
|
this._notifySchemaChange();
|
|
1205
1031
|
}
|
|
1206
|
-
|
|
1207
1032
|
async updateFieldOptions(className, fieldName, type) {
|
|
1208
1033
|
await this._client.tx('update-schema-field-options', async t => {
|
|
1209
1034
|
const path = `{fields,${fieldName}}`;
|
|
@@ -1213,10 +1038,10 @@ class PostgresStorageAdapter {
|
|
|
1213
1038
|
className
|
|
1214
1039
|
});
|
|
1215
1040
|
});
|
|
1216
|
-
}
|
|
1217
|
-
// and resolves with false if it wasn't (eg. a join table). Rejects if deletion was impossible.
|
|
1218
|
-
|
|
1041
|
+
}
|
|
1219
1042
|
|
|
1043
|
+
// Drops a collection. Resolves with true if it was a Parse Schema (eg. _User, Custom, etc.)
|
|
1044
|
+
// and resolves with false if it wasn't (eg. a join table). Rejects if deletion was impossible.
|
|
1220
1045
|
async deleteClass(className) {
|
|
1221
1046
|
const operations = [{
|
|
1222
1047
|
query: `DROP TABLE IF EXISTS $1:name`,
|
|
@@ -1228,11 +1053,10 @@ class PostgresStorageAdapter {
|
|
|
1228
1053
|
const response = await this._client.tx(t => t.none(this._pgp.helpers.concat(operations))).then(() => className.indexOf('_Join:') != 0); // resolves with false when _Join table
|
|
1229
1054
|
|
|
1230
1055
|
this._notifySchemaChange();
|
|
1231
|
-
|
|
1232
1056
|
return response;
|
|
1233
|
-
}
|
|
1234
|
-
|
|
1057
|
+
}
|
|
1235
1058
|
|
|
1059
|
+
// Delete all data known to this adapter. Used for testing.
|
|
1236
1060
|
async deleteAllClasses() {
|
|
1237
1061
|
const now = new Date().getTime();
|
|
1238
1062
|
const helpers = this._pgp.helpers;
|
|
@@ -1254,34 +1078,34 @@ class PostgresStorageAdapter {
|
|
|
1254
1078
|
} catch (error) {
|
|
1255
1079
|
if (error.code !== PostgresRelationDoesNotExistError) {
|
|
1256
1080
|
throw error;
|
|
1257
|
-
}
|
|
1258
|
-
|
|
1081
|
+
}
|
|
1082
|
+
// No _SCHEMA collection. Don't delete anything.
|
|
1259
1083
|
}
|
|
1260
1084
|
}).then(() => {
|
|
1261
1085
|
debug(`deleteAllClasses done in ${new Date().getTime() - now}`);
|
|
1262
1086
|
});
|
|
1263
|
-
}
|
|
1087
|
+
}
|
|
1088
|
+
|
|
1089
|
+
// Remove the column and all the data. For Relations, the _Join collection is handled
|
|
1264
1090
|
// specially, this function does not delete _Join columns. It should, however, indicate
|
|
1265
1091
|
// that the relation fields does not exist anymore. In mongo, this means removing it from
|
|
1266
1092
|
// the _SCHEMA collection. There should be no actual data in the collection under the same name
|
|
1267
1093
|
// as the relation column, so it's fine to attempt to delete it. If the fields listed to be
|
|
1268
1094
|
// deleted do not exist, this function should return successfully anyways. Checking for
|
|
1269
1095
|
// attempts to delete non-existent fields is the responsibility of Parse Server.
|
|
1096
|
+
|
|
1270
1097
|
// This function is not obligated to delete fields atomically. It is given the field
|
|
1271
1098
|
// names in a list so that databases that are capable of deleting fields atomically
|
|
1272
1099
|
// may do so.
|
|
1273
|
-
// Returns a Promise.
|
|
1274
|
-
|
|
1275
1100
|
|
|
1101
|
+
// Returns a Promise.
|
|
1276
1102
|
async deleteFields(className, schema, fieldNames) {
|
|
1277
1103
|
debug('deleteFields');
|
|
1278
1104
|
fieldNames = fieldNames.reduce((list, fieldName) => {
|
|
1279
1105
|
const field = schema.fields[fieldName];
|
|
1280
|
-
|
|
1281
1106
|
if (field.type !== 'Relation') {
|
|
1282
1107
|
list.push(fieldName);
|
|
1283
1108
|
}
|
|
1284
|
-
|
|
1285
1109
|
delete schema.fields[fieldName];
|
|
1286
1110
|
return list;
|
|
1287
1111
|
}, []);
|
|
@@ -1294,29 +1118,27 @@ class PostgresStorageAdapter {
|
|
|
1294
1118
|
schema,
|
|
1295
1119
|
className
|
|
1296
1120
|
});
|
|
1297
|
-
|
|
1298
1121
|
if (values.length > 1) {
|
|
1299
1122
|
await t.none(`ALTER TABLE $1:name DROP COLUMN IF EXISTS ${columns}`, values);
|
|
1300
1123
|
}
|
|
1301
1124
|
});
|
|
1302
|
-
|
|
1303
1125
|
this._notifySchemaChange();
|
|
1304
|
-
}
|
|
1126
|
+
}
|
|
1127
|
+
|
|
1128
|
+
// Return a promise for all schemas known to this adapter, in Parse format. In case the
|
|
1305
1129
|
// schemas cannot be retrieved, returns a promise that rejects. Requirements for the
|
|
1306
1130
|
// rejection reason are TBD.
|
|
1307
|
-
|
|
1308
|
-
|
|
1309
1131
|
async getAllClasses() {
|
|
1310
1132
|
return this._client.task('get-all-classes', async t => {
|
|
1311
1133
|
return await t.map('SELECT * FROM "_SCHEMA"', null, row => toParseSchema(_objectSpread({
|
|
1312
1134
|
className: row.className
|
|
1313
1135
|
}, row.schema)));
|
|
1314
1136
|
});
|
|
1315
|
-
}
|
|
1137
|
+
}
|
|
1138
|
+
|
|
1139
|
+
// Return a promise for the schema with the given name, in Parse format. If
|
|
1316
1140
|
// this adapter doesn't know about the schema, return a promise that rejects with
|
|
1317
1141
|
// undefined as the reason.
|
|
1318
|
-
|
|
1319
|
-
|
|
1320
1142
|
async getClass(className) {
|
|
1321
1143
|
debug('getClass');
|
|
1322
1144
|
return this._client.any('SELECT * FROM "_SCHEMA" WHERE "className" = $<className>', {
|
|
@@ -1325,12 +1147,11 @@ class PostgresStorageAdapter {
|
|
|
1325
1147
|
if (result.length !== 1) {
|
|
1326
1148
|
throw undefined;
|
|
1327
1149
|
}
|
|
1328
|
-
|
|
1329
1150
|
return result[0].schema;
|
|
1330
1151
|
}).then(toParseSchema);
|
|
1331
|
-
}
|
|
1332
|
-
|
|
1152
|
+
}
|
|
1333
1153
|
|
|
1154
|
+
// TODO: remove the mongo format dependency in the return value
|
|
1334
1155
|
async createObject(className, schema, object, transactionalSession) {
|
|
1335
1156
|
debug('createObject');
|
|
1336
1157
|
let columnsArray = [];
|
|
@@ -1343,29 +1164,24 @@ class PostgresStorageAdapter {
|
|
|
1343
1164
|
if (object[fieldName] === null) {
|
|
1344
1165
|
return;
|
|
1345
1166
|
}
|
|
1346
|
-
|
|
1347
1167
|
var authDataMatch = fieldName.match(/^_auth_data_([a-zA-Z0-9_]+)$/);
|
|
1348
1168
|
const authDataAlreadyExists = !!object.authData;
|
|
1349
|
-
|
|
1350
1169
|
if (authDataMatch) {
|
|
1351
1170
|
var provider = authDataMatch[1];
|
|
1352
1171
|
object['authData'] = object['authData'] || {};
|
|
1353
1172
|
object['authData'][provider] = object[fieldName];
|
|
1354
1173
|
delete object[fieldName];
|
|
1355
|
-
fieldName = 'authData';
|
|
1356
|
-
|
|
1174
|
+
fieldName = 'authData';
|
|
1175
|
+
// Avoid adding authData multiple times to the query
|
|
1357
1176
|
if (authDataAlreadyExists) {
|
|
1358
1177
|
return;
|
|
1359
1178
|
}
|
|
1360
1179
|
}
|
|
1361
|
-
|
|
1362
1180
|
columnsArray.push(fieldName);
|
|
1363
|
-
|
|
1364
1181
|
if (!schema.fields[fieldName] && className === '_User') {
|
|
1365
1182
|
if (fieldName === '_email_verify_token' || fieldName === '_failed_login_count' || fieldName === '_perishable_token' || fieldName === '_password_history') {
|
|
1366
1183
|
valuesArray.push(object[fieldName]);
|
|
1367
1184
|
}
|
|
1368
|
-
|
|
1369
1185
|
if (fieldName === '_email_verify_token_expires_at') {
|
|
1370
1186
|
if (object[fieldName]) {
|
|
1371
1187
|
valuesArray.push(object[fieldName].iso);
|
|
@@ -1373,7 +1189,6 @@ class PostgresStorageAdapter {
|
|
|
1373
1189
|
valuesArray.push(null);
|
|
1374
1190
|
}
|
|
1375
1191
|
}
|
|
1376
|
-
|
|
1377
1192
|
if (fieldName === '_account_lockout_expires_at' || fieldName === '_perishable_token_expires_at' || fieldName === '_password_changed_at') {
|
|
1378
1193
|
if (object[fieldName]) {
|
|
1379
1194
|
valuesArray.push(object[fieldName].iso);
|
|
@@ -1381,10 +1196,8 @@ class PostgresStorageAdapter {
|
|
|
1381
1196
|
valuesArray.push(null);
|
|
1382
1197
|
}
|
|
1383
1198
|
}
|
|
1384
|
-
|
|
1385
1199
|
return;
|
|
1386
1200
|
}
|
|
1387
|
-
|
|
1388
1201
|
switch (schema.fields[fieldName].type) {
|
|
1389
1202
|
case 'Date':
|
|
1390
1203
|
if (object[fieldName]) {
|
|
@@ -1392,22 +1205,17 @@ class PostgresStorageAdapter {
|
|
|
1392
1205
|
} else {
|
|
1393
1206
|
valuesArray.push(null);
|
|
1394
1207
|
}
|
|
1395
|
-
|
|
1396
1208
|
break;
|
|
1397
|
-
|
|
1398
1209
|
case 'Pointer':
|
|
1399
1210
|
valuesArray.push(object[fieldName].objectId);
|
|
1400
1211
|
break;
|
|
1401
|
-
|
|
1402
1212
|
case 'Array':
|
|
1403
1213
|
if (['_rperm', '_wperm'].indexOf(fieldName) >= 0) {
|
|
1404
1214
|
valuesArray.push(object[fieldName]);
|
|
1405
1215
|
} else {
|
|
1406
1216
|
valuesArray.push(JSON.stringify(object[fieldName]));
|
|
1407
1217
|
}
|
|
1408
|
-
|
|
1409
1218
|
break;
|
|
1410
|
-
|
|
1411
1219
|
case 'Object':
|
|
1412
1220
|
case 'Bytes':
|
|
1413
1221
|
case 'String':
|
|
@@ -1415,24 +1223,20 @@ class PostgresStorageAdapter {
|
|
|
1415
1223
|
case 'Boolean':
|
|
1416
1224
|
valuesArray.push(object[fieldName]);
|
|
1417
1225
|
break;
|
|
1418
|
-
|
|
1419
1226
|
case 'File':
|
|
1420
1227
|
valuesArray.push(object[fieldName].name);
|
|
1421
1228
|
break;
|
|
1422
|
-
|
|
1423
1229
|
case 'Polygon':
|
|
1424
1230
|
{
|
|
1425
1231
|
const value = convertPolygonToSQL(object[fieldName].coordinates);
|
|
1426
1232
|
valuesArray.push(value);
|
|
1427
1233
|
break;
|
|
1428
1234
|
}
|
|
1429
|
-
|
|
1430
1235
|
case 'GeoPoint':
|
|
1431
1236
|
// pop the point and process later
|
|
1432
1237
|
geoPoints[fieldName] = object[fieldName];
|
|
1433
1238
|
columnsArray.pop();
|
|
1434
1239
|
break;
|
|
1435
|
-
|
|
1436
1240
|
default:
|
|
1437
1241
|
throw `Type ${schema.fields[fieldName].type} not supported yet`;
|
|
1438
1242
|
}
|
|
@@ -1441,13 +1245,11 @@ class PostgresStorageAdapter {
|
|
|
1441
1245
|
const initialValues = valuesArray.map((val, index) => {
|
|
1442
1246
|
let termination = '';
|
|
1443
1247
|
const fieldName = columnsArray[index];
|
|
1444
|
-
|
|
1445
1248
|
if (['_rperm', '_wperm'].indexOf(fieldName) >= 0) {
|
|
1446
1249
|
termination = '::text[]';
|
|
1447
1250
|
} else if (schema.fields[fieldName] && schema.fields[fieldName].type === 'Array') {
|
|
1448
1251
|
termination = '::jsonb';
|
|
1449
1252
|
}
|
|
1450
|
-
|
|
1451
1253
|
return `$${index + 2 + columnsArray.length}${termination}`;
|
|
1452
1254
|
});
|
|
1453
1255
|
const geoPointsInjects = Object.keys(geoPoints).map(key => {
|
|
@@ -1466,33 +1268,27 @@ class PostgresStorageAdapter {
|
|
|
1466
1268
|
if (error.code === PostgresUniqueIndexViolationError) {
|
|
1467
1269
|
const err = new _node.default.Error(_node.default.Error.DUPLICATE_VALUE, 'A duplicate value for a field with unique values was provided');
|
|
1468
1270
|
err.underlyingError = error;
|
|
1469
|
-
|
|
1470
1271
|
if (error.constraint) {
|
|
1471
1272
|
const matches = error.constraint.match(/unique_([a-zA-Z]+)/);
|
|
1472
|
-
|
|
1473
1273
|
if (matches && Array.isArray(matches)) {
|
|
1474
1274
|
err.userInfo = {
|
|
1475
1275
|
duplicated_field: matches[1]
|
|
1476
1276
|
};
|
|
1477
1277
|
}
|
|
1478
1278
|
}
|
|
1479
|
-
|
|
1480
1279
|
error = err;
|
|
1481
1280
|
}
|
|
1482
|
-
|
|
1483
1281
|
throw error;
|
|
1484
1282
|
});
|
|
1485
|
-
|
|
1486
1283
|
if (transactionalSession) {
|
|
1487
1284
|
transactionalSession.batch.push(promise);
|
|
1488
1285
|
}
|
|
1489
|
-
|
|
1490
1286
|
return promise;
|
|
1491
|
-
}
|
|
1287
|
+
}
|
|
1288
|
+
|
|
1289
|
+
// Remove all objects that match the given Parse Query.
|
|
1492
1290
|
// If no objects match, reject with OBJECT_NOT_FOUND. If objects are found and deleted, resolve with undefined.
|
|
1493
1291
|
// If there is some other error, reject with INTERNAL_SERVER_ERROR.
|
|
1494
|
-
|
|
1495
|
-
|
|
1496
1292
|
async deleteObjectsByQuery(className, schema, query, transactionalSession) {
|
|
1497
1293
|
debug('deleteObjectsByQuery');
|
|
1498
1294
|
const values = [className];
|
|
@@ -1504,11 +1300,9 @@ class PostgresStorageAdapter {
|
|
|
1504
1300
|
caseInsensitive: false
|
|
1505
1301
|
});
|
|
1506
1302
|
values.push(...where.values);
|
|
1507
|
-
|
|
1508
1303
|
if (Object.keys(query).length === 0) {
|
|
1509
1304
|
where.pattern = 'TRUE';
|
|
1510
1305
|
}
|
|
1511
|
-
|
|
1512
1306
|
const qs = `WITH deleted AS (DELETE FROM $1:name WHERE ${where.pattern} RETURNING *) SELECT count(*) FROM deleted`;
|
|
1513
1307
|
const promise = (transactionalSession ? transactionalSession.t : this._client).one(qs, values, a => +a.count).then(count => {
|
|
1514
1308
|
if (count === 0) {
|
|
@@ -1519,34 +1313,31 @@ class PostgresStorageAdapter {
|
|
|
1519
1313
|
}).catch(error => {
|
|
1520
1314
|
if (error.code !== PostgresRelationDoesNotExistError) {
|
|
1521
1315
|
throw error;
|
|
1522
|
-
}
|
|
1523
|
-
|
|
1316
|
+
}
|
|
1317
|
+
// ELSE: Don't delete anything if doesn't exist
|
|
1524
1318
|
});
|
|
1525
1319
|
|
|
1526
1320
|
if (transactionalSession) {
|
|
1527
1321
|
transactionalSession.batch.push(promise);
|
|
1528
1322
|
}
|
|
1529
|
-
|
|
1530
1323
|
return promise;
|
|
1531
|
-
}
|
|
1532
|
-
|
|
1533
|
-
|
|
1324
|
+
}
|
|
1325
|
+
// Return value not currently well specified.
|
|
1534
1326
|
async findOneAndUpdate(className, schema, query, update, transactionalSession) {
|
|
1535
1327
|
debug('findOneAndUpdate');
|
|
1536
1328
|
return this.updateObjectsByQuery(className, schema, query, update, transactionalSession).then(val => val[0]);
|
|
1537
|
-
}
|
|
1538
|
-
|
|
1329
|
+
}
|
|
1539
1330
|
|
|
1331
|
+
// Apply the update to all objects that match the given Parse Query.
|
|
1540
1332
|
async updateObjectsByQuery(className, schema, query, update, transactionalSession) {
|
|
1541
1333
|
debug('updateObjectsByQuery');
|
|
1542
1334
|
const updatePatterns = [];
|
|
1543
1335
|
const values = [className];
|
|
1544
1336
|
let index = 2;
|
|
1545
1337
|
schema = toPostgresSchema(schema);
|
|
1338
|
+
const originalUpdate = _objectSpread({}, update);
|
|
1546
1339
|
|
|
1547
|
-
|
|
1548
|
-
|
|
1549
|
-
|
|
1340
|
+
// Set flag for dot notation fields
|
|
1550
1341
|
const dotNotationOptions = {};
|
|
1551
1342
|
Object.keys(update).forEach(fieldName => {
|
|
1552
1343
|
if (fieldName.indexOf('.') > -1) {
|
|
@@ -1557,12 +1348,11 @@ class PostgresStorageAdapter {
|
|
|
1557
1348
|
dotNotationOptions[fieldName] = false;
|
|
1558
1349
|
}
|
|
1559
1350
|
});
|
|
1560
|
-
update = handleDotFields(update);
|
|
1351
|
+
update = handleDotFields(update);
|
|
1352
|
+
// Resolve authData first,
|
|
1561
1353
|
// So we don't end up with multiple key updates
|
|
1562
|
-
|
|
1563
1354
|
for (const fieldName in update) {
|
|
1564
1355
|
const authDataMatch = fieldName.match(/^_auth_data_([a-zA-Z0-9_]+)$/);
|
|
1565
|
-
|
|
1566
1356
|
if (authDataMatch) {
|
|
1567
1357
|
var provider = authDataMatch[1];
|
|
1568
1358
|
const value = update[fieldName];
|
|
@@ -1571,10 +1361,9 @@ class PostgresStorageAdapter {
|
|
|
1571
1361
|
update['authData'][provider] = value;
|
|
1572
1362
|
}
|
|
1573
1363
|
}
|
|
1574
|
-
|
|
1575
1364
|
for (const fieldName in update) {
|
|
1576
|
-
const fieldValue = update[fieldName];
|
|
1577
|
-
|
|
1365
|
+
const fieldValue = update[fieldName];
|
|
1366
|
+
// Drop any undefined values.
|
|
1578
1367
|
if (typeof fieldValue === 'undefined') {
|
|
1579
1368
|
delete update[fieldName];
|
|
1580
1369
|
} else if (fieldValue === null) {
|
|
@@ -1587,7 +1376,6 @@ class PostgresStorageAdapter {
|
|
|
1587
1376
|
const generate = (jsonb, key, value) => {
|
|
1588
1377
|
return `json_object_set_key(COALESCE(${jsonb}, '{}'::jsonb), ${key}, ${value})::jsonb`;
|
|
1589
1378
|
};
|
|
1590
|
-
|
|
1591
1379
|
const lastKey = `$${index}:name`;
|
|
1592
1380
|
const fieldNameIndex = index;
|
|
1593
1381
|
index += 1;
|
|
@@ -1596,7 +1384,6 @@ class PostgresStorageAdapter {
|
|
|
1596
1384
|
const str = generate(lastKey, `$${index}::text`, `$${index + 1}::jsonb`);
|
|
1597
1385
|
index += 2;
|
|
1598
1386
|
let value = fieldValue[key];
|
|
1599
|
-
|
|
1600
1387
|
if (value) {
|
|
1601
1388
|
if (value.__op === 'Delete') {
|
|
1602
1389
|
value = null;
|
|
@@ -1604,7 +1391,6 @@ class PostgresStorageAdapter {
|
|
|
1604
1391
|
value = JSON.stringify(value);
|
|
1605
1392
|
}
|
|
1606
1393
|
}
|
|
1607
|
-
|
|
1608
1394
|
values.push(key, value);
|
|
1609
1395
|
return str;
|
|
1610
1396
|
}, lastKey);
|
|
@@ -1667,7 +1453,8 @@ class PostgresStorageAdapter {
|
|
|
1667
1453
|
updatePatterns.push(`$${index}:name = $${index + 1}::polygon`);
|
|
1668
1454
|
values.push(fieldName, value);
|
|
1669
1455
|
index += 2;
|
|
1670
|
-
} else if (fieldValue.__type === 'Relation') {
|
|
1456
|
+
} else if (fieldValue.__type === 'Relation') {
|
|
1457
|
+
// noop
|
|
1671
1458
|
} else if (typeof fieldValue === 'number') {
|
|
1672
1459
|
updatePatterns.push(`$${index}:name = $${index + 1}`);
|
|
1673
1460
|
values.push(fieldName, fieldValue);
|
|
@@ -1683,18 +1470,16 @@ class PostgresStorageAdapter {
|
|
|
1683
1470
|
return value && value.__op === 'Increment' && k.split('.').length === 2 && k.split('.')[0] === fieldName;
|
|
1684
1471
|
}).map(k => k.split('.')[1]);
|
|
1685
1472
|
let incrementPatterns = '';
|
|
1686
|
-
|
|
1687
1473
|
if (keysToIncrement.length > 0) {
|
|
1688
1474
|
incrementPatterns = ' || ' + keysToIncrement.map(c => {
|
|
1689
1475
|
const amount = fieldValue[c].amount;
|
|
1690
1476
|
return `CONCAT('{"${c}":', COALESCE($${index}:name->>'${c}','0')::int + ${amount}, '}')::jsonb`;
|
|
1691
|
-
}).join(' || ');
|
|
1692
|
-
|
|
1477
|
+
}).join(' || ');
|
|
1478
|
+
// Strip the keys
|
|
1693
1479
|
keysToIncrement.forEach(key => {
|
|
1694
1480
|
delete fieldValue[key];
|
|
1695
1481
|
});
|
|
1696
1482
|
}
|
|
1697
|
-
|
|
1698
1483
|
const keysToDelete = Object.keys(originalUpdate).filter(k => {
|
|
1699
1484
|
// choose top level fields that have a delete operation set.
|
|
1700
1485
|
const value = originalUpdate[k];
|
|
@@ -1702,21 +1487,18 @@ class PostgresStorageAdapter {
|
|
|
1702
1487
|
}).map(k => k.split('.')[1]);
|
|
1703
1488
|
const deletePatterns = keysToDelete.reduce((p, c, i) => {
|
|
1704
1489
|
return p + ` - '$${index + 1 + i}:value'`;
|
|
1705
|
-
}, '');
|
|
1706
|
-
|
|
1490
|
+
}, '');
|
|
1491
|
+
// Override Object
|
|
1707
1492
|
let updateObject = "'{}'::jsonb";
|
|
1708
|
-
|
|
1709
1493
|
if (dotNotationOptions[fieldName]) {
|
|
1710
1494
|
// Merge Object
|
|
1711
1495
|
updateObject = `COALESCE($${index}:name, '{}'::jsonb)`;
|
|
1712
1496
|
}
|
|
1713
|
-
|
|
1714
1497
|
updatePatterns.push(`$${index}:name = (${updateObject} ${deletePatterns} ${incrementPatterns} || $${index + 1 + keysToDelete.length}::jsonb )`);
|
|
1715
1498
|
values.push(fieldName, ...keysToDelete, JSON.stringify(fieldValue));
|
|
1716
1499
|
index += 2 + keysToDelete.length;
|
|
1717
1500
|
} else if (Array.isArray(fieldValue) && schema.fields[fieldName] && schema.fields[fieldName].type === 'Array') {
|
|
1718
1501
|
const expectedType = parseTypeToPostgresType(schema.fields[fieldName]);
|
|
1719
|
-
|
|
1720
1502
|
if (expectedType === 'text[]') {
|
|
1721
1503
|
updatePatterns.push(`$${index}:name = $${index + 1}::text[]`);
|
|
1722
1504
|
values.push(fieldName, fieldValue);
|
|
@@ -1734,7 +1516,6 @@ class PostgresStorageAdapter {
|
|
|
1734
1516
|
return Promise.reject(new _node.default.Error(_node.default.Error.OPERATION_FORBIDDEN, `Postgres doesn't support update ${JSON.stringify(fieldValue)} yet`));
|
|
1735
1517
|
}
|
|
1736
1518
|
}
|
|
1737
|
-
|
|
1738
1519
|
const where = buildWhereClause({
|
|
1739
1520
|
schema,
|
|
1740
1521
|
index,
|
|
@@ -1745,15 +1526,13 @@ class PostgresStorageAdapter {
|
|
|
1745
1526
|
const whereClause = where.pattern.length > 0 ? `WHERE ${where.pattern}` : '';
|
|
1746
1527
|
const qs = `UPDATE $1:name SET ${updatePatterns.join()} ${whereClause} RETURNING *`;
|
|
1747
1528
|
const promise = (transactionalSession ? transactionalSession.t : this._client).any(qs, values);
|
|
1748
|
-
|
|
1749
1529
|
if (transactionalSession) {
|
|
1750
1530
|
transactionalSession.batch.push(promise);
|
|
1751
1531
|
}
|
|
1752
|
-
|
|
1753
1532
|
return promise;
|
|
1754
|
-
}
|
|
1755
|
-
|
|
1533
|
+
}
|
|
1756
1534
|
|
|
1535
|
+
// Hopefully, we can get rid of this. It's only used for config and hooks.
|
|
1757
1536
|
upsertOneObject(className, schema, query, update, transactionalSession) {
|
|
1758
1537
|
debug('upsertOneObject');
|
|
1759
1538
|
const createValue = Object.assign({}, query, update);
|
|
@@ -1762,11 +1541,9 @@ class PostgresStorageAdapter {
|
|
|
1762
1541
|
if (error.code !== _node.default.Error.DUPLICATE_VALUE) {
|
|
1763
1542
|
throw error;
|
|
1764
1543
|
}
|
|
1765
|
-
|
|
1766
1544
|
return this.findOneAndUpdate(className, schema, query, update, transactionalSession);
|
|
1767
1545
|
});
|
|
1768
1546
|
}
|
|
1769
|
-
|
|
1770
1547
|
find(className, schema, query, {
|
|
1771
1548
|
skip,
|
|
1772
1549
|
limit,
|
|
@@ -1788,39 +1565,30 @@ class PostgresStorageAdapter {
|
|
|
1788
1565
|
values.push(...where.values);
|
|
1789
1566
|
const wherePattern = where.pattern.length > 0 ? `WHERE ${where.pattern}` : '';
|
|
1790
1567
|
const limitPattern = hasLimit ? `LIMIT $${values.length + 1}` : '';
|
|
1791
|
-
|
|
1792
1568
|
if (hasLimit) {
|
|
1793
1569
|
values.push(limit);
|
|
1794
1570
|
}
|
|
1795
|
-
|
|
1796
1571
|
const skipPattern = hasSkip ? `OFFSET $${values.length + 1}` : '';
|
|
1797
|
-
|
|
1798
1572
|
if (hasSkip) {
|
|
1799
1573
|
values.push(skip);
|
|
1800
1574
|
}
|
|
1801
|
-
|
|
1802
1575
|
let sortPattern = '';
|
|
1803
|
-
|
|
1804
1576
|
if (sort) {
|
|
1805
1577
|
const sortCopy = sort;
|
|
1806
1578
|
const sorting = Object.keys(sort).map(key => {
|
|
1807
|
-
const transformKey = transformDotFieldToComponents(key).join('->');
|
|
1808
|
-
|
|
1579
|
+
const transformKey = transformDotFieldToComponents(key).join('->');
|
|
1580
|
+
// Using $idx pattern gives: non-integer constant in ORDER BY
|
|
1809
1581
|
if (sortCopy[key] === 1) {
|
|
1810
1582
|
return `${transformKey} ASC`;
|
|
1811
1583
|
}
|
|
1812
|
-
|
|
1813
1584
|
return `${transformKey} DESC`;
|
|
1814
1585
|
}).join();
|
|
1815
1586
|
sortPattern = sort !== undefined && Object.keys(sort).length > 0 ? `ORDER BY ${sorting}` : '';
|
|
1816
1587
|
}
|
|
1817
|
-
|
|
1818
1588
|
if (where.sorts && Object.keys(where.sorts).length > 0) {
|
|
1819
1589
|
sortPattern = `ORDER BY ${where.sorts.join()}`;
|
|
1820
1590
|
}
|
|
1821
|
-
|
|
1822
1591
|
let columns = '*';
|
|
1823
|
-
|
|
1824
1592
|
if (keys) {
|
|
1825
1593
|
// Exclude empty keys
|
|
1826
1594
|
// Replace ACL by it's keys
|
|
@@ -1828,22 +1596,23 @@ class PostgresStorageAdapter {
|
|
|
1828
1596
|
if (key === 'ACL') {
|
|
1829
1597
|
memo.push('_rperm');
|
|
1830
1598
|
memo.push('_wperm');
|
|
1831
|
-
} else if (key.length > 0 && (
|
|
1599
|
+
} else if (key.length > 0 && (
|
|
1600
|
+
// Remove selected field not referenced in the schema
|
|
1601
|
+
// Relation is not a column in postgres
|
|
1602
|
+
// $score is a Parse special field and is also not a column
|
|
1603
|
+
schema.fields[key] && schema.fields[key].type !== 'Relation' || key === '$score')) {
|
|
1832
1604
|
memo.push(key);
|
|
1833
1605
|
}
|
|
1834
|
-
|
|
1835
1606
|
return memo;
|
|
1836
1607
|
}, []);
|
|
1837
1608
|
columns = keys.map((key, index) => {
|
|
1838
1609
|
if (key === '$score') {
|
|
1839
1610
|
return `ts_rank_cd(to_tsvector($${2}, $${3}:name), to_tsquery($${4}, $${5}), 32) as score`;
|
|
1840
1611
|
}
|
|
1841
|
-
|
|
1842
1612
|
return `$${index + values.length + 1}:name`;
|
|
1843
1613
|
}).join();
|
|
1844
1614
|
values = values.concat(keys);
|
|
1845
1615
|
}
|
|
1846
|
-
|
|
1847
1616
|
const originalQuery = `SELECT ${columns} FROM $1:name ${wherePattern} ${sortPattern} ${limitPattern} ${skipPattern}`;
|
|
1848
1617
|
const qs = explain ? this.createExplainableQuery(originalQuery) : originalQuery;
|
|
1849
1618
|
return this._client.any(qs, values).catch(error => {
|
|
@@ -1851,19 +1620,17 @@ class PostgresStorageAdapter {
|
|
|
1851
1620
|
if (error.code !== PostgresRelationDoesNotExistError) {
|
|
1852
1621
|
throw error;
|
|
1853
1622
|
}
|
|
1854
|
-
|
|
1855
1623
|
return [];
|
|
1856
1624
|
}).then(results => {
|
|
1857
1625
|
if (explain) {
|
|
1858
1626
|
return results;
|
|
1859
1627
|
}
|
|
1860
|
-
|
|
1861
1628
|
return results.map(object => this.postgresObjectToParseObject(className, object, schema));
|
|
1862
1629
|
});
|
|
1863
|
-
}
|
|
1864
|
-
// Does not strip out anything based on a lack of authentication.
|
|
1865
|
-
|
|
1630
|
+
}
|
|
1866
1631
|
|
|
1632
|
+
// Converts from a postgres-format object to a REST-format object.
|
|
1633
|
+
// Does not strip out anything based on a lack of authentication.
|
|
1867
1634
|
postgresObjectToParseObject(className, object, schema) {
|
|
1868
1635
|
Object.keys(schema.fields).forEach(fieldName => {
|
|
1869
1636
|
if (schema.fields[fieldName].type === 'Pointer' && object[fieldName]) {
|
|
@@ -1873,14 +1640,12 @@ class PostgresStorageAdapter {
|
|
|
1873
1640
|
className: schema.fields[fieldName].targetClass
|
|
1874
1641
|
};
|
|
1875
1642
|
}
|
|
1876
|
-
|
|
1877
1643
|
if (schema.fields[fieldName].type === 'Relation') {
|
|
1878
1644
|
object[fieldName] = {
|
|
1879
1645
|
__type: 'Relation',
|
|
1880
1646
|
className: schema.fields[fieldName].targetClass
|
|
1881
1647
|
};
|
|
1882
1648
|
}
|
|
1883
|
-
|
|
1884
1649
|
if (object[fieldName] && schema.fields[fieldName].type === 'GeoPoint') {
|
|
1885
1650
|
object[fieldName] = {
|
|
1886
1651
|
__type: 'GeoPoint',
|
|
@@ -1888,7 +1653,6 @@ class PostgresStorageAdapter {
|
|
|
1888
1653
|
longitude: object[fieldName].x
|
|
1889
1654
|
};
|
|
1890
1655
|
}
|
|
1891
|
-
|
|
1892
1656
|
if (object[fieldName] && schema.fields[fieldName].type === 'Polygon') {
|
|
1893
1657
|
let coords = object[fieldName];
|
|
1894
1658
|
coords = coords.substr(2, coords.length - 4).split('),(');
|
|
@@ -1900,63 +1664,54 @@ class PostgresStorageAdapter {
|
|
|
1900
1664
|
coordinates: coords
|
|
1901
1665
|
};
|
|
1902
1666
|
}
|
|
1903
|
-
|
|
1904
1667
|
if (object[fieldName] && schema.fields[fieldName].type === 'File') {
|
|
1905
1668
|
object[fieldName] = {
|
|
1906
1669
|
__type: 'File',
|
|
1907
1670
|
name: object[fieldName]
|
|
1908
1671
|
};
|
|
1909
1672
|
}
|
|
1910
|
-
});
|
|
1911
|
-
|
|
1673
|
+
});
|
|
1674
|
+
//TODO: remove this reliance on the mongo format. DB adapter shouldn't know there is a difference between created at and any other date field.
|
|
1912
1675
|
if (object.createdAt) {
|
|
1913
1676
|
object.createdAt = object.createdAt.toISOString();
|
|
1914
1677
|
}
|
|
1915
|
-
|
|
1916
1678
|
if (object.updatedAt) {
|
|
1917
1679
|
object.updatedAt = object.updatedAt.toISOString();
|
|
1918
1680
|
}
|
|
1919
|
-
|
|
1920
1681
|
if (object.expiresAt) {
|
|
1921
1682
|
object.expiresAt = {
|
|
1922
1683
|
__type: 'Date',
|
|
1923
1684
|
iso: object.expiresAt.toISOString()
|
|
1924
1685
|
};
|
|
1925
1686
|
}
|
|
1926
|
-
|
|
1927
1687
|
if (object._email_verify_token_expires_at) {
|
|
1928
1688
|
object._email_verify_token_expires_at = {
|
|
1929
1689
|
__type: 'Date',
|
|
1930
1690
|
iso: object._email_verify_token_expires_at.toISOString()
|
|
1931
1691
|
};
|
|
1932
1692
|
}
|
|
1933
|
-
|
|
1934
1693
|
if (object._account_lockout_expires_at) {
|
|
1935
1694
|
object._account_lockout_expires_at = {
|
|
1936
1695
|
__type: 'Date',
|
|
1937
1696
|
iso: object._account_lockout_expires_at.toISOString()
|
|
1938
1697
|
};
|
|
1939
1698
|
}
|
|
1940
|
-
|
|
1941
1699
|
if (object._perishable_token_expires_at) {
|
|
1942
1700
|
object._perishable_token_expires_at = {
|
|
1943
1701
|
__type: 'Date',
|
|
1944
1702
|
iso: object._perishable_token_expires_at.toISOString()
|
|
1945
1703
|
};
|
|
1946
1704
|
}
|
|
1947
|
-
|
|
1948
1705
|
if (object._password_changed_at) {
|
|
1949
1706
|
object._password_changed_at = {
|
|
1950
1707
|
__type: 'Date',
|
|
1951
1708
|
iso: object._password_changed_at.toISOString()
|
|
1952
1709
|
};
|
|
1953
1710
|
}
|
|
1954
|
-
|
|
1955
1711
|
for (const fieldName in object) {
|
|
1956
1712
|
if (object[fieldName] === null) {
|
|
1957
1713
|
delete object[fieldName];
|
|
1958
1714
|
}
|
|
1959
|
-
|
|
1960
1715
|
if (object[fieldName] instanceof Date) {
|
|
1961
1716
|
object[fieldName] = {
|
|
1962
1717
|
__type: 'Date',
|
|
@@ -1964,21 +1719,21 @@ class PostgresStorageAdapter {
|
|
|
1964
1719
|
};
|
|
1965
1720
|
}
|
|
1966
1721
|
}
|
|
1967
|
-
|
|
1968
1722
|
return object;
|
|
1969
|
-
}
|
|
1723
|
+
}
|
|
1724
|
+
|
|
1725
|
+
// Create a unique index. Unique indexes on nullable fields are not allowed. Since we don't
|
|
1970
1726
|
// currently know which fields are nullable and which aren't, we ignore that criteria.
|
|
1971
1727
|
// As such, we shouldn't expose this function to users of parse until we have an out-of-band
|
|
1972
1728
|
// Way of determining if a field is nullable. Undefined doesn't count against uniqueness,
|
|
1973
1729
|
// which is why we use sparse indexes.
|
|
1974
|
-
|
|
1975
|
-
|
|
1976
1730
|
async ensureUniqueness(className, schema, fieldNames) {
|
|
1977
1731
|
const constraintName = `${className}_unique_${fieldNames.sort().join('_')}`;
|
|
1978
1732
|
const constraintPatterns = fieldNames.map((fieldName, index) => `$${index + 3}:name`);
|
|
1979
1733
|
const qs = `CREATE UNIQUE INDEX IF NOT EXISTS $2:name ON $1:name(${constraintPatterns.join()})`;
|
|
1980
1734
|
return this._client.none(qs, [className, constraintName, ...fieldNames]).catch(error => {
|
|
1981
|
-
if (error.code === PostgresDuplicateRelationError && error.message.includes(constraintName)) {
|
|
1735
|
+
if (error.code === PostgresDuplicateRelationError && error.message.includes(constraintName)) {
|
|
1736
|
+
// Index already exists. Ignore error.
|
|
1982
1737
|
} else if (error.code === PostgresUniqueIndexViolationError && error.message.includes(constraintName)) {
|
|
1983
1738
|
// Cast the error into the proper parse error
|
|
1984
1739
|
throw new _node.default.Error(_node.default.Error.DUPLICATE_VALUE, 'A duplicate value for a field with unique values was provided');
|
|
@@ -1986,9 +1741,9 @@ class PostgresStorageAdapter {
|
|
|
1986
1741
|
throw error;
|
|
1987
1742
|
}
|
|
1988
1743
|
});
|
|
1989
|
-
}
|
|
1990
|
-
|
|
1744
|
+
}
|
|
1991
1745
|
|
|
1746
|
+
// Executes a count.
|
|
1992
1747
|
async count(className, schema, query, readPreference, estimate = true) {
|
|
1993
1748
|
debug('count');
|
|
1994
1749
|
const values = [className];
|
|
@@ -2001,13 +1756,11 @@ class PostgresStorageAdapter {
|
|
|
2001
1756
|
values.push(...where.values);
|
|
2002
1757
|
const wherePattern = where.pattern.length > 0 ? `WHERE ${where.pattern}` : '';
|
|
2003
1758
|
let qs = '';
|
|
2004
|
-
|
|
2005
1759
|
if (where.pattern.length > 0 || !estimate) {
|
|
2006
1760
|
qs = `SELECT count(*) FROM $1:name ${wherePattern}`;
|
|
2007
1761
|
} else {
|
|
2008
1762
|
qs = 'SELECT reltuples AS approximate_row_count FROM pg_class WHERE relname = $1';
|
|
2009
1763
|
}
|
|
2010
|
-
|
|
2011
1764
|
return this._client.one(qs, values, a => {
|
|
2012
1765
|
if (a.approximate_row_count == null || a.approximate_row_count == -1) {
|
|
2013
1766
|
return !isNaN(+a.count) ? +a.count : 0;
|
|
@@ -2018,22 +1771,18 @@ class PostgresStorageAdapter {
|
|
|
2018
1771
|
if (error.code !== PostgresRelationDoesNotExistError) {
|
|
2019
1772
|
throw error;
|
|
2020
1773
|
}
|
|
2021
|
-
|
|
2022
1774
|
return 0;
|
|
2023
1775
|
});
|
|
2024
1776
|
}
|
|
2025
|
-
|
|
2026
1777
|
async distinct(className, schema, query, fieldName) {
|
|
2027
1778
|
debug('distinct');
|
|
2028
1779
|
let field = fieldName;
|
|
2029
1780
|
let column = fieldName;
|
|
2030
1781
|
const isNested = fieldName.indexOf('.') >= 0;
|
|
2031
|
-
|
|
2032
1782
|
if (isNested) {
|
|
2033
1783
|
field = transformDotFieldToComponents(fieldName).join('->');
|
|
2034
1784
|
column = fieldName.split('.')[0];
|
|
2035
1785
|
}
|
|
2036
|
-
|
|
2037
1786
|
const isArrayField = schema.fields && schema.fields[fieldName] && schema.fields[fieldName].type === 'Array';
|
|
2038
1787
|
const isPointerField = schema.fields && schema.fields[fieldName] && schema.fields[fieldName].type === 'Pointer';
|
|
2039
1788
|
const values = [field, column, className];
|
|
@@ -2047,16 +1796,13 @@ class PostgresStorageAdapter {
|
|
|
2047
1796
|
const wherePattern = where.pattern.length > 0 ? `WHERE ${where.pattern}` : '';
|
|
2048
1797
|
const transformer = isArrayField ? 'jsonb_array_elements' : 'ON';
|
|
2049
1798
|
let qs = `SELECT DISTINCT ${transformer}($1:name) $2:name FROM $3:name ${wherePattern}`;
|
|
2050
|
-
|
|
2051
1799
|
if (isNested) {
|
|
2052
1800
|
qs = `SELECT DISTINCT ${transformer}($1:raw) $2:raw FROM $3:name ${wherePattern}`;
|
|
2053
1801
|
}
|
|
2054
|
-
|
|
2055
1802
|
return this._client.any(qs, values).catch(error => {
|
|
2056
1803
|
if (error.code === PostgresMissingColumnError) {
|
|
2057
1804
|
return [];
|
|
2058
1805
|
}
|
|
2059
|
-
|
|
2060
1806
|
throw error;
|
|
2061
1807
|
}).then(results => {
|
|
2062
1808
|
if (!isNested) {
|
|
@@ -2065,7 +1811,6 @@ class PostgresStorageAdapter {
|
|
|
2065
1811
|
if (!isPointerField) {
|
|
2066
1812
|
return object[field];
|
|
2067
1813
|
}
|
|
2068
|
-
|
|
2069
1814
|
return {
|
|
2070
1815
|
__type: 'Pointer',
|
|
2071
1816
|
className: schema.fields[fieldName].targetClass,
|
|
@@ -2073,12 +1818,10 @@ class PostgresStorageAdapter {
|
|
|
2073
1818
|
};
|
|
2074
1819
|
});
|
|
2075
1820
|
}
|
|
2076
|
-
|
|
2077
1821
|
const child = fieldName.split('.')[1];
|
|
2078
1822
|
return results.map(object => object[column][child]);
|
|
2079
1823
|
}).then(results => results.map(object => this.postgresObjectToParseObject(className, object, schema)));
|
|
2080
1824
|
}
|
|
2081
|
-
|
|
2082
1825
|
async aggregate(className, schema, pipeline, readPreference, hint, explain) {
|
|
2083
1826
|
debug('aggregate');
|
|
2084
1827
|
const values = [className];
|
|
@@ -2091,18 +1834,14 @@ class PostgresStorageAdapter {
|
|
|
2091
1834
|
let skipPattern = '';
|
|
2092
1835
|
let sortPattern = '';
|
|
2093
1836
|
let groupPattern = '';
|
|
2094
|
-
|
|
2095
1837
|
for (let i = 0; i < pipeline.length; i += 1) {
|
|
2096
1838
|
const stage = pipeline[i];
|
|
2097
|
-
|
|
2098
1839
|
if (stage.$group) {
|
|
2099
1840
|
for (const field in stage.$group) {
|
|
2100
1841
|
const value = stage.$group[field];
|
|
2101
|
-
|
|
2102
1842
|
if (value === null || value === undefined) {
|
|
2103
1843
|
continue;
|
|
2104
1844
|
}
|
|
2105
|
-
|
|
2106
1845
|
if (field === '_id' && typeof value === 'string' && value !== '') {
|
|
2107
1846
|
columns.push(`$${index}:name AS "objectId"`);
|
|
2108
1847
|
groupPattern = `GROUP BY $${index}:name`;
|
|
@@ -2110,44 +1849,36 @@ class PostgresStorageAdapter {
|
|
|
2110
1849
|
index += 1;
|
|
2111
1850
|
continue;
|
|
2112
1851
|
}
|
|
2113
|
-
|
|
2114
1852
|
if (field === '_id' && typeof value === 'object' && Object.keys(value).length !== 0) {
|
|
2115
1853
|
groupValues = value;
|
|
2116
1854
|
const groupByFields = [];
|
|
2117
|
-
|
|
2118
1855
|
for (const alias in value) {
|
|
2119
1856
|
if (typeof value[alias] === 'string' && value[alias]) {
|
|
2120
1857
|
const source = transformAggregateField(value[alias]);
|
|
2121
|
-
|
|
2122
1858
|
if (!groupByFields.includes(`"${source}"`)) {
|
|
2123
1859
|
groupByFields.push(`"${source}"`);
|
|
2124
1860
|
}
|
|
2125
|
-
|
|
2126
1861
|
values.push(source, alias);
|
|
2127
1862
|
columns.push(`$${index}:name AS $${index + 1}:name`);
|
|
2128
1863
|
index += 2;
|
|
2129
1864
|
} else {
|
|
2130
1865
|
const operation = Object.keys(value[alias])[0];
|
|
2131
1866
|
const source = transformAggregateField(value[alias][operation]);
|
|
2132
|
-
|
|
2133
1867
|
if (mongoAggregateToPostgres[operation]) {
|
|
2134
1868
|
if (!groupByFields.includes(`"${source}"`)) {
|
|
2135
1869
|
groupByFields.push(`"${source}"`);
|
|
2136
1870
|
}
|
|
2137
|
-
|
|
2138
1871
|
columns.push(`EXTRACT(${mongoAggregateToPostgres[operation]} FROM $${index}:name AT TIME ZONE 'UTC')::integer AS $${index + 1}:name`);
|
|
2139
1872
|
values.push(source, alias);
|
|
2140
1873
|
index += 2;
|
|
2141
1874
|
}
|
|
2142
1875
|
}
|
|
2143
1876
|
}
|
|
2144
|
-
|
|
2145
1877
|
groupPattern = `GROUP BY $${index}:raw`;
|
|
2146
1878
|
values.push(groupByFields.join());
|
|
2147
1879
|
index += 1;
|
|
2148
1880
|
continue;
|
|
2149
1881
|
}
|
|
2150
|
-
|
|
2151
1882
|
if (typeof value === 'object') {
|
|
2152
1883
|
if (value.$sum) {
|
|
2153
1884
|
if (typeof value.$sum === 'string') {
|
|
@@ -2161,19 +1892,16 @@ class PostgresStorageAdapter {
|
|
|
2161
1892
|
index += 1;
|
|
2162
1893
|
}
|
|
2163
1894
|
}
|
|
2164
|
-
|
|
2165
1895
|
if (value.$max) {
|
|
2166
1896
|
columns.push(`MAX($${index}:name) AS $${index + 1}:name`);
|
|
2167
1897
|
values.push(transformAggregateField(value.$max), field);
|
|
2168
1898
|
index += 2;
|
|
2169
1899
|
}
|
|
2170
|
-
|
|
2171
1900
|
if (value.$min) {
|
|
2172
1901
|
columns.push(`MIN($${index}:name) AS $${index + 1}:name`);
|
|
2173
1902
|
values.push(transformAggregateField(value.$min), field);
|
|
2174
1903
|
index += 2;
|
|
2175
1904
|
}
|
|
2176
|
-
|
|
2177
1905
|
if (value.$avg) {
|
|
2178
1906
|
columns.push(`AVG($${index}:name) AS $${index + 1}:name`);
|
|
2179
1907
|
values.push(transformAggregateField(value.$avg), field);
|
|
@@ -2184,15 +1912,12 @@ class PostgresStorageAdapter {
|
|
|
2184
1912
|
} else {
|
|
2185
1913
|
columns.push('*');
|
|
2186
1914
|
}
|
|
2187
|
-
|
|
2188
1915
|
if (stage.$project) {
|
|
2189
1916
|
if (columns.includes('*')) {
|
|
2190
1917
|
columns = [];
|
|
2191
1918
|
}
|
|
2192
|
-
|
|
2193
1919
|
for (const field in stage.$project) {
|
|
2194
1920
|
const value = stage.$project[field];
|
|
2195
|
-
|
|
2196
1921
|
if (value === 1 || value === true) {
|
|
2197
1922
|
columns.push(`$${index}:name`);
|
|
2198
1923
|
values.push(field);
|
|
@@ -2200,11 +1925,9 @@ class PostgresStorageAdapter {
|
|
|
2200
1925
|
}
|
|
2201
1926
|
}
|
|
2202
1927
|
}
|
|
2203
|
-
|
|
2204
1928
|
if (stage.$match) {
|
|
2205
1929
|
const patterns = [];
|
|
2206
1930
|
const orOrAnd = Object.prototype.hasOwnProperty.call(stage.$match, '$or') ? ' OR ' : ' AND ';
|
|
2207
|
-
|
|
2208
1931
|
if (stage.$match.$or) {
|
|
2209
1932
|
const collapse = {};
|
|
2210
1933
|
stage.$match.$or.forEach(element => {
|
|
@@ -2214,9 +1937,11 @@ class PostgresStorageAdapter {
|
|
|
2214
1937
|
});
|
|
2215
1938
|
stage.$match = collapse;
|
|
2216
1939
|
}
|
|
2217
|
-
|
|
2218
|
-
for (const field in stage.$match) {
|
|
1940
|
+
for (let field in stage.$match) {
|
|
2219
1941
|
const value = stage.$match[field];
|
|
1942
|
+
if (field === '_id') {
|
|
1943
|
+
field = 'objectId';
|
|
1944
|
+
}
|
|
2220
1945
|
const matchPatterns = [];
|
|
2221
1946
|
Object.keys(ParseToPosgresComparator).forEach(cmp => {
|
|
2222
1947
|
if (value[cmp]) {
|
|
@@ -2226,33 +1951,27 @@ class PostgresStorageAdapter {
|
|
|
2226
1951
|
index += 2;
|
|
2227
1952
|
}
|
|
2228
1953
|
});
|
|
2229
|
-
|
|
2230
1954
|
if (matchPatterns.length > 0) {
|
|
2231
1955
|
patterns.push(`(${matchPatterns.join(' AND ')})`);
|
|
2232
1956
|
}
|
|
2233
|
-
|
|
2234
1957
|
if (schema.fields[field] && schema.fields[field].type && matchPatterns.length === 0) {
|
|
2235
1958
|
patterns.push(`$${index}:name = $${index + 1}`);
|
|
2236
1959
|
values.push(field, value);
|
|
2237
1960
|
index += 2;
|
|
2238
1961
|
}
|
|
2239
1962
|
}
|
|
2240
|
-
|
|
2241
1963
|
wherePattern = patterns.length > 0 ? `WHERE ${patterns.join(` ${orOrAnd} `)}` : '';
|
|
2242
1964
|
}
|
|
2243
|
-
|
|
2244
1965
|
if (stage.$limit) {
|
|
2245
1966
|
limitPattern = `LIMIT $${index}`;
|
|
2246
1967
|
values.push(stage.$limit);
|
|
2247
1968
|
index += 1;
|
|
2248
1969
|
}
|
|
2249
|
-
|
|
2250
1970
|
if (stage.$skip) {
|
|
2251
1971
|
skipPattern = `OFFSET $${index}`;
|
|
2252
1972
|
values.push(stage.$skip);
|
|
2253
1973
|
index += 1;
|
|
2254
1974
|
}
|
|
2255
|
-
|
|
2256
1975
|
if (stage.$sort) {
|
|
2257
1976
|
const sort = stage.$sort;
|
|
2258
1977
|
const keys = Object.keys(sort);
|
|
@@ -2266,7 +1985,6 @@ class PostgresStorageAdapter {
|
|
|
2266
1985
|
sortPattern = sort !== undefined && sorting.length > 0 ? `ORDER BY ${sorting}` : '';
|
|
2267
1986
|
}
|
|
2268
1987
|
}
|
|
2269
|
-
|
|
2270
1988
|
if (groupPattern) {
|
|
2271
1989
|
columns.forEach((e, i, a) => {
|
|
2272
1990
|
if (e && e.trim() === '*') {
|
|
@@ -2274,29 +1992,24 @@ class PostgresStorageAdapter {
|
|
|
2274
1992
|
}
|
|
2275
1993
|
});
|
|
2276
1994
|
}
|
|
2277
|
-
|
|
2278
1995
|
const originalQuery = `SELECT ${columns.filter(Boolean).join()} FROM $1:name ${wherePattern} ${skipPattern} ${groupPattern} ${sortPattern} ${limitPattern}`;
|
|
2279
1996
|
const qs = explain ? this.createExplainableQuery(originalQuery) : originalQuery;
|
|
2280
1997
|
return this._client.any(qs, values).then(a => {
|
|
2281
1998
|
if (explain) {
|
|
2282
1999
|
return a;
|
|
2283
2000
|
}
|
|
2284
|
-
|
|
2285
2001
|
const results = a.map(object => this.postgresObjectToParseObject(className, object, schema));
|
|
2286
2002
|
results.forEach(result => {
|
|
2287
2003
|
if (!Object.prototype.hasOwnProperty.call(result, 'objectId')) {
|
|
2288
2004
|
result.objectId = null;
|
|
2289
2005
|
}
|
|
2290
|
-
|
|
2291
2006
|
if (groupValues) {
|
|
2292
2007
|
result.objectId = {};
|
|
2293
|
-
|
|
2294
2008
|
for (const key in groupValues) {
|
|
2295
2009
|
result.objectId[key] = result[key];
|
|
2296
2010
|
delete result[key];
|
|
2297
2011
|
}
|
|
2298
2012
|
}
|
|
2299
|
-
|
|
2300
2013
|
if (countField) {
|
|
2301
2014
|
result[countField] = parseInt(result[countField], 10);
|
|
2302
2015
|
}
|
|
@@ -2304,7 +2017,6 @@ class PostgresStorageAdapter {
|
|
|
2304
2017
|
return results;
|
|
2305
2018
|
});
|
|
2306
2019
|
}
|
|
2307
|
-
|
|
2308
2020
|
async performInitialization({
|
|
2309
2021
|
VolatileClassesSchemas
|
|
2310
2022
|
}) {
|
|
@@ -2316,7 +2028,6 @@ class PostgresStorageAdapter {
|
|
|
2316
2028
|
if (err.code === PostgresDuplicateRelationError || err.code === _node.default.Error.INVALID_CLASS_NAME) {
|
|
2317
2029
|
return Promise.resolve();
|
|
2318
2030
|
}
|
|
2319
|
-
|
|
2320
2031
|
throw err;
|
|
2321
2032
|
}).then(() => this.schemaUpgrade(schema.className, schema));
|
|
2322
2033
|
});
|
|
@@ -2339,17 +2050,14 @@ class PostgresStorageAdapter {
|
|
|
2339
2050
|
console.error(error);
|
|
2340
2051
|
});
|
|
2341
2052
|
}
|
|
2342
|
-
|
|
2343
2053
|
async createIndexes(className, indexes, conn) {
|
|
2344
2054
|
return (conn || this._client).tx(t => t.batch(indexes.map(i => {
|
|
2345
2055
|
return t.none('CREATE INDEX IF NOT EXISTS $1:name ON $2:name ($3:name)', [i.name, className, i.key]);
|
|
2346
2056
|
})));
|
|
2347
2057
|
}
|
|
2348
|
-
|
|
2349
2058
|
async createIndexesIfNeeded(className, fieldName, type, conn) {
|
|
2350
2059
|
await (conn || this._client).none('CREATE INDEX IF NOT EXISTS $1:name ON $2:name ($3:name)', [fieldName, className, type]);
|
|
2351
2060
|
}
|
|
2352
|
-
|
|
2353
2061
|
async dropIndexes(className, indexes, conn) {
|
|
2354
2062
|
const queries = indexes.map(i => ({
|
|
2355
2063
|
query: 'DROP INDEX $1:name',
|
|
@@ -2357,23 +2065,20 @@ class PostgresStorageAdapter {
|
|
|
2357
2065
|
}));
|
|
2358
2066
|
await (conn || this._client).tx(t => t.none(this._pgp.helpers.concat(queries)));
|
|
2359
2067
|
}
|
|
2360
|
-
|
|
2361
2068
|
async getIndexes(className) {
|
|
2362
2069
|
const qs = 'SELECT * FROM pg_indexes WHERE tablename = ${className}';
|
|
2363
2070
|
return this._client.any(qs, {
|
|
2364
2071
|
className
|
|
2365
2072
|
});
|
|
2366
2073
|
}
|
|
2367
|
-
|
|
2368
2074
|
async updateSchemaWithIndexes() {
|
|
2369
2075
|
return Promise.resolve();
|
|
2370
|
-
}
|
|
2371
|
-
|
|
2076
|
+
}
|
|
2372
2077
|
|
|
2078
|
+
// Used for testing purposes
|
|
2373
2079
|
async updateEstimatedCount(className) {
|
|
2374
2080
|
return this._client.none('ANALYZE $1:name', [className]);
|
|
2375
2081
|
}
|
|
2376
|
-
|
|
2377
2082
|
async createTransactionalSession() {
|
|
2378
2083
|
return new Promise(resolve => {
|
|
2379
2084
|
const transactionalSession = {};
|
|
@@ -2388,19 +2093,16 @@ class PostgresStorageAdapter {
|
|
|
2388
2093
|
});
|
|
2389
2094
|
});
|
|
2390
2095
|
}
|
|
2391
|
-
|
|
2392
2096
|
commitTransactionalSession(transactionalSession) {
|
|
2393
2097
|
transactionalSession.resolve(transactionalSession.t.batch(transactionalSession.batch));
|
|
2394
2098
|
return transactionalSession.result;
|
|
2395
2099
|
}
|
|
2396
|
-
|
|
2397
2100
|
abortTransactionalSession(transactionalSession) {
|
|
2398
2101
|
const result = transactionalSession.result.catch();
|
|
2399
2102
|
transactionalSession.batch.push(Promise.reject());
|
|
2400
2103
|
transactionalSession.resolve(transactionalSession.t.batch(transactionalSession.batch));
|
|
2401
2104
|
return result;
|
|
2402
2105
|
}
|
|
2403
|
-
|
|
2404
2106
|
async ensureIndex(className, schema, fieldNames, indexName, caseInsensitive = false, options = {}) {
|
|
2405
2107
|
const conn = options.conn !== undefined ? options.conn : this._client;
|
|
2406
2108
|
const defaultIndexName = `parse_default_${fieldNames.sort().join('_')}`;
|
|
@@ -2412,13 +2114,12 @@ class PostgresStorageAdapter {
|
|
|
2412
2114
|
const constraintPatterns = caseInsensitive ? fieldNames.map((fieldName, index) => `lower($${index + 3}:name) varchar_pattern_ops`) : fieldNames.map((fieldName, index) => `$${index + 3}:name`);
|
|
2413
2115
|
const qs = `CREATE INDEX IF NOT EXISTS $1:name ON $2:name (${constraintPatterns.join()})`;
|
|
2414
2116
|
const setIdempotencyFunction = options.setIdempotencyFunction !== undefined ? options.setIdempotencyFunction : false;
|
|
2415
|
-
|
|
2416
2117
|
if (setIdempotencyFunction) {
|
|
2417
2118
|
await this.ensureIdempotencyFunctionExists(options);
|
|
2418
2119
|
}
|
|
2419
|
-
|
|
2420
2120
|
await conn.none(qs, [indexNameOptions.name, className, ...fieldNames]).catch(error => {
|
|
2421
|
-
if (error.code === PostgresDuplicateRelationError && error.message.includes(indexNameOptions.name)) {
|
|
2121
|
+
if (error.code === PostgresDuplicateRelationError && error.message.includes(indexNameOptions.name)) {
|
|
2122
|
+
// Index already exists. Ignore error.
|
|
2422
2123
|
} else if (error.code === PostgresUniqueIndexViolationError && error.message.includes(indexNameOptions.name)) {
|
|
2423
2124
|
// Cast the error into the proper parse error
|
|
2424
2125
|
throw new _node.default.Error(_node.default.Error.DUPLICATE_VALUE, 'A duplicate value for a field with unique values was provided');
|
|
@@ -2427,7 +2128,6 @@ class PostgresStorageAdapter {
|
|
|
2427
2128
|
}
|
|
2428
2129
|
});
|
|
2429
2130
|
}
|
|
2430
|
-
|
|
2431
2131
|
async deleteIdempotencyFunction(options = {}) {
|
|
2432
2132
|
const conn = options.conn !== undefined ? options.conn : this._client;
|
|
2433
2133
|
const qs = 'DROP FUNCTION IF EXISTS idempotency_delete_expired_records()';
|
|
@@ -2435,7 +2135,6 @@ class PostgresStorageAdapter {
|
|
|
2435
2135
|
throw error;
|
|
2436
2136
|
});
|
|
2437
2137
|
}
|
|
2438
|
-
|
|
2439
2138
|
async ensureIdempotencyFunctionExists(options = {}) {
|
|
2440
2139
|
const conn = options.conn !== undefined ? options.conn : this._client;
|
|
2441
2140
|
const ttlOptions = options.ttl !== undefined ? `${options.ttl} seconds` : '60 seconds';
|
|
@@ -2444,59 +2143,49 @@ class PostgresStorageAdapter {
|
|
|
2444
2143
|
throw error;
|
|
2445
2144
|
});
|
|
2446
2145
|
}
|
|
2447
|
-
|
|
2448
2146
|
}
|
|
2449
|
-
|
|
2450
2147
|
exports.PostgresStorageAdapter = PostgresStorageAdapter;
|
|
2451
|
-
|
|
2452
2148
|
function convertPolygonToSQL(polygon) {
|
|
2453
2149
|
if (polygon.length < 3) {
|
|
2454
2150
|
throw new _node.default.Error(_node.default.Error.INVALID_JSON, `Polygon must have at least 3 values`);
|
|
2455
2151
|
}
|
|
2456
|
-
|
|
2457
2152
|
if (polygon[0][0] !== polygon[polygon.length - 1][0] || polygon[0][1] !== polygon[polygon.length - 1][1]) {
|
|
2458
2153
|
polygon.push(polygon[0]);
|
|
2459
2154
|
}
|
|
2460
|
-
|
|
2461
2155
|
const unique = polygon.filter((item, index, ar) => {
|
|
2462
2156
|
let foundIndex = -1;
|
|
2463
|
-
|
|
2464
2157
|
for (let i = 0; i < ar.length; i += 1) {
|
|
2465
2158
|
const pt = ar[i];
|
|
2466
|
-
|
|
2467
2159
|
if (pt[0] === item[0] && pt[1] === item[1]) {
|
|
2468
2160
|
foundIndex = i;
|
|
2469
2161
|
break;
|
|
2470
2162
|
}
|
|
2471
2163
|
}
|
|
2472
|
-
|
|
2473
2164
|
return foundIndex === index;
|
|
2474
2165
|
});
|
|
2475
|
-
|
|
2476
2166
|
if (unique.length < 3) {
|
|
2477
2167
|
throw new _node.default.Error(_node.default.Error.INTERNAL_SERVER_ERROR, 'GeoJSON: Loop must have at least 3 different vertices');
|
|
2478
2168
|
}
|
|
2479
|
-
|
|
2480
2169
|
const points = polygon.map(point => {
|
|
2481
2170
|
_node.default.GeoPoint._validate(parseFloat(point[1]), parseFloat(point[0]));
|
|
2482
|
-
|
|
2483
2171
|
return `(${point[1]}, ${point[0]})`;
|
|
2484
2172
|
}).join(', ');
|
|
2485
2173
|
return `(${points})`;
|
|
2486
2174
|
}
|
|
2487
|
-
|
|
2488
2175
|
function removeWhiteSpace(regex) {
|
|
2489
2176
|
if (!regex.endsWith('\n')) {
|
|
2490
2177
|
regex += '\n';
|
|
2491
|
-
}
|
|
2492
|
-
|
|
2178
|
+
}
|
|
2493
2179
|
|
|
2494
|
-
|
|
2495
|
-
.replace(
|
|
2496
|
-
|
|
2180
|
+
// remove non escaped comments
|
|
2181
|
+
return regex.replace(/([^\\])#.*\n/gim, '$1')
|
|
2182
|
+
// remove lines starting with a comment
|
|
2183
|
+
.replace(/^#.*\n/gim, '')
|
|
2184
|
+
// remove non escaped whitespace
|
|
2185
|
+
.replace(/([^\\])\s+/gim, '$1')
|
|
2186
|
+
// remove whitespace at the beginning of a line
|
|
2497
2187
|
.replace(/^\s+/, '').trim();
|
|
2498
2188
|
}
|
|
2499
|
-
|
|
2500
2189
|
function processRegexPattern(s) {
|
|
2501
2190
|
if (s && s.startsWith('^')) {
|
|
2502
2191
|
// regex for startsWith
|
|
@@ -2504,92 +2193,76 @@ function processRegexPattern(s) {
|
|
|
2504
2193
|
} else if (s && s.endsWith('$')) {
|
|
2505
2194
|
// regex for endsWith
|
|
2506
2195
|
return literalizeRegexPart(s.slice(0, s.length - 1)) + '$';
|
|
2507
|
-
}
|
|
2508
|
-
|
|
2196
|
+
}
|
|
2509
2197
|
|
|
2198
|
+
// regex for contains
|
|
2510
2199
|
return literalizeRegexPart(s);
|
|
2511
2200
|
}
|
|
2512
|
-
|
|
2513
2201
|
function isStartsWithRegex(value) {
|
|
2514
2202
|
if (!value || typeof value !== 'string' || !value.startsWith('^')) {
|
|
2515
2203
|
return false;
|
|
2516
2204
|
}
|
|
2517
|
-
|
|
2518
2205
|
const matches = value.match(/\^\\Q.*\\E/);
|
|
2519
2206
|
return !!matches;
|
|
2520
2207
|
}
|
|
2521
|
-
|
|
2522
2208
|
function isAllValuesRegexOrNone(values) {
|
|
2523
2209
|
if (!values || !Array.isArray(values) || values.length === 0) {
|
|
2524
2210
|
return true;
|
|
2525
2211
|
}
|
|
2526
|
-
|
|
2527
2212
|
const firstValuesIsRegex = isStartsWithRegex(values[0].$regex);
|
|
2528
|
-
|
|
2529
2213
|
if (values.length === 1) {
|
|
2530
2214
|
return firstValuesIsRegex;
|
|
2531
2215
|
}
|
|
2532
|
-
|
|
2533
2216
|
for (let i = 1, length = values.length; i < length; ++i) {
|
|
2534
2217
|
if (firstValuesIsRegex !== isStartsWithRegex(values[i].$regex)) {
|
|
2535
2218
|
return false;
|
|
2536
2219
|
}
|
|
2537
2220
|
}
|
|
2538
|
-
|
|
2539
2221
|
return true;
|
|
2540
2222
|
}
|
|
2541
|
-
|
|
2542
2223
|
function isAnyValueRegexStartsWith(values) {
|
|
2543
2224
|
return values.some(function (value) {
|
|
2544
2225
|
return isStartsWithRegex(value.$regex);
|
|
2545
2226
|
});
|
|
2546
2227
|
}
|
|
2547
|
-
|
|
2548
2228
|
function createLiteralRegex(remaining) {
|
|
2549
2229
|
return remaining.split('').map(c => {
|
|
2550
2230
|
const regex = RegExp('[0-9 ]|\\p{L}', 'u'); // Support all unicode letter chars
|
|
2551
|
-
|
|
2552
2231
|
if (c.match(regex) !== null) {
|
|
2553
2232
|
// don't escape alphanumeric characters
|
|
2554
2233
|
return c;
|
|
2555
|
-
}
|
|
2556
|
-
|
|
2557
|
-
|
|
2234
|
+
}
|
|
2235
|
+
// escape everything else (single quotes with single quotes, everything else with a backslash)
|
|
2558
2236
|
return c === `'` ? `''` : `\\${c}`;
|
|
2559
2237
|
}).join('');
|
|
2560
2238
|
}
|
|
2561
|
-
|
|
2562
2239
|
function literalizeRegexPart(s) {
|
|
2563
2240
|
const matcher1 = /\\Q((?!\\E).*)\\E$/;
|
|
2564
2241
|
const result1 = s.match(matcher1);
|
|
2565
|
-
|
|
2566
2242
|
if (result1 && result1.length > 1 && result1.index > -1) {
|
|
2567
2243
|
// process regex that has a beginning and an end specified for the literal text
|
|
2568
2244
|
const prefix = s.substr(0, result1.index);
|
|
2569
2245
|
const remaining = result1[1];
|
|
2570
2246
|
return literalizeRegexPart(prefix) + createLiteralRegex(remaining);
|
|
2571
|
-
}
|
|
2572
|
-
|
|
2247
|
+
}
|
|
2573
2248
|
|
|
2249
|
+
// process regex that has a beginning specified for the literal text
|
|
2574
2250
|
const matcher2 = /\\Q((?!\\E).*)$/;
|
|
2575
2251
|
const result2 = s.match(matcher2);
|
|
2576
|
-
|
|
2577
2252
|
if (result2 && result2.length > 1 && result2.index > -1) {
|
|
2578
2253
|
const prefix = s.substr(0, result2.index);
|
|
2579
2254
|
const remaining = result2[1];
|
|
2580
2255
|
return literalizeRegexPart(prefix) + createLiteralRegex(remaining);
|
|
2581
|
-
}
|
|
2582
|
-
|
|
2256
|
+
}
|
|
2583
2257
|
|
|
2258
|
+
// remove all instances of \Q and \E from the remaining text & escape single quotes
|
|
2584
2259
|
return s.replace(/([^\\])(\\E)/, '$1').replace(/([^\\])(\\Q)/, '$1').replace(/^\\E/, '').replace(/^\\Q/, '').replace(/([^'])'/, `$1''`).replace(/^'([^'])/, `''$1`);
|
|
2585
2260
|
}
|
|
2586
|
-
|
|
2587
2261
|
var GeoPointCoder = {
|
|
2588
2262
|
isValidJSON(value) {
|
|
2589
2263
|
return typeof value === 'object' && value !== null && value.__type === 'GeoPoint';
|
|
2590
2264
|
}
|
|
2591
|
-
|
|
2592
2265
|
};
|
|
2593
2266
|
var _default = PostgresStorageAdapter;
|
|
2594
2267
|
exports.default = _default;
|
|
2595
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9BZGFwdGVycy9TdG9yYWdlL1Bvc3RncmVzL1Bvc3RncmVzU3RvcmFnZUFkYXB0ZXIuanMiXSwibmFtZXMiOlsiVXRpbHMiLCJyZXF1aXJlIiwiUG9zdGdyZXNSZWxhdGlvbkRvZXNOb3RFeGlzdEVycm9yIiwiUG9zdGdyZXNEdXBsaWNhdGVSZWxhdGlvbkVycm9yIiwiUG9zdGdyZXNEdXBsaWNhdGVDb2x1bW5FcnJvciIsIlBvc3RncmVzTWlzc2luZ0NvbHVtbkVycm9yIiwiUG9zdGdyZXNVbmlxdWVJbmRleFZpb2xhdGlvbkVycm9yIiwibG9nZ2VyIiwiZGVidWciLCJhcmdzIiwiYXJndW1lbnRzIiwiY29uY2F0Iiwic2xpY2UiLCJsZW5ndGgiLCJsb2ciLCJnZXRMb2dnZXIiLCJhcHBseSIsInBhcnNlVHlwZVRvUG9zdGdyZXNUeXBlIiwidHlwZSIsImNvbnRlbnRzIiwiSlNPTiIsInN0cmluZ2lmeSIsIlBhcnNlVG9Qb3NncmVzQ29tcGFyYXRvciIsIiRndCIsIiRsdCIsIiRndGUiLCIkbHRlIiwibW9uZ29BZ2dyZWdhdGVUb1Bvc3RncmVzIiwiJGRheU9mTW9udGgiLCIkZGF5T2ZXZWVrIiwiJGRheU9mWWVhciIsIiRpc29EYXlPZldlZWsiLCIkaXNvV2Vla1llYXIiLCIkaG91ciIsIiRtaW51dGUiLCIkc2Vjb25kIiwiJG1pbGxpc2Vjb25kIiwiJG1vbnRoIiwiJHdlZWsiLCIkeWVhciIsInRvUG9zdGdyZXNWYWx1ZSIsInZhbHVlIiwiX190eXBlIiwiaXNvIiwibmFtZSIsInRvUG9zdGdyZXNWYWx1ZUNhc3RUeXBlIiwicG9zdGdyZXNWYWx1ZSIsImNhc3RUeXBlIiwidW5kZWZpbmVkIiwidHJhbnNmb3JtVmFsdWUiLCJvYmplY3RJZCIsImVtcHR5Q0xQUyIsIk9iamVjdCIsImZyZWV6ZSIsImZpbmQiLCJnZXQiLCJjb3VudCIsImNyZWF0ZSIsInVwZGF0ZSIsImRlbGV0ZSIsImFkZEZpZWxkIiwicHJvdGVjdGVkRmllbGRzIiwiZGVmYXVsdENMUFMiLCJ0b1BhcnNlU2NoZW1hIiwic2NoZW1hIiwiY2xhc3NOYW1lIiwiZmllbGRzIiwiX2hhc2hlZF9wYXNzd29yZCIsIl93cGVybSIsIl9ycGVybSIsImNscHMiLCJjbGFzc0xldmVsUGVybWlzc2lvbnMiLCJpbmRleGVzIiwidG9Qb3N0Z3Jlc1NjaGVtYSIsIl9wYXNzd29yZF9oaXN0b3J5IiwiaGFuZGxlRG90RmllbGRzIiwib2JqZWN0Iiwia2V5cyIsImZvckVhY2giLCJmaWVsZE5hbWUiLCJpbmRleE9mIiwiY29tcG9uZW50cyIsInNwbGl0IiwiZmlyc3QiLCJzaGlmdCIsImN1cnJlbnRPYmoiLCJuZXh0IiwiX19vcCIsInRyYW5zZm9ybURvdEZpZWxkVG9Db21wb25lbnRzIiwibWFwIiwiY21wdCIsImluZGV4IiwidHJhbnNmb3JtRG90RmllbGQiLCJqb2luIiwidHJhbnNmb3JtQWdncmVnYXRlRmllbGQiLCJzdWJzdHIiLCJ2YWxpZGF0ZUtleXMiLCJrZXkiLCJpbmNsdWRlcyIsIlBhcnNlIiwiRXJyb3IiLCJJTlZBTElEX05FU1RFRF9LRVkiLCJqb2luVGFibGVzRm9yU2NoZW1hIiwibGlzdCIsImZpZWxkIiwicHVzaCIsImJ1aWxkV2hlcmVDbGF1c2UiLCJxdWVyeSIsImNhc2VJbnNlbnNpdGl2ZSIsInBhdHRlcm5zIiwidmFsdWVzIiwic29ydHMiLCJpc0FycmF5RmllbGQiLCJpbml0aWFsUGF0dGVybnNMZW5ndGgiLCJmaWVsZFZhbHVlIiwiJGV4aXN0cyIsImF1dGhEYXRhTWF0Y2giLCJtYXRjaCIsIiRpbiIsIiRyZWdleCIsIk1BWF9JTlRfUExVU19PTkUiLCJjbGF1c2VzIiwiY2xhdXNlVmFsdWVzIiwic3ViUXVlcnkiLCJjbGF1c2UiLCJwYXR0ZXJuIiwib3JPckFuZCIsIm5vdCIsIiRuZSIsImNvbnN0cmFpbnRGaWVsZE5hbWUiLCIkcmVsYXRpdmVUaW1lIiwiSU5WQUxJRF9KU09OIiwicG9pbnQiLCJsb25naXR1ZGUiLCJsYXRpdHVkZSIsIiRlcSIsImlzSW5Pck5pbiIsIkFycmF5IiwiaXNBcnJheSIsIiRuaW4iLCJpblBhdHRlcm5zIiwiYWxsb3dOdWxsIiwibGlzdEVsZW0iLCJsaXN0SW5kZXgiLCJjcmVhdGVDb25zdHJhaW50IiwiYmFzZUFycmF5Iiwibm90SW4iLCJfIiwiZmxhdE1hcCIsImVsdCIsIiRhbGwiLCJpc0FueVZhbHVlUmVnZXhTdGFydHNXaXRoIiwiaXNBbGxWYWx1ZXNSZWdleE9yTm9uZSIsImkiLCJwcm9jZXNzUmVnZXhQYXR0ZXJuIiwic3Vic3RyaW5nIiwiJGNvbnRhaW5lZEJ5IiwiYXJyIiwiJHRleHQiLCJzZWFyY2giLCIkc2VhcmNoIiwibGFuZ3VhZ2UiLCIkdGVybSIsIiRsYW5ndWFnZSIsIiRjYXNlU2Vuc2l0aXZlIiwiJGRpYWNyaXRpY1NlbnNpdGl2ZSIsIiRuZWFyU3BoZXJlIiwiZGlzdGFuY2UiLCIkbWF4RGlzdGFuY2UiLCJkaXN0YW5jZUluS00iLCIkd2l0aGluIiwiJGJveCIsImJveCIsImxlZnQiLCJib3R0b20iLCJyaWdodCIsInRvcCIsIiRnZW9XaXRoaW4iLCIkY2VudGVyU3BoZXJlIiwiY2VudGVyU3BoZXJlIiwiR2VvUG9pbnQiLCJHZW9Qb2ludENvZGVyIiwiaXNWYWxpZEpTT04iLCJfdmFsaWRhdGUiLCJpc05hTiIsIiRwb2x5Z29uIiwicG9seWdvbiIsInBvaW50cyIsImNvb3JkaW5hdGVzIiwiJGdlb0ludGVyc2VjdHMiLCIkcG9pbnQiLCJyZWdleCIsIm9wZXJhdG9yIiwib3B0cyIsIiRvcHRpb25zIiwicmVtb3ZlV2hpdGVTcGFjZSIsImNvbnZlcnRQb2x5Z29uVG9TUUwiLCJjbXAiLCJwZ0NvbXBhcmF0b3IiLCJwYXJzZXJSZXN1bHQiLCJyZWxhdGl2ZVRpbWVUb0RhdGUiLCJzdGF0dXMiLCJyZXN1bHQiLCJjb25zb2xlIiwiZXJyb3IiLCJpbmZvIiwiT1BFUkFUSU9OX0ZPUkJJRERFTiIsIlBvc3RncmVzU3RvcmFnZUFkYXB0ZXIiLCJjb25zdHJ1Y3RvciIsInVyaSIsImNvbGxlY3Rpb25QcmVmaXgiLCJkYXRhYmFzZU9wdGlvbnMiLCJfY29sbGVjdGlvblByZWZpeCIsImVuYWJsZVNjaGVtYUhvb2tzIiwiY2xpZW50IiwicGdwIiwiX2NsaWVudCIsIl9vbmNoYW5nZSIsIl9wZ3AiLCJfdXVpZCIsImNhblNvcnRPbkpvaW5UYWJsZXMiLCJ3YXRjaCIsImNhbGxiYWNrIiwiY3JlYXRlRXhwbGFpbmFibGVRdWVyeSIsImFuYWx5emUiLCJoYW5kbGVTaHV0ZG93biIsIl9zdHJlYW0iLCJkb25lIiwiJHBvb2wiLCJlbmQiLCJfbGlzdGVuVG9TY2hlbWEiLCJjb25uZWN0IiwiZGlyZWN0Iiwib24iLCJkYXRhIiwicGF5bG9hZCIsInBhcnNlIiwic2VuZGVySWQiLCJub25lIiwiX25vdGlmeVNjaGVtYUNoYW5nZSIsImNhdGNoIiwiX2Vuc3VyZVNjaGVtYUNvbGxlY3Rpb25FeGlzdHMiLCJjb25uIiwiY2xhc3NFeGlzdHMiLCJvbmUiLCJhIiwiZXhpc3RzIiwic2V0Q2xhc3NMZXZlbFBlcm1pc3Npb25zIiwiQ0xQcyIsInRhc2siLCJ0Iiwic2V0SW5kZXhlc1dpdGhTY2hlbWFGb3JtYXQiLCJzdWJtaXR0ZWRJbmRleGVzIiwiZXhpc3RpbmdJbmRleGVzIiwic2VsZiIsIlByb21pc2UiLCJyZXNvbHZlIiwiX2lkXyIsIl9pZCIsImRlbGV0ZWRJbmRleGVzIiwiaW5zZXJ0ZWRJbmRleGVzIiwiSU5WQUxJRF9RVUVSWSIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsInR4IiwiY3JlYXRlSW5kZXhlcyIsImRyb3BJbmRleGVzIiwiY3JlYXRlQ2xhc3MiLCJwYXJzZVNjaGVtYSIsImNyZWF0ZVRhYmxlIiwiZXJyIiwiY29kZSIsImRldGFpbCIsIkRVUExJQ0FURV9WQUxVRSIsInZhbHVlc0FycmF5IiwicGF0dGVybnNBcnJheSIsImFzc2lnbiIsIl9lbWFpbF92ZXJpZnlfdG9rZW5fZXhwaXJlc19hdCIsIl9lbWFpbF92ZXJpZnlfdG9rZW4iLCJfYWNjb3VudF9sb2Nrb3V0X2V4cGlyZXNfYXQiLCJfZmFpbGVkX2xvZ2luX2NvdW50IiwiX3BlcmlzaGFibGVfdG9rZW4iLCJfcGVyaXNoYWJsZV90b2tlbl9leHBpcmVzX2F0IiwiX3Bhc3N3b3JkX2NoYW5nZWRfYXQiLCJyZWxhdGlvbnMiLCJwYXJzZVR5cGUiLCJxcyIsImJhdGNoIiwiam9pblRhYmxlIiwic2NoZW1hVXBncmFkZSIsImNvbHVtbnMiLCJjb2x1bW5fbmFtZSIsIm5ld0NvbHVtbnMiLCJmaWx0ZXIiLCJpdGVtIiwiYWRkRmllbGRJZk5vdEV4aXN0cyIsInBvc3RncmVzVHlwZSIsImFueSIsInBhdGgiLCJ1cGRhdGVGaWVsZE9wdGlvbnMiLCJkZWxldGVDbGFzcyIsIm9wZXJhdGlvbnMiLCJyZXNwb25zZSIsImhlbHBlcnMiLCJ0aGVuIiwiZGVsZXRlQWxsQ2xhc3NlcyIsIm5vdyIsIkRhdGUiLCJnZXRUaW1lIiwicmVzdWx0cyIsImpvaW5zIiwicmVkdWNlIiwiY2xhc3NlcyIsInF1ZXJpZXMiLCJkZWxldGVGaWVsZHMiLCJmaWVsZE5hbWVzIiwiaWR4IiwiZ2V0QWxsQ2xhc3NlcyIsInJvdyIsImdldENsYXNzIiwiY3JlYXRlT2JqZWN0IiwidHJhbnNhY3Rpb25hbFNlc3Npb24iLCJjb2x1bW5zQXJyYXkiLCJnZW9Qb2ludHMiLCJhdXRoRGF0YUFscmVhZHlFeGlzdHMiLCJhdXRoRGF0YSIsInByb3ZpZGVyIiwicG9wIiwiaW5pdGlhbFZhbHVlcyIsInZhbCIsInRlcm1pbmF0aW9uIiwiZ2VvUG9pbnRzSW5qZWN0cyIsImwiLCJjb2x1bW5zUGF0dGVybiIsImNvbCIsInZhbHVlc1BhdHRlcm4iLCJwcm9taXNlIiwib3BzIiwidW5kZXJseWluZ0Vycm9yIiwiY29uc3RyYWludCIsIm1hdGNoZXMiLCJ1c2VySW5mbyIsImR1cGxpY2F0ZWRfZmllbGQiLCJkZWxldGVPYmplY3RzQnlRdWVyeSIsIndoZXJlIiwiT0JKRUNUX05PVF9GT1VORCIsImZpbmRPbmVBbmRVcGRhdGUiLCJ1cGRhdGVPYmplY3RzQnlRdWVyeSIsInVwZGF0ZVBhdHRlcm5zIiwib3JpZ2luYWxVcGRhdGUiLCJkb3ROb3RhdGlvbk9wdGlvbnMiLCJnZW5lcmF0ZSIsImpzb25iIiwibGFzdEtleSIsImZpZWxkTmFtZUluZGV4Iiwic3RyIiwiYW1vdW50Iiwib2JqZWN0cyIsImtleXNUb0luY3JlbWVudCIsImsiLCJpbmNyZW1lbnRQYXR0ZXJucyIsImMiLCJrZXlzVG9EZWxldGUiLCJkZWxldGVQYXR0ZXJucyIsInAiLCJ1cGRhdGVPYmplY3QiLCJleHBlY3RlZFR5cGUiLCJyZWplY3QiLCJ3aGVyZUNsYXVzZSIsInVwc2VydE9uZU9iamVjdCIsImNyZWF0ZVZhbHVlIiwic2tpcCIsImxpbWl0Iiwic29ydCIsImV4cGxhaW4iLCJoYXNMaW1pdCIsImhhc1NraXAiLCJ3aGVyZVBhdHRlcm4iLCJsaW1pdFBhdHRlcm4iLCJza2lwUGF0dGVybiIsInNvcnRQYXR0ZXJuIiwic29ydENvcHkiLCJzb3J0aW5nIiwidHJhbnNmb3JtS2V5IiwibWVtbyIsIm9yaWdpbmFsUXVlcnkiLCJwb3N0Z3Jlc09iamVjdFRvUGFyc2VPYmplY3QiLCJ0YXJnZXRDbGFzcyIsInkiLCJ4IiwiY29vcmRzIiwicGFyc2VGbG9hdCIsImNyZWF0ZWRBdCIsInRvSVNPU3RyaW5nIiwidXBkYXRlZEF0IiwiZXhwaXJlc0F0IiwiZW5zdXJlVW5pcXVlbmVzcyIsImNvbnN0cmFpbnROYW1lIiwiY29uc3RyYWludFBhdHRlcm5zIiwibWVzc2FnZSIsInJlYWRQcmVmZXJlbmNlIiwiZXN0aW1hdGUiLCJhcHByb3hpbWF0ZV9yb3dfY291bnQiLCJkaXN0aW5jdCIsImNvbHVtbiIsImlzTmVzdGVkIiwiaXNQb2ludGVyRmllbGQiLCJ0cmFuc2Zvcm1lciIsImNoaWxkIiwiYWdncmVnYXRlIiwicGlwZWxpbmUiLCJoaW50IiwiY291bnRGaWVsZCIsImdyb3VwVmFsdWVzIiwiZ3JvdXBQYXR0ZXJuIiwic3RhZ2UiLCIkZ3JvdXAiLCJncm91cEJ5RmllbGRzIiwiYWxpYXMiLCJzb3VyY2UiLCJvcGVyYXRpb24iLCIkc3VtIiwiJG1heCIsIiRtaW4iLCIkYXZnIiwiJHByb2plY3QiLCIkbWF0Y2giLCIkb3IiLCJjb2xsYXBzZSIsImVsZW1lbnQiLCJtYXRjaFBhdHRlcm5zIiwiJGxpbWl0IiwiJHNraXAiLCIkc29ydCIsIm9yZGVyIiwiZSIsInRyaW0iLCJCb29sZWFuIiwicGFyc2VJbnQiLCJwZXJmb3JtSW5pdGlhbGl6YXRpb24iLCJWb2xhdGlsZUNsYXNzZXNTY2hlbWFzIiwicHJvbWlzZXMiLCJJTlZBTElEX0NMQVNTX05BTUUiLCJhbGwiLCJzcWwiLCJtaXNjIiwianNvbk9iamVjdFNldEtleXMiLCJhcnJheSIsImFkZCIsImFkZFVuaXF1ZSIsInJlbW92ZSIsImNvbnRhaW5zQWxsIiwiY29udGFpbnNBbGxSZWdleCIsImNvbnRhaW5zIiwiY3R4IiwiZHVyYXRpb24iLCJjcmVhdGVJbmRleGVzSWZOZWVkZWQiLCJnZXRJbmRleGVzIiwidXBkYXRlU2NoZW1hV2l0aEluZGV4ZXMiLCJ1cGRhdGVFc3RpbWF0ZWRDb3VudCIsImNyZWF0ZVRyYW5zYWN0aW9uYWxTZXNzaW9uIiwiY29tbWl0VHJhbnNhY3Rpb25hbFNlc3Npb24iLCJhYm9ydFRyYW5zYWN0aW9uYWxTZXNzaW9uIiwiZW5zdXJlSW5kZXgiLCJpbmRleE5hbWUiLCJvcHRpb25zIiwiZGVmYXVsdEluZGV4TmFtZSIsImluZGV4TmFtZU9wdGlvbnMiLCJzZXRJZGVtcG90ZW5jeUZ1bmN0aW9uIiwiZW5zdXJlSWRlbXBvdGVuY3lGdW5jdGlvbkV4aXN0cyIsImRlbGV0ZUlkZW1wb3RlbmN5RnVuY3Rpb24iLCJ0dGxPcHRpb25zIiwidHRsIiwidW5pcXVlIiwiYXIiLCJmb3VuZEluZGV4IiwicHQiLCJJTlRFUk5BTF9TRVJWRVJfRVJST1IiLCJlbmRzV2l0aCIsInJlcGxhY2UiLCJzIiwic3RhcnRzV2l0aCIsImxpdGVyYWxpemVSZWdleFBhcnQiLCJpc1N0YXJ0c1dpdGhSZWdleCIsImZpcnN0VmFsdWVzSXNSZWdleCIsInNvbWUiLCJjcmVhdGVMaXRlcmFsUmVnZXgiLCJyZW1haW5pbmciLCJSZWdFeHAiLCJtYXRjaGVyMSIsInJlc3VsdDEiLCJwcmVmaXgiLCJtYXRjaGVyMiIsInJlc3VsdDIiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFDQTs7QUFDQTs7Ozs7Ozs7OztBQUVBLE1BQU1BLEtBQUssR0FBR0MsT0FBTyxDQUFDLGdCQUFELENBQXJCOztBQUVBLE1BQU1DLGlDQUFpQyxHQUFHLE9BQTFDO0FBQ0EsTUFBTUMsOEJBQThCLEdBQUcsT0FBdkM7QUFDQSxNQUFNQyw0QkFBNEIsR0FBRyxPQUFyQztBQUNBLE1BQU1DLDBCQUEwQixHQUFHLE9BQW5DO0FBQ0EsTUFBTUMsaUNBQWlDLEdBQUcsT0FBMUM7O0FBQ0EsTUFBTUMsTUFBTSxHQUFHTixPQUFPLENBQUMsaUJBQUQsQ0FBdEI7O0FBRUEsTUFBTU8sS0FBSyxHQUFHLFVBQVUsR0FBR0MsSUFBYixFQUF3QjtBQUNwQ0EsRUFBQUEsSUFBSSxHQUFHLENBQUMsU0FBU0MsU0FBUyxDQUFDLENBQUQsQ0FBbkIsRUFBd0JDLE1BQXhCLENBQStCRixJQUFJLENBQUNHLEtBQUwsQ0FBVyxDQUFYLEVBQWNILElBQUksQ0FBQ0ksTUFBbkIsQ0FBL0IsQ0FBUDtBQUNBLFFBQU1DLEdBQUcsR0FBR1AsTUFBTSxDQUFDUSxTQUFQLEVBQVo7QUFDQUQsRUFBQUEsR0FBRyxDQUFDTixLQUFKLENBQVVRLEtBQVYsQ0FBZ0JGLEdBQWhCLEVBQXFCTCxJQUFyQjtBQUNELENBSkQ7O0FBTUEsTUFBTVEsdUJBQXVCLEdBQUdDLElBQUksSUFBSTtBQUN0QyxVQUFRQSxJQUFJLENBQUNBLElBQWI7QUFDRSxTQUFLLFFBQUw7QUFDRSxhQUFPLE1BQVA7O0FBQ0YsU0FBSyxNQUFMO0FBQ0UsYUFBTywwQkFBUDs7QUFDRixTQUFLLFFBQUw7QUFDRSxhQUFPLE9BQVA7O0FBQ0YsU0FBSyxNQUFMO0FBQ0UsYUFBTyxNQUFQOztBQUNGLFNBQUssU0FBTDtBQUNFLGFBQU8sU0FB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QixFQUdKQSxPQUhJLENBR0ksTUFISixFQUdZLEVBSFosRUFJSkEsT0FKSSxDQUlJLE1BSkosRUFJWSxFQUpaLEVBS0pBLE9BTEksQ0FLSSxTQUxKLEVBS2dCLE1BTGhCLEVBTUpBLE9BTkksQ0FNSSxVQU5KLEVBTWlCLE1BTmpCLENBQVA7QUFPRDs7QUFFRCxJQUFJM1MsYUFBYSxHQUFHO0FBQ2xCQyxFQUFBQSxXQUFXLENBQUM3SSxLQUFELEVBQVE7QUFDakIsV0FBTyxPQUFPQSxLQUFQLEtBQWlCLFFBQWpCLElBQTZCQSxLQUFLLEtBQUssSUFBdkMsSUFBK0NBLEtBQUssQ0FBQ0MsTUFBTixLQUFpQixVQUF2RTtBQUNEOztBQUhpQixDQUFwQjtlQU1lcUssc0IiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAZmxvd1xuaW1wb3J0IHsgY3JlYXRlQ2xpZW50IH0gZnJvbSAnLi9Qb3N0Z3Jlc0NsaWVudCc7XG4vLyBAZmxvdy1kaXNhYmxlLW5leHRcbmltcG9ydCBQYXJzZSBmcm9tICdwYXJzZS9ub2RlJztcbi8vIEBmbG93LWRpc2FibGUtbmV4dFxuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbi8vIEBmbG93LWRpc2FibGUtbmV4dFxuaW1wb3J0IHsgdjQgYXMgdXVpZHY0IH0gZnJvbSAndXVpZCc7XG5pbXBvcnQgc3FsIGZyb20gJy4vc3FsJztcbmltcG9ydCB7IFN0b3JhZ2VBZGFwdGVyIH0gZnJvbSAnLi4vU3RvcmFnZUFkYXB0ZXInO1xuaW1wb3J0IHR5cGUgeyBTY2hlbWFUeXBlLCBRdWVyeVR5cGUsIFF1ZXJ5T3B0aW9ucyB9IGZyb20gJy4uL1N0b3JhZ2VBZGFwdGVyJztcbmNvbnN0IFV0aWxzID0gcmVxdWlyZSgnLi4vLi4vLi4vVXRpbHMnKTtcblxuY29uc3QgUG9zdGdyZXNSZWxhdGlvbkRvZXNOb3RFeGlzdEVycm9yID0gJzQyUDAxJztcbmNvbnN0IFBvc3RncmVzRHVwbGljYXRlUmVsYXRpb25FcnJvciA9ICc0MlAwNyc7XG5jb25zdCBQb3N0Z3Jlc0R1cGxpY2F0ZUNvbHVtbkVycm9yID0gJzQyNzAxJztcbmNvbnN0IFBvc3RncmVzTWlzc2luZ0NvbHVtbkVycm9yID0gJzQyNzAzJztcbmNvbnN0IFBvc3RncmVzVW5pcXVlSW5kZXhWaW9sYXRpb25FcnJvciA9ICcyMzUwNSc7XG5jb25zdCBsb2dnZXIgPSByZXF1aXJlKCcuLi8uLi8uLi9sb2dnZXInKTtcblxuY29uc3QgZGVidWcgPSBmdW5jdGlvbiAoLi4uYXJnczogYW55KSB7XG4gIGFyZ3MgPSBbJ1BHOiAnICsgYXJndW1lbnRzWzBdXS5jb25jYXQoYXJncy5zbGljZSgxLCBhcmdzLmxlbmd0aCkpO1xuICBjb25zdCBsb2cgPSBsb2dnZXIuZ2V0TG9nZ2VyKCk7XG4gIGxvZy5kZWJ1Zy5hcHBseShsb2csIGFyZ3MpO1xufTtcblxuY29uc3QgcGFyc2VUeXBlVG9Qb3N0Z3Jlc1R5cGUgPSB0eXBlID0+IHtcbiAgc3dpdGNoICh0eXBlLnR5cGUpIHtcbiAgICBjYXNlICdTdHJpbmcnOlxuICAgICAgcmV0dXJuICd0ZXh0JztcbiAgICBjYXNlICdEYXRlJzpcbiAgICAgIHJldHVybiAndGltZXN0YW1wIHdpdGggdGltZSB6b25lJztcbiAgICBjYXNlICdPYmplY3QnOlxuICAgICAgcmV0dXJuICdqc29uYic7XG4gICAgY2FzZSAnRmlsZSc6XG4gICAgICByZXR1cm4gJ3RleHQnO1xuICAgIGNhc2UgJ0Jvb2xlYW4nOlxuICAgICAgcmV0dXJuICdib29sZWFuJztcbiAgICBjYXNlICdQb2ludGVyJzpcbiAgICAgIHJldHVybiAndGV4dCc7XG4gICAgY2FzZSAnTnVtYmVyJzpcbiAgICAgIHJldHVybiAnZG91YmxlIHByZWNpc2lvbic7XG4gICAgY2FzZSAnR2VvUG9pbnQnOlxuICAgICAgcmV0dXJuICdwb2ludCc7XG4gICAgY2FzZSAnQnl0ZXMnOlxuICAgICAgcmV0dXJuICdqc29uYic7XG4gICAgY2FzZSAnUG9seWdvbic6XG4gICAgICByZXR1cm4gJ3BvbHlnb24nO1xuICAgIGNhc2UgJ0FycmF5JzpcbiAgICAgIGlmICh0eXBlLmNvbnRlbnRzICYmIHR5cGUuY29udGVudHMudHlwZSA9PT0gJ1N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuICd0ZXh0W10nO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuICdqc29uYic7XG4gICAgICB9XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IGBubyB0eXBlIGZvciAke0pTT04uc3RyaW5naWZ5KHR5cGUpfSB5ZXRgO1xuICB9XG59O1xuXG5jb25zdCBQYXJzZVRvUG9zZ3Jlc0NvbXBhcmF0b3IgPSB7XG4gICRndDogJz4nLFxuICAkbHQ6ICc8JyxcbiAgJGd0ZTogJz49JyxcbiAgJGx0ZTogJzw9Jyxcbn07XG5cbmNvbnN0IG1vbmdvQWdncmVnYXRlVG9Qb3N0Z3JlcyA9IHtcbiAgJGRheU9mTW9udGg6ICdEQVknLFxuICAkZGF5T2ZXZWVrOiAnRE9XJyxcbiAgJGRheU9mWWVhcjogJ0RPWScsXG4gICRpc29EYXlPZldlZWs6ICdJU09ET1cnLFxuICAkaXNvV2Vla1llYXI6ICdJU09ZRUFSJyxcbiAgJGhvdXI6ICdIT1VSJyxcbiAgJG1pbnV0ZTogJ01JTlVURScsXG4gICRzZWNvbmQ6ICdTRUNPTkQnLFxuICAkbWlsbGlzZWNvbmQ6ICdNSUxMSVNFQ09ORFMnLFxuICAkbW9udGg6ICdNT05USCcsXG4gICR3ZWVrOiAnV0VFSycsXG4gICR5ZWFyOiAnWUVBUicsXG59O1xuXG5jb25zdCB0b1Bvc3RncmVzVmFsdWUgPSB2YWx1ZSA9PiB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgaWYgKHZhbHVlLl9fdHlwZSA9PT0gJ0RhdGUnKSB7XG4gICAgICByZXR1cm4gdmFsdWUuaXNvO1xuICAgIH1cbiAgICBpZiAodmFsdWUuX190eXBlID09PSAnRmlsZScpIHtcbiAgICAgIHJldHVybiB2YWx1ZS5uYW1lO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdmFsdWU7XG59O1xuXG5jb25zdCB0b1Bvc3RncmVzVmFsdWVDYXN0VHlwZSA9IHZhbHVlID0+IHtcbiAgY29uc3QgcG9zdGdyZXNWYWx1ZSA9IHRvUG9zdGdyZXNWYWx1ZSh2YWx1ZSk7XG4gIGxldCBjYXN0VHlwZTtcbiAgc3dpdGNoICh0eXBlb2YgcG9zdGdyZXNWYWx1ZSkge1xuICAgIGNhc2UgJ251bWJlcic6XG4gICAgICBjYXN0VHlwZSA9ICdkb3VibGUgcHJlY2lzaW9uJztcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgY2FzdFR5cGUgPSAnYm9vbGVhbic7XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgY2FzdFR5cGUgPSB1bmRlZmluZWQ7XG4gIH1cbiAgcmV0dXJuIGNhc3RUeXBlO1xufTtcblxuY29uc3QgdHJhbnNmb3JtVmFsdWUgPSB2YWx1ZSA9PiB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlLl9fdHlwZSA9PT0gJ1BvaW50ZXInKSB7XG4gICAgcmV0dXJuIHZhbHVlLm9iamVjdElkO1xuICB9XG4gIHJldHVybiB2YWx1ZTtcbn07XG5cbi8vIER1cGxpY2F0ZSBmcm9tIHRoZW4gbW9uZ28gYWRhcHRlci4uLlxuY29uc3QgZW1wdHlDTFBTID0gT2JqZWN0LmZyZWV6ZSh7XG4gIGZpbmQ6IHt9LFxuICBnZXQ6IHt9LFxuICBjb3VudDoge30sXG4gIGNyZWF0ZToge30sXG4gIHVwZGF0ZToge30sXG4gIGRlbGV0ZToge30sXG4gIGFkZEZpZWxkOiB7fSxcbiAgcHJvdGVjdGVkRmllbGRzOiB7fSxcbn0pO1xuXG5jb25zdCBkZWZhdWx0Q0xQUyA9IE9iamVjdC5mcmVlemUoe1xuICBmaW5kOiB7ICcqJzogdHJ1ZSB9LFxuICBnZXQ6IHsgJyonOiB0cnVlIH0sXG4gIGNvdW50OiB7ICcqJzogdHJ1ZSB9LFxuICBjcmVhdGU6IHsgJyonOiB0cnVlIH0sXG4gIHVwZGF0ZTogeyAnKic6IHRydWUgfSxcbiAgZGVsZXRlOiB7ICcqJzogdHJ1ZSB9LFxuICBhZGRGaWVsZDogeyAnKic6IHRydWUgfSxcbiAgcHJvdGVjdGVkRmllbGRzOiB7ICcqJzogW10gfSxcbn0pO1xuXG5jb25zdCB0b1BhcnNlU2NoZW1hID0gc2NoZW1hID0+IHtcbiAgaWYgKHNjaGVtYS5jbGFzc05hbWUgPT09ICdfVXNlcicpIHtcbiAgICBkZWxldGUgc2NoZW1hLmZpZWxkcy5faGFzaGVkX3Bhc3N3b3JkO1xuICB9XG4gIGlmIChzY2hlbWEuZmllbGRzKSB7XG4gICAgZGVsZXRlIHNjaGVtYS5maWVsZHMuX3dwZXJtO1xuICAgIGRlbGV0ZSBzY2hlbWEuZmllbGRzLl9ycGVybTtcbiAgfVxuICBsZXQgY2xwcyA9IGRlZmF1bHRDTFBTO1xuICBpZiAoc2NoZW1hLmNsYXNzTGV2ZWxQZXJtaXNzaW9ucykge1xuICAgIGNscHMgPSB7IC4uLmVtcHR5Q0xQUywgLi4uc2NoZW1hLmNsYXNzTGV2ZWxQZXJtaXNzaW9ucyB9O1xuICB9XG4gIGxldCBpbmRleGVzID0ge307XG4gIGlmIChzY2hlbWEuaW5kZXhlcykge1xuICAgIGluZGV4ZXMgPSB7IC4uLnNjaGVtYS5pbmRleGVzIH07XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBjbGFzc05hbWU6IHNjaGVtYS5jbGFzc05hbWUsXG4gICAgZmllbGRzOiBzY2hlbWEuZmllbGRzLFxuICAgIGNsYXNzTGV2ZWxQZXJtaXNzaW9uczogY2xwcyxcbiAgICBpbmRleGVzLFxuICB9O1xufTtcblxuY29uc3QgdG9Qb3N0Z3Jlc1NjaGVtYSA9IHNjaGVtYSA9PiB7XG4gIGlmICghc2NoZW1hKSB7XG4gICAgcmV0dXJuIHNjaGVtYTtcbiAgfVxuICBzY2hlbWEuZmllbGRzID0gc2NoZW1hLmZpZWxkcyB8fCB7fTtcbiAgc2NoZW1hLmZpZWxkcy5fd3Blcm0gPSB7IHR5cGU6ICdBcnJheScsIGNvbnRlbnRzOiB7IHR5cGU6ICdTdHJpbmcnIH0gfTtcbiAgc2NoZW1hLmZpZWxkcy5fcnBlcm0gPSB7IHR5cGU6ICdBcnJheScsIGNvbnRlbnRzOiB7IHR5cGU6ICdTdHJpbmcnIH0gfTtcbiAgaWYgKHNjaGVtYS5jbGFzc05hbWUgPT09ICdfVXNlcicpIHtcbiAgICBzY2hlbWEuZmllbGRzLl9oYXNoZWRfcGFzc3dvcmQgPSB7IHR5cGU6ICdTdHJpbmcnIH07XG4gICAgc2NoZW1hLmZpZWxkcy5fcGFzc3dvcmRfaGlzdG9yeSA9IHsgdHlwZTogJ0FycmF5JyB9O1xuICB9XG4gIHJldHVybiBzY2hlbWE7XG59O1xuXG5jb25zdCBoYW5kbGVEb3RGaWVsZHMgPSBvYmplY3QgPT4ge1xuICBPYmplY3Qua2V5cyhvYmplY3QpLmZvckVhY2goZmllbGROYW1lID0+IHtcbiAgICBpZiAoZmllbGROYW1lLmluZGV4T2YoJy4nKSA+IC0xKSB7XG4gICAgICBjb25zdCBjb21wb25lbnRzID0gZmllbGROYW1lLnNwbGl0KCcuJyk7XG4gICAgICBjb25zdCBmaXJzdCA9IGNvbXBvbmVudHMuc2hpZnQoKTtcbiAgICAgIG9iamVjdFtmaXJzdF0gPSBvYmplY3RbZmlyc3RdIHx8IHt9O1xuICAgICAgbGV0IGN1cnJlbnRPYmogPSBvYmplY3RbZmlyc3RdO1xuICAgICAgbGV0IG5leHQ7XG4gICAgICBsZXQgdmFsdWUgPSBvYmplY3RbZmllbGROYW1lXTtcbiAgICAgIGlmICh2YWx1ZSAmJiB2YWx1ZS5fX29wID09PSAnRGVsZXRlJykge1xuICAgICAgICB2YWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLWNvbmQtYXNzaWduICovXG4gICAgICB3aGlsZSAoKG5leHQgPSBjb21wb25lbnRzLnNoaWZ0KCkpKSB7XG4gICAgICAgIC8qIGVzbGludC1lbmFibGUgbm8tY29uZC1hc3NpZ24gKi9cbiAgICAgICAgY3VycmVudE9ialtuZXh0XSA9IGN1cnJlbnRPYmpbbmV4dF0gfHwge307XG4gICAgICAgIGlmIChjb21wb25lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIGN1cnJlbnRPYmpbbmV4dF0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBjdXJyZW50T2JqID0gY3VycmVudE9ialtuZXh0XTtcbiAgICAgIH1cbiAgICAgIGRlbGV0ZSBvYmplY3RbZmllbGROYW1lXTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gb2JqZWN0O1xufTtcblxuY29uc3QgdHJhbnNmb3JtRG90RmllbGRUb0NvbXBvbmVudHMgPSBmaWVsZE5hbWUgPT4ge1xuICByZXR1cm4gZmllbGROYW1lLnNwbGl0KCcuJykubWFwKChjbXB0LCBpbmRleCkgPT4ge1xuICAgIGlmIChpbmRleCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGBcIiR7Y21wdH1cImA7XG4gICAgfVxuICAgIHJldHVybiBgJyR7Y21wdH0nYDtcbiAgfSk7XG59O1xuXG5jb25zdCB0cmFuc2Zvcm1Eb3RGaWVsZCA9IGZpZWxkTmFtZSA9PiB7XG4gIGlmIChmaWVsZE5hbWUuaW5kZXhPZignLicpID09PSAtMSkge1xuICAgIHJldHVybiBgXCIke2ZpZWxkTmFtZX1cImA7XG4gIH1cbiAgY29uc3QgY29tcG9uZW50cyA9IHRyYW5zZm9ybURvdEZpZWxkVG9Db21wb25lbnRzKGZpZWxkTmFtZSk7XG4gIGxldCBuYW1lID0gY29tcG9uZW50cy5zbGljZSgwLCBjb21wb25lbnRzLmxlbmd0aCAtIDEpLmpvaW4oJy0+Jyk7XG4gIG5hbWUgKz0gJy0+PicgKyBjb21wb25lbnRzW2NvbXBvbmVudHMubGVuZ3RoIC0gMV07XG4gIHJldHVybiBuYW1lO1xufTtcblxuY29uc3QgdHJhbnNmb3JtQWdncmVnYXRlRmllbGQgPSBmaWVsZE5hbWUgPT4ge1xuICBpZiAodHlwZW9mIGZpZWxkTmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZmllbGROYW1lO1xuICB9XG4gIGlmIChmaWVsZE5hbWUgPT09ICckX2NyZWF0ZWRfYXQnKSB7XG4gICAgcmV0dXJuICdjcmVhdGVkQXQnO1xuICB9XG4gIGlmIChmaWVsZE5hbWUgPT09ICckX3VwZGF0ZWRfYXQnKSB7XG4gICAgcmV0dXJuICd1cGRhdGVkQXQnO1xuICB9XG4gIHJldHVybiBmaWVsZE5hbWUuc3Vic3RyKDEpO1xufTtcblxuY29uc3QgdmFsaWRhdGVLZXlzID0gb2JqZWN0ID0+IHtcbiAgaWYgKHR5cGVvZiBvYmplY3QgPT0gJ29iamVjdCcpIHtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmplY3QpIHtcbiAgICAgIGlmICh0eXBlb2Ygb2JqZWN0W2tleV0gPT0gJ29iamVjdCcpIHtcbiAgICAgICAgdmFsaWRhdGVLZXlzKG9iamVjdFtrZXldKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGtleS5pbmNsdWRlcygnJCcpIHx8IGtleS5pbmNsdWRlcygnLicpKSB7XG4gICAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihcbiAgICAgICAgICBQYXJzZS5FcnJvci5JTlZBTElEX05FU1RFRF9LRVksXG4gICAgICAgICAgXCJOZXN0ZWQga2V5cyBzaG91bGQgbm90IGNvbnRhaW4gdGhlICckJyBvciAnLicgY2hhcmFjdGVyc1wiXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG59O1xuXG4vLyBSZXR1cm5zIHRoZSBsaXN0IG9mIGpvaW4gdGFibGVzIG9uIGEgc2NoZW1hXG5jb25zdCBqb2luVGFibGVzRm9yU2NoZW1hID0gc2NoZW1hID0+IHtcbiAgY29uc3QgbGlzdCA9IFtdO1xuICBpZiAoc2NoZW1hKSB7XG4gICAgT2JqZWN0LmtleXMoc2NoZW1hLmZpZWxkcykuZm9yRWFjaChmaWVsZCA9PiB7XG4gICAgICBpZiAoc2NoZW1hLmZpZWxkc1tmaWVsZF0udHlwZSA9PT0gJ1JlbGF0aW9uJykge1xuICAgICAgICBsaXN0LnB1c2goYF9Kb2luOiR7ZmllbGR9OiR7c2NoZW1hLmNsYXNzTmFtZX1gKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICByZXR1cm4gbGlzdDtcbn07XG5cbmludGVyZmFjZSBXaGVyZUNsYXVzZSB7XG4gIHBhdHRlcm46IHN0cmluZztcbiAgdmFsdWVzOiBBcnJheTxhbnk+O1xuICBzb3J0czogQXJyYXk8YW55Pjtcbn1cblxuY29uc3QgYnVpbGRXaGVyZUNsYXVzZSA9ICh7IHNjaGVtYSwgcXVlcnksIGluZGV4LCBjYXNlSW5zZW5zaXRpdmUgfSk6IFdoZXJlQ2xhdXNlID0+IHtcbiAgY29uc3QgcGF0dGVybnMgPSBbXTtcbiAgbGV0IHZhbHVlcyA9IFtdO1xuICBjb25zdCBzb3J0cyA9IFtdO1xuXG4gIHNjaGVtYSA9IHRvUG9zdGdyZXNTY2hlbWEoc2NoZW1hKTtcbiAgZm9yIChjb25zdCBmaWVsZE5hbWUgaW4gcXVlcnkpIHtcbiAgICBjb25zdCBpc0FycmF5RmllbGQgPVxuICAgICAgc2NoZW1hLmZpZWxkcyAmJiBzY2hlbWEuZmllbGRzW2ZpZWxkTmFtZV0gJiYgc2NoZW1hLmZpZWxkc1tmaWVsZE5hbWVdLnR5cGUgPT09ICdBcnJheSc7XG4gICAgY29uc3QgaW5pdGlhbFBhdHRlcm5zTGVuZ3RoID0gcGF0dGVybnMubGVuZ3RoO1xuICAgIGNvbnN0IGZpZWxkVmFsdWUgPSBxdWVyeVtmaWVsZE5hbWVdO1xuXG4gICAgLy8gbm90aGluZyBpbiB0aGUgc2NoZW1hLCBpdCdzIGdvbm5hIGJsb3cgdXBcbiAgICBpZiAoIXNjaGVtYS5maWVsZHNbZmllbGROYW1lXSkge1xuICAgICAgLy8gYXMgaXQgd29uJ3QgZXhpc3RcbiAgICAgIGlmIChmaWVsZFZhbHVlICYmIGZpZWxkVmFsdWUuJGV4aXN0cyA9PT0gZmFsc2UpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGF1dGhEYXRhTWF0Y2ggPSBmaWVsZE5hbWUubWF0Y2goL15fYXV0aF9kYXRhXyhbYS16QS1aMC05X10rKSQvKTtcbiAgICBpZiAoYXV0aERhdGFNYXRjaCkge1xuICAgICAgLy8gVE9ETzogSGFuZGxlIHF1ZXJ5aW5nIGJ5IF9hdXRoX2RhdGFfcHJvdmlkZXIsIGF1dGhEYXRhIGlzIHN0b3JlZCBpbiBhdXRoRGF0YSBmaWVsZFxuICAgICAgY29udGludWU7XG4gICAgfSBlbHNlIGlmIChjYXNlSW5zZW5zaXRpdmUgJiYgKGZpZWxkTmFtZSA9PT0gJ3VzZXJuYW1lJyB8fCBmaWVsZE5hbWUgPT09ICdlbWFpbCcpKSB7XG4gICAgICBwYXR0ZXJucy5wdXNoKGBMT1dFUigkJHtpbmRleH06bmFtZSkgPSBMT1dFUigkJHtpbmRleCArIDF9KWApO1xuICAgICAgdmFsdWVzLnB1c2goZmllbGROYW1lLCBmaWVsZFZhbHVlKTtcbiAgICAgIGluZGV4ICs9IDI7XG4gICAgfSBlbHNlIGlmIChmaWVsZE5hbWUuaW5kZXhPZignLicpID49IDApIHtcbiAgICAgIGxldCBuYW1lID0gdHJhbnNmb3JtRG90RmllbGQoZmllbGROYW1lKTtcbiAgICAgIGlmIChmaWVsZFZhbHVlID09PSBudWxsKSB7XG4gICAgICAgIHBhdHRlcm5zLnB1c2goYCQke2luZGV4fTpyYXcgSVMgTlVMTGApO1xuICAgICAgICB2YWx1ZXMucHVzaChuYW1lKTtcbiAgICAgICAgaW5kZXggKz0gMTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoZmllbGRWYWx1ZS4kaW4pIHtcbiAgICAgICAgICBuYW1lID0gdHJhbnNmb3JtRG90RmllbGRUb0NvbXBvbmVudHMoZmllbGROYW1lKS5qb2luKCctPicpO1xuICAgICAgICAgIHBhdHRlcm5zLnB1c2goYCgkJHtpbmRleH06cmF3KTo6anNvbmIgQD4gJCR7aW5kZXggKyAxfTo6anNvbmJgKTtcbiAgICAgICAgICB2YWx1ZXMucHVzaChuYW1lLCBKU09OLnN0cmluZ2lmeShmaWVsZFZhbHVlLiRpbikpO1xuICAgICAgICAgIGluZGV4ICs9IDI7XG4gICAgICAgIH0gZWxzZSBpZiAoZmllbGRWYWx1ZS4kcmVnZXgpIHtcbiAgICAgICAgICAvLyBIYW5kbGUgbGF0ZXJcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZmllbGRWYWx1ZSAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgICBwYXR0ZXJucy5wdXNoKGAkJHtpbmRleH06cmF3ID0gJCR7aW5kZXggKyAxfTo6dGV4dGApO1xuICAgICAgICAgIHZhbHVlcy5wdXNoKG5hbWUsIGZpZWxkVmFsdWUpO1xuICAgICAgICAgIGluZGV4ICs9IDI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGZpZWxkVmFsdWUgPT09IG51bGwgfHwgZmllbGRWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBwYXR0ZXJucy5wdXNoKGAkJHtpbmRleH06bmFtZSBJUyBOVUxMYCk7XG4gICAgICB2YWx1ZXMucHVzaChmaWVsZE5hbWUpO1xuICAgICAgaW5kZXggKz0gMTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGZpZWxkVmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICBwYXR0ZXJucy5wdXNoKGAkJHtpbmRleH06bmFtZSA9ICQke2luZGV4ICsgMX1gKTtcbiAgICAgIHZhbHVlcy5wdXNoKGZpZWxkTmFtZSwgZmllbGRWYWx1ZSk7XG4gICAgICBpbmRleCArPSAyO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGZpZWxkVmFsdWUgPT09ICdib29sZWFuJykge1xuICAgICAgcGF0dGVybnMucHVzaChgJCR7aW5kZXh9Om5hbWUgPSAkJHtpbmRleCArIDF9YCk7XG4gICAgICAvLyBDYW4ndCBjYXN0IGJvb2xlYW4gdG8gZG91YmxlIHByZWNpc2lvblxuICAgICAgaWYgKHNjaGVtYS5maWVsZHNbZmllbGROYW1lXSAmJiBzY2hlbWEuZmllbGRzW2ZpZWxkTmFtZV0udHlwZSA9PT0gJ051bWJlcicpIHtcbiAgICAgICAgLy8gU2hvdWxkIGFsd2F5cyByZXR1cm4gemVybyByZXN1bHRzXG4gICAgICAgIGNvbnN0IE1BWF9JTlRfUExVU19PTkUgPSA5MjIzMzcyMDM2ODU0Nzc1ODA4O1xuICAgICAgICB2YWx1ZXMucHVzaChmaWVsZE5hbWUsIE1BWF9JTlRfUExVU19PTkUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsdWVzLnB1c2goZmllbGROYW1lLCBmaWVsZFZhbHVlKTtcbiAgICAgIH1cbiAgICAgIGluZGV4ICs9IDI7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgZmllbGRWYWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgIHBhdHRlcm5zLnB1c2goYCQke2luZGV4fTpuYW1lID0gJCR7aW5kZXggKyAxfWApO1xuICAgICAgdmFsdWVzLnB1c2goZmllbGROYW1lLCBmaWVsZFZhbHVlKTtcbiAgICAgIGluZGV4ICs9IDI7XG4gICAgfSBlbHNlIGlmIChbJyRvcicsICckbm9yJywgJyRhbmQnXS5pbmNsdWRlcyhmaWVsZE5hbWUpKSB7XG4gICAgICBjb25zdCBjbGF1c2VzID0gW107XG4gICAgICBjb25zdCBjbGF1c2VWYWx1ZXMgPSBbXTtcbiAgICAgIGZpZWxkVmFsdWUuZm9yRWFjaChzdWJRdWVyeSA9PiB7XG4gICAgICAgIGNvbnN0IGNsYXVzZSA9IGJ1aWxkV2hlcmVDbGF1c2Uoe1xuICAgICAgICAgIHNjaGVtYSxcbiAgICAgICAgICBxdWVyeTogc3ViUXVlcnksXG4gICAgICAgICAgaW5kZXgsXG4gICAgICAgICAgY2FzZUluc2Vuc2l0aXZlLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGNsYXVzZS5wYXR0ZXJuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjbGF1c2VzLnB1c2goY2xhdXNlLnBhdHRlcm4pO1xuICAgICAgICAgIGNsYXVzZVZhbHVlcy5wdXNoKC4uLmNsYXVzZS52YWx1ZXMpO1xuICAgICAgICAgIGluZGV4ICs9IGNsYXVzZS52YWx1ZXMubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgY29uc3Qgb3JPckFuZCA9IGZpZWxkTmFtZSA9PT0gJyRhbmQnID8gJyBBTkQgJyA6ICcgT1IgJztcbiAgICAgIGNvbnN0IG5vdCA9IGZpZWxkTmFtZSA9PT0gJyRub3InID8gJyBOT1QgJyA6ICcnO1xuXG4gICAgICBwYXR0ZXJucy5wdXNoKGAke25vdH0oJHtjbGF1c2VzLmpvaW4ob3JPckFuZCl9KWApO1xuICAgICAgdmFsdWVzLnB1c2goLi4uY2xhdXNlVmFsdWVzKTtcbiAgICB9XG5cbiAgICBpZiAoZmllbGRWYWx1ZS4kbmUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKGlzQXJyYXlGaWVsZCkge1xuICAgICAgICBmaWVsZFZhbHVlLiRuZSA9IEpTT04uc3RyaW5naWZ5KFtmaWVsZFZhbHVlLiRuZV0pO1xuICAgICAgICBwYXR0ZXJucy5wdXNoKGBOT1QgYXJyYXlfY29udGFpbnMoJCR7aW5kZXh9Om5hbWUsICQke2luZGV4ICsgMX0pYCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoZmllbGRWYWx1ZS4kbmUgPT09IG51bGwpIHtcbiAgICAgICAgICBwYXR0ZXJucy5wdXNoKGAkJHtpbmRleH06bmFtZSBJUyBOT1QgTlVMTGApO1xuICAgICAgICAgIHZhbHVlcy5wdXNoKGZpZWxkTmFtZSk7XG4gICAgICAgICAgaW5kZXggKz0gMTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBpZiBub3QgbnVsbCwgd2UgbmVlZCB0byBtYW51YWxseSBleGNsdWRlIG51bGxcbiAgICAgICAgICBpZiAoZmllbGRWYWx1ZS4kbmUuX190eXBlID09PSAnR2VvUG9pbnQnKSB7XG4gICAgICAgICAgICBwYXR0ZXJucy5wdXNoKFxuICAgICAgICAgICAgICBgKCQke2luZGV4fTpuYW1lIDw+IFBPSU5UKCQke2luZGV4ICsgMX0sICQke2luZGV4ICsgMn0pIE9SICQke2luZGV4fTpuYW1lIElTIE5VTEwpYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKGZpZWxkTmFtZS5pbmRleE9mKCcuJykgPj0gMCkge1xuICAgICAgICAgICAgICBjb25zdCBjYXN0VHlwZSA9IHRvUG9zdGdyZXNWYWx1ZUNhc3RUeXBlKGZpZWxkVmFsdWUuJG5lKTtcbiAgICAgICAgICAgICAgY29uc3QgY29uc3RyYWludEZpZWxkTmFtZSA9IGNhc3RUeXBlXG4gICAgICAgICAgICAgICAgPyBgQ0FTVCAoKCR7dHJhbnNmb3JtRG90RmllbGQoZmllbGROYW1lKX0pIEFTICR7Y2FzdFR5cGV9KWBcbiAgICAgICAgICAgICAgICA6IHRyYW5zZm9ybURvdEZpZWxkKGZpZWxkTmFtZSk7XG4gICAgICAgICAgICAgIHBhdHRlcm5zLnB1c2goXG4gICAgICAgICAgICAgICAgYCgke2NvbnN0cmFpbnRGaWVsZE5hbWV9IDw+ICQke2luZGV4ICsgMX0gT1IgJHtjb25zdHJhaW50RmllbGROYW1lfSBJUyBOVUxMKWBcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGZpZWxkVmFsdWUuJG5lID09PSAnb2JqZWN0JyAmJiBmaWVsZFZhbHVlLiRuZS4kcmVsYXRpdmVUaW1lKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihcbiAgICAgICAgICAgICAgICBQYXJzZS5FcnJvci5JTlZBTElEX0pTT04sXG4gICAgICAgICAgICAgICAgJyRyZWxhdGl2ZVRpbWUgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIHRoZSAkbHQsICRsdGUsICRndCwgYW5kICRndGUgb3BlcmF0b3JzJ1xuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcGF0dGVybnMucHVzaChgKCQke2luZGV4fTpuYW1lIDw+ICQke2luZGV4ICsgMX0gT1IgJCR7aW5kZXh9Om5hbWUgSVMgTlVMTClgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChmaWVsZFZhbHVlLiRuZS5fX3R5cGUgPT09ICdHZW9Qb2ludCcpIHtcbiAgICAgICAgY29uc3QgcG9pbnQgPSBmaWVsZFZhbHVlLiRuZTtcbiAgICAgICAgdmFsdWVzLnB1c2goZmllbGROYW1lLCBwb2ludC5sb25naXR1ZGUsIHBvaW50LmxhdGl0dWRlKTtcbiAgICAgICAgaW5kZXggKz0gMztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFRPRE86IHN1cHBvcnQgYXJyYXlzXG4gICAgICAgIHZhbHVlcy5wdXNoKGZpZWxkTmFtZSwgZmllbGRWYWx1ZS4kbmUpO1xuICAgICAgICBpbmRleCArPSAyO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZmllbGRWYWx1ZS4kZXEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKGZpZWxkVmFsdWUuJGVxID09PSBudWxsKSB7XG4gICAgICAgIHBhdHRlcm5zLnB1c2goYCQke2luZGV4fTpuYW1lIElTIE5VTExgKTtcbiAgICAgICAgdmFsdWVzLnB1c2goZmllbGROYW1lKTtcbiAgICAgICAgaW5kZXggKz0gMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChmaWVsZE5hbWUuaW5kZXhPZignLicpID49IDApIHtcbiAgICAgICAgICBjb25zdCBjYXN0VHlwZSA9IHRvUG9zdGdyZXNWYWx1ZUNhc3RUeXBlKGZpZWxkVmFsdWUuJGVxKTtcbiAgICAgICAgICBjb25zdCBjb25zdHJhaW50RmllbGROYW1lID0gY2FzdFR5cGVcbiAgICAgICAgICAgID8gYENBU1QgKCgke3RyYW5zZm9ybURvdEZpZWxkKGZpZWxkTmFtZSl9KSBBUyAke2Nhc3RUeXBlfSlgXG4gICAgICAgICAgICA6IHRyYW5zZm9ybURvdEZpZWxkKGZpZWxkTmFtZSk7XG4gICAgICAgICAgdmFsdWVzLnB1c2goZmllbGRWYWx1ZS4kZXEpO1xuICAgICAgICAgIHBhdHRlcm5zLnB1c2goYCR7Y29uc3RyYWludEZpZWxkTmFtZX0gPSAkJHtpbmRleCsrfWApO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBmaWVsZFZhbHVlLiRlcSA9PT0gJ29iamVjdCcgJiYgZmllbGRWYWx1ZS4kZXEuJHJlbGF0aXZlVGltZSkge1xuICAgICAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihcbiAgICAgICAgICAgIFBhcnNlLkVycm9yLklOVkFMSURfSlNPTixcbiAgICAgICAgICAgICckcmVsYXRpdmVUaW1lIGNhbiBvbmx5IGJlIHVzZWQgd2l0aCB0aGUgJGx0LCAkbHRlLCAkZ3QsIGFuZCAkZ3RlIG9wZXJhdG9ycydcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhbHVlcy5wdXNoKGZpZWxkTmFtZSwgZmllbGRWYWx1ZS4kZXEpO1xuICAgICAgICAgIHBhdHRlcm5zLnB1c2goYCQke2luZGV4fTpuYW1lID0gJCR7aW5kZXggKyAxfWApO1xuICAgICAgICAgIGluZGV4ICs9IDI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgaXNJbk9yTmluID0gQXJyYXkuaXNBcnJheShmaWVsZFZhbHVlLiRpbikgfHwgQXJyYXkuaXNBcnJheShmaWVsZFZhbHVlLiRuaW4pO1xuICAgIGlmIChcbiAgICAgIEFycmF5LmlzQXJyYXkoZmllbGRWYWx1ZS4kaW4pICYmXG4gICAgICBpc0FycmF5RmllbGQgJiZcbiAgICAgIHNjaGVtYS5maWVsZHNbZmllbGROYW1lXS5jb250ZW50cyAmJlxuICAgICAgc2NoZW1hLmZpZWxkc1tmaWVsZE5hbWVdLmNvbnRlbnRzLnR5cGUgPT09ICdTdHJpbmcnXG4gICAgKSB7XG4gICAgICBjb25zdCBpblBhdHRlcm5zID0gW107XG4gICAgICBsZXQgYWxsb3dOdWxsID0gZmFsc2U7XG4gICAgICB2YWx1ZXMucHVzaChmaWVsZE5hbWUpO1xuICAgICAgZmllbGRWYWx1ZS4kaW4uZm9yRWFjaCgobGlzdEVsZW0sIGxpc3RJbmRleCkgPT4ge1xuICAgICAgICBpZiAobGlzdEVsZW0gPT09IG51bGwpIHtcbiAgICAgICAgICBhbGxvd051bGwgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhbHVlcy5wdXNoKGxpc3RFbGVtKTtcbiAgICAgICAgICBpblBhdHRlcm5zLnB1c2goYCQke2luZGV4ICsgMSArIGxpc3RJbmRleCAtIChhbGxvd051bGwgPyAxIDogMCl9YCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgaWYgKGFsbG93TnVsbCkge1xuICAgICAgICBwYXR0ZXJucy5wdXNoKGAoJCR7aW5kZXh9Om5hbWUgSVMgTlVMTCBPUiAkJHtpbmRleH06bmFtZSAmJiBBUlJBWVske2luUGF0dGVybnMuam9pbigpfV0pYCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwYXR0ZXJucy5wdXNoKGAkJHtpbmRleH06bmFtZSAmJiBBUlJBWVske2luUGF0dGVybnMuam9pbigpfV1gKTtcbiAgICAgIH1cbiAgICAgIGluZGV4ID0gaW5kZXggKyAxICsgaW5QYXR0ZXJucy5sZW5ndGg7XG4gICAgfSBlbHNlIGlmIChpc0luT3JOaW4pIHtcbiAgICAgIHZhciBjcmVhdGVDb25zdHJhaW50ID0gKGJhc2VBcnJheSwgbm90SW4pID0+IHtcbiAgICAgICAgY29uc3Qgbm90ID0gbm90SW4gPyAnIE5PVCAnIDogJyc7XG4gICAgICAgIGlmIChiYXNlQXJyYXkubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGlmIChpc0FycmF5RmllbGQpIHtcbiAgICAgICAgICAgIHBhdHRlcm5zLnB1c2goYCR7bm90fSBhcnJheV9jb250YWlucygkJHtpbmRleH06bmFtZSwgJCR7aW5kZXggKyAxfSlgKTtcbiAgICAgICAgICAgIHZhbHVlcy5wdXNoKGZpZWxkTmFtZSwgSlNPTi5zdHJpbmdpZnkoYmFzZUFycmF5KSk7XG4gICAgICAgICAgICBpbmRleCArPSAyO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBIYW5kbGUgTmVzdGVkIERvdCBOb3RhdGlvbiBBYm92ZVxuICAgICAgICAgICAgaWYgKGZpZWxkTmFtZS5pbmRleE9mKCcuJykgPj0gMCkge1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBpblBhdHRlcm5zID0gW107XG4gICAgICAgICAgICB2YWx1ZXMucHVzaChmaWVsZE5hbWUpO1xuICAgICAgICAgICAgYmFzZUFycmF5LmZvckVhY2goKGxpc3RFbGVtLCBsaXN0SW5kZXgpID0+IHtcbiAgICAgICAgICAgICAgaWYgKGxpc3RFbGVtICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZXMucHVzaChsaXN0RWxlbSk7XG4gICAgICAgICAgICAgICAgaW5QYXR0ZXJucy5wdXNoKGAkJHtpbmRleCArIDEgKyBsaXN0SW5kZXh9YCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcGF0dGVybnMucHVzaChgJCR7aW5kZXh9Om5hbWUgJHtub3R9IElOICgke2luUGF0dGVybnMuam9pbigpfSlgKTtcbiAgICAgICAgICAgIGluZGV4ID0gaW5kZXggKyAxICsgaW5QYXR0ZXJucy5sZW5ndGg7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKCFub3RJbikge1xuICAgICAgICAgIHZhbHVlcy5wdXNoKGZpZWxkTmFtZSk7XG4gICAgICAgICAgcGF0dGVybnMucHVzaChgJCR7aW5kZXh9Om5hbWUgSVMgTlVMTGApO1xuICAgICAgICAgIGluZGV4ID0gaW5kZXggKyAxO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEhhbmRsZSBlbXB0eSBhcnJheVxuICAgICAgICAgIGlmIChub3RJbikge1xuICAgICAgICAgICAgcGF0dGVybnMucHVzaCgnMSA9IDEnKTsgLy8gUmV0dXJuIGFsbCB2YWx1ZXNcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGF0dGVybnMucHVzaCgnMSA9IDInKTsgLy8gUmV0dXJuIG5vIHZhbHVlc1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGlmIChmaWVsZFZhbHVlLiRpbikge1xuICAgICAgICBjcmVhdGVDb25zdHJhaW50KFxuICAgICAgICAgIF8uZmxhdE1hcChmaWVsZFZhbHVlLiRpbiwgZWx0ID0+IGVsdCksXG4gICAgICAgICAgZmFsc2VcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChmaWVsZFZhbHVlLiRuaW4pIHtcbiAgICAgICAgY3JlYXRlQ29uc3RyYWludChcbiAgICAgICAgICBfLmZsYXRNYXAoZmllbGRWYWx1ZS4kbmluLCBlbHQgPT4gZWx0KSxcbiAgICAgICAgICB0cnVlXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgZmllbGRWYWx1ZS4kaW4gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuSU5WQUxJRF9KU09OLCAnYmFkICRpbiB2YWx1ZScpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGZpZWxkVmFsdWUuJG5pbiAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5JTlZBTElEX0pTT04sICdiYWQgJG5pbiB2YWx1ZScpO1xuICAgIH1cblxuICAgIGlmIChBcnJheS5pc0FycmF5KGZpZWxkVmFsdWUuJGFsbCkgJiYgaXNBcnJheUZpZWxkKSB7XG4gICAgICBpZiAoaXNBbnlWYWx1ZVJlZ2V4U3RhcnRzV2l0aChmaWVsZFZhbHVlLiRhbGwpKSB7XG4gICAgICAgIGlmICghaXNBbGxWYWx1ZXNSZWdleE9yTm9uZShmaWVsZFZhbHVlLiRhbGwpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFxuICAgICAgICAgICAgUGFyc2UuRXJyb3IuSU5WQUxJRF9KU09OLFxuICAgICAgICAgICAgJ0FsbCAkYWxsIHZhbHVlcyBtdXN0IGJlIG9mIHJlZ2V4IHR5cGUgb3Igbm9uZTogJyArIGZpZWxkVmFsdWUuJGFsbFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZpZWxkVmFsdWUuJGFsbC5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICAgIGNvbnN0IHZhbHVlID0gcHJvY2Vzc1JlZ2V4UGF0dGVybihmaWVsZFZhbHVlLiRhbGxbaV0uJHJlZ2V4KTtcbiAgICAgICAgICBmaWVsZFZhbHVlLiRhbGxbaV0gPSB2YWx1ZS5zdWJzdHJpbmcoMSkgKyAnJSc7XG4gICAgICAgIH1cbiAgICAgICAgcGF0dGVybnMucHVzaChgYXJyYXlfY29udGFpbnNfYWxsX3JlZ2V4KCQke2luZGV4fTpuYW1lLCAkJHtpbmRleCArIDF9Ojpqc29uYilgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBhdHRlcm5zLnB1c2goYGFycmF5X2NvbnRhaW5zX2FsbCgkJHtpbmRleH06bmFtZSwgJCR7aW5kZXggKyAxfTo6anNvbmIpYCk7XG4gICAgICB9XG4gICAgICB2YWx1ZXMucHVzaChmaWVsZE5hbWUsIEpTT04uc3RyaW5naWZ5KGZpZWxkVmFsdWUuJGFsbCkpO1xuICAgICAgaW5kZXggKz0gMjtcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoZmllbGRWYWx1ZS4kYWxsKSkge1xuICAgICAgaWYgKGZpZWxkVmFsdWUuJGFsbC5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgcGF0dGVybnMucHVzaChgJCR7aW5kZXh9Om5hbWUgPSAkJHtpbmRleCArIDF9YCk7XG4gICAgICAgIHZhbHVlcy5wdXNoKGZpZWxkTmFtZSwgZmllbGRWYWx1ZS4kYWxsWzBdLm9iamVjdElkKTtcbiAgICAgICAgaW5kZXggKz0gMjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGZpZWxkVmFsdWUuJGV4aXN0cyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGlmICh0eXBlb2YgZmllbGRWYWx1ZS4kZXhpc3RzID09PSAnb2JqZWN0JyAmJiBmaWVsZFZhbHVlLiRleGlzdHMuJHJlbGF0aXZlVGltZSkge1xuICAgICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoXG4gICAgICAgICAgUGFyc2UuRXJyb3IuSU5WQUxJRF9KU09OLFxuICAgICAgICAgICckcmVsYXRpdmVUaW1lIGNhbiBvbmx5IGJlIHVzZWQgd2l0aCB0aGUgJGx0LCAkbHRlLCAkZ3QsIGFuZCAkZ3RlIG9wZXJhdG9ycydcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSBpZiAoZmllbGRWYWx1ZS4kZXhpc3RzKSB7XG4gICAgICAgIHBhdHRlcm5zLnB1c2goYCQke2luZGV4fTpuYW1lIElTIE5PVCBOVUxMYCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwYXR0ZXJucy5wdXNoKGAkJHtpbmRleH06bmFtZSBJUyBOVUxMYCk7XG4gICAgICB9XG4gICAgICB2YWx1ZXMucHVzaChmaWVsZE5hbWUpO1xuICAgICAgaW5kZXggKz0gMTtcbiAgICB9XG5cbiAgICBpZiAoZmllbGRWYWx1ZS4kY29udGFpbmVkQnkpIHtcbiAgICAgIGNvbnN0IGFyciA9IGZpZWxkVmFsdWUuJGNvbnRhaW5lZEJ5O1xuICAgICAgaWYgKCEoYXJyIGluc3RhbmNlb2YgQXJyYXkpKSB7XG4gICAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5JTlZBTElEX0pTT04sIGBiYWQgJGNvbnRhaW5lZEJ5OiBzaG91bGQgYmUgYW4gYXJyYXlgKTtcbiAgICAgIH1cblxuICAgICAgcGF0dGVybnMucHVzaChgJCR7aW5kZXh9Om5hbWUgPEAgJCR7aW5kZXggKyAxfTo6anNvbmJgKTtcbiAgICAgIHZhbHVlcy5wdXNoKGZpZWxkTmFtZSwgSlNPTi5zdHJpbmdpZnkoYXJyKSk7XG4gICAgICBpbmRleCArPSAyO1xuICAgIH1cblxuICAgIGlmIChmaWVsZFZhbHVlLiR0ZXh0KSB7XG4gICAgICBjb25zdCBzZWFyY2ggPSBmaWVsZFZhbHVlLiR0ZXh0LiRzZWFyY2g7XG4gICAgICBsZXQgbGFuZ3VhZ2UgPSAnZW5nbGlzaCc7XG4gICAgICBpZiAodHlwZW9mIHNlYXJjaCAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLklOVkFMSURfSlNPTiwgYGJhZCAkdGV4dDogJHNlYXJjaCwgc2hvdWxkIGJlIG9iamVjdGApO1xuICAgICAgfVxuICAgICAgaWYgKCFzZWFyY2guJHRlcm0gfHwgdHlwZW9mIHNlYXJjaC4kdGVybSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLklOVkFMSURfSlNPTiwgYGJhZCAkdGV4dDogJHRlcm0sIHNob3VsZCBiZSBzdHJpbmdgKTtcbiAgICAgIH1cbiAgICAgIGlmIChzZWFyY2guJGxhbmd1YWdlICYmIHR5cGVvZiBzZWFyY2guJGxhbmd1YWdlICE9PSAnc3RyaW5nJykge1xuICAgICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuSU5WQUxJRF9KU09OLCBgYmFkICR0ZXh0OiAkbGFuZ3VhZ2UsIHNob3VsZCBiZSBzdHJpbmdgKTtcbiAgICAgIH0gZWxzZSBpZiAoc2VhcmNoLiRsYW5ndWFnZSkge1xuICAgICAgICBsYW5ndWFnZSA9IHNlYXJjaC4kbGFuZ3VhZ2U7XG4gICAgICB9XG4gICAgICBpZiAoc2VhcmNoLiRjYXNlU2Vuc2l0aXZlICYmIHR5cGVvZiBzZWFyY2guJGNhc2VTZW5zaXRpdmUgIT09ICdib29sZWFuJykge1xuICAgICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoXG4gICAgICAgICAgUGFyc2UuRXJyb3IuSU5WQUxJRF9KU09OLFxuICAgICAgICAgIGBiYWQgJHRleHQ6ICRjYXNlU2Vuc2l0aXZlLCBzaG91bGQgYmUgYm9vbGVhbmBcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSBpZiAoc2VhcmNoLiRjYXNlU2Vuc2l0aXZlKSB7XG4gICAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihcbiAgICAgICAgICBQYXJzZS5FcnJvci5JTlZBTElEX0pTT04sXG4gICAgICAgICAgYGJhZCAkdGV4dDogJGNhc2VTZW5zaXRpdmUgbm90IHN1cHBvcnRlZCwgcGxlYXNlIHVzZSAkcmVnZXggb3IgY3JlYXRlIGEgc2VwYXJhdGUgbG93ZXIgY2FzZSBjb2x1bW4uYFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKHNlYXJjaC4kZGlhY3JpdGljU2Vuc2l0aXZlICYmIHR5cGVvZiBzZWFyY2guJGRpYWNyaXRpY1NlbnNpdGl2ZSAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihcbiAgICAgICAgICBQYXJzZS5FcnJvci5JTlZBTElEX0pTT04sXG4gICAgICAgICAgYGJhZCAkdGV4dDogJGRpYWNyaXRpY1NlbnNpdGl2ZSwgc2hvdWxkIGJlIGJvb2xlYW5gXG4gICAgICAgICk7XG4gICAgICB9IGVsc2UgaWYgKHNlYXJjaC4kZGlhY3JpdGljU2Vuc2l0aXZlID09PSBmYWxzZSkge1xuICAgICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoXG4gICAgICAgICAgUGFyc2UuRXJyb3IuSU5WQUxJRF9KU09OLFxuICAgICAgICAgIGBiYWQgJHRleHQ6ICRkaWFjcml0aWNTZW5zaXRpdmUgLSBmYWxzZSBub3Qgc3VwcG9ydGVkLCBpbnN0YWxsIFBvc3RncmVzIFVuYWNjZW50IEV4dGVuc2lvbmBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHBhdHRlcm5zLnB1c2goXG4gICAgICAgIGB0b190c3ZlY3RvcigkJHtpbmRleH0sICQke2luZGV4ICsgMX06bmFtZSkgQEAgdG9fdHNxdWVyeSgkJHtpbmRleCArIDJ9LCAkJHtpbmRleCArIDN9KWBcbiAgICAgICk7XG4gICAgICB2YWx1ZXMucHVzaChsYW5ndWFnZSwgZmllbGROYW1lLCBsYW5ndWFnZSwgc2VhcmNoLiR0ZXJtKTtcbiAgICAgIGluZGV4ICs9IDQ7XG4gICAgfVxuXG4gICAgaWYgKGZpZWxkVmFsdWUuJG5lYXJTcGhlcmUpIHtcbiAgICAgIGNvbnN0IHBvaW50ID0gZmllbGRWYWx1ZS4kbmVhclNwaGVyZTtcbiAgICAgIGNvbnN0IGRpc3RhbmNlID0gZmllbGRWYWx1ZS4kbWF4RGlzdGFuY2U7XG4gICAgICBjb25zdCBkaXN0YW5jZUluS00gPSBkaXN0YW5jZSAqIDYzNzEgKiAxMDAwO1xuICAgICAgcGF0dGVybnMucHVzaChcbiAgICAgICAgYFNUX0Rpc3RhbmNlU3BoZXJlKCQke2luZGV4fTpuYW1lOjpnZW9tZXRyeSwgUE9JTlQoJCR7aW5kZXggKyAxfSwgJCR7XG4gICAgICAgICAgaW5kZXggKyAyXG4gICAgICAgIH0pOjpnZW9tZXRyeSkgPD0gJCR7aW5kZXggKyAzfWBcbiAgICAgICk7XG4gICAgICBzb3J0cy5wdXNoKFxuICAgICAgICBgU1RfRGlzdGFuY2VTcGhlcmUoJCR7aW5kZXh9Om5hbWU6Omdlb21ldHJ5LCBQT0lOVCgkJHtpbmRleCArIDF9LCAkJHtcbiAgICAgICAgICBpbmRleCArIDJcbiAgICAgICAgfSk6Omdlb21ldHJ5KSBBU0NgXG4gICAgICApO1xuICAgICAgdmFsdWVzLnB1c2goZmllbGROYW1lLCBwb2ludC5sb25naXR1ZGUsIHBvaW50LmxhdGl0dWRlLCBkaXN0YW5jZUluS00pO1xuICAgICAgaW5kZXggKz0gNDtcbiAgICB9XG5cbiAgICBpZiAoZmllbGRWYWx1ZS4kd2l0aGluICYmIGZpZWxkVmFsdWUuJHdpdGhpbi4kYm94KSB7XG4gICAgICBjb25zdCBib3ggPSBmaWVsZFZhbHVlLiR3aXRoaW4uJGJveDtcbiAgICAgIGNvbnN0IGxlZnQgPSBib3hbMF0ubG9uZ2l0dWRlO1xuICAgICAgY29uc3QgYm90dG9tID0gYm94WzBdLmxhdGl0dWRlO1xuICAgICAgY29uc3QgcmlnaHQgPSBib3hbMV0ubG9uZ2l0dWRlO1xuICAgICAgY29uc3QgdG9wID0gYm94WzFdLmxhdGl0dWRlO1xuXG4gICAgICBwYXR0ZXJucy5wdXNoKGAkJHtpbmRleH06bmFtZTo6cG9pbnQgPEAgJCR7aW5kZXggKyAxfTo6Ym94YCk7XG4gICAgICB2YWx1ZXMucHVzaChmaWVsZE5hbWUsIGAoKCR7bGVmdH0sICR7Ym90dG9tfSksICgke3JpZ2h0fSwgJHt0b3B9KSlgKTtcbiAgICAgIGluZGV4ICs9IDI7XG4gICAgfVxuXG4gICAgaWYgKGZpZWxkVmFsdWUuJGdlb1dpdGhpbiAmJiBmaWVsZFZhbHVlLiRnZW9XaXRoaW4uJGNlbnRlclNwaGVyZSkge1xuICAgICAgY29uc3QgY2VudGVyU3BoZXJlID0gZmllbGRWYWx1ZS4kZ2VvV2l0aGluLiRjZW50ZXJTcGhlcmU7XG4gICAgICBpZiAoIShjZW50ZXJTcGhlcmUgaW5zdGFuY2VvZiBBcnJheSkgfHwgY2VudGVyU3BoZXJlLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFxuICAgICAgICAgIFBhcnNlLkVycm9yLklOVkFMSURfSlNPTixcbiAgICAgICAgICAnYmFkICRnZW9XaXRoaW4gdmFsdWU7ICRjZW50ZXJTcGhlcmUgc2hvdWxkIGJlIGFuIGFycmF5IG9mIFBhcnNlLkdlb1BvaW50IGFuZCBkaXN0YW5jZSdcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIC8vIEdldCBwb2ludCwgY29udmVydCB0byBnZW8gcG9pbnQgaWYgbmVjZXNzYXJ5IGFuZCB2YWxpZGF0ZVxuICAgICAgbGV0IHBvaW50ID0gY2VudGVyU3BoZXJlWzBdO1xuICAgICAgaWYgKHBvaW50IGluc3RhbmNlb2YgQXJyYXkgJiYgcG9pbnQubGVuZ3RoID09PSAyKSB7XG4gICAgICAgIHBvaW50ID0gbmV3IFBhcnNlLkdlb1BvaW50KHBvaW50WzFdLCBwb2ludFswXSk7XG4gICAgICB9IGVsc2UgaWYgKCFHZW9Qb2ludENvZGVyLmlzVmFsaWRKU09OKHBvaW50KSkge1xuICAgICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoXG4gICAgICAgICAgUGFyc2UuRXJyb3IuSU5WQUxJRF9KU09OLFxuICAgICAgICAgICdiYWQgJGdlb1dpdGhpbiB2YWx1ZTsgJGNlbnRlclNwaGVyZSBnZW8gcG9pbnQgaW52YWxpZCdcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIFBhcnNlLkdlb1BvaW50Ll92YWxpZGF0ZShwb2ludC5sYXRpdHVkZSwgcG9pbnQubG9uZ2l0dWRlKTtcbiAgICAgIC8vIEdldCBkaXN0YW5jZSBhbmQgdmFsaWRhdGVcbiAgICAgIGNvbnN0IGRpc3RhbmNlID0gY2VudGVyU3BoZXJlWzFdO1xuICAgICAgaWYgKGlzTmFOKGRpc3RhbmNlKSB8fCBkaXN0YW5jZSA8IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFxuICAgICAgICAgIFBhcnNlLkVycm9yLklOVkFMSURfSlNPTixcbiAgICAgICAgICAnYmFkICRnZW9XaXRoaW4gdmFsdWU7ICRjZW50ZXJTcGhlcmUgZGlzdGFuY2UgaW52YWxpZCdcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGRpc3RhbmNlSW5LTSA9IGRpc3RhbmNlICogNjM3MSAqIDEwMDA7XG4gICAgICBwYXR0ZXJucy5wdXNoKFxuICAgICAgICBgU1RfRGlzdGFuY2VTcGhlcmUoJCR7aW5kZXh9Om5hbWU6Omdlb21ldHJ5LCBQT0lOVCgkJHtpbmRleCArIDF9LCAkJHtcbiAgICAgICAgICBpbmRleCArIDJcbiAgICAgICAgfSk6Omdlb21ldHJ5KSA8PSAkJHtpbmRleCArIDN9YFxuICAgICAgKTtcbiAgICAgIHZhbHVlcy5wdXNoKGZpZWxkTmFtZSwgcG9pbnQubG9uZ2l0dWRlLCBwb2ludC5sYXRpdHVkZSwgZGlzdGFuY2VJbktNKTtcbiAgICAgIGluZGV4ICs9IDQ7XG4gICAgfVxuXG4gICAgaWYgKGZpZWxkVmFsdWUuJGdlb1dpdGhpbiAmJiBmaWVsZFZhbHVlLiRnZW9XaXRoaW4uJHBvbHlnb24pIHtcbiAgICAgIGNvbnN0IHBvbHlnb24gPSBmaWVsZFZhbHVlLiRnZW9XaXRoaW4uJHBvbHlnb247XG4gICAgICBsZXQgcG9pbnRzO1xuICAgICAgaWYgKHR5cGVvZiBwb2x5Z29uID09PSAnb2JqZWN0JyAmJiBwb2x5Z29uLl9fdHlwZSA9PT0gJ1BvbHlnb24nKSB7XG4gICAgICAgIGlmICghcG9seWdvbi5jb29yZGluYXRlcyB8fCBwb2x5Z29uLmNvb3JkaW5hdGVzLmxlbmd0aCA8IDMpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoXG4gICAgICAgICAgICBQYXJzZS5FcnJvci5JTlZBTElEX0pTT04sXG4gICAgICAgICAgICAnYmFkICRnZW9XaXRoaW4gdmFsdWU7IFBvbHlnb24uY29vcmRpbmF0ZXMgc2hvdWxkIGNvbnRhaW4gYXQgbGVhc3QgMyBsb24vbGF0IHBhaXJzJ1xuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcG9pbnRzID0gcG9seWdvbi5jb29yZGluYXRlcztcbiAgICAgIH0gZWxzZSBpZiAocG9seWdvbiBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICAgIGlmIChwb2x5Z29uLmxlbmd0aCA8IDMpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoXG4gICAgICAgICAgICBQYXJzZS5FcnJvci5JTlZBTElEX0pTT04sXG4gICAgICAgICAgICAnYmFkICRnZW9XaXRoaW4gdmFsdWU7ICRwb2x5Z29uIHNob3VsZCBjb250YWluIGF0IGxlYXN0IDMgR2VvUG9pbnRzJ1xuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcG9pbnRzID0gcG9seWdvbjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihcbiAgICAgICAgICBQYXJzZS5FcnJvci5JTlZBTElEX0pTT04sXG4gICAgICAgICAgXCJiYWQgJGdlb1dpdGhpbiB2YWx1ZTsgJHBvbHlnb24gc2hvdWxkIGJlIFBvbHlnb24gb2JqZWN0IG9yIEFycmF5IG9mIFBhcnNlLkdlb1BvaW50J3NcIlxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcG9pbnRzID0gcG9pbnRzXG4gICAgICAgIC5tYXAocG9pbnQgPT4ge1xuICAgICAgICAgIGlmIChwb2ludCBpbnN0YW5jZW9mIEFycmF5ICYmIHBvaW50Lmxlbmd0aCA9PT0gMikge1xuICAgICAgICAgICAgUGFyc2UuR2VvUG9pbnQuX3ZhbGlkYXRlKHBvaW50WzFdLCBwb2ludFswXSk7XG4gICAgICAgICAgICByZXR1cm4gYCgke3BvaW50WzBdfSwgJHtwb2ludFsxXX0pYDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHR5cGVvZiBwb2ludCAhPT0gJ29iamVjdCcgfHwgcG9pbnQuX190eXBlICE9PSAnR2VvUG9pbnQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuSU5WQUxJRF9KU09OLCAnYmFkICRnZW9XaXRoaW4gdmFsdWUnKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgUGFyc2UuR2VvUG9pbnQuX3ZhbGlkYXRlKHBvaW50LmxhdGl0dWRlLCBwb2ludC5sb25naXR1ZGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gYCgke3BvaW50LmxvbmdpdHVkZX0sICR7cG9pbnQubGF0aXR1ZGV9KWA7XG4gICAgICAgIH0pXG4gICAgICAgIC5qb2luKCcsICcpO1xuXG4gICAgICBwYXR0ZXJucy5wdXNoKGAkJHtpbmRleH06bmFtZTo6cG9pbnQgPEAgJCR7aW5kZXggKyAxfTo6cG9seWdvbmApO1xuICAgICAgdmFsdWVzLnB1c2goZmllbGROYW1lLCBgKCR7cG9pbnRzfSlgKTtcbiAgICAgIGluZGV4ICs9IDI7XG4gICAgfVxuICAgIGlmIChmaWVsZFZhbHVlLiRnZW9JbnRlcnNlY3RzICYmIGZpZWxkVmFsdWUuJGdlb0ludGVyc2VjdHMuJHBvaW50KSB7XG4gICAgICBjb25zdCBwb2ludCA9IGZpZWxkVmFsdWUuJGdlb0ludGVyc2VjdHMuJHBvaW50O1xuICAgICAgaWYgKHR5cGVvZiBwb2ludCAhPT0gJ29iamVjdCcgfHwgcG9pbnQuX190eXBlICE9PSAnR2VvUG9pbnQnKSB7XG4gICAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihcbiAgICAgICAgICBQYXJzZS5FcnJvci5JTlZBTElEX0pTT04sXG4gICAgICAgICAgJ2JhZCAkZ2VvSW50ZXJzZWN0IHZhbHVlOyAkcG9pbnQgc2hvdWxkIGJlIEdlb1BvaW50J1xuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgUGFyc2UuR2VvUG9pbnQuX3ZhbGlkYXRlKHBvaW50LmxhdGl0dWRlLCBwb2ludC5sb25naXR1ZGUpO1xuICAgICAgfVxuICAgICAgcGF0dGVybnMucHVzaChgJCR7aW5kZXh9Om5hbWU6OnBvbHlnb24gQD4gJCR7aW5kZXggKyAxfTo6cG9pbnRgKTtcbiAgICAgIHZhbHVlcy5wdXNoKGZpZWxkTmFtZSwgYCgke3BvaW50LmxvbmdpdHVkZX0sICR7cG9pbnQubGF0aXR1ZGV9KWApO1xuICAgICAgaW5kZXggKz0gMjtcbiAgICB9XG5cbiAgICBpZiAoZmllbGRWYWx1ZS4kcmVnZXgpIHtcbiAgICAgIGxldCByZWdleCA9IGZpZWxkVmFsdWUuJHJlZ2V4O1xuICAgICAgbGV0IG9wZXJhdG9yID0gJ34nO1xuICAgICAgY29uc3Qgb3B0cyA9IGZpZWxkVmFsdWUuJG9wdGlvbnM7XG4gICAgICBpZiAob3B0cykge1xuICAgICAgICBpZiAob3B0cy5pbmRleE9mKCdpJykgPj0gMCkge1xuICAgICAgICAgIG9wZXJhdG9yID0gJ34qJztcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0cy5pbmRleE9mKCd4JykgPj0gMCkge1xuICAgICAgICAgIHJlZ2V4ID0gcmVtb3ZlV2hpdGVTcGFjZShyZWdleCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgbmFtZSA9IHRyYW5zZm9ybURvdEZpZWxkKGZpZWxkTmFtZSk7XG4gICAgICByZWdleCA9IHByb2Nlc3NSZWdleFBhdHRlcm4ocmVnZXgpO1xuXG4gICAgICBwYXR0ZXJucy5wdXNoKGAkJHtpbmRleH06cmF3ICR7b3BlcmF0b3J9ICckJHtpbmRleCArIDF9OnJhdydgKTtcbiAgICAgIHZhbHVlcy5wdXNoKG5hbWUsIHJlZ2V4KTtcbiAgICAgIGluZGV4ICs9IDI7XG4gICAgfVxuXG4gICAgaWYgKGZpZWxkVmFsdWUuX190eXBlID09PSAnUG9pbnRlcicpIHtcbiAgICAgIGlmIChpc0FycmF5RmllbGQpIHtcbiAgICAgICAgcGF0dGVybnMucHVzaChgYXJyYXlfY29udGFpbnMoJCR7aW5kZXh9Om5hbWUsICQke2luZGV4ICsgMX0pYCk7XG4gICAgICAgIHZhbHVlcy5wdXNoKGZpZWxkTmFtZSwgSlNPTi5zdHJpbmdpZnkoW2ZpZWxkVmFsdWVdKSk7XG4gICAgICAgIGluZGV4ICs9IDI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwYXR0ZXJucy5wdXNoKGAkJHtpbmRleH06bmFtZSA9ICQke2luZGV4ICsgMX1gKTtcbiAgICAgICAgdmFsdWVzLnB1c2goZmllbGROYW1lLCBmaWVsZFZhbHVlLm9iamVjdElkKTtcbiAgICAgICAgaW5kZXggKz0gMjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZmllbGRWYWx1ZS5fX3R5cGUgPT09ICdEYXRlJykge1xuICAgICAgcGF0dGVybnMucHVzaChgJCR7aW5kZXh9Om5hbWUgPSAkJHtpbmRleCArIDF9YCk7XG4gICAgICB2YWx1ZXMucHVzaChmaWVsZE5hbWUsIGZpZWxkVmFsdWUuaXNvKTtcbiAgICAgIGluZGV4ICs9IDI7XG4gICAgfVxuXG4gICAgaWYgKGZpZWxkVmFsdWUuX190eXBlID09PSAnR2VvUG9pbnQnKSB7XG4gICAgICBwYXR0ZXJucy5wdXNoKGAkJHtpbmRleH06bmFtZSB+PSBQT0lOVCgkJHtpbmRleCArIDF9LCAkJHtpbmRleCArIDJ9KWApO1xuICAgICAgdmFsdWVzLnB1c2goZmllbGROYW1lLCBmaWVsZFZhbHVlLmxvbmdpdHVkZSwgZmllbGRWYWx1ZS5sYXRpdHVkZSk7XG4gICAgICBpbmRleCArPSAzO1xuICAgIH1cblxuICAgIGlmIChmaWVsZFZhbHVlLl9fdHlwZSA9PT0gJ1BvbHlnb24nKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IGNvbnZlcnRQb2x5Z29uVG9TUUwoZmllbGRWYWx1ZS5jb29yZGluYXRlcyk7XG4gICAgICBwYXR0ZXJucy5wdXNoKGAkJHtpbmRleH06bmFtZSB+PSAkJHtpbmRleCArIDF9Ojpwb2x5Z29uYCk7XG4gICAgICB2YWx1ZXMucHVzaChmaWVsZE5hbWUsIHZhbHVlKTtcbiAgICAgIGluZGV4ICs9IDI7XG4gICAgfVxuXG4gICAgT2JqZWN0LmtleXMoUGFyc2VUb1Bvc2dyZXNDb21wYXJhdG9yKS5mb3JFYWNoKGNtcCA9PiB7XG4gICAgICBpZiAoZmllbGRWYWx1ZVtjbXBdIHx8IGZpZWxkVmFsdWVbY21wXSA9PT0gMCkge1xuICAgICAgICBjb25zdCBwZ0NvbXBhcmF0b3IgPSBQYXJzZVRvUG9zZ3Jlc0NvbXBhcmF0b3JbY21wXTtcbiAgICAgICAgbGV0IGNvbnN0cmFpbnRGaWVsZE5hbWU7XG4gICAgICAgIGxldCBwb3N0Z3Jlc1ZhbHVlID0gdG9Qb3N0Z3Jlc1ZhbHVlKGZpZWxkVmFsdWVbY21wXSk7XG5cbiAgICAgICAgaWYgKGZpZWxkTmFtZS5pbmRleE9mKCcuJykgPj0gMCkge1xuICAgICAgICAgIGNvbnN0IGNhc3RUeXBlID0gdG9Qb3N0Z3Jlc1ZhbHVlQ2FzdFR5cGUoZmllbGRWYWx1ZVtjbXBdKTtcbiAgICAgICAgICBjb25zdHJhaW50RmllbGROYW1lID0gY2FzdFR5cGVcbiAgICAgICAgICAgID8gYENBU1QgKCgke3RyYW5zZm9ybURvdEZpZWxkKGZpZWxkTmFtZSl9KSBBUyAke2Nhc3RUeXBlfSlgXG4gICAgICAgICAgICA6IHRyYW5zZm9ybURvdEZpZWxkKGZpZWxkTmFtZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBwb3N0Z3Jlc1ZhbHVlID09PSAnb2JqZWN0JyAmJiBwb3N0Z3Jlc1ZhbHVlLiRyZWxhdGl2ZVRpbWUpIHtcbiAgICAgICAgICAgIGlmIChzY2hlbWEuZmllbGRzW2ZpZWxkTmFtZV0udHlwZSAhPT0gJ0RhdGUnKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihcbiAgICAgICAgICAgICAgICBQYXJzZS5FcnJvci5JTlZBTElEX0pTT04sXG4gICAgICAgICAgICAgICAgJyRyZWxhdGl2ZVRpbWUgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIERhdGUgZmllbGQnXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBwYXJzZXJSZXN1bHQgPSBVdGlscy5yZWxhdGl2ZVRpbWVUb0RhdGUocG9zdGdyZXNWYWx1ZS4kcmVsYXRpdmVUaW1lKTtcbiAgICAgICAgICAgIGlmIChwYXJzZXJSZXN1bHQuc3RhdHVzID09PSAnc3VjY2VzcycpIHtcbiAgICAgICAgICAgICAgcG9zdGdyZXNWYWx1ZSA9IHRvUG9zdGdyZXNWYWx1ZShwYXJzZXJSZXN1bHQucmVzdWx0KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHdoaWxlIHBhcnNpbmcgcmVsYXRpdmUgZGF0ZScsIHBhcnNlclJlc3VsdCk7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihcbiAgICAgICAgICAgICAgICBQYXJzZS5FcnJvci5JTlZBTElEX0pTT04sXG4gICAgICAgICAgICAgICAgYGJhZCAkcmVsYXRpdmVUaW1lICgke3Bvc3RncmVzVmFsdWUuJHJlbGF0aXZlVGltZX0pIHZhbHVlLiAke3BhcnNlclJlc3VsdC5pbmZvfWBcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3RyYWludEZpZWxkTmFtZSA9IGAkJHtpbmRleCsrfTpuYW1lYDtcbiAgICAgICAgICB2YWx1ZXMucHVzaChmaWVsZE5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIHZhbHVlcy5wdXNoKHBvc3RncmVzVmFsdWUpO1xuICAgICAgICBwYXR0ZXJucy5wdXNoKGAke2NvbnN0cmFpbnRGaWVsZE5hbWV9ICR7cGdDb21wYXJhdG9yfSAkJHtpbmRleCsrfWApO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKGluaXRpYWxQYXR0ZXJuc0xlbmd0aCA9PT0gcGF0dGVybnMubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoXG4gICAgICAgIFBhcnNlLkVycm9yLk9QRVJBVElPTl9GT1JCSURERU4sXG4gICAgICAgIGBQb3N0Z3JlcyBkb2Vzbid0IHN1cHBvcnQgdGhpcyBxdWVyeSB0eXBlIHlldCAke0pTT04uc3RyaW5naWZ5KGZpZWxkVmFsdWUpfWBcbiAgICAgICk7XG4gICAgfVxuICB9XG4gIHZhbHVlcyA9IHZhbHVlcy5tYXAodHJhbnNmb3JtVmFsdWUpO1xuICByZXR1cm4geyBwYXR0ZXJuOiBwYXR0ZXJucy5qb2luKCcgQU5EICcpLCB2YWx1ZXMsIHNvcnRzIH07XG59O1xuXG5leHBvcnQgY2xhc3MgUG9zdGdyZXNTdG9yYWdlQWRhcHRlciBpbXBsZW1lbnRzIFN0b3JhZ2VBZGFwdGVyIHtcbiAgY2FuU29ydE9uSm9pblRhYmxlczogYm9vbGVhbjtcbiAgZW5hYmxlU2NoZW1hSG9va3M6IGJvb2xlYW47XG5cbiAgLy8gUHJpdmF0ZVxuICBfY29sbGVjdGlvblByZWZpeDogc3RyaW5nO1xuICBfY2xpZW50OiBhbnk7XG4gIF9vbmNoYW5nZTogYW55O1xuICBfcGdwOiBhbnk7XG4gIF9zdHJlYW06IGFueTtcbiAgX3V1aWQ6IGFueTtcblxuICBjb25zdHJ1Y3Rvcih7IHVyaSwgY29sbGVjdGlvblByZWZpeCA9ICcnLCBkYXRhYmFzZU9wdGlvbnMgPSB7fSB9OiBhbnkpIHtcbiAgICB0aGlzLl9jb2xsZWN0aW9uUHJlZml4ID0gY29sbGVjdGlvblByZWZpeDtcbiAgICB0aGlzLmVuYWJsZVNjaGVtYUhvb2tzID0gISFkYXRhYmFzZU9wdGlvbnMuZW5hYmxlU2NoZW1hSG9va3M7XG4gICAgZGVsZXRlIGRhdGFiYXNlT3B0aW9ucy5lbmFibGVTY2hlbWFIb29rcztcblxuICAgIGNvbnN0IHsgY2xpZW50LCBwZ3AgfSA9IGNyZWF0ZUNsaWVudCh1cmksIGRhdGFiYXNlT3B0aW9ucyk7XG4gICAgdGhpcy5fY2xpZW50ID0gY2xpZW50O1xuICAgIHRoaXMuX29uY2hhbmdlID0gKCkgPT4ge307XG4gICAgdGhpcy5fcGdwID0gcGdwO1xuICAgIHRoaXMuX3V1aWQgPSB1dWlkdjQoKTtcbiAgICB0aGlzLmNhblNvcnRPbkpvaW5UYWJsZXMgPSBmYWxzZTtcbiAgfVxuXG4gIHdhdGNoKGNhbGxiYWNrOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5fb25jaGFuZ2UgPSBjYWxsYmFjaztcbiAgfVxuXG4gIC8vTm90ZSB0aGF0IGFuYWx5emU9dHJ1ZSB3aWxsIHJ1biB0aGUgcXVlcnksIGV4ZWN1dGluZyBJTlNFUlRTLCBERUxFVEVTLCBldGMuXG4gIGNyZWF0ZUV4cGxhaW5hYmxlUXVlcnkocXVlcnk6IHN0cmluZywgYW5hbHl6ZTogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgaWYgKGFuYWx5emUpIHtcbiAgICAgIHJldHVybiAnRVhQTEFJTiAoQU5BTFlaRSwgRk9STUFUIEpTT04pICcgKyBxdWVyeTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuICdFWFBMQUlOIChGT1JNQVQgSlNPTikgJyArIHF1ZXJ5O1xuICAgIH1cbiAgfVxuXG4gIGhhbmRsZVNodXRkb3duKCkge1xuICAgIGlmICh0aGlzLl9zdHJlYW0pIHtcbiAgICAgIHRoaXMuX3N0cmVhbS5kb25lKCk7XG4gICAgICBkZWxldGUgdGhpcy5fc3RyZWFtO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuX2NsaWVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9jbGllbnQuJHBvb2wuZW5kKCk7XG4gIH1cblxuICBhc3luYyBfbGlzdGVuVG9TY2hlbWEoKSB7XG4gICAgaWYgKCF0aGlzLl9zdHJlYW0gJiYgdGhpcy5lbmFibGVTY2hlbWFIb29rcykge1xuICAgICAgdGhpcy5fc3RyZWFtID0gYXdhaXQgdGhpcy5fY2xpZW50LmNvbm5lY3QoeyBkaXJlY3Q6IHRydWUgfSk7XG4gICAgICB0aGlzLl9zdHJlYW0uY2xpZW50Lm9uKCdub3RpZmljYXRpb24nLCBkYXRhID0+IHtcbiAgICAgICAgY29uc3QgcGF5bG9hZCA9IEpTT04ucGFyc2UoZGF0YS5wYXlsb2FkKTtcbiAgICAgICAgaWYgKHBheWxvYWQuc2VuZGVySWQgIT09IHRoaXMuX3V1aWQpIHtcbiAgICAgICAgICB0aGlzLl9vbmNoYW5nZSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGF3YWl0IHRoaXMuX3N0cmVhbS5ub25lKCdMSVNURU4gJDF+JywgJ3NjaGVtYS5jaGFuZ2UnKTtcbiAgICB9XG4gIH1cblxuICBfbm90aWZ5U2NoZW1hQ2hhbmdlKCkge1xuICAgIGlmICh0aGlzLl9zdHJlYW0pIHtcbiAgICAgIHRoaXMuX3N0cmVhbVxuICAgICAgICAubm9uZSgnTk9USUZZICQxfiwgJDInLCBbJ3NjaGVtYS5jaGFuZ2UnLCB7IHNlbmRlcklkOiB0aGlzLl91dWlkIH1dKVxuICAgICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICAgIGNvbnNvbGUubG9nKCdGYWlsZWQgdG8gTm90aWZ5OicsIGVycm9yKTsgLy8gdW5saWtlbHkgdG8gZXZlciBoYXBwZW5cbiAgICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgX2Vuc3VyZVNjaGVtYUNvbGxlY3Rpb25FeGlzdHMoY29ubjogYW55KSB7XG4gICAgY29ubiA9IGNvbm4gfHwgdGhpcy5fY2xpZW50O1xuICAgIGF3YWl0IGNvbm5cbiAgICAgIC5ub25lKFxuICAgICAgICAnQ1JFQVRFIFRBQkxFIElGIE5PVCBFWElTVFMgXCJfU0NIRU1BXCIgKCBcImNsYXNzTmFtZVwiIHZhckNoYXIoMTIwKSwgXCJzY2hlbWFcIiBqc29uYiwgXCJpc1BhcnNlQ2xhc3NcIiBib29sLCBQUklNQVJZIEtFWSAoXCJjbGFzc05hbWVcIikgKSdcbiAgICAgIClcbiAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfSk7XG4gIH1cblxuICBhc3luYyBjbGFzc0V4aXN0cyhuYW1lOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5fY2xpZW50Lm9uZShcbiAgICAgICdTRUxFQ1QgRVhJU1RTIChTRUxFQ1QgMSBGUk9NIGluZm9ybWF0aW9uX3NjaGVtYS50YWJsZXMgV0hFUkUgdGFibGVfbmFtZSA9ICQxKScsXG4gICAgICBbbmFtZV0sXG4gICAgICBhID0+IGEuZXhpc3RzXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIHNldENsYXNzTGV2ZWxQZXJtaXNzaW9ucyhjbGFzc05hbWU6IHN0cmluZywgQ0xQczogYW55KSB7XG4gICAgYXdhaXQgdGhpcy5fY2xpZW50LnRhc2soJ3NldC1jbGFzcy1sZXZlbC1wZXJtaXNzaW9ucycsIGFzeW5jIHQgPT4ge1xuICAgICAgY29uc3QgdmFsdWVzID0gW2NsYXNzTmFtZSwgJ3NjaGVtYScsICdjbGFzc0xldmVsUGVybWlzc2lvbnMnLCBKU09OLnN0cmluZ2lmeShDTFBzKV07XG4gICAgICBhd2FpdCB0Lm5vbmUoXG4gICAgICAgIGBVUERBVEUgXCJfU0NIRU1BXCIgU0VUICQyOm5hbWUgPSBqc29uX29iamVjdF9zZXRfa2V5KCQyOm5hbWUsICQzOjp0ZXh0LCAkNDo6anNvbmIpIFdIRVJFIFwiY2xhc3NOYW1lXCIgPSAkMWAsXG4gICAgICAgIHZhbHVlc1xuICAgICAgKTtcbiAgICB9KTtcbiAgICB0aGlzLl9ub3RpZnlTY2hlbWFDaGFuZ2UoKTtcbiAgfVxuXG4gIGFzeW5jIHNldEluZGV4ZXNXaXRoU2NoZW1hRm9ybWF0KFxuICAgIGNsYXNzTmFtZTogc3RyaW5nLFxuICAgIHN1Ym1pdHRlZEluZGV4ZXM6IGFueSxcbiAgICBleGlzdGluZ0luZGV4ZXM6IGFueSA9IHt9LFxuICAgIGZpZWxkczogYW55LFxuICAgIGNvbm46ID9hbnlcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29ubiA9IGNvbm4gfHwgdGhpcy5fY2xpZW50O1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIGlmIChzdWJtaXR0ZWRJbmRleGVzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICB9XG4gICAgaWYgKE9iamVjdC5rZXlzKGV4aXN0aW5nSW5kZXhlcykubGVuZ3RoID09PSAwKSB7XG4gICAgICBleGlzdGluZ0luZGV4ZXMgPSB7IF9pZF86IHsgX2lkOiAxIH0gfTtcbiAgICB9XG4gICAgY29uc3QgZGVsZXRlZEluZGV4ZXMgPSBbXTtcbiAgICBjb25zdCBpbnNlcnRlZEluZGV4ZXMgPSBbXTtcbiAgICBPYmplY3Qua2V5cyhzdWJtaXR0ZWRJbmRleGVzKS5mb3JFYWNoKG5hbWUgPT4ge1xuICAgICAgY29uc3QgZmllbGQgPSBzdWJtaXR0ZWRJbmRleGVzW25hbWVdO1xuICAgICAgaWYgKGV4aXN0aW5nSW5kZXhlc1tuYW1lXSAmJiBmaWVsZC5fX29wICE9PSAnRGVsZXRlJykge1xuICAgICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuSU5WQUxJRF9RVUVSWSwgYEluZGV4ICR7bmFtZX0gZXhpc3RzLCBjYW5ub3QgdXBkYXRlLmApO1xuICAgICAgfVxuICAgICAgaWYgKCFleGlzdGluZ0luZGV4ZXNbbmFtZV0gJiYgZmllbGQuX19vcCA9PT0gJ0RlbGV0ZScpIHtcbiAgICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFxuICAgICAgICAgIFBhcnNlLkVycm9yLklOVkFMSURfUVVFUlksXG4gICAgICAgICAgYEluZGV4ICR7bmFtZX0gZG9lcyBub3QgZXhpc3QsIGNhbm5vdCBkZWxldGUuYFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKGZpZWxkLl9fb3AgPT09ICdEZWxldGUnKSB7XG4gICAgICAgIGRlbGV0ZWRJbmRleGVzLnB1c2gobmFtZSk7XG4gICAgICAgIGRlbGV0ZSBleGlzdGluZ0luZGV4ZXNbbmFtZV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBPYmplY3Qua2V5cyhmaWVsZCkuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGZpZWxkcywga2V5KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFxuICAgICAgICAgICAgICBQYXJzZS5FcnJvci5JTlZBTElEX1FVRVJZLFxuICAgICAgICAgICAgICBgRmllbGQgJHtrZXl9IGRvZXMgbm90IGV4aXN0LCBjYW5ub3QgYWRkIGluZGV4LmBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgZXhpc3RpbmdJbmRleGVzW25hbWVdID0gZmllbGQ7XG4gICAgICAgIGluc2VydGVkSW5kZXhlcy5wdXNoKHtcbiAgICAgICAgICBrZXk6IGZpZWxkLFxuICAgICAgICAgIG5hbWUsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGF3YWl0IGNvbm4udHgoJ3NldC1pbmRleGVzLXdpdGgtc2NoZW1hLWZvcm1hdCcsIGFzeW5jIHQgPT4ge1xuICAgICAgaWYgKGluc2VydGVkSW5kZXhlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGF3YWl0IHNlbGYuY3JlYXRlSW5kZXhlcyhjbGFzc05hbWUsIGluc2VydGVkSW5kZXhlcywgdCk7XG4gICAgICB9XG4gICAgICBpZiAoZGVsZXRlZEluZGV4ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBhd2FpdCBzZWxmLmRyb3BJbmRleGVzKGNsYXNzTmFtZSwgZGVsZXRlZEluZGV4ZXMsIHQpO1xuICAgICAgfVxuICAgICAgYXdhaXQgdC5ub25lKFxuICAgICAgICAnVVBEQVRFIFwiX1NDSEVNQVwiIFNFVCAkMjpuYW1lID0ganNvbl9vYmplY3Rfc2V0X2tleSgkMjpuYW1lLCAkMzo6dGV4dCwgJDQ6Ompzb25iKSBXSEVSRSBcImNsYXNzTmFtZVwiID0gJDEnLFxuICAgICAgICBbY2xhc3NOYW1lLCAnc2NoZW1hJywgJ2luZGV4ZXMnLCBKU09OLnN0cmluZ2lmeShleGlzdGluZ0luZGV4ZXMpXVxuICAgICAgKTtcbiAgICB9KTtcbiAgICB0aGlzLl9ub3RpZnlTY2hlbWFDaGFuZ2UoKTtcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZUNsYXNzKGNsYXNzTmFtZTogc3RyaW5nLCBzY2hlbWE6IFNjaGVtYVR5cGUsIGNvbm46ID9hbnkpIHtcbiAgICBjb25uID0gY29ubiB8fCB0aGlzLl9jbGllbnQ7XG4gICAgY29uc3QgcGFyc2VTY2hlbWEgPSBhd2FpdCBjb25uXG4gICAgICAudHgoJ2NyZWF0ZS1jbGFzcycsIGFzeW5jIHQgPT4ge1xuICAgICAgICBhd2FpdCB0aGlzLmNyZWF0ZVRhYmxlKGNsYXNzTmFtZSwgc2NoZW1hLCB0KTtcbiAgICAgICAgYXdhaXQgdC5ub25lKFxuICAgICAgICAgICdJTlNFUlQgSU5UTyBcIl9TQ0hFTUFcIiAoXCJjbGFzc05hbWVcIiwgXCJzY2hlbWFcIiwgXCJpc1BhcnNlQ2xhc3NcIikgVkFMVUVTICgkPGNsYXNzTmFtZT4sICQ8c2NoZW1hPiwgdHJ1ZSknLFxuICAgICAgICAgIHsgY2xhc3NOYW1lLCBzY2hlbWEgfVxuICAgICAgICApO1xuICAgICAgICBhd2FpdCB0aGlzLnNldEluZGV4ZXNXaXRoU2NoZW1hRm9ybWF0KGNsYXNzTmFtZSwgc2NoZW1hLmluZGV4ZXMsIHt9LCBzY2hlbWEuZmllbGRzLCB0KTtcbiAgICAgICAgcmV0dXJuIHRvUGFyc2VTY2hlbWEoc2NoZW1hKTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgaWYgKGVyci5jb2RlID09PSBQb3N0Z3Jlc1VuaXF1ZUluZGV4VmlvbGF0aW9uRXJyb3IgJiYgZXJyLmRldGFpbC5pbmNsdWRlcyhjbGFzc05hbWUpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLkRVUExJQ0FURV9WQUxVRSwgYENsYXNzICR7Y2xhc3NOYW1lfSBhbHJlYWR5IGV4aXN0cy5gKTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlcnI7XG4gICAgICB9KTtcbiAgICB0aGlzLl9ub3RpZnlTY2hlbWFDaGFuZ2UoKTtcbiAgICByZXR1cm4gcGFyc2VTY2hlbWE7XG4gIH1cblxuICAvLyBKdXN0IGNyZWF0ZSBhIHRhYmxlLCBkbyBub3QgaW5zZXJ0IGluIHNjaGVtYVxuICBhc3luYyBjcmVhdGVUYWJsZShjbGFzc05hbWU6IHN0cmluZywgc2NoZW1hOiBTY2hlbWFUeXBlLCBjb25uOiBhbnkpIHtcbiAgICBjb25uID0gY29ubiB8fCB0aGlzLl9jbGllbnQ7XG4gICAgZGVidWcoJ2NyZWF0ZVRhYmxlJyk7XG4gICAgY29uc3QgdmFsdWVzQXJyYXkgPSBbXTtcbiAgICBjb25zdCBwYXR0ZXJuc0FycmF5ID0gW107XG4gICAgY29uc3QgZmllbGRzID0gT2JqZWN0LmFzc2lnbih7fSwgc2NoZW1hLmZpZWxkcyk7XG4gICAgaWYgKGNsYXNzTmFtZSA9PT0gJ19Vc2VyJykge1xuICAgICAgZmllbGRzLl9lbWFpbF92ZXJpZnlfdG9rZW5fZXhwaXJlc19hdCA9IHsgdHlwZTogJ0RhdGUnIH07XG4gICAgICBmaWVsZHMuX2VtYWlsX3ZlcmlmeV90b2tlbiA9IHsgdHlwZTogJ1N0cmluZycgfTtcbiAgICAgIGZpZWxkcy5fYWNjb3VudF9sb2Nrb3V0X2V4cGlyZXNfYXQgPSB7IHR5cGU6ICdEYXRlJyB9O1xuICAgICAgZmllbGRzLl9mYWlsZWRfbG9naW5fY291bnQgPSB7IHR5cGU6ICdOdW1iZXInIH07XG4gICAgICBmaWVsZHMuX3BlcmlzaGFibGVfdG9rZW4gPSB7IHR5cGU6ICdTdHJpbmcnIH07XG4gICAgICBmaWVsZHMuX3BlcmlzaGFibGVfdG9rZW5fZXhwaXJlc19hdCA9IHsgdHlwZTogJ0RhdGUnIH07XG4gICAgICBmaWVsZHMuX3Bhc3N3b3JkX2NoYW5nZWRfYXQgPSB7IHR5cGU6ICdEYXRlJyB9O1xuICAgICAgZmllbGRzLl9wYXNzd29yZF9oaXN0b3J5ID0geyB0eXBlOiAnQXJyYXknIH07XG4gICAgfVxuICAgIGxldCBpbmRleCA9IDI7XG4gICAgY29uc3QgcmVsYXRpb25zID0gW107XG4gICAgT2JqZWN0LmtleXMoZmllbGRzKS5mb3JFYWNoKGZpZWxkTmFtZSA9PiB7XG4gICAgICBjb25zdCBwYXJzZVR5cGUgPSBmaWVsZHNbZmllbGROYW1lXTtcbiAgICAgIC8vIFNraXAgd2hlbiBpdCdzIGEgcmVsYXRpb25cbiAgICAgIC8vIFdlJ2xsIGNyZWF0ZSB0aGUgdGFibGVzIGxhdGVyXG4gICAgICBpZiAocGFyc2VUeXBlLnR5cGUgPT09ICdSZWxhdGlvbicpIHtcbiAgICAgICAgcmVsYXRpb25zLnB1c2goZmllbGROYW1lKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKFsnX3JwZXJtJywgJ193cGVybSddLmluZGV4T2YoZmllbGROYW1lKSA+PSAwKSB7XG4gICAgICAgIHBhcnNlVHlwZS5jb250ZW50cyA9IHsgdHlwZTogJ1N0cmluZycgfTtcbiAgICAgIH1cbiAgICAgIHZhbHVlc0FycmF5LnB1c2goZmllbGROYW1lKTtcbiAgICAgIHZhbHVlc0FycmF5LnB1c2gocGFyc2VUeXBlVG9Qb3N0Z3Jlc1R5cGUocGFyc2VUeXBlKSk7XG4gICAgICBwYXR0ZXJuc0FycmF5LnB1c2goYCQke2luZGV4fTpuYW1lICQke2luZGV4ICsgMX06cmF3YCk7XG4gICAgICBpZiAoZmllbGROYW1lID09PSAnb2JqZWN0SWQnKSB7XG4gICAgICAgIHBhdHRlcm5zQXJyYXkucHVzaChgUFJJTUFSWSBLRVkgKCQke2luZGV4fTpuYW1lKWApO1xuICAgICAgfVxuICAgICAgaW5kZXggPSBpbmRleCArIDI7XG4gICAgfSk7XG4gICAgY29uc3QgcXMgPSBgQ1JFQVRFIFRBQkxFIElGIE5PVCBFWElTVFMgJDE6bmFtZSAoJHtwYXR0ZXJuc0FycmF5LmpvaW4oKX0pYDtcbiAgICBjb25zdCB2YWx1ZXMgPSBbY2xhc3NOYW1lLCAuLi52YWx1ZXNBcnJheV07XG5cbiAgICByZXR1cm4gY29ubi50YXNrKCdjcmVhdGUtdGFibGUnLCBhc3luYyB0ID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHQubm9uZShxcywgdmFsdWVzKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChlcnJvci5jb2RlICE9PSBQb3N0Z3Jlc0R1cGxpY2F0ZVJlbGF0aW9uRXJyb3IpIHtcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICAvLyBFTFNFOiBUYWJsZSBhbHJlYWR5IGV4aXN0cywgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCBieSBhIGRpZmZlcmVudCByZXF1ZXN0LiBJZ25vcmUgdGhlIGVycm9yLlxuICAgICAgfVxuICAgICAgYXdhaXQgdC50eCgnY3JlYXRlLXRhYmxlLXR4JywgdHggPT4ge1xuICAgICAgICByZXR1cm4gdHguYmF0Y2goXG4gICAgICAgICAgcmVsYXRpb25zLm1hcChmaWVsZE5hbWUgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHR4Lm5vbmUoXG4gICAgICAgICAgICAgICdDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyAkPGpvaW5UYWJsZTpuYW1lPiAoXCJyZWxhdGVkSWRcIiB2YXJDaGFyKDEyMCksIFwib3duaW5nSWRcIiB2YXJDaGFyKDEyMCksIFBSSU1BUlkgS0VZKFwicmVsYXRlZElkXCIsIFwib3duaW5nSWRcIikgKScsXG4gICAgICAgICAgICAgIHsgam9pblRhYmxlOiBgX0pvaW46JHtmaWVsZE5hbWV9OiR7Y2xhc3NOYW1lfWAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBzY2hlbWFVcGdyYWRlKGNsYXNzTmFtZTogc3RyaW5nLCBzY2hlbWE6IFNjaGVtYVR5cGUsIGNvbm46IGFueSkge1xuICAgIGRlYnVnKCdzY2hlbWFVcGdyYWRlJyk7XG4gICAgY29ubiA9IGNvbm4gfHwgdGhpcy5fY2xpZW50O1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuXG4gICAgYXdhaXQgY29ubi50YXNrKCdzY2hlbWEtdXBncmFkZScsIGFzeW5jIHQgPT4ge1xuICAgICAgY29uc3QgY29sdW1ucyA9IGF3YWl0IHQubWFwKFxuICAgICAgICAnU0VMRUNUIGNvbHVtbl9uYW1lIEZST00gaW5mb3JtYXRpb25fc2NoZW1hLmNvbHVtbnMgV0hFUkUgdGFibGVfbmFtZSA9ICQ8Y2xhc3NOYW1lPicsXG4gICAgICAgIHsgY2xhc3NOYW1lIH0sXG4gICAgICAgIGEgPT4gYS5jb2x1bW5fbmFtZVxuICAgICAgKTtcbiAgICAgIGNvbnN0IG5ld0NvbHVtbnMgPSBPYmplY3Qua2V5cyhzY2hlbWEuZmllbGRzKVxuICAgICAgICAuZmlsdGVyKGl0ZW0gPT4gY29sdW1ucy5pbmRleE9mKGl0ZW0pID09PSAtMSlcbiAgICAgICAgLm1hcChmaWVsZE5hbWUgPT4gc2VsZi5hZGRGaWVsZElmTm90RXhpc3RzKGNsYXNzTmFtZSwgZmllbGROYW1lLCBzY2hlbWEuZmllbGRzW2ZpZWxkTmFtZV0pKTtcblxuICAgICAgYXdhaXQgdC5iYXRjaChuZXdDb2x1bW5zKTtcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGFkZEZpZWxkSWZOb3RFeGlzdHMoY2xhc3NOYW1lOiBzdHJpbmcsIGZpZWxkTmFtZTogc3RyaW5nLCB0eXBlOiBhbnkpIHtcbiAgICAvLyBUT0RPOiBNdXN0IGJlIHJldmlzZWQgZm9yIGludmFsaWQgbG9naWMuLi5cbiAgICBkZWJ1ZygnYWRkRmllbGRJZk5vdEV4aXN0cycpO1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIGF3YWl0IHRoaXMuX2NsaWVudC50eCgnYWRkLWZpZWxkLWlmLW5vdC1leGlzdHMnLCBhc3luYyB0ID0+IHtcbiAgICAgIGlmICh0eXBlLnR5cGUgIT09ICdSZWxhdGlvbicpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCB0Lm5vbmUoXG4gICAgICAgICAgICAnQUxURVIgVEFCTEUgJDxjbGFzc05hbWU6bmFtZT4gQUREIENPTFVNTiBJRiBOT1QgRVhJU1RTICQ8ZmllbGROYW1lOm5hbWU+ICQ8cG9zdGdyZXNUeXBlOnJhdz4nLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBjbGFzc05hbWUsXG4gICAgICAgICAgICAgIGZpZWxkTmFtZSxcbiAgICAgICAgICAgICAgcG9zdGdyZXNUeXBlOiBwYXJzZVR5cGVUb1Bvc3RncmVzVHlwZSh0eXBlKSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGlmIChlcnJvci5jb2RlID09PSBQb3N0Z3Jlc1JlbGF0aW9uRG9lc05vdEV4aXN0RXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBzZWxmLmNyZWF0ZUNsYXNzKGNsYXNzTmFtZSwgeyBmaWVsZHM6IHsgW2ZpZWxkTmFtZV06IHR5cGUgfSB9LCB0KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGVycm9yLmNvZGUgIT09IFBvc3RncmVzRHVwbGljYXRlQ29sdW1uRXJyb3IpIHtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBDb2x1bW4gYWxyZWFkeSBleGlzdHMsIGNyZWF0ZWQgYnkgb3RoZXIgcmVxdWVzdC4gQ2Fycnkgb24gdG8gc2VlIGlmIGl0J3MgdGhlIHJpZ2h0IHR5cGUuXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGF3YWl0IHQubm9uZShcbiAgICAgICAgICAnQ1JFQVRFIFRBQkxFIElGIE5PVCBFWElTVFMgJDxqb2luVGFibGU6bmFtZT4gKFwicmVsYXRlZElkXCIgdmFyQ2hhcigxMjApLCBcIm93bmluZ0lkXCIgdmFyQ2hhcigxMjApLCBQUklNQVJZIEtFWShcInJlbGF0ZWRJZFwiLCBcIm93bmluZ0lkXCIpICknLFxuICAgICAgICAgIHsgam9pblRhYmxlOiBgX0pvaW46JHtmaWVsZE5hbWV9OiR7Y2xhc3NOYW1lfWAgfVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0LmFueShcbiAgICAgICAgJ1NFTEVDVCBcInNjaGVtYVwiIEZST00gXCJfU0NIRU1BXCIgV0hFUkUgXCJjbGFzc05hbWVcIiA9ICQ8Y2xhc3NOYW1lPiBhbmQgKFwic2NoZW1hXCI6Ompzb24tPlxcJ2ZpZWxkc1xcJy0+JDxmaWVsZE5hbWU+KSBpcyBub3QgbnVsbCcsXG4gICAgICAgIHsgY2xhc3NOYW1lLCBmaWVsZE5hbWUgfVxuICAgICAgKTtcblxuICAgICAgaWYgKHJlc3VsdFswXSkge1xuICAgICAgICB0aHJvdyAnQXR0ZW1wdGVkIHRvIGFkZCBhIGZpZWxkIHRoYXQgYWxyZWFkeSBleGlzdHMnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcGF0aCA9IGB7ZmllbGRzLCR7ZmllbGROYW1lfX1gO1xuICAgICAgICBhd2FpdCB0Lm5vbmUoXG4gICAgICAgICAgJ1VQREFURSBcIl9TQ0hFTUFcIiBTRVQgXCJzY2hlbWFcIj1qc29uYl9zZXQoXCJzY2hlbWFcIiwgJDxwYXRoPiwgJDx0eXBlPikgIFdIRVJFIFwiY2xhc3NOYW1lXCI9JDxjbGFzc05hbWU+JyxcbiAgICAgICAgICB7IHBhdGgsIHR5cGUsIGNsYXNzTmFtZSB9XG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5fbm90aWZ5U2NoZW1hQ2hhbmdlKCk7XG4gIH1cblxuICBhc3luYyB1cGRhdGVGaWVsZE9wdGlvbnMoY2xhc3NOYW1lOiBzdHJpbmcsIGZpZWxkTmFtZTogc3RyaW5nLCB0eXBlOiBhbnkpIHtcbiAgICBhd2FpdCB0aGlzLl9jbGllbnQudHgoJ3VwZGF0ZS1zY2hlbWEtZmllbGQtb3B0aW9ucycsIGFzeW5jIHQgPT4ge1xuICAgICAgY29uc3QgcGF0aCA9IGB7ZmllbGRzLCR7ZmllbGROYW1lfX1gO1xuICAgICAgYXdhaXQgdC5ub25lKFxuICAgICAgICAnVVBEQVRFIFwiX1NDSEVNQVwiIFNFVCBcInNjaGVtYVwiPWpzb25iX3NldChcInNjaGVtYVwiLCAkPHBhdGg+LCAkPHR5cGU+KSAgV0hFUkUgXCJjbGFzc05hbWVcIj0kPGNsYXNzTmFtZT4nLFxuICAgICAgICB7IHBhdGgsIHR5cGUsIGNsYXNzTmFtZSB9XG4gICAgICApO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gRHJvcHMgYSBjb2xsZWN0aW9uLiBSZXNvbHZlcyB3aXRoIHRydWUgaWYgaXQgd2FzIGEgUGFyc2UgU2NoZW1hIChlZy4gX1VzZXIsIEN1c3RvbSwgZXRjLilcbiAgLy8gYW5kIHJlc29sdmVzIHdpdGggZmFsc2UgaWYgaXQgd2Fzbid0IChlZy4gYSBqb2luIHRhYmxlKS4gUmVqZWN0cyBpZiBkZWxldGlvbiB3YXMgaW1wb3NzaWJsZS5cbiAgYXN5bmMgZGVsZXRlQ2xhc3MoY2xhc3NOYW1lOiBzdHJpbmcpIHtcbiAgICBjb25zdCBvcGVyYXRpb25zID0gW1xuICAgICAgeyBxdWVyeTogYERST1AgVEFCTEUgSUYgRVhJU1RTICQxOm5hbWVgLCB2YWx1ZXM6IFtjbGFzc05hbWVdIH0sXG4gICAgICB7XG4gICAgICAgIHF1ZXJ5OiBgREVMRVRFIEZST00gXCJfU0NIRU1BXCIgV0hFUkUgXCJjbGFzc05hbWVcIiA9ICQxYCxcbiAgICAgICAgdmFsdWVzOiBbY2xhc3NOYW1lXSxcbiAgICAgIH0sXG4gICAgXTtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuX2NsaWVudFxuICAgICAgLnR4KHQgPT4gdC5ub25lKHRoaXMuX3BncC5oZWxwZXJzLmNvbmNhdChvcGVyYXRpb25zKSkpXG4gICAgICAudGhlbigoKSA9PiBjbGFzc05hbWUuaW5kZXhPZignX0pvaW46JykgIT0gMCk7IC8vIHJlc29sdmVzIHdpdGggZmFsc2Ugd2hlbiBfSm9pbiB0YWJsZVxuXG4gICAgdGhpcy5fbm90aWZ5U2NoZW1hQ2hhbmdlKCk7XG4gICAgcmV0dXJuIHJlc3BvbnNlO1xuICB9XG5cbiAgLy8gRGVsZXRlIGFsbCBkYXRhIGtub3duIHRvIHRoaXMgYWRhcHRlci4gVXNlZCBmb3IgdGVzdGluZy5cbiAgYXN5bmMgZGVsZXRlQWxsQ2xhc3NlcygpIHtcbiAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgICBjb25zdCBoZWxwZXJzID0gdGhpcy5fcGdwLmhlbHBlcnM7XG4gICAgZGVidWcoJ2RlbGV0ZUFsbENsYXNzZXMnKTtcblxuICAgIGF3YWl0IHRoaXMuX2NsaWVudFxuICAgICAgLnRhc2soJ2RlbGV0ZS1hbGwtY2xhc3NlcycsIGFzeW5jIHQgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCB0LmFueSgnU0VMRUNUICogRlJPTSBcIl9TQ0hFTUFcIicpO1xuICAgICAgICAgIGNvbnN0IGpvaW5zID0gcmVzdWx0cy5yZWR1Y2UoKGxpc3Q6IEFycmF5PHN0cmluZz4sIHNjaGVtYTogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gbGlzdC5jb25jYXQoam9pblRhYmxlc0ZvclNjaGVtYShzY2hlbWEuc2NoZW1hKSk7XG4gICAgICAgICAgfSwgW10pO1xuICAgICAgICAgIGNvbnN0IGNsYXNzZXMgPSBbXG4gICAgICAgICAgICAnX1NDSEVNQScsXG4gICAgICAgICAgICAnX1B1c2hTdGF0dXMnLFxuICAgICAgICAgICAgJ19Kb2JTdGF0dXMnLFxuICAgICAgICAgICAgJ19Kb2JTY2hlZHVsZScsXG4gICAgICAgICAgICAnX0hvb2tzJyxcbiAgICAgICAgICAgICdfR2xvYmFsQ29uZmlnJyxcbiAgICAgICAgICAgICdfR3JhcGhRTENvbmZpZycsXG4gICAgICAgICAgICAnX0F1ZGllbmNlJyxcbiAgICAgICAgICAgICdfSWRlbXBvdGVuY3knLFxuICAgICAgICAgICAgLi4ucmVzdWx0cy5tYXAocmVzdWx0ID0+IHJlc3VsdC5jbGFzc05hbWUpLFxuICAgICAgICAgICAgLi4uam9pbnMsXG4gICAgICAgICAgXTtcbiAgICAgICAgICBjb25zdCBxdWVyaWVzID0gY2xhc3Nlcy5tYXAoY2xhc3NOYW1lID0+ICh7XG4gICAgICAgICAgICBxdWVyeTogJ0RST1AgVEFCTEUgSUYgRVhJU1RTICQ8Y2xhc3NOYW1lOm5hbWU+JyxcbiAgICAgICAgICAgIHZhbHVlczogeyBjbGFzc05hbWUgfSxcbiAgICAgICAgICB9KSk7XG4gICAgICAgICAgYXdhaXQgdC50eCh0eCA9PiB0eC5ub25lKGhlbHBlcnMuY29uY2F0KHF1ZXJpZXMpKSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgaWYgKGVycm9yLmNvZGUgIT09IFBvc3RncmVzUmVsYXRpb25Eb2VzTm90RXhpc3RFcnJvcikge1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIE5vIF9TQ0hFTUEgY29sbGVjdGlvbi4gRG9uJ3QgZGVsZXRlIGFueXRoaW5nLlxuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICBkZWJ1ZyhgZGVsZXRlQWxsQ2xhc3NlcyBkb25lIGluICR7bmV3IERhdGUoKS5nZXRUaW1lKCkgLSBub3d9YCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIC8vIFJlbW92ZSB0aGUgY29sdW1uIGFuZCBhbGwgdGhlIGRhdGEuIEZvciBSZWxhdGlvbnMsIHRoZSBfSm9pbiBjb2xsZWN0aW9uIGlzIGhhbmRsZWRcbiAgLy8gc3BlY2lhbGx5LCB0aGlzIGZ1bmN0aW9uIGRvZXMgbm90IGRlbGV0ZSBfSm9pbiBjb2x1bW5zLiBJdCBzaG91bGQsIGhvd2V2ZXIsIGluZGljYXRlXG4gIC8vIHRoYXQgdGhlIHJlbGF0aW9uIGZpZWxkcyBkb2VzIG5vdCBleGlzdCBhbnltb3JlLiBJbiBtb25nbywgdGhpcyBtZWFucyByZW1vdmluZyBpdCBmcm9tXG4gIC8vIHRoZSBfU0NIRU1BIGNvbGxlY3Rpb24uICBUaGVyZSBzaG91bGQgYmUgbm8gYWN0dWFsIGRhdGEgaW4gdGhlIGNvbGxlY3Rpb24gdW5kZXIgdGhlIHNhbWUgbmFtZVxuICAvLyBhcyB0aGUgcmVsYXRpb24gY29sdW1uLCBzbyBpdCdzIGZpbmUgdG8gYXR0ZW1wdCB0byBkZWxldGUgaXQuIElmIHRoZSBmaWVsZHMgbGlzdGVkIHRvIGJlXG4gIC8vIGRlbGV0ZWQgZG8gbm90IGV4aXN0LCB0aGlzIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gc3VjY2Vzc2Z1bGx5IGFueXdheXMuIENoZWNraW5nIGZvclxuICAvLyBhdHRlbXB0cyB0byBkZWxldGUgbm9uLWV4aXN0ZW50IGZpZWxkcyBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgUGFyc2UgU2VydmVyLlxuXG4gIC8vIFRoaXMgZnVuY3Rpb24gaXMgbm90IG9ibGlnYXRlZCB0byBkZWxldGUgZmllbGRzIGF0b21pY2FsbHkuIEl0IGlzIGdpdmVuIHRoZSBmaWVsZFxuICAvLyBuYW1lcyBpbiBhIGxpc3Qgc28gdGhhdCBkYXRhYmFzZXMgdGhhdCBhcmUgY2FwYWJsZSBvZiBkZWxldGluZyBmaWVsZHMgYXRvbWljYWxseVxuICAvLyBtYXkgZG8gc28uXG5cbiAgLy8gUmV0dXJucyBhIFByb21pc2UuXG4gIGFzeW5jIGRlbGV0ZUZpZWxkcyhjbGFzc05hbWU6IHN0cmluZywgc2NoZW1hOiBTY2hlbWFUeXBlLCBmaWVsZE5hbWVzOiBzdHJpbmdbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGRlYnVnKCdkZWxldGVGaWVsZHMnKTtcbiAgICBmaWVsZE5hbWVzID0gZmllbGROYW1lcy5yZWR1Y2UoKGxpc3Q6IEFycmF5PHN0cmluZz4sIGZpZWxkTmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCBmaWVsZCA9IHNjaGVtYS5maWVsZHNbZmllbGROYW1lXTtcbiAgICAgIGlmIChmaWVsZC50eXBlICE9PSAnUmVsYXRpb24nKSB7XG4gICAgICAgIGxpc3QucHVzaChmaWVsZE5hbWUpO1xuICAgICAgfVxuICAgICAgZGVsZXRlIHNjaGVtYS5maWVsZHNbZmllbGROYW1lXTtcbiAgICAgIHJldHVybiBsaXN0O1xuICAgIH0sIFtdKTtcblxuICAgIGNvbnN0IHZhbHVlcyA9IFtjbGFzc05hbWUsIC4uLmZpZWxkTmFtZXNdO1xuICAgIGNvbnN0IGNvbHVtbnMgPSBmaWVsZE5hbWVzXG4gICAgICAubWFwKChuYW1lLCBpZHgpID0+IHtcbiAgICAgICAgcmV0dXJuIGAkJHtpZHggKyAyfTpuYW1lYDtcbiAgICAgIH0pXG4gICAgICAuam9pbignLCBEUk9QIENPTFVNTicpO1xuXG4gICAgYXdhaXQgdGhpcy5fY2xpZW50LnR4KCdkZWxldGUtZmllbGRzJywgYXN5bmMgdCA9PiB7XG4gICAgICBhd2FpdCB0Lm5vbmUoJ1VQREFURSBcIl9TQ0hFTUFcIiBTRVQgXCJzY2hlbWFcIiA9ICQ8c2NoZW1hPiBXSEVSRSBcImNsYXNzTmFtZVwiID0gJDxjbGFzc05hbWU+Jywge1xuICAgICAgICBzY2hlbWEsXG4gICAgICAgIGNsYXNzTmFtZSxcbiAgICAgIH0pO1xuICAgICAgaWYgKHZhbHVlcy5sZW5ndGggPiAxKSB7XG4gICAgICAgIGF3YWl0IHQubm9uZShgQUxURVIgVEFCTEUgJDE6bmFtZSBEUk9QIENPTFVNTiBJRiBFWElTVFMgJHtjb2x1bW5zfWAsIHZhbHVlcyk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5fbm90aWZ5U2NoZW1hQ2hhbmdlKCk7XG4gIH1cblxuICAvLyBSZXR1cm4gYSBwcm9taXNlIGZvciBhbGwgc2NoZW1hcyBrbm93biB0byB0aGlzIGFkYXB0ZXIsIGluIFBhcnNlIGZvcm1hdC4gSW4gY2FzZSB0aGVcbiAgLy8gc2NoZW1hcyBjYW5ub3QgYmUgcmV0cmlldmVkLCByZXR1cm5zIGEgcHJvbWlzZSB0aGF0IHJlamVjdHMuIFJlcXVpcmVtZW50cyBmb3IgdGhlXG4gIC8vIHJlamVjdGlvbiByZWFzb24gYXJlIFRCRC5cbiAgYXN5bmMgZ2V0QWxsQ2xhc3NlcygpIHtcbiAgICByZXR1cm4gdGhpcy5fY2xpZW50LnRhc2soJ2dldC1hbGwtY2xhc3NlcycsIGFzeW5jIHQgPT4ge1xuICAgICAgcmV0dXJuIGF3YWl0IHQubWFwKCdTRUxFQ1QgKiBGUk9NIFwiX1NDSEVNQVwiJywgbnVsbCwgcm93ID0+XG4gICAgICAgIHRvUGFyc2VTY2hlbWEoeyBjbGFzc05hbWU6IHJvdy5jbGFzc05hbWUsIC4uLnJvdy5zY2hlbWEgfSlcbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICAvLyBSZXR1cm4gYSBwcm9taXNlIGZvciB0aGUgc2NoZW1hIHdpdGggdGhlIGdpdmVuIG5hbWUsIGluIFBhcnNlIGZvcm1hdC4gSWZcbiAgLy8gdGhpcyBhZGFwdGVyIGRvZXNuJ3Qga25vdyBhYm91dCB0aGUgc2NoZW1hLCByZXR1cm4gYSBwcm9taXNlIHRoYXQgcmVqZWN0cyB3aXRoXG4gIC8vIHVuZGVmaW5lZCBhcyB0aGUgcmVhc29uLlxuICBhc3luYyBnZXRDbGFzcyhjbGFzc05hbWU6IHN0cmluZykge1xuICAgIGRlYnVnKCdnZXRDbGFzcycpO1xuICAgIHJldHVybiB0aGlzLl9jbGllbnRcbiAgICAgIC5hbnkoJ1NFTEVDVCAqIEZST00gXCJfU0NIRU1BXCIgV0hFUkUgXCJjbGFzc05hbWVcIiA9ICQ8Y2xhc3NOYW1lPicsIHtcbiAgICAgICAgY2xhc3NOYW1lLFxuICAgICAgfSlcbiAgICAgIC50aGVuKHJlc3VsdCA9PiB7XG4gICAgICAgIGlmIChyZXN1bHQubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgICAgdGhyb3cgdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHRbMF0uc2NoZW1hO1xuICAgICAgfSlcbiAgICAgIC50aGVuKHRvUGFyc2VTY2hlbWEpO1xuICB9XG5cbiAgLy8gVE9ETzogcmVtb3ZlIHRoZSBtb25nbyBmb3JtYXQgZGVwZW5kZW5jeSBpbiB0aGUgcmV0dXJuIHZhbHVlXG4gIGFzeW5jIGNyZWF0ZU9iamVjdChcbiAgICBjbGFzc05hbWU6IHN0cmluZyxcbiAgICBzY2hlbWE6IFNjaGVtYVR5cGUsXG4gICAgb2JqZWN0OiBhbnksXG4gICAgdHJhbnNhY3Rpb25hbFNlc3Npb246ID9hbnlcbiAgKSB7XG4gICAgZGVidWcoJ2NyZWF0ZU9iamVjdCcpO1xuICAgIGxldCBjb2x1bW5zQXJyYXkgPSBbXTtcbiAgICBjb25zdCB2YWx1ZXNBcnJheSA9IFtdO1xuICAgIHNjaGVtYSA9IHRvUG9zdGdyZXNTY2hlbWEoc2NoZW1hKTtcbiAgICBjb25zdCBnZW9Qb2ludHMgPSB7fTtcblxuICAgIG9iamVjdCA9IGhhbmRsZURvdEZpZWxkcyhvYmplY3QpO1xuXG4gICAgdmFsaWRhdGVLZXlzKG9iamVjdCk7XG5cbiAgICBPYmplY3Qua2V5cyhvYmplY3QpLmZvckVhY2goZmllbGROYW1lID0+IHtcbiAgICAgIGlmIChvYmplY3RbZmllbGROYW1lXSA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB2YXIgYXV0aERhdGFNYXRjaCA9IGZpZWxkTmFtZS5tYXRjaCgvXl9hdXRoX2RhdGFfKFthLXpBLVowLTlfXSspJC8pO1xuICAgICAgY29uc3QgYXV0aERhdGFBbHJlYWR5RXhpc3RzID0gISFvYmplY3QuYXV0aERhdGE7XG4gICAgICBpZiAoYXV0aERhdGFNYXRjaCkge1xuICAgICAgICB2YXIgcHJvdmlkZXIgPSBhdXRoRGF0YU1hdGNoWzFdO1xuICAgICAgICBvYmplY3RbJ2F1dGhEYXRhJ10gPSBvYmplY3RbJ2F1dGhEYXRhJ10gfHwge307XG4gICAgICAgIG9iamVjdFsnYXV0aERhdGEnXVtwcm92aWRlcl0gPSBvYmplY3RbZmllbGROYW1lXTtcbiAgICAgICAgZGVsZXRlIG9iamVjdFtmaWVsZE5hbWVdO1xuICAgICAgICBmaWVsZE5hbWUgPSAnYXV0aERhdGEnO1xuICAgICAgICAvLyBBdm9pZCBhZGRpbmcgYXV0aERhdGEgbXVsdGlwbGUgdGltZXMgdG8gdGhlIHF1ZXJ5XG4gICAgICAgIGlmIChhdXRoRGF0YUFscmVhZHlFeGlzdHMpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29sdW1uc0FycmF5LnB1c2goZmllbGROYW1lKTtcbiAgICAgIGlmICghc2NoZW1hLmZpZWxkc1tmaWVsZE5hbWVdICYmIGNsYXNzTmFtZSA9PT0gJ19Vc2VyJykge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgZmllbGROYW1lID09PSAnX2VtYWlsX3ZlcmlmeV90b2tlbicgfHxcbiAgICAgICAgICBmaWVsZE5hbWUgPT09ICdfZmFpbGVkX2xvZ2luX2NvdW50JyB8fFxuICAgICAgICAgIGZpZWxkTmFtZSA9PT0gJ19wZXJpc2hhYmxlX3Rva2VuJyB8fFxuICAgICAgICAgIGZpZWxkTmFtZSA9PT0gJ19wYXNzd29yZF9oaXN0b3J5J1xuICAgICAgICApIHtcbiAgICAgICAgICB2YWx1ZXNBcnJheS5wdXNoKG9iamVjdFtmaWVsZE5hbWVdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmaWVsZE5hbWUgPT09ICdfZW1haWxfdmVyaWZ5X3Rva2VuX2V4cGlyZXNfYXQnKSB7XG4gICAgICAgICAgaWYgKG9iamVjdFtmaWVsZE5hbWVdKSB7XG4gICAgICAgICAgICB2YWx1ZXNBcnJheS5wdXNoKG9iamVjdFtmaWVsZE5hbWVdLmlzbyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhbHVlc0FycmF5LnB1c2gobnVsbCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIGZpZWxkTmFtZSA9PT0gJ19hY2NvdW50X2xvY2tvdXRfZXhwaXJlc19hdCcgfHxcbiAgICAgICAgICBmaWVsZE5hbWUgPT09ICdfcGVyaXNoYWJsZV90b2tlbl9leHBpcmVzX2F0JyB8fFxuICAgICAgICAgIGZpZWxkTmFtZSA9PT0gJ19wYXNzd29yZF9jaGFuZ2VkX2F0J1xuICAgICAgICApIHtcbiAgICAgICAgICBpZiAob2JqZWN0W2ZpZWxkTmFtZV0pIHtcbiAgICAgICAgICAgIHZhbHVlc0FycmF5LnB1c2gob2JqZWN0W2ZpZWxkTmFtZV0uaXNvKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFsdWVzQXJyYXkucHVzaChudWxsKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgc3dpdGNoIChzY2hlbWEuZmllbGRzW2ZpZWxkTmFtZV0udHlwZSkge1xuICAgICAgICBjYXNlICdEYXRlJzpcbiAgICAgICAgICBpZiAob2JqZWN0W2ZpZWxkTmFtZV0pIHtcbiAgICAgICAgICAgIHZhbHVlc0FycmF5LnB1c2gob2JqZWN0W2ZpZWxkTmFtZV0uaXNvKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFsdWVzQXJyYXkucHVzaChudWxsKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ1BvaW50ZXInOlxuICAgICAgICAgIHZhbHVlc0FycmF5LnB1c2gob2JqZWN0W2ZpZWxkTmFtZV0ub2JqZWN0SWQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdBcnJheSc6XG4gICAgICAgICAgaWYgKFsnX3JwZXJtJywgJ193cGVybSddLmluZGV4T2YoZmllbGROYW1lKSA+PSAwKSB7XG4gICAgICAgICAgICB2YWx1ZXNBcnJheS5wdXNoKG9iamVjdFtmaWVsZE5hbWVdKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFsdWVzQXJyYXkucHVzaChKU09OLnN0cmluZ2lmeShvYmplY3RbZmllbGROYW1lXSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnT2JqZWN0JzpcbiAgICAgICAgY2FzZSAnQnl0ZXMnOlxuICAgICAgICBjYXNlICdTdHJpbmcnOlxuICAgICAgICBjYXNlICdOdW1iZXInOlxuICAgICAgICBjYXNlICdCb29sZWFuJzpcbiAgICAgICAgICB2YWx1ZXNBcnJheS5wdXNoKG9iamVjdFtmaWVsZE5hbWVdKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnRmlsZSc6XG4gICAgICAgICAgdmFsdWVzQXJyYXkucHVzaChvYmplY3RbZmllbGROYW1lXS5uYW1lKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnUG9seWdvbic6IHtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IGNvbnZlcnRQb2x5Z29uVG9TUUwob2JqZWN0W2ZpZWxkTmFtZV0uY29vcmRpbmF0ZXMpO1xuICAgICAgICAgIHZhbHVlc0FycmF5LnB1c2godmFsdWUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ0dlb1BvaW50JzpcbiAgICAgICAgICAvLyBwb3AgdGhlIHBvaW50IGFuZCBwcm9jZXNzIGxhdGVyXG4gICAgICAgICAgZ2VvUG9pbnRzW2ZpZWxkTmFtZV0gPSBvYmplY3RbZmllbGROYW1lXTtcbiAgICAgICAgICBjb2x1bW5zQXJyYXkucG9wKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgYFR5cGUgJHtzY2hlbWEuZmllbGRzW2ZpZWxkTmFtZV0udHlwZX0gbm90IHN1cHBvcnRlZCB5ZXRgO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29sdW1uc0FycmF5ID0gY29sdW1uc0FycmF5LmNvbmNhdChPYmplY3Qua2V5cyhnZW9Qb2ludHMpKTtcbiAgICBjb25zdCBpbml0aWFsVmFsdWVzID0gdmFsdWVzQXJyYXkubWFwKCh2YWwsIGluZGV4KSA9PiB7XG4gICAgICBsZXQgdGVybWluYXRpb24gPSAnJztcbiAgICAgIGNvbnN0IGZpZWxkTmFtZSA9IGNvbHVtbnNBcnJheVtpbmRleF07XG4gICAgICBpZiAoWydfcnBlcm0nLCAnX3dwZXJtJ10uaW5kZXhPZihmaWVsZE5hbWUpID49IDApIHtcbiAgICAgICAgdGVybWluYXRpb24gPSAnOjp0ZXh0W10nO1xuICAgICAgfSBlbHNlIGlmIChzY2hlbWEuZmllbGRzW2ZpZWxkTmFtZV0gJiYgc2NoZW1hLmZpZWxkc1tmaWVsZE5hbWVdLnR5cGUgPT09ICdBcnJheScpIHtcbiAgICAgICAgdGVybWluYXRpb24gPSAnOjpqc29uYic7XG4gICAgICB9XG4gICAgICByZXR1cm4gYCQke2luZGV4ICsgMiArIGNvbHVtbnNBcnJheS5sZW5ndGh9JHt0ZXJtaW5hdGlvbn1gO1xuICAgIH0pO1xuICAgIGNvbnN0IGdlb1BvaW50c0luamVjdHMgPSBPYmplY3Qua2V5cyhnZW9Qb2ludHMpLm1hcChrZXkgPT4ge1xuICAgICAgY29uc3QgdmFsdWUgPSBnZW9Qb2ludHNba2V5XTtcbiAgICAgIHZhbHVlc0FycmF5LnB1c2godmFsdWUubG9uZ2l0dWRlLCB2YWx1ZS5sYXRpdHVkZSk7XG4gICAgICBjb25zdCBsID0gdmFsdWVzQXJyYXkubGVuZ3RoICsgY29sdW1uc0FycmF5Lmxlbmd0aDtcbiAgICAgIHJldHVybiBgUE9JTlQoJCR7bH0sICQke2wgKyAxfSlgO1xuICAgIH0pO1xuXG4gICAgY29uc3QgY29sdW1uc1BhdHRlcm4gPSBjb2x1bW5zQXJyYXkubWFwKChjb2wsIGluZGV4KSA9PiBgJCR7aW5kZXggKyAyfTpuYW1lYCkuam9pbigpO1xuICAgIGNvbnN0IHZhbHVlc1BhdHRlcm4gPSBpbml0aWFsVmFsdWVzLmNvbmNhdChnZW9Qb2ludHNJbmplY3RzKS5qb2luKCk7XG5cbiAgICBjb25zdCBxcyA9IGBJTlNFUlQgSU5UTyAkMTpuYW1lICgke2NvbHVtbnNQYXR0ZXJufSkgVkFMVUVTICgke3ZhbHVlc1BhdHRlcm59KWA7XG4gICAgY29uc3QgdmFsdWVzID0gW2NsYXNzTmFtZSwgLi4uY29sdW1uc0FycmF5LCAuLi52YWx1ZXNBcnJheV07XG4gICAgY29uc3QgcHJvbWlzZSA9ICh0cmFuc2FjdGlvbmFsU2Vzc2lvbiA/IHRyYW5zYWN0aW9uYWxTZXNzaW9uLnQgOiB0aGlzLl9jbGllbnQpXG4gICAgICAubm9uZShxcywgdmFsdWVzKVxuICAgICAgLnRoZW4oKCkgPT4gKHsgb3BzOiBbb2JqZWN0XSB9KSlcbiAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgIGlmIChlcnJvci5jb2RlID09PSBQb3N0Z3Jlc1VuaXF1ZUluZGV4VmlvbGF0aW9uRXJyb3IpIHtcbiAgICAgICAgICBjb25zdCBlcnIgPSBuZXcgUGFyc2UuRXJyb3IoXG4gICAgICAgICAgICBQYXJzZS5FcnJvci5EVVBMSUNBVEVfVkFMVUUsXG4gICAgICAgICAgICAnQSBkdXBsaWNhdGUgdmFsdWUgZm9yIGEgZmllbGQgd2l0aCB1bmlxdWUgdmFsdWVzIHdhcyBwcm92aWRlZCdcbiAgICAgICAgICApO1xuICAgICAgICAgIGVyci51bmRlcmx5aW5nRXJyb3IgPSBlcnJvcjtcbiAgICAgICAgICBpZiAoZXJyb3IuY29uc3RyYWludCkge1xuICAgICAgICAgICAgY29uc3QgbWF0Y2hlcyA9IGVycm9yLmNvbnN0cmFpbnQubWF0Y2goL3VuaXF1ZV8oW2EtekEtWl0rKS8pO1xuICAgICAgICAgICAgaWYgKG1hdGNoZXMgJiYgQXJyYXkuaXNBcnJheShtYXRjaGVzKSkge1xuICAgICAgICAgICAgICBlcnIudXNlckluZm8gPSB7IGR1cGxpY2F0ZWRfZmllbGQ6IG1hdGNoZXNbMV0gfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgZXJyb3IgPSBlcnI7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9KTtcbiAgICBpZiAodHJhbnNhY3Rpb25hbFNlc3Npb24pIHtcbiAgICAgIHRyYW5zYWN0aW9uYWxTZXNzaW9uLmJhdGNoLnB1c2gocHJvbWlzZSk7XG4gICAgfVxuICAgIHJldHVybiBwcm9taXNlO1xuICB9XG5cbiAgLy8gUmVtb3ZlIGFsbCBvYmplY3RzIHRoYXQgbWF0Y2ggdGhlIGdpdmVuIFBhcnNlIFF1ZXJ5LlxuICAvLyBJZiBubyBvYmplY3RzIG1hdGNoLCByZWplY3Qgd2l0aCBPQkpFQ1RfTk9UX0ZPVU5ELiBJZiBvYmplY3RzIGFyZSBmb3VuZCBhbmQgZGVsZXRlZCwgcmVzb2x2ZSB3aXRoIHVuZGVmaW5lZC5cbiAgLy8gSWYgdGhlcmUgaXMgc29tZSBvdGhlciBlcnJvciwgcmVqZWN0IHdpdGggSU5URVJOQUxfU0VSVkVSX0VSUk9SLlxuICBhc3luYyBkZWxldGVPYmplY3RzQnlRdWVyeShcbiAgICBjbGFzc05hbWU6IHN0cmluZyxcbiAgICBzY2hlbWE6IFNjaGVtYVR5cGUsXG4gICAgcXVlcnk6IFF1ZXJ5VHlwZSxcbiAgICB0cmFuc2FjdGlvbmFsU2Vzc2lvbjogP2FueVxuICApIHtcbiAgICBkZWJ1ZygnZGVsZXRlT2JqZWN0c0J5UXVlcnknKTtcbiAgICBjb25zdCB2YWx1ZXMgPSBbY2xhc3NOYW1lXTtcbiAgICBjb25zdCBpbmRleCA9IDI7XG4gICAgY29uc3Qgd2hlcmUgPSBidWlsZFdoZXJlQ2xhdXNlKHtcbiAgICAgIHNjaGVtYSxcbiAgICAgIGluZGV4LFxuICAgICAgcXVlcnksXG4gICAgICBjYXNlSW5zZW5zaXRpdmU6IGZhbHNlLFxuICAgIH0pO1xuICAgIHZhbHVlcy5wdXNoKC4uLndoZXJlLnZhbHVlcyk7XG4gICAgaWYgKE9iamVjdC5rZXlzKHF1ZXJ5KS5sZW5ndGggPT09IDApIHtcbiAgICAgIHdoZXJlLnBhdHRlcm4gPSAnVFJVRSc7XG4gICAgfVxuICAgIGNvbnN0IHFzID0gYFdJVEggZGVsZXRlZCBBUyAoREVMRVRFIEZST00gJDE6bmFtZSBXSEVSRSAke3doZXJlLnBhdHRlcm59IFJFVFVSTklORyAqKSBTRUxFQ1QgY291bnQoKikgRlJPTSBkZWxldGVkYDtcbiAgICBjb25zdCBwcm9taXNlID0gKHRyYW5zYWN0aW9uYWxTZXNzaW9uID8gdHJhbnNhY3Rpb25hbFNlc3Npb24udCA6IHRoaXMuX2NsaWVudClcbiAgICAgIC5vbmUocXMsIHZhbHVlcywgYSA9PiArYS5jb3VudClcbiAgICAgIC50aGVuKGNvdW50ID0+IHtcbiAgICAgICAgaWYgKGNvdW50ID09PSAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLk9CSkVDVF9OT1RfRk9VTkQsICdPYmplY3Qgbm90IGZvdW5kLicpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBjb3VudDtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgIGlmIChlcnJvci5jb2RlICE9PSBQb3N0Z3Jlc1JlbGF0aW9uRG9lc05vdEV4aXN0RXJyb3IpIHtcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICAvLyBFTFNFOiBEb24ndCBkZWxldGUgYW55dGhpbmcgaWYgZG9lc24ndCBleGlzdFxuICAgICAgfSk7XG4gICAgaWYgKHRyYW5zYWN0aW9uYWxTZXNzaW9uKSB7XG4gICAgICB0cmFuc2FjdGlvbmFsU2Vzc2lvbi5iYXRjaC5wdXNoKHByb21pc2UpO1xuICAgIH1cbiAgICByZXR1cm4gcHJvbWlzZTtcbiAgfVxuICAvLyBSZXR1cm4gdmFsdWUgbm90IGN1cnJlbnRseSB3ZWxsIHNwZWNpZmllZC5cbiAgYXN5bmMgZmluZE9uZUFuZFVwZGF0ZShcbiAgICBjbGFzc05hbWU6IHN0cmluZyxcbiAgICBzY2hlbWE6IFNjaGVtYVR5cGUsXG4gICAgcXVlcnk6IFF1ZXJ5VHlwZSxcbiAgICB1cGRhdGU6IGFueSxcbiAgICB0cmFuc2FjdGlvbmFsU2Vzc2lvbjogP2FueVxuICApOiBQcm9taXNlPGFueT4ge1xuICAgIGRlYnVnKCdmaW5kT25lQW5kVXBkYXRlJyk7XG4gICAgcmV0dXJuIHRoaXMudXBkYXRlT2JqZWN0c0J5UXVlcnkoY2xhc3NOYW1lLCBzY2hlbWEsIHF1ZXJ5LCB1cGRhdGUsIHRyYW5zYWN0aW9uYWxTZXNzaW9uKS50aGVuKFxuICAgICAgdmFsID0+IHZhbFswXVxuICAgICk7XG4gIH1cblxuICAvLyBBcHBseSB0aGUgdXBkYXRlIHRvIGFsbCBvYmplY3RzIHRoYXQgbWF0Y2ggdGhlIGdpdmVuIFBhcnNlIFF1ZXJ5LlxuICBhc3luYyB1cGRhdGVPYmplY3RzQnlRdWVyeShcbiAgICBjbGFzc05hbWU6IHN0cmluZyxcbiAgICBzY2hlbWE6IFNjaGVtYVR5cGUsXG4gICAgcXVlcnk6IFF1ZXJ5VHlwZSxcbiAgICB1cGRhdGU6IGFueSxcbiAgICB0cmFuc2FjdGlvbmFsU2Vzc2lvbjogP2FueVxuICApOiBQcm9taXNlPFthbnldPiB7XG4gICAgZGVidWcoJ3VwZGF0ZU9iamVjdHNCeVF1ZXJ5Jyk7XG4gICAgY29uc3QgdXBkYXRlUGF0dGVybnMgPSBbXTtcbiAgICBjb25zdCB2YWx1ZXMgPSBbY2xhc3NOYW1lXTtcbiAgICBsZXQgaW5kZXggPSAyO1xuICAgIHNjaGVtYSA9IHRvUG9zdGdyZXNTY2hlbWEoc2NoZW1hKTtcblxuICAgIGNvbnN0IG9yaWdpbmFsVXBkYXRlID0geyAuLi51cGRhdGUgfTtcblxuICAgIC8vIFNldCBmbGFnIGZvciBkb3Qgbm90YXRpb24gZmllbGRzXG4gICAgY29uc3QgZG90Tm90YXRpb25PcHRpb25zID0ge307XG4gICAgT2JqZWN0LmtleXModXBkYXRlKS5mb3JFYWNoKGZpZWxkTmFtZSA9PiB7XG4gICAgICBpZiAoZmllbGROYW1lLmluZGV4T2YoJy4nKSA+IC0xKSB7XG4gICAgICAgIGNvbnN0IGNvbXBvbmVudHMgPSBmaWVsZE5hbWUuc3BsaXQoJy4nKTtcbiAgICAgICAgY29uc3QgZmlyc3QgPSBjb21wb25lbnRzLnNoaWZ0KCk7XG4gICAgICAgIGRvdE5vdGF0aW9uT3B0aW9uc1tmaXJzdF0gPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZG90Tm90YXRpb25PcHRpb25zW2ZpZWxkTmFtZV0gPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB1cGRhdGUgPSBoYW5kbGVEb3RGaWVsZHModXBkYXRlKTtcbiAgICAvLyBSZXNvbHZlIGF1dGhEYXRhIGZpcnN0LFxuICAgIC8vIFNvIHdlIGRvbid0IGVuZCB1cCB3aXRoIG11bHRpcGxlIGtleSB1cGRhdGVzXG4gICAgZm9yIChjb25zdCBmaWVsZE5hbWUgaW4gdXBkYXRlKSB7XG4gICAgICBjb25zdCBhdXRoRGF0YU1hdGNoID0gZmllbGROYW1lLm1hdGNoKC9eX2F1dGhfZGF0YV8oW2EtekEtWjAtOV9dKykkLyk7XG4gICAgICBpZiAoYXV0aERhdGFNYXRjaCkge1xuICAgICAgICB2YXIgcHJvdmlkZXIgPSBhdXRoRGF0YU1hdGNoWzFdO1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHVwZGF0ZVtmaWVsZE5hbWVdO1xuICAgICAgICBkZWxldGUgdXBkYXRlW2ZpZWxkTmFtZV07XG4gICAgICAgIHVwZGF0ZVsnYXV0aERhdGEnXSA9IHVwZGF0ZVsnYXV0aERhdGEnXSB8fCB7fTtcbiAgICAgICAgdXBkYXRlWydhdXRoRGF0YSddW3Byb3ZpZGVyXSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgZmllbGROYW1lIGluIHVwZGF0ZSkge1xuICAgICAgY29uc3QgZmllbGRWYWx1ZSA9IHVwZGF0ZVtmaWVsZE5hbWVdO1xuICAgICAgLy8gRHJvcCBhbnkgdW5kZWZpbmVkIHZhbHVlcy5cbiAgICAgIGlmICh0eXBlb2YgZmllbGRWYWx1ZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgZGVsZXRlIHVwZGF0ZVtmaWVsZE5hbWVdO1xuICAgICAgfSBlbHNlIGlmIChmaWVsZFZhbHVlID09PSBudWxsKSB7XG4gICAgICAgIHVwZGF0ZVBhdHRlcm5zLnB1c2goYCQke2luZGV4fTpuYW1lID0gTlVMTGApO1xuICAgICAgICB2YWx1ZXMucHVzaChmaWVsZE5hbWUpO1xuICAgICAgICBpbmRleCArPSAxO1xuICAgICAgfSBlbHNlIGlmIChmaWVsZE5hbWUgPT0gJ2F1dGhEYXRhJykge1xuICAgICAgICAvLyBUaGlzIHJlY3Vyc2l2ZWx5IHNldHMgdGhlIGpzb25fb2JqZWN0XG4gICAgICAgIC8vIE9ubHkgMSBsZXZlbCBkZWVwXG4gICAgICAgIGNvbnN0IGdlbmVyYXRlID0gKGpzb25iOiBzdHJpbmcsIGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGBqc29uX29iamVjdF9zZXRfa2V5KENPQUxFU0NFKCR7anNvbmJ9LCAne30nOjpqc29uYiksICR7a2V5fSwgJHt2YWx1ZX0pOjpqc29uYmA7XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGxhc3RLZXkgPSBgJCR7aW5kZXh9Om5hbWVgO1xuICAgICAgICBjb25zdCBmaWVsZE5hbWVJbmRleCA9IGluZGV4O1xuICAgICAgICBpbmRleCArPSAxO1xuICAgICAgICB2YWx1ZXMucHVzaChmaWVsZE5hbWUpO1xuICAgICAgICBjb25zdCB1cGRhdGUgPSBPYmplY3Qua2V5cyhmaWVsZFZhbHVlKS5yZWR1Y2UoKGxhc3RLZXk6IHN0cmluZywga2V5OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICBjb25zdCBzdHIgPSBnZW5lcmF0ZShsYXN0S2V5LCBgJCR7aW5kZXh9Ojp0ZXh0YCwgYCQke2luZGV4ICsgMX06Ompzb25iYCk7XG4gICAgICAgICAgaW5kZXggKz0gMjtcbiAgICAgICAgICBsZXQgdmFsdWUgPSBmaWVsZFZhbHVlW2tleV07XG4gICAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICBpZiAodmFsdWUuX19vcCA9PT0gJ0RlbGV0ZScpIHtcbiAgICAgICAgICAgICAgdmFsdWUgPSBudWxsO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdmFsdWUgPSBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhbHVlcy5wdXNoKGtleSwgdmFsdWUpO1xuICAgICAgICAgIHJldHVybiBzdHI7XG4gICAgICAgIH0sIGxhc3RLZXkpO1xuICAgICAgICB1cGRhdGVQYXR0ZXJucy5wdXNoKGAkJHtmaWVsZE5hbWVJbmRleH06bmFtZSA9ICR7dXBkYXRlfWApO1xuICAgICAgfSBlbHNlIGlmIChmaWVsZFZhbHVlLl9fb3AgPT09ICdJbmNyZW1lbnQnKSB7XG4gICAgICAgIHVwZGF0ZVBhdHRlcm5zLnB1c2goYCQke2luZGV4fTpuYW1lID0gQ09BTEVTQ0UoJCR7aW5kZXh9Om5hbWUsIDApICsgJCR7aW5kZXggKyAxfWApO1xuICAgICAgICB2YWx1ZXMucHVzaChmaWVsZE5hbWUsIGZpZWxkVmFsdWUuYW1vdW50KTtcbiAgICAgICAgaW5kZXggKz0gMjtcbiAgICAgIH0gZWxzZSBpZiAoZmllbGRWYWx1ZS5fX29wID09PSAnQWRkJykge1xuICAgICAgICB1cGRhdGVQYXR0ZXJucy5wdXNoKFxuICAgICAgICAgIGAkJHtpbmRleH06bmFtZSA9IGFycmF5X2FkZChDT0FMRVNDRSgkJHtpbmRleH06bmFtZSwgJ1tdJzo6anNvbmIpLCAkJHtpbmRleCArIDF9Ojpqc29uYilgXG4gICAgICAgICk7XG4gICAgICAgIHZhbHVlcy5wdXNoKGZpZWxkTmFtZSwgSlNPTi5zdHJpbmdpZnkoZmllbGRWYWx1ZS5vYmplY3RzKSk7XG4gICAgICAgIGluZGV4ICs9IDI7XG4gICAgICB9IGVsc2UgaWYgKGZpZWxkVmFsdWUuX19vcCA9PT0gJ0RlbGV0ZScpIHtcbiAgICAgICAgdXBkYXRlUGF0dGVybnMucHVzaChgJCR7aW5kZXh9Om5hbWUgPSAkJHtpbmRleCArIDF9YCk7XG4gICAgICAgIHZhbHVlcy5wdXNoKGZpZWxkTmFtZSwgbnVsbCk7XG4gICAgICAgIGluZGV4ICs9IDI7XG4gICAgICB9IGVsc2UgaWYgKGZpZWxkVmFsdWUuX19vcCA9PT0gJ1JlbW92ZScpIHtcbiAgICAgICAgdXBkYXRlUGF0dGVybnMucHVzaChcbiAgICAgICAgICBgJCR7aW5kZXh9Om5hbWUgPSBhcnJheV9yZW1vdmUoQ09BTEVTQ0UoJCR7aW5kZXh9Om5hbWUsICdbXSc6Ompzb25iKSwgJCR7XG4gICAgICAgICAgICBpbmRleCArIDFcbiAgICAgICAgICB9Ojpqc29uYilgXG4gICAgICAgICk7XG4gICAgICAgIHZhbHVlcy5wdXNoKGZpZWxkTmFtZSwgSlNPTi5zdHJpbmdpZnkoZmllbGRWYWx1ZS5vYmplY3RzKSk7XG4gICAgICAgIGluZGV4ICs9IDI7XG4gICAgICB9IGVsc2UgaWYgKGZpZWxkVmFsdWUuX19vcCA9PT0gJ0FkZFVuaXF1ZScpIHtcbiAgICAgICAgdXBkYXRlUGF0dGVybnMucHVzaChcbiAgICAgICAgICBgJCR7aW5kZXh9Om5hbWUgPSBhcnJheV9hZGRfdW5pcXVlKENPQUxFU0NFKCQke2luZGV4fTpuYW1lLCAnW10nOjpqc29uYiksICQke1xuICAgICAgICAgICAgaW5kZXggKyAxXG4gICAgICAgICAgfTo6anNvbmIpYFxuICAgICAgICApO1xuICAgICAgICB2YWx1ZXMucHVzaChmaWVsZE5hbWUsIEpTT04uc3RyaW5naWZ5KGZpZWxkVmFsdWUub2JqZWN0cykpO1xuICAgICAgICBpbmRleCArPSAyO1xuICAgICAgfSBlbHNlIGlmIChmaWVsZE5hbWUgPT09ICd1cGRhdGVkQXQnKSB7XG4gICAgICAgIC8vVE9ETzogc3RvcCBzcGVjaWFsIGNhc2luZyB0aGlzLiBJdCBzaG91bGQgY2hlY2sgZm9yIF9fdHlwZSA9PT0gJ0RhdGUnIGFuZCB1c2UgLmlzb1xuICAgICAgICB1cGRhdGVQYXR0ZXJucy5wdXNoKGAkJHtpbmRleH06bmFtZSA9ICQke2luZGV4ICsgMX1gKTtcbiAgICAgICAgdmFsdWVzLnB1c2goZmllbGROYW1lLCBmaWVsZFZhbHVlKTtcbiAgICAgICAgaW5kZXggKz0gMjtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGZpZWxkVmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHVwZGF0ZVBhdHRlcm5zLnB1c2goYCQke2luZGV4fTpuYW1lID0gJCR7aW5kZXggKyAxfWApO1xuICAgICAgICB2YWx1ZXMucHVzaChmaWVsZE5hbWUsIGZpZWxkVmFsdWUpO1xuICAgICAgICBpbmRleCArPSAyO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZmllbGRWYWx1ZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgIHVwZGF0ZVBhdHRlcm5zLnB1c2goYCQke2luZGV4fTpuYW1lID0gJCR7aW5kZXggKyAxfWApO1xuICAgICAgICB2YWx1ZXMucHVzaChmaWVsZE5hbWUsIGZpZWxkVmFsdWUpO1xuICAgICAgICBpbmRleCArPSAyO1xuICAgICAgfSBlbHNlIGlmIChmaWVsZFZhbHVlLl9fdHlwZSA9PT0gJ1BvaW50ZXInKSB7XG4gICAgICAgIHVwZGF0ZVBhdHRlcm5zLnB1c2goYCQke2luZGV4fTpuYW1lID0gJCR7aW5kZXggKyAxfWApO1xuICAgICAgICB2YWx1ZXMucHVzaChmaWVsZE5hbWUsIGZpZWxkVmFsdWUub2JqZWN0SWQpO1xuICAgICAgICBpbmRleCArPSAyO1xuICAgICAgfSBlbHNlIGlmIChmaWVsZFZhbHVlLl9fdHlwZSA9PT0gJ0RhdGUnKSB7XG4gICAgICAgIHVwZGF0ZVBhdHRlcm5zLnB1c2goYCQke2luZGV4fTpuYW1lID0gJCR7aW5kZXggKyAxfWApO1xuICAgICAgICB2YWx1ZXMucHVzaChmaWVsZE5hbWUsIHRvUG9zdGdyZXNWYWx1ZShmaWVsZFZhbHVlKSk7XG4gICAgICAgIGluZGV4ICs9IDI7XG4gICAgICB9IGVsc2UgaWYgKGZpZWxkVmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgIHVwZGF0ZVBhdHRlcm5zLnB1c2goYCQke2luZGV4fTpuYW1lID0gJCR7aW5kZXggKyAxfWApO1xuICAgICAgICB2YWx1ZXMucHVzaChmaWVsZE5hbWUsIGZpZWxkVmFsdWUpO1xuICAgICAgICBpbmRleCArPSAyO1xuICAgICAgfSBlbHNlIGlmIChmaWVsZFZhbHVlLl9fdHlwZSA9PT0gJ0ZpbGUnKSB7XG4gICAgICAgIHVwZGF0ZVBhdHRlcm5zLnB1c2goYCQke2luZGV4fTpuYW1lID0gJCR7aW5kZXggKyAxfWApO1xuICAgICAgICB2YWx1ZXMucHVzaChmaWVsZE5hbWUsIHRvUG9zdGdyZXNWYWx1ZShmaWVsZFZhbHVlKSk7XG4gICAgICAgIGluZGV4ICs9IDI7XG4gICAgICB9IGVsc2UgaWYgKGZpZWxkVmFsdWUuX190eXBlID09PSAnR2VvUG9pbnQnKSB7XG4gICAgICAgIHVwZGF0ZVBhdHRlcm5zLnB1c2goYCQke2luZGV4fTpuYW1lID0gUE9JTlQoJCR7aW5kZXggKyAxfSwgJCR7aW5kZXggKyAyfSlgKTtcbiAgICAgICAgdmFsdWVzLnB1c2goZmllbGROYW1lLCBmaWVsZFZhbHVlLmxvbmdpdHVkZSwgZmllbGRWYWx1ZS5sYXRpdHVkZSk7XG4gICAgICAgIGluZGV4ICs9IDM7XG4gICAgICB9IGVsc2UgaWYgKGZpZWxkVmFsdWUuX190eXBlID09PSAnUG9seWdvbicpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBjb252ZXJ0UG9seWdvblRvU1FMKGZpZWxkVmFsdWUuY29vcmRpbmF0ZXMpO1xuICAgICAgICB1cGRhdGVQYXR0ZXJucy5wdXNoKGAkJHtpbmRleH06bmFtZSA9ICQke2luZGV4ICsgMX06OnBvbHlnb25gKTtcbiAgICAgICAgdmFsdWVzLnB1c2goZmllbGROYW1lLCB2YWx1ZSk7XG4gICAgICAgIGluZGV4ICs9IDI7XG4gICAgICB9IGVsc2UgaWYgKGZpZWxkVmFsdWUuX190eXBlID09PSAnUmVsYXRpb24nKSB7XG4gICAgICAgIC8vIG5vb3BcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGZpZWxkVmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICAgIHVwZGF0ZVBhdHRlcm5zLnB1c2goYCQke2luZGV4fTpuYW1lID0gJCR7aW5kZXggKyAxfWApO1xuICAgICAgICB2YWx1ZXMucHVzaChmaWVsZE5hbWUsIGZpZWxkVmFsdWUpO1xuICAgICAgICBpbmRleCArPSAyO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgdHlwZW9mIGZpZWxkVmFsdWUgPT09ICdvYmplY3QnICYmXG4gICAgICAgIHNjaGVtYS5maWVsZHNbZmllbGROYW1lXSAmJlxuICAgICAgICBzY2hlbWEuZmllbGRzW2ZpZWxkTmFtZV0udHlwZSA9PT0gJ09iamVjdCdcbiAgICAgICkge1xuICAgICAgICAvLyBHYXRoZXIga2V5cyB0byBpbmNyZW1lbnRcbiAgICAgICAgY29uc3Qga2V5c1RvSW5jcmVtZW50ID0gT2JqZWN0LmtleXMob3JpZ2luYWxVcGRhdGUpXG4gICAgICAgICAgLmZpbHRlcihrID0+IHtcbiAgICAgICAgICAgIC8vIGNob29zZSB0b3AgbGV2ZWwgZmllbGRzIHRoYXQgaGF2ZSBhIGRlbGV0ZSBvcGVyYXRpb24gc2V0XG4gICAgICAgICAgICAvLyBOb3RlIHRoYXQgT2JqZWN0LmtleXMgaXMgaXRlcmF0aW5nIG92ZXIgdGhlICoqb3JpZ2luYWwqKiB1cGRhdGUgb2JqZWN0XG4gICAgICAgICAgICAvLyBhbmQgdGhhdCBzb21lIG9mIHRoZSBrZXlzIG9mIHRoZSBvcmlnaW5hbCB1cGRhdGUgY291bGQgYmUgbnVsbCBvciB1bmRlZmluZWQ6XG4gICAgICAgICAgICAvLyAoU2VlIHRoZSBhYm92ZSBjaGVjayBgaWYgKGZpZWxkVmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIGZpZWxkVmFsdWUgPT0gXCJ1bmRlZmluZWRcIilgKVxuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBvcmlnaW5hbFVwZGF0ZVtrXTtcbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgIHZhbHVlICYmXG4gICAgICAgICAgICAgIHZhbHVlLl9fb3AgPT09ICdJbmNyZW1lbnQnICYmXG4gICAgICAgICAgICAgIGsuc3BsaXQoJy4nKS5sZW5ndGggPT09IDIgJiZcbiAgICAgICAgICAgICAgay5zcGxpdCgnLicpWzBdID09PSBmaWVsZE5hbWVcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSlcbiAgICAgICAgICAubWFwKGsgPT4gay5zcGxpdCgnLicpWzFdKTtcblxuICAgICAgICBsZXQgaW5jcmVtZW50UGF0dGVybnMgPSAnJztcbiAgICAgICAgaWYgKGtleXNUb0luY3JlbWVudC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgaW5jcmVtZW50UGF0dGVybnMgPVxuICAgICAgICAgICAgJyB8fCAnICtcbiAgICAgICAgICAgIGtleXNUb0luY3JlbWVudFxuICAgICAgICAgICAgICAubWFwKGMgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGFtb3VudCA9IGZpZWxkVmFsdWVbY10uYW1vdW50O1xuICAgICAgICAgICAgICAgIHJldHVybiBgQ09OQ0FUKCd7XCIke2N9XCI6JywgQ09BTEVTQ0UoJCR7aW5kZXh9Om5hbWUtPj4nJHtjfScsJzAnKTo6aW50ICsgJHthbW91bnR9LCAnfScpOjpqc29uYmA7XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIC5qb2luKCcgfHwgJyk7XG4gICAgICAgICAgLy8gU3RyaXAgdGhlIGtleXNcbiAgICAgICAgICBrZXlzVG9JbmNyZW1lbnQuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgZGVsZXRlIGZpZWxkVmFsdWVba2V5XTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGtleXNUb0RlbGV0ZTogQXJyYXk8c3RyaW5nPiA9IE9iamVjdC5rZXlzKG9yaWdpbmFsVXBkYXRlKVxuICAgICAgICAgIC5maWx0ZXIoayA9PiB7XG4gICAgICAgICAgICAvLyBjaG9vc2UgdG9wIGxldmVsIGZpZWxkcyB0aGF0IGhhdmUgYSBkZWxldGUgb3BlcmF0aW9uIHNldC5cbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gb3JpZ2luYWxVcGRhdGVba107XG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICB2YWx1ZSAmJlxuICAgICAgICAgICAgICB2YWx1ZS5fX29wID09PSAnRGVsZXRlJyAmJlxuICAgICAgICAgICAgICBrLnNwbGl0KCcuJykubGVuZ3RoID09PSAyICYmXG4gICAgICAgICAgICAgIGsuc3BsaXQoJy4nKVswXSA9PT0gZmllbGROYW1lXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLm1hcChrID0+IGsuc3BsaXQoJy4nKVsxXSk7XG5cbiAgICAgICAgY29uc3QgZGVsZXRlUGF0dGVybnMgPSBrZXlzVG9EZWxldGUucmVkdWNlKChwOiBzdHJpbmcsIGM6IHN0cmluZywgaTogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHAgKyBgIC0gJyQke2luZGV4ICsgMSArIGl9OnZhbHVlJ2A7XG4gICAgICAgIH0sICcnKTtcbiAgICAgICAgLy8gT3ZlcnJpZGUgT2JqZWN0XG4gICAgICAgIGxldCB1cGRhdGVPYmplY3QgPSBcIid7fSc6Ompzb25iXCI7XG5cbiAgICAgICAgaWYgKGRvdE5vdGF0aW9uT3B0aW9uc1tmaWVsZE5hbWVdKSB7XG4gICAgICAgICAgLy8gTWVyZ2UgT2JqZWN0XG4gICAgICAgICAgdXBkYXRlT2JqZWN0ID0gYENPQUxFU0NFKCQke2luZGV4fTpuYW1lLCAne30nOjpqc29uYilgO1xuICAgICAgICB9XG4gICAgICAgIHVwZGF0ZVBhdHRlcm5zLnB1c2goXG4gICAgICAgICAgYCQke2luZGV4fTpuYW1lID0gKCR7dXBkYXRlT2JqZWN0fSAke2RlbGV0ZVBhdHRlcm5zfSAke2luY3JlbWVudFBhdHRlcm5zfSB8fCAkJHtcbiAgICAgICAgICAgIGluZGV4ICsgMSArIGtleXNUb0RlbGV0ZS5sZW5ndGhcbiAgICAgICAgICB9Ojpqc29uYiApYFxuICAgICAgICApO1xuICAgICAgICB2YWx1ZXMucHVzaChmaWVsZE5hbWUsIC4uLmtleXNUb0RlbGV0ZSwgSlNPTi5zdHJpbmdpZnkoZmllbGRWYWx1ZSkpO1xuICAgICAgICBpbmRleCArPSAyICsga2V5c1RvRGVsZXRlLmxlbmd0aDtcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIEFycmF5LmlzQXJyYXkoZmllbGRWYWx1ZSkgJiZcbiAgICAgICAgc2NoZW1hLmZpZWxkc1tmaWVsZE5hbWVdICYmXG4gICAgICAgIHNjaGVtYS5maWVsZHNbZmllbGROYW1lXS50eXBlID09PSAnQXJyYXknXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgZXhwZWN0ZWRUeXBlID0gcGFyc2VUeXBlVG9Qb3N0Z3Jlc1R5cGUoc2NoZW1hLmZpZWxkc1tmaWVsZE5hbWVdKTtcbiAgICAgICAgaWYgKGV4cGVjdGVkVHlwZSA9PT0gJ3RleHRbXScpIHtcbiAgICAgICAgICB1cGRhdGVQYXR0ZXJucy5wdXNoKGAkJHtpbmRleH06bmFtZSA9ICQke2luZGV4ICsgMX06OnRleHRbXWApO1xuICAgICAgICAgIHZhbHVlcy5wdXNoKGZpZWxkTmFtZSwgZmllbGRWYWx1ZSk7XG4gICAgICAgICAgaW5kZXggKz0gMjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB1cGRhdGVQYXR0ZXJucy5wdXNoKGAkJHtpbmRleH06bmFtZSA9ICQke2luZGV4ICsgMX06Ompzb25iYCk7XG4gICAgICAgICAgdmFsdWVzLnB1c2goZmllbGROYW1lLCBKU09OLnN0cmluZ2lmeShmaWVsZFZhbHVlKSk7XG4gICAgICAgICAgaW5kZXggKz0gMjtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVidWcoJ05vdCBzdXBwb3J0ZWQgdXBkYXRlJywgeyBmaWVsZE5hbWUsIGZpZWxkVmFsdWUgfSk7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChcbiAgICAgICAgICBuZXcgUGFyc2UuRXJyb3IoXG4gICAgICAgICAgICBQYXJzZS5FcnJvci5PUEVSQVRJT05fRk9SQklEREVOLFxuICAgICAgICAgICAgYFBvc3RncmVzIGRvZXNuJ3Qgc3VwcG9ydCB1cGRhdGUgJHtKU09OLnN0cmluZ2lmeShmaWVsZFZhbHVlKX0geWV0YFxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCB3aGVyZSA9IGJ1aWxkV2hlcmVDbGF1c2Uoe1xuICAgICAgc2NoZW1hLFxuICAgICAgaW5kZXgsXG4gICAgICBxdWVyeSxcbiAgICAgIGNhc2VJbnNlbnNpdGl2ZTogZmFsc2UsXG4gICAgfSk7XG4gICAgdmFsdWVzLnB1c2goLi4ud2hlcmUudmFsdWVzKTtcblxuICAgIGNvbnN0IHdoZXJlQ2xhdXNlID0gd2hlcmUucGF0dGVybi5sZW5ndGggPiAwID8gYFdIRVJFICR7d2hlcmUucGF0dGVybn1gIDogJyc7XG4gICAgY29uc3QgcXMgPSBgVVBEQVRFICQxOm5hbWUgU0VUICR7dXBkYXRlUGF0dGVybnMuam9pbigpfSAke3doZXJlQ2xhdXNlfSBSRVRVUk5JTkcgKmA7XG4gICAgY29uc3QgcHJvbWlzZSA9ICh0cmFuc2FjdGlvbmFsU2Vzc2lvbiA/IHRyYW5zYWN0aW9uYWxTZXNzaW9uLnQgOiB0aGlzLl9jbGllbnQpLmFueShxcywgdmFsdWVzKTtcbiAgICBpZiAodHJhbnNhY3Rpb25hbFNlc3Npb24pIHtcbiAgICAgIHRyYW5zYWN0aW9uYWxTZXNzaW9uLmJhdGNoLnB1c2gocHJvbWlzZSk7XG4gICAgfVxuICAgIHJldHVybiBwcm9taXNlO1xuICB9XG5cbiAgLy8gSG9wZWZ1bGx5LCB3ZSBjYW4gZ2V0IHJpZCBvZiB0aGlzLiBJdCdzIG9ubHkgdXNlZCBmb3IgY29uZmlnIGFuZCBob29rcy5cbiAgdXBzZXJ0T25lT2JqZWN0KFxuICAgIGNsYXNzTmFtZTogc3RyaW5nLFxuICAgIHNjaGVtYTogU2NoZW1hVHlwZSxcbiAgICBxdWVyeTogUXVlcnlUeXBlLFxuICAgIHVwZGF0ZTogYW55LFxuICAgIHRyYW5zYWN0aW9uYWxTZXNzaW9uOiA/YW55XG4gICkge1xuICAgIGRlYnVnKCd1cHNlcnRPbmVPYmplY3QnKTtcbiAgICBjb25zdCBjcmVhdGVWYWx1ZSA9IE9iamVjdC5hc3NpZ24oe30sIHF1ZXJ5LCB1cGRhdGUpO1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZU9iamVjdChjbGFzc05hbWUsIHNjaGVtYSwgY3JlYXRlVmFsdWUsIHRyYW5zYWN0aW9uYWxTZXNzaW9uKS5jYXRjaChlcnJvciA9PiB7XG4gICAgICAvLyBpZ25vcmUgZHVwbGljYXRlIHZhbHVlIGVycm9ycyBhcyBpdCdzIHVwc2VydFxuICAgICAgaWYgKGVycm9yLmNvZGUgIT09IFBhcnNlLkVycm9yLkRVUExJQ0FURV9WQUxVRSkge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLmZpbmRPbmVBbmRVcGRhdGUoY2xhc3NOYW1lLCBzY2hlbWEsIHF1ZXJ5LCB1cGRhdGUsIHRyYW5zYWN0aW9uYWxTZXNzaW9uKTtcbiAgICB9KTtcbiAgfVxuXG4gIGZpbmQoXG4gICAgY2xhc3NOYW1lOiBzdHJpbmcsXG4gICAgc2NoZW1hOiBTY2hlbWFUeXBlLFxuICAgIHF1ZXJ5OiBRdWVyeVR5cGUsXG4gICAgeyBza2lwLCBsaW1pdCwgc29ydCwga2V5cywgY2FzZUluc2Vuc2l0aXZlLCBleHBsYWluIH06IFF1ZXJ5T3B0aW9uc1xuICApIHtcbiAgICBkZWJ1ZygnZmluZCcpO1xuICAgIGNvbnN0IGhhc0xpbWl0ID0gbGltaXQgIT09IHVuZGVmaW5lZDtcbiAgICBjb25zdCBoYXNTa2lwID0gc2tpcCAhPT0gdW5kZWZpbmVkO1xuICAgIGxldCB2YWx1ZXMgPSBbY2xhc3NOYW1lXTtcbiAgICBjb25zdCB3aGVyZSA9IGJ1aWxkV2hlcmVDbGF1c2Uoe1xuICAgICAgc2NoZW1hLFxuICAgICAgcXVlcnksXG4gICAgICBpbmRleDogMixcbiAgICAgIGNhc2VJbnNlbnNpdGl2ZSxcbiAgICB9KTtcbiAgICB2YWx1ZXMucHVzaCguLi53aGVyZS52YWx1ZXMpO1xuICAgIGNvbnN0IHdoZXJlUGF0dGVybiA9IHdoZXJlLnBhdHRlcm4ubGVuZ3RoID4gMCA/IGBXSEVSRSAke3doZXJlLnBhdHRlcm59YCA6ICcnO1xuICAgIGNvbnN0IGxpbWl0UGF0dGVybiA9IGhhc0xpbWl0ID8gYExJTUlUICQke3ZhbHVlcy5sZW5ndGggKyAxfWAgOiAnJztcbiAgICBpZiAoaGFzTGltaXQpIHtcbiAgICAgIHZhbHVlcy5wdXNoKGxpbWl0KTtcbiAgICB9XG4gICAgY29uc3Qgc2tpcFBhdHRlcm4gPSBoYXNTa2lwID8gYE9GRlNFVCAkJHt2YWx1ZXMubGVuZ3RoICsgMX1gIDogJyc7XG4gICAgaWYgKGhhc1NraXApIHtcbiAgICAgIHZhbHVlcy5wdXNoKHNraXApO1xuICAgIH1cblxuICAgIGxldCBzb3J0UGF0dGVybiA9ICcnO1xuICAgIGlmIChzb3J0KSB7XG4gICAgICBjb25zdCBzb3J0Q29weTogYW55ID0gc29ydDtcbiAgICAgIGNvbnN0IHNvcnRpbmcgPSBPYmplY3Qua2V5cyhzb3J0KVxuICAgICAgICAubWFwKGtleSA9PiB7XG4gICAgICAgICAgY29uc3QgdHJhbnNmb3JtS2V5ID0gdHJhbnNmb3JtRG90RmllbGRUb0NvbXBvbmVudHMoa2V5KS5qb2luKCctPicpO1xuICAgICAgICAgIC8vIFVzaW5nICRpZHggcGF0dGVybiBnaXZlczogIG5vbi1pbnRlZ2VyIGNvbnN0YW50IGluIE9SREVSIEJZXG4gICAgICAgICAgaWYgKHNvcnRDb3B5W2tleV0gPT09IDEpIHtcbiAgICAgICAgICAgIHJldHVybiBgJHt0cmFuc2Zvcm1LZXl9IEFTQ2A7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBgJHt0cmFuc2Zvcm1LZXl9IERFU0NgO1xuICAgICAgICB9KVxuICAgICAgICAuam9pbigpO1xuICAgICAgc29ydFBhdHRlcm4gPSBzb3J0ICE9PSB1bmRlZmluZWQgJiYgT2JqZWN0LmtleXMoc29ydCkubGVuZ3RoID4gMCA/IGBPUkRFUiBCWSAke3NvcnRpbmd9YCA6ICcnO1xuICAgIH1cbiAgICBpZiAod2hlcmUuc29ydHMgJiYgT2JqZWN0LmtleXMoKHdoZXJlLnNvcnRzOiBhbnkpKS5sZW5ndGggPiAwKSB7XG4gICAgICBzb3J0UGF0dGVybiA9IGBPUkRFUiBCWSAke3doZXJlLnNvcnRzLmpvaW4oKX1gO1xuICAgIH1cblxuICAgIGxldCBjb2x1bW5zID0gJyonO1xuICAgIGlmIChrZXlzKSB7XG4gICAgICAvLyBFeGNsdWRlIGVtcHR5IGtleXNcbiAgICAgIC8vIFJlcGxhY2UgQUNMIGJ5IGl0J3Mga2V5c1xuICAgICAga2V5cyA9IGtleXMucmVkdWNlKChtZW1vLCBrZXkpID0+IHtcbiAgICAgICAgaWYgKGtleSA9PT0gJ0FDTCcpIHtcbiAgICAgICAgICBtZW1vLnB1c2goJ19ycGVybScpO1xuICAgICAgICAgIG1lbW8ucHVzaCgnX3dwZXJtJyk7XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAga2V5Lmxlbmd0aCA+IDAgJiZcbiAgICAgICAgICAvLyBSZW1vdmUgc2VsZWN0ZWQgZmllbGQgbm90IHJlZmVyZW5jZWQgaW4gdGhlIHNjaGVtYVxuICAgICAgICAgIC8vIFJlbGF0aW9uIGlzIG5vdCBhIGNvbHVtbiBpbiBwb3N0Z3Jlc1xuICAgICAgICAgIC8vICRzY29yZSBpcyBhIFBhcnNlIHNwZWNpYWwgZmllbGQgYW5kIGlzIGFsc28gbm90IGEgY29sdW1uXG4gICAgICAgICAgKChzY2hlbWEuZmllbGRzW2tleV0gJiYgc2NoZW1hLmZpZWxkc1trZXldLnR5cGUgIT09ICdSZWxhdGlvbicpIHx8IGtleSA9PT0gJyRzY29yZScpXG4gICAgICAgICkge1xuICAgICAgICAgIG1lbW8ucHVzaChrZXkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZW1vO1xuICAgICAgfSwgW10pO1xuICAgICAgY29sdW1ucyA9IGtleXNcbiAgICAgICAgLm1hcCgoa2V5LCBpbmRleCkgPT4ge1xuICAgICAgICAgIGlmIChrZXkgPT09ICckc2NvcmUnKSB7XG4gICAgICAgICAgICByZXR1cm4gYHRzX3JhbmtfY2QodG9fdHN2ZWN0b3IoJCR7Mn0sICQkezN9Om5hbWUpLCB0b190c3F1ZXJ5KCQkezR9LCAkJHs1fSksIDMyKSBhcyBzY29yZWA7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBgJCR7aW5kZXggKyB2YWx1ZXMubGVuZ3RoICsgMX06bmFtZWA7XG4gICAgICAgIH0pXG4gICAgICAgIC5qb2luKCk7XG4gICAgICB2YWx1ZXMgPSB2YWx1ZXMuY29uY2F0KGtleXMpO1xuICAgIH1cblxuICAgIGNvbnN0IG9yaWdpbmFsUXVlcnkgPSBgU0VMRUNUICR7Y29sdW1uc30gRlJPTSAkMTpuYW1lICR7d2hlcmVQYXR0ZXJufSAke3NvcnRQYXR0ZXJufSAke2xpbWl0UGF0dGVybn0gJHtza2lwUGF0dGVybn1gO1xuICAgIGNvbnN0IHFzID0gZXhwbGFpbiA/IHRoaXMuY3JlYXRlRXhwbGFpbmFibGVRdWVyeShvcmlnaW5hbFF1ZXJ5KSA6IG9yaWdpbmFsUXVlcnk7XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudFxuICAgICAgLmFueShxcywgdmFsdWVzKVxuICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgLy8gUXVlcnkgb24gbm9uIGV4aXN0aW5nIHRhYmxlLCBkb24ndCBjcmFzaFxuICAgICAgICBpZiAoZXJyb3IuY29kZSAhPT0gUG9zdGdyZXNSZWxhdGlvbkRvZXNOb3RFeGlzdEVycm9yKSB7XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfSlcbiAgICAgIC50aGVuKHJlc3VsdHMgPT4ge1xuICAgICAgICBpZiAoZXhwbGFpbikge1xuICAgICAgICAgIHJldHVybiByZXN1bHRzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHRzLm1hcChvYmplY3QgPT4gdGhpcy5wb3N0Z3Jlc09iamVjdFRvUGFyc2VPYmplY3QoY2xhc3NOYW1lLCBvYmplY3QsIHNjaGVtYSkpO1xuICAgICAgfSk7XG4gIH1cblxuICAvLyBDb252ZXJ0cyBmcm9tIGEgcG9zdGdyZXMtZm9ybWF0IG9iamVjdCB0byBhIFJFU1QtZm9ybWF0IG9iamVjdC5cbiAgLy8gRG9lcyBub3Qgc3RyaXAgb3V0IGFueXRoaW5nIGJhc2VkIG9uIGEgbGFjayBvZiBhdXRoZW50aWNhdGlvbi5cbiAgcG9zdGdyZXNPYmplY3RUb1BhcnNlT2JqZWN0KGNsYXNzTmFtZTogc3RyaW5nLCBvYmplY3Q6IGFueSwgc2NoZW1hOiBhbnkpIHtcbiAgICBPYmplY3Qua2V5cyhzY2hlbWEuZmllbGRzKS5mb3JFYWNoKGZpZWxkTmFtZSA9PiB7XG4gICAgICBpZiAoc2NoZW1hLmZpZWxkc1tmaWVsZE5hbWVdLnR5cGUgPT09ICdQb2ludGVyJyAmJiBvYmplY3RbZmllbGROYW1lXSkge1xuICAgICAgICBvYmplY3RbZmllbGROYW1lXSA9IHtcbiAgICAgICAgICBvYmplY3RJZDogb2JqZWN0W2ZpZWxkTmFtZV0sXG4gICAgICAgICAgX190eXBlOiAnUG9pbnRlcicsXG4gICAgICAgICAgY2xhc3NOYW1lOiBzY2hlbWEuZmllbGRzW2ZpZWxkTmFtZV0udGFyZ2V0Q2xhc3MsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBpZiAoc2NoZW1hLmZpZWxkc1tmaWVsZE5hbWVdLnR5cGUgPT09ICdSZWxhdGlvbicpIHtcbiAgICAgICAgb2JqZWN0W2ZpZWxkTmFtZV0gPSB7XG4gICAgICAgICAgX190eXBlOiAnUmVsYXRpb24nLFxuICAgICAgICAgIGNsYXNzTmFtZTogc2NoZW1hLmZpZWxkc1tmaWVsZE5hbWVdLnRhcmdldENsYXNzLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgaWYgKG9iamVjdFtmaWVsZE5hbWVdICYmIHNjaGVtYS5maWVsZHNbZmllbGROYW1lXS50eXBlID09PSAnR2VvUG9pbnQnKSB7XG4gICAgICAgIG9iamVjdFtmaWVsZE5hbWVdID0ge1xuICAgICAgICAgIF9fdHlwZTogJ0dlb1BvaW50JyxcbiAgICAgICAgICBsYXRpdHVkZTogb2JqZWN0W2ZpZWxkTmFtZV0ueSxcbiAgICAgICAgICBsb25naXR1ZGU6IG9iamVjdFtmaWVsZE5hbWVdLngsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBpZiAob2JqZWN0W2ZpZWxkTmFtZV0gJiYgc2NoZW1hLmZpZWxkc1tmaWVsZE5hbWVdLnR5cGUgPT09ICdQb2x5Z29uJykge1xuICAgICAgICBsZXQgY29vcmRzID0gb2JqZWN0W2ZpZWxkTmFtZV07XG4gICAgICAgIGNvb3JkcyA9IGNvb3Jkcy5zdWJzdHIoMiwgY29vcmRzLmxlbmd0aCAtIDQpLnNwbGl0KCcpLCgnKTtcbiAgICAgICAgY29vcmRzID0gY29vcmRzLm1hcChwb2ludCA9PiB7XG4gICAgICAgICAgcmV0dXJuIFtwYXJzZUZsb2F0KHBvaW50LnNwbGl0KCcsJylbMV0pLCBwYXJzZUZsb2F0KHBvaW50LnNwbGl0KCcsJylbMF0pXTtcbiAgICAgICAgfSk7XG4gICAgICAgIG9iamVjdFtmaWVsZE5hbWVdID0ge1xuICAgICAgICAgIF9fdHlwZTogJ1BvbHlnb24nLFxuICAgICAgICAgIGNvb3JkaW5hdGVzOiBjb29yZHMsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBpZiAob2JqZWN0W2ZpZWxkTmFtZV0gJiYgc2NoZW1hLmZpZWxkc1tmaWVsZE5hbWVdLnR5cGUgPT09ICdGaWxlJykge1xuICAgICAgICBvYmplY3RbZmllbGROYW1lXSA9IHtcbiAgICAgICAgICBfX3R5cGU6ICdGaWxlJyxcbiAgICAgICAgICBuYW1lOiBvYmplY3RbZmllbGROYW1lXSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICAvL1RPRE86IHJlbW92ZSB0aGlzIHJlbGlhbmNlIG9uIHRoZSBtb25nbyBmb3JtYXQuIERCIGFkYXB0ZXIgc2hvdWxkbid0IGtub3cgdGhlcmUgaXMgYSBkaWZmZXJlbmNlIGJldHdlZW4gY3JlYXRlZCBhdCBhbmQgYW55IG90aGVyIGRhdGUgZmllbGQuXG4gICAgaWYgKG9iamVjdC5jcmVhdGVkQXQpIHtcbiAgICAgIG9iamVjdC5jcmVhdGVkQXQgPSBvYmplY3QuY3JlYXRlZEF0LnRvSVNPU3RyaW5nKCk7XG4gICAgfVxuICAgIGlmIChvYmplY3QudXBkYXRlZEF0KSB7XG4gICAgICBvYmplY3QudXBkYXRlZEF0ID0gb2JqZWN0LnVwZGF0ZWRBdC50b0lTT1N0cmluZygpO1xuICAgIH1cbiAgICBpZiAob2JqZWN0LmV4cGlyZXNBdCkge1xuICAgICAgb2JqZWN0LmV4cGlyZXNBdCA9IHtcbiAgICAgICAgX190eXBlOiAnRGF0ZScsXG4gICAgICAgIGlzbzogb2JqZWN0LmV4cGlyZXNBdC50b0lTT1N0cmluZygpLFxuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKG9iamVjdC5fZW1haWxfdmVyaWZ5X3Rva2VuX2V4cGlyZXNfYXQpIHtcbiAgICAgIG9iamVjdC5fZW1haWxfdmVyaWZ5X3Rva2VuX2V4cGlyZXNfYXQgPSB7XG4gICAgICAgIF9fdHlwZTogJ0RhdGUnLFxuICAgICAgICBpc286IG9iamVjdC5fZW1haWxfdmVyaWZ5X3Rva2VuX2V4cGlyZXNfYXQudG9JU09TdHJpbmcoKSxcbiAgICAgIH07XG4gICAgfVxuICAgIGlmIChvYmplY3QuX2FjY291bnRfbG9ja291dF9leHBpcmVzX2F0KSB7XG4gICAgICBvYmplY3QuX2FjY291bnRfbG9ja291dF9leHBpcmVzX2F0ID0ge1xuICAgICAgICBfX3R5cGU6ICdEYXRlJyxcbiAgICAgICAgaXNvOiBvYmplY3QuX2FjY291bnRfbG9ja291dF9leHBpcmVzX2F0LnRvSVNPU3RyaW5nKCksXG4gICAgICB9O1xuICAgIH1cbiAgICBpZiAob2JqZWN0Ll9wZXJpc2hhYmxlX3Rva2VuX2V4cGlyZXNfYXQpIHtcbiAgICAgIG9iamVjdC5fcGVyaXNoYWJsZV90b2tlbl9leHBpcmVzX2F0ID0ge1xuICAgICAgICBfX3R5cGU6ICdEYXRlJyxcbiAgICAgICAgaXNvOiBvYmplY3QuX3BlcmlzaGFibGVfdG9rZW5fZXhwaXJlc19hdC50b0lTT1N0cmluZygpLFxuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKG9iamVjdC5fcGFzc3dvcmRfY2hhbmdlZF9hdCkge1xuICAgICAgb2JqZWN0Ll9wYXNzd29yZF9jaGFuZ2VkX2F0ID0ge1xuICAgICAgICBfX3R5cGU6ICdEYXRlJyxcbiAgICAgICAgaXNvOiBvYmplY3QuX3Bhc3N3b3JkX2NoYW5nZWRfYXQudG9JU09TdHJpbmcoKSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBmaWVsZE5hbWUgaW4gb2JqZWN0KSB7XG4gICAgICBpZiAob2JqZWN0W2ZpZWxkTmFtZV0gPT09IG51bGwpIHtcbiAgICAgICAgZGVsZXRlIG9iamVjdFtmaWVsZE5hbWVdO1xuICAgICAgfVxuICAgICAgaWYgKG9iamVjdFtmaWVsZE5hbWVdIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICBvYmplY3RbZmllbGROYW1lXSA9IHtcbiAgICAgICAgICBfX3R5cGU6ICdEYXRlJyxcbiAgICAgICAgICBpc286IG9iamVjdFtmaWVsZE5hbWVdLnRvSVNPU3RyaW5nKCksXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG9iamVjdDtcbiAgfVxuXG4gIC8vIENyZWF0ZSBhIHVuaXF1ZSBpbmRleC4gVW5pcXVlIGluZGV4ZXMgb24gbnVsbGFibGUgZmllbGRzIGFyZSBub3QgYWxsb3dlZC4gU2luY2Ugd2UgZG9uJ3RcbiAgLy8gY3VycmVudGx5IGtub3cgd2hpY2ggZmllbGRzIGFyZSBudWxsYWJsZSBhbmQgd2hpY2ggYXJlbid0LCB3ZSBpZ25vcmUgdGhhdCBjcml0ZXJpYS5cbiAgLy8gQXMgc3VjaCwgd2Ugc2hvdWxkbid0IGV4cG9zZSB0aGlzIGZ1bmN0aW9uIHRvIHVzZXJzIG9mIHBhcnNlIHVudGlsIHdlIGhhdmUgYW4gb3V0LW9mLWJhbmRcbiAgLy8gV2F5IG9mIGRldGVybWluaW5nIGlmIGEgZmllbGQgaXMgbnVsbGFibGUuIFVuZGVmaW5lZCBkb2Vzbid0IGNvdW50IGFnYWluc3QgdW5pcXVlbmVzcyxcbiAgLy8gd2hpY2ggaXMgd2h5IHdlIHVzZSBzcGFyc2UgaW5kZXhlcy5cbiAgYXN5bmMgZW5zdXJlVW5pcXVlbmVzcyhjbGFzc05hbWU6IHN0cmluZywgc2NoZW1hOiBTY2hlbWFUeXBlLCBmaWVsZE5hbWVzOiBzdHJpbmdbXSkge1xuICAgIGNvbnN0IGNvbnN0cmFpbnROYW1lID0gYCR7Y2xhc3NOYW1lfV91bmlxdWVfJHtmaWVsZE5hbWVzLnNvcnQoKS5qb2luKCdfJyl9YDtcbiAgICBjb25zdCBjb25zdHJhaW50UGF0dGVybnMgPSBmaWVsZE5hbWVzLm1hcCgoZmllbGROYW1lLCBpbmRleCkgPT4gYCQke2luZGV4ICsgM306bmFtZWApO1xuICAgIGNvbnN0IHFzID0gYENSRUFURSBVTklRVUUgSU5ERVggSUYgTk9UIEVYSVNUUyAkMjpuYW1lIE9OICQxOm5hbWUoJHtjb25zdHJhaW50UGF0dGVybnMuam9pbigpfSlgO1xuICAgIHJldHVybiB0aGlzLl9jbGllbnQubm9uZShxcywgW2NsYXNzTmFtZSwgY29uc3RyYWludE5hbWUsIC4uLmZpZWxkTmFtZXNdKS5jYXRjaChlcnJvciA9PiB7XG4gICAgICBpZiAoZXJyb3IuY29kZSA9PT0gUG9zdGdyZXNEdXBsaWNhdGVSZWxhdGlvbkVycm9yICYmIGVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoY29uc3RyYWludE5hbWUpKSB7XG4gICAgICAgIC8vIEluZGV4IGFscmVhZHkgZXhpc3RzLiBJZ25vcmUgZXJyb3IuXG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICBlcnJvci5jb2RlID09PSBQb3N0Z3Jlc1VuaXF1ZUluZGV4VmlvbGF0aW9uRXJyb3IgJiZcbiAgICAgICAgZXJyb3IubWVzc2FnZS5pbmNsdWRlcyhjb25zdHJhaW50TmFtZSlcbiAgICAgICkge1xuICAgICAgICAvLyBDYXN0IHRoZSBlcnJvciBpbnRvIHRoZSBwcm9wZXIgcGFyc2UgZXJyb3JcbiAgICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFxuICAgICAgICAgIFBhcnNlLkVycm9yLkRVUExJQ0FURV9WQUxVRSxcbiAgICAgICAgICAnQSBkdXBsaWNhdGUgdmFsdWUgZm9yIGEgZmllbGQgd2l0aCB1bmlxdWUgdmFsdWVzIHdhcyBwcm92aWRlZCdcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLy8gRXhlY3V0ZXMgYSBjb3VudC5cbiAgYXN5bmMgY291bnQoXG4gICAgY2xhc3NOYW1lOiBzdHJpbmcsXG4gICAgc2NoZW1hOiBTY2hlbWFUeXBlLFxuICAgIHF1ZXJ5OiBRdWVyeVR5cGUsXG4gICAgcmVhZFByZWZlcmVuY2U/OiBzdHJpbmcsXG4gICAgZXN0aW1hdGU/OiBib29sZWFuID0gdHJ1ZVxuICApIHtcbiAgICBkZWJ1ZygnY291bnQnKTtcbiAgICBjb25zdCB2YWx1ZXMgPSBbY2xhc3NOYW1lXTtcbiAgICBjb25zdCB3aGVyZSA9IGJ1aWxkV2hlcmVDbGF1c2Uoe1xuICAgICAgc2NoZW1hLFxuICAgICAgcXVlcnksXG4gICAgICBpbmRleDogMixcbiAgICAgIGNhc2VJbnNlbnNpdGl2ZTogZmFsc2UsXG4gICAgfSk7XG4gICAgdmFsdWVzLnB1c2goLi4ud2hlcmUudmFsdWVzKTtcblxuICAgIGNvbnN0IHdoZXJlUGF0dGVybiA9IHdoZXJlLnBhdHRlcm4ubGVuZ3RoID4gMCA/IGBXSEVSRSAke3doZXJlLnBhdHRlcm59YCA6ICcnO1xuICAgIGxldCBxcyA9ICcnO1xuXG4gICAgaWYgKHdoZXJlLnBhdHRlcm4ubGVuZ3RoID4gMCB8fCAhZXN0aW1hdGUpIHtcbiAgICAgIHFzID0gYFNFTEVDVCBjb3VudCgqKSBGUk9NICQxOm5hbWUgJHt3aGVyZVBhdHRlcm59YDtcbiAgICB9IGVsc2Uge1xuICAgICAgcXMgPSAnU0VMRUNUIHJlbHR1cGxlcyBBUyBhcHByb3hpbWF0ZV9yb3dfY291bnQgRlJPTSBwZ19jbGFzcyBXSEVSRSByZWxuYW1lID0gJDEnO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9jbGllbnRcbiAgICAgIC5vbmUocXMsIHZhbHVlcywgYSA9PiB7XG4gICAgICAgIGlmIChhLmFwcHJveGltYXRlX3Jvd19jb3VudCA9PSBudWxsIHx8IGEuYXBwcm94aW1hdGVfcm93X2NvdW50ID09IC0xKSB7XG4gICAgICAgICAgcmV0dXJuICFpc05hTigrYS5jb3VudCkgPyArYS5jb3VudCA6IDA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuICthLmFwcHJveGltYXRlX3Jvd19jb3VudDtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgIGlmIChlcnJvci5jb2RlICE9PSBQb3N0Z3Jlc1JlbGF0aW9uRG9lc05vdEV4aXN0RXJyb3IpIHtcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gMDtcbiAgICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgZGlzdGluY3QoY2xhc3NOYW1lOiBzdHJpbmcsIHNjaGVtYTogU2NoZW1hVHlwZSwgcXVlcnk6IFF1ZXJ5VHlwZSwgZmllbGROYW1lOiBzdHJpbmcpIHtcbiAgICBkZWJ1ZygnZGlzdGluY3QnKTtcbiAgICBsZXQgZmllbGQgPSBmaWVsZE5hbWU7XG4gICAgbGV0IGNvbHVtbiA9IGZpZWxkTmFtZTtcbiAgICBjb25zdCBpc05lc3RlZCA9IGZpZWxkTmFtZS5pbmRleE9mKCcuJykgPj0gMDtcbiAgICBpZiAoaXNOZXN0ZWQpIHtcbiAgICAgIGZpZWxkID0gdHJhbnNmb3JtRG90RmllbGRUb0NvbXBvbmVudHMoZmllbGROYW1lKS5qb2luKCctPicpO1xuICAgICAgY29sdW1uID0gZmllbGROYW1lLnNwbGl0KCcuJylbMF07XG4gICAgfVxuICAgIGNvbnN0IGlzQXJyYXlGaWVsZCA9XG4gICAgICBzY2hlbWEuZmllbGRzICYmIHNjaGVtYS5maWVsZHNbZmllbGROYW1lXSAmJiBzY2hlbWEuZmllbGRzW2ZpZWxkTmFtZV0udHlwZSA9PT0gJ0FycmF5JztcbiAgICBjb25zdCBpc1BvaW50ZXJGaWVsZCA9XG4gICAgICBzY2hlbWEuZmllbGRzICYmIHNjaGVtYS5maWVsZHNbZmllbGROYW1lXSAmJiBzY2hlbWEuZmllbGRzW2ZpZWxkTmFtZV0udHlwZSA9PT0gJ1BvaW50ZXInO1xuICAgIGNvbnN0IHZhbHVlcyA9IFtmaWVsZCwgY29sdW1uLCBjbGFzc05hbWVdO1xuICAgIGNvbnN0IHdoZXJlID0gYnVpbGRXaGVyZUNsYXVzZSh7XG4gICAgICBzY2hlbWEsXG4gICAgICBxdWVyeSxcbiAgICAgIGluZGV4OiA0LFxuICAgICAgY2FzZUluc2Vuc2l0aXZlOiBmYWxzZSxcbiAgICB9KTtcbiAgICB2YWx1ZXMucHVzaCguLi53aGVyZS52YWx1ZXMpO1xuXG4gICAgY29uc3Qgd2hlcmVQYXR0ZXJuID0gd2hlcmUucGF0dGVybi5sZW5ndGggPiAwID8gYFdIRVJFICR7d2hlcmUucGF0dGVybn1gIDogJyc7XG4gICAgY29uc3QgdHJhbnNmb3JtZXIgPSBpc0FycmF5RmllbGQgPyAnanNvbmJfYXJyYXlfZWxlbWVudHMnIDogJ09OJztcbiAgICBsZXQgcXMgPSBgU0VMRUNUIERJU1RJTkNUICR7dHJhbnNmb3JtZXJ9KCQxOm5hbWUpICQyOm5hbWUgRlJPTSAkMzpuYW1lICR7d2hlcmVQYXR0ZXJufWA7XG4gICAgaWYgKGlzTmVzdGVkKSB7XG4gICAgICBxcyA9IGBTRUxFQ1QgRElTVElOQ1QgJHt0cmFuc2Zvcm1lcn0oJDE6cmF3KSAkMjpyYXcgRlJPTSAkMzpuYW1lICR7d2hlcmVQYXR0ZXJufWA7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9jbGllbnRcbiAgICAgIC5hbnkocXMsIHZhbHVlcylcbiAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgIGlmIChlcnJvci5jb2RlID09PSBQb3N0Z3Jlc01pc3NpbmdDb2x1bW5FcnJvcikge1xuICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH0pXG4gICAgICAudGhlbihyZXN1bHRzID0+IHtcbiAgICAgICAgaWYgKCFpc05lc3RlZCkge1xuICAgICAgICAgIHJlc3VsdHMgPSByZXN1bHRzLmZpbHRlcihvYmplY3QgPT4gb2JqZWN0W2ZpZWxkXSAhPT0gbnVsbCk7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdHMubWFwKG9iamVjdCA9PiB7XG4gICAgICAgICAgICBpZiAoIWlzUG9pbnRlckZpZWxkKSB7XG4gICAgICAgICAgICAgIHJldHVybiBvYmplY3RbZmllbGRdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgX190eXBlOiAnUG9pbnRlcicsXG4gICAgICAgICAgICAgIGNsYXNzTmFtZTogc2NoZW1hLmZpZWxkc1tmaWVsZE5hbWVdLnRhcmdldENsYXNzLFxuICAgICAgICAgICAgICBvYmplY3RJZDogb2JqZWN0W2ZpZWxkXSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY2hpbGQgPSBmaWVsZE5hbWUuc3BsaXQoJy4nKVsxXTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdHMubWFwKG9iamVjdCA9PiBvYmplY3RbY29sdW1uXVtjaGlsZF0pO1xuICAgICAgfSlcbiAgICAgIC50aGVuKHJlc3VsdHMgPT5cbiAgICAgICAgcmVzdWx0cy5tYXAob2JqZWN0ID0+IHRoaXMucG9zdGdyZXNPYmplY3RUb1BhcnNlT2JqZWN0KGNsYXNzTmFtZSwgb2JqZWN0LCBzY2hlbWEpKVxuICAgICAgKTtcbiAgfVxuXG4gIGFzeW5jIGFnZ3JlZ2F0ZShcbiAgICBjbGFzc05hbWU6IHN0cmluZyxcbiAgICBzY2hlbWE6IGFueSxcbiAgICBwaXBlbGluZTogYW55LFxuICAgIHJlYWRQcmVmZXJlbmNlOiA/c3RyaW5nLFxuICAgIGhpbnQ6ID9taXhlZCxcbiAgICBleHBsYWluPzogYm9vbGVhblxuICApIHtcbiAgICBkZWJ1ZygnYWdncmVnYXRlJyk7XG4gICAgY29uc3QgdmFsdWVzID0gW2NsYXNzTmFtZV07XG4gICAgbGV0IGluZGV4OiBudW1iZXIgPSAyO1xuICAgIGxldCBjb2x1bW5zOiBzdHJpbmdbXSA9IFtdO1xuICAgIGxldCBjb3VudEZpZWxkID0gbnVsbDtcbiAgICBsZXQgZ3JvdXBWYWx1ZXMgPSBudWxsO1xuICAgIGxldCB3aGVyZVBhdHRlcm4gPSAnJztcbiAgICBsZXQgbGltaXRQYXR0ZXJuID0gJyc7XG4gICAgbGV0IHNraXBQYXR0ZXJuID0gJyc7XG4gICAgbGV0IHNvcnRQYXR0ZXJuID0gJyc7XG4gICAgbGV0IGdyb3VwUGF0dGVybiA9ICcnO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGlwZWxpbmUubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgIGNvbnN0IHN0YWdlID0gcGlwZWxpbmVbaV07XG4gICAgICBpZiAoc3RhZ2UuJGdyb3VwKSB7XG4gICAgICAgIGZvciAoY29uc3QgZmllbGQgaW4gc3RhZ2UuJGdyb3VwKSB7XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBzdGFnZS4kZ3JvdXBbZmllbGRdO1xuICAgICAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGZpZWxkID09PSAnX2lkJyAmJiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIHZhbHVlICE9PSAnJykge1xuICAgICAgICAgICAgY29sdW1ucy5wdXNoKGAkJHtpbmRleH06bmFtZSBBUyBcIm9iamVjdElkXCJgKTtcbiAgICAgICAgICAgIGdyb3VwUGF0dGVybiA9IGBHUk9VUCBCWSAkJHtpbmRleH06bmFtZWA7XG4gICAgICAgICAgICB2YWx1ZXMucHVzaCh0cmFuc2Zvcm1BZ2dyZWdhdGVGaWVsZCh2YWx1ZSkpO1xuICAgICAgICAgICAgaW5kZXggKz0gMTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZmllbGQgPT09ICdfaWQnICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgZ3JvdXBWYWx1ZXMgPSB2YWx1ZTtcbiAgICAgICAgICAgIGNvbnN0IGdyb3VwQnlGaWVsZHMgPSBbXTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgYWxpYXMgaW4gdmFsdWUpIHtcbiAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZVthbGlhc10gPT09ICdzdHJpbmcnICYmIHZhbHVlW2FsaWFzXSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNvdXJjZSA9IHRyYW5zZm9ybUFnZ3JlZ2F0ZUZpZWxkKHZhbHVlW2FsaWFzXSk7XG4gICAgICAgICAgICAgICAgaWYgKCFncm91cEJ5RmllbGRzLmluY2x1ZGVzKGBcIiR7c291cmNlfVwiYCkpIHtcbiAgICAgICAgICAgICAgICAgIGdyb3VwQnlGaWVsZHMucHVzaChgXCIke3NvdXJjZX1cImApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YWx1ZXMucHVzaChzb3VyY2UsIGFsaWFzKTtcbiAgICAgICAgICAgICAgICBjb2x1bW5zLnB1c2goYCQke2luZGV4fTpuYW1lIEFTICQke2luZGV4ICsgMX06bmFtZWApO1xuICAgICAgICAgICAgICAgIGluZGV4ICs9IDI7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgb3BlcmF0aW9uID0gT2JqZWN0LmtleXModmFsdWVbYWxpYXNdKVswXTtcbiAgICAgICAgICAgICAgICBjb25zdCBzb3VyY2UgPSB0cmFuc2Zvcm1BZ2dyZWdhdGVGaWVsZCh2YWx1ZVthbGlhc11bb3BlcmF0aW9uXSk7XG4gICAgICAgICAgICAgICAgaWYgKG1vbmdvQWdncmVnYXRlVG9Qb3N0Z3Jlc1tvcGVyYXRpb25dKSB7XG4gICAgICAgICAgICAgICAgICBpZiAoIWdyb3VwQnlGaWVsZHMuaW5jbHVkZXMoYFwiJHtzb3VyY2V9XCJgKSkge1xuICAgICAgICAgICAgICAgICAgICBncm91cEJ5RmllbGRzLnB1c2goYFwiJHtzb3VyY2V9XCJgKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGNvbHVtbnMucHVzaChcbiAgICAgICAgICAgICAgICAgICAgYEVYVFJBQ1QoJHtcbiAgICAgICAgICAgICAgICAgICAgICBtb25nb0FnZ3JlZ2F0ZVRvUG9zdGdyZXNbb3BlcmF0aW9uXVxuICAgICAgICAgICAgICAgICAgICB9IEZST00gJCR7aW5kZXh9Om5hbWUgQVQgVElNRSBaT05FICdVVEMnKTo6aW50ZWdlciBBUyAkJHtpbmRleCArIDF9Om5hbWVgXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgdmFsdWVzLnB1c2goc291cmNlLCBhbGlhcyk7XG4gICAgICAgICAgICAgICAgICBpbmRleCArPSAyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZ3JvdXBQYXR0ZXJuID0gYEdST1VQIEJZICQke2luZGV4fTpyYXdgO1xuICAgICAgICAgICAgdmFsdWVzLnB1c2goZ3JvdXBCeUZpZWxkcy5qb2luKCkpO1xuICAgICAgICAgICAgaW5kZXggKz0gMTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgaWYgKHZhbHVlLiRzdW0pIHtcbiAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZS4kc3VtID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIGNvbHVtbnMucHVzaChgU1VNKCQke2luZGV4fTpuYW1lKSBBUyAkJHtpbmRleCArIDF9Om5hbWVgKTtcbiAgICAgICAgICAgICAgICB2YWx1ZXMucHVzaCh0cmFuc2Zvcm1BZ2dyZWdhdGVGaWVsZCh2YWx1ZS4kc3VtKSwgZmllbGQpO1xuICAgICAgICAgICAgICAgIGluZGV4ICs9IDI7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY291bnRGaWVsZCA9IGZpZWxkO1xuICAgICAgICAgICAgICAgIGNvbHVtbnMucHVzaChgQ09VTlQoKikgQVMgJCR7aW5kZXh9Om5hbWVgKTtcbiAgICAgICAgICAgICAgICB2YWx1ZXMucHVzaChmaWVsZCk7XG4gICAgICAgICAgICAgICAgaW5kZXggKz0gMTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHZhbHVlLiRtYXgpIHtcbiAgICAgICAgICAgICAgY29sdW1ucy5wdXNoKGBNQVgoJCR7aW5kZXh9Om5hbWUpIEFTICQke2luZGV4ICsgMX06bmFtZWApO1xuICAgICAgICAgICAgICB2YWx1ZXMucHVzaCh0cmFuc2Zvcm1BZ2dyZWdhdGVGaWVsZCh2YWx1ZS4kbWF4KSwgZmllbGQpO1xuICAgICAgICAgICAgICBpbmRleCArPSAyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHZhbHVlLiRtaW4pIHtcbiAgICAgICAgICAgICAgY29sdW1ucy5wdXNoKGBNSU4oJCR7aW5kZXh9Om5hbWUpIEFTICQke2luZGV4ICsgMX06bmFtZWApO1xuICAgICAgICAgICAgICB2YWx1ZXMucHVzaCh0cmFuc2Zvcm1BZ2dyZWdhdGVGaWVsZCh2YWx1ZS4kbWluKSwgZmllbGQpO1xuICAgICAgICAgICAgICBpbmRleCArPSAyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHZhbHVlLiRhdmcpIHtcbiAgICAgICAgICAgICAgY29sdW1ucy5wdXNoKGBBVkcoJCR7aW5kZXh9Om5hbWUpIEFTICQke2luZGV4ICsgMX06bmFtZWApO1xuICAgICAgICAgICAgICB2YWx1ZXMucHVzaCh0cmFuc2Zvcm1BZ2dyZWdhdGVGaWVsZCh2YWx1ZS4kYXZnKSwgZmllbGQpO1xuICAgICAgICAgICAgICBpbmRleCArPSAyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29sdW1ucy5wdXNoKCcqJyk7XG4gICAgICB9XG4gICAgICBpZiAoc3RhZ2UuJHByb2plY3QpIHtcbiAgICAgICAgaWYgKGNvbHVtbnMuaW5jbHVkZXMoJyonKSkge1xuICAgICAgICAgIGNvbHVtbnMgPSBbXTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IGZpZWxkIGluIHN0YWdlLiRwcm9qZWN0KSB7XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBzdGFnZS4kcHJvamVjdFtmaWVsZF07XG4gICAgICAgICAgaWYgKHZhbHVlID09PSAxIHx8IHZhbHVlID09PSB0cnVlKSB7XG4gICAgICAgICAgICBjb2x1bW5zLnB1c2goYCQke2luZGV4fTpuYW1lYCk7XG4gICAgICAgICAgICB2YWx1ZXMucHVzaChmaWVsZCk7XG4gICAgICAgICAgICBpbmRleCArPSAxO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHN0YWdlLiRtYXRjaCkge1xuICAgICAgICBjb25zdCBwYXR0ZXJucyA9IFtdO1xuICAgICAgICBjb25zdCBvck9yQW5kID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHN0YWdlLiRtYXRjaCwgJyRvcicpXG4gICAgICAgICAgPyAnIE9SICdcbiAgICAgICAgICA6ICcgQU5EICc7XG5cbiAgICAgICAgaWYgKHN0YWdlLiRtYXRjaC4kb3IpIHtcbiAgICAgICAgICBjb25zdCBjb2xsYXBzZSA9IHt9O1xuICAgICAgICAgIHN0YWdlLiRtYXRjaC4kb3IuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgY29sbGFwc2Vba2V5XSA9IGVsZW1lbnRba2V5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICBzdGFnZS4kbWF0Y2ggPSBjb2xsYXBzZTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IGZpZWxkIGluIHN0YWdlLiRtYXRjaCkge1xuICAgICAgICAgIGNvbnN0IHZhbHVlID0gc3RhZ2UuJG1hdGNoW2ZpZWxkXTtcbiAgICAgICAgICBjb25zdCBtYXRjaFBhdHRlcm5zID0gW107XG4gICAgICAgICAgT2JqZWN0LmtleXMoUGFyc2VUb1Bvc2dyZXNDb21wYXJhdG9yKS5mb3JFYWNoKGNtcCA9PiB7XG4gICAgICAgICAgICBpZiAodmFsdWVbY21wXSkge1xuICAgICAgICAgICAgICBjb25zdCBwZ0NvbXBhcmF0b3IgPSBQYXJzZVRvUG9zZ3Jlc0NvbXBhcmF0b3JbY21wXTtcbiAgICAgICAgICAgICAgbWF0Y2hQYXR0ZXJucy5wdXNoKGAkJHtpbmRleH06bmFtZSAke3BnQ29tcGFyYXRvcn0gJCR7aW5kZXggKyAxfWApO1xuICAgICAgICAgICAgICB2YWx1ZXMucHVzaChmaWVsZCwgdG9Qb3N0Z3Jlc1ZhbHVlKHZhbHVlW2NtcF0pKTtcbiAgICAgICAgICAgICAgaW5kZXggKz0gMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAobWF0Y2hQYXR0ZXJucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBwYXR0ZXJucy5wdXNoKGAoJHttYXRjaFBhdHRlcm5zLmpvaW4oJyBBTkQgJyl9KWApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoc2NoZW1hLmZpZWxkc1tmaWVsZF0gJiYgc2NoZW1hLmZpZWxkc1tmaWVsZF0udHlwZSAmJiBtYXRjaFBhdHRlcm5zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcGF0dGVybnMucHVzaChgJCR7aW5kZXh9Om5hbWUgPSAkJHtpbmRleCArIDF9YCk7XG4gICAgICAgICAgICB2YWx1ZXMucHVzaChmaWVsZCwgdmFsdWUpO1xuICAgICAgICAgICAgaW5kZXggKz0gMjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgd2hlcmVQYXR0ZXJuID0gcGF0dGVybnMubGVuZ3RoID4gMCA/IGBXSEVSRSAke3BhdHRlcm5zLmpvaW4oYCAke29yT3JBbmR9IGApfWAgOiAnJztcbiAgICAgIH1cbiAgICAgIGlmIChzdGFnZS4kbGltaXQpIHtcbiAgICAgICAgbGltaXRQYXR0ZXJuID0gYExJTUlUICQke2luZGV4fWA7XG4gICAgICAgIHZhbHVlcy5wdXNoKHN0YWdlLiRsaW1pdCk7XG4gICAgICAgIGluZGV4ICs9IDE7XG4gICAgICB9XG4gICAgICBpZiAoc3RhZ2UuJHNraXApIHtcbiAgICAgICAgc2tpcFBhdHRlcm4gPSBgT0ZGU0VUICQke2luZGV4fWA7XG4gICAgICAgIHZhbHVlcy5wdXNoKHN0YWdlLiRza2lwKTtcbiAgICAgICAgaW5kZXggKz0gMTtcbiAgICAgIH1cbiAgICAgIGlmIChzdGFnZS4kc29ydCkge1xuICAgICAgICBjb25zdCBzb3J0ID0gc3RhZ2UuJHNvcnQ7XG4gICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhzb3J0KTtcbiAgICAgICAgY29uc3Qgc29ydGluZyA9IGtleXNcbiAgICAgICAgICAubWFwKGtleSA9PiB7XG4gICAgICAgICAgICBjb25zdCB0cmFuc2Zvcm1lciA9IHNvcnRba2V5XSA9PT0gMSA/ICdBU0MnIDogJ0RFU0MnO1xuICAgICAgICAgICAgY29uc3Qgb3JkZXIgPSBgJCR7aW5kZXh9Om5hbWUgJHt0cmFuc2Zvcm1lcn1gO1xuICAgICAgICAgICAgaW5kZXggKz0gMTtcbiAgICAgICAgICAgIHJldHVybiBvcmRlcjtcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5qb2luKCk7XG4gICAgICAgIHZhbHVlcy5wdXNoKC4uLmtleXMpO1xuICAgICAgICBzb3J0UGF0dGVybiA9IHNvcnQgIT09IHVuZGVmaW5lZCAmJiBzb3J0aW5nLmxlbmd0aCA+IDAgPyBgT1JERVIgQlkgJHtzb3J0aW5nfWAgOiAnJztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZ3JvdXBQYXR0ZXJuKSB7XG4gICAgICBjb2x1bW5zLmZvckVhY2goKGUsIGksIGEpID0+IHtcbiAgICAgICAgaWYgKGUgJiYgZS50cmltKCkgPT09ICcqJykge1xuICAgICAgICAgIGFbaV0gPSAnJztcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3Qgb3JpZ2luYWxRdWVyeSA9IGBTRUxFQ1QgJHtjb2x1bW5zXG4gICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAuam9pbigpfSBGUk9NICQxOm5hbWUgJHt3aGVyZVBhdHRlcm59ICR7c2tpcFBhdHRlcm59ICR7Z3JvdXBQYXR0ZXJufSAke3NvcnRQYXR0ZXJufSAke2xpbWl0UGF0dGVybn1gO1xuICAgIGNvbnN0IHFzID0gZXhwbGFpbiA/IHRoaXMuY3JlYXRlRXhwbGFpbmFibGVRdWVyeShvcmlnaW5hbFF1ZXJ5KSA6IG9yaWdpbmFsUXVlcnk7XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudC5hbnkocXMsIHZhbHVlcykudGhlbihhID0+IHtcbiAgICAgIGlmIChleHBsYWluKSB7XG4gICAgICAgIHJldHVybiBhO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVzdWx0cyA9IGEubWFwKG9iamVjdCA9PiB0aGlzLnBvc3RncmVzT2JqZWN0VG9QYXJzZU9iamVjdChjbGFzc05hbWUsIG9iamVjdCwgc2NoZW1hKSk7XG4gICAgICByZXN1bHRzLmZvckVhY2gocmVzdWx0ID0+IHtcbiAgICAgICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocmVzdWx0LCAnb2JqZWN0SWQnKSkge1xuICAgICAgICAgIHJlc3VsdC5vYmplY3RJZCA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGdyb3VwVmFsdWVzKSB7XG4gICAgICAgICAgcmVzdWx0Lm9iamVjdElkID0ge307XG4gICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gZ3JvdXBWYWx1ZXMpIHtcbiAgICAgICAgICAgIHJlc3VsdC5vYmplY3RJZFtrZXldID0gcmVzdWx0W2tleV07XG4gICAgICAgICAgICBkZWxldGUgcmVzdWx0W2tleV07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChjb3VudEZpZWxkKSB7XG4gICAgICAgICAgcmVzdWx0W2NvdW50RmllbGRdID0gcGFyc2VJbnQocmVzdWx0W2NvdW50RmllbGRdLCAxMCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBwZXJmb3JtSW5pdGlhbGl6YXRpb24oeyBWb2xhdGlsZUNsYXNzZXNTY2hlbWFzIH06IGFueSkge1xuICAgIC8vIFRPRE86IFRoaXMgbWV0aG9kIG5lZWRzIHRvIGJlIHJld3JpdHRlbiB0byBtYWtlIHByb3BlciB1c2Ugb2YgY29ubmVjdGlvbnMgKEB2aXRhbHktdClcbiAgICBkZWJ1ZygncGVyZm9ybUluaXRpYWxpemF0aW9uJyk7XG4gICAgYXdhaXQgdGhpcy5fZW5zdXJlU2NoZW1hQ29sbGVjdGlvbkV4aXN0cygpO1xuICAgIGNvbnN0IHByb21pc2VzID0gVm9sYXRpbGVDbGFzc2VzU2NoZW1hcy5tYXAoc2NoZW1hID0+IHtcbiAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVRhYmxlKHNjaGVtYS5jbGFzc05hbWUsIHNjaGVtYSlcbiAgICAgICAgLmNhdGNoKGVyciA9PiB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgZXJyLmNvZGUgPT09IFBvc3RncmVzRHVwbGljYXRlUmVsYXRpb25FcnJvciB8fFxuICAgICAgICAgICAgZXJyLmNvZGUgPT09IFBhcnNlLkVycm9yLklOVkFMSURfQ0xBU1NfTkFNRVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgIH0pXG4gICAgICAgIC50aGVuKCgpID0+IHRoaXMuc2NoZW1hVXBncmFkZShzY2hlbWEuY2xhc3NOYW1lLCBzY2hlbWEpKTtcbiAgICB9KTtcbiAgICBwcm9taXNlcy5wdXNoKHRoaXMuX2xpc3RlblRvU2NoZW1hKCkpO1xuICAgIHJldHVybiBQcm9taXNlLmFsbChwcm9taXNlcylcbiAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NsaWVudC50eCgncGVyZm9ybS1pbml0aWFsaXphdGlvbicsIGFzeW5jIHQgPT4ge1xuICAgICAgICAgIGF3YWl0IHQubm9uZShzcWwubWlzYy5qc29uT2JqZWN0U2V0S2V5cyk7XG4gICAgICAgICAgYXdhaXQgdC5ub25lKHNxbC5hcnJheS5hZGQpO1xuICAgICAgICAgIGF3YWl0IHQubm9uZShzcWwuYXJyYXkuYWRkVW5pcXVlKTtcbiAgICAgICAgICBhd2FpdCB0Lm5vbmUoc3FsLmFycmF5LnJlbW92ZSk7XG4gICAgICAgICAgYXdhaXQgdC5ub25lKHNxbC5hcnJheS5jb250YWluc0FsbCk7XG4gICAgICAgICAgYXdhaXQgdC5ub25lKHNxbC5hcnJheS5jb250YWluc0FsbFJlZ2V4KTtcbiAgICAgICAgICBhd2FpdCB0Lm5vbmUoc3FsLmFycmF5LmNvbnRhaW5zKTtcbiAgICAgICAgICByZXR1cm4gdC5jdHg7XG4gICAgICAgIH0pO1xuICAgICAgfSlcbiAgICAgIC50aGVuKGN0eCA9PiB7XG4gICAgICAgIGRlYnVnKGBpbml0aWFsaXphdGlvbkRvbmUgaW4gJHtjdHguZHVyYXRpb259YCk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgLyogZXNsaW50LWRpc2FibGUgbm8tY29uc29sZSAqL1xuICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgY3JlYXRlSW5kZXhlcyhjbGFzc05hbWU6IHN0cmluZywgaW5kZXhlczogYW55LCBjb25uOiA/YW55KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIChjb25uIHx8IHRoaXMuX2NsaWVudCkudHgodCA9PlxuICAgICAgdC5iYXRjaChcbiAgICAgICAgaW5kZXhlcy5tYXAoaSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHQubm9uZSgnQ1JFQVRFIElOREVYIElGIE5PVCBFWElTVFMgJDE6bmFtZSBPTiAkMjpuYW1lICgkMzpuYW1lKScsIFtcbiAgICAgICAgICAgIGkubmFtZSxcbiAgICAgICAgICAgIGNsYXNzTmFtZSxcbiAgICAgICAgICAgIGkua2V5LFxuICAgICAgICAgIF0pO1xuICAgICAgICB9KVxuICAgICAgKVxuICAgICk7XG4gIH1cblxuICBhc3luYyBjcmVhdGVJbmRleGVzSWZOZWVkZWQoXG4gICAgY2xhc3NOYW1lOiBzdHJpbmcsXG4gICAgZmllbGROYW1lOiBzdHJpbmcsXG4gICAgdHlwZTogYW55LFxuICAgIGNvbm46ID9hbnlcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgKGNvbm4gfHwgdGhpcy5fY2xpZW50KS5ub25lKCdDUkVBVEUgSU5ERVggSUYgTk9UIEVYSVNUUyAkMTpuYW1lIE9OICQyOm5hbWUgKCQzOm5hbWUpJywgW1xuICAgICAgZmllbGROYW1lLFxuICAgICAgY2xhc3NOYW1lLFxuICAgICAgdHlwZSxcbiAgICBdKTtcbiAgfVxuXG4gIGFzeW5jIGRyb3BJbmRleGVzKGNsYXNzTmFtZTogc3RyaW5nLCBpbmRleGVzOiBhbnksIGNvbm46IGFueSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHF1ZXJpZXMgPSBpbmRleGVzLm1hcChpID0+ICh7XG4gICAgICBxdWVyeTogJ0RST1AgSU5ERVggJDE6bmFtZScsXG4gICAgICB2YWx1ZXM6IGksXG4gICAgfSkpO1xuICAgIGF3YWl0IChjb25uIHx8IHRoaXMuX2NsaWVudCkudHgodCA9PiB0Lm5vbmUodGhpcy5fcGdwLmhlbHBlcnMuY29uY2F0KHF1ZXJpZXMpKSk7XG4gIH1cblxuICBhc3luYyBnZXRJbmRleGVzKGNsYXNzTmFtZTogc3RyaW5nKSB7XG4gICAgY29uc3QgcXMgPSAnU0VMRUNUICogRlJPTSBwZ19pbmRleGVzIFdIRVJFIHRhYmxlbmFtZSA9ICR7Y2xhc3NOYW1lfSc7XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudC5hbnkocXMsIHsgY2xhc3NOYW1lIH0pO1xuICB9XG5cbiAgYXN5bmMgdXBkYXRlU2NoZW1hV2l0aEluZGV4ZXMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICB9XG5cbiAgLy8gVXNlZCBmb3IgdGVzdGluZyBwdXJwb3Nlc1xuICBhc3luYyB1cGRhdGVFc3RpbWF0ZWRDb3VudChjbGFzc05hbWU6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLl9jbGllbnQubm9uZSgnQU5BTFlaRSAkMTpuYW1lJywgW2NsYXNzTmFtZV0pO1xuICB9XG5cbiAgYXN5bmMgY3JlYXRlVHJhbnNhY3Rpb25hbFNlc3Npb24oKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICBjb25zdCB0cmFuc2FjdGlvbmFsU2Vzc2lvbiA9IHt9O1xuICAgICAgdHJhbnNhY3Rpb25hbFNlc3Npb24ucmVzdWx0ID0gdGhpcy5fY2xpZW50LnR4KHQgPT4ge1xuICAgICAgICB0cmFuc2FjdGlvbmFsU2Vzc2lvbi50ID0gdDtcbiAgICAgICAgdHJhbnNhY3Rpb25hbFNlc3Npb24ucHJvbWlzZSA9IG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgICAgIHRyYW5zYWN0aW9uYWxTZXNzaW9uLnJlc29sdmUgPSByZXNvbHZlO1xuICAgICAgICB9KTtcbiAgICAgICAgdHJhbnNhY3Rpb25hbFNlc3Npb24uYmF0Y2ggPSBbXTtcbiAgICAgICAgcmVzb2x2ZSh0cmFuc2FjdGlvbmFsU2Vzc2lvbik7XG4gICAgICAgIHJldHVybiB0cmFuc2FjdGlvbmFsU2Vzc2lvbi5wcm9taXNlO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBjb21taXRUcmFuc2FjdGlvbmFsU2Vzc2lvbih0cmFuc2FjdGlvbmFsU2Vzc2lvbjogYW55KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJhbnNhY3Rpb25hbFNlc3Npb24ucmVzb2x2ZSh0cmFuc2FjdGlvbmFsU2Vzc2lvbi50LmJhdGNoKHRyYW5zYWN0aW9uYWxTZXNzaW9uLmJhdGNoKSk7XG4gICAgcmV0dXJuIHRyYW5zYWN0aW9uYWxTZXNzaW9uLnJlc3VsdDtcbiAgfVxuXG4gIGFib3J0VHJhbnNhY3Rpb25hbFNlc3Npb24odHJhbnNhY3Rpb25hbFNlc3Npb246IGFueSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IHRyYW5zYWN0aW9uYWxTZXNzaW9uLnJlc3VsdC5jYXRjaCgpO1xuICAgIHRyYW5zYWN0aW9uYWxTZXNzaW9uLmJhdGNoLnB1c2goUHJvbWlzZS5yZWplY3QoKSk7XG4gICAgdHJhbnNhY3Rpb25hbFNlc3Npb24ucmVzb2x2ZSh0cmFuc2FjdGlvbmFsU2Vzc2lvbi50LmJhdGNoKHRyYW5zYWN0aW9uYWxTZXNzaW9uLmJhdGNoKSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGFzeW5jIGVuc3VyZUluZGV4KFxuICAgIGNsYXNzTmFtZTogc3RyaW5nLFxuICAgIHNjaGVtYTogU2NoZW1hVHlwZSxcbiAgICBmaWVsZE5hbWVzOiBzdHJpbmdbXSxcbiAgICBpbmRleE5hbWU6ID9zdHJpbmcsXG4gICAgY2FzZUluc2Vuc2l0aXZlOiBib29sZWFuID0gZmFsc2UsXG4gICAgb3B0aW9ucz86IE9iamVjdCA9IHt9XG4gICk6IFByb21pc2U8YW55PiB7XG4gICAgY29uc3QgY29ubiA9IG9wdGlvbnMuY29ubiAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5jb25uIDogdGhpcy5fY2xpZW50O1xuICAgIGNvbnN0IGRlZmF1bHRJbmRleE5hbWUgPSBgcGFyc2VfZGVmYXVsdF8ke2ZpZWxkTmFtZXMuc29ydCgpLmpvaW4oJ18nKX1gO1xuICAgIGNvbnN0IGluZGV4TmFtZU9wdGlvbnM6IE9iamVjdCA9XG4gICAgICBpbmRleE5hbWUgIT0gbnVsbCA/IHsgbmFtZTogaW5kZXhOYW1lIH0gOiB7IG5hbWU6IGRlZmF1bHRJbmRleE5hbWUgfTtcbiAgICBjb25zdCBjb25zdHJhaW50UGF0dGVybnMgPSBjYXNlSW5zZW5zaXRpdmVcbiAgICAgID8gZmllbGROYW1lcy5tYXAoKGZpZWxkTmFtZSwgaW5kZXgpID0+IGBsb3dlcigkJHtpbmRleCArIDN9Om5hbWUpIHZhcmNoYXJfcGF0dGVybl9vcHNgKVxuICAgICAgOiBmaWVsZE5hbWVzLm1hcCgoZmllbGROYW1lLCBpbmRleCkgPT4gYCQke2luZGV4ICsgM306bmFtZWApO1xuICAgIGNvbnN0IHFzID0gYENSRUFURSBJTkRFWCBJRiBOT1QgRVhJU1RTICQxOm5hbWUgT04gJDI6bmFtZSAoJHtjb25zdHJhaW50UGF0dGVybnMuam9pbigpfSlgO1xuICAgIGNvbnN0IHNldElkZW1wb3RlbmN5RnVuY3Rpb24gPVxuICAgICAgb3B0aW9ucy5zZXRJZGVtcG90ZW5jeUZ1bmN0aW9uICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLnNldElkZW1wb3RlbmN5RnVuY3Rpb24gOiBmYWxzZTtcbiAgICBpZiAoc2V0SWRlbXBvdGVuY3lGdW5jdGlvbikge1xuICAgICAgYXdhaXQgdGhpcy5lbnN1cmVJZGVtcG90ZW5jeUZ1bmN0aW9uRXhpc3RzKG9wdGlvbnMpO1xuICAgIH1cbiAgICBhd2FpdCBjb25uLm5vbmUocXMsIFtpbmRleE5hbWVPcHRpb25zLm5hbWUsIGNsYXNzTmFtZSwgLi4uZmllbGROYW1lc10pLmNhdGNoKGVycm9yID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgZXJyb3IuY29kZSA9PT0gUG9zdGdyZXNEdXBsaWNhdGVSZWxhdGlvbkVycm9yICYmXG4gICAgICAgIGVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoaW5kZXhOYW1lT3B0aW9ucy5uYW1lKVxuICAgICAgKSB7XG4gICAgICAgIC8vIEluZGV4IGFscmVhZHkgZXhpc3RzLiBJZ25vcmUgZXJyb3IuXG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICBlcnJvci5jb2RlID09PSBQb3N0Z3Jlc1VuaXF1ZUluZGV4VmlvbGF0aW9uRXJyb3IgJiZcbiAgICAgICAgZXJyb3IubWVzc2FnZS5pbmNsdWRlcyhpbmRleE5hbWVPcHRpb25zLm5hbWUpXG4gICAgICApIHtcbiAgICAgICAgLy8gQ2FzdCB0aGUgZXJyb3IgaW50byB0aGUgcHJvcGVyIHBhcnNlIGVycm9yXG4gICAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihcbiAgICAgICAgICBQYXJzZS5FcnJvci5EVVBMSUNBVEVfVkFMVUUsXG4gICAgICAgICAgJ0EgZHVwbGljYXRlIHZhbHVlIGZvciBhIGZpZWxkIHdpdGggdW5pcXVlIHZhbHVlcyB3YXMgcHJvdmlkZWQnXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZUlkZW1wb3RlbmN5RnVuY3Rpb24ob3B0aW9ucz86IE9iamVjdCA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCBjb25uID0gb3B0aW9ucy5jb25uICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmNvbm4gOiB0aGlzLl9jbGllbnQ7XG4gICAgY29uc3QgcXMgPSAnRFJPUCBGVU5DVElPTiBJRiBFWElTVFMgaWRlbXBvdGVuY3lfZGVsZXRlX2V4cGlyZWRfcmVjb3JkcygpJztcbiAgICByZXR1cm4gY29ubi5ub25lKHFzKS5jYXRjaChlcnJvciA9PiB7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGVuc3VyZUlkZW1wb3RlbmN5RnVuY3Rpb25FeGlzdHMob3B0aW9ucz86IE9iamVjdCA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCBjb25uID0gb3B0aW9ucy5jb25uICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmNvbm4gOiB0aGlzLl9jbGllbnQ7XG4gICAgY29uc3QgdHRsT3B0aW9ucyA9IG9wdGlvbnMudHRsICE9PSB1bmRlZmluZWQgPyBgJHtvcHRpb25zLnR0bH0gc2Vjb25kc2AgOiAnNjAgc2Vjb25kcyc7XG4gICAgY29uc3QgcXMgPVxuICAgICAgJ0NSRUFURSBPUiBSRVBMQUNFIEZVTkNUSU9OIGlkZW1wb3RlbmN5X2RlbGV0ZV9leHBpcmVkX3JlY29yZHMoKSBSRVRVUk5TIHZvaWQgTEFOR1VBR0UgcGxwZ3NxbCBBUyAkJCBCRUdJTiBERUxFVEUgRlJPTSBcIl9JZGVtcG90ZW5jeVwiIFdIRVJFIGV4cGlyZSA8IE5PVygpIC0gSU5URVJWQUwgJDE7IEVORDsgJCQ7JztcbiAgICByZXR1cm4gY29ubi5ub25lKHFzLCBbdHRsT3B0aW9uc10pLmNhdGNoKGVycm9yID0+IHtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnRQb2x5Z29uVG9TUUwocG9seWdvbikge1xuICBpZiAocG9seWdvbi5sZW5ndGggPCAzKSB7XG4gICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLklOVkFMSURfSlNPTiwgYFBvbHlnb24gbXVzdCBoYXZlIGF0IGxlYXN0IDMgdmFsdWVzYCk7XG4gIH1cbiAgaWYgKFxuICAgIHBvbHlnb25bMF1bMF0gIT09IHBvbHlnb25bcG9seWdvbi5sZW5ndGggLSAxXVswXSB8fFxuICAgIHBvbHlnb25bMF1bMV0gIT09IHBvbHlnb25bcG9seWdvbi5sZW5ndGggLSAxXVsxXVxuICApIHtcbiAgICBwb2x5Z29uLnB1c2gocG9seWdvblswXSk7XG4gIH1cbiAgY29uc3QgdW5pcXVlID0gcG9seWdvbi5maWx0ZXIoKGl0ZW0sIGluZGV4LCBhcikgPT4ge1xuICAgIGxldCBmb3VuZEluZGV4ID0gLTE7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhci5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgY29uc3QgcHQgPSBhcltpXTtcbiAgICAgIGlmIChwdFswXSA9PT0gaXRlbVswXSAmJiBwdFsxXSA9PT0gaXRlbVsxXSkge1xuICAgICAgICBmb3VuZEluZGV4ID0gaTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmb3VuZEluZGV4ID09PSBpbmRleDtcbiAgfSk7XG4gIGlmICh1bmlxdWUubGVuZ3RoIDwgMykge1xuICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihcbiAgICAgIFBhcnNlLkVycm9yLklOVEVSTkFMX1NFUlZFUl9FUlJPUixcbiAgICAgICdHZW9KU09OOiBMb29wIG11c3QgaGF2ZSBhdCBsZWFzdCAzIGRpZmZlcmVudCB2ZXJ0aWNlcydcbiAgICApO1xuICB9XG4gIGNvbnN0IHBvaW50cyA9IHBvbHlnb25cbiAgICAubWFwKHBvaW50ID0+IHtcbiAgICAgIFBhcnNlLkdlb1BvaW50Ll92YWxpZGF0ZShwYXJzZUZsb2F0KHBvaW50WzFdKSwgcGFyc2VGbG9hdChwb2ludFswXSkpO1xuICAgICAgcmV0dXJuIGAoJHtwb2ludFsxXX0sICR7cG9pbnRbMF19KWA7XG4gICAgfSlcbiAgICAuam9pbignLCAnKTtcbiAgcmV0dXJuIGAoJHtwb2ludHN9KWA7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZVdoaXRlU3BhY2UocmVnZXgpIHtcbiAgaWYgKCFyZWdleC5lbmRzV2l0aCgnXFxuJykpIHtcbiAgICByZWdleCArPSAnXFxuJztcbiAgfVxuXG4gIC8vIHJlbW92ZSBub24gZXNjYXBlZCBjb21tZW50c1xuICByZXR1cm4gKFxuICAgIHJlZ2V4XG4gICAgICAucmVwbGFjZSgvKFteXFxcXF0pIy4qXFxuL2dpbSwgJyQxJylcbiAgICAgIC8vIHJlbW92ZSBsaW5lcyBzdGFydGluZyB3aXRoIGEgY29tbWVudFxuICAgICAgLnJlcGxhY2UoL14jLipcXG4vZ2ltLCAnJylcbiAgICAgIC8vIHJlbW92ZSBub24gZXNjYXBlZCB3aGl0ZXNwYWNlXG4gICAgICAucmVwbGFjZSgvKFteXFxcXF0pXFxzKy9naW0sICckMScpXG4gICAgICAvLyByZW1vdmUgd2hpdGVzcGFjZSBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZVxuICAgICAgLnJlcGxhY2UoL15cXHMrLywgJycpXG4gICAgICAudHJpbSgpXG4gICk7XG59XG5cbmZ1bmN0aW9uIHByb2Nlc3NSZWdleFBhdHRlcm4ocykge1xuICBpZiAocyAmJiBzLnN0YXJ0c1dpdGgoJ14nKSkge1xuICAgIC8vIHJlZ2V4IGZvciBzdGFydHNXaXRoXG4gICAgcmV0dXJuICdeJyArIGxpdGVyYWxpemVSZWdleFBhcnQocy5zbGljZSgxKSk7XG4gIH0gZWxzZSBpZiAocyAmJiBzLmVuZHNXaXRoKCckJykpIHtcbiAgICAvLyByZWdleCBmb3IgZW5kc1dpdGhcbiAgICByZXR1cm4gbGl0ZXJhbGl6ZVJlZ2V4UGFydChzLnNsaWNlKDAsIHMubGVuZ3RoIC0gMSkpICsgJyQnO1xuICB9XG5cbiAgLy8gcmVnZXggZm9yIGNvbnRhaW5zXG4gIHJldHVybiBsaXRlcmFsaXplUmVnZXhQYXJ0KHMpO1xufVxuXG5mdW5jdGlvbiBpc1N0YXJ0c1dpdGhSZWdleCh2YWx1ZSkge1xuICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycgfHwgIXZhbHVlLnN0YXJ0c1dpdGgoJ14nKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IG1hdGNoZXMgPSB2YWx1ZS5tYXRjaCgvXFxeXFxcXFEuKlxcXFxFLyk7XG4gIHJldHVybiAhIW1hdGNoZXM7XG59XG5cbmZ1bmN0aW9uIGlzQWxsVmFsdWVzUmVnZXhPck5vbmUodmFsdWVzKSB7XG4gIGlmICghdmFsdWVzIHx8ICFBcnJheS5pc0FycmF5KHZhbHVlcykgfHwgdmFsdWVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgY29uc3QgZmlyc3RWYWx1ZXNJc1JlZ2V4ID0gaXNTdGFydHNXaXRoUmVnZXgodmFsdWVzWzBdLiRyZWdleCk7XG4gIGlmICh2YWx1ZXMubGVuZ3RoID09PSAxKSB7XG4gICAgcmV0dXJuIGZpcnN0VmFsdWVzSXNSZWdleDtcbiAgfVxuXG4gIGZvciAobGV0IGkgPSAxLCBsZW5ndGggPSB2YWx1ZXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICBpZiAoZmlyc3RWYWx1ZXNJc1JlZ2V4ICE9PSBpc1N0YXJ0c1dpdGhSZWdleCh2YWx1ZXNbaV0uJHJlZ2V4KSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBpc0FueVZhbHVlUmVnZXhTdGFydHNXaXRoKHZhbHVlcykge1xuICByZXR1cm4gdmFsdWVzLnNvbWUoZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgcmV0dXJuIGlzU3RhcnRzV2l0aFJlZ2V4KHZhbHVlLiRyZWdleCk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVMaXRlcmFsUmVnZXgocmVtYWluaW5nKSB7XG4gIHJldHVybiByZW1haW5pbmdcbiAgICAuc3BsaXQoJycpXG4gICAgLm1hcChjID0+IHtcbiAgICAgIGNvbnN0IHJlZ2V4ID0gUmVnRXhwKCdbMC05IF18XFxcXHB7TH0nLCAndScpOyAvLyBTdXBwb3J0IGFsbCB1bmljb2RlIGxldHRlciBjaGFyc1xuICAgICAgaWYgKGMubWF0Y2gocmVnZXgpICE9PSBudWxsKSB7XG4gICAgICAgIC8vIGRvbid0IGVzY2FwZSBhbHBoYW51bWVyaWMgY2hhcmFjdGVyc1xuICAgICAgICByZXR1cm4gYztcbiAgICAgIH1cbiAgICAgIC8vIGVzY2FwZSBldmVyeXRoaW5nIGVsc2UgKHNpbmdsZSBxdW90ZXMgd2l0aCBzaW5nbGUgcXVvdGVzLCBldmVyeXRoaW5nIGVsc2Ugd2l0aCBhIGJhY2tzbGFzaClcbiAgICAgIHJldHVybiBjID09PSBgJ2AgPyBgJydgIDogYFxcXFwke2N9YDtcbiAgICB9KVxuICAgIC5qb2luKCcnKTtcbn1cblxuZnVuY3Rpb24gbGl0ZXJhbGl6ZVJlZ2V4UGFydChzOiBzdHJpbmcpIHtcbiAgY29uc3QgbWF0Y2hlcjEgPSAvXFxcXFEoKD8hXFxcXEUpLiopXFxcXEUkLztcbiAgY29uc3QgcmVzdWx0MTogYW55ID0gcy5tYXRjaChtYXRjaGVyMSk7XG4gIGlmIChyZXN1bHQxICYmIHJlc3VsdDEubGVuZ3RoID4gMSAmJiByZXN1bHQxLmluZGV4ID4gLTEpIHtcbiAgICAvLyBwcm9jZXNzIHJlZ2V4IHRoYXQgaGFzIGEgYmVnaW5uaW5nIGFuZCBhbiBlbmQgc3BlY2lmaWVkIGZvciB0aGUgbGl0ZXJhbCB0ZXh0XG4gICAgY29uc3QgcHJlZml4ID0gcy5zdWJzdHIoMCwgcmVzdWx0MS5pbmRleCk7XG4gICAgY29uc3QgcmVtYWluaW5nID0gcmVzdWx0MVsxXTtcblxuICAgIHJldHVybiBsaXRlcmFsaXplUmVnZXhQYXJ0KHByZWZpeCkgKyBjcmVhdGVMaXRlcmFsUmVnZXgocmVtYWluaW5nKTtcbiAgfVxuXG4gIC8vIHByb2Nlc3MgcmVnZXggdGhhdCBoYXMgYSBiZWdpbm5pbmcgc3BlY2lmaWVkIGZvciB0aGUgbGl0ZXJhbCB0ZXh0XG4gIGNvbnN0IG1hdGNoZXIyID0gL1xcXFxRKCg/IVxcXFxFKS4qKSQvO1xuICBjb25zdCByZXN1bHQyOiBhbnkgPSBzLm1hdGNoKG1hdGNoZXIyKTtcbiAgaWYgKHJlc3VsdDIgJiYgcmVzdWx0Mi5sZW5ndGggPiAxICYmIHJlc3VsdDIuaW5kZXggPiAtMSkge1xuICAgIGNvbnN0IHByZWZpeCA9IHMuc3Vic3RyKDAsIHJlc3VsdDIuaW5kZXgpO1xuICAgIGNvbnN0IHJlbWFpbmluZyA9IHJlc3VsdDJbMV07XG5cbiAgICByZXR1cm4gbGl0ZXJhbGl6ZVJlZ2V4UGFydChwcmVmaXgpICsgY3JlYXRlTGl0ZXJhbFJlZ2V4KHJlbWFpbmluZyk7XG4gIH1cblxuICAvLyByZW1vdmUgYWxsIGluc3RhbmNlcyBvZiBcXFEgYW5kIFxcRSBmcm9tIHRoZSByZW1haW5pbmcgdGV4dCAmIGVzY2FwZSBzaW5nbGUgcXVvdGVzXG4gIHJldHVybiBzXG4gICAgLnJlcGxhY2UoLyhbXlxcXFxdKShcXFxcRSkvLCAnJDEnKVxuICAgIC5yZXBsYWNlKC8oW15cXFxcXSkoXFxcXFEpLywgJyQxJylcbiAgICAucmVwbGFjZSgvXlxcXFxFLywgJycpXG4gICAgLnJlcGxhY2UoL15cXFxcUS8sICcnKVxuICAgIC5yZXBsYWNlKC8oW14nXSknLywgYCQxJydgKVxuICAgIC5yZXBsYWNlKC9eJyhbXiddKS8sIGAnJyQxYCk7XG59XG5cbnZhciBHZW9Qb2ludENvZGVyID0ge1xuICBpc1ZhbGlkSlNPTih2YWx1ZSkge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsICYmIHZhbHVlLl9fdHlwZSA9PT0gJ0dlb1BvaW50JztcbiAgfSxcbn07XG5cbmV4cG9ydCBkZWZhdWx0IFBvc3RncmVzU3RvcmFnZUFkYXB0ZXI7XG4iXX0=
|
|
2268
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJVdGlscyIsInJlcXVpcmUiLCJQb3N0Z3Jlc1JlbGF0aW9uRG9lc05vdEV4aXN0RXJyb3IiLCJQb3N0Z3Jlc0R1cGxpY2F0ZVJlbGF0aW9uRXJyb3IiLCJQb3N0Z3Jlc0R1cGxpY2F0ZUNvbHVtbkVycm9yIiwiUG9zdGdyZXNNaXNzaW5nQ29sdW1uRXJyb3IiLCJQb3N0Z3Jlc1VuaXF1ZUluZGV4VmlvbGF0aW9uRXJyb3IiLCJsb2dnZXIiLCJkZWJ1ZyIsImFyZ3MiLCJhcmd1bWVudHMiLCJjb25jYXQiLCJzbGljZSIsImxlbmd0aCIsImxvZyIsImdldExvZ2dlciIsImFwcGx5IiwicGFyc2VUeXBlVG9Qb3N0Z3Jlc1R5cGUiLCJ0eXBlIiwiY29udGVudHMiLCJKU09OIiwic3RyaW5naWZ5IiwiUGFyc2VUb1Bvc2dyZXNDb21wYXJhdG9yIiwiJGd0IiwiJGx0IiwiJGd0ZSIsIiRsdGUiLCJtb25nb0FnZ3JlZ2F0ZVRvUG9zdGdyZXMiLCIkZGF5T2ZNb250aCIsIiRkYXlPZldlZWsiLCIkZGF5T2ZZZWFyIiwiJGlzb0RheU9mV2VlayIsIiRpc29XZWVrWWVhciIsIiRob3VyIiwiJG1pbnV0ZSIsIiRzZWNvbmQiLCIkbWlsbGlzZWNvbmQiLCIkbW9udGgiLCIkd2VlayIsIiR5ZWFyIiwidG9Qb3N0Z3Jlc1ZhbHVlIiwidmFsdWUiLCJfX3R5cGUiLCJpc28iLCJuYW1lIiwidG9Qb3N0Z3Jlc1ZhbHVlQ2FzdFR5cGUiLCJwb3N0Z3Jlc1ZhbHVlIiwiY2FzdFR5cGUiLCJ1bmRlZmluZWQiLCJ0cmFuc2Zvcm1WYWx1ZSIsIm9iamVjdElkIiwiZW1wdHlDTFBTIiwiT2JqZWN0IiwiZnJlZXplIiwiZmluZCIsImdldCIsImNvdW50IiwiY3JlYXRlIiwidXBkYXRlIiwiZGVsZXRlIiwiYWRkRmllbGQiLCJwcm90ZWN0ZWRGaWVsZHMiLCJkZWZhdWx0Q0xQUyIsInRvUGFyc2VTY2hlbWEiLCJzY2hlbWEiLCJjbGFzc05hbWUiLCJmaWVsZHMiLCJfaGFzaGVkX3Bhc3N3b3JkIiwiX3dwZXJtIiwiX3JwZXJtIiwiY2xwcyIsImNsYXNzTGV2ZWxQZXJtaXNzaW9ucyIsImluZGV4ZXMiLCJ0b1Bvc3RncmVzU2NoZW1hIiwiX3Bhc3N3b3JkX2hpc3RvcnkiLCJoYW5kbGVEb3RGaWVsZHMiLCJvYmplY3QiLCJrZXlzIiwiZm9yRWFjaCIsImZpZWxkTmFtZSIsImluZGV4T2YiLCJjb21wb25lbnRzIiwic3BsaXQiLCJmaXJzdCIsInNoaWZ0IiwiY3VycmVudE9iaiIsIm5leHQiLCJfX29wIiwidHJhbnNmb3JtRG90RmllbGRUb0NvbXBvbmVudHMiLCJtYXAiLCJjbXB0IiwiaW5kZXgiLCJ0cmFuc2Zvcm1Eb3RGaWVsZCIsImpvaW4iLCJ0cmFuc2Zvcm1BZ2dyZWdhdGVGaWVsZCIsInN1YnN0ciIsInZhbGlkYXRlS2V5cyIsImtleSIsImluY2x1ZGVzIiwiUGFyc2UiLCJFcnJvciIsIklOVkFMSURfTkVTVEVEX0tFWSIsImpvaW5UYWJsZXNGb3JTY2hlbWEiLCJsaXN0IiwiZmllbGQiLCJwdXNoIiwiYnVpbGRXaGVyZUNsYXVzZSIsInF1ZXJ5IiwiY2FzZUluc2Vuc2l0aXZlIiwicGF0dGVybnMiLCJ2YWx1ZXMiLCJzb3J0cyIsImlzQXJyYXlGaWVsZCIsImluaXRpYWxQYXR0ZXJuc0xlbmd0aCIsImZpZWxkVmFsdWUiLCIkZXhpc3RzIiwiYXV0aERhdGFNYXRjaCIsIm1hdGNoIiwiJGluIiwiJHJlZ2V4IiwiTUFYX0lOVF9QTFVTX09ORSIsImNsYXVzZXMiLCJjbGF1c2VWYWx1ZXMiLCJzdWJRdWVyeSIsImNsYXVzZSIsInBhdHRlcm4iLCJvck9yQW5kIiwibm90IiwiJG5lIiwiY29uc3RyYWludEZpZWxkTmFtZSIsIiRyZWxhdGl2ZVRpbWUiLCJJTlZBTElEX0pTT04iLCJwb2ludCIsImxvbmdpdHVkZSIsImxhdGl0dWRlIiwiJGVxIiwiaXNJbk9yTmluIiwiQXJyYXkiLCJpc0FycmF5IiwiJG5pbiIsImluUGF0dGVybnMiLCJhbGxvd051bGwiLCJsaXN0RWxlbSIsImxpc3RJbmRleCIsImNyZWF0ZUNvbnN0cmFpbnQiLCJiYXNlQXJyYXkiLCJub3RJbiIsIl8iLCJmbGF0TWFwIiwiZWx0IiwiJGFsbCIsImlzQW55VmFsdWVSZWdleFN0YXJ0c1dpdGgiLCJpc0FsbFZhbHVlc1JlZ2V4T3JOb25lIiwiaSIsInByb2Nlc3NSZWdleFBhdHRlcm4iLCJzdWJzdHJpbmciLCIkY29udGFpbmVkQnkiLCJhcnIiLCIkdGV4dCIsInNlYXJjaCIsIiRzZWFyY2giLCJsYW5ndWFnZSIsIiR0ZXJtIiwiJGxhbmd1YWdlIiwiJGNhc2VTZW5zaXRpdmUiLCIkZGlhY3JpdGljU2Vuc2l0aXZlIiwiJG5lYXJTcGhlcmUiLCJkaXN0YW5jZSIsIiRtYXhEaXN0YW5jZSIsImRpc3RhbmNlSW5LTSIsIiR3aXRoaW4iLCIkYm94IiwiYm94IiwibGVmdCIsImJvdHRvbSIsInJpZ2h0IiwidG9wIiwiJGdlb1dpdGhpbiIsIiRjZW50ZXJTcGhlcmUiLCJjZW50ZXJTcGhlcmUiLCJHZW9Qb2ludCIsIkdlb1BvaW50Q29kZXIiLCJpc1ZhbGlkSlNPTiIsIl92YWxpZGF0ZSIsImlzTmFOIiwiJHBvbHlnb24iLCJwb2x5Z29uIiwicG9pbnRzIiwiY29vcmRpbmF0ZXMiLCIkZ2VvSW50ZXJzZWN0cyIsIiRwb2ludCIsInJlZ2V4Iiwib3BlcmF0b3IiLCJvcHRzIiwiJG9wdGlvbnMiLCJyZW1vdmVXaGl0ZVNwYWNlIiwiY29udmVydFBvbHlnb25Ub1NRTCIsImNtcCIsInBnQ29tcGFyYXRvciIsInBhcnNlclJlc3VsdCIsInJlbGF0aXZlVGltZVRvRGF0ZSIsInN0YXR1cyIsInJlc3VsdCIsImNvbnNvbGUiLCJlcnJvciIsImluZm8iLCJPUEVSQVRJT05fRk9SQklEREVOIiwiUG9zdGdyZXNTdG9yYWdlQWRhcHRlciIsImNvbnN0cnVjdG9yIiwidXJpIiwiY29sbGVjdGlvblByZWZpeCIsImRhdGFiYXNlT3B0aW9ucyIsIl9jb2xsZWN0aW9uUHJlZml4IiwiZW5hYmxlU2NoZW1hSG9va3MiLCJjbGllbnQiLCJwZ3AiLCJjcmVhdGVDbGllbnQiLCJfY2xpZW50IiwiX29uY2hhbmdlIiwiX3BncCIsIl91dWlkIiwidXVpZHY0IiwiY2FuU29ydE9uSm9pblRhYmxlcyIsIndhdGNoIiwiY2FsbGJhY2siLCJjcmVhdGVFeHBsYWluYWJsZVF1ZXJ5IiwiYW5hbHl6ZSIsImhhbmRsZVNodXRkb3duIiwiX3N0cmVhbSIsImRvbmUiLCIkcG9vbCIsImVuZCIsIl9saXN0ZW5Ub1NjaGVtYSIsImNvbm5lY3QiLCJkaXJlY3QiLCJvbiIsImRhdGEiLCJwYXlsb2FkIiwicGFyc2UiLCJzZW5kZXJJZCIsIm5vbmUiLCJfbm90aWZ5U2NoZW1hQ2hhbmdlIiwiY2F0Y2giLCJfZW5zdXJlU2NoZW1hQ29sbGVjdGlvbkV4aXN0cyIsImNvbm4iLCJjbGFzc0V4aXN0cyIsIm9uZSIsImEiLCJleGlzdHMiLCJzZXRDbGFzc0xldmVsUGVybWlzc2lvbnMiLCJDTFBzIiwidGFzayIsInQiLCJzZXRJbmRleGVzV2l0aFNjaGVtYUZvcm1hdCIsInN1Ym1pdHRlZEluZGV4ZXMiLCJleGlzdGluZ0luZGV4ZXMiLCJzZWxmIiwiUHJvbWlzZSIsInJlc29sdmUiLCJfaWRfIiwiX2lkIiwiZGVsZXRlZEluZGV4ZXMiLCJpbnNlcnRlZEluZGV4ZXMiLCJJTlZBTElEX1FVRVJZIiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwidHgiLCJjcmVhdGVJbmRleGVzIiwiZHJvcEluZGV4ZXMiLCJjcmVhdGVDbGFzcyIsInBhcnNlU2NoZW1hIiwiY3JlYXRlVGFibGUiLCJlcnIiLCJjb2RlIiwiZGV0YWlsIiwiRFVQTElDQVRFX1ZBTFVFIiwidmFsdWVzQXJyYXkiLCJwYXR0ZXJuc0FycmF5IiwiYXNzaWduIiwiX2VtYWlsX3ZlcmlmeV90b2tlbl9leHBpcmVzX2F0IiwiX2VtYWlsX3ZlcmlmeV90b2tlbiIsIl9hY2NvdW50X2xvY2tvdXRfZXhwaXJlc19hdCIsIl9mYWlsZWRfbG9naW5fY291bnQiLCJfcGVyaXNoYWJsZV90b2tlbiIsIl9wZXJpc2hhYmxlX3Rva2VuX2V4cGlyZXNfYXQiLCJfcGFzc3dvcmRfY2hhbmdlZF9hdCIsInJlbGF0aW9ucyIsInBhcnNlVHlwZSIsInFzIiwiYmF0Y2giLCJqb2luVGFibGUiLCJzY2hlbWFVcGdyYWRlIiwiY29sdW1ucyIsImNvbHVtbl9uYW1lIiwibmV3Q29sdW1ucyIsImZpbHRlciIsIml0ZW0iLCJhZGRGaWVsZElmTm90RXhpc3RzIiwicG9zdGdyZXNUeXBlIiwiYW55IiwicGF0aCIsInVwZGF0ZUZpZWxkT3B0aW9ucyIsImRlbGV0ZUNsYXNzIiwib3BlcmF0aW9ucyIsInJlc3BvbnNlIiwiaGVscGVycyIsInRoZW4iLCJkZWxldGVBbGxDbGFzc2VzIiwibm93IiwiRGF0ZSIsImdldFRpbWUiLCJyZXN1bHRzIiwiam9pbnMiLCJyZWR1Y2UiLCJjbGFzc2VzIiwicXVlcmllcyIsImRlbGV0ZUZpZWxkcyIsImZpZWxkTmFtZXMiLCJpZHgiLCJnZXRBbGxDbGFzc2VzIiwicm93IiwiZ2V0Q2xhc3MiLCJjcmVhdGVPYmplY3QiLCJ0cmFuc2FjdGlvbmFsU2Vzc2lvbiIsImNvbHVtbnNBcnJheSIsImdlb1BvaW50cyIsImF1dGhEYXRhQWxyZWFkeUV4aXN0cyIsImF1dGhEYXRhIiwicHJvdmlkZXIiLCJwb3AiLCJpbml0aWFsVmFsdWVzIiwidmFsIiwidGVybWluYXRpb24iLCJnZW9Qb2ludHNJbmplY3RzIiwibCIsImNvbHVtbnNQYXR0ZXJuIiwiY29sIiwidmFsdWVzUGF0dGVybiIsInByb21pc2UiLCJvcHMiLCJ1bmRlcmx5aW5nRXJyb3IiLCJjb25zdHJhaW50IiwibWF0Y2hlcyIsInVzZXJJbmZvIiwiZHVwbGljYXRlZF9maWVsZCIsImRlbGV0ZU9iamVjdHNCeVF1ZXJ5Iiwid2hlcmUiLCJPQkpFQ1RfTk9UX0ZPVU5EIiwiZmluZE9uZUFuZFVwZGF0ZSIsInVwZGF0ZU9iamVjdHNCeVF1ZXJ5IiwidXBkYXRlUGF0dGVybnMiLCJvcmlnaW5hbFVwZGF0ZSIsImRvdE5vdGF0aW9uT3B0aW9ucyIsImdlbmVyYXRlIiwianNvbmIiLCJsYXN0S2V5IiwiZmllbGROYW1lSW5kZXgiLCJzdHIiLCJhbW91bnQiLCJvYmplY3RzIiwia2V5c1RvSW5jcmVtZW50IiwiayIsImluY3JlbWVudFBhdHRlcm5zIiwiYyIsImtleXNUb0RlbGV0ZSIsImRlbGV0ZVBhdHRlcm5zIiwicCIsInVwZGF0ZU9iamVjdCIsImV4cGVjdGVkVHlwZSIsInJlamVjdCIsIndoZXJlQ2xhdXNlIiwidXBzZXJ0T25lT2JqZWN0IiwiY3JlYXRlVmFsdWUiLCJza2lwIiwibGltaXQiLCJzb3J0IiwiZXhwbGFpbiIsImhhc0xpbWl0IiwiaGFzU2tpcCIsIndoZXJlUGF0dGVybiIsImxpbWl0UGF0dGVybiIsInNraXBQYXR0ZXJuIiwic29ydFBhdHRlcm4iLCJzb3J0Q29weSIsInNvcnRpbmciLCJ0cmFuc2Zvcm1LZXkiLCJtZW1vIiwib3JpZ2luYWxRdWVyeSIsInBvc3RncmVzT2JqZWN0VG9QYXJzZU9iamVjdCIsInRhcmdldENsYXNzIiwieSIsIngiLCJjb29yZHMiLCJwYXJzZUZsb2F0IiwiY3JlYXRlZEF0IiwidG9JU09TdHJpbmciLCJ1cGRhdGVkQXQiLCJleHBpcmVzQXQiLCJlbnN1cmVVbmlxdWVuZXNzIiwiY29uc3RyYWludE5hbWUiLCJjb25zdHJhaW50UGF0dGVybnMiLCJtZXNzYWdlIiwicmVhZFByZWZlcmVuY2UiLCJlc3RpbWF0ZSIsImFwcHJveGltYXRlX3Jvd19jb3VudCIsImRpc3RpbmN0IiwiY29sdW1uIiwiaXNOZXN0ZWQiLCJpc1BvaW50ZXJGaWVsZCIsInRyYW5zZm9ybWVyIiwiY2hpbGQiLCJhZ2dyZWdhdGUiLCJwaXBlbGluZSIsImhpbnQiLCJjb3VudEZpZWxkIiwiZ3JvdXBWYWx1ZXMiLCJncm91cFBhdHRlcm4iLCJzdGFnZSIsIiRncm91cCIsImdyb3VwQnlGaWVsZHMiLCJhbGlhcyIsInNvdXJjZSIsIm9wZXJhdGlvbiIsIiRzdW0iLCIkbWF4IiwiJG1pbiIsIiRhdmciLCIkcHJvamVjdCIsIiRtYXRjaCIsIiRvciIsImNvbGxhcHNlIiwiZWxlbWVudCIsIm1hdGNoUGF0dGVybnMiLCIkbGltaXQiLCIkc2tpcCIsIiRzb3J0Iiwib3JkZXIiLCJlIiwidHJpbSIsIkJvb2xlYW4iLCJwYXJzZUludCIsInBlcmZvcm1Jbml0aWFsaXphdGlvbiIsIlZvbGF0aWxlQ2xhc3Nlc1NjaGVtYXMiLCJwcm9taXNlcyIsIklOVkFMSURfQ0xBU1NfTkFNRSIsImFsbCIsInNxbCIsIm1pc2MiLCJqc29uT2JqZWN0U2V0S2V5cyIsImFycmF5IiwiYWRkIiwiYWRkVW5pcXVlIiwicmVtb3ZlIiwiY29udGFpbnNBbGwiLCJjb250YWluc0FsbFJlZ2V4IiwiY29udGFpbnMiLCJjdHgiLCJkdXJhdGlvbiIsImNyZWF0ZUluZGV4ZXNJZk5lZWRlZCIsImdldEluZGV4ZXMiLCJ1cGRhdGVTY2hlbWFXaXRoSW5kZXhlcyIsInVwZGF0ZUVzdGltYXRlZENvdW50IiwiY3JlYXRlVHJhbnNhY3Rpb25hbFNlc3Npb24iLCJjb21taXRUcmFuc2FjdGlvbmFsU2Vzc2lvbiIsImFib3J0VHJhbnNhY3Rpb25hbFNlc3Npb24iLCJlbnN1cmVJbmRleCIsImluZGV4TmFtZSIsIm9wdGlvbnMiLCJkZWZhdWx0SW5kZXhOYW1lIiwiaW5kZXhOYW1lT3B0aW9ucyIsInNldElkZW1wb3RlbmN5RnVuY3Rpb24iLCJlbnN1cmVJZGVtcG90ZW5jeUZ1bmN0aW9uRXhpc3RzIiwiZGVsZXRlSWRlbXBvdGVuY3lGdW5jdGlvbiIsInR0bE9wdGlvbnMiLCJ0dGwiLCJ1bmlxdWUiLCJhciIsImZvdW5kSW5kZXgiLCJwdCIsIklOVEVSTkFMX1NFUlZFUl9FUlJPUiIsImVuZHNXaXRoIiwicmVwbGFjZSIsInMiLCJzdGFydHNXaXRoIiwibGl0ZXJhbGl6ZVJlZ2V4UGFydCIsImlzU3RhcnRzV2l0aFJlZ2V4IiwiZmlyc3RWYWx1ZXNJc1JlZ2V4Iiwic29tZSIsImNyZWF0ZUxpdGVyYWxSZWdleCIsInJlbWFpbmluZyIsIlJlZ0V4cCIsIm1hdGNoZXIxIiwicmVzdWx0MSIsInByZWZpeCIsIm1hdGNoZXIyIiwicmVzdWx0MiJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9BZGFwdGVycy9TdG9yYWdlL1Bvc3RncmVzL1Bvc3RncmVzU3RvcmFnZUFkYXB0ZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gQGZsb3dcbmltcG9ydCB7IGNyZWF0ZUNsaWVudCB9IGZyb20gJy4vUG9zdGdyZXNDbGllbnQnO1xuLy8gQGZsb3ctZGlzYWJsZS1uZXh0XG5pbXBvcnQgUGFyc2UgZnJvbSAncGFyc2Uvbm9kZSc7XG4vLyBAZmxvdy1kaXNhYmxlLW5leHRcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG4vLyBAZmxvdy1kaXNhYmxlLW5leHRcbmltcG9ydCB7IHY0IGFzIHV1aWR2NCB9IGZyb20gJ3V1aWQnO1xuaW1wb3J0IHNxbCBmcm9tICcuL3NxbCc7XG5pbXBvcnQgeyBTdG9yYWdlQWRhcHRlciB9IGZyb20gJy4uL1N0b3JhZ2VBZGFwdGVyJztcbmltcG9ydCB0eXBlIHsgU2NoZW1hVHlwZSwgUXVlcnlUeXBlLCBRdWVyeU9wdGlvbnMgfSBmcm9tICcuLi9TdG9yYWdlQWRhcHRlcic7XG5jb25zdCBVdGlscyA9IHJlcXVpcmUoJy4uLy4uLy4uL1V0aWxzJyk7XG5cbmNvbnN0IFBvc3RncmVzUmVsYXRpb25Eb2VzTm90RXhpc3RFcnJvciA9ICc0MlAwMSc7XG5jb25zdCBQb3N0Z3Jlc0R1cGxpY2F0ZVJlbGF0aW9uRXJyb3IgPSAnNDJQMDcnO1xuY29uc3QgUG9zdGdyZXNEdXBsaWNhdGVDb2x1bW5FcnJvciA9ICc0MjcwMSc7XG5jb25zdCBQb3N0Z3Jlc01pc3NpbmdDb2x1bW5FcnJvciA9ICc0MjcwMyc7XG5jb25zdCBQb3N0Z3Jlc1VuaXF1ZUluZGV4VmlvbGF0aW9uRXJyb3IgPSAnMjM1MDUnO1xuY29uc3QgbG9nZ2VyID0gcmVxdWlyZSgnLi4vLi4vLi4vbG9nZ2VyJyk7XG5cbmNvbnN0IGRlYnVnID0gZnVuY3Rpb24gKC4uLmFyZ3M6IGFueSkge1xuICBhcmdzID0gWydQRzogJyArIGFyZ3VtZW50c1swXV0uY29uY2F0KGFyZ3Muc2xpY2UoMSwgYXJncy5sZW5ndGgpKTtcbiAgY29uc3QgbG9nID0gbG9nZ2VyLmdldExvZ2dlcigpO1xuICBsb2cuZGVidWcuYXBwbHkobG9nLCBhcmdzKTtcbn07XG5cbmNvbnN0IHBhcnNlVHlwZVRvUG9zdGdyZXNUeXBlID0gdHlwZSA9PiB7XG4gIHN3aXRjaCAodHlwZS50eXBlKSB7XG4gICAgY2FzZSAnU3RyaW5nJzpcbiAgICAgIHJldHVybiAndGV4dCc7XG4gICAgY2FzZSAnRGF0ZSc6XG4gICAgICByZXR1cm4gJ3RpbWVzdGFtcCB3aXRoIHRpbWUgem9uZSc7XG4gICAgY2FzZSAnT2JqZWN0JzpcbiAgICAgIHJldHVybiAnanNvbmInO1xuICAgIGNhc2UgJ0ZpbGUnOlxuICAgICAgcmV0dXJuICd0ZXh0JztcbiAgICBjYXNlICdCb29sZWFuJzpcbiAgICAgIHJldHVybiAnYm9vbGVhbic7XG4gICAgY2FzZSAnUG9pbnRlcic6XG4gICAgICByZXR1cm4gJ3RleHQnO1xuICAgIGNhc2UgJ051bWJlcic6XG4gICAgICByZXR1cm4gJ2RvdWJsZSBwcmVjaXNpb24nO1xuICAgIGNhc2UgJ0dlb1BvaW50JzpcbiAgICAgIHJldHVybiAncG9pbnQnO1xuICAgIGNhc2UgJ0J5dGVzJzpcbiAgICAgIHJldHVybiAnanNvbmInO1xuICAgIGNhc2UgJ1BvbHlnb24nOlxuICAgICAgcmV0dXJuICdwb2x5Z29uJztcbiAgICBjYXNlICdBcnJheSc6XG4gICAgICBpZiAodHlwZS5jb250ZW50cyAmJiB0eXBlLmNvbnRlbnRzLnR5cGUgPT09ICdTdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiAndGV4dFtdJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiAnanNvbmInO1xuICAgICAgfVxuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBgbm8gdHlwZSBmb3IgJHtKU09OLnN0cmluZ2lmeSh0eXBlKX0geWV0YDtcbiAgfVxufTtcblxuY29uc3QgUGFyc2VUb1Bvc2dyZXNDb21wYXJhdG9yID0ge1xuICAkZ3Q6ICc+JyxcbiAgJGx0OiAnPCcsXG4gICRndGU6ICc+PScsXG4gICRsdGU6ICc8PScsXG59O1xuXG5jb25zdCBtb25nb0FnZ3JlZ2F0ZVRvUG9zdGdyZXMgPSB7XG4gICRkYXlPZk1vbnRoOiAnREFZJyxcbiAgJGRheU9mV2VlazogJ0RPVycsXG4gICRkYXlPZlllYXI6ICdET1knLFxuICAkaXNvRGF5T2ZXZWVrOiAnSVNPRE9XJyxcbiAgJGlzb1dlZWtZZWFyOiAnSVNPWUVBUicsXG4gICRob3VyOiAnSE9VUicsXG4gICRtaW51dGU6ICdNSU5VVEUnLFxuICAkc2Vjb25kOiAnU0VDT05EJyxcbiAgJG1pbGxpc2Vjb25kOiAnTUlMTElTRUNPTkRTJyxcbiAgJG1vbnRoOiAnTU9OVEgnLFxuICAkd2VlazogJ1dFRUsnLFxuICAkeWVhcjogJ1lFQVInLFxufTtcblxuY29uc3QgdG9Qb3N0Z3Jlc1ZhbHVlID0gdmFsdWUgPT4ge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgIGlmICh2YWx1ZS5fX3R5cGUgPT09ICdEYXRlJykge1xuICAgICAgcmV0dXJuIHZhbHVlLmlzbztcbiAgICB9XG4gICAgaWYgKHZhbHVlLl9fdHlwZSA9PT0gJ0ZpbGUnKSB7XG4gICAgICByZXR1cm4gdmFsdWUubmFtZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufTtcblxuY29uc3QgdG9Qb3N0Z3Jlc1ZhbHVlQ2FzdFR5cGUgPSB2YWx1ZSA9PiB7XG4gIGNvbnN0IHBvc3RncmVzVmFsdWUgPSB0b1Bvc3RncmVzVmFsdWUodmFsdWUpO1xuICBsZXQgY2FzdFR5cGU7XG4gIHN3aXRjaCAodHlwZW9mIHBvc3RncmVzVmFsdWUpIHtcbiAgICBjYXNlICdudW1iZXInOlxuICAgICAgY2FzdFR5cGUgPSAnZG91YmxlIHByZWNpc2lvbic7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdib29sZWFuJzpcbiAgICAgIGNhc3RUeXBlID0gJ2Jvb2xlYW4nO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIGNhc3RUeXBlID0gdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiBjYXN0VHlwZTtcbn07XG5cbmNvbnN0IHRyYW5zZm9ybVZhbHVlID0gdmFsdWUgPT4ge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZS5fX3R5cGUgPT09ICdQb2ludGVyJykge1xuICAgIHJldHVybiB2YWx1ZS5vYmplY3RJZDtcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59O1xuXG4vLyBEdXBsaWNhdGUgZnJvbSB0aGVuIG1vbmdvIGFkYXB0ZXIuLi5cbmNvbnN0IGVtcHR5Q0xQUyA9IE9iamVjdC5mcmVlemUoe1xuICBmaW5kOiB7fSxcbiAgZ2V0OiB7fSxcbiAgY291bnQ6IHt9LFxuICBjcmVhdGU6IHt9LFxuICB1cGRhdGU6IHt9LFxuICBkZWxldGU6IHt9LFxuICBhZGRGaWVsZDoge30sXG4gIHByb3RlY3RlZEZpZWxkczoge30sXG59KTtcblxuY29uc3QgZGVmYXVsdENMUFMgPSBPYmplY3QuZnJlZXplKHtcbiAgZmluZDogeyAnKic6IHRydWUgfSxcbiAgZ2V0OiB7ICcqJzogdHJ1ZSB9LFxuICBjb3VudDogeyAnKic6IHRydWUgfSxcbiAgY3JlYXRlOiB7ICcqJzogdHJ1ZSB9LFxuICB1cGRhdGU6IHsgJyonOiB0cnVlIH0sXG4gIGRlbGV0ZTogeyAnKic6IHRydWUgfSxcbiAgYWRkRmllbGQ6IHsgJyonOiB0cnVlIH0sXG4gIHByb3RlY3RlZEZpZWxkczogeyAnKic6IFtdIH0sXG59KTtcblxuY29uc3QgdG9QYXJzZVNjaGVtYSA9IHNjaGVtYSA9PiB7XG4gIGlmIChzY2hlbWEuY2xhc3NOYW1lID09PSAnX1VzZXInKSB7XG4gICAgZGVsZXRlIHNjaGVtYS5maWVsZHMuX2hhc2hlZF9wYXNzd29yZDtcbiAgfVxuICBpZiAoc2NoZW1hLmZpZWxkcykge1xuICAgIGRlbGV0ZSBzY2hlbWEuZmllbGRzLl93cGVybTtcbiAgICBkZWxldGUgc2NoZW1hLmZpZWxkcy5fcnBlcm07XG4gIH1cbiAgbGV0IGNscHMgPSBkZWZhdWx0Q0xQUztcbiAgaWYgKHNjaGVtYS5jbGFzc0xldmVsUGVybWlzc2lvbnMpIHtcbiAgICBjbHBzID0geyAuLi5lbXB0eUNMUFMsIC4uLnNjaGVtYS5jbGFzc0xldmVsUGVybWlzc2lvbnMgfTtcbiAgfVxuICBsZXQgaW5kZXhlcyA9IHt9O1xuICBpZiAoc2NoZW1hLmluZGV4ZXMpIHtcbiAgICBpbmRleGVzID0geyAuLi5zY2hlbWEuaW5kZXhlcyB9O1xuICB9XG4gIHJldHVybiB7XG4gICAgY2xhc3NOYW1lOiBzY2hlbWEuY2xhc3NOYW1lLFxuICAgIGZpZWxkczogc2NoZW1hLmZpZWxkcyxcbiAgICBjbGFzc0xldmVsUGVybWlzc2lvbnM6IGNscHMsXG4gICAgaW5kZXhlcyxcbiAgfTtcbn07XG5cbmNvbnN0IHRvUG9zdGdyZXNTY2hlbWEgPSBzY2hlbWEgPT4ge1xuICBpZiAoIXNjaGVtYSkge1xuICAgIHJldHVybiBzY2hlbWE7XG4gIH1cbiAgc2NoZW1hLmZpZWxkcyA9IHNjaGVtYS5maWVsZHMgfHwge307XG4gIHNjaGVtYS5maWVsZHMuX3dwZXJtID0geyB0eXBlOiAnQXJyYXknLCBjb250ZW50czogeyB0eXBlOiAnU3RyaW5nJyB9IH07XG4gIHNjaGVtYS5maWVsZHMuX3JwZXJtID0geyB0eXBlOiAnQXJyYXknLCBjb250ZW50czogeyB0eXBlOiAnU3RyaW5nJyB9IH07XG4gIGlmIChzY2hlbWEuY2xhc3NOYW1lID09PSAnX1VzZXInKSB7XG4gICAgc2NoZW1hLmZpZWxkcy5faGFzaGVkX3Bhc3N3b3JkID0geyB0eXBlOiAnU3RyaW5nJyB9O1xuICAgIHNjaGVtYS5maWVsZHMuX3Bhc3N3b3JkX2hpc3RvcnkgPSB7IHR5cGU6ICdBcnJheScgfTtcbiAgfVxuICByZXR1cm4gc2NoZW1hO1xufTtcblxuY29uc3QgaGFuZGxlRG90RmllbGRzID0gb2JqZWN0ID0+IHtcbiAgT2JqZWN0LmtleXMob2JqZWN0KS5mb3JFYWNoKGZpZWxkTmFtZSA9PiB7XG4gICAgaWYgKGZpZWxkTmFtZS5pbmRleE9mKCcuJykgPiAtMSkge1xuICAgICAgY29uc3QgY29tcG9uZW50cyA9IGZpZWxkTmFtZS5zcGxpdCgnLicpO1xuICAgICAgY29uc3QgZmlyc3QgPSBjb21wb25lbnRzLnNoaWZ0KCk7XG4gICAgICBvYmplY3RbZmlyc3RdID0gb2JqZWN0W2ZpcnN0XSB8fCB7fTtcbiAgICAgIGxldCBjdXJyZW50T2JqID0gb2JqZWN0W2ZpcnN0XTtcbiAgICAgIGxldCBuZXh0O1xuICAgICAgbGV0IHZhbHVlID0gb2JqZWN0W2ZpZWxkTmFtZV07XG4gICAgICBpZiAodmFsdWUgJiYgdmFsdWUuX19vcCA9PT0gJ0RlbGV0ZScpIHtcbiAgICAgICAgdmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby1jb25kLWFzc2lnbiAqL1xuICAgICAgd2hpbGUgKChuZXh0ID0gY29tcG9uZW50cy5zaGlmdCgpKSkge1xuICAgICAgICAvKiBlc2xpbnQtZW5hYmxlIG5vLWNvbmQtYXNzaWduICovXG4gICAgICAgIGN1cnJlbnRPYmpbbmV4dF0gPSBjdXJyZW50T2JqW25leHRdIHx8IHt9O1xuICAgICAgICBpZiAoY29tcG9uZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBjdXJyZW50T2JqW25leHRdID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgY3VycmVudE9iaiA9IGN1cnJlbnRPYmpbbmV4dF07XG4gICAgICB9XG4gICAgICBkZWxldGUgb2JqZWN0W2ZpZWxkTmFtZV07XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIG9iamVjdDtcbn07XG5cbmNvbnN0IHRyYW5zZm9ybURvdEZpZWxkVG9Db21wb25lbnRzID0gZmllbGROYW1lID0+IHtcbiAgcmV0dXJuIGZpZWxkTmFtZS5zcGxpdCgnLicpLm1hcCgoY21wdCwgaW5kZXgpID0+IHtcbiAgICBpZiAoaW5kZXggPT09IDApIHtcbiAgICAgIHJldHVybiBgXCIke2NtcHR9XCJgO1xuICAgIH1cbiAgICByZXR1cm4gYCcke2NtcHR9J2A7XG4gIH0pO1xufTtcblxuY29uc3QgdHJhbnNmb3JtRG90RmllbGQgPSBmaWVsZE5hbWUgPT4ge1xuICBpZiAoZmllbGROYW1lLmluZGV4T2YoJy4nKSA9PT0gLTEpIHtcbiAgICByZXR1cm4gYFwiJHtmaWVsZE5hbWV9XCJgO1xuICB9XG4gIGNvbnN0IGNvbXBvbmVudHMgPSB0cmFuc2Zvcm1Eb3RGaWVsZFRvQ29tcG9uZW50cyhmaWVsZE5hbWUpO1xuICBsZXQgbmFtZSA9IGNvbXBvbmVudHMuc2xpY2UoMCwgY29tcG9uZW50cy5sZW5ndGggLSAxKS5qb2luKCctPicpO1xuICBuYW1lICs9ICctPj4nICsgY29tcG9uZW50c1tjb21wb25lbnRzLmxlbmd0aCAtIDFdO1xuICByZXR1cm4gbmFtZTtcbn07XG5cbmNvbnN0IHRyYW5zZm9ybUFnZ3JlZ2F0ZUZpZWxkID0gZmllbGROYW1lID0+IHtcbiAgaWYgKHR5cGVvZiBmaWVsZE5hbWUgIT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGZpZWxkTmFtZTtcbiAgfVxuICBpZiAoZmllbGROYW1lID09PSAnJF9jcmVhdGVkX2F0Jykge1xuICAgIHJldHVybiAnY3JlYXRlZEF0JztcbiAgfVxuICBpZiAoZmllbGROYW1lID09PSAnJF91cGRhdGVkX2F0Jykge1xuICAgIHJldHVybiAndXBkYXRlZEF0JztcbiAgfVxuICByZXR1cm4gZmllbGROYW1lLnN1YnN0cigxKTtcbn07XG5cbmNvbnN0IHZhbGlkYXRlS2V5cyA9IG9iamVjdCA9PiB7XG4gIGlmICh0eXBlb2Ygb2JqZWN0ID09ICdvYmplY3QnKSB7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gb2JqZWN0KSB7XG4gICAgICBpZiAodHlwZW9mIG9iamVjdFtrZXldID09ICdvYmplY3QnKSB7XG4gICAgICAgIHZhbGlkYXRlS2V5cyhvYmplY3Rba2V5XSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChrZXkuaW5jbHVkZXMoJyQnKSB8fCBrZXkuaW5jbHVkZXMoJy4nKSkge1xuICAgICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoXG4gICAgICAgICAgUGFyc2UuRXJyb3IuSU5WQUxJRF9ORVNURURfS0VZLFxuICAgICAgICAgIFwiTmVzdGVkIGtleXMgc2hvdWxkIG5vdCBjb250YWluIHRoZSAnJCcgb3IgJy4nIGNoYXJhY3RlcnNcIlxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxufTtcblxuLy8gUmV0dXJucyB0aGUgbGlzdCBvZiBqb2luIHRhYmxlcyBvbiBhIHNjaGVtYVxuY29uc3Qgam9pblRhYmxlc0ZvclNjaGVtYSA9IHNjaGVtYSA9PiB7XG4gIGNvbnN0IGxpc3QgPSBbXTtcbiAgaWYgKHNjaGVtYSkge1xuICAgIE9iamVjdC5rZXlzKHNjaGVtYS5maWVsZHMpLmZvckVhY2goZmllbGQgPT4ge1xuICAgICAgaWYgKHNjaGVtYS5maWVsZHNbZmllbGRdLnR5cGUgPT09ICdSZWxhdGlvbicpIHtcbiAgICAgICAgbGlzdC5wdXNoKGBfSm9pbjoke2ZpZWxkfToke3NjaGVtYS5jbGFzc05hbWV9YCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIGxpc3Q7XG59O1xuXG5pbnRlcmZhY2UgV2hlcmVDbGF1c2Uge1xuICBwYXR0ZXJuOiBzdHJpbmc7XG4gIHZhbHVlczogQXJyYXk8YW55PjtcbiAgc29ydHM6IEFycmF5PGFueT47XG59XG5cbmNvbnN0IGJ1aWxkV2hlcmVDbGF1c2UgPSAoeyBzY2hlbWEsIHF1ZXJ5LCBpbmRleCwgY2FzZUluc2Vuc2l0aXZlIH0pOiBXaGVyZUNsYXVzZSA9PiB7XG4gIGNvbnN0IHBhdHRlcm5zID0gW107XG4gIGxldCB2YWx1ZXMgPSBbXTtcbiAgY29uc3Qgc29ydHMgPSBbXTtcblxuICBzY2hlbWEgPSB0b1Bvc3RncmVzU2NoZW1hKHNjaGVtYSk7XG4gIGZvciAoY29uc3QgZmllbGROYW1lIGluIHF1ZXJ5KSB7XG4gICAgY29uc3QgaXNBcnJheUZpZWxkID1cbiAgICAgIHNjaGVtYS5maWVsZHMgJiYgc2NoZW1hLmZpZWxkc1tmaWVsZE5hbWVdICYmIHNjaGVtYS5maWVsZHNbZmllbGROYW1lXS50eXBlID09PSAnQXJyYXknO1xuICAgIGNvbnN0IGluaXRpYWxQYXR0ZXJuc0xlbmd0aCA9IHBhdHRlcm5zLmxlbmd0aDtcbiAgICBjb25zdCBmaWVsZFZhbHVlID0gcXVlcnlbZmllbGROYW1lXTtcblxuICAgIC8vIG5vdGhpbmcgaW4gdGhlIHNjaGVtYSwgaXQncyBnb25uYSBibG93IHVwXG4gICAgaWYgKCFzY2hlbWEuZmllbGRzW2ZpZWxkTmFtZV0pIHtcbiAgICAgIC8vIGFzIGl0IHdvbid0IGV4aXN0XG4gICAgICBpZiAoZmllbGRWYWx1ZSAmJiBmaWVsZFZhbHVlLiRleGlzdHMgPT09IGZhbHNlKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBhdXRoRGF0YU1hdGNoID0gZmllbGROYW1lLm1hdGNoKC9eX2F1dGhfZGF0YV8oW2EtekEtWjAtOV9dKykkLyk7XG4gICAgaWYgKGF1dGhEYXRhTWF0Y2gpIHtcbiAgICAgIC8vIFRPRE86IEhhbmRsZSBxdWVyeWluZyBieSBfYXV0aF9kYXRhX3Byb3ZpZGVyLCBhdXRoRGF0YSBpcyBzdG9yZWQgaW4gYXV0aERhdGEgZmllbGRcbiAgICAgIGNvbnRpbnVlO1xuICAgIH0gZWxzZSBpZiAoY2FzZUluc2Vuc2l0aXZlICYmIChmaWVsZE5hbWUgPT09ICd1c2VybmFtZScgfHwgZmllbGROYW1lID09PSAnZW1haWwnKSkge1xuICAgICAgcGF0dGVybnMucHVzaChgTE9XRVIoJCR7aW5kZXh9Om5hbWUpID0gTE9XRVIoJCR7aW5kZXggKyAxfSlgKTtcbiAgICAgIHZhbHVlcy5wdXNoKGZpZWxkTmFtZSwgZmllbGRWYWx1ZSk7XG4gICAgICBpbmRleCArPSAyO1xuICAgIH0gZWxzZSBpZiAoZmllbGROYW1lLmluZGV4T2YoJy4nKSA+PSAwKSB7XG4gICAgICBsZXQgbmFtZSA9IHRyYW5zZm9ybURvdEZpZWxkKGZpZWxkTmFtZSk7XG4gICAgICBpZiAoZmllbGRWYWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICBwYXR0ZXJucy5wdXNoKGAkJHtpbmRleH06cmF3IElTIE5VTExgKTtcbiAgICAgICAgdmFsdWVzLnB1c2gobmFtZSk7XG4gICAgICAgIGluZGV4ICs9IDE7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGZpZWxkVmFsdWUuJGluKSB7XG4gICAgICAgICAgbmFtZSA9IHRyYW5zZm9ybURvdEZpZWxkVG9Db21wb25lbnRzKGZpZWxkTmFtZSkuam9pbignLT4nKTtcbiAgICAgICAgICBwYXR0ZXJucy5wdXNoKGAoJCR7aW5kZXh9OnJhdyk6Ompzb25iIEA+ICQke2luZGV4ICsgMX06Ompzb25iYCk7XG4gICAgICAgICAgdmFsdWVzLnB1c2gobmFtZSwgSlNPTi5zdHJpbmdpZnkoZmllbGRWYWx1ZS4kaW4pKTtcbiAgICAgICAgICBpbmRleCArPSAyO1xuICAgICAgICB9IGVsc2UgaWYgKGZpZWxkVmFsdWUuJHJlZ2V4KSB7XG4gICAgICAgICAgLy8gSGFuZGxlIGxhdGVyXG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGZpZWxkVmFsdWUgIT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgcGF0dGVybnMucHVzaChgJCR7aW5kZXh9OnJhdyA9ICQke2luZGV4ICsgMX06OnRleHRgKTtcbiAgICAgICAgICB2YWx1ZXMucHVzaChuYW1lLCBmaWVsZFZhbHVlKTtcbiAgICAgICAgICBpbmRleCArPSAyO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChmaWVsZFZhbHVlID09PSBudWxsIHx8IGZpZWxkVmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcGF0dGVybnMucHVzaChgJCR7aW5kZXh9Om5hbWUgSVMgTlVMTGApO1xuICAgICAgdmFsdWVzLnB1c2goZmllbGROYW1lKTtcbiAgICAgIGluZGV4ICs9IDE7XG4gICAgICBjb250aW51ZTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBmaWVsZFZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgcGF0dGVybnMucHVzaChgJCR7aW5kZXh9Om5hbWUgPSAkJHtpbmRleCArIDF9YCk7XG4gICAgICB2YWx1ZXMucHVzaChmaWVsZE5hbWUsIGZpZWxkVmFsdWUpO1xuICAgICAgaW5kZXggKz0gMjtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBmaWVsZFZhbHVlID09PSAnYm9vbGVhbicpIHtcbiAgICAgIHBhdHRlcm5zLnB1c2goYCQke2luZGV4fTpuYW1lID0gJCR7aW5kZXggKyAxfWApO1xuICAgICAgLy8gQ2FuJ3QgY2FzdCBib29sZWFuIHRvIGRvdWJsZSBwcmVjaXNpb25cbiAgICAgIGlmIChzY2hlbWEuZmllbGRzW2ZpZWxkTmFtZV0gJiYgc2NoZW1hLmZpZWxkc1tmaWVsZE5hbWVdLnR5cGUgPT09ICdOdW1iZXInKSB7XG4gICAgICAgIC8vIFNob3VsZCBhbHdheXMgcmV0dXJuIHplcm8gcmVzdWx0c1xuICAgICAgICBjb25zdCBNQVhfSU5UX1BMVVNfT05FID0gOTIyMzM3MjAzNjg1NDc3NTgwODtcbiAgICAgICAgdmFsdWVzLnB1c2goZmllbGROYW1lLCBNQVhfSU5UX1BMVVNfT05FKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbHVlcy5wdXNoKGZpZWxkTmFtZSwgZmllbGRWYWx1ZSk7XG4gICAgICB9XG4gICAgICBpbmRleCArPSAyO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGZpZWxkVmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICBwYXR0ZXJucy5wdXNoKGAkJHtpbmRleH06bmFtZSA9ICQke2luZGV4ICsgMX1gKTtcbiAgICAgIHZhbHVlcy5wdXNoKGZpZWxkTmFtZSwgZmllbGRWYWx1ZSk7XG4gICAgICBpbmRleCArPSAyO1xuICAgIH0gZWxzZSBpZiAoWyckb3InLCAnJG5vcicsICckYW5kJ10uaW5jbHVkZXMoZmllbGROYW1lKSkge1xuICAgICAgY29uc3QgY2xhdXNlcyA9IFtdO1xuICAgICAgY29uc3QgY2xhdXNlVmFsdWVzID0gW107XG4gICAgICBmaWVsZFZhbHVlLmZvckVhY2goc3ViUXVlcnkgPT4ge1xuICAgICAgICBjb25zdCBjbGF1c2UgPSBidWlsZFdoZXJlQ2xhdXNlKHtcbiAgICAgICAgICBzY2hlbWEsXG4gICAgICAgICAgcXVlcnk6IHN1YlF1ZXJ5LFxuICAgICAgICAgIGluZGV4LFxuICAgICAgICAgIGNhc2VJbnNlbnNpdGl2ZSxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChjbGF1c2UucGF0dGVybi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY2xhdXNlcy5wdXNoKGNsYXVzZS5wYXR0ZXJuKTtcbiAgICAgICAgICBjbGF1c2VWYWx1ZXMucHVzaCguLi5jbGF1c2UudmFsdWVzKTtcbiAgICAgICAgICBpbmRleCArPSBjbGF1c2UudmFsdWVzLmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IG9yT3JBbmQgPSBmaWVsZE5hbWUgPT09ICckYW5kJyA/ICcgQU5EICcgOiAnIE9SICc7XG4gICAgICBjb25zdCBub3QgPSBmaWVsZE5hbWUgPT09ICckbm9yJyA/ICcgTk9UICcgOiAnJztcblxuICAgICAgcGF0dGVybnMucHVzaChgJHtub3R9KCR7Y2xhdXNlcy5qb2luKG9yT3JBbmQpfSlgKTtcbiAgICAgIHZhbHVlcy5wdXNoKC4uLmNsYXVzZVZhbHVlcyk7XG4gICAgfVxuXG4gICAgaWYgKGZpZWxkVmFsdWUuJG5lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChpc0FycmF5RmllbGQpIHtcbiAgICAgICAgZmllbGRWYWx1ZS4kbmUgPSBKU09OLnN0cmluZ2lmeShbZmllbGRWYWx1ZS4kbmVdKTtcbiAgICAgICAgcGF0dGVybnMucHVzaChgTk9UIGFycmF5X2NvbnRhaW5zKCQke2luZGV4fTpuYW1lLCAkJHtpbmRleCArIDF9KWApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGZpZWxkVmFsdWUuJG5lID09PSBudWxsKSB7XG4gICAgICAgICAgcGF0dGVybnMucHVzaChgJCR7aW5kZXh9Om5hbWUgSVMgTk9UIE5VTExgKTtcbiAgICAgICAgICB2YWx1ZXMucHVzaChmaWVsZE5hbWUpO1xuICAgICAgICAgIGluZGV4ICs9IDE7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gaWYgbm90IG51bGwsIHdlIG5lZWQgdG8gbWFudWFsbHkgZXhjbHVkZSBudWxsXG4gICAgICAgICAgaWYgKGZpZWxkVmFsdWUuJG5lLl9fdHlwZSA9PT0gJ0dlb1BvaW50Jykge1xuICAgICAgICAgICAgcGF0dGVybnMucHVzaChcbiAgICAgICAgICAgICAgYCgkJHtpbmRleH06bmFtZSA8PiBQT0lOVCgkJHtpbmRleCArIDF9LCAkJHtpbmRleCArIDJ9KSBPUiAkJHtpbmRleH06bmFtZSBJUyBOVUxMKWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChmaWVsZE5hbWUuaW5kZXhPZignLicpID49IDApIHtcbiAgICAgICAgICAgICAgY29uc3QgY2FzdFR5cGUgPSB0b1Bvc3RncmVzVmFsdWVDYXN0VHlwZShmaWVsZFZhbHVlLiRuZSk7XG4gICAgICAgICAgICAgIGNvbnN0IGNvbnN0cmFpbnRGaWVsZE5hbWUgPSBjYXN0VHlwZVxuICAgICAgICAgICAgICAgID8gYENBU1QgKCgke3RyYW5zZm9ybURvdEZpZWxkKGZpZWxkTmFtZSl9KSBBUyAke2Nhc3RUeXBlfSlgXG4gICAgICAgICAgICAgICAgOiB0cmFuc2Zvcm1Eb3RGaWVsZChmaWVsZE5hbWUpO1xuICAgICAgICAgICAgICBwYXR0ZXJucy5wdXNoKFxuICAgICAgICAgICAgICAgIGAoJHtjb25zdHJhaW50RmllbGROYW1lfSA8PiAkJHtpbmRleCArIDF9IE9SICR7Y29uc3RyYWludEZpZWxkTmFtZX0gSVMgTlVMTClgXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBmaWVsZFZhbHVlLiRuZSA9PT0gJ29iamVjdCcgJiYgZmllbGRWYWx1ZS4kbmUuJHJlbGF0aXZlVGltZSkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoXG4gICAgICAgICAgICAgICAgUGFyc2UuRXJyb3IuSU5WQUxJRF9KU09OLFxuICAgICAgICAgICAgICAgICckcmVsYXRpdmVUaW1lIGNhbiBvbmx5IGJlIHVzZWQgd2l0aCB0aGUgJGx0LCAkbHRlLCAkZ3QsIGFuZCAkZ3RlIG9wZXJhdG9ycydcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHBhdHRlcm5zLnB1c2goYCgkJHtpbmRleH06bmFtZSA8PiAkJHtpbmRleCArIDF9IE9SICQke2luZGV4fTpuYW1lIElTIE5VTEwpYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZmllbGRWYWx1ZS4kbmUuX190eXBlID09PSAnR2VvUG9pbnQnKSB7XG4gICAgICAgIGNvbnN0IHBvaW50ID0gZmllbGRWYWx1ZS4kbmU7XG4gICAgICAgIHZhbHVlcy5wdXNoKGZpZWxkTmFtZSwgcG9pbnQubG9uZ2l0dWRlLCBwb2ludC5sYXRpdHVkZSk7XG4gICAgICAgIGluZGV4ICs9IDM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBUT0RPOiBzdXBwb3J0IGFycmF5c1xuICAgICAgICB2YWx1ZXMucHVzaChmaWVsZE5hbWUsIGZpZWxkVmFsdWUuJG5lKTtcbiAgICAgICAgaW5kZXggKz0gMjtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGZpZWxkVmFsdWUuJGVxICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChmaWVsZFZhbHVlLiRlcSA9PT0gbnVsbCkge1xuICAgICAgICBwYXR0ZXJucy5wdXNoKGAkJHtpbmRleH06bmFtZSBJUyBOVUxMYCk7XG4gICAgICAgIHZhbHVlcy5wdXNoKGZpZWxkTmFtZSk7XG4gICAgICAgIGluZGV4ICs9IDE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoZmllbGROYW1lLmluZGV4T2YoJy4nKSA+PSAwKSB7XG4gICAgICAgICAgY29uc3QgY2FzdFR5cGUgPSB0b1Bvc3RncmVzVmFsdWVDYXN0VHlwZShmaWVsZFZhbHVlLiRlcSk7XG4gICAgICAgICAgY29uc3QgY29uc3RyYWludEZpZWxkTmFtZSA9IGNhc3RUeXBlXG4gICAgICAgICAgICA/IGBDQVNUICgoJHt0cmFuc2Zvcm1Eb3RGaWVsZChmaWVsZE5hbWUpfSkgQVMgJHtjYXN0VHlwZX0pYFxuICAgICAgICAgICAgOiB0cmFuc2Zvcm1Eb3RGaWVsZChmaWVsZE5hbWUpO1xuICAgICAgICAgIHZhbHVlcy5wdXNoKGZpZWxkVmFsdWUuJGVxKTtcbiAgICAgICAgICBwYXR0ZXJucy5wdXNoKGAke2NvbnN0cmFpbnRGaWVsZE5hbWV9ID0gJCR7aW5kZXgrK31gKTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZmllbGRWYWx1ZS4kZXEgPT09ICdvYmplY3QnICYmIGZpZWxkVmFsdWUuJGVxLiRyZWxhdGl2ZVRpbWUpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoXG4gICAgICAgICAgICBQYXJzZS5FcnJvci5JTlZBTElEX0pTT04sXG4gICAgICAgICAgICAnJHJlbGF0aXZlVGltZSBjYW4gb25seSBiZSB1c2VkIHdpdGggdGhlICRsdCwgJGx0ZSwgJGd0LCBhbmQgJGd0ZSBvcGVyYXRvcnMnXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YWx1ZXMucHVzaChmaWVsZE5hbWUsIGZpZWxkVmFsdWUuJGVxKTtcbiAgICAgICAgICBwYXR0ZXJucy5wdXNoKGAkJHtpbmRleH06bmFtZSA9ICQke2luZGV4ICsgMX1gKTtcbiAgICAgICAgICBpbmRleCArPSAyO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGlzSW5Pck5pbiA9IEFycmF5LmlzQXJyYXkoZmllbGRWYWx1ZS4kaW4pIHx8IEFycmF5LmlzQXJyYXkoZmllbGRWYWx1ZS4kbmluKTtcbiAgICBpZiAoXG4gICAgICBBcnJheS5pc0FycmF5KGZpZWxkVmFsdWUuJGluKSAmJlxuICAgICAgaXNBcnJheUZpZWxkICYmXG4gICAgICBzY2hlbWEuZmllbGRzW2ZpZWxkTmFtZV0uY29udGVudHMgJiZcbiAgICAgIHNjaGVtYS5maWVsZHNbZmllbGROYW1lXS5jb250ZW50cy50eXBlID09PSAnU3RyaW5nJ1xuICAgICkge1xuICAgICAgY29uc3QgaW5QYXR0ZXJucyA9IFtdO1xuICAgICAgbGV0IGFsbG93TnVsbCA9IGZhbHNlO1xuICAgICAgdmFsdWVzLnB1c2goZmllbGROYW1lKTtcbiAgICAgIGZpZWxkVmFsdWUuJGluLmZvckVhY2goKGxpc3RFbGVtLCBsaXN0SW5kZXgpID0+IHtcbiAgICAgICAgaWYgKGxpc3RFbGVtID09PSBudWxsKSB7XG4gICAgICAgICAgYWxsb3dOdWxsID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YWx1ZXMucHVzaChsaXN0RWxlbSk7XG4gICAgICAgICAgaW5QYXR0ZXJucy5wdXNoKGAkJHtpbmRleCArIDEgKyBsaXN0SW5kZXggLSAoYWxsb3dOdWxsID8gMSA6IDApfWApO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGlmIChhbGxvd051bGwpIHtcbiAgICAgICAgcGF0dGVybnMucHVzaChgKCQke2luZGV4fTpuYW1lIElTIE5VTEwgT1IgJCR7aW5kZXh9Om5hbWUgJiYgQVJSQVlbJHtpblBhdHRlcm5zLmpvaW4oKX1dKWApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGF0dGVybnMucHVzaChgJCR7aW5kZXh9Om5hbWUgJiYgQVJSQVlbJHtpblBhdHRlcm5zLmpvaW4oKX1dYCk7XG4gICAgICB9XG4gICAgICBpbmRleCA9IGluZGV4ICsgMSArIGluUGF0dGVybnMubGVuZ3RoO1xuICAgIH0gZWxzZSBpZiAoaXNJbk9yTmluKSB7XG4gICAgICB2YXIgY3JlYXRlQ29uc3RyYWludCA9IChiYXNlQXJyYXksIG5vdEluKSA9PiB7XG4gICAgICAgIGNvbnN0IG5vdCA9IG5vdEluID8gJyBOT1QgJyA6ICcnO1xuICAgICAgICBpZiAoYmFzZUFycmF5Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBpZiAoaXNBcnJheUZpZWxkKSB7XG4gICAgICAgICAgICBwYXR0ZXJucy5wdXNoKGAke25vdH0gYXJyYXlfY29udGFpbnMoJCR7aW5kZXh9Om5hbWUsICQke2luZGV4ICsgMX0pYCk7XG4gICAgICAgICAgICB2YWx1ZXMucHVzaChmaWVsZE5hbWUsIEpTT04uc3RyaW5naWZ5KGJhc2VBcnJheSkpO1xuICAgICAgICAgICAgaW5kZXggKz0gMjtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gSGFuZGxlIE5lc3RlZCBEb3QgTm90YXRpb24gQWJvdmVcbiAgICAgICAgICAgIGlmIChmaWVsZE5hbWUuaW5kZXhPZignLicpID49IDApIHtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgaW5QYXR0ZXJucyA9IFtdO1xuICAgICAgICAgICAgdmFsdWVzLnB1c2goZmllbGROYW1lKTtcbiAgICAgICAgICAgIGJhc2VBcnJheS5mb3JFYWNoKChsaXN0RWxlbSwgbGlzdEluZGV4KSA9PiB7XG4gICAgICAgICAgICAgIGlmIChsaXN0RWxlbSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdmFsdWVzLnB1c2gobGlzdEVsZW0pO1xuICAgICAgICAgICAgICAgIGluUGF0dGVybnMucHVzaChgJCR7aW5kZXggKyAxICsgbGlzdEluZGV4fWApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHBhdHRlcm5zLnB1c2goYCQke2luZGV4fTpuYW1lICR7bm90fSBJTiAoJHtpblBhdHRlcm5zLmpvaW4oKX0pYCk7XG4gICAgICAgICAgICBpbmRleCA9IGluZGV4ICsgMSArIGluUGF0dGVybnMubGVuZ3RoO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICghbm90SW4pIHtcbiAgICAgICAgICB2YWx1ZXMucHVzaChmaWVsZE5hbWUpO1xuICAgICAgICAgIHBhdHRlcm5zLnB1c2goYCQke2luZGV4fTpuYW1lIElTIE5VTExgKTtcbiAgICAgICAgICBpbmRleCA9IGluZGV4ICsgMTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBIYW5kbGUgZW1wdHkgYXJyYXlcbiAgICAgICAgICBpZiAobm90SW4pIHtcbiAgICAgICAgICAgIHBhdHRlcm5zLnB1c2goJzEgPSAxJyk7IC8vIFJldHVybiBhbGwgdmFsdWVzXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBhdHRlcm5zLnB1c2goJzEgPSAyJyk7IC8vIFJldHVybiBubyB2YWx1ZXNcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBpZiAoZmllbGRWYWx1ZS4kaW4pIHtcbiAgICAgICAgY3JlYXRlQ29uc3RyYWludChcbiAgICAgICAgICBfLmZsYXRNYXAoZmllbGRWYWx1ZS4kaW4sIGVsdCA9PiBlbHQpLFxuICAgICAgICAgIGZhbHNlXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAoZmllbGRWYWx1ZS4kbmluKSB7XG4gICAgICAgIGNyZWF0ZUNvbnN0cmFpbnQoXG4gICAgICAgICAgXy5mbGF0TWFwKGZpZWxkVmFsdWUuJG5pbiwgZWx0ID0+IGVsdCksXG4gICAgICAgICAgdHJ1ZVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZW9mIGZpZWxkVmFsdWUuJGluICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLklOVkFMSURfSlNPTiwgJ2JhZCAkaW4gdmFsdWUnKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBmaWVsZFZhbHVlLiRuaW4gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuSU5WQUxJRF9KU09OLCAnYmFkICRuaW4gdmFsdWUnKTtcbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShmaWVsZFZhbHVlLiRhbGwpICYmIGlzQXJyYXlGaWVsZCkge1xuICAgICAgaWYgKGlzQW55VmFsdWVSZWdleFN0YXJ0c1dpdGgoZmllbGRWYWx1ZS4kYWxsKSkge1xuICAgICAgICBpZiAoIWlzQWxsVmFsdWVzUmVnZXhPck5vbmUoZmllbGRWYWx1ZS4kYWxsKSkge1xuICAgICAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihcbiAgICAgICAgICAgIFBhcnNlLkVycm9yLklOVkFMSURfSlNPTixcbiAgICAgICAgICAgICdBbGwgJGFsbCB2YWx1ZXMgbXVzdCBiZSBvZiByZWdleCB0eXBlIG9yIG5vbmU6ICcgKyBmaWVsZFZhbHVlLiRhbGxcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmaWVsZFZhbHVlLiRhbGwubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IHByb2Nlc3NSZWdleFBhdHRlcm4oZmllbGRWYWx1ZS4kYWxsW2ldLiRyZWdleCk7XG4gICAgICAgICAgZmllbGRWYWx1ZS4kYWxsW2ldID0gdmFsdWUuc3Vic3RyaW5nKDEpICsgJyUnO1xuICAgICAgICB9XG4gICAgICAgIHBhdHRlcm5zLnB1c2goYGFycmF5X2NvbnRhaW5zX2FsbF9yZWdleCgkJHtpbmRleH06bmFtZSwgJCR7aW5kZXggKyAxfTo6anNvbmIpYCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwYXR0ZXJucy5wdXNoKGBhcnJheV9jb250YWluc19hbGwoJCR7aW5kZXh9Om5hbWUsICQke2luZGV4ICsgMX06Ompzb25iKWApO1xuICAgICAgfVxuICAgICAgdmFsdWVzLnB1c2goZmllbGROYW1lLCBKU09OLnN0cmluZ2lmeShmaWVsZFZhbHVlLiRhbGwpKTtcbiAgICAgIGluZGV4ICs9IDI7XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGZpZWxkVmFsdWUuJGFsbCkpIHtcbiAgICAgIGlmIChmaWVsZFZhbHVlLiRhbGwubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIHBhdHRlcm5zLnB1c2goYCQke2luZGV4fTpuYW1lID0gJCR7aW5kZXggKyAxfWApO1xuICAgICAgICB2YWx1ZXMucHVzaChmaWVsZE5hbWUsIGZpZWxkVmFsdWUuJGFsbFswXS5vYmplY3RJZCk7XG4gICAgICAgIGluZGV4ICs9IDI7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBmaWVsZFZhbHVlLiRleGlzdHMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBpZiAodHlwZW9mIGZpZWxkVmFsdWUuJGV4aXN0cyA9PT0gJ29iamVjdCcgJiYgZmllbGRWYWx1ZS4kZXhpc3RzLiRyZWxhdGl2ZVRpbWUpIHtcbiAgICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFxuICAgICAgICAgIFBhcnNlLkVycm9yLklOVkFMSURfSlNPTixcbiAgICAgICAgICAnJHJlbGF0aXZlVGltZSBjYW4gb25seSBiZSB1c2VkIHdpdGggdGhlICRsdCwgJGx0ZSwgJGd0LCBhbmQgJGd0ZSBvcGVyYXRvcnMnXG4gICAgICAgICk7XG4gICAgICB9IGVsc2UgaWYgKGZpZWxkVmFsdWUuJGV4aXN0cykge1xuICAgICAgICBwYXR0ZXJucy5wdXNoKGAkJHtpbmRleH06bmFtZSBJUyBOT1QgTlVMTGApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGF0dGVybnMucHVzaChgJCR7aW5kZXh9Om5hbWUgSVMgTlVMTGApO1xuICAgICAgfVxuICAgICAgdmFsdWVzLnB1c2goZmllbGROYW1lKTtcbiAgICAgIGluZGV4ICs9IDE7XG4gICAgfVxuXG4gICAgaWYgKGZpZWxkVmFsdWUuJGNvbnRhaW5lZEJ5KSB7XG4gICAgICBjb25zdCBhcnIgPSBmaWVsZFZhbHVlLiRjb250YWluZWRCeTtcbiAgICAgIGlmICghKGFyciBpbnN0YW5jZW9mIEFycmF5KSkge1xuICAgICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuSU5WQUxJRF9KU09OLCBgYmFkICRjb250YWluZWRCeTogc2hvdWxkIGJlIGFuIGFycmF5YCk7XG4gICAgICB9XG5cbiAgICAgIHBhdHRlcm5zLnB1c2goYCQke2luZGV4fTpuYW1lIDxAICQke2luZGV4ICsgMX06Ompzb25iYCk7XG4gICAgICB2YWx1ZXMucHVzaChmaWVsZE5hbWUsIEpTT04uc3RyaW5naWZ5KGFycikpO1xuICAgICAgaW5kZXggKz0gMjtcbiAgICB9XG5cbiAgICBpZiAoZmllbGRWYWx1ZS4kdGV4dCkge1xuICAgICAgY29uc3Qgc2VhcmNoID0gZmllbGRWYWx1ZS4kdGV4dC4kc2VhcmNoO1xuICAgICAgbGV0IGxhbmd1YWdlID0gJ2VuZ2xpc2gnO1xuICAgICAgaWYgKHR5cGVvZiBzZWFyY2ggIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5JTlZBTElEX0pTT04sIGBiYWQgJHRleHQ6ICRzZWFyY2gsIHNob3VsZCBiZSBvYmplY3RgKTtcbiAgICAgIH1cbiAgICAgIGlmICghc2VhcmNoLiR0ZXJtIHx8IHR5cGVvZiBzZWFyY2guJHRlcm0gIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5JTlZBTElEX0pTT04sIGBiYWQgJHRleHQ6ICR0ZXJtLCBzaG91bGQgYmUgc3RyaW5nYCk7XG4gICAgICB9XG4gICAgICBpZiAoc2VhcmNoLiRsYW5ndWFnZSAmJiB0eXBlb2Ygc2VhcmNoLiRsYW5ndWFnZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLklOVkFMSURfSlNPTiwgYGJhZCAkdGV4dDogJGxhbmd1YWdlLCBzaG91bGQgYmUgc3RyaW5nYCk7XG4gICAgICB9IGVsc2UgaWYgKHNlYXJjaC4kbGFuZ3VhZ2UpIHtcbiAgICAgICAgbGFuZ3VhZ2UgPSBzZWFyY2guJGxhbmd1YWdlO1xuICAgICAgfVxuICAgICAgaWYgKHNlYXJjaC4kY2FzZVNlbnNpdGl2ZSAmJiB0eXBlb2Ygc2VhcmNoLiRjYXNlU2Vuc2l0aXZlICE9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFxuICAgICAgICAgIFBhcnNlLkVycm9yLklOVkFMSURfSlNPTixcbiAgICAgICAgICBgYmFkICR0ZXh0OiAkY2FzZVNlbnNpdGl2ZSwgc2hvdWxkIGJlIGJvb2xlYW5gXG4gICAgICAgICk7XG4gICAgICB9IGVsc2UgaWYgKHNlYXJjaC4kY2FzZVNlbnNpdGl2ZSkge1xuICAgICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoXG4gICAgICAgICAgUGFyc2UuRXJyb3IuSU5WQUxJRF9KU09OLFxuICAgICAgICAgIGBiYWQgJHRleHQ6ICRjYXNlU2Vuc2l0aXZlIG5vdCBzdXBwb3J0ZWQsIHBsZWFzZSB1c2UgJHJlZ2V4IG9yIGNyZWF0ZSBhIHNlcGFyYXRlIGxvd2VyIGNhc2UgY29sdW1uLmBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChzZWFyY2guJGRpYWNyaXRpY1NlbnNpdGl2ZSAmJiB0eXBlb2Ygc2VhcmNoLiRkaWFjcml0aWNTZW5zaXRpdmUgIT09ICdib29sZWFuJykge1xuICAgICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoXG4gICAgICAgICAgUGFyc2UuRXJyb3IuSU5WQUxJRF9KU09OLFxuICAgICAgICAgIGBiYWQgJHRleHQ6ICRkaWFjcml0aWNTZW5zaXRpdmUsIHNob3VsZCBiZSBib29sZWFuYFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIGlmIChzZWFyY2guJGRpYWNyaXRpY1NlbnNpdGl2ZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFxuICAgICAgICAgIFBhcnNlLkVycm9yLklOVkFMSURfSlNPTixcbiAgICAgICAgICBgYmFkICR0ZXh0OiAkZGlhY3JpdGljU2Vuc2l0aXZlIC0gZmFsc2Ugbm90IHN1cHBvcnRlZCwgaW5zdGFsbCBQb3N0Z3JlcyBVbmFjY2VudCBFeHRlbnNpb25gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBwYXR0ZXJucy5wdXNoKFxuICAgICAgICBgdG9fdHN2ZWN0b3IoJCR7aW5kZXh9LCAkJHtpbmRleCArIDF9Om5hbWUpIEBAIHRvX3RzcXVlcnkoJCR7aW5kZXggKyAyfSwgJCR7aW5kZXggKyAzfSlgXG4gICAgICApO1xuICAgICAgdmFsdWVzLnB1c2gobGFuZ3VhZ2UsIGZpZWxkTmFtZSwgbGFuZ3VhZ2UsIHNlYXJjaC4kdGVybSk7XG4gICAgICBpbmRleCArPSA0O1xuICAgIH1cblxuICAgIGlmIChmaWVsZFZhbHVlLiRuZWFyU3BoZXJlKSB7XG4gICAgICBjb25zdCBwb2ludCA9IGZpZWxkVmFsdWUuJG5lYXJTcGhlcmU7XG4gICAgICBjb25zdCBkaXN0YW5jZSA9IGZpZWxkVmFsdWUuJG1heERpc3RhbmNlO1xuICAgICAgY29uc3QgZGlzdGFuY2VJbktNID0gZGlzdGFuY2UgKiA2MzcxICogMTAwMDtcbiAgICAgIHBhdHRlcm5zLnB1c2goXG4gICAgICAgIGBTVF9EaXN0YW5jZVNwaGVyZSgkJHtpbmRleH06bmFtZTo6Z2VvbWV0cnksIFBPSU5UKCQke2luZGV4ICsgMX0sICQke1xuICAgICAgICAgIGluZGV4ICsgMlxuICAgICAgICB9KTo6Z2VvbWV0cnkpIDw9ICQke2luZGV4ICsgM31gXG4gICAgICApO1xuICAgICAgc29ydHMucHVzaChcbiAgICAgICAgYFNUX0Rpc3RhbmNlU3BoZXJlKCQke2luZGV4fTpuYW1lOjpnZW9tZXRyeSwgUE9JTlQoJCR7aW5kZXggKyAxfSwgJCR7XG4gICAgICAgICAgaW5kZXggKyAyXG4gICAgICAgIH0pOjpnZW9tZXRyeSkgQVNDYFxuICAgICAgKTtcbiAgICAgIHZhbHVlcy5wdXNoKGZpZWxkTmFtZSwgcG9pbnQubG9uZ2l0dWRlLCBwb2ludC5sYXRpdHVkZSwgZGlzdGFuY2VJbktNKTtcbiAgICAgIGluZGV4ICs9IDQ7XG4gICAgfVxuXG4gICAgaWYgKGZpZWxkVmFsdWUuJHdpdGhpbiAmJiBmaWVsZFZhbHVlLiR3aXRoaW4uJGJveCkge1xuICAgICAgY29uc3QgYm94ID0gZmllbGRWYWx1ZS4kd2l0aGluLiRib3g7XG4gICAgICBjb25zdCBsZWZ0ID0gYm94WzBdLmxvbmdpdHVkZTtcbiAgICAgIGNvbnN0IGJvdHRvbSA9IGJveFswXS5sYXRpdHVkZTtcbiAgICAgIGNvbnN0IHJpZ2h0ID0gYm94WzFdLmxvbmdpdHVkZTtcbiAgICAgIGNvbnN0IHRvcCA9IGJveFsxXS5sYXRpdHVkZTtcblxuICAgICAgcGF0dGVybnMucHVzaChgJCR7aW5kZXh9Om5hbWU6OnBvaW50IDxAICQke2luZGV4ICsgMX06OmJveGApO1xuICAgICAgdmFsdWVzLnB1c2goZmllbGROYW1lLCBgKCgke2xlZnR9LCAke2JvdHRvbX0pLCAoJHtyaWdodH0sICR7dG9wfSkpYCk7XG4gICAgICBpbmRleCArPSAyO1xuICAgIH1cblxuICAgIGlmIChmaWVsZFZhbHVlLiRnZW9XaXRoaW4gJiYgZmllbGRWYWx1ZS4kZ2VvV2l0aGluLiRjZW50ZXJTcGhlcmUpIHtcbiAgICAgIGNvbnN0IGNlbnRlclNwaGVyZSA9IGZpZWxkVmFsdWUuJGdlb1dpdGhpbi4kY2VudGVyU3BoZXJlO1xuICAgICAgaWYgKCEoY2VudGVyU3BoZXJlIGluc3RhbmNlb2YgQXJyYXkpIHx8IGNlbnRlclNwaGVyZS5sZW5ndGggPCAyKSB7XG4gICAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihcbiAgICAgICAgICBQYXJzZS5FcnJvci5JTlZBTElEX0pTT04sXG4gICAgICAgICAgJ2JhZCAkZ2VvV2l0aGluIHZhbHVlOyAkY2VudGVyU3BoZXJlIHNob3VsZCBiZSBhbiBhcnJheSBvZiBQYXJzZS5HZW9Qb2ludCBhbmQgZGlzdGFuY2UnXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICAvLyBHZXQgcG9pbnQsIGNvbnZlcnQgdG8gZ2VvIHBvaW50IGlmIG5lY2Vzc2FyeSBhbmQgdmFsaWRhdGVcbiAgICAgIGxldCBwb2ludCA9IGNlbnRlclNwaGVyZVswXTtcbiAgICAgIGlmIChwb2ludCBpbnN0YW5jZW9mIEFycmF5ICYmIHBvaW50Lmxlbmd0aCA9PT0gMikge1xuICAgICAgICBwb2ludCA9IG5ldyBQYXJzZS5HZW9Qb2ludChwb2ludFsxXSwgcG9pbnRbMF0pO1xuICAgICAgfSBlbHNlIGlmICghR2VvUG9pbnRDb2Rlci5pc1ZhbGlkSlNPTihwb2ludCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFxuICAgICAgICAgIFBhcnNlLkVycm9yLklOVkFMSURfSlNPTixcbiAgICAgICAgICAnYmFkICRnZW9XaXRoaW4gdmFsdWU7ICRjZW50ZXJTcGhlcmUgZ2VvIHBvaW50IGludmFsaWQnXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBQYXJzZS5HZW9Qb2ludC5fdmFsaWRhdGUocG9pbnQubGF0aXR1ZGUsIHBvaW50LmxvbmdpdHVkZSk7XG4gICAgICAvLyBHZXQgZGlzdGFuY2UgYW5kIHZhbGlkYXRlXG4gICAgICBjb25zdCBkaXN0YW5jZSA9IGNlbnRlclNwaGVyZVsxXTtcbiAgICAgIGlmIChpc05hTihkaXN0YW5jZSkgfHwgZGlzdGFuY2UgPCAwKSB7XG4gICAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihcbiAgICAgICAgICBQYXJzZS5FcnJvci5JTlZBTElEX0pTT04sXG4gICAgICAgICAgJ2JhZCAkZ2VvV2l0aGluIHZhbHVlOyAkY2VudGVyU3BoZXJlIGRpc3RhbmNlIGludmFsaWQnXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjb25zdCBkaXN0YW5jZUluS00gPSBkaXN0YW5jZSAqIDYzNzEgKiAxMDAwO1xuICAgICAgcGF0dGVybnMucHVzaChcbiAgICAgICAgYFNUX0Rpc3RhbmNlU3BoZXJlKCQke2luZGV4fTpuYW1lOjpnZW9tZXRyeSwgUE9JTlQoJCR7aW5kZXggKyAxfSwgJCR7XG4gICAgICAgICAgaW5kZXggKyAyXG4gICAgICAgIH0pOjpnZW9tZXRyeSkgPD0gJCR7aW5kZXggKyAzfWBcbiAgICAgICk7XG4gICAgICB2YWx1ZXMucHVzaChmaWVsZE5hbWUsIHBvaW50LmxvbmdpdHVkZSwgcG9pbnQubGF0aXR1ZGUsIGRpc3RhbmNlSW5LTSk7XG4gICAgICBpbmRleCArPSA0O1xuICAgIH1cblxuICAgIGlmIChmaWVsZFZhbHVlLiRnZW9XaXRoaW4gJiYgZmllbGRWYWx1ZS4kZ2VvV2l0aGluLiRwb2x5Z29uKSB7XG4gICAgICBjb25zdCBwb2x5Z29uID0gZmllbGRWYWx1ZS4kZ2VvV2l0aGluLiRwb2x5Z29uO1xuICAgICAgbGV0IHBvaW50cztcbiAgICAgIGlmICh0eXBlb2YgcG9seWdvbiA9PT0gJ29iamVjdCcgJiYgcG9seWdvbi5fX3R5cGUgPT09ICdQb2x5Z29uJykge1xuICAgICAgICBpZiAoIXBvbHlnb24uY29vcmRpbmF0ZXMgfHwgcG9seWdvbi5jb29yZGluYXRlcy5sZW5ndGggPCAzKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFxuICAgICAgICAgICAgUGFyc2UuRXJyb3IuSU5WQUxJRF9KU09OLFxuICAgICAgICAgICAgJ2JhZCAkZ2VvV2l0aGluIHZhbHVlOyBQb2x5Z29uLmNvb3JkaW5hdGVzIHNob3VsZCBjb250YWluIGF0IGxlYXN0IDMgbG9uL2xhdCBwYWlycydcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHBvaW50cyA9IHBvbHlnb24uY29vcmRpbmF0ZXM7XG4gICAgICB9IGVsc2UgaWYgKHBvbHlnb24gaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICBpZiAocG9seWdvbi5sZW5ndGggPCAzKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFxuICAgICAgICAgICAgUGFyc2UuRXJyb3IuSU5WQUxJRF9KU09OLFxuICAgICAgICAgICAgJ2JhZCAkZ2VvV2l0aGluIHZhbHVlOyAkcG9seWdvbiBzaG91bGQgY29udGFpbiBhdCBsZWFzdCAzIEdlb1BvaW50cydcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHBvaW50cyA9IHBvbHlnb247XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoXG4gICAgICAgICAgUGFyc2UuRXJyb3IuSU5WQUxJRF9KU09OLFxuICAgICAgICAgIFwiYmFkICRnZW9XaXRoaW4gdmFsdWU7ICRwb2x5Z29uIHNob3VsZCBiZSBQb2x5Z29uIG9iamVjdCBvciBBcnJheSBvZiBQYXJzZS5HZW9Qb2ludCdzXCJcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHBvaW50cyA9IHBvaW50c1xuICAgICAgICAubWFwKHBvaW50ID0+IHtcbiAgICAgICAgICBpZiAocG9pbnQgaW5zdGFuY2VvZiBBcnJheSAmJiBwb2ludC5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICAgIFBhcnNlLkdlb1BvaW50Ll92YWxpZGF0ZShwb2ludFsxXSwgcG9pbnRbMF0pO1xuICAgICAgICAgICAgcmV0dXJuIGAoJHtwb2ludFswXX0sICR7cG9pbnRbMV19KWA7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0eXBlb2YgcG9pbnQgIT09ICdvYmplY3QnIHx8IHBvaW50Ll9fdHlwZSAhPT0gJ0dlb1BvaW50Jykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLklOVkFMSURfSlNPTiwgJ2JhZCAkZ2VvV2l0aGluIHZhbHVlJyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIFBhcnNlLkdlb1BvaW50Ll92YWxpZGF0ZShwb2ludC5sYXRpdHVkZSwgcG9pbnQubG9uZ2l0dWRlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGAoJHtwb2ludC5sb25naXR1ZGV9LCAke3BvaW50LmxhdGl0dWRlfSlgO1xuICAgICAgICB9KVxuICAgICAgICAuam9pbignLCAnKTtcblxuICAgICAgcGF0dGVybnMucHVzaChgJCR7aW5kZXh9Om5hbWU6OnBvaW50IDxAICQke2luZGV4ICsgMX06OnBvbHlnb25gKTtcbiAgICAgIHZhbHVlcy5wdXNoKGZpZWxkTmFtZSwgYCgke3BvaW50c30pYCk7XG4gICAgICBpbmRleCArPSAyO1xuICAgIH1cbiAgICBpZiAoZmllbGRWYWx1ZS4kZ2VvSW50ZXJzZWN0cyAmJiBmaWVsZFZhbHVlLiRnZW9JbnRlcnNlY3RzLiRwb2ludCkge1xuICAgICAgY29uc3QgcG9pbnQgPSBmaWVsZFZhbHVlLiRnZW9JbnRlcnNlY3RzLiRwb2ludDtcbiAgICAgIGlmICh0eXBlb2YgcG9pbnQgIT09ICdvYmplY3QnIHx8IHBvaW50Ll9fdHlwZSAhPT0gJ0dlb1BvaW50Jykge1xuICAgICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoXG4gICAgICAgICAgUGFyc2UuRXJyb3IuSU5WQUxJRF9KU09OLFxuICAgICAgICAgICdiYWQgJGdlb0ludGVyc2VjdCB2YWx1ZTsgJHBvaW50IHNob3VsZCBiZSBHZW9Qb2ludCdcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIFBhcnNlLkdlb1BvaW50Ll92YWxpZGF0ZShwb2ludC5sYXRpdHVkZSwgcG9pbnQubG9uZ2l0dWRlKTtcbiAgICAgIH1cbiAgICAgIHBhdHRlcm5zLnB1c2goYCQke2luZGV4fTpuYW1lOjpwb2x5Z29uIEA+ICQke2luZGV4ICsgMX06OnBvaW50YCk7XG4gICAgICB2YWx1ZXMucHVzaChmaWVsZE5hbWUsIGAoJHtwb2ludC5sb25naXR1ZGV9LCAke3BvaW50LmxhdGl0dWRlfSlgKTtcbiAgICAgIGluZGV4ICs9IDI7XG4gICAgfVxuXG4gICAgaWYgKGZpZWxkVmFsdWUuJHJlZ2V4KSB7XG4gICAgICBsZXQgcmVnZXggPSBmaWVsZFZhbHVlLiRyZWdleDtcbiAgICAgIGxldCBvcGVyYXRvciA9ICd+JztcbiAgICAgIGNvbnN0IG9wdHMgPSBmaWVsZFZhbHVlLiRvcHRpb25zO1xuICAgICAgaWYgKG9wdHMpIHtcbiAgICAgICAgaWYgKG9wdHMuaW5kZXhPZignaScpID49IDApIHtcbiAgICAgICAgICBvcGVyYXRvciA9ICd+Kic7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdHMuaW5kZXhPZigneCcpID49IDApIHtcbiAgICAgICAgICByZWdleCA9IHJlbW92ZVdoaXRlU3BhY2UocmVnZXgpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG5hbWUgPSB0cmFuc2Zvcm1Eb3RGaWVsZChmaWVsZE5hbWUpO1xuICAgICAgcmVnZXggPSBwcm9jZXNzUmVnZXhQYXR0ZXJuKHJlZ2V4KTtcblxuICAgICAgcGF0dGVybnMucHVzaChgJCR7aW5kZXh9OnJhdyAke29wZXJhdG9yfSAnJCR7aW5kZXggKyAxfTpyYXcnYCk7XG4gICAgICB2YWx1ZXMucHVzaChuYW1lLCByZWdleCk7XG4gICAgICBpbmRleCArPSAyO1xuICAgIH1cblxuICAgIGlmIChmaWVsZFZhbHVlLl9fdHlwZSA9PT0gJ1BvaW50ZXInKSB7XG4gICAgICBpZiAoaXNBcnJheUZpZWxkKSB7XG4gICAgICAgIHBhdHRlcm5zLnB1c2goYGFycmF5X2NvbnRhaW5zKCQke2luZGV4fTpuYW1lLCAkJHtpbmRleCArIDF9KWApO1xuICAgICAgICB2YWx1ZXMucHVzaChmaWVsZE5hbWUsIEpTT04uc3RyaW5naWZ5KFtmaWVsZFZhbHVlXSkpO1xuICAgICAgICBpbmRleCArPSAyO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGF0dGVybnMucHVzaChgJCR7aW5kZXh9Om5hbWUgPSAkJHtpbmRleCArIDF9YCk7XG4gICAgICAgIHZhbHVlcy5wdXNoKGZpZWxkTmFtZSwgZmllbGRWYWx1ZS5vYmplY3RJZCk7XG4gICAgICAgIGluZGV4ICs9IDI7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGZpZWxkVmFsdWUuX190eXBlID09PSAnRGF0ZScpIHtcbiAgICAgIHBhdHRlcm5zLnB1c2goYCQke2luZGV4fTpuYW1lID0gJCR7aW5kZXggKyAxfWApO1xuICAgICAgdmFsdWVzLnB1c2goZmllbGROYW1lLCBmaWVsZFZhbHVlLmlzbyk7XG4gICAgICBpbmRleCArPSAyO1xuICAgIH1cblxuICAgIGlmIChmaWVsZFZhbHVlLl9fdHlwZSA9PT0gJ0dlb1BvaW50Jykge1xuICAgICAgcGF0dGVybnMucHVzaChgJCR7aW5kZXh9Om5hbWUgfj0gUE9JTlQoJCR7aW5kZXggKyAxfSwgJCR7aW5kZXggKyAyfSlgKTtcbiAgICAgIHZhbHVlcy5wdXNoKGZpZWxkTmFtZSwgZmllbGRWYWx1ZS5sb25naXR1ZGUsIGZpZWxkVmFsdWUubGF0aXR1ZGUpO1xuICAgICAgaW5kZXggKz0gMztcbiAgICB9XG5cbiAgICBpZiAoZmllbGRWYWx1ZS5fX3R5cGUgPT09ICdQb2x5Z29uJykge1xuICAgICAgY29uc3QgdmFsdWUgPSBjb252ZXJ0UG9seWdvblRvU1FMKGZpZWxkVmFsdWUuY29vcmRpbmF0ZXMpO1xuICAgICAgcGF0dGVybnMucHVzaChgJCR7aW5kZXh9Om5hbWUgfj0gJCR7aW5kZXggKyAxfTo6cG9seWdvbmApO1xuICAgICAgdmFsdWVzLnB1c2goZmllbGROYW1lLCB2YWx1ZSk7XG4gICAgICBpbmRleCArPSAyO1xuICAgIH1cblxuICAgIE9iamVjdC5rZXlzKFBhcnNlVG9Qb3NncmVzQ29tcGFyYXRvcikuZm9yRWFjaChjbXAgPT4ge1xuICAgICAgaWYgKGZpZWxkVmFsdWVbY21wXSB8fCBmaWVsZFZhbHVlW2NtcF0gPT09IDApIHtcbiAgICAgICAgY29uc3QgcGdDb21wYXJhdG9yID0gUGFyc2VUb1Bvc2dyZXNDb21wYXJhdG9yW2NtcF07XG4gICAgICAgIGxldCBjb25zdHJhaW50RmllbGROYW1lO1xuICAgICAgICBsZXQgcG9zdGdyZXNWYWx1ZSA9IHRvUG9zdGdyZXNWYWx1ZShmaWVsZFZhbHVlW2NtcF0pO1xuXG4gICAgICAgIGlmIChmaWVsZE5hbWUuaW5kZXhPZignLicpID49IDApIHtcbiAgICAgICAgICBjb25zdCBjYXN0VHlwZSA9IHRvUG9zdGdyZXNWYWx1ZUNhc3RUeXBlKGZpZWxkVmFsdWVbY21wXSk7XG4gICAgICAgICAgY29uc3RyYWludEZpZWxkTmFtZSA9IGNhc3RUeXBlXG4gICAgICAgICAgICA/IGBDQVNUICgoJHt0cmFuc2Zvcm1Eb3RGaWVsZChmaWVsZE5hbWUpfSkgQVMgJHtjYXN0VHlwZX0pYFxuICAgICAgICAgICAgOiB0cmFuc2Zvcm1Eb3RGaWVsZChmaWVsZE5hbWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmICh0eXBlb2YgcG9zdGdyZXNWYWx1ZSA9PT0gJ29iamVjdCcgJiYgcG9zdGdyZXNWYWx1ZS4kcmVsYXRpdmVUaW1lKSB7XG4gICAgICAgICAgICBpZiAoc2NoZW1hLmZpZWxkc1tmaWVsZE5hbWVdLnR5cGUgIT09ICdEYXRlJykge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoXG4gICAgICAgICAgICAgICAgUGFyc2UuRXJyb3IuSU5WQUxJRF9KU09OLFxuICAgICAgICAgICAgICAgICckcmVsYXRpdmVUaW1lIGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBEYXRlIGZpZWxkJ1xuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcGFyc2VyUmVzdWx0ID0gVXRpbHMucmVsYXRpdmVUaW1lVG9EYXRlKHBvc3RncmVzVmFsdWUuJHJlbGF0aXZlVGltZSk7XG4gICAgICAgICAgICBpZiAocGFyc2VyUmVzdWx0LnN0YXR1cyA9PT0gJ3N1Y2Nlc3MnKSB7XG4gICAgICAgICAgICAgIHBvc3RncmVzVmFsdWUgPSB0b1Bvc3RncmVzVmFsdWUocGFyc2VyUmVzdWx0LnJlc3VsdCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciB3aGlsZSBwYXJzaW5nIHJlbGF0aXZlIGRhdGUnLCBwYXJzZXJSZXN1bHQpO1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoXG4gICAgICAgICAgICAgICAgUGFyc2UuRXJyb3IuSU5WQUxJRF9KU09OLFxuICAgICAgICAgICAgICAgIGBiYWQgJHJlbGF0aXZlVGltZSAoJHtwb3N0Z3Jlc1ZhbHVlLiRyZWxhdGl2ZVRpbWV9KSB2YWx1ZS4gJHtwYXJzZXJSZXN1bHQuaW5mb31gXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0cmFpbnRGaWVsZE5hbWUgPSBgJCR7aW5kZXgrK306bmFtZWA7XG4gICAgICAgICAgdmFsdWVzLnB1c2goZmllbGROYW1lKTtcbiAgICAgICAgfVxuICAgICAgICB2YWx1ZXMucHVzaChwb3N0Z3Jlc1ZhbHVlKTtcbiAgICAgICAgcGF0dGVybnMucHVzaChgJHtjb25zdHJhaW50RmllbGROYW1lfSAke3BnQ29tcGFyYXRvcn0gJCR7aW5kZXgrK31gKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmIChpbml0aWFsUGF0dGVybnNMZW5ndGggPT09IHBhdHRlcm5zLmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFxuICAgICAgICBQYXJzZS5FcnJvci5PUEVSQVRJT05fRk9SQklEREVOLFxuICAgICAgICBgUG9zdGdyZXMgZG9lc24ndCBzdXBwb3J0IHRoaXMgcXVlcnkgdHlwZSB5ZXQgJHtKU09OLnN0cmluZ2lmeShmaWVsZFZhbHVlKX1gXG4gICAgICApO1xuICAgIH1cbiAgfVxuICB2YWx1ZXMgPSB2YWx1ZXMubWFwKHRyYW5zZm9ybVZhbHVlKTtcbiAgcmV0dXJuIHsgcGF0dGVybjogcGF0dGVybnMuam9pbignIEFORCAnKSwgdmFsdWVzLCBzb3J0cyB9O1xufTtcblxuZXhwb3J0IGNsYXNzIFBvc3RncmVzU3RvcmFnZUFkYXB0ZXIgaW1wbGVtZW50cyBTdG9yYWdlQWRhcHRlciB7XG4gIGNhblNvcnRPbkpvaW5UYWJsZXM6IGJvb2xlYW47XG4gIGVuYWJsZVNjaGVtYUhvb2tzOiBib29sZWFuO1xuXG4gIC8vIFByaXZhdGVcbiAgX2NvbGxlY3Rpb25QcmVmaXg6IHN0cmluZztcbiAgX2NsaWVudDogYW55O1xuICBfb25jaGFuZ2U6IGFueTtcbiAgX3BncDogYW55O1xuICBfc3RyZWFtOiBhbnk7XG4gIF91dWlkOiBhbnk7XG5cbiAgY29uc3RydWN0b3IoeyB1cmksIGNvbGxlY3Rpb25QcmVmaXggPSAnJywgZGF0YWJhc2VPcHRpb25zID0ge30gfTogYW55KSB7XG4gICAgdGhpcy5fY29sbGVjdGlvblByZWZpeCA9IGNvbGxlY3Rpb25QcmVmaXg7XG4gICAgdGhpcy5lbmFibGVTY2hlbWFIb29rcyA9ICEhZGF0YWJhc2VPcHRpb25zLmVuYWJsZVNjaGVtYUhvb2tzO1xuICAgIGRlbGV0ZSBkYXRhYmFzZU9wdGlvbnMuZW5hYmxlU2NoZW1hSG9va3M7XG5cbiAgICBjb25zdCB7IGNsaWVudCwgcGdwIH0gPSBjcmVhdGVDbGllbnQodXJpLCBkYXRhYmFzZU9wdGlvbnMpO1xuICAgIHRoaXMuX2NsaWVudCA9IGNsaWVudDtcbiAgICB0aGlzLl9vbmNoYW5nZSA9ICgpID0+IHt9O1xuICAgIHRoaXMuX3BncCA9IHBncDtcbiAgICB0aGlzLl91dWlkID0gdXVpZHY0KCk7XG4gICAgdGhpcy5jYW5Tb3J0T25Kb2luVGFibGVzID0gZmFsc2U7XG4gIH1cblxuICB3YXRjaChjYWxsYmFjazogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMuX29uY2hhbmdlID0gY2FsbGJhY2s7XG4gIH1cblxuICAvL05vdGUgdGhhdCBhbmFseXplPXRydWUgd2lsbCBydW4gdGhlIHF1ZXJ5LCBleGVjdXRpbmcgSU5TRVJUUywgREVMRVRFUywgZXRjLlxuICBjcmVhdGVFeHBsYWluYWJsZVF1ZXJ5KHF1ZXJ5OiBzdHJpbmcsIGFuYWx5emU6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgIGlmIChhbmFseXplKSB7XG4gICAgICByZXR1cm4gJ0VYUExBSU4gKEFOQUxZWkUsIEZPUk1BVCBKU09OKSAnICsgcXVlcnk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAnRVhQTEFJTiAoRk9STUFUIEpTT04pICcgKyBxdWVyeTtcbiAgICB9XG4gIH1cblxuICBoYW5kbGVTaHV0ZG93bigpIHtcbiAgICBpZiAodGhpcy5fc3RyZWFtKSB7XG4gICAgICB0aGlzLl9zdHJlYW0uZG9uZSgpO1xuICAgICAgZGVsZXRlIHRoaXMuX3N0cmVhbTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLl9jbGllbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fY2xpZW50LiRwb29sLmVuZCgpO1xuICB9XG5cbiAgYXN5bmMgX2xpc3RlblRvU2NoZW1hKCkge1xuICAgIGlmICghdGhpcy5fc3RyZWFtICYmIHRoaXMuZW5hYmxlU2NoZW1hSG9va3MpIHtcbiAgICAgIHRoaXMuX3N0cmVhbSA9IGF3YWl0IHRoaXMuX2NsaWVudC5jb25uZWN0KHsgZGlyZWN0OiB0cnVlIH0pO1xuICAgICAgdGhpcy5fc3RyZWFtLmNsaWVudC5vbignbm90aWZpY2F0aW9uJywgZGF0YSA9PiB7XG4gICAgICAgIGNvbnN0IHBheWxvYWQgPSBKU09OLnBhcnNlKGRhdGEucGF5bG9hZCk7XG4gICAgICAgIGlmIChwYXlsb2FkLnNlbmRlcklkICE9PSB0aGlzLl91dWlkKSB7XG4gICAgICAgICAgdGhpcy5fb25jaGFuZ2UoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBhd2FpdCB0aGlzLl9zdHJlYW0ubm9uZSgnTElTVEVOICQxficsICdzY2hlbWEuY2hhbmdlJyk7XG4gICAgfVxuICB9XG5cbiAgX25vdGlmeVNjaGVtYUNoYW5nZSgpIHtcbiAgICBpZiAodGhpcy5fc3RyZWFtKSB7XG4gICAgICB0aGlzLl9zdHJlYW1cbiAgICAgICAgLm5vbmUoJ05PVElGWSAkMX4sICQyJywgWydzY2hlbWEuY2hhbmdlJywgeyBzZW5kZXJJZDogdGhpcy5fdXVpZCB9XSlcbiAgICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgICBjb25zb2xlLmxvZygnRmFpbGVkIHRvIE5vdGlmeTonLCBlcnJvcik7IC8vIHVubGlrZWx5IHRvIGV2ZXIgaGFwcGVuXG4gICAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIF9lbnN1cmVTY2hlbWFDb2xsZWN0aW9uRXhpc3RzKGNvbm46IGFueSkge1xuICAgIGNvbm4gPSBjb25uIHx8IHRoaXMuX2NsaWVudDtcbiAgICBhd2FpdCBjb25uXG4gICAgICAubm9uZShcbiAgICAgICAgJ0NSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTIFwiX1NDSEVNQVwiICggXCJjbGFzc05hbWVcIiB2YXJDaGFyKDEyMCksIFwic2NoZW1hXCIganNvbmIsIFwiaXNQYXJzZUNsYXNzXCIgYm9vbCwgUFJJTUFSWSBLRVkgKFwiY2xhc3NOYW1lXCIpICknXG4gICAgICApXG4gICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgY2xhc3NFeGlzdHMobmFtZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudC5vbmUoXG4gICAgICAnU0VMRUNUIEVYSVNUUyAoU0VMRUNUIDEgRlJPTSBpbmZvcm1hdGlvbl9zY2hlbWEudGFibGVzIFdIRVJFIHRhYmxlX25hbWUgPSAkMSknLFxuICAgICAgW25hbWVdLFxuICAgICAgYSA9PiBhLmV4aXN0c1xuICAgICk7XG4gIH1cblxuICBhc3luYyBzZXRDbGFzc0xldmVsUGVybWlzc2lvbnMoY2xhc3NOYW1lOiBzdHJpbmcsIENMUHM6IGFueSkge1xuICAgIGF3YWl0IHRoaXMuX2NsaWVudC50YXNrKCdzZXQtY2xhc3MtbGV2ZWwtcGVybWlzc2lvbnMnLCBhc3luYyB0ID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlcyA9IFtjbGFzc05hbWUsICdzY2hlbWEnLCAnY2xhc3NMZXZlbFBlcm1pc3Npb25zJywgSlNPTi5zdHJpbmdpZnkoQ0xQcyldO1xuICAgICAgYXdhaXQgdC5ub25lKFxuICAgICAgICBgVVBEQVRFIFwiX1NDSEVNQVwiIFNFVCAkMjpuYW1lID0ganNvbl9vYmplY3Rfc2V0X2tleSgkMjpuYW1lLCAkMzo6dGV4dCwgJDQ6Ompzb25iKSBXSEVSRSBcImNsYXNzTmFtZVwiID0gJDFgLFxuICAgICAgICB2YWx1ZXNcbiAgICAgICk7XG4gICAgfSk7XG4gICAgdGhpcy5fbm90aWZ5U2NoZW1hQ2hhbmdlKCk7XG4gIH1cblxuICBhc3luYyBzZXRJbmRleGVzV2l0aFNjaGVtYUZvcm1hdChcbiAgICBjbGFzc05hbWU6IHN0cmluZyxcbiAgICBzdWJtaXR0ZWRJbmRleGVzOiBhbnksXG4gICAgZXhpc3RpbmdJbmRleGVzOiBhbnkgPSB7fSxcbiAgICBmaWVsZHM6IGFueSxcbiAgICBjb25uOiA/YW55XG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbm4gPSBjb25uIHx8IHRoaXMuX2NsaWVudDtcbiAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICBpZiAoc3VibWl0dGVkSW5kZXhlcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfVxuICAgIGlmIChPYmplY3Qua2V5cyhleGlzdGluZ0luZGV4ZXMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgZXhpc3RpbmdJbmRleGVzID0geyBfaWRfOiB7IF9pZDogMSB9IH07XG4gICAgfVxuICAgIGNvbnN0IGRlbGV0ZWRJbmRleGVzID0gW107XG4gICAgY29uc3QgaW5zZXJ0ZWRJbmRleGVzID0gW107XG4gICAgT2JqZWN0LmtleXMoc3VibWl0dGVkSW5kZXhlcykuZm9yRWFjaChuYW1lID0+IHtcbiAgICAgIGNvbnN0IGZpZWxkID0gc3VibWl0dGVkSW5kZXhlc1tuYW1lXTtcbiAgICAgIGlmIChleGlzdGluZ0luZGV4ZXNbbmFtZV0gJiYgZmllbGQuX19vcCAhPT0gJ0RlbGV0ZScpIHtcbiAgICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLklOVkFMSURfUVVFUlksIGBJbmRleCAke25hbWV9IGV4aXN0cywgY2Fubm90IHVwZGF0ZS5gKTtcbiAgICAgIH1cbiAgICAgIGlmICghZXhpc3RpbmdJbmRleGVzW25hbWVdICYmIGZpZWxkLl9fb3AgPT09ICdEZWxldGUnKSB7XG4gICAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihcbiAgICAgICAgICBQYXJzZS5FcnJvci5JTlZBTElEX1FVRVJZLFxuICAgICAgICAgIGBJbmRleCAke25hbWV9IGRvZXMgbm90IGV4aXN0LCBjYW5ub3QgZGVsZXRlLmBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChmaWVsZC5fX29wID09PSAnRGVsZXRlJykge1xuICAgICAgICBkZWxldGVkSW5kZXhlcy5wdXNoKG5hbWUpO1xuICAgICAgICBkZWxldGUgZXhpc3RpbmdJbmRleGVzW25hbWVdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgT2JqZWN0LmtleXMoZmllbGQpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChmaWVsZHMsIGtleSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihcbiAgICAgICAgICAgICAgUGFyc2UuRXJyb3IuSU5WQUxJRF9RVUVSWSxcbiAgICAgICAgICAgICAgYEZpZWxkICR7a2V5fSBkb2VzIG5vdCBleGlzdCwgY2Fubm90IGFkZCBpbmRleC5gXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGV4aXN0aW5nSW5kZXhlc1tuYW1lXSA9IGZpZWxkO1xuICAgICAgICBpbnNlcnRlZEluZGV4ZXMucHVzaCh7XG4gICAgICAgICAga2V5OiBmaWVsZCxcbiAgICAgICAgICBuYW1lLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBhd2FpdCBjb25uLnR4KCdzZXQtaW5kZXhlcy13aXRoLXNjaGVtYS1mb3JtYXQnLCBhc3luYyB0ID0+IHtcbiAgICAgIGlmIChpbnNlcnRlZEluZGV4ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBhd2FpdCBzZWxmLmNyZWF0ZUluZGV4ZXMoY2xhc3NOYW1lLCBpbnNlcnRlZEluZGV4ZXMsIHQpO1xuICAgICAgfVxuICAgICAgaWYgKGRlbGV0ZWRJbmRleGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgYXdhaXQgc2VsZi5kcm9wSW5kZXhlcyhjbGFzc05hbWUsIGRlbGV0ZWRJbmRleGVzLCB0KTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IHQubm9uZShcbiAgICAgICAgJ1VQREFURSBcIl9TQ0hFTUFcIiBTRVQgJDI6bmFtZSA9IGpzb25fb2JqZWN0X3NldF9rZXkoJDI6bmFtZSwgJDM6OnRleHQsICQ0Ojpqc29uYikgV0hFUkUgXCJjbGFzc05hbWVcIiA9ICQxJyxcbiAgICAgICAgW2NsYXNzTmFtZSwgJ3NjaGVtYScsICdpbmRleGVzJywgSlNPTi5zdHJpbmdpZnkoZXhpc3RpbmdJbmRleGVzKV1cbiAgICAgICk7XG4gICAgfSk7XG4gICAgdGhpcy5fbm90aWZ5U2NoZW1hQ2hhbmdlKCk7XG4gIH1cblxuICBhc3luYyBjcmVhdGVDbGFzcyhjbGFzc05hbWU6IHN0cmluZywgc2NoZW1hOiBTY2hlbWFUeXBlLCBjb25uOiA/YW55KSB7XG4gICAgY29ubiA9IGNvbm4gfHwgdGhpcy5fY2xpZW50O1xuICAgIGNvbnN0IHBhcnNlU2NoZW1hID0gYXdhaXQgY29ublxuICAgICAgLnR4KCdjcmVhdGUtY2xhc3MnLCBhc3luYyB0ID0+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5jcmVhdGVUYWJsZShjbGFzc05hbWUsIHNjaGVtYSwgdCk7XG4gICAgICAgIGF3YWl0IHQubm9uZShcbiAgICAgICAgICAnSU5TRVJUIElOVE8gXCJfU0NIRU1BXCIgKFwiY2xhc3NOYW1lXCIsIFwic2NoZW1hXCIsIFwiaXNQYXJzZUNsYXNzXCIpIFZBTFVFUyAoJDxjbGFzc05hbWU+LCAkPHNjaGVtYT4sIHRydWUpJyxcbiAgICAgICAgICB7IGNsYXNzTmFtZSwgc2NoZW1hIH1cbiAgICAgICAgKTtcbiAgICAgICAgYXdhaXQgdGhpcy5zZXRJbmRleGVzV2l0aFNjaGVtYUZvcm1hdChjbGFzc05hbWUsIHNjaGVtYS5pbmRleGVzLCB7fSwgc2NoZW1hLmZpZWxkcywgdCk7XG4gICAgICAgIHJldHVybiB0b1BhcnNlU2NoZW1hKHNjaGVtYSk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKGVyciA9PiB7XG4gICAgICAgIGlmIChlcnIuY29kZSA9PT0gUG9zdGdyZXNVbmlxdWVJbmRleFZpb2xhdGlvbkVycm9yICYmIGVyci5kZXRhaWwuaW5jbHVkZXMoY2xhc3NOYW1lKSkge1xuICAgICAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5EVVBMSUNBVEVfVkFMVUUsIGBDbGFzcyAke2NsYXNzTmFtZX0gYWxyZWFkeSBleGlzdHMuYCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfSk7XG4gICAgdGhpcy5fbm90aWZ5U2NoZW1hQ2hhbmdlKCk7XG4gICAgcmV0dXJuIHBhcnNlU2NoZW1hO1xuICB9XG5cbiAgLy8gSnVzdCBjcmVhdGUgYSB0YWJsZSwgZG8gbm90IGluc2VydCBpbiBzY2hlbWFcbiAgYXN5bmMgY3JlYXRlVGFibGUoY2xhc3NOYW1lOiBzdHJpbmcsIHNjaGVtYTogU2NoZW1hVHlwZSwgY29ubjogYW55KSB7XG4gICAgY29ubiA9IGNvbm4gfHwgdGhpcy5fY2xpZW50O1xuICAgIGRlYnVnKCdjcmVhdGVUYWJsZScpO1xuICAgIGNvbnN0IHZhbHVlc0FycmF5ID0gW107XG4gICAgY29uc3QgcGF0dGVybnNBcnJheSA9IFtdO1xuICAgIGNvbnN0IGZpZWxkcyA9IE9iamVjdC5hc3NpZ24oe30sIHNjaGVtYS5maWVsZHMpO1xuICAgIGlmIChjbGFzc05hbWUgPT09ICdfVXNlcicpIHtcbiAgICAgIGZpZWxkcy5fZW1haWxfdmVyaWZ5X3Rva2VuX2V4cGlyZXNfYXQgPSB7IHR5cGU6ICdEYXRlJyB9O1xuICAgICAgZmllbGRzLl9lbWFpbF92ZXJpZnlfdG9rZW4gPSB7IHR5cGU6ICdTdHJpbmcnIH07XG4gICAgICBmaWVsZHMuX2FjY291bnRfbG9ja291dF9leHBpcmVzX2F0ID0geyB0eXBlOiAnRGF0ZScgfTtcbiAgICAgIGZpZWxkcy5fZmFpbGVkX2xvZ2luX2NvdW50ID0geyB0eXBlOiAnTnVtYmVyJyB9O1xuICAgICAgZmllbGRzLl9wZXJpc2hhYmxlX3Rva2VuID0geyB0eXBlOiAnU3RyaW5nJyB9O1xuICAgICAgZmllbGRzLl9wZXJpc2hhYmxlX3Rva2VuX2V4cGlyZXNfYXQgPSB7IHR5cGU6ICdEYXRlJyB9O1xuICAgICAgZmllbGRzLl9wYXNzd29yZF9jaGFuZ2VkX2F0ID0geyB0eXBlOiAnRGF0ZScgfTtcbiAgICAgIGZpZWxkcy5fcGFzc3dvcmRfaGlzdG9yeSA9IHsgdHlwZTogJ0FycmF5JyB9O1xuICAgIH1cbiAgICBsZXQgaW5kZXggPSAyO1xuICAgIGNvbnN0IHJlbGF0aW9ucyA9IFtdO1xuICAgIE9iamVjdC5rZXlzKGZpZWxkcykuZm9yRWFjaChmaWVsZE5hbWUgPT4ge1xuICAgICAgY29uc3QgcGFyc2VUeXBlID0gZmllbGRzW2ZpZWxkTmFtZV07XG4gICAgICAvLyBTa2lwIHdoZW4gaXQncyBhIHJlbGF0aW9uXG4gICAgICAvLyBXZSdsbCBjcmVhdGUgdGhlIHRhYmxlcyBsYXRlclxuICAgICAgaWYgKHBhcnNlVHlwZS50eXBlID09PSAnUmVsYXRpb24nKSB7XG4gICAgICAgIHJlbGF0aW9ucy5wdXNoKGZpZWxkTmFtZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChbJ19ycGVybScsICdfd3Blcm0nXS5pbmRleE9mKGZpZWxkTmFtZSkgPj0gMCkge1xuICAgICAgICBwYXJzZVR5cGUuY29udGVudHMgPSB7IHR5cGU6ICdTdHJpbmcnIH07XG4gICAgICB9XG4gICAgICB2YWx1ZXNBcnJheS5wdXNoKGZpZWxkTmFtZSk7XG4gICAgICB2YWx1ZXNBcnJheS5wdXNoKHBhcnNlVHlwZVRvUG9zdGdyZXNUeXBlKHBhcnNlVHlwZSkpO1xuICAgICAgcGF0dGVybnNBcnJheS5wdXNoKGAkJHtpbmRleH06bmFtZSAkJHtpbmRleCArIDF9OnJhd2ApO1xuICAgICAgaWYgKGZpZWxkTmFtZSA9PT0gJ29iamVjdElkJykge1xuICAgICAgICBwYXR0ZXJuc0FycmF5LnB1c2goYFBSSU1BUlkgS0VZICgkJHtpbmRleH06bmFtZSlgKTtcbiAgICAgIH1cbiAgICAgIGluZGV4ID0gaW5kZXggKyAyO1xuICAgIH0pO1xuICAgIGNvbnN0IHFzID0gYENSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTICQxOm5hbWUgKCR7cGF0dGVybnNBcnJheS5qb2luKCl9KWA7XG4gICAgY29uc3QgdmFsdWVzID0gW2NsYXNzTmFtZSwgLi4udmFsdWVzQXJyYXldO1xuXG4gICAgcmV0dXJuIGNvbm4udGFzaygnY3JlYXRlLXRhYmxlJywgYXN5bmMgdCA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0Lm5vbmUocXMsIHZhbHVlcyk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAoZXJyb3IuY29kZSAhPT0gUG9zdGdyZXNEdXBsaWNhdGVSZWxhdGlvbkVycm9yKSB7XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgLy8gRUxTRTogVGFibGUgYWxyZWFkeSBleGlzdHMsIG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQgYnkgYSBkaWZmZXJlbnQgcmVxdWVzdC4gSWdub3JlIHRoZSBlcnJvci5cbiAgICAgIH1cbiAgICAgIGF3YWl0IHQudHgoJ2NyZWF0ZS10YWJsZS10eCcsIHR4ID0+IHtcbiAgICAgICAgcmV0dXJuIHR4LmJhdGNoKFxuICAgICAgICAgIHJlbGF0aW9ucy5tYXAoZmllbGROYW1lID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0eC5ub25lKFxuICAgICAgICAgICAgICAnQ1JFQVRFIFRBQkxFIElGIE5PVCBFWElTVFMgJDxqb2luVGFibGU6bmFtZT4gKFwicmVsYXRlZElkXCIgdmFyQ2hhcigxMjApLCBcIm93bmluZ0lkXCIgdmFyQ2hhcigxMjApLCBQUklNQVJZIEtFWShcInJlbGF0ZWRJZFwiLCBcIm93bmluZ0lkXCIpICknLFxuICAgICAgICAgICAgICB7IGpvaW5UYWJsZTogYF9Kb2luOiR7ZmllbGROYW1lfToke2NsYXNzTmFtZX1gIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgc2NoZW1hVXBncmFkZShjbGFzc05hbWU6IHN0cmluZywgc2NoZW1hOiBTY2hlbWFUeXBlLCBjb25uOiBhbnkpIHtcbiAgICBkZWJ1Zygnc2NoZW1hVXBncmFkZScpO1xuICAgIGNvbm4gPSBjb25uIHx8IHRoaXMuX2NsaWVudDtcbiAgICBjb25zdCBzZWxmID0gdGhpcztcblxuICAgIGF3YWl0IGNvbm4udGFzaygnc2NoZW1hLXVwZ3JhZGUnLCBhc3luYyB0ID0+IHtcbiAgICAgIGNvbnN0IGNvbHVtbnMgPSBhd2FpdCB0Lm1hcChcbiAgICAgICAgJ1NFTEVDVCBjb2x1bW5fbmFtZSBGUk9NIGluZm9ybWF0aW9uX3NjaGVtYS5jb2x1bW5zIFdIRVJFIHRhYmxlX25hbWUgPSAkPGNsYXNzTmFtZT4nLFxuICAgICAgICB7IGNsYXNzTmFtZSB9LFxuICAgICAgICBhID0+IGEuY29sdW1uX25hbWVcbiAgICAgICk7XG4gICAgICBjb25zdCBuZXdDb2x1bW5zID0gT2JqZWN0LmtleXMoc2NoZW1hLmZpZWxkcylcbiAgICAgICAgLmZpbHRlcihpdGVtID0+IGNvbHVtbnMuaW5kZXhPZihpdGVtKSA9PT0gLTEpXG4gICAgICAgIC5tYXAoZmllbGROYW1lID0+IHNlbGYuYWRkRmllbGRJZk5vdEV4aXN0cyhjbGFzc05hbWUsIGZpZWxkTmFtZSwgc2NoZW1hLmZpZWxkc1tmaWVsZE5hbWVdKSk7XG5cbiAgICAgIGF3YWl0IHQuYmF0Y2gobmV3Q29sdW1ucyk7XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBhZGRGaWVsZElmTm90RXhpc3RzKGNsYXNzTmFtZTogc3RyaW5nLCBmaWVsZE5hbWU6IHN0cmluZywgdHlwZTogYW55KSB7XG4gICAgLy8gVE9ETzogTXVzdCBiZSByZXZpc2VkIGZvciBpbnZhbGlkIGxvZ2ljLi4uXG4gICAgZGVidWcoJ2FkZEZpZWxkSWZOb3RFeGlzdHMnKTtcbiAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICBhd2FpdCB0aGlzLl9jbGllbnQudHgoJ2FkZC1maWVsZC1pZi1ub3QtZXhpc3RzJywgYXN5bmMgdCA9PiB7XG4gICAgICBpZiAodHlwZS50eXBlICE9PSAnUmVsYXRpb24nKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgdC5ub25lKFxuICAgICAgICAgICAgJ0FMVEVSIFRBQkxFICQ8Y2xhc3NOYW1lOm5hbWU+IEFERCBDT0xVTU4gSUYgTk9UIEVYSVNUUyAkPGZpZWxkTmFtZTpuYW1lPiAkPHBvc3RncmVzVHlwZTpyYXc+JyxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgY2xhc3NOYW1lLFxuICAgICAgICAgICAgICBmaWVsZE5hbWUsXG4gICAgICAgICAgICAgIHBvc3RncmVzVHlwZTogcGFyc2VUeXBlVG9Qb3N0Z3Jlc1R5cGUodHlwZSksXG4gICAgICAgICAgICB9XG4gICAgICAgICAgKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBpZiAoZXJyb3IuY29kZSA9PT0gUG9zdGdyZXNSZWxhdGlvbkRvZXNOb3RFeGlzdEVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gc2VsZi5jcmVhdGVDbGFzcyhjbGFzc05hbWUsIHsgZmllbGRzOiB7IFtmaWVsZE5hbWVdOiB0eXBlIH0gfSwgdCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChlcnJvci5jb2RlICE9PSBQb3N0Z3Jlc0R1cGxpY2F0ZUNvbHVtbkVycm9yKSB7XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gQ29sdW1uIGFscmVhZHkgZXhpc3RzLCBjcmVhdGVkIGJ5IG90aGVyIHJlcXVlc3QuIENhcnJ5IG9uIHRvIHNlZSBpZiBpdCdzIHRoZSByaWdodCB0eXBlLlxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhd2FpdCB0Lm5vbmUoXG4gICAgICAgICAgJ0NSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTICQ8am9pblRhYmxlOm5hbWU+IChcInJlbGF0ZWRJZFwiIHZhckNoYXIoMTIwKSwgXCJvd25pbmdJZFwiIHZhckNoYXIoMTIwKSwgUFJJTUFSWSBLRVkoXCJyZWxhdGVkSWRcIiwgXCJvd25pbmdJZFwiKSApJyxcbiAgICAgICAgICB7IGpvaW5UYWJsZTogYF9Kb2luOiR7ZmllbGROYW1lfToke2NsYXNzTmFtZX1gIH1cbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdC5hbnkoXG4gICAgICAgICdTRUxFQ1QgXCJzY2hlbWFcIiBGUk9NIFwiX1NDSEVNQVwiIFdIRVJFIFwiY2xhc3NOYW1lXCIgPSAkPGNsYXNzTmFtZT4gYW5kIChcInNjaGVtYVwiOjpqc29uLT5cXCdmaWVsZHNcXCctPiQ8ZmllbGROYW1lPikgaXMgbm90IG51bGwnLFxuICAgICAgICB7IGNsYXNzTmFtZSwgZmllbGROYW1lIH1cbiAgICAgICk7XG5cbiAgICAgIGlmIChyZXN1bHRbMF0pIHtcbiAgICAgICAgdGhyb3cgJ0F0dGVtcHRlZCB0byBhZGQgYSBmaWVsZCB0aGF0IGFscmVhZHkgZXhpc3RzJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHBhdGggPSBge2ZpZWxkcywke2ZpZWxkTmFtZX19YDtcbiAgICAgICAgYXdhaXQgdC5ub25lKFxuICAgICAgICAgICdVUERBVEUgXCJfU0NIRU1BXCIgU0VUIFwic2NoZW1hXCI9anNvbmJfc2V0KFwic2NoZW1hXCIsICQ8cGF0aD4sICQ8dHlwZT4pICBXSEVSRSBcImNsYXNzTmFtZVwiPSQ8Y2xhc3NOYW1lPicsXG4gICAgICAgICAgeyBwYXRoLCB0eXBlLCBjbGFzc05hbWUgfVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMuX25vdGlmeVNjaGVtYUNoYW5nZSgpO1xuICB9XG5cbiAgYXN5bmMgdXBkYXRlRmllbGRPcHRpb25zKGNsYXNzTmFtZTogc3RyaW5nLCBmaWVsZE5hbWU6IHN0cmluZywgdHlwZTogYW55KSB7XG4gICAgYXdhaXQgdGhpcy5fY2xpZW50LnR4KCd1cGRhdGUtc2NoZW1hLWZpZWxkLW9wdGlvbnMnLCBhc3luYyB0ID0+IHtcbiAgICAgIGNvbnN0IHBhdGggPSBge2ZpZWxkcywke2ZpZWxkTmFtZX19YDtcbiAgICAgIGF3YWl0IHQubm9uZShcbiAgICAgICAgJ1VQREFURSBcIl9TQ0hFTUFcIiBTRVQgXCJzY2hlbWFcIj1qc29uYl9zZXQoXCJzY2hlbWFcIiwgJDxwYXRoPiwgJDx0eXBlPikgIFdIRVJFIFwiY2xhc3NOYW1lXCI9JDxjbGFzc05hbWU+JyxcbiAgICAgICAgeyBwYXRoLCB0eXBlLCBjbGFzc05hbWUgfVxuICAgICAgKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIERyb3BzIGEgY29sbGVjdGlvbi4gUmVzb2x2ZXMgd2l0aCB0cnVlIGlmIGl0IHdhcyBhIFBhcnNlIFNjaGVtYSAoZWcuIF9Vc2VyLCBDdXN0b20sIGV0Yy4pXG4gIC8vIGFuZCByZXNvbHZlcyB3aXRoIGZhbHNlIGlmIGl0IHdhc24ndCAoZWcuIGEgam9pbiB0YWJsZSkuIFJlamVjdHMgaWYgZGVsZXRpb24gd2FzIGltcG9zc2libGUuXG4gIGFzeW5jIGRlbGV0ZUNsYXNzKGNsYXNzTmFtZTogc3RyaW5nKSB7XG4gICAgY29uc3Qgb3BlcmF0aW9ucyA9IFtcbiAgICAgIHsgcXVlcnk6IGBEUk9QIFRBQkxFIElGIEVYSVNUUyAkMTpuYW1lYCwgdmFsdWVzOiBbY2xhc3NOYW1lXSB9LFxuICAgICAge1xuICAgICAgICBxdWVyeTogYERFTEVURSBGUk9NIFwiX1NDSEVNQVwiIFdIRVJFIFwiY2xhc3NOYW1lXCIgPSAkMWAsXG4gICAgICAgIHZhbHVlczogW2NsYXNzTmFtZV0sXG4gICAgICB9LFxuICAgIF07XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLl9jbGllbnRcbiAgICAgIC50eCh0ID0+IHQubm9uZSh0aGlzLl9wZ3AuaGVscGVycy5jb25jYXQob3BlcmF0aW9ucykpKVxuICAgICAgLnRoZW4oKCkgPT4gY2xhc3NOYW1lLmluZGV4T2YoJ19Kb2luOicpICE9IDApOyAvLyByZXNvbHZlcyB3aXRoIGZhbHNlIHdoZW4gX0pvaW4gdGFibGVcblxuICAgIHRoaXMuX25vdGlmeVNjaGVtYUNoYW5nZSgpO1xuICAgIHJldHVybiByZXNwb25zZTtcbiAgfVxuXG4gIC8vIERlbGV0ZSBhbGwgZGF0YSBrbm93biB0byB0aGlzIGFkYXB0ZXIuIFVzZWQgZm9yIHRlc3RpbmcuXG4gIGFzeW5jIGRlbGV0ZUFsbENsYXNzZXMoKSB7XG4gICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gICAgY29uc3QgaGVscGVycyA9IHRoaXMuX3BncC5oZWxwZXJzO1xuICAgIGRlYnVnKCdkZWxldGVBbGxDbGFzc2VzJyk7XG5cbiAgICBhd2FpdCB0aGlzLl9jbGllbnRcbiAgICAgIC50YXNrKCdkZWxldGUtYWxsLWNsYXNzZXMnLCBhc3luYyB0ID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgdC5hbnkoJ1NFTEVDVCAqIEZST00gXCJfU0NIRU1BXCInKTtcbiAgICAgICAgICBjb25zdCBqb2lucyA9IHJlc3VsdHMucmVkdWNlKChsaXN0OiBBcnJheTxzdHJpbmc+LCBzY2hlbWE6IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxpc3QuY29uY2F0KGpvaW5UYWJsZXNGb3JTY2hlbWEoc2NoZW1hLnNjaGVtYSkpO1xuICAgICAgICAgIH0sIFtdKTtcbiAgICAgICAgICBjb25zdCBjbGFzc2VzID0gW1xuICAgICAgICAgICAgJ19TQ0hFTUEnLFxuICAgICAgICAgICAgJ19QdXNoU3RhdHVzJyxcbiAgICAgICAgICAgICdfSm9iU3RhdHVzJyxcbiAgICAgICAgICAgICdfSm9iU2NoZWR1bGUnLFxuICAgICAgICAgICAgJ19Ib29rcycsXG4gICAgICAgICAgICAnX0dsb2JhbENvbmZpZycsXG4gICAgICAgICAgICAnX0dyYXBoUUxDb25maWcnLFxuICAgICAgICAgICAgJ19BdWRpZW5jZScsXG4gICAgICAgICAgICAnX0lkZW1wb3RlbmN5JyxcbiAgICAgICAgICAgIC4uLnJlc3VsdHMubWFwKHJlc3VsdCA9PiByZXN1bHQuY2xhc3NOYW1lKSxcbiAgICAgICAgICAgIC4uLmpvaW5zLFxuICAgICAgICAgIF07XG4gICAgICAgICAgY29uc3QgcXVlcmllcyA9IGNsYXNzZXMubWFwKGNsYXNzTmFtZSA9PiAoe1xuICAgICAgICAgICAgcXVlcnk6ICdEUk9QIFRBQkxFIElGIEVYSVNUUyAkPGNsYXNzTmFtZTpuYW1lPicsXG4gICAgICAgICAgICB2YWx1ZXM6IHsgY2xhc3NOYW1lIH0sXG4gICAgICAgICAgfSkpO1xuICAgICAgICAgIGF3YWl0IHQudHgodHggPT4gdHgubm9uZShoZWxwZXJzLmNvbmNhdChxdWVyaWVzKSkpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGlmIChlcnJvci5jb2RlICE9PSBQb3N0Z3Jlc1JlbGF0aW9uRG9lc05vdEV4aXN0RXJyb3IpIHtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBObyBfU0NIRU1BIGNvbGxlY3Rpb24uIERvbid0IGRlbGV0ZSBhbnl0aGluZy5cbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgZGVidWcoYGRlbGV0ZUFsbENsYXNzZXMgZG9uZSBpbiAke25ldyBEYXRlKCkuZ2V0VGltZSgpIC0gbm93fWApO1xuICAgICAgfSk7XG4gIH1cblxuICAvLyBSZW1vdmUgdGhlIGNvbHVtbiBhbmQgYWxsIHRoZSBkYXRhLiBGb3IgUmVsYXRpb25zLCB0aGUgX0pvaW4gY29sbGVjdGlvbiBpcyBoYW5kbGVkXG4gIC8vIHNwZWNpYWxseSwgdGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBkZWxldGUgX0pvaW4gY29sdW1ucy4gSXQgc2hvdWxkLCBob3dldmVyLCBpbmRpY2F0ZVxuICAvLyB0aGF0IHRoZSByZWxhdGlvbiBmaWVsZHMgZG9lcyBub3QgZXhpc3QgYW55bW9yZS4gSW4gbW9uZ28sIHRoaXMgbWVhbnMgcmVtb3ZpbmcgaXQgZnJvbVxuICAvLyB0aGUgX1NDSEVNQSBjb2xsZWN0aW9uLiAgVGhlcmUgc2hvdWxkIGJlIG5vIGFjdHVhbCBkYXRhIGluIHRoZSBjb2xsZWN0aW9uIHVuZGVyIHRoZSBzYW1lIG5hbWVcbiAgLy8gYXMgdGhlIHJlbGF0aW9uIGNvbHVtbiwgc28gaXQncyBmaW5lIHRvIGF0dGVtcHQgdG8gZGVsZXRlIGl0LiBJZiB0aGUgZmllbGRzIGxpc3RlZCB0byBiZVxuICAvLyBkZWxldGVkIGRvIG5vdCBleGlzdCwgdGhpcyBmdW5jdGlvbiBzaG91bGQgcmV0dXJuIHN1Y2Nlc3NmdWxseSBhbnl3YXlzLiBDaGVja2luZyBmb3JcbiAgLy8gYXR0ZW1wdHMgdG8gZGVsZXRlIG5vbi1leGlzdGVudCBmaWVsZHMgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIFBhcnNlIFNlcnZlci5cblxuICAvLyBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBvYmxpZ2F0ZWQgdG8gZGVsZXRlIGZpZWxkcyBhdG9taWNhbGx5LiBJdCBpcyBnaXZlbiB0aGUgZmllbGRcbiAgLy8gbmFtZXMgaW4gYSBsaXN0IHNvIHRoYXQgZGF0YWJhc2VzIHRoYXQgYXJlIGNhcGFibGUgb2YgZGVsZXRpbmcgZmllbGRzIGF0b21pY2FsbHlcbiAgLy8gbWF5IGRvIHNvLlxuXG4gIC8vIFJldHVybnMgYSBQcm9taXNlLlxuICBhc3luYyBkZWxldGVGaWVsZHMoY2xhc3NOYW1lOiBzdHJpbmcsIHNjaGVtYTogU2NoZW1hVHlwZSwgZmllbGROYW1lczogc3RyaW5nW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBkZWJ1ZygnZGVsZXRlRmllbGRzJyk7XG4gICAgZmllbGROYW1lcyA9IGZpZWxkTmFtZXMucmVkdWNlKChsaXN0OiBBcnJheTxzdHJpbmc+LCBmaWVsZE5hbWU6IHN0cmluZykgPT4ge1xuICAgICAgY29uc3QgZmllbGQgPSBzY2hlbWEuZmllbGRzW2ZpZWxkTmFtZV07XG4gICAgICBpZiAoZmllbGQudHlwZSAhPT0gJ1JlbGF0aW9uJykge1xuICAgICAgICBsaXN0LnB1c2goZmllbGROYW1lKTtcbiAgICAgIH1cbiAgICAgIGRlbGV0ZSBzY2hlbWEuZmllbGRzW2ZpZWxkTmFtZV07XG4gICAgICByZXR1cm4gbGlzdDtcbiAgICB9LCBbXSk7XG5cbiAgICBjb25zdCB2YWx1ZXMgPSBbY2xhc3NOYW1lLCAuLi5maWVsZE5hbWVzXTtcbiAgICBjb25zdCBjb2x1bW5zID0gZmllbGROYW1lc1xuICAgICAgLm1hcCgobmFtZSwgaWR4KSA9PiB7XG4gICAgICAgIHJldHVybiBgJCR7aWR4ICsgMn06bmFtZWA7XG4gICAgICB9KVxuICAgICAgLmpvaW4oJywgRFJPUCBDT0xVTU4nKTtcblxuICAgIGF3YWl0IHRoaXMuX2NsaWVudC50eCgnZGVsZXRlLWZpZWxkcycsIGFzeW5jIHQgPT4ge1xuICAgICAgYXdhaXQgdC5ub25lKCdVUERBVEUgXCJfU0NIRU1BXCIgU0VUIFwic2NoZW1hXCIgPSAkPHNjaGVtYT4gV0hFUkUgXCJjbGFzc05hbWVcIiA9ICQ8Y2xhc3NOYW1lPicsIHtcbiAgICAgICAgc2NoZW1hLFxuICAgICAgICBjbGFzc05hbWUsXG4gICAgICB9KTtcbiAgICAgIGlmICh2YWx1ZXMubGVuZ3RoID4gMSkge1xuICAgICAgICBhd2FpdCB0Lm5vbmUoYEFMVEVSIFRBQkxFICQxOm5hbWUgRFJPUCBDT0xVTU4gSUYgRVhJU1RTICR7Y29sdW1uc31gLCB2YWx1ZXMpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMuX25vdGlmeVNjaGVtYUNoYW5nZSgpO1xuICB9XG5cbiAgLy8gUmV0dXJuIGEgcHJvbWlzZSBmb3IgYWxsIHNjaGVtYXMga25vd24gdG8gdGhpcyBhZGFwdGVyLCBpbiBQYXJzZSBmb3JtYXQuIEluIGNhc2UgdGhlXG4gIC8vIHNjaGVtYXMgY2Fubm90IGJlIHJldHJpZXZlZCwgcmV0dXJucyBhIHByb21pc2UgdGhhdCByZWplY3RzLiBSZXF1aXJlbWVudHMgZm9yIHRoZVxuICAvLyByZWplY3Rpb24gcmVhc29uIGFyZSBUQkQuXG4gIGFzeW5jIGdldEFsbENsYXNzZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudC50YXNrKCdnZXQtYWxsLWNsYXNzZXMnLCBhc3luYyB0ID0+IHtcbiAgICAgIHJldHVybiBhd2FpdCB0Lm1hcCgnU0VMRUNUICogRlJPTSBcIl9TQ0hFTUFcIicsIG51bGwsIHJvdyA9PlxuICAgICAgICB0b1BhcnNlU2NoZW1hKHsgY2xhc3NOYW1lOiByb3cuY2xhc3NOYW1lLCAuLi5yb3cuc2NoZW1hIH0pXG4gICAgICApO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gUmV0dXJuIGEgcHJvbWlzZSBmb3IgdGhlIHNjaGVtYSB3aXRoIHRoZSBnaXZlbiBuYW1lLCBpbiBQYXJzZSBmb3JtYXQuIElmXG4gIC8vIHRoaXMgYWRhcHRlciBkb2Vzbid0IGtub3cgYWJvdXQgdGhlIHNjaGVtYSwgcmV0dXJuIGEgcHJvbWlzZSB0aGF0IHJlamVjdHMgd2l0aFxuICAvLyB1bmRlZmluZWQgYXMgdGhlIHJlYXNvbi5cbiAgYXN5bmMgZ2V0Q2xhc3MoY2xhc3NOYW1lOiBzdHJpbmcpIHtcbiAgICBkZWJ1ZygnZ2V0Q2xhc3MnKTtcbiAgICByZXR1cm4gdGhpcy5fY2xpZW50XG4gICAgICAuYW55KCdTRUxFQ1QgKiBGUk9NIFwiX1NDSEVNQVwiIFdIRVJFIFwiY2xhc3NOYW1lXCIgPSAkPGNsYXNzTmFtZT4nLCB7XG4gICAgICAgIGNsYXNzTmFtZSxcbiAgICAgIH0pXG4gICAgICAudGhlbihyZXN1bHQgPT4ge1xuICAgICAgICBpZiAocmVzdWx0Lmxlbmd0aCAhPT0gMSkge1xuICAgICAgICAgIHRocm93IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0WzBdLnNjaGVtYTtcbiAgICAgIH0pXG4gICAgICAudGhlbih0b1BhcnNlU2NoZW1hKTtcbiAgfVxuXG4gIC8vIFRPRE86IHJlbW92ZSB0aGUgbW9uZ28gZm9ybWF0IGRlcGVuZGVuY3kgaW4gdGhlIHJldHVybiB2YWx1ZVxuICBhc3luYyBjcmVhdGVPYmplY3QoXG4gICAgY2xhc3NOYW1lOiBzdHJpbmcsXG4gICAgc2NoZW1hOiBTY2hlbWFUeXBlLFxuICAgIG9iamVjdDogYW55LFxuICAgIHRyYW5zYWN0aW9uYWxTZXNzaW9uOiA/YW55XG4gICkge1xuICAgIGRlYnVnKCdjcmVhdGVPYmplY3QnKTtcbiAgICBsZXQgY29sdW1uc0FycmF5ID0gW107XG4gICAgY29uc3QgdmFsdWVzQXJyYXkgPSBbXTtcbiAgICBzY2hlbWEgPSB0b1Bvc3RncmVzU2NoZW1hKHNjaGVtYSk7XG4gICAgY29uc3QgZ2VvUG9pbnRzID0ge307XG5cbiAgICBvYmplY3QgPSBoYW5kbGVEb3RGaWVsZHMob2JqZWN0KTtcblxuICAgIHZhbGlkYXRlS2V5cyhvYmplY3QpO1xuXG4gICAgT2JqZWN0LmtleXMob2JqZWN0KS5mb3JFYWNoKGZpZWxkTmFtZSA9PiB7XG4gICAgICBpZiAob2JqZWN0W2ZpZWxkTmFtZV0gPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdmFyIGF1dGhEYXRhTWF0Y2ggPSBmaWVsZE5hbWUubWF0Y2goL15fYXV0aF9kYXRhXyhbYS16QS1aMC05X10rKSQvKTtcbiAgICAgIGNvbnN0IGF1dGhEYXRhQWxyZWFkeUV4aXN0cyA9ICEhb2JqZWN0LmF1dGhEYXRhO1xuICAgICAgaWYgKGF1dGhEYXRhTWF0Y2gpIHtcbiAgICAgICAgdmFyIHByb3ZpZGVyID0gYXV0aERhdGFNYXRjaFsxXTtcbiAgICAgICAgb2JqZWN0WydhdXRoRGF0YSddID0gb2JqZWN0WydhdXRoRGF0YSddIHx8IHt9O1xuICAgICAgICBvYmplY3RbJ2F1dGhEYXRhJ11bcHJvdmlkZXJdID0gb2JqZWN0W2ZpZWxkTmFtZV07XG4gICAgICAgIGRlbGV0ZSBvYmplY3RbZmllbGROYW1lXTtcbiAgICAgICAgZmllbGROYW1lID0gJ2F1dGhEYXRhJztcbiAgICAgICAgLy8gQXZvaWQgYWRkaW5nIGF1dGhEYXRhIG11bHRpcGxlIHRpbWVzIHRvIHRoZSBxdWVyeVxuICAgICAgICBpZiAoYXV0aERhdGFBbHJlYWR5RXhpc3RzKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbHVtbnNBcnJheS5wdXNoKGZpZWxkTmFtZSk7XG4gICAgICBpZiAoIXNjaGVtYS5maWVsZHNbZmllbGROYW1lXSAmJiBjbGFzc05hbWUgPT09ICdfVXNlcicpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGZpZWxkTmFtZSA9PT0gJ19lbWFpbF92ZXJpZnlfdG9rZW4nIHx8XG4gICAgICAgICAgZmllbGROYW1lID09PSAnX2ZhaWxlZF9sb2dpbl9jb3VudCcgfHxcbiAgICAgICAgICBmaWVsZE5hbWUgPT09ICdfcGVyaXNoYWJsZV90b2tlbicgfHxcbiAgICAgICAgICBmaWVsZE5hbWUgPT09ICdfcGFzc3dvcmRfaGlzdG9yeSdcbiAgICAgICAgKSB7XG4gICAgICAgICAgdmFsdWVzQXJyYXkucHVzaChvYmplY3RbZmllbGROYW1lXSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZmllbGROYW1lID09PSAnX2VtYWlsX3ZlcmlmeV90b2tlbl9leHBpcmVzX2F0Jykge1xuICAgICAgICAgIGlmIChvYmplY3RbZmllbGROYW1lXSkge1xuICAgICAgICAgICAgdmFsdWVzQXJyYXkucHVzaChvYmplY3RbZmllbGROYW1lXS5pc28pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YWx1ZXNBcnJheS5wdXNoKG51bGwpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChcbiAgICAgICAgICBmaWVsZE5hbWUgPT09ICdfYWNjb3VudF9sb2Nrb3V0X2V4cGlyZXNfYXQnIHx8XG4gICAgICAgICAgZmllbGROYW1lID09PSAnX3BlcmlzaGFibGVfdG9rZW5fZXhwaXJlc19hdCcgfHxcbiAgICAgICAgICBmaWVsZE5hbWUgPT09ICdfcGFzc3dvcmRfY2hhbmdlZF9hdCdcbiAgICAgICAgKSB7XG4gICAgICAgICAgaWYgKG9iamVjdFtmaWVsZE5hbWVdKSB7XG4gICAgICAgICAgICB2YWx1ZXNBcnJheS5wdXNoKG9iamVjdFtmaWVsZE5hbWVdLmlzbyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhbHVlc0FycmF5LnB1c2gobnVsbCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHN3aXRjaCAoc2NoZW1hLmZpZWxkc1tmaWVsZE5hbWVdLnR5cGUpIHtcbiAgICAgICAgY2FzZSAnRGF0ZSc6XG4gICAgICAgICAgaWYgKG9iamVjdFtmaWVsZE5hbWVdKSB7XG4gICAgICAgICAgICB2YWx1ZXNBcnJheS5wdXNoKG9iamVjdFtmaWVsZE5hbWVdLmlzbyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhbHVlc0FycmF5LnB1c2gobnVsbCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdQb2ludGVyJzpcbiAgICAgICAgICB2YWx1ZXNBcnJheS5wdXNoKG9iamVjdFtmaWVsZE5hbWVdLm9iamVjdElkKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnQXJyYXknOlxuICAgICAgICAgIGlmIChbJ19ycGVybScsICdfd3Blcm0nXS5pbmRleE9mKGZpZWxkTmFtZSkgPj0gMCkge1xuICAgICAgICAgICAgdmFsdWVzQXJyYXkucHVzaChvYmplY3RbZmllbGROYW1lXSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhbHVlc0FycmF5LnB1c2goSlNPTi5zdHJpbmdpZnkob2JqZWN0W2ZpZWxkTmFtZV0pKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ09iamVjdCc6XG4gICAgICAgIGNhc2UgJ0J5dGVzJzpcbiAgICAgICAgY2FzZSAnU3RyaW5nJzpcbiAgICAgICAgY2FzZSAnTnVtYmVyJzpcbiAgICAgICAgY2FzZSAnQm9vbGVhbic6XG4gICAgICAgICAgdmFsdWVzQXJyYXkucHVzaChvYmplY3RbZmllbGROYW1lXSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ0ZpbGUnOlxuICAgICAgICAgIHZhbHVlc0FycmF5LnB1c2gob2JqZWN0W2ZpZWxkTmFtZV0ubmFtZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ1BvbHlnb24nOiB7XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBjb252ZXJ0UG9seWdvblRvU1FMKG9iamVjdFtmaWVsZE5hbWVdLmNvb3JkaW5hdGVzKTtcbiAgICAgICAgICB2YWx1ZXNBcnJheS5wdXNoKHZhbHVlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdHZW9Qb2ludCc6XG4gICAgICAgICAgLy8gcG9wIHRoZSBwb2ludCBhbmQgcHJvY2VzcyBsYXRlclxuICAgICAgICAgIGdlb1BvaW50c1tmaWVsZE5hbWVdID0gb2JqZWN0W2ZpZWxkTmFtZV07XG4gICAgICAgICAgY29sdW1uc0FycmF5LnBvcCgpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRocm93IGBUeXBlICR7c2NoZW1hLmZpZWxkc1tmaWVsZE5hbWVdLnR5cGV9IG5vdCBzdXBwb3J0ZWQgeWV0YDtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbHVtbnNBcnJheSA9IGNvbHVtbnNBcnJheS5jb25jYXQoT2JqZWN0LmtleXMoZ2VvUG9pbnRzKSk7XG4gICAgY29uc3QgaW5pdGlhbFZhbHVlcyA9IHZhbHVlc0FycmF5Lm1hcCgodmFsLCBpbmRleCkgPT4ge1xuICAgICAgbGV0IHRlcm1pbmF0aW9uID0gJyc7XG4gICAgICBjb25zdCBmaWVsZE5hbWUgPSBjb2x1bW5zQXJyYXlbaW5kZXhdO1xuICAgICAgaWYgKFsnX3JwZXJtJywgJ193cGVybSddLmluZGV4T2YoZmllbGROYW1lKSA+PSAwKSB7XG4gICAgICAgIHRlcm1pbmF0aW9uID0gJzo6dGV4dFtdJztcbiAgICAgIH0gZWxzZSBpZiAoc2NoZW1hLmZpZWxkc1tmaWVsZE5hbWVdICYmIHNjaGVtYS5maWVsZHNbZmllbGROYW1lXS50eXBlID09PSAnQXJyYXknKSB7XG4gICAgICAgIHRlcm1pbmF0aW9uID0gJzo6anNvbmInO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGAkJHtpbmRleCArIDIgKyBjb2x1bW5zQXJyYXkubGVuZ3RofSR7dGVybWluYXRpb259YDtcbiAgICB9KTtcbiAgICBjb25zdCBnZW9Qb2ludHNJbmplY3RzID0gT2JqZWN0LmtleXMoZ2VvUG9pbnRzKS5tYXAoa2V5ID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlID0gZ2VvUG9pbnRzW2tleV07XG4gICAgICB2YWx1ZXNBcnJheS5wdXNoKHZhbHVlLmxvbmdpdHVkZSwgdmFsdWUubGF0aXR1ZGUpO1xuICAgICAgY29uc3QgbCA9IHZhbHVlc0FycmF5Lmxlbmd0aCArIGNvbHVtbnNBcnJheS5sZW5ndGg7XG4gICAgICByZXR1cm4gYFBPSU5UKCQke2x9LCAkJHtsICsgMX0pYDtcbiAgICB9KTtcblxuICAgIGNvbnN0IGNvbHVtbnNQYXR0ZXJuID0gY29sdW1uc0FycmF5Lm1hcCgoY29sLCBpbmRleCkgPT4gYCQke2luZGV4ICsgMn06bmFtZWApLmpvaW4oKTtcbiAgICBjb25zdCB2YWx1ZXNQYXR0ZXJuID0gaW5pdGlhbFZhbHVlcy5jb25jYXQoZ2VvUG9pbnRzSW5qZWN0cykuam9pbigpO1xuXG4gICAgY29uc3QgcXMgPSBgSU5TRVJUIElOVE8gJDE6bmFtZSAoJHtjb2x1bW5zUGF0dGVybn0pIFZBTFVFUyAoJHt2YWx1ZXNQYXR0ZXJufSlgO1xuICAgIGNvbnN0IHZhbHVlcyA9IFtjbGFzc05hbWUsIC4uLmNvbHVtbnNBcnJheSwgLi4udmFsdWVzQXJyYXldO1xuICAgIGNvbnN0IHByb21pc2UgPSAodHJhbnNhY3Rpb25hbFNlc3Npb24gPyB0cmFuc2FjdGlvbmFsU2Vzc2lvbi50IDogdGhpcy5fY2xpZW50KVxuICAgICAgLm5vbmUocXMsIHZhbHVlcylcbiAgICAgIC50aGVuKCgpID0+ICh7IG9wczogW29iamVjdF0gfSkpXG4gICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICBpZiAoZXJyb3IuY29kZSA9PT0gUG9zdGdyZXNVbmlxdWVJbmRleFZpb2xhdGlvbkVycm9yKSB7XG4gICAgICAgICAgY29uc3QgZXJyID0gbmV3IFBhcnNlLkVycm9yKFxuICAgICAgICAgICAgUGFyc2UuRXJyb3IuRFVQTElDQVRFX1ZBTFVFLFxuICAgICAgICAgICAgJ0EgZHVwbGljYXRlIHZhbHVlIGZvciBhIGZpZWxkIHdpdGggdW5pcXVlIHZhbHVlcyB3YXMgcHJvdmlkZWQnXG4gICAgICAgICAgKTtcbiAgICAgICAgICBlcnIudW5kZXJseWluZ0Vycm9yID0gZXJyb3I7XG4gICAgICAgICAgaWYgKGVycm9yLmNvbnN0cmFpbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IG1hdGNoZXMgPSBlcnJvci5jb25zdHJhaW50Lm1hdGNoKC91bmlxdWVfKFthLXpBLVpdKykvKTtcbiAgICAgICAgICAgIGlmIChtYXRjaGVzICYmIEFycmF5LmlzQXJyYXkobWF0Y2hlcykpIHtcbiAgICAgICAgICAgICAgZXJyLnVzZXJJbmZvID0geyBkdXBsaWNhdGVkX2ZpZWxkOiBtYXRjaGVzWzFdIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGVycm9yID0gZXJyO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfSk7XG4gICAgaWYgKHRyYW5zYWN0aW9uYWxTZXNzaW9uKSB7XG4gICAgICB0cmFuc2FjdGlvbmFsU2Vzc2lvbi5iYXRjaC5wdXNoKHByb21pc2UpO1xuICAgIH1cbiAgICByZXR1cm4gcHJvbWlzZTtcbiAgfVxuXG4gIC8vIFJlbW92ZSBhbGwgb2JqZWN0cyB0aGF0IG1hdGNoIHRoZSBnaXZlbiBQYXJzZSBRdWVyeS5cbiAgLy8gSWYgbm8gb2JqZWN0cyBtYXRjaCwgcmVqZWN0IHdpdGggT0JKRUNUX05PVF9GT1VORC4gSWYgb2JqZWN0cyBhcmUgZm91bmQgYW5kIGRlbGV0ZWQsIHJlc29sdmUgd2l0aCB1bmRlZmluZWQuXG4gIC8vIElmIHRoZXJlIGlzIHNvbWUgb3RoZXIgZXJyb3IsIHJlamVjdCB3aXRoIElOVEVSTkFMX1NFUlZFUl9FUlJPUi5cbiAgYXN5bmMgZGVsZXRlT2JqZWN0c0J5UXVlcnkoXG4gICAgY2xhc3NOYW1lOiBzdHJpbmcsXG4gICAgc2NoZW1hOiBTY2hlbWFUeXBlLFxuICAgIHF1ZXJ5OiBRdWVyeVR5cGUsXG4gICAgdHJhbnNhY3Rpb25hbFNlc3Npb246ID9hbnlcbiAgKSB7XG4gICAgZGVidWcoJ2RlbGV0ZU9iamVjdHNCeVF1ZXJ5Jyk7XG4gICAgY29uc3QgdmFsdWVzID0gW2NsYXNzTmFtZV07XG4gICAgY29uc3QgaW5kZXggPSAyO1xuICAgIGNvbnN0IHdoZXJlID0gYnVpbGRXaGVyZUNsYXVzZSh7XG4gICAgICBzY2hlbWEsXG4gICAgICBpbmRleCxcbiAgICAgIHF1ZXJ5LFxuICAgICAgY2FzZUluc2Vuc2l0aXZlOiBmYWxzZSxcbiAgICB9KTtcbiAgICB2YWx1ZXMucHVzaCguLi53aGVyZS52YWx1ZXMpO1xuICAgIGlmIChPYmplY3Qua2V5cyhxdWVyeSkubGVuZ3RoID09PSAwKSB7XG4gICAgICB3aGVyZS5wYXR0ZXJuID0gJ1RSVUUnO1xuICAgIH1cbiAgICBjb25zdCBxcyA9IGBXSVRIIGRlbGV0ZWQgQVMgKERFTEVURSBGUk9NICQxOm5hbWUgV0hFUkUgJHt3aGVyZS5wYXR0ZXJufSBSRVRVUk5JTkcgKikgU0VMRUNUIGNvdW50KCopIEZST00gZGVsZXRlZGA7XG4gICAgY29uc3QgcHJvbWlzZSA9ICh0cmFuc2FjdGlvbmFsU2Vzc2lvbiA/IHRyYW5zYWN0aW9uYWxTZXNzaW9uLnQgOiB0aGlzLl9jbGllbnQpXG4gICAgICAub25lKHFzLCB2YWx1ZXMsIGEgPT4gK2EuY291bnQpXG4gICAgICAudGhlbihjb3VudCA9PiB7XG4gICAgICAgIGlmIChjb3VudCA9PT0gMCkge1xuICAgICAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5PQkpFQ1RfTk9UX0ZPVU5ELCAnT2JqZWN0IG5vdCBmb3VuZC4nKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gY291bnQ7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICBpZiAoZXJyb3IuY29kZSAhPT0gUG9zdGdyZXNSZWxhdGlvbkRvZXNOb3RFeGlzdEVycm9yKSB7XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgLy8gRUxTRTogRG9uJ3QgZGVsZXRlIGFueXRoaW5nIGlmIGRvZXNuJ3QgZXhpc3RcbiAgICAgIH0pO1xuICAgIGlmICh0cmFuc2FjdGlvbmFsU2Vzc2lvbikge1xuICAgICAgdHJhbnNhY3Rpb25hbFNlc3Npb24uYmF0Y2gucHVzaChwcm9taXNlKTtcbiAgICB9XG4gICAgcmV0dXJuIHByb21pc2U7XG4gIH1cbiAgLy8gUmV0dXJuIHZhbHVlIG5vdCBjdXJyZW50bHkgd2VsbCBzcGVjaWZpZWQuXG4gIGFzeW5jIGZpbmRPbmVBbmRVcGRhdGUoXG4gICAgY2xhc3NOYW1lOiBzdHJpbmcsXG4gICAgc2NoZW1hOiBTY2hlbWFUeXBlLFxuICAgIHF1ZXJ5OiBRdWVyeVR5cGUsXG4gICAgdXBkYXRlOiBhbnksXG4gICAgdHJhbnNhY3Rpb25hbFNlc3Npb246ID9hbnlcbiAgKTogUHJvbWlzZTxhbnk+IHtcbiAgICBkZWJ1ZygnZmluZE9uZUFuZFVwZGF0ZScpO1xuICAgIHJldHVybiB0aGlzLnVwZGF0ZU9iamVjdHNCeVF1ZXJ5KGNsYXNzTmFtZSwgc2NoZW1hLCBxdWVyeSwgdXBkYXRlLCB0cmFuc2FjdGlvbmFsU2Vzc2lvbikudGhlbihcbiAgICAgIHZhbCA9PiB2YWxbMF1cbiAgICApO1xuICB9XG5cbiAgLy8gQXBwbHkgdGhlIHVwZGF0ZSB0byBhbGwgb2JqZWN0cyB0aGF0IG1hdGNoIHRoZSBnaXZlbiBQYXJzZSBRdWVyeS5cbiAgYXN5bmMgdXBkYXRlT2JqZWN0c0J5UXVlcnkoXG4gICAgY2xhc3NOYW1lOiBzdHJpbmcsXG4gICAgc2NoZW1hOiBTY2hlbWFUeXBlLFxuICAgIHF1ZXJ5OiBRdWVyeVR5cGUsXG4gICAgdXBkYXRlOiBhbnksXG4gICAgdHJhbnNhY3Rpb25hbFNlc3Npb246ID9hbnlcbiAgKTogUHJvbWlzZTxbYW55XT4ge1xuICAgIGRlYnVnKCd1cGRhdGVPYmplY3RzQnlRdWVyeScpO1xuICAgIGNvbnN0IHVwZGF0ZVBhdHRlcm5zID0gW107XG4gICAgY29uc3QgdmFsdWVzID0gW2NsYXNzTmFtZV07XG4gICAgbGV0IGluZGV4ID0gMjtcbiAgICBzY2hlbWEgPSB0b1Bvc3RncmVzU2NoZW1hKHNjaGVtYSk7XG5cbiAgICBjb25zdCBvcmlnaW5hbFVwZGF0ZSA9IHsgLi4udXBkYXRlIH07XG5cbiAgICAvLyBTZXQgZmxhZyBmb3IgZG90IG5vdGF0aW9uIGZpZWxkc1xuICAgIGNvbnN0IGRvdE5vdGF0aW9uT3B0aW9ucyA9IHt9O1xuICAgIE9iamVjdC5rZXlzKHVwZGF0ZSkuZm9yRWFjaChmaWVsZE5hbWUgPT4ge1xuICAgICAgaWYgKGZpZWxkTmFtZS5pbmRleE9mKCcuJykgPiAtMSkge1xuICAgICAgICBjb25zdCBjb21wb25lbnRzID0gZmllbGROYW1lLnNwbGl0KCcuJyk7XG4gICAgICAgIGNvbnN0IGZpcnN0ID0gY29tcG9uZW50cy5zaGlmdCgpO1xuICAgICAgICBkb3ROb3RhdGlvbk9wdGlvbnNbZmlyc3RdID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRvdE5vdGF0aW9uT3B0aW9uc1tmaWVsZE5hbWVdID0gZmFsc2U7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdXBkYXRlID0gaGFuZGxlRG90RmllbGRzKHVwZGF0ZSk7XG4gICAgLy8gUmVzb2x2ZSBhdXRoRGF0YSBmaXJzdCxcbiAgICAvLyBTbyB3ZSBkb24ndCBlbmQgdXAgd2l0aCBtdWx0aXBsZSBrZXkgdXBkYXRlc1xuICAgIGZvciAoY29uc3QgZmllbGROYW1lIGluIHVwZGF0ZSkge1xuICAgICAgY29uc3QgYXV0aERhdGFNYXRjaCA9IGZpZWxkTmFtZS5tYXRjaCgvXl9hdXRoX2RhdGFfKFthLXpBLVowLTlfXSspJC8pO1xuICAgICAgaWYgKGF1dGhEYXRhTWF0Y2gpIHtcbiAgICAgICAgdmFyIHByb3ZpZGVyID0gYXV0aERhdGFNYXRjaFsxXTtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB1cGRhdGVbZmllbGROYW1lXTtcbiAgICAgICAgZGVsZXRlIHVwZGF0ZVtmaWVsZE5hbWVdO1xuICAgICAgICB1cGRhdGVbJ2F1dGhEYXRhJ10gPSB1cGRhdGVbJ2F1dGhEYXRhJ10gfHwge307XG4gICAgICAgIHVwZGF0ZVsnYXV0aERhdGEnXVtwcm92aWRlcl0gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGZpZWxkTmFtZSBpbiB1cGRhdGUpIHtcbiAgICAgIGNvbnN0IGZpZWxkVmFsdWUgPSB1cGRhdGVbZmllbGROYW1lXTtcbiAgICAgIC8vIERyb3AgYW55IHVuZGVmaW5lZCB2YWx1ZXMuXG4gICAgICBpZiAodHlwZW9mIGZpZWxkVmFsdWUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGRlbGV0ZSB1cGRhdGVbZmllbGROYW1lXTtcbiAgICAgIH0gZWxzZSBpZiAoZmllbGRWYWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICB1cGRhdGVQYXR0ZXJucy5wdXNoKGAkJHtpbmRleH06bmFtZSA9IE5VTExgKTtcbiAgICAgICAgdmFsdWVzLnB1c2goZmllbGROYW1lKTtcbiAgICAgICAgaW5kZXggKz0gMTtcbiAgICAgIH0gZWxzZSBpZiAoZmllbGROYW1lID09ICdhdXRoRGF0YScpIHtcbiAgICAgICAgLy8gVGhpcyByZWN1cnNpdmVseSBzZXRzIHRoZSBqc29uX29iamVjdFxuICAgICAgICAvLyBPbmx5IDEgbGV2ZWwgZGVlcFxuICAgICAgICBjb25zdCBnZW5lcmF0ZSA9IChqc29uYjogc3RyaW5nLCBrZXk6IHN0cmluZywgdmFsdWU6IGFueSkgPT4ge1xuICAgICAgICAgIHJldHVybiBganNvbl9vYmplY3Rfc2V0X2tleShDT0FMRVNDRSgke2pzb25ifSwgJ3t9Jzo6anNvbmIpLCAke2tleX0sICR7dmFsdWV9KTo6anNvbmJgO1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBsYXN0S2V5ID0gYCQke2luZGV4fTpuYW1lYDtcbiAgICAgICAgY29uc3QgZmllbGROYW1lSW5kZXggPSBpbmRleDtcbiAgICAgICAgaW5kZXggKz0gMTtcbiAgICAgICAgdmFsdWVzLnB1c2goZmllbGROYW1lKTtcbiAgICAgICAgY29uc3QgdXBkYXRlID0gT2JqZWN0LmtleXMoZmllbGRWYWx1ZSkucmVkdWNlKChsYXN0S2V5OiBzdHJpbmcsIGtleTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgY29uc3Qgc3RyID0gZ2VuZXJhdGUobGFzdEtleSwgYCQke2luZGV4fTo6dGV4dGAsIGAkJHtpbmRleCArIDF9Ojpqc29uYmApO1xuICAgICAgICAgIGluZGV4ICs9IDI7XG4gICAgICAgICAgbGV0IHZhbHVlID0gZmllbGRWYWx1ZVtrZXldO1xuICAgICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgaWYgKHZhbHVlLl9fb3AgPT09ICdEZWxldGUnKSB7XG4gICAgICAgICAgICAgIHZhbHVlID0gbnVsbDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHZhbHVlID0gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICB2YWx1ZXMucHVzaChrZXksIHZhbHVlKTtcbiAgICAgICAgICByZXR1cm4gc3RyO1xuICAgICAgICB9LCBsYXN0S2V5KTtcbiAgICAgICAgdXBkYXRlUGF0dGVybnMucHVzaChgJCR7ZmllbGROYW1lSW5kZXh9Om5hbWUgPSAke3VwZGF0ZX1gKTtcbiAgICAgIH0gZWxzZSBpZiAoZmllbGRWYWx1ZS5fX29wID09PSAnSW5jcmVtZW50Jykge1xuICAgICAgICB1cGRhdGVQYXR0ZXJucy5wdXNoKGAkJHtpbmRleH06bmFtZSA9IENPQUxFU0NFKCQke2luZGV4fTpuYW1lLCAwKSArICQke2luZGV4ICsgMX1gKTtcbiAgICAgICAgdmFsdWVzLnB1c2goZmllbGROYW1lLCBmaWVsZFZhbHVlLmFtb3VudCk7XG4gICAgICAgIGluZGV4ICs9IDI7XG4gICAgICB9IGVsc2UgaWYgKGZpZWxkVmFsdWUuX19vcCA9PT0gJ0FkZCcpIHtcbiAgICAgICAgdXBkYXRlUGF0dGVybnMucHVzaChcbiAgICAgICAgICBgJCR7aW5kZXh9Om5hbWUgPSBhcnJheV9hZGQoQ09BTEVTQ0UoJCR7aW5kZXh9Om5hbWUsICdbXSc6Ompzb25iKSwgJCR7aW5kZXggKyAxfTo6anNvbmIpYFxuICAgICAgICApO1xuICAgICAgICB2YWx1ZXMucHVzaChmaWVsZE5hbWUsIEpTT04uc3RyaW5naWZ5KGZpZWxkVmFsdWUub2JqZWN0cykpO1xuICAgICAgICBpbmRleCArPSAyO1xuICAgICAgfSBlbHNlIGlmIChmaWVsZFZhbHVlLl9fb3AgPT09ICdEZWxldGUnKSB7XG4gICAgICAgIHVwZGF0ZVBhdHRlcm5zLnB1c2goYCQke2luZGV4fTpuYW1lID0gJCR7aW5kZXggKyAxfWApO1xuICAgICAgICB2YWx1ZXMucHVzaChmaWVsZE5hbWUsIG51bGwpO1xuICAgICAgICBpbmRleCArPSAyO1xuICAgICAgfSBlbHNlIGlmIChmaWVsZFZhbHVlLl9fb3AgPT09ICdSZW1vdmUnKSB7XG4gICAgICAgIHVwZGF0ZVBhdHRlcm5zLnB1c2goXG4gICAgICAgICAgYCQke2luZGV4fTpuYW1lID0gYXJyYXlfcmVtb3ZlKENPQUxFU0NFKCQke2luZGV4fTpuYW1lLCAnW10nOjpqc29uYiksICQke1xuICAgICAgICAgICAgaW5kZXggKyAxXG4gICAgICAgICAgfTo6anNvbmIpYFxuICAgICAgICApO1xuICAgICAgICB2YWx1ZXMucHVzaChmaWVsZE5hbWUsIEpTT04uc3RyaW5naWZ5KGZpZWxkVmFsdWUub2JqZWN0cykpO1xuICAgICAgICBpbmRleCArPSAyO1xuICAgICAgfSBlbHNlIGlmIChmaWVsZFZhbHVlLl9fb3AgPT09ICdBZGRVbmlxdWUnKSB7XG4gICAgICAgIHVwZGF0ZVBhdHRlcm5zLnB1c2goXG4gICAgICAgICAgYCQke2luZGV4fTpuYW1lID0gYXJyYXlfYWRkX3VuaXF1ZShDT0FMRVNDRSgkJHtpbmRleH06bmFtZSwgJ1tdJzo6anNvbmIpLCAkJHtcbiAgICAgICAgICAgIGluZGV4ICsgMVxuICAgICAgICAgIH06Ompzb25iKWBcbiAgICAgICAgKTtcbiAgICAgICAgdmFsdWVzLnB1c2goZmllbGROYW1lLCBKU09OLnN0cmluZ2lmeShmaWVsZFZhbHVlLm9iamVjdHMpKTtcbiAgICAgICAgaW5kZXggKz0gMjtcbiAgICAgIH0gZWxzZSBpZiAoZmllbGROYW1lID09PSAndXBkYXRlZEF0Jykge1xuICAgICAgICAvL1RPRE86IHN0b3Agc3BlY2lhbCBjYXNpbmcgdGhpcy4gSXQgc2hvdWxkIGNoZWNrIGZvciBfX3R5cGUgPT09ICdEYXRlJyBhbmQgdXNlIC5pc29cbiAgICAgICAgdXBkYXRlUGF0dGVybnMucHVzaChgJCR7aW5kZXh9Om5hbWUgPSAkJHtpbmRleCArIDF9YCk7XG4gICAgICAgIHZhbHVlcy5wdXNoKGZpZWxkTmFtZSwgZmllbGRWYWx1ZSk7XG4gICAgICAgIGluZGV4ICs9IDI7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBmaWVsZFZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICB1cGRhdGVQYXR0ZXJucy5wdXNoKGAkJHtpbmRleH06bmFtZSA9ICQke2luZGV4ICsgMX1gKTtcbiAgICAgICAgdmFsdWVzLnB1c2goZmllbGROYW1lLCBmaWVsZFZhbHVlKTtcbiAgICAgICAgaW5kZXggKz0gMjtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGZpZWxkVmFsdWUgPT09ICdib29sZWFuJykge1xuICAgICAgICB1cGRhdGVQYXR0ZXJucy5wdXNoKGAkJHtpbmRleH06bmFtZSA9ICQke2luZGV4ICsgMX1gKTtcbiAgICAgICAgdmFsdWVzLnB1c2goZmllbGROYW1lLCBmaWVsZFZhbHVlKTtcbiAgICAgICAgaW5kZXggKz0gMjtcbiAgICAgIH0gZWxzZSBpZiAoZmllbGRWYWx1ZS5fX3R5cGUgPT09ICdQb2ludGVyJykge1xuICAgICAgICB1cGRhdGVQYXR0ZXJucy5wdXNoKGAkJHtpbmRleH06bmFtZSA9ICQke2luZGV4ICsgMX1gKTtcbiAgICAgICAgdmFsdWVzLnB1c2goZmllbGROYW1lLCBmaWVsZFZhbHVlLm9iamVjdElkKTtcbiAgICAgICAgaW5kZXggKz0gMjtcbiAgICAgIH0gZWxzZSBpZiAoZmllbGRWYWx1ZS5fX3R5cGUgPT09ICdEYXRlJykge1xuICAgICAgICB1cGRhdGVQYXR0ZXJucy5wdXNoKGAkJHtpbmRleH06bmFtZSA9ICQke2luZGV4ICsgMX1gKTtcbiAgICAgICAgdmFsdWVzLnB1c2goZmllbGROYW1lLCB0b1Bvc3RncmVzVmFsdWUoZmllbGRWYWx1ZSkpO1xuICAgICAgICBpbmRleCArPSAyO1xuICAgICAgfSBlbHNlIGlmIChmaWVsZFZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICB1cGRhdGVQYXR0ZXJucy5wdXNoKGAkJHtpbmRleH06bmFtZSA9ICQke2luZGV4ICsgMX1gKTtcbiAgICAgICAgdmFsdWVzLnB1c2goZmllbGROYW1lLCBmaWVsZFZhbHVlKTtcbiAgICAgICAgaW5kZXggKz0gMjtcbiAgICAgIH0gZWxzZSBpZiAoZmllbGRWYWx1ZS5fX3R5cGUgPT09ICdGaWxlJykge1xuICAgICAgICB1cGRhdGVQYXR0ZXJucy5wdXNoKGAkJHtpbmRleH06bmFtZSA9ICQke2luZGV4ICsgMX1gKTtcbiAgICAgICAgdmFsdWVzLnB1c2goZmllbGROYW1lLCB0b1Bvc3RncmVzVmFsdWUoZmllbGRWYWx1ZSkpO1xuICAgICAgICBpbmRleCArPSAyO1xuICAgICAgfSBlbHNlIGlmIChmaWVsZFZhbHVlLl9fdHlwZSA9PT0gJ0dlb1BvaW50Jykge1xuICAgICAgICB1cGRhdGVQYXR0ZXJucy5wdXNoKGAkJHtpbmRleH06bmFtZSA9IFBPSU5UKCQke2luZGV4ICsgMX0sICQke2luZGV4ICsgMn0pYCk7XG4gICAgICAgIHZhbHVlcy5wdXNoKGZpZWxkTmFtZSwgZmllbGRWYWx1ZS5sb25naXR1ZGUsIGZpZWxkVmFsdWUubGF0aXR1ZGUpO1xuICAgICAgICBpbmRleCArPSAzO1xuICAgICAgfSBlbHNlIGlmIChmaWVsZFZhbHVlLl9fdHlwZSA9PT0gJ1BvbHlnb24nKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gY29udmVydFBvbHlnb25Ub1NRTChmaWVsZFZhbHVlLmNvb3JkaW5hdGVzKTtcbiAgICAgICAgdXBkYXRlUGF0dGVybnMucHVzaChgJCR7aW5kZXh9Om5hbWUgPSAkJHtpbmRleCArIDF9Ojpwb2x5Z29uYCk7XG4gICAgICAgIHZhbHVlcy5wdXNoKGZpZWxkTmFtZSwgdmFsdWUpO1xuICAgICAgICBpbmRleCArPSAyO1xuICAgICAgfSBlbHNlIGlmIChmaWVsZFZhbHVlLl9fdHlwZSA9PT0gJ1JlbGF0aW9uJykge1xuICAgICAgICAvLyBub29wXG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBmaWVsZFZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgICB1cGRhdGVQYXR0ZXJucy5wdXNoKGAkJHtpbmRleH06bmFtZSA9ICQke2luZGV4ICsgMX1gKTtcbiAgICAgICAgdmFsdWVzLnB1c2goZmllbGROYW1lLCBmaWVsZFZhbHVlKTtcbiAgICAgICAgaW5kZXggKz0gMjtcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIHR5cGVvZiBmaWVsZFZhbHVlID09PSAnb2JqZWN0JyAmJlxuICAgICAgICBzY2hlbWEuZmllbGRzW2ZpZWxkTmFtZV0gJiZcbiAgICAgICAgc2NoZW1hLmZpZWxkc1tmaWVsZE5hbWVdLnR5cGUgPT09ICdPYmplY3QnXG4gICAgICApIHtcbiAgICAgICAgLy8gR2F0aGVyIGtleXMgdG8gaW5jcmVtZW50XG4gICAgICAgIGNvbnN0IGtleXNUb0luY3JlbWVudCA9IE9iamVjdC5rZXlzKG9yaWdpbmFsVXBkYXRlKVxuICAgICAgICAgIC5maWx0ZXIoayA9PiB7XG4gICAgICAgICAgICAvLyBjaG9vc2UgdG9wIGxldmVsIGZpZWxkcyB0aGF0IGhhdmUgYSBkZWxldGUgb3BlcmF0aW9uIHNldFxuICAgICAgICAgICAgLy8gTm90ZSB0aGF0IE9iamVjdC5rZXlzIGlzIGl0ZXJhdGluZyBvdmVyIHRoZSAqKm9yaWdpbmFsKiogdXBkYXRlIG9iamVjdFxuICAgICAgICAgICAgLy8gYW5kIHRoYXQgc29tZSBvZiB0aGUga2V5cyBvZiB0aGUgb3JpZ2luYWwgdXBkYXRlIGNvdWxkIGJlIG51bGwgb3IgdW5kZWZpbmVkOlxuICAgICAgICAgICAgLy8gKFNlZSB0aGUgYWJvdmUgY2hlY2sgYGlmIChmaWVsZFZhbHVlID09PSBudWxsIHx8IHR5cGVvZiBmaWVsZFZhbHVlID09IFwidW5kZWZpbmVkXCIpYClcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gb3JpZ2luYWxVcGRhdGVba107XG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICB2YWx1ZSAmJlxuICAgICAgICAgICAgICB2YWx1ZS5fX29wID09PSAnSW5jcmVtZW50JyAmJlxuICAgICAgICAgICAgICBrLnNwbGl0KCcuJykubGVuZ3RoID09PSAyICYmXG4gICAgICAgICAgICAgIGsuc3BsaXQoJy4nKVswXSA9PT0gZmllbGROYW1lXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLm1hcChrID0+IGsuc3BsaXQoJy4nKVsxXSk7XG5cbiAgICAgICAgbGV0IGluY3JlbWVudFBhdHRlcm5zID0gJyc7XG4gICAgICAgIGlmIChrZXlzVG9JbmNyZW1lbnQubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGluY3JlbWVudFBhdHRlcm5zID1cbiAgICAgICAgICAgICcgfHwgJyArXG4gICAgICAgICAgICBrZXlzVG9JbmNyZW1lbnRcbiAgICAgICAgICAgICAgLm1hcChjID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBhbW91bnQgPSBmaWVsZFZhbHVlW2NdLmFtb3VudDtcbiAgICAgICAgICAgICAgICByZXR1cm4gYENPTkNBVCgne1wiJHtjfVwiOicsIENPQUxFU0NFKCQke2luZGV4fTpuYW1lLT4+JyR7Y30nLCcwJyk6OmludCArICR7YW1vdW50fSwgJ30nKTo6anNvbmJgO1xuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAuam9pbignIHx8ICcpO1xuICAgICAgICAgIC8vIFN0cmlwIHRoZSBrZXlzXG4gICAgICAgICAga2V5c1RvSW5jcmVtZW50LmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICAgIGRlbGV0ZSBmaWVsZFZhbHVlW2tleV07XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBrZXlzVG9EZWxldGU6IEFycmF5PHN0cmluZz4gPSBPYmplY3Qua2V5cyhvcmlnaW5hbFVwZGF0ZSlcbiAgICAgICAgICAuZmlsdGVyKGsgPT4ge1xuICAgICAgICAgICAgLy8gY2hvb3NlIHRvcCBsZXZlbCBmaWVsZHMgdGhhdCBoYXZlIGEgZGVsZXRlIG9wZXJhdGlvbiBzZXQuXG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IG9yaWdpbmFsVXBkYXRlW2tdO1xuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgdmFsdWUgJiZcbiAgICAgICAgICAgICAgdmFsdWUuX19vcCA9PT0gJ0RlbGV0ZScgJiZcbiAgICAgICAgICAgICAgay5zcGxpdCgnLicpLmxlbmd0aCA9PT0gMiAmJlxuICAgICAgICAgICAgICBrLnNwbGl0KCcuJylbMF0gPT09IGZpZWxkTmFtZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5tYXAoayA9PiBrLnNwbGl0KCcuJylbMV0pO1xuXG4gICAgICAgIGNvbnN0IGRlbGV0ZVBhdHRlcm5zID0ga2V5c1RvRGVsZXRlLnJlZHVjZSgocDogc3RyaW5nLCBjOiBzdHJpbmcsIGk6IG51bWJlcikgPT4ge1xuICAgICAgICAgIHJldHVybiBwICsgYCAtICckJHtpbmRleCArIDEgKyBpfTp2YWx1ZSdgO1xuICAgICAgICB9LCAnJyk7XG4gICAgICAgIC8vIE92ZXJyaWRlIE9iamVjdFxuICAgICAgICBsZXQgdXBkYXRlT2JqZWN0ID0gXCIne30nOjpqc29uYlwiO1xuXG4gICAgICAgIGlmIChkb3ROb3RhdGlvbk9wdGlvbnNbZmllbGROYW1lXSkge1xuICAgICAgICAgIC8vIE1lcmdlIE9iamVjdFxuICAgICAgICAgIHVwZGF0ZU9iamVjdCA9IGBDT0FMRVNDRSgkJHtpbmRleH06bmFtZSwgJ3t9Jzo6anNvbmIpYDtcbiAgICAgICAgfVxuICAgICAgICB1cGRhdGVQYXR0ZXJucy5wdXNoKFxuICAgICAgICAgIGAkJHtpbmRleH06bmFtZSA9ICgke3VwZGF0ZU9iamVjdH0gJHtkZWxldGVQYXR0ZXJuc30gJHtpbmNyZW1lbnRQYXR0ZXJuc30gfHwgJCR7XG4gICAgICAgICAgICBpbmRleCArIDEgKyBrZXlzVG9EZWxldGUubGVuZ3RoXG4gICAgICAgICAgfTo6anNvbmIgKWBcbiAgICAgICAgKTtcbiAgICAgICAgdmFsdWVzLnB1c2goZmllbGROYW1lLCAuLi5rZXlzVG9EZWxldGUsIEpTT04uc3RyaW5naWZ5KGZpZWxkVmFsdWUpKTtcbiAgICAgICAgaW5kZXggKz0gMiArIGtleXNUb0RlbGV0ZS5sZW5ndGg7XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICBBcnJheS5pc0FycmF5KGZpZWxkVmFsdWUpICYmXG4gICAgICAgIHNjaGVtYS5maWVsZHNbZmllbGROYW1lXSAmJlxuICAgICAgICBzY2hlbWEuZmllbGRzW2ZpZWxkTmFtZV0udHlwZSA9PT0gJ0FycmF5J1xuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IGV4cGVjdGVkVHlwZSA9IHBhcnNlVHlwZVRvUG9zdGdyZXNUeXBlKHNjaGVtYS5maWVsZHNbZmllbGROYW1lXSk7XG4gICAgICAgIGlmIChleHBlY3RlZFR5cGUgPT09ICd0ZXh0W10nKSB7XG4gICAgICAgICAgdXBkYXRlUGF0dGVybnMucHVzaChgJCR7aW5kZXh9Om5hbWUgPSAkJHtpbmRleCArIDF9Ojp0ZXh0W11gKTtcbiAgICAgICAgICB2YWx1ZXMucHVzaChmaWVsZE5hbWUsIGZpZWxkVmFsdWUpO1xuICAgICAgICAgIGluZGV4ICs9IDI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdXBkYXRlUGF0dGVybnMucHVzaChgJCR7aW5kZXh9Om5hbWUgPSAkJHtpbmRleCArIDF9Ojpqc29uYmApO1xuICAgICAgICAgIHZhbHVlcy5wdXNoKGZpZWxkTmFtZSwgSlNPTi5zdHJpbmdpZnkoZmllbGRWYWx1ZSkpO1xuICAgICAgICAgIGluZGV4ICs9IDI7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlYnVnKCdOb3Qgc3VwcG9ydGVkIHVwZGF0ZScsIHsgZmllbGROYW1lLCBmaWVsZFZhbHVlIH0pO1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoXG4gICAgICAgICAgbmV3IFBhcnNlLkVycm9yKFxuICAgICAgICAgICAgUGFyc2UuRXJyb3IuT1BFUkFUSU9OX0ZPUkJJRERFTixcbiAgICAgICAgICAgIGBQb3N0Z3JlcyBkb2Vzbid0IHN1cHBvcnQgdXBkYXRlICR7SlNPTi5zdHJpbmdpZnkoZmllbGRWYWx1ZSl9IHlldGBcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgd2hlcmUgPSBidWlsZFdoZXJlQ2xhdXNlKHtcbiAgICAgIHNjaGVtYSxcbiAgICAgIGluZGV4LFxuICAgICAgcXVlcnksXG4gICAgICBjYXNlSW5zZW5zaXRpdmU6IGZhbHNlLFxuICAgIH0pO1xuICAgIHZhbHVlcy5wdXNoKC4uLndoZXJlLnZhbHVlcyk7XG5cbiAgICBjb25zdCB3aGVyZUNsYXVzZSA9IHdoZXJlLnBhdHRlcm4ubGVuZ3RoID4gMCA/IGBXSEVSRSAke3doZXJlLnBhdHRlcm59YCA6ICcnO1xuICAgIGNvbnN0IHFzID0gYFVQREFURSAkMTpuYW1lIFNFVCAke3VwZGF0ZVBhdHRlcm5zLmpvaW4oKX0gJHt3aGVyZUNsYXVzZX0gUkVUVVJOSU5HICpgO1xuICAgIGNvbnN0IHByb21pc2UgPSAodHJhbnNhY3Rpb25hbFNlc3Npb24gPyB0cmFuc2FjdGlvbmFsU2Vzc2lvbi50IDogdGhpcy5fY2xpZW50KS5hbnkocXMsIHZhbHVlcyk7XG4gICAgaWYgKHRyYW5zYWN0aW9uYWxTZXNzaW9uKSB7XG4gICAgICB0cmFuc2FjdGlvbmFsU2Vzc2lvbi5iYXRjaC5wdXNoKHByb21pc2UpO1xuICAgIH1cbiAgICByZXR1cm4gcHJvbWlzZTtcbiAgfVxuXG4gIC8vIEhvcGVmdWxseSwgd2UgY2FuIGdldCByaWQgb2YgdGhpcy4gSXQncyBvbmx5IHVzZWQgZm9yIGNvbmZpZyBhbmQgaG9va3MuXG4gIHVwc2VydE9uZU9iamVjdChcbiAgICBjbGFzc05hbWU6IHN0cmluZyxcbiAgICBzY2hlbWE6IFNjaGVtYVR5cGUsXG4gICAgcXVlcnk6IFF1ZXJ5VHlwZSxcbiAgICB1cGRhdGU6IGFueSxcbiAgICB0cmFuc2FjdGlvbmFsU2Vzc2lvbjogP2FueVxuICApIHtcbiAgICBkZWJ1ZygndXBzZXJ0T25lT2JqZWN0Jyk7XG4gICAgY29uc3QgY3JlYXRlVmFsdWUgPSBPYmplY3QuYXNzaWduKHt9LCBxdWVyeSwgdXBkYXRlKTtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGVPYmplY3QoY2xhc3NOYW1lLCBzY2hlbWEsIGNyZWF0ZVZhbHVlLCB0cmFuc2FjdGlvbmFsU2Vzc2lvbikuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgLy8gaWdub3JlIGR1cGxpY2F0ZSB2YWx1ZSBlcnJvcnMgYXMgaXQncyB1cHNlcnRcbiAgICAgIGlmIChlcnJvci5jb2RlICE9PSBQYXJzZS5FcnJvci5EVVBMSUNBVEVfVkFMVUUpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5maW5kT25lQW5kVXBkYXRlKGNsYXNzTmFtZSwgc2NoZW1hLCBxdWVyeSwgdXBkYXRlLCB0cmFuc2FjdGlvbmFsU2Vzc2lvbik7XG4gICAgfSk7XG4gIH1cblxuICBmaW5kKFxuICAgIGNsYXNzTmFtZTogc3RyaW5nLFxuICAgIHNjaGVtYTogU2NoZW1hVHlwZSxcbiAgICBxdWVyeTogUXVlcnlUeXBlLFxuICAgIHsgc2tpcCwgbGltaXQsIHNvcnQsIGtleXMsIGNhc2VJbnNlbnNpdGl2ZSwgZXhwbGFpbiB9OiBRdWVyeU9wdGlvbnNcbiAgKSB7XG4gICAgZGVidWcoJ2ZpbmQnKTtcbiAgICBjb25zdCBoYXNMaW1pdCA9IGxpbWl0ICE9PSB1bmRlZmluZWQ7XG4gICAgY29uc3QgaGFzU2tpcCA9IHNraXAgIT09IHVuZGVmaW5lZDtcbiAgICBsZXQgdmFsdWVzID0gW2NsYXNzTmFtZV07XG4gICAgY29uc3Qgd2hlcmUgPSBidWlsZFdoZXJlQ2xhdXNlKHtcbiAgICAgIHNjaGVtYSxcbiAgICAgIHF1ZXJ5LFxuICAgICAgaW5kZXg6IDIsXG4gICAgICBjYXNlSW5zZW5zaXRpdmUsXG4gICAgfSk7XG4gICAgdmFsdWVzLnB1c2goLi4ud2hlcmUudmFsdWVzKTtcbiAgICBjb25zdCB3aGVyZVBhdHRlcm4gPSB3aGVyZS5wYXR0ZXJuLmxlbmd0aCA+IDAgPyBgV0hFUkUgJHt3aGVyZS5wYXR0ZXJufWAgOiAnJztcbiAgICBjb25zdCBsaW1pdFBhdHRlcm4gPSBoYXNMaW1pdCA/IGBMSU1JVCAkJHt2YWx1ZXMubGVuZ3RoICsgMX1gIDogJyc7XG4gICAgaWYgKGhhc0xpbWl0KSB7XG4gICAgICB2YWx1ZXMucHVzaChsaW1pdCk7XG4gICAgfVxuICAgIGNvbnN0IHNraXBQYXR0ZXJuID0gaGFzU2tpcCA/IGBPRkZTRVQgJCR7dmFsdWVzLmxlbmd0aCArIDF9YCA6ICcnO1xuICAgIGlmIChoYXNTa2lwKSB7XG4gICAgICB2YWx1ZXMucHVzaChza2lwKTtcbiAgICB9XG5cbiAgICBsZXQgc29ydFBhdHRlcm4gPSAnJztcbiAgICBpZiAoc29ydCkge1xuICAgICAgY29uc3Qgc29ydENvcHk6IGFueSA9IHNvcnQ7XG4gICAgICBjb25zdCBzb3J0aW5nID0gT2JqZWN0LmtleXMoc29ydClcbiAgICAgICAgLm1hcChrZXkgPT4ge1xuICAgICAgICAgIGNvbnN0IHRyYW5zZm9ybUtleSA9IHRyYW5zZm9ybURvdEZpZWxkVG9Db21wb25lbnRzKGtleSkuam9pbignLT4nKTtcbiAgICAgICAgICAvLyBVc2luZyAkaWR4IHBhdHRlcm4gZ2l2ZXM6ICBub24taW50ZWdlciBjb25zdGFudCBpbiBPUkRFUiBCWVxuICAgICAgICAgIGlmIChzb3J0Q29weVtrZXldID09PSAxKSB7XG4gICAgICAgICAgICByZXR1cm4gYCR7dHJhbnNmb3JtS2V5fSBBU0NgO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gYCR7dHJhbnNmb3JtS2V5fSBERVNDYDtcbiAgICAgICAgfSlcbiAgICAgICAgLmpvaW4oKTtcbiAgICAgIHNvcnRQYXR0ZXJuID0gc29ydCAhPT0gdW5kZWZpbmVkICYmIE9iamVjdC5rZXlzKHNvcnQpLmxlbmd0aCA+IDAgPyBgT1JERVIgQlkgJHtzb3J0aW5nfWAgOiAnJztcbiAgICB9XG4gICAgaWYgKHdoZXJlLnNvcnRzICYmIE9iamVjdC5rZXlzKCh3aGVyZS5zb3J0czogYW55KSkubGVuZ3RoID4gMCkge1xuICAgICAgc29ydFBhdHRlcm4gPSBgT1JERVIgQlkgJHt3aGVyZS5zb3J0cy5qb2luKCl9YDtcbiAgICB9XG5cbiAgICBsZXQgY29sdW1ucyA9ICcqJztcbiAgICBpZiAoa2V5cykge1xuICAgICAgLy8gRXhjbHVkZSBlbXB0eSBrZXlzXG4gICAgICAvLyBSZXBsYWNlIEFDTCBieSBpdCdzIGtleXNcbiAgICAgIGtleXMgPSBrZXlzLnJlZHVjZSgobWVtbywga2V5KSA9PiB7XG4gICAgICAgIGlmIChrZXkgPT09ICdBQ0wnKSB7XG4gICAgICAgICAgbWVtby5wdXNoKCdfcnBlcm0nKTtcbiAgICAgICAgICBtZW1vLnB1c2goJ193cGVybScpO1xuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgIGtleS5sZW5ndGggPiAwICYmXG4gICAgICAgICAgLy8gUmVtb3ZlIHNlbGVjdGVkIGZpZWxkIG5vdCByZWZlcmVuY2VkIGluIHRoZSBzY2hlbWFcbiAgICAgICAgICAvLyBSZWxhdGlvbiBpcyBub3QgYSBjb2x1bW4gaW4gcG9zdGdyZXNcbiAgICAgICAgICAvLyAkc2NvcmUgaXMgYSBQYXJzZSBzcGVjaWFsIGZpZWxkIGFuZCBpcyBhbHNvIG5vdCBhIGNvbHVtblxuICAgICAgICAgICgoc2NoZW1hLmZpZWxkc1trZXldICYmIHNjaGVtYS5maWVsZHNba2V5XS50eXBlICE9PSAnUmVsYXRpb24nKSB8fCBrZXkgPT09ICckc2NvcmUnKVxuICAgICAgICApIHtcbiAgICAgICAgICBtZW1vLnB1c2goa2V5KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVtbztcbiAgICAgIH0sIFtdKTtcbiAgICAgIGNvbHVtbnMgPSBrZXlzXG4gICAgICAgIC5tYXAoKGtleSwgaW5kZXgpID0+IHtcbiAgICAgICAgICBpZiAoa2V5ID09PSAnJHNjb3JlJykge1xuICAgICAgICAgICAgcmV0dXJuIGB0c19yYW5rX2NkKHRvX3RzdmVjdG9yKCQkezJ9LCAkJHszfTpuYW1lKSwgdG9fdHNxdWVyeSgkJHs0fSwgJCR7NX0pLCAzMikgYXMgc2NvcmVgO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gYCQke2luZGV4ICsgdmFsdWVzLmxlbmd0aCArIDF9Om5hbWVgO1xuICAgICAgICB9KVxuICAgICAgICAuam9pbigpO1xuICAgICAgdmFsdWVzID0gdmFsdWVzLmNvbmNhdChrZXlzKTtcbiAgICB9XG5cbiAgICBjb25zdCBvcmlnaW5hbFF1ZXJ5ID0gYFNFTEVDVCAke2NvbHVtbnN9IEZST00gJDE6bmFtZSAke3doZXJlUGF0dGVybn0gJHtzb3J0UGF0dGVybn0gJHtsaW1pdFBhdHRlcm59ICR7c2tpcFBhdHRlcm59YDtcbiAgICBjb25zdCBxcyA9IGV4cGxhaW4gPyB0aGlzLmNyZWF0ZUV4cGxhaW5hYmxlUXVlcnkob3JpZ2luYWxRdWVyeSkgOiBvcmlnaW5hbFF1ZXJ5O1xuICAgIHJldHVybiB0aGlzLl9jbGllbnRcbiAgICAgIC5hbnkocXMsIHZhbHVlcylcbiAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgIC8vIFF1ZXJ5IG9uIG5vbiBleGlzdGluZyB0YWJsZSwgZG9uJ3QgY3Jhc2hcbiAgICAgICAgaWYgKGVycm9yLmNvZGUgIT09IFBvc3RncmVzUmVsYXRpb25Eb2VzTm90RXhpc3RFcnJvcikge1xuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH0pXG4gICAgICAudGhlbihyZXN1bHRzID0+IHtcbiAgICAgICAgaWYgKGV4cGxhaW4pIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0cztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0cy5tYXAob2JqZWN0ID0+IHRoaXMucG9zdGdyZXNPYmplY3RUb1BhcnNlT2JqZWN0KGNsYXNzTmFtZSwgb2JqZWN0LCBzY2hlbWEpKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgLy8gQ29udmVydHMgZnJvbSBhIHBvc3RncmVzLWZvcm1hdCBvYmplY3QgdG8gYSBSRVNULWZvcm1hdCBvYmplY3QuXG4gIC8vIERvZXMgbm90IHN0cmlwIG91dCBhbnl0aGluZyBiYXNlZCBvbiBhIGxhY2sgb2YgYXV0aGVudGljYXRpb24uXG4gIHBvc3RncmVzT2JqZWN0VG9QYXJzZU9iamVjdChjbGFzc05hbWU6IHN0cmluZywgb2JqZWN0OiBhbnksIHNjaGVtYTogYW55KSB7XG4gICAgT2JqZWN0LmtleXMoc2NoZW1hLmZpZWxkcykuZm9yRWFjaChmaWVsZE5hbWUgPT4ge1xuICAgICAgaWYgKHNjaGVtYS5maWVsZHNbZmllbGROYW1lXS50eXBlID09PSAnUG9pbnRlcicgJiYgb2JqZWN0W2ZpZWxkTmFtZV0pIHtcbiAgICAgICAgb2JqZWN0W2ZpZWxkTmFtZV0gPSB7XG4gICAgICAgICAgb2JqZWN0SWQ6IG9iamVjdFtmaWVsZE5hbWVdLFxuICAgICAgICAgIF9fdHlwZTogJ1BvaW50ZXInLFxuICAgICAgICAgIGNsYXNzTmFtZTogc2NoZW1hLmZpZWxkc1tmaWVsZE5hbWVdLnRhcmdldENsYXNzLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgaWYgKHNjaGVtYS5maWVsZHNbZmllbGROYW1lXS50eXBlID09PSAnUmVsYXRpb24nKSB7XG4gICAgICAgIG9iamVjdFtmaWVsZE5hbWVdID0ge1xuICAgICAgICAgIF9fdHlwZTogJ1JlbGF0aW9uJyxcbiAgICAgICAgICBjbGFzc05hbWU6IHNjaGVtYS5maWVsZHNbZmllbGROYW1lXS50YXJnZXRDbGFzcyxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGlmIChvYmplY3RbZmllbGROYW1lXSAmJiBzY2hlbWEuZmllbGRzW2ZpZWxkTmFtZV0udHlwZSA9PT0gJ0dlb1BvaW50Jykge1xuICAgICAgICBvYmplY3RbZmllbGROYW1lXSA9IHtcbiAgICAgICAgICBfX3R5cGU6ICdHZW9Qb2ludCcsXG4gICAgICAgICAgbGF0aXR1ZGU6IG9iamVjdFtmaWVsZE5hbWVdLnksXG4gICAgICAgICAgbG9uZ2l0dWRlOiBvYmplY3RbZmllbGROYW1lXS54LFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgaWYgKG9iamVjdFtmaWVsZE5hbWVdICYmIHNjaGVtYS5maWVsZHNbZmllbGROYW1lXS50eXBlID09PSAnUG9seWdvbicpIHtcbiAgICAgICAgbGV0IGNvb3JkcyA9IG9iamVjdFtmaWVsZE5hbWVdO1xuICAgICAgICBjb29yZHMgPSBjb29yZHMuc3Vic3RyKDIsIGNvb3Jkcy5sZW5ndGggLSA0KS5zcGxpdCgnKSwoJyk7XG4gICAgICAgIGNvb3JkcyA9IGNvb3Jkcy5tYXAocG9pbnQgPT4ge1xuICAgICAgICAgIHJldHVybiBbcGFyc2VGbG9hdChwb2ludC5zcGxpdCgnLCcpWzFdKSwgcGFyc2VGbG9hdChwb2ludC5zcGxpdCgnLCcpWzBdKV07XG4gICAgICAgIH0pO1xuICAgICAgICBvYmplY3RbZmllbGROYW1lXSA9IHtcbiAgICAgICAgICBfX3R5cGU6ICdQb2x5Z29uJyxcbiAgICAgICAgICBjb29yZGluYXRlczogY29vcmRzLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgaWYgKG9iamVjdFtmaWVsZE5hbWVdICYmIHNjaGVtYS5maWVsZHNbZmllbGROYW1lXS50eXBlID09PSAnRmlsZScpIHtcbiAgICAgICAgb2JqZWN0W2ZpZWxkTmFtZV0gPSB7XG4gICAgICAgICAgX190eXBlOiAnRmlsZScsXG4gICAgICAgICAgbmFtZTogb2JqZWN0W2ZpZWxkTmFtZV0sXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfSk7XG4gICAgLy9UT0RPOiByZW1vdmUgdGhpcyByZWxpYW5jZSBvbiB0aGUgbW9uZ28gZm9ybWF0LiBEQiBhZGFwdGVyIHNob3VsZG4ndCBrbm93IHRoZXJlIGlzIGEgZGlmZmVyZW5jZSBiZXR3ZWVuIGNyZWF0ZWQgYXQgYW5kIGFueSBvdGhlciBkYXRlIGZpZWxkLlxuICAgIGlmIChvYmplY3QuY3JlYXRlZEF0KSB7XG4gICAgICBvYmplY3QuY3JlYXRlZEF0ID0gb2JqZWN0LmNyZWF0ZWRBdC50b0lTT1N0cmluZygpO1xuICAgIH1cbiAgICBpZiAob2JqZWN0LnVwZGF0ZWRBdCkge1xuICAgICAgb2JqZWN0LnVwZGF0ZWRBdCA9IG9iamVjdC51cGRhdGVkQXQudG9JU09TdHJpbmcoKTtcbiAgICB9XG4gICAgaWYgKG9iamVjdC5leHBpcmVzQXQpIHtcbiAgICAgIG9iamVjdC5leHBpcmVzQXQgPSB7XG4gICAgICAgIF9fdHlwZTogJ0RhdGUnLFxuICAgICAgICBpc286IG9iamVjdC5leHBpcmVzQXQudG9JU09TdHJpbmcoKSxcbiAgICAgIH07XG4gICAgfVxuICAgIGlmIChvYmplY3QuX2VtYWlsX3ZlcmlmeV90b2tlbl9leHBpcmVzX2F0KSB7XG4gICAgICBvYmplY3QuX2VtYWlsX3ZlcmlmeV90b2tlbl9leHBpcmVzX2F0ID0ge1xuICAgICAgICBfX3R5cGU6ICdEYXRlJyxcbiAgICAgICAgaXNvOiBvYmplY3QuX2VtYWlsX3ZlcmlmeV90b2tlbl9leHBpcmVzX2F0LnRvSVNPU3RyaW5nKCksXG4gICAgICB9O1xuICAgIH1cbiAgICBpZiAob2JqZWN0Ll9hY2NvdW50X2xvY2tvdXRfZXhwaXJlc19hdCkge1xuICAgICAgb2JqZWN0Ll9hY2NvdW50X2xvY2tvdXRfZXhwaXJlc19hdCA9IHtcbiAgICAgICAgX190eXBlOiAnRGF0ZScsXG4gICAgICAgIGlzbzogb2JqZWN0Ll9hY2NvdW50X2xvY2tvdXRfZXhwaXJlc19hdC50b0lTT1N0cmluZygpLFxuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKG9iamVjdC5fcGVyaXNoYWJsZV90b2tlbl9leHBpcmVzX2F0KSB7XG4gICAgICBvYmplY3QuX3BlcmlzaGFibGVfdG9rZW5fZXhwaXJlc19hdCA9IHtcbiAgICAgICAgX190eXBlOiAnRGF0ZScsXG4gICAgICAgIGlzbzogb2JqZWN0Ll9wZXJpc2hhYmxlX3Rva2VuX2V4cGlyZXNfYXQudG9JU09TdHJpbmcoKSxcbiAgICAgIH07XG4gICAgfVxuICAgIGlmIChvYmplY3QuX3Bhc3N3b3JkX2NoYW5nZWRfYXQpIHtcbiAgICAgIG9iamVjdC5fcGFzc3dvcmRfY2hhbmdlZF9hdCA9IHtcbiAgICAgICAgX190eXBlOiAnRGF0ZScsXG4gICAgICAgIGlzbzogb2JqZWN0Ll9wYXNzd29yZF9jaGFuZ2VkX2F0LnRvSVNPU3RyaW5nKCksXG4gICAgICB9O1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgZmllbGROYW1lIGluIG9iamVjdCkge1xuICAgICAgaWYgKG9iamVjdFtmaWVsZE5hbWVdID09PSBudWxsKSB7XG4gICAgICAgIGRlbGV0ZSBvYmplY3RbZmllbGROYW1lXTtcbiAgICAgIH1cbiAgICAgIGlmIChvYmplY3RbZmllbGROYW1lXSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgICAgb2JqZWN0W2ZpZWxkTmFtZV0gPSB7XG4gICAgICAgICAgX190eXBlOiAnRGF0ZScsXG4gICAgICAgICAgaXNvOiBvYmplY3RbZmllbGROYW1lXS50b0lTT1N0cmluZygpLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBvYmplY3Q7XG4gIH1cblxuICAvLyBDcmVhdGUgYSB1bmlxdWUgaW5kZXguIFVuaXF1ZSBpbmRleGVzIG9uIG51bGxhYmxlIGZpZWxkcyBhcmUgbm90IGFsbG93ZWQuIFNpbmNlIHdlIGRvbid0XG4gIC8vIGN1cnJlbnRseSBrbm93IHdoaWNoIGZpZWxkcyBhcmUgbnVsbGFibGUgYW5kIHdoaWNoIGFyZW4ndCwgd2UgaWdub3JlIHRoYXQgY3JpdGVyaWEuXG4gIC8vIEFzIHN1Y2gsIHdlIHNob3VsZG4ndCBleHBvc2UgdGhpcyBmdW5jdGlvbiB0byB1c2VycyBvZiBwYXJzZSB1bnRpbCB3ZSBoYXZlIGFuIG91dC1vZi1iYW5kXG4gIC8vIFdheSBvZiBkZXRlcm1pbmluZyBpZiBhIGZpZWxkIGlzIG51bGxhYmxlLiBVbmRlZmluZWQgZG9lc24ndCBjb3VudCBhZ2FpbnN0IHVuaXF1ZW5lc3MsXG4gIC8vIHdoaWNoIGlzIHdoeSB3ZSB1c2Ugc3BhcnNlIGluZGV4ZXMuXG4gIGFzeW5jIGVuc3VyZVVuaXF1ZW5lc3MoY2xhc3NOYW1lOiBzdHJpbmcsIHNjaGVtYTogU2NoZW1hVHlwZSwgZmllbGROYW1lczogc3RyaW5nW10pIHtcbiAgICBjb25zdCBjb25zdHJhaW50TmFtZSA9IGAke2NsYXNzTmFtZX1fdW5pcXVlXyR7ZmllbGROYW1lcy5zb3J0KCkuam9pbignXycpfWA7XG4gICAgY29uc3QgY29uc3RyYWludFBhdHRlcm5zID0gZmllbGROYW1lcy5tYXAoKGZpZWxkTmFtZSwgaW5kZXgpID0+IGAkJHtpbmRleCArIDN9Om5hbWVgKTtcbiAgICBjb25zdCBxcyA9IGBDUkVBVEUgVU5JUVVFIElOREVYIElGIE5PVCBFWElTVFMgJDI6bmFtZSBPTiAkMTpuYW1lKCR7Y29uc3RyYWludFBhdHRlcm5zLmpvaW4oKX0pYDtcbiAgICByZXR1cm4gdGhpcy5fY2xpZW50Lm5vbmUocXMsIFtjbGFzc05hbWUsIGNvbnN0cmFpbnROYW1lLCAuLi5maWVsZE5hbWVzXSkuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgaWYgKGVycm9yLmNvZGUgPT09IFBvc3RncmVzRHVwbGljYXRlUmVsYXRpb25FcnJvciAmJiBlcnJvci5tZXNzYWdlLmluY2x1ZGVzKGNvbnN0cmFpbnROYW1lKSkge1xuICAgICAgICAvLyBJbmRleCBhbHJlYWR5IGV4aXN0cy4gSWdub3JlIGVycm9yLlxuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgZXJyb3IuY29kZSA9PT0gUG9zdGdyZXNVbmlxdWVJbmRleFZpb2xhdGlvbkVycm9yICYmXG4gICAgICAgIGVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoY29uc3RyYWludE5hbWUpXG4gICAgICApIHtcbiAgICAgICAgLy8gQ2FzdCB0aGUgZXJyb3IgaW50byB0aGUgcHJvcGVyIHBhcnNlIGVycm9yXG4gICAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihcbiAgICAgICAgICBQYXJzZS5FcnJvci5EVVBMSUNBVEVfVkFMVUUsXG4gICAgICAgICAgJ0EgZHVwbGljYXRlIHZhbHVlIGZvciBhIGZpZWxkIHdpdGggdW5pcXVlIHZhbHVlcyB3YXMgcHJvdmlkZWQnXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8vIEV4ZWN1dGVzIGEgY291bnQuXG4gIGFzeW5jIGNvdW50KFxuICAgIGNsYXNzTmFtZTogc3RyaW5nLFxuICAgIHNjaGVtYTogU2NoZW1hVHlwZSxcbiAgICBxdWVyeTogUXVlcnlUeXBlLFxuICAgIHJlYWRQcmVmZXJlbmNlPzogc3RyaW5nLFxuICAgIGVzdGltYXRlPzogYm9vbGVhbiA9IHRydWVcbiAgKSB7XG4gICAgZGVidWcoJ2NvdW50Jyk7XG4gICAgY29uc3QgdmFsdWVzID0gW2NsYXNzTmFtZV07XG4gICAgY29uc3Qgd2hlcmUgPSBidWlsZFdoZXJlQ2xhdXNlKHtcbiAgICAgIHNjaGVtYSxcbiAgICAgIHF1ZXJ5LFxuICAgICAgaW5kZXg6IDIsXG4gICAgICBjYXNlSW5zZW5zaXRpdmU6IGZhbHNlLFxuICAgIH0pO1xuICAgIHZhbHVlcy5wdXNoKC4uLndoZXJlLnZhbHVlcyk7XG5cbiAgICBjb25zdCB3aGVyZVBhdHRlcm4gPSB3aGVyZS5wYXR0ZXJuLmxlbmd0aCA+IDAgPyBgV0hFUkUgJHt3aGVyZS5wYXR0ZXJufWAgOiAnJztcbiAgICBsZXQgcXMgPSAnJztcblxuICAgIGlmICh3aGVyZS5wYXR0ZXJuLmxlbmd0aCA+IDAgfHwgIWVzdGltYXRlKSB7XG4gICAgICBxcyA9IGBTRUxFQ1QgY291bnQoKikgRlJPTSAkMTpuYW1lICR7d2hlcmVQYXR0ZXJufWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHFzID0gJ1NFTEVDVCByZWx0dXBsZXMgQVMgYXBwcm94aW1hdGVfcm93X2NvdW50IEZST00gcGdfY2xhc3MgV0hFUkUgcmVsbmFtZSA9ICQxJztcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fY2xpZW50XG4gICAgICAub25lKHFzLCB2YWx1ZXMsIGEgPT4ge1xuICAgICAgICBpZiAoYS5hcHByb3hpbWF0ZV9yb3dfY291bnQgPT0gbnVsbCB8fCBhLmFwcHJveGltYXRlX3Jvd19jb3VudCA9PSAtMSkge1xuICAgICAgICAgIHJldHVybiAhaXNOYU4oK2EuY291bnQpID8gK2EuY291bnQgOiAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiArYS5hcHByb3hpbWF0ZV9yb3dfY291bnQ7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICBpZiAoZXJyb3IuY29kZSAhPT0gUG9zdGdyZXNSZWxhdGlvbkRvZXNOb3RFeGlzdEVycm9yKSB7XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGRpc3RpbmN0KGNsYXNzTmFtZTogc3RyaW5nLCBzY2hlbWE6IFNjaGVtYVR5cGUsIHF1ZXJ5OiBRdWVyeVR5cGUsIGZpZWxkTmFtZTogc3RyaW5nKSB7XG4gICAgZGVidWcoJ2Rpc3RpbmN0Jyk7XG4gICAgbGV0IGZpZWxkID0gZmllbGROYW1lO1xuICAgIGxldCBjb2x1bW4gPSBmaWVsZE5hbWU7XG4gICAgY29uc3QgaXNOZXN0ZWQgPSBmaWVsZE5hbWUuaW5kZXhPZignLicpID49IDA7XG4gICAgaWYgKGlzTmVzdGVkKSB7XG4gICAgICBmaWVsZCA9IHRyYW5zZm9ybURvdEZpZWxkVG9Db21wb25lbnRzKGZpZWxkTmFtZSkuam9pbignLT4nKTtcbiAgICAgIGNvbHVtbiA9IGZpZWxkTmFtZS5zcGxpdCgnLicpWzBdO1xuICAgIH1cbiAgICBjb25zdCBpc0FycmF5RmllbGQgPVxuICAgICAgc2NoZW1hLmZpZWxkcyAmJiBzY2hlbWEuZmllbGRzW2ZpZWxkTmFtZV0gJiYgc2NoZW1hLmZpZWxkc1tmaWVsZE5hbWVdLnR5cGUgPT09ICdBcnJheSc7XG4gICAgY29uc3QgaXNQb2ludGVyRmllbGQgPVxuICAgICAgc2NoZW1hLmZpZWxkcyAmJiBzY2hlbWEuZmllbGRzW2ZpZWxkTmFtZV0gJiYgc2NoZW1hLmZpZWxkc1tmaWVsZE5hbWVdLnR5cGUgPT09ICdQb2ludGVyJztcbiAgICBjb25zdCB2YWx1ZXMgPSBbZmllbGQsIGNvbHVtbiwgY2xhc3NOYW1lXTtcbiAgICBjb25zdCB3aGVyZSA9IGJ1aWxkV2hlcmVDbGF1c2Uoe1xuICAgICAgc2NoZW1hLFxuICAgICAgcXVlcnksXG4gICAgICBpbmRleDogNCxcbiAgICAgIGNhc2VJbnNlbnNpdGl2ZTogZmFsc2UsXG4gICAgfSk7XG4gICAgdmFsdWVzLnB1c2goLi4ud2hlcmUudmFsdWVzKTtcblxuICAgIGNvbnN0IHdoZXJlUGF0dGVybiA9IHdoZXJlLnBhdHRlcm4ubGVuZ3RoID4gMCA/IGBXSEVSRSAke3doZXJlLnBhdHRlcm59YCA6ICcnO1xuICAgIGNvbnN0IHRyYW5zZm9ybWVyID0gaXNBcnJheUZpZWxkID8gJ2pzb25iX2FycmF5X2VsZW1lbnRzJyA6ICdPTic7XG4gICAgbGV0IHFzID0gYFNFTEVDVCBESVNUSU5DVCAke3RyYW5zZm9ybWVyfSgkMTpuYW1lKSAkMjpuYW1lIEZST00gJDM6bmFtZSAke3doZXJlUGF0dGVybn1gO1xuICAgIGlmIChpc05lc3RlZCkge1xuICAgICAgcXMgPSBgU0VMRUNUIERJU1RJTkNUICR7dHJhbnNmb3JtZXJ9KCQxOnJhdykgJDI6cmF3IEZST00gJDM6bmFtZSAke3doZXJlUGF0dGVybn1gO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fY2xpZW50XG4gICAgICAuYW55KHFzLCB2YWx1ZXMpXG4gICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICBpZiAoZXJyb3IuY29kZSA9PT0gUG9zdGdyZXNNaXNzaW5nQ29sdW1uRXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9KVxuICAgICAgLnRoZW4ocmVzdWx0cyA9PiB7XG4gICAgICAgIGlmICghaXNOZXN0ZWQpIHtcbiAgICAgICAgICByZXN1bHRzID0gcmVzdWx0cy5maWx0ZXIob2JqZWN0ID0+IG9iamVjdFtmaWVsZF0gIT09IG51bGwpO1xuICAgICAgICAgIHJldHVybiByZXN1bHRzLm1hcChvYmplY3QgPT4ge1xuICAgICAgICAgICAgaWYgKCFpc1BvaW50ZXJGaWVsZCkge1xuICAgICAgICAgICAgICByZXR1cm4gb2JqZWN0W2ZpZWxkXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIF9fdHlwZTogJ1BvaW50ZXInLFxuICAgICAgICAgICAgICBjbGFzc05hbWU6IHNjaGVtYS5maWVsZHNbZmllbGROYW1lXS50YXJnZXRDbGFzcyxcbiAgICAgICAgICAgICAgb2JqZWN0SWQ6IG9iamVjdFtmaWVsZF0sXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNoaWxkID0gZmllbGROYW1lLnNwbGl0KCcuJylbMV07XG4gICAgICAgIHJldHVybiByZXN1bHRzLm1hcChvYmplY3QgPT4gb2JqZWN0W2NvbHVtbl1bY2hpbGRdKTtcbiAgICAgIH0pXG4gICAgICAudGhlbihyZXN1bHRzID0+XG4gICAgICAgIHJlc3VsdHMubWFwKG9iamVjdCA9PiB0aGlzLnBvc3RncmVzT2JqZWN0VG9QYXJzZU9iamVjdChjbGFzc05hbWUsIG9iamVjdCwgc2NoZW1hKSlcbiAgICAgICk7XG4gIH1cblxuICBhc3luYyBhZ2dyZWdhdGUoXG4gICAgY2xhc3NOYW1lOiBzdHJpbmcsXG4gICAgc2NoZW1hOiBhbnksXG4gICAgcGlwZWxpbmU6IGFueSxcbiAgICByZWFkUHJlZmVyZW5jZTogP3N0cmluZyxcbiAgICBoaW50OiA/bWl4ZWQsXG4gICAgZXhwbGFpbj86IGJvb2xlYW5cbiAgKSB7XG4gICAgZGVidWcoJ2FnZ3JlZ2F0ZScpO1xuICAgIGNvbnN0IHZhbHVlcyA9IFtjbGFzc05hbWVdO1xuICAgIGxldCBpbmRleDogbnVtYmVyID0gMjtcbiAgICBsZXQgY29sdW1uczogc3RyaW5nW10gPSBbXTtcbiAgICBsZXQgY291bnRGaWVsZCA9IG51bGw7XG4gICAgbGV0IGdyb3VwVmFsdWVzID0gbnVsbDtcbiAgICBsZXQgd2hlcmVQYXR0ZXJuID0gJyc7XG4gICAgbGV0IGxpbWl0UGF0dGVybiA9ICcnO1xuICAgIGxldCBza2lwUGF0dGVybiA9ICcnO1xuICAgIGxldCBzb3J0UGF0dGVybiA9ICcnO1xuICAgIGxldCBncm91cFBhdHRlcm4gPSAnJztcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBpcGVsaW5lLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICBjb25zdCBzdGFnZSA9IHBpcGVsaW5lW2ldO1xuICAgICAgaWYgKHN0YWdlLiRncm91cCkge1xuICAgICAgICBmb3IgKGNvbnN0IGZpZWxkIGluIHN0YWdlLiRncm91cCkge1xuICAgICAgICAgIGNvbnN0IHZhbHVlID0gc3RhZ2UuJGdyb3VwW2ZpZWxkXTtcbiAgICAgICAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChmaWVsZCA9PT0gJ19pZCcgJiYgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZSAhPT0gJycpIHtcbiAgICAgICAgICAgIGNvbHVtbnMucHVzaChgJCR7aW5kZXh9Om5hbWUgQVMgXCJvYmplY3RJZFwiYCk7XG4gICAgICAgICAgICBncm91cFBhdHRlcm4gPSBgR1JPVVAgQlkgJCR7aW5kZXh9Om5hbWVgO1xuICAgICAgICAgICAgdmFsdWVzLnB1c2godHJhbnNmb3JtQWdncmVnYXRlRmllbGQodmFsdWUpKTtcbiAgICAgICAgICAgIGluZGV4ICs9IDE7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGZpZWxkID09PSAnX2lkJyAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIE9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgIGdyb3VwVmFsdWVzID0gdmFsdWU7XG4gICAgICAgICAgICBjb25zdCBncm91cEJ5RmllbGRzID0gW107XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGFsaWFzIGluIHZhbHVlKSB7XG4gICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWVbYWxpYXNdID09PSAnc3RyaW5nJyAmJiB2YWx1ZVthbGlhc10pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzb3VyY2UgPSB0cmFuc2Zvcm1BZ2dyZWdhdGVGaWVsZCh2YWx1ZVthbGlhc10pO1xuICAgICAgICAgICAgICAgIGlmICghZ3JvdXBCeUZpZWxkcy5pbmNsdWRlcyhgXCIke3NvdXJjZX1cImApKSB7XG4gICAgICAgICAgICAgICAgICBncm91cEJ5RmllbGRzLnB1c2goYFwiJHtzb3VyY2V9XCJgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFsdWVzLnB1c2goc291cmNlLCBhbGlhcyk7XG4gICAgICAgICAgICAgICAgY29sdW1ucy5wdXNoKGAkJHtpbmRleH06bmFtZSBBUyAkJHtpbmRleCArIDF9Om5hbWVgKTtcbiAgICAgICAgICAgICAgICBpbmRleCArPSAyO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IG9wZXJhdGlvbiA9IE9iamVjdC5rZXlzKHZhbHVlW2FsaWFzXSlbMF07XG4gICAgICAgICAgICAgICAgY29uc3Qgc291cmNlID0gdHJhbnNmb3JtQWdncmVnYXRlRmllbGQodmFsdWVbYWxpYXNdW29wZXJhdGlvbl0pO1xuICAgICAgICAgICAgICAgIGlmIChtb25nb0FnZ3JlZ2F0ZVRvUG9zdGdyZXNbb3BlcmF0aW9uXSkge1xuICAgICAgICAgICAgICAgICAgaWYgKCFncm91cEJ5RmllbGRzLmluY2x1ZGVzKGBcIiR7c291cmNlfVwiYCkpIHtcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXBCeUZpZWxkcy5wdXNoKGBcIiR7c291cmNlfVwiYCk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBjb2x1bW5zLnB1c2goXG4gICAgICAgICAgICAgICAgICAgIGBFWFRSQUNUKCR7XG4gICAgICAgICAgICAgICAgICAgICAgbW9uZ29BZ2dyZWdhdGVUb1Bvc3RncmVzW29wZXJhdGlvbl1cbiAgICAgICAgICAgICAgICAgICAgfSBGUk9NICQke2luZGV4fTpuYW1lIEFUIFRJTUUgWk9ORSAnVVRDJyk6OmludGVnZXIgQVMgJCR7aW5kZXggKyAxfTpuYW1lYFxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgIHZhbHVlcy5wdXNoKHNvdXJjZSwgYWxpYXMpO1xuICAgICAgICAgICAgICAgICAgaW5kZXggKz0gMjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGdyb3VwUGF0dGVybiA9IGBHUk9VUCBCWSAkJHtpbmRleH06cmF3YDtcbiAgICAgICAgICAgIHZhbHVlcy5wdXNoKGdyb3VwQnlGaWVsZHMuam9pbigpKTtcbiAgICAgICAgICAgIGluZGV4ICs9IDE7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZS4kc3VtKSB7XG4gICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUuJHN1bSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBjb2x1bW5zLnB1c2goYFNVTSgkJHtpbmRleH06bmFtZSkgQVMgJCR7aW5kZXggKyAxfTpuYW1lYCk7XG4gICAgICAgICAgICAgICAgdmFsdWVzLnB1c2godHJhbnNmb3JtQWdncmVnYXRlRmllbGQodmFsdWUuJHN1bSksIGZpZWxkKTtcbiAgICAgICAgICAgICAgICBpbmRleCArPSAyO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvdW50RmllbGQgPSBmaWVsZDtcbiAgICAgICAgICAgICAgICBjb2x1bW5zLnB1c2goYENPVU5UKCopIEFTICQke2luZGV4fTpuYW1lYCk7XG4gICAgICAgICAgICAgICAgdmFsdWVzLnB1c2goZmllbGQpO1xuICAgICAgICAgICAgICAgIGluZGV4ICs9IDE7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh2YWx1ZS4kbWF4KSB7XG4gICAgICAgICAgICAgIGNvbHVtbnMucHVzaChgTUFYKCQke2luZGV4fTpuYW1lKSBBUyAkJHtpbmRleCArIDF9Om5hbWVgKTtcbiAgICAgICAgICAgICAgdmFsdWVzLnB1c2godHJhbnNmb3JtQWdncmVnYXRlRmllbGQodmFsdWUuJG1heCksIGZpZWxkKTtcbiAgICAgICAgICAgICAgaW5kZXggKz0gMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh2YWx1ZS4kbWluKSB7XG4gICAgICAgICAgICAgIGNvbHVtbnMucHVzaChgTUlOKCQke2luZGV4fTpuYW1lKSBBUyAkJHtpbmRleCArIDF9Om5hbWVgKTtcbiAgICAgICAgICAgICAgdmFsdWVzLnB1c2godHJhbnNmb3JtQWdncmVnYXRlRmllbGQodmFsdWUuJG1pbiksIGZpZWxkKTtcbiAgICAgICAgICAgICAgaW5kZXggKz0gMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh2YWx1ZS4kYXZnKSB7XG4gICAgICAgICAgICAgIGNvbHVtbnMucHVzaChgQVZHKCQke2luZGV4fTpuYW1lKSBBUyAkJHtpbmRleCArIDF9Om5hbWVgKTtcbiAgICAgICAgICAgICAgdmFsdWVzLnB1c2godHJhbnNmb3JtQWdncmVnYXRlRmllbGQodmFsdWUuJGF2ZyksIGZpZWxkKTtcbiAgICAgICAgICAgICAgaW5kZXggKz0gMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbHVtbnMucHVzaCgnKicpO1xuICAgICAgfVxuICAgICAgaWYgKHN0YWdlLiRwcm9qZWN0KSB7XG4gICAgICAgIGlmIChjb2x1bW5zLmluY2x1ZGVzKCcqJykpIHtcbiAgICAgICAgICBjb2x1bW5zID0gW107XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBmaWVsZCBpbiBzdGFnZS4kcHJvamVjdCkge1xuICAgICAgICAgIGNvbnN0IHZhbHVlID0gc3RhZ2UuJHByb2plY3RbZmllbGRdO1xuICAgICAgICAgIGlmICh2YWx1ZSA9PT0gMSB8fCB2YWx1ZSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgY29sdW1ucy5wdXNoKGAkJHtpbmRleH06bmFtZWApO1xuICAgICAgICAgICAgdmFsdWVzLnB1c2goZmllbGQpO1xuICAgICAgICAgICAgaW5kZXggKz0gMTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChzdGFnZS4kbWF0Y2gpIHtcbiAgICAgICAgY29uc3QgcGF0dGVybnMgPSBbXTtcbiAgICAgICAgY29uc3Qgb3JPckFuZCA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzdGFnZS4kbWF0Y2gsICckb3InKVxuICAgICAgICAgID8gJyBPUiAnXG4gICAgICAgICAgOiAnIEFORCAnO1xuXG4gICAgICAgIGlmIChzdGFnZS4kbWF0Y2guJG9yKSB7XG4gICAgICAgICAgY29uc3QgY29sbGFwc2UgPSB7fTtcbiAgICAgICAgICBzdGFnZS4kbWF0Y2guJG9yLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBlbGVtZW50KSB7XG4gICAgICAgICAgICAgIGNvbGxhcHNlW2tleV0gPSBlbGVtZW50W2tleV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgc3RhZ2UuJG1hdGNoID0gY29sbGFwc2U7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgZmllbGQgaW4gc3RhZ2UuJG1hdGNoKSB7XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBzdGFnZS4kbWF0Y2hbZmllbGRdO1xuICAgICAgICAgIGlmIChmaWVsZCA9PT0gJ19pZCcpIHtcbiAgICAgICAgICAgIGZpZWxkID0gJ29iamVjdElkJztcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgbWF0Y2hQYXR0ZXJucyA9IFtdO1xuICAgICAgICAgIE9iamVjdC5rZXlzKFBhcnNlVG9Qb3NncmVzQ29tcGFyYXRvcikuZm9yRWFjaChjbXAgPT4ge1xuICAgICAgICAgICAgaWYgKHZhbHVlW2NtcF0pIHtcbiAgICAgICAgICAgICAgY29uc3QgcGdDb21wYXJhdG9yID0gUGFyc2VUb1Bvc2dyZXNDb21wYXJhdG9yW2NtcF07XG4gICAgICAgICAgICAgIG1hdGNoUGF0dGVybnMucHVzaChgJCR7aW5kZXh9Om5hbWUgJHtwZ0NvbXBhcmF0b3J9ICQke2luZGV4ICsgMX1gKTtcbiAgICAgICAgICAgICAgdmFsdWVzLnB1c2goZmllbGQsIHRvUG9zdGdyZXNWYWx1ZSh2YWx1ZVtjbXBdKSk7XG4gICAgICAgICAgICAgIGluZGV4ICs9IDI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKG1hdGNoUGF0dGVybnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcGF0dGVybnMucHVzaChgKCR7bWF0Y2hQYXR0ZXJucy5qb2luKCcgQU5EICcpfSlgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHNjaGVtYS5maWVsZHNbZmllbGRdICYmIHNjaGVtYS5maWVsZHNbZmllbGRdLnR5cGUgJiYgbWF0Y2hQYXR0ZXJucy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHBhdHRlcm5zLnB1c2goYCQke2luZGV4fTpuYW1lID0gJCR7aW5kZXggKyAxfWApO1xuICAgICAgICAgICAgdmFsdWVzLnB1c2goZmllbGQsIHZhbHVlKTtcbiAgICAgICAgICAgIGluZGV4ICs9IDI7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHdoZXJlUGF0dGVybiA9IHBhdHRlcm5zLmxlbmd0aCA+IDAgPyBgV0hFUkUgJHtwYXR0ZXJucy5qb2luKGAgJHtvck9yQW5kfSBgKX1gIDogJyc7XG4gICAgICB9XG4gICAgICBpZiAoc3RhZ2UuJGxpbWl0KSB7XG4gICAgICAgIGxpbWl0UGF0dGVybiA9IGBMSU1JVCAkJHtpbmRleH1gO1xuICAgICAgICB2YWx1ZXMucHVzaChzdGFnZS4kbGltaXQpO1xuICAgICAgICBpbmRleCArPSAxO1xuICAgICAgfVxuICAgICAgaWYgKHN0YWdlLiRza2lwKSB7XG4gICAgICAgIHNraXBQYXR0ZXJuID0gYE9GRlNFVCAkJHtpbmRleH1gO1xuICAgICAgICB2YWx1ZXMucHVzaChzdGFnZS4kc2tpcCk7XG4gICAgICAgIGluZGV4ICs9IDE7XG4gICAgICB9XG4gICAgICBpZiAoc3RhZ2UuJHNvcnQpIHtcbiAgICAgICAgY29uc3Qgc29ydCA9IHN0YWdlLiRzb3J0O1xuICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoc29ydCk7XG4gICAgICAgIGNvbnN0IHNvcnRpbmcgPSBrZXlzXG4gICAgICAgICAgLm1hcChrZXkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdHJhbnNmb3JtZXIgPSBzb3J0W2tleV0gPT09IDEgPyAnQVNDJyA6ICdERVNDJztcbiAgICAgICAgICAgIGNvbnN0IG9yZGVyID0gYCQke2luZGV4fTpuYW1lICR7dHJhbnNmb3JtZXJ9YDtcbiAgICAgICAgICAgIGluZGV4ICs9IDE7XG4gICAgICAgICAgICByZXR1cm4gb3JkZXI7XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuam9pbigpO1xuICAgICAgICB2YWx1ZXMucHVzaCguLi5rZXlzKTtcbiAgICAgICAgc29ydFBhdHRlcm4gPSBzb3J0ICE9PSB1bmRlZmluZWQgJiYgc29ydGluZy5sZW5ndGggPiAwID8gYE9SREVSIEJZICR7c29ydGluZ31gIDogJyc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGdyb3VwUGF0dGVybikge1xuICAgICAgY29sdW1ucy5mb3JFYWNoKChlLCBpLCBhKSA9PiB7XG4gICAgICAgIGlmIChlICYmIGUudHJpbSgpID09PSAnKicpIHtcbiAgICAgICAgICBhW2ldID0gJyc7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IG9yaWdpbmFsUXVlcnkgPSBgU0VMRUNUICR7Y29sdW1uc1xuICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgICAgLmpvaW4oKX0gRlJPTSAkMTpuYW1lICR7d2hlcmVQYXR0ZXJufSAke3NraXBQYXR0ZXJufSAke2dyb3VwUGF0dGVybn0gJHtzb3J0UGF0dGVybn0gJHtsaW1pdFBhdHRlcm59YDtcbiAgICBjb25zdCBxcyA9IGV4cGxhaW4gPyB0aGlzLmNyZWF0ZUV4cGxhaW5hYmxlUXVlcnkob3JpZ2luYWxRdWVyeSkgOiBvcmlnaW5hbFF1ZXJ5O1xuICAgIHJldHVybiB0aGlzLl9jbGllbnQuYW55KHFzLCB2YWx1ZXMpLnRoZW4oYSA9PiB7XG4gICAgICBpZiAoZXhwbGFpbikge1xuICAgICAgICByZXR1cm4gYTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlc3VsdHMgPSBhLm1hcChvYmplY3QgPT4gdGhpcy5wb3N0Z3Jlc09iamVjdFRvUGFyc2VPYmplY3QoY2xhc3NOYW1lLCBvYmplY3QsIHNjaGVtYSkpO1xuICAgICAgcmVzdWx0cy5mb3JFYWNoKHJlc3VsdCA9PiB7XG4gICAgICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHJlc3VsdCwgJ29iamVjdElkJykpIHtcbiAgICAgICAgICByZXN1bHQub2JqZWN0SWQgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmIChncm91cFZhbHVlcykge1xuICAgICAgICAgIHJlc3VsdC5vYmplY3RJZCA9IHt9O1xuICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIGdyb3VwVmFsdWVzKSB7XG4gICAgICAgICAgICByZXN1bHQub2JqZWN0SWRba2V5XSA9IHJlc3VsdFtrZXldO1xuICAgICAgICAgICAgZGVsZXRlIHJlc3VsdFtrZXldO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoY291bnRGaWVsZCkge1xuICAgICAgICAgIHJlc3VsdFtjb3VudEZpZWxkXSA9IHBhcnNlSW50KHJlc3VsdFtjb3VudEZpZWxkXSwgMTApO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybiByZXN1bHRzO1xuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgcGVyZm9ybUluaXRpYWxpemF0aW9uKHsgVm9sYXRpbGVDbGFzc2VzU2NoZW1hcyB9OiBhbnkpIHtcbiAgICAvLyBUT0RPOiBUaGlzIG1ldGhvZCBuZWVkcyB0byBiZSByZXdyaXR0ZW4gdG8gbWFrZSBwcm9wZXIgdXNlIG9mIGNvbm5lY3Rpb25zIChAdml0YWx5LXQpXG4gICAgZGVidWcoJ3BlcmZvcm1Jbml0aWFsaXphdGlvbicpO1xuICAgIGF3YWl0IHRoaXMuX2Vuc3VyZVNjaGVtYUNvbGxlY3Rpb25FeGlzdHMoKTtcbiAgICBjb25zdCBwcm9taXNlcyA9IFZvbGF0aWxlQ2xhc3Nlc1NjaGVtYXMubWFwKHNjaGVtYSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5jcmVhdGVUYWJsZShzY2hlbWEuY2xhc3NOYW1lLCBzY2hlbWEpXG4gICAgICAgIC5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGVyci5jb2RlID09PSBQb3N0Z3Jlc0R1cGxpY2F0ZVJlbGF0aW9uRXJyb3IgfHxcbiAgICAgICAgICAgIGVyci5jb2RlID09PSBQYXJzZS5FcnJvci5JTlZBTElEX0NMQVNTX05BTUVcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICB9KVxuICAgICAgICAudGhlbigoKSA9PiB0aGlzLnNjaGVtYVVwZ3JhZGUoc2NoZW1hLmNsYXNzTmFtZSwgc2NoZW1hKSk7XG4gICAgfSk7XG4gICAgcHJvbWlzZXMucHVzaCh0aGlzLl9saXN0ZW5Ub1NjaGVtYSgpKTtcbiAgICByZXR1cm4gUHJvbWlzZS5hbGwocHJvbWlzZXMpXG4gICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jbGllbnQudHgoJ3BlcmZvcm0taW5pdGlhbGl6YXRpb24nLCBhc3luYyB0ID0+IHtcbiAgICAgICAgICBhd2FpdCB0Lm5vbmUoc3FsLm1pc2MuanNvbk9iamVjdFNldEtleXMpO1xuICAgICAgICAgIGF3YWl0IHQubm9uZShzcWwuYXJyYXkuYWRkKTtcbiAgICAgICAgICBhd2FpdCB0Lm5vbmUoc3FsLmFycmF5LmFkZFVuaXF1ZSk7XG4gICAgICAgICAgYXdhaXQgdC5ub25lKHNxbC5hcnJheS5yZW1vdmUpO1xuICAgICAgICAgIGF3YWl0IHQubm9uZShzcWwuYXJyYXkuY29udGFpbnNBbGwpO1xuICAgICAgICAgIGF3YWl0IHQubm9uZShzcWwuYXJyYXkuY29udGFpbnNBbGxSZWdleCk7XG4gICAgICAgICAgYXdhaXQgdC5ub25lKHNxbC5hcnJheS5jb250YWlucyk7XG4gICAgICAgICAgcmV0dXJuIHQuY3R4O1xuICAgICAgICB9KTtcbiAgICAgIH0pXG4gICAgICAudGhlbihjdHggPT4ge1xuICAgICAgICBkZWJ1ZyhgaW5pdGlhbGl6YXRpb25Eb25lIGluICR7Y3R4LmR1cmF0aW9ufWApO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLWNvbnNvbGUgKi9cbiAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZUluZGV4ZXMoY2xhc3NOYW1lOiBzdHJpbmcsIGluZGV4ZXM6IGFueSwgY29ubjogP2FueSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiAoY29ubiB8fCB0aGlzLl9jbGllbnQpLnR4KHQgPT5cbiAgICAgIHQuYmF0Y2goXG4gICAgICAgIGluZGV4ZXMubWFwKGkgPT4ge1xuICAgICAgICAgIHJldHVybiB0Lm5vbmUoJ0NSRUFURSBJTkRFWCBJRiBOT1QgRVhJU1RTICQxOm5hbWUgT04gJDI6bmFtZSAoJDM6bmFtZSknLCBbXG4gICAgICAgICAgICBpLm5hbWUsXG4gICAgICAgICAgICBjbGFzc05hbWUsXG4gICAgICAgICAgICBpLmtleSxcbiAgICAgICAgICBdKTtcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgY3JlYXRlSW5kZXhlc0lmTmVlZGVkKFxuICAgIGNsYXNzTmFtZTogc3RyaW5nLFxuICAgIGZpZWxkTmFtZTogc3RyaW5nLFxuICAgIHR5cGU6IGFueSxcbiAgICBjb25uOiA/YW55XG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IChjb25uIHx8IHRoaXMuX2NsaWVudCkubm9uZSgnQ1JFQVRFIElOREVYIElGIE5PVCBFWElTVFMgJDE6bmFtZSBPTiAkMjpuYW1lICgkMzpuYW1lKScsIFtcbiAgICAgIGZpZWxkTmFtZSxcbiAgICAgIGNsYXNzTmFtZSxcbiAgICAgIHR5cGUsXG4gICAgXSk7XG4gIH1cblxuICBhc3luYyBkcm9wSW5kZXhlcyhjbGFzc05hbWU6IHN0cmluZywgaW5kZXhlczogYW55LCBjb25uOiBhbnkpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBxdWVyaWVzID0gaW5kZXhlcy5tYXAoaSA9PiAoe1xuICAgICAgcXVlcnk6ICdEUk9QIElOREVYICQxOm5hbWUnLFxuICAgICAgdmFsdWVzOiBpLFxuICAgIH0pKTtcbiAgICBhd2FpdCAoY29ubiB8fCB0aGlzLl9jbGllbnQpLnR4KHQgPT4gdC5ub25lKHRoaXMuX3BncC5oZWxwZXJzLmNvbmNhdChxdWVyaWVzKSkpO1xuICB9XG5cbiAgYXN5bmMgZ2V0SW5kZXhlcyhjbGFzc05hbWU6IHN0cmluZykge1xuICAgIGNvbnN0IHFzID0gJ1NFTEVDVCAqIEZST00gcGdfaW5kZXhlcyBXSEVSRSB0YWJsZW5hbWUgPSAke2NsYXNzTmFtZX0nO1xuICAgIHJldHVybiB0aGlzLl9jbGllbnQuYW55KHFzLCB7IGNsYXNzTmFtZSB9KTtcbiAgfVxuXG4gIGFzeW5jIHVwZGF0ZVNjaGVtYVdpdGhJbmRleGVzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgfVxuXG4gIC8vIFVzZWQgZm9yIHRlc3RpbmcgcHVycG9zZXNcbiAgYXN5bmMgdXBkYXRlRXN0aW1hdGVkQ291bnQoY2xhc3NOYW1lOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5fY2xpZW50Lm5vbmUoJ0FOQUxZWkUgJDE6bmFtZScsIFtjbGFzc05hbWVdKTtcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZVRyYW5zYWN0aW9uYWxTZXNzaW9uKCk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgY29uc3QgdHJhbnNhY3Rpb25hbFNlc3Npb24gPSB7fTtcbiAgICAgIHRyYW5zYWN0aW9uYWxTZXNzaW9uLnJlc3VsdCA9IHRoaXMuX2NsaWVudC50eCh0ID0+IHtcbiAgICAgICAgdHJhbnNhY3Rpb25hbFNlc3Npb24udCA9IHQ7XG4gICAgICAgIHRyYW5zYWN0aW9uYWxTZXNzaW9uLnByb21pc2UgPSBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgICB0cmFuc2FjdGlvbmFsU2Vzc2lvbi5yZXNvbHZlID0gcmVzb2x2ZTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRyYW5zYWN0aW9uYWxTZXNzaW9uLmJhdGNoID0gW107XG4gICAgICAgIHJlc29sdmUodHJhbnNhY3Rpb25hbFNlc3Npb24pO1xuICAgICAgICByZXR1cm4gdHJhbnNhY3Rpb25hbFNlc3Npb24ucHJvbWlzZTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgY29tbWl0VHJhbnNhY3Rpb25hbFNlc3Npb24odHJhbnNhY3Rpb25hbFNlc3Npb246IGFueSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyYW5zYWN0aW9uYWxTZXNzaW9uLnJlc29sdmUodHJhbnNhY3Rpb25hbFNlc3Npb24udC5iYXRjaCh0cmFuc2FjdGlvbmFsU2Vzc2lvbi5iYXRjaCkpO1xuICAgIHJldHVybiB0cmFuc2FjdGlvbmFsU2Vzc2lvbi5yZXN1bHQ7XG4gIH1cblxuICBhYm9ydFRyYW5zYWN0aW9uYWxTZXNzaW9uKHRyYW5zYWN0aW9uYWxTZXNzaW9uOiBhbnkpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCByZXN1bHQgPSB0cmFuc2FjdGlvbmFsU2Vzc2lvbi5yZXN1bHQuY2F0Y2goKTtcbiAgICB0cmFuc2FjdGlvbmFsU2Vzc2lvbi5iYXRjaC5wdXNoKFByb21pc2UucmVqZWN0KCkpO1xuICAgIHRyYW5zYWN0aW9uYWxTZXNzaW9uLnJlc29sdmUodHJhbnNhY3Rpb25hbFNlc3Npb24udC5iYXRjaCh0cmFuc2FjdGlvbmFsU2Vzc2lvbi5iYXRjaCkpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBhc3luYyBlbnN1cmVJbmRleChcbiAgICBjbGFzc05hbWU6IHN0cmluZyxcbiAgICBzY2hlbWE6IFNjaGVtYVR5cGUsXG4gICAgZmllbGROYW1lczogc3RyaW5nW10sXG4gICAgaW5kZXhOYW1lOiA/c3RyaW5nLFxuICAgIGNhc2VJbnNlbnNpdGl2ZTogYm9vbGVhbiA9IGZhbHNlLFxuICAgIG9wdGlvbnM/OiBPYmplY3QgPSB7fVxuICApOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IGNvbm4gPSBvcHRpb25zLmNvbm4gIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuY29ubiA6IHRoaXMuX2NsaWVudDtcbiAgICBjb25zdCBkZWZhdWx0SW5kZXhOYW1lID0gYHBhcnNlX2RlZmF1bHRfJHtmaWVsZE5hbWVzLnNvcnQoKS5qb2luKCdfJyl9YDtcbiAgICBjb25zdCBpbmRleE5hbWVPcHRpb25zOiBPYmplY3QgPVxuICAgICAgaW5kZXhOYW1lICE9IG51bGwgPyB7IG5hbWU6IGluZGV4TmFtZSB9IDogeyBuYW1lOiBkZWZhdWx0SW5kZXhOYW1lIH07XG4gICAgY29uc3QgY29uc3RyYWludFBhdHRlcm5zID0gY2FzZUluc2Vuc2l0aXZlXG4gICAgICA/IGZpZWxkTmFtZXMubWFwKChmaWVsZE5hbWUsIGluZGV4KSA9PiBgbG93ZXIoJCR7aW5kZXggKyAzfTpuYW1lKSB2YXJjaGFyX3BhdHRlcm5fb3BzYClcbiAgICAgIDogZmllbGROYW1lcy5tYXAoKGZpZWxkTmFtZSwgaW5kZXgpID0+IGAkJHtpbmRleCArIDN9Om5hbWVgKTtcbiAgICBjb25zdCBxcyA9IGBDUkVBVEUgSU5ERVggSUYgTk9UIEVYSVNUUyAkMTpuYW1lIE9OICQyOm5hbWUgKCR7Y29uc3RyYWludFBhdHRlcm5zLmpvaW4oKX0pYDtcbiAgICBjb25zdCBzZXRJZGVtcG90ZW5jeUZ1bmN0aW9uID1cbiAgICAgIG9wdGlvbnMuc2V0SWRlbXBvdGVuY3lGdW5jdGlvbiAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5zZXRJZGVtcG90ZW5jeUZ1bmN0aW9uIDogZmFsc2U7XG4gICAgaWYgKHNldElkZW1wb3RlbmN5RnVuY3Rpb24pIHtcbiAgICAgIGF3YWl0IHRoaXMuZW5zdXJlSWRlbXBvdGVuY3lGdW5jdGlvbkV4aXN0cyhvcHRpb25zKTtcbiAgICB9XG4gICAgYXdhaXQgY29ubi5ub25lKHFzLCBbaW5kZXhOYW1lT3B0aW9ucy5uYW1lLCBjbGFzc05hbWUsIC4uLmZpZWxkTmFtZXNdKS5jYXRjaChlcnJvciA9PiB7XG4gICAgICBpZiAoXG4gICAgICAgIGVycm9yLmNvZGUgPT09IFBvc3RncmVzRHVwbGljYXRlUmVsYXRpb25FcnJvciAmJlxuICAgICAgICBlcnJvci5tZXNzYWdlLmluY2x1ZGVzKGluZGV4TmFtZU9wdGlvbnMubmFtZSlcbiAgICAgICkge1xuICAgICAgICAvLyBJbmRleCBhbHJlYWR5IGV4aXN0cy4gSWdub3JlIGVycm9yLlxuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgZXJyb3IuY29kZSA9PT0gUG9zdGdyZXNVbmlxdWVJbmRleFZpb2xhdGlvbkVycm9yICYmXG4gICAgICAgIGVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoaW5kZXhOYW1lT3B0aW9ucy5uYW1lKVxuICAgICAgKSB7XG4gICAgICAgIC8vIENhc3QgdGhlIGVycm9yIGludG8gdGhlIHByb3BlciBwYXJzZSBlcnJvclxuICAgICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoXG4gICAgICAgICAgUGFyc2UuRXJyb3IuRFVQTElDQVRFX1ZBTFVFLFxuICAgICAgICAgICdBIGR1cGxpY2F0ZSB2YWx1ZSBmb3IgYSBmaWVsZCB3aXRoIHVuaXF1ZSB2YWx1ZXMgd2FzIHByb3ZpZGVkJ1xuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBkZWxldGVJZGVtcG90ZW5jeUZ1bmN0aW9uKG9wdGlvbnM/OiBPYmplY3QgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgY29uc3QgY29ubiA9IG9wdGlvbnMuY29ubiAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5jb25uIDogdGhpcy5fY2xpZW50O1xuICAgIGNvbnN0IHFzID0gJ0RST1AgRlVOQ1RJT04gSUYgRVhJU1RTIGlkZW1wb3RlbmN5X2RlbGV0ZV9leHBpcmVkX3JlY29yZHMoKSc7XG4gICAgcmV0dXJuIGNvbm4ubm9uZShxcykuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBlbnN1cmVJZGVtcG90ZW5jeUZ1bmN0aW9uRXhpc3RzKG9wdGlvbnM/OiBPYmplY3QgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgY29uc3QgY29ubiA9IG9wdGlvbnMuY29ubiAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5jb25uIDogdGhpcy5fY2xpZW50O1xuICAgIGNvbnN0IHR0bE9wdGlvbnMgPSBvcHRpb25zLnR0bCAhPT0gdW5kZWZpbmVkID8gYCR7b3B0aW9ucy50dGx9IHNlY29uZHNgIDogJzYwIHNlY29uZHMnO1xuICAgIGNvbnN0IHFzID1cbiAgICAgICdDUkVBVEUgT1IgUkVQTEFDRSBGVU5DVElPTiBpZGVtcG90ZW5jeV9kZWxldGVfZXhwaXJlZF9yZWNvcmRzKCkgUkVUVVJOUyB2b2lkIExBTkdVQUdFIHBscGdzcWwgQVMgJCQgQkVHSU4gREVMRVRFIEZST00gXCJfSWRlbXBvdGVuY3lcIiBXSEVSRSBleHBpcmUgPCBOT1coKSAtIElOVEVSVkFMICQxOyBFTkQ7ICQkOyc7XG4gICAgcmV0dXJuIGNvbm4ubm9uZShxcywgW3R0bE9wdGlvbnNdKS5jYXRjaChlcnJvciA9PiB7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb252ZXJ0UG9seWdvblRvU1FMKHBvbHlnb24pIHtcbiAgaWYgKHBvbHlnb24ubGVuZ3RoIDwgMykge1xuICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5JTlZBTElEX0pTT04sIGBQb2x5Z29uIG11c3QgaGF2ZSBhdCBsZWFzdCAzIHZhbHVlc2ApO1xuICB9XG4gIGlmIChcbiAgICBwb2x5Z29uWzBdWzBdICE9PSBwb2x5Z29uW3BvbHlnb24ubGVuZ3RoIC0gMV1bMF0gfHxcbiAgICBwb2x5Z29uWzBdWzFdICE9PSBwb2x5Z29uW3BvbHlnb24ubGVuZ3RoIC0gMV1bMV1cbiAgKSB7XG4gICAgcG9seWdvbi5wdXNoKHBvbHlnb25bMF0pO1xuICB9XG4gIGNvbnN0IHVuaXF1ZSA9IHBvbHlnb24uZmlsdGVyKChpdGVtLCBpbmRleCwgYXIpID0+IHtcbiAgICBsZXQgZm91bmRJbmRleCA9IC0xO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXIubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgIGNvbnN0IHB0ID0gYXJbaV07XG4gICAgICBpZiAocHRbMF0gPT09IGl0ZW1bMF0gJiYgcHRbMV0gPT09IGl0ZW1bMV0pIHtcbiAgICAgICAgZm91bmRJbmRleCA9IGk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZm91bmRJbmRleCA9PT0gaW5kZXg7XG4gIH0pO1xuICBpZiAodW5pcXVlLmxlbmd0aCA8IDMpIHtcbiAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoXG4gICAgICBQYXJzZS5FcnJvci5JTlRFUk5BTF9TRVJWRVJfRVJST1IsXG4gICAgICAnR2VvSlNPTjogTG9vcCBtdXN0IGhhdmUgYXQgbGVhc3QgMyBkaWZmZXJlbnQgdmVydGljZXMnXG4gICAgKTtcbiAgfVxuICBjb25zdCBwb2ludHMgPSBwb2x5Z29uXG4gICAgLm1hcChwb2ludCA9PiB7XG4gICAgICBQYXJzZS5HZW9Qb2ludC5fdmFsaWRhdGUocGFyc2VGbG9hdChwb2ludFsxXSksIHBhcnNlRmxvYXQocG9pbnRbMF0pKTtcbiAgICAgIHJldHVybiBgKCR7cG9pbnRbMV19LCAke3BvaW50WzBdfSlgO1xuICAgIH0pXG4gICAgLmpvaW4oJywgJyk7XG4gIHJldHVybiBgKCR7cG9pbnRzfSlgO1xufVxuXG5mdW5jdGlvbiByZW1vdmVXaGl0ZVNwYWNlKHJlZ2V4KSB7XG4gIGlmICghcmVnZXguZW5kc1dpdGgoJ1xcbicpKSB7XG4gICAgcmVnZXggKz0gJ1xcbic7XG4gIH1cblxuICAvLyByZW1vdmUgbm9uIGVzY2FwZWQgY29tbWVudHNcbiAgcmV0dXJuIChcbiAgICByZWdleFxuICAgICAgLnJlcGxhY2UoLyhbXlxcXFxdKSMuKlxcbi9naW0sICckMScpXG4gICAgICAvLyByZW1vdmUgbGluZXMgc3RhcnRpbmcgd2l0aCBhIGNvbW1lbnRcbiAgICAgIC5yZXBsYWNlKC9eIy4qXFxuL2dpbSwgJycpXG4gICAgICAvLyByZW1vdmUgbm9uIGVzY2FwZWQgd2hpdGVzcGFjZVxuICAgICAgLnJlcGxhY2UoLyhbXlxcXFxdKVxccysvZ2ltLCAnJDEnKVxuICAgICAgLy8gcmVtb3ZlIHdoaXRlc3BhY2UgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmVcbiAgICAgIC5yZXBsYWNlKC9eXFxzKy8sICcnKVxuICAgICAgLnRyaW0oKVxuICApO1xufVxuXG5mdW5jdGlvbiBwcm9jZXNzUmVnZXhQYXR0ZXJuKHMpIHtcbiAgaWYgKHMgJiYgcy5zdGFydHNXaXRoKCdeJykpIHtcbiAgICAvLyByZWdleCBmb3Igc3RhcnRzV2l0aFxuICAgIHJldHVybiAnXicgKyBsaXRlcmFsaXplUmVnZXhQYXJ0KHMuc2xpY2UoMSkpO1xuICB9IGVsc2UgaWYgKHMgJiYgcy5lbmRzV2l0aCgnJCcpKSB7XG4gICAgLy8gcmVnZXggZm9yIGVuZHNXaXRoXG4gICAgcmV0dXJuIGxpdGVyYWxpemVSZWdleFBhcnQocy5zbGljZSgwLCBzLmxlbmd0aCAtIDEpKSArICckJztcbiAgfVxuXG4gIC8vIHJlZ2V4IGZvciBjb250YWluc1xuICByZXR1cm4gbGl0ZXJhbGl6ZVJlZ2V4UGFydChzKTtcbn1cblxuZnVuY3Rpb24gaXNTdGFydHNXaXRoUmVnZXgodmFsdWUpIHtcbiAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnIHx8ICF2YWx1ZS5zdGFydHNXaXRoKCdeJykpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBtYXRjaGVzID0gdmFsdWUubWF0Y2goL1xcXlxcXFxRLipcXFxcRS8pO1xuICByZXR1cm4gISFtYXRjaGVzO1xufVxuXG5mdW5jdGlvbiBpc0FsbFZhbHVlc1JlZ2V4T3JOb25lKHZhbHVlcykge1xuICBpZiAoIXZhbHVlcyB8fCAhQXJyYXkuaXNBcnJheSh2YWx1ZXMpIHx8IHZhbHVlcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGNvbnN0IGZpcnN0VmFsdWVzSXNSZWdleCA9IGlzU3RhcnRzV2l0aFJlZ2V4KHZhbHVlc1swXS4kcmVnZXgpO1xuICBpZiAodmFsdWVzLmxlbmd0aCA9PT0gMSkge1xuICAgIHJldHVybiBmaXJzdFZhbHVlc0lzUmVnZXg7XG4gIH1cblxuICBmb3IgKGxldCBpID0gMSwgbGVuZ3RoID0gdmFsdWVzLmxlbmd0aDsgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgaWYgKGZpcnN0VmFsdWVzSXNSZWdleCAhPT0gaXNTdGFydHNXaXRoUmVnZXgodmFsdWVzW2ldLiRyZWdleCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gaXNBbnlWYWx1ZVJlZ2V4U3RhcnRzV2l0aCh2YWx1ZXMpIHtcbiAgcmV0dXJuIHZhbHVlcy5zb21lKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIHJldHVybiBpc1N0YXJ0c1dpdGhSZWdleCh2YWx1ZS4kcmVnZXgpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlTGl0ZXJhbFJlZ2V4KHJlbWFpbmluZykge1xuICByZXR1cm4gcmVtYWluaW5nXG4gICAgLnNwbGl0KCcnKVxuICAgIC5tYXAoYyA9PiB7XG4gICAgICBjb25zdCByZWdleCA9IFJlZ0V4cCgnWzAtOSBdfFxcXFxwe0x9JywgJ3UnKTsgLy8gU3VwcG9ydCBhbGwgdW5pY29kZSBsZXR0ZXIgY2hhcnNcbiAgICAgIGlmIChjLm1hdGNoKHJlZ2V4KSAhPT0gbnVsbCkge1xuICAgICAgICAvLyBkb24ndCBlc2NhcGUgYWxwaGFudW1lcmljIGNoYXJhY3RlcnNcbiAgICAgICAgcmV0dXJuIGM7XG4gICAgICB9XG4gICAgICAvLyBlc2NhcGUgZXZlcnl0aGluZyBlbHNlIChzaW5nbGUgcXVvdGVzIHdpdGggc2luZ2xlIHF1b3RlcywgZXZlcnl0aGluZyBlbHNlIHdpdGggYSBiYWNrc2xhc2gpXG4gICAgICByZXR1cm4gYyA9PT0gYCdgID8gYCcnYCA6IGBcXFxcJHtjfWA7XG4gICAgfSlcbiAgICAuam9pbignJyk7XG59XG5cbmZ1bmN0aW9uIGxpdGVyYWxpemVSZWdleFBhcnQoczogc3RyaW5nKSB7XG4gIGNvbnN0IG1hdGNoZXIxID0gL1xcXFxRKCg/IVxcXFxFKS4qKVxcXFxFJC87XG4gIGNvbnN0IHJlc3VsdDE6IGFueSA9IHMubWF0Y2gobWF0Y2hlcjEpO1xuICBpZiAocmVzdWx0MSAmJiByZXN1bHQxLmxlbmd0aCA+IDEgJiYgcmVzdWx0MS5pbmRleCA+IC0xKSB7XG4gICAgLy8gcHJvY2VzcyByZWdleCB0aGF0IGhhcyBhIGJlZ2lubmluZyBhbmQgYW4gZW5kIHNwZWNpZmllZCBmb3IgdGhlIGxpdGVyYWwgdGV4dFxuICAgIGNvbnN0IHByZWZpeCA9IHMuc3Vic3RyKDAsIHJlc3VsdDEuaW5kZXgpO1xuICAgIGNvbnN0IHJlbWFpbmluZyA9IHJlc3VsdDFbMV07XG5cbiAgICByZXR1cm4gbGl0ZXJhbGl6ZVJlZ2V4UGFydChwcmVmaXgpICsgY3JlYXRlTGl0ZXJhbFJlZ2V4KHJlbWFpbmluZyk7XG4gIH1cblxuICAvLyBwcm9jZXNzIHJlZ2V4IHRoYXQgaGFzIGEgYmVnaW5uaW5nIHNwZWNpZmllZCBmb3IgdGhlIGxpdGVyYWwgdGV4dFxuICBjb25zdCBtYXRjaGVyMiA9IC9cXFxcUSgoPyFcXFxcRSkuKikkLztcbiAgY29uc3QgcmVzdWx0MjogYW55ID0gcy5tYXRjaChtYXRjaGVyMik7XG4gIGlmIChyZXN1bHQyICYmIHJlc3VsdDIubGVuZ3RoID4gMSAmJiByZXN1bHQyLmluZGV4ID4gLTEpIHtcbiAgICBjb25zdCBwcmVmaXggPSBzLnN1YnN0cigwLCByZXN1bHQyLmluZGV4KTtcbiAgICBjb25zdCByZW1haW5pbmcgPSByZXN1bHQyWzFdO1xuXG4gICAgcmV0dXJuIGxpdGVyYWxpemVSZWdleFBhcnQocHJlZml4KSArIGNyZWF0ZUxpdGVyYWxSZWdleChyZW1haW5pbmcpO1xuICB9XG5cbiAgLy8gcmVtb3ZlIGFsbCBpbnN0YW5jZXMgb2YgXFxRIGFuZCBcXEUgZnJvbSB0aGUgcmVtYWluaW5nIHRleHQgJiBlc2NhcGUgc2luZ2xlIHF1b3Rlc1xuICByZXR1cm4gc1xuICAgIC5yZXBsYWNlKC8oW15cXFxcXSkoXFxcXEUpLywgJyQxJylcbiAgICAucmVwbGFjZSgvKFteXFxcXF0pKFxcXFxRKS8sICckMScpXG4gICAgLnJlcGxhY2UoL15cXFxcRS8sICcnKVxuICAgIC5yZXBsYWNlKC9eXFxcXFEvLCAnJylcbiAgICAucmVwbGFjZSgvKFteJ10pJy8sIGAkMScnYClcbiAgICAucmVwbGFjZSgvXicoW14nXSkvLCBgJyckMWApO1xufVxuXG52YXIgR2VvUG9pbnRDb2RlciA9IHtcbiAgaXNWYWxpZEpTT04odmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZS5fX3R5cGUgPT09ICdHZW9Qb2ludCc7XG4gIH0sXG59O1xuXG5leHBvcnQgZGVmYXVsdCBQb3N0Z3Jlc1N0b3JhZ2VBZGFwdGVyO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFBbUQ7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBRW5ELE1BQU1BLEtBQUssR0FBR0MsT0FBTyxDQUFDLGdCQUFnQixDQUFDO0FBRXZDLE1BQU1DLGlDQUFpQyxHQUFHLE9BQU87QUFDakQsTUFBTUMsOEJBQThCLEdBQUcsT0FBTztBQUM5QyxNQUFNQyw0QkFBNEIsR0FBRyxPQUFPO0FBQzVDLE1BQU1DLDBCQUEwQixHQUFHLE9BQU87QUFDMUMsTUFBTUMsaUNBQWlDLEdBQUcsT0FBTztBQUNqRCxNQUFNQyxNQUFNLEdBQUdOLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQztBQUV6QyxNQUFNTyxLQUFLLEdBQUcsVUFBVSxHQUFHQyxJQUFTLEVBQUU7RUFDcENBLElBQUksR0FBRyxDQUFDLE1BQU0sR0FBR0MsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUNDLE1BQU0sQ0FBQ0YsSUFBSSxDQUFDRyxLQUFLLENBQUMsQ0FBQyxFQUFFSCxJQUFJLENBQUNJLE1BQU0sQ0FBQyxDQUFDO0VBQ2pFLE1BQU1DLEdBQUcsR0FBR1AsTUFBTSxDQUFDUSxTQUFTLEVBQUU7RUFDOUJELEdBQUcsQ0FBQ04sS0FBSyxDQUFDUSxLQUFLLENBQUNGLEdBQUcsRUFBRUwsSUFBSSxDQUFDO0FBQzVCLENBQUM7QUFFRCxNQUFNUSx1QkFBdUIsR0FBR0MsSUFBSSxJQUFJO0VBQ3RDLFFBQVFBLElBQUksQ0FBQ0EsSUFBSTtJQUNmLEtBQUssUUFBUTtNQUNYLE9BQU8sTUFBTTtJQUNmLEtBQUssTUFBTTtNQUNULE9BQU8sMEJBQTBCO0lBQ25DLEtBQUssUUFBUTtNQUNYLE9BQU8sT0FBTztJQUNoQixLQUFLLE1BQU07TUFDVCxPQUFPLE1BQU07SUFDZixLQUFLLFNBQVM7TUFDWixPQUFPLFNBQVM7SUFDbEIsS0FBSyxTQUFTO01BQ1osT0FBTyxNQUFNO0lBQ2YsS0FBSyxRQUFRO01BQ1gsT0FBTyxrQkFBa0I7SUFDM0IsS0FBSyxVQUFVO01BQ2IsT0FBTyxPQUFPO0lBQ2hCLEtBQUssT0FBTztNQUNWLE9BQU8sT0FBTztJQUNoQixLQUFLLFNBQVM7TUFDWixPQUFPLFNBQVM7SUFDbEIsS0FBSyxPQUFPO01BQ1YsSUFBSUEsSUFBSSxDQUFDQyxRQUFRLElBQUlELElBQUksQ0FBQ0MsUUFBUSxDQUFDRCxJQUFJLEtBQUssUUFBUSxFQUFFO1FBQ3BELE9BQU8sUUFBUTtNQUNqQixDQUFDLE1BQU07UUFDTCxPQUFPLE9BQU87TUFDaEI7SUFDRjtNQUNFLE1BQU8sZUFBY0UsSUFBSSxDQUFDQyxTQUFTLENBQUNILElBQUksQ0FBRSxNQUFLO0VBQUM7QUFFdEQsQ0FBQztBQUVELE1BQU1JLHdCQUF3QixHQUFHO0VBQy9CQyxHQUFHLEVBQUUsR0FBRztFQUNSQyxHQUFHLEVBQUUsR0FBRztFQUNSQyxJQUFJLEVBQUUsSUFBSTtFQUNWQyxJQUFJLEVBQUU7QUFDUixDQUFDO0FBRUQsTUFBTUMsd0JBQXdCLEdBQUc7RUFDL0JDLFdBQVcsRUFBRSxLQUFLO0VBQ2xCQyxVQUFVLEVBQUUsS0FBSztFQUNqQkMsVUFBVSxFQUFFLEtBQUs7RUFDakJDLGFBQWEsRUFBRSxRQUFRO0VBQ3ZCQyxZQUFZLEVBQUUsU0FBUztFQUN2QkMsS0FBSyxFQUFFLE1BQU07RUFDYkMsT0FBTyxFQUFFLFFBQVE7RUFDakJDLE9BQU8sRUFBRSxRQUFRO0VBQ2pCQyxZQUFZLEVBQUUsY0FBYztFQUM1QkMsTUFBTSxFQUFFLE9BQU87RUFDZkMsS0FBSyxFQUFFLE1BQU07RUFDYkMsS0FBSyxFQUFFO0FBQ1QsQ0FBQztBQUVELE1BQU1DLGVBQWUsR0FBR0MsS0FBSyxJQUFJO0VBQy9CLElBQUksT0FBT0EsS0FBSyxLQUFLLFFBQVEsRUFBRTtJQUM3QixJQUFJQSxLQUFLLENBQUNDLE1BQU0sS0FBSyxNQUFNLEVBQUU7TUFDM0IsT0FBT0QsS0FBSyxDQUFDRSxHQUFHO0lBQ2xCO0lBQ0EsSUFBSUYsS0FBSyxDQUFDQyxNQUFNLEtBQUssTUFBTSxFQUFFO01BQzNCLE9BQU9ELEtBQUssQ0FBQ0csSUFBSTtJQUNuQjtFQUNGO0VBQ0EsT0FBT0gsS0FBSztBQUNkLENBQUM7QUFFRCxNQUFNSSx1QkFBdUIsR0FBR0osS0FBSyxJQUFJO0VBQ3ZDLE1BQU1LLGFBQWEsR0FBR04sZUFBZSxDQUFDQyxLQUFLLENBQUM7RUFDNUMsSUFBSU0sUUFBUTtFQUNaLFFBQVEsT0FBT0QsYUFBYTtJQUMxQixLQUFLLFFBQVE7TUFDWEMsUUFBUSxHQUFHLGtCQUFrQjtNQUM3QjtJQUNGLEtBQUssU0FBUztNQUNaQSxRQUFRLEdBQUcsU0FBUztNQUNwQjtJQUNGO01BQ0VBLFFBQVEsR0FBR0MsU0FBUztFQUFDO0VBRXpCLE9BQU9ELFFBQVE7QUFDakIsQ0FBQztBQUVELE1BQU1FLGNBQWMsR0FBR1IsS0FBSyxJQUFJO0VBQzlCLElBQUksT0FBT0EsS0FBSyxLQUFLLFFBQVEsSUFBSUEsS0FBSyxDQUFDQyxNQUFNLEtBQUssU0FBUyxFQUFFO0lBQzNELE9BQU9ELEtBQUssQ0FBQ1MsUUFBUTtFQUN2QjtFQUNBLE9BQU9ULEtBQUs7QUFDZCxDQUFDOztBQUVEO0FBQ0EsTUFBTVUsU0FBUyxHQUFHQyxNQUFNLENBQUNDLE1BQU0sQ0FBQztFQUM5QkMsSUFBSSxFQUFFLENBQUMsQ0FBQztFQUNSQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO0VBQ1BDLEtBQUssRUFBRSxDQUFDLENBQUM7RUFDVEMsTUFBTSxFQUFFLENBQUMsQ0FBQztFQUNWQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0VBQ1ZDLE1BQU0sRUFBRSxDQUFDLENBQUM7RUFDVkMsUUFBUSxFQUFFLENBQUMsQ0FBQztFQUNaQyxlQUFlLEVBQUUsQ0FBQztBQUNwQixDQUFDLENBQUM7QUFFRixNQUFNQyxXQUFXLEdBQUdWLE1BQU0sQ0FBQ0MsTUFBTSxDQUFDO0VBQ2hDQyxJQUFJLEVBQUU7SUFBRSxHQUFHLEVBQUU7RUFBSyxDQUFDO0VBQ25CQyxHQUFHLEVBQUU7SUFBRSxHQUFHLEVBQUU7RUFBSyxDQUFDO0VBQ2xCQyxLQUFLLEVBQUU7SUFBRSxHQUFHLEVBQUU7RUFBSyxDQUFDO0VBQ3BCQyxNQUFNLEVBQUU7SUFBRSxHQUFHLEVBQUU7RUFBSyxDQUFDO0VBQ3JCQyxNQUFNLEVBQUU7SUFBRSxHQUFHLEVBQUU7RUFBSyxDQUFDO0VBQ3JCQyxNQUFNLEVBQUU7SUFBRSxHQUFHLEVBQUU7RUFBSyxDQUFDO0VBQ3JCQyxRQUFRLEVBQUU7SUFBRSxHQUFHLEVBQUU7RUFBSyxDQUFDO0VBQ3ZCQyxlQUFlLEVBQUU7SUFBRSxHQUFHLEVBQUU7RUFBRztBQUM3QixDQUFDLENBQUM7QUFFRixNQUFNRSxhQUFhLEdBQUdDLE1BQU0sSUFBSTtFQUM5QixJQUFJQSxNQUFNLENBQUNDLFNBQVMsS0FBSyxPQUFPLEVBQUU7SUFDaEMsT0FBT0QsTUFBTSxDQUFDRSxNQUFNLENBQUNDLGdCQUFnQjtFQUN2QztFQUNBLElBQUlILE1BQU0sQ0FBQ0UsTUFBTSxFQUFFO0lBQ2pCLE9BQU9GLE1BQU0sQ0FBQ0UsTUFBTSxDQUFDRSxNQUFNO0lBQzNCLE9BQU9KLE1BQU0sQ0FBQ0UsTUFBTSxDQUFDRyxNQUFNO0VBQzdCO0VBQ0EsSUFBSUMsSUFBSSxHQUFHUixXQUFXO0VBQ3RCLElBQUlFLE1BQU0sQ0FBQ08scUJBQXFCLEVBQUU7SUFDaENELElBQUksbUNBQVFuQixTQUFTLEdBQUthLE1BQU0sQ0FBQ08scUJBQXFCLENBQUU7RUFDMUQ7RUFDQSxJQUFJQyxPQUFPLEdBQUcsQ0FBQyxDQUFDO0VBQ2hCLElBQUlSLE1BQU0sQ0FBQ1EsT0FBTyxFQUFFO0lBQ2xCQSxPQUFPLHFCQUFRUixNQUFNLENBQUNRLE9BQU8sQ0FBRTtFQUNqQztFQUNBLE9BQU87SUFDTFAsU0FBUyxFQUFFRCxNQUFNLENBQUNDLFNBQVM7SUFDM0JDLE1BQU0sRUFBRUYsTUFBTSxDQUFDRSxNQUFNO0lBQ3JCSyxxQkFBcUIsRUFBRUQsSUFBSTtJQUMzQkU7RUFDRixDQUFDO0FBQ0gsQ0FBQztBQUVELE1BQU1DLGdCQUFnQixHQUFHVCxNQUFNLElBQUk7RUFDakMsSUFBSSxDQUFDQSxNQUFNLEVBQUU7SUFDWCxPQUFPQSxNQUFNO0VBQ2Y7RUFDQUEsTUFBTSxDQUFDRSxNQUFNLEdBQUdGLE1BQU0sQ0FBQ0UsTUFBTSxJQUFJLENBQUMsQ0FBQztFQUNuQ0YsTUFBTSxDQUFDRSxNQUFNLENBQUNFLE1BQU0sR0FBRztJQUFFbEQsSUFBSSxFQUFFLE9BQU87SUFBRUMsUUFBUSxFQUFFO01BQUVELElBQUksRUFBRTtJQUFTO0VBQUUsQ0FBQztFQUN0RThDLE1BQU0sQ0FBQ0UsTUFBTSxDQUFDRyxNQUFNLEdBQUc7SUFBRW5ELElBQUksRUFBRSxPQUFPO0lBQUVDLFFBQVEsRUFBRTtNQUFFRCxJQUFJLEVBQUU7SUFBUztFQUFFLENBQUM7RUFDdEUsSUFBSThDLE1BQU0sQ0FBQ0MsU0FBUyxLQUFLLE9BQU8sRUFBRTtJQUNoQ0QsTUFBTSxDQUFDRSxNQUFNLENBQUNDLGdCQUFnQixHQUFHO01BQUVqRCxJQUFJLEVBQUU7SUFBUyxDQUFDO0lBQ25EOEMsTUFBTSxDQUFDRSxNQUFNLENBQUNRLGlCQUFpQixHQUFHO01BQUV4RCxJQUFJLEVBQUU7SUFBUSxDQUFDO0VBQ3JEO0VBQ0EsT0FBTzhDLE1BQU07QUFDZixDQUFDO0FBRUQsTUFBTVcsZUFBZSxHQUFHQyxNQUFNLElBQUk7RUFDaEN4QixNQUFNLENBQUN5QixJQUFJLENBQUNELE1BQU0sQ0FBQyxDQUFDRSxPQUFPLENBQUNDLFNBQVMsSUFBSTtJQUN2QyxJQUFJQSxTQUFTLENBQUNDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRTtNQUMvQixNQUFNQyxVQUFVLEdBQUdGLFNBQVMsQ0FBQ0csS0FBSyxDQUFDLEdBQUcsQ0FBQztNQUN2QyxNQUFNQyxLQUFLLEdBQUdGLFVBQVUsQ0FBQ0csS0FBSyxFQUFFO01BQ2hDUixNQUFNLENBQUNPLEtBQUssQ0FBQyxHQUFHUCxNQUFNLENBQUNPLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztNQUNuQyxJQUFJRSxVQUFVLEdBQUdULE1BQU0sQ0FBQ08sS0FBSyxDQUFDO01BQzlCLElBQUlHLElBQUk7TUFDUixJQUFJN0MsS0FBSyxHQUFHbUMsTUFBTSxDQUFDRyxTQUFTLENBQUM7TUFDN0IsSUFBSXRDLEtBQUssSUFBSUEsS0FBSyxDQUFDOEMsSUFBSSxLQUFLLFFBQVEsRUFBRTtRQUNwQzlDLEtBQUssR0FBR08sU0FBUztNQUNuQjtNQUNBO01BQ0EsT0FBUXNDLElBQUksR0FBR0wsVUFBVSxDQUFDRyxLQUFLLEVBQUUsRUFBRztRQUNsQztRQUNBQyxVQUFVLENBQUNDLElBQUksQ0FBQyxHQUFHRCxVQUFVLENBQUNDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN6QyxJQUFJTCxVQUFVLENBQUNwRSxNQUFNLEtBQUssQ0FBQyxFQUFFO1VBQzNCd0UsVUFBVSxDQUFDQyxJQUFJLENBQUMsR0FBRzdDLEtBQUs7UUFDMUI7UUFDQTRDLFVBQVUsR0FBR0EsVUFBVSxDQUFDQyxJQUFJLENBQUM7TUFDL0I7TUFDQSxPQUFPVixNQUFNLENBQUNHLFNBQVMsQ0FBQztJQUMxQjtFQUNGLENBQUMsQ0FBQztFQUNGLE9BQU9ILE1BQU07QUFDZixDQUFDO0FBRUQsTUFBTVksNkJBQTZCLEdBQUdULFNBQVMsSUFBSTtFQUNqRCxPQUFPQSxTQUFTLENBQUNHLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQ08sR0FBRyxDQUFDLENBQUNDLElBQUksRUFBRUMsS0FBSyxLQUFLO0lBQy9DLElBQUlBLEtBQUssS0FBSyxDQUFDLEVBQUU7TUFDZixPQUFRLElBQUdELElBQUssR0FBRTtJQUNwQjtJQUNBLE9BQVEsSUFBR0EsSUFBSyxHQUFFO0VBQ3BCLENBQUMsQ0FBQztBQUNKLENBQUM7QUFFRCxNQUFNRSxpQkFBaUIsR0FBR2IsU0FBUyxJQUFJO0VBQ3JDLElBQUlBLFNBQVMsQ0FBQ0MsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFO0lBQ2pDLE9BQVEsSUFBR0QsU0FBVSxHQUFFO0VBQ3pCO0VBQ0EsTUFBTUUsVUFBVSxHQUFHTyw2QkFBNkIsQ0FBQ1QsU0FBUyxDQUFDO0VBQzNELElBQUluQyxJQUFJLEdBQUdxQyxVQUFVLENBQUNyRSxLQUFLLENBQUMsQ0FBQyxFQUFFcUUsVUFBVSxDQUFDcEUsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDZ0YsSUFBSSxDQUFDLElBQUksQ0FBQztFQUNoRWpELElBQUksSUFBSSxLQUFLLEdBQUdxQyxVQUFVLENBQUNBLFVBQVUsQ0FBQ3BFLE1BQU0sR0FBRyxDQUFDLENBQUM7RUFDakQsT0FBTytCLElBQUk7QUFDYixDQUFDO0FBRUQsTUFBTWtELHVCQUF1QixHQUFHZixTQUFTLElBQUk7RUFDM0MsSUFBSSxPQUFPQSxTQUFTLEtBQUssUUFBUSxFQUFFO0lBQ2pDLE9BQU9BLFNBQVM7RUFDbEI7RUFDQSxJQUFJQSxTQUFTLEtBQUssY0FBYyxFQUFFO0lBQ2hDLE9BQU8sV0FBVztFQUNwQjtFQUNBLElBQUlBLFNBQVMsS0FBSyxjQUFjLEVBQUU7SUFDaEMsT0FBTyxXQUFXO0VBQ3BCO0VBQ0EsT0FBT0EsU0FBUyxDQUFDZ0IsTUFBTSxDQUFDLENBQUMsQ0FBQztBQUM1QixDQUFDO0FBRUQsTUFBTUMsWUFBWSxHQUFHcEIsTUFBTSxJQUFJO0VBQzdCLElBQUksT0FBT0EsTUFBTSxJQUFJLFFBQVEsRUFBRTtJQUM3QixLQUFLLE1BQU1xQixHQUFHLElBQUlyQixNQUFNLEVBQUU7TUFDeEIsSUFBSSxPQUFPQSxNQUFNLENBQUNxQixHQUFHLENBQUMsSUFBSSxRQUFRLEVBQUU7UUFDbENELFlBQVksQ0FBQ3BCLE1BQU0sQ0FBQ3FCLEdBQUcsQ0FBQyxDQUFDO01BQzNCO01BRUEsSUFBSUEsR0FBRyxDQUFDQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUlELEdBQUcsQ0FBQ0MsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFO1FBQzFDLE1BQU0sSUFBSUMsYUFBSyxDQUFDQyxLQUFLLENBQ25CRCxhQUFLLENBQUNDLEtBQUssQ0FBQ0Msa0JBQWtCLEVBQzlCLDBEQUEwRCxDQUMzRDtNQUNIO0lBQ0Y7RUFDRjtBQUNGLENBQUM7O0FBRUQ7QUFDQSxNQUFNQyxtQkFBbUIsR0FBR3RDLE1BQU0sSUFBSTtFQUNwQyxNQUFNdUMsSUFBSSxHQUFHLEVBQUU7RUFDZixJQUFJdkMsTUFBTSxFQUFFO0lBQ1ZaLE1BQU0sQ0FBQ3lCLElBQUksQ0FBQ2IsTUFBTSxDQUFDRSxNQUFNLENBQUMsQ0FBQ1ksT0FBTyxDQUFDMEIsS0FBSyxJQUFJO01BQzFDLElBQUl4QyxNQUFNLENBQUNFLE1BQU0sQ0FBQ3NDLEtBQUssQ0FBQyxDQUFDdEYsSUFBSSxLQUFLLFVBQVUsRUFBRTtRQUM1Q3FGLElBQUksQ0FBQ0UsSUFBSSxDQUFFLFNBQVFELEtBQU0sSUFBR3hDLE1BQU0sQ0FBQ0MsU0FBVSxFQUFDLENBQUM7TUFDakQ7SUFDRixDQUFDLENBQUM7RUFDSjtFQUNBLE9BQU9zQyxJQUFJO0FBQ2IsQ0FBQztBQVFELE1BQU1HLGdCQUFnQixHQUFHLENBQUM7RUFBRTFDLE1BQU07RUFBRTJDLEtBQUs7RUFBRWhCLEtBQUs7RUFBRWlCO0FBQWdCLENBQUMsS0FBa0I7RUFDbkYsTUFBTUMsUUFBUSxHQUFHLEVBQUU7RUFDbkIsSUFBSUMsTUFBTSxHQUFHLEVBQUU7RUFDZixNQUFNQyxLQUFLLEdBQUcsRUFBRTtFQUVoQi9DLE1BQU0sR0FBR1MsZ0JBQWdCLENBQUNULE1BQU0sQ0FBQztFQUNqQyxLQUFLLE1BQU1lLFNBQVMsSUFBSTRCLEtBQUssRUFBRTtJQUM3QixNQUFNSyxZQUFZLEdBQ2hCaEQsTUFBTSxDQUFDRSxNQUFNLElBQUlGLE1BQU0sQ0FBQ0UsTUFBTSxDQUFDYSxTQUFTLENBQUMsSUFBSWYsTUFBTSxDQUFDRSxNQUFNLENBQUNhLFNBQVMsQ0FBQyxDQUFDN0QsSUFBSSxLQUFLLE9BQU87SUFDeEYsTUFBTStGLHFCQUFxQixHQUFHSixRQUFRLENBQUNoRyxNQUFNO0lBQzdDLE1BQU1xRyxVQUFVLEdBQUdQLEtBQUssQ0FBQzVCLFNBQVMsQ0FBQzs7SUFFbkM7SUFDQSxJQUFJLENBQUNmLE1BQU0sQ0FBQ0UsTUFBTSxDQUFDYSxTQUFTLENBQUMsRUFBRTtNQUM3QjtNQUNBLElBQUltQyxVQUFVLElBQUlBLFVBQVUsQ0FBQ0MsT0FBTyxLQUFLLEtBQUssRUFBRTtRQUM5QztNQUNGO0lBQ0Y7SUFDQSxNQUFNQyxhQUFhLEdBQUdyQyxTQUFTLENBQUNzQyxLQUFLLENBQUMsOEJBQThCLENBQUM7SUFDckUsSUFBSUQsYUFBYSxFQUFFO01BQ2pCO01BQ0E7SUFDRixDQUFDLE1BQU0sSUFBSVIsZUFBZSxLQUFLN0IsU0FBUyxLQUFLLFVBQVUsSUFBSUEsU0FBUyxLQUFLLE9BQU8sQ0FBQyxFQUFFO01BQ2pGOEIsUUFBUSxDQUFDSixJQUFJLENBQUUsVUFBU2QsS0FBTSxtQkFBa0JBLEtBQUssR0FBRyxDQUFFLEdBQUUsQ0FBQztNQUM3RG1CLE1BQU0sQ0FBQ0wsSUFBSSxDQUFDMUIsU0FBUyxFQUFFbUMsVUFBVSxDQUFDO01BQ2xDdkIsS0FBSyxJQUFJLENBQUM7SUFDWixDQUFDLE1BQU0sSUFBSVosU0FBUyxDQUFDQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFO01BQ3RDLElBQUlwQyxJQUFJLEdBQUdnRCxpQkFBaUIsQ0FBQ2IsU0FBUyxDQUFDO01BQ3ZDLElBQUltQyxVQUFVLEtBQUssSUFBSSxFQUFFO1FBQ3ZCTCxRQUFRLENBQUNKLElBQUksQ0FBRSxJQUFHZCxLQUFNLGNBQWEsQ0FBQztRQUN0Q21CLE1BQU0sQ0FBQ0wsSUFBSSxDQUFDN0QsSUFBSSxDQUFDO1FBQ2pCK0MsS0FBSyxJQUFJLENBQUM7UUFDVjtNQUNGLENBQUMsTUFBTTtRQUNMLElBQUl1QixVQUFVLENBQUNJLEdBQUcsRUFBRTtVQUNsQjFFLElBQUksR0FBRzRDLDZCQUE2QixDQUFDVCxTQUFTLENBQUMsQ0FBQ2MsSUFBSSxDQUFDLElBQUksQ0FBQztVQUMxRGdCLFFBQVEsQ0FBQ0osSUFBSSxDQUFFLEtBQUlkLEtBQU0sb0JBQW1CQSxLQUFLLEdBQUcsQ0FBRSxTQUFRLENBQUM7VUFDL0RtQixNQUFNLENBQUNMLElBQUksQ0FBQzdELElBQUksRUFBRXhCLElBQUksQ0FBQ0MsU0FBUyxDQUFDNkYsVUFBVSxDQUFDSSxHQUFHLENBQUMsQ0FBQztVQUNqRDNCLEtBQUssSUFBSSxDQUFDO1FBQ1osQ0FBQyxNQUFNLElBQUl1QixVQUFVLENBQUNLLE1BQU0sRUFBRTtVQUM1QjtRQUFBLENBQ0QsTUFBTSxJQUFJLE9BQU9MLFVBQVUsS0FBSyxRQUFRLEVBQUU7VUFDekNMLFFBQVEsQ0FBQ0osSUFBSSxDQUFFLElBQUdkLEtBQU0sV0FBVUEsS0FBSyxHQUFHLENBQUUsUUFBTyxDQUFDO1VBQ3BEbUIsTUFBTSxDQUFDTCxJQUFJLENBQUM3RCxJQUFJLEVBQUVzRSxVQUFVLENBQUM7VUFDN0J2QixLQUFLLElBQUksQ0FBQztRQUNaO01BQ0Y7SUFDRixDQUFDLE1BQU0sSUFBSXVCLFVBQVUsS0FBSyxJQUFJLElBQUlBLFVBQVUsS0FBS2xFLFNBQVMsRUFBRTtNQUMxRDZELFFBQVEsQ0FBQ0osSUFBSSxDQUFFLElBQUdkLEtBQU0sZUFBYyxDQUFDO01BQ3ZDbUIsTUFBTSxDQUFDTCxJQUFJLENBQUMxQixTQUFTLENBQUM7TUFDdEJZLEtBQUssSUFBSSxDQUFDO01BQ1Y7SUFDRixDQUFDLE1BQU0sSUFBSSxPQUFPdUIsVUFBVSxLQUFLLFFBQVEsRUFBRTtNQUN6Q0wsUUFBUSxDQUFDSixJQUFJLENBQUUsSUFBR2QsS0FBTSxZQUFXQSxLQUFLLEdBQUcsQ0FBRSxFQUFDLENBQUM7TUFDL0NtQixNQUFNLENBQUNMLElBQUksQ0FBQzFCLFNBQVMsRUFBRW1DLFVBQVUsQ0FBQztNQUNsQ3ZCLEtBQUssSUFBSSxDQUFDO0lBQ1osQ0FBQyxNQUFNLElBQUksT0FBT3VCLFVBQVUsS0FBSyxTQUFTLEVBQUU7TUFDMUNMLFFBQVEsQ0FBQ0osSUFBSSxDQUFFLElBQUdkLEtBQU0sWUFBV0EsS0FBSyxHQUFHLENBQUUsRUFBQyxDQUFDO01BQy9DO01BQ0EsSUFBSTNCLE1BQU0sQ0FBQ0UsTUFBTSxDQUFDYSxTQUFTLENBQUMsSUFBSWYsTUFBTSxDQUFDRSxNQUFNLENBQUNhLFNBQVMsQ0FBQyxDQUFDN0QsSUFBSSxLQUFLLFFBQVEsRUFBRTtRQUMxRTtRQUNBLE1BQU1zRyxnQkFBZ0IsR0FBRyxtQkFBbUI7UUFDNUNWLE1BQU0sQ0FBQ0wsSUFBSSxDQUFDMUIsU0FBUyxFQUFFeUMsZ0JBQWdCLENBQUM7TUFDMUMsQ0FBQyxNQUFNO1FBQ0xWLE1BQU0sQ0FBQ0wsSUFBSSxDQUFDMUIsU0FBUyxFQUFFbUMsVUFBVSxDQUFDO01BQ3BDO01BQ0F2QixLQUFLLElBQUksQ0FBQztJQUNaLENBQUMsTUFBTSxJQUFJLE9BQU91QixVQUFVLEtBQUssUUFBUSxFQUFFO01BQ3pDTCxRQUFRLENBQUNKLElBQUksQ0FBRSxJQUFHZCxLQUFNLFlBQVdBLEtBQUssR0FBRyxDQUFFLEVBQUMsQ0FBQztNQUMvQ21CLE1BQU0sQ0FBQ0wsSUFBSSxDQUFDMUIsU0FBUyxFQUFFbUMsVUFBVSxDQUFDO01BQ2xDdkIsS0FBSyxJQUFJLENBQUM7SUFDWixDQUFDLE1BQU0sSUFBSSxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUNPLFFBQVEsQ0FBQ25CLFNBQVMsQ0FBQyxFQUFFO01BQ3RELE1BQU0wQyxPQUFPLEdBQUcsRUFBRTtNQUNsQixNQUFNQyxZQUFZLEdBQUcsRUFBRTtNQUN2QlIsVUFBVSxDQUFDcEMsT0FBTyxDQUFDNkMsUUFBUSxJQUFJO1FBQzdCLE1BQU1DLE1BQU0sR0FBR2xCLGdCQUFnQixDQUFDO1VBQzlCMUMsTUFBTTtVQUNOMkMsS0FBSyxFQUFFZ0IsUUFBUTtVQUNmaEMsS0FBSztVQUNMaUI7UUFDRixDQUFDLENBQUM7UUFDRixJQUFJZ0IsTUFBTSxDQUFDQyxPQUFPLENBQUNoSCxNQUFNLEdBQUcsQ0FBQyxFQUFFO1VBQzdCNEcsT0FBTyxDQUFDaEIsSUFBSSxDQUFDbUIsTUFBTSxDQUFDQyxPQUFPLENBQUM7VUFDNUJILFlBQVksQ0FBQ2pCLElBQUksQ0FBQyxHQUFHbUIsTUFBTSxDQUFDZCxNQUFNLENBQUM7VUFDbkNuQixLQUFLLElBQUlpQyxNQUFNLENBQUNkLE1BQU0sQ0FBQ2pHLE1BQU07UUFDL0I7TUFDRixDQUFDLENBQUM7TUFFRixNQUFNaUgsT0FBTyxHQUFHL0MsU0FBUyxLQUFLLE1BQU0sR0FBRyxPQUFPLEdBQUcsTUFBTTtNQUN2RCxNQUFNZ0QsR0FBRyxHQUFHaEQsU0FBUyxLQUFLLE1BQU0sR0FBRyxPQUFPLEdBQUcsRUFBRTtNQUUvQzhCLFFBQVEsQ0FBQ0osSUFBSSxDQUFFLEdBQUVzQixHQUFJLElBQUdOLE9BQU8sQ0FBQzVCLElBQUksQ0FBQ2lDLE9BQU8sQ0FBRSxHQUFFLENBQUM7TUFDakRoQixNQUFNLENBQUNMLElBQUksQ0FBQyxHQUFHaUIsWUFBWSxDQUFDO0lBQzlCO0lBRUEsSUFBSVIsVUFBVSxDQUFDYyxHQUFHLEtBQUtoRixTQUFTLEVBQUU7TUFDaEMsSUFBSWdFLFlBQVksRUFBRTtRQUNoQkUsVUFBVSxDQUFDYyxHQUFHLEdBQUc1RyxJQUFJLENBQUNDLFNBQVMsQ0FBQyxDQUFDNkYsVUFBVSxDQUFDYyxHQUFHLENBQUMsQ0FBQztRQUNqRG5CLFFBQVEsQ0FBQ0osSUFBSSxDQUFFLHVCQUFzQmQsS0FBTSxXQUFVQSxLQUFLLEdBQUcsQ0FBRSxHQUFFLENBQUM7TUFDcEUsQ0FBQyxNQUFNO1FBQ0wsSUFBSXVCLFVBQVUsQ0FBQ2MsR0FBRyxLQUFLLElBQUksRUFBRTtVQUMzQm5CLFFBQVEsQ0FBQ0osSUFBSSxDQUFFLElBQUdkLEtBQU0sbUJBQWtCLENBQUM7VUFDM0NtQixNQUFNLENBQUNMLElBQUksQ0FBQzFCLFNBQVMsQ0FBQztVQUN0QlksS0FBSyxJQUFJLENBQUM7VUFDVjtRQUNGLENBQUMsTUFBTTtVQUNMO1VBQ0EsSUFBSXVCLFVBQVUsQ0FBQ2MsR0FBRyxDQUFDdEYsTUFBTSxLQUFLLFVBQVUsRUFBRTtZQUN4Q21FLFFBQVEsQ0FBQ0osSUFBSSxDQUNWLEtBQUlkLEtBQU0sbUJBQWtCQSxLQUFLLEdBQUcsQ0FBRSxNQUFLQSxLQUFLLEdBQUcsQ0FBRSxTQUFRQSxLQUFNLGdCQUFlLENBQ3BGO1VBQ0gsQ0FBQyxNQUFNO1lBQ0wsSUFBSVosU0FBUyxDQUFDQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFO2NBQy9CLE1BQU1qQyxRQUFRLEdBQUdGLHVCQUF1QixDQUFDcUUsVUFBVSxDQUFDYyxHQUFHLENBQUM7Y0FDeEQsTUFBTUMsbUJBQW1CLEdBQUdsRixRQUFRLEdBQy9CLFVBQVM2QyxpQkFBaUIsQ0FBQ2IsU0FBUyxDQUFFLFFBQU9oQyxRQUFTLEdBQUUsR0FDekQ2QyxpQkFBaUIsQ0FBQ2IsU0FBUyxDQUFDO2NBQ2hDOEIsUUFBUSxDQUFDSixJQUFJLENBQ1YsSUFBR3dCLG1CQUFvQixRQUFPdEMsS0FBSyxHQUFHLENBQUUsT0FBTXNDLG1CQUFvQixXQUFVLENBQzlFO1lBQ0gsQ0FBQyxNQUFNLElBQUksT0FBT2YsVUFBVSxDQUFDYyxHQUFHLEtBQUssUUFBUSxJQUFJZCxVQUFVLENBQUNjLEdBQUcsQ0FBQ0UsYUFBYSxFQUFFO2NBQzdFLE1BQU0sSUFBSS9CLGFBQUssQ0FBQ0MsS0FBSyxDQUNuQkQsYUFBSyxDQUFDQyxLQUFLLENBQUMrQixZQUFZLEVBQ3hCLDRFQUE0RSxDQUM3RTtZQUNILENBQUMsTUFBTTtjQUNMdEIsUUFBUSxDQUFDSixJQUFJLENBQUUsS0FBSWQsS0FBTSxhQUFZQSxLQUFLLEdBQUcsQ0FBRSxRQUFPQSxLQUFNLGdCQUFlLENBQUM7WUFDOUU7VUFDRjtRQUNGO01BQ0Y7TUFDQSxJQUFJdUIsVUFBVSxDQUFDYyxHQUFHLENBQUN0RixNQUFNLEtBQUssVUFBVSxFQUFFO1FBQ3hDLE1BQU0wRixLQUFLLEdBQUdsQixVQUFVLENBQUNjLEdBQUc7UUFDNUJsQixNQUFNLENBQUNMLElBQUksQ0FBQzFCLFNBQVMsRUFBRXFELEtBQUssQ0FBQ0MsU0FBUyxFQUFFRCxLQUFLLENBQUNFLFFBQVEsQ0FBQztRQUN2RDNDLEtBQUssSUFBSSxDQUFDO01BQ1osQ0FBQyxNQUFNO1FBQ0w7UUFDQW1CLE1BQU0sQ0FBQ0wsSUFBSSxDQUFDMUIsU0FBUyxFQUFFbUMsVUFBVSxDQUFDYyxHQUFHLENBQUM7UUFDdENyQyxLQUFLLElBQUksQ0FBQztNQUNaO0lBQ0Y7SUFDQSxJQUFJdUIsVUFBVSxDQUFDcUIsR0FBRyxLQUFLdkYsU0FBUyxFQUFFO01BQ2hDLElBQUlrRSxVQUFVLENBQUNxQixHQUFHLEtBQUssSUFBSSxFQUFFO1FBQzNCMUIsUUFBUSxDQUFDSixJQUFJLENBQUUsSUFBR2QsS0FBTSxlQUFjLENBQUM7UUFDdkNtQixNQUFNLENBQUNMLElBQUksQ0FBQzFCLFNBQVMsQ0FBQztRQUN0QlksS0FBSyxJQUFJLENBQUM7TUFDWixDQUFDLE1BQU07UUFDTCxJQUFJWixTQUFTLENBQUNDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUU7VUFDL0IsTUFBTWpDLFFBQVEsR0FBR0YsdUJBQXVCLENBQUNxRSxVQUFVLENBQUNxQixHQUFHLENBQUM7VUFDeEQsTUFBTU4sbUJBQW1CLEdBQUdsRixRQUFRLEdBQy9CLFVBQVM2QyxpQkFBaUIsQ0FBQ2IsU0FBUyxDQUFFLFFBQU9oQyxRQUFTLEdBQUUsR0FDekQ2QyxpQkFBaUIsQ0FBQ2IsU0FBUyxDQUFDO1VBQ2hDK0IsTUFBTSxDQUFDTCxJQUFJLENBQUNTLFVBQVUsQ0FBQ3FCLEdBQUcsQ0FBQztVQUMzQjFCLFFBQVEsQ0FBQ0osSUFBSSxDQUFFLEdBQUV3QixtQkFBb0IsT0FBTXRDLEtBQUssRUFBRyxFQUFDLENBQUM7UUFDdkQsQ0FBQyxNQUFNLElBQUksT0FBT3VCLFVBQVUsQ0FBQ3FCLEdBQUcsS0FBSyxRQUFRLElBQUlyQixVQUFVLENBQUNxQixHQUFHLENBQUNMLGFBQWEsRUFBRTtVQUM3RSxNQUFNLElBQUkvQixhQUFLLENBQUNDLEtBQUssQ0FDbkJELGFBQUssQ0FBQ0MsS0FBSyxDQUFDK0IsWUFBWSxFQUN4Qiw0RUFBNEUsQ0FDN0U7UUFDSCxDQUFDLE1BQU07VUFDTHJCLE1BQU0sQ0FBQ0wsSUFBSSxDQUFDMUIsU0FBUyxFQUFFbUMsVUFBVSxDQUFDcUIsR0FBRyxDQUFDO1VBQ3RDMUIsUUFBUSxDQUFDSixJQUFJLENBQUUsSUFBR2QsS0FBTSxZQUFXQSxLQUFLLEdBQUcsQ0FBRSxFQUFDLENBQUM7VUFDL0NBLEtBQUssSUFBSSxDQUFDO1FBQ1o7TUFDRjtJQUNGO0lBQ0EsTUFBTTZDLFNBQVMsR0FBR0MsS0FBSyxDQUFDQyxPQUFPLENBQUN4QixVQUFVLENBQUNJLEdBQUcsQ0FBQyxJQUFJbUIsS0FBSyxDQUFDQyxPQUFPLENBQUN4QixVQUFVLENBQUN5QixJQUFJLENBQUM7SUFDakYsSUFDRUYsS0FBSyxDQUFDQyxPQUFPLENBQUN4QixVQUFVLENBQUNJLEdBQUcsQ0FBQyxJQUM3Qk4sWUFBWSxJQUNaaEQsTUFBTSxDQUFDRSxNQUFNLENBQUNhLFNBQVMsQ0FBQyxDQUFDNUQsUUFBUSxJQUNqQzZDLE1BQU0sQ0FBQ0UsTUFBTSxDQUFDYSxTQUFTLENBQUMsQ0FBQzVELFFBQVEsQ0FBQ0QsSUFBSSxLQUFLLFFBQVEsRUFDbkQ7TUFDQSxNQUFNMEgsVUFBVSxHQUFHLEVBQUU7TUFDckIsSUFBSUMsU0FBUyxHQUFHLEtBQUs7TUFDckIvQixNQUFNLENBQUNMLElBQUksQ0FBQzFCLFNBQVMsQ0FBQztNQUN0Qm1DLFVBQVUsQ0FBQ0ksR0FBRyxDQUFDeEMsT0FBTyxDQUFDLENBQUNnRSxRQUFRLEVBQUVDLFNBQVMsS0FBSztRQUM5QyxJQUFJRCxRQUFRLEtBQUssSUFBSSxFQUFFO1VBQ3JCRCxTQUFTLEdBQUcsSUFBSTtRQUNsQixDQUFDLE1BQU07VUFDTC9CLE1BQU0sQ0FBQ0wsSUFBSSxDQUFDcUMsUUFBUSxDQUFDO1VBQ3JCRixVQUFVLENBQUNuQyxJQUFJLENBQUUsSUFBR2QsS0FBSyxHQUFHLENBQUMsR0FBR29ELFNBQVMsSUFBSUYsU0FBUyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUUsRUFBQyxDQUFDO1FBQ3BFO01BQ0YsQ0FBQyxDQUFDO01BQ0YsSUFBSUEsU0FBUyxFQUFFO1FBQ2JoQyxRQUFRLENBQUNKLElBQUksQ0FBRSxLQUFJZCxLQUFNLHFCQUFvQkEsS0FBTSxrQkFBaUJpRCxVQUFVLENBQUMvQyxJQUFJLEVBQUcsSUFBRyxDQUFDO01BQzVGLENBQUMsTUFBTTtRQUNMZ0IsUUFBUSxDQUFDSixJQUFJLENBQUUsSUFBR2QsS0FBTSxrQkFBaUJpRCxVQUFVLENBQUMvQyxJQUFJLEVBQUcsR0FBRSxDQUFDO01BQ2hFO01BQ0FGLEtBQUssR0FBR0EsS0FBSyxHQUFHLENBQUMsR0FBR2lELFVBQVUsQ0FBQy9ILE1BQU07SUFDdkMsQ0FBQyxNQUFNLElBQUkySCxTQUFTLEVBQUU7TUFDcEIsSUFBSVEsZ0JBQWdCLEdBQUcsQ0FBQ0MsU0FBUyxFQUFFQyxLQUFLLEtBQUs7UUFDM0MsTUFBTW5CLEdBQUcsR0FBR21CLEtBQUssR0FBRyxPQUFPLEdBQUcsRUFBRTtRQUNoQyxJQUFJRCxTQUFTLENBQUNwSSxNQUFNLEdBQUcsQ0FBQyxFQUFFO1VBQ3hCLElBQUltRyxZQUFZLEVBQUU7WUFDaEJILFFBQVEsQ0FBQ0osSUFBSSxDQUFFLEdBQUVzQixHQUFJLG9CQUFtQnBDLEtBQU0sV0FBVUEsS0FBSyxHQUFHLENBQUUsR0FBRSxDQUFDO1lBQ3JFbUIsTUFBTSxDQUFDTCxJQUFJLENBQUMxQixTQUFTLEVBQUUzRCxJQUFJLENBQUNDLFNBQVMsQ0FBQzRILFNBQVMsQ0FBQyxDQUFDO1lBQ2pEdEQsS0FBSyxJQUFJLENBQUM7VUFDWixDQUFDLE1BQU07WUFDTDtZQUNBLElBQUlaLFNBQVMsQ0FBQ0MsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRTtjQUMvQjtZQUNGO1lBQ0EsTUFBTTRELFVBQVUsR0FBRyxFQUFFO1lBQ3JCOUIsTUFBTSxDQUFDTCxJQUFJLENBQUMxQixTQUFTLENBQUM7WUFDdEJrRSxTQUFTLENBQUNuRSxPQUFPLENBQUMsQ0FBQ2dFLFFBQVEsRUFBRUMsU0FBUyxLQUFLO2NBQ3pDLElBQUlELFFBQVEsSUFBSSxJQUFJLEVBQUU7Z0JBQ3BCaEMsTUFBTSxDQUFDTCxJQUFJLENBQUNxQyxRQUFRLENBQUM7Z0JBQ3JCRixVQUFVLENBQUNuQyxJQUFJLENBQUUsSUFBR2QsS0FBSyxHQUFHLENBQUMsR0FBR29ELFNBQVUsRUFBQyxDQUFDO2NBQzlDO1lBQ0YsQ0FBQyxDQUFDO1lBQ0ZsQyxRQUFRLENBQUNKLElBQUksQ0FBRSxJQUFHZCxLQUFNLFNBQVFvQyxHQUFJLFFBQU9hLFVBQVUsQ0FBQy9DLElBQUksRUFBRyxHQUFFLENBQUM7WUFDaEVGLEtBQUssR0FBR0EsS0FBSyxHQUFHLENBQUMsR0FBR2lELFVBQVUsQ0FBQy9ILE1BQU07VUFDdkM7UUFDRixDQUFDLE1BQU0sSUFBSSxDQUFDcUksS0FBSyxFQUFFO1VBQ2pCcEMsTUFBTSxDQUFDTCxJQUFJLENBQUMxQixTQUFTLENBQUM7VUFDdEI4QixRQUFRLENBQUNKLElBQUksQ0FBRSxJQUFHZCxLQUFNLGVBQWMsQ0FBQztVQUN2Q0EsS0FBSyxHQUFHQSxLQUFLLEdBQUcsQ0FBQztRQUNuQixDQUFDLE1BQU07VUFDTDtVQUNBLElBQUl1RCxLQUFLLEVBQUU7WUFDVHJDLFFBQVEsQ0FBQ0osSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7VUFDMUIsQ0FBQyxNQUFNO1lBQ0xJLFFBQVEsQ0FBQ0osSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7VUFDMUI7UUFDRjtNQUNGLENBQUM7O01BQ0QsSUFBSVMsVUFBVSxDQUFDSSxHQUFHLEVBQUU7UUFDbEIwQixnQkFBZ0IsQ0FDZEcsZUFBQyxDQUFDQyxPQUFPLENBQUNsQyxVQUFVLENBQUNJLEdBQUcsRUFBRStCLEdBQUcsSUFBSUEsR0FBRyxDQUFDLEVBQ3JDLEtBQUssQ0FDTjtNQUNIO01BQ0EsSUFBSW5DLFVBQVUsQ0FBQ3lCLElBQUksRUFBRTtRQUNuQkssZ0JBQWdCLENBQ2RHLGVBQUMsQ0FBQ0MsT0FBTyxDQUFDbEMsVUFBVSxDQUFDeUIsSUFBSSxFQUFFVSxHQUFHLElBQUlBLEdBQUcsQ0FBQyxFQUN0QyxJQUFJLENBQ0w7TUFDSDtJQUNGLENBQUMsTUFBTSxJQUFJLE9BQU9uQyxVQUFVLENBQUNJLEdBQUcsS0FBSyxXQUFXLEVBQUU7TUFDaEQsTUFBTSxJQUFJbkIsYUFBSyxDQUFDQyxLQUFLLENBQUNELGFBQUssQ0FBQ0MsS0FBSyxDQUFDK0IsWUFBWSxFQUFFLGVBQWUsQ0FBQztJQUNsRSxDQUFDLE1BQU0sSUFBSSxPQUFPakIsVUFBVSxDQUFDeUIsSUFBSSxLQUFLLFdBQVcsRUFBRTtNQUNqRCxNQUFNLElBQUl4QyxhQUFLLENBQUNDLEtBQUssQ0FBQ0QsYUFBSyxDQUFDQyxLQUFLLENBQUMrQixZQUFZLEVBQUUsZ0JBQWdCLENBQUM7SUFDbkU7SUFFQSxJQUFJTSxLQUFLLENBQUNDLE9BQU8sQ0FBQ3hCLFVBQVUsQ0FBQ29DLElBQUksQ0FBQyxJQUFJdEMsWUFBWSxFQUFFO01BQ2xELElBQUl1Qyx5QkFBeUIsQ0FBQ3JDLFVBQVUsQ0FBQ29DLElBQUksQ0FBQyxFQUFFO1FBQzlDLElBQUksQ0FBQ0Usc0JBQXNCLENBQUN0QyxVQUFVLENBQUNvQyxJQUFJLENBQUMsRUFBRTtVQUM1QyxNQUFNLElBQUluRCxhQUFLLENBQUNDLEtBQUssQ0FDbkJELGFBQUssQ0FBQ0MsS0FBSyxDQUFDK0IsWUFBWSxFQUN4QixpREFBaUQsR0FBR2pCLFVBQVUsQ0FBQ29DLElBQUksQ0FDcEU7UUFDSDtRQUVBLEtBQUssSUFBSUcsQ0FBQyxHQUFHLENBQUMsRUFBRUEsQ0FBQyxHQUFHdkMsVUFBVSxDQUFDb0MsSUFBSSxDQUFDekksTUFBTSxFQUFFNEksQ0FBQyxJQUFJLENBQUMsRUFBRTtVQUNsRCxNQUFNaEgsS0FBSyxHQUFHaUgsbUJBQW1CLENBQUN4QyxVQUFVLENBQUNvQyxJQUFJLENBQUNHLENBQUMsQ0FBQyxDQUFDbEMsTUFBTSxDQUFDO1VBQzVETCxVQUFVLENBQUNvQyxJQUFJLENBQUNHLENBQUMsQ0FBQyxHQUFHaEgsS0FBSyxDQUFDa0gsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUc7UUFDL0M7UUFDQTlDLFFBQVEsQ0FBQ0osSUFBSSxDQUFFLDZCQUE0QmQsS0FBTSxXQUFVQSxLQUFLLEdBQUcsQ0FBRSxVQUFTLENBQUM7TUFDakYsQ0FBQyxNQUFNO1FBQ0xrQixRQUFRLENBQUNKLElBQUksQ0FBRSx1QkFBc0JkLEtBQU0sV0FBVUEsS0FBSyxHQUFHLENBQUUsVUFBUyxDQUFDO01BQzNFO01BQ0FtQixNQUFNLENBQUNMLElBQUksQ0FBQzFCLFNBQVMsRUFBRTNELElBQUksQ0FBQ0MsU0FBUyxDQUFDNkYsVUFBVSxDQUFDb0MsSUFBSSxDQUFDLENBQUM7TUFDdkQzRCxLQUFLLElBQUksQ0FBQztJQUNaLENBQUMsTUFBTSxJQUFJOEMsS0FBSyxDQUFDQyxPQUFPLENBQUN4QixVQUFVLENBQUNvQyxJQUFJLENBQUMsRUFBRTtNQUN6QyxJQUFJcEMsVUFBVSxDQUFDb0MsSUFBSSxDQUFDekksTUFBTSxLQUFLLENBQUMsRUFBRTtRQUNoQ2dHLFFBQVEsQ0FBQ0osSUFBSSxDQUFFLElBQUdkLEtBQU0sWUFBV0EsS0FBSyxHQUFHLENBQUUsRUFBQyxDQUFDO1FBQy9DbUIsTUFBTSxDQUFDTCxJQUFJLENBQUMxQixTQUFTLEVBQUVtQyxVQUFVLENBQUNvQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUNwRyxRQUFRLENBQUM7UUFDbkR5QyxLQUFLLElBQUksQ0FBQztNQUNaO0lBQ0Y7SUFFQSxJQUFJLE9BQU91QixVQUFVLENBQUNDLE9BQU8sS0FBSyxXQUFXLEVBQUU7TUFDN0MsSUFBSSxPQUFPRCxVQUFVLENBQUNDLE9BQU8sS0FBSyxRQUFRLElBQUlELFVBQVUsQ0FBQ0MsT0FBTyxDQUFDZSxhQUFhLEVBQUU7UUFDOUUsTUFBTSxJQUFJL0IsYUFBSyxDQUFDQyxLQUFLLENBQ25CRCxhQUFLLENBQUNDLEtBQUssQ0FBQytCLFlBQVksRUFDeEIsNEVBQTRFLENBQzdFO01BQ0gsQ0FBQyxNQUFNLElBQUlqQixVQUFVLENBQUNDLE9BQU8sRUFBRTtRQUM3Qk4sUUFBUSxDQUFDSixJQUFJLENBQUUsSUFBR2QsS0FBTSxtQkFBa0IsQ0FBQztNQUM3QyxDQUFDLE1BQU07UUFDTGtCLFFBQVEsQ0FBQ0osSUFBSSxDQUFFLElBQUdkLEtBQU0sZUFBYyxDQUFDO01BQ3pDO01BQ0FtQixNQUFNLENBQUNMLElBQUksQ0FBQzFCLFNBQVMsQ0FBQztNQUN0QlksS0FBSyxJQUFJLENBQUM7SUFDWjtJQUVBLElBQUl1QixVQUFVLENBQUMwQyxZQUFZLEVBQUU7TUFDM0IsTUFBTUMsR0FBRyxHQUFHM0MsVUFBVSxDQUFDMEMsWUFBWTtNQUNuQyxJQUFJLEVBQUVDLEdBQUcsWUFBWXBCLEtBQUssQ0FBQyxFQUFFO1FBQzNCLE1BQU0sSUFBSXRDLGFBQUssQ0FBQ0MsS0FBSyxDQUFDRCxhQUFLLENBQUNDLEtBQUssQ0FBQytCLFlBQVksRUFBRyxzQ0FBcUMsQ0FBQztNQUN6RjtNQUVBdEIsUUFBUSxDQUFDSixJQUFJLENBQUUsSUFBR2QsS0FBTSxhQUFZQSxLQUFLLEdBQUcsQ0FBRSxTQUFRLENBQUM7TUFDdkRtQixNQUFNLENBQUNMLElBQUksQ0FBQzFCLFNBQVMsRUFBRTNELElBQUksQ0FBQ0MsU0FBUyxDQUFDd0ksR0FBRyxDQUFDLENBQUM7TUFDM0NsRSxLQUFLLElBQUksQ0FBQztJQUNaO0lBRUEsSUFBSXVCLFVBQVUsQ0FBQzRDLEtBQUssRUFBRTtNQUNwQixNQUFNQyxNQUFNLEdBQUc3QyxVQUFVLENBQUM0QyxLQUFLLENBQUNFLE9BQU87TUFDdkMsSUFBSUMsUUFBUSxHQUFHLFNBQVM7TUFDeEIsSUFBSSxPQUFPRixNQUFNLEtBQUssUUFBUSxFQUFFO1FBQzlCLE1BQU0sSUFBSTVELGFBQUssQ0FBQ0MsS0FBSyxDQUFDRCxhQUFLLENBQUNDLEtBQUssQ0FBQytCLFlBQVksRUFBRyxzQ0FBcUMsQ0FBQztNQUN6RjtNQUNBLElBQUksQ0FBQzRCLE1BQU0sQ0FBQ0csS0FBSyxJQUFJLE9BQU9ILE1BQU0sQ0FBQ0csS0FBSyxLQUFLLFFBQVEsRUFBRTtRQUNyRCxNQUFNLElBQUkvRCxhQUFLLENBQUNDLEtBQUssQ0FBQ0QsYUFBSyxDQUFDQyxLQUFLLENBQUMrQixZQUFZLEVBQUcsb0NBQW1DLENBQUM7TUFDdkY7TUFDQSxJQUFJNEIsTUFBTSxDQUFDSSxTQUFTLElBQUksT0FBT0osTUFBTSxDQUFDSSxTQUFTLEtBQUssUUFBUSxFQUFFO1FBQzVELE1BQU0sSUFBSWhFLGFBQUssQ0FBQ0MsS0FBSyxDQUFDRCxhQUFLLENBQUNDLEtBQUssQ0FBQytCLFlBQVksRUFBRyx3Q0FBdUMsQ0FBQztNQUMzRixDQUFDLE1BQU0sSUFBSTRCLE1BQU0sQ0FBQ0ksU0FBUyxFQUFFO1FBQzNCRixRQUFRLEdBQUdGLE1BQU0sQ0FBQ0ksU0FBUztNQUM3QjtNQUNBLElBQUlKLE1BQU0sQ0FBQ0ssY0FBYyxJQUFJLE9BQU9MLE1BQU0sQ0FBQ0ssY0FBYyxLQUFLLFNBQVMsRUFBRTtRQUN2RSxNQUFNLElBQUlqRSxhQUFLLENBQUNDLEtBQUssQ0FDbkJELGFBQUssQ0FBQ0MsS0FBSyxDQUFDK0IsWUFBWSxFQUN2Qiw4Q0FBNkMsQ0FDL0M7TUFDSCxDQUFDLE1BQU0sSUFBSTRCLE1BQU0sQ0FBQ0ssY0FBYyxFQUFFO1FBQ2hDLE1BQU0sSUFBSWpFLGFBQUssQ0FBQ0MsS0FBSyxDQUNuQkQsYUFBSyxDQUFDQyxLQUFLLENBQUMrQixZQUFZLEVBQ3ZCLG9HQUFtRyxDQUNyRztNQUNIO01BQ0EsSUFBSTRCLE1BQU0sQ0FBQ00sbUJBQW1CLElBQUksT0FBT04sTUFBTSxDQUFDTSxtQkFBbUIsS0FBSyxTQUFTLEVBQUU7UUFDakYsTUFBTSxJQUFJbEUsYUFBSyxDQUFDQyxLQUFLLENBQ25CRCxhQUFLLENBQUNDLEtBQUssQ0FBQytCLFlBQVksRUFDdkIsbURBQWtELENBQ3BEO01BQ0gsQ0FBQyxNQUFNLElBQUk0QixNQUFNLENBQUNNLG1CQUFtQixLQUFLLEtBQUssRUFBRTtRQUMvQyxNQUFNLElBQUlsRSxhQUFLLENBQUNDLEtBQUssQ0FDbkJELGFBQUssQ0FBQ0MsS0FBSyxDQUFDK0IsWUFBWSxFQUN2QiwyRkFBMEYsQ0FDNUY7TUFDSDtNQUNBdEIsUUFBUSxDQUFDSixJQUFJLENBQ1YsZ0JBQWVkLEtBQU0sTUFBS0EsS0FBSyxHQUFHLENBQUUseUJBQXdCQSxLQUFLLEdBQUcsQ0FBRSxNQUFLQSxLQUFLLEdBQUcsQ0FBRSxHQUFFLENBQ3pGO01BQ0RtQixNQUFNLENBQUNMLElBQUksQ0FBQ3dELFFBQVEsRUFBRWxGLFNBQVMsRUFBRWtGLFFBQVEsRUFBRUYsTUFBTSxDQUFDRyxLQUFLLENBQUM7TUFDeER2RSxLQUFLLElBQUksQ0FBQztJQUNaO0lBRUEsSUFBSXVCLFVBQVUsQ0FBQ29ELFdBQVcsRUFBRTtNQUMxQixNQUFNbEMsS0FBSyxHQUFHbEIsVUFBVSxDQUFDb0QsV0FBVztNQUNwQyxNQUFNQyxRQUFRLEdBQUdyRCxVQUFVLENBQUNzRCxZQUFZO01BQ3hDLE1BQU1DLFlBQVksR0FBR0YsUUFBUSxHQUFHLElBQUksR0FBRyxJQUFJO01BQzNDMUQsUUFBUSxDQUFDSixJQUFJLENBQ1Ysc0JBQXFCZCxLQUFNLDJCQUEwQkEsS0FBSyxHQUFHLENBQUUsTUFDOURBLEtBQUssR0FBRyxDQUNULG9CQUFtQkEsS0FBSyxHQUFHLENBQUUsRUFBQyxDQUNoQztNQUNEb0IsS0FBSyxDQUFDTixJQUFJLENBQ1Asc0JBQXFCZCxLQUFNLDJCQUEwQkEsS0FBSyxHQUFHLENBQUUsTUFDOURBLEtBQUssR0FBRyxDQUNULGtCQUFpQixDQUNuQjtNQUNEbUIsTUFBTSxDQUFDTCxJQUFJLENBQUMxQixTQUFTLEVBQUVxRCxLQUFLLENBQUNDLFNBQVMsRUFBRUQsS0FBSyxDQUFDRSxRQUFRLEVBQUVtQyxZQUFZLENBQUM7TUFDckU5RSxLQUFLLElBQUksQ0FBQztJQUNaO0lBRUEsSUFBSXVCLFVBQVUsQ0FBQ3dELE9BQU8sSUFBSXhELFVBQVUsQ0FBQ3dELE9BQU8sQ0FBQ0MsSUFBSSxFQUFFO01BQ2pELE1BQU1DLEdBQUcsR0FBRzFELFVBQVUsQ0FBQ3dELE9BQU8sQ0FBQ0MsSUFBSTtNQUNuQyxNQUFNRSxJQUFJLEdBQUdELEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQ3ZDLFNBQVM7TUFDN0IsTUFBTXlDLE1BQU0sR0FBR0YsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDdEMsUUFBUTtNQUM5QixNQUFNeUMsS0FBSyxHQUFHSCxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUN2QyxTQUFTO01BQzlCLE1BQU0yQyxHQUFHLEdBQUdKLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQ3RDLFFBQVE7TUFFM0J6QixRQUFRLENBQUNKLElBQUksQ0FBRSxJQUFHZCxLQUFNLG9CQUFtQkEsS0FBSyxHQUFHLENBQUUsT0FBTSxDQUFDO01BQzVEbUIsTUFBTSxDQUFDTCxJQUFJLENBQUMxQixTQUFTLEVBQUcsS0FBSThGLElBQUssS0FBSUMsTUFBTyxPQUFNQyxLQUFNLEtBQUlDLEdBQUksSUFBRyxDQUFDO01BQ3BFckYsS0FBSyxJQUFJLENBQUM7SUFDWjtJQUVBLElBQUl1QixVQUFVLENBQUMrRCxVQUFVLElBQUkvRCxVQUFVLENBQUMrRCxVQUFVLENBQUNDLGFBQWEsRUFBRTtNQUNoRSxNQUFNQyxZQUFZLEdBQUdqRSxVQUFVLENBQUMrRCxVQUFVLENBQUNDLGFBQWE7TUFDeEQsSUFBSSxFQUFFQyxZQUFZLFlBQVkxQyxLQUFLLENBQUMsSUFBSTBDLFlBQVksQ0FBQ3RLLE1BQU0sR0FBRyxDQUFDLEVBQUU7UUFDL0QsTUFBTSxJQUFJc0YsYUFBSyxDQUFDQyxLQUFLLENBQ25CRCxhQUFLLENBQUNDLEtBQUssQ0FBQytCLFlBQVksRUFDeEIsdUZBQXVGLENBQ3hGO01BQ0g7TUFDQTtNQUNBLElBQUlDLEtBQUssR0FBRytDLFlBQVksQ0FBQyxDQUFDLENBQUM7TUFDM0IsSUFBSS9DLEtBQUssWUFBWUssS0FBSyxJQUFJTCxLQUFLLENBQUN2SCxNQUFNLEtBQUssQ0FBQyxFQUFFO1FBQ2hEdUgsS0FBSyxHQUFHLElBQUlqQyxhQUFLLENBQUNpRixRQUFRLENBQUNoRCxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUVBLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNoRCxDQUFDLE1BQU0sSUFBSSxDQUFDaUQsYUFBYSxDQUFDQyxXQUFXLENBQUNsRCxLQUFLLENBQUMsRUFBRTtRQUM1QyxNQUFNLElBQUlqQyxhQUFLLENBQUNDLEtBQUssQ0FDbkJELGFBQUssQ0FBQ0MsS0FBSyxDQUFDK0IsWUFBWSxFQUN4Qix1REFBdUQsQ0FDeEQ7TUFDSDtNQUNBaEMsYUFBSyxDQUFDaUYsUUFBUSxDQUFDRyxTQUFTLENBQUNuRCxLQUFLLENBQUNFLFFBQVEsRUFBRUYsS0FBSyxDQUFDQyxTQUFTLENBQUM7TUFDekQ7TUFDQSxNQUFNa0MsUUFBUSxHQUFHWSxZQUFZLENBQUMsQ0FBQyxDQUFDO01BQ2hDLElBQUlLLEtBQUssQ0FBQ2pCLFFBQVEsQ0FBQyxJQUFJQSxRQUFRLEdBQUcsQ0FBQyxFQUFFO1FBQ25DLE1BQU0sSUFBSXBFLGFBQUssQ0FBQ0MsS0FBSyxDQUNuQkQsYUFBSyxDQUFDQyxLQUFLLENBQUMrQixZQUFZLEVBQ3hCLHNEQUFzRCxDQUN2RDtNQUNIO01BQ0EsTUFBTXNDLFlBQVksR0FBR0YsUUFBUSxHQUFHLElBQUksR0FBRyxJQUFJO01BQzNDMUQsUUFBUSxDQUFDSixJQUFJLENBQ1Ysc0JBQXFCZCxLQUFNLDJCQUEwQkEsS0FBSyxHQUFHLENBQUUsTUFDOURBLEtBQUssR0FBRyxDQUNULG9CQUFtQkEsS0FBSyxHQUFHLENBQUUsRUFBQyxDQUNoQztNQUNEbUIsTUFBTSxDQUFDTCxJQUFJLENBQUMxQixTQUFTLEVBQUVxRCxLQUFLLENBQUNDLFNBQVMsRUFBRUQsS0FBSyxDQUFDRSxRQUFRLEVBQUVtQyxZQUFZLENBQUM7TUFDckU5RSxLQUFLLElBQUksQ0FBQztJQUNaO0lBRUEsSUFBSXVCLFVBQVUsQ0FBQytELFVBQVUsSUFBSS9ELFVBQVUsQ0FBQytELFVBQVUsQ0FBQ1EsUUFBUSxFQUFFO01BQzNELE1BQU1DLE9BQU8sR0FBR3hFLFVBQVUsQ0FBQytELFVBQVUsQ0FBQ1EsUUFBUTtNQUM5QyxJQUFJRSxNQUFNO01BQ1YsSUFBSSxPQUFPRCxPQUFPLEtBQUssUUFBUSxJQUFJQSxPQUFPLENBQUNoSixNQUFNLEtBQUssU0FBUyxFQUFFO1FBQy9ELElBQUksQ0FBQ2dKLE9BQU8sQ0FBQ0UsV0FBVyxJQUFJRixPQUFPLENBQUNFLFdBQVcsQ0FBQy9LLE1BQU0sR0FBRyxDQUFDLEVBQUU7VUFDMUQsTUFBTSxJQUFJc0YsYUFBSyxDQUFDQyxLQUFLLENBQ25CRCxhQUFLLENBQUNDLEtBQUssQ0FBQytCLFlBQVksRUFDeEIsbUZBQW1GLENBQ3BGO1FBQ0g7UUFDQXdELE1BQU0sR0FBR0QsT0FBTyxDQUFDRSxXQUFXO01BQzlCLENBQUMsTUFBTSxJQUFJRixPQUFPLFlBQVlqRCxLQUFLLEVBQUU7UUFDbkMsSUFBSWlELE9BQU8sQ0FBQzdLLE1BQU0sR0FBRyxDQUFDLEVBQUU7VUFDdEIsTUFBTSxJQUFJc0YsYUFBSyxDQUFDQyxLQUFLLENBQ25CRCxhQUFLLENBQUNDLEtBQUssQ0FBQytCLFlBQVksRUFDeEIsb0VBQW9FLENBQ3JFO1FBQ0g7UUFDQXdELE1BQU0sR0FBR0QsT0FBTztNQUNsQixDQUFDLE1BQU07UUFDTCxNQUFNLElBQUl2RixhQUFLLENBQUNDLEtBQUssQ0FDbkJELGFBQUssQ0FBQ0MsS0FBSyxDQUFDK0IsWUFBWSxFQUN4QixzRkFBc0YsQ0FDdkY7TUFDSDtNQUNBd0QsTUFBTSxHQUFHQSxNQUFNLENBQ1psRyxHQUFHLENBQUMyQyxLQUFLLElBQUk7UUFDWixJQUFJQSxLQUFLLFlBQVlLLEtBQUssSUFBSUwsS0FBSyxDQUFDdkgsTUFBTSxLQUFLLENBQUMsRUFBRTtVQUNoRHNGLGFBQUssQ0FBQ2lGLFFBQVEsQ0FBQ0csU0FBUyxDQUFDbkQsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFQSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7VUFDNUMsT0FBUSxJQUFHQSxLQUFLLENBQUMsQ0FBQyxDQUFFLEtBQUlBLEtBQUssQ0FBQyxDQUFDLENBQUUsR0FBRTtRQUNyQztRQUNBLElBQUksT0FBT0EsS0FBSyxLQUFLLFFBQVEsSUFBSUEsS0FBSyxDQUFDMUYsTUFBTSxLQUFLLFVBQVUsRUFBRTtVQUM1RCxNQUFNLElBQUl5RCxhQUFLLENBQUNDLEtBQUssQ0FBQ0QsYUFBSyxDQUFDQyxLQUFLLENBQUMrQixZQUFZLEVBQUUsc0JBQXNCLENBQUM7UUFDekUsQ0FBQyxNQUFNO1VBQ0xoQyxhQUFLLENBQUNpRixRQUFRLENBQUNHLFNBQVMsQ0FBQ25ELEtBQUssQ0FBQ0UsUUFBUSxFQUFFRixLQUFLLENBQUNDLFNBQVMsQ0FBQztRQUMzRDtRQUNBLE9BQVEsSUFBR0QsS0FBSyxDQUFDQyxTQUFVLEtBQUlELEtBQUssQ0FBQ0UsUUFBUyxHQUFFO01BQ2xELENBQUMsQ0FBQyxDQUNEekMsSUFBSSxDQUFDLElBQUksQ0FBQztNQUViZ0IsUUFBUSxDQUFDSixJQUFJLENBQUUsSUFBR2QsS0FBTSxvQkFBbUJBLEtBQUssR0FBRyxDQUFFLFdBQVUsQ0FBQztNQUNoRW1CLE1BQU0sQ0FBQ0wsSUFBSSxDQUFDMUIsU0FBUyxFQUFHLElBQUc0RyxNQUFPLEdBQUUsQ0FBQztNQUNyQ2hHLEtBQUssSUFBSSxDQUFDO0lBQ1o7SUFDQSxJQUFJdUIsVUFBVSxDQUFDMkUsY0FBYyxJQUFJM0UsVUFBVSxDQUFDMkUsY0FBYyxDQUFDQyxNQUFNLEVBQUU7TUFDakUsTUFBTTFELEtBQUssR0FBR2xCLFVBQVUsQ0FBQzJFLGNBQWMsQ0FBQ0MsTUFBTTtNQUM5QyxJQUFJLE9BQU8xRCxLQUFLLEtBQUssUUFBUSxJQUFJQSxLQUFLLENBQUMxRixNQUFNLEtBQUssVUFBVSxFQUFFO1FBQzVELE1BQU0sSUFBSXlELGFBQUssQ0FBQ0MsS0FBSyxDQUNuQkQsYUFBSyxDQUFDQyxLQUFLLENBQUMrQixZQUFZLEVBQ3hCLG9EQUFvRCxDQUNyRDtNQUNILENBQUMsTUFBTTtRQUNMaEMsYUFBSyxDQUFDaUYsUUFBUSxDQUFDRyxTQUFTLENBQUNuRCxLQUFLLENBQUNFLFFBQVEsRUFBRUYsS0FBSyxDQUFDQyxTQUFTLENBQUM7TUFDM0Q7TUFDQXhCLFFBQVEsQ0FBQ0osSUFBSSxDQUFFLElBQUdkLEtBQU0sc0JBQXFCQSxLQUFLLEdBQUcsQ0FBRSxTQUFRLENBQUM7TUFDaEVtQixNQUFNLENBQUNMLElBQUksQ0FBQzFCLFNBQVMsRUFBRyxJQUFHcUQsS0FBSyxDQUFDQyxTQUFVLEtBQUlELEtBQUssQ0FBQ0UsUUFBUyxHQUFFLENBQUM7TUFDakUzQyxLQUFLLElBQUksQ0FBQztJQUNaO0lBRUEsSUFBSXVCLFVBQVUsQ0FBQ0ssTUFBTSxFQUFFO01BQ3JCLElBQUl3RSxLQUFLLEdBQUc3RSxVQUFVLENBQUNLLE1BQU07TUFDN0IsSUFBSXlFLFFBQVEsR0FBRyxHQUFHO01BQ2xCLE1BQU1DLElBQUksR0FBRy9FLFVBQVUsQ0FBQ2dGLFFBQVE7TUFDaEMsSUFBSUQsSUFBSSxFQUFFO1FBQ1IsSUFBSUEsSUFBSSxDQUFDakgsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRTtVQUMxQmdILFFBQVEsR0FBRyxJQUFJO1FBQ2pCO1FBQ0EsSUFBSUMsSUFBSSxDQUFDakgsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRTtVQUMxQitHLEtBQUssR0FBR0ksZ0JBQWdCLENBQUNKLEtBQUssQ0FBQztRQUNqQztNQUNGO01BRUEsTUFBTW5KLElBQUksR0FBR2dELGlCQUFpQixDQUFDYixTQUFTLENBQUM7TUFDekNnSCxLQUFLLEdBQUdyQyxtQkFBbUIsQ0FBQ3FDLEtBQUssQ0FBQztNQUVsQ2xGLFFBQVEsQ0FBQ0osSUFBSSxDQUFFLElBQUdkLEtBQU0sUUFBT3FHLFFBQVMsTUFBS3JHLEtBQUssR0FBRyxDQUFFLE9BQU0sQ0FBQztNQUM5RG1CLE1BQU0sQ0FBQ0wsSUFBSSxDQUFDN0QsSUFBSSxFQUFFbUosS0FBSyxDQUFDO01BQ3hCcEcsS0FBSyxJQUFJLENBQUM7SUFDWjtJQUVBLElBQUl1QixVQUFVLENBQUN4RSxNQUFNLEtBQUssU0FBUyxFQUFFO01BQ25DLElBQUlzRSxZQUFZLEVBQUU7UUFDaEJILFFBQVEsQ0FBQ0osSUFBSSxDQUFFLG1CQUFrQmQsS0FBTSxXQUFVQSxLQUFLLEdBQUcsQ0FBRSxHQUFFLENBQUM7UUFDOURtQixNQUFNLENBQUNMLElBQUksQ0FBQzFCLFNBQVMsRUFBRTNELElBQUksQ0FBQ0MsU0FBUyxDQUFDLENBQUM2RixVQUFVLENBQUMsQ0FBQyxDQUFDO1FBQ3BEdkIsS0FBSyxJQUFJLENBQUM7TUFDWixDQUFDLE1BQU07UUFDTGtCLFFBQVEsQ0FBQ0osSUFBSSxDQUFFLElBQUdkLEtBQU0sWUFBV0EsS0FBSyxHQUFHLENBQUUsRUFBQyxDQUFDO1FBQy9DbUIsTUFBTSxDQUFDTCxJQUFJLENBQUMxQixTQUFTLEVBQUVtQyxVQUFVLENBQUNoRSxRQUFRLENBQUM7UUFDM0N5QyxLQUFLLElBQUksQ0FBQztNQUNaO0lBQ0Y7SUFFQSxJQUFJdUIsVUFBVSxDQUFDeEUsTUFBTSxLQUFLLE1BQU0sRUFBRTtNQUNoQ21FLFFBQVEsQ0FBQ0osSUFBSSxDQUFFLElBQUdkLEtBQU0sWUFBV0EsS0FBSyxHQUFHLENBQUUsRUFBQyxDQUFDO01BQy9DbUIsTUFBTSxDQUFDTCxJQUFJLENBQUMxQixTQUFTLEVBQUVtQyxVQUFVLENBQUN2RSxHQUFHLENBQUM7TUFDdENnRCxLQUFLLElBQUksQ0FBQztJQUNaO0lBRUEsSUFBSXVCLFVBQVUsQ0FBQ3hFLE1BQU0sS0FBSyxVQUFVLEVBQUU7TUFDcENtRSxRQUFRLENBQUNKLElBQUksQ0FBRSxJQUFHZCxLQUFNLG1CQUFrQkEsS0FBSyxHQUFHLENBQUUsTUFBS0EsS0FBSyxHQUFHLENBQUUsR0FBRSxDQUFDO01BQ3RFbUIsTUFBTSxDQUFDTCxJQUFJLENBQUMxQixTQUFTLEVBQUVtQyxVQUFVLENBQUNtQixTQUFTLEVBQUVuQixVQUFVLENBQUNvQixRQUFRLENBQUM7TUFDakUzQyxLQUFLLElBQUksQ0FBQztJQUNaO0lBRUEsSUFBSXVCLFVBQVUsQ0FBQ3hFLE1BQU0sS0FBSyxTQUFTLEVBQUU7TUFDbkMsTUFBTUQsS0FBSyxHQUFHMkosbUJBQW1CLENBQUNsRixVQUFVLENBQUMwRSxXQUFXLENBQUM7TUFDekQvRSxRQUFRLENBQUNKLElBQUksQ0FBRSxJQUFHZCxLQUFNLGFBQVlBLEtBQUssR0FBRyxDQUFFLFdBQVUsQ0FBQztNQUN6RG1CLE1BQU0sQ0FBQ0wsSUFBSSxDQUFDMUIsU0FBUyxFQUFFdEMsS0FBSyxDQUFDO01BQzdCa0QsS0FBSyxJQUFJLENBQUM7SUFDWjtJQUVBdkMsTUFBTSxDQUFDeUIsSUFBSSxDQUFDdkQsd0JBQXdCLENBQUMsQ0FBQ3dELE9BQU8sQ0FBQ3VILEdBQUcsSUFBSTtNQUNuRCxJQUFJbkYsVUFBVSxDQUFDbUYsR0FBRyxDQUFDLElBQUluRixVQUFVLENBQUNtRixHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUU7UUFDNUMsTUFBTUMsWUFBWSxHQUFHaEwsd0JBQXdCLENBQUMrSyxHQUFHLENBQUM7UUFDbEQsSUFBSXBFLG1CQUFtQjtRQUN2QixJQUFJbkYsYUFBYSxHQUFHTixlQUFlLENBQUMwRSxVQUFVLENBQUNtRixHQUFHLENBQUMsQ0FBQztRQUVwRCxJQUFJdEgsU0FBUyxDQUFDQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFO1VBQy9CLE1BQU1qQyxRQUFRLEdBQUdGLHVCQUF1QixDQUFDcUUsVUFBVSxDQUFDbUYsR0FBRyxDQUFDLENBQUM7VUFDekRwRSxtQkFBbUIsR0FBR2xGLFFBQVEsR0FDekIsVUFBUzZDLGlCQUFpQixDQUFDYixTQUFTLENBQUUsUUFBT2hDLFFBQVMsR0FBRSxHQUN6RDZDLGlCQUFpQixDQUFDYixTQUFTLENBQUM7UUFDbEMsQ0FBQyxNQUFNO1VBQ0wsSUFBSSxPQUFPakMsYUFBYSxLQUFLLFFBQVEsSUFBSUEsYUFBYSxDQUFDb0YsYUFBYSxFQUFFO1lBQ3BFLElBQUlsRSxNQUFNLENBQUNFLE1BQU0sQ0FBQ2EsU0FBUyxDQUFDLENBQUM3RCxJQUFJLEtBQUssTUFBTSxFQUFFO2NBQzVDLE1BQU0sSUFBSWlGLGFBQUssQ0FBQ0MsS0FBSyxDQUNuQkQsYUFBSyxDQUFDQyxLQUFLLENBQUMrQixZQUFZLEVBQ3hCLGdEQUFnRCxDQUNqRDtZQUNIO1lBQ0EsTUFBTW9FLFlBQVksR0FBR3ZNLEtBQUssQ0FBQ3dNLGtCQUFrQixDQUFDMUosYUFBYSxDQUFDb0YsYUFBYSxDQUFDO1lBQzFFLElBQUlxRSxZQUFZLENBQUNFLE1BQU0sS0FBSyxTQUFTLEVBQUU7Y0FDckMzSixhQUFhLEdBQUdOLGVBQWUsQ0FBQytKLFlBQVksQ0FBQ0csTUFBTSxDQUFDO1lBQ3RELENBQUMsTUFBTTtjQUNMQyxPQUFPLENBQUNDLEtBQUssQ0FBQyxtQ0FBbUMsRUFBRUwsWUFBWSxDQUFDO2NBQ2hFLE1BQU0sSUFBSXBHLGFBQUssQ0FBQ0MsS0FBSyxDQUNuQkQsYUFBSyxDQUFDQyxLQUFLLENBQUMrQixZQUFZLEVBQ3ZCLHNCQUFxQnJGLGFBQWEsQ0FBQ29GLGFBQWMsWUFBV3FFLFlBQVksQ0FBQ00sSUFBSyxFQUFDLENBQ2pGO1lBQ0g7VUFDRjtVQUNBNUUsbUJBQW1CLEdBQUksSUFBR3RDLEtBQUssRUFBRyxPQUFNO1VBQ3hDbUIsTUFBTSxDQUFDTCxJQUFJLENBQUMxQixTQUFTLENBQUM7UUFDeEI7UUFDQStCLE1BQU0sQ0FBQ0wsSUFBSSxDQUFDM0QsYUFBYSxDQUFDO1FBQzFCK0QsUUFBUSxDQUFDSixJQUFJLENBQUUsR0FBRXdCLG1CQUFvQixJQUFHcUUsWUFBYSxLQUFJM0csS0FBSyxFQUFHLEVBQUMsQ0FBQztNQUNyRTtJQUNGLENBQUMsQ0FBQztJQUVGLElBQUlzQixxQkFBcUIsS0FBS0osUUFBUSxDQUFDaEcsTUFBTSxFQUFFO01BQzdDLE1BQU0sSUFBSXNGLGFBQUssQ0FBQ0MsS0FBSyxDQUNuQkQsYUFBSyxDQUFDQyxLQUFLLENBQUMwRyxtQkFBbUIsRUFDOUIsZ0RBQStDMUwsSUFBSSxDQUFDQyxTQUFTLENBQUM2RixVQUFVLENBQUUsRUFBQyxDQUM3RTtJQUNIO0VBQ0Y7RUFDQUosTUFBTSxHQUFHQSxNQUFNLENBQUNyQixHQUFHLENBQUN4QyxjQUFjLENBQUM7RUFDbkMsT0FBTztJQUFFNEUsT0FBTyxFQUFFaEIsUUFBUSxDQUFDaEIsSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUFFaUIsTUFBTTtJQUFFQztFQUFNLENBQUM7QUFDM0QsQ0FBQztBQUVNLE1BQU1nRyxzQkFBc0IsQ0FBMkI7RUFJNUQ7O0VBUUFDLFdBQVcsQ0FBQztJQUFFQyxHQUFHO0lBQUVDLGdCQUFnQixHQUFHLEVBQUU7SUFBRUMsZUFBZSxHQUFHLENBQUM7RUFBTyxDQUFDLEVBQUU7SUFDckUsSUFBSSxDQUFDQyxpQkFBaUIsR0FBR0YsZ0JBQWdCO0lBQ3pDLElBQUksQ0FBQ0csaUJBQWlCLEdBQUcsQ0FBQyxDQUFDRixlQUFlLENBQUNFLGlCQUFpQjtJQUM1RCxPQUFPRixlQUFlLENBQUNFLGlCQUFpQjtJQUV4QyxNQUFNO01BQUVDLE1BQU07TUFBRUM7SUFBSSxDQUFDLEdBQUcsSUFBQUMsNEJBQVksRUFBQ1AsR0FBRyxFQUFFRSxlQUFlLENBQUM7SUFDMUQsSUFBSSxDQUFDTSxPQUFPLEdBQUdILE1BQU07SUFDckIsSUFBSSxDQUFDSSxTQUFTLEdBQUcsTUFBTSxDQUFDLENBQUM7SUFDekIsSUFBSSxDQUFDQyxJQUFJLEdBQUdKLEdBQUc7SUFDZixJQUFJLENBQUNLLEtBQUssR0FBRyxJQUFBQyxRQUFNLEdBQUU7SUFDckIsSUFBSSxDQUFDQyxtQkFBbUIsR0FBRyxLQUFLO0VBQ2xDO0VBRUFDLEtBQUssQ0FBQ0MsUUFBb0IsRUFBUTtJQUNoQyxJQUFJLENBQUNOLFNBQVMsR0FBR00sUUFBUTtFQUMzQjs7RUFFQTtFQUNBQyxzQkFBc0IsQ0FBQ3RILEtBQWEsRUFBRXVILE9BQWdCLEdBQUcsS0FBSyxFQUFFO0lBQzlELElBQUlBLE9BQU8sRUFBRTtNQUNYLE9BQU8saUNBQWlDLEdBQUd2SCxLQUFLO0lBQ2xELENBQUMsTUFBTTtNQUNMLE9BQU8sd0JBQXdCLEdBQUdBLEtBQUs7SUFDekM7RUFDRjtFQUVBd0gsY0FBYyxHQUFHO0lBQ2YsSUFBSSxJQUFJLENBQUNDLE9BQU8sRUFBRTtNQUNoQixJQUFJLENBQUNBLE9BQU8sQ0FBQ0MsSUFBSSxFQUFFO01BQ25CLE9BQU8sSUFBSSxDQUFDRCxPQUFPO0lBQ3JCO0lBQ0EsSUFBSSxDQUFDLElBQUksQ0FBQ1gsT0FBTyxFQUFFO01BQ2pCO0lBQ0Y7SUFDQSxJQUFJLENBQUNBLE9BQU8sQ0FBQ2EsS0FBSyxDQUFDQyxHQUFHLEVBQUU7RUFDMUI7RUFFQSxNQUFNQyxlQUFlLEdBQUc7SUFDdEIsSUFBSSxDQUFDLElBQUksQ0FBQ0osT0FBTyxJQUFJLElBQUksQ0FBQ2YsaUJBQWlCLEVBQUU7TUFDM0MsSUFBSSxDQUFDZSxPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUNYLE9BQU8sQ0FBQ2dCLE9BQU8sQ0FBQztRQUFFQyxNQUFNLEVBQUU7TUFBSyxDQUFDLENBQUM7TUFDM0QsSUFBSSxDQUFDTixPQUFPLENBQUNkLE1BQU0sQ0FBQ3FCLEVBQUUsQ0FBQyxjQUFjLEVBQUVDLElBQUksSUFBSTtRQUM3QyxNQUFNQyxPQUFPLEdBQUd6TixJQUFJLENBQUMwTixLQUFLLENBQUNGLElBQUksQ0FBQ0MsT0FBTyxDQUFDO1FBQ3hDLElBQUlBLE9BQU8sQ0FBQ0UsUUFBUSxLQUFLLElBQUksQ0FBQ25CLEtBQUssRUFBRTtVQUNuQyxJQUFJLENBQUNGLFNBQVMsRUFBRTtRQUNsQjtNQUNGLENBQUMsQ0FBQztNQUNGLE1BQU0sSUFBSSxDQUFDVSxPQUFPLENBQUNZLElBQUksQ0FBQyxZQUFZLEVBQUUsZUFBZSxDQUFDO0lBQ3hEO0VBQ0Y7RUFFQUMsbUJBQW1CLEdBQUc7SUFDcEIsSUFBSSxJQUFJLENBQUNiLE9BQU8sRUFBRTtNQUNoQixJQUFJLENBQUNBLE9BQU8sQ0FDVFksSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUMsZUFBZSxFQUFFO1FBQUVELFFBQVEsRUFBRSxJQUFJLENBQUNuQjtNQUFNLENBQUMsQ0FBQyxDQUFDLENBQ25Fc0IsS0FBSyxDQUFDdEMsS0FBSyxJQUFJO1FBQ2RELE9BQU8sQ0FBQzdMLEdBQUcsQ0FBQyxtQkFBbUIsRUFBRThMLEtBQUssQ0FBQyxDQUFDLENBQUM7TUFDM0MsQ0FBQyxDQUFDO0lBQ047RUFDRjs7RUFFQSxNQUFNdUMsNkJBQTZCLENBQUNDLElBQVMsRUFBRTtJQUM3Q0EsSUFBSSxHQUFHQSxJQUFJLElBQUksSUFBSSxDQUFDM0IsT0FBTztJQUMzQixNQUFNMkIsSUFBSSxDQUNQSixJQUFJLENBQ0gsbUlBQW1JLENBQ3BJLENBQ0FFLEtBQUssQ0FBQ3RDLEtBQUssSUFBSTtNQUNkLE1BQU1BLEtBQUs7SUFDYixDQUFDLENBQUM7RUFDTjtFQUVBLE1BQU15QyxXQUFXLENBQUN6TSxJQUFZLEVBQUU7SUFDOUIsT0FBTyxJQUFJLENBQUM2SyxPQUFPLENBQUM2QixHQUFHLENBQ3JCLCtFQUErRSxFQUMvRSxDQUFDMU0sSUFBSSxDQUFDLEVBQ04yTSxDQUFDLElBQUlBLENBQUMsQ0FBQ0MsTUFBTSxDQUNkO0VBQ0g7RUFFQSxNQUFNQyx3QkFBd0IsQ0FBQ3hMLFNBQWlCLEVBQUV5TCxJQUFTLEVBQUU7SUFDM0QsTUFBTSxJQUFJLENBQUNqQyxPQUFPLENBQUNrQyxJQUFJLENBQUMsNkJBQTZCLEVBQUUsTUFBTUMsQ0FBQyxJQUFJO01BQ2hFLE1BQU05SSxNQUFNLEdBQUcsQ0FBQzdDLFNBQVMsRUFBRSxRQUFRLEVBQUUsdUJBQXVCLEVBQUU3QyxJQUFJLENBQUNDLFNBQVMsQ0FBQ3FPLElBQUksQ0FBQyxDQUFDO01BQ25GLE1BQU1FLENBQUMsQ0FBQ1osSUFBSSxDQUNULHlHQUF3RyxFQUN6R2xJLE1BQU0sQ0FDUDtJQUNILENBQUMsQ0FBQztJQUNGLElBQUksQ0FBQ21JLG1CQUFtQixFQUFFO0VBQzVCO0VBRUEsTUFBTVksMEJBQTBCLENBQzlCNUwsU0FBaUIsRUFDakI2TCxnQkFBcUIsRUFDckJDLGVBQW9CLEdBQUcsQ0FBQyxDQUFDLEVBQ3pCN0wsTUFBVyxFQUNYa0wsSUFBVSxFQUNLO0lBQ2ZBLElBQUksR0FBR0EsSUFBSSxJQUFJLElBQUksQ0FBQzNCLE9BQU87SUFDM0IsTUFBTXVDLElBQUksR0FBRyxJQUFJO0lBQ2pCLElBQUlGLGdCQUFnQixLQUFLOU0sU0FBUyxFQUFFO01BQ2xDLE9BQU9pTixPQUFPLENBQUNDLE9BQU8sRUFBRTtJQUMxQjtJQUNBLElBQUk5TSxNQUFNLENBQUN5QixJQUFJLENBQUNrTCxlQUFlLENBQUMsQ0FBQ2xQLE1BQU0sS0FBSyxDQUFDLEVBQUU7TUFDN0NrUCxlQUFlLEdBQUc7UUFBRUksSUFBSSxFQUFFO1VBQUVDLEdBQUcsRUFBRTtRQUFFO01BQUUsQ0FBQztJQUN4QztJQUNBLE1BQU1DLGNBQWMsR0FBRyxFQUFFO0lBQ3pCLE1BQU1DLGVBQWUsR0FBRyxFQUFFO0lBQzFCbE4sTUFBTSxDQUFDeUIsSUFBSSxDQUFDaUwsZ0JBQWdCLENBQUMsQ0FBQ2hMLE9BQU8sQ0FBQ2xDLElBQUksSUFBSTtNQUM1QyxNQUFNNEQsS0FBSyxHQUFHc0osZ0JBQWdCLENBQUNsTixJQUFJLENBQUM7TUFDcEMsSUFBSW1OLGVBQWUsQ0FBQ25OLElBQUksQ0FBQyxJQUFJNEQsS0FBSyxDQUFDakIsSUFBSSxLQUFLLFFBQVEsRUFBRTtRQUNwRCxNQUFNLElBQUlZLGFBQUssQ0FBQ0MsS0FBSyxDQUFDRCxhQUFLLENBQUNDLEtBQUssQ0FBQ21LLGFBQWEsRUFBRyxTQUFRM04sSUFBSyx5QkFBd0IsQ0FBQztNQUMxRjtNQUNBLElBQUksQ0FBQ21OLGVBQWUsQ0FBQ25OLElBQUksQ0FBQyxJQUFJNEQsS0FBSyxDQUFDakIsSUFBSSxLQUFLLFFBQVEsRUFBRTtRQUNyRCxNQUFNLElBQUlZLGFBQUssQ0FBQ0MsS0FBSyxDQUNuQkQsYUFBSyxDQUFDQyxLQUFLLENBQUNtSyxhQUFhLEVBQ3hCLFNBQVEzTixJQUFLLGlDQUFnQyxDQUMvQztNQUNIO01BQ0EsSUFBSTRELEtBQUssQ0FBQ2pCLElBQUksS0FBSyxRQUFRLEVBQUU7UUFDM0I4SyxjQUFjLENBQUM1SixJQUFJLENBQUM3RCxJQUFJLENBQUM7UUFDekIsT0FBT21OLGVBQWUsQ0FBQ25OLElBQUksQ0FBQztNQUM5QixDQUFDLE1BQU07UUFDTFEsTUFBTSxDQUFDeUIsSUFBSSxDQUFDMkIsS0FBSyxDQUFDLENBQUMxQixPQUFPLENBQUNtQixHQUFHLElBQUk7VUFDaEMsSUFBSSxDQUFDN0MsTUFBTSxDQUFDb04sU0FBUyxDQUFDQyxjQUFjLENBQUNDLElBQUksQ0FBQ3hNLE1BQU0sRUFBRStCLEdBQUcsQ0FBQyxFQUFFO1lBQ3RELE1BQU0sSUFBSUUsYUFBSyxDQUFDQyxLQUFLLENBQ25CRCxhQUFLLENBQUNDLEtBQUssQ0FBQ21LLGFBQWEsRUFDeEIsU0FBUXRLLEdBQUksb0NBQW1DLENBQ2pEO1VBQ0g7UUFDRixDQUFDLENBQUM7UUFDRjhKLGVBQWUsQ0FBQ25OLElBQUksQ0FBQyxHQUFHNEQsS0FBSztRQUM3QjhKLGVBQWUsQ0FBQzdKLElBQUksQ0FBQztVQUNuQlIsR0FBRyxFQUFFTyxLQUFLO1VBQ1Y1RDtRQUNGLENBQUMsQ0FBQztNQUNKO0lBQ0YsQ0FBQyxDQUFDO0lBQ0YsTUFBTXdNLElBQUksQ0FBQ3VCLEVBQUUsQ0FBQyxnQ0FBZ0MsRUFBRSxNQUFNZixDQUFDLElBQUk7TUFDekQsSUFBSVUsZUFBZSxDQUFDelAsTUFBTSxHQUFHLENBQUMsRUFBRTtRQUM5QixNQUFNbVAsSUFBSSxDQUFDWSxhQUFhLENBQUMzTSxTQUFTLEVBQUVxTSxlQUFlLEVBQUVWLENBQUMsQ0FBQztNQUN6RDtNQUNBLElBQUlTLGNBQWMsQ0FBQ3hQLE1BQU0sR0FBRyxDQUFDLEVBQUU7UUFDN0IsTUFBTW1QLElBQUksQ0FBQ2EsV0FBVyxDQUFDNU0sU0FBUyxFQUFFb00sY0FBYyxFQUFFVCxDQUFDLENBQUM7TUFDdEQ7TUFDQSxNQUFNQSxDQUFDLENBQUNaLElBQUksQ0FDVix5R0FBeUcsRUFDekcsQ0FBQy9LLFNBQVMsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFN0MsSUFBSSxDQUFDQyxTQUFTLENBQUMwTyxlQUFlLENBQUMsQ0FBQyxDQUNsRTtJQUNILENBQUMsQ0FBQztJQUNGLElBQUksQ0FBQ2QsbUJBQW1CLEVBQUU7RUFDNUI7RUFFQSxNQUFNNkIsV0FBVyxDQUFDN00sU0FBaUIsRUFBRUQsTUFBa0IsRUFBRW9MLElBQVUsRUFBRTtJQUNuRUEsSUFBSSxHQUFHQSxJQUFJLElBQUksSUFBSSxDQUFDM0IsT0FBTztJQUMzQixNQUFNc0QsV0FBVyxHQUFHLE1BQU0zQixJQUFJLENBQzNCdUIsRUFBRSxDQUFDLGNBQWMsRUFBRSxNQUFNZixDQUFDLElBQUk7TUFDN0IsTUFBTSxJQUFJLENBQUNvQixXQUFXLENBQUMvTSxTQUFTLEVBQUVELE1BQU0sRUFBRTRMLENBQUMsQ0FBQztNQUM1QyxNQUFNQSxDQUFDLENBQUNaLElBQUksQ0FDVixzR0FBc0csRUFDdEc7UUFBRS9LLFNBQVM7UUFBRUQ7TUFBTyxDQUFDLENBQ3RCO01BQ0QsTUFBTSxJQUFJLENBQUM2TCwwQkFBMEIsQ0FBQzVMLFNBQVMsRUFBRUQsTUFBTSxDQUFDUSxPQUFPLEVBQUUsQ0FBQyxDQUFDLEVBQUVSLE1BQU0sQ0FBQ0UsTUFBTSxFQUFFMEwsQ0FBQyxDQUFDO01BQ3RGLE9BQU83TCxhQUFhLENBQUNDLE1BQU0sQ0FBQztJQUM5QixDQUFDLENBQUMsQ0FDRGtMLEtBQUssQ0FBQytCLEdBQUcsSUFBSTtNQUNaLElBQUlBLEdBQUcsQ0FBQ0MsSUFBSSxLQUFLNVEsaUNBQWlDLElBQUkyUSxHQUFHLENBQUNFLE1BQU0sQ0FBQ2pMLFFBQVEsQ0FBQ2pDLFNBQVMsQ0FBQyxFQUFFO1FBQ3BGLE1BQU0sSUFBSWtDLGFBQUssQ0FBQ0MsS0FBSyxDQUFDRCxhQUFLLENBQUNDLEtBQUssQ0FBQ2dMLGVBQWUsRUFBRyxTQUFRbk4sU0FBVSxrQkFBaUIsQ0FBQztNQUMxRjtNQUNBLE1BQU1nTixHQUFHO0lBQ1gsQ0FBQyxDQUFDO0lBQ0osSUFBSSxDQUFDaEMsbUJBQW1CLEVBQUU7SUFDMUIsT0FBTzhCLFdBQVc7RUFDcEI7O0VBRUE7RUFDQSxNQUFNQyxXQUFXLENBQUMvTSxTQUFpQixFQUFFRCxNQUFrQixFQUFFb0wsSUFBUyxFQUFFO0lBQ2xFQSxJQUFJLEdBQUdBLElBQUksSUFBSSxJQUFJLENBQUMzQixPQUFPO0lBQzNCak4sS0FBSyxDQUFDLGFBQWEsQ0FBQztJQUNwQixNQUFNNlEsV0FBVyxHQUFHLEVBQUU7SUFDdEIsTUFBTUMsYUFBYSxHQUFHLEVBQUU7SUFDeEIsTUFBTXBOLE1BQU0sR0FBR2QsTUFBTSxDQUFDbU8sTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFdk4sTUFBTSxDQUFDRSxNQUFNLENBQUM7SUFDL0MsSUFBSUQsU0FBUyxLQUFLLE9BQU8sRUFBRTtNQUN6QkMsTUFBTSxDQUFDc04sOEJBQThCLEdBQUc7UUFBRXRRLElBQUksRUFBRTtNQUFPLENBQUM7TUFDeERnRCxNQUFNLENBQUN1TixtQkFBbUIsR0FBRztRQUFFdlEsSUFBSSxFQUFFO01BQVMsQ0FBQztNQUMvQ2dELE1BQU0sQ0FBQ3dOLDJCQUEyQixHQUFHO1FBQUV4USxJQUFJLEVBQUU7TUFBTyxDQUFDO01BQ3JEZ0QsTUFBTSxDQUFDeU4sbUJBQW1CLEdBQUc7UUFBRXpRLElBQUksRUFBRTtNQUFTLENBQUM7TUFDL0NnRCxNQUFNLENBQUMwTixpQkFBaUIsR0FBRztRQUFFMVEsSUFBSSxFQUFFO01BQVMsQ0FBQztNQUM3Q2dELE1BQU0sQ0FBQzJOLDRCQUE0QixHQUFHO1FBQUUzUSxJQUFJLEVBQUU7TUFBTyxDQUFDO01BQ3REZ0QsTUFBTSxDQUFDNE4sb0JBQW9CLEdBQUc7UUFBRTVRLElBQUksRUFBRTtNQUFPLENBQUM7TUFDOUNnRCxNQUFNLENBQUNRLGlCQUFpQixHQUFHO1FBQUV4RCxJQUFJLEVBQUU7TUFBUSxDQUFDO0lBQzlDO0lBQ0EsSUFBSXlFLEtBQUssR0FBRyxDQUFDO0lBQ2IsTUFBTW9NLFNBQVMsR0FBRyxFQUFFO0lBQ3BCM08sTUFBTSxDQUFDeUIsSUFBSSxDQUFDWCxNQUFNLENBQUMsQ0FBQ1ksT0FBTyxDQUFDQyxTQUFTLElBQUk7TUFDdkMsTUFBTWlOLFNBQVMsR0FBRzlOLE1BQU0sQ0FBQ2EsU0FBUyxDQUFDO01BQ25DO01BQ0E7TUFDQSxJQUFJaU4sU0FBUyxDQUFDOVEsSUFBSSxLQUFLLFVBQVUsRUFBRTtRQUNqQzZRLFNBQVMsQ0FBQ3RMLElBQUksQ0FBQzFCLFNBQVMsQ0FBQztRQUN6QjtNQUNGO01BQ0EsSUFBSSxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQ0MsT0FBTyxDQUFDRCxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUU7UUFDaERpTixTQUFTLENBQUM3USxRQUFRLEdBQUc7VUFBRUQsSUFBSSxFQUFFO1FBQVMsQ0FBQztNQUN6QztNQUNBbVEsV0FBVyxDQUFDNUssSUFBSSxDQUFDMUIsU0FBUyxDQUFDO01BQzNCc00sV0FBVyxDQUFDNUssSUFBSSxDQUFDeEYsdUJBQXVCLENBQUMrUSxTQUFTLENBQUMsQ0FBQztNQUNwRFYsYUFBYSxDQUFDN0ssSUFBSSxDQUFFLElBQUdkLEtBQU0sVUFBU0EsS0FBSyxHQUFHLENBQUUsTUFBSyxDQUFDO01BQ3RELElBQUlaLFNBQVMsS0FBSyxVQUFVLEVBQUU7UUFDNUJ1TSxhQUFhLENBQUM3SyxJQUFJLENBQUUsaUJBQWdCZCxLQUFNLFFBQU8sQ0FBQztNQUNwRDtNQUNBQSxLQUFLLEdBQUdBLEtBQUssR0FBRyxDQUFDO0lBQ25CLENBQUMsQ0FBQztJQUNGLE1BQU1zTSxFQUFFLEdBQUksdUNBQXNDWCxhQUFhLENBQUN6TCxJQUFJLEVBQUcsR0FBRTtJQUN6RSxNQUFNaUIsTUFBTSxHQUFHLENBQUM3QyxTQUFTLEVBQUUsR0FBR29OLFdBQVcsQ0FBQztJQUUxQyxPQUFPakMsSUFBSSxDQUFDTyxJQUFJLENBQUMsY0FBYyxFQUFFLE1BQU1DLENBQUMsSUFBSTtNQUMxQyxJQUFJO1FBQ0YsTUFBTUEsQ0FBQyxDQUFDWixJQUFJLENBQUNpRCxFQUFFLEVBQUVuTCxNQUFNLENBQUM7TUFDMUIsQ0FBQyxDQUFDLE9BQU84RixLQUFLLEVBQUU7UUFDZCxJQUFJQSxLQUFLLENBQUNzRSxJQUFJLEtBQUsvUSw4QkFBOEIsRUFBRTtVQUNqRCxNQUFNeU0sS0FBSztRQUNiO1FBQ0E7TUFDRjs7TUFDQSxNQUFNZ0QsQ0FBQyxDQUFDZSxFQUFFLENBQUMsaUJBQWlCLEVBQUVBLEVBQUUsSUFBSTtRQUNsQyxPQUFPQSxFQUFFLENBQUN1QixLQUFLLENBQ2JILFNBQVMsQ0FBQ3RNLEdBQUcsQ0FBQ1YsU0FBUyxJQUFJO1VBQ3pCLE9BQU80TCxFQUFFLENBQUMzQixJQUFJLENBQ1oseUlBQXlJLEVBQ3pJO1lBQUVtRCxTQUFTLEVBQUcsU0FBUXBOLFNBQVUsSUFBR2QsU0FBVTtVQUFFLENBQUMsQ0FDakQ7UUFDSCxDQUFDLENBQUMsQ0FDSDtNQUNILENBQUMsQ0FBQztJQUNKLENBQUMsQ0FBQztFQUNKO0VBRUEsTUFBTW1PLGFBQWEsQ0FBQ25PLFNBQWlCLEVBQUVELE1BQWtCLEVBQUVvTCxJQUFTLEVBQUU7SUFDcEU1TyxLQUFLLENBQUMsZUFBZSxDQUFDO0lBQ3RCNE8sSUFBSSxHQUFHQSxJQUFJLElBQUksSUFBSSxDQUFDM0IsT0FBTztJQUMzQixNQUFNdUMsSUFBSSxHQUFHLElBQUk7SUFFakIsTUFBTVosSUFBSSxDQUFDTyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsTUFBTUMsQ0FBQyxJQUFJO01BQzNDLE1BQU15QyxPQUFPLEdBQUcsTUFBTXpDLENBQUMsQ0FBQ25LLEdBQUcsQ0FDekIsb0ZBQW9GLEVBQ3BGO1FBQUV4QjtNQUFVLENBQUMsRUFDYnNMLENBQUMsSUFBSUEsQ0FBQyxDQUFDK0MsV0FBVyxDQUNuQjtNQUNELE1BQU1DLFVBQVUsR0FBR25QLE1BQU0sQ0FBQ3lCLElBQUksQ0FBQ2IsTUFBTSxDQUFDRSxNQUFNLENBQUMsQ0FDMUNzTyxNQUFNLENBQUNDLElBQUksSUFBSUosT0FBTyxDQUFDck4sT0FBTyxDQUFDeU4sSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FDNUNoTixHQUFHLENBQUNWLFNBQVMsSUFBSWlMLElBQUksQ0FBQzBDLG1CQUFtQixDQUFDek8sU0FBUyxFQUFFYyxTQUFTLEVBQUVmLE1BQU0sQ0FBQ0UsTUFBTSxDQUFDYSxTQUFTLENBQUMsQ0FBQyxDQUFDO01BRTdGLE1BQU02SyxDQUFDLENBQUNzQyxLQUFLLENBQUNLLFVBQVUsQ0FBQztJQUMzQixDQUFDLENBQUM7RUFDSjtFQUVBLE1BQU1HLG1CQUFtQixDQUFDek8sU0FBaUIsRUFBRWMsU0FBaUIsRUFBRTdELElBQVMsRUFBRTtJQUN6RTtJQUNBVixLQUFLLENBQUMscUJBQXFCLENBQUM7SUFDNUIsTUFBTXdQLElBQUksR0FBRyxJQUFJO0lBQ2pCLE1BQU0sSUFBSSxDQUFDdkMsT0FBTyxDQUFDa0QsRUFBRSxDQUFDLHlCQUF5QixFQUFFLE1BQU1mLENBQUMsSUFBSTtNQUMxRCxJQUFJMU8sSUFBSSxDQUFDQSxJQUFJLEtBQUssVUFBVSxFQUFFO1FBQzVCLElBQUk7VUFDRixNQUFNME8sQ0FBQyxDQUFDWixJQUFJLENBQ1YsOEZBQThGLEVBQzlGO1lBQ0UvSyxTQUFTO1lBQ1RjLFNBQVM7WUFDVDROLFlBQVksRUFBRTFSLHVCQUF1QixDQUFDQyxJQUFJO1VBQzVDLENBQUMsQ0FDRjtRQUNILENBQUMsQ0FBQyxPQUFPMEwsS0FBSyxFQUFFO1VBQ2QsSUFBSUEsS0FBSyxDQUFDc0UsSUFBSSxLQUFLaFIsaUNBQWlDLEVBQUU7WUFDcEQsT0FBTzhQLElBQUksQ0FBQ2MsV0FBVyxDQUFDN00sU0FBUyxFQUFFO2NBQUVDLE1BQU0sRUFBRTtnQkFBRSxDQUFDYSxTQUFTLEdBQUc3RDtjQUFLO1lBQUUsQ0FBQyxFQUFFME8sQ0FBQyxDQUFDO1VBQzFFO1VBQ0EsSUFBSWhELEtBQUssQ0FBQ3NFLElBQUksS0FBSzlRLDRCQUE0QixFQUFFO1lBQy9DLE1BQU13TSxLQUFLO1VBQ2I7VUFDQTtRQUNGO01BQ0YsQ0FBQyxNQUFNO1FBQ0wsTUFBTWdELENBQUMsQ0FBQ1osSUFBSSxDQUNWLHlJQUF5SSxFQUN6STtVQUFFbUQsU0FBUyxFQUFHLFNBQVFwTixTQUFVLElBQUdkLFNBQVU7UUFBRSxDQUFDLENBQ2pEO01BQ0g7TUFFQSxNQUFNeUksTUFBTSxHQUFHLE1BQU1rRCxDQUFDLENBQUNnRCxHQUFHLENBQ3hCLDRIQUE0SCxFQUM1SDtRQUFFM08sU0FBUztRQUFFYztNQUFVLENBQUMsQ0FDekI7TUFFRCxJQUFJMkgsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFO1FBQ2IsTUFBTSw4Q0FBOEM7TUFDdEQsQ0FBQyxNQUFNO1FBQ0wsTUFBTW1HLElBQUksR0FBSSxXQUFVOU4sU0FBVSxHQUFFO1FBQ3BDLE1BQU02SyxDQUFDLENBQUNaLElBQUksQ0FDVixxR0FBcUcsRUFDckc7VUFBRTZELElBQUk7VUFBRTNSLElBQUk7VUFBRStDO1FBQVUsQ0FBQyxDQUMxQjtNQUNIO0lBQ0YsQ0FBQyxDQUFDO0lBQ0YsSUFBSSxDQUFDZ0wsbUJBQW1CLEVBQUU7RUFDNUI7RUFFQSxNQUFNNkQsa0JBQWtCLENBQUM3TyxTQUFpQixFQUFFYyxTQUFpQixFQUFFN0QsSUFBUyxFQUFFO0lBQ3hFLE1BQU0sSUFBSSxDQUFDdU0sT0FBTyxDQUFDa0QsRUFBRSxDQUFDLDZCQUE2QixFQUFFLE1BQU1mLENBQUMsSUFBSTtNQUM5RCxNQUFNaUQsSUFBSSxHQUFJLFdBQVU5TixTQUFVLEdBQUU7TUFDcEMsTUFBTTZLLENBQUMsQ0FBQ1osSUFBSSxDQUNWLHFHQUFxRyxFQUNyRztRQUFFNkQsSUFBSTtRQUFFM1IsSUFBSTtRQUFFK0M7TUFBVSxDQUFDLENBQzFCO0lBQ0gsQ0FBQyxDQUFDO0VBQ0o7O0VBRUE7RUFDQTtFQUNBLE1BQU04TyxXQUFXLENBQUM5TyxTQUFpQixFQUFFO0lBQ25DLE1BQU0rTyxVQUFVLEdBQUcsQ0FDakI7TUFBRXJNLEtBQUssRUFBRyw4QkFBNkI7TUFBRUcsTUFBTSxFQUFFLENBQUM3QyxTQUFTO0lBQUUsQ0FBQyxFQUM5RDtNQUNFMEMsS0FBSyxFQUFHLDhDQUE2QztNQUNyREcsTUFBTSxFQUFFLENBQUM3QyxTQUFTO0lBQ3BCLENBQUMsQ0FDRjtJQUNELE1BQU1nUCxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUN4RixPQUFPLENBQ2hDa0QsRUFBRSxDQUFDZixDQUFDLElBQUlBLENBQUMsQ0FBQ1osSUFBSSxDQUFDLElBQUksQ0FBQ3JCLElBQUksQ0FBQ3VGLE9BQU8sQ0FBQ3ZTLE1BQU0sQ0FBQ3FTLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FDckRHLElBQUksQ0FBQyxNQUFNbFAsU0FBUyxDQUFDZSxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQzs7SUFFakQsSUFBSSxDQUFDaUssbUJBQW1CLEVBQUU7SUFDMUIsT0FBT2dFLFFBQVE7RUFDakI7O0VBRUE7RUFDQSxNQUFNRyxnQkFBZ0IsR0FBRztJQUN2QixNQUFNQyxHQUFHLEdBQUcsSUFBSUMsSUFBSSxFQUFFLENBQUNDLE9BQU8sRUFBRTtJQUNoQyxNQUFNTCxPQUFPLEdBQUcsSUFBSSxDQUFDdkYsSUFBSSxDQUFDdUYsT0FBTztJQUNqQzFTLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQztJQUV6QixNQUFNLElBQUksQ0FBQ2lOLE9BQU8sQ0FDZmtDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxNQUFNQyxDQUFDLElBQUk7TUFDckMsSUFBSTtRQUNGLE1BQU00RCxPQUFPLEdBQUcsTUFBTTVELENBQUMsQ0FBQ2dELEdBQUcsQ0FBQyx5QkFBeUIsQ0FBQztRQUN0RCxNQUFNYSxLQUFLLEdBQUdELE9BQU8sQ0FBQ0UsTUFBTSxDQUFDLENBQUNuTixJQUFtQixFQUFFdkMsTUFBVyxLQUFLO1VBQ2pFLE9BQU91QyxJQUFJLENBQUM1RixNQUFNLENBQUMyRixtQkFBbUIsQ0FBQ3RDLE1BQU0sQ0FBQ0EsTUFBTSxDQUFDLENBQUM7UUFDeEQsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUNOLE1BQU0yUCxPQUFPLEdBQUcsQ0FDZCxTQUFTLEVBQ1QsYUFBYSxFQUNiLFlBQVksRUFDWixjQUFjLEVBQ2QsUUFBUSxFQUNSLGVBQWUsRUFDZixnQkFBZ0IsRUFDaEIsV0FBVyxFQUNYLGNBQWMsRUFDZCxHQUFHSCxPQUFPLENBQUMvTixHQUFHLENBQUNpSCxNQUFNLElBQUlBLE1BQU0sQ0FBQ3pJLFNBQVMsQ0FBQyxFQUMxQyxHQUFHd1AsS0FBSyxDQUNUO1FBQ0QsTUFBTUcsT0FBTyxHQUFHRCxPQUFPLENBQUNsTyxHQUFHLENBQUN4QixTQUFTLEtBQUs7VUFDeEMwQyxLQUFLLEVBQUUsd0NBQXdDO1VBQy9DRyxNQUFNLEVBQUU7WUFBRTdDO1VBQVU7UUFDdEIsQ0FBQyxDQUFDLENBQUM7UUFDSCxNQUFNMkwsQ0FBQyxDQUFDZSxFQUFFLENBQUNBLEVBQUUsSUFBSUEsRUFBRSxDQUFDM0IsSUFBSSxDQUFDa0UsT0FBTyxDQUFDdlMsTUFBTSxDQUFDaVQsT0FBTyxDQUFDLENBQUMsQ0FBQztNQUNwRCxDQUFDLENBQUMsT0FBT2hILEtBQUssRUFBRTtRQUNkLElBQUlBLEtBQUssQ0FBQ3NFLElBQUksS0FBS2hSLGlDQUFpQyxFQUFFO1VBQ3BELE1BQU0wTSxLQUFLO1FBQ2I7UUFDQTtNQUNGO0lBQ0YsQ0FBQyxDQUFDLENBQ0R1RyxJQUFJLENBQUMsTUFBTTtNQUNWM1MsS0FBSyxDQUFFLDRCQUEyQixJQUFJOFMsSUFBSSxFQUFFLENBQUNDLE9BQU8sRUFBRSxHQUFHRixHQUFJLEVBQUMsQ0FBQztJQUNqRSxDQUFDLENBQUM7RUFDTjs7RUFFQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFQTtFQUNBO0VBQ0E7O0VBRUE7RUFDQSxNQUFNUSxZQUFZLENBQUM1UCxTQUFpQixFQUFFRCxNQUFrQixFQUFFOFAsVUFBb0IsRUFBaUI7SUFDN0Z0VCxLQUFLLENBQUMsY0FBYyxDQUFDO0lBQ3JCc1QsVUFBVSxHQUFHQSxVQUFVLENBQUNKLE1BQU0sQ0FBQyxDQUFDbk4sSUFBbUIsRUFBRXhCLFNBQWlCLEtBQUs7TUFDekUsTUFBTXlCLEtBQUssR0FBR3hDLE1BQU0sQ0FBQ0UsTUFBTSxDQUFDYSxTQUFTLENBQUM7TUFDdEMsSUFBSXlCLEtBQUssQ0FBQ3RGLElBQUksS0FBSyxVQUFVLEVBQUU7UUFDN0JxRixJQUFJLENBQUNFLElBQUksQ0FBQzFCLFNBQVMsQ0FBQztNQUN0QjtNQUNBLE9BQU9mLE1BQU0sQ0FBQ0UsTUFBTSxDQUFDYSxTQUFTLENBQUM7TUFDL0IsT0FBT3dCLElBQUk7SUFDYixDQUFDLEVBQUUsRUFBRSxDQUFDO0lBRU4sTUFBTU8sTUFBTSxHQUFHLENBQUM3QyxTQUFTLEVBQUUsR0FBRzZQLFVBQVUsQ0FBQztJQUN6QyxNQUFNekIsT0FBTyxHQUFHeUIsVUFBVSxDQUN2QnJPLEdBQUcsQ0FBQyxDQUFDN0MsSUFBSSxFQUFFbVIsR0FBRyxLQUFLO01BQ2xCLE9BQVEsSUFBR0EsR0FBRyxHQUFHLENBQUUsT0FBTTtJQUMzQixDQUFDLENBQUMsQ0FDRGxPLElBQUksQ0FBQyxlQUFlLENBQUM7SUFFeEIsTUFBTSxJQUFJLENBQUM0SCxPQUFPLENBQUNrRCxFQUFFLENBQUMsZUFBZSxFQUFFLE1BQU1mLENBQUMsSUFBSTtNQUNoRCxNQUFNQSxDQUFDLENBQUNaLElBQUksQ0FBQyw0RUFBNEUsRUFBRTtRQUN6RmhMLE1BQU07UUFDTkM7TUFDRixDQUFDLENBQUM7TUFDRixJQUFJNkMsTUFBTSxDQUFDakcsTUFBTSxHQUFHLENBQUMsRUFBRTtRQUNyQixNQUFNK08sQ0FBQyxDQUFDWixJQUFJLENBQUUsNkNBQTRDcUQsT0FBUSxFQUFDLEVBQUV2TCxNQUFNLENBQUM7TUFDOUU7SUFDRixDQUFDLENBQUM7SUFDRixJQUFJLENBQUNtSSxtQkFBbUIsRUFBRTtFQUM1Qjs7RUFFQTtFQUNBO0VBQ0E7RUFDQSxNQUFNK0UsYUFBYSxHQUFHO0lBQ3BCLE9BQU8sSUFBSSxDQUFDdkcsT0FBTyxDQUFDa0MsSUFBSSxDQUFDLGlCQUFpQixFQUFFLE1BQU1DLENBQUMsSUFBSTtNQUNyRCxPQUFPLE1BQU1BLENBQUMsQ0FBQ25LLEdBQUcsQ0FBQyx5QkFBeUIsRUFBRSxJQUFJLEVBQUV3TyxHQUFHLElBQ3JEbFEsYUFBYTtRQUFHRSxTQUFTLEVBQUVnUSxHQUFHLENBQUNoUTtNQUFTLEdBQUtnUSxHQUFHLENBQUNqUSxNQUFNLEVBQUcsQ0FDM0Q7SUFDSCxDQUFDLENBQUM7RUFDSjs7RUFFQTtFQUNBO0VBQ0E7RUFDQSxNQUFNa1EsUUFBUSxDQUFDalEsU0FBaUIsRUFBRTtJQUNoQ3pELEtBQUssQ0FBQyxVQUFVLENBQUM7SUFDakIsT0FBTyxJQUFJLENBQUNpTixPQUFPLENBQ2hCbUYsR0FBRyxDQUFDLDBEQUEwRCxFQUFFO01BQy9EM087SUFDRixDQUFDLENBQUMsQ0FDRGtQLElBQUksQ0FBQ3pHLE1BQU0sSUFBSTtNQUNkLElBQUlBLE1BQU0sQ0FBQzdMLE1BQU0sS0FBSyxDQUFDLEVBQUU7UUFDdkIsTUFBTW1DLFNBQVM7TUFDakI7TUFDQSxPQUFPMEosTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDMUksTUFBTTtJQUN6QixDQUFDLENBQUMsQ0FDRG1QLElBQUksQ0FBQ3BQLGFBQWEsQ0FBQztFQUN4Qjs7RUFFQTtFQUNBLE1BQU1vUSxZQUFZLENBQ2hCbFEsU0FBaUIsRUFDakJELE1BQWtCLEVBQ2xCWSxNQUFXLEVBQ1h3UCxvQkFBMEIsRUFDMUI7SUFDQTVULEtBQUssQ0FBQyxjQUFjLENBQUM7SUFDckIsSUFBSTZULFlBQVksR0FBRyxFQUFFO0lBQ3JCLE1BQU1oRCxXQUFXLEdBQUcsRUFBRTtJQUN0QnJOLE1BQU0sR0FBR1MsZ0JBQWdCLENBQUNULE1BQU0sQ0FBQztJQUNqQyxNQUFNc1EsU0FBUyxHQUFHLENBQUMsQ0FBQztJQUVwQjFQLE1BQU0sR0FBR0QsZUFBZSxDQUFDQyxNQUFNLENBQUM7SUFFaENvQixZQUFZLENBQUNwQixNQUFNLENBQUM7SUFFcEJ4QixNQUFNLENBQUN5QixJQUFJLENBQUNELE1BQU0sQ0FBQyxDQUFDRSxPQUFPLENBQUNDLFNBQVMsSUFBSTtNQUN2QyxJQUFJSCxNQUFNLENBQUNHLFNBQVMsQ0FBQyxLQUFLLElBQUksRUFBRTtRQUM5QjtNQUNGO01BQ0EsSUFBSXFDLGFBQWEsR0FBR3JDLFNBQVMsQ0FBQ3NDLEtBQUssQ0FBQyw4QkFBOEIsQ0FBQztNQUNuRSxNQUFNa04scUJBQXFCLEdBQUcsQ0FBQyxDQUFDM1AsTUFBTSxDQUFDNFAsUUFBUTtNQUMvQyxJQUFJcE4sYUFBYSxFQUFFO1FBQ2pCLElBQUlxTixRQUFRLEdBQUdyTixhQUFhLENBQUMsQ0FBQyxDQUFDO1FBQy9CeEMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxHQUFHQSxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzdDQSxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM2UCxRQUFRLENBQUMsR0FBRzdQLE1BQU0sQ0FBQ0csU0FBUyxDQUFDO1FBQ2hELE9BQU9ILE1BQU0sQ0FBQ0csU0FBUyxDQUFDO1FBQ3hCQSxTQUFTLEdBQUcsVUFBVTtRQUN0QjtRQUNBLElBQUl3UCxxQkFBcUIsRUFBRTtVQUN6QjtRQUNGO01BQ0Y7TUFFQUYsWUFBWSxDQUFDNU4sSUFBSSxDQUFDMUIsU0FBUyxDQUFDO01BQzVCLElBQUksQ0FBQ2YsTUFBTSxDQUFDRSxNQUFNLENBQUNhLFNBQVMsQ0FBQyxJQUFJZCxTQUFTLEtBQUssT0FBTyxFQUFFO1FBQ3RELElBQ0VjLFNBQVMsS0FBSyxxQkFBcUIsSUFDbkNBLFNBQVMsS0FBSyxxQkFBcUIsSUFDbkNBLFNBQVMsS0FBSyxtQkFBbUIsSUFDakNBLFNBQVMsS0FBSyxtQkFBbUIsRUFDakM7VUFDQXNNLFdBQVcsQ0FBQzVLLElBQUksQ0FBQzdCLE1BQU0sQ0FBQ0csU0FBUyxDQUFDLENBQUM7UUFDckM7UUFFQSxJQUFJQSxTQUFTLEtBQUssZ0NBQWdDLEVBQUU7VUFDbEQsSUFBSUgsTUFBTSxDQUFDRyxTQUFTLENBQUMsRUFBRTtZQUNyQnNNLFdBQVcsQ0FBQzVLLElBQUksQ0FBQzdCLE1BQU0sQ0FBQ0csU0FBUyxDQUFDLENBQUNwQyxHQUFHLENBQUM7VUFDekMsQ0FBQyxNQUFNO1lBQ0wwTyxXQUFXLENBQUM1SyxJQUFJLENBQUMsSUFBSSxDQUFDO1VBQ3hCO1FBQ0Y7UUFFQSxJQUNFMUIsU0FBUyxLQUFLLDZCQUE2QixJQUMzQ0EsU0FBUyxLQUFLLDhCQUE4QixJQUM1Q0EsU0FBUyxLQUFLLHNCQUFzQixFQUNwQztVQUNBLElBQUlILE1BQU0sQ0FBQ0csU0FBUyxDQUFDLEVBQUU7WUFDckJzTSxXQUFXLENBQUM1SyxJQUFJLENBQUM3QixNQUFNLENBQUNHLFNBQVMsQ0FBQyxDQUFDcEMsR0FBRyxDQUFDO1VBQ3pDLENBQUMsTUFBTTtZQUNMME8sV0FBVyxDQUFDNUssSUFBSSxDQUFDLElBQUksQ0FBQztVQUN4QjtRQUNGO1FBQ0E7TUFDRjtNQUNBLFFBQVF6QyxNQUFNLENBQUNFLE1BQU0sQ0FBQ2EsU0FBUyxDQUFDLENBQUM3RCxJQUFJO1FBQ25DLEtBQUssTUFBTTtVQUNULElBQUkwRCxNQUFNLENBQUNHLFNBQVMsQ0FBQyxFQUFFO1lBQ3JCc00sV0FBVyxDQUFDNUssSUFBSSxDQUFDN0IsTUFBTSxDQUFDRyxTQUFTLENBQUMsQ0FBQ3BDLEdBQUcsQ0FBQztVQUN6QyxDQUFDLE1BQU07WUFDTDBPLFdBQVcsQ0FBQzVLLElBQUksQ0FBQyxJQUFJLENBQUM7VUFDeEI7VUFDQTtRQUNGLEtBQUssU0FBUztVQUNaNEssV0FBVyxDQUFDNUssSUFBSSxDQUFDN0IsTUFBTSxDQUFDRyxTQUFTLENBQUMsQ0FBQzdCLFFBQVEsQ0FBQztVQUM1QztRQUNGLEtBQUssT0FBTztVQUNWLElBQUksQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUM4QixPQUFPLENBQUNELFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUNoRHNNLFdBQVcsQ0FBQzVLLElBQUksQ0FBQzdCLE1BQU0sQ0FBQ0csU0FBUyxDQUFDLENBQUM7VUFDckMsQ0FBQyxNQUFNO1lBQ0xzTSxXQUFXLENBQUM1SyxJQUFJLENBQUNyRixJQUFJLENBQUNDLFNBQVMsQ0FBQ3VELE1BQU0sQ0FBQ0csU0FBUyxDQUFDLENBQUMsQ0FBQztVQUNyRDtVQUNBO1FBQ0YsS0FBSyxRQUFRO1FBQ2IsS0FBSyxPQUFPO1FBQ1osS0FBSyxRQUFRO1FBQ2IsS0FBSyxRQUFRO1FBQ2IsS0FBSyxTQUFTO1VBQ1pzTSxXQUFXLENBQUM1SyxJQUFJLENBQUM3QixNQUFNLENBQUNHLFNBQVMsQ0FBQyxDQUFDO1VBQ25DO1FBQ0YsS0FBSyxNQUFNO1VBQ1RzTSxXQUFXLENBQUM1SyxJQUFJLENBQUM3QixNQUFNLENBQUNHLFNBQVMsQ0FBQyxDQUFDbkMsSUFBSSxDQUFDO1VBQ3hDO1FBQ0YsS0FBSyxTQUFTO1VBQUU7WUFDZCxNQUFNSCxLQUFLLEdBQUcySixtQkFBbUIsQ0FBQ3hILE1BQU0sQ0FBQ0csU0FBUyxDQUFDLENBQUM2RyxXQUFXLENBQUM7WUFDaEV5RixXQUFXLENBQUM1SyxJQUFJLENBQUNoRSxLQUFLLENBQUM7WUFDdkI7VUFDRjtRQUNBLEtBQUssVUFBVTtVQUNiO1VBQ0E2UixTQUFTLENBQUN2UCxTQUFTLENBQUMsR0FBR0gsTUFBTSxDQUFDRyxTQUFTLENBQUM7VUFDeENzUCxZQUFZLENBQUNLLEdBQUcsRUFBRTtVQUNsQjtRQUNGO1VBQ0UsTUFBTyxRQUFPMVEsTUFBTSxDQUFDRSxNQUFNLENBQUNhLFNBQVMsQ0FBQyxDQUFDN0QsSUFBSyxvQkFBbUI7TUFBQztJQUV0RSxDQUFDLENBQUM7SUFFRm1ULFlBQVksR0FBR0EsWUFBWSxDQUFDMVQsTUFBTSxDQUFDeUMsTUFBTSxDQUFDeUIsSUFBSSxDQUFDeVAsU0FBUyxDQUFDLENBQUM7SUFDMUQsTUFBTUssYUFBYSxHQUFHdEQsV0FBVyxDQUFDNUwsR0FBRyxDQUFDLENBQUNtUCxHQUFHLEVBQUVqUCxLQUFLLEtBQUs7TUFDcEQsSUFBSWtQLFdBQVcsR0FBRyxFQUFFO01BQ3BCLE1BQU05UCxTQUFTLEdBQUdzUCxZQUFZLENBQUMxTyxLQUFLLENBQUM7TUFDckMsSUFBSSxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQ1gsT0FBTyxDQUFDRCxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUU7UUFDaEQ4UCxXQUFXLEdBQUcsVUFBVTtNQUMxQixDQUFDLE1BQU0sSUFBSTdRLE1BQU0sQ0FBQ0UsTUFBTSxDQUFDYSxTQUFTLENBQUMsSUFBSWYsTUFBTSxDQUFDRSxNQUFNLENBQUNhLFNBQVMsQ0FBQyxDQUFDN0QsSUFBSSxLQUFLLE9BQU8sRUFBRTtRQUNoRjJULFdBQVcsR0FBRyxTQUFTO01BQ3pCO01BQ0EsT0FBUSxJQUFHbFAsS0FBSyxHQUFHLENBQUMsR0FBRzBPLFlBQVksQ0FBQ3hULE1BQU8sR0FBRWdVLFdBQVksRUFBQztJQUM1RCxDQUFDLENBQUM7SUFDRixNQUFNQyxnQkFBZ0IsR0FBRzFSLE1BQU0sQ0FBQ3lCLElBQUksQ0FBQ3lQLFNBQVMsQ0FBQyxDQUFDN08sR0FBRyxDQUFDUSxHQUFHLElBQUk7TUFDekQsTUFBTXhELEtBQUssR0FBRzZSLFNBQVMsQ0FBQ3JPLEdBQUcsQ0FBQztNQUM1Qm9MLFdBQVcsQ0FBQzVLLElBQUksQ0FBQ2hFLEtBQUssQ0FBQzRGLFNBQVMsRUFBRTVGLEtBQUssQ0FBQzZGLFFBQVEsQ0FBQztNQUNqRCxNQUFNeU0sQ0FBQyxHQUFHMUQsV0FBVyxDQUFDeFEsTUFBTSxHQUFHd1QsWUFBWSxDQUFDeFQsTUFBTTtNQUNsRCxPQUFRLFVBQVNrVSxDQUFFLE1BQUtBLENBQUMsR0FBRyxDQUFFLEdBQUU7SUFDbEMsQ0FBQyxDQUFDO0lBRUYsTUFBTUMsY0FBYyxHQUFHWCxZQUFZLENBQUM1TyxHQUFHLENBQUMsQ0FBQ3dQLEdBQUcsRUFBRXRQLEtBQUssS0FBTSxJQUFHQSxLQUFLLEdBQUcsQ0FBRSxPQUFNLENBQUMsQ0FBQ0UsSUFBSSxFQUFFO0lBQ3BGLE1BQU1xUCxhQUFhLEdBQUdQLGFBQWEsQ0FBQ2hVLE1BQU0sQ0FBQ21VLGdCQUFnQixDQUFDLENBQUNqUCxJQUFJLEVBQUU7SUFFbkUsTUFBTW9NLEVBQUUsR0FBSSx3QkFBdUIrQyxjQUFlLGFBQVlFLGFBQWMsR0FBRTtJQUM5RSxNQUFNcE8sTUFBTSxHQUFHLENBQUM3QyxTQUFTLEVBQUUsR0FBR29RLFlBQVksRUFBRSxHQUFHaEQsV0FBVyxDQUFDO0lBQzNELE1BQU04RCxPQUFPLEdBQUcsQ0FBQ2Ysb0JBQW9CLEdBQUdBLG9CQUFvQixDQUFDeEUsQ0FBQyxHQUFHLElBQUksQ0FBQ25DLE9BQU8sRUFDMUV1QixJQUFJLENBQUNpRCxFQUFFLEVBQUVuTCxNQUFNLENBQUMsQ0FDaEJxTSxJQUFJLENBQUMsT0FBTztNQUFFaUMsR0FBRyxFQUFFLENBQUN4USxNQUFNO0lBQUUsQ0FBQyxDQUFDLENBQUMsQ0FDL0JzSyxLQUFLLENBQUN0QyxLQUFLLElBQUk7TUFDZCxJQUFJQSxLQUFLLENBQUNzRSxJQUFJLEtBQUs1USxpQ0FBaUMsRUFBRTtRQUNwRCxNQUFNMlEsR0FBRyxHQUFHLElBQUk5SyxhQUFLLENBQUNDLEtBQUssQ0FDekJELGFBQUssQ0FBQ0MsS0FBSyxDQUFDZ0wsZUFBZSxFQUMzQiwrREFBK0QsQ0FDaEU7UUFDREgsR0FBRyxDQUFDb0UsZUFBZSxHQUFHekksS0FBSztRQUMzQixJQUFJQSxLQUFLLENBQUMwSSxVQUFVLEVBQUU7VUFDcEIsTUFBTUMsT0FBTyxHQUFHM0ksS0FBSyxDQUFDMEksVUFBVSxDQUFDak8sS0FBSyxDQUFDLG9CQUFvQixDQUFDO1VBQzVELElBQUlrTyxPQUFPLElBQUk5TSxLQUFLLENBQUNDLE9BQU8sQ0FBQzZNLE9BQU8sQ0FBQyxFQUFFO1lBQ3JDdEUsR0FBRyxDQUFDdUUsUUFBUSxHQUFHO2NBQUVDLGdCQUFnQixFQUFFRixPQUFPLENBQUMsQ0FBQztZQUFFLENBQUM7VUFDakQ7UUFDRjtRQUNBM0ksS0FBSyxHQUFHcUUsR0FBRztNQUNiO01BQ0EsTUFBTXJFLEtBQUs7SUFDYixDQUFDLENBQUM7SUFDSixJQUFJd0gsb0JBQW9CLEVBQUU7TUFDeEJBLG9CQUFvQixDQUFDbEMsS0FBSyxDQUFDekwsSUFBSSxDQUFDME8sT0FBTyxDQUFDO0lBQzFDO0lBQ0EsT0FBT0EsT0FBTztFQUNoQjs7RUFFQTtFQUNBO0VBQ0E7RUFDQSxNQUFNTyxvQkFBb0IsQ0FDeEJ6UixTQUFpQixFQUNqQkQsTUFBa0IsRUFDbEIyQyxLQUFnQixFQUNoQnlOLG9CQUEwQixFQUMxQjtJQUNBNVQsS0FBSyxDQUFDLHNCQUFzQixDQUFDO0lBQzdCLE1BQU1zRyxNQUFNLEdBQUcsQ0FBQzdDLFNBQVMsQ0FBQztJQUMxQixNQUFNMEIsS0FBSyxHQUFHLENBQUM7SUFDZixNQUFNZ1EsS0FBSyxHQUFHalAsZ0JBQWdCLENBQUM7TUFDN0IxQyxNQUFNO01BQ04yQixLQUFLO01BQ0xnQixLQUFLO01BQ0xDLGVBQWUsRUFBRTtJQUNuQixDQUFDLENBQUM7SUFDRkUsTUFBTSxDQUFDTCxJQUFJLENBQUMsR0FBR2tQLEtBQUssQ0FBQzdPLE1BQU0sQ0FBQztJQUM1QixJQUFJMUQsTUFBTSxDQUFDeUIsSUFBSSxDQUFDOEIsS0FBSyxDQUFDLENBQUM5RixNQUFNLEtBQUssQ0FBQyxFQUFFO01BQ25DOFUsS0FBSyxDQUFDOU4sT0FBTyxHQUFHLE1BQU07SUFDeEI7SUFDQSxNQUFNb0ssRUFBRSxHQUFJLDhDQUE2QzBELEtBQUssQ0FBQzlOLE9BQVEsNENBQTJDO0lBQ2xILE1BQU1zTixPQUFPLEdBQUcsQ0FBQ2Ysb0JBQW9CLEdBQUdBLG9CQUFvQixDQUFDeEUsQ0FBQyxHQUFHLElBQUksQ0FBQ25DLE9BQU8sRUFDMUU2QixHQUFHLENBQUMyQyxFQUFFLEVBQUVuTCxNQUFNLEVBQUV5SSxDQUFDLElBQUksQ0FBQ0EsQ0FBQyxDQUFDL0wsS0FBSyxDQUFDLENBQzlCMlAsSUFBSSxDQUFDM1AsS0FBSyxJQUFJO01BQ2IsSUFBSUEsS0FBSyxLQUFLLENBQUMsRUFBRTtRQUNmLE1BQU0sSUFBSTJDLGFBQUssQ0FBQ0MsS0FBSyxDQUFDRCxhQUFLLENBQUNDLEtBQUssQ0FBQ3dQLGdCQUFnQixFQUFFLG1CQUFtQixDQUFDO01BQzFFLENBQUMsTUFBTTtRQUNMLE9BQU9wUyxLQUFLO01BQ2Q7SUFDRixDQUFDLENBQUMsQ0FDRDBMLEtBQUssQ0FBQ3RDLEtBQUssSUFBSTtNQUNkLElBQUlBLEtBQUssQ0FBQ3NFLElBQUksS0FBS2hSLGlDQUFpQyxFQUFFO1FBQ3BELE1BQU0wTSxLQUFLO01BQ2I7TUFDQTtJQUNGLENBQUMsQ0FBQzs7SUFDSixJQUFJd0gsb0JBQW9CLEVBQUU7TUFDeEJBLG9CQUFvQixDQUFDbEMsS0FBSyxDQUFDekwsSUFBSSxDQUFDME8sT0FBTyxDQUFDO0lBQzFDO0lBQ0EsT0FBT0EsT0FBTztFQUNoQjtFQUNBO0VBQ0EsTUFBTVUsZ0JBQWdCLENBQ3BCNVIsU0FBaUIsRUFDakJELE1BQWtCLEVBQ2xCMkMsS0FBZ0IsRUFDaEJqRCxNQUFXLEVBQ1gwUSxvQkFBMEIsRUFDWjtJQUNkNVQsS0FBSyxDQUFDLGtCQUFrQixDQUFDO0lBQ3pCLE9BQU8sSUFBSSxDQUFDc1Ysb0JBQW9CLENBQUM3UixTQUFTLEVBQUVELE1BQU0sRUFBRTJDLEtBQUssRUFBRWpELE1BQU0sRUFBRTBRLG9CQUFvQixDQUFDLENBQUNqQixJQUFJLENBQzNGeUIsR0FBRyxJQUFJQSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQ2Q7RUFDSDs7RUFFQTtFQUNBLE1BQU1rQixvQkFBb0IsQ0FDeEI3UixTQUFpQixFQUNqQkQsTUFBa0IsRUFDbEIyQyxLQUFnQixFQUNoQmpELE1BQVcsRUFDWDBRLG9CQUEwQixFQUNWO0lBQ2hCNVQsS0FBSyxDQUFDLHNCQUFzQixDQUFDO0lBQzdCLE1BQU11VixjQUFjLEdBQUcsRUFBRTtJQUN6QixNQUFNalAsTUFBTSxHQUFHLENBQUM3QyxTQUFTLENBQUM7SUFDMUIsSUFBSTBCLEtBQUssR0FBRyxDQUFDO0lBQ2IzQixNQUFNLEdBQUdTLGdCQUFnQixDQUFDVCxNQUFNLENBQUM7SUFFakMsTUFBTWdTLGNBQWMscUJBQVF0UyxNQUFNLENBQUU7O0lBRXBDO0lBQ0EsTUFBTXVTLGtCQUFrQixHQUFHLENBQUMsQ0FBQztJQUM3QjdTLE1BQU0sQ0FBQ3lCLElBQUksQ0FBQ25CLE1BQU0sQ0FBQyxDQUFDb0IsT0FBTyxDQUFDQyxTQUFTLElBQUk7TUFDdkMsSUFBSUEsU0FBUyxDQUFDQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUU7UUFDL0IsTUFBTUMsVUFBVSxHQUFHRixTQUFTLENBQUNHLEtBQUssQ0FBQyxHQUFHLENBQUM7UUFDdkMsTUFBTUMsS0FBSyxHQUFHRixVQUFVLENBQUNHLEtBQUssRUFBRTtRQUNoQzZRLGtCQUFrQixDQUFDOVEsS0FBSyxDQUFDLEdBQUcsSUFBSTtNQUNsQyxDQUFDLE1BQU07UUFDTDhRLGtCQUFrQixDQUFDbFIsU0FBUyxDQUFDLEdBQUcsS0FBSztNQUN2QztJQUNGLENBQUMsQ0FBQztJQUNGckIsTUFBTSxHQUFHaUIsZUFBZSxDQUFDakIsTUFBTSxDQUFDO0lBQ2hDO0lBQ0E7SUFDQSxLQUFLLE1BQU1xQixTQUFTLElBQUlyQixNQUFNLEVBQUU7TUFDOUIsTUFBTTBELGFBQWEsR0FBR3JDLFNBQVMsQ0FBQ3NDLEtBQUssQ0FBQyw4QkFBOEIsQ0FBQztNQUNyRSxJQUFJRCxhQUFhLEVBQUU7UUFDakIsSUFBSXFOLFFBQVEsR0FBR3JOLGFBQWEsQ0FBQyxDQUFDLENBQUM7UUFDL0IsTUFBTTNFLEtBQUssR0FBR2lCLE1BQU0sQ0FBQ3FCLFNBQVMsQ0FBQztRQUMvQixPQUFPckIsTUFBTSxDQUFDcUIsU0FBUyxDQUFDO1FBQ3hCckIsTUFBTSxDQUFDLFVBQVUsQ0FBQyxHQUFHQSxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzdDQSxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMrUSxRQUFRLENBQUMsR0FBR2hTLEtBQUs7TUFDdEM7SUFDRjtJQUVBLEtBQUssTUFBTXNDLFNBQVMsSUFBSXJCLE1BQU0sRUFBRTtNQUM5QixNQUFNd0QsVUFBVSxHQUFHeEQsTUFBTSxDQUFDcUIsU0FBUyxDQUFDO01BQ3BDO01BQ0EsSUFBSSxPQUFPbUMsVUFBVSxLQUFLLFdBQVcsRUFBRTtRQUNyQyxPQUFPeEQsTUFBTSxDQUFDcUIsU0FBUyxDQUFDO01BQzFCLENBQUMsTUFBTSxJQUFJbUMsVUFBVSxLQUFLLElBQUksRUFBRTtRQUM5QjZPLGNBQWMsQ0FBQ3RQLElBQUksQ0FBRSxJQUFHZCxLQUFNLGNBQWEsQ0FBQztRQUM1Q21CLE1BQU0sQ0FBQ0wsSUFBSSxDQUFDMUIsU0FBUyxDQUFDO1FBQ3RCWSxLQUFLLElBQUksQ0FBQztNQUNaLENBQUMsTUFBTSxJQUFJWixTQUFTLElBQUksVUFBVSxFQUFFO1FBQ2xDO1FBQ0E7UUFDQSxNQUFNbVIsUUFBUSxHQUFHLENBQUNDLEtBQWEsRUFBRWxRLEdBQVcsRUFBRXhELEtBQVUsS0FBSztVQUMzRCxPQUFRLGdDQUErQjBULEtBQU0sbUJBQWtCbFEsR0FBSSxLQUFJeEQsS0FBTSxVQUFTO1FBQ3hGLENBQUM7UUFDRCxNQUFNMlQsT0FBTyxHQUFJLElBQUd6USxLQUFNLE9BQU07UUFDaEMsTUFBTTBRLGNBQWMsR0FBRzFRLEtBQUs7UUFDNUJBLEtBQUssSUFBSSxDQUFDO1FBQ1ZtQixNQUFNLENBQUNMLElBQUksQ0FBQzFCLFNBQVMsQ0FBQztRQUN0QixNQUFNckIsTUFBTSxHQUFHTixNQUFNLENBQUN5QixJQUFJLENBQUNxQyxVQUFVLENBQUMsQ0FBQ3dNLE1BQU0sQ0FBQyxDQUFDMEMsT0FBZSxFQUFFblEsR0FBVyxLQUFLO1VBQzlFLE1BQU1xUSxHQUFHLEdBQUdKLFFBQVEsQ0FBQ0UsT0FBTyxFQUFHLElBQUd6USxLQUFNLFFBQU8sRUFBRyxJQUFHQSxLQUFLLEdBQUcsQ0FBRSxTQUFRLENBQUM7VUFDeEVBLEtBQUssSUFBSSxDQUFDO1VBQ1YsSUFBSWxELEtBQUssR0FBR3lFLFVBQVUsQ0FBQ2pCLEdBQUcsQ0FBQztVQUMzQixJQUFJeEQsS0FBSyxFQUFFO1lBQ1QsSUFBSUEsS0FBSyxDQUFDOEMsSUFBSSxLQUFLLFFBQVEsRUFBRTtjQUMzQjlDLEtBQUssR0FBRyxJQUFJO1lBQ2QsQ0FBQyxNQUFNO2NBQ0xBLEtBQUssR0FBR3JCLElBQUksQ0FBQ0MsU0FBUyxDQUFDb0IsS0FBSyxDQUFDO1lBQy9CO1VBQ0Y7VUFDQXFFLE1BQU0sQ0FBQ0wsSUFBSSxDQUFDUixHQUFHLEVBQUV4RCxLQUFLLENBQUM7VUFDdkIsT0FBTzZULEdBQUc7UUFDWixDQUFDLEVBQUVGLE9BQU8sQ0FBQztRQUNYTCxjQUFjLENBQUN0UCxJQUFJLENBQUUsSUFBRzRQLGNBQWUsV0FBVTNTLE1BQU8sRUFBQyxDQUFDO01BQzVELENBQUMsTUFBTSxJQUFJd0QsVUFBVSxDQUFDM0IsSUFBSSxLQUFLLFdBQVcsRUFBRTtRQUMxQ3dRLGNBQWMsQ0FBQ3RQLElBQUksQ0FBRSxJQUFHZCxLQUFNLHFCQUFvQkEsS0FBTSxnQkFBZUEsS0FBSyxHQUFHLENBQUUsRUFBQyxDQUFDO1FBQ25GbUIsTUFBTSxDQUFDTCxJQUFJLENBQUMxQixTQUFTLEVBQUVtQyxVQUFVLENBQUNxUCxNQUFNLENBQUM7UUFDekM1USxLQUFLLElBQUksQ0FBQztNQUNaLENBQUMsTUFBTSxJQUFJdUIsVUFBVSxDQUFDM0IsSUFBSSxLQUFLLEtBQUssRUFBRTtRQUNwQ3dRLGNBQWMsQ0FBQ3RQLElBQUksQ0FDaEIsSUFBR2QsS0FBTSwrQkFBOEJBLEtBQU0seUJBQXdCQSxLQUFLLEdBQUcsQ0FBRSxVQUFTLENBQzFGO1FBQ0RtQixNQUFNLENBQUNMLElBQUksQ0FBQzFCLFNBQVMsRUFBRTNELElBQUksQ0FBQ0MsU0FBUyxDQUFDNkYsVUFBVSxDQUFDc1AsT0FBTyxDQUFDLENBQUM7UUFDMUQ3USxLQUFLLElBQUksQ0FBQztNQUNaLENBQUMsTUFBTSxJQUFJdUIsVUFBVSxDQUFDM0IsSUFBSSxLQUFLLFFBQVEsRUFBRTtRQUN2Q3dRLGNBQWMsQ0FBQ3RQLElBQUksQ0FBRSxJQUFHZCxLQUFNLFlBQVdBLEtBQUssR0FBRyxDQUFFLEVBQUMsQ0FBQztRQUNyRG1CLE1BQU0sQ0FBQ0wsSUFBSSxDQUFDMUIsU0FBUyxFQUFFLElBQUksQ0FBQztRQUM1QlksS0FBSyxJQUFJLENBQUM7TUFDWixDQUFDLE1BQU0sSUFBSXVCLFVBQVUsQ0FBQzNCLElBQUksS0FBSyxRQUFRLEVBQUU7UUFDdkN3USxjQUFjLENBQUN0UCxJQUFJLENBQ2hCLElBQUdkLEtBQU0sa0NBQWlDQSxLQUFNLHlCQUMvQ0EsS0FBSyxHQUFHLENBQ1QsVUFBUyxDQUNYO1FBQ0RtQixNQUFNLENBQUNMLElBQUksQ0FBQzFCLFNBQVMsRUFBRTNELElBQUksQ0FBQ0MsU0FBUyxDQUFDNkYsVUFBVSxDQUFDc1AsT0FBTyxDQUFDLENBQUM7UUFDMUQ3USxLQUFLLElBQUksQ0FBQztNQUNaLENBQUMsTUFBTSxJQUFJdUIsVUFBVSxDQUFDM0IsSUFBSSxLQUFLLFdBQVcsRUFBRTtRQUMxQ3dRLGNBQWMsQ0FBQ3RQLElBQUksQ0FDaEIsSUFBR2QsS0FBTSxzQ0FBcUNBLEtBQU0seUJBQ25EQSxLQUFLLEdBQUcsQ0FDVCxVQUFTLENBQ1g7UUFDRG1CLE1BQU0sQ0FBQ0wsSUFBSSxDQUFDMUIsU0FBUyxFQUFFM0QsSUFBSSxDQUFDQyxTQUFTLENBQUM2RixVQUFVLENBQUNzUCxPQUFPLENBQUMsQ0FBQztRQUMxRDdRLEtBQUssSUFBSSxDQUFDO01BQ1osQ0FBQyxNQUFNLElBQUlaLFNBQVMsS0FBSyxXQUFXLEVBQUU7UUFDcEM7UUFDQWdSLGNBQWMsQ0FBQ3RQLElBQUksQ0FBRSxJQUFHZCxLQUFNLFlBQVdBLEtBQUssR0FBRyxDQUFFLEVBQUMsQ0FBQztRQUNyRG1CLE1BQU0sQ0FBQ0wsSUFBSSxDQUFDMUIsU0FBUyxFQUFFbUMsVUFBVSxDQUFDO1FBQ2xDdkIsS0FBSyxJQUFJLENBQUM7TUFDWixDQUFDLE1BQU0sSUFBSSxPQUFPdUIsVUFBVSxLQUFLLFFBQVEsRUFBRTtRQUN6QzZPLGNBQWMsQ0FBQ3RQLElBQUksQ0FBRSxJQUFHZCxLQUFNLFlBQVdBLEtBQUssR0FBRyxDQUFFLEVBQUMsQ0FBQztRQUNyRG1CLE1BQU0sQ0FBQ0wsSUFBSSxDQUFDMUIsU0FBUyxFQUFFbUMsVUFBVSxDQUFDO1FBQ2xDdkIsS0FBSyxJQUFJLENBQUM7TUFDWixDQUFDLE1BQU0sSUFBSSxPQUFPdUIsVUFBVSxLQUFLLFNBQVMsRUFBRTtRQUMxQzZPLGNBQWMsQ0FBQ3RQLElBQUksQ0FBRSxJQUFHZCxLQUFNLFlBQVdBLEtBQUssR0FBRyxDQUFFLEVBQUMsQ0FBQztRQUNyRG1CLE1BQU0sQ0FBQ0wsSUFBSSxDQUFDMUIsU0FBUyxFQUFFbUMsVUFBVSxDQUFDO1FBQ2xDdkIsS0FBSyxJQUFJLENBQUM7TUFDWixDQUFDLE1BQU0sSUFBSXVCLFVBQVUsQ0FBQ3hFLE1BQU0sS0FBSyxTQUFTLEVBQUU7UUFDMUNxVCxjQUFjLENBQUN0UCxJQUFJLENBQUUsSUFBR2QsS0FBTSxZQUFXQSxLQUFLLEdBQUcsQ0FBRSxFQUFDLENBQUM7UUFDckRtQixNQUFNLENBQUNMLElBQUksQ0FBQzFCLFNBQVMsRUFBRW1DLFVBQVUsQ0FBQ2hFLFFBQVEsQ0FBQztRQUMzQ3lDLEtBQUssSUFBSSxDQUFDO01BQ1osQ0FBQyxNQUFNLElBQUl1QixVQUFVLENBQUN4RSxNQUFNLEtBQUssTUFBTSxFQUFFO1FBQ3ZDcVQsY0FBYyxDQUFDdFAsSUFBSSxDQUFFLElBQUdkLEtBQU0sWUFBV0EsS0FBSyxHQUFHLENBQUUsRUFBQyxDQUFDO1FBQ3JEbUIsTUFBTSxDQUFDTCxJQUFJLENBQUMxQixTQUFTLEVBQUV2QyxlQUFlLENBQUMwRSxVQUFVLENBQUMsQ0FBQztRQUNuRHZCLEtBQUssSUFBSSxDQUFDO01BQ1osQ0FBQyxNQUFNLElBQUl1QixVQUFVLFlBQVlvTSxJQUFJLEVBQUU7UUFDckN5QyxjQUFjLENBQUN0UCxJQUFJLENBQUUsSUFBR2QsS0FBTSxZQUFXQSxLQUFLLEdBQUcsQ0FBRSxFQUFDLENBQUM7UUFDckRtQixNQUFNLENBQUNMLElBQUksQ0FBQzFCLFNBQVMsRUFBRW1DLFVBQVUsQ0FBQztRQUNsQ3ZCLEtBQUssSUFBSSxDQUFDO01BQ1osQ0FBQyxNQUFNLElBQUl1QixVQUFVLENBQUN4RSxNQUFNLEtBQUssTUFBTSxFQUFFO1FBQ3ZDcVQsY0FBYyxDQUFDdFAsSUFBSSxDQUFFLElBQUdkLEtBQU0sWUFBV0EsS0FBSyxHQUFHLENBQUUsRUFBQyxDQUFDO1FBQ3JEbUIsTUFBTSxDQUFDTCxJQUFJLENBQUMxQixTQUFTLEVBQUV2QyxlQUFlLENBQUMwRSxVQUFVLENBQUMsQ0FBQztRQUNuRHZCLEtBQUssSUFBSSxDQUFDO01BQ1osQ0FBQyxNQUFNLElBQUl1QixVQUFVLENBQUN4RSxNQUFNLEtBQUssVUFBVSxFQUFFO1FBQzNDcVQsY0FBYyxDQUFDdFAsSUFBSSxDQUFFLElBQUdkLEtBQU0sa0JBQWlCQSxLQUFLLEdBQUcsQ0FBRSxNQUFLQSxLQUFLLEdBQUcsQ0FBRSxHQUFFLENBQUM7UUFDM0VtQixNQUFNLENBQUNMLElBQUksQ0FBQzFCLFNBQVMsRUFBRW1DLFVBQVUsQ0FBQ21CLFNBQVMsRUFBRW5CLFVBQVUsQ0FBQ29CLFFBQVEsQ0FBQztRQUNqRTNDLEtBQUssSUFBSSxDQUFDO01BQ1osQ0FBQyxNQUFNLElBQUl1QixVQUFVLENBQUN4RSxNQUFNLEtBQUssU0FBUyxFQUFFO1FBQzFDLE1BQU1ELEtBQUssR0FBRzJKLG1CQUFtQixDQUFDbEYsVUFBVSxDQUFDMEUsV0FBVyxDQUFDO1FBQ3pEbUssY0FBYyxDQUFDdFAsSUFBSSxDQUFFLElBQUdkLEtBQU0sWUFBV0EsS0FBSyxHQUFHLENBQUUsV0FBVSxDQUFDO1FBQzlEbUIsTUFBTSxDQUFDTCxJQUFJLENBQUMxQixTQUFTLEVBQUV0QyxLQUFLLENBQUM7UUFDN0JrRCxLQUFLLElBQUksQ0FBQztNQUNaLENBQUMsTUFBTSxJQUFJdUIsVUFBVSxDQUFDeEUsTUFBTSxLQUFLLFVBQVUsRUFBRTtRQUMzQztNQUFBLENBQ0QsTUFBTSxJQUFJLE9BQU93RSxVQUFVLEtBQUssUUFBUSxFQUFFO1FBQ3pDNk8sY0FBYyxDQUFDdFAsSUFBSSxDQUFFLElBQUdkLEtBQU0sWUFBV0EsS0FBSyxHQUFHLENBQUUsRUFBQyxDQUFDO1FBQ3JEbUIsTUFBTSxDQUFDTCxJQUFJLENBQUMxQixTQUFTLEVBQUVtQyxVQUFVLENBQUM7UUFDbEN2QixLQUFLLElBQUksQ0FBQztNQUNaLENBQUMsTUFBTSxJQUNMLE9BQU91QixVQUFVLEtBQUssUUFBUSxJQUM5QmxELE1BQU0sQ0FBQ0UsTUFBTSxDQUFDYSxTQUFTLENBQUMsSUFDeEJmLE1BQU0sQ0FBQ0UsTUFBTSxDQUFDYSxTQUFTLENBQUMsQ0FBQzdELElBQUksS0FBSyxRQUFRLEVBQzFDO1FBQ0E7UUFDQSxNQUFNdVYsZUFBZSxHQUFHclQsTUFBTSxDQUFDeUIsSUFBSSxDQUFDbVIsY0FBYyxDQUFDLENBQ2hEeEQsTUFBTSxDQUFDa0UsQ0FBQyxJQUFJO1VBQ1g7VUFDQTtVQUNBO1VBQ0E7VUFDQSxNQUFNalUsS0FBSyxHQUFHdVQsY0FBYyxDQUFDVSxDQUFDLENBQUM7VUFDL0IsT0FDRWpVLEtBQUssSUFDTEEsS0FBSyxDQUFDOEMsSUFBSSxLQUFLLFdBQVcsSUFDMUJtUixDQUFDLENBQUN4UixLQUFLLENBQUMsR0FBRyxDQUFDLENBQUNyRSxNQUFNLEtBQUssQ0FBQyxJQUN6QjZWLENBQUMsQ0FBQ3hSLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBS0gsU0FBUztRQUVqQyxDQUFDLENBQUMsQ0FDRFUsR0FBRyxDQUFDaVIsQ0FBQyxJQUFJQSxDQUFDLENBQUN4UixLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFNUIsSUFBSXlSLGlCQUFpQixHQUFHLEVBQUU7UUFDMUIsSUFBSUYsZUFBZSxDQUFDNVYsTUFBTSxHQUFHLENBQUMsRUFBRTtVQUM5QjhWLGlCQUFpQixHQUNmLE1BQU0sR0FDTkYsZUFBZSxDQUNaaFIsR0FBRyxDQUFDbVIsQ0FBQyxJQUFJO1lBQ1IsTUFBTUwsTUFBTSxHQUFHclAsVUFBVSxDQUFDMFAsQ0FBQyxDQUFDLENBQUNMLE1BQU07WUFDbkMsT0FBUSxhQUFZSyxDQUFFLGtCQUFpQmpSLEtBQU0sWUFBV2lSLENBQUUsaUJBQWdCTCxNQUFPLGVBQWM7VUFDakcsQ0FBQyxDQUFDLENBQ0QxUSxJQUFJLENBQUMsTUFBTSxDQUFDO1VBQ2pCO1VBQ0E0USxlQUFlLENBQUMzUixPQUFPLENBQUNtQixHQUFHLElBQUk7WUFDN0IsT0FBT2lCLFVBQVUsQ0FBQ2pCLEdBQUcsQ0FBQztVQUN4QixDQUFDLENBQUM7UUFDSjtRQUVBLE1BQU00USxZQUEyQixHQUFHelQsTUFBTSxDQUFDeUIsSUFBSSxDQUFDbVIsY0FBYyxDQUFDLENBQzVEeEQsTUFBTSxDQUFDa0UsQ0FBQyxJQUFJO1VBQ1g7VUFDQSxNQUFNalUsS0FBSyxHQUFHdVQsY0FBYyxDQUFDVSxDQUFDLENBQUM7VUFDL0IsT0FDRWpVLEtBQUssSUFDTEEsS0FBSyxDQUFDOEMsSUFBSSxLQUFLLFFBQVEsSUFDdkJtUixDQUFDLENBQUN4UixLQUFLLENBQUMsR0FBRyxDQUFDLENBQUNyRSxNQUFNLEtBQUssQ0FBQyxJQUN6QjZWLENBQUMsQ0FBQ3hSLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBS0gsU0FBUztRQUVqQyxDQUFDLENBQUMsQ0FDRFUsR0FBRyxDQUFDaVIsQ0FBQyxJQUFJQSxDQUFDLENBQUN4UixLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFNUIsTUFBTTRSLGNBQWMsR0FBR0QsWUFBWSxDQUFDbkQsTUFBTSxDQUFDLENBQUNxRCxDQUFTLEVBQUVILENBQVMsRUFBRW5OLENBQVMsS0FBSztVQUM5RSxPQUFPc04sQ0FBQyxHQUFJLFFBQU9wUixLQUFLLEdBQUcsQ0FBQyxHQUFHOEQsQ0FBRSxTQUFRO1FBQzNDLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDTjtRQUNBLElBQUl1TixZQUFZLEdBQUcsYUFBYTtRQUVoQyxJQUFJZixrQkFBa0IsQ0FBQ2xSLFNBQVMsQ0FBQyxFQUFFO1VBQ2pDO1VBQ0FpUyxZQUFZLEdBQUksYUFBWXJSLEtBQU0scUJBQW9CO1FBQ3hEO1FBQ0FvUSxjQUFjLENBQUN0UCxJQUFJLENBQ2hCLElBQUdkLEtBQU0sWUFBV3FSLFlBQWEsSUFBR0YsY0FBZSxJQUFHSCxpQkFBa0IsUUFDdkVoUixLQUFLLEdBQUcsQ0FBQyxHQUFHa1IsWUFBWSxDQUFDaFcsTUFDMUIsV0FBVSxDQUNaO1FBQ0RpRyxNQUFNLENBQUNMLElBQUksQ0FBQzFCLFNBQVMsRUFBRSxHQUFHOFIsWUFBWSxFQUFFelYsSUFBSSxDQUFDQyxTQUFTLENBQUM2RixVQUFVLENBQUMsQ0FBQztRQUNuRXZCLEtBQUssSUFBSSxDQUFDLEdBQUdrUixZQUFZLENBQUNoVyxNQUFNO01BQ2xDLENBQUMsTUFBTSxJQUNMNEgsS0FBSyxDQUFDQyxPQUFPLENBQUN4QixVQUFVLENBQUMsSUFDekJsRCxNQUFNLENBQUNFLE1BQU0sQ0FBQ2EsU0FBUyxDQUFDLElBQ3hCZixNQUFNLENBQUNFLE1BQU0sQ0FBQ2EsU0FBUyxDQUFDLENBQUM3RCxJQUFJLEtBQUssT0FBTyxFQUN6QztRQUNBLE1BQU0rVixZQUFZLEdBQUdoVyx1QkFBdUIsQ0FBQytDLE1BQU0sQ0FBQ0UsTUFBTSxDQUFDYSxTQUFTLENBQUMsQ0FBQztRQUN0RSxJQUFJa1MsWUFBWSxLQUFLLFFBQVEsRUFBRTtVQUM3QmxCLGNBQWMsQ0FBQ3RQLElBQUksQ0FBRSxJQUFHZCxLQUFNLFlBQVdBLEtBQUssR0FBRyxDQUFFLFVBQVMsQ0FBQztVQUM3RG1CLE1BQU0sQ0FBQ0wsSUFBSSxDQUFDMUIsU0FBUyxFQUFFbUMsVUFBVSxDQUFDO1VBQ2xDdkIsS0FBSyxJQUFJLENBQUM7UUFDWixDQUFDLE1BQU07VUFDTG9RLGNBQWMsQ0FBQ3RQLElBQUksQ0FBRSxJQUFHZCxLQUFNLFlBQVdBLEtBQUssR0FBRyxDQUFFLFNBQVEsQ0FBQztVQUM1RG1CLE1BQU0sQ0FBQ0wsSUFBSSxDQUFDMUIsU0FBUyxFQUFFM0QsSUFBSSxDQUFDQyxTQUFTLENBQUM2RixVQUFVLENBQUMsQ0FBQztVQUNsRHZCLEtBQUssSUFBSSxDQUFDO1FBQ1o7TUFDRixDQUFDLE1BQU07UUFDTG5GLEtBQUssQ0FBQyxzQkFBc0IsRUFBRTtVQUFFdUUsU0FBUztVQUFFbUM7UUFBVyxDQUFDLENBQUM7UUFDeEQsT0FBTytJLE9BQU8sQ0FBQ2lILE1BQU0sQ0FDbkIsSUFBSS9RLGFBQUssQ0FBQ0MsS0FBSyxDQUNiRCxhQUFLLENBQUNDLEtBQUssQ0FBQzBHLG1CQUFtQixFQUM5QixtQ0FBa0MxTCxJQUFJLENBQUNDLFNBQVMsQ0FBQzZGLFVBQVUsQ0FBRSxNQUFLLENBQ3BFLENBQ0Y7TUFDSDtJQUNGO0lBRUEsTUFBTXlPLEtBQUssR0FBR2pQLGdCQUFnQixDQUFDO01BQzdCMUMsTUFBTTtNQUNOMkIsS0FBSztNQUNMZ0IsS0FBSztNQUNMQyxlQUFlLEVBQUU7SUFDbkIsQ0FBQyxDQUFDO0lBQ0ZFLE1BQU0sQ0FBQ0wsSUFBSSxDQUFDLEdBQUdrUCxLQUFLLENBQUM3TyxNQUFNLENBQUM7SUFFNUIsTUFBTXFRLFdBQVcsR0FBR3hCLEtBQUssQ0FBQzlOLE9BQU8sQ0FBQ2hILE1BQU0sR0FBRyxDQUFDLEdBQUksU0FBUThVLEtBQUssQ0FBQzlOLE9BQVEsRUFBQyxHQUFHLEVBQUU7SUFDNUUsTUFBTW9LLEVBQUUsR0FBSSxzQkFBcUI4RCxjQUFjLENBQUNsUSxJQUFJLEVBQUcsSUFBR3NSLFdBQVksY0FBYTtJQUNuRixNQUFNaEMsT0FBTyxHQUFHLENBQUNmLG9CQUFvQixHQUFHQSxvQkFBb0IsQ0FBQ3hFLENBQUMsR0FBRyxJQUFJLENBQUNuQyxPQUFPLEVBQUVtRixHQUFHLENBQUNYLEVBQUUsRUFBRW5MLE1BQU0sQ0FBQztJQUM5RixJQUFJc04sb0JBQW9CLEVBQUU7TUFDeEJBLG9CQUFvQixDQUFDbEMsS0FBSyxDQUFDekwsSUFBSSxDQUFDME8sT0FBTyxDQUFDO0lBQzFDO0lBQ0EsT0FBT0EsT0FBTztFQUNoQjs7RUFFQTtFQUNBaUMsZUFBZSxDQUNiblQsU0FBaUIsRUFDakJELE1BQWtCLEVBQ2xCMkMsS0FBZ0IsRUFDaEJqRCxNQUFXLEVBQ1gwUSxvQkFBMEIsRUFDMUI7SUFDQTVULEtBQUssQ0FBQyxpQkFBaUIsQ0FBQztJQUN4QixNQUFNNlcsV0FBVyxHQUFHalUsTUFBTSxDQUFDbU8sTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFNUssS0FBSyxFQUFFakQsTUFBTSxDQUFDO0lBQ3BELE9BQU8sSUFBSSxDQUFDeVEsWUFBWSxDQUFDbFEsU0FBUyxFQUFFRCxNQUFNLEVBQUVxVCxXQUFXLEVBQUVqRCxvQkFBb0IsQ0FBQyxDQUFDbEYsS0FBSyxDQUFDdEMsS0FBSyxJQUFJO01BQzVGO01BQ0EsSUFBSUEsS0FBSyxDQUFDc0UsSUFBSSxLQUFLL0ssYUFBSyxDQUFDQyxLQUFLLENBQUNnTCxlQUFlLEVBQUU7UUFDOUMsTUFBTXhFLEtBQUs7TUFDYjtNQUNBLE9BQU8sSUFBSSxDQUFDaUosZ0JBQWdCLENBQUM1UixTQUFTLEVBQUVELE1BQU0sRUFBRTJDLEtBQUssRUFBRWpELE1BQU0sRUFBRTBRLG9CQUFvQixDQUFDO0lBQ3RGLENBQUMsQ0FBQztFQUNKO0VBRUE5USxJQUFJLENBQ0ZXLFNBQWlCLEVBQ2pCRCxNQUFrQixFQUNsQjJDLEtBQWdCLEVBQ2hCO0lBQUUyUSxJQUFJO0lBQUVDLEtBQUs7SUFBRUMsSUFBSTtJQUFFM1MsSUFBSTtJQUFFK0IsZUFBZTtJQUFFNlE7RUFBc0IsQ0FBQyxFQUNuRTtJQUNBalgsS0FBSyxDQUFDLE1BQU0sQ0FBQztJQUNiLE1BQU1rWCxRQUFRLEdBQUdILEtBQUssS0FBS3ZVLFNBQVM7SUFDcEMsTUFBTTJVLE9BQU8sR0FBR0wsSUFBSSxLQUFLdFUsU0FBUztJQUNsQyxJQUFJOEQsTUFBTSxHQUFHLENBQUM3QyxTQUFTLENBQUM7SUFDeEIsTUFBTTBSLEtBQUssR0FBR2pQLGdCQUFnQixDQUFDO01BQzdCMUMsTUFBTTtNQUNOMkMsS0FBSztNQUNMaEIsS0FBSyxFQUFFLENBQUM7TUFDUmlCO0lBQ0YsQ0FBQyxDQUFDO0lBQ0ZFLE1BQU0sQ0FBQ0wsSUFBSSxDQUFDLEdBQUdrUCxLQUFLLENBQUM3TyxNQUFNLENBQUM7SUFDNUIsTUFBTThRLFlBQVksR0FBR2pDLEtBQUssQ0FBQzlOLE9BQU8sQ0FBQ2hILE1BQU0sR0FBRyxDQUFDLEdBQUksU0FBUThVLEtBQUssQ0FBQzlOLE9BQVEsRUFBQyxHQUFHLEVBQUU7SUFDN0UsTUFBTWdRLFlBQVksR0FBR0gsUUFBUSxHQUFJLFVBQVM1USxNQUFNLENBQUNqRyxNQUFNLEdBQUcsQ0FBRSxFQUFDLEdBQUcsRUFBRTtJQUNsRSxJQUFJNlcsUUFBUSxFQUFFO01BQ1o1USxNQUFNLENBQUNMLElBQUksQ0FBQzhRLEtBQUssQ0FBQztJQUNwQjtJQUNBLE1BQU1PLFdBQVcsR0FBR0gsT0FBTyxHQUFJLFdBQVU3USxNQUFNLENBQUNqRyxNQUFNLEdBQUcsQ0FBRSxFQUFDLEdBQUcsRUFBRTtJQUNqRSxJQUFJOFcsT0FBTyxFQUFFO01BQ1g3USxNQUFNLENBQUNMLElBQUksQ0FBQzZRLElBQUksQ0FBQztJQUNuQjtJQUVBLElBQUlTLFdBQVcsR0FBRyxFQUFFO0lBQ3BCLElBQUlQLElBQUksRUFBRTtNQUNSLE1BQU1RLFFBQWEsR0FBR1IsSUFBSTtNQUMxQixNQUFNUyxPQUFPLEdBQUc3VSxNQUFNLENBQUN5QixJQUFJLENBQUMyUyxJQUFJLENBQUMsQ0FDOUIvUixHQUFHLENBQUNRLEdBQUcsSUFBSTtRQUNWLE1BQU1pUyxZQUFZLEdBQUcxUyw2QkFBNkIsQ0FBQ1MsR0FBRyxDQUFDLENBQUNKLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDbEU7UUFDQSxJQUFJbVMsUUFBUSxDQUFDL1IsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFO1VBQ3ZCLE9BQVEsR0FBRWlTLFlBQWEsTUFBSztRQUM5QjtRQUNBLE9BQVEsR0FBRUEsWUFBYSxPQUFNO01BQy9CLENBQUMsQ0FBQyxDQUNEclMsSUFBSSxFQUFFO01BQ1RrUyxXQUFXLEdBQUdQLElBQUksS0FBS3hVLFNBQVMsSUFBSUksTUFBTSxDQUFDeUIsSUFBSSxDQUFDMlMsSUFBSSxDQUFDLENBQUMzVyxNQUFNLEdBQUcsQ0FBQyxHQUFJLFlBQVdvWCxPQUFRLEVBQUMsR0FBRyxFQUFFO0lBQy9GO0lBQ0EsSUFBSXRDLEtBQUssQ0FBQzVPLEtBQUssSUFBSTNELE1BQU0sQ0FBQ3lCLElBQUksQ0FBRThRLEtBQUssQ0FBQzVPLEtBQUssQ0FBTyxDQUFDbEcsTUFBTSxHQUFHLENBQUMsRUFBRTtNQUM3RGtYLFdBQVcsR0FBSSxZQUFXcEMsS0FBSyxDQUFDNU8sS0FBSyxDQUFDbEIsSUFBSSxFQUFHLEVBQUM7SUFDaEQ7SUFFQSxJQUFJd00sT0FBTyxHQUFHLEdBQUc7SUFDakIsSUFBSXhOLElBQUksRUFBRTtNQUNSO01BQ0E7TUFDQUEsSUFBSSxHQUFHQSxJQUFJLENBQUM2TyxNQUFNLENBQUMsQ0FBQ3lFLElBQUksRUFBRWxTLEdBQUcsS0FBSztRQUNoQyxJQUFJQSxHQUFHLEtBQUssS0FBSyxFQUFFO1VBQ2pCa1MsSUFBSSxDQUFDMVIsSUFBSSxDQUFDLFFBQVEsQ0FBQztVQUNuQjBSLElBQUksQ0FBQzFSLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDckIsQ0FBQyxNQUFNLElBQ0xSLEdBQUcsQ0FBQ3BGLE1BQU0sR0FBRyxDQUFDO1FBQ2Q7UUFDQTtRQUNBO1FBQ0VtRCxNQUFNLENBQUNFLE1BQU0sQ0FBQytCLEdBQUcsQ0FBQyxJQUFJakMsTUFBTSxDQUFDRSxNQUFNLENBQUMrQixHQUFHLENBQUMsQ0FBQy9FLElBQUksS0FBSyxVQUFVLElBQUsrRSxHQUFHLEtBQUssUUFBUSxDQUFDLEVBQ3BGO1VBQ0FrUyxJQUFJLENBQUMxUixJQUFJLENBQUNSLEdBQUcsQ0FBQztRQUNoQjtRQUNBLE9BQU9rUyxJQUFJO01BQ2IsQ0FBQyxFQUFFLEVBQUUsQ0FBQztNQUNOOUYsT0FBTyxHQUFHeE4sSUFBSSxDQUNYWSxHQUFHLENBQUMsQ0FBQ1EsR0FBRyxFQUFFTixLQUFLLEtBQUs7UUFDbkIsSUFBSU0sR0FBRyxLQUFLLFFBQVEsRUFBRTtVQUNwQixPQUFRLDJCQUEwQixDQUFFLE1BQUssQ0FBRSx1QkFBc0IsQ0FBRSxNQUFLLENBQUUsaUJBQWdCO1FBQzVGO1FBQ0EsT0FBUSxJQUFHTixLQUFLLEdBQUdtQixNQUFNLENBQUNqRyxNQUFNLEdBQUcsQ0FBRSxPQUFNO01BQzdDLENBQUMsQ0FBQyxDQUNEZ0YsSUFBSSxFQUFFO01BQ1RpQixNQUFNLEdBQUdBLE1BQU0sQ0FBQ25HLE1BQU0sQ0FBQ2tFLElBQUksQ0FBQztJQUM5QjtJQUVBLE1BQU11VCxhQUFhLEdBQUksVUFBUy9GLE9BQVEsaUJBQWdCdUYsWUFBYSxJQUFHRyxXQUFZLElBQUdGLFlBQWEsSUFBR0MsV0FBWSxFQUFDO0lBQ3BILE1BQU03RixFQUFFLEdBQUd3RixPQUFPLEdBQUcsSUFBSSxDQUFDeEosc0JBQXNCLENBQUNtSyxhQUFhLENBQUMsR0FBR0EsYUFBYTtJQUMvRSxPQUFPLElBQUksQ0FBQzNLLE9BQU8sQ0FDaEJtRixHQUFHLENBQUNYLEVBQUUsRUFBRW5MLE1BQU0sQ0FBQyxDQUNmb0ksS0FBSyxDQUFDdEMsS0FBSyxJQUFJO01BQ2Q7TUFDQSxJQUFJQSxLQUFLLENBQUNzRSxJQUFJLEtBQUtoUixpQ0FBaUMsRUFBRTtRQUNwRCxNQUFNME0sS0FBSztNQUNiO01BQ0EsT0FBTyxFQUFFO0lBQ1gsQ0FBQyxDQUFDLENBQ0R1RyxJQUFJLENBQUNLLE9BQU8sSUFBSTtNQUNmLElBQUlpRSxPQUFPLEVBQUU7UUFDWCxPQUFPakUsT0FBTztNQUNoQjtNQUNBLE9BQU9BLE9BQU8sQ0FBQy9OLEdBQUcsQ0FBQ2IsTUFBTSxJQUFJLElBQUksQ0FBQ3lULDJCQUEyQixDQUFDcFUsU0FBUyxFQUFFVyxNQUFNLEVBQUVaLE1BQU0sQ0FBQyxDQUFDO0lBQzNGLENBQUMsQ0FBQztFQUNOOztFQUVBO0VBQ0E7RUFDQXFVLDJCQUEyQixDQUFDcFUsU0FBaUIsRUFBRVcsTUFBVyxFQUFFWixNQUFXLEVBQUU7SUFDdkVaLE1BQU0sQ0FBQ3lCLElBQUksQ0FBQ2IsTUFBTSxDQUFDRSxNQUFNLENBQUMsQ0FBQ1ksT0FBTyxDQUFDQyxTQUFTLElBQUk7TUFDOUMsSUFBSWYsTUFBTSxDQUFDRSxNQUFNLENBQUNhLFNBQVMsQ0FBQyxDQUFDN0QsSUFBSSxLQUFLLFNBQVMsSUFBSTBELE1BQU0sQ0FBQ0csU0FBUyxDQUFDLEVBQUU7UUFDcEVILE1BQU0sQ0FBQ0csU0FBUyxDQUFDLEdBQUc7VUFDbEI3QixRQUFRLEVBQUUwQixNQUFNLENBQUNHLFNBQVMsQ0FBQztVQUMzQnJDLE1BQU0sRUFBRSxTQUFTO1VBQ2pCdUIsU0FBUyxFQUFFRCxNQUFNLENBQUNFLE1BQU0sQ0FBQ2EsU0FBUyxDQUFDLENBQUN1VDtRQUN0QyxDQUFDO01BQ0g7TUFDQSxJQUFJdFUsTUFBTSxDQUFDRSxNQUFNLENBQUNhLFNBQVMsQ0FBQyxDQUFDN0QsSUFBSSxLQUFLLFVBQVUsRUFBRTtRQUNoRDBELE1BQU0sQ0FBQ0csU0FBUyxDQUFDLEdBQUc7VUFDbEJyQyxNQUFNLEVBQUUsVUFBVTtVQUNsQnVCLFNBQVMsRUFBRUQsTUFBTSxDQUFDRSxNQUFNLENBQUNhLFNBQVMsQ0FBQyxDQUFDdVQ7UUFDdEMsQ0FBQztNQUNIO01BQ0EsSUFBSTFULE1BQU0sQ0FBQ0csU0FBUyxDQUFDLElBQUlmLE1BQU0sQ0FBQ0UsTUFBTSxDQUFDYSxTQUFTLENBQUMsQ0FBQzdELElBQUksS0FBSyxVQUFVLEVBQUU7UUFDckUwRCxNQUFNLENBQUNHLFNBQVMsQ0FBQyxHQUFHO1VBQ2xCckMsTUFBTSxFQUFFLFVBQVU7VUFDbEI0RixRQUFRLEVBQUUxRCxNQUFNLENBQUNHLFNBQVMsQ0FBQyxDQUFDd1QsQ0FBQztVQUM3QmxRLFNBQVMsRUFBRXpELE1BQU0sQ0FBQ0csU0FBUyxDQUFDLENBQUN5VDtRQUMvQixDQUFDO01BQ0g7TUFDQSxJQUFJNVQsTUFBTSxDQUFDRyxTQUFTLENBQUMsSUFBSWYsTUFBTSxDQUFDRSxNQUFNLENBQUNhLFNBQVMsQ0FBQyxDQUFDN0QsSUFBSSxLQUFLLFNBQVMsRUFBRTtRQUNwRSxJQUFJdVgsTUFBTSxHQUFHN1QsTUFBTSxDQUFDRyxTQUFTLENBQUM7UUFDOUIwVCxNQUFNLEdBQUdBLE1BQU0sQ0FBQzFTLE1BQU0sQ0FBQyxDQUFDLEVBQUUwUyxNQUFNLENBQUM1WCxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUNxRSxLQUFLLENBQUMsS0FBSyxDQUFDO1FBQ3pEdVQsTUFBTSxHQUFHQSxNQUFNLENBQUNoVCxHQUFHLENBQUMyQyxLQUFLLElBQUk7VUFDM0IsT0FBTyxDQUFDc1EsVUFBVSxDQUFDdFEsS0FBSyxDQUFDbEQsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUV3VCxVQUFVLENBQUN0USxLQUFLLENBQUNsRCxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMzRSxDQUFDLENBQUM7UUFDRk4sTUFBTSxDQUFDRyxTQUFTLENBQUMsR0FBRztVQUNsQnJDLE1BQU0sRUFBRSxTQUFTO1VBQ2pCa0osV0FBVyxFQUFFNk07UUFDZixDQUFDO01BQ0g7TUFDQSxJQUFJN1QsTUFBTSxDQUFDRyxTQUFTLENBQUMsSUFBSWYsTUFBTSxDQUFDRSxNQUFNLENBQUNhLFNBQVMsQ0FBQyxDQUFDN0QsSUFBSSxLQUFLLE1BQU0sRUFBRTtRQUNqRTBELE1BQU0sQ0FBQ0csU0FBUyxDQUFDLEdBQUc7VUFDbEJyQyxNQUFNLEVBQUUsTUFBTTtVQUNkRSxJQUFJLEVBQUVnQyxNQUFNLENBQUNHLFNBQVM7UUFDeEIsQ0FBQztNQUNIO0lBQ0YsQ0FBQyxDQUFDO0lBQ0Y7SUFDQSxJQUFJSCxNQUFNLENBQUMrVCxTQUFTLEVBQUU7TUFDcEIvVCxNQUFNLENBQUMrVCxTQUFTLEdBQUcvVCxNQUFNLENBQUMrVCxTQUFTLENBQUNDLFdBQVcsRUFBRTtJQUNuRDtJQUNBLElBQUloVSxNQUFNLENBQUNpVSxTQUFTLEVBQUU7TUFDcEJqVSxNQUFNLENBQUNpVSxTQUFTLEdBQUdqVSxNQUFNLENBQUNpVSxTQUFTLENBQUNELFdBQVcsRUFBRTtJQUNuRDtJQUNBLElBQUloVSxNQUFNLENBQUNrVSxTQUFTLEVBQUU7TUFDcEJsVSxNQUFNLENBQUNrVSxTQUFTLEdBQUc7UUFDakJwVyxNQUFNLEVBQUUsTUFBTTtRQUNkQyxHQUFHLEVBQUVpQyxNQUFNLENBQUNrVSxTQUFTLENBQUNGLFdBQVc7TUFDbkMsQ0FBQztJQUNIO0lBQ0EsSUFBSWhVLE1BQU0sQ0FBQzRNLDhCQUE4QixFQUFFO01BQ3pDNU0sTUFBTSxDQUFDNE0sOEJBQThCLEdBQUc7UUFDdEM5TyxNQUFNLEVBQUUsTUFBTTtRQUNkQyxHQUFHLEVBQUVpQyxNQUFNLENBQUM0TSw4QkFBOEIsQ0FBQ29ILFdBQVc7TUFDeEQsQ0FBQztJQUNIO0lBQ0EsSUFBSWhVLE1BQU0sQ0FBQzhNLDJCQUEyQixFQUFFO01BQ3RDOU0sTUFBTSxDQUFDOE0sMkJBQTJCLEdBQUc7UUFDbkNoUCxNQUFNLEVBQUUsTUFBTTtRQUNkQyxHQUFHLEVBQUVpQyxNQUFNLENBQUM4TSwyQkFBMkIsQ0FBQ2tILFdBQVc7TUFDckQsQ0FBQztJQUNIO0lBQ0EsSUFBSWhVLE1BQU0sQ0FBQ2lOLDRCQUE0QixFQUFFO01BQ3ZDak4sTUFBTSxDQUFDaU4sNEJBQTRCLEdBQUc7UUFDcENuUCxNQUFNLEVBQUUsTUFBTTtRQUNkQyxHQUFHLEVBQUVpQyxNQUFNLENBQUNpTiw0QkFBNEIsQ0FBQytHLFdBQVc7TUFDdEQsQ0FBQztJQUNIO0lBQ0EsSUFBSWhVLE1BQU0sQ0FBQ2tOLG9CQUFvQixFQUFFO01BQy9CbE4sTUFBTSxDQUFDa04sb0JBQW9CLEdBQUc7UUFDNUJwUCxNQUFNLEVBQUUsTUFBTTtRQUNkQyxHQUFHLEVBQUVpQyxNQUFNLENBQUNrTixvQkFBb0IsQ0FBQzhHLFdBQVc7TUFDOUMsQ0FBQztJQUNIO0lBRUEsS0FBSyxNQUFNN1QsU0FBUyxJQUFJSCxNQUFNLEVBQUU7TUFDOUIsSUFBSUEsTUFBTSxDQUFDRyxTQUFTLENBQUMsS0FBSyxJQUFJLEVBQUU7UUFDOUIsT0FBT0gsTUFBTSxDQUFDRyxTQUFTLENBQUM7TUFDMUI7TUFDQSxJQUFJSCxNQUFNLENBQUNHLFNBQVMsQ0FBQyxZQUFZdU8sSUFBSSxFQUFFO1FBQ3JDMU8sTUFBTSxDQUFDRyxTQUFTLENBQUMsR0FBRztVQUNsQnJDLE1BQU0sRUFBRSxNQUFNO1VBQ2RDLEdBQUcsRUFBRWlDLE1BQU0sQ0FBQ0csU0FBUyxDQUFDLENBQUM2VCxXQUFXO1FBQ3BDLENBQUM7TUFDSDtJQUNGO0lBRUEsT0FBT2hVLE1BQU07RUFDZjs7RUFFQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0EsTUFBTW1VLGdCQUFnQixDQUFDOVUsU0FBaUIsRUFBRUQsTUFBa0IsRUFBRThQLFVBQW9CLEVBQUU7SUFDbEYsTUFBTWtGLGNBQWMsR0FBSSxHQUFFL1UsU0FBVSxXQUFVNlAsVUFBVSxDQUFDMEQsSUFBSSxFQUFFLENBQUMzUixJQUFJLENBQUMsR0FBRyxDQUFFLEVBQUM7SUFDM0UsTUFBTW9ULGtCQUFrQixHQUFHbkYsVUFBVSxDQUFDck8sR0FBRyxDQUFDLENBQUNWLFNBQVMsRUFBRVksS0FBSyxLQUFNLElBQUdBLEtBQUssR0FBRyxDQUFFLE9BQU0sQ0FBQztJQUNyRixNQUFNc00sRUFBRSxHQUFJLHdEQUF1RGdILGtCQUFrQixDQUFDcFQsSUFBSSxFQUFHLEdBQUU7SUFDL0YsT0FBTyxJQUFJLENBQUM0SCxPQUFPLENBQUN1QixJQUFJLENBQUNpRCxFQUFFLEVBQUUsQ0FBQ2hPLFNBQVMsRUFBRStVLGNBQWMsRUFBRSxHQUFHbEYsVUFBVSxDQUFDLENBQUMsQ0FBQzVFLEtBQUssQ0FBQ3RDLEtBQUssSUFBSTtNQUN0RixJQUFJQSxLQUFLLENBQUNzRSxJQUFJLEtBQUsvUSw4QkFBOEIsSUFBSXlNLEtBQUssQ0FBQ3NNLE9BQU8sQ0FBQ2hULFFBQVEsQ0FBQzhTLGNBQWMsQ0FBQyxFQUFFO1FBQzNGO01BQUEsQ0FDRCxNQUFNLElBQ0xwTSxLQUFLLENBQUNzRSxJQUFJLEtBQUs1USxpQ0FBaUMsSUFDaERzTSxLQUFLLENBQUNzTSxPQUFPLENBQUNoVCxRQUFRLENBQUM4UyxjQUFjLENBQUMsRUFDdEM7UUFDQTtRQUNBLE1BQU0sSUFBSTdTLGFBQUssQ0FBQ0MsS0FBSyxDQUNuQkQsYUFBSyxDQUFDQyxLQUFLLENBQUNnTCxlQUFlLEVBQzNCLCtEQUErRCxDQUNoRTtNQUNILENBQUMsTUFBTTtRQUNMLE1BQU14RSxLQUFLO01BQ2I7SUFDRixDQUFDLENBQUM7RUFDSjs7RUFFQTtFQUNBLE1BQU1wSixLQUFLLENBQ1RTLFNBQWlCLEVBQ2pCRCxNQUFrQixFQUNsQjJDLEtBQWdCLEVBQ2hCd1MsY0FBdUIsRUFDdkJDLFFBQWtCLEdBQUcsSUFBSSxFQUN6QjtJQUNBNVksS0FBSyxDQUFDLE9BQU8sQ0FBQztJQUNkLE1BQU1zRyxNQUFNLEdBQUcsQ0FBQzdDLFNBQVMsQ0FBQztJQUMxQixNQUFNMFIsS0FBSyxHQUFHalAsZ0JBQWdCLENBQUM7TUFDN0IxQyxNQUFNO01BQ04yQyxLQUFLO01BQ0xoQixLQUFLLEVBQUUsQ0FBQztNQUNSaUIsZUFBZSxFQUFFO0lBQ25CLENBQUMsQ0FBQztJQUNGRSxNQUFNLENBQUNMLElBQUksQ0FBQyxHQUFHa1AsS0FBSyxDQUFDN08sTUFBTSxDQUFDO0lBRTVCLE1BQU04USxZQUFZLEdBQUdqQyxLQUFLLENBQUM5TixPQUFPLENBQUNoSCxNQUFNLEdBQUcsQ0FBQyxHQUFJLFNBQVE4VSxLQUFLLENBQUM5TixPQUFRLEVBQUMsR0FBRyxFQUFFO0lBQzdFLElBQUlvSyxFQUFFLEdBQUcsRUFBRTtJQUVYLElBQUkwRCxLQUFLLENBQUM5TixPQUFPLENBQUNoSCxNQUFNLEdBQUcsQ0FBQyxJQUFJLENBQUN1WSxRQUFRLEVBQUU7TUFDekNuSCxFQUFFLEdBQUksZ0NBQStCMkYsWUFBYSxFQUFDO0lBQ3JELENBQUMsTUFBTTtNQUNMM0YsRUFBRSxHQUFHLDRFQUE0RTtJQUNuRjtJQUVBLE9BQU8sSUFBSSxDQUFDeEUsT0FBTyxDQUNoQjZCLEdBQUcsQ0FBQzJDLEVBQUUsRUFBRW5MLE1BQU0sRUFBRXlJLENBQUMsSUFBSTtNQUNwQixJQUFJQSxDQUFDLENBQUM4SixxQkFBcUIsSUFBSSxJQUFJLElBQUk5SixDQUFDLENBQUM4SixxQkFBcUIsSUFBSSxDQUFDLENBQUMsRUFBRTtRQUNwRSxPQUFPLENBQUM3TixLQUFLLENBQUMsQ0FBQytELENBQUMsQ0FBQy9MLEtBQUssQ0FBQyxHQUFHLENBQUMrTCxDQUFDLENBQUMvTCxLQUFLLEdBQUcsQ0FBQztNQUN4QyxDQUFDLE1BQU07UUFDTCxPQUFPLENBQUMrTCxDQUFDLENBQUM4SixxQkFBcUI7TUFDakM7SUFDRixDQUFDLENBQUMsQ0FDRG5LLEtBQUssQ0FBQ3RDLEtBQUssSUFBSTtNQUNkLElBQUlBLEtBQUssQ0FBQ3NFLElBQUksS0FBS2hSLGlDQUFpQyxFQUFFO1FBQ3BELE1BQU0wTSxLQUFLO01BQ2I7TUFDQSxPQUFPLENBQUM7SUFDVixDQUFDLENBQUM7RUFDTjtFQUVBLE1BQU0wTSxRQUFRLENBQUNyVixTQUFpQixFQUFFRCxNQUFrQixFQUFFMkMsS0FBZ0IsRUFBRTVCLFNBQWlCLEVBQUU7SUFDekZ2RSxLQUFLLENBQUMsVUFBVSxDQUFDO0lBQ2pCLElBQUlnRyxLQUFLLEdBQUd6QixTQUFTO0lBQ3JCLElBQUl3VSxNQUFNLEdBQUd4VSxTQUFTO0lBQ3RCLE1BQU15VSxRQUFRLEdBQUd6VSxTQUFTLENBQUNDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDO0lBQzVDLElBQUl3VSxRQUFRLEVBQUU7TUFDWmhULEtBQUssR0FBR2hCLDZCQUE2QixDQUFDVCxTQUFTLENBQUMsQ0FBQ2MsSUFBSSxDQUFDLElBQUksQ0FBQztNQUMzRDBULE1BQU0sR0FBR3hVLFNBQVMsQ0FBQ0csS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNsQztJQUNBLE1BQU04QixZQUFZLEdBQ2hCaEQsTUFBTSxDQUFDRSxNQUFNLElBQUlGLE1BQU0sQ0FBQ0UsTUFBTSxDQUFDYSxTQUFTLENBQUMsSUFBSWYsTUFBTSxDQUFDRSxNQUFNLENBQUNhLFNBQVMsQ0FBQyxDQUFDN0QsSUFBSSxLQUFLLE9BQU87SUFDeEYsTUFBTXVZLGNBQWMsR0FDbEJ6VixNQUFNLENBQUNFLE1BQU0sSUFBSUYsTUFBTSxDQUFDRSxNQUFNLENBQUNhLFNBQVMsQ0FBQyxJQUFJZixNQUFNLENBQUNFLE1BQU0sQ0FBQ2EsU0FBUyxDQUFDLENBQUM3RCxJQUFJLEtBQUssU0FBUztJQUMxRixNQUFNNEYsTUFBTSxHQUFHLENBQUNOLEtBQUssRUFBRStTLE1BQU0sRUFBRXRWLFNBQVMsQ0FBQztJQUN6QyxNQUFNMFIsS0FBSyxHQUFHalAsZ0JBQWdCLENBQUM7TUFDN0IxQyxNQUFNO01BQ04yQyxLQUFLO01BQ0xoQixLQUFLLEVBQUUsQ0FBQztNQUNSaUIsZUFBZSxFQUFFO0lBQ25CLENBQUMsQ0FBQztJQUNGRSxNQUFNLENBQUNMLElBQUksQ0FBQyxHQUFHa1AsS0FBSyxDQUFDN08sTUFBTSxDQUFDO0lBRTVCLE1BQU04USxZQUFZLEdBQUdqQyxLQUFLLENBQUM5TixPQUFPLENBQUNoSCxNQUFNLEdBQUcsQ0FBQyxHQUFJLFNBQVE4VSxLQUFLLENBQUM5TixPQUFRLEVBQUMsR0FBRyxFQUFFO0lBQzdFLE1BQU02UixXQUFXLEdBQUcxUyxZQUFZLEdBQUcsc0JBQXNCLEdBQUcsSUFBSTtJQUNoRSxJQUFJaUwsRUFBRSxHQUFJLG1CQUFrQnlILFdBQVksa0NBQWlDOUIsWUFBYSxFQUFDO0lBQ3ZGLElBQUk0QixRQUFRLEVBQUU7TUFDWnZILEVBQUUsR0FBSSxtQkFBa0J5SCxXQUFZLGdDQUErQjlCLFlBQWEsRUFBQztJQUNuRjtJQUNBLE9BQU8sSUFBSSxDQUFDbkssT0FBTyxDQUNoQm1GLEdBQUcsQ0FBQ1gsRUFBRSxFQUFFbkwsTUFBTSxDQUFDLENBQ2ZvSSxLQUFLLENBQUN0QyxLQUFLLElBQUk7TUFDZCxJQUFJQSxLQUFLLENBQUNzRSxJQUFJLEtBQUs3USwwQkFBMEIsRUFBRTtRQUM3QyxPQUFPLEVBQUU7TUFDWDtNQUNBLE1BQU11TSxLQUFLO0lBQ2IsQ0FBQyxDQUFDLENBQ0R1RyxJQUFJLENBQUNLLE9BQU8sSUFBSTtNQUNmLElBQUksQ0FBQ2dHLFFBQVEsRUFBRTtRQUNiaEcsT0FBTyxHQUFHQSxPQUFPLENBQUNoQixNQUFNLENBQUM1TixNQUFNLElBQUlBLE1BQU0sQ0FBQzRCLEtBQUssQ0FBQyxLQUFLLElBQUksQ0FBQztRQUMxRCxPQUFPZ04sT0FBTyxDQUFDL04sR0FBRyxDQUFDYixNQUFNLElBQUk7VUFDM0IsSUFBSSxDQUFDNlUsY0FBYyxFQUFFO1lBQ25CLE9BQU83VSxNQUFNLENBQUM0QixLQUFLLENBQUM7VUFDdEI7VUFDQSxPQUFPO1lBQ0w5RCxNQUFNLEVBQUUsU0FBUztZQUNqQnVCLFNBQVMsRUFBRUQsTUFBTSxDQUFDRSxNQUFNLENBQUNhLFNBQVMsQ0FBQyxDQUFDdVQsV0FBVztZQUMvQ3BWLFFBQVEsRUFBRTBCLE1BQU0sQ0FBQzRCLEtBQUs7VUFDeEIsQ0FBQztRQUNILENBQUMsQ0FBQztNQUNKO01BQ0EsTUFBTW1ULEtBQUssR0FBRzVVLFNBQVMsQ0FBQ0csS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNyQyxPQUFPc08sT0FBTyxDQUFDL04sR0FBRyxDQUFDYixNQUFNLElBQUlBLE1BQU0sQ0FBQzJVLE1BQU0sQ0FBQyxDQUFDSSxLQUFLLENBQUMsQ0FBQztJQUNyRCxDQUFDLENBQUMsQ0FDRHhHLElBQUksQ0FBQ0ssT0FBTyxJQUNYQSxPQUFPLENBQUMvTixHQUFHLENBQUNiLE1BQU0sSUFBSSxJQUFJLENBQUN5VCwyQkFBMkIsQ0FBQ3BVLFNBQVMsRUFBRVcsTUFBTSxFQUFFWixNQUFNLENBQUMsQ0FBQyxDQUNuRjtFQUNMO0VBRUEsTUFBTTRWLFNBQVMsQ0FDYjNWLFNBQWlCLEVBQ2pCRCxNQUFXLEVBQ1g2VixRQUFhLEVBQ2JWLGNBQXVCLEVBQ3ZCVyxJQUFZLEVBQ1pyQyxPQUFpQixFQUNqQjtJQUNBalgsS0FBSyxDQUFDLFdBQVcsQ0FBQztJQUNsQixNQUFNc0csTUFBTSxHQUFHLENBQUM3QyxTQUFTLENBQUM7SUFDMUIsSUFBSTBCLEtBQWEsR0FBRyxDQUFDO0lBQ3JCLElBQUkwTSxPQUFpQixHQUFHLEVBQUU7SUFDMUIsSUFBSTBILFVBQVUsR0FBRyxJQUFJO0lBQ3JCLElBQUlDLFdBQVcsR0FBRyxJQUFJO0lBQ3RCLElBQUlwQyxZQUFZLEdBQUcsRUFBRTtJQUNyQixJQUFJQyxZQUFZLEdBQUcsRUFBRTtJQUNyQixJQUFJQyxXQUFXLEdBQUcsRUFBRTtJQUNwQixJQUFJQyxXQUFXLEdBQUcsRUFBRTtJQUNwQixJQUFJa0MsWUFBWSxHQUFHLEVBQUU7SUFDckIsS0FBSyxJQUFJeFEsQ0FBQyxHQUFHLENBQUMsRUFBRUEsQ0FBQyxHQUFHb1EsUUFBUSxDQUFDaFosTUFBTSxFQUFFNEksQ0FBQyxJQUFJLENBQUMsRUFBRTtNQUMzQyxNQUFNeVEsS0FBSyxHQUFHTCxRQUFRLENBQUNwUSxDQUFDLENBQUM7TUFDekIsSUFBSXlRLEtBQUssQ0FBQ0MsTUFBTSxFQUFFO1FBQ2hCLEtBQUssTUFBTTNULEtBQUssSUFBSTBULEtBQUssQ0FBQ0MsTUFBTSxFQUFFO1VBQ2hDLE1BQU0xWCxLQUFLLEdBQUd5WCxLQUFLLENBQUNDLE1BQU0sQ0FBQzNULEtBQUssQ0FBQztVQUNqQyxJQUFJL0QsS0FBSyxLQUFLLElBQUksSUFBSUEsS0FBSyxLQUFLTyxTQUFTLEVBQUU7WUFDekM7VUFDRjtVQUNBLElBQUl3RCxLQUFLLEtBQUssS0FBSyxJQUFJLE9BQU8vRCxLQUFLLEtBQUssUUFBUSxJQUFJQSxLQUFLLEtBQUssRUFBRSxFQUFFO1lBQ2hFNFAsT0FBTyxDQUFDNUwsSUFBSSxDQUFFLElBQUdkLEtBQU0scUJBQW9CLENBQUM7WUFDNUNzVSxZQUFZLEdBQUksYUFBWXRVLEtBQU0sT0FBTTtZQUN4Q21CLE1BQU0sQ0FBQ0wsSUFBSSxDQUFDWCx1QkFBdUIsQ0FBQ3JELEtBQUssQ0FBQyxDQUFDO1lBQzNDa0QsS0FBSyxJQUFJLENBQUM7WUFDVjtVQUNGO1VBQ0EsSUFBSWEsS0FBSyxLQUFLLEtBQUssSUFBSSxPQUFPL0QsS0FBSyxLQUFLLFFBQVEsSUFBSVcsTUFBTSxDQUFDeUIsSUFBSSxDQUFDcEMsS0FBSyxDQUFDLENBQUM1QixNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQ25GbVosV0FBVyxHQUFHdlgsS0FBSztZQUNuQixNQUFNMlgsYUFBYSxHQUFHLEVBQUU7WUFDeEIsS0FBSyxNQUFNQyxLQUFLLElBQUk1WCxLQUFLLEVBQUU7Y0FDekIsSUFBSSxPQUFPQSxLQUFLLENBQUM0WCxLQUFLLENBQUMsS0FBSyxRQUFRLElBQUk1WCxLQUFLLENBQUM0WCxLQUFLLENBQUMsRUFBRTtnQkFDcEQsTUFBTUMsTUFBTSxHQUFHeFUsdUJBQXVCLENBQUNyRCxLQUFLLENBQUM0WCxLQUFLLENBQUMsQ0FBQztnQkFDcEQsSUFBSSxDQUFDRCxhQUFhLENBQUNsVSxRQUFRLENBQUUsSUFBR29VLE1BQU8sR0FBRSxDQUFDLEVBQUU7a0JBQzFDRixhQUFhLENBQUMzVCxJQUFJLENBQUUsSUFBRzZULE1BQU8sR0FBRSxDQUFDO2dCQUNuQztnQkFDQXhULE1BQU0sQ0FBQ0wsSUFBSSxDQUFDNlQsTUFBTSxFQUFFRCxLQUFLLENBQUM7Z0JBQzFCaEksT0FBTyxDQUFDNUwsSUFBSSxDQUFFLElBQUdkLEtBQU0sYUFBWUEsS0FBSyxHQUFHLENBQUUsT0FBTSxDQUFDO2dCQUNwREEsS0FBSyxJQUFJLENBQUM7Y0FDWixDQUFDLE1BQU07Z0JBQ0wsTUFBTTRVLFNBQVMsR0FBR25YLE1BQU0sQ0FBQ3lCLElBQUksQ0FBQ3BDLEtBQUssQ0FBQzRYLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUM5QyxNQUFNQyxNQUFNLEdBQUd4VSx1QkFBdUIsQ0FBQ3JELEtBQUssQ0FBQzRYLEtBQUssQ0FBQyxDQUFDRSxTQUFTLENBQUMsQ0FBQztnQkFDL0QsSUFBSTVZLHdCQUF3QixDQUFDNFksU0FBUyxDQUFDLEVBQUU7a0JBQ3ZDLElBQUksQ0FBQ0gsYUFBYSxDQUFDbFUsUUFBUSxDQUFFLElBQUdvVSxNQUFPLEdBQUUsQ0FBQyxFQUFFO29CQUMxQ0YsYUFBYSxDQUFDM1QsSUFBSSxDQUFFLElBQUc2VCxNQUFPLEdBQUUsQ0FBQztrQkFDbkM7a0JBQ0FqSSxPQUFPLENBQUM1TCxJQUFJLENBQ1QsV0FDQzlFLHdCQUF3QixDQUFDNFksU0FBUyxDQUNuQyxVQUFTNVUsS0FBTSwwQ0FBeUNBLEtBQUssR0FBRyxDQUFFLE9BQU0sQ0FDMUU7a0JBQ0RtQixNQUFNLENBQUNMLElBQUksQ0FBQzZULE1BQU0sRUFBRUQsS0FBSyxDQUFDO2tCQUMxQjFVLEtBQUssSUFBSSxDQUFDO2dCQUNaO2NBQ0Y7WUFDRjtZQUNBc1UsWUFBWSxHQUFJLGFBQVl0VSxLQUFNLE1BQUs7WUFDdkNtQixNQUFNLENBQUNMLElBQUksQ0FBQzJULGFBQWEsQ0FBQ3ZVLElBQUksRUFBRSxDQUFDO1lBQ2pDRixLQUFLLElBQUksQ0FBQztZQUNWO1VBQ0Y7VUFDQSxJQUFJLE9BQU9sRCxLQUFLLEtBQUssUUFBUSxFQUFFO1lBQzdCLElBQUlBLEtBQUssQ0FBQytYLElBQUksRUFBRTtjQUNkLElBQUksT0FBTy9YLEtBQUssQ0FBQytYLElBQUksS0FBSyxRQUFRLEVBQUU7Z0JBQ2xDbkksT0FBTyxDQUFDNUwsSUFBSSxDQUFFLFFBQU9kLEtBQU0sY0FBYUEsS0FBSyxHQUFHLENBQUUsT0FBTSxDQUFDO2dCQUN6RG1CLE1BQU0sQ0FBQ0wsSUFBSSxDQUFDWCx1QkFBdUIsQ0FBQ3JELEtBQUssQ0FBQytYLElBQUksQ0FBQyxFQUFFaFUsS0FBSyxDQUFDO2dCQUN2RGIsS0FBSyxJQUFJLENBQUM7Y0FDWixDQUFDLE1BQU07Z0JBQ0xvVSxVQUFVLEdBQUd2VCxLQUFLO2dCQUNsQjZMLE9BQU8sQ0FBQzVMLElBQUksQ0FBRSxnQkFBZWQsS0FBTSxPQUFNLENBQUM7Z0JBQzFDbUIsTUFBTSxDQUFDTCxJQUFJLENBQUNELEtBQUssQ0FBQztnQkFDbEJiLEtBQUssSUFBSSxDQUFDO2NBQ1o7WUFDRjtZQUNBLElBQUlsRCxLQUFLLENBQUNnWSxJQUFJLEVBQUU7Y0FDZHBJLE9BQU8sQ0FBQzVMLElBQUksQ0FBRSxRQUFPZCxLQUFNLGNBQWFBLEtBQUssR0FBRyxDQUFFLE9BQU0sQ0FBQztjQUN6RG1CLE1BQU0sQ0FBQ0wsSUFBSSxDQUFDWCx1QkFBdUIsQ0FBQ3JELEtBQUssQ0FBQ2dZLElBQUksQ0FBQyxFQUFFalUsS0FBSyxDQUFDO2NBQ3ZEYixLQUFLLElBQUksQ0FBQztZQUNaO1lBQ0EsSUFBSWxELEtBQUssQ0FBQ2lZLElBQUksRUFBRTtjQUNkckksT0FBTyxDQUFDNUwsSUFBSSxDQUFFLFFBQU9kLEtBQU0sY0FBYUEsS0FBSyxHQUFHLENBQUUsT0FBTSxDQUFDO2NBQ3pEbUIsTUFBTSxDQUFDTCxJQUFJLENBQUNYLHVCQUF1QixDQUFDckQsS0FBSyxDQUFDaVksSUFBSSxDQUFDLEVBQUVsVSxLQUFLLENBQUM7Y0FDdkRiLEtBQUssSUFBSSxDQUFDO1lBQ1o7WUFDQSxJQUFJbEQsS0FBSyxDQUFDa1ksSUFBSSxFQUFFO2NBQ2R0SSxPQUFPLENBQUM1TCxJQUFJLENBQUUsUUFBT2QsS0FBTSxjQUFhQSxLQUFLLEdBQUcsQ0FBRSxPQUFNLENBQUM7Y0FDekRtQixNQUFNLENBQUNMLElBQUksQ0FBQ1gsdUJBQXVCLENBQUNyRCxLQUFLLENBQUNrWSxJQUFJLENBQUMsRUFBRW5VLEtBQUssQ0FBQztjQUN2RGIsS0FBSyxJQUFJLENBQUM7WUFDWjtVQUNGO1FBQ0Y7TUFDRixDQUFDLE1BQU07UUFDTDBNLE9BQU8sQ0FBQzVMLElBQUksQ0FBQyxHQUFHLENBQUM7TUFDbkI7TUFDQSxJQUFJeVQsS0FBSyxDQUFDVSxRQUFRLEVBQUU7UUFDbEIsSUFBSXZJLE9BQU8sQ0FBQ25NLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRTtVQUN6Qm1NLE9BQU8sR0FBRyxFQUFFO1FBQ2Q7UUFDQSxLQUFLLE1BQU03TCxLQUFLLElBQUkwVCxLQUFLLENBQUNVLFFBQVEsRUFBRTtVQUNsQyxNQUFNblksS0FBSyxHQUFHeVgsS0FBSyxDQUFDVSxRQUFRLENBQUNwVSxLQUFLLENBQUM7VUFDbkMsSUFBSS9ELEtBQUssS0FBSyxDQUFDLElBQUlBLEtBQUssS0FBSyxJQUFJLEVBQUU7WUFDakM0UCxPQUFPLENBQUM1TCxJQUFJLENBQUUsSUFBR2QsS0FBTSxPQUFNLENBQUM7WUFDOUJtQixNQUFNLENBQUNMLElBQUksQ0FBQ0QsS0FBSyxDQUFDO1lBQ2xCYixLQUFLLElBQUksQ0FBQztVQUNaO1FBQ0Y7TUFDRjtNQUNBLElBQUl1VSxLQUFLLENBQUNXLE1BQU0sRUFBRTtRQUNoQixNQUFNaFUsUUFBUSxHQUFHLEVBQUU7UUFDbkIsTUFBTWlCLE9BQU8sR0FBRzFFLE1BQU0sQ0FBQ29OLFNBQVMsQ0FBQ0MsY0FBYyxDQUFDQyxJQUFJLENBQUN3SixLQUFLLENBQUNXLE1BQU0sRUFBRSxLQUFLLENBQUMsR0FDckUsTUFBTSxHQUNOLE9BQU87UUFFWCxJQUFJWCxLQUFLLENBQUNXLE1BQU0sQ0FBQ0MsR0FBRyxFQUFFO1VBQ3BCLE1BQU1DLFFBQVEsR0FBRyxDQUFDLENBQUM7VUFDbkJiLEtBQUssQ0FBQ1csTUFBTSxDQUFDQyxHQUFHLENBQUNoVyxPQUFPLENBQUNrVyxPQUFPLElBQUk7WUFDbEMsS0FBSyxNQUFNL1UsR0FBRyxJQUFJK1UsT0FBTyxFQUFFO2NBQ3pCRCxRQUFRLENBQUM5VSxHQUFHLENBQUMsR0FBRytVLE9BQU8sQ0FBQy9VLEdBQUcsQ0FBQztZQUM5QjtVQUNGLENBQUMsQ0FBQztVQUNGaVUsS0FBSyxDQUFDVyxNQUFNLEdBQUdFLFFBQVE7UUFDekI7UUFDQSxLQUFLLElBQUl2VSxLQUFLLElBQUkwVCxLQUFLLENBQUNXLE1BQU0sRUFBRTtVQUM5QixNQUFNcFksS0FBSyxHQUFHeVgsS0FBSyxDQUFDVyxNQUFNLENBQUNyVSxLQUFLLENBQUM7VUFDakMsSUFBSUEsS0FBSyxLQUFLLEtBQUssRUFBRTtZQUNuQkEsS0FBSyxHQUFHLFVBQVU7VUFDcEI7VUFDQSxNQUFNeVUsYUFBYSxHQUFHLEVBQUU7VUFDeEI3WCxNQUFNLENBQUN5QixJQUFJLENBQUN2RCx3QkFBd0IsQ0FBQyxDQUFDd0QsT0FBTyxDQUFDdUgsR0FBRyxJQUFJO1lBQ25ELElBQUk1SixLQUFLLENBQUM0SixHQUFHLENBQUMsRUFBRTtjQUNkLE1BQU1DLFlBQVksR0FBR2hMLHdCQUF3QixDQUFDK0ssR0FBRyxDQUFDO2NBQ2xENE8sYUFBYSxDQUFDeFUsSUFBSSxDQUFFLElBQUdkLEtBQU0sU0FBUTJHLFlBQWEsS0FBSTNHLEtBQUssR0FBRyxDQUFFLEVBQUMsQ0FBQztjQUNsRW1CLE1BQU0sQ0FBQ0wsSUFBSSxDQUFDRCxLQUFLLEVBQUVoRSxlQUFlLENBQUNDLEtBQUssQ0FBQzRKLEdBQUcsQ0FBQyxDQUFDLENBQUM7Y0FDL0MxRyxLQUFLLElBQUksQ0FBQztZQUNaO1VBQ0YsQ0FBQyxDQUFDO1VBQ0YsSUFBSXNWLGFBQWEsQ0FBQ3BhLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDNUJnRyxRQUFRLENBQUNKLElBQUksQ0FBRSxJQUFHd1UsYUFBYSxDQUFDcFYsSUFBSSxDQUFDLE9BQU8sQ0FBRSxHQUFFLENBQUM7VUFDbkQ7VUFDQSxJQUFJN0IsTUFBTSxDQUFDRSxNQUFNLENBQUNzQyxLQUFLLENBQUMsSUFBSXhDLE1BQU0sQ0FBQ0UsTUFBTSxDQUFDc0MsS0FBSyxDQUFDLENBQUN0RixJQUFJLElBQUkrWixhQUFhLENBQUNwYSxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQ25GZ0csUUFBUSxDQUFDSixJQUFJLENBQUUsSUFBR2QsS0FBTSxZQUFXQSxLQUFLLEdBQUcsQ0FBRSxFQUFDLENBQUM7WUFDL0NtQixNQUFNLENBQUNMLElBQUksQ0FBQ0QsS0FBSyxFQUFFL0QsS0FBSyxDQUFDO1lBQ3pCa0QsS0FBSyxJQUFJLENBQUM7VUFDWjtRQUNGO1FBQ0FpUyxZQUFZLEdBQUcvUSxRQUFRLENBQUNoRyxNQUFNLEdBQUcsQ0FBQyxHQUFJLFNBQVFnRyxRQUFRLENBQUNoQixJQUFJLENBQUUsSUFBR2lDLE9BQVEsR0FBRSxDQUFFLEVBQUMsR0FBRyxFQUFFO01BQ3BGO01BQ0EsSUFBSW9TLEtBQUssQ0FBQ2dCLE1BQU0sRUFBRTtRQUNoQnJELFlBQVksR0FBSSxVQUFTbFMsS0FBTSxFQUFDO1FBQ2hDbUIsTUFBTSxDQUFDTCxJQUFJLENBQUN5VCxLQUFLLENBQUNnQixNQUFNLENBQUM7UUFDekJ2VixLQUFLLElBQUksQ0FBQztNQUNaO01BQ0EsSUFBSXVVLEtBQUssQ0FBQ2lCLEtBQUssRUFBRTtRQUNmckQsV0FBVyxHQUFJLFdBQVVuUyxLQUFNLEVBQUM7UUFDaENtQixNQUFNLENBQUNMLElBQUksQ0FBQ3lULEtBQUssQ0FBQ2lCLEtBQUssQ0FBQztRQUN4QnhWLEtBQUssSUFBSSxDQUFDO01BQ1o7TUFDQSxJQUFJdVUsS0FBSyxDQUFDa0IsS0FBSyxFQUFFO1FBQ2YsTUFBTTVELElBQUksR0FBRzBDLEtBQUssQ0FBQ2tCLEtBQUs7UUFDeEIsTUFBTXZXLElBQUksR0FBR3pCLE1BQU0sQ0FBQ3lCLElBQUksQ0FBQzJTLElBQUksQ0FBQztRQUM5QixNQUFNUyxPQUFPLEdBQUdwVCxJQUFJLENBQ2pCWSxHQUFHLENBQUNRLEdBQUcsSUFBSTtVQUNWLE1BQU15VCxXQUFXLEdBQUdsQyxJQUFJLENBQUN2UixHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsS0FBSyxHQUFHLE1BQU07VUFDcEQsTUFBTW9WLEtBQUssR0FBSSxJQUFHMVYsS0FBTSxTQUFRK1QsV0FBWSxFQUFDO1VBQzdDL1QsS0FBSyxJQUFJLENBQUM7VUFDVixPQUFPMFYsS0FBSztRQUNkLENBQUMsQ0FBQyxDQUNEeFYsSUFBSSxFQUFFO1FBQ1RpQixNQUFNLENBQUNMLElBQUksQ0FBQyxHQUFHNUIsSUFBSSxDQUFDO1FBQ3BCa1QsV0FBVyxHQUFHUCxJQUFJLEtBQUt4VSxTQUFTLElBQUlpVixPQUFPLENBQUNwWCxNQUFNLEdBQUcsQ0FBQyxHQUFJLFlBQVdvWCxPQUFRLEVBQUMsR0FBRyxFQUFFO01BQ3JGO0lBQ0Y7SUFFQSxJQUFJZ0MsWUFBWSxFQUFFO01BQ2hCNUgsT0FBTyxDQUFDdk4sT0FBTyxDQUFDLENBQUN3VyxDQUFDLEVBQUU3UixDQUFDLEVBQUU4RixDQUFDLEtBQUs7UUFDM0IsSUFBSStMLENBQUMsSUFBSUEsQ0FBQyxDQUFDQyxJQUFJLEVBQUUsS0FBSyxHQUFHLEVBQUU7VUFDekJoTSxDQUFDLENBQUM5RixDQUFDLENBQUMsR0FBRyxFQUFFO1FBQ1g7TUFDRixDQUFDLENBQUM7SUFDSjtJQUVBLE1BQU0yTyxhQUFhLEdBQUksVUFBUy9GLE9BQU8sQ0FDcENHLE1BQU0sQ0FBQ2dKLE9BQU8sQ0FBQyxDQUNmM1YsSUFBSSxFQUFHLGlCQUFnQitSLFlBQWEsSUFBR0UsV0FBWSxJQUFHbUMsWUFBYSxJQUFHbEMsV0FBWSxJQUFHRixZQUFhLEVBQUM7SUFDdEcsTUFBTTVGLEVBQUUsR0FBR3dGLE9BQU8sR0FBRyxJQUFJLENBQUN4SixzQkFBc0IsQ0FBQ21LLGFBQWEsQ0FBQyxHQUFHQSxhQUFhO0lBQy9FLE9BQU8sSUFBSSxDQUFDM0ssT0FBTyxDQUFDbUYsR0FBRyxDQUFDWCxFQUFFLEVBQUVuTCxNQUFNLENBQUMsQ0FBQ3FNLElBQUksQ0FBQzVELENBQUMsSUFBSTtNQUM1QyxJQUFJa0ksT0FBTyxFQUFFO1FBQ1gsT0FBT2xJLENBQUM7TUFDVjtNQUNBLE1BQU1pRSxPQUFPLEdBQUdqRSxDQUFDLENBQUM5SixHQUFHLENBQUNiLE1BQU0sSUFBSSxJQUFJLENBQUN5VCwyQkFBMkIsQ0FBQ3BVLFNBQVMsRUFBRVcsTUFBTSxFQUFFWixNQUFNLENBQUMsQ0FBQztNQUM1RndQLE9BQU8sQ0FBQzFPLE9BQU8sQ0FBQzRILE1BQU0sSUFBSTtRQUN4QixJQUFJLENBQUN0SixNQUFNLENBQUNvTixTQUFTLENBQUNDLGNBQWMsQ0FBQ0MsSUFBSSxDQUFDaEUsTUFBTSxFQUFFLFVBQVUsQ0FBQyxFQUFFO1VBQzdEQSxNQUFNLENBQUN4SixRQUFRLEdBQUcsSUFBSTtRQUN4QjtRQUNBLElBQUk4VyxXQUFXLEVBQUU7VUFDZnROLE1BQU0sQ0FBQ3hKLFFBQVEsR0FBRyxDQUFDLENBQUM7VUFDcEIsS0FBSyxNQUFNK0MsR0FBRyxJQUFJK1QsV0FBVyxFQUFFO1lBQzdCdE4sTUFBTSxDQUFDeEosUUFBUSxDQUFDK0MsR0FBRyxDQUFDLEdBQUd5RyxNQUFNLENBQUN6RyxHQUFHLENBQUM7WUFDbEMsT0FBT3lHLE1BQU0sQ0FBQ3pHLEdBQUcsQ0FBQztVQUNwQjtRQUNGO1FBQ0EsSUFBSThULFVBQVUsRUFBRTtVQUNkck4sTUFBTSxDQUFDcU4sVUFBVSxDQUFDLEdBQUcwQixRQUFRLENBQUMvTyxNQUFNLENBQUNxTixVQUFVLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDdkQ7TUFDRixDQUFDLENBQUM7TUFDRixPQUFPdkcsT0FBTztJQUNoQixDQUFDLENBQUM7RUFDSjtFQUVBLE1BQU1rSSxxQkFBcUIsQ0FBQztJQUFFQztFQUE0QixDQUFDLEVBQUU7SUFDM0Q7SUFDQW5iLEtBQUssQ0FBQyx1QkFBdUIsQ0FBQztJQUM5QixNQUFNLElBQUksQ0FBQzJPLDZCQUE2QixFQUFFO0lBQzFDLE1BQU15TSxRQUFRLEdBQUdELHNCQUFzQixDQUFDbFcsR0FBRyxDQUFDekIsTUFBTSxJQUFJO01BQ3BELE9BQU8sSUFBSSxDQUFDZ04sV0FBVyxDQUFDaE4sTUFBTSxDQUFDQyxTQUFTLEVBQUVELE1BQU0sQ0FBQyxDQUM5Q2tMLEtBQUssQ0FBQytCLEdBQUcsSUFBSTtRQUNaLElBQ0VBLEdBQUcsQ0FBQ0MsSUFBSSxLQUFLL1EsOEJBQThCLElBQzNDOFEsR0FBRyxDQUFDQyxJQUFJLEtBQUsvSyxhQUFLLENBQUNDLEtBQUssQ0FBQ3lWLGtCQUFrQixFQUMzQztVQUNBLE9BQU81TCxPQUFPLENBQUNDLE9BQU8sRUFBRTtRQUMxQjtRQUNBLE1BQU1lLEdBQUc7TUFDWCxDQUFDLENBQUMsQ0FDRGtDLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQ2YsYUFBYSxDQUFDcE8sTUFBTSxDQUFDQyxTQUFTLEVBQUVELE1BQU0sQ0FBQyxDQUFDO0lBQzdELENBQUMsQ0FBQztJQUNGNFgsUUFBUSxDQUFDblYsSUFBSSxDQUFDLElBQUksQ0FBQytILGVBQWUsRUFBRSxDQUFDO0lBQ3JDLE9BQU95QixPQUFPLENBQUM2TCxHQUFHLENBQUNGLFFBQVEsQ0FBQyxDQUN6QnpJLElBQUksQ0FBQyxNQUFNO01BQ1YsT0FBTyxJQUFJLENBQUMxRixPQUFPLENBQUNrRCxFQUFFLENBQUMsd0JBQXdCLEVBQUUsTUFBTWYsQ0FBQyxJQUFJO1FBQzFELE1BQU1BLENBQUMsQ0FBQ1osSUFBSSxDQUFDK00sWUFBRyxDQUFDQyxJQUFJLENBQUNDLGlCQUFpQixDQUFDO1FBQ3hDLE1BQU1yTSxDQUFDLENBQUNaLElBQUksQ0FBQytNLFlBQUcsQ0FBQ0csS0FBSyxDQUFDQyxHQUFHLENBQUM7UUFDM0IsTUFBTXZNLENBQUMsQ0FBQ1osSUFBSSxDQUFDK00sWUFBRyxDQUFDRyxLQUFLLENBQUNFLFNBQVMsQ0FBQztRQUNqQyxNQUFNeE0sQ0FBQyxDQUFDWixJQUFJLENBQUMrTSxZQUFHLENBQUNHLEtBQUssQ0FBQ0csTUFBTSxDQUFDO1FBQzlCLE1BQU16TSxDQUFDLENBQUNaLElBQUksQ0FBQytNLFlBQUcsQ0FBQ0csS0FBSyxDQUFDSSxXQUFXLENBQUM7UUFDbkMsTUFBTTFNLENBQUMsQ0FBQ1osSUFBSSxDQUFDK00sWUFBRyxDQUFDRyxLQUFLLENBQUNLLGdCQUFnQixDQUFDO1FBQ3hDLE1BQU0zTSxDQUFDLENBQUNaLElBQUksQ0FBQytNLFlBQUcsQ0FBQ0csS0FBSyxDQUFDTSxRQUFRLENBQUM7UUFDaEMsT0FBTzVNLENBQUMsQ0FBQzZNLEdBQUc7TUFDZCxDQUFDLENBQUM7SUFDSixDQUFDLENBQUMsQ0FDRHRKLElBQUksQ0FBQ3NKLEdBQUcsSUFBSTtNQUNYamMsS0FBSyxDQUFFLHlCQUF3QmljLEdBQUcsQ0FBQ0MsUUFBUyxFQUFDLENBQUM7SUFDaEQsQ0FBQyxDQUFDLENBQ0R4TixLQUFLLENBQUN0QyxLQUFLLElBQUk7TUFDZDtNQUNBRCxPQUFPLENBQUNDLEtBQUssQ0FBQ0EsS0FBSyxDQUFDO0lBQ3RCLENBQUMsQ0FBQztFQUNOO0VBRUEsTUFBTWdFLGFBQWEsQ0FBQzNNLFNBQWlCLEVBQUVPLE9BQVksRUFBRTRLLElBQVUsRUFBaUI7SUFDOUUsT0FBTyxDQUFDQSxJQUFJLElBQUksSUFBSSxDQUFDM0IsT0FBTyxFQUFFa0QsRUFBRSxDQUFDZixDQUFDLElBQ2hDQSxDQUFDLENBQUNzQyxLQUFLLENBQ0wxTixPQUFPLENBQUNpQixHQUFHLENBQUNnRSxDQUFDLElBQUk7TUFDZixPQUFPbUcsQ0FBQyxDQUFDWixJQUFJLENBQUMseURBQXlELEVBQUUsQ0FDdkV2RixDQUFDLENBQUM3RyxJQUFJLEVBQ05xQixTQUFTLEVBQ1R3RixDQUFDLENBQUN4RCxHQUFHLENBQ04sQ0FBQztJQUNKLENBQUMsQ0FBQyxDQUNILENBQ0Y7RUFDSDtFQUVBLE1BQU0wVyxxQkFBcUIsQ0FDekIxWSxTQUFpQixFQUNqQmMsU0FBaUIsRUFDakI3RCxJQUFTLEVBQ1RrTyxJQUFVLEVBQ0s7SUFDZixNQUFNLENBQUNBLElBQUksSUFBSSxJQUFJLENBQUMzQixPQUFPLEVBQUV1QixJQUFJLENBQUMseURBQXlELEVBQUUsQ0FDM0ZqSyxTQUFTLEVBQ1RkLFNBQVMsRUFDVC9DLElBQUksQ0FDTCxDQUFDO0VBQ0o7RUFFQSxNQUFNMlAsV0FBVyxDQUFDNU0sU0FBaUIsRUFBRU8sT0FBWSxFQUFFNEssSUFBUyxFQUFpQjtJQUMzRSxNQUFNd0UsT0FBTyxHQUFHcFAsT0FBTyxDQUFDaUIsR0FBRyxDQUFDZ0UsQ0FBQyxLQUFLO01BQ2hDOUMsS0FBSyxFQUFFLG9CQUFvQjtNQUMzQkcsTUFBTSxFQUFFMkM7SUFDVixDQUFDLENBQUMsQ0FBQztJQUNILE1BQU0sQ0FBQzJGLElBQUksSUFBSSxJQUFJLENBQUMzQixPQUFPLEVBQUVrRCxFQUFFLENBQUNmLENBQUMsSUFBSUEsQ0FBQyxDQUFDWixJQUFJLENBQUMsSUFBSSxDQUFDckIsSUFBSSxDQUFDdUYsT0FBTyxDQUFDdlMsTUFBTSxDQUFDaVQsT0FBTyxDQUFDLENBQUMsQ0FBQztFQUNqRjtFQUVBLE1BQU1nSixVQUFVLENBQUMzWSxTQUFpQixFQUFFO0lBQ2xDLE1BQU1nTyxFQUFFLEdBQUcseURBQXlEO0lBQ3BFLE9BQU8sSUFBSSxDQUFDeEUsT0FBTyxDQUFDbUYsR0FBRyxDQUFDWCxFQUFFLEVBQUU7TUFBRWhPO0lBQVUsQ0FBQyxDQUFDO0VBQzVDO0VBRUEsTUFBTTRZLHVCQUF1QixHQUFrQjtJQUM3QyxPQUFPNU0sT0FBTyxDQUFDQyxPQUFPLEVBQUU7RUFDMUI7O0VBRUE7RUFDQSxNQUFNNE0sb0JBQW9CLENBQUM3WSxTQUFpQixFQUFFO0lBQzVDLE9BQU8sSUFBSSxDQUFDd0osT0FBTyxDQUFDdUIsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUMvSyxTQUFTLENBQUMsQ0FBQztFQUMxRDtFQUVBLE1BQU04WSwwQkFBMEIsR0FBaUI7SUFDL0MsT0FBTyxJQUFJOU0sT0FBTyxDQUFDQyxPQUFPLElBQUk7TUFDNUIsTUFBTWtFLG9CQUFvQixHQUFHLENBQUMsQ0FBQztNQUMvQkEsb0JBQW9CLENBQUMxSCxNQUFNLEdBQUcsSUFBSSxDQUFDZSxPQUFPLENBQUNrRCxFQUFFLENBQUNmLENBQUMsSUFBSTtRQUNqRHdFLG9CQUFvQixDQUFDeEUsQ0FBQyxHQUFHQSxDQUFDO1FBQzFCd0Usb0JBQW9CLENBQUNlLE9BQU8sR0FBRyxJQUFJbEYsT0FBTyxDQUFDQyxPQUFPLElBQUk7VUFDcERrRSxvQkFBb0IsQ0FBQ2xFLE9BQU8sR0FBR0EsT0FBTztRQUN4QyxDQUFDLENBQUM7UUFDRmtFLG9CQUFvQixDQUFDbEMsS0FBSyxHQUFHLEVBQUU7UUFDL0JoQyxPQUFPLENBQUNrRSxvQkFBb0IsQ0FBQztRQUM3QixPQUFPQSxvQkFBb0IsQ0FBQ2UsT0FBTztNQUNyQyxDQUFDLENBQUM7SUFDSixDQUFDLENBQUM7RUFDSjtFQUVBNkgsMEJBQTBCLENBQUM1SSxvQkFBeUIsRUFBaUI7SUFDbkVBLG9CQUFvQixDQUFDbEUsT0FBTyxDQUFDa0Usb0JBQW9CLENBQUN4RSxDQUFDLENBQUNzQyxLQUFLLENBQUNrQyxvQkFBb0IsQ0FBQ2xDLEtBQUssQ0FBQyxDQUFDO0lBQ3RGLE9BQU9rQyxvQkFBb0IsQ0FBQzFILE1BQU07RUFDcEM7RUFFQXVRLHlCQUF5QixDQUFDN0ksb0JBQXlCLEVBQWlCO0lBQ2xFLE1BQU0xSCxNQUFNLEdBQUcwSCxvQkFBb0IsQ0FBQzFILE1BQU0sQ0FBQ3dDLEtBQUssRUFBRTtJQUNsRGtGLG9CQUFvQixDQUFDbEMsS0FBSyxDQUFDekwsSUFBSSxDQUFDd0osT0FBTyxDQUFDaUgsTUFBTSxFQUFFLENBQUM7SUFDakQ5QyxvQkFBb0IsQ0FBQ2xFLE9BQU8sQ0FBQ2tFLG9CQUFvQixDQUFDeEUsQ0FBQyxDQUFDc0MsS0FBSyxDQUFDa0Msb0JBQW9CLENBQUNsQyxLQUFLLENBQUMsQ0FBQztJQUN0RixPQUFPeEYsTUFBTTtFQUNmO0VBRUEsTUFBTXdRLFdBQVcsQ0FDZmpaLFNBQWlCLEVBQ2pCRCxNQUFrQixFQUNsQjhQLFVBQW9CLEVBQ3BCcUosU0FBa0IsRUFDbEJ2VyxlQUF3QixHQUFHLEtBQUssRUFDaEN3VyxPQUFnQixHQUFHLENBQUMsQ0FBQyxFQUNQO0lBQ2QsTUFBTWhPLElBQUksR0FBR2dPLE9BQU8sQ0FBQ2hPLElBQUksS0FBS3BNLFNBQVMsR0FBR29hLE9BQU8sQ0FBQ2hPLElBQUksR0FBRyxJQUFJLENBQUMzQixPQUFPO0lBQ3JFLE1BQU00UCxnQkFBZ0IsR0FBSSxpQkFBZ0J2SixVQUFVLENBQUMwRCxJQUFJLEVBQUUsQ0FBQzNSLElBQUksQ0FBQyxHQUFHLENBQUUsRUFBQztJQUN2RSxNQUFNeVgsZ0JBQXdCLEdBQzVCSCxTQUFTLElBQUksSUFBSSxHQUFHO01BQUV2YSxJQUFJLEVBQUV1YTtJQUFVLENBQUMsR0FBRztNQUFFdmEsSUFBSSxFQUFFeWE7SUFBaUIsQ0FBQztJQUN0RSxNQUFNcEUsa0JBQWtCLEdBQUdyUyxlQUFlLEdBQ3RDa04sVUFBVSxDQUFDck8sR0FBRyxDQUFDLENBQUNWLFNBQVMsRUFBRVksS0FBSyxLQUFNLFVBQVNBLEtBQUssR0FBRyxDQUFFLDRCQUEyQixDQUFDLEdBQ3JGbU8sVUFBVSxDQUFDck8sR0FBRyxDQUFDLENBQUNWLFNBQVMsRUFBRVksS0FBSyxLQUFNLElBQUdBLEtBQUssR0FBRyxDQUFFLE9BQU0sQ0FBQztJQUM5RCxNQUFNc00sRUFBRSxHQUFJLGtEQUFpRGdILGtCQUFrQixDQUFDcFQsSUFBSSxFQUFHLEdBQUU7SUFDekYsTUFBTTBYLHNCQUFzQixHQUMxQkgsT0FBTyxDQUFDRyxzQkFBc0IsS0FBS3ZhLFNBQVMsR0FBR29hLE9BQU8sQ0FBQ0csc0JBQXNCLEdBQUcsS0FBSztJQUN2RixJQUFJQSxzQkFBc0IsRUFBRTtNQUMxQixNQUFNLElBQUksQ0FBQ0MsK0JBQStCLENBQUNKLE9BQU8sQ0FBQztJQUNyRDtJQUNBLE1BQU1oTyxJQUFJLENBQUNKLElBQUksQ0FBQ2lELEVBQUUsRUFBRSxDQUFDcUwsZ0JBQWdCLENBQUMxYSxJQUFJLEVBQUVxQixTQUFTLEVBQUUsR0FBRzZQLFVBQVUsQ0FBQyxDQUFDLENBQUM1RSxLQUFLLENBQUN0QyxLQUFLLElBQUk7TUFDcEYsSUFDRUEsS0FBSyxDQUFDc0UsSUFBSSxLQUFLL1EsOEJBQThCLElBQzdDeU0sS0FBSyxDQUFDc00sT0FBTyxDQUFDaFQsUUFBUSxDQUFDb1gsZ0JBQWdCLENBQUMxYSxJQUFJLENBQUMsRUFDN0M7UUFDQTtNQUFBLENBQ0QsTUFBTSxJQUNMZ0ssS0FBSyxDQUFDc0UsSUFBSSxLQUFLNVEsaUNBQWlDLElBQ2hEc00sS0FBSyxDQUFDc00sT0FBTyxDQUFDaFQsUUFBUSxDQUFDb1gsZ0JBQWdCLENBQUMxYSxJQUFJLENBQUMsRUFDN0M7UUFDQTtRQUNBLE1BQU0sSUFBSXVELGFBQUssQ0FBQ0MsS0FBSyxDQUNuQkQsYUFBSyxDQUFDQyxLQUFLLENBQUNnTCxlQUFlLEVBQzNCLCtEQUErRCxDQUNoRTtNQUNILENBQUMsTUFBTTtRQUNMLE1BQU14RSxLQUFLO01BQ2I7SUFDRixDQUFDLENBQUM7RUFDSjtFQUVBLE1BQU02USx5QkFBeUIsQ0FBQ0wsT0FBZ0IsR0FBRyxDQUFDLENBQUMsRUFBZ0I7SUFDbkUsTUFBTWhPLElBQUksR0FBR2dPLE9BQU8sQ0FBQ2hPLElBQUksS0FBS3BNLFNBQVMsR0FBR29hLE9BQU8sQ0FBQ2hPLElBQUksR0FBRyxJQUFJLENBQUMzQixPQUFPO0lBQ3JFLE1BQU13RSxFQUFFLEdBQUcsOERBQThEO0lBQ3pFLE9BQU83QyxJQUFJLENBQUNKLElBQUksQ0FBQ2lELEVBQUUsQ0FBQyxDQUFDL0MsS0FBSyxDQUFDdEMsS0FBSyxJQUFJO01BQ2xDLE1BQU1BLEtBQUs7SUFDYixDQUFDLENBQUM7RUFDSjtFQUVBLE1BQU00USwrQkFBK0IsQ0FBQ0osT0FBZ0IsR0FBRyxDQUFDLENBQUMsRUFBZ0I7SUFDekUsTUFBTWhPLElBQUksR0FBR2dPLE9BQU8sQ0FBQ2hPLElBQUksS0FBS3BNLFNBQVMsR0FBR29hLE9BQU8sQ0FBQ2hPLElBQUksR0FBRyxJQUFJLENBQUMzQixPQUFPO0lBQ3JFLE1BQU1pUSxVQUFVLEdBQUdOLE9BQU8sQ0FBQ08sR0FBRyxLQUFLM2EsU0FBUyxHQUFJLEdBQUVvYSxPQUFPLENBQUNPLEdBQUksVUFBUyxHQUFHLFlBQVk7SUFDdEYsTUFBTTFMLEVBQUUsR0FDTixtTEFBbUw7SUFDckwsT0FBTzdDLElBQUksQ0FBQ0osSUFBSSxDQUFDaUQsRUFBRSxFQUFFLENBQUN5TCxVQUFVLENBQUMsQ0FBQyxDQUFDeE8sS0FBSyxDQUFDdEMsS0FBSyxJQUFJO01BQ2hELE1BQU1BLEtBQUs7SUFDYixDQUFDLENBQUM7RUFDSjtBQUNGO0FBQUM7QUFFRCxTQUFTUixtQkFBbUIsQ0FBQ1YsT0FBTyxFQUFFO0VBQ3BDLElBQUlBLE9BQU8sQ0FBQzdLLE1BQU0sR0FBRyxDQUFDLEVBQUU7SUFDdEIsTUFBTSxJQUFJc0YsYUFBSyxDQUFDQyxLQUFLLENBQUNELGFBQUssQ0FBQ0MsS0FBSyxDQUFDK0IsWUFBWSxFQUFHLHFDQUFvQyxDQUFDO0VBQ3hGO0VBQ0EsSUFDRXVELE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBS0EsT0FBTyxDQUFDQSxPQUFPLENBQUM3SyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQ2hENkssT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLQSxPQUFPLENBQUNBLE9BQU8sQ0FBQzdLLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFDaEQ7SUFDQTZLLE9BQU8sQ0FBQ2pGLElBQUksQ0FBQ2lGLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUMxQjtFQUNBLE1BQU1rUyxNQUFNLEdBQUdsUyxPQUFPLENBQUM4RyxNQUFNLENBQUMsQ0FBQ0MsSUFBSSxFQUFFOU0sS0FBSyxFQUFFa1ksRUFBRSxLQUFLO0lBQ2pELElBQUlDLFVBQVUsR0FBRyxDQUFDLENBQUM7SUFDbkIsS0FBSyxJQUFJclUsQ0FBQyxHQUFHLENBQUMsRUFBRUEsQ0FBQyxHQUFHb1UsRUFBRSxDQUFDaGQsTUFBTSxFQUFFNEksQ0FBQyxJQUFJLENBQUMsRUFBRTtNQUNyQyxNQUFNc1UsRUFBRSxHQUFHRixFQUFFLENBQUNwVSxDQUFDLENBQUM7TUFDaEIsSUFBSXNVLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBS3RMLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSXNMLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBS3RMLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRTtRQUMxQ3FMLFVBQVUsR0FBR3JVLENBQUM7UUFDZDtNQUNGO0lBQ0Y7SUFDQSxPQUFPcVUsVUFBVSxLQUFLblksS0FBSztFQUM3QixDQUFDLENBQUM7RUFDRixJQUFJaVksTUFBTSxDQUFDL2MsTUFBTSxHQUFHLENBQUMsRUFBRTtJQUNyQixNQUFNLElBQUlzRixhQUFLLENBQUNDLEtBQUssQ0FDbkJELGFBQUssQ0FBQ0MsS0FBSyxDQUFDNFgscUJBQXFCLEVBQ2pDLHVEQUF1RCxDQUN4RDtFQUNIO0VBQ0EsTUFBTXJTLE1BQU0sR0FBR0QsT0FBTyxDQUNuQmpHLEdBQUcsQ0FBQzJDLEtBQUssSUFBSTtJQUNaakMsYUFBSyxDQUFDaUYsUUFBUSxDQUFDRyxTQUFTLENBQUNtTixVQUFVLENBQUN0USxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRXNRLFVBQVUsQ0FBQ3RRLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3BFLE9BQVEsSUFBR0EsS0FBSyxDQUFDLENBQUMsQ0FBRSxLQUFJQSxLQUFLLENBQUMsQ0FBQyxDQUFFLEdBQUU7RUFDckMsQ0FBQyxDQUFDLENBQ0R2QyxJQUFJLENBQUMsSUFBSSxDQUFDO0VBQ2IsT0FBUSxJQUFHOEYsTUFBTyxHQUFFO0FBQ3RCO0FBRUEsU0FBU1EsZ0JBQWdCLENBQUNKLEtBQUssRUFBRTtFQUMvQixJQUFJLENBQUNBLEtBQUssQ0FBQ2tTLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRTtJQUN6QmxTLEtBQUssSUFBSSxJQUFJO0VBQ2Y7O0VBRUE7RUFDQSxPQUNFQSxLQUFLLENBQ0ZtUyxPQUFPLENBQUMsaUJBQWlCLEVBQUUsSUFBSTtFQUNoQztFQUFBLENBQ0NBLE9BQU8sQ0FBQyxXQUFXLEVBQUUsRUFBRTtFQUN4QjtFQUFBLENBQ0NBLE9BQU8sQ0FBQyxlQUFlLEVBQUUsSUFBSTtFQUM5QjtFQUFBLENBQ0NBLE9BQU8sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQ25CM0MsSUFBSSxFQUFFO0FBRWI7QUFFQSxTQUFTN1IsbUJBQW1CLENBQUN5VSxDQUFDLEVBQUU7RUFDOUIsSUFBSUEsQ0FBQyxJQUFJQSxDQUFDLENBQUNDLFVBQVUsQ0FBQyxHQUFHLENBQUMsRUFBRTtJQUMxQjtJQUNBLE9BQU8sR0FBRyxHQUFHQyxtQkFBbUIsQ0FBQ0YsQ0FBQyxDQUFDdmQsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQzlDLENBQUMsTUFBTSxJQUFJdWQsQ0FBQyxJQUFJQSxDQUFDLENBQUNGLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRTtJQUMvQjtJQUNBLE9BQU9JLG1CQUFtQixDQUFDRixDQUFDLENBQUN2ZCxLQUFLLENBQUMsQ0FBQyxFQUFFdWQsQ0FBQyxDQUFDdGQsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRztFQUM1RDs7RUFFQTtFQUNBLE9BQU93ZCxtQkFBbUIsQ0FBQ0YsQ0FBQyxDQUFDO0FBQy9CO0FBRUEsU0FBU0csaUJBQWlCLENBQUM3YixLQUFLLEVBQUU7RUFDaEMsSUFBSSxDQUFDQSxLQUFLLElBQUksT0FBT0EsS0FBSyxLQUFLLFFBQVEsSUFBSSxDQUFDQSxLQUFLLENBQUMyYixVQUFVLENBQUMsR0FBRyxDQUFDLEVBQUU7SUFDakUsT0FBTyxLQUFLO0VBQ2Q7RUFFQSxNQUFNN0ksT0FBTyxHQUFHOVMsS0FBSyxDQUFDNEUsS0FBSyxDQUFDLFlBQVksQ0FBQztFQUN6QyxPQUFPLENBQUMsQ0FBQ2tPLE9BQU87QUFDbEI7QUFFQSxTQUFTL0wsc0JBQXNCLENBQUMxQyxNQUFNLEVBQUU7RUFDdEMsSUFBSSxDQUFDQSxNQUFNLElBQUksQ0FBQzJCLEtBQUssQ0FBQ0MsT0FBTyxDQUFDNUIsTUFBTSxDQUFDLElBQUlBLE1BQU0sQ0FBQ2pHLE1BQU0sS0FBSyxDQUFDLEVBQUU7SUFDNUQsT0FBTyxJQUFJO0VBQ2I7RUFFQSxNQUFNMGQsa0JBQWtCLEdBQUdELGlCQUFpQixDQUFDeFgsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDUyxNQUFNLENBQUM7RUFDOUQsSUFBSVQsTUFBTSxDQUFDakcsTUFBTSxLQUFLLENBQUMsRUFBRTtJQUN2QixPQUFPMGQsa0JBQWtCO0VBQzNCO0VBRUEsS0FBSyxJQUFJOVUsQ0FBQyxHQUFHLENBQUMsRUFBRTVJLE1BQU0sR0FBR2lHLE1BQU0sQ0FBQ2pHLE1BQU0sRUFBRTRJLENBQUMsR0FBRzVJLE1BQU0sRUFBRSxFQUFFNEksQ0FBQyxFQUFFO0lBQ3ZELElBQUk4VSxrQkFBa0IsS0FBS0QsaUJBQWlCLENBQUN4WCxNQUFNLENBQUMyQyxDQUFDLENBQUMsQ0FBQ2xDLE1BQU0sQ0FBQyxFQUFFO01BQzlELE9BQU8sS0FBSztJQUNkO0VBQ0Y7RUFFQSxPQUFPLElBQUk7QUFDYjtBQUVBLFNBQVNnQyx5QkFBeUIsQ0FBQ3pDLE1BQU0sRUFBRTtFQUN6QyxPQUFPQSxNQUFNLENBQUMwWCxJQUFJLENBQUMsVUFBVS9iLEtBQUssRUFBRTtJQUNsQyxPQUFPNmIsaUJBQWlCLENBQUM3YixLQUFLLENBQUM4RSxNQUFNLENBQUM7RUFDeEMsQ0FBQyxDQUFDO0FBQ0o7QUFFQSxTQUFTa1gsa0JBQWtCLENBQUNDLFNBQVMsRUFBRTtFQUNyQyxPQUFPQSxTQUFTLENBQ2J4WixLQUFLLENBQUMsRUFBRSxDQUFDLENBQ1RPLEdBQUcsQ0FBQ21SLENBQUMsSUFBSTtJQUNSLE1BQU03SyxLQUFLLEdBQUc0UyxNQUFNLENBQUMsZUFBZSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDNUMsSUFBSS9ILENBQUMsQ0FBQ3ZQLEtBQUssQ0FBQzBFLEtBQUssQ0FBQyxLQUFLLElBQUksRUFBRTtNQUMzQjtNQUNBLE9BQU82SyxDQUFDO0lBQ1Y7SUFDQTtJQUNBLE9BQU9BLENBQUMsS0FBTSxHQUFFLEdBQUksSUFBRyxHQUFJLEtBQUlBLENBQUUsRUFBQztFQUNwQyxDQUFDLENBQUMsQ0FDRC9RLElBQUksQ0FBQyxFQUFFLENBQUM7QUFDYjtBQUVBLFNBQVN3WSxtQkFBbUIsQ0FBQ0YsQ0FBUyxFQUFFO0VBQ3RDLE1BQU1TLFFBQVEsR0FBRyxvQkFBb0I7RUFDckMsTUFBTUMsT0FBWSxHQUFHVixDQUFDLENBQUM5VyxLQUFLLENBQUN1WCxRQUFRLENBQUM7RUFDdEMsSUFBSUMsT0FBTyxJQUFJQSxPQUFPLENBQUNoZSxNQUFNLEdBQUcsQ0FBQyxJQUFJZ2UsT0FBTyxDQUFDbFosS0FBSyxHQUFHLENBQUMsQ0FBQyxFQUFFO0lBQ3ZEO0lBQ0EsTUFBTW1aLE1BQU0sR0FBR1gsQ0FBQyxDQUFDcFksTUFBTSxDQUFDLENBQUMsRUFBRThZLE9BQU8sQ0FBQ2xaLEtBQUssQ0FBQztJQUN6QyxNQUFNK1ksU0FBUyxHQUFHRyxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBRTVCLE9BQU9SLG1CQUFtQixDQUFDUyxNQUFNLENBQUMsR0FBR0wsa0JBQWtCLENBQUNDLFNBQVMsQ0FBQztFQUNwRTs7RUFFQTtFQUNBLE1BQU1LLFFBQVEsR0FBRyxpQkFBaUI7RUFDbEMsTUFBTUMsT0FBWSxHQUFHYixDQUFDLENBQUM5VyxLQUFLLENBQUMwWCxRQUFRLENBQUM7RUFDdEMsSUFBSUMsT0FBTyxJQUFJQSxPQUFPLENBQUNuZSxNQUFNLEdBQUcsQ0FBQyxJQUFJbWUsT0FBTyxDQUFDclosS0FBSyxHQUFHLENBQUMsQ0FBQyxFQUFFO0lBQ3ZELE1BQU1tWixNQUFNLEdBQUdYLENBQUMsQ0FBQ3BZLE1BQU0sQ0FBQyxDQUFDLEVBQUVpWixPQUFPLENBQUNyWixLQUFLLENBQUM7SUFDekMsTUFBTStZLFNBQVMsR0FBR00sT0FBTyxDQUFDLENBQUMsQ0FBQztJQUU1QixPQUFPWCxtQkFBbUIsQ0FBQ1MsTUFBTSxDQUFDLEdBQUdMLGtCQUFrQixDQUFDQyxTQUFTLENBQUM7RUFDcEU7O0VBRUE7RUFDQSxPQUFPUCxDQUFDLENBQ0xELE9BQU8sQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLENBQzdCQSxPQUFPLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQyxDQUM3QkEsT0FBTyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FDbkJBLE9BQU8sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQ25CQSxPQUFPLENBQUMsU0FBUyxFQUFHLE1BQUssQ0FBQyxDQUMxQkEsT0FBTyxDQUFDLFVBQVUsRUFBRyxNQUFLLENBQUM7QUFDaEM7QUFFQSxJQUFJN1MsYUFBYSxHQUFHO0VBQ2xCQyxXQUFXLENBQUM3SSxLQUFLLEVBQUU7SUFDakIsT0FBTyxPQUFPQSxLQUFLLEtBQUssUUFBUSxJQUFJQSxLQUFLLEtBQUssSUFBSSxJQUFJQSxLQUFLLENBQUNDLE1BQU0sS0FBSyxVQUFVO0VBQ25GO0FBQ0YsQ0FBQztBQUFDLGVBRWFxSyxzQkFBc0I7QUFBQSJ9
|