#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[2];
};
struct buf2 {
  /* 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 buf0 {
  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_float_values;
};
struct tint_padded_array_element_2 {
  /* 0x0000 */ uint el;
  /* 0x0004 */ int8_t tint_pad_2[12];
};
struct tint_array_wrapper_2 {
  /* 0x0000 */ tint_padded_array_element_2 arr[1];
};
struct buf1 {
  /* 0x0000 */ tint_array_wrapper_2 x_GLF_uniform_uint_values;
};
struct main_out {
  float4 x_GLF_color_1;
};
struct tint_symbol_2 {
  float4 x_GLF_color_1 [[color(0)]];
};

void main_1(constant buf2& x_8, constant buf0& x_10, constant buf1& x_12, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
  uint a = 0u;
  int b = 0;
  a = 0u;
  int const x_41 = x_8.x_GLF_uniform_int_values.arr[1].el;
  b = x_41;
  float const x_43 = (*(tint_symbol_5)).x;
  float const x_45 = x_10.x_GLF_uniform_float_values.arr[0].el;
  if ((x_43 < x_45)) {
    uint const x_50 = x_12.x_GLF_uniform_uint_values.arr[0].el;
    uint const x_51 = a;
    b = as_type<int>((x_50 % x_51));
  }
  int const x_54 = b;
  int const x_56 = x_8.x_GLF_uniform_int_values.arr[1].el;
  if ((x_54 == x_56)) {
    int const x_62 = x_8.x_GLF_uniform_int_values.arr[1].el;
    int const x_65 = x_8.x_GLF_uniform_int_values.arr[0].el;
    int const x_68 = x_8.x_GLF_uniform_int_values.arr[0].el;
    int const x_71 = x_8.x_GLF_uniform_int_values.arr[1].el;
    *(tint_symbol_6) = float4(float(x_62), float(x_65), float(x_68), float(x_71));
  } else {
    int const x_75 = x_8.x_GLF_uniform_int_values.arr[0].el;
    float const x_76 = float(x_75);
    *(tint_symbol_6) = float4(x_76, x_76, x_76, x_76);
  }
  return;
}

fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf2& x_8 [[buffer(2)]], constant buf0& x_10 [[buffer(0)]], constant buf1& x_12 [[buffer(1)]]) {
  thread float4 tint_symbol_7 = 0.0f;
  thread float4 tint_symbol_8 = 0.0f;
  tint_symbol_7 = gl_FragCoord_param;
  main_1(x_8, x_10, x_12, &(tint_symbol_7), &(tint_symbol_8));
  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
  return tint_symbol_4;
}

