#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[3];
};
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[3];
};
struct buf0 {
  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
};
struct tint_array_wrapper_2 {
  float 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 buf1& x_6, constant buf0& x_9, thread float4* const tint_symbol_5) {
  tint_array_wrapper_2 arr = {};
  int a = 0;
  bool x_69 = false;
  bool x_79 = false;
  bool x_70_phi = false;
  bool x_80_phi = false;
  float const x_34 = x_6.x_GLF_uniform_float_values.arr[1].el;
  float const x_36 = x_6.x_GLF_uniform_float_values.arr[0].el;
  float const x_38 = x_6.x_GLF_uniform_float_values.arr[2].el;
  tint_array_wrapper_2 const tint_symbol_3 = {.arr={x_34, x_36, x_38}};
  arr = tint_symbol_3;
  a = 0;
  while (true) {
    int const x_44 = a;
    int const x_46 = x_9.x_GLF_uniform_int_values.arr[1].el;
    if ((x_44 <= x_46)) {
    } else {
      break;
    }
    int const x_49 = a;
    a = (x_49 + 1);
    float const x_52 = x_6.x_GLF_uniform_float_values.arr[0].el;
    arr.arr[x_49] = x_52;
  }
  int const x_55 = x_9.x_GLF_uniform_int_values.arr[1].el;
  float const x_57 = arr.arr[x_55];
  float const x_59 = x_6.x_GLF_uniform_float_values.arr[0].el;
  bool const x_60 = (x_57 == x_59);
  x_70_phi = x_60;
  if (x_60) {
    int const x_64 = x_9.x_GLF_uniform_int_values.arr[2].el;
    float const x_66 = arr.arr[x_64];
    float const x_68 = x_6.x_GLF_uniform_float_values.arr[0].el;
    x_69 = (x_66 == x_68);
    x_70_phi = x_69;
  }
  bool const x_70 = x_70_phi;
  x_80_phi = x_70;
  if (x_70) {
    int const x_74 = x_9.x_GLF_uniform_int_values.arr[0].el;
    float const x_76 = arr.arr[x_74];
    float const x_78 = x_6.x_GLF_uniform_float_values.arr[2].el;
    x_79 = (x_76 == x_78);
    x_80_phi = x_79;
  }
  bool const x_80 = x_80_phi;
  if (x_80) {
    int const x_85 = x_9.x_GLF_uniform_int_values.arr[1].el;
    float const x_87 = arr.arr[x_85];
    float const x_89 = x_6.x_GLF_uniform_float_values.arr[1].el;
    float const x_91 = x_6.x_GLF_uniform_float_values.arr[1].el;
    float const x_93 = x_6.x_GLF_uniform_float_values.arr[0].el;
    *(tint_symbol_5) = float4(x_87, x_89, x_91, x_93);
  } else {
    float const x_96 = x_6.x_GLF_uniform_float_values.arr[1].el;
    *(tint_symbol_5) = float4(x_96, x_96, x_96, x_96);
  }
  return;
}

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

