UNPKG

@mickdarling/dollhousemcp

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.

158 lines 23.2 kB
// Default configuration export const DEFAULT_INDICATOR_CONFIG = { enabled: true, style: 'full', showEmoji: true, showName: true, showVersion: true, showAuthor: true, showCategory: false, separator: ' | ', emoji: '🎭', bracketStyle: 'square' }; // Predefined styles export const INDICATOR_STYLES = { full: '[{emoji} {name} v{version} by {author}]', minimal: '{emoji} {name}', compact: '[{name} v{version}]', custom: '{customFormat}' }; // Bracket mappings export const BRACKETS = { square: { open: '[', close: ']' }, round: { open: '(', close: ')' }, curly: { open: '{', close: '}' }, angle: { open: '<', close: '>' }, none: { open: '', close: '' } }; /** * Load indicator configuration from environment variables or use defaults. * Environment variables take precedence over default values. * * @returns {IndicatorConfig} The loaded configuration * @example * ```typescript * // Set environment variables before loading * process.env.DOLLHOUSE_INDICATOR_STYLE = 'minimal'; * process.env.DOLLHOUSE_INDICATOR_EMOJI = '🤖'; * * const config = loadIndicatorConfig(); * // config.style === 'minimal' * // config.emoji === '🤖' * ``` */ export function loadIndicatorConfig() { const config = { ...DEFAULT_INDICATOR_CONFIG }; // Check environment variables for overrides if (process.env.DOLLHOUSE_INDICATOR_ENABLED !== undefined) { config.enabled = process.env.DOLLHOUSE_INDICATOR_ENABLED === 'true'; } if (process.env.DOLLHOUSE_INDICATOR_STYLE) { const style = process.env.DOLLHOUSE_INDICATOR_STYLE; if (['full', 'minimal', 'compact', 'custom'].includes(style)) { config.style = style; } } if (process.env.DOLLHOUSE_INDICATOR_FORMAT) { config.customFormat = process.env.DOLLHOUSE_INDICATOR_FORMAT; config.style = 'custom'; } if (process.env.DOLLHOUSE_INDICATOR_EMOJI) { config.emoji = process.env.DOLLHOUSE_INDICATOR_EMOJI; } if (process.env.DOLLHOUSE_INDICATOR_BRACKETS) { const bracketStyle = process.env.DOLLHOUSE_INDICATOR_BRACKETS; if (['square', 'round', 'curly', 'angle', 'none'].includes(bracketStyle)) { config.bracketStyle = bracketStyle; } } // Parse show flags from environment if (process.env.DOLLHOUSE_INDICATOR_SHOW_VERSION !== undefined) { config.showVersion = process.env.DOLLHOUSE_INDICATOR_SHOW_VERSION === 'true'; } if (process.env.DOLLHOUSE_INDICATOR_SHOW_AUTHOR !== undefined) { config.showAuthor = process.env.DOLLHOUSE_INDICATOR_SHOW_AUTHOR === 'true'; } if (process.env.DOLLHOUSE_INDICATOR_SHOW_CATEGORY !== undefined) { config.showCategory = process.env.DOLLHOUSE_INDICATOR_SHOW_CATEGORY === 'true'; } return config; } /** * Validate custom format template for valid placeholders */ export function validateCustomFormat(format) { const validPlaceholders = ['{emoji}', '{name}', '{version}', '{author}', '{category}']; // Length limit added to prevent ReDoS attacks const placeholderRegex = /\{[^}]{0,50}\}/g; // Limited to 50 chars for placeholder names const foundPlaceholders = format.match(placeholderRegex) || []; for (const placeholder of foundPlaceholders) { if (!validPlaceholders.includes(placeholder)) { return { valid: false, error: `Invalid placeholder: ${placeholder}. Valid placeholders are: ${validPlaceholders.join(', ')}` }; } } return { valid: true }; } /** * Format the indicator based on configuration and persona metadata */ export function formatIndicator(config, metadata) { if (!config.enabled) { return ''; } // Get the format template based on style let template = INDICATOR_STYLES[config.style]; if (config.style === 'custom' && config.customFormat) { // Validate custom format const validation = validateCustomFormat(config.customFormat); if (!validation.valid) { // Fall back to full style if custom format is invalid template = INDICATOR_STYLES.full; } else { template = config.customFormat; } } // Replace placeholders with values or empty strings let result = template .replace('{emoji}', config.showEmoji ? config.emoji : '') .replace('{name}', config.showName ? metadata.name : '') .replace('{version}', config.showVersion && metadata.version ? metadata.version : '') .replace('{author}', config.showAuthor && metadata.author ? metadata.author : '') .replace('{category}', config.showCategory && metadata.category ? metadata.category : ''); // Clean up the format string // Remove "v" if no version follows it if (!config.showVersion || !metadata.version) { result = result.replace(/\sv(?=\s|]|\)|>|}|$)/, ''); } // Remove "by" if no author follows it if (!config.showAuthor || !metadata.author) { result = result.replace(/\sby(?=\s|]|\)|>|}|$)/, ''); } // Clean up extra spaces result = result.replace(/\s+/g, ' ').trim(); // Apply brackets based on the template format (only if template doesn't already have them) if (result && config.style !== 'custom') { // Check if the template already includes brackets const templateHasBrackets = template.includes('[') || template.includes(']') || template.includes('(') || template.includes(')') || template.includes('{') || template.includes('}') || template.includes('<') || template.includes('>'); if (!templateHasBrackets) { const brackets = BRACKETS[config.bracketStyle]; if (brackets.open || brackets.close) { result = `${brackets.open}${result}${brackets.close}`; } } } // Add separator if we have content if (result) { result += config.separator; } return result; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kaWNhdG9yLWNvbmZpZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb25maWcvaW5kaWNhdG9yLWNvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFtREEsd0JBQXdCO0FBQ3hCLE1BQU0sQ0FBQyxNQUFNLHdCQUF3QixHQUFvQjtJQUN2RCxPQUFPLEVBQUUsSUFBSTtJQUNiLEtBQUssRUFBRSxNQUFNO0lBQ2IsU0FBUyxFQUFFLElBQUk7SUFDZixRQUFRLEVBQUUsSUFBSTtJQUNkLFdBQVcsRUFBRSxJQUFJO0lBQ2pCLFVBQVUsRUFBRSxJQUFJO0lBQ2hCLFlBQVksRUFBRSxLQUFLO0lBQ25CLFNBQVMsRUFBRSxLQUFLO0lBQ2hCLEtBQUssRUFBRSxJQUFJO0lBQ1gsWUFBWSxFQUFFLFFBQVE7Q0FDdkIsQ0FBQztBQUVGLG9CQUFvQjtBQUNwQixNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRztJQUM5QixJQUFJLEVBQUUseUNBQXlDO0lBQy9DLE9BQU8sRUFBRSxnQkFBZ0I7SUFDekIsT0FBTyxFQUFFLHFCQUFxQjtJQUM5QixNQUFNLEVBQUUsZ0JBQWdCO0NBQ3pCLENBQUM7QUFFRixtQkFBbUI7QUFDbkIsTUFBTSxDQUFDLE1BQU0sUUFBUSxHQUFHO0lBQ3RCLE1BQU0sRUFBRSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRTtJQUNqQyxLQUFLLEVBQUUsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUU7SUFDaEMsS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFO0lBQ2hDLEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRTtJQUNoQyxJQUFJLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUU7Q0FDOUIsQ0FB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bUJBQW1CLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxRQUFRLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQztZQUNqRCxRQUFRLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLFFBQVEsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDO1lBQ2hELFFBQVEsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksUUFBUSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUM7WUFDaEQsUUFBUSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxRQUFRLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRTVFLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1lBQ3pCLE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDL0MsSUFBSSxRQUFRLENBQUMsSUFBSSxJQUFJLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDcEMsTUFBTSxHQUFHLEdBQUcsUUFBUSxDQUFDLElBQUksR0FBRyxNQUFNLEdBQUcsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ3hELENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVELG1DQUFtQztJQUNuQyxJQUFJLE1BQU0sRUFBRSxDQUFDO1FBQ1gsTUFBTSxJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUM7SUFDN0IsQ0FBQztJQUVELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvbmZpZ3VyYXRpb24gaW50ZXJmYWNlIGZvciB0aGUgcGVyc29uYSBhY3RpdmUgaW5kaWNhdG9yIHN5c3RlbS5cbiAqIENvbnRyb2xzIGhvdyBwZXJzb25hIGluZm9ybWF0aW9uIGlzIGRpc3BsYXllZCBpbiBBSSByZXNwb25zZXMuXG4gKiBcbiAqIEBpbnRlcmZhY2UgSW5kaWNhdG9yQ29uZmlnXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgY29uZmlnOiBJbmRpY2F0b3JDb25maWcgPSB7XG4gKiAgIGVuYWJsZWQ6IHRydWUsXG4gKiAgIHN0eWxlOiAnZnVsbCcsXG4gKiAgIHNob3dFbW9qaTogdHJ1ZSxcbiAqICAgc2hvd05hbWU6IHRydWUsXG4gKiAgIHNob3dWZXJzaW9uOiB0cnVlLFxuICogICBzaG93QXV0aG9yOiB0cnVlLFxuICogICBzaG93Q2F0ZWdvcnk6IGZhbHNlLFxuICogICBzZXBhcmF0b3I6ICcgfCAnLFxuICogICBlbW9qaTogJ/Cfjq0nLFxuICogICBicmFja2V0U3R5bGU6ICdzcXVhcmUnXG4gKiB9O1xuICogYGBgXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5kaWNhdG9yQ29uZmlnIHtcbiAgLyoqIFdoZXRoZXIgdG8gc2hvdyB0aGUgaW5kaWNhdG9yIGF0IGFsbCAqL1xuICBlbmFibGVkOiBib29sZWFuO1xuICBcbiAgLyoqIEZvcm1hdCBzdHlsZTogJ2Z1bGwnLCAnbWluaW1hbCcsICdjb21wYWN0JywgJ2N1c3RvbScgKi9cbiAgc3R5bGU6ICdmdWxsJyB8ICdtaW5pbWFsJyB8ICdjb21wYWN0JyB8ICdjdXN0b20nO1xuICBcbiAgLyoqIFxuICAgKiBDdXN0b20gZm9ybWF0IHRlbXBsYXRlICh1c2VkIHdoZW4gc3R5bGUgaXMgJ2N1c3RvbScpXG4gICAqIEF2YWlsYWJsZSBwbGFjZWhvbGRlcnM6IHtlbW9qaX0sIHtuYW1lfSwge3ZlcnNpb259LCB7YXV0aG9yfSwge2NhdGVnb3J5fVxuICAgKi9cbiAgY3VzdG9tRm9ybWF0Pzogc3RyaW5nO1xuICBcbiAgLyoqIFdoZXRoZXIgdG8gaW5jbHVkZSBzcGVjaWZpYyBlbGVtZW50cyAqL1xuICBzaG93RW1vamk6IGJvb2xlYW47XG4gIHNob3dOYW1lOiBib29sZWFuO1xuICBzaG93VmVyc2lvbjogYm9vbGVhbjtcbiAgc2hvd0F1dGhvcjogYm9vbGVhbjtcbiAgc2hvd0NhdGVnb3J5OiBib29sZWFuO1xuICBcbiAgLyoqIFNlcGFyYXRvciBiZXR3ZWVuIGluZGljYXRvciBhbmQgcmVzcG9uc2UgKi9cbiAgc2VwYXJhdG9yOiBzdHJpbmc7XG4gIFxuICAvKiogRW1vamkgdG8gdXNlIChkZWZhdWx0cyB0byDwn46tKSAqL1xuICBlbW9qaTogc3RyaW5nO1xuICBcbiAgLyoqIEJyYWNrZXQgc3R5bGU6ICdzcXVhcmUnLCAncm91bmQnLCAnY3VybHknLCAnYW5nbGUnLCAnbm9uZScgKi9cbiAgYnJhY2tldFN0eWxlOiAnc3F1YXJlJyB8ICdyb3VuZCcgfCAnY3VybHknIHwgJ2FuZ2xlJyB8ICdub25lJztcbn1cblxuLy8gRGVmYXVsdCBjb25maWd1cmF0aW9uXG5leHBvcnQgY29uc3QgREVGQVVMVF9JTkRJQ0FUT1JfQ09ORklHOiBJbmRpY2F0b3JDb25maWcgPSB7XG4gIGVuYWJsZWQ6IHRydWUsXG4gIHN0eWxlOiAnZnVsbCcsXG4gIHNob3dFbW9qaTogdHJ1ZSxcbiAgc2hvd05hbWU6IHRydWUsXG4gIHNob3dWZXJzaW9uOiB0cnVlLFxuICBzaG93QXV0aG9yOiB0cnVlLFxuICBzaG93Q2F0ZWdvcnk6IGZhbHNlLFxuICBzZXBhcmF0b3I6ICcgfCAnLFxuICBlbW9qaTogJ/Cfjq0nLFxuICBicmFja2V0U3R5bGU6ICdzcXVhcmUnXG59O1xuXG4vLyBQcmVkZWZpbmVkIHN0eWxlc1xuZXhwb3J0IGNvbnN0IElORElDQVRPUl9TVFlMRVMgPSB7XG4gIGZ1bGw6ICdbe2Vtb2ppfSB7bmFtZX0gdnt2ZXJzaW9ufSBieSB7YXV0aG9yfV0nLFxuICBtaW5pbWFsOiAne2Vtb2ppfSB7bmFtZX0nLFxuICBjb21wYWN0OiAnW3tuYW1lfSB2e3ZlcnNpb259XScsXG4gIGN1c3RvbTogJ3tjdXN0b21Gb3JtYXR9J1xufTtcblxuLy8gQnJhY2tldCBtYXBwaW5nc1xuZXhwb3J0IGNvbnN0IEJSQUNLRVRTID0ge1xuICBzcXVhcmU6IHsgb3BlbjogJ1snLCBjbG9zZTogJ10nIH0sXG4gIHJvdW5kOiB7IG9wZW46ICcoJywgY2xvc2U6ICcpJyB9LFxuICBjdXJseTogeyBvcGVuOiAneycsIGNsb3NlOiAnfScgfSxcbiAgYW5nbGU6IHsgb3BlbjogJzwnLCBjbG9zZTogJz4nIH0sXG4gIG5vbmU6IHsgb3BlbjogJycsIGNsb3NlOiAnJyB9XG59O1xuXG4vKipcbiAqIExvYWQgaW5kaWNhdG9yIGNvbmZpZ3VyYXRpb24gZnJvbSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgb3IgdXNlIGRlZmF1bHRzLlxuICogRW52aXJvbm1lbnQgdmFyaWFibGVzIHRha2UgcHJlY2VkZW5jZSBvdmVyIGRlZmF1bHQgdmFsdWVzLlxuICogXG4gKiBAcmV0dXJucyB7SW5kaWNhdG9yQ29uZmlnfSBUaGUgbG9hZGVkIGNvbmZpZ3VyYXRpb25cbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBTZXQgZW52aXJvbm1lbnQgdmFyaWFibGVzIGJlZm9yZSBsb2FkaW5nXG4gKiBwcm9jZXNzLmVudi5ET0xMSE9VU0VfSU5ESUNBVE9SX1NUWUxFID0gJ21pbmltYWwnO1xuICogcHJvY2Vzcy5lbnYuRE9MTEhPVVNFX0lORElDQVRPUl9FTU9KSSA9ICfwn6SWJztcbiAqIFxuICogY29uc3QgY29uZmlnID0gbG9hZEluZGljYXRvckNvbmZpZygpO1xuICogLy8gY29uZmlnLnN0eWxlID09PSAnbWluaW1hbCdcbiAqIC8vIGNvbmZpZy5lbW9qaSA9PT0gJ/CfpJYnXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvYWRJbmRpY2F0b3JDb25maWcoKTogSW5kaWNhdG9yQ29uZmlnIHtcbiAgY29uc3QgY29uZmlnID0geyAuLi5ERUZBVUxUX0lORElDQVRPUl9DT05GSUcgfTtcbiAgXG4gIC8vIENoZWNrIGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3Igb3ZlcnJpZGVzXG4gIGlmIChwcm9jZXNzLmVudi5ET0xMSE9VU0VfSU5ESUNBVE9SX0VOQUJMRUQgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbmZpZy5lbmFibGVkID0gcHJvY2Vzcy5lbnYuRE9MTEhPVVNFX0lORElDQVRPUl9FTkFCTEVEID09PSAndHJ1ZSc7XG4gIH1cbiAgXG4gIGlmIChwcm9jZXNzLmVudi5ET0xMSE9VU0VfSU5ESUNBVE9SX1NUWUxFKSB7XG4gICAgY29uc3Qgc3R5bGUgPSBwcm9jZXNzLmVudi5ET0xMSE9VU0VfSU5ESUNBVE9SX1NUWUxFO1xuICAgIGlmIChbJ2Z1bGwnLCAnbWluaW1hbCcsICdjb21wYWN0JywgJ2N1c3RvbSddLmluY2x1ZGVzKHN0eWxlKSkge1xuICAgICAgY29uZmlnLnN0eWxlID0gc3R5bGUgYXMgSW5kaWNhdG9yQ29uZmlnWydzdHlsZSddO1xuICAgIH1cbiAgfVxuICBcbiAgaWYgKHByb2Nlc3MuZW52LkRPTExIT1VTRV9JTkRJQ0FUT1JfRk9STUFUKSB7XG4gICAgY29uZmlnLmN1c3RvbUZvcm1hdCA9IHByb2Nlc3MuZW52LkRPTExIT1VTRV9JTkRJQ0FUT1JfRk9STUFUO1xuICAgIGNvbmZpZy5zdHlsZSA9ICdjdXN0b20nO1xuICB9XG4gIFxuICBpZiAocHJvY2Vzcy5lbnYuRE9MTEhPVVNFX0lORElDQVRPUl9FTU9KSSkge1xuICAgIGNvbmZpZy5lbW9qaSA9IHByb2Nlc3MuZW52LkRPTExIT1VTRV9JTkRJQ0FUT1JfRU1PSkk7XG4gIH1cbiAgXG4gIGlmIChwcm9jZXNzLmVudi5ET0xMSE9VU0VfSU5ESUNBVE9SX0JSQUNLRVRTKSB7XG4gICAgY29uc3QgYnJhY2tldFN0eWxlID0gcHJvY2Vzcy5lbnYuRE9MTEhPVVNFX0lORElDQVRPUl9CUkFDS0VUUztcbiAgICBpZiAoWydzcXVhcmUnLCAncm91bmQnLCAnY3VybHknLCAnYW5nbGUnLCAnbm9uZSddLmluY2x1ZGVzKGJyYWNrZXRTdHlsZSkpIHtcbiAgICAgIGNvbmZpZy5icmFja2V0U3R5bGUgPSBicmFja2V0U3R5bGUgYXMgSW5kaWNhdG9yQ29uZmlnWydicmFja2V0U3R5bGUnXTtcbiAgICB9XG4gIH1cbiAgXG4gIC8vIFBhcnNlIHNob3cgZmxhZ3MgZnJvbSBlbnZpcm9ubWVudFxuICBpZiAocHJvY2Vzcy5lbnYuRE9MTEhPVVNFX0lORElDQVRPUl9TSE9XX1ZFUlNJT04gIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbmZpZy5zaG93VmVyc2lvbiA9IHByb2Nlc3MuZW52LkRPTExIT1VTRV9JTkRJQ0FUT1JfU0hPV19WRVJTSU9OID09PSAndHJ1ZSc7XG4gIH1cbiAgXG4gIGlmIChwcm9jZXNzLmVudi5ET0xMSE9VU0VfSU5ESUNBVE9SX1NIT1dfQVVUSE9SICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25maWcuc2hvd0F1dGhvciA9IHByb2Nlc3MuZW52LkRPTExIT1VTRV9JTkRJQ0FUT1JfU0hPV19BVVRIT1IgPT09ICd0cnVlJztcbiAgfVxuICBcbiAgaWYgKHByb2Nlc3MuZW52LkRPTExIT1VTRV9JTkRJQ0FUT1JfU0hPV19DQVRFR09SWSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZmlnLnNob3dDYXRlZ29yeSA9IHByb2Nlc3MuZW52LkRPTExIT1VTRV9JTkRJQ0FUT1JfU0hPV19DQVRFR09SWSA9PT0gJ3RydWUnO1xuICB9XG4gIFxuICByZXR1cm4gY29uZmlnO1xufVxuXG4vKipcbiAqIFZhbGlkYXRlIGN1c3RvbSBmb3JtYXQgdGVtcGxhdGUgZm9yIHZhbGlkIHBsYWNlaG9sZGVyc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVDdXN0b21Gb3JtYXQoZm9ybWF0OiBzdHJpbmcpOiB7IHZhbGlkOiBib29sZWFuOyBlcnJvcj86IHN0cmluZyB9IHtcbiAgY29uc3QgdmFsaWRQbGFjZWhvbGRlcnMgPSBbJ3tlbW9qaX0nLCAne25hbWV9JywgJ3t2ZXJzaW9ufScsICd7YXV0aG9yfScsICd7Y2F0ZWdvcnl9J107XG4gIC8vIExlbmd0aCBsaW1pdCBhZGRlZCB0byBwcmV2ZW50IFJlRG9TIGF0dGFja3NcbiAgY29uc3QgcGxhY2Vob2xkZXJSZWdleCA9IC9cXHtbXn1dezAsNTB9XFx9L2c7ICAvLyBMaW1pdGVkIHRvIDUwIGNoYXJzIGZvciBwbGFjZWhvbGRlciBuYW1lc1xuICBjb25zdCBmb3VuZFBsYWNlaG9sZGVycyA9IGZvcm1hdC5tYXRjaChwbGFjZWhvbGRlclJlZ2V4KSB8fCBbXTtcbiAgXG4gIGZvciAoY29uc3QgcGxhY2Vob2xkZXIgb2YgZm91bmRQbGFjZWhvbGRlcnMpIHtcbiAgICBpZiAoIXZhbGlkUGxhY2Vob2xkZXJzLmluY2x1ZGVzKHBsYWNlaG9sZGVyKSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdmFsaWQ6IGZhbHNlLFxuICAgICAgICBlcnJvcjogYEludmFsaWQgcGxhY2Vob2xkZXI6ICR7cGxhY2Vob2xkZXJ9LiBWYWxpZCBwbGFjZWhvbGRlcnMgYXJlOiAke3ZhbGlkUGxhY2Vob2xkZXJzLmpvaW4oJywgJyl9YFxuICAgICAgfTtcbiAgICB9XG4gIH1cbiAgXG4gIHJldHVybiB7IHZhbGlkOiB0cnVlIH07XG59XG5cbi8qKlxuICogRm9ybWF0IHRoZSBpbmRpY2F0b3IgYmFzZWQgb24gY29uZmlndXJhdGlvbiBhbmQgcGVyc29uYSBtZXRhZGF0YVxuICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0SW5kaWNhdG9yKFxuICBjb25maWc6IEluZGljYXRvckNvbmZpZyxcbiAgbWV0YWRhdGE6IHtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgdmVyc2lvbj86IHN0cmluZztcbiAgICBhdXRob3I/OiBzdHJpbmc7XG4gICAgY2F0ZWdvcnk/OiBzdHJpbmc7XG4gIH1cbik6IHN0cmluZyB7XG4gIGlmICghY29uZmlnLmVuYWJsZWQpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cbiAgXG4gIC8vIEdldCB0aGUgZm9ybWF0IHRlbXBsYXRlIGJhc2VkIG9uIHN0eWxlXG4gIGxldCB0ZW1wbGF0ZSA9IElORElDQVRPUl9TVFlMRVNbY29uZmlnLnN0eWxlXTtcbiAgaWYgKGNvbmZpZy5zdHlsZSA9PT0gJ2N1c3RvbScgJiYgY29uZmlnLmN1c3RvbUZvcm1hdCkge1xuICAgIC8vIFZhbGlkYXRlIGN1c3RvbSBmb3JtYXRcbiAgICBjb25zdCB2YWxpZGF0aW9uID0gdmFsaWRhdGVDdXN0b21Gb3JtYXQoY29uZmlnLmN1c3RvbUZvcm1hdCk7XG4gICAgaWYgKCF2YWxpZGF0aW9uLnZhbGlkKSB7XG4gICAgICAvLyBGYWxsIGJhY2sgdG8gZnVsbCBzdHlsZSBpZiBjdXN0b20gZm9ybWF0IGlzIGludmFsaWRcbiAgICAgIHRlbXBsYXRlID0gSU5ESUNBVE9SX1NUWUxFUy5mdWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICB0ZW1wbGF0ZSA9IGNvbmZpZy5jdXN0b21Gb3JtYXQ7XG4gICAgfVxuICB9XG4gIFxuICAvLyBSZXBsYWNlIHBsYWNlaG9sZGVycyB3aXRoIHZhbHVlcyBvciBlbXB0eSBzdHJpbmdzXG4gIGxldCByZXN1bHQgPSB0ZW1wbGF0ZVxuICAgIC5yZXBsYWNlKCd7ZW1vaml9JywgY29uZmlnLnNob3dFbW9qaSA/IGNvbmZpZy5lbW9qaSA6ICcnKVxuICAgIC5yZXBsYWNlKCd7bmFtZX0nLCBjb25maWcuc2hvd05hbWUgPyBtZXRhZGF0YS5uYW1lIDogJycpXG4gICAgLnJlcGxhY2UoJ3t2ZXJzaW9ufScsIGNvbmZpZy5zaG93VmVyc2lvbiAmJiBtZXRhZGF0YS52ZXJzaW9uID8gbWV0YWRhdGEudmVyc2lvbiA6ICcnKVxuICAgIC5yZXBsYWNlKCd7YXV0aG9yfScsIGNvbmZpZy5zaG93QXV0aG9yICYmIG1ldGFkYXRhLmF1dGhvciA/IG1ldGFkYXRhLmF1dGhvciA6ICcnKVxuICAgIC5yZXBsYWNlKCd7Y2F0ZWdvcnl9JywgY29uZmlnLnNob3dDYXRlZ29yeSAmJiBtZXRhZGF0YS5jYXRlZ29yeSA/IG1ldGFkYXRhLmNhdGVnb3J5IDogJycpO1xuICBcbiAgLy8gQ2xlYW4gdXAgdGhlIGZvcm1hdCBzdHJpbmdcbiAgLy8gUmVtb3ZlIFwidlwiIGlmIG5vIHZlcnNpb24gZm9sbG93cyBpdFxuICBpZiAoIWNvbmZpZy5zaG93VmVyc2lvbiB8fCAhbWV0YWRhdGEudmVyc2lvbikge1xuICAgIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKC9cXHN2KD89XFxzfF18XFwpfD58fXwkKS8sICcnKTtcbiAgfVxuICAvLyBSZW1vdmUgXCJieVwiIGlmIG5vIGF1dGhvciBmb2xsb3dzIGl0XG4gIGlmICghY29uZmlnLnNob3dBdXRob3IgfHwgIW1ldGFkYXRhLmF1dGhvcikge1xuICAgIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKC9cXHNieSg/PVxcc3xdfFxcKXw+fH18JCkvLCAnJyk7XG4gIH1cbiAgLy8gQ2xlYW4gdXAgZXh0cmEgc3BhY2VzXG4gIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKC9cXHMrL2csICcgJykudHJpbSgpO1xuICBcbiAgLy8gQXBwbHkgYnJhY2tldHMgYmFzZWQgb24gdGhlIHRlbXBsYXRlIGZvcm1hdCAob25seSBpZiB0ZW1wbGF0ZSBkb2Vzbid0IGFscmVhZHkgaGF2ZSB0aGVtKVxuICBpZiAocmVzdWx0ICYmIGNvbmZpZy5zdHlsZSAhPT0gJ2N1c3RvbScpIHtcbiAgICAvLyBDaGVjayBpZiB0aGUgdGVtcGxhdGUgYWxyZWFkeSBpbmNsdWRlcyBicmFja2V0c1xuICAgIGNvbnN0IHRlbXBsYXRlSGFzQnJhY2tldHMgPSB0ZW1wbGF0ZS5pbmNsdWRlcygnWycpIHx8IHRlbXBsYXRlLmluY2x1ZGVzKCddJykgfHwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUuaW5jbHVkZXMoJygnKSB8fCB0ZW1wbGF0ZS5pbmNsdWRlcygnKScpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUuaW5jbHVkZXMoJ3snKSB8fCB0ZW1wbGF0ZS5pbmNsdWRlcygnfScpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUuaW5jbHVkZXMoJzwnKSB8fCB0ZW1wbGF0ZS5pbmNsdWRlcygnPicpO1xuICAgIFxuICAgIGlmICghdGVtcGxhdGVIYXNCcmFja2V0cykge1xuICAgICAgY29uc3QgYnJhY2tldHMgPSBCUkFDS0VUU1tjb25maWcuYnJhY2tldFN0eWxlXTtcbiAgICAgIGlmIChicmFja2V0cy5vcGVuIHx8IGJyYWNrZXRzLmNsb3NlKSB7XG4gICAgICAgIHJlc3VsdCA9IGAke2JyYWNrZXRzLm9wZW59JHtyZXN1bHR9JHticmFja2V0cy5jbG9zZX1gO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBcbiAgLy8gQWRkIHNlcGFyYXRvciBpZiB3ZSBoYXZlIGNvbnRlbnRcbiAgaWYgKHJlc3VsdCkge1xuICAgIHJlc3VsdCArPSBjb25maWcuc2VwYXJhdG9yO1xuICB9XG4gIFxuICByZXR1cm4gcmVzdWx0O1xufSJdfQ==