@dollhousemcp/mcp-server
Version:
DollhouseMCP - A Model Context Protocol (MCP) server that enables dynamic AI persona management from markdown files, allowing Claude and other compatible AI assistants to activate and switch between different behavioral personas.
196 lines • 22.7 kB
JavaScript
/**
* Wizard Text Templates
*
* Centralized configuration for all wizard text to support:
* - Internationalization (i18n) in the future
* - Consistent messaging across the application
* - Easy updates without modifying business logic
* - Template reusability
*/
import { env } from './env.js';
/**
* Default English templates
*/
export const defaultWizardTemplates = {
title: '🧙 Configuration Wizard',
currentConfigHeader: '📊 Current Configuration:',
steps: {
userIdentity: {
title: '🎯 Step 1: User Identity',
description: 'This tags your creations so you can find them later. Everything is saved locally on your computer.',
instructions: [
'To set a username: Say "Set my username to [your-name]"',
'To stay anonymous: Say "I\'ll stay anonymous"',
],
currentValue: (value) => value || '(not set - anonymous mode)',
},
githubIntegration: {
title: '🔐 Step 2: GitHub Integration (Optional)',
description: 'Connect to GitHub to share your creations and browse community content.',
instructions: [
'To connect GitHub: Say "Connect my GitHub account"',
'To skip: Say "Skip GitHub for now"',
],
currentValue: (value) => value ? 'Connected' : '(not connected)',
},
portfolioSync: {
title: '🔄 Step 3: Portfolio Sync (Optional)',
description: 'Automatically backup your creations to GitHub.',
instructions: [
'To enable: Say "Enable auto-sync"',
'To keep manual: Say "I\'ll sync manually"',
],
currentValue: (value) => value ? 'Enabled' : 'Manual',
},
displayPreferences: {
title: '🎨 Step 4: Display Preferences',
description: 'Customize how DollhouseMCP shows information.',
instructions: [
'To show active persona: Say "Show persona indicators"',
'To keep minimal: Say "Use minimal display"',
],
currentValue: (value) => value ? 'Enabled' : 'Minimal',
},
},
instructions: {
quick: '💡 **Quick Setup**: Say "Configure the basics" to set just username and GitHub',
detailed: '📝 **Detailed Setup**: Say "Configure everything" to go through all options',
skip: '⏭️ **Skip for Now**: Say "Skip wizard" to use anonymous mode',
},
footer: '✨ You can always change these settings later by saying "Open configuration wizard"',
};
/**
* Friendly value replacements for null/undefined config values
*/
export const friendlyNullValues = {
// User fields
'user.username': '(not set - anonymous mode active)',
'user.email': '(optional - not set)',
'user.display_name': '(not set - will use username)',
// GitHub fields
'github.auth_token': '(not configured - GitHub features disabled)',
'github.oauth_token': '(not authenticated)',
'github.default_repository': '(not set - will use default)',
'github.username': '(not connected)',
// Portfolio sync fields
'portfolio.sync_status.last_sync': '(never synced)',
'portfolio.sync_status.last_push': '(never pushed)',
'portfolio.sync_status.last_pull': '(never pulled)',
'portfolio.repository_name': `(using default: ${env.GITHUB_REPOSITORY || 'dollhouse-portfolio'})`,
// Collection submission
'collection_submission.auto_submit': '(disabled)',
// Indicator settings
'indicator.custom_format': '(using default format)',
// Default for any other null
'default': '(not set)',
};
/**
* Helper function to get wizard text in specified language
* @param language - Language code (e.g., 'en', 'es', 'fr')
* @returns Wizard templates for the specified language
*/
export function getWizardTemplates(language = 'en') {
// For now, only English is supported
// Future: Load from language-specific files
switch (language) {
case 'en':
default:
return defaultWizardTemplates;
}
}
/**
* Helper function to get friendly null value
* @param path - Dot-notation path to the config field
* @returns Friendly message for null value
*/
export function getFriendlyNullValue(path) {
return friendlyNullValues[path] || friendlyNullValues['default'];
}
/**
* Template builder for wizard steps
* Allows for dynamic construction of wizard content
*/
export class WizardTemplateBuilder {
templates;
constructor(language = 'en') {
this.templates = getWizardTemplates(language);
}
/**
* Build the complete wizard text
*/
buildWizardText(currentConfig) {
const parts = [
this.templates.title,
'',
this.buildCurrentConfig(currentConfig),
'',
this.buildSteps(currentConfig),
'',
this.buildInstructions(),
'',
this.templates.footer,
];
return parts.join('\n');
}
/**
* Build current configuration section
*/
buildCurrentConfig(config) {
return `${this.templates.currentConfigHeader}
\`\`\`yaml
${this.formatConfigAsYaml(config)}
\`\`\``;
}
/**
* Build all wizard steps
*/
buildSteps(config) {
const steps = [];
// User Identity
const userStep = this.templates.steps.userIdentity;
steps.push(this.formatStep(userStep, config.user?.username));
// GitHub Integration
const githubStep = this.templates.steps.githubIntegration;
steps.push(this.formatStep(githubStep, config.github?.auth_token));
// Portfolio Sync
const portfolioStep = this.templates.steps.portfolioSync;
steps.push(this.formatStep(portfolioStep, config.portfolio?.auto_sync));
// Display Preferences
const displayStep = this.templates.steps.displayPreferences;
steps.push(this.formatStep(displayStep, config.indicator?.enabled));
return steps.join('\n\n');
}
/**
* Format a single wizard step
*/
formatStep(step, currentValue) {
const lines = [
step.title,
step.description,
];
for (const instruction of step.instructions) {
lines.push(`- ${instruction}`);
}
lines.push(`- Current: ${step.currentValue(currentValue)}`);
return lines.join('\n');
}
/**
* Build instruction options
*/
buildInstructions() {
return [
this.templates.instructions.quick,
this.templates.instructions.detailed,
this.templates.instructions.skip,
].join('\n');
}
/**
* Format config as YAML (stub - would use actual yaml library)
*/
formatConfigAsYaml(_config) {
// This would use the actual yaml.dump with friendly values
// For now, return a placeholder
return 'user:\n username: (not set)\n email: (optional)';
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2l6YXJkVGVtcGxhdGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbmZpZy93aXphcmRUZW1wbGF0ZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7O0dBUUc7QUFFSCxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBMEIvQjs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFvQjtJQUNyRCxLQUFLLEVBQUUseUJBQXlCO0lBQ2hDLG1CQUFtQixFQUFFLDJCQUEyQjtJQUVoRCxLQUFLLEVBQUU7UUFDTCxZQUFZLEVBQUU7WUFDWixLQUFLLEVBQUUsMEJBQTBCO1lBQ2pDLFdBQVcsRUFBRSxvR0FBb0c7WUFDakgsWUFBWSxFQUFFO2dCQUNaLHlEQUF5RDtnQkFDekQsK0NBQStDO2FBQ2hEO1lBQ0QsWUFBWSxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLElBQUksNEJBQTRCO1NBQy9EO1FBRUQsaUJBQWlCLEVBQUU7WUFDakIsS0FBSyxFQUFFLDBDQUEwQztZQUNqRCxXQUFXLEVBQUUseUVBQXlFO1lBQ3RGLFlBQVksRUFBRTtnQkFDWixvREFBb0Q7Z0JBQ3BELG9DQUFvQzthQUNyQztZQUNELFlBQVksRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLGlCQUFpQjtTQUNqRTtRQUVELGFBQWEsRUFBRTtZQUNiLEtBQUssRUFBRSxzQ0FBc0M7WUFDN0MsV0FBVyxFQUFFLGdEQUFnRDtZQUM3RCxZQUFZLEVBQUU7Z0JBQ1osbUNBQW1DO2dCQUNuQywyQ0FBMkM7YUFDNUM7WUFDRCxZQUFZLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxRQUFRO1NBQ3REO1FBRUQsa0JBQWtCLEVBQUU7WUFDbEIsS0FB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VyxFQUFFLENBQUMsQ0FBQztRQUNqQyxDQUFDO1FBRUQsS0FBSyxDQUFDLElBQUksQ0FBQyxjQUFjLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRTVELE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMxQixDQUFDO0lBRUQ7O09BRUc7SUFDSyxpQkFBaUI7UUFDdkIsT0FBTztZQUNMLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLEtBQUs7WUFDakMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsUUFBUTtZQUNwQyxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxJQUFJO1NBQ2pDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2YsQ0FBQztJQUVEOztPQUVHO0lBQ0ssa0JBQWtCLENBQUMsT0FBWTtRQUNyQywyREFBMkQ7UUFDM0QsZ0NBQWdDO1FBQ2hDLE9BQU8sbURBQW1ELENBQUM7SUFDN0QsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBXaXphcmQgVGV4dCBUZW1wbGF0ZXNcbiAqXG4gKiBDZW50cmFsaXplZCBjb25maWd1cmF0aW9uIGZvciBhbGwgd2l6YXJkIHRleHQgdG8gc3VwcG9ydDpcbiAqIC0gSW50ZXJuYXRpb25hbGl6YXRpb24gKGkxOG4pIGluIHRoZSBmdXR1cmVcbiAqIC0gQ29uc2lzdGVudCBtZXNzYWdpbmcgYWNyb3NzIHRoZSBhcHBsaWNhdGlvblxuICogLSBFYXN5IHVwZGF0ZXMgd2l0aG91dCBtb2RpZnlpbmcgYnVzaW5lc3MgbG9naWNcbiAqIC0gVGVtcGxhdGUgcmV1c2FiaWxpdHlcbiAqL1xuXG5pbXBvcnQgeyBlbnYgfSBmcm9tICcuL2Vudi5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgV2l6YXJkVGVtcGxhdGVzIHtcbiAgdGl0bGU6IHN0cmluZztcbiAgY3VycmVudENvbmZpZ0hlYWRlcjogc3RyaW5nO1xuICBzdGVwczoge1xuICAgIHVzZXJJZGVudGl0eTogV2l6YXJkU3RlcDtcbiAgICBnaXRodWJJbnRlZ3JhdGlvbjogV2l6YXJkU3RlcDtcbiAgICBwb3J0Zm9saW9TeW5jOiBXaXphcmRTdGVwO1xuICAgIGRpc3BsYXlQcmVmZXJlbmNlczogV2l6YXJkU3RlcDtcbiAgfTtcbiAgaW5zdHJ1Y3Rpb25zOiB7XG4gICAgcXVpY2s6IHN0cmluZztcbiAgICBkZXRhaWxlZDogc3RyaW5nO1xuICAgIHNraXA6IHN0cmluZztcbiAgfTtcbiAgZm9vdGVyOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgV2l6YXJkU3RlcCB7XG4gIHRpdGxlOiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIGluc3RydWN0aW9uczogc3RyaW5nW107XG4gIGN1cnJlbnRWYWx1ZTogKHZhbHVlOiBhbnkpID0+IHN0cmluZztcbn1cblxuLyoqXG4gKiBEZWZhdWx0IEVuZ2xpc2ggdGVtcGxhdGVzXG4gKi9cbmV4cG9ydCBjb25zdCBkZWZhdWx0V2l6YXJkVGVtcGxhdGVzOiBXaXphcmRUZW1wbGF0ZXMgPSB7XG4gIHRpdGxlOiAn8J+nmSBDb25maWd1cmF0aW9uIFdpemFyZCcsXG4gIGN1cnJlbnRDb25maWdIZWFkZXI6ICfwn5OKIEN1cnJlbnQgQ29uZmlndXJhdGlvbjonLFxuICBcbiAgc3RlcHM6IHtcbiAgICB1c2VySWRlbnRpdHk6IHtcbiAgICAgIHRpdGxlOiAn8J+OryBTdGVwIDE6IFVzZXIgSWRlbnRpdHknLFxuICAgICAgZGVzY3JpcHRpb246ICdUaGlzIHRhZ3MgeW91ciBjcmVhdGlvbnMgc28geW91IGNhbiBmaW5kIHRoZW0gbGF0ZXIuIEV2ZXJ5dGhpbmcgaXMgc2F2ZWQgbG9jYWxseSBvbiB5b3VyIGNvbXB1dGVyLicsXG4gICAgICBpbnN0cnVjdGlvbnM6IFtcbiAgICAgICAgJ1RvIHNldCBhIHVzZXJuYW1lOiBTYXkgXCJTZXQgbXkgdXNlcm5hbWUgdG8gW3lvdXItbmFtZV1cIicsXG4gICAgICAgICdUbyBzdGF5IGFub255bW91czogU2F5IFwiSVxcJ2xsIHN0YXkgYW5vbnltb3VzXCInLFxuICAgICAgXSxcbiAgICAgIGN1cnJlbnRWYWx1ZTogKHZhbHVlKSA9PiB2YWx1ZSB8fCAnKG5vdCBzZXQgLSBhbm9ueW1vdXMgbW9kZSknLFxuICAgIH0sXG4gICAgXG4gICAgZ2l0aHViSW50ZWdyYXRpb246IHtcbiAgICAgIHRpdGxlOiAn8J+UkCBTdGVwIDI6IEdpdEh1YiBJbnRlZ3JhdGlvbiAoT3B0aW9uYWwpJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnQ29ubmVjdCB0byBHaXRIdWIgdG8gc2hhcmUgeW91ciBjcmVhdGlvbnMgYW5kIGJyb3dzZSBjb21tdW5pdHkgY29udGVudC4nLFxuICAgICAgaW5zdHJ1Y3Rpb25zOiBbXG4gICAgICAgICdUbyBjb25uZWN0IEdpdEh1YjogU2F5IFwiQ29ubmVjdCBteSBHaXRIdWIgYWNjb3VudFwiJyxcbiAgICAgICAgJ1RvIHNraXA6IFNheSBcIlNraXAgR2l0SHViIGZvciBub3dcIicsXG4gICAgICBdLFxuICAgICAgY3VycmVudFZhbHVlOiAodmFsdWUpID0+IHZhbHVlID8gJ0Nvbm5lY3RlZCcgOiAnKG5vdCBjb25uZWN0ZWQpJyxcbiAgICB9LFxuICAgIFxuICAgIHBvcnRmb2xpb1N5bmM6IHtcbiAgICAgIHRpdGxlOiAn8J+UhCBTdGVwIDM6IFBvcnRmb2xpbyBTeW5jIChPcHRpb25hbCknLFxuICAgICAgZGVzY3JpcHRpb246ICdBdXRvbWF0aWNhbGx5IGJhY2t1cCB5b3VyIGNyZWF0aW9ucyB0byBHaXRIdWIuJyxcbiAgICAgIGluc3RydWN0aW9uczogW1xuICAgICAgICAnVG8gZW5hYmxlOiBTYXkgXCJFbmFibGUgYXV0by1zeW5jXCInLFxuICAgICAgICAnVG8ga2VlcCBtYW51YWw6IFNheSBcIklcXCdsbCBzeW5jIG1hbnVhbGx5XCInLFxuICAgICAgXSxcbiAgICAgIGN1cnJlbnRWYWx1ZTogKHZhbHVlKSA9PiB2YWx1ZSA/ICdFbmFibGVkJyA6ICdNYW51YWwnLFxuICAgIH0sXG4gICAgXG4gICAgZGlzcGxheVByZWZlcmVuY2VzOiB7XG4gICAgICB0aXRsZTogJ/CfjqggU3RlcCA0OiBEaXNwbGF5IFByZWZlcmVuY2VzJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnQ3VzdG9taXplIGhvdyBEb2xsaG91c2VNQ1Agc2hvd3MgaW5mb3JtYXRpb24uJyxcbiAgICAgIGluc3RydWN0aW9uczogW1xuICAgICAgICAnVG8gc2hvdyBhY3RpdmUgcGVyc29uYTogU2F5IFwiU2hvdyBwZXJzb25hIGluZGljYXRvcnNcIicsXG4gICAgICAgICdUbyBrZWVwIG1pbmltYWw6IFNheSBcIlVzZSBtaW5pbWFsIGRpc3BsYXlcIicsXG4gICAgICBdLFxuICAgICAgY3VycmVudFZhbHVlOiAodmFsdWUpID0+IHZhbHVlID8gJ0VuYWJsZWQnIDogJ01pbmltYWwnLFxuICAgIH0sXG4gIH0sXG4gIFxuICBpbnN0cnVjdGlvbnM6IHtcbiAgICBxdWljazogJ/CfkqEgKipRdWljayBTZXR1cCoqOiBTYXkgXCJDb25maWd1cmUgdGhlIGJhc2ljc1wiIHRvIHNldCBqdXN0IHVzZXJuYW1lIGFuZCBHaXRIdWInLFxuICAgIGRldGFpbGVkOiAn8J+TnSAqKkRldGFpbGVkIFNldHVwKio6IFNheSBcIkNvbmZpZ3VyZSBldmVyeXRoaW5nXCIgdG8gZ28gdGhyb3VnaCBhbGwgb3B0aW9ucycsXG4gICAgc2tpcDogJ+KPre+4jyAqKlNraXAgZm9yIE5vdyoqOiBTYXkgXCJTa2lwIHdpemFyZFwiIHRvIHVzZSBhbm9ueW1vdXMgbW9kZScsXG4gIH0sXG4gIFxuICBmb290ZXI6ICfinKggWW91IGNhbiBhbHdheXMgY2hhbmdlIHRoZXNlIHNldHRpbmdzIGxhdGVyIGJ5IHNheWluZyBcIk9wZW4gY29uZmlndXJhdGlvbiB3aXphcmRcIicsXG59O1xuXG4vKipcbiAqIEZyaWVuZGx5IHZhbHVlIHJlcGxhY2VtZW50cyBmb3IgbnVsbC91bmRlZmluZWQgY29uZmlnIHZhbHVlc1xuICovXG5leHBvcnQgY29uc3QgZnJpZW5kbHlOdWxsVmFsdWVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAvLyBVc2VyIGZpZWxkc1xuICAndXNlci51c2VybmFtZSc6ICcobm90IHNldCAtIGFub255bW91cyBtb2RlIGFjdGl2ZSknLFxuICAndXNlci5lbWFpbCc6ICcob3B0aW9uYWwgLSBub3Qgc2V0KScsXG4gICd1c2VyLmRpc3BsYXlfbmFtZSc6ICcobm90IHNldCAtIHdpbGwgdXNlIHVzZXJuYW1lKScsXG4gIFxuICAvLyBHaXRIdWIgZmllbGRzXG4gICdnaXRodWIuYXV0aF90b2tlbic6ICcobm90IGNvbmZpZ3VyZWQgLSBHaXRIdWIgZmVhdHVyZXMgZGlzYWJsZWQpJyxcbiAgJ2dpdGh1Yi5vYXV0aF90b2tlbic6ICcobm90IGF1dGhlbnRpY2F0ZWQpJyxcbiAgJ2dpdGh1Yi5kZWZhdWx0X3JlcG9zaXRvcnknOiAnKG5vdCBzZXQgLSB3aWxsIHVzZSBkZWZhdWx0KScsXG4gICdnaXRodWIudXNlcm5hbWUnOiAnKG5vdCBjb25uZWN0ZWQpJyxcbiAgXG4gIC8vIFBvcnRmb2xpbyBzeW5jIGZpZWxkc1xuICAncG9ydGZvbGlvLnN5bmNfc3RhdHVzLmxhc3Rfc3luYyc6ICcobmV2ZXIgc3luY2VkKScsXG4gICdwb3J0Zm9saW8uc3luY19zdGF0dXMubGFzdF9wdXNoJzogJyhuZXZlciBwdXNoZWQpJyxcbiAgJ3BvcnRmb2xpby5zeW5jX3N0YXR1cy5sYXN0X3B1bGwnOiAnKG5ldmVyIHB1bGxlZCknLFxuICAncG9ydGZvbGlvLnJlcG9zaXRvcnlfbmFtZSc6IGAodXNpbmcgZGVmYXVsdDogJHtlbnYuR0lUSFVCX1JFUE9TSVRPUlkgfHwgJ2RvbGxob3VzZS1wb3J0Zm9saW8nfSlgLFxuICBcbiAgLy8gQ29sbGVjdGlvbiBzdWJtaXNzaW9uXG4gICdjb2xsZWN0aW9uX3N1Ym1pc3Npb24uYXV0b19zdWJtaXQnOiAnKGRpc2FibGVkKScsXG4gIFxuICAvLyBJbmRpY2F0b3Igc2V0dGluZ3NcbiAgJ2luZGljYXRvci5jdXN0b21fZm9ybWF0JzogJyh1c2luZyBkZWZhdWx0IGZvcm1hdCknLFxuICBcbiAgLy8gRGVmYXVsdCBmb3IgYW55IG90aGVyIG51bGxcbiAgJ2RlZmF1bHQnOiAnKG5vdCBzZXQpJyxcbn07XG5cbi8qKlxuICogSGVscGVyIGZ1bmN0aW9uIHRvIGdldCB3aXphcmQgdGV4dCBpbiBzcGVjaWZpZWQgbGFuZ3VhZ2VcbiAqIEBwYXJhbSBsYW5ndWFnZSAtIExhbmd1YWdlIGNvZGUgKGUuZy4sICdlbicsICdlcycsICdmcicpXG4gKiBAcmV0dXJucyBXaXphcmQgdGVtcGxhdGVzIGZvciB0aGUgc3BlY2lmaWVkIGxhbmd1YWdlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRXaXphcmRUZW1wbGF0ZXMobGFuZ3VhZ2U6IHN0cmluZyA9ICdlbicpOiBXaXphcmRUZW1wbGF0ZXMge1xuICAvLyBGb3Igbm93LCBvbmx5IEVuZ2xpc2ggaXMgc3VwcG9ydGVkXG4gIC8vIEZ1dHVyZTogTG9hZCBmcm9tIGxhbmd1YWdlLXNwZWNpZmljIGZpbGVzXG4gIHN3aXRjaCAobGFuZ3VhZ2UpIHtcbiAgICBjYXNlICdlbic6XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBkZWZhdWx0V2l6YXJkVGVtcGxhdGVzO1xuICB9XG59XG5cbi8qKlxuICogSGVscGVyIGZ1bmN0aW9uIHRvIGdldCBmcmllbmRseSBudWxsIHZhbHVlXG4gKiBAcGFyYW0gcGF0aCAtIERvdC1ub3RhdGlvbiBwYXRoIHRvIHRoZSBjb25maWcgZmllbGRcbiAqIEByZXR1cm5zIEZyaWVuZGx5IG1lc3NhZ2UgZm9yIG51bGwgdmFsdWVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEZyaWVuZGx5TnVsbFZhbHVlKHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBmcmllbmRseU51bGxWYWx1ZXNbcGF0aF0gfHwgZnJpZW5kbHlOdWxsVmFsdWVzWydkZWZhdWx0J107XG59XG5cbi8qKlxuICogVGVtcGxhdGUgYnVpbGRlciBmb3Igd2l6YXJkIHN0ZXBzXG4gKiBBbGxvd3MgZm9yIGR5bmFtaWMgY29uc3RydWN0aW9uIG9mIHdpemFyZCBjb250ZW50XG4gKi9cbmV4cG9ydCBjbGFzcyBXaXphcmRUZW1wbGF0ZUJ1aWxkZXIge1xuICBwcml2YXRlIHRlbXBsYXRlczogV2l6YXJkVGVtcGxhdGVzO1xuICBcbiAgY29uc3RydWN0b3IobGFuZ3VhZ2U6IHN0cmluZyA9ICdlbicpIHtcbiAgICB0aGlzLnRlbXBsYXRlcyA9IGdldFdpemFyZFRlbXBsYXRlcyhsYW5ndWFnZSk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBCdWlsZCB0aGUgY29tcGxldGUgd2l6YXJkIHRleHRcbiAgICovXG4gIGJ1aWxkV2l6YXJkVGV4dChjdXJyZW50Q29uZmlnOiBhbnkpOiBzdHJpbmcge1xuICAgIGNvbnN0IHBhcnRzOiBzdHJpbmdbXSA9IFtcbiAgICAgIHRoaXMudGVtcGxhdGVzLnRpdGxlLFxuICAgICAgJycsXG4gICAgICB0aGlzLmJ1aWxkQ3VycmVudENvbmZpZyhjdXJyZW50Q29uZmlnKSxcbiAgICAgICcnLFxuICAgICAgdGhpcy5idWlsZFN0ZXBzKGN1cnJlbnRDb25maWcpLFxuICAgICAgJycsXG4gICAgICB0aGlzLmJ1aWxkSW5zdHJ1Y3Rpb25zKCksXG4gICAgICAnJyxcbiAgICAgIHRoaXMudGVtcGxhdGVzLmZvb3RlcixcbiAgICBdO1xuICAgIFxuICAgIHJldHVybiBwYXJ0cy5qb2luKCdcXG4nKTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIEJ1aWxkIGN1cnJlbnQgY29uZmlndXJhdGlvbiBzZWN0aW9uXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkQ3VycmVudENvbmZpZyhjb25maWc6IGFueSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMudGVtcGxhdGVzLmN1cnJlbnRDb25maWdIZWFkZXJ9XG5cXGBcXGBcXGB5YW1sXG4ke3RoaXMuZm9ybWF0Q29uZmlnQXNZYW1sKGNvbmZpZyl9XG5cXGBcXGBcXGBgO1xuICB9XG4gIFxuICAvKipcbiAgICogQnVpbGQgYWxsIHdpemFyZCBzdGVwc1xuICAgKi9cbiAgcHJpdmF0ZSBidWlsZFN0ZXBzKGNvbmZpZzogYW55KTogc3RyaW5nIHtcbiAgICBjb25zdCBzdGVwcyA9IFtdO1xuICAgIFxuICAgIC8vIFVzZXIgSWRlbnRpdHlcbiAgICBjb25zdCB1c2VyU3RlcCA9IHRoaXMudGVtcGxhdGVzLnN0ZXBzLnVzZXJJZGVudGl0eTtcbiAgICBzdGVwcy5wdXNoKHRoaXMuZm9ybWF0U3RlcCh1c2VyU3RlcCwgY29uZmlnLnVzZXI/LnVzZXJuYW1lKSk7XG4gICAgXG4gICAgLy8gR2l0SHViIEludGVncmF0aW9uXG4gICAgY29uc3QgZ2l0aHViU3RlcCA9IHRoaXMudGVtcGxhdGVzLnN0ZXBzLmdpdGh1YkludGVncmF0aW9uO1xuICAgIHN0ZXBzLnB1c2godGhpcy5mb3JtYXRTdGVwKGdpdGh1YlN0ZXAsIGNvbmZpZy5naXRodWI/LmF1dGhfdG9rZW4pKTtcbiAgICBcbiAgICAvLyBQb3J0Zm9saW8gU3luY1xuICAgIGNvbnN0IHBvcnRmb2xpb1N0ZXAgPSB0aGlzLnRlbXBsYXRlcy5zdGVwcy5wb3J0Zm9saW9TeW5jO1xuICAgIHN0ZXBzLnB1c2godGhpcy5mb3JtYXRTdGVwKHBvcnRmb2xpb1N0ZXAsIGNvbmZpZy5wb3J0Zm9saW8/LmF1dG9fc3luYykpO1xuICAgIFxuICAgIC8vIERpc3BsYXkgUHJlZmVyZW5jZXNcbiAgICBjb25zdCBkaXNwbGF5U3RlcCA9IHRoaXMudGVtcGxhdGVzLnN0ZXBzLmRpc3BsYXlQcmVmZXJlbmNlcztcbiAgICBzdGVwcy5wdXNoKHRoaXMuZm9ybWF0U3RlcChkaXNwbGF5U3RlcCwgY29uZmlnLmluZGljYXRvcj8uZW5hYmxlZCkpO1xuICAgIFxuICAgIHJldHVybiBzdGVwcy5qb2luKCdcXG5cXG4nKTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIEZvcm1hdCBhIHNpbmdsZSB3aXphcmQgc3RlcFxuICAgKi9cbiAgcHJpdmF0ZSBmb3JtYXRTdGVwKHN0ZXA6IFdpemFyZFN0ZXAsIGN1cnJlbnRWYWx1ZTogYW55KTogc3RyaW5nIHtcbiAgICBjb25zdCBsaW5lcyA9IFtcbiAgICAgIHN0ZXAudGl0bGUsXG4gICAgICBzdGVwLmRlc2NyaXB0aW9uLFxuICAgIF07XG4gICAgXG4gICAgZm9yIChjb25zdCBpbnN0cnVjdGlvbiBvZiBzdGVwLmluc3RydWN0aW9ucykge1xuICAgICAgbGluZXMucHVzaChgLSAke2luc3RydWN0aW9ufWApO1xuICAgIH1cbiAgICBcbiAgICBsaW5lcy5wdXNoKGAtIEN1cnJlbnQ6ICR7c3RlcC5jdXJyZW50VmFsdWUoY3VycmVudFZhbHVlKX1gKTtcbiAgICBcbiAgICByZXR1cm4gbGluZXMuam9pbignXFxuJyk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBCdWlsZCBpbnN0cnVjdGlvbiBvcHRpb25zXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkSW5zdHJ1Y3Rpb25zKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHRoaXMudGVtcGxhdGVzLmluc3RydWN0aW9ucy5xdWljayxcbiAgICAgIHRoaXMudGVtcGxhdGVzLmluc3RydWN0aW9ucy5kZXRhaWxlZCxcbiAgICAgIHRoaXMudGVtcGxhdGVzLmluc3RydWN0aW9ucy5za2lwLFxuICAgIF0uam9pbignXFxuJyk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBGb3JtYXQgY29uZmlnIGFzIFlBTUwgKHN0dWIgLSB3b3VsZCB1c2UgYWN0dWFsIHlhbWwgbGlicmFyeSlcbiAgICovXG4gIHByaXZhdGUgZm9ybWF0Q29uZmlnQXNZYW1sKF9jb25maWc6IGFueSk6IHN0cmluZyB7XG4gICAgLy8gVGhpcyB3b3VsZCB1c2UgdGhlIGFjdHVhbCB5YW1sLmR1bXAgd2l0aCBmcmllbmRseSB2YWx1ZXNcbiAgICAvLyBGb3Igbm93LCByZXR1cm4gYSBwbGFjZWhvbGRlclxuICAgIHJldHVybiAndXNlcjpcXG4gIHVzZXJuYW1lOiAobm90IHNldClcXG4gIGVtYWlsOiAob3B0aW9uYWwpJztcbiAgfVxufSJdfQ==