@brainfish-ai/devdoc 0.1.47 → 0.1.49
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/dist/cli/commands/deploy.js +19 -13
- package/package.json +1 -1
- package/renderer/app/[...slug]/client.js +17 -0
- package/renderer/app/[...slug]/page.js +125 -0
- package/renderer/app/api/assets/[...path]/route.js +31 -8
- package/renderer/app/api/chat/route.js +188 -25
- package/renderer/app/api/collections/route.js +95 -2
- package/renderer/app/api/deploy/route.js +4 -0
- package/renderer/app/api/suggestions/route.js +98 -10
- package/renderer/app/globals.css +33 -0
- package/renderer/app/layout.js +83 -8
- package/renderer/components/docs/mdx/cards.js +16 -45
- package/renderer/components/docs/mdx/file-tree.js +102 -0
- package/renderer/components/docs/mdx/index.js +7 -0
- package/renderer/components/docs-viewer/agent/agent-chat.js +89 -11
- package/renderer/components/docs-viewer/agent/messages/assistant-message.js +67 -3
- package/renderer/components/docs-viewer/agent/messages/tool-call-display.js +49 -4
- package/renderer/components/docs-viewer/content/content-router.js +1 -1
- package/renderer/components/docs-viewer/content/doc-page.js +36 -28
- package/renderer/components/docs-viewer/index.js +225 -59
- package/renderer/components/docs-viewer/playground/graphql-playground.js +131 -33
- package/renderer/components/docs-viewer/shared/method-badge.js +11 -2
- package/renderer/components/docs-viewer/sidebar/collection-tree.js +44 -6
- package/renderer/components/docs-viewer/sidebar/index.js +2 -1
- package/renderer/components/docs-viewer/sidebar/right-sidebar.js +3 -1
- package/renderer/components/docs-viewer/sidebar/sidebar-item.js +5 -7
- package/renderer/hooks/use-route-state.js +44 -56
- package/renderer/lib/api-docs/agent/indexer.js +73 -12
- package/renderer/lib/api-docs/agent/use-suggestions.js +26 -16
- package/renderer/lib/api-docs/code-editor/mode-context.js +16 -18
- package/renderer/lib/api-docs/mobile-context.js +10 -1
- package/renderer/lib/api-docs/parsers/openapi/transformer.js +8 -1
- package/renderer/lib/cache/purge.js +98 -0
- package/renderer/lib/docs-link-utils.js +146 -0
- package/renderer/lib/docs-navigation-context.js +3 -2
- package/renderer/lib/docs-navigation.js +50 -41
- package/renderer/lib/rate-limit.js +203 -0
|
@@ -46,7 +46,7 @@ const constants_1 = require("../../constants");
|
|
|
46
46
|
const MAX_ASSET_SIZE = 25 * 1024 * 1024;
|
|
47
47
|
// Binary asset extensions to upload separately
|
|
48
48
|
const BINARY_EXTENSIONS = [
|
|
49
|
-
'.png', '.jpg', '.jpeg', '.gif', '.webp', '.ico',
|
|
49
|
+
'.png', '.jpg', '.jpeg', '.gif', '.webp', '.ico', '.svg',
|
|
50
50
|
'.mp4', '.webm', '.mov',
|
|
51
51
|
'.mp3', '.wav', '.ogg',
|
|
52
52
|
'.woff', '.woff2', '.ttf', '.otf', '.eot',
|
|
@@ -561,8 +561,8 @@ async function collectFiles(projectRoot) {
|
|
|
561
561
|
continue;
|
|
562
562
|
await scanDirectory(fullPath, projectRoot, files);
|
|
563
563
|
}
|
|
564
|
-
else if (item.endsWith('.mdx') || item.endsWith('.md')) {
|
|
565
|
-
// Include root-level MDX
|
|
564
|
+
else if (item.endsWith('.mdx') || item.endsWith('.md') || item.endsWith('.graphql') || item.endsWith('.gql')) {
|
|
565
|
+
// Include root-level content files (MDX, MD, GraphQL schemas)
|
|
566
566
|
const content = fs_extra_1.default.readFileSync(fullPath, 'utf-8');
|
|
567
567
|
files.push({ path: item, content });
|
|
568
568
|
}
|
|
@@ -580,10 +580,12 @@ async function collectFiles(projectRoot) {
|
|
|
580
580
|
return files;
|
|
581
581
|
}
|
|
582
582
|
/**
|
|
583
|
-
* Recursively scan a directory for MDX
|
|
583
|
+
* Recursively scan a directory for content files (MDX, MD, GraphQL schemas)
|
|
584
584
|
*/
|
|
585
585
|
async function scanDirectory(dir, projectRoot, files) {
|
|
586
586
|
const items = fs_extra_1.default.readdirSync(dir);
|
|
587
|
+
// Content file extensions to include
|
|
588
|
+
const CONTENT_EXTENSIONS = ['.mdx', '.md', '.graphql', '.gql'];
|
|
587
589
|
for (const item of items) {
|
|
588
590
|
// Skip common directories
|
|
589
591
|
if (['node_modules', 'dist', '.next', '.git', 'public'].includes(item)) {
|
|
@@ -594,13 +596,16 @@ async function scanDirectory(dir, projectRoot, files) {
|
|
|
594
596
|
if (stat.isDirectory()) {
|
|
595
597
|
await scanDirectory(fullPath, projectRoot, files);
|
|
596
598
|
}
|
|
597
|
-
else
|
|
598
|
-
const
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
599
|
+
else {
|
|
600
|
+
const ext = path_1.default.extname(item).toLowerCase();
|
|
601
|
+
if (CONTENT_EXTENSIONS.includes(ext)) {
|
|
602
|
+
const relativePath = path_1.default.relative(projectRoot, fullPath);
|
|
603
|
+
const content = fs_extra_1.default.readFileSync(fullPath, 'utf-8');
|
|
604
|
+
files.push({
|
|
605
|
+
path: relativePath,
|
|
606
|
+
content,
|
|
607
|
+
});
|
|
608
|
+
}
|
|
604
609
|
}
|
|
605
610
|
}
|
|
606
611
|
}
|
|
@@ -610,7 +615,8 @@ async function scanDirectory(dir, projectRoot, files) {
|
|
|
610
615
|
async function scanPublicAssets(dir, projectRoot, files) {
|
|
611
616
|
const items = fs_extra_1.default.readdirSync(dir);
|
|
612
617
|
// Text-based file extensions to include in content bundle
|
|
613
|
-
|
|
618
|
+
// Note: SVG is now uploaded as binary asset for better blob storage serving
|
|
619
|
+
const TEXT_EXTENSIONS = ['.json', '.css'];
|
|
614
620
|
for (const item of items) {
|
|
615
621
|
const fullPath = path_1.default.join(dir, item);
|
|
616
622
|
const stat = fs_extra_1.default.statSync(fullPath);
|
|
@@ -798,4 +804,4 @@ function createProgressBar(progress, width = 30) {
|
|
|
798
804
|
const percentage = Math.round(progress * 100);
|
|
799
805
|
return `[${bar}] ${percentage}%`;
|
|
800
806
|
}
|
|
801
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVwbG95LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NsaS9jb21tYW5kcy9kZXBsb3kudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFvUUEsd0JBMlNDO0FBL2lCRCxnREFBdUI7QUFDdkIsd0RBQXlCO0FBQ3pCLHlDQUF5RDtBQUN6RCwrQ0FBMkM7QUFDM0MsK0NBQWlEO0FBRWpELHVCQUF1QjtBQUN2QixNQUFNLGNBQWMsR0FBRyxFQUFFLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQTtBQUV2QywrQ0FBK0M7QUFDL0MsTUFBTSxpQkFBaUIsR0FBRztJQUN4QixNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLE1BQU07SUFDaEQsTUFBTSxFQUFFLE9BQU8sRUFBRSxNQUFNO0lBQ3ZCLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTTtJQUN0QixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTTtJQUN6QyxNQUFNO0NBQ1AsQ0FBQTtBQUVELG9DQUFvQztBQUNwQyxNQUFNLFVBQVUsR0FBMkI7SUFDekMsU0FBUztJQUNULE1BQU0sRUFBRSxXQUFXO0lBQ25CLE1BQU0sRUFBRSxZQUFZO0lBQ3BCLE9BQU8sRUFBRSxZQUFZO0lBQ3JCLE1BQU0sRUFBRSxXQUFXO0lBQ25CLE9BQU8sRUFBRSxZQUFZO0lBQ3JCLE1BQU0sRUFBRSxjQUFjO0lBQ3RCLE1BQU0sRUFBRSxlQUFlO0lBQ3ZCLFNBQVM7SUFDVCxNQUFNLEVBQUUsV0FBVztJQUNuQixPQUFPLEVBQUUsWUFBWTtJQUNyQixNQUFNLEVBQUUsaUJBQWlCO0lBQ3pCLFFBQVE7SUFDUixNQUFNLEVBQUUsWUFBWTtJQUNwQixNQUFNLEVBQUUsV0FBVztJQUNuQixNQUFNLEVBQUUsV0FBVztJQUNuQixRQUFRO0lBQ1IsT0FBTyxFQUFFLFdBQVc7SUFDcEIsUUFBUSxFQUFFLFlBQVk7SUFDdEIsTUFBTSxFQUFFLFVBQVU7SUFDbEIsTUFBTSxFQUFFLFVBQVU7SUFDbEIsTUFBTSxFQUFFLCtCQUErQjtJQUN2QyxZQUFZO0lBQ1osTUFBTSxFQUFFLGlCQUFpQjtDQUMxQixDQUFBO0FBRUQ7O0dBRUc7QUFDSCxTQUFTLFdBQVcsQ0FBQyxRQUFnQjtJQUNuQyxNQUFNLEdBQUcsR0FBRyxjQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFBO0lBQ2hELE9BQU8sVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLDBCQUEwQixDQUFBO0FBQ3RELENBQUM7QUFpREQsc0NBQXNDO0FBQ3RDLEtBQUssVUFBVSxNQUFNLENBQUMsUUFBZ0IsRUFBRSxZQUFxQjtJQUMzRCxNQUFNLFFBQVEsR0FBRyx3REFBYSxVQUFVLEdBQUMsQ0FBQTtJQUN6QyxNQUFNLEVBQUUsR0FBRyxRQUFRLENBQUMsZUFBZSxDQUFDO1FBQ2xDLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSztRQUNwQixNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU07S0FDdkIsQ0FBQyxDQUFBO0lBRUYsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO1FBQzdCLE1BQU0sV0FBVyxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsS0FBSyxZQUFZLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFBO1FBQzVELEVBQUUsQ0FBQyxRQUFRLENBQUMsR0FBRyxRQUFRLEdBQUcsV0FBVyxJQUFJLEVBQUUsQ0FBQyxNQUFNLEVBQUUsRUFBRTtZQUNwRCxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUE7WUFDVixPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxJQUFJLFlBQVksSUFBSSxFQUFFLENBQUMsQ0FBQTtRQUM5QyxDQUFDLENBQUMsQ0FBQTtJQUNKLENBQUMsQ0FBQyxDQUFBO0FBQ0osQ0FBQztBQUVEOztHQUVHO0FBQ0gsS0FBSyxVQUFVLDBCQUEwQixDQUN2QyxTQUFpQixFQUNqQixNQUFjO0lBRWQsSUFBSSxDQUFDO1FBQ0gsTUFBTSxRQUFRLEdBQUcsTUFBTSxLQUFLLENBQUMsR0FBRyxNQUFNLHVCQUF1QixFQUFFO1lBQzdELE1BQU0sRUFBRSxNQUFNO1lBQ2QsT0FBTyxFQUFFO2dCQUNQLGNBQWMsRUFBRSxrQkFBa0I7YUFDbkM7WUFDRCxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxDQUFDO1NBQ3BDLENBQUMsQ0FBQTtRQUVGLE1BQU0sTUFBTSxHQUFHLE1BQU0sUUFBUSxDQUFDLElBQUksRUFBNEIsQ0FBQTtRQUM5RCxPQUFPLE1BQU0sQ0FBQTtJQUNmLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCw2RUFBNkU7UUFDN0UsT0FBTyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQTtJQUM1QixDQUFDO0FBQ0gsQ0FBQztBQUVEOztHQUVHO0FBQ0gsU0FBUyxzQkFBc0IsQ0FBQyxTQUFpQjtJQUMvQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDZixPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsdUJBQXVCLEVBQUUsQ0FBQTtJQUN6RCxDQUFDO0lBRUQsSUFBSSxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ3pCLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSx5Q0FBeUMsRUFBRSxDQUFBO0lBQzNFLENBQUM7SUFFRCxJQUFJLFNBQVMsQ0FBQyxNQUFNLEdBQUcsRUFBRSxFQUFFLENBQUM7UUFDMUIsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLHlDQUF5QyxFQUFFLENBQUE7SUFDM0UsQ0FBQztJQUVELElBQUksQ0FBQyxpQ0FBaUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztRQUN2RCxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUscUVBQXFFLEVBQUUsQ0FBQTtJQUN2RyxDQUFDO0lBRUQsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7UUFDekIsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLDhDQUE4QyxFQUFFLENBQUE7SUFDaEYsQ0FBQztJQUVELE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUE7QUFDeEIsQ0FBQztBQWtCRDs7R0FFRztBQUNILEtBQUssVUFBVSx1QkFBdUIsQ0FDcEMsV0FBbUIsRUFDbkIsTUFBYyxFQUNkLE1BQWM7SUFFZCw4QkFBOEI7SUFDOUIsTUFBTSxnQkFBZ0IsR0FBRyxjQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxhQUFhLENBQUMsQ0FBQTtJQUU5RCxJQUFJLENBQUMsa0JBQUUsQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDO1FBQ3JDLE9BQU0sQ0FBQyxnQ0FBZ0M7SUFDekMsQ0FBQztJQUVELElBQUksWUFBMEIsQ0FBQTtJQUM5QixJQUFJLENBQUM7UUFDSCxZQUFZLEdBQUcsa0JBQUUsQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLENBQWlCLENBQUE7SUFDbEUsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLGVBQU0sQ0FBQyxJQUFJLENBQUMsMENBQTBDLENBQUMsQ0FBQTtRQUN2RCxPQUFNO0lBQ1IsQ0FBQztJQUVELElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDL0IsT0FBTTtJQUNSLENBQUM7SUFFRCxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFBO0lBQ2YsZUFBTSxDQUFDLElBQUksQ0FBQyw2QkFBNkIsWUFBWSxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUE7SUFFckUsOEJBQThCO0lBQzlCLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNaLGVBQU0sQ0FBQyxJQUFJLENBQUMsdURBQXVELENBQUMsQ0FBQTtRQUNwRSxPQUFNO0lBQ1IsQ0FBQztJQUVELElBQUksQ0FBQztRQUNILE1BQU0sUUFBUSxHQUFHLE1BQU0sS0FBSyxDQUFDLEdBQUcsTUFBTSxxQkFBcUIsRUFBRTtZQUMzRCxNQUFNLEVBQUUsS0FBSztZQUNiLE9BQU8sRUFBRTtnQkFDUCxlQUFlLEVBQUUsVUFBVSxNQUFNLEVBQUU7YUFDcEM7U0FDRixDQUFDLENBQUE7UUFFRixJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ2pCLE9BQU07UUFDUixDQUFDO1FBRUQsTUFBTSxNQUFNLEdBQUcsTUFBTSxRQUFRLENBQUMsSUFBSSxFQUEwQixDQUFBO1FBRTVELElBQUksQ0FBQyxNQUFNLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDNUIsMENBQTBDO1lBQzFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUE7WUFDZixlQUFNLENBQUMsSUFBSSxDQUFDLG1DQUFtQyxDQUFDLENBQUE7WUFDaEQsZUFBTSxDQUFDLElBQUksQ0FBQyx5QkFBeUIsR0FBRyxZQUFZLENBQUMsWUFBWSxHQUFHLGdCQUFnQixDQUFDLENBQUE7UUFDdkYsQ0FBQzthQUFNLElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUN0QyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFBO1lBQ2YsT0FBTyxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsZUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxJQUFJLFdBQVcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFBO1FBQy9GLENBQUM7YUFBTSxJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDdkMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQTtZQUNmLGVBQU0sQ0FBQyxJQUFJLENBQUMseUNBQXlDLENBQUMsQ0FBQTtZQUN0RCxlQUFNLENBQUMsSUFBSSxDQUFDLHVEQUF1RCxDQUFDLENBQUE7UUFDdEUsQ0FBQzthQUFNLElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxjQUFjLElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxrQkFBa0IsRUFBRSxDQUFDO1lBQ3BGLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUE7WUFDZixlQUFNLENBQUMsSUFBSSxDQUFDLDZEQUE2RCxDQUFDLENBQUE7UUFDNUUsQ0FBQztJQUVILENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxnREFBZ0Q7SUFDbEQsQ0FBQztBQUNILENBQUM7QUFFRDs7R0FFRztBQUNJLEtBQUssVUFBVSxNQUFNLENBQUMsT0FBc0I7SUFDakQsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFBO0lBQ2pDLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxHQUFHLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxjQUFjLElBQUksMkJBQWUsQ0FBQTtJQUUzRSxlQUFNLENBQUMsSUFBSSxDQUFDLDBCQUEwQixDQUFDLENBQUE7SUFFdkMsc0JBQXNCO0lBQ3RCLE1BQU0sVUFBVSxHQUFHLGNBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLFdBQVcsQ0FBQyxDQUFBO0lBQ3RELElBQUksQ0FBQyxrQkFBRSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO1FBQy9CLGVBQU0sQ0FBQyxLQUFLLENBQUMsMENBQTBDLENBQUMsQ0FBQTtRQUN4RCxlQUFNLENBQUMsSUFBSSxDQUFDLCtEQUErRCxDQUFDLENBQUE7UUFDNUUsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUNqQixDQUFDO0lBRUQsa0NBQWtDO0lBQ2xDLElBQUksTUFBMEUsQ0FBQTtJQUM5RSxJQUFJLENBQUM7UUFDSCxNQUFNLEdBQUcsTUFBTSxJQUFBLG1CQUFVLEVBQUMsV0FBVyxDQUFDLENBQUE7UUFDdEMsTUFBTSxVQUFVLEdBQUcsSUFBQSx1QkFBYyxFQUFDLE1BQU0sQ0FBQyxDQUFBO1FBRXpDLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDdEIsZUFBTSxDQUFDLEtBQUssQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFBO1lBQ2hELFVBQVUsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsZUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQTtZQUM1RCxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQ2pCLENBQUM7UUFFRCxlQUFNLENBQUMsT0FBTyxDQUFDLDBCQUEwQixNQUFNLENBQUMsSUFBSSxJQUFJLFVBQVUsRUFBRSxDQUFDLENBQUE7SUFDdkUsQ0FBQztJQUFDLE9BQU8sS0FBYyxFQUFFLENBQUM7UUFDeEIsTUFBTSxPQUFPLEdBQUcsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQ3RFLGVBQU0sQ0FBQyxLQUFLLENBQUMsaUNBQWlDLE9BQU8sRUFBRSxDQUFDLENBQUE7UUFDeEQsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUNqQixDQUFDO0lBRUQsb0NBQW9DO0lBQ3BDLE1BQU0sZ0JBQWdCLEdBQUcsY0FBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsY0FBYyxDQUFDLENBQUE7SUFDL0QsSUFBSSxZQUFZLEdBQXdCLElBQUksQ0FBQTtJQUM1QyxJQUFJLFlBQVksR0FBa0IsSUFBSSxDQUFBO0lBQ3RDLElBQUksY0FBYyxHQUFrQixJQUFJLENBQUE7SUFDeEMsSUFBSSxpQkFBaUIsR0FBa0IsSUFBSSxDQUFBO0lBRTNDLElBQUksa0JBQUUsQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDO1FBQ3BDLElBQUksQ0FBQztZQUNILFlBQVksR0FBRyxrQkFBRSxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBaUIsQ0FBQTtZQUNoRSxZQUFZLEdBQUcsWUFBWSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUE7WUFDeEMsY0FBYyxHQUFHLFlBQVksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFBO1lBQzVDLGlCQUFpQixHQUFHLFlBQVksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFBO1lBQ2xELElBQUksWUFBWSxJQUFJLGNBQWMsRUFBRSxDQUFDO2dCQUNuQyxlQUFNLENBQUMsSUFBSSxDQUFDLHNCQUFzQixZQUFZLEVBQUUsQ0FBQyxDQUFBO1lBQ25ELENBQUM7UUFDSCxDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1AscUNBQXFDO1FBQ3ZDLENBQUM7SUFDSCxDQUFDO0lBRUQscURBQXFEO0lBQ3JELElBQUksTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxjQUFjLElBQUksY0FBYyxDQUFBO0lBRTNFLCtFQUErRTtJQUMvRSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDWix1Q0FBdUM7UUFDdkMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDdkIsZUFBTSxDQUFDLEtBQUssQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFBO1lBQy9DLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUE7WUFDZixlQUFNLENBQUMsSUFBSSxDQUFDLG1EQUFtRCxDQUFDLENBQUE7WUFDaEUsZUFBTSxDQUFDLElBQUksQ0FBQyxvRUFBb0UsQ0FBQyxDQUFBO1lBQ2pGLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDakIsQ0FBQztRQUVELElBQUksbUJBQW1CLEdBQUcsaUJBQWlCLENBQUE7UUFDM0MsSUFBSSxVQUFVLEdBQUcsS0FBSyxDQUFBO1FBRXRCLGtEQUFrRDtRQUNsRCxPQUFPLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDbkIsZUFBTSxDQUFDLElBQUksQ0FBQyx5QkFBeUIsbUJBQW1CLGVBQWUsQ0FBQyxDQUFBO1lBRXhFLElBQUksQ0FBQztnQkFDSCxNQUFNLGdCQUFnQixHQUFHLE1BQU0sS0FBSyxDQUFDLEdBQUcsTUFBTSx3QkFBd0IsRUFBRTtvQkFDdEUsTUFBTSxFQUFFLE1BQU07b0JBQ2QsT0FBTyxFQUFFO3dCQUNQLGNBQWMsRUFBRSxrQkFBa0I7cUJBQ25DO29CQUNELElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDO3dCQUNuQixJQUFJLEVBQUUsWUFBWSxFQUFFLElBQUksSUFBSSxNQUFNLENBQUMsSUFBSSxJQUFJLGtCQUFrQjt3QkFDN0QsSUFBSSxFQUFFLG1CQUFtQjt3QkFDekIsU0FBUyxFQUFFLG1CQUFtQjtxQkFDL0IsQ0FBQztpQkFDSCxDQUFDLENBQUE7Z0JBRUYsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsRUFBRSxDQUFDO29CQUN6QixNQUFNLFNBQVMsR0FBRyxNQUFNLGdCQUFnQixDQUFDLElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLGVBQWUsRUFBRSxDQUFDLENBQXlDLENBQUE7b0JBQ2pJLE1BQU0sWUFBWSxHQUFHLFNBQVMsQ0FBQyxLQUFLLElBQUksUUFBUSxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsQ0FBQTtvQkFFekUsMkNBQTJDO29CQUMzQyxJQUFJLFlBQVksQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxZQUFZLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUM7d0JBQ3RGLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUE7d0JBQ2YsZUFBTSxDQUFDLElBQUksQ0FBQyxjQUFjLG1CQUFtQiwyQkFBMkIsQ0FBQyxDQUFBO3dCQUV6RSwwQkFBMEI7d0JBQzFCLE1BQU0sWUFBWSxHQUFHLE1BQU0sMEJBQTBCLENBQUMsbUJBQW1CLEVBQUUsTUFBTSxDQUFDLENBQUE7d0JBQ2xGLE1BQU0sVUFBVSxHQUFHLFlBQVksQ0FBQyxVQUFVLElBQUksR0FBRyxtQkFBbUIsT0FBTyxDQUFBO3dCQUUzRSxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFBO3dCQUNmLGVBQU0sQ0FBQyxJQUFJLENBQUMsZUFBZSxVQUFVLFlBQVksQ0FBQyxDQUFBO3dCQUNsRCxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFBO3dCQUVmLDJCQUEyQjt3QkFDM0IsSUFBSSxZQUFZLEdBQUcsTUFBTSxNQUFNLENBQUMsdUJBQXVCLEVBQUUsVUFBVSxDQUFDLENBQUE7d0JBQ3BFLFlBQVksR0FBRyxZQUFZLENBQUMsV0FBVyxFQUFFLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRSxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFBO3dCQUUzRixrQkFBa0I7d0JBQ2xCLE1BQU0sV0FBVyxHQUFHLHNCQUFzQixDQUFDLFlBQVksQ0FBQyxDQUFBO3dCQUN4RCxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxDQUFDOzRCQUN2QixlQUFNLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxLQUFNLENBQUMsQ0FBQTs0QkFDaEMsU0FBUTt3QkFDVixDQUFDO3dCQUVELG1CQUFtQixHQUFHLFlBQVksQ0FBQTt3QkFDbEMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQTt3QkFDZixTQUFRO29CQUNWLENBQUM7b0JBRUQsTUFBTSxJQUFJLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQTtnQkFDL0IsQ0FBQztnQkFFRCxNQUFNLGNBQWMsR0FBRyxNQUFNLGdCQUFnQixDQUFDLElBQUksRUFBc0IsQ0FBQTtnQkFFeEUsbUNBQW1DO2dCQUNuQyxNQUFNLEdBQUcsY0FBYyxDQUFDLE1BQU0sQ0FBQTtnQkFDOUIsWUFBWSxHQUFHLGNBQWMsQ0FBQyxJQUFJLENBQUE7Z0JBQ2xDLGlCQUFpQixHQUFHLGNBQWMsQ0FBQyxTQUFTLENBQUE7Z0JBRTVDLDBCQUEwQjtnQkFDMUIsTUFBTSxhQUFhLEdBQWlCO29CQUNsQyxHQUFHLFlBQVk7b0JBQ2YsU0FBUyxFQUFFLGNBQWMsQ0FBQyxTQUFTO29CQUNuQyxJQUFJLEVBQUUsY0FBYyxDQUFDLElBQUk7b0JBQ3pCLFNBQVMsRUFBRSxjQUFjLENBQUMsU0FBUztvQkFDbkMsTUFBTSxFQUFFLGNBQWMsQ0FBQyxNQUFNO29CQUM3QixHQUFHLEVBQUUsY0FBYyxDQUFDLEdBQUc7aUJBQ3hCLENBQUE7Z0JBQ0Qsa0JBQUUsQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLEVBQUUsYUFBYSxFQUFFLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUE7Z0JBRWhFLGVBQU0sQ0FBQyxPQUFPLENBQUMsZUFBZSxjQUFjLENBQUMsU0FBUyx3QkFBd0IsQ0FBQyxDQUFBO2dCQUMvRSxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFBO2dCQUNmLFVBQVUsR0FBRyxJQUFJLENBQUE7WUFFbkIsQ0FBQztZQUFDLE9BQU8sS0FBYyxFQUFFLENBQUM7Z0JBQ3hCLE1BQU0sT0FBTyxHQUFHLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQTtnQkFDdEUsZUFBTSxDQUFDLEtBQUssQ0FBQyxpQ0FBaUMsT0FBTyxFQUFFLENBQUMsQ0FBQTtnQkFDeEQsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQTtZQUNqQixDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRCw0QkFBNEI7SUFDNUIsZUFBTSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFBO0lBQ2xDLE1BQU0sS0FBSyxHQUFHLE1BQU0sWUFBWSxDQUFDLFdBQVcsQ0FBQyxDQUFBO0lBQzdDLGVBQU0sQ0FBQyxPQUFPLENBQUMsV0FBVyxLQUFLLENBQUMsTUFBTSxnQkFBZ0IsQ0FBQyxDQUFBO0lBRXZELHFCQUFxQjtJQUNyQixNQUFNLFNBQVMsR0FBRyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsQ0FBQTtJQUMvQyxJQUFJLFNBQVMsRUFBRSxDQUFDO1FBQ2QsZUFBTSxDQUFDLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFBO0lBQ3RDLENBQUM7SUFFRCxzREFBc0Q7SUFDdEQsTUFBTSxZQUFZLEdBQUcsTUFBTSxtQkFBbUIsQ0FBQyxXQUFXLEVBQUUsTUFBaUMsQ0FBQyxDQUFBO0lBQzlGLE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsTUFBTSxDQUFBO0lBQ2xELElBQUksU0FBUyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ2xCLGVBQU0sQ0FBQyxPQUFPLENBQUMsV0FBVyxTQUFTLGtCQUFrQixDQUFDLENBQUE7SUFDeEQsQ0FBQztJQUVELHdCQUF3QjtJQUN4QixNQUFNLE1BQU0sR0FBRyxNQUFNLGFBQWEsQ0FBQyxXQUFXLENBQUMsQ0FBQTtJQUMvQyxJQUFJLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDdEIsTUFBTSxjQUFjLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFBO1FBQ2pFLGVBQU0sQ0FBQyxPQUFPLENBQUMsV0FBVyxNQUFNLENBQUMsTUFBTSxZQUFZLFVBQVUsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUE7SUFDbkYsQ0FBQztJQUVELHdCQUF3QjtJQUN4QixNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFBO0lBQ3JFLE1BQU0sTUFBTSxHQUFHLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUM1QyxlQUFNLENBQUMsSUFBSSxDQUFDLG1CQUFtQixNQUFNLEtBQUssQ0FBQyxDQUFBO0lBRTNDLDZDQUE2QztJQUM3QyxJQUFJLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLFlBQVksSUFBSSxNQUFNLEVBQUUsQ0FBQztRQUNoRCxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFBO1FBQ2YsZUFBTSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFBO1FBRWxDLE1BQU0sWUFBWSxHQUFHLE1BQU0sWUFBWSxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLE1BQU0sQ0FBQyxDQUFBO1FBQzdFLE1BQU0sWUFBWSxHQUFHLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFBO1FBQy9ELE1BQU0sU0FBUyxHQUFHLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUE7UUFFN0QsSUFBSSxTQUFTLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDbEIsZUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLFlBQVkscUJBQXFCLFNBQVMsU0FBUyxDQUFDLENBQUE7UUFDckUsQ0FBQzthQUFNLElBQUksWUFBWSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzVCLGVBQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxZQUFZLGtCQUFrQixDQUFDLENBQUE7UUFDckQsQ0FBQztJQUNILENBQUM7U0FBTSxJQUFJLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDOUMsZUFBTSxDQUFDLElBQUksQ0FBQyxxRUFBcUUsQ0FBQyxDQUFBO0lBQ3BGLENBQUM7SUFFRCx3QkFBd0I7SUFDeEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQTtJQUNmLGVBQU0sQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsQ0FBQTtJQUVuQyxJQUFJLENBQUM7UUFZSCxNQUFNLE9BQU8sR0FBMkI7WUFDdEMsY0FBYyxFQUFFLGtCQUFrQjtTQUNuQyxDQUFBO1FBRUQsaUNBQWlDO1FBQ2pDLElBQUksTUFBTSxFQUFFLENBQUM7WUFDWCxPQUFPLENBQUMsZUFBZSxDQUFDLEdBQUcsVUFBVSxNQUFNLEVBQUUsQ0FBQTtRQUMvQyxDQUFDO1FBRUQsTUFBTSxRQUFRLEdBQUcsTUFBTSxLQUFLLENBQUMsR0FBRyxNQUFNLGFBQWEsRUFBRTtZQUNuRCxNQUFNLEVBQUUsTUFBTTtZQUNkLE9BQU87WUFDUCxRQUFRLEVBQUUsUUFBUSxFQUFFLG1CQUFtQjtZQUN2QyxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQztnQkFDbkIsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLElBQUksa0JBQWtCO2dCQUN2QyxJQUFJLEVBQUUsWUFBWTtnQkFDbEIsUUFBUSxFQUFFLE1BQU07Z0JBQ2hCLFNBQVM7Z0JBQ1QsWUFBWTtnQkFDWixLQUFLO2dCQUNMLE1BQU0sRUFBRSxnQ0FBZ0M7YUFDekMsQ0FBQztTQUNILENBQUMsQ0FBQTtRQUVGLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDakIsTUFBTSxTQUFTLEdBQUcsTUFBTSxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsZUFBZSxFQUFFLENBQUMsQ0FBeUMsQ0FBQTtZQUN6SCxNQUFNLFlBQVksR0FBRyxTQUFTLENBQUMsS0FBSyxJQUFJLFFBQVEsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFBO1lBQ2pFLE1BQU0sT0FBTyxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixTQUFTLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQTtZQUM3RSxNQUFNLElBQUksS0FBSyxDQUFDLEdBQUcsWUFBWSxHQUFHLE9BQU8sRUFBRSxDQUFDLENBQUE7UUFDOUMsQ0FBQztRQUVELE1BQU0sTUFBTSxHQUFHLE1BQU0sUUFBUSxDQUFDLElBQUksRUFBb0IsQ0FBQTtRQUV0RCx5Q0FBeUM7UUFDekMsTUFBTSxlQUFlLEdBQWlCO1lBQ3BDLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSTtZQUNqQixHQUFHLEVBQUUsTUFBTSxDQUFDLEdBQUc7WUFDZixZQUFZLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUU7U0FDdkMsQ0FBQTtRQUVELHlFQUF5RTtRQUN6RSxJQUFJLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNsQixlQUFlLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUE7UUFDeEMsQ0FBQzthQUFNLElBQUksTUFBTSxFQUFFLENBQUM7WUFDbEIsZUFBZSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUE7UUFDakMsQ0FBQztRQUVELGtCQUFFLENBQUMsYUFBYSxDQUFDLGdCQUFnQixFQUFFLGVBQWUsRUFBRSxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFBO1FBRWxFLGtCQUFrQjtRQUNsQixPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFBO1FBQ2YsZUFBTSxDQUFDLE9BQU8sQ0FBQyx3QkFBd0IsQ0FBQyxDQUFBO1FBQ3hDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUE7UUFDZixPQUFPLENBQUMsR0FBRyxDQUFDLDBCQUEwQixDQUFDLENBQUE7UUFDdkMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLGVBQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQTtRQUMzQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFBO1FBRWYsSUFBSSxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDcEIsZUFBTSxDQUFDLElBQUksQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFBO1FBQ2pELENBQUM7YUFBTSxDQUFDO1lBQ04sZUFBTSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUE7WUFDM0MsZUFBTSxDQUFDLElBQUksQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFBO1lBRWxELHdDQUF3QztZQUN4QyxJQUFJLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDbEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQTtnQkFDZixlQUFNLENBQUMsSUFBSSxDQUFDLDhDQUE4QyxDQUFDLENBQUE7Z0JBQzNELE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQTtnQkFDbkMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQTtnQkFDZixlQUFNLENBQUMsSUFBSSxDQUFDLG9EQUFvRCxDQUFDLENBQUE7WUFDbkUsQ0FBQztRQUNILENBQUM7UUFFRCxzREFBc0Q7UUFDdEQsTUFBTSx1QkFBdUIsQ0FBQyxXQUFXLEVBQUUsTUFBTSxFQUFFLE1BQU0sSUFBSSxNQUFNLENBQUMsTUFBTSxJQUFJLEVBQUUsQ0FBQyxDQUFBO0lBRW5GLENBQUM7SUFBQyxPQUFPLEtBQWMsRUFBRSxDQUFDO1FBQ3hCLE1BQU0sT0FBTyxHQUFHLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUN0RSxlQUFNLENBQUMsS0FBSyxDQUFDLHNCQUFzQixPQUFPLEVBQUUsQ0FBQyxDQUFBO1FBQzdDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDakIsQ0FBQztBQUNILENBQUM7QUFFRDs7R0FFRztBQUNILEtBQUssVUFBVSxtQkFBbUIsQ0FDaEMsV0FBbUIsRUFDbkIsUUFBaUM7SUFFakMsTUFBTSxLQUFLLEdBQWdDLEVBQUUsQ0FBQTtJQUU3QyxxRUFBcUU7SUFDckUsTUFBTSxVQUFVLEdBQUcsUUFBUSxDQUFDLFVBQW9HLENBQUE7SUFDaEksSUFBSSxDQUFDLFVBQVU7UUFBRSxPQUFPLEtBQUssQ0FBQTtJQUU3Qix1REFBdUQ7SUFDdkQsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLENBQUE7SUFFN0UsS0FBSyxNQUFNLElBQUksSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUN4QixrQ0FBa0M7UUFDbEMsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQzVCLDBEQUEwRDtZQUMxRCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBZ0UsQ0FBQTtZQUV0RixJQUFJLFFBQVEsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7Z0JBQ3hDLHlCQUF5QjtnQkFDekIsS0FBSyxNQUFNLE9BQU8sSUFBSSxRQUFRLEVBQUUsQ0FBQztvQkFDL0IsSUFBSSxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7d0JBQ2pCLE1BQU0sUUFBUSxDQUFDLFdBQVcsRUFBRSxPQUFPLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFBO29CQUNsRCxDQUFDO2dCQUNILENBQUM7WUFDSCxDQUFDO2lCQUFNLElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUNyQiwrQkFBK0I7Z0JBQy9CLE1BQU0sUUFBUSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsSUFBYyxFQUFFLEtBQUssQ0FBQyxDQUFBO1lBQ3pELENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sS0FBSyxDQUFBO0FBQ2QsQ0FBQztBQUVEOztHQUVHO0FBQ0gsS0FBSyxVQUFVLFFBQVEsQ0FDckIsV0FBbUIsRUFDbkIsUUFBZ0IsRUFDaEIsS0FBa0M7SUFFbEMsaURBQWlEO0lBQ2pELElBQUksWUFBWSxHQUFHLGNBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLFFBQVEsQ0FBQyxDQUFBO0lBRW5ELHFEQUFxRDtJQUNyRCxJQUFJLFFBQVEsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUM5QixZQUFZLEdBQUcsY0FBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQzFELENBQUM7SUFFRCxJQUFJLGtCQUFFLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUM7UUFDaEMsSUFBSSxDQUFDO1lBQ0gsTUFBTSxXQUFXLEdBQUcsa0JBQUUsQ0FBQyxZQUFZLENBQUMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxDQUFBO1lBQzFELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFnQixDQUFBO1lBQ3ZELEtBQUssQ0FBQyxRQUFRLENBQUMsR0FBRyxRQUFRLENBQUE7WUFDMUIsZUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLFFBQVEsRUFBRSxDQUFDLENBQUE7UUFDaEMsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixNQUFNLE9BQU8sR0FBRyxLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUE7WUFDdEUsZUFBTSxDQUFDLElBQUksQ0FBQyxnQ0FBZ0MsUUFBUSxLQUFLLE9BQU8sRUFBRSxDQUFDLENBQUE7UUFDckUsQ0FBQztJQUNILENBQUM7U0FBTSxDQUFDO1FBQ04sZUFBTSxDQUFDLElBQUksQ0FBQyxnQ0FBZ0MsUUFBUSxFQUFFLENBQUMsQ0FBQTtJQUN6RCxDQUFDO0FBQ0gsQ0FBQztBQUVEOztHQUVHO0FBQ0gsU0FBUyxnQkFBZ0IsQ0FBQyxXQUFtQjtJQUMzQyxNQUFNLFNBQVMsR0FBRyxjQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxZQUFZLENBQUMsQ0FBQTtJQUV0RCxJQUFJLGtCQUFFLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7UUFDN0IsSUFBSSxDQUFDO1lBQ0gsTUFBTSxZQUFZLEdBQUcsa0JBQUUsQ0FBQyxZQUFZLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFBO1lBQ3hELE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQVcsQ0FBQTtRQUMzQyxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLE1BQU0sT0FBTyxHQUFHLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQTtZQUN0RSxlQUFNLENBQUMsSUFBSSxDQUFDLCtCQUErQixPQUFPLEVBQUUsQ0FBQyxDQUFBO1FBQ3ZELENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTyxTQUFTLENBQUE7QUFDbEIsQ0FBQztBQUVEOztHQUVHO0FBQ0gsS0FBSyxVQUFVLFlBQVksQ0FBQyxXQUFtQjtJQUM3QyxNQUFNLEtBQUssR0FBa0IsRUFBRSxDQUFBO0lBRS9CLGlFQUFpRTtJQUNqRSxNQUFNLEtBQUssR0FBRyxrQkFBRSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsQ0FBQTtJQUV6QyxLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssRUFBRSxDQUFDO1FBQ3pCLG9EQUFvRDtRQUNwRCxJQUFJO1lBQ0YsY0FBYztZQUNkLE1BQU07WUFDTixPQUFPO1lBQ1AsTUFBTTtZQUNOLFFBQVE7WUFDUixTQUFTO1lBQ1QsU0FBUztZQUNULFNBQVM7U0FDVixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ2pCLFNBQVE7UUFDVixDQUFDO1FBRUQsTUFBTSxRQUFRLEdBQUcsY0FBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLENBQUE7UUFDN0MsTUFBTSxJQUFJLEdBQUcsa0JBQUUsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUE7UUFFbEMsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQztZQUN2QiwyREFBMkQ7WUFDM0QsSUFBSSxJQUFJLEtBQUssUUFBUTtnQkFBRSxTQUFRO1lBQy9CLE1BQU0sYUFBYSxDQUFDLFFBQVEsRUFBRSxXQUFXLEVBQUUsS0FBSyxDQUFDLENBQUE7UUFDbkQsQ0FBQzthQUFNLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDekQsK0JBQStCO1lBQy9CLE1BQU0sT0FBTyxHQUFHLGtCQUFFLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQTtZQUNsRCxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFBO1FBQ3JDLENBQUM7YUFBTSxJQUFJLElBQUksS0FBSyxXQUFXLElBQUksSUFBSSxLQUFLLFlBQVksSUFBSSxJQUFJLEtBQUssYUFBYSxJQUFJLElBQUksS0FBSyxZQUFZLEVBQUUsQ0FBQztZQUM1Ryx1QkFBdUI7WUFDdkIsTUFBTSxPQUFPLEdBQUcsa0JBQUUsQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFBO1lBQ2xELEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUE7UUFDckMsQ0FBQztJQUNILENBQUM7SUFFRCwyREFBMkQ7SUFDM0QsTUFBTSxTQUFTLEdBQUcsY0FBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsUUFBUSxDQUFDLENBQUE7SUFDbEQsSUFBSSxrQkFBRSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1FBQzdCLE1BQU0sZ0JBQWdCLENBQUMsU0FBUyxFQUFFLFdBQVcsRUFBRSxLQUFLLENBQUMsQ0FBQTtJQUN2RCxDQUFDO0lBRUQsT0FBTyxLQUFLLENBQUE7QUFDZCxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxLQUFLLFVBQVUsYUFBYSxDQUMxQixHQUFXLEVBQ1gsV0FBbUIsRUFDbkIsS0FBb0I7SUFFcEIsTUFBTSxLQUFLLEdBQUcsa0JBQUUsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUE7SUFFakMsS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUN6QiwwQkFBMEI7UUFDMUIsSUFBSSxDQUFDLGNBQWMsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUN2RSxTQUFRO1FBQ1YsQ0FBQztRQUVELE1BQU0sUUFBUSxHQUFHLGNBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFBO1FBQ3JDLE1BQU0sSUFBSSxHQUFHLGtCQUFFLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBRWxDLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUM7WUFDdkIsTUFBTSxhQUFhLENBQUMsUUFBUSxFQUFFLFdBQVcsRUFBRSxLQUFLLENBQUMsQ0FBQTtRQUNuRCxDQUFDO2FBQU0sSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUN6RCxNQUFNLFlBQVksR0FBRyxjQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxRQUFRLENBQUMsQ0FBQTtZQUN6RCxNQUFNLE9BQU8sR0FBRyxrQkFBRSxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUE7WUFFbEQsS0FBSyxDQUFDLElBQUksQ0FBQztnQkFDVCxJQUFJLEVBQUUsWUFBWTtnQkFDbEIsT0FBTzthQUNSLENBQUMsQ0FBQTtRQUNKLENBQUM7SUFDSCxDQUFDO0FBQ0gsQ0FBQztBQUVEOztHQUVHO0FBQ0gsS0FBSyxVQUFVLGdCQUFnQixDQUM3QixHQUFXLEVBQ1gsV0FBbUIsRUFDbkIsS0FBb0I7SUFFcEIsTUFBTSxLQUFLLEdBQUcsa0JBQUUsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUE7SUFFakMsMERBQTBEO0lBQzFELE1BQU0sZUFBZSxHQUFHLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQTtJQUVqRCxLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssRUFBRSxDQUFDO1FBQ3pCLE1BQU0sUUFBUSxHQUFHLGNBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFBO1FBQ3JDLE1BQU0sSUFBSSxHQUFHLGtCQUFFLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBRWxDLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUM7WUFDdkIsTUFBTSxnQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsV0FBVyxFQUFFLEtBQUssQ0FBQyxDQUFBO1FBQ3RELENBQUM7YUFBTSxDQUFDO1lBQ04sTUFBTSxHQUFHLEdBQUcsY0FBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQTtZQUM1QyxJQUFJLGVBQWUsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDbEMsbURBQW1EO2dCQUNuRCxNQUFNLFlBQVksR0FBRyxjQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxRQUFRLENBQUMsQ0FBQTtnQkFDekQsTUFBTSxPQUFPLEdBQUcsa0JBQUUsQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFBO2dCQUVsRCxLQUFLLENBQUMsSUFBSSxDQUFDO29CQUNULElBQUksRUFBRSxZQUFZO29CQUNsQixPQUFPO2lCQUNSLENBQUMsQ0FBQTtZQUNKLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztBQUNILENBQUM7QUFFRDs7R0FFRztBQUNILEtBQUssVUFBVSxhQUFhLENBQUMsV0FBbUI7SUFDOUMsTUFBTSxNQUFNLEdBQWdCLEVBQUUsQ0FBQTtJQUU5QixzQkFBc0I7SUFDdEIsTUFBTSxTQUFTLEdBQUcsY0FBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsUUFBUSxDQUFDLENBQUE7SUFDbEQsSUFBSSxrQkFBRSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1FBQzdCLE1BQU0sZ0JBQWdCLENBQUMsU0FBUyxFQUFFLFdBQVcsRUFBRSxNQUFNLENBQUMsQ0FBQTtJQUN4RCxDQUFDO0lBRUQsT0FBTyxNQUFNLENBQUE7QUFDZixDQUFDO0FBRUQ7O0dBRUc7QUFDSCxLQUFLLFVBQVUsZ0JBQWdCLENBQzdCLEdBQVcsRUFDWCxXQUFtQixFQUNuQixNQUFtQjtJQUVuQixNQUFNLEtBQUssR0FBRyxrQkFBRSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQTtJQUVqQyxLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssRUFBRSxDQUFDO1FBQ3pCLE1BQU0sUUFBUSxHQUFHLGNBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFBO1FBQ3JDLE1BQU0sSUFBSSxHQUFHLGtCQUFFLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBRWxDLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUM7WUFDdkIsTUFBTSxnQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsV0FBVyxFQUFFLE1BQU0sQ0FBQyxDQUFBO1FBQ3ZELENBQUM7YUFBTSxDQUFDO1lBQ04sTUFBTSxHQUFHLEdBQUcsY0FBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQTtZQUM1QyxJQUFJLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUNwQyxtQkFBbUI7Z0JBQ25CLElBQUksSUFBSSxDQUFDLElBQUksR0FBRyxjQUFjLEVBQUUsQ0FBQztvQkFDL0IsZUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLElBQUkseUJBQXlCLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFBO29CQUM5RSxTQUFRO2dCQUNWLENBQUM7Z0JBRUQsTUFBTSxZQUFZLEdBQUcsY0FBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsUUFBUSxDQUFDLENBQUE7Z0JBQ3pELE1BQU0sQ0FBQyxJQUFJLENBQUM7b0JBQ1YsSUFBSSxFQUFFLFlBQVk7b0JBQ2xCLFFBQVE7b0JBQ1IsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO2lCQUNoQixDQUFDLENBQUE7WUFDSixDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7QUFDSCxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxLQUFLLFVBQVUsWUFBWSxDQUN6QixNQUFtQixFQUNuQixNQUFjLEVBQ2QsSUFBWSxFQUNaLE1BQWM7SUFFZCxNQUFNLE9BQU8sR0FBNEUsRUFBRSxDQUFBO0lBRTNGLEtBQUssTUFBTSxLQUFLLElBQUksTUFBTSxFQUFFLENBQUM7UUFDM0IsTUFBTSxRQUFRLEdBQUcsY0FBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUE7UUFFMUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxRQUFRLElBQUksQ0FBQyxDQUFBO1FBRXZDLElBQUksQ0FBQztZQUNILE1BQU0sTUFBTSxHQUFHLE1BQU0sdUJBQXVCLENBQzFDLEtBQUssRUFDTCxNQUFNLEVBQ04sSUFBSSxFQUNKLE1BQU0sRUFDTixDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEVBQUU7Z0JBQzFCLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztvQkFDekIsT0FBTyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUE7b0JBQzNCLE9BQU8sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFBO29CQUMxQixPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLFFBQVEsS0FBSyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsSUFBSSxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksVUFBVSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQTtnQkFDbEgsQ0FBQztZQUNILENBQUMsQ0FDRixDQUFBO1lBRUQsSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUN6QixPQUFPLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtnQkFDM0IsT0FBTyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUE7WUFDNUIsQ0FBQztZQUNELE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxlQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLFFBQVEsS0FBSyxVQUFVLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQTtZQUU3RSxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQTtRQUNsRSxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLE1BQU0sT0FBTyxHQUFHLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQTtZQUV0RSxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ3pCLE9BQU8sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFBO2dCQUMzQixPQUFPLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQTtZQUM1QixDQUFDO1lBQ0QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLGVBQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksUUFBUSxLQUFLLE9BQU8sRUFBRSxDQUFDLENBQUE7WUFFM0QsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQTtRQUNsRSxDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sT0FBTyxDQUFBO0FBQ2hCLENBQUM7QUFFRDs7R0FFRztBQUNILEtBQUssVUFBVSx1QkFBdUIsQ0FDcEMsS0FBZ0IsRUFDaEIsTUFBYyxFQUNkLElBQVksRUFDWixNQUFjLEVBQ2QsVUFBcUU7SUFFckUsTUFBTSxVQUFVLEdBQUcsa0JBQUUsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBQ2xELE1BQU0sUUFBUSxHQUFHLGNBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFBO0lBQzFDLE1BQU0sUUFBUSxHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUE7SUFFNUMsNEJBQTRCO0lBQzVCLE1BQU0sUUFBUSxHQUFHLG1CQUFtQixJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQTtJQUNoRCxNQUFNLElBQUksR0FBRyxNQUFNLENBQUE7SUFFbkIsTUFBTSxNQUFNLEdBQUc7UUFDYixLQUFLLFFBQVEsRUFBRTtRQUNmLDBEQUEwRCxRQUFRLEdBQUc7UUFDckUsaUJBQWlCLFFBQVEsRUFBRTtRQUMzQixFQUFFO1FBQ0YsRUFBRTtLQUNILENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFBO0lBRVosTUFBTSxRQUFRLEdBQUc7UUFDZixFQUFFO1FBQ0YsS0FBSyxRQUFRLEVBQUU7UUFDZiw2Q0FBNkM7UUFDN0MsRUFBRTtRQUNGLElBQUk7UUFDSixFQUFFO0tBQ0gsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7SUFFWixNQUFNLFFBQVEsR0FBRztRQUNmLEtBQUssUUFBUSxFQUFFO1FBQ2YsNkNBQTZDO1FBQzdDLEVBQUU7UUFDRixLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLEVBQUUsd0JBQXdCO1FBQzdELEVBQUU7S0FDSCxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUVaLE1BQU0sTUFBTSxHQUFHLEdBQUcsSUFBSSxLQUFLLFFBQVEsS0FBSyxJQUFJLEVBQUUsQ0FBQTtJQUU5QyxNQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBQ3hDLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUE7SUFDeEMsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQTtJQUN4QyxNQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBRXhDLE1BQU0sU0FBUyxHQUFHLFlBQVksQ0FBQyxNQUFNLEdBQUcsVUFBVSxDQUFDLE1BQU0sR0FBRyxVQUFVLENBQUMsTUFBTSxHQUFHLFVBQVUsQ0FBQyxNQUFNLEdBQUcsWUFBWSxDQUFDLE1BQU0sQ0FBQTtJQUN2SCxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsWUFBWSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUE7SUFFNUYsb0JBQW9CO0lBQ3BCLElBQUksUUFBUSxHQUFHLENBQUMsQ0FBQTtJQUNoQixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUMsQ0FBQTtJQUUzQyxNQUFNLGdCQUFnQixHQUFHLFdBQVcsQ0FBQyxHQUFHLEVBQUU7UUFDeEMsSUFBSSxRQUFRLEdBQUcsU0FBUyxHQUFHLEdBQUcsRUFBRSxDQUFDO1lBQy9CLFFBQVEsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsR0FBRyxTQUFTLEVBQUUsU0FBUyxHQUFHLEdBQUcsQ0FBQyxDQUFBO1lBQzFELFVBQVUsQ0FBQyxRQUFRLEdBQUcsU0FBUyxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQTtRQUN2RCxDQUFDO0lBQ0gsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFBO0lBRU4sSUFBSSxDQUFDO1FBQ0gsTUFBTSxRQUFRLEdBQUcsTUFBTSxLQUFLLENBQUMsR0FBRyxNQUFNLG9CQUFvQixFQUFFO1lBQzFELE1BQU0sRUFBRSxNQUFNO1lBQ2QsT0FBTyxFQUFFO2dCQUNQLGNBQWMsRUFBRSxpQ0FBaUMsUUFBUSxFQUFFO2dCQUMzRCxlQUFlLEVBQUUsVUFBVSxNQUFNLEVBQUU7YUFDcEM7WUFDRCxJQUFJO1NBQ0wsQ0FBQyxDQUFBO1FBRUYsYUFBYSxDQUFDLGdCQUFnQixDQUFDLENBQUE7UUFDL0IsVUFBVSxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsU0FBUyxDQUFDLENBQUE7UUFFbkMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNqQixNQUFNLEtBQUssR0FBRyxNQUFNLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxlQUFlLEVBQUUsQ0FBQyxDQUF1QixDQUFBO1lBQ25HLE1BQU0sSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLEtBQUssSUFBSSxRQUFRLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFBO1FBQzNELENBQUM7UUFFRCxNQUFNLE1BQU0sR0FBRyxNQUFNLFFBQVEsQ0FBQyxJQUFJLEVBQXFCLENBQUE7UUFDdkQsT0FBTyxNQUFNLENBQUE7SUFDZixDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNmLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFBO1FBQy9CLE1BQU0sS0FBSyxDQUFBO0lBQ2IsQ0FBQztBQUNILENBQUM7QUFFRDs7R0FFRztBQUNILFNBQVMsVUFBVSxDQUFDLEtBQWE7SUFDL0IsSUFBSSxLQUFLLEdBQUcsSUFBSTtRQUFFLE9BQU8sR0FBRyxLQUFLLElBQUksQ0FBQTtJQUNyQyxJQUFJLEtBQUssR0FBRyxJQUFJLEdBQUcsSUFBSTtRQUFFLE9BQU8sR0FBRyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQTtJQUNqRSxPQUFPLEdBQUcsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQTtBQUNuRCxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxTQUFTLGlCQUFpQixDQUFDLFFBQWdCLEVBQUUsUUFBZ0IsRUFBRTtJQUM3RCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUMsQ0FBQTtJQUMzQyxNQUFNLEtBQUssR0FBRyxLQUFLLEdBQUcsTUFBTSxDQUFBO0lBQzVCLE1BQU0sR0FBRyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUNsRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsR0FBRyxHQUFHLENBQUMsQ0FBQTtJQUM3QyxPQUFPLElBQUksR0FBRyxLQUFLLFVBQVUsR0FBRyxDQUFBO0FBQ2xDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgcGF0aCBmcm9tICdwYXRoJ1xuaW1wb3J0IGZzIGZyb20gJ2ZzLWV4dHJhJ1xuaW1wb3J0IHsgbG9hZENvbmZpZywgdmFsaWRhdGVDb25maWcgfSBmcm9tICcuLi8uLi9jb25maWcnXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi8uLi91dGlscy9sb2dnZXInXG5pbXBvcnQgeyBERUZBVUxUX0FQSV9VUkwgfSBmcm9tICcuLi8uLi9jb25zdGFudHMnXG5cbi8vIE1heCBhc3NldCBzaXplOiAyNU1CXG5jb25zdCBNQVhfQVNTRVRfU0laRSA9IDI1ICogMTAyNCAqIDEwMjRcblxuLy8gQmluYXJ5IGFzc2V0IGV4dGVuc2lvbnMgdG8gdXBsb2FkIHNlcGFyYXRlbHlcbmNvbnN0IEJJTkFSWV9FWFRFTlNJT05TID0gW1xuICAnLnBuZycsICcuanBnJywgJy5qcGVnJywgJy5naWYnLCAnLndlYnAnLCAnLmljbycsXG4gICcubXA0JywgJy53ZWJtJywgJy5tb3YnLFxuICAnLm1wMycsICcud2F2JywgJy5vZ2cnLFxuICAnLndvZmYnLCAnLndvZmYyJywgJy50dGYnLCAnLm90ZicsICcuZW90JyxcbiAgJy5wZGYnLFxuXVxuXG4vLyBNYXAgZmlsZSBleHRlbnNpb25zIHRvIE1JTUUgdHlwZXNcbmNvbnN0IE1JTUVfVFlQRVM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gIC8vIEltYWdlc1xuICAnLnBuZyc6ICdpbWFnZS9wbmcnLFxuICAnLmpwZyc6ICdpbWFnZS9qcGVnJyxcbiAgJy5qcGVnJzogJ2ltYWdlL2pwZWcnLFxuICAnLmdpZic6ICdpbWFnZS9naWYnLFxuICAnLndlYnAnOiAnaW1hZ2Uvd2VicCcsXG4gICcuaWNvJzogJ2ltYWdlL3gtaWNvbicsXG4gICcuc3ZnJzogJ2ltYWdlL3N2Zyt4bWwnLFxuICAvLyBWaWRlb3NcbiAgJy5tcDQnOiAndmlkZW8vbXA0JyxcbiAgJy53ZWJtJzogJ3ZpZGVvL3dlYm0nLFxuICAnLm1vdic6ICd2aWRlby9xdWlja3RpbWUnLFxuICAvLyBBdWRpb1xuICAnLm1wMyc6ICdhdWRpby9tcGVnJyxcbiAgJy53YXYnOiAnYXVkaW8vd2F2JyxcbiAgJy5vZ2cnOiAnYXVkaW8vb2dnJyxcbiAgLy8gRm9udHNcbiAgJy53b2ZmJzogJ2ZvbnQvd29mZicsXG4gICcud29mZjInOiAnZm9udC93b2ZmMicsXG4gICcudHRmJzogJ2ZvbnQvdHRmJyxcbiAgJy5vdGYnOiAnZm9udC9vdGYnLFxuICAnLmVvdCc6ICdhcHBsaWNhdGlvbi92bmQubXMtZm9udG9iamVjdCcsXG4gIC8vIERvY3VtZW50c1xuICAnLnBkZic6ICdhcHBsaWNhdGlvbi9wZGYnLFxufVxuXG4vKipcbiAqIEdldCBNSU1FIHR5cGUgZnJvbSBmaWxlIGV4dGVuc2lvblxuICovXG5mdW5jdGlvbiBnZXRNaW1lVHlwZShmaWxlUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgZXh0ID0gcGF0aC5leHRuYW1lKGZpbGVQYXRoKS50b0xvd2VyQ2FzZSgpXG4gIHJldHVybiBNSU1FX1RZUEVTW2V4dF0gfHwgJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSdcbn1cblxuaW50ZXJmYWNlIERlcGxveU9wdGlvbnMge1xuICB1cmw/OiBzdHJpbmdcbiAgYXBpS2V5Pzogc3RyaW5nXG59XG5cbmludGVyZmFjZSBQcm9qZWN0RmlsZSB7XG4gIHBhdGg6IHN0cmluZ1xuICBjb250ZW50OiBzdHJpbmdcbn1cblxuaW50ZXJmYWNlIE9wZW5BcGlTcGVjIHtcbiAgW2tleTogc3RyaW5nXTogdW5rbm93blxufVxuXG5pbnRlcmZhY2UgQXNzZXRGaWxlIHtcbiAgcGF0aDogc3RyaW5nXG4gIGZ1bGxQYXRoOiBzdHJpbmdcbiAgc2l6ZTogbnVtYmVyXG59XG5cbmludGVyZmFjZSBEZXZEb2NDb25maWcge1xuICBwcm9qZWN0SWQ/OiBzdHJpbmdcbiAgbmFtZT86IHN0cmluZ1xuICBzbHVnPzogc3RyaW5nXG4gIHN1YmRvbWFpbj86IHN0cmluZ1xuICBhcGlLZXk/OiBzdHJpbmdcbiAgdXJsPzogc3RyaW5nXG4gIGxhc3REZXBsb3llZD86IHN0cmluZ1xuICBjcmVhdGVkQXQ/OiBzdHJpbmdcbn1cblxuaW50ZXJmYWNlIFJlZ2lzdGVyUmVzcG9uc2Uge1xuICBzdWNjZXNzOiBib29sZWFuXG4gIHByb2plY3RJZDogc3RyaW5nXG4gIHNsdWc6IHN0cmluZ1xuICBzdWJkb21haW46IHN0cmluZ1xuICBhcGlLZXk6IHN0cmluZ1xuICB1cmw6IHN0cmluZ1xuICBlcnJvcj86IHN0cmluZ1xufVxuXG5pbnRlcmZhY2UgQ2hlY2tTdWJkb21haW5SZXNwb25zZSB7XG4gIGF2YWlsYWJsZTogYm9vbGVhblxuICBlcnJvcj86IHN0cmluZ1xuICBzdWdnZXN0aW9uPzogc3RyaW5nXG59XG5cbi8vIFNpbXBsZSBwcm9tcHQgaGVscGVyIHVzaW5nIHJlYWRsaW5lXG5hc3luYyBmdW5jdGlvbiBwcm9tcHQocXVlc3Rpb246IHN0cmluZywgZGVmYXVsdFZhbHVlPzogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgcmVhZGxpbmUgPSBhd2FpdCBpbXBvcnQoJ3JlYWRsaW5lJylcbiAgY29uc3QgcmwgPSByZWFkbGluZS5jcmVhdGVJbnRlcmZhY2Uoe1xuICAgIGlucHV0OiBwcm9jZXNzLnN0ZGluLFxuICAgIG91dHB1dDogcHJvY2Vzcy5zdGRvdXQsXG4gIH0pXG5cbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgY29uc3QgZGVmYXVsdEhpbnQgPSBkZWZhdWx0VmFsdWUgPyBgICgke2RlZmF1bHRWYWx1ZX0pYCA6ICcnXG4gICAgcmwucXVlc3Rpb24oYCR7cXVlc3Rpb259JHtkZWZhdWx0SGludH06IGAsIChhbnN3ZXIpID0+IHtcbiAgICAgIHJsLmNsb3NlKClcbiAgICAgIHJlc29sdmUoYW5zd2VyLnRyaW0oKSB8fCBkZWZhdWx0VmFsdWUgfHwgJycpXG4gICAgfSlcbiAgfSlcbn1cblxuLyoqXG4gKiBDaGVjayBzdWJkb21haW4gYXZhaWxhYmlsaXR5IHZpYSBBUElcbiAqL1xuYXN5bmMgZnVuY3Rpb24gY2hlY2tTdWJkb21haW5BdmFpbGFiaWxpdHkoXG4gIHN1YmRvbWFpbjogc3RyaW5nLFxuICBhcGlVcmw6IHN0cmluZ1xuKTogUHJvbWlzZTxDaGVja1N1YmRvbWFpblJlc3BvbnNlPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgJHthcGlVcmx9L2FwaS9zdWJkb21haW5zL2NoZWNrYCwge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBzdWJkb21haW4gfSksXG4gICAgfSlcbiAgICBcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXNwb25zZS5qc29uKCkgYXMgQ2hlY2tTdWJkb21haW5SZXNwb25zZVxuICAgIHJldHVybiByZXN1bHRcbiAgfSBjYXRjaCB7XG4gICAgLy8gSWYgQVBJIGlzIHVuYXZhaWxhYmxlLCBhc3N1bWUgYXZhaWxhYmxlICh3aWxsIGZhaWwgYXQgcmVnaXN0cmF0aW9uIGlmIG5vdClcbiAgICByZXR1cm4geyBhdmFpbGFibGU6IHRydWUgfVxuICB9XG59XG5cbi8qKlxuICogQmFzaWMgc3ViZG9tYWluIGZvcm1hdCB2YWxpZGF0aW9uXG4gKi9cbmZ1bmN0aW9uIGlzVmFsaWRTdWJkb21haW5Gb3JtYXQoc3ViZG9tYWluOiBzdHJpbmcpOiB7IHZhbGlkOiBib29sZWFuOyBlcnJvcj86IHN0cmluZyB9IHtcbiAgaWYgKCFzdWJkb21haW4pIHtcbiAgICByZXR1cm4geyB2YWxpZDogZmFsc2UsIGVycm9yOiAnU3ViZG9tYWluIGlzIHJlcXVpcmVkJyB9XG4gIH1cbiAgXG4gIGlmIChzdWJkb21haW4ubGVuZ3RoIDwgMykge1xuICAgIHJldHVybiB7IHZhbGlkOiBmYWxzZSwgZXJyb3I6ICdTdWJkb21haW4gbXVzdCBiZSBhdCBsZWFzdCAzIGNoYXJhY3RlcnMnIH1cbiAgfVxuICBcbiAgaWYgKHN1YmRvbWFpbi5sZW5ndGggPiA2Mykge1xuICAgIHJldHVybiB7IHZhbGlkOiBmYWxzZSwgZXJyb3I6ICdTdWJkb21haW4gbXVzdCBiZSA2MyBjaGFyYWN0ZXJzIG9yIGxlc3MnIH1cbiAgfVxuICBcbiAgaWYgKCEvXlthLXowLTldKFthLXowLTktXSpbYS16MC05XSk/JC8udGVzdChzdWJkb21haW4pKSB7XG4gICAgcmV0dXJuIHsgdmFsaWQ6IGZhbHNlLCBlcnJvcjogJ1N1YmRvbWFpbiBtdXN0IHN0YXJ0IGFuZCBlbmQgd2l0aCBhbHBoYW51bWVyaWMsIGNhbiBjb250YWluIGh5cGhlbnMnIH1cbiAgfVxuICBcbiAgaWYgKC8tLS8udGVzdChzdWJkb21haW4pKSB7XG4gICAgcmV0dXJuIHsgdmFsaWQ6IGZhbHNlLCBlcnJvcjogJ1N1YmRvbWFpbiBjYW5ub3QgY29udGFpbiBjb25zZWN1dGl2ZSBoeXBoZW5zJyB9XG4gIH1cbiAgXG4gIHJldHVybiB7IHZhbGlkOiB0cnVlIH1cbn1cblxuaW50ZXJmYWNlIERvbWFpbkNvbmZpZyB7XG4gIGN1c3RvbURvbWFpbjogc3RyaW5nXG4gIHNlbz86IHtcbiAgICBjYW5vbmljYWw/OiBzdHJpbmdcbiAgfVxufVxuXG5pbnRlcmZhY2UgRG9tYWluU3RhdHVzUmVzcG9uc2Uge1xuICBoYXNDdXN0b21Eb21haW46IGJvb2xlYW5cbiAgZG9tYWluPzogc3RyaW5nXG4gIHN0YXR1cz86IHN0cmluZ1xuICBjdXN0b21Vcmw/OiBzdHJpbmdcbiAgbWVzc2FnZT86IHN0cmluZ1xuICBuZXh0U3RlcD86IHN0cmluZ1xufVxuXG4vKipcbiAqIENoZWNrIGZvciBkb21haW4uanNvbiBhbmQgZGlzcGxheSBjdXN0b20gZG9tYWluIHN0YXR1c1xuICovXG5hc3luYyBmdW5jdGlvbiBjaGVja0N1c3RvbURvbWFpblN0YXR1cyhcbiAgcHJvamVjdFJvb3Q6IHN0cmluZyxcbiAgYXBpVXJsOiBzdHJpbmcsXG4gIGFwaUtleTogc3RyaW5nXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgLy8gQ2hlY2sgaWYgZG9tYWluLmpzb24gZXhpc3RzXG4gIGNvbnN0IGRvbWFpbkNvbmZpZ1BhdGggPSBwYXRoLmpvaW4ocHJvamVjdFJvb3QsICdkb21haW4uanNvbicpXG4gIFxuICBpZiAoIWZzLmV4aXN0c1N5bmMoZG9tYWluQ29uZmlnUGF0aCkpIHtcbiAgICByZXR1cm4gLy8gTm8gZG9tYWluLmpzb24sIG5vdGhpbmcgdG8gZG9cbiAgfVxuICBcbiAgbGV0IGRvbWFpbkNvbmZpZzogRG9tYWluQ29uZmlnXG4gIHRyeSB7XG4gICAgZG9tYWluQ29uZmlnID0gZnMucmVhZEpzb25TeW5jKGRvbWFpbkNvbmZpZ1BhdGgpIGFzIERvbWFpbkNvbmZpZ1xuICB9IGNhdGNoIHtcbiAgICBsb2dnZXIud2FybignRm91bmQgZG9tYWluLmpzb24gYnV0IGZhaWxlZCB0byBwYXJzZSBpdCcpXG4gICAgcmV0dXJuXG4gIH1cbiAgXG4gIGlmICghZG9tYWluQ29uZmlnLmN1c3RvbURvbWFpbikge1xuICAgIHJldHVyblxuICB9XG4gIFxuICBjb25zb2xlLmxvZygnJylcbiAgbG9nZ2VyLmluZm8oYEN1c3RvbSBkb21haW4gY29uZmlndXJlZDogJHtkb21haW5Db25maWcuY3VzdG9tRG9tYWlufWApXG4gIFxuICAvLyBDaGVjayBkb21haW4gc3RhdHVzIHZpYSBBUElcbiAgaWYgKCFhcGlLZXkpIHtcbiAgICBsb2dnZXIuaW5mbygnUnVuIFwiZGV2ZG9jIGRvbWFpbiBzdGF0dXNcIiB0byBjaGVjayBETlMgY29uZmlndXJhdGlvbicpXG4gICAgcmV0dXJuXG4gIH1cbiAgXG4gIHRyeSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgJHthcGlVcmx9L2FwaS9kb21haW5zL3N0YXR1c2AsIHtcbiAgICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgICdBdXRob3JpemF0aW9uJzogYEJlYXJlciAke2FwaUtleX1gLFxuICAgICAgfSxcbiAgICB9KVxuICAgIFxuICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBcbiAgICBjb25zdCBzdGF0dXMgPSBhd2FpdCByZXNwb25zZS5qc29uKCkgYXMgRG9tYWluU3RhdHVzUmVzcG9uc2VcbiAgICBcbiAgICBpZiAoIXN0YXR1cy5oYXNDdXN0b21Eb21haW4pIHtcbiAgICAgIC8vIERvbWFpbiBpbiBjb25maWcgYnV0IG5vdCByZWdpc3RlcmVkIHlldFxuICAgICAgY29uc29sZS5sb2coJycpXG4gICAgICBsb2dnZXIuaW5mbygnQ3VzdG9tIGRvbWFpbiBub3QgeWV0IHJlZ2lzdGVyZWQuJylcbiAgICAgIGxvZ2dlci5pbmZvKCdSdW4gXCJkZXZkb2MgZG9tYWluIGFkZCAnICsgZG9tYWluQ29uZmlnLmN1c3RvbURvbWFpbiArICdcIiB0byBzZXQgaXQgdXAnKVxuICAgIH0gZWxzZSBpZiAoc3RhdHVzLnN0YXR1cyA9PT0gJ2FjdGl2ZScpIHtcbiAgICAgIGNvbnNvbGUubG9nKCcnKVxuICAgICAgY29uc29sZS5sb2coYCAgQWxzbyBsaXZlIGF0OiAke2xvZ2dlci5jeWFuKHN0YXR1cy5jdXN0b21VcmwgfHwgYGh0dHBzOi8vJHtzdGF0dXMuZG9tYWlufWApfWApXG4gICAgfSBlbHNlIGlmIChzdGF0dXMuc3RhdHVzID09PSAncGVuZGluZycpIHtcbiAgICAgIGNvbnNvbGUubG9nKCcnKVxuICAgICAgbG9nZ2VyLndhcm4oJ0N1c3RvbSBkb21haW4gcGVuZGluZyBETlMgY29uZmlndXJhdGlvbicpXG4gICAgICBsb2dnZXIuaW5mbygnUnVuIFwiZGV2ZG9jIGRvbWFpbiBzdGF0dXNcIiBmb3IgRE5TIHNldHVwIGluc3RydWN0aW9ucycpXG4gICAgfSBlbHNlIGlmIChzdGF0dXMuc3RhdHVzID09PSAnZG5zX3ZlcmlmaWVkJyB8fCBzdGF0dXMuc3RhdHVzID09PSAnc3NsX3Byb3Zpc2lvbmluZycpIHtcbiAgICAgIGNvbnNvbGUubG9nKCcnKVxuICAgICAgbG9nZ2VyLmluZm8oJ0N1c3RvbSBkb21haW4gRE5TIHZlcmlmaWVkLCBTU0wgY2VydGlmaWNhdGUgcHJvdmlzaW9uaW5nLi4uJylcbiAgICB9XG4gICAgXG4gIH0gY2F0Y2gge1xuICAgIC8vIElnbm9yZSBlcnJvcnMsIGRvbWFpbiBzdGF0dXMgaXMgaW5mb3JtYXRpb25hbFxuICB9XG59XG5cbi8qKlxuICogRGVwbG95IGRvY3VtZW50YXRpb24gdG8gRGV2RG9jIHBsYXRmb3JtXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZXBsb3kob3B0aW9uczogRGVwbG95T3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwcm9qZWN0Um9vdCA9IHByb2Nlc3MuY3dkKClcbiAgY29uc3QgYXBpVXJsID0gb3B0aW9ucy51cmwgfHwgcHJvY2Vzcy5lbnYuREVWRE9DX0FQSV9VUkwgfHwgREVGQVVMVF9BUElfVVJMXG4gIFxuICBsb2dnZXIuaW5mbygnRGVwbG95aW5nIHRvIERldkRvYy4uLlxcbicpXG4gIFxuICAvLyBDaGVjayBmb3IgZG9jcy5qc29uXG4gIGNvbnN0IGNvbmZpZ1BhdGggPSBwYXRoLmpvaW4ocHJvamVjdFJvb3QsICdkb2NzLmpzb24nKVxuICBpZiAoIWZzLmV4aXN0c1N5bmMoY29uZmlnUGF0aCkpIHtcbiAgICBsb2dnZXIuZXJyb3IoJ2RvY3MuanNvbiBub3QgZm91bmQgaW4gY3VycmVudCBkaXJlY3RvcnknKVxuICAgIGxvZ2dlci5pbmZvKCdNYWtlIHN1cmUgeW91IGFyZSBpbiBhIERldkRvYyBkb2N1bWVudGF0aW9uIHByb2plY3QgZGlyZWN0b3J5JylcbiAgICBwcm9jZXNzLmV4aXQoMSlcbiAgfVxuICBcbiAgLy8gTG9hZCBhbmQgdmFsaWRhdGUgY29uZmlndXJhdGlvblxuICBsZXQgY29uZmlnOiBSZXR1cm5UeXBlPHR5cGVvZiBsb2FkQ29uZmlnPiBleHRlbmRzIFByb21pc2U8aW5mZXIgVD4gPyBUIDogbmV2ZXJcbiAgdHJ5IHtcbiAgICBjb25maWcgPSBhd2FpdCBsb2FkQ29uZmlnKHByb2plY3RSb290KVxuICAgIGNvbnN0IHZhbGlkYXRpb24gPSB2YWxpZGF0ZUNvbmZpZyhjb25maWcpXG4gICAgXG4gICAgaWYgKCF2YWxpZGF0aW9uLnZhbGlkKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoJ0ludmFsaWQgZG9jcy5qc29uIGNvbmZpZ3VyYXRpb246JylcbiAgICAgIHZhbGlkYXRpb24uZXJyb3JzLmZvckVhY2goZXJyID0+IGxvZ2dlci5lcnJvcihgICAtICR7ZXJyfWApKVxuICAgICAgcHJvY2Vzcy5leGl0KDEpXG4gICAgfVxuICAgIFxuICAgIGxvZ2dlci5zdWNjZXNzKGDinJMgQ29uZmlndXJhdGlvbiB2YWxpZDogJHtjb25maWcubmFtZSB8fCAnVW50aXRsZWQnfWApXG4gIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgY29uc3QgbWVzc2FnZSA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKVxuICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIGxvYWQgY29uZmlndXJhdGlvbjogJHttZXNzYWdlfWApXG4gICAgcHJvY2Vzcy5leGl0KDEpXG4gIH1cbiAgXG4gIC8vIENoZWNrIGZvciBleGlzdGluZyBwcm9qZWN0IGNvbmZpZ1xuICBjb25zdCBkZXZkb2NDb25maWdQYXRoID0gcGF0aC5qb2luKHByb2plY3RSb290LCAnLmRldmRvYy5qc29uJylcbiAgbGV0IGRldmRvY0NvbmZpZzogRGV2RG9jQ29uZmlnIHwgbnVsbCA9IG51bGxcbiAgbGV0IGV4aXN0aW5nU2x1Zzogc3RyaW5nIHwgbnVsbCA9IG51bGxcbiAgbGV0IGV4aXN0aW5nQXBpS2V5OiBzdHJpbmcgfCBudWxsID0gbnVsbFxuICBsZXQgZXhpc3RpbmdTdWJkb21haW46IHN0cmluZyB8IG51bGwgPSBudWxsXG4gIFxuICBpZiAoZnMuZXhpc3RzU3luYyhkZXZkb2NDb25maWdQYXRoKSkge1xuICAgIHRyeSB7XG4gICAgICBkZXZkb2NDb25maWcgPSBmcy5yZWFkSnNvblN5bmMoZGV2ZG9jQ29uZmlnUGF0aCkgYXMgRGV2RG9jQ29uZmlnXG4gICAgICBleGlzdGluZ1NsdWcgPSBkZXZkb2NDb25maWcuc2x1ZyB8fCBudWxsXG4gICAgICBleGlzdGluZ0FwaUtleSA9IGRldmRvY0NvbmZpZy5hcGlLZXkgfHwgbnVsbFxuICAgICAgZXhpc3RpbmdTdWJkb21haW4gPSBkZXZkb2NDb25maWcuc3ViZG9tYWluIHx8IG51bGxcbiAgICAgIGlmIChleGlzdGluZ1NsdWcgJiYgZXhpc3RpbmdBcGlLZXkpIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oYERlcGxveWluZyBwcm9qZWN0OiAke2V4aXN0aW5nU2x1Z31gKVxuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gSWdub3JlIGVycm9ycyByZWFkaW5nIC5kZXZkb2MuanNvblxuICAgIH1cbiAgfVxuICBcbiAgLy8gR2V0IEFQSSBrZXkgZnJvbSBvcHRpb25zLCBlbnYgdmFyLCBvciAuZGV2ZG9jLmpzb25cbiAgbGV0IGFwaUtleSA9IG9wdGlvbnMuYXBpS2V5IHx8IHByb2Nlc3MuZW52LkRFVkRPQ19BUElfS0VZIHx8IGV4aXN0aW5nQXBpS2V5XG4gIFxuICAvLyBJZiBubyBBUEkga2V5LCB0aGlzIGlzIGEgZmlyc3QgZGVwbG95IC0gbmVlZCB0byByZWdpc3RlciB0aGUgc3ViZG9tYWluIGZpcnN0XG4gIGlmICghYXBpS2V5KSB7XG4gICAgLy8gQ2hlY2sgaWYgd2UgaGF2ZSBzdWJkb21haW4gZnJvbSBpbml0XG4gICAgaWYgKCFleGlzdGluZ1N1YmRvbWFpbikge1xuICAgICAgbG9nZ2VyLmVycm9yKCdObyBwcm9qZWN0IGNvbmZpZ3VyYXRpb24gZm91bmQuJylcbiAgICAgIGNvbnNvbGUubG9nKCcnKVxuICAgICAgbG9nZ2VyLmluZm8oJ1J1biBcImRldmRvYyBpbml0XCIgZmlyc3QgdG8gY29uZmlndXJlIHlvdXIgcHJvamVjdCcpXG4gICAgICBsb2dnZXIuaW5mbygnT3IgcHJvdmlkZSBhbiBBUEkga2V5IHZpYSAtLWFwaS1rZXkgZmxhZyBvciBERVZET0NfQVBJX0tFWSBlbnYgdmFyJylcbiAgICAgIHByb2Nlc3MuZXhpdCgxKVxuICAgIH1cbiAgICBcbiAgICBsZXQgc3ViZG9tYWluVG9SZWdpc3RlciA9IGV4aXN0aW5nU3ViZG9tYWluXG4gICAgbGV0IHJlZ2lzdGVyZWQgPSBmYWxzZVxuICAgIFxuICAgIC8vIExvb3AgdW50aWwgd2Ugc3VjY2Vzc2Z1bGx5IHJlZ2lzdGVyIGEgc3ViZG9tYWluXG4gICAgd2hpbGUgKCFyZWdpc3RlcmVkKSB7XG4gICAgICBsb2dnZXIuaW5mbyhgUmVnaXN0ZXJpbmcgc3ViZG9tYWluICR7c3ViZG9tYWluVG9SZWdpc3Rlcn0uZGV2ZG9jLnNoLi4uYClcbiAgICAgIFxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVnaXN0ZXJSZXNwb25zZSA9IGF3YWl0IGZldGNoKGAke2FwaVVybH0vYXBpL3Byb2plY3RzL3JlZ2lzdGVyYCwge1xuICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICBuYW1lOiBkZXZkb2NDb25maWc/Lm5hbWUgfHwgY29uZmlnLm5hbWUgfHwgJ015IERvY3VtZW50YXRpb24nLFxuICAgICAgICAgICAgc2x1Zzogc3ViZG9tYWluVG9SZWdpc3RlcixcbiAgICAgICAgICAgIHN1YmRvbWFpbjogc3ViZG9tYWluVG9SZWdpc3RlcixcbiAgICAgICAgICB9KSxcbiAgICAgICAgfSlcbiAgICAgICAgXG4gICAgICAgIGlmICghcmVnaXN0ZXJSZXNwb25zZS5vaykge1xuICAgICAgICAgIGNvbnN0IGVycm9yRGF0YSA9IGF3YWl0IHJlZ2lzdGVyUmVzcG9uc2UuanNvbigpLmNhdGNoKCgpID0+ICh7IGVycm9yOiAnVW5rbm93biBlcnJvcicgfSkpIGFzIHsgZXJyb3I/OiBzdHJpbmc7IGRldGFpbHM/OiBzdHJpbmcgfVxuICAgICAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGVycm9yRGF0YS5lcnJvciB8fCBgSFRUUCAke3JlZ2lzdGVyUmVzcG9uc2Uuc3RhdHVzfWBcbiAgICAgICAgICBcbiAgICAgICAgICAvLyBJZiBzdWJkb21haW4gaXMgdGFrZW4sIGFzayBmb3IgYSBuZXcgb25lXG4gICAgICAgICAgaWYgKGVycm9yTWVzc2FnZS5pbmNsdWRlcygnYWxyZWFkeSBleGlzdHMnKSB8fCBlcnJvck1lc3NhZ2UuaW5jbHVkZXMoJ2FscmVhZHkgdGFrZW4nKSkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJycpXG4gICAgICAgICAgICBsb2dnZXIud2FybihgU3ViZG9tYWluIFwiJHtzdWJkb21haW5Ub1JlZ2lzdGVyfVwiIGlzIG5vIGxvbmdlciBhdmFpbGFibGUuYClcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gR2V0IHN1Z2dlc3Rpb24gZnJvbSBBUElcbiAgICAgICAgICAgIGNvbnN0IGF2YWlsYWJpbGl0eSA9IGF3YWl0IGNoZWNrU3ViZG9tYWluQXZhaWxhYmlsaXR5KHN1YmRvbWFpblRvUmVnaXN0ZXIsIGFwaVVybClcbiAgICAgICAgICAgIGNvbnN0IHN1Z2dlc3Rpb24gPSBhdmFpbGFiaWxpdHkuc3VnZ2VzdGlvbiB8fCBgJHtzdWJkb21haW5Ub1JlZ2lzdGVyfS1kb2NzYFxuICAgICAgICAgICAgXG4gICAgICAgICAgICBjb25zb2xlLmxvZygnJylcbiAgICAgICAgICAgIGxvZ2dlci5pbmZvKGBTdWdnZXN0aW9uOiAke3N1Z2dlc3Rpb259LmRldmRvYy5zaGApXG4gICAgICAgICAgICBjb25zb2xlLmxvZygnJylcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gUHJvbXB0IGZvciBuZXcgc3ViZG9tYWluXG4gICAgICAgICAgICBsZXQgbmV3U3ViZG9tYWluID0gYXdhaXQgcHJvbXB0KCdFbnRlciBhIG5ldyBzdWJkb21haW4nLCBzdWdnZXN0aW9uKVxuICAgICAgICAgICAgbmV3U3ViZG9tYWluID0gbmV3U3ViZG9tYWluLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvW15hLXowLTktXS9nLCAnLScpLnJlcGxhY2UoL14tfC0kL2csICcnKVxuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBWYWxpZGF0ZSBmb3JtYXRcbiAgICAgICAgICAgIGNvbnN0IGZvcm1hdENoZWNrID0gaXNWYWxpZFN1YmRvbWFpbkZvcm1hdChuZXdTdWJkb21haW4pXG4gICAgICAgICAgICBpZiAoIWZvcm1hdENoZWNrLnZhbGlkKSB7XG4gICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihmb3JtYXRDaGVjay5lcnJvciEpXG4gICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHN1YmRvbWFpblRvUmVnaXN0ZXIgPSBuZXdTdWJkb21haW5cbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCcnKVxuICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICB9XG4gICAgICAgICAgXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGVycm9yTWVzc2FnZSlcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgY29uc3QgcmVnaXN0ZXJSZXN1bHQgPSBhd2FpdCByZWdpc3RlclJlc3BvbnNlLmpzb24oKSBhcyBSZWdpc3RlclJlc3BvbnNlXG4gICAgICAgIFxuICAgICAgICAvLyBVcGRhdGUgbG9jYWwgY29uZmlnIHdpdGggQVBJIGtleVxuICAgICAgICBhcGlLZXkgPSByZWdpc3RlclJlc3VsdC5hcGlLZXlcbiAgICAgICAgZXhpc3RpbmdTbHVnID0gcmVnaXN0ZXJSZXN1bHQuc2x1Z1xuICAgICAgICBleGlzdGluZ1N1YmRvbWFpbiA9IHJlZ2lzdGVyUmVzdWx0LnN1YmRvbWFpblxuICAgICAgICBcbiAgICAgICAgLy8gU2F2ZSB0aGUgdXBkYXRlZCBjb25maWdcbiAgICAgICAgY29uc3QgdXBkYXRlZENvbmZpZzogRGV2RG9jQ29uZmlnID0ge1xuICAgICAgICAgIC4uLmRldmRvY0NvbmZpZyxcbiAgICAgICAgICBwcm9qZWN0SWQ6IHJlZ2lzdGVyUmVzdWx0LnByb2plY3RJZCxcbiAgICAgICAgICBzbHVnOiByZWdpc3RlclJlc3VsdC5zbHVnLFxuICAgICAgICAgIHN1YmRvbWFpbjogcmVnaXN0ZXJSZXN1bHQuc3ViZG9tYWluLFxuICAgICAgICAgIGFwaUtleTogcmVnaXN0ZXJSZXN1bHQuYXBpS2V5LFxuICAgICAgICAgIHVybDogcmVnaXN0ZXJSZXN1bHQudXJsLFxuICAgICAgICB9XG4gICAgICAgIGZzLndyaXRlSnNvblN5bmMoZGV2ZG9jQ29uZmlnUGF0aCwgdXBkYXRlZENvbmZpZywgeyBzcGFjZXM6IDIgfSlcbiAgICAgICAgXG4gICAgICAgIGxvZ2dlci5zdWNjZXNzKGDinJMgU3ViZG9tYWluICR7cmVnaXN0ZXJSZXN1bHQuc3ViZG9tYWlufS5kZXZkb2Muc2ggcmVnaXN0ZXJlZCFgKVxuICAgICAgICBjb25zb2xlLmxvZygnJylcbiAgICAgICAgcmVnaXN0ZXJlZCA9IHRydWVcbiAgICAgICAgXG4gICAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpXG4gICAgICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIHJlZ2lzdGVyIHN1YmRvbWFpbjogJHttZXNzYWdlfWApXG4gICAgICAgIHByb2Nlc3MuZXhpdCgxKVxuICAgICAgfVxuICAgIH1cbiAgfVxuICBcbiAgLy8gQ29sbGVjdCBhbGwgY29udGVudCBmaWxlc1xuICBsb2dnZXIuaW5mbygnQnVuZGxpbmcgY29udGVudC4uLicpXG4gIGNvbnN0IGZpbGVzID0gYXdhaXQgY29sbGVjdEZpbGVzKHByb2plY3RSb290KVxuICBsb2dnZXIuc3VjY2Vzcyhg4pyTIEZvdW5kICR7ZmlsZXMubGVuZ3RofSBjb250ZW50IGZpbGVzYClcbiAgXG4gIC8vIENvbGxlY3QgdGhlbWUuanNvblxuICBjb25zdCB0aGVtZUpzb24gPSBjb2xsZWN0VGhlbWVKc29uKHByb2plY3RSb290KVxuICBpZiAodGhlbWVKc29uKSB7XG4gICAgbG9nZ2VyLnN1Y2Nlc3MoJ+KckyBGb3VuZCB0aGVtZS5qc29uJylcbiAgfVxuICBcbiAgLy8gQ29sbGVjdCBPcGVuQVBJIHNwZWNzIGJhc2VkIG9uIGRvY3MuanNvbiBuYXZpZ2F0aW9uXG4gIGNvbnN0IG9wZW5BcGlTcGVjcyA9IGF3YWl0IGNvbGxlY3RPcGVuQXBpU3BlY3MocHJvamVjdFJvb3QsIGNvbmZpZyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilcbiAgY29uc3Qgc3BlY0NvdW50ID0gT2JqZWN0LmtleXMob3BlbkFwaVNwZWNzKS5sZW5ndGhcbiAgaWYgKHNwZWNDb3VudCA+IDApIHtcbiAgICBsb2dnZXIuc3VjY2Vzcyhg4pyTIEZvdW5kICR7c3BlY0NvdW50fSBPcGVuQVBJIHNwZWMocylgKVxuICB9XG4gIFxuICAvLyBDb2xsZWN0IGJpbmFyeSBhc3NldHNcbiAgY29uc3QgYXNzZXRzID0gYXdhaXQgY29sbGVjdEFzc2V0cyhwcm9qZWN0Um9vdClcbiAgaWYgKGFzc2V0cy5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgdG90YWxBc3NldFNpemUgPSBhc3NldHMucmVkdWNlKChzdW0sIGEpID0+IHN1bSArIGEuc2l6ZSwgMClcbiAgICBsb2dnZXIuc3VjY2Vzcyhg4pyTIEZvdW5kICR7YXNzZXRzLmxlbmd0aH0gYXNzZXRzICgke2Zvcm1hdFNpemUodG90YWxBc3NldFNpemUpfSlgKVxuICB9XG4gIFxuICAvLyBDYWxjdWxhdGUgYnVuZGxlIHNpemVcbiAgY29uc3QgdG90YWxTaXplID0gZmlsZXMucmVkdWNlKChzdW0sIGYpID0+IHN1bSArIGYuY29udGVudC5sZW5ndGgsIDApXG4gIGNvbnN0IHNpemVLQiA9ICh0b3RhbFNpemUgLyAxMDI0KS50b0ZpeGVkKDEpXG4gIGxvZ2dlci5pbmZvKGBDb250ZW50IGJ1bmRsZTogJHtzaXplS0J9IEtCYClcbiAgXG4gIC8vIFVwbG9hZCBiaW5hcnkgYXNzZXRzIGZpcnN0ICh3aXRoIHByb2dyZXNzKVxuICBpZiAoYXNzZXRzLmxlbmd0aCA+IDAgJiYgZXhpc3RpbmdTbHVnICYmIGFwaUtleSkge1xuICAgIGNvbnNvbGUubG9nKCcnKVxuICAgIGxvZ2dlci5pbmZvKCdVcGxvYWRpbmcgYXNzZXRzLi4uJylcbiAgICBcbiAgICBjb25zdCBhc3NldFJlc3VsdHMgPSBhd2FpdCB1cGxvYWRBc3NldHMoYXNzZXRzLCBhcGlVcmwsIGV4aXN0aW5nU2x1ZywgYXBpS2V5KVxuICAgIGNvbnN0IHN1Y2Nlc3NDb3VudCA9IGFzc2V0UmVzdWx0cy5maWx0ZXIociA9PiByLnN1Y2Nlc3MpLmxlbmd0aFxuICAgIGNvbnN0IGZhaWxDb3VudCA9IGFzc2V0UmVzdWx0cy5maWx0ZXIociA9PiAhci5zdWNjZXNzKS5sZW5ndGhcbiAgICBcbiAgICBpZiAoZmFpbENvdW50ID4gMCkge1xuICAgICAgbG9nZ2VyLndhcm4oYCR7c3VjY2Vzc0NvdW50fSBhc3NldHMgdXBsb2FkZWQsICR7ZmFpbENvdW50fSBmYWlsZWRgKVxuICAgIH0gZWxzZSBpZiAoc3VjY2Vzc0NvdW50ID4gMCkge1xuICAgICAgbG9nZ2VyLnN1Y2Nlc3MoYOKckyAke3N1Y2Nlc3NDb3VudH0gYXNzZXRzIHVwbG9hZGVkYClcbiAgICB9XG4gIH0gZWxzZSBpZiAoYXNzZXRzLmxlbmd0aCA+IDAgJiYgIWV4aXN0aW5nU2x1Zykge1xuICAgIGxvZ2dlci5pbmZvKCdBc3NldHMgd2lsbCBiZSB1cGxvYWRlZCBvbiBuZXh0IGRlcGxveSAoYWZ0ZXIgcHJvamVjdCByZWdpc3RyYXRpb24pJylcbiAgfVxuICBcbiAgLy8gRGVwbG95IGNvbnRlbnQgdG8gQVBJXG4gIGNvbnNvbGUubG9nKCcnKVxuICBsb2dnZXIuaW5mbygnVXBsb2FkaW5nIGNvbnRlbnQuLi4nKVxuICBcbiAgdHJ5IHtcbiAgICBpbnRlcmZhY2UgRGVwbG95UmVzcG9uc2Uge1xuICAgICAgc3VjY2VzczogYm9vbGVhblxuICAgICAgc2x1Zzogc3RyaW5nXG4gICAgICB1cmw6IHN0cmluZ1xuICAgICAgYmxvYlVybDogc3RyaW5nXG4gICAgICBpc1VwZGF0ZTogYm9vbGVhblxuICAgICAgZmlsZXNDb3VudDogbnVtYmVyXG4gICAgICBhcGlLZXk/OiBzdHJpbmdcbiAgICAgIGVycm9yPzogc3RyaW5nXG4gICAgfVxuICAgIFxuICAgIGNvbnN0IGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgIH1cbiAgICBcbiAgICAvLyBBZGQgQVBJIGtleSBoZWFkZXIgZm9yIHVwZGF0ZXNcbiAgICBpZiAoYXBpS2V5KSB7XG4gICAgICBoZWFkZXJzWydBdXRob3JpemF0aW9uJ10gPSBgQmVhcmVyICR7YXBpS2V5fWBcbiAgICB9XG4gICAgXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgJHthcGlVcmx9L2FwaS9kZXBsb3lgLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnMsXG4gICAgICByZWRpcmVjdDogJ2ZvbGxvdycsIC8vIEZvbGxvdyByZWRpcmVjdHNcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgbmFtZTogY29uZmlnLm5hbWUgfHwgJ015IERvY3VtZW50YXRpb24nLFxuICAgICAgICBzbHVnOiBleGlzdGluZ1NsdWcsXG4gICAgICAgIGRvY3NKc29uOiBjb25maWcsXG4gICAgICAgIHRoZW1lSnNvbixcbiAgICAgICAgb3BlbkFwaVNwZWNzLFxuICAgICAgICBmaWxlcyxcbiAgICAgICAgYXBpS2V5LCAvLyBBbHNvIHNlbmQgaW4gYm9keSBhcyBmYWxsYmFja1xuICAgICAgfSksXG4gICAgfSlcbiAgICBcbiAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICBjb25zdCBlcnJvckRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCkuY2F0Y2goKCkgPT4gKHsgZXJyb3I6ICdVbmtub3duIGVycm9yJyB9KSkgYXMgeyBlcnJvcj86IHN0cmluZzsgZGV0YWlscz86IHN0cmluZyB9XG4gICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBlcnJvckRhdGEuZXJyb3IgfHwgYEhUVFAgJHtyZXNwb25zZS5zdGF0dXN9YFxuICAgICAgY29uc3QgZGV0YWlscyA9IGVycm9yRGF0YS5kZXRhaWxzID8gYFxcbiAgIERldGFpbHM6ICR7ZXJyb3JEYXRhLmRldGFpbHN9YCA6ICcnXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7ZXJyb3JNZXNzYWdlfSR7ZGV0YWlsc31gKVxuICAgIH1cbiAgICBcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXNwb25zZS5qc29uKCkgYXMgRGVwbG95UmVzcG9uc2VcbiAgICBcbiAgICAvLyBTYXZlIHByb2plY3QgY29uZmlnIGZvciBmdXR1cmUgdXBkYXRlc1xuICAgIGNvbnN0IG5ld0RldkRvY0NvbmZpZzogRGV2RG9jQ29uZmlnID0ge1xuICAgICAgc2x1ZzogcmVzdWx0LnNsdWcsXG4gICAgICB1cmw6IHJlc3VsdC51cmwsXG4gICAgICBsYXN0RGVwbG95ZWQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICB9XG4gICAgXG4gICAgLy8gU2F2ZSBBUEkga2V5IChmcm9tIHJlc3BvbnNlIGZvciBuZXcgcHJvamVjdHMsIG9yIGV4aXN0aW5nIGZvciB1cGRhdGVzKVxuICAgIGlmIChyZXN1bHQuYXBpS2V5KSB7XG4gICAgICBuZXdEZXZEb2NDb25maWcuYXBpS2V5ID0gcmVzdWx0LmFwaUtleVxuICAgIH0gZWxzZSBpZiAoYXBpS2V5KSB7XG4gICAgICBuZXdEZXZEb2NDb25maWcuYXBpS2V5ID0gYXBpS2V5XG4gICAgfVxuICAgIFxuICAgIGZzLndyaXRlSnNvblN5bmMoZGV2ZG9jQ29uZmlnUGF0aCwgbmV3RGV2RG9jQ29uZmlnLCB7IHNwYWNlczogMiB9KVxuICAgIFxuICAgIC8vIFN1Y2Nlc3MgbWVzc2FnZVxuICAgIGNvbnNvbGUubG9nKCcnKVxuICAgIGxvZ2dlci5zdWNjZXNzKCdEZXBsb3ltZW50IHN1Y2Nlc3NmdWwhJylcbiAgICBjb25zb2xlLmxvZygnJylcbiAgICBjb25zb2xlLmxvZyhgICBZb3VyIGRvY3MgYXJlIGxpdmUgYXQ6YClcbiAgICBjb25zb2xlLmxvZyhgICAke2xvZ2dlci5jeWFuKHJlc3VsdC51cmwpfWApXG4gICAgY29uc29sZS5sb2coJycpXG4gICAgXG4gICAgaWYgKHJlc3VsdC5pc1VwZGF0ZSkge1xuICAgICAgbG9nZ2VyLmluZm8oJ1Byb2plY3QgdXBkYXRlZCB3aXRoIG5ldyBjb250ZW50JylcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nZ2VyLmluZm8oYFByb2plY3Qgc2x1ZzogJHtyZXN1bHQuc2x1Z31gKVxuICAgICAgbG9nZ2VyLmluZm8oJ1J1biBcImRldmRvYyBkZXBsb3lcIiBhZ2FpbiB0byB1cGRhdGUnKVxuICAgICAgXG4gICAgICAvLyBTaG93IEFQSSBrZXkgd2FybmluZyBmb3IgbmV3IHByb2plY3RzXG4gICAgICBpZiAocmVzdWx0LmFwaUtleSkge1xuICAgICAgICBjb25zb2xlLmxvZygnJylcbiAgICAgICAgbG9nZ2VyLndhcm4oJ+KaoO+4jyAgU2F2ZSB5b3VyIEFQSSBrZXkgZm9yIENJL0NEIGRlcGxveW1lbnRzOicpXG4gICAgICAgIGNvbnNvbGUubG9nKGAgICAgJHtyZXN1bHQuYXBpS2V5fWApXG4gICAgICAgIGNvbnNvbGUubG9nKCcnKVxuICAgICAgICBsb2dnZXIuaW5mbygnQVBJIGtleSBzYXZlZCB0byAuZGV2ZG9jLmpzb24gKGFkZCB0byAuZ2l0aWdub3JlISknKVxuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICAvLyBDaGVjayBmb3IgZG9tYWluLmpzb24gYW5kIHNob3cgY3VzdG9tIGRvbWFpbiBzdGF0dXNcbiAgICBhd2FpdCBjaGVja0N1c3RvbURvbWFpblN0YXR1cyhwcm9qZWN0Um9vdCwgYXBpVXJsLCBhcGlLZXkgfHwgcmVzdWx0LmFwaUtleSB8fCAnJylcbiAgICBcbiAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICBjb25zdCBtZXNzYWdlID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpXG4gICAgbG9nZ2VyLmVycm9yKGBEZXBsb3ltZW50IGZhaWxlZDogJHttZXNzYWdlfWApXG4gICAgcHJvY2Vzcy5leGl0KDEpXG4gIH1cbn1cblxuLyoqXG4gKiBDb2xsZWN0IE9wZW5BUEkgc3BlY3MgYmFzZWQgb24gZG9jcy5qc29uIG5hdmlnYXRpb24gdGFic1xuICovXG5hc3luYyBmdW5jdGlvbiBjb2xsZWN0T3BlbkFwaVNwZWNzKFxuICBwcm9qZWN0Um9vdDogc3RyaW5nLFxuICBkb2NzSnNvbjogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbik6IFByb21pc2U8UmVjb3JkPHN0cmluZywgT3BlbkFwaVNwZWM+PiB7XG4gIGNvbnN0IHNwZWNzOiBSZWNvcmQ8c3RyaW5nLCBPcGVuQXBpU3BlYz4gPSB7fVxuICBcbiAgLy8gR2V0IG5hdmlnYXRpb24gZnJvbSBkb2NzLmpzb24gLSBjb3VsZCBiZSBvYmplY3Qgd2l0aCB0YWJzIG9yIGFycmF5XG4gIGNvbnN0IG5hdmlnYXRpb24gPSBkb2NzSnNvbi5uYXZpZ2F0aW9uIGFzIHsgdGFicz86IEFycmF5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PiB9IHwgQXJyYXk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+IHwgdW5kZWZpbmVkXG4gIGlmICghbmF2aWdhdGlvbikgcmV0dXJuIHNwZWNzXG4gIFxuICAvLyBIYW5kbGUgYm90aCB7IHRhYnM6IFsuLi5dIH0gYW5kIGRpcmVjdCBhcnJheSBmb3JtYXRzXG4gIGNvbnN0IHRhYnMgPSBBcnJheS5pc0FycmF5KG5hdmlnYXRpb24pID8gbmF2aWdhdGlvbiA6IChuYXZpZ2F0aW9uLnRhYnMgfHwgW10pXG4gIFxuICBmb3IgKGNvbnN0IGl0ZW0gb2YgdGFicykge1xuICAgIC8vIENoZWNrIGlmIHRoaXMgaXMgYW4gT3BlbkFQSSB0YWJcbiAgICBpZiAoaXRlbS50eXBlID09PSAnb3BlbmFwaScpIHtcbiAgICAgIC8vIFNwZWMgY2FuIGJlIGRpcmVjdGx5IG9uIHRhYiBvciBuZXN0ZWQgaW4gdmVyc2lvbnMgYXJyYXlcbiAgICAgIGNvbnN0IHZlcnNpb25zID0gaXRlbS52ZXJzaW9ucyBhcyBBcnJheTx7IHNwZWM6IHN0cmluZzsgdmVyc2lvbjogc3RyaW5nIH0+IHwgdW5kZWZpbmVkXG4gICAgICBcbiAgICAgIGlmICh2ZXJzaW9ucyAmJiBBcnJheS5pc0FycmF5KHZlcnNpb25zKSkge1xuICAgICAgICAvLyBIYW5kbGUgdmVyc2lvbmVkIHNwZWNzXG4gICAgICAgIGZvciAoY29uc3QgdmVyc2lvbiBvZiB2ZXJzaW9ucykge1xuICAgICAgICAgIGlmICh2ZXJzaW9uLnNwZWMpIHtcbiAgICAgICAgICAgIGF3YWl0IGxvYWRTcGVjKHByb2plY3RSb290LCB2ZXJzaW9uLnNwZWMsIHNwZWNzKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChpdGVtLnNwZWMpIHtcbiAgICAgICAgLy8gSGFuZGxlIGRpcmVjdCBzcGVjIHJlZmVyZW5jZVxuICAgICAgICBhd2FpdCBsb2FkU3BlYyhwcm9qZWN0Um9vdCwgaXRlbS5zcGVjIGFzIHN0cmluZywgc3BlY3MpXG4gICAgICB9XG4gICAgfVxuICB9XG4gIFxuICByZXR1cm4gc3BlY3Ncbn1cblxuLyoqXG4gKiBMb2FkIGEgc2luZ2xlIE9wZW5BUEkgc3BlYyBpbnRvIHRoZSBzcGVjcyBtYXBcbiAqL1xuYXN5bmMgZnVuY3Rpb24gbG9hZFNwZWMoXG4gIHByb2plY3RSb290OiBzdHJpbmcsXG4gIHNwZWNQYXRoOiBzdHJpbmcsXG4gIHNwZWNzOiBSZWNvcmQ8c3RyaW5nLCBPcGVuQXBpU3BlYz5cbik6IFByb21pc2U8dm9pZD4ge1xuICAvLyBSZXNvbHZlIHRoZSBzcGVjIHBhdGggcmVsYXRpdmUgdG8gcHJvamVjdCByb290XG4gIGxldCBmdWxsU3BlY1BhdGggPSBwYXRoLmpvaW4ocHJvamVjdFJvb3QsIHNwZWNQYXRoKVxuICBcbiAgLy8gSGFuZGxlIHJlbGF0aXZlIHBhdGhzIGxpa2UgLi9mYWNlYm9vay9vcGVuYXBpLmpzb25cbiAgaWYgKHNwZWNQYXRoLnN0YXJ0c1dpdGgoJy4vJykpIHtcbiAgICBmdWxsU3BlY1BhdGggPSBwYXRoLmpvaW4ocHJvamVjdFJvb3QsIHNwZWNQYXRoLnNsaWNlKDIpKVxuICB9XG4gIFxuICBpZiAoZnMuZXhpc3RzU3luYyhmdWxsU3BlY1BhdGgpKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHNwZWNDb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKGZ1bGxTcGVjUGF0aCwgJ3V0Zi04JylcbiAgICAgIGNvbnN0IHNwZWNEYXRhID0gSlNPTi5wYXJzZShzcGVjQ29udGVudCkgYXMgT3BlbkFwaVNwZWNcbiAgICAgIHNwZWNzW3NwZWNQYXRoXSA9IHNwZWNEYXRhXG4gICAgICBsb2dnZXIuaW5mbyhgICDihpIgJHtzcGVjUGF0aH1gKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCBtZXNzYWdlID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpXG4gICAgICBsb2dnZXIud2FybihgRmFpbGVkIHRvIHBhcnNlIE9wZW5BUEkgc3BlYyAke3NwZWNQYXRofTogJHttZXNzYWdlfWApXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGxvZ2dlci53YXJuKGBPcGVuQVBJIHNwZWMgZmlsZSBub3QgZm91bmQ6ICR7c3BlY1BhdGh9YClcbiAgfVxufVxuXG4vKipcbiAqIENvbGxlY3QgdGhlbWUuanNvbiBpZiBpdCBleGlzdHNcbiAqL1xuZnVuY3Rpb24gY29sbGVjdFRoZW1lSnNvbihwcm9qZWN0Um9vdDogc3RyaW5nKTogb2JqZWN0IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgdGhlbWVQYXRoID0gcGF0aC5qb2luKHByb2plY3RSb290LCAndGhlbWUuanNvbicpXG4gIFxuICBpZiAoZnMuZXhpc3RzU3luYyh0aGVtZVBhdGgpKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHRoZW1lQ29udGVudCA9IGZzLnJlYWRGaWxlU3luYyh0aGVtZVBhdGgsICd1dGYtOCcpXG4gICAgICByZXR1cm4gSlNPTi5wYXJzZSh0aGVtZUNvbnRlbnQpIGFzIG9iamVjdFxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCBtZXNzYWdlID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpXG4gICAgICBsb2dnZXIud2FybihgRmFpbGVkIHRvIHBhcnNlIHRoZW1lLmpzb246ICR7bWVzc2FnZX1gKVxuICAgIH1cbiAgfVxuICBcbiAgcmV0dXJuIHVuZGVmaW5lZFxufVxuXG4vKipcbiAqIENvbGxlY3QgYWxsIE1EWCBhbmQgY29udGVudCBmaWxlcyBmcm9tIHRoZSBwcm9qZWN0XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNvbGxlY3RGaWxlcyhwcm9qZWN0Um9vdDogc3RyaW5nKTogUHJvbWlzZTxQcm9qZWN0RmlsZVtdPiB7XG4gIGNvbnN0IGZpbGVzOiBQcm9qZWN0RmlsZVtdID0gW11cbiAgXG4gIC8vIFNjYW4gYWxsIGRpcmVjdG9yaWVzIGluIHByb2plY3Qgcm9vdCAobm90IGp1c3QgaGFyZGNvZGVkIGxpc3QpXG4gIGNvbnN0IGl0ZW1zID0gZnMucmVhZGRpclN5bmMocHJvamVjdFJvb3QpXG4gIFxuICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHtcbiAgICAvLyBTa2lwIGNvbW1vbiBkaXJlY3RvcmllcyB0aGF0IHNob3VsZG4ndCBiZSBzY2FubmVkXG4gICAgaWYgKFtcbiAgICAgICdub2RlX21vZHVsZXMnLCBcbiAgICAgICdkaXN0JywgXG4gICAgICAnLm5leHQnLCBcbiAgICAgICcuZ2l0JywgXG4gICAgICAncHVibGljJyxcbiAgICAgICcuZGV2ZG9jJyxcbiAgICAgICcuY2xhdWRlJyxcbiAgICAgICcuY3Vyc29yJyxcbiAgICBdLmluY2x1ZGVzKGl0ZW0pKSB7XG4gICAgICBjb250aW51ZVxuICAgIH1cbiAgICBcbiAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGguam9pbihwcm9qZWN0Um9vdCwgaXRlbSlcbiAgICBjb25zdCBzdGF0ID0gZnMuc3RhdFN5bmMoZnVsbFBhdGgpXG4gICAgXG4gICAgaWYgKHN0YXQuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgLy8gU2tpcCBhc3NldHMgZm9sZGVyIGZvciBNRFggc2Nhbm5pbmcgKGhhbmRsZWQgc2VwYXJhdGVseSlcbiAgICAgIGlmIChpdGVtID09PSAnYXNzZXRzJykgY29udGludWVcbiAgICAgIGF3YWl0IHNjYW5EaXJlY3RvcnkoZnVsbFBhdGgsIHByb2plY3RSb290LCBmaWxlcylcbiAgICB9IGVsc2UgaWYgKGl0ZW0uZW5kc1dpdGgoJy5tZHgnKSB8fCBpdGVtLmVuZHNXaXRoKCcubWQnKSkge1xuICAgICAgLy8gSW5jbHVkZSByb290LWxldmVsIE1EWCBmaWxlc1xuICAgICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhmdWxsUGF0aCwgJ3V0Zi04JylcbiAgICAgIGZpbGVzLnB1c2goeyBwYXRoOiBpdGVtLCBjb250ZW50IH0pXG4gICAgfSBlbHNlIGlmIChpdGVtID09PSAnZG9jcy5qc29uJyB8fCBpdGVtID09PSAndGhlbWUuanNvbicgfHwgaXRlbSA9PT0gJ2RvbWFpbi5qc29uJyB8fCBpdGVtID09PSAnY3VzdG9tLmNzcycpIHtcbiAgICAgIC8vIEluY2x1ZGUgY29uZmlnIGZpbGVzXG4gICAgICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKGZ1bGxQYXRoLCAndXRmLTgnKVxuICAgICAgZmlsZXMucHVzaCh7IHBhdGg6IGl0ZW0sIGNvbnRlbnQgfSlcbiAgICB9XG4gIH1cbiAgXG4gIC8vIEluY2x1ZGUgdGV4dC1iYXNlZCBhc3NldHMgZnJvbSBhc3NldHMgZm9sZGVyIChTVkcsIEpTT04pXG4gIGNvbnN0IGFzc2V0c0RpciA9IHBhdGguam9pbihwcm9qZWN0Um9vdCwgJ2Fzc2V0cycpXG4gIGlmIChmcy5leGlzdHNTeW5jKGFzc2V0c0RpcikpIHtcbiAgICBhd2FpdCBzY2FuUHVibGljQXNzZXRzKGFzc2V0c0RpciwgcHJvamVjdFJvb3QsIGZpbGVzKVxuICB9XG4gIFxuICByZXR1cm4gZmlsZXNcbn1cblxuLyoqXG4gKiBSZWN1cnNpdmVseSBzY2FuIGEgZGlyZWN0b3J5IGZvciBNRFggZmlsZXNcbiAqL1xuYXN5bmMgZnVuY3Rpb24gc2NhbkRpcmVjdG9yeShcbiAgZGlyOiBzdHJpbmcsXG4gIHByb2plY3RSb290OiBzdHJpbmcsXG4gIGZpbGVzOiBQcm9qZWN0RmlsZVtdXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgaXRlbXMgPSBmcy5yZWFkZGlyU3luYyhkaXIpXG4gIFxuICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHtcbiAgICAvLyBTa2lwIGNvbW1vbiBkaXJlY3Rvcmllc1xuICAgIGlmIChbJ25vZGVfbW9kdWxlcycsICdkaXN0JywgJy5uZXh0JywgJy5naXQnLCAncHVibGljJ10uaW5jbHVkZXMoaXRlbSkpIHtcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIFxuICAgIGNvbnN0IGZ1bGxQYXRoID0gcGF0aC5qb2luKGRpciwgaXRlbSlcbiAgICBjb25zdCBzdGF0ID0gZnMuc3RhdFN5bmMoZnVsbFBhdGgpXG4gICAgXG4gICAgaWYgKHN0YXQuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgYXdhaXQgc2NhbkRpcmVjdG9yeShmdWxsUGF0aCwgcHJvamVjdFJvb3QsIGZpbGVzKVxuICAgIH0gZWxzZSBpZiAoaXRlbS5lbmRzV2l0aCgnLm1keCcpIHx8IGl0ZW0uZW5kc1dpdGgoJy5tZCcpKSB7XG4gICAgICBjb25zdCByZWxhdGl2ZVBhdGggPSBwYXRoLnJlbGF0aXZlKHByb2plY3RSb290LCBmdWxsUGF0aClcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoZnVsbFBhdGgsICd1dGYtOCcpXG4gICAgICBcbiAgICAgIGZpbGVzLnB1c2goe1xuICAgICAgICBwYXRoOiByZWxhdGl2ZVBhdGgsXG4gICAgICAgIGNvbnRlbnQsXG4gICAgICB9KVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFNjYW4gcHVibGljIGFzc2V0cyAoU1ZHLCBKU09OLCBDU1MpIC0gdGV4dC1iYXNlZCBvbmx5IGZvciBjb250ZW50IGJ1bmRsZVxuICovXG5hc3luYyBmdW5jdGlvbiBzY2FuUHVibGljQXNzZXRzKFxuICBkaXI6IHN0cmluZyxcbiAgcHJvamVjdFJvb3Q6IHN0cmluZyxcbiAgZmlsZXM6IFByb2plY3RGaWxlW11cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBpdGVtcyA9IGZzLnJlYWRkaXJTeW5jKGRpcilcbiAgXG4gIC8vIFRleHQtYmFzZWQgZmlsZSBleHRlbnNpb25zIHRvIGluY2x1ZGUgaW4gY29udGVudCBidW5kbGVcbiAgY29uc3QgVEVYVF9FWFRFTlNJT05TID0gWycuc3ZnJywgJy5qc29uJywgJy5jc3MnXVxuICBcbiAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7XG4gICAgY29uc3QgZnVsbFBhdGggPSBwYXRoLmpvaW4oZGlyLCBpdGVtKVxuICAgIGNvbnN0IHN0YXQgPSBmcy5zdGF0U3luYyhmdWxsUGF0aClcbiAgICBcbiAgICBpZiAoc3RhdC5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICBhd2FpdCBzY2FuUHVibGljQXNzZXRzKGZ1bGxQYXRoLCBwcm9qZWN0Um9vdCwgZmlsZXMpXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGV4dCA9IHBhdGguZXh0bmFtZShpdGVtKS50b0xvd2VyQ2FzZSgpXG4gICAgICBpZiAoVEVYVF9FWFRFTlNJT05TLmluY2x1ZGVzKGV4dCkpIHtcbiAgICAgICAgLy8gT25seSBpbmNsdWRlIHRleHQtYmFzZWQgYXNzZXRzIGluIGNvbnRlbnQgYnVuZGxlXG4gICAgICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHBhdGgucmVsYXRpdmUocHJvamVjdFJvb3QsIGZ1bGxQYXRoKVxuICAgICAgICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKGZ1bGxQYXRoLCAndXRmLTgnKVxuICAgICAgICBcbiAgICAgICAgZmlsZXMucHVzaCh7XG4gICAgICAgICAgcGF0aDogcmVsYXRpdmVQYXRoLFxuICAgICAgICAgIGNvbnRlbnQsXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQ29sbGVjdCBiaW5hcnkgYXNzZXRzIGZyb20gYXNzZXRzIGZvbGRlclxuICovXG5hc3luYyBmdW5jdGlvbiBjb2xsZWN0QXNzZXRzKHByb2plY3RSb290OiBzdHJpbmcpOiBQcm9taXNlPEFzc2V0RmlsZVtdPiB7XG4gIGNvbnN0IGFzc2V0czogQXNzZXRGaWxlW10gPSBbXVxuICBcbiAgLy8gQ2hlY2sgYXNzZXRzIGZvbGRlclxuICBjb25zdCBhc3NldHNEaXIgPSBwYXRoLmpvaW4ocHJvamVjdFJvb3QsICdhc3NldHMnKVxuICBpZiAoZnMuZXhpc3RzU3luYyhhc3NldHNEaXIpKSB7XG4gICAgYXdhaXQgc2NhbkJpbmFyeUFzc2V0cyhhc3NldHNEaXIsIHByb2plY3RSb290LCBhc3NldHMpXG4gIH1cbiAgXG4gIHJldHVybiBhc3NldHNcbn1cblxuLyoqXG4gKiBSZWN1cnNpdmVseSBzY2FuIGZvciBiaW5hcnkgYXNzZXRzXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHNjYW5CaW5hcnlBc3NldHMoXG4gIGRpcjogc3RyaW5nLFxuICBwcm9qZWN0Um9vdDogc3RyaW5nLFxuICBhc3NldHM6IEFzc2V0RmlsZVtdXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgaXRlbXMgPSBmcy5yZWFkZGlyU3luYyhkaXIpXG4gIFxuICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHtcbiAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGguam9pbihkaXIsIGl0ZW0pXG4gICAgY29uc3Qgc3RhdCA9IGZzLnN0YXRTeW5jKGZ1bGxQYXRoKVxuICAgIFxuICAgIGlmIChzdGF0LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgIGF3YWl0IHNjYW5CaW5hcnlBc3NldHMoZnVsbFBhdGgsIHByb2plY3RSb290LCBhc3NldHMpXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGV4dCA9IHBhdGguZXh0bmFtZShpdGVtKS50b0xvd2VyQ2FzZSgpXG4gICAgICBpZiAoQklOQVJZX0VYVEVOU0lPTlMuaW5jbHVkZXMoZXh0KSkge1xuICAgICAgICAvLyBDaGVjayBzaXplIGxpbWl0XG4gICAgICAgIGlmIChzdGF0LnNpemUgPiBNQVhfQVNTRVRfU0laRSkge1xuICAgICAgICAgIGxvZ2dlci53YXJuKGBTa2lwcGluZyAke2l0ZW19OiBleGNlZWRzIDI1TUIgbGltaXQgKCR7Zm9ybWF0U2l6ZShzdGF0LnNpemUpfSlgKVxuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHBhdGgucmVsYXRpdmUocHJvamVjdFJvb3QsIGZ1bGxQYXRoKVxuICAgICAgICBhc3NldHMucHVzaCh7XG4gICAgICAgICAgcGF0aDogcmVsYXRpdmVQYXRoLFxuICAgICAgICAgIGZ1bGxQYXRoLFxuICAgICAgICAgIHNpemU6IHN0YXQuc2l6ZSxcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBVcGxvYWQgYXNzZXRzIHdpdGggcHJvZ3Jlc3MgdHJhY2tpbmdcbiAqL1xuYXN5bmMgZnVuY3Rpb24gdXBsb2FkQXNzZXRzKFxuICBhc3NldHM6IEFzc2V0RmlsZVtdLFxuICBhcGlVcmw6IHN0cmluZyxcbiAgc2x1Zzogc3RyaW5nLFxuICBhcGlLZXk6IHN0cmluZ1xuKTogUHJvbWlzZTxBcnJheTx7IGZpbGU6IHN0cmluZzsgc3VjY2VzczogYm9vbGVhbjsgdXJsPzogc3RyaW5nOyBlcnJvcj86IHN0cmluZyB9Pj4ge1xuICBjb25zdCByZXN1bHRzOiBBcnJheTx7IGZpbGU6IHN0cmluZzsgc3VjY2VzczogYm9vbGVhbjsgdXJsPzogc3RyaW5nOyBlcnJvcj86IHN0cmluZyB9PiA9IFtdXG4gIFxuICBmb3IgKGNvbnN0IGFzc2V0IG9mIGFzc2V0cykge1xuICAgIGNvbnN0IGZpbGVOYW1lID0gcGF0aC5iYXNlbmFtZShhc3NldC5wYXRoKVxuICAgIFxuICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKGAgICR7ZmlsZU5hbWV9OiBgKVxuICAgIFxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB1cGxvYWRBc3NldFdpdGhQcm9ncmVzcyhcbiAgICAgICAgYXNzZXQsXG4gICAgICAgIGFwaVVybCxcbiAgICAgICAgc2x1ZyxcbiAgICAgICAgYXBpS2V5LFxuICAgICAgICAocHJvZ3Jlc3MsIGxvYWRlZCwgdG90YWwpID0+IHtcbiAgICAgICAgICBpZiAocHJvY2Vzcy5zdGRvdXQuaXNUVFkpIHtcbiAgICAgICAgICAgIHByb2Nlc3Muc3Rkb3V0LmNsZWFyTGluZSgwKVxuICAgICAgICAgICAgcHJvY2Vzcy5zdGRvdXQuY3Vyc29yVG8oMClcbiAgICAgICAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKGAgICR7ZmlsZU5hbWV9OiAke2NyZWF0ZVByb2dyZXNzQmFyKHByb2dyZXNzKX0gJHtmb3JtYXRTaXplKGxvYWRlZCl9LyR7Zm9ybWF0U2l6ZSh0b3RhbCl9YClcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIClcbiAgICAgIFxuICAgICAgaWYgKHByb2Nlc3Muc3Rkb3V0LmlzVFRZKSB7XG4gICAgICAgIHByb2Nlc3Muc3Rkb3V0LmNsZWFyTGluZSgwKVxuICAgICAgICBwcm9jZXNzLnN0ZG91dC5jdXJzb3JUbygwKVxuICAgICAgfVxuICAgICAgY29uc29sZS5sb2coYCAgJHtsb2dnZXIuZ3JlZW4oJ+KckycpfSAke2ZpbGVOYW1lfSAoJHtmb3JtYXRTaXplKGFzc2V0LnNpemUpfSlgKVxuICAgICAgXG4gICAgICByZXN1bHRzLnB1c2goeyBmaWxlOiBmaWxlTmFtZSwgc3VjY2VzczogdHJ1ZSwgdXJsOiByZXN1bHQudXJsIH0pXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcilcbiAgICAgIFxuICAgICAgaWYgKHByb2Nlc3Muc3Rkb3V0LmlzVFRZKSB7XG4gICAgICAgIHByb2Nlc3Muc3Rkb3V0LmNsZWFyTGluZSgwKVxuICAgICAgICBwcm9jZXNzLnN0ZG91dC5jdXJzb3JUbygwKVxuICAgICAgfVxuICAgICAgY29uc29sZS5sb2coYCAgJHtsb2dnZXIucmVkKCfinJcnKX0gJHtmaWxlTmFtZX06ICR7bWVzc2FnZX1gKVxuICAgICAgXG4gICAgICByZXN1bHRzLnB1c2goeyBmaWxlOiBmaWxlTmFtZSwgc3VjY2VzczogZmFsc2UsIGVycm9yOiBtZXNzYWdlIH0pXG4gICAgfVxuICB9XG4gIFxuICByZXR1cm4gcmVzdWx0c1xufVxuXG4vKipcbiAqIFVwbG9hZCBhIHNpbmdsZSBhc3NldCB3aXRoIHByb2dyZXNzXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHVwbG9hZEFzc2V0V2l0aFByb2dyZXNzKFxuICBhc3NldDogQXNzZXRGaWxlLFxuICBhcGlVcmw6IHN0cmluZyxcbiAgc2x1Zzogc3RyaW5nLFxuICBhcGlLZXk6IHN0cmluZyxcbiAgb25Qcm9ncmVzczogKHByb2dyZXNzOiBudW1iZXIsIGxvYWRlZDogbnVtYmVyLCB0b3RhbDogbnVtYmVyKSA9PiB2b2lkXG4pOiBQcm9taXNlPHsgdXJsOiBzdHJpbmcgfT4ge1xuICBjb25zdCBmaWxlQnVmZmVyID0gZnMucmVhZEZpbGVTeW5jKGFzc2V0LmZ1bGxQYXRoKVxuICBjb25zdCBmaWxlTmFtZSA9IHBhdGguYmFzZW5hbWUoYXNzZXQucGF0aClcbiAgY29uc3QgbWltZVR5cGUgPSBnZXRNaW1lVHlwZShhc3NldC5mdWxsUGF0aClcbiAgXG4gIC8vIEJ1aWxkIG11bHRpcGFydCBmb3JtIGRhdGFcbiAgY29uc3QgYm91bmRhcnkgPSBgLS0tLURldkRvY0RlcGxveSR7RGF0ZS5ub3coKX1gXG4gIGNvbnN0IENSTEYgPSAnXFxyXFxuJ1xuICBcbiAgY29uc3QgaGVhZGVyID0gW1xuICAgIGAtLSR7Ym91bmRhcnl9YCxcbiAgICBgQ29udGVudC1EaXNwb3NpdGlvbjogZm9ybS1kYXRhOyBuYW1lPVwiZmlsZVwiOyBmaWxlbmFtZT1cIiR7ZmlsZU5hbWV9XCJgLFxuICAgIGBDb250ZW50LVR5cGU6ICR7bWltZVR5cGV9YCxcbiAgICAnJyxcbiAgICAnJ1xuICBdLmpvaW4oQ1JMRilcbiAgXG4gIGNvbnN0IHNsdWdQYXJ0ID0gW1xuICAgICcnLFxuICAgIGAtLSR7Ym91bmRhcnl9YCxcbiAgICBgQ29udGVudC1EaXNwb3NpdGlvbjogZm9ybS1kYXRhOyBuYW1lPVwic2x1Z1wiYCxcbiAgICAnJyxcbiAgICBzbHVnLFxuICAgICcnXG4gIF0uam9pbihDUkxGKVxuICBcbiAgY29uc3QgcGF0aFBhcnQgPSBbXG4gICAgYC0tJHtib3VuZGFyeX1gLFxuICAgIGBDb250ZW50LURpc3Bvc2l0aW9uOiBmb3JtLWRhdGE7IG5hbWU9XCJwYXRoXCJgLFxuICAgICcnLFxuICAgIGFzc2V0LnBhdGgucmVwbGFjZSgvXmFzc2V0c1xcLy8sICcnKSwgLy8gUmVtb3ZlIGFzc2V0cy8gcHJlZml4XG4gICAgJydcbiAgXS5qb2luKENSTEYpXG4gIFxuICBjb25zdCBmb290ZXIgPSBgJHtDUkxGfS0tJHtib3VuZGFyeX0tLSR7Q1JMRn1gXG4gIFxuICBjb25zdCBoZWFkZXJCdWZmZXIgPSBCdWZmZXIuZnJvbShoZWFkZXIpXG4gIGNvbnN0IHNsdWdCdWZmZXIgPSBCdWZmZXIuZnJvbShzbHVnUGFydClcbiAgY29uc3QgcGF0aEJ1ZmZlciA9IEJ1ZmZlci5mcm9tKHBhdGhQYXJ0KVxuICBjb25zdCBmb290ZXJCdWZmZXIgPSBCdWZmZXIuZnJvbShmb290ZXIpXG4gIFxuICBjb25zdCB0b3RhbFNpemUgPSBoZWFkZXJCdWZmZXIubGVuZ3RoICsgZmlsZUJ1ZmZlci5sZW5ndGggKyBzbHVnQnVmZmVyLmxlbmd0aCArIHBhdGhCdWZmZXIubGVuZ3RoICsgZm9vdGVyQnVmZmVyLmxlbmd0aFxuICBjb25zdCBib2R5ID0gQnVmZmVyLmNvbmNhdChbaGVhZGVyQnVmZmVyLCBmaWxlQnVmZmVyLCBzbHVnQnVmZmVyLCBwYXRoQnVmZmVyLCBmb290ZXJCdWZmZXJdKVxuICBcbiAgLy8gU2ltdWxhdGUgcHJvZ3Jlc3NcbiAgbGV0IHVwbG9hZGVkID0gMFxuICBjb25zdCBjaHVua1NpemUgPSBNYXRoLmNlaWwodG90YWxTaXplIC8gMjApXG4gIFxuICBjb25zdCBwcm9ncmVzc0ludGVydmFsID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgIGlmICh1cGxvYWRlZCA8IHRvdGFsU2l6ZSAqIDAuOSkge1xuICAgICAgdXBsb2FkZWQgPSBNYXRoLm1pbih1cGxvYWRlZCArIGNodW5rU2l6ZSwgdG90YWxTaXplICogMC45KVxuICAgICAgb25Qcm9ncmVzcyh1cGxvYWRlZCAvIHRvdGFsU2l6ZSwgdXBsb2FkZWQsIHRvdGFsU2l6ZSlcbiAgICB9XG4gIH0sIDUwKVxuICBcbiAgdHJ5IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGAke2FwaVVybH0vYXBpL2Fzc2V0cy91cGxvYWRgLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgJ0NvbnRlbnQtVHlwZSc6IGBtdWx0aXBhcnQvZm9ybS1kYXRhOyBib3VuZGFyeT0ke2JvdW5kYXJ5fWAsXG4gICAgICAgICdBdXRob3JpemF0aW9uJzogYEJlYXJlciAke2FwaUtleX1gLFxuICAgICAgfSxcbiAgICAgIGJvZHksXG4gICAgfSlcbiAgICBcbiAgICBjbGVhckludGVydmFsKHByb2dyZXNzSW50ZXJ2YWwpXG4gICAgb25Qcm9ncmVzcygxLCB0b3RhbFNpemUsIHRvdGFsU2l6ZSlcbiAgICBcbiAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICBjb25zdCBlcnJvciA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKS5jYXRjaCgoKSA9PiAoeyBlcnJvcjogJ1VwbG9hZCBmYWlsZWQnIH0pKSBhcyB7IGVycm9yPzogc3RyaW5nIH1cbiAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvci5lcnJvciB8fCBgSFRUUCAke3Jlc3BvbnNlLnN0YXR1c31gKVxuICAgIH1cbiAgICBcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXNwb25zZS5qc29uKCkgYXMgeyB1cmw6IHN0cmluZyB9XG4gICAgcmV0dXJuIHJlc3VsdFxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNsZWFySW50ZXJ2YWwocHJvZ3Jlc3NJbnRlcnZhbClcbiAgICB0aHJvdyBlcnJvclxuICB9XG59XG5cbi8qKlxuICogRm9ybWF0IGZpbGUgc2l6ZSBmb3IgZGlzcGxheVxuICovXG5mdW5jdGlvbiBmb3JtYXRTaXplKGJ5dGVzOiBudW1iZXIpOiBzdHJpbmcge1xuICBpZiAoYnl0ZXMgPCAxMDI0KSByZXR1cm4gYCR7Ynl0ZXN9IEJgXG4gIGlmIChieXRlcyA8IDEwMjQgKiAxMDI0KSByZXR1cm4gYCR7KGJ5dGVzIC8gMTAyNCkudG9GaXhlZCgxKX0gS0JgXG4gIHJldHVybiBgJHsoYnl0ZXMgLyAoMTAyNCAqIDEwMjQpKS50b0ZpeGVkKDIpfSBNQmBcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBwcm9ncmVzcyBiYXIgc3RyaW5nXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVByb2dyZXNzQmFyKHByb2dyZXNzOiBudW1iZXIsIHdpZHRoOiBudW1iZXIgPSAzMCk6IHN0cmluZyB7XG4gIGNvbnN0IGZpbGxlZCA9IE1hdGgucm91bmQod2lkdGggKiBwcm9ncmVzcylcbiAgY29uc3QgZW1wdHkgPSB3aWR0aCAtIGZpbGxlZFxuICBjb25zdCBiYXIgPSAn4paIJy5yZXBlYXQoZmlsbGVkKSArICfilpEnLnJlcGVhdChlbXB0eSlcbiAgY29uc3QgcGVyY2VudGFnZSA9IE1hdGgucm91bmQocHJvZ3Jlc3MgKiAxMDApXG4gIHJldHVybiBgWyR7YmFyfV0gJHtwZXJjZW50YWdlfSVgXG59XG4iXX0=
|
|
807
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVwbG95LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NsaS9jb21tYW5kcy9kZXBsb3kudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFvUUEsd0JBMlNDO0FBL2lCRCxnREFBdUI7QUFDdkIsd0RBQXlCO0FBQ3pCLHlDQUF5RDtBQUN6RCwrQ0FBMkM7QUFDM0MsK0NBQWlEO0FBRWpELHVCQUF1QjtBQUN2QixNQUFNLGNBQWMsR0FBRyxFQUFFLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQTtBQUV2QywrQ0FBK0M7QUFDL0MsTUFBTSxpQkFBaUIsR0FBRztJQUN4QixNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNO0lBQ3hELE1BQU0sRUFBRSxPQUFPLEVBQUUsTUFBTTtJQUN2QixNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU07SUFDdEIsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU07SUFDekMsTUFBTTtDQUNQLENBQUE7QUFFRCxvQ0FBb0M7QUFDcEMsTUFBTSxVQUFVLEdBQTJCO0lBQ3pDLFNBQVM7SUFDVCxNQUFNLEVBQUUsV0FBVztJQUNuQixNQUFNLEVBQUUsWUFBWTtJQUNwQixPQUFPLEVBQUUsWUFBWTtJQUNyQixNQUFNLEVBQUUsV0FBVztJQUNuQixPQUFPLEVBQUUsWUFBWTtJQUNyQixNQUFNLEVBQUUsY0FBYztJQUN0QixNQUFNLEVBQUUsZUFBZTtJQUN2QixTQUFTO0lBQ1QsTUFBTSxFQUFFLFdBQVc7SUFDbkIsT0FBTyxFQUFFLFlBQVk7SUFDckIsTUFBTSxFQUFFLGlCQUFpQjtJQUN6QixRQUFRO0lBQ1IsTUFBTSxFQUFFLFlBQVk7SUFDcEIsTUFBTSxFQUFFLFdBQVc7SUFDbkIsTUFBTSxFQUFFLFdBQVc7SUFDbkIsUUFBUTtJQUNSLE9B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R0FBRyxJQUFJLEdBQUcsSUFBSTtRQUFFLE9BQU8sR0FBRyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQTtJQUNqRSxPQUFPLEdBQUcsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQTtBQUNuRCxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxTQUFTLGlCQUFpQixDQUFDLFFBQWdCLEVBQUUsUUFBZ0IsRUFBRTtJQUM3RCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUMsQ0FBQTtJQUMzQyxNQUFNLEtBQUssR0FBRyxLQUFLLEdBQUcsTUFBTSxDQUFBO0lBQzVCLE1BQU0sR0FBRyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUNsRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsR0FBRyxHQUFHLENBQUMsQ0FBQTtJQUM3QyxPQUFPLElBQUksR0FBRyxLQUFLLFVBQVUsR0FBRyxDQUFBO0FBQ2xDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgcGF0aCBmcm9tICdwYXRoJ1xuaW1wb3J0IGZzIGZyb20gJ2ZzLWV4dHJhJ1xuaW1wb3J0IHsgbG9hZENvbmZpZywgdmFsaWRhdGVDb25maWcgfSBmcm9tICcuLi8uLi9jb25maWcnXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi8uLi91dGlscy9sb2dnZXInXG5pbXBvcnQgeyBERUZBVUxUX0FQSV9VUkwgfSBmcm9tICcuLi8uLi9jb25zdGFudHMnXG5cbi8vIE1heCBhc3NldCBzaXplOiAyNU1CXG5jb25zdCBNQVhfQVNTRVRfU0laRSA9IDI1ICogMTAyNCAqIDEwMjRcblxuLy8gQmluYXJ5IGFzc2V0IGV4dGVuc2lvbnMgdG8gdXBsb2FkIHNlcGFyYXRlbHlcbmNvbnN0IEJJTkFSWV9FWFRFTlNJT05TID0gW1xuICAnLnBuZycsICcuanBnJywgJy5qcGVnJywgJy5naWYnLCAnLndlYnAnLCAnLmljbycsICcuc3ZnJyxcbiAgJy5tcDQnLCAnLndlYm0nLCAnLm1vdicsXG4gICcubXAzJywgJy53YXYnLCAnLm9nZycsXG4gICcud29mZicsICcud29mZjInLCAnLnR0ZicsICcub3RmJywgJy5lb3QnLFxuICAnLnBkZicsXG5dXG5cbi8vIE1hcCBmaWxlIGV4dGVuc2lvbnMgdG8gTUlNRSB0eXBlc1xuY29uc3QgTUlNRV9UWVBFUzogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgLy8gSW1hZ2VzXG4gICcucG5nJzogJ2ltYWdlL3BuZycsXG4gICcuanBnJzogJ2ltYWdlL2pwZWcnLFxuICAnLmpwZWcnOiAnaW1hZ2UvanBlZycsXG4gICcuZ2lmJzogJ2ltYWdlL2dpZicsXG4gICcud2VicCc6ICdpbWFnZS93ZWJwJyxcbiAgJy5pY28nOiAnaW1hZ2UveC1pY29uJyxcbiAgJy5zdmcnOiAnaW1hZ2Uvc3ZnK3htbCcsXG4gIC8vIFZpZGVvc1xuICAnLm1wNCc6ICd2aWRlby9tcDQnLFxuICAnLndlYm0nOiAndmlkZW8vd2VibScsXG4gICcubW92JzogJ3ZpZGVvL3F1aWNrdGltZScsXG4gIC8vIEF1ZGlvXG4gICcubXAzJzogJ2F1ZGlvL21wZWcnLFxuICAnLndhdic6ICdhdWRpby93YXYnLFxuICAnLm9nZyc6ICdhdWRpby9vZ2cnLFxuICAvLyBGb250c1xuICAnLndvZmYnOiAnZm9udC93b2ZmJyxcbiAgJy53b2ZmMic6ICdmb250L3dvZmYyJyxcbiAgJy50dGYnOiAnZm9udC90dGYnLFxuICAnLm90Zic6ICdmb250L290ZicsXG4gICcuZW90JzogJ2FwcGxpY2F0aW9uL3ZuZC5tcy1mb250b2JqZWN0JyxcbiAgLy8gRG9jdW1lbnRzXG4gICcucGRmJzogJ2FwcGxpY2F0aW9uL3BkZicsXG59XG5cbi8qKlxuICogR2V0IE1JTUUgdHlwZSBmcm9tIGZpbGUgZXh0ZW5zaW9uXG4gKi9cbmZ1bmN0aW9uIGdldE1pbWVUeXBlKGZpbGVQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBleHQgPSBwYXRoLmV4dG5hbWUoZmlsZVBhdGgpLnRvTG93ZXJDYXNlKClcbiAgcmV0dXJuIE1JTUVfVFlQRVNbZXh0XSB8fCAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJ1xufVxuXG5pbnRlcmZhY2UgRGVwbG95T3B0aW9ucyB7XG4gIHVybD86IHN0cmluZ1xuICBhcGlLZXk/OiBzdHJpbmdcbn1cblxuaW50ZXJmYWNlIFByb2plY3RGaWxlIHtcbiAgcGF0aDogc3RyaW5nXG4gIGNvbnRlbnQ6IHN0cmluZ1xufVxuXG5pbnRlcmZhY2UgT3BlbkFwaVNwZWMge1xuICBba2V5OiBzdHJpbmddOiB1bmtub3duXG59XG5cbmludGVyZmFjZSBBc3NldEZpbGUge1xuICBwYXRoOiBzdHJpbmdcbiAgZnVsbFBhdGg6IHN0cmluZ1xuICBzaXplOiBudW1iZXJcbn1cblxuaW50ZXJmYWNlIERldkRvY0NvbmZpZyB7XG4gIHByb2plY3RJZD86IHN0cmluZ1xuICBuYW1lPzogc3RyaW5nXG4gIHNsdWc/OiBzdHJpbmdcbiAgc3ViZG9tYWluPzogc3RyaW5nXG4gIGFwaUtleT86IHN0cmluZ1xuICB1cmw/OiBzdHJpbmdcbiAgbGFzdERlcGxveWVkPzogc3RyaW5nXG4gIGNyZWF0ZWRBdD86IHN0cmluZ1xufVxuXG5pbnRlcmZhY2UgUmVnaXN0ZXJSZXNwb25zZSB7XG4gIHN1Y2Nlc3M6IGJvb2xlYW5cbiAgcHJvamVjdElkOiBzdHJpbmdcbiAgc2x1Zzogc3RyaW5nXG4gIHN1YmRvbWFpbjogc3RyaW5nXG4gIGFwaUtleTogc3RyaW5nXG4gIHVybDogc3RyaW5nXG4gIGVycm9yPzogc3RyaW5nXG59XG5cbmludGVyZmFjZSBDaGVja1N1YmRvbWFpblJlc3BvbnNlIHtcbiAgYXZhaWxhYmxlOiBib29sZWFuXG4gIGVycm9yPzogc3RyaW5nXG4gIHN1Z2dlc3Rpb24/OiBzdHJpbmdcbn1cblxuLy8gU2ltcGxlIHByb21wdCBoZWxwZXIgdXNpbmcgcmVhZGxpbmVcbmFzeW5jIGZ1bmN0aW9uIHByb21wdChxdWVzdGlvbjogc3RyaW5nLCBkZWZhdWx0VmFsdWU/OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCByZWFkbGluZSA9IGF3YWl0IGltcG9ydCgncmVhZGxpbmUnKVxuICBjb25zdCBybCA9IHJlYWRsaW5lLmNyZWF0ZUludGVyZmFjZSh7XG4gICAgaW5wdXQ6IHByb2Nlc3Muc3RkaW4sXG4gICAgb3V0cHV0OiBwcm9jZXNzLnN0ZG91dCxcbiAgfSlcblxuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBjb25zdCBkZWZhdWx0SGludCA9IGRlZmF1bHRWYWx1ZSA/IGAgKCR7ZGVmYXVsdFZhbHVlfSlgIDogJydcbiAgICBybC5xdWVzdGlvbihgJHtxdWVzdGlvbn0ke2RlZmF1bHRIaW50fTogYCwgKGFuc3dlcikgPT4ge1xuICAgICAgcmwuY2xvc2UoKVxuICAgICAgcmVzb2x2ZShhbnN3ZXIudHJpbSgpIHx8IGRlZmF1bHRWYWx1ZSB8fCAnJylcbiAgICB9KVxuICB9KVxufVxuXG4vKipcbiAqIENoZWNrIHN1YmRvbWFpbiBhdmFpbGFiaWxpdHkgdmlhIEFQSVxuICovXG5hc3luYyBmdW5jdGlvbiBjaGVja1N1YmRvbWFpbkF2YWlsYWJpbGl0eShcbiAgc3ViZG9tYWluOiBzdHJpbmcsXG4gIGFwaVVybDogc3RyaW5nXG4pOiBQcm9taXNlPENoZWNrU3ViZG9tYWluUmVzcG9uc2U+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGAke2FwaVVybH0vYXBpL3N1YmRvbWFpbnMvY2hlY2tgLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHN1YmRvbWFpbiB9KSxcbiAgICB9KVxuICAgIFxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKSBhcyBDaGVja1N1YmRvbWFpblJlc3BvbnNlXG4gICAgcmV0dXJuIHJlc3VsdFxuICB9IGNhdGNoIHtcbiAgICAvLyBJZiBBUEkgaXMgdW5hdmFpbGFibGUsIGFzc3VtZSBhdmFpbGFibGUgKHdpbGwgZmFpbCBhdCByZWdpc3RyYXRpb24gaWYgbm90KVxuICAgIHJldHVybiB7IGF2YWlsYWJsZTogdHJ1ZSB9XG4gIH1cbn1cblxuLyoqXG4gKiBCYXNpYyBzdWJkb21haW4gZm9ybWF0IHZhbGlkYXRpb25cbiAqL1xuZnVuY3Rpb24gaXNWYWxpZFN1YmRvbWFpbkZvcm1hdChzdWJkb21haW46IHN0cmluZyk6IHsgdmFsaWQ6IGJvb2xlYW47IGVycm9yPzogc3RyaW5nIH0ge1xuICBpZiAoIXN1YmRvbWFpbikge1xuICAgIHJldHVybiB7IHZhbGlkOiBmYWxzZSwgZXJyb3I6ICdTdWJkb21haW4gaXMgcmVxdWlyZWQnIH1cbiAgfVxuICBcbiAgaWYgKHN1YmRvbWFpbi5sZW5ndGggPCAzKSB7XG4gICAgcmV0dXJuIHsgdmFsaWQ6IGZhbHNlLCBlcnJvcjogJ1N1YmRvbWFpbiBtdXN0IGJlIGF0IGxlYXN0IDMgY2hhcmFjdGVycycgfVxuICB9XG4gIFxuICBpZiAoc3ViZG9tYWluLmxlbmd0aCA+IDYzKSB7XG4gICAgcmV0dXJuIHsgdmFsaWQ6IGZhbHNlLCBlcnJvcjogJ1N1YmRvbWFpbiBtdXN0IGJlIDYzIGNoYXJhY3RlcnMgb3IgbGVzcycgfVxuICB9XG4gIFxuICBpZiAoIS9eW2EtejAtOV0oW2EtejAtOS1dKlthLXowLTldKT8kLy50ZXN0KHN1YmRvbWFpbikpIHtcbiAgICByZXR1cm4geyB2YWxpZDogZmFsc2UsIGVycm9yOiAnU3ViZG9tYWluIG11c3Qgc3RhcnQgYW5kIGVuZCB3aXRoIGFscGhhbnVtZXJpYywgY2FuIGNvbnRhaW4gaHlwaGVucycgfVxuICB9XG4gIFxuICBpZiAoLy0tLy50ZXN0KHN1YmRvbWFpbikpIHtcbiAgICByZXR1cm4geyB2YWxpZDogZmFsc2UsIGVycm9yOiAnU3ViZG9tYWluIGNhbm5vdCBjb250YWluIGNvbnNlY3V0aXZlIGh5cGhlbnMnIH1cbiAgfVxuICBcbiAgcmV0dXJuIHsgdmFsaWQ6IHRydWUgfVxufVxuXG5pbnRlcmZhY2UgRG9tYWluQ29uZmlnIHtcbiAgY3VzdG9tRG9tYWluOiBzdHJpbmdcbiAgc2VvPzoge1xuICAgIGNhbm9uaWNhbD86IHN0cmluZ1xuICB9XG59XG5cbmludGVyZmFjZSBEb21haW5TdGF0dXNSZXNwb25zZSB7XG4gIGhhc0N1c3RvbURvbWFpbjogYm9vbGVhblxuICBkb21haW4/OiBzdHJpbmdcbiAgc3RhdHVzPzogc3RyaW5nXG4gIGN1c3RvbVVybD86IHN0cmluZ1xuICBtZXNzYWdlPzogc3RyaW5nXG4gIG5leHRTdGVwPzogc3RyaW5nXG59XG5cbi8qKlxuICogQ2hlY2sgZm9yIGRvbWFpbi5qc29uIGFuZCBkaXNwbGF5IGN1c3RvbSBkb21haW4gc3RhdHVzXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNoZWNrQ3VzdG9tRG9tYWluU3RhdHVzKFxuICBwcm9qZWN0Um9vdDogc3RyaW5nLFxuICBhcGlVcmw6IHN0cmluZyxcbiAgYXBpS2V5OiBzdHJpbmdcbik6IFByb21pc2U8dm9pZD4ge1xuICAvLyBDaGVjayBpZiBkb21haW4uanNvbiBleGlzdHNcbiAgY29uc3QgZG9tYWluQ29uZmlnUGF0aCA9IHBhdGguam9pbihwcm9qZWN0Um9vdCwgJ2RvbWFpbi5qc29uJylcbiAgXG4gIGlmICghZnMuZXhpc3RzU3luYyhkb21haW5Db25maWdQYXRoKSkge1xuICAgIHJldHVybiAvLyBObyBkb21haW4uanNvbiwgbm90aGluZyB0byBkb1xuICB9XG4gIFxuICBsZXQgZG9tYWluQ29uZmlnOiBEb21haW5Db25maWdcbiAgdHJ5IHtcbiAgICBkb21haW5Db25maWcgPSBmcy5yZWFkSnNvblN5bmMoZG9tYWluQ29uZmlnUGF0aCkgYXMgRG9tYWluQ29uZmlnXG4gIH0gY2F0Y2gge1xuICAgIGxvZ2dlci53YXJuKCdGb3VuZCBkb21haW4uanNvbiBidXQgZmFpbGVkIHRvIHBhcnNlIGl0JylcbiAgICByZXR1cm5cbiAgfVxuICBcbiAgaWYgKCFkb21haW5Db25maWcuY3VzdG9tRG9tYWluKSB7XG4gICAgcmV0dXJuXG4gIH1cbiAgXG4gIGNvbnNvbGUubG9nKCcnKVxuICBsb2dnZXIuaW5mbyhgQ3VzdG9tIGRvbWFpbiBjb25maWd1cmVkOiAke2RvbWFpbkNvbmZpZy5jdXN0b21Eb21haW59YClcbiAgXG4gIC8vIENoZWNrIGRvbWFpbiBzdGF0dXMgdmlhIEFQSVxuICBpZiAoIWFwaUtleSkge1xuICAgIGxvZ2dlci5pbmZvKCdSdW4gXCJkZXZkb2MgZG9tYWluIHN0YXR1c1wiIHRvIGNoZWNrIEROUyBjb25maWd1cmF0aW9uJylcbiAgICByZXR1cm5cbiAgfVxuICBcbiAgdHJ5IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGAke2FwaVVybH0vYXBpL2RvbWFpbnMvc3RhdHVzYCwge1xuICAgICAgbWV0aG9kOiAnR0VUJyxcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgJ0F1dGhvcml6YXRpb24nOiBgQmVhcmVyICR7YXBpS2V5fWAsXG4gICAgICB9LFxuICAgIH0pXG4gICAgXG4gICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIFxuICAgIGNvbnN0IHN0YXR1cyA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKSBhcyBEb21haW5TdGF0dXNSZXNwb25zZVxuICAgIFxuICAgIGlmICghc3RhdHVzLmhhc0N1c3RvbURvbWFpbikge1xuICAgICAgLy8gRG9tYWluIGluIGNvbmZpZyBidXQgbm90IHJlZ2lzdGVyZWQgeWV0XG4gICAgICBjb25zb2xlLmxvZygnJylcbiAgICAgIGxvZ2dlci5pbmZvKCdDdXN0b20gZG9tYWluIG5vdCB5ZXQgcmVnaXN0ZXJlZC4nKVxuICAgICAgbG9nZ2VyLmluZm8oJ1J1biBcImRldmRvYyBkb21haW4gYWRkICcgKyBkb21haW5Db25maWcuY3VzdG9tRG9tYWluICsgJ1wiIHRvIHNldCBpdCB1cCcpXG4gICAgfSBlbHNlIGlmIChzdGF0dXMuc3RhdHVzID09PSAnYWN0aXZlJykge1xuICAgICAgY29uc29sZS5sb2coJycpXG4gICAgICBjb25zb2xlLmxvZyhgICBBbHNvIGxpdmUgYXQ6ICR7bG9nZ2VyLmN5YW4oc3RhdHVzLmN1c3RvbVVybCB8fCBgaHR0cHM6Ly8ke3N0YXR1cy5kb21haW59YCl9YClcbiAgICB9IGVsc2UgaWYgKHN0YXR1cy5zdGF0dXMgPT09ICdwZW5kaW5nJykge1xuICAgICAgY29uc29sZS5sb2coJycpXG4gICAgICBsb2dnZXIud2FybignQ3VzdG9tIGRvbWFpbiBwZW5kaW5nIEROUyBjb25maWd1cmF0aW9uJylcbiAgICAgIGxvZ2dlci5pbmZvKCdSdW4gXCJkZXZkb2MgZG9tYWluIHN0YXR1c1wiIGZvciBETlMgc2V0dXAgaW5zdHJ1Y3Rpb25zJylcbiAgICB9IGVsc2UgaWYgKHN0YXR1cy5zdGF0dXMgPT09ICdkbnNfdmVyaWZpZWQnIHx8IHN0YXR1cy5zdGF0dXMgPT09ICdzc2xfcHJvdmlzaW9uaW5nJykge1xuICAgICAgY29uc29sZS5sb2coJycpXG4gICAgICBsb2dnZXIuaW5mbygnQ3VzdG9tIGRvbWFpbiBETlMgdmVyaWZpZWQsIFNTTCBjZXJ0aWZpY2F0ZSBwcm92aXNpb25pbmcuLi4nKVxuICAgIH1cbiAgICBcbiAgfSBjYXRjaCB7XG4gICAgLy8gSWdub3JlIGVycm9ycywgZG9tYWluIHN0YXR1cyBpcyBpbmZvcm1hdGlvbmFsXG4gIH1cbn1cblxuLyoqXG4gKiBEZXBsb3kgZG9jdW1lbnRhdGlvbiB0byBEZXZEb2MgcGxhdGZvcm1cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlcGxveShvcHRpb25zOiBEZXBsb3lPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHByb2plY3RSb290ID0gcHJvY2Vzcy5jd2QoKVxuICBjb25zdCBhcGlVcmwgPSBvcHRpb25zLnVybCB8fCBwcm9jZXNzLmVudi5ERVZET0NfQVBJX1VSTCB8fCBERUZBVUxUX0FQSV9VUkxcbiAgXG4gIGxvZ2dlci5pbmZvKCdEZXBsb3lpbmcgdG8gRGV2RG9jLi4uXFxuJylcbiAgXG4gIC8vIENoZWNrIGZvciBkb2NzLmpzb25cbiAgY29uc3QgY29uZmlnUGF0aCA9IHBhdGguam9pbihwcm9qZWN0Um9vdCwgJ2RvY3MuanNvbicpXG4gIGlmICghZnMuZXhpc3RzU3luYyhjb25maWdQYXRoKSkge1xuICAgIGxvZ2dlci5lcnJvcignZG9jcy5qc29uIG5vdCBmb3VuZCBpbiBjdXJyZW50IGRpcmVjdG9yeScpXG4gICAgbG9nZ2VyLmluZm8oJ01ha2Ugc3VyZSB5b3UgYXJlIGluIGEgRGV2RG9jIGRvY3VtZW50YXRpb24gcHJvamVjdCBkaXJlY3RvcnknKVxuICAgIHByb2Nlc3MuZXhpdCgxKVxuICB9XG4gIFxuICAvLyBMb2FkIGFuZCB2YWxpZGF0ZSBjb25maWd1cmF0aW9uXG4gIGxldCBjb25maWc6IFJldHVyblR5cGU8dHlwZW9mIGxvYWRDb25maWc+IGV4dGVuZHMgUHJvbWlzZTxpbmZlciBUPiA/IFQgOiBuZXZlclxuICB0cnkge1xuICAgIGNvbmZpZyA9IGF3YWl0IGxvYWRDb25maWcocHJvamVjdFJvb3QpXG4gICAgY29uc3QgdmFsaWRhdGlvbiA9IHZhbGlkYXRlQ29uZmlnKGNvbmZpZylcbiAgICBcbiAgICBpZiAoIXZhbGlkYXRpb24udmFsaWQpIHtcbiAgICAgIGxvZ2dlci5lcnJvcignSW52YWxpZCBkb2NzLmpzb24gY29uZmlndXJhdGlvbjonKVxuICAgICAgdmFsaWRhdGlvbi5lcnJvcnMuZm9yRWFjaChlcnIgPT4gbG9nZ2VyLmVycm9yKGAgIC0gJHtlcnJ9YCkpXG4gICAgICBwcm9jZXNzLmV4aXQoMSlcbiAgICB9XG4gICAgXG4gICAgbG9nZ2VyLnN1Y2Nlc3MoYOKckyBDb25maWd1cmF0aW9uIHZhbGlkOiAke2NvbmZpZy5uYW1lIHx8ICdVbnRpdGxlZCd9YClcbiAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICBjb25zdCBtZXNzYWdlID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpXG4gICAgbG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gbG9hZCBjb25maWd1cmF0aW9uOiAke21lc3NhZ2V9YClcbiAgICBwcm9jZXNzLmV4aXQoMSlcbiAgfVxuICBcbiAgLy8gQ2hlY2sgZm9yIGV4aXN0aW5nIHByb2plY3QgY29uZmlnXG4gIGNvbnN0IGRldmRvY0NvbmZpZ1BhdGggPSBwYXRoLmpvaW4ocHJvamVjdFJvb3QsICcuZGV2ZG9jLmpzb24nKVxuICBsZXQgZGV2ZG9jQ29uZmlnOiBEZXZEb2NDb25maWcgfCBudWxsID0gbnVsbFxuICBsZXQgZXhpc3RpbmdTbHVnOiBzdHJpbmcgfCBudWxsID0gbnVsbFxuICBsZXQgZXhpc3RpbmdBcGlLZXk6IHN0cmluZyB8IG51bGwgPSBudWxsXG4gIGxldCBleGlzdGluZ1N1YmRvbWFpbjogc3RyaW5nIHwgbnVsbCA9IG51bGxcbiAgXG4gIGlmIChmcy5leGlzdHNTeW5jKGRldmRvY0NvbmZpZ1BhdGgpKSB7XG4gICAgdHJ5IHtcbiAgICAgIGRldmRvY0NvbmZpZyA9IGZzLnJlYWRKc29uU3luYyhkZXZkb2NDb25maWdQYXRoKSBhcyBEZXZEb2NDb25maWdcbiAgICAgIGV4aXN0aW5nU2x1ZyA9IGRldmRvY0NvbmZpZy5zbHVnIHx8IG51bGxcbiAgICAgIGV4aXN0aW5nQXBpS2V5ID0gZGV2ZG9jQ29uZmlnLmFwaUtleSB8fCBudWxsXG4gICAgICBleGlzdGluZ1N1YmRvbWFpbiA9IGRldmRvY0NvbmZpZy5zdWJkb21haW4gfHwgbnVsbFxuICAgICAgaWYgKGV4aXN0aW5nU2x1ZyAmJiBleGlzdGluZ0FwaUtleSkge1xuICAgICAgICBsb2dnZXIuaW5mbyhgRGVwbG95aW5nIHByb2plY3Q6ICR7ZXhpc3RpbmdTbHVnfWApXG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBJZ25vcmUgZXJyb3JzIHJlYWRpbmcgLmRldmRvYy5qc29uXG4gICAgfVxuICB9XG4gIFxuICAvLyBHZXQgQVBJIGtleSBmcm9tIG9wdGlvbnMsIGVudiB2YXIsIG9yIC5kZXZkb2MuanNvblxuICBsZXQgYXBpS2V5ID0gb3B0aW9ucy5hcGlLZXkgfHwgcHJvY2Vzcy5lbnYuREVWRE9DX0FQSV9LRVkgfHwgZXhpc3RpbmdBcGlLZXlcbiAgXG4gIC8vIElmIG5vIEFQSSBrZXksIHRoaXMgaXMgYSBmaXJzdCBkZXBsb3kgLSBuZWVkIHRvIHJlZ2lzdGVyIHRoZSBzdWJkb21haW4gZmlyc3RcbiAgaWYgKCFhcGlLZXkpIHtcbiAgICAvLyBDaGVjayBpZiB3ZSBoYXZlIHN1YmRvbWFpbiBmcm9tIGluaXRcbiAgICBpZiAoIWV4aXN0aW5nU3ViZG9tYWluKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoJ05vIHByb2plY3QgY29uZmlndXJhdGlvbiBmb3VuZC4nKVxuICAgICAgY29uc29sZS5sb2coJycpXG4gICAgICBsb2dnZXIuaW5mbygnUnVuIFwiZGV2ZG9jIGluaXRcIiBmaXJzdCB0byBjb25maWd1cmUgeW91ciBwcm9qZWN0JylcbiAgICAgIGxvZ2dlci5pbmZvKCdPciBwcm92aWRlIGFuIEFQSSBrZXkgdmlhIC0tYXBpLWtleSBmbGFnIG9yIERFVkRPQ19BUElfS0VZIGVudiB2YXInKVxuICAgICAgcHJvY2Vzcy5leGl0KDEpXG4gICAgfVxuICAgIFxuICAgIGxldCBzdWJkb21haW5Ub1JlZ2lzdGVyID0gZXhpc3RpbmdTdWJkb21haW5cbiAgICBsZXQgcmVnaXN0ZXJlZCA9IGZhbHNlXG4gICAgXG4gICAgLy8gTG9vcCB1bnRpbCB3ZSBzdWNjZXNzZnVsbHkgcmVnaXN0ZXIgYSBzdWJkb21haW5cbiAgICB3aGlsZSAoIXJlZ2lzdGVyZWQpIHtcbiAgICAgIGxvZ2dlci5pbmZvKGBSZWdpc3RlcmluZyBzdWJkb21haW4gJHtzdWJkb21haW5Ub1JlZ2lzdGVyfS5kZXZkb2Muc2guLi5gKVxuICAgICAgXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZWdpc3RlclJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYCR7YXBpVXJsfS9hcGkvcHJvamVjdHMvcmVnaXN0ZXJgLCB7XG4gICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgIG5hbWU6IGRldmRvY0NvbmZpZz8ubmFtZSB8fCBjb25maWcubmFtZSB8fCAnTXkgRG9jdW1lbnRhdGlvbicsXG4gICAgICAgICAgICBzbHVnOiBzdWJkb21haW5Ub1JlZ2lzdGVyLFxuICAgICAgICAgICAgc3ViZG9tYWluOiBzdWJkb21haW5Ub1JlZ2lzdGVyLFxuICAgICAgICAgIH0pLFxuICAgICAgICB9KVxuICAgICAgICBcbiAgICAgICAgaWYgKCFyZWdpc3RlclJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgY29uc3QgZXJyb3JEYXRhID0gYXdhaXQgcmVnaXN0ZXJSZXNwb25zZS5qc29uKCkuY2F0Y2goKCkgPT4gKHsgZXJyb3I6ICdVbmtub3duIGVycm9yJyB9KSkgYXMgeyBlcnJvcj86IHN0cmluZzsgZGV0YWlscz86IHN0cmluZyB9XG4gICAgICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gZXJyb3JEYXRhLmVycm9yIHx8IGBIVFRQICR7cmVnaXN0ZXJSZXNwb25zZS5zdGF0dXN9YFxuICAgICAgICAgIFxuICAgICAgICAgIC8vIElmIHN1YmRvbWFpbiBpcyB0YWtlbiwgYXNrIGZvciBhIG5ldyBvbmVcbiAgICAgICAgICBpZiAoZXJyb3JNZXNzYWdlLmluY2x1ZGVzKCdhbHJlYWR5IGV4aXN0cycpIHx8IGVycm9yTWVzc2FnZS5pbmNsdWRlcygnYWxyZWFkeSB0YWtlbicpKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnJylcbiAgICAgICAgICAgIGxvZ2dlci53YXJuKGBTdWJkb21haW4gXCIke3N1YmRvbWFpblRvUmVnaXN0ZXJ9XCIgaXMgbm8gbG9uZ2VyIGF2YWlsYWJsZS5gKVxuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBHZXQgc3VnZ2VzdGlvbiBmcm9tIEFQSVxuICAgICAgICAgICAgY29uc3QgYXZhaWxhYmlsaXR5ID0gYXdhaXQgY2hlY2tTdWJkb21haW5BdmFpbGFiaWxpdHkoc3ViZG9tYWluVG9SZWdpc3RlciwgYXBpVXJsKVxuICAgICAgICAgICAgY29uc3Qgc3VnZ2VzdGlvbiA9IGF2YWlsYWJpbGl0eS5zdWdnZXN0aW9uIHx8IGAke3N1YmRvbWFpblRvUmVnaXN0ZXJ9LWRvY3NgXG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCcnKVxuICAgICAgICAgICAgbG9nZ2VyLmluZm8oYFN1Z2dlc3Rpb246ICR7c3VnZ2VzdGlvbn0uZGV2ZG9jLnNoYClcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCcnKVxuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBQcm9tcHQgZm9yIG5ldyBzdWJkb21haW5cbiAgICAgICAgICAgIGxldCBuZXdTdWJkb21haW4gPSBhd2FpdCBwcm9tcHQoJ0VudGVyIGEgbmV3IHN1YmRvbWFpbicsIHN1Z2dlc3Rpb24pXG4gICAgICAgICAgICBuZXdTdWJkb21haW4gPSBuZXdTdWJkb21haW4udG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9bXmEtejAtOS1dL2csICctJykucmVwbGFjZSgvXi18LSQvZywgJycpXG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIFZhbGlkYXRlIGZvcm1hdFxuICAgICAgICAgICAgY29uc3QgZm9ybWF0Q2hlY2sgPSBpc1ZhbGlkU3ViZG9tYWluRm9ybWF0KG5ld1N1YmRvbWFpbilcbiAgICAgICAgICAgIGlmICghZm9ybWF0Q2hlY2sudmFsaWQpIHtcbiAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGZvcm1hdENoZWNrLmVycm9yISlcbiAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgc3ViZG9tYWluVG9SZWdpc3RlciA9IG5ld1N1YmRvbWFpblxuICAgICAgICAgICAgY29uc29sZS5sb2coJycpXG4gICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgIH1cbiAgICAgICAgICBcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3JNZXNzYWdlKVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBjb25zdCByZWdpc3RlclJlc3VsdCA9IGF3YWl0IHJlZ2lzdGVyUmVzcG9uc2UuanNvbigpIGFzIFJlZ2lzdGVyUmVzcG9uc2VcbiAgICAgICAgXG4gICAgICAgIC8vIFVwZGF0ZSBsb2NhbCBjb25maWcgd2l0aCBBUEkga2V5XG4gICAgICAgIGFwaUtleSA9IHJlZ2lzdGVyUmVzdWx0LmFwaUtleVxuICAgICAgICBleGlzdGluZ1NsdWcgPSByZWdpc3RlclJlc3VsdC5zbHVnXG4gICAgICAgIGV4aXN0aW5nU3ViZG9tYWluID0gcmVnaXN0ZXJSZXN1bHQuc3ViZG9tYWluXG4gICAgICAgIFxuICAgICAgICAvLyBTYXZlIHRoZSB1cGRhdGVkIGNvbmZpZ1xuICAgICAgICBjb25zdCB1cGRhdGVkQ29uZmlnOiBEZXZEb2NDb25maWcgPSB7XG4gICAgICAgICAgLi4uZGV2ZG9jQ29uZmlnLFxuICAgICAgICAgIHByb2plY3RJZDogcmVnaXN0ZXJSZXN1bHQucHJvamVjdElkLFxuICAgICAgICAgIHNsdWc6IHJlZ2lzdGVyUmVzdWx0LnNsdWcsXG4gICAgICAgICAgc3ViZG9tYWluOiByZWdpc3RlclJlc3VsdC5zdWJkb21haW4sXG4gICAgICAgICAgYXBpS2V5OiByZWdpc3RlclJlc3VsdC5hcGlLZXksXG4gICAgICAgICAgdXJsOiByZWdpc3RlclJlc3VsdC51cmwsXG4gICAgICAgIH1cbiAgICAgICAgZnMud3JpdGVKc29uU3luYyhkZXZkb2NDb25maWdQYXRoLCB1cGRhdGVkQ29uZmlnLCB7IHNwYWNlczogMiB9KVxuICAgICAgICBcbiAgICAgICAgbG9nZ2VyLnN1Y2Nlc3MoYOKckyBTdWJkb21haW4gJHtyZWdpc3RlclJlc3VsdC5zdWJkb21haW59LmRldmRvYy5zaCByZWdpc3RlcmVkIWApXG4gICAgICAgIGNvbnNvbGUubG9nKCcnKVxuICAgICAgICByZWdpc3RlcmVkID0gdHJ1ZVxuICAgICAgICBcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcilcbiAgICAgICAgbG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gcmVnaXN0ZXIgc3ViZG9tYWluOiAke21lc3NhZ2V9YClcbiAgICAgICAgcHJvY2Vzcy5leGl0KDEpXG4gICAgICB9XG4gICAgfVxuICB9XG4gIFxuICAvLyBDb2xsZWN0IGFsbCBjb250ZW50IGZpbGVzXG4gIGxvZ2dlci5pbmZvKCdCdW5kbGluZyBjb250ZW50Li4uJylcbiAgY29uc3QgZmlsZXMgPSBhd2FpdCBjb2xsZWN0RmlsZXMocHJvamVjdFJvb3QpXG4gIGxvZ2dlci5zdWNjZXNzKGDinJMgRm91bmQgJHtmaWxlcy5sZW5ndGh9IGNvbnRlbnQgZmlsZXNgKVxuICBcbiAgLy8gQ29sbGVjdCB0aGVtZS5qc29uXG4gIGNvbnN0IHRoZW1lSnNvbiA9IGNvbGxlY3RUaGVtZUpzb24ocHJvamVjdFJvb3QpXG4gIGlmICh0aGVtZUpzb24pIHtcbiAgICBsb2dnZXIuc3VjY2Vzcygn4pyTIEZvdW5kIHRoZW1lLmpzb24nKVxuICB9XG4gIFxuICAvLyBDb2xsZWN0IE9wZW5BUEkgc3BlY3MgYmFzZWQgb24gZG9jcy5qc29uIG5hdmlnYXRpb25cbiAgY29uc3Qgb3BlbkFwaVNwZWNzID0gYXdhaXQgY29sbGVjdE9wZW5BcGlTcGVjcyhwcm9qZWN0Um9vdCwgY29uZmlnIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVxuICBjb25zdCBzcGVjQ291bnQgPSBPYmplY3Qua2V5cyhvcGVuQXBpU3BlY3MpLmxlbmd0aFxuICBpZiAoc3BlY0NvdW50ID4gMCkge1xuICAgIGxvZ2dlci5zdWNjZXNzKGDinJMgRm91bmQgJHtzcGVjQ291bnR9IE9wZW5BUEkgc3BlYyhzKWApXG4gIH1cbiAgXG4gIC8vIENvbGxlY3QgYmluYXJ5IGFzc2V0c1xuICBjb25zdCBhc3NldHMgPSBhd2FpdCBjb2xsZWN0QXNzZXRzKHByb2plY3RSb290KVxuICBpZiAoYXNzZXRzLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCB0b3RhbEFzc2V0U2l6ZSA9IGFzc2V0cy5yZWR1Y2UoKHN1bSwgYSkgPT4gc3VtICsgYS5zaXplLCAwKVxuICAgIGxvZ2dlci5zdWNjZXNzKGDinJMgRm91bmQgJHthc3NldHMubGVuZ3RofSBhc3NldHMgKCR7Zm9ybWF0U2l6ZSh0b3RhbEFzc2V0U2l6ZSl9KWApXG4gIH1cbiAgXG4gIC8vIENhbGN1bGF0ZSBidW5kbGUgc2l6ZVxuICBjb25zdCB0b3RhbFNpemUgPSBmaWxlcy5yZWR1Y2UoKHN1bSwgZikgPT4gc3VtICsgZi5jb250ZW50Lmxlbmd0aCwgMClcbiAgY29uc3Qgc2l6ZUtCID0gKHRvdGFsU2l6ZSAvIDEwMjQpLnRvRml4ZWQoMSlcbiAgbG9nZ2VyLmluZm8oYENvbnRlbnQgYnVuZGxlOiAke3NpemVLQn0gS0JgKVxuICBcbiAgLy8gVXBsb2FkIGJpbmFyeSBhc3NldHMgZmlyc3QgKHdpdGggcHJvZ3Jlc3MpXG4gIGlmIChhc3NldHMubGVuZ3RoID4gMCAmJiBleGlzdGluZ1NsdWcgJiYgYXBpS2V5KSB7XG4gICAgY29uc29sZS5sb2coJycpXG4gICAgbG9nZ2VyLmluZm8oJ1VwbG9hZGluZyBhc3NldHMuLi4nKVxuICAgIFxuICAgIGNvbnN0IGFzc2V0UmVzdWx0cyA9IGF3YWl0IHVwbG9hZEFzc2V0cyhhc3NldHMsIGFwaVVybCwgZXhpc3RpbmdTbHVnLCBhcGlLZXkpXG4gICAgY29uc3Qgc3VjY2Vzc0NvdW50ID0gYXNzZXRSZXN1bHRzLmZpbHRlcihyID0+IHIuc3VjY2VzcykubGVuZ3RoXG4gICAgY29uc3QgZmFpbENvdW50ID0gYXNzZXRSZXN1bHRzLmZpbHRlcihyID0+ICFyLnN1Y2Nlc3MpLmxlbmd0aFxuICAgIFxuICAgIGlmIChmYWlsQ291bnQgPiAwKSB7XG4gICAgICBsb2dnZXIud2FybihgJHtzdWNjZXNzQ291bnR9IGFzc2V0cyB1cGxvYWRlZCwgJHtmYWlsQ291bnR9IGZhaWxlZGApXG4gICAgfSBlbHNlIGlmIChzdWNjZXNzQ291bnQgPiAwKSB7XG4gICAgICBsb2dnZXIuc3VjY2Vzcyhg4pyTICR7c3VjY2Vzc0NvdW50fSBhc3NldHMgdXBsb2FkZWRgKVxuICAgIH1cbiAgfSBlbHNlIGlmIChhc3NldHMubGVuZ3RoID4gMCAmJiAhZXhpc3RpbmdTbHVnKSB7XG4gICAgbG9nZ2VyLmluZm8oJ0Fzc2V0cyB3aWxsIGJlIHVwbG9hZGVkIG9uIG5leHQgZGVwbG95IChhZnRlciBwcm9qZWN0IHJlZ2lzdHJhdGlvbiknKVxuICB9XG4gIFxuICAvLyBEZXBsb3kgY29udGVudCB0byBBUElcbiAgY29uc29sZS5sb2coJycpXG4gIGxvZ2dlci5pbmZvKCdVcGxvYWRpbmcgY29udGVudC4uLicpXG4gIFxuICB0cnkge1xuICAgIGludGVyZmFjZSBEZXBsb3lSZXNwb25zZSB7XG4gICAgICBzdWNjZXNzOiBib29sZWFuXG4gICAgICBzbHVnOiBzdHJpbmdcbiAgICAgIHVybDogc3RyaW5nXG4gICAgICBibG9iVXJsOiBzdHJpbmdcbiAgICAgIGlzVXBkYXRlOiBib29sZWFuXG4gICAgICBmaWxlc0NvdW50OiBudW1iZXJcbiAgICAgIGFwaUtleT86IHN0cmluZ1xuICAgICAgZXJyb3I/OiBzdHJpbmdcbiAgICB9XG4gICAgXG4gICAgY29uc3QgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgfVxuICAgIFxuICAgIC8vIEFkZCBBUEkga2V5IGhlYWRlciBmb3IgdXBkYXRlc1xuICAgIGlmIChhcGlLZXkpIHtcbiAgICAgIGhlYWRlcnNbJ0F1dGhvcml6YXRpb24nXSA9IGBCZWFyZXIgJHthcGlLZXl9YFxuICAgIH1cbiAgICBcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGAke2FwaVVybH0vYXBpL2RlcGxveWAsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVycyxcbiAgICAgIHJlZGlyZWN0OiAnZm9sbG93JywgLy8gRm9sbG93IHJlZGlyZWN0c1xuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBuYW1lOiBjb25maWcubmFtZSB8fCAnTXkgRG9jdW1lbnRhdGlvbicsXG4gICAgICAgIHNsdWc6IGV4aXN0aW5nU2x1ZyxcbiAgICAgICAgZG9jc0pzb246IGNvbmZpZyxcbiAgICAgICAgdGhlbWVKc29uLFxuICAgICAgICBvcGVuQXBpU3BlY3MsXG4gICAgICAgIGZpbGVzLFxuICAgICAgICBhcGlLZXksIC8vIEFsc28gc2VuZCBpbiBib2R5IGFzIGZhbGxiYWNrXG4gICAgICB9KSxcbiAgICB9KVxuICAgIFxuICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgIGNvbnN0IGVycm9yRGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKS5jYXRjaCgoKSA9PiAoeyBlcnJvcjogJ1Vua25vd24gZXJyb3InIH0pKSBhcyB7IGVycm9yPzogc3RyaW5nOyBkZXRhaWxzPzogc3RyaW5nIH1cbiAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGVycm9yRGF0YS5lcnJvciB8fCBgSFRUUCAke3Jlc3BvbnNlLnN0YXR1c31gXG4gICAgICBjb25zdCBkZXRhaWxzID0gZXJyb3JEYXRhLmRldGFpbHMgPyBgXFxuICAgRGV0YWlsczogJHtlcnJvckRhdGEuZGV0YWlsc31gIDogJydcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHtlcnJvck1lc3NhZ2V9JHtkZXRhaWxzfWApXG4gICAgfVxuICAgIFxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKSBhcyBEZXBsb3lSZXNwb25zZVxuICAgIFxuICAgIC8vIFNhdmUgcHJvamVjdCBjb25maWcgZm9yIGZ1dHVyZSB1cGRhdGVzXG4gICAgY29uc3QgbmV3RGV2RG9jQ29uZmlnOiBEZXZEb2NDb25maWcgPSB7XG4gICAgICBzbHVnOiByZXN1bHQuc2x1ZyxcbiAgICAgIHVybDogcmVzdWx0LnVybCxcbiAgICAgIGxhc3REZXBsb3llZDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgIH1cbiAgICBcbiAgICAvLyBTYXZlIEFQSSBrZXkgKGZyb20gcmVzcG9uc2UgZm9yIG5ldyBwcm9qZWN0cywgb3IgZXhpc3RpbmcgZm9yIHVwZGF0ZXMpXG4gICAgaWYgKHJlc3VsdC5hcGlLZXkpIHtcbiAgICAgIG5ld0RldkRvY0NvbmZpZy5hcGlLZXkgPSByZXN1bHQuYXBpS2V5XG4gICAgfSBlbHNlIGlmIChhcGlLZXkpIHtcbiAgICAgIG5ld0RldkRvY0NvbmZpZy5hcGlLZXkgPSBhcGlLZXlcbiAgICB9XG4gICAgXG4gICAgZnMud3JpdGVKc29uU3luYyhkZXZkb2NDb25maWdQYXRoLCBuZXdEZXZEb2NDb25maWcsIHsgc3BhY2VzOiAyIH0pXG4gICAgXG4gICAgLy8gU3VjY2VzcyBtZXNzYWdlXG4gICAgY29uc29sZS5sb2coJycpXG4gICAgbG9nZ2VyLnN1Y2Nlc3MoJ0RlcGxveW1lbnQgc3VjY2Vzc2Z1bCEnKVxuICAgIGNvbnNvbGUubG9nKCcnKVxuICAgIGNvbnNvbGUubG9nKGAgIFlvdXIgZG9jcyBhcmUgbGl2ZSBhdDpgKVxuICAgIGNvbnNvbGUubG9nKGAgICR7bG9nZ2VyLmN5YW4ocmVzdWx0LnVybCl9YClcbiAgICBjb25zb2xlLmxvZygnJylcbiAgICBcbiAgICBpZiAocmVzdWx0LmlzVXBkYXRlKSB7XG4gICAgICBsb2dnZXIuaW5mbygnUHJvamVjdCB1cGRhdGVkIHdpdGggbmV3IGNvbnRlbnQnKVxuICAgIH0gZWxzZSB7XG4gICAgICBsb2dnZXIuaW5mbyhgUHJvamVjdCBzbHVnOiAke3Jlc3VsdC5zbHVnfWApXG4gICAgICBsb2dnZXIuaW5mbygnUnVuIFwiZGV2ZG9jIGRlcGxveVwiIGFnYWluIHRvIHVwZGF0ZScpXG4gICAgICBcbiAgICAgIC8vIFNob3cgQVBJIGtleSB3YXJuaW5nIGZvciBuZXcgcHJvamVjdHNcbiAgICAgIGlmIChyZXN1bHQuYXBpS2V5KSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCcnKVxuICAgICAgICBsb2dnZXIud2Fybign4pqg77iPICBTYXZlIHlvdXIgQVBJIGtleSBmb3IgQ0kvQ0QgZGVwbG95bWVudHM6JylcbiAgICAgICAgY29uc29sZS5sb2coYCAgICAke3Jlc3VsdC5hcGlLZXl9YClcbiAgICAgICAgY29uc29sZS5sb2coJycpXG4gICAgICAgIGxvZ2dlci5pbmZvKCdBUEkga2V5IHNhdmVkIHRvIC5kZXZkb2MuanNvbiAoYWRkIHRvIC5naXRpZ25vcmUhKScpXG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIC8vIENoZWNrIGZvciBkb21haW4uanNvbiBhbmQgc2hvdyBjdXN0b20gZG9tYWluIHN0YXR1c1xuICAgIGF3YWl0IGNoZWNrQ3VzdG9tRG9tYWluU3RhdHVzKHByb2plY3RSb290LCBhcGlVcmwsIGFwaUtleSB8fCByZXN1bHQuYXBpS2V5IHx8ICcnKVxuICAgIFxuICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgIGNvbnN0IG1lc3NhZ2UgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcilcbiAgICBsb2dnZXIuZXJyb3IoYERlcGxveW1lbnQgZmFpbGVkOiAke21lc3NhZ2V9YClcbiAgICBwcm9jZXNzLmV4aXQoMSlcbiAgfVxufVxuXG4vKipcbiAqIENvbGxlY3QgT3BlbkFQSSBzcGVjcyBiYXNlZCBvbiBkb2NzLmpzb24gbmF2aWdhdGlvbiB0YWJzXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNvbGxlY3RPcGVuQXBpU3BlY3MoXG4gIHByb2plY3RSb290OiBzdHJpbmcsXG4gIGRvY3NKc29uOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBPcGVuQXBpU3BlYz4+IHtcbiAgY29uc3Qgc3BlY3M6IFJlY29yZDxzdHJpbmcsIE9wZW5BcGlTcGVjPiA9IHt9XG4gIFxuICAvLyBHZXQgbmF2aWdhdGlvbiBmcm9tIGRvY3MuanNvbiAtIGNvdWxkIGJlIG9iamVjdCB3aXRoIHRhYnMgb3IgYXJyYXlcbiAgY29uc3QgbmF2aWdhdGlvbiA9IGRvY3NKc29uLm5hdmlnYXRpb24gYXMgeyB0YWJzPzogQXJyYXk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+IH0gfCBBcnJheTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4gfCB1bmRlZmluZWRcbiAgaWYgKCFuYXZpZ2F0aW9uKSByZXR1cm4gc3BlY3NcbiAgXG4gIC8vIEhhbmRsZSBib3RoIHsgdGFiczogWy4uLl0gfSBhbmQgZGlyZWN0IGFycmF5IGZvcm1hdHNcbiAgY29uc3QgdGFicyA9IEFycmF5LmlzQXJyYXkobmF2aWdhdGlvbikgPyBuYXZpZ2F0aW9uIDogKG5hdmlnYXRpb24udGFicyB8fCBbXSlcbiAgXG4gIGZvciAoY29uc3QgaXRlbSBvZiB0YWJzKSB7XG4gICAgLy8gQ2hlY2sgaWYgdGhpcyBpcyBhbiBPcGVuQVBJIHRhYlxuICAgIGlmIChpdGVtLnR5cGUgPT09ICdvcGVuYXBpJykge1xuICAgICAgLy8gU3BlYyBjYW4gYmUgZGlyZWN0bHkgb24gdGFiIG9yIG5lc3RlZCBpbiB2ZXJzaW9ucyBhcnJheVxuICAgICAgY29uc3QgdmVyc2lvbnMgPSBpdGVtLnZlcnNpb25zIGFzIEFycmF5PHsgc3BlYzogc3RyaW5nOyB2ZXJzaW9uOiBzdHJpbmcgfT4gfCB1bmRlZmluZWRcbiAgICAgIFxuICAgICAgaWYgKHZlcnNpb25zICYmIEFycmF5LmlzQXJyYXkodmVyc2lvbnMpKSB7XG4gICAgICAgIC8vIEhhbmRsZSB2ZXJzaW9uZWQgc3BlY3NcbiAgICAgICAgZm9yIChjb25zdCB2ZXJzaW9uIG9mIHZlcnNpb25zKSB7XG4gICAgICAgICAgaWYgKHZlcnNpb24uc3BlYykge1xuICAgICAgICAgICAgYXdhaXQgbG9hZFNwZWMocHJvamVjdFJvb3QsIHZlcnNpb24uc3BlYywgc3BlY3MpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGl0ZW0uc3BlYykge1xuICAgICAgICAvLyBIYW5kbGUgZGlyZWN0IHNwZWMgcmVmZXJlbmNlXG4gICAgICAgIGF3YWl0IGxvYWRTcGVjKHByb2plY3RSb290LCBpdGVtLnNwZWMgYXMgc3RyaW5nLCBzcGVjcylcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgXG4gIHJldHVybiBzcGVjc1xufVxuXG4vKipcbiAqIExvYWQgYSBzaW5nbGUgT3BlbkFQSSBzcGVjIGludG8gdGhlIHNwZWNzIG1hcFxuICovXG5hc3luYyBmdW5jdGlvbiBsb2FkU3BlYyhcbiAgcHJvamVjdFJvb3Q6IHN0cmluZyxcbiAgc3BlY1BhdGg6IHN0cmluZyxcbiAgc3BlY3M6IFJlY29yZDxzdHJpbmcsIE9wZW5BcGlTcGVjPlxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIC8vIFJlc29sdmUgdGhlIHNwZWMgcGF0aCByZWxhdGl2ZSB0byBwcm9qZWN0IHJvb3RcbiAgbGV0IGZ1bGxTcGVjUGF0aCA9IHBhdGguam9pbihwcm9qZWN0Um9vdCwgc3BlY1BhdGgpXG4gIFxuICAvLyBIYW5kbGUgcmVsYXRpdmUgcGF0aHMgbGlrZSAuL2ZhY2Vib29rL29wZW5hcGkuanNvblxuICBpZiAoc3BlY1BhdGguc3RhcnRzV2l0aCgnLi8nKSkge1xuICAgIGZ1bGxTcGVjUGF0aCA9IHBhdGguam9pbihwcm9qZWN0Um9vdCwgc3BlY1BhdGguc2xpY2UoMikpXG4gIH1cbiAgXG4gIGlmIChmcy5leGlzdHNTeW5jKGZ1bGxTcGVjUGF0aCkpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc3BlY0NvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoZnVsbFNwZWNQYXRoLCAndXRmLTgnKVxuICAgICAgY29uc3Qgc3BlY0RhdGEgPSBKU09OLnBhcnNlKHNwZWNDb250ZW50KSBhcyBPcGVuQXBpU3BlY1xuICAgICAgc3BlY3Nbc3BlY1BhdGhdID0gc3BlY0RhdGFcbiAgICAgIGxvZ2dlci5pbmZvKGAgIOKGkiAke3NwZWNQYXRofWApXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcilcbiAgICAgIGxvZ2dlci53YXJuKGBGYWlsZWQgdG8gcGFyc2UgT3BlbkFQSSBzcGVjICR7c3BlY1BhdGh9OiAke21lc3NhZ2V9YClcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbG9nZ2VyLndhcm4oYE9wZW5BUEkgc3BlYyBmaWxlIG5vdCBmb3VuZDogJHtzcGVjUGF0aH1gKVxuICB9XG59XG5cbi8qKlxuICogQ29sbGVjdCB0aGVtZS5qc29uIGlmIGl0IGV4aXN0c1xuICovXG5mdW5jdGlvbiBjb2xsZWN0VGhlbWVKc29uKHByb2plY3RSb290OiBzdHJpbmcpOiBvYmplY3QgfCB1bmRlZmluZWQge1xuICBjb25zdCB0aGVtZVBhdGggPSBwYXRoLmpvaW4ocHJvamVjdFJvb3QsICd0aGVtZS5qc29uJylcbiAgXG4gIGlmIChmcy5leGlzdHNTeW5jKHRoZW1lUGF0aCkpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdGhlbWVDb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHRoZW1lUGF0aCwgJ3V0Zi04JylcbiAgICAgIHJldHVybiBKU09OLnBhcnNlKHRoZW1lQ29udGVudCkgYXMgb2JqZWN0XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcilcbiAgICAgIGxvZ2dlci53YXJuKGBGYWlsZWQgdG8gcGFyc2UgdGhlbWUuanNvbjogJHttZXNzYWdlfWApXG4gICAgfVxuICB9XG4gIFxuICByZXR1cm4gdW5kZWZpbmVkXG59XG5cbi8qKlxuICogQ29sbGVjdCBhbGwgTURYIGFuZCBjb250ZW50IGZpbGVzIGZyb20gdGhlIHByb2plY3RcbiAqL1xuYXN5bmMgZnVuY3Rpb24gY29sbGVjdEZpbGVzKHByb2plY3RSb290OiBzdHJpbmcpOiBQcm9taXNlPFByb2plY3RGaWxlW10+IHtcbiAgY29uc3QgZmlsZXM6IFByb2plY3RGaWxlW10gPSBbXVxuICBcbiAgLy8gU2NhbiBhbGwgZGlyZWN0b3JpZXMgaW4gcHJvamVjdCByb290IChub3QganVzdCBoYXJkY29kZWQgbGlzdClcbiAgY29uc3QgaXRlbXMgPSBmcy5yZWFkZGlyU3luYyhwcm9qZWN0Um9vdClcbiAgXG4gIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykge1xuICAgIC8vIFNraXAgY29tbW9uIGRpcmVjdG9yaWVzIHRoYXQgc2hvdWxkbid0IGJlIHNjYW5uZWRcbiAgICBpZiAoW1xuICAgICAgJ25vZGVfbW9kdWxlcycsIFxuICAgICAgJ2Rpc3QnLCBcbiAgICAgICcubmV4dCcsIFxuICAgICAgJy5naXQnLCBcbiAgICAgICdwdWJsaWMnLFxuICAgICAgJy5kZXZkb2MnLFxuICAgICAgJy5jbGF1ZGUnLFxuICAgICAgJy5jdXJzb3InLFxuICAgIF0uaW5jbHVkZXMoaXRlbSkpIHtcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIFxuICAgIGNvbnN0IGZ1bGxQYXRoID0gcGF0aC5qb2luKHByb2plY3RSb290LCBpdGVtKVxuICAgIGNvbnN0IHN0YXQgPSBmcy5zdGF0U3luYyhmdWxsUGF0aClcbiAgICBcbiAgICBpZiAoc3RhdC5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAvLyBTa2lwIGFzc2V0cyBmb2xkZXIgZm9yIE1EWCBzY2FubmluZyAoaGFuZGxlZCBzZXBhcmF0ZWx5KVxuICAgICAgaWYgKGl0ZW0gPT09ICdhc3NldHMnKSBjb250aW51ZVxuICAgICAgYXdhaXQgc2NhbkRpcmVjdG9yeShmdWxsUGF0aCwgcHJvamVjdFJvb3QsIGZpbGVzKVxuICAgIH0gZWxzZSBpZiAoaXRlbS5lbmRzV2l0aCgnLm1keCcpIHx8IGl0ZW0uZW5kc1dpdGgoJy5tZCcpIHx8IGl0ZW0uZW5kc1dpdGgoJy5ncmFwaHFsJykgfHwgaXRlbS5lbmRzV2l0aCgnLmdxbCcpKSB7XG4gICAgICAvLyBJbmNsdWRlIHJvb3QtbGV2ZWwgY29udGVudCBmaWxlcyAoTURYLCBNRCwgR3JhcGhRTCBzY2hlbWFzKVxuICAgICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhmdWxsUGF0aCwgJ3V0Zi04JylcbiAgICAgIGZpbGVzLnB1c2goeyBwYXRoOiBpdGVtLCBjb250ZW50IH0pXG4gICAgfSBlbHNlIGlmIChpdGVtID09PSAnZG9jcy5qc29uJyB8fCBpdGVtID09PSAndGhlbWUuanNvbicgfHwgaXRlbSA9PT0gJ2RvbWFpbi5qc29uJyB8fCBpdGVtID09PSAnY3VzdG9tLmNzcycpIHtcbiAgICAgIC8vIEluY2x1ZGUgY29uZmlnIGZpbGVzXG4gICAgICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKGZ1bGxQYXRoLCAndXRmLTgnKVxuICAgICAgZmlsZXMucHVzaCh7IHBhdGg6IGl0ZW0sIGNvbnRlbnQgfSlcbiAgICB9XG4gIH1cbiAgXG4gIC8vIEluY2x1ZGUgdGV4dC1iYXNlZCBhc3NldHMgZnJvbSBhc3NldHMgZm9sZGVyIChTVkcsIEpTT04pXG4gIGNvbnN0IGFzc2V0c0RpciA9IHBhdGguam9pbihwcm9qZWN0Um9vdCwgJ2Fzc2V0cycpXG4gIGlmIChmcy5leGlzdHNTeW5jKGFzc2V0c0RpcikpIHtcbiAgICBhd2FpdCBzY2FuUHVibGljQXNzZXRzKGFzc2V0c0RpciwgcHJvamVjdFJvb3QsIGZpbGVzKVxuICB9XG4gIFxuICByZXR1cm4gZmlsZXNcbn1cblxuLyoqXG4gKiBSZWN1cnNpdmVseSBzY2FuIGEgZGlyZWN0b3J5IGZvciBjb250ZW50IGZpbGVzIChNRFgsIE1ELCBHcmFwaFFMIHNjaGVtYXMpXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHNjYW5EaXJlY3RvcnkoXG4gIGRpcjogc3RyaW5nLFxuICBwcm9qZWN0Um9vdDogc3RyaW5nLFxuICBmaWxlczogUHJvamVjdEZpbGVbXVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGl0ZW1zID0gZnMucmVhZGRpclN5bmMoZGlyKVxuICBcbiAgLy8gQ29udGVudCBmaWxlIGV4dGVuc2lvbnMgdG8gaW5jbHVkZVxuICBjb25zdCBDT05URU5UX0VYVEVOU0lPTlMgPSBbJy5tZHgnLCAnLm1kJywgJy5ncmFwaHFsJywgJy5ncWwnXVxuICBcbiAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7XG4gICAgLy8gU2tpcCBjb21tb24gZGlyZWN0b3JpZXNcbiAgICBpZiAoWydub2RlX21vZHVsZXMnLCAnZGlzdCcsICcubmV4dCcsICcuZ2l0JywgJ3B1YmxpYyddLmluY2x1ZGVzKGl0ZW0pKSB7XG4gICAgICBjb250aW51ZVxuICAgIH1cbiAgICBcbiAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGguam9pbihkaXIsIGl0ZW0pXG4gICAgY29uc3Qgc3RhdCA9IGZzLnN0YXRTeW5jKGZ1bGxQYXRoKVxuICAgIFxuICAgIGlmIChzdGF0LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgIGF3YWl0IHNjYW5EaXJlY3RvcnkoZnVsbFBhdGgsIHByb2plY3RSb290LCBmaWxlcylcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZXh0ID0gcGF0aC5leHRuYW1lKGl0ZW0pLnRvTG93ZXJDYXNlKClcbiAgICAgIGlmIChDT05URU5UX0VYVEVOU0lPTlMuaW5jbHVkZXMoZXh0KSkge1xuICAgICAgICBjb25zdCByZWxhdGl2ZVBhdGggPSBwYXRoLnJlbGF0aXZlKHByb2plY3RSb290LCBmdWxsUGF0aClcbiAgICAgICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhmdWxsUGF0aCwgJ3V0Zi04JylcbiAgICAgICAgXG4gICAgICAgIGZpbGVzLnB1c2goe1xuICAgICAgICAgIHBhdGg6IHJlbGF0aXZlUGF0aCxcbiAgICAgICAgICBjb250ZW50LFxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFNjYW4gcHVibGljIGFzc2V0cyAoU1ZHLCBKU09OLCBDU1MpIC0gdGV4dC1iYXNlZCBvbmx5IGZvciBjb250ZW50IGJ1bmRsZVxuICovXG5hc3luYyBmdW5jdGlvbiBzY2FuUHVibGljQXNzZXRzKFxuICBkaXI6IHN0cmluZyxcbiAgcHJvamVjdFJvb3Q6IHN0cmluZyxcbiAgZmlsZXM6IFByb2plY3RGaWxlW11cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBpdGVtcyA9IGZzLnJlYWRkaXJTeW5jKGRpcilcbiAgXG4gIC8vIFRleHQtYmFzZWQgZmlsZSBleHRlbnNpb25zIHRvIGluY2x1ZGUgaW4gY29udGVudCBidW5kbGVcbiAgLy8gTm90ZTogU1ZHIGlzIG5vdyB1cGxvYWRlZCBhcyBiaW5hcnkgYXNzZXQgZm9yIGJldHRlciBibG9iIHN0b3JhZ2Ugc2VydmluZ1xuICBjb25zdCBURVhUX0VYVEVOU0lPTlMgPSBbJy5qc29uJywgJy5jc3MnXVxuICBcbiAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7XG4gICAgY29uc3QgZnVsbFBhdGggPSBwYXRoLmpvaW4oZGlyLCBpdGVtKVxuICAgIGNvbnN0IHN0YXQgPSBmcy5zdGF0U3luYyhmdWxsUGF0aClcbiAgICBcbiAgICBpZiAoc3RhdC5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICBhd2FpdCBzY2FuUHVibGljQXNzZXRzKGZ1bGxQYXRoLCBwcm9qZWN0Um9vdCwgZmlsZXMpXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGV4dCA9IHBhdGguZXh0bmFtZShpdGVtKS50b0xvd2VyQ2FzZSgpXG4gICAgICBpZiAoVEVYVF9FWFRFTlNJT05TLmluY2x1ZGVzKGV4dCkpIHtcbiAgICAgICAgLy8gT25seSBpbmNsdWRlIHRleHQtYmFzZWQgYXNzZXRzIGluIGNvbnRlbnQgYnVuZGxlXG4gICAgICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHBhdGgucmVsYXRpdmUocHJvamVjdFJvb3QsIGZ1bGxQYXRoKVxuICAgICAgICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKGZ1bGxQYXRoLCAndXRmLTgnKVxuICAgICAgICBcbiAgICAgICAgZmlsZXMucHVzaCh7XG4gICAgICAgICAgcGF0aDogcmVsYXRpdmVQYXRoLFxuICAgICAgICAgIGNvbnRlbnQsXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQ29sbGVjdCBiaW5hcnkgYXNzZXRzIGZyb20gYXNzZXRzIGZvbGRlclxuICovXG5hc3luYyBmdW5jdGlvbiBjb2xsZWN0QXNzZXRzKHByb2plY3RSb290OiBzdHJpbmcpOiBQcm9taXNlPEFzc2V0RmlsZVtdPiB7XG4gIGNvbnN0IGFzc2V0czogQXNzZXRGaWxlW10gPSBbXVxuICBcbiAgLy8gQ2hlY2sgYXNzZXRzIGZvbGRlclxuICBjb25zdCBhc3NldHNEaXIgPSBwYXRoLmpvaW4ocHJvamVjdFJvb3QsICdhc3NldHMnKVxuICBpZiAoZnMuZXhpc3RzU3luYyhhc3NldHNEaXIpKSB7XG4gICAgYXdhaXQgc2NhbkJpbmFyeUFzc2V0cyhhc3NldHNEaXIsIHByb2plY3RSb290LCBhc3NldHMpXG4gIH1cbiAgXG4gIHJldHVybiBhc3NldHNcbn1cblxuLyoqXG4gKiBSZWN1cnNpdmVseSBzY2FuIGZvciBiaW5hcnkgYXNzZXRzXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHNjYW5CaW5hcnlBc3NldHMoXG4gIGRpcjogc3RyaW5nLFxuICBwcm9qZWN0Um9vdDogc3RyaW5nLFxuICBhc3NldHM6IEFzc2V0RmlsZVtdXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgaXRlbXMgPSBmcy5yZWFkZGlyU3luYyhkaXIpXG4gIFxuICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHtcbiAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGguam9pbihkaXIsIGl0ZW0pXG4gICAgY29uc3Qgc3RhdCA9IGZzLnN0YXRTeW5jKGZ1bGxQYXRoKVxuICAgIFxuICAgIGlmIChzdGF0LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgIGF3YWl0IHNjYW5CaW5hcnlBc3NldHMoZnVsbFBhdGgsIHByb2plY3RSb290LCBhc3NldHMpXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGV4dCA9IHBhdGguZXh0bmFtZShpdGVtKS50b0xvd2VyQ2FzZSgpXG4gICAgICBpZiAoQklOQVJZX0VYVEVOU0lPTlMuaW5jbHVkZXMoZXh0KSkge1xuICAgICAgICAvLyBDaGVjayBzaXplIGxpbWl0XG4gICAgICAgIGlmIChzdGF0LnNpemUgPiBNQVhfQVNTRVRfU0laRSkge1xuICAgICAgICAgIGxvZ2dlci53YXJuKGBTa2lwcGluZyAke2l0ZW19OiBleGNlZWRzIDI1TUIgbGltaXQgKCR7Zm9ybWF0U2l6ZShzdGF0LnNpemUpfSlgKVxuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHBhdGgucmVsYXRpdmUocHJvamVjdFJvb3QsIGZ1bGxQYXRoKVxuICAgICAgICBhc3NldHMucHVzaCh7XG4gICAgICAgICAgcGF0aDogcmVsYXRpdmVQYXRoLFxuICAgICAgICAgIGZ1bGxQYXRoLFxuICAgICAgICAgIHNpemU6IHN0YXQuc2l6ZSxcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBVcGxvYWQgYXNzZXRzIHdpdGggcHJvZ3Jlc3MgdHJhY2tpbmdcbiAqL1xuYXN5bmMgZnVuY3Rpb24gdXBsb2FkQXNzZXRzKFxuICBhc3NldHM6IEFzc2V0RmlsZVtdLFxuICBhcGlVcmw6IHN0cmluZyxcbiAgc2x1Zzogc3RyaW5nLFxuICBhcGlLZXk6IHN0cmluZ1xuKTogUHJvbWlzZTxBcnJheTx7IGZpbGU6IHN0cmluZzsgc3VjY2VzczogYm9vbGVhbjsgdXJsPzogc3RyaW5nOyBlcnJvcj86IHN0cmluZyB9Pj4ge1xuICBjb25zdCByZXN1bHRzOiBBcnJheTx7IGZpbGU6IHN0cmluZzsgc3VjY2VzczogYm9vbGVhbjsgdXJsPzogc3RyaW5nOyBlcnJvcj86IHN0cmluZyB9PiA9IFtdXG4gIFxuICBmb3IgKGNvbnN0IGFzc2V0IG9mIGFzc2V0cykge1xuICAgIGNvbnN0IGZpbGVOYW1lID0gcGF0aC5iYXNlbmFtZShhc3NldC5wYXRoKVxuICAgIFxuICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKGAgICR7ZmlsZU5hbWV9OiBgKVxuICAgIFxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB1cGxvYWRBc3NldFdpdGhQcm9ncmVzcyhcbiAgICAgICAgYXNzZXQsXG4gICAgICAgIGFwaVVybCxcbiAgICAgICAgc2x1ZyxcbiAgICAgICAgYXBpS2V5LFxuICAgICAgICAocHJvZ3Jlc3MsIGxvYWRlZCwgdG90YWwpID0+IHtcbiAgICAgICAgICBpZiAocHJvY2Vzcy5zdGRvdXQuaXNUVFkpIHtcbiAgICAgICAgICAgIHByb2Nlc3Muc3Rkb3V0LmNsZWFyTGluZSgwKVxuICAgICAgICAgICAgcHJvY2Vzcy5zdGRvdXQuY3Vyc29yVG8oMClcbiAgICAgICAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKGAgICR7ZmlsZU5hbWV9OiAke2NyZWF0ZVByb2dyZXNzQmFyKHByb2dyZXNzKX0gJHtmb3JtYXRTaXplKGxvYWRlZCl9LyR7Zm9ybWF0U2l6ZSh0b3RhbCl9YClcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIClcbiAgICAgIFxuICAgICAgaWYgKHByb2Nlc3Muc3Rkb3V0LmlzVFRZKSB7XG4gICAgICAgIHByb2Nlc3Muc3Rkb3V0LmNsZWFyTGluZSgwKVxuICAgICAgICBwcm9jZXNzLnN0ZG91dC5jdXJzb3JUbygwKVxuICAgICAgfVxuICAgICAgY29uc29sZS5sb2coYCAgJHtsb2dnZXIuZ3JlZW4oJ+KckycpfSAke2ZpbGVOYW1lfSAoJHtmb3JtYXRTaXplKGFzc2V0LnNpemUpfSlgKVxuICAgICAgXG4gICAgICByZXN1bHRzLnB1c2goeyBmaWxlOiBmaWxlTmFtZSwgc3VjY2VzczogdHJ1ZSwgdXJsOiByZXN1bHQudXJsIH0pXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcilcbiAgICAgIFxuICAgICAgaWYgKHByb2Nlc3Muc3Rkb3V0LmlzVFRZKSB7XG4gICAgICAgIHByb2Nlc3Muc3Rkb3V0LmNsZWFyTGluZSgwKVxuICAgICAgICBwcm9jZXNzLnN0ZG91dC5jdXJzb3JUbygwKVxuICAgICAgfVxuICAgICAgY29uc29sZS5sb2coYCAgJHtsb2dnZXIucmVkKCfinJcnKX0gJHtmaWxlTmFtZX06ICR7bWVzc2FnZX1gKVxuICAgICAgXG4gICAgICByZXN1bHRzLnB1c2goeyBmaWxlOiBmaWxlTmFtZSwgc3VjY2VzczogZmFsc2UsIGVycm9yOiBtZXNzYWdlIH0pXG4gICAgfVxuICB9XG4gIFxuICByZXR1cm4gcmVzdWx0c1xufVxuXG4vKipcbiAqIFVwbG9hZCBhIHNpbmdsZSBhc3NldCB3aXRoIHByb2dyZXNzXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHVwbG9hZEFzc2V0V2l0aFByb2dyZXNzKFxuICBhc3NldDogQXNzZXRGaWxlLFxuICBhcGlVcmw6IHN0cmluZyxcbiAgc2x1Zzogc3RyaW5nLFxuICBhcGlLZXk6IHN0cmluZyxcbiAgb25Qcm9ncmVzczogKHByb2dyZXNzOiBudW1iZXIsIGxvYWRlZDogbnVtYmVyLCB0b3RhbDogbnVtYmVyKSA9PiB2b2lkXG4pOiBQcm9taXNlPHsgdXJsOiBzdHJpbmcgfT4ge1xuICBjb25zdCBmaWxlQnVmZmVyID0gZnMucmVhZEZpbGVTeW5jKGFzc2V0LmZ1bGxQYXRoKVxuICBjb25zdCBmaWxlTmFtZSA9IHBhdGguYmFzZW5hbWUoYXNzZXQucGF0aClcbiAgY29uc3QgbWltZVR5cGUgPSBnZXRNaW1lVHlwZShhc3NldC5mdWxsUGF0aClcbiAgXG4gIC8vIEJ1aWxkIG11bHRpcGFydCBmb3JtIGRhdGFcbiAgY29uc3QgYm91bmRhcnkgPSBgLS0tLURldkRvY0RlcGxveSR7RGF0ZS5ub3coKX1gXG4gIGNvbnN0IENSTEYgPSAnXFxyXFxuJ1xuICBcbiAgY29uc3QgaGVhZGVyID0gW1xuICAgIGAtLSR7Ym91bmRhcnl9YCxcbiAgICBgQ29udGVudC1EaXNwb3NpdGlvbjogZm9ybS1kYXRhOyBuYW1lPVwiZmlsZVwiOyBmaWxlbmFtZT1cIiR7ZmlsZU5hbWV9XCJgLFxuICAgIGBDb250ZW50LVR5cGU6ICR7bWltZVR5cGV9YCxcbiAgICAnJyxcbiAgICAnJ1xuICBdLmpvaW4oQ1JMRilcbiAgXG4gIGNvbnN0IHNsdWdQYXJ0ID0gW1xuICAgICcnLFxuICAgIGAtLSR7Ym91bmRhcnl9YCxcbiAgICBgQ29udGVudC1EaXNwb3NpdGlvbjogZm9ybS1kYXRhOyBuYW1lPVwic2x1Z1wiYCxcbiAgICAnJyxcbiAgICBzbHVnLFxuICAgICcnXG4gIF0uam9pbihDUkxGKVxuICBcbiAgY29uc3QgcGF0aFBhcnQgPSBbXG4gICAgYC0tJHtib3VuZGFyeX1gLFxuICAgIGBDb250ZW50LURpc3Bvc2l0aW9uOiBmb3JtLWRhdGE7IG5hbWU9XCJwYXRoXCJgLFxuICAgICcnLFxuICAgIGFzc2V0LnBhdGgucmVwbGFjZSgvXmFzc2V0c1xcLy8sICcnKSwgLy8gUmVtb3ZlIGFzc2V0cy8gcHJlZml4XG4gICAgJydcbiAgXS5qb2luKENSTEYpXG4gIFxuICBjb25zdCBmb290ZXIgPSBgJHtDUkxGfS0tJHtib3VuZGFyeX0tLSR7Q1JMRn1gXG4gIFxuICBjb25zdCBoZWFkZXJCdWZmZXIgPSBCdWZmZXIuZnJvbShoZWFkZXIpXG4gIGNvbnN0IHNsdWdCdWZmZXIgPSBCdWZmZXIuZnJvbShzbHVnUGFydClcbiAgY29uc3QgcGF0aEJ1ZmZlciA9IEJ1ZmZlci5mcm9tKHBhdGhQYXJ0KVxuICBjb25zdCBmb290ZXJCdWZmZXIgPSBCdWZmZXIuZnJvbShmb290ZXIpXG4gIFxuICBjb25zdCB0b3RhbFNpemUgPSBoZWFkZXJCdWZmZXIubGVuZ3RoICsgZmlsZUJ1ZmZlci5sZW5ndGggKyBzbHVnQnVmZmVyLmxlbmd0aCArIHBhdGhCdWZmZXIubGVuZ3RoICsgZm9vdGVyQnVmZmVyLmxlbmd0aFxuICBjb25zdCBib2R5ID0gQnVmZmVyLmNvbmNhdChbaGVhZGVyQnVmZmVyLCBmaWxlQnVmZmVyLCBzbHVnQnVmZmVyLCBwYXRoQnVmZmVyLCBmb290ZXJCdWZmZXJdKVxuICBcbiAgLy8gU2ltdWxhdGUgcHJvZ3Jlc3NcbiAgbGV0IHVwbG9hZGVkID0gMFxuICBjb25zdCBjaHVua1NpemUgPSBNYXRoLmNlaWwodG90YWxTaXplIC8gMjApXG4gIFxuICBjb25zdCBwcm9ncmVzc0ludGVydmFsID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgIGlmICh1cGxvYWRlZCA8IHRvdGFsU2l6ZSAqIDAuOSkge1xuICAgICAgdXBsb2FkZWQgPSBNYXRoLm1pbih1cGxvYWRlZCArIGNodW5rU2l6ZSwgdG90YWxTaXplICogMC45KVxuICAgICAgb25Qcm9ncmVzcyh1cGxvYWRlZCAvIHRvdGFsU2l6ZSwgdXBsb2FkZWQsIHRvdGFsU2l6ZSlcbiAgICB9XG4gIH0sIDUwKVxuICBcbiAgdHJ5IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGAke2FwaVVybH0vYXBpL2Fzc2V0cy91cGxvYWRgLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgJ0NvbnRlbnQtVHlwZSc6IGBtdWx0aXBhcnQvZm9ybS1kYXRhOyBib3VuZGFyeT0ke2JvdW5kYXJ5fWAsXG4gICAgICAgICdBdXRob3JpemF0aW9uJzogYEJlYXJlciAke2FwaUtleX1gLFxuICAgICAgfSxcbiAgICAgIGJvZHksXG4gICAgfSlcbiAgICBcbiAgICBjbGVhckludGVydmFsKHByb2dyZXNzSW50ZXJ2YWwpXG4gICAgb25Qcm9ncmVzcygxLCB0b3RhbFNpemUsIHRvdGFsU2l6ZSlcbiAgICBcbiAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICBjb25zdCBlcnJvciA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKS5jYXRjaCgoKSA9PiAoeyBlcnJvcjogJ1VwbG9hZCBmYWlsZWQnIH0pKSBhcyB7IGVycm9yPzogc3RyaW5nIH1cbiAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvci5lcnJvciB8fCBgSFRUUCAke3Jlc3BvbnNlLnN0YXR1c31gKVxuICAgIH1cbiAgICBcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXNwb25zZS5qc29uKCkgYXMgeyB1cmw6IHN0cmluZyB9XG4gICAgcmV0dXJuIHJlc3VsdFxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNsZWFySW50ZXJ2YWwocHJvZ3Jlc3NJbnRlcnZhbClcbiAgICB0aHJvdyBlcnJvclxuICB9XG59XG5cbi8qKlxuICogRm9ybWF0IGZpbGUgc2l6ZSBmb3IgZGlzcGxheVxuICovXG5mdW5jdGlvbiBmb3JtYXRTaXplKGJ5dGVzOiBudW1iZXIpOiBzdHJpbmcge1xuICBpZiAoYnl0ZXMgPCAxMDI0KSByZXR1cm4gYCR7Ynl0ZXN9IEJgXG4gIGlmIChieXRlcyA8IDEwMjQgKiAxMDI0KSByZXR1cm4gYCR7KGJ5dGVzIC8gMTAyNCkudG9GaXhlZCgxKX0gS0JgXG4gIHJldHVybiBgJHsoYnl0ZXMgLyAoMTAyNCAqIDEwMjQpKS50b0ZpeGVkKDIpfSBNQmBcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBwcm9ncmVzcyBiYXIgc3RyaW5nXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVByb2dyZXNzQmFyKHByb2dyZXNzOiBudW1iZXIsIHdpZHRoOiBudW1iZXIgPSAzMCk6IHN0cmluZyB7XG4gIGNvbnN0IGZpbGxlZCA9IE1hdGgucm91bmQod2lkdGggKiBwcm9ncmVzcylcbiAgY29uc3QgZW1wdHkgPSB3aWR0aCAtIGZpbGxlZFxuICBjb25zdCBiYXIgPSAn4paIJy5yZXBlYXQoZmlsbGVkKSArICfilpEnLnJlcGVhdChlbXB0eSlcbiAgY29uc3QgcGVyY2VudGFnZSA9IE1hdGgucm91bmQocHJvZ3Jlc3MgKiAxMDApXG4gIHJldHVybiBgWyR7YmFyfV0gJHtwZXJjZW50YWdlfSVgXG59XG4iXX0=
|
package/package.json
CHANGED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
import { Docs } from "@/components/docs-viewer";
|
|
4
|
+
import { MobileProvider } from "@/lib/api-docs/mobile-context";
|
|
5
|
+
/**
|
|
6
|
+
* Client component for rendering docs
|
|
7
|
+
* Receives the initial path from the server for hydration
|
|
8
|
+
*/ export function DocsClientPage({ initialPath }) {
|
|
9
|
+
return /*#__PURE__*/ _jsx(MobileProvider, {
|
|
10
|
+
children: /*#__PURE__*/ _jsx("div", {
|
|
11
|
+
className: "min-h-screen bg-background",
|
|
12
|
+
children: /*#__PURE__*/ _jsx(Docs, {
|
|
13
|
+
initialPath: initialPath
|
|
14
|
+
})
|
|
15
|
+
})
|
|
16
|
+
});
|
|
17
|
+
}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { headers } from 'next/headers';
|
|
3
|
+
import { extractProjectContext } from '@/lib/multi-tenant/context';
|
|
4
|
+
import { getProjectContent } from '@/lib/storage/blob';
|
|
5
|
+
import { DocsClientPage } from './client';
|
|
6
|
+
/**
|
|
7
|
+
* Parse URL path into route components
|
|
8
|
+
*/ function parseSlug(slug) {
|
|
9
|
+
if (!slug || slug.length === 0) {
|
|
10
|
+
return {
|
|
11
|
+
tab: null,
|
|
12
|
+
contentType: null,
|
|
13
|
+
contentId: null,
|
|
14
|
+
view: 'docs'
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
const [tab, type, ...rest] = slug;
|
|
18
|
+
// Check if last part is a view mode
|
|
19
|
+
const lastPart = rest[rest.length - 1];
|
|
20
|
+
const isViewSuffix = lastPart === 'playground' || lastPart === 'notes';
|
|
21
|
+
const view = isViewSuffix ? lastPart : 'docs';
|
|
22
|
+
// Get content ID (everything between type and view)
|
|
23
|
+
const idParts = isViewSuffix ? rest.slice(0, -1) : rest;
|
|
24
|
+
const contentId = idParts.join('/') || null;
|
|
25
|
+
// Determine content type
|
|
26
|
+
let contentType = null;
|
|
27
|
+
if (type === 'page') contentType = 'page';
|
|
28
|
+
else if (type === 'endpoint') contentType = 'endpoint';
|
|
29
|
+
return {
|
|
30
|
+
tab: tab || null,
|
|
31
|
+
contentType,
|
|
32
|
+
contentId,
|
|
33
|
+
view
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Generate dynamic metadata for SEO and social sharing
|
|
38
|
+
*/ export async function generateMetadata({ params }) {
|
|
39
|
+
const { slug } = await params;
|
|
40
|
+
const headersList = await headers();
|
|
41
|
+
const hostname = headersList.get('host') || 'localhost';
|
|
42
|
+
const context = extractProjectContext(hostname);
|
|
43
|
+
// Parse the route
|
|
44
|
+
const route = parseSlug(slug);
|
|
45
|
+
// Default metadata
|
|
46
|
+
const defaultMeta = {
|
|
47
|
+
title: 'Documentation',
|
|
48
|
+
description: 'API Documentation and Reference'
|
|
49
|
+
};
|
|
50
|
+
if (!context.isMultiTenant || !context.slug) {
|
|
51
|
+
return defaultMeta;
|
|
52
|
+
}
|
|
53
|
+
try {
|
|
54
|
+
const projectContent = await getProjectContent(context.slug);
|
|
55
|
+
if (!projectContent) {
|
|
56
|
+
return defaultMeta;
|
|
57
|
+
}
|
|
58
|
+
const docsConfig = JSON.parse(projectContent.docsJson);
|
|
59
|
+
const themeConfig = projectContent.themeJson ? JSON.parse(projectContent.themeJson) : null;
|
|
60
|
+
const projectName = docsConfig.name || 'Documentation';
|
|
61
|
+
const projectDescription = docsConfig.description || `${projectName} - API Documentation and Reference`;
|
|
62
|
+
// Build logo URL
|
|
63
|
+
const logoUrl = themeConfig?.logo?.url ? `https://${context.slug}.devdoc.sh/api/assets/${context.slug}${themeConfig.logo.url.replace('/assets', '')}` : null;
|
|
64
|
+
// Generate page-specific title and description
|
|
65
|
+
let pageTitle = projectName;
|
|
66
|
+
let pageDescription = projectDescription;
|
|
67
|
+
if (route.contentType === 'page' && route.contentId) {
|
|
68
|
+
// Find the page in docs config to get its title
|
|
69
|
+
const pageName = route.contentId.split('/').pop()?.replace(/-/g, ' ') || route.contentId;
|
|
70
|
+
pageTitle = `${pageName.charAt(0).toUpperCase() + pageName.slice(1)} | ${projectName}`;
|
|
71
|
+
pageDescription = `${pageName} - ${projectDescription}`;
|
|
72
|
+
} else if (route.contentType === 'endpoint' && route.contentId) {
|
|
73
|
+
// Format endpoint name
|
|
74
|
+
const endpointName = route.contentId.replace(/-/g, ' ');
|
|
75
|
+
pageTitle = `${endpointName.charAt(0).toUpperCase() + endpointName.slice(1)} | ${projectName}`;
|
|
76
|
+
pageDescription = `API endpoint: ${endpointName} - ${projectDescription}`;
|
|
77
|
+
} else if (route.tab) {
|
|
78
|
+
// Tab-level page
|
|
79
|
+
const tabName = route.tab.replace(/-/g, ' ');
|
|
80
|
+
pageTitle = `${tabName.charAt(0).toUpperCase() + tabName.slice(1)} | ${projectName}`;
|
|
81
|
+
}
|
|
82
|
+
return {
|
|
83
|
+
title: pageTitle,
|
|
84
|
+
description: pageDescription,
|
|
85
|
+
openGraph: {
|
|
86
|
+
title: pageTitle,
|
|
87
|
+
description: pageDescription,
|
|
88
|
+
siteName: projectName,
|
|
89
|
+
type: 'website',
|
|
90
|
+
url: `https://${context.slug}.devdoc.sh/${slug?.join('/') || ''}`,
|
|
91
|
+
...logoUrl && {
|
|
92
|
+
images: [
|
|
93
|
+
{
|
|
94
|
+
url: logoUrl,
|
|
95
|
+
width: 1200,
|
|
96
|
+
height: 630,
|
|
97
|
+
alt: projectName
|
|
98
|
+
}
|
|
99
|
+
]
|
|
100
|
+
}
|
|
101
|
+
},
|
|
102
|
+
twitter: {
|
|
103
|
+
card: logoUrl ? 'summary_large_image' : 'summary',
|
|
104
|
+
title: pageTitle,
|
|
105
|
+
description: pageDescription,
|
|
106
|
+
...logoUrl && {
|
|
107
|
+
images: [
|
|
108
|
+
logoUrl
|
|
109
|
+
]
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
};
|
|
113
|
+
} catch (error) {
|
|
114
|
+
console.error('[Metadata] Error:', error);
|
|
115
|
+
return defaultMeta;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Server component that renders the client docs page
|
|
120
|
+
*/ export default async function DocsPage({ params }) {
|
|
121
|
+
const { slug } = await params;
|
|
122
|
+
return /*#__PURE__*/ _jsx(DocsClientPage, {
|
|
123
|
+
initialPath: `/${slug?.join('/') || ''}`
|
|
124
|
+
});
|
|
125
|
+
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { NextResponse } from 'next/server';
|
|
2
|
-
import {
|
|
2
|
+
import { list } from '@vercel/blob';
|
|
3
3
|
import path from 'path';
|
|
4
4
|
import fs from 'fs';
|
|
5
5
|
// Check if we're in local development mode
|
|
@@ -57,20 +57,43 @@ const LOCAL_STORAGE_DIR = path.join(process.cwd(), '.devdoc-storage');
|
|
|
57
57
|
}
|
|
58
58
|
});
|
|
59
59
|
}
|
|
60
|
-
// Production - fetch from Vercel Blob
|
|
61
|
-
|
|
62
|
-
|
|
60
|
+
// Production - fetch from Vercel Blob using list()
|
|
61
|
+
// We use list with prefix to find the blob since head() requires the full URL
|
|
62
|
+
const { blobs } = await list({
|
|
63
|
+
prefix: blobPath,
|
|
64
|
+
limit: 1
|
|
65
|
+
});
|
|
66
|
+
if (!blobs || blobs.length === 0) {
|
|
63
67
|
return NextResponse.json({
|
|
64
68
|
error: 'Asset not found'
|
|
65
69
|
}, {
|
|
66
70
|
status: 404
|
|
67
71
|
});
|
|
68
72
|
}
|
|
69
|
-
//
|
|
70
|
-
|
|
71
|
-
|
|
73
|
+
// Fetch and proxy the content through Vercel's edge for CDN caching
|
|
74
|
+
// This reduces blob storage data transfer charges as edge caches the response
|
|
75
|
+
const blobResponse = await fetch(blobs[0].url);
|
|
76
|
+
if (!blobResponse.ok) {
|
|
77
|
+
return NextResponse.json({
|
|
78
|
+
error: 'Failed to fetch asset'
|
|
79
|
+
}, {
|
|
80
|
+
status: 502
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
const contentType = getContentType(fileName);
|
|
84
|
+
const arrayBuffer = await blobResponse.arrayBuffer();
|
|
85
|
+
return new NextResponse(arrayBuffer, {
|
|
86
|
+
status: 200,
|
|
72
87
|
headers: {
|
|
73
|
-
'
|
|
88
|
+
'Content-Type': contentType,
|
|
89
|
+
// Aggressive CDN caching for static assets
|
|
90
|
+
// s-maxage: cache at edge for 1 year (assets are immutable by path)
|
|
91
|
+
// max-age: browser cache for 1 day (allows updates on hard refresh)
|
|
92
|
+
'Cache-Control': 'public, max-age=86400, s-maxage=31536000, immutable',
|
|
93
|
+
// Vercel-specific CDN caching
|
|
94
|
+
'CDN-Cache-Control': 'public, s-maxage=31536000, immutable',
|
|
95
|
+
// Cache tag for invalidation on redeploy
|
|
96
|
+
'x-vercel-cache-tags': `assets-${slug}`
|
|
74
97
|
}
|
|
75
98
|
});
|
|
76
99
|
} catch (error) {
|