code: def get_obj_metadata(obj):
      from hail.matrixtable import MatrixTable, GroupedMatrixTable
      from hail.table import Table, GroupedTable
      from hail.utils import Struct
      from hail.expr.expressions import (
          StructExpression,
          ArrayStructExpression,
          SetStructExpression,
      )
  
      def table_error(index_obj):
          def fmt_field(field):
              assert field in index_obj._fields
              inds = index_obj[field]._indices
              if inds == index_obj._global_indices:
                  return "'{}' [globals]".format(field)
              elif inds == index_obj._row_indices:
                  return "'{}' [row]".format(field)
              elif (
                  inds == index_obj._col_indices
              ):  # Table will never get here
                  return "'{}' [col]".format(field)
              else:
                  assert inds == index_obj._entry_indices
                  return "'{}' [entry]".format(field)
  
          return fmt_field
  
      def struct_error(s):
          def fmt_field(field):
              assert field in s._fields
              return "'{}'".format(field)
  
          return fmt_field
  
      if isinstance(obj, MatrixTable):
          return "MatrixTable", MatrixTable, table_error(obj), True
      elif isinstance(obj, GroupedMatrixTable):
          return (
              "GroupedMatrixTable",
              GroupedMatrixTable,
              table_error(obj._parent),
              True,
          )
      elif isinstance(obj, Table):
          return "Table", Table, table_error(obj), True
      elif isinstance(obj, GroupedTable):
          return "GroupedTable", GroupedTable, table_error(obj), False
      elif isinstance(obj, Struct):
          return "Struct", Struct, struct_error(obj), False
      elif isinstance(obj, StructExpression):
          return (
              "StructExpression",
              StructExpression,
              struct_error(obj),
              True,
          )
      elif isinstance(obj, ArrayStructExpression):
          return (
              "ArrayStructExpression",
              ArrayStructExpression,
              struct_error(obj),
              True,
          )
      elif isinstance(obj, SetStructExpression):
          return (
              "SetStructExpression",
              SetStructExpression,
              struct_error(obj),
              True,
          )
      else:
          raise NotImplementedError(obj)
  
imports: import atexit
  import datetime
  import difflib
  import json
  import os
  import re
  import secrets
  import shutil
  import string
  import tempfile
  from collections import defaultdict, Counter
  from contextlib import contextmanager
  from io import StringIO
  from typing import Optional, Literal
  from urllib.parse import urlparse
  import hail
  import hail
  from hail.typecheck import enumeration, typecheck, nullable
  from hail.utils.java import Env, error
label_desc: Use image node_id 18 for calling a global function with example usage: get_obj_metadata(obj) and returns: fmt_field, fmt_field, str,  MatrixTable,  table_error,  True, str, str,  GroupedMatrixTable,  table_error,  True, str, str,  Table,  table_error,  True, str, str,  GroupedTable,  table_error,  False, str, str, str,  Struct,  struct_error,  False, str,  StructExpression,  struct_error,  True, str,  ArrayStructExpression,  struct_error,  True, str,  SetStructExpression,  struct_error,  True