#include <metal_stdlib>

using namespace metal;
struct tint_array_wrapper {
  float arr[9];
};
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_3) {
  float4x3 m43 = float4x3(0.0f);
  int ll1 = 0;
  int rows = 0;
  int ll4 = 0;
  int ll2 = 0;
  int c = 0;
  float4x3 tempm43 = float4x3(0.0f);
  int ll3 = 0;
  int d = 0;
  int r = 0;
  tint_array_wrapper sums = {};
  int idx = 0;
  m43 = float4x3(float3(1.0f, 0.0f, 0.0f), float3(0.0f, 1.0f, 0.0f), float3(0.0f, 0.0f, 1.0f), float3(0.0f, 0.0f, 0.0f));
  ll1 = 0;
  rows = 2;
  while (true) {
    if (true) {
    } else {
      break;
    }
    *(tint_symbol_3) = float4(1.0f, 0.0f, 0.0f, 1.0f);
    int const x_16 = ll1;
    if ((x_16 >= 5)) {
      break;
    }
    int const x_17 = ll1;
    ll1 = as_type<int>((as_type<uint>(x_17) + as_type<uint>(1)));
    ll4 = 10;
    ll2 = 0;
    c = 0;
    while (true) {
      int const x_19 = c;
      if ((x_19 < 1)) {
      } else {
        break;
      }
      int const x_20 = ll2;
      if ((x_20 >= 0)) {
        break;
      }
      int const x_21 = ll2;
      ll2 = as_type<int>((as_type<uint>(x_21) + as_type<uint>(1)));
      float4x3 const x_92 = m43;
      tempm43 = x_92;
      ll3 = 0;
      d = 0;
      while (true) {
        int const x_23 = ll4;
        if ((1 < x_23)) {
        } else {
          break;
        }
        int const x_24 = d;
        int const x_25 = d;
        int const x_26 = d;
        int const x_27 = r;
        int const x_28 = r;
        int const x_29 = r;
        tempm43[select(0, x_26, ((x_24 >= 0) & (x_25 < 4)))][select(0, x_29, ((x_27 >= 0) & (x_28 < 3)))] = 1.0f;
        {
          int const x_30 = d;
          d = as_type<int>((as_type<uint>(x_30) + as_type<uint>(1)));
        }
      }
      int const x_32 = idx;
      int const x_33 = idx;
      int const x_34 = idx;
      int const x_111 = select(0, x_34, ((x_32 >= 0) & (x_33 < 9)));
      int const x_35 = c;
      float const x_113 = m43[x_35].y;
      float const x_115 = sums.arr[x_111];
      sums.arr[x_111] = (x_115 + x_113);
      {
        int const x_36 = c;
        c = as_type<int>((as_type<uint>(x_36) + as_type<uint>(1)));
      }
    }
    int const x_38 = idx;
    idx = as_type<int>((as_type<uint>(x_38) + as_type<uint>(1)));
  }
  return;
}

main_out tint_symbol_inner(thread float4* const tint_symbol_4) {
  main_1(tint_symbol_4);
  main_out const tint_symbol_2 = {.x_GLF_color_1=*(tint_symbol_4)};
  return tint_symbol_2;
}

fragment tint_symbol_1 tint_symbol() {
  thread float4 tint_symbol_5 = 0.0f;
  main_out const inner_result = tint_symbol_inner(&(tint_symbol_5));
  tint_symbol_1 wrapper_result = {};
  wrapper_result.x_GLF_color_1 = inner_result.x_GLF_color_1;
  return wrapper_result;
}

