code: def step(self, actions):
      
      for index, (env, action) in enumerate(zip(self._envs, actions)):
        if not env.action_space.contains(action):
          message = 'Invalid action at index {}: {}'
          raise ValueError(message.format(index, action))
      if self._blocking:
        transitions = [
            env.step(action)
            for env, action in zip(self._envs, actions)]
      else:
        transitions = [
            env.step(action, blocking=False)
            for env, action in zip(self._envs, actions)]
        transitions = [transition() for transition in transitions]
      observs, rewards, dones, infos = zip(*transitions)
      observ = np.stack(observs)
      reward = np.stack(rewards)
      done = np.stack(dones)
      info = tuple(infos)
      return observ, reward, done, info
docs: Forward a batch of actions to the wrapped environments.
  
      Args:
        actions: Batched action to apply to the environment.
  
      Raises:
        ValueError: Invalid actions.
  
      Returns:
        Batch of observations, rewards, and done flags.