#include <metal_stdlib>

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

void main_1(constant buf0& x_8, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
  float2 a = 0.0f;
  float3 b = 0.0f;
  bool x_105 = false;
  bool x_111 = false;
  bool x_106_phi = false;
  bool x_112_phi = false;
  a = float2(1.0f, 1.0f);
  b = float3(0.0f, 0.0f, 0.0f);
  float const x_52 = (*(tint_symbol_5)).y;
  if ((int(x_52) < 40)) {
    b = float3(0.100000001f, 0.100000001f, 0.100000001f);
  } else {
    float const x_59 = (*(tint_symbol_5)).y;
    if ((int(x_59) < 60)) {
      b = float3(0.200000003f, 0.200000003f, 0.200000003f);
    } else {
      float const x_66 = (*(tint_symbol_5)).y;
      if ((x_66 < 80.0f)) {
        float const x_72 = a.x;
        float const x_74 = x_8.one;
        b = (cos((float3(x_72, x_72, x_72) + float3(x_74, x_74, x_74))) + float3(0.01f, 0.01f, 0.01f));
      } else {
        float const x_82 = (*(tint_symbol_5)).y;
        if ((int(x_82) < 100)) {
          float const x_89 = x_8.one;
          b = cos(float3(x_89, x_89, x_89));
        } else {
          float const x_93 = (*(tint_symbol_5)).y;
          if ((int(x_93) < 500)) {
            b = float3(0.540302277f, 0.540302277f, -0.99996084f);
          }
        }
      }
    }
  }
  float const x_99 = b.x;
  bool const x_100 = (x_99 < 1.019999981f);
  x_106_phi = x_100;
  if (x_100) {
    float const x_104 = b.y;
    x_105 = (x_104 < 1.019999981f);
    x_106_phi = x_105;
  }
  bool const x_106 = x_106_phi;
  x_112_phi = x_106;
  if (x_106) {
    float const x_110 = b.z;
    x_111 = (x_110 < 1.019999981f);
    x_112_phi = x_111;
  }
  bool const x_112 = x_112_phi;
  if (x_112) {
    *(tint_symbol_6) = float4(1.0f, 0.0f, 0.0f, 1.0f);
  } else {
    *(tint_symbol_6) = float4(0.0f, 0.0f, 0.0f, 0.0f);
  }
  return;
}

fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_8 [[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_8, &(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;
}

