#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[5];
};
struct buf0 {
  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
};
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_3, thread float4* const tint_symbol_4) {
  float const x_33 = (*(tint_symbol_3)).x;
  float const x_35 = x_6.x_GLF_uniform_float_values.arr[0].el;
  if ((x_33 > x_35)) {
    float const x_40 = x_6.x_GLF_uniform_float_values.arr[2].el;
    *(tint_symbol_4) = float4(x_40, x_40, x_40, x_40);
    float const x_43 = (*(tint_symbol_3)).y;
    if ((x_43 > x_35)) {
      float const x_48 = x_6.x_GLF_uniform_float_values.arr[4].el;
      *(tint_symbol_4) = float4(x_48, x_48, x_48, x_48);
    }
    float const x_51 = x_6.x_GLF_uniform_float_values.arr[3].el;
    *(tint_symbol_4) = float4(x_51, x_51, x_51, x_51);
  }
  float const x_54 = x_6.x_GLF_uniform_float_values.arr[1].el;
  *(tint_symbol_4) = float4(x_35, x_54, x_54, 10.0f);
  float4 const x_61 = *(tint_symbol_4);
  *(tint_symbol_4) = (float4x4(float4(x_35, 0.0f, 0.0f, 0.0f), float4(0.0f, x_35, 0.0f, 0.0f), float4(0.0f, 0.0f, x_35, 0.0f), float4(0.0f, 0.0f, 0.0f, x_35)) * x_61);
  return;
}

main_out tint_symbol_inner(constant buf0& x_6, float4 gl_FragCoord_param, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
  *(tint_symbol_5) = gl_FragCoord_param;
  main_1(x_6, tint_symbol_5, tint_symbol_6);
  main_out const tint_symbol_2 = {.x_GLF_color_1=*(tint_symbol_6)};
  return tint_symbol_2;
}

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

