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

[[block]]
struct buf0 {
  x_GLF_uniform_float_values : Arr;
};

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

[[block]]
struct buf1 {
  x_GLF_uniform_int_values : Arr_1;
};

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

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

var<private> x_GLF_color : vec4<f32>;

fn main_1() {
  var a : u32;
  var values : vec4<f32>;
  var ref : vec4<f32>;
  var x_85 : bool;
  var x_101 : bool;
  var x_117 : bool;
  var x_86_phi : bool;
  var x_102_phi : bool;
  var x_118_phi : bool;
  a = pack2x16float(vec2<f32>(1.0, 1.0));
  let x_38 : u32 = a;
  values = unpack4x8unorm(x_38);
  let x_41 : f32 = x_8.x_GLF_uniform_float_values[3];
  let x_43 : f32 = x_8.x_GLF_uniform_float_values[1];
  let x_45 : f32 = x_8.x_GLF_uniform_float_values[0];
  let x_48 : f32 = x_8.x_GLF_uniform_float_values[3];
  let x_50 : f32 = x_8.x_GLF_uniform_float_values[0];
  let x_53 : f32 = x_8.x_GLF_uniform_float_values[1];
  let x_55 : f32 = x_8.x_GLF_uniform_float_values[0];
  ref = vec4<f32>(x_41, (x_43 / x_45), (x_48 / x_50), (x_53 / x_55));
  let x_59 : i32 = x_10.x_GLF_uniform_int_values[0];
  let x_61 : f32 = values[x_59];
  let x_63 : i32 = x_10.x_GLF_uniform_int_values[0];
  let x_65 : f32 = ref[x_63];
  let x_69 : f32 = x_8.x_GLF_uniform_float_values[2];
  let x_70 : bool = (abs((x_61 - x_65)) < x_69);
  x_86_phi = x_70;
  if (x_70) {
    let x_74 : i32 = x_10.x_GLF_uniform_int_values[1];
    let x_76 : f32 = values[x_74];
    let x_78 : i32 = x_10.x_GLF_uniform_int_values[1];
    let x_80 : f32 = ref[x_78];
    let x_84 : f32 = x_8.x_GLF_uniform_float_values[2];
    x_85 = (abs((x_76 - x_80)) < x_84);
    x_86_phi = x_85;
  }
  let x_86 : bool = x_86_phi;
  x_102_phi = x_86;
  if (x_86) {
    let x_90 : i32 = x_10.x_GLF_uniform_int_values[3];
    let x_92 : f32 = values[x_90];
    let x_94 : i32 = x_10.x_GLF_uniform_int_values[3];
    let x_96 : f32 = ref[x_94];
    let x_100 : f32 = x_8.x_GLF_uniform_float_values[2];
    x_101 = (abs((x_92 - x_96)) < x_100);
    x_102_phi = x_101;
  }
  let x_102 : bool = x_102_phi;
  x_118_phi = x_102;
  if (x_102) {
    let x_106 : i32 = x_10.x_GLF_uniform_int_values[2];
    let x_108 : f32 = values[x_106];
    let x_110 : i32 = x_10.x_GLF_uniform_int_values[2];
    let x_112 : f32 = ref[x_110];
    let x_116 : f32 = x_8.x_GLF_uniform_float_values[2];
    x_117 = (abs((x_108 - x_112)) < x_116);
    x_118_phi = x_117;
  }
  let x_118 : bool = x_118_phi;
  if (x_118) {
    let x_123 : i32 = x_10.x_GLF_uniform_int_values[1];
    let x_126 : i32 = x_10.x_GLF_uniform_int_values[0];
    let x_129 : i32 = x_10.x_GLF_uniform_int_values[0];
    let x_132 : i32 = x_10.x_GLF_uniform_int_values[1];
    x_GLF_color = vec4<f32>(f32(x_123), f32(x_126), f32(x_129), f32(x_132));
  } else {
    let x_136 : i32 = x_10.x_GLF_uniform_int_values[0];
    let x_137 : f32 = f32(x_136);
    x_GLF_color = vec4<f32>(x_137, x_137, x_137, x_137);
  }
  return;
}

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

[[stage(fragment)]]
fn main() -> main_out {
  main_1();
  return main_out(x_GLF_color);
}
