var es = require('event-stream');
var fs = require('fs');
var path = require('path');
var child_process = require('child_process');
var async = require('async');
var PluginError = require('gulp-util').PluginError;
var winExt = /^win/.test(process.platform)?".cmd":"";


// optimization: cache for protractor binaries directory
var protractorDir = null;

function getProtractorDir() {
	if (protractorDir) {
		return protractorDir;
	}
	
	// how deep are we wrt filesystem root?
	var cwd = path.resolve(".");
	var depth = /^win/.test(process.platform) ? cwd.match(/\\/g).length :  cwd.match(/\//g).length;
	depth = depth - 1;
	
	var result = "./node_modules";
	var count = 0;
	while (count <= depth)
	{
		if (fs.existsSync(path.resolve(result + "/.bin/protractor")))
		{
			protractorDir = result + "/.bin";
			return protractorDir;
		}
		result = "../" + result;
		count++;
	}
	throw new Error("No protractor installation found.");	
}

var protractor = function(options) {
	var files = [],
		child, args;

	options = options || {};
	args = options.args || [];

	if (!options.configFile) {
		this.emit('error', new PluginError('gulp-protractor', 'Please specify the protractor config file'));
	}
	return es.through(function(file) {
		files.push(file.path);
	}, function() {
		var stream = this;

		// Attach Files, if any
		if (files.length) {
			args.push('--specs');
			args.push(files.join(','));
		}

		// Pass in the config file
		args.unshift(options.configFile);

		child = child_process.spawn(path.resolve(getProtractorDir() + '/protractor'+winExt), args, {
			stdio: 'inherit'
		}).on('exit', function(code) {
			if (child) {
				child.kill();
			}
			if (stream) {
				if (code) {
					stream.emit('error', new PluginError('gulp-protractor', 'protractor exited with code ' + code));
				}
				else {
					stream.emit('end');
				}
			}
		});
	});
};

var webdriver_update = function(cb) {
	child_process.spawn(path.resolve(getProtractorDir() + '/webdriver-manager'+winExt), ['update'], {
		stdio: 'inherit'
	}).once('close', cb);
};

var webdriver_standalone = function(cb) {
	var child = child_process.spawn(path.resolve(getProtractorDir() + '/webdriver-manager'+winExt), ['start'], {
		stdio: 'inherit'
	}).once('close', cb);
};

module.exports = {
	protractor: protractor,
	webdriver_standalone: webdriver_standalone,
	webdriver_update: webdriver_update
};

@@ -1883,22 +1883,287 @@
 unction(
+opts, 
 cb) %7B%0A
+%09var callback = (cb ? cb : opts);%0A%09var options = (cb ? opts : null);%0A%09var args = %5B%22update%22, %22--standalone%22%5D;%0A%09if (options) %7B%0A%09%09if (options.browsers) %7B%0A%09%09%09options.browsers.forEach(function(element, index, array) %7B%0A%09%09%09%09args.push(%22--%22 + element);%0A%09%09%09%7D);%0A%09%09%7D%0A%09%7D%09%0A
 %09child_p
@@ -2243,18 +2243,12 @@
 t), 
-%5B'update'%5D
+args
 , %7B%0A
@@ -2289,24 +2289,167 @@
 ', cb);%0A%7D;%0A%0A
+var webdriver_update_specific = function(opts) %7B%0A%09return webdriver_update.bind(this, opts);%0A%7D;%0A%0Awebdriver_update.bind(null, %5B%22ie%22, %22chrome%22%5D)%0A%0A
 var webdrive
@@ -2758,12 +2758,67 @@
 r_update
+,%0A%09webdriver_update_specific: webdriver_update_specific
 %0A%7D;%0A

Add function to also update internet explorer driver.