#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[2];
};
struct buf0 {
  /* 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[4];
};
struct buf1 {
  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_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, constant buf1& x_10, thread float4* const tint_symbol_4) {
  float4 v0 = 0.0f;
  float4 v1 = 0.0f;
  int a = 0;
  int c = 0;
  float const x_41 = x_6.x_GLF_uniform_float_values.arr[1].el;
  v0 = float4(x_41, x_41, x_41, x_41);
  float const x_44 = x_6.x_GLF_uniform_float_values.arr[0].el;
  v1 = float4(x_44, x_44, x_44, x_44);
  int const x_47 = x_10.x_GLF_uniform_int_values.arr[1].el;
  a = x_47;
  while (true) {
    int const x_52 = a;
    int const x_54 = x_10.x_GLF_uniform_int_values.arr[0].el;
    if ((x_52 < x_54)) {
    } else {
      break;
    }
    int const x_58 = x_10.x_GLF_uniform_int_values.arr[3].el;
    c = x_58;
    while (true) {
      int const x_63 = c;
      int const x_65 = x_10.x_GLF_uniform_int_values.arr[2].el;
      if ((x_63 < x_65)) {
      } else {
        break;
      }
      int const x_68 = c;
      int const x_69 = clamp(x_68, 0, 3);
      float const x_71 = x_6.x_GLF_uniform_float_values.arr[1].el;
      float const x_73 = v0[x_69];
      v0[x_69] = (x_73 - x_71);
      int const x_77 = x_10.x_GLF_uniform_int_values.arr[1].el;
      int const x_79 = x_10.x_GLF_uniform_int_values.arr[3].el;
      if ((x_77 == x_79)) {
        int const x_83 = a;
        float const x_85 = x_6.x_GLF_uniform_float_values.arr[1].el;
        float const x_87 = x_6.x_GLF_uniform_float_values.arr[1].el;
        float const x_89 = x_6.x_GLF_uniform_float_values.arr[1].el;
        float4 const x_91 = v0;
        int const x_93 = a;
        v1[x_83] = smoothstep(float4(x_85, x_87, x_89, 3.0f), float4(1.0f, 1.0f, 1.0f, 1.0f), x_91)[x_93];
      }
      {
        int const x_96 = c;
        c = (x_96 + 1);
      }
    }
    {
      int const x_98 = a;
      a = (x_98 + 1);
    }
  }
  float const x_101 = v1.x;
  float const x_103 = x_6.x_GLF_uniform_float_values.arr[0].el;
  if ((x_101 == x_103)) {
    int const x_109 = x_10.x_GLF_uniform_int_values.arr[1].el;
    int const x_112 = x_10.x_GLF_uniform_int_values.arr[3].el;
    int const x_115 = x_10.x_GLF_uniform_int_values.arr[3].el;
    int const x_118 = x_10.x_GLF_uniform_int_values.arr[1].el;
    *(tint_symbol_4) = float4(float(x_109), float(x_112), float(x_115), float(x_118));
  } else {
    int const x_122 = x_10.x_GLF_uniform_int_values.arr[3].el;
    float const x_123 = float(x_122);
    *(tint_symbol_4) = float4(x_123, x_123, x_123, x_123);
  }
  return;
}

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

