#include <metal_stdlib>

using namespace metal;
struct buf0 {
  /* 0x0000 */ 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_1 {
  float4 x_GLF_color_1 [[color(0)]];
};

bool collision_vf2_vf4_(thread float2* const pos, thread float4* const quad) {
  bool4 x_116 = bool4(false, false, false, false);
  float const x_118 = (*(pos)).x;
  float const x_120 = (*(quad)).x;
  if ((x_118 < x_120)) {
    return false;
  }
  float const x_125 = (*(pos)).y;
  float const x_127 = (*(quad)).y;
  if ((x_125 < x_127)) {
    return false;
  }
  float const x_132 = (*(pos)).x;
  float const x_134 = (*(quad)).x;
  float const x_136 = (*(quad)).z;
  if ((x_132 > (x_134 + x_136))) {
    return false;
  }
  float const x_142 = (*(pos)).y;
  float const x_144 = (*(quad)).y;
  float const x_146 = (*(quad)).w;
  if ((x_142 > (x_144 + x_146))) {
    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_156 = i;
    if ((x_156 < 8)) {
    } else {
      break;
    }
    int const x_159 = i;
    float2 const x_160 = *(pos_1);
    param = x_160;
    tint_array_wrapper_1 const tint_symbol_2 = {.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_2;
    float4 const x_162 = indexable.arr[x_159];
    param_1 = x_162;
    bool const x_163 = collision_vf2_vf4_(&(param), &(param_1));
    if (x_163) {
      int const x_166 = i;
      tint_array_wrapper_1 const tint_symbol_3 = {.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_3;
      float const x_168 = indexable_1.arr[x_166].x;
      int const x_170 = i;
      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_2 = tint_symbol_4;
      float const x_172 = indexable_2.arr[x_170].y;
      int const x_175 = i;
      tint_array_wrapper_2 const tint_symbol_5 = {.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_5;
      float4 const x_181 = indexable_3.arr[(as_type<int>((as_type<uint>(as_type<int>((as_type<uint>(as_type<int>((as_type<uint>(int(x_168)) * as_type<uint>(int(x_172))))) + as_type<uint>(as_type<int>((as_type<uint>(x_175) * as_type<uint>(9))))))) + as_type<uint>(11))) % 16)];
      res = x_181;
    }
    {
      int const x_182 = i;
      i = as_type<int>((as_type<uint>(x_182) + as_type<uint>(1)));
    }
  }
  float4 const x_184 = res;
  return x_184;
}

void main_1(constant buf0& x_20, thread float4* const tint_symbol_7, thread float4* const tint_symbol_8) {
  float2 lin = 0.0f;
  float2 param_2 = 0.0f;
  float4 const x_105 = *(tint_symbol_7);
  float2 const x_108 = x_20.resolution;
  lin = (float2(x_105.x, x_105.y) / x_108);
  float2 const x_110 = lin;
  lin = floor((x_110 * 32.0f));
  float2 const x_113 = lin;
  param_2 = x_113;
  float4 const x_114 = match_vf2_(&(param_2));
  *(tint_symbol_8) = x_114;
  return;
}

main_out tint_symbol_inner(constant buf0& x_20, float4 gl_FragCoord_param, thread float4* const tint_symbol_9, thread float4* const tint_symbol_10) {
  *(tint_symbol_9) = gl_FragCoord_param;
  main_1(x_20, tint_symbol_9, tint_symbol_10);
  main_out const tint_symbol_6 = {.x_GLF_color_1=*(tint_symbol_10)};
  return tint_symbol_6;
}

fragment tint_symbol_1 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;
  main_out const inner_result = tint_symbol_inner(x_20, gl_FragCoord_param, &(tint_symbol_11), &(tint_symbol_12));
  tint_symbol_1 wrapper_result = {};
  wrapper_result.x_GLF_color_1 = inner_result.x_GLF_color_1;
  return wrapper_result;
}

