#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_4) {
  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_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
      break;
    }
    int const x_20 = ll_1;
    ll_1 = (x_20 + 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 = (x_26 + 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 = (x_35 + 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 = (x_41 + 1);
      }
    }
    int const x_43 = idx;
    idx = (x_43 + 1);
  }
  return;
}

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

