#include <metal_stdlib>
#include <simd/simd.h>
using namespace metal;
struct Uniforms {
    float4 colorGreen;
    float4 colorRed;
    float4 colorWhite;
};
struct Inputs {
};
struct Outputs {
    float4 sk_FragColor [[color(0)]];
};
void out_half_vh(Uniforms _uniforms, thread float& v);
void _skOutParamHelper0_out_half_vh(Uniforms _uniforms, thread float& h) {
    float _var0;
    out_half_vh(_uniforms, _var0);
    h = _var0;
}
void out_half2_vh2(Uniforms _uniforms, thread float2& v);
void _skOutParamHelper1_out_half2_vh2(Uniforms _uniforms, thread float2& h2) {
    float2 _var0;
    out_half2_vh2(_uniforms, _var0);
    h2 = _var0;
}
void out_half3_vh3(Uniforms _uniforms, thread float3& v);
void _skOutParamHelper2_out_half3_vh3(Uniforms _uniforms, thread float3& h3) {
    float3 _var0;
    out_half3_vh3(_uniforms, _var0);
    h3 = _var0;
}
void out_half4_vh4(Uniforms _uniforms, thread float4& v);
void _skOutParamHelper3_out_half4_vh4(Uniforms _uniforms, thread float4& h4) {
    float4 _var0;
    out_half4_vh4(_uniforms, _var0);
    h4 = _var0;
}
void out_half_vh(Uniforms _uniforms, thread float& v);
void _skOutParamHelper4_out_half_vh(Uniforms _uniforms, thread float3& h3) {
    float _var0;
    out_half_vh(_uniforms, _var0);
    h3.y = _var0;
}
void out_half2_vh2(Uniforms _uniforms, thread float2& v);
void _skOutParamHelper5_out_half2_vh2(Uniforms _uniforms, thread float3& h3) {
    float2 _var0;
    out_half2_vh2(_uniforms, _var0);
    h3.xz = _var0;
}
void out_half4_vh4(Uniforms _uniforms, thread float4& v);
void _skOutParamHelper6_out_half4_vh4(Uniforms _uniforms, thread float4& h4) {
    float4 _var0;
    out_half4_vh4(_uniforms, _var0);
    h4.zwxy = _var0;
}
void out_half2x2_vh22(Uniforms _uniforms, thread float2x2& v);
void _skOutParamHelper7_out_half2x2_vh22(Uniforms _uniforms, thread float2x2& h2x2) {
    float2x2 _var0;
    out_half2x2_vh22(_uniforms, _var0);
    h2x2 = _var0;
}
void out_half3x3_vh33(Uniforms _uniforms, thread float3x3& v);
void _skOutParamHelper8_out_half3x3_vh33(Uniforms _uniforms, thread float3x3& h3x3) {
    float3x3 _var0;
    out_half3x3_vh33(_uniforms, _var0);
    h3x3 = _var0;
}
void out_half4x4_vh44(Uniforms _uniforms, thread float4x4& v);
void _skOutParamHelper9_out_half4x4_vh44(Uniforms _uniforms, thread float4x4& h4x4) {
    float4x4 _var0;
    out_half4x4_vh44(_uniforms, _var0);
    h4x4 = _var0;
}
void out_half3_vh3(Uniforms _uniforms, thread float3& v);
void _skOutParamHelper10_out_half3_vh3(Uniforms _uniforms, thread float3x3& h3x3) {
    float3 _var0;
    out_half3_vh3(_uniforms, _var0);
    h3x3[1] = _var0;
}
void out_half_vh(Uniforms _uniforms, thread float& v);
void _skOutParamHelper11_out_half_vh(Uniforms _uniforms, thread float4x4& h4x4) {
    float _var0;
    out_half_vh(_uniforms, _var0);
    h4x4[3].w = _var0;
}
void out_half_vh(Uniforms _uniforms, thread float& v);
void _skOutParamHelper12_out_half_vh(Uniforms _uniforms, thread float2x2& h2x2) {
    float _var0;
    out_half_vh(_uniforms, _var0);
    h2x2[0].x = _var0;
}
void out_int_vi(Uniforms _uniforms, thread int& v);
void _skOutParamHelper13_out_int_vi(Uniforms _uniforms, thread int& i) {
    int _var0;
    out_int_vi(_uniforms, _var0);
    i = _var0;
}
void out_int2_vi2(Uniforms _uniforms, thread int2& v);
void _skOutParamHelper14_out_int2_vi2(Uniforms _uniforms, thread int2& i2) {
    int2 _var0;
    out_int2_vi2(_uniforms, _var0);
    i2 = _var0;
}
void out_int3_vi3(Uniforms _uniforms, thread int3& v);
void _skOutParamHelper15_out_int3_vi3(Uniforms _uniforms, thread int3& i3) {
    int3 _var0;
    out_int3_vi3(_uniforms, _var0);
    i3 = _var0;
}
void out_int4_vi4(Uniforms _uniforms, thread int4& v);
void _skOutParamHelper16_out_int4_vi4(Uniforms _uniforms, thread int4& i4) {
    int4 _var0;
    out_int4_vi4(_uniforms, _var0);
    i4 = _var0;
}
void out_int3_vi3(Uniforms _uniforms, thread int3& v);
void _skOutParamHelper17_out_int3_vi3(Uniforms _uniforms, thread int4& i4) {
    int3 _var0;
    out_int3_vi3(_uniforms, _var0);
    i4.xyz = _var0;
}
void out_int_vi(Uniforms _uniforms, thread int& v);
void _skOutParamHelper18_out_int_vi(Uniforms _uniforms, thread int2& i2) {
    int _var0;
    out_int_vi(_uniforms, _var0);
    i2.y = _var0;
}
void out_float_vf(Uniforms _uniforms, thread float& v);
void _skOutParamHelper19_out_float_vf(Uniforms _uniforms, thread float& f) {
    float _var0;
    out_float_vf(_uniforms, _var0);
    f = _var0;
}
void out_float2_vf2(Uniforms _uniforms, thread float2& v);
void _skOutParamHelper20_out_float2_vf2(Uniforms _uniforms, thread float2& f2) {
    float2 _var0;
    out_float2_vf2(_uniforms, _var0);
    f2 = _var0;
}
void out_float3_vf3(Uniforms _uniforms, thread float3& v);
void _skOutParamHelper21_out_float3_vf3(Uniforms _uniforms, thread float3& f3) {
    float3 _var0;
    out_float3_vf3(_uniforms, _var0);
    f3 = _var0;
}
void out_float4_vf4(Uniforms _uniforms, thread float4& v);
void _skOutParamHelper22_out_float4_vf4(Uniforms _uniforms, thread float4& f4) {
    float4 _var0;
    out_float4_vf4(_uniforms, _var0);
    f4 = _var0;
}
void out_float2_vf2(Uniforms _uniforms, thread float2& v);
void _skOutParamHelper23_out_float2_vf2(Uniforms _uniforms, thread float3& f3) {
    float2 _var0;
    out_float2_vf2(_uniforms, _var0);
    f3.xy = _var0;
}
void out_float_vf(Uniforms _uniforms, thread float& v);
void _skOutParamHelper24_out_float_vf(Uniforms _uniforms, thread float2& f2) {
    float _var0;
    out_float_vf(_uniforms, _var0);
    f2.x = _var0;
}
void out_float2x2_vf22(Uniforms _uniforms, thread float2x2& v);
void _skOutParamHelper25_out_float2x2_vf22(Uniforms _uniforms, thread float2x2& f2x2) {
    float2x2 _var0;
    out_float2x2_vf22(_uniforms, _var0);
    f2x2 = _var0;
}
void out_float3x3_vf33(Uniforms _uniforms, thread float3x3& v);
void _skOutParamHelper26_out_float3x3_vf33(Uniforms _uniforms, thread float3x3& f3x3) {
    float3x3 _var0;
    out_float3x3_vf33(_uniforms, _var0);
    f3x3 = _var0;
}
void out_float4x4_vf44(Uniforms _uniforms, thread float4x4& v);
void _skOutParamHelper27_out_float4x4_vf44(Uniforms _uniforms, thread float4x4& f4x4) {
    float4x4 _var0;
    out_float4x4_vf44(_uniforms, _var0);
    f4x4 = _var0;
}
void out_float_vf(Uniforms _uniforms, thread float& v);
void _skOutParamHelper28_out_float_vf(Uniforms _uniforms, thread float2x2& f2x2) {
    float _var0;
    out_float_vf(_uniforms, _var0);
    f2x2[0].x = _var0;
}
void out_bool_vb(Uniforms _uniforms, thread bool& v);
void _skOutParamHelper29_out_bool_vb(Uniforms _uniforms, thread bool& b) {
    bool _var0;
    out_bool_vb(_uniforms, _var0);
    b = _var0;
}
void out_bool2_vb2(Uniforms _uniforms, thread bool2& v);
void _skOutParamHelper30_out_bool2_vb2(Uniforms _uniforms, thread bool2& b2) {
    bool2 _var0;
    out_bool2_vb2(_uniforms, _var0);
    b2 = _var0;
}
void out_bool3_vb3(Uniforms _uniforms, thread bool3& v);
void _skOutParamHelper31_out_bool3_vb3(Uniforms _uniforms, thread bool3& b3) {
    bool3 _var0;
    out_bool3_vb3(_uniforms, _var0);
    b3 = _var0;
}
void out_bool4_vb4(Uniforms _uniforms, thread bool4& v);
void _skOutParamHelper32_out_bool4_vb4(Uniforms _uniforms, thread bool4& b4) {
    bool4 _var0;
    out_bool4_vb4(_uniforms, _var0);
    b4 = _var0;
}
void out_bool2_vb2(Uniforms _uniforms, thread bool2& v);
void _skOutParamHelper33_out_bool2_vb2(Uniforms _uniforms, thread bool4& b4) {
    bool2 _var0;
    out_bool2_vb2(_uniforms, _var0);
    b4.xw = _var0;
}
void out_bool_vb(Uniforms _uniforms, thread bool& v);
void _skOutParamHelper34_out_bool_vb(Uniforms _uniforms, thread bool3& b3) {
    bool _var0;
    out_bool_vb(_uniforms, _var0);
    b3.z = _var0;
}
void out_half_vh(Uniforms _uniforms, thread float& v) {
    v = _uniforms.colorWhite.x;
}
void out_half2_vh2(Uniforms _uniforms, thread float2& v) {
    v = float2(_uniforms.colorWhite.y);
}
void out_half3_vh3(Uniforms _uniforms, thread float3& v) {
    v = float3(_uniforms.colorWhite.z);
}
void out_half4_vh4(Uniforms _uniforms, thread float4& v) {
    v = float4(_uniforms.colorWhite.w);
}
void out_half2x2_vh22(Uniforms _uniforms, thread float2x2& v) {
    v = float2x2(_uniforms.colorWhite.x);
}
void out_half3x3_vh33(Uniforms _uniforms, thread float3x3& v) {
    v = float3x3(_uniforms.colorWhite.y);
}
void out_half4x4_vh44(Uniforms _uniforms, thread float4x4& v) {
    v = float4x4(_uniforms.colorWhite.z);
}
void out_int_vi(Uniforms _uniforms, thread int& v) {
    v = int(_uniforms.colorWhite.x);
}
void out_int2_vi2(Uniforms _uniforms, thread int2& v) {
    v = int2(int(_uniforms.colorWhite.y));
}
void out_int3_vi3(Uniforms _uniforms, thread int3& v) {
    v = int3(int(_uniforms.colorWhite.z));
}
void out_int4_vi4(Uniforms _uniforms, thread int4& v) {
    v = int4(int(_uniforms.colorWhite.w));
}
void out_float_vf(Uniforms _uniforms, thread float& v) {
    v = _uniforms.colorWhite.x;
}
void out_float2_vf2(Uniforms _uniforms, thread float2& v) {
    v = float2(_uniforms.colorWhite.y);
}
void out_float3_vf3(Uniforms _uniforms, thread float3& v) {
    v = float3(_uniforms.colorWhite.z);
}
void out_float4_vf4(Uniforms _uniforms, thread float4& v) {
    v = float4(_uniforms.colorWhite.w);
}
void out_float2x2_vf22(Uniforms _uniforms, thread float2x2& v) {
    v = float2x2(_uniforms.colorWhite.x);
}
void out_float3x3_vf33(Uniforms _uniforms, thread float3x3& v) {
    v = float3x3(_uniforms.colorWhite.y);
}
void out_float4x4_vf44(Uniforms _uniforms, thread float4x4& v) {
    v = float4x4(_uniforms.colorWhite.z);
}
void out_bool_vb(Uniforms _uniforms, thread bool& v) {
    v = bool(_uniforms.colorWhite.x);
}
void out_bool2_vb2(Uniforms _uniforms, thread bool2& v) {
    v = bool2(bool(_uniforms.colorWhite.y));
}
void out_bool3_vb3(Uniforms _uniforms, thread bool3& v) {
    v = bool3(bool(_uniforms.colorWhite.z));
}
void out_bool4_vb4(Uniforms _uniforms, thread bool4& v) {
    v = bool4(bool(_uniforms.colorWhite.w));
}
fragment Outputs fragmentMain(Inputs _in [[stage_in]], constant Uniforms& _uniforms [[buffer(0)]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
    Outputs _out;
    (void)_out;
    float h;
    _skOutParamHelper0_out_half_vh(_uniforms, h);
    float2 h2;
    _skOutParamHelper1_out_half2_vh2(_uniforms, h2);
    float3 h3;
    _skOutParamHelper2_out_half3_vh3(_uniforms, h3);
    float4 h4;
    _skOutParamHelper3_out_half4_vh4(_uniforms, h4);
    _skOutParamHelper4_out_half_vh(_uniforms, h3);
    _skOutParamHelper5_out_half2_vh2(_uniforms, h3);
    _skOutParamHelper6_out_half4_vh4(_uniforms, h4);
    float2x2 h2x2;
    _skOutParamHelper7_out_half2x2_vh22(_uniforms, h2x2);
    float3x3 h3x3;
    _skOutParamHelper8_out_half3x3_vh33(_uniforms, h3x3);
    float4x4 h4x4;
    _skOutParamHelper9_out_half4x4_vh44(_uniforms, h4x4);
    _skOutParamHelper10_out_half3_vh3(_uniforms, h3x3);
    _skOutParamHelper11_out_half_vh(_uniforms, h4x4);
    _skOutParamHelper12_out_half_vh(_uniforms, h2x2);
    int i;
    _skOutParamHelper13_out_int_vi(_uniforms, i);
    int2 i2;
    _skOutParamHelper14_out_int2_vi2(_uniforms, i2);
    int3 i3;
    _skOutParamHelper15_out_int3_vi3(_uniforms, i3);
    int4 i4;
    _skOutParamHelper16_out_int4_vi4(_uniforms, i4);
    _skOutParamHelper17_out_int3_vi3(_uniforms, i4);
    _skOutParamHelper18_out_int_vi(_uniforms, i2);
    float f;
    _skOutParamHelper19_out_float_vf(_uniforms, f);
    float2 f2;
    _skOutParamHelper20_out_float2_vf2(_uniforms, f2);
    float3 f3;
    _skOutParamHelper21_out_float3_vf3(_uniforms, f3);
    float4 f4;
    _skOutParamHelper22_out_float4_vf4(_uniforms, f4);
    _skOutParamHelper23_out_float2_vf2(_uniforms, f3);
    _skOutParamHelper24_out_float_vf(_uniforms, f2);
    float2x2 f2x2;
    _skOutParamHelper25_out_float2x2_vf22(_uniforms, f2x2);
    float3x3 f3x3;
    _skOutParamHelper26_out_float3x3_vf33(_uniforms, f3x3);
    float4x4 f4x4;
    _skOutParamHelper27_out_float4x4_vf44(_uniforms, f4x4);
    _skOutParamHelper28_out_float_vf(_uniforms, f2x2);
    bool b;
    _skOutParamHelper29_out_bool_vb(_uniforms, b);
    bool2 b2;
    _skOutParamHelper30_out_bool2_vb2(_uniforms, b2);
    bool3 b3;
    _skOutParamHelper31_out_bool3_vb3(_uniforms, b3);
    bool4 b4;
    _skOutParamHelper32_out_bool4_vb4(_uniforms, b4);
    _skOutParamHelper33_out_bool2_vb2(_uniforms, b4);
    _skOutParamHelper34_out_bool_vb(_uniforms, b3);
    bool ok = true;
    ok = ok && 1.0 == (((((h * h2.x) * h3.x) * h4.x) * h2x2[0].x) * h3x3[0].x) * h4x4[0].x;
    ok = ok && 1.0 == (((((f * f2.x) * f3.x) * f4.x) * f2x2[0].x) * f3x3[0].x) * f4x4[0].x;
    ok = ok && 1 == ((i * i2.x) * i3.x) * i4.x;
    ok = ok && (((b && b2.x) && b3.x) && b4.x);
    _out.sk_FragColor = ok ? _uniforms.colorGreen : _uniforms.colorRed;
    return _out;
}
