thezimbabwean.co · Zimbabwe · measured 8 Oct 2026
As read on 8 Oct 2026, 12,454 bytes. No rule names an AI crawler.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Just a moment...</title>
<style>
@import url('https://fonts.googleapis.com/css2?family=IBM+Plex+Sans:wght@400;500;600&family=IBM+Plex+Mono:wght@400;500&display=swap');
*, *::before, *::after { margin: 0; padding: 0; box-sizing: border-box; }
:root {
--page-bg: #e5e7eb;
--card-bg: #ffffff;
--card-border: #d1d5db;
--card-shadow: 0 1px 3px rgba(0,0,0,.08), 0 4px 16px rgba(0,0,0,.06);
--widget-bg: #f9fafb;
--widget-border: #e5e7eb;
--text-primary: #111827;
--text-secondary: #6b7280;
--text-tertiary: #9ca3af;
--accent: #2563eb;
--accent-hover: #1d4ed8;
--error: #dc2626;
--error-bg: #fef2f2;
--error-border: #fecaca;
--input-bg: #ffffff;
--input-border: #d1d5db;
--input-focus-ring: rgba(37,99,235,.2);
--radius: 10px;
--radius-sm: 6px;
}
html, body { height: 100%; }
body {
font-family: 'IBM Plex Sans', -apple-system, BlinkMacSystemFont, sans-serif;
background: var(--page-bg);
color: var(--text-primary);
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding: 1.5rem;
min-height: 100dvh;
}
.challenge-card {
width: 100%;
max-width: 390px;
background: var(--card-bg);
border: 1px solid var(--card-border);
border-radius: 12px;
box-shadow: var(--card-shadow);
overflow: hidden;
}
.card-body { padding: 1.5rem 1.5rem 1.25rem; }
.site-domain {
font-size: .8rem;
font-weight: 500;
color: var(--text-secondary);
letter-spacing: .01em;
margin-bottom: 1rem;
display: flex;
align-items: center;
gap: .45rem;
}
.site-domain .dot {
width: 6px; height: 6px;
border-radius: 50%;
background: var(--text-tertiary);
flex-shrink: 0;
}
.title {
font-size: 1.05rem;
font-weight: 600;
margin-bottom: .3rem;
}
.desc {
font-size: .82rem;
color: var(--text-secondary);
line-height: 1.45;
margin-bottom: 1.15rem;
}
.error-msg {
display: none;
font-size: .78rem;
font-weight: 500;
color: var(--error);
background: var(--error-bg);
border: 1px solid var(--error-border);
border-radius: var(--radius-sm);
padding: .45rem .65rem;
margin-bottom: .85rem;
align-items: center;
gap: .4rem;
}
.error-msg.show { display: flex; }
.error-msg svg { width: 14px; height: 14px; flex-shrink: 0; }
.widget {
background: var(--widget-bg);
border: 1px solid var(--widget-border);
border-radius: var(--radius);
padding: .75rem;
}
.captcha-image-row {
display: flex;
align-items: center;
gap: .6rem;
margin-bottom: .65rem;
}
.img-frame {
position: relative;
flex-shrink: 0;
background: #fff;
border: 1px solid var(--input-border);
border-radius: var(--radius-sm);
overflow: hidden;
height: 56px;
display: flex;
align-items: center;
}
.img-frame img {
display: block;
height: 100%;
width: auto;
min-width: 100px;
}
.img-frame .refresh-overlay {
position: absolute;
inset: 0;
background: rgba(0,0,0,.45);
display: flex;
align-items: center;
justify-content: center;
opacity: 0;
cursor: pointer;
transition: opacity .15s;
border: none;
}
.img-frame:hover .refresh-overlay { opacity: 1; }
.img-frame .refresh-overlay svg { width: 20px; height: 20px; stroke: #fff; fill: none; stroke-width: 2; }
.img-side { flex: 1; min-width: 0; }
.img-side .hint {
font-size: .72rem;
color: var(--text-tertiary);
margin-bottom: .35rem;
}
.img-side .new-code-btn {
appearance: none;
background: none;
border: none;
padding: 0;
font-family: inherit;
font-size: .75rem;
font-weight: 500;
color: var(--accent);
cursor: pointer;
display: inline-flex;
align-items: center;
gap: .3rem;
transition: color .12s;
}
.img-side .new-code-btn:hover { color: var(--accent-hover); }
.img-side .new-code-btn svg { width: 13px; height: 13px; }
.input-row {
display: flex;
gap: .5rem;
}
.input-row input {
flex: 1;
min-width: 0;
padding: .5rem .65rem;
font-size: .95rem;
font-family: 'IBM Plex Mono', monospace;
font-weight: 500;
letter-spacing: .15em;
color: var(--text-primary);
background: var(--input-bg);
border: 1px solid var(--input-border);
border-radius: var(--radius-sm);
outline: none;
transition: border-color .12s, box-shadow .12s;
}
.input-row input:focus {
border-color: var(--accent);
box-shadow: 0 0 0 3px var(--input-focus-ring);
}
.input-row input::placeholder {
font-family: 'IBM Plex Sans', sans-serif;
font-weight: 400;
letter-spacing: normal;
color: #c5c8ce;
}
.input-row button {
flex-shrink: 0;
padding: 0 1rem;
font-family: inherit;
font-size: .82rem;
font-weight: 600;
color: #fff;
background: var(--accent);
border: none;
border-radius: var(--radius-sm);
cursor: pointer;
transition: background .12s;
display: flex;
align-items: center;
gap: .35rem;
}
.input-row button:hover { background: var(--accent-hover); }
.input-row button svg {
width: 16px; height: 16px; stroke: currentColor; fill: none; stroke-width: 2.5;
}
.card-footer {
padding: .6rem 1.5rem;
background: var(--widget-bg);
border-top: 1px solid var(--widget-border);
display: flex;
align-items: center;
}
.card-footer .brand {
font-size: .68rem;
color: var(--text-tertiary);
display: flex;
align-items: center;
gap: .35rem;
}
.card-footer .brand svg { width: 14px; height: 14px; opacity: .5; }
/* ── spinner (while image loads) ─────────────────────────────────── */
.img-frame .spinner {
position: absolute;
inset: 0;
display: flex;
align-items: center;
justify-content: center;
background: #fff;
transition: opacity .2s;
}
.img-frame .spinner.hidden { opacity: 0; pointer-events: none; }
@keyframes spin { to { transform: rotate(360deg); } }
.img-frame .spinner::after {
content: '';
width: 18px; height: 18px;
border: 2px solid var(--widget-border);
border-top-color: var(--accent);
border-radius: 50%;
animation: spin .6s linear infinite;
}
/* ── responsive ──────────────────────────────────────────────────── */
@media (max-width: 420px) {
.card-body { padding: 1.25rem 1rem 1rem; }
.captcha-image-row { flex-direction: column; align-items: stretch; }
.img-frame { width: 100%; height: 56px; justify-content: center; }
.img-frame .refresh-overlay { opacity: .7; }
.card-footer { padding: .6rem 1rem; }
}
</style>
<link rel="stylesheet" type="text/css" href="/articleads.css" media="print" onload="this.media='all'; this.onload=null;"></head>
<body>
<div class="challenge-card">
<div class="card-body">
<div class="site-domain">
<span class="dot"></span>
<span id="domainDisplay"></span>
</div>
<h1 class="title">Verify you are human</h1>
<p class="desc">Please enter the code shown below to continue.</p>
<div class="error-msg" id="errorMsg">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<circle cx="12" cy="12" r="10"/><line x1="15" y1="9" x2="9" y2="15"/><line x1="9" y1="9" x2="15" y2="15"/>
</svg>
<span>Verification failed. Try again with a new code.</span>
</div>
<form method="POST" action="/captcha-verify" id="challengeForm" autocomplete="off">
<input type="hidden" name="_token" id="csrfToken" />
<input type="hidden" name="redirect" id="redirectField" />
<div class="widget">
<div class="captcha-image-row">
<div class="img-frame" id="imgFrame">
<img id="captchaImg" alt="" />
<div class="spinner" id="spinner"></div>
<button type="button" class="refresh-overlay" onclick="reloadCaptcha()" aria-label="New code">
<svg viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round">
<path d="M1 4v6h6"/><path d="M3.51 15a9 9 0 1 0 2.13-9.36L1 10"/>
</svg>
</button>
</div>
<div class="img-side">
<div class="hint">Can't read it?</div>
<button type="button" class="new-code-btn" onclick="reloadCaptcha()">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="M1 4v6h6"/><path d="M3.51 15a9 9 0 1 0 2.13-9.36L1 10"/>
</svg>
Generate new code
</button>
</div>
</div>
<div class="input-row">
<input type="text" name="captcha" id="captchaInput"
placeholder="Enter code"
required maxlength="10" />
<button type="submit">
<svg viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round">
<polyline points="9 18 15 12 9 6"/>
</svg>
Verify
</button>
</div>
</div>
</form>
</div>
<div class="card-footer">
<div class="brand">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z"/>
</svg>
Security check
</div>
</div>
</div>
<script>
(function () {
'use strict';
var csrfInput = document.getElementById('csrfToken');
var redirectInput = document.getElementById('redirectField');
var captchaImg = document.getElementById('captchaImg');
var captchaInput = document.getElementById('captchaInput');
var errorMsg = document.getElementById('errorMsg');
var spinner = document.getElementById('spinner');
var domainDisplay = document.getElementById('domainDisplay');
// ── Show current domain ──
domainDisplay.textContent = location.hostname;
// ── CSRF ──
function generateCsrf() {
var arr = new Uint8Array(16);
crypto.getRandomValues(arr);
return Array.from(arr, function (b) {
return b.toString(16).padStart(2, '0');
}).join('');
}
// ── Query params ──
function getParam(name) {
var params = new URLSearchParams(location.search);
return params.get(name) || '';
}
// ── Sanitize redirect (defense in depth — server also validates) ──
function sanitizeRedirect(raw) {
if (!raw || raw.length === 0) return '/';
if (raw === '/') return '/';
if (raw.charAt(0) !== '/' || raw.charAt(1) === '/') return '/';
if (/[\r\n\0]/.test(raw)) return '/';
if (raw.length > 2048) return '/';
return raw;
}
redirectInput.value = sanitizeRedirect(getParam('redirect'));
// ── Captcha load / reload ──
var csrf;
window.reloadCaptcha = function () {
spinner.classList.remove('hidden');
csrf = generateCsrf();
csrfInput.value = csrf;
captchaImg.onload = function () { spinner.classList.add('hidden'); };
captchaImg.onerror = function () { spinner.classList.add('hidden'); };
captchaImg.src = '/captcha?csrf=' + encodeURIComponent(csrf) + '&t=' + Date.now();
captchaInput.value = '';
captchaInput.focus();
};
// ── Init ──
reloadCaptcha();
if (getParam('error')) {
errorMsg.classList.add('show');
}
window.addEventListener('pageshow', function (e) {
if (e.persisted) reloadCaptcha();
});
captchaInput.focus();
})();
</script>
</body>
</html>Changes recorded since June 2026.
No change recorded.