#include <metal_stdlib>

using namespace metal;
struct buf2 {
  /* 0x0000 */ float one;
};
struct tint_padded_array_element {
  /* 0x0000 */ float el;
  /* 0x0004 */ int8_t tint_pad[12];
};
struct tint_array_wrapper {
  /* 0x0000 */ tint_padded_array_element arr[1];
};
struct buf0 {
  /* 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 buf1 {
  /* 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 func0_i1_(constant buf2& x_10, constant buf0& x_12, thread int* const x, thread float4x2* const tint_symbol_3) {
  int i = 0;
  bool x_137 = false;
  bool x_138 = false;
  bool x_138_phi = false;
  bool x_139_phi = false;
  int const x_124 = *(x);
  bool const x_125 = (x_124 < 1);
  x_139_phi = x_125;
  if (!(x_125)) {
    int const x_129 = *(x);
    bool const x_130 = (x_129 > 1);
    x_138_phi = x_130;
    if (x_130) {
      float const x_134 = x_10.one;
      float const x_136 = x_12.x_GLF_uniform_float_values.arr[0].el;
      x_137 = (x_134 > x_136);
      x_138_phi = x_137;
    }
    x_138 = x_138_phi;
    x_139_phi = x_138;
  }
  bool const x_139 = x_139_phi;
  if (x_139) {
    return;
  }
  float const x_143 = x_10.one;
  float const x_145 = x_12.x_GLF_uniform_float_values.arr[0].el;
  if ((x_143 == x_145)) {
    i = 0;
    while (true) {
      int const x_150 = i;
      if ((x_150 < 2)) {
      } else {
        break;
      }
      {
        int const x_154 = *(x);
        int const x_155 = clamp(x_154, 0, 3);
        int const x_156 = i;
        float const x_158 = x_12.x_GLF_uniform_float_values.arr[0].el;
        float const x_160 = (*(tint_symbol_3))[x_155][x_156];
        (*(tint_symbol_3))[x_155][x_156] = (x_160 + x_158);
        int const x_163 = i;
        i = as_type<int>((as_type<uint>(x_163) + as_type<uint>(1)));
      }
    }
  }
  return;
}

void func1_(constant buf2& x_10, constant buf0& x_12, thread float4* const tint_symbol_4, thread float4x2* const tint_symbol_5) {
  int param = 0;
  float const x_167 = (*(tint_symbol_4)).y;
  if ((x_167 < 0.0f)) {
    return;
  }
  param = 1;
  func0_i1_(x_10, x_12, &(param), tint_symbol_5);
  return;
}

void main_1(constant buf2& x_10, constant buf0& x_12, constant buf1& x_16, thread float4x2* const tint_symbol_6, thread float4* const tint_symbol_7, thread float4* const tint_symbol_8) {
  *(tint_symbol_6) = float4x2(float2(0.0f, 0.0f), float2(0.0f, 0.0f), float2(0.0f, 0.0f), float2(0.0f, 0.0f));
  func1_(x_10, x_12, tint_symbol_7, tint_symbol_6);
  func1_(x_10, x_12, tint_symbol_7, tint_symbol_6);
  float4x2 const x_54 = *(tint_symbol_6);
  int const x_56 = x_16.x_GLF_uniform_int_values.arr[0].el;
  int const x_59 = x_16.x_GLF_uniform_int_values.arr[0].el;
  int const x_62 = x_16.x_GLF_uniform_int_values.arr[1].el;
  int const x_65 = x_16.x_GLF_uniform_int_values.arr[1].el;
  int const x_68 = x_16.x_GLF_uniform_int_values.arr[0].el;
  int const x_71 = x_16.x_GLF_uniform_int_values.arr[0].el;
  int const x_74 = x_16.x_GLF_uniform_int_values.arr[0].el;
  int const x_77 = x_16.x_GLF_uniform_int_values.arr[0].el;
  float4x2 const x_83 = float4x2(float2(float(x_56), float(x_59)), float2(float(x_62), float(x_65)), float2(float(x_68), float(x_71)), float2(float(x_74), float(x_77)));
  if ((((all((x_54[0u] == x_83[0u])) && all((x_54[1u] == x_83[1u]))) && all((x_54[2u] == x_83[2u]))) && all((x_54[3u] == x_83[3u])))) {
    int const x_107 = x_16.x_GLF_uniform_int_values.arr[3].el;
    int const x_110 = x_16.x_GLF_uniform_int_values.arr[0].el;
    int const x_113 = x_16.x_GLF_uniform_int_values.arr[0].el;
    int const x_116 = x_16.x_GLF_uniform_int_values.arr[3].el;
    *(tint_symbol_8) = float4(float(x_107), float(x_110), float(x_113), float(x_116));
  } else {
    int const x_120 = x_16.x_GLF_uniform_int_values.arr[0].el;
    float const x_121 = float(x_120);
    *(tint_symbol_8) = float4(x_121, x_121, x_121, x_121);
  }
  return;
}

main_out tint_symbol_inner(constant buf2& x_10, constant buf0& x_12, constant buf1& x_16, float4 gl_FragCoord_param, thread float4* const tint_symbol_9, thread float4x2* const tint_symbol_10, thread float4* const tint_symbol_11) {
  *(tint_symbol_9) = gl_FragCoord_param;
  main_1(x_10, x_12, x_16, tint_symbol_10, tint_symbol_9, tint_symbol_11);
  main_out const tint_symbol_2 = {.x_GLF_color_1=*(tint_symbol_11)};
  return tint_symbol_2;
}

fragment tint_symbol_1 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf2& x_10 [[buffer(0)]], constant buf0& x_12 [[buffer(1)]], constant buf1& x_16 [[buffer(2)]]) {
  thread float4 tint_symbol_12 = 0.0f;
  thread float4x2 tint_symbol_13 = float4x2(0.0f);
  thread float4 tint_symbol_14 = 0.0f;
  main_out const inner_result = tint_symbol_inner(x_10, x_12, x_16, gl_FragCoord_param, &(tint_symbol_12), &(tint_symbol_13), &(tint_symbol_14));
  tint_symbol_1 wrapper_result = {};
  wrapper_result.x_GLF_color_1 = inner_result.x_GLF_color_1;
  return wrapper_result;
}

