bytefun-ai-mcp
Version:
ByteFun AI MCP服务 - 打通产品设计、UI设计、代码开发的服务平台,支持设计稿转代码和跨平台原生代码开发
170 lines • 20.4 kB
JavaScript
import { io } from 'socket.io-client';
import { sm2 } from 'sm-crypto';
/**
* 使用 SM2 加密算法加密数据
* @param data 要加密的数据
* @param publicKey SM2 公钥
* @returns 加密后的数据(16进制字符串)
*/
function sm2Encrypt(data, publicKey, privateKey) {
try {
// 将数据转换为字符串
const dataStr = String(data);
const timestamp = `${Date.now()}`;
const singData = stringToHex(dataStr + timestamp);
const sign = sm2.doSignature(singData, privateKey, { der: true, hash: true });
const map = {
data: dataStr,
timestamp,
sign,
};
const encryptData = sm2.doEncrypt(JSON.stringify(map), publicKey);
return `04${encryptData}`;
}
catch (error) {
console.error('[SM2] 加密失败:', error);
}
return '';
}
function stringToHex(str) {
let hexStr = '';
for (let i = 0; i < str.length; i++) {
const code = str.charCodeAt(i);
if (code < 128) {
hexStr += `00${code.toString(16)}`.slice(-2); // 对于ASCII字符,直接转换为16进制
}
else if (code < 2048) {
hexStr += `00${((code >> 6) | 192).toString(16)}`.slice(-2);
hexStr += `00${((code & 63) | 128).toString(16)}`.slice(-2);
}
else {
hexStr += `00${((code >> 12) | 224).toString(16)}`.slice(-2);
hexStr += `00${(((code >> 6) & 63) | 128).toString(16)}`.slice(-2);
hexStr += `00${((code & 63) | 128).toString(16)}`.slice(-2);
}
}
return hexStr;
}
/**
* Socket.IO 连接管理器(单例模式)
* 负责管理与编辑器后端的 Socket.IO 连接
*/
class SocketManager {
static instance;
socket = null;
isConnecting = false;
connectionPromise = null;
constructor() { }
/**
* 获取 SocketManager 单例实例
*/
static getInstance() {
if (!SocketManager.instance) {
SocketManager.instance = new SocketManager();
}
return SocketManager.instance;
}
/**
* 获取或创建 Socket 连接
* 如果已连接,返回现有连接
* 如果未连接,创建新连接
*/
async getSocket(uid) {
// 如果已经有连接且连接正常,直接返回
if (this.socket && this.socket.connected) {
console.error('[SocketManager] 使用现有的 Socket 连接');
return this.socket;
}
// 如果正在连接中,等待连接完成
if (this.isConnecting && this.connectionPromise) {
console.error('[SocketManager] 等待正在进行的连接...');
return this.connectionPromise;
}
// 创建新连接
this.isConnecting = true;
this.connectionPromise = this.createConnection(uid);
try {
this.socket = await this.connectionPromise;
return this.socket;
}
finally {
this.isConnecting = false;
this.connectionPromise = null;
}
}
/**
* 创建新的 Socket 连接
*/
createConnection(uid) {
return new Promise((resolve, reject) => {
console.error('[SocketManager] 创建新的 Socket.IO 连接...');
const socketUrl = 'https://editor.bytefungo.com';
const socketIOPath = '/subscribe/message';
// 对uid进行sm2加密
const privateKey = '7aa384d4dc7d7c8198b31b02ac03fde61273693fd3dd6b7f92310db208ce66ce';
const publicKey = '04e7bc2eff52c769de806051a8e5dcb54e3e213fd25c6c08f7a083a283da400aff9b7330bfb7d40f5ac59783d79b9ad907740fc92ae56bdffc349aaed91797218f';
const encryptedUID = sm2Encrypt(uid, publicKey, privateKey);
const socket = io(socketUrl, {
forceNew: true,
path: socketIOPath,
extraHeaders: {
Authorization: `XBearer ${encryptedUID}`,
},
});
// 连接成功
socket.on('connect', () => {
console.error('[SocketManager] Socket.IO 连接成功!Socket ID:', socket.id);
resolve(socket);
});
// 连接错误
socket.on('connect_error', (error) => {
console.error('[SocketManager] Socket.IO 连接错误:', error.message);
// 如果是初次连接失败,拒绝 Promise
if (!this.socket) {
reject(new Error(`Socket.IO 连接失败: ${error.message}`));
}
});
// 断开连接
socket.on('disconnect', (reason) => {
console.error('[SocketManager] Socket.IO 连接断开:', reason);
});
// 重连成功
socket.on('reconnect', (attemptNumber) => {
console.error('[SocketManager] Socket.IO 重连成功,尝试次数:', attemptNumber);
});
// 设置连接超时
setTimeout(() => {
if (!socket.connected) {
socket.close();
reject(new Error('Socket.IO 连接超时'));
}
}, 15000); // 15秒超时
});
}
/**
* 断开 Socket 连接
* 通常不需要调用,除非要完全关闭连接
*/
disconnect() {
if (this.socket) {
console.error('[SocketManager] 断开 Socket.IO 连接');
this.socket.disconnect();
this.socket = null;
}
}
/**
* 获取当前 Socket 实例(可能为 null)
*/
getCurrentSocket() {
return this.socket;
}
/**
* 检查是否已连接
*/
isConnected() {
return this.socket !== null && this.socket.connected;
}
}
// 导出单例实例
export const socketManager = SocketManager.getInstance();
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29ja2V0LW1hbmFnZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvc29ja2V0LW1hbmFnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFVLEVBQUUsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDaEM7Ozs7O0dBS0c7QUFDSCxTQUFTLFVBQVUsQ0FBQyxJQUFxQixFQUFFLFNBQWlCLEVBQUUsVUFBa0I7SUFDOUUsSUFBSSxDQUFDO1FBQ0gsWUFBWTtRQUNaLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUU3QixNQUFNLFNBQVMsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFBO1FBQ2pDLE1BQU0sUUFBUSxHQUFHLFdBQVcsQ0FBQyxPQUFPLEdBQUcsU0FBUyxDQUFDLENBQUE7UUFDakQsTUFBTSxJQUFJLEdBQUcsR0FBRyxDQUFDLFdBQVcsQ0FBQyxRQUFRLEVBQUUsVUFBVSxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQTtRQUM3RSxNQUFNLEdBQUcsR0FBRztZQUNWLElBQUksRUFBRSxPQUFPO1lBQ2IsU0FBUztZQUNULElBQUk7U0FDTCxDQUFBO1FBRUQsTUFBTSxXQUFXLEdBQUcsR0FBRyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFBO1FBQ2pFLE9BQU8sS0FBSyxXQUFXLEVBQUUsQ0FBQztJQUM1QixDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNmLE9BQU8sQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFDRCxPQUFPLEVBQUUsQ0FBQTtBQUNYLENBQUM7QUFFRCxTQUFTLFdBQVcsQ0FB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Q0FBQztJQUVEOzs7T0FHRztJQUNJLFVBQVU7UUFDZixJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNoQixPQUFPLENBQUMsS0FBSyxDQUFDLGlDQUFpQyxDQUFDLENBQUM7WUFDakQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUN6QixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztRQUNyQixDQUFDO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0ksZ0JBQWdCO1FBQ3JCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUNyQixDQUFDO0lBRUQ7O09BRUc7SUFDSSxXQUFXO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLE1BQU0sS0FBSyxJQUFJLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUM7SUFDdkQsQ0FBQztDQUNGO0FBRUQsU0FBUztBQUNULE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBRyxhQUFhLENBQUMsV0FBVyxFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTb2NrZXQsIGlvIH0gZnJvbSAnc29ja2V0LmlvLWNsaWVudCc7XG5pbXBvcnQgeyBzbTIgfSBmcm9tICdzbS1jcnlwdG8nO1xuLyoqXG4gKiDkvb/nlKggU00yIOWKoOWvhueul+azleWKoOWvhuaVsOaNrlxuICogQHBhcmFtIGRhdGEg6KaB5Yqg5a+G55qE5pWw5o2uXG4gKiBAcGFyYW0gcHVibGljS2V5IFNNMiDlhazpkqVcbiAqIEByZXR1cm5zIOWKoOWvhuWQjueahOaVsOaNru+8iDE26L+b5Yi25a2X56ym5Liy77yJXG4gKi9cbmZ1bmN0aW9uIHNtMkVuY3J5cHQoZGF0YTogbnVtYmVyIHwgc3RyaW5nLCBwdWJsaWNLZXk6IHN0cmluZywgcHJpdmF0ZUtleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgdHJ5IHtcbiAgICAvLyDlsIbmlbDmja7ovazmjaLkuLrlrZfnrKbkuLJcbiAgICBjb25zdCBkYXRhU3RyID0gU3RyaW5nKGRhdGEpO1xuICAgIFxuICAgIGNvbnN0IHRpbWVzdGFtcCA9IGAke0RhdGUubm93KCl9YFxuICAgIGNvbnN0IHNpbmdEYXRhID0gc3RyaW5nVG9IZXgoZGF0YVN0ciArIHRpbWVzdGFtcClcbiAgICBjb25zdCBzaWduID0gc20yLmRvU2lnbmF0dXJlKHNpbmdEYXRhLCBwcml2YXRlS2V5LCB7IGRlcjogdHJ1ZSwgaGFzaDogdHJ1ZSB9KVxuICAgIGNvbnN0IG1hcCA9IHtcbiAgICAgIGRhdGE6IGRhdGFTdHIsXG4gICAgICB0aW1lc3RhbXAsXG4gICAgICBzaWduLFxuICAgIH1cbiAgICBcbiAgICBjb25zdCBlbmNyeXB0RGF0YSA9IHNtMi5kb0VuY3J5cHQoSlNPTi5zdHJpbmdpZnkobWFwKSwgcHVibGljS2V5KVxuICAgIHJldHVybiBgMDQke2VuY3J5cHREYXRhfWA7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcignW1NNMl0g5Yqg5a+G5aSx6LSlOicsIGVycm9yKTtcbiAgfVxuICByZXR1cm4gJydcbn1cblxuZnVuY3Rpb24gc3RyaW5nVG9IZXgoc3RyOiBzdHJpbmcpIHtcbiAgICBsZXQgaGV4U3RyID0gJydcbiAgXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGNvZGUgPSBzdHIuY2hhckNvZGVBdChpKVxuICBcbiAgICAgIGlmIChjb2RlIDwgMTI4KSB7XG4gICAgICAgIGhleFN0ciArPSBgMDAke2NvZGUudG9TdHJpbmcoMTYpfWAuc2xpY2UoLTIpIC8vIOWvueS6jkFTQ0lJ5a2X56ym77yM55u05o6l6L2s5o2i5Li6MTbov5vliLZcbiAgICAgIH0gZWxzZSBpZiAoY29kZSA8IDIwNDgpIHtcbiAgICAgICAgaGV4U3RyICs9IGAwMCR7KChjb2RlID4+IDYpIHwgMTkyKS50b1N0cmluZygxNil9YC5zbGljZSgtMilcbiAgICAgICAgaGV4U3RyICs9IGAwMCR7KChjb2RlICYgNjMpIHwgMTI4KS50b1N0cmluZygxNil9YC5zbGljZSgtMilcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGhleFN0ciArPSBgMDAkeygoY29kZSA+PiAxMikgfCAyMjQpLnRvU3RyaW5nKDE2KX1gLnNsaWNlKC0yKVxuICAgICAgICBoZXhTdHIgKz0gYDAwJHsoKChjb2RlID4+IDYpICYgNjMpIHwgMTI4KS50b1N0cmluZygxNil9YC5zbGljZSgtMilcbiAgICAgICAgaGV4U3RyICs9IGAwMCR7KChjb2RlICYgNjMpIHwgMTI4KS50b1N0cmluZygxNil9YC5zbGljZSgtMilcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGhleFN0clxufVxuXG4vKipcbiAqIFNvY2tldC5JTyDov57mjqXnrqHnkIblmajvvIjljZXkvovmqKHlvI/vvIlcbiAqIOi0n+i0o+euoeeQhuS4jue8lui+keWZqOWQjuerr+eahCBTb2NrZXQuSU8g6L+e5o6lXG4gKi9cbmNsYXNzIFNvY2tldE1hbmFnZXIge1xuICBwcml2YXRlIHN0YXRpYyBpbnN0YW5jZTogU29ja2V0TWFuYWdlcjtcbiAgcHJpdmF0ZSBzb2NrZXQ6IFNvY2tldCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGlzQ29ubmVjdGluZzogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIGNvbm5lY3Rpb25Qcm9taXNlOiBQcm9taXNlPFNvY2tldD4gfCBudWxsID0gbnVsbDtcblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge31cblxuICAvKipcbiAgICog6I635Y+WIFNvY2tldE1hbmFnZXIg5Y2V5L6L5a6e5L6LXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGdldEluc3RhbmNlKCk6IFNvY2tldE1hbmFnZXIge1xuICAgIGlmICghU29ja2V0TWFuYWdlci5pbnN0YW5jZSkge1xuICAgICAgU29ja2V0TWFuYWdlci5pbnN0YW5jZSA9IG5ldyBTb2NrZXRNYW5hZ2VyKCk7XG4gICAgfVxuICAgIHJldHVybiBTb2NrZXRNYW5hZ2VyLmluc3RhbmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPluaIluWIm+W7uiBTb2NrZXQg6L+e5o6lXG4gICAqIOWmguaenOW3sui/nuaOpe+8jOi/lOWbnueOsOaciei/nuaOpVxuICAgKiDlpoLmnpzmnKrov57mjqXvvIzliJvlu7rmlrDov57mjqVcbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRTb2NrZXQodWlkOiBudW1iZXIpOiBQcm9taXNlPFNvY2tldD4ge1xuICAgIC8vIOWmguaenOW3sue7j+aciei/nuaOpeS4lOi/nuaOpeato+W4uO+8jOebtOaOpei/lOWbnlxuICAgIGlmICh0aGlzLnNvY2tldCAmJiB0aGlzLnNvY2tldC5jb25uZWN0ZWQpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1tTb2NrZXRNYW5hZ2VyXSDkvb/nlKjnjrDmnInnmoQgU29ja2V0IOi/nuaOpScpO1xuICAgICAgcmV0dXJuIHRoaXMuc29ja2V0O1xuICAgIH1cblxuICAgIC8vIOWmguaenOato+WcqOi/nuaOpeS4re+8jOetieW+hei/nuaOpeWujOaIkFxuICAgIGlmICh0aGlzLmlzQ29ubmVjdGluZyAmJiB0aGlzLmNvbm5lY3Rpb25Qcm9taXNlKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdbU29ja2V0TWFuYWdlcl0g562J5b6F5q2j5Zyo6L+b6KGM55qE6L+e5o6lLi4uJyk7XG4gICAgICByZXR1cm4gdGhpcy5jb25uZWN0aW9uUHJvbWlzZTtcbiAgICB9XG5cbiAgICAvLyDliJvlu7rmlrDov57mjqVcbiAgICB0aGlzLmlzQ29ubmVjdGluZyA9IHRydWU7XG4gICAgdGhpcy5jb25uZWN0aW9uUHJvbWlzZSA9IHRoaXMuY3JlYXRlQ29ubmVjdGlvbih1aWQpO1xuICAgIFxuICAgIHRyeSB7XG4gICAgICB0aGlzLnNvY2tldCA9IGF3YWl0IHRoaXMuY29ubmVjdGlvblByb21pc2U7XG4gICAgICByZXR1cm4gdGhpcy5zb2NrZXQ7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuaXNDb25uZWN0aW5nID0gZmFsc2U7XG4gICAgICB0aGlzLmNvbm5lY3Rpb25Qcm9taXNlID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog5Yib5bu65paw55qEIFNvY2tldCDov57mjqVcbiAgICovXG4gIHByaXZhdGUgY3JlYXRlQ29ubmVjdGlvbih1aWQ6IG51bWJlcik6IFByb21pc2U8U29ja2V0PiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1tTb2NrZXRNYW5hZ2VyXSDliJvlu7rmlrDnmoQgU29ja2V0LklPIOi/nuaOpS4uLicpO1xuICAgICAgXG4gICAgICBjb25zdCBzb2NrZXRVcmwgPSAnaHR0cHM6Ly9lZGl0b3IuYnl0ZWZ1bmdvLmNvbSc7XG4gICAgICBjb25zdCBzb2NrZXRJT1BhdGggPSAnL3N1YnNjcmliZS9tZXNzYWdlJztcbiAgICAgIFxuICAgICAgLy8g5a+5dWlk6L+b6KGMc20y5Yqg5a+GXG4gICAgICBjb25zdCBwcml2YXRlS2V5ID0gJzdhYTM4NGQ0ZGM3ZDdjODE5OGIzMWIwMmFjMDNmZGU2MTI3MzY5M2ZkM2RkNmI3ZjkyMzEwZGIyMDhjZTY2Y2UnO1xuICAgICAgY29uc3QgcHVibGljS2V5ID0gJzA0ZTdiYzJlZmY1MmM3NjlkZTgwNjA1MWE4ZTVkY2I1NGUzZTIxM2ZkMjVjNmMwOGY3YTA4M2EyODNkYTQwMGFmZjliNzMzMGJmYjdkNDBmNWFjNTk3ODNkNzliOWFkOTA3NzQwZmM5MmFlNTZiZGZmYzM0OWFhZWQ5MTc5NzIxOGYnO1xuICAgICAgY29uc3QgZW5jcnlwdGVkVUlEID0gc20yRW5jcnlwdCh1aWQsIHB1YmxpY0tleSwgcHJpdmF0ZUtleSk7XG5cbiAgICAgIGNvbnN0IHNvY2tldCA9IGlvKHNvY2tldFVybCwge1xuICAgICAgICBmb3JjZU5ldzogdHJ1ZSxcbiAgICAgICAgcGF0aDogc29ja2V0SU9QYXRoLFxuICAgICAgICBleHRyYUhlYWRlcnM6IHtcbiAgICAgICAgICAgIEF1dGhvcml6YXRpb246IGBYQmVhcmVyICR7ZW5jcnlwdGVkVUlEfWAsXG4gICAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICAvLyDov57mjqXmiJDlip9cbiAgICAgIHNvY2tldC5vbignY29ubmVjdCcsICgpID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcignW1NvY2tldE1hbmFnZXJdIFNvY2tldC5JTyDov57mjqXmiJDlip/vvIFTb2NrZXQgSUQ6Jywgc29ja2V0LmlkKTtcbiAgICAgICAgcmVzb2x2ZShzb2NrZXQpO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIOi/nuaOpemUmeivr1xuICAgICAgc29ja2V0Lm9uKCdjb25uZWN0X2Vycm9yJywgKGVycm9yOiBhbnkpID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcignW1NvY2tldE1hbmFnZXJdIFNvY2tldC5JTyDov57mjqXplJnor686JywgZXJyb3IubWVzc2FnZSk7XG4gICAgICAgIC8vIOWmguaenOaYr+WIneasoei/nuaOpeWksei0pe+8jOaLkue7nSBQcm9taXNlXG4gICAgICAgIGlmICghdGhpcy5zb2NrZXQpIHtcbiAgICAgICAgICByZWplY3QobmV3IEVycm9yKGBTb2NrZXQuSU8g6L+e5o6l5aSx6LSlOiAke2Vycm9yLm1lc3NhZ2V9YCkpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8g5pat5byA6L+e5o6lXG4gICAgICBzb2NrZXQub24oJ2Rpc2Nvbm5lY3QnLCAocmVhc29uOiBzdHJpbmcpID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcignW1NvY2tldE1hbmFnZXJdIFNvY2tldC5JTyDov57mjqXmlq3lvIA6JywgcmVhc29uKTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyDph43ov57miJDlip9cbiAgICAgIHNvY2tldC5vbigncmVjb25uZWN0JywgKGF0dGVtcHROdW1iZXI6IG51bWJlcikgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdbU29ja2V0TWFuYWdlcl0gU29ja2V0LklPIOmHjei/nuaIkOWKn++8jOWwneivleasoeaVsDonLCBhdHRlbXB0TnVtYmVyKTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyDorr7nva7ov57mjqXotoXml7ZcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBpZiAoIXNvY2tldC5jb25uZWN0ZWQpIHtcbiAgICAgICAgICBzb2NrZXQuY2xvc2UoKTtcbiAgICAgICAgICByZWplY3QobmV3IEVycm9yKCdTb2NrZXQuSU8g6L+e5o6l6LaF5pe2JykpO1xuICAgICAgICB9XG4gICAgICB9LCAxNTAwMCk7IC8vIDE156eS6LaF5pe2XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICog5pat5byAIFNvY2tldCDov57mjqVcbiAgICog6YCa5bi45LiN6ZyA6KaB6LCD55So77yM6Zmk6Z2e6KaB5a6M5YWo5YWz6Zet6L+e5o6lXG4gICAqL1xuICBwdWJsaWMgZGlzY29ubmVjdCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zb2NrZXQpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1tTb2NrZXRNYW5hZ2VyXSDmlq3lvIAgU29ja2V0LklPIOi/nuaOpScpO1xuICAgICAgdGhpcy5zb2NrZXQuZGlzY29ubmVjdCgpO1xuICAgICAgdGhpcy5zb2NrZXQgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5blvZPliY0gU29ja2V0IOWunuS+i++8iOWPr+iDveS4uiBudWxs77yJXG4gICAqL1xuICBwdWJsaWMgZ2V0Q3VycmVudFNvY2tldCgpOiBTb2NrZXQgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5zb2NrZXQ7XG4gIH1cblxuICAvKipcbiAgICog5qOA5p+l5piv5ZCm5bey6L+e5o6lXG4gICAqL1xuICBwdWJsaWMgaXNDb25uZWN0ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc29ja2V0ICE9PSBudWxsICYmIHRoaXMuc29ja2V0LmNvbm5lY3RlZDtcbiAgfVxufVxuXG4vLyDlr7zlh7rljZXkvovlrp7kvotcbmV4cG9ydCBjb25zdCBzb2NrZXRNYW5hZ2VyID0gU29ja2V0TWFuYWdlci5nZXRJbnN0YW5jZSgpOyAiXX0=