#include <metal_stdlib>

using namespace metal;
struct tint_padded_array_element {
  /* 0x0000 */ float el;
  /* 0x0004 */ int8_t tint_pad[12];
};
struct tint_array_wrapper {
  /* 0x0000 */ tint_padded_array_element arr[2];
};
struct buf1 {
  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
};
struct tint_padded_array_element_1 {
  /* 0x0000 */ int el;
  /* 0x0004 */ int8_t tint_pad_1[12];
};
struct tint_array_wrapper_1 {
  /* 0x0000 */ tint_padded_array_element_1 arr[4];
};
struct buf0 {
  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
};
struct main_out {
  float4 x_GLF_color_1;
};
struct tint_symbol_1 {
  float4 x_GLF_color_1 [[color(0)]];
};

void main_1(constant buf1& x_7, constant buf0& x_10, thread float4* const tint_symbol_3, thread float4* const tint_symbol_4) {
  float2x3 m23 = float2x3(0.0f);
  int i = 0;
  float const x_46 = x_7.x_GLF_uniform_float_values.arr[1].el;
  m23 = float2x3(float3(x_46, 0.0f, 0.0f), float3(0.0f, x_46, 0.0f));
  i = 1;
  while (true) {
    bool x_80 = false;
    bool x_81_phi = false;
    int const x_54 = i;
    int const x_56 = x_10.x_GLF_uniform_int_values.arr[3].el;
    if ((x_54 < x_56)) {
    } else {
      break;
    }
    int const x_60 = x_10.x_GLF_uniform_int_values.arr[0].el;
    int const x_62 = x_10.x_GLF_uniform_int_values.arr[2].el;
    float const x_64 = x_7.x_GLF_uniform_float_values.arr[0].el;
    float const x_66 = m23[x_60][x_62];
    m23[x_60][x_62] = (x_66 + x_64);
    float const x_70 = (*(tint_symbol_3)).y;
    float const x_72 = x_7.x_GLF_uniform_float_values.arr[0].el;
    if ((x_70 < x_72)) {
    }
    x_81_phi = true;
    if (true) {
      float const x_79 = (*(tint_symbol_3)).x;
      x_80 = (x_79 < 0.0f);
      x_81_phi = x_80;
    }
    bool const x_81 = x_81_phi;
    if (!(x_81)) {
      break;
    }
    {
      int const x_85 = i;
      i = as_type<int>((as_type<uint>(x_85) + as_type<uint>(1)));
    }
  }
  float2x3 const x_87 = m23;
  int const x_89 = x_10.x_GLF_uniform_int_values.arr[1].el;
  int const x_92 = x_10.x_GLF_uniform_int_values.arr[1].el;
  int const x_95 = x_10.x_GLF_uniform_int_values.arr[1].el;
  int const x_98 = x_10.x_GLF_uniform_int_values.arr[1].el;
  int const x_101 = x_10.x_GLF_uniform_int_values.arr[1].el;
  int const x_104 = x_10.x_GLF_uniform_int_values.arr[0].el;
  float2x3 const x_108 = float2x3(float3(float(x_89), float(x_92), float(x_95)), float3(float(x_98), float(x_101), float(x_104)));
  if ((all((x_87[0u] == x_108[0u])) & all((x_87[1u] == x_108[1u])))) {
    int const x_122 = x_10.x_GLF_uniform_int_values.arr[0].el;
    int const x_125 = x_10.x_GLF_uniform_int_values.arr[1].el;
    int const x_128 = x_10.x_GLF_uniform_int_values.arr[1].el;
    int const x_131 = x_10.x_GLF_uniform_int_values.arr[0].el;
    *(tint_symbol_4) = float4(float(x_122), float(x_125), float(x_128), float(x_131));
  } else {
    int const x_135 = x_10.x_GLF_uniform_int_values.arr[1].el;
    float const x_136 = float(x_135);
    *(tint_symbol_4) = float4(x_136, x_136, x_136, x_136);
  }
  return;
}

main_out tint_symbol_inner(constant buf1& x_7, constant buf0& x_10, float4 gl_FragCoord_param, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
  *(tint_symbol_5) = gl_FragCoord_param;
  main_1(x_7, x_10, tint_symbol_5, tint_symbol_6);
  main_out const tint_symbol_2 = {.x_GLF_color_1=*(tint_symbol_6)};
  return tint_symbol_2;
}

fragment tint_symbol_1 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf1& x_7 [[buffer(0)]], constant buf0& x_10 [[buffer(1)]]) {
  thread float4 tint_symbol_7 = 0.0f;
  thread float4 tint_symbol_8 = 0.0f;
  main_out const inner_result = tint_symbol_inner(x_7, x_10, gl_FragCoord_param, &(tint_symbol_7), &(tint_symbol_8));
  tint_symbol_1 wrapper_result = {};
  wrapper_result.x_GLF_color_1 = inner_result.x_GLF_color_1;
  return wrapper_result;
}

