#include <metal_stdlib>

using namespace metal;
struct buf0 {
  /* 0x0000 */ float2 injectionSwitch;
};
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_7, thread float* const tint_symbol_3, thread float4* const tint_symbol_4, thread float4* const tint_symbol_5) {
  float lv = 0.0f;
  float x_43 = 0.0f;
  int GLF_live5r = 0;
  int GLF_live5_looplimiter6 = 0;
  float const x_45 = x_7.injectionSwitch.y;
  if ((1.0f > x_45)) {
    float const x_50 = *(tint_symbol_3);
    x_43 = fabs(x_50);
  } else {
    x_43 = 260.0f;
  }
  float const x_52 = x_43;
  lv = x_52;
  float const x_53 = lv;
  if ((int(x_53) < 250)) {
    float const x_58 = lv;
    if ((int(x_58) < 180)) {
      float const x_64 = lv;
      float const x_65 = clamp(x_64, 1.0f, 1.0f);
    } else {
      float const x_67 = (*(tint_symbol_4)).y;
      if ((x_67 < 0.0f)) {
        float const x_71 = lv;
        if ((int(x_71) < 210)) {
          while (true) {
            {
              if (true) {
              } else {
                break;
              }
            }
          }
        }
        GLF_live5r = 0;
        while (true) {
          if (true) {
          } else {
            break;
          }
          int const x_11 = GLF_live5_looplimiter6;
          if ((x_11 >= 6)) {
            break;
          }
          int const x_12 = GLF_live5_looplimiter6;
          GLF_live5_looplimiter6 = as_type<int>((as_type<uint>(x_12) + as_type<uint>(1)));
        }
      }
    }
  }
  *(tint_symbol_5) = float4(1.0f, 0.0f, 0.0f, 1.0f);
  return;
}

main_out tint_symbol_inner(constant buf0& x_7, float4 gl_FragCoord_param, thread float4* const tint_symbol_6, thread float* const tint_symbol_7, thread float4* const tint_symbol_8) {
  *(tint_symbol_6) = gl_FragCoord_param;
  main_1(x_7, tint_symbol_7, tint_symbol_6, tint_symbol_8);
  main_out const tint_symbol_2 = {.x_GLF_color_1=*(tint_symbol_8)};
  return tint_symbol_2;
}

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

