code: def complete_next(self, pick_up=True, halt_on_manual=True):
          
          # Try to pick up where we left off.
          blacklist = []
          if pick_up and self.last_task is not None:
              try:
                  iter = Task.Iterator(self.last_task, Task.READY)
                  task = next(iter)
              except StopIteration:
                  task = None
              self.last_task = None
              if task is not None:
                  if not (halt_on_manual and task.task_spec.manual):
                      if task.complete():
                          self.last_task = task
                          return True
                  blacklist.append(task)
  
          # Walk through all ready tasks.
          for task in Task.Iterator(self.task_tree, Task.READY):
              for blacklisted_task in blacklist:
                  if task._is_descendant_of(blacklisted_task):
                      continue
              if not (halt_on_manual and task.task_spec.manual):
                  if task.complete():
                      self.last_task = task
                      return True
              blacklist.append(task)
  
          # Walk through all waiting tasks.
          for task in Task.Iterator(self.task_tree, Task.WAITING):
              task.task_spec._update(task)
              if not task._has_state(Task.WAITING):
                  self.last_task = task
                  return True
          return False
docs: Runs the next task.
          Returns True if completed, False otherwise.
  
          :type  pick_up: bool
          :param pick_up: When True, this method attempts to choose the next
                          task not by searching beginning at the root, but by
                          searching from the position at which the last call
                          of complete_next() left off.
          :type  halt_on_manual: bool
          :param halt_on_manual: When True, this method will not attempt to
                          complete any tasks that have manual=True.
                          See :meth:`SpiffWorkflow.specs.TaskSpec.__init__`
          :rtype:  bool
          :returns: True if all tasks were completed, False otherwise.