#include <metal_stdlib>

using namespace metal;
struct block0 {
  /* 0x0000 */ packed_float4 in_color;
};
struct main_out {
  float4 gl_Position;
  float4 frag_color_1;
};
struct tint_symbol_2 {
  float4 position_param [[attribute(0)]];
};
struct tint_symbol_3 {
  float4 frag_color_1 [[user(locn0)]];
  float4 gl_Position [[position]];
};

void main_1(constant block0& x_8, thread float4* const tint_symbol_6, thread float4* const tint_symbol_7, thread float4* const tint_symbol_8) {
  float4 const x_24 = *(tint_symbol_6);
  *(tint_symbol_7) = x_24;
  float4 const x_27 = x_8.in_color;
  *(tint_symbol_8) = x_27;
  return;
}

vertex tint_symbol_3 tint_symbol(tint_symbol_2 tint_symbol_1 [[stage_in]], constant block0& x_8 [[buffer(1)]]) {
  thread float4 tint_symbol_9 = 0.0f;
  thread float4 tint_symbol_10 = 0.0f;
  thread float4 tint_symbol_11 = 0.0f;
  float4 const position_param = tint_symbol_1.position_param;
  tint_symbol_9 = position_param;
  main_1(x_8, &(tint_symbol_9), &(tint_symbol_10), &(tint_symbol_11));
  main_out const tint_symbol_4 = {.gl_Position=tint_symbol_10, .frag_color_1=tint_symbol_11};
  tint_symbol_3 const tint_symbol_5 = {.frag_color_1=tint_symbol_4.frag_color_1, .gl_Position=tint_symbol_4.gl_Position};
  return tint_symbol_5;
}

