code: def calculate_tip_probe_hotspots(
          tip_length: float,
          tip_probe_settings: tip_probe_config)\
          -> List[HotSpot]:
      
      # probe_dimensions is the external bounding box of the probe unit
      size_x, size_y, size_z = tip_probe_settings.dimensions
  
      rel_x_start = (size_x / 2) + tip_probe_settings.switch_clearance
      rel_y_start = (size_y / 2) + tip_probe_settings.switch_clearance
  
      # Ensure that the nozzle will clear the probe unit and tip will clear deck
      nozzle_safe_z = round((size_z - tip_length)
                            + tip_probe_settings.z_clearance.normal, 3)
  
      z_start = max(tip_probe_settings.z_clearance.deck, nozzle_safe_z)
      switch_offset = tip_probe_settings.switch_offset
      # Each list item defines axis we are probing for, starting position vector
      # and travel distance
      neg_x = HotSpot('x',
                      -rel_x_start,
                      switch_offset[0],
                      z_start,
                      size_x)
      pos_x = HotSpot('x',
                      rel_x_start,
                      switch_offset[0],
                      z_start,
                      -size_x)
      neg_y = HotSpot('y',
                      switch_offset[1],
                      -rel_y_start,
                      z_start,
                      size_y)
      pos_y = HotSpot('y',
                      switch_offset[1],
                      rel_y_start,
                      z_start,
                      -size_y)
      z = HotSpot(
          'z',
          0,
          switch_offset[2],
          tip_probe_settings.center[2] + tip_probe_settings.z_clearance.start,
          -size_z)
  
      return [
          neg_x,
          pos_x,
          neg_y,
          pos_y,
          z
      ]
docs: Generate a list of tuples describing motions for doing the xy part of
      tip probe based on the config's description of the tip probe box.