using System;

class Base
{
	int value;

	public int Value {
		get { return value; }
	}

	protected Base (int value)
	{
		this.value = value;
	}
}

class A : Base
{
	public A (int value)
		: base (1)
	{
		Console.WriteLine ("Int");
	}

	public A (uint value)
		: base (2)
	{
		Console.WriteLine ("UInt");
	}
}

class B : Base
{
	public B (long value)
		: base (3)
	{
		Console.WriteLine ("Long");
	}

	public B (ulong value)
		: base (4)
	{
		Console.WriteLine ("ULong");
	}
}

class C : Base
{
	public C (short value)
		: base (5)
	{
		Console.WriteLine ("Short");
	}

	public C (ushort value)
		: base (6)
	{
		Console.WriteLine ("UShort");
	}
}

class D : Base
{
	public D (sbyte value)
		: base (7)
	{
		Console.WriteLine ("SByte");
	}

	public D (byte value)
		: base (8)
	{
		Console.WriteLine ("Byte");
	}
}

class E : Base
{
	public E (long value)
		: base (9)
	{
		Console.WriteLine ("Long");
	}

	public E (E e)
		: base (10)
	{
		Console.WriteLine ("E");
	}

	public static implicit operator E (long value) 
	{
		return (new E (value));
	}
}

class F : Base
{
	public F (int value)
		: base (11)
	{
		Console.WriteLine ("Int");
	}

	public F (F f)
		: base (12)
	{
		Console.WriteLine ("F");
	}

	public static implicit operator F (int value) 
	{
		return (new F (value));
	}
}

class X
{
	static int Test ()
	{
		{
			A a = new A (4);
			if (a.Value != 1)
				return 1;

			B b = new B (4);
			if (b.Value != 3)
				return 2;

			C c = new C (4);
			if (c.Value != 5)
				return 3;

			D d = new D (4);
			if (d.Value != 7)
				return 4;
		}

		{
			A a = new A (4u);
			if (a.Value != 2)
				return 5;

			B b = new B (4u);
			if (b.Value != 3)
				return 6;

			C c = new C (4);
			if (c.Value != 5)
				return 7;

			D d = new D (4);
			if (d.Value != 7)
				return 8;
		}

		{
			E e = new E (4);
			if (e.Value != 9)
				return 9;

			F f = new F (4);
			if (f.Value != 11)
				return 10;
		}

		return 0;
	}

	static int Main ()
	{
		int result = Test ();
		Console.WriteLine ("RESULT: {0}", result);
		return result;
	}
}
