#include <metal_stdlib>

using namespace metal;
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)]];
};

int collatz_i1_(thread int* const v) {
  int count = 0;
  count = 0;
  while (true) {
    int const x_89 = *(v);
    if ((x_89 > 1)) {
    } else {
      break;
    }
    int const x_92 = *(v);
    if (((x_92 & 1) == 1)) {
      int const x_98 = *(v);
      *(v) = as_type<int>((as_type<uint>(as_type<int>((as_type<uint>(3) * as_type<uint>(x_98)))) + as_type<uint>(1)));
    } else {
      int const x_101 = *(v);
      *(v) = (x_101 / 2);
    }
    int const x_103 = count;
    count = as_type<int>((as_type<uint>(x_103) + as_type<uint>(1)));
  }
  int const x_105 = count;
  return x_105;
}

void main_1(constant buf0& x_10, thread float4* const tint_symbol_4, thread float4* const tint_symbol_5) {
  float2 lin = 0.0f;
  int v_1 = 0;
  int param = 0;
  tint_array_wrapper indexable = {};
  float4 const x_63 = *(tint_symbol_4);
  float2 const x_66 = x_10.resolution;
  lin = (float2(x_63.x, x_63.y) / x_66);
  float2 const x_68 = lin;
  lin = floor((x_68 * 8.0f));
  float const x_72 = lin.x;
  float const x_76 = lin.y;
  v_1 = as_type<int>((as_type<uint>(as_type<int>((as_type<uint>(int(x_72)) * as_type<uint>(8)))) + as_type<uint>(int(x_76))));
  int const x_79 = v_1;
  param = x_79;
  int const x_80 = collatz_i1_(&(param));
  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_83 = indexable.arr[(x_80 % 16)];
  *(tint_symbol_5) = x_83;
  return;
}

main_out tint_symbol_inner(constant buf0& x_10, 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_10, 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_10 [[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_10, 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;
}

