sliftutils 1.7.29 → 1.7.33
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/builders/extensionBuild.ts +1 -1
- package/bundler/bundleEntry.ts +1 -3
- package/bundler/bundler.ts +2 -4
- package/bundler/sourceMaps.ts +1 -2
- package/examplestorage/browser.tsx +1 -2
- package/examplestorage/exampleserver.ts +1 -2
- package/index.d.ts +106 -99
- package/misc/dist/environment.ts.cache +2 -2
- package/misc/dist/getSecret.ts.cache +2 -2
- package/misc/dist/strings.ts.cache +2 -2
- package/misc/dist/zip.ts.cache +2 -2
- package/misc/https/dist/certs.ts.cache +2 -2
- package/misc/https/dist/dns.ts.cache +7 -16
- package/misc/https/dist/persistentLocalStorage.ts.cache +2 -2
- package/misc/https/dns.d.ts +1 -4
- package/misc/https/dns.ts +5 -14
- package/misc/https/hostServer.d.ts +2 -0
- package/misc/https/hostServer.ts +6 -7
- package/misc/https/httpsCerts.ts +4 -10
- package/misc/openrouter.ts +1 -2
- package/package.json +1 -1
- package/render-utils/FullscreenModal.tsx +1 -4
- package/render-utils/GenericFormat.tsx +2 -8
- package/render-utils/Input.tsx +5 -13
- package/render-utils/InputLabel.tsx +4 -6
- package/render-utils/InputPicker.tsx +1 -2
- package/render-utils/URLParam.ts +2 -3
- package/render-utils/dist/observer.tsx.cache +2 -2
- package/render-utils/mobxTyped.ts +2 -3
- package/render-utils/niceStringify.ts +2 -4
- package/storage/ArchivesDisk.ts +4 -14
- package/storage/BulkDatabase2/BulkDatabase2.d.ts +1 -2
- package/storage/BulkDatabase2/BulkDatabase2.ts +4 -11
- package/storage/BulkDatabase2/BulkDatabaseBase.ts +42 -114
- package/storage/BulkDatabase2/BulkDatabaseFormat.ts +31 -91
- package/storage/BulkDatabase2/BulkDatabaseMerge.ts +19 -57
- package/storage/BulkDatabase2/BulkDatabaseReader.ts +4 -12
- package/storage/BulkDatabase2/LoadedIndex.ts +6 -18
- package/storage/BulkDatabase2/WriteOverlay.ts +3 -8
- package/storage/BulkDatabase2/blockCache.ts +12 -28
- package/storage/BulkDatabase2/dist/BulkDatabaseBase.ts.cache +40 -103
- package/storage/BulkDatabase2/dist/BulkDatabaseFormat.ts.cache +19 -50
- package/storage/BulkDatabase2/dist/BulkDatabaseMerge.ts.cache +18 -50
- package/storage/BulkDatabase2/dist/BulkDatabaseReader.ts.cache +7 -15
- package/storage/BulkDatabase2/dist/LoadedIndex.ts.cache +9 -21
- package/storage/BulkDatabase2/dist/WriteOverlay.ts.cache +6 -11
- package/storage/BulkDatabase2/dist/blockCache.ts.cache +15 -31
- package/storage/BulkDatabase2/dist/mergeLock.ts.cache +10 -29
- package/storage/BulkDatabase2/dist/mergeMarkers.ts.cache +10 -18
- package/storage/BulkDatabase2/dist/streamLog.ts.cache +17 -43
- package/storage/BulkDatabase2/dist/syncClient.ts.cache +11 -27
- package/storage/BulkDatabase2/mergeLock.ts +7 -26
- package/storage/BulkDatabase2/mergeMarkers.ts +7 -15
- package/storage/BulkDatabase2/streamLog.ts +14 -40
- package/storage/BulkDatabase2/syncClient.ts +8 -24
- package/storage/FileFolderAPI.tsx +28 -75
- package/storage/IArchives.d.ts +3 -3
- package/storage/IArchives.ts +21 -50
- package/storage/IStorage.ts +2 -4
- package/storage/PendingManager.tsx +2 -3
- package/storage/TransactionStorage.ts +11 -24
- package/storage/backblaze.ts +12 -43
- package/storage/dist/ArchivesDisk.ts.cache +7 -17
- package/storage/dist/FileFolderAPI.tsx.cache +25 -63
- package/storage/dist/IArchives.ts.cache +10 -20
- package/storage/dist/IndexedDBFileFolderAPI.ts.cache +2 -2
- package/storage/dist/JSONStorage.ts.cache +2 -2
- package/storage/dist/PendingManager.tsx.cache +5 -6
- package/storage/dist/TransactionStorage.ts.cache +14 -27
- package/storage/dist/backblaze.ts.cache +15 -46
- package/storage/dist/embeddingFormats.ts.cache +11 -24
- package/storage/dist/fileSystemPointer.ts.cache +4 -7
- package/storage/dist/remoteFileStorage.ts.cache +17 -36
- package/storage/embeddingFormats.ts +11 -27
- package/storage/fileSystemPointer.ts +2 -7
- package/storage/proxydatabase/dist/ivfEmbeddingDatabase.ts.cache +8 -18
- package/storage/proxydatabase/dist/transactionSet.ts.cache +4 -7
- package/storage/proxydatabase/inMemoryDatabase.ts +1 -3
- package/storage/proxydatabase/ivfEmbeddingDatabase.ts +8 -23
- package/storage/proxydatabase/transactionSet.ts +2 -5
- package/storage/remoteFileServer.ts +20 -48
- package/storage/remoteFileStorage.ts +14 -33
- package/storage/remoteStorage/ArchivesRemote.d.ts +1 -4
- package/storage/remoteStorage/ArchivesRemote.ts +11 -26
- package/storage/remoteStorage/ArchivesUrl.ts +2 -4
- package/storage/remoteStorage/accessPage.tsx +1 -5
- package/storage/remoteStorage/blobStore.d.ts +5 -13
- package/storage/remoteStorage/blobStore.ts +52 -130
- package/storage/remoteStorage/createArchives.d.ts +9 -13
- package/storage/remoteStorage/createArchives.ts +43 -187
- package/storage/remoteStorage/deployTakeover.d.ts +18 -32
- package/storage/remoteStorage/deployTakeover.ts +70 -384
- package/storage/remoteStorage/dist/ArchivesRemote.ts.cache +12 -24
- package/storage/remoteStorage/dist/ArchivesUrl.ts.cache +5 -7
- package/storage/remoteStorage/dist/blobStore.ts.cache +47 -117
- package/storage/remoteStorage/dist/cliArgs.ts.cache +2 -2
- package/storage/remoteStorage/dist/createArchives.ts.cache +54 -186
- package/storage/remoteStorage/dist/deployTakeover.ts.cache +81 -387
- package/storage/remoteStorage/dist/intermediateSources.ts.cache +119 -0
- package/storage/remoteStorage/dist/remoteConfig.ts.cache +36 -24
- package/storage/remoteStorage/dist/sourceWrapper.ts.cache +20 -40
- package/storage/remoteStorage/dist/storageClientController.ts.cache +32 -0
- package/storage/remoteStorage/dist/storageController.ts.cache +30 -64
- package/storage/remoteStorage/dist/storageServerState.ts.cache +269 -186
- package/storage/remoteStorage/grantAccessCli.ts +1 -3
- package/storage/remoteStorage/intermediateSources.d.ts +21 -0
- package/storage/remoteStorage/intermediateSources.ts +117 -0
- package/storage/remoteStorage/remoteConfig.ts +33 -20
- package/storage/remoteStorage/sourceWrapper.d.ts +8 -19
- package/storage/remoteStorage/sourceWrapper.ts +19 -41
- package/storage/remoteStorage/storageClientController.ts +1 -3
- package/storage/remoteStorage/storageController.d.ts +5 -3
- package/storage/remoteStorage/storageController.ts +12 -83
- package/storage/remoteStorage/storageServer.ts +20 -34
- package/storage/remoteStorage/storageServerState.d.ts +28 -6
- package/storage/remoteStorage/storageServerState.ts +275 -221
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";
|
|
1
|
+
"use strict"; var console = (function shimConsole() { let baseConsole = globalThis.console; if (typeof window !== "undefined") return baseConsole; let name = __filename.replaceAll("\\", "/").split("/").pop(); let dirName = __dirname.replaceAll("\\", "/").split("/").pop(); let context = { __FILE__: __filename, __DIR__: __dirname, __NAME__: name, __DIRNAME__: dirName }; let newConsole = { ...baseConsole }; for (let shim of ["log", "info", "warn", "error"]) { newConsole[shim] = (...args) => { args.push(context); baseConsole[shim](...args); }; } newConsole.__context = context; return newConsole; })(); "use strict";
|
|
2
2
|
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
3
|
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
4
|
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
@@ -66,8 +66,7 @@ function loadRemoteConfig() {
|
|
|
66
66
|
return undefined;
|
|
67
67
|
}
|
|
68
68
|
function saveRemoteConfig(c) { localStorage.setItem(remoteConfigKey(), JSON.stringify(c)); }
|
|
69
|
-
// The server is always HTTPS on the filehoster's default port, so the user only needs to type the host
|
|
70
|
-
// (e.g. "65.109.93.113"). We strip any scheme/path they include and default the port if omitted.
|
|
69
|
+
// The server is always HTTPS on the filehoster's default port, so the user only needs to type the host (e.g. "65.109.93.113"). We strip any scheme/path they include and default the port if omitted.
|
|
71
70
|
const DEFAULT_REMOTE_PORT = 8787; // matches remoteFileServer.js's default
|
|
72
71
|
function normalizeServerUrl(raw) {
|
|
73
72
|
let s = raw.trim().replace(/^\w+:\/\//, "").replace(/\/.*$/, "");
|
|
@@ -100,11 +99,7 @@ let DirectoryPrompter = class DirectoryPrompter extends preact_1.default.Compone
|
|
|
100
99
|
DirectoryPrompter = __decorate([
|
|
101
100
|
observer_1.observer
|
|
102
101
|
], DirectoryPrompter);
|
|
103
|
-
// "Connect to a server" option for the directory prompt: collapses to a button, expands to address +
|
|
104
|
-
// password fields. On connect it ACTUALLY connects (testRemoteConnection); only on success does it
|
|
105
|
-
// persist the config and call onConnected, so the caller (getDirectoryHandle) resolves with a working
|
|
106
|
-
// remote handle. Failures are shown to the user (and logged, without the password), never swallowed.
|
|
107
|
-
// `initial` pre-fills + expands the form (used to retry a remembered server that stopped working).
|
|
102
|
+
// "Connect to a server" option for the directory prompt: collapses to a button, expands to address + password fields. On connect it ACTUALLY connects (testRemoteConnection); only on success does it persist the config and call onConnected, so the caller (getDirectoryHandle) resolves with a working remote handle. Failures are shown to the user (and logged, without the password), never swallowed. `initial` pre-fills + expands the form (used to retry a remembered server that stopped working).
|
|
108
103
|
let ServerConnectForm = class ServerConnectForm extends preact_1.default.Component {
|
|
109
104
|
constructor() {
|
|
110
105
|
var _a, _b;
|
|
@@ -138,8 +133,7 @@ let ServerConnectForm = class ServerConnectForm extends preact_1.default.Compone
|
|
|
138
133
|
console.error("Remote connect: unauthorized for", url);
|
|
139
134
|
}
|
|
140
135
|
else {
|
|
141
|
-
// Got nothing back — usually the self-signed certificate isn't trusted yet, but show the
|
|
142
|
-
// actual error too so a wrong address / down server / CORS issue is diagnosable.
|
|
136
|
+
// Got nothing back — usually the self-signed certificate isn't trusted yet, but show the actual error too so a wrong address / down server / CORS issue is diagnosable.
|
|
143
137
|
s.needsCert = true;
|
|
144
138
|
s.error = "Couldn't reach the server: " + result.error;
|
|
145
139
|
console.error("Remote connect: unreachable", url, "-", result.error);
|
|
@@ -273,9 +267,7 @@ class NodeJSDirectoryHandleWrapper {
|
|
|
273
267
|
await fs_1.default.promises.writeFile(filePath, Buffer.alloc(0));
|
|
274
268
|
}
|
|
275
269
|
else if (!exists) {
|
|
276
|
-
// Tag as ENOENT so readWithRetry treats it as a genuinely-missing file (return undefined now)
|
|
277
|
-
// rather than a transient read failure to retry 6× with backoff — missing files are normal
|
|
278
|
-
// (a concurrent merge deletes a file mid-read), and retrying them is catastrophically slow.
|
|
270
|
+
// Tag as ENOENT so readWithRetry treats it as a genuinely-missing file (return undefined now) rather than a transient read failure to retry 6× with backoff — missing files are normal (a concurrent merge deletes a file mid-read), and retrying them is catastrophically slow.
|
|
279
271
|
const err = new Error(`File not found: ${filePath}`);
|
|
280
272
|
err.code = "ENOENT";
|
|
281
273
|
throw err;
|
|
@@ -311,9 +303,7 @@ class NodeJSDirectoryHandleWrapper {
|
|
|
311
303
|
}
|
|
312
304
|
}
|
|
313
305
|
exports.NodeJSDirectoryHandleWrapper = NodeJSDirectoryHandleWrapper;
|
|
314
|
-
// When set, getDirectoryHandle skips every prompt + remote check and serves from the browser's Origin
|
|
315
|
-
// Private File System (OPFS). One named subfolder is "current" per fileAPIKey; pickPrivateFolder /
|
|
316
|
-
// resetStorageLocation switch which one. Set this in app startup BEFORE the first getDirectoryHandle.
|
|
306
|
+
// When set, getDirectoryHandle skips every prompt + remote check and serves from the browser's Origin Private File System (OPFS). One named subfolder is "current" per fileAPIKey; pickPrivateFolder / resetStorageLocation switch which one. Set this in app startup BEFORE the first getDirectoryHandle.
|
|
317
307
|
let opfsEnabled = false;
|
|
318
308
|
const OPFS_FOLDERS_DIR = "folders";
|
|
319
309
|
const OPFS_DEFAULT_FOLDER = "default";
|
|
@@ -324,14 +314,12 @@ function getCurrentOpfsFolder() {
|
|
|
324
314
|
function setCurrentOpfsFolder(name) {
|
|
325
315
|
localStorage.setItem(opfsCurrentKey(), name);
|
|
326
316
|
}
|
|
327
|
-
// Switches getDirectoryHandle to the Origin Private File System. No directory picker, no permission
|
|
328
|
-
// prompt, no remote server check. Persists nothing — call on every app start before reading storage.
|
|
317
|
+
// Switches getDirectoryHandle to the Origin Private File System. No directory picker, no permission prompt, no remote server check. Persists nothing — call on every app start before reading storage.
|
|
329
318
|
function usePrivateFileSystem() {
|
|
330
319
|
opfsEnabled = true;
|
|
331
320
|
}
|
|
332
321
|
exports.usePrivateFileSystem = usePrivateFileSystem;
|
|
333
|
-
// Whether the OPFS branch is in effect (so other callers can adapt — e.g. skip the "find data subdir"
|
|
334
|
-
// hack in getFileStorageNested2 since OPFS is always a clean root we own end-to-end).
|
|
322
|
+
// Whether the OPFS branch is in effect (so other callers can adapt — e.g. skip the "find data subdir" hack in getFileStorageNested2 since OPFS is always a clean root we own end-to-end).
|
|
335
323
|
function isPrivateFileSystemActive() {
|
|
336
324
|
return opfsEnabled;
|
|
337
325
|
}
|
|
@@ -353,9 +341,7 @@ async function getCurrentOpfsHandle() {
|
|
|
353
341
|
const folder = await folders.getDirectoryHandle(getCurrentOpfsFolder(), { create: true });
|
|
354
342
|
return folder;
|
|
355
343
|
}
|
|
356
|
-
// All previously-used OPFS subfolders under this fileAPIKey, sorted alphabetically (timestamp-named
|
|
357
|
-
// auto-generated folders therefore sort chronologically). Use this to surface a list, then call
|
|
358
|
-
// pickPrivateFolder(name) to switch.
|
|
344
|
+
// All previously-used OPFS subfolders under this fileAPIKey, sorted alphabetically (timestamp-named auto-generated folders therefore sort chronologically). Use this to surface a list, then call pickPrivateFolder(name) to switch.
|
|
359
345
|
async function listPrivateFolders() {
|
|
360
346
|
var _a;
|
|
361
347
|
if (!((_a = navigator.storage) === null || _a === void 0 ? void 0 : _a.getDirectory))
|
|
@@ -375,17 +361,13 @@ async function listPrivateFolders() {
|
|
|
375
361
|
return names.sort();
|
|
376
362
|
}
|
|
377
363
|
exports.listPrivateFolders = listPrivateFolders;
|
|
378
|
-
// Switch to a specific OPFS subfolder and reload so getDirectoryHandle re-resolves to it. The folder
|
|
379
|
-
// is created if it doesn't exist yet.
|
|
364
|
+
// Switch to a specific OPFS subfolder and reload so getDirectoryHandle re-resolves to it. The folder is created if it doesn't exist yet.
|
|
380
365
|
function pickPrivateFolder(name) {
|
|
381
366
|
setCurrentOpfsFolder(name);
|
|
382
367
|
window.location.reload();
|
|
383
368
|
}
|
|
384
369
|
exports.pickPrivateFolder = pickPrivateFolder;
|
|
385
|
-
// Returns the directory handle to use — local (Node / picked folder) OR a remote server, both as the
|
|
386
|
-
// same DirectoryWrapper, so callers don't know or care which it is. A remembered server is VERIFIED
|
|
387
|
-
// (we actually connect) before use; if it no longer works we re-prompt, just like a local folder whose
|
|
388
|
-
// permission was lost. Blocks until ready (or the user dismisses, which rejects).
|
|
370
|
+
// Returns the directory handle to use — local (Node / picked folder) OR a remote server, both as the same DirectoryWrapper, so callers don't know or care which it is. A remembered server is VERIFIED (we actually connect) before use; if it no longer works we re-prompt, just like a local folder whose permission was lost. Blocks until ready (or the user dismisses, which rejects).
|
|
389
371
|
exports.getDirectoryHandle = (0, caching_1.lazy)(async function getDirectoryHandle() {
|
|
390
372
|
// An injected root (e.g. a Web Worker handed the handle by its owning window)
|
|
391
373
|
// short-circuits the whole interactive resolution — no picker, no DOM, no
|
|
@@ -393,12 +375,7 @@ exports.getDirectoryHandle = (0, caching_1.lazy)(async function getDirectoryHand
|
|
|
393
375
|
if (storageRootOverride) {
|
|
394
376
|
return storageRootOverride;
|
|
395
377
|
}
|
|
396
|
-
// A worker can't show the picker (no DOM / no user activation) and can't read localStorage, but
|
|
397
|
-
// it CAN open the pointer IndexedDB the main-thread picker persists to. Poll it for a handle
|
|
398
|
-
// whose permission is already granted; the owning window may also postMessage a handle in
|
|
399
|
-
// mid-poll (checked each iteration). This has to come before the isNode branch: typesafecss's
|
|
400
|
-
// isNode() returns true in workers (window is undefined), so a worker would otherwise fall into
|
|
401
|
-
// the Node branch and try to use fs/path.
|
|
378
|
+
// A worker can't show the picker (no DOM / no user activation) and can't read localStorage, but it CAN open the pointer IndexedDB the main-thread picker persists to. Poll it for a handle whose permission is already granted; the owning window may also postMessage a handle in mid-poll (checked each iteration). This has to come before the isNode branch: typesafecss's isNode() returns true in workers (window is undefined), so a worker would otherwise fall into the Node branch and try to use fs/path.
|
|
402
379
|
if ("WorkerGlobalScope" in globalThis) {
|
|
403
380
|
while (true) {
|
|
404
381
|
if (storageRootOverride)
|
|
@@ -443,14 +420,12 @@ exports.getDirectoryHandle = (0, caching_1.lazy)(async function getDirectoryHand
|
|
|
443
420
|
}
|
|
444
421
|
};
|
|
445
422
|
const onConnected = (config) => { saveRemoteConfig(config); resolveHandle(getRemoteHandle(config)); };
|
|
446
|
-
// The three options, rendered fresh each time. If a saved server just failed, pre-fill + expand
|
|
447
|
-
// the connect form so the user can retry or fix it.
|
|
423
|
+
// The three options, rendered fresh each time. If a saved server just failed, pre-fill + expand the connect form so the user can retry or fix it.
|
|
448
424
|
const renderOptions = () => (preact_1.default.createElement(preact_1.default.Fragment, null,
|
|
449
425
|
preact_1.default.createElement("button", { className: typesafecss_1.css.fontSize(40).pad2(80, 40), onClick: pickLocal }, "Pick Data Directory"),
|
|
450
426
|
preact_1.default.createElement(ServerConnectForm, { onConnected: onConnected, initial: savedRemote }),
|
|
451
427
|
preact_1.default.createElement("button", { className: typesafecss_1.css.fontSize(40).pad2(80, 40), onClick: () => rejectHandle(new Error("User dismissed file system access prompt")) }, "Dismiss")));
|
|
452
|
-
// A previously-picked local folder: try to restore it (may need a click). Skipped when a saved
|
|
453
|
-
// server failed — that user wants the server, so go straight to the (pre-filled) prompt.
|
|
428
|
+
// A previously-picked local folder: try to restore it (may need a click). Skipped when a saved server failed — that user wants the server, so go straight to the (pre-filled) prompt.
|
|
454
429
|
const storedId = !savedRemote && localStorage.getItem(getFileAPIKey());
|
|
455
430
|
if (storedId) {
|
|
456
431
|
let doneLoad = false;
|
|
@@ -516,8 +491,7 @@ exports.getFileStorageNested2 = (0, caching_1.cache)(async function getFileStora
|
|
|
516
491
|
}
|
|
517
492
|
else {
|
|
518
493
|
base = await (0, exports.getDirectoryHandle)();
|
|
519
|
-
// Skip the "find data subdir" hack under OPFS — that's for picked directories where the user
|
|
520
|
-
// might have selected a folder with unrelated files; OPFS is a clean root we own end-to-end.
|
|
494
|
+
// Skip the "find data subdir" hack under OPFS — that's for picked directories where the user might have selected a folder with unrelated files; OPFS is a clean root we own end-to-end.
|
|
521
495
|
if (!opfsEnabled) {
|
|
522
496
|
let dirs = [];
|
|
523
497
|
let alls = [];
|
|
@@ -549,8 +523,7 @@ exports.getFileStorage = (0, caching_1.lazy)(async function getFileStorage() {
|
|
|
549
523
|
});
|
|
550
524
|
function resetStorageLocation() {
|
|
551
525
|
if (opfsEnabled) {
|
|
552
|
-
// Don't delete previous folder — listPrivateFolders / pickPrivateFolder still need it. Just point
|
|
553
|
-
// "current" at a fresh timestamp-named one so the next reload starts clean.
|
|
526
|
+
// Don't delete previous folder — listPrivateFolders / pickPrivateFolder still need it. Just point "current" at a fresh timestamp-named one so the next reload starts clean.
|
|
554
527
|
setCurrentOpfsFolder(new Date().toISOString().replace(/[:.]/g, "-"));
|
|
555
528
|
window.location.reload();
|
|
556
529
|
return;
|
|
@@ -580,18 +553,14 @@ async function fixedGetFileHandle(config) {
|
|
|
580
553
|
}
|
|
581
554
|
return await config.handle.getFileHandle(config.key, { create: true });
|
|
582
555
|
}
|
|
583
|
-
// A file that genuinely does not exist. We must NOT retry these, otherwise reading many missing
|
|
584
|
-
// files (a common pattern) gets catastrophically slow.
|
|
556
|
+
// A file that genuinely does not exist. We must NOT retry these, otherwise reading many missing files (a common pattern) gets catastrophically slow.
|
|
585
557
|
function isMissingError(error) {
|
|
586
558
|
let name = error === null || error === void 0 ? void 0 : error.name;
|
|
587
559
|
let code = error === null || error === void 0 ? void 0 : error.code;
|
|
588
560
|
return name === "NotFoundError" || code === "ENOENT";
|
|
589
561
|
}
|
|
590
562
|
const MAX_READ_RETRIES = 6;
|
|
591
|
-
// The browser File System Access API can transiently fail reads under heavy load (it appears to
|
|
592
|
-
// throttle when a page issues many reads at once). Those failures surface as errors OTHER than
|
|
593
|
-
// "not found", so we retry them with backoff. A real missing file (NotFoundError / ENOENT) returns
|
|
594
|
-
// undefined immediately with no retry.
|
|
563
|
+
// The browser File System Access API can transiently fail reads under heavy load (it appears to throttle when a page issues many reads at once). Those failures surface as errors OTHER than "not found", so we retry them with backoff. A real missing file (NotFoundError / ENOENT) returns undefined immediately with no retry.
|
|
595
564
|
async function readWithRetry(label, key, read) {
|
|
596
565
|
let backoff = 25;
|
|
597
566
|
for (let attempt = 0;; attempt++) {
|
|
@@ -632,8 +601,7 @@ function wrapHandleFiles(handle) {
|
|
|
632
601
|
const file = await handle.getFileHandle(key);
|
|
633
602
|
const fileContent = await file.getFile();
|
|
634
603
|
const arrayBuffer = await fileContent.arrayBuffer();
|
|
635
|
-
// Under load the FS Access API can resolve with a truncated buffer and no error.
|
|
636
|
-
// Treat a short read as transient so readWithRetry retries it.
|
|
604
|
+
// Under load the FS Access API can resolve with a truncated buffer and no error. Treat a short read as transient so readWithRetry retries it.
|
|
637
605
|
if (arrayBuffer.byteLength !== fileContent.size) {
|
|
638
606
|
throw Object.assign(new Error(`Short read: got ${arrayBuffer.byteLength} of ${fileContent.size} bytes`), { name: "ShortReadError" });
|
|
639
607
|
}
|
|
@@ -655,8 +623,7 @@ function wrapHandleFiles(handle) {
|
|
|
655
623
|
},
|
|
656
624
|
async append(key, value) {
|
|
657
625
|
await appendQueue(key)(async () => {
|
|
658
|
-
// NOTE: Interesting point. Chrome doesn't optimize this to be an append, and instead
|
|
659
|
-
// rewrites the entire file.
|
|
626
|
+
// NOTE: Interesting point. Chrome doesn't optimize this to be an append, and instead rewrites the entire file.
|
|
660
627
|
const file = await fixedGetFileHandle({ handle, key, create: true });
|
|
661
628
|
const writable = await file.createWritable({ keepExistingData: true });
|
|
662
629
|
let offset = (await file.getFile()).size;
|
|
@@ -736,10 +703,7 @@ function wrapHandle(handle) {
|
|
|
736
703
|
};
|
|
737
704
|
}
|
|
738
705
|
exports.wrapHandle = wrapHandle;
|
|
739
|
-
// Returns a URL for a file's bytes, ready to drop into <video>/<img>/fetch. A native (local) file becomes
|
|
740
|
-
// an in-memory blob: URL; a remote file becomes an https URL into the server's range-capable /media
|
|
741
|
-
// endpoint (auth token in the query, since a media element can't send headers). Both support HTTP range /
|
|
742
|
-
// seeking. ALWAYS hand the result to disposeFileURL when finished — for blob: URLs that frees memory.
|
|
706
|
+
// Returns a URL for a file's bytes, ready to drop into <video>/<img>/fetch. A native (local) file becomes an in-memory blob: URL; a remote file becomes an https URL into the server's range-capable /media endpoint (auth token in the query, since a media element can't send headers). Both support HTTP range / seeking. ALWAYS hand the result to disposeFileURL when finished — for blob: URLs that frees memory.
|
|
743
707
|
async function getFileURL(file) {
|
|
744
708
|
if (file.getURL)
|
|
745
709
|
return file.getURL();
|
|
@@ -748,8 +712,7 @@ async function getFileURL(file) {
|
|
|
748
712
|
return URL.createObjectURL(f);
|
|
749
713
|
}
|
|
750
714
|
exports.getFileURL = getFileURL;
|
|
751
|
-
// Releases a URL from getFileURL. blob: URLs leak until the document is gone unless revoked; https/file:
|
|
752
|
-
// URLs need no cleanup, so this is a no-op for them.
|
|
715
|
+
// Releases a URL from getFileURL. blob: URLs leak until the document is gone unless revoked; https/file: URLs need no cleanup, so this is a no-op for them.
|
|
753
716
|
function disposeFileURL(url) {
|
|
754
717
|
if (url.startsWith("blob:")) {
|
|
755
718
|
try {
|
|
@@ -759,8 +722,7 @@ function disposeFileURL(url) {
|
|
|
759
722
|
}
|
|
760
723
|
}
|
|
761
724
|
exports.disposeFileURL = disposeFileURL;
|
|
762
|
-
// A StorageFactory backed by a remote server (path -> FileStorage), for code that injects its own
|
|
763
|
-
// storage into BulkDatabase2 rather than going through the directory prompt.
|
|
725
|
+
// A StorageFactory backed by a remote server (path -> FileStorage), for code that injects its own storage into BulkDatabase2 rather than going through the directory prompt.
|
|
764
726
|
function getRemoteFileStorageFactory(url, password, options) {
|
|
765
727
|
const root = (0, remoteFileStorage_1.getRemoteDirectoryHandle)(url, password, options);
|
|
766
728
|
return async (pathStr) => {
|
|
@@ -784,5 +746,5 @@ async function tryToLoadPointer(pointer) {
|
|
|
784
746
|
return handle;
|
|
785
747
|
}
|
|
786
748
|
exports.tryToLoadPointer = tryToLoadPointer;
|
|
787
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmlsZUZvbGRlckFQSS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIkZpbGVGb2xkZXJBUEkudHN4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQUFBLG9EQUE0QjtBQUM1QiwyREFBNkc7QUFDN0csK0JBQWtDO0FBQ2xDLHVEQUFvRDtBQUNwRCx5REFBMEQ7QUFDMUQsNkNBQTBDO0FBRTFDLDJEQUEyRDtBQUMzRCxxRUFBaUU7QUFDakUsMkRBQW9HO0FBQ3BHLDRDQUFvQjtBQUNwQixnREFBd0I7QUFzQnhCLHVFQUF1RTtBQUN2RSx3RkFBd0Y7QUFDeEYsK0JBQStCO0FBQy9CLE1BQU0sY0FBYyxHQUFHLEtBQUssQ0FBQztBQUU3QixxR0FBcUc7QUFDckcsTUFBTSx1QkFBdUIsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBNEMxQyxJQUFJLFdBQVcsR0FBRyxJQUFBLGlCQUFVLEVBQUM7SUFDekIsRUFBRSxFQUFFLFNBQWlEO0NBQ3hELEVBQUUsU0FBUyxFQUFFLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7QUFFL0IsSUFBSSxVQUFVLEdBQUcsRUFBRSxDQUFDO0FBQ3BCLFNBQVMsYUFBYTtJQUNsQixJQUFJLENBQUMsVUFBVTtRQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsNEpBQTRKLENBQUMsQ0FBQztJQUMvTCxPQUFPLFVBQVUsQ0FBQztBQUN0QixDQUFDO0FBQ0QsU0FBZ0IsYUFBYSxDQUFDLEdBQVc7SUFDckMsVUFBVSxHQUFHLEdBQUcsQ0FBQztBQUNyQixDQUFDO0FBRkQsc0NBRUM7QUFFRCwrRUFBK0U7QUFDL0Usa0ZBQWtGO0FBQ2xGLGtGQUFrRjtBQUNsRixpRkFBaUY7QUFDakYsbUZBQW1GO0FBQ25GLG1GQUFtRjtBQUNuRix5Q0FBeUM7QUFDekMsSUFBSSxtQkFBMEQsQ0FBQztBQUMvRCxTQUFnQixzQkFBc0IsQ0FBQyxNQUE2QztJQUNoRixtQkFBbUIsR0FBRyxNQUFNLENBQUM7QUFDakMs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O0lBQ3JELElBQUksQ0FBQyxNQUFNO1FBQUUsT0FBTztJQUNwQixJQUFJLE1BQU0sR0FBRyxNQUFNLENBQUEsTUFBTSxhQUFOLE1BQU0sdUJBQU4sTUFBTSxDQUFFLGdCQUFnQixFQUFFLENBQUEsQ0FBQztJQUM5QyxJQUFJLENBQUMsTUFBTTtRQUFFLE9BQU87SUFDcEIsT0FBTyxNQUFpQyxDQUFDO0FBQzdDLENBQUM7QUFORCw0Q0FNQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBwcmVhY3QgZnJvbSBcInByZWFjdFwiO1xuaW1wb3J0IHsgZmluZEdyYW50ZWRQb2ludGVySGFuZGxlLCBnZXRGaWxlU3lzdGVtUG9pbnRlciwgc3RvcmVGaWxlU3lzdGVtUG9pbnRlciB9IGZyb20gXCIuL2ZpbGVTeXN0ZW1Qb2ludGVyXCI7XG5pbXBvcnQgeyBvYnNlcnZhYmxlIH0gZnJvbSBcIm1vYnhcIjtcbmltcG9ydCB7IG9ic2VydmVyIH0gZnJvbSBcIi4uL3JlbmRlci11dGlscy9vYnNlcnZlclwiO1xuaW1wb3J0IHsgY2FjaGUsIGxhenkgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9jYWNoaW5nXCI7XG5pbXBvcnQgeyBjc3MsIGlzTm9kZSB9IGZyb20gXCJ0eXBlc2FmZWNzc1wiO1xuaW1wb3J0IHsgSVN0b3JhZ2VSYXcgfSBmcm9tIFwiLi9JU3RvcmFnZVwiO1xuaW1wb3J0IHsgcnVuSW5TZXJpYWwgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9iYXRjaGluZ1wiO1xuaW1wb3J0IHsgZ2V0RmlsZVN0b3JhZ2VJbmRleERCIH0gZnJvbSBcIi4vSW5kZXhlZERCRmlsZUZvbGRlckFQSVwiO1xuaW1wb3J0IHsgZ2V0UmVtb3RlRGlyZWN0b3J5SGFuZGxlLCB0ZXN0UmVtb3RlQ29ubmVjdGlvbiwgUmVtb3RlT3B0aW9ucyB9IGZyb20gXCIuL3JlbW90ZUZpbGVTdG9yYWdlXCI7XG5pbXBvcnQgZnMgZnJvbSBcImZzXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuXG5kZWNsYXJlIGdsb2JhbCB7XG4gICAgaW50ZXJmYWNlIFdpbmRvdyB7XG4gICAgICAgIHNob3dTYXZlRmlsZVBpY2tlcihjb25maWc/OiB7XG4gICAgICAgICAgICB0eXBlczoge1xuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7IGFjY2VwdDogeyBbbWltZVR5cGU6IHN0cmluZ106IHN0cmluZ1tdIH1cbiAgICAgICAgICAgIH1bXTtcbiAgICAgICAgfSk6IFByb21pc2U8RmlsZVN5c3RlbUZpbGVIYW5kbGU+O1xuICAgICAgICBzaG93RGlyZWN0b3J5UGlja2VyKCk6IFByb21pc2U8RmlsZVN5c3RlbURpcmVjdG9yeUhhbmRsZT47XG4gICAgICAgIHNob3dPcGVuRmlsZVBpY2tlcihjb25maWc/OiB7XG4gICAgICAgICAgICB0eXBlczoge1xuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7IGFjY2VwdDogeyBbbWltZVR5cGU6IHN0cmluZ106IHN0cmluZ1tdIH1cbiAgICAgICAgICAgIH1bXTtcbiAgICAgICAgfSk6IFByb21pc2U8RmlsZVN5c3RlbUZpbGVIYW5kbGVbXT47XG4gICAgfVxuICAgIGludGVyZmFjZSBGaWxlU3lzdGVtRGlyZWN0b3J5SGFuZGxlIHtcbiAgICAgICAgcmVxdWVzdFBlcm1pc3Npb24oY29uZmlnPzogeyBtb2RlOiBcInJlYWRcIiB8IFwicmVhZHdyaXRlXCIgfSk6IFByb21pc2U8UGVybWlzc2lvblN0YXRlPjtcbiAgICB9XG59XG5cblxuLy8gTk9URTogSW5kZXhlZERCIGlzIHJlcXVpcmVkIGZvciBpT1MsIGF0IGxlYXN0LiBXZSBNSUdIVCB3YW50IHRvIG1ha2Vcbi8vICB0aGlzIGEgdXNlciBzdXBwb3J0ZWQgdG9nZ2xlIHRvbywgc28gdGhleSBjYW4gY2hvb3NlIGR1cmluZyBydW50aW1lIGlmIHRoZXkgd2FudCBpdC5cbi8vIERPIE5PVCBlbmFibGUgdGhpcyBpcyBpc05vZGVcbmNvbnN0IFVTRV9JTkRFWEVEX0RCID0gZmFsc2U7XG5cbi8vIEhvdyBvZnRlbiBhIHdvcmtlciByZWNoZWNrcyB0aGUgcG9pbnRlciBJbmRleGVkREIgZm9yIGEgZ3JhbnRlZCBoYW5kbGUgd2hlbiBub25lIGlzIGF2YWlsYWJsZSB5ZXQuXG5jb25zdCBXT1JLRVJfUE9MTF9JTlRFUlZBTF9NUyA9IDYwICogMTAwMDtcblxuLy8gVGhlc2UgbWlycm9yIHRoZSBzdWJzZXQgb2YgdGhlIG5hdGl2ZSBGaWxlU3lzdGVtRmlsZUhhbmRsZSAvIEZpbGVTeXN0ZW1EaXJlY3RvcnlIYW5kbGUgQVBJIHdlIHVzZSwgc29cbi8vIHRoZSBuYXRpdmUgYnJvd3NlciBoYW5kbGVzLCB0aGUgTm9kZSBoYW5kbGVzLCBhbmQgdGhlIHJlbW90ZSBoYW5kbGVzIGFyZSBhbGwgaW50ZXJjaGFuZ2VhYmxlIOKAlCBhbmRcbi8vIGNvZGUgd3JpdHRlbiBhZ2FpbnN0IHRoZSBuYXRpdmUgaGFuZGxlIChlLmcuIGEgcmVjdXJzaXZlIHdhbGsgb3ZlciBgaGFuZGxlLmVudHJpZXMoKWApIHdvcmtzIG9uIGFueSBvZlxuLy8gdGhlbS4ga2luZC9uYW1lIGFuZCBlbnRyaWVzKCkgYXJlIHBhcnQgb2YgdGhhdCBjb250cmFjdC5cbmV4cG9ydCB0eXBlIEZpbGVXcmFwcGVyID0ge1xuICAgIHJlYWRvbmx5IGtpbmQ6IFwiZmlsZVwiO1xuICAgIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgICBnZXRGaWxlKCk6IFByb21pc2U8e1xuICAgICAgICBzaXplOiBudW1iZXI7XG4gICAgICAgIGxhc3RNb2RpZmllZDogbnVtYmVyO1xuICAgICAgICBhcnJheUJ1ZmZlcigpOiBQcm9taXNlPEFycmF5QnVmZmVyPjtcbiAgICAgICAgLy8gTWF0Y2hlcyBCbG9iLnNsaWNlICh3aGljaCB0aGUgbmF0aXZlIEZpbGUgb2JqZWN0IHByb3ZpZGVzKSwgc28gdGhlIGJyb3dzZXJcbiAgICAgICAgLy8gIGltcGxlbWVudGF0aW9uIHdvcmtzIHZhbmlsbGEuIEVuZCBpcyBleGNsdXNpdmUsIGJvdGggY2xhbXBlZCB0byB0aGUgZmlsZSBzaXplLlxuICAgICAgICBzbGljZShzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlcik6IHsgYXJyYXlCdWZmZXIoKTogUHJvbWlzZTxBcnJheUJ1ZmZlcj4gfTtcbiAgICB9PjtcbiAgICBjcmVhdGVXcml0YWJsZShjb25maWc/OiB7IGtlZXBFeGlzdGluZ0RhdGE/OiBib29sZWFuIH0pOiBQcm9taXNlPHtcbiAgICAgICAgc2VlayhvZmZzZXQ6IG51bWJlcik6IFByb21pc2U8dm9pZD47XG4gICAgICAgIHdyaXRlKHZhbHVlOiBCdWZmZXIpOiBQcm9taXNlPHZvaWQ+O1xuICAgICAgICBjbG9zZSgpOiBQcm9taXNlPHZvaWQ+O1xuICAgIH0+O1xuICAgIC8vIFJldHVybnMgYSBVUkwgZm9yIHRoZSBmaWxlJ3MgYnl0ZXMsIHVzYWJsZSBpbiA8dmlkZW8+LzxpbWc+L2ZldGNoLiBPcHRpb25hbCDigJQgdGhlIG5hdGl2ZSBicm93c2VyXG4gICAgLy8gRmlsZVN5c3RlbUZpbGVIYW5kbGUgaGFzIG5vIHN1Y2ggbWV0aG9kLCBzbyBwcmVmZXIgdGhlIGdldEZpbGVVUkwoKSBoZWxwZXIsIHdoaWNoIGZhbGxzIGJhY2sgdG8gYVxuICAgIC8vIGJsb2I6IFVSTCB2aWEgY3JlYXRlT2JqZWN0VVJMIGZvciBuYXRpdmUgaGFuZGxlcy4gQWx3YXlzIHJlbGVhc2UgaXQgd2l0aCBkaXNwb3NlRmlsZVVSTCB3aGVuIGRvbmUuXG4gICAgZ2V0VVJMPygpOiBQcm9taXNlPHN0cmluZz47XG59O1xuZXhwb3J0IHR5cGUgRGlyZWN0b3J5V3JhcHBlciA9IHtcbiAgICByZWFkb25seSBraW5kOiBcImRpcmVjdG9yeVwiO1xuICAgIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgICAvLyBGdWxsIHBhdGggZnJvbSB0aGUgc3RvcmFnZSByb290LCBmb3IgZGlhZ25vc3RpY3MvbG9nZ2luZyAodGhlIG5hdGl2ZSBoYW5kbGUgZG9lc24ndCBleHBvc2UgcGF0aHMsXG4gICAgLy8gc28gaXQncyBvcHRpb25hbCkuIGUuZy4gXCJidWxrRGF0YWJhc2VzMi9teUNvbGxlY3Rpb25cIi5cbiAgICByZWFkb25seSBmdWxsUGF0aD86IHN0cmluZztcbiAgICAvLyBUcnVlIHdoZW4gdGhpcyBzdG9yYWdlIGlzIHNlcnZlZCBvdmVyIHRoZSBuZXR3b3JrIChhIHJlbW90ZSBzZXJ2ZXIpIHJhdGhlciB0aGFuIGEgbG9jYWwgZGlzaywgc29cbiAgICAvLyBjYWxsZXJzIGNhbiBhZGFwdCBmb3IgdGhlIGhpZ2hlciBsYXRlbmN5L2Nvc3QgKGxvY2FsL25hdGl2ZSBoYW5kbGVzIGxlYXZlIGl0IHVuZGVmaW5lZCA9IGZhbHNlKS5cbiAgICByZWFkb25seSBpc1JlbW90ZT86IGJvb2xlYW47XG4gICAgcmVtb3ZlRW50cnkoa2V5OiBzdHJpbmcsIG9wdGlvbnM/OiB7IHJlY3Vyc2l2ZT86IGJvb2xlYW4gfSk6IFByb21pc2U8dm9pZD47XG4gICAgZ2V0RmlsZUhhbmRsZShrZXk6IHN0cmluZywgb3B0aW9ucz86IHsgY3JlYXRlPzogYm9vbGVhbiB9KTogUHJvbWlzZTxGaWxlV3JhcHBlcj47XG4gICAgZ2V0RGlyZWN0b3J5SGFuZGxlKGtleTogc3RyaW5nLCBvcHRpb25zPzogeyBjcmVhdGU/OiBib29sZWFuIH0pOiBQcm9taXNlPERpcmVjdG9yeVdyYXBwZXI+O1xuICAgIC8vIEVhY2ggZW50cnkgSVMgYSBoYW5kbGUgKGZpbGUgb3IgZGlyZWN0b3J5KSwgc28gYSByZWN1cnNpdmUgd2FsayBrZWVwcyB3b3JraW5nIGF0IGV2ZXJ5IGxldmVsLlxuICAgIGVudHJpZXMoKTogQXN5bmNJdGVyYWJsZUl0ZXJhdG9yPFtzdHJpbmcsIEZpbGVXcmFwcGVyIHwgRGlyZWN0b3J5V3JhcHBlcl0+O1xuICAgIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKTogQXN5bmNJdGVyYWJsZUl0ZXJhdG9yPFtzdHJpbmcsIEZpbGVXcmFwcGVyIHwgRGlyZWN0b3J5V3JhcHBlcl0+O1xufTtcblxubGV0IGRpc3BsYXlEYXRhID0gb2JzZXJ2YWJsZSh7XG4gICAgdWk6IHVuZGVmaW5lZCBhcyB1bmRlZmluZWQgfCBwcmVhY3QuQ29tcG9uZW50Q2hpbGRyZW4sXG59LCB1bmRlZmluZWQsIHsgZGVlcDogZmFsc2UgfSk7XG5cbmxldCBmaWxlQVBJS2V5ID0gXCJcIjtcbmZ1bmN0aW9uIGdldEZpbGVBUElLZXkoKSB7XG4gICAgaWYgKCFmaWxlQVBJS2V5KSB0aHJvdyBuZXcgRXJyb3IoXCJNdXN0IGNhbGwgc2V0RmlsZUFQSUtleSBiZWZvcmUgdXNpbmcgZmlsZSBzeXN0ZW0uIEp1c3QgcGFzcyBhbnkga2V5LiBUaGlzIHByZXZlbnRzIHJldXNpbmcgdGhlIGZpbGUgc3lzdGVtIGFwaSB0aGF0IG90aGVyIGRldmVsb3BtZW50IGFwcHMgbWlnaHQgYmUgdXNpbmcuXCIpO1xuICAgIHJldHVybiBmaWxlQVBJS2V5O1xufVxuZXhwb3J0IGZ1bmN0aW9uIHNldEZpbGVBUElLZXkoa2V5OiBzdHJpbmcpIHtcbiAgICBmaWxlQVBJS2V5ID0ga2V5O1xufVxuXG4vLyBBIGRpcmVjdG9yeSBoYW5kbGUgdG8gc2VydmUgYXMgdGhlIHN0b3JhZ2Ugcm9vdCBpbnN0ZWFkIG9mIHJlc29sdmluZyBvbmUgdmlhXG4vLyB0aGUgcGlja2VyIC8gc3RvcmVkLXBvaW50ZXIgLyByZW1vdGUgZmxvdy4gU2V0IHRoaXMgaW4gYSBjb250ZXh0IHRoYXQgY2FuJ3QgcnVuXG4vLyB0aGUgaW50ZXJhY3RpdmUgcmVzb2x1dGlvbiDigJQgbW9zdCBpbXBvcnRhbnRseSBhIFdlYiBXb3JrZXIsIHdoaWNoIGhhcyBubyBET00gdG9cbi8vIHByb21wdCB3aXRoIGFuZCBubyBsb2NhbFN0b3JhZ2UgcG9pbnRlci4gVGhlIG93bmluZyB3aW5kb3cgcmVzb2x2ZXMgdGhlIGhhbmRsZVxuLy8gKHdpdGggaXRzIHBlcm1pc3Npb24gZ3JhbnQpIGFuZCBwb3N0TWVzc2FnZXMgaXQgaW47IHRoZSB3b3JrZXIgY2FsbHMgdGhpcyBiZWZvcmVcbi8vIHRvdWNoaW5nIGFueSBzdG9yYWdlLiBXaGVuIHNldCwgZ2V0RGlyZWN0b3J5SGFuZGxlIHJldHVybnMgaXQgZGlyZWN0bHkgYW5kIHNraXBzXG4vLyBldmVyeSBET00gLyBsb2NhbFN0b3JhZ2UgYnJhbmNoIGJlbG93LlxubGV0IHN0b3JhZ2VSb290T3ZlcnJpZGU6IEZpbGVTeXN0ZW1EaXJlY3RvcnlIYW5kbGUgfCB1bmRlZmluZWQ7XG5leHBvcnQgZnVuY3Rpb24gc2V0U3RvcmFnZVJvb3RPdmVycmlkZShoYW5kbGU6IEZpbGVTeXN0ZW1EaXJlY3RvcnlIYW5kbGUgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICBzdG9yYWdlUm9vdE92ZXJyaWRlID0gaGFuZGxlO1xufVxuXG4vLyAtLS0tIHJlbW90ZSAoc2VydmVyKSBzdG9yYWdlIGNvbmZpZyAtLS0tXG4vLyBJbnN0ZWFkIG9mIGEgbG9jYWwgZm9sZGVyLCB0aGUgdXNlciBjYW4gcG9pbnQgYXQgYSByZW1vdGVGaWxlU2VydmVyLmpzIGluc3RhbmNlIChVUkwgKyBwYXNzd29yZCkuXG4vLyBXaGVuIGNvbmZpZ3VyZWQsIGdldEZpbGVTdG9yYWdlTmVzdGVkMiBzZXJ2ZXMgZXZlcnl0aGluZyBmcm9tIHRoYXQgc2VydmVyLiBQZXJzaXN0ZWQgaW4gbG9jYWxTdG9yYWdlLlxudHlwZSBSZW1vdGVDb25maWcgPSB7IHVybDogc3RyaW5nOyBwYXNzd29yZDogc3RyaW5nIH07XG5mdW5jdGlvbiByZW1vdGVDb25maWdLZXkoKSB7IHJldHVybiBnZXRGaWxlQVBJS2V5KCkgKyBcIjpyZW1vdGVcIjsgfVxuZnVuY3Rpb24gbG9hZFJlbW90ZUNvbmZpZygpOiBSZW1vdGVDb25maWcgfCB1bmRlZmluZWQge1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHMgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShyZW1vdGVDb25maWdLZXkoKSk7XG4gICAgICAgIGlmICghcykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3QgYyA9IEpTT04ucGFyc2Uocyk7XG4gICAgICAgIGlmIChjICYmIHR5cGVvZiBjLnVybCA9PT0gXCJzdHJpbmdcIiAmJiB0eXBlb2YgYy5wYXNzd29yZCA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIGM7XG4gICAgfSBjYXRjaCB7IC8qIGlnbm9yZSAqLyB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cbmZ1bmN0aW9uIHNhdmVSZW1vdGVDb25maWcoYzogUmVtb3RlQ29uZmlnKSB7IGxvY2FsU3RvcmFnZS5zZXRJdGVtKHJlbW90ZUNvbmZpZ0tleSgpLCBKU09OLnN0cmluZ2lmeShjKSk7IH1cblxuLy8gVGhlIHNlcnZlciBpcyBhbHdheXMgSFRUUFMgb24gdGhlIGZpbGVob3N0ZXIncyBkZWZhdWx0IHBvcnQsIHNvIHRoZSB1c2VyIG9ubHkgbmVlZHMgdG8gdHlwZSB0aGUgaG9zdFxuLy8gKGUuZy4gXCI2NS4xMDkuOTMuMTEzXCIpLiBXZSBzdHJpcCBhbnkgc2NoZW1lL3BhdGggdGhleSBpbmNsdWRlIGFuZCBkZWZhdWx0IHRoZSBwb3J0IGlmIG9taXR0ZWQuXG5jb25zdCBERUZBVUxUX1JFTU9URV9QT1JUID0gODc4NzsgLy8gbWF0Y2hlcyByZW1vdGVGaWxlU2VydmVyLmpzJ3MgZGVmYXVsdFxuZnVuY3Rpb24gbm9ybWFsaXplU2VydmVyVXJsKHJhdzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBsZXQgcyA9IHJhdy50cmltKCkucmVwbGFjZSgvXlxcdys6XFwvXFwvLywgXCJcIikucmVwbGFjZSgvXFwvLiokLywgXCJcIik7XG4gICAgaWYgKCFzKSByZXR1cm4gXCJcIjtcbiAgICBpZiAoIS86XFxkKyQvLnRlc3QocykpIHMgKz0gXCI6XCIgKyBERUZBVUxUX1JFTU9URV9QT1JUO1xuICAgIHJldHVybiBcImh0dHBzOi8vXCIgKyBzO1xufVxuXG4vLyBPbmUgc2hhcmVkIHJlbW90ZSBEaXJlY3RvcnlXcmFwcGVyIChhbmQgdGhlcmVmb3JlIG9uZSBzaGFyZWQgcmFuZ2UgY2FjaGUpIHBlciByZW1vdGUgY29uZmlnLlxubGV0IHJlbW90ZUhhbmRsZTogeyBrZXk6IHN0cmluZzsgaGFuZGxlOiBEaXJlY3RvcnlXcmFwcGVyIH0gfCB1bmRlZmluZWQ7XG5mdW5jdGlvbiBnZXRSZW1vdGVIYW5kbGUocmVtb3RlOiBSZW1vdGVDb25maWcpOiBEaXJlY3RvcnlXcmFwcGVyIHtcbiAgICBjb25zdCBrZXkgPSByZW1vdGUudXJsICsgXCJcXDBcIiArIHJlbW90ZS5wYXNzd29yZDtcbiAgICBpZiAoIXJlbW90ZUhhbmRsZSB8fCByZW1vdGVIYW5kbGUua2V5ICE9PSBrZXkpIHtcbiAgICAgICAgcmVtb3RlSGFuZGxlID0geyBrZXksIGhhbmRsZTogZ2V0UmVtb3RlRGlyZWN0b3J5SGFuZGxlKHJlbW90ZS51cmwsIHJlbW90ZS5wYXNzd29yZCkgfTtcbiAgICB9XG4gICAgcmV0dXJuIHJlbW90ZUhhbmRsZS5oYW5kbGU7XG59XG5cbkBvYnNlcnZlclxuY2xhc3MgRGlyZWN0b3J5UHJvbXB0ZXIgZXh0ZW5kcyBwcmVhY3QuQ29tcG9uZW50IHtcbiAgICByZW5kZXIoKSB7XG4gICAgICAgIGlmICghZGlzcGxheURhdGEudWkpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17XG4gICAgICAgICAgICAgICAgY3NzLnBvc2l0aW9uKFwiZml4ZWRcIikucG9zKDAsIDApLnNpemUoXCIxMDB2d1wiLCBcIjEwMHZoXCIpXG4gICAgICAgICAgICAgICAgICAgIC56SW5kZXgoMjE0NzQ4MzY0NylcbiAgICAgICAgICAgICAgICAgICAgLmJhY2tncm91bmQoXCJ3aGl0ZVwiKVxuICAgICAgICAgICAgICAgICAgICAuY2VudGVyXG4gICAgICAgICAgICAgICAgICAgIC5mb250U2l6ZSg0MClcbiAgICAgICAgICAgIH0+XG4gICAgICAgICAgICAgICAge2Rpc3BsYXlEYXRhLnVpfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICk7XG4gICAgfVxufVxuXG4vLyBcIkNvbm5lY3QgdG8gYSBzZXJ2ZXJcIiBvcHRpb24gZm9yIHRoZSBkaXJlY3RvcnkgcHJvbXB0OiBjb2xsYXBzZXMgdG8gYSBidXR0b24sIGV4cGFuZHMgdG8gYWRkcmVzcyArXG4vLyBwYXNzd29yZCBmaWVsZHMuIE9uIGNvbm5lY3QgaXQgQUNUVUFMTFkgY29ubmVjdHMgKHRlc3RSZW1vdGVDb25uZWN0aW9uKTsgb25seSBvbiBzdWNjZXNzIGRvZXMgaXRcbi8vIHBlcnNpc3QgdGhlIGNvbmZpZyBhbmQgY2FsbCBvbkNvbm5lY3RlZCwgc28gdGhlIGNhbGxlciAoZ2V0RGlyZWN0b3J5SGFuZGxlKSByZXNvbHZlcyB3aXRoIGEgd29ya2luZ1xuLy8gcmVtb3RlIGhhbmRsZS4gRmFpbHVyZXMgYXJlIHNob3duIHRvIHRoZSB1c2VyIChhbmQgbG9nZ2VkLCB3aXRob3V0IHRoZSBwYXNzd29yZCksIG5ldmVyIHN3YWxsb3dlZC5cbi8vIGBpbml0aWFsYCBwcmUtZmlsbHMgKyBleHBhbmRzIHRoZSBmb3JtICh1c2VkIHRvIHJldHJ5IGEgcmVtZW1iZXJlZCBzZXJ2ZXIgdGhhdCBzdG9wcGVkIHdvcmtpbmcpLlxuQG9ic2VydmVyXG5jbGFzcyBTZXJ2ZXJDb25uZWN0Rm9ybSBleHRlbmRzIHByZWFjdC5Db21wb25lbnQ8eyBvbkNvbm5lY3RlZDogKGNvbmZpZzogUmVtb3RlQ29uZmlnKSA9PiB2b2lkOyBpbml0aWFsPzogUmVtb3RlQ29uZmlnIH0+IHtcbiAgICBwcml2YXRlIG9icyA9IG9ic2VydmFibGUoe1xuICAgICAgICBleHBhbmRlZDogISF0aGlzLnByb3BzLmluaXRpYWwsXG4gICAgICAgIHVybDogdGhpcy5wcm9wcy5pbml0aWFsPy51cmwgfHwgXCJcIixcbiAgICAgICAgcGFzc3dvcmQ6IHRoaXMucHJvcHMuaW5pdGlhbD8ucGFzc3dvcmQgfHwgXCJcIixcbiAgICAgICAgZXJyb3I6IFwiXCIsIGNvbm5lY3Rpbmc6IGZhbHNlLCBuZWVkc0NlcnQ6IGZhbHNlLCBzaG93UGFzc3dvcmQ6IGZhbHNlLFxuICAgIH0pO1xuICAgIHByaXZhdGUgY2xlYW5VcmwoKSB7IHJldHVybiBub3JtYWxpemVTZXJ2ZXJVcmwodGhpcy5vYnMudXJsKTsgfVxuICAgIHByaXZhdGUgY29ubmVjdCA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcyA9IHRoaXMub2JzO1xuICAgICAgICBzLmVycm9yID0gXCJcIjtcbiAgICAgICAgcy5uZWVkc0NlcnQgPSBmYWxzZTtcbiAgICAgICAgcy5jb25uZWN0aW5nID0gdHJ1ZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHVybCA9IHRoaXMuY2xlYW5VcmwoKTtcbiAgICAgICAgICAgIGlmICghdXJsKSB7IHMuZXJyb3IgPSBcIkVudGVyIGEgc2VydmVyIGFkZHJlc3MuXCI7IHJldHVybjsgfVxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGVzdFJlbW90ZUNvbm5lY3Rpb24odXJsLCBzLnBhc3N3b3JkLnRyaW0oKSk7XG4gICAgICAgICAgICBpZiAocmVzdWx0LnN0YXR1cyA9PT0gXCJva1wiKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29uZmlnOiBSZW1vdGVDb25maWcgPSB7IHVybCwgcGFzc3dvcmQ6IHMucGFzc3dvcmQudHJpbSgpIH07XG4gICAgICAgICAgICAgICAgc2F2ZVJlbW90ZUNvbmZpZyhjb25maWcpOyAgICAgICAgICAgICAvLyByZW1lbWJlciBmb3IgbmV4dCBzZXNzaW9uXG4gICAgICAgICAgICAgICAgdGhpcy5wcm9wcy5vbkNvbm5lY3RlZChjb25maWcpOyAgICAgICAvLyBoYW5kIHRoZSB2ZXJpZmllZCBzZXJ2ZXIgYmFjayB0byBnZXREaXJlY3RvcnlIYW5kbGVcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocmVzdWx0LnN0YXR1cyA9PT0gXCJ1bmF1dGhvcml6ZWRcIikge1xuICAgICAgICAgICAgICAgIHMuZXJyb3IgPSBcIlRoZSBzZXJ2ZXIgcmVqZWN0ZWQgdGhhdCBwYXNzd29yZC5cIjtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiUmVtb3RlIGNvbm5lY3Q6IHVuYXV0aG9yaXplZCBmb3JcIiwgdXJsKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gR290IG5vdGhpbmcgYmFjayDigJQgdXN1YWxseSB0aGUgc2VsZi1zaWduZWQgY2VydGlmaWNhdGUgaXNuJ3QgdHJ1c3RlZCB5ZXQsIGJ1dCBzaG93IHRoZVxuICAgICAgICAgICAgICAgIC8vIGFjdHVhbCBlcnJvciB0b28gc28gYSB3cm9uZyBhZGRyZXNzIC8gZG93biBzZXJ2ZXIgLyBDT1JTIGlzc3VlIGlzIGRpYWdub3NhYmxlLlxuICAgICAgICAgICAgICAgIHMubmVlZHNDZXJ0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBzLmVycm9yID0gXCJDb3VsZG4ndCByZWFjaCB0aGUgc2VydmVyOiBcIiArIHJlc3VsdC5lcnJvcjtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiUmVtb3RlIGNvbm5lY3Q6IHVucmVhY2hhYmxlXCIsIHVybCwgXCItXCIsIHJlc3VsdC5lcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHMuZXJyb3IgPSBcIkNvbm5lY3Rpb24gZXJyb3I6IFwiICsgKChlIGFzIEVycm9yKS5tZXNzYWdlIHx8IFN0cmluZyhlKSk7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiUmVtb3RlIGNvbm5lY3QgdGhyZXc6XCIsIGUpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgcy5jb25uZWN0aW5nID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJlbmRlcigpIHtcbiAgICAgICAgY29uc3QgcyA9IHRoaXMub2JzO1xuICAgICAgICBjb25zdCBpbnB1dENzcyA9IGNzcy5mb250U2l6ZSgyOCkucGFkMigyNCwgMTQpLndpZHRoKDU2MCkubWF4V2lkdGgoXCI4MHZ3XCIpO1xuICAgICAgICBjb25zdCBidG5Dc3MgPSBjc3MuZm9udFNpemUoMzIpLnBhZDIoNjAsIDMwKTtcbiAgICAgICAgaWYgKCFzLmV4cGFuZGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gPGJ1dHRvbiBjbGFzc05hbWU9e2J0bkNzc30gb25DbGljaz17KCkgPT4gcy5leHBhbmRlZCA9IHRydWV9PkNvbm5lY3QgdG8gYSBzZXJ2ZXI8L2J1dHRvbj47XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtjc3MudmJveCgxNikuY2VudGVyfT5cbiAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3NOYW1lPXtpbnB1dENzc30gcGxhY2Vob2xkZXI9XCJzZXJ2ZXIgYWRkcmVzcyAoZS5nLiA2NS4xMDkuOTMuMTEzLCBvciBob3N0OnBvcnQpXCIgdmFsdWU9e3MudXJsfVxuICAgICAgICAgICAgICAgICAgICBvbklucHV0PXtlID0+IHMudXJsID0gKGUudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLnZhbHVlfSAvPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtjc3MuaGJveCgxMCkuY2VudGVyfT5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzTmFtZT17aW5wdXRDc3N9IHR5cGU9e3Muc2hvd1Bhc3N3b3JkID8gXCJ0ZXh0XCIgOiBcInBhc3N3b3JkXCJ9IHBsYWNlaG9sZGVyPVwicGFzc3dvcmQgKHNpeCB3b3JkcylcIiB2YWx1ZT17cy5wYXNzd29yZH1cbiAgICAgICAgICAgICAgICAgICAgICAgIG9uSW5wdXQ9e2UgPT4gcy5wYXNzd29yZCA9IChlLnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS52YWx1ZX0gLz5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzc05hbWU9e2Nzcy5mb250U2l6ZSgyMikucGFkMigyNCwgMTIpfSBvbkNsaWNrPXsoKSA9PiBzLnNob3dQYXNzd29yZCA9ICFzLnNob3dQYXNzd29yZH0+XG4gICAgICAgICAgICAgICAgICAgICAgICB7cy5zaG93UGFzc3dvcmQgPyBcIkhpZGVcIiA6IFwiU2hvd1wifVxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICB7cy5lcnJvciA/IDxkaXYgY2xhc3NOYW1lPXtjc3MuZm9udFNpemUoMjIpLmNvbG9yKFwicmVkXCIpLm1heFdpZHRoKFwiODB2d1wiKX0+e3MuZXJyb3J9PC9kaXY+IDogbnVsbH1cbiAgICAgICAgICAgICAgICB7cy5uZWVkc0NlcnQgPyAoXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtjc3MudmJveCgxMCkuY2VudGVyLmZvbnRTaXplKDIwKS5tYXhXaWR0aCg2MjApLm1heFdpZHRoKFwiODB2d1wiKS50ZXh0QWxpZ24oXCJjZW50ZXJcIikuY29sb3IoXCJoc2woMCwgMCUsIDI1JSlcIil9PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5UaGlzIHNlcnZlciB1c2VzIGEgc2VsZi1zaWduZWQgY2VydGlmaWNhdGUsIHNvIHlvdXIgYnJvd3NlciBoYXMgdG8gdHJ1c3QgaXQgb25jZTo8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+MS4gT3BlbiB0aGUgc2VydmVyIGluIGEgbmV3IHRhYiAoYnV0dG9uIGJlbG93KS4gJm5ic3A7IDIuIEFjY2VwdCB0aGUgc2VjdXJpdHkgd2FybmluZyAoQWR2YW5jZWQg4oaSIFByb2NlZWQpLiAmbmJzcDsgMy4gQ29tZSBiYWNrIGFuZCBjbGljayBSZXRyeS48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3NOYW1lPXtjc3MuZm9udFNpemUoMjYpLnBhZDIoNDAsIDIwKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB7IGNvbnN0IHUgPSB0aGlzLmNsZWFuVXJsKCk7IGlmICh1KSB3aW5kb3cub3Blbih1ICsgXCIvXCIsIFwiX2JsYW5rXCIpOyB9fT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVuIHNlcnZlciAmYW1wOyBhY2NlcHQgY2VydGlmaWNhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICApIDogbnVsbH1cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17Y3NzLmhib3goMTYpfT5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzc05hbWU9e2J0bkNzc30gZGlzYWJsZWQ9e3MuY29ubmVjdGluZ30gb25DbGljaz17dGhpcy5jb25uZWN0fT5cbiAgICAgICAgICAgICAgICAgICAgICAgIHtzLmNvbm5lY3RpbmcgPyBcIkNvbm5lY3RpbmfigKZcIiA6IHMubmVlZHNDZXJ0ID8gXCJSZXRyeVwiIDogXCJDb25uZWN0XCJ9XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzTmFtZT17YnRuQ3NzfSBvbkNsaWNrPXsoKSA9PiB7IHMuZXhwYW5kZWQgPSBmYWxzZTsgcy5lcnJvciA9IFwiXCI7IHMubmVlZHNDZXJ0ID0gZmFsc2U7IH19PkJhY2s8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICApO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIE5vZGVKU0ZpbGVIYW5kbGVXcmFwcGVyIGltcGxlbWVudHMgRmlsZVdyYXBwZXIge1xuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgZmlsZVBhdGg6IHN0cmluZykge1xuICAgIH1cbiAgICByZWFkb25seSBraW5kID0gXCJmaWxlXCIgYXMgY29uc3Q7XG4gICAgZ2V0IG5hbWUoKSB7IHJldHVybiBwYXRoLmJhc2VuYW1lKHRoaXMuZmlsZVBhdGgpOyB9XG5cbiAgICBhc3luYyBnZXRGaWxlKCkge1xuICAgICAgICBjb25zdCBzdGF0cyA9IGF3YWl0IGZzLnByb21pc2VzLnN0YXQodGhpcy5maWxlUGF0aCk7XG4gICAgICAgIGNvbnN0IGZpbGVQYXRoID0gdGhpcy5maWxlUGF0aDtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHNpemU6IHN0YXRzLnNpemUsXG4gICAgICAgICAgICBsYXN0TW9kaWZpZWQ6IHN0YXRzLm10aW1lTXMsXG4gICAgICAgICAgICBhcnJheUJ1ZmZlcjogYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGJ1ZmZlciA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gYnVmZmVyLmJ1ZmZlci5zbGljZShidWZmZXIuYnl0ZU9mZnNldCwgYnVmZmVyLmJ5dGVPZmZzZXQgKyBidWZmZXIuYnl0ZUxlbmd0aCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2xpY2U6IChzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlcikgPT4gKHtcbiAgICAgICAgICAgICAgICBhcnJheUJ1ZmZlcjogYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjbGFtcGVkU3RhcnQgPSBNYXRoLm1pbihNYXRoLm1heChzdGFydCwgMCksIHN0YXRzLnNpemUpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjbGFtcGVkRW5kID0gTWF0aC5taW4oTWF0aC5tYXgoZW5kLCBjbGFtcGVkU3RhcnQpLCBzdGF0cy5zaXplKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbGVuZ3RoID0gY2xhbXBlZEVuZCAtIGNsYW1wZWRTdGFydDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlsZUhhbmRsZSA9IGF3YWl0IGZzLnByb21pc2VzLm9wZW4oZmlsZVBhdGgsIFwiclwiKTtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJ1ZmZlciA9IEJ1ZmZlci5hbGxvYyhsZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgZmlsZUhhbmRsZS5yZWFkKGJ1ZmZlciwgMCwgbGVuZ3RoLCBjbGFtcGVkU3RhcnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlci5idWZmZXIuc2xpY2UoYnVmZmVyLmJ5dGVPZmZzZXQsIGJ1ZmZlci5ieXRlT2Zmc2V0ICsgYnVmZmVyLmJ5dGVMZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgZmlsZUhhbmRsZS5jbG9zZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBhc3luYyBnZXRVUkwoKSB7XG4gICAgICAgIHJldHVybiBcImZpbGU6Ly9cIiArIHBhdGgucmVzb2x2ZSh0aGlzLmZpbGVQYXRoKTtcbiAgICB9XG5cbiAgICBhc3luYyBjcmVhdGVXcml0YWJsZShjb25maWc/OiB7IGtlZXBFeGlzdGluZ0RhdGE/OiBib29sZWFuIH0pIHtcbiAgICAgICAgbGV0IGZpbGVIYW5kbGU6IGZzLnByb21pc2VzLkZpbGVIYW5kbGU7XG4gICAgICAgIGNvbnN0IGZsYWdzID0gY29uZmlnPy5rZWVwRXhpc3RpbmdEYXRhID8gXCJyK1wiIDogXCJ3XCI7XG5cbiAgICAgICAgLy8gRW5zdXJlIHRoZSBkaXJlY3RvcnkgZXhpc3RzXG4gICAgICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKHBhdGguZGlybmFtZSh0aGlzLmZpbGVQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgICAgICAgLy8gT3BlbiBvciBjcmVhdGUgdGhlIGZpbGVcbiAgICAgICAgaWYgKGNvbmZpZz8ua2VlcEV4aXN0aW5nRGF0YSAmJiBhd2FpdCBmcy5wcm9taXNlcy5hY2Nlc3ModGhpcy5maWxlUGF0aCkudGhlbigoKSA9PiB0cnVlKS5jYXRjaCgoKSA9PiBmYWxzZSkpIHtcbiAgICAgICAgICAgIGZpbGVIYW5kbGUgPSBhd2FpdCBmcy5wcm9taXNlcy5vcGVuKHRoaXMuZmlsZVBhdGgsIGZsYWdzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZpbGVIYW5kbGUgPSBhd2FpdCBmcy5wcm9taXNlcy5vcGVuKHRoaXMuZmlsZVBhdGgsIFwid1wiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBwb3NpdGlvbiA9IDA7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHNlZWs6IGFzeW5jIChvZmZzZXQ6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gb2Zmc2V0O1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHdyaXRlOiBhc3luYyAodmFsdWU6IEJ1ZmZlcikgPT4ge1xuICAgICAgICAgICAgICAgIGF3YWl0IGZpbGVIYW5kbGUud3JpdGUodmFsdWUsIDAsIHZhbHVlLmxlbmd0aCwgcG9zaXRpb24pO1xuICAgICAgICAgICAgICAgIHBvc2l0aW9uICs9IHZhbHVlLmxlbmd0aDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjbG9zZTogYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGF3YWl0IGZpbGVIYW5kbGUuY2xvc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBOb2RlSlNEaXJlY3RvcnlIYW5kbGVXcmFwcGVyIGltcGxlbWVudHMgRGlyZWN0b3J5V3JhcHBlciB7XG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSByb290UGF0aDogc3RyaW5nKSB7XG4gICAgfVxuICAgIHJlYWRvbmx5IGtpbmQgPSBcImRpcmVjdG9yeVwiIGFzIGNvbnN0O1xuICAgIGdldCBuYW1lKCkgeyByZXR1cm4gcGF0aC5iYXNlbmFtZSh0aGlzLnJvb3RQYXRoKTsgfVxuICAgIGdldCBmdWxsUGF0aCgpIHsgcmV0dXJuIHRoaXMucm9vdFBhdGg7IH1cbiAgICBlbnRyaWVzKCkgeyByZXR1cm4gdGhpc1tTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKTsgfVxuXG4gICAgYXN5bmMgcmVtb3ZlRW50cnkoa2V5OiBzdHJpbmcsIG9wdGlvbnM/OiB7IHJlY3Vyc2l2ZT86IGJvb2xlYW4gfSkge1xuICAgICAgICBjb25zdCBlbnRyeVBhdGggPSBwYXRoLmpvaW4odGhpcy5yb290UGF0aCwga2V5KTtcbiAgICAgICAgaWYgKG9wdGlvbnM/LnJlY3Vyc2l2ZSkge1xuICAgICAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMucm0oZW50cnlQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhd2FpdCBmcy5wcm9taXNlcy51bmxpbmsoZW50cnlQYXRoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIGdldEZpbGVIYW5kbGUoa2V5OiBzdHJpbmcsIG9wdGlvbnM/OiB7IGNyZWF0ZT86IGJvb2xlYW4gfSk6IFByb21pc2U8RmlsZVdyYXBwZXI+IHtcbiAgICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4odGhpcy5yb290UGF0aCwga2V5KTtcblxuICAgICAgICBjb25zdCBleGlzdHMgPSBhd2FpdCBmcy5wcm9taXNlcy5hY2Nlc3MoZmlsZVBhdGgpLnRoZW4oKCkgPT4gdHJ1ZSkuY2F0Y2goKCkgPT4gZmFsc2UpO1xuXG4gICAgICAgIGlmICghZXhpc3RzICYmIG9wdGlvbnM/LmNyZWF0ZSkge1xuICAgICAgICAgICAgLy8gRW5zdXJlIHRoZSBkaXJlY3RvcnkgZXhpc3RzXG4gICAgICAgICAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihwYXRoLmRpcm5hbWUoZmlsZVBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgZmlsZVxuICAgICAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKGZpbGVQYXRoLCBCdWZmZXIuYWxsb2MoMCkpO1xuICAgICAgICB9IGVsc2UgaWYgKCFleGlzdHMpIHtcbiAgICAgICAgICAgIC8vIFRhZyBhcyBFTk9FTlQgc28gcmVhZFdpdGhSZXRyeSB0cmVhdHMgaXQgYXMgYSBnZW51aW5lbHktbWlzc2luZyBmaWxlIChyZXR1cm4gdW5kZWZpbmVkIG5vdylcbiAgICAgICAgICAgIC8vIHJhdGhlciB0aGFuIGEgdHJhbnNpZW50IHJlYWQgZmFpbHVyZSB0byByZXRyeSA2w5cgd2l0aCBiYWNrb2ZmIOKAlCBtaXNzaW5nIGZpbGVzIGFyZSBub3JtYWxcbiAgICAgICAgICAgIC8vIChhIGNvbmN1cnJlbnQgbWVyZ2UgZGVsZXRlcyBhIGZpbGUgbWlkLXJlYWQpLCBhbmQgcmV0cnlpbmcgdGhlbSBpcyBjYXRhc3Ryb3BoaWNhbGx5IHNsb3cuXG4gICAgICAgICAgICBjb25zdCBlcnIgPSBuZXcgRXJyb3IoYEZpbGUgbm90IGZvdW5kOiAke2ZpbGVQYXRofWApIGFzIEVycm9yICYgeyBjb2RlPzogc3RyaW5nIH07XG4gICAgICAgICAgICBlcnIuY29kZSA9IFwiRU5PRU5UXCI7XG4gICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IE5vZGVKU0ZpbGVIYW5kbGVXcmFwcGVyKGZpbGVQYXRoKTtcbiAgICB9XG5cbiAgICBhc3luYyBnZXREaXJlY3RvcnlIYW5kbGUoa2V5OiBzdHJpbmcsIG9wdGlvbnM/OiB7IGNyZWF0ZT86IGJvb2xlYW4gfSk6IFByb21pc2U8RGlyZWN0b3J5V3JhcHBlcj4ge1xuICAgICAgICBjb25zdCBkaXJQYXRoID0gcGF0aC5qb2luKHRoaXMucm9vdFBhdGgsIGtleSk7XG5cbiAgICAgICAgaWYgKG9wdGlvbnM/LmNyZWF0ZSkge1xuICAgICAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIoZGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBleGlzdHMgPSBhd2FpdCBmcy5wcm9taXNlcy5hY2Nlc3MoZGlyUGF0aCkudGhlbigoKSA9PiB0cnVlKS5jYXRjaCgoKSA9PiBmYWxzZSk7XG4gICAgICAgICAgICBpZiAoIWV4aXN0cykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRGlyZWN0b3J5IG5vdCBmb3VuZDogJHtkaXJQYXRofWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBOb2RlSlNEaXJlY3RvcnlIYW5kbGVXcmFwcGVyKGRpclBhdGgpO1xuICAgIH1cblxuICAgIGFzeW5jICpbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCk6IEFzeW5jSXRlcmFibGVJdGVyYXRvcjxbc3RyaW5nLCBGaWxlV3JhcHBlciB8IERpcmVjdG9yeVdyYXBwZXJdPiB7XG4gICAgICAgIC8vIEVuc3VyZSBkaXJlY3RvcnkgZXhpc3RzXG4gICAgICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKHRoaXMucm9vdFBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gICAgICAgIGNvbnN0IGVudHJpZXMgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkZGlyKHRoaXMucm9vdFBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcblxuICAgICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGNoaWxkUGF0aCA9IHBhdGguam9pbih0aGlzLnJvb3RQYXRoLCBlbnRyeS5uYW1lKTtcbiAgICAgICAgICAgIGlmIChlbnRyeS5pc0ZpbGUoKSkge1xuICAgICAgICAgICAgICAgIHlpZWxkIFtlbnRyeS5uYW1lLCBuZXcgTm9kZUpTRmlsZUhhbmRsZVdyYXBwZXIoY2hpbGRQYXRoKV07XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGVudHJ5LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgICAgICAgICAgICB5aWVsZCBbZW50cnkubmFtZSwgbmV3IE5vZGVKU0RpcmVjdG9yeUhhbmRsZVdyYXBwZXIoY2hpbGRQYXRoKV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cblxuLy8gV2hlbiBzZXQsIGdldERpcmVjdG9yeUhhbmRsZSBza2lwcyBldmVyeSBwcm9tcHQgKyByZW1vdGUgY2hlY2sgYW5kIHNlcnZlcyBmcm9tIHRoZSBicm93c2VyJ3MgT3JpZ2luXG4vLyBQcml2YXRlIEZpbGUgU3lzdGVtIChPUEZTKS4gT25lIG5hbWVkIHN1YmZvbGRlciBpcyBcImN1cnJlbnRcIiBwZXIgZmlsZUFQSUtleTsgcGlja1ByaXZhdGVGb2xkZXIgL1xuLy8gcmVzZXRTdG9yYWdlTG9jYXRpb24gc3dpdGNoIHdoaWNoIG9uZS4gU2V0IHRoaXMgaW4gYXBwIHN0YXJ0dXAgQkVGT1JFIHRoZSBmaXJzdCBnZXREaXJlY3RvcnlIYW5kbGUuXG5sZXQgb3Bmc0VuYWJsZWQgPSBmYWxzZTtcbmNvbnN0IE9QRlNfRk9MREVSU19ESVIgPSBcImZvbGRlcnNcIjtcbmNvbnN0IE9QRlNfREVGQVVMVF9GT0xERVIgPSBcImRlZmF1bHRcIjtcbmZ1bmN0aW9uIG9wZnNDdXJyZW50S2V5KCkgeyByZXR1cm4gZ2V0RmlsZUFQSUtleSgpICsgXCI6b3BmczpjdXJyZW50XCI7IH1cbmZ1bmN0aW9uIGdldEN1cnJlbnRPcGZzRm9sZGVyKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGxvY2FsU3RvcmFnZS5nZXRJdGVtKG9wZnNDdXJyZW50S2V5KCkpIHx8IE9QRlNfREVGQVVMVF9GT0xERVI7XG59XG5mdW5jdGlvbiBzZXRDdXJyZW50T3Bmc0ZvbGRlcihuYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShvcGZzQ3VycmVudEtleSgpLCBuYW1lKTtcbn1cblxuLy8gU3dpdGNoZXMgZ2V0RGlyZWN0b3J5SGFuZGxlIHRvIHRoZSBPcmlnaW4gUHJpdmF0ZSBGaWxlIFN5c3RlbS4gTm8gZGlyZWN0b3J5IHBpY2tlciwgbm8gcGVybWlzc2lvblxuLy8gcHJvbXB0LCBubyByZW1vdGUgc2VydmVyIGNoZWNrLiBQZXJzaXN0cyBub3RoaW5nIOKAlCBjYWxsIG9uIGV2ZXJ5IGFwcCBzdGFydCBiZWZvcmUgcmVhZGluZyBzdG9yYWdlLlxuZXhwb3J0IGZ1bmN0aW9uIHVzZVByaXZhdGVGaWxlU3lzdGVtKCk6IHZvaWQge1xuICAgIG9wZnNFbmFibGVkID0gdHJ1ZTtcbn1cblxuLy8gV2hldGhlciB0aGUgT1BGUyBicmFuY2ggaXMgaW4gZWZmZWN0IChzbyBvdGhlciBjYWxsZXJzIGNhbiBhZGFwdCDigJQgZS5nLiBza2lwIHRoZSBcImZpbmQgZGF0YSBzdWJkaXJcIlxuLy8gaGFjayBpbiBnZXRGaWxlU3RvcmFnZU5lc3RlZDIgc2luY2UgT1BGUyBpcyBhbHdheXMgYSBjbGVhbiByb290IHdlIG93biBlbmQtdG8tZW5kKS5cbmV4cG9ydCBmdW5jdGlvbiBpc1ByaXZhdGVGaWxlU3lzdGVtQWN0aXZlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBvcGZzRW5hYmxlZDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0T3Bmc0ZvbGRlcnNEaXIoKTogUHJvbWlzZTxGaWxlU3lzdGVtRGlyZWN0b3J5SGFuZGxlPiB7XG4gICAgaWYgKCFuYXZpZ2F0b3Iuc3RvcmFnZT8uZ2V0RGlyZWN0b3J5KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlByaXZhdGUgRmlsZSBTeXN0ZW0gQWNjZXNzIEFQSSBub3Qgc3VwcG9ydGVkIGluIHRoaXMgYnJvd3NlclwiKTtcbiAgICB9XG4gICAgaWYgKGxvY2F0aW9uLnByb3RvY29sID09PSBcImZpbGU6XCIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUHJpdmF0ZSBGaWxlIFN5c3RlbSBBUEkgaXMgZGlzYWxsb3dlZCBpbiBmaWxlOi8vIGxvY2F0aW9ucy4gSG9zdCBvbiBhbiBhY3R1YWwgb3JpZ2luLlwiKTtcbiAgICB9XG4gICAgY29uc3Qgcm9vdCA9IGF3YWl0IG5hdmlnYXRvci5zdG9yYWdlLmdldERpcmVjdG9yeSgpO1xuICAgIGNvbnN0IGtleWVkID0gYXdhaXQgcm9vdC5nZXREaXJlY3RvcnlIYW5kbGUoZ2V0RmlsZUFQSUtleSgpLCB7IGNyZWF0ZTogdHJ1ZSB9KTtcbiAgICByZXR1cm4gYXdhaXQga2V5ZWQuZ2V0RGlyZWN0b3J5SGFuZGxlKE9QRlNfRk9MREVSU19ESVIsIHsgY3JlYXRlOiB0cnVlIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRDdXJyZW50T3Bmc0hhbmRsZSgpOiBQcm9taXNlPERpcmVjdG9yeVdyYXBwZXI+IHtcbiAgICBjb25zdCBmb2xkZXJzID0gYXdhaXQgZ2V0T3Bmc0ZvbGRlcnNEaXIoKTtcbiAgICBjb25zdCBmb2xkZXIgPSBhd2FpdCBmb2xkZXJzLmdldERpcmVjdG9yeUhhbmRsZShnZXRDdXJyZW50T3Bmc0ZvbGRlcigpLCB7IGNyZWF0ZTogdHJ1ZSB9KTtcbiAgICByZXR1cm4gZm9sZGVyIGFzIHVua25vd24gYXMgRGlyZWN0b3J5V3JhcHBlcjtcbn1cblxuLy8gQWxsIHByZXZpb3VzbHktdXNlZCBPUEZTIHN1YmZvbGRlcnMgdW5kZXIgdGhpcyBmaWxlQVBJS2V5LCBzb3J0ZWQgYWxwaGFiZXRpY2FsbHkgKHRpbWVzdGFtcC1uYW1lZFxuLy8gYXV0by1nZW5lcmF0ZWQgZm9sZGVycyB0aGVyZWZvcmUgc29ydCBjaHJvbm9sb2dpY2FsbHkpLiBVc2UgdGhpcyB0byBzdXJmYWNlIGEgbGlzdCwgdGhlbiBjYWxsXG4vLyBwaWNrUHJpdmF0ZUZvbGRlcihuYW1lKSB0byBzd2l0Y2guXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbGlzdFByaXZhdGVGb2xkZXJzKCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICBpZiAoIW5hdmlnYXRvci5zdG9yYWdlPy5nZXREaXJlY3RvcnkpIHJldHVybiBbXTtcbiAgICBsZXQgZm9sZGVyczogRmlsZVN5c3RlbURpcmVjdG9yeUhhbmRsZTtcbiAgICB0cnkgeyBmb2xkZXJzID0gYXdhaXQgZ2V0T3Bmc0ZvbGRlcnNEaXIoKTsgfSBjYXRjaCB7IHJldHVybiBbXTsgfVxuICAgIGNvbnN0IG5hbWVzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGZvciBhd2FpdCAoY29uc3QgW25hbWUsIGhhbmRsZV0gb2YgKGZvbGRlcnMgYXMgdW5rbm93biBhcyBBc3luY0l0ZXJhYmxlPFtzdHJpbmcsIHsga2luZDogc3RyaW5nIH1dPikpIHtcbiAgICAgICAgaWYgKGhhbmRsZS5raW5kID09PSBcImRpcmVjdG9yeVwiKSBuYW1lcy5wdXNoKG5hbWUpO1xuICAgIH1cbiAgICByZXR1cm4gbmFtZXMuc29ydCgpO1xufVxuXG4vLyBTd2l0Y2ggdG8gYSBzcGVjaWZpYyBPUEZTIHN1YmZvbGRlciBhbmQgcmVsb2FkIHNvIGdldERpcmVjdG9yeUhhbmRsZSByZS1yZXNvbHZlcyB0byBpdC4gVGhlIGZvbGRlclxuLy8gaXMgY3JlYXRlZCBpZiBpdCBkb2Vzbid0IGV4aXN0IHlldC5cbmV4cG9ydCBmdW5jdGlvbiBwaWNrUHJpdmF0ZUZvbGRlcihuYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBzZXRDdXJyZW50T3Bmc0ZvbGRlcihuYW1lKTtcbiAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7XG59XG5cbi8vIFJldHVybnMgdGhlIGRpcmVjdG9yeSBoYW5kbGUgdG8gdXNlIOKAlCBsb2NhbCAoTm9kZSAvIHBpY2tlZCBmb2xkZXIpIE9SIGEgcmVtb3RlIHNlcnZlciwgYm90aCBhcyB0aGVcbi8vIHNhbWUgRGlyZWN0b3J5V3JhcHBlciwgc28gY2FsbGVycyBkb24ndCBrbm93IG9yIGNhcmUgd2hpY2ggaXQgaXMuIEEgcmVtZW1iZXJlZCBzZXJ2ZXIgaXMgVkVSSUZJRURcbi8vICh3ZSBhY3R1YWxseSBjb25uZWN0KSBiZWZvcmUgdXNlOyBpZiBpdCBubyBsb25nZXIgd29ya3Mgd2UgcmUtcHJvbXB0LCBqdXN0IGxpa2UgYSBsb2NhbCBmb2xkZXIgd2hvc2Vcbi8vIHBlcm1pc3Npb24gd2FzIGxvc3QuIEJsb2NrcyB1bnRpbCByZWFkeSAob3IgdGhlIHVzZXIgZGlzbWlzc2VzLCB3aGljaCByZWplY3RzKS5cbmV4cG9ydCBjb25zdCBnZXREaXJlY3RvcnlIYW5kbGUgPSBsYXp5KGFzeW5jIGZ1bmN0aW9uIGdldERpcmVjdG9yeUhhbmRsZSgpOiBQcm9taXNlPERpcmVjdG9yeVdyYXBwZXI+IHtcbiAgICAvLyBBbiBpbmplY3RlZCByb290IChlLmcuIGEgV2ViIFdvcmtlciBoYW5kZWQgdGhlIGhhbmRsZSBieSBpdHMgb3duaW5nIHdpbmRvdylcbiAgICAvLyBzaG9ydC1jaXJjdWl0cyB0aGUgd2hvbGUgaW50ZXJhY3RpdmUgcmVzb2x1dGlvbiDigJQgbm8gcGlja2VyLCBubyBET00sIG5vXG4gICAgLy8gbG9jYWxTdG9yYWdlLiBNdXN0IGNvbWUgZmlyc3Qgc28gYSB3b3JrZXIgbmV2ZXIgcmVhY2hlcyB0aGUgYnJhbmNoZXMgYmVsb3cuXG4gICAgaWYgKHN0b3JhZ2VSb290T3ZlcnJpZGUpIHtcbiAgICAgICAgcmV0dXJuIHN0b3JhZ2VSb290T3ZlcnJpZGUgYXMgdW5rbm93biBhcyBEaXJlY3RvcnlXcmFwcGVyO1xuICAgIH1cbiAgICAvLyBBIHdvcmtlciBjYW4ndCBzaG93IHRoZSBwaWNrZXIgKG5vIERPTSAvIG5vIHVzZXIgYWN0aXZhdGlvbikgYW5kIGNhbid0IHJlYWQgbG9jYWxTdG9yYWdlLCBidXRcbiAgICAvLyBpdCBDQU4gb3BlbiB0aGUgcG9pbnRlciBJbmRleGVkREIgdGhlIG1haW4tdGhyZWFkIHBpY2tlciBwZXJzaXN0cyB0by4gUG9sbCBpdCBmb3IgYSBoYW5kbGVcbiAgICAvLyB3aG9zZSBwZXJtaXNzaW9uIGlzIGFscmVhZHkgZ3JhbnRlZDsgdGhlIG93bmluZyB3aW5kb3cgbWF5IGFsc28gcG9zdE1lc3NhZ2UgYSBoYW5kbGUgaW5cbiAgICAvLyBtaWQtcG9sbCAoY2hlY2tlZCBlYWNoIGl0ZXJhdGlvbikuIFRoaXMgaGFzIHRvIGNvbWUgYmVmb3JlIHRoZSBpc05vZGUgYnJhbmNoOiB0eXBlc2FmZWNzcydzXG4gICAgLy8gaXNOb2RlKCkgcmV0dXJucyB0cnVlIGluIHdvcmtlcnMgKHdpbmRvdyBpcyB1bmRlZmluZWQpLCBzbyBhIHdvcmtlciB3b3VsZCBvdGhlcndpc2UgZmFsbCBpbnRvXG4gICAgLy8gdGhlIE5vZGUgYnJhbmNoIGFuZCB0cnkgdG8gdXNlIGZzL3BhdGguXG4gICAgaWYgKFwiV29ya2VyR2xvYmFsU2NvcGVcIiBpbiBnbG9iYWxUaGlzKSB7XG4gICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICBpZiAoc3RvcmFnZVJvb3RPdmVycmlkZSkgcmV0dXJuIHN0b3JhZ2VSb290T3ZlcnJpZGUgYXMgdW5rbm93biBhcyBEaXJlY3RvcnlXcmFwcGVyO1xuICAgICAgICAgICAgbGV0IGhhbmRsZSA9IGF3YWl0IGZpbmRHcmFudGVkUG9pbnRlckhhbmRsZShcInJlYWR3cml0ZVwiKTtcbiAgICAgICAgICAgIGlmIChoYW5kbGUpIHJldHVybiBoYW5kbGUgYXMgdW5rbm93biBhcyBEaXJlY3RvcnlXcmFwcGVyO1xuICAgICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIFdPUktFUl9QT0xMX0lOVEVSVkFMX01TKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzTm9kZSgpKSB7XG4gICAgICAgIHJldHVybiBuZXcgTm9kZUpTRGlyZWN0b3J5SGFuZGxlV3JhcHBlcihwYXRoLnJlc29sdmUoXCIuL2RhdGEvXCIpKTtcbiAgICB9XG4gICAgaWYgKG9wZnNFbmFibGVkKSB7XG4gICAgICAgIHJldHVybiBnZXRDdXJyZW50T3Bmc0hhbmRsZSgpO1xuICAgIH1cblxuICAgIC8vIEEgc2VydmVyIGNvbm5lY3RlZCBpbiBhIHByZXZpb3VzIHNlc3Npb246IG9ubHkgcmV1c2UgaXQgaWYgaXQgc3RpbGwgYWN0dWFsbHkgd29ya3MuXG4gICAgY29uc3Qgc2F2ZWRSZW1vdGUgPSBsb2FkUmVtb3RlQ29uZmlnKCk7XG4gICAgaWYgKHNhdmVkUmVtb3RlKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRlc3RSZW1vdGVDb25uZWN0aW9uKHNhdmVkUmVtb3RlLnVybCwgc2F2ZWRSZW1vdGUucGFzc3dvcmQpO1xuICAgICAgICBpZiAocmVzdWx0LnN0YXR1cyA9PT0gXCJva1wiKSByZXR1cm4gZ2V0UmVtb3RlSGFuZGxlKHNhdmVkUmVtb3RlKTtcbiAgICAgICAgY29uc29sZS53YXJuKGBTYXZlZCByZW1vdGUgc2VydmVyIGRpZG4ndCBjb25uZWN0ICgke3Jlc3VsdC5zdGF0dXN9KSR7cmVzdWx0LnN0YXR1cyA9PT0gXCJ1bnJlYWNoYWJsZVwiID8gXCI6IFwiICsgcmVzdWx0LmVycm9yIDogXCJcIn0g4oCUIHJlLXByb21wdGluZy5gKTtcbiAgICB9XG5cbiAgICBsZXQgcm9vdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChyb290KTtcbiAgICBwcmVhY3QucmVuZGVyKDxEaXJlY3RvcnlQcm9tcHRlciAvPiwgcm9vdCk7XG4gICAgdHJ5IHtcbiAgICAgICAgbGV0IHJlc29sdmVIYW5kbGUhOiAoaDogRGlyZWN0b3J5V3JhcHBlcikgPT4gdm9pZDtcbiAgICAgICAgbGV0IHJlamVjdEhhbmRsZSE6IChlOiBFcnJvcikgPT4gdm9pZDtcbiAgICAgICAgY29uc3QgcHJvbWlzZSA9IG5ldyBQcm9taXNlPERpcmVjdG9yeVdyYXBwZXI+KChyZXMsIHJlaikgPT4geyByZXNvbHZlSGFuZGxlID0gcmVzOyByZWplY3RIYW5kbGUgPSByZWo7IH0pO1xuXG4gICAgICAgIGNvbnN0IHBpY2tMb2NhbCA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaGFuZGxlID0gYXdhaXQgd2luZG93LnNob3dEaXJlY3RvcnlQaWNrZXIoKTtcbiAgICAgICAgICAgICAgICBhd2FpdCBoYW5kbGUucmVxdWVzdFBlcm1pc3Npb24oeyBtb2RlOiBcInJlYWR3cml0ZVwiIH0pO1xuICAgICAgICAgICAgICAgIGNvbnN0IHN0b3JlZElkID0gYXdhaXQgc3RvcmVGaWxlU3lzdGVtUG9pbnRlcih7IG1vZGU6IFwicmVhZHdyaXRlXCIsIGhhbmRsZSB9KTtcbiAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShnZXRGaWxlQVBJS2V5KCksIHN0b3JlZElkKTtcbiAgICAgICAgICAgICAgICByZXNvbHZlSGFuZGxlKGhhbmRsZSBhcyBhbnkpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJEaXJlY3RvcnkgcGljayBmYWlsZWQvY2FuY2VsbGVkOlwiLCBlKTsgLy8gc3RheSBvbiB0aGUgcHJvbXB0XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IG9uQ29ubmVjdGVkID0gKGNvbmZpZzogUmVtb3RlQ29uZmlnKSA9PiB7IHNhdmVSZW1vdGVDb25maWcoY29uZmlnKTsgcmVzb2x2ZUhhbmRsZShnZXRSZW1vdGVIYW5kbGUoY29uZmlnKSk7IH07XG4gICAgICAgIC8vIFRoZSB0aHJlZSBvcHRpb25zLCByZW5kZXJlZCBmcmVzaCBlYWNoIHRpbWUuIElmIGEgc2F2ZWQgc2VydmVyIGp1c3QgZmFpbGVkLCBwcmUtZmlsbCArIGV4cGFuZFxuICAgICAgICAvLyB0aGUgY29ubmVjdCBmb3JtIHNvIHRoZSB1c2VyIGNhbiByZXRyeSBvciBmaXggaXQuXG4gICAgICAgIGNvbnN0IHJlbmRlck9wdGlvbnMgPSAoKSA9PiAoXG4gICAgICAgICAgICA8PlxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3NOYW1lPXtjc3MuZm9udFNpemUoNDApLnBhZDIoODAsIDQwKX0gb25DbGljaz17cGlja0xvY2FsfT5QaWNrIERhdGEgRGlyZWN0b3J5PC9idXR0b24+XG4gICAgICAgICAgICAgICAgPFNlcnZlckNvbm5lY3RGb3JtIG9uQ29ubmVjdGVkPXtvbkNvbm5lY3RlZH0gaW5pdGlhbD17c2F2ZWRSZW1vdGV9IC8+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzc05hbWU9e2Nzcy5mb250U2l6ZSg0MCkucGFkMig4MCwgNDApfVxuICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiByZWplY3RIYW5kbGUobmV3IEVycm9yKFwiVXNlciBkaXNtaXNzZWQgZmlsZSBzeXN0ZW0gYWNjZXNzIHByb21wdFwiKSl9PkRpc21pc3M8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvPlxuICAgICAgICApO1xuXG4gICAgICAgIC8vIEEgcHJldmlvdXNseS1waWNrZWQgbG9jYWwgZm9sZGVyOiB0cnkgdG8gcmVzdG9yZSBpdCAobWF5IG5lZWQgYSBjbGljaykuIFNraXBwZWQgd2hlbiBhIHNhdmVkXG4gICAgICAgIC8vIHNlcnZlciBmYWlsZWQg4oCUIHRoYXQgdXNlciB3YW50cyB0aGUgc2VydmVyLCBzbyBnbyBzdHJhaWdodCB0byB0aGUgKHByZS1maWxsZWQpIHByb21wdC5cbiAgICAgICAgY29uc3Qgc3RvcmVkSWQgPSAhc2F2ZWRSZW1vdGUgJiYgbG9jYWxTdG9yYWdlLmdldEl0ZW0oZ2V0RmlsZUFQSUtleSgpKTtcbiAgICAgICAgaWYgKHN0b3JlZElkKSB7XG4gICAgICAgICAgICBsZXQgZG9uZUxvYWQgPSBmYWxzZTtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4geyBpZiAoIWRvbmVMb2FkKSBkaXNwbGF5RGF0YS51aSA9IFwiQ2xpY2sgYW55d2hlcmUgdG8gYWxsb3cgZmlsZSBzeXN0ZW0gYWNjZXNzXCI7IH0sIDUwMCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGhhbmRsZSA9IGF3YWl0IHRyeVRvTG9hZFBvaW50ZXIoc3RvcmVkSWQpO1xuICAgICAgICAgICAgICAgIGRvbmVMb2FkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBpZiAoaGFuZGxlKSByZXR1cm4gaGFuZGxlO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGRvbmVMb2FkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG1zZyA9IGUgaW5zdGFuY2VvZiBFcnJvciA/IGUubWVzc2FnZSA6IFN0cmluZyhlKTtcbiAgICAgICAgICAgICAgICBpZiAobXNnLmluY2x1ZGVzKFwidXNlciBhY3RpdmF0aW9uXCIpIHx8IG1zZy5pbmNsdWRlcyhcIlVzZXIgYWN0aXZhdGlvblwiKSkge1xuICAgICAgICAgICAgICAgICAgICBkaXNwbGF5RGF0YS51aSA9IChcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtjc3MudmJveCgyMCkuY2VudGVyfT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzTmFtZT17Y3NzLmZvbnRTaXplKDQwKS5wYWQyKDgwLCA0MCl9IG9uQ2xpY2s9e2FzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheURhdGEudWkgPSBcIkxvYWRpbmcuLi5cIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGggPSBhd2FpdCB0cnlUb0xvYWRQb2ludGVyKHN0b3JlZElkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoKSB7IHJlc29sdmVIYW5kbGUoaCk7IHJldHVybjsgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChyZXRyeUVycm9yKSB7IGNvbnNvbGUuZXJyb3IoXCJSZXRyeSBmYWlsZWQ6XCIsIHJldHJ5RXJyb3IpOyB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlEYXRhLnVpID0gPGRpdiBjbGFzc05hbWU9e2Nzcy52Ym94KDIwKS5jZW50ZXJ9PntyZW5kZXJPcHRpb25zKCl9PC9kaXY+O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19PkNsaWNrIHRvIHJlc3RvcmUgZmlsZSBzeXN0ZW0gYWNjZXNzPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3JlbmRlck9wdGlvbnMoKX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgcHJvbWlzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZGlzcGxheURhdGEudWkgPSA8ZGl2IGNsYXNzTmFtZT17Y3NzLnZib3goMjApLmNlbnRlcn0+e3JlbmRlck9wdGlvbnMoKX08L2Rpdj47XG4gICAgICAgIHJldHVybiBhd2FpdCBwcm9taXNlO1xuICAgIH0gZmluYWxseSB7XG4gICAgICAgIHByZWFjdC5yZW5kZXIobnVsbCwgcm9vdCk7XG4gICAgICAgIHJvb3QucmVtb3ZlKCk7XG4gICAgfVxufSk7XG5cbmV4cG9ydCBjb25zdCBnZXRGaWxlU3RvcmFnZU5lc3RlZCA9IGNhY2hlKGFzeW5jIGZ1bmN0aW9uIGdldEZpbGVTdG9yYWdlKHBhdGg6IHN0cmluZyk6IFByb21pc2U8RmlsZVN0b3JhZ2U+IHtcbiAgICBsZXQgYmFzZSA9IGF3YWl0IGdldERpcmVjdG9yeUhhbmRsZSgpO1xuICAgIGZvciAobGV0IHBhcnQgb2YgcGF0aC5zcGxpdChcIi9cIikpIHtcbiAgICAgICAgaWYgKCFwYXJ0KSBjb250aW51ZTtcbiAgICAgICAgYmFzZSA9IGF3YWl0IGJhc2UuZ2V0RGlyZWN0b3J5SGFuZGxlKHBhcnQsIHsgY3JlYXRlOiB0cnVlIH0pO1xuICAgIH1cbiAgICByZXR1cm4gd3JhcEhhbmRsZShiYXNlKTtcbn0pO1xuLy8gU3VwcG9ydHMgaWYgdGhlIHVzZXIgc2VsZWN0cyB0aGUgZm9sZGVyIHRoYXQgY29udGFpbnMgdGhlIGRhdGEgZm9sZGVyIG9yIHRoZSBkYXRhIGZvbGRlciBkaXJlY3RseS4gSWYgcGF0aFN0ciBpcyBhbiBhYnNvbHV0ZSBwYXRoIChhbmQgd2UncmUgaW4gbm9kZWpzKSB3ZSB1c2UgaXQgZGlyZWN0bHkuXG5leHBvcnQgY29uc3QgZ2V0RmlsZVN0b3JhZ2VOZXN0ZWQyID0gY2FjaGUoYXN5bmMgZnVuY3Rpb24gZ2V0RmlsZVN0b3JhZ2UocGF0aFN0cjogc3RyaW5nKTogUHJvbWlzZTxGaWxlU3RvcmFnZT4ge1xuICAgIGxldCBiYXNlOiBEaXJlY3RvcnlXcmFwcGVyO1xuICAgIHBhdGhTdHIgPSBwYXRoU3RyLnJlcGxhY2VBbGwoXCJcXFxcXCIsIFwiL1wiKTtcbiAgICBpZiAoaXNOb2RlKCkpIHtcbiAgICAgICAgaWYgKHBhdGguaXNBYnNvbHV0ZShwYXRoU3RyKSkge1xuICAgICAgICAgICAgcmV0dXJuIHdyYXBIYW5kbGUobmV3IE5vZGVKU0RpcmVjdG9yeUhhbmRsZVdyYXBwZXIocGF0aFN0cikpO1xuICAgICAgICB9XG4gICAgICAgIGJhc2UgPSBuZXcgTm9kZUpTRGlyZWN0b3J5SGFuZGxlV3JhcHBlcihwYXRoLnJlc29sdmUoXCIuL2RhdGEvXCIpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBiYXNlID0gYXdhaXQgZ2V0RGlyZWN0b3J5SGFuZGxlKCk7XG4gICAgICAgIC8vIFNraXAgdGhlIFwiZmluZCBkYXRhIHN1YmRpclwiIGhhY2sgdW5kZXIgT1BGUyDigJQgdGhhdCdzIGZvciBwaWNrZWQgZGlyZWN0b3JpZXMgd2hlcmUgdGhlIHVzZXJcbiAgICAgICAgLy8gbWlnaHQgaGF2ZSBzZWxlY3RlZCBhIGZvbGRlciB3aXRoIHVucmVsYXRlZCBmaWxlczsgT1BGUyBpcyBhIGNsZWFuIHJvb3Qgd2Ugb3duIGVuZC10by1lbmQuXG4gICAgICAgIGlmICghb3Bmc0VuYWJsZWQpIHtcbiAgICAgICAgICAgIGxldCBkaXJzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICAgICAgbGV0IGFsbHM6IHN0cmluZ1tdID0gW107XG4gICAgICAgICAgICBmb3IgYXdhaXQgKGNvbnN0IFtuYW1lLCBlbnRyeV0gb2YgYmFzZSkge1xuICAgICAgICAgICAgICAgIGlmIChlbnRyeS5raW5kID09PSBcImRpcmVjdG9yeVwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGRpcnMucHVzaChuYW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYWxscy5wdXNoKG5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gSEFDSzogSWYgdGhlcmUgYXJlIGVub3VnaCBmaWxlcywgaXQncyBhbG1vc3QgY2VydGFpbmx5IG5vdCBhIGRpcmVjdG9yeSB0aGF0IGNvbnRhaW5zIGNvbGxlY3Rpb25zLiBJdCdzIHByb2JhYmx5IHRoZSB1c2VyJ3MgZGF0YSBpbnN0ZWFkXG4gICAgICAgICAgICBpZiAoZGlycy5pbmNsdWRlcyhcIi5naXRcIikgfHwgZGlycy5pbmNsdWRlcyhcImRhdGFcIikgfHwgYWxscy5sZW5ndGggPiAxMDApIHtcbiAgICAgICAgICAgICAgICBiYXNlID0gYXdhaXQgYmFzZS5nZXREaXJlY3RvcnlIYW5kbGUoXCJkYXRhXCIsIHsgY3JlYXRlOiB0cnVlIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGZvciAobGV0IHBhcnQgb2YgcGF0aFN0ci5zcGxpdChcIi9cIikpIHtcbiAgICAgICAgaWYgKCFwYXJ0KSBjb250aW51ZTtcbiAgICAgICAgYmFzZSA9IGF3YWl0IGJhc2UuZ2V0RGlyZWN0b3J5SGFuZGxlKHBhcnQsIHsgY3JlYXRlOiB0cnVlIH0pO1xuICAgIH1cbiAgICByZXR1cm4gd3JhcEhhbmRsZShiYXNlKTtcbn0pO1xuZXhwb3J0IGNvbnN0IGdldEZpbGVTdG9yYWdlID0gbGF6eShhc3luYyBmdW5jdGlvbiBnZXRGaWxlU3RvcmFnZSgpOiBQcm9taXNlPEZpbGVTdG9yYWdlPiB7XG4gICAgaWYgKFVTRV9JTkRFWEVEX0RCKSB7XG4gICAgICAgIHJldHVybiBhd2FpdCBnZXRGaWxlU3RvcmFnZUluZGV4REIoKTtcbiAgICB9XG4gICAgbGV0IGhhbmRsZSA9IGF3YWl0IGdldERpcmVjdG9yeUhhbmRsZSgpO1xuICAgIHJldHVybiB3cmFwSGFuZGxlKGhhbmRsZSk7XG59KTtcbmV4cG9ydCBmdW5jdGlvbiByZXNldFN0b3JhZ2VMb2NhdGlvbigpIHtcbiAgICBpZiAob3Bmc0VuYWJsZWQpIHtcbiAgICAgICAgLy8gRG9uJ3QgZGVsZXRlIHByZXZpb3VzIGZvbGRlciDigJQgbGlzdFByaXZhdGVGb2xkZXJzIC8gcGlja1ByaXZhdGVGb2xkZXIgc3RpbGwgbmVlZCBpdC4gSnVzdCBwb2ludFxuICAgICAgICAvLyBcImN1cnJlbnRcIiBhdCBhIGZyZXNoIHRpbWVzdGFtcC1uYW1lZCBvbmUgc28gdGhlIG5leHQgcmVsb2FkIHN0YXJ0cyBjbGVhbi5cbiAgICAgICAgc2V0Q3VycmVudE9wZnNGb2xkZXIobmV3IERhdGUoKS50b0lTT1N0cmluZygpLnJlcGxhY2UoL1s6Ll0vZywgXCItXCIpKTtcbiAgICAgICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKGdldEZpbGVBUElLZXkoKSk7XG4gICAgdHJ5IHsgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0ocmVtb3RlQ29uZmlnS2V5KCkpOyB9IGNhdGNoIHsgLyogaWdub3JlICovIH1cbiAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7XG59XG5cbmV4cG9ydCB0eXBlIE5lc3RlZEZpbGVTdG9yYWdlID0ge1xuICAgIGhhc0tleShrZXk6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj47XG4gICAgZ2V0U3RvcmFnZShrZXk6IHN0cmluZyk6IFByb21pc2U8RmlsZVN0b3JhZ2U+O1xuICAgIHJlbW92ZVN0b3JhZ2Uoa2V5OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+O1xuICAgIGdldEtleXMoaW5jbHVkZUZvbGRlcnM/OiBib29sZWFuKTogUHJvbWlzZTxzdHJpbmdbXT47XG59O1xuXG5leHBvcnQgdHlwZSBGaWxlU3RvcmFnZSA9IElTdG9yYWdlUmF3ICYge1xuICAgIGZvbGRlcjogTmVzdGVkRmlsZVN0b3JhZ2U7XG4gICAgLy8gTWlycm9ycyBEaXJlY3RvcnlXcmFwcGVyLmlzUmVtb3RlOiB0cnVlIHdoZW4gdGhpcyBzdG9yYWdlIGlzIHNlcnZlZCBvdmVyIHRoZSBuZXR3b3JrLiBMZXRzIGNhbGxlcnNcbiAgICAvLyAoZS5nLiBCdWxrRGF0YWJhc2UyLCB3aGljaCBza2lwcyBhdXRvbWF0aWMgY29tcGFjdGlvbiBvdmVyIHRoZSBuZXR3b3JrIGJ5IGRlZmF1bHQpIGFkYXB0LlxuICAgIGlzUmVtb3RlPzogYm9vbGVhbjtcbn07XG5cbmxldCBhcHBlbmRRdWV1ZSA9IGNhY2hlKChrZXk6IHN0cmluZykgPT4ge1xuICAgIHJldHVybiBydW5JblNlcmlhbCgoZm5jOiAoKSA9PiBQcm9taXNlPHZvaWQ+KSA9PiBmbmMoKSk7XG59KTtcblxuXG5hc3luYyBmdW5jdGlvbiBmaXhlZEdldEZpbGVIYW5kbGUoY29uZmlnOiB7XG4gICAgaGFuZGxlOiBEaXJlY3RvcnlXcmFwcGVyO1xuICAgIGtleTogc3RyaW5nO1xuICAgIGNyZWF0ZTogdHJ1ZTtcbn0pOiBQcm9taXNlPEZpbGVXcmFwcGVyPjtcbmFzeW5jIGZ1bmN0aW9uIGZpeGVkR2V0RmlsZUhhbmRsZShjb25maWc6IHtcbiAgICBoYW5kbGU6IERpcmVjdG9yeVdyYXBwZXI7XG4gICAga2V5OiBzdHJpbmc7XG4gICAgY3JlYXRlPzogYm9vbGVhbjtcbn0pOiBQcm9taXNlPEZpbGVXcmFwcGVyIHwgdW5kZWZpbmVkPjtcbmFzeW5jIGZ1bmN0aW9uIGZpeGVkR2V0RmlsZUhhbmRsZShjb25maWc6IHtcbiAgICBoYW5kbGU6IERpcmVjdG9yeVdyYXBwZXI7XG4gICAga2V5OiBzdHJpbmc7XG4gICAgY3JlYXRlPzogYm9vbGVhbjtcbn0pOiBQcm9taXNlPEZpbGVXcmFwcGVyIHwgdW5kZWZpbmVkPiB7XG4gICAgaWYgKGNvbmZpZy5rZXkuaW5jbHVkZXMoXCIvXCIpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IHVzZSBmb2xkZXJzIGRpcmVjdGx5IGluIGZpbGUgc3lzdGVtIHJlYWQgLyB3cml0ZXMuIFVzZSBhIHdyYXBwZXIgd2hpY2ggaGFuZGxlcyB0aGUgZm9sZGVyIG5hdmlnYXRpb24uIFBhdGggd2FzICR7SlNPTi5zdHJpbmdpZnkoY29uZmlnLmtleSl9YCk7XG4gICAgfVxuICAgIC8vIEFMV0FZUyB0cnkgd2l0aG91dCBjcmVhdGUsIGJlY2F1c2UgdGhlIHNzaGZzLXdpbiBzdWNrcyBhbmQgZG9lc24ndCBzdXBwb3J0IGBjcmVhdGU6IHRydWVgPyBXdGYuLi5cbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gYXdhaXQgY29uZmlnLmhhbmRsZS5nZXRGaWxlSGFuZGxlKGNvbmZpZy5rZXkpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgICBpZiAoIWNvbmZpZy5jcmVhdGUpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiBhd2FpdCBjb25maWcuaGFuZGxlLmdldEZpbGVIYW5kbGUoY29uZmlnLmtleSwgeyBjcmVhdGU6IHRydWUgfSk7XG59XG5cbi8vIEEgZmlsZSB0aGF0IGdlbnVpbmVseSBkb2VzIG5vdCBleGlzdC4gV2UgbXVzdCBOT1QgcmV0cnkgdGhlc2UsIG90aGVyd2lzZSByZWFkaW5nIG1hbnkgbWlzc2luZ1xuLy8gZmlsZXMgKGEgY29tbW9uIHBhdHRlcm4pIGdldHMgY2F0YXN0cm9waGljYWxseSBzbG93LlxuZnVuY3Rpb24gaXNNaXNzaW5nRXJyb3IoZXJyb3I6IHVua25vd24pOiBib29sZWFuIHtcbiAgICBsZXQgbmFtZSA9IChlcnJvciBhcyB7IG5hbWU/OiBzdHJpbmcgfSk/Lm5hbWU7XG4gICAgbGV0IGNvZGUgPSAoZXJyb3IgYXMgeyBjb2RlPzogc3RyaW5nIH0pPy5jb2RlO1xuICAgIHJldHVybiBuYW1lID09PSBcIk5vdEZvdW5kRXJyb3JcIiB8fCBjb2RlID09PSBcIkVOT0VOVFwiO1xufVxuXG5jb25zdCBNQVhfUkVBRF9SRVRSSUVTID0gNjtcblxuLy8gVGhlIGJyb3dzZXIgRmlsZSBTeXN0ZW0gQWNjZXNzIEFQSSBjYW4gdHJhbnNpZW50bHkgZmFpbCByZWFkcyB1bmRlciBoZWF2eSBsb2FkIChpdCBhcHBlYXJzIHRvXG4vLyB0aHJvdHRsZSB3aGVuIGEgcGFnZSBpc3N1ZXMgbWFueSByZWFkcyBhdCBvbmNlKS4gVGhvc2UgZmFpbHVyZXMgc3VyZmFjZSBhcyBlcnJvcnMgT1RIRVIgdGhhblxuLy8gXCJub3QgZm91bmRcIiwgc28gd2UgcmV0cnkgdGhlbSB3aXRoIGJhY2tvZmYuIEEgcmVhbCBtaXNzaW5nIGZpbGUgKE5vdEZvdW5kRXJyb3IgLyBFTk9FTlQpIHJldHVybnNcbi8vIHVuZGVmaW5lZCBpbW1lZGlhdGVseSB3aXRoIG5vIHJldHJ5LlxuYXN5bmMgZnVuY3Rpb24gcmVhZFdpdGhSZXRyeTxUPihsYWJlbDogc3RyaW5nLCBrZXk6IHN0cmluZywgcmVhZDogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VCB8IHVuZGVmaW5lZD4ge1xuICAgIGxldCBiYWNrb2ZmID0gMjU7XG4gICAgZm9yIChsZXQgYXR0ZW1wdCA9IDA7IDsgYXR0ZW1wdCsrKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgcmVhZCgpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKGlzTWlzc2luZ0Vycm9yKGVycm9yKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGxldCBuYW1lID0gKGVycm9yIGFzIHsgbmFtZT86IHN0cmluZyB9KT8ubmFtZSB8fCBcIkVycm9yXCI7XG4gICAgICAgICAgICBsZXQgbWVzc2FnZSA9IChlcnJvciBhcyB7IG1lc3NhZ2U/OiBzdHJpbmcgfSk/Lm1lc3NhZ2UgfHwgU3RyaW5nKGVycm9yKTtcbiAgICAgICAgICAgIGlmIChhdHRlbXB0ID49IE1BWF9SRUFEX1JFVFJJRVMpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oYCR7bGFiZWx9IGdhdmUgdXAgb24gJHtKU09OLnN0cmluZ2lmeShrZXkpfSBhZnRlciAke2F0dGVtcHR9IHJldHJpZXMgKCR7bmFtZX0pOiAke21lc3NhZ2Uuc2xpY2UoMCwgMjAwKX1gKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc29sZS53YXJuKGAke2xhYmVsfSByZXRyeWluZyAke0pTT04uc3RyaW5naWZ5KGtleSl9IChhdHRlbXB0ICR7YXR0ZW1wdCArIDF9LCAke25hbWV9KTogJHttZXNzYWdlLnNsaWNlKDAsIDIwMCl9YCk7XG4gICAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgYmFja29mZikpO1xuICAgICAgICAgICAgYmFja29mZiA9IE1hdGgubWluKGJhY2tvZmYgKiAyLCAxMDAwKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZnVuY3Rpb24gd3JhcEhhbmRsZUZpbGVzKGhhbmRsZTogRGlyZWN0b3J5V3JhcHBlcik6IElTdG9yYWdlUmF3IHtcbiAgICAvLyBMb2cgdGhlIGZ1bGwgcGF0aCAocm9vdCArIGZpbGVuYW1lKSB3aGVuIGF2YWlsYWJsZSwgc28gYSBmYWlsaW5nIGZpbGUgaXMgaWRlbnRpZmlhYmxlLlxuICAgIGNvbnN0IHBhdGhPZiA9IChrZXk6IHN0cmluZykgPT4gaGFuZGxlLmZ1bGxQYXRoID8gaGFuZGxlLmZ1bGxQYXRoICsgXCIvXCIgKyBrZXkgOiBrZXk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgYXN5bmMgZ2V0SW5mbyhrZXk6IHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIHJlYWRXaXRoUmV0cnkoXCJnZXRJbmZvXCIsIHBhdGhPZihrZXkpLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlsZSA9IGF3YWl0IGhhbmRsZS5nZXRGaWxlSGFuZGxlKGtleSk7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlsZUNvbnRlbnQgPSBhd2FpdCBmaWxlLmdldEZpbGUoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBzaXplOiBmaWxlQ29udGVudC5zaXplLFxuICAgICAgICAgICAgICAgICAgICBsYXN0TW9kaWZpZWQ6IGZpbGVDb250ZW50Lmxhc3RNb2RpZmllZCxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIGFzeW5jIGdldChrZXk6IHN0cmluZyk6IFByb21pc2U8QnVmZmVyIHwgdW5kZWZpbmVkPiB7XG4gICAgICAgICAgICByZXR1cm4gcmVhZFdpdGhSZXRyeShcImdldFwiLCBwYXRoT2Yoa2V5KSwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZpbGUgPSBhd2FpdCBoYW5kbGUuZ2V0RmlsZUhhbmRsZShrZXkpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGZpbGVDb250ZW50ID0gYXdhaXQgZmlsZS5nZXRGaWxlKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgYXJyYXlCdWZmZXIgPSBhd2FpdCBmaWxlQ29udGVudC5hcnJheUJ1ZmZlcigpO1xuICAgICAgICAgICAgICAgIC8vIFVuZGVyIGxvYWQgdGhlIEZTIEFjY2VzcyBBUEkgY2FuIHJlc29sdmUgd2l0aCBhIHRydW5jYXRlZCBidWZmZXIgYW5kIG5vIGVycm9yLlxuICAgICAgICAgICAgICAgIC8vICBUcmVhdCBhIHNob3J0IHJlYWQgYXMgdHJhbnNpZW50IHNvIHJlYWRXaXRoUmV0cnkgcmV0cmllcyBpdC5cbiAgICAgICAgICAgICAgICBpZiAoYXJyYXlCdWZmZXIuYnl0ZUxlbmd0aCAhPT0gZmlsZUNvbnRlbnQuc2l6ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBPYmplY3QuYXNzaWduKG5ldyBFcnJvcihgU2hvcnQgcmVhZDogZ290ICR7YXJyYXlCdWZmZXIuYnl0ZUxlbmd0aH0gb2YgJHtmaWxlQ29udGVudC5zaXplfSBieXRlc2ApLCB7IG5hbWU6IFwiU2hvcnRSZWFkRXJyb3JcIiB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIEJ1ZmZlci5mcm9tKGFycmF5QnVmZmVyKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuXG4gICAgICAgIGFzeW5jIGdldFJhbmdlKGtleTogc3RyaW5nLCBjb25maWc6IHsgc3RhcnQ6IG51bWJlcjsgZW5kOiBudW1iZXIgfSk6IFByb21pc2U8QnVmZmVyIHwgdW5kZWZpbmVkPiB7XG4gICAgICAgICAgICByZXR1cm4gcmVhZFdpdGhSZXRyeShcImdldFJhbmdlXCIsIHBhdGhPZihrZXkpLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlsZSA9IGF3YWl0IGhhbmRsZS5nZXRGaWxlSGFuZGxlKGtleSk7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlsZUNvbnRlbnQgPSBhd2FpdCBmaWxlLmdldEZpbGUoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBjbGFtcGVkU3RhcnQgPSBNYXRoLm1pbihNYXRoLm1heChjb25maWcuc3RhcnQsIDApLCBmaWxlQ29udGVudC5zaXplKTtcbiAgICAgICAgICAgICAgICBjb25zdCBjbGFtcGVkRW5kID0gTWF0aC5taW4oTWF0aC5tYXgoY29uZmlnLmVuZCwgY2xhbXBlZFN0YXJ0KSwgZmlsZUNvbnRlbnQuc2l6ZSk7XG4gICAgICAgICAgICAgICAgY29uc3QgYXJyYXlCdWZmZXIgPSBhd2FpdCBmaWxlQ29udGVudC5zbGljZShjb25maWcuc3RhcnQsIGNvbmZpZy5lbmQpLmFycmF5QnVmZmVyKCk7XG4gICAgICAgICAgICAgICAgaWYgKGFycmF5QnVmZmVyLmJ5dGVMZW5ndGggIT09IGNsYW1wZWRFbmQgLSBjbGFtcGVkU3RhcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgT2JqZWN0LmFzc2lnbihuZXcgRXJyb3IoYFNob3J0IHJhbmdlIHJlYWQ6IGdvdCAke2FycmF5QnVmZmVyLmJ5dGVMZW5ndGh9IG9mICR7Y2xhbXBlZEVuZCAtIGNsYW1wZWRTdGFydH0gYnl0ZXNgKSwgeyBuYW1lOiBcIlNob3J0UmVhZEVycm9yXCIgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBCdWZmZXIuZnJvbShhcnJheUJ1ZmZlcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcblxuICAgICAgICBhc3luYyBhcHBlbmQoa2V5OiBzdHJpbmcsIHZhbHVlOiBCdWZmZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgICAgIGF3YWl0IGFwcGVuZFF1ZXVlKGtleSkoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIE5PVEU6IEludGVyZXN0aW5nIHBvaW50LiBDaHJvbWUgZG9lc24ndCBvcHRpbWl6ZSB0aGlzIHRvIGJlIGFuIGFwcGVuZCwgYW5kIGluc3RlYWRcbiAgICAgICAgICAgICAgICAvLyAgcmV3cml0ZXMgdGhlIGVudGlyZSBmaWxlLlxuICAgICAgICAgICAgICAgIGNvbnN0IGZpbGUgPSBhd2FpdCBmaXhlZEdldEZpbGVIYW5kbGUoeyBoYW5kbGUsIGtleSwgY3JlYXRlOiB0cnVlIH0pO1xuICAgICAgICAgICAgICAgIGNvbnN0IHdyaXRhYmxlID0gYXdhaXQgZmlsZS5jcmVhdGVXcml0YWJsZSh7IGtlZXBFeGlzdGluZ0RhdGE6IHRydWUgfSk7XG4gICAgICAgICAgICAgICAgbGV0IG9mZnNldCA9IChhd2FpdCBmaWxlLmdldEZpbGUoKSkuc2l6ZTtcbiAgICAgICAgICAgICAgICBhd2FpdCB3cml0YWJsZS5zZWVrKG9mZnNldCk7XG4gICAgICAgICAgICAgICAgYXdhaXQgd3JpdGFibGUud3JpdGUodmFsdWUpO1xuICAgICAgICAgICAgICAgIGF3YWl0IHdyaXRhYmxlLmNsb3NlKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcblxuICAgICAgICBhc3luYyBzZXQoa2V5OiBzdHJpbmcsIHZhbHVlOiBCdWZmZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgICAgIGNvbnN0IGZpbGUgPSBhd2FpdCBmaXhlZEdldEZpbGVIYW5kbGUoeyBoYW5kbGUsIGtleSwgY3JlYXRlOiB0cnVlIH0pO1xuICAgICAgICAgICAgY29uc3Qgd3JpdGFibGUgPSBhd2FpdCBmaWxlLmNyZWF0ZVdyaXRhYmxlKCk7XG4gICAgICAgICAgICBhd2FpdCB3cml0YWJsZS53cml0ZSh2YWx1ZSk7XG4gICAgICAgICAgICBhd2FpdCB3cml0YWJsZS5jbG9zZSgpO1xuICAgICAgICB9LFxuXG4gICAgICAgIGFzeW5jIHJlbW92ZShrZXk6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICAgICAgYXdhaXQgaGFuZGxlLnJlbW92ZUVudHJ5KGtleSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgYXN5bmMgZ2V0S2V5cyhpbmNsdWRlRm9sZGVyczogYm9vbGVhbiA9IGZhbHNlKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgICAgICAgICAgY29uc3Qga2V5czogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgZm9yIGF3YWl0IChjb25zdCBbbmFtZSwgZW50cnldIG9mIGhhbmRsZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZW50cnkua2luZCA9PT0gXCJmaWxlXCIgfHwgaW5jbHVkZUZvbGRlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleXMucHVzaChlbnRyeS5uYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgbGV0IG5hbWUgPSAoZXJyb3IgYXMgeyBuYW1lPzogc3RyaW5nIH0pPy5uYW1lIHx8IFwiRXJyb3JcIjtcbiAgICAgICAgICAgICAgICBsZXQgbWVzc2FnZSA9IChlcnJvciBhcyB7IG1lc3NhZ2U/OiBzdHJpbmcgfSk/Lm1lc3NhZ2UgfHwgU3RyaW5nKGVycm9yKTtcbiAgICAgICAgICAgICAgICAvLyBBIGZhaWx1cmUgbWlkLWl0ZXJhdGlvbiB3b3VsZCBzaWxlbnRseSB0cnVuY2F0ZSB0aGUgbGlzdGluZywgc28gc3VyZmFjZSBpdCBsb3VkbHkuXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgZ2V0S2V5cyBkaXJlY3RvcnkgaXRlcmF0aW9uIGZhaWxlZCBhZnRlciAke2tleXMubGVuZ3RofSBlbnRyaWVzICgke25hbWV9KTogJHttZXNzYWdlLnNsaWNlKDAsIDMwMCl9YCk7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4ga2V5cztcbiAgICAgICAgfSxcblxuICAgICAgICBhc3luYyByZXNldCgpIHtcbiAgICAgICAgICAgIGZvciBhd2FpdCAoY29uc3QgW25hbWUsIGVudHJ5XSBvZiBoYW5kbGUpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCBoYW5kbGUucmVtb3ZlRW50cnkoZW50cnkubmFtZSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgfTtcbn1cblxuZnVuY3Rpb24gd3JhcEhhbmRsZU5lc3RlZChoYW5kbGU6IERpcmVjdG9yeVdyYXBwZXIpOiBOZXN0ZWRGaWxlU3RvcmFnZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgYXN5bmMgaGFzS2V5KGtleTogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGF3YWl0IGhhbmRsZS5nZXREaXJlY3RvcnlIYW5kbGUoa2V5KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIGFzeW5jIGdldFN0b3JhZ2Uoa2V5OiBzdHJpbmcpOiBQcm9taXNlPEZpbGVTdG9yYWdlPiB7XG4gICAgICAgICAgICBjb25zdCBzdWJEaXJlY3RvcnkgPSBhd2FpdCBoYW5kbGUuZ2V0RGlyZWN0b3J5SGFuZGxlKGtleSwgeyBjcmVhdGU6IHRydWUgfSk7XG4gICAgICAgICAgICByZXR1cm4gd3JhcEhhbmRsZShzdWJEaXJlY3RvcnkpO1xuICAgICAgICB9LFxuXG4gICAgICAgIGFzeW5jIHJlbW92ZVN0b3JhZ2Uoa2V5OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgICAgIGF3YWl0IGhhbmRsZS5yZW1vdmVFbnRyeShrZXksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgICB9LFxuXG4gICAgICAgIGFzeW5jIGdldEtleXMoKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgICAgICAgICAgY29uc3Qga2V5czogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgICAgIGZvciBhd2FpdCAoY29uc3QgW25hbWUsIGVudHJ5XSBvZiBoYW5kbGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoZW50cnkua2luZCA9PT0gXCJkaXJlY3RvcnlcIikge1xuICAgICAgICAgICAgICAgICAgICBrZXlzLnB1c2goZW50cnkubmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGtleXM7XG4gICAgICAgIH0sXG4gICAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdyYXBIYW5kbGUoaGFuZGxlOiBEaXJlY3RvcnlXcmFwcGVyKTogRmlsZVN0b3JhZ2Uge1xuICAgIHJldHVybiB7XG4gICAgICAgIC4uLndyYXBIYW5kbGVGaWxlcyhoYW5kbGUpLFxuICAgICAgICBmb2xkZXI6IHdyYXBIYW5kbGVOZXN0ZWQoaGFuZGxlKSxcbiAgICAgICAgaXNSZW1vdGU6IGhhbmRsZS5pc1JlbW90ZSxcbiAgICB9O1xufVxuXG4vLyBSZXR1cm5zIGEgVVJMIGZvciBhIGZpbGUncyBieXRlcywgcmVhZHkgdG8gZHJvcCBpbnRvIDx2aWRlbz4vPGltZz4vZmV0Y2guIEEgbmF0aXZlIChsb2NhbCkgZmlsZSBiZWNvbWVzXG4vLyBhbiBpbi1tZW1vcnkgYmxvYjogVVJMOyBhIHJlbW90ZSBmaWxlIGJlY29tZXMgYW4gaHR0cHMgVVJMIGludG8gdGhlIHNlcnZlcidzIHJhbmdlLWNhcGFibGUgL21lZGlhXG4vLyBlbmRwb2ludCAoYXV0aCB0b2tlbiBpbiB0aGUgcXVlcnksIHNpbmNlIGEgbWVkaWEgZWxlbWVudCBjYW4ndCBzZW5kIGhlYWRlcnMpLiBCb3RoIHN1cHBvcnQgSFRUUCByYW5nZSAvXG4vLyBzZWVraW5nLiBBTFdBWVMgaGFuZCB0aGUgcmVzdWx0IHRvIGRpc3Bvc2VGaWxlVVJMIHdoZW4gZmluaXNoZWQg4oCUIGZvciBibG9iOiBVUkxzIHRoYXQgZnJlZXMgbWVtb3J5LlxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEZpbGVVUkwoZmlsZTogRmlsZVdyYXBwZXIpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGlmIChmaWxlLmdldFVSTCkgcmV0dXJuIGZpbGUuZ2V0VVJMKCk7XG4gICAgLy8gTmF0aXZlIEZpbGVTeXN0ZW1GaWxlSGFuZGxlIChvciBhbnkgQmxvYi1iYWNrZWQgZmlsZSk6IGEgYmxvYjogVVJMIG92ZXIgdGhlIEZpbGUgaXRzZWxmLlxuICAgIGNvbnN0IGYgPSBhd2FpdCBmaWxlLmdldEZpbGUoKTtcbiAgICByZXR1cm4gVVJMLmNyZWF0ZU9iamVjdFVSTChmIGFzIHVua25vd24gYXMgQmxvYik7XG59XG5cbi8vIFJlbGVhc2VzIGEgVVJMIGZyb20gZ2V0RmlsZVVSTC4gYmxvYjogVVJMcyBsZWFrIHVudGlsIHRoZSBkb2N1bWVudCBpcyBnb25lIHVubGVzcyByZXZva2VkOyBodHRwcy9maWxlOlxuLy8gVVJMcyBuZWVkIG5vIGNsZWFudXAsIHNvIHRoaXMgaXMgYSBuby1vcCBmb3IgdGhlbS5cbmV4cG9ydCBmdW5jdGlvbiBkaXNwb3NlRmlsZVVSTCh1cmw6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICh1cmwuc3RhcnRzV2l0aChcImJsb2I6XCIpKSB7XG4gICAgICAgIHRyeSB7IFVSTC5yZXZva2VPYmplY3RVUkwodXJsKTsgfSBjYXRjaCB7IC8qIG5vdCBpbiBhIGJyb3dzZXIsIG9yIGFscmVhZHkgcmV2b2tlZCAqLyB9XG4gICAgfVxufVxuXG4vLyBBIFN0b3JhZ2VGYWN0b3J5IGJhY2tlZCBieSBhIHJlbW90ZSBzZXJ2ZXIgKHBhdGggLT4gRmlsZVN0b3JhZ2UpLCBmb3IgY29kZSB0aGF0IGluamVjdHMgaXRzIG93blxuLy8gc3RvcmFnZSBpbnRvIEJ1bGtEYXRhYmFzZTIgcmF0aGVyIHRoYW4gZ29pbmcgdGhyb3VnaCB0aGUgZGlyZWN0b3J5IHByb21wdC5cbmV4cG9ydCBmdW5jdGlvbiBnZXRSZW1vdGVGaWxlU3RvcmFnZUZhY3RvcnkodXJsOiBzdHJpbmcsIHBhc3N3b3JkOiBzdHJpbmcsIG9wdGlvbnM/OiBSZW1vdGVPcHRpb25zKTogKHBhdGhTdHI6IHN0cmluZykgPT4gUHJvbWlzZTxGaWxlU3RvcmFnZT4ge1xuICAgIGNvbnN0IHJvb3QgPSBnZXRSZW1vdGVEaXJlY3RvcnlIYW5kbGUodXJsLCBwYXNzd29yZCwgb3B0aW9ucyk7XG4gICAgcmV0dXJuIGFzeW5jIChwYXRoU3RyOiBzdHJpbmcpID0+IHtcbiAgICAgICAgbGV0IGJhc2U6IERpcmVjdG9yeVdyYXBwZXIgPSByb290O1xuICAgICAgICBmb3IgKGNvbnN0IHBhcnQgb2YgcGF0aFN0ci5yZXBsYWNlQWxsKFwiXFxcXFwiLCBcIi9cIikuc3BsaXQoXCIvXCIpKSB7XG4gICAgICAgICAgICBpZiAoIXBhcnQpIGNvbnRpbnVlO1xuICAgICAgICAgICAgYmFzZSA9IGF3YWl0IGJhc2UuZ2V0RGlyZWN0b3J5SGFuZGxlKHBhcnQsIHsgY3JlYXRlOiB0cnVlIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cmFwSGFuZGxlKGJhc2UpO1xuICAgIH07XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0cnlUb0xvYWRQb2ludGVyKHBvaW50ZXI6IHN0cmluZykge1xuICAgIGxldCByZXN1bHQgPSBhd2FpdCBnZXRGaWxlU3lzdGVtUG9pbnRlcih7IHBvaW50ZXIgfSk7XG4gICAgaWYgKCFyZXN1bHQpIHJldHVybjtcbiAgICBsZXQgaGFuZGxlID0gYXdhaXQgcmVzdWx0Py5vblVzZXJBY3RpdmF0aW9uKCk7XG4gICAgaWYgKCFoYW5kbGUpIHJldHVybjtcbiAgICByZXR1cm4gaGFuZGxlIGFzIGFueSBhcyBEaXJlY3RvcnlXcmFwcGVyO1xufSJdfQ==
|
|
788
|
-
/* _JS_SOURCE_HASH = "
|
|
749
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmlsZUZvbGRlckFQSS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIkZpbGVGb2xkZXJBUEkudHN4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQUFBLG9EQUE0QjtBQUM1QiwyREFBNkc7QUFDN0csK0JBQWtDO0FBQ2xDLHVEQUFvRDtBQUNwRCx5REFBMEQ7QUFDMUQsNkNBQTBDO0FBRTFDLDJEQUEyRDtBQUMzRCxxRUFBaUU7QUFDakUsMkRBQW9HO0FBQ3BHLDRDQUFvQjtBQUNwQixnREFBd0I7QUFzQnhCLHVFQUF1RTtBQUN2RSx3RkFBd0Y7QUFDeEYsK0JBQStCO0FBQy9CLE1BQU0sY0FBYyxHQUFHLEtBQUssQ0FBQztBQUU3QixxR0FBcUc7QUFDckcsTUFBTSx1QkFBdUIsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBcUMxQyxJQUFJLFdBQVcsR0FBRyxJQUFBLGlCQUFVLEVBQUM7SUFDekIsRUFBRSxFQUFFLFNBQWlEO0NBQ3hELEVBQUUsU0FBUyxFQUFFLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7QUFFL0IsSUFBSSxVQUFVLEdBQUcsRUFBRSxDQUFDO0FBQ3BCLFNBQVMsYUFBYTtJQUNsQixJQUFJLENBQUMsVUFBVTtRQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsNEpBQTRKLENBQUMsQ0FBQztJQUMvTCxPQUFPLFVBQVUsQ0FBQztBQUN0QixDQUFDO0FBQ0QsU0FBZ0IsYUFBYSxDQUFDLEdBQVc7SUFDckMsVUFBVSxHQUFHLEdBQUcsQ0FBQztBQUNyQixDQUFDO0FBRkQsc0NBRUM7QUFFRCwrRUFBK0U7QUFDL0Usa0ZBQWtGO0FBQ2xGLGtGQUFrRjtBQUNsRixpRkFBaUY7QUFDakYsbUZBQW1GO0FBQ25GLG1GQUFtRjtBQUNuRix5Q0FBeUM7QUFDekMsSUFBSSxtQkFBMEQsQ0FBQztBQUMvRCxTQUFnQixzQkFBc0IsQ0FBQyxNQUE2QztJQUNoRixtQkFBbUIsR0FBRyxNQUFNLENBQUM7QUFDakMsQ0FBQztBQUZELHdEQUVDO0FBS0QsU0FBUyxlQUFlLEtBQUssT0FBTyxhQUFhLEVBQUUsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDO0FBQ2xFLFNBQVMsZ0JBQWdCO0lBQ3JCLElBQUksQ0FBQztRQUNELE1BQU0sQ0FBQyxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FBQztRQUNsRCxJQUFJLENBQUMsQ0FBQztZQUFFLE9BQU8sU0FBUyxDQUFDO1FBQ3pCLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDeEIsSUFBSSxDQUFDLElBQUksT0FBTyxDQUFDLENBQUMsR0FBRyxLQUFLLFFBQVEsSUFBSSxPQUFPLENBQUMsQ0FBQyxRQUFRLEtBQUssUUFBUTtZQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ25GLENBQUM7SUFBQyxRQUFRLFlBQVksSUFBZCxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDeEIsT0FBTyxTQUFTLENBQUM7QUFDckIsQ0FBQztBQUNELFNBQVMsZ0JBQWdCLENBQUMsQ0FBZSxJQUFJLFlBQVksQ0FBQyxPQUFPLENBQUMsZUFBZSxFQUFFLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUUxRyxzTUFBc007QUFDdE0sTUFBTSxtQkFBbUIsR0FBRyxJQUFJLENBQUMsQ0FBQyx3Q0FBd0M7QUFDMUUsU0FBUyxrQkFBa0IsQ0FBQyxHQUFXO0lBQ25DLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDakUsSUFBSSxDQUFDLENBQUM7UUFBRSxPQUFPLEVBQUUsQ0FBQztJQUNsQixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFBRSxDQUFDLElBQUksR0FBRyxHQUFHLG1CQUFtQixDQUFDO0lBQ3JELE9BQU8sVUFBVSxHQUFHLENBQUMsQ0FBQztBQUMxQixDQUFDO0FBRUQsK0ZBQStGO0FBQy9GLElBQUksWUFBbUUsQ0FBQztBQUN4RSxTQUFTLGVBQWUsQ0FBQyxNQUFvQjtJQUN6QyxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDO0lBQ2hELElBQUksQ0FBQyxZQUFZLElBQUksWUFBWSxDQUFDLEdBQUcsS0FBSyxHQUFHLEVBQUUsQ0FBQztRQUM1QyxZQUFZLEdBQUcsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLElBQUEsNENBQXdCLEVBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztJQUMxRixDQUFDO0lBQ0QsT0FBTyxZQUFZLENBQUMsTUFBTSxDQUFDO0FBQy9CLENBQUM7QUFHRCxJQUFNLGlCQUFpQixHQUF2QixNQUFNLGlCQUFrQixTQUFRLGdCQUFNLENBQUMsU0FBUztJQUM1QyxNQUFNO1FBQ0YsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFO1lBQUUsT0FBTyxTQUFTLENBQUM7UUFDdEMsT0FBTyxDQUNILHdDQUFLLFNBQVMsRUFDVixpQkFBRyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDO2lCQUNqRCxNQUFNLENBQUMsVUFBVSxDQUFDO2lCQUNsQixVQUFVLENBQUMsT0FBTyxDQUFDO2lCQUNuQixNQUFNO2lCQUNOLFFBQVEsQ0FBQyxFQUFFLENBQUMsSUFFaEIsV0FBVyxDQUFDLEVBQUUsQ0FDYixDQUNULENBQUM7SUFDTixDQUFDO0NBQ0osQ0FBQTtBQWZLLGlCQUFpQjtJQUR0QixtQkFBUTtHQUNILGlCQUFpQixDQWV0QjtBQUVELDhlQUE4ZTtBQUU5ZSxJQUFNLGlCQUFpQixHQUF2QixNQUFNLGlCQUFrQixTQUFRLGdCQUFNLENBQUMsU0FBa0Y7SUFBekg7OztRQUNZLFFBQUcsR0FBRyxJQUFBLGlCQUFVLEVBQUM7WUFDckIsUUFBUSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU87WUFDOUIsR0FBRyxFQUFFLENBQUEsTUFBQSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sMENBQUUsR0FBRyxLQUFJLEVBQUU7WUFDbEMsUUFBUSxFQUFFLENBQUEsTUFBQSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sMENBQUUsUUFBUSxLQUFJLEVBQUU7WUFDNUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLEtBQUs7U0FDdEUsQ0FBQyxDQUFDO1FBRUssWUFBTyxHQUFHLEtBQUssSUFBSSxFQUFFO1lBQ3pCLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUM7WUFDbkIsQ0FBQyxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7WUFDYixDQUFDLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztZQUNwQixDQUFDLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztZQUNwQixJQUFJLENBQUM7Z0JBQ0QsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUM1QixJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7b0JBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyx5QkFBeUIsQ0FBQztvQkFBQyxPQUFPO2dCQUFDLENBQUM7Z0JBQzFELE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBQSx3Q0FBb0IsRUFBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO2dCQUNsRSxJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssSUFBSSxFQUFFLENBQUM7b0JBQ3pCLE1BQU0sTUFBTSxHQUFpQixFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDO29CQUNsRSxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFhLDRCQUE0QjtvQkFDbEUsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBTyxzREFBc0Q7b0JBQzVGLE9BQU87Z0JBQ1gsQ0FBQztnQkFDRCxJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssY0FBYyxFQUFFLENBQUM7b0JBQ25DLENBQUMsQ0FBQyxLQUFLLEdBQUcsb0NBQW9DLENBQUM7b0JBQy9DLE9BQU8sQ0FBQyxLQUFLLENBQUMsa0NBQWtDLEVBQUUsR0FBRyxDQUFDLENBQUM7Z0JBQzNELENBQUM7cUJBQU0sQ0FBQztvQkFDSix3S0FBd0s7b0JBQ3hLLENBQUMsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO29CQUNuQixDQUFDLENBQUMsS0FBSyxHQUFHLDZCQUE2QixHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUM7b0JBQ3ZELE9BQU8sQ0FBQyxLQUFLLENBQUMsNkJBQTZCLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3pFLENBQUM7WUFDTCxDQUFDO1lBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztnQkFDVCxDQUFDLENBQUMsS0FBSyxHQUFHLG9CQUFvQixHQUFHLENBQUUsQ0FBVyxDQUFDLE9BQU8sSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDckUsT0FBTyxDQUFDLEtBQUssQ0FBQyx1QkFBdUIsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUM5QyxDQUFDO29CQUFTLENBQUM7Z0JBQ1AsQ0FBQyxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7WUFDekIsQ0FBQztRQUNMLENBQUMsQ0FBQztJQXVDTixDQUFDO0lBdEVXLFFBQVEsS0FBSyxPQUFPLGtCQUFrQixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBZ0MvRCxNQUFNO1FBQ0YsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQztRQUNuQixNQUFNLFFBQVEsR0FBRyxpQkFBRyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDM0UsTUFBTSxNQUFNLEdBQUcsaUJBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUM3QyxJQUFJLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2QsT0FBTywyQ0FBUSxTQUFTLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxHQUFHLElBQUksMEJBQThCLENBQUM7UUFDckcsQ0FBQztRQUNELE9BQU8sQ0FDSCx3Q0FBSyxTQUFTLEVBQUUsaUJBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTTtZQUMvQiwwQ0FBTyxTQUFTLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBQyxtREFBbUQsRUFBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFDcEcsT0FBTyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBSSxDQUFDLENBQUMsTUFBMkIsQ0FBQyxLQUFLLEdBQUk7WUFDbEUsd0NBQUssU0FBUyxFQUFFLGlCQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU07Z0JBQy9CLDBDQUFPLFNBQVMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLFdBQVcsRUFBQyxzQkFBc0IsRUFBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLFFBQVEsRUFDeEgsT0FBTyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsR0FBSSxDQUFDLENBQUMsTUFBMkIsQ0FBQyxLQUFLLEdBQUk7Z0JBQ3ZFLDJDQUFRLFNBQVMsRUFBRSxpQkFBRyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBQyxDQUFDLFlBQVksSUFDNUYsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQzVCLENBQ1A7WUFDTCxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyx3Q0FBSyxTQUFTLEVBQUUsaUJBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBRyxDQUFDLENBQUMsS0FBSyxDQUFPLENBQUMsQ0FBQyxDQUFDLElBQUk7WUFDaEcsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FDWCx3Q0FBSyxTQUFTLEVBQUUsaUJBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUM7Z0JBQ3hILGdJQUE0RjtnQkFDNUYsb01BQTJKO2dCQUMzSiwyQ0FBUSxTQUFTLEVBQUUsaUJBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFDNUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxHQUFHLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQzt3QkFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxHQUFHLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLHVDQUUvRSxDQUNQLENBQ1QsQ0FBQyxDQUFDLENBQUMsSUFBSTtZQUNSLHdDQUFLLFNBQVMsRUFBRSxpQkFBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7Z0JBQ3hCLDJDQUFRLFNBQVMsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQyxVQUFVLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLElBQ25FLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQzVEO2dCQUNULDJDQUFRLFNBQVMsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsV0FBZSxDQUNqSCxDQUNKLENBQ1QsQ0FBQztJQUNOLENBQUM7Q0FDSixDQUFBO0FBN0VLLGlCQUFpQjtJQUR0QixtQkFBUTtHQUNILGlCQUFpQixDQTZFdEI7QUFFRCxNQUFhLHVCQUF1QjtJQUNoQyxZQUFvQixRQUFnQjtRQUFoQixhQUFRLEdBQVIsUUFBUSxDQUFRO1FBRTNCLFNBQUksR0FBRyxNQUFlLENBQUM7SUFEaEMsQ0FBQztJQUVELElBQUksSUFBSSxLQUFLLE9BQU8sY0FBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRW5ELEtBQUssQ0FBQyxPQUFPO1FBQ1QsTUFBTSxLQUFLLEdBQUcsTUFBTSxZQUFFLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDcEQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUMvQixPQUFPO1lBQ0gsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJO1lBQ2hCLFlBQVksRUFBRSxLQUFLLENBQUMsT0FBTztZQUMzQixXQUFXLEVBQUUsS0FBSyxJQUFJLEVBQUU7Z0JBQ3BCLE1BQU0sTUFBTSxHQUFHLE1BQU0sWUFBRSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQ3BELE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsVUFBVSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUN6RixDQUFDO1lBQ0QsS0FBSyxFQUFFLENBQUMsS0FBYSxFQUFFLEdBQVcsRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDcEMsV0FBVyxFQUFFLEtBQUssSUFBSSxFQUFFO29CQUNwQixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDOUQsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxZQUFZLENBQUMsRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQ3JFLE1BQU0sTUFBTSxHQUFHLFVBQVUsR0FBRyxZQUFZLENBQUM7b0JBQ3pDLE1BQU0sVUFBVSxHQUFHLE1BQU0sWUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFDO29CQUN6RCxJQUFJLENBQUM7d0JBQ0QsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQzt3QkFDcEMsTUFBTSxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLFlBQVksQ0FBQyxDQUFDO3dCQUN2RCxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7b0JBQ3pGLENBQUM7NEJBQVMsQ0FBQzt3QkFDUCxNQUFNLFVBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztvQkFDN0IsQ0FBQztnQkFDTCxDQUFDO2FBQ0osQ0FBQztTQUNMLENBQUM7SUFDTixDQUFDO0lBRUQsS0FBSyxDQUFDLE1BQU07UUFDUixPQUFPLFNBQVMsR0FBRyxjQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBRUQsS0FBSyxDQUFDLGNBQWMsQ0FBQyxNQUF1QztRQUN4RCxJQUFJLFVBQWtDLENBQUM7UUFDdkMsTUFBTSxLQUFLLEdBQUcsQ0FBQSxNQUFNLGFBQU4sTUFBTSx1QkFBTixNQUFNLENBQUUsZ0JBQWdCLEVBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO1FBRXBELDhCQUE4QjtRQUM5QixNQUFNLFlBQUUsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLGNBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFFMUUsMEJBQTBCO1FBQzFCLElBQUksQ0FBQSxNQUFNLGFBQU4sTUFBTSx1QkFBTixNQUFNLENBQUUsZ0JBQWdCLEtBQUksTUFBTSxZQUFFLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzFHLFVBQVUsR0FBRyxNQUFNLFlBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDOUQsQ0FBQzthQUFNLENBQUM7WUFDSixVQUFVLEdBQUcsTUFBTSxZQUFFLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQzVELENBQUM7UUFFRCxJQUFJLFFBQVEsR0FBRyxDQUFDLENBQUM7UUFFakIsT0FBTztZQUNILElBQUksRUFBRSxLQUFLLEVBQUUsTUFBYyxFQUFFLEVBQUU7Z0JBQzNCLFFBQVEsR0FBRyxNQUFNLENBQUM7WUFDdEIsQ0FBQztZQUNELEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBYSxFQUFFLEVBQUU7Z0JBQzNCLE1BQU0sVUFBVSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7Z0JBQ3pELFFBQVEsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDO1lBQzdCLENBQUM7WUFDRCxLQUFLLEVBQUUsS0FBSyxJQUFJLEVBQUU7Z0JBQ2QsTUFBTSxVQUFVLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDN0IsQ0FBQztTQUNKLENBQUM7SUFDTixDQUFDO0NBQ0o7QUFuRUQsMERBbUVDO0FBRUQsTUFBYSw0QkFBNEI7SUFDckMsWUFBb0IsUUFBZ0I7UUFBaEIsYUFBUSxHQUFSLFFBQVEsQ0FBUTtRQUUzQixTQUFJLEdBQUcsV0FBb0IsQ0FBQztJQURyQyxDQUFDO0lBRUQsSUFBSSxJQUFJLEtBQUssT0FBTyxjQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbkQsSUFBSSxRQUFRLEtBQUssT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUN4QyxPQUFPLEtBQUssT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBRWxELEtBQUssQ0FBQyxXQUFXLENBQUMsR0FBVyxFQUFFLE9BQWlDO1FBQzVELE1BQU0sU0FBUyxHQUFHLGNBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNoRCxJQUFJLE9BQU8sYUFBUCxPQUFPLHVCQUFQLE9BQU8sQ0FBRSxTQUFTLEVBQUUsQ0FBQztZQUNyQixNQUFNLFlBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLFNBQVMsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDdEUsQ0FBQzthQUFNLENBQUM7WUFDSixNQUFNLFlBQUUsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3hDLENBQUM7SUFDTCxDQUFDO0lBRUQsS0FBSyxDQUFDLGFBQWEsQ0FBQyxHQUFXLEVBQUUsT0FBOEI7UUFDM0QsTUFBTSxRQUFRLEdBQUcsY0FBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBRS9DLE1BQU0sTUFBTSxHQUFHLE1BQU0sWUFBRSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUV0RixJQUFJLENBQUMsTUFBTSxLQUFJLE9BQU8sYUFBUCxPQUFPLHVCQUFQLE9BQU8sQ0FBRSxNQUFNLENBQUEsRUFBRSxDQUFDO1lBQzdCLDhCQUE4QjtZQUM5QixNQUFNLFlBQUUsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLGNBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUNyRSxrQkFBa0I7WUFDbEIsTUFBTSxZQUFFLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzNELENBQUM7YUFBTSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDakIsaVJBQWlSO1lBQ2pSLE1BQU0sR0FBRyxHQUFHLElBQUksS0FBSyxDQUFDLG1CQUFtQixRQUFRLEVBQUUsQ0FBOEIsQ0FBQztZQUNsRixHQUFHLENBQUMsSUFBSSxHQUFHLFFBQVEsQ0FBQztZQUNwQixNQUFNLEdBQUcsQ0FBQztRQUNkLENBQUM7UUFFRCxPQUFPLElBQUksdUJBQXVCLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDakQsQ0FBQztJQUVELEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxHQUFXLEVBQUUsT0FBOEI7UUFDaEUsTUFBTSxPQUFPLEdBQUcsY0FBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBRTlDLElBQUksT0FBTyxhQUFQLE9BQU8sdUJBQVAsT0FBTyxDQUFFLE1BQU0sRUFBRSxDQUFDO1lBQ2xCLE1BQU0sWUFBRSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDMUQsQ0FBQzthQUFNLENBQUM7WUFDSixNQUFNLE1BQU0sR0FBRyxNQUFNLFlBQUUsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDckYsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNWLE1BQU0sSUFBSSxLQUFLLENBQUMsd0JBQXdCLE9BQU8sRUFBRSxDQUFDLENBQUM7WUFDdkQsQ0FBQztRQUNMLENBQUM7UUFFRCxPQUFPLElBQUksNEJBQTRCLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUVELEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQztRQUN6QiwwQkFBMEI7UUFDMUIsTUFBTSxZQUFFLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFFNUQsTUFBTSxPQUFPLEdBQUcsTUFBTSxZQUFFLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUUsYUFBYSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFFbEYsS0FBSyxNQUFNLEtBQUssSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUMxQixNQUFNLFNBQVMsR0FBRyxjQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3ZELElBQUksS0FBSyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUM7Z0JBQ2pCLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLElBQUksdUJBQXVCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztZQUMvRCxDQUFDO2lCQUFNLElBQUksS0FBSyxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUM7Z0JBQzdCLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLElBQUksNEJBQTRCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztZQUNwRSxDQUFDO1FBQ0wsQ0FBQztJQUNMLENBQUM7Q0FDSjtBQW5FRCxvRUFtRUM7QUFHRCwyU0FBMlM7QUFDM1MsSUFBSSxXQUFXLEdBQUcsS0FBSyxDQUFDO0FBQ3hCLE1BQU0sZ0JBQWdCLEdBQUcsU0FBUyxDQUFDO0FBQ25DLE1BQU0sbUJBQW1CLEdBQUcsU0FBUyxDQUFDO0FBQ3RDLFNBQVMsY0FBYyxLQUFLLE9BQU8sYUFBYSxFQUFFLEdBQUcsZUFBZSxDQUFDLENBQUMsQ0FBQztBQUN2RSxTQUFTLG9CQUFvQjtJQUN6QixPQUFPLFlBQVksQ0FBQyxPQUFPLENBQUMsY0FBYyxFQUFFLENBQUMsSUFBSSxtQkFBbUIsQ0FBQztBQUN6RSxDQUFDO0FBQ0QsU0FBUyxvQkFBb0IsQ0FBQyxJQUFZO0lBQ3RDLFlBQVksQ0FBQyxPQUFPLENBQUMsY0FBYyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDakQsQ0FBQztBQUVELHVNQUF1TTtBQUN2TSxTQUFnQixvQkFBb0I7SUFDaEMsV0FBVyxHQUFHLElBQUksQ0FBQztBQUN2QixDQUFDO0FBRkQsb0RBRUM7QUFFRCwwTEFBMEw7QUFDMUwsU0FBZ0IseUJBQXlCO0lBQ3JDLE9BQU8sV0FBVyxDQUFDO0FBQ3ZCLENBQUM7QUFGRCw4REFFQztBQUVELEtBQUssVUFBVSxpQkFBaUI7O0lBQzVCLElBQUksQ0FBQyxDQUFBLE1BQUEsU0FBUyxDQUFDLE9BQU8sMENBQUUsWUFBWSxDQUFBLEVBQUUsQ0FBQztRQUNuQyxNQUFNLElBQUksS0FBSyxDQUFDLDhEQUE4RCxDQUFDLENBQUM7SUFDcEYsQ0FBQztJQUNELElBQUksUUFBUSxDQUFDLFFBQVEsS0FBSyxPQUFPLEVBQUUsQ0FBQztRQUNoQyxNQUFNLElBQUksS0FBSyxDQUFDLHVGQUF1RixDQUFDLENBQUM7SUFDN0csQ0FBQztJQUNELE1BQU0sSUFBSSxHQUFHLE1BQU0sU0FBUyxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUNwRCxNQUFNLEtBQUssR0FBRyxNQUFNLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxhQUFhLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQy9FLE9BQU8sTUFBTSxLQUFLLENBQUMsa0JBQWtCLENBQUMsZ0JBQWdCLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztBQUM5RSxDQUFDO0FBRUQsS0FBSyxVQUFVLG9CQUFvQjtJQUMvQixNQUFNLE9BQU8sR0FBRyxNQUFNLGlCQUFpQixFQUFFLENBQUM7SUFDMUMsTUFBTSxNQUFNLEdBQUcsTUFBTSxPQUFPLENBQUMsa0JBQWtCLENBQUMsb0JBQW9CLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQzFGLE9BQU8sTUFBcUMsQ0FBQztBQUNqRCxDQUFDO0FBRUQscU9BQXFPO0FBQzlOLEtBQUssVUFBVSxrQkFBa0I7O0lBQ3BDLElBQUksQ0FBQyxDQUFBLE1BQUEsU0FBUyxDQUFDLE9BQU8sMENBQUUsWUFBWSxDQUFBO1FBQUUsT0FBTyxFQUFFLENBQUM7SUFDaEQsSUFBSSxPQUFrQyxDQUFDO0lBQ3ZDLElBQUksQ0FBQztRQUFDLE9BQU8sR0FBRyxNQUFNLGlCQUFpQixFQUFFLENBQUM7SUFBQyxDQUFDO0lBQUMsV0FBTSxDQUFDO1FBQUMsT0FBTyxFQUFFLENBQUM7SUFBQyxDQUFDO0lBQ2pFLE1BQU0sS0FBSyxHQUFhLEVBQUUsQ0FBQztJQUMzQixJQUFJLEtBQUssRUFBRSxNQUFNLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFLLE9BQWdFLEVBQUUsQ0FBQztRQUNuRyxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssV0FBVztZQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUNELE9BQU8sS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO0FBQ3hCLENBQUM7QUFURCxnREFTQztBQUVELHlJQUF5STtBQUN6SSxTQUFnQixpQkFBaUIsQ0FBQyxJQUFZO0lBQzFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzNCLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUM7QUFDN0IsQ0FBQztBQUhELDhDQUdDO0FBRUQsNFhBQTRYO0FBQy9XLFFBQUEsa0JBQWtCLEdBQUcsSUFBQSxjQUFJLEVBQUMsS0FBSyxVQUFVLGtCQUFrQjtJQUNwRSw4RUFBOEU7SUFDOUUsMEVBQTBFO0lBQzFFLDhFQUE4RTtJQUM5RSxJQUFJLG1CQUFtQixFQUFFLENBQUM7UUFDdEIsT0FBTyxtQkFBa0QsQ0FBQztJQUM5RCxDQUFDO0lBQ0QscWZBQXFmO0lBQ3JmLElBQUksbUJBQW1CLElBQUksVUFBVSxFQUFFLENBQUM7UUFDcEMsT0FBTyxJQUFJLEVBQUUsQ0FBQztZQUNWLElBQUksbUJBQW1CO2dCQUFFLE9BQU8sbUJBQWtELENBQUM7WUFDbkYsSUFBSSxNQUFNLEdBQUcsTUFBTSxJQUFBLDRDQUF3QixFQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ3pELElBQUksTUFBTTtnQkFBRSxPQUFPLE1BQXFDLENBQUM7WUFDekQsTUFBTSxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsdUJBQXVCLENBQUMsQ0FBQyxDQUFDO1FBQy9FLENBQUM7SUFDTCxDQUFDO0lBQ0QsSUFBSSxJQUFBLG9CQUFNLEdBQUUsRUFBRSxDQUFDO1FBQ1gsT0FBTyxJQUFJLDRCQUE0QixDQUFDLGNBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztJQUNyRSxDQUFDO0lBQ0QsSUFBSSxXQUFXLEVBQUUsQ0FBQztRQUNkLE9BQU8sb0JBQW9CLEVBQUUsQ0FBQztJQUNsQyxDQUFDO0lBRUQsc0ZBQXNGO0lBQ3RGLE1BQU0sV0FBVyxHQUFHLGdCQUFnQixFQUFFLENBQUM7SUFDdkMsSUFBSSxXQUFXLEVBQUUsQ0FBQztRQUNkLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBQSx3Q0FBb0IsRUFBQyxXQUFXLENBQUMsR0FBRyxFQUFFLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNqRixJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssSUFBSTtZQUFFLE9BQU8sZUFBZSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ2hFLE9BQU8sQ0FBQyxJQUFJLENBQUMsdUNBQXVDLE1BQU0sQ0FBQyxNQUFNLElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxhQUFhLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLGtCQUFrQixDQUFDLENBQUM7SUFDdkosQ0FBQztJQUVELElBQUksSUFBSSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDekMsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDaEMsZ0JBQU0sQ0FBQyxNQUFNLENBQUMsK0JBQUMsaUJBQWlCLE9BQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUMzQyxJQUFJLENBQUM7UUFDRCxJQUFJLGFBQTZDLENBQUM7UUFDbEQsSUFBSSxZQUFpQyxDQUFDO1FBQ3RDLE1BQU0sT0FBTyxHQUFHLElBQUksT0FBTyxDQUFtQixDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxHQUFHLGFBQWEsR0FBRyxHQUFHLENBQUMsQ0FBQyxZQUFZLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFMUcsTUFBTSxTQUFTLEdBQUcsS0FBSyxJQUFJLEVBQUU7WUFDekIsSUFBSSxDQUFDO2dCQUNELE1BQU0sTUFBTSxHQUFHLE1BQU0sTUFBTSxDQUFDLG1CQUFtQixFQUFFLENBQUM7Z0JBQ2xELE1BQU0sTUFBTSxDQUFDLGlCQUFpQixDQUFDLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxDQUFDLENBQUM7Z0JBQ3RELE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBQSwwQ0FBc0IsRUFBQyxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztnQkFDN0UsWUFBWSxDQUFDLE9BQU8sQ0FBQyxhQUFhLEVBQUUsRUFBRSxRQUFRLENBQUMsQ0FBQztnQkFDaEQsYUFBYSxDQUFDLE1BQWEsQ0FBQyxDQUFDO1lBQ2pDLENBQUM7WUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO2dCQUNULE9BQU8sQ0FBQyxLQUFLLENBQUMsa0NBQWtDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxxQkFBcUI7WUFDL0UsQ0FBQztRQUNMLENBQUMsQ0FBQztRQUNGLE1BQU0sV0FBVyxHQUFHLENBQUMsTUFBb0IsRUFBRSxFQUFFLEdBQUcsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDcEgsa0pBQWtKO1FBQ2xKLE1BQU0sYUFBYSxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQ3hCO1lBQ0ksMkNBQVEsU0FBUyxFQUFFLGlCQUFHLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLFNBQVMsMEJBQThCO1lBQ2xHLCtCQUFDLGlCQUFpQixJQUFDLFdBQVcsRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLFdBQVcsR0FBSTtZQUNyRSwyQ0FBUSxTQUFTLEVBQUUsaUJBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFDNUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLFlBQVksQ0FBQyxJQUFJLEtBQUssQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDLGNBQWtCLENBQ3pHLENBQ04sQ0FBQztRQUVGLHNMQUFzTDtRQUN0TCxNQUFNLFFBQVEsR0FBRyxDQUFDLFdBQVcsSUFBSSxZQUFZLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUM7UUFDdkUsSUFBSSxRQUFRLEVBQUUsQ0FBQztZQUNYLElBQUksUUFBUSxHQUFHLEtBQUssQ0FBQztZQUNyQixVQUFVLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLFFBQVE7Z0JBQUUsV0FBVyxDQUFDLEVBQUUsR0FBRyw0Q0FBNEMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUN6RyxJQUFJLENBQUM7Z0JBQ0QsTUFBTSxNQUFNLEdBQUcsTUFBTSxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDaEQsUUFBUSxHQUFHLElBQUksQ0FBQztnQkFDaEIsSUFBSSxNQUFNO29CQUFFLE9BQU8sTUFBTSxDQUFDO1lBQzlCLENBQUM7WUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO2dCQUNULFFBQVEsR0FBRyxJQUFJLENBQUM7Z0JBQ2hCLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2pCLE1BQU0sR0FBRyxHQUFHLENBQUMsWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDdkQsSUFBSSxHQUFHLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLElBQUksR0FBRyxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLENBQUM7b0JBQ3JFLFdBQVcsQ0FBQyxFQUFFLEdBQUcsQ0FDYix3Q0FBSyxTQUFTLEVBQUUsaUJBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTTt3QkFDL0IsMkNBQVEsU0FBUyxFQUFFLGlCQUFHLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLEtBQUssSUFBSSxFQUFFO2dDQUNsRSxXQUFXLENBQUMsRUFBRSxHQUFHLFlBQVksQ0FBQztnQ0FDOUIsSUFBSSxDQUFDO29DQUNELE1BQU0sQ0FBQyxHQUFHLE1BQU0sZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUM7b0NBQzNDLElBQUksQ0FBQyxFQUFFLENBQUM7d0NBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO3dDQUFDLE9BQU87b0NBQUMsQ0FBQztnQ0FDeEMsQ0FBQztnQ0FBQyxPQUFPLFVBQVUsRUFBRSxDQUFDO29DQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsZUFBZSxFQUFFLFVBQVUsQ0FBQyxDQUFDO2dDQUFDLENBQUM7Z0NBQ3BFLFdBQVcsQ0FBQyxFQUFFLEdBQUcsd0NBQUssU0FBUyxFQUFFLGlCQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sSUFBRyxhQUFhLEVBQUUsQ0FBTyxDQUFDOzRCQUNsRixDQUFDLDBDQUE4Qzt3QkFDOUMsYUFBYSxFQUFFLENBQ2QsQ0FDVCxDQUFDO29CQUNGLE9BQU8sTUFBTSxPQUFPLENBQUM7Z0JBQ3pCLENBQUM7WUFDTCxDQUFDO1FBQ0wsQ0FBQztRQUNELFdBQVcsQ0FBQyxFQUFFLEdBQUcsd0NBQUssU0FBUyxFQUFFLGlCQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sSUFBRyxhQUFhLEVBQUUsQ0FBTyxDQUFDO1FBQzlFLE9BQU8sTUFBTSxPQUFPLENBQUM7SUFDekIsQ0FBQztZQUFTLENBQUM7UUFDUCxnQkFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDMUIsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQ2xCLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQztBQUVVLFFBQUEsb0JBQW9CLEdBQUcsSUFBQSxlQUFLLEVBQUMsS0FBSyxVQUFVLGNBQWMsQ0FBQyxJQUFZO0lBQ2hGLElBQUksSUFBSSxHQUFHLE1BQU0sSUFBQSwwQkFBa0IsR0FBRSxDQUFDO0lBQ3RDLEtBQUssSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQy9CLElBQUksQ0FBQyxJQUFJO1lBQUUsU0FBUztRQUNwQixJQUFJLEdBQUcsTUFBTSxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDakUsQ0FBQztJQUNELE9BQU8sVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzVCLENBQUMsQ0FBQyxDQUFDO0FBQ0gsOEtBQThLO0FBQ2pLLFFBQUEscUJBQXFCLEdBQUcsSUFBQSxlQUFLLEVBQUMsS0FBSyxVQUFVLGNBQWMsQ0FBQyxPQUFlO0lBQ3BGLElBQUksSUFBc0IsQ0FBQztJQUMzQixPQUFPLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDeEMsSUFBSSxJQUFBLG9CQUFNLEdBQUUsRUFBRSxDQUFDO1FBQ1gsSUFBSSxjQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDM0IsT0FBTyxVQUFVLENBQUMsSUFBSSw0QkFBNEIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQ2pFLENBQUM7UUFDRCxJQUFJLEdBQUcsSUFBSSw0QkFBNEIsQ0FBQyxjQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7SUFDckUsQ0FBQztTQUFNLENBQUM7UUFDSixJQUFJLEdBQUcsTUFBTSxJQUFBLDBCQUFrQixHQUFFLENBQUM7UUFDbEMsd0xBQXdMO1FBQ3hMLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNmLElBQUksSUFBSSxHQUFhLEVBQUUsQ0FBQztZQUN4QixJQUFJLElBQUksR0FBYSxFQUFFLENBQUM7WUFDeEIsSUFBSSxLQUFLLEVBQUUsTUFBTSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQztnQkFDckMsSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLFdBQVcsRUFBRSxDQUFDO29CQUM3QixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNwQixDQUFDO2dCQUNELElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDcEIsQ0FBQztZQUNELDBJQUEwSTtZQUMxSSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDO2dCQUN0RSxJQUFJLEdBQUcsTUFBTSxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7WUFDbkUsQ0FBQztRQUNMLENBQUM7SUFDTCxDQUFDO0lBQ0QsS0FBSyxJQUFJLElBQUksSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDbEMsSUFBSSxDQUFDLElBQUk7WUFBRSxTQUFTO1FBQ3BCLElBQUksR0FBRyxNQUFNLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUNqRSxDQUFDO0lBQ0QsT0FBTyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDNUIsQ0FBQyxDQUFDLENBQUM7QUFDVSxRQUFBLGNBQWMsR0FBRyxJQUFBLGNBQUksRUFBQyxLQUFLLFVBQVUsY0FBYztJQUM1RCxJQUFJLGNBQWMsRUFBRSxDQUFDO1FBQ2pCLE9BQU8sTUFBTSxJQUFBLDhDQUFxQixHQUFFLENBQUM7SUFDekMsQ0FBQztJQUNELElBQUksTUFBTSxHQUFHLE1BQU0sSUFBQSwwQkFBa0IsR0FBRSxDQUFDO0lBQ3hDLE9BQU8sVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQzlCLENBQUMsQ0FBQyxDQUFDO0FBQ0gsU0FBZ0Isb0JBQW9CO0lBQ2hDLElBQUksV0FBVyxFQUFFLENBQUM7UUFDZCw0S0FBNEs7UUFDNUssb0JBQW9CLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDckUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUN6QixPQUFPO0lBQ1gsQ0FBQztJQUNELFlBQVksQ0FBQyxVQUFVLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQztJQUN6QyxJQUFJLENBQUM7UUFBQyxZQUFZLENBQUMsVUFBVSxDQUFDLGVBQWUsRUFBRSxDQUFDLENBQUM7SUFBQyxDQUFDO0lBQUMsUUFBUSxZQUFZLElBQWQsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQzFFLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUM7QUFDN0IsQ0FBQztBQVZELG9EQVVDO0FBZUQsSUFBSSxXQUFXLEdBQUcsSUFBQSxlQUFLLEVBQUMsQ0FBQyxHQUFXLEVBQUUsRUFBRTtJQUNwQyxPQUFPLElBQUEsc0JBQVcsRUFBQyxDQUFDLEdBQXdCLEVBQUUsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7QUFDNUQsQ0FBQyxDQUFDLENBQUM7QUFhSCxLQUFLLFVBQVUsa0JBQWtCLENBQUMsTUFJakM7SUFDRyxJQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDM0IsTUFBTSxJQUFJLEtBQUssQ0FBQyx5SEFBeUgsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzNLLENBQUM7SUFDRCxvR0FBb0c7SUFDcEcsSUFBSSxDQUFDO1FBQ0QsT0FBTyxNQUFNLE1BQU0sQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBQUMsV0FBTSxDQUFDO1FBQ0wsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNO1lBQUUsT0FBTyxTQUFTLENBQUM7SUFDekMsQ0FBQztJQUNELE9BQU8sTUFBTSxNQUFNLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7QUFDM0UsQ0FBQztBQUVELHFKQUFxSjtBQUNySixTQUFTLGNBQWMsQ0FBQyxLQUFjO0lBQ2xDLElBQUksSUFBSSxHQUFJLEtBQTJCLGFBQTNCLEtBQUssdUJBQUwsS0FBSyxDQUF3QixJQUFJLENBQUM7SUFDOUMsSUFBSSxJQUFJLEdBQUksS0FBMkIsYUFBM0IsS0FBSyx1QkFBTCxLQUFLLENBQXdCLElBQUksQ0FBQztJQUM5QyxPQUFPLElBQUksS0FBSyxlQUFlLElBQUksSUFBSSxLQUFLLFFBQVEsQ0FBQztBQUN6RCxDQUFDO0FBRUQsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLENBQUM7QUFFM0IsbVVBQW1VO0FBQ25VLEtBQUssVUFBVSxhQUFhLENBQUksS0FBYSxFQUFFLEdBQVcsRUFBRSxJQUFzQjtJQUM5RSxJQUFJLE9BQU8sR0FBRyxFQUFFLENBQUM7SUFDakIsS0FBSyxJQUFJLE9BQU8sR0FBRyxDQUFDLEdBQUksT0FBTyxFQUFFLEVBQUUsQ0FBQztRQUNoQyxJQUFJLENBQUM7WUFDRCxPQUFPLE1BQU0sSUFBSSxFQUFFLENBQUM7UUFDeEIsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDYixJQUFJLGNBQWMsQ0FBQyxLQUFLLENBQUM7Z0JBQUUsT0FBTyxTQUFTLENBQUM7WUFDNUMsSUFBSSxJQUFJLEdBQUcsQ0FBQyxLQUEyQixhQUEzQixLQUFLLHVCQUFMLEtBQUssQ0FBd0IsSUFBSSxLQUFJLE9BQU8sQ0FBQztZQUN6RCxJQUFJLE9BQU8sR0FBRyxDQUFDLEtBQThCLGFBQTlCLEtBQUssdUJBQUwsS0FBSyxDQUEyQixPQUFPLEtBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3hFLElBQUksT0FBTyxJQUFJLGdCQUFnQixFQUFFLENBQUM7Z0JBQzlCLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxLQUFLLGVBQWUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsVUFBVSxPQUFPLGFBQWEsSUFBSSxNQUFNLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDeEgsT0FBTyxTQUFTLENBQUM7WUFDckIsQ0FBQztZQUNELE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxLQUFLLGFBQWEsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsYUFBYSxPQUFPLEdBQUcsQ0FBQyxLQUFLLElBQUksTUFBTSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDckgsTUFBTSxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztZQUMzRCxPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzFDLENBQUM7SUFDTCxDQUFDO0FBQ0wsQ0FBQztBQUVELFNBQVMsZUFBZSxDQUFDLE1BQXdCO0lBQzdDLHlGQUF5RjtJQUN6RixNQUFNLE1BQU0sR0FBRyxDQUFDLEdBQVcsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7SUFDcEYsT0FBTztRQUNILEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBVztZQUNyQixPQUFPLGFBQWEsQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEtBQUssSUFBSSxFQUFFO2dCQUNwRCxNQUFNLElBQUksR0FBRyxNQUFNLE1BQU0sQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQzdDLE1BQU0sV0FBVyxHQUFHLE1BQU0sSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUN6QyxPQUFPO29CQUNILElBQUksRUFBRSxXQUFXLENBQUMsSUFBSTtvQkFDdEIsWUFBWSxFQUFFLFdBQVcsQ0FBQyxZQUFZO2lCQUN6QyxDQUFDO1lBQ04sQ0FBQyxDQUFDLENBQUM7UUFDUCxDQUFDO1FBQ0QsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFXO1lBQ2pCLE9BQU8sYUFBYSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsS0FBSyxJQUFJLEVBQUU7Z0JBQ2hELE1BQU0sSUFBSSxHQUFHLE1BQU0sTUFBTSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDN0MsTUFBTSxXQUFXLEdBQUcsTUFBTSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ3pDLE1BQU0sV0FBVyxHQUFHLE1BQU0sV0FBVyxDQUFDLFdBQVcsRUFBRSxDQUFDO2dCQUNwRCw4SUFBOEk7Z0JBQzlJLElBQUksV0FBVyxDQUFDLFVBQVUsS0FBSyxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUM7b0JBQzlDLE1BQU0sTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyxtQkFBbUIsV0FBVyxDQUFDLFVBQVUsT0FBTyxXQUFXLENBQUMsSUFBSSxRQUFRLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxDQUFDLENBQUM7Z0JBQ3pJLENBQUM7Z0JBQ0QsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ3BDLENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQztRQUVELEtBQUssQ0FBQyxRQUFRLENBQUMsR0FBVyxFQUFFLE1BQXNDO1lBQzlELE9BQU8sYUFBYSxDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsS0FBSyxJQUFJLEVBQUU7Z0JBQ3JELE1BQU0sSUFBSSxHQUFHLE1BQU0sTUFBTSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDN0MsTUFBTSxXQUFXLEdBQUcsTUFBTSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ3pDLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDM0UsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsWUFBWSxDQUFDLEVBQUUsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNsRixNQUFNLFdBQVcsR0FBRyxNQUFNLFdBQVcsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQ3BGLElBQUksV0FBVyxDQUFDLFVBQVUsS0FBSyxVQUFVLEdBQUcsWUFBWSxFQUFFLENBQUM7b0JBQ3ZELE1BQU0sTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyx5QkFBeUIsV0FBVyxDQUFDLFVBQVUsT0FBTyxVQUFVLEdBQUcsWUFBWSxRQUFRLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxDQUFDLENBQUM7Z0JBQ3hKLENBQUM7Z0JBQ0QsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ3BDLENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQztRQUVELEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBVyxFQUFFLEtBQWE7WUFDbkMsTUFBTSxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxJQUFJLEVBQUU7Z0JBQzlCLCtHQUErRztnQkFDL0csTUFBTSxJQUFJLEdBQUcsTUFBTSxrQkFBa0IsQ0FBQyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7Z0JBQ3JFLE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxFQUFFLGdCQUFnQixFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7Z0JBQ3ZFLElBQUksTUFBTSxHQUFHLENBQUMsTUFBTSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUM7Z0JBQ3pDLE1BQU0sUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDNUIsTUFBTSxRQUFRLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUM1QixNQUFNLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUMzQixDQUFDLENBQUMsQ0FBQztRQUNQLENBQUM7UUFFRCxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQVcsRUFBRSxLQUFhO1lBQ2hDLE1BQU0sSUFBSSxHQUFHLE1BQU0sa0JBQWtCLENBQUMsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQ3JFLE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQzdDLE1BQU0sUUFBUSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM1QixNQUFNLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUMzQixDQUFDO1FBRUQsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFXO1lBQ3BCLE1BQU0sTUFBTSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNsQyxDQUFDO1FBRUQsS0FBSyxDQUFDLE9BQU8sQ0FBQyxpQkFBMEIsS0FBSztZQUN6QyxNQUFNLElBQUksR0FBYSxFQUFFLENBQUM7WUFDMUIsSUFBSSxDQUFDO2dCQUNELElBQUksS0FBSyxFQUFFLE1BQU0sQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUksTUFBTSxFQUFFLENBQUM7b0JBQ3ZDLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxNQUFNLElBQUksY0FBYyxFQUFFLENBQUM7d0JBQzFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUMxQixDQUFDO2dCQUNMLENBQUM7WUFDTCxDQUFDO1lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztnQkFDYixJQUFJLElBQUksR0FBRyxDQUFDLEtBQTJCLGFBQTNCLEtBQUssdUJBQUwsS0FBSyxDQUF3QixJQUFJLEtBQUksT0FBTyxDQUFDO2dCQUN6RCxJQUFJLE9BQU8sR0FBRyxDQUFDLEtBQThCLGFBQTlCLEtBQUssdUJBQUwsS0FBSyxDQUEyQixPQUFPLEtBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUN4RSxxRkFBcUY7Z0JBQ3JGLE9BQU8sQ0FBQyxLQUFLLENBQUMsNENBQTRDLElBQUksQ0FBQyxNQUFNLGFBQWEsSUFBSSxNQUFNLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDckgsTUFBTSxLQUFLLENBQUM7WUFDaEIsQ0FBQztZQUNELE9BQU8sSUFBSSxDQUFDO1FBQ2hCLENBQUM7UUFFRCxLQUFLLENBQUMsS0FBSztZQUNQLElBQUksS0FBSyxFQUFFLE1BQU0sQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUksTUFBTSxFQUFFLENBQUM7Z0JBQ3ZDLE1BQU0sTUFBTSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7WUFDOUQsQ0FBQztRQUNMLENBQUM7S0FDSixDQUFDO0FBQ04sQ0FBQztBQUVELFNBQVMsZ0JBQWdCLENBQUMsTUFBd0I7SUFDOUMsT0FBTztRQUNILEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBVztZQUNwQixJQUFJLENBQUM7Z0JBQ0QsTUFBTSxNQUFNLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ3JDLE9BQU8sSUFBSSxDQUFDO1lBQ2hCLENBQUM7WUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO2dCQUNiLE9BQU8sS0FBSyxDQUFDO1lBQ2pCLENBQUM7UUFDTCxDQUFDO1FBRUQsS0FBSyxDQUFDLFVBQVUsQ0FBQyxHQUFXO1lBQ3hCLE1BQU0sWUFBWSxHQUFHLE1BQU0sTUFBTSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQzVFLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3BDLENBQUM7UUFFRCxLQUFLLENBQUMsYUFBYSxDQUFDLEdBQVc7WUFDM0IsTUFBTSxNQUFNLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZELENBQUM7UUFFRCxLQUFLLENBQUMsT0FBTztZQUNULE1BQU0sSUFBSSxHQUFhLEVBQUUsQ0FBQztZQUMxQixJQUFJLEtBQUssRUFBRSxNQUFNLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sRUFBRSxDQUFDO2dCQUN2QyxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssV0FBVyxFQUFFLENBQUM7b0JBQzdCLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUMxQixDQUFDO1lBQ0wsQ0FBQztZQUNELE9BQU8sSUFBSSxDQUFDO1FBQ2hCLENBQUM7S0FDSixDQUFDO0FBQ04sQ0FBQztBQUVELFNBQWdCLFVBQVUsQ0FBQyxNQUF3QjtJQUMvQyxPQUFPO1FBQ0gsR0FBRyxlQUFlLENBQUMsTUFBTSxDQUFDO1FBQzFCLE1BQU0sRUFBRSxnQkFBZ0IsQ0FBQyxNQUFNLENBQUM7UUFDaEMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxRQUFRO0tBQzVCLENBQUM7QUFDTixDQUFDO0FBTkQsZ0NBTUM7QUFFRCx3WkFBd1o7QUFDalosS0FBSyxVQUFVLFVBQVUsQ0FBQyxJQUFpQjtJQUM5QyxJQUFJLElBQUksQ0FBQyxNQUFNO1FBQUUsT0FBTyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDdEMsMkZBQTJGO0lBQzNGLE1BQU0sQ0FBQyxHQUFHLE1BQU0sSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQy9CLE9BQU8sR0FBRyxDQUFDLGVBQWUsQ0FBQyxDQUFvQixDQUFDLENBQUM7QUFDckQsQ0FBQztBQUxELGdDQUtDO0FBRUQsNEpBQTRKO0FBQzVKLFNBQWdCLGNBQWMsQ0FBQyxHQUFXO0lBQ3RDLElBQUksR0FBRyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1FBQzFCLElBQUksQ0FBQztZQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUM7UUFBQyxDQUFDO1FBQUMsUUFBUSwwQ0FBMEMsSUFBNUMsQ0FBQyxDQUFDLDBDQUEwQyxDQUFDLENBQUM7SUFDMUYsQ0FBQztBQUNMLENBQUM7QUFKRCx3Q0FJQztBQUVELDZLQUE2SztBQUM3SyxTQUFnQiwyQkFBMkIsQ0FBQyxHQUFXLEVBQUUsUUFBZ0IsRUFBRSxPQUF1QjtJQUM5RixNQUFNLElBQUksR0FBRyxJQUFBLDRDQUF3QixFQUFDLEdBQUcsRUFBRSxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDOUQsT0FBTyxLQUFLLEVBQUUsT0FBZSxFQUFFLEVBQUU7UUFDN0IsSUFBSSxJQUFJLEdBQXFCLElBQUksQ0FBQztRQUNsQyxLQUFLLE1BQU0sSUFBSSxJQUFJLE9BQU8sQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzFELElBQUksQ0FBQyxJQUFJO2dCQUFFLFNBQVM7WUFDcEIsSUFBSSxHQUFHLE1BQU0sSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ2pFLENBQUM7UUFDRCxPQUFPLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM1QixDQUFDLENBQUM7QUFDTixDQUFDO0FBVkQsa0VBVUM7QUFFTSxLQUFLLFVBQVUsZ0JBQWdCLENBQUMsT0FBZTtJQUNsRCxJQUFJLE1BQU0sR0FBRyxNQUFNLElBQUEsd0NBQW9CLEVBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQ3JELElBQUksQ0FBQyxNQUFNO1FBQUUsT0FBTztJQUNwQixJQUFJLE1BQU0sR0FBRyxNQUFNLENBQUEsTUFBTSxhQUFOLE1BQU0sdUJBQU4sTUFBTSxDQUFFLGdCQUFnQixFQUFFLENBQUEsQ0FBQztJQUM5QyxJQUFJLENBQUMsTUFBTTtRQUFFLE9BQU87SUFDcEIsT0FBTyxNQUFpQyxDQUFDO0FBQzdDLENBQUM7QUFORCw0Q0FNQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBwcmVhY3QgZnJvbSBcInByZWFjdFwiO1xuaW1wb3J0IHsgZmluZEdyYW50ZWRQb2ludGVySGFuZGxlLCBnZXRGaWxlU3lzdGVtUG9pbnRlciwgc3RvcmVGaWxlU3lzdGVtUG9pbnRlciB9IGZyb20gXCIuL2ZpbGVTeXN0ZW1Qb2ludGVyXCI7XG5pbXBvcnQgeyBvYnNlcnZhYmxlIH0gZnJvbSBcIm1vYnhcIjtcbmltcG9ydCB7IG9ic2VydmVyIH0gZnJvbSBcIi4uL3JlbmRlci11dGlscy9vYnNlcnZlclwiO1xuaW1wb3J0IHsgY2FjaGUsIGxhenkgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9jYWNoaW5nXCI7XG5pbXBvcnQgeyBjc3MsIGlzTm9kZSB9IGZyb20gXCJ0eXBlc2FmZWNzc1wiO1xuaW1wb3J0IHsgSVN0b3JhZ2VSYXcgfSBmcm9tIFwiLi9JU3RvcmFnZVwiO1xuaW1wb3J0IHsgcnVuSW5TZXJpYWwgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9iYXRjaGluZ1wiO1xuaW1wb3J0IHsgZ2V0RmlsZVN0b3JhZ2VJbmRleERCIH0gZnJvbSBcIi4vSW5kZXhlZERCRmlsZUZvbGRlckFQSVwiO1xuaW1wb3J0IHsgZ2V0UmVtb3RlRGlyZWN0b3J5SGFuZGxlLCB0ZXN0UmVtb3RlQ29ubmVjdGlvbiwgUmVtb3RlT3B0aW9ucyB9IGZyb20gXCIuL3JlbW90ZUZpbGVTdG9yYWdlXCI7XG5pbXBvcnQgZnMgZnJvbSBcImZzXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuXG5kZWNsYXJlIGdsb2JhbCB7XG4gICAgaW50ZXJmYWNlIFdpbmRvdyB7XG4gICAgICAgIHNob3dTYXZlRmlsZVBpY2tlcihjb25maWc/OiB7XG4gICAgICAgICAgICB0eXBlczoge1xuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7IGFjY2VwdDogeyBbbWltZVR5cGU6IHN0cmluZ106IHN0cmluZ1tdIH1cbiAgICAgICAgICAgIH1bXTtcbiAgICAgICAgfSk6IFByb21pc2U8RmlsZVN5c3RlbUZpbGVIYW5kbGU+O1xuICAgICAgICBzaG93RGlyZWN0b3J5UGlja2VyKCk6IFByb21pc2U8RmlsZVN5c3RlbURpcmVjdG9yeUhhbmRsZT47XG4gICAgICAgIHNob3dPcGVuRmlsZVBpY2tlcihjb25maWc/OiB7XG4gICAgICAgICAgICB0eXBlczoge1xuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7IGFjY2VwdDogeyBbbWltZVR5cGU6IHN0cmluZ106IHN0cmluZ1tdIH1cbiAgICAgICAgICAgIH1bXTtcbiAgICAgICAgfSk6IFByb21pc2U8RmlsZVN5c3RlbUZpbGVIYW5kbGVbXT47XG4gICAgfVxuICAgIGludGVyZmFjZSBGaWxlU3lzdGVtRGlyZWN0b3J5SGFuZGxlIHtcbiAgICAgICAgcmVxdWVzdFBlcm1pc3Npb24oY29uZmlnPzogeyBtb2RlOiBcInJlYWRcIiB8IFwicmVhZHdyaXRlXCIgfSk6IFByb21pc2U8UGVybWlzc2lvblN0YXRlPjtcbiAgICB9XG59XG5cblxuLy8gTk9URTogSW5kZXhlZERCIGlzIHJlcXVpcmVkIGZvciBpT1MsIGF0IGxlYXN0LiBXZSBNSUdIVCB3YW50IHRvIG1ha2Vcbi8vICB0aGlzIGEgdXNlciBzdXBwb3J0ZWQgdG9nZ2xlIHRvbywgc28gdGhleSBjYW4gY2hvb3NlIGR1cmluZyBydW50aW1lIGlmIHRoZXkgd2FudCBpdC5cbi8vIERPIE5PVCBlbmFibGUgdGhpcyBpcyBpc05vZGVcbmNvbnN0IFVTRV9JTkRFWEVEX0RCID0gZmFsc2U7XG5cbi8vIEhvdyBvZnRlbiBhIHdvcmtlciByZWNoZWNrcyB0aGUgcG9pbnRlciBJbmRleGVkREIgZm9yIGEgZ3JhbnRlZCBoYW5kbGUgd2hlbiBub25lIGlzIGF2YWlsYWJsZSB5ZXQuXG5jb25zdCBXT1JLRVJfUE9MTF9JTlRFUlZBTF9NUyA9IDYwICogMTAwMDtcblxuLy8gVGhlc2UgbWlycm9yIHRoZSBzdWJzZXQgb2YgdGhlIG5hdGl2ZSBGaWxlU3lzdGVtRmlsZUhhbmRsZSAvIEZpbGVTeXN0ZW1EaXJlY3RvcnlIYW5kbGUgQVBJIHdlIHVzZSwgc28gdGhlIG5hdGl2ZSBicm93c2VyIGhhbmRsZXMsIHRoZSBOb2RlIGhhbmRsZXMsIGFuZCB0aGUgcmVtb3RlIGhhbmRsZXMgYXJlIGFsbCBpbnRlcmNoYW5nZWFibGUg4oCUIGFuZCBjb2RlIHdyaXR0ZW4gYWdhaW5zdCB0aGUgbmF0aXZlIGhhbmRsZSAoZS5nLiBhIHJlY3Vyc2l2ZSB3YWxrIG92ZXIgYGhhbmRsZS5lbnRyaWVzKClgKSB3b3JrcyBvbiBhbnkgb2YgdGhlbS4ga2luZC9uYW1lIGFuZCBlbnRyaWVzKCkgYXJlIHBhcnQgb2YgdGhhdCBjb250cmFjdC5cbmV4cG9ydCB0eXBlIEZpbGVXcmFwcGVyID0ge1xuICAgIHJlYWRvbmx5IGtpbmQ6IFwiZmlsZVwiO1xuICAgIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgICBnZXRGaWxlKCk6IFByb21pc2U8e1xuICAgICAgICBzaXplOiBudW1iZXI7XG4gICAgICAgIGxhc3RNb2RpZmllZDogbnVtYmVyO1xuICAgICAgICBhcnJheUJ1ZmZlcigpOiBQcm9taXNlPEFycmF5QnVmZmVyPjtcbiAgICAgICAgLy8gTWF0Y2hlcyBCbG9iLnNsaWNlICh3aGljaCB0aGUgbmF0aXZlIEZpbGUgb2JqZWN0IHByb3ZpZGVzKSwgc28gdGhlIGJyb3dzZXJcbiAgICAgICAgLy8gIGltcGxlbWVudGF0aW9uIHdvcmtzIHZhbmlsbGEuIEVuZCBpcyBleGNsdXNpdmUsIGJvdGggY2xhbXBlZCB0byB0aGUgZmlsZSBzaXplLlxuICAgICAgICBzbGljZShzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlcik6IHsgYXJyYXlCdWZmZXIoKTogUHJvbWlzZTxBcnJheUJ1ZmZlcj4gfTtcbiAgICB9PjtcbiAgICBjcmVhdGVXcml0YWJsZShjb25maWc/OiB7IGtlZXBFeGlzdGluZ0RhdGE/OiBib29sZWFuIH0pOiBQcm9taXNlPHtcbiAgICAgICAgc2VlayhvZmZzZXQ6IG51bWJlcik6IFByb21pc2U8dm9pZD47XG4gICAgICAgIHdyaXRlKHZhbHVlOiBCdWZmZXIpOiBQcm9taXNlPHZvaWQ+O1xuICAgICAgICBjbG9zZSgpOiBQcm9taXNlPHZvaWQ+O1xuICAgIH0+O1xuICAgIC8vIFJldHVybnMgYSBVUkwgZm9yIHRoZSBmaWxlJ3MgYnl0ZXMsIHVzYWJsZSBpbiA8dmlkZW8+LzxpbWc+L2ZldGNoLiBPcHRpb25hbCDigJQgdGhlIG5hdGl2ZSBicm93c2VyIEZpbGVTeXN0ZW1GaWxlSGFuZGxlIGhhcyBubyBzdWNoIG1ldGhvZCwgc28gcHJlZmVyIHRoZSBnZXRGaWxlVVJMKCkgaGVscGVyLCB3aGljaCBmYWxscyBiYWNrIHRvIGEgYmxvYjogVVJMIHZpYSBjcmVhdGVPYmplY3RVUkwgZm9yIG5hdGl2ZSBoYW5kbGVzLiBBbHdheXMgcmVsZWFzZSBpdCB3aXRoIGRpc3Bvc2VGaWxlVVJMIHdoZW4gZG9uZS5cbiAgICBnZXRVUkw/KCk6IFByb21pc2U8c3RyaW5nPjtcbn07XG5leHBvcnQgdHlwZSBEaXJlY3RvcnlXcmFwcGVyID0ge1xuICAgIHJlYWRvbmx5IGtpbmQ6IFwiZGlyZWN0b3J5XCI7XG4gICAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICAgIC8vIEZ1bGwgcGF0aCBmcm9tIHRoZSBzdG9yYWdlIHJvb3QsIGZvciBkaWFnbm9zdGljcy9sb2dnaW5nICh0aGUgbmF0aXZlIGhhbmRsZSBkb2Vzbid0IGV4cG9zZSBwYXRocywgc28gaXQncyBvcHRpb25hbCkuIGUuZy4gXCJidWxrRGF0YWJhc2VzMi9teUNvbGxlY3Rpb25cIi5cbiAgICByZWFkb25seSBmdWxsUGF0aD86IHN0cmluZztcbiAgICAvLyBUcnVlIHdoZW4gdGhpcyBzdG9yYWdlIGlzIHNlcnZlZCBvdmVyIHRoZSBuZXR3b3JrIChhIHJlbW90ZSBzZXJ2ZXIpIHJhdGhlciB0aGFuIGEgbG9jYWwgZGlzaywgc28gY2FsbGVycyBjYW4gYWRhcHQgZm9yIHRoZSBoaWdoZXIgbGF0ZW5jeS9jb3N0IChsb2NhbC9uYXRpdmUgaGFuZGxlcyBsZWF2ZSBpdCB1bmRlZmluZWQgPSBmYWxzZSkuXG4gICAgcmVhZG9ubHkgaXNSZW1vdGU/OiBib29sZWFuO1xuICAgIHJlbW92ZUVudHJ5KGtleTogc3RyaW5nLCBvcHRpb25zPzogeyByZWN1cnNpdmU/OiBib29sZWFuIH0pOiBQcm9taXNlPHZvaWQ+O1xuICAgIGdldEZpbGVIYW5kbGUoa2V5OiBzdHJpbmcsIG9wdGlvbnM/OiB7IGNyZWF0ZT86IGJvb2xlYW4gfSk6IFByb21pc2U8RmlsZVdyYXBwZXI+O1xuICAgIGdldERpcmVjdG9yeUhhbmRsZShrZXk6IHN0cmluZywgb3B0aW9ucz86IHsgY3JlYXRlPzogYm9vbGVhbiB9KTogUHJvbWlzZTxEaXJlY3RvcnlXcmFwcGVyPjtcbiAgICAvLyBFYWNoIGVudHJ5IElTIGEgaGFuZGxlIChmaWxlIG9yIGRpcmVjdG9yeSksIHNvIGEgcmVjdXJzaXZlIHdhbGsga2VlcHMgd29ya2luZyBhdCBldmVyeSBsZXZlbC5cbiAgICBlbnRyaWVzKCk6IEFzeW5jSXRlcmFibGVJdGVyYXRvcjxbc3RyaW5nLCBGaWxlV3JhcHBlciB8IERpcmVjdG9yeVdyYXBwZXJdPjtcbiAgICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCk6IEFzeW5jSXRlcmFibGVJdGVyYXRvcjxbc3RyaW5nLCBGaWxlV3JhcHBlciB8IERpcmVjdG9yeVdyYXBwZXJdPjtcbn07XG5cbmxldCBkaXNwbGF5RGF0YSA9IG9ic2VydmFibGUoe1xuICAgIHVpOiB1bmRlZmluZWQgYXMgdW5kZWZpbmVkIHwgcHJlYWN0LkNvbXBvbmVudENoaWxkcmVuLFxufSwgdW5kZWZpbmVkLCB7IGRlZXA6IGZhbHNlIH0pO1xuXG5sZXQgZmlsZUFQSUtleSA9IFwiXCI7XG5mdW5jdGlvbiBnZXRGaWxlQVBJS2V5KCkge1xuICAgIGlmICghZmlsZUFQSUtleSkgdGhyb3cgbmV3IEVycm9yKFwiTXVzdCBjYWxsIHNldEZpbGVBUElLZXkgYmVmb3JlIHVzaW5nIGZpbGUgc3lzdGVtLiBKdXN0IHBhc3MgYW55IGtleS4gVGhpcyBwcmV2ZW50cyByZXVzaW5nIHRoZSBmaWxlIHN5c3RlbSBhcGkgdGhhdCBvdGhlciBkZXZlbG9wbWVudCBhcHBzIG1pZ2h0IGJlIHVzaW5nLlwiKTtcbiAgICByZXR1cm4gZmlsZUFQSUtleTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBzZXRGaWxlQVBJS2V5KGtleTogc3RyaW5nKSB7XG4gICAgZmlsZUFQSUtleSA9IGtleTtcbn1cblxuLy8gQSBkaXJlY3RvcnkgaGFuZGxlIHRvIHNlcnZlIGFzIHRoZSBzdG9yYWdlIHJvb3QgaW5zdGVhZCBvZiByZXNvbHZpbmcgb25lIHZpYVxuLy8gdGhlIHBpY2tlciAvIHN0b3JlZC1wb2ludGVyIC8gcmVtb3RlIGZsb3cuIFNldCB0aGlzIGluIGEgY29udGV4dCB0aGF0IGNhbid0IHJ1blxuLy8gdGhlIGludGVyYWN0aXZlIHJlc29sdXRpb24g4oCUIG1vc3QgaW1wb3J0YW50bHkgYSBXZWIgV29ya2VyLCB3aGljaCBoYXMgbm8gRE9NIHRvXG4vLyBwcm9tcHQgd2l0aCBhbmQgbm8gbG9jYWxTdG9yYWdlIHBvaW50ZXIuIFRoZSBvd25pbmcgd2luZG93IHJlc29sdmVzIHRoZSBoYW5kbGVcbi8vICh3aXRoIGl0cyBwZXJtaXNzaW9uIGdyYW50KSBhbmQgcG9zdE1lc3NhZ2VzIGl0IGluOyB0aGUgd29ya2VyIGNhbGxzIHRoaXMgYmVmb3JlXG4vLyB0b3VjaGluZyBhbnkgc3RvcmFnZS4gV2hlbiBzZXQsIGdldERpcmVjdG9yeUhhbmRsZSByZXR1cm5zIGl0IGRpcmVjdGx5IGFuZCBza2lwc1xuLy8gZXZlcnkgRE9NIC8gbG9jYWxTdG9yYWdlIGJyYW5jaCBiZWxvdy5cbmxldCBzdG9yYWdlUm9vdE92ZXJyaWRlOiBGaWxlU3lzdGVtRGlyZWN0b3J5SGFuZGxlIHwgdW5kZWZpbmVkO1xuZXhwb3J0IGZ1bmN0aW9uIHNldFN0b3JhZ2VSb290T3ZlcnJpZGUoaGFuZGxlOiBGaWxlU3lzdGVtRGlyZWN0b3J5SGFuZGxlIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgc3RvcmFnZVJvb3RPdmVycmlkZSA9IGhhbmRsZTtcbn1cblxuLy8gLS0tLSByZW1vdGUgKHNlcnZlcikgc3RvcmFnZSBjb25maWcgLS0tLVxuLy8gSW5zdGVhZCBvZiBhIGxvY2FsIGZvbGRlciwgdGhlIHVzZXIgY2FuIHBvaW50IGF0IGEgcmVtb3RlRmlsZVNlcnZlci5qcyBpbnN0YW5jZSAoVVJMICsgcGFzc3dvcmQpLiBXaGVuIGNvbmZpZ3VyZWQsIGdldEZpbGVTdG9yYWdlTmVzdGVkMiBzZXJ2ZXMgZXZlcnl0aGluZyBmcm9tIHRoYXQgc2VydmVyLiBQZXJzaXN0ZWQgaW4gbG9jYWxTdG9yYWdlLlxudHlwZSBSZW1vdGVDb25maWcgPSB7IHVybDogc3RyaW5nOyBwYXNzd29yZDogc3RyaW5nIH07XG5mdW5jdGlvbiByZW1vdGVDb25maWdLZXkoKSB7IHJldHVybiBnZXRGaWxlQVBJS2V5KCkgKyBcIjpyZW1vdGVcIjsgfVxuZnVuY3Rpb24gbG9hZFJlbW90ZUNvbmZpZygpOiBSZW1vdGVDb25maWcgfCB1bmRlZmluZWQge1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHMgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShyZW1vdGVDb25maWdLZXkoKSk7XG4gICAgICAgIGlmICghcykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3QgYyA9IEpTT04ucGFyc2Uocyk7XG4gICAgICAgIGlmIChjICYmIHR5cGVvZiBjLnVybCA9PT0gXCJzdHJpbmdcIiAmJiB0eXBlb2YgYy5wYXNzd29yZCA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIGM7XG4gICAgfSBjYXRjaCB7IC8qIGlnbm9yZSAqLyB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cbmZ1bmN0aW9uIHNhdmVSZW1vdGVDb25maWcoYzogUmVtb3RlQ29uZmlnKSB7IGxvY2FsU3RvcmFnZS5zZXRJdGVtKHJlbW90ZUNvbmZpZ0tleSgpLCBKU09OLnN0cmluZ2lmeShjKSk7IH1cblxuLy8gVGhlIHNlcnZlciBpcyBhbHdheXMgSFRUUFMgb24gdGhlIGZpbGVob3N0ZXIncyBkZWZhdWx0IHBvcnQsIHNvIHRoZSB1c2VyIG9ubHkgbmVlZHMgdG8gdHlwZSB0aGUgaG9zdCAoZS5nLiBcIjY1LjEwOS45My4xMTNcIikuIFdlIHN0cmlwIGFueSBzY2hlbWUvcGF0aCB0aGV5IGluY2x1ZGUgYW5kIGRlZmF1bHQgdGhlIHBvcnQgaWYgb21pdHRlZC5cbmNvbnN0IERFRkFVTFRfUkVNT1RFX1BPUlQgPSA4Nzg3OyAvLyBtYXRjaGVzIHJlbW90ZUZpbGVTZXJ2ZXIuanMncyBkZWZhdWx0XG5mdW5jdGlvbiBub3JtYWxpemVTZXJ2ZXJVcmwocmF3OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGxldCBzID0gcmF3LnRyaW0oKS5yZXBsYWNlKC9eXFx3KzpcXC9cXC8vLCBcIlwiKS5yZXBsYWNlKC9cXC8uKiQvLCBcIlwiKTtcbiAgICBpZiAoIXMpIHJldHVybiBcIlwiO1xuICAgIGlmICghLzpcXGQrJC8udGVzdChzKSkgcyArPSBcIjpcIiArIERFRkFVTFRfUkVNT1RFX1BPUlQ7XG4gICAgcmV0dXJuIFwiaHR0cHM6Ly9cIiArIHM7XG59XG5cbi8vIE9uZSBzaGFyZWQgcmVtb3RlIERpcmVjdG9yeVdyYXBwZXIgKGFuZCB0aGVyZWZvcmUgb25lIHNoYXJlZCByYW5nZSBjYWNoZSkgcGVyIHJlbW90ZSBjb25maWcuXG5sZXQgcmVtb3RlSGFuZGxlOiB7IGtleTogc3RyaW5nOyBoYW5kbGU6IERpcmVjdG9yeVdyYXBwZXIgfSB8IHVuZGVmaW5lZDtcbmZ1bmN0aW9uIGdldFJlbW90ZUhhbmRsZShyZW1vdGU6IFJlbW90ZUNvbmZpZyk6IERpcmVjdG9yeVdyYXBwZXIge1xuICAgIGNvbnN0IGtleSA9IHJlbW90ZS51cmwgKyBcIlxcMFwiICsgcmVtb3RlLnBhc3N3b3JkO1xuICAgIGlmICghcmVtb3RlSGFuZGxlIHx8IHJlbW90ZUhhbmRsZS5rZXkgIT09IGtleSkge1xuICAgICAgICByZW1vdGVIYW5kbGUgPSB7IGtleSwgaGFuZGxlOiBnZXRSZW1vdGVEaXJlY3RvcnlIYW5kbGUocmVtb3RlLnVybCwgcmVtb3RlLnBhc3N3b3JkKSB9O1xuICAgIH1cbiAgICByZXR1cm4gcmVtb3RlSGFuZGxlLmhhbmRsZTtcbn1cblxuQG9ic2VydmVyXG5jbGFzcyBEaXJlY3RvcnlQcm9tcHRlciBleHRlbmRzIHByZWFjdC5Db21wb25lbnQge1xuICAgIHJlbmRlcigpIHtcbiAgICAgICAgaWYgKCFkaXNwbGF5RGF0YS51aSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtcbiAgICAgICAgICAgICAgICBjc3MucG9zaXRpb24oXCJmaXhlZFwiKS5wb3MoMCwgMCkuc2l6ZShcIjEwMHZ3XCIsIFwiMTAwdmhcIilcbiAgICAgICAgICAgICAgICAgICAgLnpJbmRleCgyMTQ3NDgzNjQ3KVxuICAgICAgICAgICAgICAgICAgICAuYmFja2dyb3VuZChcIndoaXRlXCIpXG4gICAgICAgICAgICAgICAgICAgIC5jZW50ZXJcbiAgICAgICAgICAgICAgICAgICAgLmZvbnRTaXplKDQwKVxuICAgICAgICAgICAgfT5cbiAgICAgICAgICAgICAgICB7ZGlzcGxheURhdGEudWl9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKTtcbiAgICB9XG59XG5cbi8vIFwiQ29ubmVjdCB0byBhIHNlcnZlclwiIG9wdGlvbiBmb3IgdGhlIGRpcmVjdG9yeSBwcm9tcHQ6IGNvbGxhcHNlcyB0byBhIGJ1dHRvbiwgZXhwYW5kcyB0byBhZGRyZXNzICsgcGFzc3dvcmQgZmllbGRzLiBPbiBjb25uZWN0IGl0IEFDVFVBTExZIGNvbm5lY3RzICh0ZXN0UmVtb3RlQ29ubmVjdGlvbik7IG9ubHkgb24gc3VjY2VzcyBkb2VzIGl0IHBlcnNpc3QgdGhlIGNvbmZpZyBhbmQgY2FsbCBvbkNvbm5lY3RlZCwgc28gdGhlIGNhbGxlciAoZ2V0RGlyZWN0b3J5SGFuZGxlKSByZXNvbHZlcyB3aXRoIGEgd29ya2luZyByZW1vdGUgaGFuZGxlLiBGYWlsdXJlcyBhcmUgc2hvd24gdG8gdGhlIHVzZXIgKGFuZCBsb2dnZWQsIHdpdGhvdXQgdGhlIHBhc3N3b3JkKSwgbmV2ZXIgc3dhbGxvd2VkLiBgaW5pdGlhbGAgcHJlLWZpbGxzICsgZXhwYW5kcyB0aGUgZm9ybSAodXNlZCB0byByZXRyeSBhIHJlbWVtYmVyZWQgc2VydmVyIHRoYXQgc3RvcHBlZCB3b3JraW5nKS5cbkBvYnNlcnZlclxuY2xhc3MgU2VydmVyQ29ubmVjdEZvcm0gZXh0ZW5kcyBwcmVhY3QuQ29tcG9uZW50PHsgb25Db25uZWN0ZWQ6IChjb25maWc6IFJlbW90ZUNvbmZpZykgPT4gdm9pZDsgaW5pdGlhbD86IFJlbW90ZUNvbmZpZyB9PiB7XG4gICAgcHJpdmF0ZSBvYnMgPSBvYnNlcnZhYmxlKHtcbiAgICAgICAgZXhwYW5kZWQ6ICEhdGhpcy5wcm9wcy5pbml0aWFsLFxuICAgICAgICB1cmw6IHRoaXMucHJvcHMuaW5pdGlhbD8udXJsIHx8IFwiXCIsXG4gICAgICAgIHBhc3N3b3JkOiB0aGlzLnByb3BzLmluaXRpYWw/LnBhc3N3b3JkIHx8IFwiXCIsXG4gICAgICAgIGVycm9yOiBcIlwiLCBjb25uZWN0aW5nOiBmYWxzZSwgbmVlZHNDZXJ0OiBmYWxzZSwgc2hvd1Bhc3N3b3JkOiBmYWxzZSxcbiAgICB9KTtcbiAgICBwcml2YXRlIGNsZWFuVXJsKCkgeyByZXR1cm4gbm9ybWFsaXplU2VydmVyVXJsKHRoaXMub2JzLnVybCk7IH1cbiAgICBwcml2YXRlIGNvbm5lY3QgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHMgPSB0aGlzLm9icztcbiAgICAgICAgcy5lcnJvciA9IFwiXCI7XG4gICAgICAgIHMubmVlZHNDZXJ0ID0gZmFsc2U7XG4gICAgICAgIHMuY29ubmVjdGluZyA9IHRydWU7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCB1cmwgPSB0aGlzLmNsZWFuVXJsKCk7XG4gICAgICAgICAgICBpZiAoIXVybCkgeyBzLmVycm9yID0gXCJFbnRlciBhIHNlcnZlciBhZGRyZXNzLlwiOyByZXR1cm47IH1cbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRlc3RSZW1vdGVDb25uZWN0aW9uKHVybCwgcy5wYXNzd29yZC50cmltKCkpO1xuICAgICAgICAgICAgaWYgKHJlc3VsdC5zdGF0dXMgPT09IFwib2tcIikge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbmZpZzogUmVtb3RlQ29uZmlnID0geyB1cmwsIHBhc3N3b3JkOiBzLnBhc3N3b3JkLnRyaW0oKSB9O1xuICAgICAgICAgICAgICAgIHNhdmVSZW1vdGVDb25maWcoY29uZmlnKTsgICAgICAgICAgICAgLy8gcmVtZW1iZXIgZm9yIG5leHQgc2Vzc2lvblxuICAgICAgICAgICAgICAgIHRoaXMucHJvcHMub25Db25uZWN0ZWQoY29uZmlnKTsgICAgICAgLy8gaGFuZCB0aGUgdmVyaWZpZWQgc2VydmVyIGJhY2sgdG8gZ2V0RGlyZWN0b3J5SGFuZGxlXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJlc3VsdC5zdGF0dXMgPT09IFwidW5hdXRob3JpemVkXCIpIHtcbiAgICAgICAgICAgICAgICBzLmVycm9yID0gXCJUaGUgc2VydmVyIHJlamVjdGVkIHRoYXQgcGFzc3dvcmQuXCI7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIlJlbW90ZSBjb25uZWN0OiB1bmF1dGhvcml6ZWQgZm9yXCIsIHVybCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIEdvdCBub3RoaW5nIGJhY2sg4oCUIHVzdWFsbHkgdGhlIHNlbGYtc2lnbmVkIGNlcnRpZmljYXRlIGlzbid0IHRydXN0ZWQgeWV0LCBidXQgc2hvdyB0aGUgYWN0dWFsIGVycm9yIHRvbyBzbyBhIHdyb25nIGFkZHJlc3MgLyBkb3duIHNlcnZlciAvIENPUlMgaXNzdWUgaXMgZGlhZ25vc2FibGUuXG4gICAgICAgICAgICAgICAgcy5uZWVkc0NlcnQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHMuZXJyb3IgPSBcIkNvdWxkbid0IHJlYWNoIHRoZSBzZXJ2ZXI6IFwiICsgcmVzdWx0LmVycm9yO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJSZW1vdGUgY29ubmVjdDogdW5yZWFjaGFibGVcIiwgdXJsLCBcIi1cIiwgcmVzdWx0LmVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgcy5lcnJvciA9IFwiQ29ubmVjdGlvbiBlcnJvcjogXCIgKyAoKGUgYXMgRXJyb3IpLm1lc3NhZ2UgfHwgU3RyaW5nKGUpKTtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJSZW1vdGUgY29ubmVjdCB0aHJldzpcIiwgZSk7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBzLmNvbm5lY3RpbmcgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgcmVuZGVyKCkge1xuICAgICAgICBjb25zdCBzID0gdGhpcy5vYnM7XG4gICAgICAgIGNvbnN0IGlucHV0Q3NzID0gY3NzLmZvbnRTaXplKDI4KS5wYWQyKDI0LCAxNCkud2lkdGgoNTYwKS5tYXhXaWR0aChcIjgwdndcIik7XG4gICAgICAgIGNvbnN0IGJ0bkNzcyA9IGNzcy5mb250U2l6ZSgzMikucGFkMig2MCwgMzApO1xuICAgICAgICBpZiAoIXMuZXhwYW5kZWQpIHtcbiAgICAgICAgICAgIHJldHVybiA8YnV0dG9uIGNsYXNzTmFtZT17YnRuQ3NzfSBvbkNsaWNrPXsoKSA9PiBzLmV4cGFuZGVkID0gdHJ1ZX0+Q29ubmVjdCB0byBhIHNlcnZlcjwvYnV0dG9uPjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e2Nzcy52Ym94KDE2KS5jZW50ZXJ9PlxuICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzc05hbWU9e2lucHV0Q3NzfSBwbGFjZWhvbGRlcj1cInNlcnZlciBhZGRyZXNzIChlLmcuIDY1LjEwOS45My4xMTMsIG9yIGhvc3Q6cG9ydClcIiB2YWx1ZT17cy51cmx9XG4gICAgICAgICAgICAgICAgICAgIG9uSW5wdXQ9e2UgPT4gcy51cmwgPSAoZS50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCkudmFsdWV9IC8+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e2Nzcy5oYm94KDEwKS5jZW50ZXJ9PlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3NOYW1lPXtpbnB1dENzc30gdHlwZT17cy5zaG93UGFzc3dvcmQgPyBcInRleHRcIiA6IFwicGFzc3dvcmRcIn0gcGxhY2Vob2xkZXI9XCJwYXNzd29yZCAoc2l4IHdvcmRzKVwiIHZhbHVlPXtzLnBhc3N3b3JkfVxuICAgICAgICAgICAgICAgICAgICAgICAgb25JbnB1dD17ZSA9PiBzLnBhc3N3b3JkID0gKGUudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLnZhbHVlfSAvPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzTmFtZT17Y3NzLmZvbnRTaXplKDIyKS5wYWQyKDI0LCAxMil9IG9uQ2xpY2s9eygpID0+IHMuc2hvd1Bhc3N3b3JkID0gIXMuc2hvd1Bhc3N3b3JkfT5cbiAgICAgICAgICAgICAgICAgICAgICAgIHtzLnNob3dQYXNzd29yZCA/IFwiSGlkZVwiIDogXCJTaG93XCJ9XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIHtzLmVycm9yID8gPGRpdiBjbGFzc05hbWU9e2Nzcy5mb250U2l6ZSgyMikuY29sb3IoXCJyZWRcIikubWF4V2lkdGgoXCI4MHZ3XCIpfT57cy5lcnJvcn08L2Rpdj4gOiBudWxsfVxuICAgICAgICAgICAgICAgIHtzLm5lZWRzQ2VydCA/IChcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e2Nzcy52Ym94KDEwKS5jZW50ZXIuZm9udFNpemUoMjApLm1heFdpZHRoKDYyMCkubWF4V2lkdGgoXCI4MHZ3XCIpLnRleHRBbGlnbihcImNlbnRlclwiKS5jb2xvcihcImhzbCgwLCAwJSwgMjUlKVwiKX0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlRoaXMgc2VydmVyIHVzZXMgYSBzZWxmLXNpZ25lZCBjZXJ0aWZpY2F0ZSwgc28geW91ciBicm93c2VyIGhhcyB0byB0cnVzdCBpdCBvbmNlOjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj4xLiBPcGVuIHRoZSBzZXJ2ZXIgaW4gYSBuZXcgdGFiIChidXR0b24gYmVsb3cpLiAmbmJzcDsgMi4gQWNjZXB0IHRoZSBzZWN1cml0eSB3YXJuaW5nIChBZHZhbmNlZCDihpIgUHJvY2VlZCkuICZuYnNwOyAzLiBDb21lIGJhY2sgYW5kIGNsaWNrIFJldHJ5LjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzc05hbWU9e2Nzcy5mb250U2l6ZSgyNikucGFkMig0MCwgMjApfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHsgY29uc3QgdSA9IHRoaXMuY2xlYW5VcmwoKTsgaWYgKHUpIHdpbmRvdy5vcGVuKHUgKyBcIi9cIiwgXCJfYmxhbmtcIik7IH19PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wZW4gc2VydmVyICZhbXA7IGFjY2VwdCBjZXJ0aWZpY2F0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICkgOiBudWxsfVxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtjc3MuaGJveCgxNil9PlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzTmFtZT17YnRuQ3NzfSBkaXNhYmxlZD17cy5jb25uZWN0aW5nfSBvbkNsaWNrPXt0aGlzLmNvbm5lY3R9PlxuICAgICAgICAgICAgICAgICAgICAgICAge3MuY29ubmVjdGluZyA/IFwiQ29ubmVjdGluZ+KAplwiIDogcy5uZWVkc0NlcnQgPyBcIlJldHJ5XCIgOiBcIkNvbm5lY3RcIn1cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3NOYW1lPXtidG5Dc3N9IG9uQ2xpY2s9eygpID0+IHsgcy5leHBhbmRlZCA9IGZhbHNlOyBzLmVycm9yID0gXCJcIjsgcy5uZWVkc0NlcnQgPSBmYWxzZTsgfX0+QmFjazwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgTm9kZUpTRmlsZUhhbmRsZVdyYXBwZXIgaW1wbGVtZW50cyBGaWxlV3JhcHBlciB7XG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBmaWxlUGF0aDogc3RyaW5nKSB7XG4gICAgfVxuICAgIHJlYWRvbmx5IGtpbmQgPSBcImZpbGVcIiBhcyBjb25zdDtcbiAgICBnZXQgbmFtZSgpIHsgcmV0dXJuIHBhdGguYmFzZW5hbWUodGhpcy5maWxlUGF0aCk7IH1cblxuICAgIGFzeW5jIGdldEZpbGUoKSB7XG4gICAgICAgIGNvbnN0IHN0YXRzID0gYXdhaXQgZnMucHJvbWlzZXMuc3RhdCh0aGlzLmZpbGVQYXRoKTtcbiAgICAgICAgY29uc3QgZmlsZVBhdGggPSB0aGlzLmZpbGVQYXRoO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc2l6ZTogc3RhdHMuc2l6ZSxcbiAgICAgICAgICAgIGxhc3RNb2RpZmllZDogc3RhdHMubXRpbWVNcyxcbiAgICAgICAgICAgIGFycmF5QnVmZmVyOiBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgYnVmZmVyID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgpO1xuICAgICAgICAgICAgICAgIHJldHVybiBidWZmZXIuYnVmZmVyLnNsaWNlKGJ1ZmZlci5ieXRlT2Zmc2V0LCBidWZmZXIuYnl0ZU9mZnNldCArIGJ1ZmZlci5ieXRlTGVuZ3RoKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzbGljZTogKHN0YXJ0OiBudW1iZXIsIGVuZDogbnVtYmVyKSA9PiAoe1xuICAgICAgICAgICAgICAgIGFycmF5QnVmZmVyOiBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNsYW1wZWRTdGFydCA9IE1hdGgubWluKE1hdGgubWF4KHN0YXJ0LCAwKSwgc3RhdHMuc2l6ZSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNsYW1wZWRFbmQgPSBNYXRoLm1pbihNYXRoLm1heChlbmQsIGNsYW1wZWRTdGFydCksIHN0YXRzLnNpemUpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBsZW5ndGggPSBjbGFtcGVkRW5kIC0gY2xhbXBlZFN0YXJ0O1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBmaWxlSGFuZGxlID0gYXdhaXQgZnMucHJvbWlzZXMub3BlbihmaWxlUGF0aCwgXCJyXCIpO1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYnVmZmVyID0gQnVmZmVyLmFsbG9jKGxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBmaWxlSGFuZGxlLnJlYWQoYnVmZmVyLCAwLCBsZW5ndGgsIGNsYW1wZWRTdGFydCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYnVmZmVyLmJ1ZmZlci5zbGljZShidWZmZXIuYnl0ZU9mZnNldCwgYnVmZmVyLmJ5dGVPZmZzZXQgKyBidWZmZXIuYnl0ZUxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBmaWxlSGFuZGxlLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGFzeW5jIGdldFVSTCgpIHtcbiAgICAgICAgcmV0dXJuIFwiZmlsZTovL1wiICsgcGF0aC5yZXNvbHZlKHRoaXMuZmlsZVBhdGgpO1xuICAgIH1cblxuICAgIGFzeW5jIGNyZWF0ZVdyaXRhYmxlKGNvbmZpZz86IHsga2VlcEV4aXN0aW5nRGF0YT86IGJvb2xlYW4gfSkge1xuICAgICAgICBsZXQgZmlsZUhhbmRsZTogZnMucHJvbWlzZXMuRmlsZUhhbmRsZTtcbiAgICAgICAgY29uc3QgZmxhZ3MgPSBjb25maWc/LmtlZXBFeGlzdGluZ0RhdGEgPyBcInIrXCIgOiBcIndcIjtcblxuICAgICAgICAvLyBFbnN1cmUgdGhlIGRpcmVjdG9yeSBleGlzdHNcbiAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIocGF0aC5kaXJuYW1lKHRoaXMuZmlsZVBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAgICAgICAvLyBPcGVuIG9yIGNyZWF0ZSB0aGUgZmlsZVxuICAgICAgICBpZiAoY29uZmlnPy5rZWVwRXhpc3RpbmdEYXRhICYmIGF3YWl0IGZzLnByb21pc2VzLmFjY2Vzcyh0aGlzLmZpbGVQYXRoKS50aGVuKCgpID0+IHRydWUpLmNhdGNoKCgpID0+IGZhbHNlKSkge1xuICAgICAgICAgICAgZmlsZUhhbmRsZSA9IGF3YWl0IGZzLnByb21pc2VzLm9wZW4odGhpcy5maWxlUGF0aCwgZmxhZ3MpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZmlsZUhhbmRsZSA9IGF3YWl0IGZzLnByb21pc2VzLm9wZW4odGhpcy5maWxlUGF0aCwgXCJ3XCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHBvc2l0aW9uID0gMDtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc2VlazogYXN5bmMgKG9mZnNldDogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICAgICAgcG9zaXRpb24gPSBvZmZzZXQ7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgd3JpdGU6IGFzeW5jICh2YWx1ZTogQnVmZmVyKSA9PiB7XG4gICAgICAgICAgICAgICAgYXdhaXQgZmlsZUhhbmRsZS53cml0ZSh2YWx1ZSwgMCwgdmFsdWUubGVuZ3RoLCBwb3NpdGlvbik7XG4gICAgICAgICAgICAgICAgcG9zaXRpb24gKz0gdmFsdWUubGVuZ3RoO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNsb3NlOiBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgYXdhaXQgZmlsZUhhbmRsZS5jbG9zZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIE5vZGVKU0RpcmVjdG9yeUhhbmRsZVdyYXBwZXIgaW1wbGVtZW50cyBEaXJlY3RvcnlXcmFwcGVyIHtcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJvb3RQYXRoOiBzdHJpbmcpIHtcbiAgICB9XG4gICAgcmVhZG9ubHkga2luZCA9IFwiZGlyZWN0b3J5XCIgYXMgY29uc3Q7XG4gICAgZ2V0IG5hbWUoKSB7IHJldHVybiBwYXRoLmJhc2VuYW1lKHRoaXMucm9vdFBhdGgpOyB9XG4gICAgZ2V0IGZ1bGxQYXRoKCkgeyByZXR1cm4gdGhpcy5yb290UGF0aDsgfVxuICAgIGVudHJpZXMoKSB7IHJldHVybiB0aGlzW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpOyB9XG5cbiAgICBhc3luYyByZW1vdmVFbnRyeShrZXk6IHN0cmluZywgb3B0aW9ucz86IHsgcmVjdXJzaXZlPzogYm9vbGVhbiB9KSB7XG4gICAgICAgIGNvbnN0IGVudHJ5UGF0aCA9IHBhdGguam9pbih0aGlzLnJvb3RQYXRoLCBrZXkpO1xuICAgICAgICBpZiAob3B0aW9ucz8ucmVjdXJzaXZlKSB7XG4gICAgICAgICAgICBhd2FpdCBmcy5wcm9taXNlcy5ybShlbnRyeVBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGF3YWl0IGZzLnByb21pc2VzLnVubGluayhlbnRyeVBhdGgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgZ2V0RmlsZUhhbmRsZShrZXk6IHN0cmluZywgb3B0aW9ucz86IHsgY3JlYXRlPzogYm9vbGVhbiB9KTogUHJvbWlzZTxGaWxlV3JhcHBlcj4ge1xuICAgICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbih0aGlzLnJvb3RQYXRoLCBrZXkpO1xuXG4gICAgICAgIGNvbnN0IGV4aXN0cyA9IGF3YWl0IGZzLnByb21pc2VzLmFjY2VzcyhmaWxlUGF0aCkudGhlbigoKSA9PiB0cnVlKS5jYXRjaCgoKSA9PiBmYWxzZSk7XG5cbiAgICAgICAgaWYgKCFleGlzdHMgJiYgb3B0aW9ucz8uY3JlYXRlKSB7XG4gICAgICAgICAgICAvLyBFbnN1cmUgdGhlIGRpcmVjdG9yeSBleGlzdHNcbiAgICAgICAgICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKHBhdGguZGlybmFtZShmaWxlUGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBmaWxlXG4gICAgICAgICAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUoZmlsZVBhdGgsIEJ1ZmZlci5hbGxvYygwKSk7XG4gICAgICAgIH0gZWxzZSBpZiAoIWV4aXN0cykge1xuICAgICAgICAgICAgLy8gVGFnIGFzIEVOT0VOVCBzbyByZWFkV2l0aFJldHJ5IHRyZWF0cyBpdCBhcyBhIGdlbnVpbmVseS1taXNzaW5nIGZpbGUgKHJldHVybiB1bmRlZmluZWQgbm93KSByYXRoZXIgdGhhbiBhIHRyYW5zaWVudCByZWFkIGZhaWx1cmUgdG8gcmV0cnkgNsOXIHdpdGggYmFja29mZiDigJQgbWlzc2luZyBmaWxlcyBhcmUgbm9ybWFsIChhIGNvbmN1cnJlbnQgbWVyZ2UgZGVsZXRlcyBhIGZpbGUgbWlkLXJlYWQpLCBhbmQgcmV0cnlpbmcgdGhlbSBpcyBjYXRhc3Ryb3BoaWNhbGx5IHNsb3cuXG4gICAgICAgICAgICBjb25zdCBlcnIgPSBuZXcgRXJyb3IoYEZpbGUgbm90IGZvdW5kOiAke2ZpbGVQYXRofWApIGFzIEVycm9yICYgeyBjb2RlPzogc3RyaW5nIH07XG4gICAgICAgICAgICBlcnIuY29kZSA9IFwiRU5PRU5UXCI7XG4gICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IE5vZGVKU0ZpbGVIYW5kbGVXcmFwcGVyKGZpbGVQYXRoKTtcbiAgICB9XG5cbiAgICBhc3luYyBnZXREaXJlY3RvcnlIYW5kbGUoa2V5OiBzdHJpbmcsIG9wdGlvbnM/OiB7IGNyZWF0ZT86IGJvb2xlYW4gfSk6IFByb21pc2U8RGlyZWN0b3J5V3JhcHBlcj4ge1xuICAgICAgICBjb25zdCBkaXJQYXRoID0gcGF0aC5qb2luKHRoaXMucm9vdFBhdGgsIGtleSk7XG5cbiAgICAgICAgaWYgKG9wdGlvbnM/LmNyZWF0ZSkge1xuICAgICAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIoZGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBleGlzdHMgPSBhd2FpdCBmcy5wcm9taXNlcy5hY2Nlc3MoZGlyUGF0aCkudGhlbigoKSA9PiB0cnVlKS5jYXRjaCgoKSA9PiBmYWxzZSk7XG4gICAgICAgICAgICBpZiAoIWV4aXN0cykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRGlyZWN0b3J5IG5vdCBmb3VuZDogJHtkaXJQYXRofWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBOb2RlSlNEaXJlY3RvcnlIYW5kbGVXcmFwcGVyKGRpclBhdGgpO1xuICAgIH1cblxuICAgIGFzeW5jICpbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCk6IEFzeW5jSXRlcmFibGVJdGVyYXRvcjxbc3RyaW5nLCBGaWxlV3JhcHBlciB8IERpcmVjdG9yeVdyYXBwZXJdPiB7XG4gICAgICAgIC8vIEVuc3VyZSBkaXJlY3RvcnkgZXhpc3RzXG4gICAgICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKHRoaXMucm9vdFBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gICAgICAgIGNvbnN0IGVudHJpZXMgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkZGlyKHRoaXMucm9vdFBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcblxuICAgICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGNoaWxkUGF0aCA9IHBhdGguam9pbih0aGlzLnJvb3RQYXRoLCBlbnRyeS5uYW1lKTtcbiAgICAgICAgICAgIGlmIChlbnRyeS5pc0ZpbGUoKSkge1xuICAgICAgICAgICAgICAgIHlpZWxkIFtlbnRyeS5uYW1lLCBuZXcgTm9kZUpTRmlsZUhhbmRsZVdyYXBwZXIoY2hpbGRQYXRoKV07XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGVudHJ5LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgICAgICAgICAgICB5aWVsZCBbZW50cnkubmFtZSwgbmV3IE5vZGVKU0RpcmVjdG9yeUhhbmRsZVdyYXBwZXIoY2hpbGRQYXRoKV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cblxuLy8gV2hlbiBzZXQsIGdldERpcmVjdG9yeUhhbmRsZSBza2lwcyBldmVyeSBwcm9tcHQgKyByZW1vdGUgY2hlY2sgYW5kIHNlcnZlcyBmcm9tIHRoZSBicm93c2VyJ3MgT3JpZ2luIFByaXZhdGUgRmlsZSBTeXN0ZW0gKE9QRlMpLiBPbmUgbmFtZWQgc3ViZm9sZGVyIGlzIFwiY3VycmVudFwiIHBlciBmaWxlQVBJS2V5OyBwaWNrUHJpdmF0ZUZvbGRlciAvIHJlc2V0U3RvcmFnZUxvY2F0aW9uIHN3aXRjaCB3aGljaCBvbmUuIFNldCB0aGlzIGluIGFwcCBzdGFydHVwIEJFRk9SRSB0aGUgZmlyc3QgZ2V0RGlyZWN0b3J5SGFuZGxlLlxubGV0IG9wZnNFbmFibGVkID0gZmFsc2U7XG5jb25zdCBPUEZTX0ZPTERFUlNfRElSID0gXCJmb2xkZXJzXCI7XG5jb25zdCBPUEZTX0RFRkFVTFRfRk9MREVSID0gXCJkZWZhdWx0XCI7XG5mdW5jdGlvbiBvcGZzQ3VycmVudEtleSgpIHsgcmV0dXJuIGdldEZpbGVBUElLZXkoKSArIFwiOm9wZnM6Y3VycmVudFwiOyB9XG5mdW5jdGlvbiBnZXRDdXJyZW50T3Bmc0ZvbGRlcigpOiBzdHJpbmcge1xuICAgIHJldHVybiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShvcGZzQ3VycmVudEtleSgpKSB8fCBPUEZTX0RFRkFVTFRfRk9MREVSO1xufVxuZnVuY3Rpb24gc2V0Q3VycmVudE9wZnNGb2xkZXIobmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0ob3Bmc0N1cnJlbnRLZXkoKSwgbmFtZSk7XG59XG5cbi8vIFN3aXRjaGVzIGdldERpcmVjdG9yeUhhbmRsZSB0byB0aGUgT3JpZ2luIFByaXZhdGUgRmlsZSBTeXN0ZW0uIE5vIGRpcmVjdG9yeSBwaWNrZXIsIG5vIHBlcm1pc3Npb24gcHJvbXB0LCBubyByZW1vdGUgc2VydmVyIGNoZWNrLiBQZXJzaXN0cyBub3RoaW5nIOKAlCBjYWxsIG9uIGV2ZXJ5IGFwcCBzdGFydCBiZWZvcmUgcmVhZGluZyBzdG9yYWdlLlxuZXhwb3J0IGZ1bmN0aW9uIHVzZVByaXZhdGVGaWxlU3lzdGVtKCk6IHZvaWQge1xuICAgIG9wZnNFbmFibGVkID0gdHJ1ZTtcbn1cblxuLy8gV2hldGhlciB0aGUgT1BGUyBicmFuY2ggaXMgaW4gZWZmZWN0IChzbyBvdGhlciBjYWxsZXJzIGNhbiBhZGFwdCDigJQgZS5nLiBza2lwIHRoZSBcImZpbmQgZGF0YSBzdWJkaXJcIiBoYWNrIGluIGdldEZpbGVTdG9yYWdlTmVzdGVkMiBzaW5jZSBPUEZTIGlzIGFsd2F5cyBhIGNsZWFuIHJvb3Qgd2Ugb3duIGVuZC10by1lbmQpLlxuZXhwb3J0IGZ1bmN0aW9uIGlzUHJpdmF0ZUZpbGVTeXN0ZW1BY3RpdmUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIG9wZnNFbmFibGVkO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRPcGZzRm9sZGVyc0RpcigpOiBQcm9taXNlPEZpbGVTeXN0ZW1EaXJlY3RvcnlIYW5kbGU+IHtcbiAgICBpZiAoIW5hdmlnYXRvci5zdG9yYWdlPy5nZXREaXJlY3RvcnkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUHJpdmF0ZSBGaWxlIFN5c3RlbSBBY2Nlc3MgQVBJIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBicm93c2VyXCIpO1xuICAgIH1cbiAgICBpZiAobG9jYXRpb24ucHJvdG9jb2wgPT09IFwiZmlsZTpcIikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJQcml2YXRlIEZpbGUgU3lzdGVtIEFQSSBpcyBkaXNhbGxvd2VkIGluIGZpbGU6Ly8gbG9jYXRpb25zLiBIb3N0IG9uIGFuIGFjdHVhbCBvcmlnaW4uXCIpO1xuICAgIH1cbiAgICBjb25zdCByb290ID0gYXdhaXQgbmF2aWdhdG9yLnN0b3JhZ2UuZ2V0RGlyZWN0b3J5KCk7XG4gICAgY29uc3Qga2V5ZWQgPSBhd2FpdCByb290LmdldERpcmVjdG9yeUhhbmRsZShnZXRGaWxlQVBJS2V5KCksIHsgY3JlYXRlOiB0cnVlIH0pO1xuICAgIHJldHVybiBhd2FpdCBrZXllZC5nZXREaXJlY3RvcnlIYW5kbGUoT1BGU19GT0xERVJTX0RJUiwgeyBjcmVhdGU6IHRydWUgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldEN1cnJlbnRPcGZzSGFuZGxlKCk6IFByb21pc2U8RGlyZWN0b3J5V3JhcHBlcj4ge1xuICAgIGNvbnN0IGZvbGRlcnMgPSBhd2FpdCBnZXRPcGZzRm9sZGVyc0RpcigpO1xuICAgIGNvbnN0IGZvbGRlciA9IGF3YWl0IGZvbGRlcnMuZ2V0RGlyZWN0b3J5SGFuZGxlKGdldEN1cnJlbnRPcGZzRm9sZGVyKCksIHsgY3JlYXRlOiB0cnVlIH0pO1xuICAgIHJldHVybiBmb2xkZXIgYXMgdW5rbm93biBhcyBEaXJlY3RvcnlXcmFwcGVyO1xufVxuXG4vLyBBbGwgcHJldmlvdXNseS11c2VkIE9QRlMgc3ViZm9sZGVycyB1bmRlciB0aGlzIGZpbGVBUElLZXksIHNvcnRlZCBhbHBoYWJldGljYWxseSAodGltZXN0YW1wLW5hbWVkIGF1dG8tZ2VuZXJhdGVkIGZvbGRlcnMgdGhlcmVmb3JlIHNvcnQgY2hyb25vbG9naWNhbGx5KS4gVXNlIHRoaXMgdG8gc3VyZmFjZSBhIGxpc3QsIHRoZW4gY2FsbCBwaWNrUHJpdmF0ZUZvbGRlcihuYW1lKSB0byBzd2l0Y2guXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbGlzdFByaXZhdGVGb2xkZXJzKCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICBpZiAoIW5hdmlnYXRvci5zdG9yYWdlPy5nZXREaXJlY3RvcnkpIHJldHVybiBbXTtcbiAgICBsZXQgZm9sZGVyczogRmlsZVN5c3RlbURpcmVjdG9yeUhhbmRsZTtcbiAgICB0cnkgeyBmb2xkZXJzID0gYXdhaXQgZ2V0T3Bmc0ZvbGRlcnNEaXIoKTsgfSBjYXRjaCB7IHJldHVybiBbXTsgfVxuICAgIGNvbnN0IG5hbWVzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGZvciBhd2FpdCAoY29uc3QgW25hbWUsIGhhbmRsZV0gb2YgKGZvbGRlcnMgYXMgdW5rbm93biBhcyBBc3luY0l0ZXJhYmxlPFtzdHJpbmcsIHsga2luZDogc3RyaW5nIH1dPikpIHtcbiAgICAgICAgaWYgKGhhbmRsZS5raW5kID09PSBcImRpcmVjdG9yeVwiKSBuYW1lcy5wdXNoKG5hbWUpO1xuICAgIH1cbiAgICByZXR1cm4gbmFtZXMuc29ydCgpO1xufVxuXG4vLyBTd2l0Y2ggdG8gYSBzcGVjaWZpYyBPUEZTIHN1YmZvbGRlciBhbmQgcmVsb2FkIHNvIGdldERpcmVjdG9yeUhhbmRsZSByZS1yZXNvbHZlcyB0byBpdC4gVGhlIGZvbGRlciBpcyBjcmVhdGVkIGlmIGl0IGRvZXNuJ3QgZXhpc3QgeWV0LlxuZXhwb3J0IGZ1bmN0aW9uIHBpY2tQcml2YXRlRm9sZGVyKG5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHNldEN1cnJlbnRPcGZzRm9sZGVyKG5hbWUpO1xuICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKTtcbn1cblxuLy8gUmV0dXJucyB0aGUgZGlyZWN0b3J5IGhhbmRsZSB0byB1c2Ug4oCUIGxvY2FsIChOb2RlIC8gcGlja2VkIGZvbGRlcikgT1IgYSByZW1vdGUgc2VydmVyLCBib3RoIGFzIHRoZSBzYW1lIERpcmVjdG9yeVdyYXBwZXIsIHNvIGNhbGxlcnMgZG9uJ3Qga25vdyBvciBjYXJlIHdoaWNoIGl0IGlzLiBBIHJlbWVtYmVyZWQgc2VydmVyIGlzIFZFUklGSUVEICh3ZSBhY3R1YWxseSBjb25uZWN0KSBiZWZvcmUgdXNlOyBpZiBpdCBubyBsb25nZXIgd29ya3Mgd2UgcmUtcHJvbXB0LCBqdXN0IGxpa2UgYSBsb2NhbCBmb2xkZXIgd2hvc2UgcGVybWlzc2lvbiB3YXMgbG9zdC4gQmxvY2tzIHVudGlsIHJlYWR5IChvciB0aGUgdXNlciBkaXNtaXNzZXMsIHdoaWNoIHJlamVjdHMpLlxuZXhwb3J0IGNvbnN0IGdldERpcmVjdG9yeUhhbmRsZSA9IGxhenkoYXN5bmMgZnVuY3Rpb24gZ2V0RGlyZWN0b3J5SGFuZGxlKCk6IFByb21pc2U8RGlyZWN0b3J5V3JhcHBlcj4ge1xuICAgIC8vIEFuIGluamVjdGVkIHJvb3QgKGUuZy4gYSBXZWIgV29ya2VyIGhhbmRlZCB0aGUgaGFuZGxlIGJ5IGl0cyBvd25pbmcgd2luZG93KVxuICAgIC8vIHNob3J0LWNpcmN1aXRzIHRoZSB3aG9sZSBpbnRlcmFjdGl2ZSByZXNvbHV0aW9uIOKAlCBubyBwaWNrZXIsIG5vIERPTSwgbm9cbiAgICAvLyBsb2NhbFN0b3JhZ2UuIE11c3QgY29tZSBmaXJzdCBzbyBhIHdvcmtlciBuZXZlciByZWFjaGVzIHRoZSBicmFuY2hlcyBiZWxvdy5cbiAgICBpZiAoc3RvcmFnZVJvb3RPdmVycmlkZSkge1xuICAgICAgICByZXR1cm4gc3RvcmFnZVJvb3RPdmVycmlkZSBhcyB1bmtub3duIGFzIERpcmVjdG9yeVdyYXBwZXI7XG4gICAgfVxuICAgIC8vIEEgd29ya2VyIGNhbid0IHNob3cgdGhlIHBpY2tlciAobm8gRE9NIC8gbm8gdXNlciBhY3RpdmF0aW9uKSBhbmQgY2FuJ3QgcmVhZCBsb2NhbFN0b3JhZ2UsIGJ1dCBpdCBDQU4gb3BlbiB0aGUgcG9pbnRlciBJbmRleGVkREIgdGhlIG1haW4tdGhyZWFkIHBpY2tlciBwZXJzaXN0cyB0by4gUG9sbCBpdCBmb3IgYSBoYW5kbGUgd2hvc2UgcGVybWlzc2lvbiBpcyBhbHJlYWR5IGdyYW50ZWQ7IHRoZSBvd25pbmcgd2luZG93IG1heSBhbHNvIHBvc3RNZXNzYWdlIGEgaGFuZGxlIGluIG1pZC1wb2xsIChjaGVja2VkIGVhY2ggaXRlcmF0aW9uKS4gVGhpcyBoYXMgdG8gY29tZSBiZWZvcmUgdGhlIGlzTm9kZSBicmFuY2g6IHR5cGVzYWZlY3NzJ3MgaXNOb2RlKCkgcmV0dXJucyB0cnVlIGluIHdvcmtlcnMgKHdpbmRvdyBpcyB1bmRlZmluZWQpLCBzbyBhIHdvcmtlciB3b3VsZCBvdGhlcndpc2UgZmFsbCBpbnRvIHRoZSBOb2RlIGJyYW5jaCBhbmQgdHJ5IHRvIHVzZSBmcy9wYXRoLlxuICAgIGlmIChcIldvcmtlckdsb2JhbFNjb3BlXCIgaW4gZ2xvYmFsVGhpcykge1xuICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgICAgaWYgKHN0b3JhZ2VSb290T3ZlcnJpZGUpIHJldHVybiBzdG9yYWdlUm9vdE92ZXJyaWRlIGFzIHVua25vd24gYXMgRGlyZWN0b3J5V3JhcHBlcjtcbiAgICAgICAgICAgIGxldCBoYW5kbGUgPSBhd2FpdCBmaW5kR3JhbnRlZFBvaW50ZXJIYW5kbGUoXCJyZWFkd3JpdGVcIik7XG4gICAgICAgICAgICBpZiAoaGFuZGxlKSByZXR1cm4gaGFuZGxlIGFzIHVua25vd24gYXMgRGlyZWN0b3J5V3JhcHBlcjtcbiAgICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCBXT1JLRVJfUE9MTF9JTlRFUlZBTF9NUykpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChpc05vZGUoKSkge1xuICAgICAgICByZXR1cm4gbmV3IE5vZGVKU0RpcmVjdG9yeUhhbmRsZVdyYXBwZXIocGF0aC5yZXNvbHZlKFwiLi9kYXRhL1wiKSk7XG4gICAgfVxuICAgIGlmIChvcGZzRW5hYmxlZCkge1xuICAgICAgICByZXR1cm4gZ2V0Q3VycmVudE9wZnNIYW5kbGUoKTtcbiAgICB9XG5cbiAgICAvLyBBIHNlcnZlciBjb25uZWN0ZWQgaW4gYSBwcmV2aW91cyBzZXNzaW9uOiBvbmx5IHJldXNlIGl0IGlmIGl0IHN0aWxsIGFjdHVhbGx5IHdvcmtzLlxuICAgIGNvbnN0IHNhdmVkUmVtb3RlID0gbG9hZFJlbW90ZUNvbmZpZygpO1xuICAgIGlmIChzYXZlZFJlbW90ZSkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0ZXN0UmVtb3RlQ29ubmVjdGlvbihzYXZlZFJlbW90ZS51cmwsIHNhdmVkUmVtb3RlLnBhc3N3b3JkKTtcbiAgICAgICAgaWYgKHJlc3VsdC5zdGF0dXMgPT09IFwib2tcIikgcmV0dXJuIGdldFJlbW90ZUhhbmRsZShzYXZlZFJlbW90ZSk7XG4gICAgICAgIGNvbnNvbGUud2FybihgU2F2ZWQgcmVtb3RlIHNlcnZlciBkaWRuJ3QgY29ubmVjdCAoJHtyZXN1bHQuc3RhdHVzfSkke3Jlc3VsdC5zdGF0dXMgPT09IFwidW5yZWFjaGFibGVcIiA/IFwiOiBcIiArIHJlc3VsdC5lcnJvciA6IFwiXCJ9IOKAlCByZS1wcm9tcHRpbmcuYCk7XG4gICAgfVxuXG4gICAgbGV0IHJvb3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQocm9vdCk7XG4gICAgcHJlYWN0LnJlbmRlcig8RGlyZWN0b3J5UHJvbXB0ZXIgLz4sIHJvb3QpO1xuICAgIHRyeSB7XG4gICAgICAgIGxldCByZXNvbHZlSGFuZGxlITogKGg6IERpcmVjdG9yeVdyYXBwZXIpID0+IHZvaWQ7XG4gICAgICAgIGxldCByZWplY3RIYW5kbGUhOiAoZTogRXJyb3IpID0+IHZvaWQ7XG4gICAgICAgIGNvbnN0IHByb21pc2UgPSBuZXcgUHJvbWlzZTxEaXJlY3RvcnlXcmFwcGVyPigocmVzLCByZWopID0+IHsgcmVzb2x2ZUhhbmRsZSA9IHJlczsgcmVqZWN0SGFuZGxlID0gcmVqOyB9KTtcblxuICAgICAgICBjb25zdCBwaWNrTG9jYWwgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGhhbmRsZSA9IGF3YWl0IHdpbmRvdy5zaG93RGlyZWN0b3J5UGlja2VyKCk7XG4gICAgICAgICAgICAgICAgYXdhaXQgaGFuZGxlLnJlcXVlc3RQZXJtaXNzaW9uKHsgbW9kZTogXCJyZWFkd3JpdGVcIiB9KTtcbiAgICAgICAgICAgICAgICBjb25zdCBzdG9yZWRJZCA9IGF3YWl0IHN0b3JlRmlsZVN5c3RlbVBvaW50ZXIoeyBtb2RlOiBcInJlYWR3cml0ZVwiLCBoYW5kbGUgfSk7XG4gICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oZ2V0RmlsZUFQSUtleSgpLCBzdG9yZWRJZCk7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZUhhbmRsZShoYW5kbGUgYXMgYW55KTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRGlyZWN0b3J5IHBpY2sgZmFpbGVkL2NhbmNlbGxlZDpcIiwgZSk7IC8vIHN0YXkgb24gdGhlIHByb21wdFxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBvbkNvbm5lY3RlZCA9IChjb25maWc6IFJlbW90ZUNvbmZpZykgPT4geyBzYXZlUmVtb3RlQ29uZmlnKGNvbmZpZyk7IHJlc29sdmVIYW5kbGUoZ2V0UmVtb3RlSGFuZGxlKGNvbmZpZykpOyB9O1xuICAgICAgICAvLyBUaGUgdGhyZWUgb3B0aW9ucywgcmVuZGVyZWQgZnJlc2ggZWFjaCB0aW1lLiBJZiBhIHNhdmVkIHNlcnZlciBqdXN0IGZhaWxlZCwgcHJlLWZpbGwgKyBleHBhbmQgdGhlIGNvbm5lY3QgZm9ybSBzbyB0aGUgdXNlciBjYW4gcmV0cnkgb3IgZml4IGl0LlxuICAgICAgICBjb25zdCByZW5kZXJPcHRpb25zID0gKCkgPT4gKFxuICAgICAgICAgICAgPD5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzTmFtZT17Y3NzLmZvbnRTaXplKDQwKS5wYWQyKDgwLCA0MCl9IG9uQ2xpY2s9e3BpY2tMb2NhbH0+UGljayBEYXRhIERpcmVjdG9yeTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDxTZXJ2ZXJDb25uZWN0Rm9ybSBvbkNvbm5lY3RlZD17b25Db25uZWN0ZWR9IGluaXRpYWw9e3NhdmVkUmVtb3RlfSAvPlxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3NOYW1lPXtjc3MuZm9udFNpemUoNDApLnBhZDIoODAsIDQwKX1cbiAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gcmVqZWN0SGFuZGxlKG5ldyBFcnJvcihcIlVzZXIgZGlzbWlzc2VkIGZpbGUgc3lzdGVtIGFjY2VzcyBwcm9tcHRcIikpfT5EaXNtaXNzPC9idXR0b24+XG4gICAgICAgICAgICA8Lz5cbiAgICAgICAgKTtcblxuICAgICAgICAvLyBBIHByZXZpb3VzbHktcGlja2VkIGxvY2FsIGZvbGRlcjogdHJ5IHRvIHJlc3RvcmUgaXQgKG1heSBuZWVkIGEgY2xpY2spLiBTa2lwcGVkIHdoZW4gYSBzYXZlZCBzZXJ2ZXIgZmFpbGVkIOKAlCB0aGF0IHVzZXIgd2FudHMgdGhlIHNlcnZlciwgc28gZ28gc3RyYWlnaHQgdG8gdGhlIChwcmUtZmlsbGVkKSBwcm9tcHQuXG4gICAgICAgIGNvbnN0IHN0b3JlZElkID0gIXNhdmVkUmVtb3RlICYmIGxvY2FsU3RvcmFnZS5nZXRJdGVtKGdldEZpbGVBUElLZXkoKSk7XG4gICAgICAgIGlmIChzdG9yZWRJZCkge1xuICAgICAgICAgICAgbGV0IGRvbmVMb2FkID0gZmFsc2U7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsgaWYgKCFkb25lTG9hZCkgZGlzcGxheURhdGEudWkgPSBcIkNsaWNrIGFueXdoZXJlIHRvIGFsbG93IGZpbGUgc3lzdGVtIGFjY2Vzc1wiOyB9LCA1MDApO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCBoYW5kbGUgPSBhd2FpdCB0cnlUb0xvYWRQb2ludGVyKHN0b3JlZElkKTtcbiAgICAgICAgICAgICAgICBkb25lTG9hZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgaWYgKGhhbmRsZSkgcmV0dXJuIGhhbmRsZTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBkb25lTG9hZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgICAgICAgICAgICBjb25zdCBtc2cgPSBlIGluc3RhbmNlb2YgRXJyb3IgPyBlLm1lc3NhZ2UgOiBTdHJpbmcoZSk7XG4gICAgICAgICAgICAgICAgaWYgKG1zZy5pbmNsdWRlcyhcInVzZXIgYWN0aXZhdGlvblwiKSB8fCBtc2cuaW5jbHVkZXMoXCJVc2VyIGFjdGl2YXRpb25cIikpIHtcbiAgICAgICAgICAgICAgICAgICAgZGlzcGxheURhdGEudWkgPSAoXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17Y3NzLnZib3goMjApLmNlbnRlcn0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzc05hbWU9e2Nzcy5mb250U2l6ZSg0MCkucGFkMig4MCwgNDApfSBvbkNsaWNrPXthc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlEYXRhLnVpID0gXCJMb2FkaW5nLi4uXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoID0gYXdhaXQgdHJ5VG9Mb2FkUG9pbnRlcihzdG9yZWRJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaCkgeyByZXNvbHZlSGFuZGxlKGgpOyByZXR1cm47IH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAocmV0cnlFcnJvcikgeyBjb25zb2xlLmVycm9yKFwiUmV0cnkgZmFpbGVkOlwiLCByZXRyeUVycm9yKTsgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5RGF0YS51aSA9IDxkaXYgY2xhc3NOYW1lPXtjc3MudmJveCgyMCkuY2VudGVyfT57cmVuZGVyT3B0aW9ucygpfTwvZGl2PjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fT5DbGljayB0byByZXN0b3JlIGZpbGUgc3lzdGVtIGFjY2VzczwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtyZW5kZXJPcHRpb25zKCl9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHByb21pc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGRpc3BsYXlEYXRhLnVpID0gPGRpdiBjbGFzc05hbWU9e2Nzcy52Ym94KDIwKS5jZW50ZXJ9PntyZW5kZXJPcHRpb25zKCl9PC9kaXY+O1xuICAgICAgICByZXR1cm4gYXdhaXQgcHJvbWlzZTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgICBwcmVhY3QucmVuZGVyKG51bGwsIHJvb3QpO1xuICAgICAgICByb290LnJlbW92ZSgpO1xuICAgIH1cbn0pO1xuXG5leHBvcnQgY29uc3QgZ2V0RmlsZVN0b3JhZ2VOZXN0ZWQgPSBjYWNoZShhc3luYyBmdW5jdGlvbiBnZXRGaWxlU3RvcmFnZShwYXRoOiBzdHJpbmcpOiBQcm9taXNlPEZpbGVTdG9yYWdlPiB7XG4gICAgbGV0IGJhc2UgPSBhd2FpdCBnZXREaXJlY3RvcnlIYW5kbGUoKTtcbiAgICBmb3IgKGxldCBwYXJ0IG9mIHBhdGguc3BsaXQoXCIvXCIpKSB7XG4gICAgICAgIGlmICghcGFydCkgY29udGludWU7XG4gICAgICAgIGJhc2UgPSBhd2FpdCBiYXNlLmdldERpcmVjdG9yeUhhbmRsZShwYXJ0LCB7IGNyZWF0ZTogdHJ1ZSB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHdyYXBIYW5kbGUoYmFzZSk7XG59KTtcbi8vIFN1cHBvcnRzIGlmIHRoZSB1c2VyIHNlbGVjdHMgdGhlIGZvbGRlciB0aGF0IGNvbnRhaW5zIHRoZSBkYXRhIGZvbGRlciBvciB0aGUgZGF0YSBmb2xkZXIgZGlyZWN0bHkuIElmIHBhdGhTdHIgaXMgYW4gYWJzb2x1dGUgcGF0aCAoYW5kIHdlJ3JlIGluIG5vZGVqcykgd2UgdXNlIGl0IGRpcmVjdGx5LlxuZXhwb3J0IGNvbnN0IGdldEZpbGVTdG9yYWdlTmVzdGVkMiA9IGNhY2hlKGFzeW5jIGZ1bmN0aW9uIGdldEZpbGVTdG9yYWdlKHBhdGhTdHI6IHN0cmluZyk6IFByb21pc2U8RmlsZVN0b3JhZ2U+IHtcbiAgICBsZXQgYmFzZTogRGlyZWN0b3J5V3JhcHBlcjtcbiAgICBwYXRoU3RyID0gcGF0aFN0ci5yZXBsYWNlQWxsKFwiXFxcXFwiLCBcIi9cIik7XG4gICAgaWYgKGlzTm9kZSgpKSB7XG4gICAgICAgIGlmIChwYXRoLmlzQWJzb2x1dGUocGF0aFN0cikpIHtcbiAgICAgICAgICAgIHJldHVybiB3cmFwSGFuZGxlKG5ldyBOb2RlSlNEaXJlY3RvcnlIYW5kbGVXcmFwcGVyKHBhdGhTdHIpKTtcbiAgICAgICAgfVxuICAgICAgICBiYXNlID0gbmV3IE5vZGVKU0RpcmVjdG9yeUhhbmRsZVdyYXBwZXIocGF0aC5yZXNvbHZlKFwiLi9kYXRhL1wiKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgYmFzZSA9IGF3YWl0IGdldERpcmVjdG9yeUhhbmRsZSgpO1xuICAgICAgICAvLyBTa2lwIHRoZSBcImZpbmQgZGF0YSBzdWJkaXJcIiBoYWNrIHVuZGVyIE9QRlMg4oCUIHRoYXQncyBmb3IgcGlja2VkIGRpcmVjdG9yaWVzIHdoZXJlIHRoZSB1c2VyIG1pZ2h0IGhhdmUgc2VsZWN0ZWQgYSBmb2xkZXIgd2l0aCB1bnJlbGF0ZWQgZmlsZXM7IE9QRlMgaXMgYSBjbGVhbiByb290IHdlIG93biBlbmQtdG8tZW5kLlxuICAgICAgICBpZiAoIW9wZnNFbmFibGVkKSB7XG4gICAgICAgICAgICBsZXQgZGlyczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgICAgIGxldCBhbGxzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICAgICAgZm9yIGF3YWl0IChjb25zdCBbbmFtZSwgZW50cnldIG9mIGJhc2UpIHtcbiAgICAgICAgICAgICAgICBpZiAoZW50cnkua2luZCA9PT0gXCJkaXJlY3RvcnlcIikge1xuICAgICAgICAgICAgICAgICAgICBkaXJzLnB1c2gobmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGFsbHMucHVzaChuYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEhBQ0s6IElmIHRoZXJlIGFyZSBlbm91Z2ggZmlsZXMsIGl0J3MgYWxtb3N0IGNlcnRhaW5seSBub3QgYSBkaXJlY3RvcnkgdGhhdCBjb250YWlucyBjb2xsZWN0aW9ucy4gSXQncyBwcm9iYWJseSB0aGUgdXNlcidzIGRhdGEgaW5zdGVhZFxuICAgICAgICAgICAgaWYgKGRpcnMuaW5jbHVkZXMoXCIuZ2l0XCIpIHx8IGRpcnMuaW5jbHVkZXMoXCJkYXRhXCIpIHx8IGFsbHMubGVuZ3RoID4gMTAwKSB7XG4gICAgICAgICAgICAgICAgYmFzZSA9IGF3YWl0IGJhc2UuZ2V0RGlyZWN0b3J5SGFuZGxlKFwiZGF0YVwiLCB7IGNyZWF0ZTogdHJ1ZSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGxldCBwYXJ0IG9mIHBhdGhTdHIuc3BsaXQoXCIvXCIpKSB7XG4gICAgICAgIGlmICghcGFydCkgY29udGludWU7XG4gICAgICAgIGJhc2UgPSBhd2FpdCBiYXNlLmdldERpcmVjdG9yeUhhbmRsZShwYXJ0LCB7IGNyZWF0ZTogdHJ1ZSB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHdyYXBIYW5kbGUoYmFzZSk7XG59KTtcbmV4cG9ydCBjb25zdCBnZXRGaWxlU3RvcmFnZSA9IGxhenkoYXN5bmMgZnVuY3Rpb24gZ2V0RmlsZVN0b3JhZ2UoKTogUHJvbWlzZTxGaWxlU3RvcmFnZT4ge1xuICAgIGlmIChVU0VfSU5ERVhFRF9EQikge1xuICAgICAgICByZXR1cm4gYXdhaXQgZ2V0RmlsZVN0b3JhZ2VJbmRleERCKCk7XG4gICAgfVxuICAgIGxldCBoYW5kbGUgPSBhd2FpdCBnZXREaXJlY3RvcnlIYW5kbGUoKTtcbiAgICByZXR1cm4gd3JhcEhhbmRsZShoYW5kbGUpO1xufSk7XG5leHBvcnQgZnVuY3Rpb24gcmVzZXRTdG9yYWdlTG9jYXRpb24oKSB7XG4gICAgaWYgKG9wZnNFbmFibGVkKSB7XG4gICAgICAgIC8vIERvbid0IGRlbGV0ZSBwcmV2aW91cyBmb2xkZXIg4oCUIGxpc3RQcml2YXRlRm9sZGVycyAvIHBpY2tQcml2YXRlRm9sZGVyIHN0aWxsIG5lZWQgaXQuIEp1c3QgcG9pbnQgXCJjdXJyZW50XCIgYXQgYSBmcmVzaCB0aW1lc3RhbXAtbmFtZWQgb25lIHNvIHRoZSBuZXh0IHJlbG9hZCBzdGFydHMgY2xlYW4uXG4gICAgICAgIHNldEN1cnJlbnRPcGZzRm9sZGVyKG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKS5yZXBsYWNlKC9bOi5dL2csIFwiLVwiKSk7XG4gICAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShnZXRGaWxlQVBJS2V5KCkpO1xuICAgIHRyeSB7IGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKHJlbW90ZUNvbmZpZ0tleSgpKTsgfSBjYXRjaCB7IC8qIGlnbm9yZSAqLyB9XG4gICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpO1xufVxuXG5leHBvcnQgdHlwZSBOZXN0ZWRGaWxlU3RvcmFnZSA9IHtcbiAgICBoYXNLZXkoa2V5OiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+O1xuICAgIGdldFN0b3JhZ2Uoa2V5OiBzdHJpbmcpOiBQcm9taXNlPEZpbGVTdG9yYWdlPjtcbiAgICByZW1vdmVTdG9yYWdlKGtleTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPjtcbiAgICBnZXRLZXlzKGluY2x1ZGVGb2xkZXJzPzogYm9vbGVhbik6IFByb21pc2U8c3RyaW5nW10+O1xufTtcblxuZXhwb3J0IHR5cGUgRmlsZVN0b3JhZ2UgPSBJU3RvcmFnZVJhdyAmIHtcbiAgICBmb2xkZXI6IE5lc3RlZEZpbGVTdG9yYWdlO1xuICAgIC8vIE1pcnJvcnMgRGlyZWN0b3J5V3JhcHBlci5pc1JlbW90ZTogdHJ1ZSB3aGVuIHRoaXMgc3RvcmFnZSBpcyBzZXJ2ZWQgb3ZlciB0aGUgbmV0d29yay4gTGV0cyBjYWxsZXJzIChlLmcuIEJ1bGtEYXRhYmFzZTIsIHdoaWNoIHNraXBzIGF1dG9tYXRpYyBjb21wYWN0aW9uIG92ZXIgdGhlIG5ldHdvcmsgYnkgZGVmYXVsdCkgYWRhcHQuXG4gICAgaXNSZW1vdGU/OiBib29sZWFuO1xufTtcblxubGV0IGFwcGVuZFF1ZXVlID0gY2FjaGUoKGtleTogc3RyaW5nKSA9PiB7XG4gICAgcmV0dXJuIHJ1bkluU2VyaWFsKChmbmM6ICgpID0+IFByb21pc2U8dm9pZD4pID0+IGZuYygpKTtcbn0pO1xuXG5cbmFzeW5jIGZ1bmN0aW9uIGZpeGVkR2V0RmlsZUhhbmRsZShjb25maWc6IHtcbiAgICBoYW5kbGU6IERpcmVjdG9yeVdyYXBwZXI7XG4gICAga2V5OiBzdHJpbmc7XG4gICAgY3JlYXRlOiB0cnVlO1xufSk6IFByb21pc2U8RmlsZVdyYXBwZXI+O1xuYXN5bmMgZnVuY3Rpb24gZml4ZWRHZXRGaWxlSGFuZGxlKGNvbmZpZzoge1xuICAgIGhhbmRsZTogRGlyZWN0b3J5V3JhcHBlcjtcbiAgICBrZXk6IHN0cmluZztcbiAgICBjcmVhdGU/OiBib29sZWFuO1xufSk6IFByb21pc2U8RmlsZVdyYXBwZXIgfCB1bmRlZmluZWQ+O1xuYXN5bmMgZnVuY3Rpb24gZml4ZWRHZXRGaWxlSGFuZGxlKGNvbmZpZzoge1xuICAgIGhhbmRsZTogRGlyZWN0b3J5V3JhcHBlcjtcbiAgICBrZXk6IHN0cmluZztcbiAgICBjcmVhdGU/OiBib29sZWFuO1xufSk6IFByb21pc2U8RmlsZVdyYXBwZXIgfCB1bmRlZmluZWQ+IHtcbiAgICBpZiAoY29uZmlnLmtleS5pbmNsdWRlcyhcIi9cIikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgdXNlIGZvbGRlcnMgZGlyZWN0bHkgaW4gZmlsZSBzeXN0ZW0gcmVhZCAvIHdyaXRlcy4gVXNlIGEgd3JhcHBlciB3aGljaCBoYW5kbGVzIHRoZSBmb2xkZXIgbmF2aWdhdGlvbi4gUGF0aCB3YXMgJHtKU09OLnN0cmluZ2lmeShjb25maWcua2V5KX1gKTtcbiAgICB9XG4gICAgLy8gQUxXQVlTIHRyeSB3aXRob3V0IGNyZWF0ZSwgYmVjYXVzZSB0aGUgc3NoZnMtd2luIHN1Y2tzIGFuZCBkb2Vzbid0IHN1cHBvcnQgYGNyZWF0ZTogdHJ1ZWA/IFd0Zi4uLlxuICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCBjb25maWcuaGFuZGxlLmdldEZpbGVIYW5kbGUoY29uZmlnLmtleSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAgIGlmICghY29uZmlnLmNyZWF0ZSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIGF3YWl0IGNvbmZpZy5oYW5kbGUuZ2V0RmlsZUhhbmRsZShjb25maWcua2V5LCB7IGNyZWF0ZTogdHJ1ZSB9KTtcbn1cblxuLy8gQSBmaWxlIHRoYXQgZ2VudWluZWx5IGRvZXMgbm90IGV4aXN0LiBXZSBtdXN0IE5PVCByZXRyeSB0aGVzZSwgb3RoZXJ3aXNlIHJlYWRpbmcgbWFueSBtaXNzaW5nIGZpbGVzIChhIGNvbW1vbiBwYXR0ZXJuKSBnZXRzIGNhdGFzdHJvcGhpY2FsbHkgc2xvdy5cbmZ1bmN0aW9uIGlzTWlzc2luZ0Vycm9yKGVycm9yOiB1bmtub3duKTogYm9vbGVhbiB7XG4gICAgbGV0IG5hbWUgPSAoZXJyb3IgYXMgeyBuYW1lPzogc3RyaW5nIH0pPy5uYW1lO1xuICAgIGxldCBjb2RlID0gKGVycm9yIGFzIHsgY29kZT86IHN0cmluZyB9KT8uY29kZTtcbiAgICByZXR1cm4gbmFtZSA9PT0gXCJOb3RGb3VuZEVycm9yXCIgfHwgY29kZSA9PT0gXCJFTk9FTlRcIjtcbn1cblxuY29uc3QgTUFYX1JFQURfUkVUUklFUyA9IDY7XG5cbi8vIFRoZSBicm93c2VyIEZpbGUgU3lzdGVtIEFjY2VzcyBBUEkgY2FuIHRyYW5zaWVudGx5IGZhaWwgcmVhZHMgdW5kZXIgaGVhdnkgbG9hZCAoaXQgYXBwZWFycyB0byB0aHJvdHRsZSB3aGVuIGEgcGFnZSBpc3N1ZXMgbWFueSByZWFkcyBhdCBvbmNlKS4gVGhvc2UgZmFpbHVyZXMgc3VyZmFjZSBhcyBlcnJvcnMgT1RIRVIgdGhhbiBcIm5vdCBmb3VuZFwiLCBzbyB3ZSByZXRyeSB0aGVtIHdpdGggYmFja29mZi4gQSByZWFsIG1pc3NpbmcgZmlsZSAoTm90Rm91bmRFcnJvciAvIEVOT0VOVCkgcmV0dXJucyB1bmRlZmluZWQgaW1tZWRpYXRlbHkgd2l0aCBubyByZXRyeS5cbmFzeW5jIGZ1bmN0aW9uIHJlYWRXaXRoUmV0cnk8VD4obGFiZWw6IHN0cmluZywga2V5OiBzdHJpbmcsIHJlYWQ6ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+IHtcbiAgICBsZXQgYmFja29mZiA9IDI1O1xuICAgIGZvciAobGV0IGF0dGVtcHQgPSAwOyA7IGF0dGVtcHQrKykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHJlYWQoKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChpc01pc3NpbmdFcnJvcihlcnJvcikpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBsZXQgbmFtZSA9IChlcnJvciBhcyB7IG5hbWU/OiBzdHJpbmcgfSk/Lm5hbWUgfHwgXCJFcnJvclwiO1xuICAgICAgICAgICAgbGV0IG1lc3NhZ2UgPSAoZXJyb3IgYXMgeyBtZXNzYWdlPzogc3RyaW5nIH0pPy5tZXNzYWdlIHx8IFN0cmluZyhlcnJvcik7XG4gICAgICAgICAgICBpZiAoYXR0ZW1wdCA+PSBNQVhfUkVBRF9SRVRSSUVTKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKGAke2xhYmVsfSBnYXZlIHVwIG9uICR7SlNPTi5zdHJpbmdpZnkoa2V5KX0gYWZ0ZXIgJHthdHRlbXB0fSByZXRyaWVzICgke25hbWV9KTogJHttZXNzYWdlLnNsaWNlKDAsIDIwMCl9YCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgJHtsYWJlbH0gcmV0cnlpbmcgJHtKU09OLnN0cmluZ2lmeShrZXkpfSAoYXR0ZW1wdCAke2F0dGVtcHQgKyAxfSwgJHtuYW1lfSk6ICR7bWVzc2FnZS5zbGljZSgwLCAyMDApfWApO1xuICAgICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIGJhY2tvZmYpKTtcbiAgICAgICAgICAgIGJhY2tvZmYgPSBNYXRoLm1pbihiYWNrb2ZmICogMiwgMTAwMCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmZ1bmN0aW9uIHdyYXBIYW5kbGVGaWxlcyhoYW5kbGU6IERpcmVjdG9yeVdyYXBwZXIpOiBJU3RvcmFnZVJhdyB7XG4gICAgLy8gTG9nIHRoZSBmdWxsIHBhdGggKHJvb3QgKyBmaWxlbmFtZSkgd2hlbiBhdmFpbGFibGUsIHNvIGEgZmFpbGluZyBmaWxlIGlzIGlkZW50aWZpYWJsZS5cbiAgICBjb25zdCBwYXRoT2YgPSAoa2V5OiBzdHJpbmcpID0+IGhhbmRsZS5mdWxsUGF0aCA/IGhhbmRsZS5mdWxsUGF0aCArIFwiL1wiICsga2V5IDoga2V5O1xuICAgIHJldHVybiB7XG4gICAgICAgIGFzeW5jIGdldEluZm8oa2V5OiBzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiByZWFkV2l0aFJldHJ5KFwiZ2V0SW5mb1wiLCBwYXRoT2Yoa2V5KSwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZpbGUgPSBhd2FpdCBoYW5kbGUuZ2V0RmlsZUhhbmRsZShrZXkpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGZpbGVDb250ZW50ID0gYXdhaXQgZmlsZS5nZXRGaWxlKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgc2l6ZTogZmlsZUNvbnRlbnQuc2l6ZSxcbiAgICAgICAgICAgICAgICAgICAgbGFzdE1vZGlmaWVkOiBmaWxlQ29udGVudC5sYXN0TW9kaWZpZWQsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBhc3luYyBnZXQoa2V5OiBzdHJpbmcpOiBQcm9taXNlPEJ1ZmZlciB8IHVuZGVmaW5lZD4ge1xuICAgICAgICAgICAgcmV0dXJuIHJlYWRXaXRoUmV0cnkoXCJnZXRcIiwgcGF0aE9mKGtleSksIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBmaWxlID0gYXdhaXQgaGFuZGxlLmdldEZpbGVIYW5kbGUoa2V5KTtcbiAgICAgICAgICAgICAgICBjb25zdCBmaWxlQ29udGVudCA9IGF3YWl0IGZpbGUuZ2V0RmlsZSgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGFycmF5QnVmZmVyID0gYXdhaXQgZmlsZUNvbnRlbnQuYXJyYXlCdWZmZXIoKTtcbiAgICAgICAgICAgICAgICAvLyBVbmRlciBsb2FkIHRoZSBGUyBBY2Nlc3MgQVBJIGNhbiByZXNvbHZlIHdpdGggYSB0cnVuY2F0ZWQgYnVmZmVyIGFuZCBubyBlcnJvci4gVHJlYXQgYSBzaG9ydCByZWFkIGFzIHRyYW5zaWVudCBzbyByZWFkV2l0aFJldHJ5IHJldHJpZXMgaXQuXG4gICAgICAgICAgICAgICAgaWYgKGFycmF5QnVmZmVyLmJ5dGVMZW5ndGggIT09IGZpbGVDb250ZW50LnNpemUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgT2JqZWN0LmFzc2lnbihuZXcgRXJyb3IoYFNob3J0IHJlYWQ6IGdvdCAke2FycmF5QnVmZmVyLmJ5dGVMZW5ndGh9IG9mICR7ZmlsZUNvbnRlbnQuc2l6ZX0gYnl0ZXNgKSwgeyBuYW1lOiBcIlNob3J0UmVhZEVycm9yXCIgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBCdWZmZXIuZnJvbShhcnJheUJ1ZmZlcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcblxuICAgICAgICBhc3luYyBnZXRSYW5nZShrZXk6IHN0cmluZywgY29uZmlnOiB7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyIH0pOiBQcm9taXNlPEJ1ZmZlciB8IHVuZGVmaW5lZD4ge1xuICAgICAgICAgICAgcmV0dXJuIHJlYWRXaXRoUmV0cnkoXCJnZXRSYW5nZVwiLCBwYXRoT2Yoa2V5KSwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZpbGUgPSBhd2FpdCBoYW5kbGUuZ2V0RmlsZUhhbmRsZShrZXkpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGZpbGVDb250ZW50ID0gYXdhaXQgZmlsZS5nZXRGaWxlKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgY2xhbXBlZFN0YXJ0ID0gTWF0aC5taW4oTWF0aC5tYXgoY29uZmlnLnN0YXJ0LCAwKSwgZmlsZUNvbnRlbnQuc2l6ZSk7XG4gICAgICAgICAgICAgICAgY29uc3QgY2xhbXBlZEVuZCA9IE1hdGgubWluKE1hdGgubWF4KGNvbmZpZy5lbmQsIGNsYW1wZWRTdGFydCksIGZpbGVDb250ZW50LnNpemUpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGFycmF5QnVmZmVyID0gYXdhaXQgZmlsZUNvbnRlbnQuc2xpY2UoY29uZmlnLnN0YXJ0LCBjb25maWcuZW5kKS5hcnJheUJ1ZmZlcigpO1xuICAgICAgICAgICAgICAgIGlmIChhcnJheUJ1ZmZlci5ieXRlTGVuZ3RoICE9PSBjbGFtcGVkRW5kIC0gY2xhbXBlZFN0YXJ0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IE9iamVjdC5hc3NpZ24obmV3IEVycm9yKGBTaG9ydCByYW5nZSByZWFkOiBnb3QgJHthcnJheUJ1ZmZlci5ieXRlTGVuZ3RofSBvZiAke2NsYW1wZWRFbmQgLSBjbGFtcGVkU3RhcnR9IGJ5dGVzYCksIHsgbmFtZTogXCJTaG9ydFJlYWRFcnJvclwiIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gQnVmZmVyLmZyb20oYXJyYXlCdWZmZXIpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgYXN5bmMgYXBwZW5kKGtleTogc3RyaW5nLCB2YWx1ZTogQnVmZmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgICAgICBhd2FpdCBhcHBlbmRRdWV1ZShrZXkpKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBOT1RFOiBJbnRlcmVzdGluZyBwb2ludC4gQ2hyb21lIGRvZXNuJ3Qgb3B0aW1pemUgdGhpcyB0byBiZSBhbiBhcHBlbmQsIGFuZCBpbnN0ZWFkIHJld3JpdGVzIHRoZSBlbnRpcmUgZmlsZS5cbiAgICAgICAgICAgICAgICBjb25zdCBmaWxlID0gYXdhaXQgZml4ZWRHZXRGaWxlSGFuZGxlKHsgaGFuZGxlLCBrZXksIGNyZWF0ZTogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgICBjb25zdCB3cml0YWJsZSA9IGF3YWl0IGZpbGUuY3JlYXRlV3JpdGFibGUoeyBrZWVwRXhpc3RpbmdEYXRhOiB0cnVlIH0pO1xuICAgICAgICAgICAgICAgIGxldCBvZmZzZXQgPSAoYXdhaXQgZmlsZS5nZXRGaWxlKCkpLnNpemU7XG4gICAgICAgICAgICAgICAgYXdhaXQgd3JpdGFibGUuc2VlayhvZmZzZXQpO1xuICAgICAgICAgICAgICAgIGF3YWl0IHdyaXRhYmxlLndyaXRlKHZhbHVlKTtcbiAgICAgICAgICAgICAgICBhd2FpdCB3cml0YWJsZS5jbG9zZSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgYXN5bmMgc2V0KGtleTogc3RyaW5nLCB2YWx1ZTogQnVmZmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgICAgICBjb25zdCBmaWxlID0gYXdhaXQgZml4ZWRHZXRGaWxlSGFuZGxlKHsgaGFuZGxlLCBrZXksIGNyZWF0ZTogdHJ1ZSB9KTtcbiAgICAgICAgICAgIGNvbnN0IHdyaXRhYmxlID0gYXdhaXQgZmlsZS5jcmVhdGVXcml0YWJsZSgpO1xuICAgICAgICAgICAgYXdhaXQgd3JpdGFibGUud3JpdGUodmFsdWUpO1xuICAgICAgICAgICAgYXdhaXQgd3JpdGFibGUuY2xvc2UoKTtcbiAgICAgICAgfSxcblxuICAgICAgICBhc3luYyByZW1vdmUoa2V5OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgICAgIGF3YWl0IGhhbmRsZS5yZW1vdmVFbnRyeShrZXkpO1xuICAgICAgICB9LFxuXG4gICAgICAgIGFzeW5jIGdldEtleXMoaW5jbHVkZUZvbGRlcnM6IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICAgICAgICAgIGNvbnN0IGtleXM6IHN0cmluZ1tdID0gW107XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGZvciBhd2FpdCAoY29uc3QgW25hbWUsIGVudHJ5XSBvZiBoYW5kbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVudHJ5LmtpbmQgPT09IFwiZmlsZVwiIHx8IGluY2x1ZGVGb2xkZXJzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBrZXlzLnB1c2goZW50cnkubmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGxldCBuYW1lID0gKGVycm9yIGFzIHsgbmFtZT86IHN0cmluZyB9KT8ubmFtZSB8fCBcIkVycm9yXCI7XG4gICAgICAgICAgICAgICAgbGV0IG1lc3NhZ2UgPSAoZXJyb3IgYXMgeyBtZXNzYWdlPzogc3RyaW5nIH0pPy5tZXNzYWdlIHx8IFN0cmluZyhlcnJvcik7XG4gICAgICAgICAgICAgICAgLy8gQSBmYWlsdXJlIG1pZC1pdGVyYXRpb24gd291bGQgc2lsZW50bHkgdHJ1bmNhdGUgdGhlIGxpc3RpbmcsIHNvIHN1cmZhY2UgaXQgbG91ZGx5LlxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYGdldEtleXMgZGlyZWN0b3J5IGl0ZXJhdGlvbiBmYWlsZWQgYWZ0ZXIgJHtrZXlzLmxlbmd0aH0gZW50cmllcyAoJHtuYW1lfSk6ICR7bWVzc2FnZS5zbGljZSgwLCAzMDApfWApO1xuICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGtleXM7XG4gICAgICAgIH0sXG5cbiAgICAgICAgYXN5bmMgcmVzZXQoKSB7XG4gICAgICAgICAgICBmb3IgYXdhaXQgKGNvbnN0IFtuYW1lLCBlbnRyeV0gb2YgaGFuZGxlKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgaGFuZGxlLnJlbW92ZUVudHJ5KGVudHJ5Lm5hbWUsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgIH07XG59XG5cbmZ1bmN0aW9uIHdyYXBIYW5kbGVOZXN0ZWQoaGFuZGxlOiBEaXJlY3RvcnlXcmFwcGVyKTogTmVzdGVkRmlsZVN0b3JhZ2Uge1xuICAgIHJldHVybiB7XG4gICAgICAgIGFzeW5jIGhhc0tleShrZXk6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBhd2FpdCBoYW5kbGUuZ2V0RGlyZWN0b3J5SGFuZGxlKGtleSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICBhc3luYyBnZXRTdG9yYWdlKGtleTogc3RyaW5nKTogUHJvbWlzZTxGaWxlU3RvcmFnZT4ge1xuICAgICAgICAgICAgY29uc3Qgc3ViRGlyZWN0b3J5ID0gYXdhaXQgaGFuZGxlLmdldERpcmVjdG9yeUhhbmRsZShrZXksIHsgY3JlYXRlOiB0cnVlIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHdyYXBIYW5kbGUoc3ViRGlyZWN0b3J5KTtcbiAgICAgICAgfSxcblxuICAgICAgICBhc3luYyByZW1vdmVTdG9yYWdlKGtleTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgICAgICBhd2FpdCBoYW5kbGUucmVtb3ZlRW50cnkoa2V5LCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgfSxcblxuICAgICAgICBhc3luYyBnZXRLZXlzKCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICAgICAgICAgIGNvbnN0IGtleXM6IHN0cmluZ1tdID0gW107XG4gICAgICAgICAgICBmb3IgYXdhaXQgKGNvbnN0IFtuYW1lLCBlbnRyeV0gb2YgaGFuZGxlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVudHJ5LmtpbmQgPT09IFwiZGlyZWN0b3J5XCIpIHtcbiAgICAgICAgICAgICAgICAgICAga2V5cy5wdXNoKGVudHJ5Lm5hbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBrZXlzO1xuICAgICAgICB9LFxuICAgIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3cmFwSGFuZGxlKGhhbmRsZTogRGlyZWN0b3J5V3JhcHBlcik6IEZpbGVTdG9yYWdlIHtcbiAgICByZXR1cm4ge1xuICAgICAgICAuLi53cmFwSGFuZGxlRmlsZXMoaGFuZGxlKSxcbiAgICAgICAgZm9sZGVyOiB3cmFwSGFuZGxlTmVzdGVkKGhhbmRsZSksXG4gICAgICAgIGlzUmVtb3RlOiBoYW5kbGUuaXNSZW1vdGUsXG4gICAgfTtcbn1cblxuLy8gUmV0dXJucyBhIFVSTCBmb3IgYSBmaWxlJ3MgYnl0ZXMsIHJlYWR5IHRvIGRyb3AgaW50byA8dmlkZW8+LzxpbWc+L2ZldGNoLiBBIG5hdGl2ZSAobG9jYWwpIGZpbGUgYmVjb21lcyBhbiBpbi1tZW1vcnkgYmxvYjogVVJMOyBhIHJlbW90ZSBmaWxlIGJlY29tZXMgYW4gaHR0cHMgVVJMIGludG8gdGhlIHNlcnZlcidzIHJhbmdlLWNhcGFibGUgL21lZGlhIGVuZHBvaW50IChhdXRoIHRva2VuIGluIHRoZSBxdWVyeSwgc2luY2UgYSBtZWRpYSBlbGVtZW50IGNhbid0IHNlbmQgaGVhZGVycykuIEJvdGggc3VwcG9ydCBIVFRQIHJhbmdlIC8gc2Vla2luZy4gQUxXQVlTIGhhbmQgdGhlIHJlc3VsdCB0byBkaXNwb3NlRmlsZVVSTCB3aGVuIGZpbmlzaGVkIOKAlCBmb3IgYmxvYjogVVJMcyB0aGF0IGZyZWVzIG1lbW9yeS5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRGaWxlVVJMKGZpbGU6IEZpbGVXcmFwcGVyKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBpZiAoZmlsZS5nZXRVUkwpIHJldHVybiBmaWxlLmdldFVSTCgpO1xuICAgIC8vIE5hdGl2ZSBGaWxlU3lzdGVtRmlsZUhhbmRsZSAob3IgYW55IEJsb2ItYmFja2VkIGZpbGUpOiBhIGJsb2I6IFVSTCBvdmVyIHRoZSBGaWxlIGl0c2VsZi5cbiAgICBjb25zdCBmID0gYXdhaXQgZmlsZS5nZXRGaWxlKCk7XG4gICAgcmV0dXJuIFVSTC5jcmVhdGVPYmplY3RVUkwoZiBhcyB1bmtub3duIGFzIEJsb2IpO1xufVxuXG4vLyBSZWxlYXNlcyBhIFVSTCBmcm9tIGdldEZpbGVVUkwuIGJsb2I6IFVSTHMgbGVhayB1bnRpbCB0aGUgZG9jdW1lbnQgaXMgZ29uZSB1bmxlc3MgcmV2b2tlZDsgaHR0cHMvZmlsZTogVVJMcyBuZWVkIG5vIGNsZWFudXAsIHNvIHRoaXMgaXMgYSBuby1vcCBmb3IgdGhlbS5cbmV4cG9ydCBmdW5jdGlvbiBkaXNwb3NlRmlsZVVSTCh1cmw6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICh1cmwuc3RhcnRzV2l0aChcImJsb2I6XCIpKSB7XG4gICAgICAgIHRyeSB7IFVSTC5yZXZva2VPYmplY3RVUkwodXJsKTsgfSBjYXRjaCB7IC8qIG5vdCBpbiBhIGJyb3dzZXIsIG9yIGFscmVhZHkgcmV2b2tlZCAqLyB9XG4gICAgfVxufVxuXG4vLyBBIFN0b3JhZ2VGYWN0b3J5IGJhY2tlZCBieSBhIHJlbW90ZSBzZXJ2ZXIgKHBhdGggLT4gRmlsZVN0b3JhZ2UpLCBmb3IgY29kZSB0aGF0IGluamVjdHMgaXRzIG93biBzdG9yYWdlIGludG8gQnVsa0RhdGFiYXNlMiByYXRoZXIgdGhhbiBnb2luZyB0aHJvdWdoIHRoZSBkaXJlY3RvcnkgcHJvbXB0LlxuZXhwb3J0IGZ1bmN0aW9uIGdldFJlbW90ZUZpbGVTdG9yYWdlRmFjdG9yeSh1cmw6IHN0cmluZywgcGFzc3dvcmQ6IHN0cmluZywgb3B0aW9ucz86IFJlbW90ZU9wdGlvbnMpOiAocGF0aFN0cjogc3RyaW5nKSA9PiBQcm9taXNlPEZpbGVTdG9yYWdlPiB7XG4gICAgY29uc3Qgcm9vdCA9IGdldFJlbW90ZURpcmVjdG9yeUhhbmRsZSh1cmwsIHBhc3N3b3JkLCBvcHRpb25zKTtcbiAgICByZXR1cm4gYXN5bmMgKHBhdGhTdHI6IHN0cmluZykgPT4ge1xuICAgICAgICBsZXQgYmFzZTogRGlyZWN0b3J5V3JhcHBlciA9IHJvb3Q7XG4gICAgICAgIGZvciAoY29uc3QgcGFydCBvZiBwYXRoU3RyLnJlcGxhY2VBbGwoXCJcXFxcXCIsIFwiL1wiKS5zcGxpdChcIi9cIikpIHtcbiAgICAgICAgICAgIGlmICghcGFydCkgY29udGludWU7XG4gICAgICAgICAgICBiYXNlID0gYXdhaXQgYmFzZS5nZXREaXJlY3RvcnlIYW5kbGUocGFydCwgeyBjcmVhdGU6IHRydWUgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyYXBIYW5kbGUoYmFzZSk7XG4gICAgfTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRyeVRvTG9hZFBvaW50ZXIocG9pbnRlcjogc3RyaW5nKSB7XG4gICAgbGV0IHJlc3VsdCA9IGF3YWl0IGdldEZpbGVTeXN0ZW1Qb2ludGVyKHsgcG9pbnRlciB9KTtcbiAgICBpZiAoIXJlc3VsdCkgcmV0dXJuO1xuICAgIGxldCBoYW5kbGUgPSBhd2FpdCByZXN1bHQ/Lm9uVXNlckFjdGl2YXRpb24oKTtcbiAgICBpZiAoIWhhbmRsZSkgcmV0dXJuO1xuICAgIHJldHVybiBoYW5kbGUgYXMgYW55IGFzIERpcmVjdG9yeVdyYXBwZXI7XG59Il19
|
|
750
|
+
/* _JS_SOURCE_HASH = "4a3581e9d5389067ace71142e0afb3cba89b4180bac1e5d51614e31550893410"; */
|