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

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

var<private> gv : f32;

var<private> gl_FragCoord : vec4<f32>;

var<private> x_GLF_color : vec4<f32>;

fn main_1() {
  var lv : f32;
  var x_43 : f32;
  var GLF_live5r : i32;
  var GLF_live5_looplimiter6 : i32;
  let x_45 : f32 = x_7.injectionSwitch.y;
  if ((1.0 > x_45)) {
    let x_50 : f32 = gv;
    x_43 = abs(x_50);
  } else {
    x_43 = 260.0;
  }
  let x_52 : f32 = x_43;
  lv = x_52;
  let x_53 : f32 = lv;
  if ((i32(x_53) < 250)) {
    let x_58 : f32 = lv;
    if ((i32(x_58) < 180)) {
      let x_64 : f32 = lv;
      let x_65 : f32 = clamp(x_64, 1.0, 1.0);
    } else {
      let x_67 : f32 = gl_FragCoord.y;
      if ((x_67 < 0.0)) {
        let x_71 : f32 = lv;
        if ((i32(x_71) < 210)) {
          loop {

            continuing {
              if (true) {
              } else {
                break;
              }
            }
          }
        }
        GLF_live5r = 0;
        loop {
          if (true) {
          } else {
            break;
          }
          let x_11 : i32 = GLF_live5_looplimiter6;
          if ((x_11 >= 6)) {
            break;
          }
          let x_12 : i32 = GLF_live5_looplimiter6;
          GLF_live5_looplimiter6 = (x_12 + 1);
        }
      }
    }
  }
  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
  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);
}
