#include <metal_stdlib>

using namespace metal;
struct tint_array_wrapper {
  int arr[2];
};
struct main_out {
  float4 x_GLF_color_1;
};
struct tint_symbol_1 {
  float4 x_GLF_color_1 [[color(0)]];
};

void main_1(thread float4* const tint_symbol_5) {
  int a = 0;
  int b = 0;
  int i = 0;
  int i_1 = 0;
  int i_2 = 0;
  tint_array_wrapper indexable = {};
  a = 0;
  b = 1;
  *(tint_symbol_5) = float4(0.0f, 0.0f, 0.0f, 0.0f);
  i = 0;
  while (true) {
    int const x_38 = i;
    if ((x_38 < 10)) {
    } else {
      break;
    }
    int const x_41 = i;
    if ((x_41 > 1)) {
      int const x_45 = a;
      a = as_type<int>((as_type<uint>(x_45) + as_type<uint>(1)));
      if (false) {
        i_1 = 0;
        while (true) {
          int const x_53 = i_1;
          if ((x_53 < 10)) {
          } else {
            break;
          }
          return;
        }
      }
    }
    {
      int const x_56 = i;
      i = as_type<int>((as_type<uint>(x_56) + as_type<uint>(1)));
    }
  }
  i_2 = 0;
  while (true) {
    int const x_62 = i_2;
    if ((x_62 < 10)) {
    } else {
      break;
    }
    int const x_65 = b;
    tint_array_wrapper const tint_symbol_3 = {.arr={1, 2}};
    indexable = tint_symbol_3;
    int const x_67 = indexable.arr[x_65];
    int const x_68 = a;
    a = as_type<int>((as_type<uint>(x_68) + as_type<uint>(x_67)));
    {
      int const x_70 = i_2;
      i_2 = as_type<int>((as_type<uint>(x_70) + as_type<uint>(1)));
    }
  }
  int const x_72 = a;
  if ((x_72 == 28)) {
    *(tint_symbol_5) = float4(1.0f, 0.0f, 0.0f, 1.0f);
  }
  return;
}

fragment tint_symbol_1 tint_symbol() {
  thread float4 tint_symbol_6 = 0.0f;
  main_1(&(tint_symbol_6));
  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_6};
  tint_symbol_1 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
  return tint_symbol_4;
}

