import type { Aircraft, AircraftCategory } from '../types'; // OpenSky Network API - free tier, no auth needed for basic queries const OPENSKY_BASE = 'https://opensky-network.org/api'; // Middle East bounding box (lat_min, lat_max, lng_min, lng_max) const ME_BOUNDS = { lamin: 24, lamax: 42, lomin: 30, lomax: 62, }; // Known military callsign prefixes const MILITARY_PREFIXES: Record = { 'RCH': 'cargo', // C-17 / C-5 AMC 'REACH': 'cargo', 'KING': 'tanker', // HC-130 rescue tanker 'ETHYL': 'tanker', // KC-135 'STEEL': 'tanker', // KC-135 'PACK': 'tanker', // KC-135 'NCHO': 'tanker', // KC-10 'JULEP': 'tanker', 'IRON': 'fighter', 'VIPER': 'fighter', 'RAGE': 'fighter', 'TOXIN': 'surveillance', // RC-135 'OLIVE': 'surveillance', // RC-135 'COBRA': 'surveillance', 'FORTE': 'surveillance', // RQ-4 Global Hawk 'HAWK': 'surveillance', 'GLOBAL': 'surveillance', 'SNTRY': 'surveillance', // E-3 AWACS 'WIZARD': 'surveillance', 'DOOM': 'military', 'EVAC': 'military', 'SAM': 'military', // VIP/govt 'EXEC': 'military', 'NAVY': 'military', 'TOPCT': 'military', 'DEATH': 'fighter', // B-2 Spirit 'REAPER': 'surveillance', // MQ-9 'DRAGON': 'surveillance', // U-2 }; function classifyAircraft(callsign: string): AircraftCategory { const cs = callsign.toUpperCase().trim(); for (const [prefix, cat] of Object.entries(MILITARY_PREFIXES)) { if (cs.startsWith(prefix)) return cat; } return 'civilian'; } function parseOpenSkyResponse(data: { time: number; states: unknown[][] | null }): Aircraft[] { if (!data.states) return []; return data.states .filter(s => s[6] !== null && s[5] !== null) // must have position .map(s => { const callsign = ((s[1] as string) || '').trim(); const category = classifyAircraft(callsign); return { icao24: s[0] as string, callsign, lat: s[6] as number, lng: s[5] as number, altitude: (s[7] as number) || 0, velocity: (s[9] as number) || 0, heading: (s[10] as number) || 0, verticalRate: (s[11] as number) || 0, onGround: s[8] as boolean, category, lastSeen: (s[4] as number) * 1000, }; }); } export async function fetchAircraftOpenSky(): Promise { try { const url = `${OPENSKY_BASE}/states/all?lamin=${ME_BOUNDS.lamin}&lomin=${ME_BOUNDS.lomin}&lamax=${ME_BOUNDS.lamax}&lomax=${ME_BOUNDS.lomax}`; const res = await fetch(url); if (!res.ok) throw new Error(`OpenSky ${res.status}`); const data = await res.json(); return parseOpenSkyResponse(data); } catch (err) { console.warn('OpenSky fetch failed, using sample data:', err); return getSampleAircraft(); } } // ═══ Korea region ═══ const KR_BOUNDS = { lamin: 20, lamax: 45, lomin: 115, lomax: 145 }; export async function fetchAircraftOpenSkyKorea(): Promise { try { const url = `${OPENSKY_BASE}/states/all?lamin=${KR_BOUNDS.lamin}&lomin=${KR_BOUNDS.lomin}&lamax=${KR_BOUNDS.lamax}&lomax=${KR_BOUNDS.lomax}`; const res = await fetch(url); if (!res.ok) throw new Error(`OpenSky Korea ${res.status}`); const data = await res.json(); return parseOpenSkyResponse(data); } catch (err) { console.warn('OpenSky Korea fetch failed:', err); return []; } } // T0 = main Iranian retaliation wave const T0 = new Date('2026-03-01T12:01:00Z').getTime(); const HOUR = 3600_000; const MIN = 60_000; // ── 2026 March 1 verified aircraft deployments ── // Based on OSINT: Operation Epic Fury order of battle function getSampleAircraft(): Aircraft[] { const now = Date.now(); return [ // ═══════════════════════════════════════════ // SURVEILLANCE / ISR (persistent coverage) // ═══════════════════════════════════════════ // RQ-4B Global Hawk "FORTE12" - 24h ISR orbit over Iraq/Iran border // Deployed from Al Dhafra, UAE (standard CENTCOM ISR asset) { icao24: 'ae1461', callsign: 'FORTE12', lat: 33.2, lng: 43.5, altitude: 16764, velocity: 170, heading: 135, verticalRate: 0, onGround: false, category: 'surveillance', typecode: 'RQ4B', lastSeen: now, activeStart: T0 - 12 * HOUR, activeEnd: T0 + 12 * HOUR, }, // MQ-4C Triton "FORTE13" - Maritime ISR over Persian Gulf // One MQ-4C lost near Iran Feb 22; this is replacement sortie { icao24: 'ae1462', callsign: 'FORTE13', lat: 27.0, lng: 55.0, altitude: 15240, velocity: 165, heading: 90, verticalRate: 0, onGround: false, category: 'surveillance', typecode: 'MQ4C', lastSeen: now, activeStart: T0 - 10 * HOUR, activeEnd: T0 + 10 * HOUR, }, // RC-135V Rivet Joint "TOXIN31" - SIGINT, relocated to Crete (Souda Bay) // Per OSINT: RC-135 shifted from Turkey-Syria border to Crete Mar 2026 { icao24: 'ae5420', callsign: 'TOXIN31', lat: 35.5, lng: 34.0, altitude: 9144, velocity: 230, heading: 90, verticalRate: 0, onGround: false, category: 'surveillance', typecode: 'RC135V', lastSeen: now, activeStart: T0 - 10 * HOUR, activeEnd: T0 + 8 * HOUR, }, // E-3G AWACS "SNTRY60" - Airborne early warning over northern Iraq // Al Dhafra-based, orbiting for Iranian missile launch detection { icao24: 'ae0005', callsign: 'SNTRY60', lat: 34.5, lng: 44.0, altitude: 9144, velocity: 200, heading: 45, verticalRate: 0, onGround: false, category: 'surveillance', typecode: 'E3G', lastSeen: now, activeStart: T0 - 6 * HOUR, activeEnd: T0 + 10 * HOUR, }, // U-2S Dragon Lady "DRAGON01" - Ultra-high altitude recon from Al Dhafra // Facilities hit by Iranian missile strike ~T0+1h; U-2 airborne before impact { icao24: 'ae0006', callsign: 'DRAGON01', lat: 30.5, lng: 52.0, altitude: 21336, velocity: 200, heading: 0, verticalRate: 0, onGround: false, category: 'surveillance', typecode: 'U2S', lastSeen: now, activeStart: T0 - 8 * HOUR, activeEnd: T0 + 4 * HOUR, }, // MQ-9A Reaper "REAPER41" - Armed ISR over western Iraq // Launched from Al Dhafra pre-strike; base facilities damaged by Iranian missiles { icao24: 'ae0007', callsign: 'REAPER41', lat: 32.0, lng: 41.5, altitude: 7620, velocity: 80, heading: 180, verticalRate: 0, onGround: false, category: 'surveillance', typecode: 'MQ9A', lastSeen: now, activeStart: T0 - 6 * HOUR, activeEnd: T0 + 8 * HOUR, }, // MQ-9A Reaper "REAPER42" - Armed ISR over Strait of Hormuz { icao24: 'ae0008', callsign: 'REAPER42', lat: 26.5, lng: 56.0, altitude: 6096, velocity: 75, heading: 270, verticalRate: 0, onGround: false, category: 'surveillance', typecode: 'MQ9A', lastSeen: now, activeStart: T0 - 4 * HOUR, activeEnd: T0 + 10 * HOUR, }, // ═══════════════════════════════════════════ // TANKERS (aerial refueling for strike packages) // ═══════════════════════════════════════════ // KC-135R "ETHYL71" - Refueling orbit over western Iraq for strike package { icao24: 'ae0001', callsign: 'ETHYL71', lat: 31.5, lng: 42.0, altitude: 10668, velocity: 250, heading: 270, verticalRate: 0, onGround: false, category: 'tanker', typecode: 'KC135R', lastSeen: now, activeStart: T0 - 8 * HOUR, activeEnd: T0 + 6 * HOUR, }, // KC-46A Pegasus "STEEL55" - Refueling support for B-2 bombers // B-2s flew from Diego Garcia/Whiteman; needed multiple refueling { icao24: 'ae0009', callsign: 'STEEL55', lat: 28.5, lng: 50.0, altitude: 10972, velocity: 245, heading: 315, verticalRate: 0, onGround: false, category: 'tanker', typecode: 'KC46A', lastSeen: now, activeStart: T0 - 10 * HOUR, activeEnd: T0 + 4 * HOUR, }, // KC-135R "PACK22" - Refueling orbit over eastern Jordan // Supporting Israeli F-35I and F-15I strike missions { icao24: 'ae0003', callsign: 'PACK22', lat: 32.8, lng: 38.5, altitude: 10972, velocity: 245, heading: 180, verticalRate: 0, onGround: false, category: 'tanker', typecode: 'KC135R', lastSeen: now, activeStart: T0 - 3 * HOUR, activeEnd: T0 + 4 * HOUR, }, // KC-10A Extender "NCHO45" - Large refueling orbit over northern Gulf { icao24: 'ae0002', callsign: 'NCHO45', lat: 29.8, lng: 47.5, altitude: 10058, velocity: 240, heading: 300, verticalRate: 0, onGround: false, category: 'tanker', typecode: 'KC10A', lastSeen: now, activeStart: T0 - 4 * HOUR, activeEnd: T0 + 5 * HOUR, }, // ═══════════════════════════════════════════ // BOMBERS (US stealth strikes on Iran) // ═══════════════════════════════════════════ // B-2A Spirit "DEATH11" - Stealth bomber, Whiteman via Diego Garcia // B-2s confirmed conducting deep strikes on Iranian nuclear/military facilities { icao24: 'ae2001', callsign: 'DEATH11', lat: 29.0, lng: 53.0, altitude: 12192, velocity: 260, heading: 0, verticalRate: 0, onGround: false, category: 'fighter', typecode: 'B2A', lastSeen: now, activeStart: T0 - 6 * HOUR, activeEnd: T0 + 2 * HOUR, }, // B-2A Spirit "DEATH12" - Second stealth bomber in pair { icao24: 'ae2002', callsign: 'DEATH12', lat: 28.5, lng: 52.5, altitude: 12192, velocity: 260, heading: 10, verticalRate: 0, onGround: false, category: 'fighter', typecode: 'B2A', lastSeen: now, activeStart: T0 - 6 * HOUR, activeEnd: T0 + 2 * HOUR, }, // ═══════════════════════════════════════════ // US FIGHTERS (Al Udeid, Al Dhafra based) // ═══════════════════════════════════════════ // F-22A Raptor "RAGE01" - Al Udeid-based, air superiority { icao24: 'ae3001', callsign: 'RAGE01', lat: 30.0, lng: 48.0, altitude: 10668, velocity: 320, heading: 45, verticalRate: 0, onGround: false, category: 'fighter', typecode: 'F22A', lastSeen: now, activeStart: T0 - 2 * HOUR, activeEnd: T0 + 4 * HOUR, }, // F-22A Raptor "RAGE02" - Wingman { icao24: 'ae3002', callsign: 'RAGE02', lat: 29.8, lng: 47.5, altitude: 10668, velocity: 318, heading: 50, verticalRate: 0, onGround: false, category: 'fighter', typecode: 'F22A', lastSeen: now, activeStart: T0 - 2 * HOUR, activeEnd: T0 + 4 * HOUR, }, // F-35A Lightning II "VIPER11" - From RAF Lakenheath (deployed to Al Udeid) { icao24: 'ae3003', callsign: 'VIPER11', lat: 31.0, lng: 46.0, altitude: 9144, velocity: 300, heading: 60, verticalRate: 0, onGround: false, category: 'fighter', typecode: 'F35A', lastSeen: now, activeStart: T0 - 3 * HOUR, activeEnd: T0 + 3 * HOUR, }, // F-35A Lightning II "VIPER12" - Wingman { icao24: 'ae3004', callsign: 'VIPER12', lat: 30.8, lng: 45.5, altitude: 9144, velocity: 298, heading: 65, verticalRate: 0, onGround: false, category: 'fighter', typecode: 'F35A', lastSeen: now, activeStart: T0 - 3 * HOUR, activeEnd: T0 + 3 * HOUR, }, // F-15E Strike Eagle "IRON41" - From RAF Lakenheath/Al Dhafra // Deep strike mission into Iran { icao24: 'ae3005', callsign: 'IRON41', lat: 29.5, lng: 50.0, altitude: 8534, velocity: 310, heading: 30, verticalRate: 0, onGround: false, category: 'fighter', typecode: 'F15E', lastSeen: now, activeStart: T0 - 4 * HOUR, activeEnd: T0 + 2 * HOUR, }, // F-15E Strike Eagle "IRON42" - Wingman { icao24: 'ae3006', callsign: 'IRON42', lat: 29.3, lng: 49.5, altitude: 8534, velocity: 308, heading: 35, verticalRate: 0, onGround: false, category: 'fighter', typecode: 'F15E', lastSeen: now, activeStart: T0 - 4 * HOUR, activeEnd: T0 + 2 * HOUR, }, // F/A-18E/F Super Hornet "NAVY51" - USS Abraham Lincoln CVW // Lincoln CSG in Arabian Sea; launching strikes on Iran { icao24: 'ae3007', callsign: 'NAVY51', lat: 24.0, lng: 60.0, altitude: 7620, velocity: 280, heading: 350, verticalRate: 5, onGround: false, category: 'fighter', typecode: 'FA18F', lastSeen: now, activeStart: T0 - 1 * HOUR, activeEnd: T0 + 3 * HOUR, }, // F/A-18E Super Hornet "NAVY52" - Lincoln CAP flight { icao24: 'ae3008', callsign: 'NAVY52', lat: 23.5, lng: 59.5, altitude: 6096, velocity: 275, heading: 0, verticalRate: 0, onGround: false, category: 'fighter', typecode: 'FA18E', lastSeen: now, activeStart: T0 - 1 * HOUR, activeEnd: T0 + 3 * HOUR, }, // ═══════════════════════════════════════════ // ISRAELI AIR FORCE (strikes on Iran) // ═══════════════════════════════════════════ // F-35I Adir "IRON33" - From Nevatim AB, deep strike into Iran // F-35I confirmed shooting down Iranian Yak-130 on Mar 4 { icao24: 'ae0012', callsign: 'IRON33', lat: 31.2, lng: 34.9, altitude: 10000, velocity: 310, heading: 90, verticalRate: 3, onGround: false, category: 'fighter', typecode: 'F35I', lastSeen: now, activeStart: T0 - 2 * HOUR, activeEnd: T0 + 3 * HOUR, }, // F-35I Adir "IRON34" - Wingman from Nevatim { icao24: 'ae4002', callsign: 'IRON34', lat: 31.0, lng: 35.2, altitude: 10000, velocity: 308, heading: 95, verticalRate: 2, onGround: false, category: 'fighter', typecode: 'F35I', lastSeen: now, activeStart: T0 - 2 * HOUR, activeEnd: T0 + 3 * HOUR, }, // F-15I Ra'am "RAGE22" - From Ramon AB, carrying Black Sparrow standoff missiles { icao24: 'ae0011', callsign: 'RAGE22', lat: 30.2, lng: 35.3, altitude: 7620, velocity: 300, heading: 45, verticalRate: 0, onGround: false, category: 'fighter', typecode: 'F15I', lastSeen: now, activeStart: T0 - 90 * MIN, activeEnd: T0 + 2 * HOUR, }, // F-15I Ra'am "RAGE23" - Wingman { icao24: 'ae4004', callsign: 'RAGE23', lat: 30.0, lng: 35.5, altitude: 7620, velocity: 298, heading: 50, verticalRate: 0, onGround: false, category: 'fighter', typecode: 'F15I', lastSeen: now, activeStart: T0 - 90 * MIN, activeEnd: T0 + 2 * HOUR, }, // F-16I Sufa "VIPER01" - CAP over Negev/Golan (intercept duty) { icao24: 'ae0010', callsign: 'VIPER01', lat: 30.5, lng: 35.0, altitude: 6096, velocity: 280, heading: 60, verticalRate: 5, onGround: false, category: 'fighter', typecode: 'F16I', lastSeen: now, activeStart: T0 - 2 * HOUR, activeEnd: T0 + 3 * HOUR, }, // ═══════════════════════════════════════════ // CARGO / LOGISTICS // ═══════════════════════════════════════════ // C-17A Globemaster III "RCH882" - Al Udeid → Al Asad logistics { icao24: 'ae0004', callsign: 'RCH882', lat: 29.0, lng: 48.0, altitude: 9753, velocity: 220, heading: 340, verticalRate: -2, onGround: false, category: 'cargo', typecode: 'C17A', lastSeen: now, activeStart: T0 - 6 * HOUR, activeEnd: T0 - 1 * HOUR, }, // C-17A "RCH445" - Post-strike logistics, Ramstein → Gulf { icao24: 'ae0013', callsign: 'RCH445', lat: 32.0, lng: 46.0, altitude: 10000, velocity: 215, heading: 200, verticalRate: 0, onGround: false, category: 'cargo', typecode: 'C17A', lastSeen: now, activeStart: T0 + 2 * HOUR, activeEnd: T0 + 9 * HOUR, }, // C-5M Super Galaxy "RCH901" - Heavy lift from Ramstein (ammo resupply) { icao24: 'ae5001', callsign: 'RCH901', lat: 35.0, lng: 38.0, altitude: 10668, velocity: 230, heading: 120, verticalRate: 0, onGround: false, category: 'cargo', typecode: 'C5M', lastSeen: now, activeStart: T0 - 3 * HOUR, activeEnd: T0 + 5 * HOUR, }, // ═══════════════════════════════════════════ // CIVILIAN (diverted/cancelled due to airspace closures) // ═══════════════════════════════════════════ // Qatar Airways QR8101 - Doha → Amman (before airspace closure) { icao24: '738012', callsign: 'QTR8101', lat: 25.3, lng: 51.5, altitude: 3048, velocity: 130, heading: 300, verticalRate: -5, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 - 11 * HOUR, activeEnd: T0 - 5 * HOUR, }, // Emirates EK412 - Dubai → Istanbul (before airspace closure) { icao24: '710104', callsign: 'EK412', lat: 25.1, lng: 55.2, altitude: 10668, velocity: 260, heading: 330, verticalRate: 3, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 - 8 * HOUR, activeEnd: T0 - 2 * HOUR, }, // Qatar Airways QR306 - Doha → London (transiting region post-strike) { icao24: '738020', callsign: 'QTR306', lat: 26.0, lng: 50.5, altitude: 11000, velocity: 240, heading: 315, verticalRate: 0, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 + 3 * HOUR, activeEnd: T0 + 10 * HOUR, }, // Etihad EY55 - Abu Dhabi → Cairo (post-strike, restricted routing) { icao24: '710110', callsign: 'ETD55', lat: 24.5, lng: 54.0, altitude: 10500, velocity: 250, heading: 280, verticalRate: 2, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 + 3 * HOUR, activeEnd: T0 + 9 * HOUR, }, // ═══════════════════════════════════════════ // ADDITIONAL MILITARY — Coalition & Regional // ═══════════════════════════════════════════ // RAF Typhoon FGR4 "TYPHON1" — RAF Akrotiri, Cyprus CAP { icao24: 'ae6001', callsign: 'TYPHON1', lat: 35.0, lng: 33.5, altitude: 9144, velocity: 310, heading: 120, verticalRate: 0, onGround: false, category: 'fighter', typecode: 'EUFI', lastSeen: now, activeStart: T0 - 4 * HOUR, activeEnd: T0 + 8 * HOUR, }, // RAF Typhoon FGR4 "TYPHON2" { icao24: 'ae6002', callsign: 'TYPHON2', lat: 34.8, lng: 33.8, altitude: 9144, velocity: 308, heading: 125, verticalRate: 0, onGround: false, category: 'fighter', typecode: 'EUFI', lastSeen: now, activeStart: T0 - 4 * HOUR, activeEnd: T0 + 8 * HOUR, }, // French Rafale "RAFALE1" — FS Charles de Gaulle launch { icao24: 'ae6003', callsign: 'RAFALE1', lat: 34.5, lng: 30.0, altitude: 10000, velocity: 320, heading: 90, verticalRate: 0, onGround: false, category: 'fighter', typecode: 'RFAL', lastSeen: now, activeStart: T0 + 4 * HOUR, activeEnd: T0 + 10 * HOUR, }, // USAF E-8C JSTARS "WIZARD21" — Ground surveillance over Iraq { icao24: 'ae6004', callsign: 'WIZARD21', lat: 33.5, lng: 42.5, altitude: 10668, velocity: 210, heading: 45, verticalRate: 0, onGround: false, category: 'surveillance', typecode: 'E8C', lastSeen: now, activeStart: T0 - 8 * HOUR, activeEnd: T0 + 6 * HOUR, }, // P-8A Poseidon "NAVY61" — Maritime patrol, Arabian Sea { icao24: 'ae6005', callsign: 'NAVY61', lat: 24.0, lng: 58.0, altitude: 7620, velocity: 210, heading: 270, verticalRate: 0, onGround: false, category: 'surveillance', typecode: 'P8A', lastSeen: now, activeStart: T0 - 6 * HOUR, activeEnd: T0 + 8 * HOUR, }, // P-8A Poseidon "NAVY62" — Maritime patrol, Strait of Hormuz { icao24: 'ae6006', callsign: 'NAVY62', lat: 26.0, lng: 55.5, altitude: 6096, velocity: 200, heading: 180, verticalRate: 0, onGround: false, category: 'surveillance', typecode: 'P8A', lastSeen: now, activeStart: T0 - 3 * HOUR, activeEnd: T0 + 9 * HOUR, }, // E-2D Hawkeye "NAVY71" — USS Abraham Lincoln AEW { icao24: 'ae6007', callsign: 'NAVY71', lat: 23.0, lng: 61.0, altitude: 7620, velocity: 160, heading: 30, verticalRate: 0, onGround: false, category: 'surveillance', typecode: 'E2D', lastSeen: now, activeStart: T0 - 2 * HOUR, activeEnd: T0 + 6 * HOUR, }, // KC-135R "JULEP31" — Refueling over Saudi { icao24: 'ae6008', callsign: 'JULEP31', lat: 27.0, lng: 45.0, altitude: 10668, velocity: 245, heading: 0, verticalRate: 0, onGround: false, category: 'tanker', typecode: 'KC135R', lastSeen: now, activeStart: T0 - 6 * HOUR, activeEnd: T0 + 4 * HOUR, }, // A330 MRTT "UAE50" — UAE Air Force tanker { icao24: 'ae6009', callsign: 'UAE50', lat: 25.0, lng: 53.0, altitude: 10000, velocity: 240, heading: 315, verticalRate: 0, onGround: false, category: 'tanker', typecode: 'A332', lastSeen: now, activeStart: T0 - 4 * HOUR, activeEnd: T0 + 6 * HOUR, }, // C-130J "RCH771" — Tactical airlift Kuwait { icao24: 'ae6010', callsign: 'RCH771', lat: 29.2, lng: 47.5, altitude: 6096, velocity: 150, heading: 180, verticalRate: 0, onGround: false, category: 'cargo', typecode: 'C130J', lastSeen: now, activeStart: T0 - 2 * HOUR, activeEnd: T0 + 5 * HOUR, }, // USAF B-1B Lancer "BONE21" — From Diego Garcia, standoff strikes { icao24: 'ae6011', callsign: 'BONE21', lat: 25.0, lng: 59.0, altitude: 10668, velocity: 280, heading: 350, verticalRate: 0, onGround: false, category: 'fighter', typecode: 'B1B', lastSeen: now, activeStart: T0 - 3 * HOUR, activeEnd: T0 + 3 * HOUR, }, // Saudi F-15SA "RSAF01" — Air defense patrol { icao24: 'ae6012', callsign: 'RSAF01', lat: 26.5, lng: 43.0, altitude: 9144, velocity: 300, heading: 90, verticalRate: 0, onGround: false, category: 'fighter', typecode: 'F15SA', lastSeen: now, activeStart: T0 - 6 * HOUR, activeEnd: T0 + 10 * HOUR, }, // Saudi F-15SA "RSAF02" { icao24: 'ae6013', callsign: 'RSAF02', lat: 26.3, lng: 43.5, altitude: 9144, velocity: 298, heading: 95, verticalRate: 0, onGround: false, category: 'fighter', typecode: 'F15SA', lastSeen: now, activeStart: T0 - 6 * HOUR, activeEnd: T0 + 10 * HOUR, }, // UAE F-16E "UAEAF1" — Al Dhafra CAP { icao24: 'ae6014', callsign: 'UAEAF1', lat: 24.5, lng: 55.0, altitude: 8534, velocity: 290, heading: 60, verticalRate: 0, onGround: false, category: 'fighter', typecode: 'F16E', lastSeen: now, activeStart: T0 - 4 * HOUR, activeEnd: T0 + 8 * HOUR, }, // Israeli G550 "ORON01" — Oron SIGINT/AEW platform { icao24: 'ae6015', callsign: 'ORON01', lat: 31.0, lng: 34.5, altitude: 12192, velocity: 200, heading: 45, verticalRate: 0, onGround: false, category: 'surveillance', typecode: 'G550', lastSeen: now, activeStart: T0 - 3 * HOUR, activeEnd: T0 + 8 * HOUR, }, // MQ-9 "REAPER43" — Over Yemen { icao24: 'ae6016', callsign: 'REAPER43', lat: 15.0, lng: 44.0, altitude: 6096, velocity: 80, heading: 180, verticalRate: 0, onGround: false, category: 'surveillance', typecode: 'MQ9A', lastSeen: now, activeStart: T0 - 6 * HOUR, activeEnd: T0 + 10 * HOUR, }, // ═══════════════════════════════════════════ // CIVILIAN — 영공 폐쇄 전/후 항공편 (중동 주요 노선) // ═══════════════════════════════════════════ // ── 공습 전 출발 (T0-12h ~ T0-4h) ── // 이란/이라크 영공 폐쇄 전 정상 운항 { icao24: 'c10001', callsign: 'QTR777', lat: 25.3, lng: 51.6, altitude: 10668, velocity: 250, heading: 310, verticalRate: 3, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 - 12 * HOUR, activeEnd: T0 - 6 * HOUR }, { icao24: 'c10002', callsign: 'QTR003', lat: 26.0, lng: 50.0, altitude: 11000, velocity: 245, heading: 290, verticalRate: 0, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 - 11 * HOUR, activeEnd: T0 - 5 * HOUR }, { icao24: 'c10003', callsign: 'UAE203', lat: 25.2, lng: 55.3, altitude: 10668, velocity: 260, heading: 320, verticalRate: 2, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 - 11 * HOUR, activeEnd: T0 - 5 * HOUR }, { icao24: 'c10004', callsign: 'UAE501', lat: 25.1, lng: 55.2, altitude: 11000, velocity: 255, heading: 275, verticalRate: 0, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 - 10 * HOUR, activeEnd: T0 - 4 * HOUR }, { icao24: 'c10005', callsign: 'ETD401', lat: 24.4, lng: 54.7, altitude: 10668, velocity: 248, heading: 310, verticalRate: 1, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 - 10 * HOUR, activeEnd: T0 - 4 * HOUR }, { icao24: 'c10006', callsign: 'GFA271', lat: 26.2, lng: 50.6, altitude: 10000, velocity: 240, heading: 300, verticalRate: 0, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 - 11 * HOUR, activeEnd: T0 - 6 * HOUR }, { icao24: 'c10007', callsign: 'SVA103', lat: 24.7, lng: 46.7, altitude: 10668, velocity: 250, heading: 350, verticalRate: 2, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 - 12 * HOUR, activeEnd: T0 - 6 * HOUR }, { icao24: 'c10008', callsign: 'SVA321', lat: 25.0, lng: 46.0, altitude: 11000, velocity: 255, heading: 45, verticalRate: 0, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 - 11 * HOUR, activeEnd: T0 - 5 * HOUR }, { icao24: 'c10009', callsign: 'KAC501', lat: 29.2, lng: 47.9, altitude: 10668, velocity: 240, heading: 300, verticalRate: 0, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 - 11 * HOUR, activeEnd: T0 - 5 * HOUR }, { icao24: 'c10010', callsign: 'OMA143', lat: 23.6, lng: 58.3, altitude: 10668, velocity: 248, heading: 315, verticalRate: 0, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 - 10 * HOUR, activeEnd: T0 - 4 * HOUR }, { icao24: 'c10011', callsign: 'THY772', lat: 37.0, lng: 40.0, altitude: 11000, velocity: 240, heading: 270, verticalRate: 0, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 - 12 * HOUR, activeEnd: T0 - 6 * HOUR }, { icao24: 'c10012', callsign: 'THY784', lat: 38.0, lng: 38.0, altitude: 10668, velocity: 245, heading: 180, verticalRate: -1, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 - 11 * HOUR, activeEnd: T0 - 5 * HOUR }, { icao24: 'c10013', callsign: 'IRA712', lat: 35.7, lng: 51.4, altitude: 3048, velocity: 120, heading: 180, verticalRate: -5, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 - 12 * HOUR, activeEnd: T0 - 11 * HOUR }, { icao24: 'c10014', callsign: 'IRA332', lat: 32.0, lng: 52.0, altitude: 10000, velocity: 230, heading: 90, verticalRate: 0, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 - 12 * HOUR, activeEnd: T0 - 11 * HOUR }, { icao24: 'c10015', callsign: 'BAW115', lat: 30.0, lng: 45.0, altitude: 11000, velocity: 250, heading: 130, verticalRate: 0, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 - 12 * HOUR, activeEnd: T0 - 6 * HOUR }, { icao24: 'c10016', callsign: 'DLH600', lat: 33.0, lng: 42.0, altitude: 11000, velocity: 248, heading: 120, verticalRate: 0, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 - 12 * HOUR, activeEnd: T0 - 6 * HOUR }, { icao24: 'c10017', callsign: 'AFR562', lat: 34.0, lng: 38.0, altitude: 11000, velocity: 245, heading: 110, verticalRate: 0, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 - 11 * HOUR, activeEnd: T0 - 5 * HOUR }, { icao24: 'c10018', callsign: 'SIA472', lat: 28.0, lng: 55.0, altitude: 11000, velocity: 260, heading: 100, verticalRate: 0, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 - 10 * HOUR, activeEnd: T0 - 4 * HOUR }, { icao24: 'c10019', callsign: 'CPA761', lat: 27.0, lng: 56.0, altitude: 10668, velocity: 255, heading: 80, verticalRate: 0, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 - 10 * HOUR, activeEnd: T0 - 4 * HOUR }, { icao24: 'c10020', callsign: 'KAL505', lat: 29.0, lng: 50.0, altitude: 11000, velocity: 250, heading: 70, verticalRate: 0, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 - 12 * HOUR, activeEnd: T0 - 6 * HOUR }, // ── 영공 폐쇄 직전 긴급 이탈 (T0-6h ~ T0-2h) ── { icao24: 'c10021', callsign: 'QTR008', lat: 26.5, lng: 49.0, altitude: 10668, velocity: 260, heading: 250, verticalRate: 0, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 - 6 * HOUR, activeEnd: T0 - 1 * HOUR }, { icao24: 'c10022', callsign: 'UAE022', lat: 25.5, lng: 54.0, altitude: 11000, velocity: 255, heading: 200, verticalRate: 0, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 - 6 * HOUR, activeEnd: T0 - 1 * HOUR }, { icao24: 'c10023', callsign: 'ETD203', lat: 24.8, lng: 54.5, altitude: 10000, velocity: 245, heading: 240, verticalRate: 0, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 - 5 * HOUR, activeEnd: T0 - 1 * HOUR }, { icao24: 'c10024', callsign: 'FDB523', lat: 25.3, lng: 55.4, altitude: 9000, velocity: 230, heading: 190, verticalRate: -2, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 - 5 * HOUR, activeEnd: T0 - 1 * HOUR }, { icao24: 'c10025', callsign: 'SVA661', lat: 26.0, lng: 44.0, altitude: 10668, velocity: 250, heading: 270, verticalRate: 0, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 - 6 * HOUR, activeEnd: T0 - 2 * HOUR }, { icao24: 'c10026', callsign: 'GFA511', lat: 26.5, lng: 50.3, altitude: 8000, velocity: 220, heading: 210, verticalRate: -3, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 - 5 * HOUR, activeEnd: T0 - 1 * HOUR }, { icao24: 'c10027', callsign: 'OMA155', lat: 24.0, lng: 57.0, altitude: 10668, velocity: 245, heading: 160, verticalRate: 0, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 - 6 * HOUR, activeEnd: T0 - 2 * HOUR }, { icao24: 'c10028', callsign: 'IAW117', lat: 33.3, lng: 44.4, altitude: 5000, velocity: 150, heading: 300, verticalRate: -4, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 - 6 * HOUR, activeEnd: T0 - 4 * HOUR }, { icao24: 'c10029', callsign: 'THY790', lat: 37.5, lng: 36.0, altitude: 10668, velocity: 250, heading: 160, verticalRate: 0, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 - 6 * HOUR, activeEnd: T0 - 2 * HOUR }, { icao24: 'c10030', callsign: 'KAC303', lat: 29.0, lng: 48.2, altitude: 8000, velocity: 230, heading: 250, verticalRate: -2, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 - 5 * HOUR, activeEnd: T0 - 1 * HOUR }, // ── 영공 폐쇄 구간 (T0-2h ~ T0+3h) — 거의 민간기 없음 ── // 우회 항공편만 소수 { icao24: 'c10031', callsign: 'QTR922', lat: 28.0, lng: 42.0, altitude: 11000, velocity: 260, heading: 300, verticalRate: 0, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 - 1 * HOUR, activeEnd: T0 + 3 * HOUR }, { icao24: 'c10032', callsign: 'UAE780', lat: 20.0, lng: 58.0, altitude: 11000, velocity: 255, heading: 250, verticalRate: 0, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 - 1 * HOUR, activeEnd: T0 + 4 * HOUR }, // ── 영공 부분 개방 후 (T0+3h ~) ── 우회 노선으로 운항 재개 { icao24: 'c10033', callsign: 'QTR102', lat: 25.5, lng: 51.4, altitude: 10668, velocity: 248, heading: 280, verticalRate: 2, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 + 3 * HOUR, activeEnd: T0 + 10 * HOUR }, { icao24: 'c10034', callsign: 'QTR844', lat: 25.2, lng: 51.5, altitude: 11000, velocity: 252, heading: 60, verticalRate: 3, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 + 4 * HOUR, activeEnd: T0 + 11 * HOUR }, { icao24: 'c10035', callsign: 'UAE412', lat: 25.3, lng: 55.2, altitude: 10668, velocity: 260, heading: 310, verticalRate: 2, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 + 3 * HOUR, activeEnd: T0 + 10 * HOUR }, { icao24: 'c10036', callsign: 'UAE506', lat: 25.0, lng: 55.0, altitude: 11000, velocity: 255, heading: 80, verticalRate: 0, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 + 4 * HOUR, activeEnd: T0 + 11 * HOUR }, { icao24: 'c10037', callsign: 'ETD231', lat: 24.5, lng: 54.6, altitude: 10000, velocity: 250, heading: 290, verticalRate: 2, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 + 3 * HOUR, activeEnd: T0 + 9 * HOUR }, { icao24: 'c10038', callsign: 'ETD889', lat: 24.3, lng: 54.8, altitude: 11000, velocity: 248, heading: 100, verticalRate: 0, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 + 5 * HOUR, activeEnd: T0 + 12 * HOUR }, { icao24: 'c10039', callsign: 'SVA115', lat: 24.8, lng: 46.5, altitude: 10668, velocity: 245, heading: 340, verticalRate: 2, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 + 3 * HOUR, activeEnd: T0 + 9 * HOUR }, { icao24: 'c10040', callsign: 'SVA717', lat: 24.5, lng: 46.8, altitude: 10668, velocity: 250, heading: 50, verticalRate: 0, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 + 4 * HOUR, activeEnd: T0 + 10 * HOUR }, { icao24: 'c10041', callsign: 'FDB881', lat: 25.1, lng: 55.5, altitude: 9500, velocity: 235, heading: 200, verticalRate: 0, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 + 5 * HOUR, activeEnd: T0 + 10 * HOUR }, { icao24: 'c10042', callsign: 'AXB221', lat: 25.0, lng: 55.1, altitude: 10668, velocity: 240, heading: 130, verticalRate: 0, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 + 4 * HOUR, activeEnd: T0 + 10 * HOUR }, { icao24: 'c10043', callsign: 'GFA891', lat: 26.3, lng: 50.5, altitude: 10000, velocity: 235, heading: 280, verticalRate: 2, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 + 5 * HOUR, activeEnd: T0 + 11 * HOUR }, { icao24: 'c10044', callsign: 'KAC117', lat: 29.5, lng: 47.8, altitude: 10668, velocity: 248, heading: 300, verticalRate: 0, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 + 4 * HOUR, activeEnd: T0 + 10 * HOUR }, { icao24: 'c10045', callsign: 'OMA303', lat: 23.8, lng: 57.5, altitude: 10668, velocity: 245, heading: 250, verticalRate: 0, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 + 3 * HOUR, activeEnd: T0 + 9 * HOUR }, { icao24: 'c10046', callsign: 'THY801', lat: 37.2, lng: 37.0, altitude: 11000, velocity: 240, heading: 140, verticalRate: 0, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 + 4 * HOUR, activeEnd: T0 + 10 * HOUR }, { icao24: 'c10047', callsign: 'SIA478', lat: 22.0, lng: 58.0, altitude: 11000, velocity: 260, heading: 100, verticalRate: 0, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 + 5 * HOUR, activeEnd: T0 + 12 * HOUR }, { icao24: 'c10048', callsign: 'CPA763', lat: 21.0, lng: 59.0, altitude: 11000, velocity: 258, heading: 85, verticalRate: 0, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 + 4 * HOUR, activeEnd: T0 + 11 * HOUR }, { icao24: 'c10049', callsign: 'KAL507', lat: 25.0, lng: 52.0, altitude: 11000, velocity: 250, heading: 65, verticalRate: 0, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 + 5 * HOUR, activeEnd: T0 + 12 * HOUR }, { icao24: 'c10050', callsign: 'BAW117', lat: 30.0, lng: 38.0, altitude: 11000, velocity: 255, heading: 130, verticalRate: 0, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 + 5 * HOUR, activeEnd: T0 + 12 * HOUR }, { icao24: 'c10051', callsign: 'DLH602', lat: 33.0, lng: 35.0, altitude: 11000, velocity: 245, heading: 120, verticalRate: 0, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 + 4 * HOUR, activeEnd: T0 + 11 * HOUR }, { icao24: 'c10052', callsign: 'AFR564', lat: 34.0, lng: 33.0, altitude: 11000, velocity: 248, heading: 110, verticalRate: 0, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 + 5 * HOUR, activeEnd: T0 + 12 * HOUR }, { icao24: 'c10053', callsign: 'UAE870', lat: 25.2, lng: 55.3, altitude: 10668, velocity: 258, heading: 340, verticalRate: 3, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 + 6 * HOUR, activeEnd: T0 + 12 * HOUR }, { icao24: 'c10054', callsign: 'QTR360', lat: 25.4, lng: 51.3, altitude: 10668, velocity: 252, heading: 320, verticalRate: 2, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 + 6 * HOUR, activeEnd: T0 + 12 * HOUR }, { icao24: 'c10055', callsign: 'SVA401', lat: 24.9, lng: 46.6, altitude: 10668, velocity: 250, heading: 80, verticalRate: 0, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 + 6 * HOUR, activeEnd: T0 + 12 * HOUR }, { icao24: 'c10056', callsign: 'FDB301', lat: 25.0, lng: 55.2, altitude: 9000, velocity: 230, heading: 250, verticalRate: 0, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 + 7 * HOUR, activeEnd: T0 + 12 * HOUR }, { icao24: 'c10057', callsign: 'AIC115', lat: 25.3, lng: 55.0, altitude: 10668, velocity: 245, heading: 120, verticalRate: 0, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 + 5 * HOUR, activeEnd: T0 + 12 * HOUR }, { icao24: 'c10058', callsign: 'PAK302', lat: 25.5, lng: 55.3, altitude: 10000, velocity: 238, heading: 90, verticalRate: 0, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 + 6 * HOUR, activeEnd: T0 + 12 * HOUR }, { icao24: 'c10059', callsign: 'RJA401', lat: 31.7, lng: 36.0, altitude: 10668, velocity: 240, heading: 180, verticalRate: 0, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 + 5 * HOUR, activeEnd: T0 + 11 * HOUR }, { icao24: 'c10060', callsign: 'MEA341', lat: 33.8, lng: 35.5, altitude: 10000, velocity: 235, heading: 250, verticalRate: 0, onGround: false, category: 'civilian', lastSeen: now, activeStart: T0 + 6 * HOUR, activeEnd: T0 + 12 * HOUR }, ]; }