@discordeno/rest 19.0.0-next.da74ea7 → 19.0.0-next.dbf4fda

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/README.md +15 -1
  2. package/dist/cjs/index.cjs +25 -0
  3. package/dist/cjs/invalidBucket.cjs +86 -0
  4. package/dist/cjs/manager.cjs +1535 -0
  5. package/dist/cjs/queue.cjs +164 -0
  6. package/dist/cjs/routes.cjs +589 -0
  7. package/dist/cjs/types.cjs +6 -0
  8. package/dist/cjs/typings/routes.cjs +6 -0
  9. package/dist/esm/index.js +8 -0
  10. package/dist/esm/invalidBucket.js +82 -0
  11. package/dist/esm/manager.js +1493 -0
  12. package/dist/esm/queue.js +154 -0
  13. package/dist/esm/routes.js +579 -0
  14. package/dist/esm/types.js +3 -0
  15. package/dist/esm/typings/routes.js +3 -0
  16. package/dist/types/index.d.ts.map +1 -0
  17. package/dist/{invalidBucket.d.ts → types/invalidBucket.d.ts} +11 -7
  18. package/dist/types/invalidBucket.d.ts.map +1 -0
  19. package/dist/types/manager.d.ts +12 -0
  20. package/dist/types/manager.d.ts.map +1 -0
  21. package/dist/{queue.d.ts → types/queue.d.ts} +12 -1
  22. package/dist/types/queue.d.ts.map +1 -0
  23. package/dist/types/routes.d.ts.map +1 -0
  24. package/dist/{types.d.ts → types/types.d.ts} +647 -117
  25. package/dist/types/types.d.ts.map +1 -0
  26. package/dist/{typings → types/typings}/routes.d.ts +69 -6
  27. package/dist/types/typings/routes.d.ts.map +1 -0
  28. package/package.json +33 -30
  29. package/dist/index.d.ts.map +0 -1
  30. package/dist/index.js +0 -8
  31. package/dist/index.js.map +0 -1
  32. package/dist/invalidBucket.d.ts.map +0 -1
  33. package/dist/invalidBucket.js +0 -84
  34. package/dist/invalidBucket.js.map +0 -1
  35. package/dist/manager.d.ts +0 -3
  36. package/dist/manager.d.ts.map +0 -1
  37. package/dist/manager.js +0 -1090
  38. package/dist/manager.js.map +0 -1
  39. package/dist/queue.d.ts.map +0 -1
  40. package/dist/queue.js +0 -153
  41. package/dist/queue.js.map +0 -1
  42. package/dist/routes.d.ts.map +0 -1
  43. package/dist/routes.js +0 -487
  44. package/dist/routes.js.map +0 -1
  45. package/dist/types.d.ts.map +0 -1
  46. package/dist/types.js +0 -3
  47. package/dist/types.js.map +0 -1
  48. package/dist/typings/routes.d.ts.map +0 -1
  49. package/dist/typings/routes.js +0 -3
  50. package/dist/typings/routes.js.map +0 -1
  51. /package/dist/{index.d.ts → types/index.d.ts} +0 -0
  52. /package/dist/{routes.d.ts → types/routes.d.ts} +0 -0
@@ -0,0 +1,1493 @@
1
+ import { Buffer } from 'node:buffer';
2
+ import { InteractionResponseTypes } from '@discordeno/types';
3
+ import { calculateBits, camelToSnakeCase, camelize, delay, getBotIdFromToken, logger, processReactionString, urlToBase64 } from '@discordeno/utils';
4
+ import { createInvalidRequestBucket } from './invalidBucket.js';
5
+ import { Queue } from './queue.js';
6
+ import { createRoutes } from './routes.js';
7
+ // TODO: make dynamic based on package.json file
8
+ const version = '19.0.0-alpha.1';
9
+ export const DISCORD_API_VERSION = 10;
10
+ export const DISCORD_API_URL = 'https://discord.com/api';
11
+ export const AUDIT_LOG_REASON_HEADER = 'x-audit-log-reason';
12
+ export const RATE_LIMIT_REMAINING_HEADER = 'x-ratelimit-remaining';
13
+ export const RATE_LIMIT_RESET_AFTER_HEADER = 'x-ratelimit-reset-after';
14
+ export const RATE_LIMIT_GLOBAL_HEADER = 'x-ratelimit-global';
15
+ export const RATE_LIMIT_BUCKET_HEADER = 'x-ratelimit-bucket';
16
+ export const RATE_LIMIT_LIMIT_HEADER = 'x-ratelimit-limit';
17
+ export const RATE_LIMIT_SCOPE_HEADER = 'x-ratelimit-scope';
18
+ export function createRestManager(options) {
19
+ const applicationId = options.applicationId ? BigInt(options.applicationId) : getBotIdFromToken(options.token);
20
+ const baseUrl = options.proxy?.baseUrl ?? DISCORD_API_URL;
21
+ const rest = {
22
+ applicationId,
23
+ authorization: options.proxy?.authorization,
24
+ authorizationHeader: options.proxy?.authorizationHeader ?? 'authorization',
25
+ baseUrl,
26
+ deleteQueueDelay: 60000,
27
+ globallyRateLimited: false,
28
+ invalidBucket: createInvalidRequestBucket({
29
+ logger: options.logger
30
+ }),
31
+ isProxied: !baseUrl.startsWith(DISCORD_API_URL),
32
+ updateBearerTokenEndpoint: options.proxy?.updateBearerTokenEndpoint,
33
+ maxRetryCount: Infinity,
34
+ processingRateLimitedPaths: false,
35
+ queues: new Map(),
36
+ rateLimitedPaths: new Map(),
37
+ token: options.token,
38
+ version: options.version ?? DISCORD_API_VERSION,
39
+ logger: options.logger ?? logger,
40
+ routes: createRoutes(),
41
+ createBaseHeaders () {
42
+ return {
43
+ 'user-agent': `DiscordBot (https://github.com/discordeno/discordeno, v${version})`
44
+ };
45
+ },
46
+ checkRateLimits (url, identifier) {
47
+ const ratelimited = rest.rateLimitedPaths.get(`${identifier}${url}`);
48
+ const global = rest.rateLimitedPaths.get('global');
49
+ const now = Date.now();
50
+ if (ratelimited && now < ratelimited.resetTimestamp) {
51
+ return ratelimited.resetTimestamp - now;
52
+ }
53
+ if (global && now < global.resetTimestamp) {
54
+ return global.resetTimestamp - now;
55
+ }
56
+ return false;
57
+ },
58
+ async updateTokenQueues (oldToken, newToken) {
59
+ if (rest.isProxied) {
60
+ if (!rest.updateBearerTokenEndpoint) {
61
+ throw new Error("The 'proxy.updateBearerTokenEndpoint' option needs to be set when using a rest proxy and needed to call 'updateTokenQueues'");
62
+ }
63
+ const headers = {
64
+ 'content-type': 'application/json'
65
+ };
66
+ if (rest.authorization !== undefined) {
67
+ headers[rest.authorizationHeader] = rest.authorization;
68
+ }
69
+ await fetch(`${rest.baseUrl}/${rest.updateBearerTokenEndpoint}`, {
70
+ method: 'POST',
71
+ body: JSON.stringify({
72
+ oldToken,
73
+ newToken
74
+ }),
75
+ headers
76
+ });
77
+ return;
78
+ }
79
+ const newIdentifier = `Bearer ${newToken}`;
80
+ // Update all the queues
81
+ for (const [key, queue] of rest.queues.entries()){
82
+ if (!key.startsWith(`Bearer ${oldToken}`)) continue;
83
+ rest.queues.delete(key);
84
+ queue.identifier = newIdentifier;
85
+ const newKey = `${newIdentifier}${queue.url}`;
86
+ const newQueue = rest.queues.get(newKey);
87
+ // Merge the queues
88
+ if (newQueue) {
89
+ newQueue.waiting.unshift(...queue.waiting);
90
+ newQueue.pending.unshift(...queue.pending);
91
+ queue.waiting = [];
92
+ queue.pending = [];
93
+ queue.cleanup();
94
+ } else {
95
+ rest.queues.set(newKey, queue);
96
+ }
97
+ }
98
+ for (const [key, ratelimitPath] of rest.rateLimitedPaths.entries()){
99
+ if (!key.startsWith(`Bearer ${oldToken}`)) continue;
100
+ rest.rateLimitedPaths.set(`${newIdentifier}${ratelimitPath.url}`, ratelimitPath);
101
+ if (ratelimitPath.bucketId) {
102
+ rest.rateLimitedPaths.set(`${newIdentifier}${ratelimitPath.bucketId}`, ratelimitPath);
103
+ }
104
+ }
105
+ },
106
+ changeToDiscordFormat (obj) {
107
+ if (obj === null) return null;
108
+ if (typeof obj === 'object') {
109
+ if (Array.isArray(obj)) {
110
+ return obj.map((item)=>rest.changeToDiscordFormat(item));
111
+ }
112
+ const newObj = {};
113
+ for (const key of Object.keys(obj)){
114
+ const value = obj[key];
115
+ // If the key is already in snake_case we can assume it is already in the discord format.
116
+ if (key.includes('_')) {
117
+ newObj[key] = value;
118
+ continue;
119
+ }
120
+ // Some falsy values should be allowed like null or 0
121
+ if (value !== undefined) {
122
+ switch(key){
123
+ case 'permissions':
124
+ case 'allow':
125
+ case 'deny':
126
+ newObj[key] = typeof value === 'string' ? value : calculateBits(value);
127
+ continue;
128
+ case 'defaultMemberPermissions':
129
+ newObj.default_member_permissions = typeof value === 'string' ? value : calculateBits(value);
130
+ continue;
131
+ case 'nameLocalizations':
132
+ newObj.name_localizations = value;
133
+ continue;
134
+ case 'descriptionLocalizations':
135
+ newObj.description_localizations = value;
136
+ continue;
137
+ }
138
+ }
139
+ newObj[camelToSnakeCase(key)] = rest.changeToDiscordFormat(value);
140
+ }
141
+ return newObj;
142
+ }
143
+ if (typeof obj === 'bigint') return obj.toString();
144
+ return obj;
145
+ },
146
+ createRequestBody (method, options) {
147
+ const headers = this.createBaseHeaders();
148
+ if (options?.unauthorized !== true) headers.authorization = `Bot ${rest.token}`;
149
+ // IF A REASON IS PROVIDED ENCODE IT IN HEADERS
150
+ if (options?.reason !== undefined) {
151
+ headers[AUDIT_LOG_REASON_HEADER] = encodeURIComponent(options?.reason);
152
+ }
153
+ let body;
154
+ // TODO: check if we need to add specific check for GET method
155
+ // Since GET does not allow bodies
156
+ // Have to check for attachments first, since body then has to be send in a different way.
157
+ if (options?.files !== undefined) {
158
+ const form = new FormData();
159
+ for(let i = 0; i < options.files.length; ++i){
160
+ form.append(`file${i}`, options.files[i].blob, options.files[i].name);
161
+ }
162
+ // Have to use changeToDiscordFormat or else JSON.stringify may throw an error for the presence of BigInt(s) in the json
163
+ form.append('payload_json', JSON.stringify(rest.changeToDiscordFormat({
164
+ ...options.body,
165
+ files: undefined
166
+ })));
167
+ // No need to set the `content-type` header since `fetch` does that automatically for us when we use a `FormData` object.
168
+ body = form;
169
+ } else if (options?.body && options.headers && options.headers['content-type'] === 'application/x-www-form-urlencoded') {
170
+ // OAuth2 body handling
171
+ const formBody = [];
172
+ const discordBody = rest.changeToDiscordFormat(options.body);
173
+ for(const prop in discordBody){
174
+ formBody.push(`${encodeURIComponent(prop)}=${encodeURIComponent(discordBody[prop])}`);
175
+ }
176
+ body = formBody.join('&');
177
+ } else if (options?.body !== undefined) {
178
+ if (options.body instanceof FormData) {
179
+ body = options.body;
180
+ // No need to set the `content-type` header since `fetch` does that automatically for us when we use a `FormData` object.
181
+ } else {
182
+ body = JSON.stringify(rest.changeToDiscordFormat(options.body));
183
+ headers['content-type'] = `application/json`;
184
+ }
185
+ }
186
+ // SOMETIMES SPECIAL HEADERS (E.G. CUSTOM AUTHORIZATION) NEED TO BE USED
187
+ if (options?.headers) {
188
+ Object.assign(headers, options.headers);
189
+ }
190
+ return {
191
+ body,
192
+ headers,
193
+ method
194
+ };
195
+ },
196
+ processRateLimitedPaths () {
197
+ const now = Date.now();
198
+ for (const [key, value] of rest.rateLimitedPaths.entries()){
199
+ // rest.debug(
200
+ // `[REST - processRateLimitedPaths] Running for of loop. ${
201
+ // value.resetTimestamp - now
202
+ // }`
203
+ // )
204
+ // If the time has not reached cancel
205
+ if (value.resetTimestamp > now) continue;
206
+ // Rate limit is over, delete the rate limiter
207
+ rest.rateLimitedPaths.delete(key);
208
+ // If it was global, also mark the global value as false
209
+ if (key === 'global') rest.globallyRateLimited = false;
210
+ }
211
+ // ALL PATHS ARE CLEARED CAN CANCEL OUT!
212
+ if (rest.rateLimitedPaths.size === 0) {
213
+ rest.processingRateLimitedPaths = false;
214
+ } else {
215
+ rest.processingRateLimitedPaths = true;
216
+ // RECHECK IN 1 SECOND
217
+ setTimeout(()=>{
218
+ // rest.debug('[REST - processRateLimitedPaths] Running setTimeout.')
219
+ rest.processRateLimitedPaths();
220
+ }, 1000);
221
+ }
222
+ },
223
+ /** Processes the rate limit headers and determines if it needs to be rate limited and returns the bucket id if available */ processHeaders (url, headers, identifier) {
224
+ let rateLimited = false;
225
+ // GET ALL NECESSARY HEADERS
226
+ const remaining = headers.get(RATE_LIMIT_REMAINING_HEADER);
227
+ const retryAfter = headers.get(RATE_LIMIT_RESET_AFTER_HEADER);
228
+ const reset = Date.now() + Number(retryAfter) * 1000;
229
+ const global = headers.get(RATE_LIMIT_GLOBAL_HEADER);
230
+ // undefined override null needed for typings
231
+ const bucketId = headers.get(RATE_LIMIT_BUCKET_HEADER) ?? undefined;
232
+ const limit = headers.get(RATE_LIMIT_LIMIT_HEADER);
233
+ // If we didn't received the identifier, fallback to the bot token
234
+ identifier ??= `Bot ${rest.token}`;
235
+ rest.queues.get(`${identifier}${url}`)?.handleCompletedRequest({
236
+ remaining: remaining ? Number(remaining) : undefined,
237
+ interval: retryAfter ? Number(retryAfter) * 1000 : undefined,
238
+ max: limit ? Number(limit) : undefined
239
+ });
240
+ // IF THERE IS NO REMAINING RATE LIMIT, MARK IT AS RATE LIMITED
241
+ if (remaining === '0') {
242
+ rateLimited = true;
243
+ // SAVE THE URL AS LIMITED, IMPORTANT FOR NEW REQUESTS BY USER WITHOUT BUCKET
244
+ rest.rateLimitedPaths.set(`${identifier}${url}`, {
245
+ url,
246
+ resetTimestamp: reset,
247
+ bucketId
248
+ });
249
+ // SAVE THE BUCKET AS LIMITED SINCE DIFFERENT URLS MAY SHARE A BUCKET
250
+ if (bucketId) {
251
+ rest.rateLimitedPaths.set(`${identifier}${bucketId}`, {
252
+ url,
253
+ resetTimestamp: reset,
254
+ bucketId
255
+ });
256
+ }
257
+ }
258
+ // IF THERE IS NO REMAINING GLOBAL LIMIT, MARK IT RATE LIMITED GLOBALLY
259
+ if (global) {
260
+ const retryAfter = Number(headers.get('retry-after')) * 1000;
261
+ const globalReset = Date.now() + retryAfter;
262
+ // rest.debug(
263
+ // `[REST = Globally Rate Limited] URL: ${url} | Global Rest: ${globalReset}`
264
+ // )
265
+ rest.globallyRateLimited = true;
266
+ rateLimited = true;
267
+ setTimeout(()=>{
268
+ rest.globallyRateLimited = false;
269
+ }, retryAfter);
270
+ rest.rateLimitedPaths.set('global', {
271
+ url: 'global',
272
+ resetTimestamp: globalReset,
273
+ bucketId
274
+ });
275
+ if (bucketId) {
276
+ rest.rateLimitedPaths.set(identifier, {
277
+ url: 'global',
278
+ resetTimestamp: globalReset,
279
+ bucketId
280
+ });
281
+ }
282
+ }
283
+ if (rateLimited && !rest.processingRateLimitedPaths) {
284
+ rest.processRateLimitedPaths();
285
+ }
286
+ return rateLimited ? bucketId : undefined;
287
+ },
288
+ async sendRequest (options) {
289
+ const url = `${rest.baseUrl}/v${rest.version}${options.route}`;
290
+ const payload = rest.createRequestBody(options.method, options.requestBodyOptions);
291
+ const loggingHeaders = {
292
+ ...payload.headers
293
+ };
294
+ if (payload.headers.authorization) {
295
+ const authorizationScheme = payload.headers.authorization?.split(' ')[0];
296
+ loggingHeaders.authorization = `${authorizationScheme} tokenhere`;
297
+ }
298
+ rest.logger.debug(`sending request to ${url}`, 'with payload:', {
299
+ ...payload,
300
+ headers: loggingHeaders
301
+ });
302
+ const response = await fetch(url, payload).catch(async (error)=>{
303
+ rest.logger.error(error);
304
+ // Mark request and completed
305
+ rest.invalidBucket.handleCompletedRequest(999, false);
306
+ options.reject({
307
+ ok: false,
308
+ status: 999,
309
+ error: 'Possible network or request shape issue occurred. If this is rare, its a network glitch. If it occurs a lot something is wrong.'
310
+ });
311
+ throw error;
312
+ });
313
+ rest.logger.debug(`request fetched from ${url} with status ${response.status} & ${response.statusText}`);
314
+ // Mark request and completed
315
+ rest.invalidBucket.handleCompletedRequest(response.status, response.headers.get(RATE_LIMIT_SCOPE_HEADER) === 'shared');
316
+ // Set the bucket id if it was available on the headers
317
+ const bucketId = rest.processHeaders(rest.simplifyUrl(options.route, options.method), response.headers, payload.headers.authorization);
318
+ if (bucketId) options.bucketId = bucketId;
319
+ if (response.status < 200 || response.status >= 400) {
320
+ rest.logger.debug(`Request to ${url} failed.`);
321
+ if (response.status !== 429) {
322
+ options.reject({
323
+ ok: false,
324
+ status: response.status,
325
+ body: await response.text()
326
+ });
327
+ return;
328
+ }
329
+ rest.logger.debug(`Request to ${url} was ratelimited.`);
330
+ // Too many attempts, get rid of request from queue.
331
+ if (options.retryCount >= rest.maxRetryCount) {
332
+ rest.logger.debug(`Request to ${url} exceeded the maximum allowed retries.`, 'with payload:', payload);
333
+ // rest.debug(`[REST - RetriesMaxed] ${JSON.stringify(options)}`)
334
+ options.reject({
335
+ ok: false,
336
+ status: response.status,
337
+ error: 'The request was rate limited and it maxed out the retries limit.'
338
+ });
339
+ return;
340
+ }
341
+ options.retryCount += 1;
342
+ const resetAfter = response.headers.get(RATE_LIMIT_RESET_AFTER_HEADER);
343
+ if (resetAfter) await delay(Number(resetAfter) * 1000);
344
+ // process the response to prevent mem leak
345
+ await response.arrayBuffer();
346
+ return await options.retryRequest?.(options);
347
+ }
348
+ // Discord sometimes sends no response with no content.
349
+ options.resolve({
350
+ ok: true,
351
+ status: response.status,
352
+ body: response.status === 204 ? undefined : await response.text()
353
+ });
354
+ },
355
+ simplifyUrl (url, method) {
356
+ const parts = url.split('/');
357
+ const secondLastPart = parts[parts.length - 2];
358
+ if (secondLastPart === 'channels' || secondLastPart === 'guilds') {
359
+ return url;
360
+ }
361
+ if (secondLastPart === 'reactions' || parts[parts.length - 1] === '@me') {
362
+ parts.splice(-2);
363
+ parts.push('reactions');
364
+ } else {
365
+ parts.splice(-1);
366
+ parts.push('x');
367
+ }
368
+ if (parts[parts.length - 3] === 'reactions') {
369
+ parts.splice(-2);
370
+ }
371
+ if (method === 'DELETE' && secondLastPart === 'messages') {
372
+ return `D${parts.join('/')}`;
373
+ }
374
+ return parts.join('/');
375
+ },
376
+ async processRequest (request) {
377
+ const url = rest.simplifyUrl(request.route, request.method);
378
+ if (request.runThroughQueue === false) {
379
+ await rest.sendRequest(request);
380
+ return;
381
+ }
382
+ // If we the request has a token, use it
383
+ // Else fallback to prefix with the bot token
384
+ const queueIdentifier = request.requestBodyOptions?.headers?.authorization ?? `Bot ${rest.token}`;
385
+ const queue = rest.queues.get(`${queueIdentifier}${url}`);
386
+ if (queue !== undefined) {
387
+ queue.makeRequest(request);
388
+ } else {
389
+ // CREATES A NEW QUEUE
390
+ const bucketQueue = new Queue(rest, {
391
+ url,
392
+ deleteQueueDelay: rest.deleteQueueDelay,
393
+ identifier: queueIdentifier
394
+ });
395
+ // Save queue
396
+ rest.queues.set(`${queueIdentifier}${url}`, bucketQueue);
397
+ // Add request to queue
398
+ bucketQueue.makeRequest(request);
399
+ }
400
+ },
401
+ async makeRequest (method, route, options) {
402
+ if (rest.isProxied) {
403
+ if (rest.authorization !== undefined) {
404
+ options ??= {};
405
+ options.headers ??= {};
406
+ options.headers[rest.authorizationHeader] = rest.authorization;
407
+ }
408
+ const result = await fetch(`${rest.baseUrl}/v${rest.version}${route}`, rest.createRequestBody(method, options));
409
+ if (!result.ok) {
410
+ const err = await result.json().catch(()=>{});
411
+ // Legacy Handling to not break old code or when body is missing
412
+ if (!err?.body) throw new Error(`Error: ${err.message ?? result.statusText}`);
413
+ throw new Error(JSON.stringify(err));
414
+ }
415
+ return result.status !== 204 ? await result.json() : undefined;
416
+ }
417
+ // This error needs to be created here because of how stack traces get calculated
418
+ const error = new Error();
419
+ error.message = 'Failed to send request to discord.';
420
+ return await new Promise(async (resolve, reject)=>{
421
+ const payload = {
422
+ route,
423
+ method,
424
+ requestBodyOptions: options,
425
+ retryCount: 0,
426
+ retryRequest: async (payload)=>{
427
+ await rest.processRequest(payload);
428
+ },
429
+ resolve: (data)=>{
430
+ resolve(data.status !== 204 ? JSON.parse(data.body ?? '{}') : undefined);
431
+ },
432
+ reject: (reason)=>{
433
+ error.cause = reason;
434
+ reject(error);
435
+ },
436
+ runThroughQueue: options?.runThroughQueue
437
+ };
438
+ await rest.processRequest(payload);
439
+ });
440
+ },
441
+ async get (url, options) {
442
+ return camelize(await rest.makeRequest('GET', url, options));
443
+ },
444
+ async post (url, options) {
445
+ return camelize(await rest.makeRequest('POST', url, options));
446
+ },
447
+ async delete (url, options) {
448
+ camelize(await rest.makeRequest('DELETE', url, options));
449
+ },
450
+ async patch (url, options) {
451
+ return camelize(await rest.makeRequest('PATCH', url, options));
452
+ },
453
+ async put (url, options) {
454
+ return camelize(await rest.makeRequest('PUT', url, options));
455
+ },
456
+ async addReaction (channelId, messageId, reaction) {
457
+ reaction = processReactionString(reaction);
458
+ await rest.put(rest.routes.channels.reactions.bot(channelId, messageId, reaction));
459
+ },
460
+ async addReactions (channelId, messageId, reactions, ordered = false) {
461
+ if (!ordered) {
462
+ await Promise.all(reactions.map(async (reaction)=>{
463
+ await rest.addReaction(channelId, messageId, reaction);
464
+ }));
465
+ return;
466
+ }
467
+ for (const reaction of reactions){
468
+ await rest.addReaction(channelId, messageId, reaction);
469
+ }
470
+ },
471
+ async addRole (guildId, userId, roleId, reason) {
472
+ await rest.put(rest.routes.guilds.roles.member(guildId, userId, roleId), {
473
+ reason
474
+ });
475
+ },
476
+ async addThreadMember (channelId, userId) {
477
+ await rest.put(rest.routes.channels.threads.user(channelId, userId));
478
+ },
479
+ async addDmRecipient (channelId, userId, body) {
480
+ await rest.put(rest.routes.channels.dmRecipient(channelId, userId), {
481
+ body
482
+ });
483
+ },
484
+ async createAutomodRule (guildId, body, reason) {
485
+ return await rest.post(rest.routes.guilds.automod.rules(guildId), {
486
+ body,
487
+ reason
488
+ });
489
+ },
490
+ async createChannel (guildId, body, reason) {
491
+ return await rest.post(rest.routes.guilds.channels(guildId), {
492
+ body,
493
+ reason
494
+ });
495
+ },
496
+ async createEmoji (guildId, body, reason) {
497
+ return await rest.post(rest.routes.guilds.emojis(guildId), {
498
+ body,
499
+ reason
500
+ });
501
+ },
502
+ async createApplicationEmoji (body) {
503
+ return await rest.post(rest.routes.applicationEmojis(rest.applicationId), {
504
+ body
505
+ });
506
+ },
507
+ async createGlobalApplicationCommand (body, options) {
508
+ const restOptions = {
509
+ body
510
+ };
511
+ if (options?.bearerToken) {
512
+ restOptions.unauthorized = true;
513
+ restOptions.headers = {
514
+ authorization: `Bearer ${options.bearerToken}`
515
+ };
516
+ }
517
+ return await rest.post(rest.routes.interactions.commands.commands(rest.applicationId), restOptions);
518
+ },
519
+ async createGuild (body) {
520
+ return await rest.post(rest.routes.guilds.all(), {
521
+ body
522
+ });
523
+ },
524
+ async createGuildApplicationCommand (body, guildId, options) {
525
+ const restOptions = {
526
+ body
527
+ };
528
+ if (options?.bearerToken) {
529
+ restOptions.unauthorized = true;
530
+ restOptions.headers = {
531
+ authorization: `Bearer ${options.bearerToken}`
532
+ };
533
+ }
534
+ return await rest.post(rest.routes.interactions.commands.guilds.all(rest.applicationId, guildId), restOptions);
535
+ },
536
+ async createGuildFromTemplate (templateCode, body) {
537
+ if (body.icon) {
538
+ body.icon = await urlToBase64(body.icon);
539
+ }
540
+ return await rest.post(rest.routes.guilds.templates.code(templateCode), {
541
+ body
542
+ });
543
+ },
544
+ async createGuildSticker (guildId, options, reason) {
545
+ const form = new FormData();
546
+ form.append('file', options.file.blob, options.file.name);
547
+ form.append('name', options.name);
548
+ form.append('description', options.description);
549
+ form.append('tags', options.tags);
550
+ return await rest.post(rest.routes.guilds.stickers(guildId), {
551
+ body: form,
552
+ reason
553
+ });
554
+ },
555
+ async createGuildTemplate (guildId, body) {
556
+ return await rest.post(rest.routes.guilds.templates.all(guildId), {
557
+ body
558
+ });
559
+ },
560
+ async createForumThread (channelId, body, reason) {
561
+ return await rest.post(rest.routes.channels.forum(channelId), {
562
+ body,
563
+ files: body.files,
564
+ reason
565
+ });
566
+ },
567
+ async createInvite (channelId, body = {}, reason) {
568
+ return await rest.post(rest.routes.channels.invites(channelId), {
569
+ body,
570
+ reason
571
+ });
572
+ },
573
+ async createRole (guildId, body, reason) {
574
+ return await rest.post(rest.routes.guilds.roles.all(guildId), {
575
+ body,
576
+ reason
577
+ });
578
+ },
579
+ async createScheduledEvent (guildId, body, reason) {
580
+ return await rest.post(rest.routes.guilds.events.events(guildId), {
581
+ body,
582
+ reason
583
+ });
584
+ },
585
+ async createStageInstance (body, reason) {
586
+ return await rest.post(rest.routes.channels.stages(), {
587
+ body,
588
+ reason
589
+ });
590
+ },
591
+ async createWebhook (channelId, options, reason) {
592
+ return await rest.post(rest.routes.channels.webhooks(channelId), {
593
+ body: {
594
+ name: options.name,
595
+ avatar: options.avatar ? await urlToBase64(options.avatar) : undefined
596
+ },
597
+ reason
598
+ });
599
+ },
600
+ async deleteAutomodRule (guildId, ruleId, reason) {
601
+ await rest.delete(rest.routes.guilds.automod.rule(guildId, ruleId), {
602
+ reason
603
+ });
604
+ },
605
+ async deleteChannel (channelId, reason) {
606
+ await rest.delete(rest.routes.channels.channel(channelId), {
607
+ reason
608
+ });
609
+ },
610
+ async deleteChannelPermissionOverride (channelId, overwriteId, reason) {
611
+ await rest.delete(rest.routes.channels.overwrite(channelId, overwriteId), {
612
+ reason
613
+ });
614
+ },
615
+ async deleteEmoji (guildId, id, reason) {
616
+ await rest.delete(rest.routes.guilds.emoji(guildId, id), {
617
+ reason
618
+ });
619
+ },
620
+ async deleteApplicationEmoji (id) {
621
+ await rest.delete(rest.routes.applicationEmoji(rest.applicationId, id));
622
+ },
623
+ async deleteFollowupMessage (token, messageId) {
624
+ await rest.delete(rest.routes.interactions.responses.message(rest.applicationId, token, messageId), {
625
+ unauthorized: true
626
+ });
627
+ },
628
+ async deleteGlobalApplicationCommand (commandId) {
629
+ await rest.delete(rest.routes.interactions.commands.command(rest.applicationId, commandId));
630
+ },
631
+ async deleteGuild (guildId) {
632
+ await rest.delete(rest.routes.guilds.guild(guildId));
633
+ },
634
+ async deleteGuildApplicationCommand (commandId, guildId) {
635
+ await rest.delete(rest.routes.interactions.commands.guilds.one(rest.applicationId, guildId, commandId));
636
+ },
637
+ async deleteGuildSticker (guildId, stickerId, reason) {
638
+ await rest.delete(rest.routes.guilds.sticker(guildId, stickerId), {
639
+ reason
640
+ });
641
+ },
642
+ async deleteGuildTemplate (guildId, templateCode) {
643
+ await rest.delete(rest.routes.guilds.templates.guild(guildId, templateCode));
644
+ },
645
+ async deleteIntegration (guildId, integrationId, reason) {
646
+ await rest.delete(rest.routes.guilds.integration(guildId, integrationId), {
647
+ reason
648
+ });
649
+ },
650
+ async deleteInvite (inviteCode, reason) {
651
+ await rest.delete(rest.routes.guilds.invite(inviteCode), {
652
+ reason
653
+ });
654
+ },
655
+ async deleteMessage (channelId, messageId, reason) {
656
+ await rest.delete(rest.routes.channels.message(channelId, messageId), {
657
+ reason
658
+ });
659
+ },
660
+ async deleteMessages (channelId, messageIds, reason) {
661
+ await rest.post(rest.routes.channels.bulk(channelId), {
662
+ body: {
663
+ messages: messageIds.slice(0, 100).map((id)=>id.toString())
664
+ },
665
+ reason
666
+ });
667
+ },
668
+ async deleteOriginalInteractionResponse (token) {
669
+ await rest.delete(rest.routes.interactions.responses.original(rest.applicationId, token), {
670
+ unauthorized: true
671
+ });
672
+ },
673
+ async deleteOwnReaction (channelId, messageId, reaction) {
674
+ reaction = processReactionString(reaction);
675
+ await rest.delete(rest.routes.channels.reactions.bot(channelId, messageId, reaction));
676
+ },
677
+ async deleteReactionsAll (channelId, messageId) {
678
+ await rest.delete(rest.routes.channels.reactions.all(channelId, messageId));
679
+ },
680
+ async deleteReactionsEmoji (channelId, messageId, reaction) {
681
+ reaction = processReactionString(reaction);
682
+ await rest.delete(rest.routes.channels.reactions.emoji(channelId, messageId, reaction));
683
+ },
684
+ async deleteRole (guildId, roleId, reason) {
685
+ await rest.delete(rest.routes.guilds.roles.one(guildId, roleId), {
686
+ reason
687
+ });
688
+ },
689
+ async deleteScheduledEvent (guildId, eventId) {
690
+ await rest.delete(rest.routes.guilds.events.event(guildId, eventId));
691
+ },
692
+ async deleteStageInstance (channelId, reason) {
693
+ await rest.delete(rest.routes.channels.stage(channelId), {
694
+ reason
695
+ });
696
+ },
697
+ async deleteUserReaction (channelId, messageId, userId, reaction) {
698
+ reaction = processReactionString(reaction);
699
+ await rest.delete(rest.routes.channels.reactions.user(channelId, messageId, reaction, userId));
700
+ },
701
+ async deleteWebhook (webhookId, reason) {
702
+ await rest.delete(rest.routes.webhooks.id(webhookId), {
703
+ reason
704
+ });
705
+ },
706
+ async deleteWebhookMessage (webhookId, token, messageId, options) {
707
+ await rest.delete(rest.routes.webhooks.message(webhookId, token, messageId, options));
708
+ },
709
+ async deleteWebhookWithToken (webhookId, token) {
710
+ await rest.delete(rest.routes.webhooks.webhook(webhookId, token), {
711
+ unauthorized: true
712
+ });
713
+ },
714
+ async editApplicationCommandPermissions (guildId, commandId, bearerToken, permissions) {
715
+ return await rest.put(rest.routes.interactions.commands.permission(rest.applicationId, guildId, commandId), {
716
+ body: {
717
+ permissions
718
+ },
719
+ headers: {
720
+ authorization: `Bearer ${bearerToken}`
721
+ }
722
+ });
723
+ },
724
+ async editAutomodRule (guildId, ruleId, body, reason) {
725
+ return await rest.patch(rest.routes.guilds.automod.rule(guildId, ruleId), {
726
+ body,
727
+ reason
728
+ });
729
+ },
730
+ async editBotProfile (options) {
731
+ const avatar = options?.botAvatarURL ? await urlToBase64(options?.botAvatarURL) : options?.botAvatarURL;
732
+ const banner = options?.botBannerURL ? await urlToBase64(options?.botBannerURL) : options?.botBannerURL;
733
+ return await rest.patch(rest.routes.currentUser(), {
734
+ body: {
735
+ username: options.username?.trim(),
736
+ avatar,
737
+ banner
738
+ }
739
+ });
740
+ },
741
+ async editChannel (channelId, body, reason) {
742
+ return await rest.patch(rest.routes.channels.channel(channelId), {
743
+ body,
744
+ reason
745
+ });
746
+ },
747
+ async editChannelPermissionOverrides (channelId, body, reason) {
748
+ await rest.put(rest.routes.channels.overwrite(channelId, body.id), {
749
+ body,
750
+ reason
751
+ });
752
+ },
753
+ async editChannelPositions (guildId, body) {
754
+ await rest.patch(rest.routes.guilds.channels(guildId), {
755
+ body
756
+ });
757
+ },
758
+ async editEmoji (guildId, id, body, reason) {
759
+ return await rest.patch(rest.routes.guilds.emoji(guildId, id), {
760
+ body,
761
+ reason
762
+ });
763
+ },
764
+ async editApplicationEmoji (id, body) {
765
+ return await rest.patch(rest.routes.applicationEmoji(rest.applicationId, id), {
766
+ body
767
+ });
768
+ },
769
+ async editFollowupMessage (token, messageId, body) {
770
+ return await rest.patch(rest.routes.interactions.responses.message(rest.applicationId, token, messageId), {
771
+ body,
772
+ files: body.files,
773
+ unauthorized: true
774
+ });
775
+ },
776
+ async editGlobalApplicationCommand (commandId, body) {
777
+ return await rest.patch(rest.routes.interactions.commands.command(rest.applicationId, commandId), {
778
+ body
779
+ });
780
+ },
781
+ async editGuild (guildId, body, reason) {
782
+ return await rest.patch(rest.routes.guilds.guild(guildId), {
783
+ body,
784
+ reason
785
+ });
786
+ },
787
+ async editGuildApplicationCommand (commandId, guildId, body) {
788
+ return await rest.patch(rest.routes.interactions.commands.guilds.one(rest.applicationId, guildId, commandId), {
789
+ body
790
+ });
791
+ },
792
+ async editGuildMfaLevel (guildId, mfaLevel, reason) {
793
+ await rest.post(rest.routes.guilds.mfa(guildId), {
794
+ body: {
795
+ level: mfaLevel
796
+ },
797
+ reason
798
+ });
799
+ },
800
+ async editGuildSticker (guildId, stickerId, body, reason) {
801
+ return await rest.patch(rest.routes.guilds.sticker(guildId, stickerId), {
802
+ body,
803
+ reason
804
+ });
805
+ },
806
+ async editGuildTemplate (guildId, templateCode, body) {
807
+ return await rest.patch(rest.routes.guilds.templates.guild(guildId, templateCode), {
808
+ body
809
+ });
810
+ },
811
+ async editMessage (channelId, messageId, body) {
812
+ return await rest.patch(rest.routes.channels.message(channelId, messageId), {
813
+ body,
814
+ files: body.files
815
+ });
816
+ },
817
+ async editOriginalInteractionResponse (token, body) {
818
+ return await rest.patch(rest.routes.interactions.responses.original(rest.applicationId, token), {
819
+ body,
820
+ files: body.files
821
+ });
822
+ },
823
+ async editOriginalWebhookMessage (webhookId, token, options) {
824
+ return await rest.patch(rest.routes.webhooks.original(webhookId, token, options), {
825
+ body: {
826
+ type: InteractionResponseTypes.UpdateMessage,
827
+ data: options
828
+ },
829
+ files: options.files,
830
+ unauthorized: true
831
+ });
832
+ },
833
+ async editOwnVoiceState (guildId, options) {
834
+ await rest.patch(rest.routes.guilds.voice(guildId), {
835
+ body: {
836
+ ...options,
837
+ requestToSpeakTimestamp: options.requestToSpeakTimestamp ? new Date(options.requestToSpeakTimestamp).toISOString() : options.requestToSpeakTimestamp
838
+ }
839
+ });
840
+ },
841
+ async editScheduledEvent (guildId, eventId, body, reason) {
842
+ return await rest.patch(rest.routes.guilds.events.event(guildId, eventId), {
843
+ body,
844
+ reason
845
+ });
846
+ },
847
+ async editRole (guildId, roleId, body, reason) {
848
+ return await rest.patch(rest.routes.guilds.roles.one(guildId, roleId), {
849
+ body,
850
+ reason
851
+ });
852
+ },
853
+ async editRolePositions (guildId, body, reason) {
854
+ return await rest.patch(rest.routes.guilds.roles.all(guildId), {
855
+ body,
856
+ reason
857
+ });
858
+ },
859
+ async editStageInstance (channelId, topic, reason) {
860
+ return await rest.patch(rest.routes.channels.stage(channelId), {
861
+ body: {
862
+ topic
863
+ },
864
+ reason
865
+ });
866
+ },
867
+ async editUserVoiceState (guildId, options) {
868
+ await rest.patch(rest.routes.guilds.voice(guildId, options.userId), {
869
+ body: options
870
+ });
871
+ },
872
+ async editWebhook (webhookId, body, reason) {
873
+ return await rest.patch(rest.routes.webhooks.id(webhookId), {
874
+ body,
875
+ reason
876
+ });
877
+ },
878
+ async editWebhookMessage (webhookId, token, messageId, options) {
879
+ return await rest.patch(rest.routes.webhooks.message(webhookId, token, messageId, options), {
880
+ body: options,
881
+ files: options.files,
882
+ unauthorized: true
883
+ });
884
+ },
885
+ async editWebhookWithToken (webhookId, token, body) {
886
+ return await rest.patch(rest.routes.webhooks.webhook(webhookId, token), {
887
+ body,
888
+ unauthorized: true
889
+ });
890
+ },
891
+ async editWelcomeScreen (guildId, body, reason) {
892
+ return await rest.patch(rest.routes.guilds.welcome(guildId), {
893
+ body,
894
+ reason
895
+ });
896
+ },
897
+ async editWidgetSettings (guildId, body, reason) {
898
+ return await rest.patch(rest.routes.guilds.widget(guildId), {
899
+ body,
900
+ reason
901
+ });
902
+ },
903
+ async executeWebhook (webhookId, token, options) {
904
+ return await rest.post(rest.routes.webhooks.webhook(webhookId, token, options), {
905
+ body: options,
906
+ unauthorized: true
907
+ });
908
+ },
909
+ async followAnnouncement (sourceChannelId, targetChannelId, reason) {
910
+ return await rest.post(rest.routes.channels.follow(sourceChannelId), {
911
+ body: {
912
+ webhookChannelId: targetChannelId
913
+ },
914
+ reason
915
+ });
916
+ },
917
+ async getActiveThreads (guildId) {
918
+ return await rest.get(rest.routes.channels.threads.active(guildId));
919
+ },
920
+ async getApplicationCommandPermission (guildId, commandId, options) {
921
+ const restOptions = {};
922
+ if (options?.accessToken) {
923
+ restOptions.unauthorized = true;
924
+ restOptions.headers = {
925
+ authorization: `Bearer ${options.accessToken}`
926
+ };
927
+ }
928
+ return await rest.get(rest.routes.interactions.commands.permission(options?.applicationId ?? rest.applicationId, guildId, commandId), restOptions);
929
+ },
930
+ async getApplicationCommandPermissions (guildId, options) {
931
+ const restOptions = {};
932
+ if (options?.accessToken) {
933
+ restOptions.unauthorized = true;
934
+ restOptions.headers = {
935
+ authorization: `Bearer ${options.accessToken}`
936
+ };
937
+ }
938
+ return await rest.get(rest.routes.interactions.commands.permissions(options?.applicationId ?? rest.applicationId, guildId), restOptions);
939
+ },
940
+ async getApplicationInfo () {
941
+ return await rest.get(rest.routes.oauth2.application());
942
+ },
943
+ async editApplicationInfo (body) {
944
+ return await rest.patch(rest.routes.application(), {
945
+ body
946
+ });
947
+ },
948
+ async getCurrentAuthenticationInfo (token) {
949
+ return await rest.get(rest.routes.oauth2.currentAuthorization(), {
950
+ headers: {
951
+ authorization: `Bearer ${token}`
952
+ },
953
+ unauthorized: true
954
+ });
955
+ },
956
+ async exchangeToken (clientId, clientSecret, body) {
957
+ const basicCredentials = Buffer.from(`${clientId}:${clientSecret}`);
958
+ const restOptions = {
959
+ body,
960
+ headers: {
961
+ 'content-type': 'application/x-www-form-urlencoded',
962
+ authorization: `Basic ${basicCredentials.toString('base64')}`
963
+ },
964
+ runThroughQueue: false,
965
+ unauthorized: true
966
+ };
967
+ if (body.grantType === 'client_credentials') {
968
+ restOptions.body.scope = body.scope.join(' ');
969
+ }
970
+ return await rest.post(rest.routes.oauth2.tokenExchange(), restOptions);
971
+ },
972
+ async revokeToken (clientId, clientSecret, body) {
973
+ const basicCredentials = Buffer.from(`${clientId}:${clientSecret}`);
974
+ await rest.post(rest.routes.oauth2.tokenRevoke(), {
975
+ body,
976
+ headers: {
977
+ 'content-type': 'application/x-www-form-urlencoded',
978
+ authorization: `Basic ${basicCredentials.toString('base64')}`
979
+ },
980
+ unauthorized: true
981
+ });
982
+ },
983
+ async getAuditLog (guildId, options) {
984
+ return await rest.get(rest.routes.guilds.auditlogs(guildId, options));
985
+ },
986
+ async getAutomodRule (guildId, ruleId) {
987
+ return await rest.get(rest.routes.guilds.automod.rule(guildId, ruleId));
988
+ },
989
+ async getAutomodRules (guildId) {
990
+ return await rest.get(rest.routes.guilds.automod.rules(guildId));
991
+ },
992
+ async getAvailableVoiceRegions () {
993
+ return await rest.get(rest.routes.regions());
994
+ },
995
+ async getBan (guildId, userId) {
996
+ return await rest.get(rest.routes.guilds.members.ban(guildId, userId));
997
+ },
998
+ async getBans (guildId, options) {
999
+ return await rest.get(rest.routes.guilds.members.bans(guildId, options));
1000
+ },
1001
+ async getChannel (id) {
1002
+ return await rest.get(rest.routes.channels.channel(id));
1003
+ },
1004
+ async getChannelInvites (channelId) {
1005
+ return await rest.get(rest.routes.channels.invites(channelId));
1006
+ },
1007
+ async getChannels (guildId) {
1008
+ return await rest.get(rest.routes.guilds.channels(guildId));
1009
+ },
1010
+ async getChannelWebhooks (channelId) {
1011
+ return await rest.get(rest.routes.channels.webhooks(channelId));
1012
+ },
1013
+ async getDmChannel (userId) {
1014
+ return await rest.post(rest.routes.channels.dm(), {
1015
+ body: {
1016
+ recipientId: userId
1017
+ }
1018
+ });
1019
+ },
1020
+ async getGroupDmChannel (body) {
1021
+ return await rest.post(rest.routes.channels.dm(), {
1022
+ body
1023
+ });
1024
+ },
1025
+ async getEmoji (guildId, emojiId) {
1026
+ return await rest.get(rest.routes.guilds.emoji(guildId, emojiId));
1027
+ },
1028
+ async getApplicationEmoji (emojiId) {
1029
+ return await rest.get(rest.routes.applicationEmoji(rest.applicationId, emojiId));
1030
+ },
1031
+ async getEmojis (guildId) {
1032
+ return await rest.get(rest.routes.guilds.emojis(guildId));
1033
+ },
1034
+ async getApplicationEmojis () {
1035
+ return await rest.get(rest.routes.applicationEmojis(rest.applicationId));
1036
+ },
1037
+ async getFollowupMessage (token, messageId) {
1038
+ return await rest.get(rest.routes.interactions.responses.message(rest.applicationId, token, messageId), {
1039
+ unauthorized: true
1040
+ });
1041
+ },
1042
+ async getGatewayBot () {
1043
+ return await rest.get(rest.routes.gatewayBot());
1044
+ },
1045
+ async getGlobalApplicationCommand (commandId) {
1046
+ return await rest.get(rest.routes.interactions.commands.command(rest.applicationId, commandId));
1047
+ },
1048
+ async getGlobalApplicationCommands () {
1049
+ return await rest.get(rest.routes.interactions.commands.commands(rest.applicationId));
1050
+ },
1051
+ async getGuild (guildId, options = {
1052
+ counts: true
1053
+ }) {
1054
+ return await rest.get(rest.routes.guilds.guild(guildId, options.counts));
1055
+ },
1056
+ async getGuilds (token, options) {
1057
+ const makeRequestOptions = token ? {
1058
+ headers: {
1059
+ authorization: `Bearer ${token}`
1060
+ },
1061
+ unauthorized: true
1062
+ } : undefined;
1063
+ return await rest.get(rest.routes.guilds.userGuilds(options), makeRequestOptions);
1064
+ },
1065
+ async getGuildApplicationCommand (commandId, guildId) {
1066
+ return await rest.get(rest.routes.interactions.commands.guilds.one(rest.applicationId, guildId, commandId));
1067
+ },
1068
+ async getGuildApplicationCommands (guildId) {
1069
+ return await rest.get(rest.routes.interactions.commands.guilds.all(rest.applicationId, guildId));
1070
+ },
1071
+ async getGuildPreview (guildId) {
1072
+ return await rest.get(rest.routes.guilds.preview(guildId));
1073
+ },
1074
+ async getGuildTemplate (templateCode) {
1075
+ return await rest.get(rest.routes.guilds.templates.code(templateCode));
1076
+ },
1077
+ async getGuildTemplates (guildId) {
1078
+ return await rest.get(rest.routes.guilds.templates.all(guildId));
1079
+ },
1080
+ async getGuildWebhooks (guildId) {
1081
+ return await rest.get(rest.routes.guilds.webhooks(guildId));
1082
+ },
1083
+ async getIntegrations (guildId) {
1084
+ return await rest.get(rest.routes.guilds.integrations(guildId));
1085
+ },
1086
+ async getInvite (inviteCode, options) {
1087
+ return await rest.get(rest.routes.guilds.invite(inviteCode, options));
1088
+ },
1089
+ async getInvites (guildId) {
1090
+ return await rest.get(rest.routes.guilds.invites(guildId));
1091
+ },
1092
+ async getMessage (channelId, messageId) {
1093
+ return await rest.get(rest.routes.channels.message(channelId, messageId));
1094
+ },
1095
+ async getMessages (channelId, options) {
1096
+ return await rest.get(rest.routes.channels.messages(channelId, options));
1097
+ },
1098
+ async getStickerPack (stickerPackId) {
1099
+ return await rest.get(rest.routes.stickerPack(stickerPackId));
1100
+ },
1101
+ async getStickerPacks () {
1102
+ return await rest.get(rest.routes.stickerPacks());
1103
+ },
1104
+ async getOriginalInteractionResponse (token) {
1105
+ return await rest.get(rest.routes.interactions.responses.original(rest.applicationId, token), {
1106
+ unauthorized: true
1107
+ });
1108
+ },
1109
+ async getPinnedMessages (channelId) {
1110
+ return await rest.get(rest.routes.channels.pins(channelId));
1111
+ },
1112
+ async getPrivateArchivedThreads (channelId, options) {
1113
+ return await rest.get(rest.routes.channels.threads.private(channelId, options));
1114
+ },
1115
+ async getPrivateJoinedArchivedThreads (channelId, options) {
1116
+ return await rest.get(rest.routes.channels.threads.joined(channelId, options));
1117
+ },
1118
+ async getPruneCount (guildId, options) {
1119
+ return await rest.get(rest.routes.guilds.prune(guildId, options));
1120
+ },
1121
+ async getPublicArchivedThreads (channelId, options) {
1122
+ return await rest.get(rest.routes.channels.threads.public(channelId, options));
1123
+ },
1124
+ async getRoles (guildId) {
1125
+ return await rest.get(rest.routes.guilds.roles.all(guildId));
1126
+ },
1127
+ async getRole (guildId, roleId) {
1128
+ return await rest.get(rest.routes.guilds.roles.one(guildId, roleId));
1129
+ },
1130
+ async getScheduledEvent (guildId, eventId, options) {
1131
+ return await rest.get(rest.routes.guilds.events.event(guildId, eventId, options?.withUserCount));
1132
+ },
1133
+ async getScheduledEvents (guildId, options) {
1134
+ return await rest.get(rest.routes.guilds.events.events(guildId, options?.withUserCount));
1135
+ },
1136
+ async getScheduledEventUsers (guildId, eventId, options) {
1137
+ return await rest.get(rest.routes.guilds.events.users(guildId, eventId, options));
1138
+ },
1139
+ async getSessionInfo () {
1140
+ return await rest.getGatewayBot();
1141
+ },
1142
+ async getStageInstance (channelId) {
1143
+ return await rest.get(rest.routes.channels.stage(channelId));
1144
+ },
1145
+ async getOwnVoiceState (guildId) {
1146
+ return await rest.get(rest.routes.guilds.voice(guildId));
1147
+ },
1148
+ async getUserVoiceState (guildId, userId) {
1149
+ return await rest.get(rest.routes.guilds.voice(guildId, userId));
1150
+ },
1151
+ async getSticker (stickerId) {
1152
+ return await rest.get(rest.routes.sticker(stickerId));
1153
+ },
1154
+ async getGuildSticker (guildId, stickerId) {
1155
+ return await rest.get(rest.routes.guilds.sticker(guildId, stickerId));
1156
+ },
1157
+ async getGuildStickers (guildId) {
1158
+ return await rest.get(rest.routes.guilds.stickers(guildId));
1159
+ },
1160
+ async getThreadMember (channelId, userId) {
1161
+ return await rest.get(rest.routes.channels.threads.user(channelId, userId));
1162
+ },
1163
+ async getThreadMembers (channelId) {
1164
+ return await rest.get(rest.routes.channels.threads.members(channelId));
1165
+ },
1166
+ async getReactions (channelId, messageId, reaction, options) {
1167
+ return await rest.get(rest.routes.channels.reactions.message(channelId, messageId, reaction, options));
1168
+ },
1169
+ async getUser (id) {
1170
+ return await rest.get(rest.routes.user(id));
1171
+ },
1172
+ async getCurrentUser (token) {
1173
+ return await rest.get(rest.routes.currentUser(), {
1174
+ headers: {
1175
+ authorization: `Bearer ${token}`
1176
+ },
1177
+ unauthorized: true
1178
+ });
1179
+ },
1180
+ async getUserConnections (token) {
1181
+ return await rest.get(rest.routes.oauth2.connections(), {
1182
+ headers: {
1183
+ authorization: `Bearer ${token}`
1184
+ },
1185
+ unauthorized: true
1186
+ });
1187
+ },
1188
+ async getUserApplicationRoleConnection (token, applicationId) {
1189
+ return await rest.get(rest.routes.oauth2.roleConnections(applicationId), {
1190
+ headers: {
1191
+ authorization: `Bearer ${token}`
1192
+ },
1193
+ unauthorized: true
1194
+ });
1195
+ },
1196
+ async getVanityUrl (guildId) {
1197
+ return await rest.get(rest.routes.guilds.vanity(guildId));
1198
+ },
1199
+ async getVoiceRegions (guildId) {
1200
+ return await rest.get(rest.routes.guilds.regions(guildId));
1201
+ },
1202
+ async getWebhook (webhookId) {
1203
+ return await rest.get(rest.routes.webhooks.id(webhookId));
1204
+ },
1205
+ async getWebhookMessage (webhookId, token, messageId, options) {
1206
+ return await rest.get(rest.routes.webhooks.message(webhookId, token, messageId, options), {
1207
+ unauthorized: true
1208
+ });
1209
+ },
1210
+ async getWebhookWithToken (webhookId, token) {
1211
+ return await rest.get(rest.routes.webhooks.webhook(webhookId, token), {
1212
+ unauthorized: true
1213
+ });
1214
+ },
1215
+ async getWelcomeScreen (guildId) {
1216
+ return await rest.get(rest.routes.guilds.welcome(guildId));
1217
+ },
1218
+ async getWidget (guildId) {
1219
+ return await rest.get(rest.routes.guilds.widgetJson(guildId));
1220
+ },
1221
+ async getWidgetSettings (guildId) {
1222
+ return await rest.get(rest.routes.guilds.widget(guildId));
1223
+ },
1224
+ async joinThread (channelId) {
1225
+ await rest.put(rest.routes.channels.threads.me(channelId));
1226
+ },
1227
+ async leaveGuild (guildId) {
1228
+ await rest.delete(rest.routes.guilds.leave(guildId));
1229
+ },
1230
+ async leaveThread (channelId) {
1231
+ await rest.delete(rest.routes.channels.threads.me(channelId));
1232
+ },
1233
+ async publishMessage (channelId, messageId) {
1234
+ return await rest.post(rest.routes.channels.crosspost(channelId, messageId));
1235
+ },
1236
+ async removeRole (guildId, userId, roleId, reason) {
1237
+ await rest.delete(rest.routes.guilds.roles.member(guildId, userId, roleId), {
1238
+ reason
1239
+ });
1240
+ },
1241
+ async removeThreadMember (channelId, userId) {
1242
+ await rest.delete(rest.routes.channels.threads.user(channelId, userId));
1243
+ },
1244
+ async removeDmRecipient (channelId, userId) {
1245
+ await rest.delete(rest.routes.channels.dmRecipient(channelId, userId));
1246
+ },
1247
+ async sendFollowupMessage (token, options) {
1248
+ return await rest.post(rest.routes.webhooks.webhook(rest.applicationId, token), {
1249
+ body: options,
1250
+ files: options.files,
1251
+ unauthorized: true
1252
+ });
1253
+ },
1254
+ async sendInteractionResponse (interactionId, token, options, params) {
1255
+ return await rest.post(rest.routes.interactions.responses.callback(interactionId, token, params), {
1256
+ body: options,
1257
+ files: options.data?.files,
1258
+ runThroughQueue: false,
1259
+ unauthorized: true
1260
+ });
1261
+ },
1262
+ async sendMessage (channelId, body) {
1263
+ return await rest.post(rest.routes.channels.messages(channelId), {
1264
+ body,
1265
+ files: body.files
1266
+ });
1267
+ },
1268
+ async startThreadWithMessage (channelId, messageId, body, reason) {
1269
+ return await rest.post(rest.routes.channels.threads.message(channelId, messageId), {
1270
+ body,
1271
+ reason
1272
+ });
1273
+ },
1274
+ async startThreadWithoutMessage (channelId, body, reason) {
1275
+ return await rest.post(rest.routes.channels.threads.all(channelId), {
1276
+ body,
1277
+ reason
1278
+ });
1279
+ },
1280
+ async getPollAnswerVoters (channelId, messageId, answerId, options) {
1281
+ return await rest.get(rest.routes.channels.polls.votes(channelId, messageId, answerId, options));
1282
+ },
1283
+ async endPoll (channelId, messageId) {
1284
+ return await rest.post(rest.routes.channels.polls.expire(channelId, messageId));
1285
+ },
1286
+ async syncGuildTemplate (guildId) {
1287
+ return await rest.put(rest.routes.guilds.templates.all(guildId));
1288
+ },
1289
+ async banMember (guildId, userId, body, reason) {
1290
+ await rest.put(rest.routes.guilds.members.ban(guildId, userId), {
1291
+ body,
1292
+ reason
1293
+ });
1294
+ },
1295
+ async bulkBanMembers (guildId, options, reason) {
1296
+ return await rest.post(rest.routes.guilds.members.bulkBan(guildId), {
1297
+ body: options,
1298
+ reason
1299
+ });
1300
+ },
1301
+ async editBotMember (guildId, body, reason) {
1302
+ return await rest.patch(rest.routes.guilds.members.bot(guildId), {
1303
+ body,
1304
+ reason
1305
+ });
1306
+ },
1307
+ async editMember (guildId, userId, body, reason) {
1308
+ return await rest.patch(rest.routes.guilds.members.member(guildId, userId), {
1309
+ body,
1310
+ reason
1311
+ });
1312
+ },
1313
+ async getMember (guildId, userId) {
1314
+ return await rest.get(rest.routes.guilds.members.member(guildId, userId));
1315
+ },
1316
+ async getCurrentMember (guildId, token) {
1317
+ return await rest.get(rest.routes.guilds.members.currentMember(guildId), {
1318
+ headers: {
1319
+ authorization: `Bearer ${token}`
1320
+ },
1321
+ unauthorized: true
1322
+ });
1323
+ },
1324
+ async getMembers (guildId, options) {
1325
+ return await rest.get(rest.routes.guilds.members.members(guildId, options));
1326
+ },
1327
+ async getApplicationActivityInstance (applicationId, instanceId) {
1328
+ return await rest.get(rest.routes.applicationActivityInstance(applicationId, instanceId));
1329
+ },
1330
+ async kickMember (guildId, userId, reason) {
1331
+ await rest.delete(rest.routes.guilds.members.member(guildId, userId), {
1332
+ reason
1333
+ });
1334
+ },
1335
+ async pinMessage (channelId, messageId, reason) {
1336
+ await rest.put(rest.routes.channels.pin(channelId, messageId), {
1337
+ reason
1338
+ });
1339
+ },
1340
+ async pruneMembers (guildId, body, reason) {
1341
+ return await rest.post(rest.routes.guilds.members.prune(guildId), {
1342
+ body,
1343
+ reason
1344
+ });
1345
+ },
1346
+ async searchMembers (guildId, query, options) {
1347
+ return await rest.get(rest.routes.guilds.members.search(guildId, query, options));
1348
+ },
1349
+ async getGuildOnboarding (guildId) {
1350
+ return await rest.get(rest.routes.guilds.onboarding(guildId));
1351
+ },
1352
+ async editGuildOnboarding (guildId, options, reason) {
1353
+ return await rest.put(rest.routes.guilds.onboarding(guildId), {
1354
+ body: options,
1355
+ reason
1356
+ });
1357
+ },
1358
+ async unbanMember (guildId, userId, reason) {
1359
+ await rest.delete(rest.routes.guilds.members.ban(guildId, userId), {
1360
+ reason
1361
+ });
1362
+ },
1363
+ async unpinMessage (channelId, messageId, reason) {
1364
+ await rest.delete(rest.routes.channels.pin(channelId, messageId), {
1365
+ reason
1366
+ });
1367
+ },
1368
+ async triggerTypingIndicator (channelId) {
1369
+ await rest.post(rest.routes.channels.typing(channelId));
1370
+ },
1371
+ async upsertGlobalApplicationCommands (body, options) {
1372
+ const restOptions = {
1373
+ body
1374
+ };
1375
+ if (options?.bearerToken) {
1376
+ restOptions.unauthorized = true;
1377
+ restOptions.headers = {
1378
+ authorization: `Bearer ${options.bearerToken}`
1379
+ };
1380
+ }
1381
+ return await rest.put(rest.routes.interactions.commands.commands(rest.applicationId), restOptions);
1382
+ },
1383
+ async upsertGuildApplicationCommands (guildId, body, options) {
1384
+ const restOptions = {
1385
+ body
1386
+ };
1387
+ if (options?.bearerToken) {
1388
+ restOptions.unauthorized = true;
1389
+ restOptions.headers = {
1390
+ authorization: `Bearer ${options.bearerToken}`
1391
+ };
1392
+ }
1393
+ return await rest.put(rest.routes.interactions.commands.guilds.all(rest.applicationId, guildId), restOptions);
1394
+ },
1395
+ async editUserApplicationRoleConnection (token, applicationId, body) {
1396
+ return await rest.put(rest.routes.oauth2.roleConnections(applicationId), {
1397
+ body,
1398
+ headers: {
1399
+ authorization: `Bearer ${token}`
1400
+ },
1401
+ unauthorized: true
1402
+ });
1403
+ },
1404
+ async addGuildMember (guildId, userId, body) {
1405
+ return await rest.put(rest.routes.guilds.members.member(guildId, userId), {
1406
+ body
1407
+ });
1408
+ },
1409
+ async createTestEntitlement (applicationId, body) {
1410
+ return await rest.post(rest.routes.monetization.entitlements(applicationId), {
1411
+ body
1412
+ });
1413
+ },
1414
+ async listEntitlements (applicationId, options) {
1415
+ return await rest.get(rest.routes.monetization.entitlements(applicationId, options));
1416
+ },
1417
+ async deleteTestEntitlement (applicationId, entitlementId) {
1418
+ await rest.delete(rest.routes.monetization.entitlement(applicationId, entitlementId));
1419
+ },
1420
+ async consumeEntitlement (applicationId, entitlementId) {
1421
+ await rest.post(rest.routes.monetization.consumeEntitlement(applicationId, entitlementId));
1422
+ },
1423
+ async listSkus (applicationId) {
1424
+ return await rest.get(rest.routes.monetization.skus(applicationId));
1425
+ },
1426
+ async listSubscriptions (skuId, options) {
1427
+ return await rest.get(rest.routes.monetization.subscriptions(skuId, options));
1428
+ },
1429
+ async getSubscription (skuId, subscriptionId) {
1430
+ return await rest.get(rest.routes.monetization.subscription(skuId, subscriptionId));
1431
+ },
1432
+ async sendSoundboardSound (channelId, options) {
1433
+ await rest.post(rest.routes.soundboard.sendSound(channelId), {
1434
+ body: options
1435
+ });
1436
+ },
1437
+ async listDefaultSoundboardSounds () {
1438
+ return await rest.get(rest.routes.soundboard.listDefault());
1439
+ },
1440
+ async listGuildSoundboardSounds (guildId) {
1441
+ return await rest.get(rest.routes.soundboard.guildSounds(guildId));
1442
+ },
1443
+ async getGuildSoundboardSound (guildId, soundId) {
1444
+ return await rest.get(rest.routes.soundboard.guildSound(guildId, soundId));
1445
+ },
1446
+ async createGuildSoundboardSound (guildId, options, reason) {
1447
+ return await rest.post(rest.routes.soundboard.guildSounds(guildId), {
1448
+ body: options,
1449
+ reason
1450
+ });
1451
+ },
1452
+ async modifyGuildSoundboardSound (guildId, soundId, options, reason) {
1453
+ return await rest.post(rest.routes.soundboard.guildSound(guildId, soundId), {
1454
+ body: options,
1455
+ reason
1456
+ });
1457
+ },
1458
+ async deleteGuildSoundboardSound (guildId, soundId, reason) {
1459
+ return await rest.delete(rest.routes.soundboard.guildSound(guildId, soundId), {
1460
+ reason
1461
+ });
1462
+ },
1463
+ preferSnakeCase (enabled) {
1464
+ const camelizer = enabled ? (x)=>x : camelize;
1465
+ rest.get = async (url, options)=>{
1466
+ return camelizer(await rest.makeRequest('GET', url, options));
1467
+ };
1468
+ rest.post = async (url, options)=>{
1469
+ return camelizer(await rest.makeRequest('POST', url, options));
1470
+ };
1471
+ rest.delete = async (url, options)=>{
1472
+ camelizer(await rest.makeRequest('DELETE', url, options));
1473
+ };
1474
+ rest.patch = async (url, options)=>{
1475
+ return camelizer(await rest.makeRequest('PATCH', url, options));
1476
+ };
1477
+ rest.put = async (url, options)=>{
1478
+ return camelizer(await rest.makeRequest('PUT', url, options));
1479
+ };
1480
+ return rest;
1481
+ }
1482
+ };
1483
+ return rest;
1484
+ }
1485
+ var HttpResponseCode;
1486
+ (function(HttpResponseCode) {
1487
+ /** Minimum value of a code in oder to consider that it was successful. */ HttpResponseCode[HttpResponseCode["Success"] = 200] = "Success";
1488
+ /** Request completed successfully, but Discord returned an empty body. */ HttpResponseCode[HttpResponseCode["NoContent"] = 204] = "NoContent";
1489
+ /** Minimum value of a code in order to consider that something went wrong. */ HttpResponseCode[HttpResponseCode["Error"] = 400] = "Error";
1490
+ /** This request got rate limited. */ HttpResponseCode[HttpResponseCode["TooManyRequests"] = 429] = "TooManyRequests";
1491
+ })(HttpResponseCode || (HttpResponseCode = {}));
1492
+
1493
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9tYW5hZ2VyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJ1ZmZlciB9IGZyb20gJ25vZGU6YnVmZmVyJ1xuaW1wb3J0IHtcbiAgdHlwZSBCaWdTdHJpbmcsXG4gIHR5cGUgQ2FtZWxpemUsXG4gIHR5cGUgRGlzY29yZEFjY2Vzc1Rva2VuUmVzcG9uc2UsXG4gIHR5cGUgRGlzY29yZEFjdGl2aXR5SW5zdGFuY2UsXG4gIHR5cGUgRGlzY29yZEFwcGxpY2F0aW9uLFxuICB0eXBlIERpc2NvcmRBcHBsaWNhdGlvbkNvbW1hbmQsXG4gIHR5cGUgRGlzY29yZEFwcGxpY2F0aW9uUm9sZUNvbm5lY3Rpb24sXG4gIHR5cGUgRGlzY29yZEF1ZGl0TG9nLFxuICB0eXBlIERpc2NvcmRBdXRvTW9kZXJhdGlvblJ1bGUsXG4gIHR5cGUgRGlzY29yZEJhbixcbiAgdHlwZSBEaXNjb3JkQnVsa0JhbixcbiAgdHlwZSBEaXNjb3JkQ2hhbm5lbCxcbiAgdHlwZSBEaXNjb3JkQ29ubmVjdGlvbixcbiAgdHlwZSBEaXNjb3JkQ3VycmVudEF1dGhvcml6YXRpb24sXG4gIHR5cGUgRGlzY29yZEVtb2ppLFxuICB0eXBlIERpc2NvcmRFbnRpdGxlbWVudCxcbiAgdHlwZSBEaXNjb3JkRm9sbG93ZWRDaGFubmVsLFxuICB0eXBlIERpc2NvcmRHZXRBbnN3ZXJWb3Rlc1Jlc3BvbnNlLFxuICB0eXBlIERpc2NvcmRHZXRHYXRld2F5Qm90LFxuICB0eXBlIERpc2NvcmRHdWlsZCxcbiAgdHlwZSBEaXNjb3JkR3VpbGRBcHBsaWNhdGlvbkNvbW1hbmRQZXJtaXNzaW9ucyxcbiAgdHlwZSBEaXNjb3JkR3VpbGRPbmJvYXJkaW5nLFxuICB0eXBlIERpc2NvcmRHdWlsZFByZXZpZXcsXG4gIHR5cGUgRGlzY29yZEd1aWxkV2lkZ2V0LFxuICB0eXBlIERpc2NvcmRHdWlsZFdpZGdldFNldHRpbmdzLFxuICB0eXBlIERpc2NvcmRJbnRlZ3JhdGlvbixcbiAgdHlwZSBEaXNjb3JkSW50ZXJhY3Rpb25DYWxsYmFja1Jlc3BvbnNlLFxuICB0eXBlIERpc2NvcmRJbnZpdGUsXG4gIHR5cGUgRGlzY29yZEludml0ZU1ldGFkYXRhLFxuICB0eXBlIERpc2NvcmRMaXN0QWN0aXZlVGhyZWFkcyxcbiAgdHlwZSBEaXNjb3JkTGlzdEFyY2hpdmVkVGhyZWFkcyxcbiAgdHlwZSBEaXNjb3JkTWVtYmVyLFxuICB0eXBlIERpc2NvcmRNZW1iZXJXaXRoVXNlcixcbiAgdHlwZSBEaXNjb3JkTWVzc2FnZSxcbiAgdHlwZSBEaXNjb3JkUHJ1bmVkQ291bnQsXG4gIHR5cGUgRGlzY29yZFJvbGUsXG4gIHR5cGUgRGlzY29yZFNjaGVkdWxlZEV2ZW50LFxuICB0eXBlIERpc2NvcmRTa3UsXG4gIHR5cGUgRGlzY29yZFNvdW5kYm9hcmRTb3VuZCxcbiAgdHlwZSBEaXNjb3JkU3RhZ2VJbnN0YW5jZSxcbiAgdHlwZSBEaXNjb3JkU3RpY2tlcixcbiAgdHlwZSBEaXNjb3JkU3RpY2tlclBhY2ssXG4gIHR5cGUgRGlzY29yZFN1YnNjcmlwdGlvbixcbiAgdHlwZSBEaXNjb3JkVGVtcGxhdGUsXG4gIHR5cGUgRGlzY29yZFRocmVhZE1lbWJlcixcbiAgdHlwZSBEaXNjb3JkVXNlcixcbiAgdHlwZSBEaXNjb3JkVmFuaXR5VXJsLFxuICB0eXBlIERpc2NvcmRWb2ljZVJlZ2lvbixcbiAgdHlwZSBEaXNjb3JkVm9pY2VTdGF0ZSxcbiAgdHlwZSBEaXNjb3JkV2ViaG9vayxcbiAgdHlwZSBEaXNjb3JkV2VsY29tZVNjcmVlbixcbiAgSW50ZXJhY3Rpb25SZXNwb25zZVR5cGVzLFxuICB0eXBlIE1mYUxldmVscyxcbiAgdHlwZSBNb2RpZnlHdWlsZFRlbXBsYXRlLFxufSBmcm9tICdAZGlzY29yZGVuby90eXBlcydcbmltcG9ydCB7IGNhbGN1bGF0ZUJpdHMsIGNhbWVsVG9TbmFrZUNhc2UsIGNhbWVsaXplLCBkZWxheSwgZ2V0Qm90SWRGcm9tVG9rZW4sIGxvZ2dlciwgcHJvY2Vzc1JlYWN0aW9uU3RyaW5nLCB1cmxUb0Jhc2U2NCB9IGZyb20gJ0BkaXNjb3JkZW5vL3V0aWxzJ1xuaW1wb3J0IHsgY3JlYXRlSW52YWxpZFJlcXVlc3RCdWNrZXQgfSBmcm9tICcuL2ludmFsaWRCdWNrZXQuanMnXG5pbXBvcnQgeyBRdWV1ZSB9IGZyb20gJy4vcXVldWUuanMnXG5pbXBvcnQgeyBjcmVhdGVSb3V0ZXMgfSBmcm9tICcuL3JvdXRlcy5qcydcbmltcG9ydCB0eXBlIHsgQ3JlYXRlUmVxdWVzdEJvZHlPcHRpb25zLCBDcmVhdGVSZXN0TWFuYWdlck9wdGlvbnMsIE1ha2VSZXF1ZXN0T3B0aW9ucywgUmVzdE1hbmFnZXIsIFNlbmRSZXF1ZXN0T3B0aW9ucyB9IGZyb20gJy4vdHlwZXMuanMnXG5cbi8vIFRPRE86IG1ha2UgZHluYW1pYyBiYXNlZCBvbiBwYWNrYWdlLmpzb24gZmlsZVxuY29uc3QgdmVyc2lvbiA9ICcxOS4wLjAtYWxwaGEuMSdcblxuZXhwb3J0IGNvbnN0IERJU0NPUkRfQVBJX1ZFUlNJT04gPSAxMFxuZXhwb3J0IGNvbnN0IERJU0NPUkRfQVBJX1VSTCA9ICdodHRwczovL2Rpc2NvcmQuY29tL2FwaSdcblxuZXhwb3J0IGNvbnN0IEFVRElUX0xPR19SRUFTT05fSEVBREVSID0gJ3gtYXVkaXQtbG9nLXJlYXNvbidcbmV4cG9ydCBjb25zdCBSQVRFX0xJTUlUX1JFTUFJTklOR19IRUFERVIgPSAneC1yYXRlbGltaXQtcmVtYWluaW5nJ1xuZXhwb3J0IGNvbnN0IFJBVEVfTElNSVRfUkVTRVRfQUZURVJfSEVBREVSID0gJ3gtcmF0ZWxpbWl0LXJlc2V0LWFmdGVyJ1xuZXhwb3J0IGNvbnN0IFJBVEVfTElNSVRfR0xPQkFMX0hFQURFUiA9ICd4LXJhdGVsaW1pdC1nbG9iYWwnXG5leHBvcnQgY29uc3QgUkFURV9MSU1JVF9CVUNLRVRfSEVBREVSID0gJ3gtcmF0ZWxpbWl0LWJ1Y2tldCdcbmV4cG9ydCBjb25zdCBSQVRFX0xJTUlUX0xJTUlUX0hFQURFUiA9ICd4LXJhdGVsaW1pdC1saW1pdCdcbmV4cG9ydCBjb25zdCBSQVRFX0xJTUlUX1NDT1BFX0hFQURFUiA9ICd4LXJhdGVsaW1pdC1zY29wZSdcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVJlc3RNYW5hZ2VyKG9wdGlvbnM6IENyZWF0ZVJlc3RNYW5hZ2VyT3B0aW9ucyk6IFJlc3RNYW5hZ2VyIHtcbiAgY29uc3QgYXBwbGljYXRpb25JZCA9IG9wdGlvbnMuYXBwbGljYXRpb25JZCA/IEJpZ0ludChvcHRpb25zLmFwcGxpY2F0aW9uSWQpIDogZ2V0Qm90SWRGcm9tVG9rZW4ob3B0aW9ucy50b2tlbilcblxuICBjb25zdCBiYXNlVXJsID0gb3B0aW9ucy5wcm94eT8uYmFzZVVybCA/PyBESVNDT1JEX0FQSV9VUkxcblxuICBjb25zdCByZXN0OiBSZXN0TWFuYWdlciA9IHtcbiAgICBhcHBsaWNhdGlvbklkLFxuICAgIGF1dGhvcml6YXRpb246IG9wdGlvbnMucHJveHk/LmF1dGhvcml6YXRpb24sXG4gICAgYXV0aG9yaXphdGlvbkhlYWRlcjogb3B0aW9ucy5wcm94eT8uYXV0aG9yaXphdGlvbkhlYWRlciA/PyAnYXV0aG9yaXphdGlvbicsXG4gICAgYmFzZVVybCxcbiAgICBkZWxldGVRdWV1ZURlbGF5OiA2MDAwMCxcbiAgICBnbG9iYWxseVJhdGVMaW1pdGVkOiBmYWxzZSxcbiAgICBpbnZhbGlkQnVja2V0OiBjcmVhdGVJbnZhbGlkUmVxdWVzdEJ1Y2tldCh7IGxvZ2dlcjogb3B0aW9ucy5sb2dnZXIgfSksXG4gICAgaXNQcm94aWVkOiAhYmFzZVVybC5zdGFydHNXaXRoKERJU0NPUkRfQVBJX1VSTCksXG4gICAgdXBkYXRlQmVhcmVyVG9rZW5FbmRwb2ludDogb3B0aW9ucy5wcm94eT8udXBkYXRlQmVhcmVyVG9rZW5FbmRwb2ludCxcbiAgICBtYXhSZXRyeUNvdW50OiBJbmZpbml0eSxcbiAgICBwcm9jZXNzaW5nUmF0ZUxpbWl0ZWRQYXRoczogZmFsc2UsXG4gICAgcXVldWVzOiBuZXcgTWFwKCksXG4gICAgcmF0ZUxpbWl0ZWRQYXRoczogbmV3IE1hcCgpLFxuICAgIHRva2VuOiBvcHRpb25zLnRva2VuLFxuICAgIHZlcnNpb246IG9wdGlvbnMudmVyc2lvbiA/PyBESVNDT1JEX0FQSV9WRVJTSU9OLFxuICAgIGxvZ2dlcjogb3B0aW9ucy5sb2dnZXIgPz8gbG9nZ2VyLFxuXG4gICAgcm91dGVzOiBjcmVhdGVSb3V0ZXMoKSxcblxuICAgIGNyZWF0ZUJhc2VIZWFkZXJzKCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgJ3VzZXItYWdlbnQnOiBgRGlzY29yZEJvdCAoaHR0cHM6Ly9naXRodWIuY29tL2Rpc2NvcmRlbm8vZGlzY29yZGVubywgdiR7dmVyc2lvbn0pYCxcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgY2hlY2tSYXRlTGltaXRzKHVybCwgaWRlbnRpZmllcikge1xuICAgICAgY29uc3QgcmF0ZWxpbWl0ZWQgPSByZXN0LnJhdGVMaW1pdGVkUGF0aHMuZ2V0KGAke2lkZW50aWZpZXJ9JHt1cmx9YClcblxuICAgICAgY29uc3QgZ2xvYmFsID0gcmVzdC5yYXRlTGltaXRlZFBhdGhzLmdldCgnZ2xvYmFsJylcbiAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KClcblxuICAgICAgaWYgKHJhdGVsaW1pdGVkICYmIG5vdyA8IHJhdGVsaW1pdGVkLnJlc2V0VGltZXN0YW1wKSB7XG4gICAgICAgIHJldHVybiByYXRlbGltaXRlZC5yZXNldFRpbWVzdGFtcCAtIG5vd1xuICAgICAgfVxuXG4gICAgICBpZiAoZ2xvYmFsICYmIG5vdyA8IGdsb2JhbC5yZXNldFRpbWVzdGFtcCkge1xuICAgICAgICByZXR1cm4gZ2xvYmFsLnJlc2V0VGltZXN0YW1wIC0gbm93XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH0sXG5cbiAgICBhc3luYyB1cGRhdGVUb2tlblF1ZXVlcyhvbGRUb2tlbiwgbmV3VG9rZW4pIHtcbiAgICAgIGlmIChyZXN0LmlzUHJveGllZCkge1xuICAgICAgICBpZiAoIXJlc3QudXBkYXRlQmVhcmVyVG9rZW5FbmRwb2ludCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIFwiVGhlICdwcm94eS51cGRhdGVCZWFyZXJUb2tlbkVuZHBvaW50JyBvcHRpb24gbmVlZHMgdG8gYmUgc2V0IHdoZW4gdXNpbmcgYSByZXN0IHByb3h5IGFuZCBuZWVkZWQgdG8gY2FsbCAndXBkYXRlVG9rZW5RdWV1ZXMnXCIsXG4gICAgICAgICAgKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHtcbiAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICB9IGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz5cblxuICAgICAgICBpZiAocmVzdC5hdXRob3JpemF0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBoZWFkZXJzW3Jlc3QuYXV0aG9yaXphdGlvbkhlYWRlcl0gPSByZXN0LmF1dGhvcml6YXRpb25cbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IGZldGNoKGAke3Jlc3QuYmFzZVVybH0vJHtyZXN0LnVwZGF0ZUJlYXJlclRva2VuRW5kcG9pbnR9YCwge1xuICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgIG9sZFRva2VuLFxuICAgICAgICAgICAgbmV3VG9rZW4sXG4gICAgICAgICAgfSksXG4gICAgICAgICAgaGVhZGVycyxcbiAgICAgICAgfSlcblxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgY29uc3QgbmV3SWRlbnRpZmllciA9IGBCZWFyZXIgJHtuZXdUb2tlbn1gXG5cbiAgICAgIC8vIFVwZGF0ZSBhbGwgdGhlIHF1ZXVlc1xuICAgICAgZm9yIChjb25zdCBba2V5LCBxdWV1ZV0gb2YgcmVzdC5xdWV1ZXMuZW50cmllcygpKSB7XG4gICAgICAgIGlmICgha2V5LnN0YXJ0c1dpdGgoYEJlYXJlciAke29sZFRva2VufWApKSBjb250aW51ZVxuXG4gICAgICAgIHJlc3QucXVldWVzLmRlbGV0ZShrZXkpXG4gICAgICAgIHF1ZXVlLmlkZW50aWZpZXIgPSBuZXdJZGVudGlmaWVyXG5cbiAgICAgICAgY29uc3QgbmV3S2V5ID0gYCR7bmV3SWRlbnRpZmllcn0ke3F1ZXVlLnVybH1gXG4gICAgICAgIGNvbnN0IG5ld1F1ZXVlID0gcmVzdC5xdWV1ZXMuZ2V0KG5ld0tleSlcblxuICAgICAgICAvLyBNZXJnZSB0aGUgcXVldWVzXG4gICAgICAgIGlmIChuZXdRdWV1ZSkge1xuICAgICAgICAgIG5ld1F1ZXVlLndhaXRpbmcudW5zaGlmdCguLi5xdWV1ZS53YWl0aW5nKVxuICAgICAgICAgIG5ld1F1ZXVlLnBlbmRpbmcudW5zaGlmdCguLi5xdWV1ZS5wZW5kaW5nKVxuXG4gICAgICAgICAgcXVldWUud2FpdGluZyA9IFtdXG4gICAgICAgICAgcXVldWUucGVuZGluZyA9IFtdXG5cbiAgICAgICAgICBxdWV1ZS5jbGVhbnVwKClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXN0LnF1ZXVlcy5zZXQobmV3S2V5LCBxdWV1ZSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IFtrZXksIHJhdGVsaW1pdFBhdGhdIG9mIHJlc3QucmF0ZUxpbWl0ZWRQYXRocy5lbnRyaWVzKCkpIHtcbiAgICAgICAgaWYgKCFrZXkuc3RhcnRzV2l0aChgQmVhcmVyICR7b2xkVG9rZW59YCkpIGNvbnRpbnVlXG5cbiAgICAgICAgcmVzdC5yYXRlTGltaXRlZFBhdGhzLnNldChgJHtuZXdJZGVudGlmaWVyfSR7cmF0ZWxpbWl0UGF0aC51cmx9YCwgcmF0ZWxpbWl0UGF0aClcblxuICAgICAgICBpZiAocmF0ZWxpbWl0UGF0aC5idWNrZXRJZCkge1xuICAgICAgICAgIHJlc3QucmF0ZUxpbWl0ZWRQYXRocy5zZXQoYCR7bmV3SWRlbnRpZmllcn0ke3JhdGVsaW1pdFBhdGguYnVja2V0SWR9YCwgcmF0ZWxpbWl0UGF0aClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBjaGFuZ2VUb0Rpc2NvcmRGb3JtYXQob2JqOiBhbnkpOiBhbnkge1xuICAgICAgaWYgKG9iaiA9PT0gbnVsbCkgcmV0dXJuIG51bGxcblxuICAgICAgaWYgKHR5cGVvZiBvYmogPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHtcbiAgICAgICAgICByZXR1cm4gb2JqLm1hcCgoaXRlbSkgPT4gcmVzdC5jaGFuZ2VUb0Rpc2NvcmRGb3JtYXQoaXRlbSkpXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBuZXdPYmo6IGFueSA9IHt9XG5cbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMob2JqKSkge1xuICAgICAgICAgIGNvbnN0IHZhbHVlID0gb2JqW2tleV1cblxuICAgICAgICAgIC8vIElmIHRoZSBrZXkgaXMgYWxyZWFkeSBpbiBzbmFrZV9jYXNlIHdlIGNhbiBhc3N1bWUgaXQgaXMgYWxyZWFkeSBpbiB0aGUgZGlzY29yZCBmb3JtYXQuXG4gICAgICAgICAgaWYgKGtleS5pbmNsdWRlcygnXycpKSB7XG4gICAgICAgICAgICBuZXdPYmpba2V5XSA9IHZhbHVlXG4gICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFNvbWUgZmFsc3kgdmFsdWVzIHNob3VsZCBiZSBhbGxvd2VkIGxpa2UgbnVsbCBvciAwXG4gICAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHN3aXRjaCAoa2V5KSB7XG4gICAgICAgICAgICAgIGNhc2UgJ3Blcm1pc3Npb25zJzpcbiAgICAgICAgICAgICAgY2FzZSAnYWxsb3cnOlxuICAgICAgICAgICAgICBjYXNlICdkZW55JzpcbiAgICAgICAgICAgICAgICBuZXdPYmpba2V5XSA9IHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyB2YWx1ZSA6IGNhbGN1bGF0ZUJpdHModmFsdWUpXG4gICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgICAgY2FzZSAnZGVmYXVsdE1lbWJlclBlcm1pc3Npb25zJzpcbiAgICAgICAgICAgICAgICBuZXdPYmouZGVmYXVsdF9tZW1iZXJfcGVybWlzc2lvbnMgPSB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnID8gdmFsdWUgOiBjYWxjdWxhdGVCaXRzKHZhbHVlKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICAgIGNhc2UgJ25hbWVMb2NhbGl6YXRpb25zJzpcbiAgICAgICAgICAgICAgICBuZXdPYmoubmFtZV9sb2NhbGl6YXRpb25zID0gdmFsdWVcbiAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgICBjYXNlICdkZXNjcmlwdGlvbkxvY2FsaXphdGlvbnMnOlxuICAgICAgICAgICAgICAgIG5ld09iai5kZXNjcmlwdGlvbl9sb2NhbGl6YXRpb25zID0gdmFsdWVcbiAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIG5ld09ialtjYW1lbFRvU25ha2VDYXNlKGtleSldID0gcmVzdC5jaGFuZ2VUb0Rpc2NvcmRGb3JtYXQodmFsdWUpXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3T2JqXG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2Ygb2JqID09PSAnYmlnaW50JykgcmV0dXJuIG9iai50b1N0cmluZygpXG5cbiAgICAgIHJldHVybiBvYmpcbiAgICB9LFxuXG4gICAgY3JlYXRlUmVxdWVzdEJvZHkobWV0aG9kLCBvcHRpb25zKSB7XG4gICAgICBjb25zdCBoZWFkZXJzID0gdGhpcy5jcmVhdGVCYXNlSGVhZGVycygpXG5cbiAgICAgIGlmIChvcHRpb25zPy51bmF1dGhvcml6ZWQgIT09IHRydWUpIGhlYWRlcnMuYXV0aG9yaXphdGlvbiA9IGBCb3QgJHtyZXN0LnRva2VufWBcblxuICAgICAgLy8gSUYgQSBSRUFTT04gSVMgUFJPVklERUQgRU5DT0RFIElUIElOIEhFQURFUlNcbiAgICAgIGlmIChvcHRpb25zPy5yZWFzb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBoZWFkZXJzW0FVRElUX0xPR19SRUFTT05fSEVBREVSXSA9IGVuY29kZVVSSUNvbXBvbmVudChvcHRpb25zPy5yZWFzb24pXG4gICAgICB9XG5cbiAgICAgIGxldCBib2R5OiBzdHJpbmcgfCBGb3JtRGF0YSB8IHVuZGVmaW5lZFxuXG4gICAgICAvLyBUT0RPOiBjaGVjayBpZiB3ZSBuZWVkIHRvIGFkZCBzcGVjaWZpYyBjaGVjayBmb3IgR0VUIG1ldGhvZFxuICAgICAgLy8gU2luY2UgR0VUIGRvZXMgbm90IGFsbG93IGJvZGllc1xuXG4gICAgICAvLyBIYXZlIHRvIGNoZWNrIGZvciBhdHRhY2htZW50cyBmaXJzdCwgc2luY2UgYm9keSB0aGVuIGhhcyB0byBiZSBzZW5kIGluIGEgZGlmZmVyZW50IHdheS5cbiAgICAgIGlmIChvcHRpb25zPy5maWxlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnN0IGZvcm0gPSBuZXcgRm9ybURhdGEoKVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9wdGlvbnMuZmlsZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICBmb3JtLmFwcGVuZChgZmlsZSR7aX1gLCBvcHRpb25zLmZpbGVzW2ldLmJsb2IsIG9wdGlvbnMuZmlsZXNbaV0ubmFtZSlcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEhhdmUgdG8gdXNlIGNoYW5nZVRvRGlzY29yZEZvcm1hdCBvciBlbHNlIEpTT04uc3RyaW5naWZ5IG1heSB0aHJvdyBhbiBlcnJvciBmb3IgdGhlIHByZXNlbmNlIG9mIEJpZ0ludChzKSBpbiB0aGUganNvblxuICAgICAgICBmb3JtLmFwcGVuZCgncGF5bG9hZF9qc29uJywgSlNPTi5zdHJpbmdpZnkocmVzdC5jaGFuZ2VUb0Rpc2NvcmRGb3JtYXQoeyAuLi5vcHRpb25zLmJvZHksIGZpbGVzOiB1bmRlZmluZWQgfSkpKVxuXG4gICAgICAgIC8vIE5vIG5lZWQgdG8gc2V0IHRoZSBgY29udGVudC10eXBlYCBoZWFkZXIgc2luY2UgYGZldGNoYCBkb2VzIHRoYXQgYXV0b21hdGljYWxseSBmb3IgdXMgd2hlbiB3ZSB1c2UgYSBgRm9ybURhdGFgIG9iamVjdC5cbiAgICAgICAgYm9keSA9IGZvcm1cbiAgICAgIH0gZWxzZSBpZiAob3B0aW9ucz8uYm9keSAmJiBvcHRpb25zLmhlYWRlcnMgJiYgb3B0aW9ucy5oZWFkZXJzWydjb250ZW50LXR5cGUnXSA9PT0gJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcpIHtcbiAgICAgICAgLy8gT0F1dGgyIGJvZHkgaGFuZGxpbmdcbiAgICAgICAgY29uc3QgZm9ybUJvZHk6IHN0cmluZ1tdID0gW11cblxuICAgICAgICBjb25zdCBkaXNjb3JkQm9keSA9IHJlc3QuY2hhbmdlVG9EaXNjb3JkRm9ybWF0KG9wdGlvbnMuYm9keSlcblxuICAgICAgICBmb3IgKGNvbnN0IHByb3AgaW4gZGlzY29yZEJvZHkpIHtcbiAgICAgICAgICBmb3JtQm9keS5wdXNoKGAke2VuY29kZVVSSUNvbXBvbmVudChwcm9wKX09JHtlbmNvZGVVUklDb21wb25lbnQoZGlzY29yZEJvZHlbcHJvcF0pfWApXG4gICAgICAgIH1cblxuICAgICAgICBib2R5ID0gZm9ybUJvZHkuam9pbignJicpXG4gICAgICB9IGVsc2UgaWYgKG9wdGlvbnM/LmJvZHkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAob3B0aW9ucy5ib2R5IGluc3RhbmNlb2YgRm9ybURhdGEpIHtcbiAgICAgICAgICBib2R5ID0gb3B0aW9ucy5ib2R5XG4gICAgICAgICAgLy8gTm8gbmVlZCB0byBzZXQgdGhlIGBjb250ZW50LXR5cGVgIGhlYWRlciBzaW5jZSBgZmV0Y2hgIGRvZXMgdGhhdCBhdXRvbWF0aWNhbGx5IGZvciB1cyB3aGVuIHdlIHVzZSBhIGBGb3JtRGF0YWAgb2JqZWN0LlxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGJvZHkgPSBKU09OLnN0cmluZ2lmeShyZXN0LmNoYW5nZVRvRGlzY29yZEZvcm1hdChvcHRpb25zLmJvZHkpKVxuICAgICAgICAgIGhlYWRlcnNbJ2NvbnRlbnQtdHlwZSddID0gYGFwcGxpY2F0aW9uL2pzb25gXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gU09NRVRJTUVTIFNQRUNJQUwgSEVBREVSUyAoRS5HLiBDVVNUT00gQVVUSE9SSVpBVElPTikgTkVFRCBUTyBCRSBVU0VEXG4gICAgICBpZiAob3B0aW9ucz8uaGVhZGVycykge1xuICAgICAgICBPYmplY3QuYXNzaWduKGhlYWRlcnMsIG9wdGlvbnMuaGVhZGVycylcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYm9keSxcbiAgICAgICAgaGVhZGVycyxcbiAgICAgICAgbWV0aG9kLFxuICAgICAgfVxuICAgIH0sXG5cbiAgICBwcm9jZXNzUmF0ZUxpbWl0ZWRQYXRocygpIHtcbiAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KClcblxuICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgcmVzdC5yYXRlTGltaXRlZFBhdGhzLmVudHJpZXMoKSkge1xuICAgICAgICAvLyAgIHJlc3QuZGVidWcoXG4gICAgICAgIC8vIGBbUkVTVCAtIHByb2Nlc3NSYXRlTGltaXRlZFBhdGhzXSBSdW5uaW5nIGZvciBvZiBsb29wLiAke1xuICAgICAgICAvLyAgIHZhbHVlLnJlc2V0VGltZXN0YW1wIC0gbm93XG4gICAgICAgIC8vIH1gXG4gICAgICAgIC8vICAgKVxuICAgICAgICAvLyBJZiB0aGUgdGltZSBoYXMgbm90IHJlYWNoZWQgY2FuY2VsXG4gICAgICAgIGlmICh2YWx1ZS5yZXNldFRpbWVzdGFtcCA+IG5vdykgY29udGludWVcblxuICAgICAgICAvLyBSYXRlIGxpbWl0IGlzIG92ZXIsIGRlbGV0ZSB0aGUgcmF0ZSBsaW1pdGVyXG4gICAgICAgIHJlc3QucmF0ZUxpbWl0ZWRQYXRocy5kZWxldGUoa2V5KVxuICAgICAgICAvLyBJZiBpdCB3YXMgZ2xvYmFsLCBhbHNvIG1hcmsgdGhlIGdsb2JhbCB2YWx1ZSBhcyBmYWxzZVxuICAgICAgICBpZiAoa2V5ID09PSAnZ2xvYmFsJykgcmVzdC5nbG9iYWxseVJhdGVMaW1pdGVkID0gZmFsc2VcbiAgICAgIH1cblxuICAgICAgLy8gQUxMIFBBVEhTIEFSRSBDTEVBUkVEIENBTiBDQU5DRUwgT1VUIVxuICAgICAgaWYgKHJlc3QucmF0ZUxpbWl0ZWRQYXRocy5zaXplID09PSAwKSB7XG4gICAgICAgIHJlc3QucHJvY2Vzc2luZ1JhdGVMaW1pdGVkUGF0aHMgPSBmYWxzZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdC5wcm9jZXNzaW5nUmF0ZUxpbWl0ZWRQYXRocyA9IHRydWVcbiAgICAgICAgLy8gUkVDSEVDSyBJTiAxIFNFQ09ORFxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAvLyByZXN0LmRlYnVnKCdbUkVTVCAtIHByb2Nlc3NSYXRlTGltaXRlZFBhdGhzXSBSdW5uaW5nIHNldFRpbWVvdXQuJylcbiAgICAgICAgICByZXN0LnByb2Nlc3NSYXRlTGltaXRlZFBhdGhzKClcbiAgICAgICAgfSwgMTAwMClcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqIFByb2Nlc3NlcyB0aGUgcmF0ZSBsaW1pdCBoZWFkZXJzIGFuZCBkZXRlcm1pbmVzIGlmIGl0IG5lZWRzIHRvIGJlIHJhdGUgbGltaXRlZCBhbmQgcmV0dXJucyB0aGUgYnVja2V0IGlkIGlmIGF2YWlsYWJsZSAqL1xuICAgIHByb2Nlc3NIZWFkZXJzKHVybCwgaGVhZGVycywgaWRlbnRpZmllcikge1xuICAgICAgbGV0IHJhdGVMaW1pdGVkID0gZmFsc2VcblxuICAgICAgLy8gR0VUIEFMTCBORUNFU1NBUlkgSEVBREVSU1xuICAgICAgY29uc3QgcmVtYWluaW5nID0gaGVhZGVycy5nZXQoUkFURV9MSU1JVF9SRU1BSU5JTkdfSEVBREVSKVxuICAgICAgY29uc3QgcmV0cnlBZnRlciA9IGhlYWRlcnMuZ2V0KFJBVEVfTElNSVRfUkVTRVRfQUZURVJfSEVBREVSKVxuICAgICAgY29uc3QgcmVzZXQgPSBEYXRlLm5vdygpICsgTnVtYmVyKHJldHJ5QWZ0ZXIpICogMTAwMFxuICAgICAgY29uc3QgZ2xvYmFsID0gaGVhZGVycy5nZXQoUkFURV9MSU1JVF9HTE9CQUxfSEVBREVSKVxuICAgICAgLy8gdW5kZWZpbmVkIG92ZXJyaWRlIG51bGwgbmVlZGVkIGZvciB0eXBpbmdzXG4gICAgICBjb25zdCBidWNrZXRJZCA9IGhlYWRlcnMuZ2V0KFJBVEVfTElNSVRfQlVDS0VUX0hFQURFUikgPz8gdW5kZWZpbmVkXG4gICAgICBjb25zdCBsaW1pdCA9IGhlYWRlcnMuZ2V0KFJBVEVfTElNSVRfTElNSVRfSEVBREVSKVxuXG4gICAgICAvLyBJZiB3ZSBkaWRuJ3QgcmVjZWl2ZWQgdGhlIGlkZW50aWZpZXIsIGZhbGxiYWNrIHRvIHRoZSBib3QgdG9rZW5cbiAgICAgIGlkZW50aWZpZXIgPz89IGBCb3QgJHtyZXN0LnRva2VufWBcblxuICAgICAgcmVzdC5xdWV1ZXMuZ2V0KGAke2lkZW50aWZpZXJ9JHt1cmx9YCk/LmhhbmRsZUNvbXBsZXRlZFJlcXVlc3Qoe1xuICAgICAgICByZW1haW5pbmc6IHJlbWFpbmluZyA/IE51bWJlcihyZW1haW5pbmcpIDogdW5kZWZpbmVkLFxuICAgICAgICBpbnRlcnZhbDogcmV0cnlBZnRlciA/IE51bWJlcihyZXRyeUFmdGVyKSAqIDEwMDAgOiB1bmRlZmluZWQsXG4gICAgICAgIG1heDogbGltaXQgPyBOdW1iZXIobGltaXQpIDogdW5kZWZpbmVkLFxuICAgICAgfSlcblxuICAgICAgLy8gSUYgVEhFUkUgSVMgTk8gUkVNQUlOSU5HIFJBVEUgTElNSVQsIE1BUksgSVQgQVMgUkFURSBMSU1JVEVEXG4gICAgICBpZiAocmVtYWluaW5nID09PSAnMCcpIHtcbiAgICAgICAgcmF0ZUxpbWl0ZWQgPSB0cnVlXG5cbiAgICAgICAgLy8gU0FWRSBUSEUgVVJMIEFTIExJTUlURUQsIElNUE9SVEFOVCBGT1IgTkVXIFJFUVVFU1RTIEJZIFVTRVIgV0lUSE9VVCBCVUNLRVRcbiAgICAgICAgcmVzdC5yYXRlTGltaXRlZFBhdGhzLnNldChgJHtpZGVudGlmaWVyfSR7dXJsfWAsIHtcbiAgICAgICAgICB1cmwsXG4gICAgICAgICAgcmVzZXRUaW1lc3RhbXA6IHJlc2V0LFxuICAgICAgICAgIGJ1Y2tldElkLFxuICAgICAgICB9KVxuXG4gICAgICAgIC8vIFNBVkUgVEhFIEJVQ0tFVCBBUyBMSU1JVEVEIFNJTkNFIERJRkZFUkVOVCBVUkxTIE1BWSBTSEFSRSBBIEJVQ0tFVFxuICAgICAgICBpZiAoYnVja2V0SWQpIHtcbiAgICAgICAgICByZXN0LnJhdGVMaW1pdGVkUGF0aHMuc2V0KGAke2lkZW50aWZpZXJ9JHtidWNrZXRJZH1gLCB7XG4gICAgICAgICAgICB1cmwsXG4gICAgICAgICAgICByZXNldFRpbWVzdGFtcDogcmVzZXQsXG4gICAgICAgICAgICBidWNrZXRJZCxcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIElGIFRIRVJFIElTIE5PIFJFTUFJTklORyBHTE9CQUwgTElNSVQsIE1BUksgSVQgUkFURSBMSU1JVEVEIEdMT0JBTExZXG4gICAgICBpZiAoZ2xvYmFsKSB7XG4gICAgICAgIGNvbnN0IHJldHJ5QWZ0ZXIgPSBOdW1iZXIoaGVhZGVycy5nZXQoJ3JldHJ5LWFmdGVyJykpICogMTAwMFxuICAgICAgICBjb25zdCBnbG9iYWxSZXNldCA9IERhdGUubm93KCkgKyByZXRyeUFmdGVyXG4gICAgICAgIC8vICAgcmVzdC5kZWJ1ZyhcbiAgICAgICAgLy8gYFtSRVNUID0gR2xvYmFsbHkgUmF0ZSBMaW1pdGVkXSBVUkw6ICR7dXJsfSB8IEdsb2JhbCBSZXN0OiAke2dsb2JhbFJlc2V0fWBcbiAgICAgICAgLy8gICApXG4gICAgICAgIHJlc3QuZ2xvYmFsbHlSYXRlTGltaXRlZCA9IHRydWVcbiAgICAgICAgcmF0ZUxpbWl0ZWQgPSB0cnVlXG5cbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgcmVzdC5nbG9iYWxseVJhdGVMaW1pdGVkID0gZmFsc2VcbiAgICAgICAgfSwgcmV0cnlBZnRlcilcblxuICAgICAgICByZXN0LnJhdGVMaW1pdGVkUGF0aHMuc2V0KCdnbG9iYWwnLCB7XG4gICAgICAgICAgdXJsOiAnZ2xvYmFsJyxcbiAgICAgICAgICByZXNldFRpbWVzdGFtcDogZ2xvYmFsUmVzZXQsXG4gICAgICAgICAgYnVja2V0SWQsXG4gICAgICAgIH0pXG5cbiAgICAgICAgaWYgKGJ1Y2tldElkKSB7XG4gICAgICAgICAgcmVzdC5yYXRlTGltaXRlZFBhdGhzLnNldChpZGVudGlmaWVyLCB7XG4gICAgICAgICAgICB1cmw6ICdnbG9iYWwnLFxuICAgICAgICAgICAgcmVzZXRUaW1lc3RhbXA6IGdsb2JhbFJlc2V0LFxuICAgICAgICAgICAgYnVja2V0SWQsXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAocmF0ZUxpbWl0ZWQgJiYgIXJlc3QucHJvY2Vzc2luZ1JhdGVMaW1pdGVkUGF0aHMpIHtcbiAgICAgICAgcmVzdC5wcm9jZXNzUmF0ZUxpbWl0ZWRQYXRocygpXG4gICAgICB9XG4gICAgICByZXR1cm4gcmF0ZUxpbWl0ZWQgPyBidWNrZXRJZCA6IHVuZGVmaW5lZFxuICAgIH0sXG5cbiAgICBhc3luYyBzZW5kUmVxdWVzdChvcHRpb25zKSB7XG4gICAgICBjb25zdCB1cmwgPSBgJHtyZXN0LmJhc2VVcmx9L3Yke3Jlc3QudmVyc2lvbn0ke29wdGlvbnMucm91dGV9YFxuICAgICAgY29uc3QgcGF5bG9hZCA9IHJlc3QuY3JlYXRlUmVxdWVzdEJvZHkob3B0aW9ucy5tZXRob2QsIG9wdGlvbnMucmVxdWVzdEJvZHlPcHRpb25zKVxuXG4gICAgICBjb25zdCBsb2dnaW5nSGVhZGVycyA9IHsgLi4ucGF5bG9hZC5oZWFkZXJzIH1cblxuICAgICAgaWYgKHBheWxvYWQuaGVhZGVycy5hdXRob3JpemF0aW9uKSB7XG4gICAgICAgIGNvbnN0IGF1dGhvcml6YXRpb25TY2hlbWUgPSBwYXlsb2FkLmhlYWRlcnMuYXV0aG9yaXphdGlvbj8uc3BsaXQoJyAnKVswXVxuICAgICAgICBsb2dnaW5nSGVhZGVycy5hdXRob3JpemF0aW9uID0gYCR7YXV0aG9yaXphdGlvblNjaGVtZX0gdG9rZW5oZXJlYFxuICAgICAgfVxuXG4gICAgICByZXN0LmxvZ2dlci5kZWJ1Zyhgc2VuZGluZyByZXF1ZXN0IHRvICR7dXJsfWAsICd3aXRoIHBheWxvYWQ6JywgeyAuLi5wYXlsb2FkLCBoZWFkZXJzOiBsb2dnaW5nSGVhZGVycyB9KVxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIHBheWxvYWQpLmNhdGNoKGFzeW5jIChlcnJvcikgPT4ge1xuICAgICAgICByZXN0LmxvZ2dlci5lcnJvcihlcnJvcilcbiAgICAgICAgLy8gTWFyayByZXF1ZXN0IGFuZCBjb21wbGV0ZWRcbiAgICAgICAgcmVzdC5pbnZhbGlkQnVja2V0LmhhbmRsZUNvbXBsZXRlZFJlcXVlc3QoOTk5LCBmYWxzZSlcbiAgICAgICAgb3B0aW9ucy5yZWplY3Qoe1xuICAgICAgICAgIG9rOiBmYWxzZSxcbiAgICAgICAgICBzdGF0dXM6IDk5OSxcbiAgICAgICAgICBlcnJvcjogJ1Bvc3NpYmxlIG5ldHdvcmsgb3IgcmVxdWVzdCBzaGFwZSBpc3N1ZSBvY2N1cnJlZC4gSWYgdGhpcyBpcyByYXJlLCBpdHMgYSBuZXR3b3JrIGdsaXRjaC4gSWYgaXQgb2NjdXJzIGEgbG90IHNvbWV0aGluZyBpcyB3cm9uZy4nLFxuICAgICAgICB9KVxuICAgICAgICB0aHJvdyBlcnJvclxuICAgICAgfSlcbiAgICAgIHJlc3QubG9nZ2VyLmRlYnVnKGByZXF1ZXN0IGZldGNoZWQgZnJvbSAke3VybH0gd2l0aCBzdGF0dXMgJHtyZXNwb25zZS5zdGF0dXN9ICYgJHtyZXNwb25zZS5zdGF0dXNUZXh0fWApXG5cbiAgICAgIC8vIE1hcmsgcmVxdWVzdCBhbmQgY29tcGxldGVkXG4gICAgICByZXN0LmludmFsaWRCdWNrZXQuaGFuZGxlQ29tcGxldGVkUmVxdWVzdChyZXNwb25zZS5zdGF0dXMsIHJlc3BvbnNlLmhlYWRlcnMuZ2V0KFJBVEVfTElNSVRfU0NPUEVfSEVBREVSKSA9PT0gJ3NoYXJlZCcpXG5cbiAgICAgIC8vIFNldCB0aGUgYnVja2V0IGlkIGlmIGl0IHdhcyBhdmFpbGFibGUgb24gdGhlIGhlYWRlcnNcbiAgICAgIGNvbnN0IGJ1Y2tldElkID0gcmVzdC5wcm9jZXNzSGVhZGVycyhyZXN0LnNpbXBsaWZ5VXJsKG9wdGlvbnMucm91dGUsIG9wdGlvbnMubWV0aG9kKSwgcmVzcG9uc2UuaGVhZGVycywgcGF5bG9hZC5oZWFkZXJzLmF1dGhvcml6YXRpb24pXG5cbiAgICAgIGlmIChidWNrZXRJZCkgb3B0aW9ucy5idWNrZXRJZCA9IGJ1Y2tldElkXG5cbiAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPCBIdHRwUmVzcG9uc2VDb2RlLlN1Y2Nlc3MgfHwgcmVzcG9uc2Uuc3RhdHVzID49IEh0dHBSZXNwb25zZUNvZGUuRXJyb3IpIHtcbiAgICAgICAgcmVzdC5sb2dnZXIuZGVidWcoYFJlcXVlc3QgdG8gJHt1cmx9IGZhaWxlZC5gKVxuXG4gICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgIT09IEh0dHBSZXNwb25zZUNvZGUuVG9vTWFueVJlcXVlc3RzKSB7XG4gICAgICAgICAgb3B0aW9ucy5yZWplY3QoeyBvazogZmFsc2UsIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzLCBib2R5OiBhd2FpdCByZXNwb25zZS50ZXh0KCkgfSlcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIHJlc3QubG9nZ2VyLmRlYnVnKGBSZXF1ZXN0IHRvICR7dXJsfSB3YXMgcmF0ZWxpbWl0ZWQuYClcbiAgICAgICAgLy8gVG9vIG1hbnkgYXR0ZW1wdHMsIGdldCByaWQgb2YgcmVxdWVzdCBmcm9tIHF1ZXVlLlxuICAgICAgICBpZiAob3B0aW9ucy5yZXRyeUNvdW50ID49IHJlc3QubWF4UmV0cnlDb3VudCkge1xuICAgICAgICAgIHJlc3QubG9nZ2VyLmRlYnVnKGBSZXF1ZXN0IHRvICR7dXJsfSBleGNlZWRlZCB0aGUgbWF4aW11bSBhbGxvd2VkIHJldHJpZXMuYCwgJ3dpdGggcGF5bG9hZDonLCBwYXlsb2FkKVxuICAgICAgICAgIC8vIHJlc3QuZGVidWcoYFtSRVNUIC0gUmV0cmllc01heGVkXSAke0pTT04uc3RyaW5naWZ5KG9wdGlvbnMpfWApXG4gICAgICAgICAgb3B0aW9ucy5yZWplY3Qoe1xuICAgICAgICAgICAgb2s6IGZhbHNlLFxuICAgICAgICAgICAgc3RhdHVzOiByZXNwb25zZS5zdGF0dXMsXG4gICAgICAgICAgICBlcnJvcjogJ1RoZSByZXF1ZXN0IHdhcyByYXRlIGxpbWl0ZWQgYW5kIGl0IG1heGVkIG91dCB0aGUgcmV0cmllcyBsaW1pdC4nLFxuICAgICAgICAgIH0pXG5cbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIG9wdGlvbnMucmV0cnlDb3VudCArPSAxXG5cbiAgICAgICAgY29uc3QgcmVzZXRBZnRlciA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KFJBVEVfTElNSVRfUkVTRVRfQUZURVJfSEVBREVSKVxuICAgICAgICBpZiAocmVzZXRBZnRlcikgYXdhaXQgZGVsYXkoTnVtYmVyKHJlc2V0QWZ0ZXIpICogMTAwMClcbiAgICAgICAgLy8gcHJvY2VzcyB0aGUgcmVzcG9uc2UgdG8gcHJldmVudCBtZW0gbGVha1xuICAgICAgICBhd2FpdCByZXNwb25zZS5hcnJheUJ1ZmZlcigpXG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IG9wdGlvbnMucmV0cnlSZXF1ZXN0Py4ob3B0aW9ucylcbiAgICAgIH1cblxuICAgICAgLy8gRGlzY29yZCBzb21ldGltZXMgc2VuZHMgbm8gcmVzcG9uc2Ugd2l0aCBubyBjb250ZW50LlxuICAgICAgb3B0aW9ucy5yZXNvbHZlKHsgb2s6IHRydWUsIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzLCBib2R5OiByZXNwb25zZS5zdGF0dXMgPT09IEh0dHBSZXNwb25zZUNvZGUuTm9Db250ZW50ID8gdW5kZWZpbmVkIDogYXdhaXQgcmVzcG9uc2UudGV4dCgpIH0pXG4gICAgfSxcblxuICAgIHNpbXBsaWZ5VXJsKHVybCwgbWV0aG9kKSB7XG4gICAgICBjb25zdCBwYXJ0cyA9IHVybC5zcGxpdCgnLycpXG4gICAgICBjb25zdCBzZWNvbmRMYXN0UGFydCA9IHBhcnRzW3BhcnRzLmxlbmd0aCAtIDJdXG5cbiAgICAgIGlmIChzZWNvbmRMYXN0UGFydCA9PT0gJ2NoYW5uZWxzJyB8fCBzZWNvbmRMYXN0UGFydCA9PT0gJ2d1aWxkcycpIHtcbiAgICAgICAgcmV0dXJuIHVybFxuICAgICAgfVxuXG4gICAgICBpZiAoc2Vjb25kTGFzdFBhcnQgPT09ICdyZWFjdGlvbnMnIHx8IHBhcnRzW3BhcnRzLmxlbmd0aCAtIDFdID09PSAnQG1lJykge1xuICAgICAgICBwYXJ0cy5zcGxpY2UoLTIpXG4gICAgICAgIHBhcnRzLnB1c2goJ3JlYWN0aW9ucycpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwYXJ0cy5zcGxpY2UoLTEpXG4gICAgICAgIHBhcnRzLnB1c2goJ3gnKVxuICAgICAgfVxuXG4gICAgICBpZiAocGFydHNbcGFydHMubGVuZ3RoIC0gM10gPT09ICdyZWFjdGlvbnMnKSB7XG4gICAgICAgIHBhcnRzLnNwbGljZSgtMilcbiAgICAgIH1cblxuICAgICAgaWYgKG1ldGhvZCA9PT0gJ0RFTEVURScgJiYgc2Vjb25kTGFzdFBhcnQgPT09ICdtZXNzYWdlcycpIHtcbiAgICAgICAgcmV0dXJuIGBEJHtwYXJ0cy5qb2luKCcvJyl9YFxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcGFydHMuam9pbignLycpXG4gICAgfSxcblxuICAgIGFzeW5jIHByb2Nlc3NSZXF1ZXN0KHJlcXVlc3Q6IFNlbmRSZXF1ZXN0T3B0aW9ucykge1xuICAgICAgY29uc3QgdXJsID0gcmVzdC5zaW1wbGlmeVVybChyZXF1ZXN0LnJvdXRlLCByZXF1ZXN0Lm1ldGhvZClcblxuICAgICAgaWYgKHJlcXVlc3QucnVuVGhyb3VnaFF1ZXVlID09PSBmYWxzZSkge1xuICAgICAgICBhd2FpdCByZXN0LnNlbmRSZXF1ZXN0KHJlcXVlc3QpXG5cbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIC8vIElmIHdlIHRoZSByZXF1ZXN0IGhhcyBhIHRva2VuLCB1c2UgaXRcbiAgICAgIC8vIEVsc2UgZmFsbGJhY2sgdG8gcHJlZml4IHdpdGggdGhlIGJvdCB0b2tlblxuICAgICAgY29uc3QgcXVldWVJZGVudGlmaWVyID0gcmVxdWVzdC5yZXF1ZXN0Qm9keU9wdGlvbnM/LmhlYWRlcnM/LmF1dGhvcml6YXRpb24gPz8gYEJvdCAke3Jlc3QudG9rZW59YFxuXG4gICAgICBjb25zdCBxdWV1ZSA9IHJlc3QucXVldWVzLmdldChgJHtxdWV1ZUlkZW50aWZpZXJ9JHt1cmx9YClcblxuICAgICAgaWYgKHF1ZXVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcXVldWUubWFrZVJlcXVlc3QocmVxdWVzdClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIENSRUFURVMgQSBORVcgUVVFVUVcbiAgICAgICAgY29uc3QgYnVja2V0UXVldWUgPSBuZXcgUXVldWUocmVzdCwgeyB1cmwsIGRlbGV0ZVF1ZXVlRGVsYXk6IHJlc3QuZGVsZXRlUXVldWVEZWxheSwgaWRlbnRpZmllcjogcXVldWVJZGVudGlmaWVyIH0pXG5cbiAgICAgICAgLy8gU2F2ZSBxdWV1ZVxuICAgICAgICByZXN0LnF1ZXVlcy5zZXQoYCR7cXVldWVJZGVudGlmaWVyfSR7dXJsfWAsIGJ1Y2tldFF1ZXVlKVxuXG4gICAgICAgIC8vIEFkZCByZXF1ZXN0IHRvIHF1ZXVlXG4gICAgICAgIGJ1Y2tldFF1ZXVlLm1ha2VSZXF1ZXN0KHJlcXVlc3QpXG4gICAgICB9XG4gICAgfSxcblxuICAgIGFzeW5jIG1ha2VSZXF1ZXN0KG1ldGhvZCwgcm91dGUsIG9wdGlvbnMpIHtcbiAgICAgIGlmIChyZXN0LmlzUHJveGllZCkge1xuICAgICAgICBpZiAocmVzdC5hdXRob3JpemF0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBvcHRpb25zID8/PSB7fVxuICAgICAgICAgIG9wdGlvbnMuaGVhZGVycyA/Pz0ge31cbiAgICAgICAgICBvcHRpb25zLmhlYWRlcnNbcmVzdC5hdXRob3JpemF0aW9uSGVhZGVyXSA9IHJlc3QuYXV0aG9yaXphdGlvblxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZmV0Y2goYCR7cmVzdC5iYXNlVXJsfS92JHtyZXN0LnZlcnNpb259JHtyb3V0ZX1gLCByZXN0LmNyZWF0ZVJlcXVlc3RCb2R5KG1ldGhvZCwgb3B0aW9ucykpXG5cbiAgICAgICAgaWYgKCFyZXN1bHQub2spIHtcbiAgICAgICAgICBjb25zdCBlcnIgPSAoYXdhaXQgcmVzdWx0Lmpzb24oKS5jYXRjaCgoKSA9PiB7fSkpIGFzIFJlY29yZDxzdHJpbmcsIGFueT5cbiAgICAgICAgICAvLyBMZWdhY3kgSGFuZGxpbmcgdG8gbm90IGJyZWFrIG9sZCBjb2RlIG9yIHdoZW4gYm9keSBpcyBtaXNzaW5nXG4gICAgICAgICAgaWYgKCFlcnI/LmJvZHkpIHRocm93IG5ldyBFcnJvcihgRXJyb3I6ICR7ZXJyLm1lc3NhZ2UgPz8gcmVzdWx0LnN0YXR1c1RleHR9YClcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoSlNPTi5zdHJpbmdpZnkoZXJyKSlcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQuc3RhdHVzICE9PSAyMDQgPyBhd2FpdCByZXN1bHQuanNvbigpIDogdW5kZWZpbmVkXG4gICAgICB9XG5cbiAgICAgIC8vIFRoaXMgZXJyb3IgbmVlZHMgdG8gYmUgY3JlYXRlZCBoZXJlIGJlY2F1c2Ugb2YgaG93IHN0YWNrIHRyYWNlcyBnZXQgY2FsY3VsYXRlZFxuICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoKVxuICAgICAgZXJyb3IubWVzc2FnZSA9ICdGYWlsZWQgdG8gc2VuZCByZXF1ZXN0IHRvIGRpc2NvcmQuJ1xuXG4gICAgICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBjb25zdCBwYXlsb2FkOiBTZW5kUmVxdWVzdE9wdGlvbnMgPSB7XG4gICAgICAgICAgcm91dGUsXG4gICAgICAgICAgbWV0aG9kLFxuICAgICAgICAgIHJlcXVlc3RCb2R5T3B0aW9uczogb3B0aW9ucyxcbiAgICAgICAgICByZXRyeUNvdW50OiAwLFxuICAgICAgICAgIHJldHJ5UmVxdWVzdDogYXN5bmMgKHBheWxvYWQ6IFNlbmRSZXF1ZXN0T3B0aW9ucykgPT4ge1xuICAgICAgICAgICAgYXdhaXQgcmVzdC5wcm9jZXNzUmVxdWVzdChwYXlsb2FkKVxuICAgICAgICAgIH0sXG4gICAgICAgICAgcmVzb2x2ZTogKGRhdGEpID0+IHtcbiAgICAgICAgICAgIHJlc29sdmUoZGF0YS5zdGF0dXMgIT09IDIwNCA/IEpTT04ucGFyc2UoZGF0YS5ib2R5ID8/ICd7fScpIDogdW5kZWZpbmVkKVxuICAgICAgICAgIH0sXG4gICAgICAgICAgcmVqZWN0OiAocmVhc29uKSA9PiB7XG4gICAgICAgICAgICBlcnJvci5jYXVzZSA9IHJlYXNvblxuICAgICAgICAgICAgcmVqZWN0KGVycm9yKVxuICAgICAgICAgIH0sXG4gICAgICAgICAgcnVuVGhyb3VnaFF1ZXVlOiBvcHRpb25zPy5ydW5UaHJvdWdoUXVldWUsXG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCByZXN0LnByb2Nlc3NSZXF1ZXN0KHBheWxvYWQpXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXQ8VCA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+Pih1cmw6IHN0cmluZywgb3B0aW9ucz86IE9taXQ8Q3JlYXRlUmVxdWVzdEJvZHlPcHRpb25zLCAnYm9keScgfCAnbWV0aG9kJz4pIHtcbiAgICAgIHJldHVybiBjYW1lbGl6ZShhd2FpdCByZXN0Lm1ha2VSZXF1ZXN0KCdHRVQnLCB1cmwsIG9wdGlvbnMpKSBhcyBDYW1lbGl6ZTxUPlxuICAgIH0sXG5cbiAgICBhc3luYyBwb3N0PFQgPSBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4odXJsOiBzdHJpbmcsIG9wdGlvbnM/OiBPbWl0PENyZWF0ZVJlcXVlc3RCb2R5T3B0aW9ucywgJ2JvZHknIHwgJ21ldGhvZCc+KSB7XG4gICAgICByZXR1cm4gY2FtZWxpemUoYXdhaXQgcmVzdC5tYWtlUmVxdWVzdCgnUE9TVCcsIHVybCwgb3B0aW9ucykpIGFzIENhbWVsaXplPFQ+XG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZSh1cmw6IHN0cmluZywgb3B0aW9ucz86IE9taXQ8Q3JlYXRlUmVxdWVzdEJvZHlPcHRpb25zLCAnYm9keScgfCAnbWV0aG9kJz4pIHtcbiAgICAgIGNhbWVsaXplKGF3YWl0IHJlc3QubWFrZVJlcXVlc3QoJ0RFTEVURScsIHVybCwgb3B0aW9ucykpXG4gICAgfSxcblxuICAgIGFzeW5jIHBhdGNoPFQgPSBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4odXJsOiBzdHJpbmcsIG9wdGlvbnM/OiBPbWl0PENyZWF0ZVJlcXVlc3RCb2R5T3B0aW9ucywgJ2JvZHknIHwgJ21ldGhvZCc+KSB7XG4gICAgICByZXR1cm4gY2FtZWxpemUoYXdhaXQgcmVzdC5tYWtlUmVxdWVzdCgnUEFUQ0gnLCB1cmwsIG9wdGlvbnMpKSBhcyBDYW1lbGl6ZTxUPlxuICAgIH0sXG5cbiAgICBhc3luYyBwdXQ8VCA9IHZvaWQ+KHVybDogc3RyaW5nLCBvcHRpb25zPzogT21pdDxDcmVhdGVSZXF1ZXN0Qm9keU9wdGlvbnMsICdib2R5JyB8ICdtZXRob2QnPikge1xuICAgICAgcmV0dXJuIGNhbWVsaXplKGF3YWl0IHJlc3QubWFrZVJlcXVlc3QoJ1BVVCcsIHVybCwgb3B0aW9ucykpIGFzIENhbWVsaXplPFQ+XG4gICAgfSxcblxuICAgIGFzeW5jIGFkZFJlYWN0aW9uKGNoYW5uZWxJZCwgbWVzc2FnZUlkLCByZWFjdGlvbikge1xuICAgICAgcmVhY3Rpb24gPSBwcm9jZXNzUmVhY3Rpb25TdHJpbmcocmVhY3Rpb24pXG5cbiAgICAgIGF3YWl0IHJlc3QucHV0KHJlc3Qucm91dGVzLmNoYW5uZWxzLnJlYWN0aW9ucy5ib3QoY2hhbm5lbElkLCBtZXNzYWdlSWQsIHJlYWN0aW9uKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgYWRkUmVhY3Rpb25zKGNoYW5uZWxJZCwgbWVzc2FnZUlkLCByZWFjdGlvbnMsIG9yZGVyZWQgPSBmYWxzZSkge1xuICAgICAgaWYgKCFvcmRlcmVkKSB7XG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICAgIHJlYWN0aW9ucy5tYXAoYXN5bmMgKHJlYWN0aW9uKSA9PiB7XG4gICAgICAgICAgICBhd2FpdCByZXN0LmFkZFJlYWN0aW9uKGNoYW5uZWxJZCwgbWVzc2FnZUlkLCByZWFjdGlvbilcbiAgICAgICAgICB9KSxcbiAgICAgICAgKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCByZWFjdGlvbiBvZiByZWFjdGlvbnMpIHtcbiAgICAgICAgYXdhaXQgcmVzdC5hZGRSZWFjdGlvbihjaGFubmVsSWQsIG1lc3NhZ2VJZCwgcmVhY3Rpb24pXG4gICAgICB9XG4gICAgfSxcblxuICAgIGFzeW5jIGFkZFJvbGUoZ3VpbGRJZCwgdXNlcklkLCByb2xlSWQsIHJlYXNvbikge1xuICAgICAgYXdhaXQgcmVzdC5wdXQocmVzdC5yb3V0ZXMuZ3VpbGRzLnJvbGVzLm1lbWJlcihndWlsZElkLCB1c2VySWQsIHJvbGVJZCksIHsgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGFkZFRocmVhZE1lbWJlcihjaGFubmVsSWQsIHVzZXJJZCkge1xuICAgICAgYXdhaXQgcmVzdC5wdXQocmVzdC5yb3V0ZXMuY2hhbm5lbHMudGhyZWFkcy51c2VyKGNoYW5uZWxJZCwgdXNlcklkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgYWRkRG1SZWNpcGllbnQoY2hhbm5lbElkLCB1c2VySWQsIGJvZHkpIHtcbiAgICAgIGF3YWl0IHJlc3QucHV0KHJlc3Qucm91dGVzLmNoYW5uZWxzLmRtUmVjaXBpZW50KGNoYW5uZWxJZCwgdXNlcklkKSwgeyBib2R5IH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGNyZWF0ZUF1dG9tb2RSdWxlKGd1aWxkSWQsIGJvZHksIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkQXV0b01vZGVyYXRpb25SdWxlPihyZXN0LnJvdXRlcy5ndWlsZHMuYXV0b21vZC5ydWxlcyhndWlsZElkKSwgeyBib2R5LCByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgY3JlYXRlQ2hhbm5lbChndWlsZElkLCBib2R5LCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZENoYW5uZWw+KHJlc3Qucm91dGVzLmd1aWxkcy5jaGFubmVscyhndWlsZElkKSwgeyBib2R5LCByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgY3JlYXRlRW1vamkoZ3VpbGRJZCwgYm9keSwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRFbW9qaT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLmVtb2ppcyhndWlsZElkKSwgeyBib2R5LCByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgY3JlYXRlQXBwbGljYXRpb25FbW9qaShib2R5KSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRFbW9qaT4ocmVzdC5yb3V0ZXMuYXBwbGljYXRpb25FbW9qaXMocmVzdC5hcHBsaWNhdGlvbklkKSwgeyBib2R5IH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGNyZWF0ZUdsb2JhbEFwcGxpY2F0aW9uQ29tbWFuZChib2R5LCBvcHRpb25zKSB7XG4gICAgICBjb25zdCByZXN0T3B0aW9uczogTWFrZVJlcXVlc3RPcHRpb25zID0geyBib2R5IH1cblxuICAgICAgaWYgKG9wdGlvbnM/LmJlYXJlclRva2VuKSB7XG4gICAgICAgIHJlc3RPcHRpb25zLnVuYXV0aG9yaXplZCA9IHRydWVcbiAgICAgICAgcmVzdE9wdGlvbnMuaGVhZGVycyA9IHtcbiAgICAgICAgICBhdXRob3JpemF0aW9uOiBgQmVhcmVyICR7b3B0aW9ucy5iZWFyZXJUb2tlbn1gLFxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZEFwcGxpY2F0aW9uQ29tbWFuZD4ocmVzdC5yb3V0ZXMuaW50ZXJhY3Rpb25zLmNvbW1hbmRzLmNvbW1hbmRzKHJlc3QuYXBwbGljYXRpb25JZCksIHJlc3RPcHRpb25zKVxuICAgIH0sXG5cbiAgICBhc3luYyBjcmVhdGVHdWlsZChib2R5KSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRHdWlsZD4ocmVzdC5yb3V0ZXMuZ3VpbGRzLmFsbCgpLCB7IGJvZHkgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgY3JlYXRlR3VpbGRBcHBsaWNhdGlvbkNvbW1hbmQoYm9keSwgZ3VpbGRJZCwgb3B0aW9ucykge1xuICAgICAgY29uc3QgcmVzdE9wdGlvbnM6IE1ha2VSZXF1ZXN0T3B0aW9ucyA9IHsgYm9keSB9XG5cbiAgICAgIGlmIChvcHRpb25zPy5iZWFyZXJUb2tlbikge1xuICAgICAgICByZXN0T3B0aW9ucy51bmF1dGhvcml6ZWQgPSB0cnVlXG4gICAgICAgIHJlc3RPcHRpb25zLmhlYWRlcnMgPSB7XG4gICAgICAgICAgYXV0aG9yaXphdGlvbjogYEJlYXJlciAke29wdGlvbnMuYmVhcmVyVG9rZW59YCxcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRBcHBsaWNhdGlvbkNvbW1hbmQ+KHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5jb21tYW5kcy5ndWlsZHMuYWxsKHJlc3QuYXBwbGljYXRpb25JZCwgZ3VpbGRJZCksIHJlc3RPcHRpb25zKVxuICAgIH0sXG5cbiAgICBhc3luYyBjcmVhdGVHdWlsZEZyb21UZW1wbGF0ZSh0ZW1wbGF0ZUNvZGUsIGJvZHkpIHtcbiAgICAgIGlmIChib2R5Lmljb24pIHtcbiAgICAgICAgYm9keS5pY29uID0gYXdhaXQgdXJsVG9CYXNlNjQoYm9keS5pY29uKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRHdWlsZD4ocmVzdC5yb3V0ZXMuZ3VpbGRzLnRlbXBsYXRlcy5jb2RlKHRlbXBsYXRlQ29kZSksIHsgYm9keSB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBjcmVhdGVHdWlsZFN0aWNrZXIoZ3VpbGRJZCwgb3B0aW9ucywgcmVhc29uKSB7XG4gICAgICBjb25zdCBmb3JtID0gbmV3IEZvcm1EYXRhKClcbiAgICAgIGZvcm0uYXBwZW5kKCdmaWxlJywgb3B0aW9ucy5maWxlLmJsb2IsIG9wdGlvbnMuZmlsZS5uYW1lKVxuICAgICAgZm9ybS5hcHBlbmQoJ25hbWUnLCBvcHRpb25zLm5hbWUpXG4gICAgICBmb3JtLmFwcGVuZCgnZGVzY3JpcHRpb24nLCBvcHRpb25zLmRlc2NyaXB0aW9uKVxuICAgICAgZm9ybS5hcHBlbmQoJ3RhZ3MnLCBvcHRpb25zLnRhZ3MpXG5cbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZFN0aWNrZXI+KHJlc3Qucm91dGVzLmd1aWxkcy5zdGlja2VycyhndWlsZElkKSwgeyBib2R5OiBmb3JtLCByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgY3JlYXRlR3VpbGRUZW1wbGF0ZShndWlsZElkLCBib2R5KSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRUZW1wbGF0ZT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLnRlbXBsYXRlcy5hbGwoZ3VpbGRJZCksIHsgYm9keSB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBjcmVhdGVGb3J1bVRocmVhZChjaGFubmVsSWQsIGJvZHksIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkQ2hhbm5lbD4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMuZm9ydW0oY2hhbm5lbElkKSwgeyBib2R5LCBmaWxlczogYm9keS5maWxlcywgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGNyZWF0ZUludml0ZShjaGFubmVsSWQsIGJvZHkgPSB7fSwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRJbnZpdGU+KHJlc3Qucm91dGVzLmNoYW5uZWxzLmludml0ZXMoY2hhbm5lbElkKSwgeyBib2R5LCByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgY3JlYXRlUm9sZShndWlsZElkLCBib2R5LCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZFJvbGU+KHJlc3Qucm91dGVzLmd1aWxkcy5yb2xlcy5hbGwoZ3VpbGRJZCksIHsgYm9keSwgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGNyZWF0ZVNjaGVkdWxlZEV2ZW50KGd1aWxkSWQsIGJvZHksIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkU2NoZWR1bGVkRXZlbnQ+KHJlc3Qucm91dGVzLmd1aWxkcy5ldmVudHMuZXZlbnRzKGd1aWxkSWQpLCB7IGJvZHksIHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBjcmVhdGVTdGFnZUluc3RhbmNlKGJvZHksIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkU3RhZ2VJbnN0YW5jZT4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMuc3RhZ2VzKCksIHsgYm9keSwgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGNyZWF0ZVdlYmhvb2soY2hhbm5lbElkLCBvcHRpb25zLCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZFdlYmhvb2s+KHJlc3Qucm91dGVzLmNoYW5uZWxzLndlYmhvb2tzKGNoYW5uZWxJZCksIHtcbiAgICAgICAgYm9keToge1xuICAgICAgICAgIG5hbWU6IG9wdGlvbnMubmFtZSxcbiAgICAgICAgICBhdmF0YXI6IG9wdGlvbnMuYXZhdGFyID8gYXdhaXQgdXJsVG9CYXNlNjQob3B0aW9ucy5hdmF0YXIpIDogdW5kZWZpbmVkLFxuICAgICAgICB9LFxuICAgICAgICByZWFzb24sXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVBdXRvbW9kUnVsZShndWlsZElkLCBydWxlSWQsIHJlYXNvbikge1xuICAgICAgYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuZ3VpbGRzLmF1dG9tb2QucnVsZShndWlsZElkLCBydWxlSWQpLCB7IHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVDaGFubmVsKGNoYW5uZWxJZCwgcmVhc29uKSB7XG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5jaGFubmVscy5jaGFubmVsKGNoYW5uZWxJZCksIHtcbiAgICAgICAgcmVhc29uLFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlQ2hhbm5lbFBlcm1pc3Npb25PdmVycmlkZShjaGFubmVsSWQsIG92ZXJ3cml0ZUlkLCByZWFzb24pIHtcbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmNoYW5uZWxzLm92ZXJ3cml0ZShjaGFubmVsSWQsIG92ZXJ3cml0ZUlkKSwgeyByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlRW1vamkoZ3VpbGRJZCwgaWQsIHJlYXNvbikge1xuICAgICAgYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuZ3VpbGRzLmVtb2ppKGd1aWxkSWQsIGlkKSwgeyByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlQXBwbGljYXRpb25FbW9qaShpZCkge1xuICAgICAgYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuYXBwbGljYXRpb25FbW9qaShyZXN0LmFwcGxpY2F0aW9uSWQsIGlkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlRm9sbG93dXBNZXNzYWdlKHRva2VuLCBtZXNzYWdlSWQpIHtcbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5yZXNwb25zZXMubWVzc2FnZShyZXN0LmFwcGxpY2F0aW9uSWQsIHRva2VuLCBtZXNzYWdlSWQpLCB7IHVuYXV0aG9yaXplZDogdHJ1ZSB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVHbG9iYWxBcHBsaWNhdGlvbkNvbW1hbmQoY29tbWFuZElkKSB7XG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMuY29tbWFuZHMuY29tbWFuZChyZXN0LmFwcGxpY2F0aW9uSWQsIGNvbW1hbmRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZUd1aWxkKGd1aWxkSWQpIHtcbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmd1aWxkcy5ndWlsZChndWlsZElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlR3VpbGRBcHBsaWNhdGlvbkNvbW1hbmQoY29tbWFuZElkLCBndWlsZElkKSB7XG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMuY29tbWFuZHMuZ3VpbGRzLm9uZShyZXN0LmFwcGxpY2F0aW9uSWQsIGd1aWxkSWQsIGNvbW1hbmRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZUd1aWxkU3RpY2tlcihndWlsZElkLCBzdGlja2VySWQsIHJlYXNvbikge1xuICAgICAgYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuZ3VpbGRzLnN0aWNrZXIoZ3VpbGRJZCwgc3RpY2tlcklkKSwgeyByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlR3VpbGRUZW1wbGF0ZShndWlsZElkLCB0ZW1wbGF0ZUNvZGUpIHtcbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmd1aWxkcy50ZW1wbGF0ZXMuZ3VpbGQoZ3VpbGRJZCwgdGVtcGxhdGVDb2RlKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlSW50ZWdyYXRpb24oZ3VpbGRJZCwgaW50ZWdyYXRpb25JZCwgcmVhc29uKSB7XG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5ndWlsZHMuaW50ZWdyYXRpb24oZ3VpbGRJZCwgaW50ZWdyYXRpb25JZCksIHsgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZUludml0ZShpbnZpdGVDb2RlLCByZWFzb24pIHtcbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmd1aWxkcy5pbnZpdGUoaW52aXRlQ29kZSksIHsgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZU1lc3NhZ2UoY2hhbm5lbElkLCBtZXNzYWdlSWQsIHJlYXNvbikge1xuICAgICAgYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuY2hhbm5lbHMubWVzc2FnZShjaGFubmVsSWQsIG1lc3NhZ2VJZCksIHsgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZU1lc3NhZ2VzKGNoYW5uZWxJZCwgbWVzc2FnZUlkcywgcmVhc29uKSB7XG4gICAgICBhd2FpdCByZXN0LnBvc3QocmVzdC5yb3V0ZXMuY2hhbm5lbHMuYnVsayhjaGFubmVsSWQpLCB7XG4gICAgICAgIGJvZHk6IHtcbiAgICAgICAgICBtZXNzYWdlczogbWVzc2FnZUlkcy5zbGljZSgwLCAxMDApLm1hcCgoaWQpID0+IGlkLnRvU3RyaW5nKCkpLFxuICAgICAgICB9LFxuICAgICAgICByZWFzb24sXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVPcmlnaW5hbEludGVyYWN0aW9uUmVzcG9uc2UodG9rZW4pIHtcbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5yZXNwb25zZXMub3JpZ2luYWwocmVzdC5hcHBsaWNhdGlvbklkLCB0b2tlbiksIHsgdW5hdXRob3JpemVkOiB0cnVlIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZU93blJlYWN0aW9uKGNoYW5uZWxJZCwgbWVzc2FnZUlkLCByZWFjdGlvbikge1xuICAgICAgcmVhY3Rpb24gPSBwcm9jZXNzUmVhY3Rpb25TdHJpbmcocmVhY3Rpb24pXG5cbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmNoYW5uZWxzLnJlYWN0aW9ucy5ib3QoY2hhbm5lbElkLCBtZXNzYWdlSWQsIHJlYWN0aW9uKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlUmVhY3Rpb25zQWxsKGNoYW5uZWxJZCwgbWVzc2FnZUlkKSB7XG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5jaGFubmVscy5yZWFjdGlvbnMuYWxsKGNoYW5uZWxJZCwgbWVzc2FnZUlkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlUmVhY3Rpb25zRW1vamkoY2hhbm5lbElkLCBtZXNzYWdlSWQsIHJlYWN0aW9uKSB7XG4gICAgICByZWFjdGlvbiA9IHByb2Nlc3NSZWFjdGlvblN0cmluZyhyZWFjdGlvbilcblxuICAgICAgYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuY2hhbm5lbHMucmVhY3Rpb25zLmVtb2ppKGNoYW5uZWxJZCwgbWVzc2FnZUlkLCByZWFjdGlvbikpXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZVJvbGUoZ3VpbGRJZCwgcm9sZUlkLCByZWFzb24pIHtcbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmd1aWxkcy5yb2xlcy5vbmUoZ3VpbGRJZCwgcm9sZUlkKSwgeyByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlU2NoZWR1bGVkRXZlbnQoZ3VpbGRJZCwgZXZlbnRJZCkge1xuICAgICAgYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuZ3VpbGRzLmV2ZW50cy5ldmVudChndWlsZElkLCBldmVudElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlU3RhZ2VJbnN0YW5jZShjaGFubmVsSWQsIHJlYXNvbikge1xuICAgICAgYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuY2hhbm5lbHMuc3RhZ2UoY2hhbm5lbElkKSwgeyByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlVXNlclJlYWN0aW9uKGNoYW5uZWxJZCwgbWVzc2FnZUlkLCB1c2VySWQsIHJlYWN0aW9uKSB7XG4gICAgICByZWFjdGlvbiA9IHByb2Nlc3NSZWFjdGlvblN0cmluZyhyZWFjdGlvbilcblxuICAgICAgYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuY2hhbm5lbHMucmVhY3Rpb25zLnVzZXIoY2hhbm5lbElkLCBtZXNzYWdlSWQsIHJlYWN0aW9uLCB1c2VySWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVXZWJob29rKHdlYmhvb2tJZCwgcmVhc29uKSB7XG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy53ZWJob29rcy5pZCh3ZWJob29rSWQpLCB7IHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVXZWJob29rTWVzc2FnZSh3ZWJob29rSWQsIHRva2VuLCBtZXNzYWdlSWQsIG9wdGlvbnMpIHtcbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLndlYmhvb2tzLm1lc3NhZ2Uod2ViaG9va0lkLCB0b2tlbiwgbWVzc2FnZUlkLCBvcHRpb25zKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlV2ViaG9va1dpdGhUb2tlbih3ZWJob29rSWQsIHRva2VuKSB7XG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy53ZWJob29rcy53ZWJob29rKHdlYmhvb2tJZCwgdG9rZW4pLCB7XG4gICAgICAgIHVuYXV0aG9yaXplZDogdHJ1ZSxcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRBcHBsaWNhdGlvbkNvbW1hbmRQZXJtaXNzaW9ucyhndWlsZElkLCBjb21tYW5kSWQsIGJlYXJlclRva2VuLCBwZXJtaXNzaW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucHV0PERpc2NvcmRHdWlsZEFwcGxpY2F0aW9uQ29tbWFuZFBlcm1pc3Npb25zPihcbiAgICAgICAgcmVzdC5yb3V0ZXMuaW50ZXJhY3Rpb25zLmNvbW1hbmRzLnBlcm1pc3Npb24ocmVzdC5hcHBsaWNhdGlvbklkLCBndWlsZElkLCBjb21tYW5kSWQpLFxuICAgICAgICB7XG4gICAgICAgICAgYm9keToge1xuICAgICAgICAgICAgcGVybWlzc2lvbnMsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBoZWFkZXJzOiB7IGF1dGhvcml6YXRpb246IGBCZWFyZXIgJHtiZWFyZXJUb2tlbn1gIH0sXG4gICAgICAgIH0sXG4gICAgICApXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRBdXRvbW9kUnVsZShndWlsZElkLCBydWxlSWQsIGJvZHksIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZEF1dG9Nb2RlcmF0aW9uUnVsZT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLmF1dG9tb2QucnVsZShndWlsZElkLCBydWxlSWQpLCB7IGJvZHksIHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0Qm90UHJvZmlsZShvcHRpb25zKSB7XG4gICAgICBjb25zdCBhdmF0YXIgPSBvcHRpb25zPy5ib3RBdmF0YXJVUkwgPyBhd2FpdCB1cmxUb0Jhc2U2NChvcHRpb25zPy5ib3RBdmF0YXJVUkwpIDogb3B0aW9ucz8uYm90QXZhdGFyVVJMXG4gICAgICBjb25zdCBiYW5uZXIgPSBvcHRpb25zPy5ib3RCYW5uZXJVUkwgPyBhd2FpdCB1cmxUb0Jhc2U2NChvcHRpb25zPy5ib3RCYW5uZXJVUkwpIDogb3B0aW9ucz8uYm90QmFubmVyVVJMXG5cbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRVc2VyPihyZXN0LnJvdXRlcy5jdXJyZW50VXNlcigpLCB7XG4gICAgICAgIGJvZHk6IHtcbiAgICAgICAgICB1c2VybmFtZTogb3B0aW9ucy51c2VybmFtZT8udHJpbSgpLFxuICAgICAgICAgIGF2YXRhcixcbiAgICAgICAgICBiYW5uZXIsXG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0Q2hhbm5lbChjaGFubmVsSWQsIGJvZHksIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZENoYW5uZWw+KHJlc3Qucm91dGVzLmNoYW5uZWxzLmNoYW5uZWwoY2hhbm5lbElkKSwgeyBib2R5LCByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdENoYW5uZWxQZXJtaXNzaW9uT3ZlcnJpZGVzKGNoYW5uZWxJZCwgYm9keSwgcmVhc29uKSB7XG4gICAgICBhd2FpdCByZXN0LnB1dChyZXN0LnJvdXRlcy5jaGFubmVscy5vdmVyd3JpdGUoY2hhbm5lbElkLCBib2R5LmlkKSwgeyBib2R5LCByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdENoYW5uZWxQb3NpdGlvbnMoZ3VpbGRJZCwgYm9keSkge1xuICAgICAgYXdhaXQgcmVzdC5wYXRjaChyZXN0LnJvdXRlcy5ndWlsZHMuY2hhbm5lbHMoZ3VpbGRJZCksIHsgYm9keSB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0RW1vamkoZ3VpbGRJZCwgaWQsIGJvZHksIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZEVtb2ppPihyZXN0LnJvdXRlcy5ndWlsZHMuZW1vamkoZ3VpbGRJZCwgaWQpLCB7IGJvZHksIHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0QXBwbGljYXRpb25FbW9qaShpZCwgYm9keSkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZEVtb2ppPihyZXN0LnJvdXRlcy5hcHBsaWNhdGlvbkVtb2ppKHJlc3QuYXBwbGljYXRpb25JZCwgaWQpLCB7IGJvZHkgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdEZvbGxvd3VwTWVzc2FnZSh0b2tlbiwgbWVzc2FnZUlkLCBib2R5KSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkTWVzc2FnZT4ocmVzdC5yb3V0ZXMuaW50ZXJhY3Rpb25zLnJlc3BvbnNlcy5tZXNzYWdlKHJlc3QuYXBwbGljYXRpb25JZCwgdG9rZW4sIG1lc3NhZ2VJZCksIHtcbiAgICAgICAgYm9keSxcbiAgICAgICAgZmlsZXM6IGJvZHkuZmlsZXMsXG4gICAgICAgIHVuYXV0aG9yaXplZDogdHJ1ZSxcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRHbG9iYWxBcHBsaWNhdGlvbkNvbW1hbmQoY29tbWFuZElkLCBib2R5KSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkQXBwbGljYXRpb25Db21tYW5kPihyZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMuY29tbWFuZHMuY29tbWFuZChyZXN0LmFwcGxpY2F0aW9uSWQsIGNvbW1hbmRJZCksIHsgYm9keSB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0R3VpbGQoZ3VpbGRJZCwgYm9keSwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkR3VpbGQ+KHJlc3Qucm91dGVzLmd1aWxkcy5ndWlsZChndWlsZElkKSwgeyBib2R5LCByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdEd1aWxkQXBwbGljYXRpb25Db21tYW5kKGNvbW1hbmRJZCwgZ3VpbGRJZCwgYm9keSkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZEFwcGxpY2F0aW9uQ29tbWFuZD4ocmVzdC5yb3V0ZXMuaW50ZXJhY3Rpb25zLmNvbW1hbmRzLmd1aWxkcy5vbmUocmVzdC5hcHBsaWNhdGlvbklkLCBndWlsZElkLCBjb21tYW5kSWQpLCB7XG4gICAgICAgIGJvZHksXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0R3VpbGRNZmFMZXZlbChndWlsZElkOiBCaWdTdHJpbmcsIG1mYUxldmVsOiBNZmFMZXZlbHMsIHJlYXNvbj86IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgYXdhaXQgcmVzdC5wb3N0KHJlc3Qucm91dGVzLmd1aWxkcy5tZmEoZ3VpbGRJZCksIHsgYm9keTogeyBsZXZlbDogbWZhTGV2ZWwgfSwgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRHdWlsZFN0aWNrZXIoZ3VpbGRJZCwgc3RpY2tlcklkLCBib2R5LCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRTdGlja2VyPihyZXN0LnJvdXRlcy5ndWlsZHMuc3RpY2tlcihndWlsZElkLCBzdGlja2VySWQpLCB7IGJvZHksIHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0R3VpbGRUZW1wbGF0ZShndWlsZElkLCB0ZW1wbGF0ZUNvZGU6IHN0cmluZywgYm9keTogTW9kaWZ5R3VpbGRUZW1wbGF0ZSk6IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZFRlbXBsYXRlPj4ge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZFRlbXBsYXRlPihyZXN0LnJvdXRlcy5ndWlsZHMudGVtcGxhdGVzLmd1aWxkKGd1aWxkSWQsIHRlbXBsYXRlQ29kZSksIHsgYm9keSB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0TWVzc2FnZShjaGFubmVsSWQsIG1lc3NhZ2VJZCwgYm9keSkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZE1lc3NhZ2U+KHJlc3Qucm91dGVzLmNoYW5uZWxzLm1lc3NhZ2UoY2hhbm5lbElkLCBtZXNzYWdlSWQpLCB7IGJvZHksIGZpbGVzOiBib2R5LmZpbGVzIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRPcmlnaW5hbEludGVyYWN0aW9uUmVzcG9uc2UodG9rZW4sIGJvZHkpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRNZXNzYWdlPihyZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMucmVzcG9uc2VzLm9yaWdpbmFsKHJlc3QuYXBwbGljYXRpb25JZCwgdG9rZW4pLCB7XG4gICAgICAgIGJvZHksXG4gICAgICAgIGZpbGVzOiBib2R5LmZpbGVzLFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdE9yaWdpbmFsV2ViaG9va01lc3NhZ2Uod2ViaG9va0lkLCB0b2tlbiwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZE1lc3NhZ2U+KHJlc3Qucm91dGVzLndlYmhvb2tzLm9yaWdpbmFsKHdlYmhvb2tJZCwgdG9rZW4sIG9wdGlvbnMpLCB7XG4gICAgICAgIGJvZHk6IHtcbiAgICAgICAgICB0eXBlOiBJbnRlcmFjdGlvblJlc3BvbnNlVHlwZXMuVXBkYXRlTWVzc2FnZSxcbiAgICAgICAgICBkYXRhOiBvcHRpb25zLFxuICAgICAgICB9LFxuICAgICAgICBmaWxlczogb3B0aW9ucy5maWxlcyxcbiAgICAgICAgdW5hdXRob3JpemVkOiB0cnVlLFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdE93blZvaWNlU3RhdGUoZ3VpbGRJZCwgb3B0aW9ucykge1xuICAgICAgYXdhaXQgcmVzdC5wYXRjaChyZXN0LnJvdXRlcy5ndWlsZHMudm9pY2UoZ3VpbGRJZCksIHtcbiAgICAgICAgYm9keToge1xuICAgICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgICAgcmVxdWVzdFRvU3BlYWtUaW1lc3RhbXA6IG9wdGlvbnMucmVxdWVzdFRvU3BlYWtUaW1lc3RhbXBcbiAgICAgICAgICAgID8gbmV3IERhdGUob3B0aW9ucy5yZXF1ZXN0VG9TcGVha1RpbWVzdGFtcCkudG9JU09TdHJpbmcoKVxuICAgICAgICAgICAgOiBvcHRpb25zLnJlcXVlc3RUb1NwZWFrVGltZXN0YW1wLFxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdFNjaGVkdWxlZEV2ZW50KGd1aWxkSWQsIGV2ZW50SWQsIGJvZHksIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZFNjaGVkdWxlZEV2ZW50PihyZXN0LnJvdXRlcy5ndWlsZHMuZXZlbnRzLmV2ZW50KGd1aWxkSWQsIGV2ZW50SWQpLCB7IGJvZHksIHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0Um9sZShndWlsZElkLCByb2xlSWQsIGJvZHksIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZFJvbGU+KHJlc3Qucm91dGVzLmd1aWxkcy5yb2xlcy5vbmUoZ3VpbGRJZCwgcm9sZUlkKSwgeyBib2R5LCByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdFJvbGVQb3NpdGlvbnMoZ3VpbGRJZCwgYm9keSwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkUm9sZVtdPihyZXN0LnJvdXRlcy5ndWlsZHMucm9sZXMuYWxsKGd1aWxkSWQpLCB7IGJvZHksIHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0U3RhZ2VJbnN0YW5jZShjaGFubmVsSWQsIHRvcGljLCByZWFzb24/OiBzdHJpbmcpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRTdGFnZUluc3RhbmNlPihyZXN0LnJvdXRlcy5jaGFubmVscy5zdGFnZShjaGFubmVsSWQpLCB7IGJvZHk6IHsgdG9waWMgfSwgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRVc2VyVm9pY2VTdGF0ZShndWlsZElkLCBvcHRpb25zKSB7XG4gICAgICBhd2FpdCByZXN0LnBhdGNoKHJlc3Qucm91dGVzLmd1aWxkcy52b2ljZShndWlsZElkLCBvcHRpb25zLnVzZXJJZCksIHsgYm9keTogb3B0aW9ucyB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0V2ViaG9vayh3ZWJob29rSWQsIGJvZHksIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZFdlYmhvb2s+KHJlc3Qucm91dGVzLndlYmhvb2tzLmlkKHdlYmhvb2tJZCksIHsgYm9keSwgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRXZWJob29rTWVzc2FnZSh3ZWJob29rSWQsIHRva2VuLCBtZXNzYWdlSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRNZXNzYWdlPihyZXN0LnJvdXRlcy53ZWJob29rcy5tZXNzYWdlKHdlYmhvb2tJZCwgdG9rZW4sIG1lc3NhZ2VJZCwgb3B0aW9ucyksIHtcbiAgICAgICAgYm9keTogb3B0aW9ucyxcbiAgICAgICAgZmlsZXM6IG9wdGlvbnMuZmlsZXMsXG4gICAgICAgIHVuYXV0aG9yaXplZDogdHJ1ZSxcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRXZWJob29rV2l0aFRva2VuKHdlYmhvb2tJZCwgdG9rZW4sIGJvZHkpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRXZWJob29rPihyZXN0LnJvdXRlcy53ZWJob29rcy53ZWJob29rKHdlYmhvb2tJZCwgdG9rZW4pLCB7XG4gICAgICAgIGJvZHksXG4gICAgICAgIHVuYXV0aG9yaXplZDogdHJ1ZSxcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRXZWxjb21lU2NyZWVuKGd1aWxkSWQsIGJvZHksIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZFdlbGNvbWVTY3JlZW4+KHJlc3Qucm91dGVzLmd1aWxkcy53ZWxjb21lKGd1aWxkSWQpLCB7IGJvZHksIHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0V2lkZ2V0U2V0dGluZ3MoZ3VpbGRJZCwgYm9keSwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkR3VpbGRXaWRnZXRTZXR0aW5ncz4ocmVzdC5yb3V0ZXMuZ3VpbGRzLndpZGdldChndWlsZElkKSwgeyBib2R5LCByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZXhlY3V0ZVdlYmhvb2sod2ViaG9va0lkLCB0b2tlbiwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkTWVzc2FnZT4ocmVzdC5yb3V0ZXMud2ViaG9va3Mud2ViaG9vayh3ZWJob29rSWQsIHRva2VuLCBvcHRpb25zKSwge1xuICAgICAgICBib2R5OiBvcHRpb25zLFxuICAgICAgICB1bmF1dGhvcml6ZWQ6IHRydWUsXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBmb2xsb3dBbm5vdW5jZW1lbnQoc291cmNlQ2hhbm5lbElkLCB0YXJnZXRDaGFubmVsSWQsIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkRm9sbG93ZWRDaGFubmVsPihyZXN0LnJvdXRlcy5jaGFubmVscy5mb2xsb3coc291cmNlQ2hhbm5lbElkKSwge1xuICAgICAgICBib2R5OiB7XG4gICAgICAgICAgd2ViaG9va0NoYW5uZWxJZDogdGFyZ2V0Q2hhbm5lbElkLFxuICAgICAgICB9LFxuICAgICAgICByZWFzb24sXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRBY3RpdmVUaHJlYWRzKGd1aWxkSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkTGlzdEFjdGl2ZVRocmVhZHM+KHJlc3Qucm91dGVzLmNoYW5uZWxzLnRocmVhZHMuYWN0aXZlKGd1aWxkSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRBcHBsaWNhdGlvbkNvbW1hbmRQZXJtaXNzaW9uKGd1aWxkSWQsIGNvbW1hbmRJZCwgb3B0aW9ucykge1xuICAgICAgY29uc3QgcmVzdE9wdGlvbnM6IE9taXQ8TWFrZVJlcXVlc3RPcHRpb25zLCAnYm9keSc+ID0ge31cblxuICAgICAgaWYgKG9wdGlvbnM/LmFjY2Vzc1Rva2VuKSB7XG4gICAgICAgIHJlc3RPcHRpb25zLnVuYXV0aG9yaXplZCA9IHRydWVcbiAgICAgICAgcmVzdE9wdGlvbnMuaGVhZGVycyA9IHtcbiAgICAgICAgICBhdXRob3JpemF0aW9uOiBgQmVhcmVyICR7b3B0aW9ucy5hY2Nlc3NUb2tlbn1gLFxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkR3VpbGRBcHBsaWNhdGlvbkNvbW1hbmRQZXJtaXNzaW9ucz4oXG4gICAgICAgIHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5jb21tYW5kcy5wZXJtaXNzaW9uKG9wdGlvbnM/LmFwcGxpY2F0aW9uSWQgPz8gcmVzdC5hcHBsaWNhdGlvbklkLCBndWlsZElkLCBjb21tYW5kSWQpLFxuICAgICAgICByZXN0T3B0aW9ucyxcbiAgICAgIClcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0QXBwbGljYXRpb25Db21tYW5kUGVybWlzc2lvbnMoZ3VpbGRJZCwgb3B0aW9ucykge1xuICAgICAgY29uc3QgcmVzdE9wdGlvbnM6IE9taXQ8TWFrZVJlcXVlc3RPcHRpb25zLCAnYm9keSc+ID0ge31cblxuICAgICAgaWYgKG9wdGlvbnM/LmFjY2Vzc1Rva2VuKSB7XG4gICAgICAgIHJlc3RPcHRpb25zLnVuYXV0aG9yaXplZCA9IHRydWVcbiAgICAgICAgcmVzdE9wdGlvbnMuaGVhZGVycyA9IHtcbiAgICAgICAgICBhdXRob3JpemF0aW9uOiBgQmVhcmVyICR7b3B0aW9ucy5hY2Nlc3NUb2tlbn1gLFxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkR3VpbGRBcHBsaWNhdGlvbkNvbW1hbmRQZXJtaXNzaW9uc1tdPihcbiAgICAgICAgcmVzdC5yb3V0ZXMuaW50ZXJhY3Rpb25zLmNvbW1hbmRzLnBlcm1pc3Npb25zKG9wdGlvbnM/LmFwcGxpY2F0aW9uSWQgPz8gcmVzdC5hcHBsaWNhdGlvbklkLCBndWlsZElkKSxcbiAgICAgICAgcmVzdE9wdGlvbnMsXG4gICAgICApXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEFwcGxpY2F0aW9uSW5mbygpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkQXBwbGljYXRpb24+KHJlc3Qucm91dGVzLm9hdXRoMi5hcHBsaWNhdGlvbigpKVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0QXBwbGljYXRpb25JbmZvKGJvZHkpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRBcHBsaWNhdGlvbj4ocmVzdC5yb3V0ZXMuYXBwbGljYXRpb24oKSwge1xuICAgICAgICBib2R5LFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0Q3VycmVudEF1dGhlbnRpY2F0aW9uSW5mbyh0b2tlbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRDdXJyZW50QXV0aG9yaXphdGlvbj4ocmVzdC5yb3V0ZXMub2F1dGgyLmN1cnJlbnRBdXRob3JpemF0aW9uKCksIHtcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgIGF1dGhvcml6YXRpb246IGBCZWFyZXIgJHt0b2tlbn1gLFxuICAgICAgICB9LFxuICAgICAgICB1bmF1dGhvcml6ZWQ6IHRydWUsXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBleGNoYW5nZVRva2VuKGNsaWVudElkLCBjbGllbnRTZWNyZXQsIGJvZHkpIHtcbiAgICAgIGNvbnN0IGJhc2ljQ3JlZGVudGlhbHMgPSBCdWZmZXIuZnJvbShgJHtjbGllbnRJZH06JHtjbGllbnRTZWNyZXR9YClcblxuICAgICAgY29uc3QgcmVzdE9wdGlvbnM6IE1ha2VSZXF1ZXN0T3B0aW9ucyA9IHtcbiAgICAgICAgYm9keSxcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJyxcbiAgICAgICAgICBhdXRob3JpemF0aW9uOiBgQmFzaWMgJHtiYXNpY0NyZWRlbnRpYWxzLnRvU3RyaW5nKCdiYXNlNjQnKX1gLFxuICAgICAgICB9LFxuICAgICAgICBydW5UaHJvdWdoUXVldWU6IGZhbHNlLFxuICAgICAgICB1bmF1dGhvcml6ZWQ6IHRydWUsXG4gICAgICB9XG5cbiAgICAgIGlmIChib2R5LmdyYW50VHlwZSA9PT0gJ2NsaWVudF9jcmVkZW50aWFscycpIHtcbiAgICAgICAgcmVzdE9wdGlvbnMuYm9keS5zY29wZSA9IGJvZHkuc2NvcGUuam9pbignICcpXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZEFjY2Vzc1Rva2VuUmVzcG9uc2U+KHJlc3Qucm91dGVzLm9hdXRoMi50b2tlbkV4Y2hhbmdlKCksIHJlc3RPcHRpb25zKVxuICAgIH0sXG5cbiAgICBhc3luYyByZXZva2VUb2tlbihjbGllbnRJZCwgY2xpZW50U2VjcmV0LCBib2R5KSB7XG4gICAgICBjb25zdCBiYXNpY0NyZWRlbnRpYWxzID0gQnVmZmVyLmZyb20oYCR7Y2xpZW50SWR9OiR7Y2xpZW50U2VjcmV0fWApXG5cbiAgICAgIGF3YWl0IHJlc3QucG9zdChyZXN0LnJvdXRlcy5vYXV0aDIudG9rZW5SZXZva2UoKSwge1xuICAgICAgICBib2R5LFxuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnLFxuICAgICAgICAgIGF1dGhvcml6YXRpb246IGBCYXNpYyAke2Jhc2ljQ3JlZGVudGlhbHMudG9TdHJpbmcoJ2Jhc2U2NCcpfWAsXG4gICAgICAgIH0sXG4gICAgICAgIHVuYXV0aG9yaXplZDogdHJ1ZSxcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEF1ZGl0TG9nKGd1aWxkSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkQXVkaXRMb2c+KHJlc3Qucm91dGVzLmd1aWxkcy5hdWRpdGxvZ3MoZ3VpbGRJZCwgb3B0aW9ucykpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEF1dG9tb2RSdWxlKGd1aWxkSWQsIHJ1bGVJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRBdXRvTW9kZXJhdGlvblJ1bGU+KHJlc3Qucm91dGVzLmd1aWxkcy5hdXRvbW9kLnJ1bGUoZ3VpbGRJZCwgcnVsZUlkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0QXV0b21vZFJ1bGVzKGd1aWxkSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkQXV0b01vZGVyYXRpb25SdWxlW10+KHJlc3Qucm91dGVzLmd1aWxkcy5hdXRvbW9kLnJ1bGVzKGd1aWxkSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRBdmFpbGFibGVWb2ljZVJlZ2lvbnMoKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFZvaWNlUmVnaW9uW10+KHJlc3Qucm91dGVzLnJlZ2lvbnMoKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0QmFuKGd1aWxkSWQsIHVzZXJJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRCYW4+KHJlc3Qucm91dGVzLmd1aWxkcy5tZW1iZXJzLmJhbihndWlsZElkLCB1c2VySWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRCYW5zKGd1aWxkSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkQmFuW10+KHJlc3Qucm91dGVzLmd1aWxkcy5tZW1iZXJzLmJhbnMoZ3VpbGRJZCwgb3B0aW9ucykpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldENoYW5uZWwoaWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkQ2hhbm5lbD4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMuY2hhbm5lbChpZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldENoYW5uZWxJbnZpdGVzKGNoYW5uZWxJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRJbnZpdGVNZXRhZGF0YVtdPihyZXN0LnJvdXRlcy5jaGFubmVscy5pbnZpdGVzKGNoYW5uZWxJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldENoYW5uZWxzKGd1aWxkSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkQ2hhbm5lbFtdPihyZXN0LnJvdXRlcy5ndWlsZHMuY2hhbm5lbHMoZ3VpbGRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldENoYW5uZWxXZWJob29rcyhjaGFubmVsSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkV2ViaG9va1tdPihyZXN0LnJvdXRlcy5jaGFubmVscy53ZWJob29rcyhjaGFubmVsSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXREbUNoYW5uZWwodXNlcklkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRDaGFubmVsPihyZXN0LnJvdXRlcy5jaGFubmVscy5kbSgpLCB7XG4gICAgICAgIGJvZHk6IHsgcmVjaXBpZW50SWQ6IHVzZXJJZCB9LFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0R3JvdXBEbUNoYW5uZWwoYm9keSkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkQ2hhbm5lbD4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMuZG0oKSwge1xuICAgICAgICBib2R5LFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0RW1vamkoZ3VpbGRJZCwgZW1vamlJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRFbW9qaT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLmVtb2ppKGd1aWxkSWQsIGVtb2ppSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRBcHBsaWNhdGlvbkVtb2ppKGVtb2ppSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkRW1vamk+KHJlc3Qucm91dGVzLmFwcGxpY2F0aW9uRW1vamkocmVzdC5hcHBsaWNhdGlvbklkLCBlbW9qaUlkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0RW1vamlzKGd1aWxkSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkRW1vamlbXT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLmVtb2ppcyhndWlsZElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0QXBwbGljYXRpb25FbW9qaXMoKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8eyBpdGVtczogRGlzY29yZEVtb2ppW10gfT4ocmVzdC5yb3V0ZXMuYXBwbGljYXRpb25FbW9qaXMocmVzdC5hcHBsaWNhdGlvbklkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0Rm9sbG93dXBNZXNzYWdlKHRva2VuLCBtZXNzYWdlSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkTWVzc2FnZT4ocmVzdC5yb3V0ZXMuaW50ZXJhY3Rpb25zLnJlc3BvbnNlcy5tZXNzYWdlKHJlc3QuYXBwbGljYXRpb25JZCwgdG9rZW4sIG1lc3NhZ2VJZCksIHsgdW5hdXRob3JpemVkOiB0cnVlIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEdhdGV3YXlCb3QoKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEdldEdhdGV3YXlCb3Q+KHJlc3Qucm91dGVzLmdhdGV3YXlCb3QoKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0R2xvYmFsQXBwbGljYXRpb25Db21tYW5kKGNvbW1hbmRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRBcHBsaWNhdGlvbkNvbW1hbmQ+KHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5jb21tYW5kcy5jb21tYW5kKHJlc3QuYXBwbGljYXRpb25JZCwgY29tbWFuZElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0R2xvYmFsQXBwbGljYXRpb25Db21tYW5kcygpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkQXBwbGljYXRpb25Db21tYW5kW10+KHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5jb21tYW5kcy5jb21tYW5kcyhyZXN0LmFwcGxpY2F0aW9uSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRHdWlsZChndWlsZElkLCBvcHRpb25zID0geyBjb3VudHM6IHRydWUgfSkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRHdWlsZD4ocmVzdC5yb3V0ZXMuZ3VpbGRzLmd1aWxkKGd1aWxkSWQsIG9wdGlvbnMuY291bnRzKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0R3VpbGRzKHRva2VuLCBvcHRpb25zKSB7XG4gICAgICBjb25zdCBtYWtlUmVxdWVzdE9wdGlvbnM6IE1ha2VSZXF1ZXN0T3B0aW9ucyB8IHVuZGVmaW5lZCA9IHRva2VuXG4gICAgICAgID8ge1xuICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICBhdXRob3JpemF0aW9uOiBgQmVhcmVyICR7dG9rZW59YCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB1bmF1dGhvcml6ZWQ6IHRydWUsXG4gICAgICAgICAgfVxuICAgICAgICA6IHVuZGVmaW5lZFxuXG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8UGFydGlhbDxEaXNjb3JkR3VpbGQ+W10+KHJlc3Qucm91dGVzLmd1aWxkcy51c2VyR3VpbGRzKG9wdGlvbnMpLCBtYWtlUmVxdWVzdE9wdGlvbnMpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEd1aWxkQXBwbGljYXRpb25Db21tYW5kKGNvbW1hbmRJZCwgZ3VpbGRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRBcHBsaWNhdGlvbkNvbW1hbmQ+KHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5jb21tYW5kcy5ndWlsZHMub25lKHJlc3QuYXBwbGljYXRpb25JZCwgZ3VpbGRJZCwgY29tbWFuZElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0R3VpbGRBcHBsaWNhdGlvbkNvbW1hbmRzKGd1aWxkSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkQXBwbGljYXRpb25Db21tYW5kW10+KHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5jb21tYW5kcy5ndWlsZHMuYWxsKHJlc3QuYXBwbGljYXRpb25JZCwgZ3VpbGRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEd1aWxkUHJldmlldyhndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEd1aWxkUHJldmlldz4ocmVzdC5yb3V0ZXMuZ3VpbGRzLnByZXZpZXcoZ3VpbGRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEd1aWxkVGVtcGxhdGUodGVtcGxhdGVDb2RlKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFRlbXBsYXRlPihyZXN0LnJvdXRlcy5ndWlsZHMudGVtcGxhdGVzLmNvZGUodGVtcGxhdGVDb2RlKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0R3VpbGRUZW1wbGF0ZXMoZ3VpbGRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRUZW1wbGF0ZVtdPihyZXN0LnJvdXRlcy5ndWlsZHMudGVtcGxhdGVzLmFsbChndWlsZElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0R3VpbGRXZWJob29rcyhndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFdlYmhvb2tbXT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLndlYmhvb2tzKGd1aWxkSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRJbnRlZ3JhdGlvbnMoZ3VpbGRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRJbnRlZ3JhdGlvbltdPihyZXN0LnJvdXRlcy5ndWlsZHMuaW50ZWdyYXRpb25zKGd1aWxkSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRJbnZpdGUoaW52aXRlQ29kZSwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRJbnZpdGVNZXRhZGF0YT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLmludml0ZShpbnZpdGVDb2RlLCBvcHRpb25zKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0SW52aXRlcyhndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEludml0ZU1ldGFkYXRhW10+KHJlc3Qucm91dGVzLmd1aWxkcy5pbnZpdGVzKGd1aWxkSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRNZXNzYWdlKGNoYW5uZWxJZCwgbWVzc2FnZUlkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZE1lc3NhZ2U+KHJlc3Qucm91dGVzLmNoYW5uZWxzLm1lc3NhZ2UoY2hhbm5lbElkLCBtZXNzYWdlSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRNZXNzYWdlcyhjaGFubmVsSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkTWVzc2FnZVtdPihyZXN0LnJvdXRlcy5jaGFubmVscy5tZXNzYWdlcyhjaGFubmVsSWQsIG9wdGlvbnMpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRTdGlja2VyUGFjayhzdGlja2VyUGFja0lkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFN0aWNrZXJQYWNrPihyZXN0LnJvdXRlcy5zdGlja2VyUGFjayhzdGlja2VyUGFja0lkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0U3RpY2tlclBhY2tzKCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRTdGlja2VyUGFja1tdPihyZXN0LnJvdXRlcy5zdGlja2VyUGFja3MoKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0T3JpZ2luYWxJbnRlcmFjdGlvblJlc3BvbnNlKHRva2VuKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZE1lc3NhZ2U+KHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5yZXNwb25zZXMub3JpZ2luYWwocmVzdC5hcHBsaWNhdGlvbklkLCB0b2tlbiksIHsgdW5hdXRob3JpemVkOiB0cnVlIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFBpbm5lZE1lc3NhZ2VzKGNoYW5uZWxJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRNZXNzYWdlW10+KHJlc3Qucm91dGVzLmNoYW5uZWxzLnBpbnMoY2hhbm5lbElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0UHJpdmF0ZUFyY2hpdmVkVGhyZWFkcyhjaGFubmVsSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkTGlzdEFyY2hpdmVkVGhyZWFkcz4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMudGhyZWFkcy5wcml2YXRlKGNoYW5uZWxJZCwgb3B0aW9ucykpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFByaXZhdGVKb2luZWRBcmNoaXZlZFRocmVhZHMoY2hhbm5lbElkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZExpc3RBcmNoaXZlZFRocmVhZHM+KHJlc3Qucm91dGVzLmNoYW5uZWxzLnRocmVhZHMuam9pbmVkKGNoYW5uZWxJZCwgb3B0aW9ucykpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFBydW5lQ291bnQoZ3VpbGRJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRQcnVuZWRDb3VudD4ocmVzdC5yb3V0ZXMuZ3VpbGRzLnBydW5lKGd1aWxkSWQsIG9wdGlvbnMpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRQdWJsaWNBcmNoaXZlZFRocmVhZHMoY2hhbm5lbElkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZExpc3RBcmNoaXZlZFRocmVhZHM+KHJlc3Qucm91dGVzLmNoYW5uZWxzLnRocmVhZHMucHVibGljKGNoYW5uZWxJZCwgb3B0aW9ucykpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFJvbGVzKGd1aWxkSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkUm9sZVtdPihyZXN0LnJvdXRlcy5ndWlsZHMucm9sZXMuYWxsKGd1aWxkSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRSb2xlKGd1aWxkSWQsIHJvbGVJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRSb2xlPihyZXN0LnJvdXRlcy5ndWlsZHMucm9sZXMub25lKGd1aWxkSWQsIHJvbGVJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFNjaGVkdWxlZEV2ZW50KGd1aWxkSWQsIGV2ZW50SWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkU2NoZWR1bGVkRXZlbnQ+KHJlc3Qucm91dGVzLmd1aWxkcy5ldmVudHMuZXZlbnQoZ3VpbGRJZCwgZXZlbnRJZCwgb3B0aW9ucz8ud2l0aFVzZXJDb3VudCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFNjaGVkdWxlZEV2ZW50cyhndWlsZElkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFNjaGVkdWxlZEV2ZW50W10+KHJlc3Qucm91dGVzLmd1aWxkcy5ldmVudHMuZXZlbnRzKGd1aWxkSWQsIG9wdGlvbnM/LndpdGhVc2VyQ291bnQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRTY2hlZHVsZWRFdmVudFVzZXJzKGd1aWxkSWQsIGV2ZW50SWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxBcnJheTx7IHVzZXI6IERpc2NvcmRVc2VyOyBtZW1iZXI/OiBEaXNjb3JkTWVtYmVyIH0+PihyZXN0LnJvdXRlcy5ndWlsZHMuZXZlbnRzLnVzZXJzKGd1aWxkSWQsIGV2ZW50SWQsIG9wdGlvbnMpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRTZXNzaW9uSW5mbygpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldEdhdGV3YXlCb3QoKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRTdGFnZUluc3RhbmNlKGNoYW5uZWxJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRTdGFnZUluc3RhbmNlPihyZXN0LnJvdXRlcy5jaGFubmVscy5zdGFnZShjaGFubmVsSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRPd25Wb2ljZVN0YXRlKGd1aWxkSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkVm9pY2VTdGF0ZT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLnZvaWNlKGd1aWxkSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRVc2VyVm9pY2VTdGF0ZShndWlsZElkLCB1c2VySWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkVm9pY2VTdGF0ZT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLnZvaWNlKGd1aWxkSWQsIHVzZXJJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFN0aWNrZXIoc3RpY2tlcklkOiBCaWdTdHJpbmcpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkU3RpY2tlcj4ocmVzdC5yb3V0ZXMuc3RpY2tlcihzdGlja2VySWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRHdWlsZFN0aWNrZXIoZ3VpbGRJZCwgc3RpY2tlcklkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFN0aWNrZXI+KHJlc3Qucm91dGVzLmd1aWxkcy5zdGlja2VyKGd1aWxkSWQsIHN0aWNrZXJJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEd1aWxkU3RpY2tlcnMoZ3VpbGRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRTdGlja2VyW10+KHJlc3Qucm91dGVzLmd1aWxkcy5zdGlja2VycyhndWlsZElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0VGhyZWFkTWVtYmVyKGNoYW5uZWxJZCwgdXNlcklkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFRocmVhZE1lbWJlcj4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMudGhyZWFkcy51c2VyKGNoYW5uZWxJZCwgdXNlcklkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0VGhyZWFkTWVtYmVycyhjaGFubmVsSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkVGhyZWFkTWVtYmVyW10+KHJlc3Qucm91dGVzLmNoYW5uZWxzLnRocmVhZHMubWVtYmVycyhjaGFubmVsSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRSZWFjdGlvbnMoY2hhbm5lbElkLCBtZXNzYWdlSWQsIHJlYWN0aW9uLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFVzZXJbXT4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMucmVhY3Rpb25zLm1lc3NhZ2UoY2hhbm5lbElkLCBtZXNzYWdlSWQsIHJlYWN0aW9uLCBvcHRpb25zKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0VXNlcihpZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRVc2VyPihyZXN0LnJvdXRlcy51c2VyKGlkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0Q3VycmVudFVzZXIodG9rZW4pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkVXNlcj4ocmVzdC5yb3V0ZXMuY3VycmVudFVzZXIoKSwge1xuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgYXV0aG9yaXphdGlvbjogYEJlYXJlciAke3Rva2VufWAsXG4gICAgICAgIH0sXG4gICAgICAgIHVuYXV0aG9yaXplZDogdHJ1ZSxcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFVzZXJDb25uZWN0aW9ucyh0b2tlbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRDb25uZWN0aW9uW10+KHJlc3Qucm91dGVzLm9hdXRoMi5jb25uZWN0aW9ucygpLCB7XG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICBhdXRob3JpemF0aW9uOiBgQmVhcmVyICR7dG9rZW59YCxcbiAgICAgICAgfSxcbiAgICAgICAgdW5hdXRob3JpemVkOiB0cnVlLFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0VXNlckFwcGxpY2F0aW9uUm9sZUNvbm5lY3Rpb24odG9rZW4sIGFwcGxpY2F0aW9uSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkQXBwbGljYXRpb25Sb2xlQ29ubmVjdGlvbj4ocmVzdC5yb3V0ZXMub2F1dGgyLnJvbGVDb25uZWN0aW9ucyhhcHBsaWNhdGlvbklkKSwge1xuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgYXV0aG9yaXphdGlvbjogYEJlYXJlciAke3Rva2VufWAsXG4gICAgICAgIH0sXG4gICAgICAgIHVuYXV0aG9yaXplZDogdHJ1ZSxcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFZhbml0eVVybChndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFZhbml0eVVybD4ocmVzdC5yb3V0ZXMuZ3VpbGRzLnZhbml0eShndWlsZElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0Vm9pY2VSZWdpb25zKGd1aWxkSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkVm9pY2VSZWdpb25bXT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLnJlZ2lvbnMoZ3VpbGRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFdlYmhvb2sod2ViaG9va0lkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFdlYmhvb2s+KHJlc3Qucm91dGVzLndlYmhvb2tzLmlkKHdlYmhvb2tJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFdlYmhvb2tNZXNzYWdlKHdlYmhvb2tJZCwgdG9rZW4sIG1lc3NhZ2VJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRNZXNzYWdlPihyZXN0LnJvdXRlcy53ZWJob29rcy5tZXNzYWdlKHdlYmhvb2tJZCwgdG9rZW4sIG1lc3NhZ2VJZCwgb3B0aW9ucyksIHtcbiAgICAgICAgdW5hdXRob3JpemVkOiB0cnVlLFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0V2ViaG9va1dpdGhUb2tlbih3ZWJob29rSWQsIHRva2VuKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFdlYmhvb2s+KHJlc3Qucm91dGVzLndlYmhvb2tzLndlYmhvb2sod2ViaG9va0lkLCB0b2tlbiksIHtcbiAgICAgICAgdW5hdXRob3JpemVkOiB0cnVlLFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0V2VsY29tZVNjcmVlbihndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFdlbGNvbWVTY3JlZW4+KHJlc3Qucm91dGVzLmd1aWxkcy53ZWxjb21lKGd1aWxkSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRXaWRnZXQoZ3VpbGRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRHdWlsZFdpZGdldD4ocmVzdC5yb3V0ZXMuZ3VpbGRzLndpZGdldEpzb24oZ3VpbGRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFdpZGdldFNldHRpbmdzKGd1aWxkSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkR3VpbGRXaWRnZXRTZXR0aW5ncz4ocmVzdC5yb3V0ZXMuZ3VpbGRzLndpZGdldChndWlsZElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgam9pblRocmVhZChjaGFubmVsSWQpIHtcbiAgICAgIGF3YWl0IHJlc3QucHV0KHJlc3Qucm91dGVzLmNoYW5uZWxzLnRocmVhZHMubWUoY2hhbm5lbElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgbGVhdmVHdWlsZChndWlsZElkKSB7XG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5ndWlsZHMubGVhdmUoZ3VpbGRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGxlYXZlVGhyZWFkKGNoYW5uZWxJZCkge1xuICAgICAgYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuY2hhbm5lbHMudGhyZWFkcy5tZShjaGFubmVsSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBwdWJsaXNoTWVzc2FnZShjaGFubmVsSWQsIG1lc3NhZ2VJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkTWVzc2FnZT4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMuY3Jvc3Nwb3N0KGNoYW5uZWxJZCwgbWVzc2FnZUlkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgcmVtb3ZlUm9sZShndWlsZElkLCB1c2VySWQsIHJvbGVJZCwgcmVhc29uKSB7XG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5ndWlsZHMucm9sZXMubWVtYmVyKGd1aWxkSWQsIHVzZXJJZCwgcm9sZUlkKSwgeyByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgcmVtb3ZlVGhyZWFkTWVtYmVyKGNoYW5uZWxJZCwgdXNlcklkKSB7XG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5jaGFubmVscy50aHJlYWRzLnVzZXIoY2hhbm5lbElkLCB1c2VySWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyByZW1vdmVEbVJlY2lwaWVudChjaGFubmVsSWQsIHVzZXJJZCkge1xuICAgICAgYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuY2hhbm5lbHMuZG1SZWNpcGllbnQoY2hhbm5lbElkLCB1c2VySWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBzZW5kRm9sbG93dXBNZXNzYWdlKHRva2VuLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0KHJlc3Qucm91dGVzLndlYmhvb2tzLndlYmhvb2socmVzdC5hcHBsaWNhdGlvbklkLCB0b2tlbiksIHtcbiAgICAgICAgYm9keTogb3B0aW9ucyxcbiAgICAgICAgZmlsZXM6IG9wdGlvbnMuZmlsZXMsXG4gICAgICAgIHVuYXV0aG9yaXplZDogdHJ1ZSxcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIHNlbmRJbnRlcmFjdGlvblJlc3BvbnNlKGludGVyYWN0aW9uSWQsIHRva2VuLCBvcHRpb25zLCBwYXJhbXMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8dm9pZCB8IERpc2NvcmRJbnRlcmFjdGlvbkNhbGxiYWNrUmVzcG9uc2U+KHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5yZXNwb25zZXMuY2FsbGJhY2soaW50ZXJhY3Rpb25JZCwgdG9rZW4sIHBhcmFtcyksIHtcbiAgICAgICAgYm9keTogb3B0aW9ucyxcbiAgICAgICAgZmlsZXM6IG9wdGlvbnMuZGF0YT8uZmlsZXMsXG4gICAgICAgIHJ1blRocm91Z2hRdWV1ZTogZmFsc2UsXG4gICAgICAgIHVuYXV0aG9yaXplZDogdHJ1ZSxcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIHNlbmRNZXNzYWdlKGNoYW5uZWxJZCwgYm9keSkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkTWVzc2FnZT4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMubWVzc2FnZXMoY2hhbm5lbElkKSwgeyBib2R5LCBmaWxlczogYm9keS5maWxlcyB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBzdGFydFRocmVhZFdpdGhNZXNzYWdlKGNoYW5uZWxJZCwgbWVzc2FnZUlkLCBib2R5LCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZENoYW5uZWw+KHJlc3Qucm91dGVzLmNoYW5uZWxzLnRocmVhZHMubWVzc2FnZShjaGFubmVsSWQsIG1lc3NhZ2VJZCksIHsgYm9keSwgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIHN0YXJ0VGhyZWFkV2l0aG91dE1lc3NhZ2UoY2hhbm5lbElkLCBib2R5LCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZENoYW5uZWw+KHJlc3Qucm91dGVzLmNoYW5uZWxzLnRocmVhZHMuYWxsKGNoYW5uZWxJZCksIHsgYm9keSwgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFBvbGxBbnN3ZXJWb3RlcnMoY2hhbm5lbElkLCBtZXNzYWdlSWQsIGFuc3dlcklkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEdldEFuc3dlclZvdGVzUmVzcG9uc2U+KHJlc3Qucm91dGVzLmNoYW5uZWxzLnBvbGxzLnZvdGVzKGNoYW5uZWxJZCwgbWVzc2FnZUlkLCBhbnN3ZXJJZCwgb3B0aW9ucykpXG4gICAgfSxcblxuICAgIGFzeW5jIGVuZFBvbGwoY2hhbm5lbElkLCBtZXNzYWdlSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZE1lc3NhZ2U+KHJlc3Qucm91dGVzLmNoYW5uZWxzLnBvbGxzLmV4cGlyZShjaGFubmVsSWQsIG1lc3NhZ2VJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIHN5bmNHdWlsZFRlbXBsYXRlKGd1aWxkSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnB1dDxEaXNjb3JkVGVtcGxhdGU+KHJlc3Qucm91dGVzLmd1aWxkcy50ZW1wbGF0ZXMuYWxsKGd1aWxkSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBiYW5NZW1iZXIoZ3VpbGRJZCwgdXNlcklkLCBib2R5LCByZWFzb24pIHtcbiAgICAgIGF3YWl0IHJlc3QucHV0PHZvaWQ+KHJlc3Qucm91dGVzLmd1aWxkcy5tZW1iZXJzLmJhbihndWlsZElkLCB1c2VySWQpLCB7IGJvZHksIHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBidWxrQmFuTWVtYmVycyhndWlsZElkLCBvcHRpb25zLCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZEJ1bGtCYW4+KHJlc3Qucm91dGVzLmd1aWxkcy5tZW1iZXJzLmJ1bGtCYW4oZ3VpbGRJZCksIHsgYm9keTogb3B0aW9ucywgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRCb3RNZW1iZXIoZ3VpbGRJZCwgYm9keSwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkTWVtYmVyPihyZXN0LnJvdXRlcy5ndWlsZHMubWVtYmVycy5ib3QoZ3VpbGRJZCksIHsgYm9keSwgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRNZW1iZXIoZ3VpbGRJZCwgdXNlcklkLCBib2R5LCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRNZW1iZXJXaXRoVXNlcj4ocmVzdC5yb3V0ZXMuZ3VpbGRzLm1lbWJlcnMubWVtYmVyKGd1aWxkSWQsIHVzZXJJZCksIHsgYm9keSwgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGdldE1lbWJlcihndWlsZElkLCB1c2VySWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkTWVtYmVyV2l0aFVzZXI+KHJlc3Qucm91dGVzLmd1aWxkcy5tZW1iZXJzLm1lbWJlcihndWlsZElkLCB1c2VySWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRDdXJyZW50TWVtYmVyKGd1aWxkSWQsIHRva2VuKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZE1lbWJlcldpdGhVc2VyPihyZXN0LnJvdXRlcy5ndWlsZHMubWVtYmVycy5jdXJyZW50TWVtYmVyKGd1aWxkSWQpLCB7XG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICBhdXRob3JpemF0aW9uOiBgQmVhcmVyICR7dG9rZW59YCxcbiAgICAgICAgfSxcbiAgICAgICAgdW5hdXRob3JpemVkOiB0cnVlLFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0TWVtYmVycyhndWlsZElkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZE1lbWJlcldpdGhVc2VyW10+KHJlc3Qucm91dGVzLmd1aWxkcy5tZW1iZXJzLm1lbWJlcnMoZ3VpbGRJZCwgb3B0aW9ucykpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEFwcGxpY2F0aW9uQWN0aXZpdHlJbnN0YW5jZShhcHBsaWNhdGlvbklkLCBpbnN0YW5jZUlkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEFjdGl2aXR5SW5zdGFuY2U+KHJlc3Qucm91dGVzLmFwcGxpY2F0aW9uQWN0aXZpdHlJbnN0YW5jZShhcHBsaWNhdGlvbklkLCBpbnN0YW5jZUlkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMga2lja01lbWJlcihndWlsZElkLCB1c2VySWQsIHJlYXNvbikge1xuICAgICAgYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuZ3VpbGRzLm1lbWJlcnMubWVtYmVyKGd1aWxkSWQsIHVzZXJJZCksIHtcbiAgICAgICAgcmVhc29uLFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgcGluTWVzc2FnZShjaGFubmVsSWQsIG1lc3NhZ2VJZCwgcmVhc29uKSB7XG4gICAgICBhd2FpdCByZXN0LnB1dChyZXN0LnJvdXRlcy5jaGFubmVscy5waW4oY2hhbm5lbElkLCBtZXNzYWdlSWQpLCB7IHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBwcnVuZU1lbWJlcnMoZ3VpbGRJZCwgYm9keSwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PHsgcHJ1bmVkOiBudW1iZXIgfCBudWxsIH0+KHJlc3Qucm91dGVzLmd1aWxkcy5tZW1iZXJzLnBydW5lKGd1aWxkSWQpLCB7IGJvZHksIHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBzZWFyY2hNZW1iZXJzKGd1aWxkSWQsIHF1ZXJ5LCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZE1lbWJlcldpdGhVc2VyW10+KHJlc3Qucm91dGVzLmd1aWxkcy5tZW1iZXJzLnNlYXJjaChndWlsZElkLCBxdWVyeSwgb3B0aW9ucykpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEd1aWxkT25ib2FyZGluZyhndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEd1aWxkT25ib2FyZGluZz4ocmVzdC5yb3V0ZXMuZ3VpbGRzLm9uYm9hcmRpbmcoZ3VpbGRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRHdWlsZE9uYm9hcmRpbmcoZ3VpbGRJZCwgb3B0aW9ucywgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wdXQ8RGlzY29yZEd1aWxkT25ib2FyZGluZz4ocmVzdC5yb3V0ZXMuZ3VpbGRzLm9uYm9hcmRpbmcoZ3VpbGRJZCksIHtcbiAgICAgICAgYm9keTogb3B0aW9ucyxcbiAgICAgICAgcmVhc29uLFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgdW5iYW5NZW1iZXIoZ3VpbGRJZCwgdXNlcklkLCByZWFzb24pIHtcbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmd1aWxkcy5tZW1iZXJzLmJhbihndWlsZElkLCB1c2VySWQpLCB7IHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyB1bnBpbk1lc3NhZ2UoY2hhbm5lbElkLCBtZXNzYWdlSWQsIHJlYXNvbikge1xuICAgICAgYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuY2hhbm5lbHMucGluKGNoYW5uZWxJZCwgbWVzc2FnZUlkKSwgeyByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgdHJpZ2dlclR5cGluZ0luZGljYXRvcihjaGFubmVsSWQpIHtcbiAgICAgIGF3YWl0IHJlc3QucG9zdChyZXN0LnJvdXRlcy5jaGFubmVscy50eXBpbmcoY2hhbm5lbElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgdXBzZXJ0R2xvYmFsQXBwbGljYXRpb25Db21tYW5kcyhib2R5LCBvcHRpb25zKSB7XG4gICAgICBjb25zdCByZXN0T3B0aW9uczogTWFrZVJlcXVlc3RPcHRpb25zID0geyBib2R5IH1cblxuICAgICAgaWYgKG9wdGlvbnM/LmJlYXJlclRva2VuKSB7XG4gICAgICAgIHJlc3RPcHRpb25zLnVuYXV0aG9yaXplZCA9IHRydWVcbiAgICAgICAgcmVzdE9wdGlvbnMuaGVhZGVycyA9IHtcbiAgICAgICAgICBhdXRob3JpemF0aW9uOiBgQmVhcmVyICR7b3B0aW9ucy5iZWFyZXJUb2tlbn1gLFxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnB1dDxEaXNjb3JkQXBwbGljYXRpb25Db21tYW5kW10+KHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5jb21tYW5kcy5jb21tYW5kcyhyZXN0LmFwcGxpY2F0aW9uSWQpLCByZXN0T3B0aW9ucylcbiAgICB9LFxuXG4gICAgYXN5bmMgdXBzZXJ0R3VpbGRBcHBsaWNhdGlvbkNvbW1hbmRzKGd1aWxkSWQsIGJvZHksIG9wdGlvbnMpIHtcbiAgICAgIGNvbnN0IHJlc3RPcHRpb25zOiBNYWtlUmVxdWVzdE9wdGlvbnMgPSB7IGJvZHkgfVxuXG4gICAgICBpZiAob3B0aW9ucz8uYmVhcmVyVG9rZW4pIHtcbiAgICAgICAgcmVzdE9wdGlvbnMudW5hdXRob3JpemVkID0gdHJ1ZVxuICAgICAgICByZXN0T3B0aW9ucy5oZWFkZXJzID0ge1xuICAgICAgICAgIGF1dGhvcml6YXRpb246IGBCZWFyZXIgJHtvcHRpb25zLmJlYXJlclRva2VufWAsXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucHV0PERpc2NvcmRBcHBsaWNhdGlvbkNvbW1hbmRbXT4ocmVzdC5yb3V0ZXMuaW50ZXJhY3Rpb25zLmNvbW1hbmRzLmd1aWxkcy5hbGwocmVzdC5hcHBsaWNhdGlvbklkLCBndWlsZElkKSwgcmVzdE9wdGlvbnMpXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRVc2VyQXBwbGljYXRpb25Sb2xlQ29ubmVjdGlvbih0b2tlbiwgYXBwbGljYXRpb25JZCwgYm9keSkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucHV0PERpc2NvcmRBcHBsaWNhdGlvblJvbGVDb25uZWN0aW9uPihyZXN0LnJvdXRlcy5vYXV0aDIucm9sZUNvbm5lY3Rpb25zKGFwcGxpY2F0aW9uSWQpLCB7XG4gICAgICAgIGJvZHksXG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICBhdXRob3JpemF0aW9uOiBgQmVhcmVyICR7dG9rZW59YCxcbiAgICAgICAgfSxcbiAgICAgICAgdW5hdXRob3JpemVkOiB0cnVlLFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgYWRkR3VpbGRNZW1iZXIoZ3VpbGRJZCwgdXNlcklkLCBib2R5KSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wdXQocmVzdC5yb3V0ZXMuZ3VpbGRzLm1lbWJlcnMubWVtYmVyKGd1aWxkSWQsIHVzZXJJZCksIHtcbiAgICAgICAgYm9keSxcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGNyZWF0ZVRlc3RFbnRpdGxlbWVudChhcHBsaWNhdGlvbklkLCBib2R5KSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRFbnRpdGxlbWVudD4ocmVzdC5yb3V0ZXMubW9uZXRpemF0aW9uLmVudGl0bGVtZW50cyhhcHBsaWNhdGlvbklkKSwge1xuICAgICAgICBib2R5LFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgbGlzdEVudGl0bGVtZW50cyhhcHBsaWNhdGlvbklkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEVudGl0bGVtZW50W10+KHJlc3Qucm91dGVzLm1vbmV0aXphdGlvbi5lbnRpdGxlbWVudHMoYXBwbGljYXRpb25JZCwgb3B0aW9ucykpXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZVRlc3RFbnRpdGxlbWVudChhcHBsaWNhdGlvbklkLCBlbnRpdGxlbWVudElkKSB7XG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5tb25ldGl6YXRpb24uZW50aXRsZW1lbnQoYXBwbGljYXRpb25JZCwgZW50aXRsZW1lbnRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGNvbnN1bWVFbnRpdGxlbWVudChhcHBsaWNhdGlvbklkLCBlbnRpdGxlbWVudElkKSB7XG4gICAgICBhd2FpdCByZXN0LnBvc3QocmVzdC5yb3V0ZXMubW9uZXRpemF0aW9uLmNvbnN1bWVFbnRpdGxlbWVudChhcHBsaWNhdGlvbklkLCBlbnRpdGxlbWVudElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgbGlzdFNrdXMoYXBwbGljYXRpb25JZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRTa3VbXT4ocmVzdC5yb3V0ZXMubW9uZXRpemF0aW9uLnNrdXMoYXBwbGljYXRpb25JZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGxpc3RTdWJzY3JpcHRpb25zKHNrdUlkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFN1YnNjcmlwdGlvbltdPihyZXN0LnJvdXRlcy5tb25ldGl6YXRpb24uc3Vic2NyaXB0aW9ucyhza3VJZCwgb3B0aW9ucykpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFN1YnNjcmlwdGlvbihza3VJZCwgc3Vic2NyaXB0aW9uSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkU3Vic2NyaXB0aW9uPihyZXN0LnJvdXRlcy5tb25ldGl6YXRpb24uc3Vic2NyaXB0aW9uKHNrdUlkLCBzdWJzY3JpcHRpb25JZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIHNlbmRTb3VuZGJvYXJkU291bmQoY2hhbm5lbElkLCBvcHRpb25zKSB7XG4gICAgICBhd2FpdCByZXN0LnBvc3QocmVzdC5yb3V0ZXMuc291bmRib2FyZC5zZW5kU291bmQoY2hhbm5lbElkKSwge1xuICAgICAgICBib2R5OiBvcHRpb25zLFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgbGlzdERlZmF1bHRTb3VuZGJvYXJkU291bmRzKCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRTb3VuZGJvYXJkU291bmRbXT4ocmVzdC5yb3V0ZXMuc291bmRib2FyZC5saXN0RGVmYXVsdCgpKVxuICAgIH0sXG5cbiAgICBhc3luYyBsaXN0R3VpbGRTb3VuZGJvYXJkU291bmRzKGd1aWxkSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDx7IGl0ZW1zOiBEaXNjb3JkU291bmRib2FyZFNvdW5kW10gfT4ocmVzdC5yb3V0ZXMuc291bmRib2FyZC5ndWlsZFNvdW5kcyhndWlsZElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0R3VpbGRTb3VuZGJvYXJkU291bmQoZ3VpbGRJZCwgc291bmRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRTb3VuZGJvYXJkU291bmQ+KHJlc3Qucm91dGVzLnNvdW5kYm9hcmQuZ3VpbGRTb3VuZChndWlsZElkLCBzb3VuZElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgY3JlYXRlR3VpbGRTb3VuZGJvYXJkU291bmQoZ3VpbGRJZCwgb3B0aW9ucywgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRTb3VuZGJvYXJkU291bmQ+KHJlc3Qucm91dGVzLnNvdW5kYm9hcmQuZ3VpbGRTb3VuZHMoZ3VpbGRJZCksIHtcbiAgICAgICAgYm9keTogb3B0aW9ucyxcbiAgICAgICAgcmVhc29uLFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgbW9kaWZ5R3VpbGRTb3VuZGJvYXJkU291bmQoZ3VpbGRJZCwgc291bmRJZCwgb3B0aW9ucywgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRTb3VuZGJvYXJkU291bmQ+KHJlc3Qucm91dGVzLnNvdW5kYm9hcmQuZ3VpbGRTb3VuZChndWlsZElkLCBzb3VuZElkKSwge1xuICAgICAgICBib2R5OiBvcHRpb25zLFxuICAgICAgICByZWFzb24sXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVHdWlsZFNvdW5kYm9hcmRTb3VuZChndWlsZElkLCBzb3VuZElkLCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5zb3VuZGJvYXJkLmd1aWxkU291bmQoZ3VpbGRJZCwgc291bmRJZCksIHtcbiAgICAgICAgcmVhc29uLFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgcHJlZmVyU25ha2VDYXNlKGVuYWJsZWQ6IGJvb2xlYW4pIHtcbiAgICAgIGNvbnN0IGNhbWVsaXplciA9IGVuYWJsZWQgPyAoeDogYW55KSA9PiB4IDogY2FtZWxpemVcblxuICAgICAgcmVzdC5nZXQgPSBhc3luYyAodXJsLCBvcHRpb25zKSA9PiB7XG4gICAgICAgIHJldHVybiBjYW1lbGl6ZXIoYXdhaXQgcmVzdC5tYWtlUmVxdWVzdCgnR0VUJywgdXJsLCBvcHRpb25zKSlcbiAgICAgIH1cblxuICAgICAgcmVzdC5wb3N0ID0gYXN5bmMgKHVybDogc3RyaW5nLCBvcHRpb25zPzogT21pdDxDcmVhdGVSZXF1ZXN0Qm9keU9wdGlvbnMsICdib2R5JyB8ICdtZXRob2QnPikgPT4ge1xuICAgICAgICByZXR1cm4gY2FtZWxpemVyKGF3YWl0IHJlc3QubWFrZVJlcXVlc3QoJ1BPU1QnLCB1cmwsIG9wdGlvbnMpKVxuICAgICAgfVxuXG4gICAgICByZXN0LmRlbGV0ZSA9IGFzeW5jICh1cmw6IHN0cmluZywgb3B0aW9ucz86IE9taXQ8Q3JlYXRlUmVxdWVzdEJvZHlPcHRpb25zLCAnYm9keScgfCAnbWV0aG9kJz4pID0+IHtcbiAgICAgICAgY2FtZWxpemVyKGF3YWl0IHJlc3QubWFrZVJlcXVlc3QoJ0RFTEVURScsIHVybCwgb3B0aW9ucykpXG4gICAgICB9XG5cbiAgICAgIHJlc3QucGF0Y2ggPSBhc3luYyAodXJsOiBzdHJpbmcsIG9wdGlvbnM/OiBPbWl0PENyZWF0ZVJlcXVlc3RCb2R5T3B0aW9ucywgJ2JvZHknIHwgJ21ldGhvZCc+KSA9PiB7XG4gICAgICAgIHJldHVybiBjYW1lbGl6ZXIoYXdhaXQgcmVzdC5tYWtlUmVxdWVzdCgnUEFUQ0gnLCB1cmwsIG9wdGlvbnMpKVxuICAgICAgfVxuXG4gICAgICByZXN0LnB1dCA9IGFzeW5jICh1cmw6IHN0cmluZywgb3B0aW9ucz86IE9taXQ8Q3JlYXRlUmVxdWVzdEJvZHlPcHRpb25zLCAnYm9keScgfCAnbWV0aG9kJz4pID0+IHtcbiAgICAgICAgcmV0dXJuIGNhbWVsaXplcihhd2FpdCByZXN0Lm1ha2VSZXF1ZXN0KCdQVVQnLCB1cmwsIG9wdGlvbnMpKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdFxuICAgIH0sXG4gIH1cblxuICByZXR1cm4gcmVzdFxufVxuXG5lbnVtIEh0dHBSZXNwb25zZUNvZGUge1xuICAvKiogTWluaW11bSB2YWx1ZSBvZiBhIGNvZGUgaW4gb2RlciB0byBjb25zaWRlciB0aGF0IGl0IHdhcyBzdWNjZXNzZnVsLiAqL1xuICBTdWNjZXNzID0gMjAwLFxuICAvKiogUmVxdWVzdCBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LCBidXQgRGlzY29yZCByZXR1cm5lZCBhbiBlbXB0eSBib2R5LiAqL1xuICBOb0NvbnRlbnQgPSAyMDQsXG4gIC8qKiBNaW5pbXVtIHZhbHVlIG9mIGEgY29kZSBpbiBvcmRlciB0byBjb25zaWRlciB0aGF0IHNvbWV0aGluZyB3ZW50IHdyb25nLiAqL1xuICBFcnJvciA9IDQwMCxcbiAgLyoqIFRoaXMgcmVxdWVzdCBnb3QgcmF0ZSBsaW1pdGVkLiAqL1xuICBUb29NYW55UmVxdWVzdHMgPSA0MjksXG59XG4iXSwibmFtZXMiOlsiQnVmZmVyIiwiSW50ZXJhY3Rpb25SZXNwb25zZVR5cGVzIiwiY2FsY3VsYXRlQml0cyIsImNhbWVsVG9TbmFrZUNhc2UiLCJjYW1lbGl6ZSIsImRlbGF5IiwiZ2V0Qm90SWRGcm9tVG9rZW4iLCJsb2dnZXIiLCJwcm9jZXNzUmVhY3Rpb25TdHJpbmciLCJ1cmxUb0Jhc2U2NCIsImNyZWF0ZUludmFsaWRSZXF1ZXN0QnVja2V0IiwiUXVldWUiLCJjcmVhdGVSb3V0ZXMiLCJ2ZXJzaW9uIiwiRElTQ09SRF9BUElfVkVSU0lPTiIsIkRJU0NPUkRfQVBJX1VSTCIsIkFVRElUX0xPR19SRUFTT05fSEVBREVSIiwiUkFURV9MSU1JVF9SRU1BSU5JTkdfSEVBREVSIiwiUkFURV9MSU1JVF9SRVNFVF9BRlRFUl9IRUFERVIiLCJSQVRFX0xJTUlUX0dMT0JBTF9IRUFERVIiLCJSQVRFX0xJTUlUX0JVQ0tFVF9IRUFERVIiLCJSQVRFX0xJTUlUX0xJTUlUX0hFQURFUiIsIlJBVEVfTElNSVRfU0NPUEVfSEVBREVSIiwiY3JlYXRlUmVzdE1hbmFnZXIiLCJvcHRpb25zIiwiYXBwbGljYXRpb25JZCIsIkJpZ0ludCIsInRva2VuIiwiYmFzZVVybCIsInByb3h5IiwicmVzdCIsImF1dGhvcml6YXRpb24iLCJhdXRob3JpemF0aW9uSGVhZGVyIiwiZGVsZXRlUXVldWVEZWxheSIsImdsb2JhbGx5UmF0ZUxpbWl0ZWQiLCJpbnZhbGlkQnVja2V0IiwiaXNQcm94aWVkIiwic3RhcnRzV2l0aCIsInVwZGF0ZUJlYXJlclRva2VuRW5kcG9pbnQiLCJtYXhSZXRyeUNvdW50IiwiSW5maW5pdHkiLCJwcm9jZXNzaW5nUmF0ZUxpbWl0ZWRQYXRocyIsInF1ZXVlcyIsIk1hcCIsInJhdGVMaW1pdGVkUGF0aHMiLCJyb3V0ZXMiLCJjcmVhdGVCYXNlSGVhZGVycyIsImNoZWNrUmF0ZUxpbWl0cyIsInVybCIsImlkZW50aWZpZXIiLCJyYXRlbGltaXRlZCIsImdldCIsImdsb2JhbCIsIm5vdyIsIkRhdGUiLCJyZXNldFRpbWVzdGFtcCIsInVwZGF0ZVRva2VuUXVldWVzIiwib2xkVG9rZW4iLCJuZXdUb2tlbiIsIkVycm9yIiwiaGVhZGVycyIsInVuZGVmaW5lZCIsImZldGNoIiwibWV0aG9kIiwiYm9keSIsIkpTT04iLCJzdHJpbmdpZnkiLCJuZXdJZGVudGlmaWVyIiwia2V5IiwicXVldWUiLCJlbnRyaWVzIiwiZGVsZXRlIiwibmV3S2V5IiwibmV3UXVldWUiLCJ3YWl0aW5nIiwidW5zaGlmdCIsInBlbmRpbmciLCJjbGVhbnVwIiwic2V0IiwicmF0ZWxpbWl0UGF0aCIsImJ1Y2tldElkIiwiY2hhbmdlVG9EaXNjb3JkRm9ybWF0Iiwib2JqIiwiQXJyYXkiLCJpc0FycmF5IiwibWFwIiwiaXRlbSIsIm5ld09iaiIsIk9iamVjdCIsImtleXMiLCJ2YWx1ZSIsImluY2x1ZGVzIiwiZGVmYXVsdF9tZW1iZXJfcGVybWlzc2lvbnMiLCJuYW1lX2xvY2FsaXphdGlvbnMiLCJkZXNjcmlwdGlvbl9sb2NhbGl6YXRpb25zIiwidG9TdHJpbmciLCJjcmVhdGVSZXF1ZXN0Qm9keSIsInVuYXV0aG9yaXplZCIsInJlYXNvbiIsImVuY29kZVVSSUNvbXBvbmVudCIsImZpbGVzIiwiZm9ybSIsIkZvcm1EYXRhIiwiaSIsImxlbmd0aCIsImFwcGVuZCIsImJsb2IiLCJuYW1lIiwiZm9ybUJvZHkiLCJkaXNjb3JkQm9keSIsInByb3AiLCJwdXNoIiwiam9pbiIsImFzc2lnbiIsInByb2Nlc3NSYXRlTGltaXRlZFBhdGhzIiwic2l6ZSIsInNldFRpbWVvdXQiLCJwcm9jZXNzSGVhZGVycyIsInJhdGVMaW1pdGVkIiwicmVtYWluaW5nIiwicmV0cnlBZnRlciIsInJlc2V0IiwiTnVtYmVyIiwibGltaXQiLCJoYW5kbGVDb21wbGV0ZWRSZXF1ZXN0IiwiaW50ZXJ2YWwiLCJtYXgiLCJnbG9iYWxSZXNldCIsInNlbmRSZXF1ZXN0Iiwicm91dGUiLCJwYXlsb2FkIiwicmVxdWVzdEJvZHlPcHRpb25zIiwibG9nZ2luZ0hlYWRlcnMiLCJhdXRob3JpemF0aW9uU2NoZW1lIiwic3BsaXQiLCJkZWJ1ZyIsInJlc3BvbnNlIiwiY2F0Y2giLCJlcnJvciIsInJlamVjdCIsIm9rIiwic3RhdHVzIiwic3RhdHVzVGV4dCIsInNpbXBsaWZ5VXJsIiwidGV4dCIsInJldHJ5Q291bnQiLCJyZXNldEFmdGVyIiwiYXJyYXlCdWZmZXIiLCJyZXRyeVJlcXVlc3QiLCJyZXNvbHZlIiwicGFydHMiLCJzZWNvbmRMYXN0UGFydCIsInNwbGljZSIsInByb2Nlc3NSZXF1ZXN0IiwicmVxdWVzdCIsInJ1blRocm91Z2hRdWV1ZSIsInF1ZXVlSWRlbnRpZmllciIsIm1ha2VSZXF1ZXN0IiwiYnVja2V0UXVldWUiLCJyZXN1bHQiLCJlcnIiLCJqc29uIiwibWVzc2FnZSIsIlByb21pc2UiLCJkYXRhIiwicGFyc2UiLCJjYXVzZSIsInBvc3QiLCJwYXRjaCIsInB1dCIsImFkZFJlYWN0aW9uIiwiY2hhbm5lbElkIiwibWVzc2FnZUlkIiwicmVhY3Rpb24iLCJjaGFubmVscyIsInJlYWN0aW9ucyIsImJvdCIsImFkZFJlYWN0aW9ucyIsIm9yZGVyZWQiLCJhbGwiLCJhZGRSb2xlIiwiZ3VpbGRJZCIsInVzZXJJZCIsInJvbGVJZCIsImd1aWxkcyIsInJvbGVzIiwibWVtYmVyIiwiYWRkVGhyZWFkTWVtYmVyIiwidGhyZWFkcyIsInVzZXIiLCJhZGREbVJlY2lwaWVudCIsImRtUmVjaXBpZW50IiwiY3JlYXRlQXV0b21vZFJ1bGUiLCJhdXRvbW9kIiwicnVsZXMiLCJjcmVhdGVDaGFubmVsIiwiY3JlYXRlRW1vamkiLCJlbW9qaXMiLCJjcmVhdGVBcHBsaWNhdGlvbkVtb2ppIiwiYXBwbGljYXRpb25FbW9qaXMiLCJjcmVhdGVHbG9iYWxBcHBsaWNhdGlvbkNvbW1hbmQiLCJyZXN0T3B0aW9ucyIsImJlYXJlclRva2VuIiwiaW50ZXJhY3Rpb25zIiwiY29tbWFuZHMiLCJjcmVhdGVHdWlsZCIsImNyZWF0ZUd1aWxkQXBwbGljYXRpb25Db21tYW5kIiwiY3JlYXRlR3VpbGRGcm9tVGVtcGxhdGUiLCJ0ZW1wbGF0ZUNvZGUiLCJpY29uIiwidGVtcGxhdGVzIiwiY29kZSIsImNyZWF0ZUd1aWxkU3RpY2tlciIsImZpbGUiLCJkZXNjcmlwdGlvbiIsInRhZ3MiLCJzdGlja2VycyIsImNyZWF0ZUd1aWxkVGVtcGxhdGUiLCJjcmVhdGVGb3J1bVRocmVhZCIsImZvcnVtIiwiY3JlYXRlSW52aXRlIiwiaW52aXRlcyIsImNyZWF0ZVJvbGUiLCJjcmVhdGVTY2hlZHVsZWRFdmVudCIsImV2ZW50cyIsImNyZWF0ZVN0YWdlSW5zdGFuY2UiLCJzdGFnZXMiLCJjcmVhdGVXZWJob29rIiwid2ViaG9va3MiLCJhdmF0YXIiLCJkZWxldGVBdXRvbW9kUnVsZSIsInJ1bGVJZCIsInJ1bGUiLCJkZWxldGVDaGFubmVsIiwiY2hhbm5lbCIsImRlbGV0ZUNoYW5uZWxQZXJtaXNzaW9uT3ZlcnJpZGUiLCJvdmVyd3JpdGVJZCIsIm92ZXJ3cml0ZSIsImRlbGV0ZUVtb2ppIiwiaWQiLCJlbW9qaSIsImRlbGV0ZUFwcGxpY2F0aW9uRW1vamkiLCJhcHBsaWNhdGlvbkVtb2ppIiwiZGVsZXRlRm9sbG93dXBNZXNzYWdlIiwicmVzcG9uc2VzIiwiZGVsZXRlR2xvYmFsQXBwbGljYXRpb25Db21tYW5kIiwiY29tbWFuZElkIiwiY29tbWFuZCIsImRlbGV0ZUd1aWxkIiwiZ3VpbGQiLCJkZWxldGVHdWlsZEFwcGxpY2F0aW9uQ29tbWFuZCIsIm9uZSIsImRlbGV0ZUd1aWxkU3RpY2tlciIsInN0aWNrZXJJZCIsInN0aWNrZXIiLCJkZWxldGVHdWlsZFRlbXBsYXRlIiwiZGVsZXRlSW50ZWdyYXRpb24iLCJpbnRlZ3JhdGlvbklkIiwiaW50ZWdyYXRpb24iLCJkZWxldGVJbnZpdGUiLCJpbnZpdGVDb2RlIiwiaW52aXRlIiwiZGVsZXRlTWVzc2FnZSIsImRlbGV0ZU1lc3NhZ2VzIiwibWVzc2FnZUlkcyIsImJ1bGsiLCJtZXNzYWdlcyIsInNsaWNlIiwiZGVsZXRlT3JpZ2luYWxJbnRlcmFjdGlvblJlc3BvbnNlIiwib3JpZ2luYWwiLCJkZWxldGVPd25SZWFjdGlvbiIsImRlbGV0ZVJlYWN0aW9uc0FsbCIsImRlbGV0ZVJlYWN0aW9uc0Vtb2ppIiwiZGVsZXRlUm9sZSIsImRlbGV0ZVNjaGVkdWxlZEV2ZW50IiwiZXZlbnRJZCIsImV2ZW50IiwiZGVsZXRlU3RhZ2VJbnN0YW5jZSIsInN0YWdlIiwiZGVsZXRlVXNlclJlYWN0aW9uIiwiZGVsZXRlV2ViaG9vayIsIndlYmhvb2tJZCIsImRlbGV0ZVdlYmhvb2tNZXNzYWdlIiwiZGVsZXRlV2ViaG9va1dpdGhUb2tlbiIsIndlYmhvb2siLCJlZGl0QXBwbGljYXRpb25Db21tYW5kUGVybWlzc2lvbnMiLCJwZXJtaXNzaW9ucyIsInBlcm1pc3Npb24iLCJlZGl0QXV0b21vZFJ1bGUiLCJlZGl0Qm90UHJvZmlsZSIsImJvdEF2YXRhclVSTCIsImJhbm5lciIsImJvdEJhbm5lclVSTCIsImN1cnJlbnRVc2VyIiwidXNlcm5hbWUiLCJ0cmltIiwiZWRpdENoYW5uZWwiLCJlZGl0Q2hhbm5lbFBlcm1pc3Npb25PdmVycmlkZXMiLCJlZGl0Q2hhbm5lbFBvc2l0aW9ucyIsImVkaXRFbW9qaSIsImVkaXRBcHBsaWNhdGlvbkVtb2ppIiwiZWRpdEZvbGxvd3VwTWVzc2FnZSIsImVkaXRHbG9iYWxBcHBsaWNhdGlvbkNvbW1hbmQiLCJlZGl0R3VpbGQiLCJlZGl0R3VpbGRBcHBsaWNhdGlvbkNvbW1hbmQiLCJlZGl0R3VpbGRNZmFMZXZlbCIsIm1mYUxldmVsIiwibWZhIiwibGV2ZWwiLCJlZGl0R3VpbGRTdGlja2VyIiwiZWRpdEd1aWxkVGVtcGxhdGUiLCJlZGl0TWVzc2FnZSIsImVkaXRPcmlnaW5hbEludGVyYWN0aW9uUmVzcG9uc2UiLCJlZGl0T3JpZ2luYWxXZWJob29rTWVzc2FnZSIsInR5cGUiLCJVcGRhdGVNZXNzYWdlIiwiZWRpdE93blZvaWNlU3RhdGUiLCJ2b2ljZSIsInJlcXVlc3RUb1NwZWFrVGltZXN0YW1wIiwidG9JU09TdHJpbmciLCJlZGl0U2NoZWR1bGVkRXZlbnQiLCJlZGl0Um9sZSIsImVkaXRSb2xlUG9zaXRpb25zIiwiZWRpdFN0YWdlSW5zdGFuY2UiLCJ0b3BpYyIsImVkaXRVc2VyVm9pY2VTdGF0ZSIsImVkaXRXZWJob29rIiwiZWRpdFdlYmhvb2tNZXNzYWdlIiwiZWRpdFdlYmhvb2tXaXRoVG9rZW4iLCJlZGl0V2VsY29tZVNjcmVlbiIsIndlbGNvbWUiLCJlZGl0V2lkZ2V0U2V0dGluZ3MiLCJ3aWRnZXQiLCJleGVjdXRlV2ViaG9vayIsImZvbGxvd0Fubm91bmNlbWVudCIsInNvdXJjZUNoYW5uZWxJZCIsInRhcmdldENoYW5uZWxJZCIsImZvbGxvdyIsIndlYmhvb2tDaGFubmVsSWQiLCJnZXRBY3RpdmVUaHJlYWRzIiwiYWN0aXZlIiwiZ2V0QXBwbGljYXRpb25Db21tYW5kUGVybWlzc2lvbiIsImFjY2Vzc1Rva2VuIiwiZ2V0QXBwbGljYXRpb25Db21tYW5kUGVybWlzc2lvbnMiLCJnZXRBcHBsaWNhdGlvbkluZm8iLCJvYXV0aDIiLCJhcHBsaWNhdGlvbiIsImVkaXRBcHBsaWNhdGlvbkluZm8iLCJnZXRDdXJyZW50QXV0aGVudGljYXRpb25JbmZvIiwiY3VycmVudEF1dGhvcml6YXRpb24iLCJleGNoYW5nZVRva2VuIiwiY2xpZW50SWQiLCJjbGllbnRTZWNyZXQiLCJiYXNpY0NyZWRlbnRpYWxzIiwiZnJvbSIsImdyYW50VHlwZSIsInNjb3BlIiwidG9rZW5FeGNoYW5nZSIsInJldm9rZVRva2VuIiwidG9rZW5SZXZva2UiLCJnZXRBdWRpdExvZyIsImF1ZGl0bG9ncyIsImdldEF1dG9tb2RSdWxlIiwiZ2V0QXV0b21vZFJ1bGVzIiwiZ2V0QXZhaWxhYmxlVm9pY2VSZWdpb25zIiwicmVnaW9ucyIsImdldEJhbiIsIm1lbWJlcnMiLCJiYW4iLCJnZXRCYW5zIiwiYmFucyIsImdldENoYW5uZWwiLCJnZXRDaGFubmVsSW52aXRlcyIsImdldENoYW5uZWxzIiwiZ2V0Q2hhbm5lbFdlYmhvb2tzIiwiZ2V0RG1DaGFubmVsIiwiZG0iLCJyZWNpcGllbnRJZCIsImdldEdyb3VwRG1DaGFubmVsIiwiZ2V0RW1vamkiLCJlbW9qaUlkIiwiZ2V0QXBwbGljYXRpb25FbW9qaSIsImdldEVtb2ppcyIsImdldEFwcGxpY2F0aW9uRW1vamlzIiwiZ2V0Rm9sbG93dXBNZXNzYWdlIiwiZ2V0R2F0ZXdheUJvdCIsImdhdGV3YXlCb3QiLCJnZXRHbG9iYWxBcHBsaWNhdGlvbkNvbW1hbmQiLCJnZXRHbG9iYWxBcHBsaWNhdGlvbkNvbW1hbmRzIiwiZ2V0R3VpbGQiLCJjb3VudHMiLCJnZXRHdWlsZHMiLCJtYWtlUmVxdWVzdE9wdGlvbnMiLCJ1c2VyR3VpbGRzIiwiZ2V0R3VpbGRBcHBsaWNhdGlvbkNvbW1hbmQiLCJnZXRHdWlsZEFwcGxpY2F0aW9uQ29tbWFuZHMiLCJnZXRHdWlsZFByZXZpZXciLCJwcmV2aWV3IiwiZ2V0R3VpbGRUZW1wbGF0ZSIsImdldEd1aWxkVGVtcGxhdGVzIiwiZ2V0R3VpbGRXZWJob29rcyIsImdldEludGVncmF0aW9ucyIsImludGVncmF0aW9ucyIsImdldEludml0ZSIsImdldEludml0ZXMiLCJnZXRNZXNzYWdlIiwiZ2V0TWVzc2FnZXMiLCJnZXRTdGlja2VyUGFjayIsInN0aWNrZXJQYWNrSWQiLCJzdGlja2VyUGFjayIsImdldFN0aWNrZXJQYWNrcyIsInN0aWNrZXJQYWNrcyIsImdldE9yaWdpbmFsSW50ZXJhY3Rpb25SZXNwb25zZSIsImdldFBpbm5lZE1lc3NhZ2VzIiwicGlucyIsImdldFByaXZhdGVBcmNoaXZlZFRocmVhZHMiLCJwcml2YXRlIiwiZ2V0UHJpdmF0ZUpvaW5lZEFyY2hpdmVkVGhyZWFkcyIsImpvaW5lZCIsImdldFBydW5lQ291bnQiLCJwcnVuZSIsImdldFB1YmxpY0FyY2hpdmVkVGhyZWFkcyIsInB1YmxpYyIsImdldFJvbGVzIiwiZ2V0Um9sZSIsImdldFNjaGVkdWxlZEV2ZW50Iiwid2l0aFVzZXJDb3VudCIsImdldFNjaGVkdWxlZEV2ZW50cyIsImdldFNjaGVkdWxlZEV2ZW50VXNlcnMiLCJ1c2VycyIsImdldFNlc3Npb25JbmZvIiwiZ2V0U3RhZ2VJbnN0YW5jZSIsImdldE93blZvaWNlU3RhdGUiLCJnZXRVc2VyVm9pY2VTdGF0ZSIsImdldFN0aWNrZXIiLCJnZXRHdWlsZFN0aWNrZXIiLCJnZXRHdWlsZFN0aWNrZXJzIiwiZ2V0VGhyZWFkTWVtYmVyIiwiZ2V0VGhyZWFkTWVtYmVycyIsImdldFJlYWN0aW9ucyIsImdldFVzZXIiLCJnZXRDdXJyZW50VXNlciIsImdldFVzZXJDb25uZWN0aW9ucyIsImNvbm5lY3Rpb25zIiwiZ2V0VXNlckFwcGxpY2F0aW9uUm9sZUNvbm5lY3Rpb24iLCJyb2xlQ29ubmVjdGlvbnMiLCJnZXRWYW5pdHlVcmwiLCJ2YW5pdHkiLCJnZXRWb2ljZVJlZ2lvbnMiLCJnZXRXZWJob29rIiwiZ2V0V2ViaG9va01lc3NhZ2UiLCJnZXRXZWJob29rV2l0aFRva2VuIiwiZ2V0V2VsY29tZVNjcmVlbiIsImdldFdpZGdldCIsIndpZGdldEpzb24iLCJnZXRXaWRnZXRTZXR0aW5ncyIsImpvaW5UaHJlYWQiLCJtZSIsImxlYXZlR3VpbGQiLCJsZWF2ZSIsImxlYXZlVGhyZWFkIiwicHVibGlzaE1lc3NhZ2UiLCJjcm9zc3Bvc3QiLCJyZW1vdmVSb2xlIiwicmVtb3ZlVGhyZWFkTWVtYmVyIiwicmVtb3ZlRG1SZWNpcGllbnQiLCJzZW5kRm9sbG93dXBNZXNzYWdlIiwic2VuZEludGVyYWN0aW9uUmVzcG9uc2UiLCJpbnRlcmFjdGlvbklkIiwicGFyYW1zIiwiY2FsbGJhY2siLCJzZW5kTWVzc2FnZSIsInN0YXJ0VGhyZWFkV2l0aE1lc3NhZ2UiLCJzdGFydFRocmVhZFdpdGhvdXRNZXNzYWdlIiwiZ2V0UG9sbEFuc3dlclZvdGVycyIsImFuc3dlcklkIiwicG9sbHMiLCJ2b3RlcyIsImVuZFBvbGwiLCJleHBpcmUiLCJzeW5jR3VpbGRUZW1wbGF0ZSIsImJhbk1lbWJlciIsImJ1bGtCYW5NZW1iZXJzIiwiYnVsa0JhbiIsImVkaXRCb3RNZW1iZXIiLCJlZGl0TWVtYmVyIiwiZ2V0TWVtYmVyIiwiZ2V0Q3VycmVudE1lbWJlciIsImN1cnJlbnRNZW1iZXIiLCJnZXRNZW1iZXJzIiwiZ2V0QXBwbGljYXRpb25BY3Rpdml0eUluc3RhbmNlIiwiaW5zdGFuY2VJZCIsImFwcGxpY2F0aW9uQWN0aXZpdHlJbnN0YW5jZSIsImtpY2tNZW1iZXIiLCJwaW5NZXNzYWdlIiwicGluIiwicHJ1bmVNZW1iZXJzIiwic2VhcmNoTWVtYmVycyIsInF1ZXJ5Iiwic2VhcmNoIiwiZ2V0R3VpbGRPbmJvYXJkaW5nIiwib25ib2FyZGluZyIsImVkaXRHdWlsZE9uYm9hcmRpbmciLCJ1bmJhbk1lbWJlciIsInVucGluTWVzc2FnZSIsInRyaWdnZXJUeXBpbmdJbmRpY2F0b3IiLCJ0eXBpbmciLCJ1cHNlcnRHbG9iYWxBcHBsaWNhdGlvbkNvbW1hbmRzIiwidXBzZXJ0R3VpbGRBcHBsaWNhdGlvbkNvbW1hbmRzIiwiZWRpdFVzZXJBcHBsaWNhdGlvblJvbGVDb25uZWN0aW9uIiwiYWRkR3VpbGRNZW1iZXIiLCJjcmVhdGVUZXN0RW50aXRsZW1lbnQiLCJtb25ldGl6YXRpb24iLCJlbnRpdGxlbWVudHMiLCJsaXN0RW50aXRsZW1lbnRzIiwiZGVsZXRlVGVzdEVudGl0bGVtZW50IiwiZW50aXRsZW1lbnRJZCIsImVudGl0bGVtZW50IiwiY29uc3VtZUVudGl0bGVtZW50IiwibGlzdFNrdXMiLCJza3VzIiwibGlzdFN1YnNjcmlwdGlvbnMiLCJza3VJZCIsInN1YnNjcmlwdGlvbnMiLCJnZXRTdWJzY3JpcHRpb24iLCJzdWJzY3JpcHRpb25JZCIsInN1YnNjcmlwdGlvbiIsInNlbmRTb3VuZGJvYXJkU291bmQiLCJzb3VuZGJvYXJkIiwic2VuZFNvdW5kIiwibGlzdERlZmF1bHRTb3VuZGJvYXJkU291bmRzIiwibGlzdERlZmF1bHQiLCJsaXN0R3VpbGRTb3VuZGJvYXJkU291bmRzIiwiZ3VpbGRTb3VuZHMiLCJnZXRHdWlsZFNvdW5kYm9hcmRTb3VuZCIsInNvdW5kSWQiLCJndWlsZFNvdW5kIiwiY3JlYXRlR3VpbGRTb3VuZGJvYXJkU291bmQiLCJtb2RpZnlHdWlsZFNvdW5kYm9hcmRTb3VuZCIsImRlbGV0ZUd1aWxkU291bmRib2FyZFNvdW5kIiwicHJlZmVyU25ha2VDYXNlIiwiZW5hYmxlZCIsImNhbWVsaXplciIsIngiLCJIdHRwUmVzcG9uc2VDb2RlIl0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxNQUFNLFFBQVEsY0FBYTtBQUNwQyxTQW9ERUMsd0JBQXdCLFFBR25CLG9CQUFtQjtBQUMxQixTQUFTQyxhQUFhLEVBQUVDLGdCQUFnQixFQUFFQyxRQUFRLEVBQUVDLEtBQUssRUFBRUMsaUJBQWlCLEVBQUVDLE1BQU0sRUFBRUMscUJBQXFCLEVBQUVDLFdBQVcsUUFBUSxvQkFBbUI7QUFDbkosU0FBU0MsMEJBQTBCLFFBQVEscUJBQW9CO0FBQy9ELFNBQVNDLEtBQUssUUFBUSxhQUFZO0FBQ2xDLFNBQVNDLFlBQVksUUFBUSxjQUFhO0FBRzFDLGdEQUFnRDtBQUNoRCxNQUFNQyxVQUFVO0FBRWhCLE9BQU8sTUFBTUMsc0JBQXNCLEdBQUU7QUFDckMsT0FBTyxNQUFNQyxrQkFBa0IsMEJBQXlCO0FBRXhELE9BQU8sTUFBTUMsMEJBQTBCLHFCQUFvQjtBQUMzRCxPQUFPLE1BQU1DLDhCQUE4Qix3QkFBdUI7QUFDbEUsT0FBTyxNQUFNQyxnQ0FBZ0MsMEJBQXlCO0FBQ3RFLE9BQU8sTUFBTUMsMkJBQTJCLHFCQUFvQjtBQUM1RCxPQUFPLE1BQU1DLDJCQUEyQixxQkFBb0I7QUFDNUQsT0FBTyxNQUFNQywwQkFBMEIsb0JBQW1CO0FBQzFELE9BQU8sTUFBTUMsMEJBQTBCLG9CQUFtQjtBQUUxRCxPQUFPLFNBQVNDLGtCQUFrQkMsT0FBaUM7SUFDakUsTUFBTUMsZ0JBQWdCRCxRQUFRQyxhQUFhLEdBQUdDLE9BQU9GLFFBQVFDLGFBQWEsSUFBSW5CLGtCQUFrQmtCLFFBQVFHLEtBQUs7SUFFN0csTUFBTUMsVUFBVUosUUFBUUssS0FBSyxFQUFFRCxXQUFXYjtJQUUxQyxNQUFNZSxPQUFvQjtRQUN4Qkw7UUFDQU0sZUFBZVAsUUFBUUssS0FBSyxFQUFFRTtRQUM5QkMscUJBQXFCUixRQUFRSyxLQUFLLEVBQUVHLHVCQUF1QjtRQUMzREo7UUFDQUssa0JBQWtCO1FBQ2xCQyxxQkFBcUI7UUFDckJDLGVBQWV6QiwyQkFBMkI7WUFBRUgsUUFBUWlCLFFBQVFqQixNQUFNO1FBQUM7UUFDbkU2QixXQUFXLENBQUNSLFFBQVFTLFVBQVUsQ0FBQ3RCO1FBQy9CdUIsMkJBQTJCZCxRQUFRSyxLQUFLLEVBQUVTO1FBQzFDQyxlQUFlQztRQUNmQyw0QkFBNEI7UUFDNUJDLFFBQVEsSUFBSUM7UUFDWkMsa0JBQWtCLElBQUlEO1FBQ3RCaEIsT0FBT0gsUUFBUUcsS0FBSztRQUNwQmQsU0FBU1csUUFBUVgsT0FBTyxJQUFJQztRQUM1QlAsUUFBUWlCLFFBQVFqQixNQUFNLElBQUlBO1FBRTFCc0MsUUFBUWpDO1FBRVJrQztZQUNFLE9BQU87Z0JBQ0wsY0FBYyxDQUFDLHVEQUF1RCxFQUFFakMsUUFBUSxDQUFDLENBQUM7WUFDcEY7UUFDRjtRQUVBa0MsaUJBQWdCQyxHQUFHLEVBQUVDLFVBQVU7WUFDN0IsTUFBTUMsY0FBY3BCLEtBQUtjLGdCQUFnQixDQUFDTyxHQUFHLENBQUMsR0FBR0YsYUFBYUQsS0FBSztZQUVuRSxNQUFNSSxTQUFTdEIsS0FBS2MsZ0JBQWdCLENBQUNPLEdBQUcsQ0FBQztZQUN6QyxNQUFNRSxNQUFNQyxLQUFLRCxHQUFHO1lBRXBCLElBQUlILGVBQWVHLE1BQU1ILFlBQVlLLGNBQWMsRUFBRTtnQkFDbkQsT0FBT0wsWUFBWUssY0FBYyxHQUFHRjtZQUN0QztZQUVBLElBQUlELFVBQVVDLE1BQU1ELE9BQU9HLGNBQWMsRUFBRTtnQkFDekMsT0FBT0gsT0FBT0csY0FBYyxHQUFHRjtZQUNqQztZQUVBLE9BQU87UUFDVDtRQUVBLE1BQU1HLG1CQUFrQkMsUUFBUSxFQUFFQyxRQUFRO1lBQ3hDLElBQUk1QixLQUFLTSxTQUFTLEVBQUU7Z0JBQ2xCLElBQUksQ0FBQ04sS0FBS1EseUJBQXlCLEVBQUU7b0JBQ25DLE1BQU0sSUFBSXFCLE1BQ1I7Z0JBRUo7Z0JBRUEsTUFBTUMsVUFBVTtvQkFDZCxnQkFBZ0I7Z0JBQ2xCO2dCQUVBLElBQUk5QixLQUFLQyxhQUFhLEtBQUs4QixXQUFXO29CQUNwQ0QsT0FBTyxDQUFDOUIsS0FBS0UsbUJBQW1CLENBQUMsR0FBR0YsS0FBS0MsYUFBYTtnQkFDeEQ7Z0JBRUEsTUFBTStCLE1BQU0sR0FBR2hDLEtBQUtGLE9BQU8sQ0FBQyxDQUFDLEVBQUVFLEtBQUtRLHlCQUF5QixFQUFFLEVBQUU7b0JBQy9EeUIsUUFBUTtvQkFDUkMsTUFBTUMsS0FBS0MsU0FBUyxDQUFDO3dCQUNuQlQ7d0JBQ0FDO29CQUNGO29CQUNBRTtnQkFDRjtnQkFFQTtZQUNGO1lBRUEsTUFBTU8sZ0JBQWdCLENBQUMsT0FBTyxFQUFFVCxVQUFVO1lBRTFDLHdCQUF3QjtZQUN4QixLQUFLLE1BQU0sQ0FBQ1UsS0FBS0MsTUFBTSxJQUFJdkMsS0FBS1ksTUFBTSxDQUFDNEIsT0FBTyxHQUFJO2dCQUNoRCxJQUFJLENBQUNGLElBQUkvQixVQUFVLENBQUMsQ0FBQyxPQUFPLEVBQUVvQixVQUFVLEdBQUc7Z0JBRTNDM0IsS0FBS1ksTUFBTSxDQUFDNkIsTUFBTSxDQUFDSDtnQkFDbkJDLE1BQU1wQixVQUFVLEdBQUdrQjtnQkFFbkIsTUFBTUssU0FBUyxHQUFHTCxnQkFBZ0JFLE1BQU1yQixHQUFHLEVBQUU7Z0JBQzdDLE1BQU15QixXQUFXM0MsS0FBS1ksTUFBTSxDQUFDUyxHQUFHLENBQUNxQjtnQkFFakMsbUJBQW1CO2dCQUNuQixJQUFJQyxVQUFVO29CQUNaQSxTQUFTQyxPQUFPLENBQUNDLE9BQU8sSUFBSU4sTUFBTUssT0FBTztvQkFDekNELFNBQVNHLE9BQU8sQ0FBQ0QsT0FBTyxJQUFJTixNQUFNTyxPQUFPO29CQUV6Q1AsTUFBTUssT0FBTyxHQUFHLEVBQUU7b0JBQ2xCTCxNQUFNTyxPQUFPLEdBQUcsRUFBRTtvQkFFbEJQLE1BQU1RLE9BQU87Z0JBQ2YsT0FBTztvQkFDTC9DLEtBQUtZLE1BQU0sQ0FBQ29DLEdBQUcsQ0FBQ04sUUFBUUg7Z0JBQzFCO1lBQ0Y7WUFFQSxLQUFLLE1BQU0sQ0FBQ0QsS0FBS1csY0FBYyxJQUFJakQsS0FBS2MsZ0JBQWdCLENBQUMwQixPQUFPLEdBQUk7Z0JBQ2xFLElBQUksQ0FBQ0YsSUFBSS9CLFVBQVUsQ0FBQyxDQUFDLE9BQU8sRUFBRW9CLFVBQVUsR0FBRztnQkFFM0MzQixLQUFLYyxnQkFBZ0IsQ0FBQ2tDLEdBQUcsQ0FBQyxHQUFHWCxnQkFBZ0JZLGNBQWMvQixHQUFHLEVBQUUsRUFBRStCO2dCQUVsRSxJQUFJQSxjQUFjQyxRQUFRLEVBQUU7b0JBQzFCbEQsS0FBS2MsZ0JBQWdCLENBQUNrQyxHQUFHLENBQUMsR0FBR1gsZ0JBQWdCWSxjQUFjQyxRQUFRLEVBQUUsRUFBRUQ7Z0JBQ3pFO1lBQ0Y7UUFDRjtRQUVBRSx1QkFBc0JDLEdBQVE7WUFDNUIsSUFBSUEsUUFBUSxNQUFNLE9BQU87WUFFekIsSUFBSSxPQUFPQSxRQUFRLFVBQVU7Z0JBQzNCLElBQUlDLE1BQU1DLE9BQU8sQ0FBQ0YsTUFBTTtvQkFDdEIsT0FBT0EsSUFBSUcsR0FBRyxDQUFDLENBQUNDLE9BQVN4RCxLQUFLbUQscUJBQXFCLENBQUNLO2dCQUN0RDtnQkFFQSxNQUFNQyxTQUFjLENBQUM7Z0JBRXJCLEtBQUssTUFBTW5CLE9BQU9vQixPQUFPQyxJQUFJLENBQUNQLEtBQU07b0JBQ2xDLE1BQU1RLFFBQVFSLEdBQUcsQ0FBQ2QsSUFBSTtvQkFFdEIseUZBQXlGO29CQUN6RixJQUFJQSxJQUFJdUIsUUFBUSxDQUFDLE1BQU07d0JBQ3JCSixNQUFNLENBQUNuQixJQUFJLEdBQUdzQjt3QkFDZDtvQkFDRjtvQkFFQSxxREFBcUQ7b0JBQ3JELElBQUlBLFVBQVU3QixXQUFXO3dCQUN2QixPQUFRTzs0QkFDTixLQUFLOzRCQUNMLEtBQUs7NEJBQ0wsS0FBSztnQ0FDSG1CLE1BQU0sQ0FBQ25CLElBQUksR0FBRyxPQUFPc0IsVUFBVSxXQUFXQSxRQUFReEYsY0FBY3dGO2dDQUNoRTs0QkFDRixLQUFLO2dDQUNISCxPQUFPSywwQkFBMEIsR0FBRyxPQUFPRixVQUFVLFdBQVdBLFFBQVF4RixjQUFjd0Y7Z0NBQ3RGOzRCQUNGLEtBQUs7Z0NBQ0hILE9BQU9NLGtCQUFrQixHQUFHSDtnQ0FDNUI7NEJBQ0YsS0FBSztnQ0FDSEgsT0FBT08seUJBQXlCLEdBQUdKO2dDQUNuQzt3QkFDSjtvQkFDRjtvQkFFQUgsTUFBTSxDQUFDcEYsaUJBQWlCaUUsS0FBSyxHQUFHdEMsS0FBS21ELHFCQUFxQixDQUFDUztnQkFDN0Q7Z0JBRUEsT0FBT0g7WUFDVDtZQUVBLElBQUksT0FBT0wsUUFBUSxVQUFVLE9BQU9BLElBQUlhLFFBQVE7WUFFaEQsT0FBT2I7UUFDVDtRQUVBYyxtQkFBa0JqQyxNQUFNLEVBQUV2QyxPQUFPO1lBQy9CLE1BQU1vQyxVQUFVLElBQUksQ0FBQ2QsaUJBQWlCO1lBRXRDLElBQUl0QixTQUFTeUUsaUJBQWlCLE1BQU1yQyxRQUFRN0IsYUFBYSxHQUFHLENBQUMsSUFBSSxFQUFFRCxLQUFLSCxLQUFLLEVBQUU7WUFFL0UsK0NBQStDO1lBQy9DLElBQUlILFNBQVMwRSxXQUFXckMsV0FBVztnQkFDakNELE9BQU8sQ0FBQzVDLHdCQUF3QixHQUFHbUYsbUJBQW1CM0UsU0FBUzBFO1lBQ2pFO1lBRUEsSUFBSWxDO1lBRUosOERBQThEO1lBQzlELGtDQUFrQztZQUVsQywwRkFBMEY7WUFDMUYsSUFBSXhDLFNBQVM0RSxVQUFVdkMsV0FBVztnQkFDaEMsTUFBTXdDLE9BQU8sSUFBSUM7Z0JBQ2pCLElBQUssSUFBSUMsSUFBSSxHQUFHQSxJQUFJL0UsUUFBUTRFLEtBQUssQ0FBQ0ksTUFBTSxFQUFFLEVBQUVELEVBQUc7b0JBQzdDRixLQUFLSSxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUVGLEdBQUcsRUFBRS9FLFFBQVE0RSxLQUFLLENBQUNHLEVBQUUsQ0FBQ0csSUFBSSxFQUFFbEYsUUFBUTRFLEtBQUssQ0FBQ0csRUFBRSxDQUFDSSxJQUFJO2dCQUN0RTtnQkFFQSx3SEFBd0g7Z0JBQ3hITixLQUFLSSxNQUFNLENBQUMsZ0JBQWdCeEMsS0FBS0MsU0FBUyxDQUFDcEMsS0FBS21ELHFCQUFxQixDQUFDO29CQUFFLEdBQUd6RCxRQUFRd0MsSUFBSTtvQkFBRW9DLE9BQU92QztnQkFBVTtnQkFFMUcseUhBQXlIO2dCQUN6SEcsT0FBT3FDO1lBQ1QsT0FBTyxJQUFJN0UsU0FBU3dDLFFBQVF4QyxRQUFRb0MsT0FBTyxJQUFJcEMsUUFBUW9DLE9BQU8sQ0FBQyxlQUFlLEtBQUsscUNBQXFDO2dCQUN0SCx1QkFBdUI7Z0JBQ3ZCLE1BQU1nRCxXQUFxQixFQUFFO2dCQUU3QixNQUFNQyxjQUFjL0UsS0FBS21ELHFCQUFxQixDQUFDekQsUUFBUXdDLElBQUk7Z0JBRTNELElBQUssTUFBTThDLFFBQVFELFlBQWE7b0JBQzlCRCxTQUFTRyxJQUFJLENBQUMsR0FBR1osbUJBQW1CVyxNQUFNLENBQUMsRUFBRVgsbUJBQW1CVSxXQUFXLENBQUNDLEtBQUssR0FBRztnQkFDdEY7Z0JBRUE5QyxPQUFPNEMsU0FBU0ksSUFBSSxDQUFDO1lBQ3ZCLE9BQU8sSUFBSXhGLFNBQVN3QyxTQUFTSCxXQUFXO2dCQUN0QyxJQUFJckMsUUFBUXdDLElBQUksWUFBWXNDLFVBQVU7b0JBQ3BDdEMsT0FBT3hDLFFBQVF3QyxJQUFJO2dCQUNuQix5SEFBeUg7Z0JBQzNILE9BQU87b0JBQ0xBLE9BQU9DLEtBQUtDLFNBQVMsQ0FBQ3BDLEtBQUttRCxxQkFBcUIsQ0FBQ3pELFFBQVF3QyxJQUFJO29CQUM3REosT0FBTyxDQUFDLGVBQWUsR0FBRyxDQUFDLGdCQUFnQixDQUFDO2dCQUM5QztZQUNGO1lBRUEsd0VBQXdFO1lBQ3hFLElBQUlwQyxTQUFTb0MsU0FBUztnQkFDcEI0QixPQUFPeUIsTUFBTSxDQUFDckQsU0FBU3BDLFFBQVFvQyxPQUFPO1lBQ3hDO1lBRUEsT0FBTztnQkFDTEk7Z0JBQ0FKO2dCQUNBRztZQUNGO1FBQ0Y7UUFFQW1EO1lBQ0UsTUFBTTdELE1BQU1DLEtBQUtELEdBQUc7WUFFcEIsS0FBSyxNQUFNLENBQUNlLEtBQUtzQixNQUFNLElBQUk1RCxLQUFLYyxnQkFBZ0IsQ0FBQzBCLE9BQU8sR0FBSTtnQkFDMUQsZ0JBQWdCO2dCQUNoQiw0REFBNEQ7Z0JBQzVELCtCQUErQjtnQkFDL0IsS0FBSztnQkFDTCxNQUFNO2dCQUNOLHFDQUFxQztnQkFDckMsSUFBSW9CLE1BQU1uQyxjQUFjLEdBQUdGLEtBQUs7Z0JBRWhDLDhDQUE4QztnQkFDOUN2QixLQUFLYyxnQkFBZ0IsQ0FBQzJCLE1BQU0sQ0FBQ0g7Z0JBQzdCLHdEQUF3RDtnQkFDeEQsSUFBSUEsUUFBUSxVQUFVdEMsS0FBS0ksbUJBQW1CLEdBQUc7WUFDbkQ7WUFFQSx3Q0FBd0M7WUFDeEMsSUFBSUosS0FBS2MsZ0JBQWdCLENBQUN1RSxJQUFJLEtBQUssR0FBRztnQkFDcENyRixLQUFLVywwQkFBMEIsR0FBRztZQUNwQyxPQUFPO2dCQUNMWCxLQUFLVywwQkFBMEIsR0FBRztnQkFDbEMsc0JBQXNCO2dCQUN0QjJFLFdBQVc7b0JBQ1QscUVBQXFFO29CQUNyRXRGLEtBQUtvRix1QkFBdUI7Z0JBQzlCLEdBQUc7WUFDTDtRQUNGO1FBRUEsMEhBQTBILEdBQzFIRyxnQkFBZXJFLEdBQUcsRUFBRVksT0FBTyxFQUFFWCxVQUFVO1lBQ3JDLElBQUlxRSxjQUFjO1lBRWxCLDRCQUE0QjtZQUM1QixNQUFNQyxZQUFZM0QsUUFBUVQsR0FBRyxDQUFDbEM7WUFDOUIsTUFBTXVHLGFBQWE1RCxRQUFRVCxHQUFHLENBQUNqQztZQUMvQixNQUFNdUcsUUFBUW5FLEtBQUtELEdBQUcsS0FBS3FFLE9BQU9GLGNBQWM7WUFDaEQsTUFBTXBFLFNBQVNRLFFBQVFULEdBQUcsQ0FBQ2hDO1lBQzNCLDZDQUE2QztZQUM3QyxNQUFNNkQsV0FBV3BCLFFBQVFULEdBQUcsQ0FBQy9CLDZCQUE2QnlDO1lBQzFELE1BQU04RCxRQUFRL0QsUUFBUVQsR0FBRyxDQUFDOUI7WUFFMUIsa0VBQWtFO1lBQ2xFNEIsZUFBZSxDQUFDLElBQUksRUFBRW5CLEtBQUtILEtBQUssRUFBRTtZQUVsQ0csS0FBS1ksTUFBTSxDQUFDUyxHQUFHLENBQUMsR0FBR0YsYUFBYUQsS0FBSyxHQUFHNEUsdUJBQXVCO2dCQUM3REwsV0FBV0EsWUFBWUcsT0FBT0gsYUFBYTFEO2dCQUMzQ2dFLFVBQVVMLGFBQWFFLE9BQU9GLGNBQWMsT0FBTzNEO2dCQUNuRGlFLEtBQUtILFFBQVFELE9BQU9DLFNBQVM5RDtZQUMvQjtZQUVBLCtEQUErRDtZQUMvRCxJQUFJMEQsY0FBYyxLQUFLO2dCQUNyQkQsY0FBYztnQkFFZCw2RUFBNkU7Z0JBQzdFeEYsS0FBS2MsZ0JBQWdCLENBQUNrQyxHQUFHLENBQUMsR0FBRzdCLGFBQWFELEtBQUssRUFBRTtvQkFDL0NBO29CQUNBTyxnQkFBZ0JrRTtvQkFDaEJ6QztnQkFDRjtnQkFFQSxxRUFBcUU7Z0JBQ3JFLElBQUlBLFVBQVU7b0JBQ1psRCxLQUFLYyxnQkFBZ0IsQ0FBQ2tDLEdBQUcsQ0FBQyxHQUFHN0IsYUFBYStCLFVBQVUsRUFBRTt3QkFDcERoQzt3QkFDQU8sZ0JBQWdCa0U7d0JBQ2hCekM7b0JBQ0Y7Z0JBQ0Y7WUFDRjtZQUVBLHVFQUF1RTtZQUN2RSxJQUFJNUIsUUFBUTtnQkFDVixNQUFNb0UsYUFBYUUsT0FBTzlELFFBQVFULEdBQUcsQ0FBQyxrQkFBa0I7Z0JBQ3hELE1BQU00RSxjQUFjekUsS0FBS0QsR0FBRyxLQUFLbUU7Z0JBQ2pDLGdCQUFnQjtnQkFDaEIsNkVBQTZFO2dCQUM3RSxNQUFNO2dCQUNOMUYsS0FBS0ksbUJBQW1CLEdBQUc7Z0JBQzNCb0YsY0FBYztnQkFFZEYsV0FBVztvQkFDVHRGLEtBQUtJLG1CQUFtQixHQUFHO2dCQUM3QixHQUFHc0Y7Z0JBRUgxRixLQUFLYyxnQkFBZ0IsQ0FBQ2tDLEdBQUcsQ0FBQyxVQUFVO29CQUNsQzlCLEtBQUs7b0JBQ0xPLGdCQUFnQndFO29CQUNoQi9DO2dCQUNGO2dCQUVBLElBQUlBLFVBQVU7b0JBQ1psRCxLQUFLYyxnQkFBZ0IsQ0FBQ2tDLEdBQUcsQ0FBQzdCLFlBQVk7d0JBQ3BDRCxLQUFLO3dCQUNMTyxnQkFBZ0J3RTt3QkFDaEIvQztvQkFDRjtnQkFDRjtZQUNGO1lBRUEsSUFBSXNDLGVBQWUsQ0FBQ3hGLEtBQUtXLDBCQUEwQixFQUFFO2dCQUNuRFgsS0FBS29GLHVCQUF1QjtZQUM5QjtZQUNBLE9BQU9JLGNBQWN0QyxXQUFXbkI7UUFDbEM7UUFFQSxNQUFNbUUsYUFBWXhHLE9BQU87WUFDdkIsTUFBTXdCLE1BQU0sR0FBR2xCLEtBQUtGLE9BQU8sQ0FBQyxFQUFFLEVBQUVFLEtBQUtqQixPQUFPLEdBQUdXLFFBQVF5RyxLQUFLLEVBQUU7WUFDOUQsTUFBTUMsVUFBVXBHLEtBQUtrRSxpQkFBaUIsQ0FBQ3hFLFFBQVF1QyxNQUFNLEVBQUV2QyxRQUFRMkcsa0JBQWtCO1lBRWpGLE1BQU1DLGlCQUFpQjtnQkFBRSxHQUFHRixRQUFRdEUsT0FBTztZQUFDO1lBRTVDLElBQUlzRSxRQUFRdEUsT0FBTyxDQUFDN0IsYUFBYSxFQUFFO2dCQUNqQyxNQUFNc0csc0JBQXNCSCxRQUFRdEUsT0FBTyxDQUFDN0IsYUFBYSxFQUFFdUcsTUFBTSxJQUFJLENBQUMsRUFBRTtnQkFDeEVGLGVBQWVyRyxhQUFhLEdBQUcsR0FBR3NHLG9CQUFvQixVQUFVLENBQUM7WUFDbkU7WUFFQXZHLEtBQUt2QixNQUFNLENBQUNnSSxLQUFLLENBQUMsQ0FBQyxtQkFBbUIsRUFBRXZGLEtBQUssRUFBRSxpQkFBaUI7Z0JBQUUsR0FBR2tGLE9BQU87Z0JBQUV0RSxTQUFTd0U7WUFBZTtZQUN0RyxNQUFNSSxXQUFXLE1BQU0xRSxNQUFNZCxLQUFLa0YsU0FBU08sS0FBSyxDQUFDLE9BQU9DO2dCQUN0RDVHLEtBQUt2QixNQUFNLENBQUNtSSxLQUFLLENBQUNBO2dCQUNsQiw2QkFBNkI7Z0JBQzdCNUcsS0FBS0ssYUFBYSxDQUFDeUYsc0JBQXNCLENBQUMsS0FBSztnQkFDL0NwRyxRQUFRbUgsTUFBTSxDQUFDO29CQUNiQyxJQUFJO29CQUNKQyxRQUFRO29CQUNSSCxPQUFPO2dCQUNUO2dCQUNBLE1BQU1BO1lBQ1I7WUFDQTVHLEtBQUt2QixNQUFNLENBQUNnSSxLQUFLLENBQUMsQ0FBQyxxQkFBcUIsRUFBRXZGLElBQUksYUFBYSxFQUFFd0YsU0FBU0ssTUFBTSxDQUFDLEdBQUcsRUFBRUwsU0FBU00sVUFBVSxFQUFFO1lBRXZHLDZCQUE2QjtZQUM3QmhILEtBQUtLLGFBQWEsQ0FBQ3lGLHNCQUFzQixDQUFDWSxTQUFTSyxNQUFNLEVBQUVMLFNBQVM1RSxPQUFPLENBQUNULEdBQUcsQ0FBQzdCLDZCQUE2QjtZQUU3Ryx1REFBdUQ7WUFDdkQsTUFBTTBELFdBQVdsRCxLQUFLdUYsY0FBYyxDQUFDdkYsS0FBS2lILFdBQVcsQ0FBQ3ZILFFBQVF5RyxLQUFLLEVBQUV6RyxRQUFRdUMsTUFBTSxHQUFHeUUsU0FBUzVFLE9BQU8sRUFBRXNFLFFBQVF0RSxPQUFPLENBQUM3QixhQUFhO1lBRXJJLElBQUlpRCxVQUFVeEQsUUFBUXdELFFBQVEsR0FBR0E7WUFFakMsSUFBSXdELFNBQVNLLE1BQU0sVUFBK0JMLFNBQVNLLE1BQU0sU0FBNEI7Z0JBQzNGL0csS0FBS3ZCLE1BQU0sQ0FBQ2dJLEtBQUssQ0FBQyxDQUFDLFdBQVcsRUFBRXZGLElBQUksUUFBUSxDQUFDO2dCQUU3QyxJQUFJd0YsU0FBU0ssTUFBTSxVQUF1QztvQkFDeERySCxRQUFRbUgsTUFBTSxDQUFDO3dCQUFFQyxJQUFJO3dCQUFPQyxRQUFRTCxTQUFTSyxNQUFNO3dCQUFFN0UsTUFBTSxNQUFNd0UsU0FBU1EsSUFBSTtvQkFBRztvQkFDakY7Z0JBQ0Y7Z0JBRUFsSCxLQUFLdkIsTUFBTSxDQUFDZ0ksS0FBSyxDQUFDLENBQUMsV0FBVyxFQUFFdkYsSUFBSSxpQkFBaUIsQ0FBQztnQkFDdEQsb0RBQW9EO2dCQUNwRCxJQUFJeEIsUUFBUXlILFVBQVUsSUFBSW5ILEtBQUtTLGFBQWEsRUFBRTtvQkFDNUNULEtBQUt2QixNQUFNLENBQUNnSSxLQUFLLENBQUMsQ0FBQyxXQUFXLEVBQUV2RixJQUFJLHNDQUFzQyxDQUFDLEVBQUUsaUJBQWlCa0Y7b0JBQzlGLGlFQUFpRTtvQkFDakUxRyxRQUFRbUgsTUFBTSxDQUFDO3dCQUNiQyxJQUFJO3dCQUNKQyxRQUFRTCxTQUFTSyxNQUFNO3dCQUN2QkgsT0FBTztvQkFDVDtvQkFFQTtnQkFDRjtnQkFFQWxILFFBQVF5SCxVQUFVLElBQUk7Z0JBRXRCLE1BQU1DLGFBQWFWLFNBQVM1RSxPQUFPLENBQUNULEdBQUcsQ0FBQ2pDO2dCQUN4QyxJQUFJZ0ksWUFBWSxNQUFNN0ksTUFBTXFILE9BQU93QixjQUFjO2dCQUNqRCwyQ0FBMkM7Z0JBQzNDLE1BQU1WLFNBQVNXLFdBQVc7Z0JBRTFCLE9BQU8sTUFBTTNILFFBQVE0SCxZQUFZLEdBQUc1SDtZQUN0QztZQUVBLHVEQUF1RDtZQUN2REEsUUFBUTZILE9BQU8sQ0FBQztnQkFBRVQsSUFBSTtnQkFBTUMsUUFBUUwsU0FBU0ssTUFBTTtnQkFBRTdFLE1BQU13RSxTQUFTSyxNQUFNLFdBQWtDaEYsWUFBWSxNQUFNMkUsU0FBU1EsSUFBSTtZQUFHO1FBQ2hKO1FBRUFELGFBQVkvRixHQUFHLEVBQUVlLE1BQU07WUFDckIsTUFBTXVGLFFBQVF0RyxJQUFJc0YsS0FBSyxDQUFDO1lBQ3hCLE1BQU1pQixpQkFBaUJELEtBQUssQ0FBQ0EsTUFBTTlDLE1BQU0sR0FBRyxFQUFFO1lBRTlDLElBQUkrQyxtQkFBbUIsY0FBY0EsbUJBQW1CLFVBQVU7Z0JBQ2hFLE9BQU92RztZQUNUO1lBRUEsSUFBSXVHLG1CQUFtQixlQUFlRCxLQUFLLENBQUNBLE1BQU05QyxNQUFNLEdBQUcsRUFBRSxLQUFLLE9BQU87Z0JBQ3ZFOEMsTUFBTUUsTUFBTSxDQUFDLENBQUM7Z0JBQ2RGLE1BQU12QyxJQUFJLENBQUM7WUFDYixPQUFPO2dCQUNMdUMsTUFBTUUsTUFBTSxDQUFDLENBQUM7Z0JBQ2RGLE1BQU12QyxJQUFJLENBQUM7WUFDYjtZQUVBLElBQUl1QyxLQUFLLENBQUNBLE1BQU05QyxNQUFNLEdBQUcsRUFBRSxLQUFLLGFBQWE7Z0JBQzNDOEMsTUFBTUUsTUFBTSxDQUFDLENBQUM7WUFDaEI7WUFFQSxJQUFJekYsV0FBVyxZQUFZd0YsbUJBQW1CLFlBQVk7Z0JBQ3hELE9BQU8sQ0FBQyxDQUFDLEVBQUVELE1BQU10QyxJQUFJLENBQUMsTUFBTTtZQUM5QjtZQUVBLE9BQU9zQyxNQUFNdEMsSUFBSSxDQUFDO1FBQ3BCO1FBRUEsTUFBTXlDLGdCQUFlQyxPQUEyQjtZQUM5QyxNQUFNMUcsTUFBTWxCLEtBQUtpSCxXQUFXLENBQUNXLFFBQVF6QixLQUFLLEVBQUV5QixRQUFRM0YsTUFBTTtZQUUxRCxJQUFJMkYsUUFBUUMsZUFBZSxLQUFLLE9BQU87Z0JBQ3JDLE1BQU03SCxLQUFLa0csV0FBVyxDQUFDMEI7Z0JBRXZCO1lBQ0Y7WUFFQSx3Q0FBd0M7WUFDeEMsNkNBQTZDO1lBQzdDLE1BQU1FLGtCQUFrQkYsUUFBUXZCLGtCQUFrQixFQUFFdkUsU0FBUzdCLGlCQUFpQixDQUFDLElBQUksRUFBRUQsS0FBS0gsS0FBSyxFQUFFO1lBRWpHLE1BQU0wQyxRQUFRdkMsS0FBS1ksTUFBTSxDQUFDUyxHQUFHLENBQUMsR0FBR3lHLGtCQUFrQjVHLEtBQUs7WUFFeEQsSUFBSXFCLFVBQVVSLFdBQVc7Z0JBQ3ZCUSxNQUFNd0YsV0FBVyxDQUFDSDtZQUNwQixPQUFPO2dCQUNMLHNCQUFzQjtnQkFDdEIsTUFBTUksY0FBYyxJQUFJbkosTUFBTW1CLE1BQU07b0JBQUVrQjtvQkFBS2Ysa0JBQWtCSCxLQUFLRyxnQkFBZ0I7b0JBQUVnQixZQUFZMkc7Z0JBQWdCO2dCQUVoSCxhQUFhO2dCQUNiOUgsS0FBS1ksTUFBTSxDQUFDb0MsR0FBRyxDQUFDLEdBQUc4RSxrQkFBa0I1RyxLQUFLLEVBQUU4RztnQkFFNUMsdUJBQXVCO2dCQUN2QkEsWUFBWUQsV0FBVyxDQUFDSDtZQUMxQjtRQUNGO1FBRUEsTUFBTUcsYUFBWTlGLE1BQU0sRUFBRWtFLEtBQUssRUFBRXpHLE9BQU87WUFDdEMsSUFBSU0sS0FBS00sU0FBUyxFQUFFO2dCQUNsQixJQUFJTixLQUFLQyxhQUFhLEtBQUs4QixXQUFXO29CQUNwQ3JDLFlBQVksQ0FBQztvQkFDYkEsUUFBUW9DLE9BQU8sS0FBSyxDQUFDO29CQUNyQnBDLFFBQVFvQyxPQUFPLENBQUM5QixLQUFLRSxtQkFBbUIsQ0FBQyxHQUFHRixLQUFLQyxhQUFhO2dCQUNoRTtnQkFFQSxNQUFNZ0ksU0FBUyxNQUFNakcsTUFBTSxHQUFHaEMsS0FBS0YsT0FBTyxDQUFDLEVBQUUsRUFBRUUsS0FBS2pCLE9BQU8sR0FBR29ILE9BQU8sRUFBRW5HLEtBQUtrRSxpQkFBaUIsQ0FBQ2pDLFFBQVF2QztnQkFFdEcsSUFBSSxDQUFDdUksT0FBT25CLEVBQUUsRUFBRTtvQkFDZCxNQUFNb0IsTUFBTyxNQUFNRCxPQUFPRSxJQUFJLEdBQUd4QixLQUFLLENBQUMsS0FBTztvQkFDOUMsZ0VBQWdFO29CQUNoRSxJQUFJLENBQUN1QixLQUFLaEcsTUFBTSxNQUFNLElBQUlMLE1BQU0sQ0FBQyxPQUFPLEVBQUVxRyxJQUFJRSxPQUFPLElBQUlILE9BQU9qQixVQUFVLEVBQUU7b0JBQzVFLE1BQU0sSUFBSW5GLE1BQU1NLEtBQUtDLFNBQVMsQ0FBQzhGO2dCQUNqQztnQkFFQSxPQUFPRCxPQUFPbEIsTUFBTSxLQUFLLE1BQU0sTUFBTWtCLE9BQU9FLElBQUksS0FBS3BHO1lBQ3ZEO1lBRUEsaUZBQWlGO1lBQ2pGLE1BQU02RSxRQUFRLElBQUkvRTtZQUNsQitFLE1BQU13QixPQUFPLEdBQUc7WUFFaEIsT0FBTyxNQUFNLElBQUlDLFFBQVEsT0FBT2QsU0FBU1Y7Z0JBQ3ZDLE1BQU1ULFVBQThCO29CQUNsQ0Q7b0JBQ0FsRTtvQkFDQW9FLG9CQUFvQjNHO29CQUNwQnlILFlBQVk7b0JBQ1pHLGNBQWMsT0FBT2xCO3dCQUNuQixNQUFNcEcsS0FBSzJILGNBQWMsQ0FBQ3ZCO29CQUM1QjtvQkFDQW1CLFNBQVMsQ0FBQ2U7d0JBQ1JmLFFBQVFlLEtBQUt2QixNQUFNLEtBQUssTUFBTTVFLEtBQUtvRyxLQUFLLENBQUNELEtBQUtwRyxJQUFJLElBQUksUUFBUUg7b0JBQ2hFO29CQUNBOEUsUUFBUSxDQUFDekM7d0JBQ1B3QyxNQUFNNEIsS0FBSyxHQUFHcEU7d0JBQ2R5QyxPQUFPRDtvQkFDVDtvQkFDQWlCLGlCQUFpQm5JLFNBQVNtSTtnQkFDNUI7Z0JBRUEsTUFBTTdILEtBQUsySCxjQUFjLENBQUN2QjtZQUM1QjtRQUNGO1FBRUEsTUFBTS9FLEtBQWlDSCxHQUFXLEVBQUV4QixPQUEyRDtZQUM3RyxPQUFPcEIsU0FBUyxNQUFNMEIsS0FBSytILFdBQVcsQ0FBQyxPQUFPN0csS0FBS3hCO1FBQ3JEO1FBRUEsTUFBTStJLE1BQWtDdkgsR0FBVyxFQUFFeEIsT0FBMkQ7WUFDOUcsT0FBT3BCLFNBQVMsTUFBTTBCLEtBQUsrSCxXQUFXLENBQUMsUUFBUTdHLEtBQUt4QjtRQUN0RDtRQUVBLE1BQU0rQyxRQUFPdkIsR0FBVyxFQUFFeEIsT0FBMkQ7WUFDbkZwQixTQUFTLE1BQU0wQixLQUFLK0gsV0FBVyxDQUFDLFVBQVU3RyxLQUFLeEI7UUFDakQ7UUFFQSxNQUFNZ0osT0FBbUN4SCxHQUFXLEVBQUV4QixPQUEyRDtZQUMvRyxPQUFPcEIsU0FBUyxNQUFNMEIsS0FBSytILFdBQVcsQ0FBQyxTQUFTN0csS0FBS3hCO1FBQ3ZEO1FBRUEsTUFBTWlKLEtBQWN6SCxHQUFXLEVBQUV4QixPQUEyRDtZQUMxRixPQUFPcEIsU0FBUyxNQUFNMEIsS0FBSytILFdBQVcsQ0FBQyxPQUFPN0csS0FBS3hCO1FBQ3JEO1FBRUEsTUFBTWtKLGFBQVlDLFNBQVMsRUFBRUMsU0FBUyxFQUFFQyxRQUFRO1lBQzlDQSxXQUFXckssc0JBQXNCcUs7WUFFakMsTUFBTS9JLEtBQUsySSxHQUFHLENBQUMzSSxLQUFLZSxNQUFNLENBQUNpSSxRQUFRLENBQUNDLFNBQVMsQ0FBQ0MsR0FBRyxDQUFDTCxXQUFXQyxXQUFXQztRQUMxRTtRQUVBLE1BQU1JLGNBQWFOLFNBQVMsRUFBRUMsU0FBUyxFQUFFRyxTQUFTLEVBQUVHLFVBQVUsS0FBSztZQUNqRSxJQUFJLENBQUNBLFNBQVM7Z0JBQ1osTUFBTWYsUUFBUWdCLEdBQUcsQ0FDZkosVUFBVTFGLEdBQUcsQ0FBQyxPQUFPd0Y7b0JBQ25CLE1BQU0vSSxLQUFLNEksV0FBVyxDQUFDQyxXQUFXQyxXQUFXQztnQkFDL0M7Z0JBRUY7WUFDRjtZQUVBLEtBQUssTUFBTUEsWUFBWUUsVUFBVztnQkFDaEMsTUFBTWpKLEtBQUs0SSxXQUFXLENBQUNDLFdBQVdDLFdBQVdDO1lBQy9DO1FBQ0Y7UUFFQSxNQUFNTyxTQUFRQyxPQUFPLEVBQUVDLE1BQU0sRUFBRUMsTUFBTSxFQUFFckYsTUFBTTtZQUMzQyxNQUFNcEUsS0FBSzJJLEdBQUcsQ0FBQzNJLEtBQUtlLE1BQU0sQ0FBQzJJLE1BQU0sQ0FBQ0MsS0FBSyxDQUFDQyxNQUFNLENBQUNMLFNBQVNDLFFBQVFDLFNBQVM7Z0JBQUVyRjtZQUFPO1FBQ3BGO1FBRUEsTUFBTXlGLGlCQUFnQmhCLFNBQVMsRUFBRVcsTUFBTTtZQUNyQyxNQUFNeEosS0FBSzJJLEdBQUcsQ0FBQzNJLEtBQUtlLE1BQU0sQ0FBQ2lJLFFBQVEsQ0FBQ2MsT0FBTyxDQUFDQyxJQUFJLENBQUNsQixXQUFXVztRQUM5RDtRQUVBLE1BQU1RLGdCQUFlbkIsU0FBUyxFQUFFVyxNQUFNLEVBQUV0SCxJQUFJO1lBQzFDLE1BQU1sQyxLQUFLMkksR0FBRyxDQUFDM0ksS0FBS2UsTUFBTSxDQUFDaUksUUFBUSxDQUFDaUIsV0FBVyxDQUFDcEIsV0FBV1csU0FBUztnQkFBRXRIO1lBQUs7UUFDN0U7UUFFQSxNQUFNZ0ksbUJBQWtCWCxPQUFPLEVBQUVySCxJQUFJLEVBQUVrQyxNQUFNO1lBQzNDLE9BQU8sTUFBTXBFLEtBQUt5SSxJQUFJLENBQTRCekksS0FBS2UsTUFBTSxDQUFDMkksTUFBTSxDQUFDUyxPQUFPLENBQUNDLEtBQUssQ0FBQ2IsVUFBVTtnQkFBRXJIO2dCQUFNa0M7WUFBTztRQUM5RztRQUVBLE1BQU1pRyxlQUFjZCxPQUFPLEVBQUVySCxJQUFJLEVBQUVrQyxNQUFNO1lBQ3ZDLE9BQU8sTUFBTXBFLEtBQUt5SSxJQUFJLENBQWlCekksS0FBS2UsTUFBTSxDQUFDMkksTUFBTSxDQUFDVixRQUFRLENBQUNPLFVBQVU7Z0JBQUVySDtnQkFBTWtDO1lBQU87UUFDOUY7UUFFQSxNQUFNa0csYUFBWWYsT0FBTyxFQUFFckgsSUFBSSxFQUFFa0MsTUFBTTtZQUNyQyxPQUFPLE1BQU1wRSxLQUFLeUksSUFBSSxDQUFlekksS0FBS2UsTUFBTSxDQUFDMkksTUFBTSxDQUFDYSxNQUFNLENBQUNoQixVQUFVO2dCQUFFckg7Z0JBQU1rQztZQUFPO1FBQzFGO1FBRUEsTUFBTW9HLHdCQUF1QnRJLElBQUk7WUFDL0IsT0FBTyxNQUFNbEMsS0FBS3lJLElBQUksQ0FBZXpJLEtBQUtlLE1BQU0sQ0FBQzBKLGlCQUFpQixDQUFDekssS0FBS0wsYUFBYSxHQUFHO2dCQUFFdUM7WUFBSztRQUNqRztRQUVBLE1BQU13SSxnQ0FBK0J4SSxJQUFJLEVBQUV4QyxPQUFPO1lBQ2hELE1BQU1pTCxjQUFrQztnQkFBRXpJO1lBQUs7WUFFL0MsSUFBSXhDLFNBQVNrTCxhQUFhO2dCQUN4QkQsWUFBWXhHLFlBQVksR0FBRztnQkFDM0J3RyxZQUFZN0ksT0FBTyxHQUFHO29CQUNwQjdCLGVBQWUsQ0FBQyxPQUFPLEVBQUVQLFFBQVFrTCxXQUFXLEVBQUU7Z0JBQ2hEO1lBQ0Y7WUFFQSxPQUFPLE1BQU01SyxLQUFLeUksSUFBSSxDQUE0QnpJLEtBQUtlLE1BQU0sQ0FBQzhKLFlBQVksQ0FBQ0MsUUFBUSxDQUFDQSxRQUFRLENBQUM5SyxLQUFLTCxhQUFhLEdBQUdnTDtRQUNwSDtRQUVBLE1BQU1JLGFBQVk3SSxJQUFJO1lBQ3BCLE9BQU8sTUFBTWxDLEtBQUt5SSxJQUFJLENBQWV6SSxLQUFLZSxNQUFNLENBQUMySSxNQUFNLENBQUNMLEdBQUcsSUFBSTtnQkFBRW5IO1lBQUs7UUFDeEU7UUFFQSxNQUFNOEksK0JBQThCOUksSUFBSSxFQUFFcUgsT0FBTyxFQUFFN0osT0FBTztZQUN4RCxNQUFNaUwsY0FBa0M7Z0JBQUV6STtZQUFLO1lBRS9DLElBQUl4QyxTQUFTa0wsYUFBYTtnQkFDeEJELFlBQVl4RyxZQUFZLEdBQUc7Z0JBQzNCd0csWUFBWTdJLE9BQU8sR0FBRztvQkFDcEI3QixlQUFlLENBQUMsT0FBTyxFQUFFUCxRQUFRa0wsV0FBVyxFQUFFO2dCQUNoRDtZQUNGO1lBRUEsT0FBTyxNQUFNNUssS0FBS3lJLElBQUksQ0FBNEJ6SSxLQUFLZSxNQUFNLENBQUM4SixZQUFZLENBQUNDLFFBQVEsQ0FBQ3BCLE1BQU0sQ0FBQ0wsR0FBRyxDQUFDckosS0FBS0wsYUFBYSxFQUFFNEosVUFBVW9CO1FBQy9IO1FBRUEsTUFBTU0seUJBQXdCQyxZQUFZLEVBQUVoSixJQUFJO1lBQzlDLElBQUlBLEtBQUtpSixJQUFJLEVBQUU7Z0JBQ2JqSixLQUFLaUosSUFBSSxHQUFHLE1BQU14TSxZQUFZdUQsS0FBS2lKLElBQUk7WUFDekM7WUFFQSxPQUFPLE1BQU1uTCxLQUFLeUksSUFBSSxDQUFlekksS0FBS2UsTUFBTSxDQUFDMkksTUFBTSxDQUFDMEIsU0FBUyxDQUFDQyxJQUFJLENBQUNILGVBQWU7Z0JBQUVoSjtZQUFLO1FBQy9GO1FBRUEsTUFBTW9KLG9CQUFtQi9CLE9BQU8sRUFBRTdKLE9BQU8sRUFBRTBFLE1BQU07WUFDL0MsTUFBTUcsT0FBTyxJQUFJQztZQUNqQkQsS0FBS0ksTUFBTSxDQUFDLFFBQVFqRixRQUFRNkwsSUFBSSxDQUFDM0csSUFBSSxFQUFFbEYsUUFBUTZMLElBQUksQ0FBQzFHLElBQUk7WUFDeEROLEtBQUtJLE1BQU0sQ0FBQyxRQUFRakYsUUFBUW1GLElBQUk7WUFDaENOLEtBQUtJLE1BQU0sQ0FBQyxlQUFlakYsUUFBUThMLFdBQVc7WUFDOUNqSCxLQUFLSSxNQUFNLENBQUMsUUFBUWpGLFFBQVErTCxJQUFJO1lBRWhDLE9BQU8sTUFBTXpMLEtBQUt5SSxJQUFJLENBQWlCekksS0FBS2UsTUFBTSxDQUFDMkksTUFBTSxDQUFDZ0MsUUFBUSxDQUFDbkMsVUFBVTtnQkFBRXJILE1BQU1xQztnQkFBTUg7WUFBTztRQUNwRztRQUVBLE1BQU11SCxxQkFBb0JwQyxPQUFPLEVBQUVySCxJQUFJO1lBQ3JDLE9BQU8sTUFBTWxDLEtBQUt5SSxJQUFJLENBQWtCekksS0FBS2UsTUFBTSxDQUFDMkksTUFBTSxDQUFDMEIsU0FBUyxDQUFDL0IsR0FBRyxDQUFDRSxVQUFVO2dCQUFFckg7WUFBSztRQUM1RjtRQUVBLE1BQU0wSixtQkFBa0IvQyxTQUFTLEVBQUUzRyxJQUFJLEVBQUVrQyxNQUFNO1lBQzdDLE9BQU8sTUFBTXBFLEtBQUt5SSxJQUFJLENBQWlCekksS0FBS2UsTUFBTSxDQUFDaUksUUFBUSxDQUFDNkMsS0FBSyxDQUFDaEQsWUFBWTtnQkFBRTNHO2dCQUFNb0MsT0FBT3BDLEtBQUtvQyxLQUFLO2dCQUFFRjtZQUFPO1FBQ2xIO1FBRUEsTUFBTTBILGNBQWFqRCxTQUFTLEVBQUUzRyxPQUFPLENBQUMsQ0FBQyxFQUFFa0MsTUFBTTtZQUM3QyxPQUFPLE1BQU1wRSxLQUFLeUksSUFBSSxDQUFnQnpJLEtBQUtlLE1BQU0sQ0FBQ2lJLFFBQVEsQ0FBQytDLE9BQU8sQ0FBQ2xELFlBQVk7Z0JBQUUzRztnQkFBTWtDO1lBQU87UUFDaEc7UUFFQSxNQUFNNEgsWUFBV3pDLE9BQU8sRUFBRXJILElBQUksRUFBRWtDLE1BQU07WUFDcEMsT0FBTyxNQUFNcEUsS0FBS3lJLElBQUksQ0FBY3pJLEtBQUtlLE1BQU0sQ0FBQzJJLE1BQU0sQ0FBQ0MsS0FBSyxDQUFDTixHQUFHLENBQUNFLFVBQVU7Z0JBQUVySDtnQkFBTWtDO1lBQU87UUFDNUY7UUFFQSxNQUFNNkgsc0JBQXFCMUMsT0FBTyxFQUFFckgsSUFBSSxFQUFFa0MsTUFBTTtZQUM5QyxPQUFPLE1BQU1wRSxLQUFLeUksSUFBSSxDQUF3QnpJLEtBQUtlLE1BQU0sQ0FBQzJJLE1BQU0sQ0FBQ3dDLE1BQU0sQ0FBQ0EsTUFBTSxDQUFDM0MsVUFBVTtnQkFBRXJIO2dCQUFNa0M7WUFBTztRQUMxRztRQUVBLE1BQU0rSCxxQkFBb0JqSyxJQUFJLEVBQUVrQyxNQUFNO1lBQ3BDLE9BQU8sTUFBTXBFLEtBQUt5SSxJQUFJLENBQXVCekksS0FBS2UsTUFBTSxDQUFDaUksUUFBUSxDQUFDb0QsTUFBTSxJQUFJO2dCQUFFbEs7Z0JBQU1rQztZQUFPO1FBQzdGO1FBRUEsTUFBTWlJLGVBQWN4RCxTQUFTLEVBQUVuSixPQUFPLEVBQUUwRSxNQUFNO1lBQzVDLE9BQU8sTUFBTXBFLEtBQUt5SSxJQUFJLENBQWlCekksS0FBS2UsTUFBTSxDQUFDaUksUUFBUSxDQUFDc0QsUUFBUSxDQUFDekQsWUFBWTtnQkFDL0UzRyxNQUFNO29CQUNKMkMsTUFBTW5GLFFBQVFtRixJQUFJO29CQUNsQjBILFFBQVE3TSxRQUFRNk0sTUFBTSxHQUFHLE1BQU01TixZQUFZZSxRQUFRNk0sTUFBTSxJQUFJeEs7Z0JBQy9EO2dCQUNBcUM7WUFDRjtRQUNGO1FBRUEsTUFBTW9JLG1CQUFrQmpELE9BQU8sRUFBRWtELE1BQU0sRUFBRXJJLE1BQU07WUFDN0MsTUFBTXBFLEtBQUt5QyxNQUFNLENBQUN6QyxLQUFLZSxNQUFNLENBQUMySSxNQUFNLENBQUNTLE9BQU8sQ0FBQ3VDLElBQUksQ0FBQ25ELFNBQVNrRCxTQUFTO2dCQUFFckk7WUFBTztRQUMvRTtRQUVBLE1BQU11SSxlQUFjOUQsU0FBUyxFQUFFekUsTUFBTTtZQUNuQyxNQUFNcEUsS0FBS3lDLE1BQU0sQ0FBQ3pDLEtBQUtlLE1BQU0sQ0FBQ2lJLFFBQVEsQ0FBQzRELE9BQU8sQ0FBQy9ELFlBQVk7Z0JBQ3pEekU7WUFDRjtRQUNGO1FBRUEsTUFBTXlJLGlDQUFnQ2hFLFNBQVMsRUFBRWlFLFdBQVcsRUFBRTFJLE1BQU07WUFDbEUsTUFBTXBFLEtBQUt5QyxNQUFNLENBQUN6QyxLQUFLZSxNQUFNLENBQUNpSSxRQUFRLENBQUMrRCxTQUFTLENBQUNsRSxXQUFXaUUsY0FBYztnQkFBRTFJO1lBQU87UUFDckY7UUFFQSxNQUFNNEksYUFBWXpELE9BQU8sRUFBRTBELEVBQUUsRUFBRTdJLE1BQU07WUFDbkMsTUFBTXBFLEtBQUt5QyxNQUFNLENBQUN6QyxLQUFLZSxNQUFNLENBQUMySSxNQUFNLENBQUN3RCxLQUFLLENBQUMzRCxTQUFTMEQsS0FBSztnQkFBRTdJO1lBQU87UUFDcEU7UUFFQSxNQUFNK0ksd0JBQXVCRixFQUFFO1lBQzdCLE1BQU1qTixLQUFLeUMsTUFBTSxDQUFDekMsS0FBS2UsTUFBTSxDQUFDcU0sZ0JBQWdCLENBQUNwTixLQUFLTCxhQUFhLEVBQUVzTjtRQUNyRTtRQUVBLE1BQU1JLHVCQUFzQnhOLEtBQUssRUFBRWlKLFNBQVM7WUFDMUMsTUFBTTlJLEtBQUt5QyxNQUFNLENBQUN6QyxLQUFLZSxNQUFNLENBQUM4SixZQUFZLENBQUN5QyxTQUFTLENBQUNsRixPQUFPLENBQUNwSSxLQUFLTCxhQUFhLEVBQUVFLE9BQU9pSixZQUFZO2dCQUFFM0UsY0FBYztZQUFLO1FBQzNIO1FBRUEsTUFBTW9KLGdDQUErQkMsU0FBUztZQUM1QyxNQUFNeE4sS0FBS3lDLE1BQU0sQ0FBQ3pDLEtBQUtlLE1BQU0sQ0FBQzhKLFlBQVksQ0FBQ0MsUUFBUSxDQUFDMkMsT0FBTyxDQUFDek4sS0FBS0wsYUFBYSxFQUFFNk47UUFDbEY7UUFFQSxNQUFNRSxhQUFZbkUsT0FBTztZQUN2QixNQUFNdkosS0FBS3lDLE1BQU0sQ0FBQ3pDLEtBQUtlLE1BQU0sQ0FBQzJJLE1BQU0sQ0FBQ2lFLEtBQUssQ0FBQ3BFO1FBQzdDO1FBRUEsTUFBTXFFLCtCQUE4QkosU0FBUyxFQUFFakUsT0FBTztZQUNwRCxNQUFNdkosS0FBS3lDLE1BQU0sQ0FBQ3pDLEtBQUtlLE1BQU0sQ0FBQzhKLFlBQVksQ0FBQ0MsUUFBUSxDQUFDcEIsTUFBTSxDQUFDbUUsR0FBRyxDQUFDN04sS0FBS0wsYUFBYSxFQUFFNEosU0FBU2lFO1FBQzlGO1FBRUEsTUFBTU0sb0JBQW1CdkUsT0FBTyxFQUFFd0UsU0FBUyxFQUFFM0osTUFBTTtZQUNqRCxNQUFNcEUsS0FBS3lDLE1BQU0sQ0FBQ3pDLEtBQUtlLE1BQU0sQ0FBQzJJLE1BQU0sQ0FBQ3NFLE9BQU8sQ0FBQ3pFLFNBQVN3RSxZQUFZO2dCQUFFM0o7WUFBTztRQUM3RTtRQUVBLE1BQU02SixxQkFBb0IxRSxPQUFPLEVBQUUyQixZQUFZO1lBQzdDLE1BQU1sTCxLQUFLeUMsTUFBTSxDQUFDekMsS0FBS2UsTUFBTSxDQUFDMkksTUFBTSxDQUFDMEIsU0FBUyxDQUFDdUMsS0FBSyxDQUFDcEUsU0FBUzJCO1FBQ2hFO1FBRUEsTUFBTWdELG1CQUFrQjNFLE9BQU8sRUFBRTRFLGFBQWEsRUFBRS9KLE1BQU07WUFDcEQsTUFBTXBFLEtBQUt5QyxNQUFNLENBQUN6QyxLQUFLZSxNQUFNLENBQUMySSxNQUFNLENBQUMwRSxXQUFXLENBQUM3RSxTQUFTNEUsZ0JBQWdCO2dCQUFFL0o7WUFBTztRQUNyRjtRQUVBLE1BQU1pSyxjQUFhQyxVQUFVLEVBQUVsSyxNQUFNO1lBQ25DLE1BQU1wRSxLQUFLeUMsTUFBTSxDQUFDekMsS0FBS2UsTUFBTSxDQUFDMkksTUFBTSxDQUFDNkUsTUFBTSxDQUFDRCxhQUFhO2dCQUFFbEs7WUFBTztRQUNwRTtRQUVBLE1BQU1vSyxlQUFjM0YsU0FBUyxFQUFFQyxTQUFTLEVBQUUxRSxNQUFNO1lBQzlDLE1BQU1wRSxLQUFLeUMsTUFBTSxDQUFDekMsS0FBS2UsTUFBTSxDQUFDaUksUUFBUSxDQUFDWixPQUFPLENBQUNTLFdBQVdDLFlBQVk7Z0JBQUUxRTtZQUFPO1FBQ2pGO1FBRUEsTUFBTXFLLGdCQUFlNUYsU0FBUyxFQUFFNkYsVUFBVSxFQUFFdEssTUFBTTtZQUNoRCxNQUFNcEUsS0FBS3lJLElBQUksQ0FBQ3pJLEtBQUtlLE1BQU0sQ0FBQ2lJLFFBQVEsQ0FBQzJGLElBQUksQ0FBQzlGLFlBQVk7Z0JBQ3BEM0csTUFBTTtvQkFDSjBNLFVBQVVGLFdBQVdHLEtBQUssQ0FBQyxHQUFHLEtBQUt0TCxHQUFHLENBQUMsQ0FBQzBKLEtBQU9BLEdBQUdoSixRQUFRO2dCQUM1RDtnQkFDQUc7WUFDRjtRQUNGO1FBRUEsTUFBTTBLLG1DQUFrQ2pQLEtBQUs7WUFDM0MsTUFBTUcsS0FBS3lDLE1BQU0sQ0FBQ3pDLEtBQUtlLE1BQU0sQ0FBQzhKLFlBQVksQ0FBQ3lDLFNBQVMsQ0FBQ3lCLFFBQVEsQ0FBQy9PLEtBQUtMLGFBQWEsRUFBRUUsUUFBUTtnQkFBRXNFLGNBQWM7WUFBSztRQUNqSDtRQUVBLE1BQU02SyxtQkFBa0JuRyxTQUFTLEVBQUVDLFNBQVMsRUFBRUMsUUFBUTtZQUNwREEsV0FBV3JLLHNCQUFzQnFLO1lBRWpDLE1BQU0vSSxLQUFLeUMsTUFBTSxDQUFDekMsS0FBS2UsTUFBTSxDQUFDaUksUUFBUSxDQUFDQyxTQUFTLENBQUNDLEdBQUcsQ0FBQ0wsV0FBV0MsV0FBV0M7UUFDN0U7UUFFQSxNQUFNa0csb0JBQW1CcEcsU0FBUyxFQUFFQyxTQUFTO1lBQzNDLE1BQU05SSxLQUFLeUMsTUFBTSxDQUFDekMsS0FBS2UsTUFBTSxDQUFDaUksUUFBUSxDQUFDQyxTQUFTLENBQUNJLEdBQUcsQ0FBQ1IsV0FBV0M7UUFDbEU7UUFFQSxNQUFNb0csc0JBQXFCckcsU0FBUyxFQUFFQyxTQUFTLEVBQUVDLFFBQVE7WUFDdkRBLFdBQVdySyxzQkFBc0JxSztZQUVqQyxNQUFNL0ksS0FBS3lDLE1BQU0sQ0FBQ3pDLEtBQUtlLE1BQU0sQ0FBQ2lJLFFBQVEsQ0FBQ0MsU0FBUyxDQUFDaUUsS0FBSyxDQUFDckUsV0FBV0MsV0FBV0M7UUFDL0U7UUFFQSxNQUFNb0csWUFBVzVGLE9BQU8sRUFBRUUsTUFBTSxFQUFFckYsTUFBTTtZQUN0QyxNQUFNcEUsS0FBS3lDLE1BQU0sQ0FBQ3pDLEtBQUtlLE1BQU0sQ0FBQzJJLE1BQU0sQ0FBQ0MsS0FBSyxDQUFDa0UsR0FBRyxDQUFDdEUsU0FBU0UsU0FBUztnQkFBRXJGO1lBQU87UUFDNUU7UUFFQSxNQUFNZ0wsc0JBQXFCN0YsT0FBTyxFQUFFOEYsT0FBTztZQUN6QyxNQUFNclAsS0FBS3lDLE1BQU0sQ0FBQ3pDLEtBQUtlLE1BQU0sQ0FBQzJJLE1BQU0sQ0FBQ3dDLE1BQU0sQ0FBQ29ELEtBQUssQ0FBQy9GLFNBQVM4RjtRQUM3RDtRQUVBLE1BQU1FLHFCQUFvQjFHLFNBQVMsRUFBRXpFLE1BQU07WUFDekMsTUFBTXBFLEtBQUt5QyxNQUFNLENBQUN6QyxLQUFLZSxNQUFNLENBQUNpSSxRQUFRLENBQUN3RyxLQUFLLENBQUMzRyxZQUFZO2dCQUFFekU7WUFBTztRQUNwRTtRQUVBLE1BQU1xTCxvQkFBbUI1RyxTQUFTLEVBQUVDLFNBQVMsRUFBRVUsTUFBTSxFQUFFVCxRQUFRO1lBQzdEQSxXQUFXckssc0JBQXNCcUs7WUFFakMsTUFBTS9JLEtBQUt5QyxNQUFNLENBQUN6QyxLQUFLZSxNQUFNLENBQUNpSSxRQUFRLENBQUNDLFNBQVMsQ0FBQ2MsSUFBSSxDQUFDbEIsV0FBV0MsV0FBV0MsVUFBVVM7UUFDeEY7UUFFQSxNQUFNa0csZUFBY0MsU0FBUyxFQUFFdkwsTUFBTTtZQUNuQyxNQUFNcEUsS0FBS3lDLE1BQU0sQ0FBQ3pDLEtBQUtlLE1BQU0sQ0FBQ3VMLFFBQVEsQ0FBQ1csRUFBRSxDQUFDMEMsWUFBWTtnQkFBRXZMO1lBQU87UUFDakU7UUFFQSxNQUFNd0wsc0JBQXFCRCxTQUFTLEVBQUU5UCxLQUFLLEVBQUVpSixTQUFTLEVBQUVwSixPQUFPO1lBQzdELE1BQU1NLEtBQUt5QyxNQUFNLENBQUN6QyxLQUFLZSxNQUFNLENBQUN1TCxRQUFRLENBQUNsRSxPQUFPLENBQUN1SCxXQUFXOVAsT0FBT2lKLFdBQVdwSjtRQUM5RTtRQUVBLE1BQU1tUSx3QkFBdUJGLFNBQVMsRUFBRTlQLEtBQUs7WUFDM0MsTUFBTUcsS0FBS3lDLE1BQU0sQ0FBQ3pDLEtBQUtlLE1BQU0sQ0FBQ3VMLFFBQVEsQ0FBQ3dELE9BQU8sQ0FBQ0gsV0FBVzlQLFFBQVE7Z0JBQ2hFc0UsY0FBYztZQUNoQjtRQUNGO1FBRUEsTUFBTTRMLG1DQUFrQ3hHLE9BQU8sRUFBRWlFLFNBQVMsRUFBRTVDLFdBQVcsRUFBRW9GLFdBQVc7WUFDbEYsT0FBTyxNQUFNaFEsS0FBSzJJLEdBQUcsQ0FDbkIzSSxLQUFLZSxNQUFNLENBQUM4SixZQUFZLENBQUNDLFFBQVEsQ0FBQ21GLFVBQVUsQ0FBQ2pRLEtBQUtMLGFBQWEsRUFBRTRKLFNBQVNpRSxZQUMxRTtnQkFDRXRMLE1BQU07b0JBQ0o4TjtnQkFDRjtnQkFDQWxPLFNBQVM7b0JBQUU3QixlQUFlLENBQUMsT0FBTyxFQUFFMkssYUFBYTtnQkFBQztZQUNwRDtRQUVKO1FBRUEsTUFBTXNGLGlCQUFnQjNHLE9BQU8sRUFBRWtELE1BQU0sRUFBRXZLLElBQUksRUFBRWtDLE1BQU07WUFDakQsT0FBTyxNQUFNcEUsS0FBSzBJLEtBQUssQ0FBNEIxSSxLQUFLZSxNQUFNLENBQUMySSxNQUFNLENBQUNTLE9BQU8sQ0FBQ3VDLElBQUksQ0FBQ25ELFNBQVNrRCxTQUFTO2dCQUFFdks7Z0JBQU1rQztZQUFPO1FBQ3RIO1FBRUEsTUFBTStMLGdCQUFlelEsT0FBTztZQUMxQixNQUFNNk0sU0FBUzdNLFNBQVMwUSxlQUFlLE1BQU16UixZQUFZZSxTQUFTMFEsZ0JBQWdCMVEsU0FBUzBRO1lBQzNGLE1BQU1DLFNBQVMzUSxTQUFTNFEsZUFBZSxNQUFNM1IsWUFBWWUsU0FBUzRRLGdCQUFnQjVRLFNBQVM0UTtZQUUzRixPQUFPLE1BQU10USxLQUFLMEksS0FBSyxDQUFjMUksS0FBS2UsTUFBTSxDQUFDd1AsV0FBVyxJQUFJO2dCQUM5RHJPLE1BQU07b0JBQ0pzTyxVQUFVOVEsUUFBUThRLFFBQVEsRUFBRUM7b0JBQzVCbEU7b0JBQ0E4RDtnQkFDRjtZQUNGO1FBQ0Y7UUFFQSxNQUFNSyxhQUFZN0gsU0FBUyxFQUFFM0csSUFBSSxFQUFFa0MsTUFBTTtZQUN2QyxPQUFPLE1BQU1wRSxLQUFLMEksS0FBSyxDQUFpQjFJLEtBQUtlLE1BQU0sQ0FBQ2lJLFFBQVEsQ0FBQzRELE9BQU8sQ0FBQy9ELFlBQVk7Z0JBQUUzRztnQkFBTWtDO1lBQU87UUFDbEc7UUFFQSxNQUFNdU0sZ0NBQStCOUgsU0FBUyxFQUFFM0csSUFBSSxFQUFFa0MsTUFBTTtZQUMxRCxNQUFNcEUsS0FBSzJJLEdBQUcsQ0FBQzNJLEtBQUtlLE1BQU0sQ0FBQ2lJLFFBQVEsQ0FBQytELFNBQVMsQ0FBQ2xFLFdBQVczRyxLQUFLK0ssRUFBRSxHQUFHO2dCQUFFL0s7Z0JBQU1rQztZQUFPO1FBQ3BGO1FBRUEsTUFBTXdNLHNCQUFxQnJILE9BQU8sRUFBRXJILElBQUk7WUFDdEMsTUFBTWxDLEtBQUswSSxLQUFLLENBQUMxSSxLQUFLZSxNQUFNLENBQUMySSxNQUFNLENBQUNWLFFBQVEsQ0FBQ08sVUFBVTtnQkFBRXJIO1lBQUs7UUFDaEU7UUFFQSxNQUFNMk8sV0FBVXRILE9BQU8sRUFBRTBELEVBQUUsRUFBRS9LLElBQUksRUFBRWtDLE1BQU07WUFDdkMsT0FBTyxNQUFNcEUsS0FBSzBJLEtBQUssQ0FBZTFJLEtBQUtlLE1BQU0sQ0FBQzJJLE1BQU0sQ0FBQ3dELEtBQUssQ0FBQzNELFNBQVMwRCxLQUFLO2dCQUFFL0s7Z0JBQU1rQztZQUFPO1FBQzlGO1FBRUEsTUFBTTBNLHNCQUFxQjdELEVBQUUsRUFBRS9LLElBQUk7WUFDakMsT0FBTyxNQUFNbEMsS0FBSzBJLEtBQUssQ0FBZTFJLEtBQUtlLE1BQU0sQ0FBQ3FNLGdCQUFnQixDQUFDcE4sS0FBS0wsYUFBYSxFQUFFc04sS0FBSztnQkFBRS9LO1lBQUs7UUFDckc7UUFFQSxNQUFNNk8scUJBQW9CbFIsS0FBSyxFQUFFaUosU0FBUyxFQUFFNUcsSUFBSTtZQUM5QyxPQUFPLE1BQU1sQyxLQUFLMEksS0FBSyxDQUFpQjFJLEtBQUtlLE1BQU0sQ0FBQzhKLFlBQVksQ0FBQ3lDLFNBQVMsQ0FBQ2xGLE9BQU8sQ0FBQ3BJLEtBQUtMLGFBQWEsRUFBRUUsT0FBT2lKLFlBQVk7Z0JBQ3hINUc7Z0JBQ0FvQyxPQUFPcEMsS0FBS29DLEtBQUs7Z0JBQ2pCSCxjQUFjO1lBQ2hCO1FBQ0Y7UUFFQSxNQUFNNk0sOEJBQTZCeEQsU0FBUyxFQUFFdEwsSUFBSTtZQUNoRCxPQUFPLE1BQU1sQyxLQUFLMEksS0FBSyxDQUE0QjFJLEtBQUtlLE1BQU0sQ0FBQzhKLFlBQVksQ0FBQ0MsUUFBUSxDQUFDMkMsT0FBTyxDQUFDek4sS0FBS0wsYUFBYSxFQUFFNk4sWUFBWTtnQkFBRXRMO1lBQUs7UUFDdEk7UUFFQSxNQUFNK08sV0FBVTFILE9BQU8sRUFBRXJILElBQUksRUFBRWtDLE1BQU07WUFDbkMsT0FBTyxNQUFNcEUsS0FBSzBJLEtBQUssQ0FBZTFJLEtBQUtlLE1BQU0sQ0FBQzJJLE1BQU0sQ0FBQ2lFLEtBQUssQ0FBQ3BFLFVBQVU7Z0JBQUVySDtnQkFBTWtDO1lBQU87UUFDMUY7UUFFQSxNQUFNOE0sNkJBQTRCMUQsU0FBUyxFQUFFakUsT0FBTyxFQUFFckgsSUFBSTtZQUN4RCxPQUFPLE1BQU1sQyxLQUFLMEksS0FBSyxDQUE0QjFJLEtBQUtlLE1BQU0sQ0FBQzhKLFlBQVksQ0FBQ0MsUUFBUSxDQUFDcEIsTUFBTSxDQUFDbUUsR0FBRyxDQUFDN04sS0FBS0wsYUFBYSxFQUFFNEosU0FBU2lFLFlBQVk7Z0JBQ3ZJdEw7WUFDRjtRQUNGO1FBRUEsTUFBTWlQLG1CQUFrQjVILE9BQWtCLEVBQUU2SCxRQUFtQixFQUFFaE4sTUFBZTtZQUM5RSxNQUFNcEUsS0FBS3lJLElBQUksQ0FBQ3pJLEtBQUtlLE1BQU0sQ0FBQzJJLE1BQU0sQ0FBQzJILEdBQUcsQ0FBQzlILFVBQVU7Z0JBQUVySCxNQUFNO29CQUFFb1AsT0FBT0Y7Z0JBQVM7Z0JBQUdoTjtZQUFPO1FBQ3ZGO1FBRUEsTUFBTW1OLGtCQUFpQmhJLE9BQU8sRUFBRXdFLFNBQVMsRUFBRTdMLElBQUksRUFBRWtDLE1BQU07WUFDckQsT0FBTyxNQUFNcEUsS0FBSzBJLEtBQUssQ0FBaUIxSSxLQUFLZSxNQUFNLENBQUMySSxNQUFNLENBQUNzRSxPQUFPLENBQUN6RSxTQUFTd0UsWUFBWTtnQkFBRTdMO2dCQUFNa0M7WUFBTztRQUN6RztRQUVBLE1BQU1vTixtQkFBa0JqSSxPQUFPLEVBQUUyQixZQUFvQixFQUFFaEosSUFBeUI7WUFDOUUsT0FBTyxNQUFNbEMsS0FBSzBJLEtBQUssQ0FBa0IxSSxLQUFLZSxNQUFNLENBQUMySSxNQUFNLENBQUMwQixTQUFTLENBQUN1QyxLQUFLLENBQUNwRSxTQUFTMkIsZUFBZTtnQkFBRWhKO1lBQUs7UUFDN0c7UUFFQSxNQUFNdVAsYUFBWTVJLFNBQVMsRUFBRUMsU0FBUyxFQUFFNUcsSUFBSTtZQUMxQyxPQUFPLE1BQU1sQyxLQUFLMEksS0FBSyxDQUFpQjFJLEtBQUtlLE1BQU0sQ0FBQ2lJLFFBQVEsQ0FBQ1osT0FBTyxDQUFDUyxXQUFXQyxZQUFZO2dCQUFFNUc7Z0JBQU1vQyxPQUFPcEMsS0FBS29DLEtBQUs7WUFBQztRQUN4SDtRQUVBLE1BQU1vTixpQ0FBZ0M3UixLQUFLLEVBQUVxQyxJQUFJO1lBQy9DLE9BQU8sTUFBTWxDLEtBQUswSSxLQUFLLENBQWlCMUksS0FBS2UsTUFBTSxDQUFDOEosWUFBWSxDQUFDeUMsU0FBUyxDQUFDeUIsUUFBUSxDQUFDL08sS0FBS0wsYUFBYSxFQUFFRSxRQUFRO2dCQUM5R3FDO2dCQUNBb0MsT0FBT3BDLEtBQUtvQyxLQUFLO1lBQ25CO1FBQ0Y7UUFFQSxNQUFNcU4sNEJBQTJCaEMsU0FBUyxFQUFFOVAsS0FBSyxFQUFFSCxPQUFPO1lBQ3hELE9BQU8sTUFBTU0sS0FBSzBJLEtBQUssQ0FBaUIxSSxLQUFLZSxNQUFNLENBQUN1TCxRQUFRLENBQUN5QyxRQUFRLENBQUNZLFdBQVc5UCxPQUFPSCxVQUFVO2dCQUNoR3dDLE1BQU07b0JBQ0owUCxNQUFNelQseUJBQXlCMFQsYUFBYTtvQkFDNUN2SixNQUFNNUk7Z0JBQ1I7Z0JBQ0E0RSxPQUFPNUUsUUFBUTRFLEtBQUs7Z0JBQ3BCSCxjQUFjO1lBQ2hCO1FBQ0Y7UUFFQSxNQUFNMk4sbUJBQWtCdkksT0FBTyxFQUFFN0osT0FBTztZQUN0QyxNQUFNTSxLQUFLMEksS0FBSyxDQUFDMUksS0FBS2UsTUFBTSxDQUFDMkksTUFBTSxDQUFDcUksS0FBSyxDQUFDeEksVUFBVTtnQkFDbERySCxNQUFNO29CQUNKLEdBQUd4QyxPQUFPO29CQUNWc1MseUJBQXlCdFMsUUFBUXNTLHVCQUF1QixHQUNwRCxJQUFJeFEsS0FBSzlCLFFBQVFzUyx1QkFBdUIsRUFBRUMsV0FBVyxLQUNyRHZTLFFBQVFzUyx1QkFBdUI7Z0JBQ3JDO1lBQ0Y7UUFDRjtRQUVBLE1BQU1FLG9CQUFtQjNJLE9BQU8sRUFBRThGLE9BQU8sRUFBRW5OLElBQUksRUFBRWtDLE1BQU07WUFDckQsT0FBTyxNQUFNcEUsS0FBSzBJLEtBQUssQ0FBd0IxSSxLQUFLZSxNQUFNLENBQUMySSxNQUFNLENBQUN3QyxNQUFNLENBQUNvRCxLQUFLLENBQUMvRixTQUFTOEYsVUFBVTtnQkFBRW5OO2dCQUFNa0M7WUFBTztRQUNuSDtRQUVBLE1BQU0rTixVQUFTNUksT0FBTyxFQUFFRSxNQUFNLEVBQUV2SCxJQUFJLEVBQUVrQyxNQUFNO1lBQzFDLE9BQU8sTUFBTXBFLEtBQUswSSxLQUFLLENBQWMxSSxLQUFLZSxNQUFNLENBQUMySSxNQUFNLENBQUNDLEtBQUssQ0FBQ2tFLEdBQUcsQ0FBQ3RFLFNBQVNFLFNBQVM7Z0JBQUV2SDtnQkFBTWtDO1lBQU87UUFDckc7UUFFQSxNQUFNZ08sbUJBQWtCN0ksT0FBTyxFQUFFckgsSUFBSSxFQUFFa0MsTUFBTTtZQUMzQyxPQUFPLE1BQU1wRSxLQUFLMEksS0FBSyxDQUFnQjFJLEtBQUtlLE1BQU0sQ0FBQzJJLE1BQU0sQ0FBQ0MsS0FBSyxDQUFDTixHQUFHLENBQUNFLFVBQVU7Z0JBQUVySDtnQkFBTWtDO1lBQU87UUFDL0Y7UUFFQSxNQUFNaU8sbUJBQWtCeEosU0FBUyxFQUFFeUosS0FBSyxFQUFFbE8sTUFBZTtZQUN2RCxPQUFPLE1BQU1wRSxLQUFLMEksS0FBSyxDQUF1QjFJLEtBQUtlLE1BQU0sQ0FBQ2lJLFFBQVEsQ0FBQ3dHLEtBQUssQ0FBQzNHLFlBQVk7Z0JBQUUzRyxNQUFNO29CQUFFb1E7Z0JBQU07Z0JBQUdsTztZQUFPO1FBQ2pIO1FBRUEsTUFBTW1PLG9CQUFtQmhKLE9BQU8sRUFBRTdKLE9BQU87WUFDdkMsTUFBTU0sS0FBSzBJLEtBQUssQ0FBQzFJLEtBQUtlLE1BQU0sQ0FBQzJJLE1BQU0sQ0FBQ3FJLEtBQUssQ0FBQ3hJLFNBQVM3SixRQUFROEosTUFBTSxHQUFHO2dCQUFFdEgsTUFBTXhDO1lBQVE7UUFDdEY7UUFFQSxNQUFNOFMsYUFBWTdDLFNBQVMsRUFBRXpOLElBQUksRUFBRWtDLE1BQU07WUFDdkMsT0FBTyxNQUFNcEUsS0FBSzBJLEtBQUssQ0FBaUIxSSxLQUFLZSxNQUFNLENBQUN1TCxRQUFRLENBQUNXLEVBQUUsQ0FBQzBDLFlBQVk7Z0JBQUV6TjtnQkFBTWtDO1lBQU87UUFDN0Y7UUFFQSxNQUFNcU8sb0JBQW1COUMsU0FBUyxFQUFFOVAsS0FBSyxFQUFFaUosU0FBUyxFQUFFcEosT0FBTztZQUMzRCxPQUFPLE1BQU1NLEtBQUswSSxLQUFLLENBQWlCMUksS0FBS2UsTUFBTSxDQUFDdUwsUUFBUSxDQUFDbEUsT0FBTyxDQUFDdUgsV0FBVzlQLE9BQU9pSixXQUFXcEosVUFBVTtnQkFDMUd3QyxNQUFNeEM7Z0JBQ040RSxPQUFPNUUsUUFBUTRFLEtBQUs7Z0JBQ3BCSCxjQUFjO1lBQ2hCO1FBQ0Y7UUFFQSxNQUFNdU8sc0JBQXFCL0MsU0FBUyxFQUFFOVAsS0FBSyxFQUFFcUMsSUFBSTtZQUMvQyxPQUFPLE1BQU1sQyxLQUFLMEksS0FBSyxDQUFpQjFJLEtBQUtlLE1BQU0sQ0FBQ3VMLFFBQVEsQ0FBQ3dELE9BQU8sQ0FBQ0gsV0FBVzlQLFFBQVE7Z0JBQ3RGcUM7Z0JBQ0FpQyxjQUFjO1lBQ2hCO1FBQ0Y7UUFFQSxNQUFNd08sbUJBQWtCcEosT0FBTyxFQUFFckgsSUFBSSxFQUFFa0MsTUFBTTtZQUMzQyxPQUFPLE1BQU1wRSxLQUFLMEksS0FBSyxDQUF1QjFJLEtBQUtlLE1BQU0sQ0FBQzJJLE1BQU0sQ0FBQ2tKLE9BQU8sQ0FBQ3JKLFVBQVU7Z0JBQUVySDtnQkFBTWtDO1lBQU87UUFDcEc7UUFFQSxNQUFNeU8sb0JBQW1CdEosT0FBTyxFQUFFckgsSUFBSSxFQUFFa0MsTUFBTTtZQUM1QyxPQUFPLE1BQU1wRSxLQUFLMEksS0FBSyxDQUE2QjFJLEtBQUtlLE1BQU0sQ0FBQzJJLE1BQU0sQ0FBQ29KLE1BQU0sQ0FBQ3ZKLFVBQVU7Z0JBQUVySDtnQkFBTWtDO1lBQU87UUFDekc7UUFFQSxNQUFNMk8sZ0JBQWVwRCxTQUFTLEVBQUU5UCxLQUFLLEVBQUVILE9BQU87WUFDNUMsT0FBTyxNQUFNTSxLQUFLeUksSUFBSSxDQUFpQnpJLEtBQUtlLE1BQU0sQ0FBQ3VMLFFBQVEsQ0FBQ3dELE9BQU8sQ0FBQ0gsV0FBVzlQLE9BQU9ILFVBQVU7Z0JBQzlGd0MsTUFBTXhDO2dCQUNOeUUsY0FBYztZQUNoQjtRQUNGO1FBRUEsTUFBTTZPLG9CQUFtQkMsZUFBZSxFQUFFQyxlQUFlLEVBQUU5TyxNQUFNO1lBQy9ELE9BQU8sTUFBTXBFLEtBQUt5SSxJQUFJLENBQXlCekksS0FBS2UsTUFBTSxDQUFDaUksUUFBUSxDQUFDbUssTUFBTSxDQUFDRixrQkFBa0I7Z0JBQzNGL1EsTUFBTTtvQkFDSmtSLGtCQUFrQkY7Z0JBQ3BCO2dCQUNBOU87WUFDRjtRQUNGO1FBRUEsTUFBTWlQLGtCQUFpQjlKLE9BQU87WUFDNUIsT0FBTyxNQUFNdkosS0FBS3FCLEdBQUcsQ0FBMkJyQixLQUFLZSxNQUFNLENBQUNpSSxRQUFRLENBQUNjLE9BQU8sQ0FBQ3dKLE1BQU0sQ0FBQy9KO1FBQ3RGO1FBRUEsTUFBTWdLLGlDQUFnQ2hLLE9BQU8sRUFBRWlFLFNBQVMsRUFBRTlOLE9BQU87WUFDL0QsTUFBTWlMLGNBQWdELENBQUM7WUFFdkQsSUFBSWpMLFNBQVM4VCxhQUFhO2dCQUN4QjdJLFlBQVl4RyxZQUFZLEdBQUc7Z0JBQzNCd0csWUFBWTdJLE9BQU8sR0FBRztvQkFDcEI3QixlQUFlLENBQUMsT0FBTyxFQUFFUCxRQUFROFQsV0FBVyxFQUFFO2dCQUNoRDtZQUNGO1lBRUEsT0FBTyxNQUFNeFQsS0FBS3FCLEdBQUcsQ0FDbkJyQixLQUFLZSxNQUFNLENBQUM4SixZQUFZLENBQUNDLFFBQVEsQ0FBQ21GLFVBQVUsQ0FBQ3ZRLFNBQVNDLGlCQUFpQkssS0FBS0wsYUFBYSxFQUFFNEosU0FBU2lFLFlBQ3BHN0M7UUFFSjtRQUVBLE1BQU04SSxrQ0FBaUNsSyxPQUFPLEVBQUU3SixPQUFPO1lBQ3JELE1BQU1pTCxjQUFnRCxDQUFDO1lBRXZELElBQUlqTCxTQUFTOFQsYUFBYTtnQkFDeEI3SSxZQUFZeEcsWUFBWSxHQUFHO2dCQUMzQndHLFlBQVk3SSxPQUFPLEdBQUc7b0JBQ3BCN0IsZUFBZSxDQUFDLE9BQU8sRUFBRVAsUUFBUThULFdBQVcsRUFBRTtnQkFDaEQ7WUFDRjtZQUVBLE9BQU8sTUFBTXhULEtBQUtxQixHQUFHLENBQ25CckIsS0FBS2UsTUFBTSxDQUFDOEosWUFBWSxDQUFDQyxRQUFRLENBQUNrRixXQUFXLENBQUN0USxTQUFTQyxpQkFBaUJLLEtBQUtMLGFBQWEsRUFBRTRKLFVBQzVGb0I7UUFFSjtRQUVBLE1BQU0rSTtZQUNKLE9BQU8sTUFBTTFULEtBQUtxQixHQUFHLENBQXFCckIsS0FBS2UsTUFBTSxDQUFDNFMsTUFBTSxDQUFDQyxXQUFXO1FBQzFFO1FBRUEsTUFBTUMscUJBQW9CM1IsSUFBSTtZQUM1QixPQUFPLE1BQU1sQyxLQUFLMEksS0FBSyxDQUFxQjFJLEtBQUtlLE1BQU0sQ0FBQzZTLFdBQVcsSUFBSTtnQkFDckUxUjtZQUNGO1FBQ0Y7UUFFQSxNQUFNNFIsOEJBQTZCalUsS0FBSztZQUN0QyxPQUFPLE1BQU1HLEtBQUtxQixHQUFHLENBQThCckIsS0FBS2UsTUFBTSxDQUFDNFMsTUFBTSxDQUFDSSxvQkFBb0IsSUFBSTtnQkFDNUZqUyxTQUFTO29CQUNQN0IsZUFBZSxDQUFDLE9BQU8sRUFBRUosT0FBTztnQkFDbEM7Z0JBQ0FzRSxjQUFjO1lBQ2hCO1FBQ0Y7UUFFQSxNQUFNNlAsZUFBY0MsUUFBUSxFQUFFQyxZQUFZLEVBQUVoUyxJQUFJO1lBQzlDLE1BQU1pUyxtQkFBbUJqVyxPQUFPa1csSUFBSSxDQUFDLEdBQUdILFNBQVMsQ0FBQyxFQUFFQyxjQUFjO1lBRWxFLE1BQU12SixjQUFrQztnQkFDdEN6STtnQkFDQUosU0FBUztvQkFDUCxnQkFBZ0I7b0JBQ2hCN0IsZUFBZSxDQUFDLE1BQU0sRUFBRWtVLGlCQUFpQmxRLFFBQVEsQ0FBQyxXQUFXO2dCQUMvRDtnQkFDQTRELGlCQUFpQjtnQkFDakIxRCxjQUFjO1lBQ2hCO1lBRUEsSUFBSWpDLEtBQUttUyxTQUFTLEtBQUssc0JBQXNCO2dCQUMzQzFKLFlBQVl6SSxJQUFJLENBQUNvUyxLQUFLLEdBQUdwUyxLQUFLb1MsS0FBSyxDQUFDcFAsSUFBSSxDQUFDO1lBQzNDO1lBRUEsT0FBTyxNQUFNbEYsS0FBS3lJLElBQUksQ0FBNkJ6SSxLQUFLZSxNQUFNLENBQUM0UyxNQUFNLENBQUNZLGFBQWEsSUFBSTVKO1FBQ3pGO1FBRUEsTUFBTTZKLGFBQVlQLFFBQVEsRUFBRUMsWUFBWSxFQUFFaFMsSUFBSTtZQUM1QyxNQUFNaVMsbUJBQW1CalcsT0FBT2tXLElBQUksQ0FBQyxHQUFHSCxTQUFTLENBQUMsRUFBRUMsY0FBYztZQUVsRSxNQUFNbFUsS0FBS3lJLElBQUksQ0FBQ3pJLEtBQUtlLE1BQU0sQ0FBQzRTLE1BQU0sQ0FBQ2MsV0FBVyxJQUFJO2dCQUNoRHZTO2dCQUNBSixTQUFTO29CQUNQLGdCQUFnQjtvQkFDaEI3QixlQUFlLENBQUMsTUFBTSxFQUFFa1UsaUJBQWlCbFEsUUFBUSxDQUFDLFdBQVc7Z0JBQy9EO2dCQUNBRSxjQUFjO1lBQ2hCO1FBQ0Y7UUFFQSxNQUFNdVEsYUFBWW5MLE9BQU8sRUFBRTdKLE9BQU87WUFDaEMsT0FBTyxNQUFNTSxLQUFLcUIsR0FBRyxDQUFrQnJCLEtBQUtlLE1BQU0sQ0FBQzJJLE1BQU0sQ0FBQ2lMLFNBQVMsQ0FBQ3BMLFNBQVM3SjtRQUMvRTtRQUVBLE1BQU1rVixnQkFBZXJMLE9BQU8sRUFBRWtELE1BQU07WUFDbEMsT0FBTyxNQUFNek0sS0FBS3FCLEdBQUcsQ0FBNEJyQixLQUFLZSxNQUFNLENBQUMySSxNQUFNLENBQUNTLE9BQU8sQ0FBQ3VDLElBQUksQ0FBQ25ELFNBQVNrRDtRQUM1RjtRQUVBLE1BQU1vSSxpQkFBZ0J0TCxPQUFPO1lBQzNCLE9BQU8sTUFBTXZKLEtBQUtxQixHQUFHLENBQThCckIsS0FBS2UsTUFBTSxDQUFDMkksTUFBTSxDQUFDUyxPQUFPLENBQUNDLEtBQUssQ0FBQ2I7UUFDdEY7UUFFQSxNQUFNdUw7WUFDSixPQUFPLE1BQU05VSxLQUFLcUIsR0FBRyxDQUF1QnJCLEtBQUtlLE1BQU0sQ0FBQ2dVLE9BQU87UUFDakU7UUFFQSxNQUFNQyxRQUFPekwsT0FBTyxFQUFFQyxNQUFNO1lBQzFCLE9BQU8sTUFBTXhKLEtBQUtxQixHQUFHLENBQWFyQixLQUFLZSxNQUFNLENBQUMySSxNQUFNLENBQUN1TCxPQUFPLENBQUNDLEdBQUcsQ0FBQzNMLFNBQVNDO1FBQzVFO1FBRUEsTUFBTTJMLFNBQVE1TCxPQUFPLEVBQUU3SixPQUFPO1lBQzVCLE9BQU8sTUFBTU0sS0FBS3FCLEdBQUcsQ0FBZXJCLEtBQUtlLE1BQU0sQ0FBQzJJLE1BQU0sQ0FBQ3VMLE9BQU8sQ0FBQ0csSUFBSSxDQUFDN0wsU0FBUzdKO1FBQy9FO1FBRUEsTUFBTTJWLFlBQVdwSSxFQUFFO1lBQ2pCLE9BQU8sTUFBTWpOLEtBQUtxQixHQUFHLENBQWlCckIsS0FBS2UsTUFBTSxDQUFDaUksUUFBUSxDQUFDNEQsT0FBTyxDQUFDSztRQUNyRTtRQUVBLE1BQU1xSSxtQkFBa0J6TSxTQUFTO1lBQy9CLE9BQU8sTUFBTTdJLEtBQUtxQixHQUFHLENBQTBCckIsS0FBS2UsTUFBTSxDQUFDaUksUUFBUSxDQUFDK0MsT0FBTyxDQUFDbEQ7UUFDOUU7UUFFQSxNQUFNME0sYUFBWWhNLE9BQU87WUFDdkIsT0FBTyxNQUFNdkosS0FBS3FCLEdBQUcsQ0FBbUJyQixLQUFLZSxNQUFNLENBQUMySSxNQUFNLENBQUNWLFFBQVEsQ0FBQ087UUFDdEU7UUFFQSxNQUFNaU0sb0JBQW1CM00sU0FBUztZQUNoQyxPQUFPLE1BQU03SSxLQUFLcUIsR0FBRyxDQUFtQnJCLEtBQUtlLE1BQU0sQ0FBQ2lJLFFBQVEsQ0FBQ3NELFFBQVEsQ0FBQ3pEO1FBQ3hFO1FBRUEsTUFBTTRNLGNBQWFqTSxNQUFNO1lBQ3ZCLE9BQU8sTUFBTXhKLEtBQUt5SSxJQUFJLENBQWlCekksS0FBS2UsTUFBTSxDQUFDaUksUUFBUSxDQUFDME0sRUFBRSxJQUFJO2dCQUNoRXhULE1BQU07b0JBQUV5VCxhQUFhbk07Z0JBQU87WUFDOUI7UUFDRjtRQUVBLE1BQU1vTSxtQkFBa0IxVCxJQUFJO1lBQzFCLE9BQU8sTUFBTWxDLEtBQUt5SSxJQUFJLENBQWlCekksS0FBS2UsTUFBTSxDQUFDaUksUUFBUSxDQUFDME0sRUFBRSxJQUFJO2dCQUNoRXhUO1lBQ0Y7UUFDRjtRQUVBLE1BQU0yVCxVQUFTdE0sT0FBTyxFQUFFdU0sT0FBTztZQUM3QixPQUFPLE1BQU05VixLQUFLcUIsR0FBRyxDQUFlckIsS0FBS2UsTUFBTSxDQUFDMkksTUFBTSxDQUFDd0QsS0FBSyxDQUFDM0QsU0FBU3VNO1FBQ3hFO1FBRUEsTUFBTUMscUJBQW9CRCxPQUFPO1lBQy9CLE9BQU8sTUFBTTlWLEtBQUtxQixHQUFHLENBQWVyQixLQUFLZSxNQUFNLENBQUNxTSxnQkFBZ0IsQ0FBQ3BOLEtBQUtMLGFBQWEsRUFBRW1XO1FBQ3ZGO1FBRUEsTUFBTUUsV0FBVXpNLE9BQU87WUFDckIsT0FBTyxNQUFNdkosS0FBS3FCLEdBQUcsQ0FBaUJyQixLQUFLZSxNQUFNLENBQUMySSxNQUFNLENBQUNhLE1BQU0sQ0FBQ2hCO1FBQ2xFO1FBRUEsTUFBTTBNO1lBQ0osT0FBTyxNQUFNalcsS0FBS3FCLEdBQUcsQ0FBNEJyQixLQUFLZSxNQUFNLENBQUMwSixpQkFBaUIsQ0FBQ3pLLEtBQUtMLGFBQWE7UUFDbkc7UUFFQSxNQUFNdVcsb0JBQW1CclcsS0FBSyxFQUFFaUosU0FBUztZQUN2QyxPQUFPLE1BQU05SSxLQUFLcUIsR0FBRyxDQUFpQnJCLEtBQUtlLE1BQU0sQ0FBQzhKLFlBQVksQ0FBQ3lDLFNBQVMsQ0FBQ2xGLE9BQU8sQ0FBQ3BJLEtBQUtMLGFBQWEsRUFBRUUsT0FBT2lKLFlBQVk7Z0JBQUUzRSxjQUFjO1lBQUs7UUFDL0k7UUFFQSxNQUFNZ1M7WUFDSixPQUFPLE1BQU1uVyxLQUFLcUIsR0FBRyxDQUF1QnJCLEtBQUtlLE1BQU0sQ0FBQ3FWLFVBQVU7UUFDcEU7UUFFQSxNQUFNQyw2QkFBNEI3SSxTQUFTO1lBQ3pDLE9BQU8sTUFBTXhOLEtBQUtxQixHQUFHLENBQTRCckIsS0FBS2UsTUFBTSxDQUFDOEosWUFBWSxDQUFDQyxRQUFRLENBQUMyQyxPQUFPLENBQUN6TixLQUFLTCxhQUFhLEVBQUU2TjtRQUNqSDtRQUVBLE1BQU04STtZQUNKLE9BQU8sTUFBTXRXLEtBQUtxQixHQUFHLENBQThCckIsS0FBS2UsTUFBTSxDQUFDOEosWUFBWSxDQUFDQyxRQUFRLENBQUNBLFFBQVEsQ0FBQzlLLEtBQUtMLGFBQWE7UUFDbEg7UUFFQSxNQUFNNFcsVUFBU2hOLE9BQU8sRUFBRTdKLFVBQVU7WUFBRThXLFFBQVE7UUFBSyxDQUFDO1lBQ2hELE9BQU8sTUFBTXhXLEtBQUtxQixHQUFHLENBQWVyQixLQUFLZSxNQUFNLENBQUMySSxNQUFNLENBQUNpRSxLQUFLLENBQUNwRSxTQUFTN0osUUFBUThXLE1BQU07UUFDdEY7UUFFQSxNQUFNQyxXQUFVNVcsS0FBSyxFQUFFSCxPQUFPO1lBQzVCLE1BQU1nWCxxQkFBcUQ3VyxRQUN2RDtnQkFDRWlDLFNBQVM7b0JBQ1A3QixlQUFlLENBQUMsT0FBTyxFQUFFSixPQUFPO2dCQUNsQztnQkFDQXNFLGNBQWM7WUFDaEIsSUFDQXBDO1lBRUosT0FBTyxNQUFNL0IsS0FBS3FCLEdBQUcsQ0FBMEJyQixLQUFLZSxNQUFNLENBQUMySSxNQUFNLENBQUNpTixVQUFVLENBQUNqWCxVQUFVZ1g7UUFDekY7UUFFQSxNQUFNRSw0QkFBMkJwSixTQUFTLEVBQUVqRSxPQUFPO1lBQ2pELE9BQU8sTUFBTXZKLEtBQUtxQixHQUFHLENBQTRCckIsS0FBS2UsTUFBTSxDQUFDOEosWUFBWSxDQUFDQyxRQUFRLENBQUNwQixNQUFNLENBQUNtRSxHQUFHLENBQUM3TixLQUFLTCxhQUFhLEVBQUU0SixTQUFTaUU7UUFDN0g7UUFFQSxNQUFNcUosNkJBQTRCdE4sT0FBTztZQUN2QyxPQUFPLE1BQU12SixLQUFLcUIsR0FBRyxDQUE4QnJCLEtBQUtlLE1BQU0sQ0FBQzhKLFlBQVksQ0FBQ0MsUUFBUSxDQUFDcEIsTUFBTSxDQUFDTCxHQUFHLENBQUNySixLQUFLTCxhQUFhLEVBQUU0SjtRQUN0SDtRQUVBLE1BQU11TixpQkFBZ0J2TixPQUFPO1lBQzNCLE9BQU8sTUFBTXZKLEtBQUtxQixHQUFHLENBQXNCckIsS0FBS2UsTUFBTSxDQUFDMkksTUFBTSxDQUFDcU4sT0FBTyxDQUFDeE47UUFDeEU7UUFFQSxNQUFNeU4sa0JBQWlCOUwsWUFBWTtZQUNqQyxPQUFPLE1BQU1sTCxLQUFLcUIsR0FBRyxDQUFrQnJCLEtBQUtlLE1BQU0sQ0FBQzJJLE1BQU0sQ0FBQzBCLFNBQVMsQ0FBQ0MsSUFBSSxDQUFDSDtRQUMzRTtRQUVBLE1BQU0rTCxtQkFBa0IxTixPQUFPO1lBQzdCLE9BQU8sTUFBTXZKLEtBQUtxQixHQUFHLENBQW9CckIsS0FBS2UsTUFBTSxDQUFDMkksTUFBTSxDQUFDMEIsU0FBUyxDQUFDL0IsR0FBRyxDQUFDRTtRQUM1RTtRQUVBLE1BQU0yTixrQkFBaUIzTixPQUFPO1lBQzVCLE9BQU8sTUFBTXZKLEtBQUtxQixHQUFHLENBQW1CckIsS0FBS2UsTUFBTSxDQUFDMkksTUFBTSxDQUFDNEMsUUFBUSxDQUFDL0M7UUFDdEU7UUFFQSxNQUFNNE4saUJBQWdCNU4sT0FBTztZQUMzQixPQUFPLE1BQU12SixLQUFLcUIsR0FBRyxDQUF1QnJCLEtBQUtlLE1BQU0sQ0FBQzJJLE1BQU0sQ0FBQzBOLFlBQVksQ0FBQzdOO1FBQzlFO1FBRUEsTUFBTThOLFdBQVUvSSxVQUFVLEVBQUU1TyxPQUFPO1lBQ2pDLE9BQU8sTUFBTU0sS0FBS3FCLEdBQUcsQ0FBd0JyQixLQUFLZSxNQUFNLENBQUMySSxNQUFNLENBQUM2RSxNQUFNLENBQUNELFlBQVk1TztRQUNyRjtRQUVBLE1BQU00WCxZQUFXL04sT0FBTztZQUN0QixPQUFPLE1BQU12SixLQUFLcUIsR0FBRyxDQUEwQnJCLEtBQUtlLE1BQU0sQ0FBQzJJLE1BQU0sQ0FBQ3FDLE9BQU8sQ0FBQ3hDO1FBQzVFO1FBRUEsTUFBTWdPLFlBQVcxTyxTQUFTLEVBQUVDLFNBQVM7WUFDbkMsT0FBTyxNQUFNOUksS0FBS3FCLEdBQUcsQ0FBaUJyQixLQUFLZSxNQUFNLENBQUNpSSxRQUFRLENBQUNaLE9BQU8sQ0FBQ1MsV0FBV0M7UUFDaEY7UUFFQSxNQUFNME8sYUFBWTNPLFNBQVMsRUFBRW5KLE9BQU87WUFDbEMsT0FBTyxNQUFNTSxLQUFLcUIsR0FBRyxDQUFtQnJCLEtBQUtlLE1BQU0sQ0FBQ2lJLFFBQVEsQ0FBQzRGLFFBQVEsQ0FBQy9GLFdBQVduSjtRQUNuRjtRQUVBLE1BQU0rWCxnQkFBZUMsYUFBYTtZQUNoQyxPQUFPLE1BQU0xWCxLQUFLcUIsR0FBRyxDQUFxQnJCLEtBQUtlLE1BQU0sQ0FBQzRXLFdBQVcsQ0FBQ0Q7UUFDcEU7UUFFQSxNQUFNRTtZQUNKLE9BQU8sTUFBTTVYLEtBQUtxQixHQUFHLENBQXVCckIsS0FBS2UsTUFBTSxDQUFDOFcsWUFBWTtRQUN0RTtRQUVBLE1BQU1DLGdDQUErQmpZLEtBQUs7WUFDeEMsT0FBTyxNQUFNRyxLQUFLcUIsR0FBRyxDQUFpQnJCLEtBQUtlLE1BQU0sQ0FBQzhKLFlBQVksQ0FBQ3lDLFNBQVMsQ0FBQ3lCLFFBQVEsQ0FBQy9PLEtBQUtMLGFBQWEsRUFBRUUsUUFBUTtnQkFBRXNFLGNBQWM7WUFBSztRQUNySTtRQUVBLE1BQU00VCxtQkFBa0JsUCxTQUFTO1lBQy9CLE9BQU8sTUFBTTdJLEtBQUtxQixHQUFHLENBQW1CckIsS0FBS2UsTUFBTSxDQUFDaUksUUFBUSxDQUFDZ1AsSUFBSSxDQUFDblA7UUFDcEU7UUFFQSxNQUFNb1AsMkJBQTBCcFAsU0FBUyxFQUFFbkosT0FBTztZQUNoRCxPQUFPLE1BQU1NLEtBQUtxQixHQUFHLENBQTZCckIsS0FBS2UsTUFBTSxDQUFDaUksUUFBUSxDQUFDYyxPQUFPLENBQUNvTyxPQUFPLENBQUNyUCxXQUFXbko7UUFDcEc7UUFFQSxNQUFNeVksaUNBQWdDdFAsU0FBUyxFQUFFbkosT0FBTztZQUN0RCxPQUFPLE1BQU1NLEtBQUtxQixHQUFHLENBQTZCckIsS0FBS2UsTUFBTSxDQUFDaUksUUFBUSxDQUFDYyxPQUFPLENBQUNzTyxNQUFNLENBQUN2UCxXQUFXbko7UUFDbkc7UUFFQSxNQUFNMlksZUFBYzlPLE9BQU8sRUFBRTdKLE9BQU87WUFDbEMsT0FBTyxNQUFNTSxLQUFLcUIsR0FBRyxDQUFxQnJCLEtBQUtlLE1BQU0sQ0FBQzJJLE1BQU0sQ0FBQzRPLEtBQUssQ0FBQy9PLFNBQVM3SjtRQUM5RTtRQUVBLE1BQU02WSwwQkFBeUIxUCxTQUFTLEVBQUVuSixPQUFPO1lBQy9DLE9BQU8sTUFBTU0sS0FBS3FCLEdBQUcsQ0FBNkJyQixLQUFLZSxNQUFNLENBQUNpSSxRQUFRLENBQUNjLE9BQU8sQ0FBQzBPLE1BQU0sQ0FBQzNQLFdBQVduSjtRQUNuRztRQUVBLE1BQU0rWSxVQUFTbFAsT0FBTztZQUNwQixPQUFPLE1BQU12SixLQUFLcUIsR0FBRyxDQUFnQnJCLEtBQUtlLE1BQU0sQ0FBQzJJLE1BQU0sQ0FBQ0MsS0FBSyxDQUFDTixHQUFHLENBQUNFO1FBQ3BFO1FBRUEsTUFBTW1QLFNBQVFuUCxPQUFPLEVBQUVFLE1BQU07WUFDM0IsT0FBTyxNQUFNekosS0FBS3FCLEdBQUcsQ0FBY3JCLEtBQUtlLE1BQU0sQ0FBQzJJLE1BQU0sQ0FBQ0MsS0FBSyxDQUFDa0UsR0FBRyxDQUFDdEUsU0FBU0U7UUFDM0U7UUFFQSxNQUFNa1AsbUJBQWtCcFAsT0FBTyxFQUFFOEYsT0FBTyxFQUFFM1AsT0FBTztZQUMvQyxPQUFPLE1BQU1NLEtBQUtxQixHQUFHLENBQXdCckIsS0FBS2UsTUFBTSxDQUFDMkksTUFBTSxDQUFDd0MsTUFBTSxDQUFDb0QsS0FBSyxDQUFDL0YsU0FBUzhGLFNBQVMzUCxTQUFTa1o7UUFDMUc7UUFFQSxNQUFNQyxvQkFBbUJ0UCxPQUFPLEVBQUU3SixPQUFPO1lBQ3ZDLE9BQU8sTUFBTU0sS0FBS3FCLEdBQUcsQ0FBMEJyQixLQUFLZSxNQUFNLENBQUMySSxNQUFNLENBQUN3QyxNQUFNLENBQUNBLE1BQU0sQ0FBQzNDLFNBQVM3SixTQUFTa1o7UUFDcEc7UUFFQSxNQUFNRSx3QkFBdUJ2UCxPQUFPLEVBQUU4RixPQUFPLEVBQUUzUCxPQUFPO1lBQ3BELE9BQU8sTUFBTU0sS0FBS3FCLEdBQUcsQ0FBdURyQixLQUFLZSxNQUFNLENBQUMySSxNQUFNLENBQUN3QyxNQUFNLENBQUM2TSxLQUFLLENBQUN4UCxTQUFTOEYsU0FBUzNQO1FBQ2hJO1FBRUEsTUFBTXNaO1lBQ0osT0FBTyxNQUFNaFosS0FBS21XLGFBQWE7UUFDakM7UUFFQSxNQUFNOEMsa0JBQWlCcFEsU0FBUztZQUM5QixPQUFPLE1BQU03SSxLQUFLcUIsR0FBRyxDQUF1QnJCLEtBQUtlLE1BQU0sQ0FBQ2lJLFFBQVEsQ0FBQ3dHLEtBQUssQ0FBQzNHO1FBQ3pFO1FBRUEsTUFBTXFRLGtCQUFpQjNQLE9BQU87WUFDNUIsT0FBTyxNQUFNdkosS0FBS3FCLEdBQUcsQ0FBb0JyQixLQUFLZSxNQUFNLENBQUMySSxNQUFNLENBQUNxSSxLQUFLLENBQUN4STtRQUNwRTtRQUVBLE1BQU00UCxtQkFBa0I1UCxPQUFPLEVBQUVDLE1BQU07WUFDckMsT0FBTyxNQUFNeEosS0FBS3FCLEdBQUcsQ0FBb0JyQixLQUFLZSxNQUFNLENBQUMySSxNQUFNLENBQUNxSSxLQUFLLENBQUN4SSxTQUFTQztRQUM3RTtRQUVBLE1BQU00UCxZQUFXckwsU0FBb0I7WUFDbkMsT0FBTyxNQUFNL04sS0FBS3FCLEdBQUcsQ0FBaUJyQixLQUFLZSxNQUFNLENBQUNpTixPQUFPLENBQUNEO1FBQzVEO1FBRUEsTUFBTXNMLGlCQUFnQjlQLE9BQU8sRUFBRXdFLFNBQVM7WUFDdEMsT0FBTyxNQUFNL04sS0FBS3FCLEdBQUcsQ0FBaUJyQixLQUFLZSxNQUFNLENBQUMySSxNQUFNLENBQUNzRSxPQUFPLENBQUN6RSxTQUFTd0U7UUFDNUU7UUFFQSxNQUFNdUwsa0JBQWlCL1AsT0FBTztZQUM1QixPQUFPLE1BQU12SixLQUFLcUIsR0FBRyxDQUFtQnJCLEtBQUtlLE1BQU0sQ0FBQzJJLE1BQU0sQ0FBQ2dDLFFBQVEsQ0FBQ25DO1FBQ3RFO1FBRUEsTUFBTWdRLGlCQUFnQjFRLFNBQVMsRUFBRVcsTUFBTTtZQUNyQyxPQUFPLE1BQU14SixLQUFLcUIsR0FBRyxDQUFzQnJCLEtBQUtlLE1BQU0sQ0FBQ2lJLFFBQVEsQ0FBQ2MsT0FBTyxDQUFDQyxJQUFJLENBQUNsQixXQUFXVztRQUMxRjtRQUVBLE1BQU1nUSxrQkFBaUIzUSxTQUFTO1lBQzlCLE9BQU8sTUFBTTdJLEtBQUtxQixHQUFHLENBQXdCckIsS0FBS2UsTUFBTSxDQUFDaUksUUFBUSxDQUFDYyxPQUFPLENBQUNtTCxPQUFPLENBQUNwTTtRQUNwRjtRQUVBLE1BQU00USxjQUFhNVEsU0FBUyxFQUFFQyxTQUFTLEVBQUVDLFFBQVEsRUFBRXJKLE9BQU87WUFDeEQsT0FBTyxNQUFNTSxLQUFLcUIsR0FBRyxDQUFnQnJCLEtBQUtlLE1BQU0sQ0FBQ2lJLFFBQVEsQ0FBQ0MsU0FBUyxDQUFDYixPQUFPLENBQUNTLFdBQVdDLFdBQVdDLFVBQVVySjtRQUM5RztRQUVBLE1BQU1nYSxTQUFRek0sRUFBRTtZQUNkLE9BQU8sTUFBTWpOLEtBQUtxQixHQUFHLENBQWNyQixLQUFLZSxNQUFNLENBQUNnSixJQUFJLENBQUNrRDtRQUN0RDtRQUVBLE1BQU0wTSxnQkFBZTlaLEtBQUs7WUFDeEIsT0FBTyxNQUFNRyxLQUFLcUIsR0FBRyxDQUFjckIsS0FBS2UsTUFBTSxDQUFDd1AsV0FBVyxJQUFJO2dCQUM1RHpPLFNBQVM7b0JBQ1A3QixlQUFlLENBQUMsT0FBTyxFQUFFSixPQUFPO2dCQUNsQztnQkFDQXNFLGNBQWM7WUFDaEI7UUFDRjtRQUVBLE1BQU15VixvQkFBbUIvWixLQUFLO1lBQzVCLE9BQU8sTUFBTUcsS0FBS3FCLEdBQUcsQ0FBc0JyQixLQUFLZSxNQUFNLENBQUM0UyxNQUFNLENBQUNrRyxXQUFXLElBQUk7Z0JBQzNFL1gsU0FBUztvQkFDUDdCLGVBQWUsQ0FBQyxPQUFPLEVBQUVKLE9BQU87Z0JBQ2xDO2dCQUNBc0UsY0FBYztZQUNoQjtRQUNGO1FBRUEsTUFBTTJWLGtDQUFpQ2phLEtBQUssRUFBRUYsYUFBYTtZQUN6RCxPQUFPLE1BQU1LLEtBQUtxQixHQUFHLENBQW1DckIsS0FBS2UsTUFBTSxDQUFDNFMsTUFBTSxDQUFDb0csZUFBZSxDQUFDcGEsZ0JBQWdCO2dCQUN6R21DLFNBQVM7b0JBQ1A3QixlQUFlLENBQUMsT0FBTyxFQUFFSixPQUFPO2dCQUNsQztnQkFDQXNFLGNBQWM7WUFDaEI7UUFDRjtRQUVBLE1BQU02VixjQUFhelEsT0FBTztZQUN4QixPQUFPLE1BQU12SixLQUFLcUIsR0FBRyxDQUFtQnJCLEtBQUtlLE1BQU0sQ0FBQzJJLE1BQU0sQ0FBQ3VRLE1BQU0sQ0FBQzFRO1FBQ3BFO1FBRUEsTUFBTTJRLGlCQUFnQjNRLE9BQU87WUFDM0IsT0FBTyxNQUFNdkosS0FBS3FCLEdBQUcsQ0FBdUJyQixLQUFLZSxNQUFNLENBQUMySSxNQUFNLENBQUNxTCxPQUFPLENBQUN4TDtRQUN6RTtRQUVBLE1BQU00USxZQUFXeEssU0FBUztZQUN4QixPQUFPLE1BQU0zUCxLQUFLcUIsR0FBRyxDQUFpQnJCLEtBQUtlLE1BQU0sQ0FBQ3VMLFFBQVEsQ0FBQ1csRUFBRSxDQUFDMEM7UUFDaEU7UUFFQSxNQUFNeUssbUJBQWtCekssU0FBUyxFQUFFOVAsS0FBSyxFQUFFaUosU0FBUyxFQUFFcEosT0FBTztZQUMxRCxPQUFPLE1BQU1NLEtBQUtxQixHQUFHLENBQWlCckIsS0FBS2UsTUFBTSxDQUFDdUwsUUFBUSxDQUFDbEUsT0FBTyxDQUFDdUgsV0FBVzlQLE9BQU9pSixXQUFXcEosVUFBVTtnQkFDeEd5RSxjQUFjO1lBQ2hCO1FBQ0Y7UUFFQSxNQUFNa1cscUJBQW9CMUssU0FBUyxFQUFFOVAsS0FBSztZQUN4QyxPQUFPLE1BQU1HLEtBQUtxQixHQUFHLENBQWlCckIsS0FBS2UsTUFBTSxDQUFDdUwsUUFBUSxDQUFDd0QsT0FBTyxDQUFDSCxXQUFXOVAsUUFBUTtnQkFDcEZzRSxjQUFjO1lBQ2hCO1FBQ0Y7UUFFQSxNQUFNbVcsa0JBQWlCL1EsT0FBTztZQUM1QixPQUFPLE1BQU12SixLQUFLcUIsR0FBRyxDQUF1QnJCLEtBQUtlLE1BQU0sQ0FBQzJJLE1BQU0sQ0FBQ2tKLE9BQU8sQ0FBQ3JKO1FBQ3pFO1FBRUEsTUFBTWdSLFdBQVVoUixPQUFPO1lBQ3JCLE9BQU8sTUFBTXZKLEtBQUtxQixHQUFHLENBQXFCckIsS0FBS2UsTUFBTSxDQUFDMkksTUFBTSxDQUFDOFEsVUFBVSxDQUFDalI7UUFDMUU7UUFFQSxNQUFNa1IsbUJBQWtCbFIsT0FBTztZQUM3QixPQUFPLE1BQU12SixLQUFLcUIsR0FBRyxDQUE2QnJCLEtBQUtlLE1BQU0sQ0FBQzJJLE1BQU0sQ0FBQ29KLE1BQU0sQ0FBQ3ZKO1FBQzlFO1FBRUEsTUFBTW1SLFlBQVc3UixTQUFTO1lBQ3hCLE1BQU03SSxLQUFLMkksR0FBRyxDQUFDM0ksS0FBS2UsTUFBTSxDQUFDaUksUUFBUSxDQUFDYyxPQUFPLENBQUM2USxFQUFFLENBQUM5UjtRQUNqRDtRQUVBLE1BQU0rUixZQUFXclIsT0FBTztZQUN0QixNQUFNdkosS0FBS3lDLE1BQU0sQ0FBQ3pDLEtBQUtlLE1BQU0sQ0FBQzJJLE1BQU0sQ0FBQ21SLEtBQUssQ0FBQ3RSO1FBQzdDO1FBRUEsTUFBTXVSLGFBQVlqUyxTQUFTO1lBQ3pCLE1BQU03SSxLQUFLeUMsTUFBTSxDQUFDekMsS0FBS2UsTUFBTSxDQUFDaUksUUFBUSxDQUFDYyxPQUFPLENBQUM2USxFQUFFLENBQUM5UjtRQUNwRDtRQUVBLE1BQU1rUyxnQkFBZWxTLFNBQVMsRUFBRUMsU0FBUztZQUN2QyxPQUFPLE1BQU05SSxLQUFLeUksSUFBSSxDQUFpQnpJLEtBQUtlLE1BQU0sQ0FBQ2lJLFFBQVEsQ0FBQ2dTLFNBQVMsQ0FBQ25TLFdBQVdDO1FBQ25GO1FBRUEsTUFBTW1TLFlBQVcxUixPQUFPLEVBQUVDLE1BQU0sRUFBRUMsTUFBTSxFQUFFckYsTUFBTTtZQUM5QyxNQUFNcEUsS0FBS3lDLE1BQU0sQ0FBQ3pDLEtBQUtlLE1BQU0sQ0FBQzJJLE1BQU0sQ0FBQ0MsS0FBSyxDQUFDQyxNQUFNLENBQUNMLFNBQVNDLFFBQVFDLFNBQVM7Z0JBQUVyRjtZQUFPO1FBQ3ZGO1FBRUEsTUFBTThXLG9CQUFtQnJTLFNBQVMsRUFBRVcsTUFBTTtZQUN4QyxNQUFNeEosS0FBS3lDLE1BQU0sQ0FBQ3pDLEtBQUtlLE1BQU0sQ0FBQ2lJLFFBQVEsQ0FBQ2MsT0FBTyxDQUFDQyxJQUFJLENBQUNsQixXQUFXVztRQUNqRTtRQUVBLE1BQU0yUixtQkFBa0J0UyxTQUFTLEVBQUVXLE1BQU07WUFDdkMsTUFBTXhKLEtBQUt5QyxNQUFNLENBQUN6QyxLQUFLZSxNQUFNLENBQUNpSSxRQUFRLENBQUNpQixXQUFXLENBQUNwQixXQUFXVztRQUNoRTtRQUVBLE1BQU00UixxQkFBb0J2YixLQUFLLEVBQUVILE9BQU87WUFDdEMsT0FBTyxNQUFNTSxLQUFLeUksSUFBSSxDQUFDekksS0FBS2UsTUFBTSxDQUFDdUwsUUFBUSxDQUFDd0QsT0FBTyxDQUFDOVAsS0FBS0wsYUFBYSxFQUFFRSxRQUFRO2dCQUM5RXFDLE1BQU14QztnQkFDTjRFLE9BQU81RSxRQUFRNEUsS0FBSztnQkFDcEJILGNBQWM7WUFDaEI7UUFDRjtRQUVBLE1BQU1rWCx5QkFBd0JDLGFBQWEsRUFBRXpiLEtBQUssRUFBRUgsT0FBTyxFQUFFNmIsTUFBTTtZQUNqRSxPQUFPLE1BQU12YixLQUFLeUksSUFBSSxDQUE0Q3pJLEtBQUtlLE1BQU0sQ0FBQzhKLFlBQVksQ0FBQ3lDLFNBQVMsQ0FBQ2tPLFFBQVEsQ0FBQ0YsZUFBZXpiLE9BQU8wYixTQUFTO2dCQUMzSXJaLE1BQU14QztnQkFDTjRFLE9BQU81RSxRQUFRNEksSUFBSSxFQUFFaEU7Z0JBQ3JCdUQsaUJBQWlCO2dCQUNqQjFELGNBQWM7WUFDaEI7UUFDRjtRQUVBLE1BQU1zWCxhQUFZNVMsU0FBUyxFQUFFM0csSUFBSTtZQUMvQixPQUFPLE1BQU1sQyxLQUFLeUksSUFBSSxDQUFpQnpJLEtBQUtlLE1BQU0sQ0FBQ2lJLFFBQVEsQ0FBQzRGLFFBQVEsQ0FBQy9GLFlBQVk7Z0JBQUUzRztnQkFBTW9DLE9BQU9wQyxLQUFLb0MsS0FBSztZQUFDO1FBQzdHO1FBRUEsTUFBTW9YLHdCQUF1QjdTLFNBQVMsRUFBRUMsU0FBUyxFQUFFNUcsSUFBSSxFQUFFa0MsTUFBTTtZQUM3RCxPQUFPLE1BQU1wRSxLQUFLeUksSUFBSSxDQUFpQnpJLEtBQUtlLE1BQU0sQ0FBQ2lJLFFBQVEsQ0FBQ2MsT0FBTyxDQUFDMUIsT0FBTyxDQUFDUyxXQUFXQyxZQUFZO2dCQUFFNUc7Z0JBQU1rQztZQUFPO1FBQ3BIO1FBRUEsTUFBTXVYLDJCQUEwQjlTLFNBQVMsRUFBRTNHLElBQUksRUFBRWtDLE1BQU07WUFDckQsT0FBTyxNQUFNcEUsS0FBS3lJLElBQUksQ0FBaUJ6SSxLQUFLZSxNQUFNLENBQUNpSSxRQUFRLENBQUNjLE9BQU8sQ0FBQ1QsR0FBRyxDQUFDUixZQUFZO2dCQUFFM0c7Z0JBQU1rQztZQUFPO1FBQ3JHO1FBRUEsTUFBTXdYLHFCQUFvQi9TLFNBQVMsRUFBRUMsU0FBUyxFQUFFK1MsUUFBUSxFQUFFbmMsT0FBTztZQUMvRCxPQUFPLE1BQU1NLEtBQUtxQixHQUFHLENBQWdDckIsS0FBS2UsTUFBTSxDQUFDaUksUUFBUSxDQUFDOFMsS0FBSyxDQUFDQyxLQUFLLENBQUNsVCxXQUFXQyxXQUFXK1MsVUFBVW5jO1FBQ3hIO1FBRUEsTUFBTXNjLFNBQVFuVCxTQUFTLEVBQUVDLFNBQVM7WUFDaEMsT0FBTyxNQUFNOUksS0FBS3lJLElBQUksQ0FBaUJ6SSxLQUFLZSxNQUFNLENBQUNpSSxRQUFRLENBQUM4UyxLQUFLLENBQUNHLE1BQU0sQ0FBQ3BULFdBQVdDO1FBQ3RGO1FBRUEsTUFBTW9ULG1CQUFrQjNTLE9BQU87WUFDN0IsT0FBTyxNQUFNdkosS0FBSzJJLEdBQUcsQ0FBa0IzSSxLQUFLZSxNQUFNLENBQUMySSxNQUFNLENBQUMwQixTQUFTLENBQUMvQixHQUFHLENBQUNFO1FBQzFFO1FBRUEsTUFBTTRTLFdBQVU1UyxPQUFPLEVBQUVDLE1BQU0sRUFBRXRILElBQUksRUFBRWtDLE1BQU07WUFDM0MsTUFBTXBFLEtBQUsySSxHQUFHLENBQU8zSSxLQUFLZSxNQUFNLENBQUMySSxNQUFNLENBQUN1TCxPQUFPLENBQUNDLEdBQUcsQ0FBQzNMLFNBQVNDLFNBQVM7Z0JBQUV0SDtnQkFBTWtDO1lBQU87UUFDdkY7UUFFQSxNQUFNZ1ksZ0JBQWU3UyxPQUFPLEVBQUU3SixPQUFPLEVBQUUwRSxNQUFNO1lBQzNDLE9BQU8sTUFBTXBFLEtBQUt5SSxJQUFJLENBQWlCekksS0FBS2UsTUFBTSxDQUFDMkksTUFBTSxDQUFDdUwsT0FBTyxDQUFDb0gsT0FBTyxDQUFDOVMsVUFBVTtnQkFBRXJILE1BQU14QztnQkFBUzBFO1lBQU87UUFDOUc7UUFFQSxNQUFNa1ksZUFBYy9TLE9BQU8sRUFBRXJILElBQUksRUFBRWtDLE1BQU07WUFDdkMsT0FBTyxNQUFNcEUsS0FBSzBJLEtBQUssQ0FBZ0IxSSxLQUFLZSxNQUFNLENBQUMySSxNQUFNLENBQUN1TCxPQUFPLENBQUMvTCxHQUFHLENBQUNLLFVBQVU7Z0JBQUVySDtnQkFBTWtDO1lBQU87UUFDakc7UUFFQSxNQUFNbVksWUFBV2hULE9BQU8sRUFBRUMsTUFBTSxFQUFFdEgsSUFBSSxFQUFFa0MsTUFBTTtZQUM1QyxPQUFPLE1BQU1wRSxLQUFLMEksS0FBSyxDQUF3QjFJLEtBQUtlLE1BQU0sQ0FBQzJJLE1BQU0sQ0FBQ3VMLE9BQU8sQ0FBQ3JMLE1BQU0sQ0FBQ0wsU0FBU0MsU0FBUztnQkFBRXRIO2dCQUFNa0M7WUFBTztRQUNwSDtRQUVBLE1BQU1vWSxXQUFValQsT0FBTyxFQUFFQyxNQUFNO1lBQzdCLE9BQU8sTUFBTXhKLEtBQUtxQixHQUFHLENBQXdCckIsS0FBS2UsTUFBTSxDQUFDMkksTUFBTSxDQUFDdUwsT0FBTyxDQUFDckwsTUFBTSxDQUFDTCxTQUFTQztRQUMxRjtRQUVBLE1BQU1pVCxrQkFBaUJsVCxPQUFPLEVBQUUxSixLQUFLO1lBQ25DLE9BQU8sTUFBTUcsS0FBS3FCLEdBQUcsQ0FBd0JyQixLQUFLZSxNQUFNLENBQUMySSxNQUFNLENBQUN1TCxPQUFPLENBQUN5SCxhQUFhLENBQUNuVCxVQUFVO2dCQUM5RnpILFNBQVM7b0JBQ1A3QixlQUFlLENBQUMsT0FBTyxFQUFFSixPQUFPO2dCQUNsQztnQkFDQXNFLGNBQWM7WUFDaEI7UUFDRjtRQUVBLE1BQU13WSxZQUFXcFQsT0FBTyxFQUFFN0osT0FBTztZQUMvQixPQUFPLE1BQU1NLEtBQUtxQixHQUFHLENBQTBCckIsS0FBS2UsTUFBTSxDQUFDMkksTUFBTSxDQUFDdUwsT0FBTyxDQUFDQSxPQUFPLENBQUMxTCxTQUFTN0o7UUFDN0Y7UUFFQSxNQUFNa2QsZ0NBQStCamQsYUFBYSxFQUFFa2QsVUFBVTtZQUM1RCxPQUFPLE1BQU03YyxLQUFLcUIsR0FBRyxDQUEwQnJCLEtBQUtlLE1BQU0sQ0FBQytiLDJCQUEyQixDQUFDbmQsZUFBZWtkO1FBQ3hHO1FBRUEsTUFBTUUsWUFBV3hULE9BQU8sRUFBRUMsTUFBTSxFQUFFcEYsTUFBTTtZQUN0QyxNQUFNcEUsS0FBS3lDLE1BQU0sQ0FBQ3pDLEtBQUtlLE1BQU0sQ0FBQzJJLE1BQU0sQ0FBQ3VMLE9BQU8sQ0FBQ3JMLE1BQU0sQ0FBQ0wsU0FBU0MsU0FBUztnQkFDcEVwRjtZQUNGO1FBQ0Y7UUFFQSxNQUFNNFksWUFBV25VLFNBQVMsRUFBRUMsU0FBUyxFQUFFMUUsTUFBTTtZQUMzQyxNQUFNcEUsS0FBSzJJLEdBQUcsQ0FBQzNJLEtBQUtlLE1BQU0sQ0FBQ2lJLFFBQVEsQ0FBQ2lVLEdBQUcsQ0FBQ3BVLFdBQVdDLFlBQVk7Z0JBQUUxRTtZQUFPO1FBQzFFO1FBRUEsTUFBTThZLGNBQWEzVCxPQUFPLEVBQUVySCxJQUFJLEVBQUVrQyxNQUFNO1lBQ3RDLE9BQU8sTUFBTXBFLEtBQUt5SSxJQUFJLENBQTRCekksS0FBS2UsTUFBTSxDQUFDMkksTUFBTSxDQUFDdUwsT0FBTyxDQUFDcUQsS0FBSyxDQUFDL08sVUFBVTtnQkFBRXJIO2dCQUFNa0M7WUFBTztRQUM5RztRQUVBLE1BQU0rWSxlQUFjNVQsT0FBTyxFQUFFNlQsS0FBSyxFQUFFMWQsT0FBTztZQUN6QyxPQUFPLE1BQU1NLEtBQUtxQixHQUFHLENBQTBCckIsS0FBS2UsTUFBTSxDQUFDMkksTUFBTSxDQUFDdUwsT0FBTyxDQUFDb0ksTUFBTSxDQUFDOVQsU0FBUzZULE9BQU8xZDtRQUNuRztRQUVBLE1BQU00ZCxvQkFBbUIvVCxPQUFPO1lBQzlCLE9BQU8sTUFBTXZKLEtBQUtxQixHQUFHLENBQXlCckIsS0FBS2UsTUFBTSxDQUFDMkksTUFBTSxDQUFDNlQsVUFBVSxDQUFDaFU7UUFDOUU7UUFFQSxNQUFNaVUscUJBQW9CalUsT0FBTyxFQUFFN0osT0FBTyxFQUFFMEUsTUFBTTtZQUNoRCxPQUFPLE1BQU1wRSxLQUFLMkksR0FBRyxDQUF5QjNJLEtBQUtlLE1BQU0sQ0FBQzJJLE1BQU0sQ0FBQzZULFVBQVUsQ0FBQ2hVLFVBQVU7Z0JBQ3BGckgsTUFBTXhDO2dCQUNOMEU7WUFDRjtRQUNGO1FBRUEsTUFBTXFaLGFBQVlsVSxPQUFPLEVBQUVDLE1BQU0sRUFBRXBGLE1BQU07WUFDdkMsTUFBTXBFLEtBQUt5QyxNQUFNLENBQUN6QyxLQUFLZSxNQUFNLENBQUMySSxNQUFNLENBQUN1TCxPQUFPLENBQUNDLEdBQUcsQ0FBQzNMLFNBQVNDLFNBQVM7Z0JBQUVwRjtZQUFPO1FBQzlFO1FBRUEsTUFBTXNaLGNBQWE3VSxTQUFTLEVBQUVDLFNBQVMsRUFBRTFFLE1BQU07WUFDN0MsTUFBTXBFLEtBQUt5QyxNQUFNLENBQUN6QyxLQUFLZSxNQUFNLENBQUNpSSxRQUFRLENBQUNpVSxHQUFHLENBQUNwVSxXQUFXQyxZQUFZO2dCQUFFMUU7WUFBTztRQUM3RTtRQUVBLE1BQU11Wix3QkFBdUI5VSxTQUFTO1lBQ3BDLE1BQU03SSxLQUFLeUksSUFBSSxDQUFDekksS0FBS2UsTUFBTSxDQUFDaUksUUFBUSxDQUFDNFUsTUFBTSxDQUFDL1U7UUFDOUM7UUFFQSxNQUFNZ1YsaUNBQWdDM2IsSUFBSSxFQUFFeEMsT0FBTztZQUNqRCxNQUFNaUwsY0FBa0M7Z0JBQUV6STtZQUFLO1lBRS9DLElBQUl4QyxTQUFTa0wsYUFBYTtnQkFDeEJELFlBQVl4RyxZQUFZLEdBQUc7Z0JBQzNCd0csWUFBWTdJLE9BQU8sR0FBRztvQkFDcEI3QixlQUFlLENBQUMsT0FBTyxFQUFFUCxRQUFRa0wsV0FBVyxFQUFFO2dCQUNoRDtZQUNGO1lBRUEsT0FBTyxNQUFNNUssS0FBSzJJLEdBQUcsQ0FBOEIzSSxLQUFLZSxNQUFNLENBQUM4SixZQUFZLENBQUNDLFFBQVEsQ0FBQ0EsUUFBUSxDQUFDOUssS0FBS0wsYUFBYSxHQUFHZ0w7UUFDckg7UUFFQSxNQUFNbVQsZ0NBQStCdlUsT0FBTyxFQUFFckgsSUFBSSxFQUFFeEMsT0FBTztZQUN6RCxNQUFNaUwsY0FBa0M7Z0JBQUV6STtZQUFLO1lBRS9DLElBQUl4QyxTQUFTa0wsYUFBYTtnQkFDeEJELFlBQVl4RyxZQUFZLEdBQUc7Z0JBQzNCd0csWUFBWTdJLE9BQU8sR0FBRztvQkFDcEI3QixlQUFlLENBQUMsT0FBTyxFQUFFUCxRQUFRa0wsV0FBVyxFQUFFO2dCQUNoRDtZQUNGO1lBRUEsT0FBTyxNQUFNNUssS0FBSzJJLEdBQUcsQ0FBOEIzSSxLQUFLZSxNQUFNLENBQUM4SixZQUFZLENBQUNDLFFBQVEsQ0FBQ3BCLE1BQU0sQ0FBQ0wsR0FBRyxDQUFDckosS0FBS0wsYUFBYSxFQUFFNEosVUFBVW9CO1FBQ2hJO1FBRUEsTUFBTW9ULG1DQUFrQ2xlLEtBQUssRUFBRUYsYUFBYSxFQUFFdUMsSUFBSTtZQUNoRSxPQUFPLE1BQU1sQyxLQUFLMkksR0FBRyxDQUFtQzNJLEtBQUtlLE1BQU0sQ0FBQzRTLE1BQU0sQ0FBQ29HLGVBQWUsQ0FBQ3BhLGdCQUFnQjtnQkFDekd1QztnQkFDQUosU0FBUztvQkFDUDdCLGVBQWUsQ0FBQyxPQUFPLEVBQUVKLE9BQU87Z0JBQ2xDO2dCQUNBc0UsY0FBYztZQUNoQjtRQUNGO1FBRUEsTUFBTTZaLGdCQUFlelUsT0FBTyxFQUFFQyxNQUFNLEVBQUV0SCxJQUFJO1lBQ3hDLE9BQU8sTUFBTWxDLEtBQUsySSxHQUFHLENBQUMzSSxLQUFLZSxNQUFNLENBQUMySSxNQUFNLENBQUN1TCxPQUFPLENBQUNyTCxNQUFNLENBQUNMLFNBQVNDLFNBQVM7Z0JBQ3hFdEg7WUFDRjtRQUNGO1FBRUEsTUFBTStiLHVCQUFzQnRlLGFBQWEsRUFBRXVDLElBQUk7WUFDN0MsT0FBTyxNQUFNbEMsS0FBS3lJLElBQUksQ0FBcUJ6SSxLQUFLZSxNQUFNLENBQUNtZCxZQUFZLENBQUNDLFlBQVksQ0FBQ3hlLGdCQUFnQjtnQkFDL0Z1QztZQUNGO1FBQ0Y7UUFFQSxNQUFNa2Msa0JBQWlCemUsYUFBYSxFQUFFRCxPQUFPO1lBQzNDLE9BQU8sTUFBTU0sS0FBS3FCLEdBQUcsQ0FBdUJyQixLQUFLZSxNQUFNLENBQUNtZCxZQUFZLENBQUNDLFlBQVksQ0FBQ3hlLGVBQWVEO1FBQ25HO1FBRUEsTUFBTTJlLHVCQUFzQjFlLGFBQWEsRUFBRTJlLGFBQWE7WUFDdEQsTUFBTXRlLEtBQUt5QyxNQUFNLENBQUN6QyxLQUFLZSxNQUFNLENBQUNtZCxZQUFZLENBQUNLLFdBQVcsQ0FBQzVlLGVBQWUyZTtRQUN4RTtRQUVBLE1BQU1FLG9CQUFtQjdlLGFBQWEsRUFBRTJlLGFBQWE7WUFDbkQsTUFBTXRlLEtBQUt5SSxJQUFJLENBQUN6SSxLQUFLZSxNQUFNLENBQUNtZCxZQUFZLENBQUNNLGtCQUFrQixDQUFDN2UsZUFBZTJlO1FBQzdFO1FBRUEsTUFBTUcsVUFBUzllLGFBQWE7WUFDMUIsT0FBTyxNQUFNSyxLQUFLcUIsR0FBRyxDQUFlckIsS0FBS2UsTUFBTSxDQUFDbWQsWUFBWSxDQUFDUSxJQUFJLENBQUMvZTtRQUNwRTtRQUVBLE1BQU1nZixtQkFBa0JDLEtBQUssRUFBRWxmLE9BQU87WUFDcEMsT0FBTyxNQUFNTSxLQUFLcUIsR0FBRyxDQUF3QnJCLEtBQUtlLE1BQU0sQ0FBQ21kLFlBQVksQ0FBQ1csYUFBYSxDQUFDRCxPQUFPbGY7UUFDN0Y7UUFFQSxNQUFNb2YsaUJBQWdCRixLQUFLLEVBQUVHLGNBQWM7WUFDekMsT0FBTyxNQUFNL2UsS0FBS3FCLEdBQUcsQ0FBc0JyQixLQUFLZSxNQUFNLENBQUNtZCxZQUFZLENBQUNjLFlBQVksQ0FBQ0osT0FBT0c7UUFDMUY7UUFFQSxNQUFNRSxxQkFBb0JwVyxTQUFTLEVBQUVuSixPQUFPO1lBQzFDLE1BQU1NLEtBQUt5SSxJQUFJLENBQUN6SSxLQUFLZSxNQUFNLENBQUNtZSxVQUFVLENBQUNDLFNBQVMsQ0FBQ3RXLFlBQVk7Z0JBQzNEM0csTUFBTXhDO1lBQ1I7UUFDRjtRQUVBLE1BQU0wZjtZQUNKLE9BQU8sTUFBTXBmLEtBQUtxQixHQUFHLENBQTJCckIsS0FBS2UsTUFBTSxDQUFDbWUsVUFBVSxDQUFDRyxXQUFXO1FBQ3BGO1FBRUEsTUFBTUMsMkJBQTBCL1YsT0FBTztZQUNyQyxPQUFPLE1BQU12SixLQUFLcUIsR0FBRyxDQUFzQ3JCLEtBQUtlLE1BQU0sQ0FBQ21lLFVBQVUsQ0FBQ0ssV0FBVyxDQUFDaFc7UUFDaEc7UUFFQSxNQUFNaVcseUJBQXdCalcsT0FBTyxFQUFFa1csT0FBTztZQUM1QyxPQUFPLE1BQU16ZixLQUFLcUIsR0FBRyxDQUF5QnJCLEtBQUtlLE1BQU0sQ0FBQ21lLFVBQVUsQ0FBQ1EsVUFBVSxDQUFDblcsU0FBU2tXO1FBQzNGO1FBRUEsTUFBTUUsNEJBQTJCcFcsT0FBTyxFQUFFN0osT0FBTyxFQUFFMEUsTUFBTTtZQUN2RCxPQUFPLE1BQU1wRSxLQUFLeUksSUFBSSxDQUF5QnpJLEtBQUtlLE1BQU0sQ0FBQ21lLFVBQVUsQ0FBQ0ssV0FBVyxDQUFDaFcsVUFBVTtnQkFDMUZySCxNQUFNeEM7Z0JBQ04wRTtZQUNGO1FBQ0Y7UUFFQSxNQUFNd2IsNEJBQTJCclcsT0FBTyxFQUFFa1csT0FBTyxFQUFFL2YsT0FBTyxFQUFFMEUsTUFBTTtZQUNoRSxPQUFPLE1BQU1wRSxLQUFLeUksSUFBSSxDQUF5QnpJLEtBQUtlLE1BQU0sQ0FBQ21lLFVBQVUsQ0FBQ1EsVUFBVSxDQUFDblcsU0FBU2tXLFVBQVU7Z0JBQ2xHdmQsTUFBTXhDO2dCQUNOMEU7WUFDRjtRQUNGO1FBRUEsTUFBTXliLDRCQUEyQnRXLE9BQU8sRUFBRWtXLE9BQU8sRUFBRXJiLE1BQU07WUFDdkQsT0FBTyxNQUFNcEUsS0FBS3lDLE1BQU0sQ0FBQ3pDLEtBQUtlLE1BQU0sQ0FBQ21lLFVBQVUsQ0FBQ1EsVUFBVSxDQUFDblcsU0FBU2tXLFVBQVU7Z0JBQzVFcmI7WUFDRjtRQUNGO1FBRUEwYixpQkFBZ0JDLE9BQWdCO1lBQzlCLE1BQU1DLFlBQVlELFVBQVUsQ0FBQ0UsSUFBV0EsSUFBSTNoQjtZQUU1QzBCLEtBQUtxQixHQUFHLEdBQUcsT0FBT0gsS0FBS3hCO2dCQUNyQixPQUFPc2dCLFVBQVUsTUFBTWhnQixLQUFLK0gsV0FBVyxDQUFDLE9BQU83RyxLQUFLeEI7WUFDdEQ7WUFFQU0sS0FBS3lJLElBQUksR0FBRyxPQUFPdkgsS0FBYXhCO2dCQUM5QixPQUFPc2dCLFVBQVUsTUFBTWhnQixLQUFLK0gsV0FBVyxDQUFDLFFBQVE3RyxLQUFLeEI7WUFDdkQ7WUFFQU0sS0FBS3lDLE1BQU0sR0FBRyxPQUFPdkIsS0FBYXhCO2dCQUNoQ3NnQixVQUFVLE1BQU1oZ0IsS0FBSytILFdBQVcsQ0FBQyxVQUFVN0csS0FBS3hCO1lBQ2xEO1lBRUFNLEtBQUswSSxLQUFLLEdBQUcsT0FBT3hILEtBQWF4QjtnQkFDL0IsT0FBT3NnQixVQUFVLE1BQU1oZ0IsS0FBSytILFdBQVcsQ0FBQyxTQUFTN0csS0FBS3hCO1lBQ3hEO1lBRUFNLEtBQUsySSxHQUFHLEdBQUcsT0FBT3pILEtBQWF4QjtnQkFDN0IsT0FBT3NnQixVQUFVLE1BQU1oZ0IsS0FBSytILFdBQVcsQ0FBQyxPQUFPN0csS0FBS3hCO1lBQ3REO1lBRUEsT0FBT007UUFDVDtJQUNGO0lBRUEsT0FBT0E7QUFDVDs7VUFFS2tnQjtJQUNILHdFQUF3RTtJQUV4RSx3RUFBd0U7SUFFeEUsNEVBQTRFO0lBRTVFLG1DQUFtQztHQVBoQ0EscUJBQUFBIn0=