<!DOCTYPE html>
<html dir=""
lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
<title>
AI Writer and Content Creation Tool
</title>
<link rel="stylesheet" type="text/css" media="screen" href="/css/home-v1/home-v1.min.css?v=0.1.5" />
<meta property="og:type" content="Website" />
<meta property="og:site_name" content="LogicBalls" />
<meta property="og:url" content="https://logicballs.com/" />
<meta property="og:title" content="FREE AI Tools | No Login Required" />
<meta property="og:description" content="LogicBalls: AI writing assistant for high-quality content" />
<meta property="og:image" content="https://logicballs.com/ogimages/cover.png" />
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:site" content="@logicballs" />
<meta name="twitter:url" content="https://logicballs.com/" />
<meta name="twitter:title"
content="AI Writer and Content Creation Tool" />
<meta name="twitter:description" content="LogicBalls: AI writing assistant for high-quality content" />
<meta name="twitter:card" content="https://logicballs.com/ogimages/cover.png" />
<meta name="twitter:image" content="https://logicballs.com/ogimages/cover.png" />
<meta name="description" content="LogicBalls: AI writing assistant for high-quality content" />
<meta name="google-adsense-account" content="ca-pub-7564448169654271">
<link rel="canonical" href="https://logicballs.com/" />
<link rel="alternate" hreflang="en" href="https://logicballs.com/" />
<link rel="alternate" hreflang="fr" href="https://logicballs.com/fr/" />
<link rel="alternate" hreflang="de" href="https://logicballs.com/de/" />
<link rel="alternate" hreflang="zh" href="https://logicballs.com/zh/" />
<link rel="alternate" hreflang="ar" href="https://logicballs.com/ar/" />
<link rel="alternate" hreflang="pt" href="https://logicballs.com/pt/" />
<link rel="alternate" hreflang="es" href="https://logicballs.com/es/" />
<link rel="alternate" hreflang="ja" href="https://logicballs.com/ja/" />
<link rel="alternate" hreflang="ko" href="https://logicballs.com/ko/" />
<link rel="alternate" hreflang="tl" href="https://logicballs.com/tl/" />
<link rel="alternate" hreflang="nl" href="https://logicballs.com/nl/" />
<link rel="alternate" hreflang="hi" href="https://logicballs.com/hi/" />
<link rel="alternate" hreflang="x-default" href="https://logicballs.com/" />
<link rel="dns-prefetch" href="//logicballs.com" />
<link rel="dns-prefetch" href="//www.googletagmanager.com" />
<!-- Preconnects after critical preloads -->
<link rel="icon" href="https://logicballs.com/images/logo/favicon.ico" type="image/x-icon" />
<!-- Google Fonts with preload for better performance -->
<link rel="preload"
href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&family=Poppins:wght@500;600;700&display=swap"
as="style" onload="this.onload=null;this.rel='stylesheet'">
<noscript>
<link rel="stylesheet"
href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&family=Poppins:wght@500;600;700&display=swap">
</noscript>
<!-- Non-critical external CSS -->
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@graph": [
{
"@type": "Organization",
"@id": "https://logicballs.com/#organization",
"name": "LogicBalls",
"url": "https://logicballs.com/",
"logo": "https://logicballs.com/images/logicballs-logo.png",
"description": "LogicBalls: AI writing assistant for high-quality content",
"sameAs": [
"https://www.facebook.com/logicballsApp",
"https://x.com/logicballs_ai",
"https://www.linkedin.com/company/logicballs-ai",
"https://www.instagram.com/logic_balls/",
"https://www.youtube.com/@logicballs"
],
"contactPoint": {
"@type": "ContactPoint",
"contactType": "customer service",
"email": "support@logicballs.com"
},
"slogan": "Unleash Your Creativity with AI-Powered Writing Tools",
"areaServed": {
"@type": "Place",
"name": "Worldwide"
}
},
{
"@type": "WebSite",
"@id": "https://logicballs.com/#website",
"url": "https://logicballs.com/",
"name": "AI Writer and Content Creation Tool",
"description": "LogicBalls: AI writing assistant for high-quality content",
"publisher": {
"@id": "https://logicballs.com/#organization"
}
},
{
"@type": "WebPage",
"@id": "https://logicballs.com/#webpage",
"url": "https://logicballs.com/",
"name": "AI Copy Writing | LogicBalls",
"isPartOf": {
"@id": "https://logicballs.com/#website"
},
"about": {
"@id": "https://logicballs.com/#organization"
},
"description": "LogicBalls: AI writing assistant for high-quality content",
"breadcrumb": {
"@id": "https://logicballs.com/#breadcrumb"
},
"inLanguage": "en",
"primaryImageOfPage": {
"@type": "ImageObject",
"url": "https://logicballs.com/images/cover.png",
"width": 1200,
"height": 630,
"caption": "LogicBalls AI Writing Tools Platform"
}
},
{
"@type": "BreadcrumbList",
"@id": "https://logicballs.com/#breadcrumb",
"itemListElement": [
{
"@type": "ListItem",
"position": 1,
"name": "Home",
"item": "https://logicballs.com/"
}
]
},
{
"@type": "SoftwareApplication",
"@id": "https://logicballs.com/#softwareapplication",
"name": "AI Copy Writing | LogicBalls",
"operatingSystem": "Web",
"applicationCategory": "https://schema.org/BusinessApplication",
"url": "https://logicballs.com/",
"image": "https://logicballs.com/images/cover.png",
"offers": {
"@type": "Offer",
"priceCurrency": "USD",
"price": "0",
"description": "Free trial available",
"availability": "https://schema.org/InStock"
}
}
]
}
</script>
<script>
if (typeof window !== 'undefined' && window.location.host === 'logicballs.com') {
(function (w, d, s, l, i) {
w[l] = w[l] || [];
w[l].push({
'gtm.start': new Date().getTime(),
event: 'gtm.js'
});
var f = d.getElementsByTagName(s)[0],
j = d.createElement(s),
dl = l != 'dataLayer' ? '&l=' + l : '';
j.async = true;
j.src =
'https://www.googletagmanager.com/gtm.js?id=' + i + dl;
f.parentNode.insertBefore(j, f);
})(window, document, 'script', 'dataLayer', 'GTM-MB8NQN6');
}
</script>
<script async
src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-7564448169654271"
crossorigin="anonymous"></script>
<style>
/* Hide/show headers based on screen size */
@media (max-width: 991px) {
#desktop-header {
display: none !important;
}
#mobile-header {
display: block !important;
}
}
@media (min-width: 992px) {
#desktop-header {
display: block !important;
}
#mobile-header {
display: none !important;
}
}
.ai-models-dropdown .dropdown-category:hover>.dropdown-submenu {
display: block;
opacity: 1;
visibility: visible;
transform: translateX(0);
}
.ai-models-dropdown {
overflow: visible;
}
/* Optional: indicate active hover on header */
.ai-models-dropdown .dropdown-category:hover>.dropdown-category-header {
background: #F3F4F6;
color: #1D4ED8;
}
</style>
</head>
<body class="page-index">
<div class="ai-search-overlay" id="searchPopup">
<div class="ai-search-container">
<div class="ai-search-backdrop">
<div class="ai-search-box">
<div class="ai-search-input-wrapper">
<svg class="ai-search-icon-svg" viewBox="0 0 24 24" width="20" height="20">
<path
d="M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z" />
</svg>
<input type="text" id="searchInput" class="ai-search-input"
placeholder="Try 'tool for writing a professional email'... " autofocus>
<button id="searchButton" class="ai-search-btn" title="Press Enter to search">
<svg class="ai-search-enter-icon" xmlns="http://www.w3.org/2000/svg" width="16" height="16"
viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"
stroke-linejoin="round" class="icon icon-tabler icons-tabler-outline icon-tabler-send-2">
<path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
<path
d="M4.698 4.034l16.302 7.966l-16.302 7.966a.503 .503 0 0 1 -.546 -.124a.555 .555 0 0 1 -.12 -.568l2.468 -7.274l-2.468 -7.274a.555 .555 0 0 1 .12 -.568a.503 .503 0 0 1 .546 -.124z">
</path>
<path d="M6.5 12h14.5"></path>
</svg>
<div class="ai-search-btn-loader"></div>
</button>
</div>
</div>
<div class="ai-search-content">
<div id="searchResults" class="ai-search-results">
<!-- Results will be populated here -->
</div>
<div class="ai-search-chat">
<div class="ai-search-message ai-search-initial">
<div class="ai-search-message-content">
<p></p>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<script>
let thinkingText = "AI is Thinking";
let popLanguage = "en";
let errormessage1 = "Please enter at least 2 characters to search...";
let errormessage2 = "I couldn't find any tools matching your search. Try describing your task differently, for example 'create marketing content' instead of just 'marketing'.";
let errormessage3 = "No tools found matching your search";
let errormessage4 = "Sorry, I encountered an error while searching. Please try again or rephrase your search.";
let errormessage5 = "An error occurred while searching. Please try again.";
let errormessage6 = "Sorry, something went wrong. Please try again in a moment.";
function openSearchPopup() {
document.getElementById('searchPopup').style.display = 'block';
document.getElementById('searchInput').focus();
}
function closeSearchPopup() {
document.getElementById('searchPopup').style.display = 'none';
}
function suggestionClick(element) {
document.getElementById('searchInput').value = element.textContent;
performSearch();
}
async function performSearch() {
const searchTerm = document.getElementById('searchInput').value.trim();
const lang = localStorage.getItem('selectedLanguage') || 'en';
const resultsContainer = document.getElementById('searchResults');
const searchButton = document.getElementById('searchButton');
const buttonLoader = searchButton.querySelector('.ai-search-btn-loader');
const enterIcon = searchButton.querySelector('.ai-search-enter-icon');
const allMessages = document.querySelector('.ai-search-content');
if (searchTerm.length < 2) {
resultsContainer.innerHTML = `<div class="ai-search-message">${errormessage1}</div>`;
return;
}
// Show loading state
allMessages.style.display = 'block';
enterIcon.style.display = 'none';
buttonLoader.style.display = 'block';
resultsContainer.innerHTML = `<div class="ai-search-loading btn-shine">${thinkingText}</div>`;
try {
const response = await fetch('/v1/api/user/search-tools', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
searchKey: searchTerm,
lang: popLanguage || 'en'
})
});
const data = await response.json();
if (data.status === 'success') {
const { results, suggestion } = data.data;
const messageText = document.querySelector('.ai-search-message-content');
if (results.length > 0) {
allMessages.style.overflow = 'auto';
resultsContainer.innerHTML = results.map(item => `
<a href="${item.url}" class="ai-search-item" target="_blank">
<div class="ai-search-category">${item.category}</div>
<div class="ai-search-name">${item.name}</div>
<div class="ai-search-tags">${item.tags.join(' • ')}</div>
</a>
`).join('');
} else {
messageText.style.display = 'block';
messageText.innerHTML = errormessage2;
resultsContainer.innerHTML = `<div class="ai-search-message">${errormessage3}</div>`;
}
} else {
document.querySelector('.ai-search-message-content').innerHTML = errormessage4
resultsContainer.innerHTML = `<div class="ai-search-error">${errormessage5}</div>`;
}
} catch (error) {
console.error('Error fetching search results:', error);
document.querySelector('.ai-search-message-content').innerHTML = errormessage6
resultsContainer.innerHTML = `<div class="ai-search-error">${errormessage5}</div>`;
} finally {
// Reset button state
enterIcon.style.display = 'block';
buttonLoader.style.display = 'none';
}
}
document.getElementById('searchButton').addEventListener('click', performSearch);
document.getElementById('searchInput').addEventListener('keypress', function (e) {
if (e.key === 'Enter') {
performSearch();
}
});
// Hide content when input is cleared
document.getElementById('searchInput').addEventListener('input', function (e) {
const allMessages = document.querySelector('.ai-search-content');
const resultsContainer = document.getElementById('searchResults');
const messageContent = document.querySelector('.ai-search-message-content');
if (!this.value.trim()) {
allMessages.style.display = 'none';
resultsContainer.innerHTML = '';
if (messageContent) {
messageContent.innerHTML = '';
messageContent.style.display = 'none';
}
}
});
// Close popup when clicking outside
document.addEventListener('click', function (event) {
const popup = document.getElementById('searchPopup');
const container = document.querySelector('.ai-search-container');
const backdrop = document.querySelector('.ai-search-backdrop');
if (event.target === popup || (event.target === container && !backdrop.contains(event.target))) {
closeSearchPopup();
}
});
// Close popup on escape key
document.addEventListener('keydown', function (e) {
if (e.key === 'Escape' && document.getElementById('searchPopup').style.display === 'block') {
closeSearchPopup();
}
});
</script>
<noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-MB8NQN6" height="0" width="0"
style="display: none; visibility: hidden"></iframe></noscript>
<!-- Responsive Header Include -->
<script src="https://accounts.google.com/gsi/client" async defer></script>
<script>// Constants
// Constants
const GOOGLE_AUTH_CONFIG = {
BUTTON_CONFIG: {
theme: 'outline',
size: 'large'
}
};
window.onload = function() {
window.isAuthenticated = false;
google.accounts.id.initialize({
client_id: '912809138133-km9l2r229va9mot2js9gg2f4ssa9pbua.apps.googleusercontent.com', // Client ID injected directly from server template
callback: handleGoogleCredentialResponse,
auto_select: true
});
const buttonContainer = document.getElementById('buttonDiv');
if (buttonContainer) {
google.accounts.id.renderButton(
buttonContainer,
GOOGLE_AUTH_CONFIG.BUTTON_CONFIG
);
}
google.accounts.id.prompt();
};
// Handle Google credential response
async function handleGoogleCredentialResponse(response) {
if (!response?.credential) {
// console.error('Invalid credential response');
return;
}
try {
const resp = await authapiRequest(
'POST',
'googleTapAuth',
{ token: response.credential }
);
if (resp.data?.statuscode === 200) {
await handleGoogleLogin(resp?.data?.data);
} else {
// console.error('Google auth API error:', resp);
}
} catch (error) {
// console.error('Google auth error:', error);
}
}
// Handle Google login flow
async function handleGoogleLogin(response) {
if (!response?.user) {
// console.error('Invalid user data');
return;
}
const { user, oauth } = response;
// Set initial auth data
let imageUrl;
if (user.email) {
imageUrl = "https://placehold.co/40X40/lightblue/white?text=" + user.email.charAt(0).toUpperCase();
} else {
imageUrl = "https://placehold.co/40X40/lightblue/white?text=" + user.identifier.charAt(0).toUpperCase();
}
if (user.photoURL) {
imageUrl = user.photoURL;
}
localStorage.setItem("user_id", user.user_id);
localStorage.setItem("photo_url", imageUrl);
localStorage.setItem("authtoken", oauth.access_token);
try {
const resp = await authapiRequest(
'POST',
'user',
prepareUserAuthRequest(user, null, oauth.id_token),
{ Authorization: `Bearer ${oauth.access_token}` }
);
if (resp.data) {
if (resp.data.logInTime) {
localStorage.setItem("logInTime", resp.data.logInTime);
}
if (resp.data.activeSession) {
await authapiRequest(
'GET',
`user/updateSeesion?lastLoginTime='${localStorage.getItem("logInTime")}'`,
undefined,
{ Authorization: `Bearer ${oauth.access_token}` }
);
}
if (resp.data?.session) {
const payload = JSON.parse(atob(resp.data.session.split(".")[1]));
const expirationTime = new Date(payload.exp * 1000).toGMTString();
// Set cookies
document.cookie = `_sess=${resp.data.session};path=/;expires=${expirationTime}`;
document.cookie = `access_token=${oauth.access_token};path=/;expires=${expirationTime}`;
document.cookie = `id_token=${oauth.id_token};path=/;expires=${expirationTime}`;
// Update profile picture if available
if (resp.data.ProfilePic?.length) {
localStorage.setItem("photo_url", resp.data.ProfilePic);
}
localStorage.setItem("user_id", resp.data.UserId);
// Handle redirect
if (resp.data.subscription) {
window.location.href = "/premium";
return;
}
window.location.reload();
return;
}
}
} catch (error) {
// console.error('Login flow error:', error);
}
}
// Prepare user request data
function prepareUserAuthRequest(user, refCode = null, idToken) {
const userApiRequest = {
created_at: parseInt(user?.metadata?.createdAt),
last_login_at: parseInt(user?.metadata?.lastLoginAt),
ref_code: refCode,
displayName: user?.displayName,
idToken
};
if (localStorage.getItem("logInTime")) {
userApiRequest.logIn_session_time = localStorage.getItem("logInTime");
}
// Get UTM parameters from cookies
const utmSource = document.cookie.match(/utm_source=([^;]+)/)?.[1];
const utmMedium = document.cookie.match(/utm_medium=([^;]+)/)?.[1];
const utmCampaign = document.cookie.match(/utm_campaign=([^;]+)/)?.[1];
// Add UTM parameters if all are present
if (utmSource && utmMedium && utmCampaign) {
userApiRequest.utm_source = utmSource;
userApiRequest.utm_medium = utmMedium;
userApiRequest.utm_campaign = utmCampaign;
}
return userApiRequest;
}
async function authapiRequest(method, path, data, headers = {}) {
try {
const response = await fetch(`${window.location.protocol}//${window.location.host}/v1/api/${path}`, {
method,
...(data && { body: JSON.stringify(data) }),
headers: {
Accept: 'application/json',
'Content-Type': 'application/json',
...headers
}
});
return response.ok ? { data: await response.json() } : { error: 'API request failed' };
} catch (e) {
return { error: e };
}
}
</script>
<div id="desktop-header">
<header class="header" id="header" role="banner">
<nav class="navbar" role="navigation">
<!--Logo-->
<div class="logo">
<a href="https://logicballs.com">
<img src="https://logicballs.com/images/logo.svg" alt="LogicBalls" title="LogicBalls" />
</a>
</div>
<!--Logo-->
<!--search-->
<div class="search">
<div class="search-header">
<button id="show-button-typesence" onclick="
if(typeof window.hightlightSearchBoxCursor === 'function') {
window.hightlightSearchBoxCursor();
} else if(typeof hightlightSearchBoxCursor === 'function') {
hightlightSearchBoxCursor();
} else {
// Wait for search to load and try again
setTimeout(() => {
if(typeof window.hightlightSearchBoxCursor === 'function') {
window.hightlightSearchBoxCursor();
}
}, 100);
}">
Search
</button>
<button onclick="if(typeof openSearchPopup === 'function') { openSearchPopup(); }" id="show-button-ai" class="show-button-typesence">
<svg focusable="false" viewBox="0 -960 960 960" height="28" width="28" class="EiVpKc aoH">
<path d="M480-80q2,0 2-2q0-82 31-154t85-126t126-85t154-31q2,0 2-2t-2-2q-82,0-154-31T598-598T513-724T482-878q0-2-2-2t-2,2q0,82-31,154T362-598T236-513T82-482q-2,0-2,2t2,2q82,0 154,31t126,85t85,126T478-82q0,2 2,2Z">
</path>
</svg>
<div>Ask AI </div>
</button>
</div>
</div>
<!--Navigation-->
<div class="nav-rigth">
<!--
<a href="https://logicballs.com/write-for-us" class="">
<div>
Write for us
</div>
</a> -->
<a href="https://logicballs.com/pricing" class="">
<div>
Pricing
</div>
</a>
<div class="tool-form">
<div class="field field-type-dropdown form-group">
<label class="dropdown" for="language-dropdown">
<div class="dd-button language" data-abc="dd-button">
<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="icon icon-tabler icons-tabler-outline icon-tabler-world" style="width: 18px;height: 18px;">
<path stroke="none" d="M0 0h24v24H0z" fill="none" />
<path d="M3 12a9 9 0 1 0 18 0a9 9 0 0 0 -18 0" />
<path d="M3.6 9h16.8" />
<path d="M3.6 15h16.8" />
<path d="M11.5 3a17 17 0 0 0 0 18" />
<path d="M12.5 3a17 17 0 0 1 0 18" />
</svg>
</div>
<input type="checkbox" class="dd-input" aria-label="Toggle language menu" id="language-dropdown" name="language-dropdown">
<ul class="dd-menu" data-abc="ddmenu">
<li class="language-option" data-lang="en">
<button type="button" class="dd-item">English</button>
</li>
<li class="language-option" data-lang="zh">
<button type="button" class="dd-item">简体中文</button>
</li>
<li class="language-option" data-lang="ar">
<button type="button" class="dd-item">العربية</button>
</li>
<li class="language-option" data-lang="fr">
<button type="button" class="dd-item">Français</button>
</li>
<li class="language-option" data-lang="de">
<button type="button" class="dd-item">German</button>
</li>
<li class="language-option" data-lang="pt">
<button type="button" class="dd-item">Português</button>
</li>
<li class="language-option" data-lang="es">
<button type="button" class="dd-item">Español</button>
</li>
<li class="language-option" data-lang="ja">
<button type="button" class="dd-item">日本語</button>
</li>
<li class="language-option" data-lang="ko">
<button type="button" class="dd-item">한국어</button>
</li>
<li class="language-option" data-lang="tl">
<button type="button" class="dd-item">Tagalog</button>
</li>
<li class="language-option" data-lang="nl">
<button type="button" class="dd-item">Dutch</button>
</li>
<li class="language-option" data-lang="hi">
<button type="button" class="dd-item">हिन्दी</button>
</li>
</ul>
</label>
</div>
</div>
<div class="tool-form">
<div class="field field-type-dropdown form-group">
<div>
<label class="dropdown" for="usermenu-dropdown">
<div class="dd-button " data-abc="dd-button">
<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="icon icon-tabler icons-tabler-outline icon-tabler-user">
<path stroke="none" d="M0 0h24v24H0z" fill="none" />
<path d="M8 7a4 4 0 1 0 8 0a4 4 0 0 0 -8 0" />
<path d="M6 21v-2a4 4 0 0 1 4 -4h4a4 4 0 0 1 4 4v2" />
</svg>
</div>
<input type="checkbox" class="dd-input" aria-label="Toggle user menu" id="usermenu-dropdown" name="usermenu-dropdown">
<ul class="dd-menu" data-abc="ddmenu">
<li>
<span class="dd-item">
<a href="https://logicballs.com/auth"> <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="icon icon-tabler icons-tabler-outline icon-tabler-login-2">
<path stroke="none" d="M0 0h24v24H0z" fill="none" />
<path d="M9 8v-2a2 2 0 0 1 2 -2h7a2 2 0 0 1 2 2v12a2 2 0 0 1 -2 2h-7a2 2 0 0 1 -2 -2v-2" />
<path d="M3 12h13l-3 -3" />
<path d="M13 15l3 -3" />
</svg>
Login / Signup
</a>
</span>
</li>
<li>
<span class="dd-item">
<span class="dd-text">
<a class="nav-link" href="https://logicballs.com/pricing">
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="icon icon-tabler icons-tabler-outline icon-tabler-currency-dollar">
<path stroke="none" d="M0 0h24v24H0z" fill="none" />
<path d="M16.7 8a3 3 0 0 0 -2.7 -2h-4a3 3 0 0 0 0 6h4a3 3 0 0 1 0 6h-4a3 3 0 0 1 -2.7 -2" />
<path d="M12 3v3m0 12v3" />
</svg>
Pricing
</a>
</span>
</span>
</li>
<li>
<span class="dd-item">
<span class="dd-text">
<a class="nav-link" href="https://logicballs.com/tags">
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="icon icon-tabler icons-tabler-outline icon-tabler-tags">
<path stroke="none" d="M0 0h24v24H0z" fill="none" />
<path d="M3 8v4.172a2 2 0 0 0 .586 1.414l5.71 5.71a2.41 2.41 0 0 0 3.408 0l3.592 -3.592a2.41 2.41 0 0 0 0 -3.408l-5.71 -5.71a2 2 0 0 0 -1.414 -.586h-4.172a2 2 0 0 0 -2 2z" />
<path d="M18 19l1.592 -1.592a4.82 4.82 0 0 0 0 -6.816l-4.592 -4.592" />
<path d="M7 10h-.01" />
</svg>
</svg>
Tags
</a>
</span>
</span>
</li>
<li>
<span class="dd-item">
<span class="dd-text">
<a class="nav-link" href="https://logicballs.com/browse-ai-tools">
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="icon icon-tabler icons-tabler-outline icon-tabler-category">
<path stroke="none" d="M0 0h24v24H0z" fill="none" />
<path d="M4 4h6v6h-6z" />
<path d="M14 4h6v6h-6z" />
<path d="M4 14h6v6h-6z" />
<path d="M17 17m-3 0a3 3 0 1 0 6 0a3 3 0 1 0 -6 0" />
</svg>
Categories
</a>
</span>
</span>
</li>
<li>
<span class="dd-item">
<span class="dd-text">
<a class="nav-link" href="https://logicballs.com/comparison">
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="icon icon-tabler icons-tabler-outline icon-tabler-scale">
<path stroke="none" d="M0 0h24v24H0z" fill="none" />
<path d="M7 20l10 0" />
<path d="M6 6l6 -1l6 1" />
<path d="M12 3l0 17" />
<path d="M9 12l-3 -6l-3 6a3 3 0 0 0 6 0" />
<path d="M21 12l-3 -6l-3 6a3 3 0 0 0 6 0" />
</svg>
Comparison
</a>
</span>
</span>
</li>
<li class="divider"></li>
<li>
<span class="dd-item">
<span class="dd-text">
<a class="nav-link" href="/cdn-cgi/l/email-protection#deadabaeaeb1acaa9eb2b1b9b7bdbcbfb2b2adf0bdb1b3">
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="icon icon-tabler icons-tabler-outline icon-tabler-phone">
<path stroke="none" d="M0 0h24v24H0z" fill="none" />
<path d="M5 4h4l2 5l-2.5 1.5a11 11 0 0 0 5 5l1.5 -2.5l5 2v4a2 2 0 0 1 -2 2a16 16 0 0 1 -15 -15a2 2 0 0 1 2 -2" />
</svg>
Contact us
</a>
</span>
</span>
</ul>
</label>
</div>
</div>
</div>
</div>
<!--Navigation-->
</nav>
</header>
<div id="referralPopup" class="referral-popup">
<div class="referral-popup-content">
<button class="close-button" onclick="closeReferralPopup()">×</button>
<div class="referral-popup-header">
<h2>Unlock Your FREE Year of Premium Access! 🎁</h2>
<p class="subtitle">Share the power of our tools with friends and get rewarded!</p>
<div class="reward-tiers">
<div class="reward-tier">
<div class="plan-badge">Most Popular</div>
<span class="plan-price">$59</span>
<h3>Pro Plan</h3>
<p class="plan-description">Refer 2 friends to our Pro plan and unlock a FULL YEAR of premium access absolutely FREE!</p>
<button class="share-button" onclick="shareViaLink('59', 'false' === 'true', event)">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="icon icon-tabler icons-tabler-outline icon-tabler-copy"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M7 7m0 2.667a2.667 2.667 0 0 1 2.667 -2.667h8.666a2.667 2.667 0 0 1 2.667 2.667v8.666a2.667 2.667 0 0 1 -2.667 2.667h-8.666a2.667 2.667 0 0 1 -2.667 -2.667z" /><path d="M4.012 16.737a2.005 2.005 0 0 1 -1.012 -1.737v-10c0 -1.1 .9 -2 2 -2h10c.75 0 1.158 .385 1.5 1" /></svg>
Copy Referral Link
</button>
</div>
<div class="reward-tier">
<div class="plan-badge premium">Premium Choice</div>
<span class="plan-price">$99</span>
<h3>Premium Plan</h3>
<p class="plan-description">Refer 2 friends to our Premium plan and enjoy a FULL YEAR of our top-tier features FREE!</p>
<button class="share-button" onclick="shareViaLink('99', 'false' === 'true', event)">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="icon icon-tabler icons-tabler-outline icon-tabler-copy"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M7 7m0 2.667a2.667 2.667 0 0 1 2.667 -2.667h8.666a2.667 2.667 0 0 1 2.667 2.667v8.666a2.667 2.667 0 0 1 -2.667 2.667h-8.666a2.667 2.667 0 0 1 -2.667 -2.667z" /><path d="M4.012 16.737a2.005 2.005 0 0 1 -1.012 -1.737v-10c0 -1.1 .9 -2 2 -2h10c.75 0 1.158 .385 1.5 1" /></svg>
Copy Referral Link
</button>
</div>
</div>
<p class="bonus-text">🎉 Already a subscriber? Get a BONUS year added to your current plan when your friends join!</p>
</div>
</div>
</div>
<script data-cfasync="false" src="/cdn-cgi/scripts/5c5dd728/cloudflare-static/email-decode.min.js"></script><script>
const API_CONFIG = {
API_BASE_URL: `${window.location.protocol}//${window.location.host}/premium/`
};
// function createConfetti() {
// const colors = ['#6a4dff', '#ff4d6a', '#4dff6a', '#ffd700'];
// const confettiCount = 150;
// const container = document.querySelector('.confetti-container');
// for (let i = 0; i < confettiCount; i++) {
// const confetti = document.createElement('div');
// confetti.className = 'confetti';
// confetti.style.backgroundColor = colors[Math.floor(Math.random() * colors.length)];
// confetti.style.left = Math.random() * 100 + '%';
// confetti.style.animationDelay = Math.random() * 3 + 's';
// confetti.style.opacity = Math.random();
// confetti.style.transform = `rotate(${Math.random() * 360}deg)`;
// const size = Math.random() * 10 + 5;
// confetti.style.width = size + 'px';
// confetti.style.height = size + 'px';
// container.appendChild(confetti);
// }
// }
function showReferralPopup() {
const popup = document.getElementById('referralPopup');
popup.classList.add('active');
// createConfetti();
}
function closeReferralPopup() {
const popup = document.getElementById('referralPopup');
popup.classList.remove('active');
// Clean up confetti
const container = document.querySelector('.confetti-container');
container.innerHTML = '';
}
async function shareViaLink(planPrice, isAuth, event) {
// Find the button element for the specific plan
let buttonElement;
if (event) {
buttonElement = event.target.closest('.share-button');
} else {
// Find the button based on the plan price
const rewardTiers = document.querySelectorAll('.reward-tier');
for (const tier of rewardTiers) {
const priceElement = tier.querySelector('.plan-price');
if (priceElement && priceElement.textContent.includes(planPrice)) {
buttonElement = tier.querySelector('.share-button');
break;
}
}
}
if (!buttonElement) {
console.error('Button element not found for price:', planPrice);
return;
}
const originalText = buttonElement.innerHTML;
// Check localStorage first
const storageKey = `referral_link_${planPrice}`;
const cachedLink = localStorage.getItem(storageKey);
if (cachedLink) {
await copyToClipboard(cachedLink, buttonElement);
return;
}
// Show loading state
buttonElement.innerHTML = `
<div class="button-spinner"></div>
<span>Generating link...</span>
`;
// Function to show error popup
function showErrorPopup(message) {
const errorPopup = document.createElement('div');
errorPopup.className = 'error-popup';
errorPopup.textContent = message;
document.body.appendChild(errorPopup);
// Remove popup after 3 seconds
setTimeout(() => {
errorPopup.remove();
}, 3000);
}
if (isAuth) {
try {
// Call API to generate referral link
const token = window.localStorage.getItem('authtoken')
if(!token){
throw new Error('Please logged in and try again');
}
const response = await fetch( `${API_CONFIG.API_BASE_URL}subscription/generate/`, {
method: 'POST',
headers: {
'Authorization': `Bearer ${token}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({
plan: planPrice === '99' ? 'Premium' : 'Pro'
})
});
if (!response.ok) {
throw new Error('Failed to generate referral link');
}
const data = await response.json();
if (!data.data?.shared_link) {
throw new Error('Invalid response format');
}
const referralLink = data.data.shared_link;
// Store valid link in localStorage
const storageKey = `referral_link_${planPrice}`;
localStorage.setItem(storageKey, referralLink);
// Copy to clipboard and restore original button state
buttonElement.innerHTML = originalText;
await copyToClipboard(referralLink, buttonElement);
} catch (err) {
console.error('Error sharing referral link:', err);
// Restore original button state
buttonElement.innerHTML = originalText;
showErrorPopup(err.message || 'Unable to generate referral link. Please try again later.');
}
} else {
// Redirect to auth page with refSub param
const refSub = encodeURIComponent(btoa(JSON.stringify({ planPrice, timestamp: Date.now() })));
window.location.href = `/auth?refSub=${refSub}`;
}
}
async function copyToClipboard(text, buttonElement) {
if (!text) {
showErrorPopup('Invalid referral link');
return;
}
const successState = '✓ Link Copied! Ready to Share';
let currentTimeout;
try {
// Attempt to copy using clipboard API
if (navigator.clipboard) {
await navigator.clipboard.writeText(text);
} else {
// Fallback copy method
const tempInput = document.createElement('input');
tempInput.value = text;
document.body.appendChild(tempInput);
tempInput.select();
document.execCommand('copy');
document.body.removeChild(tempInput);
}
// Show success state
const svgContent = buttonElement.querySelector('svg')?.outerHTML || '';
buttonElement.innerHTML = svgContent + ' ' + successState;
// Clear any existing timeout
if (currentTimeout) {
clearTimeout(currentTimeout);
}
// Set new timeout
currentTimeout = setTimeout(() => {
if (buttonElement.textContent.includes(successState)) {
buttonElement.innerHTML = svgContent + ' Copy Referral Link';
}
}, 3000);
} catch (err) {
console.error('Failed to copy:', err);
showErrorPopup('Failed to copy link. Please try again.');
}
}
function promptManualCopy(text) {
const tempInput = document.createElement('input');
tempInput.value = text;
document.body.appendChild(tempInput);
tempInput.select();
document.execCommand('copy');
document.body.removeChild(tempInput);
const successPopup = document.createElement('div');
successPopup.className = 'error-popup success';
successPopup.textContent = 'Referral link copied to clipboard! Share it with your friends to start earning rewards.';
document.body.appendChild(successPopup);
setTimeout(() => {
successPopup.remove();
}, 3000);
}
// Update the existing handleReferral function
window.handleReferral = function() {
showReferralPopup();
};
// Initialize popup functionality
function initReferralPopup() {
const popup = document.getElementById('referralPopup');
if (!popup) {
console.error('Referral popup not found!');
return;
}
// Ensure popup is in body
if (popup.parentElement !== document.body) {
document.body.appendChild(popup);
}
}
document.addEventListener('DOMContentLoaded', function() {
// Initialize popup
initReferralPopup();
// Check for pending referral
const urlParams = new URLSearchParams(window.location.search);
const showReferral = urlParams.get('show_referral');
const pendingReferral = localStorage.getItem('pending_referral');
if (showReferral && pendingReferral) {
try {
const referralData = JSON.parse(atob(pendingReferral));
if (referralData.planPrice && referralData.timestamp) {
// Only process if timestamp is within last 24 hours
const now = Date.now();
const then = referralData.timestamp;
if (now - then < 24 * 60 * 60 * 1000) {
// Show popup and trigger link generation
showReferralPopup();
shareViaLink(referralData.planPrice, true);
}
// Clear the pending referral
localStorage.removeItem('pending_referral');
}
} catch (error) {
console.error('Error processing pending referral:', error);
}
}
// Add confetti animation styles dynamically
const style = document.createElement('style');
style.textContent = `
@keyframes confettiFall {
0% {
transform: translateY(-100vh) rotate(0deg);
}
100% {
transform: translateY(100vh) rotate(360deg);
}
}
.confetti {
position: absolute;
width: 10px;
height: 10px;
background-color: #6a4dff;
animation: confettiFall 3s linear infinite;
}
.button-spinner {
display: inline-block;
width: 16px;
height: 16px;
margin-right: 8px;
border: 2px solid rgba(255, 255, 255, 0.3);
border-top-color: #fff;
border-radius: 50%;
animation: spin 0.8s linear infinite;
}
@keyframes spin {
to { transform: rotate(360deg); }
}
.error-popup {
position: fixed;
top: 20px;
right: 20px;
background-color: #ff4d4d;
color: white;
padding: 15px 20px;
border-radius: 5px;
box-shadow: 0 2px 8px rgba(0,0,0,0.2);
z-index: 9999;
animation: fadeInOut 3s ease;
}
.error-popup.success {
background-color: #4CAF50;
}
@keyframes fadeInOut {
0% { opacity: 0; transform: translateY(-20px); }
10% { opacity: 1; transform: translateY(0); }
90% { opacity: 1; transform: translateY(0); }
100% { opacity: 0; transform: translateY(-20px); }
}
`;
document.head.appendChild(style);
});
</script>
<script>
// Initialize search buttons with proper handlers
function initializeSearchButtons() {
const typesenseButton = document.getElementById('show-button-typesence');
const aiButton = document.getElementById('show-button-ai');
if (typesenseButton) {
typesenseButton.onclick = function() {
if (typeof window.hightlightSearchBoxCursor === 'function') {
window.hightlightSearchBoxCursor();
} else if (typeof hightlightSearchBoxCursor === 'function') {
hightlightSearchBoxCursor();
} else {
// Wait for search to load and try again
setTimeout(() => {
if (typeof window.hightlightSearchBoxCursor === 'function') {
window.hightlightSearchBoxCursor();
}
}, 500);
}
};
}
if (aiButton) {
aiButton.onclick = function() {
if (typeof openSearchPopup === 'function') {
openSearchPopup();
}
};
}
}
// Initialize immediately and also after a delay to ensure all scripts are loaded
initializeSearchButtons();
setTimeout(initializeSearchButtons, 1000);
</script>
<style>
.language-option.active {
background-color: #f5f5f5;
font-weight: bold;
color: #6a4dff;
}
.dd-menu .language-option {
display: block;
padding: 8px 15px;
text-decoration: none;
color: inherit;
}
.dd-menu .language-option:hover {
background-color: #f5f5f5;
}
.dd-menu button.dd-item {
width: 100%;
text-align: left;
background: none;
border: none;
cursor: pointer;
font: inherit;
color: inherit;
}
.dd-menu button.dd-item:hover {
background-color: #f5f5f5;
}
.language-option.active button.dd-item {
color: #6a4dff;
font-weight: bold;
}
</style>
</div>
<div id="mobile-header" style="display: none;">
<!-- Mobile Drawer -->
<div class="drawer-overlay" id="drawer-overlay"></div>
<nav class="mobile-drawer" id="mobile-drawer">
<div class="drawer-header">
<div class="logo">
<a href="https://logicballs.com">
<img src="https://logicballs.com/images/logo.svg" alt="LogicBalls" title="LogicBalls" fetchpriority="high" width="165" height="40" style="width: 165px; height: 40px;" decoding="sync" />
</a>
</div>
<button class="close-drawer" id="close-drawer" aria-label="Close mobile menu">
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 -960 960 960" width="24" fill="currentColor">
<path d="m256-200-56-56 224-224-224-224 56-56 224 224 224-224 56 56-224 224 224 224-56 56-224-224-224 224Z" />
</svg>
</button>
</div>
<div class="drawer-content">
<!-- Language Accordion -->
<div class="language-accordion">
<button class="accordion-toggle" aria-expanded="false">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="icon icon-tabler icons-tabler-outline icon-tabler-world">
<path stroke="none" d="M0 0h24v24H0z" fill="none" />
<path d="M3 12a9 9 0 1 0 18 0a9 9 0 0 0 -18 0" />
<path d="M3.6 9h16.8" />
<path d="M3.6 15h16.8" />
<path d="M11.5 3a17 17 0 0 0 0 18" />
<path d="M12.5 3a17 17 0 0 1 0 18" />
</svg>
<span class="current-language">Language</span>
<svg class="accordion-icon" xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<polyline points="6 9 12 15 18 9"></polyline>
</svg>
</button>
<div class="accordion-content" style="display: none;">
<ul class="language-list">
<li class="language-option active" data-lang="en">
<button type="button" class="dd-item">English</button>
</li>
<li class="language-option" data-lang="zh">
<button type="button" class="dd-item">简体中文</button>
</li>
<li class="language-option" data-lang="ar">
<button type="button" class="dd-item">العربية</button>
</li>
<li class="language-option" data-lang="fr">
<button type="button" class="dd-item">Français</button>
</li>
<li class="language-option" data-lang="de">
<button type="button" class="dd-item">German</button>
</li>
<li class="language-option" data-lang="pt">
<button type="button" class="dd-item">Português</button>
</li>
<li class="language-option" data-lang="es">
<button type="button" class="dd-item">Español</button>
</li>
<li class="language-option" data-lang="ja">
<button type="button" class="dd-item">日本語</button>
</li>
<li class="language-option" data-lang="ko">
<button type="button" class="dd-item">한국어</button>
</li>
<li class="language-option" data-lang="tl">
<button type="button" class="dd-item">Tagalog</button>
</li>
<li class="language-option" data-lang="nl">
<button type="button" class="dd-item">Dutch</button>
</li>
<li class="language-option" data-lang="hi">
<button type="button" class="dd-item">हिन्दी</button>
</li>
</ul>
</div>
</div>
<ul class="dd-menu" data-abc="ddmenu">
<!-- Other menu items -->
<li>
<span class="dd-item">
<a href="https://logicballs.com/auth"> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="icon icon-tabler icons-tabler-outline icon-tabler-login-2">
<path stroke="none" d="M0 0h24v24H0z" fill="none" />
<path d="M9 8v-2a2 2 0 0 1 2 -2h7a2 2 0 0 1 2 2v12a2 2 0 0 1 -2 2h-7a2 2 0 0 1 -2 -2v-2" />
<path d="M3 12h13l-3 -3" />
<path d="M13 15l3 -3" />
</svg>
Login / Signup
</a>
</span>
</li>
<li>
<span class="dd-item">
<span class="dd-text">
<a class="nav-link" href="https://logicballs.com/pricing">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="icon icon-tabler icons-tabler-outline icon-tabler-currency-dollar">
<path stroke="none" d="M0 0h24v24H0z" fill="none" />
<path d="M16.7 8a3 3 0 0 0 -2.7 -2h-4a3 3 0 0 0 0 6h4a3 3 0 0 1 0 6h-4a3 3 0 0 1 -2.7 -2" />
<path d="M12 3v3m0 12v3" />
</svg>
Pricing
</a>
</span>
</span>
</li>
<li>
<span class="dd-item">
<span class="dd-text">
<a class="nav-link" href="/cdn-cgi/l/email-protection#f784828787988583b79b98909e9495969b9b84d994989a">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="icon icon-tabler icons-tabler-outline icon-tabler-phone">
<path stroke="none" d="M0 0h24v24H0z" fill="none" />
<path d="M5 4h4l2 5l-2.5 1.5a11 11 0 0 0 5 5l1.5 -2.5l5 2v4a2 2 0 0 1 -2 2a16 16 0 0 1 -15 -15a2 2 0 0 1 2 -2" />
</svg>
Contact us
</a>
</span>
</span>
</li>
</ul>
</div>
</nav>
<header class="header header-mobile" id="header" role="banner">
<nav class="navbar" role="navigation">
<div class="d-flex">
<div>
<button id="mobile-menu" aria-label="Toggle mobile menu">
<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px" fill="#1f1f1f">
<path d="M120-240v-80h720v80H120Zm0-200v-80h720v80H120Zm0-200v-80h720v80H120Z" />
</svg>
</button>
</div>
<div class="logo">
<a href="https://logicballs.com">
<img src="https://logicballs.com/images/logo.svg" alt="LogicBalls" title="LogicBalls" />
</a>
</div>
</div>
<div class="d-flex">
<div class="search search-mobile">
<div class="">
<button onclick="if(typeof openSearchPopup === 'function') { openSearchPopup(); }" id="show-button-ai" aria-label="AI powered search">
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M12 22C12.0333 22 12.05 21.9833 12.05 21.95C12.05 20.5833 12.3083 19.3 12.825 18.1C13.3417 16.9 14.05 15.85 14.95 14.95C15.85 14.05 16.9 13.3417 18.1 12.825C19.3 12.3083 20.5833 12.05 21.95 12.05C21.9833 12.05 22 12.0333 22 12C22 11.9667 21.9833 11.95 21.95 11.95C20.5833 11.95 19.3 11.6917 18.1 11.175C16.9 10.6583 15.85 9.95 14.95 9.05C14.05 8.15 13.3417 7.1 12.825 5.9C12.3083 4.7 12.05 3.41667 12.05 2.05C12.05 2.01667 12.0333 2 12 2C11.9667 2 11.95 2.01667 11.95 2.05C11.95 3.41667 11.6917 4.7 11.175 5.9C10.6583 7.1 9.95 8.15 9.05 9.05C8.15 9.95 7.1 10.6583 5.9 11.175C4.7 11.6917 3.41667 11.95 2.05 11.95C2.01667 11.95 2 11.9667 2 12C2 12.0333 2.01667 12.05 2.05 12.05C3.41667 12.05 4.7 12.3083 5.9 12.825C7.1 13.3417 8.15 14.05 9.05 14.95C9.95 15.85 10.6583 16.9 11.175 18.1C11.6917 19.3 11.95 20.5833 11.95 21.95C11.95 21.9833 11.9667 22 12 22Z" fill="url(#paint0_linear_849_445)" />
<defs>
<linearGradient id="paint0_linear_849_445" x1="12" y1="2" x2="12" y2="22" gradientUnits="userSpaceOnUse">
<stop stop-color="#FF4D6A" />
<stop offset="0.5" stop-color="#A21CAF" />
<stop offset="1" stop-color="#6A4DFF" />
</linearGradient>
</defs>
</svg>
</button>
<button id="show-button-typesence" onclick="
if(typeof window.hightlightSearchBoxCursor === 'function') {
window.hightlightSearchBoxCursor();
} else if(typeof hightlightSearchBoxCursor === 'function') {
hightlightSearchBoxCursor();
} else {
// Wait for search to load and try again
setTimeout(() => {
if(typeof window.hightlightSearchBoxCursor === 'function') {
window.hightlightSearchBoxCursor();
}
}, 100);
} " aria-label="Typesense search">
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M19.6 21L13.3 14.7C12.8 15.1 12.225 15.4167 11.575 15.65C10.925 15.8833 10.2333 16 9.5 16C7.68333 16 6.14583 15.3708 4.8875 14.1125C3.62917 12.8542 3 11.3167 3 9.5C3 7.68333 3.62917 6.14583 4.8875 4.8875C6.14583 3.62917 7.68333 3 9.5 3C11.3167 3 12.8542 3.62917 14.1125 4.8875C15.3708 6.14583 16 7.68333 16 9.5C16 10.2333 15.8833 10.925 15.65 11.575C15.4167 12.225 15.1 12.8 14.7 13.3L21 19.6L19.6 21ZM9.5 14C10.75 14 11.8125 13.5625 12.6875 12.6875C13.5625 11.8125 14 10.75 14 9.5C14 8.25 13.5625 7.1875 12.6875 6.3125C11.8125 5.4375 10.75 5 9.5 5C8.25 5 7.1875 5.4375 6.3125 6.3125C5.4375 7.1875 5 8.25 5 9.5C5 10.75 5.4375 11.8125 6.3125 12.6875C7.1875 13.5625 8.25 14 9.5 14Z" fill="#374151" />
</svg>
</button>
</div>
</div>
</div>
</nav>
</header>
<script data-cfasync="false" src="/cdn-cgi/scripts/5c5dd728/cloudflare-static/email-decode.min.js"></script><script>
// Initialize search buttons with proper handlers
function initializeSearchButtons() {
const typesenseButton = document.getElementById('show-button-typesence');
const aiButton = document.getElementById('show-button-ai');
if (typesenseButton) {
typesenseButton.onclick = function() {
if (typeof window.hightlightSearchBoxCursor === 'function') {
window.hightlightSearchBoxCursor();
} else if (typeof hightlightSearchBoxCursor === 'function') {
hightlightSearchBoxCursor();
} else {
// Wait for search to load and try again
setTimeout(() => {
if (typeof window.hightlightSearchBoxCursor === 'function') {
window.hightlightSearchBoxCursor();
}
}, 500);
}
};
}
if (aiButton) {
aiButton.onclick = function() {
if (typeof openSearchPopup === 'function') {
openSearchPopup();
}
};
}
}
// Initialize immediately and also after a delay to ensure all scripts are loaded
initializeSearchButtons();
setTimeout(initializeSearchButtons, 1000);
</script>
</div>
<main role="main" class="main-v1">
<div class="pricinghome">
<div class="specialoffer">
<div class="coupon">
Get discovered add your AI product to our top
<a href="https://logicballs.com/ai-tools" target="_blank"><span class="coupon-code">
AI directory</span></a>
</div>
<div class="dismiss-btn" id="dismissBtn"><svg xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 24 24" width="22" height="22" fill="currentColor">
<path
d="M11.9997 10.5865L16.9495 5.63672L18.3637 7.05093L13.4139 12.0007L18.3637 16.9504L16.9495 18.3646L11.9997 13.4149L7.04996 18.3646L5.63574 16.9504L10.5855 12.0007L5.63574 7.05093L7.04996 5.63672L11.9997 10.5865Z">
</path>
</svg></div>
</div>
</div>
<section class="home-v1">
<div class="ripple-container" id="ripple-bg"></div>
<div class="home-v1-wrap">
<div class="page-header">
<h1>
Write Something Cool
</h1>
<p>
Explore the First-Ever Visual ChatGPT Platform
</p>
</div>
<div class="input-wrapper">
<div class="input-card">
<div class="form">
<textarea name="homeChat" id="homeChatInput"
placeholder="Ask LogicBalls to 'Writing a professional email'"></textarea>
</div>
<div class="actions">
<div class="action-left">
<div class="dropdown-container">
<button class="dropdown-button" id="settingsDropdownBtn" aria-haspopup="true"
aria-expanded="false" aria-label="Settings menu">
<div class="icon">
<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18"
viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5"
stroke-linecap="round" stroke-linejoin="round"
class="icon icon-tabler icons-tabler-outline icon-tabler-adjustments-horizontal">
<path stroke="none" d="M0 0h24v24H0z" fill="none" />
<path d="M14 6m-2 0a2 2 0 1 0 4 0a2 2 0 1 0 -4 0" />
<path d="M4 6l8 0" />
<path d="M16 6l4 0" />
<path d="M8 12m-2 0a2 2 0 1 0 4 0a2 2 0 1 0 -4 0" />
<path d="M4 12l2 0" />
<path d="M10 12l10 0" />
<path d="M17 18m-2 0a2 2 0 1 0 4 0a2 2 0 1 0 -4 0" />
<path d="M4 18l11 0" />
<path d="M19 18l1 0" />
</svg>
</div>
</button>
<div class="dropdown-menu" id="settingsDropdown" role="menu"
aria-labelledby="settingsDropdownBtn">
<!-- Humanize toggle item -->
<div class="dropdown-item toggle-item">
<span>Humanize</span>
<label class="switch">
<input type="checkbox" id="humanizeToggle">
<span class="slider round"></span>
</label>
</div>
<!-- Tone category with submenu -->
<div class="dropdown-category">
<div class="dropdown-category-header">
Tone
<svg class="dropdown-arrow" width="14" height="14" viewBox="0 0 14 14"
fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M5.25 2.33334L9.91667 7L5.25 11.6667" stroke="currentColor"
stroke-width="1.5" stroke-linecap="round"
stroke-linejoin="round" />
</svg>
</div>
<div class="dropdown-submenu">
<div class="dropdown-item" data-tone="casual">
<div>Casual</div>
</div>
<div class="dropdown-item" data-tone="formal">
<div>Formal</div>
</div>
<div class="dropdown-item" data-tone="professional">
<div>Professional</div>
</div>
<div class="dropdown-item" data-tone="friendly">
<div>Friendly</div>
</div>
<div class="dropdown-item" data-tone="creative">
<div>Creative</div>
</div>
<div class="dropdown-item" data-tone="academic">
<div>Academic</div>
</div>
<div class="dropdown-item" data-tone="funny">
<div>Funny</div>
</div>
<div class="dropdown-item" data-tone="humble">
<div>Humble</div>
</div>
<div class="dropdown-item" data-tone="joyful">
<div>Joyful</div>
</div>
<div class="dropdown-item" data-tone="urgent">
<div>Urgent</div>
</div>
<div class="dropdown-item" data-tone="worried">
<div>Worried</div>
</div>
<div class="dropdown-item" data-tone="critical">
<div>Critical</div>
</div>
<div class="dropdown-item" data-tone="humorous">
<div>Humorous</div>
</div>
<div class="dropdown-item" data-tone="convincing">
<div>Convincing</div>
</div>
<div class="dropdown-item" data-tone="passionate">
<div>Passionate</div>
</div>
<div class="dropdown-item" data-tone="thoughtful">
<div>Thoughtful</div>
</div>
<div class="dropdown-item" data-tone="informative">
<div>Informative</div>
</div>
<div class="dropdown-item" data-tone="inspirational">
<div>Inspirational</div>
</div>
</div>
</div>
</div>
<!-- Mobile: single list with all settings options -->
<div class="dropdown-menu mobile-settings-list">
<!-- Humanize toggle item -->
<div class="dropdown-item toggle-item">
<span>Humanize</span>
<label class="switch">
<input type="checkbox" id="humanizeToggleMobile">
<span class="slider round"></span>
</label>
</div>
<!-- Tone options -->
<div class="settings-heading">Tone</div>
<div class="dropdown-item" data-tone="casual">
<div>Casual</div>
</div>
<div class="dropdown-item" data-tone="formal">
<div>Formal</div>
</div>
<div class="dropdown-item" data-tone="professional">
<div>Professional</div>
</div>
<div class="dropdown-item" data-tone="friendly">
<div>Friendly</div>
</div>
<div class="dropdown-item" data-tone="creative">
<div>Creative</div>
</div>
<div class="dropdown-item" data-tone="academic">
<div>Academic</div>
</div>
<div class="dropdown-item" data-tone="funny">
<div>Funny</div>
</div>
<div class="dropdown-item" data-tone="humble">
<div>Humble</div>
</div>
<div class="dropdown-item" data-tone="joyful">
<div>Joyful</div>
</div>
<div class="dropdown-item" data-tone="urgent">
<div>Urgent</div>
</div>
<div class="dropdown-item" data-tone="worried">
<div>Worried</div>
</div>
<div class="dropdown-item" data-tone="critical">
<div>Critical</div>
</div>
<div class="dropdown-item" data-tone="humorous">
<div>Humorous</div>
</div>
<div class="dropdown-item" data-tone="convincing">
<div>Convincing</div>
</div>
<div class="dropdown-item" data-tone="passionate">
<div>Passionate</div>
</div>
<div class="dropdown-item" data-tone="thoughtful">
<div>Thoughtful</div>
</div>
<div class="dropdown-item" data-tone="informative">
<div>Informative</div>
</div>
<div class="dropdown-item" data-tone="inspirational">
<div>Inspirational</div>
</div>
</div>
</div>
<div class="dropdown-container">
<button class="dropdown-button" id="modelDropdown">
<div class="icon">
<img src="/images/providers/anthropic.svg" width="16" height="16"
alt="Claude">
</div>
<span class="dropdown-text">
Claude
</span>
<svg width="14" height="14" viewBox="0 0 14 14" fill="none"
xmlns="http://www.w3.org/2000/svg">
<path d="M5.25 2.33334L9.91667 7L5.25 11.6667" stroke="currentColor"
stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" />
</svg>
</button>
<div class="dropdown-menu ai-models-dropdown">
<div class="dropdown-item" data-model-id="anthropic/claude-3.5-haiku"
data-premium="false" data-model-name="Claude"
data-provider="Anthropic" data-icon-path="/images/providers/anthropic.svg"
data-plan-type="basic">
<img src="/images/providers/anthropic.svg" width="20"
height="20" alt="Claude">
<div>
Claude
</div>
</div>
<div class="dropdown-item" data-model-id="meta-llama/llama-3.3-70b-instruct"
data-premium="false" data-model-name="Llama 3.3 70B"
data-provider="Meta" data-icon-path="/images/providers/meta.svg"
data-plan-type="basic">
<img src="/images/providers/meta.svg" width="20"
height="20" alt="Llama 3.3 70B">
<div>
Llama 3.3 70B
</div>
</div>
<div class="dropdown-item" data-model-id="qwen/qwen3-32b"
data-premium="false" data-model-name="Qwen3 32B"
data-provider="Qwen" data-icon-path="/images/providers/qwen.svg"
data-plan-type="basic">
<img src="/images/providers/qwen.svg" width="20"
height="20" alt="Qwen3 32B">
<div>
Qwen3 32B
</div>
</div>
<!-- Pro Plan category with submenu -->
<div class="dropdown-category">
<div class="dropdown-category-header">
Pro
<svg class="dropdown-arrow" width="14" height="14"
viewBox="0 0 14 14" fill="none"
xmlns="http://www.w3.org/2000/svg">
<path d="M5.25 2.33334L9.91667 7L5.25 11.6667"
stroke="currentColor" stroke-width="1.5"
stroke-linecap="round" stroke-linejoin="round" />
</svg>
</div>
<div class="dropdown-submenu">
<div class="dropdown-item" data-model-id="deepseek/deepseek-chat-v3-0324"
data-premium="true" data-model-name="DeepSeek V3"
data-provider="DeepSeek"
data-icon-path="/images/providers/deepseeks.svg" data-plan-type="pro">
<img src="/images/providers/deepseeks.svg"
width="20" height="20" alt="DeepSeek V3">
<div>
DeepSeek V3
</div>
</div>
<div class="dropdown-item" data-model-id="google/gemini-2.0-flash-001"
data-premium="true" data-model-name="Gemini 2.0 Flash"
data-provider="Google"
data-icon-path="/images/providers/google.svg" data-plan-type="pro">
<img src="/images/providers/google.svg"
width="20" height="20" alt="Gemini 2.0 Flash">
<div>
Gemini 2.0 Flash
</div>
</div>
<div class="dropdown-item" data-model-id="google/gemini-2.0-flash-lite-001"
data-premium="true" data-model-name="Gemini 2.0 Flash Lite"
data-provider="Google"
data-icon-path="/images/providers/google.svg" data-plan-type="pro">
<img src="/images/providers/google.svg"
width="20" height="20" alt="Gemini 2.0 Flash Lite">
<div>
Gemini 2.0 Flash Lite
</div>
</div>
<div class="dropdown-item" data-model-id="openai/gpt-4o-mini"
data-premium="true" data-model-name="GPT-4o-mini"
data-provider="OpenAI"
data-icon-path="/images/providers/openai.svg" data-plan-type="pro">
<img src="/images/providers/openai.svg"
width="20" height="20" alt="GPT-4o-mini">
<div>
GPT-4o-mini
</div>
</div>
<div class="dropdown-item" data-model-id="mistralai/mistral-nemo"
data-premium="true" data-model-name="Mistral Nemo"
data-provider="Mistral AI"
data-icon-path="/images/providers/mistral.svg" data-plan-type="pro">
<img src="/images/providers/mistral.svg"
width="20" height="20" alt="Mistral Nemo">
<div>
Mistral Nemo
</div>
</div>
<div class="dropdown-item" data-model-id="openrouter/sonoma-dusk-alpha"
data-premium="true" data-model-name="Sonoma Dusk Alpha"
data-provider="OpenRouter"
data-icon-path="/images/providers/openrouter.svg" data-plan-type="pro">
<img src="/images/providers/openrouter.svg"
width="20" height="20" alt="Sonoma Dusk Alpha">
<div>
Sonoma Dusk Alpha
</div>
</div>
<div class="dropdown-item" data-model-id="openrouter/sonoma-sky-alpha"
data-premium="true" data-model-name="Sonoma Sky Alpha"
data-provider="OpenRouter"
data-icon-path="/images/providers/openrouter.svg" data-plan-type="pro">
<img src="/images/providers/openrouter.svg"
width="20" height="20" alt="Sonoma Sky Alpha">
<div>
Sonoma Sky Alpha
</div>
</div>
</div>
</div>
<!-- Premium Plan category with submenu -->
<div class="dropdown-category">
<div class="dropdown-category-header">
Premium
<svg class="dropdown-arrow" width="14" height="14"
viewBox="0 0 14 14" fill="none"
xmlns="http://www.w3.org/2000/svg">
<path d="M5.25 2.33334L9.91667 7L5.25 11.6667"
stroke="currentColor" stroke-width="1.5"
stroke-linecap="round" stroke-linejoin="round" />
</svg>
</div>
<div class="dropdown-submenu">
<div class="dropdown-item" data-model-id="anthropic/claude-3.5-sonnet"
data-premium="true" data-model-name="Claude 3.5 Sonnet"
data-provider="Anthropic"
data-icon-path="/images/providers/anthropic.svg"
data-plan-type="premium">
<img src="/images/providers/anthropic.svg"
width="20" height="20" alt="Claude 3.5 Sonnet">
<div>
Claude 3.5 Sonnet
</div>
</div>
<div class="dropdown-item" data-model-id="deepseek/deepseek-r1-0528"
data-premium="true" data-model-name="DeepSeek R1 0528"
data-provider="DeepSeek"
data-icon-path="/images/providers/deepseeks.svg"
data-plan-type="premium">
<img src="/images/providers/deepseeks.svg"
width="20" height="20" alt="DeepSeek R1 0528">
<div>
DeepSeek R1 0528
</div>
</div>
<div class="dropdown-item" data-model-id="google/gemini-2.5-flash-preview"
data-premium="true" data-model-name="Gemini 2.5 Flash Preview"
data-provider="Google"
data-icon-path="/images/providers/google.svg"
data-plan-type="premium">
<img src="/images/providers/google.svg"
width="20" height="20" alt="Gemini 2.5 Flash Preview">
<div>
Gemini 2.5 Flash Preview
</div>
</div>
<div class="dropdown-item" data-model-id="openai/gpt-4.1-mini"
data-premium="true" data-model-name="GPT-4.1 Mini"
data-provider="OpenAI"
data-icon-path="/images/providers/openai.svg"
data-plan-type="premium">
<img src="/images/providers/openai.svg"
width="20" height="20" alt="GPT-4.1 Mini">
<div>
GPT-4.1 Mini
</div>
</div>
<div class="dropdown-item" data-model-id="moonshotai/kimi-k2-0905"
data-premium="true" data-model-name="Kimi K2"
data-provider="Moonshot AI"
data-icon-path="/images/providers/moonshotai.svg"
data-plan-type="premium">
<img src="/images/providers/moonshotai.svg"
width="20" height="20" alt="Kimi K2">
<div>
Kimi K2
</div>
</div>
</div>
</div>
<!-- Elite Plan category with submenu -->
<div class="dropdown-category">
<div class="dropdown-category-header">
Elite
<svg class="dropdown-arrow" width="14" height="14"
viewBox="0 0 14 14" fill="none"
xmlns="http://www.w3.org/2000/svg">
<path d="M5.25 2.33334L9.91667 7L5.25 11.6667"
stroke="currentColor" stroke-width="1.5"
stroke-linecap="round" stroke-linejoin="round" />
</svg>
</div>
<div class="dropdown-submenu position-up">
<div class="dropdown-item" data-model-id="anthropic/claude-3.7-sonnet"
data-premium="true" data-model-name="Claude 3.7 Sonnet"
data-provider="Anthropic"
data-icon-path="/images/providers/anthropic.svg"
data-plan-type="elite">
<img src="/images/providers/anthropic.svg"
width="20" height="20" alt="Claude 3.7 Sonnet">
<div>
Claude 3.7 Sonnet
</div>
</div>
<div class="dropdown-item" data-model-id="anthropic/claude-opus-4.1"
data-premium="true" data-model-name="Claude Opus 4.1"
data-provider="Anthropic"
data-icon-path="/images/providers/anthropic.svg"
data-plan-type="elite">
<img src="/images/providers/anthropic.svg"
width="20" height="20" alt="Claude Opus 4.1">
<div>
Claude Opus 4.1
</div>
</div>
<div class="dropdown-item" data-model-id="anthropic/claude-sonnet-4"
data-premium="true" data-model-name="Claude Sonnet 4"
data-provider="Anthropic"
data-icon-path="/images/providers/anthropic.svg"
data-plan-type="elite">
<img src="/images/providers/anthropic.svg"
width="20" height="20" alt="Claude Sonnet 4">
<div>
Claude Sonnet 4
</div>
</div>
<div class="dropdown-item" data-model-id="google/gemini-2.5-pro"
data-premium="true" data-model-name="Gemini 2.5 Pro"
data-provider="Google"
data-icon-path="/images/providers/google.svg"
data-plan-type="elite">
<img src="/images/providers/google.svg"
width="20" height="20" alt="Gemini 2.5 Pro">
<div>
Gemini 2.5 Pro
</div>
</div>
<div class="dropdown-item" data-model-id="google/gemini-2.5-pro-preview"
data-premium="true" data-model-name="Gemini 2.5 Pro Preview"
data-provider="Google"
data-icon-path="/images/providers/google.svg"
data-plan-type="elite">
<img src="/images/providers/google.svg"
width="20" height="20" alt="Gemini 2.5 Pro Preview">
<div>
Gemini 2.5 Pro Preview
</div>
</div>
<div class="dropdown-item" data-model-id="openai/gpt-4o:extended"
data-premium="true" data-model-name="GPT-4o"
data-provider="OpenAI"
data-icon-path="/images/providers/openai.svg"
data-plan-type="elite">
<img src="/images/providers/openai.svg"
width="20" height="20" alt="GPT-4o">
<div>
GPT-4o
</div>
</div>
<div class="dropdown-item" data-model-id="openai/gpt-5"
data-premium="true" data-model-name="GPT-5"
data-provider="OpenAI"
data-icon-path="/images/providers/openai.svg"
data-plan-type="elite">
<img src="/images/providers/openai.svg"
width="20" height="20" alt="GPT-5">
<div>
GPT-5
</div>
</div>
<div class="dropdown-item" data-model-id="x-ai/grok-4"
data-premium="true" data-model-name="Grok 4"
data-provider="xAI"
data-icon-path="/images/providers/xai.svg"
data-plan-type="elite">
<img src="/images/providers/xai.svg"
width="20" height="20" alt="Grok 4">
<div>
Grok 4
</div>
</div>
<div class="dropdown-item" data-model-id="x-ai/grok-code-fast-1"
data-premium="true" data-model-name="Grok Code Fast 1"
data-provider="xAI"
data-icon-path="/images/providers/xai.svg"
data-plan-type="elite">
<img src="/images/providers/xai.svg"
width="20" height="20" alt="Grok Code Fast 1">
<div>
Grok Code Fast 1
</div>
</div>
<div class="dropdown-item" data-model-id="perplexity/sonar-reasoning"
data-premium="true" data-model-name="Perplexity: Sonar Reasoning"
data-provider="Perplexity"
data-icon-path="/images/providers/perplexity.svg"
data-plan-type="elite">
<img src="/images/providers/perplexity.svg"
width="20" height="20" alt="Perplexity: Sonar Reasoning">
<div>
Perplexity: Sonar Reasoning
</div>
</div>
<div class="dropdown-item" data-model-id="qwen/qwen3-max"
data-premium="true" data-model-name="Qwen3 Max"
data-provider="Qwen"
data-icon-path="/images/providers/qwen.svg"
data-plan-type="elite">
<img src="/images/providers/qwen.svg"
width="20" height="20" alt="Qwen3 Max">
<div>
Qwen3 Max
</div>
</div>
</div>
</div>
</div>
<!-- Mobile: single list with plan headings and all models -->
<div class="dropdown-menu ai-models-dropdown mobile-models-list">
<div class="models-heading">Basic</div>
<div class="dropdown-item" data-model-id="anthropic/claude-3.5-haiku"
data-premium="false" data-model-name="Claude"
data-provider="Anthropic" data-icon-path="/images/providers/anthropic.svg"
data-plan-type="basic">
<img src="/images/providers/anthropic.svg" width="20"
height="20" alt="Claude">
<div>
Claude
</div>
</div>
<div class="dropdown-item" data-model-id="meta-llama/llama-3.3-70b-instruct"
data-premium="false" data-model-name="Llama 3.3 70B"
data-provider="Meta" data-icon-path="/images/providers/meta.svg"
data-plan-type="basic">
<img src="/images/providers/meta.svg" width="20"
height="20" alt="Llama 3.3 70B">
<div>
Llama 3.3 70B
</div>
</div>
<div class="dropdown-item" data-model-id="qwen/qwen3-32b"
data-premium="false" data-model-name="Qwen3 32B"
data-provider="Qwen" data-icon-path="/images/providers/qwen.svg"
data-plan-type="basic">
<img src="/images/providers/qwen.svg" width="20"
height="20" alt="Qwen3 32B">
<div>
Qwen3 32B
</div>
</div>
<div class="models-heading">Pro</div>
<div class="dropdown-item" data-model-id="deepseek/deepseek-chat-v3-0324"
data-premium="true" data-model-name="DeepSeek V3"
data-provider="DeepSeek"
data-icon-path="/images/providers/deepseeks.svg" data-plan-type="pro">
<img src="/images/providers/deepseeks.svg"
width="20" height="20" alt="DeepSeek V3">
<div>
DeepSeek V3
</div>
</div>
<div class="dropdown-item" data-model-id="google/gemini-2.0-flash-001"
data-premium="true" data-model-name="Gemini 2.0 Flash"
data-provider="Google"
data-icon-path="/images/providers/google.svg" data-plan-type="pro">
<img src="/images/providers/google.svg"
width="20" height="20" alt="Gemini 2.0 Flash">
<div>
Gemini 2.0 Flash
</div>
</div>
<div class="dropdown-item" data-model-id="google/gemini-2.0-flash-lite-001"
data-premium="true" data-model-name="Gemini 2.0 Flash Lite"
data-provider="Google"
data-icon-path="/images/providers/google.svg" data-plan-type="pro">
<img src="/images/providers/google.svg"
width="20" height="20" alt="Gemini 2.0 Flash Lite">
<div>
Gemini 2.0 Flash Lite
</div>
</div>
<div class="dropdown-item" data-model-id="openai/gpt-4o-mini"
data-premium="true" data-model-name="GPT-4o-mini"
data-provider="OpenAI"
data-icon-path="/images/providers/openai.svg" data-plan-type="pro">
<img src="/images/providers/openai.svg"
width="20" height="20" alt="GPT-4o-mini">
<div>
GPT-4o-mini
</div>
</div>
<div class="dropdown-item" data-model-id="mistralai/mistral-nemo"
data-premium="true" data-model-name="Mistral Nemo"
data-provider="Mistral AI"
data-icon-path="/images/providers/mistral.svg" data-plan-type="pro">
<img src="/images/providers/mistral.svg"
width="20" height="20" alt="Mistral Nemo">
<div>
Mistral Nemo
</div>
</div>
<div class="dropdown-item" data-model-id="openrouter/sonoma-dusk-alpha"
data-premium="true" data-model-name="Sonoma Dusk Alpha"
data-provider="OpenRouter"
data-icon-path="/images/providers/openrouter.svg" data-plan-type="pro">
<img src="/images/providers/openrouter.svg"
width="20" height="20" alt="Sonoma Dusk Alpha">
<div>
Sonoma Dusk Alpha
</div>
</div>
<div class="dropdown-item" data-model-id="openrouter/sonoma-sky-alpha"
data-premium="true" data-model-name="Sonoma Sky Alpha"
data-provider="OpenRouter"
data-icon-path="/images/providers/openrouter.svg" data-plan-type="pro">
<img src="/images/providers/openrouter.svg"
width="20" height="20" alt="Sonoma Sky Alpha">
<div>
Sonoma Sky Alpha
</div>
</div>
<div class="models-heading">Premium</div>
<div class="dropdown-item"
data-model-id="anthropic/claude-3.5-sonnet"
data-premium="true"
data-model-name="Claude 3.5 Sonnet"
data-provider="Anthropic"
data-icon-path="/images/providers/anthropic.svg"
data-plan-type="premium">
<img
src="/images/providers/anthropic.svg" width="20"
height="20" alt="Claude 3.5 Sonnet">
<div>
Claude 3.5 Sonnet
</div>
</div>
<div class="dropdown-item"
data-model-id="deepseek/deepseek-r1-0528"
data-premium="true"
data-model-name="DeepSeek R1 0528"
data-provider="DeepSeek"
data-icon-path="/images/providers/deepseeks.svg"
data-plan-type="premium">
<img
src="/images/providers/deepseeks.svg" width="20"
height="20" alt="DeepSeek R1 0528">
<div>
DeepSeek R1 0528
</div>
</div>
<div class="dropdown-item"
data-model-id="google/gemini-2.5-flash-preview"
data-premium="true"
data-model-name="Gemini 2.5 Flash Preview"
data-provider="Google"
data-icon-path="/images/providers/google.svg"
data-plan-type="premium">
<img
src="/images/providers/google.svg" width="20"
height="20" alt="Gemini 2.5 Flash Preview">
<div>
Gemini 2.5 Flash Preview
</div>
</div>
<div class="dropdown-item"
data-model-id="openai/gpt-4.1-mini"
data-premium="true"
data-model-name="GPT-4.1 Mini"
data-provider="OpenAI"
data-icon-path="/images/providers/openai.svg"
data-plan-type="premium">
<img
src="/images/providers/openai.svg" width="20"
height="20" alt="GPT-4.1 Mini">
<div>
GPT-4.1 Mini
</div>
</div>
<div class="dropdown-item"
data-model-id="moonshotai/kimi-k2-0905"
data-premium="true"
data-model-name="Kimi K2"
data-provider="Moonshot AI"
data-icon-path="/images/providers/moonshotai.svg"
data-plan-type="premium">
<img
src="/images/providers/moonshotai.svg" width="20"
height="20" alt="Kimi K2">
<div>
Kimi K2
</div>
</div>
<div class="models-heading">Elite</div>
<div class="dropdown-item"
data-model-id="anthropic/claude-3.7-sonnet"
data-premium="true"
data-model-name="Claude 3.7 Sonnet"
data-provider="Anthropic"
data-icon-path="/images/providers/anthropic.svg"
data-plan-type="elite">
<img
src="/images/providers/anthropic.svg"
width="20" height="20"
alt="Claude 3.7 Sonnet">
<div>
Claude 3.7 Sonnet
</div>
</div>
<div class="dropdown-item"
data-model-id="anthropic/claude-opus-4.1"
data-premium="true"
data-model-name="Claude Opus 4.1"
data-provider="Anthropic"
data-icon-path="/images/providers/anthropic.svg"
data-plan-type="elite">
<img
src="/images/providers/anthropic.svg"
width="20" height="20"
alt="Claude Opus 4.1">
<div>
Claude Opus 4.1
</div>
</div>
<div class="dropdown-item"
data-model-id="anthropic/claude-sonnet-4"
data-premium="true"
data-model-name="Claude Sonnet 4"
data-provider="Anthropic"
data-icon-path="/images/providers/anthropic.svg"
data-plan-type="elite">
<img
src="/images/providers/anthropic.svg"
width="20" height="20"
alt="Claude Sonnet 4">
<div>
Claude Sonnet 4
</div>
</div>
<div class="dropdown-item"
data-model-id="google/gemini-2.5-pro"
data-premium="true"
data-model-name="Gemini 2.5 Pro"
data-provider="Google"
data-icon-path="/images/providers/google.svg"
data-plan-type="elite">
<img
src="/images/providers/google.svg"
width="20" height="20"
alt="Gemini 2.5 Pro">
<div>
Gemini 2.5 Pro
</div>
</div>
<div class="dropdown-item"
data-model-id="google/gemini-2.5-pro-preview"
data-premium="true"
data-model-name="Gemini 2.5 Pro Preview"
data-provider="Google"
data-icon-path="/images/providers/google.svg"
data-plan-type="elite">
<img
src="/images/providers/google.svg"
width="20" height="20"
alt="Gemini 2.5 Pro Preview">
<div>
Gemini 2.5 Pro Preview
</div>
</div>
<div class="dropdown-item"
data-model-id="openai/gpt-4o:extended"
data-premium="true"
data-model-name="GPT-4o"
data-provider="OpenAI"
data-icon-path="/images/providers/openai.svg"
data-plan-type="elite">
<img
src="/images/providers/openai.svg"
width="20" height="20"
alt="GPT-4o">
<div>
GPT-4o
</div>
</div>
<div class="dropdown-item"
data-model-id="openai/gpt-5"
data-premium="true"
data-model-name="GPT-5"
data-provider="OpenAI"
data-icon-path="/images/providers/openai.svg"
data-plan-type="elite">
<img
src="/images/providers/openai.svg"
width="20" height="20"
alt="GPT-5">
<div>
GPT-5
</div>
</div>
<div class="dropdown-item"
data-model-id="x-ai/grok-4"
data-premium="true"
data-model-name="Grok 4"
data-provider="xAI"
data-icon-path="/images/providers/xai.svg"
data-plan-type="elite">
<img
src="/images/providers/xai.svg"
width="20" height="20"
alt="Grok 4">
<div>
Grok 4
</div>
</div>
<div class="dropdown-item"
data-model-id="x-ai/grok-code-fast-1"
data-premium="true"
data-model-name="Grok Code Fast 1"
data-provider="xAI"
data-icon-path="/images/providers/xai.svg"
data-plan-type="elite">
<img
src="/images/providers/xai.svg"
width="20" height="20"
alt="Grok Code Fast 1">
<div>
Grok Code Fast 1
</div>
</div>
<div class="dropdown-item"
data-model-id="perplexity/sonar-reasoning"
data-premium="true"
data-model-name="Perplexity: Sonar Reasoning"
data-provider="Perplexity"
data-icon-path="/images/providers/perplexity.svg"
data-plan-type="elite">
<img
src="/images/providers/perplexity.svg"
width="20" height="20"
alt="Perplexity: Sonar Reasoning">
<div>
Perplexity: Sonar Reasoning
</div>
</div>
<div class="dropdown-item"
data-model-id="qwen/qwen3-max"
data-premium="true"
data-model-name="Qwen3 Max"
data-provider="Qwen"
data-icon-path="/images/providers/qwen.svg"
data-plan-type="elite">
<img
src="/images/providers/qwen.svg"
width="20" height="20"
alt="Qwen3 Max">
<div>
Qwen3 Max
</div>
</div>
</div>
</div>
</div>
<div class="action-right">
<button id="homeChatSubmit" class="dropdown-button"
aria-label="Submit your question">
<div class="icon">
<svg width="20" height="20" viewBox="0 0 20 20" fill="none"
xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_924_75)">
<path d="M10 4.16663V15.8333" stroke="white" stroke-width="1.5"
stroke-linecap="round" stroke-linejoin="round" />
<path d="M15 9.16663L10 4.16663" stroke="white" stroke-width="1.5"
stroke-linecap="round" stroke-linejoin="round" />
<path d="M5 9.16663L10 4.16663" stroke="white" stroke-width="1.5"
stroke-linecap="round" stroke-linejoin="round" />
</g>
<defs>
<clipPath id="clip0_924_75">
<rect width="20" height="20" fill="white" />
</clipPath>
</defs>
</svg>
</div>
</button>
</div>
</div>
</div>
</div>
<div class="popular-tools">
<ul>
<li class="">
<a href="https://logicballs.com/tools/paraphrasing-tool">
Paraphrasing Tool
</a>
</li>
<li class="">
<a href="https://logicballs.com/tools/email-writer-and-generator">
Email Writer & Generator
</a>
</li>
<li class="">
<a href="https://logicballs.com/tools/amazon-product-description-generator">
Amazon Product Description Generator
</a>
</li>
<li class="">
<a href="https://logicballs.com/tools/headline-generator">
Headline Generator
</a>
</li>
<li class="hidden-mobile">
<a href="https://logicballs.com/tools/ai-twitch-stream-title-generator">
AI Twitch Stream Title Generator
</a>
</li>
<li class="hidden-mobile">
<a href="https://logicballs.com/tools/amazon-product-title-generator">
Amazon Product Title Generator
</a>
</li>
<li class="hidden-mobile">
<a href="https://logicballs.com/tools/chat-reply-writer">
Chat Reply Writer
</a>
</li>
<li>
<a
href="https://logicballs.com/browse-ai-tools">
All Categories
</a>
</li>
</ul>
</div>
</div>
</section>
</main>
<div id="model_stripe_modal" class="pricingModal modal modal-new pricing-modal" open="" style="display: none">
<div id="model-modal-inside" class="modal-box limit-exceed">
<form method="dialog">
<button id="modelCloseBtn" class="btn btn-circle btn-sm btn-ghost absolute right-2 top-2 rounded-full">
✕
</button>
</form>
<div style="display: none;" id="model-error-div" class="error">
<p id="model-error-message">Error message</p>
</div>
<div class="modal-container">
<div class="modal-head">
<h2>10x your writing output @ 1/4 price of ChatGPT <span>($200/month)</span></h2>
</div>
<div class="modal-body">
<div class="plan-yearly">
<div class="plan-header">
<div class="guarantee">
<p>Enjoy a
<span class="bg-highlight">7-Day Money-Back Guarantee</span>
Without Question.
</p>
</div>
<div class="pricing">
<div class="pricing-card">
<ul class="features pricing-list">
<li>AI Agents for deep research like human</li>
<li>Premium AI models (ChatGPT 4, Claude Sonnet etc.)</li>
<li>2000+ Premium AI Tools and AI Agents</li>
</ul>
</div>
</div>
</div>
<div class="plan-section short-term">
<div class="price">
<div class="offer text-blue-700 font-semibold">
<s class="text-gray-500 font-normal model-original-price">$240</s>
<div class="gradient">75% Off</div>
</div>
<b>
<div class="gradient model-monthly-price">$4.99</div>
<span class="text-gray-500 font-normal gradient">/month</span>
</b>
<p class="yearly model-yearly-billing">Billed $59.99/year</p>
</div>
<div>
<a href="/auth?return_to=https%3A%2F%2Flogicballs.com%2F?price_id=price_1PHluTD2JaitlRcw865YZ5uG"
class="btn btn-gradient model-auth-link">
Upgrade Now
</a>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<script>
// Close button handler
document.getElementById("modelCloseBtn").addEventListener("click", function (e) {
closeModelPopup();
e.preventDefault(); // Prevent any form submission
e.stopPropagation();
});
// ✅ Updated: Close when clicking outside modal content
document.addEventListener('click', function(e) {
const modal = document.getElementById('model_stripe_modal');
const insideModal = e.target.closest('.modal-box');
if (modal.style.display === 'grid' && !insideModal) {
closeModelPopup();
}
});
// Close popup on Escape key
document.addEventListener('keydown', function(e) {
const modal = document.getElementById('model_stripe_modal');
if (e.key === 'Escape' && modal.style.display === 'grid') {
closeModelPopup();
}
});
function closeModelPopup() {
const errorDiv = document.getElementById('model-error-div');
const modal = document.getElementById('model_stripe_modal');
if (errorDiv) errorDiv.style.display = 'none';
if (modal) modal.style.display = 'none';
}
function handleModelSubscription(button) {
const yearlyPriceId = button.getAttribute('data-yearly-price-id');
const monthlyPriceId = button.getAttribute('data-monthly-price-id');
if (typeof YearlySubscription === 'function') {
YearlySubscription(yearlyPriceId, monthlyPriceId);
}
}
function updateModelPrices(planType) {
const priceData = {
pro: {
yearlyPrice: '$59.9/year',
monthlyPrice: '$5',
yearlyPriceId: 'price_1PHluTD2JaitlRcw865YZ5uG',
monthlyPriceId: 'price_1PH474D2JaitlRcw7k2LZ1oT',
yearlyBillingText: 'Billed $59.9/year'
},
premium: {
yearlyPrice: '$99/year',
monthlyPrice: '$8.25',
yearlyPriceId: 'price_1P65sRD2JaitlRcw295gmUjF',
monthlyPriceId: '',
yearlyBillingText: 'Billed $99/year'
},
elite: {
yearlyPrice: '$139.9/year',
monthlyPrice: '$11.67',
yearlyPriceId: 'price_1RL0vTD2JaitlRcwXVr04220',
monthlyPriceId: 'price_1RL0x3D2JaitlRcwrzIfdYnG',
yearlyBillingText: 'Billed $139.9/year'
}
};
const selectedPlan = priceData[planType] || priceData.pro;
const monthlyPrice = document.querySelector('.model-monthly-price');
const yearlyBilling = document.querySelector('.model-yearly-billing');
const upgradeBtn = document.querySelector('.model-upgrade-btn');
const authLink = document.querySelector('.model-auth-link');
if (monthlyPrice) monthlyPrice.textContent = selectedPlan.monthlyPrice;
if (yearlyBilling) yearlyBilling.textContent = selectedPlan.yearlyBillingText;
if (upgradeBtn) {
upgradeBtn.setAttribute('data-yearly-price-id', selectedPlan.yearlyPriceId);
upgradeBtn.setAttribute('data-monthly-price-id', selectedPlan.monthlyPriceId);
}
if (authLink) {
const baseUrl = '/auth?return_to=' + encodeURIComponent('https://logicballs.com/');
authLink.href = `${baseUrl}?price_id=${selectedPlan.yearlyPriceId}`;
}
}
function showModelStripePopup(planType) {
const modal = document.getElementById('model_stripe_modal');
if (modal) {
updateModelPrices(planType);
modal.style.display = 'grid';
}
}
</script>
<div id="toast" class="toast"></div>
<div id="my_modal_12" class="pricingModal modal modal-new refer-modal" open="" style="display: none">
<div id="inside-modal12" class="modal-box limit-exceed">
<form method="dialog">
<button id="closeBtn12" class="btn btn-circle btn-sm btn-ghost absolute right-2 top-2 rounded-full">
✕
</button>
</form>
<div class="modal-container">
<div class="modal-head">
<h2>Refer a friend to get free subscription</h2>
</div>
<div class="modal-body">
<div class="refer-box">
<div class="top-row row">
<div class="box box1">
<div class="icon"> </div>
<div>
<div class="plan">25 Sign up</div>
<div class="subscription">Earn 1 Year Pro</div>
</div>
</div>
<div class="box box2">
<div class="icon"> </div>
<div>
<div class="plan">12 Sign up</div>
<div class="subscription">Earn 4 Month Pro</div>
</div>
</div>
</div>
<div class="bottom-row row">
<div class="box box3">
<div class="icon"> </div>
<div>
<div class="plan">9 Sign up</div>
<div class="subscription">Earn 3 Month Pro</div>
</div>
</div>
<div class="box box4">
<div class="icon"> </div>
<div>
<div class="plan">6 Sign up</div>
<div class="subscription">Earn 2 Month Pro</div>
</div>
</div>
<div class="box box4">
<div class="icon"> </div>
<div>
<div class="plan">3 Sign up</div>
<div class="subscription">Earn 1 Month Pro</div>
</div>
</div>
</div>
</div>
<div class="referel-info">
<div class="subheading">
Share the following link with your friends. You can get free subscription if they sign up or subscribe through this link.
</div>
<div class="form" id="tool-form">
<div class=" form-group">
<input id="refer-link-share" type="text" value="https://logicballs.com/?invite_code=l3Nlqm" aria-label="Referral link">
</div>
<button class="btn btn-gradient" id="refer-button-copy">Copy link</button>
</div>
</div>
</div>
</div>
</div>
</div>
<script>
document.getElementById("closeBtn12").addEventListener("click", function () {
document.getElementById("my_modal_12").style.display = "none";
});
</script>
<div id="my_modal_11" class="pricingModal modal modal-new pricing-modal" open="" style="display: none">
<div id="inside-modal1" class="modal-box limit-exceed">
<form method="dialog">
<button id="closeBtn1" class="btn btn-circle btn-sm btn-ghost absolute right-2 top-2 rounded-full">
✕
</button>
</form>
<div style="display: none;" id="error-div" class="error">
<p id="error-message-print">Error message</p>
</div>
<div class="modal-container">
<div class="modal-head">
<h2>10x your writing output @ 1/4 price of ChatGPT <span>($200/month)</span></h2>
</div>
<div class="modal-body">
<div class="plan-yearly">
<div class="plan-header">
<div class="guarantee">
<p>Enjoy a <span class="bg-highlight">7-Day Money-Back Guarantee</span> Without Question.</p>
</div>
<div class="pricing">
<div class="pricing-card">
<ul class="features pricing-list">
<li>AI Agents for deep research like human</li>
<li>Premium AI models (ChatGPT 4, Claude Sonnet etc.)</li>
<li>2000+ Premium AI Tools and AI Agents</li>
</ul>
</div>
</div>
</div>
<div class="plan-section short-term">
<div class="price">
<div class="offer text-blue-700 font-semibold">
<s class="text-gray-500 font-normal">$240</s>
<div class="gradient">75% Off</div>
</div>
<b>
<div class="gradient">$4.99</div>
<span class="text-gray-500 font-normal gradient">/month</span>
</b>
<p class="yearly">Billed $59.99/year</p>
</div>
<div>
<a href="/auth?return_to=https%3A%2F%2Flogicballs.com%2F?price_id=price_1PHluTD2JaitlRcw865YZ5uG" class="btn btn-gradient">
Upgrade Now
</a>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<script>
document.getElementById("closeBtn1").addEventListener("click", function () {
const errorDiv = document.getElementById("error-div");
if (errorDiv) {
errorDiv.style.display = "none";
}
if (document.getElementById("my_modal_11")) {
document.getElementById("my_modal_11").style.display = "none";
}
const userAuth = 'false';
if (userAuth == 'true') {
window.handleReferral();
}
});
</script>
<footer class="footer-v1 bg-gray" role="contentinfo">
<section class="footer-section bottom">
<div>
<div class="section-05">
<div class="copyright">
<p>Made with ❤️ for everyone | © LogicBalls 2025 - All Rights Reserved</p>
</div>
<ul class="link">
<li>
<a href="https://logicballs.com/about">About</a>
</li>
<li>
<a href="https://logicballs.com/blog">Our Blog</a>
</li>
<li>
<a href="https://logicballs.com/privacy">Privacy</a>
</li>
<li>
<a href="https://logicballs.com/terms">Terms</a>
</li>
</ul>
</div>
</div>
</section>
</footer>
<div class="custom-search hidden" id="my-hidden-element">
<div class="search-wrap">
<div id="searchbox"></div>
<button id="hide-button" class="close">
<span>✕</span>
<span>Close</span>
</button>
<button id="filterElementsToggle" class="btn btn-primary btn-md">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none"
stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"
class="icon-tabler-adjustments">
<path stroke="none" d="M0 0h24v24H0z" fill="none" />
<path d="M14 6m-2 0a2 2 0 1 0 4 0a2 2 0 1 0 -4 0" />
<path d="M4 6l8 0" />
<path d="M16 6l4 0" />
<path d="M8 12m-2 0a2 2 0 1 0 4 0a2 2 0 1 0 -4 0" />
<path d="M4 12l2 0" />
<path d="M10 12l10 0" />
<path d="M17 18m-2 0a2 2 0 1 0 4 0a2 2 0 1 0 -4 0" />
<path d="M4 18l11 0" />
<path d="M19 18l1 0" />
</svg>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none"
stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"
class="icon-tabler-x">
<path stroke="none" d="M0 0h24v24H0z" fill="none" />
<path d="M18 6l-12 12" />
<path d="M6 6l12 12" />
</svg>
</button>
</div>
<div>
<div class="custom-search-wrap">
<div class="filter hidden" id="filterElements">
<div id="tags-refinement-list"></div>
<div id="category-refinement-list"></div>
</div>
<div class="result">
<div id="hits"></div>
<div id="pagination"></div>
</div>
</div>
</div>
</div>
<script>
// Search lazy loader utility - only declare if not already defined
if (typeof window.SearchLazyLoader === 'undefined') {
window.SearchLazyLoader = {
loaded: false,
loading: false,
loadPromise: null,
async loadScripts() {
if (this.loaded) return Promise.resolve();
if (this.loading) return this.loadPromise;
this.loading = true;
this.loadPromise = new Promise((resolve, reject) => {
let scriptsToLoad = 2;
let scriptsLoaded = 0;
const onScriptLoad = () => {
scriptsLoaded++;
if (scriptsLoaded === scriptsToLoad) {
this.loaded = true;
this.loading = false;
resolve();
}
};
const onScriptError = (error) => {
this.loading = false;
reject(error);
};
// Load Typesense InstantSearch Adapter
const script1 = document.createElement('script');
script1.src = 'https://cdn.jsdelivr.net/npm/typesense-instantsearch-adapter@2/dist/typesense-instantsearch-adapter.min.js';
script1.crossOrigin = 'anonymous';
script1.onload = onScriptLoad;
script1.onerror = onScriptError;
document.head.appendChild(script1);
// Load InstantSearch.js
const script2 = document.createElement('script');
script2.src = 'https://cdn.jsdelivr.net/npm/instantsearch.js@4.71.1/dist/instantsearch.production.min.js';
script2.crossOrigin = 'anonymous';
script2.onload = onScriptLoad;
script2.onerror = onScriptError;
document.head.appendChild(script2);
});
return this.loadPromise;
}
};
}
// Wait for scripts to load before initializing - only declare if not already defined
if (typeof window.initializeSearch === 'undefined') {
window.initializeSearch = async function() {
try {
// Load search scripts first
await window.SearchLazyLoader.loadScripts();
// Check if libraries are available
if (typeof instantsearch === 'undefined' || typeof TypesenseInstantSearchAdapter === 'undefined') {
console.error('Search libraries failed to load');
return;
}
} catch (error) {
console.error('Failed to load search scripts:', error);
return;
}
var { searchBox } = instantsearch.widgets;
const { hits, sortBy, refinementList } = instantsearch.widgets;
const { dynamicWidgets, menu, hierarchicalMenu, pagination, trendingItems } = instantsearch.widgets;
const common = {"footer":{"links":{"about":"About","terms":"Terms","privacy":"Privacy"},"badges":{"easyToUse":"Easy to Use","lightningFast":"Lightning Fast","safeAndSecure":"Safe & Secure","happyCustomers":"200K+ Happy Customers"},"labels":{"new":"New"},"sections":{"moreAI":{"links":{"imageAI":"Image AI Agents - Smart image tools","securePDF":"Secure PDF - Protect your documents","socialMediaAI":"Social Media AI Agent - Craft engaging posts","passwordLessAI":"Passwordless API for AI - Secure & Fast Auth","aiAgentsForRetail":"AI Agents for Retail - Boost your sales","generativeVoiceAI":"Generative Voice AI - Create natural speech","productLaunchDirectory":"Product Launch Directory - Launch smarter","cybersecurityMarketingAI":"AI-Powered Growth Engine Builds AI + pSEO Portals"},"title":" Featured Partners"},"community":{"links":{"blog":"Our Blog","forum":"Community Forum","media":"Media","tones":"Tones","aiNews":"AI News","aiModels":"Explore AI Models","questions":"Questions","aiGlossary":"AI Glossary","writeforUS":"Write for Us","successStories":"Success Stories","exploreAppPacks":"Explore Our App Packs","earnWithLogicBalls":"Earn With LogicBalls","backlinkPartnership":"Advertise with Us"},"title":"Join Our Community"},"comparisons":{"links":{"viewAll":"View all comparisons","vsCopyAI":"LogicBalls vs Copy AI - Better for writing?","vsChatGPT":"LogicBalls vs ChatGPT - What's different?","vsGoogleBard":"LogicBalls vs Bard - Which is easier?"},"title":"See How We Compare"},"popularTools":{"links":{"chatbot":"Chatbot","aiAgents":"AI Agents","characters":"Characters","translator":"Translator","aiImageEdit":"AI Image Edit","tripPlanner":"Trip Planner","wordCounter":"Word Counter","aiFactChecker":"AI Fact Checker","chat_with_pdf":"Chat with PDF","imageGenerator":"Image Generator","LLMTxtGenerator":"LLMs.Txt Generator","aiToolDirectory":"AI Tool Directory","videoSummarizer":"YouTube Video Summarizer","aiVoiceGenerator":"AI Voice Generator","ai_prompt_builder":"AI Prompt Builder","youtubeTranscript":"YouTube Transcript Generator","chatWithYoutubeVideo":"Chat with YouTube Video"},"title":"Popular Tools"}},"copyright":{"logicBalls":"LogicBalls","madeWithLove":"Made with ❤️ for everyone","allRightsReserved":"All Rights Reserved"},"ctaSection":{"title":"Make AI Work For You","buttonText":"Try Now -->","description":"Join over 200,000+ customers who use LogicBalls to write, create, and get more done with AI - no tech skills needed!"},"trustedPartners":{"title":"Trusted Partners & Compliance"}},"header":{"earn":"Earn","logo":{"alt":"LogicBalls","title":"LogicBalls"},"search":{"askAI":"Ask AI ","placeholde2":"Try 'tool for writing a professional email'... ","placeholder":"Search","thinkingText":"AI is Thinking","errormessage1":"Please enter at least 2 characters to search...","errormessage2":"I couldn't find any tools matching your search. Try describing your task differently, for example 'create marketing content' instead of just 'marketing'.","errormessage3":"No tools found matching your search","errormessage4":"Sorry, I encountered an error while searching. Please try again or rephrase your search.","errormessage5":"An error occurred while searching. Please try again.","errormessage6":"Sorry, something went wrong. Please try again in a moment."},"navigation":{"userMenu":{"auth":{"login":"Login / Signup","logout":"Logout","dashboard":"Dashboard"},"links":{"tags":"Tags","pricing":"Pricing","support":"Contact us","categories":"Categories","comparison":"Comparison","referFriend":"Refer a friend"}}},"write_for_us":"Write for us"},"submit":"Submit","clickUP":{"try_next":"Try Next","get_started_free":"Get Started Free","streamline_your_projects":"Streamline Your Projects"},"competitor":{"title":"Why LogicBalls is the Best AI Writer & Copywriting Assistant","features":[{"title":"Best Output Quality","description":"We harness the power of GPT-3.5, GPT-4, and LLMs like BARD, LlaMA, and Cohere, combined with our proprietary layer of best practices and templates, to eliminate grammatical errors and infuse vibrancy into the language."},{"title":"Tailored to Your Writing Needs","description":"No matter the style, tone, or context you require, LogicBalls adapts seamlessly to meet your unique writing demands. LogicBalls versatility ensures your content stands out in any domain."},{"title":"Embrace the Future of Writing","description":"Stay ahead of the curve with LogicBalls - your gateway to the future of writing. As AI technology continues to evolve, so does our platform, ensuring you always have access to the latest innovations in AI-driven content creation."},{"title":"Enhance Your Brand Voice","description":"At LogicBalls, we understand the essence of brand identity. Our AI writer not only maintains consistency with your brand's unique voice but also enriches it with fresh perspectives and creative flair. Let LogicBalls be your trusted partner in crafting compelling narratives that resonate with your target audience."},{"title":"Super Affordable","description":"LogicBalls has a Free Forever plan, which will stay free. And premium starts with $19/m for unlimited usage, LogicBalls offers one of the most cost-effective solutions in the market that gives you complete value for money."}]},"referPopup":{"title":"Refer a friend to get free subscription","rewards":{"yearPro":{"reward":"Earn 1 Year Pro","signups":"25 Sign up"},"oneMonthPro":{"reward":"Earn 1 Month Pro","signups":"3 Sign up"},"twoMonthPro":{"reward":"Earn 2 Month Pro","signups":"6 Sign up"},"fourMonthPro":{"reward":"Earn 4 Month Pro","signups":"12 Sign up"},"threeMonthPro":{"reward":"Earn 3 Month Pro","signups":"9 Sign up"}},"referralInfo":{"copyButton":"Copy link","description":"Share the following link with your friends. You can get free subscription if they sign up or subscribe through this link."}},"Translation":"Translation","competitors":{"competitorsCard":{"title1":"Best","title2":"Alternatives & Competitors 2025","metaDescription1":"Looking for an alternative to ","metaDescription2":"? Explore our extensive list of ","metaDescription3":" alternatives to choose the best one for your needs."},"competitorsPage":{"title":"LogicBalls Comparison: Compare Top AI Writing Tools","linkText":" Here is an in-depth post we published recently about the best","alternative":"alternatives","metaDescription":"Comparisons of the top AI writing tools to help you decide which AI writing software is best for your content needs."}},"stripePopup":{"feature_1":"AI Agents for deep research like human","feature_2":"Premium AI models (ChatGPT 4, Claude Sonnet etc.)","feature_3":"2000+ Premium AI Tools and AI Agents","price_period":"/month","refer_button":"Refer a Friend","discount_text":"75% Off","modal_heading":"10x your writing output @ 1/4 price of ChatGPT","monthly_price":"$4.99","guarantee_span":"7-Day Money-Back Guarantee","guarantee_text":"Enjoy a","upgrade_button":"Upgrade Now","dropdown_default":"1 Day","dropdown_option_1":"1 Day","dropdown_option_2":"2 Days","dropdown_option_3":"7 Days","dropdown_option_4":"1 Month","guarantee_text_end":"Without Question.","modal_heading_span":"($200/month)","error_message_print":"Error message","price_strikethrough":"$240","yearly_billing_text":"Billed $59.99/year"},"Alternatives":{"AlternativesCard":{"title1":"Best","title2":"Alternatives & Competitors 2025","metaDescription1":"Looking for an alternative to ","metaDescription2":"? Explore our extensive list of ","metaDescription3":" alternatives to choose the best one for your needs."},"AlternativesPage":{"title":"The Best AI Writer Alternatives","metaDescription":"Looking for a free AI writer? Look no further than LogicBalls! We offer Unlimited words with 200+ AI templates at 5x lesser cost than our competitors."}},"testimonials":{"title":"See What Our Happy Customers Are Saying","metaTitle":"Testimonial - LogicBalls","description":"Trust their words, not just ours","toolOgTitle":"FREE AI Apps & Tools for Every Need | No Login Required","metaDescription":"Read genuine testimonials from our satisfied customers and learn how our products/services have transformed their lives and businesses. Real stories of success and satisfaction."},"chatinterface":{"heading":"Write Something Cool","paragraph":"Explore the First-Ever Visual ChatGPT Platform","placeholder":"Ask LogicBalls to 'Writing a professional email'","allCategories":{"name":"All Categories","slug":"browse-ai-tools"},"popular_tools":[{"name":"Paraphrasing Tool","slug":"tools/paraphrasing-tool"},{"name":"Email Writer & Generator","slug":"tools/email-writer-and-generator"},{"name":"Amazon Product Description Generator","slug":"tools/amazon-product-description-generator"},{"name":"Headline Generator","slug":"tools/headline-generator"},{"name":"AI Twitch Stream Title Generator","slug":"tools/ai-twitch-stream-title-generator"},{"name":"Amazon Product Title Generator","slug":"tools/amazon-product-title-generator"},{"name":"Chat Reply Writer","slug":"tools/chat-reply-writer"}]},"breadcrumbText":{"auth":"Auth","chat":"Chat","home":"Home","tags":"Tags","about":"About","terms":"Terms","tones":"Tones","tools":"Tools","pricing":"Pricing","privacy":"Privacy","academia":"Academia","ai-agents":"AI Agents","ai-images":"AI Images","translate":"Translate","categories":"Categories","comparison":"Comparison","affiliation":"Affiliation","discover-ai":"Discover AI","testimonial":"Testimonial","alternatives":"Alternatives","trip-planner":"Trip Planner","word-counter":"Word Counter","write-for-us":"Write for Us","chat-with-pdf":"Chat with PDF","academia/advisors":"Academic Advisors","chat-youtube-video":"Chat with YouTube Video","ai-answer-generator":"AI Answer Generator","earn-with-logicballs":"Earn with LogicBalls","agent/ai-fact-checker":"AI Fact Checker","agent/keywords-generator":"Keywords Generator","youtube-video-summarizer":"YouTube Video Summarizer","youtube-transcript-generator":"YouTube Transcript Generator"},"newReferPopup ":{"subtitle":"Share the power of our tools with friends and get rewarded!","bonusText":"🎉 Already a subscriber? Get a BONUS year added to your current plan when your friends join!","popupTitle":"Unlock Your FREE Year of Premium Access! 🎁","planCategories":[{"name":"Pro Plan","badge":"Most Popular","price":"$59","buttonText":"Copy Referral Link","description":"Refer 2 friends to our Pro plan and unlock a FULL YEAR of premium access absolutely FREE!"},{"name":"Premium Plan","badge":"Premium Choice","price":"$99","buttonText":"Copy Referral Link","description":"Refer 2 friends to our Premium plan and enjoy a FULL YEAR of our top-tier features FREE!"}]},"tryPremiumPopup":{"title":"Compare our Premium Output","Answer":"Answer","buttons":{"upgrade":"Upgrade Now"},"Question":"Question","comparison":{"free":{"title":"Free","example":{"answer":{"intro":"To improve your website's SEO:","points":["Use relevant keywords in your content.","Optimize meta titles and descriptions.","Build quality backlinks.","Ensure your website is mobile-friendly and has a fast loading speed."]},"question":"How can I improve website SEO?"}},"premium":{"title":"✨ Premium","example":{"answer":{"intro":"Improving your website's SEO involves a strategic approach tailored to your audience and goals. Here's a detailed guide:","points":[{"title":"Keyword Research","content":"Use tools like Ahrefs or SEMrush to find high-traffic, low-competition keywords. For instance, target long-tail keywords like \"best eco-friendly coffee brands\" for niche traffic."},{"title":"Content Optimization","content":"Write engaging content around these keywords. Include keywords in headers, body text, and alt text for images while maintaining natural readability."},{"title":"Technical SEO","content":"Ensure mobile-friendliness, optimize page speed, and implement schema markup effectively."},{"title":"Link Building","content":"Focus on quality over quantity. Reach out to authority websites for guest posting or create shareable content like infographics."},{"title":"Regular Audits","content":"Use tools like Screaming Frog to identify broken links, duplicate content, and crawl issues."}]},"question":"How can I improve website SEO?"}}}},"randomTestimonials":{"title":"See What Our Happy Customers Are Saying","viewAlltext":"View all testimonial"}};
const language = "en";
const tomorrow = new Date();
tomorrow.setDate(tomorrow.getDate() + 1);
const unixTimestamp = tomorrow.getTime(); // Get time in milliseconds
// Function to convert absolute URL to relative path and then to current host
// Function to convert absolute URL to relative path and then to current host
function convertUrlToCurrentHost(originalUrl) {
try {
const url = new URL(originalUrl);
const pathname = url.pathname;
const currentProtocol = window.location.protocol;
const currentHost = window.location.host;
return currentProtocol + '//' + currentHost + pathname;
} catch (e) {
// If URL parsing fails, return original URL
return originalUrl;
}
}
const typesenseInstantsearchAdapter = new TypesenseInstantSearchAdapter({
server: {
nodes: [{
host: 'typesense.logicballs.com',
protocol: 'https'
}],
apiKey: '=&9Yl?_vO{iOW.Tx',
connectionTimeoutSeconds: 5,
cacheSearchResultsForSeconds: 2 * 60
},
additionalSearchParameters: {
query_by: "name,category,tags", // Search primarily in name field
sort_by: "order:asc,_text_match:desc", // Sort by text match score
prefix: true,
filter_by: `publishDate:<${unixTimestamp}`,
per_page: 9,
typo_tolerance_enabled: true,
num_typos: 1, // Reduced typo tolerance for more accurate matching
highlight_full_fields: "name",
token_ranking_type: "position", // Prioritize matches based on position in text
prioritize_token_position: true, // This should help prioritize matches at start of name
exhaustive_search: true
}
});
const searchClient = typesenseInstantsearchAdapter.searchClient;
let dataIndex = 'logicballs-frontend-' + language
if(window.location.hostname == 'logicballs.com') {
dataIndex = 'logicballs-frontend-' + language
}
const search = instantsearch({
searchClient,
indexName: dataIndex,
});
// Make search globally accessible
window.search = search;
search.addWidgets([
searchBox({
container: "#searchbox",
placeholder: common?.header?.search?.placeholder ,
autofocus: true,
showLoadingIndicator: true,
cssClasses: {
input: "ais-SearchBox-input tool-search" // ← won’t help with `id`
},
}),
hits({
container: "#hits",
transformItems(items) {
return items.map(item => ({
...item,
dynamicUrl: convertUrlToCurrentHost(item.url)
}));
},
templates: {
item: `
<div class="hit-name ">
<div class="category">
<a href="{{dynamicUrl}}" class="new-tag">{{#helpers.highlight}}{ "attribute": "category" }{{/helpers.highlight}} </a>
</div>
<div class="tooltitle">
<a href="{{dynamicUrl}}">{{#helpers.highlight}}{ "attribute": "name" }{{/helpers.highlight}}</a>
</div>
<div class="tags">
<ul><li>{{tags.0}}</li><li>{{tags.1}}</li><li>{{tags.2}}</li><li>{{tags.3}}</li><li>{{tags.4}}</li><li>{{tags.5}}</li></ul>
</div>
</div>
`,
},
}),
pagination({
container: '#pagination'
}),
refinementList({
container: "#category-refinement-list",
attribute: "category",
searchable: true,
searchablePlaceholder: "Search Categories",
showMore: true,
showMoreLimit: 40,
cssClasses: {
searchableInput: "form-control form-control-sm mb-2 border-light-2",
searchableSubmit: "d-none",
searchableReset: "d-none",
showMore: "btn btn-outline btn-sm",
list: "list-unstyled",
count: "badge badge-light bg-light-2 ml-2",
label: "d-flex align-items-center text-capitalize",
checkbox: "mr-2",
},
}),
refinementList({
container: "#tags-refinement-list",
attribute: "tags",
searchable: true,
searchablePlaceholder: "Search Tags",
showMore: true,
showMoreLimit: 40,
cssClasses: {
searchableInput: "form-control form-control-sm mb-2 border-light-2",
searchableSubmit: "d-none",
searchableReset: "d-none",
showMore: "btn btn-outline btn-sm",
list: "list-unstyled",
count: "badge badge-light bg-light-2 ml-2",
label: "d-flex align-items-center text-capitalize",
checkbox: "mr-2",
},
}),
]);
search.on('render', function() {
fixSearchBoxAccessibility();
fixRefinementListAccessibility();
});
function fixSearchBoxAccessibility() {
// Fix main search box
const mainSearchInput = document.querySelector('#searchbox .ais-SearchBox-input');
if (mainSearchInput && !mainSearchInput.id) {
mainSearchInput.id = 'searchbox-input';
}
// Fix category refinement search
const categorySearchInput = document.querySelector('#category-refinement-list .ais-SearchBox-input');
if (categorySearchInput && !categorySearchInput.id) {
categorySearchInput.id = 'category-search-input';
// Create or update label
let categoryLabel = document.querySelector('#category-search-label');
if (!categoryLabel) {
categoryLabel = document.createElement('label');
categoryLabel.id = 'category-search-label';
categoryLabel.className = 'sr-only';
categoryLabel.textContent = 'Search Categories';
categoryLabel.setAttribute('for', 'category-search-input');
categorySearchInput.parentNode.insertBefore(categoryLabel, categorySearchInput);
}
}
// Fix tags refinement search
const tagsSearchInput = document.querySelector('#tags-refinement-list .ais-SearchBox-input');
if (tagsSearchInput && !tagsSearchInput.id) {
tagsSearchInput.id = 'tags-search-input';
// Create or update label
let tagsLabel = document.querySelector('#tags-search-label');
if (!tagsLabel) {
tagsLabel = document.createElement('label');
tagsLabel.id = 'tags-search-label';
tagsLabel.className = 'sr-only';
tagsLabel.textContent = 'Search Tags';
tagsLabel.setAttribute('for', 'tags-search-input');
tagsSearchInput.parentNode.insertBefore(tagsLabel, tagsSearchInput);
}
}
}
function fixRefinementListAccessibility() {
// Fix category refinement checkboxes
fixCheckboxes('#category-refinement-list', 'category');
// Fix tags refinement checkboxes
fixCheckboxes('#tags-refinement-list', 'tags');
}
function fixCheckboxes(containerSelector, prefix) {
const container = document.querySelector(containerSelector);
if (!container) return;
const checkboxes = container.querySelectorAll('.ais-RefinementList-checkbox');
const labels = container.querySelectorAll('.ais-RefinementList-label');
checkboxes.forEach((checkbox, index) => {
if (!checkbox.id) {
const uniqueId = `${prefix}-checkbox-${index}`;
checkbox.id = uniqueId;
// Find corresponding label and associate it
const label = labels[index];
if (label) {
label.setAttribute('for', uniqueId);
}
}
});
}
search.start();
const inbox = document.getElementById('show-button');
// Add click event listener
if (inbox) {
inbox.addEventListener('click', function () {
// Call your JavaScript function here
window.hightlightSearchBoxCursor();
});
}
const inboxShowButton = document.getElementById('show-button-hero');
// Add click event listener
if (inboxShowButton) {
inboxShowButton.addEventListener('click', function () {
// Call your JavaScript function here
window.hightlightSearchBoxCursor();
});
}
const mytogglebutton = document.querySelector('#filterElementsToggle');
// variable for the target element that I will show and hide
const mytargetelement = document.querySelector('#filterElements');
const mybuttonlement = document.querySelector('#filterElementsToggle');
// event listener (onclick) with a function to toggle the class on the target element to show and hide it
mytogglebutton.onclick = function () {
// function actions/statements go here
mytargetelement.classList.toggle('hidden');
mybuttonlement.classList.toggle('active');
// If the target element is not hidden, scroll it into view
if (!mytargetelement.classList.contains('hidden')) {
mytargetelement.scrollIntoView({ behavior: 'smooth' });
}
};
}; // Close initializeSearch function
}
// Create global function to initialize search when needed - only declare if not already defined
if (typeof window.lazyInitializeSearch === 'undefined') {
window.lazyInitializeSearch = async function() {
if (!window.SearchLazyLoader.loaded && !window.SearchLazyLoader.loading) {
try {
await window.initializeSearch();
} catch (error) {
console.error('Search initialization failed:', error);
}
} else if (window.SearchLazyLoader.loading) {
try {
await window.SearchLazyLoader.loadPromise;
} catch (error) {
console.error('Search loading failed:', error);
}
}
};
}
// Export hightlightSearchBoxCursor for global access - only declare if not already defined
if (typeof window.hightlightSearchBoxCursor === 'undefined') {
window.hightlightSearchBoxCursor = async function() {
// First, show the search overlay if it's hidden
const targetElement = document.querySelector('#my-hidden-element');
const showButton = document.querySelector('#show-button-typesence');
const hideButton = document.querySelector('#hide-button');
const bodyElement = document.body;
if (targetElement) {
if (targetElement.classList.contains('hidden')) {
// Show the search overlay first
targetElement.classList.remove('hidden');
if (showButton) showButton.classList.add('hidden');
if (hideButton) hideButton.classList.remove('hidden');
bodyElement.classList.add('searchOpen');
}
} else {
console.error('Search overlay element (#my-hidden-element) not found!');
return;
}
// If search hasn't been initialized yet, initialize it first
if (window.SearchLazyLoader && !window.SearchLazyLoader.loaded) {
await window.lazyInitializeSearch();
// Try again after scripts are loaded
setTimeout(() => {
const textSearchElements = document.getElementsByClassName('ais-SearchBox-input');
if (textSearchElements.length > 0) {
textSearchElements[0].focus();
textSearchElements[0].select();
}
}, 100);
return;
}
// Search already loaded, focusing input...
const textSearchElements = document.getElementsByClassName('ais-SearchBox-input');
if (textSearchElements.length > 0) {
textSearchElements[0].focus();
textSearchElements[0].select();
} else {
await window.lazyInitializeSearch();
setTimeout(() => {
const textSearchElements = document.getElementsByClassName('ais-SearchBox-input');
if (textSearchElements.length > 0) {
textSearchElements[0].focus();
textSearchElements[0].select();
}
}, 200);
}
};
}
// Add hide button functionality - only declare if not already defined
if (typeof window.hideSearchOverlay === 'undefined') {
window.hideSearchOverlay = function() {
const targetElement = document.querySelector('#my-hidden-element');
const showButton = document.querySelector('#show-button-typesence');
const hideButton = document.querySelector('#hide-button');
const bodyElement = document.body;
if (targetElement && !targetElement.classList.contains('hidden')) {
targetElement.classList.add('hidden');
if (showButton) showButton.classList.remove('hidden');
if (hideButton) hideButton.classList.add('hidden');
bodyElement.classList.remove('searchOpen');
}
};
}
// Initialize hide button event listener when DOM is ready
document.addEventListener('DOMContentLoaded', function() {
const hideButton = document.querySelector('#hide-button');
if (hideButton) {
hideButton.addEventListener('click', window.hideSearchOverlay);
}
});
// Don't auto-initialize - wait for user interaction
// Search will be initialized when first opened
</script>
<script src="/js/footer.min.js" defer></script>
<!-- Mobile Drawer Script -->
<script src="/js/mobile-drawer.min.js" defer></script>
<script>
document.querySelectorAll('.form-group input, .form-group textarea, .form-group select').forEach(field => {
const placeholderText = field.getAttribute('data-placeholder');
// Focus
field.addEventListener('focus', () => {
if (placeholderText) field.setAttribute('placeholder', placeholderText);
});
// Blur
field.addEventListener('blur', () => {
if (!field.value.trim()) {
field.removeAttribute('placeholder');
field.classList.remove('filled');
} else {
field.classList.add('filled');
}
});
// On change (for select, color, date, etc.)
field.addEventListener('change', () => {
if (field.value.trim()) {
field.classList.add('filled');
} else {
field.classList.remove('filled');
}
});
// Initial load
if (field.value.trim()) {
field.classList.add('filled');
}
});
</script>
<script src="/js/new-chat-interface.min.js" defer></script>
<script src="/js/language-manager.js" defer></script>
<script defer src="https://static.cloudflareinsights.com/beacon.min.js/vcd15cbe7772f49c399c6a5babf22c1241717689176015" integrity="sha512-ZpsOmlRQV6y907TI0dKBHq9Md29nnaEIPlkf84rnaERnq6zvWvPUqr2ft8M1aS28oN72PdrCzSjY4U6VaAw1EQ==" data-cf-beacon='{"version":"2024.11.0","token":"2c826315da9048f295419651abcaa729","server_timing":{"name":{"cfCacheStatus":true,"cfEdge":true,"cfExtPri":true,"cfL4":true,"cfOrigin":true,"cfSpeedBrain":true},"location_startswith":null}}' crossorigin="anonymous"></script>
</body>
</html>