type Arr = @stride(16) array<i32, 3>;

struct buf0 {
  x_GLF_uniform_int_values : Arr;
};

type Arr_1 = @stride(16) array<f32, 1>;

struct buf1 {
  x_GLF_uniform_float_values : Arr_1;
};

var<private> x_GLF_color : vec4<f32>;

@group(0) @binding(0) var<uniform> x_6 : buf0;

var<private> gl_FragCoord : vec4<f32>;

@group(0) @binding(1) var<uniform> x_9 : buf1;

fn main_1() {
  var i : i32;
  let x_34 : i32 = x_6.x_GLF_uniform_int_values[2];
  let x_35 : f32 = f32(x_34);
  x_GLF_color = vec4<f32>(x_35, x_35, x_35, x_35);
  let x_38 : f32 = gl_FragCoord.y;
  let x_40 : f32 = x_9.x_GLF_uniform_float_values[0];
  i = (1 << bitcast<u32>(select(1, 2, (x_38 >= x_40))));
  loop {
    var x_57 : bool;
    var x_58_phi : bool;
    let x_48 : i32 = i;
    let x_50 : i32 = x_6.x_GLF_uniform_int_values[0];
    let x_51 : bool = (x_48 != x_50);
    x_58_phi = x_51;
    if (x_51) {
      let x_54 : i32 = i;
      let x_56 : i32 = x_6.x_GLF_uniform_int_values[1];
      x_57 = (x_54 < x_56);
      x_58_phi = x_57;
    }
    let x_58 : bool = x_58_phi;
    if (x_58) {
    } else {
      break;
    }
    let x_61 : i32 = x_6.x_GLF_uniform_int_values[0];
    let x_64 : i32 = x_6.x_GLF_uniform_int_values[2];
    let x_67 : i32 = x_6.x_GLF_uniform_int_values[2];
    let x_70 : i32 = x_6.x_GLF_uniform_int_values[0];
    x_GLF_color = vec4<f32>(f32(x_61), f32(x_64), f32(x_67), f32(x_70));

    continuing {
      let x_73 : i32 = i;
      i = (x_73 + 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);
}
