#include <metal_stdlib>

using namespace metal;
struct buf0 {
  /* 0x0000 */ packed_float2 resolution;
};
struct tint_array_wrapper {
  int arr[16];
};
struct tint_array_wrapper_1 {
  float4 arr[8];
};
struct tint_array_wrapper_2 {
  float4 arr[16];
};
struct main_out {
  float4 x_GLF_color_1;
};
struct tint_symbol_2 {
  float4 x_GLF_color_1 [[color(0)]];
};

bool collision_vf2_vf4_(thread float2* const pos, thread float4* const quad) {
  float const x_114 = (*(pos)).x;
  float const x_116 = (*(quad)).x;
  if ((x_114 < x_116)) {
    return false;
  }
  float const x_121 = (*(pos)).y;
  float const x_123 = (*(quad)).y;
  if ((x_121 < x_123)) {
    return false;
  }
  float const x_128 = (*(pos)).x;
  float const x_130 = (*(quad)).x;
  float const x_132 = (*(quad)).z;
  if ((x_128 > (x_130 + x_132))) {
    return false;
  }
  float const x_138 = (*(pos)).y;
  float const x_140 = (*(quad)).y;
  float const x_142 = (*(quad)).w;
  if ((x_138 > (x_140 + x_142))) {
    return false;
  }
  return true;
}

float4 match_vf2_(thread float2* const pos_1) {
  float4 res = 0.0f;
  int i = 0;
  float2 param = 0.0f;
  float4 param_1 = 0.0f;
  tint_array_wrapper_1 indexable = {};
  tint_array_wrapper_1 indexable_1 = {};
  tint_array_wrapper_1 indexable_2 = {};
  tint_array_wrapper_2 indexable_3 = {};
  res = float4(0.5f, 0.5f, 1.0f, 1.0f);
  i = 0;
  while (true) {
    int const x_152 = i;
    if ((x_152 < 8)) {
    } else {
      break;
    }
    int const x_155 = i;
    float2 const x_156 = *(pos_1);
    param = x_156;
    tint_array_wrapper_1 const tint_symbol_4 = {.arr={float4(4.0f, 4.0f, 20.0f, 4.0f), float4(4.0f, 4.0f, 4.0f, 20.0f), float4(4.0f, 20.0f, 20.0f, 4.0f), float4(20.0f, 4.0f, 4.0f, 8.0f), float4(8.0f, 6.0f, 4.0f, 2.0f), float4(2.0f, 12.0f, 2.0f, 4.0f), float4(16.0f, 2.0f, 4.0f, 4.0f), float4(12.0f, 22.0f, 4.0f, 4.0f)}};
    indexable = tint_symbol_4;
    float4 const x_158 = indexable.arr[x_155];
    param_1 = x_158;
    bool const x_159 = collision_vf2_vf4_(&(param), &(param_1));
    if (x_159) {
      int const x_162 = i;
      tint_array_wrapper_1 const tint_symbol_5 = {.arr={float4(4.0f, 4.0f, 20.0f, 4.0f), float4(4.0f, 4.0f, 4.0f, 20.0f), float4(4.0f, 20.0f, 20.0f, 4.0f), float4(20.0f, 4.0f, 4.0f, 8.0f), float4(8.0f, 6.0f, 4.0f, 2.0f), float4(2.0f, 12.0f, 2.0f, 4.0f), float4(16.0f, 2.0f, 4.0f, 4.0f), float4(12.0f, 22.0f, 4.0f, 4.0f)}};
      indexable_1 = tint_symbol_5;
      float const x_164 = indexable_1.arr[x_162].x;
      int const x_166 = i;
      tint_array_wrapper_1 const tint_symbol_6 = {.arr={float4(4.0f, 4.0f, 20.0f, 4.0f), float4(4.0f, 4.0f, 4.0f, 20.0f), float4(4.0f, 20.0f, 20.0f, 4.0f), float4(20.0f, 4.0f, 4.0f, 8.0f), float4(8.0f, 6.0f, 4.0f, 2.0f), float4(2.0f, 12.0f, 2.0f, 4.0f), float4(16.0f, 2.0f, 4.0f, 4.0f), float4(12.0f, 22.0f, 4.0f, 4.0f)}};
      indexable_2 = tint_symbol_6;
      float const x_168 = indexable_2.arr[x_166].y;
      int const x_171 = i;
      tint_array_wrapper_2 const tint_symbol_7 = {.arr={float4(0.0f, 0.0f, 0.0f, 1.0f), float4(0.5f, 0.0f, 0.0f, 1.0f), float4(0.0f, 0.5f, 0.0f, 1.0f), float4(0.5f, 0.5f, 0.0f, 1.0f), float4(0.0f, 0.0f, 0.5f, 1.0f), float4(0.5f, 0.0f, 0.5f, 1.0f), float4(0.0f, 0.5f, 0.5f, 1.0f), float4(0.5f, 0.5f, 0.5f, 1.0f), float4(0.0f, 0.0f, 0.0f, 1.0f), float4(1.0f, 0.0f, 0.0f, 1.0f), float4(0.0f, 1.0f, 0.0f, 1.0f), float4(1.0f, 1.0f, 0.0f, 1.0f), float4(0.0f, 0.0f, 1.0f, 1.0f), float4(1.0f, 0.0f, 1.0f, 1.0f), float4(0.0f, 1.0f, 1.0f, 1.0f), float4(1.0f, 1.0f, 1.0f, 1.0f)}};
      indexable_3 = tint_symbol_7;
      float4 const x_177 = indexable_3.arr[(as_type<int>((as_type<uint>(as_type<int>((as_type<uint>(as_type<int>((as_type<uint>(int(x_164)) * as_type<uint>(int(x_168))))) + as_type<uint>(as_type<int>((as_type<uint>(x_171) * as_type<uint>(9))))))) + as_type<uint>(11))) % 16)];
      res = x_177;
    }
    {
      int const x_178 = i;
      i = as_type<int>((as_type<uint>(x_178) + as_type<uint>(1)));
    }
  }
  float4 const x_180 = res;
  return x_180;
}

void main_1(constant buf0& x_20, thread float4* const tint_symbol_9, thread float4* const tint_symbol_10) {
  float2 lin = 0.0f;
  float2 param_2 = 0.0f;
  float4 const x_102 = *(tint_symbol_9);
  float2 const x_105 = x_20.resolution;
  lin = (float2(x_102.x, x_102.y) / x_105);
  float2 const x_107 = lin;
  lin = floor((x_107 * 32.0f));
  float2 const x_110 = lin;
  param_2 = x_110;
  float4 const x_111 = match_vf2_(&(param_2));
  *(tint_symbol_10) = x_111;
  return;
}

fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_20 [[buffer(0)]]) {
  thread float4 tint_symbol_11 = 0.0f;
  thread float4 tint_symbol_12 = 0.0f;
  tint_symbol_11 = gl_FragCoord_param;
  main_1(x_20, &(tint_symbol_11), &(tint_symbol_12));
  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_12};
  tint_symbol_2 const tint_symbol_8 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
  return tint_symbol_8;
}

