#include <metal_stdlib>

using namespace metal;
struct tint_padded_array_element {
  /* 0x0000 */ int el;
  /* 0x0004 */ int8_t tint_pad[12];
};
struct tint_array_wrapper {
  /* 0x0000 */ tint_padded_array_element arr[2];
};
struct buf1 {
  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
};
struct tint_padded_array_element_1 {
  /* 0x0000 */ float el;
  /* 0x0004 */ int8_t tint_pad_1[12];
};
struct tint_array_wrapper_1 {
  /* 0x0000 */ tint_padded_array_element_1 arr[1];
};
struct buf0 {
  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_float_values;
};
struct buf2 {
  /* 0x0000 */ packed_float2 injectionSwitch;
};
struct main_out {
  float4 x_GLF_color_1;
};
struct tint_symbol_2 {
  float4 x_GLF_color_1 [[color(0)]];
};

void main_1(constant buf1& x_7, constant buf0& x_9, constant buf2& x_11, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
  int i = 0;
  *(tint_symbol_5) = float4(1.0f, 0.0f, 0.0f, 1.0f);
  int const x_42 = x_7.x_GLF_uniform_int_values.arr[1].el;
  i = x_42;
  while (true) {
    int const x_47 = i;
    int const x_49 = x_7.x_GLF_uniform_int_values.arr[0].el;
    if ((x_47 < x_49)) {
    } else {
      break;
    }
    int const x_52 = i;
    int const x_54 = x_7.x_GLF_uniform_int_values.arr[1].el;
    if ((x_52 != x_54)) {
      return;
    }
    {
      int const x_58 = i;
      i = (x_58 + 1);
    }
  }
  float const x_61 = (*(tint_symbol_6)).y;
  float const x_63 = x_9.x_GLF_uniform_float_values.arr[0].el;
  if ((x_61 < x_63)) {
    return;
  }
  float const x_68 = x_11.injectionSwitch.y;
  *(tint_symbol_5) = float4(float3(1.0f, 1.0f, 1.0f).x, float3(1.0f, 1.0f, 1.0f).y, float3(1.0f, 1.0f, 1.0f).z, x_68);
  return;
}

fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf1& x_7 [[buffer(1)]], constant buf0& x_9 [[buffer(0)]], constant buf2& x_11 [[buffer(2)]]) {
  thread float4 tint_symbol_7 = 0.0f;
  thread float4 tint_symbol_8 = 0.0f;
  tint_symbol_7 = gl_FragCoord_param;
  main_1(x_7, x_9, x_11, &(tint_symbol_8), &(tint_symbol_7));
  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
  return tint_symbol_4;
}

