declare local var.mapped STRING;
declare local var.sourceType STRING;

if (fastly.ff.visits_this_service == 0 && req.restarts == 0) {

  set var.sourceType = "country";
  
  # Extract automatic location data from source variable
  # and normalize (for lat/lng)
  if (var.sourceType == "country") {
    set req.http.geo-region-id = client.geo.country_code;
    
  } else if (var.sourceType == "continent") {
    set req.http.geo-region-id = client.geo.continent_code;
    
  } else if (var.sourceType == "latlng") {
    declare local var.chunk_size FLOAT;
    declare local var.lat FLOAT;
    declare local var.long FLOAT;
  
    set var.chunk_size = 0.1;
    set var.lat = client.geo.latitude;
    set var.long = client.geo.longitude;
    
    set var.lat /= var.chunk_size;
    set var.lat = math.floor(var.lat);
    set var.lat *= var.chunk_size;
    set var.lat += var.chunk_size;
      
    set var.long /= var.chunk_size;
    set var.long = math.floor(var.long);
    set var.long *= var.chunk_size;
    
    set req.http.geo-region-id = var.lat + "," + var.long;
  }
  
  # Allow client to override automatic location detection
  if (req.http.cookie:geo-region-id) {
    set req.http.geo-region-id = req.http.cookie:geo-region-id;
  }
  
  # Remap countries into custom regions
  if (var.sourceType == "country") {
    set var.mapped = table.lookup(
      region_defs,
      req.http.geo-region-id,
      table.lookup(region_defs, "_default")
    );
    if (var.mapped) {
      set req.http.geo-region-id = var.mapped;
    }
  }
  
  # Apply any blocks
  if (req.http.geo-region-id == "blocked") {
    error 618 "geofence:blocked";
  }
}