#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_8, thread float4* const tint_symbol_3, thread float4* const tint_symbol_4) {
  int odd_index = 0;
  int even_index = 0;
  int j = 0;
  int ll = 0;
  bool x_59 = false;
  bool x_60_phi = false;
  *(tint_symbol_3) = float4(1.0f, 0.0f, 0.0f, 1.0f);
  float const x_53 = (*(tint_symbol_4)).x;
  bool const x_54 = (x_53 < 128.0f);
  x_60_phi = x_54;
  if (x_54) {
    float const x_58 = (*(tint_symbol_4)).y;
    x_59 = (x_58 < 128.0f);
    x_60_phi = x_59;
  }
  bool const x_60 = x_60_phi;
  if (x_60) {
    return;
  }
  odd_index = 0;
  while (true) {
    int const x_11 = odd_index;
    if ((x_11 <= 1)) {
    } else {
      break;
    }
    float const x_70 = (*(tint_symbol_3)).x;
    (*(tint_symbol_3)).x = (x_70 + 0.25f);
    int const x_12 = odd_index;
    odd_index = as_type<int>((as_type<uint>(x_12) + as_type<uint>(1)));
  }
  even_index = 1;
  while (true) {
    int const x_14 = even_index;
    if ((x_14 >= 0)) {
    } else {
      break;
    }
    float const x_80 = (*(tint_symbol_3)).x;
    (*(tint_symbol_3)).x = (x_80 + 0.25f);
    float const x_84 = x_8.injectionSwitch.x;
    float const x_86 = x_8.injectionSwitch.y;
    if ((x_84 > x_86)) {
      continue;
    }
    int const x_15 = even_index;
    if ((x_15 >= 1)) {
      discard_fragment();
    }
    j = 1;
    while (true) {
      if (true) {
      } else {
        break;
      }
      int const x_16 = ll;
      if ((x_16 >= 3)) {
        break;
      }
      int const x_17 = ll;
      ll = as_type<int>((as_type<uint>(x_17) + as_type<uint>(1)));
      int const x_19 = j;
      if ((as_type<uint>(x_19) < 1u)) {
        {
          int const x_20 = j;
          j = as_type<int>((as_type<uint>(x_20) + as_type<uint>(1)));
        }
        continue;
      }
      float const x_106 = x_8.injectionSwitch.x;
      float const x_108 = x_8.injectionSwitch.y;
      if ((x_106 > x_108)) {
        break;
      }
      {
        int const x_20 = j;
        j = as_type<int>((as_type<uint>(x_20) + as_type<uint>(1)));
      }
    }
    float const x_113 = x_8.injectionSwitch.x;
    float const x_115 = x_8.injectionSwitch.y;
    if ((x_113 > x_115)) {
      *(tint_symbol_3) = float4(1.0f, 1.0f, 1.0f, 1.0f);
    }
    int const x_22 = even_index;
    even_index = as_type<int>((as_type<uint>(x_22) - as_type<uint>(1)));
  }
  return;
}

main_out tint_symbol_inner(constant buf0& x_8, 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_8, tint_symbol_6, tint_symbol_5);
  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_8 [[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_8, 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;
}

