Select Your Language and Start Reading the Article

اخبار اليونان

سانتوريني في بؤرة الاهتمام.. تعزيز أنظمة الإنذار المبكر لمواجهة مخاطر التسونامي

في خطوة تهدف إلى تعزيز رصد النشاط الزلزالي واحتمالات التسونامي قام المركز الوطني للتحذير من تسونامي NTWC التابع للمعهد الجيوديناميكي في المرصد الوطني بأثينا بتركيب مقياس جديد للمد والجزر على الساحل الشمالي الشرقي لجزيرة سانتوريني.

ويأتي هذا الإجراء عقب النشاط الزلزالي المتزايد المسجل خلال الأسبوع الماضي بين سانتوريني وأمورغوس. وقد أكد المركز أن الهدف الأساسي من اختيار هذا الموقع هو المراقبة الفورية والتسجيل الدقيق لتغيرات مستوى سطح البحر مما يسهم في تحسين الاستجابة لأي مخاطر محتملة.

ومع إضافة هذه المحطة الجديدة يرتفع عدد مقاييس المد والجزر التي يديرها المرصد الساحلي اليوناني إلى 16 محطة. كما أشار المرصد الوطني في أثينا إلى أن أول محطة تم تركيبها في سانتوريني تعود إلى عام 2013 غير أنها توقفت عن العمل في عام 2017 بسبب تعرضها المستمر للظروف الجوية القاسية.

وتم تنفيذ عملية التثبيت بالتنسيق مع السلطات المحلية بما في ذلك نائب رئيس بلدية ثيرا للحماية المدنية ياكوفوس ليجنوس ورئيس صندوق ميناء ثيرا البلدي جورجيوس نوميكوس. كما شارك فريق من الباحثين والمهندسين المتخصصين في المشروع بالإضافة إلى مساهمة تطوعية من سكان المجتمع المحلي.

وفي إطار الجهود المستمرة لمراقبة النشاط الزلزالي والحد من مخاطر التسونامي يخطط المرصد الوطني بأثينا لتركيب 30 محطة إضافية بين عامي 2025 و2026 وذلك بتمويل من برنامج NOA-AEGIS التابع للوكالة الوطنية لإدارة الكوارث وبرنامج الحماية المدنية 2021-2027.

كما وأكد المرصد الوطني في أثينا أن هذه المبادرة تعكس التزام المركز الوطني للتحذير من تسونامي والمعهد الجيوديناميكي بحماية المواطنين عبر تحسين البنية التحتية وزيادة قدرة الاستجابة الفورية للمخاطر الطبيعية.

/** * @file adblock.js * @description Advanced Multi-layer AdBlock Detection System (Production Ready) * @version 1.0.0 (2026) * @license MIT */ (() => { 'use strict'; // --- Configuration & Constants --- const CONFIG = { THRESHOLD: 50, // Minimum score to consider AdBlock active CHECK_INTERVAL: 3000, // Re-check interval in ms RANDOM_PREFIX: 'ux-', // Prefix for random classes/IDs BLUR_AMOUNT: '8px', OVERLAY_Z_INDEX: 2147483647, DETECTION_WEIGHTS: { JS_LOAD: 40, DOM_BAIT: 30, IMAGE_BAIT: 20, FETCH_BAIT: 30, CSS_BAIT: 25, HIDDEN_ELEMENT: 35, DIMENSIONS: 30 } }; // --- Utils --- const Utils = { generateHash: (length = 8) => { const chars = 'abcdefghijklmnopqrstuvwxyz0123456789'; let result = ''; for (let i = 0; i < length; i++) { result += chars.charAt(Math.floor(Math.random() * chars.length)); } return CONFIG.RANDOM_PREFIX + result; }, createElement: (tag, props = {}, styles = {}) => { const el = document.createElement(tag); Object.assign(el, props); Object.assign(el.style, styles); return el; }, injectStyle: (css) => { const style = document.createElement('style'); style.textContent = css; document.head.appendChild(style); return style; }, debounce: (fn, delay) => { let timeout; return (...args) => { clearTimeout(timeout); timeout = setTimeout(() => fn(...args), delay); }; } }; // --- State Management --- const State = { isDetected: false, score: 0, dynamicNames: { overlay: Utils.generateHash(), container: Utils.generateHash(), content: Utils.generateHash(), button: Utils.generateHash(), blurClass: Utils.generateHash() }, elements: { overlay: null, styleTag: null } }; // --- Detection Engine --- const Detection = { async runAll() { let currentScore = 0; const tests = [ this.testJsLoad(), this.testDomBait(), this.testImageBait(), this.testFetchBait(), this.testCssBait(), this.testHiddenElement(), this.testDimensions() ]; const results = await Promise.all(tests); results.forEach(val => { currentScore += val; }); return currentScore; }, // 1. JavaScript Load Test async testJsLoad() { return new Promise((resolve) => { const script = document.createElement('script'); // Using a known ad-related URL that is highly likely to be blocked script.src = 'https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js'; script.onload = () => { script.remove(); resolve(0); }; script.onerror = () => { script.remove(); resolve(CONFIG.DETECTION_WEIGHTS.JS_LOAD); }; // Timeout to prevent hanging setTimeout(() => { if (script.parentNode) script.remove(); resolve(CONFIG.DETECTION_WEIGHTS.JS_LOAD); }, 2000); (document.head || document.documentElement).appendChild(script); }); }, // 2. DOM Bait Test (Dynamic Classes) async testDomBait() { const bait = Utils.createElement('div', { className: 'pub_300x250 pub_300x250m pub_728x90 text-ad textAd ads_box', id: 'ad-banner-top' }, { width: '1px', height: '1px', position: 'absolute', left: '-1000px', top: '-1000px' }); document.body.appendChild(bait); return new Promise((resolve) => { requestAnimationFrame(() => { const isBlocked = window.getComputedStyle(bait).getPropertyValue('display') === 'none' || bait.offsetParent === null || bait.offsetHeight === 0; bait.remove(); resolve(isBlocked ? CONFIG.DETECTION_WEIGHTS.DOM_BAIT : 0); }); }); }, // 3. Image Bait Test async testImageBait() { return new Promise((resolve) => { const img = new Image(); img.src = '/ads/banner_300x250.png?q=' + Math.random(); img.onload = () => resolve(0); img.onerror = () => resolve(CONFIG.DETECTION_WEIGHTS.IMAGE_BAIT); setTimeout(() => resolve(CONFIG.DETECTION_WEIGHTS.IMAGE_BAIT), 1500); }); }, // 4. Fetch API Test async testFetchBait() { try { const response = await fetch('https://googleads.g.doubleclick.net/pagead/id', { method: 'HEAD', mode: 'no-cors', cache: 'no-store' }); return 0; } catch (e) { return CONFIG.DETECTION_WEIGHTS.FETCH_BAIT; } }, // 5. CSS Bait Test async testCssBait() { const bait = Utils.createElement('div', { className: 'ad-unit' }); document.body.appendChild(bait); const isBlocked = window.getComputedStyle(bait).display === 'none'; bait.remove(); return isBlocked ? CONFIG.DETECTION_WEIGHTS.CSS_BAIT : 0; }, // 6. Hidden Element Test async testHiddenElement() { const bait = Utils.createElement('div', { id: 'show-ads' }); document.body.appendChild(bait); const isBlocked = window.getComputedStyle(bait).visibility === 'hidden'; bait.remove(); return isBlocked ? CONFIG.DETECTION_WEIGHTS.HIDDEN_ELEMENT : 0; }, // 7. Dimensions Test async testDimensions() { const bait = Utils.createElement('div', { className: 'adsense-bait' }, { width: '100px', height: '100px' }); document.body.appendChild(bait); const isBlocked = bait.clientHeight === 0; bait.remove(); return isBlocked ? CONFIG.DETECTION_WEIGHTS.DIMENSIONS : 0; } }; // --- Overlay & UI --- const UI = { injectStyles() { const css = ` .${State.dynamicNames.overlay} { position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: rgba(0, 0, 0, 0.7); z-index: ${CONFIG.OVERLAY_Z_INDEX}; display: flex; align-items: center; justify-content: center; backdrop-filter: blur(5px); transition: opacity 0.3s ease; pointer-events: all; } .${State.dynamicNames.container} { background: #fff; padding: 40px; border-radius: 16px; max-width: 450px; width: 90%; text-align: center; box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04); font-family: system-ui, -apple-system, sans-serif; } .${State.dynamicNames.content} h2 { color: #1f2937; margin-bottom: 12px; font-size: 24px; } .${State.dynamicNames.content} p { color: #4b5563; margin-bottom: 24px; line-height: 1.6; } .${State.dynamicNames.button} { background: #2563eb; color: #fff; border: none; padding: 12px 24px; border-radius: 8px; font-weight: 600; cursor: pointer; transition: background 0.2s; width: 100%; } .${State.dynamicNames.button}:hover { background: #1d4ed8; } .${State.dynamicNames.blurClass} { filter: blur(${CONFIG.BLUR_AMOUNT}); pointer-events: none; user-select: none; overflow: hidden; } body.is-locked { overflow: hidden !important; } `; State.elements.styleTag = Utils.injectStyle(css); }, show() { if (State.elements.overlay) return; const overlay = Utils.createElement('div', { className: State.dynamicNames.overlay }); const container = Utils.createElement('div', { className: State.dynamicNames.container }); container.innerHTML = `
🛡️

عذراً، تم اكتشاف مانع الإعلانات

يبدو أنك تستخدم برنامجاً لحجب الإعلانات. يرجى تعطيله لدعم استمرارية الموقع وتقديم المحتوى مجاناً.

`; overlay.appendChild(container); document.body.appendChild(overlay); State.elements.overlay = overlay; // Apply blur to content const children = Array.from(document.body.children).filter(el => el !== overlay && el.tagName !== 'SCRIPT' && el.tagName !== 'STYLE'); children.forEach(child => child.classList.add(State.dynamicNames.blurClass)); document.body.classList.add('is-locked'); // Button Action container.querySelector(`.${State.dynamicNames.button}`).onclick = () => { Controller.checkNow(); }; }, hide() { if (!State.elements.overlay) return; State.elements.overlay.remove(); State.elements.overlay = null; const children = Array.from(document.body.children); children.forEach(child => child.classList.remove(State.dynamicNames.blurClass)); document.body.classList.remove('is-locked'); } }; // --- Controller --- const Controller = { async checkNow() { const score = await Detection.runAll(); State.score = score; const detected = score >= CONFIG.THRESHOLD; if (detected !== State.isDetected) { State.isDetected = detected; if (detected) { UI.show(); } else { UI.hide(); } } }, startMonitoring() { // Periodic check setInterval(() => { this.checkNow(); }, CONFIG.CHECK_INTERVAL); // MutationObserver to watch for bait removal const observer = new MutationObserver(Utils.debounce(() => { this.checkNow(); }, 500)); observer.observe(document.body, { childList: true, subtree: true }); } }; // --- Initialization --- const init = () => { // Ensure DOM is ready if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', () => init()); return; } UI.injectStyles(); // Initial check with a small random delay to evade simple scripts setTimeout(() => { Controller.checkNow(); Controller.startMonitoring(); }, 500 + Math.random() * 500); }; // Execute init(); })();