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>;

fn collision_vf2_vf4_(pos : ptr<function, vec2<f32>>, quad : ptr<function, vec4<f32>>) -> bool {
  let x_110 : f32 = (*(pos)).x;
  let x_112 : f32 = (*(quad)).x;
  if ((x_110 < x_112)) {
    return false;
  }
  let x_117 : f32 = (*(pos)).y;
  let x_119 : f32 = (*(quad)).y;
  if ((x_117 < x_119)) {
    return false;
  }
  let x_124 : f32 = (*(pos)).x;
  let x_126 : f32 = (*(quad)).x;
  let x_128 : f32 = (*(quad)).z;
  if ((x_124 > (x_126 + x_128))) {
    return false;
  }
  let x_134 : f32 = (*(pos)).y;
  let x_136 : f32 = (*(quad)).y;
  let x_138 : f32 = (*(quad)).w;
  if ((x_134 > (x_136 + x_138))) {
    return false;
  }
  return true;
}

fn match_vf2_(pos_1 : ptr<function, vec2<f32>>) -> vec4<f32> {
  var res : vec4<f32>;
  var x_144 : f32;
  var x_145 : 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>;
  let x_147 : f32 = gl_FragCoord.x;
  if ((x_147 < 0.0)) {
    x_144 = -1.0;
  } else {
    let x_153 : f32 = gl_FragCoord.x;
    if ((x_153 >= 0.0)) {
      let x_159 : f32 = gl_FragCoord.x;
      x_145 = select(1.0, 0.5, (x_159 >= 0.0));
    } else {
      x_145 = 1.0;
    }
    let x_162 : f32 = x_145;
    x_144 = min(x_162, 0.5);
  }
  let x_164 : f32 = x_144;
  res = vec4<f32>(clamp(0.5, 0.5, x_164), 0.5, 1.0, 1.0);
  i = 0;
  loop {
    let x_171 : i32 = i;
    if ((x_171 < 8)) {
    } else {
      break;
    }
    let x_174 : i32 = i;
    let x_175 : vec2<f32> = *(pos_1);
    param = x_175;
    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_177 : vec4<f32> = indexable[x_174];
    param_1 = x_177;
    let x_178 : bool = collision_vf2_vf4_(&(param), &(param_1));
    if (x_178) {
      let x_181 : 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_183 : f32 = indexable_1[x_181].x;
      let x_185 : 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_187 : f32 = indexable_2[x_185].y;
      let x_190 : 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_196 : vec4<f32> = indexable_3[((((i32(x_183) * i32(x_187)) + (x_190 * 9)) + 11) % 16)];
      res = x_196;
    }

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

fn main_1() {
  var lin : vec2<f32>;
  var param_2 : vec2<f32>;
  let x_98 : vec4<f32> = gl_FragCoord;
  let x_101 : vec2<f32> = x_20.resolution;
  lin = (vec2<f32>(x_98.x, x_98.y) / x_101);
  let x_103 : vec2<f32> = lin;
  lin = floor((x_103 * 32.0));
  let x_106 : vec2<f32> = lin;
  param_2 = x_106;
  let x_107 : vec4<f32> = match_vf2_(&(param_2));
  x_GLF_color = x_107;
  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);
}
