#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[7];
};
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[4];
};
struct buf0 {
  /* 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 buf1& x_6, constant buf0& x_10, thread float4* const tint_symbol_4) {
  uint a = 0u;
  float4 v1 = 0.0f;
  float E = 0.0f;
  bool x_75 = false;
  bool x_92 = false;
  bool x_109 = false;
  bool x_76_phi = false;
  bool x_93_phi = false;
  bool x_110_phi = false;
  float const x_41 = x_6.x_GLF_uniform_float_values.arr[0].el;
  float const x_43 = x_6.x_GLF_uniform_float_values.arr[1].el;
  a = pack_float_to_unorm2x16(float2(x_41, x_43));
  uint const x_46 = a;
  v1 = unpack_snorm4x8_to_float(x_46);
  E = 0.01f;
  int const x_49 = x_10.x_GLF_uniform_int_values.arr[2].el;
  float const x_51 = v1[x_49];
  float const x_53 = x_6.x_GLF_uniform_float_values.arr[2].el;
  float const x_55 = x_6.x_GLF_uniform_float_values.arr[3].el;
  float const x_59 = E;
  bool const x_60 = (fabs((x_51 - (x_53 / x_55))) < x_59);
  x_76_phi = x_60;
  if (x_60) {
    int const x_64 = x_10.x_GLF_uniform_int_values.arr[1].el;
    float const x_66 = v1[x_64];
    float const x_68 = x_6.x_GLF_uniform_float_values.arr[4].el;
    float const x_70 = x_6.x_GLF_uniform_float_values.arr[3].el;
    float const x_74 = E;
    x_75 = (fabs((x_66 - (x_68 / x_70))) < x_74);
    x_76_phi = x_75;
  }
  bool const x_76 = x_76_phi;
  x_93_phi = x_76;
  if (x_76) {
    int const x_80 = x_10.x_GLF_uniform_int_values.arr[3].el;
    float const x_82 = v1[x_80];
    float const x_84 = x_6.x_GLF_uniform_float_values.arr[5].el;
    float const x_87 = x_6.x_GLF_uniform_float_values.arr[3].el;
    float const x_91 = E;
    x_92 = (fabs((x_82 - (-(x_84) / x_87))) < x_91);
    x_93_phi = x_92;
  }
  bool const x_93 = x_93_phi;
  x_110_phi = x_93;
  if (x_93) {
    int const x_97 = x_10.x_GLF_uniform_int_values.arr[0].el;
    float const x_99 = v1[x_97];
    float const x_101 = x_6.x_GLF_uniform_float_values.arr[6].el;
    float const x_104 = x_6.x_GLF_uniform_float_values.arr[3].el;
    float const x_108 = E;
    x_109 = (fabs((x_99 - (-(x_101) / x_104))) < x_108);
    x_110_phi = x_109;
  }
  bool const x_110 = x_110_phi;
  if (x_110) {
    int const x_115 = x_10.x_GLF_uniform_int_values.arr[1].el;
    int const x_118 = x_10.x_GLF_uniform_int_values.arr[2].el;
    int const x_121 = x_10.x_GLF_uniform_int_values.arr[2].el;
    int const x_124 = x_10.x_GLF_uniform_int_values.arr[1].el;
    *(tint_symbol_4) = float4(float(x_115), float(x_118), float(x_121), float(x_124));
  } else {
    float const x_128 = x_6.x_GLF_uniform_float_values.arr[5].el;
    *(tint_symbol_4) = float4(x_128, x_128, x_128, x_128);
  }
  return;
}

fragment tint_symbol_1 tint_symbol(constant buf1& x_6 [[buffer(1)]], constant buf0& x_10 [[buffer(0)]]) {
  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;
}

