#include <metal_stdlib>

using namespace metal;

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

struct buf0 {
  /* 0x0000 */ packed_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_4, thread float4* const tint_symbol_5) {
  tint_array_wrapper indexable = {};
  int2 x_77 = 0;
  int2 x_110 = 0;
  int x_116 = 0;
  int2 x_77_phi = 0;
  int x_80_phi = 0;
  int2 x_111_phi = 0;
  int2 x_113_phi = 0;
  float4 const x_56 = *(tint_symbol_4);
  float2 const x_59 = x_6.resolution;
  float2 const x_60 = (float2(x_56.x, x_56.y) / x_59);
  int const x_63 = int((x_60.x * 8.0f));
  int const x_66 = int((x_60.y * 8.0f));
  int2 const x_75 = int2(as_type<int>((as_type<uint>(as_type<int>((as_type<uint>(((x_63 & 5) | (x_66 & 10))) * as_type<uint>(8)))) + as_type<uint>(((x_66 & 5) | (x_63 & 10))))), 0);
  x_77_phi = x_75;
  x_80_phi = 0;
  while (true) {
    int2 x_91 = 0;
    int2 x_99 = 0;
    int x_81 = 0;
    int2 x_92_phi = 0;
    int2 x_100_phi = 0;
    x_77 = x_77_phi;
    int const x_80 = x_80_phi;
    if ((x_80 < 100)) {
    } else {
      break;
    }
    x_92_phi = x_77;
    if ((x_77.x > 0)) {
      x_91 = x_77;
      x_91.y = as_type<int>((as_type<uint>(x_77.y) - as_type<uint>(1)));
      x_92_phi = x_91;
    }
    int2 const x_92 = x_92_phi;
    x_100_phi = x_92;
    if ((x_92.x < 0)) {
      x_99 = x_92;
      x_99.y = as_type<int>((as_type<uint>(x_92.y) + as_type<uint>(1)));
      x_100_phi = x_99;
    }
    int2 const x_100 = x_100_phi;
    int2 x_78_1 = x_100;
    x_78_1.x = as_type<int>((as_type<uint>(x_100.x) + as_type<uint>((x_100.y / 2))));
    int2 const x_78 = x_78_1;
    {
      x_81 = as_type<int>((as_type<uint>(x_80) + as_type<uint>(1)));
      x_77_phi = x_78;
      x_80_phi = x_81;
    }
  }
  int const x_105 = x_77.x;
  x_111_phi = x_77;
  if ((x_105 < 0)) {
    x_110 = int2(0, 0);
    x_110.x = tint_unary_minus(x_105);
    x_111_phi = x_110;
  }
  int2 const x_111 = x_111_phi;
  x_113_phi = x_111;
  while (true) {
    int2 x_114 = 0;
    int2 const x_113 = x_113_phi;
    x_116 = x_113.x;
    if ((x_116 > 15)) {
    } else {
      break;
    }
    {
      x_114 = int2(0, 0);
      x_114.x = as_type<int>(as_type<int>((as_type<uint>(x_116) - as_type<uint>(as_type<int>(16)))));
      x_113_phi = x_114;
    }
  }
  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;
  float4 const x_121 = indexable.arr[x_116];
  *(tint_symbol_5) = x_121;
  return;
}

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

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

