code: def fix_encoding_and_explain(text):
      
      best_version = text
      best_cost = text_cost(text)
      best_plan = []
      plan_so_far = []
      while True:
          prevtext = text
          text, plan = fix_one_step_and_explain(text)
          plan_so_far.extend(plan)
          cost = text_cost(text)
          for _, _, step_cost in plan_so_far:
              cost += step_cost
  
          if cost < best_cost:
              best_cost = cost
              best_version = text
              best_plan = list(plan_so_far)
          if text == prevtext:
              return best_version, best_plan
docs: Re-decodes text that has been decoded incorrectly, and also return a
      "plan" indicating all the steps required to fix it.
  
      The resulting plan could be used with :func:`ftfy.fixes.apply_plan`
      to fix additional strings that are broken in the same way.