#include <metal_stdlib>

using namespace metal;
struct buf0 {
  /* 0x0000 */ packed_float2 resolution;
};
struct main_out {
  float4 x_GLF_color_1;
};
struct tint_symbol_2 {
  float4 x_GLF_color_1 [[color(0)]];
};

float compute_value_f1_f1_(thread float* const limit, thread float* const thirty_two) {
  float result = 0.0f;
  int i = 0;
  result = -0.5f;
  i = 1;
  while (true) {
    int const x_136 = i;
    if ((x_136 < 800)) {
    } else {
      break;
    }
    int const x_139 = i;
    if (((x_139 % 32) == 0)) {
      float const x_145 = result;
      result = (x_145 + 0.400000006f);
    } else {
      int const x_147 = i;
      float const x_149 = *(thirty_two);
      if ((fmod(float(x_147), rint(x_149)) <= 0.01f)) {
        float const x_155 = result;
        result = (x_155 + 100.0f);
      }
    }
    int const x_157 = i;
    float const x_159 = *(limit);
    if ((float(x_157) >= x_159)) {
      float const x_163 = result;
      return x_163;
    }
    {
      int const x_164 = i;
      i = as_type<int>((as_type<uint>(x_164) + as_type<uint>(1)));
    }
  }
  float const x_166 = result;
  return x_166;
}

void main_1(constant buf0& x_13, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
  float3 c = 0.0f;
  float thirty_two_1 = 0.0f;
  float param = 0.0f;
  float param_1 = 0.0f;
  float param_2 = 0.0f;
  float param_3 = 0.0f;
  int i_1 = 0;
  c = float3(7.0f, 8.0f, 9.0f);
  float const x_63 = x_13.resolution.x;
  thirty_two_1 = rint((x_63 / 8.0f));
  float const x_67 = (*(tint_symbol_5)).x;
  param = x_67;
  float const x_68 = thirty_two_1;
  param_1 = x_68;
  float const x_69 = compute_value_f1_f1_(&(param), &(param_1));
  c.x = x_69;
  float const x_72 = (*(tint_symbol_5)).y;
  param_2 = x_72;
  float const x_73 = thirty_two_1;
  param_3 = x_73;
  float const x_74 = compute_value_f1_f1_(&(param_2), &(param_3));
  c.y = x_74;
  float3 const x_76 = c;
  float3 const x_79 = c;
  float4x2 const x_87 = float4x2(float2(x_79.x, x_79.y), float2(x_79.z, 1.0f), float2(1.0f, 0.0f), float2(1.0f, 0.0f));
  c.z = (((x_76 * float3x3(float3(1.0f, 0.0f, 0.0f), float3(0.0f, 1.0f, 0.0f), float3(0.0f, 0.0f, 1.0f)))).x + float3(x_87[0u].x, x_87[0u].y, x_87[1u].x).y);
  i_1 = 0;
  while (true) {
    int const x_99 = i_1;
    if ((x_99 < 3)) {
    } else {
      break;
    }
    int const x_102 = i_1;
    float const x_104 = c[x_102];
    if ((x_104 >= 1.0f)) {
      int const x_108 = i_1;
      int const x_109 = i_1;
      float const x_111 = c[x_109];
      int const x_112 = i_1;
      float const x_114 = c[x_112];
      c[x_108] = (x_111 * x_114);
      float const x_118 = (*(tint_symbol_5)).y;
      if ((x_118 < 0.0f)) {
        break;
      }
    }
    {
      int const x_122 = i_1;
      i_1 = as_type<int>((as_type<uint>(x_122) + as_type<uint>(1)));
    }
  }
  float3 const x_124 = c;
  float3 const x_126 = normalize(fabs(x_124));
  *(tint_symbol_6) = float4(x_126.x, x_126.y, x_126.z, 1.0f);
  return;
}

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

