type Arr = [[stride(16)]] array<f32, 1>;

struct buf0 {
  x_GLF_uniform_float_values : Arr;
};

type Arr_1 = [[stride(16)]] array<i32, 3>;

struct buf1 {
  x_GLF_uniform_int_values : Arr_1;
};

var<private> gl_FragCoord : vec4<f32>;

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

[[group(0), binding(1)]] var<uniform> x_11 : buf1;

var<private> x_GLF_color : vec4<f32>;

fn f1_() -> i32 {
  var a : i32;
  var i : i32;
  a = 256;
  let x_65 : f32 = gl_FragCoord.y;
  let x_67 : f32 = x_8.x_GLF_uniform_float_values[0];
  if ((x_65 > x_67)) {
    let x_71 : i32 = a;
    a = (x_71 + 1);
  }
  let x_73 : i32 = a;
  i = countOneBits(x_73);
  let x_75 : i32 = i;
  let x_77 : i32 = x_11.x_GLF_uniform_int_values[0];
  if ((x_75 < x_77)) {
    let x_82 : i32 = x_11.x_GLF_uniform_int_values[0];
    return x_82;
  }
  let x_83 : i32 = i;
  return x_83;
}

fn main_1() {
  var a_1 : i32;
  let x_38 : i32 = f1_();
  a_1 = x_38;
  let x_39 : i32 = a_1;
  let x_41 : i32 = x_11.x_GLF_uniform_int_values[2];
  if ((x_39 == x_41)) {
    let x_47 : i32 = x_11.x_GLF_uniform_int_values[0];
    let x_50 : i32 = x_11.x_GLF_uniform_int_values[1];
    let x_53 : i32 = x_11.x_GLF_uniform_int_values[1];
    let x_56 : i32 = x_11.x_GLF_uniform_int_values[0];
    x_GLF_color = vec4<f32>(f32(x_47), f32(x_50), f32(x_53), f32(x_56));
  } else {
    let x_60 : i32 = x_11.x_GLF_uniform_int_values[1];
    let x_61 : f32 = f32(x_60);
    x_GLF_color = vec4<f32>(x_61, x_61, x_61, x_61);
  }
  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);
}
