#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[3];
};
struct buf0 {
  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
};
struct tint_padded_array_element_1 {
  /* 0x0000 */ float el;
  /* 0x0004 */ int8_t tint_pad_1[12];
};
struct tint_array_wrapper_1 {
  /* 0x0000 */ tint_padded_array_element_1 arr[1];
};
struct buf1 {
  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_float_values;
};
struct tint_array_wrapper_2 {
  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_7, constant buf1& x_11, thread float4* const tint_symbol_4, thread float4* const tint_symbol_5) {
  tint_array_wrapper_2 arr = {};
  int a = 0;
  int b = 0;
  int c = 0;
  int const x_40 = x_7.x_GLF_uniform_int_values.arr[1].el;
  int const x_42 = x_7.x_GLF_uniform_int_values.arr[1].el;
  int const x_44 = x_7.x_GLF_uniform_int_values.arr[1].el;
  tint_array_wrapper_2 const tint_symbol_2 = {.arr={x_40, x_42, x_44}};
  arr = tint_symbol_2;
  int const x_47 = x_7.x_GLF_uniform_int_values.arr[0].el;
  int const x_49 = arr.arr[x_47];
  a = x_49;
  int const x_50 = a;
  b = as_type<int>((as_type<uint>(x_50) - as_type<uint>(1)));
  float const x_53 = (*(tint_symbol_4)).x;
  float const x_55 = x_11.x_GLF_uniform_float_values.arr[0].el;
  if ((x_53 < x_55)) {
    int const x_59 = b;
    b = as_type<int>((as_type<uint>(x_59) + as_type<uint>(1)));
  }
  int const x_62 = x_7.x_GLF_uniform_int_values.arr[0].el;
  c = x_62;
  int const x_63 = c;
  int const x_65 = x_7.x_GLF_uniform_int_values.arr[1].el;
  int const x_67 = x_7.x_GLF_uniform_int_values.arr[2].el;
  int const x_69 = b;
  arr.arr[clamp(x_63, x_65, x_67)] = x_69;
  int const x_72 = x_7.x_GLF_uniform_int_values.arr[0].el;
  int const x_74 = arr.arr[x_72];
  int const x_77 = x_7.x_GLF_uniform_int_values.arr[1].el;
  int const x_79 = arr.arr[x_77];
  int const x_82 = x_7.x_GLF_uniform_int_values.arr[1].el;
  int const x_84 = arr.arr[x_82];
  int const x_87 = x_7.x_GLF_uniform_int_values.arr[2].el;
  int const x_89 = arr.arr[x_87];
  *(tint_symbol_5) = float4(float(x_74), float(x_79), float(x_84), float(x_89));
  return;
}

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

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

