struct FSIn {
    @builtin(front_facing) sk_Clockwise: bool,
    @builtin(position) sk_FragCoord: vec4<f32>,
};
struct FSOut {
    @location(0) sk_FragColor: vec4<f32>,
};
struct _GlobalUniforms {
    colorGreen: vec4<f32>,
    colorRed: vec4<f32>,
};
@binding(0) @group(0) var<uniform> _globalUniforms: _GlobalUniforms;
fn _outParamHelper_1_inout_params_are_distinct_bhh(x: ptr<function, f32>, _unused1: ptr<function, f32>) -> bool {
    var _var0: f32 = (*x);
    var _var1: f32 = (*x);
    var _return: bool = inout_params_are_distinct_bhh(&_var0, &_var1);
    (*x) = _var0;
    (*x) = _var1;
    return _return;
}
fn inout_params_are_distinct_bhh(x: ptr<function, f32>, y: ptr<function, f32>) -> bool {
    (*x) = 1.0;
    (*y) = 2.0;
    return (*x) == 1.0 && (*y) == 2.0;
}
fn main(coords: vec2<f32>) -> vec4<f32> {
    var x: f32 = 0.0;
    var _skTemp0: vec4<f32>;
    if _outParamHelper_1_inout_params_are_distinct_bhh(&x, &x) {
        _skTemp0 = _globalUniforms.colorGreen;
    } else {
        _skTemp0 = _globalUniforms.colorRed;
    }
    return _skTemp0;
}
@fragment fn fragmentMain(_stageIn: FSIn) -> FSOut {
    var _stageOut: FSOut;
    _stageOut.sk_FragColor = main(_stageIn.sk_FragCoord.xy);
    return _stageOut;
}
