#include <metal_stdlib>

using namespace metal;

template<typename T, int N, int M>
inline vec<T, M> operator*(matrix<T, N, M> lhs, packed_vec<T, N> rhs) {
  return lhs * vec<T, N>(rhs);
}

template<typename T, int N, int M>
inline vec<T, N> operator*(packed_vec<T, M> lhs, matrix<T, N, M> rhs) {
  return vec<T, M>(lhs) * rhs;
}

struct tint_array_wrapper {
  /* 0x0000 */ int4 arr[4];
};

struct Inner {
  /* 0x0000 */ packed_int3 a;
  /* 0x000c */ int b;
  /* 0x0010 */ packed_uint3 c;
  /* 0x001c */ uint d;
  /* 0x0020 */ packed_float3 e;
  /* 0x002c */ float f;
  /* 0x0030 */ float2x3 g;
  /* 0x0050 */ float3x2 h;
  /* 0x0068 */ int8_t tint_pad[8];
  /* 0x0070 */ tint_array_wrapper i;
};

struct S {
  /* 0x0000 */ Inner arr[1];
};

void tint_symbol_inner(uint idx, device S* const tint_symbol_2) {
  (*(tint_symbol_2)).arr[idx].a = int3(0);
  (*(tint_symbol_2)).arr[idx].b = 0;
  (*(tint_symbol_2)).arr[idx].c = uint3(0u);
  (*(tint_symbol_2)).arr[idx].d = 0u;
  (*(tint_symbol_2)).arr[idx].e = float3(0.0f);
  (*(tint_symbol_2)).arr[idx].f = 0.0f;
  (*(tint_symbol_2)).arr[idx].g = float2x3(float3(0.0f), float3(0.0f));
  (*(tint_symbol_2)).arr[idx].h = float3x2(float2(0.0f), float2(0.0f), float2(0.0f));
  tint_array_wrapper const tint_symbol_1 = {.arr={}};
  (*(tint_symbol_2)).arr[idx].i = tint_symbol_1;
}

kernel void tint_symbol(device S* tint_symbol_3 [[buffer(0)]], uint idx [[thread_index_in_threadgroup]]) {
  tint_symbol_inner(idx, tint_symbol_3);
  return;
}

