#include <metal_stdlib>

using namespace metal;
struct tint_padded_array_element {
  /* 0x0000 */ float 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_float_values;
};
struct buf2 {
  /* 0x0000 */ float zero;
};
struct tint_padded_array_element_1 {
  /* 0x0000 */ int el;
  /* 0x0004 */ int8_t tint_pad_1[12];
};
struct tint_array_wrapper_1 {
  /* 0x0000 */ tint_padded_array_element_1 arr[2];
};
struct buf0 {
  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
};
struct main_out {
  float4 x_GLF_color_1;
};
struct tint_symbol_1 {
  float4 x_GLF_color_1 [[color(0)]];
};

void main_1(constant buf1& x_5, constant buf2& x_7, constant buf0& x_10, thread float4* const tint_symbol_3) {
  int i = 0;
  float const x_38 = x_5.x_GLF_uniform_float_values.arr[0].el;
  *(tint_symbol_3) = float4(x_38, x_38, x_38, x_38);
  float const x_41 = x_7.zero;
  float const x_43 = x_5.x_GLF_uniform_float_values.arr[0].el;
  if ((x_41 > x_43)) {
    while (true) {
      float const x_53 = x_5.x_GLF_uniform_float_values.arr[1].el;
      *(tint_symbol_3) = float4(x_53, x_53, x_53, x_53);
      {
        if (true) {
        } else {
          break;
        }
      }
    }
  } else {
    while (true) {
      while (true) {
        if (true) {
        } else {
          break;
        }
        int const x_13 = x_10.x_GLF_uniform_int_values.arr[1].el;
        i = x_13;
        while (true) {
          int const x_14 = i;
          int const x_15 = x_10.x_GLF_uniform_int_values.arr[0].el;
          if ((x_14 < x_15)) {
          } else {
            break;
          }
          float const x_73 = x_5.x_GLF_uniform_float_values.arr[1].el;
          float const x_75 = x_5.x_GLF_uniform_float_values.arr[0].el;
          float const x_77 = x_5.x_GLF_uniform_float_values.arr[0].el;
          float const x_79 = x_5.x_GLF_uniform_float_values.arr[1].el;
          *(tint_symbol_3) = float4(x_73, x_75, x_77, x_79);
          {
            int const x_16 = i;
            i = as_type<int>((as_type<uint>(x_16) + as_type<uint>(1)));
          }
        }
        break;
      }
      {
        float const x_82 = x_7.zero;
        float const x_84 = x_5.x_GLF_uniform_float_values.arr[0].el;
        if ((x_82 > x_84)) {
        } else {
          break;
        }
      }
    }
  }
  return;
}

main_out tint_symbol_inner(constant buf1& x_5, constant buf2& x_7, constant buf0& x_10, thread float4* const tint_symbol_4) {
  main_1(x_5, x_7, x_10, tint_symbol_4);
  main_out const tint_symbol_2 = {.x_GLF_color_1=*(tint_symbol_4)};
  return tint_symbol_2;
}

fragment tint_symbol_1 tint_symbol(constant buf1& x_5 [[buffer(0)]], constant buf2& x_7 [[buffer(1)]], constant buf0& x_10 [[buffer(2)]]) {
  thread float4 tint_symbol_5 = 0.0f;
  main_out const inner_result = tint_symbol_inner(x_5, x_7, x_10, &(tint_symbol_5));
  tint_symbol_1 wrapper_result = {};
  wrapper_result.x_GLF_color_1 = inner_result.x_GLF_color_1;
  return wrapper_result;
}

