#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[4];
};
struct buf0 {
  /* 0x0000 */ tint_array_wrapper 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 func_(constant buf0& x_7, thread int* const tint_symbol_4) {
  int x_66_phi = 0;
  int const x_62 = x_7.x_GLF_uniform_int_values.arr[1].el;
  int const x_64 = x_7.x_GLF_uniform_int_values.arr[0].el;
  x_66_phi = x_64;
  while (true) {
    int x_67 = 0;
    int const x_66 = x_66_phi;
    int const x_70 = x_7.x_GLF_uniform_int_values.arr[3].el;
    if ((x_66 < x_70)) {
    } else {
      break;
    }
    {
      int const x_73 = *(tint_symbol_4);
      *(tint_symbol_4) = (x_73 + 1);
      x_67 = (x_66 + 1);
      x_66_phi = x_67;
    }
  }
  if ((x_62 < x_62)) {
    return;
  }
  return;
}

void main_1(constant buf0& x_7, thread int* const tint_symbol_5, thread float4* const tint_symbol_6) {
  *(tint_symbol_5) = 0;
  while (true) {
    int const x_28 = *(tint_symbol_5);
    if ((x_28 < 10)) {
    } else {
      break;
    }
    {
      int const x_32 = *(tint_symbol_5);
      *(tint_symbol_5) = (x_32 + 1);
      func_(x_7, tint_symbol_5);
    }
  }
  while (true) {
    int const x_36 = *(tint_symbol_5);
    if ((x_36 < 10)) {
    } else {
      break;
    }
    {
      int const x_40 = *(tint_symbol_5);
      *(tint_symbol_5) = (x_40 + 1);
    }
  }
  int const x_42 = *(tint_symbol_5);
  int const x_44 = x_7.x_GLF_uniform_int_values.arr[2].el;
  if ((x_42 == x_44)) {
    int const x_50 = x_7.x_GLF_uniform_int_values.arr[1].el;
    float const x_51 = float(x_50);
    int const x_53 = x_7.x_GLF_uniform_int_values.arr[0].el;
    float const x_54 = float(x_53);
    *(tint_symbol_6) = float4(x_51, x_54, x_54, x_51);
  } else {
    int const x_57 = x_7.x_GLF_uniform_int_values.arr[0].el;
    float const x_58 = float(x_57);
    *(tint_symbol_6) = float4(x_58, x_58, x_58, x_58);
  }
  return;
}

fragment tint_symbol_1 tint_symbol(constant buf0& x_7 [[buffer(0)]]) {
  thread int tint_symbol_7 = 0;
  thread float4 tint_symbol_8 = 0.0f;
  main_1(x_7, &(tint_symbol_7), &(tint_symbol_8));
  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_8};
  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
  return tint_symbol_3;
}

