#include <metal_stdlib>

using namespace metal;
struct buf0 {
  /* 0x0000 */ packed_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_6, thread float4* const tint_symbol_3, thread float4* const tint_symbol_4) {
  bool x_30 = false;
  float x_47 = 0.0f;
  float const x_29 = x_6.injectionSwitch.x;
  x_30 = (x_29 > 1.0f);
  if (x_30) {
    while (true) {
      float x_47_phi = 0.0f;
      while (true) {
        float const x_41 = (*(tint_symbol_3)).x;
        if ((x_41 < 0.0f)) {
          if (x_30) {
            x_47_phi = 1.0f;
            break;
          } else {
            continue;
          }
          continue;
        }
        x_47_phi = 0.0f;
        break;
      }
      x_47 = x_47_phi;
      break;
    }
    float4 x_48_1 = float4(0.0f, 0.0f, 0.0f, 0.0f);
    x_48_1.y = x_47;
    float4 const x_48 = x_48_1;
    *(tint_symbol_4) = x_48;
  }
  *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
  return;
}

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

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

