struct buf0 {
  injectionSwitch : vec2<f32>;
};

var<private> x_GLF_color : vec4<f32>;

var<private> gl_FragCoord : vec4<f32>;

[[group(0), binding(0)]] var<uniform> x_8 : buf0;

fn main_1() {
  var odd_index : i32;
  var even_index : i32;
  var j : i32;
  var ll : i32;
  var x_59 : bool;
  var x_60_phi : bool;
  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
  let x_53 : f32 = gl_FragCoord.x;
  let x_54 : bool = (x_53 < 128.0);
  x_60_phi = x_54;
  if (x_54) {
    let x_58 : f32 = gl_FragCoord.y;
    x_59 = (x_58 < 128.0);
    x_60_phi = x_59;
  }
  let x_60 : bool = x_60_phi;
  if (x_60) {
    return;
  }
  odd_index = 0;
  loop {
    let x_11 : i32 = odd_index;
    if ((x_11 <= 1)) {
    } else {
      break;
    }
    let x_70 : f32 = x_GLF_color.x;
    x_GLF_color.x = (x_70 + 0.25);
    let x_12 : i32 = odd_index;
    odd_index = (x_12 + 1);
  }
  even_index = 1;
  loop {
    let x_14 : i32 = even_index;
    if ((x_14 >= 0)) {
    } else {
      break;
    }
    let x_80 : f32 = x_GLF_color.x;
    x_GLF_color.x = (x_80 + 0.25);
    let x_84 : f32 = x_8.injectionSwitch.x;
    let x_86 : f32 = x_8.injectionSwitch.y;
    if ((x_84 > x_86)) {
      continue;
    }
    let x_15 : i32 = even_index;
    if ((x_15 >= 1)) {
      discard;
    }
    j = 1;
    loop {
      if (true) {
      } else {
        break;
      }
      let x_16 : i32 = ll;
      if ((x_16 >= 3)) {
        break;
      }
      let x_17 : i32 = ll;
      ll = (x_17 + 1);
      let x_19 : i32 = j;
      if ((bitcast<u32>(x_19) < 1u)) {
        continue;
      }
      let x_106 : f32 = x_8.injectionSwitch.x;
      let x_108 : f32 = x_8.injectionSwitch.y;
      if ((x_106 > x_108)) {
        break;
      }

      continuing {
        let x_20 : i32 = j;
        j = (x_20 + 1);
      }
    }
    let x_113 : f32 = x_8.injectionSwitch.x;
    let x_115 : f32 = x_8.injectionSwitch.y;
    if ((x_113 > x_115)) {
      x_GLF_color = vec4<f32>(1.0, 1.0, 1.0, 1.0);
    }
    let x_22 : i32 = even_index;
    even_index = (x_22 - 1);
  }
  return;
}

struct main_out {
  [[location(0)]]
  x_GLF_color_1 : vec4<f32>;
};

[[stage(fragment)]]
fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
  gl_FragCoord = gl_FragCoord_param;
  main_1();
  return main_out(x_GLF_color);
}
