code: func (p *Plugin) run(in *Msg) (resp string, stateMachineAnswered bool) {
  	resp = p.Keywords.handle(in)
  	if len(resp) == 0 {
  		// Copy the plugin's state machine by value into this local
  		// variable to enable different users to have different
  		// branching conversations at the same time (that's all kept in
  		// local--and user-specific--memory here).
  		sm := &StateMachine{}
  		*sm = *p.SM
  		states := p.SetBranches(in)
  		if states != nil {
  			sm.SetStates(states)
  		}
  		sm.LoadState(in)
  		if sm.state < len(sm.Handlers) {
  			resp = sm.Next(in)
  			stateMachineAnswered = true
  		}
  	}
  	return resp, stateMachineAnswered
  }
docs: // run is an unexported function that executes a plugin's behavior when the
  // plugin is called. First the plugin attempts to respond using keyword
  // functions. If that response is empty (""), run will try the plugin's state
  // machine. If that response is also empty, the plugin passes that empty
  // response to Abot, which often results in Abot responding to the user with
  // confusion. The returned bool notifies the caller whether the response is from
  // the state machine.