#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[6];
};
struct buf0 {
  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
};
struct tint_array_wrapper_1 {
  int arr[3];
};
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_6, thread float4* const tint_symbol_5) {
  tint_array_wrapper_1 arr = {};
  int index = 0;
  bool x_76 = false;
  bool x_86 = false;
  bool x_77_phi = false;
  bool x_87_phi = false;
  int const x_33 = x_6.x_GLF_uniform_int_values.arr[3].el;
  int const x_35 = x_6.x_GLF_uniform_int_values.arr[5].el;
  int const x_37 = x_6.x_GLF_uniform_int_values.arr[2].el;
  tint_array_wrapper_1 const tint_symbol_3 = {.arr={x_33, x_35, x_37}};
  arr = tint_symbol_3;
  index = 1;
  while (true) {
    bool x_51 = false;
    bool x_52_phi = false;
    x_52_phi = true;
    if (true) {
      int const x_46 = x_6.x_GLF_uniform_int_values.arr[0].el;
      int const x_48 = index;
      x_51 = !(((x_46 == 1) & (x_48 <= 1)));
      x_52_phi = x_51;
    }
    bool const x_52 = x_52_phi;
    if (!(x_52)) {
    } else {
      break;
    }
    int const x_55 = index;
    int const x_56_save = x_55;
    int const x_57 = arr.arr[x_56_save];
    arr.arr[x_56_save] = (x_57 + 1);
    int const x_59 = index;
    index = (x_59 + 1);
  }
  int const x_62 = x_6.x_GLF_uniform_int_values.arr[1].el;
  int const x_64 = arr.arr[x_62];
  int const x_66 = x_6.x_GLF_uniform_int_values.arr[3].el;
  bool const x_67 = (x_64 == x_66);
  x_77_phi = x_67;
  if (x_67) {
    int const x_71 = x_6.x_GLF_uniform_int_values.arr[0].el;
    int const x_73 = arr.arr[x_71];
    int const x_75 = x_6.x_GLF_uniform_int_values.arr[4].el;
    x_76 = (x_73 == x_75);
    x_77_phi = x_76;
  }
  bool const x_77 = x_77_phi;
  x_87_phi = x_77;
  if (x_77) {
    int const x_81 = x_6.x_GLF_uniform_int_values.arr[3].el;
    int const x_83 = arr.arr[x_81];
    int const x_85 = x_6.x_GLF_uniform_int_values.arr[2].el;
    x_86 = (x_83 == x_85);
    x_87_phi = x_86;
  }
  bool const x_87 = x_87_phi;
  if (x_87) {
    int const x_92 = x_6.x_GLF_uniform_int_values.arr[0].el;
    int const x_95 = x_6.x_GLF_uniform_int_values.arr[1].el;
    int const x_98 = x_6.x_GLF_uniform_int_values.arr[1].el;
    int const x_101 = x_6.x_GLF_uniform_int_values.arr[0].el;
    *(tint_symbol_5) = float4(float(x_92), float(x_95), float(x_98), float(x_101));
  } else {
    int const x_105 = x_6.x_GLF_uniform_int_values.arr[1].el;
    float const x_106 = float(x_105);
    *(tint_symbol_5) = float4(x_106, x_106, x_106, x_106);
  }
  return;
}

fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
  thread float4 tint_symbol_6 = 0.0f;
  main_1(x_6, &(tint_symbol_6));
  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_6};
  tint_symbol_1 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
  return tint_symbol_4;
}

