Domain app.xtradingai.com
United States
AMAZON-02
Software information

Vercel

tcp/443 tcp/80

  • MacOS file listing through .DS_Store file
    First seen 2025-11-04 06:10
    Last seen 2026-01-04 02:58
    Open for 60 days
  • Open service 216.150.1.129:443 · app.xtradingai.com

    2026-01-12 02:37

    HTTP/1.1 200 OK
    Accept-Ranges: bytes
    Access-Control-Allow-Origin: *
    Age: 2
    Cache-Control: public, max-age=0, must-revalidate
    Content-Disposition: inline
    Content-Length: 4193
    Content-Type: text/html; charset=utf-8
    Date: Mon, 12 Jan 2026 02:37:40 GMT
    Etag: "41e87517802e5eba4b5a69bec8c0f239"
    Last-Modified: Mon, 12 Jan 2026 02:37:37 GMT
    Server: Vercel
    Strict-Transport-Security: max-age=63072000
    X-Vercel-Cache: HIT
    X-Vercel-Id: fra1::bgvbc-1768185459885-45a9243d5747
    Connection: close
    
    Page title: XtradingAI
    
    <!doctype html>
    <html lang="en">
    	<head>
    		<meta charset="UTF-8" />
    		<link rel="icon" type="image/svg+xml" href="/logo.jpg" />
    		<meta name="generator" content="Hostinger Horizons" />
    		<meta name="viewport" content="width=device-width, initial-scale=1.0" />
    		<title>XtradingAI</title>
    		<script type="module" crossorigin src="/assets/index-83847eac.js"></script>
    		<link rel="stylesheet" href="/assets/index-19f9504f.css">
    		<script type="module">
    window.onerror = (message, source, lineno, colno, errorObj) => {
    	const errorDetails = errorObj ? JSON.stringify({
    		name: errorObj.name,
    		message: errorObj.message,
    		stack: errorObj.stack,
    		source,
    		lineno,
    		colno,
    	}) : null;
    
    	window.parent.postMessage({
    		type: 'horizons-runtime-error',
    		message,
    		error: errorDetails
    	}, '*');
    };
    </script>
    		<script type="module">
    const observer = new MutationObserver((mutations) => {
    	for (const mutation of mutations) {
    		for (const addedNode of mutation.addedNodes) {
    			if (
    				addedNode.nodeType === Node.ELEMENT_NODE &&
    				(
    					addedNode.tagName?.toLowerCase() === 'vite-error-overlay' ||
    					addedNode.classList?.contains('backdrop')
    				)
    			) {
    				handleViteOverlay(addedNode);
    			}
    		}
    	}
    });
    
    observer.observe(document.documentElement, {
    	childList: true,
    	subtree: true
    });
    
    function handleViteOverlay(node) {
    	if (!node.shadowRoot) {
    		return;
    	}
    
    	const backdrop = node.shadowRoot.querySelector('.backdrop');
    
    	if (backdrop) {
    		const overlayHtml = backdrop.outerHTML;
    		const parser = new DOMParser();
    		const doc = parser.parseFromString(overlayHtml, 'text/html');
    		const messageBodyElement = doc.querySelector('.message-body');
    		const fileElement = doc.querySelector('.file');
    		const messageText = messageBodyElement ? messageBodyElement.textContent.trim() : '';
    		const fileText = fileElement ? fileElement.textContent.trim() : '';
    		const error = messageText + (fileText ? ' File:' + fileText : '');
    
    		window.parent.postMessage({
    			type: 'horizons-vite-error',
    			error,
    		}, '*');
    	}
    }
    </script>
    		<script type="module">
    const originalConsoleError = console.error;
    console.error = function(...args) {
    	originalConsoleError.apply(console, args);
    
    	let errorString = '';
    
    	for (let i = 0; i < args.length; i++) {
    		const arg = args[i];
    		if (arg instanceof Error) {
    			errorString = arg.stack || `${arg.name}: ${arg.message}`;
    			break;
    		}
    	}
    
    	if (!errorString) {
    		errorString = args.map(arg => typeof arg === 'object' ? JSON.stringify(arg) : String(arg)).join(' ');
    	}
    
    	window.parent.postMessage({
    		type: 'horizons-console-error',
    		error: errorString
    	}, '*');
    };
    </script>
    		<script type="module">
    const originalFetch = window.fetch;
    
    window.fetch = function(...args) {
    	const url = args[0] instanceof Request ? args[0].url : args[0];
    
    	// Skip WebSocket URLs
    	if (url.startsWith('ws:') || url.startsWith('wss:')) {
    		return originalFetch.apply(this, args);
    	}
    
    	return originalFetch.apply(this, args)
    		.then(async response => {
    			const contentType = response.headers.get('Content-Type') || '';
    
    			// Exclude HTML document responses
    			const isDocumentResponse =
    				contentType.includes('text/html') ||
    				contentType.includes('application/xhtml+xml');
    
    			if (!response.ok && !isDocumentResponse) {
    					const responseClone = response.clone();
    					const errorFromRes = await responseClone.text();
    					const requestUrl = response.url;
    					console.error(`Fetch error from ${requestUrl}: ${errorFromRes}`);
    			}
    
    			return response;
    		})
    		.catch(error => {
    			if (!url.match(/.html?$/i)) {
    				console.error(error);
    			}
    
    			throw error;
    		});
    };
    </script>
    		<script type="module">
    if (window.navigation && window.self !== window.top) {
    	window.navigation.addEventListener('navigate', (event) => {
    		const url = event.destination.url;
    
    		try {
    			const destinationUrl = new URL(url);
    			const destinationOrigin = destinationUrl.origin;
    			const currentOrigin = window.location.origin;
    
    			if (destinationOrigin === currentOrigin) {
    				return;
    			}
    		} catch (error) {
    			return;
    		}
    
    		window.parent.postMessage({
    			type: 'horizons-navigation-error',
    
    Found 13 hours ago by HttpPlugin
    Create report
  • Open service 216.150.1.129:80 · app.xtradingai.com

    2026-01-12 02:37

    HTTP/1.0 308 Permanent Redirect
    Content-Type: text/plain
    Location: https://app.xtradingai.com/
    Refresh: 0;url=https://app.xtradingai.com/
    server: Vercel
    
    
    Redirecting...
    Found 13 hours ago by HttpPlugin
    Create report
  • Open service 216.150.16.129:443 · app.xtradingai.com

    2026-01-12 02:37

    HTTP/1.1 200 OK
    Accept-Ranges: bytes
    Access-Control-Allow-Origin: *
    Age: 94935
    Cache-Control: public, max-age=0, must-revalidate
    Content-Disposition: inline
    Content-Length: 4193
    Content-Type: text/html; charset=utf-8
    Date: Mon, 12 Jan 2026 02:37:39 GMT
    Etag: "41e87517802e5eba4b5a69bec8c0f239"
    Last-Modified: Sun, 11 Jan 2026 00:15:24 GMT
    Server: Vercel
    Strict-Transport-Security: max-age=63072000
    X-Vercel-Cache: HIT
    X-Vercel-Id: iad1::8dhbl-1768185459679-cbdbb2cb16e4
    Connection: close
    
    Page title: XtradingAI
    
    <!doctype html>
    <html lang="en">
    	<head>
    		<meta charset="UTF-8" />
    		<link rel="icon" type="image/svg+xml" href="/logo.jpg" />
    		<meta name="generator" content="Hostinger Horizons" />
    		<meta name="viewport" content="width=device-width, initial-scale=1.0" />
    		<title>XtradingAI</title>
    		<script type="module" crossorigin src="/assets/index-83847eac.js"></script>
    		<link rel="stylesheet" href="/assets/index-19f9504f.css">
    		<script type="module">
    window.onerror = (message, source, lineno, colno, errorObj) => {
    	const errorDetails = errorObj ? JSON.stringify({
    		name: errorObj.name,
    		message: errorObj.message,
    		stack: errorObj.stack,
    		source,
    		lineno,
    		colno,
    	}) : null;
    
    	window.parent.postMessage({
    		type: 'horizons-runtime-error',
    		message,
    		error: errorDetails
    	}, '*');
    };
    </script>
    		<script type="module">
    const observer = new MutationObserver((mutations) => {
    	for (const mutation of mutations) {
    		for (const addedNode of mutation.addedNodes) {
    			if (
    				addedNode.nodeType === Node.ELEMENT_NODE &&
    				(
    					addedNode.tagName?.toLowerCase() === 'vite-error-overlay' ||
    					addedNode.classList?.contains('backdrop')
    				)
    			) {
    				handleViteOverlay(addedNode);
    			}
    		}
    	}
    });
    
    observer.observe(document.documentElement, {
    	childList: true,
    	subtree: true
    });
    
    function handleViteOverlay(node) {
    	if (!node.shadowRoot) {
    		return;
    	}
    
    	const backdrop = node.shadowRoot.querySelector('.backdrop');
    
    	if (backdrop) {
    		const overlayHtml = backdrop.outerHTML;
    		const parser = new DOMParser();
    		const doc = parser.parseFromString(overlayHtml, 'text/html');
    		const messageBodyElement = doc.querySelector('.message-body');
    		const fileElement = doc.querySelector('.file');
    		const messageText = messageBodyElement ? messageBodyElement.textContent.trim() : '';
    		const fileText = fileElement ? fileElement.textContent.trim() : '';
    		const error = messageText + (fileText ? ' File:' + fileText : '');
    
    		window.parent.postMessage({
    			type: 'horizons-vite-error',
    			error,
    		}, '*');
    	}
    }
    </script>
    		<script type="module">
    const originalConsoleError = console.error;
    console.error = function(...args) {
    	originalConsoleError.apply(console, args);
    
    	let errorString = '';
    
    	for (let i = 0; i < args.length; i++) {
    		const arg = args[i];
    		if (arg instanceof Error) {
    			errorString = arg.stack || `${arg.name}: ${arg.message}`;
    			break;
    		}
    	}
    
    	if (!errorString) {
    		errorString = args.map(arg => typeof arg === 'object' ? JSON.stringify(arg) : String(arg)).join(' ');
    	}
    
    	window.parent.postMessage({
    		type: 'horizons-console-error',
    		error: errorString
    	}, '*');
    };
    </script>
    		<script type="module">
    const originalFetch = window.fetch;
    
    window.fetch = function(...args) {
    	const url = args[0] instanceof Request ? args[0].url : args[0];
    
    	// Skip WebSocket URLs
    	if (url.startsWith('ws:') || url.startsWith('wss:')) {
    		return originalFetch.apply(this, args);
    	}
    
    	return originalFetch.apply(this, args)
    		.then(async response => {
    			const contentType = response.headers.get('Content-Type') || '';
    
    			// Exclude HTML document responses
    			const isDocumentResponse =
    				contentType.includes('text/html') ||
    				contentType.includes('application/xhtml+xml');
    
    			if (!response.ok && !isDocumentResponse) {
    					const responseClone = response.clone();
    					const errorFromRes = await responseClone.text();
    					const requestUrl = response.url;
    					console.error(`Fetch error from ${requestUrl}: ${errorFromRes}`);
    			}
    
    			return response;
    		})
    		.catch(error => {
    			if (!url.match(/.html?$/i)) {
    				console.error(error);
    			}
    
    			throw error;
    		});
    };
    </script>
    		<script type="module">
    if (window.navigation && window.self !== window.top) {
    	window.navigation.addEventListener('navigate', (event) => {
    		const url = event.destination.url;
    
    		try {
    			const destinationUrl = new URL(url);
    			const destinationOrigin = destinationUrl.origin;
    			const currentOrigin = window.location.origin;
    
    			if (destinationOrigin === currentOrigin) {
    				return;
    			}
    		} catch (error) {
    			return;
    		}
    
    		window.parent.postMessage({
    			type: 'horizons-navigation-error',
    
    Found 13 hours ago by HttpPlugin
    Create report
  • Open service 216.150.16.129:80 · app.xtradingai.com

    2026-01-12 02:37

    HTTP/1.0 308 Permanent Redirect
    Content-Type: text/plain
    Location: https://app.xtradingai.com/
    Refresh: 0;url=https://app.xtradingai.com/
    server: Vercel
    
    
    Redirecting...
    Found 13 hours ago by HttpPlugin
    Create report
  • Open service 64.29.17.65:443 · app.xtradingai.com

    2026-01-09 19:33

    HTTP/1.1 200 OK
    Accept-Ranges: bytes
    Access-Control-Allow-Origin: *
    Age: 2
    Cache-Control: public, max-age=0, must-revalidate
    Content-Disposition: inline
    Content-Length: 4193
    Content-Type: text/html; charset=utf-8
    Date: Fri, 09 Jan 2026 19:33:35 GMT
    Etag: "a0d77959d2a81fbd59a63d85e9fefab6"
    Last-Modified: Fri, 09 Jan 2026 19:33:33 GMT
    Server: Vercel
    Strict-Transport-Security: max-age=63072000
    X-Vercel-Cache: HIT
    X-Vercel-Id: sin1::ftnf6-1767987215157-93bca5b24458
    Connection: close
    
    Page title: XtradingAI
    
    <!doctype html>
    <html lang="en">
    	<head>
    		<meta charset="UTF-8" />
    		<link rel="icon" type="image/svg+xml" href="/logo.jpg" />
    		<meta name="generator" content="Hostinger Horizons" />
    		<meta name="viewport" content="width=device-width, initial-scale=1.0" />
    		<title>XtradingAI</title>
    		<script type="module" crossorigin src="/assets/index-e548f26f.js"></script>
    		<link rel="stylesheet" href="/assets/index-19f9504f.css">
    		<script type="module">
    window.onerror = (message, source, lineno, colno, errorObj) => {
    	const errorDetails = errorObj ? JSON.stringify({
    		name: errorObj.name,
    		message: errorObj.message,
    		stack: errorObj.stack,
    		source,
    		lineno,
    		colno,
    	}) : null;
    
    	window.parent.postMessage({
    		type: 'horizons-runtime-error',
    		message,
    		error: errorDetails
    	}, '*');
    };
    </script>
    		<script type="module">
    const observer = new MutationObserver((mutations) => {
    	for (const mutation of mutations) {
    		for (const addedNode of mutation.addedNodes) {
    			if (
    				addedNode.nodeType === Node.ELEMENT_NODE &&
    				(
    					addedNode.tagName?.toLowerCase() === 'vite-error-overlay' ||
    					addedNode.classList?.contains('backdrop')
    				)
    			) {
    				handleViteOverlay(addedNode);
    			}
    		}
    	}
    });
    
    observer.observe(document.documentElement, {
    	childList: true,
    	subtree: true
    });
    
    function handleViteOverlay(node) {
    	if (!node.shadowRoot) {
    		return;
    	}
    
    	const backdrop = node.shadowRoot.querySelector('.backdrop');
    
    	if (backdrop) {
    		const overlayHtml = backdrop.outerHTML;
    		const parser = new DOMParser();
    		const doc = parser.parseFromString(overlayHtml, 'text/html');
    		const messageBodyElement = doc.querySelector('.message-body');
    		const fileElement = doc.querySelector('.file');
    		const messageText = messageBodyElement ? messageBodyElement.textContent.trim() : '';
    		const fileText = fileElement ? fileElement.textContent.trim() : '';
    		const error = messageText + (fileText ? ' File:' + fileText : '');
    
    		window.parent.postMessage({
    			type: 'horizons-vite-error',
    			error,
    		}, '*');
    	}
    }
    </script>
    		<script type="module">
    const originalConsoleError = console.error;
    console.error = function(...args) {
    	originalConsoleError.apply(console, args);
    
    	let errorString = '';
    
    	for (let i = 0; i < args.length; i++) {
    		const arg = args[i];
    		if (arg instanceof Error) {
    			errorString = arg.stack || `${arg.name}: ${arg.message}`;
    			break;
    		}
    	}
    
    	if (!errorString) {
    		errorString = args.map(arg => typeof arg === 'object' ? JSON.stringify(arg) : String(arg)).join(' ');
    	}
    
    	window.parent.postMessage({
    		type: 'horizons-console-error',
    		error: errorString
    	}, '*');
    };
    </script>
    		<script type="module">
    const originalFetch = window.fetch;
    
    window.fetch = function(...args) {
    	const url = args[0] instanceof Request ? args[0].url : args[0];
    
    	// Skip WebSocket URLs
    	if (url.startsWith('ws:') || url.startsWith('wss:')) {
    		return originalFetch.apply(this, args);
    	}
    
    	return originalFetch.apply(this, args)
    		.then(async response => {
    			const contentType = response.headers.get('Content-Type') || '';
    
    			// Exclude HTML document responses
    			const isDocumentResponse =
    				contentType.includes('text/html') ||
    				contentType.includes('application/xhtml+xml');
    
    			if (!response.ok && !isDocumentResponse) {
    					const responseClone = response.clone();
    					const errorFromRes = await responseClone.text();
    					const requestUrl = response.url;
    					console.error(`Fetch error from ${requestUrl}: ${errorFromRes}`);
    			}
    
    			return response;
    		})
    		.catch(error => {
    			if (!url.match(/.html?$/i)) {
    				console.error(error);
    			}
    
    			throw error;
    		});
    };
    </script>
    		<script type="module">
    if (window.navigation && window.self !== window.top) {
    	window.navigation.addEventListener('navigate', (event) => {
    		const url = event.destination.url;
    
    		try {
    			const destinationUrl = new URL(url);
    			const destinationOrigin = destinationUrl.origin;
    			const currentOrigin = window.location.origin;
    
    			if (destinationOrigin === currentOrigin) {
    				return;
    			}
    		} catch (error) {
    			return;
    		}
    
    		window.parent.postMessage({
    			type: 'horizons-navigation-error',
    
    Found 3 days ago by HttpPlugin
    Create report
  • Open service 216.150.1.65:80 · app.xtradingai.com

    2026-01-04 02:58

    HTTP/1.0 308 Permanent Redirect
    Content-Type: text/plain
    Location: https://app.xtradingai.com/
    Refresh: 0;url=https://app.xtradingai.com/
    server: Vercel
    
    
    Redirecting...
    Found 2026-01-04 by HttpPlugin
    Create report
  • Open service 216.150.1.65:443 · app.xtradingai.com

    2026-01-04 02:58

    HTTP/1.1 200 OK
    Accept-Ranges: bytes
    Access-Control-Allow-Origin: *
    Age: 115
    Cache-Control: public, max-age=0, must-revalidate
    Content-Disposition: inline
    Content-Length: 4193
    Content-Type: text/html; charset=utf-8
    Date: Sun, 04 Jan 2026 02:58:29 GMT
    Etag: "082f5f801f2970c6f79e767861293d46"
    Last-Modified: Sun, 04 Jan 2026 02:56:33 GMT
    Server: Vercel
    Strict-Transport-Security: max-age=63072000
    X-Vercel-Cache: HIT
    X-Vercel-Id: sin1::hqkbn-1767495509402-4cae99a37f99
    Connection: close
    
    Page title: XtradingAI
    
    <!doctype html>
    <html lang="en">
    	<head>
    		<meta charset="UTF-8" />
    		<link rel="icon" type="image/svg+xml" href="/logo.jpg" />
    		<meta name="generator" content="Hostinger Horizons" />
    		<meta name="viewport" content="width=device-width, initial-scale=1.0" />
    		<title>XtradingAI</title>
    		<script type="module" crossorigin src="/assets/index-475878ea.js"></script>
    		<link rel="stylesheet" href="/assets/index-391e9ce2.css">
    		<script type="module">
    window.onerror = (message, source, lineno, colno, errorObj) => {
    	const errorDetails = errorObj ? JSON.stringify({
    		name: errorObj.name,
    		message: errorObj.message,
    		stack: errorObj.stack,
    		source,
    		lineno,
    		colno,
    	}) : null;
    
    	window.parent.postMessage({
    		type: 'horizons-runtime-error',
    		message,
    		error: errorDetails
    	}, '*');
    };
    </script>
    		<script type="module">
    const observer = new MutationObserver((mutations) => {
    	for (const mutation of mutations) {
    		for (const addedNode of mutation.addedNodes) {
    			if (
    				addedNode.nodeType === Node.ELEMENT_NODE &&
    				(
    					addedNode.tagName?.toLowerCase() === 'vite-error-overlay' ||
    					addedNode.classList?.contains('backdrop')
    				)
    			) {
    				handleViteOverlay(addedNode);
    			}
    		}
    	}
    });
    
    observer.observe(document.documentElement, {
    	childList: true,
    	subtree: true
    });
    
    function handleViteOverlay(node) {
    	if (!node.shadowRoot) {
    		return;
    	}
    
    	const backdrop = node.shadowRoot.querySelector('.backdrop');
    
    	if (backdrop) {
    		const overlayHtml = backdrop.outerHTML;
    		const parser = new DOMParser();
    		const doc = parser.parseFromString(overlayHtml, 'text/html');
    		const messageBodyElement = doc.querySelector('.message-body');
    		const fileElement = doc.querySelector('.file');
    		const messageText = messageBodyElement ? messageBodyElement.textContent.trim() : '';
    		const fileText = fileElement ? fileElement.textContent.trim() : '';
    		const error = messageText + (fileText ? ' File:' + fileText : '');
    
    		window.parent.postMessage({
    			type: 'horizons-vite-error',
    			error,
    		}, '*');
    	}
    }
    </script>
    		<script type="module">
    const originalConsoleError = console.error;
    console.error = function(...args) {
    	originalConsoleError.apply(console, args);
    
    	let errorString = '';
    
    	for (let i = 0; i < args.length; i++) {
    		const arg = args[i];
    		if (arg instanceof Error) {
    			errorString = arg.stack || `${arg.name}: ${arg.message}`;
    			break;
    		}
    	}
    
    	if (!errorString) {
    		errorString = args.map(arg => typeof arg === 'object' ? JSON.stringify(arg) : String(arg)).join(' ');
    	}
    
    	window.parent.postMessage({
    		type: 'horizons-console-error',
    		error: errorString
    	}, '*');
    };
    </script>
    		<script type="module">
    const originalFetch = window.fetch;
    
    window.fetch = function(...args) {
    	const url = args[0] instanceof Request ? args[0].url : args[0];
    
    	// Skip WebSocket URLs
    	if (url.startsWith('ws:') || url.startsWith('wss:')) {
    		return originalFetch.apply(this, args);
    	}
    
    	return originalFetch.apply(this, args)
    		.then(async response => {
    			const contentType = response.headers.get('Content-Type') || '';
    
    			// Exclude HTML document responses
    			const isDocumentResponse =
    				contentType.includes('text/html') ||
    				contentType.includes('application/xhtml+xml');
    
    			if (!response.ok && !isDocumentResponse) {
    					const responseClone = response.clone();
    					const errorFromRes = await responseClone.text();
    					const requestUrl = response.url;
    					console.error(`Fetch error from ${requestUrl}: ${errorFromRes}`);
    			}
    
    			return response;
    		})
    		.catch(error => {
    			if (!url.match(/.html?$/i)) {
    				console.error(error);
    			}
    
    			throw error;
    		});
    };
    </script>
    		<script type="module">
    if (window.navigation && window.self !== window.top) {
    	window.navigation.addEventListener('navigate', (event) => {
    		const url = event.destination.url;
    
    		try {
    			const destinationUrl = new URL(url);
    			const destinationOrigin = destinationUrl.origin;
    			const currentOrigin = window.location.origin;
    
    			if (destinationOrigin === currentOrigin) {
    				return;
    			}
    		} catch (error) {
    			return;
    		}
    
    		window.parent.postMessage({
    			type: 'horizons-navigation-error',
    
    Found 2026-01-04 by HttpPlugin
    Create report
  • Open service 216.150.16.65:443 · app.xtradingai.com

    2026-01-04 02:58

    HTTP/1.1 200 OK
    Accept-Ranges: bytes
    Access-Control-Allow-Origin: *
    Age: 0
    Cache-Control: public, max-age=0, must-revalidate
    Content-Disposition: inline
    Content-Length: 4193
    Content-Type: text/html; charset=utf-8
    Date: Sun, 04 Jan 2026 02:58:29 GMT
    Etag: "082f5f801f2970c6f79e767861293d46"
    Last-Modified: Sun, 04 Jan 2026 02:58:29 GMT
    Server: Vercel
    Strict-Transport-Security: max-age=63072000
    X-Vercel-Cache: HIT
    X-Vercel-Id: lhr1::jcz85-1767495509536-5181b45cc990
    Connection: close
    
    Page title: XtradingAI
    
    <!doctype html>
    <html lang="en">
    	<head>
    		<meta charset="UTF-8" />
    		<link rel="icon" type="image/svg+xml" href="/logo.jpg" />
    		<meta name="generator" content="Hostinger Horizons" />
    		<meta name="viewport" content="width=device-width, initial-scale=1.0" />
    		<title>XtradingAI</title>
    		<script type="module" crossorigin src="/assets/index-475878ea.js"></script>
    		<link rel="stylesheet" href="/assets/index-391e9ce2.css">
    		<script type="module">
    window.onerror = (message, source, lineno, colno, errorObj) => {
    	const errorDetails = errorObj ? JSON.stringify({
    		name: errorObj.name,
    		message: errorObj.message,
    		stack: errorObj.stack,
    		source,
    		lineno,
    		colno,
    	}) : null;
    
    	window.parent.postMessage({
    		type: 'horizons-runtime-error',
    		message,
    		error: errorDetails
    	}, '*');
    };
    </script>
    		<script type="module">
    const observer = new MutationObserver((mutations) => {
    	for (const mutation of mutations) {
    		for (const addedNode of mutation.addedNodes) {
    			if (
    				addedNode.nodeType === Node.ELEMENT_NODE &&
    				(
    					addedNode.tagName?.toLowerCase() === 'vite-error-overlay' ||
    					addedNode.classList?.contains('backdrop')
    				)
    			) {
    				handleViteOverlay(addedNode);
    			}
    		}
    	}
    });
    
    observer.observe(document.documentElement, {
    	childList: true,
    	subtree: true
    });
    
    function handleViteOverlay(node) {
    	if (!node.shadowRoot) {
    		return;
    	}
    
    	const backdrop = node.shadowRoot.querySelector('.backdrop');
    
    	if (backdrop) {
    		const overlayHtml = backdrop.outerHTML;
    		const parser = new DOMParser();
    		const doc = parser.parseFromString(overlayHtml, 'text/html');
    		const messageBodyElement = doc.querySelector('.message-body');
    		const fileElement = doc.querySelector('.file');
    		const messageText = messageBodyElement ? messageBodyElement.textContent.trim() : '';
    		const fileText = fileElement ? fileElement.textContent.trim() : '';
    		const error = messageText + (fileText ? ' File:' + fileText : '');
    
    		window.parent.postMessage({
    			type: 'horizons-vite-error',
    			error,
    		}, '*');
    	}
    }
    </script>
    		<script type="module">
    const originalConsoleError = console.error;
    console.error = function(...args) {
    	originalConsoleError.apply(console, args);
    
    	let errorString = '';
    
    	for (let i = 0; i < args.length; i++) {
    		const arg = args[i];
    		if (arg instanceof Error) {
    			errorString = arg.stack || `${arg.name}: ${arg.message}`;
    			break;
    		}
    	}
    
    	if (!errorString) {
    		errorString = args.map(arg => typeof arg === 'object' ? JSON.stringify(arg) : String(arg)).join(' ');
    	}
    
    	window.parent.postMessage({
    		type: 'horizons-console-error',
    		error: errorString
    	}, '*');
    };
    </script>
    		<script type="module">
    const originalFetch = window.fetch;
    
    window.fetch = function(...args) {
    	const url = args[0] instanceof Request ? args[0].url : args[0];
    
    	// Skip WebSocket URLs
    	if (url.startsWith('ws:') || url.startsWith('wss:')) {
    		return originalFetch.apply(this, args);
    	}
    
    	return originalFetch.apply(this, args)
    		.then(async response => {
    			const contentType = response.headers.get('Content-Type') || '';
    
    			// Exclude HTML document responses
    			const isDocumentResponse =
    				contentType.includes('text/html') ||
    				contentType.includes('application/xhtml+xml');
    
    			if (!response.ok && !isDocumentResponse) {
    					const responseClone = response.clone();
    					const errorFromRes = await responseClone.text();
    					const requestUrl = response.url;
    					console.error(`Fetch error from ${requestUrl}: ${errorFromRes}`);
    			}
    
    			return response;
    		})
    		.catch(error => {
    			if (!url.match(/.html?$/i)) {
    				console.error(error);
    			}
    
    			throw error;
    		});
    };
    </script>
    		<script type="module">
    if (window.navigation && window.self !== window.top) {
    	window.navigation.addEventListener('navigate', (event) => {
    		const url = event.destination.url;
    
    		try {
    			const destinationUrl = new URL(url);
    			const destinationOrigin = destinationUrl.origin;
    			const currentOrigin = window.location.origin;
    
    			if (destinationOrigin === currentOrigin) {
    				return;
    			}
    		} catch (error) {
    			return;
    		}
    
    		window.parent.postMessage({
    			type: 'horizons-navigation-error',
    
    Found 2026-01-04 by HttpPlugin
    Create report
  • Open service 216.150.16.65:80 · app.xtradingai.com

    2026-01-04 02:58

    HTTP/1.0 308 Permanent Redirect
    Content-Type: text/plain
    Location: https://app.xtradingai.com/
    Refresh: 0;url=https://app.xtradingai.com/
    server: Vercel
    
    
    Redirecting...
    Found 2026-01-04 by HttpPlugin
    Create report
  • Open service 64.29.17.65:443 · app.xtradingai.com

    2026-01-02 18:20

    HTTP/1.1 200 OK
    Accept-Ranges: bytes
    Access-Control-Allow-Origin: *
    Age: 0
    Cache-Control: public, max-age=0, must-revalidate
    Content-Disposition: inline
    Content-Length: 4193
    Content-Type: text/html; charset=utf-8
    Date: Fri, 02 Jan 2026 18:20:30 GMT
    Etag: "ca74779330222e6a49054f24a04a3150"
    Last-Modified: Fri, 02 Jan 2026 18:20:30 GMT
    Server: Vercel
    Strict-Transport-Security: max-age=63072000
    X-Vercel-Cache: HIT
    X-Vercel-Id: fra1::qzzwl-1767378030386-6a7745854048
    Connection: close
    
    Page title: XtradingAI
    
    <!doctype html>
    <html lang="en">
    	<head>
    		<meta charset="UTF-8" />
    		<link rel="icon" type="image/svg+xml" href="/logo.jpg" />
    		<meta name="generator" content="Hostinger Horizons" />
    		<meta name="viewport" content="width=device-width, initial-scale=1.0" />
    		<title>XtradingAI</title>
    		<script type="module" crossorigin src="/assets/index-92e45eaa.js"></script>
    		<link rel="stylesheet" href="/assets/index-391e9ce2.css">
    		<script type="module">
    window.onerror = (message, source, lineno, colno, errorObj) => {
    	const errorDetails = errorObj ? JSON.stringify({
    		name: errorObj.name,
    		message: errorObj.message,
    		stack: errorObj.stack,
    		source,
    		lineno,
    		colno,
    	}) : null;
    
    	window.parent.postMessage({
    		type: 'horizons-runtime-error',
    		message,
    		error: errorDetails
    	}, '*');
    };
    </script>
    		<script type="module">
    const observer = new MutationObserver((mutations) => {
    	for (const mutation of mutations) {
    		for (const addedNode of mutation.addedNodes) {
    			if (
    				addedNode.nodeType === Node.ELEMENT_NODE &&
    				(
    					addedNode.tagName?.toLowerCase() === 'vite-error-overlay' ||
    					addedNode.classList?.contains('backdrop')
    				)
    			) {
    				handleViteOverlay(addedNode);
    			}
    		}
    	}
    });
    
    observer.observe(document.documentElement, {
    	childList: true,
    	subtree: true
    });
    
    function handleViteOverlay(node) {
    	if (!node.shadowRoot) {
    		return;
    	}
    
    	const backdrop = node.shadowRoot.querySelector('.backdrop');
    
    	if (backdrop) {
    		const overlayHtml = backdrop.outerHTML;
    		const parser = new DOMParser();
    		const doc = parser.parseFromString(overlayHtml, 'text/html');
    		const messageBodyElement = doc.querySelector('.message-body');
    		const fileElement = doc.querySelector('.file');
    		const messageText = messageBodyElement ? messageBodyElement.textContent.trim() : '';
    		const fileText = fileElement ? fileElement.textContent.trim() : '';
    		const error = messageText + (fileText ? ' File:' + fileText : '');
    
    		window.parent.postMessage({
    			type: 'horizons-vite-error',
    			error,
    		}, '*');
    	}
    }
    </script>
    		<script type="module">
    const originalConsoleError = console.error;
    console.error = function(...args) {
    	originalConsoleError.apply(console, args);
    
    	let errorString = '';
    
    	for (let i = 0; i < args.length; i++) {
    		const arg = args[i];
    		if (arg instanceof Error) {
    			errorString = arg.stack || `${arg.name}: ${arg.message}`;
    			break;
    		}
    	}
    
    	if (!errorString) {
    		errorString = args.map(arg => typeof arg === 'object' ? JSON.stringify(arg) : String(arg)).join(' ');
    	}
    
    	window.parent.postMessage({
    		type: 'horizons-console-error',
    		error: errorString
    	}, '*');
    };
    </script>
    		<script type="module">
    const originalFetch = window.fetch;
    
    window.fetch = function(...args) {
    	const url = args[0] instanceof Request ? args[0].url : args[0];
    
    	// Skip WebSocket URLs
    	if (url.startsWith('ws:') || url.startsWith('wss:')) {
    		return originalFetch.apply(this, args);
    	}
    
    	return originalFetch.apply(this, args)
    		.then(async response => {
    			const contentType = response.headers.get('Content-Type') || '';
    
    			// Exclude HTML document responses
    			const isDocumentResponse =
    				contentType.includes('text/html') ||
    				contentType.includes('application/xhtml+xml');
    
    			if (!response.ok && !isDocumentResponse) {
    					const responseClone = response.clone();
    					const errorFromRes = await responseClone.text();
    					const requestUrl = response.url;
    					console.error(`Fetch error from ${requestUrl}: ${errorFromRes}`);
    			}
    
    			return response;
    		})
    		.catch(error => {
    			if (!url.match(/.html?$/i)) {
    				console.error(error);
    			}
    
    			throw error;
    		});
    };
    </script>
    		<script type="module">
    if (window.navigation && window.self !== window.top) {
    	window.navigation.addEventListener('navigate', (event) => {
    		const url = event.destination.url;
    
    		try {
    			const destinationUrl = new URL(url);
    			const destinationOrigin = destinationUrl.origin;
    			const currentOrigin = window.location.origin;
    
    			if (destinationOrigin === currentOrigin) {
    				return;
    			}
    		} catch (error) {
    			return;
    		}
    
    		window.parent.postMessage({
    			type: 'horizons-navigation-error',
    
    Found 2026-01-02 by HttpPlugin
    Create report
  • Open service 64.29.17.65:443 · app.xtradingai.com

    2025-12-25 05:37

    HTTP/1.1 200 OK
    Accept-Ranges: bytes
    Access-Control-Allow-Origin: *
    Age: 86024
    Cache-Control: public, max-age=0, must-revalidate
    Content-Disposition: inline
    Content-Length: 4193
    Content-Type: text/html; charset=utf-8
    Date: Thu, 25 Dec 2025 05:37:42 GMT
    Etag: "aa6edc72453d36538a2012679a0c95d9"
    Last-Modified: Wed, 24 Dec 2025 05:43:58 GMT
    Server: Vercel
    Strict-Transport-Security: max-age=63072000
    X-Vercel-Cache: HIT
    X-Vercel-Id: bom1::c8gp8-1766641062140-84abafa3b9c4
    Connection: close
    
    Page title: XtradingAI
    
    <!doctype html>
    <html lang="en">
    	<head>
    		<meta charset="UTF-8" />
    		<link rel="icon" type="image/svg+xml" href="/logo.jpg" />
    		<meta name="generator" content="Hostinger Horizons" />
    		<meta name="viewport" content="width=device-width, initial-scale=1.0" />
    		<title>XtradingAI</title>
    		<script type="module" crossorigin src="/assets/index-e4db0bff.js"></script>
    		<link rel="stylesheet" href="/assets/index-9be720c2.css">
    		<script type="module">
    window.onerror = (message, source, lineno, colno, errorObj) => {
    	const errorDetails = errorObj ? JSON.stringify({
    		name: errorObj.name,
    		message: errorObj.message,
    		stack: errorObj.stack,
    		source,
    		lineno,
    		colno,
    	}) : null;
    
    	window.parent.postMessage({
    		type: 'horizons-runtime-error',
    		message,
    		error: errorDetails
    	}, '*');
    };
    </script>
    		<script type="module">
    const observer = new MutationObserver((mutations) => {
    	for (const mutation of mutations) {
    		for (const addedNode of mutation.addedNodes) {
    			if (
    				addedNode.nodeType === Node.ELEMENT_NODE &&
    				(
    					addedNode.tagName?.toLowerCase() === 'vite-error-overlay' ||
    					addedNode.classList?.contains('backdrop')
    				)
    			) {
    				handleViteOverlay(addedNode);
    			}
    		}
    	}
    });
    
    observer.observe(document.documentElement, {
    	childList: true,
    	subtree: true
    });
    
    function handleViteOverlay(node) {
    	if (!node.shadowRoot) {
    		return;
    	}
    
    	const backdrop = node.shadowRoot.querySelector('.backdrop');
    
    	if (backdrop) {
    		const overlayHtml = backdrop.outerHTML;
    		const parser = new DOMParser();
    		const doc = parser.parseFromString(overlayHtml, 'text/html');
    		const messageBodyElement = doc.querySelector('.message-body');
    		const fileElement = doc.querySelector('.file');
    		const messageText = messageBodyElement ? messageBodyElement.textContent.trim() : '';
    		const fileText = fileElement ? fileElement.textContent.trim() : '';
    		const error = messageText + (fileText ? ' File:' + fileText : '');
    
    		window.parent.postMessage({
    			type: 'horizons-vite-error',
    			error,
    		}, '*');
    	}
    }
    </script>
    		<script type="module">
    const originalConsoleError = console.error;
    console.error = function(...args) {
    	originalConsoleError.apply(console, args);
    
    	let errorString = '';
    
    	for (let i = 0; i < args.length; i++) {
    		const arg = args[i];
    		if (arg instanceof Error) {
    			errorString = arg.stack || `${arg.name}: ${arg.message}`;
    			break;
    		}
    	}
    
    	if (!errorString) {
    		errorString = args.map(arg => typeof arg === 'object' ? JSON.stringify(arg) : String(arg)).join(' ');
    	}
    
    	window.parent.postMessage({
    		type: 'horizons-console-error',
    		error: errorString
    	}, '*');
    };
    </script>
    		<script type="module">
    const originalFetch = window.fetch;
    
    window.fetch = function(...args) {
    	const url = args[0] instanceof Request ? args[0].url : args[0];
    
    	// Skip WebSocket URLs
    	if (url.startsWith('ws:') || url.startsWith('wss:')) {
    		return originalFetch.apply(this, args);
    	}
    
    	return originalFetch.apply(this, args)
    		.then(async response => {
    			const contentType = response.headers.get('Content-Type') || '';
    
    			// Exclude HTML document responses
    			const isDocumentResponse =
    				contentType.includes('text/html') ||
    				contentType.includes('application/xhtml+xml');
    
    			if (!response.ok && !isDocumentResponse) {
    					const responseClone = response.clone();
    					const errorFromRes = await responseClone.text();
    					const requestUrl = response.url;
    					console.error(`Fetch error from ${requestUrl}: ${errorFromRes}`);
    			}
    
    			return response;
    		})
    		.catch(error => {
    			if (!url.match(/.html?$/i)) {
    				console.error(error);
    			}
    
    			throw error;
    		});
    };
    </script>
    		<script type="module">
    if (window.navigation && window.self !== window.top) {
    	window.navigation.addEventListener('navigate', (event) => {
    		const url = event.destination.url;
    
    		try {
    			const destinationUrl = new URL(url);
    			const destinationOrigin = destinationUrl.origin;
    			const currentOrigin = window.location.origin;
    
    			if (destinationOrigin === currentOrigin) {
    				return;
    			}
    		} catch (error) {
    			return;
    		}
    
    		window.parent.postMessage({
    			type: 'horizons-navigation-error',
    
    Found 2025-12-25 by HttpPlugin
    Create report
  • Open service 64.29.17.65:443 · app.xtradingai.com

    2025-12-22 17:39

    HTTP/1.1 200 OK
    Accept-Ranges: bytes
    Access-Control-Allow-Origin: *
    Age: 0
    Cache-Control: public, max-age=0, must-revalidate
    Content-Disposition: inline
    Content-Length: 4193
    Content-Type: text/html; charset=utf-8
    Date: Mon, 22 Dec 2025 17:39:54 GMT
    Etag: "eb0e7fb72f10a27ffdc88a54809ffcaa"
    Last-Modified: Mon, 22 Dec 2025 17:39:54 GMT
    Server: Vercel
    Strict-Transport-Security: max-age=63072000
    X-Vercel-Cache: HIT
    X-Vercel-Id: fra1::qnqs6-1766425194341-bf6ebed473a5
    Connection: close
    
    Page title: XtradingAI
    
    <!doctype html>
    <html lang="en">
    	<head>
    		<meta charset="UTF-8" />
    		<link rel="icon" type="image/svg+xml" href="/logo.jpg" />
    		<meta name="generator" content="Hostinger Horizons" />
    		<meta name="viewport" content="width=device-width, initial-scale=1.0" />
    		<title>XtradingAI</title>
    		<script type="module" crossorigin src="/assets/index-1a1ee868.js"></script>
    		<link rel="stylesheet" href="/assets/index-9be720c2.css">
    		<script type="module">
    window.onerror = (message, source, lineno, colno, errorObj) => {
    	const errorDetails = errorObj ? JSON.stringify({
    		name: errorObj.name,
    		message: errorObj.message,
    		stack: errorObj.stack,
    		source,
    		lineno,
    		colno,
    	}) : null;
    
    	window.parent.postMessage({
    		type: 'horizons-runtime-error',
    		message,
    		error: errorDetails
    	}, '*');
    };
    </script>
    		<script type="module">
    const observer = new MutationObserver((mutations) => {
    	for (const mutation of mutations) {
    		for (const addedNode of mutation.addedNodes) {
    			if (
    				addedNode.nodeType === Node.ELEMENT_NODE &&
    				(
    					addedNode.tagName?.toLowerCase() === 'vite-error-overlay' ||
    					addedNode.classList?.contains('backdrop')
    				)
    			) {
    				handleViteOverlay(addedNode);
    			}
    		}
    	}
    });
    
    observer.observe(document.documentElement, {
    	childList: true,
    	subtree: true
    });
    
    function handleViteOverlay(node) {
    	if (!node.shadowRoot) {
    		return;
    	}
    
    	const backdrop = node.shadowRoot.querySelector('.backdrop');
    
    	if (backdrop) {
    		const overlayHtml = backdrop.outerHTML;
    		const parser = new DOMParser();
    		const doc = parser.parseFromString(overlayHtml, 'text/html');
    		const messageBodyElement = doc.querySelector('.message-body');
    		const fileElement = doc.querySelector('.file');
    		const messageText = messageBodyElement ? messageBodyElement.textContent.trim() : '';
    		const fileText = fileElement ? fileElement.textContent.trim() : '';
    		const error = messageText + (fileText ? ' File:' + fileText : '');
    
    		window.parent.postMessage({
    			type: 'horizons-vite-error',
    			error,
    		}, '*');
    	}
    }
    </script>
    		<script type="module">
    const originalConsoleError = console.error;
    console.error = function(...args) {
    	originalConsoleError.apply(console, args);
    
    	let errorString = '';
    
    	for (let i = 0; i < args.length; i++) {
    		const arg = args[i];
    		if (arg instanceof Error) {
    			errorString = arg.stack || `${arg.name}: ${arg.message}`;
    			break;
    		}
    	}
    
    	if (!errorString) {
    		errorString = args.map(arg => typeof arg === 'object' ? JSON.stringify(arg) : String(arg)).join(' ');
    	}
    
    	window.parent.postMessage({
    		type: 'horizons-console-error',
    		error: errorString
    	}, '*');
    };
    </script>
    		<script type="module">
    const originalFetch = window.fetch;
    
    window.fetch = function(...args) {
    	const url = args[0] instanceof Request ? args[0].url : args[0];
    
    	// Skip WebSocket URLs
    	if (url.startsWith('ws:') || url.startsWith('wss:')) {
    		return originalFetch.apply(this, args);
    	}
    
    	return originalFetch.apply(this, args)
    		.then(async response => {
    			const contentType = response.headers.get('Content-Type') || '';
    
    			// Exclude HTML document responses
    			const isDocumentResponse =
    				contentType.includes('text/html') ||
    				contentType.includes('application/xhtml+xml');
    
    			if (!response.ok && !isDocumentResponse) {
    					const responseClone = response.clone();
    					const errorFromRes = await responseClone.text();
    					const requestUrl = response.url;
    					console.error(`Fetch error from ${requestUrl}: ${errorFromRes}`);
    			}
    
    			return response;
    		})
    		.catch(error => {
    			if (!url.match(/.html?$/i)) {
    				console.error(error);
    			}
    
    			throw error;
    		});
    };
    </script>
    		<script type="module">
    if (window.navigation && window.self !== window.top) {
    	window.navigation.addEventListener('navigate', (event) => {
    		const url = event.destination.url;
    
    		try {
    			const destinationUrl = new URL(url);
    			const destinationOrigin = destinationUrl.origin;
    			const currentOrigin = window.location.origin;
    
    			if (destinationOrigin === currentOrigin) {
    				return;
    			}
    		} catch (error) {
    			return;
    		}
    
    		window.parent.postMessage({
    			type: 'horizons-navigation-error',
    
    Found 2025-12-22 by HttpPlugin
    Create report
  • Open service 64.29.17.65:443 · app.xtradingai.com

    2025-12-20 21:09

    HTTP/1.1 200 OK
    Accept-Ranges: bytes
    Access-Control-Allow-Origin: *
    Age: 15741
    Cache-Control: public, max-age=0, must-revalidate
    Content-Disposition: inline
    Content-Length: 4193
    Content-Type: text/html; charset=utf-8
    Date: Sat, 20 Dec 2025 21:09:58 GMT
    Etag: "2645074a139ec0258fdab19a5415b892"
    Last-Modified: Sat, 20 Dec 2025 16:47:36 GMT
    Server: Vercel
    Strict-Transport-Security: max-age=63072000
    X-Vercel-Cache: HIT
    X-Vercel-Id: iad1::wbftg-1766264998102-692c9d07b50a
    Connection: close
    
    Page title: XtradingAI
    
    <!doctype html>
    <html lang="en">
    	<head>
    		<meta charset="UTF-8" />
    		<link rel="icon" type="image/svg+xml" href="/logo.jpg" />
    		<meta name="generator" content="Hostinger Horizons" />
    		<meta name="viewport" content="width=device-width, initial-scale=1.0" />
    		<title>XtradingAI</title>
    		<script type="module" crossorigin src="/assets/index-2bd8be13.js"></script>
    		<link rel="stylesheet" href="/assets/index-fc7d551d.css">
    		<script type="module">
    window.onerror = (message, source, lineno, colno, errorObj) => {
    	const errorDetails = errorObj ? JSON.stringify({
    		name: errorObj.name,
    		message: errorObj.message,
    		stack: errorObj.stack,
    		source,
    		lineno,
    		colno,
    	}) : null;
    
    	window.parent.postMessage({
    		type: 'horizons-runtime-error',
    		message,
    		error: errorDetails
    	}, '*');
    };
    </script>
    		<script type="module">
    const observer = new MutationObserver((mutations) => {
    	for (const mutation of mutations) {
    		for (const addedNode of mutation.addedNodes) {
    			if (
    				addedNode.nodeType === Node.ELEMENT_NODE &&
    				(
    					addedNode.tagName?.toLowerCase() === 'vite-error-overlay' ||
    					addedNode.classList?.contains('backdrop')
    				)
    			) {
    				handleViteOverlay(addedNode);
    			}
    		}
    	}
    });
    
    observer.observe(document.documentElement, {
    	childList: true,
    	subtree: true
    });
    
    function handleViteOverlay(node) {
    	if (!node.shadowRoot) {
    		return;
    	}
    
    	const backdrop = node.shadowRoot.querySelector('.backdrop');
    
    	if (backdrop) {
    		const overlayHtml = backdrop.outerHTML;
    		const parser = new DOMParser();
    		const doc = parser.parseFromString(overlayHtml, 'text/html');
    		const messageBodyElement = doc.querySelector('.message-body');
    		const fileElement = doc.querySelector('.file');
    		const messageText = messageBodyElement ? messageBodyElement.textContent.trim() : '';
    		const fileText = fileElement ? fileElement.textContent.trim() : '';
    		const error = messageText + (fileText ? ' File:' + fileText : '');
    
    		window.parent.postMessage({
    			type: 'horizons-vite-error',
    			error,
    		}, '*');
    	}
    }
    </script>
    		<script type="module">
    const originalConsoleError = console.error;
    console.error = function(...args) {
    	originalConsoleError.apply(console, args);
    
    	let errorString = '';
    
    	for (let i = 0; i < args.length; i++) {
    		const arg = args[i];
    		if (arg instanceof Error) {
    			errorString = arg.stack || `${arg.name}: ${arg.message}`;
    			break;
    		}
    	}
    
    	if (!errorString) {
    		errorString = args.map(arg => typeof arg === 'object' ? JSON.stringify(arg) : String(arg)).join(' ');
    	}
    
    	window.parent.postMessage({
    		type: 'horizons-console-error',
    		error: errorString
    	}, '*');
    };
    </script>
    		<script type="module">
    const originalFetch = window.fetch;
    
    window.fetch = function(...args) {
    	const url = args[0] instanceof Request ? args[0].url : args[0];
    
    	// Skip WebSocket URLs
    	if (url.startsWith('ws:') || url.startsWith('wss:')) {
    		return originalFetch.apply(this, args);
    	}
    
    	return originalFetch.apply(this, args)
    		.then(async response => {
    			const contentType = response.headers.get('Content-Type') || '';
    
    			// Exclude HTML document responses
    			const isDocumentResponse =
    				contentType.includes('text/html') ||
    				contentType.includes('application/xhtml+xml');
    
    			if (!response.ok && !isDocumentResponse) {
    					const responseClone = response.clone();
    					const errorFromRes = await responseClone.text();
    					const requestUrl = response.url;
    					console.error(`Fetch error from ${requestUrl}: ${errorFromRes}`);
    			}
    
    			return response;
    		})
    		.catch(error => {
    			if (!url.match(/.html?$/i)) {
    				console.error(error);
    			}
    
    			throw error;
    		});
    };
    </script>
    		<script type="module">
    if (window.navigation && window.self !== window.top) {
    	window.navigation.addEventListener('navigate', (event) => {
    		const url = event.destination.url;
    
    		try {
    			const destinationUrl = new URL(url);
    			const destinationOrigin = destinationUrl.origin;
    			const currentOrigin = window.location.origin;
    
    			if (destinationOrigin === currentOrigin) {
    				return;
    			}
    		} catch (error) {
    			return;
    		}
    
    		window.parent.postMessage({
    			type: 'horizons-navigation-error',
    
    Found 2025-12-20 by HttpPlugin
    Create report
app.xtradingai.com
CN:
app.xtradingai.com
Key:
RSA-2048
Issuer:
R13
Not before:
2026-01-04 01:58
Not after:
2026-04-04 01:58
app.xtradingai.com
CN:
app.xtradingai.com
Key:
RSA-2048
Issuer:
R12
Not before:
2025-11-04 05:12
Not after:
2026-02-02 05:12