#include <metal_stdlib>

using namespace metal;
struct main_out {
  uint x_4_1;
  float4 gl_Position;
};
struct tint_symbol_2 {
  float2 x_3_param [[attribute(0)]];
};
struct tint_symbol_3 {
  uint x_4_1 [[user(locn0)]];
  float4 gl_Position [[position]];
};

void main_1(thread float2* const tint_symbol_5, thread uint* const tint_symbol_6, thread float4* const tint_symbol_7) {
  float const x_30 = (*(tint_symbol_5)).x;
  float const x_36 = (*(tint_symbol_5)).y;
  *(tint_symbol_6) = (uint((((x_30 + 1.027777791f) * 18.0f) - 1.0f)) + (uint((((x_36 + 1.027777791f) * 18.0f) - 1.0f)) * 36u));
  float2 const x_43 = *(tint_symbol_5);
  *(tint_symbol_7) = float4(x_43.x, x_43.y, 0.0f, 1.0f);
  return;
}

main_out tint_symbol_inner(float2 x_3_param, thread float2* const tint_symbol_8, thread uint* const tint_symbol_9, thread float4* const tint_symbol_10) {
  *(tint_symbol_8) = x_3_param;
  main_1(tint_symbol_8, tint_symbol_9, tint_symbol_10);
  main_out const tint_symbol_4 = {.x_4_1=*(tint_symbol_9), .gl_Position=*(tint_symbol_10)};
  return tint_symbol_4;
}

vertex tint_symbol_3 tint_symbol(tint_symbol_2 tint_symbol_1 [[stage_in]]) {
  thread float2 tint_symbol_11 = 0.0f;
  thread uint tint_symbol_12 = 0u;
  thread float4 tint_symbol_13 = 0.0f;
  main_out const inner_result = tint_symbol_inner(tint_symbol_1.x_3_param, &(tint_symbol_11), &(tint_symbol_12), &(tint_symbol_13));
  tint_symbol_3 wrapper_result = {};
  wrapper_result.x_4_1 = inner_result.x_4_1;
  wrapper_result.gl_Position = inner_result.gl_Position;
  return wrapper_result;
}

