docs: function execute(_server, i) {
      setTimeout(function() {
        // Destroyed
        if (self.state === DESTROYED || self.state === UNREFERENCED) {
          return;
        }
  
        // Create a new server instance
        var server = new Server(
          Object.assign({}, self.s.options, {
            host: _server.name.split(':')[0],
            port: parseInt(_server.name.split(':')[1], 10),
            authProviders: self.authProviders,
            reconnect: false,
            monitoring: false,
            parent: self,
            clientInfo: clone(self.s.clientInfo)
          })
        );
  
        destroyServer(_server);
        removeProxyFrom(self.disconnectedProxies, _server);
  
        // Relay the server description change
        relayEvents(server, self, ['serverDescriptionChanged']);
  
        // Emit opening server event
        self.emit('serverOpening', {
          topologyId: server.s.topologyId !== -1 ? server.s.topologyId : self.id,
          address: server.name
        });
  
        // Add temp handlers
        server.once('connect', _handleEvent(self, 'connect'));
        server.once('close', _handleEvent(self, 'close'));
        server.once('timeout', _handleEvent(self, 'timeout'));
        server.once('error', _handleEvent(self, 'error'));
        server.once('parseError', _handleEvent(self, 'parseError'));
  
        // Command Monitoring events
        relayEvents(server, self, ['commandStarted', 'commandSucceeded', 'commandFailed']);
  
        // Connect to proxy
        self.connectingProxies.push(server);
        server.connect(self.s.connectOptions);
      }, i);
    }