#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)]];
};

float fx_(constant buf0& x_7, thread float4* const tint_symbol_3, thread float4* const tint_symbol_4) {
  float const x_50 = (*(tint_symbol_3)).y;
  if ((x_50 >= 0.0f)) {
    float const x_55 = x_7.injectionSwitch.y;
    return x_55;
  }
  while (true) {
    if (true) {
    } else {
      break;
    }
    *(tint_symbol_4) = float4(1.0f, 1.0f, 1.0f, 1.0f);
  }
  return 0.0f;
}

void main_1(constant buf0& x_7, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
  float x2 = 0.0f;
  float B = 0.0f;
  float k0 = 0.0f;
  x2 = 1.0f;
  B = 1.0f;
  float const x_34 = fx_(x_7, tint_symbol_5, tint_symbol_6);
  *(tint_symbol_6) = float4(x_34, 0.0f, 0.0f, 1.0f);
  while (true) {
    float const x_40 = x2;
    if ((x_40 > 2.0f)) {
    } else {
      break;
    }
    float const x_43 = fx_(x_7, tint_symbol_5, tint_symbol_6);
    float const x_44 = fx_(x_7, tint_symbol_5, tint_symbol_6);
    k0 = (x_43 - x_44);
    float const x_46 = k0;
    B = x_46;
    float const x_47 = B;
    x2 = x_47;
  }
  return;
}

main_out tint_symbol_inner(constant buf0& x_7, float4 gl_FragCoord_param, thread float4* const tint_symbol_7, thread float4* const tint_symbol_8) {
  *(tint_symbol_7) = gl_FragCoord_param;
  main_1(x_7, tint_symbol_7, 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 float4 tint_symbol_10 = 0.0f;
  main_out const inner_result = tint_symbol_inner(x_7, gl_FragCoord_param, &(tint_symbol_9), &(tint_symbol_10));
  tint_symbol_1 wrapper_result = {};
  wrapper_result.x_GLF_color_1 = inner_result.x_GLF_color_1;
  return wrapper_result;
}

