@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.
126 lines • 16 kB
JavaScript
/**
* Constants for Memory element implementation
* Extracted for reusability and maintainability
*
* MEMORY ARCHITECTURE DESIGN:
* - Memories are stored as small, sharded YAML files for fast loading
* - Each memory file should be <256KB for optimal parse performance
* - Larger content referenced via external documents (PDFs, images, etc)
* - Index-of-indexes pattern for O(log n) search performance
*
* SECURITY NOTE: This file contains only constants and type definitions.
* It does not process any user input. The security scanner may flag this
* for missing Unicode normalization, but this is a false positive as no
* input processing occurs here.
*
* @module MemoryConstants
*/
// security-audit-ignore: DMCP-SEC-004
// Reason: Constants file - no user input processing
// Memory size limits
export const MEMORY_CONSTANTS = {
// Size limits
MAX_MEMORY_SIZE: 1024 * 1024, // 1MB total memory size
MAX_ENTRY_SIZE: 100 * 1024, // 100KB per entry
MAX_ENTRIES_DEFAULT: 1000, // Maximum number of entries
// Entry limits
MAX_TAGS_PER_ENTRY: 20, // Maximum tags per memory entry
MAX_TAG_LENGTH: 50, // Maximum length of each tag
MAX_METADATA_KEYS: 20, // Maximum metadata keys per entry
MAX_METADATA_KEY_LENGTH: 50, // Maximum metadata key length
MAX_METADATA_VALUE_LENGTH: 200, // Maximum metadata value length
// Retention defaults
// Memories are PERMANENT by default. Use retentionDays only when you
// explicitly need expiring data (temporary caches, session context, etc.)
DEFAULT_RETENTION_DAYS: 999999, // Permanent by default (~2739 years)
MIN_RETENTION_DAYS: 1, // Minimum retention period
MAX_RETENTION_DAYS: 999999, // Allows permanent retention
// Search limits
DEFAULT_SEARCH_LIMIT: 100, // Default search result limit
/**
* YAML Size Limit Rationale:
* 256KB is optimal for YAML parsing performance while preventing DoS attacks.
* - YAML parsing is CPU-intensive; large files can block the event loop
* - 256KB accommodates ~5000 lines of typical memory content
* - Larger memories should be sharded across multiple files
* - External references used for binary data (images, PDFs, etc)
*
* Performance benchmarks:
* - <256KB: Parse time <10ms on average hardware
* - 1MB: Parse time ~50-100ms (acceptable but not ideal)
* - >5MB: Parse time >500ms (unacceptable, blocks UI)
*/
MAX_YAML_SIZE: 256 * 1024, // 256KB max YAML size for import
/**
* Privacy Level Hierarchy:
*
* 'public' - Lowest restriction level
* - Available to all contexts and users
* - Can be shared across sessions
* - Suitable for general knowledge, documentation
* - Example: Project conventions, public APIs
*
* 'private' - Default level, moderate restriction
* - Restricted to current user/session
* - Not shared with other users
* - Suitable for personal preferences, user-specific data
* - Example: User's coding style, personal notes
*
* 'sensitive' - Highest restriction level
* - Requires explicit permission to access
* - Extra logging and audit trail
* - Automatic deletion after retention period
* - Suitable for credentials, PII, confidential data
* - Example: API keys (temporary), personal information
*
* Access rules cascade: sensitive ⊂ private ⊂ public
*/
PRIVACY_LEVELS: ['public', 'private', 'sensitive'],
DEFAULT_PRIVACY_LEVEL: 'private',
// Storage backends
DEFAULT_STORAGE_BACKEND: 'memory',
SUPPORTED_STORAGE_BACKENDS: ['memory', 'file', 'indexed'],
};
/**
* Trust Levels for Memory Security Architecture (Issue #1314, #1320, #1321)
*
* UNTRUSTED: Default - all content starts as untrusted until validated
* VALIDATED: Content has passed security validation (no dangerous patterns)
* TRUSTED: Manually marked as trusted by user (highest trust)
* FLAGGED: Contains dangerous patterns, sanitized display required
* QUARANTINED: Content failed validation, isolated from normal use
*/
export const TRUST_LEVELS = {
UNTRUSTED: 'untrusted',
VALIDATED: 'validated',
TRUSTED: 'trusted',
FLAGGED: 'flagged',
QUARANTINED: 'quarantined'
};
// Security event types for memory operations
export const MEMORY_SECURITY_EVENTS = {
MEMORY_CREATED: 'MEMORY_CREATED',
MEMORY_ADDED: 'MEMORY_ADDED',
MEMORY_SEARCHED: 'MEMORY_SEARCHED',
SENSITIVE_MEMORY_DELETED: 'SENSITIVE_MEMORY_DELETED',
RETENTION_POLICY_ENFORCED: 'RETENTION_POLICY_ENFORCED',
MEMORY_CLEARED: 'MEMORY_CLEARED',
MEMORY_LOADED: 'MEMORY_LOADED',
MEMORY_SAVED: 'MEMORY_SAVED',
MEMORY_DELETED: 'MEMORY_DELETED',
MEMORY_LOAD_FAILED: 'MEMORY_LOAD_FAILED',
MEMORY_SAVE_FAILED: 'MEMORY_SAVE_FAILED',
MEMORY_DESERIALIZE_FAILED: 'MEMORY_DESERIALIZE_FAILED',
MEMORY_LIST_ITEM_FAILED: 'MEMORY_LIST_ITEM_FAILED',
MEMORY_IMPORT_FAILED: 'MEMORY_IMPORT_FAILED',
MEMORY_INTEGRITY_VIOLATION: 'MEMORY_INTEGRITY_VIOLATION',
MEMORY_UNICODE_VALIDATION_FAILED: 'MEMORY_UNICODE_VALIDATION_FAILED',
MEMORY_DUPLICATE_DETECTED: 'MEMORY_DUPLICATE_DETECTED',
// FIX #1269: Prompt injection protection events
MEMORY_INJECTION_BLOCKED: 'MEMORY_INJECTION_BLOCKED',
MEMORY_INJECTION_DETECTED_ON_READ: 'MEMORY_INJECTION_DETECTED_ON_READ',
// FIX #1430: Seed memory installation events
SEED_MEMORY_INSTALLED: 'SEED_MEMORY_INSTALLED',
SEED_MEMORY_INSTALLATION_FAILED: 'SEED_MEMORY_INSTALLATION_FAILED',
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2VsZW1lbnRzL21lbW9yaWVzL2NvbnN0YW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7OztHQWdCRztBQUVILHNDQUFzQztBQUN0QyxvREFBb0Q7QUFFcEQscUJBQXFCO0FBQ3JCLE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHO0lBQzlCLGNBQWM7SUFDZCxlQUFlLEVBQUUsSUFBSSxHQUFHLElBQUksRUFBUyx3QkFBd0I7SUFDN0QsY0FBYyxFQUFFLEdBQUcsR0FBRyxJQUFJLEVBQVcsa0JBQWtCO0lBQ3ZELG1CQUFtQixFQUFFLElBQUksRUFBWSw0QkFBNEI7SUFFakUsZUFBZTtJQUNmLGtCQUFrQixFQUFFLEVBQUUsRUFBZSxnQ0FBZ0M7SUFDckUsY0FBYyxFQUFFLEVBQUUsRUFBbUIsNkJBQTZCO0lBQ2xFLGlCQUFpQixFQUFFLEVBQUUsRUFBZ0Isa0NBQWtDO0lBQ3ZFLHVCQUF1QixFQUFFLEVBQUUsRUFBVSw4QkFBOEI7SUFDbkUseUJBQXlCLEVBQUUsR0FBRyxFQUFPLGdDQUFnQztJQUVyRSxxQkFBcUI7SUFDckIscUVBQXFFO0lBQ3JFLDBFQUEwRTtJQUMxRSxzQkFBc0IsRUFBRSxNQUFNLEVBQU8scUNBQXFDO0lBQzFFLGtCQUFrQixFQUFFLENBQUMsRUFBZ0IsMkJBQTJCO0lBQ2hFLGtCQUFrQixFQUFFLE1BQU0sRUFBVyw2QkFBNkI7SUFFbEUsZ0JBQWdCO0lBQ2hCLG9CQUFvQixFQUFFLEdBQUcsRUFBWSw4QkFBOEI7SUFFbkU7Ozs7Ozs7Ozs7OztPQVlHO0lBQ0gsYUFBYSxFQUFFLEdBQUcsR0FBRyxJQUFJLEVBQVksaUNBQWlDO0lBRXRFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQXVCRztJQUNILGNBQWMsRUFBRSxDQUFDLFFBQVEsRUFBRSxTQUFTLEVBQUUsV0FBVyxDQUFVO0lBQzNELHFCQUFxQixFQUFFLFNBQWtCO0lBRXpDLG1CQUFtQjtJQUNuQix1QkFBdUIsRUFBRSxRQUFpQjtJQUMxQywwQkFBMEIsRUFBRSxDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUsU0FBUyxDQUFVO0NBQzFELENBQUM7QUFNWDs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRztJQUMxQixTQUFTLEVBQUUsV0FBVztJQUN0QixTQUFTLEVBQUUsV0FBVztJQUN0QixPQUFPLEVBQUUsU0FBUztJQUNsQixPQUFPLEVBQUUsU0FBUztJQUNsQixXQUFXLEVBQUUsYUFBYTtDQUNsQixDQUFDO0FBSVgsNkNBQTZDO0FBQzdDLE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFHO0lBQ3BDLGNBQWMsRUFBRSxnQkFBZ0I7SUFDaEMsWUFBWSxFQUFFLGNBQWM7SUFDNUIsZUFBZSxFQUFFLGlCQUFpQjtJQUNsQyx3QkFBd0IsRUFBRSwwQkFBMEI7SUFDcEQseUJBQXlCLEVBQUUsMkJBQTJCO0lBQ3RELGNBQWMsRUFBRSxnQkFBZ0I7SUFDaEMsYUFBYSxFQUFFLGVBQWU7SUFDOUIsWUFBWSxFQUFFLGNBQWM7SUFDNUIsY0FBYyxFQUFFLGdCQUFnQjtJQUNoQyxrQkFBa0IsRUFBRSxvQkFBb0I7SUFDeEMsa0JBQWtCLEVBQUUsb0JBQW9CO0lBQ3hDLHlCQUF5QixFQUFFLDJCQUEyQjtJQUN0RCx1QkFBdUIsRUFBRSx5QkFBeUI7SUFDbEQsb0JBQW9CLEVBQUUsc0JBQXNCO0lBQzVDLDBCQUEwQixFQUFFLDRCQUE0QjtJQUN4RCxnQ0FBZ0MsRUFBRSxrQ0FBa0M7SUFDcEUseUJBQXlCLEVBQUUsMkJBQTJCO0lBQ3RELGdEQUFnRDtJQUNoRCx3QkFBd0IsRUFBRSwwQkFBMEI7SUFDcEQsaUNBQWlDLEVBQUUsbUNBQW1DO0lBQ3RFLDZDQUE2QztJQUM3QyxxQkFBcUIsRUFBRSx1QkFBdUI7SUFDOUMsK0JBQStCLEVBQUUsaUNBQWlDO0NBQzFELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvbnN0YW50cyBmb3IgTWVtb3J5IGVsZW1lbnQgaW1wbGVtZW50YXRpb25cbiAqIEV4dHJhY3RlZCBmb3IgcmV1c2FiaWxpdHkgYW5kIG1haW50YWluYWJpbGl0eVxuICpcbiAqIE1FTU9SWSBBUkNISVRFQ1RVUkUgREVTSUdOOlxuICogLSBNZW1vcmllcyBhcmUgc3RvcmVkIGFzIHNtYWxsLCBzaGFyZGVkIFlBTUwgZmlsZXMgZm9yIGZhc3QgbG9hZGluZ1xuICogLSBFYWNoIG1lbW9yeSBmaWxlIHNob3VsZCBiZSA8MjU2S0IgZm9yIG9wdGltYWwgcGFyc2UgcGVyZm9ybWFuY2VcbiAqIC0gTGFyZ2VyIGNvbnRlbnQgcmVmZXJlbmNlZCB2aWEgZXh0ZXJuYWwgZG9jdW1lbnRzIChQREZzLCBpbWFnZXMsIGV0YylcbiAqIC0gSW5kZXgtb2YtaW5kZXhlcyBwYXR0ZXJuIGZvciBPKGxvZyBuKSBzZWFyY2ggcGVyZm9ybWFuY2VcbiAqXG4gKiBTRUNVUklUWSBOT1RFOiBUaGlzIGZpbGUgY29udGFpbnMgb25seSBjb25zdGFudHMgYW5kIHR5cGUgZGVmaW5pdGlvbnMuXG4gKiBJdCBkb2VzIG5vdCBwcm9jZXNzIGFueSB1c2VyIGlucHV0LiBUaGUgc2VjdXJpdHkgc2Nhbm5lciBtYXkgZmxhZyB0aGlzXG4gKiBmb3IgbWlzc2luZyBVbmljb2RlIG5vcm1hbGl6YXRpb24sIGJ1dCB0aGlzIGlzIGEgZmFsc2UgcG9zaXRpdmUgYXMgbm9cbiAqIGlucHV0IHByb2Nlc3Npbmcgb2NjdXJzIGhlcmUuXG4gKlxuICogQG1vZHVsZSBNZW1vcnlDb25zdGFudHNcbiAqL1xuXG4vLyBzZWN1cml0eS1hdWRpdC1pZ25vcmU6IERNQ1AtU0VDLTAwNFxuLy8gUmVhc29uOiBDb25zdGFudHMgZmlsZSAtIG5vIHVzZXIgaW5wdXQgcHJvY2Vzc2luZ1xuXG4vLyBNZW1vcnkgc2l6ZSBsaW1pdHNcbmV4cG9ydCBjb25zdCBNRU1PUllfQ09OU1RBTlRTID0ge1xuICAvLyBTaXplIGxpbWl0c1xuICBNQVhfTUVNT1JZX1NJWkU6IDEwMjQgKiAxMDI0LCAgICAgICAgLy8gMU1CIHRvdGFsIG1lbW9yeSBzaXplXG4gIE1BWF9FTlRSWV9TSVpFOiAxMDAgKiAxMDI0LCAgICAgICAgICAvLyAxMDBLQiBwZXIgZW50cnlcbiAgTUFYX0VOVFJJRVNfREVGQVVMVDogMTAwMCwgICAgICAgICAgIC8vIE1heGltdW0gbnVtYmVyIG9mIGVudHJpZXNcblxuICAvLyBFbnRyeSBsaW1pdHNcbiAgTUFYX1RBR1NfUEVSX0VOVFJZOiAyMCwgICAgICAgICAgICAgIC8vIE1heGltdW0gdGFncyBwZXIgbWVtb3J5IGVudHJ5XG4gIE1BWF9UQUdfTEVOR1RIOiA1MCwgICAgICAgICAgICAgICAgICAvLyBNYXhpbXVtIGxlbmd0aCBvZiBlYWNoIHRhZ1xuICBNQVhfTUVUQURBVEFfS0VZUzogMjAsICAgICAgICAgICAgICAgLy8gTWF4aW11bSBtZXRhZGF0YSBrZXlzIHBlciBlbnRyeVxuICBNQVhfTUVUQURBVEFfS0VZX0xFTkdUSDogNTAsICAgICAgICAgLy8gTWF4aW11bSBtZXRhZGF0YSBrZXkgbGVuZ3RoXG4gIE1BWF9NRVRBREFUQV9WQUxVRV9MRU5HVEg6IDIwMCwgICAgICAvLyBNYXhpbXVtIG1ldGFkYXRhIHZhbHVlIGxlbmd0aFxuXG4gIC8vIFJldGVudGlvbiBkZWZhdWx0c1xuICAvLyBNZW1vcmllcyBhcmUgUEVSTUFORU5UIGJ5IGRlZmF1bHQuIFVzZSByZXRlbnRpb25EYXlzIG9ubHkgd2hlbiB5b3VcbiAgLy8gZXhwbGljaXRseSBuZWVkIGV4cGlyaW5nIGRhdGEgKHRlbXBvcmFyeSBjYWNoZXMsIHNlc3Npb24gY29udGV4dCwgZXRjLilcbiAgREVGQVVMVF9SRVRFTlRJT05fREFZUzogOTk5OTk5LCAgICAgIC8vIFBlcm1hbmVudCBieSBkZWZhdWx0ICh+MjczOSB5ZWFycylcbiAgTUlOX1JFVEVOVElPTl9EQVlTOiAxLCAgICAgICAgICAgICAgIC8vIE1pbmltdW0gcmV0ZW50aW9uIHBlcmlvZFxuICBNQVhfUkVURU5USU9OX0RBWVM6IDk5OTk5OSwgICAgICAgICAgLy8gQWxsb3dzIHBlcm1hbmVudCByZXRlbnRpb25cblxuICAvLyBTZWFyY2ggbGltaXRzXG4gIERFRkFVTFRfU0VBUkNIX0xJTUlUOiAxMDAsICAgICAgICAgICAvLyBEZWZhdWx0IHNlYXJjaCByZXN1bHQgbGltaXRcblxuICAvKipcbiAgICogWUFNTCBTaXplIExpbWl0IFJhdGlvbmFsZTpcbiAgICogMjU2S0IgaXMgb3B0aW1hbCBmb3IgWUFNTCBwYXJzaW5nIHBlcmZvcm1hbmNlIHdoaWxlIHByZXZlbnRpbmcgRG9TIGF0dGFja3MuXG4gICAqIC0gWUFNTCBwYXJzaW5nIGlzIENQVS1pbnRlbnNpdmU7IGxhcmdlIGZpbGVzIGNhbiBibG9jayB0aGUgZXZlbnQgbG9vcFxuICAgKiAtIDI1NktCIGFjY29tbW9kYXRlcyB+NTAwMCBsaW5lcyBvZiB0eXBpY2FsIG1lbW9yeSBjb250ZW50XG4gICAqIC0gTGFyZ2VyIG1lbW9yaWVzIHNob3VsZCBiZSBzaGFyZGVkIGFjcm9zcyBtdWx0aXBsZSBmaWxlc1xuICAgKiAtIEV4dGVybmFsIHJlZmVyZW5jZXMgdXNlZCBmb3IgYmluYXJ5IGRhdGEgKGltYWdlcywgUERGcywgZXRjKVxuICAgKlxuICAgKiBQZXJmb3JtYW5jZSBiZW5jaG1hcmtzOlxuICAgKiAtIDwyNTZLQjogUGFyc2UgdGltZSA8MTBtcyBvbiBhdmVyYWdlIGhhcmR3YXJlXG4gICAqIC0gMU1COiBQYXJzZSB0aW1lIH41MC0xMDBtcyAoYWNjZXB0YWJsZSBidXQgbm90IGlkZWFsKVxuICAgKiAtID41TUI6IFBhcnNlIHRpbWUgPjUwMG1zICh1bmFjY2VwdGFibGUsIGJsb2NrcyBVSSlcbiAgICovXG4gIE1BWF9ZQU1MX1NJWkU6IDI1NiAqIDEwMjQsICAgICAgICAgICAvLyAyNTZLQiBtYXggWUFNTCBzaXplIGZvciBpbXBvcnRcblxuICAvKipcbiAgICogUHJpdmFjeSBMZXZlbCBIaWVyYXJjaHk6XG4gICAqXG4gICAqICdwdWJsaWMnIC0gTG93ZXN0IHJlc3RyaWN0aW9uIGxldmVsXG4gICAqICAgLSBBdmFpbGFibGUgdG8gYWxsIGNvbnRleHRzIGFuZCB1c2Vyc1xuICAgKiAgIC0gQ2FuIGJlIHNoYXJlZCBhY3Jvc3Mgc2Vzc2lvbnNcbiAgICogICAtIFN1aXRhYmxlIGZvciBnZW5lcmFsIGtub3dsZWRnZSwgZG9jdW1lbnRhdGlvblxuICAgKiAgIC0gRXhhbXBsZTogUHJvamVjdCBjb252ZW50aW9ucywgcHVibGljIEFQSXNcbiAgICpcbiAgICogJ3ByaXZhdGUnIC0gRGVmYXVsdCBsZXZlbCwgbW9kZXJhdGUgcmVzdHJpY3Rpb25cbiAgICogICAtIFJlc3RyaWN0ZWQgdG8gY3VycmVudCB1c2VyL3Nlc3Npb25cbiAgICogICAtIE5vdCBzaGFyZWQgd2l0aCBvdGhlciB1c2Vyc1xuICAgKiAgIC0gU3VpdGFibGUgZm9yIHBlcnNvbmFsIHByZWZlcmVuY2VzLCB1c2VyLXNwZWNpZmljIGRhdGFcbiAgICogICAtIEV4YW1wbGU6IFVzZXIncyBjb2Rpbmcgc3R5bGUsIHBlcnNvbmFsIG5vdGVzXG4gICAqXG4gICAqICdzZW5zaXRpdmUnIC0gSGlnaGVzdCByZXN0cmljdGlvbiBsZXZlbFxuICAgKiAgIC0gUmVxdWlyZXMgZXhwbGljaXQgcGVybWlzc2lvbiB0byBhY2Nlc3NcbiAgICogICAtIEV4dHJhIGxvZ2dpbmcgYW5kIGF1ZGl0IHRyYWlsXG4gICAqICAgLSBBdXRvbWF0aWMgZGVsZXRpb24gYWZ0ZXIgcmV0ZW50aW9uIHBlcmlvZFxuICAgKiAgIC0gU3VpdGFibGUgZm9yIGNyZWRlbnRpYWxzLCBQSUksIGNvbmZpZGVudGlhbCBkYXRhXG4gICAqICAgLSBFeGFtcGxlOiBBUEkga2V5cyAodGVtcG9yYXJ5KSwgcGVyc29uYWwgaW5mb3JtYXRpb25cbiAgICpcbiAgICogQWNjZXNzIHJ1bGVzIGNhc2NhZGU6IHNlbnNpdGl2ZSDiioIgcHJpdmF0ZSDiioIgcHVibGljXG4gICAqL1xuICBQUklWQUNZX0xFVkVMUzogWydwdWJsaWMnLCAncHJpdmF0ZScsICdzZW5zaXRpdmUnXSBhcyBjb25zdCxcbiAgREVGQVVMVF9QUklWQUNZX0xFVkVMOiAncHJpdmF0ZScgYXMgY29uc3QsXG4gIFxuICAvLyBTdG9yYWdlIGJhY2tlbmRzXG4gIERFRkFVTFRfU1RPUkFHRV9CQUNLRU5EOiAnbWVtb3J5JyBhcyBjb25zdCxcbiAgU1VQUE9SVEVEX1NUT1JBR0VfQkFDS0VORFM6IFsnbWVtb3J5JywgJ2ZpbGUnLCAnaW5kZXhlZCddIGFzIGNvbnN0LFxufSBhcyBjb25zdDtcblxuLy8gVHlwZSBleHBvcnRzIGZvciBwcml2YWN5IGxldmVscyBhbmQgc3RvcmFnZSBiYWNrZW5kc1xuZXhwb3J0IHR5cGUgUHJpdmFjeUxldmVsID0gdHlwZW9mIE1FTU9SWV9DT05TVEFOVFMuUFJJVkFDWV9MRVZFTFNbbnVtYmVyXTtcbmV4cG9ydCB0eXBlIFN0b3JhZ2VCYWNrZW5kID0gdHlwZW9mIE1FTU9SWV9DT05TVEFOVFMuU1VQUE9SVEVEX1NUT1JBR0VfQkFDS0VORFNbbnVtYmVyXTtcblxuLyoqXG4gKiBUcnVzdCBMZXZlbHMgZm9yIE1lbW9yeSBTZWN1cml0eSBBcmNoaXRlY3R1cmUgKElzc3VlICMxMzE0LCAjMTMyMCwgIzEzMjEpXG4gKlxuICogVU5UUlVTVEVEOiBEZWZhdWx0IC0gYWxsIGNvbnRlbnQgc3RhcnRzIGFzIHVudHJ1c3RlZCB1bnRpbCB2YWxpZGF0ZWRcbiAqIFZBTElEQVRFRDogQ29udGVudCBoYXMgcGFzc2VkIHNlY3VyaXR5IHZhbGlkYXRpb24gKG5vIGRhbmdlcm91cyBwYXR0ZXJucylcbiAqIFRSVVNURUQ6IE1hbnVhbGx5IG1hcmtlZCBhcyB0cnVzdGVkIGJ5IHVzZXIgKGhpZ2hlc3QgdHJ1c3QpXG4gKiBGTEFHR0VEOiBDb250YWlucyBkYW5nZXJvdXMgcGF0dGVybnMsIHNhbml0aXplZCBkaXNwbGF5IHJlcXVpcmVkXG4gKiBRVUFSQU5USU5FRDogQ29udGVudCBmYWlsZWQgdmFsaWRhdGlvbiwgaXNvbGF0ZWQgZnJvbSBub3JtYWwgdXNlXG4gKi9cbmV4cG9ydCBjb25zdCBUUlVTVF9MRVZFTFMgPSB7XG4gIFVOVFJVU1RFRDogJ3VudHJ1c3RlZCcsXG4gIFZBTElEQVRFRDogJ3ZhbGlkYXRlZCcsXG4gIFRSVVNURUQ6ICd0cnVzdGVkJyxcbiAgRkxBR0dFRDogJ2ZsYWdnZWQnLFxuICBRVUFSQU5USU5FRDogJ3F1YXJhbnRpbmVkJ1xufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgVHJ1c3RMZXZlbCA9IHR5cGVvZiBUUlVTVF9MRVZFTFNba2V5b2YgdHlwZW9mIFRSVVNUX0xFVkVMU107XG5cbi8vIFNlY3VyaXR5IGV2ZW50IHR5cGVzIGZvciBtZW1vcnkgb3BlcmF0aW9uc1xuZXhwb3J0IGNvbnN0IE1FTU9SWV9TRUNVUklUWV9FVkVOVFMgPSB7XG4gIE1FTU9SWV9DUkVBVEVEOiAnTUVNT1JZX0NSRUFURUQnLFxuICBNRU1PUllfQURERUQ6ICdNRU1PUllfQURERUQnLFxuICBNRU1PUllfU0VBUkNIRUQ6ICdNRU1PUllfU0VBUkNIRUQnLFxuICBTRU5TSVRJVkVfTUVNT1JZX0RFTEVURUQ6ICdTRU5TSVRJVkVfTUVNT1JZX0RFTEVURUQnLFxuICBSRVRFTlRJT05fUE9MSUNZX0VORk9SQ0VEOiAnUkVURU5USU9OX1BPTElDWV9FTkZPUkNFRCcsXG4gIE1FTU9SWV9DTEVBUkVEOiAnTUVNT1JZX0NMRUFSRUQnLFxuICBNRU1PUllfTE9BREVEOiAnTUVNT1JZX0xPQURFRCcsXG4gIE1FTU9SWV9TQVZFRDogJ01FTU9SWV9TQVZFRCcsXG4gIE1FTU9SWV9ERUxFVEVEOiAnTUVNT1JZX0RFTEVURUQnLFxuICBNRU1PUllfTE9BRF9GQUlMRUQ6ICdNRU1PUllfTE9BRF9GQUlMRUQnLFxuICBNRU1PUllfU0FWRV9GQUlMRUQ6ICdNRU1PUllfU0FWRV9GQUlMRUQnLFxuICBNRU1PUllfREVTRVJJQUxJWkVfRkFJTEVEOiAnTUVNT1JZX0RFU0VSSUFMSVpFX0ZBSUxFRCcsXG4gIE1FTU9SWV9MSVNUX0lURU1fRkFJTEVEOiAnTUVNT1JZX0xJU1RfSVRFTV9GQUlMRUQnLFxuICBNRU1PUllfSU1QT1JUX0ZBSUxFRDogJ01FTU9SWV9JTVBPUlRfRkFJTEVEJyxcbiAgTUVNT1JZX0lOVEVHUklUWV9WSU9MQVRJT046ICdNRU1PUllfSU5URUdSSVRZX1ZJT0xBVElPTicsXG4gIE1FTU9SWV9VTklDT0RFX1ZBTElEQVRJT05fRkFJTEVEOiAnTUVNT1JZX1VOSUNPREVfVkFMSURBVElPTl9GQUlMRUQnLFxuICBNRU1PUllfRFVQTElDQVRFX0RFVEVDVEVEOiAnTUVNT1JZX0RVUExJQ0FURV9ERVRFQ1RFRCcsXG4gIC8vIEZJWCAjMTI2OTogUHJvbXB0IGluamVjdGlvbiBwcm90ZWN0aW9uIGV2ZW50c1xuICBNRU1PUllfSU5KRUNUSU9OX0JMT0NLRUQ6ICdNRU1PUllfSU5KRUNUSU9OX0JMT0NLRUQnLFxuICBNRU1PUllfSU5KRUNUSU9OX0RFVEVDVEVEX09OX1JFQUQ6ICdNRU1PUllfSU5KRUNUSU9OX0RFVEVDVEVEX09OX1JFQUQnLFxuICAvLyBGSVggIzE0MzA6IFNlZWQgbWVtb3J5IGluc3RhbGxhdGlvbiBldmVudHNcbiAgU0VFRF9NRU1PUllfSU5TVEFMTEVEOiAnU0VFRF9NRU1PUllfSU5TVEFMTEVEJyxcbiAgU0VFRF9NRU1PUllfSU5TVEFMTEFUSU9OX0ZBSUxFRDogJ1NFRURfTUVNT1JZX0lOU1RBTExBVElPTl9GQUlMRUQnLFxufSBhcyBjb25zdDtcbiJdfQ==