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

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;
}

