code: func LoadKernelFromConfig(conf *config.BurrowConfig) (*Kernel, error) {
  	kern, err := NewKernel(conf.BurrowDir)
  	if err != nil {
  		return nil, fmt.Errorf("could not create initial kernel: %v", err)
  	}
  
  	if err = kern.LoadLoggerFromConfig(conf.Logging); err != nil {
  		return nil, fmt.Errorf("could not configure logger: %v", err)
  	}
  
  	err = kern.LoadKeysFromConfig(conf.Keys)
  	if err != nil {
  		return nil, fmt.Errorf("could not configure keys: %v", err)
  	}
  
  	err = kern.LoadExecutionOptionsFromConfig(conf.Execution)
  	if err != nil {
  		return nil, fmt.Errorf("could not add execution options: %v", err)
  	}
  
  	err = kern.LoadState(conf.GenesisDoc)
  	if err != nil {
  		return nil, fmt.Errorf("could not load state: %v", err)
  	}
  
  	if conf.ValidatorAddress == nil {
  		return nil, fmt.Errorf("ValidatorAddress must be set")
  	}
  
  	privVal, err := kern.PrivValidator(*conf.ValidatorAddress)
  	if err != nil {
  		return nil, fmt.Errorf("could not form PrivValidator from ValidatorAddress: %v", err)
  	}
  
  	err = kern.LoadTendermintFromConfig(conf, privVal)
  	if err != nil {
  		return nil, fmt.Errorf("could not configure Tendermint: %v", err)
  	}
  
  	kern.AddProcesses(DefaultProcessLaunchers(kern, conf.RPC, conf.Keys)...)
  	return kern, nil
  }
docs: // LoadKernelFromConfig builds and returns a Kernel based solely on the supplied configuration