"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const fs_extra_1 = require("fs-extra"); const path_1 = require("path"); const config_manager_1 = require("../../utcp/config-manager"); /** * @zh 如果希望兼容 3.3 之前的版本可以使用下方的代码 * @en You can add the code below if you want compatibility with versions prior to 3.3 */ // Editor.Panel.define = Editor.Panel.define || function(options: any) { return options } module.exports = Editor.Panel.define({ listeners: { show() { console.log('show'); }, hide() { console.log('hide'); }, }, template: (0, fs_extra_1.readFileSync)((0, path_1.join)(__dirname, '../../../static/template/default/index.html'), 'utf-8'), style: (0, fs_extra_1.readFileSync)((0, path_1.join)(__dirname, '../../../static/style/default/index.css'), 'utf-8'), $: { app: '.panel', portInput: '#port-input', savePortBtn: '#save-port-btn', // MCP Integration mcpConfigCode: '#mcp-config-code', // UTCP Config utcpConfigPathInput: '#utcp-config-path', utcpConfigPathSaveBtn: '#save-utcp-path-btn', bridgeList: '#bridge-container', addBridgeBtn: '#add-bridge-btn', newTemplateJson: '#new-template-json', }, methods: { async loadSettings() { const configManager = (0, config_manager_1.getConfigManager)(); await configManager.initialize(); // Update UI with config path if (this.$.utcpConfigPathInput) { this.$.utcpConfigPathInput.value = configManager.getConfigPath(); } // Load Port const port = await configManager.getCurrentPort(); if (this.$.portInput) { this.$.portInput.value = port || 0; } this.updateMcpCodeBlock(); this.fetchBridgeList(); }, async saveSettings() { const newPath = this.$.utcpConfigPathInput.value; if (newPath) { const configManager = (0, config_manager_1.getConfigManager)(); await configManager.setConfigPath(newPath); this.updateMcpCodeBlock(); this.fetchBridgeList(); // Reload templates from new path console.log('Saved UTCP Config Path:', newPath); } }, async updatePort() { const portVal = this.$.portInput.value; const port = parseInt(portVal); console.log(`Updating port to: ${port}`); // Send message to main process to restart server Editor.Message.send('cocos-code-mode-ai', 'restart-server', port); }, updateMcpCodeBlock() { const codeEl = this.$.mcpConfigCode; if (!codeEl) return; const configManager = (0, config_manager_1.getConfigManager)(); const configPath = configManager.getConfigPath(); const config = { "mcpServers": { "code-mode": { "command": "npx", "args": ["-y", "@utcp/code-mode-mcp"], "env": { "UTCP_CONFIG_FILE": configPath } } } }; codeEl.textContent = JSON.stringify(config, null, 2); }, // Renamed from fetchBridgeList to be more generic 'renderTemplates' logic fetchBridgeList() { const container = this.$.bridgeList; if (!container) { console.warn('Bridge Config Container not found'); return; } // Clear "Loading..." or previous content container.innerHTML = ''; const configManager = (0, config_manager_1.getConfigManager)(); const config = configManager.readConfig(); const templates = config.manual_call_templates || []; console.log('Rendering templates:', templates.length); if (templates.length === 0) { container.innerHTML = '
No templates found.
'; } else { let html = ''; templates.forEach((t) => { const isCocos = t.name === 'CocosEditor'; const delBtn = isCocos ? `` // No delete for Cocos : ` `; const headerText = `${t.name} (${t.call_template_type})`; html += `
${headerText} ${delBtn}
`; }); container.innerHTML = html; // Now populate the code values correctly templates.forEach((t) => { const el = container.querySelector(`#code-${t.name}`); if (el) el.textContent = JSON.stringify(t, null, 2); }); } }, addBridgeTemplate() { const input = this.$.newTemplateJson; if (!input) return; const content = input.value.trim(); if (!content) return; try { let newTpl = JSON.parse(content); // Validate with @utcp/sdk or simple schema if (!newTpl.name || !newTpl.call_template_type) { alert('Invalid template. Must have name and call_template_type.'); return; } const configManager = (0, config_manager_1.getConfigManager)(); const config = configManager.readConfig(); // Check duplicates if (config.manual_call_templates.find((t) => t.name === newTpl.name)) { alert(`Template ${newTpl.name} already exists.`); return; } config.manual_call_templates.push(newTpl); configManager.writeConfig(config); input.value = ''; this.fetchBridgeList(); } catch (e) { alert('Invalid JSON: ' + e.message); } }, removeBridge(name) { if (name === 'CocosEditor') return; if (!confirm(`Remove template ${name}?`)) return; const configManager = (0, config_manager_1.getConfigManager)(); const config = configManager.readConfig(); if (config.manual_call_templates) { config.manual_call_templates = config.manual_call_templates.filter((t) => t.name !== name); configManager.writeConfig(config); this.fetchBridgeList(); } }, }, ready() { this.loadSettings(); // Listeners const savePort = this.$.savePortBtn; if (savePort) savePort.addEventListener('click', () => this.updatePort()); const savePath = this.$.utcpConfigPathSaveBtn; if (savePath) savePath.addEventListener('click', () => this.saveSettings()); const addBtn = this.$.addBridgeBtn; if (addBtn) addBtn.addEventListener('click', () => this.addBridgeTemplate()); const list = this.$.bridgeList; if (list) { list.addEventListener('click', (e) => { // Handle delete clicks const btn = e.target.closest('.remove-btn'); if (btn) { // In new structure, btn is inside .bridge-item-content inside ui-section const section = btn.closest('.bridge-item-section'); if (section && section.dataset.name) { this.removeBridge(section.dataset.name); } } }); } }, beforeClose() { }, close() { }, }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zb3VyY2UvcGFuZWxzL2RlZmF1bHQvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSx1Q0FBd0M7QUFDeEMsK0JBQTRCO0FBQzVCLDhEQUE2RDtBQUc3RDs7O0dBR0c7QUFDSCx5RkFBeUY7QUFFekYsTUFBTSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQztJQUNqQyxTQUFTLEVBQUU7UUFDUCxJQUFJLEtBQUssT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDL0IsSUFBSSxLQUFLLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQ2xDO0lBQ0QsUUFBUSxFQUFFLElBQUEsdUJBQVksRUFBQyxJQUFBLFdBQUksRUFBQyxTQUFTLEVBQUUsNkNBQTZDLENBQUMsRUFBRSxPQUFPLENBQUM7SUFDL0YsS0FBSyxFQUFFLElBQUEsdUJBQVksRUFBQyxJQUFBLFdBQUksRUFBQyxTQUFTLEVBQUUseUNBQXlDLENBQUMsRUFBRSxPQUFPLENBQUM7SUFDeEYsQ0FBQyxFQUFFO1FBQ0MsR0FBRyxFQUFFLFFBQVE7UUFDYixTQUFTLEVBQUUsYUFBYTtRQUN4QixXQUFXLEVBQUUsZ0JBQWdCO1FBRTdCLGtCQUFrQjtRQUNsQixhQUFhLEVBQUUsa0JBQWtCO1FBRWpDLGNBQWM7UUFDZCxtQkFBbUIsRUFBRSxtQkFBbUI7UUFDeEMscUJBQXFCLEVBQUUscUJBQXFCO1FBQzVDLFVBQVUsRUFBRSxtQkFBbUI7UUFDL0IsWUFBWSxFQUFFLGlCQUFpQjtRQUMvQixlQUFlLEVBQUUsb0JBQW9CO0tBQ3hDO0lBRUQsT0FBTyxFQUFFO1FBQ0wsS0FBSyxDQUFDLFlBQVk7WUFDZCxNQUFNLGFBQWEsR0FBRyxJQUFBLGlDQUFnQixHQUFFLENBQUM7WUFDekMsTUFBTSxhQUFhLENBQUMsVUFBVSxFQUFFLENBQUM7WUFFakMsNkJBQTZCO1lBQzdCLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO2dCQUM1QixJQUFJLENBQUMsQ0FBQyxDQUFDLG1CQUEyQixDQUFDLEtBQUssR0FBRyxhQUFhLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDOUUsQ0FBQztZQUVELFlBQVk7WUFDWixNQUFNLElBQUksR0FBRyxNQUFNLGFBQWEsQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUNsRCxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUM7Z0JBQ2xCLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBaUIsQ0FBQyxLQUFLLEdBQUcsSUFBSSxJQUFJLENBQUMsQ0FBQztZQUNoRCxDQUFDO1lBRUQsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7WUFDMUIsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQzNCLENBQUM7UUFFRCxLQUFLLENBQUMsWUFBWTtZQUNkLE1BQU0sT0FBTyxHQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsbUJBQTJCLENBQUMsS0FBSyxDQUFDO1lBQzFELElBQUksT0FBTyxFQUFFLENBQUM7Z0JBQ1YsTUFBTSxhQUFhLEdBQUcsSUFBQSxpQ0FBZ0IsR0FBRSxDQUFDO2dCQUN6QyxNQUFNLGFBQWEsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQzNDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO2dCQUMxQixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FBQyxpQ0FBaUM7Z0JBQ3pELE9BQU8sQ0FBQyxHQUFHLENBQUMseUJBQXlCLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDcEQsQ0FBQztRQUNMLENBQUM7UUFFRCxLQUFLLENBQUMsVUFBVTtZQUNaLE1BQU0sT0FBTyxHQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBaUIsQ0FBQyxLQUFLLENBQUM7WUFDaEQsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQy9CLE9BQU8sQ0FBQyxHQUFHLENBQUMscUJBQXFCLElBQUksRUFBRSxDQUFDLENBQUM7WUFDekMsaURBQWlEO1lBQ2pELE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLG9CQUFvQixFQUFFLGdCQUFnQixFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3RFLENBQUM7UUFFRCxrQkFBa0I7WUFDZCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLGFBQTRCLENBQUM7WUFDbkQsSUFBSSxDQUFDLE1BQU07Z0JBQUUsT0FBTztZQUVwQixNQUFNLGFBQWEsR0FBRyxJQUFBLGlDQUFnQixHQUFFLENBQUM7WUFDekMsTUFBTSxVQUFVLEdBQUcsYUFBYSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBRWpELE1BQU0sTUFBTSxHQUFHO2dCQUNYLFlBQVksRUFBRTtvQkFDVixXQUFXLEVBQUU7d0JBQ1QsU0FBUyxFQUFFLEtBQUs7d0JBQ2hCLE1BQU0sRUFBRSxDQUFDLElBQUksRUFBRSxxQkFBcUIsQ0FBQzt3QkFDckMsS0FBSyxFQUFFOzRCQUNILGtCQUFrQixFQUFFLFVBQVU7eUJBQ2pDO3FCQUNKO2lCQUNKO2FBQ0osQ0FBQztZQUVGLE1BQU0sQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3pELENBQUM7UUFFRCwwRUFBMEU7UUFDMUUsZUFBZTtZQUNYLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsVUFBeUIsQ0FBQztZQUNuRCxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7Z0JBQ2IsT0FBTyxDQUFDLElBQUksQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFDO2dCQUNsRCxPQUFPO1lBQ1gsQ0FBQztZQUVELHlDQUF5QztZQUN6QyxTQUFTLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQztZQUV6QixNQUFNLGFBQWEsR0FBRyxJQUFBLGlDQUFnQixHQUFFLENBQUM7WUFDekMsTUFBTSxNQUFNLEdBQUcsYUFBYSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQzFDLE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxxQkFBcUIsSUFBSSxFQUFFLENBQUM7WUFFckQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxzQkFBc0IsRUFBRSxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7WUFFdEQsSUFBSSxTQUFTLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUN6QixTQUFTLENBQUMsU0FBUyxHQUFHLG1FQUFtRSxDQUFDO1lBQzlGLENBQUM7aUJBQU0sQ0FBQztnQkFDSixJQUFJLElBQUksR0FBRyxFQUFFLENBQUM7Z0JBQ2QsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFO29CQUN6QixNQUFNLE9BQU8sR0FBRyxDQUFDLENBQUMsSUFBSSxLQUFLLGFBQWEsQ0FBQztvQkFDekMsTUFBTSxNQUFNLEdBQUcsT0FBTzt3QkFDbEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxzQkFBc0I7d0JBQzNCLENBQUMsQ0FBQzs7d0NBRWMsQ0FBQztvQkFFckIsTUFBTSxVQUFVLEdBQUcsR0FBRyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxrQkFBa0IsR0FBRyxDQUFDO29CQUV6RCxJQUFJLElBQUk7eUVBQzZDLENBQUMsQ0FBQyxJQUFJOzt3Q0FFdkMsVUFBVTs4QkFDcEIsTUFBTTs7OzBFQUdzQyxDQUFDLENBQUMsSUFBSTs7O3FCQUczRCxDQUFDO2dCQUNOLENBQUMsQ0FBQyxDQUFDO2dCQUNILFNBQVMsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO2dCQUUzQix5Q0FBeUM7Z0JBQ3pDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRTtvQkFDekIsTUFBTSxFQUFFLEdBQUcsU0FBUyxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBUSxDQUFDO29CQUM3RCxJQUFJLEVBQUU7d0JBQUUsRUFBRSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQ3hELENBQUMsQ0FBQyxDQUFDO1lBQ1AsQ0FBQztRQUNMLENBQUM7UUFFRCxpQkFBaUI7WUFDYixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLGVBQXNCLENBQUM7WUFDNUMsSUFBSSxDQUFDLEtBQUs7Z0JBQUUsT0FBTztZQUNuQixNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ25DLElBQUksQ0FBQyxPQUFPO2dCQUFFLE9BQU87WUFFckIsSUFBSSxDQUFDO2dCQUNELElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQ2pDLDJDQUEyQztnQkFDM0MsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztvQkFDN0MsS0FBSyxDQUFDLDBEQUEwRCxDQUFDLENBQUM7b0JBQ2xFLE9BQU87Z0JBQ1gsQ0FBQztnQkFFRCxNQUFNLGFBQWEsR0FBRyxJQUFBLGlDQUFnQixHQUFFLENBQUM7Z0JBQ3pDLE1BQU0sTUFBTSxHQUFHLGFBQWEsQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFFMUMsbUJBQW1CO2dCQUNuQixJQUFJLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7b0JBQ3hFLEtBQUssQ0FBQyxZQUFZLE1BQU0sQ0FBQyxJQUFJLGtCQUFrQixDQUFDLENBQUM7b0JBQ2pELE9BQU87Z0JBQ1gsQ0FBQztnQkFFRCxNQUFNLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUMxQyxhQUFhLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUNsQyxLQUFLLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQztnQkFDakIsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBRTNCLENBQUM7WUFBQyxPQUFPLENBQU0sRUFBRSxDQUFDO2dCQUNkLEtBQUssQ0FBQyxnQkFBZ0IsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDeEMsQ0FBQztRQUNMLENBQUM7UUFFRCxZQUFZLENBQUMsSUFBWTtZQUNyQixJQUFJLElBQUksS0FBSyxhQUFhO2dCQUFFLE9BQU87WUFDbkMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsSUFBSSxHQUFHLENBQUM7Z0JBQUUsT0FBTztZQUVqRCxNQUFNLGFBQWEsR0FBRyxJQUFBLGlDQUFnQixHQUFFLENBQUM7WUFDekMsTUFBTSxNQUFNLEdBQUcsYUFBYSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQzFDLElBQUksTUFBTSxDQUFDLHFCQUFxQixFQUFFLENBQUM7Z0JBQy9CLE1BQU0sQ0FBQyxxQkFBcUIsR0FBRyxNQUFNLENBQUMscUJBQXFCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxDQUFDO2dCQUNoRyxhQUFhLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUNsQyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDM0IsQ0FBQztRQUNMLENBQUM7S0FDSjtJQUNELEtBQUs7UUFDRCxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFFcEIsWUFBWTtRQUNaLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsV0FBMEIsQ0FBQztRQUNuRCxJQUFJLFFBQVE7WUFBRSxRQUFRLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO1FBRTFFLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMscUJBQW9DLENBQUM7UUFDN0QsSUFBSSxRQUFRO1lBQUUsUUFBUSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQztRQUU1RSxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLFlBQTJCLENBQUM7UUFDbEQsSUFBSSxNQUFNO1lBQUUsTUFBTSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDO1FBRTdFLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsVUFBeUIsQ0FBQztRQUM5QyxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ1AsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxDQUFDLENBQU0sRUFBRSxFQUFFO2dCQUN0Qyx1QkFBdUI7Z0JBQ3ZCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDO2dCQUM1QyxJQUFJLEdBQUcsRUFBRSxDQUFDO29CQUNOLHlFQUF5RTtvQkFDekUsTUFBTSxPQUFPLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO29CQUNwRCxJQUFJLE9BQU8sSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO3dCQUNsQyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQzVDLENBQUM7Z0JBQ0wsQ0FBQztZQUNMLENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQztJQUNMLENBQUM7SUFDRCxXQUFXLEtBQUssQ0FBQztJQUNqQixLQUFLLEtBQUssQ0FBQztDQUNkLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJlYWRGaWxlU3luYyB9IGZyb20gJ2ZzLWV4dHJhJztcbmltcG9ydCB7IGpvaW4gfSBmcm9tICdwYXRoJztcbmltcG9ydCB7IGdldENvbmZpZ01hbmFnZXIgfSBmcm9tICcuLi8uLi91dGNwL2NvbmZpZy1tYW5hZ2VyJztcbmltcG9ydCB7IENhbGxUZW1wbGF0ZVNlcmlhbGl6ZXIgfSBmcm9tICdAdXRjcC9zZGsnO1xuXG4vKipcbiAqIEB6aCDlpoLmnpzluIzmnJvlhbzlrrkgMy4zIOS5i+WJjeeahOeJiOacrOWPr+S7peS9v+eUqOS4i+aWueeahOS7o+eggVxuICogQGVuIFlvdSBjYW4gYWRkIHRoZSBjb2RlIGJlbG93IGlmIHlvdSB3YW50IGNvbXBhdGliaWxpdHkgd2l0aCB2ZXJzaW9ucyBwcmlvciB0byAzLjNcbiAqL1xuLy8gRWRpdG9yLlBhbmVsLmRlZmluZSA9IEVkaXRvci5QYW5lbC5kZWZpbmUgfHwgZnVuY3Rpb24ob3B0aW9uczogYW55KSB7IHJldHVybiBvcHRpb25zIH1cblxubW9kdWxlLmV4cG9ydHMgPSBFZGl0b3IuUGFuZWwuZGVmaW5lKHtcbiAgICBsaXN0ZW5lcnM6IHtcbiAgICAgICAgc2hvdygpIHsgY29uc29sZS5sb2coJ3Nob3cnKTsgfSxcbiAgICAgICAgaGlkZSgpIHsgY29uc29sZS5sb2coJ2hpZGUnKTsgfSxcbiAgICB9LFxuICAgIHRlbXBsYXRlOiByZWFkRmlsZVN5bmMoam9pbihfX2Rpcm5hbWUsICcuLi8uLi8uLi9zdGF0aWMvdGVtcGxhdGUvZGVmYXVsdC9pbmRleC5odG1sJyksICd1dGYtOCcpLFxuICAgIHN0eWxlOiByZWFkRmlsZVN5bmMoam9pbihfX2Rpcm5hbWUsICcuLi8uLi8uLi9zdGF0aWMvc3R5bGUvZGVmYXVsdC9pbmRleC5jc3MnKSwgJ3V0Zi04JyksXG4gICAgJDoge1xuICAgICAgICBhcHA6ICcucGFuZWwnLFxuICAgICAgICBwb3J0SW5wdXQ6ICcjcG9ydC1pbnB1dCcsXG4gICAgICAgIHNhdmVQb3J0QnRuOiAnI3NhdmUtcG9ydC1idG4nLFxuXG4gICAgICAgIC8vIE1DUCBJbnRlZ3JhdGlvblxuICAgICAgICBtY3BDb25maWdDb2RlOiAnI21jcC1jb25maWctY29kZScsXG5cbiAgICAgICAgLy8gVVRDUCBDb25maWdcbiAgICAgICAgdXRjcENvbmZpZ1BhdGhJbnB1dDogJyN1dGNwLWNvbmZpZy1wYXRoJyxcbiAgICAgICAgdXRjcENvbmZpZ1BhdGhTYXZlQnRuOiAnI3NhdmUtdXRjcC1wYXRoLWJ0bicsXG4gICAgICAgIGJyaWRnZUxpc3Q6ICcjYnJpZGdlLWNvbnRhaW5lcicsXG4gICAgICAgIGFkZEJyaWRnZUJ0bjogJyNhZGQtYnJpZGdlLWJ0bicsXG4gICAgICAgIG5ld1RlbXBsYXRlSnNvbjogJyNuZXctdGVtcGxhdGUtanNvbicsXG4gICAgfSxcblxuICAgIG1ldGhvZHM6IHtcbiAgICAgICAgYXN5bmMgbG9hZFNldHRpbmdzKCkge1xuICAgICAgICAgICAgY29uc3QgY29uZmlnTWFuYWdlciA9IGdldENvbmZpZ01hbmFnZXIoKTtcbiAgICAgICAgICAgIGF3YWl0IGNvbmZpZ01hbmFnZXIuaW5pdGlhbGl6ZSgpO1xuXG4gICAgICAgICAgICAvLyBVcGRhdGUgVUkgd2l0aCBjb25maWcgcGF0aFxuICAgICAgICAgICAgaWYgKHRoaXMuJC51dGNwQ29uZmlnUGF0aElucHV0KSB7XG4gICAgICAgICAgICAgICAgKHRoaXMuJC51dGNwQ29uZmlnUGF0aElucHV0IGFzIGFueSkudmFsdWUgPSBjb25maWdNYW5hZ2VyLmdldENvbmZpZ1BhdGgoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gTG9hZCBQb3J0XG4gICAgICAgICAgICBjb25zdCBwb3J0ID0gYXdhaXQgY29uZmlnTWFuYWdlci5nZXRDdXJyZW50UG9ydCgpO1xuICAgICAgICAgICAgaWYgKHRoaXMuJC5wb3J0SW5wdXQpIHtcbiAgICAgICAgICAgICAgICAodGhpcy4kLnBvcnRJbnB1dCBhcyBhbnkpLnZhbHVlID0gcG9ydCB8fCAwO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZU1jcENvZGVCbG9jaygpO1xuICAgICAgICAgICAgdGhpcy5mZXRjaEJyaWRnZUxpc3QoKTtcbiAgICAgICAgfSxcblxuICAgICAgICBhc3luYyBzYXZlU2V0dGluZ3MoKSB7XG4gICAgICAgICAgICBjb25zdCBuZXdQYXRoID0gKHRoaXMuJC51dGNwQ29uZmlnUGF0aElucHV0IGFzIGFueSkudmFsdWU7XG4gICAgICAgICAgICBpZiAobmV3UGF0aCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbmZpZ01hbmFnZXIgPSBnZXRDb25maWdNYW5hZ2VyKCk7XG4gICAgICAgICAgICAgICAgYXdhaXQgY29uZmlnTWFuYWdlci5zZXRDb25maWdQYXRoKG5ld1BhdGgpO1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlTWNwQ29kZUJsb2NrKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5mZXRjaEJyaWRnZUxpc3QoKTsgLy8gUmVsb2FkIHRlbXBsYXRlcyBmcm9tIG5ldyBwYXRoXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1NhdmVkIFVUQ1AgQ29uZmlnIFBhdGg6JywgbmV3UGF0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgYXN5bmMgdXBkYXRlUG9ydCgpIHtcbiAgICAgICAgICAgIGNvbnN0IHBvcnRWYWwgPSAodGhpcy4kLnBvcnRJbnB1dCBhcyBhbnkpLnZhbHVlO1xuICAgICAgICAgICAgY29uc3QgcG9ydCA9IHBhcnNlSW50KHBvcnRWYWwpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coYFVwZGF0aW5nIHBvcnQgdG86ICR7cG9ydH1gKTtcbiAgICAgICAgICAgIC8vIFNlbmQgbWVzc2FnZSB0byBtYWluIHByb2Nlc3MgdG8gcmVzdGFydCBzZXJ2ZXJcbiAgICAgICAgICAgIEVkaXRvci5NZXNzYWdlLnNlbmQoJ2NvY29zLWNvZGUtbW9kZS1haScsICdyZXN0YXJ0LXNlcnZlcicsIHBvcnQpO1xuICAgICAgICB9LFxuXG4gICAgICAgIHVwZGF0ZU1jcENvZGVCbG9jaygpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvZGVFbCA9IHRoaXMuJC5tY3BDb25maWdDb2RlIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgaWYgKCFjb2RlRWwpIHJldHVybjtcblxuICAgICAgICAgICAgY29uc3QgY29uZmlnTWFuYWdlciA9IGdldENvbmZpZ01hbmFnZXIoKTtcbiAgICAgICAgICAgIGNvbnN0IGNvbmZpZ1BhdGggPSBjb25maWdNYW5hZ2VyLmdldENvbmZpZ1BhdGgoKTtcblxuICAgICAgICAgICAgY29uc3QgY29uZmlnID0ge1xuICAgICAgICAgICAgICAgIFwibWNwU2VydmVyc1wiOiB7XG4gICAgICAgICAgICAgICAgICAgIFwiY29kZS1tb2RlXCI6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiY29tbWFuZFwiOiBcIm5weFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJhcmdzXCI6IFtcIi15XCIsIFwiQHV0Y3AvY29kZS1tb2RlLW1jcFwiXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiZW52XCI6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlVUQ1BfQ09ORklHX0ZJTEVcIjogY29uZmlnUGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgY29kZUVsLnRleHRDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkoY29uZmlnLCBudWxsLCAyKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvLyBSZW5hbWVkIGZyb20gZmV0Y2hCcmlkZ2VMaXN0IHRvIGJlIG1vcmUgZ2VuZXJpYyAncmVuZGVyVGVtcGxhdGVzJyBsb2dpY1xuICAgICAgICBmZXRjaEJyaWRnZUxpc3QoKSB7XG4gICAgICAgICAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLiQuYnJpZGdlTGlzdCBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgIGlmICghY29udGFpbmVyKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdCcmlkZ2UgQ29uZmlnIENvbnRhaW5lciBub3QgZm91bmQnKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIENsZWFyIFwiTG9hZGluZy4uLlwiIG9yIHByZXZpb3VzIGNvbnRlbnRcbiAgICAgICAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSAnJztcblxuICAgICAgICAgICAgY29uc3QgY29uZmlnTWFuYWdlciA9IGdldENvbmZpZ01hbmFnZXIoKTtcbiAgICAgICAgICAgIGNvbnN0IGNvbmZpZyA9IGNvbmZpZ01hbmFnZXIucmVhZENvbmZpZygpO1xuICAgICAgICAgICAgY29uc3QgdGVtcGxhdGVzID0gY29uZmlnLm1hbnVhbF9jYWxsX3RlbXBsYXRlcyB8fCBbXTtcblxuICAgICAgICAgICAgY29uc29sZS5sb2coJ1JlbmRlcmluZyB0ZW1wbGF0ZXM6JywgdGVtcGxhdGVzLmxlbmd0aCk7XG5cbiAgICAgICAgICAgIGlmICh0ZW1wbGF0ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9ICc8ZGl2IHN0eWxlPVwicGFkZGluZzoxMHB4OyBjb2xvcjogIzg4ODtcIj5ObyB0ZW1wbGF0ZXMgZm91bmQuPC9kaXY+JztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IGh0bWwgPSAnJztcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZXMuZm9yRWFjaCgodDogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlzQ29jb3MgPSB0Lm5hbWUgPT09ICdDb2Nvc0VkaXRvcic7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlbEJ0biA9IGlzQ29jb3NcbiAgICAgICAgICAgICAgICAgICAgICAgID8gYGAgLy8gTm8gZGVsZXRlIGZvciBDb2Nvc1xuICAgICAgICAgICAgICAgICAgICAgICAgOiBgPHVpLWJ1dHRvbiBzbG90PVwiaGVhZGVyXCIgdHlwZT1cImRhbmdlclwiIGNsYXNzPVwicmVtb3ZlLWJ0blwiIHRvb2x0aXA9XCJSZW1vdmUgVGVtcGxhdGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVpLWljb24gdmFsdWU9XCJkZWxcIj48L3VpLWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICA8L3VpLWJ1dHRvbj5gO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGhlYWRlclRleHQgPSBgJHt0Lm5hbWV9ICgke3QuY2FsbF90ZW1wbGF0ZV90eXBlfSlgO1xuXG4gICAgICAgICAgICAgICAgICAgIGh0bWwgKz0gYFxuICAgICAgICAgICAgICAgICAgICA8dWktc2VjdGlvbiBjbGFzcz1cImJyaWRnZS1pdGVtLXNlY3Rpb25cIiBkYXRhLW5hbWU9XCIke3QubmFtZX1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgc2xvdD1cImhlYWRlclwiIHN0eWxlPVwiZGlzcGxheTogZmxleDsganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOyBhbGlnbi1pdGVtczogY2VudGVyOyB3aWR0aDogMTAwJTsgcGFkZGluZy1yaWdodDogMTBweDtcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dWktbGFiZWw+JHtoZWFkZXJUZXh0fTwvdWktbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJHtkZWxCdG59XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJicmlkZ2UtaXRlbS1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1aS1jb2RlIGxhbmd1YWdlPVwianNvblwiIHJlYWRvbmx5IGlkPVwiY29kZS0ke3QubmFtZX1cIj48L3VpLWNvZGU+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC91aS1zZWN0aW9uPlxuICAgICAgICAgICAgICAgICAgICBgO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSBodG1sO1xuXG4gICAgICAgICAgICAgICAgLy8gTm93IHBvcHVsYXRlIHRoZSBjb2RlIHZhbHVlcyBjb3JyZWN0bHlcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZXMuZm9yRWFjaCgodDogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVsID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoYCNjb2RlLSR7dC5uYW1lfWApIGFzIGFueTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVsKSBlbC50ZXh0Q29udGVudCA9IEpTT04uc3RyaW5naWZ5KHQsIG51bGwsIDIpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIGFkZEJyaWRnZVRlbXBsYXRlKCkge1xuICAgICAgICAgICAgY29uc3QgaW5wdXQgPSB0aGlzLiQubmV3VGVtcGxhdGVKc29uIGFzIGFueTtcbiAgICAgICAgICAgIGlmICghaW5wdXQpIHJldHVybjtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSBpbnB1dC52YWx1ZS50cmltKCk7XG4gICAgICAgICAgICBpZiAoIWNvbnRlbnQpIHJldHVybjtcblxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBsZXQgbmV3VHBsID0gSlNPTi5wYXJzZShjb250ZW50KTtcbiAgICAgICAgICAgICAgICAvLyBWYWxpZGF0ZSB3aXRoIEB1dGNwL3NkayBvciBzaW1wbGUgc2NoZW1hXG4gICAgICAgICAgICAgICAgaWYgKCFuZXdUcGwubmFtZSB8fCAhbmV3VHBsLmNhbGxfdGVtcGxhdGVfdHlwZSkge1xuICAgICAgICAgICAgICAgICAgICBhbGVydCgnSW52YWxpZCB0ZW1wbGF0ZS4gTXVzdCBoYXZlIG5hbWUgYW5kIGNhbGxfdGVtcGxhdGVfdHlwZS4nKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbmZpZ01hbmFnZXIgPSBnZXRDb25maWdNYW5hZ2VyKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgY29uZmlnID0gY29uZmlnTWFuYWdlci5yZWFkQ29uZmlnKCk7XG5cbiAgICAgICAgICAgICAgICAvLyBDaGVjayBkdXBsaWNhdGVzXG4gICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5tYW51YWxfY2FsbF90ZW1wbGF0ZXMuZmluZCgodDogYW55KSA9PiB0Lm5hbWUgPT09IG5ld1RwbC5uYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICBhbGVydChgVGVtcGxhdGUgJHtuZXdUcGwubmFtZX0gYWxyZWFkeSBleGlzdHMuYCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25maWcubWFudWFsX2NhbGxfdGVtcGxhdGVzLnB1c2gobmV3VHBsKTtcbiAgICAgICAgICAgICAgICBjb25maWdNYW5hZ2VyLndyaXRlQ29uZmlnKGNvbmZpZyk7XG4gICAgICAgICAgICAgICAgaW5wdXQudmFsdWUgPSAnJztcbiAgICAgICAgICAgICAgICB0aGlzLmZldGNoQnJpZGdlTGlzdCgpO1xuXG4gICAgICAgICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgICAgICAgICBhbGVydCgnSW52YWxpZCBKU09OOiAnICsgZS5tZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICByZW1vdmVCcmlkZ2UobmFtZTogc3RyaW5nKSB7XG4gICAgICAgICAgICBpZiAobmFtZSA9PT0gJ0NvY29zRWRpdG9yJykgcmV0dXJuO1xuICAgICAgICAgICAgaWYgKCFjb25maXJtKGBSZW1vdmUgdGVtcGxhdGUgJHtuYW1lfT9gKSkgcmV0dXJuO1xuXG4gICAgICAgICAgICBjb25zdCBjb25maWdNYW5hZ2VyID0gZ2V0Q29uZmlnTWFuYWdlcigpO1xuICAgICAgICAgICAgY29uc3QgY29uZmlnID0gY29uZmlnTWFuYWdlci5yZWFkQ29uZmlnKCk7XG4gICAgICAgICAgICBpZiAoY29uZmlnLm1hbnVhbF9jYWxsX3RlbXBsYXRlcykge1xuICAgICAgICAgICAgICAgIGNvbmZpZy5tYW51YWxfY2FsbF90ZW1wbGF0ZXMgPSBjb25maWcubWFudWFsX2NhbGxfdGVtcGxhdGVzLmZpbHRlcigodDogYW55KSA9PiB0Lm5hbWUgIT09IG5hbWUpO1xuICAgICAgICAgICAgICAgIGNvbmZpZ01hbmFnZXIud3JpdGVDb25maWcoY29uZmlnKTtcbiAgICAgICAgICAgICAgICB0aGlzLmZldGNoQnJpZGdlTGlzdCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgIH0sXG4gICAgcmVhZHkoKSB7XG4gICAgICAgIHRoaXMubG9hZFNldHRpbmdzKCk7XG5cbiAgICAgICAgLy8gTGlzdGVuZXJzXG4gICAgICAgIGNvbnN0IHNhdmVQb3J0ID0gdGhpcy4kLnNhdmVQb3J0QnRuIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBpZiAoc2F2ZVBvcnQpIHNhdmVQb3J0LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gdGhpcy51cGRhdGVQb3J0KCkpO1xuXG4gICAgICAgIGNvbnN0IHNhdmVQYXRoID0gdGhpcy4kLnV0Y3BDb25maWdQYXRoU2F2ZUJ0biBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgaWYgKHNhdmVQYXRoKSBzYXZlUGF0aC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHRoaXMuc2F2ZVNldHRpbmdzKCkpO1xuXG4gICAgICAgIGNvbnN0IGFkZEJ0biA9IHRoaXMuJC5hZGRCcmlkZ2VCdG4gYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGlmIChhZGRCdG4pIGFkZEJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHRoaXMuYWRkQnJpZGdlVGVtcGxhdGUoKSk7XG5cbiAgICAgICAgY29uc3QgbGlzdCA9IHRoaXMuJC5icmlkZ2VMaXN0IGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBpZiAobGlzdCkge1xuICAgICAgICAgICAgbGlzdC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBIYW5kbGUgZGVsZXRlIGNsaWNrc1xuICAgICAgICAgICAgICAgIGNvbnN0IGJ0biA9IGUudGFyZ2V0LmNsb3Nlc3QoJy5yZW1vdmUtYnRuJyk7XG4gICAgICAgICAgICAgICAgaWYgKGJ0bikge1xuICAgICAgICAgICAgICAgICAgICAvLyBJbiBuZXcgc3RydWN0dXJlLCBidG4gaXMgaW5zaWRlIC5icmlkZ2UtaXRlbS1jb250ZW50IGluc2lkZSB1aS1zZWN0aW9uXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlY3Rpb24gPSBidG4uY2xvc2VzdCgnLmJyaWRnZS1pdGVtLXNlY3Rpb24nKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlY3Rpb24gJiYgc2VjdGlvbi5kYXRhc2V0Lm5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlQnJpZGdlKHNlY3Rpb24uZGF0YXNldC5uYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBiZWZvcmVDbG9zZSgpIHsgfSxcbiAgICBjbG9zZSgpIHsgfSxcbn0pOyJdfQ==