code: def _get_nailgun_client(self, jvm_options, classpath, stdout, stderr, stdin):
      
      classpath = self._nailgun_classpath + classpath
      new_fingerprint = self._fingerprint(jvm_options, classpath, self._distribution.version)
  
      with self._NAILGUN_SPAWN_LOCK:
        running, updated = self._check_nailgun_state(new_fingerprint)
  
        if running and updated:
          logger.debug('Found running nailgun server that needs updating, killing {server}'
                       .format(server=self._identity))
          self.terminate()
  
        if (not running) or (running and updated):
          return self._spawn_nailgun_server(new_fingerprint, jvm_options, classpath, stdout, stderr, stdin)
  
      return self._create_ngclient(self.socket, stdout, stderr, stdin)
docs: This (somewhat unfortunately) is the main entrypoint to this class via the Runner. It handles
         creation of the running nailgun server as well as creation of the client.