struct buf0 {
  resolution : vec2<f32>;
};

var<private> gl_FragCoord : vec4<f32>;

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

var<private> x_GLF_color : vec4<f32>;

var<private> index : i32;

var<private> state : array<i32, 16>;

fn collision_vf2_vf4_(pos : ptr<function, vec2<f32>>, quad : ptr<function, vec4<f32>>) -> bool {
  var x_116 : vec4<bool> = vec4<bool>(false, false, false, false);
  let x_118 : f32 = (*(pos)).x;
  let x_120 : f32 = (*(quad)).x;
  if ((x_118 < x_120)) {
    return false;
  }
  let x_125 : f32 = (*(pos)).y;
  let x_127 : f32 = (*(quad)).y;
  if ((x_125 < x_127)) {
    return false;
  }
  let x_132 : f32 = (*(pos)).x;
  let x_134 : f32 = (*(quad)).x;
  let x_136 : f32 = (*(quad)).z;
  if ((x_132 > (x_134 + x_136))) {
    return false;
  }
  let x_142 : f32 = (*(pos)).y;
  let x_144 : f32 = (*(quad)).y;
  let x_146 : f32 = (*(quad)).w;
  if ((x_142 > (x_144 + x_146))) {
    return false;
  }
  return true;
}

fn match_vf2_(pos_1 : ptr<function, vec2<f32>>) -> vec4<f32> {
  var res : vec4<f32>;
  var i : i32;
  var param : vec2<f32>;
  var param_1 : vec4<f32>;
  var indexable : array<vec4<f32>, 8>;
  var indexable_1 : array<vec4<f32>, 8>;
  var indexable_2 : array<vec4<f32>, 8>;
  var indexable_3 : array<vec4<f32>, 16>;
  res = vec4<f32>(0.5, 0.5, 1.0, 1.0);
  i = 0;
  loop {
    let x_156 : i32 = i;
    if ((x_156 < 8)) {
    } else {
      break;
    }
    let x_159 : i32 = i;
    let x_160 : vec2<f32> = *(pos_1);
    param = x_160;
    indexable = array<vec4<f32>, 8>(vec4<f32>(4.0, 4.0, 20.0, 4.0), vec4<f32>(4.0, 4.0, 4.0, 20.0), vec4<f32>(4.0, 20.0, 20.0, 4.0), vec4<f32>(20.0, 4.0, 4.0, 8.0), vec4<f32>(8.0, 6.0, 4.0, 2.0), vec4<f32>(2.0, 12.0, 2.0, 4.0), vec4<f32>(16.0, 2.0, 4.0, 4.0), vec4<f32>(12.0, 22.0, 4.0, 4.0));
    let x_162 : vec4<f32> = indexable[x_159];
    param_1 = x_162;
    let x_163 : bool = collision_vf2_vf4_(&(param), &(param_1));
    if (x_163) {
      let x_166 : i32 = i;
      indexable_1 = array<vec4<f32>, 8>(vec4<f32>(4.0, 4.0, 20.0, 4.0), vec4<f32>(4.0, 4.0, 4.0, 20.0), vec4<f32>(4.0, 20.0, 20.0, 4.0), vec4<f32>(20.0, 4.0, 4.0, 8.0), vec4<f32>(8.0, 6.0, 4.0, 2.0), vec4<f32>(2.0, 12.0, 2.0, 4.0), vec4<f32>(16.0, 2.0, 4.0, 4.0), vec4<f32>(12.0, 22.0, 4.0, 4.0));
      let x_168 : f32 = indexable_1[x_166].x;
      let x_170 : i32 = i;
      indexable_2 = array<vec4<f32>, 8>(vec4<f32>(4.0, 4.0, 20.0, 4.0), vec4<f32>(4.0, 4.0, 4.0, 20.0), vec4<f32>(4.0, 20.0, 20.0, 4.0), vec4<f32>(20.0, 4.0, 4.0, 8.0), vec4<f32>(8.0, 6.0, 4.0, 2.0), vec4<f32>(2.0, 12.0, 2.0, 4.0), vec4<f32>(16.0, 2.0, 4.0, 4.0), vec4<f32>(12.0, 22.0, 4.0, 4.0));
      let x_172 : f32 = indexable_2[x_170].y;
      let x_175 : i32 = i;
      indexable_3 = array<vec4<f32>, 16>(vec4<f32>(0.0, 0.0, 0.0, 1.0), vec4<f32>(0.5, 0.0, 0.0, 1.0), vec4<f32>(0.0, 0.5, 0.0, 1.0), vec4<f32>(0.5, 0.5, 0.0, 1.0), vec4<f32>(0.0, 0.0, 0.5, 1.0), vec4<f32>(0.5, 0.0, 0.5, 1.0), vec4<f32>(0.0, 0.5, 0.5, 1.0), vec4<f32>(0.5, 0.5, 0.5, 1.0), vec4<f32>(0.0, 0.0, 0.0, 1.0), vec4<f32>(1.0, 0.0, 0.0, 1.0), vec4<f32>(0.0, 1.0, 0.0, 1.0), vec4<f32>(1.0, 1.0, 0.0, 1.0), vec4<f32>(0.0, 0.0, 1.0, 1.0), vec4<f32>(1.0, 0.0, 1.0, 1.0), vec4<f32>(0.0, 1.0, 1.0, 1.0), vec4<f32>(1.0, 1.0, 1.0, 1.0));
      let x_181 : vec4<f32> = indexable_3[((((i32(x_168) * i32(x_172)) + (x_175 * 9)) + 11) % 16)];
      res = x_181;
    }

    continuing {
      let x_182 : i32 = i;
      i = (x_182 + 1);
    }
  }
  let x_184 : vec4<f32> = res;
  return x_184;
}

fn main_1() {
  var lin : vec2<f32>;
  var param_2 : vec2<f32>;
  let x_105 : vec4<f32> = gl_FragCoord;
  let x_108 : vec2<f32> = x_20.resolution;
  lin = (vec2<f32>(x_105.x, x_105.y) / x_108);
  let x_110 : vec2<f32> = lin;
  lin = floor((x_110 * 32.0));
  let x_113 : vec2<f32> = lin;
  param_2 = x_113;
  let x_114 : vec4<f32> = match_vf2_(&(param_2));
  x_GLF_color = x_114;
  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);
}
