#include <metal_stdlib>

using namespace metal;
struct buf0 {
  /* 0x0000 */ int injected;
};
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(constant buf0& x_9, thread float4* const tint_symbol_3) {
  int idx = 0;
  float4x3 m43 = float4x3(0.0f);
  int ll_1 = 0;
  int GLF_live6rows = 0;
  int z = 0;
  int ll_2 = 0;
  int ctr = 0;
  float4x3 tempm43 = float4x3(0.0f);
  int ll_3 = 0;
  int c = 0;
  int d = 0;
  tint_array_wrapper GLF_live6sums = {};
  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));
  ll_1 = 0;
  GLF_live6rows = 2;
  while (true) {
    int const x_18 = ll_1;
    int const x_19 = x_9.injected;
    if ((x_18 >= x_19)) {
      *(tint_symbol_3) = float4(1.0f, 0.0f, 0.0f, 1.0f);
      break;
    }
    int const x_20 = ll_1;
    ll_1 = as_type<int>((as_type<uint>(x_20) + as_type<uint>(1)));
    int const x_22 = x_9.injected;
    z = x_22;
    ll_2 = 0;
    ctr = 0;
    while (true) {
      int const x_23 = ctr;
      if ((x_23 < 1)) {
      } else {
        break;
      }
      int const x_24 = ll_2;
      int const x_25 = x_9.injected;
      if ((x_24 >= x_25)) {
        break;
      }
      int const x_26 = ll_2;
      ll_2 = as_type<int>((as_type<uint>(x_26) + as_type<uint>(1)));
      float4x3 const x_98 = m43;
      tempm43 = x_98;
      ll_3 = 0;
      c = 0;
      while (true) {
        int const x_28 = z;
        if ((1 < x_28)) {
        } else {
          break;
        }
        d = 0;
        int const x_29 = c;
        int const x_30 = c;
        int const x_31 = c;
        int const x_32 = d;
        int const x_33 = d;
        int const x_34 = d;
        tempm43[select(0, x_31, ((x_29 >= 0) & (x_30 < 4)))][select(0, x_34, ((x_32 >= 0) & (x_33 < 3)))] = 1.0f;
        {
          int const x_35 = c;
          c = as_type<int>((as_type<uint>(x_35) + as_type<uint>(1)));
        }
      }
      int const x_37 = idx;
      int const x_38 = idx;
      int const x_39 = idx;
      int const x_117 = select(0, x_39, ((x_37 >= 0) & (x_38 < 9)));
      int const x_40 = ctr;
      float const x_119 = m43[x_40].y;
      float const x_121 = GLF_live6sums.arr[x_117];
      GLF_live6sums.arr[x_117] = (x_121 + x_119);
      {
        int const x_41 = ctr;
        ctr = as_type<int>((as_type<uint>(x_41) + as_type<uint>(1)));
      }
    }
    int const x_43 = idx;
    idx = as_type<int>((as_type<uint>(x_43) + as_type<uint>(1)));
  }
  return;
}

main_out tint_symbol_inner(constant buf0& x_9, thread float4* const tint_symbol_4) {
  main_1(x_9, 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(constant buf0& x_9 [[buffer(0)]]) {
  thread float4 tint_symbol_5 = 0.0f;
  main_out const inner_result = tint_symbol_inner(x_9, &(tint_symbol_5));
  tint_symbol_1 wrapper_result = {};
  wrapper_result.x_GLF_color_1 = inner_result.x_GLF_color_1;
  return wrapper_result;
}

