docs: def copy_obj(obj):
      ''' does a deepcopy of an object, but does not copy a class
          i.e.
          x = {"key":[<classInstance1>,<classInstance2>,<classInstance3>]}
          y = copy_obj(x)
          y --> {"key":[<classInstance1>,<classInstance2>,<classInstance3>]}
          del y['key'][0]
          y --> {"key":[<classInstance2>,<classInstance3>]}
          x --> {"    key":[<classInstance1>,<classInstance2>,<classInstance3>]}
          *** this is to overcome a dictionary object that lists with classes
              as the list items. '''
      if isinstance(obj, dict):
          return_obj = {}
          for key, value in obj.items():
              if isinstance(value, dict):
                  return_obj[key] = copy_obj(value)
              elif isinstance(value, list):
                  return_obj[key] = copy_obj(value)
              else:
                  return_obj[key] = value
      elif isinstance(obj, list):
          return_obj = []
          for value in obj:
              if isinstance(value, dict):
                  return_obj.append(copy_obj(value))
              elif isinstance(value, list):
                  return_obj.append(copy_obj(value))
              else:
                  return_obj.append(value)
      else:
          return_obj = copy.copy(obj)
      return return_obj