#include <metal_stdlib>

using namespace metal;

template<typename T, size_t N>
struct tint_array {
    const constant T& operator[](size_t i) const constant { return elements[i]; }
    device T& operator[](size_t i) device { return elements[i]; }
    const device T& operator[](size_t i) const device { return elements[i]; }
    thread T& operator[](size_t i) thread { return elements[i]; }
    const thread T& operator[](size_t i) const thread { return elements[i]; }
    threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
    const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
    T elements[N];
};

struct strided_arr {
  /* 0x0000 */ float el;
  /* 0x0004 */ tint_array<int8_t, 12> tint_pad;
};

struct LeftOver {
  /* 0x0000 */ float4x4 worldViewProjection;
  /* 0x0040 */ float time;
  /* 0x0044 */ tint_array<int8_t, 12> tint_pad_1;
  /* 0x0050 */ tint_array<float4x4, 2> test2;
  /* 0x00d0 */ tint_array<strided_arr, 4> test;
};

void main_1(thread float3* const tint_symbol_5, const constant LeftOver* const tint_symbol_6, thread float4* const tint_symbol_7, thread float2* const tint_symbol_8, thread float2* const tint_symbol_9) {
  float4 q = 0.0f;
  float3 p = 0.0f;
  float3 const x_13 = *(tint_symbol_5);
  q = float4(x_13[0], x_13[1], x_13[2], 1.0f);
  float4 const x_21 = q;
  p = float3(x_21[0], x_21[1], x_21[2]);
  float const x_27 = p[0];
  float const x_41 = (*(tint_symbol_6)).test[0].el;
  float const x_45 = (*(tint_symbol_5))[1];
  float const x_49 = (*(tint_symbol_6)).time;
  p[0] = (x_27 + sin(((x_41 * x_45) + x_49)));
  float const x_55 = p[1];
  float const x_57 = (*(tint_symbol_6)).time;
  p[1] = (x_55 + sin((x_57 + 4.0f)));
  float4x4 const x_69 = (*(tint_symbol_6)).worldViewProjection;
  float3 const x_70 = p;
  *(tint_symbol_7) = (x_69 * float4(x_70[0], x_70[1], x_70[2], 1.0f));
  float2 const x_83 = *(tint_symbol_8);
  *(tint_symbol_9) = x_83;
  float const x_87 = (*(tint_symbol_7))[1];
  (*(tint_symbol_7))[1] = (x_87 * -1.0f);
  return;
}

struct main_out {
  float4 gl_Position;
  float2 vUV_1;
};

struct tint_symbol_2 {
  float3 position_param [[attribute(0)]];
  float3 normal_param [[attribute(1)]];
  float2 uv_param [[attribute(2)]];
};

struct tint_symbol_3 {
  float2 vUV_1 [[user(locn0)]];
  float4 gl_Position [[position]];
};

main_out tint_symbol_inner(float3 position_param, float2 uv_param, float3 normal_param, thread float3* const tint_symbol_10, thread float2* const tint_symbol_11, thread float3* const tint_symbol_12, const constant LeftOver* const tint_symbol_13, thread float4* const tint_symbol_14, thread float2* const tint_symbol_15) {
  *(tint_symbol_10) = position_param;
  *(tint_symbol_11) = uv_param;
  *(tint_symbol_12) = normal_param;
  main_1(tint_symbol_10, tint_symbol_13, tint_symbol_14, tint_symbol_11, tint_symbol_15);
  main_out const tint_symbol_4 = {.gl_Position=*(tint_symbol_14), .vUV_1=*(tint_symbol_15)};
  return tint_symbol_4;
}

vertex tint_symbol_3 tint_symbol(const constant LeftOver* tint_symbol_19 [[buffer(0)]], tint_symbol_2 tint_symbol_1 [[stage_in]]) {
  thread float3 tint_symbol_16 = 0.0f;
  thread float2 tint_symbol_17 = 0.0f;
  thread float3 tint_symbol_18 = 0.0f;
  thread float4 tint_symbol_20 = 0.0f;
  thread float2 tint_symbol_21 = 0.0f;
  main_out const inner_result = tint_symbol_inner(tint_symbol_1.position_param, tint_symbol_1.uv_param, tint_symbol_1.normal_param, &(tint_symbol_16), &(tint_symbol_17), &(tint_symbol_18), tint_symbol_19, &(tint_symbol_20), &(tint_symbol_21));
  tint_symbol_3 wrapper_result = {};
  wrapper_result.gl_Position = inner_result.gl_Position;
  wrapper_result.vUV_1 = inner_result.vUV_1;
  return wrapper_result;
}

