#include <metal_stdlib>

using namespace metal;
struct main_out {
  float4 position_1;
};
struct tint_symbol_1 {
  float4 position_1 [[position]];
};

void main_1(thread uint* const tint_symbol_3) {
  uint const x_2 = *(tint_symbol_3);
  return;
}

main_out tint_symbol_inner(uint x_4_param, thread uint* const tint_symbol_4, thread float4* const tint_symbol_5) {
  *(tint_symbol_4) = x_4_param;
  main_1(tint_symbol_4);
  main_out const tint_symbol_2 = {.position_1=*(tint_symbol_5)};
  return tint_symbol_2;
}

vertex tint_symbol_1 tint_symbol(uint x_4_param [[instance_id]]) {
  thread uint tint_symbol_6 = 0u;
  thread float4 tint_symbol_7 = 0.0f;
  main_out const inner_result = tint_symbol_inner(x_4_param, &(tint_symbol_6), &(tint_symbol_7));
  tint_symbol_1 wrapper_result = {};
  wrapper_result.position_1 = inner_result.position_1;
  return wrapper_result;
}

