#include <metal_stdlib>

using namespace metal;
struct S {
  int data;
};
struct buf0 {
  /* 0x0000 */ int one;
};
struct tint_array_wrapper {
  S arr[1];
};
struct main_out {
  float4 x_GLF_color_1;
};
struct tint_symbol_1 {
  float4 x_GLF_color_1 [[color(0)]];
};

int func_struct_S_i11_i1_(thread S* const s, thread int* const x) {
  int const x_17 = (*(s)).data;
  if ((x_17 == 1)) {
    int const x_18 = *(x);
    int const x_19 = (*(s)).data;
    return as_type<int>((as_type<uint>(x_18) + as_type<uint>(x_19)));
  } else {
    int const x_21 = *(x);
    return x_21;
  }
  return 0;
}

void main_1(constant buf0& x_11, thread float4* const tint_symbol_4) {
  int a = 0;
  tint_array_wrapper arr = {};
  int i = 0;
  S param = {};
  int param_1 = 0;
  S param_2 = {};
  int param_3 = 0;
  a = 0;
  int const x_22 = x_11.one;
  arr.arr[0].data = x_22;
  i = 0;
  while (true) {
    int const x_23 = i;
    int const x_24 = x_11.one;
    if ((x_23 < as_type<int>((as_type<uint>(5) + as_type<uint>(x_24))))) {
    } else {
      break;
    }
    int const x_26 = i;
    if (((x_26 % 2) != 0)) {
      S const x_74 = arr.arr[0];
      param = x_74;
      int const x_28 = i;
      param_1 = x_28;
      int const x_29 = func_struct_S_i11_i1_(&(param), &(param_1));
      S const x_75 = param;
      arr.arr[0] = x_75;
      a = x_29;
    } else {
      S const x_78 = arr.arr[0];
      param_2 = x_78;
      param_3 = 1;
      int const x_30 = func_struct_S_i11_i1_(&(param_2), &(param_3));
      S const x_79 = param_2;
      arr.arr[0] = x_79;
      a = x_30;
    }
    {
      int const x_31 = i;
      i = as_type<int>((as_type<uint>(x_31) + as_type<uint>(1)));
    }
  }
  int const x_33 = a;
  if ((x_33 == 6)) {
    *(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;
}

fragment tint_symbol_1 tint_symbol(constant buf0& x_11 [[buffer(0)]]) {
  thread float4 tint_symbol_5 = 0.0f;
  main_1(x_11, &(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;
}

