#include <metal_stdlib>

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

void func_i1_(thread int* const x, thread float4* const tint_symbol_4) {
  int a = 0;
  tint_array_wrapper data = {};
  tint_array_wrapper_1 temp = {};
  int i = 0;
  bool x_95 = false;
  bool x_96_phi = false;
  a = 0;
  data.arr[0] = 5;
  while (true) {
    int const x_56 = a;
    int const x_57 = *(x);
    if ((x_56 <= x_57)) {
    } else {
      break;
    }
    int const x_60 = a;
    if ((x_60 <= 10)) {
      int const x_64 = a;
      int const x_66 = a;
      int const x_69 = data.arr[min(x_66, 0)];
      temp.arr[min(x_64, 1)] = x_69;
      int const x_71 = a;
      a = as_type<int>((as_type<uint>(x_71) + as_type<uint>(1)));
    }
  }
  i = 0;
  while (true) {
    int const x_77 = i;
    if ((x_77 < 2)) {
    } else {
      break;
    }
    int const x_80 = i;
    int const x_82 = temp.arr[0];
    int const x_83 = i;
    data.arr[x_80] = as_type<int>((as_type<uint>(x_82) + as_type<uint>(x_83)));
    {
      int const x_86 = i;
      i = as_type<int>((as_type<uint>(x_86) + as_type<uint>(1)));
    }
  }
  int const x_89 = data.arr[0];
  bool const x_90 = (x_89 == 5);
  x_96_phi = x_90;
  if (x_90) {
    int const x_94 = data.arr[1];
    x_95 = (x_94 == 6);
    x_96_phi = x_95;
  }
  bool const x_96 = x_96_phi;
  if (x_96) {
    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
  } else {
    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
  }
  return;
}

void main_1(thread float4* const tint_symbol_5) {
  int i_1 = 0;
  int param = 0;
  i_1 = 1;
  while (true) {
    int const x_43 = i_1;
    if ((x_43 < 6)) {
    } else {
      break;
    }
    int const x_46 = i_1;
    param = x_46;
    func_i1_(&(param), tint_symbol_5);
    {
      int const x_48 = i_1;
      i_1 = as_type<int>((as_type<uint>(x_48) + as_type<uint>(1)));
    }
  }
  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_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
  return tint_symbol_3;
}

