struct S {
  numbers : array<f32, 3>;
};

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

struct buf1 {
  x_GLF_uniform_float_values : Arr;
};

struct buf2 {
  zeroVec : vec2<f32>;
};

struct buf3 {
  oneVec : vec2<f32>;
};

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

struct buf0 {
  x_GLF_uniform_int_values : Arr_1;
};

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

[[group(0), binding(2)]] var<uniform> x_9 : buf2;

[[group(0), binding(3)]] var<uniform> x_12 : buf3;

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

var<private> x_GLF_color : vec4<f32>;

fn main_1() {
  var obj : S;
  var a : f32;
  var x_49 : vec2<f32>;
  var b : f32;
  let x_51 : f32 = x_7.x_GLF_uniform_float_values[3];
  let x_53 : f32 = x_7.x_GLF_uniform_float_values[2];
  let x_55 : f32 = x_7.x_GLF_uniform_float_values[4];
  obj = S(array<f32, 3>(x_51, x_53, x_55));
  let x_59 : f32 = x_9.zeroVec.x;
  let x_62 : f32 = x_7.x_GLF_uniform_float_values[0];
  obj.numbers[i32(x_59)] = x_62;
  let x_65 : f32 = x_9.zeroVec.x;
  let x_67 : f32 = x_7.x_GLF_uniform_float_values[0];
  if ((x_65 > x_67)) {
    let x_73 : vec2<f32> = x_9.zeroVec;
    x_49 = x_73;
  } else {
    let x_75 : vec2<f32> = x_12.oneVec;
    x_49 = x_75;
  }
  let x_77 : f32 = x_49.y;
  a = x_77;
  let x_79 : f32 = x_7.x_GLF_uniform_float_values[0];
  let x_80 : f32 = a;
  let x_82 : i32 = x_15.x_GLF_uniform_int_values[0];
  let x_84 : f32 = obj.numbers[x_82];
  b = mix(x_79, x_80, x_84);
  let x_86 : f32 = b;
  let x_88 : f32 = x_7.x_GLF_uniform_float_values[2];
  let x_91 : f32 = x_7.x_GLF_uniform_float_values[1];
  if ((distance(x_86, x_88) < x_91)) {
    let x_97 : i32 = x_15.x_GLF_uniform_int_values[0];
    let x_100 : i32 = x_15.x_GLF_uniform_int_values[1];
    let x_103 : i32 = x_15.x_GLF_uniform_int_values[1];
    let x_106 : i32 = x_15.x_GLF_uniform_int_values[0];
    x_GLF_color = vec4<f32>(f32(x_97), f32(x_100), f32(x_103), f32(x_106));
  } else {
    let x_110 : i32 = x_15.x_GLF_uniform_int_values[1];
    let x_111 : f32 = f32(x_110);
    x_GLF_color = vec4<f32>(x_111, x_111, x_111, x_111);
  }
  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);
}
