code: def _get_join_keys(llab, rlab, shape, sort):
      # how many levels can be done without overflow
      pred = lambda i: not is_int64_overflow_possible(shape[:i])
      nlev = next(filter(pred, range(len(shape), 0, -1)))
  
      # get keys for the first `nlev` levels
      stride = np.prod(shape[1:nlev], dtype="i8")
      lkey = stride * llab[0].astype("i8", subok=False, copy=False)
      rkey = stride * rlab[0].astype("i8", subok=False, copy=False)
  
      for i in range(1, nlev):
          with np.errstate(divide="ignore"):
              stride //= shape[i]
          lkey += llab[i] * stride
          rkey += rlab[i] * stride
  
      if nlev == len(shape):  # all done!
          return lkey, rkey
  
      # densify current keys to avoid overflow
      lkey, rkey, count = _factorize_keys(lkey, rkey, sort=sort)
  
      llab = [lkey] + llab[nlev:]
      rlab = [rkey] + rlab[nlev:]
      shape = [count] + shape[nlev:]
  
      return _get_join_keys(llab, rlab, shape, sort)
  
imports: import copy
  import string
  import warnings
  import numpy
  from pandas._libs import hashtable, join, lib
  import pandas.compat
  from pandas.compat import filter, lzip, map, range, zip
  from pandas.errors import MergeError
  from pandas.util._decorators import Appender, Substitution
  from pandas.core.dtypes.common import ensure_float64, ensure_int64, ensure_object, is_array_like, is_bool, is_bool_dtype, is_categorical_dtype, is_datetime64_dtype, is_datetime64tz_dtype, is_datetimelike, is_dtype_equal, is_extension_array_dtype, is_float_dtype, is_int64_dtype, is_integer, is_integer_dtype, is_list_like, is_number, is_numeric_dtype, is_object_dtype, needs_i8_conversion
  from pandas.core.dtypes.missing import isnull, na_value_for_dtype
  from pandas import Categorical, DataFrame, Index, MultiIndex, Series, Timedelta
  import pandas.core.algorithms
  from pandas.core.arrays.categorical import _recode_for_categories
  import pandas.core.common
  from pandas.core.frame import _merge_doc
  from pandas.core.internals import concatenate_block_managers, items_overlap_with_suffix
  import pandas.core.sorting
  from pandas.core.sorting import is_int64_overflow_possible
label_desc: Use image node_id 16 for calling a global function with example usage: _get_join_keys(llab, rlab, shape, sort) and returns: _get_join_keys, lkey,  rkey