﻿// <auto-generated /> - disable StyleCop compile time checks for this file
using System;

namespace ns1
{
    public class Test
    {
        public static void Run()
        {
            c1 a = new c1(); a.test();

            c2<string> b = new c2<string>(); b.TEST();

            c3<string, string>.test();

            c4.Test();

            c4.c5 d = new c4.c5(); d.Test();
        }
    }

    // Abstract Class
    public abstract class c0
    {
        // Abstract Methods
        public abstract int abst(ref string x, params int[] y);

        public abstract int abst(ref string x, params long[] y);

        public abstract int abst(ref string x, long y, long z);
    }

    public class c1 : c0 // Inheritance
    {
        private int i = 2;
        internal uint ui = 3;
        public c1 a = null;

        // Overloaded Constructors
        public c1()
        {
            i = 2; this.ui = 3;
        }

        public c1(int x)
        {
            i = x; this.ui = 3; this.a = new c1(this.i, this.ui, this.a);
        }

        public c1(int x, uint y, c1 c)
        {
            this.i = x; ui = y; a = new c1();
        }

        public void test()
        {
            int i = 2;
            bool b = true;

            // Nested Scopes
            if (b)
            {
                object o = i;
                b = false;
                {
                    byte b1 = 1;
                    string s = "c1.test()";
                    {
                        Console.WriteLine(s);
                        this.foo(o); foo(i); this.foo(b); this.foo(b1); // Overload Resolution, Implicit Conversions
                    }
                }
            }
            // Nested Scopes
            if (!b)
            {
                object o = i;
                b = false;
                if (true)
                {
                    byte b1 = 1;
                    string s = "c1.test()";
                    {
                        Console.WriteLine(s);
                        bar2(o); this.bar2(i); this.bar2(b1); bar1(s); // Non-Overloaded Methods, Implicit Conversions
                    }
                }
            }
            // Nested Scopes
            if (!false)
            {
                object o = i;
                b = false;
                {
                    byte b1 = 1;
                    string s = "c1.test()";
                    {
                        Console.WriteLine(s);
                        this.bar4(o); this.bar4(i); this.bar4(b1); this.bar3(b); // Non-Overloaded Methods, Implicit Conversions
                    }
                }
            }

            if (!false)
            {
                object o = i;
                b = false;
                {
                    string s = "c1.test()";
                    {
                        Console.WriteLine(s);

                        // Method Calls - Ref, Paramarrays
                        // Overloaded Abstract Methods
                        c1 c = new c1(); long l = 1;
                        this.abst(ref s, 1, i);
                        c.abst(ref s, new int[] { 1, i, i });
                        c.abst(ref s, this.abst(ref s, l, l), l, l, l);

                        // Method Calls - Ref, Paramarrays
                        // Overloaded Virtual Methods
                        c.virt(i, c, new c2<string>[] { virt(i, ref c), new c4() });
                        virt(this.virt(i, ref c), c.virt(ref i, c, virt(i, ref c)));
                        virt(c.abst(ref s, l, l), this.abst(ref s, new long[] { 1, i, l }));
                        c = new c4();
                        virt(i, ref c);
                        virt(ref i, new c4(), new c4(), new c2<string>());
                        virt(new int[] { 1, 2, 3 });
                        virt(new Exception[] { });
                        virt(new c1[] { new c4(), new c2<string>() });
                    }
                }
            }
        }

        // Overriden Abstract Methods
        public override int abst(ref string x, params int[] y)
        {
            Console.WriteLine("    c1.abst(ref string, params int[])");
            x = x.ToString(); y = new int[] { y[0] }; // Read, Write Ref + Paramarrays
            return 0;
        }

        public override int abst(ref string x, params long[] y)
        {
            Console.WriteLine("    c1.abst(ref string, params long[])");
            x = y[0].ToString(); y = null; // Read, Write Ref + Paramarrays
            return 1;
        }

        public override int abst(ref string x, long y, long z)
        {
            Console.WriteLine("    c1.abst(ref string, long, long)");
            x = z.ToString(); // Read, Write Ref
            return 2;
        }

        // Virtual Methods
        public virtual int virt(ref int x, c1 y, params c2<string>[] z)
        {
            Console.WriteLine("    c1.virt(ref int, c1, params c2<string>[])");
            x = x + x * 2; z = null; // Read, Write Ref + Paramarrays
            return 0;
        }

        public virtual c2<string> virt(int x, ref c1 y)
        {
            Console.WriteLine("    c1.virt(int, ref c1)");
            y = new c1(); // Read, Write Ref
            return new c4();
        }

        public virtual int virt(params object[] x)
        {
            Console.WriteLine("    c1.virt(params object[])");
            x = new object[] { 1, 2, null }; // Read, Write Paramarrays
            return new int();
        }

        public virtual int virt(params int[] x)
        {
            Console.WriteLine("    c1.virt(params int[])");
            x = new int[] { 0, 1 }; // Read, Write Paramarrays
            int i = x[0];
            return new int();
        }

        internal int foo(int x)
        {
            Console.WriteLine("    c1.foo(int)");

            // Read, Write Fields
            this.ui = 0u + this.ui;
            i = i - 1 * 2 + 3 / 1;
            this.i = 1;
            this.a = null; a = new c1(x);

            // Read, Write Locals
            bool b = true; string s = null;
            s = string.Empty;
            b = this.i != 1 + (2 - 3);
            s = "";
            c1 c = new c1(i, ui, new c1(this.i, this.ui, new c1(i)));
            c = this.a;
            b = b == true; s = s.ToString();

            // Read, Write Params
            x = (i - this.i) * i + (x / i);
            x = x.GetHashCode(); this.i = x;

            // Read, Write Array Element
            int[] a1 = new int[] { 1, 2, 3 };
            a1[1] = i; a1[2] = x;
            a1[1] = 1; a1[2] = 2;
            int i1 = a1[1] - a1[2];
            i1 = (a1[1] - (a1[2] + a1[1]));
            object o = i1;
            o = a1[2] + (a1[1] - a1[2]);

            return x;
        }

        public bool foo(object x)
        {
            Console.WriteLine("    c1.foo(object)");

            // Read, Write Fields
            ui = 0u;
            this.i = this.i - 1;
            a = null;
            uint ui1 = ui; int i1 = i;

            // Read, Write Locals
            bool b = true; string s = string.Empty;
            s = null; b = this.i != 1;
            ui = ui1; i = i1;
            bar4(b); this.foo(i1); bar4(b == (true != b));

            // Read, Write Params
            x = null; x = new c1(this.i, this.ui, a);
            this.bar4(x); this.bar4(x.GetHashCode() != (x.GetHashCode()));

            // Read, Write Array Element
            object[] a1 = new c1[3] { null, null, null };
            this.i = 1;
            a1[1] = null; a1[2] = new c1((i * i) / i, ui + (ui - ui), null);
            object o = null;
            o = a1[1]; this.bar4(a1[2]);

            if (b)
            {
                return b.GetHashCode() == this.i;
            }
            else
            {
                return b;
            }
        }

        private void bar1(string x)
        {
            Console.WriteLine("    c1.bar1(string)");

            // Read, Write Fields
            this.ui = 0u - 0u;
            i = this.i * 1;
            this.a = new c1();
            this.foo(i.GetHashCode()); this.a = this;

            // Read, Write Locals
            c1 c = new c1(1, 0u, (null));
            c = null; i = 1;
            c = new c1(i / i);
            c = this.a;
            this.ui = 1;
            c.ui = this.ui / ui;
            c.i = this.i + this.i;
            c.a = c;
            c.a = c = this.a = c.a = null;
            c = new c1(i.GetHashCode());
            this.foo(c.i); bar3(c != null);

            if (this.i == 10321)
            {
                return;
            }
            else
            {
            }

            // Read, Write Params
            x = null; this.bar4(x);

            // Read, Write Array Element
            string[] a1 = new string[] { "", null, null };
            a1[1] = null; a1[2] = "";
            string s = null;
            s = a1[1]; foo(a1[2]);
        }

        protected string bar2(object x)
        {
            Console.WriteLine("    c1.bar2(object)");

            // Read, Write Fields
            this.ui = ui - this.ui;
            i = i / 1;
            a = null;
            foo(i);

            // Read, Write Locals
            c1 c;
            object o;
            c = null; c = new c1(i / 2, ui * (2u), new c1(i / 2, ui * (2u), c));
            this.a = new c1(((1 + i) - 1));
            c = this.a;
            o = c;
            c.ui = this.ui;
            c.i = this.i * this.i;
            c.a = c; this.a = c.a;
            c.a = c = this.a = c.a = new c1(i, ui, new c1()); o = c.a = c;
            bar4(o.ToString()); this.bar4(c.a.a);

            // Read, Write Params
            x = c; x = o;
            o = x;

            // Read, Write Array Element
            object[] a1 = new c1[] { null, this.a, c };
            a1[1] = null; a1[2] = c;
            o = a1[1]; bar3(a1[2] != a1[1]);

            if (o == null)
            {
                return null;
            }
            else
            {
                return string.Empty;
            }
        }

        internal object bar3(bool x)
        {
            Console.WriteLine("    c1.bar3(bool)");

            // Read, Write Fields
            ui = ui - this.ui;
            i = i + 1;
            this.a = new c1(i, ui, a);

            // Read, Write Locals
            bool b = x;
            b = this.i > this.i + 1;

            // Read, Write Params
            x = (this.i == i + 1);
            foo(x.GetHashCode());

            // Read, Write Array Element
            bool[] a1 = new bool[] { true, false, x };
            a1[1] = x == (this.i != i - 1 + 1); a1[2] = x == (i >= this.i + 1 - 1);
            b = (a1[1]); b = a1[2];
            object o = b != a1[2];
            o = (a1[1].ToString()) == (a1[2].ToString());
            foo(a1[1].GetHashCode());

            if (b)
            {
                return this.i;
            }
            else
            {
                return a1[1];
            }
        }

        public c1 bar4(object x)
        {
            Console.WriteLine("    c1.bar4(object)");

            // Read, Write Fields
            ui = 0;
            this.ui = this.ui - (this.ui + this.ui) * this.ui;
            this.i = (i + 1) - (1 * (i / 1));
            this.a = (null);
            foo(this.i.GetHashCode());

            // Read, Write Locals
            object o = null;
            bool b = true;
            b = this.i <= this.i + 1 - 1;
            o = x;
            c1 c = new c1(i, this.ui, a);
            c.ui = (this.ui) + (this.ui) + c.ui;
            o = x = c;
            c.i = 1;
            c.i = this.i * (this.i / c.i + c.i);
            c.a = c = this.a = c.a = new c1(); c.a = c;
            foo(c.GetHashCode()); bar3(c.a.GetHashCode() != i);

            // Read, Write Params
            x = (o.ToString());
            x = x.ToString(); foo(x.GetHashCode()); foo(x.ToString().GetHashCode());

            // Read, Write Array Element
            object[] a1 = new object[] { (null), (this.a), c };
            a1[1] = ((this.a)); a1[2] = (c); a1[1] = (i);
            Array.Reverse(a1);
            o = a1[1]; foo(a1.GetHashCode()); bar3(a1[2] == null);

            if (b)
            {
                return this;
            }
            else if (!b)
            {
                return this.a;
            }
            else if (!b)
            {
                return new c1(i, ui, new c1(i + 1, ui - 1u, new c1(i + 2)));
            }
            else
            {
                return (c1)a1[2];
            }
        }
    }

    public class c2<T> : c1 // Inheritance, Generics
    {
        protected c1 c = new c1(0, 0, new c1(1, 1, new c1(2)));

        public void TEST()
        {
            // Nested Scopes
            byte b = 0;
            if (true)
            {
                sbyte sb = 0;
                if (!false)
                {
                    string s = "c2<T>.test()";
                    if (b == 0)
                    {
                        Console.WriteLine(s);
                        this.foo(x: b, y: sb); // Named Arguments
                    }
                }
                if (sb != 1)
                {
                    this.bar1(x: b, y: sb); // Named Arguments
                }
            }
            {
                sbyte sb2 = 0;
                if (b != 1)
                {
                    string s2 = "c2<T>.test()";
                    if (sb2 == 0)
                    {
                        Console.WriteLine(s2);
                        foo(x: b, y: sb2); // Named Arguments
                    }
                }
                if (b == sb2)
                {
                    bar2(x: b, y: sb2); // Named Arguments
                }
            }
            {
                c2<string> c = new c4();
                if (!(!true))
                {
                    // Method Calls - Ref, Paramarrays
                    // Overloaded Abstract Methods
                    int i = 1; long l = i; string s = "";
                    this.abst(ref s, 1, i);
                    c.abst(ref s, new int[] { 1, i, i });
                    c.abst(ref s, this.abst(ref s, l, l), l, l, l);

                    // Method Calls - Ref, Params
                    // Overloaded Virtual Methods
                    c1 a = c;
                    c.virt(i, c, new c2<string>[] { virt(i, ref a), new c4() });
                    virt(this.virt(i, ref a), c.virt(ref i, y: c, z: virt(i, ref a)));
                    virt(c.abst(ref s, l, l), this.abst(y: new long[] { 1, i, l }, x: ref s));
                    c = new c4();
                    virt(y: ref a, x: i);
                    virt(ref i, new c4(), new c4(), new c2<string>());
                    virt(new int[] { 1, 2, 3 });
                    virt(new Exception[] { });
                    virt(new c1[] { new c4(), new c2<string>() });
                }
            }
        }

        // Overriden Abstract Methods
        public override int abst(ref string x, params int[] y)
        {
            Console.WriteLine("    c2<T>.abst(ref string, params int[])");
            x = y[0].ToString(); y = null; // Read, Write Ref + Paramarrays
            return 0;
        }

        public override int abst(ref string x, params long[] y)
        {
            Console.WriteLine("    c2<T>.abst(ref string, params long[])");
            x = y[0].ToString(); y = null; // Read, Write Ref + Paramarrays
            return 1;
        }

        // Overriden Virtual Methods
        public override int virt(ref int x, c1 y, params c2<string>[] z)
        {
            Console.WriteLine("    c2<T>.virt(ref int, c1, params c2<string>[])");
            x = 0; x = y.GetHashCode(); z = null; // Read, Write Ref + Paramarrays
            return 0;
        }

        public override c2<string> virt(int x, ref c1 y)
        {
            Console.WriteLine("    c2<T>.virt(int, ref c1)");
            x.ToString(); y = new c1(x, (uint)x, y); // Read, Write Ref
            return new c2<string>();
        }

        public override int virt(params object[] x)
        {
            Console.WriteLine("    c2<T>.virt(params object[])");
            x.ToString(); x = null; // Read, Write Paramarrays
            return new int();
        }

        private void bar(T x)
        {
            Console.WriteLine("    c2<T>.bar(T)");

            // Read, Write Params
            T y = x;
            x = y;

            // Read Consts
            const string const1 = "";
            if (!false)
            {
                const int const2 = 1;
                const c1 const3 = null;
                if (true)
                {
                    this.bar4(const1); c.foo(const2 != const2); this.a = const3;
                }
            }
        }

        private T foo1(T x)
        {
            Console.WriteLine("    c2<T>.foo1(T)");

            int aa = 1;

            // Read, Write Params
            T y = x;
            x = y; bar(x);

            // Read Consts
            const long const1 = 1;
            const uint const2 = 1;
            while (const1 < const2 - aa)
            {
                continue;
            }

            while (const2 == const1 - aa + aa)
            {
                this.bar4(const1); c.foo(const2 != const2);
                return x;
            }
            return x;
        }

        private bool foo(bool x)
        {
            Console.WriteLine("    c2<T>.foo(bool)");

            int aa = 1;

            // Read, Write Params
            x = x.ToString() == x.ToString(); a = c; a = this;

            // Read Consts
            const long const1 = 1;
            const uint const2 = 1;
            while (const1 < const1 - aa)
            {
                continue;
            }

            while (const2 == const2 - aa + aa)
            {
                return x;
            }
            return x;
        }

        protected c1 foo(byte x, object y)
        {
            Console.WriteLine("    c2<T>.foo(byte, object)");

            // Read, Write Params
            y = x; x = 1;
            c1 c = new c1();
            c.bar4(y); c.foo(x);

            // Read Consts
            const string const1 = "";
            bool b = false;
            if (!b)
            {
                const int const2 = 1;
                object o = y;
                while (y == o)
                {
                    const c1 const3 = null;
                    byte bb = 1;
                    if (bb == x)
                    {
                        this.bar4(const1); this.foo(const2 != const2); this.a = const3;
                        break;
                    }
                    else
                    {
                        return const3;
                    }
                }
                return c;
            }
            return null;
        }

        internal void bar1(byte x, object y)
        {
            Console.WriteLine("    c2<T>.bar1(byte, object)");

            // Read, Write Params
            y = x; x = 1;
            c1 c = new c1();
            c.bar4(y); c.foo(x);

            // Read Consts
            const long const1 = 1;
            const uint const2 = 1;
            while (const1 != x) continue;

            while (const2 == const2)
            {
                this.bar4(const1); this.foo(const2 != const2);
                break;
            }
        }

        public int bar2(byte x, object y)
        {
            Console.WriteLine("    c2<T>.bar2(byte, object)");

            // Read, Write Params
            y = x; x = 1;
            c1 c = new c1();
            c.bar4(y); this.foo(x);

            // Read Consts
            const long const1 = 1;
            if (!false)
            {
                const sbyte const2 = 1;
                const c1 const3 = null;
                if (c != const3)
                {
                    c.bar4(const1); this.foo(const2 != const2); this.a = const3;
                }
            }
            return (int)const1;
        }

        internal float bar3(byte x, object y)
        {
            Console.WriteLine("    c2<T>.bar3(byte, object)");

            // Read, Write Params
            y = x; x = 1;
            double d = 1.1;
            c1 c = new c1();
            this.bar4(y); c.foo(x);

            // Read Consts
            const string const1 = "hi";
            bool b = !false;
            if (b)
            {
                const byte const2 = 1;
                const c1 const3 = null;
                if (const3 != c)
                {
                    this.bar4(const1); c.foo(const2 != const2); c.a = const3;
                    return (float)d;
                }
                return (float)(1.1f + (float)1.1);
            }
            return (float)d + (float)1.1;
        }
    }

    public class c3<T, U> // Generics
    {
        public static void test()
        {
            string s = "c3<T>.test()";
            {
                Console.WriteLine(s);
                foo(); foo(1); foo("1"); foo(1.1); // Overload Resolution, Implicit Conversions
            }
            // Nested Scopes
            {
                sbyte sb1 = 0;
                if (s != "")
                {
                    while (sb1 == 0)
                    {
                        byte b = 0;
                        c2<string> a = new c2<string>();
                        a.bar1(b, sb1);
                        sb1 = 1;
                        if (sb1 == 1) break;
                        else continue;
                    }
                }
                while (sb1 != 0)
                {
                    byte b = 1;
                    c2<string> a = new c2<string>();
                    a.bar1(b, sb1);
                    sb1 = 0;
                    if (sb1 == 1) break;
                    else continue;
                }
            }
            // Nested Scopes
            {
                sbyte sb2 = 0;
                while (sb2 < 2)
                {
                    sb2 = 3;
                    while (sb2 > 0)
                    {
                        sb2 = 0;
                        byte b = 1;
                        c2<int> a = new c2<int>();
                        a.bar2(b, sb2);
                    }
                    sb2 = 3;
                }
                if (sb2 >= 3)
                {
                    byte b = 0;
                    c2<int> a = new c2<int>();
                    a.bar2(b, sb2);
                }
            }
            // Nested Scopes
            {
                sbyte sb3 = 0;
                while (!string.IsNullOrEmpty(s))
                {
                    byte b = 1;
                    s = null;
                    if (sb3 != -20)
                    {
                        c2<bool> a = new c2<bool>();
                        a.bar3(b, sb3);
                    }
                    if (s != null) break;
                }
                while (s == null)
                {
                    byte b = 0;
                    if (s != null)
                    {
                        b = 1; continue;
                    }
                    c2<bool> a = new c2<bool>();
                    a.bar3(b, sb3);
                    s = "";
                    return;
                }
            }
        }

        // Static Methods
        protected static int foo(T x, U y)
        {
            Console.WriteLine("    c3<T, U>.foo(T, U)");
            int[] a = new int[3] { 1, 2, 3 }; a[1] = a[2];
            return (int)((long)x.GetHashCode() + (long)(int)(long)y.GetHashCode());
        }

        internal static c1 foo(object x)
        {
            Console.WriteLine("    c3<T, U>.foo(object)");
            c1[] a = new c1[3] { null, new c1(), new c1(1) }; a[1] = a[2];
            x = "hi";
            return new c1((int)1.1f, (uint)1, new c1(x.GetHashCode()));
        }

        private static float foo(string x)
        {
            Console.WriteLine("    c3<T, U>.foo(string)");
            string[] a = new string[] { x, x, "", null }; a[1] = a[2]; a[2] = a[1];
            return (float)foo(x.GetHashCode());
        }

        public static int foo(int x)
        {
            Console.WriteLine("    c3<T, U>.foo(int)");
            int[] a = new int[] { x, x, 1, 0 }; a[1] = a[2]; a[2] = a[1];
            return (int)x.GetHashCode() + x;
        }

        public static string foo()
        {
            Console.WriteLine("    c3<T, U>.foo()");
            string[] a = new string[] { "", null }; a[0] = a[1]; a[1] = a[0];
            return (string)null;
        }

        // Instance Methods
        protected int bar(T x, U y)
        {
            Console.WriteLine("    c3<T, U>.bar(T, U)");
            int[] a = new int[3] { 1, 2, 3 }; a[1] = a[2];
            return (int)((long)1 + (long)(int)(long)2);
        }

        public c1 bar(object x)
        {
            Console.WriteLine("    c3<T, U>.bar(object)");
            c1[] a = new c1[3] { null, new c1(), new c1(1) }; a[1] = a[2];
            return new c1((int)1.1f, (uint)1, new c1(x.GetHashCode()));
        }

        public float bar(string x)
        {
            Console.WriteLine("    c3<T, U>.bar(string)");
            string[] a = new string[] { x, x, "", null }; a[1] = a[2]; a[2] = a[1];
            x = a[2];
            return (float)foo(x.GetHashCode());
        }

        public int bar(int x)
        {
            Console.WriteLine("    c3<T, U>.bar(int)");
            int[] a = new int[] { x, x, 1, 0 }; a[1] = a[2]; a[2] = a[1];
            return (int)x.GetHashCode() + x;
        }

        public string bar()
        {
            Console.WriteLine("    c3<T, U>.bar()");
            string[] a = new string[] { "", null }; a[0] = a[1]; a[1] = a[0];
            return (string)null;
        }
    }

    public class c4 : c2<string> // Inheritance
    {
        public static bool b = true;
        public static byte b1 = 0;
        public static sbyte sb = 1;

        private static short s = 4;
        private static ushort us = 5;
        private static long l = 6;
        private static ulong ul = 7;

        public static bool Test()
        {
            string str = "c4.Test()";
            {
                int i = 2;
                Console.WriteLine(str);
                {
                    c1 a = new c1(i); a.foo(i);
                }
                double d = 1.1;
                {
                    sbyte sb = 1;
                    c1 a = new c1(i + (i + i));
                    a.foo(sb);
                    {
                        a.foo(d);
                    }
                }

                // Nested Scopes
                {
                    object o = i;
                    bool b = false;
                    if (!b)
                    {
                        byte b1 = 1;
                        string s_ = "    This is a test";
                        while (!b)
                        {
                            if (true) b = true;
                            Console.WriteLine(s_);
                            while (b)
                            {
                                if (true) b = false;
                                object oo = i;
                                bool bb = b;
                                if (!bb)
                                {
                                    if (!false) bb = true;
                                    byte b11 = b1;
                                    string ss = s_;
                                    if (bb)
                                    {
                                        Console.WriteLine(ss);
                                        if (bb != b)
                                        {
                                            object ooo = i;
                                            bool bbb = bb;
                                            if (bbb == true)
                                            {
                                                byte b111 = b11;
                                                string sss = ss;
                                                while (bbb)
                                                {
                                                    Console.WriteLine(sss);
                                                    bbb = false;

                                                    // Method Calls - Ref, Paramarrays
                                                    // Overloaded Abstract Methods
                                                    long l = i;
                                                    c4 c = new c4();
                                                    c.abst(ref s_, 1, i);
                                                    c.abst(ref s_, new int[] { 1, i, i });
                                                    c.abst(ref s_, c.abst(ref s_, l, l), l, l, l);

                                                    // Method Calls - Ref, Paramarrays
                                                    // Overloaded Virtual Methods
                                                    c1 a = new c4();
                                                    c.virt(i, c, new c2<string>[] { c.virt(i, ref a), new c4() });
                                                    c.virt(c.virt(i, ref a), c.virt(ref i, c, c.virt(i, ref a)));
                                                    c.
                                                      virt(
                                                           c.
                                                             abst(ref s_,
                                                                 l,
                                                                 l),
                                                           c.
                                                             abst(ref s_,
                                                                  new long[] {1, 
                                                                              i, 
                                                                              l})
                                                           );
                                                    c.virt(i, ref a);
                                                    c.virt(ref i,
                                                           new c4(),
                                                           new c4(),
                                                           new c2<string>()
                                                           );
                                                    c.virt(new int[] { 1, 2, 3 });
                                                    c.virt(new Exception[] { });
                                                    c.virt(new c1[] { new c4(), new c2<string>() });
                                                    s = (short)us;
                                                    if (true) continue;
                                                }
                                            }
                                            else if (bbb != true)
                                            {
                                                Console.WriteLine("Error - Should not have reached here");
                                                o = i; o = us;
                                                return (bool)o;
                                            }
                                            else if (bbb == false)
                                            {
                                                Console.WriteLine("Error - Should not have reached here");
                                                o = i; o = l;
                                                return (bool)o;

                                            }
                                            else
                                            {
                                                Console.WriteLine("Error - Should not have reached here");
                                                o = b; o = ul;
                                                return (bool)o;
                                            }
                                        }
                                    }
                                    else if (!b)
                                    {
                                        Console.WriteLine("Error - Should not have reached here");
                                        object o1 = b;
                                        return (bool)o1;
                                    }
                                    else
                                    {
                                        Console.WriteLine("Error - Should not have reached here");
                                        object o1 = b;
                                        return (bool)o1;
                                    }
                                }
                                else if (!bb)
                                {
                                    Console.WriteLine("Error - Should not have reached here");
                                    o = b;
                                    return (bool)o;
                                }
                                else
                                {
                                    Console.WriteLine("Error - Should not have reached here");
                                    object o1 = b;
                                    return (bool)o1;
                                }
                                while (b != false)
                                {
                                    b = false; break;
                                }
                                break;
                            }
                            while (b != true)
                            {
                                b = true; continue;
                            }
                        }
                    }
                    else if (b)
                    {
                        Console.WriteLine("Error - Should not have reached here");
                        return b;
                    }
                    else
                    {
                        Console.WriteLine("Error - Should not have reached here");
                        return (bool)b != true;
                    }
                }
            }
            return false;
        }

        // Non-Overloaded Method
        public static c4 foo(int i, string s, bool b, byte b1, long l, string s1)
        {
            Console.WriteLine("    c4.foo(int, string, bool, byte, long, string)");
            return new c4();
        }

        // Non-Overloaded Method
        internal static c5 bar(short s, ushort us, sbyte sb, float f, double d, double d1, float f1)
        {
            Console.WriteLine("    c4.bar(short, ushort, sbyte, float, double, double, float)");
            return new c5();
        }

        public class c5 : c3<string, c1> // Nested Class, Inheritance
        {
            internal static float f = 8.0f;
            internal static double d = 9.0;
            internal static string s1 = "Test";
            internal static object o = null;

            public int Test()
            {
                int i = 1; string s = "1"; bool b = true;
                short sh = 1; ushort us = 1; object o = i;
                c5 cc = new c5();
                Console.WriteLine("c5.test");
                {
                    uint ui = 1; o = ui;
                    i = sh; b = false; us = 1;
                    // Nested Scopes
                    if (true)
                    {
                        byte b1 = 1; long l = i; string s1 = s;
                        float f = 1.2f; o = f; l = ui;
                        c4.foo(sh, s, b, b1, i, s1); // Implicit Conversions
                        c4 c = new c4();
                        c.foo(sh); this.bar(sh);
                        cc.bar(c5.foo(cc.bar()));
                        c5.foo(cc.bar(c5.foo()));
                        if (b == false)
                        {
                            double d = f; ulong ul = 1; sbyte sb = 1; s1 = s;
                            c4.bar(sh, us, sb, f, d, ui, ul); // Implicit Conversions
                            c.bar4(us);
                            this.bar(cc.bar(), c);
                            c5.foo(this.bar(c5.foo(), c));
                        }
                        if (b1 >= l)
                        {
                            uint ui1 = 1; o = ui1;
                            i = sh; b = false; us = 1;
                            while (i != 1000)
                            {
                                byte b11 = 1; long l1 = i; string s11 = s1;
                                float f1 = 1.2f; o = f1; l1 = ui1;
                                c4.foo(sh, s1, b, b11, i, s11); // Implicit Conversions
                                c.foo(b);
                                this.bar(b); if (c5.foo() != null) c5.foo().ToString().GetHashCode();
                                cc.bar(this.bar(c5.foo()));

                                if (!false)
                                {
                                    double d1 = f1; ulong ul1 = 1; sbyte sb1 = 1; s1 = s;
                                    c4.bar(sh, us, sb1, f1, d1, ui1, ul1); // Implicit Conversions
                                    c.foo(b1, sb1);
                                    this.bar(o).bar4(c);
                                    cc.bar(c5.foo(o)).bar4(c).ToString();
                                    d1 = d;
                                    if (d != d1) return i;
                                }
                                if (i != 1000)
                                {
                                    uint ui2 = 1; o = ui2;
                                    i = sh; b = false; us = 1;
                                    {
                                        byte b12 = 1; long l2 = i; string s12 = s11;
                                        float f2 = 1.2f; o = f1; l2 = ui1;
                                        c4.foo(sh, s1, b, b12, i, s12); // Implicit Conversions
                                        c.bar4(b.ToString() == b.ToString());
                                        this.bar(c5.foo(cc.bar(i)));
                                        {
                                            double d2 = f2; ulong ul2 = 1; sbyte sb2 = 1; s1 = s;
                                            c4.bar(sh, us, sb2, f2, d2, ui2, ul2); // Implicit Conversions
                                            c.foo(false == true != false == b);
                                            c.bar4(sh > us == sh <= us);
                                            this.bar((object)c5.foo((object)cc.bar((object)i)));
                                            if (i != i +
                                                1 -
                                                1)
                                                return i -
                                                (int)b12;
                                        }
                                        if (i <=
                                              1000) break;
                                    }
                                }
                                if (i <=
                                      1000)
                                    i = 1000;
                                return sh;
                            }
                        }
                    }
                }
                return (int)sh;
            }
        }
    }
}


namespace ns2
{
    public class Test
    {
        public static void Run()
        {
            c1 a = new c1(); a.test();

            c2<string> b = new c2<string>(); b.TEST();

            c3<string, string>.test();

            c4.Test();

            c4.c5 d = new c4.c5(); d.Test();
        }
    }

    // Abstract Class
    public abstract class c0
    {
        // Abstract Methods
        public abstract int abst(ref string x, params int[] y);

        public abstract int abst(ref string x, params long[] y);

        public abstract int abst(ref string x, long y, long z);
    }

    public class c1 : c0 // Inheritance
    {
        private int i = 2;
        internal uint ui = 3;
        public c1 a = null;

        // Overloaded Constructors
        public c1()
        {
            i = 2; this.ui = 3;
        }

        public c1(int x)
        {
            i = x; this.ui = 3; this.a = new c1(this.i, this.ui, this.a);
        }

        public c1(int x, uint y, c1 c)
        {
            this.i = x; ui = y; a = new c1();
        }

        public void test()
        {
            int i = 2;
            bool b = true;

            // Nested Scopes
            if (b)
            {
                object o = i;
                b = false;
                {
                    byte b1 = 1;
                    string s = "c1.test()";
                    {
                        Console.WriteLine(s);
                        this.foo(o); foo(i); this.foo(b); this.foo(b1); // Overload Resolution, Implicit Conversions
                    }
                }
            }
            // Nested Scopes
            if (!b)
            {
                object o = i;
                b = false;
                if (true)
                {
                    byte b1 = 1;
                    string s = "c1.test()";
                    {
                        Console.WriteLine(s);
                        bar2(o); this.bar2(i); this.bar2(b1); bar1(s); // Non-Overloaded Methods, Implicit Conversions
                    }
                }
            }
            // Nested Scopes
            if (!false)
            {
                object o = i;
                b = false;
                {
                    byte b1 = 1;
                    string s = "c1.test()";
                    {
                        Console.WriteLine(s);
                        this.bar4(o); this.bar4(i); this.bar4(b1); this.bar3(b); // Non-Overloaded Methods, Implicit Conversions
                    }
                }
            }

            if (!false)
            {
                object o = i;
                b = false;
                {
                    string s = "c1.test()";
                    {
                        Console.WriteLine(s);

                        // Method Calls - Ref, Paramarrays
                        // Overloaded Abstract Methods
                        c1 c = new c1(); long l = 1;
                        this.abst(ref s, 1, i);
                        c.abst(ref s, new int[] { 1, i, i });
                        c.abst(ref s, this.abst(ref s, l, l), l, l, l);

                        // Method Calls - Ref, Paramarrays
                        // Overloaded Virtual Methods
                        c.virt(i, c, new c2<string>[] { virt(i, ref c), new c4() });
                        virt(this.virt(i, ref c), c.virt(ref i, c, virt(i, ref c)));
                        virt(c.abst(ref s, l, l), this.abst(ref s, new long[] { 1, i, l }));
                        c = new c4();
                        virt(i, ref c);
                        virt(ref i, new c4(), new c4(), new c2<string>());
                        virt(new int[] { 1, 2, 3 });
                        virt(new Exception[] { });
                        virt(new c1[] { new c4(), new c2<string>() });
                    }
                }
            }
        }

        // Overriden Abstract Methods
        public override int abst(ref string x, params int[] y)
        {
            Console.WriteLine("    c1.abst(ref string, params int[])");
            x = x.ToString(); y = new int[] { y[0] }; // Read, Write Ref + Paramarrays
            return 0;
        }

        public override int abst(ref string x, params long[] y)
        {
            Console.WriteLine("    c1.abst(ref string, params long[])");
            x = y[0].ToString(); y = null; // Read, Write Ref + Paramarrays
            return 1;
        }

        public override int abst(ref string x, long y, long z)
        {
            Console.WriteLine("    c1.abst(ref string, long, long)");
            x = z.ToString(); // Read, Write Ref
            return 2;
        }

        // Virtual Methods
        public virtual int virt(ref int x, c1 y, params c2<string>[] z)
        {
            Console.WriteLine("    c1.virt(ref int, c1, params c2<string>[])");
            x = x + x * 2; z = null; // Read, Write Ref + Paramarrays
            return 0;
        }

        public virtual c2<string> virt(int x, ref c1 y)
        {
            Console.WriteLine("    c1.virt(int, ref c1)");
            y = new c1(); // Read, Write Ref
            return new c4();
        }

        public virtual int virt(params object[] x)
        {
            Console.WriteLine("    c1.virt(params object[])");
            x = new object[] { 1, 2, null }; // Read, Write Paramarrays
            return new int();
        }

        public virtual int virt(params int[] x)
        {
            Console.WriteLine("    c1.virt(params int[])");
            x = new int[] { 0, 1 }; // Read, Write Paramarrays
            int i = x[0];
            return new int();
        }

        internal int foo(int x)
        {
            Console.WriteLine("    c1.foo(int)");

            // Read, Write Fields
            this.ui = 0u + this.ui;
            i = i - 1 * 2 + 3 / 1;
            this.i = 1;
            this.a = null; a = new c1(x);

            // Read, Write Locals
            bool b = true; string s = null;
            s = string.Empty;
            b = this.i != 1 + (2 - 3);
            s = "";
            c1 c = new c1(i, ui, new c1(this.i, this.ui, new c1(i)));
            c = this.a;
            b = b == true; s = s.ToString();

            // Read, Write Params
            x = (i - this.i) * i + (x / i);
            x = x.GetHashCode(); this.i = x;

            // Read, Write Array Element
            int[] a1 = new int[] { 1, 2, 3 };
            a1[1] = i; a1[2] = x;
            a1[1] = 1; a1[2] = 2;
            int i1 = a1[1] - a1[2];
            i1 = (a1[1] - (a1[2] + a1[1]));
            object o = i1;
            o = a1[2] + (a1[1] - a1[2]);

            return x;
        }

        public bool foo(object x)
        {
            Console.WriteLine("    c1.foo(object)");

            // Read, Write Fields
            ui = 0u;
            this.i = this.i - 1;
            a = null;
            uint ui1 = ui; int i1 = i;

            // Read, Write Locals
            bool b = true; string s = string.Empty;
            s = null; b = this.i != 1;
            ui = ui1; i = i1;
            bar4(b); this.foo(i1); bar4(b == (true != b));

            // Read, Write Params
            x = null; x = new c1(this.i, this.ui, a);
            this.bar4(x); this.bar4(x.GetHashCode() != (x.GetHashCode()));

            // Read, Write Array Element
            object[] a1 = new c1[3] { null, null, null };
            this.i = 1;
            a1[1] = null; a1[2] = new c1((i * i) / i, ui + (ui - ui), null);
            object o = null;
            o = a1[1]; this.bar4(a1[2]);

            if (b)
            {
                return b.GetHashCode() == this.i;
            }
            else
            {
                return b;
            }
        }

        private void bar1(string x)
        {
            Console.WriteLine("    c1.bar1(string)");

            // Read, Write Fields
            this.ui = 0u - 0u;
            i = this.i * 1;
            this.a = new c1();
            this.foo(i.GetHashCode()); this.a = this;

            // Read, Write Locals
            c1 c = new c1(1, 0u, (null));
            c = null; i = 1;
            c = new c1(i / i);
            c = this.a;
            this.ui = 1;
            c.ui = this.ui / ui;
            c.i = this.i + this.i;
            c.a = c;
            c.a = c = this.a = c.a = null;
            c = new c1(i.GetHashCode());
            this.foo(c.i); bar3(c != null);

            if (this.i == 10321)
            {
                return;
            }
            else
            {
            }

            // Read, Write Params
            x = null; this.bar4(x);

            // Read, Write Array Element
            string[] a1 = new string[] { "", null, null };
            a1[1] = null; a1[2] = "";
            string s = null;
            s = a1[1]; foo(a1[2]);
        }

        protected string bar2(object x)
        {
            Console.WriteLine("    c1.bar2(object)");

            // Read, Write Fields
            this.ui = ui - this.ui;
            i = i / 1;
            a = null;
            foo(i);

            // Read, Write Locals
            c1 c;
            object o;
            c = null; c = new c1(i / 2, ui * (2u), new c1(i / 2, ui * (2u), c));
            this.a = new c1(((1 + i) - 1));
            c = this.a;
            o = c;
            c.ui = this.ui;
            c.i = this.i * this.i;
            c.a = c; this.a = c.a;
            c.a = c = this.a = c.a = new c1(i, ui, new c1()); o = c.a = c;
            bar4(o.ToString()); this.bar4(c.a.a);

            // Read, Write Params
            x = c; x = o;
            o = x;

            // Read, Write Array Element
            object[] a1 = new c1[] { null, this.a, c };
            a1[1] = null; a1[2] = c;
            o = a1[1]; bar3(a1[2] != a1[1]);

            if (o == null)
            {
                return null;
            }
            else
            {
                return string.Empty;
            }
        }

        internal object bar3(bool x)
        {
            Console.WriteLine("    c1.bar3(bool)");

            // Read, Write Fields
            ui = ui - this.ui;
            i = i + 1;
            this.a = new c1(i, ui, a);

            // Read, Write Locals
            bool b = x;
            b = this.i > this.i + 1;

            // Read, Write Params
            x = (this.i == i + 1);
            foo(x.GetHashCode());

            // Read, Write Array Element
            bool[] a1 = new bool[] { true, false, x };
            a1[1] = x == (this.i != i - 1 + 1); a1[2] = x == (i >= this.i + 1 - 1);
            b = (a1[1]); b = a1[2];
            object o = b != a1[2];
            o = (a1[1].ToString()) == (a1[2].ToString());
            foo(a1[1].GetHashCode());

            if (b)
            {
                return this.i;
            }
            else
            {
                return a1[1];
            }
        }

        public c1 bar4(object x)
        {
            Console.WriteLine("    c1.bar4(object)");

            // Read, Write Fields
            ui = 0;
            this.ui = this.ui - (this.ui + this.ui) * this.ui;
            this.i = (i + 1) - (1 * (i / 1));
            this.a = (null);
            foo(this.i.GetHashCode());

            // Read, Write Locals
            object o = null;
            bool b = true;
            b = this.i <= this.i + 1 - 1;
            o = x;
            c1 c = new c1(i, this.ui, a);
            c.ui = (this.ui) + (this.ui) + c.ui;
            o = x = c;
            c.i = 1;
            c.i = this.i * (this.i / c.i + c.i);
            c.a = c = this.a = c.a = new c1(); c.a = c;
            foo(c.GetHashCode()); bar3(c.a.GetHashCode() != i);

            // Read, Write Params
            x = (o.ToString());
            x = x.ToString(); foo(x.GetHashCode()); foo(x.ToString().GetHashCode());

            // Read, Write Array Element
            object[] a1 = new object[] { (null), (this.a), c };
            a1[1] = ((this.a)); a1[2] = (c); a1[1] = (i);
            Array.Reverse(a1);
            o = a1[1]; foo(a1.GetHashCode()); bar3(a1[2] == null);

            if (b)
            {
                return this;
            }
            else if (!b)
            {
                return this.a;
            }
            else if (!b)
            {
                return new c1(i, ui, new c1(i + 1, ui - 1u, new c1(i + 2)));
            }
            else
            {
                return (c1)a1[2];
            }
        }
    }

    public class c2<T> : c1 // Inheritance, Generics
    {
        protected c1 c = new c1(0, 0, new c1(1, 1, new c1(2)));

        public void TEST()
        {
            // Nested Scopes
            byte b = 0;
            if (true)
            {
                sbyte sb = 0;
                if (!false)
                {
                    string s = "c2<T>.test()";
                    if (b == 0)
                    {
                        Console.WriteLine(s);
                        this.foo(x: b, y: sb); // Named Arguments
                    }
                }
                if (sb != 1)
                {
                    this.bar1(x: b, y: sb); // Named Arguments
                }
            }
            {
                sbyte sb2 = 0;
                if (b != 1)
                {
                    string s2 = "c2<T>.test()";
                    if (sb2 == 0)
                    {
                        Console.WriteLine(s2);
                        foo(x: b, y: sb2); // Named Arguments
                    }
                }
                if (b == sb2)
                {
                    bar2(x: b, y: sb2); // Named Arguments
                }
            }
            {
                c2<string> c = new c4();
                if (!(!true))
                {
                    // Method Calls - Ref, Paramarrays
                    // Overloaded Abstract Methods
                    int i = 1; long l = i; string s = "";
                    this.abst(ref s, 1, i);
                    c.abst(ref s, new int[] { 1, i, i });
                    c.abst(ref s, this.abst(ref s, l, l), l, l, l);

                    // Method Calls - Ref, Params
                    // Overloaded Virtual Methods
                    c1 a = c;
                    c.virt(i, c, new c2<string>[] { virt(i, ref a), new c4() });
                    virt(this.virt(i, ref a), c.virt(ref i, y: c, z: virt(i, ref a)));
                    virt(c.abst(ref s, l, l), this.abst(y: new long[] { 1, i, l }, x: ref s));
                    c = new c4();
                    virt(y: ref a, x: i);
                    virt(ref i, new c4(), new c4(), new c2<string>());
                    virt(new int[] { 1, 2, 3 });
                    virt(new Exception[] { });
                    virt(new c1[] { new c4(), new c2<string>() });
                }
            }
        }

        // Overriden Abstract Methods
        public override int abst(ref string x, params int[] y)
        {
            Console.WriteLine("    c2<T>.abst(ref string, params int[])");
            x = y[0].ToString(); y = null; // Read, Write Ref + Paramarrays
            return 0;
        }

        public override int abst(ref string x, params long[] y)
        {
            Console.WriteLine("    c2<T>.abst(ref string, params long[])");
            x = y[0].ToString(); y = null; // Read, Write Ref + Paramarrays
            return 1;
        }

        // Overriden Virtual Methods
        public override int virt(ref int x, c1 y, params c2<string>[] z)
        {
            Console.WriteLine("    c2<T>.virt(ref int, c1, params c2<string>[])");
            x = 0; x = y.GetHashCode(); z = null; // Read, Write Ref + Paramarrays
            return 0;
        }

        public override c2<string> virt(int x, ref c1 y)
        {
            Console.WriteLine("    c2<T>.virt(int, ref c1)");
            x.ToString(); y = new c1(x, (uint)x, y); // Read, Write Ref
            return new c2<string>();
        }

        public override int virt(params object[] x)
        {
            Console.WriteLine("    c2<T>.virt(params object[])");
            x.ToString(); x = null; // Read, Write Paramarrays
            return new int();
        }

        private void bar(T x)
        {
            Console.WriteLine("    c2<T>.bar(T)");

            // Read, Write Params
            T y = x;
            x = y;

            // Read Consts
            const string const1 = "";
            if (!false)
            {
                const int const2 = 1;
                const c1 const3 = null;
                if (true)
                {
                    this.bar4(const1); c.foo(const2 != const2); this.a = const3;
                }
            }
        }

        private T foo1(T x)
        {
            Console.WriteLine("    c2<T>.foo1(T)");

            int aa = 1;

            // Read, Write Params
            T y = x;
            x = y; bar(x);

            // Read Consts
            const long const1 = 1;
            const uint const2 = 1;
            while (const1 < const2 - aa)
            {
                continue;
            }

            while (const2 == const1 - aa + aa)
            {
                this.bar4(const1); c.foo(const2 != const2);
                return x;
            }
            return x;
        }

        private bool foo(bool x)
        {
            Console.WriteLine("    c2<T>.foo(bool)");

            int aa = 1;

            // Read, Write Params
            x = x.ToString() == x.ToString(); a = c; a = this;

            // Read Consts
            const long const1 = 1;
            const uint const2 = 1;
            while (const1 < const1 - aa)
            {
                continue;
            }

            while (const2 == const2 - aa + aa)
            {
                return x;
            }
            return x;
        }

        protected c1 foo(byte x, object y)
        {
            Console.WriteLine("    c2<T>.foo(byte, object)");

            // Read, Write Params
            y = x; x = 1;
            c1 c = new c1();
            c.bar4(y); c.foo(x);

            // Read Consts
            const string const1 = "";
            bool b = false;
            if (!b)
            {
                const int const2 = 1;
                object o = y;
                while (y == o)
                {
                    const c1 const3 = null;
                    byte bb = 1;
                    if (bb == x)
                    {
                        this.bar4(const1); this.foo(const2 != const2); this.a = const3;
                        break;
                    }
                    else
                    {
                        return const3;
                    }
                }
                return c;
            }
            return null;
        }

        internal void bar1(byte x, object y)
        {
            Console.WriteLine("    c2<T>.bar1(byte, object)");

            // Read, Write Params
            y = x; x = 1;
            c1 c = new c1();
            c.bar4(y); c.foo(x);

            // Read Consts
            const long const1 = 1;
            const uint const2 = 1;
            while (const1 != x) continue;

            while (const2 == const2)
            {
                this.bar4(const1); this.foo(const2 != const2);
                break;
            }
        }

        public int bar2(byte x, object y)
        {
            Console.WriteLine("    c2<T>.bar2(byte, object)");

            // Read, Write Params
            y = x; x = 1;
            c1 c = new c1();
            c.bar4(y); this.foo(x);

            // Read Consts
            const long const1 = 1;
            if (!false)
            {
                const sbyte const2 = 1;
                const c1 const3 = null;
                if (c != const3)
                {
                    c.bar4(const1); this.foo(const2 != const2); this.a = const3;
                }
            }
            return (int)const1;
        }

        internal float bar3(byte x, object y)
        {
            Console.WriteLine("    c2<T>.bar3(byte, object)");

            // Read, Write Params
            y = x; x = 1;
            double d = 1.1;
            c1 c = new c1();
            this.bar4(y); c.foo(x);

            // Read Consts
            const string const1 = "hi";
            bool b = !false;
            if (b)
            {
                const byte const2 = 1;
                const c1 const3 = null;
                if (const3 != c)
                {
                    this.bar4(const1); c.foo(const2 != const2); c.a = const3;
                    return (float)d;
                }
                return (float)(1.1f + (float)1.1);
            }
            return (float)d + (float)1.1;
        }
    }

    public class c3<T, U> // Generics
    {
        public static void test()
        {
            string s = "c3<T>.test()";
            {
                Console.WriteLine(s);
                foo(); foo(1); foo("1"); foo(1.1); // Overload Resolution, Implicit Conversions
            }
            // Nested Scopes
            {
                sbyte sb1 = 0;
                if (s != "")
                {
                    while (sb1 == 0)
                    {
                        byte b = 0;
                        c2<string> a = new c2<string>();
                        a.bar1(b, sb1);
                        sb1 = 1;
                        if (sb1 == 1) break;
                        else continue;
                    }
                }
                while (sb1 != 0)
                {
                    byte b = 1;
                    c2<string> a = new c2<string>();
                    a.bar1(b, sb1);
                    sb1 = 0;
                    if (sb1 == 1) break;
                    else continue;
                }
            }
            // Nested Scopes
            {
                sbyte sb2 = 0;
                while (sb2 < 2)
                {
                    sb2 = 3;
                    while (sb2 > 0)
                    {
                        sb2 = 0;
                        byte b = 1;
                        c2<int> a = new c2<int>();
                        a.bar2(b, sb2);
                    }
                    sb2 = 3;
                }
                if (sb2 >= 3)
                {
                    byte b = 0;
                    c2<int> a = new c2<int>();
                    a.bar2(b, sb2);
                }
            }
            // Nested Scopes
            {
                sbyte sb3 = 0;
                while (!string.IsNullOrEmpty(s))
                {
                    byte b = 1;
                    s = null;
                    if (sb3 != -20)
                    {
                        c2<bool> a = new c2<bool>();
                        a.bar3(b, sb3);
                    }
                    if (s != null) break;
                }
                while (s == null)
                {
                    byte b = 0;
                    if (s != null)
                    {
                        b = 1; continue;
                    }
                    c2<bool> a = new c2<bool>();
                    a.bar3(b, sb3);
                    s = "";
                    return;
                }
            }
        }

        // Static Methods
        protected static int foo(T x, U y)
        {
            Console.WriteLine("    c3<T, U>.foo(T, U)");
            int[] a = new int[3] { 1, 2, 3 }; a[1] = a[2];
            return (int)((long)x.GetHashCode() + (long)(int)(long)y.GetHashCode());
        }

        internal static c1 foo(object x)
        {
            Console.WriteLine("    c3<T, U>.foo(object)");
            c1[] a = new c1[3] { null, new c1(), new c1(1) }; a[1] = a[2];
            x = "hi";
            return new c1((int)1.1f, (uint)1, new c1(x.GetHashCode()));
        }

        private static float foo(string x)
        {
            Console.WriteLine("    c3<T, U>.foo(string)");
            string[] a = new string[] { x, x, "", null }; a[1] = a[2]; a[2] = a[1];
            return (float)foo(x.GetHashCode());
        }

        public static int foo(int x)
        {
            Console.WriteLine("    c3<T, U>.foo(int)");
            int[] a = new int[] { x, x, 1, 0 }; a[1] = a[2]; a[2] = a[1];
            return (int)x.GetHashCode() + x;
        }

        public static string foo()
        {
            Console.WriteLine("    c3<T, U>.foo()");
            string[] a = new string[] { "", null }; a[0] = a[1]; a[1] = a[0];
            return (string)null;
        }

        // Instance Methods
        protected int bar(T x, U y)
        {
            Console.WriteLine("    c3<T, U>.bar(T, U)");
            int[] a = new int[3] { 1, 2, 3 }; a[1] = a[2];
            return (int)((long)1 + (long)(int)(long)2);
        }

        public c1 bar(object x)
        {
            Console.WriteLine("    c3<T, U>.bar(object)");
            c1[] a = new c1[3] { null, new c1(), new c1(1) }; a[1] = a[2];
            return new c1((int)1.1f, (uint)1, new c1(x.GetHashCode()));
        }

        public float bar(string x)
        {
            Console.WriteLine("    c3<T, U>.bar(string)");
            string[] a = new string[] { x, x, "", null }; a[1] = a[2]; a[2] = a[1];
            x = a[2];
            return (float)foo(x.GetHashCode());
        }

        public int bar(int x)
        {
            Console.WriteLine("    c3<T, U>.bar(int)");
            int[] a = new int[] { x, x, 1, 0 }; a[1] = a[2]; a[2] = a[1];
            return (int)x.GetHashCode() + x;
        }

        public string bar()
        {
            Console.WriteLine("    c3<T, U>.bar()");
            string[] a = new string[] { "", null }; a[0] = a[1]; a[1] = a[0];
            return (string)null;
        }
    }

    public class c4 : c2<string> // Inheritance
    {
        public static bool b = true;
        public static byte b1 = 0;
        public static sbyte sb = 1;

        private static short s = 4;
        private static ushort us = 5;
        private static long l = 6;
        private static ulong ul = 7;

        public static bool Test()
        {
            string str = "c4.Test()";
            {
                int i = 2;
                Console.WriteLine(str);
                {
                    c1 a = new c1(i); a.foo(i);
                }
                double d = 1.1;
                {
                    sbyte sb = 1;
                    c1 a = new c1(i + (i + i));
                    a.foo(sb);
                    {
                        a.foo(d);
                    }
                }

                // Nested Scopes
                {
                    object o = i;
                    bool b = false;
                    if (!b)
                    {
                        byte b1 = 1;
                        string s_ = "    This is a test";
                        while (!b)
                        {
                            if (true) b = true;
                            Console.WriteLine(s_);
                            while (b)
                            {
                                if (true) b = false;
                                object oo = i;
                                bool bb = b;
                                if (!bb)
                                {
                                    if (!false) bb = true;
                                    byte b11 = b1;
                                    string ss = s_;
                                    if (bb)
                                    {
                                        Console.WriteLine(ss);
                                        if (bb != b)
                                        {
                                            object ooo = i;
                                            bool bbb = bb;
                                            if (bbb == true)
                                            {
                                                byte b111 = b11;
                                                string sss = ss;
                                                while (bbb)
                                                {
                                                    Console.WriteLine(sss);
                                                    bbb = false;

                                                    // Method Calls - Ref, Paramarrays
                                                    // Overloaded Abstract Methods
                                                    long l = i;
                                                    c4 c = new c4();
                                                    c.abst(ref s_, 1, i);
                                                    c.abst(ref s_, new int[] { 1, i, i });
                                                    c.abst(ref s_, c.abst(ref s_, l, l), l, l, l);

                                                    // Method Calls - Ref, Paramarrays
                                                    // Overloaded Virtual Methods
                                                    c1 a = new c4();
                                                    c.virt(i, c, new c2<string>[] { c.virt(i, ref a), new c4() });
                                                    c.virt(c.virt(i, ref a), c.virt(ref i, c, c.virt(i, ref a)));
                                                    c.
                                                      virt(
                                                           c.
                                                             abst(ref s_,
                                                                 l,
                                                                 l),
                                                           c.
                                                             abst(ref s_,
                                                                  new long[] {1, 
                                                                              i, 
                                                                              l})
                                                           );
                                                    c.virt(i, ref a);
                                                    c.virt(ref i,
                                                           new c4(),
                                                           new c4(),
                                                           new c2<string>()
                                                           );
                                                    c.virt(new int[] { 1, 2, 3 });
                                                    c.virt(new Exception[] { });
                                                    c.virt(new c1[] { new c4(), new c2<string>() });
                                                    s = (short)us;
                                                    if (true) continue;
                                                }
                                            }
                                            else if (bbb != true)
                                            {
                                                Console.WriteLine("Error - Should not have reached here");
                                                o = i; o = us;
                                                return (bool)o;
                                            }
                                            else if (bbb == false)
                                            {
                                                Console.WriteLine("Error - Should not have reached here");
                                                o = i; o = l;
                                                return (bool)o;

                                            }
                                            else
                                            {
                                                Console.WriteLine("Error - Should not have reached here");
                                                o = b; o = ul;
                                                return (bool)o;
                                            }
                                        }
                                    }
                                    else if (!b)
                                    {
                                        Console.WriteLine("Error - Should not have reached here");
                                        object o1 = b;
                                        return (bool)o1;
                                    }
                                    else
                                    {
                                        Console.WriteLine("Error - Should not have reached here");
                                        object o1 = b;
                                        return (bool)o1;
                                    }
                                }
                                else if (!bb)
                                {
                                    Console.WriteLine("Error - Should not have reached here");
                                    o = b;
                                    return (bool)o;
                                }
                                else
                                {
                                    Console.WriteLine("Error - Should not have reached here");
                                    object o1 = b;
                                    return (bool)o1;
                                }
                                while (b != false)
                                {
                                    b = false; break;
                                }
                                break;
                            }
                            while (b != true)
                            {
                                b = true; continue;
                            }
                        }
                    }
                    else if (b)
                    {
                        Console.WriteLine("Error - Should not have reached here");
                        return b;
                    }
                    else
                    {
                        Console.WriteLine("Error - Should not have reached here");
                        return (bool)b != true;
                    }
                }
            }
            return false;
        }

        // Non-Overloaded Method
        public static c4 foo(int i, string s, bool b, byte b1, long l, string s1)
        {
            Console.WriteLine("    c4.foo(int, string, bool, byte, long, string)");
            return new c4();
        }

        // Non-Overloaded Method
        internal static c5 bar(short s, ushort us, sbyte sb, float f, double d, double d1, float f1)
        {
            Console.WriteLine("    c4.bar(short, ushort, sbyte, float, double, double, float)");
            return new c5();
        }

        public class c5 : c3<string, c1> // Nested Class, Inheritance
        {
            internal static float f = 8.0f;
            internal static double d = 9.0;
            internal static string s1 = "Test";
            internal static object o = null;

            public int Test()
            {
                int i = 1; string s = "1"; bool b = true;
                short sh = 1; ushort us = 1; object o = i;
                c5 cc = new c5();
                Console.WriteLine("c5.test");
                {
                    uint ui = 1; o = ui;
                    i = sh; b = false; us = 1;
                    // Nested Scopes
                    if (true)
                    {
                        byte b1 = 1; long l = i; string s1 = s;
                        float f = 1.2f; o = f; l = ui;
                        c4.foo(sh, s, b, b1, i, s1); // Implicit Conversions
                        c4 c = new c4();
                        c.foo(sh); this.bar(sh);
                        cc.bar(c5.foo(cc.bar()));
                        c5.foo(cc.bar(c5.foo()));
                        if (b == false)
                        {
                            double d = f; ulong ul = 1; sbyte sb = 1; s1 = s;
                            c4.bar(sh, us, sb, f, d, ui, ul); // Implicit Conversions
                            c.bar4(us);
                            this.bar(cc.bar(), c);
                            c5.foo(this.bar(c5.foo(), c));
                        }
                        if (b1 >= l)
                        {
                            uint ui1 = 1; o = ui1;
                            i = sh; b = false; us = 1;
                            while (i != 1000)
                            {
                                byte b11 = 1; long l1 = i; string s11 = s1;
                                float f1 = 1.2f; o = f1; l1 = ui1;
                                c4.foo(sh, s1, b, b11, i, s11); // Implicit Conversions
                                c.foo(b);
                                this.bar(b); if (c5.foo() != null) c5.foo().ToString().GetHashCode();
                                cc.bar(this.bar(c5.foo()));

                                if (!false)
                                {
                                    double d1 = f1; ulong ul1 = 1; sbyte sb1 = 1; s1 = s;
                                    c4.bar(sh, us, sb1, f1, d1, ui1, ul1); // Implicit Conversions
                                    c.foo(b1, sb1);
                                    this.bar(o).bar4(c);
                                    cc.bar(c5.foo(o)).bar4(c).ToString();
                                    d1 = d;
                                    if (d != d1) return i;
                                }
                                if (i != 1000)
                                {
                                    uint ui2 = 1; o = ui2;
                                    i = sh; b = false; us = 1;
                                    {
                                        byte b12 = 1; long l2 = i; string s12 = s11;
                                        float f2 = 1.2f; o = f1; l2 = ui1;
                                        c4.foo(sh, s1, b, b12, i, s12); // Implicit Conversions
                                        c.bar4(b.ToString() == b.ToString());
                                        this.bar(c5.foo(cc.bar(i)));
                                        {
                                            double d2 = f2; ulong ul2 = 1; sbyte sb2 = 1; s1 = s;
                                            c4.bar(sh, us, sb2, f2, d2, ui2, ul2); // Implicit Conversions
                                            c.foo(false == true != false == b);
                                            c.bar4(sh > us == sh <= us);
                                            this.bar((object)c5.foo((object)cc.bar((object)i)));
                                            if (i != i +
                                                1 -
                                                1)
                                                return i -
                                                (int)b12;
                                        }
                                        if (i <=
                                              1000) break;
                                    }
                                }
                                if (i <=
                                      1000)
                                    i = 1000;
                                return sh;
                            }
                        }
                    }
                }
                return (int)sh;
            }
        }
    }
}


namespace ns3
{
    public class Test
    {
        public static void Run()
        {
            c1 a = new c1(); a.test();

            c2<string> b = new c2<string>(); b.TEST();

            c3<string, string>.test();

            c4.Test();

            c4.c5 d = new c4.c5(); d.Test();
        }
    }

    // Abstract Class
    public abstract class c0
    {
        // Abstract Methods
        public abstract int abst(ref string x, params int[] y);

        public abstract int abst(ref string x, params long[] y);

        public abstract int abst(ref string x, long y, long z);
    }

    public class c1 : c0 // Inheritance
    {
        private int i = 2;
        internal uint ui = 3;
        public c1 a = null;

        // Overloaded Constructors
        public c1()
        {
            i = 2; this.ui = 3;
        }

        public c1(int x)
        {
            i = x; this.ui = 3; this.a = new c1(this.i, this.ui, this.a);
        }

        public c1(int x, uint y, c1 c)
        {
            this.i = x; ui = y; a = new c1();
        }

        public void test()
        {
            int i = 2;
            bool b = true;

            // Nested Scopes
            if (b)
            {
                object o = i;
                b = false;
                {
                    byte b1 = 1;
                    string s = "c1.test()";
                    {
                        Console.WriteLine(s);
                        this.foo(o); foo(i); this.foo(b); this.foo(b1); // Overload Resolution, Implicit Conversions
                    }
                }
            }
            // Nested Scopes
            if (!b)
            {
                object o = i;
                b = false;
                if (true)
                {
                    byte b1 = 1;
                    string s = "c1.test()";
                    {
                        Console.WriteLine(s);
                        bar2(o); this.bar2(i); this.bar2(b1); bar1(s); // Non-Overloaded Methods, Implicit Conversions
                    }
                }
            }
            // Nested Scopes
            if (!false)
            {
                object o = i;
                b = false;
                {
                    byte b1 = 1;
                    string s = "c1.test()";
                    {
                        Console.WriteLine(s);
                        this.bar4(o); this.bar4(i); this.bar4(b1); this.bar3(b); // Non-Overloaded Methods, Implicit Conversions
                    }
                }
            }

            if (!false)
            {
                object o = i;
                b = false;
                {
                    string s = "c1.test()";
                    {
                        Console.WriteLine(s);

                        // Method Calls - Ref, Paramarrays
                        // Overloaded Abstract Methods
                        c1 c = new c1(); long l = 1;
                        this.abst(ref s, 1, i);
                        c.abst(ref s, new int[] { 1, i, i });
                        c.abst(ref s, this.abst(ref s, l, l), l, l, l);

                        // Method Calls - Ref, Paramarrays
                        // Overloaded Virtual Methods
                        c.virt(i, c, new c2<string>[] { virt(i, ref c), new c4() });
                        virt(this.virt(i, ref c), c.virt(ref i, c, virt(i, ref c)));
                        virt(c.abst(ref s, l, l), this.abst(ref s, new long[] { 1, i, l }));
                        c = new c4();
                        virt(i, ref c);
                        virt(ref i, new c4(), new c4(), new c2<string>());
                        virt(new int[] { 1, 2, 3 });
                        virt(new Exception[] { });
                        virt(new c1[] { new c4(), new c2<string>() });
                    }
                }
            }
        }

        // Overriden Abstract Methods
        public override int abst(ref string x, params int[] y)
        {
            Console.WriteLine("    c1.abst(ref string, params int[])");
            x = x.ToString(); y = new int[] { y[0] }; // Read, Write Ref + Paramarrays
            return 0;
        }

        public override int abst(ref string x, params long[] y)
        {
            Console.WriteLine("    c1.abst(ref string, params long[])");
            x = y[0].ToString(); y = null; // Read, Write Ref + Paramarrays
            return 1;
        }

        public override int abst(ref string x, long y, long z)
        {
            Console.WriteLine("    c1.abst(ref string, long, long)");
            x = z.ToString(); // Read, Write Ref
            return 2;
        }

        // Virtual Methods
        public virtual int virt(ref int x, c1 y, params c2<string>[] z)
        {
            Console.WriteLine("    c1.virt(ref int, c1, params c2<string>[])");
            x = x + x * 2; z = null; // Read, Write Ref + Paramarrays
            return 0;
        }

        public virtual c2<string> virt(int x, ref c1 y)
        {
            Console.WriteLine("    c1.virt(int, ref c1)");
            y = new c1(); // Read, Write Ref
            return new c4();
        }

        public virtual int virt(params object[] x)
        {
            Console.WriteLine("    c1.virt(params object[])");
            x = new object[] { 1, 2, null }; // Read, Write Paramarrays
            return new int();
        }

        public virtual int virt(params int[] x)
        {
            Console.WriteLine("    c1.virt(params int[])");
            x = new int[] { 0, 1 }; // Read, Write Paramarrays
            int i = x[0];
            return new int();
        }

        internal int foo(int x)
        {
            Console.WriteLine("    c1.foo(int)");

            // Read, Write Fields
            this.ui = 0u + this.ui;
            i = i - 1 * 2 + 3 / 1;
            this.i = 1;
            this.a = null; a = new c1(x);

            // Read, Write Locals
            bool b = true; string s = null;
            s = string.Empty;
            b = this.i != 1 + (2 - 3);
            s = "";
            c1 c = new c1(i, ui, new c1(this.i, this.ui, new c1(i)));
            c = this.a;
            b = b == true; s = s.ToString();

            // Read, Write Params
            x = (i - this.i) * i + (x / i);
            x = x.GetHashCode(); this.i = x;

            // Read, Write Array Element
            int[] a1 = new int[] { 1, 2, 3 };
            a1[1] = i; a1[2] = x;
            a1[1] = 1; a1[2] = 2;
            int i1 = a1[1] - a1[2];
            i1 = (a1[1] - (a1[2] + a1[1]));
            object o = i1;
            o = a1[2] + (a1[1] - a1[2]);

            return x;
        }

        public bool foo(object x)
        {
            Console.WriteLine("    c1.foo(object)");

            // Read, Write Fields
            ui = 0u;
            this.i = this.i - 1;
            a = null;
            uint ui1 = ui; int i1 = i;

            // Read, Write Locals
            bool b = true; string s = string.Empty;
            s = null; b = this.i != 1;
            ui = ui1; i = i1;
            bar4(b); this.foo(i1); bar4(b == (true != b));

            // Read, Write Params
            x = null; x = new c1(this.i, this.ui, a);
            this.bar4(x); this.bar4(x.GetHashCode() != (x.GetHashCode()));

            // Read, Write Array Element
            object[] a1 = new c1[3] { null, null, null };
            this.i = 1;
            a1[1] = null; a1[2] = new c1((i * i) / i, ui + (ui - ui), null);
            object o = null;
            o = a1[1]; this.bar4(a1[2]);

            if (b)
            {
                return b.GetHashCode() == this.i;
            }
            else
            {
                return b;
            }
        }

        private void bar1(string x)
        {
            Console.WriteLine("    c1.bar1(string)");

            // Read, Write Fields
            this.ui = 0u - 0u;
            i = this.i * 1;
            this.a = new c1();
            this.foo(i.GetHashCode()); this.a = this;

            // Read, Write Locals
            c1 c = new c1(1, 0u, (null));
            c = null; i = 1;
            c = new c1(i / i);
            c = this.a;
            this.ui = 1;
            c.ui = this.ui / ui;
            c.i = this.i + this.i;
            c.a = c;
            c.a = c = this.a = c.a = null;
            c = new c1(i.GetHashCode());
            this.foo(c.i); bar3(c != null);

            if (this.i == 10321)
            {
                return;
            }
            else
            {
            }

            // Read, Write Params
            x = null; this.bar4(x);

            // Read, Write Array Element
            string[] a1 = new string[] { "", null, null };
            a1[1] = null; a1[2] = "";
            string s = null;
            s = a1[1]; foo(a1[2]);
        }

        protected string bar2(object x)
        {
            Console.WriteLine("    c1.bar2(object)");

            // Read, Write Fields
            this.ui = ui - this.ui;
            i = i / 1;
            a = null;
            foo(i);

            // Read, Write Locals
            c1 c;
            object o;
            c = null; c = new c1(i / 2, ui * (2u), new c1(i / 2, ui * (2u), c));
            this.a = new c1(((1 + i) - 1));
            c = this.a;
            o = c;
            c.ui = this.ui;
            c.i = this.i * this.i;
            c.a = c; this.a = c.a;
            c.a = c = this.a = c.a = new c1(i, ui, new c1()); o = c.a = c;
            bar4(o.ToString()); this.bar4(c.a.a);

            // Read, Write Params
            x = c; x = o;
            o = x;

            // Read, Write Array Element
            object[] a1 = new c1[] { null, this.a, c };
            a1[1] = null; a1[2] = c;
            o = a1[1]; bar3(a1[2] != a1[1]);

            if (o == null)
            {
                return null;
            }
            else
            {
                return string.Empty;
            }
        }

        internal object bar3(bool x)
        {
            Console.WriteLine("    c1.bar3(bool)");

            // Read, Write Fields
            ui = ui - this.ui;
            i = i + 1;
            this.a = new c1(i, ui, a);

            // Read, Write Locals
            bool b = x;
            b = this.i > this.i + 1;

            // Read, Write Params
            x = (this.i == i + 1);
            foo(x.GetHashCode());

            // Read, Write Array Element
            bool[] a1 = new bool[] { true, false, x };
            a1[1] = x == (this.i != i - 1 + 1); a1[2] = x == (i >= this.i + 1 - 1);
            b = (a1[1]); b = a1[2];
            object o = b != a1[2];
            o = (a1[1].ToString()) == (a1[2].ToString());
            foo(a1[1].GetHashCode());

            if (b)
            {
                return this.i;
            }
            else
            {
                return a1[1];
            }
        }

        public c1 bar4(object x)
        {
            Console.WriteLine("    c1.bar4(object)");

            // Read, Write Fields
            ui = 0;
            this.ui = this.ui - (this.ui + this.ui) * this.ui;
            this.i = (i + 1) - (1 * (i / 1));
            this.a = (null);
            foo(this.i.GetHashCode());

            // Read, Write Locals
            object o = null;
            bool b = true;
            b = this.i <= this.i + 1 - 1;
            o = x;
            c1 c = new c1(i, this.ui, a);
            c.ui = (this.ui) + (this.ui) + c.ui;
            o = x = c;
            c.i = 1;
            c.i = this.i * (this.i / c.i + c.i);
            c.a = c = this.a = c.a = new c1(); c.a = c;
            foo(c.GetHashCode()); bar3(c.a.GetHashCode() != i);

            // Read, Write Params
            x = (o.ToString());
            x = x.ToString(); foo(x.GetHashCode()); foo(x.ToString().GetHashCode());

            // Read, Write Array Element
            object[] a1 = new object[] { (null), (this.a), c };
            a1[1] = ((this.a)); a1[2] = (c); a1[1] = (i);
            Array.Reverse(a1);
            o = a1[1]; foo(a1.GetHashCode()); bar3(a1[2] == null);

            if (b)
            {
                return this;
            }
            else if (!b)
            {
                return this.a;
            }
            else if (!b)
            {
                return new c1(i, ui, new c1(i + 1, ui - 1u, new c1(i + 2)));
            }
            else
            {
                return (c1)a1[2];
            }
        }
    }

    public class c2<T> : c1 // Inheritance, Generics
    {
        protected c1 c = new c1(0, 0, new c1(1, 1, new c1(2)));

        public void TEST()
        {
            // Nested Scopes
            byte b = 0;
            if (true)
            {
                sbyte sb = 0;
                if (!false)
                {
                    string s = "c2<T>.test()";
                    if (b == 0)
                    {
                        Console.WriteLine(s);
                        this.foo(x: b, y: sb); // Named Arguments
                    }
                }
                if (sb != 1)
                {
                    this.bar1(x: b, y: sb); // Named Arguments
                }
            }
            {
                sbyte sb2 = 0;
                if (b != 1)
                {
                    string s2 = "c2<T>.test()";
                    if (sb2 == 0)
                    {
                        Console.WriteLine(s2);
                        foo(x: b, y: sb2); // Named Arguments
                    }
                }
                if (b == sb2)
                {
                    bar2(x: b, y: sb2); // Named Arguments
                }
            }
            {
                c2<string> c = new c4();
                if (!(!true))
                {
                    // Method Calls - Ref, Paramarrays
                    // Overloaded Abstract Methods
                    int i = 1; long l = i; string s = "";
                    this.abst(ref s, 1, i);
                    c.abst(ref s, new int[] { 1, i, i });
                    c.abst(ref s, this.abst(ref s, l, l), l, l, l);

                    // Method Calls - Ref, Params
                    // Overloaded Virtual Methods
                    c1 a = c;
                    c.virt(i, c, new c2<string>[] { virt(i, ref a), new c4() });
                    virt(this.virt(i, ref a), c.virt(ref i, y: c, z: virt(i, ref a)));
                    virt(c.abst(ref s, l, l), this.abst(y: new long[] { 1, i, l }, x: ref s));
                    c = new c4();
                    virt(y: ref a, x: i);
                    virt(ref i, new c4(), new c4(), new c2<string>());
                    virt(new int[] { 1, 2, 3 });
                    virt(new Exception[] { });
                    virt(new c1[] { new c4(), new c2<string>() });
                }
            }
        }

        // Overriden Abstract Methods
        public override int abst(ref string x, params int[] y)
        {
            Console.WriteLine("    c2<T>.abst(ref string, params int[])");
            x = y[0].ToString(); y = null; // Read, Write Ref + Paramarrays
            return 0;
        }

        public override int abst(ref string x, params long[] y)
        {
            Console.WriteLine("    c2<T>.abst(ref string, params long[])");
            x = y[0].ToString(); y = null; // Read, Write Ref + Paramarrays
            return 1;
        }

        // Overriden Virtual Methods
        public override int virt(ref int x, c1 y, params c2<string>[] z)
        {
            Console.WriteLine("    c2<T>.virt(ref int, c1, params c2<string>[])");
            x = 0; x = y.GetHashCode(); z = null; // Read, Write Ref + Paramarrays
            return 0;
        }

        public override c2<string> virt(int x, ref c1 y)
        {
            Console.WriteLine("    c2<T>.virt(int, ref c1)");
            x.ToString(); y = new c1(x, (uint)x, y); // Read, Write Ref
            return new c2<string>();
        }

        public override int virt(params object[] x)
        {
            Console.WriteLine("    c2<T>.virt(params object[])");
            x.ToString(); x = null; // Read, Write Paramarrays
            return new int();
        }

        private void bar(T x)
        {
            Console.WriteLine("    c2<T>.bar(T)");

            // Read, Write Params
            T y = x;
            x = y;

            // Read Consts
            const string const1 = "";
            if (!false)
            {
                const int const2 = 1;
                const c1 const3 = null;
                if (true)
                {
                    this.bar4(const1); c.foo(const2 != const2); this.a = const3;
                }
            }
        }

        private T foo1(T x)
        {
            Console.WriteLine("    c2<T>.foo1(T)");

            int aa = 1;

            // Read, Write Params
            T y = x;
            x = y; bar(x);

            // Read Consts
            const long const1 = 1;
            const uint const2 = 1;
            while (const1 < const2 - aa)
            {
                continue;
            }

            while (const2 == const1 - aa + aa)
            {
                this.bar4(const1); c.foo(const2 != const2);
                return x;
            }
            return x;
        }

        private bool foo(bool x)
        {
            Console.WriteLine("    c2<T>.foo(bool)");

            int aa = 1;

            // Read, Write Params
            x = x.ToString() == x.ToString(); a = c; a = this;

            // Read Consts
            const long const1 = 1;
            const uint const2 = 1;
            while (const1 < const1 - aa)
            {
                continue;
            }

            while (const2 == const2 - aa + aa)
            {
                return x;
            }
            return x;
        }

        protected c1 foo(byte x, object y)
        {
            Console.WriteLine("    c2<T>.foo(byte, object)");

            // Read, Write Params
            y = x; x = 1;
            c1 c = new c1();
            c.bar4(y); c.foo(x);

            // Read Consts
            const string const1 = "";
            bool b = false;
            if (!b)
            {
                const int const2 = 1;
                object o = y;
                while (y == o)
                {
                    const c1 const3 = null;
                    byte bb = 1;
                    if (bb == x)
                    {
                        this.bar4(const1); this.foo(const2 != const2); this.a = const3;
                        break;
                    }
                    else
                    {
                        return const3;
                    }
                }
                return c;
            }
            return null;
        }

        internal void bar1(byte x, object y)
        {
            Console.WriteLine("    c2<T>.bar1(byte, object)");

            // Read, Write Params
            y = x; x = 1;
            c1 c = new c1();
            c.bar4(y); c.foo(x);

            // Read Consts
            const long const1 = 1;
            const uint const2 = 1;
            while (const1 != x) continue;

            while (const2 == const2)
            {
                this.bar4(const1); this.foo(const2 != const2);
                break;
            }
        }

        public int bar2(byte x, object y)
        {
            Console.WriteLine("    c2<T>.bar2(byte, object)");

            // Read, Write Params
            y = x; x = 1;
            c1 c = new c1();
            c.bar4(y); this.foo(x);

            // Read Consts
            const long const1 = 1;
            if (!false)
            {
                const sbyte const2 = 1;
                const c1 const3 = null;
                if (c != const3)
                {
                    c.bar4(const1); this.foo(const2 != const2); this.a = const3;
                }
            }
            return (int)const1;
        }

        internal float bar3(byte x, object y)
        {
            Console.WriteLine("    c2<T>.bar3(byte, object)");

            // Read, Write Params
            y = x; x = 1;
            double d = 1.1;
            c1 c = new c1();
            this.bar4(y); c.foo(x);

            // Read Consts
            const string const1 = "hi";
            bool b = !false;
            if (b)
            {
                const byte const2 = 1;
                const c1 const3 = null;
                if (const3 != c)
                {
                    this.bar4(const1); c.foo(const2 != const2); c.a = const3;
                    return (float)d;
                }
                return (float)(1.1f + (float)1.1);
            }
            return (float)d + (float)1.1;
        }
    }

    public class c3<T, U> // Generics
    {
        public static void test()
        {
            string s = "c3<T>.test()";
            {
                Console.WriteLine(s);
                foo(); foo(1); foo("1"); foo(1.1); // Overload Resolution, Implicit Conversions
            }
            // Nested Scopes
            {
                sbyte sb1 = 0;
                if (s != "")
                {
                    while (sb1 == 0)
                    {
                        byte b = 0;
                        c2<string> a = new c2<string>();
                        a.bar1(b, sb1);
                        sb1 = 1;
                        if (sb1 == 1) break;
                        else continue;
                    }
                }
                while (sb1 != 0)
                {
                    byte b = 1;
                    c2<string> a = new c2<string>();
                    a.bar1(b, sb1);
                    sb1 = 0;
                    if (sb1 == 1) break;
                    else continue;
                }
            }
            // Nested Scopes
            {
                sbyte sb2 = 0;
                while (sb2 < 2)
                {
                    sb2 = 3;
                    while (sb2 > 0)
                    {
                        sb2 = 0;
                        byte b = 1;
                        c2<int> a = new c2<int>();
                        a.bar2(b, sb2);
                    }
                    sb2 = 3;
                }
                if (sb2 >= 3)
                {
                    byte b = 0;
                    c2<int> a = new c2<int>();
                    a.bar2(b, sb2);
                }
            }
            // Nested Scopes
            {
                sbyte sb3 = 0;
                while (!string.IsNullOrEmpty(s))
                {
                    byte b = 1;
                    s = null;
                    if (sb3 != -20)
                    {
                        c2<bool> a = new c2<bool>();
                        a.bar3(b, sb3);
                    }
                    if (s != null) break;
                }
                while (s == null)
                {
                    byte b = 0;
                    if (s != null)
                    {
                        b = 1; continue;
                    }
                    c2<bool> a = new c2<bool>();
                    a.bar3(b, sb3);
                    s = "";
                    return;
                }
            }
        }

        // Static Methods
        protected static int foo(T x, U y)
        {
            Console.WriteLine("    c3<T, U>.foo(T, U)");
            int[] a = new int[3] { 1, 2, 3 }; a[1] = a[2];
            return (int)((long)x.GetHashCode() + (long)(int)(long)y.GetHashCode());
        }

        internal static c1 foo(object x)
        {
            Console.WriteLine("    c3<T, U>.foo(object)");
            c1[] a = new c1[3] { null, new c1(), new c1(1) }; a[1] = a[2];
            x = "hi";
            return new c1((int)1.1f, (uint)1, new c1(x.GetHashCode()));
        }

        private static float foo(string x)
        {
            Console.WriteLine("    c3<T, U>.foo(string)");
            string[] a = new string[] { x, x, "", null }; a[1] = a[2]; a[2] = a[1];
            return (float)foo(x.GetHashCode());
        }

        public static int foo(int x)
        {
            Console.WriteLine("    c3<T, U>.foo(int)");
            int[] a = new int[] { x, x, 1, 0 }; a[1] = a[2]; a[2] = a[1];
            return (int)x.GetHashCode() + x;
        }

        public static string foo()
        {
            Console.WriteLine("    c3<T, U>.foo()");
            string[] a = new string[] { "", null }; a[0] = a[1]; a[1] = a[0];
            return (string)null;
        }

        // Instance Methods
        protected int bar(T x, U y)
        {
            Console.WriteLine("    c3<T, U>.bar(T, U)");
            int[] a = new int[3] { 1, 2, 3 }; a[1] = a[2];
            return (int)((long)1 + (long)(int)(long)2);
        }

        public c1 bar(object x)
        {
            Console.WriteLine("    c3<T, U>.bar(object)");
            c1[] a = new c1[3] { null, new c1(), new c1(1) }; a[1] = a[2];
            return new c1((int)1.1f, (uint)1, new c1(x.GetHashCode()));
        }

        public float bar(string x)
        {
            Console.WriteLine("    c3<T, U>.bar(string)");
            string[] a = new string[] { x, x, "", null }; a[1] = a[2]; a[2] = a[1];
            x = a[2];
            return (float)foo(x.GetHashCode());
        }

        public int bar(int x)
        {
            Console.WriteLine("    c3<T, U>.bar(int)");
            int[] a = new int[] { x, x, 1, 0 }; a[1] = a[2]; a[2] = a[1];
            return (int)x.GetHashCode() + x;
        }

        public string bar()
        {
            Console.WriteLine("    c3<T, U>.bar()");
            string[] a = new string[] { "", null }; a[0] = a[1]; a[1] = a[0];
            return (string)null;
        }
    }

    public class c4 : c2<string> // Inheritance
    {
        public static bool b = true;
        public static byte b1 = 0;
        public static sbyte sb = 1;

        private static short s = 4;
        private static ushort us = 5;
        private static long l = 6;
        private static ulong ul = 7;

        public static bool Test()
        {
            string str = "c4.Test()";
            {
                int i = 2;
                Console.WriteLine(str);
                {
                    c1 a = new c1(i); a.foo(i);
                }
                double d = 1.1;
                {
                    sbyte sb = 1;
                    c1 a = new c1(i + (i + i));
                    a.foo(sb);
                    {
                        a.foo(d);
                    }
                }

                // Nested Scopes
                {
                    object o = i;
                    bool b = false;
                    if (!b)
                    {
                        byte b1 = 1;
                        string s_ = "    This is a test";
                        while (!b)
                        {
                            if (true) b = true;
                            Console.WriteLine(s_);
                            while (b)
                            {
                                if (true) b = false;
                                object oo = i;
                                bool bb = b;
                                if (!bb)
                                {
                                    if (!false) bb = true;
                                    byte b11 = b1;
                                    string ss = s_;
                                    if (bb)
                                    {
                                        Console.WriteLine(ss);
                                        if (bb != b)
                                        {
                                            object ooo = i;
                                            bool bbb = bb;
                                            if (bbb == true)
                                            {
                                                byte b111 = b11;
                                                string sss = ss;
                                                while (bbb)
                                                {
                                                    Console.WriteLine(sss);
                                                    bbb = false;

                                                    // Method Calls - Ref, Paramarrays
                                                    // Overloaded Abstract Methods
                                                    long l = i;
                                                    c4 c = new c4();
                                                    c.abst(ref s_, 1, i);
                                                    c.abst(ref s_, new int[] { 1, i, i });
                                                    c.abst(ref s_, c.abst(ref s_, l, l), l, l, l);

                                                    // Method Calls - Ref, Paramarrays
                                                    // Overloaded Virtual Methods
                                                    c1 a = new c4();
                                                    c.virt(i, c, new c2<string>[] { c.virt(i, ref a), new c4() });
                                                    c.virt(c.virt(i, ref a), c.virt(ref i, c, c.virt(i, ref a)));
                                                    c.
                                                      virt(
                                                           c.
                                                             abst(ref s_,
                                                                 l,
                                                                 l),
                                                           c.
                                                             abst(ref s_,
                                                                  new long[] {1, 
                                                                              i, 
                                                                              l})
                                                           );
                                                    c.virt(i, ref a);
                                                    c.virt(ref i,
                                                           new c4(),
                                                           new c4(),
                                                           new c2<string>()
                                                           );
                                                    c.virt(new int[] { 1, 2, 3 });
                                                    c.virt(new Exception[] { });
                                                    c.virt(new c1[] { new c4(), new c2<string>() });
                                                    s = (short)us;
                                                    if (true) continue;
                                                }
                                            }
                                            else if (bbb != true)
                                            {
                                                Console.WriteLine("Error - Should not have reached here");
                                                o = i; o = us;
                                                return (bool)o;
                                            }
                                            else if (bbb == false)
                                            {
                                                Console.WriteLine("Error - Should not have reached here");
                                                o = i; o = l;
                                                return (bool)o;

                                            }
                                            else
                                            {
                                                Console.WriteLine("Error - Should not have reached here");
                                                o = b; o = ul;
                                                return (bool)o;
                                            }
                                        }
                                    }
                                    else if (!b)
                                    {
                                        Console.WriteLine("Error - Should not have reached here");
                                        object o1 = b;
                                        return (bool)o1;
                                    }
                                    else
                                    {
                                        Console.WriteLine("Error - Should not have reached here");
                                        object o1 = b;
                                        return (bool)o1;
                                    }
                                }
                                else if (!bb)
                                {
                                    Console.WriteLine("Error - Should not have reached here");
                                    o = b;
                                    return (bool)o;
                                }
                                else
                                {
                                    Console.WriteLine("Error - Should not have reached here");
                                    object o1 = b;
                                    return (bool)o1;
                                }
                                while (b != false)
                                {
                                    b = false; break;
                                }
                                break;
                            }
                            while (b != true)
                            {
                                b = true; continue;
                            }
                        }
                    }
                    else if (b)
                    {
                        Console.WriteLine("Error - Should not have reached here");
                        return b;
                    }
                    else
                    {
                        Console.WriteLine("Error - Should not have reached here");
                        return (bool)b != true;
                    }
                }
            }
            return false;
        }

        // Non-Overloaded Method
        public static c4 foo(int i, string s, bool b, byte b1, long l, string s1)
        {
            Console.WriteLine("    c4.foo(int, string, bool, byte, long, string)");
            return new c4();
        }

        // Non-Overloaded Method
        internal static c5 bar(short s, ushort us, sbyte sb, float f, double d, double d1, float f1)
        {
            Console.WriteLine("    c4.bar(short, ushort, sbyte, float, double, double, float)");
            return new c5();
        }

        public class c5 : c3<string, c1> // Nested Class, Inheritance
        {
            internal static float f = 8.0f;
            internal static double d = 9.0;
            internal static string s1 = "Test";
            internal static object o = null;

            public int Test()
            {
                int i = 1; string s = "1"; bool b = true;
                short sh = 1; ushort us = 1; object o = i;
                c5 cc = new c5();
                Console.WriteLine("c5.test");
                {
                    uint ui = 1; o = ui;
                    i = sh; b = false; us = 1;
                    // Nested Scopes
                    if (true)
                    {
                        byte b1 = 1; long l = i; string s1 = s;
                        float f = 1.2f; o = f; l = ui;
                        c4.foo(sh, s, b, b1, i, s1); // Implicit Conversions
                        c4 c = new c4();
                        c.foo(sh); this.bar(sh);
                        cc.bar(c5.foo(cc.bar()));
                        c5.foo(cc.bar(c5.foo()));
                        if (b == false)
                        {
                            double d = f; ulong ul = 1; sbyte sb = 1; s1 = s;
                            c4.bar(sh, us, sb, f, d, ui, ul); // Implicit Conversions
                            c.bar4(us);
                            this.bar(cc.bar(), c);
                            c5.foo(this.bar(c5.foo(), c));
                        }
                        if (b1 >= l)
                        {
                            uint ui1 = 1; o = ui1;
                            i = sh; b = false; us = 1;
                            while (i != 1000)
                            {
                                byte b11 = 1; long l1 = i; string s11 = s1;
                                float f1 = 1.2f; o = f1; l1 = ui1;
                                c4.foo(sh, s1, b, b11, i, s11); // Implicit Conversions
                                c.foo(b);
                                this.bar(b); if (c5.foo() != null) c5.foo().ToString().GetHashCode();
                                cc.bar(this.bar(c5.foo()));

                                if (!false)
                                {
                                    double d1 = f1; ulong ul1 = 1; sbyte sb1 = 1; s1 = s;
                                    c4.bar(sh, us, sb1, f1, d1, ui1, ul1); // Implicit Conversions
                                    c.foo(b1, sb1);
                                    this.bar(o).bar4(c);
                                    cc.bar(c5.foo(o)).bar4(c).ToString();
                                    d1 = d;
                                    if (d != d1) return i;
                                }
                                if (i != 1000)
                                {
                                    uint ui2 = 1; o = ui2;
                                    i = sh; b = false; us = 1;
                                    {
                                        byte b12 = 1; long l2 = i; string s12 = s11;
                                        float f2 = 1.2f; o = f1; l2 = ui1;
                                        c4.foo(sh, s1, b, b12, i, s12); // Implicit Conversions
                                        c.bar4(b.ToString() == b.ToString());
                                        this.bar(c5.foo(cc.bar(i)));
                                        {
                                            double d2 = f2; ulong ul2 = 1; sbyte sb2 = 1; s1 = s;
                                            c4.bar(sh, us, sb2, f2, d2, ui2, ul2); // Implicit Conversions
                                            c.foo(false == true != false == b);
                                            c.bar4(sh > us == sh <= us);
                                            this.bar((object)c5.foo((object)cc.bar((object)i)));
                                            if (i != i +
                                                1 -
                                                1)
                                                return i -
                                                (int)b12;
                                        }
                                        if (i <=
                                              1000) break;
                                    }
                                }
                                if (i <=
                                      1000)
                                    i = 1000;
                                return sh;
                            }
                        }
                    }
                }
                return (int)sh;
            }
        }
    }
}


namespace ns4
{
    public class Test
    {
        public static void Run()
        {
            c1 a = new c1(); a.test();

            c2<string> b = new c2<string>(); b.TEST();

            c3<string, string>.test();

            c4.Test();

            c4.c5 d = new c4.c5(); d.Test();
        }
    }

    // Abstract Class
    public abstract class c0
    {
        // Abstract Methods
        public abstract int abst(ref string x, params int[] y);

        public abstract int abst(ref string x, params long[] y);

        public abstract int abst(ref string x, long y, long z);
    }

    public class c1 : c0 // Inheritance
    {
        private int i = 2;
        internal uint ui = 3;
        public c1 a = null;

        // Overloaded Constructors
        public c1()
        {
            i = 2; this.ui = 3;
        }

        public c1(int x)
        {
            i = x; this.ui = 3; this.a = new c1(this.i, this.ui, this.a);
        }

        public c1(int x, uint y, c1 c)
        {
            this.i = x; ui = y; a = new c1();
        }

        public void test()
        {
            int i = 2;
            bool b = true;

            // Nested Scopes
            if (b)
            {
                object o = i;
                b = false;
                {
                    byte b1 = 1;
                    string s = "c1.test()";
                    {
                        Console.WriteLine(s);
                        this.foo(o); foo(i); this.foo(b); this.foo(b1); // Overload Resolution, Implicit Conversions
                    }
                }
            }
            // Nested Scopes
            if (!b)
            {
                object o = i;
                b = false;
                if (true)
                {
                    byte b1 = 1;
                    string s = "c1.test()";
                    {
                        Console.WriteLine(s);
                        bar2(o); this.bar2(i); this.bar2(b1); bar1(s); // Non-Overloaded Methods, Implicit Conversions
                    }
                }
            }
            // Nested Scopes
            if (!false)
            {
                object o = i;
                b = false;
                {
                    byte b1 = 1;
                    string s = "c1.test()";
                    {
                        Console.WriteLine(s);
                        this.bar4(o); this.bar4(i); this.bar4(b1); this.bar3(b); // Non-Overloaded Methods, Implicit Conversions
                    }
                }
            }

            if (!false)
            {
                object o = i;
                b = false;
                {
                    string s = "c1.test()";
                    {
                        Console.WriteLine(s);

                        // Method Calls - Ref, Paramarrays
                        // Overloaded Abstract Methods
                        c1 c = new c1(); long l = 1;
                        this.abst(ref s, 1, i);
                        c.abst(ref s, new int[] { 1, i, i });
                        c.abst(ref s, this.abst(ref s, l, l), l, l, l);

                        // Method Calls - Ref, Paramarrays
                        // Overloaded Virtual Methods
                        c.virt(i, c, new c2<string>[] { virt(i, ref c), new c4() });
                        virt(this.virt(i, ref c), c.virt(ref i, c, virt(i, ref c)));
                        virt(c.abst(ref s, l, l), this.abst(ref s, new long[] { 1, i, l }));
                        c = new c4();
                        virt(i, ref c);
                        virt(ref i, new c4(), new c4(), new c2<string>());
                        virt(new int[] { 1, 2, 3 });
                        virt(new Exception[] { });
                        virt(new c1[] { new c4(), new c2<string>() });
                    }
                }
            }
        }

        // Overriden Abstract Methods
        public override int abst(ref string x, params int[] y)
        {
            Console.WriteLine("    c1.abst(ref string, params int[])");
            x = x.ToString(); y = new int[] { y[0] }; // Read, Write Ref + Paramarrays
            return 0;
        }

        public override int abst(ref string x, params long[] y)
        {
            Console.WriteLine("    c1.abst(ref string, params long[])");
            x = y[0].ToString(); y = null; // Read, Write Ref + Paramarrays
            return 1;
        }

        public override int abst(ref string x, long y, long z)
        {
            Console.WriteLine("    c1.abst(ref string, long, long)");
            x = z.ToString(); // Read, Write Ref
            return 2;
        }

        // Virtual Methods
        public virtual int virt(ref int x, c1 y, params c2<string>[] z)
        {
            Console.WriteLine("    c1.virt(ref int, c1, params c2<string>[])");
            x = x + x * 2; z = null; // Read, Write Ref + Paramarrays
            return 0;
        }

        public virtual c2<string> virt(int x, ref c1 y)
        {
            Console.WriteLine("    c1.virt(int, ref c1)");
            y = new c1(); // Read, Write Ref
            return new c4();
        }

        public virtual int virt(params object[] x)
        {
            Console.WriteLine("    c1.virt(params object[])");
            x = new object[] { 1, 2, null }; // Read, Write Paramarrays
            return new int();
        }

        public virtual int virt(params int[] x)
        {
            Console.WriteLine("    c1.virt(params int[])");
            x = new int[] { 0, 1 }; // Read, Write Paramarrays
            int i = x[0];
            return new int();
        }

        internal int foo(int x)
        {
            Console.WriteLine("    c1.foo(int)");

            // Read, Write Fields
            this.ui = 0u + this.ui;
            i = i - 1 * 2 + 3 / 1;
            this.i = 1;
            this.a = null; a = new c1(x);

            // Read, Write Locals
            bool b = true; string s = null;
            s = string.Empty;
            b = this.i != 1 + (2 - 3);
            s = "";
            c1 c = new c1(i, ui, new c1(this.i, this.ui, new c1(i)));
            c = this.a;
            b = b == true; s = s.ToString();

            // Read, Write Params
            x = (i - this.i) * i + (x / i);
            x = x.GetHashCode(); this.i = x;

            // Read, Write Array Element
            int[] a1 = new int[] { 1, 2, 3 };
            a1[1] = i; a1[2] = x;
            a1[1] = 1; a1[2] = 2;
            int i1 = a1[1] - a1[2];
            i1 = (a1[1] - (a1[2] + a1[1]));
            object o = i1;
            o = a1[2] + (a1[1] - a1[2]);

            return x;
        }

        public bool foo(object x)
        {
            Console.WriteLine("    c1.foo(object)");

            // Read, Write Fields
            ui = 0u;
            this.i = this.i - 1;
            a = null;
            uint ui1 = ui; int i1 = i;

            // Read, Write Locals
            bool b = true; string s = string.Empty;
            s = null; b = this.i != 1;
            ui = ui1; i = i1;
            bar4(b); this.foo(i1); bar4(b == (true != b));

            // Read, Write Params
            x = null; x = new c1(this.i, this.ui, a);
            this.bar4(x); this.bar4(x.GetHashCode() != (x.GetHashCode()));

            // Read, Write Array Element
            object[] a1 = new c1[3] { null, null, null };
            this.i = 1;
            a1[1] = null; a1[2] = new c1((i * i) / i, ui + (ui - ui), null);
            object o = null;
            o = a1[1]; this.bar4(a1[2]);

            if (b)
            {
                return b.GetHashCode() == this.i;
            }
            else
            {
                return b;
            }
        }

        private void bar1(string x)
        {
            Console.WriteLine("    c1.bar1(string)");

            // Read, Write Fields
            this.ui = 0u - 0u;
            i = this.i * 1;
            this.a = new c1();
            this.foo(i.GetHashCode()); this.a = this;

            // Read, Write Locals
            c1 c = new c1(1, 0u, (null));
            c = null; i = 1;
            c = new c1(i / i);
            c = this.a;
            this.ui = 1;
            c.ui = this.ui / ui;
            c.i = this.i + this.i;
            c.a = c;
            c.a = c = this.a = c.a = null;
            c = new c1(i.GetHashCode());
            this.foo(c.i); bar3(c != null);

            if (this.i == 10321)
            {
                return;
            }
            else
            {
            }

            // Read, Write Params
            x = null; this.bar4(x);

            // Read, Write Array Element
            string[] a1 = new string[] { "", null, null };
            a1[1] = null; a1[2] = "";
            string s = null;
            s = a1[1]; foo(a1[2]);
        }

        protected string bar2(object x)
        {
            Console.WriteLine("    c1.bar2(object)");

            // Read, Write Fields
            this.ui = ui - this.ui;
            i = i / 1;
            a = null;
            foo(i);

            // Read, Write Locals
            c1 c;
            object o;
            c = null; c = new c1(i / 2, ui * (2u), new c1(i / 2, ui * (2u), c));
            this.a = new c1(((1 + i) - 1));
            c = this.a;
            o = c;
            c.ui = this.ui;
            c.i = this.i * this.i;
            c.a = c; this.a = c.a;
            c.a = c = this.a = c.a = new c1(i, ui, new c1()); o = c.a = c;
            bar4(o.ToString()); this.bar4(c.a.a);

            // Read, Write Params
            x = c; x = o;
            o = x;

            // Read, Write Array Element
            object[] a1 = new c1[] { null, this.a, c };
            a1[1] = null; a1[2] = c;
            o = a1[1]; bar3(a1[2] != a1[1]);

            if (o == null)
            {
                return null;
            }
            else
            {
                return string.Empty;
            }
        }

        internal object bar3(bool x)
        {
            Console.WriteLine("    c1.bar3(bool)");

            // Read, Write Fields
            ui = ui - this.ui;
            i = i + 1;
            this.a = new c1(i, ui, a);

            // Read, Write Locals
            bool b = x;
            b = this.i > this.i + 1;

            // Read, Write Params
            x = (this.i == i + 1);
            foo(x.GetHashCode());

            // Read, Write Array Element
            bool[] a1 = new bool[] { true, false, x };
            a1[1] = x == (this.i != i - 1 + 1); a1[2] = x == (i >= this.i + 1 - 1);
            b = (a1[1]); b = a1[2];
            object o = b != a1[2];
            o = (a1[1].ToString()) == (a1[2].ToString());
            foo(a1[1].GetHashCode());

            if (b)
            {
                return this.i;
            }
            else
            {
                return a1[1];
            }
        }

        public c1 bar4(object x)
        {
            Console.WriteLine("    c1.bar4(object)");

            // Read, Write Fields
            ui = 0;
            this.ui = this.ui - (this.ui + this.ui) * this.ui;
            this.i = (i + 1) - (1 * (i / 1));
            this.a = (null);
            foo(this.i.GetHashCode());

            // Read, Write Locals
            object o = null;
            bool b = true;
            b = this.i <= this.i + 1 - 1;
            o = x;
            c1 c = new c1(i, this.ui, a);
            c.ui = (this.ui) + (this.ui) + c.ui;
            o = x = c;
            c.i = 1;
            c.i = this.i * (this.i / c.i + c.i);
            c.a = c = this.a = c.a = new c1(); c.a = c;
            foo(c.GetHashCode()); bar3(c.a.GetHashCode() != i);

            // Read, Write Params
            x = (o.ToString());
            x = x.ToString(); foo(x.GetHashCode()); foo(x.ToString().GetHashCode());

            // Read, Write Array Element
            object[] a1 = new object[] { (null), (this.a), c };
            a1[1] = ((this.a)); a1[2] = (c); a1[1] = (i);
            Array.Reverse(a1);
            o = a1[1]; foo(a1.GetHashCode()); bar3(a1[2] == null);

            if (b)
            {
                return this;
            }
            else if (!b)
            {
                return this.a;
            }
            else if (!b)
            {
                return new c1(i, ui, new c1(i + 1, ui - 1u, new c1(i + 2)));
            }
            else
            {
                return (c1)a1[2];
            }
        }
    }

    public class c2<T> : c1 // Inheritance, Generics
    {
        protected c1 c = new c1(0, 0, new c1(1, 1, new c1(2)));

        public void TEST()
        {
            // Nested Scopes
            byte b = 0;
            if (true)
            {
                sbyte sb = 0;
                if (!false)
                {
                    string s = "c2<T>.test()";
                    if (b == 0)
                    {
                        Console.WriteLine(s);
                        this.foo(x: b, y: sb); // Named Arguments
                    }
                }
                if (sb != 1)
                {
                    this.bar1(x: b, y: sb); // Named Arguments
                }
            }
            {
                sbyte sb2 = 0;
                if (b != 1)
                {
                    string s2 = "c2<T>.test()";
                    if (sb2 == 0)
                    {
                        Console.WriteLine(s2);
                        foo(x: b, y: sb2); // Named Arguments
                    }
                }
                if (b == sb2)
                {
                    bar2(x: b, y: sb2); // Named Arguments
                }
            }
            {
                c2<string> c = new c4();
                if (!(!true))
                {
                    // Method Calls - Ref, Paramarrays
                    // Overloaded Abstract Methods
                    int i = 1; long l = i; string s = "";
                    this.abst(ref s, 1, i);
                    c.abst(ref s, new int[] { 1, i, i });
                    c.abst(ref s, this.abst(ref s, l, l), l, l, l);

                    // Method Calls - Ref, Params
                    // Overloaded Virtual Methods
                    c1 a = c;
                    c.virt(i, c, new c2<string>[] { virt(i, ref a), new c4() });
                    virt(this.virt(i, ref a), c.virt(ref i, y: c, z: virt(i, ref a)));
                    virt(c.abst(ref s, l, l), this.abst(y: new long[] { 1, i, l }, x: ref s));
                    c = new c4();
                    virt(y: ref a, x: i);
                    virt(ref i, new c4(), new c4(), new c2<string>());
                    virt(new int[] { 1, 2, 3 });
                    virt(new Exception[] { });
                    virt(new c1[] { new c4(), new c2<string>() });
                }
            }
        }

        // Overriden Abstract Methods
        public override int abst(ref string x, params int[] y)
        {
            Console.WriteLine("    c2<T>.abst(ref string, params int[])");
            x = y[0].ToString(); y = null; // Read, Write Ref + Paramarrays
            return 0;
        }

        public override int abst(ref string x, params long[] y)
        {
            Console.WriteLine("    c2<T>.abst(ref string, params long[])");
            x = y[0].ToString(); y = null; // Read, Write Ref + Paramarrays
            return 1;
        }

        // Overriden Virtual Methods
        public override int virt(ref int x, c1 y, params c2<string>[] z)
        {
            Console.WriteLine("    c2<T>.virt(ref int, c1, params c2<string>[])");
            x = 0; x = y.GetHashCode(); z = null; // Read, Write Ref + Paramarrays
            return 0;
        }

        public override c2<string> virt(int x, ref c1 y)
        {
            Console.WriteLine("    c2<T>.virt(int, ref c1)");
            x.ToString(); y = new c1(x, (uint)x, y); // Read, Write Ref
            return new c2<string>();
        }

        public override int virt(params object[] x)
        {
            Console.WriteLine("    c2<T>.virt(params object[])");
            x.ToString(); x = null; // Read, Write Paramarrays
            return new int();
        }

        private void bar(T x)
        {
            Console.WriteLine("    c2<T>.bar(T)");

            // Read, Write Params
            T y = x;
            x = y;

            // Read Consts
            const string const1 = "";
            if (!false)
            {
                const int const2 = 1;
                const c1 const3 = null;
                if (true)
                {
                    this.bar4(const1); c.foo(const2 != const2); this.a = const3;
                }
            }
        }

        private T foo1(T x)
        {
            Console.WriteLine("    c2<T>.foo1(T)");

            int aa = 1;

            // Read, Write Params
            T y = x;
            x = y; bar(x);

            // Read Consts
            const long const1 = 1;
            const uint const2 = 1;
            while (const1 < const2 - aa)
            {
                continue;
            }

            while (const2 == const1 - aa + aa)
            {
                this.bar4(const1); c.foo(const2 != const2);
                return x;
            }
            return x;
        }

        private bool foo(bool x)
        {
            Console.WriteLine("    c2<T>.foo(bool)");

            int aa = 1;

            // Read, Write Params
            x = x.ToString() == x.ToString(); a = c; a = this;

            // Read Consts
            const long const1 = 1;
            const uint const2 = 1;
            while (const1 < const1 - aa)
            {
                continue;
            }

            while (const2 == const2 - aa + aa)
            {
                return x;
            }
            return x;
        }

        protected c1 foo(byte x, object y)
        {
            Console.WriteLine("    c2<T>.foo(byte, object)");

            // Read, Write Params
            y = x; x = 1;
            c1 c = new c1();
            c.bar4(y); c.foo(x);

            // Read Consts
            const string const1 = "";
            bool b = false;
            if (!b)
            {
                const int const2 = 1;
                object o = y;
                while (y == o)
                {
                    const c1 const3 = null;
                    byte bb = 1;
                    if (bb == x)
                    {
                        this.bar4(const1); this.foo(const2 != const2); this.a = const3;
                        break;
                    }
                    else
                    {
                        return const3;
                    }
                }
                return c;
            }
            return null;
        }

        internal void bar1(byte x, object y)
        {
            Console.WriteLine("    c2<T>.bar1(byte, object)");

            // Read, Write Params
            y = x; x = 1;
            c1 c = new c1();
            c.bar4(y); c.foo(x);

            // Read Consts
            const long const1 = 1;
            const uint const2 = 1;
            while (const1 != x) continue;

            while (const2 == const2)
            {
                this.bar4(const1); this.foo(const2 != const2);
                break;
            }
        }

        public int bar2(byte x, object y)
        {
            Console.WriteLine("    c2<T>.bar2(byte, object)");

            // Read, Write Params
            y = x; x = 1;
            c1 c = new c1();
            c.bar4(y); this.foo(x);

            // Read Consts
            const long const1 = 1;
            if (!false)
            {
                const sbyte const2 = 1;
                const c1 const3 = null;
                if (c != const3)
                {
                    c.bar4(const1); this.foo(const2 != const2); this.a = const3;
                }
            }
            return (int)const1;
        }

        internal float bar3(byte x, object y)
        {
            Console.WriteLine("    c2<T>.bar3(byte, object)");

            // Read, Write Params
            y = x; x = 1;
            double d = 1.1;
            c1 c = new c1();
            this.bar4(y); c.foo(x);

            // Read Consts
            const string const1 = "hi";
            bool b = !false;
            if (b)
            {
                const byte const2 = 1;
                const c1 const3 = null;
                if (const3 != c)
                {
                    this.bar4(const1); c.foo(const2 != const2); c.a = const3;
                    return (float)d;
                }
                return (float)(1.1f + (float)1.1);
            }
            return (float)d + (float)1.1;
        }
    }

    public class c3<T, U> // Generics
    {
        public static void test()
        {
            string s = "c3<T>.test()";
            {
                Console.WriteLine(s);
                foo(); foo(1); foo("1"); foo(1.1); // Overload Resolution, Implicit Conversions
            }
            // Nested Scopes
            {
                sbyte sb1 = 0;
                if (s != "")
                {
                    while (sb1 == 0)
                    {
                        byte b = 0;
                        c2<string> a = new c2<string>();
                        a.bar1(b, sb1);
                        sb1 = 1;
                        if (sb1 == 1) break;
                        else continue;
                    }
                }
                while (sb1 != 0)
                {
                    byte b = 1;
                    c2<string> a = new c2<string>();
                    a.bar1(b, sb1);
                    sb1 = 0;
                    if (sb1 == 1) break;
                    else continue;
                }
            }
            // Nested Scopes
            {
                sbyte sb2 = 0;
                while (sb2 < 2)
                {
                    sb2 = 3;
                    while (sb2 > 0)
                    {
                        sb2 = 0;
                        byte b = 1;
                        c2<int> a = new c2<int>();
                        a.bar2(b, sb2);
                    }
                    sb2 = 3;
                }
                if (sb2 >= 3)
                {
                    byte b = 0;
                    c2<int> a = new c2<int>();
                    a.bar2(b, sb2);
                }
            }
            // Nested Scopes
            {
                sbyte sb3 = 0;
                while (!string.IsNullOrEmpty(s))
                {
                    byte b = 1;
                    s = null;
                    if (sb3 != -20)
                    {
                        c2<bool> a = new c2<bool>();
                        a.bar3(b, sb3);
                    }
                    if (s != null) break;
                }
                while (s == null)
                {
                    byte b = 0;
                    if (s != null)
                    {
                        b = 1; continue;
                    }
                    c2<bool> a = new c2<bool>();
                    a.bar3(b, sb3);
                    s = "";
                    return;
                }
            }
        }

        // Static Methods
        protected static int foo(T x, U y)
        {
            Console.WriteLine("    c3<T, U>.foo(T, U)");
            int[] a = new int[3] { 1, 2, 3 }; a[1] = a[2];
            return (int)((long)x.GetHashCode() + (long)(int)(long)y.GetHashCode());
        }

        internal static c1 foo(object x)
        {
            Console.WriteLine("    c3<T, U>.foo(object)");
            c1[] a = new c1[3] { null, new c1(), new c1(1) }; a[1] = a[2];
            x = "hi";
            return new c1((int)1.1f, (uint)1, new c1(x.GetHashCode()));
        }

        private static float foo(string x)
        {
            Console.WriteLine("    c3<T, U>.foo(string)");
            string[] a = new string[] { x, x, "", null }; a[1] = a[2]; a[2] = a[1];
            return (float)foo(x.GetHashCode());
        }

        public static int foo(int x)
        {
            Console.WriteLine("    c3<T, U>.foo(int)");
            int[] a = new int[] { x, x, 1, 0 }; a[1] = a[2]; a[2] = a[1];
            return (int)x.GetHashCode() + x;
        }

        public static string foo()
        {
            Console.WriteLine("    c3<T, U>.foo()");
            string[] a = new string[] { "", null }; a[0] = a[1]; a[1] = a[0];
            return (string)null;
        }

        // Instance Methods
        protected int bar(T x, U y)
        {
            Console.WriteLine("    c3<T, U>.bar(T, U)");
            int[] a = new int[3] { 1, 2, 3 }; a[1] = a[2];
            return (int)((long)1 + (long)(int)(long)2);
        }

        public c1 bar(object x)
        {
            Console.WriteLine("    c3<T, U>.bar(object)");
            c1[] a = new c1[3] { null, new c1(), new c1(1) }; a[1] = a[2];
            return new c1((int)1.1f, (uint)1, new c1(x.GetHashCode()));
        }

        public float bar(string x)
        {
            Console.WriteLine("    c3<T, U>.bar(string)");
            string[] a = new string[] { x, x, "", null }; a[1] = a[2]; a[2] = a[1];
            x = a[2];
            return (float)foo(x.GetHashCode());
        }

        public int bar(int x)
        {
            Console.WriteLine("    c3<T, U>.bar(int)");
            int[] a = new int[] { x, x, 1, 0 }; a[1] = a[2]; a[2] = a[1];
            return (int)x.GetHashCode() + x;
        }

        public string bar()
        {
            Console.WriteLine("    c3<T, U>.bar()");
            string[] a = new string[] { "", null }; a[0] = a[1]; a[1] = a[0];
            return (string)null;
        }
    }

    public class c4 : c2<string> // Inheritance
    {
        public static bool b = true;
        public static byte b1 = 0;
        public static sbyte sb = 1;

        private static short s = 4;
        private static ushort us = 5;
        private static long l = 6;
        private static ulong ul = 7;

        public static bool Test()
        {
            string str = "c4.Test()";
            {
                int i = 2;
                Console.WriteLine(str);
                {
                    c1 a = new c1(i); a.foo(i);
                }
                double d = 1.1;
                {
                    sbyte sb = 1;
                    c1 a = new c1(i + (i + i));
                    a.foo(sb);
                    {
                        a.foo(d);
                    }
                }

                // Nested Scopes
                {
                    object o = i;
                    bool b = false;
                    if (!b)
                    {
                        byte b1 = 1;
                        string s_ = "    This is a test";
                        while (!b)
                        {
                            if (true) b = true;
                            Console.WriteLine(s_);
                            while (b)
                            {
                                if (true) b = false;
                                object oo = i;
                                bool bb = b;
                                if (!bb)
                                {
                                    if (!false) bb = true;
                                    byte b11 = b1;
                                    string ss = s_;
                                    if (bb)
                                    {
                                        Console.WriteLine(ss);
                                        if (bb != b)
                                        {
                                            object ooo = i;
                                            bool bbb = bb;
                                            if (bbb == true)
                                            {
                                                byte b111 = b11;
                                                string sss = ss;
                                                while (bbb)
                                                {
                                                    Console.WriteLine(sss);
                                                    bbb = false;

                                                    // Method Calls - Ref, Paramarrays
                                                    // Overloaded Abstract Methods
                                                    long l = i;
                                                    c4 c = new c4();
                                                    c.abst(ref s_, 1, i);
                                                    c.abst(ref s_, new int[] { 1, i, i });
                                                    c.abst(ref s_, c.abst(ref s_, l, l), l, l, l);

                                                    // Method Calls - Ref, Paramarrays
                                                    // Overloaded Virtual Methods
                                                    c1 a = new c4();
                                                    c.virt(i, c, new c2<string>[] { c.virt(i, ref a), new c4() });
                                                    c.virt(c.virt(i, ref a), c.virt(ref i, c, c.virt(i, ref a)));
                                                    c.
                                                      virt(
                                                           c.
                                                             abst(ref s_,
                                                                 l,
                                                                 l),
                                                           c.
                                                             abst(ref s_,
                                                                  new long[] {1, 
                                                                              i, 
                                                                              l})
                                                           );
                                                    c.virt(i, ref a);
                                                    c.virt(ref i,
                                                           new c4(),
                                                           new c4(),
                                                           new c2<string>()
                                                           );
                                                    c.virt(new int[] { 1, 2, 3 });
                                                    c.virt(new Exception[] { });
                                                    c.virt(new c1[] { new c4(), new c2<string>() });
                                                    s = (short)us;
                                                    if (true) continue;
                                                }
                                            }
                                            else if (bbb != true)
                                            {
                                                Console.WriteLine("Error - Should not have reached here");
                                                o = i; o = us;
                                                return (bool)o;
                                            }
                                            else if (bbb == false)
                                            {
                                                Console.WriteLine("Error - Should not have reached here");
                                                o = i; o = l;
                                                return (bool)o;

                                            }
                                            else
                                            {
                                                Console.WriteLine("Error - Should not have reached here");
                                                o = b; o = ul;
                                                return (bool)o;
                                            }
                                        }
                                    }
                                    else if (!b)
                                    {
                                        Console.WriteLine("Error - Should not have reached here");
                                        object o1 = b;
                                        return (bool)o1;
                                    }
                                    else
                                    {
                                        Console.WriteLine("Error - Should not have reached here");
                                        object o1 = b;
                                        return (bool)o1;
                                    }
                                }
                                else if (!bb)
                                {
                                    Console.WriteLine("Error - Should not have reached here");
                                    o = b;
                                    return (bool)o;
                                }
                                else
                                {
                                    Console.WriteLine("Error - Should not have reached here");
                                    object o1 = b;
                                    return (bool)o1;
                                }
                                while (b != false)
                                {
                                    b = false; break;
                                }
                                break;
                            }
                            while (b != true)
                            {
                                b = true; continue;
                            }
                        }
                    }
                    else if (b)
                    {
                        Console.WriteLine("Error - Should not have reached here");
                        return b;
                    }
                    else
                    {
                        Console.WriteLine("Error - Should not have reached here");
                        return (bool)b != true;
                    }
                }
            }
            return false;
        }

        // Non-Overloaded Method
        public static c4 foo(int i, string s, bool b, byte b1, long l, string s1)
        {
            Console.WriteLine("    c4.foo(int, string, bool, byte, long, string)");
            return new c4();
        }

        // Non-Overloaded Method
        internal static c5 bar(short s, ushort us, sbyte sb, float f, double d, double d1, float f1)
        {
            Console.WriteLine("    c4.bar(short, ushort, sbyte, float, double, double, float)");
            return new c5();
        }

        public class c5 : c3<string, c1> // Nested Class, Inheritance
        {
            internal static float f = 8.0f;
            internal static double d = 9.0;
            internal static string s1 = "Test";
            internal static object o = null;

            public int Test()
            {
                int i = 1; string s = "1"; bool b = true;
                short sh = 1; ushort us = 1; object o = i;
                c5 cc = new c5();
                Console.WriteLine("c5.test");
                {
                    uint ui = 1; o = ui;
                    i = sh; b = false; us = 1;
                    // Nested Scopes
                    if (true)
                    {
                        byte b1 = 1; long l = i; string s1 = s;
                        float f = 1.2f; o = f; l = ui;
                        c4.foo(sh, s, b, b1, i, s1); // Implicit Conversions
                        c4 c = new c4();
                        c.foo(sh); this.bar(sh);
                        cc.bar(c5.foo(cc.bar()));
                        c5.foo(cc.bar(c5.foo()));
                        if (b == false)
                        {
                            double d = f; ulong ul = 1; sbyte sb = 1; s1 = s;
                            c4.bar(sh, us, sb, f, d, ui, ul); // Implicit Conversions
                            c.bar4(us);
                            this.bar(cc.bar(), c);
                            c5.foo(this.bar(c5.foo(), c));
                        }
                        if (b1 >= l)
                        {
                            uint ui1 = 1; o = ui1;
                            i = sh; b = false; us = 1;
                            while (i != 1000)
                            {
                                byte b11 = 1; long l1 = i; string s11 = s1;
                                float f1 = 1.2f; o = f1; l1 = ui1;
                                c4.foo(sh, s1, b, b11, i, s11); // Implicit Conversions
                                c.foo(b);
                                this.bar(b); if (c5.foo() != null) c5.foo().ToString().GetHashCode();
                                cc.bar(this.bar(c5.foo()));

                                if (!false)
                                {
                                    double d1 = f1; ulong ul1 = 1; sbyte sb1 = 1; s1 = s;
                                    c4.bar(sh, us, sb1, f1, d1, ui1, ul1); // Implicit Conversions
                                    c.foo(b1, sb1);
                                    this.bar(o).bar4(c);
                                    cc.bar(c5.foo(o)).bar4(c).ToString();
                                    d1 = d;
                                    if (d != d1) return i;
                                }
                                if (i != 1000)
                                {
                                    uint ui2 = 1; o = ui2;
                                    i = sh; b = false; us = 1;
                                    {
                                        byte b12 = 1; long l2 = i; string s12 = s11;
                                        float f2 = 1.2f; o = f1; l2 = ui1;
                                        c4.foo(sh, s1, b, b12, i, s12); // Implicit Conversions
                                        c.bar4(b.ToString() == b.ToString());
                                        this.bar(c5.foo(cc.bar(i)));
                                        {
                                            double d2 = f2; ulong ul2 = 1; sbyte sb2 = 1; s1 = s;
                                            c4.bar(sh, us, sb2, f2, d2, ui2, ul2); // Implicit Conversions
                                            c.foo(false == true != false == b);
                                            c.bar4(sh > us == sh <= us);
                                            this.bar((object)c5.foo((object)cc.bar((object)i)));
                                            if (i != i +
                                                1 -
                                                1)
                                                return i -
                                                (int)b12;
                                        }
                                        if (i <=
                                              1000) break;
                                    }
                                }
                                if (i <=
                                      1000)
                                    i = 1000;
                                return sh;
                            }
                        }
                    }
                }
                return (int)sh;
            }
        }
    }
}


namespace ns5
{
    public class Test
    {
        public static void Run()
        {
            c1 a = new c1(); a.test();

            c2<string> b = new c2<string>(); b.TEST();

            c3<string, string>.test();

            c4.Test();

            c4.c5 d = new c4.c5(); d.Test();
        }
    }

    // Abstract Class
    public abstract class c0
    {
        // Abstract Methods
        public abstract int abst(ref string x, params int[] y);

        public abstract int abst(ref string x, params long[] y);

        public abstract int abst(ref string x, long y, long z);
    }

    public class c1 : c0 // Inheritance
    {
        private int i = 2;
        internal uint ui = 3;
        public c1 a = null;

        // Overloaded Constructors
        public c1()
        {
            i = 2; this.ui = 3;
        }

        public c1(int x)
        {
            i = x; this.ui = 3; this.a = new c1(this.i, this.ui, this.a);
        }

        public c1(int x, uint y, c1 c)
        {
            this.i = x; ui = y; a = new c1();
        }

        public void test()
        {
            int i = 2;
            bool b = true;

            // Nested Scopes
            if (b)
            {
                object o = i;
                b = false;
                {
                    byte b1 = 1;
                    string s = "c1.test()";
                    {
                        Console.WriteLine(s);
                        this.foo(o); foo(i); this.foo(b); this.foo(b1); // Overload Resolution, Implicit Conversions
                    }
                }
            }
            // Nested Scopes
            if (!b)
            {
                object o = i;
                b = false;
                if (true)
                {
                    byte b1 = 1;
                    string s = "c1.test()";
                    {
                        Console.WriteLine(s);
                        bar2(o); this.bar2(i); this.bar2(b1); bar1(s); // Non-Overloaded Methods, Implicit Conversions
                    }
                }
            }
            // Nested Scopes
            if (!false)
            {
                object o = i;
                b = false;
                {
                    byte b1 = 1;
                    string s = "c1.test()";
                    {
                        Console.WriteLine(s);
                        this.bar4(o); this.bar4(i); this.bar4(b1); this.bar3(b); // Non-Overloaded Methods, Implicit Conversions
                    }
                }
            }

            if (!false)
            {
                object o = i;
                b = false;
                {
                    string s = "c1.test()";
                    {
                        Console.WriteLine(s);

                        // Method Calls - Ref, Paramarrays
                        // Overloaded Abstract Methods
                        c1 c = new c1(); long l = 1;
                        this.abst(ref s, 1, i);
                        c.abst(ref s, new int[] { 1, i, i });
                        c.abst(ref s, this.abst(ref s, l, l), l, l, l);

                        // Method Calls - Ref, Paramarrays
                        // Overloaded Virtual Methods
                        c.virt(i, c, new c2<string>[] { virt(i, ref c), new c4() });
                        virt(this.virt(i, ref c), c.virt(ref i, c, virt(i, ref c)));
                        virt(c.abst(ref s, l, l), this.abst(ref s, new long[] { 1, i, l }));
                        c = new c4();
                        virt(i, ref c);
                        virt(ref i, new c4(), new c4(), new c2<string>());
                        virt(new int[] { 1, 2, 3 });
                        virt(new Exception[] { });
                        virt(new c1[] { new c4(), new c2<string>() });
                    }
                }
            }
        }

        // Overriden Abstract Methods
        public override int abst(ref string x, params int[] y)
        {
            Console.WriteLine("    c1.abst(ref string, params int[])");
            x = x.ToString(); y = new int[] { y[0] }; // Read, Write Ref + Paramarrays
            return 0;
        }

        public override int abst(ref string x, params long[] y)
        {
            Console.WriteLine("    c1.abst(ref string, params long[])");
            x = y[0].ToString(); y = null; // Read, Write Ref + Paramarrays
            return 1;
        }

        public override int abst(ref string x, long y, long z)
        {
            Console.WriteLine("    c1.abst(ref string, long, long)");
            x = z.ToString(); // Read, Write Ref
            return 2;
        }

        // Virtual Methods
        public virtual int virt(ref int x, c1 y, params c2<string>[] z)
        {
            Console.WriteLine("    c1.virt(ref int, c1, params c2<string>[])");
            x = x + x * 2; z = null; // Read, Write Ref + Paramarrays
            return 0;
        }

        public virtual c2<string> virt(int x, ref c1 y)
        {
            Console.WriteLine("    c1.virt(int, ref c1)");
            y = new c1(); // Read, Write Ref
            return new c4();
        }

        public virtual int virt(params object[] x)
        {
            Console.WriteLine("    c1.virt(params object[])");
            x = new object[] { 1, 2, null }; // Read, Write Paramarrays
            return new int();
        }

        public virtual int virt(params int[] x)
        {
            Console.WriteLine("    c1.virt(params int[])");
            x = new int[] { 0, 1 }; // Read, Write Paramarrays
            int i = x[0];
            return new int();
        }

        internal int foo(int x)
        {
            Console.WriteLine("    c1.foo(int)");

            // Read, Write Fields
            this.ui = 0u + this.ui;
            i = i - 1 * 2 + 3 / 1;
            this.i = 1;
            this.a = null; a = new c1(x);

            // Read, Write Locals
            bool b = true; string s = null;
            s = string.Empty;
            b = this.i != 1 + (2 - 3);
            s = "";
            c1 c = new c1(i, ui, new c1(this.i, this.ui, new c1(i)));
            c = this.a;
            b = b == true; s = s.ToString();

            // Read, Write Params
            x = (i - this.i) * i + (x / i);
            x = x.GetHashCode(); this.i = x;

            // Read, Write Array Element
            int[] a1 = new int[] { 1, 2, 3 };
            a1[1] = i; a1[2] = x;
            a1[1] = 1; a1[2] = 2;
            int i1 = a1[1] - a1[2];
            i1 = (a1[1] - (a1[2] + a1[1]));
            object o = i1;
            o = a1[2] + (a1[1] - a1[2]);

            return x;
        }

        public bool foo(object x)
        {
            Console.WriteLine("    c1.foo(object)");

            // Read, Write Fields
            ui = 0u;
            this.i = this.i - 1;
            a = null;
            uint ui1 = ui; int i1 = i;

            // Read, Write Locals
            bool b = true; string s = string.Empty;
            s = null; b = this.i != 1;
            ui = ui1; i = i1;
            bar4(b); this.foo(i1); bar4(b == (true != b));

            // Read, Write Params
            x = null; x = new c1(this.i, this.ui, a);
            this.bar4(x); this.bar4(x.GetHashCode() != (x.GetHashCode()));

            // Read, Write Array Element
            object[] a1 = new c1[3] { null, null, null };
            this.i = 1;
            a1[1] = null; a1[2] = new c1((i * i) / i, ui + (ui - ui), null);
            object o = null;
            o = a1[1]; this.bar4(a1[2]);

            if (b)
            {
                return b.GetHashCode() == this.i;
            }
            else
            {
                return b;
            }
        }

        private void bar1(string x)
        {
            Console.WriteLine("    c1.bar1(string)");

            // Read, Write Fields
            this.ui = 0u - 0u;
            i = this.i * 1;
            this.a = new c1();
            this.foo(i.GetHashCode()); this.a = this;

            // Read, Write Locals
            c1 c = new c1(1, 0u, (null));
            c = null; i = 1;
            c = new c1(i / i);
            c = this.a;
            this.ui = 1;
            c.ui = this.ui / ui;
            c.i = this.i + this.i;
            c.a = c;
            c.a = c = this.a = c.a = null;
            c = new c1(i.GetHashCode());
            this.foo(c.i); bar3(c != null);

            if (this.i == 10321)
            {
                return;
            }
            else
            {
            }

            // Read, Write Params
            x = null; this.bar4(x);

            // Read, Write Array Element
            string[] a1 = new string[] { "", null, null };
            a1[1] = null; a1[2] = "";
            string s = null;
            s = a1[1]; foo(a1[2]);
        }

        protected string bar2(object x)
        {
            Console.WriteLine("    c1.bar2(object)");

            // Read, Write Fields
            this.ui = ui - this.ui;
            i = i / 1;
            a = null;
            foo(i);

            // Read, Write Locals
            c1 c;
            object o;
            c = null; c = new c1(i / 2, ui * (2u), new c1(i / 2, ui * (2u), c));
            this.a = new c1(((1 + i) - 1));
            c = this.a;
            o = c;
            c.ui = this.ui;
            c.i = this.i * this.i;
            c.a = c; this.a = c.a;
            c.a = c = this.a = c.a = new c1(i, ui, new c1()); o = c.a = c;
            bar4(o.ToString()); this.bar4(c.a.a);

            // Read, Write Params
            x = c; x = o;
            o = x;

            // Read, Write Array Element
            object[] a1 = new c1[] { null, this.a, c };
            a1[1] = null; a1[2] = c;
            o = a1[1]; bar3(a1[2] != a1[1]);

            if (o == null)
            {
                return null;
            }
            else
            {
                return string.Empty;
            }
        }

        internal object bar3(bool x)
        {
            Console.WriteLine("    c1.bar3(bool)");

            // Read, Write Fields
            ui = ui - this.ui;
            i = i + 1;
            this.a = new c1(i, ui, a);

            // Read, Write Locals
            bool b = x;
            b = this.i > this.i + 1;

            // Read, Write Params
            x = (this.i == i + 1);
            foo(x.GetHashCode());

            // Read, Write Array Element
            bool[] a1 = new bool[] { true, false, x };
            a1[1] = x == (this.i != i - 1 + 1); a1[2] = x == (i >= this.i + 1 - 1);
            b = (a1[1]); b = a1[2];
            object o = b != a1[2];
            o = (a1[1].ToString()) == (a1[2].ToString());
            foo(a1[1].GetHashCode());

            if (b)
            {
                return this.i;
            }
            else
            {
                return a1[1];
            }
        }

        public c1 bar4(object x)
        {
            Console.WriteLine("    c1.bar4(object)");

            // Read, Write Fields
            ui = 0;
            this.ui = this.ui - (this.ui + this.ui) * this.ui;
            this.i = (i + 1) - (1 * (i / 1));
            this.a = (null);
            foo(this.i.GetHashCode());

            // Read, Write Locals
            object o = null;
            bool b = true;
            b = this.i <= this.i + 1 - 1;
            o = x;
            c1 c = new c1(i, this.ui, a);
            c.ui = (this.ui) + (this.ui) + c.ui;
            o = x = c;
            c.i = 1;
            c.i = this.i * (this.i / c.i + c.i);
            c.a = c = this.a = c.a = new c1(); c.a = c;
            foo(c.GetHashCode()); bar3(c.a.GetHashCode() != i);

            // Read, Write Params
            x = (o.ToString());
            x = x.ToString(); foo(x.GetHashCode()); foo(x.ToString().GetHashCode());

            // Read, Write Array Element
            object[] a1 = new object[] { (null), (this.a), c };
            a1[1] = ((this.a)); a1[2] = (c); a1[1] = (i);
            Array.Reverse(a1);
            o = a1[1]; foo(a1.GetHashCode()); bar3(a1[2] == null);

            if (b)
            {
                return this;
            }
            else if (!b)
            {
                return this.a;
            }
            else if (!b)
            {
                return new c1(i, ui, new c1(i + 1, ui - 1u, new c1(i + 2)));
            }
            else
            {
                return (c1)a1[2];
            }
        }
    }

    public class c2<T> : c1 // Inheritance, Generics
    {
        protected c1 c = new c1(0, 0, new c1(1, 1, new c1(2)));

        public void TEST()
        {
            // Nested Scopes
            byte b = 0;
            if (true)
            {
                sbyte sb = 0;
                if (!false)
                {
                    string s = "c2<T>.test()";
                    if (b == 0)
                    {
                        Console.WriteLine(s);
                        this.foo(x: b, y: sb); // Named Arguments
                    }
                }
                if (sb != 1)
                {
                    this.bar1(x: b, y: sb); // Named Arguments
                }
            }
            {
                sbyte sb2 = 0;
                if (b != 1)
                {
                    string s2 = "c2<T>.test()";
                    if (sb2 == 0)
                    {
                        Console.WriteLine(s2);
                        foo(x: b, y: sb2); // Named Arguments
                    }
                }
                if (b == sb2)
                {
                    bar2(x: b, y: sb2); // Named Arguments
                }
            }
            {
                c2<string> c = new c4();
                if (!(!true))
                {
                    // Method Calls - Ref, Paramarrays
                    // Overloaded Abstract Methods
                    int i = 1; long l = i; string s = "";
                    this.abst(ref s, 1, i);
                    c.abst(ref s, new int[] { 1, i, i });
                    c.abst(ref s, this.abst(ref s, l, l), l, l, l);

                    // Method Calls - Ref, Params
                    // Overloaded Virtual Methods
                    c1 a = c;
                    c.virt(i, c, new c2<string>[] { virt(i, ref a), new c4() });
                    virt(this.virt(i, ref a), c.virt(ref i, y: c, z: virt(i, ref a)));
                    virt(c.abst(ref s, l, l), this.abst(y: new long[] { 1, i, l }, x: ref s));
                    c = new c4();
                    virt(y: ref a, x: i);
                    virt(ref i, new c4(), new c4(), new c2<string>());
                    virt(new int[] { 1, 2, 3 });
                    virt(new Exception[] { });
                    virt(new c1[] { new c4(), new c2<string>() });
                }
            }
        }

        // Overriden Abstract Methods
        public override int abst(ref string x, params int[] y)
        {
            Console.WriteLine("    c2<T>.abst(ref string, params int[])");
            x = y[0].ToString(); y = null; // Read, Write Ref + Paramarrays
            return 0;
        }

        public override int abst(ref string x, params long[] y)
        {
            Console.WriteLine("    c2<T>.abst(ref string, params long[])");
            x = y[0].ToString(); y = null; // Read, Write Ref + Paramarrays
            return 1;
        }

        // Overriden Virtual Methods
        public override int virt(ref int x, c1 y, params c2<string>[] z)
        {
            Console.WriteLine("    c2<T>.virt(ref int, c1, params c2<string>[])");
            x = 0; x = y.GetHashCode(); z = null; // Read, Write Ref + Paramarrays
            return 0;
        }

        public override c2<string> virt(int x, ref c1 y)
        {
            Console.WriteLine("    c2<T>.virt(int, ref c1)");
            x.ToString(); y = new c1(x, (uint)x, y); // Read, Write Ref
            return new c2<string>();
        }

        public override int virt(params object[] x)
        {
            Console.WriteLine("    c2<T>.virt(params object[])");
            x.ToString(); x = null; // Read, Write Paramarrays
            return new int();
        }

        private void bar(T x)
        {
            Console.WriteLine("    c2<T>.bar(T)");

            // Read, Write Params
            T y = x;
            x = y;

            // Read Consts
            const string const1 = "";
            if (!false)
            {
                const int const2 = 1;
                const c1 const3 = null;
                if (true)
                {
                    this.bar4(const1); c.foo(const2 != const2); this.a = const3;
                }
            }
        }

        private T foo1(T x)
        {
            Console.WriteLine("    c2<T>.foo1(T)");

            int aa = 1;

            // Read, Write Params
            T y = x;
            x = y; bar(x);

            // Read Consts
            const long const1 = 1;
            const uint const2 = 1;
            while (const1 < const2 - aa)
            {
                continue;
            }

            while (const2 == const1 - aa + aa)
            {
                this.bar4(const1); c.foo(const2 != const2);
                return x;
            }
            return x;
        }

        private bool foo(bool x)
        {
            Console.WriteLine("    c2<T>.foo(bool)");

            int aa = 1;

            // Read, Write Params
            x = x.ToString() == x.ToString(); a = c; a = this;

            // Read Consts
            const long const1 = 1;
            const uint const2 = 1;
            while (const1 < const1 - aa)
            {
                continue;
            }

            while (const2 == const2 - aa + aa)
            {
                return x;
            }
            return x;
        }

        protected c1 foo(byte x, object y)
        {
            Console.WriteLine("    c2<T>.foo(byte, object)");

            // Read, Write Params
            y = x; x = 1;
            c1 c = new c1();
            c.bar4(y); c.foo(x);

            // Read Consts
            const string const1 = "";
            bool b = false;
            if (!b)
            {
                const int const2 = 1;
                object o = y;
                while (y == o)
                {
                    const c1 const3 = null;
                    byte bb = 1;
                    if (bb == x)
                    {
                        this.bar4(const1); this.foo(const2 != const2); this.a = const3;
                        break;
                    }
                    else
                    {
                        return const3;
                    }
                }
                return c;
            }
            return null;
        }

        internal void bar1(byte x, object y)
        {
            Console.WriteLine("    c2<T>.bar1(byte, object)");

            // Read, Write Params
            y = x; x = 1;
            c1 c = new c1();
            c.bar4(y); c.foo(x);

            // Read Consts
            const long const1 = 1;
            const uint const2 = 1;
            while (const1 != x) continue;

            while (const2 == const2)
            {
                this.bar4(const1); this.foo(const2 != const2);
                break;
            }
        }

        public int bar2(byte x, object y)
        {
            Console.WriteLine("    c2<T>.bar2(byte, object)");

            // Read, Write Params
            y = x; x = 1;
            c1 c = new c1();
            c.bar4(y); this.foo(x);

            // Read Consts
            const long const1 = 1;
            if (!false)
            {
                const sbyte const2 = 1;
                const c1 const3 = null;
                if (c != const3)
                {
                    c.bar4(const1); this.foo(const2 != const2); this.a = const3;
                }
            }
            return (int)const1;
        }

        internal float bar3(byte x, object y)
        {
            Console.WriteLine("    c2<T>.bar3(byte, object)");

            // Read, Write Params
            y = x; x = 1;
            double d = 1.1;
            c1 c = new c1();
            this.bar4(y); c.foo(x);

            // Read Consts
            const string const1 = "hi";
            bool b = !false;
            if (b)
            {
                const byte const2 = 1;
                const c1 const3 = null;
                if (const3 != c)
                {
                    this.bar4(const1); c.foo(const2 != const2); c.a = const3;
                    return (float)d;
                }
                return (float)(1.1f + (float)1.1);
            }
            return (float)d + (float)1.1;
        }
    }

    public class c3<T, U> // Generics
    {
        public static void test()
        {
            string s = "c3<T>.test()";
            {
                Console.WriteLine(s);
                foo(); foo(1); foo("1"); foo(1.1); // Overload Resolution, Implicit Conversions
            }
            // Nested Scopes
            {
                sbyte sb1 = 0;
                if (s != "")
                {
                    while (sb1 == 0)
                    {
                        byte b = 0;
                        c2<string> a = new c2<string>();
                        a.bar1(b, sb1);
                        sb1 = 1;
                        if (sb1 == 1) break;
                        else continue;
                    }
                }
                while (sb1 != 0)
                {
                    byte b = 1;
                    c2<string> a = new c2<string>();
                    a.bar1(b, sb1);
                    sb1 = 0;
                    if (sb1 == 1) break;
                    else continue;
                }
            }
            // Nested Scopes
            {
                sbyte sb2 = 0;
                while (sb2 < 2)
                {
                    sb2 = 3;
                    while (sb2 > 0)
                    {
                        sb2 = 0;
                        byte b = 1;
                        c2<int> a = new c2<int>();
                        a.bar2(b, sb2);
                    }
                    sb2 = 3;
                }
                if (sb2 >= 3)
                {
                    byte b = 0;
                    c2<int> a = new c2<int>();
                    a.bar2(b, sb2);
                }
            }
            // Nested Scopes
            {
                sbyte sb3 = 0;
                while (!string.IsNullOrEmpty(s))
                {
                    byte b = 1;
                    s = null;
                    if (sb3 != -20)
                    {
                        c2<bool> a = new c2<bool>();
                        a.bar3(b, sb3);
                    }
                    if (s != null) break;
                }
                while (s == null)
                {
                    byte b = 0;
                    if (s != null)
                    {
                        b = 1; continue;
                    }
                    c2<bool> a = new c2<bool>();
                    a.bar3(b, sb3);
                    s = "";
                    return;
                }
            }
        }

        // Static Methods
        protected static int foo(T x, U y)
        {
            Console.WriteLine("    c3<T, U>.foo(T, U)");
            int[] a = new int[3] { 1, 2, 3 }; a[1] = a[2];
            return (int)((long)x.GetHashCode() + (long)(int)(long)y.GetHashCode());
        }

        internal static c1 foo(object x)
        {
            Console.WriteLine("    c3<T, U>.foo(object)");
            c1[] a = new c1[3] { null, new c1(), new c1(1) }; a[1] = a[2];
            x = "hi";
            return new c1((int)1.1f, (uint)1, new c1(x.GetHashCode()));
        }

        private static float foo(string x)
        {
            Console.WriteLine("    c3<T, U>.foo(string)");
            string[] a = new string[] { x, x, "", null }; a[1] = a[2]; a[2] = a[1];
            return (float)foo(x.GetHashCode());
        }

        public static int foo(int x)
        {
            Console.WriteLine("    c3<T, U>.foo(int)");
            int[] a = new int[] { x, x, 1, 0 }; a[1] = a[2]; a[2] = a[1];
            return (int)x.GetHashCode() + x;
        }

        public static string foo()
        {
            Console.WriteLine("    c3<T, U>.foo()");
            string[] a = new string[] { "", null }; a[0] = a[1]; a[1] = a[0];
            return (string)null;
        }

        // Instance Methods
        protected int bar(T x, U y)
        {
            Console.WriteLine("    c3<T, U>.bar(T, U)");
            int[] a = new int[3] { 1, 2, 3 }; a[1] = a[2];
            return (int)((long)1 + (long)(int)(long)2);
        }

        public c1 bar(object x)
        {
            Console.WriteLine("    c3<T, U>.bar(object)");
            c1[] a = new c1[3] { null, new c1(), new c1(1) }; a[1] = a[2];
            return new c1((int)1.1f, (uint)1, new c1(x.GetHashCode()));
        }

        public float bar(string x)
        {
            Console.WriteLine("    c3<T, U>.bar(string)");
            string[] a = new string[] { x, x, "", null }; a[1] = a[2]; a[2] = a[1];
            x = a[2];
            return (float)foo(x.GetHashCode());
        }

        public int bar(int x)
        {
            Console.WriteLine("    c3<T, U>.bar(int)");
            int[] a = new int[] { x, x, 1, 0 }; a[1] = a[2]; a[2] = a[1];
            return (int)x.GetHashCode() + x;
        }

        public string bar()
        {
            Console.WriteLine("    c3<T, U>.bar()");
            string[] a = new string[] { "", null }; a[0] = a[1]; a[1] = a[0];
            return (string)null;
        }
    }

    public class c4 : c2<string> // Inheritance
    {
        public static bool b = true;
        public static byte b1 = 0;
        public static sbyte sb = 1;

        private static short s = 4;
        private static ushort us = 5;
        private static long l = 6;
        private static ulong ul = 7;

        public static bool Test()
        {
            string str = "c4.Test()";
            {
                int i = 2;
                Console.WriteLine(str);
                {
                    c1 a = new c1(i); a.foo(i);
                }
                double d = 1.1;
                {
                    sbyte sb = 1;
                    c1 a = new c1(i + (i + i));
                    a.foo(sb);
                    {
                        a.foo(d);
                    }
                }

                // Nested Scopes
                {
                    object o = i;
                    bool b = false;
                    if (!b)
                    {
                        byte b1 = 1;
                        string s_ = "    This is a test";
                        while (!b)
                        {
                            if (true) b = true;
                            Console.WriteLine(s_);
                            while (b)
                            {
                                if (true) b = false;
                                object oo = i;
                                bool bb = b;
                                if (!bb)
                                {
                                    if (!false) bb = true;
                                    byte b11 = b1;
                                    string ss = s_;
                                    if (bb)
                                    {
                                        Console.WriteLine(ss);
                                        if (bb != b)
                                        {
                                            object ooo = i;
                                            bool bbb = bb;
                                            if (bbb == true)
                                            {
                                                byte b111 = b11;
                                                string sss = ss;
                                                while (bbb)
                                                {
                                                    Console.WriteLine(sss);
                                                    bbb = false;

                                                    // Method Calls - Ref, Paramarrays
                                                    // Overloaded Abstract Methods
                                                    long l = i;
                                                    c4 c = new c4();
                                                    c.abst(ref s_, 1, i);
                                                    c.abst(ref s_, new int[] { 1, i, i });
                                                    c.abst(ref s_, c.abst(ref s_, l, l), l, l, l);

                                                    // Method Calls - Ref, Paramarrays
                                                    // Overloaded Virtual Methods
                                                    c1 a = new c4();
                                                    c.virt(i, c, new c2<string>[] { c.virt(i, ref a), new c4() });
                                                    c.virt(c.virt(i, ref a), c.virt(ref i, c, c.virt(i, ref a)));
                                                    c.
                                                      virt(
                                                           c.
                                                             abst(ref s_,
                                                                 l,
                                                                 l),
                                                           c.
                                                             abst(ref s_,
                                                                  new long[] {1, 
                                                                              i, 
                                                                              l})
                                                           );
                                                    c.virt(i, ref a);
                                                    c.virt(ref i,
                                                           new c4(),
                                                           new c4(),
                                                           new c2<string>()
                                                           );
                                                    c.virt(new int[] { 1, 2, 3 });
                                                    c.virt(new Exception[] { });
                                                    c.virt(new c1[] { new c4(), new c2<string>() });
                                                    s = (short)us;
                                                    if (true) continue;
                                                }
                                            }
                                            else if (bbb != true)
                                            {
                                                Console.WriteLine("Error - Should not have reached here");
                                                o = i; o = us;
                                                return (bool)o;
                                            }
                                            else if (bbb == false)
                                            {
                                                Console.WriteLine("Error - Should not have reached here");
                                                o = i; o = l;
                                                return (bool)o;

                                            }
                                            else
                                            {
                                                Console.WriteLine("Error - Should not have reached here");
                                                o = b; o = ul;
                                                return (bool)o;
                                            }
                                        }
                                    }
                                    else if (!b)
                                    {
                                        Console.WriteLine("Error - Should not have reached here");
                                        object o1 = b;
                                        return (bool)o1;
                                    }
                                    else
                                    {
                                        Console.WriteLine("Error - Should not have reached here");
                                        object o1 = b;
                                        return (bool)o1;
                                    }
                                }
                                else if (!bb)
                                {
                                    Console.WriteLine("Error - Should not have reached here");
                                    o = b;
                                    return (bool)o;
                                }
                                else
                                {
                                    Console.WriteLine("Error - Should not have reached here");
                                    object o1 = b;
                                    return (bool)o1;
                                }
                                while (b != false)
                                {
                                    b = false; break;
                                }
                                break;
                            }
                            while (b != true)
                            {
                                b = true; continue;
                            }
                        }
                    }
                    else if (b)
                    {
                        Console.WriteLine("Error - Should not have reached here");
                        return b;
                    }
                    else
                    {
                        Console.WriteLine("Error - Should not have reached here");
                        return (bool)b != true;
                    }
                }
            }
            return false;
        }

        // Non-Overloaded Method
        public static c4 foo(int i, string s, bool b, byte b1, long l, string s1)
        {
            Console.WriteLine("    c4.foo(int, string, bool, byte, long, string)");
            return new c4();
        }

        // Non-Overloaded Method
        internal static c5 bar(short s, ushort us, sbyte sb, float f, double d, double d1, float f1)
        {
            Console.WriteLine("    c4.bar(short, ushort, sbyte, float, double, double, float)");
            return new c5();
        }

        public class c5 : c3<string, c1> // Nested Class, Inheritance
        {
            internal static float f = 8.0f;
            internal static double d = 9.0;
            internal static string s1 = "Test";
            internal static object o = null;

            public int Test()
            {
                int i = 1; string s = "1"; bool b = true;
                short sh = 1; ushort us = 1; object o = i;
                c5 cc = new c5();
                Console.WriteLine("c5.test");
                {
                    uint ui = 1; o = ui;
                    i = sh; b = false; us = 1;
                    // Nested Scopes
                    if (true)
                    {
                        byte b1 = 1; long l = i; string s1 = s;
                        float f = 1.2f; o = f; l = ui;
                        c4.foo(sh, s, b, b1, i, s1); // Implicit Conversions
                        c4 c = new c4();
                        c.foo(sh); this.bar(sh);
                        cc.bar(c5.foo(cc.bar()));
                        c5.foo(cc.bar(c5.foo()));
                        if (b == false)
                        {
                            double d = f; ulong ul = 1; sbyte sb = 1; s1 = s;
                            c4.bar(sh, us, sb, f, d, ui, ul); // Implicit Conversions
                            c.bar4(us);
                            this.bar(cc.bar(), c);
                            c5.foo(this.bar(c5.foo(), c));
                        }
                        if (b1 >= l)
                        {
                            uint ui1 = 1; o = ui1;
                            i = sh; b = false; us = 1;
                            while (i != 1000)
                            {
                                byte b11 = 1; long l1 = i; string s11 = s1;
                                float f1 = 1.2f; o = f1; l1 = ui1;
                                c4.foo(sh, s1, b, b11, i, s11); // Implicit Conversions
                                c.foo(b);
                                this.bar(b); if (c5.foo() != null) c5.foo().ToString().GetHashCode();
                                cc.bar(this.bar(c5.foo()));

                                if (!false)
                                {
                                    double d1 = f1; ulong ul1 = 1; sbyte sb1 = 1; s1 = s;
                                    c4.bar(sh, us, sb1, f1, d1, ui1, ul1); // Implicit Conversions
                                    c.foo(b1, sb1);
                                    this.bar(o).bar4(c);
                                    cc.bar(c5.foo(o)).bar4(c).ToString();
                                    d1 = d;
                                    if (d != d1) return i;
                                }
                                if (i != 1000)
                                {
                                    uint ui2 = 1; o = ui2;
                                    i = sh; b = false; us = 1;
                                    {
                                        byte b12 = 1; long l2 = i; string s12 = s11;
                                        float f2 = 1.2f; o = f1; l2 = ui1;
                                        c4.foo(sh, s1, b, b12, i, s12); // Implicit Conversions
                                        c.bar4(b.ToString() == b.ToString());
                                        this.bar(c5.foo(cc.bar(i)));
                                        {
                                            double d2 = f2; ulong ul2 = 1; sbyte sb2 = 1; s1 = s;
                                            c4.bar(sh, us, sb2, f2, d2, ui2, ul2); // Implicit Conversions
                                            c.foo(false == true != false == b);
                                            c.bar4(sh > us == sh <= us);
                                            this.bar((object)c5.foo((object)cc.bar((object)i)));
                                            if (i != i +
                                                1 -
                                                1)
                                                return i -
                                                (int)b12;
                                        }
                                        if (i <=
                                              1000) break;
                                    }
                                }
                                if (i <=
                                      1000)
                                    i = 1000;
                                return sh;
                            }
                        }
                    }
                }
                return (int)sh;
            }
        }
    }
}


namespace ns6
{
    public class Test
    {
        public static void Run()
        {
            c1 a = new c1(); a.test();

            c2<string> b = new c2<string>(); b.TEST();

            c3<string, string>.test();

            c4.Test();

            c4.c5 d = new c4.c5(); d.Test();
        }
    }

    // Abstract Class
    public abstract class c0
    {
        // Abstract Methods
        public abstract int abst(ref string x, params int[] y);

        public abstract int abst(ref string x, params long[] y);

        public abstract int abst(ref string x, long y, long z);
    }

    public class c1 : c0 // Inheritance
    {
        private int i = 2;
        internal uint ui = 3;
        public c1 a = null;

        // Overloaded Constructors
        public c1()
        {
            i = 2; this.ui = 3;
        }

        public c1(int x)
        {
            i = x; this.ui = 3; this.a = new c1(this.i, this.ui, this.a);
        }

        public c1(int x, uint y, c1 c)
        {
            this.i = x; ui = y; a = new c1();
        }

        public void test()
        {
            int i = 2;
            bool b = true;

            // Nested Scopes
            if (b)
            {
                object o = i;
                b = false;
                {
                    byte b1 = 1;
                    string s = "c1.test()";
                    {
                        Console.WriteLine(s);
                        this.foo(o); foo(i); this.foo(b); this.foo(b1); // Overload Resolution, Implicit Conversions
                    }
                }
            }
            // Nested Scopes
            if (!b)
            {
                object o = i;
                b = false;
                if (true)
                {
                    byte b1 = 1;
                    string s = "c1.test()";
                    {
                        Console.WriteLine(s);
                        bar2(o); this.bar2(i); this.bar2(b1); bar1(s); // Non-Overloaded Methods, Implicit Conversions
                    }
                }
            }
            // Nested Scopes
            if (!false)
            {
                object o = i;
                b = false;
                {
                    byte b1 = 1;
                    string s = "c1.test()";
                    {
                        Console.WriteLine(s);
                        this.bar4(o); this.bar4(i); this.bar4(b1); this.bar3(b); // Non-Overloaded Methods, Implicit Conversions
                    }
                }
            }

            if (!false)
            {
                object o = i;
                b = false;
                {
                    string s = "c1.test()";
                    {
                        Console.WriteLine(s);

                        // Method Calls - Ref, Paramarrays
                        // Overloaded Abstract Methods
                        c1 c = new c1(); long l = 1;
                        this.abst(ref s, 1, i);
                        c.abst(ref s, new int[] { 1, i, i });
                        c.abst(ref s, this.abst(ref s, l, l), l, l, l);

                        // Method Calls - Ref, Paramarrays
                        // Overloaded Virtual Methods
                        c.virt(i, c, new c2<string>[] { virt(i, ref c), new c4() });
                        virt(this.virt(i, ref c), c.virt(ref i, c, virt(i, ref c)));
                        virt(c.abst(ref s, l, l), this.abst(ref s, new long[] { 1, i, l }));
                        c = new c4();
                        virt(i, ref c);
                        virt(ref i, new c4(), new c4(), new c2<string>());
                        virt(new int[] { 1, 2, 3 });
                        virt(new Exception[] { });
                        virt(new c1[] { new c4(), new c2<string>() });
                    }
                }
            }
        }

        // Overriden Abstract Methods
        public override int abst(ref string x, params int[] y)
        {
            Console.WriteLine("    c1.abst(ref string, params int[])");
            x = x.ToString(); y = new int[] { y[0] }; // Read, Write Ref + Paramarrays
            return 0;
        }

        public override int abst(ref string x, params long[] y)
        {
            Console.WriteLine("    c1.abst(ref string, params long[])");
            x = y[0].ToString(); y = null; // Read, Write Ref + Paramarrays
            return 1;
        }

        public override int abst(ref string x, long y, long z)
        {
            Console.WriteLine("    c1.abst(ref string, long, long)");
            x = z.ToString(); // Read, Write Ref
            return 2;
        }

        // Virtual Methods
        public virtual int virt(ref int x, c1 y, params c2<string>[] z)
        {
            Console.WriteLine("    c1.virt(ref int, c1, params c2<string>[])");
            x = x + x * 2; z = null; // Read, Write Ref + Paramarrays
            return 0;
        }

        public virtual c2<string> virt(int x, ref c1 y)
        {
            Console.WriteLine("    c1.virt(int, ref c1)");
            y = new c1(); // Read, Write Ref
            return new c4();
        }

        public virtual int virt(params object[] x)
        {
            Console.WriteLine("    c1.virt(params object[])");
            x = new object[] { 1, 2, null }; // Read, Write Paramarrays
            return new int();
        }

        public virtual int virt(params int[] x)
        {
            Console.WriteLine("    c1.virt(params int[])");
            x = new int[] { 0, 1 }; // Read, Write Paramarrays
            int i = x[0];
            return new int();
        }

        internal int foo(int x)
        {
            Console.WriteLine("    c1.foo(int)");

            // Read, Write Fields
            this.ui = 0u + this.ui;
            i = i - 1 * 2 + 3 / 1;
            this.i = 1;
            this.a = null; a = new c1(x);

            // Read, Write Locals
            bool b = true; string s = null;
            s = string.Empty;
            b = this.i != 1 + (2 - 3);
            s = "";
            c1 c = new c1(i, ui, new c1(this.i, this.ui, new c1(i)));
            c = this.a;
            b = b == true; s = s.ToString();

            // Read, Write Params
            x = (i - this.i) * i + (x / i);
            x = x.GetHashCode(); this.i = x;

            // Read, Write Array Element
            int[] a1 = new int[] { 1, 2, 3 };
            a1[1] = i; a1[2] = x;
            a1[1] = 1; a1[2] = 2;
            int i1 = a1[1] - a1[2];
            i1 = (a1[1] - (a1[2] + a1[1]));
            object o = i1;
            o = a1[2] + (a1[1] - a1[2]);

            return x;
        }

        public bool foo(object x)
        {
            Console.WriteLine("    c1.foo(object)");

            // Read, Write Fields
            ui = 0u;
            this.i = this.i - 1;
            a = null;
            uint ui1 = ui; int i1 = i;

            // Read, Write Locals
            bool b = true; string s = string.Empty;
            s = null; b = this.i != 1;
            ui = ui1; i = i1;
            bar4(b); this.foo(i1); bar4(b == (true != b));

            // Read, Write Params
            x = null; x = new c1(this.i, this.ui, a);
            this.bar4(x); this.bar4(x.GetHashCode() != (x.GetHashCode()));

            // Read, Write Array Element
            object[] a1 = new c1[3] { null, null, null };
            this.i = 1;
            a1[1] = null; a1[2] = new c1((i * i) / i, ui + (ui - ui), null);
            object o = null;
            o = a1[1]; this.bar4(a1[2]);

            if (b)
            {
                return b.GetHashCode() == this.i;
            }
            else
            {
                return b;
            }
        }

        private void bar1(string x)
        {
            Console.WriteLine("    c1.bar1(string)");

            // Read, Write Fields
            this.ui = 0u - 0u;
            i = this.i * 1;
            this.a = new c1();
            this.foo(i.GetHashCode()); this.a = this;

            // Read, Write Locals
            c1 c = new c1(1, 0u, (null));
            c = null; i = 1;
            c = new c1(i / i);
            c = this.a;
            this.ui = 1;
            c.ui = this.ui / ui;
            c.i = this.i + this.i;
            c.a = c;
            c.a = c = this.a = c.a = null;
            c = new c1(i.GetHashCode());
            this.foo(c.i); bar3(c != null);

            if (this.i == 10321)
            {
                return;
            }
            else
            {
            }

            // Read, Write Params
            x = null; this.bar4(x);

            // Read, Write Array Element
            string[] a1 = new string[] { "", null, null };
            a1[1] = null; a1[2] = "";
            string s = null;
            s = a1[1]; foo(a1[2]);
        }

        protected string bar2(object x)
        {
            Console.WriteLine("    c1.bar2(object)");

            // Read, Write Fields
            this.ui = ui - this.ui;
            i = i / 1;
            a = null;
            foo(i);

            // Read, Write Locals
            c1 c;
            object o;
            c = null; c = new c1(i / 2, ui * (2u), new c1(i / 2, ui * (2u), c));
            this.a = new c1(((1 + i) - 1));
            c = this.a;
            o = c;
            c.ui = this.ui;
            c.i = this.i * this.i;
            c.a = c; this.a = c.a;
            c.a = c = this.a = c.a = new c1(i, ui, new c1()); o = c.a = c;
            bar4(o.ToString()); this.bar4(c.a.a);

            // Read, Write Params
            x = c; x = o;
            o = x;

            // Read, Write Array Element
            object[] a1 = new c1[] { null, this.a, c };
            a1[1] = null; a1[2] = c;
            o = a1[1]; bar3(a1[2] != a1[1]);

            if (o == null)
            {
                return null;
            }
            else
            {
                return string.Empty;
            }
        }

        internal object bar3(bool x)
        {
            Console.WriteLine("    c1.bar3(bool)");

            // Read, Write Fields
            ui = ui - this.ui;
            i = i + 1;
            this.a = new c1(i, ui, a);

            // Read, Write Locals
            bool b = x;
            b = this.i > this.i + 1;

            // Read, Write Params
            x = (this.i == i + 1);
            foo(x.GetHashCode());

            // Read, Write Array Element
            bool[] a1 = new bool[] { true, false, x };
            a1[1] = x == (this.i != i - 1 + 1); a1[2] = x == (i >= this.i + 1 - 1);
            b = (a1[1]); b = a1[2];
            object o = b != a1[2];
            o = (a1[1].ToString()) == (a1[2].ToString());
            foo(a1[1].GetHashCode());

            if (b)
            {
                return this.i;
            }
            else
            {
                return a1[1];
            }
        }

        public c1 bar4(object x)
        {
            Console.WriteLine("    c1.bar4(object)");

            // Read, Write Fields
            ui = 0;
            this.ui = this.ui - (this.ui + this.ui) * this.ui;
            this.i = (i + 1) - (1 * (i / 1));
            this.a = (null);
            foo(this.i.GetHashCode());

            // Read, Write Locals
            object o = null;
            bool b = true;
            b = this.i <= this.i + 1 - 1;
            o = x;
            c1 c = new c1(i, this.ui, a);
            c.ui = (this.ui) + (this.ui) + c.ui;
            o = x = c;
            c.i = 1;
            c.i = this.i * (this.i / c.i + c.i);
            c.a = c = this.a = c.a = new c1(); c.a = c;
            foo(c.GetHashCode()); bar3(c.a.GetHashCode() != i);

            // Read, Write Params
            x = (o.ToString());
            x = x.ToString(); foo(x.GetHashCode()); foo(x.ToString().GetHashCode());

            // Read, Write Array Element
            object[] a1 = new object[] { (null), (this.a), c };
            a1[1] = ((this.a)); a1[2] = (c); a1[1] = (i);
            Array.Reverse(a1);
            o = a1[1]; foo(a1.GetHashCode()); bar3(a1[2] == null);

            if (b)
            {
                return this;
            }
            else if (!b)
            {
                return this.a;
            }
            else if (!b)
            {
                return new c1(i, ui, new c1(i + 1, ui - 1u, new c1(i + 2)));
            }
            else
            {
                return (c1)a1[2];
            }
        }
    }

    public class c2<T> : c1 // Inheritance, Generics
    {
        protected c1 c = new c1(0, 0, new c1(1, 1, new c1(2)));

        public void TEST()
        {
            // Nested Scopes
            byte b = 0;
            if (true)
            {
                sbyte sb = 0;
                if (!false)
                {
                    string s = "c2<T>.test()";
                    if (b == 0)
                    {
                        Console.WriteLine(s);
                        this.foo(x: b, y: sb); // Named Arguments
                    }
                }
                if (sb != 1)
                {
                    this.bar1(x: b, y: sb); // Named Arguments
                }
            }
            {
                sbyte sb2 = 0;
                if (b != 1)
                {
                    string s2 = "c2<T>.test()";
                    if (sb2 == 0)
                    {
                        Console.WriteLine(s2);
                        foo(x: b, y: sb2); // Named Arguments
                    }
                }
                if (b == sb2)
                {
                    bar2(x: b, y: sb2); // Named Arguments
                }
            }
            {
                c2<string> c = new c4();
                if (!(!true))
                {
                    // Method Calls - Ref, Paramarrays
                    // Overloaded Abstract Methods
                    int i = 1; long l = i; string s = "";
                    this.abst(ref s, 1, i);
                    c.abst(ref s, new int[] { 1, i, i });
                    c.abst(ref s, this.abst(ref s, l, l), l, l, l);

                    // Method Calls - Ref, Params
                    // Overloaded Virtual Methods
                    c1 a = c;
                    c.virt(i, c, new c2<string>[] { virt(i, ref a), new c4() });
                    virt(this.virt(i, ref a), c.virt(ref i, y: c, z: virt(i, ref a)));
                    virt(c.abst(ref s, l, l), this.abst(y: new long[] { 1, i, l }, x: ref s));
                    c = new c4();
                    virt(y: ref a, x: i);
                    virt(ref i, new c4(), new c4(), new c2<string>());
                    virt(new int[] { 1, 2, 3 });
                    virt(new Exception[] { });
                    virt(new c1[] { new c4(), new c2<string>() });
                }
            }
        }

        // Overriden Abstract Methods
        public override int abst(ref string x, params int[] y)
        {
            Console.WriteLine("    c2<T>.abst(ref string, params int[])");
            x = y[0].ToString(); y = null; // Read, Write Ref + Paramarrays
            return 0;
        }

        public override int abst(ref string x, params long[] y)
        {
            Console.WriteLine("    c2<T>.abst(ref string, params long[])");
            x = y[0].ToString(); y = null; // Read, Write Ref + Paramarrays
            return 1;
        }

        // Overriden Virtual Methods
        public override int virt(ref int x, c1 y, params c2<string>[] z)
        {
            Console.WriteLine("    c2<T>.virt(ref int, c1, params c2<string>[])");
            x = 0; x = y.GetHashCode(); z = null; // Read, Write Ref + Paramarrays
            return 0;
        }

        public override c2<string> virt(int x, ref c1 y)
        {
            Console.WriteLine("    c2<T>.virt(int, ref c1)");
            x.ToString(); y = new c1(x, (uint)x, y); // Read, Write Ref
            return new c2<string>();
        }

        public override int virt(params object[] x)
        {
            Console.WriteLine("    c2<T>.virt(params object[])");
            x.ToString(); x = null; // Read, Write Paramarrays
            return new int();
        }

        private void bar(T x)
        {
            Console.WriteLine("    c2<T>.bar(T)");

            // Read, Write Params
            T y = x;
            x = y;

            // Read Consts
            const string const1 = "";
            if (!false)
            {
                const int const2 = 1;
                const c1 const3 = null;
                if (true)
                {
                    this.bar4(const1); c.foo(const2 != const2); this.a = const3;
                }
            }
        }

        private T foo1(T x)
        {
            Console.WriteLine("    c2<T>.foo1(T)");

            int aa = 1;

            // Read, Write Params
            T y = x;
            x = y; bar(x);

            // Read Consts
            const long const1 = 1;
            const uint const2 = 1;
            while (const1 < const2 - aa)
            {
                continue;
            }

            while (const2 == const1 - aa + aa)
            {
                this.bar4(const1); c.foo(const2 != const2);
                return x;
            }
            return x;
        }

        private bool foo(bool x)
        {
            Console.WriteLine("    c2<T>.foo(bool)");

            int aa = 1;

            // Read, Write Params
            x = x.ToString() == x.ToString(); a = c; a = this;

            // Read Consts
            const long const1 = 1;
            const uint const2 = 1;
            while (const1 < const1 - aa)
            {
                continue;
            }

            while (const2 == const2 - aa + aa)
            {
                return x;
            }
            return x;
        }

        protected c1 foo(byte x, object y)
        {
            Console.WriteLine("    c2<T>.foo(byte, object)");

            // Read, Write Params
            y = x; x = 1;
            c1 c = new c1();
            c.bar4(y); c.foo(x);

            // Read Consts
            const string const1 = "";
            bool b = false;
            if (!b)
            {
                const int const2 = 1;
                object o = y;
                while (y == o)
                {
                    const c1 const3 = null;
                    byte bb = 1;
                    if (bb == x)
                    {
                        this.bar4(const1); this.foo(const2 != const2); this.a = const3;
                        break;
                    }
                    else
                    {
                        return const3;
                    }
                }
                return c;
            }
            return null;
        }

        internal void bar1(byte x, object y)
        {
            Console.WriteLine("    c2<T>.bar1(byte, object)");

            // Read, Write Params
            y = x; x = 1;
            c1 c = new c1();
            c.bar4(y); c.foo(x);

            // Read Consts
            const long const1 = 1;
            const uint const2 = 1;
            while (const1 != x) continue;

            while (const2 == const2)
            {
                this.bar4(const1); this.foo(const2 != const2);
                break;
            }
        }

        public int bar2(byte x, object y)
        {
            Console.WriteLine("    c2<T>.bar2(byte, object)");

            // Read, Write Params
            y = x; x = 1;
            c1 c = new c1();
            c.bar4(y); this.foo(x);

            // Read Consts
            const long const1 = 1;
            if (!false)
            {
                const sbyte const2 = 1;
                const c1 const3 = null;
                if (c != const3)
                {
                    c.bar4(const1); this.foo(const2 != const2); this.a = const3;
                }
            }
            return (int)const1;
        }

        internal float bar3(byte x, object y)
        {
            Console.WriteLine("    c2<T>.bar3(byte, object)");

            // Read, Write Params
            y = x; x = 1;
            double d = 1.1;
            c1 c = new c1();
            this.bar4(y); c.foo(x);

            // Read Consts
            const string const1 = "hi";
            bool b = !false;
            if (b)
            {
                const byte const2 = 1;
                const c1 const3 = null;
                if (const3 != c)
                {
                    this.bar4(const1); c.foo(const2 != const2); c.a = const3;
                    return (float)d;
                }
                return (float)(1.1f + (float)1.1);
            }
            return (float)d + (float)1.1;
        }
    }

    public class c3<T, U> // Generics
    {
        public static void test()
        {
            string s = "c3<T>.test()";
            {
                Console.WriteLine(s);
                foo(); foo(1); foo("1"); foo(1.1); // Overload Resolution, Implicit Conversions
            }
            // Nested Scopes
            {
                sbyte sb1 = 0;
                if (s != "")
                {
                    while (sb1 == 0)
                    {
                        byte b = 0;
                        c2<string> a = new c2<string>();
                        a.bar1(b, sb1);
                        sb1 = 1;
                        if (sb1 == 1) break;
                        else continue;
                    }
                }
                while (sb1 != 0)
                {
                    byte b = 1;
                    c2<string> a = new c2<string>();
                    a.bar1(b, sb1);
                    sb1 = 0;
                    if (sb1 == 1) break;
                    else continue;
                }
            }
            // Nested Scopes
            {
                sbyte sb2 = 0;
                while (sb2 < 2)
                {
                    sb2 = 3;
                    while (sb2 > 0)
                    {
                        sb2 = 0;
                        byte b = 1;
                        c2<int> a = new c2<int>();
                        a.bar2(b, sb2);
                    }
                    sb2 = 3;
                }
                if (sb2 >= 3)
                {
                    byte b = 0;
                    c2<int> a = new c2<int>();
                    a.bar2(b, sb2);
                }
            }
            // Nested Scopes
            {
                sbyte sb3 = 0;
                while (!string.IsNullOrEmpty(s))
                {
                    byte b = 1;
                    s = null;
                    if (sb3 != -20)
                    {
                        c2<bool> a = new c2<bool>();
                        a.bar3(b, sb3);
                    }
                    if (s != null) break;
                }
                while (s == null)
                {
                    byte b = 0;
                    if (s != null)
                    {
                        b = 1; continue;
                    }
                    c2<bool> a = new c2<bool>();
                    a.bar3(b, sb3);
                    s = "";
                    return;
                }
            }
        }

        // Static Methods
        protected static int foo(T x, U y)
        {
            Console.WriteLine("    c3<T, U>.foo(T, U)");
            int[] a = new int[3] { 1, 2, 3 }; a[1] = a[2];
            return (int)((long)x.GetHashCode() + (long)(int)(long)y.GetHashCode());
        }

        internal static c1 foo(object x)
        {
            Console.WriteLine("    c3<T, U>.foo(object)");
            c1[] a = new c1[3] { null, new c1(), new c1(1) }; a[1] = a[2];
            x = "hi";
            return new c1((int)1.1f, (uint)1, new c1(x.GetHashCode()));
        }

        private static float foo(string x)
        {
            Console.WriteLine("    c3<T, U>.foo(string)");
            string[] a = new string[] { x, x, "", null }; a[1] = a[2]; a[2] = a[1];
            return (float)foo(x.GetHashCode());
        }

        public static int foo(int x)
        {
            Console.WriteLine("    c3<T, U>.foo(int)");
            int[] a = new int[] { x, x, 1, 0 }; a[1] = a[2]; a[2] = a[1];
            return (int)x.GetHashCode() + x;
        }

        public static string foo()
        {
            Console.WriteLine("    c3<T, U>.foo()");
            string[] a = new string[] { "", null }; a[0] = a[1]; a[1] = a[0];
            return (string)null;
        }

        // Instance Methods
        protected int bar(T x, U y)
        {
            Console.WriteLine("    c3<T, U>.bar(T, U)");
            int[] a = new int[3] { 1, 2, 3 }; a[1] = a[2];
            return (int)((long)1 + (long)(int)(long)2);
        }

        public c1 bar(object x)
        {
            Console.WriteLine("    c3<T, U>.bar(object)");
            c1[] a = new c1[3] { null, new c1(), new c1(1) }; a[1] = a[2];
            return new c1((int)1.1f, (uint)1, new c1(x.GetHashCode()));
        }

        public float bar(string x)
        {
            Console.WriteLine("    c3<T, U>.bar(string)");
            string[] a = new string[] { x, x, "", null }; a[1] = a[2]; a[2] = a[1];
            x = a[2];
            return (float)foo(x.GetHashCode());
        }

        public int bar(int x)
        {
            Console.WriteLine("    c3<T, U>.bar(int)");
            int[] a = new int[] { x, x, 1, 0 }; a[1] = a[2]; a[2] = a[1];
            return (int)x.GetHashCode() + x;
        }

        public string bar()
        {
            Console.WriteLine("    c3<T, U>.bar()");
            string[] a = new string[] { "", null }; a[0] = a[1]; a[1] = a[0];
            return (string)null;
        }
    }

    public class c4 : c2<string> // Inheritance
    {
        public static bool b = true;
        public static byte b1 = 0;
        public static sbyte sb = 1;

        private static short s = 4;
        private static ushort us = 5;
        private static long l = 6;
        private static ulong ul = 7;

        public static bool Test()
        {
            string str = "c4.Test()";
            {
                int i = 2;
                Console.WriteLine(str);
                {
                    c1 a = new c1(i); a.foo(i);
                }
                double d = 1.1;
                {
                    sbyte sb = 1;
                    c1 a = new c1(i + (i + i));
                    a.foo(sb);
                    {
                        a.foo(d);
                    }
                }

                // Nested Scopes
                {
                    object o = i;
                    bool b = false;
                    if (!b)
                    {
                        byte b1 = 1;
                        string s_ = "    This is a test";
                        while (!b)
                        {
                            if (true) b = true;
                            Console.WriteLine(s_);
                            while (b)
                            {
                                if (true) b = false;
                                object oo = i;
                                bool bb = b;
                                if (!bb)
                                {
                                    if (!false) bb = true;
                                    byte b11 = b1;
                                    string ss = s_;
                                    if (bb)
                                    {
                                        Console.WriteLine(ss);
                                        if (bb != b)
                                        {
                                            object ooo = i;
                                            bool bbb = bb;
                                            if (bbb == true)
                                            {
                                                byte b111 = b11;
                                                string sss = ss;
                                                while (bbb)
                                                {
                                                    Console.WriteLine(sss);
                                                    bbb = false;

                                                    // Method Calls - Ref, Paramarrays
                                                    // Overloaded Abstract Methods
                                                    long l = i;
                                                    c4 c = new c4();
                                                    c.abst(ref s_, 1, i);
                                                    c.abst(ref s_, new int[] { 1, i, i });
                                                    c.abst(ref s_, c.abst(ref s_, l, l), l, l, l);

                                                    // Method Calls - Ref, Paramarrays
                                                    // Overloaded Virtual Methods
                                                    c1 a = new c4();
                                                    c.virt(i, c, new c2<string>[] { c.virt(i, ref a), new c4() });
                                                    c.virt(c.virt(i, ref a), c.virt(ref i, c, c.virt(i, ref a)));
                                                    c.
                                                      virt(
                                                           c.
                                                             abst(ref s_,
                                                                 l,
                                                                 l),
                                                           c.
                                                             abst(ref s_,
                                                                  new long[] {1, 
                                                                              i, 
                                                                              l})
                                                           );
                                                    c.virt(i, ref a);
                                                    c.virt(ref i,
                                                           new c4(),
                                                           new c4(),
                                                           new c2<string>()
                                                           );
                                                    c.virt(new int[] { 1, 2, 3 });
                                                    c.virt(new Exception[] { });
                                                    c.virt(new c1[] { new c4(), new c2<string>() });
                                                    s = (short)us;
                                                    if (true) continue;
                                                }
                                            }
                                            else if (bbb != true)
                                            {
                                                Console.WriteLine("Error - Should not have reached here");
                                                o = i; o = us;
                                                return (bool)o;
                                            }
                                            else if (bbb == false)
                                            {
                                                Console.WriteLine("Error - Should not have reached here");
                                                o = i; o = l;
                                                return (bool)o;

                                            }
                                            else
                                            {
                                                Console.WriteLine("Error - Should not have reached here");
                                                o = b; o = ul;
                                                return (bool)o;
                                            }
                                        }
                                    }
                                    else if (!b)
                                    {
                                        Console.WriteLine("Error - Should not have reached here");
                                        object o1 = b;
                                        return (bool)o1;
                                    }
                                    else
                                    {
                                        Console.WriteLine("Error - Should not have reached here");
                                        object o1 = b;
                                        return (bool)o1;
                                    }
                                }
                                else if (!bb)
                                {
                                    Console.WriteLine("Error - Should not have reached here");
                                    o = b;
                                    return (bool)o;
                                }
                                else
                                {
                                    Console.WriteLine("Error - Should not have reached here");
                                    object o1 = b;
                                    return (bool)o1;
                                }
                                while (b != false)
                                {
                                    b = false; break;
                                }
                                break;
                            }
                            while (b != true)
                            {
                                b = true; continue;
                            }
                        }
                    }
                    else if (b)
                    {
                        Console.WriteLine("Error - Should not have reached here");
                        return b;
                    }
                    else
                    {
                        Console.WriteLine("Error - Should not have reached here");
                        return (bool)b != true;
                    }
                }
            }
            return false;
        }

        // Non-Overloaded Method
        public static c4 foo(int i, string s, bool b, byte b1, long l, string s1)
        {
            Console.WriteLine("    c4.foo(int, string, bool, byte, long, string)");
            return new c4();
        }

        // Non-Overloaded Method
        internal static c5 bar(short s, ushort us, sbyte sb, float f, double d, double d1, float f1)
        {
            Console.WriteLine("    c4.bar(short, ushort, sbyte, float, double, double, float)");
            return new c5();
        }

        public class c5 : c3<string, c1> // Nested Class, Inheritance
        {
            internal static float f = 8.0f;
            internal static double d = 9.0;
            internal static string s1 = "Test";
            internal static object o = null;

            public int Test()
            {
                int i = 1; string s = "1"; bool b = true;
                short sh = 1; ushort us = 1; object o = i;
                c5 cc = new c5();
                Console.WriteLine("c5.test");
                {
                    uint ui = 1; o = ui;
                    i = sh; b = false; us = 1;
                    // Nested Scopes
                    if (true)
                    {
                        byte b1 = 1; long l = i; string s1 = s;
                        float f = 1.2f; o = f; l = ui;
                        c4.foo(sh, s, b, b1, i, s1); // Implicit Conversions
                        c4 c = new c4();
                        c.foo(sh); this.bar(sh);
                        cc.bar(c5.foo(cc.bar()));
                        c5.foo(cc.bar(c5.foo()));
                        if (b == false)
                        {
                            double d = f; ulong ul = 1; sbyte sb = 1; s1 = s;
                            c4.bar(sh, us, sb, f, d, ui, ul); // Implicit Conversions
                            c.bar4(us);
                            this.bar(cc.bar(), c);
                            c5.foo(this.bar(c5.foo(), c));
                        }
                        if (b1 >= l)
                        {
                            uint ui1 = 1; o = ui1;
                            i = sh; b = false; us = 1;
                            while (i != 1000)
                            {
                                byte b11 = 1; long l1 = i; string s11 = s1;
                                float f1 = 1.2f; o = f1; l1 = ui1;
                                c4.foo(sh, s1, b, b11, i, s11); // Implicit Conversions
                                c.foo(b);
                                this.bar(b); if (c5.foo() != null) c5.foo().ToString().GetHashCode();
                                cc.bar(this.bar(c5.foo()));

                                if (!false)
                                {
                                    double d1 = f1; ulong ul1 = 1; sbyte sb1 = 1; s1 = s;
                                    c4.bar(sh, us, sb1, f1, d1, ui1, ul1); // Implicit Conversions
                                    c.foo(b1, sb1);
                                    this.bar(o).bar4(c);
                                    cc.bar(c5.foo(o)).bar4(c).ToString();
                                    d1 = d;
                                    if (d != d1) return i;
                                }
                                if (i != 1000)
                                {
                                    uint ui2 = 1; o = ui2;
                                    i = sh; b = false; us = 1;
                                    {
                                        byte b12 = 1; long l2 = i; string s12 = s11;
                                        float f2 = 1.2f; o = f1; l2 = ui1;
                                        c4.foo(sh, s1, b, b12, i, s12); // Implicit Conversions
                                        c.bar4(b.ToString() == b.ToString());
                                        this.bar(c5.foo(cc.bar(i)));
                                        {
                                            double d2 = f2; ulong ul2 = 1; sbyte sb2 = 1; s1 = s;
                                            c4.bar(sh, us, sb2, f2, d2, ui2, ul2); // Implicit Conversions
                                            c.foo(false == true != false == b);
                                            c.bar4(sh > us == sh <= us);
                                            this.bar((object)c5.foo((object)cc.bar((object)i)));
                                            if (i != i +
                                                1 -
                                                1)
                                                return i -
                                                (int)b12;
                                        }
                                        if (i <=
                                              1000) break;
                                    }
                                }
                                if (i <=
                                      1000)
                                    i = 1000;
                                return sh;
                            }
                        }
                    }
                }
                return (int)sh;
            }
        }
    }
}


namespace ns7
{
    public class Test
    {
        public static void Run()
        {
            c1 a = new c1(); a.test();

            c2<string> b = new c2<string>(); b.TEST();

            c3<string, string>.test();

            c4.Test();

            c4.c5 d = new c4.c5(); d.Test();
        }
    }

    // Abstract Class
    public abstract class c0
    {
        // Abstract Methods
        public abstract int abst(ref string x, params int[] y);

        public abstract int abst(ref string x, params long[] y);

        public abstract int abst(ref string x, long y, long z);
    }

    public class c1 : c0 // Inheritance
    {
        private int i = 2;
        internal uint ui = 3;
        public c1 a = null;

        // Overloaded Constructors
        public c1()
        {
            i = 2; this.ui = 3;
        }

        public c1(int x)
        {
            i = x; this.ui = 3; this.a = new c1(this.i, this.ui, this.a);
        }

        public c1(int x, uint y, c1 c)
        {
            this.i = x; ui = y; a = new c1();
        }

        public void test()
        {
            int i = 2;
            bool b = true;

            // Nested Scopes
            if (b)
            {
                object o = i;
                b = false;
                {
                    byte b1 = 1;
                    string s = "c1.test()";
                    {
                        Console.WriteLine(s);
                        this.foo(o); foo(i); this.foo(b); this.foo(b1); // Overload Resolution, Implicit Conversions
                    }
                }
            }
            // Nested Scopes
            if (!b)
            {
                object o = i;
                b = false;
                if (true)
                {
                    byte b1 = 1;
                    string s = "c1.test()";
                    {
                        Console.WriteLine(s);
                        bar2(o); this.bar2(i); this.bar2(b1); bar1(s); // Non-Overloaded Methods, Implicit Conversions
                    }
                }
            }
            // Nested Scopes
            if (!false)
            {
                object o = i;
                b = false;
                {
                    byte b1 = 1;
                    string s = "c1.test()";
                    {
                        Console.WriteLine(s);
                        this.bar4(o); this.bar4(i); this.bar4(b1); this.bar3(b); // Non-Overloaded Methods, Implicit Conversions
                    }
                }
            }

            if (!false)
            {
                object o = i;
                b = false;
                {
                    string s = "c1.test()";
                    {
                        Console.WriteLine(s);

                        // Method Calls - Ref, Paramarrays
                        // Overloaded Abstract Methods
                        c1 c = new c1(); long l = 1;
                        this.abst(ref s, 1, i);
                        c.abst(ref s, new int[] { 1, i, i });
                        c.abst(ref s, this.abst(ref s, l, l), l, l, l);

                        // Method Calls - Ref, Paramarrays
                        // Overloaded Virtual Methods
                        c.virt(i, c, new c2<string>[] { virt(i, ref c), new c4() });
                        virt(this.virt(i, ref c), c.virt(ref i, c, virt(i, ref c)));
                        virt(c.abst(ref s, l, l), this.abst(ref s, new long[] { 1, i, l }));
                        c = new c4();
                        virt(i, ref c);
                        virt(ref i, new c4(), new c4(), new c2<string>());
                        virt(new int[] { 1, 2, 3 });
                        virt(new Exception[] { });
                        virt(new c1[] { new c4(), new c2<string>() });
                    }
                }
            }
        }

        // Overriden Abstract Methods
        public override int abst(ref string x, params int[] y)
        {
            Console.WriteLine("    c1.abst(ref string, params int[])");
            x = x.ToString(); y = new int[] { y[0] }; // Read, Write Ref + Paramarrays
            return 0;
        }

        public override int abst(ref string x, params long[] y)
        {
            Console.WriteLine("    c1.abst(ref string, params long[])");
            x = y[0].ToString(); y = null; // Read, Write Ref + Paramarrays
            return 1;
        }

        public override int abst(ref string x, long y, long z)
        {
            Console.WriteLine("    c1.abst(ref string, long, long)");
            x = z.ToString(); // Read, Write Ref
            return 2;
        }

        // Virtual Methods
        public virtual int virt(ref int x, c1 y, params c2<string>[] z)
        {
            Console.WriteLine("    c1.virt(ref int, c1, params c2<string>[])");
            x = x + x * 2; z = null; // Read, Write Ref + Paramarrays
            return 0;
        }

        public virtual c2<string> virt(int x, ref c1 y)
        {
            Console.WriteLine("    c1.virt(int, ref c1)");
            y = new c1(); // Read, Write Ref
            return new c4();
        }

        public virtual int virt(params object[] x)
        {
            Console.WriteLine("    c1.virt(params object[])");
            x = new object[] { 1, 2, null }; // Read, Write Paramarrays
            return new int();
        }

        public virtual int virt(params int[] x)
        {
            Console.WriteLine("    c1.virt(params int[])");
            x = new int[] { 0, 1 }; // Read, Write Paramarrays
            int i = x[0];
            return new int();
        }

        internal int foo(int x)
        {
            Console.WriteLine("    c1.foo(int)");

            // Read, Write Fields
            this.ui = 0u + this.ui;
            i = i - 1 * 2 + 3 / 1;
            this.i = 1;
            this.a = null; a = new c1(x);

            // Read, Write Locals
            bool b = true; string s = null;
            s = string.Empty;
            b = this.i != 1 + (2 - 3);
            s = "";
            c1 c = new c1(i, ui, new c1(this.i, this.ui, new c1(i)));
            c = this.a;
            b = b == true; s = s.ToString();

            // Read, Write Params
            x = (i - this.i) * i + (x / i);
            x = x.GetHashCode(); this.i = x;

            // Read, Write Array Element
            int[] a1 = new int[] { 1, 2, 3 };
            a1[1] = i; a1[2] = x;
            a1[1] = 1; a1[2] = 2;
            int i1 = a1[1] - a1[2];
            i1 = (a1[1] - (a1[2] + a1[1]));
            object o = i1;
            o = a1[2] + (a1[1] - a1[2]);

            return x;
        }

        public bool foo(object x)
        {
            Console.WriteLine("    c1.foo(object)");

            // Read, Write Fields
            ui = 0u;
            this.i = this.i - 1;
            a = null;
            uint ui1 = ui; int i1 = i;

            // Read, Write Locals
            bool b = true; string s = string.Empty;
            s = null; b = this.i != 1;
            ui = ui1; i = i1;
            bar4(b); this.foo(i1); bar4(b == (true != b));

            // Read, Write Params
            x = null; x = new c1(this.i, this.ui, a);
            this.bar4(x); this.bar4(x.GetHashCode() != (x.GetHashCode()));

            // Read, Write Array Element
            object[] a1 = new c1[3] { null, null, null };
            this.i = 1;
            a1[1] = null; a1[2] = new c1((i * i) / i, ui + (ui - ui), null);
            object o = null;
            o = a1[1]; this.bar4(a1[2]);

            if (b)
            {
                return b.GetHashCode() == this.i;
            }
            else
            {
                return b;
            }
        }

        private void bar1(string x)
        {
            Console.WriteLine("    c1.bar1(string)");

            // Read, Write Fields
            this.ui = 0u - 0u;
            i = this.i * 1;
            this.a = new c1();
            this.foo(i.GetHashCode()); this.a = this;

            // Read, Write Locals
            c1 c = new c1(1, 0u, (null));
            c = null; i = 1;
            c = new c1(i / i);
            c = this.a;
            this.ui = 1;
            c.ui = this.ui / ui;
            c.i = this.i + this.i;
            c.a = c;
            c.a = c = this.a = c.a = null;
            c = new c1(i.GetHashCode());
            this.foo(c.i); bar3(c != null);

            if (this.i == 10321)
            {
                return;
            }
            else
            {
            }

            // Read, Write Params
            x = null; this.bar4(x);

            // Read, Write Array Element
            string[] a1 = new string[] { "", null, null };
            a1[1] = null; a1[2] = "";
            string s = null;
            s = a1[1]; foo(a1[2]);
        }

        protected string bar2(object x)
        {
            Console.WriteLine("    c1.bar2(object)");

            // Read, Write Fields
            this.ui = ui - this.ui;
            i = i / 1;
            a = null;
            foo(i);

            // Read, Write Locals
            c1 c;
            object o;
            c = null; c = new c1(i / 2, ui * (2u), new c1(i / 2, ui * (2u), c));
            this.a = new c1(((1 + i) - 1));
            c = this.a;
            o = c;
            c.ui = this.ui;
            c.i = this.i * this.i;
            c.a = c; this.a = c.a;
            c.a = c = this.a = c.a = new c1(i, ui, new c1()); o = c.a = c;
            bar4(o.ToString()); this.bar4(c.a.a);

            // Read, Write Params
            x = c; x = o;
            o = x;

            // Read, Write Array Element
            object[] a1 = new c1[] { null, this.a, c };
            a1[1] = null; a1[2] = c;
            o = a1[1]; bar3(a1[2] != a1[1]);

            if (o == null)
            {
                return null;
            }
            else
            {
                return string.Empty;
            }
        }

        internal object bar3(bool x)
        {
            Console.WriteLine("    c1.bar3(bool)");

            // Read, Write Fields
            ui = ui - this.ui;
            i = i + 1;
            this.a = new c1(i, ui, a);

            // Read, Write Locals
            bool b = x;
            b = this.i > this.i + 1;

            // Read, Write Params
            x = (this.i == i + 1);
            foo(x.GetHashCode());

            // Read, Write Array Element
            bool[] a1 = new bool[] { true, false, x };
            a1[1] = x == (this.i != i - 1 + 1); a1[2] = x == (i >= this.i + 1 - 1);
            b = (a1[1]); b = a1[2];
            object o = b != a1[2];
            o = (a1[1].ToString()) == (a1[2].ToString());
            foo(a1[1].GetHashCode());

            if (b)
            {
                return this.i;
            }
            else
            {
                return a1[1];
            }
        }

        public c1 bar4(object x)
        {
            Console.WriteLine("    c1.bar4(object)");

            // Read, Write Fields
            ui = 0;
            this.ui = this.ui - (this.ui + this.ui) * this.ui;
            this.i = (i + 1) - (1 * (i / 1));
            this.a = (null);
            foo(this.i.GetHashCode());

            // Read, Write Locals
            object o = null;
            bool b = true;
            b = this.i <= this.i + 1 - 1;
            o = x;
            c1 c = new c1(i, this.ui, a);
            c.ui = (this.ui) + (this.ui) + c.ui;
            o = x = c;
            c.i = 1;
            c.i = this.i * (this.i / c.i + c.i);
            c.a = c = this.a = c.a = new c1(); c.a = c;
            foo(c.GetHashCode()); bar3(c.a.GetHashCode() != i);

            // Read, Write Params
            x = (o.ToString());
            x = x.ToString(); foo(x.GetHashCode()); foo(x.ToString().GetHashCode());

            // Read, Write Array Element
            object[] a1 = new object[] { (null), (this.a), c };
            a1[1] = ((this.a)); a1[2] = (c); a1[1] = (i);
            Array.Reverse(a1);
            o = a1[1]; foo(a1.GetHashCode()); bar3(a1[2] == null);

            if (b)
            {
                return this;
            }
            else if (!b)
            {
                return this.a;
            }
            else if (!b)
            {
                return new c1(i, ui, new c1(i + 1, ui - 1u, new c1(i + 2)));
            }
            else
            {
                return (c1)a1[2];
            }
        }
    }

    public class c2<T> : c1 // Inheritance, Generics
    {
        protected c1 c = new c1(0, 0, new c1(1, 1, new c1(2)));

        public void TEST()
        {
            // Nested Scopes
            byte b = 0;
            if (true)
            {
                sbyte sb = 0;
                if (!false)
                {
                    string s = "c2<T>.test()";
                    if (b == 0)
                    {
                        Console.WriteLine(s);
                        this.foo(x: b, y: sb); // Named Arguments
                    }
                }
                if (sb != 1)
                {
                    this.bar1(x: b, y: sb); // Named Arguments
                }
            }
            {
                sbyte sb2 = 0;
                if (b != 1)
                {
                    string s2 = "c2<T>.test()";
                    if (sb2 == 0)
                    {
                        Console.WriteLine(s2);
                        foo(x: b, y: sb2); // Named Arguments
                    }
                }
                if (b == sb2)
                {
                    bar2(x: b, y: sb2); // Named Arguments
                }
            }
            {
                c2<string> c = new c4();
                if (!(!true))
                {
                    // Method Calls - Ref, Paramarrays
                    // Overloaded Abstract Methods
                    int i = 1; long l = i; string s = "";
                    this.abst(ref s, 1, i);
                    c.abst(ref s, new int[] { 1, i, i });
                    c.abst(ref s, this.abst(ref s, l, l), l, l, l);

                    // Method Calls - Ref, Params
                    // Overloaded Virtual Methods
                    c1 a = c;
                    c.virt(i, c, new c2<string>[] { virt(i, ref a), new c4() });
                    virt(this.virt(i, ref a), c.virt(ref i, y: c, z: virt(i, ref a)));
                    virt(c.abst(ref s, l, l), this.abst(y: new long[] { 1, i, l }, x: ref s));
                    c = new c4();
                    virt(y: ref a, x: i);
                    virt(ref i, new c4(), new c4(), new c2<string>());
                    virt(new int[] { 1, 2, 3 });
                    virt(new Exception[] { });
                    virt(new c1[] { new c4(), new c2<string>() });
                }
            }
        }

        // Overriden Abstract Methods
        public override int abst(ref string x, params int[] y)
        {
            Console.WriteLine("    c2<T>.abst(ref string, params int[])");
            x = y[0].ToString(); y = null; // Read, Write Ref + Paramarrays
            return 0;
        }

        public override int abst(ref string x, params long[] y)
        {
            Console.WriteLine("    c2<T>.abst(ref string, params long[])");
            x = y[0].ToString(); y = null; // Read, Write Ref + Paramarrays
            return 1;
        }

        // Overriden Virtual Methods
        public override int virt(ref int x, c1 y, params c2<string>[] z)
        {
            Console.WriteLine("    c2<T>.virt(ref int, c1, params c2<string>[])");
            x = 0; x = y.GetHashCode(); z = null; // Read, Write Ref + Paramarrays
            return 0;
        }

        public override c2<string> virt(int x, ref c1 y)
        {
            Console.WriteLine("    c2<T>.virt(int, ref c1)");
            x.ToString(); y = new c1(x, (uint)x, y); // Read, Write Ref
            return new c2<string>();
        }

        public override int virt(params object[] x)
        {
            Console.WriteLine("    c2<T>.virt(params object[])");
            x.ToString(); x = null; // Read, Write Paramarrays
            return new int();
        }

        private void bar(T x)
        {
            Console.WriteLine("    c2<T>.bar(T)");

            // Read, Write Params
            T y = x;
            x = y;

            // Read Consts
            const string const1 = "";
            if (!false)
            {
                const int const2 = 1;
                const c1 const3 = null;
                if (true)
                {
                    this.bar4(const1); c.foo(const2 != const2); this.a = const3;
                }
            }
        }

        private T foo1(T x)
        {
            Console.WriteLine("    c2<T>.foo1(T)");

            int aa = 1;

            // Read, Write Params
            T y = x;
            x = y; bar(x);

            // Read Consts
            const long const1 = 1;
            const uint const2 = 1;
            while (const1 < const2 - aa)
            {
                continue;
            }

            while (const2 == const1 - aa + aa)
            {
                this.bar4(const1); c.foo(const2 != const2);
                return x;
            }
            return x;
        }

        private bool foo(bool x)
        {
            Console.WriteLine("    c2<T>.foo(bool)");

            int aa = 1;

            // Read, Write Params
            x = x.ToString() == x.ToString(); a = c; a = this;

            // Read Consts
            const long const1 = 1;
            const uint const2 = 1;
            while (const1 < const1 - aa)
            {
                continue;
            }

            while (const2 == const2 - aa + aa)
            {
                return x;
            }
            return x;
        }

        protected c1 foo(byte x, object y)
        {
            Console.WriteLine("    c2<T>.foo(byte, object)");

            // Read, Write Params
            y = x; x = 1;
            c1 c = new c1();
            c.bar4(y); c.foo(x);

            // Read Consts
            const string const1 = "";
            bool b = false;
            if (!b)
            {
                const int const2 = 1;
                object o = y;
                while (y == o)
                {
                    const c1 const3 = null;
                    byte bb = 1;
                    if (bb == x)
                    {
                        this.bar4(const1); this.foo(const2 != const2); this.a = const3;
                        break;
                    }
                    else
                    {
                        return const3;
                    }
                }
                return c;
            }
            return null;
        }

        internal void bar1(byte x, object y)
        {
            Console.WriteLine("    c2<T>.bar1(byte, object)");

            // Read, Write Params
            y = x; x = 1;
            c1 c = new c1();
            c.bar4(y); c.foo(x);

            // Read Consts
            const long const1 = 1;
            const uint const2 = 1;
            while (const1 != x) continue;

            while (const2 == const2)
            {
                this.bar4(const1); this.foo(const2 != const2);
                break;
            }
        }

        public int bar2(byte x, object y)
        {
            Console.WriteLine("    c2<T>.bar2(byte, object)");

            // Read, Write Params
            y = x; x = 1;
            c1 c = new c1();
            c.bar4(y); this.foo(x);

            // Read Consts
            const long const1 = 1;
            if (!false)
            {
                const sbyte const2 = 1;
                const c1 const3 = null;
                if (c != const3)
                {
                    c.bar4(const1); this.foo(const2 != const2); this.a = const3;
                }
            }
            return (int)const1;
        }

        internal float bar3(byte x, object y)
        {
            Console.WriteLine("    c2<T>.bar3(byte, object)");

            // Read, Write Params
            y = x; x = 1;
            double d = 1.1;
            c1 c = new c1();
            this.bar4(y); c.foo(x);

            // Read Consts
            const string const1 = "hi";
            bool b = !false;
            if (b)
            {
                const byte const2 = 1;
                const c1 const3 = null;
                if (const3 != c)
                {
                    this.bar4(const1); c.foo(const2 != const2); c.a = const3;
                    return (float)d;
                }
                return (float)(1.1f + (float)1.1);
            }
            return (float)d + (float)1.1;
        }
    }

    public class c3<T, U> // Generics
    {
        public static void test()
        {
            string s = "c3<T>.test()";
            {
                Console.WriteLine(s);
                foo(); foo(1); foo("1"); foo(1.1); // Overload Resolution, Implicit Conversions
            }
            // Nested Scopes
            {
                sbyte sb1 = 0;
                if (s != "")
                {
                    while (sb1 == 0)
                    {
                        byte b = 0;
                        c2<string> a = new c2<string>();
                        a.bar1(b, sb1);
                        sb1 = 1;
                        if (sb1 == 1) break;
                        else continue;
                    }
                }
                while (sb1 != 0)
                {
                    byte b = 1;
                    c2<string> a = new c2<string>();
                    a.bar1(b, sb1);
                    sb1 = 0;
                    if (sb1 == 1) break;
                    else continue;
                }
            }
            // Nested Scopes
            {
                sbyte sb2 = 0;
                while (sb2 < 2)
                {
                    sb2 = 3;
                    while (sb2 > 0)
                    {
                        sb2 = 0;
                        byte b = 1;
                        c2<int> a = new c2<int>();
                        a.bar2(b, sb2);
                    }
                    sb2 = 3;
                }
                if (sb2 >= 3)
                {
                    byte b = 0;
                    c2<int> a = new c2<int>();
                    a.bar2(b, sb2);
                }
            }
            // Nested Scopes
            {
                sbyte sb3 = 0;
                while (!string.IsNullOrEmpty(s))
                {
                    byte b = 1;
                    s = null;
                    if (sb3 != -20)
                    {
                        c2<bool> a = new c2<bool>();
                        a.bar3(b, sb3);
                    }
                    if (s != null) break;
                }
                while (s == null)
                {
                    byte b = 0;
                    if (s != null)
                    {
                        b = 1; continue;
                    }
                    c2<bool> a = new c2<bool>();
                    a.bar3(b, sb3);
                    s = "";
                    return;
                }
            }
        }

        // Static Methods
        protected static int foo(T x, U y)
        {
            Console.WriteLine("    c3<T, U>.foo(T, U)");
            int[] a = new int[3] { 1, 2, 3 }; a[1] = a[2];
            return (int)((long)x.GetHashCode() + (long)(int)(long)y.GetHashCode());
        }

        internal static c1 foo(object x)
        {
            Console.WriteLine("    c3<T, U>.foo(object)");
            c1[] a = new c1[3] { null, new c1(), new c1(1) }; a[1] = a[2];
            x = "hi";
            return new c1((int)1.1f, (uint)1, new c1(x.GetHashCode()));
        }

        private static float foo(string x)
        {
            Console.WriteLine("    c3<T, U>.foo(string)");
            string[] a = new string[] { x, x, "", null }; a[1] = a[2]; a[2] = a[1];
            return (float)foo(x.GetHashCode());
        }

        public static int foo(int x)
        {
            Console.WriteLine("    c3<T, U>.foo(int)");
            int[] a = new int[] { x, x, 1, 0 }; a[1] = a[2]; a[2] = a[1];
            return (int)x.GetHashCode() + x;
        }

        public static string foo()
        {
            Console.WriteLine("    c3<T, U>.foo()");
            string[] a = new string[] { "", null }; a[0] = a[1]; a[1] = a[0];
            return (string)null;
        }

        // Instance Methods
        protected int bar(T x, U y)
        {
            Console.WriteLine("    c3<T, U>.bar(T, U)");
            int[] a = new int[3] { 1, 2, 3 }; a[1] = a[2];
            return (int)((long)1 + (long)(int)(long)2);
        }

        public c1 bar(object x)
        {
            Console.WriteLine("    c3<T, U>.bar(object)");
            c1[] a = new c1[3] { null, new c1(), new c1(1) }; a[1] = a[2];
            return new c1((int)1.1f, (uint)1, new c1(x.GetHashCode()));
        }

        public float bar(string x)
        {
            Console.WriteLine("    c3<T, U>.bar(string)");
            string[] a = new string[] { x, x, "", null }; a[1] = a[2]; a[2] = a[1];
            x = a[2];
            return (float)foo(x.GetHashCode());
        }

        public int bar(int x)
        {
            Console.WriteLine("    c3<T, U>.bar(int)");
            int[] a = new int[] { x, x, 1, 0 }; a[1] = a[2]; a[2] = a[1];
            return (int)x.GetHashCode() + x;
        }

        public string bar()
        {
            Console.WriteLine("    c3<T, U>.bar()");
            string[] a = new string[] { "", null }; a[0] = a[1]; a[1] = a[0];
            return (string)null;
        }
    }

    public class c4 : c2<string> // Inheritance
    {
        public static bool b = true;
        public static byte b1 = 0;
        public static sbyte sb = 1;

        private static short s = 4;
        private static ushort us = 5;
        private static long l = 6;
        private static ulong ul = 7;

        public static bool Test()
        {
            string str = "c4.Test()";
            {
                int i = 2;
                Console.WriteLine(str);
                {
                    c1 a = new c1(i); a.foo(i);
                }
                double d = 1.1;
                {
                    sbyte sb = 1;
                    c1 a = new c1(i + (i + i));
                    a.foo(sb);
                    {
                        a.foo(d);
                    }
                }

                // Nested Scopes
                {
                    object o = i;
                    bool b = false;
                    if (!b)
                    {
                        byte b1 = 1;
                        string s_ = "    This is a test";
                        while (!b)
                        {
                            if (true) b = true;
                            Console.WriteLine(s_);
                            while (b)
                            {
                                if (true) b = false;
                                object oo = i;
                                bool bb = b;
                                if (!bb)
                                {
                                    if (!false) bb = true;
                                    byte b11 = b1;
                                    string ss = s_;
                                    if (bb)
                                    {
                                        Console.WriteLine(ss);
                                        if (bb != b)
                                        {
                                            object ooo = i;
                                            bool bbb = bb;
                                            if (bbb == true)
                                            {
                                                byte b111 = b11;
                                                string sss = ss;
                                                while (bbb)
                                                {
                                                    Console.WriteLine(sss);
                                                    bbb = false;

                                                    // Method Calls - Ref, Paramarrays
                                                    // Overloaded Abstract Methods
                                                    long l = i;
                                                    c4 c = new c4();
                                                    c.abst(ref s_, 1, i);
                                                    c.abst(ref s_, new int[] { 1, i, i });
                                                    c.abst(ref s_, c.abst(ref s_, l, l), l, l, l);

                                                    // Method Calls - Ref, Paramarrays
                                                    // Overloaded Virtual Methods
                                                    c1 a = new c4();
                                                    c.virt(i, c, new c2<string>[] { c.virt(i, ref a), new c4() });
                                                    c.virt(c.virt(i, ref a), c.virt(ref i, c, c.virt(i, ref a)));
                                                    c.
                                                      virt(
                                                           c.
                                                             abst(ref s_,
                                                                 l,
                                                                 l),
                                                           c.
                                                             abst(ref s_,
                                                                  new long[] {1, 
                                                                              i, 
                                                                              l})
                                                           );
                                                    c.virt(i, ref a);
                                                    c.virt(ref i,
                                                           new c4(),
                                                           new c4(),
                                                           new c2<string>()
                                                           );
                                                    c.virt(new int[] { 1, 2, 3 });
                                                    c.virt(new Exception[] { });
                                                    c.virt(new c1[] { new c4(), new c2<string>() });
                                                    s = (short)us;
                                                    if (true) continue;
                                                }
                                            }
                                            else if (bbb != true)
                                            {
                                                Console.WriteLine("Error - Should not have reached here");
                                                o = i; o = us;
                                                return (bool)o;
                                            }
                                            else if (bbb == false)
                                            {
                                                Console.WriteLine("Error - Should not have reached here");
                                                o = i; o = l;
                                                return (bool)o;

                                            }
                                            else
                                            {
                                                Console.WriteLine("Error - Should not have reached here");
                                                o = b; o = ul;
                                                return (bool)o;
                                            }
                                        }
                                    }
                                    else if (!b)
                                    {
                                        Console.WriteLine("Error - Should not have reached here");
                                        object o1 = b;
                                        return (bool)o1;
                                    }
                                    else
                                    {
                                        Console.WriteLine("Error - Should not have reached here");
                                        object o1 = b;
                                        return (bool)o1;
                                    }
                                }
                                else if (!bb)
                                {
                                    Console.WriteLine("Error - Should not have reached here");
                                    o = b;
                                    return (bool)o;
                                }
                                else
                                {
                                    Console.WriteLine("Error - Should not have reached here");
                                    object o1 = b;
                                    return (bool)o1;
                                }
                                while (b != false)
                                {
                                    b = false; break;
                                }
                                break;
                            }
                            while (b != true)
                            {
                                b = true; continue;
                            }
                        }
                    }
                    else if (b)
                    {
                        Console.WriteLine("Error - Should not have reached here");
                        return b;
                    }
                    else
                    {
                        Console.WriteLine("Error - Should not have reached here");
                        return (bool)b != true;
                    }
                }
            }
            return false;
        }

        // Non-Overloaded Method
        public static c4 foo(int i, string s, bool b, byte b1, long l, string s1)
        {
            Console.WriteLine("    c4.foo(int, string, bool, byte, long, string)");
            return new c4();
        }

        // Non-Overloaded Method
        internal static c5 bar(short s, ushort us, sbyte sb, float f, double d, double d1, float f1)
        {
            Console.WriteLine("    c4.bar(short, ushort, sbyte, float, double, double, float)");
            return new c5();
        }

        public class c5 : c3<string, c1> // Nested Class, Inheritance
        {
            internal static float f = 8.0f;
            internal static double d = 9.0;
            internal static string s1 = "Test";
            internal static object o = null;

            public int Test()
            {
                int i = 1; string s = "1"; bool b = true;
                short sh = 1; ushort us = 1; object o = i;
                c5 cc = new c5();
                Console.WriteLine("c5.test");
                {
                    uint ui = 1; o = ui;
                    i = sh; b = false; us = 1;
                    // Nested Scopes
                    if (true)
                    {
                        byte b1 = 1; long l = i; string s1 = s;
                        float f = 1.2f; o = f; l = ui;
                        c4.foo(sh, s, b, b1, i, s1); // Implicit Conversions
                        c4 c = new c4();
                        c.foo(sh); this.bar(sh);
                        cc.bar(c5.foo(cc.bar()));
                        c5.foo(cc.bar(c5.foo()));
                        if (b == false)
                        {
                            double d = f; ulong ul = 1; sbyte sb = 1; s1 = s;
                            c4.bar(sh, us, sb, f, d, ui, ul); // Implicit Conversions
                            c.bar4(us);
                            this.bar(cc.bar(), c);
                            c5.foo(this.bar(c5.foo(), c));
                        }
                        if (b1 >= l)
                        {
                            uint ui1 = 1; o = ui1;
                            i = sh; b = false; us = 1;
                            while (i != 1000)
                            {
                                byte b11 = 1; long l1 = i; string s11 = s1;
                                float f1 = 1.2f; o = f1; l1 = ui1;
                                c4.foo(sh, s1, b, b11, i, s11); // Implicit Conversions
                                c.foo(b);
                                this.bar(b); if (c5.foo() != null) c5.foo().ToString().GetHashCode();
                                cc.bar(this.bar(c5.foo()));

                                if (!false)
                                {
                                    double d1 = f1; ulong ul1 = 1; sbyte sb1 = 1; s1 = s;
                                    c4.bar(sh, us, sb1, f1, d1, ui1, ul1); // Implicit Conversions
                                    c.foo(b1, sb1);
                                    this.bar(o).bar4(c);
                                    cc.bar(c5.foo(o)).bar4(c).ToString();
                                    d1 = d;
                                    if (d != d1) return i;
                                }
                                if (i != 1000)
                                {
                                    uint ui2 = 1; o = ui2;
                                    i = sh; b = false; us = 1;
                                    {
                                        byte b12 = 1; long l2 = i; string s12 = s11;
                                        float f2 = 1.2f; o = f1; l2 = ui1;
                                        c4.foo(sh, s1, b, b12, i, s12); // Implicit Conversions
                                        c.bar4(b.ToString() == b.ToString());
                                        this.bar(c5.foo(cc.bar(i)));
                                        {
                                            double d2 = f2; ulong ul2 = 1; sbyte sb2 = 1; s1 = s;
                                            c4.bar(sh, us, sb2, f2, d2, ui2, ul2); // Implicit Conversions
                                            c.foo(false == true != false == b);
                                            c.bar4(sh > us == sh <= us);
                                            this.bar((object)c5.foo((object)cc.bar((object)i)));
                                            if (i != i +
                                                1 -
                                                1)
                                                return i -
                                                (int)b12;
                                        }
                                        if (i <=
                                              1000) break;
                                    }
                                }
                                if (i <=
                                      1000)
                                    i = 1000;
                                return sh;
                            }
                        }
                    }
                }
                return (int)sh;
            }
        }
    }
}


namespace ns8
{
    public class Test
    {
        public static void Run()
        {
            c1 a = new c1(); a.test();

            c2<string> b = new c2<string>(); b.TEST();

            c3<string, string>.test();

            c4.Test();

            c4.c5 d = new c4.c5(); d.Test();
        }
    }

    // Abstract Class
    public abstract class c0
    {
        // Abstract Methods
        public abstract int abst(ref string x, params int[] y);

        public abstract int abst(ref string x, params long[] y);

        public abstract int abst(ref string x, long y, long z);
    }

    public class c1 : c0 // Inheritance
    {
        private int i = 2;
        internal uint ui = 3;
        public c1 a = null;

        // Overloaded Constructors
        public c1()
        {
            i = 2; this.ui = 3;
        }

        public c1(int x)
        {
            i = x; this.ui = 3; this.a = new c1(this.i, this.ui, this.a);
        }

        public c1(int x, uint y, c1 c)
        {
            this.i = x; ui = y; a = new c1();
        }

        public void test()
        {
            int i = 2;
            bool b = true;

            // Nested Scopes
            if (b)
            {
                object o = i;
                b = false;
                {
                    byte b1 = 1;
                    string s = "c1.test()";
                    {
                        Console.WriteLine(s);
                        this.foo(o); foo(i); this.foo(b); this.foo(b1); // Overload Resolution, Implicit Conversions
                    }
                }
            }
            // Nested Scopes
            if (!b)
            {
                object o = i;
                b = false;
                if (true)
                {
                    byte b1 = 1;
                    string s = "c1.test()";
                    {
                        Console.WriteLine(s);
                        bar2(o); this.bar2(i); this.bar2(b1); bar1(s); // Non-Overloaded Methods, Implicit Conversions
                    }
                }
            }
            // Nested Scopes
            if (!false)
            {
                object o = i;
                b = false;
                {
                    byte b1 = 1;
                    string s = "c1.test()";
                    {
                        Console.WriteLine(s);
                        this.bar4(o); this.bar4(i); this.bar4(b1); this.bar3(b); // Non-Overloaded Methods, Implicit Conversions
                    }
                }
            }

            if (!false)
            {
                object o = i;
                b = false;
                {
                    string s = "c1.test()";
                    {
                        Console.WriteLine(s);

                        // Method Calls - Ref, Paramarrays
                        // Overloaded Abstract Methods
                        c1 c = new c1(); long l = 1;
                        this.abst(ref s, 1, i);
                        c.abst(ref s, new int[] { 1, i, i });
                        c.abst(ref s, this.abst(ref s, l, l), l, l, l);

                        // Method Calls - Ref, Paramarrays
                        // Overloaded Virtual Methods
                        c.virt(i, c, new c2<string>[] { virt(i, ref c), new c4() });
                        virt(this.virt(i, ref c), c.virt(ref i, c, virt(i, ref c)));
                        virt(c.abst(ref s, l, l), this.abst(ref s, new long[] { 1, i, l }));
                        c = new c4();
                        virt(i, ref c);
                        virt(ref i, new c4(), new c4(), new c2<string>());
                        virt(new int[] { 1, 2, 3 });
                        virt(new Exception[] { });
                        virt(new c1[] { new c4(), new c2<string>() });
                    }
                }
            }
        }

        // Overriden Abstract Methods
        public override int abst(ref string x, params int[] y)
        {
            Console.WriteLine("    c1.abst(ref string, params int[])");
            x = x.ToString(); y = new int[] { y[0] }; // Read, Write Ref + Paramarrays
            return 0;
        }

        public override int abst(ref string x, params long[] y)
        {
            Console.WriteLine("    c1.abst(ref string, params long[])");
            x = y[0].ToString(); y = null; // Read, Write Ref + Paramarrays
            return 1;
        }

        public override int abst(ref string x, long y, long z)
        {
            Console.WriteLine("    c1.abst(ref string, long, long)");
            x = z.ToString(); // Read, Write Ref
            return 2;
        }

        // Virtual Methods
        public virtual int virt(ref int x, c1 y, params c2<string>[] z)
        {
            Console.WriteLine("    c1.virt(ref int, c1, params c2<string>[])");
            x = x + x * 2; z = null; // Read, Write Ref + Paramarrays
            return 0;
        }

        public virtual c2<string> virt(int x, ref c1 y)
        {
            Console.WriteLine("    c1.virt(int, ref c1)");
            y = new c1(); // Read, Write Ref
            return new c4();
        }

        public virtual int virt(params object[] x)
        {
            Console.WriteLine("    c1.virt(params object[])");
            x = new object[] { 1, 2, null }; // Read, Write Paramarrays
            return new int();
        }

        public virtual int virt(params int[] x)
        {
            Console.WriteLine("    c1.virt(params int[])");
            x = new int[] { 0, 1 }; // Read, Write Paramarrays
            int i = x[0];
            return new int();
        }

        internal int foo(int x)
        {
            Console.WriteLine("    c1.foo(int)");

            // Read, Write Fields
            this.ui = 0u + this.ui;
            i = i - 1 * 2 + 3 / 1;
            this.i = 1;
            this.a = null; a = new c1(x);

            // Read, Write Locals
            bool b = true; string s = null;
            s = string.Empty;
            b = this.i != 1 + (2 - 3);
            s = "";
            c1 c = new c1(i, ui, new c1(this.i, this.ui, new c1(i)));
            c = this.a;
            b = b == true; s = s.ToString();

            // Read, Write Params
            x = (i - this.i) * i + (x / i);
            x = x.GetHashCode(); this.i = x;

            // Read, Write Array Element
            int[] a1 = new int[] { 1, 2, 3 };
            a1[1] = i; a1[2] = x;
            a1[1] = 1; a1[2] = 2;
            int i1 = a1[1] - a1[2];
            i1 = (a1[1] - (a1[2] + a1[1]));
            object o = i1;
            o = a1[2] + (a1[1] - a1[2]);

            return x;
        }

        public bool foo(object x)
        {
            Console.WriteLine("    c1.foo(object)");

            // Read, Write Fields
            ui = 0u;
            this.i = this.i - 1;
            a = null;
            uint ui1 = ui; int i1 = i;

            // Read, Write Locals
            bool b = true; string s = string.Empty;
            s = null; b = this.i != 1;
            ui = ui1; i = i1;
            bar4(b); this.foo(i1); bar4(b == (true != b));

            // Read, Write Params
            x = null; x = new c1(this.i, this.ui, a);
            this.bar4(x); this.bar4(x.GetHashCode() != (x.GetHashCode()));

            // Read, Write Array Element
            object[] a1 = new c1[3] { null, null, null };
            this.i = 1;
            a1[1] = null; a1[2] = new c1((i * i) / i, ui + (ui - ui), null);
            object o = null;
            o = a1[1]; this.bar4(a1[2]);

            if (b)
            {
                return b.GetHashCode() == this.i;
            }
            else
            {
                return b;
            }
        }

        private void bar1(string x)
        {
            Console.WriteLine("    c1.bar1(string)");

            // Read, Write Fields
            this.ui = 0u - 0u;
            i = this.i * 1;
            this.a = new c1();
            this.foo(i.GetHashCode()); this.a = this;

            // Read, Write Locals
            c1 c = new c1(1, 0u, (null));
            c = null; i = 1;
            c = new c1(i / i);
            c = this.a;
            this.ui = 1;
            c.ui = this.ui / ui;
            c.i = this.i + this.i;
            c.a = c;
            c.a = c = this.a = c.a = null;
            c = new c1(i.GetHashCode());
            this.foo(c.i); bar3(c != null);

            if (this.i == 10321)
            {
                return;
            }
            else
            {
            }

            // Read, Write Params
            x = null; this.bar4(x);

            // Read, Write Array Element
            string[] a1 = new string[] { "", null, null };
            a1[1] = null; a1[2] = "";
            string s = null;
            s = a1[1]; foo(a1[2]);
        }

        protected string bar2(object x)
        {
            Console.WriteLine("    c1.bar2(object)");

            // Read, Write Fields
            this.ui = ui - this.ui;
            i = i / 1;
            a = null;
            foo(i);

            // Read, Write Locals
            c1 c;
            object o;
            c = null; c = new c1(i / 2, ui * (2u), new c1(i / 2, ui * (2u), c));
            this.a = new c1(((1 + i) - 1));
            c = this.a;
            o = c;
            c.ui = this.ui;
            c.i = this.i * this.i;
            c.a = c; this.a = c.a;
            c.a = c = this.a = c.a = new c1(i, ui, new c1()); o = c.a = c;
            bar4(o.ToString()); this.bar4(c.a.a);

            // Read, Write Params
            x = c; x = o;
            o = x;

            // Read, Write Array Element
            object[] a1 = new c1[] { null, this.a, c };
            a1[1] = null; a1[2] = c;
            o = a1[1]; bar3(a1[2] != a1[1]);

            if (o == null)
            {
                return null;
            }
            else
            {
                return string.Empty;
            }
        }

        internal object bar3(bool x)
        {
            Console.WriteLine("    c1.bar3(bool)");

            // Read, Write Fields
            ui = ui - this.ui;
            i = i + 1;
            this.a = new c1(i, ui, a);

            // Read, Write Locals
            bool b = x;
            b = this.i > this.i + 1;

            // Read, Write Params
            x = (this.i == i + 1);
            foo(x.GetHashCode());

            // Read, Write Array Element
            bool[] a1 = new bool[] { true, false, x };
            a1[1] = x == (this.i != i - 1 + 1); a1[2] = x == (i >= this.i + 1 - 1);
            b = (a1[1]); b = a1[2];
            object o = b != a1[2];
            o = (a1[1].ToString()) == (a1[2].ToString());
            foo(a1[1].GetHashCode());

            if (b)
            {
                return this.i;
            }
            else
            {
                return a1[1];
            }
        }

        public c1 bar4(object x)
        {
            Console.WriteLine("    c1.bar4(object)");

            // Read, Write Fields
            ui = 0;
            this.ui = this.ui - (this.ui + this.ui) * this.ui;
            this.i = (i + 1) - (1 * (i / 1));
            this.a = (null);
            foo(this.i.GetHashCode());

            // Read, Write Locals
            object o = null;
            bool b = true;
            b = this.i <= this.i + 1 - 1;
            o = x;
            c1 c = new c1(i, this.ui, a);
            c.ui = (this.ui) + (this.ui) + c.ui;
            o = x = c;
            c.i = 1;
            c.i = this.i * (this.i / c.i + c.i);
            c.a = c = this.a = c.a = new c1(); c.a = c;
            foo(c.GetHashCode()); bar3(c.a.GetHashCode() != i);

            // Read, Write Params
            x = (o.ToString());
            x = x.ToString(); foo(x.GetHashCode()); foo(x.ToString().GetHashCode());

            // Read, Write Array Element
            object[] a1 = new object[] { (null), (this.a), c };
            a1[1] = ((this.a)); a1[2] = (c); a1[1] = (i);
            Array.Reverse(a1);
            o = a1[1]; foo(a1.GetHashCode()); bar3(a1[2] == null);

            if (b)
            {
                return this;
            }
            else if (!b)
            {
                return this.a;
            }
            else if (!b)
            {
                return new c1(i, ui, new c1(i + 1, ui - 1u, new c1(i + 2)));
            }
            else
            {
                return (c1)a1[2];
            }
        }
    }

    public class c2<T> : c1 // Inheritance, Generics
    {
        protected c1 c = new c1(0, 0, new c1(1, 1, new c1(2)));

        public void TEST()
        {
            // Nested Scopes
            byte b = 0;
            if (true)
            {
                sbyte sb = 0;
                if (!false)
                {
                    string s = "c2<T>.test()";
                    if (b == 0)
                    {
                        Console.WriteLine(s);
                        this.foo(x: b, y: sb); // Named Arguments
                    }
                }
                if (sb != 1)
                {
                    this.bar1(x: b, y: sb); // Named Arguments
                }
            }
            {
                sbyte sb2 = 0;
                if (b != 1)
                {
                    string s2 = "c2<T>.test()";
                    if (sb2 == 0)
                    {
                        Console.WriteLine(s2);
                        foo(x: b, y: sb2); // Named Arguments
                    }
                }
                if (b == sb2)
                {
                    bar2(x: b, y: sb2); // Named Arguments
                }
            }
            {
                c2<string> c = new c4();
                if (!(!true))
                {
                    // Method Calls - Ref, Paramarrays
                    // Overloaded Abstract Methods
                    int i = 1; long l = i; string s = "";
                    this.abst(ref s, 1, i);
                    c.abst(ref s, new int[] { 1, i, i });
                    c.abst(ref s, this.abst(ref s, l, l), l, l, l);

                    // Method Calls - Ref, Params
                    // Overloaded Virtual Methods
                    c1 a = c;
                    c.virt(i, c, new c2<string>[] { virt(i, ref a), new c4() });
                    virt(this.virt(i, ref a), c.virt(ref i, y: c, z: virt(i, ref a)));
                    virt(c.abst(ref s, l, l), this.abst(y: new long[] { 1, i, l }, x: ref s));
                    c = new c4();
                    virt(y: ref a, x: i);
                    virt(ref i, new c4(), new c4(), new c2<string>());
                    virt(new int[] { 1, 2, 3 });
                    virt(new Exception[] { });
                    virt(new c1[] { new c4(), new c2<string>() });
                }
            }
        }

        // Overriden Abstract Methods
        public override int abst(ref string x, params int[] y)
        {
            Console.WriteLine("    c2<T>.abst(ref string, params int[])");
            x = y[0].ToString(); y = null; // Read, Write Ref + Paramarrays
            return 0;
        }

        public override int abst(ref string x, params long[] y)
        {
            Console.WriteLine("    c2<T>.abst(ref string, params long[])");
            x = y[0].ToString(); y = null; // Read, Write Ref + Paramarrays
            return 1;
        }

        // Overriden Virtual Methods
        public override int virt(ref int x, c1 y, params c2<string>[] z)
        {
            Console.WriteLine("    c2<T>.virt(ref int, c1, params c2<string>[])");
            x = 0; x = y.GetHashCode(); z = null; // Read, Write Ref + Paramarrays
            return 0;
        }

        public override c2<string> virt(int x, ref c1 y)
        {
            Console.WriteLine("    c2<T>.virt(int, ref c1)");
            x.ToString(); y = new c1(x, (uint)x, y); // Read, Write Ref
            return new c2<string>();
        }

        public override int virt(params object[] x)
        {
            Console.WriteLine("    c2<T>.virt(params object[])");
            x.ToString(); x = null; // Read, Write Paramarrays
            return new int();
        }

        private void bar(T x)
        {
            Console.WriteLine("    c2<T>.bar(T)");

            // Read, Write Params
            T y = x;
            x = y;

            // Read Consts
            const string const1 = "";
            if (!false)
            {
                const int const2 = 1;
                const c1 const3 = null;
                if (true)
                {
                    this.bar4(const1); c.foo(const2 != const2); this.a = const3;
                }
            }
        }

        private T foo1(T x)
        {
            Console.WriteLine("    c2<T>.foo1(T)");

            int aa = 1;

            // Read, Write Params
            T y = x;
            x = y; bar(x);

            // Read Consts
            const long const1 = 1;
            const uint const2 = 1;
            while (const1 < const2 - aa)
            {
                continue;
            }

            while (const2 == const1 - aa + aa)
            {
                this.bar4(const1); c.foo(const2 != const2);
                return x;
            }
            return x;
        }

        private bool foo(bool x)
        {
            Console.WriteLine("    c2<T>.foo(bool)");

            int aa = 1;

            // Read, Write Params
            x = x.ToString() == x.ToString(); a = c; a = this;

            // Read Consts
            const long const1 = 1;
            const uint const2 = 1;
            while (const1 < const1 - aa)
            {
                continue;
            }

            while (const2 == const2 - aa + aa)
            {
                return x;
            }
            return x;
        }

        protected c1 foo(byte x, object y)
        {
            Console.WriteLine("    c2<T>.foo(byte, object)");

            // Read, Write Params
            y = x; x = 1;
            c1 c = new c1();
            c.bar4(y); c.foo(x);

            // Read Consts
            const string const1 = "";
            bool b = false;
            if (!b)
            {
                const int const2 = 1;
                object o = y;
                while (y == o)
                {
                    const c1 const3 = null;
                    byte bb = 1;
                    if (bb == x)
                    {
                        this.bar4(const1); this.foo(const2 != const2); this.a = const3;
                        break;
                    }
                    else
                    {
                        return const3;
                    }
                }
                return c;
            }
            return null;
        }

        internal void bar1(byte x, object y)
        {
            Console.WriteLine("    c2<T>.bar1(byte, object)");

            // Read, Write Params
            y = x; x = 1;
            c1 c = new c1();
            c.bar4(y); c.foo(x);

            // Read Consts
            const long const1 = 1;
            const uint const2 = 1;
            while (const1 != x) continue;

            while (const2 == const2)
            {
                this.bar4(const1); this.foo(const2 != const2);
                break;
            }
        }

        public int bar2(byte x, object y)
        {
            Console.WriteLine("    c2<T>.bar2(byte, object)");

            // Read, Write Params
            y = x; x = 1;
            c1 c = new c1();
            c.bar4(y); this.foo(x);

            // Read Consts
            const long const1 = 1;
            if (!false)
            {
                const sbyte const2 = 1;
                const c1 const3 = null;
                if (c != const3)
                {
                    c.bar4(const1); this.foo(const2 != const2); this.a = const3;
                }
            }
            return (int)const1;
        }

        internal float bar3(byte x, object y)
        {
            Console.WriteLine("    c2<T>.bar3(byte, object)");

            // Read, Write Params
            y = x; x = 1;
            double d = 1.1;
            c1 c = new c1();
            this.bar4(y); c.foo(x);

            // Read Consts
            const string const1 = "hi";
            bool b = !false;
            if (b)
            {
                const byte const2 = 1;
                const c1 const3 = null;
                if (const3 != c)
                {
                    this.bar4(const1); c.foo(const2 != const2); c.a = const3;
                    return (float)d;
                }
                return (float)(1.1f + (float)1.1);
            }
            return (float)d + (float)1.1;
        }
    }

    public class c3<T, U> // Generics
    {
        public static void test()
        {
            string s = "c3<T>.test()";
            {
                Console.WriteLine(s);
                foo(); foo(1); foo("1"); foo(1.1); // Overload Resolution, Implicit Conversions
            }
            // Nested Scopes
            {
                sbyte sb1 = 0;
                if (s != "")
                {
                    while (sb1 == 0)
                    {
                        byte b = 0;
                        c2<string> a = new c2<string>();
                        a.bar1(b, sb1);
                        sb1 = 1;
                        if (sb1 == 1) break;
                        else continue;
                    }
                }
                while (sb1 != 0)
                {
                    byte b = 1;
                    c2<string> a = new c2<string>();
                    a.bar1(b, sb1);
                    sb1 = 0;
                    if (sb1 == 1) break;
                    else continue;
                }
            }
            // Nested Scopes
            {
                sbyte sb2 = 0;
                while (sb2 < 2)
                {
                    sb2 = 3;
                    while (sb2 > 0)
                    {
                        sb2 = 0;
                        byte b = 1;
                        c2<int> a = new c2<int>();
                        a.bar2(b, sb2);
                    }
                    sb2 = 3;
                }
                if (sb2 >= 3)
                {
                    byte b = 0;
                    c2<int> a = new c2<int>();
                    a.bar2(b, sb2);
                }
            }
            // Nested Scopes
            {
                sbyte sb3 = 0;
                while (!string.IsNullOrEmpty(s))
                {
                    byte b = 1;
                    s = null;
                    if (sb3 != -20)
                    {
                        c2<bool> a = new c2<bool>();
                        a.bar3(b, sb3);
                    }
                    if (s != null) break;
                }
                while (s == null)
                {
                    byte b = 0;
                    if (s != null)
                    {
                        b = 1; continue;
                    }
                    c2<bool> a = new c2<bool>();
                    a.bar3(b, sb3);
                    s = "";
                    return;
                }
            }
        }

        // Static Methods
        protected static int foo(T x, U y)
        {
            Console.WriteLine("    c3<T, U>.foo(T, U)");
            int[] a = new int[3] { 1, 2, 3 }; a[1] = a[2];
            return (int)((long)x.GetHashCode() + (long)(int)(long)y.GetHashCode());
        }

        internal static c1 foo(object x)
        {
            Console.WriteLine("    c3<T, U>.foo(object)");
            c1[] a = new c1[3] { null, new c1(), new c1(1) }; a[1] = a[2];
            x = "hi";
            return new c1((int)1.1f, (uint)1, new c1(x.GetHashCode()));
        }

        private static float foo(string x)
        {
            Console.WriteLine("    c3<T, U>.foo(string)");
            string[] a = new string[] { x, x, "", null }; a[1] = a[2]; a[2] = a[1];
            return (float)foo(x.GetHashCode());
        }

        public static int foo(int x)
        {
            Console.WriteLine("    c3<T, U>.foo(int)");
            int[] a = new int[] { x, x, 1, 0 }; a[1] = a[2]; a[2] = a[1];
            return (int)x.GetHashCode() + x;
        }

        public static string foo()
        {
            Console.WriteLine("    c3<T, U>.foo()");
            string[] a = new string[] { "", null }; a[0] = a[1]; a[1] = a[0];
            return (string)null;
        }

        // Instance Methods
        protected int bar(T x, U y)
        {
            Console.WriteLine("    c3<T, U>.bar(T, U)");
            int[] a = new int[3] { 1, 2, 3 }; a[1] = a[2];
            return (int)((long)1 + (long)(int)(long)2);
        }

        public c1 bar(object x)
        {
            Console.WriteLine("    c3<T, U>.bar(object)");
            c1[] a = new c1[3] { null, new c1(), new c1(1) }; a[1] = a[2];
            return new c1((int)1.1f, (uint)1, new c1(x.GetHashCode()));
        }

        public float bar(string x)
        {
            Console.WriteLine("    c3<T, U>.bar(string)");
            string[] a = new string[] { x, x, "", null }; a[1] = a[2]; a[2] = a[1];
            x = a[2];
            return (float)foo(x.GetHashCode());
        }

        public int bar(int x)
        {
            Console.WriteLine("    c3<T, U>.bar(int)");
            int[] a = new int[] { x, x, 1, 0 }; a[1] = a[2]; a[2] = a[1];
            return (int)x.GetHashCode() + x;
        }

        public string bar()
        {
            Console.WriteLine("    c3<T, U>.bar()");
            string[] a = new string[] { "", null }; a[0] = a[1]; a[1] = a[0];
            return (string)null;
        }
    }

    public class c4 : c2<string> // Inheritance
    {
        public static bool b = true;
        public static byte b1 = 0;
        public static sbyte sb = 1;

        private static short s = 4;
        private static ushort us = 5;
        private static long l = 6;
        private static ulong ul = 7;

        public static bool Test()
        {
            string str = "c4.Test()";
            {
                int i = 2;
                Console.WriteLine(str);
                {
                    c1 a = new c1(i); a.foo(i);
                }
                double d = 1.1;
                {
                    sbyte sb = 1;
                    c1 a = new c1(i + (i + i));
                    a.foo(sb);
                    {
                        a.foo(d);
                    }
                }

                // Nested Scopes
                {
                    object o = i;
                    bool b = false;
                    if (!b)
                    {
                        byte b1 = 1;
                        string s_ = "    This is a test";
                        while (!b)
                        {
                            if (true) b = true;
                            Console.WriteLine(s_);
                            while (b)
                            {
                                if (true) b = false;
                                object oo = i;
                                bool bb = b;
                                if (!bb)
                                {
                                    if (!false) bb = true;
                                    byte b11 = b1;
                                    string ss = s_;
                                    if (bb)
                                    {
                                        Console.WriteLine(ss);
                                        if (bb != b)
                                        {
                                            object ooo = i;
                                            bool bbb = bb;
                                            if (bbb == true)
                                            {
                                                byte b111 = b11;
                                                string sss = ss;
                                                while (bbb)
                                                {
                                                    Console.WriteLine(sss);
                                                    bbb = false;

                                                    // Method Calls - Ref, Paramarrays
                                                    // Overloaded Abstract Methods
                                                    long l = i;
                                                    c4 c = new c4();
                                                    c.abst(ref s_, 1, i);
                                                    c.abst(ref s_, new int[] { 1, i, i });
                                                    c.abst(ref s_, c.abst(ref s_, l, l), l, l, l);

                                                    // Method Calls - Ref, Paramarrays
                                                    // Overloaded Virtual Methods
                                                    c1 a = new c4();
                                                    c.virt(i, c, new c2<string>[] { c.virt(i, ref a), new c4() });
                                                    c.virt(c.virt(i, ref a), c.virt(ref i, c, c.virt(i, ref a)));
                                                    c.
                                                      virt(
                                                           c.
                                                             abst(ref s_,
                                                                 l,
                                                                 l),
                                                           c.
                                                             abst(ref s_,
                                                                  new long[] {1, 
                                                                              i, 
                                                                              l})
                                                           );
                                                    c.virt(i, ref a);
                                                    c.virt(ref i,
                                                           new c4(),
                                                           new c4(),
                                                           new c2<string>()
                                                           );
                                                    c.virt(new int[] { 1, 2, 3 });
                                                    c.virt(new Exception[] { });
                                                    c.virt(new c1[] { new c4(), new c2<string>() });
                                                    s = (short)us;
                                                    if (true) continue;
                                                }
                                            }
                                            else if (bbb != true)
                                            {
                                                Console.WriteLine("Error - Should not have reached here");
                                                o = i; o = us;
                                                return (bool)o;
                                            }
                                            else if (bbb == false)
                                            {
                                                Console.WriteLine("Error - Should not have reached here");
                                                o = i; o = l;
                                                return (bool)o;

                                            }
                                            else
                                            {
                                                Console.WriteLine("Error - Should not have reached here");
                                                o = b; o = ul;
                                                return (bool)o;
                                            }
                                        }
                                    }
                                    else if (!b)
                                    {
                                        Console.WriteLine("Error - Should not have reached here");
                                        object o1 = b;
                                        return (bool)o1;
                                    }
                                    else
                                    {
                                        Console.WriteLine("Error - Should not have reached here");
                                        object o1 = b;
                                        return (bool)o1;
                                    }
                                }
                                else if (!bb)
                                {
                                    Console.WriteLine("Error - Should not have reached here");
                                    o = b;
                                    return (bool)o;
                                }
                                else
                                {
                                    Console.WriteLine("Error - Should not have reached here");
                                    object o1 = b;
                                    return (bool)o1;
                                }
                                while (b != false)
                                {
                                    b = false; break;
                                }
                                break;
                            }
                            while (b != true)
                            {
                                b = true; continue;
                            }
                        }
                    }
                    else if (b)
                    {
                        Console.WriteLine("Error - Should not have reached here");
                        return b;
                    }
                    else
                    {
                        Console.WriteLine("Error - Should not have reached here");
                        return (bool)b != true;
                    }
                }
            }
            return false;
        }

        // Non-Overloaded Method
        public static c4 foo(int i, string s, bool b, byte b1, long l, string s1)
        {
            Console.WriteLine("    c4.foo(int, string, bool, byte, long, string)");
            return new c4();
        }

        // Non-Overloaded Method
        internal static c5 bar(short s, ushort us, sbyte sb, float f, double d, double d1, float f1)
        {
            Console.WriteLine("    c4.bar(short, ushort, sbyte, float, double, double, float)");
            return new c5();
        }

        public class c5 : c3<string, c1> // Nested Class, Inheritance
        {
            internal static float f = 8.0f;
            internal static double d = 9.0;
            internal static string s1 = "Test";
            internal static object o = null;

            public int Test()
            {
                int i = 1; string s = "1"; bool b = true;
                short sh = 1; ushort us = 1; object o = i;
                c5 cc = new c5();
                Console.WriteLine("c5.test");
                {
                    uint ui = 1; o = ui;
                    i = sh; b = false; us = 1;
                    // Nested Scopes
                    if (true)
                    {
                        byte b1 = 1; long l = i; string s1 = s;
                        float f = 1.2f; o = f; l = ui;
                        c4.foo(sh, s, b, b1, i, s1); // Implicit Conversions
                        c4 c = new c4();
                        c.foo(sh); this.bar(sh);
                        cc.bar(c5.foo(cc.bar()));
                        c5.foo(cc.bar(c5.foo()));
                        if (b == false)
                        {
                            double d = f; ulong ul = 1; sbyte sb = 1; s1 = s;
                            c4.bar(sh, us, sb, f, d, ui, ul); // Implicit Conversions
                            c.bar4(us);
                            this.bar(cc.bar(), c);
                            c5.foo(this.bar(c5.foo(), c));
                        }
                        if (b1 >= l)
                        {
                            uint ui1 = 1; o = ui1;
                            i = sh; b = false; us = 1;
                            while (i != 1000)
                            {
                                byte b11 = 1; long l1 = i; string s11 = s1;
                                float f1 = 1.2f; o = f1; l1 = ui1;
                                c4.foo(sh, s1, b, b11, i, s11); // Implicit Conversions
                                c.foo(b);
                                this.bar(b); if (c5.foo() != null) c5.foo().ToString().GetHashCode();
                                cc.bar(this.bar(c5.foo()));

                                if (!false)
                                {
                                    double d1 = f1; ulong ul1 = 1; sbyte sb1 = 1; s1 = s;
                                    c4.bar(sh, us, sb1, f1, d1, ui1, ul1); // Implicit Conversions
                                    c.foo(b1, sb1);
                                    this.bar(o).bar4(c);
                                    cc.bar(c5.foo(o)).bar4(c).ToString();
                                    d1 = d;
                                    if (d != d1) return i;
                                }
                                if (i != 1000)
                                {
                                    uint ui2 = 1; o = ui2;
                                    i = sh; b = false; us = 1;
                                    {
                                        byte b12 = 1; long l2 = i; string s12 = s11;
                                        float f2 = 1.2f; o = f1; l2 = ui1;
                                        c4.foo(sh, s1, b, b12, i, s12); // Implicit Conversions
                                        c.bar4(b.ToString() == b.ToString());
                                        this.bar(c5.foo(cc.bar(i)));
                                        {
                                            double d2 = f2; ulong ul2 = 1; sbyte sb2 = 1; s1 = s;
                                            c4.bar(sh, us, sb2, f2, d2, ui2, ul2); // Implicit Conversions
                                            c.foo(false == true != false == b);
                                            c.bar4(sh > us == sh <= us);
                                            this.bar((object)c5.foo((object)cc.bar((object)i)));
                                            if (i != i +
                                                1 -
                                                1)
                                                return i -
                                                (int)b12;
                                        }
                                        if (i <=
                                              1000) break;
                                    }
                                }
                                if (i <=
                                      1000)
                                    i = 1000;
                                return sh;
                            }
                        }
                    }
                }
                return (int)sh;
            }
        }
    }
}
