// Path: src/main/java/com/cedarsoftware/util/Converter.java
// public static BigDecimal convert2BigDecimal(Object fromInstance)
// {
//     if (fromInstance == null)
//     {
//         return BIG_DECIMAL_ZERO;
//     }
//     return convertToBigDecimal(fromInstance);
// }
// 
// Path: src/main/java/com/cedarsoftware/util/Converter.java
// public static boolean convert2boolean(Object fromInstance)
// {
//     if (fromInstance == null)
//     {
//         return false;
//     }
//     return convertToBoolean(fromInstance);
// }
// 
// Path: src/main/java/com/cedarsoftware/util/ReflectionUtils.java
// protected static String getClassLoaderName(Class<?> c)
// {
//     ClassLoader loader = c.getClassLoader();
//     return loader == null ? "bootstrap" : loader.toString();
// }


import java.lang.reflect.Array;
import java.lang.reflect.Field;
import java.math.BigDecimal;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import static com.cedarsoftware.util.Converter.convert2BigDecimal;
import static com.cedarsoftware.util.Converter.convert2boolean;
import static com.cedarsoftware.util.ReflectionUtils.getClassLoaderName;
        stack.addFirst(new ItemsToCompare(a, b));

        while (!stack.isEmpty())
        {
            ItemsToCompare itemsToCompare = stack.removeFirst();
            visited.add(itemsToCompare);

            final Object key1 = itemsToCompare._key1;
            final Object key2 = itemsToCompare._key2;
            if (key1 == key2)
            {   // Same instance is always equal to itself.
                continue;
            }

            if (key1 == null || key2 == null)
            {   // If either one is null, they are not equal (both can't be null, due to above comparison).
                return false;
            }

            if (key1 instanceof Number && key2 instanceof Number && compareNumbers((Number)key1, (Number)key2))
            {
                continue;
            }

            if (key1 instanceof Number || key2 instanceof Number)
            {   // If one is a Number and the other one is not, then optionally compare them as strings, otherwise return false
                if (allowStringsToMatchNumbers)
                {
                    try
                    {
// Path: src/main/java/com/cedarsoftware/util/Converter.java
// public static BigDecimal convert2BigDecimal(Object fromInstance)
// {
//     if (fromInstance == null)
//     {
//         return BIG_DECIMAL_ZERO;
//     }
//     return convertToBigDecimal(fromInstance);
// }
// 
// Path: src/main/java/com/cedarsoftware/util/Converter.java
// public static boolean convert2boolean(Object fromInstance)
// {
//     if (fromInstance == null)
//     {
//         return false;
//     }
//     return convertToBoolean(fromInstance);
// }
// 
// Path: src/main/java/com/cedarsoftware/util/ReflectionUtils.java
// protected static String getClassLoaderName(Class<?> c)
// {
//     ClassLoader loader = c.getClassLoader();
//     return loader == null ? "bootstrap" : loader.toString();
// }


// Path: src/main/java/com/cedarsoftware/util/DeepEquals.java
import java.lang.reflect.Array;
import java.lang.reflect.Field;
import java.math.BigDecimal;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import static com.cedarsoftware.util.Converter.convert2BigDecimal;
import static com.cedarsoftware.util.Converter.convert2boolean;
import static com.cedarsoftware.util.ReflectionUtils.getClassLoaderName;

        stack.addFirst(new ItemsToCompare(a, b));

        while (!stack.isEmpty())
        {
            ItemsToCompare itemsToCompare = stack.removeFirst();
            visited.add(itemsToCompare);

            final Object key1 = itemsToCompare._key1;
            final Object key2 = itemsToCompare._key2;
            if (key1 == key2)
            {   // Same instance is always equal to itself.
                continue;
            }

            if (key1 == null || key2 == null)
            {   // If either one is null, they are not equal (both can't be null, due to above comparison).
                return false;
            }

            if (key1 instanceof Number && key2 instanceof Number && compareNumbers((Number)key1, (Number)key2))
            {
                continue;
            }

            if (key1 instanceof Number || key2 instanceof Number)
            {   // If one is a Number and the other one is not, then optionally compare them as strings, otherwise return false
                if (allowStringsToMatchNumbers)
                {
                    try
                    {
                        if (key1 instanceof String && compareNumbers(convert2BigDecimal(key1), (Number)key2))