{
 "checked": "2026-10-12",
 "nasa_path": {
  "2027-08-02": {
   "central_points": 102,
   "max_duration_diff_s": 0.18,
   "limit_points": 203,
   "max_edge_offset_km": 0.12
  },
  "2044-08-23": {
   "central_points": 28,
   "max_duration_diff_s": 0.06,
   "limit_points": 53,
   "max_edge_offset_km": 0.05
  },
  "2045-08-12": {
   "central_points": 100,
   "max_duration_diff_s": 0.19,
   "limit_points": 200,
   "max_edge_offset_km": 0.12
  }
 },
 "nasa_script": {
  "grid_points_total": 2616,
  "type_mismatches": 0,
  "max_duration_diff_s": 0,
  "max_time_diff_s": 0
 },
 "ign": {
  "towns": 105,
  "median_abs_duration_diff_s": 3.5,
  "max_abs_duration_diff_s": 26.7,
  "within_5s": 74,
  "precise_share_rule": 0.45,
  "max_time_diff_range_s": [
   4,
   7.3
  ],
  "rows": [
   {
    "name": "Adra",
    "ign_s": 103,
    "ours_s": 105.9,
    "diff_s": 2.9,
    "share_of_central": 0.354,
    "max_time_diff_s": 6.2
   },
   {
    "name": "Roquetas de Mar",
    "ign_s": 90,
    "ours_s": 99.1,
    "diff_s": 9.1,
    "share_of_central": 0.331,
    "max_time_diff_s": 5.3
   },
   {
    "name": "El Ejido",
    "ign_s": 80,
    "ours_s": 91.3,
    "diff_s": 11.3,
    "share_of_central": 0.305,
    "max_time_diff_s": 5.9
   },
   {
    "name": "La Mojonera",
    "ign_s": 99,
    "ours_s": 104.9,
    "diff_s": 5.9,
    "share_of_central": 0.351,
    "max_time_diff_s": 6.2
   },
   {
    "name": "Balanegra",
    "ign_s": 105,
    "ours_s": 106.8,
    "diff_s": 1.8,
    "share_of_central": 0.357,
    "max_time_diff_s": 6.2
   },
   {
    "name": "Alcalá de los Gazules",
    "ign_s": 201,
    "ours_s": 202.8,
    "diff_s": 1.8,
    "share_of_central": 0.69,
    "max_time_diff_s": 6.3
   },
   {
    "name": "Algar",
    "ign_s": 126,
    "ours_s": 129.1,
    "diff_s": 3.1,
    "share_of_central": 0.44,
    "max_time_diff_s": 6.1
   },
   {
    "name": "Algeciras",
    "ign_s": 266,
    "ours_s": 268,
    "diff_s": 2,
    "share_of_central": 0.912,
    "max_time_diff_s": 4.9
   },
   {
    "name": "Arcos de la Frontera",
    "ign_s": 36,
    "ours_s": 42.5,
    "diff_s": 6.5,
    "share_of_central": 0.145,
    "max_time_diff_s": 5.7
   },
   {
    "name": "Barbate",
    "ign_s": 255,
    "ours_s": 256.6,
    "diff_s": 1.6,
    "share_of_central": 0.89,
    "max_time_diff_s": 5.8
   },
   {
    "name": "Los Barrios",
    "ign_s": 260,
    "ours_s": 260.9,
    "diff_s": 0.9,
    "share_of_central": 0.888,
    "max_time_diff_s": 5.5
   },
   {
    "name": "Benaocaz",
    "ign_s": 102,
    "ours_s": 107.5,
    "diff_s": 5.5,
    "share_of_central": 0.366,
    "max_time_diff_s": 6.1
   },
   {
    "name": "El Bosque",
    "ign_s": 35,
    "ours_s": 50.7,
    "diff_s": 15.7,
    "share_of_central": 0.173,
    "max_time_diff_s": 5.5
   },
   {
    "name": "Cádiz",
    "ign_s": 174,
    "ours_s": 178.1,
    "diff_s": 4.1,
    "share_of_central": 0.618,
    "max_time_diff_s": 5.7
   },
   {
    "name": "Castellar de la Frontera",
    "ign_s": 244,
    "ours_s": 245.2,
    "diff_s": 1.2,
    "share_of_central": 0.834,
    "max_time_diff_s": 5.6
   },
   {
    "name": "Conil de la Frontera",
    "ign_s": 240,
    "ours_s": 240.3,
    "diff_s": 0.3,
    "share_of_central": 0.833,
    "max_time_diff_s": 5.5
   },
   {
    "name": "Chiclana de la Frontera",
    "ign_s": 208,
    "ours_s": 210.1,
    "diff_s": 2.1,
    "share_of_central": 0.729,
    "max_time_diff_s": 5.2
   },
   {
    "name": "Grazalema",
    "ign_s": 41,
    "ours_s": 54,
    "diff_s": 13,
    "share_of_central": 0.184,
    "max_time_diff_s": 6.1
   },
   {
    "name": "Jerez de la Frontera",
    "ign_s": 81,
    "ours_s": 98.7,
    "diff_s": 17.7,
    "share_of_central": 0.342,
    "max_time_diff_s": 6.2
   },
   {
    "name": "Jimena de la Frontera",
    "ign_s": 213,
    "ours_s": 213.7,
    "diff_s": 0.7,
    "share_of_central": 0.727,
    "max_time_diff_s": 6.5
   },
   {
    "name": "La Línea de la Concepción",
    "ign_s": 263,
    "ours_s": 263.9,
    "diff_s": 0.9,
    "share_of_central": 0.898,
    "max_time_diff_s": 6
   },
   {
    "name": "Medina Sidonia",
    "ign_s": 200,
    "ours_s": 199.8,
    "diff_s": -0.2,
    "share_of_central": 0.693,
    "max_time_diff_s": 5.9
   },
   {
    "name": "Paterna de Rivera",
    "ign_s": 180,
    "ours_s": 182.4,
    "diff_s": 2.4,
    "share_of_central": 0.621,
    "max_time_diff_s": 6
   },
   {
    "name": "El Puerto de Santa María",
    "ign_s": 143,
    "ours_s": 146.9,
    "diff_s": 3.9,
    "share_of_central": 0.509,
    "max_time_diff_s": 4.9
   },
   {
    "name": "Puerto Real",
    "ign_s": 173,
    "ours_s": 174.8,
    "diff_s": 1.8,
    "share_of_central": 0.606,
    "max_time_diff_s": 6.5
   },
   {
    "name": "Rota",
    "ign_s": 130,
    "ours_s": 129.4,
    "diff_s": -0.6,
    "share_of_central": 0.449,
    "max_time_diff_s": 5.2
   },
   {
    "name": "San Fernando",
    "ign_s": 194,
    "ours_s": 197.8,
    "diff_s": 3.8,
    "share_of_central": 0.686,
    "max_time_diff_s": 5.5
   },
   {
    "name": "San Roque",
    "ign_s": 257,
    "ours_s": 257.3,
    "diff_s": 0.3,
    "share_of_central": 0.876,
    "max_time_diff_s": 5.3
   },
   {
    "name": "Tarifa",
    "ign_s": 278,
    "ours_s": 278.4,
    "diff_s": 0.4,
    "share_of_central": 0.948,
    "max_time_diff_s": 5
   },
   {
    "name": "Ubrique",
    "ign_s": 117,
    "ours_s": 124.7,
    "diff_s": 7.7,
    "share_of_central": 0.424,
    "max_time_diff_s": 5.8
   },
   {
    "name": "Vejer de la Frontera",
    "ign_s": 245,
    "ours_s": 246.7,
    "diff_s": 1.7,
    "share_of_central": 0.856,
    "max_time_diff_s": 6
   },
   {
    "name": "Villaluenga del Rosario",
    "ign_s": 106,
    "ours_s": 111,
    "diff_s": 5,
    "share_of_central": 0.378,
    "max_time_diff_s": 6.6
   },
   {
    "name": "Benalup-Casas Viejas",
    "ign_s": 229,
    "ours_s": 230.7,
    "diff_s": 1.7,
    "share_of_central": 0.785,
    "max_time_diff_s": 5.4
   },
   {
    "name": "San José del Valle",
    "ign_s": 149,
    "ours_s": 151.5,
    "diff_s": 2.5,
    "share_of_central": 0.516,
    "max_time_diff_s": 6
   },
   {
    "name": "San Martín del Tesorillo",
    "ign_s": 234,
    "ours_s": 235.5,
    "diff_s": 1.5,
    "share_of_central": 0.802,
    "max_time_diff_s": 5.5
   },
   {
    "name": "Albuñol",
    "ign_s": 59,
    "ours_s": 66.9,
    "diff_s": 7.9,
    "share_of_central": 0.224,
    "max_time_diff_s": 6.2
   },
   {
    "name": "Almuñécar",
    "ign_s": 108,
    "ours_s": 110.9,
    "diff_s": 2.9,
    "share_of_central": 0.371,
    "max_time_diff_s": 5
   },
   {
    "name": "Gualchos",
    "ign_s": 104,
    "ours_s": 108.1,
    "diff_s": 4.1,
    "share_of_central": 0.361,
    "max_time_diff_s": 6.6
   },
   {
    "name": "Ítrabo",
    "ign_s": 37,
    "ours_s": 51.4,
    "diff_s": 14.4,
    "share_of_central": 0.172,
    "max_time_diff_s": 6.3
   },
   {
    "name": "Jete",
    "ign_s": 43,
    "ours_s": 58.5,
    "diff_s": 15.5,
    "share_of_central": 0.196,
    "max_time_diff_s": 6.3
   },
   {
    "name": "Lújar",
    "ign_s": 61,
    "ours_s": 70.1,
    "diff_s": 9.1,
    "share_of_central": 0.234,
    "max_time_diff_s": 6.4
   },
   {
    "name": "Molvízar",
    "ign_s": 59,
    "ours_s": 67.8,
    "diff_s": 8.8,
    "share_of_central": 0.227,
    "max_time_diff_s": 5.4
   },
   {
    "name": "Motril",
    "ign_s": 101,
    "ours_s": 105.4,
    "diff_s": 4.4,
    "share_of_central": 0.352,
    "max_time_diff_s": 6.3
   },
   {
    "name": "Polopos",
    "ign_s": 50,
    "ours_s": 62.1,
    "diff_s": 12.1,
    "share_of_central": 0.208,
    "max_time_diff_s": 6.3
   },
   {
    "name": "Rubite",
    "ign_s": 11,
    "ours_s": 37.7,
    "diff_s": 26.7,
    "share_of_central": 0.126,
    "max_time_diff_s": 6.8
   },
   {
    "name": "Salobreña",
    "ign_s": 103,
    "ours_s": 106.1,
    "diff_s": 3.1,
    "share_of_central": 0.355,
    "max_time_diff_s": 6.2
   },
   {
    "name": "Sorvilán",
    "ign_s": 53,
    "ours_s": 62.4,
    "diff_s": 9.4,
    "share_of_central": 0.209,
    "max_time_diff_s": 6.6
   },
   {
    "name": "Torrenueva Costa",
    "ign_s": 130,
    "ours_s": 131.8,
    "diff_s": 1.8,
    "share_of_central": 0.441,
    "max_time_diff_s": 5.6
   },
   {
    "name": "Algarrobo",
    "ign_s": 69,
    "ours_s": 77.8,
    "diff_s": 8.8,
    "share_of_central": 0.26,
    "max_time_diff_s": 5.8
   },
   {
    "name": "Algatocín",
    "ign_s": 169,
    "ours_s": 172.6,
    "diff_s": 3.6,
    "share_of_central": 0.588,
    "max_time_diff_s": 6.5
   },
   {
    "name": "Alhaurín de la Torre",
    "ign_s": 140,
    "ours_s": 144.6,
    "diff_s": 4.6,
    "share_of_central": 0.492,
    "max_time_diff_s": 5.2
   },
   {
    "name": "Alhaurín el Grande",
    "ign_s": 147,
    "ours_s": 151.1,
    "diff_s": 4.1,
    "share_of_central": 0.514,
    "max_time_diff_s": 6.3
   },
   {
    "name": "Alozaina",
    "ign_s": 94,
    "ours_s": 99.7,
    "diff_s": 5.7,
    "share_of_central": 0.339,
    "max_time_diff_s": 5.7
   },
   {
    "name": "Alpandeire",
    "ign_s": 145,
    "ours_s": 148.7,
    "diff_s": 3.7,
    "share_of_central": 0.506,
    "max_time_diff_s": 5.8
   },
   {
    "name": "Atajate",
    "ign_s": 142,
    "ours_s": 145,
    "diff_s": 3,
    "share_of_central": 0.493,
    "max_time_diff_s": 6.1
   },
   {
    "name": "Benadalid",
    "ign_s": 157,
    "ours_s": 159.3,
    "diff_s": 2.3,
    "share_of_central": 0.542,
    "max_time_diff_s": 6.7
   },
   {
    "name": "Benahavís",
    "ign_s": 190,
    "ours_s": 192.8,
    "diff_s": 2.8,
    "share_of_central": 0.656,
    "max_time_diff_s": 5.6
   },
   {
    "name": "Benalauría",
    "ign_s": 162,
    "ours_s": 164.7,
    "diff_s": 2.7,
    "share_of_central": 0.561,
    "max_time_diff_s": 6
   },
   {
    "name": "Benalmádena",
    "ign_s": 171,
    "ours_s": 172.3,
    "diff_s": 1.3,
    "share_of_central": 0.586,
    "max_time_diff_s": 6.7
   },
   {
    "name": "Benamocarra",
    "ign_s": 42,
    "ours_s": 50.9,
    "diff_s": 8.9,
    "share_of_central": 0.17,
    "max_time_diff_s": 5.5
   },
   {
    "name": "Benaoján",
    "ign_s": 92,
    "ours_s": 97.7,
    "diff_s": 5.7,
    "share_of_central": 0.333,
    "max_time_diff_s": 6.3
   },
   {
    "name": "Benarrabá",
    "ign_s": 178,
    "ours_s": 180.5,
    "diff_s": 2.5,
    "share_of_central": 0.614,
    "max_time_diff_s": 6.1
   },
   {
    "name": "Cartajima",
    "ign_s": 140,
    "ours_s": 143.9,
    "diff_s": 3.9,
    "share_of_central": 0.49,
    "max_time_diff_s": 6.6
   },
   {
    "name": "Cártama",
    "ign_s": 112,
    "ours_s": 114.6,
    "diff_s": 2.6,
    "share_of_central": 0.39,
    "max_time_diff_s": 5.6
   },
   {
    "name": "Casarabonela",
    "ign_s": 10,
    "ours_s": 28.6,
    "diff_s": 18.6,
    "share_of_central": 0.097,
    "max_time_diff_s": 6.3
   },
   {
    "name": "Casares",
    "ign_s": 211,
    "ours_s": 212.2,
    "diff_s": 1.2,
    "share_of_central": 0.722,
    "max_time_diff_s": 6.1
   },
   {
    "name": "Coín",
    "ign_s": 139,
    "ours_s": 142,
    "diff_s": 3,
    "share_of_central": 0.483,
    "max_time_diff_s": 5.6
   },
   {
    "name": "Cortes de la Frontera",
    "ign_s": 150,
    "ours_s": 153.6,
    "diff_s": 3.6,
    "share_of_central": 0.523,
    "max_time_diff_s": 7.1
   },
   {
    "name": "Estepona",
    "ign_s": 216,
    "ours_s": 218.3,
    "diff_s": 2.3,
    "share_of_central": 0.743,
    "max_time_diff_s": 4.8
   },
   {
    "name": "Faraján",
    "ign_s": 153,
    "ours_s": 156.6,
    "diff_s": 3.6,
    "share_of_central": 0.533,
    "max_time_diff_s": 6.6
   },
   {
    "name": "Frigiliana",
    "ign_s": 43,
    "ours_s": 59.5,
    "diff_s": 16.5,
    "share_of_central": 0.199,
    "max_time_diff_s": 6.5
   },
   {
    "name": "Fuengirola",
    "ign_s": 190,
    "ours_s": 186.4,
    "diff_s": -3.6,
    "share_of_central": 0.634,
    "max_time_diff_s": 6.5
   },
   {
    "name": "Gaucín",
    "ign_s": 189,
    "ours_s": 190.8,
    "diff_s": 1.8,
    "share_of_central": 0.649,
    "max_time_diff_s": 6.4
   },
   {
    "name": "Genalguacil",
    "ign_s": 180,
    "ours_s": 182.9,
    "diff_s": 2.9,
    "share_of_central": 0.623,
    "max_time_diff_s": 5.7
   },
   {
    "name": "Guaro",
    "ign_s": 140,
    "ours_s": 142.9,
    "diff_s": 2.9,
    "share_of_central": 0.487,
    "max_time_diff_s": 6.1
   },
   {
    "name": "Igualeja",
    "ign_s": 147,
    "ours_s": 151.1,
    "diff_s": 4.1,
    "share_of_central": 0.514,
    "max_time_diff_s": 6.5
   },
   {
    "name": "Istán",
    "ign_s": 170,
    "ours_s": 173.5,
    "diff_s": 3.5,
    "share_of_central": 0.591,
    "max_time_diff_s": 6.6
   },
   {
    "name": "Iznate",
    "ign_s": 62,
    "ours_s": 68.6,
    "diff_s": 6.6,
    "share_of_central": 0.229,
    "max_time_diff_s": 6.7
   },
   {
    "name": "Jimera de Líbar",
    "ign_s": 135,
    "ours_s": 139.3,
    "diff_s": 4.3,
    "share_of_central": 0.474,
    "max_time_diff_s": 6.2
   },
   {
    "name": "Jubrique",
    "ign_s": 174,
    "ours_s": 176,
    "diff_s": 2,
    "share_of_central": 0.599,
    "max_time_diff_s": 6.5
   },
   {
    "name": "Júzcar",
    "ign_s": 150,
    "ours_s": 152.7,
    "diff_s": 2.7,
    "share_of_central": 0.52,
    "max_time_diff_s": 6
   },
   {
    "name": "Macharaviaya",
    "ign_s": 77,
    "ours_s": 83.5,
    "diff_s": 6.5,
    "share_of_central": 0.279,
    "max_time_diff_s": 6.3
   },
   {
    "name": "Málaga",
    "ign_s": 109,
    "ours_s": 113.1,
    "diff_s": 4.1,
    "share_of_central": 0.385,
    "max_time_diff_s": 4.2
   },
   {
    "name": "Manilva",
    "ign_s": 227,
    "ours_s": 229,
    "diff_s": 2,
    "share_of_central": 0.78,
    "max_time_diff_s": 6.2
   },
   {
    "name": "Marbella",
    "ign_s": 196,
    "ours_s": 196.2,
    "diff_s": 0.2,
    "share_of_central": 0.668,
    "max_time_diff_s": 4
   },
   {
    "name": "Mijas",
    "ign_s": 170,
    "ours_s": 171.9,
    "diff_s": 1.9,
    "share_of_central": 0.585,
    "max_time_diff_s": 6.6
   },
   {
    "name": "Moclinejo",
    "ign_s": 67,
    "ours_s": 74,
    "diff_s": 7,
    "share_of_central": 0.252,
    "max_time_diff_s": 6.5
   },
   {
    "name": "Monda",
    "ign_s": 152,
    "ours_s": 155.4,
    "diff_s": 3.4,
    "share_of_central": 0.529,
    "max_time_diff_s": 6.7
   },
   {
    "name": "Montejaque",
    "ign_s": 79,
    "ours_s": 83.7,
    "diff_s": 4.7,
    "share_of_central": 0.285,
    "max_time_diff_s": 6.8
   },
   {
    "name": "Nerja",
    "ign_s": 99,
    "ours_s": 94.5,
    "diff_s": -4.5,
    "share_of_central": 0.316,
    "max_time_diff_s": 6.8
   },
   {
    "name": "Ojén",
    "ign_s": 178,
    "ours_s": 180.4,
    "diff_s": 2.4,
    "share_of_central": 0.614,
    "max_time_diff_s": 5.8
   },
   {
    "name": "Parauta",
    "ign_s": 135,
    "ours_s": 138.9,
    "diff_s": 3.9,
    "share_of_central": 0.473,
    "max_time_diff_s": 6.4
   },
   {
    "name": "Pizarra",
    "ign_s": 59,
    "ours_s": 78.6,
    "diff_s": 19.6,
    "share_of_central": 0.267,
    "max_time_diff_s": 6.6
   },
   {
    "name": "Pujerra",
    "ign_s": 156,
    "ours_s": 158.6,
    "diff_s": 2.6,
    "share_of_central": 0.54,
    "max_time_diff_s": 6.2
   },
   {
    "name": "Rincón de la Victoria",
    "ign_s": 113,
    "ours_s": 115.5,
    "diff_s": 2.5,
    "share_of_central": 0.393,
    "max_time_diff_s": 6.5
   },
   {
    "name": "Ronda",
    "ign_s": 78,
    "ours_s": 76,
    "diff_s": -2,
    "share_of_central": 0.259,
    "max_time_diff_s": 7.3
   },
   {
    "name": "Sayalonga",
    "ign_s": 27,
    "ours_s": 42.5,
    "diff_s": 15.5,
    "share_of_central": 0.142,
    "max_time_diff_s": 6.3
   },
   {
    "name": "Tolox",
    "ign_s": 122,
    "ours_s": 126.4,
    "diff_s": 4.4,
    "share_of_central": 0.43,
    "max_time_diff_s": 5.8
   },
   {
    "name": "Torrox",
    "ign_s": 85,
    "ours_s": 93,
    "diff_s": 8,
    "share_of_central": 0.311,
    "max_time_diff_s": 5.8
   },
   {
    "name": "Totalán",
    "ign_s": 72,
    "ours_s": 80.6,
    "diff_s": 8.6,
    "share_of_central": 0.274,
    "max_time_diff_s": 6.3
   },
   {
    "name": "Vélez-Málaga",
    "ign_s": 56,
    "ours_s": 74.2,
    "diff_s": 18.2,
    "share_of_central": 0.248,
    "max_time_diff_s": 5.6
   },
   {
    "name": "Yunquera",
    "ign_s": 90,
    "ours_s": 93.5,
    "diff_s": 3.5,
    "share_of_central": 0.318,
    "max_time_diff_s": 6.7
   },
   {
    "name": "Torremolinos",
    "ign_s": 160,
    "ours_s": 161.8,
    "diff_s": 1.8,
    "share_of_central": 0.551,
    "max_time_diff_s": 5.8
   },
   {
    "name": "Ceuta",
    "ign_s": 288,
    "ours_s": 288.3,
    "diff_s": 0.3,
    "share_of_central": 0.981,
    "max_time_diff_s": 4
   },
   {
    "name": "Melilla",
    "ign_s": 274,
    "ours_s": 272.5,
    "diff_s": -1.5,
    "share_of_central": 0.911,
    "max_time_diff_s": 4.9
   }
  ]
 },
 "robustness": {
  "2027-08-02": {
   "total": 305,
   "partial": 10511,
   "none": 9184,
   "error": 0,
   "nonfinite": 0
  },
  "2044-08-23": {
   "total": 190,
   "partial": 5820,
   "none": 13990,
   "error": 0,
   "nonfinite": 0
  },
  "2045-08-12": {
   "total": 240,
   "partial": 10749,
   "none": 9011,
   "error": 0,
   "nonfinite": 0
  }
 },
 "scope": {
  "nasa_path": "Totality duration at every central-line point and umbra-edge position at every limit point in NASA's path tables for the three eclipses (sea level).",
  "nasa_script": "Eclipse type, totality duration and time of maximum versus NASA's SEcirc.js on a 0.05 x 0.1 degree grid, 33.0-37.5 N, 7.0-1.0 W, 2027 only. Not tested worldwide, for partial-only locations, or near the horizon.",
  "ign": "Totality duration and time of maximum for the 105 Spanish municipalities IGN lists in totality, 2027 only, using CartoCiudad town centroids at sea level.",
  "robustness": "Only checks that results are finite or an explicit error for random worldwide points; it doesn't check accuracy."
 },
 "regression": [
  {
   "name": "Luxor is total with NASA's window",
   "pass": true
  },
  {
   "name": "maximum outside window -> error",
   "pass": true
  },
  {
   "name": "partial contacts outside window -> error",
   "pass": true
  },
  {
   "name": "totality outside window -> error",
   "pass": true
  },
  {
   "name": "no-eclipse location outside window -> error",
   "pass": true
  }
 ]
}
