#include <metal_stdlib>

using namespace metal;

int tint_unary_minus(const int v) {
  return select(-v, v, v == -2147483648);
}

struct buf0 {
  /* 0x0000 */ float2 resolution;
};
struct tint_array_wrapper {
  float4 arr[16];
};
struct main_out {
  float4 x_GLF_color_1;
};
struct tint_symbol_1 {
  float4 x_GLF_color_1 [[color(0)]];
};

void main_1(constant buf0& x_6, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
  tint_array_wrapper indexable = {};
  int2 x_80 = 0;
  int2 x_113 = 0;
  int x_119 = 0;
  int2 x_80_phi = 0;
  int x_83_phi = 0;
  int2 x_114_phi = 0;
  int2 x_116_phi = 0;
  float4 const x_59 = *(tint_symbol_5);
  float2 const x_62 = x_6.resolution;
  float2 const x_63 = (float2(x_59.x, x_59.y) / x_62);
  int const x_66 = int((x_63.x * 8.0f));
  int const x_69 = int((x_63.y * 8.0f));
  int2 const x_78 = int2(as_type<int>((as_type<uint>(as_type<int>((as_type<uint>(((x_66 & 5) | (x_69 & 10))) * as_type<uint>(8)))) + as_type<uint>(((x_69 & 5) | (x_66 & 10))))), 0);
  x_80_phi = x_78;
  x_83_phi = 0;
  while (true) {
    int2 x_94 = 0;
    int2 x_102 = 0;
    int x_84 = 0;
    int2 x_95_phi = 0;
    int2 x_103_phi = 0;
    x_80 = x_80_phi;
    int const x_83 = x_83_phi;
    if ((x_83 < 100)) {
    } else {
      break;
    }
    x_95_phi = x_80;
    if ((x_80.x > 0)) {
      x_94 = x_80;
      x_94.y = as_type<int>((as_type<uint>(x_80.y) - as_type<uint>(1)));
      x_95_phi = x_94;
    }
    int2 const x_95 = x_95_phi;
    x_103_phi = x_95;
    if ((x_95.x < 0)) {
      x_102 = x_95;
      x_102.y = as_type<int>((as_type<uint>(x_95.y) + as_type<uint>(1)));
      x_103_phi = x_102;
    }
    int2 const x_103 = x_103_phi;
    int2 x_81_1 = x_103;
    x_81_1.x = as_type<int>((as_type<uint>(x_103.x) + as_type<uint>((x_103.y / 2))));
    int2 const x_81 = x_81_1;
    {
      x_84 = as_type<int>((as_type<uint>(x_83) + as_type<uint>(1)));
      x_80_phi = x_81;
      x_83_phi = x_84;
    }
  }
  int const x_108 = x_80.x;
  x_114_phi = x_80;
  if ((x_108 < 0)) {
    x_113 = int2(0, 0);
    x_113.x = tint_unary_minus(x_108);
    x_114_phi = x_113;
  }
  int2 const x_114 = x_114_phi;
  x_116_phi = x_114;
  while (true) {
    int2 x_117 = 0;
    int2 const x_116 = x_116_phi;
    x_119 = x_116.x;
    if ((x_119 > 15)) {
    } else {
      break;
    }
    {
      x_117 = int2(0, 0);
      x_117.x = as_type<int>(as_type<int>((as_type<uint>(x_119) - as_type<uint>(as_type<int>(16)))));
      x_116_phi = x_117;
    }
  }
  tint_array_wrapper const tint_symbol_2 = {.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 = tint_symbol_2;
  tint_array_wrapper const x_123 = indexable;
  tint_array_wrapper const tint_symbol_3 = {.arr={float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f)}};
  indexable = tint_symbol_3;
  indexable = x_123;
  float4 const x_125 = indexable.arr[x_119];
  *(tint_symbol_6) = x_125;
  return;
}

main_out tint_symbol_inner(constant buf0& x_6, float4 gl_FragCoord_param, thread float4* const tint_symbol_7, thread float4* const tint_symbol_8) {
  *(tint_symbol_7) = gl_FragCoord_param;
  main_1(x_6, tint_symbol_7, tint_symbol_8);
  main_out const tint_symbol_4 = {.x_GLF_color_1=*(tint_symbol_8)};
  return tint_symbol_4;
}

fragment tint_symbol_1 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_6 [[buffer(0)]]) {
  thread float4 tint_symbol_9 = 0.0f;
  thread float4 tint_symbol_10 = 0.0f;
  main_out const inner_result = tint_symbol_inner(x_6, gl_FragCoord_param, &(tint_symbol_9), &(tint_symbol_10));
  tint_symbol_1 wrapper_result = {};
  wrapper_result.x_GLF_color_1 = inner_result.x_GLF_color_1;
  return wrapper_result;
}

