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

struct buf0 {
  x_GLF_uniform_float_values : Arr;
};

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

struct buf1 {
  x_GLF_uniform_int_values : Arr_1;
};

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

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

var<private> x_GLF_color : vec4<f32>;

fn main_1() {
  var v0 : vec4<f32>;
  var v1 : vec4<f32>;
  var a : i32;
  var c : i32;
  let x_41 : f32 = x_6.x_GLF_uniform_float_values[1];
  v0 = vec4<f32>(x_41, x_41, x_41, x_41);
  let x_44 : f32 = x_6.x_GLF_uniform_float_values[0];
  v1 = vec4<f32>(x_44, x_44, x_44, x_44);
  let x_47 : i32 = x_10.x_GLF_uniform_int_values[1];
  a = x_47;
  loop {
    let x_52 : i32 = a;
    let x_54 : i32 = x_10.x_GLF_uniform_int_values[0];
    if ((x_52 < x_54)) {
    } else {
      break;
    }
    let x_58 : i32 = x_10.x_GLF_uniform_int_values[3];
    c = x_58;
    loop {
      let x_63 : i32 = c;
      let x_65 : i32 = x_10.x_GLF_uniform_int_values[2];
      if ((x_63 < x_65)) {
      } else {
        break;
      }
      let x_68 : i32 = c;
      let x_69 : i32 = clamp(x_68, 0, 3);
      let x_71 : f32 = x_6.x_GLF_uniform_float_values[1];
      let x_73 : f32 = v0[x_69];
      v0[x_69] = (x_73 - x_71);
      let x_77 : i32 = x_10.x_GLF_uniform_int_values[1];
      let x_79 : i32 = x_10.x_GLF_uniform_int_values[3];
      if ((x_77 == x_79)) {
        let x_83 : i32 = a;
        let x_85 : f32 = x_6.x_GLF_uniform_float_values[1];
        let x_87 : f32 = x_6.x_GLF_uniform_float_values[1];
        let x_89 : f32 = x_6.x_GLF_uniform_float_values[1];
        let x_91 : vec4<f32> = v0;
        let x_93 : i32 = a;
        v1[x_83] = smoothStep(vec4<f32>(x_85, x_87, x_89, 3.0), vec4<f32>(1.0, 1.0, 1.0, 1.0), x_91)[x_93];
      }

      continuing {
        let x_96 : i32 = c;
        c = (x_96 + 1);
      }
    }

    continuing {
      let x_98 : i32 = a;
      a = (x_98 + 1);
    }
  }
  let x_101 : f32 = v1.x;
  let x_103 : f32 = x_6.x_GLF_uniform_float_values[0];
  if ((x_101 == x_103)) {
    let x_109 : i32 = x_10.x_GLF_uniform_int_values[1];
    let x_112 : i32 = x_10.x_GLF_uniform_int_values[3];
    let x_115 : i32 = x_10.x_GLF_uniform_int_values[3];
    let x_118 : i32 = x_10.x_GLF_uniform_int_values[1];
    x_GLF_color = vec4<f32>(f32(x_109), f32(x_112), f32(x_115), f32(x_118));
  } else {
    let x_122 : i32 = x_10.x_GLF_uniform_int_values[3];
    let x_123 : f32 = f32(x_122);
    x_GLF_color = vec4<f32>(x_123, x_123, x_123, x_123);
  }
  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);
}
