#include <metal_stdlib>

using namespace metal;
struct buf0 {
  /* 0x0000 */ float quarter;
};
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, thread float4* const tint_symbol_3) {
  float4 N = 0.0f;
  float4 I = 0.0f;
  float4 Nref = 0.0f;
  float4 v = 0.0f;
  N = float4(1.0f, 2.0f, 3.0f, 4.0f);
  float const x_44 = x_7.quarter;
  I = float4(4.0f, 87.589996338f, x_44, 92.510002136f);
  Nref = float4(17.049999237f, -6.099999905f, 4329.370605469f, 2.700000048f);
  float4 const x_46 = N;
  float4 const x_47 = I;
  float4 const x_48 = Nref;
  v = faceforward(x_46, x_47, x_48);
  float4 const x_50 = v;
  if (all((x_50 == float4(-1.0f, -2.0f, -3.0f, -4.0f)))) {
    *(tint_symbol_3) = float4(1.0f, 0.0f, 0.0f, 1.0f);
  } else {
    *(tint_symbol_3) = float4(0.0f, 0.0f, 0.0f, 0.0f);
  }
  return;
}

main_out tint_symbol_inner(constant buf0& x_7, thread float4* const tint_symbol_4) {
  main_1(x_7, tint_symbol_4);
  main_out const tint_symbol_2 = {.x_GLF_color_1=*(tint_symbol_4)};
  return tint_symbol_2;
}

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

