#include <metal_stdlib>

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

int f_i1_(constant buf0& x_8, thread int* const a) {
  int i = 0;
  int const x_16 = x_8.x_GLF_uniform_int_values.arr[0].el;
  i = x_16;
  while (true) {
    int const x_17 = i;
    int const x_18 = x_8.x_GLF_uniform_int_values.arr[6].el;
    if ((x_17 < x_18)) {
    } else {
      break;
    }
    int const x_19 = i;
    int const x_20 = x_8.x_GLF_uniform_int_values.arr[2].el;
    if ((x_19 > x_20)) {
      int const x_21 = *(a);
      return x_21;
    }
    {
      int const x_22 = i;
      i = as_type<int>((as_type<uint>(x_22) + as_type<uint>(1)));
    }
  }
  int const x_24 = x_8.x_GLF_uniform_int_values.arr[0].el;
  return x_24;
}

void main_1(constant buf0& x_8, thread float4* const tint_symbol_4) {
  tint_array_wrapper_1 ref = {};
  int i_1 = 0;
  tint_array_wrapper_1 a_1 = {};
  int param = 0;
  int param_1 = 0;
  int i_2 = 0;
  int const x_25 = x_8.x_GLF_uniform_int_values.arr[0].el;
  int const x_26 = x_8.x_GLF_uniform_int_values.arr[1].el;
  ref.arr[x_25] = x_26;
  int const x_27 = x_8.x_GLF_uniform_int_values.arr[11].el;
  int const x_28 = x_8.x_GLF_uniform_int_values.arr[2].el;
  ref.arr[x_27] = x_28;
  int const x_29 = x_8.x_GLF_uniform_int_values.arr[1].el;
  int const x_30 = x_8.x_GLF_uniform_int_values.arr[3].el;
  ref.arr[x_29] = x_30;
  int const x_31 = x_8.x_GLF_uniform_int_values.arr[2].el;
  int const x_32 = x_8.x_GLF_uniform_int_values.arr[4].el;
  ref.arr[x_31] = x_32;
  int const x_33 = x_8.x_GLF_uniform_int_values.arr[3].el;
  int const x_34 = x_8.x_GLF_uniform_int_values.arr[5].el;
  ref.arr[x_33] = x_34;
  int const x_35 = x_8.x_GLF_uniform_int_values.arr[4].el;
  int const x_36 = x_8.x_GLF_uniform_int_values.arr[6].el;
  ref.arr[x_35] = x_36;
  int const x_37 = x_8.x_GLF_uniform_int_values.arr[5].el;
  int const x_38 = x_8.x_GLF_uniform_int_values.arr[7].el;
  ref.arr[x_37] = x_38;
  int const x_39 = x_8.x_GLF_uniform_int_values.arr[8].el;
  int const x_40 = x_8.x_GLF_uniform_int_values.arr[8].el;
  ref.arr[x_39] = x_40;
  int const x_41 = x_8.x_GLF_uniform_int_values.arr[9].el;
  int const x_42 = x_8.x_GLF_uniform_int_values.arr[9].el;
  ref.arr[x_41] = x_42;
  int const x_43 = x_8.x_GLF_uniform_int_values.arr[10].el;
  int const x_44 = x_8.x_GLF_uniform_int_values.arr[10].el;
  ref.arr[x_43] = x_44;
  int const x_45 = x_8.x_GLF_uniform_int_values.arr[0].el;
  i_1 = x_45;
  while (true) {
    int const x_46 = i_1;
    int const x_47 = x_8.x_GLF_uniform_int_values.arr[6].el;
    if ((x_46 < x_47)) {
    } else {
      break;
    }
    int const x_48 = i_1;
    int const x_49 = i_1;
    a_1.arr[x_48] = x_49;
    int const x_50 = i_1;
    int const x_51 = x_8.x_GLF_uniform_int_values.arr[6].el;
    int const x_52 = x_8.x_GLF_uniform_int_values.arr[1].el;
    if ((x_50 < (x_51 / x_52))) {
      int const x_54 = i_1;
      int const x_55 = i_1;
      int const x_56 = x_8.x_GLF_uniform_int_values.arr[1].el;
      a_1.arr[x_54] = as_type<int>((as_type<uint>(x_55) + as_type<uint>(x_56)));
      int const x_58 = i_1;
      int const x_59 = x_8.x_GLF_uniform_int_values.arr[6].el;
      if ((x_58 < x_59)) {
        {
          int const x_79 = i_1;
          i_1 = as_type<int>((as_type<uint>(x_79) + as_type<uint>(1)));
        }
        continue;
      }
      int const x_60 = i_1;
      int const x_61 = i_1;
      int const x_62 = x_8.x_GLF_uniform_int_values.arr[8].el;
      a_1.arr[x_60] = as_type<int>((as_type<uint>(x_61) + as_type<uint>(x_62)));
      int const x_64 = i_1;
      int const x_65 = a_1.arr[x_64];
      param = x_65;
      int const x_66 = f_i1_(x_8, &(param));
      int const x_67 = x_8.x_GLF_uniform_int_values.arr[8].el;
      if ((x_66 < x_67)) {
        int const x_68 = i_1;
        int const x_182_save = x_68;
        int const x_69 = a_1.arr[x_182_save];
        a_1.arr[x_182_save] = as_type<int>((as_type<uint>(x_69) - as_type<uint>(1)));
      }
    } else {
      int const x_71 = i_1;
      int const x_72 = a_1.arr[x_71];
      param_1 = x_72;
      int const x_73 = f_i1_(x_8, &(param_1));
      int const x_74 = x_8.x_GLF_uniform_int_values.arr[8].el;
      if ((x_73 < x_74)) {
        int const x_75 = i_1;
        int const x_76 = x_8.x_GLF_uniform_int_values.arr[4].el;
        int const x_77 = a_1.arr[x_75];
        a_1.arr[x_75] = as_type<int>((as_type<uint>(x_77) + as_type<uint>(x_76)));
      }
    }
    {
      int const x_79 = i_1;
      i_1 = as_type<int>((as_type<uint>(x_79) + as_type<uint>(1)));
    }
  }
  int const x_81 = x_8.x_GLF_uniform_int_values.arr[0].el;
  i_2 = x_81;
  while (true) {
    int const x_82 = i_2;
    int const x_83 = x_8.x_GLF_uniform_int_values.arr[6].el;
    if ((x_82 < x_83)) {
    } else {
      break;
    }
    int const x_84 = i_2;
    int const x_85 = a_1.arr[x_84];
    int const x_86 = i_2;
    int const x_87 = ref.arr[x_86];
    if ((x_85 != x_87)) {
      int const x_88 = x_8.x_GLF_uniform_int_values.arr[0].el;
      float const x_205 = float(x_88);
      *(tint_symbol_4) = float4(x_205, x_205, x_205, x_205);
      return;
    }
    {
      int const x_89 = i_2;
      i_2 = as_type<int>((as_type<uint>(x_89) + as_type<uint>(1)));
    }
  }
  int const x_91 = x_8.x_GLF_uniform_int_values.arr[11].el;
  int const x_92 = x_8.x_GLF_uniform_int_values.arr[0].el;
  int const x_93 = x_8.x_GLF_uniform_int_values.arr[0].el;
  int const x_94 = x_8.x_GLF_uniform_int_values.arr[11].el;
  *(tint_symbol_4) = float4(float(x_91), float(x_92), float(x_93), float(x_94));
  return;
}

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

