code: def find_image_plane_details(exemplar, ipds):
      """Find the ImagePlaneDetails instance matching the exemplar
  
      The point of this function is to retrieve the ImagePlaneDetails from
      the list provided and, in doing so, get the attached metadata and the
      Java IPD object as well.
  
      exemplar - an IPD with the URL, series, index and channel filled in
  
      ipds - an ordered list of ImagePlaneDetails instances
  
      Returns the match or None if not found
      """
      pos = bisect.bisect_left(ipds, exemplar)
      if pos == len(ipds) or cmp(ipds[pos], exemplar):
          return None
      return ipds[pos]
  
imports: import bisect
  import re
  import numpy
  from ...constants.pipeline import make_cell_struct_dtype
  from ...constants.pipeline import PIPELINE
  from ...constants.pipeline import IMAGE_PLANE_DESCRIPTOR_VERSION
  from ...constants.pipeline import H_PLANE_COUNT
  from ...constants.pipeline import H_URL
  from ...constants.pipeline import H_SERIES
  from ...constants.pipeline import H_INDEX
  from ...constants.pipeline import H_CHANNEL
  from ...constants.pipeline import RF_STATE_PREQUOTE
  from ...constants.pipeline import RF_STATE_FIELD
  from ...constants.pipeline import RF_STATE_BACKSLASH_ESCAPE
  from ...constants.pipeline import RF_STATE_SEPARATOR
  from ..legacy import cmp
label_desc: Use image node_id 6 for calling a global function with example usage: find_image_plane_details(exemplar, ipds) and returns: ipds, None