(function() {
  window.$Cypress = (function($, _, Backbone, Promise, minimatch) {
    var $Cypress;
    $Cypress = (function() {
      function $Cypress() {
        this.cy = null;
        this.chai = null;
        this.mocha = null;
        this.runner = null;
      }

      $Cypress.prototype.start = function() {
        return window.Cypress = this;
      };

      $Cypress.prototype.setConfig = function(config) {
        var d, environmentVariables, ref, remote;
        if (config == null) {
          config = {};
        }
        if (d = (ref = config.remote) != null ? ref.domainName : void 0) {
          document.domain = d;
        }
        if (config.isHeadless) {
          $Cypress.isHeadless = true;
        }
        environmentVariables = config.environmentVariables, remote = config.remote;
        config = _.omit(config, "environmentVariables", "remote");
        $Cypress.EnvironmentVariables.create(this, environmentVariables);
        $Cypress.Config.create(this, config);
        $Cypress.Cookies.create(this, config.namespace, d);
        return this.trigger("config", config);
      };

      $Cypress.prototype.setVersion = function(version) {
        return this.version = version;
      };

      $Cypress.prototype.initialize = function(specWindow, $remoteIframe) {
        this.mocha.options(this.runner);
        this.trigger("initialize", {
          specWindow: specWindow,
          $remoteIframe: $remoteIframe
        });
        this.trigger("initialized", {
          cy: this.cy,
          runner: this.runner,
          mocha: this.mocha,
          chai: this.chai
        });
        return this;
      };

      $Cypress.prototype.run = function(fn) {
        if (!this.runner) {
          this.Utils.throwErrByPath("miscellaneous.no_runner");
        }
        return this.runner.run(fn);
      };

      $Cypress.prototype.getStartTime = function() {
        return this.runner.getStartTime();
      };

      $Cypress.prototype.getTestsState = function() {
        return this.runner.getTestsState();
      };

      $Cypress.prototype.getEmissions = function() {
        return this.runner.getEmissions();
      };

      $Cypress.prototype.countByTestState = function(tests, state) {
        return this.runner.countByTestState(tests, state);
      };

      $Cypress.prototype.getDisplayPropsForLog = function(attrs) {
        return this.runner.getDisplayPropsForLog(attrs);
      };

      $Cypress.prototype.getConsolePropsForLogById = function(logId) {
        return this.runner.getConsolePropsForLogById(logId);
      };

      $Cypress.prototype.getSnapshotPropsForLogById = function(logId) {
        return this.runner.getSnapshotPropsForLogById(logId);
      };

      $Cypress.prototype.getErrorByTestId = function(testId) {
        return this.runner.getErrorByTestId(testId);
      };

      $Cypress.prototype.checkForEndedEarly = function() {
        return this.cy && this.cy.checkForEndedEarly();
      };

      $Cypress.prototype.onUncaughtException = function() {
        return this.cy.onUncaughtException.apply(this.cy, arguments);
      };

      $Cypress.prototype.after = function(err) {
        if (this._on) {
          this.on = this._on;
        }
        return this;
      };

      $Cypress.prototype.set = function(runnable, hookName) {
        return $Cypress.Cy.set(this, runnable, hookName);
      };

      $Cypress.prototype.onSpecWindow = function(specWindow) {
        var chai, cy, log, mocha, runner;
        cy = $Cypress.Cy.create(this, specWindow);
        chai = $Cypress.Chai.create(this, specWindow);
        mocha = $Cypress.Mocha.create(this, specWindow);
        runner = $Cypress.Runner.create(this, specWindow, mocha);
        log = $Cypress.Log.create(this, cy);
        this.prepareForSpecEvents();
        return this.prepareForCustomCommands();
      };

      $Cypress.prototype.onBeforeLoad = function(contentWindow) {
        if (!this.cy) {
          return;
        }
        if ($Cypress.isHeadless) {
          this.cy.silenceConsole(contentWindow);
        }
        this.cy.bindWindowListeners(contentWindow);
        this.cy._setWindowDocumentProps(contentWindow);
        return this.trigger("before:window:load", contentWindow);
      };

      $Cypress.prototype.prepareForSpecEvents = function() {
        var _this;
        if (this._specEvents == null) {
          this._specEvents = _.extend({}, Backbone.Events);
        }
        this._specEvents.stopListening();
        this._on = this.on;
        _this = this;
        return this.on = _.wrap(this.on, function(orig, name, callback, context) {
          if (context) {
            orig.call(this, name, callback, context);
          } else {
            _this._specEvents.listenTo(_this, name, callback);
          }
          return this;
        });
      };

      $Cypress.prototype.stop = function() {
        delete window.Cypress;
        return this.abort().then((function(_this) {
          return function() {
            _this.trigger("stop");
            _this.removeCustomCommands();
            return _this.off();
          };
        })(this));
      };

      $Cypress.prototype.abort = function() {
        var aborts;
        aborts = [].concat(this.invoke("abort"));
        aborts = _.reject(aborts, function(r) {
          return r === this.cy;
        });
        return Promise.all(aborts).then((function(_this) {
          return function() {
            return _this.restore();
          };
        })(this));
      };

      $Cypress.prototype.restore = function() {
        var restores;
        restores = [].concat(this.invoke("restore"));
        restores = _.reject(restores, function(r) {
          return r === this.cy;
        });
        return Promise.all(restores)["return"](null);
      };

      $Cypress.prototype.$ = function() {
        if (!this.cy) {
          $Cypress.Utils.throwErrByPath("miscellaneous.no_cy");
        }
        return this.cy.$$.apply(this.cy, arguments);
      };

      $Cypress.prototype._ = _;

      $Cypress.prototype.moment = window.moment;

      $Cypress.prototype.Blob = window.blobUtil;

      $Cypress.prototype.Promise = Promise;

      $Cypress.prototype.minimatch = minimatch.js;

      _.extend($Cypress.prototype.$, _($).pick("Event", "Deferred", "ajax", "get", "getJSON", "getScript", "post", "when"));

      _.extend($Cypress.prototype, Backbone.Events);

      $Cypress.create = function(options) {
        var Cypress, i, klass, len, ref;
        if (options == null) {
          options = {};
        }
        _.defaults(options, {
          loadModules: false
        });
        Cypress = new $Cypress;
        ref = "Cy Log Utils Chai Mocha Runner Agents Server Chainer Location LocalStorage Cookies Keyboard Mouse Command Commands EnvironmentVariables Dom ErrorMessages".split(" ");
        for (i = 0, len = ref.length; i < len; i++) {
          klass = ref[i];
          Cypress[klass] = $Cypress[klass];
        }
        Cypress.modules = $Cypress.modules;
        if (options.loadModules) {
          Cypress.loadModules();
        }
        return Cypress;
      };

      $Cypress.extend = function(obj) {
        return _.extend(this.prototype, obj);
      };

      $Cypress.register = function(name, fn) {
        if (this.modules == null) {
          this.modules = {};
        }
        this.modules[name] = fn;
        return this;
      };

      $Cypress.remove = function(name) {
        if (this.modules == null) {
          this.modules = {};
        }
        delete this.modules[name];
        return this;
      };

      $Cypress.reset = function() {
        return this.modules = {};
      };

      return $Cypress;

    })();
    return $Cypress;
  })($, _, Backbone, Promise, minimatch);

}).call(this);
; 
(function() {
  var slice = [].slice;

  (function($Cypress, _, $, chai) {
    var allButLastWordsBetweenSingleQuotes, allEscapedSingleQuotes, allPropertyWordsBetweenSingleQuotes, allQuadStars, allQuoteMarkers, allSingleQuotes, allWordsBetweenCurlyBraces;
    allPropertyWordsBetweenSingleQuotes = /('.*?')$/g;
    allButLastWordsBetweenSingleQuotes = /('.*?')(.+)/g;
    allSingleQuotes = /'/g;
    allEscapedSingleQuotes = /\\'/g;
    allQuoteMarkers = /__quote__/g;
    allWordsBetweenCurlyBraces = /(#{.+?})/g;
    allQuadStars = /\*\*\*\*/g;
    return chai.use(function(chai, utils) {
      var $Chai, assert, assertProto, containProto, existProto, expect, getMessage, lengthProto, matchProto, visibleProto;
      expect = chai.expect;
      assert = chai.assert;
      assertProto = chai.Assertion.prototype.assert;
      matchProto = chai.Assertion.prototype.match;
      lengthProto = chai.Assertion.prototype.__methods.length.method;
      containProto = chai.Assertion.prototype.__methods.contain.method;
      existProto = Object.getOwnPropertyDescriptor(chai.Assertion.prototype, "exist").get;
      visibleProto = Object.getOwnPropertyDescriptor(chai.Assertion.prototype, "visible").get;
      getMessage = utils.getMessage;
      $Chai = (function() {
        function $Chai(Cypress1, specWindow) {
          this.Cypress = Cypress1;
          this.restoreAsserts();
          this.override();
          this.listeners();
          $Chai.setGlobals(specWindow);
          this.addCustomProperties();
        }

        $Chai.prototype.addCustomProperties = function() {
          var _this, fn1, fn2, normalizeNumber;
          _this = this;
          normalizeNumber = function(num) {
            var parsed;
            parsed = Number(num);
            if (_.isNaN(parsed)) {
              return num;
            } else {
              return parsed;
            }
          };
          utils.getMessage = _.wrap(getMessage, function(orig, assert, args) {
            var msg, obj;
            obj = assert._obj;
            if ($Cypress.Utils.hasElement(obj) || $Cypress.Utils.hasWindow(obj) || $Cypress.Utils.hasDocument(obj)) {
              assert._obj = $Cypress.Utils.stringifyElement(obj, "short");
            }
            msg = orig.call(this, assert, args);
            if (obj !== assert._obj) {
              assert._obj = obj;
            }
            return msg;
          });
          chai.Assertion.overwriteMethod("match", function(_super) {
            return function(regExp) {
              var err;
              if (_.isRegExp(regExp) || $Cypress.Utils.hasElement(this._obj)) {
                return _super.apply(this, arguments);
              } else {
                err = $Cypress.Utils.cypressErr($Cypress.Utils.errMessageByPath("chai.match_invalid_argument", {
                  regExp: regExp
                }));
                err.retry = false;
                throw err;
              }
            };
          });
          chai.Assertion.overwriteChainableMethod("contain", fn1 = function(_super) {
            return function(text) {
              var cy, escText, obj, selector;
              cy = _this.Cypress.cy;
              obj = this._obj;
              if (!cy || !($Cypress.Utils.isInstanceOf(obj, $) || $Cypress.Utils.hasElement(obj))) {
                return _super.apply(this, arguments);
              }
              escText = $Cypress.Utils.escapeQuotes(text);
              selector = ":contains('" + escText + "'), [type='submit'][value~='" + escText + "']";
              return this.assert(obj.is(selector) || !!obj.find(selector).length, "expected \#{this} to contain \#{exp}", "expected \#{this} not to contain \#{exp}", text);
            };
          }, fn2 = function(_super) {
            return function() {
              return _super.apply(this, arguments);
            };
          });
          chai.Assertion.overwriteChainableMethod("length", fn1 = function(_super) {
            return function(length) {
              var cy, e1, e2, getLongLengthMessage, node, obj;
              cy = _this.Cypress.cy;
              obj = this._obj;
              if (!cy || !($Cypress.Utils.isInstanceOf(obj, $) || $Cypress.Utils.hasElement(obj))) {
                return _super.apply(this, arguments);
              }
              length = normalizeNumber(length);
              if (!cy._contains(obj)) {
                obj = this._obj = obj.filter(function(index, el) {
                  return cy._contains(el);
                });
              }
              node = obj && obj.length ? $Cypress.Utils.stringifyElement(obj, "short") : obj.selector;
              try {
                return this.assert(obj.length === length, "expected '" + node + "' to have a length of \#{exp} but got \#{act}", "expected '" + node + "' to not have a length of \#{act}", length, obj.length);
              } catch (error1) {
                e1 = error1;
                e1.node = node;
                e1.negated = utils.flag(this, "negate");
                e1.type = "length";
                if (_.isFinite(length)) {
                  getLongLengthMessage = function(len1, len2) {
                    if (len1 > len2) {
                      return "Too many elements found. Found '" + len1 + "', expected '" + len2 + "'.";
                    } else {
                      return "Not enough elements found. Found '" + len1 + "', expected '" + len2 + "'.";
                    }
                  };
                  e1.displayMessage = getLongLengthMessage(obj.length, length);
                  throw e1;
                }
                e2 = $Cypress.Utils.cypressErr($Cypress.Utils.errMessageByPath("chai.length_invalid_argument", {
                  length: length
                }));
                e2.retry = false;
                throw e2;
              }
            };
          }, fn2 = function(_super) {
            return function() {
              return _super.apply(this, arguments);
            };
          });
          chai.Assertion.overwriteProperty("visible", function(_super) {
            return function() {
              var e, reason;
              try {
                return _super.apply(this, arguments);
              } catch (error1) {
                e = error1;
                if ((e.message || "").indexOf("not to be") === -1) {
                  reason = $Cypress.Dom.getReasonElIsHidden(this._obj);
                  e.message += "\n\n" + reason;
                }
                throw e;
              }
            };
          });
          return chai.Assertion.overwriteProperty("exist", function(_super) {
            return function() {
              var cy, e, e1, getLongExistsMessage, isContained, node, obj;
              cy = _this.Cypress.cy;
              obj = this._obj;
              if (!cy || !($Cypress.Utils.isInstanceOf(obj, $) || $Cypress.Utils.hasElement(obj))) {
                try {
                  return _super.apply(this, arguments);
                } catch (error1) {
                  e = error1;
                  e.type = "existence";
                  throw e;
                }
              } else {
                if (!obj.length) {
                  this._obj = null;
                }
                node = obj && obj.length ? $Cypress.Utils.stringifyElement(obj, "short") : obj.selector;
                try {
                  return this.assert(isContained = cy._contains(obj), "expected \#{act} to exist in the DOM", "expected \#{act} not to exist in the DOM", node, node);
                } catch (error1) {
                  e1 = error1;
                  e1.node = node;
                  e1.negated = utils.flag(this, "negate");
                  e1.type = "existence";
                  getLongExistsMessage = function(obj) {
                    if (isContained) {
                      return "Expected " + node + " not to exist in the DOM, but it was continuously found.";
                    } else {
                      return "Expected to find element: '" + obj.selector + "', but never found it.";
                    }
                  };
                  e1.displayMessage = getLongExistsMessage(obj);
                  throw e1;
                }
              }
            };
          });
        };

        $Chai.prototype.listeners = function() {
          this.listenTo(this.Cypress, "stop", (function(_this) {
            return function() {
              return _this.stop();
            };
          })(this));
          return this;
        };

        $Chai.prototype.stop = function() {
          this.stopListening();
          this.restore();
          this.Cypress.chai = null;
          return this;
        };

        $Chai.prototype.restore = function() {
          chai.expect = expect;
          chai.assert = assert;
          this.restoreAsserts();
          return this;
        };

        $Chai.prototype.override = function() {
          var originals;
          originals = {
            expect: expect,
            assert: assert
          };
          _.each(originals, this.patchMethod);
          this.patchAssert();
          return this;
        };

        $Chai.prototype.restoreAsserts = function() {
          utils.getMessage = getMessage;
          chai.Assertion.prototype.assert = assertProto;
          chai.Assertion.prototype.match = matchProto;
          chai.Assertion.prototype.__methods.length.method = lengthProto;
          chai.Assertion.prototype.__methods.contain.method = containProto;
          Object.defineProperty(chai.Assertion.prototype, "exist", {
            get: existProto
          });
          return Object.defineProperty(chai.Assertion.prototype, "visible", {
            get: visibleProto
          });
        };

        $Chai.prototype.patchAssert = function() {
          var _this;
          _this = this;
          chai.Assertion.prototype.assert = _.wrap(assertProto, function() {
            var actual, args, customArgs, e, error, expected, message, orig, passed, value;
            orig = arguments[0], args = 2 <= arguments.length ? slice.call(arguments, 1) : [];
            passed = utils.test(this, args);
            value = utils.flag(this, "object");
            expected = args[3];
            customArgs = _this.replaceArgMessages(args, this._obj);
            message = utils.getMessage(this, customArgs);
            actual = utils.getActual(this, customArgs);
            message = message.replace(/\*\*.*\*\*/, function(match) {
              return match.replace(allEscapedSingleQuotes, "__quote__").replace(allSingleQuotes, "").replace(allQuoteMarkers, "'").replace(allQuadStars, "**''**");
            });
            try {
              orig.apply(this, args);
            } catch (error1) {
              e = error1;
              error = e;
            }
            _this.Cypress.trigger("assert", passed, message, value, actual, expected, error);
            if (error) {
              throw error;
            }
          });
          return this;
        };

        $Chai.prototype.replaceArgMessages = function(args, str) {
          return _.reduce(args, (function(_this) {
            return function(memo, value, index) {
              if (_.isString(value)) {
                value = value.replace(allWordsBetweenCurlyBraces, "**$1**").replace(allEscapedSingleQuotes, "__quote__").replace(allButLastWordsBetweenSingleQuotes, "**$1**$2").replace(allPropertyWordsBetweenSingleQuotes, "**$1**");
                memo.push(value);
              } else {
                memo.push(value);
              }
              return memo;
            };
          })(this), []);
        };

        $Chai.prototype.patchMethod = function(value, key) {
          chai[key] = _.wrap(value, function() {
            var args, orig;
            orig = arguments[0], args = 2 <= arguments.length ? slice.call(arguments, 1) : [];
            args = _.map(args, function(arg) {
              var obj;
              if (obj = $Cypress.Utils.getCypressNamespace(arg)) {
                return obj;
              }
              return arg;
            });
            return orig.apply(this, args);
          });
          return this;
        };

        _.extend($Chai.prototype, Backbone.Events);

        $Chai.expect = function() {
          return chai.expect.apply(chai, arguments);
        };

        $Chai.setGlobals = function(contentWindow) {
          contentWindow.chai = chai;
          contentWindow.expect = chai.expect;
          contentWindow.expectOriginal = expect;
          contentWindow.assert = chai.assert;
          return contentWindow.assertOriginal = assert;
        };

        $Chai.create = function(Cypress, specWindow) {
          var existing;
          if (existing = Cypress.chai) {
            existing.stopListening();
          }
          return Cypress.chai = new $Chai(Cypress, specWindow);
        };

        return $Chai;

      })();
      return $Cypress.Chai = $Chai;
    });
  })($Cypress, _, $, chai);

}).call(this);
; 
(function() {
  var slice = [].slice;

  $Cypress.Chainer = (function($Cypress, _) {
    var $Chainer;
    $Chainer = (function() {
      function $Chainer(cy1) {
        this.cy = cy1;
        this.id = _.uniqueId("chainer");
      }

      $Chainer.extend = function(obj) {
        return _.extend(this.prototype, obj);
      };

      $Chainer.remove = function(key) {
        return delete $Chainer.prototype[key];
      };

      $Chainer.inject = function(key, fn) {
        return $Chainer.prototype[key] = function() {
          var args, onInjectCommand;
          args = 1 <= arguments.length ? slice.call(arguments, 0) : [];
          onInjectCommand = this.cy.prop("onInjectCommand");
          if (_.isFunction(onInjectCommand)) {
            if (onInjectCommand.call.apply(onInjectCommand, [this.cy, key].concat(slice.call(args))) === false) {
              return;
            }
          }
          fn.call(this.cy, this.id, args);
          return this;
        };
      };

      $Chainer.create = function(cy, key, args) {
        var chainer;
        chainer = new $Chainer(cy);
        return chainer[key].apply(chainer, args);
      };

      return $Chainer;

    })();
    return $Chainer;
  })($Cypress, _);

}).call(this);
; 
(function() {
  var slice = [].slice;

  $Cypress.Clock = (function($Cypress, _) {
    var $Clock;
    $Clock = (function() {
      function $Clock(win, now, _methods) {
        this._methods = _methods;
        this._lolexClock = lolex.install(win, now, this._methods);
      }

      $Clock.prototype.tick = function(ms) {
        return this._lolexClock.tick(ms);
      };

      $Clock.prototype.restore = function() {
        return this._lolexClock.uninstall();
      };

      $Clock.prototype._bind = function(win) {
        return this._lolexClock = lolex.install(win, this._lolexClock.now, this._methods);
      };

      $Clock.prototype._details = function() {
        return {
          now: this._lolexClock.now,
          methods: this._lolexClock.methods
        };
      };

      $Clock.create = function() {
        var args;
        args = 1 <= arguments.length ? slice.call(arguments, 0) : [];
        return (function(func, args, ctor) {
          ctor.prototype = func.prototype;
          var child = new ctor, result = func.apply(child, args);
          return Object(result) === result ? result : child;
        })($Clock, args, function(){});
      };

      return $Clock;

    })();
    return $Clock;
  })($Cypress, _);

}).call(this);
; 
(function() {
  var slice = [].slice;

  (function($Cypress, _) {
    var $Command, $Commands;
    $Command = (function() {
      function $Command(obj) {
        if (obj == null) {
          obj = {};
        }
        this.reset();
        this.set(obj);
      }

      $Command.prototype.set = function(key, val) {
        var obj;
        if (_.isString(key)) {
          obj = {};
          obj[key] = val;
        } else {
          obj = key;
        }
        _.extend(this.attributes, obj);
        return this;
      };

      $Command.prototype.finishLogs = function() {
        return _.invoke(this.get("logs"), "finish");
      };

      $Command.prototype.log = function(log) {
        log.set("chainerId", this.get("chainerId"));
        this.get("logs").push(log);
        return this;
      };

      $Command.prototype.getLastLog = function() {
        var j, log, logs;
        logs = this.get("logs");
        if (logs.length) {
          for (j = logs.length - 1; j >= 0; j += -1) {
            log = logs[j];
            if (log.get("event") === false) {
              return log;
            }
          }
        } else {
          return void 0;
        }
      };

      $Command.prototype.hasPreviouslyLinkedCommand = function() {
        var prev;
        prev = this.get("prev");
        return !!(prev && prev.get("chainerId") === this.get("chainerId"));
      };

      $Command.prototype.is = function(str) {
        return this.get("type") === str;
      };

      $Command.prototype.get = function(attr) {
        return this.attributes[attr];
      };

      $Command.prototype.toJSON = function() {
        return this.attributes;
      };

      $Command.prototype._removeNonPrimitives = function(args) {
        var arg, i, j, opts;
        for (i = j = args.length - 1; j >= 0; i = j += -1) {
          arg = args[i];
          if (_.isObject(arg)) {
            opts = _(arg).omit(_.isObject);
            opts.log = true;
            args[i] = opts;
            return;
          }
        }
      };

      $Command.prototype.skip = function() {
        return this.set("skip", true);
      };

      $Command.prototype.stringify = function() {
        var args, name, ref;
        ref = this.attributes, name = ref.name, args = ref.args;
        args = _.reduce(args, function(memo, arg) {
          arg = _.isString(arg) ? _.truncate(arg, 20) : "...";
          memo.push(arg);
          return memo;
        }, []);
        args = args.join(", ");
        return "cy." + name + "('" + args + "')";
      };

      $Command.prototype.clone = function() {
        this._removeNonPrimitives(this.get("args"));
        return $Command.create(_.clone(this.attributes));
      };

      $Command.prototype.reset = function() {
        this.attributes = {};
        this.attributes.logs = [];
        return this;
      };

      $Command.create = function(obj) {
        return new $Command(obj);
      };

      return $Command;

    })();
    $Commands = (function() {
      function $Commands(cmds) {
        if (cmds == null) {
          cmds = [];
        }
        this.commands = cmds;
      }

      $Commands.prototype.logs = function(filters) {
        var logs, matchesFilters;
        logs = _.flatten(this.invoke("get", "logs"));
        if (filters) {
          matchesFilters = _.matches(filters);
          logs = _(logs).filter(function(log) {
            return matchesFilters(log.attributes);
          });
        }
        return logs;
      };

      $Commands.prototype.add = function(obj) {
        if ($Cypress.Utils.isInstanceOf(obj, $Command)) {
          return obj;
        } else {
          return $Command.create(obj);
        }
      };

      $Commands.prototype.get = function() {
        return this.commands;
      };

      $Commands.prototype.names = function() {
        return this.invoke("get", "name");
      };

      $Commands.prototype.splice = function(start, end, obj) {
        var cmd, next, prev;
        cmd = this.add(obj);
        this.commands.splice(start, end, cmd);
        prev = this.at(start - 1);
        next = this.at(start + 1);
        if (prev) {
          prev.set("next", cmd);
          cmd.set("prev", prev);
        }
        if (next) {
          next.set("prev", cmd);
          cmd.set("next", next);
        }
        return cmd;
      };

      $Commands.prototype.slice = function() {
        var cmds;
        cmds = this.commands.slice.apply(this.commands, arguments);
        return $Commands.create(cmds);
      };

      $Commands.prototype.at = function(index) {
        return this.commands[index];
      };

      $Commands.prototype._filterByAttrs = function(attrs, method) {
        var matchesAttrs;
        matchesAttrs = _.matches(attrs);
        return this[method](function(command) {
          return matchesAttrs(command.attributes);
        });
      };

      $Commands.prototype.where = function(attrs) {
        return this._filterByAttrs(attrs, "filter");
      };

      $Commands.prototype.findWhere = function(attrs) {
        return this._filterByAttrs(attrs, "find");
      };

      $Commands.prototype.toJSON = function() {
        return this.invoke("toJSON");
      };

      $Commands.prototype.reset = function() {
        this.commands.splice(0, this.commands.length);
        return this;
      };

      $Commands.create = function(cmds) {
        return new $Commands(cmds);
      };

      return $Commands;

    })();
    Object.defineProperty($Commands.prototype, "length", {
      get: function() {
        return this.commands.length;
      }
    });
    _.each(["pick"], function(method) {
      return $Command.prototype[method] = function() {
        var args;
        args = 1 <= arguments.length ? slice.call(arguments, 0) : [];
        args.unshift(this.attributes);
        return _[method].apply(_, args);
      };
    });
    _.each(["invoke", "map", "pluck", "first", "reduce", "find", "filter", "reject", "last", "indexOf", "each"], function(method) {
      return $Commands.prototype[method] = function() {
        var args;
        args = 1 <= arguments.length ? slice.call(arguments, 0) : [];
        args.unshift(this.commands);
        return _[method].apply(_, args);
      };
    });
    $Cypress.Command = $Command;
    $Cypress.Commands = $Commands;
    return $Cypress.extend({
      addChildCommand: function(key, fn) {
        return this.add(key, fn, "child");
      },
      addParentCommand: function(key, fn) {
        return this.add(key, fn, "parent");
      },
      addDualCommand: function(key, fn) {
        return this.add(key, fn, "dual");
      },
      addAssertionCommand: function(key, fn) {
        return this.add(key, fn, "assertion");
      },
      addUtilityCommand: function(key, fn) {
        return this.add(key, fn, "utility");
      },
      prepareForCustomCommands: function() {
        var _this;
        this.removeCustomCommands();
        this._inject = this.inject;
        _this = this;
        this._customCommands = [];
        return this.inject = _.wrap(this.inject, function(orig, key, fn, type) {
          _this._customCommands.push(key);
          return orig.call(this, key, fn, type);
        });
      },
      removeCustomCommands: function() {
        var ref;
        if (this._inject) {
          this.inject = this._inject;
        }
        return _.each((ref = this._customCommands) != null ? ref : [], function(key) {
          delete $Cypress.Cy.prototype[key];
          delete $Cypress.Cy.prototype.sync[key];
          return $Cypress.Chainer.remove(key);
        });
      },
      add: function(key, fn, type) {
        if (!type) {
          $Cypress.Utils.throwErrByPath("add.type_missing");
        }
        if (_.isObject(key)) {
          _.each(key, (function(_this) {
            return function(fn, name) {
              return _this.add(name, fn, type);
            };
          })(this));
          return this;
        }
        this.inject(key, fn, type);
        return this;
      },
      inject: function(key, fn, type) {
        var _this, prepareSubject, wrap, wrapByType;
        _this = this;
        prepareSubject = function(args) {
          var subject;
          subject = this.prop("subject");
          args.unshift(subject);
          this.trigger("next:subject:prepared", subject, args);
          return args;
        };
        wrap = function(fn) {
          var wrapped;
          wrapped = wrapByType(fn);
          wrapped.originalFn = fn;
          return wrapped;
        };
        wrapByType = function(fn) {
          switch (type) {
            case "parent":
              return fn;
            case "dual":
            case "utility":
              return _.wrap(fn, function() {
                var args, orig;
                orig = arguments[0], args = 2 <= arguments.length ? slice.call(arguments, 1) : [];
                args = prepareSubject.call(this, args);
                return orig.apply(this, args);
              });
            case "child":
            case "assertion":
              return _.wrap(fn, function() {
                var args, orig, ret, subject;
                orig = arguments[0], args = 2 <= arguments.length ? slice.call(arguments, 1) : [];
                this.ensureParent();
                args = prepareSubject.call(this, args);
                subject = args[0];
                ret = orig.apply(this, args);
                return ret != null ? ret : subject;
              });
          }
        };
        $Cypress.Cy.prototype[key] = function() {
          var args, chain;
          args = 1 <= arguments.length ? slice.call(arguments, 0) : [];
          if (!this["private"]("runnable")) {
            $Cypress.Utils.throwErrByPath("miscellaneous.outside_test");
          }
          chain = $Cypress.Chainer.create(this, key, args);
          this.prop("chain", chain);
          return chain;
        };
        $Cypress.Cy.prototype.sync[key] = function() {
          var args;
          args = 1 <= arguments.length ? slice.call(arguments, 0) : [];
          return wrap(fn).apply(_this.cy, args);
        };
        return $Cypress.Chainer.inject(key, function(chainerId, args) {
          return this.enqueue(key, wrap.call(this, fn), args, type, chainerId);
        });
      }
    });
  })($Cypress, _);

}).call(this);
; 
(function() {
  $Cypress.Config = (function($Cypress, _) {
    return {
      create: function(Cypress, config) {
        var get, set;
        get = function(key) {
          if (key) {
            return config[key];
          } else {
            return config;
          }
        };
        set = function(key, value) {
          var obj;
          if (_.isObject(key)) {
            obj = key;
          } else {
            obj = {};
            obj[key] = value;
          }
          return _.extend(config, obj);
        };
        return Cypress.config = function(key, value) {
          switch (arguments.length) {
            case 0:
              return get();
            case 1:
              if (_.isString(key)) {
                return get(key);
              } else {
                return set(key);
              }
              break;
            default:
              return set(key, value);
          }
        };
      }
    };
  })($Cypress, _);

}).call(this);
; 
(function() {
  var indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; },
    slice = [].slice;

  $Cypress.Cookies = (function($Cypress, _) {
    var $Cookies, defaults, isDebugging, isDebuggingVerbose, preserved, reHttp;
    reHttp = /^http/;
    isDebugging = false;
    isDebuggingVerbose = false;
    preserved = {};
    defaults = {
      whitelist: null
    };
    $Cookies = function(namespace, domain) {
      var API, isNamespaced, isWhitelisted, removePreserved;
      isNamespaced = function(name) {
        return _(name).startsWith(namespace);
      };
      isWhitelisted = function(cookie) {
        var ref, w;
        if (w = defaults.whitelist) {
          switch (false) {
            case !_.isString(w):
              return cookie.name === w;
            case !_.isArray(w):
              return ref = cookie.name, indexOf.call(w, ref) >= 0;
            case !_.isFunction(w):
              return w(cookie);
            case !_.isRegExp(w):
              return w.test(cookie.name);
            default:
              return false;
          }
        }
      };
      removePreserved = function(name) {
        if (preserved[name]) {
          return delete preserved[name];
        }
      };
      API = {
        debug: function(bool, options) {
          if (bool == null) {
            bool = true;
          }
          if (options == null) {
            options = {};
          }
          _.defaults(options, {
            verbose: true
          });
          isDebugging = bool;
          return isDebuggingVerbose = bool && options.verbose;
        },
        log: function(message, cookie, removed) {
          var args, m;
          if (!isDebugging) {
            return;
          }
          m = removed ? "warn" : "info";
          args = [_.truncate(message, 50)];
          if (isDebuggingVerbose) {
            args.push(cookie);
          }
          return console[m].apply(console, args);
        },
        getClearableCookies: function(cookies) {
          if (cookies == null) {
            cookies = [];
          }
          return _.filter(cookies, function(cookie) {
            return !isWhitelisted(cookie) && !removePreserved(cookie.name);
          });
        },
        _set: function(name, value, options) {
          if (options == null) {
            options = {};
          }
          if (this.getCy("unload") === "true") {
            return;
          }
          _.defaults(options, {
            path: "/"
          });
          return Cookies.set(name, value, options);
        },
        _get: function(name) {
          return Cookies.get(name);
        },
        setCy: function(name, value, options) {
          if (options == null) {
            options = {};
          }
          _.defaults(options, {
            domain: domain
          });
          return this._set(namespace + "." + name, value, options);
        },
        getCy: function(name) {
          return this._get(namespace + "." + name);
        },
        preserveOnce: function() {
          var keys;
          keys = 1 <= arguments.length ? slice.call(arguments, 0) : [];
          return _.each(keys, function(key) {
            return preserved[key] = true;
          });
        },
        clearCypressCookies: function() {
          return _.each(Cookies.get(), function(value, key) {
            if (isNamespaced(key)) {
              return Cookies.remove(key, {
                path: "/",
                domain: domain
              });
            }
          });
        },
        setInitial: function() {
          return this.setCy("initial", true);
        },
        defaults: function(obj) {
          if (obj == null) {
            obj = {};
          }
          return _.extend(defaults, obj);
        }
      };
      _.each(["get", "set", "remove", "getAllCookies", "clearCookies"], function(method) {
        return API[method] = function() {
          return $Cypress.Utils.throwErrByPath("cookies.removed_method", {
            args: {
              method: method
            }
          });
        };
      });
      return API;
    };
    $Cookies.create = function(Cypress, namespace, domain) {
      return Cypress.Cookies = $Cookies(namespace, domain);
    };
    return $Cookies;
  })($Cypress, _);

}).call(this);
; 
(function() {
  var slice = [].slice;

  $Cypress.Cy = (function($Cypress, _, Backbone, Promise) {
    var $Cy, crossOriginScriptRe;
    crossOriginScriptRe = /^script error/i;
    $Cy = (function() {
      $Cy.prototype.sync = {};

      function $Cy(Cypress1, specWindow) {
        this.Cypress = Cypress1;
        this.id = _.uniqueId("cy");
        this.defaults();
        this.listeners();
        this.commands = $Cypress.Commands.create();
        this.privates = {};
        specWindow.cy = this;
      }

      $Cy.prototype.initialize = function(obj) {
        var $remoteIframe;
        this.defaults();
        $remoteIframe = obj.$remoteIframe;
        this["private"]("$remoteIframe", $remoteIframe);
        this._setRemoteIframeProps($remoteIframe);
        $remoteIframe.on("load", (function(_this) {
          return function() {
            if (_this._setWindowDocumentProps($remoteIframe.prop("contentWindow"))) {
              _this.urlChanged(null, {
                log: false
              });
              _this.pageLoading(false);
              _this.bindWindowListeners(_this["private"]("window"));
              _this.isReady(true, "load");
              return _this.Cypress.trigger("load");
            }
          };
        })(this));
        return this.isReady(true, "initialize");
      };

      $Cy.prototype.defaults = function() {
        this.props = {};
        return this;
      };

      $Cy.prototype.silenceConsole = function(contentWindow) {
        var c;
        if (c = contentWindow.console) {
          c.log = function() {};
          c.warn = function() {};
          return c.info = function() {};
        }
      };

      $Cy.prototype.listeners = function() {
        this.listenTo(this.Cypress, "initialize", (function(_this) {
          return function(obj) {
            return _this.initialize(obj);
          };
        })(this));
        this.listenTo(this.Cypress, "stop", (function(_this) {
          return function() {
            return _this.stop();
          };
        })(this));
        this.listenTo(this.Cypress, "restore", (function(_this) {
          return function() {
            return _this.restore();
          };
        })(this));
        this.listenTo(this.Cypress, "abort", (function(_this) {
          return function() {
            return _this.abort();
          };
        })(this));
        return this.listenTo(this.Cypress, "test:after:hooks", (function(_this) {
          return function(test) {
            return _this.checkTestErr(test);
          };
        })(this));
      };

      $Cy.prototype.abort = function() {
        var promise, ready, readyPromise, ref;
        this.offWindowListeners();
        this.offIframeListeners(this["private"]("$remoteIframe"));
        this.isReady(false, "abort");
        if ((ref = this["private"]("runnable")) != null) {
          ref.clearTimeout();
        }
        promise = this.prop("promise");
        if (promise != null) {
          promise.cancel();
        }
        this._aborted = true;
        ready = this.prop("ready");
        if (ready && (readyPromise = ready.promise)) {
          if (readyPromise.isCancellable()) {
            readyPromise.cancel();
          }
        }
        return Promise.resolve(promise);
      };

      $Cy.prototype.stop = function() {
        delete window.cy;
        this.stopListening();
        this.offWindowListeners();
        this.offIframeListeners(this["private"]("$remoteIframe"));
        this.privates = {};
        return this.Cypress.cy = null;
      };

      $Cy.prototype.restore = function() {
        this.clearTimeout(this.prop("timerId"));
        this.commands.reset();
        this.off();
        this.defaults();
        return this;
      };

      $Cy.prototype.options = function(options) {
        if (options == null) {
          options = {};
        }
      };

      $Cy.prototype.checkForEndedEarly = function() {
        var index;
        index = this.prop("index");
        if (index > 0 && index < this.commands.length) {
          return this.endedEarlyErr(index);
        }
      };

      $Cy.prototype.nullSubject = function() {
        this.prop("subject", null);
        return this;
      };

      $Cy.prototype._eventHasReturnValue = function(e) {
        var val;
        val = e.originalEvent.returnValue;
        if (val === "" || _.isUndefined(val)) {
          return false;
        }
        return true;
      };

      $Cy.prototype.isReady = function(bool, event) {
        var ready;
        if (bool == null) {
          bool = true;
        }
        if (bool) {
          this.prop("recentlyReady", true);
          if (ready = this.prop("ready")) {
            if (ready.promise.isPending()) {
              ready.promise.then((function(_this) {
                return function() {
                  _this.trigger("ready", true);
                  return null;
                };
              })(this));
            }
          }
          return ready != null ? ready.resolve() : void 0;
        }
        if (this.prop("ready") && this.prop("ready").promise.isPending()) {
          return;
        }
        this.trigger("ready", false);
        return this.prop("ready", Promise.pending());
      };

      $Cy.prototype.run = function() {
        var command, index, next, prevTimeout, ref, run, runnable;
        index = (ref = this.prop("index")) != null ? ref : this.prop("index", 0);
        command = this.commands.at(index);
        if (command && command.get("skip")) {
          command.set({
            prev: this.commands.at(index - 1),
            next: this.commands.at(index + 1)
          });
          this.prop("index", index + 1);
          this.prop("subject", command.get("subject"));
          return this.run();
        }
        runnable = this["private"]("runnable");
        if (!command) {
          this.trigger("end");
          if (next = this.prop("next")) {
            next();
            this.prop("next", null);
          }
          return this;
        }
        prevTimeout = this._timeout();
        this._timeout(30000);
        run = (function(_this) {
          return function() {
            var promise;
            if (_this._aborted) {
              return;
            }
            if (_this["private"]("runnable") !== runnable) {
              return;
            }
            _this._timeout(prevTimeout);
            _this.trigger("command:start", command);
            promise = _this.set(command).then(function() {
              var fn;
              if (!runnable.state) {
                _this._timeout(prevTimeout);
              }
              _this.prop("index", index += 1);
              _this.trigger("command:end", command);
              if (fn = _this.prop("onPaused")) {
                fn.call(_this, _this.run);
              } else {
                _this.defer(_this.run);
              }
              return null;
            })["catch"](Promise.CancellationError, function(err) {
              _this.cancel(err);
              return err;
            })["catch"](function(err) {
              return _this.onFail(err);
            });
            _this.prop("promise", promise);
            return _this.trigger("set", command);
          };
        })(this);
        return this.defer(run);
      };

      $Cy.prototype.onUncaughtException = function(msg, source, lineno, colno, err) {
        var createErrFromMsg, current;
        current = this.prop("current");
        if (crossOriginScriptRe.test(msg)) {
          msg = $Cypress.Utils.errMessageByPath("uncaught.cross_origin_script");
        }
        createErrFromMsg = function() {
          return new Error($Cypress.Utils.errMessageByPath("uncaught.error", {
            msg: msg,
            source: source,
            lineno: lineno
          }));
        };
        if (err == null) {
          err = createErrFromMsg();
        }
        err.name = "Uncaught " + err.name;
        err.onFail = function() {
          var log;
          if (log = current && current.getLastLog()) {
            return log.error(err);
          }
        };
        this.onFail(err);
        return true;
      };

      $Cy.prototype.onFail = function(err) {
        this.fail(err);
        this.prop("nestedIndex", null);
        this.prop("recentlyReady", null);
        this.prop("index", this.commands.length);
        return err;
      };

      $Cy.prototype.clearTimeout = function(id) {
        if (id) {
          clearImmediate(id);
        }
        return this;
      };

      $Cy.prototype.set = function(command) {
        var promise;
        this.prop("current", command);
        promise = this.prop("ready") ? Promise.resolve(this.prop("ready").promise) : Promise.resolve();
        return promise.cancellable().then((function(_this) {
          return function() {
            _this.trigger("invoke:start", command);
            _this.prop("nestedIndex", _this.prop("index"));
            return command.get("args");
          };
        })(this)).all().then((function(_this) {
          return function(args) {
            var ret;
            if (_.isFunction(args[0]) && args[0]._invokeImmediately) {
              args[0] = args[0].call(_this);
            }
            _this._checkForNewChain(command.get("chainerId"));
            ret = command.get("fn").apply(command.get("ctx"), args);
            _this.trigger("command:returned:value", command, ret);
            if (ret === _this || ret === _this.chain()) {
              return null;
            } else {
              return ret;
            }
          };
        })(this)).then((function(_this) {
          return function(subject) {
            var ready;
            if (subject && $Cypress.Utils.hasElement(subject) && !$Cypress.Utils.isInstanceOf(subject, $)) {
              subject = _this.$$(subject);
            }
            command.set({
              subject: subject
            });
            command.finishLogs();
            _this.trigger("invoke:subject", subject, command);
            _this.prop("nestedIndex", null);
            _this.prop("recentlyReady", null);
            _this.prop("subject", subject);
            _this.trigger("invoke:end", command);
            if (ready = _this.prop("ready")) {
              if (ready.promise.isPending()) {
                return ready.promise.then(function() {
                  if (_this.prop("pageChangeEvent")) {
                    _this.prop("pageChangeEvent", false);
                    if ($Cypress.Utils.hasElement(subject) && !_this._contains(subject)) {
                      _this.nullSubject();
                    }
                    return _this.prop("subject");
                  }
                })["catch"](function(err) {});
              }
            }
            return _this.prop("subject");
          };
        })(this));
      };

      $Cy.prototype.cancel = function(err) {
        return this.trigger("cancel", this.prop("current"));
      };

      $Cy.prototype.enqueue = function(key, fn, args, type, chainerId) {
        var obj;
        this.clearTimeout(this.prop("timerId"));
        obj = {
          name: key,
          ctx: this,
          fn: fn,
          args: args,
          type: type,
          chainerId: chainerId
        };
        this.trigger("enqueue", obj);
        this.Cypress.trigger("enqueue", obj);
        return this.insertCommand(obj);
      };

      $Cy.prototype.insertCommand = function(obj) {
        var index, nestedIndex;
        nestedIndex = this.prop("nestedIndex");
        if (_.isNumber(nestedIndex)) {
          this.prop("nestedIndex", nestedIndex += 1);
        }
        index = _.isNumber(nestedIndex) ? nestedIndex : this.commands.length;
        this.commands.splice(index, 0, obj);
        if (!nestedIndex) {
          this.defer(this.run);
        }
        return this;
      };

      $Cy.prototype._contains = function($el) {
        var contains, doc;
        doc = this["private"]("document");
        contains = function(el) {
          return $.contains(doc, el);
        };
        if (_.isElement($el)) {
          return contains($el);
        } else {
          if ($el.length === 0) {
            return false;
          }
          return _.all($el.toArray(), contains);
        }
      };

      $Cy.prototype._checkForNewChain = function(chainerId) {
        var id;
        if (_.isUndefined(chainerId)) {
          return;
        }
        if (!(id = this.prop("chainerId"))) {
          return this.prop("chainerId", chainerId);
        } else {
          if (id !== chainerId) {
            this.prop("chainerId", chainerId);
            return this.nullSubject();
          }
        }
      };

      $Cy.prototype.execute = function() {
        var args, name;
        name = arguments[0], args = 2 <= arguments.length ? slice.call(arguments, 1) : [];
        return Promise.resolve(this.sync[name].apply(this, args)).cancellable();
      };

      $Cy.prototype.defer = function(fn) {
        this.clearTimeout(this.prop("timerId"));
        if (this._aborted) {
          return;
        }
        return this.prop("timerId", setImmediate(_.bind(fn, this)));
      };

      $Cy.prototype.hook = function(name) {
        return this["private"]("hookName", name);
      };

      $Cy.prototype.chain = function() {
        return this.prop("chain");
      };

      $Cy.prototype._setWindowDocumentProps = function(contentWindow) {
        var e, ready;
        try {
          this["private"]("window", contentWindow);
          this["private"]("document", contentWindow.document);
        } catch (error) {
          e = error;
          if (ready = this.prop("ready")) {
            ready.reject(e);
          } else {
            this.fail(e);
          }
          return false;
        }
        return true;
      };

      $Cy.prototype._setRemoteIframeProps = function($iframe) {
        this["private"]("$remoteIframe", $iframe);
        return this._setWindowDocumentProps($iframe.prop("contentWindow"));
      };

      $Cy.prototype._setRunnable = function(runnable, hookName) {
        var timeout;
        runnable.startedAt = new Date;
        if (_.isFinite(timeout = this.Cypress.config("defaultCommandTimeout"))) {
          runnable.timeout(timeout);
        }
        this.hook(hookName);
        this["private"]("runnable", runnable);
        return this;
      };

      $Cy.prototype.$$ = function(selector, context) {
        if (context == null) {
          context = this["private"]("document");
        }
        return new $.fn.init(selector, context);
      };

      _.extend($Cy.prototype, Backbone.Events);

      ["_", "$", "Promise", "Blob", "moment"].forEach(function(lib) {
        return Object.defineProperty($Cy.prototype, lib, {
          get: function() {
            var Cypress, ref;
            $Cypress.Utils.warning("cy." + lib + " is now deprecated.\n\nThis object is now attached to 'Cypress' and not 'cy'.\n\nPlease update and use: Cypress." + lib);
            Cypress = (ref = this.Cypress) != null ? ref : $Cypress.prototype;
            if (lib === "$") {
              return _.bind(Cypress[lib], Cypress);
            } else {
              return Cypress[lib];
            }
          }
        });
      });

      $Cy.extend = function(obj) {
        return _.extend(this.prototype, obj);
      };

      $Cy.set = function(Cypress, runnable, hookName) {
        var cy;
        if (!(cy = Cypress.cy)) {
          return;
        }
        return cy._setRunnable(runnable, hookName);
      };

      $Cy.create = function(Cypress, specWindow) {
        var existing;
        if (existing = Cypress.cy) {
          existing.stopListening();
        }
        return Cypress.cy = window.cy = new $Cy(Cypress, specWindow);
      };

      return $Cy;

    })();
    return $Cy;
  })($Cypress, _, Backbone, Promise);

}).call(this);
; 
(function() {
  $Cypress.Dom = (function($Cypress, _, $) {
    var fixedOrAbsoluteRe, obj;
    fixedOrAbsoluteRe = /(fixed|absolute)/;
    return obj = {
      isHidden: $.expr.filters.hidden = function(el) {
        var $el;
        if (!$Cypress.Utils.hasElement(el)) {
          $Cypress.Utils.throwErrByPath("dom.non_dom_is_hidden", {
            args: {
              el: el
            }
          });
        }
        $el = $(el);
        return obj.elHasNoOffsetWidthOrHeight($el) || obj.elHasVisibilityHidden($el) || obj.elIsHiddenByAncestors($el);
      },
      elHasNoOffsetWidthOrHeight: function($el) {
        return this.elOffsetWidth($el) <= 0 || this.elOffsetHeight($el) <= 0;
      },
      elOffsetWidth: function($el) {
        return $el[0].offsetWidth;
      },
      elOffsetHeight: function($el) {
        return $el[0].offsetHeight;
      },
      elHasVisibilityHidden: function($el) {
        return $el.css("visibility") === "hidden";
      },
      elHasDisplayNone: function($el) {
        return $el.css("display") === "none";
      },
      elHasOverflowHidden: function($el) {
        return $el.css("overflow") === "hidden";
      },
      elDescendentsHavePositionFixedOrAbsolute: function($parent, $child) {
        var $els;
        $els = $child.parentsUntil($parent).add($child);
        return _.any($els.get(), function(el) {
          return fixedOrAbsoluteRe.test($(el).css("position"));
        });
      },
      elIsHiddenByAncestors: function($el, $origEl) {
        var $parent;
        if ($origEl == null) {
          $origEl = $el;
        }
        $parent = $el.parent();
        if ($parent.is("body,html") || $Cypress.Utils.hasDocument($parent)) {
          return false;
        }
        if (this.elHasOverflowHidden($parent) && this.elHasNoOffsetWidthOrHeight($parent)) {
          if (this.elDescendentsHavePositionFixedOrAbsolute($parent, $origEl)) {
            return false;
          } else {
            return true;
          }
        }
        return this.elIsHiddenByAncestors($parent, $origEl);
      },
      parentHasNoOffsetWidthOrHeightAndOverflowHidden: function($el) {
        if (!$el.length || $el.is("body,html")) {
          return false;
        }
        if (this.elHasOverflowHidden($el) && this.elHasNoOffsetWidthOrHeight($el)) {
          return $el;
        } else {
          return this.parentHasNoOffsetWidthOrHeightAndOverflowHidden($el.parent());
        }
      },
      parentHasDisplayNone: function($el) {
        if (!$el.length || $Cypress.Utils.hasDocument($el)) {
          return false;
        }
        if (this.elHasDisplayNone($el)) {
          return $el;
        } else {
          return this.parentHasDisplayNone($el.parent());
        }
      },
      parentHasVisibilityNone: function($el) {
        if (!$el.length || $Cypress.Utils.hasDocument($el)) {
          return false;
        }
        if (this.elHasVisibilityHidden($el)) {
          return $el;
        } else {
          return this.parentHasVisibilityNone($el.parent());
        }
      },
      getReasonElIsHidden: function($el) {
        var $parent, height, node, width;
        switch (false) {
          case !this.elHasDisplayNone($el):
            return "This element is not visible because it has CSS property: 'display: none'";
          case !($parent = this.parentHasDisplayNone($el.parent())):
            node = $Cypress.Utils.stringifyElement($parent, "short");
            return "This element is not visible because it's parent: " + node + " has CSS property: 'display: none'";
          case !($parent = this.parentHasVisibilityNone($el.parent())):
            node = $Cypress.Utils.stringifyElement($parent, "short");
            return "This element is not visible because it's parent: " + node + " has CSS property: 'visibility: hidden'";
          case !this.elHasVisibilityHidden($el):
            return "This element is not visible because it has CSS property: 'visibility: hidden'";
          case !this.elHasNoOffsetWidthOrHeight($el):
            width = this.elOffsetWidth($el);
            height = this.elOffsetHeight($el);
            return "This element is not visible because it has an effective width and height of: '" + width + " x " + height + "' pixels.";
          case !($parent = this.parentHasNoOffsetWidthOrHeightAndOverflowHidden($el.parent())):
            node = $Cypress.Utils.stringifyElement($parent, "short");
            width = this.elOffsetWidth($parent);
            height = this.elOffsetHeight($parent);
            return "This element is not visible because it's parent: " + node + " has CSS property: 'overflow: hidden' and an effective width and height of: '" + width + " x " + height + "' pixels.";
          default:
            return "Cypress could not determine why this element is not visible.";
        }
      }
    };
  })($Cypress, _, $);

}).call(this);
; 
(function() {
  $Cypress.EnvironmentVariables = (function($Cypress, _) {
    var $EnvironmentVariables;
    $Cypress.extend({
      env: function(key, value) {
        var env;
        env = this.environmentVariables;
        if (!env) {
          $Cypress.Utils.throwErrByPath("env.variables_missing");
        }
        return env.getOrSet.apply(env, arguments);
      }
    });
    $EnvironmentVariables = (function() {
      function $EnvironmentVariables(obj) {
        if (obj == null) {
          obj = {};
        }
        this.env = {};
        this.set(obj);
      }

      $EnvironmentVariables.prototype.getOrSet = function(key, value) {
        switch (false) {
          case arguments.length !== 0:
            return this.get();
          case arguments.length !== 1:
            if (_.isString(key)) {
              return this.get(key);
            } else {
              return this.set(key);
            }
            break;
          default:
            return this.set(key, value);
        }
      };

      $EnvironmentVariables.prototype.get = function(key) {
        if (key) {
          return this.env[key];
        } else {
          return this.env;
        }
      };

      $EnvironmentVariables.prototype.set = function(key, value) {
        var obj;
        if (_.isObject(key)) {
          obj = key;
        } else {
          obj = {};
          obj[key] = value;
        }
        return _.extend(this.env, obj);
      };

      $EnvironmentVariables.create = function(Cypress, obj) {
        return Cypress.environmentVariables = new $EnvironmentVariables(obj);
      };

      return $EnvironmentVariables;

    })();
    return $EnvironmentVariables;
  })($Cypress, _);

}).call(this);
; 
(function() {
  $Cypress.ErrorMessages = (function($Cypress) {
    var cmd, divider, format, formatProp, formatRedirect, formatRedirects, getHttpProps, getRedirects;
    divider = function(num, char) {
      return Array(num).join(char);
    };
    format = function(data) {
      switch (false) {
        case !_.isString(data):
          return _.truncate(data, 100);
        case !_.isObject(data):
          return JSON.stringify(data, null, 2);
        default:
          return data;
      }
    };
    formatRedirect = function(redirect) {
      return "  - " + redirect;
    };
    formatRedirects = function(redirects) {
      if (redirects == null) {
        redirects = [];
      }
      return _.map(redirects, formatRedirect);
    };
    formatProp = function(memo, field) {
      var key, value;
      key = field.key, value = field.value;
      if (value != null) {
        memo.push(_.capitalize(key) + ": " + format(value));
      }
      return memo;
    };
    cmd = function(command, args) {
      if (args == null) {
        args = "";
      }
      return "cy." + command + "(" + args + ")";
    };
    getRedirects = function(obj, phrase) {
      var list, redirects, ref, word;
      redirects = (ref = obj.redirects) != null ? ref : [];
      if (!redirects.length) {
        return "";
      }
      word = $Cypress.Utils.plural(redirects.length, "times", "time");
      list = formatRedirects(redirects);
      return phrase + " '" + redirects.length + "' " + word + " to:\n\n" + (list.join("\n"));
    };
    getHttpProps = function(fields) {
      if (fields == null) {
        fields = [];
      }
      return _.chain(fields).reduce(formatProp, []).value().join("\n");
    };
    return {
      add: {
        type_missing: "Cypress.add(key, fn, type) must include a type!"
      },
      alias: {
        invalid: "Invalid alias: '{{name}}'.\nYou forgot the '@'. It should be written as: '@{{displayName}}'.",
        not_registered_with_available: (cmd('{{cmd}}')) + " could not find a registered alias for: '@{{displayName}}'.\nAvailable aliases are: '{{availableAliases}}'.",
        not_registered_without_available: (cmd('{{cmd}}')) + " could not find a registered alias for: '@{{displayName}}'.\nYou have not aliased anything yet."
      },
      as: {
        empty_string: (cmd('as')) + " cannot be passed an empty string.",
        invalid_type: (cmd('as')) + " can only accept a string.",
        reserved_word: (cmd('as')) + " cannot be aliased as: '{{alias}}'. This word is reserved."
      },
      blur: {
        multiple_elements: (cmd('blur')) + " can only be called on a single element. Your subject contained {{num}} elements.",
        no_focused_element: (cmd('blur')) + " can only be called when there is a currently focused element.",
        timed_out: (cmd('blur')) + " timed out because your browser did not receive any blur events. This is a known bug in Chrome when it is not the currently focused window.",
        wrong_focused_element: (cmd('blur')) + " can only be called on the focused element. Currently the focused element is a: {{node}}"
      },
      chai: {
        length_invalid_argument: "You must provide a valid number to a length assertion. You passed: '{{length}}'",
        match_invalid_argument: "'chai#match' requires its argument be a 'RegExp'. You passed: '{{regExp}}'"
      },
      check_uncheck: {
        invalid_element: (cmd('{{cmd}}')) + " can only be called on :checkbox{{phrase}}. Your subject {{word}} a: {{node}}"
      },
      clear: {
        invalid_element: (cmd('clear')) + " can only be called on textarea or :text. Your subject {{word}} a: {{node}}"
      },
      clearCookie: {
        invalid_argument: (cmd('clearCookie')) + " must be passed a string argument for name."
      },
      clearLocalStorage: {
        invalid_argument: (cmd('clearLocalStorage')) + " must be called with either a string or regular expression."
      },
      click: {
        multiple_elements: (cmd('click')) + " can only be called on a single element. Your subject contained {{num}} elements. Pass {multiple: true} if you want to serially click each element.",
        on_select_element: (cmd('click')) + " cannot be called on a <select> element. Use " + (cmd('select')) + " command instead to change the value."
      },
      clock: {
        already_created: (cmd('clock')) + " can only be called once per test. Use the clock returned from the previous call.",
        invalid_1st_arg: (cmd('clock')) + " only accepts a number or an options object for its first argument. You passed: {{arg}}",
        invalid_2nd_arg: (cmd('clock')) + " only accepts an array of function names or an options object for its second argument. You passed: {{arg}}"
      },
      contains: {
        empty_string: (cmd('contains')) + " cannot be passed an empty string.",
        invalid_argument: (cmd('contains')) + " can only accept a string, number or regular expression.",
        length_option: (cmd('contains')) + " cannot be passed a length option because it will only ever return 1 element."
      },
      cookies: {
        removed_method: "The Cypress.Cookies.{{method}}() method has been removed.\n\nSetting, getting, and clearing cookies is now an asynchronous operation.\n\nReplace this call with the appropriate command such as:\n  - cy.getCookie()\n  - cy.getCookies()\n  - cy.setCookie()\n  - cy.clearCookie()\n  - cy.clearCookies()",
        timed_out: (cmd('{{cmd}}')) + " timed out waiting '{{timeout}}ms' to complete."
      },
      dom: {
        animating: (cmd('{{cmd}}')) + " could not be issued because this element is currently animating:\n\n{{node}}\n\nYou can fix this problem by:\n  - Passing {force: true} which disables all error checking\n  - Passing {waitForAnimations: false} which disables waiting on animations\n  - Passing {animationDistanceThreshold: 20} which decreases the sensitivity\n\nhttps://on.cypress.io/element-is-animating",
        animation_check_failed: "Not enough coord points provided to calculate distance.",
        covered: (cmd('{{cmd}}')) + " failed because this element is being covered by another element:\n\n{{node}}\n\nFix this problem, or use {force: true} to disable error checking.\n\nhttps://on.cypress.io/element-cannot-be-interacted-with",
        detached: (cmd('{{cmd}}')) + " failed because this element you are chaining off of has become detached or removed from the DOM:\n\n{{node}}\n\nhttps://on.cypress.io/element-has-detached-from-dom",
        disabled: (cmd('{{cmd}}')) + " failed because this element is disabled:\n\n{{node}}\n\nFix this problem, or use {force: true} to disable error checking.\n\nhttps://on.cypress.io/element-cannot-be-interacted-with",
        hidden: (cmd('{{cmd}}')) + " failed because the center of this element is hidden from view:\n\n{{node}}\n\nFix this problem, or use {force: true} to disable error checking.\n\nhttps://on.cypress.io/element-cannot-be-interacted-with",
        invalid_position_argument: "Invalid position argument: '{{position}}'. Position may only be center, topLeft, topRight, bottomLeft, or bottomRight.",
        non_dom: "Cannot call " + (cmd('{{cmd}}')) + " on a non-DOM subject.",
        non_dom_is_hidden: "$Cypress.Dom.isHidden() must be passed a basic DOM element. You passed: '{{el}}'",
        not_visible: (cmd('{{cmd}}')) + " failed because this element is not visible:\n\n{{node}}\n\n{{reason}}\n\nFix this problem, or use {force: true} to disable error checking.\n\nhttps://on.cypress.io/element-cannot-be-interacted-with"
      },
      each: {
        invalid_argument: (cmd('each')) + " must be passed a callback function.",
        non_array: (cmd('each')) + " can only operate on an array like subject. Your subject was: '{{subject}}'"
      },
      env: {
        variables_missing: "Cypress.environmentVariables is not defined. Open an issue if you see this message."
      },
      exec: {
        failed: (cmd('exec', '\'{{cmd}}\'')) + " failed with the following error:\n\n> \"{{error}}\"",
        invalid_argument: (cmd('exec')) + " must be passed a non-empty string as its 1st argument. You passed: '{{cmd}}'.",
        non_zero_exit: (cmd('exec', '\'{{cmd}}\'')) + " failed because the command exited with a non-zero code.\n\nPass {failOnNonZeroExit: false} to ignore exit code failures.\n\nInformation about the failure:\nCode: {{code}}\n{{output}}",
        timed_out: (cmd('exec', '\'{{cmd}}\'')) + " timed out after waiting {{timeout}}ms."
      },
      files: {
        unexpected_error: (cmd('{{cmd}}', '"{{file}}"')) + " failed while trying to {{action}} the file at the following path:\n\n  {{filePath}}\n\nThe following error occurred:\n\n  > \"{{error}}\"",
        existent: (cmd('readFile', '"{{file}}"')) + " failed because the file exists when expected not to exist at the following path:\n\n{{filePath}}",
        invalid_argument: (cmd('{{cmd}}')) + " must be passed a non-empty string as its 1st argument. You passed: '{{file}}'.",
        invalid_contents: (cmd('writeFile')) + " must be passed a non-empty string, an object, or an array as its 2nd argument. You passed: '{{contents}}'.",
        nonexistent: (cmd('readFile', '"{{file}}"')) + " failed because the file does not exist at the following path:\n\n{{filePath}}",
        timed_out: (cmd('{{cmd}}', '"{{file}}"')) + " timed out after waiting {{timeout}}ms."
      },
      fill: {
        invalid_1st_arg: (cmd('fill')) + " must be passed an object literal as its 1st argument"
      },
      fixture: {
        timed_out: (cmd('fixture')) + " timed out waiting '{{timeout}}ms' to receive a fixture. No fixture was ever sent by the server."
      },
      focus: {
        invalid_element: (cmd('focus')) + " can only be called on a valid focusable element. Your subject is a: {{node}}",
        multiple_elements: (cmd('focus')) + " can only be called on a single element. Your subject contained {{num}} elements.",
        timed_out: (cmd('focus')) + " timed out because your browser did not receive any focus events. This is a known bug in Chrome when it is not the currently focused window."
      },
      get: {
        alias_invalid: "'{{prop}}' is not a valid alias property. Only 'numbers' or 'all' is permitted.",
        alias_zero: "'0' is not a valid alias property. Are you trying to ask for the first response? If so write @{{alias}}.1"
      },
      getCookie: {
        invalid_argument: (cmd('getCookie')) + " must be passed a string argument for name."
      },
      go: {
        invalid_argument: (cmd('go')) + " accepts only a string or number argument",
        invalid_direction: (cmd('go')) + " accepts either 'forward' or 'back'. You passed: '{{str}}'",
        invalid_number: (cmd('go')) + " cannot accept '0'. The number must be greater or less than '0'."
      },
      hover: {
        not_implemented: (cmd('hover')) + " is not currently implemented.\n\nHowever it is usually easy to workaround.\n\nRead the following document for a detailed explanation.\n\nhttps://on.cypress.io/api/hover"
      },
      invoke: {
        invalid_type: "Cannot call " + (cmd('invoke')) + " because '{{prop}}' is not a function. You probably want to use " + (cmd('its', '\'{{prop}}\'')) + "."
      },
      invoke_its: {
        current_prop_nonexistent: (cmd('{{cmd}}')) + " errored because your subject is currently: '{{value}}'. You cannot call any properties such as '{{prop}}' on a '{{value}}' value.",
        invalid_1st_arg: (cmd('{{cmd}}')) + " only accepts a string as the first argument.",
        invalid_num_of_args: (cmd('{{cmd}}')) + " only accepts a single argument.\n\nIf you want to invoke a function with arguments, use cy.invoke().",
        invalid_property: (cmd('{{cmd}}')) + " errored because the property: '{{prop}}' does not exist on your subject.",
        previous_prop_nonexistent: (cmd('{{cmd}}')) + " errored because the property: '{{previousProp}}' returned a '{{value}}' value. You cannot access any properties such as '{{currentProp}}' on a '{{value}}' value.",
        timed_out: (cmd('{{cmd}}')) + " timed out after waiting '{{timeout}}ms'.\n\nYour callback function returned a promise which never resolved.\n\nThe callback function was:\n\n{{func}}"
      },
      location: {
        invalid_key: "Location object does not have key: {{key}}"
      },
      miscellaneous: {
        dangling_commands: "Oops, Cypress detected something wrong with your test code.\n\nThe test has finished but Cypress still has commands in its queue.\nThe {{numCommands}} queued commands that have not yet run are:\n\n{{commands}}\n\nIn every situation we've seen, this has been caused by programmer error.\nMost often this indicates a race condition due to a forgotten 'return' or from commands in a previously run test bleeding into the current test.\n\nFor a much more thorough explanation including examples please review this error here:\n\nhttps://on.cypress.io/command-queue-ended-early",
        deprecated: "Command Options such as: '{{{opt}}: {{value}}}' have been deprecated. Instead write this as an assertion: " + (cmd('should', '\'{{assertion}}\'')) + ".",
        invalid_command: "Could not find a command for: '{{name}}'.\n\nAvailable commands are: {{cmds}}.\n",
        method_not_implemented: "The method {{method}} is not yet implemented",
        module_not_registered: "$Cypress.Module: {{name}} not registered.",
        no_cy: "Cypress.cy is undefined. You may be trying to query outside of a running test. Cannot call Cypress.$()",
        no_sandbox: "Could not access the Server, Routes, Stub, Spies, or Mocks. Check to see if your application is loaded and is visible. Please open an issue if you see this message.",
        no_runner: "Cannot call Cypress#run without a runner instance.",
        no_subject: "Subject is {{subject}}. You cannot call " + (cmd('{{cmd}}')) + " without a subject.",
        orphan: (cmd('{{cmd}}')) + " is a child command which operates on an existing subject.  Child commands must be called after a parent command.",
        outside_test: "Cypress cannot execute commands outside a running test.\nThis usually happens when you accidentally write commands outside an 'it(...)' test.\nIf that is the case, just move these commands inside an 'it(...)' test.\nCheck your test file for errors.\n\nhttps://on.cypress.io/cannot-execute-commands-outside-test",
        outside_test_with_cmd: "Cannot call \"" + (cmd('{{cmd}}')) + " outside a running test.\nThis usually happens when you accidentally write commands outside an it(...) test.\nIf that is the case, just move these commands inside an 'it(...)' test.\nCheck your test file for errors.\n\nhttps://on.cypress.io/cannot-execute-commands-outside-test",
        retry_timed_out: "Timed out retrying: {{error}}"
      },
      mocha: {
        async_timed_out: "Timed out after '{{ms}}ms'. The done() callback was never invoked!",
        invalid_interface: "Invalid mocha interface '{{name}}'",
        timed_out: "Cypress command timeout of '{{ms}}ms' exceeded."
      },
      navigation: {
        cross_origin: "Cypress detected a cross origin error happened on page load:\n\n  > {{message}}\n\nBefore the page load, you were bound to the origin policy:\n  > {{originPolicy}}\n\nA cross origin error happens when your application navigates to a new superdomain which does not match the origin policy above.\n\nThis typically happens in one of three ways:\n\n1. You clicked an <a> that routed you outside of your application\n2. You submitted a form and your server redirected you outside of your application\n3. You used a javascript redirect to a page outside of your application\n\nCypress does not allow you to change superdomains within a single test.\n\nYou may need to restructure some of your test code to avoid this problem.\n\nAlternatively you can also disable Chrome Web Security which will turn off this restriction by setting { chromeWebSecurity: false } in your 'cypress.json' file.\n\nhttps://on.cypress.io/cross-origin-violation\n",
        timed_out: "Timed out after waiting '{{ms}}ms' for your remote page to load.\n\nYour page did not fire its 'load' event within '{{ms}}ms'.\n\nYou can try increasing the 'pageLoadTimeout' value in 'cypress.json' to wait longer.\n\nBrowsers will not fire the 'load' event until all stylesheets and scripts are done downloading.\n\nWhen this 'load' event occurs, Cypress will continue running commands."
      },
      ng: {
        no_global: "Angular global (window.angular) was not found in your window. You cannot use " + (cmd('ng')) + " methods without angular."
      },
      reload: {
        invalid_arguments: (cmd('reload')) + " can only accept a boolean or options as its arguments."
      },
      request: {
        auth_invalid: (cmd('request')) + " must be passed an object literal for the 'auth' option.",
        gzip_invalid: (cmd('request')) + " requires the 'gzip' option to be a boolean.",
        headers_invalid: (cmd('request')) + " requires the 'headers' option to be an object literal.",
        invalid_method: (cmd('request')) + " was called with an invalid method: '{{method}}'.  Method can only be: GET, POST, PUT, DELETE, PATCH, HEAD, OPTIONS",
        form_invalid: (cmd('request')) + " requires the 'form' option to be a boolean.\n\nIf you're trying to send a x-www-form-urlencoded request then pass either a string or object literal to the 'body' property.",
        loading_failed: function(obj) {
          return (cmd('request')) + " failed trying to load:\n\n" + obj.url + "\n\nWe attempted to make an http request to this URL but the request failed without a response.\n\nWe received this error at the network level:\n\n  > " + obj.error + "\n\n" + (divider(60, '-')) + "\n\nThe request we sent was:\n\n" + (getHttpProps([
            {
              key: 'method',
              value: obj.method
            }, {
              key: 'URL',
              value: obj.url
            }
          ])) + "\n\n" + (divider(60, '-')) + "\n\nCommon situations why this would fail:\n  - you don't have internet access\n  - you forgot to run / boot your web server\n  - your web server isn't accessible\n  - you have weird network configuration settings on your computer\n\nThe stack trace for this error is:\n\n" + obj.stack;
        },
        status_invalid: function(obj) {
          return (cmd('request')) + " failed on:\n\n" + obj.url + "\n\nThe response we received from your web server was:\n\n  > " + obj.status + ": " + obj.statusText + "\n\nThis was considered a failure because the status code was not '2xx' or '3xx'.\n\nIf you do not want status codes to cause failures pass the option: 'failOnStatusCode: false'\n\n" + (divider(60, '-')) + "\n\nThe request we sent was:\n\n" + (getHttpProps([
            {
              key: 'method',
              value: obj.method
            }, {
              key: 'URL',
              value: obj.url
            }, {
              key: 'headers',
              value: obj.requestHeaders
            }, {
              key: 'body',
              value: obj.requestBody
            }, {
              key: 'redirects',
              value: obj.redirects
            }
          ])) + "\n\n" + (divider(60, '-')) + "\n\nThe response we got was:\n\n" + (getHttpProps([
            {
              key: 'status',
              value: obj.status + ' - ' + obj.statusText
            }, {
              key: 'headers',
              value: obj.responseHeaders
            }, {
              key: 'body',
              value: obj.responseBody
            }
          ])) + "\n";
        },
        timed_out: function(obj) {
          return (cmd('request')) + " timed out waiting " + obj.timeout + "ms for a response from your server.\n\nThe request we sent was:\n\n" + (getHttpProps([
            {
              key: 'method',
              value: obj.method
            }, {
              key: 'URL',
              value: obj.url
            }
          ])) + "\n\nNo response was received within the timeout.";
        },
        url_missing: (cmd('request')) + " requires a url. You did not provide a url.",
        url_invalid: (cmd('request')) + " must be provided a fully qualified url - one that begins with 'http'. By default " + (cmd('request')) + " will use either the current window's origin or the 'baseUrl' in cypress.json. Neither of those values were present.",
        url_wrong_type: (cmd('request')) + " requires the url to be a string."
      },
      route: {
        failed_prerequisites: (cmd('route')) + " cannot be invoked before starting the " + (cmd('server')),
        invalid_arguments: (cmd('route')) + " was not provided any arguments. You must provide valid arguments.",
        method_invalid: (cmd('route')) + " was called with an invalid method: '{{method}}'.  Method can only be: GET, POST, PUT, DELETE, PATCH, HEAD, OPTIONS",
        response_invalid: (cmd('route')) + " cannot accept an undefined or null response. It must be set to something, even an empty string will work.",
        url_invalid: (cmd('route')) + " was called with a invalid url. Url must be either a string or regular expression.",
        url_missing: (cmd('route')) + " must be called with a url. It can be a string or regular expression."
      },
      screenshot: {
        timed_out: (cmd('screenshot')) + " timed out waiting '{{timeout}}ms' to complete."
      },
      select: {
        disabled: (cmd('select')) + " failed because this element is currently disabled:\n\n{{node}}",
        invalid_element: (cmd('select')) + " can only be called on a <select>. Your subject is a: {{node}}",
        invalid_multiple: (cmd('select')) + " was called with an array of arguments but does not have a 'multiple' attribute set.",
        multiple_elements: (cmd('select')) + " can only be called on a single <select>. Your subject contained {{num}} elements.",
        multiple_matches: (cmd('select')) + " matched more than one option by value or text: {{value}}",
        no_matches: (cmd('select')) + " failed because it could not find a single <option> with value or text matching: '{{value}}'",
        option_disabled: (cmd('select')) + " failed because this <option> you are trying to select is currently disabled:\n\n{{node}}"
      },
      server: {
        invalid_argument: (cmd('server')) + " accepts only an object literal as its argument.",
        unavailable: "The XHR server is unavailable or missing. This should never happen and likely is a bug. Open an issue if you see this message."
      },
      setCookie: {
        invalid_arguments: (cmd('setCookie')) + " must be passed two string arguments for name and value."
      },
      spread: {
        invalid_type: (cmd('spread')) + " requires the existing subject be an array."
      },
      submit: {
        multiple_forms: (cmd('submit')) + " can only be called on a single form. Your subject contained {{num}} form elements.",
        not_on_form: (cmd('submit')) + " can only be called on a <form>. Your subject {{word}} a: {{node}}"
      },
      tick: {
        invalid_argument: "clock.tick()/" + (cmd('tick')) + " only accept a number as their argument. You passed: {{arg}}",
        no_clock: (cmd('tick')) + " cannot be called without first calling " + (cmd('clock'))
      },
      then: {
        callback_mixes_sync_and_async: (cmd('then')) + " failed because you are mixing up async and sync code.\n\nIn your callback function you invoked 1 or more cy commands but then returned a synchronous value.\n\nCypress commands are asynchronous and it doesn't make sense to queue cy commands and yet return a synchronous value.\n\nYou likely forgot to properly chain the cy commands using another cy.then().\n\nThe value you synchronously returned was: '{{value}}'"
      },
      type: {
        empty_string: (cmd('type')) + " cannot accept an empty String. You need to actually type something.",
        invalid: "Special character sequence: '{{chars}}' is not recognized. Available sequences are: {{allChars}}",
        multiple_elements: (cmd('type')) + " can only be called on a single textarea or :text. Your subject contained {{num}} elements.",
        not_on_text_field: (cmd('type')) + " can only be called on textarea or :text. Your subject is a: {{node}}",
        tab: "{tab} isn't a supported character sequence. You'll want to use the command " + (cmd('tab')) + ", which is not ready yet, but when it is done that's what you'll use.",
        wrong_type: (cmd('type')) + " can only accept a String or Number. You passed in: '{{chars}}'"
      },
      uncaught: {
        cross_origin_script: "Script error.\n\nCypress detected that an uncaught error was thrown from a cross origin script.\n\nWe cannot provide you the stack trace, line number, or file where this error occured.\n\nCheck your Developer Tools Console for the actual error - it should be printed there.\n\nIt's possible to enable debugging these scripts by adding the 'crossorigin' attribute and setting a CORS header.\n\nhttps://on.cypress.io/cross-origin-script-error",
        error_in_hook: function(obj) {
          var msg, t;
          msg = "Because this error occured during a '" + obj.hookName + "' hook we are skipping ";
          if (t = obj.parentTitle) {
            msg += "the remaining tests in the current suite: '" + (_.truncate(t, 20)) + "'";
          } else {
            msg += "all of the remaining tests.";
          }
          return msg;
        },
        error: function(obj) {
          var lineno, msg, source;
          msg = obj.msg, source = obj.source, lineno = obj.lineno;
          return msg + (source && lineno ? " (" + source + ":" + lineno + ")" : "");
        }
      },
      viewport: {
        bad_args: (cmd('viewport')) + " can only accept a string preset or a width and height as numbers.",
        dimensions_out_of_range: (cmd('viewport')) + " width and height must be between 200px and 3000px.",
        empty_string: (cmd('viewport')) + " cannot be passed an empty string.",
        invalid_orientation: (cmd('viewport')) + " can only accept '{{all}}' as valid orientations. Your orientation was: '{{orientation}}'",
        missing_preset: (cmd('viewport')) + " could not find a preset for: '{{preset}}'. Available presets are: {{presets}}"
      },
      visit: {
        invalid_1st_arg: (cmd('visit')) + " must be called with a string as its 1st argument",
        cannot_visit_2nd_domain: (cmd('visit')) + " failed because you are attempting to visit a second unique domain.\n\nYou may only visit a single unique domain per test.\n\nDifferent subdomains are okay, but unique domains are not.\n\nThe previous domain you visited was: '{{previousDomain}}'\n\nYou're attempting to visit this new domain: '{{attemptedDomain}}'\n\nYou may need to restructure some of your code to prevent this from happening.\n\nhttps://on.cypress.io/cannot-visit-second-unique-domain",
        loading_network_failed: (cmd('visit')) + " failed trying to load:\n\n{{url}}\n\nWe attempted to make an http request to this URL but the request failed without a response.\n\nWe received this error at the network level:\n\n  > {{error}}\n\nCommon situations why this would fail:\n  - you don't have internet access\n  - you forgot to run / boot your web server\n  - your web server isn't accessible\n  - you have weird network configuration settings on your computer\n\nThe stack trace for this error is:\n\n{{stack}}",
        loading_file_failed: function(obj) {
          return (cmd('visit')) + " failed trying to load:\n\n" + obj.url + "\n\nWe failed looking for this file at the path:\n\n" + obj.path + "\n\nThe internal Cypress web server responded with:\n\n  > " + obj.status + ": " + obj.statusText + "\n\n" + (getRedirects(obj, "We were redirected"));
        },
        loading_http_failed: function(obj) {
          return (cmd('visit')) + " failed trying to load:\n\n" + obj.url + "\n\nThe response we received from your web server was:\n\n  > " + obj.status + ": " + obj.statusText + "\n\nThis was considered a failure because the status code was not '2xx'.\n\n" + (getRedirects(obj, "This http request was redirected"));
        },
        loading_invalid_content_type: function(obj) {
          var phrase;
          phrase = obj.path ? "this local file" : "your web server";
          return (cmd('visit')) + " failed trying to load:\n\n" + obj.url + "\n\nThe content-type of the response we received from " + phrase + " was:\n\n  > " + obj.contentType + "\n\nThis was considered a failure because responses must have content-type: 'text/html'\n\nHowever, you can likely use " + (cmd('request')) + " instead of " + (cmd('visit')) + ".\n\n" + (cmd('request')) + " will automatically get and set cookies and enable you to parse responses.";
        }
      },
      wait: {
        alias_invalid: "'{{prop}}' is not a valid alias property. Are you trying to ask for the first request? If so write @{{str}}.request",
        fn_deprecated: (cmd('wait', 'fn')) + " has been deprecated. Instead just change this command to be " + (cmd('should', 'fn')) + ".",
        invalid_1st_arg: (cmd('wait')) + " must be invoked with either a number or an alias for a route.",
        invalid_alias: (cmd('wait')) + " can only accept aliases for routes.\nThe alias: '{{alias}}' did not match a route.",
        invalid_arguments: (cmd('wait')) + " was passed invalid arguments. You cannot pass multiple strings. If you're trying to wait for multiple routes, use an array.",
        timed_out: (cmd('wait')) + " timed out waiting {{timeout}}ms for the {{num}} {{type}} to the route: '{{alias}}'. No {{type}} ever occured."
      },
      window: {
        iframe_doc_undefined: "The remote iframe's document is undefined",
        iframe_undefined: "The remote iframe is undefined"
      },
      within: {
        invalid_argument: (cmd('within')) + " must be called with a function."
      },
      xhr: {
        aborted: "This XHR was aborted by your code -- check this stack trace below.",
        missing: "XMLHttpRequest#xhr is missing.",
        network_error: "The network request for this XHR could not be made. Check your console for the reason."
      }
    };
  })($Cypress);

}).call(this);
; 
(function() {
  var slice = [].slice,
    hasProp = {}.hasOwnProperty;

  (function($Cypress, _) {
    var splice;
    splice = function(index) {
      return this._events.splice(index, 1);
    };
    return $Cypress.extend({
      event: function(name) {
        if (!this._events) {
          return;
        }
        return _.pluck(this._events[name], "callback");
      },
      invoke: function() {
        var args, events, name;
        name = arguments[0], args = 2 <= arguments.length ? slice.call(arguments, 1) : [];
        if (!(events = this.event(name))) {
          return;
        }
        return _.map(events, (function(_this) {
          return function(event) {
            return event.apply(_this.cy, args);
          };
        })(this));
      },
      trigger: function(name) {
        var event, events, i, len;
        if (!(events = this._events && this._events[name])) {
          return;
        }
        for (i = 0, len = events.length; i < len; i++) {
          event = events[i];
          event.ctx = this.cy;
        }
        return Backbone.Events.trigger.apply(this, arguments);
      },
      triggerPromise: function() {
        var args;
        args = 1 <= arguments.length ? slice.call(arguments, 0) : [];
        return new Promise((function(_this) {
          return function(resolve, reject) {
            var cb;
            cb = function(resp) {
              var e, err, prop, val;
              if (_.has(resp, "__error")) {
                e = resp.__error;
                if (_.isString(e)) {
                  err = new Error(e);
                } else {
                  err = new Error(e.message);
                  for (prop in e) {
                    if (!hasProp.call(e, prop)) continue;
                    val = e[prop];
                    err[prop] = val;
                  }
                }
                err.triggerPromise = true;
                return reject(err);
              } else {
                return resolve(resp);
              }
            };
            args.push(cb);
            return _this.trigger.apply(_this, args);
          };
        })(this)).cancellable();
      }
    });
  })($Cypress, _);

}).call(this);
; 
(function() {
  $Cypress.Keyboard = (function($Cypress, _, Promise, bililiteRange) {
    var charsBetweenCurlyBraces;
    charsBetweenCurlyBraces = /({.+?})/;
    return {
      charCodeMap: {
        33: 49,
        64: 50,
        35: 51,
        36: 52,
        37: 53,
        94: 54,
        38: 55,
        42: 56,
        40: 57,
        41: 48,
        59: 186,
        58: 186,
        61: 187,
        43: 187,
        44: 188,
        60: 188,
        45: 189,
        95: 189,
        46: 190,
        62: 190,
        47: 191,
        63: 191,
        96: 192,
        126: 192,
        91: 219,
        123: 219,
        92: 220,
        124: 220,
        93: 221,
        125: 221,
        39: 222,
        34: 222
      },
      modifierCodeMap: {
        alt: 18,
        ctrl: 17,
        meta: 91,
        shift: 16
      },
      specialChars: {
        "{selectall}": function(el, options) {
          return options.rng.bounds('all').select();
        },
        "{del}": function(el, options) {
          var bounds, rng;
          rng = options.rng;
          bounds = rng.bounds();
          if (this.boundsAreEqual(bounds)) {
            rng.bounds([bounds[0], bounds[0] + 1]);
          }
          options.charCode = 46;
          options.keypress = false;
          options.textInput = false;
          return this.ensureKey(el, null, options, function() {
            var prev;
            prev = rng.all();
            rng.text("", "end");
            if (prev === rng.all()) {
              return options.input = false;
            }
          });
        },
        "{backspace}": function(el, options) {
          var bounds, rng;
          rng = options.rng;
          bounds = rng.bounds();
          if (this.boundsAreEqual(bounds)) {
            rng.bounds([bounds[0] - 1, bounds[0]]);
          }
          options.charCode = 8;
          options.keypress = false;
          options.textInput = false;
          return this.ensureKey(el, null, options, function() {
            var prev;
            prev = rng.all();
            rng.text("", "end");
            if (prev === rng.all()) {
              return options.input = false;
            }
          });
        },
        "{esc}": function(el, options) {
          options.charCode = 27;
          options.keypress = false;
          options.textInput = false;
          options.input = false;
          return this.ensureKey(el, null, options);
        },
        "{{}": function(el, options) {
          options.key = "{";
          return this.typeKey(el, options.key, options);
        },
        "{enter}": function(el, options) {
          var rng;
          rng = options.rng;
          options.charCode = 13;
          options.textInput = false;
          options.input = false;
          return this.ensureKey(el, "\n", options, function() {
            var changed;
            rng.insertEOL();
            changed = options.prev !== rng.all();
            return options.onEnterPressed(changed, options.id);
          });
        },
        "{leftarrow}": function(el, options) {
          var bounds, rng;
          rng = options.rng;
          bounds = rng.bounds();
          options.charCode = 37;
          options.keypress = false;
          options.textInput = false;
          options.input = false;
          return this.ensureKey(el, null, options, function() {
            var left, right;
            switch (false) {
              case !this.boundsAreEqual(bounds):
                left = bounds[0] - 1;
                right = left;
                break;
              case !(bounds[0] > 0):
                left = bounds[0];
                right = left;
                break;
              default:
                left = 0;
                right = 0;
            }
            return rng.bounds([left, right]);
          });
        },
        "{uparrow}": function(el, options) {
          options.charCode = 38;
          options.keypress = false;
          options.textInput = false;
          options.input = false;
          return this.ensureKey(el, null, options);
        },
        "{rightarrow}": function(el, options) {
          var bounds, rng;
          rng = options.rng;
          bounds = rng.bounds();
          options.charCode = 39;
          options.keypress = false;
          options.textInput = false;
          options.input = false;
          return this.ensureKey(el, null, options, function() {
            var left, right;
            switch (false) {
              case !this.boundsAreEqual(bounds):
                left = bounds[0] + 1;
                right = left;
                break;
              default:
                right = bounds[1];
                left = right;
            }
            return rng.bounds([left, right]);
          });
        },
        "{downarrow}": function(el, options) {
          options.charCode = 40;
          options.keypress = false;
          options.textInput = false;
          options.input = false;
          return this.ensureKey(el, null, options);
        }
      },
      modifierChars: {
        "{alt}": "alt",
        "{option}": "alt",
        "{ctrl}": "ctrl",
        "{control}": "ctrl",
        "{meta}": "meta",
        "{command}": "meta",
        "{cmd}": "meta",
        "{shift}": "shift"
      },
      boundsAreEqual: function(bounds) {
        return bounds[0] === bounds[1];
      },
      type: function(options) {
        var bililiteRangeSelection, el, index, keys, promises, resetBounds, rng, selection;
        if (options == null) {
          options = {};
        }
        _.defaults(options, {
          delay: 10,
          onEvent: function() {},
          onBeforeEvent: function() {},
          onBeforeType: function() {},
          onTypeChange: function() {},
          onEnterPressed: function() {},
          onNoMatchingSpecialChars: function() {},
          onBeforeSpecialCharAction: function() {}
        });
        el = options.$el.get(0);
        bililiteRangeSelection = el.bililiteRangeSelection;
        rng = bililiteRange(el).bounds("selection");
        options.prev = rng.all();
        resetBounds = function(start, end) {
          var bounds, len;
          if ((start != null) && (end != null)) {
            bounds = [start, end];
          } else {
            len = rng.length();
            bounds = [len, len];
          }
          if (!_.isEqual(rng._bounds, bounds)) {
            el.bililiteRangeSelection = bounds;
            return rng.bounds(bounds);
          }
        };
        if (bililiteRangeSelection) {
          rng.bounds(bililiteRangeSelection);
        } else {
          try {
            if ("selectionStart" in el) {
              el.selectionStart;
            } else {
              resetBounds();
            }
          } catch (error) {
            try {
              selection = el.ownerDocument.getSelection().toString();
              index = options.$el.val().indexOf(selection);
              if (selection.length && index > -1) {
                resetBounds(index, selection.length);
              } else {
                resetBounds();
              }
            } catch (error) {
              resetBounds();
            }
          }
        }
        keys = options.chars.split(charsBetweenCurlyBraces).map(function(chars) {
          if (charsBetweenCurlyBraces.test(chars)) {
            return chars.toLowerCase();
          } else {
            return chars;
          }
        });
        options.onBeforeType(this.countNumIndividualKeyStrokes(keys));
        promises = [];
        return Promise.each(keys, (function(_this) {
          return function(key) {
            return _this.typeChars(el, rng, key, promises, options);
          };
        })(this)).cancellable().then((function(_this) {
          return function() {
            var sel;
            if (_this.expectedValueDoesNotMatchCurrentValue(options.prev, rng)) {
              options.onTypeChange();
            }
            if (sel = options.window.getSelection()) {
              sel.removeAllRanges();
            }
            if (options.release !== false) {
              return _this.resetModifiers(el, options.window);
            }
          };
        })(this))["catch"](Promise.CancellationError, function(err) {
          _(promises).invoke("cancel");
          throw err;
        });
      },
      countNumIndividualKeyStrokes: function(keys) {
        return _.reduce(keys, (function(_this) {
          return function(memo, chars) {
            if (_this.isSpecialChar(chars)) {
              return memo + 1;
            } else if (_this.isModifier(chars)) {
              return memo;
            } else {
              return memo + chars.length;
            }
          };
        })(this), 0);
      },
      typeChars: function(el, rng, chars, promises, options) {
        var allChars, p;
        options = _.clone(options);
        options.rng = rng;
        if (this.isSpecialChar(chars)) {
          p = Promise.resolve(this.handleSpecialChars(el, chars, options)).delay(options.delay).cancellable();
          promises.push(p);
          return p;
        } else if (this.isModifier(chars)) {
          p = Promise.resolve(this.handleModifier(el, chars, options)).delay(options.delay).cancellable();
          promises.push(p);
          return p;
        } else if (charsBetweenCurlyBraces.test(chars)) {
          allChars = _.keys(this.specialChars).concat(_.keys(this.modifierChars)).join(", ");
          p = Promise.resolve(options.onNoMatchingSpecialChars(chars, allChars)).delay(options.delay).cancellable();
          promises.push(p);
          return p;
        } else {
          return Promise.each(chars.split(""), (function(_this) {
            return function(char) {
              p = Promise.resolve(_this.typeKey(el, char, options)).delay(options.delay).cancellable();
              promises.push(p);
              return p;
            };
          })(this));
        }
      },
      getCharCode: function(key) {
        var code, ref;
        code = key.charCodeAt(0);
        return (ref = this.charCodeMap[code]) != null ? ref : code;
      },
      expectedValueDoesNotMatchCurrentValue: function(expected, rng) {
        return expected !== rng.all();
      },
      moveCaretToEnd: function(rng) {
        var len;
        len = rng.length();
        return rng.bounds([len, len]);
      },
      simulateKey: function(el, eventType, key, options) {
        var args, charCode, charCodeAt, dispatched, event, keyCode, keys, otherKeys, ref, ref1, ref2, which;
        if (options[eventType] === false) {
          return true;
        }
        key = (ref = options.key) != null ? ref : key;
        keys = true;
        otherKeys = true;
        event = new Event(eventType, {
          bubbles: true,
          cancelable: eventType !== "input"
        });
        switch (eventType) {
          case "keydown":
          case "keyup":
            charCodeAt = (ref1 = options.charCode) != null ? ref1 : this.getCharCode(key.toUpperCase());
            charCode = 0;
            keyCode = charCodeAt;
            which = charCodeAt;
            break;
          case "keypress":
            charCodeAt = (ref2 = options.charCode) != null ? ref2 : this.getCharCode(key);
            charCode = charCodeAt;
            keyCode = charCodeAt;
            which = charCodeAt;
            break;
          case "textInput":
            charCode = 0;
            keyCode = 0;
            which = 0;
            otherKeys = false;
            _.extend(event, {
              data: key
            });
            break;
          case "input":
            keys = false;
            otherKeys = false;
        }
        if (otherKeys) {
          _.extend(event, {
            location: 0,
            repeat: false
          });
          this.mixinModifiers(event);
        }
        if (keys) {
          _.extend(event, {
            charCode: charCode,
            detail: 0,
            keyCode: keyCode,
            layerX: 0,
            layerY: 0,
            pageX: 0,
            pageY: 0,
            view: options.window,
            which: which
          });
        }
        args = [options.id, key, eventType, charCodeAt];
        if (options.onBeforeEvent.apply(this, args) === false) {
          return;
        }
        dispatched = el.dispatchEvent(event);
        args.push(dispatched);
        options.onEvent.apply(this, args);
        return dispatched;
      },
      updateValue: function(rng, key) {
        return rng.text(key, "end");
      },
      typeKey: function(el, key, options) {
        var after;
        if (after = options.afterKey) {
          if (this.expectedValueDoesNotMatchCurrentValue(after, options.rng)) {
            this.moveCaretToEnd(options.rng);
          }
        }
        return this.ensureKey(el, key, options, function() {
          return this.updateValue(options.rng, key);
        });
      },
      ensureKey: function(el, key, options, fn) {
        options.id = _.uniqueId("char");
        options.beforeKey = options.rng.all();
        if (this.simulateKey(el, "keydown", key, options)) {
          if (this.simulateKey(el, "keypress", key, options)) {
            if (this.simulateKey(el, "textInput", key, options)) {
              if (fn && options.onBeforeSpecialCharAction.call(this, options.id, options.key) !== false) {
                fn.call(this);
              }
              this.simulateKey(el, "input", key, options);
              options.afterKey = options.rng.all();
            }
          }
        }
        return this.simulateKey(el, "keyup", key, options);
      },
      isSpecialChar: function(chars) {
        return !!this.specialChars[chars];
      },
      handleSpecialChars: function(el, chars, options) {
        options.key = chars;
        return this.specialChars[chars].call(this, el, options);
      },
      modifiers: {
        alt: false,
        ctrl: false,
        meta: false,
        shift: false
      },
      isModifier: function(chars) {
        return !!this.modifierChars[chars];
      },
      handleModifier: function(el, chars, options) {
        var modifier;
        modifier = this.modifierChars[chars];
        if (this.modifiers[modifier]) {
          return;
        }
        this.modifiers[modifier] = true;
        return this.simulateModifier(el, "keydown", modifier, options);
      },
      simulateModifier: function(el, eventType, modifier, options) {
        return this.simulateKey(el, eventType, null, _.extend(options, {
          charCode: this.modifierCodeMap[modifier],
          id: _.uniqueId("char"),
          key: "<" + modifier + ">"
        }));
      },
      mixinModifiers: function(event) {
        return _.extend(event, {
          altKey: this.modifiers.alt,
          ctrlKey: this.modifiers.ctrl,
          metaKey: this.modifiers.meta,
          shiftKey: this.modifiers.shift
        });
      },
      activeModifiers: function() {
        return _.reduce(this.modifiers, function(memo, isActivated, modifier) {
          if (isActivated) {
            memo.push(modifier);
          }
          return memo;
        }, []);
      },
      resetModifiers: function(el, window) {
        var isActivated, modifier, ref, results;
        ref = this.modifiers;
        results = [];
        for (modifier in ref) {
          isActivated = ref[modifier];
          this.modifiers[modifier] = false;
          if (isActivated) {
            results.push(this.simulateModifier(el, "keyup", modifier, {
              window: window,
              onBeforeEvent: function() {},
              onEvent: function() {}
            }));
          } else {
            results.push(void 0);
          }
        }
        return results;
      }
    };
  })($Cypress, _, Promise, bililiteRange);

}).call(this);
; 
(function() {
  $Cypress.LocalStorage = (function($Cypress, _) {
    var eclRegExp, specialKeywords;
    eclRegExp = /^ecl-/;
    specialKeywords = /(debug)/;
    return {
      localStorage: null,
      remoteStorage: null,
      clear: function(keys, local, remote) {
        var storages;
        keys = _.compact([].concat(keys));
        if (local == null) {
          local = this.localStorage;
        }
        if (remote == null) {
          remote = this.remoteStorage;
        }
        storages = _.compact([local, remote]);
        return _.each(storages, (function(_this) {
          return function(storage) {
            return _.chain(storage).keys().reject(_this._isSpecialKeyword).reject(_this._isEclectusItem).each(function(item) {
              if (keys.length) {
                return _this._ifItemMatchesAnyKey(item, keys, function(key) {
                  return _this._removeItem(storage, key);
                });
              } else {
                return _this._removeItem(storage, item);
              }
            });
          };
        })(this));
      },
      setStorages: function(local, remote) {
        this.localStorage = local;
        this.remoteStorage = remote;
        return this;
      },
      unsetStorages: function() {
        this.localStorage = this.remoteStorage = null;
        return this;
      },
      _removeItem: function(storage, item) {
        return storage.removeItem(item);
      },
      _isSpecialKeyword: function(item) {
        return specialKeywords.test(item);
      },
      _isEclectusItem: function(item) {
        return eclRegExp.test(item);
      },
      _normalizeRegExpOrString: function(key) {
        switch (false) {
          case !_.isRegExp(key):
            return key;
          case !_.isString(key):
            return new RegExp("^" + key + "$");
        }
      },
      _ifItemMatchesAnyKey: function(item, keys, fn) {
        var i, key, len, re;
        for (i = 0, len = keys.length; i < len; i++) {
          key = keys[i];
          re = this._normalizeRegExpOrString(key);
          if (re.test(item)) {
            return fn(item);
          }
        }
      }
    };
  })($Cypress, _);

}).call(this);
; 
(function() {
  var slice = [].slice;

  $Cypress.Location = (function($Cypress, _, UrlParse) {
    var $Location, ipAddressRe, reHttp, reLocalHost, reWww;
    reHttp = /^https?:\/\//;
    reWww = /^www/;
    reLocalHost = /^(localhost|0\.0\.0\.0|127\.0\.0\.1)/;
    ipAddressRe = /^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$/;
    $Location = (function() {
      function $Location(remote) {
        this.remote = new UrlParse(remote);
      }

      $Location.prototype.getHash = function() {
        return this.remote.hash;
      };

      $Location.prototype.getHref = function() {
        return this.getToString();
      };

      $Location.prototype.getHost = function() {
        return this.remote.host;
      };

      $Location.prototype.getHostName = function() {
        return this.remote.hostname;
      };

      $Location.prototype.getOrigin = function() {
        if (this.remote.origin === "null") {
          return null;
        } else {
          return this.remote.origin;
        }
      };

      $Location.prototype.getProtocol = function() {
        return this.remote.protocol;
      };

      $Location.prototype.getPathName = function() {
        return this.remote.pathname || "/";
      };

      $Location.prototype.getPort = function() {
        return this.remote.port;
      };

      $Location.prototype.getSearch = function() {
        return this.remote.query;
      };

      $Location.prototype.getOriginPolicy = function() {
        return _.compact([this.getProtocol() + "//" + this.getSuperDomain(), this.getPort()]).join(":");
      };

      $Location.prototype.getSuperDomain = function() {
        var hostname, parts;
        hostname = this.getHostName();
        parts = hostname.split(".");
        if (ipAddressRe.test(hostname)) {
          return hostname;
        }
        switch (parts.length) {
          case 1:
            return hostname;
          case 2:
            return hostname;
          default:
            return parts.slice(1).join(".");
        }
      };

      $Location.prototype.getToString = function() {
        return this.remote.toString();
      };

      $Location.prototype.getObject = function() {
        return {
          hash: this.getHash(),
          href: this.getHref(),
          host: this.getHost(),
          hostname: this.getHostName(),
          origin: this.getOrigin(),
          pathname: this.getPathName(),
          port: this.getPort(),
          protocol: this.getProtocol(),
          search: this.getSearch(),
          originPolicy: this.getOriginPolicy(),
          superDomain: this.getSuperDomain(),
          toString: _.bind(this.getToString, this)
        };
      };

      $Location.override = function(Cypress, win, navigated) {
        return _.each(["back", "forward", "go", "pushState", "replaceState"], function(attr) {
          var orig, ref;
          if (!(orig = (ref = win.history) != null ? ref[attr] : void 0)) {
            return;
          }
          return win.history[attr] = function() {
            orig.apply(this, arguments);
            return navigated(attr, arguments);
          };
        });
      };

      $Location.isFullyQualifiedUrl = function(url) {
        return reHttp.test(url);
      };

      $Location.isUrlLike = function(url) {
        url = url.split("/")[0].split(".");
        return url.length === 3 || url.length === 4;
      };

      $Location.fullyQualifyUrl = function(url) {
        var existing;
        if (this.isFullyQualifiedUrl(url)) {
          return url;
        }
        existing = new UrlParse(window.location.href);
        url = new UrlParse(url, existing.origin);
        return url.toString();
      };

      $Location.normalize = function(url) {
        if (reHttp.test(url) || reWww.test(url) || reLocalHost.test(url) || this.isUrlLike(url)) {
          if (!reHttp.test(url)) {
            url = "http://" + url;
          }
          url = new UrlParse(url);
          if (!url.pathname) {
            url.set("pathname", "/");
          }
          return url.toString();
        } else {
          return url;
        }
      };

      $Location.qualifyWithBaseUrl = function(baseUrl, url) {
        if (baseUrl && (!this.isFullyQualifiedUrl(url))) {
          url = this.join(baseUrl, url);
        }
        return this.fullyQualifyUrl(url);
      };

      $Location.isAbsoluteRelative = function(segment) {
        return segment && segment[0] === "/";
      };

      $Location.join = function() {
        var from, last, paths, rest;
        from = arguments[0], rest = 2 <= arguments.length ? slice.call(arguments, 1) : [];
        last = _.last(rest);
        paths = _.reduce(rest, function(memo, segment) {
          if (segment === last) {
            memo.push(_.ltrim(segment, "/"));
          } else {
            memo.push(_.trim(segment, "/"));
          }
          return memo;
        }, [_.rtrim(from, "/")]);
        return paths.join("/");
      };

      $Location.resolve = function(from, to) {
        var origin;
        if (this.isFullyQualifiedUrl(to)) {
          return to;
        }
        if (this.isAbsoluteRelative(to)) {
          origin = this.create(from).origin;
          return this.join(origin, to);
        } else {
          return this.join(from, to);
        }
      };

      $Location.create = function(remote) {
        var location;
        location = new $Location(remote);
        return location.getObject();
      };

      return $Location;

    })();
    return $Location;
  })($Cypress, _, UrlParse);

}).call(this);
; 
(function() {
  var slice = [].slice,
    indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };

  $Cypress.Log = (function($Cypress, _, Backbone) {
    var $Log, BLACKLIST_PROPS, CypressErrorRe, DISPLAY_PROPS, ERROR_PROPS, SNAPSHOT_PROPS, abort, counter, delay, groupsOrTableRe, klassMethods, logs, parentOrChildRe, setDelay, triggerEvent, triggerInitial;
    CypressErrorRe = /(AssertionError|CypressError)/;
    parentOrChildRe = /parent|child/;
    groupsOrTableRe = /^(groups|table)$/;
    ERROR_PROPS = "message type name stack fileName lineNumber columnNumber host uncaught actual expected showDiff".split(" ");
    SNAPSHOT_PROPS = "id snapshots $el url coords highlightAttr scrollBy viewportWidth viewportHeight".split(" ");
    DISPLAY_PROPS = "id alias aliasType callCount displayName end err event functionName hookName instrument isStubbed message method name numElements numResponses referencesAlias renderProps state testId type url visible".split(" ");
    BLACKLIST_PROPS = "snapshots".split(" ");
    counter = 0;
    delay = null;
    logs = {};
    abort = function() {
      return logs = {};
    };
    triggerEvent = function(Cypress, log, event) {
      var attrs;
      if (!log._hasInitiallyLogged) {
        return;
      }
      if (!logs[log.get("id")]) {
        return;
      }
      attrs = log.toJSON();
      if (!_.isEqual(log._emittedAttrs, attrs)) {
        log._emittedAttrs = attrs;
        return Cypress.trigger(event, attrs, log);
      }
    };
    triggerInitial = function(Cypress, log) {
      log._hasInitiallyLogged = true;
      return triggerEvent(Cypress, log, "log");
    };
    klassMethods = {
      agent: function(Cypress, cy, obj) {
        if (obj == null) {
          obj = {};
        }
        _.defaults(obj, {
          name: "agent"
        });
        return this.log("agent", obj);
      },
      route: function(Cypress, cy, obj) {
        if (obj == null) {
          obj = {};
        }
        _.defaults(obj, {
          name: "route"
        });
        return this.log("route", obj);
      },
      command: function(Cypress, cy, obj) {
        var current, ref;
        if (obj == null) {
          obj = {};
        }
        current = cy.prop("current");
        _.defaults(obj, current != null ? current.pick("name", "type") : void 0);
        if (!parentOrChildRe.test(obj.type)) {
          obj.type = current.hasPreviouslyLinkedCommand() ? "child" : "parent";
        }
        _.defaults(obj, {
          event: false,
          renderProps: function() {
            return {};
          },
          consoleProps: function() {
            var ret;
            ret = $Cypress.Utils.hasElement(current.get("subject")) ? $Cypress.Utils.getDomElements(current.get("subject")) : current.get("subject");
            return {
              "Returned": ret
            };
          }
        });
        obj.message = $Cypress.Utils.stringify((ref = obj.message) != null ? ref : current.get("args"));
        if (_.isFunction(obj.type)) {
          obj.type = obj.type.call(cy, current, cy.prop("subject"));
        }
        return this.log("command", obj);
      },
      log: function(Cypress, cy, instrument, obj) {
        var log, onBeforeLog, ref;
        _.defaults(obj, {
          url: cy["private"]("url"),
          hookName: cy["private"]("hookName"),
          testId: cy["private"]("runnable").id,
          viewportWidth: Cypress.config("viewportWidth"),
          viewportHeight: Cypress.config("viewportHeight"),
          referencesAlias: void 0,
          alias: void 0,
          aliasType: void 0,
          message: void 0,
          renderProps: function() {
            return {};
          },
          consoleProps: function() {
            return {};
          }
        });
        obj.instrument = instrument;
        log = new $Log(Cypress, obj);
        log.wrapConsoleProps();
        onBeforeLog = cy.prop("onBeforeLog");
        if (_.isFunction(onBeforeLog)) {
          if (onBeforeLog.call(cy, log) === false) {
            return;
          }
        }
        if ((ref = cy.prop("current")) != null) {
          ref.log(log);
        }
        $Log.addToLogs(log);
        triggerInitial(Cypress, log);
        return log;
      }
    };
    setDelay = function(val) {
      return delay = val != null ? val : 4;
    };
    $Log = (function() {
      function $Log(Cypress1, obj) {
        var err, trigger;
        this.Cypress = Cypress1;
        if (obj == null) {
          obj = {};
        }
        _.defaults(obj, {
          id: (counter += 1),
          state: "pending"
        });
        trigger = (function(_this) {
          return function() {
            return triggerEvent(_this.Cypress, _this, "log:state:changed");
          };
        })(this);
        if (delay == null) {
          delay = setDelay(this.Cypress.config("logAttrsDelay"));
        }
        this.fireChangeEvent = _.debounce(trigger, 4);
        this.set(obj);
        if (this.get("snapshot")) {
          this.snapshot();
        }
        if (this.get("end")) {
          this.end({
            silent: true
          });
        }
        if (err = this.get("error")) {
          this.error(err, {
            silent: true
          });
        }
      }

      $Log.prototype.get = function(attr) {
        return this.attributes[attr];
      };

      $Log.prototype.unset = function(key) {
        return this.set(key, void 0);
      };

      $Log.prototype.invoke = function(key) {
        var invoke, ref;
        invoke = (function(_this) {
          return function() {
            var fn;
            fn = _this.get(key);
            if (_.isFunction(fn)) {
              return fn();
            } else {
              return fn;
            }
          };
        })(this);
        return (ref = invoke()) != null ? ref : {};
      };

      $Log.prototype.serializeError = function() {
        var err;
        if (err = this.get("error")) {
          return _.reduce(ERROR_PROPS, function(memo, prop) {
            if (_.has(err, prop) || err[prop]) {
              memo[prop] = err[prop];
            }
            return memo;
          }, {});
        } else {
          return null;
        }
      };

      $Log.prototype.toJSON = function() {
        return _(this.attributes).chain().omit("error").omit(_.isFunction).extend({
          err: this.serializeError(),
          consoleProps: this.invoke("consoleProps"),
          renderProps: this.invoke("renderProps")
        }).value();
      };

      $Log.prototype.set = function(key, val) {
        var obj, oc, ref;
        if (_.isString(key)) {
          obj = {};
          obj[key] = val;
        } else {
          obj = key;
        }
        if ("url" in obj) {
          obj.url = ((ref = obj.url) != null ? ref : "").toString();
        }
        if (oc = obj.onConsole) {
          obj.consoleProps = oc;
        }
        if (obj.alias) {
          _.defaults(obj, {
            aliasType: obj.$el ? "dom" : "primitive"
          });
        }
        if (this.attributes == null) {
          this.attributes = {};
        }
        if (this.attributes.id) {
          delete obj.id;
        }
        _.extend(this.attributes, obj);
        if (obj && _.isFunction(obj.consoleProps)) {
          this.wrapConsoleProps();
        }
        if (obj && obj.$el) {
          this.setElAttrs();
        }
        this.fireChangeEvent();
        return this;
      };

      $Log.prototype.pick = function() {
        var args;
        args = 1 <= arguments.length ? slice.call(arguments, 0) : [];
        args.unshift(this.attributes);
        return _.pick.apply(_, args);
      };

      $Log.prototype.publicInterface = function() {
        return {
          get: _.bind(this.get, this),
          on: _.bind(this.on, this),
          off: _.bind(this.off, this),
          pick: _.bind(this.pick, this),
          attributes: this.attributes
        };
      };

      $Log.prototype.snapshot = function(name, options) {
        var body, bodyStyles, fn, headStyles, htmlAttrs, next, obj, ref, ref1, snapshots;
        if (options == null) {
          options = {};
        }
        if ($Cypress.isHeadless) {
          return this;
        }
        _.defaults(options, {
          at: null,
          next: null
        });
        ref = this.Cypress.createSnapshot(this.get("$el")), body = ref.body, htmlAttrs = ref.htmlAttrs, headStyles = ref.headStyles, bodyStyles = ref.bodyStyles;
        obj = {
          name: name,
          body: body,
          htmlAttrs: htmlAttrs,
          headStyles: headStyles,
          bodyStyles: bodyStyles
        };
        snapshots = (ref1 = this.get("snapshots")) != null ? ref1 : [];
        snapshots[options.at || snapshots.length] = obj;
        this.set("snapshots", snapshots);
        if (next = options.next) {
          fn = this.snapshot;
          this.snapshot = function() {
            delete this.snapshot;
            return fn.call(this, next);
          };
        }
        return this;
      };

      $Log.prototype.error = function(err) {
        this.set({
          ended: true,
          error: err,
          state: "failed"
        });
        return this;
      };

      $Log.prototype.end = function() {
        if (this.get("ended")) {
          return;
        }
        this.set({
          ended: true,
          state: "passed"
        });
        return this;
      };

      $Log.prototype.getError = function(err) {
        if (CypressErrorRe.test(err.name)) {
          return err.toString();
        } else {
          return err.stack;
        }
      };

      $Log.prototype.setElAttrs = function() {
        var $el, obj;
        $el = this.get("$el");
        if (!$el) {
          return;
        }
        if (_.isElement($el)) {
          return this.set("$el", $($el), {
            silent: true
          });
        }
        obj = {
          highlightAttr: this.Cypress.highlightAttr,
          numElements: $el.length,
          visible: $el.length === $el.filter(":visible").length
        };
        return this.set(obj, {
          silent: true
        });
      };

      $Log.prototype.merge = function(log) {
        var ref, unsets;
        unsets = (ref = _.chain(this.attributes).keys()).without.apply(ref, _(log.attributes).keys()).value();
        _.each(unsets, (function(_this) {
          return function(unset) {
            return _this.unset(unset);
          };
        })(this));
        return this.set(log.attributes);
      };

      $Log.prototype._shouldAutoEnd = function() {
        return this.get("autoEnd") !== false && this.get("ended") !== true && this.get("event") === false && this.get("instrument") === "command";
      };

      $Log.prototype.finish = function() {
        if (this._shouldAutoEnd()) {
          return this.snapshot().end();
        }
      };

      $Log.prototype.wrapConsoleProps = function() {
        var _this;
        _this = this;
        return this.attributes.consoleProps = _.wrap(this.attributes.consoleProps, function() {
          var args, consoleObj, err, key, orig;
          orig = arguments[0], args = 2 <= arguments.length ? slice.call(arguments, 1) : [];
          key = _this.get("event") ? "Event" : "Command";
          consoleObj = {};
          consoleObj[key] = _this.get("name");
          _.extend(consoleObj, orig.apply(this, args));
          if (err = _this.get("error")) {
            _.defaults(consoleObj, {
              Error: _this.getError(err)
            });
          }
          if (_this.get("instrument") === "command" && !_this.get("snapshots")) {
            consoleObj.Snapshot = "The snapshot is missing. Displaying current state of the DOM.";
          } else {
            delete consoleObj.Snapshot;
          }
          return consoleObj;
        });
      };

      $Log.addToLogs = function(log) {
        var id;
        id = log.get("id");
        return logs[id] = true;
      };

      $Log.reduceMemory = function(attrs) {
        return _.each(attrs, function(value, key) {
          if (_.isObject(value)) {
            return attrs[key] = null;
          }
        });
      };

      $Log.toSerializedJSON = function(attrs) {
        var hasDocument, hasElement, hasWindow, isDomLike, stringify;
        hasWindow = $Cypress.Utils.hasWindow;
        hasDocument = $Cypress.Utils.hasDocument;
        hasElement = $Cypress.Utils.hasElement;
        isDomLike = function(value) {
          return hasWindow(value) || hasDocument(value) || hasElement(value);
        };
        stringify = function(value, key) {
          if (indexOf.call(BLACKLIST_PROPS, key) >= 0) {
            return null;
          }
          switch (false) {
            case !_.isArray(value):
              return _.map(value, stringify);
            case !isDomLike(value):
              return $Cypress.Utils.stringifyElement(value, "short");
            case !(_.isFunction(value) && groupsOrTableRe.test(key)):
              return value();
            case !_.isFunction(value):
              return value.toString();
            case !_.isObject(value):
              return _.mapObject(value, stringify);
            default:
              return value;
          }
        };
        return _.mapObject(attrs, stringify);
      };

      $Log.getDisplayProps = function(attrs) {
        return _.pick(attrs, DISPLAY_PROPS);
      };

      $Log.getConsoleProps = function(attrs) {
        return attrs.consoleProps;
      };

      $Log.getSnapshotProps = function(attrs) {
        return _.pick(attrs, SNAPSHOT_PROPS);
      };

      $Log.countLogsByTests = function(tests) {
        if (tests == null) {
          tests = {};
        }
        if (_.isEmpty(tests)) {
          return 0;
        }
        return _.chain(tests).map(function(test, key) {
          return [].concat(test.agents, test.routes, test.commands);
        }).flatten().compact().union([
          {
            id: 0
          }
        ]).pluck("id").max().value();
      };

      $Log.setCounter = function(num) {
        return counter = num;
      };

      $Log.create = function(Cypress, cy) {
        Cypress.off("abort", abort, $Log);
        Cypress.on("abort", abort, $Log);
        return _.each(klassMethods, function(fn, key) {
          return $Log[key] = _.partial(fn, Cypress, cy);
        });
      };

      return $Log;

    })();
    _.extend($Log.prototype, Backbone.Events);
    $Cypress.extend({
      command: function(obj) {
        if (obj == null) {
          obj = {};
        }
        $Cypress.Utils.warning("Cypress.command() is deprecated. Please update and use: Cypress.Log.command()");
        return $Log.command(obj);
      }
    });
    return $Log;
  })($Cypress, _, Backbone);

}).call(this);
; 
(function() {
  var slice = [].slice;

  $Cypress.Mocha = (function($Cypress, _, Mocha) {
    var $Mocha, runnableResetTimeout, runnableRun, runnerFail, runnerRun;
    runnerRun = Mocha.Runner.prototype.run;
    runnerFail = Mocha.Runner.prototype.fail;
    runnableRun = Mocha.Runnable.prototype.run;
    runnableResetTimeout = Mocha.Runnable.prototype.resetTimeout;
    $Mocha = (function() {
      function $Mocha(Cypress1, specWindow) {
        var ref, reporter;
        this.Cypress = Cypress1;
        reporter = (ref = $Cypress.reporter) != null ? ref : function() {};
        this.mocha = new Mocha({
          reporter: reporter,
          enableTimeouts: false
        });
        this.override();
        this.listeners();
        this.specWindow = specWindow;
        this.set(specWindow);
      }

      $Mocha.prototype.override = function() {
        this.patchRunnerFail();
        this.patchRunnableRun();
        this.patchRunnableResetTimeout();
        return this;
      };

      $Mocha.prototype.listeners = function() {
        this.listenTo(this.Cypress, "abort", (function(_this) {
          return function() {
            return _this.grep(/.*/);
          };
        })(this));
        this.listenTo(this.Cypress, "stop", (function(_this) {
          return function() {
            return _this.stop();
          };
        })(this));
        return this;
      };

      $Mocha.prototype.options = function(runner) {
        return runner.options(this.mocha.options);
      };

      $Mocha.prototype.grep = function(re) {
        return this.mocha.grep(re);
      };

      $Mocha.prototype.getRunner = function() {
        var _this;
        _this = this;
        Mocha.Runner.prototype.run = function() {
          _this.restoreRunnerRun();
          return this;
        };
        return this.mocha.run();
      };

      $Mocha.prototype.patchRunnerFail = function() {
        return Mocha.Runner.prototype.fail = _.wrap(runnerFail, function(orig, runnable, err) {
          if (Object.prototype.toString.call(err) !== "[object Error]") {
            return orig.call(this, runnable, err);
          }
          ++this.failures;
          runnable.state = "failed";
          return this.emit("fail", runnable, err);
        });
      };

      $Mocha.prototype.patchRunnableRun = function() {
        var Cypress, _this;
        _this = this;
        Cypress = this.Cypress;
        return Mocha.Runnable.prototype.run = _.wrap(runnableRun, function() {
          var args, invokedCy, orig, runnable;
          orig = arguments[0], args = 2 <= arguments.length ? slice.call(arguments, 1) : [];
          runnable = this;
          invokedCy = _.once(function() {
            return runnable._invokedCy = true;
          });
          this.fn = _.wrap(this.fn, function() {
            var args, e, orig, result, unbind;
            orig = arguments[0], args = 2 <= arguments.length ? slice.call(arguments, 1) : [];
            _this.listenTo(Cypress, "enqueue", invokedCy);
            unbind = function() {
              _this.stopListening(Cypress, "enqueue", invokedCy);
              return runnable.fn = orig;
            };
            try {
              result = orig.apply(this, args);
              unbind();
              if (runnable._invokedCy) {
                return Cypress.cy.prop("chain");
              }
              return result;
            } catch (error) {
              e = error;
              unbind();
              throw e;
            }
          });
          return orig.apply(this, args);
        });
      };

      $Mocha.prototype.patchRunnableResetTimeout = function() {
        return Mocha.Runnable.prototype.resetTimeout = _.wrap(runnableResetTimeout, function(orig) {
          var getErrPath, ms, runnable;
          runnable = this;
          ms = this.timeout() || 1e9;
          this.clearTimeout();
          getErrPath = function() {
            if (runnable.async) {
              return "mocha.async_timed_out";
            } else {
              return "mocha.timed_out";
            }
          };
          return this.timer = setTimeout(function() {
            var errMessage;
            errMessage = $Cypress.Utils.errMessageByPath(getErrPath(), {
              ms: ms
            });
            runnable.callback(new Error(errMessage));
            return runnable.timedOut = true;
          }, ms);
        });
      };

      $Mocha.prototype.set = function(contentWindow) {
        if (contentWindow.Mocha == null) {
          contentWindow.Mocha = Mocha;
        }
        if (contentWindow.mocha == null) {
          contentWindow.mocha = this.mocha;
        }
        this.clone(contentWindow);
        return this.ui(contentWindow, "bdd");
      };

      $Mocha.prototype.clone = function(contentWindow) {
        var mocha;
        mocha = contentWindow.mocha;
        this.mocha.suite.removeAllListeners();
        return this.mocha.suite = mocha.suite.clone();
      };

      $Mocha.prototype.ui = function(contentWindow, name) {
        var mocha;
        mocha = contentWindow.mocha;
        mocha.ui = function(name) {
          this._ui = Mocha.interfaces[name];
          if (!this._ui) {
            $Cypress.Utils.throwErrByPath("mocha.invalid_interface", {
              args: {
                name: name
              }
            });
          }
          this._ui = this._ui(this.suite);
          this.suite.emit('pre-require', contentWindow, null, this);
          return this;
        };
        return mocha.ui(name);
      };

      $Mocha.prototype.stop = function() {
        this.stopListening();
        this.restore();
        this.mocha.suite.removeAllListeners();
        this.mocha.suite.suites = [];
        this.mocha.suite.tests = [];
        this.mocha.suite = null;
        this.Cypress.mocha = null;
        delete this.specWindow.mocha;
        delete this.specWindow;
        delete this.mocha;
        return this;
      };

      $Mocha.prototype.restore = function() {
        this.restoreRunnerRun();
        this.restoreRunnerFail();
        this.restoreRunnableRun();
        this.restoreRunnableResetTimeout();
        return this;
      };

      $Mocha.prototype.restoreRunnableResetTimeout = function() {
        return Mocha.Runnable.prototype.resetTimeout = runnableResetTimeout;
      };

      $Mocha.prototype.restoreRunnerRun = function() {
        return Mocha.Runner.prototype.run = runnerRun;
      };

      $Mocha.prototype.restoreRunnerFail = function() {
        return Mocha.Runner.prototype.fail = runnerFail;
      };

      $Mocha.prototype.restoreRunnableRun = function() {
        return Mocha.Runnable.prototype.run = runnableRun;
      };

      _.extend($Mocha.prototype, Backbone.Events);

      $Mocha.create = function(Cypress, specWindow) {
        var existing;
        if (existing = Cypress.mocha) {
          existing.stopListening();
        }
        delete window.mocha;
        return Cypress.mocha = new $Mocha(Cypress, specWindow);
      };

      return $Mocha;

    })();
    return $Mocha;
  })($Cypress, _, Mocha);

}).call(this);
; 
(function() {
  (function($Cypress, _, $, Promise, moment, UrlParse) {
    return $Cypress.extend({
      loadModule: function(name) {
        var module;
        module = this.modules[name];
        if (!module) {
          $Cypress.Utils.throwErrByPath("miscellaneous.module_not_registered", {
            args: {
              name: name
            }
          });
        }
        return module.call(this, this, _, $, Promise, moment, UrlParse);
      },
      loadModules: function(names) {
        if (names == null) {
          names = [];
        }
        if (names.length) {
          return _.each(names, (function(_this) {
            return function(name) {
              return _this.loadModule(name);
            };
          })(this));
        } else {
          return _.each(this.modules, (function(_this) {
            return function(value, key) {
              return _this.loadModule(key);
            };
          })(this));
        }
      }
    });
  })($Cypress, _, $, Promise, moment, UrlParse);

}).call(this);
; 
(function() {
  $Cypress.Mouse = (function($Cypress, _, Promise) {
    var getClientX, getClientY, stopPropagation;
    stopPropagation = MouseEvent.prototype.stopPropagation;
    getClientX = function(coords, win) {
      return coords.x - win.pageXOffset;
    };
    getClientY = function(coords, win) {
      return coords.y - win.pageYOffset;
    };
    return {
      mouseDown: function($elToClick, coords, win) {
        var cancelled, mdownEvt, mdownEvtProps, modifiers, props;
        mdownEvtProps = Cypress.Keyboard.mixinModifiers({
          bubbles: true,
          cancelable: true,
          view: win,
          clientX: getClientX(coords, win),
          clientY: getClientY(coords, win),
          buttons: 1,
          detail: 1
        });
        mdownEvt = new MouseEvent("mousedown", mdownEvtProps);
        if (mdownEvt.buttons == null) {
          mdownEvt.buttons = 1;
        }
        mdownEvt.stopPropagation = function() {
          this._hasStoppedPropagation = true;
          return stopPropagation.apply(this, arguments);
        };
        cancelled = !$elToClick.get(0).dispatchEvent(mdownEvt);
        props = {
          preventedDefault: cancelled,
          stoppedPropagation: !!mdownEvt._hasStoppedPropagation
        };
        modifiers = Cypress.Keyboard.activeModifiers();
        if (modifiers.length) {
          props.modifiers = modifiers.join(", ");
        }
        return props;
      },
      mouseUp: function($elToClick, coords, win) {
        var cancelled, modifiers, mupEvt, mupEvtProps, props;
        mupEvtProps = Cypress.Keyboard.mixinModifiers({
          bubbles: true,
          cancelable: true,
          view: win,
          clientX: getClientX(coords, win),
          clientY: getClientY(coords, win),
          buttons: 0,
          detail: 1
        });
        mupEvt = new MouseEvent("mouseup", mupEvtProps);
        if (mupEvt.buttons == null) {
          mupEvt.buttons = 0;
        }
        mupEvt.stopPropagation = function() {
          this._hasStoppedPropagation = true;
          return stopPropagation.apply(this, arguments);
        };
        cancelled = !$elToClick.get(0).dispatchEvent(mupEvt);
        props = {
          preventedDefault: cancelled,
          stoppedPropagation: !!mupEvt._hasStoppedPropagation
        };
        modifiers = Cypress.Keyboard.activeModifiers();
        if (modifiers.length) {
          props.modifiers = modifiers.join(", ");
        }
        return props;
      },
      click: function($elToClick, coords, win) {
        var cancelled, clickEvt, clickEvtProps, modifiers, props;
        clickEvtProps = Cypress.Keyboard.mixinModifiers({
          bubbles: true,
          cancelable: true,
          view: win,
          clientX: getClientX(coords, win),
          clientY: getClientY(coords, win),
          buttons: 0,
          detail: 1
        });
        clickEvt = new MouseEvent("click", clickEvtProps);
        if (clickEvt.buttons == null) {
          clickEvt.buttons = 0;
        }
        clickEvt.stopPropagation = function() {
          this._hasStoppedPropagation = true;
          return stopPropagation.apply(this, arguments);
        };
        cancelled = !$elToClick.get(0).dispatchEvent(clickEvt);
        props = {
          preventedDefault: cancelled,
          stoppedPropagation: !!clickEvt._hasStoppedPropagation
        };
        modifiers = Cypress.Keyboard.activeModifiers();
        if (modifiers.length) {
          props.modifiers = modifiers.join(", ");
        }
        return props;
      }
    };
  })($Cypress, _, Promise);

}).call(this);
; 
(function() {
  (function($Cypress, _) {
    return $Cypress.extend({
      options: function(obj) {
        if (this._options == null) {
          this._options = {};
        }
        return _.extend(this._options, obj);
      },
      option: function(key, val) {
        if (this._options == null) {
          this._options = {};
        }
        if (!val) {
          return this._options[key];
        } else {
          return this._options[key] = val;
        }
      }
    });
  })($Cypress, _);

}).call(this);
; 
(function() {
  var slice = [].slice;

  $Cypress.Runner = (function($Cypress, _, moment) {
    var $Runner, ERROR_PROPS, RUNNABLE_LOGS, RUNNABLE_PROPS, betweenQuotesRe, defaultGrep, fire, fired, mochaCtxKeysRe, testEvents, triggerMocha, waitForHooksToResolve;
    defaultGrep = /.*/;
    mochaCtxKeysRe = /^(_runnable|test)$/;
    betweenQuotesRe = /\"(.+?)\"/;
    ERROR_PROPS = "message type name stack fileName lineNumber columnNumber host uncaught actual expected showDiff".split(" ");
    RUNNABLE_LOGS = "routes agents commands".split(" ");
    RUNNABLE_PROPS = "id title root hookName err duration state failedFromHook body".split(" ");
    triggerMocha = function() {
      var Cypress, args, event;
      Cypress = arguments[0], event = arguments[1], args = 3 <= arguments.length ? slice.call(arguments, 2) : [];
      if (!$Cypress.isHeadless) {
        return;
      }
      return Cypress.trigger.apply(Cypress, ["mocha", event].concat(slice.call(args)));
    };
    waitForHooksToResolve = function(ctx, event, test) {
      var events;
      if (test == null) {
        test = {};
      }
      events = fire.call(ctx, event, test, {
        multiple: true
      });
      events = _.filter(events, function(r) {
        return ctx.Cypress.Utils.isInstanceOf(r, Promise);
      });
      return Promise.all(events)["catch"](function(err) {
        return test.fn = function() {
          throw err;
        };
      });
    };
    fire = function(event, test, options) {
      if (options == null) {
        options = {};
      }
      if (test._fired == null) {
        test._fired = {};
      }
      test._fired[event] = true;
      if (test._ALREADY_RAN) {
        return;
      }
      if (options.multiple) {
        return [].concat(this.Cypress.invoke(event, this.wrap(test), test));
      } else {
        return this.Cypress.trigger(event, this.wrap(test));
      }
    };
    fired = function(event, test) {
      return !!(test._fired && test._fired[event]);
    };
    testEvents = {
      beforeRun: function(ctx, test) {
        if (!fired("test:before:run", test)) {
          return fire.call(ctx, "test:before:run", test);
        }
      },
      beforeHooksAsync: function(ctx, test) {
        return Promise["try"](function() {
          if (!fired("test:before:hooks", test)) {
            return waitForHooksToResolve(ctx, "test:before:hooks", test);
          }
        });
      },
      afterHooksAsync: function(ctx, test) {
        return Promise["try"](function() {
          if (!fired("test:after:hooks", test)) {
            return waitForHooksToResolve(ctx, "test:after:hooks", test);
          }
        });
      },
      afterRun: function(ctx, test) {
        if (!fired("test:after:run", test)) {
          fire.call(ctx, "test:after:run", test);
          return _.each(test.ctx, function(value, key) {
            if (_.isObject(value) && !mochaCtxKeysRe.test(key)) {
              return test.ctx[key] = null;
            }
          });
        }
      }
    };
    $Runner = (function() {
      function $Runner(Cypress1, runner1) {
        this.Cypress = Cypress1;
        this.runner = runner1;
        this.id = 0;
        this.tests = [];
        this.testsById = {};
        this.testsQueue = [];
        this.testsQueueById = {};
        this.runnables = [];
        this.logsById = {};
        this.emissions = {
          started: {},
          ended: {}
        };
        this.startTime = null;
        this.listeners();
        this.override();
        if (this.runner.suite) {
          this.normalizeAll();
        }
      }

      $Runner.prototype.fail = function(err, runnable) {
        if (runnable.state === "passed") {
          this.afterEachFailed(runnable, err);
        }
        return runnable.callback(err);
      };

      $Runner.prototype.listeners = function() {
        if (this.setListeners) {
          return;
        }
        this.setListeners = true;
        this.listenTo(this.Cypress, "fail", (function(_this) {
          return function(err, runnable) {
            return _this.fail(err, runnable);
          };
        })(this));
        this.listenTo(this.Cypress, "abort", (function(_this) {
          return function() {
            return _this.abort();
          };
        })(this));
        this.listenTo(this.Cypress, "stop", (function(_this) {
          return function() {
            return _this.stop();
          };
        })(this));
        this.listenTo(this.Cypress, "log", (function(_this) {
          return function(attrs) {
            return _this.addLog(attrs);
          };
        })(this));
        this.listenTo(this.Cypress, "log:state:changed", (function(_this) {
          return function(attrs) {
            return _this.addLog(attrs);
          };
        })(this));
        this.listenTo(this.Cypress, "test:after:run", (function(_this) {
          return function(test) {
            var numTestsKeptInMemory;
            numTestsKeptInMemory = _this.Cypress.config("numTestsKeptInMemory");
            return _this.cleanupQueue(_this.testsQueue, numTestsKeptInMemory);
          };
        })(this));
        return this;
      };

      $Runner.prototype.runnerListeners = function() {
        var Cypress, _this;
        if (this.setRunnerListeners) {
          return;
        }
        this.setRunnerListeners = true;
        Cypress = this.Cypress;
        _this = this;
        this.runner.on("start", function() {
          Cypress.trigger("run:start");
          if (Cypress._RESUMED_AT_TEST) {
            return;
          }
          return triggerMocha(Cypress, "start");
        });
        this.runner.on("end", (function(_this) {
          return function() {
            var end, err, test;
            end = function() {
              Cypress.trigger("run:end");
              triggerMocha(Cypress, "end");
              return _this.restore();
            };
            test = _this.test;
            err = test && test.err;
            if (err && err.uncaught) {
              return testEvents.afterHooksAsync(_this, test).then(function() {
                testEvents.afterRun(_this, test);
                return end();
              });
            } else {
              return end();
            }
          };
        })(this));
        this.runner.on("suite", (function(_this) {
          return function(suite) {
            if (_this.emissions.started[suite.id]) {
              return;
            }
            _this.emissions.started[suite.id] = true;
            return triggerMocha(Cypress, "suite", _this.wrap(suite));
          };
        })(this));
        this.runner.on("suite end", (function(_this) {
          return function(suite) {
            _.each(suite.ctx, function(value, key) {
              return delete suite.ctx[key];
            });
            if (_this.emissions.ended[suite.id]) {
              return;
            }
            _this.emissions.ended[suite.id] = true;
            return triggerMocha(Cypress, "suite end", _this.wrap(suite));
          };
        })(this));
        this.runner.on("hook", (function(_this) {
          return function(hook) {
            var hookName, test;
            hookName = _this.getHookName(hook);
            if (hookName === "before all" && hook.ctx.currentTest) {
              delete hook.ctx.currentTest;
            }
            test = _this.getTestFromHook(hook, hook.parent);
            hook.id = test.id;
            hook.ctx.currentTest = test;
            Cypress.set(hook, hookName);
            return triggerMocha(Cypress, "hook", _this.wrap(hook));
          };
        })(this));
        this.runner.on("hook end", (function(_this) {
          return function(hook) {
            var hookName, test;
            hookName = _this.getHookName(hook);
            if (hookName === "before each" && (test = hook.ctx.currentTest)) {
              Cypress.set(test, "test");
            }
            return triggerMocha(Cypress, "hook end", _this.wrap(hook));
          };
        })(this));
        this.runner.on("test", (function(_this) {
          return function(test) {
            _this.test = test;
            Cypress.set(test, "test");
            if (_this.emissions.started[test.id]) {
              return;
            }
            _this.emissions.started[test.id] = true;
            return triggerMocha(Cypress, "test", _this.wrap(test));
          };
        })(this));
        this.runner.on("test end", (function(_this) {
          return function(test) {
            if (_this.emissions.ended[test.id]) {
              return;
            }
            _this.emissions.ended[test.id] = true;
            Cypress.checkForEndedEarly();
            return triggerMocha(Cypress, "test end", _this.wrap(test));
          };
        })(this));
        this.runner.on("pass", (function(_this) {
          return function(test) {
            return triggerMocha(Cypress, "pass", _this.wrap(test));
          };
        })(this));
        this.runner.on("pending", function(test) {
          var tests;
          if (test._ALREADY_RAN) {
            return;
          }
          if (!fired("test:before:run", test)) {
            fire.call(_this, "test:before:run", test);
          }
          test.state = "pending";
          if (!test.alreadyEmittedMocha) {
            test.alreadyEmittedMocha = true;
            triggerMocha(Cypress, "pending", _this.wrap(test));
          }
          this.emit("test", test);
          tests = _this.getAllSiblingTests(test.parent);
          if (_(tests).last() !== test) {
            return fire.call(_this, "test:after:run", test);
          }
        });
        return this.runner.on("fail", (function(_this) {
          return function(runnable, err) {
            var hookName, isHook, parentTitle;
            isHook = runnable.type === "hook";
            if (isHook) {
              parentTitle = runnable.parent.title;
              hookName = _this.getHookName(runnable);
              err.message += "\n\n" + _this.Cypress.Utils.errMessageByPath("uncaught.error_in_hook", {
                parentTitle: parentTitle,
                hookName: hookName
              });
            }
            runnable.err = _this.wrapErr(err);
            if (!runnable.alreadyEmittedMocha) {
              runnable.alreadyEmittedMocha = true;
              triggerMocha(Cypress, "fail", _this.wrap(runnable), runnable.err);
            }
            if (isHook) {
              return _this.hookFailed(runnable, runnable.err, hookName);
            }
          };
        })(this));
      };

      $Runner.prototype.cleanupQueue = function(queue, numTestsKeptInMemory) {
        var test;
        if (queue.length > numTestsKeptInMemory) {
          test = queue.shift();
          delete this.testsQueueById[test.id];
          _.each(RUNNABLE_LOGS, function(logs) {
            return _.each(test[logs], function(attrs) {
              attrs._hasBeenCleanedUp = true;
              return $Cypress.Log.reduceMemory(attrs);
            });
          });
          return this.cleanupQueue(queue, numTestsKeptInMemory);
        }
      };

      $Runner.prototype.getDisplayPropsForLog = function(attrs) {
        return $Cypress.Log.getDisplayProps(attrs);
      };

      $Runner.prototype.getConsolePropsForLogById = function(logId) {
        var attrs;
        if (attrs = this.logsById[logId]) {
          return $Cypress.Log.getConsoleProps(attrs);
        }
      };

      $Runner.prototype.getSnapshotPropsForLogById = function(logId) {
        var attrs;
        if (attrs = this.logsById[logId]) {
          return $Cypress.Log.getSnapshotProps(attrs);
        }
      };

      $Runner.prototype.getErrorByTestId = function(testId) {
        var test;
        if (test = this.testsById[testId]) {
          return this.wrapErr(test.err);
        }
      };

      $Runner.prototype.addLog = function(attrs) {
        var existing, instrument, logs, name1, test, testId;
        if ($Cypress.isHeadless) {
          return;
        }
        test = this.testsById[attrs.testId];
        if (!test) {
          return;
        }
        if (!this.testsQueueById[test.id]) {
          this.testsQueueById[test.id] = true;
          this.testsQueue.push(test);
        }
        if (existing = this.logsById[attrs.id]) {
          if (existing._hasBeenCleanedUp) {
            return;
          }
          return _.extend(existing, attrs);
        } else {
          this.logsById[attrs.id] = attrs;
          testId = attrs.testId, instrument = attrs.instrument;
          if (test = this.testsById[testId]) {
            logs = test[name1 = instrument + "s"] != null ? test[name1] : test[name1] = [];
            return logs.push(attrs);
          }
        }
      };

      $Runner.prototype.matchesGrep = function(runnable, grep) {
        if ((runnable.matchesGrep == null) || (!_.isEqual(runnable.grepRe, grep))) {
          runnable.grepRe = grep;
          runnable.matchesGrep = grep.test(runnable.fullTitle());
        }
        return runnable.matchesGrep;
      };

      $Runner.prototype.getEmissions = function() {
        return this.emissions;
      };

      $Runner.prototype.getTestsState = function() {
        var id, j, len, ref, ref1, test, tests;
        id = (ref = this.test) != null ? ref.id : void 0;
        tests = {};
        if (!id) {
          return {};
        }
        ref1 = this.tests;
        for (j = 0, len = ref1.length; j < len; j++) {
          test = ref1[j];
          if (test.id === id) {
            break;
          } else {
            test = this.wrapAll(test);
            _.each(RUNNABLE_LOGS, function(type) {
              var logs;
              if (logs = test[type]) {
                return test[type] = _.map(logs, $Cypress.Log.toSerializedJSON);
              }
            });
            tests[test.id] = test;
          }
        }
        return tests;
      };

      $Runner.prototype.getId = function() {
        return "r" + (this.id += 1);
      };

      $Runner.prototype.normalizeAll = function(initialTests, grep) {
        var grepIsDefault, hasTests, obj, tests;
        if (initialTests == null) {
          initialTests = {};
        }
        hasTests = false;
        this.firstTest(this.runner.suite, function(test) {
          return hasTests = true;
        });
        if (!hasTests) {
          return;
        }
        tests = {};
        if (grep == null) {
          grep = this.grep();
        }
        grepIsDefault = _.isEqual(grep, defaultGrep);
        obj = this.normalize(this.runner.suite, tests, initialTests, grep, grepIsDefault);
        this.testsById = tests;
        this.tests = _.values(tests);
        return obj;
      };

      $Runner.prototype.resumeAtTest = function(id, emissions) {
        var j, len, ref, test;
        if (emissions == null) {
          emissions = {};
        }
        this.Cypress._RESUMED_AT_TEST = id;
        this.emissions = emissions;
        ref = this.tests;
        for (j = 0, len = ref.length; j < len; j++) {
          test = ref[j];
          if (test.id !== id) {
            test._ALREADY_RAN = true;
            test.pending = true;
          } else {
            return;
          }
        }
      };

      $Runner.prototype.normalize = function(runnable, tests, initialTests, grep, grepIsDefault) {
        var normalize, obj, push, ref, ref1;
        normalize = (function(_this) {
          return function(runnable) {
            var i;
            runnable.id = _this.getId();
            if (runnable.type == null) {
              runnable.type = "suite";
            }
            _this.runnables.push(runnable);
            if (i = initialTests[runnable.id]) {
              _.each(RUNNABLE_LOGS, function(type) {
                return _.each(i[type], function(l) {
                  return _this.logsById[l.id] = l;
                });
              });
              _.extend(runnable, i);
            }
            return _this.wrapAll(runnable);
          };
        })(this);
        push = (function(_this) {
          return function(test) {
            var name1;
            return tests[name1 = test.id] != null ? tests[name1] : tests[name1] = test;
          };
        })(this);
        obj = normalize(runnable);
        if (grepIsDefault) {
          if (runnable.type === "test") {
            push(runnable);
          }
          _.each({
            tests: runnable.tests,
            suites: runnable.suites
          }, (function(_this) {
            return function(runnables, key) {
              if (runnable[key]) {
                return obj[key] = _.map(runnables, function(runnable) {
                  return _this.normalize(runnable, tests, initialTests, grep, grepIsDefault);
                });
              }
            };
          })(this));
        } else {
          obj.tests = _.reduce((ref = runnable.tests) != null ? ref : [], (function(_this) {
            return function(memo, test) {
              if (_this.matchesGrep(test, grep)) {
                memo.push(normalize(test));
                push(test);
              }
              return memo;
            };
          })(this), []);
          obj.suites = _.reduce((ref1 = runnable.suites) != null ? ref1 : [], (function(_this) {
            return function(memo, suite) {
              var any;
              any = _this.anyTestInSuite(suite, function(test) {
                return _this.matchesGrep(test, grep);
              });
              if (any) {
                memo.push(_this.normalize(suite, tests, initialTests, grep, grepIsDefault));
              }
              return memo;
            };
          })(this), []);
        }
        return obj;
      };

      $Runner.prototype.reduceProps = function(obj, props) {
        return _.reduce(props, function(memo, prop) {
          if (_.has(obj, prop) || obj[prop]) {
            memo[prop] = obj[prop];
          }
          return memo;
        }, {});
      };

      $Runner.prototype.wrapAll = function(runnable) {
        return _.extend({}, this.reduceProps(runnable, RUNNABLE_PROPS), this.reduceProps(runnable, RUNNABLE_LOGS));
      };

      $Runner.prototype.wrapErr = function(err) {
        return this.reduceProps(err, ERROR_PROPS);
      };

      $Runner.prototype.wrap = function(runnable) {
        return this.reduceProps(runnable, RUNNABLE_PROPS);
      };

      $Runner.prototype.restore = function() {
        return _.each([this.runnables, this.runner], (function(_this) {
          return function(obj) {
            return _this.removeAllListeners(obj);
          };
        })(this));
      };

      $Runner.prototype.stop = function() {
        this.stopListening();
        this.restore();
        delete this.runner.hook;
        this.runner = this.tests = this.Cypress.runner = null;
        return this;
      };

      $Runner.prototype.removeAllListeners = function(obj) {
        var array;
        array = [].concat(obj);
        return _.invoke(array, "removeAllListeners");
      };

      $Runner.prototype.abort = function() {
        this.runner.abort();
        return this.runner.emit("end");
      };

      $Runner.prototype.options = function(options) {
        var re;
        if (options == null) {
          options = {};
        }
        if (re = options.grep) {
          return this.grep(re);
        }
      };

      $Runner.prototype.countByTestState = function(tests, state) {
        var count;
        count = _.filter(tests, function(test, key) {
          return test.state === state;
        });
        return count.length;
      };

      $Runner.prototype.setNumLogs = function(num) {
        return this.Cypress.Log.setCounter(num);
      };

      $Runner.prototype.setStartTime = function(iso) {
        return this.startTime = iso;
      };

      $Runner.prototype.getStartTime = function() {
        return this.startTime;
      };

      $Runner.prototype.run = function(fn) {
        if (this.startTime == null) {
          this.startTime = moment().toJSON();
        }
        this.runnerListeners();
        return this.runner.run((function(_this) {
          return function(failures) {
            if (fn) {
              return fn(failures, _this.getTestResults());
            }
          };
        })(this));
      };

      $Runner.prototype.getTestResults = function() {
        return _(this.tests).map(function(test) {
          var obj;
          obj = _(test).pick("id", "duration", "state");
          obj.title = test.originalTitle;
          if (!obj.state) {
            obj.state = "skipped";
          }
          return obj;
        });
      };

      $Runner.prototype.getHookName = function(hook) {
        var name;
        name = hook.title.match(betweenQuotesRe);
        return name && name[1];
      };

      $Runner.prototype.afterEachFailed = function(test, err) {
        test.state = "failed";
        test.err = this.wrapErr(err);
        return triggerMocha(this.Cypress, "test end", this.wrap(test));
      };

      $Runner.prototype.hookFailed = function(hook, err, hookName) {
        var test;
        test = this.getTestFromHook(hook, hook.parent);
        test.err = err;
        test.state = "failed";
        test.duration = hook.duration;
        test.hookName = hookName;
        test.failedFromHook = true;
        if (hook.alreadyEmittedMocha) {
          return test.alreadyEmittedMocha = true;
        } else {
          return triggerMocha(this.Cypress, "test end", this.wrap(test));
        }
      };

      $Runner.prototype.total = function() {
        return this.runner.suite.total();
      };

      $Runner.prototype.getTestByTitle = function(title) {
        return this.firstTest(this.runner.suite, function(test) {
          return test.title === title;
        });
      };

      $Runner.prototype.firstTest = function(suite, fn) {
        var j, k, len, len1, ref, ref1, test;
        ref = suite.tests;
        for (j = 0, len = ref.length; j < len; j++) {
          test = ref[j];
          if (fn(test)) {
            return test;
          }
        }
        ref1 = suite.suites;
        for (k = 0, len1 = ref1.length; k < len1; k++) {
          suite = ref1[k];
          if (test = this.firstTest(suite, fn)) {
            return test;
          }
        }
      };

      $Runner.prototype.anyTestInSuite = function(suite, fn) {
        var j, k, len, len1, ref, ref1, test;
        ref = suite.tests;
        for (j = 0, len = ref.length; j < len; j++) {
          test = ref[j];
          if (fn(test) === true) {
            return true;
          }
        }
        ref1 = suite.suites;
        for (k = 0, len1 = ref1.length; k < len1; k++) {
          suite = ref1[k];
          if (this.anyTestInSuite(suite, fn) === true) {
            return true;
          }
        }
        return false;
      };

      $Runner.prototype.grep = function(re) {
        var base;
        if (arguments.length) {
          return this.runner._grep = re;
        } else {
          return (base = this.runner)._grep != null ? base._grep : base._grep = defaultGrep;
        }
      };

      $Runner.prototype.ignore = function(runnable) {
        return runnable.pending = true;
      };

      $Runner.prototype.getTestFromHook = function(hook, suite) {
        var found, test;
        if (test = hook != null ? hook.ctx.currentTest : void 0) {
          return test;
        }
        if (hook != null ? hook.id : void 0) {
          found = this.firstTest(suite, (function(_this) {
            return function(test) {
              return hook.id === test.id;
            };
          })(this));
          if (found) {
            return found;
          }
        }
        found = this.firstTest(suite, (function(_this) {
          return function(test) {
            return _this.testInTests(test);
          };
        })(this));
        if (found) {
          return found;
        }
        return this.firstTest(suite, function(test) {
          return true;
        });
      };

      $Runner.prototype.testInTests = function(test) {
        return this.testsById[test.id];
      };

      $Runner.prototype.getAllSiblingTests = function(suite) {
        var tests;
        tests = [];
        suite.eachTest((function(_this) {
          return function(test) {
            if (_this.testInTests(test)) {
              return tests.push(test);
            }
          };
        })(this));
        return tests;
      };

      $Runner.prototype.override = function() {
        var Cypress, _this;
        if (!this.runner.hook) {
          return;
        }
        Cypress = this.Cypress;
        _this = this;
        return this.runner.hook = _.wrap(this.runner.hook, function(orig, name, fn) {
          var hooks, isLastSuite, ref, testAfterHooks, testBeforeHooks, tests;
          hooks = this.suite["_" + name];
          isLastSuite = function(suite) {
            var suites;
            if (suite.root) {
              return false;
            }
            suites = _.reduce(_this.tests, function(memo, test) {
              var parent;
              while (parent = test.parent) {
                memo.push(parent);
                test = parent;
              }
              return memo;
            }, []);
            return _.chain(suites).uniq().intersection(suite.parent.suites).last().value() === suite;
          };
          testBeforeHooks = function(hook, suite) {
            if (!_this.test) {
              _this.test = _this.getTestFromHook(hook, suite);
            }
            testEvents.beforeRun(_this, _this.test);
            return fn = _.wrap(fn, function() {
              var args, orig;
              orig = arguments[0], args = 2 <= arguments.length ? slice.call(arguments, 1) : [];
              return testEvents.beforeHooksAsync(_this, _this.test).then(function() {
                return orig.apply(null, args);
              });
            });
          };
          testAfterHooks = function() {
            var test;
            test = _this.test;
            _this.test = null;
            return fn = _.wrap(fn, function() {
              var args, orig;
              orig = arguments[0], args = 2 <= arguments.length ? slice.call(arguments, 1) : [];
              return testEvents.afterHooksAsync(_this, test).then(function() {
                testEvents.afterRun(_this, test);
                Cypress.restore();
                return orig.apply(null, args);
              });
            });
          };
          switch (name) {
            case "beforeAll":
              testBeforeHooks(hooks[0], this.suite);
              break;
            case "beforeEach":
              if (this.suite.root) {
                testBeforeHooks(hooks[0], this.suite);
              }
              break;
            case "afterEach":
              tests = _this.getAllSiblingTests(_this.test.parent);
              if (this.suite.root && (_this.test !== _(_this.tests).last()) && (_this.test !== _(tests).last())) {
                testAfterHooks();
              }
              break;
            case "afterAll":
              if (_this.test) {
                tests = _this.getAllSiblingTests(_this.test.parent);
                if ((this.suite.root && _this.test === _(_this.tests).last()) || (((ref = this.suite.parent) != null ? ref.root : void 0) && _this.test === _(tests).last()) || (!isLastSuite(this.suite) && _this.test === _(tests).last())) {
                  testAfterHooks();
                }
              }
          }
          return orig.call(this, name, fn);
        });
      };

      _.extend($Runner.prototype, Backbone.Events);

      $Runner.runner = function(Cypress, runner) {
        var existing;
        if (existing = Cypress.runner) {
          existing.stopListening();
        }
        return Cypress.runner = new $Runner(Cypress, runner);
      };

      $Runner.create = function(Cypress, specWindow, mocha) {
        var runner;
        runner = mocha.getRunner();
        runner.suite = specWindow.mocha.suite;
        return this.runner(Cypress, runner);
      };

      return $Runner;

    })();
    return $Runner;
  })($Cypress, _, moment);

}).call(this);
; 
(function() {
  $Cypress.Server = (function($Cypress, _, minimatch) {
    var $Server, XMLHttpRequest, defaults, isCypressHeaderRe, needsDashRe, nope, normalize, parseJSON, props, regularResourcesRe, setHeader, warnOnForce404Default, warnOnStubDeprecation, whitelist;
    regularResourcesRe = /\.(jsx?|coffee|html|less|s?css|svg)(\?.*)?$/;
    isCypressHeaderRe = /^X-Cypress-/i;
    needsDashRe = /([a-z][A-Z])/g;
    props = "onreadystatechange onload onerror".split(" ");
    setHeader = function(xhr, key, val, transformer) {
      if (val != null) {
        if (transformer) {
          val = transformer(val);
        }
        key = "X-Cypress-" + _.capitalize(key);
        return xhr.setRequestHeader(key, encodeURI(val));
      }
    };
    normalize = function(val) {
      val = val.replace(needsDashRe, function(match) {
        return match[0] + "-" + match[1];
      });
      return val.toLowerCase();
    };
    nope = function() {
      return null;
    };
    parseJSON = function(text) {
      try {
        return JSON.parse(text);
      } catch (error) {
        return text;
      }
    };
    warnOnStubDeprecation = function(obj, type) {
      if (_.has(obj, "stub")) {
        return $Cypress.Utils.warning("Passing cy." + type + "({stub: false}) is now deprecated. You can safely remove: {stub: false}.\n\nhttps://on.cypress.io/deprecated-stub-false-on-" + type);
      }
    };
    warnOnForce404Default = function(obj) {
      if (obj.force404 === false) {
        return $Cypress.Utils.warning("Passing cy.server({force404: false}) is now the default behavior of cy.server(). You can safely remove this option.");
      }
    };
    whitelist = function(xhr) {
      return xhr.method === "GET" && regularResourcesRe.test(xhr.url);
    };
    defaults = {
      testId: "",
      xhrUrl: "",
      method: "GET",
      delay: 0,
      status: 200,
      headers: null,
      response: null,
      enable: true,
      autoRespond: true,
      waitOnResponses: 2e308,
      force404: false,
      onAnyAbort: void 0,
      onAnyRequest: void 0,
      onAnyResponse: void 0,
      urlMatchingOptions: {
        matchBase: true
      },
      stripOrigin: _.identity,
      getUrlOptions: _.identity,
      whitelist: whitelist,
      onSend: function() {},
      onXhrAbort: function() {},
      onError: function() {},
      onLoad: function() {},
      onFixtureError: function() {},
      onNetworkError: function() {}
    };
    XMLHttpRequest = (function() {
      function XMLHttpRequest(xhr1) {
        this.xhr = xhr1;
        this.id = this.xhr.id;
        this.url = this.xhr.url;
        this.method = this.xhr.method;
        this.status = null;
        this.statusMessage = null;
        this.request = {};
        this.response = null;
      }

      XMLHttpRequest.prototype._getXhr = function() {
        var ref;
        return (ref = this.xhr) != null ? ref : $Cypress.Utils.throwErrByPath("xhr.missing");
      };

      XMLHttpRequest.prototype._setDuration = function(timeStart) {
        return this.duration = (new Date) - timeStart;
      };

      XMLHttpRequest.prototype._setStatus = function() {
        this.status = this.xhr.status;
        return this.statusMessage = this.xhr.status + " (" + this.xhr.statusText + ")";
      };

      XMLHttpRequest.prototype._setRequestBody = function(requestBody) {
        if (requestBody == null) {
          requestBody = null;
        }
        return this.request.body = parseJSON(requestBody);
      };

      XMLHttpRequest.prototype._setResponseBody = function() {
        var e;
        if (this.response == null) {
          this.response = {};
        }
        return this.response.body = (function() {
          try {
            return parseJSON(this.xhr.responseText);
          } catch (error) {
            e = error;
            return this.xhr.response;
          }
        }).call(this);
      };

      XMLHttpRequest.prototype._setResponseHeaders = function() {
        var headerPair, headerPairs, headerStr, headers, i, index, key, len, set, val;
        headerStr = this.xhr.getAllResponseHeaders();
        set = (function(_this) {
          return function(resp) {
            if (_this.response == null) {
              _this.response = {};
            }
            return _this.response.headers = resp;
          };
        })(this);
        headers = {};
        if (!headerStr) {
          return set(headers);
        }
        headerPairs = headerStr.split('\u000d\u000a');
        for (i = 0, len = headerPairs.length; i < len; i++) {
          headerPair = headerPairs[i];
          index = headerPair.indexOf('\u003a\u0020');
          if (index > 0) {
            key = headerPair.substring(0, index);
            val = headerPair.substring(index + 2);
            headers[key] = val;
          }
        }
        return set(headers);
      };

      XMLHttpRequest.prototype._getFixtureError = function() {
        var body, err;
        body = this.response && this.response.body;
        if (body && (err = body.__error)) {
          return err;
        }
      };

      XMLHttpRequest.prototype._setRequestHeader = function(key, val) {
        var base, current;
        if (isCypressHeaderRe.test(key)) {
          return;
        }
        if ((base = this.request).headers == null) {
          base.headers = {};
        }
        current = this.request.headers[key];
        if (current) {
          val = current + ", " + val;
        }
        return this.request.headers[key] = val;
      };

      XMLHttpRequest.prototype.setRequestHeader = function() {
        return this.xhr.setRequestHeader.apply(this.xhr, arguments);
      };

      XMLHttpRequest.prototype.getResponseHeader = function() {
        return this.xhr.getResponseHeader.apply(this.xhr, arguments);
      };

      XMLHttpRequest.prototype.getAllResponseHeaders = function() {
        return this.xhr.getAllResponseHeaders.apply(this.xhr, arguments);
      };

      XMLHttpRequest.add = function(xhr) {
        return new XMLHttpRequest(xhr);
      };

      return XMLHttpRequest;

    })();
    Object.defineProperties(XMLHttpRequest.prototype, {
      requestHeaders: {
        get: function() {
          var ref;
          return (ref = this.request) != null ? ref.headers : void 0;
        }
      },
      requestBody: {
        get: function() {
          var ref;
          return (ref = this.request) != null ? ref.body : void 0;
        }
      },
      responseHeaders: {
        get: function() {
          var ref;
          return (ref = this.response) != null ? ref.headers : void 0;
        }
      },
      responseBody: {
        get: function() {
          var ref;
          return (ref = this.response) != null ? ref.body : void 0;
        }
      },
      requestJSON: {
        get: function() {
          $Cypress.Utils.warning("requestJSON is now deprecated and will be removed in the next version. Update this to 'requestBody' or 'request.body'.");
          return this.requestBody;
        }
      },
      responseJSON: {
        get: function() {
          $Cypress.Utils.warning("responseJSON is now deprecated and will be removed in the next version. Update this to 'responseBody' or 'response.body'.");
          return this.responseBody;
        }
      }
    });
    $Server = (function() {
      function $Server(options1) {
        this.options = options1 != null ? options1 : {};
        _.defaults(this.options, defaults);
        this.xhrs = {};
        this.proxies = {};
        this.routes = [];
        this.enableStubs(false);
      }

      $Server.prototype.getOptions = function() {
        return _.clone(this.options);
      };

      $Server.prototype.isWhitelisted = function(xhr) {
        return this.options.whitelist.call(this, xhr);
      };

      $Server.prototype.getFullyQualifiedUrl = function(contentWindow, url) {
        var a;
        a = contentWindow.document.createElement("a");
        a.href = url;
        return a.href;
      };

      $Server.prototype.getStack = function() {
        var err;
        err = new Error;
        return err.stack.split("\n").slice(3).join("\n");
      };

      $Server.prototype.shouldApplyStub = function(route) {
        return this.isEnabled && route && (route.response != null);
      };

      $Server.prototype.transformHeaders = function(headers) {
        headers = _.reduce(headers, function(memo, value, key) {
          memo[normalize(key)] = value;
          return memo;
        }, {});
        return JSON.stringify(headers);
      };

      $Server.prototype.applyStubProperties = function(xhr, route) {
        var responser;
        responser = _.isObject(route.response) ? JSON.stringify : null;
        setHeader(xhr, "id", xhr.id);
        setHeader(xhr, "status", route.status);
        setHeader(xhr, "response", route.response, responser);
        setHeader(xhr, "matched", route.url + "");
        setHeader(xhr, "delay", route.delay);
        return setHeader(xhr, "headers", route.headers, this.transformHeaders);
      };

      $Server.prototype.normalizeStubUrl = function(xhrUrl, url) {
        if (!xhrUrl) {
          $Cypress.Utils.warning("'Server.options.xhrUrl' has not been set");
        }
        xhrUrl = _.compact(xhrUrl.split("/")).join("/");
        url = _.ltrim(url, "/");
        return ["/" + xhrUrl, url].join("/");
      };

      $Server.prototype.route = function(attrs) {
        var route;
        if (attrs == null) {
          attrs = {};
        }
        warnOnStubDeprecation(attrs, "route");
        route = _.defaults({}, attrs, _(this.options).pick("delay", "method", "status", "autoRespond", "waitOnResponses", "onRequest", "onResponse"));
        this.routes.push(route);
        return route;
      };

      $Server.prototype.getRouteForXhr = function(xhr) {
        var i, ref, route;
        if (!this.routes.length && this.isEnabled && this.options.force404 !== false && !this.isWhitelisted(xhr)) {
          return this.get404Route();
        }
        if (!this.routes.length) {
          return nope();
        }
        if (this.isWhitelisted(xhr)) {
          return nope();
        }
        ref = this.routes;
        for (i = ref.length - 1; i >= 0; i += -1) {
          route = ref[i];
          if (this.xhrMatchesRoute(xhr, route)) {
            return route;
          }
        }
        if (this.options.force404) {
          return this.get404Route();
        } else {
          return nope();
        }
      };

      $Server.prototype.get404Route = function() {
        return {
          status: 404,
          response: "",
          delay: 0,
          headers: null,
          is404: true
        };
      };

      $Server.prototype.urlsMatch = function(routePattern, fullyQualifiedUrl) {
        var match, testRe, testStr;
        match = (function(_this) {
          return function(str, pattern) {
            if (pattern[0] !== "/" && str[0] === "/") {
              pattern = "/" + pattern;
            }
            return minimatch.js(str, pattern, _this.options.urlMatchingOptions);
          };
        })(this);
        testRe = function(url1, url2) {
          return routePattern.test(url1) || routePattern.test(url2);
        };
        testStr = function(url1, url2) {
          return (routePattern === url1) || (routePattern === url2) || match(url1, routePattern) || match(url2, routePattern);
        };
        if (_.isRegExp(routePattern)) {
          return testRe(fullyQualifiedUrl, this.options.stripOrigin(fullyQualifiedUrl));
        } else {
          return testStr(fullyQualifiedUrl, this.options.stripOrigin(fullyQualifiedUrl));
        }
      };

      $Server.prototype.xhrMatchesRoute = function(xhr, route) {
        return xhr.method === route.method && this.urlsMatch(route.url, xhr.url);
      };

      $Server.prototype.add = function(xhr, attrs) {
        var id;
        if (attrs == null) {
          attrs = {};
        }
        _.extend(xhr, attrs);
        xhr.id = id = _.uniqueId("xhr");
        this.xhrs[id] = xhr;
        return this.proxies[id] = XMLHttpRequest.add(xhr);
      };

      $Server.prototype.getProxyFor = function(xhr) {
        return this.proxies[xhr.id];
      };

      $Server.prototype.abort = function() {
        _(this.xhrs).chain().filter(function(xhr) {
          return xhr.aborted !== true && xhr.readyState !== 4;
        }).invoke("abort");
        return this;
      };

      $Server.prototype.enableStubs = function(bool) {
        if (bool == null) {
          bool = true;
        }
        return this.isEnabled = bool;
      };

      $Server.prototype.set = function(obj) {
        warnOnStubDeprecation(obj, "server");
        warnOnForce404Default(obj);
        if (obj.enable != null) {
          this.enableStubs(obj.enable);
        }
        return _.extend(this.options, obj);
      };

      $Server.prototype.restore = function() {};

      $Server.prototype.bindTo = function(contentWindow) {
        return $Server.bindTo(contentWindow, (function(_this) {
          return function() {
            return _this;
          };
        })(this));
      };

      $Server.bindTo = function(contentWindow, getServer) {
        var XHR, abort, open, send, srh;
        XHR = contentWindow.XMLHttpRequest;
        send = XHR.prototype.send;
        open = XHR.prototype.open;
        abort = XHR.prototype.abort;
        srh = XHR.prototype.setRequestHeader;
        getServer().restore = function() {
          contentWindow.XMLHttpRequest = XHR;
          _.each({
            send: send,
            open: open,
            abort: abort,
            setRequestHeader: srh
          }, function(value, key) {
            return XHR.prototype[key] = value;
          });
          return {
            contentWindow: contentWindow,
            XMLHttpRequest: XHR
          };
        };
        XHR.prototype.setRequestHeader = function() {
          var proxy;
          proxy = getServer().getProxyFor(this);
          proxy._setRequestHeader.apply(proxy, arguments);
          return srh.apply(this, arguments);
        };
        XHR.prototype.abort = function() {
          var abortStack, proxy, route;
          this.aborted = true;
          abortStack = getServer().getStack();
          proxy = getServer().getProxyFor(this);
          proxy.aborted = true;
          getServer().options.onXhrAbort(proxy, abortStack);
          if (_.isFunction(getServer().options.onAnyAbort)) {
            route = getServer().getRouteForXhr(this);
            getServer().options.onAnyAbort(route, proxy);
          }
          return abort.apply(this, arguments);
        };
        XHR.prototype.open = function(method, url, async, username, password) {
          var called, fns, fullyQualifiedUrl, onErrorFn, onLoadFn, onReadyStateFn, overrides, proxy, readyStates, route, timeStart, xhr;
          if (async == null) {
            async = true;
          }
          fullyQualifiedUrl = getServer().getFullyQualifiedUrl(contentWindow, url);
          proxy = getServer().add(this, {
            method: method,
            url: decodeURIComponent(fullyQualifiedUrl)
          });
          route = getServer().getRouteForXhr(this);
          if (getServer().shouldApplyStub(route)) {
            url = getServer().normalizeStubUrl(getServer().options.xhrUrl, fullyQualifiedUrl);
          }
          timeStart = new Date;
          xhr = this;
          fns = {};
          called = {};
          overrides = {};
          readyStates = {};
          onLoadFn = function() {
            var err, ol;
            if (called.onload) {
              return;
            }
            called.onload = true;
            proxy._setDuration(timeStart);
            proxy._setStatus();
            proxy._setResponseHeaders();
            proxy._setResponseBody();
            if (err = proxy._getFixtureError()) {
              return getServer().options.onFixtureError(proxy, err);
            }
            try {
              if (_.isFunction(ol = fns.onload)) {
                ol.apply(xhr, arguments);
              }
              getServer().options.onLoad(proxy, route);
            } catch (error) {
              err = error;
              getServer().options.onError(proxy, err);
            }
            if (_.isFunction(getServer().options.onAnyResponse)) {
              return getServer().options.onAnyResponse(route, proxy);
            }
          };
          onErrorFn = function() {
            var err, oe;
            if (called.onerror) {
              return;
            }
            called.onerror = true;
            try {
              if (_.isFunction(oe = fns.onerror)) {
                oe.apply(xhr, arguments);
              }
              return getServer().options.onNetworkError(proxy);
            } catch (error) {
              err = error;
              return getServer().options.onError(proxy, err);
            }
          };
          onReadyStateFn = function() {
            var err, orst;
            if (readyStates[this.readyState]) {
              return;
            }
            readyStates[this.readyState] = true;
            try {
              if (_.isFunction(orst = fns.onreadystatechange)) {
                return orst.apply(xhr, arguments);
              }
            } catch (error) {
              err = error;
              xhr.onreadystatechange = null;
              return getServer().options.onError(proxy, err);
            }
          };
          overrides.onload = onLoadFn;
          overrides.onerror = onErrorFn;
          overrides.onreadystatechange = onReadyStateFn;
          props.forEach(function(prop) {
            var fn;
            if (fn = xhr[prop]) {
              fns[prop] = fn;
            }
            xhr[prop] = overrides[prop];
            return Object.defineProperty(xhr, prop, {
              get: function() {
                var bak;
                bak = fns[prop];
                if (_.isFunction(bak)) {
                  return fns[prop] = function() {
                    return bak.apply(xhr, arguments);
                  };
                } else {
                  return overrides[prop];
                }
              },
              set: function(fn) {
                return fns[prop] = fn;
              }
            });
          });
          return open.call(this, method, url, async, username, password);
        };
        return XHR.prototype.send = function(requestBody) {
          var proxy, route, sendStack;
          route = getServer().getRouteForXhr(this);
          if (getServer().shouldApplyStub(route)) {
            getServer().applyStubProperties(this, route);
          }
          sendStack = getServer().getStack();
          proxy = getServer().getProxyFor(this);
          proxy._setRequestBody(requestBody);
          if (!getServer().isWhitelisted(this)) {
            getServer().options.onSend(proxy, sendStack, route);
          }
          if (_.isFunction(getServer().options.onAnyRequest)) {
            getServer().options.onAnyRequest(route, proxy);
          }
          return send.apply(this, arguments);
        };
      };

      $Server.defaults = function(obj) {
        if (obj == null) {
          obj = {};
        }
        return _.extend(defaults, obj);
      };

      $Server.XMLHttpRequest = XMLHttpRequest;

      $Server.create = function(options) {
        return new $Server(options);
      };

      return $Server;

    })();
    return $Server;
  })($Cypress, _, minimatch);

}).call(this);
; 
(function() {
  var slice = [].slice;

  (function($Cypress) {
    return $Cypress.Sinon = {
      override: function(sinon) {
        sinon.spyCall = _.wrap(sinon.spyCall, function() {
          var args, call, orig;
          orig = arguments[0], args = 2 <= arguments.length ? slice.call(arguments, 1) : [];
          call = orig.apply(null, args);
          call.toString = _.wrap(call.toString, function(orig) {
            var ret, stack;
            stack = call.stack;
            call.stack = null;
            ret = orig.call(call);
            call.stack = stack;
            return ret;
          });
          return call;
        });
        return sinon.format = $Cypress.Utils.stringifyArg.bind($Cypress.Utils);
      }
    };
  })($Cypress);

}).call(this);
; 
(function() {
  (function($Cypress, _, $) {
    var getCssRulesString, reduceText;
    reduceText = function(arr, fn) {
      return _.reduce(arr, (function(memo, item) {
        return memo += fn(item);
      }), "");
    };
    getCssRulesString = function(stylesheet) {
      var e, rules;
      try {
        if (rules = stylesheet.rules || stylesheet.cssRules) {
          return reduceText(rules, function(rule) {
            return rule.cssText;
          });
        } else {
          return null;
        }
      } catch (error) {
        e = error;
        return null;
      }
    };
    return $Cypress.extend({
      highlightAttr: "data-cypress-el",
      createSnapshot: function($el) {
        var body, bodyStyles, headStyles, htmlAttrs, ref, tmpHtmlEl;
        if ($el != null ? $el.attr : void 0) {
          $el.attr(this.highlightAttr, true);
        }
        body = this.cy.$$("body").clone();
        ref = this.getStyles(), headStyles = ref.headStyles, bodyStyles = ref.bodyStyles;
        this._replaceIframes(body);
        body.find("script,link[rel='stylesheet'],style").remove();
        if ($el != null ? $el.removeAttr : void 0) {
          $el.removeAttr(this.highlightAttr);
        }
        tmpHtmlEl = document.createElement("html");
        htmlAttrs = _.reduce(this.cy.$$("html")[0].attributes, function(memo, attr) {
          if (attr.specified) {
            try {
              tmpHtmlEl.setAttribute(attr.name, attr.value);
              memo[attr.name] = attr.value;
            } catch (error) {}
          }
          return memo;
        }, {});
        return {
          body: body,
          htmlAttrs: htmlAttrs,
          headStyles: headStyles,
          bodyStyles: bodyStyles
        };
      },
      getStyles: function() {
        this._stylesheets = this._indexedStylesheets();
        return {
          headStyles: this._getStylesFor("head"),
          bodyStyles: this._getStylesFor("body")
        };
      },
      _getStylesFor: function(location) {
        return _.map(this.cy.$$(location).find("link[rel='stylesheet'],style"), (function(_this) {
          return function(stylesheet) {
            if (stylesheet.href) {
              return getCssRulesString(_this._stylesheets[stylesheet.href]) || {
                href: stylesheet.href
              };
            } else {
              return _this.cy.$$(stylesheet).text();
            }
          };
        })(this));
      },
      _indexedStylesheets: function() {
        return _.reduce(this.cy["private"]("document").styleSheets, function(memo, stylesheet) {
          memo[stylesheet.href] = stylesheet;
          return memo;
        }, {});
      },
      _replaceIframes: function(body) {
        var $iframes;
        $iframes = body.find("iframe");
        return this.cy.$$("iframe").each((function(_this) {
          return function(idx, iframe) {
            var $iframe, $placeholder, contents, dimensions, e, props, remove;
            $iframe = $(iframe);
            remove = function() {
              return $iframes.eq(idx).remove();
            };
            try {
              if (!$iframe.prop("contentWindow")) {
                return remove();
              }
            } catch (error) {
              e = error;
              return remove();
            }
            props = {
              id: iframe.id,
              "class": iframe.className,
              style: iframe.style.cssText
            };
            dimensions = function(fn) {
              try {
                return $iframe[fn]();
              } catch (error) {
                e = error;
                return 0;
              }
            };
            $placeholder = $("<iframe />", props).css({
              background: "#f8f8f8",
              border: "solid 1px #a3a3a3",
              boxSizing: "border-box",
              padding: "20px",
              width: dimensions("outerWidth"),
              height: dimensions("outerHeight")
            });
            $iframes.eq(idx).replaceWith($placeholder);
            contents = "<style>\n  p { color: #888; font-family: sans-serif; line-height: 1.5; }\n</style>\n<p>&lt;iframe&gt; placeholder for " + iframe.src + "</p>";
            return $placeholder[0].src = "data:text/html;charset=utf-8," + (encodeURI(contents));
          };
        })(this));
      }
    });
  })($Cypress, _, $);

}).call(this);
; 
(function() {
  $Cypress.Utils = (function($Cypress, _) {
    var CYPRESS_OBJECT_NAMESPACE, defaultOptions, quotesRe, tagClosed, tagOpen;
    tagOpen = /\[([a-z\s='"-]+)\]/g;
    tagClosed = /\[\/([a-z]+)\]/g;
    quotesRe = /('|")/g;
    CYPRESS_OBJECT_NAMESPACE = "_cypressObj";
    defaultOptions = {
      delay: 10,
      force: false,
      timeout: null,
      interval: null,
      multiple: false,
      waitOnAnimations: null,
      animationDistanceThreshold: null
    };
    return {
      warning: function(msg) {
        return console.warn("Cypress Warning: " + msg);
      },
      throwErr: function(err, options) {
        var command, onFail;
        if (options == null) {
          options = {};
        }
        if (_.isString(err)) {
          err = this.cypressErr(err);
        }
        onFail = options.onFail;
        if (onFail && !_.isFunction(onFail)) {
          command = onFail;
          onFail = function(err) {
            return command.error(err);
          };
        }
        if (onFail) {
          err.onFail = onFail;
        }
        throw err;
      },
      throwErrByPath: function(errPath, options) {
        var e, err;
        if (options == null) {
          options = {};
        }
        err = (function() {
          try {
            return this.errMessageByPath(errPath, options.args);
          } catch (error) {
            e = error;
            return err = this.internalErr(e);
          }
        }).call(this);
        return this.throwErr(err, options);
      },
      internalErr: function(err) {
        err = new Error(err);
        err.name = "InternalError";
        return err;
      },
      cypressErr: function(err) {
        err = new Error(err);
        err.name = "CypressError";
        return err;
      },
      errMessageByPath: function(errPath, args) {
        var errMessage;
        if (!(errMessage = this.getObjValueByPath($Cypress.ErrorMessages, errPath))) {
          throw new Error("Error message path '" + errPath + "' does not exist");
        }
        if (_.isFunction(errMessage)) {
          return errMessage(args);
        } else {
          return _.reduce(args, function(message, argValue, argKey) {
            return message.replace(new RegExp("\{\{" + argKey + "\}\}", "g"), argValue);
          }, errMessage);
        }
      },
      normalizeObjWithLength: function(obj) {
        if (_(obj).has("length")) {
          obj.Length = obj.length;
          delete obj.length;
        }
        return obj;
      },
      filterOutOptions: function(obj, filter) {
        var whereFilterHasSameKeyButDifferentValue;
        if (filter == null) {
          filter = {};
        }
        _.defaults(filter, defaultOptions);
        this.normalizeObjWithLength(filter);
        whereFilterHasSameKeyButDifferentValue = function(value, key) {
          var upperKey;
          upperKey = _.capitalize(key);
          return (_(filter).has(key) || _(filter).has(upperKey)) && filter[key] !== value;
        };
        obj = _.pick(obj, whereFilterHasSameKeyButDifferentValue);
        if (_.isEmpty(obj)) {
          return void 0;
        } else {
          return obj;
        }
      },
      _stringifyObj: function(obj) {
        var str;
        obj = this.normalizeObjWithLength(obj);
        str = _.reduce(obj, (function(_this) {
          return function(memo, value, key) {
            memo.push(key.toLowerCase() + ": " + _this._stringify(value));
            return memo;
          };
        })(this), []);
        return "{" + str.join(", ") + "}";
      },
      _stringify: function(value) {
        var len;
        switch (false) {
          case !this.hasElement(value):
            return this.stringifyElement(value, "short");
          case !_.isFunction(value):
            return "function(){}";
          case !_.isArray(value):
            len = value.length;
            if (len > 3) {
              return "Array[" + len + "]";
            } else {
              return "[" + _.map(value, _.bind(this._stringify, this)).join(", ") + "]";
            }
            break;
          case !_.isRegExp(value):
            return value.toString();
          case !_.isObject(value):
            len = _.keys(value).length;
            if (len > 2) {
              return "Object{" + len + "}";
            } else {
              return this._stringifyObj(value);
            }
            break;
          case !_.isUndefined(value):
            return void 0;
          default:
            return "" + value;
        }
      },
      stringify: function(values) {
        values = [].concat(values);
        return _.chain(values).map(_.bind(this._stringify, this)).without(void 0).value().join(", ");
      },
      stringifyArg: function(arg) {
        switch (false) {
          case !(_.isString(arg) || _.isNumber(arg) || _.isBoolean(arg)):
            return JSON.stringify(arg);
          case !_.isNull(arg):
            return "null";
          case !_.isUndefined(arg):
            return "undefined";
          default:
            return this._stringify(arg);
        }
      },
      hasWindow: function(obj) {
        try {
          return !!(obj && $.isWindow(obj[0])) || $.isWindow(obj);
        } catch (error) {
          return false;
        }
      },
      hasElement: function(obj) {
        try {
          return !!(obj && obj[0] && _.isElement(obj[0])) || _.isElement(obj);
        } catch (error) {
          return false;
        }
      },
      hasDocument: function(obj) {
        try {
          return !!((obj && obj.nodeType === 9) || (obj && obj[0] && obj[0].nodeType === 9));
        } catch (error) {
          return false;
        }
      },
      isDescendent: function($el1, $el2) {
        if (!$el2) {
          return false;
        }
        return !!(($el1.get(0) === $el2.get(0)) || $el1.has($el2).length);
      },
      getDomElements: function($el) {
        if (!($el != null ? $el.length : void 0)) {
          return;
        }
        if ($el.length === 1) {
          return $el.get(0);
        } else {
          return _.reduce($el, function(memo, el) {
            memo.push(el);
            return memo;
          }, []);
        }
      },
      stringifyElement: function(el, form) {
        var $el, children, id, klass, str, text;
        if (form == null) {
          form = "long";
        }
        if (this.hasWindow(el)) {
          return "<window>";
        }
        if (this.hasDocument(el)) {
          return "<document>";
        }
        $el = _.isElement(el) ? $(el) : el;
        switch (form) {
          case "long":
            text = _.chain($el.text()).clean().truncate(10).value();
            children = $el.children().length;
            str = $el.clone().empty().prop("outerHTML");
            switch (false) {
              case !children:
                return str.replace("></", ">...</");
              case !text:
                return str.replace("></", ">" + text + "</");
              default:
                return str;
            }
            break;
          case "short":
            str = $el.prop("tagName").toLowerCase();
            if (id = $el.prop("id")) {
              str += "#" + id;
            }
            if (klass = $el.attr("class")) {
              str += "." + klass.split(/\s+/).join(".");
            }
            if ($el.length > 1) {
              return "[ <" + str + ">, " + ($el.length - 1) + " more... ]";
            } else {
              return "<" + str + ">";
            }
        }
      },
      plural: function(obj, plural, singular) {
        obj = _.isNumber(obj) ? obj : obj.length;
        if (obj > 1) {
          return plural;
        } else {
          return singular;
        }
      },
      convertHtmlTags: function(html) {
        return html.replace(tagOpen, "<$1>").replace(tagClosed, "</$1>");
      },
      isInstanceOf: function(instance, constructor) {
        var e;
        try {
          return instance instanceof constructor;
        } catch (error) {
          e = error;
          return false;
        }
      },
      escapeQuotes: function(text) {
        return ("" + text).replace(quotesRe, "\\$1");
      },
      getCypressNamespace: function(obj) {
        return obj && obj[CYPRESS_OBJECT_NAMESPACE];
      },
      setCypressNamespace: function(obj, original) {
        return obj[CYPRESS_OBJECT_NAMESPACE] = original;
      },
      getObjValueByPath: function(obj, keyPath) {
        var i, key, keys, len1, val;
        if (!_.isObject(obj)) {
          throw new Error("The first parameter to $Cypress.Utils.getObjValueByPath() must be an object");
        }
        if (!_.isString(keyPath)) {
          throw new Error("The second parameter to $Cypress.Utils.getObjValueByPath() must be a string");
        }
        keys = keyPath.split('.');
        val = obj;
        for (i = 0, len1 = keys.length; i < len1; i++) {
          key = keys[i];
          val = val[key];
          if (!val) {
            break;
          }
        }
        return val;
      }
    };
  })($Cypress, _);

}).call(this);
; 
(function() {
  var indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };

  (function($Cypress, _) {
    var aliasDisplayRe, aliasRe;
    aliasRe = /^@.+/;
    aliasDisplayRe = /^([@]+)/;
    return $Cypress.Cy.extend({
      assign: function(str, obj) {
        return this["private"]("runnable").ctx[str] = obj;
      },
      getNextAlias: function() {
        var next;
        next = this.prop("current").get("next");
        if (next && next.get("name") === "as") {
          return next.get("args")[0];
        }
      },
      getAlias: function(name, cmd, log) {
        var alias, aliases, ref;
        aliases = (ref = this.prop("aliases")) != null ? ref : {};
        if (!aliasRe.test(name)) {
          return;
        }
        if (!(alias = aliases[name.slice(1)])) {
          this.aliasNotFoundFor(name, cmd, log);
        }
        return alias;
      },
      _aliasDisplayName: function(name) {
        return name.replace(aliasDisplayRe, "");
      },
      getAvailableAliases: function() {
        var aliases;
        if (!(aliases = this.prop("aliases"))) {
          return [];
        }
        return _(aliases).keys();
      },
      aliasNotFoundFor: function(name, cmd, log) {
        var availableAliases, displayName, errPath;
        availableAliases = this.getAvailableAliases();
        if ((!aliasRe.test(name)) && (indexOf.call(availableAliases, name) >= 0)) {
          displayName = this._aliasDisplayName(name);
          $Cypress.Utils.throwErrByPath("alias.invalid", {
            onFail: log,
            args: {
              name: name,
              displayName: displayName
            }
          });
        }
        if (cmd == null) {
          cmd = log && log.get("name") || this.prop("current").get("name");
        }
        displayName = this._aliasDisplayName(name);
        errPath = availableAliases.length ? "alias.not_registered_with_available" : "alias.not_registered_without_available";
        return $Cypress.Utils.throwErrByPath(errPath, {
          onFail: log,
          args: {
            cmd: cmd,
            displayName: displayName,
            availableAliases: availableAliases.join(", ")
          }
        });
      },
      _getCommandsUntilFirstParentOrValidSubject: function(command, memo) {
        if (memo == null) {
          memo = [];
        }
        if (!command) {
          return null;
        }
        memo.unshift(command);
        if (command.get("type") === "parent" || this._contains(command.get("subject"))) {
          return memo;
        }
        return this._getCommandsUntilFirstParentOrValidSubject(command.get("prev"), memo);
      },
      _replayFrom: function(current) {
        var chainerId, commands, initialCommand, insert;
        chainerId = this.prop("chainerId");
        insert = (function(_this) {
          return function(commands) {
            return _.each(commands, function(cmd) {
              cmd.set("chainerId", chainerId);
              return _this.insertCommand(cmd.clone());
            });
          };
        })(this);
        commands = this._getCommandsUntilFirstParentOrValidSubject(current);
        if (commands) {
          initialCommand = commands.shift();
          return insert(_.reduce(commands, function(memo, command, index) {
            var push, ref;
            push = function() {
              return memo.push(command);
            };
            switch (false) {
              case command.get("type") !== "assertion":
                if (ref = command.get("prev"), indexOf.call(memo, ref) >= 0) {
                  push();
                }
                break;
              case command.get("subject") === initialCommand.get("subject"):
                initialCommand = command;
                push();
            }
            return memo;
          }, [initialCommand]));
        }
      }
    });
  })($Cypress, _);

}).call(this);
; 
(function() {
  (function($Cypress, _) {
    return $Cypress.Cy.extend({
      normalizeCoords: function(x, y, xPosition, yPosition) {
        var coords;
        if (xPosition == null) {
          xPosition = "center";
        }
        if (yPosition == null) {
          yPosition = "center";
        }
        coords = {};
        switch (xPosition) {
          case "center":
            coords.x = Math.floor(x);
            break;
          case "left":
            coords.x = Math.ceil(x);
            break;
          case "right":
            coords.x = Math.floor(x) - 1;
        }
        switch (yPosition) {
          case "center":
            coords.y = Math.floor(y);
            break;
          case "top":
            coords.y = Math.ceil(y);
            break;
          case "bottom":
            coords.y = Math.floor(y) - 1;
        }
        return coords;
      },
      getElementAtCoordinates: function(x, y) {
        var el, scrollX, scrollY, win;
        win = this["private"]("window");
        scrollX = x - win.pageXOffset;
        scrollY = y - win.pageYOffset;
        el = this["private"]("document").elementFromPoint(scrollX, scrollY);
        if (el) {
          el = $(el);
        }
        return el;
      },
      getBoundingClientRect: function($el) {
        var height, offset, width, win;
        if (Element.prototype.getBoundingClientRect) {
          win = this["private"]("window");
          offset = $el.get(0).getBoundingClientRect();
          offset = _(offset).pick("top", "left", "width", "height");
          offset.top += win.pageYOffset;
          offset.left += win.pageXOffset;
          return width = offset.width, height = offset.height, offset;
        } else {
          offset = $el.offset();
          width = $el.outerWidth();
          return height = $el.outerHeight();
        }
      },
      getCenterCoordinates: function(rect) {
        var x, y;
        x = rect.left + rect.width / 2;
        y = rect.top + rect.height / 2;
        return this.normalizeCoords(x, y, "center", "center");
      },
      getTopLeftCoordinates: function(rect) {
        var x, y;
        x = rect.left;
        y = rect.top;
        return this.normalizeCoords(x, y, "left", "top");
      },
      getTopRightCoordinates: function(rect) {
        var x, y;
        x = rect.left + rect.width;
        y = rect.top;
        return this.normalizeCoords(x, y, "right", "top");
      },
      getBottomLeftCoordinates: function(rect) {
        var x, y;
        x = rect.left;
        y = rect.top + rect.height;
        return this.normalizeCoords(x, y, "left", "bottom");
      },
      getBottomRightCoordinates: function(rect) {
        var x, y;
        x = rect.left + rect.width;
        y = rect.top + rect.height;
        return this.normalizeCoords(x, y, "right", "bottom");
      },
      getRelativeCoordinates: function($el, x, y) {
        var rect;
        rect = this.getBoundingClientRect($el);
        x = rect.left + x;
        y = rect.top + y;
        return this.normalizeCoords(x, y);
      },
      getCoordinates: function($el, position) {
        var rect;
        if (position == null) {
          position = "center";
        }
        rect = this.getBoundingClientRect($el);
        switch (position) {
          case "center":
            return this.getCenterCoordinates(rect);
          case "topLeft":
            return this.getTopLeftCoordinates(rect);
          case "topRight":
            return this.getTopRightCoordinates(rect);
          case "bottomLeft":
            return this.getBottomLeftCoordinates(rect);
          case "bottomRight":
            return this.getBottomRightCoordinates(rect);
          default:
            return $Cypress.Utils.throwErrByPath("dom.invalid_position_argument", {
              args: {
                position: position
              }
            });
        }
      }
    });
  })($Cypress, _);

}).call(this);
; 
(function() {
  (function($Cypress, _, $) {
    var commandOptions, returnFalse;
    commandOptions = ["exist", "exists", "visible", "length"];
    returnFalse = function() {
      return false;
    };
    return $Cypress.Cy.extend({
      ensureSubject: function() {
        var cmd, subject;
        subject = this.prop("subject");
        if (subject == null) {
          cmd = this.prop("current").get("name");
          $Cypress.Utils.throwErrByPath("miscellaneous.no_subject", {
            args: {
              subject: subject,
              cmd: cmd
            }
          });
        }
        return subject;
      },
      ensureParent: function() {
        var current;
        current = this.prop("current");
        if (!current.get("prev")) {
          return $Cypress.Utils.throwErrByPath("miscellaneous.orphan", {
            args: {
              cmd: current.get("name")
            }
          });
        }
      },
      ensureElementIsNotAnimating: function($el, coords, threshold) {
        var cmd, distance, lastTwo, node, point1, point2, waitForAnimations;
        if (coords == null) {
          coords = [];
        }
        waitForAnimations = this.Cypress.config("waitForAnimations");
        if (waitForAnimations === false) {
          return;
        }
        if (threshold == null) {
          threshold = this.Cypress.config("animationDistanceThreshold");
        }
        lastTwo = coords.slice(-2);
        if (lastTwo.length !== 2) {
          $Cypress.Utils.throwErrByPath("dom.animation_check_failed");
        }
        point1 = lastTwo[0], point2 = lastTwo[1];
        distance = function() {
          var deltaX, deltaY;
          deltaX = point1.x - point2.x;
          deltaY = point1.y - point2.y;
          return Math.sqrt(deltaX * deltaX + deltaY * deltaY);
        };
        if (distance() > threshold) {
          cmd = this.prop("current").get("name");
          node = $Cypress.Utils.stringifyElement($el);
          return $Cypress.Utils.throwErrByPath("dom.animating", {
            args: {
              cmd: cmd,
              node: node
            }
          });
        }
      },
      ensureActionability: function(subject, onFail) {
        var cmd, node;
        if (subject == null) {
          subject = this.ensureSubject();
        }
        cmd = this.prop("current").get("name");
        if (subject.prop("disabled")) {
          node = $Cypress.Utils.stringifyElement(subject);
          return $Cypress.Utils.throwErrByPath("dom.disabled", {
            onFail: onFail,
            args: {
              cmd: cmd,
              node: node
            }
          });
        }
      },
      ensureVisibility: function(subject, onFail) {
        var cmd, node, reason;
        if (subject == null) {
          subject = this.ensureSubject();
        }
        cmd = this.prop("current").get("name");
        if (!(subject.length === subject.filter(":visible").length)) {
          reason = $Cypress.Dom.getReasonElIsHidden(subject);
          node = $Cypress.Utils.stringifyElement(subject);
          return $Cypress.Utils.throwErrByPath("dom.not_visible", {
            onFail: onFail,
            args: {
              cmd: cmd,
              node: node,
              reason: reason
            }
          });
        }
      },
      ensureDom: function(subject, cmd, log) {
        var isWindow, node;
        if (subject == null) {
          subject = this.ensureSubject();
        }
        if (cmd == null) {
          cmd = this.prop("current").get("name");
        }
        isWindow = $Cypress.Utils.hasWindow(subject);
        if (!(isWindow || $Cypress.Utils.hasElement(subject))) {
          console.warn("Subject is currently: ", subject);
          $Cypress.Utils.throwErrByPath("dom.non_dom", {
            onFail: log,
            args: {
              cmd: cmd
            }
          });
        }
        if (!(isWindow || this._contains(subject))) {
          node = $Cypress.Utils.stringifyElement(subject);
          $Cypress.Utils.throwErrByPath("dom.detached", {
            onFail: log,
            args: {
              cmd: cmd,
              node: node
            }
          });
        }
        return subject;
      },
      ensureExistence: function(subject) {
        var cleanup, err;
        returnFalse = (function(_this) {
          return function() {
            cleanup();
            return false;
          };
        })(this);
        cleanup = (function(_this) {
          return function() {
            return _this.prop("onBeforeLog", null);
          };
        })(this);
        this.prop("onBeforeLog", returnFalse);
        try {
          return $Cypress.Chai.expect(subject).to.exist;
        } catch (error) {
          err = error;
          cleanup();
          throw err;
        }
      },
      ensureElExistence: function($el) {
        if ($el && $el.length) {
          return;
        }
        return this.ensureExistence($el);
      },
      ensureNoCommandOptions: function(options) {
        return _.each(commandOptions, (function(_this) {
          return function(opt) {
            var assertion;
            if (_.has(options, opt)) {
              assertion = (function() {
                switch (opt) {
                  case "exist":
                  case "exists":
                    if (options[opt]) {
                      return "exist";
                    } else {
                      return "not.exist";
                    }
                    break;
                  case "visible":
                    if (options[opt]) {
                      return "be.visible";
                    } else {
                      return "not.be.visible";
                    }
                    break;
                  case "length":
                    return "have.length', '" + options[opt];
                }
              })();
              return $Cypress.Utils.throwErrByPath("miscellaneous.deprecated", {
                args: {
                  assertion: assertion,
                  opt: opt,
                  value: options[opt]
                }
              });
            }
          };
        })(this));
      },
      ensureDescendents: function($el1, $el2, onFail) {
        var cmd, node;
        cmd = this.prop("current").get("name");
        if (!$Cypress.Utils.isDescendent($el1, $el2)) {
          if ($el2) {
            node = $Cypress.Utils.stringifyElement($el2);
            return $Cypress.Utils.throwErrByPath("dom.covered", {
              onFail: onFail,
              args: {
                cmd: cmd,
                node: node
              }
            });
          } else {
            node = $Cypress.Utils.stringifyElement($el1);
            return $Cypress.Utils.throwErrByPath("dom.hidden", {
              onFail: onFail,
              args: {
                cmd: cmd,
                node: node
              }
            });
          }
        }
      }
    });
  })($Cypress, _, $);

}).call(this);
; 
(function() {
  (function($Cypress, _) {
    return $Cypress.Cy.extend({
      commandErr: function(err) {
        var current;
        current = this.prop("current");
        return this.Cypress.Log.command({
          end: true,
          snapshot: true,
          error: err,
          consoleProps: function() {
            var obj, prev, ret;
            obj = {};
            if (current.get("type") !== "parent" && (prev = current.get("prev"))) {
              ret = $Cypress.Utils.hasElement(prev.get("subject")) ? $Cypress.Utils.getDomElements(prev.get("subject")) : prev.get("subject");
              obj["Applied To"] = ret;
              return obj;
            }
          }
        });
      },
      checkTestErr: function(test) {
        var err;
        if (err = test.err && !this.prop("err")) {
          this.prop("err", err);
        }
        return this;
      },
      endedEarlyErr: function(index) {
        var commands, err;
        if (this.prop("err")) {
          return;
        }
        commands = this.commands.slice(index).reduce((function(_this) {
          return function(memo, cmd) {
            if (_this.isCommandFromThenable(cmd) || _this.isCommandFromMocha(cmd)) {
              return memo;
            } else {
              memo.push("- " + cmd.stringify());
              return memo;
            }
          };
        })(this), []);
        err = $Cypress.Utils.cypressErr($Cypress.Utils.errMessageByPath("miscellaneous.dangling_commands", {
          numCommands: commands.length,
          commands: commands.join('\n')
        }));
        err.onFail = function() {};
        return this.fail(err);
      },
      fail: function(err) {
        var current, ref, runnable;
        if ((ref = this.prop("promise")) != null) {
          ref.cancel();
        }
        current = this.prop("current");
        if (err.onFail) {
          err.onFail.call(this, err);
          delete err.onFail;
        } else {
          this.commandErr(err);
        }
        runnable = this["private"]("runnable");
        this.prop("err", err);
        this.Cypress.trigger("fail", err, runnable);
        return this.trigger("fail", err, runnable);
      }
    });
  })($Cypress, _);

}).call(this);
; 
(function() {
  (function($Cypress, $) {
    var remoteJQueryisNotSameAsGlobal;
    remoteJQueryisNotSameAsGlobal = function(remoteJQuery) {
      return remoteJQuery && (remoteJQuery !== $);
    };
    return $Cypress.Cy.extend({
      getRemotejQueryInstance: function(subject) {
        var remoteJQuery, remoteSubject;
        remoteJQuery = this._getRemoteJQuery();
        if ($Cypress.Utils.hasElement(subject) && remoteJQueryisNotSameAsGlobal(remoteJQuery)) {
          remoteSubject = remoteJQuery(subject);
          $Cypress.Utils.setCypressNamespace(remoteSubject, subject);
          return remoteSubject;
        }
      },
      _getRemoteJQuery: function() {
        var opt;
        if (opt = this.Cypress.option("jQuery")) {
          return opt;
        } else {
          return this["private"]("window").$;
        }
      }
    });
  })($Cypress, $);

}).call(this);
; 
(function() {
  (function($Cypress, _) {
    var previousWin;
    previousWin = null;
    return $Cypress.Cy.extend({
      offWindowListeners: function() {
        if (previousWin) {
          previousWin.off();
          return previousWin = null;
        }
      },
      offIframeListeners: function($remoteIframe) {
        return $remoteIframe != null ? $remoteIframe.off() : void 0;
      },
      bindWindowListeners: function(contentWindow) {
        var win;
        this.offWindowListeners();
        if (contentWindow.location.href === "about:blank") {
          return;
        }
        win = $(contentWindow);
        previousWin = win;
        win.on("submit", (function(_this) {
          return function(e) {
            if (e.isDefaultPrevented()) {
              return;
            }
            _this.submitting(e);
            return _this.isReady(false, "submit");
          };
        })(this));
        win.on("beforeunload", (function(_this) {
          return function(e) {
            if (e.isDefaultPrevented() || _this._eventHasReturnValue(e)) {
              return;
            }
            _this.isReady(false, "beforeunload");
            _this.loading();
            _this.Cypress.Cookies.setInitial();
            _this.pageLoading();
            _this.offWindowListeners();
            _this.Cypress.trigger("before:unload");
            return void 0;
          };
        })(this));
        win.on("hashchange", (function(_this) {
          return function() {
            return _this.urlChanged(null, {
              by: "hashchange"
            });
          };
        })(this));
        win.get(0).alert = function(str) {
          return console.info("Automatically resolving alert: ", str);
        };
        return win.get(0).confirm = function(message) {
          console.info("Confirming 'true' to: ", message);
          return true;
        };
      }
    });
  })($Cypress, _);

}).call(this);
; 
(function() {
  (function($Cypress, _) {
    return $Cypress.Cy.extend({
      prop: function(key, val) {
        if (arguments.length === 1) {
          return this.props[key];
        } else {
          return this.props[key] = val;
        }
      },
      "private": function(key, val) {
        if (arguments.length === 1) {
          return this.privates[key];
        } else {
          return this.privates[key] = val;
        }
      }
    });
  })($Cypress, _);

}).call(this);
; 
(function() {
  (function($Cypress, _, Promise) {
    return $Cypress.Cy.extend({
      _retry: function(fn, options, log) {
        var assertions, current, getErrMessage, interval, ref, ref1, ref2, runnableTimeout, total;
        if (!options._runnableTimeout) {
          runnableTimeout = (ref = options.timeout) != null ? ref : this._timeout();
          this._clearTimeout();
        }
        current = this.prop("current");
        if (log == null) {
          log = (ref1 = options._log) != null ? ref1 : current != null ? current.getLastLog() : void 0;
        }
        _.defaults(options, {
          _runnableTimeout: runnableTimeout,
          _interval: 16,
          _retries: 0,
          _start: new Date,
          _name: current != null ? current.get("name") : void 0
        });
        interval = (ref2 = options.interval) != null ? ref2 : options._interval;
        options.total = total = new Date - options._start;
        options._retries += 1;
        if (total + interval >= options._runnableTimeout) {
          if (log) {
            log.snapshot();
          }
          if (assertions = options.assertions) {
            this.finishAssertions(assertions);
          }
          getErrMessage = function(err) {
            switch (false) {
              case !(err && err.displayMessage):
                return err.displayMessage;
              case !(err && err.message):
                return err.message;
              default:
                return err;
            }
          };
          $Cypress.Utils.throwErrByPath("miscellaneous.retry_timed_out", {
            onFail: options.onFail || log,
            args: {
              error: getErrMessage(options.error)
            }
          });
        }
        return Promise.delay(interval).cancellable().then((function(_this) {
          return function() {
            if (options.silent !== true) {
              _this.trigger("retry", options);
            }
            return fn.call(_this);
          };
        })(this));
      }
    });
  })($Cypress, _, Promise);

}).call(this);
; 
(function() {
  (function($Cypress, _) {
    return $Cypress.Cy.extend({
      _timeout: function(ms, delta) {
        var runnable;
        if (delta == null) {
          delta = false;
        }
        runnable = this["private"]("runnable");
        if (!runnable) {
          $Cypress.Utils.throwErrByPath("outside_test_with_cmd", {
            args: {
              cmd: "timeout"
            }
          });
        }
        if (ms) {
          ms = delta ? runnable.timeout() + ms : ms;
          runnable.timeout(ms);
          return this;
        } else {
          return runnable.timeout();
        }
      },
      _clearTimeout: function() {
        var runnable;
        runnable = this["private"]("runnable");
        if (!runnable) {
          $Cypress.Utils.throwErrByPath("outside_test_with_cmd", {
            args: {
              cmd: "clearTimeout"
            }
          });
        }
        runnable.clearTimeout();
        return this;
      }
    });
  })($Cypress, _);

}).call(this);
; 
(function() {
  (function($Cypress, _) {
    return $Cypress.Cy.extend({
      urlChanged: function(url, options) {
        var previousUrl, ref, urls;
        if (options == null) {
          options = {};
        }
        if (url == null) {
          url = this._getLocation("href");
        }
        if (_.isEmpty(url)) {
          return;
        }
        urls = (ref = this.prop("urls")) != null ? ref : [];
        previousUrl = _.last(urls);
        urls.push(url);
        this.prop("urls", urls);
        this["private"]("url", url);
        _.defaults(options, {
          log: true,
          by: null,
          args: null
        });
        if (options.log && (url !== previousUrl)) {
          Cypress.Log.command({
            name: "new url",
            message: url,
            event: true,
            type: "parent",
            end: true,
            snapshot: true,
            consoleProps: function() {
              var obj;
              obj = {
                Event: "url updated",
                "New Url": url
              };
              if (options.by) {
                obj["Url Updated By"] = options.by;
              }
              obj.args = options.args;
              return obj;
            }
          });
        }
        return this.Cypress.trigger("url:changed", url);
      },
      pageLoading: function(bool) {
        if (bool == null) {
          bool = true;
        }
        return this.Cypress.trigger("page:loading", bool);
      }
    });
  })($Cypress, _);

}).call(this);
; 
(function() {
  var indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };

  $Cypress.register("Actions", function(Cypress, _, $, Promise) {
    var delay, dispatchPrimedChangeEvents, focusable, getFirstCommandOrNull, inputEvents, textLike;
    textLike = "textarea,:text,[contenteditable],[type=password],[type=email],[type=number],[type=date],[type=week],[type=month],[type=time],[type=datetime],[type=datetime-local],[type=search],[type=url],[type=tel]";
    focusable = "a[href],link[href],button,input,select,textarea,[tabindex],[contenteditable]";
    inputEvents = "textInput input".split(" ");
    delay = 50;
    Cypress.on("test:before:run", function() {
      return Cypress.Keyboard.resetModifiers(this["private"]("document"), this["private"]("window"));
    });
    dispatchPrimedChangeEvents = function() {
      var changeEvent;
      if (changeEvent = this.prop("changeEvent")) {
        return changeEvent.call(this);
      }
    };
    getFirstCommandOrNull = (function(_this) {
      return function(commands) {
        if (commands.length !== 1) {
          return null;
        }
        return commands[0];
      };
    })(this);
    Cypress.addChildCommand({
      submit: function(subject, options) {
        var dispatched, form, node, num, submit, word;
        if (options == null) {
          options = {};
        }
        _.defaults(options, {
          log: true,
          $el: subject
        });
        this.ensureDom(options.$el);
        form = options.$el.get(0);
        if (options.log) {
          options._log = Cypress.Log.command({
            $el: options.$el,
            consoleProps: function() {
              return {
                "Applied To": $Cypress.Utils.getDomElements(options.$el),
                Elements: options.$el.length
              };
            }
          });
          options._log.snapshot("before", {
            next: "after"
          });
        }
        if (!options.$el.is("form")) {
          node = Cypress.Utils.stringifyElement(options.$el);
          word = Cypress.Utils.plural(options.$el, "contains", "is");
          $Cypress.Utils.throwErrByPath("submit.not_on_form", {
            onFail: options._log,
            args: {
              node: node,
              word: word
            }
          });
        }
        if ((num = options.$el.length) && num > 1) {
          $Cypress.Utils.throwErrByPath("submit.multiple_forms", {
            onFail: options._log,
            args: {
              num: num
            }
          });
        }
        submit = new Event("submit", {
          bubbles: true,
          cancelable: true
        });
        !!(dispatched = form.dispatchEvent(submit));
        if (dispatched) {
          form.submit();
        }
        this._timeout(delay, true);
        return Promise.delay(delay).then((function(_this) {
          return function() {
            var verifyAssertions;
            return (verifyAssertions = function() {
              return _this.verifyUpcomingAssertions(options.$el, options, {
                onRetry: verifyAssertions
              });
            })();
          };
        })(this));
      },
      fill: function(subject, obj, options) {
        if (options == null) {
          options = {};
        }
        if (!_.isObject(obj)) {
          return $Cypress.Utils.throwErrByPath("fill.invalid_1st_arg");
        }
      },
      check: function(subject, values, options) {
        return this._check_or_uncheck("check", subject, values, options);
      },
      uncheck: function(subject, values, options) {
        return this._check_or_uncheck("uncheck", subject, values, options);
      },
      focus: function(subject, options) {
        var cleanup, hasFocused, node, num, promise, timeout;
        if (options == null) {
          options = {};
        }
        _.defaults(options, {
          $el: subject,
          error: true,
          log: true,
          verify: true
        });
        this.ensureDom(options.$el, "focus");
        if (options.log) {
          options._log = Cypress.Log.command({
            $el: options.$el,
            consoleProps: function() {
              return {
                "Applied To": $Cypress.Utils.getDomElements(options.$el)
              };
            }
          });
        }
        if (!(options.$el.is(focusable) || $Cypress.Utils.hasWindow(options.$el))) {
          if (options.error === false) {
            return;
          }
          node = Cypress.Utils.stringifyElement(options.$el);
          $Cypress.Utils.throwErrByPath("focus.invalid_element", {
            onFail: options._log,
            args: {
              node: node
            }
          });
        }
        if ((num = options.$el.length) && num > 1) {
          if (options.error === false) {
            return;
          }
          $Cypress.Utils.throwErrByPath("focus.multiple_elements", {
            onFail: options._log,
            args: {
              num: num
            }
          });
        }
        timeout = this._timeout() * .90;
        cleanup = null;
        hasFocused = false;
        promise = new Promise((function(_this) {
          return function(resolve, reject) {
            var focused;
            cleanup = function() {
              return options.$el.off("focus", focused);
            };
            focused = function() {
              var forceFocusedEl;
              hasFocused = true;
              forceFocusedEl = _this.prop("forceFocusedEl");
              if (forceFocusedEl !== options.$el.get(0)) {
                _this.prop("forceFocusedEl", null);
              }
              cleanup();
              _this._timeout(delay, true);
              return Promise.delay(delay).then(resolve);
            };
            options.$el.on("focus", focused);
            options.$el.get(0).focus();
            return _this.defer(function() {
              var simulate;
              if (hasFocused) {
                return;
              }
              simulate = function() {
                var focusEvt, focusinEvt;
                _this.prop("forceFocusedEl", options.$el.get(0));
                focusinEvt = new FocusEvent("focusin", {
                  bubbles: true,
                  view: _this["private"]("window"),
                  relatedTarget: null
                });
                focusEvt = new FocusEvent("focus", {
                  view: _this["private"]("window"),
                  relatedTarget: null
                });
                options.$el.get(0).dispatchEvent(focusEvt);
                return options.$el.get(0).dispatchEvent(focusinEvt);
              };
              return _this.execute("focused", {
                log: false,
                verify: false
              }).then(function($focused) {
                if ($focused && $focused.get(0) !== options.$el.get(0)) {
                  return _this.execute("blur", {
                    $el: $focused,
                    error: false,
                    verify: false,
                    log: false
                  }).then(function() {
                    return simulate();
                  });
                } else {
                  return simulate();
                }
              })["catch"](function(err) {
                return reject(err);
              });
            });
          };
        })(this));
        return promise.timeout(timeout)["catch"](Promise.TimeoutError, (function(_this) {
          return function(err) {
            cleanup();
            if (options.error === false) {
              return;
            }
            return $Cypress.Utils.throwErrByPath("focus.timed_out", {
              onFail: options._log
            });
          };
        })(this)).then((function(_this) {
          return function() {
            var verifyAssertions;
            if (options.verify === false) {
              return options.$el;
            }
            return (verifyAssertions = function() {
              return _this.verifyUpcomingAssertions(options.$el, options, {
                onRetry: verifyAssertions
              });
            })();
          };
        })(this));
      },
      blur: function(subject, options) {
        var deltaOptions, num;
        if (options == null) {
          options = {};
        }
        _.defaults(options, {
          $el: subject,
          error: true,
          log: true,
          verify: true,
          force: false
        });
        if (options.log) {
          deltaOptions = Cypress.Utils.filterOutOptions(options);
          options._log = Cypress.Log.command({
            $el: options.$el,
            message: deltaOptions,
            consoleProps: function() {
              return {
                "Applied To": $Cypress.Utils.getDomElements(options.$el)
              };
            }
          });
        }
        this.ensureDom(options.$el, "blur", options._log);
        if ((num = options.$el.length) && num > 1) {
          if (options.error === false) {
            return;
          }
          $Cypress.Utils.throwErrByPath("blur.multiple_elements", {
            onFail: options._log,
            args: {
              num: num
            }
          });
        }
        return this.execute("focused", {
          log: false,
          verify: false
        }).then((function(_this) {
          return function($focused) {
            var cleanup, hasBlurred, node, promise, timeout;
            if (options.force !== true && !$focused) {
              if (options.error === false) {
                return;
              }
              $Cypress.Utils.throwErrByPath("blur.no_focused_element", {
                onFail: options._log
              });
            }
            if (options.force !== true && options.$el.get(0) !== $focused.get(0)) {
              if (options.error === false) {
                return;
              }
              node = Cypress.Utils.stringifyElement($focused);
              $Cypress.Utils.throwErrByPath("blur.wrong_focused_element", {
                onFail: options._log,
                args: {
                  node: node
                }
              });
            }
            timeout = _this._timeout() * .90;
            cleanup = null;
            hasBlurred = false;
            promise = new Promise(function(resolve) {
              var blurred;
              cleanup = function() {
                return options.$el.off("blur", blurred);
              };
              blurred = function() {
                var blacklistFocusedEl;
                hasBlurred = true;
                blacklistFocusedEl = _this.prop("blacklistFocusedEl");
                if (blacklistFocusedEl !== options.$el.get(0)) {
                  _this.prop("blacklistFocusedEl", null);
                }
                cleanup();
                _this._timeout(delay, true);
                return Promise.delay(delay).then(resolve);
              };
              options.$el.on("blur", blurred);
              dispatchPrimedChangeEvents.call(_this);
              options.$el.get(0).blur();
              return _this.defer(function() {
                var blurEvt, focusoutEvt;
                if (hasBlurred) {
                  return;
                }
                _this.prop("blacklistFocusedEl", options.$el.get(0));
                focusoutEvt = new FocusEvent("focusout", {
                  bubbles: true,
                  cancelable: false,
                  view: _this["private"]("window"),
                  relatedTarget: null
                });
                blurEvt = new FocusEvent("blur", {
                  bubble: false,
                  cancelable: false,
                  view: _this["private"]("window"),
                  relatedTarget: null
                });
                options.$el.get(0).dispatchEvent(blurEvt);
                return options.$el.get(0).dispatchEvent(focusoutEvt);
              });
            });
            return promise.timeout(timeout)["catch"](Promise.TimeoutError, function(err) {
              cleanup();
              if (options.error === false) {
                return;
              }
              return $Cypress.Utils.throwErrByPath("blur.timed_out", {
                onFail: command
              });
            }).then(function() {
              var verifyAssertions;
              if (options.verify === false) {
                return options.$el;
              }
              return (verifyAssertions = function() {
                return _this.verifyUpcomingAssertions(options.$el, options, {
                  onRetry: verifyAssertions
                });
              })();
            });
          };
        })(this));
      },
      dblclick: function(subject, options) {
        var dblclick, dblclicks;
        if (options == null) {
          options = {};
        }
        _.defaults(options, {
          log: true
        });
        this.ensureDom(subject);
        dblclicks = [];
        dblclick = (function(_this) {
          return function(el, index) {
            var $el, log, p;
            $el = $(el);
            _this._timeout(delay, true);
            if (options.log) {
              log = Cypress.Log.command({
                $el: $el,
                consoleProps: function() {
                  return {
                    "Applied To": $Cypress.Utils.getDomElements($el),
                    "Elements": $el.length
                  };
                }
              });
            }
            _this.ensureVisibility($el, log);
            p = _this.execute("focus", {
              $el: $el,
              error: false,
              verify: false,
              log: false
            }).then(function() {
              var event;
              event = new MouseEvent("dblclick", {
                bubbles: true,
                cancelable: true
              });
              el.dispatchEvent(event);
              return null;
            }).delay(delay).cancellable();
            dblclicks.push(p);
            return p;
          };
        })(this);
        return Promise.resolve(subject.toArray()).each(dblclick).cancellable()["return"](subject)["catch"](Promise.CancellationError, function(err) {
          _(dblclicks).invoke("cancel");
          throw err;
        });
      },
      hover: function(args) {
        return $Cypress.Utils.throwErrByPath("hover.not_implemented");
      },
      click: function(subject, positionOrX, y, options) {
        var click, clicks, position, win, x;
        if (options == null) {
          options = {};
        }
        switch (false) {
          case !_.isObject(positionOrX):
            options = positionOrX;
            position = null;
            break;
          case !_.isObject(y):
            options = y;
            position = positionOrX;
            y = null;
            x = null;
            break;
          case !_.all([positionOrX, y], _.isFinite):
            position = null;
            x = positionOrX;
            break;
          case !_.isString(positionOrX):
            position = positionOrX;
        }
        _.defaults(options, {
          $el: subject,
          log: true,
          verify: true,
          force: false,
          multiple: false,
          position: position,
          x: x,
          y: y,
          errorOnSelect: true
        });
        this.ensureDom(options.$el);
        if (options.multiple === false && options.$el.length > 1) {
          $Cypress.Utils.throwErrByPath("click.multiple_elements", {
            args: {
              num: options.$el.length
            }
          });
        }
        win = this["private"]("window");
        clicks = [];
        click = (function(_this) {
          return function(el, index) {
            var $el, $previouslyFocusedEl, afterMouseDown, deltaOptions, domEvents, findElByCoordinates, getFirstFocusableEl, isAttached, p, shouldFireFocusEvent;
            $el = $(el);
            domEvents = {};
            $previouslyFocusedEl = null;
            if (options.log) {
              deltaOptions = Cypress.Utils.filterOutOptions(options);
              options._log = Cypress.Log.command({
                message: deltaOptions,
                $el: $el
              });
              options._log.snapshot("before", {
                next: "after"
              });
            }
            if (options.errorOnSelect && $el.is("select")) {
              $Cypress.Utils.throwErrByPath("click.on_select_element", {
                onFail: options._log
              });
            }
            isAttached = function($elToClick) {
              return _this._contains($elToClick);
            };
            getFirstFocusableEl = function($el) {
              var parent;
              if ($el.is(focusable)) {
                return $el;
              }
              parent = $el.parent();
              if (!parent.length) {
                return $(win);
              }
              return getFirstFocusableEl($el.parent());
            };
            afterMouseDown = function($elToClick, coords) {
              var consoleObj, consoleProps;
              if (isAttached($elToClick)) {
                domEvents.mouseUp = _this.Cypress.Mouse.mouseUp($elToClick, coords, win);
              }
              if (isAttached($elToClick)) {
                domEvents.click = _this.Cypress.Mouse.click($elToClick, coords, win);
              }
              if (options._log) {
                consoleObj = options._log.attributes.consoleProps();
              }
              consoleProps = function() {
                consoleObj = _.defaults(consoleObj != null ? consoleObj : {}, {
                  "Applied To": $Cypress.Utils.getDomElements($el),
                  "Elements": $el.length,
                  "Coords": coords,
                  "Options": deltaOptions
                });
                if ($el.get(0) !== $elToClick.get(0)) {
                  consoleObj["Actual Element Clicked"] = $Cypress.Utils.getDomElements($elToClick);
                }
                consoleObj.groups = function() {
                  var groups;
                  groups = [
                    {
                      name: "MouseDown",
                      items: _(domEvents.mouseDown).pick("preventedDefault", "stoppedPropagation", "modifiers")
                    }
                  ];
                  if (domEvents.mouseUp) {
                    groups.push({
                      name: "MouseUp",
                      items: _(domEvents.mouseUp).pick("preventedDefault", "stoppedPropagation", "modifiers")
                    });
                  }
                  if (domEvents.click) {
                    groups.push({
                      name: "Click",
                      items: _(domEvents.click).pick("preventedDefault", "stoppedPropagation", "modifiers")
                    });
                  }
                  return groups;
                };
                return consoleObj;
              };
              return Promise.delay(delay).then(function() {
                if (options._log) {
                  options._log.set({
                    coords: coords,
                    consoleProps: consoleProps
                  });
                }
                if (options._log && options.log) {
                  return options._log.snapshot().end();
                }
              })["return"](null);
            };
            findElByCoordinates = function($el) {
              var coordsObj, getCoords, getElementWithFixedPosition, scrollWindowPastFixedElement, verifyElementAtCoordinates;
              coordsObj = function(coords, $el) {
                return {
                  coords: coords,
                  $elToClick: $el
                };
              };
              scrollWindowPastFixedElement = function($fixed) {
                var height, width;
                height = $fixed.outerHeight();
                width = $fixed.outerWidth();
                win.scrollBy(-width, -height);
                if (options._log) {
                  return options._log.set("scrollBy", {
                    x: -width,
                    y: -height
                  });
                }
              };
              getElementWithFixedPosition = function($el) {
                if (!$el || $el.is("body,html")) {
                  return null;
                }
                if ($el.css("position") === "fixed") {
                  return $el;
                }
                return getElementWithFixedPosition($el.parent());
              };
              verifyElementAtCoordinates = function(coords) {
                var $elToClick, $fixed, err, retry;
                if (options.force === true) {
                  return coordsObj(coords, $el);
                }
                $elToClick = _this.getElementAtCoordinates(coords.x, coords.y);
                try {
                  _this.ensureDescendents($el, $elToClick, options._log);
                } catch (error) {
                  err = error;
                  if (options._log) {
                    options._log.set({
                      consoleProps: function() {
                        var obj;
                        obj = {};
                        obj["Tried to Click"] = $Cypress.Utils.getDomElements($el);
                        obj["But its Covered By"] = $Cypress.Utils.getDomElements($elToClick);
                        return obj;
                      }
                    });
                  }
                  err.onFail = function() {
                    if (options._log) {
                      return options._log.snapshot();
                    }
                  };
                  options.error = err;
                  if ($fixed = getElementWithFixedPosition($elToClick)) {
                    scrollWindowPastFixedElement($fixed);
                    retry = function() {
                      return getCoords(false);
                    };
                    return _this._retry(retry, options);
                  }
                  return _this._retry(getCoords, options);
                }
                return coordsObj(coords, $elToClick);
              };
              getCoords = function(scrollIntoView, coordsHistory) {
                var err, retry;
                if (scrollIntoView == null) {
                  scrollIntoView = true;
                }
                if (coordsHistory == null) {
                  coordsHistory = [];
                }
                retry = function() {
                  return getCoords(scrollIntoView, coordsHistory);
                };
                if (options.force !== true) {
                  try {
                    _this.ensureVisibility($el, options._log);
                    _this.ensureActionability($el, options._log);
                  } catch (error) {
                    err = error;
                    options.error = err;
                    return _this._retry(retry, options);
                  }
                }
                if (scrollIntoView) {
                  $el.get(0).scrollIntoView();
                }
                return _this._waitForAnimations($el, options, coordsHistory).then(verifyElementAtCoordinates);
              };
              return Promise["try"](getCoords);
            };
            shouldFireFocusEvent = function($focused, $elToFocus) {
              if (!$focused) {
                return true;
              }
              if (!$previouslyFocusedEl) {
                return true;
              }
              if ($focused.get(0) !== $elToFocus.get(0)) {
                return true;
              }
              if ($previouslyFocusedEl.get(0) !== $focused.get(0)) {
                return true;
              }
              return false;
            };
            _this._timeout(delay, true);
            p = findElByCoordinates($el).cancellable().then(function(obj) {
              var $elToClick, coords;
              $elToClick = obj.$elToClick, coords = obj.coords;
              return _this.execute("focused", {
                log: false,
                verify: false
              }).then(function($focused) {
                var $elToFocus;
                $previouslyFocusedEl = $focused;
                domEvents.mouseDown = _this.Cypress.Mouse.mouseDown($elToClick, coords, win);
                if (domEvents.mouseDown.preventedDefault || !isAttached($elToClick)) {
                  return afterMouseDown($elToClick, coords);
                } else {
                  $elToFocus = getFirstFocusableEl($elToClick);
                  return _this.execute("focused", {
                    log: false,
                    verify: false
                  }).then(function($focused) {
                    if (shouldFireFocusEvent($focused, $elToFocus)) {
                      dispatchPrimedChangeEvents.call(_this);
                      return _this.execute("focus", {
                        $el: $elToFocus,
                        error: false,
                        verify: false,
                        log: false
                      }).then(function() {
                        return afterMouseDown($elToClick, coords);
                      });
                    } else {
                      return afterMouseDown($elToClick, coords);
                    }
                  });
                }
              });
            });
            clicks.push(p);
            return p;
          };
        })(this);
        return Promise.each(options.$el.toArray(), click).cancellable().then((function(_this) {
          return function() {
            var verifyAssertions;
            if (options.verify === false) {
              return options.$el;
            }
            return (verifyAssertions = function() {
              return _this.verifyUpcomingAssertions(options.$el, options, {
                onRetry: verifyAssertions
              });
            })();
          };
        })(this))["catch"](Promise.CancellationError, function(err) {
          _(clicks).invoke("cancel");
          throw err;
        });
      },
      type: function(subject, chars, options) {
        var deltaOptions, getRow, getTableData, handleFocused, hasTabIndex, isBody, isTextLike, isTypeableButNotAnInput, node, num, table, type, updateTable;
        if (options == null) {
          options = {};
        }
        _.defaults(options, {
          $el: subject,
          log: true,
          verify: true,
          force: false,
          delay: 10,
          release: true
        });
        this.ensureDom(options.$el);
        if (options.log) {
          deltaOptions = Cypress.Utils.filterOutOptions(options);
          table = {};
          getRow = function(id, key, which) {
            return table[id] || (function() {
              var modifiers, obj;
              table[id] = (obj = {});
              modifiers = Cypress.Keyboard.activeModifiers();
              if (modifiers.length) {
                obj.modifiers = modifiers.join(", ");
              }
              if (key) {
                obj.typed = key;
                if (which) {
                  obj.which = which;
                }
              }
              return obj;
            })();
          };
          updateTable = function(id, key, column, which, value) {
            var row;
            row = getRow(id, key, which);
            return row[column] = value || "preventedDefault";
          };
          getTableData = function() {
            return _.reduce(_(table).values(), function(memo, value, index) {
              memo[index + 1] = value;
              return memo;
            }, {});
          };
          options._log = Cypress.Log.command({
            message: [chars, deltaOptions],
            $el: options.$el,
            consoleProps: function() {
              return {
                "Typed": chars,
                "Applied To": $Cypress.Utils.getDomElements(options.$el),
                "Options": deltaOptions,
                "table": function() {
                  return {
                    name: "Key Events Table",
                    data: getTableData(),
                    columns: ["typed", "which", "keydown", "keypress", "textInput", "input", "keyup", "change", "modifiers"]
                  };
                }
              };
            }
          });
          options._log.snapshot("before", {
            next: "after"
          });
        }
        isBody = options.$el.is("body");
        isTextLike = options.$el.is(textLike);
        hasTabIndex = options.$el.is("[tabindex]");
        isTypeableButNotAnInput = isBody || (hasTabIndex && !isTextLike);
        if (!isBody && !isTextLike && !hasTabIndex) {
          node = Cypress.Utils.stringifyElement(options.$el);
          $Cypress.Utils.throwErrByPath("type.not_on_text_field", {
            onFail: options._log,
            args: {
              node: node
            }
          });
        }
        if ((num = options.$el.length) && num > 1) {
          $Cypress.Utils.throwErrByPath("type.multiple_elements", {
            onFail: options._log,
            args: {
              num: num
            }
          });
        }
        if (!(_.isString(chars) || _.isFinite(chars))) {
          $Cypress.Utils.throwErrByPath("type.wrong_type", {
            onFail: options._log,
            args: {
              chars: chars
            }
          });
        }
        if (_.isBlank(chars)) {
          $Cypress.Utils.throwErrByPath("type.empty_string", {
            onFail: options._log
          });
        }
        options.chars = "" + chars;
        type = (function(_this) {
          return function() {
            var dispatchChangeEvent, simulateSubmitHandler;
            simulateSubmitHandler = function() {
              var clickedDefaultButton, defaultButton, defaultButtonisDisabled, form, getDefaultButton, multipleInputsAndNoSubmitElements;
              form = options.$el.parents("form");
              if (!form.length) {
                return;
              }
              multipleInputsAndNoSubmitElements = function(form) {
                var inputs, submits;
                inputs = form.find("input");
                submits = form.find("input[type=submit], button[type!=button]");
                return inputs.length > 1 && submits.length === 0;
              };
              if (multipleInputsAndNoSubmitElements(form)) {
                return;
              }
              clickedDefaultButton = function(button) {
                if (button.length) {
                  button.get(0).click();
                  return true;
                } else {
                  return false;
                }
              };
              getDefaultButton = function(form) {
                return form.find("input[type=submit], button[type!=button]").first();
              };
              defaultButtonisDisabled = function(button) {
                return button.prop("disabled");
              };
              defaultButton = getDefaultButton(form);
              if (defaultButtonisDisabled(defaultButton)) {
                return;
              }
              if (!clickedDefaultButton(defaultButton)) {
                return _this.execute("submit", {
                  log: false,
                  $el: form
                });
              }
            };
            dispatchChangeEvent = function(id) {
              var change, dispatched;
              change = document.createEvent("HTMLEvents");
              change.initEvent("change", true, false);
              dispatched = options.$el.get(0).dispatchEvent(change);
              if (id && updateTable) {
                updateTable.call(_this, id, null, "change", null, dispatched);
              }
              return dispatched;
            };
            return _this.Cypress.Keyboard.type({
              $el: options.$el,
              chars: options.chars,
              delay: options.delay,
              release: options.release,
              window: _this["private"]("window"),
              onBeforeType: function(totalKeys) {
                return _this._timeout(totalKeys * options.delay, true);
              },
              onBeforeSpecialCharAction: function(id, key) {
                if (isTypeableButNotAnInput) {
                  return false;
                }
              },
              onBeforeEvent: function(id, key, column, which) {
                if (indexOf.call(inputEvents, column) >= 0 && isTypeableButNotAnInput) {
                  return false;
                }
              },
              onEvent: function(id, key, column, which, value) {
                if (updateTable) {
                  return updateTable.apply(_this, arguments);
                }
              },
              onTypeChange: function() {
                if (options.$el.is("[contenteditable]")) {
                  return;
                }
                return _this.prop("changeEvent", function() {
                  dispatchChangeEvent();
                  return this.prop("changeEvent", null);
                });
              },
              onEnterPressed: function(changed, id) {
                if (options.$el.is("textarea,[contenteditable]")) {
                  return;
                }
                if (changed) {
                  dispatchChangeEvent(id);
                }
                return simulateSubmitHandler();
              },
              onNoMatchingSpecialChars: function(chars, allChars) {
                if (chars === "{tab}") {
                  return $Cypress.Utils.throwErrByPath("type.tab", {
                    onFail: options._log
                  });
                } else {
                  return $Cypress.Utils.throwErrByPath("type.invalid", {
                    onFail: options._log,
                    args: {
                      chars: chars,
                      allChars: allChars
                    }
                  });
                }
              }
            });
          };
        })(this);
        handleFocused = (function(_this) {
          return function() {
            if (isBody) {
              return type();
            }
            return _this.execute("focused", {
              log: false,
              verify: false
            }).then(function($focused) {
              if (!$focused || ($focused && $focused.get(0) !== options.$el.get(0))) {
                return _this.execute("click", {
                  $el: options.$el,
                  log: false,
                  verify: false,
                  _log: options._log,
                  force: options.force,
                  timeout: options.timeout,
                  interval: options.interval
                }).then(function() {
                  return type();
                });
              } else {
                return _this._waitForAnimations(options.$el, options).then(type);
              }
            });
          };
        })(this);
        return handleFocused().then((function(_this) {
          return function() {
            _this._timeout(delay, true);
            return Promise.delay(delay).then(function() {
              var verifyAssertions;
              if (options.verify === false) {
                return options.$el;
              }
              return (verifyAssertions = function() {
                return _this.verifyUpcomingAssertions(options.$el, options, {
                  onRetry: verifyAssertions
                });
              })();
            });
          };
        })(this));
      },
      clear: function(subject, options) {
        var clear;
        if (options == null) {
          options = {};
        }
        _.defaults(options, {
          log: true,
          force: false
        });
        this.ensureDom(subject);
        clear = (function(_this) {
          return function(el, index) {
            var $el, deltaOptions, node, word;
            $el = $(el);
            if (options.log) {
              deltaOptions = Cypress.Utils.filterOutOptions(options);
              options._log = Cypress.Log.command({
                message: deltaOptions,
                $el: $el,
                consoleProps: function() {
                  return {
                    "Applied To": $Cypress.Utils.getDomElements($el),
                    "Elements": $el.length,
                    "Options": deltaOptions
                  };
                }
              });
            }
            node = Cypress.Utils.stringifyElement($el);
            if (!$el.is(textLike)) {
              word = Cypress.Utils.plural(subject, "contains", "is");
              $Cypress.Utils.throwErrByPath("clear.invalid_element", {
                onFail: options._log,
                args: {
                  word: word,
                  node: node
                }
              });
            }
            return _this.execute("type", "{selectall}{del}", {
              $el: $el,
              log: false,
              verify: false,
              _log: options._log,
              force: options.force,
              timeout: options.timeout,
              interval: options.interval
            }).then(function() {
              if (options._log) {
                options._log.snapshot().end();
              }
              return null;
            });
          };
        })(this);
        return Promise.resolve(subject.toArray()).each(clear).cancellable().then((function(_this) {
          return function() {
            var verifyAssertions;
            return (verifyAssertions = function() {
              return _this.verifyUpcomingAssertions(subject, options, {
                onRetry: verifyAssertions
              });
            })();
          };
        })(this));
      },
      select: function(subject, valueOrText, options) {
        var consoleProps, deltaOptions, getOptions, multiple, node, num, retryOptions;
        if (options == null) {
          options = {};
        }
        _.defaults(options, {
          $el: subject,
          log: true,
          force: false
        });
        this.ensureDom(options.$el);
        consoleProps = {};
        if (options.log) {
          deltaOptions = Cypress.Utils.filterOutOptions(options);
          options._log = Cypress.Log.command({
            message: deltaOptions,
            $el: options.$el,
            consoleProps: function() {
              return _.extend({}, consoleProps, {
                "Applied To": $Cypress.Utils.getDomElements(options.$el),
                "Options": deltaOptions
              });
            }
          });
          options._log.snapshot("before", {
            next: "after"
          });
        }
        if (!options.$el.is("select")) {
          node = Cypress.Utils.stringifyElement(options.$el);
          $Cypress.Utils.throwErrByPath("select.invalid_element", {
            args: {
              node: node
            }
          });
        }
        if ((num = options.$el.length) && num > 1) {
          $Cypress.Utils.throwErrByPath("select.multiple_elements", {
            args: {
              num: num
            }
          });
        }
        valueOrText = [].concat(valueOrText);
        multiple = options.$el.prop("multiple");
        if (!multiple && valueOrText.length > 1) {
          $Cypress.Utils.throwErrByPath("select.invalid_multiple");
        }
        getOptions = (function(_this) {
          return function() {
            var allSameValue, optionEls, optionsObjects, uniqueValues, values;
            if (options.$el.prop("disabled")) {
              node = Cypress.Utils.stringifyElement(options.$el);
              $Cypress.Utils.throwErrByPath("select.disabled", {
                args: {
                  node: node
                }
              });
            }
            values = [];
            optionEls = [];
            optionsObjects = options.$el.find("option").map(function(index, el) {
              var optEl, value;
              value = el.value;
              optEl = $(el);
              if (indexOf.call(valueOrText, value) >= 0) {
                optionEls.push(optEl);
                values.push(value);
              }
              return {
                value: value,
                text: optEl.text(),
                $el: optEl
              };
            }).get();
            if (!values.length) {
              uniqueValues = _(optionsObjects).chain().pluck("value").uniq().value();
              allSameValue = uniqueValues.length === 1;
              _.each(optionsObjects, function(obj, index) {
                var ref;
                if (ref = obj.text, indexOf.call(valueOrText, ref) >= 0) {
                  optionEls.push(obj.$el);
                  return values.push(obj.value);
                }
              });
            }
            if (!multiple && values.length > 1) {
              $Cypress.Utils.throwErrByPath("select.multiple_matches", {
                args: {
                  value: valueOrText.join(", ")
                }
              });
            }
            if (!values.length) {
              $Cypress.Utils.throwErrByPath("select.no_matches", {
                args: {
                  value: valueOrText.join(", ")
                }
              });
            }
            _.each(optionEls, function($el) {
              if ($el.prop("disabled")) {
                node = Cypress.Utils.stringifyElement($el);
                return $Cypress.Utils.throwErrByPath("select.option_disabled", {
                  args: {
                    node: node
                  }
                });
              }
            });
            return {
              values: values,
              optionEls: optionEls,
              allSameValue: allSameValue
            };
          };
        })(this);
        retryOptions = (function(_this) {
          return function() {
            return Promise["try"](getOptions)["catch"](function(err) {
              options.error = err;
              return _this._retry(retryOptions, options);
            });
          };
        })(this);
        return Promise["try"](retryOptions).then((function(_this) {
          return function(obj) {
            var allSameValue, optionEls, values;
            if (obj == null) {
              obj = {};
            }
            values = obj.values, optionEls = obj.optionEls, allSameValue = obj.allSameValue;
            consoleProps.Selected = values;
            return _this.execute("click", {
              $el: options.$el,
              log: false,
              verify: false,
              errorOnSelect: false,
              _log: options._log,
              force: options.force,
              timeout: options.timeout,
              interval: options.interval
            }).then(function() {
              return Promise.resolve(optionEls).each(function(optEl) {
                return _this.execute("click", {
                  $el: optEl,
                  log: false,
                  verify: false,
                  force: true,
                  timeout: options.timeout,
                  interval: options.interval
                });
              }).cancellable().then(function() {
                var change, input;
                if (allSameValue) {
                  _.each(optionEls, function($el) {
                    return $el.prop("selected", "selected");
                  });
                } else {
                  options.$el.val(values);
                }
                input = new Event("input", {
                  bubbles: true,
                  cancelable: false
                });
                options.$el.get(0).dispatchEvent(input);
                change = document.createEvent("HTMLEvents");
                change.initEvent("change", true, false);
                return options.$el.get(0).dispatchEvent(change);
              });
            }).then(function() {
              var verifyAssertions;
              return (verifyAssertions = function() {
                return _this.verifyUpcomingAssertions(options.$el, options, {
                  onRetry: verifyAssertions
                });
              })();
            });
          };
        })(this));
      }
    });
    Cypress.addParentCommand({
      focused: function(options) {
        var getFocused, log, resolveFocused;
        if (options == null) {
          options = {};
        }
        _.defaults(options, {
          verify: true,
          log: true
        });
        if (options.log) {
          options._log = Cypress.Log.command();
        }
        log = function($el) {
          if (options.log === false) {
            return;
          }
          return options._log.set({
            $el: $el,
            consoleProps: function() {
              var ref, ret;
              ret = $el ? $Cypress.Utils.getDomElements($el) : "--nothing--";
              return {
                Returned: ret,
                Elements: (ref = $el != null ? $el.length : void 0) != null ? ref : 0
              };
            }
          });
        };
        getFocused = (function(_this) {
          return function() {
            var d, el, forceFocusedEl;
            try {
              d = _this["private"]("document");
              forceFocusedEl = _this.prop("forceFocusedEl");
              if (forceFocusedEl) {
                if (_this._contains(forceFocusedEl)) {
                  el = forceFocusedEl;
                } else {
                  _this.prop("forceFocusedEl", null);
                }
              } else {
                el = d.activeElement;
              }
              if (el && el !== _this.prop("blacklistFocusedEl")) {
                el = $(el);
                if (el.is("body")) {
                  log(null);
                  return null;
                }
                log(el);
                return el;
              } else {
                log(null);
                return null;
              }
            } catch (error) {
              log(null);
              return null;
            }
          };
        })(this);
        return (resolveFocused = (function(_this) {
          return function(failedByNonAssertion) {
            return Promise["try"](getFocused).then(function($el) {
              if (options.verify === false) {
                return $el;
              }
              options.$el = $el;
              return _this.verifyUpcomingAssertions($el != null ? $el : $(null), options, {
                onRetry: resolveFocused
              })["return"](options.$el);
            });
          };
        })(this))(false);
      }
    });
    return Cypress.Cy.extend({
      _waitForAnimations: function($el, options, coordsHistory) {
        var coords, err, opts, retry;
        if (coordsHistory == null) {
          coordsHistory = [];
        }
        if (options.x && options.y) {
          coords = this.getRelativeCoordinates($el, options.x, options.y);
        } else {
          try {
            coords = this.getCoordinates($el, options.position);
          } catch (error) {
            err = error;
            $Cypress.Utils.throwErr(err, {
              onFail: options._log
            });
          }
        }
        if (options.force === true || options.waitForAnimations === false) {
          return Promise.resolve(coords);
        } else {
          coordsHistory.push(coords);
          retry = (function(_this) {
            return function() {
              return _this._waitForAnimations($el, options, coordsHistory);
            };
          })(this);
          if (coordsHistory.length < 2) {
            opts = _.chain(options).clone().extend({
              silent: true
            }).value();
            return this._retry(retry, opts);
          }
          try {
            this.ensureElementIsNotAnimating($el, coordsHistory, options.animationDistanceThreshold);
            return Promise.resolve(coords);
          } catch (error) {
            err = error;
            options.error = err;
            return this._retry(retry, options);
          }
        }
      },
      _check_or_uncheck: function(type, subject, values, options) {
        var checkOrUncheck, elHasMatchingValue, isAcceptableElement, isNoop, matchingElements;
        if (values == null) {
          values = [];
        }
        if (options == null) {
          options = {};
        }
        if (!_.isArray(values) && _.isObject(values)) {
          options = values;
          values = [];
        } else {
          values = [].concat(values);
        }
        matchingElements = [];
        _.defaults(options, {
          $el: subject,
          log: true,
          force: false
        });
        this.ensureDom(options.$el);
        isNoop = function($el) {
          switch (type) {
            case "check":
              return $el.prop("checked");
            case "uncheck":
              return !$el.prop("checked");
          }
        };
        isAcceptableElement = function($el) {
          switch (type) {
            case "check":
              return $el.is(":checkbox,:radio");
            case "uncheck":
              return $el.is(":checkbox");
          }
        };
        elHasMatchingValue = function($el) {
          var ref;
          return values.length === 0 || (ref = $el.val(), indexOf.call(values, ref) >= 0);
        };
        checkOrUncheck = (function(_this) {
          return function(el, index) {
            var $el, consoleProps, coords, deltaOptions, inputType, isElActionable, node, phrase, word;
            $el = $(el);
            isElActionable = elHasMatchingValue($el);
            if (isElActionable) {
              matchingElements.push(el);
            }
            consoleProps = {
              "Applied To": $Cypress.Utils.getDomElements($el),
              "Elements": $el.length
            };
            if (options.log && isElActionable) {
              deltaOptions = Cypress.Utils.filterOutOptions(options);
              options._log = Cypress.Log.command({
                message: deltaOptions,
                $el: $el,
                consoleProps: function() {
                  return _.extend(consoleProps, {
                    Options: deltaOptions
                  });
                }
              });
              options._log.snapshot("before", {
                next: "after"
              });
              if (!isAcceptableElement($el)) {
                node = Cypress.Utils.stringifyElement($el);
                word = Cypress.Utils.plural(options.$el, "contains", "is");
                phrase = type === "check" ? " and :radio" : "";
                $Cypress.Utils.throwErrByPath("check_uncheck.invalid_element", {
                  onFail: options._log,
                  args: {
                    node: node,
                    word: word,
                    phrase: phrase,
                    cmd: type
                  }
                });
              }
              if (isNoop($el)) {
                _this.ensureVisibility($el, options._log);
                if (options._log) {
                  inputType = $el.is(":radio") ? "radio" : "checkbox";
                  consoleProps.Note = "This " + inputType + " was already " + type + "ed. No operation took place.";
                  options._log.snapshot().end();
                }
                return null;
              } else {
                coords = _this.getCoordinates($el);
                consoleProps.Coords = coords;
                options._log.set("coords", coords);
              }
            }
            if (isElActionable) {
              return _this.execute("click", {
                $el: $el,
                log: false,
                verify: false,
                _log: options._log,
                force: options.force,
                timeout: options.timeout,
                interval: options.interval
              }).then(function() {
                if (options._log) {
                  options._log.snapshot().end();
                }
                return null;
              });
            }
          };
        })(this);
        return Promise.resolve(options.$el.toArray()).each(checkOrUncheck).cancellable().then((function(_this) {
          return function() {
            var verifyAssertions;
            options.$el = options.$el.filter(matchingElements);
            return (verifyAssertions = function() {
              return _this.verifyUpcomingAssertions(options.$el, options, {
                onRetry: verifyAssertions
              });
            })();
          };
        })(this));
      }
    });
  });

}).call(this);
; 
(function() {
  var slice = [].slice;

  $Cypress.register("Agents", function(Cypress, _, $, Promise) {
    var counts, display, formatArgs, getMessage, getName, hasMatchingFake, onError, onInvoke, resetCounts, wrap;
    (function(sinonAsPromised) {
      return sinonAsPromised(Promise);
    })(sinonAsPromised);
    display = function(name) {
      switch (name) {
        case "spy":
          return "Spied Obj";
        case "stub":
          return "Stubbed Obj";
      }
    };
    counts = null;
    resetCounts = function() {
      return counts = {
        spy: 0,
        stub: 0,
        children: {}
      };
    };
    resetCounts();
    Cypress.on("restore", resetCounts);
    hasMatchingFake = function(agent, args) {
      return _.some(agent.fakes, function(fake) {
        return fake.matches(args);
      });
    };
    getName = function(obj) {
      return obj.name + "-" + obj.count;
    };
    formatArgs = function(args) {
      return _.map(args, function(arg) {
        return Cypress.Utils.stringifyArg(arg);
      });
    };
    getMessage = function(method, args) {
      if (method == null) {
        method = "function";
      }
      args = args.length > 3 ? formatArgs(args.slice(0, 3)).concat("...") : formatArgs(args);
      return method + "(" + (args.join(', ')) + ")";
    };
    onInvoke = function(obj, args) {
      var agent, alias, aliases, callCount, log, logProps, parent, parentCallCount, ref, ref1;
      if (log = obj.log) {
        log.set("callCount", log.get("callCount") + 1);
        alias = log.get("alias");
      }
      agent = obj.agent;
      if (((ref = agent.fakes) != null ? ref.length : void 0) && hasMatchingFake(agent, args)) {
        return;
      }
      callCount = agent.callCount;
      if (parent = agent.parent) {
        parentCallCount = parent.callCount;
      }
      logProps = {
        name: getName(obj),
        message: obj.message,
        error: obj.error,
        type: "parent",
        end: true,
        snapshot: true,
        event: true,
        consoleProps: function() {
          var console, name, parentCount, parentName;
          console = {};
          console.Command = null;
          console.Error = null;
          console.Event = (getName(obj)) + " called";
          if (parent) {
            parentCount = obj.count.replace(/\.\d+$/, '');
            parentName = obj.name + "-" + parentCount;
            name = getName(obj);
            console[parentName] = parent;
            console[parentName + " call #"] = parentCallCount;
            if (parent._cyAlias) {
              console[parentName + " alias"] = parent._cyAlias;
            }
            console[name] = agent;
            console[name + " call #"] = callCount;
            if (alias) {
              console[name + " alias"] = alias;
            }
            console[name + " matching arguments"] = agent.matchingAguments;
          } else {
            console[obj.name] = agent;
            console["Call #"] = callCount;
            if (alias) {
              console.Alias = alias;
            }
          }
          console[display(obj.name)] = obj.obj;
          console.Arguments = obj.call.args;
          console.Context = obj.call.thisValue;
          console.Returned = obj.call.returnValue;
          if (obj.error) {
            console.Error = obj.error.stack;
          }
          return console;
        }
      };
      aliases = _.compact([(ref1 = agent.parent) != null ? ref1._cyAlias : void 0, alias]);
      if (aliases.length) {
        logProps.alias = aliases;
        logProps.aliasType = "agent";
      }
      return Cypress.Log.command(logProps);
    };
    onError = function(err) {
      return $Cypress.Utils.throwErr(err);
    };
    wrap = function(_cy, type, agent, obj, method, count) {
      var log, name;
      if (!count) {
        count = counts[type] += 1;
      }
      name = type + "-" + count;
      if (!agent.parent) {
        counts.children[name] = 0;
      }
      log = Cypress.Log.agent({
        name: name,
        type: name,
        functionName: method,
        count: count,
        callCount: 0
      });
      agent.invoke = _.wrap(agent.invoke, function(orig, func, thisValue, args) {
        var e, error, props, returned;
        error = null;
        returned = null;
        try {
          returned = orig.call(this, func, thisValue, args);
        } catch (error1) {
          e = error1;
          error = e;
        }
        props = {
          count: count,
          name: type,
          message: getMessage(method, args),
          obj: obj,
          agent: agent,
          call: agent.lastCall,
          callCount: agent.callCount,
          error: error,
          log: log
        };
        onInvoke(props, args);
        if (error) {
          onError(error);
        }
        return returned;
      });
      agent.as = function(alias) {
        _cy._validateAlias(alias);
        _cy._addAlias({
          subject: agent,
          command: log,
          alias: alias
        });
        agent._cyAlias = alias;
        log.set({
          alias: alias,
          aliasType: "agent"
        });
        return agent.named(alias);
      };
      agent.withArgs = _.wrap(agent.withArgs, function() {
        var args, childCount, orig;
        orig = arguments[0], args = 2 <= arguments.length ? slice.call(arguments, 1) : [];
        childCount = counts.children[name] += 1;
        return wrap(_cy, type, orig.apply(this, args), obj, method, count + "." + childCount);
      });
      return agent;
    };
    return Cypress.Cy.extend({
      spy: function(obj, method) {
        var spy;
        spy = this._getSandbox().spy(obj, method);
        return wrap(this, "spy", spy, obj, method);
      },
      stub: function(obj, method, replacerFn) {
        var stub;
        stub = this._getSandbox().stub(obj, method, replacerFn);
        return wrap(this, "stub", stub, obj, method);
      },
      agents: function() {
        $Cypress.Utils.warning("cy.agents() is deprecated. Use cy.stub() and cy.spy() instead.");
        return {
          stub: this.stub.bind(this),
          spy: this.spy.bind(this)
        };
      }
    });
  });

}).call(this);
; 
(function() {
  var indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };

  $Cypress.register("Aliasing", function(Cypress, _, $) {
    var blacklist;
    blacklist = ["test", "runnable", "timeout", "slow", "skip", "inspect"];
    Cypress.Cy.extend({
      _validateAlias: function(alias) {
        if (!_.isString(alias)) {
          $Cypress.Utils.throwErrByPath("as.invalid_type");
        }
        if (_.isBlank(alias)) {
          $Cypress.Utils.throwErrByPath("as.empty_string");
        }
        if (indexOf.call(blacklist, alias) >= 0) {
          return $Cypress.Utils.throwErrByPath("as.reserved_word", {
            args: {
              alias: alias
            }
          });
        }
      },
      _addAlias: function(aliasObj) {
        var alias, aliases, ref, remoteSubject, subject;
        alias = aliasObj.alias, subject = aliasObj.subject;
        aliases = (ref = this.prop("aliases")) != null ? ref : {};
        aliases[alias] = aliasObj;
        this.prop("aliases", aliases);
        remoteSubject = this.getRemotejQueryInstance(subject);
        return this.assign(alias, remoteSubject != null ? remoteSubject : subject);
      }
    });
    return Cypress.addUtilityCommand({
      as: function(subject, str) {
        var log, noLogFromPreviousCommandisAlreadyAliased, prev;
        this.ensureParent();
        this.ensureSubject();
        this._validateAlias(str);
        prev = this.prop("current").get("prev");
        prev.set("alias", str);
        noLogFromPreviousCommandisAlreadyAliased = function() {
          return _.all(prev.get("logs"), function(log) {
            return log.get("alias") !== str;
          });
        };
        if (log = _.last(this.commands.logs({
          instrument: "command",
          event: false,
          chainerId: this.prop("chainerId")
        }))) {
          if (noLogFromPreviousCommandisAlreadyAliased()) {
            log.set({
              alias: str,
              aliasType: $Cypress.Utils.hasElement(subject) ? "dom" : "primitive"
            });
          }
        }
        this._addAlias({
          subject: subject,
          command: prev,
          alias: str
        });
        return subject;
      }
    });
  });

}).call(this);
; 
(function() {
  var indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };

  $Cypress.register("Angular", function(Cypress, _, $, Promise) {
    var ngPrefixes;
    ngPrefixes = ['ng-', 'ng_', 'data-ng-', 'x-ng-'];
    Cypress.addParentCommand({
      ng: function(type, selector, options) {
        if (options == null) {
          options = {};
        }
        if (!this["private"]("window").angular) {
          $Cypress.Utils.throwErrByPath("ng.no_global");
        }
        _.defaults(options, {
          log: true
        });
        if (options.log) {
          options._log = Cypress.Log.command();
        }
        switch (type) {
          case "model":
            return this._findByNgAttr("model", "model=", selector, options);
          case "repeater":
            return this._findByNgAttr("repeater", "repeat*=", selector, options);
          case "binding":
            return this._findByNgBinding(selector, options);
        }
      }
    });
    return Cypress.Cy.extend({
      _findByNgBinding: function(binding, options) {
        var angular, getEl, resolveElements, selector;
        selector = ".ng-binding";
        angular = this["private"]("window").angular;
        _.extend(options, {
          verify: false,
          log: false
        });
        getEl = function($elements) {
          var filtered;
          filtered = $elements.filter(function(index, el) {
            var bindingName, dataBinding;
            dataBinding = angular.element(el).data("$binding");
            if (dataBinding) {
              bindingName = dataBinding.exp || dataBinding[0].exp || dataBinding;
              return indexOf.call(bindingName, binding) >= 0;
            }
          });
          if (filtered.length) {
            return filtered;
          }
          return $(null);
        };
        return (resolveElements = (function(_this) {
          return function() {
            return _this.execute("get", selector, options).then(function($elements) {
              return _this.verifyUpcomingAssertions(getEl($elements), options, {
                onRetry: resolveElements,
                onFail: function(err) {
                  return err.displayMessage = "Could not find element for binding: '" + binding + "'.";
                }
              });
            });
          };
        })(this))();
      },
      _findByNgAttr: function(name, attr, el, options) {
        var cancelAll, error, finds, selectors;
        selectors = [];
        error = "Could not find element for " + name + ": '" + el + "'.  Searched ";
        _.extend(options, {
          verify: false,
          log: false
        });
        finds = _.map(ngPrefixes, (function(_this) {
          return function(prefix) {
            var resolveElements, selector;
            selector = "[" + prefix + attr + "'" + el + "']";
            selectors.push(selector);
            return (resolveElements = function() {
              return _this.execute("get", selector, options).then(function($elements) {
                return _this.verifyUpcomingAssertions($elements, options, {
                  onRetry: resolveElements
                });
              });
            })();
          };
        })(this));
        error += selectors.join(", ") + ".";
        cancelAll = function() {
          return _(finds).invoke("cancel");
        };
        return Promise.any(finds).cancellable().then(function(subject) {
          cancelAll();
          return subject;
        })["catch"](Promise.CancellationError, function(err) {
          cancelAll();
          throw err;
        })["catch"](Promise.AggregateError, (function(_this) {
          return function(err) {
            return $Cypress.Utils.throwErr(error);
          };
        })(this));
      }
    });
  });

}).call(this);
; 
(function() {
  var slice = [].slice;

  $Cypress.register("Assertions", function(Cypress, _, $, Promise) {
    var assertFn, bRe, bTagClosed, bTagOpen, butRe, convertMessage, convertRowFontSize, convertTags, parseValueActualAndExpected, reEventually, reExistence, reHaveLength, shouldFn, shouldFnWithCallback;
    bRe = /(\*\*)(.+)(\*\*)/;
    bTagOpen = /\*\*/g;
    bTagClosed = /\*\*/g;
    butRe = /,? but\b/;
    reExistence = /exist/;
    reEventually = /^eventually/;
    reHaveLength = /length/;
    Cypress.on("assert", function() {
      return this.assert.apply(this, arguments);
    });
    convertTags = function(str) {
      str = _.escape(str);
      if (!bRe.test(str)) {
        return str;
      }
      return str.replace(bTagOpen, ": <strong>").replace(bTagClosed, "</strong>").split(" :").join(":");
    };
    convertMessage = function($row, message) {
      message = convertTags(message);
      return $row.find("[data-js=message]").html(message);
    };
    convertRowFontSize = function($row, message) {
      var len;
      len = message.length;
      if (len < 100) {
        return;
      }
      return $row.css({
        fontSize: "85%",
        lineHeight: "14px"
      });
    };
    parseValueActualAndExpected = function(value, actual, expected) {
      var obj;
      obj = {
        actual: actual,
        expected: expected
      };
      if (value instanceof $) {
        obj.subject = value;
        if (_.isUndefined(actual) || actual !== expected) {
          delete obj.actual;
          delete obj.expected;
        }
      }
      return obj;
    };
    shouldFnWithCallback = function(subject, fn) {
      return Promise["try"]((function(_this) {
        return function() {
          var remoteSubject;
          remoteSubject = _this.getRemotejQueryInstance(subject);
          return fn.call(_this["private"]("runnable").ctx, remoteSubject != null ? remoteSubject : subject);
        };
      })(this))["return"](subject);
    };
    shouldFn = function() {
      var applyChainer, applyChainers, args, chainers, err, exp, lastChainer, options, originalChainers, originalObj, subject, throwAndLogErr;
      subject = arguments[0], chainers = arguments[1], args = 3 <= arguments.length ? slice.call(arguments, 2) : [];
      if (_.isFunction(chainers)) {
        return shouldFnWithCallback.apply(this, arguments);
      }
      exp = Cypress.Chai.expect(subject).to;
      originalChainers = chainers;
      throwAndLogErr = (function(_this) {
        return function(err) {
          var current, log;
          current = _this.prop("current");
          log = Cypress.Log.command({
            name: "should",
            type: "child",
            message: [].concat(originalChainers, args),
            end: true,
            snapshot: true,
            error: err
          });
          return $Cypress.Utils.throwErr(err, {
            onFail: log
          });
        };
      })(this);
      chainers = chainers.split(".");
      lastChainer = _(chainers).last();
      originalObj = exp._obj;
      options = {};
      if (reEventually.test(chainers)) {
        err = $Cypress.Utils.cypressErr("The 'eventually' assertion chainer has been deprecated. This is now the default behavior so you can safely remove this word and everything should work as before.");
        err.retry = false;
        throwAndLogErr(err);
      }
      if (reHaveLength.test(chainers) || reExistence.test(chainers)) {
        exp.isCheckingExistence = true;
      }
      applyChainer = function(memo, value) {
        if (value === lastChainer) {
          if (_.isFunction(memo[value])) {
            try {
              return memo[value].apply(memo, args);
            } catch (error1) {
              err = error1;
              if (err.retry === false) {
                return throwAndLogErr(err);
              } else {
                throw err;
              }
            }
          }
        } else {
          return memo[value];
        }
      };
      applyChainers = (function(_this) {
        return function() {
          if (!exp.isCheckingExistence && Cypress.Utils.hasElement(subject)) {
            _this.ensureDom(subject, "should");
          }
          return _.reduce(chainers, function(memo, value) {
            if (!(value in memo)) {
              err = $Cypress.Utils.cypressErr("The chainer: '" + value + "' was not found. Could not build assertion.");
              err.retry = false;
              throwAndLogErr(err);
            }
            return applyChainer(memo, value);
          }, exp);
        };
      })(this);
      return Promise["try"](applyChainers).then(function() {
        if (originalObj !== exp._obj) {
          return exp._obj;
        }
        return subject;
      });
    };
    assertFn = function(passed, message, value, actual, expected, error, verifying) {
      var current, functionHadArguments, isAssertionType, isChildLike, obj;
      if (verifying == null) {
        verifying = false;
      }
      if (message && passed && butRe.test(message)) {
        message = message.substring(0, message.search(butRe));
      }
      obj = parseValueActualAndExpected(value, actual, expected);
      if (Cypress.Utils.hasElement(value)) {
        obj.$el = value;
      }
      functionHadArguments = function(current) {
        var fn;
        fn = current && current.get("args") && current.get("args")[0];
        return fn && _.isFunction(fn) && fn.length > 0;
      };
      isAssertionType = function(cmd) {
        return cmd && cmd.is("assertion");
      };
      current = this.prop("current");
      if (verifying) {
        obj._error = error;
      } else {
        obj.end = true;
        obj.snapshot = true;
        obj.error = error;
      }
      isChildLike = (function(_this) {
        return function(subject, current) {
          var ref;
          return (value === subject) || isAssertionType(current) || ((ref = _this.prop("upcomingAssertions")) != null ? ref.length : void 0) > 0 || functionHadArguments(current);
        };
      })(this);
      _.extend(obj, {
        name: "assert",
        message: message,
        passed: passed,
        selector: value != null ? value.selector : void 0,
        type: function(current, subject) {
          if (isChildLike(subject, current)) {
            return "child";
          } else {
            return "parent";
          }
        },
        consoleProps: (function(_this) {
          return function() {
            obj = {
              Command: "assert"
            };
            _.extend(obj, parseValueActualAndExpected(value, actual, expected));
            return _.extend(obj, {
              Message: message.replace(bTagOpen, "").replace(bTagClosed, "")
            });
          };
        })(this),
        renderProps: function() {
          return {
            message: message
          };
        }
      });
      if (error) {
        error.onFail = function(err) {};
      }
      Cypress.Log.command(obj);
      return Cypress;
    };
    Cypress.addAssertionCommand({
      should: function() {
        return shouldFn.apply(this, arguments);
      },
      and: function() {
        return shouldFn.apply(this, arguments);
      }
    });
    return Cypress.Cy.extend({
      verifyUpcomingAssertions: function(subject, options, callbacks) {
        var assertions, cmdHasFunctionArg, cmds, determineEl, ensureExistence, fns, i, onFailFn, onPassFn, restore, setSubjectAndSkip, subjects;
        if (options == null) {
          options = {};
        }
        if (callbacks == null) {
          callbacks = {};
        }
        cmds = this.getUpcomingAssertions();
        this.prop("upcomingAssertions", cmds);
        if (options.assertions == null) {
          options.assertions = [];
        }
        _.defaults(callbacks, {
          ensureExistenceFor: "dom"
        });
        ensureExistence = (function(_this) {
          return function() {
            var $el;
            switch (callbacks.ensureExistenceFor) {
              case "dom":
                $el = determineEl(options.$el, subject);
                if (!$Cypress.Utils.isInstanceOf($el, $)) {
                  return;
                }
                return _this.ensureElExistence($el);
              case "subject":
                return _this.ensureExistence(subject);
            }
          };
        })(this);
        determineEl = function($el, subject) {
          if (!_.isUndefined($el)) {
            return $el;
          } else {
            return subject;
          }
        };
        onPassFn = (function(_this) {
          return function() {
            if (_.isFunction(callbacks.onPass)) {
              return callbacks.onPass.call(_this, cmds, options.assertions);
            } else {
              return subject;
            }
          };
        })(this);
        onFailFn = (function(_this) {
          return function(err) {
            var e2, e3, onFail, onRetry;
            try {
              ensureExistence();
            } catch (error1) {
              e2 = error1;
              err = e2;
            }
            options.error = err;
            if (err.retry === false) {
              throw err;
            }
            onFail = callbacks.onFail;
            onRetry = callbacks.onRetry;
            if (!onFail && !onRetry) {
              throw err;
            }
            try {
              if (_.isFunction(onFail)) {
                onFail.call(_this, err);
              }
            } catch (error1) {
              e3 = error1;
              _this.finishAssertions(options.assertions);
              throw e3;
            }
            if (_.isFunction(onRetry)) {
              return _this._retry(onRetry, options);
            }
          };
        })(this);
        if (!cmds.length) {
          return Promise["try"](ensureExistence).then(onPassFn)["catch"](onFailFn);
        }
        i = 0;
        cmdHasFunctionArg = function(cmd) {
          return _.isFunction(cmd.get("args")[0]);
        };
        this.assert = function() {
          var args;
          args = 1 <= arguments.length ? slice.call(arguments, 0) : [];
          (function(_this) {
            return (function(cmd) {
              var setCommandLog;
              setCommandLog = function(log) {
                var assertion, assertions, incrementIndex, index, insertNewLog, l;
                if (log.get("name") !== "assert") {
                  return;
                }
                _this.prop("onBeforeLog", null);
                insertNewLog = function(log) {
                  cmd.log(log);
                  return options.assertions.push(log);
                };
                if (!cmd) {
                  cmd = cmds[i - 1];
                } else {
                  i += 1;
                }
                if (cmdHasFunctionArg(cmd)) {
                  index = cmd.get("assertionIndex");
                  assertions = cmd.get("assertions");
                  incrementIndex = function() {
                    return cmd.set("assertionIndex", index += 1);
                  };
                  if (!(assertion = assertions[index])) {
                    assertions.push(log);
                    incrementIndex();
                    return insertNewLog(log);
                  } else {
                    incrementIndex();
                    assertion.merge(log);
                    return false;
                  }
                }
                if (l = cmd.getLastLog()) {
                  l.merge(log);
                  return false;
                } else {
                  return insertNewLog(log);
                }
              };
              return _this.prop("onBeforeLog", setCommandLog);
            });
          })(this)(cmds[i]);
          return assertFn.apply(this, args.concat(true));
        };
        fns = this._injectAssertionFns(cmds);
        subjects = [];
        setSubjectAndSkip = function() {
          var cmd, j, len1, results;
          results = [];
          for (i = j = 0, len1 = subjects.length; j < len1; i = ++j) {
            subject = subjects[i];
            cmd = cmds[i];
            cmd.set("subject", subject);
            results.push(cmd.skip());
          }
          return results;
        };
        assertions = (function(_this) {
          return function(memo, fn, i) {
            return fn(memo).then(function(subject) {
              return subjects[i] = subject;
            });
          };
        })(this);
        restore = (function(_this) {
          return function() {
            _this.prop("upcomingAssertions", []);
            return _this.assert = assertFn;
          };
        })(this);
        return Promise.reduce(fns, assertions, subject).then(restore).then(setSubjectAndSkip).then((function(_this) {
          return function() {
            return _this.finishAssertions(options.assertions);
          };
        })(this)).then(onPassFn).cancellable()["catch"](Promise.CancellationError, function() {
          return restore();
        })["catch"]((function(_this) {
          return function(err) {
            var e;
            restore();
            if (err.retry === false) {
              _this.finishAssertions(options.assertions);
              try {
                $Cypress.Utils.throwErr(err, {
                  onFail: options._log
                });
              } catch (error1) {
                e = error1;
                err = e;
              }
            }
            throw err;
          };
        })(this))["catch"](onFailFn);
      },
      finishAssertions: function(assertions) {
        return _.each(assertions, function(log) {
          var e;
          log.snapshot();
          if (e = log.get("_error")) {
            return log.error(e);
          } else {
            return log.end();
          }
        });
      },
      _injectAssertionFns: function(cmds) {
        return _.map(cmds, _.bind(this._injectAssertion, this));
      },
      _injectAssertion: function(cmd) {
        return (function(_this) {
          return function(subject) {
            if (!cmd.get("assertions")) {
              cmd.set("assertions", []);
            }
            cmd.set("assertionIndex", 0);
            return cmd.get("fn").originalFn.apply(_this, [subject].concat(cmd.get("args")));
          };
        })(this);
      },
      getUpcomingAssertions: function() {
        var assertions, cmd, current, index, j, len1, ref;
        current = this.prop("current");
        index = this.prop("index") + 1;
        assertions = [];
        ref = this.commands.slice(index).get();
        for (j = 0, len1 = ref.length; j < len1; j++) {
          cmd = ref[j];
          if (cmd.is("utility")) {
            continue;
          }
          if (cmd.is("assertion") && cmd.get("chainerId") === current.get("chainerId")) {
            assertions.push(cmd);
          } else {
            break;
          }
        }
        return assertions;
      },
      assert: assertFn
    });
  });

}).call(this);
; 
(function() {
  $Cypress.register("Clock", function(Cypress, _) {
    return (function(lolex) {
      Cypress.on("test:before:run", function() {
        return this.prop("clock", null);
      });
      Cypress.on("before:window:load", function(contentWindow) {
        var clock;
        if (clock = this.prop("clock")) {
          return clock._bind(contentWindow);
        }
      });
      Cypress.on("restore", function() {
        var clock;
        if (!this.prop) {
          return;
        }
        if (clock = this.prop("clock")) {
          return clock.restore(false);
        }
      });
      return Cypress.addUtilityCommand({
        clock: function(subject, now, methods, options) {
          var clock, log;
          if (options == null) {
            options = {};
          }
          if (clock = this.prop("clock")) {
            return clock;
          }
          if (_.isObject(now)) {
            options = now;
            now = void 0;
          }
          if (_.isObject(methods) && !_.isArray(methods)) {
            options = methods;
            methods = void 0;
          }
          if ((now != null) && !_.isNumber(now)) {
            $Cypress.Utils.throwErrByPath("clock.invalid_1st_arg", {
              args: {
                arg: JSON.stringify(now)
              }
            });
          }
          if ((methods != null) && !(_.isArray(methods) && _.every(methods, _.isString))) {
            $Cypress.Utils.throwErrByPath("clock.invalid_2nd_arg", {
              args: {
                arg: JSON.stringify(methods)
              }
            });
          }
          _.defaults(options, {
            log: true
          });
          log = function(name, message, snapshot, consoleProps) {
            var details, logMethods, logNow;
            if (snapshot == null) {
              snapshot = true;
            }
            if (consoleProps == null) {
              consoleProps = {};
            }
            if (!options.log) {
              return;
            }
            details = clock._details();
            logNow = details.now;
            logMethods = details.methods.slice();
            return Cypress.Log.command({
              name: name,
              message: message != null ? message : "",
              type: "parent",
              end: true,
              snapshot: snapshot,
              consoleProps: function() {
                return _.extend({
                  "Now": logNow,
                  "Methods replaced": logMethods
                }, consoleProps);
              }
            });
          };
          clock = $Cypress.Clock.create(this["private"]("window"), now, methods);
          clock.tick = _.wrap(clock.tick, function(tick, ms) {
            var ret, theLog;
            if ((ms != null) && !_.isNumber(ms)) {
              $Cypress.Utils.throwErrByPath("tick.invalid_argument", {
                args: {
                  arg: JSON.stringify(ms)
                }
              });
            }
            theLog = log("tick", ms + "ms", false, {
              "Now": clock._details().now + ms,
              "Ticked": ms + " milliseconds"
            });
            if (theLog) {
              theLog.snapshot("before", {
                next: "after"
              });
            }
            ret = tick.call(clock, ms);
            if (theLog) {
              theLog.snapshot().end();
            }
            return ret;
          });
          clock.restore = _.wrap(clock.restore, (function(_this) {
            return function(restore, shouldLog) {
              var ret;
              if (shouldLog == null) {
                shouldLog = true;
              }
              ret = restore.call(clock);
              if (shouldLog) {
                log("restore");
              }
              _this.assign("clock", null);
              _this.prop("clock", null);
              return ret;
            };
          })(this));
          log("clock");
          this.assign("clock", clock);
          return this.prop("clock", clock);
        },
        tick: function(subject, ms) {
          var clock;
          clock = this.prop("clock");
          if (!clock) {
            $Cypress.Utils.throwErrByPath("tick.no_clock");
          }
          clock.tick(ms);
          return clock;
        }
      });
    })(lolex);
  });

}).call(this);
; 
(function() {
  var slice = [].slice;

  $Cypress.register("Commands", function(Cypress, _) {
    var command;
    command = function() {
      var args, cmds, ctx, name, ref;
      name = arguments[0], args = 2 <= arguments.length ? slice.call(arguments, 1) : [];
      ctx = (ref = this.prop("chain")) != null ? ref : this;
      if (ctx[name] == null) {
        cmds = _.keys(Cypress.Chainer.prototype).join(", ");
        $Cypress.Utils.throwErrByPath("miscellaneous.invalid_command", {
          args: {
            name: name,
            cmds: cmds
          }
        });
      }
      return ctx[name].apply(ctx, args);
    };
    Cypress.Cy.extend({
      cmd: function() {
        return command.apply(this, arguments);
      },
      command: function() {
        return command.apply(this, arguments);
      }
    });
    return ["cmd", "command"].forEach(function(val) {
      return Cypress.Chainer.inject(val, function(id, args) {
        return command.apply(this, args);
      });
    });
  });

}).call(this);
; 
(function() {
  $Cypress.register("Communications", function(Cypress, _, $, Promise) {
    return Cypress.addParentCommand({
      msg: function() {
        return this.sync.message.apply(this, arguments);
      },
      message: function(msg, data, options) {
        if (options == null) {
          options = {};
        }
        _.defaults(options, {
          log: true
        });
        _.defaults(options, {
          log: true
        });
        return new Promise((function(_this) {
          return function(resolve, reject) {
            if (options.log !== false) {
              options._log = Cypress.Log.command({
                name: "message",
                message: Cypress.Utils.stringify([msg, data])
              });
            }
            return Cypress.trigger("message", msg, data, function(resp) {
              var e, err;
              if (err = resp.__error) {
                try {
                  return $Cypress.Utils.throwErr(err, {
                    onFail: options._log
                  });
                } catch (error) {
                  e = error;
                  e.__isMessage = true;
                  if (resp.__name) {
                    e.name = resp.__name;
                  }
                  if (resp.__stack) {
                    e.stack = resp.__stack;
                  }
                  return reject(e);
                }
              } else {
                if (options._log) {
                  options._log.set({
                    consoleProps: function() {
                      return {
                        Message: msg,
                        "Data Sent": data,
                        "Data Returned": resp.response,
                        "Logs": resp.__logs
                      };
                    }
                  });
                  options._log.snapshot();
                }
                return resolve(resp.response);
              }
            });
          };
        })(this));
      }
    });
  });

}).call(this);
; 
(function() {
  var slice = [].slice;

  $Cypress.register("Connectors", function(Cypress, _, $) {
    var invokeFn, returnFalseIfThenable, thenFn;
    returnFalseIfThenable = function() {
      var args, key;
      key = arguments[0], args = 2 <= arguments.length ? slice.call(arguments, 1) : [];
      if (key === "then" && _.isFunction(args[0]) && _.isFunction(args[1])) {
        args[0]();
        return false;
      }
    };
    Cypress.Cy.extend({
      isCommandFromThenable: function(cmd) {
        var args;
        args = cmd.get("args");
        return cmd.get("name") === "then" && args.length === 3 && _.all(args, _.isFunction);
      },
      isCommandFromMocha: function(cmd) {
        return !cmd.get("next") && cmd.get("args").length === 2 && (cmd.get("args")[1].name === "done" || cmd.get("args")[1].length === 1);
      }
    });
    thenFn = function(subject, options, fn) {
      var args, checkSubject, cleanup, cleanupEnqueue, current, enqueuedCommand, getRet, invokedCyCommand, name, next, remoteSubject;
      if (_.isFunction(options)) {
        fn = options;
        options = {};
      }
      current = this.prop("current");
      if (this.isCommandFromMocha(current)) {
        return this.prop("next", fn);
      }
      _.defaults(options, {
        timeout: this._timeout()
      });
      this._clearTimeout();
      remoteSubject = this.getRemotejQueryInstance(subject);
      args = remoteSubject || subject;
      args = (args != null ? args._spreadArray : void 0) ? args : [args];
      name = this.prop("current").get("name");
      cleanup = (function(_this) {
        return function() {
          return _this.prop("onInjectCommand", null);
        };
      })(this);
      cleanupEnqueue = (function(_this) {
        return function() {
          _this.off("enqueue", enqueuedCommand);
          return null;
        };
      })(this);
      invokedCyCommand = false;
      enqueuedCommand = function() {
        return invokedCyCommand = true;
      };
      this.prop("onInjectCommand", returnFalseIfThenable);
      this.on("enqueue", enqueuedCommand);
      current = this.prop("current");
      next = current.get("next");
      if (next && next.get("chainerId") === current.get("chainerId")) {
        checkSubject = (function(_this) {
          return function(newSubject, args) {
            var index, s;
            if (_this.prop("current") !== next) {
              return;
            }
            s = next.get("prev").get("subject");
            index = _.indexOf(args, newSubject);
            if (index > -1) {
              args.splice(index, 1, s);
            }
            return _this.off("next:subject:prepared", checkSubject);
          };
        })(this);
        this.on("next:subject:prepared", checkSubject);
      }
      getRet = (function(_this) {
        return function() {
          var ret;
          ret = fn.apply(_this["private"]("runnable").ctx, args);
          if (ret === _this || ret === _this.chain()) {
            ret = null;
          }
          if ((ret != null) && invokedCyCommand && !ret.then) {
            Cypress.Utils.throwErrByPath("then.callback_mixes_sync_and_async", {
              onFail: options._log,
              args: {
                value: Cypress.Utils.stringify(ret)
              }
            });
          }
          return ret;
        };
      })(this);
      return Promise["try"](getRet).timeout(options.timeout).then((function(_this) {
        return function(ret) {
          cleanup();
          return ret != null ? ret : subject;
        };
      })(this))["catch"](Promise.TimeoutError, (function(_this) {
        return function() {
          return Cypress.Utils.throwErrByPath("invoke_its.timed_out", {
            onFail: options._log,
            args: {
              cmd: name,
              timeout: options.timeout,
              func: fn.toString()
            }
          });
        };
      })(this))["finally"](cleanupEnqueue);
    };
    invokeFn = function() {
      var args, fail, failOnCurrentNullOrUndefinedValue, failOnPreviousNullOrUndefinedValue, fn, getMessage, getReducedProp, getValue, message, name, options, resolveValue, retryValue, subject;
      subject = arguments[0], fn = arguments[1], args = 3 <= arguments.length ? slice.call(arguments, 2) : [];
      this.ensureParent();
      this.ensureSubject();
      options = {};
      getMessage = function() {
        if (name === "invoke") {
          return ("." + fn + "(") + Cypress.Utils.stringify(args) + ")";
        } else {
          return "." + fn;
        }
      };
      name = this.prop("current").get("name");
      message = getMessage();
      options._log = Cypress.Log.command({
        message: message,
        $el: Cypress.Utils.hasElement(subject) ? subject : null,
        consoleProps: function() {
          return {
            Subject: subject
          };
        }
      });
      if (!_.isString(fn)) {
        Cypress.Utils.throwErrByPath("invoke_its.invalid_1st_arg", {
          onFail: options._log,
          args: {
            cmd: name
          }
        });
      }
      if (name === "its" && args.length > 0) {
        Cypress.Utils.throwErrByPath("invoke_its.invalid_num_of_args", {
          onFail: options._log,
          args: {
            cmd: name
          }
        });
      }
      fail = (function(_this) {
        return function(prop) {
          return Cypress.Utils.throwErrByPath("invoke_its.invalid_property", {
            onFail: options._log,
            args: {
              prop: prop,
              cmd: name
            }
          });
        };
      })(this);
      failOnPreviousNullOrUndefinedValue = (function(_this) {
        return function(previousProp, currentProp, value) {
          return Cypress.Utils.throwErrByPath("invoke_its.previous_prop_nonexistent", {
            args: {
              previousProp: previousProp,
              currentProp: currentProp,
              value: value,
              cmd: name
            }
          });
        };
      })(this);
      failOnCurrentNullOrUndefinedValue = (function(_this) {
        return function(prop, value) {
          return Cypress.Utils.throwErrByPath("invoke_its.current_prop_nonexistent", {
            args: {
              prop: prop,
              value: value,
              cmd: name
            }
          });
        };
      })(this);
      getReducedProp = function(str, subject) {
        var getValue;
        getValue = function(memo, prop) {
          switch (false) {
            case !_.isString(memo):
              return new String(memo);
            case !_.isNumber(memo):
              return new Number(memo);
            default:
              return memo;
          }
        };
        return _.reduce(str.split("."), function(memo, prop, index, array) {
          var e;
          try {
            if (!(prop in getValue(memo, prop))) {
              fail(prop);
            }
          } catch (error) {
            e = error;
            if (_.isNull(memo) || _.isUndefined(memo)) {
              if (index > 0) {
                failOnPreviousNullOrUndefinedValue(array[index - 1], prop, memo);
              } else {
                failOnCurrentNullOrUndefinedValue(prop, memo);
              }
            } else {
              throw e;
            }
          }
          return memo[prop];
        }, subject);
      };
      getValue = (function(_this) {
        return function() {
          var actualSubject, getFormattedElement, invoke, prop, remoteSubject, value;
          remoteSubject = _this.getRemotejQueryInstance(subject);
          actualSubject = remoteSubject || subject;
          prop = getReducedProp(fn, actualSubject);
          invoke = function() {
            switch (name) {
              case "its":
                return prop;
              case "invoke":
                if (_.isFunction(prop)) {
                  return prop.apply(actualSubject, args);
                } else {
                  return Cypress.Utils.throwErrByPath("invoke.invalid_type", {
                    onFail: options._log,
                    args: {
                      prop: fn
                    }
                  });
                }
            }
          };
          getFormattedElement = function($el) {
            if (Cypress.Utils.hasElement($el)) {
              return Cypress.Utils.getDomElements($el);
            } else {
              return $el;
            }
          };
          value = invoke();
          if (options._log) {
            options._log.set({
              consoleProps: function() {
                var obj;
                obj = {};
                if (name === "invoke") {
                  obj["Function"] = message;
                  if (args.length) {
                    obj["With Arguments"] = args;
                  }
                } else {
                  obj["Property"] = message;
                }
                _.extend(obj, {
                  On: getFormattedElement(actualSubject),
                  Returned: getFormattedElement(value)
                });
                return obj;
              }
            });
          }
          return value;
        };
      })(this);
      retryValue = (function(_this) {
        return function() {
          return Promise["try"](getValue)["catch"](function(err) {
            options.error = err;
            return _this._retry(retryValue, options);
          });
        };
      })(this);
      return (resolveValue = (function(_this) {
        return function() {
          return Promise["try"](retryValue).then(function(value) {
            return _this.verifyUpcomingAssertions(value, options, {
              onRetry: resolveValue
            });
          });
        };
      })(this))();
    };
    Cypress.addChildCommand({
      spread: function(subject, options, fn) {
        if (!_.isArray(subject)) {
          Cypress.Utils.throwErrByPath("spread.invalid_type");
        }
        subject._spreadArray = true;
        return thenFn.call(this, subject, options, fn);
      },
      each: function(subject, options, fn) {
        var checkSubject, e, endEarly, next, nonArray, yieldItem;
        if (_.isUndefined(fn)) {
          fn = options;
          options = {};
        }
        if (!subject) {
          return subject;
        }
        if (!_.isFunction(fn)) {
          Cypress.Utils.throwErrByPath("each.invalid_argument");
        }
        nonArray = function() {
          return Cypress.Utils.throwErrByPath("each.non_array", {
            args: {
              subject: Cypress.Utils.stringify(subject)
            }
          });
        };
        try {
          if (!("length" in subject)) {
            nonArray();
          }
        } catch (error) {
          e = error;
          nonArray();
        }
        if (subject.length === 0) {
          return subject;
        }
        next = this.prop("current").get("next");
        if (next) {
          checkSubject = (function(_this) {
            return function(newSubject, args) {
              var index;
              if (_this.prop("current") !== next) {
                return;
              }
              index = _.indexOf(args, newSubject);
              if (index > -1) {
                args.splice(index, 1, subject);
              }
              return _this.off("next:subject:prepared", checkSubject);
            };
          })(this);
          this.on("next:subject:prepared", checkSubject);
        }
        endEarly = false;
        yieldItem = (function(_this) {
          return function(el, index) {
            var callback;
            if (endEarly) {
              return;
            }
            if (Cypress.Utils.hasElement(el)) {
              el = $(el);
            }
            callback = function() {
              var ret;
              ret = fn.call(this, el, index, subject);
              if (ret === false) {
                endEarly = true;
              }
              return ret;
            };
            return thenFn.call(_this, el, options, callback);
          };
        })(this);
        return Promise.each(_.toArray(subject), yieldItem)["return"](subject);
      }
    });
    return Cypress.addDualCommand({
      then: function() {
        return thenFn.apply(this, arguments);
      },
      invoke: function() {
        return invokeFn.apply(this, arguments);
      },
      its: function() {
        return invokeFn.apply(this, arguments);
      }
    });
  });

}).call(this);
; 
(function() {
  $Cypress.register("Cookies", function(Cypress, _, $, Promise, moment) {
    var COOKIE_PROPS, commandNameRe, getAndClear, getCommandFromEvent, mergeDefaults;
    COOKIE_PROPS = "name value path secure httpOnly expiry domain".split(" ");
    commandNameRe = /(:)(\w)/;
    getCommandFromEvent = function(event) {
      return event.replace(commandNameRe, function(match, p1, p2) {
        return p2.toUpperCase();
      });
    };
    mergeDefaults = function(obj) {
      var merge, superDomain;
      superDomain = Cypress.Location.create(window.location.href).superDomain;
      merge = function(o) {
        return _.defaults(o, {
          domain: superDomain
        });
      };
      if (_.isArray(obj)) {
        return _.map(obj, merge);
      } else {
        return merge(obj);
      }
    };
    getAndClear = function(log, timeout) {
      return this._automateCookies("get:cookies", {}, log, timeout).then((function(_this) {
        return function(resp) {
          var cookies;
          if (resp && resp.length === 0) {
            return resp;
          }
          cookies = Cypress.Cookies.getClearableCookies(resp);
          return _this._automateCookies("clear:cookies", cookies, log, timeout);
        };
      })(this));
    };
    Cypress.on("test:before:hooks", function() {
      return getAndClear.call(this);
    });
    Cypress.Cy.extend({
      _addTwentyYears: function() {
        return moment().add(20, "years").unix();
      },
      _automateCookies: function(event, obj, log, timeout) {
        var automate;
        if (obj == null) {
          obj = {};
        }
        automate = function() {
          return new Promise(function(resolve, reject) {
            var fn;
            fn = function(resp) {
              var e, err;
              if (e = resp.__error) {
                err = $Cypress.Utils.cypressErr(e);
                err.name = resp.__name;
                err.stack = resp.__stack;
                try {
                  return $Cypress.Utils.throwErr(err, {
                    onFail: log
                  });
                } catch (error) {
                  e = error;
                  return reject(e);
                }
              } else {
                return resolve(resp.response);
              }
            };
            return Cypress.trigger(event, mergeDefaults(obj), fn);
          });
        };
        if (!timeout) {
          return automate();
        } else {
          this._clearTimeout();
          return automate().timeout(timeout)["catch"](Promise.TimeoutError, function(err) {
            return $Cypress.Utils.throwErrByPath("cookies.timed_out", {
              onFail: log,
              args: {
                cmd: getCommandFromEvent(event),
                timeout: timeout
              }
            });
          });
        }
      }
    });
    return Cypress.addParentCommand({
      getCookie: function(name, options) {
        if (options == null) {
          options = {};
        }
        _.defaults(options, {
          log: true,
          timeout: Cypress.config("responseTimeout")
        });
        if (options.log) {
          options._log = Cypress.Log.command({
            message: name,
            displayName: "get cookie",
            consoleProps: function() {
              var c, obj;
              obj = {};
              if (c = options.cookie) {
                obj["Returned"] = c;
              } else {
                obj["Returned"] = "null";
                obj["Note"] = "No cookie with the name: '" + name + "' was found.";
              }
              return obj;
            }
          });
        }
        if (!_.isString(name)) {
          $Cypress.Utils.throwErrByPath("getCookie.invalid_argument", {
            onFail: options._log
          });
        }
        return this._automateCookies("get:cookie", {
          name: name
        }, options._log, options.timeout).then(function(resp) {
          options.cookie = resp;
          return resp;
        });
      },
      getCookies: function(options) {
        if (options == null) {
          options = {};
        }
        _.defaults(options, {
          log: true,
          timeout: Cypress.config("responseTimeout")
        });
        if (options.log) {
          options._log = Cypress.Log.command({
            message: "",
            displayName: "get cookies",
            consoleProps: function() {
              var c, obj;
              obj = {};
              if (c = options.cookies) {
                obj["Returned"] = c;
                obj["Num Cookies"] = c.length;
              }
              return obj;
            }
          });
        }
        return this._automateCookies("get:cookies", {}, options._log, options.timeout).then(function(resp) {
          options.cookies = resp;
          return resp;
        });
      },
      setCookie: function(name, value, options) {
        var cookie;
        if (options == null) {
          options = {};
        }
        _.defaults(options, {
          name: name,
          value: value,
          path: "/",
          secure: false,
          httpOnly: false,
          log: true,
          expiry: this._addTwentyYears(),
          timeout: Cypress.config("responseTimeout")
        });
        cookie = _.pick(options, COOKIE_PROPS);
        if (options.log) {
          options._log = Cypress.Log.command({
            message: [name, value],
            displayName: "set cookie",
            consoleProps: function() {
              var c, obj;
              obj = {};
              if (c = options.cookie) {
                obj["Returned"] = c;
              }
              return obj;
            }
          });
        }
        if (!_.isString(name) || !_.isString(value)) {
          $Cypress.Utils.throwErrByPath("setCookie.invalid_arguments", {
            onFail: options._log
          });
        }
        return this._automateCookies("set:cookie", cookie, options._log, options.timeout).then(function(resp) {
          options.cookie = resp;
          return resp;
        });
      },
      clearCookie: function(name, options) {
        if (options == null) {
          options = {};
        }
        _.defaults(options, {
          log: true,
          timeout: Cypress.config("responseTimeout")
        });
        if (options.log) {
          options._log = Cypress.Log.command({
            message: name,
            displayName: "clear cookie",
            consoleProps: function() {
              var c, obj;
              obj = {};
              obj["Returned"] = "null";
              if (c = options.cookie) {
                obj["Cleared Cookie"] = c;
              } else {
                obj["Note"] = "No cookie with the name: '" + name + "' was found or removed.";
              }
              return obj;
            }
          });
        }
        if (!_.isString(name)) {
          $Cypress.Utils.throwErrByPath("clearCookie.invalid_argument", {
            onFail: options._log
          });
        }
        return this._automateCookies("clear:cookie", {
          name: name
        }, options._log, options.timeout).then(function(resp) {
          options.cookie = resp;
          return null;
        });
      },
      clearCookies: function(options) {
        if (options == null) {
          options = {};
        }
        _.defaults(options, {
          log: true,
          timeout: Cypress.config("responseTimeout")
        });
        if (options.log) {
          options._log = Cypress.Log.command({
            message: "",
            displayName: "clear cookies",
            consoleProps: function() {
              var c, obj;
              obj = {};
              obj["Returned"] = "null";
              if ((c = options.cookies) && c.length) {
                obj["Cleared Cookies"] = c;
                obj["Num Cookies"] = c.length;
              } else {
                obj["Note"] = "No cookies were found or removed.";
              }
              return obj;
            }
          });
        }
        return getAndClear.call(this, options._log, options.timeout, "clearCookies").then(function(resp) {
          options.cookies = resp;
          return null;
        })["catch"](function(err) {
          err.message = err.message.replace("getCookies", "clearCookies");
          throw err;
        });
      }
    });
  });

}).call(this);
; 
(function() {
  $Cypress.register("Debugging", function(Cypress, _, $) {
    Cypress.on("resume:next", function() {
      return this.resume(false);
    });
    Cypress.on("resume:all", function() {
      return this.resume();
    });
    Cypress.on("pause", function() {
      var chain;
      if (chain = this.prop("chain")) {
        return chain.pause();
      } else {
        return this.pause();
      }
    });
    Cypress.Cy.extend({
      resume: function(resumeAll) {
        var onResume;
        if (resumeAll == null) {
          resumeAll = true;
        }
        onResume = this.prop("onResume");
        if (!_.isFunction(onResume)) {
          return;
        }
        this.prop("onResume", null);
        return onResume.call(this, resumeAll);
      },
      getNextQueuedCommand: function() {
        var search;
        search = (function(_this) {
          return function(i) {
            var cmd;
            cmd = _this.commands.at(i);
            if (cmd && cmd.get("skip")) {
              return search(i + 1);
            } else {
              return cmd;
            }
          };
        })(this);
        return search(this.prop("index"));
      }
    });
    return Cypress.addUtilityCommand({
      pause: function(subject, options) {
        var onResume;
        if (options == null) {
          options = {};
        }
        if ($Cypress.isHeadless) {
          return subject;
        }
        _.defaults(options, {
          log: true
        });
        if (options.log) {
          options._log = Cypress.Log.command({
            snapshot: true,
            autoEnd: false
          });
        }
        onResume = (function(_this) {
          return function(fn, timeout) {
            return _this.prop("onResume", function(resumeAll) {
              if (resumeAll) {
                this.prop("onPaused", null);
                if (options.log) {
                  options._log.end();
                }
              }
              this._timeout(timeout);
              return fn.call(this);
            });
          };
        })(this);
        this.prop("onPaused", function(fn) {
          var next, timeout;
          next = this.getNextQueuedCommand();
          if (next && this.isCommandFromMocha(next)) {
            return fn.call(this);
          }
          Cypress.trigger("paused", next != null ? next.get("name") : void 0);
          timeout = this._timeout();
          this._clearTimeout();
          return onResume(fn, timeout);
        });
        return subject;
      },
      debug: function(subject, options) {
        var previous;
        if (options == null) {
          options = {};
        }
        _.defaults(options, {
          log: true
        });
        if (options.log) {
          options._log = Cypress.Log.command({
            snapshot: true,
            end: true
          });
        }
        previous = this.prop("current").get("prev");
        console.log("\n%c------------------------ Debug Info ------------------------", "font-weight: bold;");
        console.log("Command Name:    ", previous && previous.get("name"));
        console.log("Command Args:    ", previous && previous.get("args"));
        console.log("Current Subject: ", subject);
        
        ////// HOVER OVER TO INSPECT THE CURRENT SUBJECT //////
        subject
        ///////////////////////////////////////////////////////

        debugger;
        return subject;
      }
    });
  });

}).call(this);
; 
(function() {
  $Cypress.register("Eval", function(Cypress, _, $, Promise) {
    Cypress.on("abort", function() {
      var ref;
      if (this.prop) {
        return (ref = this.prop("xhr")) != null ? ref.abort() : void 0;
      }
    });
    return Cypress.addParentCommand({
      "eval": function(code, options) {
        var prevTimeout, xhr;
        if (options == null) {
          options = {};
        }
        _.defaults(options, {
          timeout: 15000
        });
        prevTimeout = this._timeout();
        this._timeout(options.timeout);
        xhr = this.prop("xhr", $.getJSON("/eval", {
          code: code
        }));
        return Promise.resolve(xhr).then((function(_this) {
          return function(response) {
            try {
              response = JSON.parse(response);
            } catch (error) {}
            _this._timeout(prevTimeout);
            return response;
          };
        })(this));
      }
    });
  });

}).call(this);
; 
(function() {
  $Cypress.register("Exec", function(Cypress, _, $, Promise) {
    var exec;
    exec = (function(_this) {
      return function(options) {
        return new Promise(function(resolve, reject) {
          return Cypress.trigger("exec", options, function(resp) {
            var err;
            if (err = resp.__error) {
              err.timedout = resp.timedout;
              return reject(err);
            } else {
              return resolve(resp);
            }
          });
        });
      };
    })(this);
    return Cypress.addParentCommand({
      exec: function(cmd, options) {
        var consoleOutput, isTimedoutError;
        if (options == null) {
          options = {};
        }
        _.defaults(options, {
          log: true,
          timeout: Cypress.config("execTimeout"),
          failOnNonZeroExit: true,
          env: {}
        });
        if (options.log) {
          consoleOutput = {};
          options._log = Cypress.Log.command({
            message: _.truncate(cmd, 25),
            consoleProps: function() {
              return consoleOutput;
            }
          });
        }
        if (!cmd || !_.isString(cmd)) {
          $Cypress.Utils.throwErrByPath("exec.invalid_argument", {
            onFail: options._log,
            args: {
              cmd: cmd != null ? cmd : ''
            }
          });
        }
        options.cmd = cmd;
        this._clearTimeout();
        isTimedoutError = function(err) {
          return err.timedout;
        };
        return exec(_.pick(options, "cmd", "timeout", "env")).timeout(options.timeout).then(function(result) {
          var output;
          if (options._log) {
            _.extend(consoleOutput, {
              Returned: _.omit(result, "shell")
            });
            consoleOutput["Shell Used"] = result.shell;
          }
          if (result.code === 0 || !options.failOnNonZeroExit) {
            return result;
          }
          output = "";
          if (result.stdout) {
            output += "\nStdout:\n" + (_.truncate(result.stdout, 200));
          }
          if (result.stderr) {
            output += "\nStderr:\n" + (_.truncate(result.stderr, 200));
          }
          return $Cypress.Utils.throwErrByPath("exec.non_zero_exit", {
            onFail: options._log,
            args: {
              cmd: cmd,
              output: output,
              code: result.code
            }
          });
        })["catch"](Promise.TimeoutError, isTimedoutError, function(err) {
          return $Cypress.Utils.throwErrByPath("exec.timed_out", {
            onFail: options._log,
            args: {
              cmd: cmd,
              timeout: options.timeout
            }
          });
        })["catch"](function(error) {
          if (error.name === "CypressError") {
            throw error;
          }
          return $Cypress.Utils.throwErrByPath("exec.failed", {
            onFail: options._log,
            args: {
              cmd: cmd,
              error: error
            }
          });
        });
      }
    });
  });

}).call(this);
; 
(function() {
  $Cypress.register("Files", function(Cypress, _, $, Promise) {
    var readFile, writeFile;
    readFile = (function(_this) {
      return function(file, options) {
        return new Promise(function(resolve, reject) {
          return Cypress.trigger("read:file", file, options, function(resp) {
            var err;
            if (err = resp.__error) {
              return reject(err);
            } else {
              return resolve(resp);
            }
          });
        });
      };
    })(this);
    writeFile = (function(_this) {
      return function(file, contents, options) {
        return new Promise(function(resolve, reject) {
          return Cypress.trigger("write:file", file, contents, options, function(resp) {
            var err;
            if (resp == null) {
              resp = {};
            }
            if (err = resp.__error) {
              return reject(err);
            } else {
              return resolve(resp);
            }
          });
        });
      };
    })(this);
    return Cypress.addParentCommand({
      readFile: function(file, encoding, options) {
        var consoleProps, verifyAssertions;
        if (options == null) {
          options = {};
        }
        if (_.isObject(encoding)) {
          options = encoding;
          encoding = null;
        }
        _.defaults(options, {
          encoding: encoding != null ? encoding : "utf8",
          log: true
        });
        consoleProps = {};
        if (options.log) {
          options._log = Cypress.Log.command({
            message: file,
            consoleProps: function() {
              return consoleProps;
            }
          });
        }
        if (!file || !_.isString(file)) {
          $Cypress.Utils.throwErrByPath("files.invalid_argument", {
            onFail: options._log,
            args: {
              cmd: "readFile",
              file: file
            }
          });
        }
        return (verifyAssertions = (function(_this) {
          return function() {
            return readFile(file, _.pick(options, "encoding"))["catch"](function(err) {
              if (err.code === 'ENOENT') {
                return {
                  contents: null,
                  filePath: err.filePath
                };
              } else {
                return $Cypress.Utils.throwErrByPath("files.unexpected_error", {
                  onFail: options._log,
                  args: {
                    cmd: "readFile",
                    action: "read",
                    file: file,
                    filePath: err.filePath,
                    error: err.message
                  }
                });
              }
            }).then(function(arg) {
              var contents, filePath;
              contents = arg.contents, filePath = arg.filePath;
              consoleProps["File Path"] = filePath;
              consoleProps["Contents"] = contents;
              return _this.verifyUpcomingAssertions(contents, options, {
                ensureExistenceFor: "subject",
                onFail: function(err) {
                  if (err.type !== "existence") {
                    return;
                  }
                  if (contents != null) {
                    return err.displayMessage = $Cypress.Utils.errMessageByPath("files.existent", {
                      file: file,
                      filePath: filePath
                    });
                  } else {
                    return err.displayMessage = $Cypress.Utils.errMessageByPath("files.nonexistent", {
                      file: file,
                      filePath: filePath
                    });
                  }
                },
                onRetry: verifyAssertions
              });
            });
          };
        })(this))();
      },
      writeFile: function(fileName, contents, encoding, options) {
        var consoleProps;
        if (options == null) {
          options = {};
        }
        if (_.isObject(encoding)) {
          options = encoding;
          encoding = null;
        }
        _.defaults(options, {
          encoding: encoding != null ? encoding : "utf8",
          log: true
        });
        consoleProps = {};
        if (options.log) {
          options._log = Cypress.Log.command({
            message: fileName,
            consoleProps: function() {
              return consoleProps;
            }
          });
        }
        if (!fileName || !_.isString(fileName)) {
          $Cypress.Utils.throwErrByPath("files.invalid_argument", {
            onFail: options._log,
            args: {
              cmd: "writeFile",
              file: fileName
            }
          });
        }
        if (!(_.isString(contents) || _.isObject(contents))) {
          $Cypress.Utils.throwErrByPath("files.invalid_contents", {
            onFail: options._log,
            args: {
              contents: contents
            }
          });
        }
        if (_.isObject(contents)) {
          contents = JSON.stringify(contents, null, 2);
        }
        return writeFile(fileName, contents, _.pick(options, "encoding")).then(function(arg) {
          var contents, filePath;
          contents = arg.contents, filePath = arg.filePath;
          consoleProps["File Path"] = filePath;
          consoleProps["Contents"] = contents;
          return contents;
        })["catch"](Promise.TimeoutError, function(err) {
          return $Cypress.Utils.throwErrByPath("files.timed_out", {
            onFail: options._log,
            args: {
              cmd: "writeFile",
              file: fileName,
              timeout: options.timeout
            }
          });
        })["catch"](function(err) {
          return $Cypress.Utils.throwErrByPath("files.unexpected_error", {
            onFail: options._log,
            args: {
              cmd: "writeFile",
              action: "write",
              file: fileName,
              filePath: err.filePath,
              error: err.message
            }
          });
        });
      }
    });
  });

}).call(this);
; 
(function() {
  var slice = [].slice;

  $Cypress.register("Fixtures", function(Cypress, _, $, Promise) {
    var cache, clone, fixture, fixturesRe;
    cache = {};
    fixturesRe = /^(fx:|fixture:)/;
    clone = function(obj) {
      return JSON.parse(JSON.stringify(obj));
    };
    fixture = (function(_this) {
      return function(fixture, options) {
        return new Promise(function(resolve) {
          return Cypress.trigger("fixture", fixture, options, resolve);
        });
      };
    })(this);
    Cypress.on("stop", function() {
      return cache = {};
    });
    Cypress.addParentCommand({
      fixture: function() {
        var args, fx, options, resp;
        fx = arguments[0], args = 2 <= arguments.length ? slice.call(arguments, 1) : [];
        if (resp = cache[fx]) {
          return Promise.resolve(clone(resp));
        }
        options = {};
        switch (false) {
          case !_.isObject(args[0]):
            options = args[0];
            break;
          case !_.isObject(args[1]):
            options = args[1];
            break;
          case !_.isString(args[0]):
            options.encoding = args[0];
        }
        _.defaults(options, {
          timeout: Cypress.config("responseTimeout")
        });
        this._clearTimeout();
        return fixture(fx, options).timeout(options.timeout).then((function(_this) {
          return function(response) {
            var err;
            if (err = response.__error) {
              return $Cypress.Utils.throwErr(err);
            } else {
              cache[fx] = response;
              return clone(response);
            }
          };
        })(this))["catch"](Promise.TimeoutError, function(err) {
          return $Cypress.Utils.throwErrByPath("fixture.timed_out", {
            args: {
              timeout: options.timeout
            }
          });
        });
      }
    });
    return Cypress.Cy.extend({
      matchesFixture: function(fixture) {
        return fixturesRe.test(fixture);
      },
      parseFixture: function(fixture) {
        return fixture.replace(fixturesRe, "");
      }
    });
  });

}).call(this);
; 
(function() {
  $Cypress.register("LocalStorage", function(Cypress, _, $) {
    var clearLocalStorage;
    clearLocalStorage = function(keys) {
      var local, remote;
      local = window.localStorage;
      remote = this["private"]("window").localStorage;
      Cypress.LocalStorage.setStorages(local, remote);
      Cypress.LocalStorage.clear(keys);
      Cypress.LocalStorage.unsetStorages();
      return remote;
    };
    Cypress.on("test:before:hooks", function() {
      try {
        return clearLocalStorage.call(this, []);
      } catch (error) {
        return null;
      }
    });
    return Cypress.addParentCommand({
      clearLocalStorage: function(keys) {
        var remote;
        if (keys && !_.isString(keys) && !_.isRegExp(keys)) {
          $Cypress.Utils.throwErrByPath("clearLocalStorage.invalid_argument");
        }
        remote = clearLocalStorage.call(this, keys);
        Cypress.Log.command({
          name: "clear ls",
          snapshot: true,
          end: true
        });
        return remote;
      }
    });
  });

}).call(this);
; 
(function() {
  $Cypress.register("Location", function(Cypress, _, $) {
    Cypress.Cy.extend({
      __location: function(win) {
        return win.location.toString();
      },
      _getLocation: function(key, win) {
        var e, location, remoteUrl;
        try {
          remoteUrl = this.__location(win != null ? win : this["private"]("window"));
          location = Cypress.Location.create(remoteUrl);
          if (key) {
            return location[key];
          } else {
            return location;
          }
        } catch (error) {
          e = error;
          return "";
        }
      }
    });
    return Cypress.addParentCommand({
      url: function(options) {
        var getHref, resolveHref;
        if (options == null) {
          options = {};
        }
        _.defaults(options, {
          log: true
        });
        if (options.log !== false) {
          options._log = Cypress.Log.command({
            message: ""
          });
        }
        getHref = (function(_this) {
          return function() {
            return _this._getLocation("href");
          };
        })(this);
        return (resolveHref = (function(_this) {
          return function() {
            return Promise["try"](getHref).then(function(href) {
              return _this.verifyUpcomingAssertions(href, options, {
                onRetry: resolveHref
              });
            });
          };
        })(this))();
      },
      hash: function(options) {
        var getHash, resolveHash;
        if (options == null) {
          options = {};
        }
        _.defaults(options, {
          log: true
        });
        if (options.log !== false) {
          options._log = Cypress.Log.command({
            message: ""
          });
        }
        getHash = (function(_this) {
          return function() {
            return _this._getLocation("hash");
          };
        })(this);
        return (resolveHash = (function(_this) {
          return function() {
            return Promise["try"](getHash).then(function(hash) {
              return _this.verifyUpcomingAssertions(hash, options, {
                onRetry: resolveHash
              });
            });
          };
        })(this))();
      },
      location: function(key, options) {
        var getLocation, resolveLocation;
        if (_.isObject(key) && _.isUndefined(options)) {
          options = key;
        }
        if (options == null) {
          options = {};
        }
        _.defaults(options, {
          log: true
        });
        getLocation = (function(_this) {
          return function() {
            var location, ref, ret;
            location = _this._getLocation();
            return ret = _.isString(key) ? (ref = location[key]) != null ? ref : $Cypress.Utils.throwErrByPath("location.invalid_key", {
              args: {
                key: key
              }
            }) : location;
          };
        })(this);
        if (options.log !== false) {
          options._log = Cypress.Log.command({
            message: key != null ? key : ""
          });
        }
        return (resolveLocation = (function(_this) {
          return function() {
            return Promise["try"](getLocation).then(function(ret) {
              return _this.verifyUpcomingAssertions(ret, options, {
                onRetry: resolveLocation
              });
            });
          };
        })(this))();
      }
    });
  });

}).call(this);
; 
(function() {
  $Cypress.register("Misc", function(Cypress, _, $) {
    Cypress.addDualCommand({
      end: function() {
        return null;
      }
    });
    return Cypress.addParentCommand({
      noop: function(subject) {
        return subject;
      },
      log: function(msg, args) {
        Cypress.Log.command({
          end: true,
          snapshot: true,
          message: [msg, args],
          consoleProps: function() {
            return {
              message: msg,
              args: args
            };
          }
        });
        return null;
      },
      wrap: function(subject, options) {
        var remoteSubject, resolveWrap;
        if (options == null) {
          options = {};
        }
        _.defaults(options, {
          log: true
        });
        remoteSubject = this.getRemotejQueryInstance(subject);
        if (options.log !== false) {
          options._log = Cypress.Log.command();
          if (Cypress.Utils.hasElement(subject)) {
            options._log.set({
              $el: subject
            });
          }
        }
        return (resolveWrap = (function(_this) {
          return function() {
            return _this.verifyUpcomingAssertions(subject, options, {
              onRetry: resolveWrap
            });
          };
        })(this))();
      }
    });
  });

}).call(this);
; 
(function() {
  var slice = [].slice;

  $Cypress.register("Navigation", function(Cypress, _, $, Promise, moment, UrlParse) {
    var commandCausingLoading, hasVisitedAboutBlank, id, overrideRemoteLocationGetters, previousDomainVisited, timedOutWaitingForPageLoad;
    commandCausingLoading = /^(visit|reload)$/;
    id = null;
    previousDomainVisited = false;
    hasVisitedAboutBlank = false;
    Cypress.on("test:before:run", function(test) {
      previousDomainVisited = false;
      return id = test.id;
    });
    Cypress.on("test:before:hooks", function() {
      return hasVisitedAboutBlank = false;
    });
    overrideRemoteLocationGetters = function(cy, contentWindow) {
      var navigated;
      navigated = function(attr, args) {
        return cy.urlChanged(null, {
          by: attr,
          args: args
        });
      };
      return Cypress.Location.override(Cypress, contentWindow, navigated);
    };
    timedOutWaitingForPageLoad = function(ms, log) {
      return $Cypress.Utils.throwErrByPath("navigation.timed_out", {
        onFail: log,
        args: {
          ms: ms
        }
      });
    };
    Cypress.on("before:window:load", function(contentWindow) {
      var current, options, ref, runnable;
      overrideRemoteLocationGetters(this, contentWindow);
      current = this.prop("current");
      if (!current) {
        return;
      }
      runnable = this["private"]("runnable");
      if (!runnable) {
        return;
      }
      options = _.last(current.get("args"));
      return options != null ? (ref = options.onBeforeLoad) != null ? ref.call(runnable.ctx, contentWindow) : void 0 : void 0;
    });
    Cypress.Cy.extend({
      _href: function(win, url) {
        return win.location.href = url;
      },
      _replace: function(win, url) {
        return win.location.replace(url);
      },
      _existing: function() {
        return Cypress.Location.create(window.location.href);
      },
      _src: function($remoteIframe, url) {
        return $remoteIframe.prop("src", url);
      },
      _resolveUrl: function(url) {
        return Cypress.triggerPromise("resolve:url", url).then(function(resp) {
          var err;
          if (resp == null) {
            resp = {};
          }
          switch (false) {
            case !!resp.isOkStatusCode:
              err = new Error;
              err.gotResponse = true;
              _.extend(err, resp);
              throw err;
              break;
            case !!resp.isHtml:
              err = new Error;
              err.invalidContentType = true;
              _.extend(err, resp);
              throw err;
              break;
            default:
              return resp;
          }
        });
      },
      submitting: function(e, options) {
        if (options == null) {
          options = {};
        }
        this.prop("pageChangeEvent", true);
        return Cypress.Log.command({
          type: "parent",
          name: "form sub",
          message: "--submitting form---",
          event: true,
          end: true,
          snapshot: true,
          consoleProps: function() {
            return {
              "Originated From": e.target
            };
          }
        });
      },
      loading: function(options) {
        var current, ready;
        if (options == null) {
          options = {};
        }
        current = this.prop("current");
        if (commandCausingLoading.test(current != null ? current.get("name") : void 0)) {
          return;
        }
        if (!this["private"]("runnable")) {
          return;
        }
        this.prop("pageChangeEvent", true);
        _.defaults(options, {
          timeout: Cypress.config("pageLoadTimeout")
        });
        options._log = Cypress.Log.command({
          type: "parent",
          name: "page load",
          message: "--waiting for new page to load---",
          event: true,
          consoleProps: function() {
            return {
              "Notes": "This page event automatically nulls the current subject. This prevents chaining off of DOM objects which existed on the previous page."
            };
          }
        });
        this._clearTimeout();
        ready = this.prop("ready");
        return ready.promise.cancellable().timeout(options.timeout).then((function(_this) {
          return function() {
            options._log.set("message", "--page loaded--").snapshot().end();
            return null;
          };
        })(this))["catch"](Promise.CancellationError, function(err) {})["catch"](Promise.TimeoutError, (function(_this) {
          return function(err) {
            var e;
            try {
              return timedOutWaitingForPageLoad.call(_this, options.timeout, options._log);
            } catch (error) {
              e = error;
              return _this.fail(e);
            }
          };
        })(this))["catch"]((function(_this) {
          return function(err) {
            var e, originPolicy;
            try {
              originPolicy = Cypress.Location.create(window.location.href).originPolicy;
              return Cypress.Utils.throwErrByPath("navigation.cross_origin", {
                onFail: options._log,
                args: {
                  message: err.message,
                  originPolicy: originPolicy
                }
              });
            } catch (error) {
              e = error;
              return _this.fail(e);
            }
          };
        })(this));
      }
    });
    return Cypress.addParentCommand({
      reload: function() {
        var args, cleanup, forceReload, options, p, throwArgsErr;
        args = 1 <= arguments.length ? slice.call(arguments, 0) : [];
        throwArgsErr = (function(_this) {
          return function() {
            return $Cypress.Utils.throwErrByPath("reload.invalid_arguments");
          };
        })(this);
        switch (args.length) {
          case 0:
            forceReload = false;
            options = {};
            break;
          case 1:
            if (_.isObject(args[0])) {
              options = args[0];
            } else {
              forceReload = args[0];
            }
            break;
          case 2:
            forceReload = args[0];
            options = args[1];
            break;
          default:
            throwArgsErr();
        }
        this._clearTimeout();
        cleanup = null;
        return p = new Promise((function(_this) {
          return function(resolve, reject) {
            var loaded;
            if (forceReload == null) {
              forceReload = false;
            }
            if (options == null) {
              options = {};
            }
            _.defaults(options, {
              log: true,
              timeout: Cypress.config("pageLoadTimeout")
            });
            if (!_.isBoolean(forceReload)) {
              throwArgsErr();
            }
            if (!_.isObject(options)) {
              throwArgsErr();
            }
            if (options.log) {
              options._log = Cypress.Log.command();
              options._log.snapshot("before", {
                next: "after"
              });
            }
            cleanup = function() {
              return Cypress.off("load", loaded);
            };
            loaded = function() {
              cleanup();
              return resolve(_this["private"]("window"));
            };
            Cypress.on("load", loaded);
            return _this["private"]("window").location.reload(forceReload);
          };
        })(this)).timeout(options.timeout)["catch"](Promise.TimeoutError, (function(_this) {
          return function(err) {
            cleanup();
            return timedOutWaitingForPageLoad.call(_this, options.timeout, options._log);
          };
        })(this));
      },
      go: function(numberOrString, options) {
        var goNumber, goString, win;
        if (options == null) {
          options = {};
        }
        _.defaults(options, {
          log: true,
          timeout: Cypress.config("pageLoadTimeout")
        });
        if (options.log) {
          options._log = Cypress.Log.command();
        }
        win = this["private"]("window");
        goNumber = (function(_this) {
          return function(num) {
            var beforeUnload, cleanup, didUnload, pending, resolve;
            if (num === 0) {
              $Cypress.Utils.throwErrByPath("go.invalid_number", {
                onFail: options._log
              });
            }
            didUnload = false;
            pending = Promise.pending();
            beforeUnload = function() {
              return didUnload = true;
            };
            resolve = function() {
              return pending.resolve();
            };
            Cypress.on("before:unload", beforeUnload);
            Cypress.on("load", resolve);
            _this._clearTimeout();
            win.history.go(num);
            cleanup = function() {
              Cypress.off("load", resolve);
              return _this["private"]("window");
            };
            return Promise.delay(100).then(function() {
              Cypress.off("before:unload", beforeUnload);
              if (didUnload) {
                return pending.promise.then(cleanup);
              } else {
                return cleanup();
              }
            }).timeout(options.timeout)["catch"](Promise.TimeoutError, function(err) {
              cleanup();
              return timedOutWaitingForPageLoad.call(_this, options.timeout, options._log);
            });
          };
        })(this);
        goString = (function(_this) {
          return function(str) {
            switch (str) {
              case "forward":
                return goNumber(1);
              case "back":
                return goNumber(-1);
              default:
                return $Cypress.Utils.throwErrByPath("go.invalid_direction", {
                  onFail: options._log,
                  args: {
                    str: str
                  }
                });
            }
          };
        })(this);
        switch (false) {
          case !_.isFinite(numberOrString):
            return goNumber(numberOrString);
          case !_.isString(numberOrString):
            return goString(numberOrString);
          default:
            return $Cypress.Utils.throwErrByPath("go.invalid_argument", {
              onFail: options._log
            });
        }
      },
      visit: function(url, options) {
        var $remoteIframe, baseUrl, consoleProps, p, prevTimeout, runnable, v, win;
        if (options == null) {
          options = {};
        }
        if (!_.isString(url)) {
          $Cypress.Utils.throwErrByPath("visit.invalid_1st_arg");
        }
        _.defaults(options, {
          log: true,
          timeout: Cypress.config("pageLoadTimeout"),
          onBeforeLoad: function() {},
          onLoad: function() {}
        });
        consoleProps = {};
        if (options.log) {
          options._log = Cypress.Log.command({
            consoleProps: function() {
              return consoleProps;
            }
          });
        }
        url = Cypress.Location.normalize(url);
        if (baseUrl = Cypress.config("baseUrl")) {
          url = Cypress.Location.qualifyWithBaseUrl(baseUrl, url);
        }
        prevTimeout = this._timeout();
        this._clearTimeout();
        win = this["private"]("window");
        $remoteIframe = this["private"]("$remoteIframe");
        runnable = this["private"]("runnable");
        v = null;
        p = new Promise((function(_this) {
          return function(resolve, reject) {
            var bothUrlsMatchAndRemoteHasHash, cannotVisit2ndDomain, gotInvalidContentType, gotResponse, visit, visitFailedByErr;
            visitFailedByErr = function(err, url, fn) {
              var e;
              err.url = url;
              Cypress.trigger("visit:failed", err);
              try {
                return fn();
              } catch (error) {
                e = error;
                return reject(e);
              }
            };
            cannotVisit2ndDomain = function(origin) {
              var e;
              try {
                return $Cypress.Utils.throwErrByPath("visit.cannot_visit_2nd_domain", {
                  onFail: options._log,
                  args: {
                    previousDomain: previousDomainVisited,
                    attemptedDomain: origin
                  }
                });
              } catch (error) {
                e = error;
                return reject(e);
              }
            };
            gotResponse = function(err) {
              return err.gotResponse === true;
            };
            gotInvalidContentType = function(err) {
              return err.invalidContentType === true;
            };
            bothUrlsMatchAndRemoteHasHash = function(current, remote) {
              return (remote.hash || remote.href.slice(-1) === "#") && (current.origin === remote.origin) && (current.pathname === remote.pathname) && (current.search === remote.search);
            };
            visit = function(win, url, options) {
              var current, existing, existingHash, onLoad, ref, remote, remoteUrl;
              onLoad = function() {
                var ref;
                _this._timeout(prevTimeout);
                if ((ref = options.onLoad) != null) {
                  ref.call(runnable.ctx, win);
                }
                if (options._log) {
                  options._log.set({
                    url: url
                  });
                }
                return resolve(win);
              };
              existing = _this._existing();
              if (!Cypress.Location.isFullyQualifiedUrl(url)) {
                remoteUrl = Cypress.Location.fullyQualifyUrl(url);
              }
              remote = Cypress.Location.create(remoteUrl != null ? remoteUrl : url);
              existingHash = (ref = remote.hash) != null ? ref : "";
              if (previousDomainVisited && remote.originPolicy !== existing.originPolicy) {
                return cannotVisit2ndDomain(remote.origin);
              }
              current = Cypress.Location.create(win.location.href);
              if (bothUrlsMatchAndRemoteHasHash(current, remote)) {
                _this._src($remoteIframe, remote.href);
                return onLoad();
              }
              if (existingHash) {
                url = url.replace(existingHash, "");
              }
              return _this._resolveUrl(url).then(function(resp) {
                var cookies, filePath, indicateRedirects, originalUrl, redirects;
                if (resp == null) {
                  resp = {};
                }
                url = resp.url, originalUrl = resp.originalUrl, cookies = resp.cookies, redirects = resp.redirects, filePath = resp.filePath;
                url += existingHash;
                originalUrl += existingHash;
                if (filePath) {
                  consoleProps["File Served"] = filePath;
                } else {
                  if (url !== originalUrl) {
                    consoleProps["Original Url"] = originalUrl;
                  }
                }
                if (options.log && redirects && redirects.length) {
                  indicateRedirects = function() {
                    return [originalUrl].concat(redirects).join(" -> ");
                  };
                  options._log.set({
                    message: indicateRedirects()
                  });
                }
                consoleProps["Resolved Url"] = url;
                consoleProps["Redirects"] = redirects;
                consoleProps["Cookies Set"] = cookies;
                remote = Cypress.Location.create(url);
                if (remote.originPolicy === existing.originPolicy) {
                  previousDomainVisited = remote.origin;
                  url = Cypress.Location.fullyQualifyUrl(url);
                  $remoteIframe.one("load", onLoad);
                  return _this._src($remoteIframe, url);
                } else {
                  if (previousDomainVisited) {
                    return cannotVisit2ndDomain(remote.origin);
                  }
                  return new Promise(function(resolve) {
                    var promises, state;
                    state = {
                      currentId: id,
                      tests: Cypress.getTestsState(),
                      startTime: Cypress.getStartTime(),
                      emissions: Cypress.getEmissions()
                    };
                    state.passed = Cypress.countByTestState(state.tests, "passed");
                    state.failed = Cypress.countByTestState(state.tests, "failed");
                    state.pending = Cypress.countByTestState(state.tests, "pending");
                    state.numLogs = Cypress.Log.countLogsByTests(state.tests);
                    promises = Cypress.invoke("collect:run:state");
                    return Promise.all(promises).then(function(a) {
                      if (a == null) {
                        a = [];
                      }
                      state = _.reduce(a, function(memo, obj) {
                        return _.extend(memo, obj);
                      }, state);
                      return Cypress.trigger("preserve:run:state", state, resolve);
                    });
                  }).then(function() {
                    var newUri;
                    newUri = new UrlParse(remote.origin);
                    newUri.set("pathname", existing.pathname).set("query", existing.search).set("hash", existing.hash);
                    return _this._href(window, newUri.toString());
                  });
                }
              })["catch"](gotResponse, gotInvalidContentType, function(err) {
                return visitFailedByErr(err, err.originalUrl, function() {
                  var args, msg, type;
                  args = {
                    url: err.originalUrl,
                    path: err.filePath,
                    status: err.status,
                    statusText: err.statusText,
                    redirects: err.redirects,
                    contentType: err.contentType
                  };
                  msg = (function() {
                    switch (false) {
                      case !err.gotResponse:
                        type = err.filePath ? "file" : "http";
                        return "visit.loading_" + type + "_failed";
                      case !err.invalidContentType:
                        return "visit.loading_invalid_content_type";
                    }
                  })();
                  return $Cypress.Utils.throwErrByPath(msg, {
                    onFail: options._log,
                    args: args
                  });
                });
              })["catch"](function(err) {
                return visitFailedByErr(err, url, function() {
                  return $Cypress.Utils.throwErrByPath("visit.loading_network_failed", {
                    onFail: options._log,
                    args: {
                      url: url,
                      error: err,
                      stack: err.stack
                    }
                  });
                });
              });
            };
            if (!hasVisitedAboutBlank) {
              hasVisitedAboutBlank = true;
              $remoteIframe.one("load", function() {
                return v = visit(win, url, options);
              });
              return _this._href(win, "about:blank");
            } else {
              return v = visit(win, url, options);
            }
          };
        })(this));
        return p.timeout(options.timeout)["catch"](Promise.TimeoutError, (function(_this) {
          return function(err) {
            v && (typeof v.cancel === "function" ? v.cancel() : void 0);
            $remoteIframe.off("load");
            return timedOutWaitingForPageLoad.call(_this, options.timeout, options._log);
          };
        })(this));
      }
    });
  });

}).call(this);
; 
(function() {
  $Cypress.register("Querying", function(Cypress, _, $) {
    var $contains, $expr, priorityElement, restoreContains;
    priorityElement = "input[type='submit'], button, a, label";
    $expr = $.expr[":"];
    $contains = $expr.contains;
    restoreContains = function() {
      return $expr.contains = $contains;
    };
    Cypress.on("abort", restoreContains);
    Cypress.addParentCommand({
      get: function(selector, options) {
        var alias, aliasObj, command, consoleProps, getElements, log, resolveAlias, resolveElements, setEl, start, subject;
        if (options == null) {
          options = {};
        }
        _.defaults(options, {
          retry: true,
          withinSubject: this.prop("withinSubject"),
          log: true,
          command: null,
          verify: true
        });
        this.ensureNoCommandOptions(options);
        consoleProps = {};
        start = function(aliasType) {
          if (options.log === false) {
            return;
          }
          return options._log != null ? options._log : options._log = Cypress.Log.command({
            message: selector,
            referencesAlias: typeof aliasObj !== "undefined" && aliasObj !== null ? aliasObj.alias : void 0,
            aliasType: aliasType,
            consoleProps: function() {
              return consoleProps;
            }
          });
        };
        log = function(value, aliasType) {
          var obj;
          if (aliasType == null) {
            aliasType = "dom";
          }
          if (options.log === false) {
            return;
          }
          if (!_.isObject(options._log)) {
            start(aliasType);
          }
          obj = {};
          if (aliasType === "dom") {
            _.extend(obj, {
              $el: value,
              numRetries: options._retries
            });
          }
          obj.consoleProps = function() {
            var key;
            key = aliasObj ? "Alias" : "Selector";
            consoleProps[key] = selector;
            switch (aliasType) {
              case "dom":
                _.extend(consoleProps, {
                  Returned: Cypress.Utils.getDomElements(value),
                  Elements: value != null ? value.length : void 0
                });
                break;
              case "primitive":
                _.extend(consoleProps, {
                  Returned: value
                });
                break;
              case "route":
                _.extend(consoleProps, {
                  Returned: value
                });
            }
            return consoleProps;
          };
          return options._log.set(obj);
        };
        if (aliasObj = this.getAlias(selector.split(".")[0])) {
          subject = aliasObj.subject, alias = aliasObj.alias, command = aliasObj.command;
          return (resolveAlias = (function(_this) {
            return function() {
              var ref, replay, replayFrom, responses;
              switch (false) {
                case !Cypress.Utils.hasElement(subject):
                  replayFrom = false;
                  replay = function() {
                    _this._replayFrom(command);
                    return null;
                  };
                  if (!_this._contains(subject)) {
                    subject = subject.filter(function(index, el) {
                      return _this._contains(el);
                    });
                    if (!subject.length) {
                      return replay();
                    }
                  }
                  log(subject);
                  return _this.verifyUpcomingAssertions(subject, options, {
                    onFail: function(err) {
                      if (err.type === "length" && err.actual < err.expected) {
                        return replayFrom = true;
                      }
                    },
                    onRetry: function() {
                      if (replayFrom) {
                        return replay();
                      } else {
                        return resolveAlias();
                      }
                    }
                  });
                case command.get("name") !== "route":
                  alias = _.compact([alias, selector.split(".")[1]]).join(".");
                  responses = (ref = _this.getResponsesByAlias(alias)) != null ? ref : null;
                  log(responses, "route");
                  return responses;
                default:
                  log(subject, "primitive");
                  return subject;
              }
            };
          })(this))();
        }
        start("dom");
        setEl = function($el) {
          if (options.log === false) {
            return;
          }
          consoleProps.Returned = Cypress.Utils.getDomElements($el);
          consoleProps.Elements = $el != null ? $el.length : void 0;
          return options._log.set({
            $el: $el
          });
        };
        getElements = (function(_this) {
          return function() {
            var $el, e, filtered, ret;
            try {
              $el = _this.$$(selector, options.withinSubject);
            } catch (error) {
              e = error;
              e.onFail = function() {
                return options._log.error(e);
              };
              throw e;
            }
            if (!$el.length && options.withinSubject && options.filter) {
              filtered = options.withinSubject.filter(selector);
              if (filtered.length) {
                $el = filtered;
              }
            }
            setEl($el);
            if (_.isFunction(options.onRetry)) {
              if (ret = options.onRetry.call(_this, $el)) {
                log($el);
                return ret;
              }
            } else {
              log($el);
              return $el;
            }
          };
        })(this);
        return (resolveElements = (function(_this) {
          return function() {
            return Promise["try"](getElements).then(function($el) {
              if (options.verify === false) {
                return $el;
              }
              return _this.verifyUpcomingAssertions($el, options, {
                onRetry: resolveElements
              });
            });
          };
        })(this))();
      },
      root: function(options) {
        var log, withinSubject;
        if (options == null) {
          options = {};
        }
        _.defaults(options, {
          log: true
        });
        if (options.log !== false) {
          options._log = Cypress.Log.command({
            message: ""
          });
        }
        log = function($el) {
          if (options.log) {
            options._log.set({
              $el: $el
            });
          }
          return $el;
        };
        if (withinSubject = this.prop("withinSubject")) {
          return log(withinSubject);
        }
        return this.execute("get", "html", {
          log: false
        }).then(log);
      }
    });
    Cypress.addDualCommand({
      contains: function(subject, filter, text, options) {
        var checkToAutomaticallyRetry, consoleProps, getErr, getFirstDeepestElement, getOpts, getPhrase, resolveElements, selector, setEl;
        if (options == null) {
          options = {};
        }
        if (subject && !Cypress.Utils.hasElement(subject)) {
          subject = null;
        }
        switch (false) {
          case !_.isObject(text):
            options = text;
            text = filter;
            filter = "";
            break;
          case !_.isUndefined(text):
            text = filter;
            filter = "";
        }
        _.defaults(options, {
          log: true
        });
        this.ensureNoCommandOptions(options);
        if (!(_.isString(text) || _.isFinite(text) || _.isRegExp(text))) {
          $Cypress.Utils.throwErrByPath("contains.invalid_argument");
        }
        if (_.isBlank(text)) {
          $Cypress.Utils.throwErrByPath("contains.empty_string");
        }
        getPhrase = function(type, negated) {
          var node;
          switch (false) {
            case !(filter && subject):
              node = Cypress.Utils.stringifyElement(subject, "short");
              return "within the element: " + node + " and with the selector: '" + filter + "' ";
            case !filter:
              return "within the selector: '" + filter + "' ";
            case !subject:
              node = Cypress.Utils.stringifyElement(subject, "short");
              return "within the element: " + node + " ";
            default:
              return "";
          }
        };
        getErr = function(err) {
          var negated, node, type;
          type = err.type, negated = err.negated, node = err.node;
          switch (type) {
            case "existence":
              if (negated) {
                return "Expected not to find content: '" + text + "' " + (getPhrase(type, negated)) + "but continuously found it.";
              } else {
                return "Expected to find content: '" + text + "' " + (getPhrase(type, negated)) + "but never did.";
              }
          }
        };
        if (options.log !== false) {
          consoleProps = {
            Content: text,
            "Applied To": Cypress.Utils.getDomElements(subject || this.prop("withinSubject"))
          };
          options._log = Cypress.Log.command({
            message: _.compact([filter, text]),
            type: subject ? "child" : "parent",
            consoleProps: function() {
              return consoleProps;
            }
          });
        }
        getOpts = _.extend(_.clone(options), {
          withinSubject: subject || this.prop("withinSubject") || this.$$("body"),
          filter: true,
          log: false,
          verify: false
        });
        setEl = function($el) {
          if (options.log === false) {
            return;
          }
          consoleProps.Returned = Cypress.Utils.getDomElements($el);
          consoleProps.Elements = $el != null ? $el.length : void 0;
          return options._log.set({
            $el: $el
          });
        };
        getFirstDeepestElement = function(elements, index) {
          var $current, $next, $priorities;
          if (index == null) {
            index = 0;
          }
          $current = elements.slice(index, index + 1);
          $next = elements.slice(index + 1, index + 2);
          if (!$next) {
            return $current;
          }
          if ($.contains($current.get(0), $next.get(0))) {
            return getFirstDeepestElement(elements, index + 1);
          } else {
            if ($current.is(priorityElement)) {
              return $current;
            }
            $priorities = elements.filter($current.parents(priorityElement));
            if ($priorities.length) {
              return $priorities.last();
            } else {
              return $current;
            }
          }
        };
        if (_.isRegExp(text)) {
          $expr.contains = function(elem) {
            return text.test(elem.textContent || elem.innerText || $.text(elem));
          };
        } else {
          text = Cypress.Utils.escapeQuotes(text);
        }
        selector = filter + ":not(script):contains('" + text + "'), " + filter + "[type='submit'][value~='" + text + "']";
        checkToAutomaticallyRetry = function(count, $el) {
          if (count !== 0 || ($el && $el.length)) {
            return;
          }
          throw new Error();
        };
        resolveElements = (function(_this) {
          return function() {
            return _this.execute("get", selector, getOpts).then(function($elements) {
              var $el;
              $el = (function() {
                switch (false) {
                  case !($elements && $elements.length):
                    return getFirstDeepestElement($elements);
                  default:
                    return $elements;
                }
              })();
              setEl($el);
              return _this.verifyUpcomingAssertions($el, options, {
                onRetry: resolveElements,
                onFail: function(err) {
                  switch (err.type) {
                    case "length":
                      if (err.expected > 1) {
                        return $Cypress.Utils.throwErrByPath("contains.length_option", {
                          onFail: options._log
                        });
                      }
                      break;
                    case "existence":
                      return err.displayMessage = getErr(err);
                  }
                }
              });
            });
          };
        })(this);
        return Promise["try"](resolveElements)["finally"](function() {
          return restoreContains();
        });
      }
    });
    return Cypress.addChildCommand({
      within: function(subject, options, fn) {
        var next, prevWithinSubject, setWithinSubject, stop;
        this.ensureDom(subject);
        if (_.isUndefined(fn)) {
          fn = options;
          options = {};
        }
        _.defaults(options, {
          log: true
        });
        if (options.log) {
          options._log = Cypress.Log.command({
            $el: subject,
            message: ""
          });
        }
        if (!_.isFunction(fn)) {
          $Cypress.Utils.throwErrByPath("within.invalid_argument", {
            onFail: options._log
          });
        }
        next = this.prop("current").get("next");
        prevWithinSubject = this.prop("withinSubject");
        this.prop("withinSubject", subject);
        fn.call(this["private"]("runnable").ctx, subject);
        stop = (function(_this) {
          return function() {
            return _this.off("command:start", setWithinSubject);
          };
        })(this);
        setWithinSubject = function(obj) {
          if (obj !== next) {
            return;
          }
          if (next !== this.prop("nextWithinSubject")) {
            this.prop("withinSubject", prevWithinSubject || null);
            this.prop("nextWithinSubject", next);
          }
          return stop();
        };
        if (next) {
          this.on("command:start", setWithinSubject);
        } else {
          this.once("end", function() {
            stop();
            return this.prop("withinSubject", null);
          });
        }
        return subject;
      }
    });
  });

}).call(this);
; 
(function() {
  var indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; },
    slice = [].slice;

  $Cypress.register("Request", function(Cypress, _, $) {
    var OPTIONAL_OPTS, REQUEST_DEFAULTS, REQUEST_PROPS, argIsHttpMethod, isOptional, isValidJsonObj, request, responseFailed, validHttpMethodsRe, whichAreOptional;
    validHttpMethodsRe = /^(GET|POST|PUT|DELETE|PATCH|HEAD|OPTIONS)$/;
    isOptional = function(memo, val, key) {
      if (_.isNull(val)) {
        memo.push(key);
      }
      return memo;
    };
    REQUEST_DEFAULTS = {
      url: "",
      method: "GET",
      qs: null,
      body: null,
      auth: null,
      headers: null,
      json: null,
      form: null,
      gzip: true,
      followRedirect: true
    };
    REQUEST_PROPS = _.keys(REQUEST_DEFAULTS);
    OPTIONAL_OPTS = _.reduce(REQUEST_DEFAULTS, isOptional, []);
    request = (function(_this) {
      return function(options) {
        return Cypress.triggerPromise("request", options);
      };
    })(this);
    responseFailed = function(err) {
      return err.triggerPromise === true;
    };
    argIsHttpMethod = function(str) {
      return _.isString(str) && validHttpMethodsRe.test(str.toUpperCase());
    };
    isValidJsonObj = function(body) {
      return _.isObject(body) && !_.isFunction(body);
    };
    whichAreOptional = function(val, key) {
      return val === null && indexOf.call(OPTIONAL_OPTS, key) >= 0;
    };
    return Cypress.addParentCommand({
      request: function() {
        var a, args, f, h, o, options, originOrBase, requestOpts;
        args = 1 <= arguments.length ? slice.call(arguments, 0) : [];
        options = o = {};
        switch (false) {
          case !_.isObject(args[0]):
            _.extend(options, args[0]);
            break;
          case args.length !== 1:
            o.url = args[0];
            break;
          case args.length !== 2:
            if (argIsHttpMethod(args[0])) {
              o.method = args[0];
              o.url = args[1];
            } else {
              o.url = args[0];
              o.body = args[1];
            }
            break;
          case args.length !== 3:
            o.method = args[0];
            o.url = args[1];
            o.body = args[2];
        }
        _.defaults(options, REQUEST_DEFAULTS, {
          log: true,
          timeout: Cypress.config("responseTimeout"),
          failOnStatusCode: true
        });
        options.method = options.method.toUpperCase();
        if (_.has(options, "failOnStatus")) {
          $Cypress.Utils.warning("The cy.request() 'failOnStatus' option has been renamed to 'failOnStatusCode'. Please update your code. This option will be removed at a later time.");
          options.failOnStatusCode = options.failOnStatus;
        }
        if (_.has(options, "followRedirects")) {
          options.followRedirect = options.followRedirects;
        }
        if (!validHttpMethodsRe.test(options.method)) {
          $Cypress.Utils.throwErrByPath("request.invalid_method", {
            args: {
              method: o.method
            }
          });
        }
        if (!options.url) {
          $Cypress.Utils.throwErrByPath("request.url_missing");
        }
        if (!_.isString(options.url)) {
          $Cypress.Utils.throwErrByPath("request.url_wrong_type");
        }
        options.url = Cypress.Location.normalize(options.url);
        if (originOrBase = this.Cypress.config("baseUrl") || this._getLocation("origin")) {
          options.url = Cypress.Location.qualifyWithBaseUrl(originOrBase, options.url);
        }
        if (!Cypress.Location.isFullyQualifiedUrl(options.url)) {
          $Cypress.Utils.throwErrByPath("request.url_invalid");
        }
        if (options.form !== true && isValidJsonObj(options.body)) {
          options.json = true;
        }
        options = _.omit(options, whichAreOptional);
        if (a = options.auth) {
          if (!_.isObject(a)) {
            $Cypress.Utils.throwErrByPath("request.auth_invalid");
          }
        }
        if (h = options.headers) {
          if (_.isObject(h)) {
            options.headers = h;
          } else {
            $Cypress.Utils.throwErrByPath("request.headers_invalid");
          }
        }
        if (!_.isBoolean(options.gzip)) {
          $Cypress.Utils.throwErrByPath("request.gzip_invalid");
        }
        if (f = options.form) {
          if (!_.isBoolean(f)) {
            $Cypress.Utils.throwErrByPath("request.form_invalid");
          }
        }
        requestOpts = _(options).pick(REQUEST_PROPS);
        if (options.log) {
          options._log = Cypress.Log.command({
            message: "",
            consoleProps: function() {
              var obj, ref, ref1, resp, rr, word;
              resp = (ref = options.response) != null ? ref : {};
              rr = (ref1 = resp.allRequestResponses) != null ? ref1 : [];
              obj = {};
              word = $Cypress.Utils.plural(rr.length, "Requests", "Request");
              rr = rr.length === 1 ? rr[0] : rr;
              obj[word] = rr;
              obj["Returned"] = _.pick(resp, "status", "duration", "body", "headers");
              return obj;
            },
            renderProps: function() {
              var indicator, r, ref, status;
              status = (function() {
                switch (false) {
                  case !(r = options.response):
                    return r.status;
                  default:
                    indicator = "pending";
                    return "---";
                }
              })();
              if (indicator == null) {
                indicator = ((ref = options.response) != null ? ref.isOkStatusCode : void 0) ? "successful" : "bad";
              }
              return {
                message: options.method + " " + status + " " + (_.truncate(options.url, 25)),
                indicator: indicator
              };
            }
          });
        }
        this._clearTimeout();
        return request(requestOpts).timeout(options.timeout).then((function(_this) {
          return function(response) {
            options.response = response;
            if (options.failOnStatusCode && response.isOkStatusCode !== true) {
              $Cypress.Utils.throwErrByPath("request.status_invalid", {
                onFail: options._log,
                args: {
                  method: requestOpts.method,
                  url: requestOpts.url,
                  requestBody: response.requestBody,
                  requestHeaders: response.requestHeaders,
                  status: response.status,
                  statusText: response.statusText,
                  responseBody: response.body,
                  responseHeaders: response.headers,
                  redirects: response.redirects
                }
              });
            }
            return response;
          };
        })(this))["catch"](Promise.TimeoutError, (function(_this) {
          return function(err) {
            return $Cypress.Utils.throwErrByPath("request.timed_out", {
              onFail: options._log,
              args: {
                url: requestOpts.url,
                method: requestOpts.method,
                timeout: options.timeout
              }
            });
          };
        })(this))["catch"](responseFailed, function(err) {
          return $Cypress.Utils.throwErrByPath("request.loading_failed", {
            onFail: options._log,
            args: {
              error: err.message,
              stack: err.stack,
              method: requestOpts.method,
              url: requestOpts.url
            }
          });
        });
      }
    });
  });

}).call(this);
; 
(function() {
  $Cypress.register("Sandbox", function(Cypress, _, $) {
    return (function(sinon) {
      var createSandbox;
      createSandbox = function(sinon) {
        $Cypress.Sinon.override(sinon);
        return sinon.sandbox.create();
      };
      Cypress.on("restore", function() {
        var sandbox;
        if (!this.prop) {
          return;
        }
        if (sandbox = this.prop("sandbox")) {
          return sandbox.restore();
        }
      });
      return Cypress.Cy.extend({
        _getSandbox: function() {
          var ref, sandbox;
          sandbox = (ref = this.prop("sandbox")) != null ? ref : createSandbox(sinon);
          return this.prop("sandbox", sandbox);
        }
      });
    })(sinon);
  });

}).call(this);
; 
(function() {
  $Cypress.register("Screenshot", function(Cypress, _, $, Promise, moment) {
    Cypress.on("test:after:hooks", function(test, runnable) {
      if (test.err && $Cypress.isHeadless && Cypress.config("screenshotOnHeadlessFailure")) {
        return Promise.delay(75).then((function(_this) {
          return function() {
            return _this._takeScreenshot(runnable);
          };
        })(this));
      }
    });
    Cypress.Cy.extend({
      _takeScreenshot: function(runnable, name, log, timeout) {
        var automate, getParentTitle, props, titles;
        titles = [runnable.title];
        getParentTitle = function(runnable) {
          var p, t;
          if (p = runnable.parent) {
            if (t = p.title) {
              titles.unshift(t);
            }
            return getParentTitle(p);
          }
        };
        getParentTitle(runnable);
        props = {
          name: name,
          titles: titles,
          testId: runnable.id
        };
        automate = function() {
          return new Promise(function(resolve, reject) {
            var fn;
            fn = (function(_this) {
              return function(resp) {
                var e, err;
                if (e = resp.__error) {
                  err = $Cypress.Utils.cypressErr(e);
                  err.name = resp.__name;
                  err.stack = resp.__stack;
                  try {
                    return $Cypress.Utils.throwErr(err, {
                      onFail: log
                    });
                  } catch (error) {
                    e = error;
                    return reject(e);
                  }
                } else {
                  return resolve(resp.response);
                }
              };
            })(this);
            return Cypress.trigger("take:screenshot", props, fn);
          });
        };
        if (!timeout) {
          return automate();
        } else {
          this._clearTimeout();
          return automate().timeout(timeout)["catch"](Promise.TimeoutError, function(err) {
            return $Cypress.Utils.throwErrByPath("screenshot.timed_out", {
              onFail: log,
              args: {
                timeout: timeout
              }
            });
          });
        }
      }
    });
    return Cypress.addParentCommand({
      screenshot: function(name, options) {
        var consoleProps, runnable;
        if (options == null) {
          options = {};
        }
        if (_.isObject(name)) {
          options = name;
          name = null;
        }
        runnable = this["private"]("runnable");
        _.defaults(options, {
          log: true,
          timeout: Cypress.config("responseTimeout")
        });
        if (options.log) {
          consoleProps = {};
          options._log = Cypress.Log.command({
            message: name,
            consoleProps: function() {
              return consoleProps;
            }
          });
        }
        return this._takeScreenshot(runnable, name, options._log, options.timeout).then(function(resp) {
          return _.extend(consoleProps, {
            Saved: resp.path,
            Size: resp.size
          });
        })["return"](null);
      }
    });
  });

}).call(this);
; 
(function() {
  $Cypress.register("Traversals", function(Cypress, _, $) {
    var traversals;
    traversals = "find filter not children eq closest first last next parent parents prev siblings".split(" ");
    return _.each(traversals, function(traversal) {
      return Cypress.addChildCommand(traversal, function(subject, arg1, arg2, options) {
        var consoleProps, getElements, getSelector, setEl;
        this.ensureDom(subject);
        if (_.isObject(arg2)) {
          options = arg2;
        }
        if (_.isObject(arg1)) {
          options = arg1;
        }
        if (options == null) {
          options = {};
        }
        _.defaults(options, {
          log: true
        });
        this.ensureNoCommandOptions(options);
        getSelector = function() {
          var args;
          args = _([arg1, arg2]).chain().reject(_.isFunction).reject(_.isObject).value();
          args = _(args).without(null, void 0);
          return args.join(", ");
        };
        consoleProps = {
          Selector: getSelector(),
          "Applied To": $Cypress.Utils.getDomElements(subject)
        };
        if (options.log !== false) {
          options._log = Cypress.Log.command({
            message: getSelector(),
            consoleProps: function() {
              return consoleProps;
            }
          });
        }
        setEl = function($el) {
          if (options.log === false) {
            return;
          }
          consoleProps.Returned = Cypress.Utils.getDomElements($el);
          consoleProps.Elements = $el != null ? $el.length : void 0;
          return options._log.set({
            $el: $el
          });
        };
        return (getElements = (function(_this) {
          return function() {
            var $el, e;
            try {
              $el = subject[traversal].call(subject, arg1, arg2);
              $el.selector = getSelector();
            } catch (error) {
              e = error;
              e.onFail = function() {
                return options._log.error(e);
              };
              throw e;
            }
            setEl($el);
            return _this.verifyUpcomingAssertions($el, options, {
              onRetry: getElements,
              onFail: function(err) {
                var node;
                if (err.type === "existence") {
                  node = $Cypress.Utils.stringifyElement(subject, "short");
                  return err.displayMessage += " Queried from element: " + node;
                }
              }
            });
          };
        })(this))();
      });
    });
  });

}).call(this);
; 
(function() {
  $Cypress.register("Waiting", function(Cypress, _, $, Promise) {
    Cypress.addDualCommand({
      wait: function(subject, msOrFnOrAlias, options) {
        var args;
        if (options == null) {
          options = {};
        }
        if (msOrFnOrAlias == null) {
          msOrFnOrAlias = 1e9;
        }
        if (_.isString(options)) {
          $Cypress.Utils.throwErrByPath("wait.invalid_arguments");
        }
        _.defaults(options, {
          log: true
        });
        args = [subject, msOrFnOrAlias, options];
        switch (false) {
          case !_.isNumber(msOrFnOrAlias):
            return this._waitNumber.apply(this, args);
          case !_.isFunction(msOrFnOrAlias):
            return this._waitFunction.apply(this, args);
          case !_.isString(msOrFnOrAlias):
            return this._waitString.apply(this, args);
          case !_.isArray(msOrFnOrAlias):
            return this._waitString.apply(this, args);
          default:
            return $Cypress.Utils.throwErrByPath("wait.invalid_1st_arg");
        }
      }
    });
    return Cypress.Cy.extend({
      _waitNumber: function(subject, ms, options) {
        this._timeout(ms, true);
        if (options.log !== false) {
          options._log = Cypress.Log.command({
            consoleProps: function() {
              return {
                "Waited For": ms + "ms before continuing",
                "Returned": subject
              };
            }
          });
        }
        return Promise.delay(ms)["return"](subject);
      },
      _waitFunction: function(subject, fn, options) {
        return $Cypress.Utils.throwErrByPath("wait.fn_deprecated");
      },
      _waitString: function(subject, str, options) {
        var checkForXhr, getNumRequests, log, waitForXhr, xhrs;
        if (options.log !== false) {
          log = options._log = Cypress.Log.command({
            type: "parent",
            aliasType: "route"
          });
        }
        getNumRequests = (function(_this) {
          return function(alias) {
            var ref, requests;
            requests = (ref = _this.prop("aliasRequests")) != null ? ref : {};
            if (requests[alias] == null) {
              requests[alias] = 0;
            }
            requests[alias] += 1;
            _this.prop("aliasRequests", requests);
            return _.ordinalize(requests[alias]);
          };
        })(this);
        checkForXhr = function(alias, type, num, options) {
          var args, xhr;
          options.type = type;
          xhr = this.getLastXhrByAlias(alias + "." + type);
          if (xhr) {
            return Promise.resolve(xhr);
          }
          options.error = $Cypress.Utils.errMessageByPath("wait.timed_out", {
            timeout: options.timeout,
            alias: alias,
            num: num,
            type: type
          });
          args = arguments;
          return this._retry(function() {
            args.options = _.omit(options, "timeout");
            return checkForXhr.apply(this, args);
          }, options);
        };
        waitForXhr = function(str, options) {
          var alias, aliasObj, aliases, command, num, ref, ref1, referencesAlias, str2, timeout, type, waitForRequest, waitForResponse;
          ref = str.split("."), str = ref[0], str2 = ref[1];
          if (!(aliasObj = this.getAlias(str, "wait", log))) {
            this.aliasNotFoundFor(str, "wait", log);
          }
          alias = aliasObj.alias, command = aliasObj.command;
          str = _.compact([alias, str2]).join(".");
          type = this.getXhrTypeByAlias(str);
          if (log) {
            referencesAlias = (ref1 = log.get("referencesAlias")) != null ? ref1 : [];
            aliases = [].concat(referencesAlias);
            aliases.push(str);
            log.set("referencesAlias", aliases);
          }
          if (command.get("name") !== "route") {
            $Cypress.Utils.throwErrByPath("wait.invalid_alias", {
              onFail: options._log,
              args: {
                alias: alias
              }
            });
          }
          timeout = options.timeout;
          num = getNumRequests(alias);
          waitForRequest = (function(_this) {
            return function() {
              options = _.omit(options, "_runnableTimeout");
              options.timeout = timeout != null ? timeout : Cypress.config("requestTimeout");
              return checkForXhr.call(_this, alias, "request", num, options);
            };
          })(this);
          waitForResponse = (function(_this) {
            return function() {
              options = _.omit(options, "_runnableTimeout");
              options.timeout = timeout != null ? timeout : Cypress.config("responseTimeout");
              return checkForXhr.call(_this, alias, "response", num, options);
            };
          })(this);
          if (type === "request") {
            return waitForRequest();
          } else {
            return waitForRequest().then(waitForResponse);
          }
        };
        xhrs = [];
        return Promise.map([].concat(str), (function(_this) {
          return function(str) {
            var xhr;
            xhr = Promise.resolve(waitForXhr.call(_this, str, _.omit(options, "error")));
            xhrs.push(xhr);
            return xhr;
          };
        })(this)).then(function(responses) {
          var ret;
          ret = responses.length === 1 ? responses[0] : responses;
          if (options._log) {
            options._log.set("consoleProps", function() {
              return {
                "Waited For": (this.referencesAlias || []).join(", "),
                "Returned": ret
              };
            });
            options._log.snapshot().end();
          }
          return ret;
        })["catch"](function(err) {
          _(xhrs).invoke("cancel");
          throw err;
        });
      }
    });
  });

}).call(this);
; 
(function() {
  var indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };

  $Cypress.register("Window", function(Cypress, _, $) {
    var triggerAndSetViewport, validOrientations, viewportDefaults, viewports;
    viewportDefaults = null;
    viewports = {
      "macbook-15": "1440x900",
      "macbook-13": "1280x800",
      "macbook-11": "1366x768",
      "ipad-2": "768x1024",
      "ipad-mini": "768x1024",
      "iphone-6+": "414x736",
      "iphone-6": "375x667",
      "iphone-5": "320x568",
      "iphone-4": "320x480",
      "iphone-3": "320x480"
    };
    validOrientations = ["landscape", "portrait"];
    Cypress.on("test:before:hooks", function() {
      var d;
      if (d = viewportDefaults) {
        triggerAndSetViewport.call(this, d.viewportWidth, d.viewportHeight);
        return viewportDefaults = null;
      }
    });
    triggerAndSetViewport = function(width, height) {
      var viewport;
      this.Cypress.config("viewportWidth", width);
      this.Cypress.config("viewportHeight", height);
      viewport = {
        viewportWidth: width,
        viewportHeight: height
      };
      Cypress.trigger("viewport", viewport);
      return viewport;
    };
    return Cypress.addParentCommand({
      title: function(options) {
        var resolveTitle;
        if (options == null) {
          options = {};
        }
        _.defaults(options, {
          log: true
        });
        if (options.log) {
          options._log = Cypress.Log.command();
        }
        return (resolveTitle = (function(_this) {
          return function() {
            var doc, title;
            doc = _this["private"]("document");
            title = (doc && doc.title) || "";
            return _this.verifyUpcomingAssertions(title, options, {
              onRetry: resolveTitle
            });
          };
        })(this))();
      },
      window: function(options) {
        var getWindow, retryWindow, verifyAssertions;
        if (options == null) {
          options = {};
        }
        _.defaults(options, {
          log: true
        });
        if (options.log) {
          options._log = Cypress.Log.command();
        }
        getWindow = (function(_this) {
          return function() {
            var window;
            window = _this["private"]("window");
            if (!window) {
              $Cypress.Utils.throwErrByPath("window.iframe_undefined", {
                onFail: options._log
              });
            }
            return window;
          };
        })(this);
        retryWindow = (function(_this) {
          return function() {
            return Promise["try"](getWindow)["catch"](function(err) {
              options.error = err;
              return _this._retry(retryWindow, options);
            });
          };
        })(this);
        return (verifyAssertions = (function(_this) {
          return function() {
            return Promise["try"](retryWindow).then(function(win) {
              return _this.verifyUpcomingAssertions(win, options, {
                onRetry: verifyAssertions
              });
            });
          };
        })(this))();
      },
      document: function(options) {
        var getDocument, retryDocument, verifyAssertions;
        if (options == null) {
          options = {};
        }
        _.defaults(options, {
          log: true
        });
        if (options.log) {
          options._log = Cypress.Log.command();
        }
        getDocument = (function(_this) {
          return function() {
            var win;
            win = _this["private"]("window");
            if (!(win != null ? win.document : void 0)) {
              $Cypress.Utils.throwErrByPath("window.iframe_doc_undefined");
            }
            return win.document;
          };
        })(this);
        retryDocument = (function(_this) {
          return function() {
            return Promise["try"](getDocument)["catch"](function(err) {
              options.error = err;
              return _this._retry(retryDocument, options);
            });
          };
        })(this);
        return (verifyAssertions = (function(_this) {
          return function() {
            return Promise["try"](retryDocument).then(function(doc) {
              return _this.verifyUpcomingAssertions(doc, options, {
                onRetry: verifyAssertions
              });
            });
          };
        })(this))();
      },
      viewport: function(presetOrWidth, heightOrOrientation, options) {
        var dimensions, getPresetDimensions, height, orientation, orientationIsValidAndLandscape, preset, throwErrBadArgs, viewport, width, widthAndHeightAreValidNumbers, widthAndHeightAreWithinBounds;
        if (options == null) {
          options = {};
        }
        if (_.isObject(heightOrOrientation)) {
          options = heightOrOrientation;
        }
        _.defaults(options, {
          log: true
        });
        if (options.log) {
          options._log = Cypress.Log.command({
            consoleProps: function() {
              var obj;
              obj = {};
              if (preset) {
                obj.Preset = preset;
              }
              obj.Width = width;
              obj.Height = height;
              return obj;
            }
          });
        }
        throwErrBadArgs = (function(_this) {
          return function() {
            return $Cypress.Utils.throwErrByPath("viewport.bad_args", {
              onFail: options._log
            });
          };
        })(this);
        widthAndHeightAreValidNumbers = function(width, height) {
          return _.all([width, height], function(val) {
            return _.isNumber(val) && _.isFinite(val);
          });
        };
        widthAndHeightAreWithinBounds = function(width, height) {
          return _.all([width, height], function(val) {
            return val >= 200 && val <= 3000;
          });
        };
        switch (false) {
          case !(_.isString(presetOrWidth) && _.isBlank(presetOrWidth)):
            $Cypress.Utils.throwErrByPath("viewport.empty_string", {
              onFail: options._log
            });
            break;
          case !_.isString(presetOrWidth):
            getPresetDimensions = (function(_this) {
              return function(preset) {
                var e, presets;
                try {
                  return _(viewports[presetOrWidth].split("x")).map(Number);
                } catch (error) {
                  e = error;
                  presets = _.keys(viewports).join(", ");
                  return $Cypress.Utils.throwErrByPath("viewport.missing_preset", {
                    onFail: options._log,
                    args: {
                      preset: preset,
                      presets: presets
                    }
                  });
                }
              };
            })(this);
            orientationIsValidAndLandscape = (function(_this) {
              return function(orientation) {
                var all;
                if (indexOf.call(validOrientations, orientation) < 0) {
                  all = validOrientations.join("' or '");
                  $Cypress.Utils.throwErrByPath("viewport.invalid_orientation", {
                    onFail: options._log,
                    args: {
                      all: all,
                      orientation: orientation
                    }
                  });
                }
                return orientation === "landscape";
              };
            })(this);
            preset = presetOrWidth;
            orientation = heightOrOrientation;
            dimensions = getPresetDimensions(preset);
            if (_.isString(orientation)) {
              if (orientationIsValidAndLandscape(orientation)) {
                dimensions.reverse();
              }
            }
            width = dimensions[0], height = dimensions[1];
            break;
          case !widthAndHeightAreValidNumbers(presetOrWidth, heightOrOrientation):
            width = presetOrWidth;
            height = heightOrOrientation;
            if (!widthAndHeightAreWithinBounds(width, height)) {
              $Cypress.Utils.throwErrByPath("viewport.dimensions_out_of_range", {
                onFail: options._log
              });
            }
            break;
          default:
            throwErrBadArgs();
        }
        if (!viewportDefaults) {
          viewportDefaults = _.pick(this.Cypress.config(), "viewportWidth", "viewportHeight");
        }
        viewport = triggerAndSetViewport.call(this, width, height);
        if (options._log) {
          options._log.set(viewport);
        }
        return null;
      }
    });
  });

}).call(this);
; 
(function() {
  var slice = [].slice;

  $Cypress.register("XHR2", function(Cypress, _) {
    var abort, defaults, getDisplayName, getServer, getUrl, isUrlLikeArgs, requestXhrRe, server, setRequest, setResponse, stripOrigin, unavailableErr, validAliasApiRe, validHttpMethodsRe;
    validHttpMethodsRe = /^(GET|POST|PUT|DELETE|PATCH|HEAD|OPTIONS)$/i;
    requestXhrRe = /\.request$/;
    validAliasApiRe = /^(\d+|all)$/;
    server = null;
    getServer = function() {
      return server != null ? server : unavailableErr.call(this);
    };
    abort = function() {
      if (server) {
        return server.abort();
      }
    };
    isUrlLikeArgs = function(url, response) {
      return (!_.isObject(url) && !_.isObject(response)) || (_.isRegExp(url) || _.isString(url));
    };
    getUrl = function(options) {
      return options.originalUrl || options.url;
    };
    unavailableErr = function() {
      return Cypress.Utils.throwErrByPath("server.unavailable");
    };
    getDisplayName = function(route) {
      if (route && (route.response != null)) {
        return "xhr stub";
      } else {
        return "xhr";
      }
    };
    stripOrigin = function(url) {
      var location;
      location = Cypress.Location.create(url);
      return url.replace(location.origin, "");
    };
    setRequest = function(xhr, alias) {
      var ref, requests;
      requests = (ref = this.prop("requests")) != null ? ref : [];
      requests.push({
        xhr: xhr,
        alias: alias
      });
      return this.prop("requests", requests);
    };
    setResponse = function(xhr) {
      var obj, ref, responses;
      obj = _.findWhere(this.prop("requests"), {
        xhr: xhr
      });
      responses = (ref = this.prop("responses")) != null ? ref : [];
      responses.push({
        xhr: xhr,
        alias: obj != null ? obj.alias : void 0
      });
      return this.prop("responses", responses);
    };
    defaults = {
      method: void 0,
      status: void 0,
      delay: void 0,
      headers: void 0,
      response: void 0,
      autoRespond: void 0,
      waitOnResponses: void 0,
      onAbort: void 0,
      onRequest: void 0,
      onResponse: void 0
    };
    Cypress.on("before:unload", function() {
      if (server) {
        return server.abort();
      }
    });
    Cypress.on("abort", abort);
    Cypress.on("test:before:hooks", function(test) {
      if (test == null) {
        test = {};
      }
      abort();
      return server = this.startXhrServer(test.id);
    });
    Cypress.on("before:window:load", function(contentWindow) {
      if (server) {
        return $Cypress.Server.bindTo(contentWindow, _.bind(getServer, this));
      } else {
        return unavailableErr.call(this);
      }
    });
    Cypress.Cy.extend({
      getXhrServer: function() {
        var ref;
        return (ref = this.prop("server")) != null ? ref : unavailableErr.call(this);
      },
      startXhrServer: function(testId) {
        var cy, logs;
        logs = {};
        cy = this;
        return this.prop("server", $Cypress.Server.create({
          testId: testId,
          xhrUrl: this.Cypress.config("xhrUrl"),
          stripOrigin: stripOrigin,
          onSend: (function(_this) {
            return function(xhr, stack, route) {
              var alias, log, numResponses, rl;
              alias = route != null ? route.alias : void 0;
              setRequest.call(_this, xhr, alias);
              if (rl = route && route.log) {
                numResponses = rl.get("numResponses");
                rl.set("numResponses", numResponses + 1);
              }
              logs[xhr.id] = log = Cypress.Log.command({
                message: "",
                name: "xhr",
                displayName: getDisplayName(route),
                alias: alias,
                aliasType: "route",
                type: "parent",
                event: true,
                consoleProps: function() {
                  var consoleObj;
                  consoleObj = {
                    Alias: alias,
                    Method: xhr.method,
                    URL: xhr.url,
                    "Matched URL": route != null ? route.url : void 0,
                    Status: xhr.statusMessage,
                    Duration: xhr.duration,
                    "Stubbed": route && (route.response != null) ? "Yes" : "No",
                    Request: xhr.request,
                    Response: xhr.response,
                    XHR: xhr._getXhr()
                  };
                  if (route && route.is404) {
                    consoleObj.Note = "This request did not match any of your routes. It was automatically sent back '404'. Setting cy.server({force404: false}) will turn off this behavior.";
                  }
                  consoleObj.groups = function() {
                    return [
                      {
                        name: "Initiator",
                        items: [stack],
                        label: false
                      }
                    ];
                  };
                  return consoleObj;
                },
                renderProps: function() {
                  var indicator, status;
                  status = (function() {
                    switch (false) {
                      case !xhr.aborted:
                        indicator = "aborted";
                        return "(aborted)";
                      case !(xhr.status > 0):
                        return xhr.status;
                      default:
                        indicator = "pending";
                        return "---";
                    }
                  })();
                  if (indicator == null) {
                    indicator = /^2/.test(status) ? "successful" : "bad";
                  }
                  return {
                    message: xhr.method + " " + status + " " + (_.truncate(stripOrigin(xhr.url), 20)),
                    indicator: indicator
                  };
                }
              });
              return log.snapshot("request");
            };
          })(this),
          onLoad: (function(_this) {
            return function(xhr) {
              var log;
              setResponse.call(_this, xhr);
              if (log = logs[xhr.id]) {
                return log.snapshot("response").end();
              }
            };
          })(this),
          onNetworkError: function(xhr) {
            var err, log;
            err = $Cypress.Utils.cypressErr($Cypress.Utils.errMessageByPath("xhr.network_error"));
            if (log = logs[xhr.id]) {
              return log.snapshot("failed").error(err);
            }
          },
          onFixtureError: function(xhr, err) {
            err = $Cypress.Utils.cypressErr(err);
            return this.onError(xhr, err);
          },
          onError: (function(_this) {
            return function(xhr, err) {
              var log;
              err.onFail = function() {};
              if (log = logs[xhr.id]) {
                log.snapshot("error").error(err);
              }
              return _this.fail(err);
            };
          })(this),
          onXhrAbort: (function(_this) {
            return function(xhr, stack) {
              var err, log;
              setResponse.call(_this, xhr);
              err = new Error($Cypress.Utils.errMessageByPath("xhr.aborted"));
              err.name = "AbortError";
              err.stack = stack;
              if (log = logs[xhr.id]) {
                return log.snapshot("aborted").error(err);
              }
            };
          })(this),
          onAnyAbort: (function(_this) {
            return function(route, xhr) {
              if (route && _.isFunction(route.onAbort)) {
                return route.onAbort.call(_this, xhr);
              }
            };
          })(this),
          onAnyRequest: (function(_this) {
            return function(route, xhr) {
              if (route && _.isFunction(route.onRequest)) {
                return route.onRequest.call(_this, xhr);
              }
            };
          })(this),
          onAnyResponse: (function(_this) {
            return function(route, xhr) {
              if (route && _.isFunction(route.onResponse)) {
                return route.onResponse.call(_this, xhr);
              }
            };
          })(this)
        }));
      }
    });
    Cypress.addParentCommand({
      server: function(options) {
        if (arguments.length === 0) {
          options = {};
        }
        if (!_.isObject(options)) {
          $Cypress.Utils.throwErrByPath("server.invalid_argument");
        }
        _.defaults(options, {
          enable: true
        });
        this.prop("serverIsStubbed", options.enable);
        return this.getXhrServer().set(options);
      },
      route: function() {
        var args, getArgs, hasResponse, o, options, parseArgs, route;
        args = 1 <= arguments.length ? slice.call(arguments, 0) : [];
        hasResponse = true;
        if (!this.prop("serverIsStubbed")) {
          $Cypress.Utils.throwErrByPath("route.failed_prerequisites");
        }
        options = o = this.getXhrServer().getOptions();
        parseArgs = (function(_this) {
          return function() {
            var alias, args, getResponse;
            args = 1 <= arguments.length ? slice.call(arguments, 0) : [];
            switch (false) {
              case !(_.isObject(args[0]) && !_.isRegExp(args[0])):
                if (!_.has(args[0], "response")) {
                  hasResponse = false;
                }
                options = o = _.extend({}, options, args[0]);
                break;
              case args.length !== 0:
                $Cypress.Utils.throwErrByPath("route.invalid_arguments");
                break;
              case args.length !== 1:
                o.url = args[0];
                hasResponse = false;
                break;
              case args.length !== 2:
                if (_.isString(args[0]) && validHttpMethodsRe.test(args[0])) {
                  o.method = args[0];
                  o.url = args[1];
                  hasResponse = false;
                } else {
                  o.url = args[0];
                  o.response = args[1];
                }
                break;
              case args.length !== 3:
                if (validHttpMethodsRe.test(args[0]) || isUrlLikeArgs(args[1], args[2])) {
                  o.method = args[0];
                  o.url = args[1];
                  o.response = args[2];
                } else {
                  o.url = args[0];
                  o.response = args[1];
                  _.extend(o, args[2]);
                }
                break;
              case args.length !== 4:
                o.method = args[0];
                o.url = args[1];
                o.response = args[2];
                _.extend(o, args[3]);
            }
            if (_.isString(o.method)) {
              o.method = o.method.toUpperCase();
            }
            _.defaults(options, defaults);
            if (!options.url) {
              $Cypress.Utils.throwErrByPath("route.url_missing");
            }
            if (!(_.isString(options.url) || _.isRegExp(options.url))) {
              $Cypress.Utils.throwErrByPath("route.url_invalid");
            }
            if (!validHttpMethodsRe.test(options.method)) {
              $Cypress.Utils.throwErrByPath("route.method_invalid", {
                args: {
                  method: o.method
                }
              });
            }
            if (hasResponse && (options.response == null)) {
              $Cypress.Utils.throwErrByPath("route.response_invalid");
            }
            if (options.url === "*") {
              options.originalUrl = "*";
              options.url = /.*/;
            }
            if (alias = _this.getNextAlias()) {
              options.alias = alias;
            }
            if (_.isFunction(o.response)) {
              getResponse = function() {
                return o.response.call(_this["private"]("runnable").ctx, options);
              };
              return Promise["try"](getResponse).then(function(resp) {
                options.response = resp;
                return route();
              });
            } else {
              return route();
            }
          };
        })(this);
        route = (function(_this) {
          return function() {
            var aliasObj;
            if (_.isString(o.response) && (aliasObj = _this.getAlias(o.response, "route"))) {
              options.response = aliasObj.subject;
            }
            options.log = Cypress.Log.route({
              method: options.method,
              url: getUrl(options),
              status: options.status,
              response: options.response,
              alias: options.alias,
              isStubbed: options.response != null,
              numResponses: 0,
              consoleProps: function() {
                return {
                  Method: options.method,
                  URL: getUrl(options),
                  Status: options.status,
                  Response: options.response,
                  Alias: options.alias
                };
              }
            });
            return _this.getXhrServer().route(options);
          };
        })(this);
        if (_.isFunction(args[0])) {
          getArgs = (function(_this) {
            return function() {
              return args[0].call(_this["private"]("runnable").ctx);
            };
          })(this);
          return Promise["try"](getArgs).then(parseArgs);
        } else {
          return parseArgs.apply(null, args);
        }
      }
    });
    return Cypress.Cy.extend({
      getPendingRequests: function() {
        var requests, responses;
        if (!(requests = this.prop("requests"))) {
          return [];
        }
        if (!(responses = this.prop("responses"))) {
          return requests;
        }
        return _.difference(requests, responses);
      },
      getCompletedRequests: function() {
        var ref;
        return (ref = this.prop("responses")) != null ? ref : [];
      },
      _getLastXhrByAlias: function(alias, prop) {
        var i, len, obj, privateProp, ref, xhrs;
        xhrs = (ref = this.prop(prop)) != null ? ref : [];
        privateProp = "_has" + prop + "BeenWaitedOn";
        for (i = 0, len = xhrs.length; i < len; i++) {
          obj = xhrs[i];
          if (!obj[privateProp] && obj.alias === alias) {
            obj[privateProp] = true;
            return obj.xhr;
          }
        }
      },
      getResponsesByAlias: function(alias) {
        var matching, prop, ref;
        ref = alias.split("."), alias = ref[0], prop = ref[1];
        if (prop && !validAliasApiRe.test(prop)) {
          $Cypress.Utils.throwErrByPath("get.alias_invalid", {
            args: {
              prop: prop
            }
          });
        }
        if (prop === "0") {
          $Cypress.Utils.throwErrByPath("get.alias_zero", {
            args: {
              alias: alias
            }
          });
        }
        matching = _(this.prop("responses")).chain().where({
          alias: alias
        }).pluck("xhr").value();
        if (prop === "all") {
          return matching;
        }
        if (prop) {
          return matching[_.toNumber(prop) - 1];
        }
        return _.last(matching);
      },
      getLastXhrByAlias: function(alias) {
        var prop, ref, str;
        ref = alias.split("."), str = ref[0], prop = ref[1];
        if (prop) {
          if (prop === "request") {
            return this._getLastXhrByAlias(str, "requests");
          } else {
            if (prop !== "response") {
              $Cypress.Utils.throwErrByPath("wait.alias_invalid", {
                args: {
                  prop: prop,
                  str: str
                }
              });
            }
          }
        }
        return this._getLastXhrByAlias(str, "responses");
      },
      getXhrTypeByAlias: function(alias) {
        if (requestXhrRe.test(alias)) {
          return "request";
        } else {
          return "response";
        }
      }
    });
  });

}).call(this);
