uniform half4 colorRed;
uniform half4 colorGreen;
const float kZero_0 = 0.0;
float return_loop_0();
const float kTen_0 = 10.0;
float continue_loop_0();
float break_loop_0();
float float_loop_0();
bool loop_operator_le_0();
bool loop_operator_lt_0();
bool loop_operator_ge_0();
bool loop_operator_gt_0();
bool loop_operator_ne_0();
bool loop_operator_eq_0();
float return_loop_0()
{
	for (float i = kZero_0;i < 10.0; ++i) 
	{
		if (i == 5.0) 
		{
			return i;
		}
	}
	return 0.0;
}
float continue_loop_0()
{
	float sum = 0.0;
	for (float i = 0.0;i < kTen_0; ++i) 
	{
		if (i < 5.0) 
		{
			continue;
		}
		sum += i;
	}
	return sum;
}
float break_loop_0()
{
	float sum = 0.0;
	const float kOne = 1.0;
	for (float i = 0.0;i < 10.0; i += kOne) 
	{
		if (i > 5.0) 
		{
			break;
		}
		sum += i;
	}
	return sum;
}
float float_loop_0()
{
	float sum = 0.0;
	for (float i = 0.12300000339746475;i < 0.60000002384185791; i += 0.11100000143051147) 
	{
		sum += i;
	}
	return sum - 1.7250000238418579;
}
bool loop_operator_le_0()
{
	;
	;
	float4 result = float4(9.0);
	for (float i = 1.0;i <= 3.0; ++i) 
	{
		result = float4(result.yzw, i);
	}
	return result == float4(9.0, 1.0, 2.0, 3.0);
}
bool loop_operator_lt_0()
{
	;
	;
	float4 result = float4(9.0);
	for (float i = 1.0;i < 4.0; ++i) 
	{
		result = float4(result.yzw, i);
	}
	return result == float4(9.0, 1.0, 2.0, 3.0);
}
bool loop_operator_ge_0()
{
	;
	;
	float4 result = float4(9.0);
	for (float i = 3.0;i >= 1.0; --i) 
	{
		result = float4(result.yzw, i);
	}
	return result == float4(9.0, 3.0, 2.0, 1.0);
}
bool loop_operator_gt_0()
{
	;
	;
	float4 result = float4(9.0);
	for (float i = 3.0;i > 0.0; --i) 
	{
		result = float4(result.yzw, i);
	}
	return result == float4(9.0, 3.0, 2.0, 1.0);
}
bool loop_operator_ne_0()
{
	;
	float4 result = float4(9.0);
	for (float i = 1.0;i != 4.0; ++i) 
	{
		result = float4(result.yzw, i);
	}
	return result == float4(9.0, 1.0, 2.0, 3.0);
}
bool loop_operator_eq_0()
{
	;
	float4 result = float4(9.0);
	for (float i = 1.0;i == 1.0; ++i) 
	{
		result = float4(result.yzw, i);
	}
	return result == float4(9.0, 9.0, 9.0, 1.0);
}
half4 main(float2 xy)
{
	return half4(((((((((return_loop_0() == 5.0 && continue_loop_0() == 35.0) && break_loop_0() == 15.0) && abs(float_loop_0()) < 0.02500000037252903) && loop_operator_le_0()) && loop_operator_lt_0()) && loop_operator_ge_0()) && loop_operator_gt_0()) && loop_operator_eq_0()) && loop_operator_ne_0() ? colorGreen : colorRed);
}
