#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_4) {
  int i = 0;
  float const x_38 = x_5.x_GLF_uniform_float_values.arr[0].el;
  *(tint_symbol_4) = 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_4) = 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_4) = 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;
}

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

