[
  {
    "path": ".gitattributes",
    "content": "# Set default behaviour, in case users don't have core.autocrlf set.\n* text=auto\n\n# Explicitly declare text files we want to always be normalized and converted \n# to native line endings on checkout.\n*.c text\n*.h text\n\n# Declare files that will always have CRLF line endings on checkout.\n*.sln text eol=crlf\n*.csproj text eol=crlf\n\n# Denote all files that are truly binary and should not be modified.\n*.png binary\n*.jpg binary"
  },
  {
    "path": ".gitignore",
    "content": "node_modules\nbower_components\n\n# Ignore Visual Studio  Project #\n###################\n*.config\n*.user\n*.csproj\n*.gpState\n*.sln\n*.suo\n/bin\n/obj\n/packages\n/Properties\n/Scripts\n/report\n/tests/coverage\n\n\n# Compiled source #\n###################\n*.com\n*.class\n*.dll\n*.exe\n*.o\n*.so\n\n# Packages #\n############\n# it's better to unpack these files and commit the raw source\n# git has its own built in compression methods\n*.7z\n*.dmg\n*.gz\n*.iso\n*.jar\n*.rar\n*.tar\n*.zip\n\n# Logs and databases #\n######################\n*.log\n*.sql\n*.sqlite\n\n# OS generated files #\n######################\n.DS_Store*\nehthumbs.db\nIcon?\nThumbs.db\n\n# WebStorm #\n######################\n.idea/"
  },
  {
    "path": ".jscsrc",
    "content": "{\n    \"excludeFiles\": [\"node_modules/**\", \"bower_components/**\"],\n\n\n    \"requireCurlyBraces\": [\n        \"if\",\n        \"else\",\n        \"for\",\n        \"while\",\n        \"do\",\n        \"try\",\n        \"catch\"\n    ],\n    \"requireOperatorBeforeLineBreak\": true,\n    \"requireCamelCaseOrUpperCaseIdentifiers\": true,\n    \"maximumLineLength\": {\n      \"value\": 80,\n      \"allowComments\": true,\n      \"allowRegex\": true\n    },\n    \"validateIndentation\": 2,\n    \"validateQuoteMarks\": \"'\",\n\n    \"disallowMultipleLineStrings\": true,\n    \"disallowMixedSpacesAndTabs\": true,\n    \"disallowTrailingWhitespace\": true,\n    \"disallowSpaceAfterPrefixUnaryOperators\": true,\n    \"disallowMultipleVarDecl\": null,\n\n    \"requireSpaceAfterKeywords\": [\n      \"if\",\n      \"else\",\n      \"for\",\n      \"while\",\n      \"do\",\n      \"switch\",\n      \"return\",\n      \"try\",\n      \"catch\"\n    ],\n    \"requireSpaceBeforeBinaryOperators\": [\n        \"=\", \"+=\", \"-=\", \"*=\", \"/=\", \"%=\", \"<<=\", \">>=\", \">>>=\",\n        \"&=\", \"|=\", \"^=\", \"+=\",\n\n        \"+\", \"-\", \"*\", \"/\", \"%\", \"<<\", \">>\", \">>>\", \"&\",\n        \"|\", \"^\", \"&&\", \"||\", \"===\", \"==\", \">=\",\n        \"<=\", \"<\", \">\", \"!=\", \"!==\"\n    ],\n    \"requireSpaceAfterBinaryOperators\": true,\n    \"requireSpacesInConditionalExpression\": true,\n    \"requireSpaceBeforeBlockStatements\": true,\n    \"requireLineFeedAtFileEnd\": true,\n    \"disallowSpacesInsideObjectBrackets\": \"all\",\n    \"disallowSpacesInsideArrayBrackets\": \"all\",\n    \"disallowSpacesInsideParentheses\": true,\n\n\n    \"validateJSDoc\": {\n        \"checkParamNames\": true,\n        \"requireParamTypes\": true\n    },\n\n    \"disallowMultipleLineBreaks\": true,\n\n\n\n\n\n\n\n    \"requireLineFeedAtFileEnd\": null,\n    \"disallowCommaBeforeLineBreak\": null,\n    \"disallowDanglingUnderscores\": null,\n    \"disallowEmptyBlocks\": null,\n    \"disallowMixedSpacesAndTabs\": null,\n    \"disallowMultipleLineStrings\": null,\n    \"disallowTrailingComma\": null,\n    \"disallowTrailingWhitespace\": null,\n    \"maximumLineLength\": null,\n    \"requireCamelCaseOrUpperCaseIdentifiers\": null,\n    \"requireCapitalizedConstructors\": null,\n    \"requireCommaBeforeLineBreak\": null,\n    \"requireCurlyBraces\": null,\n    \"requireDotNotation\": null,\n    \"requireMultipleVarDecl\": null,\n    \"requireOperatorBeforeLineBreak\": null,\n    \"requireParenthesesAroundIIFE\": true,\n    \"validateIndentation\": 4,\n    \"validateQuoteMarks\": null\n}"
  },
  {
    "path": ".jshintrc",
    "content": "{\n    \"bitwise\": true,\n    \"camelcase\": true,\n    \"curly\": true,\n    \"eqeqeq\": true,\n    \"es3\": false,\n    \"forin\": true,\n    \"freeze\": true,\n    \"immed\": true,\n    \"indent\": 4,\n    \"latedef\": \"nofunc\",\n    \"newcap\": true,\n    \"noarg\": true,\n    \"noempty\": true,\n    \"nonbsp\": true,\n    \"nonew\": true,\n    \"plusplus\": false,\n    \"quotmark\": \"single\",\n    \"undef\": true,\n    \"unused\": false,\n    \"strict\": false,\n    \"maxparams\": 10,\n    \"maxdepth\": 5,\n    \"maxstatements\": 40,\n    \"maxcomplexity\": 8,\n    \"maxlen\": 120,\n\n    \"asi\": false,\n    \"boss\": false,\n    \"debug\": false,\n    \"eqnull\": true,\n    \"esnext\": false,\n    \"evil\": false,\n    \"expr\": false,\n    \"funcscope\": false,\n    \"globalstrict\": false,\n    \"iterator\": false,\n    \"lastsemic\": false,\n    \"laxbreak\": false,\n    \"laxcomma\": false,\n    \"loopfunc\": true,\n    \"maxerr\": false,\n    \"moz\": false,\n    \"multistr\": false,\n    \"notypeof\": false,\n    \"proto\": false,\n    \"scripturl\": false,\n    \"shadow\": false,\n    \"sub\": true,\n    \"supernew\": false,\n    \"validthis\": false,\n    \"noyield\": false,\n\n    \"browser\": true,\n    \"node\": true,\n\n    \"globals\": {\n        \"angular\": false,\n        \"$\": false,\n        \"module\": false,\n        \"require\": false\n    }\n}\n"
  },
  {
    "path": ".travis.yml",
    "content": "language: node_js\nnode_js:\n  - \"6.12.1\"\n\ninstall:\n  - npm install -g gulp karma-cli\n  - npm install\n\nscript:\n  - npm test\n\ncache:\n  directories:\n  - node_modules\n  - travis_phantomjs\n\nbranches:\n  only:\n    - develop\n    - master \n\nbefore_install:\n  # Upgrade PhantomJS to v2.1.1.\n  - \"export PHANTOMJS_VERSION=2.1.1\"\n  - \"export PATH=$PWD/travis_phantomjs/phantomjs-$PHANTOMJS_VERSION-linux-x86_64/bin:$PATH\"\n  - \"if [ $(phantomjs --version) != $PHANTOMJS_VERSION ]; then rm -rf $PWD/travis_phantomjs; mkdir -p $PWD/travis_phantomjs; fi\"\n  - \"if [ $(phantomjs --version) != $PHANTOMJS_VERSION ]; then wget https://github.com/Medium/phantomjs/releases/download/v$PHANTOMJS_VERSION/phantomjs-$PHANTOMJS_VERSION-linux-x86_64.tar.bz2 -O $PWD/travis_phantomjs/phantomjs-$PHANTOMJS_VERSION-linux-x86_64.tar.bz2; fi\"\n  - \"if [ $(phantomjs --version) != $PHANTOMJS_VERSION ]; then tar -xvf $PWD/travis_phantomjs/phantomjs-$PHANTOMJS_VERSION-linux-x86_64.tar.bz2 -C $PWD/travis_phantomjs; fi\"\n  - \"phantomjs --version\"\n"
  },
  {
    "path": "CHANGELOG.md",
    "content": "# 6454acf14 (2017-12-08)\n_No official release because there are only CI changes._\n\n- Resolving CI issues by manually merging in JLHwung's fork. (https://github.com/easyops-cn/toastr) \n\n# 2.1.4 (2017-12-07)\n- Same as 2.1.3, except 2.1.4 is on NPM\n\n# 2.1.3 (2016-07-22)\n\n## New Features\n- Right to left text support\n- Added callbacks for click events on close button\n\n## Bug Fixes\n- Fixed some CSS that prevented touch events from propagating on iOS devices\n- Removed role attribute because it duplicated voice over on text-to-speech readers; kept aria-live.\n- Consistent line-heights for close button to resolve issues with Bootstrap.\n\n## Dev Ops\n- Removed Plato from gulp\n\n# 2.1.2 (2015-08-06)\n\n## New Features\n- Added HTML escaping (use toastr.options.escapeHTML)\n- Added more options for overriding animations, specifically to closing a toast\n- Events are now passed into the onClick handler of the toast\n\n## Bug Fixes\n- Resolved issue with centered toasts that would override top and bottom margins\n\n## Dev Ops\n- Removed `module` and `require` from the `.jshintrc` file\n- Cleaned up the readme\n- Builds moved to the `builds` folder\n- Made href calls relative to the transport in the demo\n- CSS is now built by the included LESS file as part of a `gulp` call\n- Removed un-used deps\n\n# 2.1.1 (2015-02-19)\n\n## New Features\n- Support for explicitly clearing a toast [jstawski](https://github.com/jstawski) | [PR 226](https://github.com/CodeSeven/toastr/pull/226)\n\n## Dev Ops\n- Refactor to use gulp\n\n# 2.1.0  (2014-10-15)\n\n## New Features\n- Prevent duplicate sequential toasts [SBero](https://github.com/sbero) | [aa083d8](https://github.com/CodeSeven/toastr/commit/ccb377b6015d557dbb987df74750b97b3aa083d8) \n- Add support for top-center and bottom-center toasts [showwin](https://github.com/showwin) | [86a4798](https://github.com/CodeSeven/toastr/commit/86a4798e76c7d8516521780b7bd085d6bb4c371b)\n- Add feature allowing progress bars to be shown for toasts [TravisTX](https://github.com/TravisTX) | [PR 189](https://github.com/CodeSeven/toastr/pull/189) \n\n`toastr.options.preventDuplicates = true;`\n\n`toastr.options.progressBar = true;`\n\n## Bug Fixes\n- None\n\n## Breaking Changes\n- None\n\n## Dev Ops\n\n- Add karma test runner\n- Added Travis CI hooks\n\n# 2.0.3 (2014-05-17)\n\n## New Features\n - None\n \n## Bug Fixes\n- positionClass changes were not being honored due to 2.0.2 release changes. Refactored getContainer to only get the container, unless a 2nd boolean parameter is passed in in which case it will also create it if the container did not exist [871c2a6](https://github.com/CodeSeven/toastr/commit/871c2a6e438bb6b996cfb80286720604a4cf00fd)\n\n## Breaking Changes\n - None\n\n# 2.0.2 (2014-04-29)\n\n## New Features\n- Added simple ARIA reader support ([45c6362](https://github.com/CodeSeven/toastr/commit/45c63628476f6b085a6579dc681f4fe61ba5820c))\n- Added SASS support (direct port of CSS for now) ([b4c8b34](https://github.com/CodeSeven/toastr/commit/b4c8b3460efb8aa51c730dd38c35ef6b025db2cc))\n\n## Bug Fixes\n- Added sourcemap for the min file ([1da4bd1](https://github.com/CodeSeven/toastr/commit/1da4bd1dad21bcfc7fcfe73da1abb185cf2c3f9f))\n- IE 8 does not support stopPropagation on the event ([6989573](https://github.com/CodeSeven/toastr/commit/698957325a8e7bf63990f71ee409b911d69bc8ec))\n- Media query width fixes ([ea2f5db](https://github.com/CodeSeven/toastr/commit/ea2f5db6e5314dcfe48eb34176583849c177c00e))\n- Fix of onHidden firing twice when clicking on it then moving mouse out of toast ([ad613b9](https://github.com/CodeSeven/toastr/commit/ad613b9f18feeec630497590b85ca75c52141ea3) , [#105](https://github.com/CodeSeven/toastr/issues/105))\n- Clear all toasts followed by a new toast now displays correctly ([3126a53](https://github.com/CodeSeven/toastr/commit/3126a533e0ab12ec3ff374e155a37fd38bd23bb6) , [#149](https://github.com/CodeSeven/toastr/issues/149) , [#118](https://github.com/CodeSeven/toastr/issues/118))\n\n## Breaking Changes\n- None\n\n# 2.0.1  (2013-09-01)\n\n## New Features\n\n### Close Button\nOptionally enable a close button\n\n    toastr.options.closeButton = true;\n\nOptionally override the close button's HTML. \n\n    toastr.options.closeHtml = '<button><i class=\"icon-off\"></i></button>';\n\nYou can also override the CSS/LESS for `#toast-container .toast-close-button`\n\n### Callbacks\n\t// Define a callback for when the toast is shown/hidden\n\ttoastr.options.onShown = function() { console.log('hello'); }\n\ttoastr.options.onHidden = function() { console.log('goodbye'); }\n\n### Animation Options\nToastr will supply default animations, so you do not have to provide any of these settings. However you have the option to override the animations if you like.\n\n####Easings\nOptionally override the animation easing to show or hide the toasts. Default is swing. swing and linear are built into jQuery.\n\n\ttoastr.options.showEasing = 'swing';\n\ttoastr.options.hideEasing = 'linear';\n\nUsing the jQuery Easing plugin (http://www.gsgd.co.uk/sandbox/jquery/easing/)\n\n\ttoastr.options.showEasing = 'easeOutBounce';\n\ttoastr.options.hideEasing = 'easeInBack';\n\n####Animation Method\nUse the jQuery show/hide method of your choice. These default to fadeIn/fadeOut. The methods fadeIn/fadeOut, slideDown/slideUp, and show/hide are built into jQuery.\n\n\ttoastr.options.showMethod = 'slideDown'; \n\ttoastr.options.hideMethod = 'slideUp'; \n\t\n\n###Timeouts\nControl how toastr interacts with users by setting timeouts appropriately.\n\n\ttoastr.options.timeout = 30; // How long the toast will display without user interaction\n\ttoastr.options.extendedTimeOut = 60; // How long the toast will display after a user hovers over it\n\n## Breaking Changes\n\n###Animation Changes\nThe following animations options have been deprecated and should be replaced:\n \n - Replace `options.fadeIn` with `options.showDuration`\n - Replace `options.onFadeIn` with `options.onShown`\n - Replace `options.fadeOut` with `options.hideDuration`\n - Replace `options.onFadeOut` with `options.onHidden`\n\n# Version 1.3.1\n\n## Display Sequence\nShow newest toast at bottom (top is default)\n\n\ttoastr.options.newestOnTop = false;\n"
  },
  {
    "path": "LICENSE",
    "content": "MIT License\n\nCopyright (c) 2017 Toastr Maintainers\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "README.md",
    "content": "# toastr\n**toastr** is a Javascript library for non-blocking notifications. jQuery is required. The goal is to create a simple core library that can be customized and extended.\n\n[![Build Status](https://travis-ci.org/CodeSeven/toastr.svg)](https://travis-ci.org/CodeSeven/toastr)\nBrowser testing provided by BrowserStack.\n\n## Current Version\n2.1.4\n\n## Demo\n- Demo can be found at http://codeseven.github.io/toastr/demo.html\n- [Demo using FontAwesome icons with toastr](http://plnkr.co/edit/6W9URNyyp2ItO4aUWzBB?p=preview)\n\n## CDNs\n[![cdnjs](https://img.shields.io/cdnjs/v/toastr.js.svg)](https://cdnjs.com/libraries/toastr.js)\n[![jsdelivr](https://data.jsdelivr.com/v1/package/npm/toastr/badge)](https://www.jsdelivr.com/package/npm/toastr)\n\nToastr is hosted at cdnjs and jsdelivr\n\n#### Debug\n- [//cdnjs.cloudflare.com/ajax/libs/toastr.js/latest/toastr.css](//cdnjs.cloudflare.com/ajax/libs/toastr.js/latest/toastr.css)\n\n#### Minified\n- [//cdnjs.cloudflare.com/ajax/libs/toastr.js/latest/toastr.min.js](//cdnjs.cloudflare.com/ajax/libs/toastr.js/latest/toastr.min.js)\n- [//cdnjs.cloudflare.com/ajax/libs/toastr.js/latest/toastr.min.css](//cdnjs.cloudflare.com/ajax/libs/toastr.js/latest/toastr.min.css)\n\n## Install\n\n#### [NuGet Gallery](http://nuget.org/packages/toastr)\n```\nInstall-Package toastr\n```\n\n#### [Bower](http://bower.io/search/?q=toastr)\n```\nbower install toastr\n```\n\n#### [npm](https://www.npmjs.com/package/toastr)\n```\nnpm install --save toastr\n```\n\n#### [yarn](https://yarnpkg.com/en/package/toastr)\n```\nyarn add toastr\n```\n\n#### [Ruby on Rails](https://github.com/tylergannon/toastr-rails)\n```ruby\n# Gemfile\n\ngem 'toastr-rails'\n```\n\n```coffee\n# application.coffee\n\n#= require toastr\n```\n\n```scss\n// application.scss\n\n@import \"toastr\";\n```\n\n\n\n\n## Wiki and Change Log\n[Wiki including Change Log](https://github.com/CodeSeven/toastr/wiki)\n\n## Breaking Changes\n\n#### Animation Changes\nThe following animations options have been deprecated and should be replaced:\n\n - Replace `options.fadeIn` with `options.showDuration`\n - Replace `options.onFadeIn` with `options.onShown`\n - Replace `options.fadeOut` with `options.hideDuration`\n - Replace `options.onFadeOut` with `options.onHidden`\n\n## Quick Start\n\n### 3 Easy Steps\nFor other API calls, see the [demo](http://codeseven.github.io/toastr/demo.html).\n\n1. Link to toastr.css `<link href=\"toastr.css\" rel=\"stylesheet\"/>`\n\n2. Link to toastr.js `<script src=\"toastr.js\"></script>`\n\n3. use toastr to display a toast for info, success, warning or error\n\t```js\n\t// Display an info toast with no title\n\ttoastr.info('Are you the 6 fingered man?')\n\t```\n\n### Other Options\n```js\n// Display a warning toast, with no title\ntoastr.warning('My name is Inigo Montoya. You killed my father, prepare to die!')\n\n// Display a success toast, with a title\ntoastr.success('Have fun storming the castle!', 'Miracle Max Says')\n\n// Display an error toast, with a title\ntoastr.error('I do not think that word means what you think it means.', 'Inconceivable!')\n\n// Immediately remove current toasts without using animation\ntoastr.remove()\n\n// Remove current toasts using animation\ntoastr.clear()\n\n// Override global options\ntoastr.success('We do have the Kapua suite available.', 'Turtle Bay Resort', {timeOut: 5000})\n```\n\n### Escape HTML characters\nIn case you want to escape HTML characters in title and message\n\n\ttoastr.options.escapeHtml = true;\n\n### Close Button\nOptionally enable a close button\n```js\ntoastr.options.closeButton = true;\n````\n\nOptionally override the close button's HTML.\n\n```js\ntoastr.options.closeHtml = '<button><i class=\"icon-off\"></i></button>';\n```\n\nYou can also override the CSS/LESS for `#toast-container .toast-close-button`\n\nOptionally override the hide animation when the close button is clicked (falls back to hide configuration).\n```js\ntoastr.options.closeMethod = 'fadeOut';\ntoastr.options.closeDuration = 300;\ntoastr.options.closeEasing = 'swing';\n```\n\n### Display Sequence\nShow newest toast at bottom (top is default)\n```js\ntoastr.options.newestOnTop = false;\n```\n\n### Callbacks\n```js\n// Define a callback for when the toast is shown/hidden/clicked\ntoastr.options.onShown = function() { console.log('hello'); }\ntoastr.options.onHidden = function() { console.log('goodbye'); }\ntoastr.options.onclick = function() { console.log('clicked'); }\ntoastr.options.onCloseClick = function() { console.log('close button clicked'); }\n```\n\n### Animation Options\nToastr will supply default animations, so you do not have to provide any of these settings. However you have the option to override the animations if you like.\n\n#### Easings\nOptionally override the animation easing to show or hide the toasts. Default is swing. swing and linear are built into jQuery.\n```js\ntoastr.options.showEasing = 'swing';\ntoastr.options.hideEasing = 'linear';\ntoastr.options.closeEasing = 'linear';\n```\n\nUsing the jQuery Easing plugin (http://www.gsgd.co.uk/sandbox/jquery/easing/)\n```js\ntoastr.options.showEasing = 'easeOutBounce';\ntoastr.options.hideEasing = 'easeInBack';\ntoastr.options.closeEasing = 'easeInBack';\n```\n\n#### Animation Method\nUse the jQuery show/hide method of your choice. These default to fadeIn/fadeOut. The methods fadeIn/fadeOut, slideDown/slideUp, and show/hide are built into jQuery.\n```js\ntoastr.options.showMethod = 'slideDown';\ntoastr.options.hideMethod = 'slideUp';\ntoastr.options.closeMethod = 'slideUp';\n```\n\n### Prevent Duplicates\nRather than having identical toasts stack, set the preventDuplicates property to true. Duplicates are matched to the previous toast based on their message content.\n```js\ntoastr.options.preventDuplicates = true;\n```\n\n### Timeouts\nControl how toastr interacts with users by setting timeouts appropriately.\n```js\ntoastr.options.timeOut = 30; // How long the toast will display without user interaction\ntoastr.options.extendedTimeOut = 60; // How long the toast will display after a user hovers over it\n```\n\n### Prevent from Auto Hiding\nTo prevent toastr from closing based on the timeouts, set the `timeOut` and `extendedTimeOut` options to `0`. The toastr will persist until selected.\n\n```js\ntoastr.options.timeOut = 0;\ntoastr.options.extendedTimeOut = 0;\n```\n\n### Progress Bar\nVisually indicate how long before a toast expires.\n```js\ntoastr.options.progressBar = true;\n```\n\n### rtl\nFlip the toastr to be displayed properly for right-to-left languages.\n```js\ntoastr.options.rtl = true;\n```\n\n## Building Toastr\n\nTo build the minified and css versions of Toastr you will need [node](http://nodejs.org) installed. (Use Homebrew or Chocolatey.)\n\n```\nnpm install -g gulp karma-cli\nnpm install\n```\n\nAt this point the dependencies have been installed and you can build Toastr\n\n- Run the analytics `gulp analyze`\n- Run the test `gulp test`\n- Run the build `gulp`\n\n## Contributing\n\nFor a pull request to be considered it must resolve a bug, or add a feature which is beneficial to a large audience.\n\nPull requests must pass existing unit tests, CI processes, and add additional tests to indicate successful operation of a new feature, or the resolution of an identified bug.\n\nRequests must be made against the `develop` branch. Pull requests submitted against the `master` branch will not be considered.\n\nAll pull requests are subject to approval by the repository owners, who have sole discretion over acceptance or denial.\n\n## Authors\n**John Papa**\n\n+ [http://twitter.com/John_Papa](http://twitter.com/John_Papa)\n\n**Tim Ferrell**\n\n+ [http://twitter.com/ferrell_tim](http://twitter.com/ferrell_tim)\n\n**Hans Fjällemark**\n\n+ [http://twitter.com/hfjallemark](http://twitter.com/hfjallemark)\n\n## Credits\nInspired by https://github.com/Srirangan/notifer.js/.\n\n## Copyright\nCopyright © 2012-2015\n\n## License\ntoastr is under MIT license - http://www.opensource.org/licenses/mit-license.php\n"
  },
  {
    "path": "build/toastr.css",
    "content": ".toast-title {\n  font-weight: bold;\n}\n.toast-message {\n  -ms-word-wrap: break-word;\n  word-wrap: break-word;\n}\n.toast-message a,\n.toast-message label {\n  color: #FFFFFF;\n}\n.toast-message a:hover {\n  color: #CCCCCC;\n  text-decoration: none;\n}\n.toast-close-button {\n  position: relative;\n  right: -0.3em;\n  top: -0.3em;\n  float: right;\n  font-size: 20px;\n  font-weight: bold;\n  color: #FFFFFF;\n  -webkit-text-shadow: 0 1px 0 #ffffff;\n  text-shadow: 0 1px 0 #ffffff;\n  opacity: 0.8;\n  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=80);\n  filter: alpha(opacity=80);\n  line-height: 1;\n}\n.toast-close-button:hover,\n.toast-close-button:focus {\n  color: #000000;\n  text-decoration: none;\n  cursor: pointer;\n  opacity: 0.4;\n  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=40);\n  filter: alpha(opacity=40);\n}\n.rtl .toast-close-button {\n  left: -0.3em;\n  float: left;\n  right: 0.3em;\n}\n/*Additional properties for button version\n iOS requires the button element instead of an anchor tag.\n If you want the anchor version, it requires `href=\"#\"`.*/\nbutton.toast-close-button {\n  padding: 0;\n  cursor: pointer;\n  background: transparent;\n  border: 0;\n  -webkit-appearance: none;\n}\n.toast-top-center {\n  top: 0;\n  right: 0;\n  width: 100%;\n}\n.toast-bottom-center {\n  bottom: 0;\n  right: 0;\n  width: 100%;\n}\n.toast-top-full-width {\n  top: 0;\n  right: 0;\n  width: 100%;\n}\n.toast-bottom-full-width {\n  bottom: 0;\n  right: 0;\n  width: 100%;\n}\n.toast-top-left {\n  top: 12px;\n  left: 12px;\n}\n.toast-top-right {\n  top: 12px;\n  right: 12px;\n}\n.toast-bottom-right {\n  right: 12px;\n  bottom: 12px;\n}\n.toast-bottom-left {\n  bottom: 12px;\n  left: 12px;\n}\n#toast-container {\n  position: fixed;\n  z-index: 999999;\n  pointer-events: none;\n  /*overrides*/\n}\n#toast-container * {\n  -moz-box-sizing: border-box;\n  -webkit-box-sizing: border-box;\n  box-sizing: border-box;\n}\n#toast-container > div {\n  position: relative;\n  pointer-events: auto;\n  overflow: hidden;\n  margin: 0 0 6px;\n  padding: 15px 15px 15px 50px;\n  width: 300px;\n  -moz-border-radius: 3px 3px 3px 3px;\n  -webkit-border-radius: 3px 3px 3px 3px;\n  border-radius: 3px 3px 3px 3px;\n  background-position: 15px center;\n  background-repeat: no-repeat;\n  -moz-box-shadow: 0 0 12px #999999;\n  -webkit-box-shadow: 0 0 12px #999999;\n  box-shadow: 0 0 12px #999999;\n  color: #FFFFFF;\n  opacity: 0.8;\n  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=80);\n  filter: alpha(opacity=80);\n}\n#toast-container > div.rtl {\n  direction: rtl;\n  padding: 15px 50px 15px 15px;\n  background-position: right 15px center;\n}\n#toast-container > div:hover {\n  -moz-box-shadow: 0 0 12px #000000;\n  -webkit-box-shadow: 0 0 12px #000000;\n  box-shadow: 0 0 12px #000000;\n  opacity: 1;\n  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100);\n  filter: alpha(opacity=100);\n  cursor: pointer;\n}\n#toast-container > .toast-info {\n  background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGwSURBVEhLtZa9SgNBEMc9sUxxRcoUKSzSWIhXpFMhhYWFhaBg4yPYiWCXZxBLERsLRS3EQkEfwCKdjWJAwSKCgoKCcudv4O5YLrt7EzgXhiU3/4+b2ckmwVjJSpKkQ6wAi4gwhT+z3wRBcEz0yjSseUTrcRyfsHsXmD0AmbHOC9Ii8VImnuXBPglHpQ5wwSVM7sNnTG7Za4JwDdCjxyAiH3nyA2mtaTJufiDZ5dCaqlItILh1NHatfN5skvjx9Z38m69CgzuXmZgVrPIGE763Jx9qKsRozWYw6xOHdER+nn2KkO+Bb+UV5CBN6WC6QtBgbRVozrahAbmm6HtUsgtPC19tFdxXZYBOfkbmFJ1VaHA1VAHjd0pp70oTZzvR+EVrx2Ygfdsq6eu55BHYR8hlcki+n+kERUFG8BrA0BwjeAv2M8WLQBtcy+SD6fNsmnB3AlBLrgTtVW1c2QN4bVWLATaIS60J2Du5y1TiJgjSBvFVZgTmwCU+dAZFoPxGEEs8nyHC9Bwe2GvEJv2WXZb0vjdyFT4Cxk3e/kIqlOGoVLwwPevpYHT+00T+hWwXDf4AJAOUqWcDhbwAAAAASUVORK5CYII=\") !important;\n}\n#toast-container > .toast-error {\n  background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHOSURBVEhLrZa/SgNBEMZzh0WKCClSCKaIYOED+AAKeQQLG8HWztLCImBrYadgIdY+gIKNYkBFSwu7CAoqCgkkoGBI/E28PdbLZmeDLgzZzcx83/zZ2SSXC1j9fr+I1Hq93g2yxH4iwM1vkoBWAdxCmpzTxfkN2RcyZNaHFIkSo10+8kgxkXIURV5HGxTmFuc75B2RfQkpxHG8aAgaAFa0tAHqYFfQ7Iwe2yhODk8+J4C7yAoRTWI3w/4klGRgR4lO7Rpn9+gvMyWp+uxFh8+H+ARlgN1nJuJuQAYvNkEnwGFck18Er4q3egEc/oO+mhLdKgRyhdNFiacC0rlOCbhNVz4H9FnAYgDBvU3QIioZlJFLJtsoHYRDfiZoUyIxqCtRpVlANq0EU4dApjrtgezPFad5S19Wgjkc0hNVnuF4HjVA6C7QrSIbylB+oZe3aHgBsqlNqKYH48jXyJKMuAbiyVJ8KzaB3eRc0pg9VwQ4niFryI68qiOi3AbjwdsfnAtk0bCjTLJKr6mrD9g8iq/S/B81hguOMlQTnVyG40wAcjnmgsCNESDrjme7wfftP4P7SP4N3CJZdvzoNyGq2c/HWOXJGsvVg+RA/k2MC/wN6I2YA2Pt8GkAAAAASUVORK5CYII=\") !important;\n}\n#toast-container > .toast-success {\n  background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAADsSURBVEhLY2AYBfQMgf///3P8+/evAIgvA/FsIF+BavYDDWMBGroaSMMBiE8VC7AZDrIFaMFnii3AZTjUgsUUWUDA8OdAH6iQbQEhw4HyGsPEcKBXBIC4ARhex4G4BsjmweU1soIFaGg/WtoFZRIZdEvIMhxkCCjXIVsATV6gFGACs4Rsw0EGgIIH3QJYJgHSARQZDrWAB+jawzgs+Q2UO49D7jnRSRGoEFRILcdmEMWGI0cm0JJ2QpYA1RDvcmzJEWhABhD/pqrL0S0CWuABKgnRki9lLseS7g2AlqwHWQSKH4oKLrILpRGhEQCw2LiRUIa4lwAAAABJRU5ErkJggg==\") !important;\n}\n#toast-container > .toast-warning {\n  background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGYSURBVEhL5ZSvTsNQFMbXZGICMYGYmJhAQIJAICYQPAACiSDB8AiICQQJT4CqQEwgJvYASAQCiZiYmJhAIBATCARJy+9rTsldd8sKu1M0+dLb057v6/lbq/2rK0mS/TRNj9cWNAKPYIJII7gIxCcQ51cvqID+GIEX8ASG4B1bK5gIZFeQfoJdEXOfgX4QAQg7kH2A65yQ87lyxb27sggkAzAuFhbbg1K2kgCkB1bVwyIR9m2L7PRPIhDUIXgGtyKw575yz3lTNs6X4JXnjV+LKM/m3MydnTbtOKIjtz6VhCBq4vSm3ncdrD2lk0VgUXSVKjVDJXJzijW1RQdsU7F77He8u68koNZTz8Oz5yGa6J3H3lZ0xYgXBK2QymlWWA+RWnYhskLBv2vmE+hBMCtbA7KX5drWyRT/2JsqZ2IvfB9Y4bWDNMFbJRFmC9E74SoS0CqulwjkC0+5bpcV1CZ8NMej4pjy0U+doDQsGyo1hzVJttIjhQ7GnBtRFN1UarUlH8F3xict+HY07rEzoUGPlWcjRFRr4/gChZgc3ZL2d8oAAAAASUVORK5CYII=\") !important;\n}\n#toast-container.toast-top-center > div,\n#toast-container.toast-bottom-center > div {\n  width: 300px;\n  margin-left: auto;\n  margin-right: auto;\n}\n#toast-container.toast-top-full-width > div,\n#toast-container.toast-bottom-full-width > div {\n  width: 96%;\n  margin-left: auto;\n  margin-right: auto;\n}\n.toast {\n  background-color: #030303;\n}\n.toast-success {\n  background-color: #51A351;\n}\n.toast-error {\n  background-color: #BD362F;\n}\n.toast-info {\n  background-color: #2F96B4;\n}\n.toast-warning {\n  background-color: #F89406;\n}\n.toast-progress {\n  position: absolute;\n  left: 0;\n  bottom: 0;\n  height: 4px;\n  background-color: #000000;\n  opacity: 0.4;\n  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=40);\n  filter: alpha(opacity=40);\n}\n/*Responsive Design*/\n@media all and (max-width: 240px) {\n  #toast-container > div {\n    padding: 8px 8px 8px 50px;\n    width: 11em;\n  }\n  #toast-container > div.rtl {\n    padding: 8px 50px 8px 8px;\n  }\n  #toast-container .toast-close-button {\n    right: -0.2em;\n    top: -0.2em;\n  }\n  #toast-container .rtl .toast-close-button {\n    left: -0.2em;\n    right: 0.2em;\n  }\n}\n@media all and (min-width: 241px) and (max-width: 480px) {\n  #toast-container > div {\n    padding: 8px 8px 8px 50px;\n    width: 18em;\n  }\n  #toast-container > div.rtl {\n    padding: 8px 50px 8px 8px;\n  }\n  #toast-container .toast-close-button {\n    right: -0.2em;\n    top: -0.2em;\n  }\n  #toast-container .rtl .toast-close-button {\n    left: -0.2em;\n    right: 0.2em;\n  }\n}\n@media all and (min-width: 481px) and (max-width: 768px) {\n  #toast-container > div {\n    padding: 15px 15px 15px 50px;\n    width: 25em;\n  }\n  #toast-container > div.rtl {\n    padding: 15px 50px 15px 15px;\n  }\n}\n"
  },
  {
    "path": "demo.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n    <meta charset=\"utf-8\" />\n    <title>toastr examples</title>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, maximum-scale=1\">\n    <link href=\"//netdna.bootstrapcdn.com/twitter-bootstrap/2.3.1/css/bootstrap-combined.min.css\" rel=\"stylesheet\">\n    <link href=\"build/toastr.css\" rel=\"stylesheet\" type=\"text/css\" />\n    <style>\n        .row {\n            margin-left: 0;\n        }\n    </style>\n</head>\n\n<body class=\"container\">\n<section class=\"row\">\n    <h1>toastr</h1>\n\n    <div class=\"well row\">\n        <div class=\"row\">\n            <div class=\"span4\">\n                <div class=\"control-group\">\n                    <div class=\"controls\">\n                        <label class=\"control-label\" for=\"title\">Title</label>\n                        <input id=\"title\" type=\"text\" class=\"input-large\" placeholder=\"Enter a title ...\" />\n                        <label class=\"control-label\" for=\"message\">Message</label>\n                        <textarea class=\"input-large\" id=\"message\" rows=\"3\" placeholder=\"Enter a message ...\"></textarea>\n                    </div>\n                </div>\n                <div class=\"control-group\">\n                    <div class=\"controls\">\n                        <label class=\"checkbox\" for=\"closeButton\">\n                            <input id=\"closeButton\" type=\"checkbox\" value=\"checked\" class=\"input-mini\" />Close Button\n                        </label>\n                    </div>\n                    <div class=\"controls\">\n                        <label class=\"checkbox\" for=\"addBehaviorOnToastClick\">\n                            <input id=\"addBehaviorOnToastClick\" type=\"checkbox\" value=\"checked\" class=\"input-mini\" />Add behavior on toast click\n                        </label>\n                    </div>\n                    <div class=\"controls\">\n                        <label class=\"checkbox\" for=\"addBehaviorOnToastCloseClick\">\n                            <input disabled id=\"addBehaviorOnToastCloseClick\" type=\"checkbox\" value=\"checked\" class=\"input-mini\" />Add behavior on toast close button click\n                        </label>\n                    </div>\n                    <div class=\"controls\">\n                        <label class=\"checkbox\" for=\"debugInfo\">\n                            <input id=\"debugInfo\" type=\"checkbox\" value=\"checked\" class=\"input-mini\" />Debug\n                        </label>\n                    </div>\n                    <div class=\"controls\">\n                        <label class=\"checkbox\" for=\"progressBar\">\n                            <input id=\"progressBar\" type=\"checkbox\" value=\"checked\" class=\"input-mini\" />Progress Bar\n                        </label>\n                    </div>\n                    <div class=\"controls\">\n                        <label class=\"checkbox\" for=\"rtl\">\n                            <input id=\"rtl\" type=\"checkbox\" value=\"checked\" class=\"input-mini\" />Right-To-Left\n                        </label>\n                    </div>\n                    <div class=\"controls\">\n                        <label class=\"checkbox\" for=\"preventDuplicates\">\n                            <input id=\"preventDuplicates\" type=\"checkbox\" value=\"checked\" class=\"input-mini\" />Prevent Duplicates\n                        </label>\n                    </div>\n                    <div class=\"controls\">\n                        <label class=\"checkbox\" for=\"addClear\">\n                            <input id=\"addClear\" type=\"checkbox\" value=\"checked\" class=\"input-mini\" />Add button to force clearing a toast, ignoring focus\n                        </label>\n                    </div>\n                    <div class=\"controls\">\n                        <label class=\"checkbox\" for=\"newestOnTop\">\n                            <input id=\"newestOnTop\" type=\"checkbox\" value=\"checked\" class=\"input-mini\" />Newest on top\n                        </label>\n                    </div>\n                </div>\n            </div>\n\n            <div class=\"span2\">\n                <div class=\"control-group\" id=\"toastTypeGroup\">\n                    <div class=\"controls\">\n                        <label>Toast Type</label>\n                        <label class=\"radio\">\n                            <input type=\"radio\" name=\"toasts\" value=\"success\" checked />Success\n                        </label>\n                        <label class=\"radio\">\n                            <input type=\"radio\" name=\"toasts\" value=\"info\" />Info\n                        </label>\n                        <label class=\"radio\">\n                            <input type=\"radio\" name=\"toasts\" value=\"warning\" />Warning\n                        </label>\n                        <label class=\"radio\">\n                            <input type=\"radio\" name=\"toasts\" value=\"error\" />Error\n                        </label>\n                    </div>\n                </div>\n                <div class=\"control-group\" id=\"positionGroup\">\n                    <div class=\"controls\">\n                        <label>Position</label>\n                        <label class=\"radio\">\n                            <input type=\"radio\" name=\"positions\" value=\"toast-top-right\" checked />Top Right\n                        </label>\n                        <label class=\"radio\">\n                            <input type=\"radio\" name=\"positions\" value=\"toast-bottom-right\" />Bottom Right\n                        </label>\n                        <label class=\"radio\">\n                            <input type=\"radio\" name=\"positions\" value=\"toast-bottom-left\" />Bottom Left\n                        </label>\n                        <label class=\"radio\">\n                            <input type=\"radio\" name=\"positions\" value=\"toast-top-left\" />Top Left\n                        </label>\n                        <label class=\"radio\">\n                            <input type=\"radio\" name=\"positions\" value=\"toast-top-full-width\" />Top Full Width\n                        </label>\n                        <label class=\"radio\">\n                            <input type=\"radio\" name=\"positions\" value=\"toast-bottom-full-width\" />Bottom Full Width\n                        </label>\n                        <label class=\"radio\">\n                            <input type=\"radio\" name=\"positions\" value=\"toast-top-center\" />Top Center\n                        </label>\n                        <label class=\"radio\">\n                            <input type=\"radio\" name=\"positions\" value=\"toast-bottom-center\" />Bottom Center\n                        </label>\n                    </div>\n                </div>\n            </div>\n\n            <div class=\"span2\">\n                <div class=\"control-group\">\n                    <div class=\"controls\">\n                        <label class=\"control-label\" for=\"showEasing\">Show Easing</label>\n                        <input id=\"showEasing\" type=\"text\" placeholder=\"swing, linear\" class=\"input-mini\" value=\"swing\" />\n\n                        <label class=\"control-label\" for=\"hideEasing\">Hide Easing</label>\n                        <input id=\"hideEasing\" type=\"text\" placeholder=\"swing, linear\" class=\"input-mini\" value=\"linear\" />\n\n                        <label class=\"control-label\" for=\"showMethod\">Show Method</label>\n                        <input id=\"showMethod\" type=\"text\" placeholder=\"show, fadeIn, slideDown\" class=\"input-mini\" value=\"fadeIn\" />\n\n                        <label class=\"control-label\" for=\"hideMethod\">Hide Method</label>\n                        <input id=\"hideMethod\" type=\"text\" placeholder=\"hide, fadeOut, slideUp\" class=\"input-mini\" value=\"fadeOut\" />\n                    </div>\n                </div>\n            </div>\n\n            <div class=\"span3\">\n                <div class=\"control-group\">\n                    <div class=\"controls\">\n                        <label class=\"control-label\" for=\"showDuration\">Show Duration</label>\n                        <input id=\"showDuration\" type=\"number\" placeholder=\"ms\" class=\"input-mini\" value=\"300\"     />\n\n                        <label class=\"control-label\" for=\"hideDuration\">Hide Duration</label>\n                        <input id=\"hideDuration\" type=\"number\" placeholder=\"ms\" class=\"input-mini\" value=\"1000\" />\n\n                        <label class=\"control-label\" for=\"timeOut\">Time out</label>\n                        <input id=\"timeOut\" type=\"number\" placeholder=\"ms\" class=\"input-mini\" value=\"5000\" />\n\n                        <label class=\"control-label\" for=\"extendedTimeOut\">Extended time out</label>\n                        <input id=\"extendedTimeOut\" type=\"number\" placeholder=\"ms\" class=\"input-mini\" value=\"1000\" />\n                    </div>\n                </div>\n            </div>\n        </div>\n\n        <div class=\"row\">\n            <button type=\"button\" class=\"btn btn-primary\" id=\"showtoast\">Show Toast</button>\n            <button type=\"button\" class=\"btn btn-danger\" id=\"cleartoasts\">Clear Toasts</button>\n            <button type=\"button\" class=\"btn btn-danger\" id=\"clearlasttoast\">Clear Last Toast</button>\n        </div>\n\n        <div class=\"row\" style='margin-top: 25px;'>\n            <pre id='toastrOptions'></pre>\n        </div>\n    </div>\n</section>\n\n<footer class=\"row\">\n    <h2>Links</h2>\n\n    <ul>\n        <li><a href=\"http://nuget.org/packages/toastr\">NuGet</a></li>\n        <li><a href=\"https://github.com/CodeSeven/toastr\">GitHub</a></li>\n    </ul>\n</footer>\n\n<script src=\"//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js\"></script>\n<script src=\"toastr.js\"></script>\n\n<script type=\"text/javascript\">\n    $(function () {\n        var i = -1;\n        var toastCount = 0;\n        var $toastlast;\n\n        var getMessage = function () {\n            var msgs = ['My name is Inigo Montoya. You killed my father. Prepare to die!',\n                '<div><input class=\"input-small\" value=\"textbox\"/>&nbsp;<a href=\"http://johnpapa.net\" target=\"_blank\">This is a hyperlink</a></div><div><button type=\"button\" id=\"okBtn\" class=\"btn btn-primary\">Close me</button><button type=\"button\" id=\"surpriseBtn\" class=\"btn\" style=\"margin: 0 8px 0 8px\">Surprise me</button></div>',\n                'Are you the six fingered man?',\n                'Inconceivable!',\n                'I do not think that means what you think it means.',\n                'Have fun storming the castle!'\n            ];\n            i++;\n            if (i === msgs.length) {\n                i = 0;\n            }\n\n            return msgs[i];\n        };\n\n        var getMessageWithClearButton = function (msg) {\n            msg = msg ? msg : 'Clear itself?';\n            msg += '<br /><br /><button type=\"button\" class=\"btn clear\">Yes</button>';\n            return msg;\n        };\n\n        $('#closeButton').click(function() {\n            if($(this).is(':checked')) {\n                $('#addBehaviorOnToastCloseClick').prop('disabled', false);\n            } else {\n                $('#addBehaviorOnToastCloseClick').prop('disabled', true);\n                $('#addBehaviorOnToastCloseClick').prop('checked', false);\n            }\n        });\n\n        $('#showtoast').click(function () {\n            var shortCutFunction = $(\"#toastTypeGroup input:radio:checked\").val();\n            var msg = $('#message').val();\n            var title = $('#title').val() || '';\n            var $showDuration = $('#showDuration');\n            var $hideDuration = $('#hideDuration');\n            var $timeOut = $('#timeOut');\n            var $extendedTimeOut = $('#extendedTimeOut');\n            var $showEasing = $('#showEasing');\n            var $hideEasing = $('#hideEasing');\n            var $showMethod = $('#showMethod');\n            var $hideMethod = $('#hideMethod');\n            var toastIndex = toastCount++;\n            var addClear = $('#addClear').prop('checked');\n\n            toastr.options = {\n                closeButton: $('#closeButton').prop('checked'),\n                debug: $('#debugInfo').prop('checked'),\n                newestOnTop: $('#newestOnTop').prop('checked'),\n                progressBar: $('#progressBar').prop('checked'),\n                rtl: $('#rtl').prop('checked'),\n                positionClass: $('#positionGroup input:radio:checked').val() || 'toast-top-right',\n                preventDuplicates: $('#preventDuplicates').prop('checked'),\n                onclick: null\n            };\n\n            if ($('#addBehaviorOnToastClick').prop('checked')) {\n                toastr.options.onclick = function () {\n                    alert('You can perform some custom action after a toast goes away');\n                };\n            }\n\n            if ($('#addBehaviorOnToastCloseClick').prop('checked')) {\n                toastr.options.onCloseClick = function () {\n                    alert('You can perform some custom action when the close button is clicked');\n                };\n            }\n\n            if ($showDuration.val().length) {\n                toastr.options.showDuration = parseInt($showDuration.val());\n            }\n\n            if ($hideDuration.val().length) {\n                toastr.options.hideDuration = parseInt($hideDuration.val());\n            }\n\n            if ($timeOut.val().length) {\n                toastr.options.timeOut = addClear ? 0 : parseInt($timeOut.val());\n            }\n\n            if ($extendedTimeOut.val().length) {\n                toastr.options.extendedTimeOut = addClear ? 0 : parseInt($extendedTimeOut.val());\n            }\n\n            if ($showEasing.val().length) {\n                toastr.options.showEasing = $showEasing.val();\n            }\n\n            if ($hideEasing.val().length) {\n                toastr.options.hideEasing = $hideEasing.val();\n            }\n\n            if ($showMethod.val().length) {\n                toastr.options.showMethod = $showMethod.val();\n            }\n\n            if ($hideMethod.val().length) {\n                toastr.options.hideMethod = $hideMethod.val();\n            }\n\n            if (addClear) {\n                msg = getMessageWithClearButton(msg);\n                toastr.options.tapToDismiss = false;\n            }\n            if (!msg) {\n                msg = getMessage();\n            }\n\n            $('#toastrOptions').text('Command: toastr[\"'\n                    + shortCutFunction\n                    + '\"](\"'\n                    + msg\n                    + (title ? '\", \"' + title : '')\n                    + '\")\\n\\ntoastr.options = '\n                    + JSON.stringify(toastr.options, null, 2)\n            );\n\n            var $toast = toastr[shortCutFunction](msg, title); // Wire up an event handler to a button in the toast, if it exists\n            $toastlast = $toast;\n\n            if(typeof $toast === 'undefined'){\n                return;\n            }\n\n            if ($toast.find('#okBtn').length) {\n                $toast.delegate('#okBtn', 'click', function () {\n                    alert('you clicked me. i was toast #' + toastIndex + '. goodbye!');\n                    $toast.remove();\n                });\n            }\n            if ($toast.find('#surpriseBtn').length) {\n                $toast.delegate('#surpriseBtn', 'click', function () {\n                    alert('Surprise! you clicked me. i was toast #' + toastIndex + '. You could perform an action here.');\n                });\n            }\n            if ($toast.find('.clear').length) {\n                $toast.delegate('.clear', 'click', function () {\n                    toastr.clear($toast, { force: true });\n                });\n            }\n        });\n\n        function getLastToast(){\n            return $toastlast;\n        }\n        $('#clearlasttoast').click(function () {\n            toastr.clear(getLastToast());\n        });\n        $('#cleartoasts').click(function () {\n            toastr.clear();\n        });\n    })\n</script>\n</body>\n</html>\n"
  },
  {
    "path": "gulpfile.js",
    "content": "/* jshint node:true, camelcase:false */\nvar gulp = require('gulp');\nvar karma = require('karma').server;\nvar merge = require('merge-stream');\nvar plug = require('gulp-load-plugins')();\n\nvar paths = {\n    js: './toastr.js',\n    less: './toastr.less',\n    report: './report',\n    build: './build'\n};\n\nvar log = plug.util.log;\n\n/**\n * List the available gulp tasks\n */\ngulp.task('help', plug.taskListing);\n\n/**\n * Lint the code, create coverage report, and a visualizer\n * @return {Stream}\n */\ngulp.task('analyze', function () {\n    log('Analyzing source with JSHint and JSCS');\n\n    var jshint = analyzejshint([paths.js]);\n    var jscs = analyzejscs([paths.js]);\n\n    return merge(jshint, jscs);\n});\n\n/**\n * Minify and bundle the app's JavaScript\n * @return {Stream}\n */\ngulp.task('js', function () {\n    log('Bundling, minifying, and copying the app\\'s JavaScript');\n\n    return gulp\n        .src(paths.js)\n        .pipe(plug.sourcemaps.init())\n        .pipe(plug.bytediff.start())\n        .pipe(plug.uglify({}))\n        .pipe(plug.bytediff.stop(bytediffFormatter))\n        .pipe(plug.sourcemaps.write('.'))\n        .pipe(plug.rename(function (path) {\n            if (path.extname === '.js') {\n                path.basename += '.min';\n            }\n        }))\n        .pipe(gulp.dest(paths.build));\n});\n\n/**\n * Minify and bundle the CSS\n * @return {Stream}\n */\ngulp.task('css', function () {\n    log('Bundling, minifying, and copying the app\\'s CSS');\n\n    return gulp.src(paths.less)\n        .pipe(plug.less())\n        .pipe(gulp.dest(paths.build))\n        .pipe(plug.bytediff.start())\n        .pipe(plug.minifyCss({}))\n        .pipe(plug.bytediff.stop(bytediffFormatter))\n        .pipe(plug.rename('toastr.min.css'))\n        .pipe(gulp.dest(paths.build));\n});\n\n/**\n * Build js and css\n */\ngulp.task('default', ['js', 'css'], function () {\n    log('Analyze, Build CSS and JS');\n});\n\n/**\n * Remove all files from the build folder\n * One way to run clean before all tasks is to run\n * from the cmd line: gulp clean && gulp build\n * @return {Stream}\n */\ngulp.task('clean', function (cb) {\n    log('Cleaning: ' + plug.util.colors.blue(paths.report));\n    log('Cleaning: ' + plug.util.colors.blue(paths.build));\n\n    var delPaths = [paths.build, paths.report];\n    del(delPaths, cb);\n});\n\n/**\n * Run specs once and exit\n * To start servers and run midway specs as well:\n *    gulp test --startServers\n * @return {Stream}\n */\ngulp.task('test', function (done) {\n    startTests(true /*singleRun*/, done);\n});\n\n////////////////\n\n/**\n * Execute JSHint on given source files\n * @param  {Array} sources\n * @param  {String} overrideRcFile\n * @return {Stream}\n */\nfunction analyzejshint(sources, overrideRcFile) {\n    var jshintrcFile = overrideRcFile || './.jshintrc';\n    log('Running JSHint');\n    return gulp\n        .src(sources)\n        .pipe(plug.jshint(jshintrcFile))\n        .pipe(plug.jshint.reporter('jshint-stylish'));\n}\n\n/**\n * Execute JSCS on given source files\n * @param  {Array} sources\n * @return {Stream}\n */\nfunction analyzejscs(sources) {\n    log('Running JSCS');\n    return gulp\n        .src(sources)\n        .pipe(plug.jscs('./.jscsrc'));\n}\n\n/**\n * Start the tests using karma.\n * @param  {boolean} singleRun - True means run once and end (CI), or keep running (dev)\n * @param  {Function} done - Callback to fire when karma is done\n * @return {undefined}\n */\nfunction startTests(singleRun, done) {\n    karma.start({\n        configFile: __dirname + '/karma.conf.js',\n        singleRun: !!singleRun\n    }, karmaCompleted);\n\n    ////////////////\n\n    function karmaCompleted(exitCode) {\n        if (exitCode === 0) {\n            done();\n        } else {\n            process.exit(exitCode);\n        }\n    }\n}\n\n/**\n * Formatter for bytediff to display the size changes after processing\n * @param  {Object} data - byte data\n * @return {String}      Difference in bytes, formatted\n */\nfunction bytediffFormatter(data) {\n    var difference = (data.savings > 0) ? ' smaller.' : ' larger.';\n    return data.fileName + ' went from ' +\n        (data.startSize / 1000).toFixed(2) + ' kB to ' + (data.endSize / 1000).toFixed(2) + ' kB' +\n        ' and is ' + formatPercent(1 - data.percent, 2) + '%' + difference;\n}\n\n/**\n * Format a number as a percentage\n * @param  {Number} num       Number to format as a percent\n * @param  {Number} precision Precision of the decimal\n * @return {Number}           Formatted perentage\n */\nfunction formatPercent(num, precision) {\n    return (num * 100).toFixed(precision);\n}\n"
  },
  {
    "path": "karma.conf.js",
    "content": "// Karma configuration\n// Generated on Thu Sep 04 2014 07:41:43 GMT-0400 (EDT)\n\nmodule.exports = function (config) {\n    config.set({\n\n        // base path that will be used to resolve all patterns (eg. files, exclude)\n        basePath: '',\n\n\n        // frameworks to use\n        // available frameworks: https://npmjs.org/browse/keyword/karma-adapter\n        frameworks: ['qunit'],\n\n        // list of files / patterns to load in the browser\n        files: [\n            'node_modules/jquery/dist/jquery.min.js',\n            'build/toastr.css',\n            'toastr.js',\n            'node_modules/qunitjs/qunit/qunit.js',\n            'tests/unit/qunit-helper.js',\n            'tests/unit/toastr-tests.js'\n        ],\n\n\n        // list of files to exclude\n        exclude: [],\n\n\n        // preprocess matching files before serving them to the browser\n        // available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor\n        preprocessors: {\n            'toastr.js': 'coverage'\n        },\n\n\n        // test results reporter to use\n        // possible values: 'dots', 'progress'\n        // available reporters: https://npmjs.org/browse/keyword/karma-reporter\n        reporters: ['progress', 'coverage'],\n\n        coverageReporter: {\n            type: 'lcov',\n            dir: 'tests/coverage'\n        },\n\n        // web server port\n        port: 9876,\n\n\n        // enable / disable colors in the output (reporters and logs)\n        colors: true,\n\n\n        // level of logging\n        // possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG\n        logLevel: config.LOG_INFO,\n\n\n        // enable / disable watching file and executing tests whenever any file changes\n        autoWatch: false,\n\n\n        // start these browsers\n        // available browser launchers: https://npmjs.org/browse/keyword/karma-launcher\n        browsers: ['PhantomJS'],\n\n\n        // Continuous Integration mode\n        // if true, Karma captures browsers, runs the tests and exits\n        singleRun: true\n    });\n};\n"
  },
  {
    "path": "nuget/content/content/toastr.css",
    "content": "﻿/*\n * Toastr\n * Copyright 2012-2014 John Papa and Hans Fjällemark.\n * All Rights Reserved.\n * Use, reproduction, distribution, and modification of this code is subject to the terms and\n * conditions of the MIT license, available at http://www.opensource.org/licenses/mit-license.php\n *\n * Author: John Papa and Hans Fjällemark\n * Project: https://github.com/CodeSeven/toastr\n */\n.toast-title {\n  font-weight: bold;\n}\n.toast-message {\n  -ms-word-wrap: break-word;\n  word-wrap: break-word;\n}\n.toast-message a,\n.toast-message label {\n  color: #ffffff;\n}\n.toast-message a:hover {\n  color: #cccccc;\n  text-decoration: none;\n}\n.toast-close-button {\n  position: relative;\n  right: -0.3em;\n  top: -0.3em;\n  float: right;\n  font-size: 20px;\n  font-weight: bold;\n  color: #ffffff;\n  -webkit-text-shadow: 0 1px 0 #ffffff;\n  text-shadow: 0 1px 0 #ffffff;\n  opacity: 0.8;\n  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=80);\n  filter: alpha(opacity=80);\n}\n.toast-close-button:hover,\n.toast-close-button:focus {\n  color: #000000;\n  text-decoration: none;\n  cursor: pointer;\n  opacity: 0.4;\n  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=40);\n  filter: alpha(opacity=40);\n}\n/*Additional properties for button version\n iOS requires the button element instead of an anchor tag.\n If you want the anchor version, it requires `href=\"#\"`.*/\nbutton.toast-close-button {\n  padding: 0;\n  cursor: pointer;\n  background: transparent;\n  border: 0;\n  -webkit-appearance: none;\n}\n.toast-top-full-width {\n  top: 0;\n  right: 0;\n  width: 100%;\n}\n.toast-bottom-full-width {\n  bottom: 0;\n  right: 0;\n  width: 100%;\n}\n.toast-top-left {\n  top: 12px;\n  left: 12px;\n}\n.toast-top-right {\n  top: 12px;\n  right: 12px;\n}\n.toast-bottom-right {\n  right: 12px;\n  bottom: 12px;\n}\n.toast-bottom-left {\n  bottom: 12px;\n  left: 12px;\n}\n#toast-container {\n  position: fixed;\n  z-index: 999999;\n  /*overrides*/\n\n}\n#toast-container * {\n  -moz-box-sizing: border-box;\n  -webkit-box-sizing: border-box;\n  box-sizing: border-box;\n}\n#toast-container > div {\n  margin: 0 0 6px;\n  padding: 15px 15px 15px 50px;\n  width: 300px;\n  -moz-border-radius: 3px 3px 3px 3px;\n  -webkit-border-radius: 3px 3px 3px 3px;\n  border-radius: 3px 3px 3px 3px;\n  background-position: 15px center;\n  background-repeat: no-repeat;\n  -moz-box-shadow: 0 0 12px #999999;\n  -webkit-box-shadow: 0 0 12px #999999;\n  box-shadow: 0 0 12px #999999;\n  color: #ffffff;\n  opacity: 0.8;\n  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=80);\n  filter: alpha(opacity=80);\n}\n#toast-container > :hover {\n  -moz-box-shadow: 0 0 12px #000000;\n  -webkit-box-shadow: 0 0 12px #000000;\n  box-shadow: 0 0 12px #000000;\n  opacity: 1;\n  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100);\n  filter: alpha(opacity=100);\n  cursor: pointer;\n}\n#toast-container > .toast-info {\n  background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGwSURBVEhLtZa9SgNBEMc9sUxxRcoUKSzSWIhXpFMhhYWFhaBg4yPYiWCXZxBLERsLRS3EQkEfwCKdjWJAwSKCgoKCcudv4O5YLrt7EzgXhiU3/4+b2ckmwVjJSpKkQ6wAi4gwhT+z3wRBcEz0yjSseUTrcRyfsHsXmD0AmbHOC9Ii8VImnuXBPglHpQ5wwSVM7sNnTG7Za4JwDdCjxyAiH3nyA2mtaTJufiDZ5dCaqlItILh1NHatfN5skvjx9Z38m69CgzuXmZgVrPIGE763Jx9qKsRozWYw6xOHdER+nn2KkO+Bb+UV5CBN6WC6QtBgbRVozrahAbmm6HtUsgtPC19tFdxXZYBOfkbmFJ1VaHA1VAHjd0pp70oTZzvR+EVrx2Ygfdsq6eu55BHYR8hlcki+n+kERUFG8BrA0BwjeAv2M8WLQBtcy+SD6fNsmnB3AlBLrgTtVW1c2QN4bVWLATaIS60J2Du5y1TiJgjSBvFVZgTmwCU+dAZFoPxGEEs8nyHC9Bwe2GvEJv2WXZb0vjdyFT4Cxk3e/kIqlOGoVLwwPevpYHT+00T+hWwXDf4AJAOUqWcDhbwAAAAASUVORK5CYII=\") !important;\n}\n#toast-container > .toast-error {\n  background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHOSURBVEhLrZa/SgNBEMZzh0WKCClSCKaIYOED+AAKeQQLG8HWztLCImBrYadgIdY+gIKNYkBFSwu7CAoqCgkkoGBI/E28PdbLZmeDLgzZzcx83/zZ2SSXC1j9fr+I1Hq93g2yxH4iwM1vkoBWAdxCmpzTxfkN2RcyZNaHFIkSo10+8kgxkXIURV5HGxTmFuc75B2RfQkpxHG8aAgaAFa0tAHqYFfQ7Iwe2yhODk8+J4C7yAoRTWI3w/4klGRgR4lO7Rpn9+gvMyWp+uxFh8+H+ARlgN1nJuJuQAYvNkEnwGFck18Er4q3egEc/oO+mhLdKgRyhdNFiacC0rlOCbhNVz4H9FnAYgDBvU3QIioZlJFLJtsoHYRDfiZoUyIxqCtRpVlANq0EU4dApjrtgezPFad5S19Wgjkc0hNVnuF4HjVA6C7QrSIbylB+oZe3aHgBsqlNqKYH48jXyJKMuAbiyVJ8KzaB3eRc0pg9VwQ4niFryI68qiOi3AbjwdsfnAtk0bCjTLJKr6mrD9g8iq/S/B81hguOMlQTnVyG40wAcjnmgsCNESDrjme7wfftP4P7SP4N3CJZdvzoNyGq2c/HWOXJGsvVg+RA/k2MC/wN6I2YA2Pt8GkAAAAASUVORK5CYII=\") !important;\n}\n#toast-container > .toast-success {\n  background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAADsSURBVEhLY2AYBfQMgf///3P8+/evAIgvA/FsIF+BavYDDWMBGroaSMMBiE8VC7AZDrIFaMFnii3AZTjUgsUUWUDA8OdAH6iQbQEhw4HyGsPEcKBXBIC4ARhex4G4BsjmweU1soIFaGg/WtoFZRIZdEvIMhxkCCjXIVsATV6gFGACs4Rsw0EGgIIH3QJYJgHSARQZDrWAB+jawzgs+Q2UO49D7jnRSRGoEFRILcdmEMWGI0cm0JJ2QpYA1RDvcmzJEWhABhD/pqrL0S0CWuABKgnRki9lLseS7g2AlqwHWQSKH4oKLrILpRGhEQCw2LiRUIa4lwAAAABJRU5ErkJggg==\") !important;\n}\n#toast-container > .toast-warning {\n  background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGYSURBVEhL5ZSvTsNQFMbXZGICMYGYmJhAQIJAICYQPAACiSDB8AiICQQJT4CqQEwgJvYASAQCiZiYmJhAIBATCARJy+9rTsldd8sKu1M0+dLb057v6/lbq/2rK0mS/TRNj9cWNAKPYIJII7gIxCcQ51cvqID+GIEX8ASG4B1bK5gIZFeQfoJdEXOfgX4QAQg7kH2A65yQ87lyxb27sggkAzAuFhbbg1K2kgCkB1bVwyIR9m2L7PRPIhDUIXgGtyKw575yz3lTNs6X4JXnjV+LKM/m3MydnTbtOKIjtz6VhCBq4vSm3ncdrD2lk0VgUXSVKjVDJXJzijW1RQdsU7F77He8u68koNZTz8Oz5yGa6J3H3lZ0xYgXBK2QymlWWA+RWnYhskLBv2vmE+hBMCtbA7KX5drWyRT/2JsqZ2IvfB9Y4bWDNMFbJRFmC9E74SoS0CqulwjkC0+5bpcV1CZ8NMej4pjy0U+doDQsGyo1hzVJttIjhQ7GnBtRFN1UarUlH8F3xict+HY07rEzoUGPlWcjRFRr4/gChZgc3ZL2d8oAAAAASUVORK5CYII=\") !important;\n}\n#toast-container.toast-top-full-width > div,\n#toast-container.toast-bottom-full-width > div {\n  width: 96%;\n  margin: auto;\n}\n.toast {\n  background-color: #030303;\n}\n.toast-success {\n  background-color: #51a351;\n}\n.toast-error {\n  background-color: #bd362f;\n}\n.toast-info {\n  background-color: #2f96b4;\n}\n.toast-warning {\n  background-color: #f89406;\n}\n/*Responsive Design*/\n@media all and (max-width: 240px) {\n  #toast-container > div {\n    padding: 8px 8px 8px 50px;\n    width: 11em;\n  }\n  #toast-container .toast-close-button {\n    right: -0.2em;\n    top: -0.2em;\n  }\n}\n@media all and (min-width: 241px) and (max-width: 480px) {\n  #toast-container > div {\n    padding: 8px 8px 8px 50px;\n    width: 18em;\n  }\n  #toast-container .toast-close-button {\n    right: -0.2em;\n    top: -0.2em;\n  }\n}\n@media all and (min-width: 481px) and (max-width: 768px) {\n  #toast-container > div {\n    padding: 15px 15px 15px 50px;\n    width: 25em;\n  }\n}\n"
  },
  {
    "path": "nuget/content/content/toastr.less",
    "content": "﻿// Mix-ins\n.borderRadius(@radius) {\n\t-moz-border-radius: @radius;\n\t-webkit-border-radius: @radius;\n\tborder-radius: @radius;\n}\n\n.boxShadow(@boxShadow) {\n\t-moz-box-shadow: @boxShadow;\n\t-webkit-box-shadow: @boxShadow;\n\tbox-shadow: @boxShadow;\n}\n\n.opacity(@opacity) {\n\t@opacityPercent: @opacity * 100;\n\topacity: @opacity;\n\t-ms-filter: ~\"progid:DXImageTransform.Microsoft.Alpha(Opacity=@{opacityPercent})\";\n\tfilter: ~\"alpha(opacity=@{opacityPercent})\";\n}\n\n.wordWrap(@wordWrap: break-word) {\n\t-ms-word-wrap: @wordWrap;\n\tword-wrap: @wordWrap;\n}\n\n// Variables\n@black: #000000;\n@grey: #999999;\n@light-grey: #CCCCCC;\n@white: #FFFFFF;\n@near-black: #030303;\n@green: #51A351;\n@red: #BD362F;\n@blue: #2F96B4;\n@orange: #F89406;\n\n// Styles\n.toast-title {\n\tfont-weight: bold;\n}\n\n.toast-message {\n\t.wordWrap();\n\n\ta,\n\tlabel {\n\t\tcolor: @white;\n\t}\n\n\t\ta:hover {\n\t\t\tcolor: @light-grey;\n\t\t\ttext-decoration: none;\n\t\t}\n}\n\n.toast-close-button {\n\tposition: relative;\n\tright: -0.3em;\n\ttop: -0.3em;\n\tfloat: right;\n\tfont-size: 20px;\n\tfont-weight: bold;\n\tcolor: @white;\n\t-webkit-text-shadow: 0 1px 0 rgba(255,255,255,1);\n\ttext-shadow: 0 1px 0 rgba(255,255,255,1);\n\t.opacity(0.8);\n\n\t&:hover,\n\t&:focus {\n\t\tcolor: @black;\n\t\ttext-decoration: none;\n\t\tcursor: pointer;\n\t\t.opacity(0.4);\n\t}\n}\n\n/*Additional properties for button version\n iOS requires the button element instead of an anchor tag.\n If you want the anchor version, it requires `href=\"#\"`.*/\nbutton.toast-close-button {\n\tpadding: 0;\n\tcursor: pointer;\n\tbackground: transparent;\n\tborder: 0;\n\t-webkit-appearance: none;\n}\n\n//#endregion\n\n.toast-top-full-width {\n\ttop: 0;\n\tright: 0;\n\twidth: 100%;\n}\n\n.toast-bottom-full-width {\n\tbottom: 0;\n\tright: 0;\n\twidth: 100%;\n}\n\n.toast-top-left {\n\ttop: 12px;\n\tleft: 12px;\n}\n\n.toast-top-right {\n\ttop: 12px;\n\tright: 12px;\n}\n\n.toast-bottom-right {\n\tright: 12px;\n\tbottom: 12px;\n}\n\n.toast-bottom-left {\n\tbottom: 12px;\n\tleft: 12px;\n}\n\n#toast-container {\n\tposition: fixed;\n\tz-index: 999999;\n\n\t* {\n\t\t-moz-box-sizing: border-box;\n\t\t-webkit-box-sizing: border-box;\n\t\tbox-sizing: border-box;\n\t}\n\n\t> div {\n\t\tmargin: 0 0 6px;\n\t\tpadding: 15px 15px 15px 50px;\n\t\twidth: 300px;\n\t\t.borderRadius(3px 3px 3px 3px);\n\t\tbackground-position: 15px center;\n\t\tbackground-repeat: no-repeat;\n\t\t.boxShadow(0 0 12px @grey);\n\t\tcolor: @white;\n\t\t.opacity(0.8);\n\t}\n\n\t> :hover {\n\t\t.boxShadow(0 0 12px @black);\n\t\t.opacity(1);\n\t\tcursor: pointer;\n\t}\n\n\t> .toast-info {\n\t\tbackground-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGwSURBVEhLtZa9SgNBEMc9sUxxRcoUKSzSWIhXpFMhhYWFhaBg4yPYiWCXZxBLERsLRS3EQkEfwCKdjWJAwSKCgoKCcudv4O5YLrt7EzgXhiU3/4+b2ckmwVjJSpKkQ6wAi4gwhT+z3wRBcEz0yjSseUTrcRyfsHsXmD0AmbHOC9Ii8VImnuXBPglHpQ5wwSVM7sNnTG7Za4JwDdCjxyAiH3nyA2mtaTJufiDZ5dCaqlItILh1NHatfN5skvjx9Z38m69CgzuXmZgVrPIGE763Jx9qKsRozWYw6xOHdER+nn2KkO+Bb+UV5CBN6WC6QtBgbRVozrahAbmm6HtUsgtPC19tFdxXZYBOfkbmFJ1VaHA1VAHjd0pp70oTZzvR+EVrx2Ygfdsq6eu55BHYR8hlcki+n+kERUFG8BrA0BwjeAv2M8WLQBtcy+SD6fNsmnB3AlBLrgTtVW1c2QN4bVWLATaIS60J2Du5y1TiJgjSBvFVZgTmwCU+dAZFoPxGEEs8nyHC9Bwe2GvEJv2WXZb0vjdyFT4Cxk3e/kIqlOGoVLwwPevpYHT+00T+hWwXDf4AJAOUqWcDhbwAAAAASUVORK5CYII=\") !important;\n\t}\n\n\t> .toast-error {\n\t\tbackground-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHOSURBVEhLrZa/SgNBEMZzh0WKCClSCKaIYOED+AAKeQQLG8HWztLCImBrYadgIdY+gIKNYkBFSwu7CAoqCgkkoGBI/E28PdbLZmeDLgzZzcx83/zZ2SSXC1j9fr+I1Hq93g2yxH4iwM1vkoBWAdxCmpzTxfkN2RcyZNaHFIkSo10+8kgxkXIURV5HGxTmFuc75B2RfQkpxHG8aAgaAFa0tAHqYFfQ7Iwe2yhODk8+J4C7yAoRTWI3w/4klGRgR4lO7Rpn9+gvMyWp+uxFh8+H+ARlgN1nJuJuQAYvNkEnwGFck18Er4q3egEc/oO+mhLdKgRyhdNFiacC0rlOCbhNVz4H9FnAYgDBvU3QIioZlJFLJtsoHYRDfiZoUyIxqCtRpVlANq0EU4dApjrtgezPFad5S19Wgjkc0hNVnuF4HjVA6C7QrSIbylB+oZe3aHgBsqlNqKYH48jXyJKMuAbiyVJ8KzaB3eRc0pg9VwQ4niFryI68qiOi3AbjwdsfnAtk0bCjTLJKr6mrD9g8iq/S/B81hguOMlQTnVyG40wAcjnmgsCNESDrjme7wfftP4P7SP4N3CJZdvzoNyGq2c/HWOXJGsvVg+RA/k2MC/wN6I2YA2Pt8GkAAAAASUVORK5CYII=\") !important;\n\t}\n\n\t> .toast-success {\n\t\tbackground-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAADsSURBVEhLY2AYBfQMgf///3P8+/evAIgvA/FsIF+BavYDDWMBGroaSMMBiE8VC7AZDrIFaMFnii3AZTjUgsUUWUDA8OdAH6iQbQEhw4HyGsPEcKBXBIC4ARhex4G4BsjmweU1soIFaGg/WtoFZRIZdEvIMhxkCCjXIVsATV6gFGACs4Rsw0EGgIIH3QJYJgHSARQZDrWAB+jawzgs+Q2UO49D7jnRSRGoEFRILcdmEMWGI0cm0JJ2QpYA1RDvcmzJEWhABhD/pqrL0S0CWuABKgnRki9lLseS7g2AlqwHWQSKH4oKLrILpRGhEQCw2LiRUIa4lwAAAABJRU5ErkJggg==\") !important;\n\t}\n\n\t> .toast-warning {\n\t\tbackground-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGYSURBVEhL5ZSvTsNQFMbXZGICMYGYmJhAQIJAICYQPAACiSDB8AiICQQJT4CqQEwgJvYASAQCiZiYmJhAIBATCARJy+9rTsldd8sKu1M0+dLb057v6/lbq/2rK0mS/TRNj9cWNAKPYIJII7gIxCcQ51cvqID+GIEX8ASG4B1bK5gIZFeQfoJdEXOfgX4QAQg7kH2A65yQ87lyxb27sggkAzAuFhbbg1K2kgCkB1bVwyIR9m2L7PRPIhDUIXgGtyKw575yz3lTNs6X4JXnjV+LKM/m3MydnTbtOKIjtz6VhCBq4vSm3ncdrD2lk0VgUXSVKjVDJXJzijW1RQdsU7F77He8u68koNZTz8Oz5yGa6J3H3lZ0xYgXBK2QymlWWA+RWnYhskLBv2vmE+hBMCtbA7KX5drWyRT/2JsqZ2IvfB9Y4bWDNMFbJRFmC9E74SoS0CqulwjkC0+5bpcV1CZ8NMej4pjy0U+doDQsGyo1hzVJttIjhQ7GnBtRFN1UarUlH8F3xict+HY07rEzoUGPlWcjRFRr4/gChZgc3ZL2d8oAAAAASUVORK5CYII=\") !important;\n\t}\n\n\t/*overrides*/\n\t&.toast-top-full-width > div,\n\t&.toast-bottom-full-width > div {\n\t\twidth: 96%;\n\t\tmargin: auto;\n\t}\n}\n\n.toast {\n\tbackground-color: @near-black;\n}\n\n.toast-success {\n\tbackground-color: @green;\n}\n\n.toast-error {\n\tbackground-color: @red;\n}\n\n.toast-info {\n\tbackground-color: @blue;\n}\n\n.toast-warning {\n\tbackground-color: @orange;\n}\n\n/*Responsive Design*/\n\n@media all and (max-width: 240px) {\n\t#toast-container {\n\n\t\t> div {\n\t\t\tpadding: 8px 8px 8px 50px;\n\t\t\twidth: 11em;\n\t\t}\n\n\t\t& .toast-close-button {\n\t\t\tright: -0.2em;\n\t\t\ttop: -0.2em;\n\t\t}\n\t}\n}\n\n@media all and (min-width: 241px) and (max-width: 480px) {\n\t#toast-container {\n\t\t> div {\n\t\t\tpadding: 8px 8px 8px 50px;\n\t\t\twidth: 18em;\n\t\t}\n\n\t\t& .toast-close-button {\n\t\t\tright: -0.2em;\n\t\t\ttop: -0.2em;\n\t\t}\n\t}\n}\n\n@media all and (min-width: 481px) and (max-width: 768px) {\n\t#toast-container {\n\t\t> div {\n\t\t\tpadding: 15px 15px 15px 50px;\n\t\t\twidth: 25em;\n\t\t}\n\t}\n}"
  },
  {
    "path": "nuget/content/content/toastr.scss",
    "content": "/*\n * Toastr\n * Version 2.0.1\n * Copyright 2012 John Papa and Hans Fjällemark.\n * All Rights Reserved.\n * Use, reproduction, distribution, and modification of this code is subject to the terms and\n * conditions of the MIT license, available at http://www.opensource.org/licenses/mit-license.php\n *\n * Author: John Papa and Hans Fjällemark\n * Project: https://github.com/CodeSeven/toastr\n */\n.toast-title {\n  font-weight: bold;\n}\n.toast-message {\n  -ms-word-wrap: break-word;\n  word-wrap: break-word;\n}\n.toast-message a,\n.toast-message label {\n  color: #ffffff;\n}\n.toast-message a:hover {\n  color: #cccccc;\n  text-decoration: none;\n}\n\n.toast-close-button {\n  position: relative;\n  right: -0.3em;\n  top: -0.3em;\n  float: right;\n  font-size: 20px;\n  font-weight: bold;\n  color: #ffffff;\n  -webkit-text-shadow: 0 1px 0 #ffffff;\n  text-shadow: 0 1px 0 #ffffff;\n  opacity: 0.8;\n  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=80);\n  filter: alpha(opacity=80);\n}\n.toast-close-button:hover,\n.toast-close-button:focus {\n  color: #000000;\n  text-decoration: none;\n  cursor: pointer;\n  opacity: 0.4;\n  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=40);\n  filter: alpha(opacity=40);\n}\n\n/*Additional properties for button version\n iOS requires the button element instead of an anchor tag.\n If you want the anchor version, it requires `href=\"#\"`.*/\nbutton.toast-close-button {\n  padding: 0;\n  cursor: pointer;\n  background: transparent;\n  border: 0;\n  -webkit-appearance: none;\n}\n.toast-top-full-width {\n  top: 0;\n  right: 0;\n  width: 100%;\n}\n.toast-bottom-full-width {\n  bottom: 0;\n  right: 0;\n  width: 100%;\n}\n.toast-top-left {\n  top: 12px;\n  left: 12px;\n}\n.toast-top-right {\n  top: 12px;\n  right: 12px;\n}\n.toast-bottom-right {\n  right: 12px;\n  bottom: 12px;\n}\n.toast-bottom-left {\n  bottom: 12px;\n  left: 12px;\n}\n#toast-container {\n  position: fixed;\n  z-index: 999999;\n  /*overrides*/\n\n}\n#toast-container * {\n  -moz-box-sizing: border-box;\n  -webkit-box-sizing: border-box;\n  box-sizing: border-box;\n}\n#toast-container > div {\n  margin: 0 0 6px;\n  padding: 15px 15px 15px 50px;\n  width: 300px;\n  -moz-border-radius: 3px 3px 3px 3px;\n  -webkit-border-radius: 3px 3px 3px 3px;\n  border-radius: 3px 3px 3px 3px;\n  background-position: 15px center;\n  background-repeat: no-repeat;\n  -moz-box-shadow: 0 0 12px #999999;\n  -webkit-box-shadow: 0 0 12px #999999;\n  box-shadow: 0 0 12px #999999;\n  color: #ffffff;\n  opacity: 0.8;\n  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=80);\n  filter: alpha(opacity=80);\n}\n#toast-container > :hover {\n  -moz-box-shadow: 0 0 12px #000000;\n  -webkit-box-shadow: 0 0 12px #000000;\n  box-shadow: 0 0 12px #000000;\n  opacity: 1;\n  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100);\n  filter: alpha(opacity=100);\n  cursor: pointer;\n}\n#toast-container > .toast-info {\n  background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGwSURBVEhLtZa9SgNBEMc9sUxxRcoUKSzSWIhXpFMhhYWFhaBg4yPYiWCXZxBLERsLRS3EQkEfwCKdjWJAwSKCgoKCcudv4O5YLrt7EzgXhiU3/4+b2ckmwVjJSpKkQ6wAi4gwhT+z3wRBcEz0yjSseUTrcRyfsHsXmD0AmbHOC9Ii8VImnuXBPglHpQ5wwSVM7sNnTG7Za4JwDdCjxyAiH3nyA2mtaTJufiDZ5dCaqlItILh1NHatfN5skvjx9Z38m69CgzuXmZgVrPIGE763Jx9qKsRozWYw6xOHdER+nn2KkO+Bb+UV5CBN6WC6QtBgbRVozrahAbmm6HtUsgtPC19tFdxXZYBOfkbmFJ1VaHA1VAHjd0pp70oTZzvR+EVrx2Ygfdsq6eu55BHYR8hlcki+n+kERUFG8BrA0BwjeAv2M8WLQBtcy+SD6fNsmnB3AlBLrgTtVW1c2QN4bVWLATaIS60J2Du5y1TiJgjSBvFVZgTmwCU+dAZFoPxGEEs8nyHC9Bwe2GvEJv2WXZb0vjdyFT4Cxk3e/kIqlOGoVLwwPevpYHT+00T+hWwXDf4AJAOUqWcDhbwAAAAASUVORK5CYII=\") !important;\n}\n#toast-container > .toast-error {\n  background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHOSURBVEhLrZa/SgNBEMZzh0WKCClSCKaIYOED+AAKeQQLG8HWztLCImBrYadgIdY+gIKNYkBFSwu7CAoqCgkkoGBI/E28PdbLZmeDLgzZzcx83/zZ2SSXC1j9fr+I1Hq93g2yxH4iwM1vkoBWAdxCmpzTxfkN2RcyZNaHFIkSo10+8kgxkXIURV5HGxTmFuc75B2RfQkpxHG8aAgaAFa0tAHqYFfQ7Iwe2yhODk8+J4C7yAoRTWI3w/4klGRgR4lO7Rpn9+gvMyWp+uxFh8+H+ARlgN1nJuJuQAYvNkEnwGFck18Er4q3egEc/oO+mhLdKgRyhdNFiacC0rlOCbhNVz4H9FnAYgDBvU3QIioZlJFLJtsoHYRDfiZoUyIxqCtRpVlANq0EU4dApjrtgezPFad5S19Wgjkc0hNVnuF4HjVA6C7QrSIbylB+oZe3aHgBsqlNqKYH48jXyJKMuAbiyVJ8KzaB3eRc0pg9VwQ4niFryI68qiOi3AbjwdsfnAtk0bCjTLJKr6mrD9g8iq/S/B81hguOMlQTnVyG40wAcjnmgsCNESDrjme7wfftP4P7SP4N3CJZdvzoNyGq2c/HWOXJGsvVg+RA/k2MC/wN6I2YA2Pt8GkAAAAASUVORK5CYII=\") !important;\n}\n#toast-container > .toast-success {\n  background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAADsSURBVEhLY2AYBfQMgf///3P8+/evAIgvA/FsIF+BavYDDWMBGroaSMMBiE8VC7AZDrIFaMFnii3AZTjUgsUUWUDA8OdAH6iQbQEhw4HyGsPEcKBXBIC4ARhex4G4BsjmweU1soIFaGg/WtoFZRIZdEvIMhxkCCjXIVsATV6gFGACs4Rsw0EGgIIH3QJYJgHSARQZDrWAB+jawzgs+Q2UO49D7jnRSRGoEFRILcdmEMWGI0cm0JJ2QpYA1RDvcmzJEWhABhD/pqrL0S0CWuABKgnRki9lLseS7g2AlqwHWQSKH4oKLrILpRGhEQCw2LiRUIa4lwAAAABJRU5ErkJggg==\") !important;\n}\n#toast-container > .toast-warning {\n  background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGYSURBVEhL5ZSvTsNQFMbXZGICMYGYmJhAQIJAICYQPAACiSDB8AiICQQJT4CqQEwgJvYASAQCiZiYmJhAIBATCARJy+9rTsldd8sKu1M0+dLb057v6/lbq/2rK0mS/TRNj9cWNAKPYIJII7gIxCcQ51cvqID+GIEX8ASG4B1bK5gIZFeQfoJdEXOfgX4QAQg7kH2A65yQ87lyxb27sggkAzAuFhbbg1K2kgCkB1bVwyIR9m2L7PRPIhDUIXgGtyKw575yz3lTNs6X4JXnjV+LKM/m3MydnTbtOKIjtz6VhCBq4vSm3ncdrD2lk0VgUXSVKjVDJXJzijW1RQdsU7F77He8u68koNZTz8Oz5yGa6J3H3lZ0xYgXBK2QymlWWA+RWnYhskLBv2vmE+hBMCtbA7KX5drWyRT/2JsqZ2IvfB9Y4bWDNMFbJRFmC9E74SoS0CqulwjkC0+5bpcV1CZ8NMej4pjy0U+doDQsGyo1hzVJttIjhQ7GnBtRFN1UarUlH8F3xict+HY07rEzoUGPlWcjRFRr4/gChZgc3ZL2d8oAAAAASUVORK5CYII=\") !important;\n}\n#toast-container.toast-top-full-width > div,\n#toast-container.toast-bottom-full-width > div {\n  width: 96%;\n  margin: auto;\n}\n.toast {\n  background-color: #030303;\n}\n.toast-success {\n  background-color: #51a351;\n}\n.toast-error {\n  background-color: #bd362f;\n}\n.toast-info {\n  background-color: #2f96b4;\n}\n.toast-warning {\n  background-color: #f89406;\n}\n/*Responsive Design*/\n@media all and (max-width: 239px) {\n  #toast-container > div {\n    padding: 8px 8px 8px 50px;\n    width: 11em;\n  }\n  #toast-container .toast-close-button {\n    right: -0.2em;\n    top: -0.2em;\n  }\n}\n@media all and (min-width: 240px) and (max-width: 479px) {\n  #toast-container > div {\n    padding: 8px 8px 8px 50px;\n    width: 18em;\n  }\n  #toast-container .toast-close-button {\n    right: -0.2em;\n    top: -0.2em;\n  }\n}\n@media all and (min-width: 480px) and (max-width: 767px) {\n  #toast-container > div {\n    padding: 15px 15px 15px 50px;\n    width: 25em;\n  }\n}"
  },
  {
    "path": "nuget/content/scripts/toastr.js",
    "content": "﻿/*\n * Toastr\n * Copyright 2012-2014 John Papa and Hans Fjällemark.\n * All Rights Reserved.\n * Use, reproduction, distribution, and modification of this code is subject to the terms and\n * conditions of the MIT license, available at http://www.opensource.org/licenses/mit-license.php\n *\n * Author: John Papa and Hans Fjällemark\n * ARIA Support: Greta Krafsig\n * Project: https://github.com/CodeSeven/toastr\n */\n; (function (define) {\n    define(['jquery'], function ($) {\n        return (function () {\n            var $container;\n            var listener;\n            var toastId = 0;\n            var toastType = {\n                error: 'error',\n                info: 'info',\n                success: 'success',\n                warning: 'warning'\n            };\n\n            var toastr = {\n                clear: clear,\n                remove: remove,\n                error: error,\n                getContainer: getContainer,\n                info: info,\n                options: {},\n                subscribe: subscribe,\n                success: success,\n                version: '2.0.3',\n                warning: warning\n            };\n\n            return toastr;\n\n            //#region Accessible Methods\n            function error(message, title, optionsOverride) {\n                return notify({\n                    type: toastType.error,\n                    iconClass: getOptions().iconClasses.error,\n                    message: message,\n                    optionsOverride: optionsOverride,\n                    title: title\n                });\n            }\n\n            function getContainer(options, create) {\n                if (!options) { options = getOptions(); }\n                $container = $('#' + options.containerId);\n                if ($container.length) {\n                    return $container;\n                }\n                if(create) {\n                    $container = createContainer(options);\n                }\n                return $container;\n            }\n\n            function info(message, title, optionsOverride) {\n                return notify({\n                    type: toastType.info,\n                    iconClass: getOptions().iconClasses.info,\n                    message: message,\n                    optionsOverride: optionsOverride,\n                    title: title\n                });\n            }\n\n            function subscribe(callback) {\n                listener = callback;\n            }\n\n            function success(message, title, optionsOverride) {\n                return notify({\n                    type: toastType.success,\n                    iconClass: getOptions().iconClasses.success,\n                    message: message,\n                    optionsOverride: optionsOverride,\n                    title: title\n                });\n            }\n\n            function warning(message, title, optionsOverride) {\n                return notify({\n                    type: toastType.warning,\n                    iconClass: getOptions().iconClasses.warning,\n                    message: message,\n                    optionsOverride: optionsOverride,\n                    title: title\n                });\n            }\n\n            function clear($toastElement) {\n                var options = getOptions();\n                if (!$container) { getContainer(options); }\n                if (!clearToast($toastElement, options)) {\n                    clearContainer(options);\n                }\n            }\n\n            function remove($toastElement) {\n                var options = getOptions();\n                if (!$container) { getContainer(options); }\n                if ($toastElement && $(':focus', $toastElement).length === 0) {\n                    removeToast($toastElement);\n                    return;\n                }\n                if ($container.children().length) {\n                    $container.remove();\n                }\n            }\n            //#endregion\n\n            //#region Internal Methods\n\n            function clearContainer(options){\n                var toastsToClear = $container.children();\n                for (var i = toastsToClear.length - 1; i >= 0; i--) {\n                    clearToast($(toastsToClear[i]), options);\n                };\n            }\n\n            function clearToast($toastElement, options){\n                if ($toastElement && $(':focus', $toastElement).length === 0) {\n                    $toastElement[options.hideMethod]({\n                        duration: options.hideDuration,\n                        easing: options.hideEasing,\n                        complete: function () { removeToast($toastElement); }\n                    });\n                    return true;\n                }\n                return false;\n            }\n\n            function createContainer(options) {\n                $container = $('<div/>')\n                    .attr('id', options.containerId)\n                    .addClass(options.positionClass)\n                    .attr('aria-live', 'polite')\n                    .attr('role', 'alert');\n\n                $container.appendTo($(options.target));\n                return $container;\n            }\n\n            function getDefaults() {\n                return {\n                    tapToDismiss: true,\n                    toastClass: 'toast',\n                    containerId: 'toast-container',\n                    debug: false,\n\n                    showMethod: 'fadeIn', //fadeIn, slideDown, and show are built into jQuery\n                    showDuration: 300,\n                    showEasing: 'swing', //swing and linear are built into jQuery\n                    onShown: undefined,\n                    hideMethod: 'fadeOut',\n                    hideDuration: 1000,\n                    hideEasing: 'swing',\n                    onHidden: undefined,\n\n                    extendedTimeOut: 1000,\n                    iconClasses: {\n                        error: 'toast-error',\n                        info: 'toast-info',\n                        success: 'toast-success',\n                        warning: 'toast-warning'\n                    },\n                    iconClass: 'toast-info',\n                    positionClass: 'toast-top-right',\n                    timeOut: 5000, // Set timeOut and extendedTimeout to 0 to make it sticky\n                    titleClass: 'toast-title',\n                    messageClass: 'toast-message',\n                    target: 'body',\n                    closeHtml: '<button>&times;</button>',\n                    newestOnTop: true\n                };\n            }\n\n            function publish(args) {\n                if (!listener) { return; }\n                listener(args);\n            }\n\n            function notify(map) {\n                var options = getOptions(),\n                    iconClass = map.iconClass || options.iconClass;\n\n                if (typeof (map.optionsOverride) !== 'undefined') {\n                    options = $.extend(options, map.optionsOverride);\n                    iconClass = map.optionsOverride.iconClass || iconClass;\n                }\n\n                toastId++;\n\n                $container = getContainer(options, true);\n                var intervalId = null,\n                    $toastElement = $('<div/>'),\n                    $titleElement = $('<div/>'),\n                    $messageElement = $('<div/>'),\n                    $closeElement = $(options.closeHtml),\n                    response = {\n                        toastId: toastId,\n                        state: 'visible',\n                        startTime: new Date(),\n                        options: options,\n                        map: map\n                    };\n\n                if (map.iconClass) {\n                    $toastElement.addClass(options.toastClass).addClass(iconClass);\n                }\n\n                if (map.title) {\n                    $titleElement.append(map.title).addClass(options.titleClass);\n                    $toastElement.append($titleElement);\n                }\n\n                if (map.message) {\n                    $messageElement.append(map.message).addClass(options.messageClass);\n                    $toastElement.append($messageElement);\n                }\n\n                if (options.closeButton) {\n                    $closeElement.addClass('toast-close-button').attr(\"role\", \"button\");\n                    $toastElement.prepend($closeElement);\n                }\n\n                $toastElement.hide();\n                if (options.newestOnTop) {\n                    $container.prepend($toastElement);\n                } else {\n                    $container.append($toastElement);\n                }\n\n\n                $toastElement[options.showMethod](\n                    { duration: options.showDuration, easing: options.showEasing, complete: options.onShown }\n                );\n\n                if (options.timeOut > 0) {\n                    intervalId = setTimeout(hideToast, options.timeOut);\n                }\n\n                $toastElement.hover(stickAround, delayedHideToast);\n                if (!options.onclick && options.tapToDismiss) {\n                    $toastElement.click(hideToast);\n                }\n\n                if (options.closeButton && $closeElement) {\n                    $closeElement.click(function (event) {\n                        if( event.stopPropagation ) {\n                            event.stopPropagation();\n                        } else if( event.cancelBubble !== undefined && event.cancelBubble !== true ) {\n                            event.cancelBubble = true;\n                        }\n                        hideToast(true);\n                    });\n                }\n\n                if (options.onclick) {\n                    $toastElement.click(function () {\n                        options.onclick();\n                        hideToast();\n                    });\n                }\n\n                publish(response);\n\n                if (options.debug && console) {\n                    console.log(response);\n                }\n\n                return $toastElement;\n\n                function hideToast(override) {\n                    if ($(':focus', $toastElement).length && !override) {\n                        return;\n                    }\n                    return $toastElement[options.hideMethod]({\n                        duration: options.hideDuration,\n                        easing: options.hideEasing,\n                        complete: function () {\n                            removeToast($toastElement);\n                            if (options.onHidden && response.state !== 'hidden') {\n                                options.onHidden();\n                            }\n                            response.state = 'hidden';\n                            response.endTime = new Date();\n                            publish(response);\n                        }\n                    });\n                }\n\n                function delayedHideToast() {\n                    if (options.timeOut > 0 || options.extendedTimeOut > 0) {\n                        intervalId = setTimeout(hideToast, options.extendedTimeOut);\n                    }\n                }\n\n                function stickAround() {\n                    clearTimeout(intervalId);\n                    $toastElement.stop(true, true)[options.showMethod](\n                        { duration: options.showDuration, easing: options.showEasing }\n                    );\n                }\n            }\n\n            function getOptions() {\n                return $.extend({}, getDefaults(), toastr.options);\n            }\n\n            function removeToast($toastElement) {\n                if (!$container) { $container = getContainer(); }\n                if ($toastElement.is(':visible')) {\n                    return;\n                }\n                $toastElement.remove();\n                $toastElement = null;\n                if ($container.children().length === 0) {\n                    $container.remove();\n                }\n            }\n            //#endregion\n\n        })();\n    });\n}(typeof define === 'function' && define.amd ? define : function (deps, factory) {\n    if (typeof module !== 'undefined' && module.exports) { //Node\n        module.exports = factory(require('jquery'));\n    } else {\n        window['toastr'] = factory(window['jQuery']);\n    }\n}));"
  },
  {
    "path": "nuget/toastr.1.0.0.nuspec",
    "content": "<?xml version=\"1.0\"?>\n<package xmlns=\"http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd\">\n  <metadata>\n    <version>1.0.0</version>\n    <authors>John Papa,Hans Fjällemark</authors>\n    <owners>John Papa,Hans Fjällemark</owners>\n    <licenseUrl>http://www.opensource.org/licenses/mit-license.php</licenseUrl>\n    <projectUrl>https://github.com/CodeSeven/toastr</projectUrl>\n    <dependencies>\n      <dependency id=\"jQuery\" version=\"1.7.2\" />\n    </dependencies>\n    <id>toastr</id>\n    <title>toastr</title>\n    <requireLicenseAcceptance>false</requireLicenseAcceptance>\n    <description>3 Easy Steps:\n\n1) Link to toastr.css  and toastr-responsive.css \n2) Link to toastr.js \n3) Use toastr to display a toast for info, success, warning or error\n\n// Display an info toast with no title\ntoastr.info('Are you the 6 fingered man?')\n\n*** For other API calls, see the demo</description>\n    <summary>toastr is a Javascript library for Gnome / Growl type non-blocking notifications. jQuery is required. The goal is to create a simple core library that can be customized and extended.</summary>\n    <copyright>Copyright © 2012 Hans Fjällemark &amp; John Papa.</copyright>\n    <language>en-US</language>\n    <tags>toastr, toast, notification, dialog, jquery</tags>\n  </metadata>\n  <files>\n    <file src=\"content\\content\\toastr-responsive.css\" target=\"content\\content\\toastr-responsive.css\" />\n    <file src=\"content\\content\\toastr.css\" target=\"content\\content\\toastr.css\" />\n    <file src=\"content\\scripts\\toastr.js\" target=\"content\\scripts\\toastr.js\" />\n  </files>\n</package>"
  },
  {
    "path": "nuget/toastr.1.0.3.nuspec",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<package xmlns=\"http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd\">\n    <metadata>\n        <id>toastr</id>\n        <version>1.0.2</version>\n        <title>toastr</title>\n        <authors>John Papa,Hans Fjällemark</authors>\n        <owners>John Papa,Hans Fjällemark</owners>\n        <licenseUrl>http://www.opensource.org/licenses/mit-license.php</licenseUrl>\n        <projectUrl>https://github.com/CodeSeven/toastr</projectUrl>\n        <requireLicenseAcceptance>false</requireLicenseAcceptance>\n        <description>3 Easy Steps:\n\n1) Link to toastr.css  and toastr-responsive.css \n2) Link to toastr.js \n3) Use toastr to display a toast for info, success, warning or error\n\n// Display an info toast with no title\ntoastr.info('Are you the 6 fingered man?')\n\n*** For other API calls, see the demo</description>\n        <summary>toastr is a Javascript library for Gnome / Growl type non-blocking notifications. jQuery is required. The goal is to create a simple core library that can be customized and extended.</summary>\n        <releaseNotes>Minor updates for long unbroken string going outside toast and new feature to keep the toast around after hover-off for an extended timeout. \n\nSet extendedTimeOut and timeOut to 0 to avoid toastr from fading away.</releaseNotes>\n        <copyright>Copyright © 2012 Hans Fjällemark &amp; John Papa.</copyright>\n        <language>en-US</language>\n        <tags>toastr, toast, notification, dialog, jquery</tags>\n        <dependencies>\n            <dependency id=\"jQuery\" version=\"1.7.2\" />\n        </dependencies>\n    </metadata>\n    <files>\n        <file src=\"content\\content\\toastr-responsive.css\" target=\"content\\content\\toastr-responsive.css\" />\n        <file src=\"content\\content\\toastr.css\" target=\"content\\content\\toastr.css\" />\n        <file src=\"content\\scripts\\toastr.js\" target=\"content\\scripts\\toastr.js\" />\n    </files>\n</package>"
  },
  {
    "path": "nuget/toastr.1.1.0.nuspec",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<package xmlns=\"http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd\">\n    <metadata>\n        <id>toastr</id>\n        <version>1.1.0</version>\n        <title>toastr</title>\n        <authors>John Papa,Hans Fjällemark</authors>\n        <owners>John Papa,Hans Fjällemark</owners>\n        <licenseUrl>http://www.opensource.org/licenses/mit-license.php</licenseUrl>\n        <projectUrl>https://github.com/CodeSeven/toastr</projectUrl>\n        <requireLicenseAcceptance>false</requireLicenseAcceptance>\n        <description>3 Easy Steps:\n\n(1) Link to toastr.css  \n(2) Link to toastr.js \n(3) Use toastr to display a toast for info, success, warning or error\n\n// Display an info toast with no title\ntoastr.info('Are you the 6 fingered man?')\n\n*** For other API calls, see the demo</description>\n        <summary>toastr is a Javascript library for Gnome / Growl type non-blocking notifications. jQuery is required. The goal is to create a simple core library that can be customized and extended.</summary>\n        <releaseNotes>Added AMD support (and backwards compat with non AMD), toastr.clear() method, optionsOverride API to be able to override options for each toast, added onclick callback option which fires when a user clicks the toast. Also cleaned CSS, merged CSS files into 1 file, and reduced jQuery dependency to v1.6.3</releaseNotes>\n        <copyright>Copyright © 2012 Hans Fjällemark &amp; John Papa.</copyright>\n        <language>en-US</language>\n        <tags>toastr, toast, notification, dialog, jquery</tags>\n        <dependencies>\n            <dependency id=\"jQuery\" version=\"1.6.3\" />\n        </dependencies>\n    </metadata>\n    <files>\n        <file src=\"content\\content\\toastr.css\" target=\"content\\content\\toastr.css\" />\n        <file src=\"content\\scripts\\toastr.js\" target=\"content\\scripts\\toastr.js\" />\n    </files>\n</package>"
  },
  {
    "path": "nuget/toastr.1.1.1.nuspec",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<package xmlns=\"http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd\">\n    <metadata>\n        <id>toastr</id>\n        <version>1.1.1</version>\n        <title>toastr</title>\n        <authors>John Papa,Hans Fjällemark</authors>\n        <owners>John Papa,Hans Fjällemark</owners>\n        <licenseUrl>http://www.opensource.org/licenses/mit-license.php</licenseUrl>\n        <projectUrl>https://github.com/CodeSeven/toastr</projectUrl>\n        <requireLicenseAcceptance>false</requireLicenseAcceptance>\n        <description>3 Easy Steps:\n\n(1) Link to toastr.css  \n(2) Link to toastr.js \n(3) Use toastr to display a toast for info, success, warning or error\n\n// Display an info toast with no title\ntoastr.info('Are you the 6 fingered man?')\n\n*** For other API calls, see the demo</description>\n        <summary>toastr is a Javascript library for Gnome / Growl type non-blocking notifications. jQuery is required. The goal is to create a simple core library that can be customized and extended.</summary>\n        <releaseNotes>Added AMD support (and backwards compat with non AMD), toastr.clear() method, optionsOverride API to be able to override options for each toast, added onclick callback option which fires when a user clicks the toast. Also cleaned CSS, merged CSS files into 1 file, and reduced jQuery dependency to v1.6.3</releaseNotes>\n        <copyright>Copyright © 2012 Hans Fjällemark &amp; John Papa.</copyright>\n        <language>en-US</language>\n        <tags>toastr, toast, notification, dialog, jquery</tags>\n        <dependencies>\n            <dependency id=\"jQuery\" version=\"1.6.3\" />\n        </dependencies>\n    </metadata>\n    <files>\n        <file src=\"content\\content\\toastr.css\" target=\"content\\content\\toastr.css\" />\n        <file src=\"content\\scripts\\toastr.js\" target=\"content\\scripts\\toastr.js\" />\n    </files>\n</package>"
  },
  {
    "path": "nuget/toastr.1.1.2.nuspec",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<package xmlns=\"http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd\">\n    <metadata>\n        <id>toastr</id>\n        <version>1.1.2</version>\n        <title>toastr</title>\n        <authors>John Papa,Hans Fjällemark</authors>\n        <owners>John Papa,Hans Fjällemark</owners>\n        <licenseUrl>http://www.opensource.org/licenses/mit-license.php</licenseUrl>\n        <projectUrl>https://github.com/CodeSeven/toastr</projectUrl>\n        <requireLicenseAcceptance>false</requireLicenseAcceptance>\n        <description>3 Easy Steps:\n\n(1) Link to toastr.css  \n(2) Link to toastr.js \n(3) Use toastr to display a toast for info, success, warning or error\n\n// Display an info toast with no title\ntoastr.info('Are you the 6 fingered man?')\n\n*** For other API calls, see the demo</description>\n        <summary>toastr is a Javascript library for Gnome / Growl type non-blocking notifications. jQuery is required. The goal is to create a simple core library that can be customized and extended.</summary>\n        <releaseNotes>Added AMD support (and backwards compat with non AMD), toastr.clear() method clears 1 or all toasts, optionsOverride API to be able to override options for each toast, added onclick callback option which fires when a user clicks the toast. Also cleaned CSS, merged CSS files into 1 file, and reduced jQuery dependency to v1.6.3</releaseNotes>\n        <copyright>Copyright © 2012 Hans Fjällemark &amp; John Papa.</copyright>\n        <language>en-US</language>\n        <tags>toastr, toast, notification, dialog, jquery</tags>\n        <dependencies>\n            <dependency id=\"jQuery\" version=\"1.6.3\" />\n        </dependencies>\n    </metadata>\n    <files>\n        <file src=\"content\\content\\toastr.css\" target=\"content\\content\\toastr.css\" />\n        <file src=\"content\\scripts\\toastr.js\" target=\"content\\scripts\\toastr.js\" />\n    </files>\n</package>"
  },
  {
    "path": "nuget/toastr.1.1.4.1.nuspec",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<package xmlns=\"http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd\">\n    <metadata>\n        <id>toastr</id>\n        <version>1.1.4.1</version>\n        <title>toastr</title>\n        <authors>John Papa,Hans Fjällemark</authors>\n        <owners>John Papa,Hans Fjällemark</owners>\n        <licenseUrl>http://www.opensource.org/licenses/mit-license.php</licenseUrl>\n        <projectUrl>https://github.com/CodeSeven/toastr</projectUrl>\n        <iconUrl>http://johnpapa.net/wp-content/images/toastr-icon.png</iconUrl>\n        <requireLicenseAcceptance>false</requireLicenseAcceptance>\n        <description>3 Easy Steps:\n\n(1) Link to toastr.css  \n(2) Link to toastr.js \n(3) Use toastr to display a toast for info, success, warning or error\n\n// Display an info toast with no title\ntoastr.info('Are you the 6 fingered man?')\n\n*** For other API calls, see the demo</description>\n        <summary>toastr is a Javascript library for Gnome / Growl type non-blocking notifications. jQuery is required. The goal is to create a simple core library that can be customized and extended.</summary>\n        <releaseNotes>Added AMD support (and backwards compat with non AMD), toastr.clear() method clears 1 or all toasts, optionsOverride API to be able to override options for each toast, added onclick callback option which fires when a user clicks the toast. Also cleaned CSS, merged CSS files into 1 file, and reduced jQuery dependency to v1.6.3\n\nFix to the toastr.min.js file</releaseNotes>\n        <copyright>Copyright © 2012 Hans Fjällemark &amp; John Papa.</copyright>\n        <language>en-US</language>\n        <tags>toastr, toast, notification, dialog, jquery</tags>\n        <dependencies>\n            <dependency id=\"jQuery\" version=\"1.6.3\" />\n        </dependencies>\n    </metadata>\n    <files>\n        <file src=\"content\\content\\toastr.css\" target=\"content\\content\\toastr.css\" />\n        <file src=\"content\\content\\toastr.min.css\" target=\"content\\content\\toastr.min.css\" />\n        <file src=\"content\\scripts\\toastr.js\" target=\"content\\scripts\\toastr.js\" />\n        <file src=\"content\\scripts\\toastr.min.js\" target=\"content\\scripts\\toastr.min.js\" />\n    </files>\n</package>"
  },
  {
    "path": "nuget/toastr.1.1.4.2.nuspec",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<package xmlns=\"http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd\">\n    <metadata>\n        <id>toastr</id>\n        <version>1.1.4.2</version>\n        <title>toastr</title>\n        <authors>John Papa,Hans Fjällemark</authors>\n        <owners>John Papa,Hans Fjällemark</owners>\n        <licenseUrl>http://www.opensource.org/licenses/mit-license.php</licenseUrl>\n        <projectUrl>https://github.com/CodeSeven/toastr</projectUrl>\n        <iconUrl>http://johnpapa.net/wp-content/images/toastr-icon.png</iconUrl>\n        <requireLicenseAcceptance>false</requireLicenseAcceptance>\n        <description>3 Easy Steps:\n\n(1) Link to toastr.css  \n(2) Link to toastr.js \n(3) Use toastr to display a toast for info, success, warning or error\n\n// Display an info toast with no title\ntoastr.info('Are you the 6 fingered man?')\n\n*** For other API calls, see the demo</description>\n        <summary>toastr is a Javascript library for Gnome / Growl type non-blocking notifications. jQuery is required. The goal is to create a simple core library that can be customized and extended.</summary>\n        <releaseNotes>Added AMD support (and backwards compat with non AMD), toastr.clear() method clears 1 or all toasts, optionsOverride API to be able to override options for each toast, added onclick callback option which fires when a user clicks the toast. Also cleaned CSS, merged CSS files into 1 file, and reduced jQuery dependency to v1.6.3\n\nFix to the toastr.min.js file</releaseNotes>\n        <copyright>Copyright © 2012 Hans Fjällemark &amp; John Papa.</copyright>\n        <language>en-US</language>\n        <tags>toastr, toast, notification, dialog, jquery</tags>\n        <dependencies>\n            <dependency id=\"jQuery\" version=\"1.6.3\" />\n        </dependencies>\n    </metadata>\n    <files>\n        <file src=\"content\\content\\toastr.css\" target=\"content\\content\\toastr.css\" />\n        <file src=\"content\\content\\toastr.min.css\" target=\"content\\content\\toastr.min.css\" />\n        <file src=\"..\\..\\..\\..\\_github\\CodeSeven\\toastr\\master\\toastr.js\" target=\"content\\scripts\\toastr.js\" />\n        <file src=\"..\\..\\..\\..\\_github\\CodeSeven\\toastr\\master\\toastr.min.js\" target=\"content\\scripts\\toastr.min.js\" />\n    </files>\n</package>"
  },
  {
    "path": "nuget/toastr.1.1.4.nuspec",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<package xmlns=\"http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd\">\n    <metadata>\n        <id>toastr</id>\n        <version>1.1.4</version>\n        <title>toastr</title>\n        <authors>John Papa,Hans Fjällemark</authors>\n        <owners>John Papa,Hans Fjällemark</owners>\n        <licenseUrl>http://www.opensource.org/licenses/mit-license.php</licenseUrl>\n        <projectUrl>https://github.com/CodeSeven/toastr</projectUrl>\n        <iconUrl>http://johnpapa.net/wp-content/images/toastr-icon.png</iconUrl>\n        <requireLicenseAcceptance>false</requireLicenseAcceptance>\n        <description>3 Easy Steps:\n\n(1) Link to toastr.css  \n(2) Link to toastr.js \n(3) Use toastr to display a toast for info, success, warning or error\n\n// Display an info toast with no title\ntoastr.info('Are you the 6 fingered man?')\n\n*** For other API calls, see the demo</description>\n        <summary>toastr is a Javascript library for Gnome / Growl type non-blocking notifications. jQuery is required. The goal is to create a simple core library that can be customized and extended.</summary>\n        <releaseNotes>Added AMD support (and backwards compat with non AMD), toastr.clear() method clears 1 or all toasts, optionsOverride API to be able to override options for each toast, added onclick callback option which fires when a user clicks the toast. Also cleaned CSS, merged CSS files into 1 file, and reduced jQuery dependency to v1.6.3\n\nFix to the toastr.min.js file</releaseNotes>\n        <copyright>Copyright © 2012 Hans Fjällemark &amp; John Papa.</copyright>\n        <language>en-US</language>\n        <tags>toastr, toast, notification, dialog, jquery</tags>\n        <dependencies>\n            <dependency id=\"jQuery\" version=\"1.6.3\" />\n        </dependencies>\n    </metadata>\n    <files>\n        <file src=\"content\\content\\toastr.css\" target=\"content\\content\\toastr.css\" />\n        <file src=\"content\\content\\toastr.min.css\" target=\"content\\content\\toastr.min.css\" />\n        <file src=\"content\\scripts\\toastr.js\" target=\"content\\scripts\\toastr.js\" />\n        <file src=\"content\\scripts\\toastr.min.js\" target=\"content\\scripts\\toastr.min.js\" />\n    </files>\n</package>"
  },
  {
    "path": "nuget/toastr.1.1.5.nuspec",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<package xmlns=\"http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd\">\n    <metadata>\n        <id>toastr</id>\n        <version>1.1.5</version>\n        <title>toastr</title>\n        <authors>John Papa,Hans Fjällemark</authors>\n        <owners>John Papa,Hans Fjällemark</owners>\n        <licenseUrl>http://www.opensource.org/licenses/mit-license.php</licenseUrl>\n        <projectUrl>https://github.com/CodeSeven/toastr</projectUrl>\n        <iconUrl>http://johnpapa.net/wp-content/images/toastr-icon.png</iconUrl>\n        <requireLicenseAcceptance>false</requireLicenseAcceptance>\n        <description>3 Easy Steps:\n\n(1) Link to toastr.css  \n(2) Link to toastr.js \n(3) Use toastr to display a toast for info, success, warning or error\n\n// Display an info toast with no title\ntoastr.info('Are you the 6 fingered man?')\n\n*** For other API calls, see the demo</description>\n        <summary>toastr is a Javascript library for Gnome / Growl type non-blocking notifications. jQuery is required. The goal is to create a simple core library that can be customized and extended.</summary>\n        <releaseNotes>Now using SemVer for JavaScript files.</releaseNotes>\n        <copyright>Copyright © 2012 Hans Fjällemark &amp; John Papa.</copyright>\n        <language>en-US</language>\n        <tags>toastr, toast, notification, dialog, jquery</tags>\n        <dependencies>\n            <dependency id=\"jQuery\" version=\"1.6.3\" />\n        </dependencies>\n    </metadata>\n    <files>\n        <file src=\"content\\content\\toastr.css\" target=\"content\\content\\toastr.css\" />\n        <file src=\"content\\content\\toastr.min.css\" target=\"content\\content\\toastr.min.css\" />\n        <file src=\"content\\scripts\\toastr-1.1.5.js\" target=\"content\\scripts\\toastr-1.1.5.js\" />\n        <file src=\"content\\scripts\\toastr-1.1.5.min.js\" target=\"content\\scripts\\toastr-1.1.5.min.js\" />\n    </files>\n</package>"
  },
  {
    "path": "nuget/toastr.1.2.0.nuspec",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<package xmlns=\"http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd\">\n    <metadata>\n        <id>toastr</id>\n        <version>1.2.0</version>\n        <title>toastr</title>\n        <authors>John Papa,Hans Fjällemark</authors>\n        <owners>John Papa,Hans Fjällemark</owners>\n        <licenseUrl>http://www.opensource.org/licenses/mit-license.php</licenseUrl>\n        <projectUrl>https://github.com/CodeSeven/toastr</projectUrl>\n        <iconUrl>http://johnpapa.net/wp-content/images/toastr-icon.png</iconUrl>\n        <requireLicenseAcceptance>false</requireLicenseAcceptance>\n        <description>3 Easy Steps:\n\n(1) Link to toastr.css  \n(2) Link to toastr.js \n(3) Use toastr to display a toast for info, success, warning or error\n\n// Display an info toast with no title\ntoastr.info('Are you the 6 fingered man?')\n\n*** For other API calls, see the demo</description>\n        <summary>toastr is a Javascript library for Gnome / Growl type non-blocking notifications. jQuery is required. The goal is to create a simple core library that can be customized and extended.</summary>\n        <releaseNotes>Added getContainer().\nFixed clear() bug.\nRemoved semver from file name.</releaseNotes>\n        <copyright>Copyright © 2012 Hans Fjällemark &amp; John Papa.</copyright>\n        <language>en-US</language>\n        <tags>toastr, toast, notification, dialog, jquery</tags>\n        <dependencies>\n            <dependency id=\"jQuery\" version=\"1.6.3\" />\n        </dependencies>\n    </metadata>\n    <files>\n        <file src=\"content\\content\\toastr.css\" target=\"content\\content\\toastr.css\" />\n        <file src=\"content\\content\\toastr.min.css\" target=\"content\\content\\toastr.min.css\" />\n        <file src=\"content\\scripts\\toastr.js\" target=\"content\\scripts\\toastr.js\" />\n        <file src=\"content\\scripts\\toastr.min.js\" target=\"content\\scripts\\toastr.min.js\" />\n    </files>\n</package>"
  },
  {
    "path": "nuget/toastr.1.2.1.nuspec",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<package xmlns=\"http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd\">\n    <metadata>\n        <id>toastr</id>\n        <version>1.2.1</version>\n        <title>toastr</title>\n        <authors>John Papa,Hans Fjällemark</authors>\n        <owners>John Papa,Hans Fjällemark</owners>\n        <licenseUrl>http://www.opensource.org/licenses/mit-license.php</licenseUrl>\n        <projectUrl>https://github.com/CodeSeven/toastr</projectUrl>\n        <iconUrl>http://johnpapa.net/wp-content/images/toastr-icon.png</iconUrl>\n        <requireLicenseAcceptance>false</requireLicenseAcceptance>\n        <description>3 Easy Steps:\n\n(1) Link to toastr.css  \n(2) Link to toastr.js \n(3) Use toastr to display a toast for info, success, warning or error\n\n// Display an info toast with no title\ntoastr.info('Are you the 6 fingered man?')\n\n*** For other API calls, see the demo</description>\n        <summary>toastr is a Javascript library for Gnome / Growl type non-blocking notifications. jQuery is required. The goal is to create a simple core library that can be customized and extended.</summary>\n        <releaseNotes>Added getContainer().\nFixed clear() bug.\nRemoved semver from file name.</releaseNotes>\n        <copyright>Copyright © 2012 Hans Fjällemark &amp; John Papa.</copyright>\n        <language>en-US</language>\n        <tags>toastr, toast, notification, dialog, jquery</tags>\n        <dependencies>\n            <dependency id=\"jQuery\" version=\"1.6.3\" />\n        </dependencies>\n    </metadata>\n    <files>\n        <file src=\"content\\content\\toastr.css\" target=\"content\\content\\toastr.css\" />\n        <file src=\"content\\content\\toastr.min.css\" target=\"content\\content\\toastr.min.css\" />\n        <file src=\"content\\scripts\\toastr.js\" target=\"content\\scripts\\toastr.js\" />\n        <file src=\"content\\scripts\\toastr.min.js\" target=\"content\\scripts\\toastr.min.js\" />\n    </files>\n</package>"
  },
  {
    "path": "nuget/toastr.1.2.2.nuspec",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<package xmlns=\"http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd\">\n    <metadata>\n        <id>toastr</id>\n        <version>1.2.2</version>\n        <title>toastr</title>\n        <authors>John Papa,Hans Fjällemark</authors>\n        <owners>John Papa,Hans Fjällemark</owners>\n        <licenseUrl>http://www.opensource.org/licenses/mit-license.php</licenseUrl>\n        <projectUrl>https://github.com/CodeSeven/toastr</projectUrl>\n        <iconUrl>http://johnpapa.net/wp-content/images/toastr-icon.png</iconUrl>\n        <requireLicenseAcceptance>false</requireLicenseAcceptance>\n        <description>3 Easy Steps:\n\n(1) Link to toastr.css  \n(2) Link to toastr.js \n(3) Use toastr to display a toast for info, success, warning or error\n\n// Display an info toast with no title\ntoastr.info('Are you the 6 fingered man?')\n\n*** For other API calls, see the demo</description>\n        <summary>toastr is a Javascript library for Gnome / Growl type non-blocking notifications. jQuery is required. The goal is to create a simple core library that can be customized and extended.</summary>\n        <releaseNotes>Added getContainer().\nFixed clear() bug.\nRemoved semver from file name.</releaseNotes>\n        <copyright>Copyright © 2012 Hans Fjällemark &amp; John Papa.</copyright>\n        <language>en-US</language>\n        <tags>toastr, toast, notification, dialog, jquery</tags>\n        <dependencies>\n            <dependency id=\"jQuery\" version=\"1.6.3\" />\n        </dependencies>\n    </metadata>\n    <files>\n        <file src=\"content\\content\\toastr.css\" target=\"content\\content\\toastr.css\" />\n        <file src=\"content\\content\\toastr.min.css\" target=\"content\\content\\toastr.min.css\" />\n        <file src=\"content\\scripts\\toastr.js\" target=\"content\\scripts\\toastr.js\" />\n        <file src=\"content\\scripts\\toastr.min.js\" target=\"content\\scripts\\toastr.min.js\" />\n    </files>\n</package>"
  },
  {
    "path": "nuget/toastr.1.3.0.nuspec",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<package xmlns=\"http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd\">\n    <metadata>\n        <id>toastr</id>\n        <version>1.3.0</version>\n        <title>toastr</title>\n        <authors>John Papa,Hans Fjällemark</authors>\n        <owners>John Papa,Hans Fjällemark</owners>\n        <licenseUrl>http://www.opensource.org/licenses/mit-license.php</licenseUrl>\n        <projectUrl>https://github.com/CodeSeven/toastr</projectUrl>\n        <iconUrl>http://johnpapa.net/wp-content/images/toastr-icon.png</iconUrl>\n        <requireLicenseAcceptance>false</requireLicenseAcceptance>\n        <description>3 Easy Steps:\n\n(1) Link to toastr.css  \n(2) Link to toastr.js \n(3) Use toastr to display a toast for info, success, warning or error\n\n// Display an info toast with no title\ntoastr.info('Are you the 6 fingered man?')\n\n*** For other API calls, see the demo</description>\n        <summary>toastr is a Javascript library for Gnome / Growl type non-blocking notifications. jQuery is required. The goal is to create a simple core library that can be customized and extended.</summary>\n        <releaseNotes>Added onFadeIn and onFadeOut callbacks. \n  toastr.options.onFadeIn = function() { console.log('hello'); }\nAdded option &lt;code&gt;newestOnTop&lt;/code&gt; to show toasts in oldest or newest first order.\n  toastr.options.newestOnTop = false;\nFixed margins on full width toasts\nAdded LESS file.\nAdded min file for JS and CSS\nAdded missing vendor prefixes in CSS.\nVarious minor bug fixes.\nAdded unit tests for new features.</releaseNotes>\n        <copyright>Copyright © 2012 Hans Fjällemark &amp; John Papa.</copyright>\n        <language>en-US</language>\n        <tags>toastr, toast, notification, dialog, jquery</tags>\n        <dependencies>\n            <dependency id=\"jQuery\" version=\"1.6.3\" />\n        </dependencies>\n    </metadata>\n    <files>\n        <file src=\"content\\content\\toastr.css\" target=\"content\\content\\toastr.css\" />\n        <file src=\"content\\content\\toastr.less\" target=\"content\\content\\toastr.less\" />\n        <file src=\"content\\content\\toastr.min.css\" target=\"content\\content\\toastr.min.css\" />\n        <file src=\"content\\scripts\\toastr.js\" target=\"content\\scripts\\toastr.js\" />\n        <file src=\"content\\scripts\\toastr.min.js\" target=\"content\\scripts\\toastr.min.js\" />\n    </files>\n</package>"
  },
  {
    "path": "nuget/toastr.1.3.1.nuspec",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<package xmlns=\"http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd\">\n    <metadata>\n        <id>toastr</id>\n        <version>1.3.1</version>\n        <title>toastr</title>\n        <authors>John Papa,Hans Fjällemark</authors>\n        <owners>John Papa,Hans Fjällemark</owners>\n        <licenseUrl>http://www.opensource.org/licenses/mit-license.php</licenseUrl>\n        <projectUrl>https://github.com/CodeSeven/toastr</projectUrl>\n        <iconUrl>http://johnpapa.net/wp-content/images/toastr-icon.png</iconUrl>\n        <requireLicenseAcceptance>false</requireLicenseAcceptance>\n        <description>3 Easy Steps:\n\n(1) Link to toastr.css  \n(2) Link to toastr.js \n(3) Use toastr to display a toast for info, success, warning or error\n\n// Display an info toast with no title\ntoastr.info('Are you the 6 fingered man?')\n\n*** For other API calls, see the demo</description>\n        <summary>toastr is a Javascript library for Gnome / Growl type non-blocking notifications. jQuery is required. The goal is to create a simple core library that can be customized and extended.</summary>\n        <releaseNotes>v.1.3.1\nAdded new API for toastr.subscribe so you can be alerted when toasts appear and disappear.\n\ntoastr.subscribe(function (args) {\n    // args contains the toast options and data\n}\n\nAdded support for glimpse.toastr.js plugin. https://github.com/johnpapa/glimpse.toastr\n\nAdded toastId, state (visible/hidden),  startTime and endTime to the toastr info response (available in the coneol, glimpse.toastr plugin, or via the subscribe callback).\n\nFixed bug with stacking toasts when clear all toasts occurs first.\n\nv1.2.2\n\nAdded onFadeIn and onFadeOut callbacks. \n  toastr.options.onFadeIn = function() { console.log('hello'); }\nAdded option &lt;code&gt;newestOnTop&lt;/code&gt; to show toasts in oldest or newest first order.\n  toastr.options.newestOnTop = false;\nFixed margins on full width toasts\nAdded LESS file.\nAdded min file for JS and CSS\nAdded missing vendor prefixes in CSS.\nVarious minor bug fixes.\nAdded unit tests for new features.</releaseNotes>\n        <copyright>Copyright © 2012 Hans Fjällemark &amp; John Papa.</copyright>\n        <language>en-US</language>\n        <tags>toastr, toast, notification, dialog, jquery</tags>\n        <dependencies>\n            <dependency id=\"jQuery\" version=\"1.6.3\" />\n        </dependencies>\n    </metadata>\n    <files>\n        <file src=\"content\\content\\toastr.css\" target=\"content\\content\\toastr.css\" />\n        <file src=\"content\\content\\toastr.less\" target=\"content\\content\\toastr.less\" />\n        <file src=\"content\\content\\toastr.min.css\" target=\"content\\content\\toastr.min.css\" />\n        <file src=\"content\\scripts\\toastr.js\" target=\"content\\scripts\\toastr.js\" />\n        <file src=\"content\\scripts\\toastr.min.js\" target=\"content\\scripts\\toastr.min.js\" />\n    </files>\n</package>"
  },
  {
    "path": "nuget/toastr.2.0.0-rc1.nuspec",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<package xmlns=\"http://schemas.microsoft.com/packaging/2011/10/nuspec.xsd\">\n    <metadata>\n        <id>toastr</id>\n        <version>2.0.0-rc1</version>\n        <title>toastr</title>\n        <authors>John Papa,Hans Fjällemark</authors>\n        <owners>John Papa,Hans Fjällemark</owners>\n        <licenseUrl>http://www.opensource.org/licenses/mit-license.php</licenseUrl>\n        <projectUrl>http://toastrjs.com/</projectUrl>\n        <iconUrl>http://johnpapa.net/wp-content/images/toastr-icon.png</iconUrl>\n        <requireLicenseAcceptance>false</requireLicenseAcceptance>\n        <description>3 Easy Steps:\n\n(1) Link to toastr.css  \n(2) Link to toastr.js \n(3) Use toastr to display a toast for info, success, warning or error\n\n// Display an info toast with no title\ntoastr.info('Are you the 6 fingered man?')\n\n*** For other API calls, see the demo</description>\n        <summary>Toastr is a JavaScript library for non-blocking notifications. jQuery is required. The goal is to create a simple core library that can be customized and extended.</summary>\n        <releaseNotes>The following animations options have been deprecated and should be replaced:\n\nReplace options.fadeIn with options.showDuration\nReplace options.onFadeIn with options.onShown\nReplace options.fadeOut with options.hideDuration\nReplace options.onFadeOut with options.onHidden\n\nOptional 'close' button, bug fixes, and improved responsive design.\n\nFor other changes, see http://toastrjs.com</releaseNotes>\n        <copyright>Copyright © 2012 Hans Fjällemark &amp; John Papa.</copyright>\n        <language>en-US</language>\n        <tags>toastr, toast, notification, dialog, jquery</tags>\n        <dependencies>\n            <dependency id=\"jQuery\" version=\"1.6.3\" />\n        </dependencies>\n    </metadata>\n    <files>\n        <file src=\"content\\content\\toastr.css\" target=\"content\\content\\toastr.css\" />\n        <file src=\"content\\content\\toastr.less\" target=\"content\\content\\toastr.less\" />\n        <file src=\"content\\content\\toastr.min.css\" target=\"content\\content\\toastr.min.css\" />\n        <file src=\"content\\scripts\\toastr.js\" target=\"content\\scripts\\toastr.js\" />\n        <file src=\"content\\scripts\\toastr.min.js\" target=\"content\\scripts\\toastr.min.js\" />\n        <file src=\"content\\scripts\\toastr.min.js.map\" target=\"content\\scripts\\toastr.min.js.map\" />\n    </files>\n</package>"
  },
  {
    "path": "nuget/toastr.2.0.1.nuspec",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<package xmlns=\"http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd\">\n    <metadata>\n        <id>toastr</id>\n        <version>2.0.1</version>\n        <title>toastr</title>\n        <authors>John Papa,Hans Fjällemark</authors>\n        <owners>John Papa,Hans Fjällemark</owners>\n        <licenseUrl>http://www.opensource.org/licenses/mit-license.php</licenseUrl>\n        <projectUrl>http://toastrjs.com/</projectUrl>\n        <iconUrl>http://johnpapa.net/wp-content/images/toastr-icon.png</iconUrl>\n        <requireLicenseAcceptance>false</requireLicenseAcceptance>\n        <description>3 Easy Steps:\n\n(1) Link to toastr.css  \n(2) Link to toastr.js \n(3) Use toastr to display a toast for info, success, warning or error\n\n// Display an info toast with no title\ntoastr.info('Are you the 6 fingered man?')\n\n*** For other API calls, see the demo</description>\n        <summary>Toastr is a JavaScript library for non-blocking notifications. jQuery is required. The goal is to create a simple core library that can be customized and extended.</summary>\n        <releaseNotes>The following animations options have been deprecated and should be replaced:\n\nReplace options.fadeIn with options.showDuration\nReplace options.onFadeIn with options.onShown\nReplace options.fadeOut with options.hideDuration\nReplace options.onFadeOut with options.onHidden\n\nOptional 'close' button, bug fixes, and improved responsive design.\n\nFor other changes, see http://toastrjs.com</releaseNotes>\n        <copyright>Copyright © 2012 Hans Fjällemark &amp; John Papa.</copyright>\n        <language>en-US</language>\n        <tags>toastr, toast, notification, dialog, jquery</tags>\n        <dependencies>\n            <dependency id=\"jQuery\" version=\"1.6.3\" />\n        </dependencies>\n    </metadata>\n    <files>\n        <file src=\"content\\content\\toastr.css\" target=\"content\\content\\toastr.css\" />\n        <file src=\"content\\content\\toastr.less\" target=\"content\\content\\toastr.less\" />\n        <file src=\"content\\content\\toastr.min.css\" target=\"content\\content\\toastr.min.css\" />\n        <file src=\"content\\scripts\\toastr.js\" target=\"content\\scripts\\toastr.js\" />\n        <file src=\"content\\scripts\\toastr.min.js\" target=\"content\\scripts\\toastr.min.js\" />\n        <file src=\"content\\scripts\\toastr.min.js.map\" target=\"content\\scripts\\toastr.min.js.map\" />\n    </files>\n</package>"
  },
  {
    "path": "nuget/toastr.2.0.2.nuspec",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<package xmlns=\"http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd\">\n    <metadata>\n        <id>toastr</id>\n        <version>2.0.2</version>\n        <title>toastr</title>\n        <authors>John Papa,Hans Fjällemark</authors>\n        <owners>John Papa,Hans Fjällemark</owners>\n        <licenseUrl>http://www.opensource.org/licenses/mit-license.php</licenseUrl>\n        <projectUrl>http://toastrjs.com/</projectUrl>\n        <iconUrl>http://johnpapa.net/wp-content/images/toastr-icon.png</iconUrl>\n        <requireLicenseAcceptance>false</requireLicenseAcceptance>\n        <description>3 Easy Steps:\n\n(1) Link to toastr.css  \n(2) Link to toastr.js \n(3) Use toastr to display a toast for info, success, warning or error\n\n// Display an info toast with no title\ntoastr.info('Are you the 6 fingered man?')\n\n*** For other API calls, see the demo</description>\n        <summary>Toastr is a JavaScript library for non-blocking notifications. jQuery is required. The goal is to create a simple core library that can be customized and extended.</summary>\n        <releaseNotes>Change log: https://github.com/CodeSeven/toastr/blob/master/CHANGELOG.md</releaseNotes>\n        <copyright>Copyright © 2012-2014 Hans Fjällemark &amp; John Papa.</copyright>\n        <language>en-US</language>\n        <tags>toastr, toast, notification, dialog, jquery</tags>\n        <dependencies>\n            <dependency id=\"jQuery\" version=\"1.6.3\" />\n        </dependencies>\n    </metadata>\n    <files>\n        <file src=\"content\\content\\toastr.css\" target=\"content\\content\\toastr.css\" />\n        <file src=\"content\\content\\toastr.less\" target=\"content\\content\\toastr.less\" />\n        <file src=\"content\\content\\toastr.min.css\" target=\"content\\content\\toastr.min.css\" />\n        <file src=\"content\\content\\toastr.scss\" target=\"content\\content\\toastr.scss\" />\n        <file src=\"content\\scripts\\toastr.js\" target=\"content\\scripts\\toastr.js\" />\n        <file src=\"content\\scripts\\toastr.min.js\" target=\"content\\scripts\\toastr.min.js\" />\n        <file src=\"content\\scripts\\toastr.min.js.map\" target=\"content\\scripts\\toastr.min.js.map\" />\n    </files>\n</package>"
  },
  {
    "path": "nuget/toastr.2.0.3.nuspec",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<package xmlns=\"http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd\">\n    <metadata>\n        <id>toastr</id>\n        <version>2.0.3</version>\n        <title>toastr</title>\n        <authors>John Papa,Hans Fjällemark</authors>\n        <owners>John Papa,Hans Fjällemark</owners>\n        <licenseUrl>http://www.opensource.org/licenses/mit-license.php</licenseUrl>\n        <projectUrl>http://toastrjs.com/</projectUrl>\n        <iconUrl>http://johnpapa.net/wp-content/images/toastr-icon.png</iconUrl>\n        <requireLicenseAcceptance>false</requireLicenseAcceptance>\n        <description>3 Easy Steps:\n\n(1) Link to toastr.css  \n(2) Link to toastr.js \n(3) Use toastr to display a toast for info, success, warning or error\n\n// Display an info toast with no title\ntoastr.info('Are you the 6 fingered man?')\n\n*** For other API calls, see the demo</description>\n        <summary>Toastr is a JavaScript library for non-blocking notifications. jQuery is required. The goal is to create a simple core library that can be customized and extended.</summary>\n        <releaseNotes>Change log: https://github.com/CodeSeven/toastr/blob/master/CHANGELOG.md</releaseNotes>\n        <copyright>Copyright © 2012-2014 Hans Fjällemark &amp; John Papa.</copyright>\n        <language>en-US</language>\n        <tags>toastr, toast, notification, dialog, jquery</tags>\n        <dependencies>\n            <dependency id=\"jQuery\" version=\"1.6.3\" />\n        </dependencies>\n    </metadata>\n    <files>\n        <file src=\"content\\content\\toastr.css\" target=\"content\\content\\toastr.css\" />\n        <file src=\"content\\content\\toastr.less\" target=\"content\\content\\toastr.less\" />\n        <file src=\"content\\content\\toastr.min.css\" target=\"content\\content\\toastr.min.css\" />\n        <file src=\"content\\content\\toastr.scss\" target=\"content\\content\\toastr.scss\" />\n        <file src=\"content\\scripts\\toastr.js\" target=\"content\\scripts\\toastr.js\" />\n        <file src=\"content\\scripts\\toastr.min.js\" target=\"content\\scripts\\toastr.min.js\" />\n        <file src=\"content\\scripts\\toastr.min.js.map\" target=\"content\\scripts\\toastr.min.js.map\" />\n    </files>\n</package>"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"toastr\",\n  \"filename\": \"build/toastr.min.js\",\n  \"main\": \"toastr.js\",\n  \"style\": \"build/toastr.min.css\",\n  \"version\": \"2.1.4\",\n  \"description\": \"ToastrJS is a JavaScript library for Gnome / Growl type non-blocking notifications. jQuery is required. The goal is to create a simple core library that can be customized and extended.\",\n  \"homepage\": \"http://www.toastrjs.com\",\n  \"keywords\": [\n    \"Toastr\",\n    \"ToastrJS\",\n    \"toastr.js\"\n  ],\n  \"maintainers\": [\n    {\n      \"name\": \"John Papa\",\n      \"web\": \"http://www.johnpapa.net\",\n      \"twitter\": \"@john_papa\"\n    },\n    {\n      \"name\": \"Tim Ferrell\",\n      \"web\": \"https://twitter.com/ferrell_tim\",\n      \"twitter\": \"@ferrell_tim\"\n    }\n  ],\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git://github.com/CodeSeven/toastr.git\"\n  },\n  \"bugs\": \"http://stackoverflow.com/questions/tagged/toastr\",\n  \"licenses\": [\n    {\n      \"type\": \"MIT\",\n      \"url\": \"http://www.opensource.org/licenses/mit-license.php\"\n    }\n  ],\n  \"dependencies\": {\n    \"jquery\": \">=1.12.0\"\n  },\n  \"devDependencies\": {\n    \"gulp\": \"^3.8.10\",\n    \"gulp-bytediff\": \"^0.2.0\",\n    \"gulp-jscs\": \"^1.3.0\",\n    \"gulp-jshint\": \"^1.9.0\",\n    \"gulp-less\": \"^3.0.3\",\n    \"gulp-load-plugins\": \"^0.7.1\",\n    \"gulp-load-utils\": \"0.0.4\",\n    \"gulp-minify-css\": \"^0.3.11\",\n    \"gulp-rename\": \"^1.2.0\",\n    \"gulp-sourcemaps\": \"^1.2.8\",\n    \"gulp-task-listing\": \"^0.3.0\",\n    \"gulp-uglify\": \"^1.0.1\",\n    \"gulp-util\": \"^3.0.1\",\n    \"jquery\": \">=1.12.0\",\n    \"jshint-stylish\": \"^1.0.0\",\n    \"karma\": \"^1.7.0\",\n    \"karma-coverage\": \"^1.1.1\",\n    \"karma-phantomjs-launcher\": \"^1.0.4\",\n    \"karma-qunit\": \"^0.1.3\",\n    \"merge-stream\": \"^0.1.6\",\n    \"phantomjs-prebuilt\": \"^2.1.14\",\n    \"plato\": \"^1.2.2\",\n    \"qunitjs\": \"~1.14.0\"\n  },\n  \"scripts\": {\n    \"test\": \"gulp test\"\n  }\n}\n"
  },
  {
    "path": "release checklist.md",
    "content": "Toastr Release Checklist\n\n1. Update Toastr Version\n\t* toastr.js\n\t* bower.json (toastr-bower repo)\n\t* package.json\n\t* nuget versions and dependency versions\n\t* readme file for github repo\n\t* Consider HotTowel VSIX\n2. Gulp\n\t* run main demo\n    * `gulp analyze`\n\t* `gulp test`\n    * `gulp`\n3. Nuget\n\t* Copy new files in\n\t* Build\n\t* Test\n4. CDNJS\n\t* Update CDNJS\n5. Update Website with New Downloads\n6. Publish Bower\n\t* Include License and Readme\n\t* Test Locally\n\t* Update Github repo toastr-bower\n\t* Github tag\n\t* Register with Bower\n7. Publish Nugets\n8. Release on Github \n\t* Tag with semver\n\t* Attach all artifacts\n9. Blog post"
  },
  {
    "path": "tests/qunit/qunit.css",
    "content": "/**\n * QUnit v1.12.0 - A JavaScript Unit Testing Framework\n *\n * http://qunitjs.com\n *\n * Copyright 2012 jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n/** Font Family and Sizes */\n\n#qunit-tests, #qunit-header, #qunit-banner, #qunit-testrunner-toolbar, #qunit-userAgent, #qunit-testresult {\n\tfont-family: \"Helvetica Neue Light\", \"HelveticaNeue-Light\", \"Helvetica Neue\", Calibri, Helvetica, Arial, sans-serif;\n}\n\n#qunit-testrunner-toolbar, #qunit-userAgent, #qunit-testresult, #qunit-tests li { font-size: small; }\n#qunit-tests { font-size: smaller; }\n\n\n/** Resets */\n\n#qunit-tests, #qunit-header, #qunit-banner, #qunit-userAgent, #qunit-testresult, #qunit-modulefilter {\n\tmargin: 0;\n\tpadding: 0;\n}\n\n\n/** Header */\n\n#qunit-header {\n\tpadding: 0.5em 0 0.5em 1em;\n\n\tcolor: #8699a4;\n\tbackground-color: #0d3349;\n\n\tfont-size: 1.5em;\n\tline-height: 1em;\n\tfont-weight: normal;\n\n\tborder-radius: 5px 5px 0 0;\n\t-moz-border-radius: 5px 5px 0 0;\n\t-webkit-border-top-right-radius: 5px;\n\t-webkit-border-top-left-radius: 5px;\n}\n\n#qunit-header a {\n\ttext-decoration: none;\n\tcolor: #c2ccd1;\n}\n\n#qunit-header a:hover,\n#qunit-header a:focus {\n\tcolor: #fff;\n}\n\n#qunit-testrunner-toolbar label {\n\tdisplay: inline-block;\n\tpadding: 0 .5em 0 .1em;\n}\n\n#qunit-banner {\n\theight: 5px;\n}\n\n#qunit-testrunner-toolbar {\n\tpadding: 0.5em 0 0.5em 2em;\n\tcolor: #5E740B;\n\tbackground-color: #eee;\n\toverflow: hidden;\n}\n\n#qunit-userAgent {\n\tpadding: 0.5em 0 0.5em 2.5em;\n\tbackground-color: #2b81af;\n\tcolor: #fff;\n\ttext-shadow: rgba(0, 0, 0, 0.5) 2px 2px 1px;\n}\n\n#qunit-modulefilter-container {\n\tfloat: right;\n}\n\n/** Tests: Pass/Fail */\n\n#qunit-tests {\n\tlist-style-position: inside;\n}\n\n#qunit-tests li {\n\tpadding: 0.4em 0.5em 0.4em 2.5em;\n\tborder-bottom: 1px solid #fff;\n\tlist-style-position: inside;\n}\n\n#qunit-tests.hidepass li.pass, #qunit-tests.hidepass li.running  {\n\tdisplay: none;\n}\n\n#qunit-tests li strong {\n\tcursor: pointer;\n}\n\n#qunit-tests li a {\n\tpadding: 0.5em;\n\tcolor: #c2ccd1;\n\ttext-decoration: none;\n}\n#qunit-tests li a:hover,\n#qunit-tests li a:focus {\n\tcolor: #000;\n}\n\n#qunit-tests li .runtime {\n\tfloat: right;\n\tfont-size: smaller;\n}\n\n.qunit-assert-list {\n\tmargin-top: 0.5em;\n\tpadding: 0.5em;\n\n\tbackground-color: #fff;\n\n\tborder-radius: 5px;\n\t-moz-border-radius: 5px;\n\t-webkit-border-radius: 5px;\n}\n\n.qunit-collapsed {\n\tdisplay: none;\n}\n\n#qunit-tests table {\n\tborder-collapse: collapse;\n\tmargin-top: .2em;\n}\n\n#qunit-tests th {\n\ttext-align: right;\n\tvertical-align: top;\n\tpadding: 0 .5em 0 0;\n}\n\n#qunit-tests td {\n\tvertical-align: top;\n}\n\n#qunit-tests pre {\n\tmargin: 0;\n\twhite-space: pre-wrap;\n\tword-wrap: break-word;\n}\n\n#qunit-tests del {\n\tbackground-color: #e0f2be;\n\tcolor: #374e0c;\n\ttext-decoration: none;\n}\n\n#qunit-tests ins {\n\tbackground-color: #ffcaca;\n\tcolor: #500;\n\ttext-decoration: none;\n}\n\n/*** Test Counts */\n\n#qunit-tests b.counts                       { color: black; }\n#qunit-tests b.passed                       { color: #5E740B; }\n#qunit-tests b.failed                       { color: #710909; }\n\n#qunit-tests li li {\n\tpadding: 5px;\n\tbackground-color: #fff;\n\tborder-bottom: none;\n\tlist-style-position: inside;\n}\n\n/*** Passing Styles */\n\n#qunit-tests li li.pass {\n\tcolor: #3c510c;\n\tbackground-color: #fff;\n\tborder-left: 10px solid #C6E746;\n}\n\n#qunit-tests .pass                          { color: #528CE0; background-color: #D2E0E6; }\n#qunit-tests .pass .test-name               { color: #366097; }\n\n#qunit-tests .pass .test-actual,\n#qunit-tests .pass .test-expected           { color: #999999; }\n\n#qunit-banner.qunit-pass                    { background-color: #C6E746; }\n\n/*** Failing Styles */\n\n#qunit-tests li li.fail {\n\tcolor: #710909;\n\tbackground-color: #fff;\n\tborder-left: 10px solid #EE5757;\n\twhite-space: pre;\n}\n\n#qunit-tests > li:last-child {\n\tborder-radius: 0 0 5px 5px;\n\t-moz-border-radius: 0 0 5px 5px;\n\t-webkit-border-bottom-right-radius: 5px;\n\t-webkit-border-bottom-left-radius: 5px;\n}\n\n#qunit-tests .fail                          { color: #000000; background-color: #EE5757; }\n#qunit-tests .fail .test-name,\n#qunit-tests .fail .module-name             { color: #000000; }\n\n#qunit-tests .fail .test-actual             { color: #EE5757; }\n#qunit-tests .fail .test-expected           { color: green;   }\n\n#qunit-banner.qunit-fail                    { background-color: #EE5757; }\n\n\n/** Result */\n\n#qunit-testresult {\n\tpadding: 0.5em 0.5em 0.5em 2.5em;\n\n\tcolor: #2b81af;\n\tbackground-color: #D2E0E6;\n\n\tborder-bottom: 1px solid white;\n}\n#qunit-testresult .module-name {\n\tfont-weight: bold;\n}\n\n/** Fixture */\n\n#qunit-fixture {\n\tposition: absolute;\n\ttop: -10000px;\n\tleft: -10000px;\n\twidth: 1000px;\n\theight: 1000px;\n}\n"
  },
  {
    "path": "tests/qunit/qunit.js",
    "content": "/**\n * QUnit v1.12.0 - A JavaScript Unit Testing Framework\n *\n * http://qunitjs.com\n *\n * Copyright 2013 jQuery Foundation and other contributors\n * Released under the MIT license.\n * https://jquery.org/license/\n */\n\n(function( window ) {\n\nvar QUnit,\n\tassert,\n\tconfig,\n\tonErrorFnPrev,\n\ttestId = 0,\n\tfileName = (sourceFromStacktrace( 0 ) || \"\" ).replace(/(:\\d+)+\\)?/, \"\").replace(/.+\\//, \"\"),\n\ttoString = Object.prototype.toString,\n\thasOwn = Object.prototype.hasOwnProperty,\n\t// Keep a local reference to Date (GH-283)\n\tDate = window.Date,\n\tsetTimeout = window.setTimeout,\n\tdefined = {\n\t\tsetTimeout: typeof window.setTimeout !== \"undefined\",\n\t\tsessionStorage: (function() {\n\t\t\tvar x = \"qunit-test-string\";\n\t\t\ttry {\n\t\t\t\tsessionStorage.setItem( x, x );\n\t\t\t\tsessionStorage.removeItem( x );\n\t\t\t\treturn true;\n\t\t\t} catch( e ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}())\n\t},\n\t/**\n\t * Provides a normalized error string, correcting an issue\n\t * with IE 7 (and prior) where Error.prototype.toString is\n\t * not properly implemented\n\t *\n\t * Based on http://es5.github.com/#x15.11.4.4\n\t *\n\t * @param {String|Error} error\n\t * @return {String} error message\n\t */\n\terrorString = function( error ) {\n\t\tvar name, message,\n\t\t\terrorString = error.toString();\n\t\tif ( errorString.substring( 0, 7 ) === \"[object\" ) {\n\t\t\tname = error.name ? error.name.toString() : \"Error\";\n\t\t\tmessage = error.message ? error.message.toString() : \"\";\n\t\t\tif ( name && message ) {\n\t\t\t\treturn name + \": \" + message;\n\t\t\t} else if ( name ) {\n\t\t\t\treturn name;\n\t\t\t} else if ( message ) {\n\t\t\t\treturn message;\n\t\t\t} else {\n\t\t\t\treturn \"Error\";\n\t\t\t}\n\t\t} else {\n\t\t\treturn errorString;\n\t\t}\n\t},\n\t/**\n\t * Makes a clone of an object using only Array or Object as base,\n\t * and copies over the own enumerable properties.\n\t *\n\t * @param {Object} obj\n\t * @return {Object} New object with only the own properties (recursively).\n\t */\n\tobjectValues = function( obj ) {\n\t\t// Grunt 0.3.x uses an older version of jshint that still has jshint/jshint#392.\n\t\t/*jshint newcap: false */\n\t\tvar key, val,\n\t\t\tvals = QUnit.is( \"array\", obj ) ? [] : {};\n\t\tfor ( key in obj ) {\n\t\t\tif ( hasOwn.call( obj, key ) ) {\n\t\t\t\tval = obj[key];\n\t\t\t\tvals[key] = val === Object(val) ? objectValues(val) : val;\n\t\t\t}\n\t\t}\n\t\treturn vals;\n\t};\n\nfunction Test( settings ) {\n\textend( this, settings );\n\tthis.assertions = [];\n\tthis.testNumber = ++Test.count;\n}\n\nTest.count = 0;\n\nTest.prototype = {\n\tinit: function() {\n\t\tvar a, b, li,\n\t\t\ttests = id( \"qunit-tests\" );\n\n\t\tif ( tests ) {\n\t\t\tb = document.createElement( \"strong\" );\n\t\t\tb.innerHTML = this.nameHtml;\n\n\t\t\t// `a` initialized at top of scope\n\t\t\ta = document.createElement( \"a\" );\n\t\t\ta.innerHTML = \"Rerun\";\n\t\t\ta.href = QUnit.url({ testNumber: this.testNumber });\n\n\t\t\tli = document.createElement( \"li\" );\n\t\t\tli.appendChild( b );\n\t\t\tli.appendChild( a );\n\t\t\tli.className = \"running\";\n\t\t\tli.id = this.id = \"qunit-test-output\" + testId++;\n\n\t\t\ttests.appendChild( li );\n\t\t}\n\t},\n\tsetup: function() {\n\t\tif (\n\t\t\t// Emit moduleStart when we're switching from one module to another\n\t\t\tthis.module !== config.previousModule ||\n\t\t\t\t// They could be equal (both undefined) but if the previousModule property doesn't\n\t\t\t\t// yet exist it means this is the first test in a suite that isn't wrapped in a\n\t\t\t\t// module, in which case we'll just emit a moduleStart event for 'undefined'.\n\t\t\t\t// Without this, reporters can get testStart before moduleStart  which is a problem.\n\t\t\t\t!hasOwn.call( config, \"previousModule\" )\n\t\t) {\n\t\t\tif ( hasOwn.call( config, \"previousModule\" ) ) {\n\t\t\t\trunLoggingCallbacks( \"moduleDone\", QUnit, {\n\t\t\t\t\tname: config.previousModule,\n\t\t\t\t\tfailed: config.moduleStats.bad,\n\t\t\t\t\tpassed: config.moduleStats.all - config.moduleStats.bad,\n\t\t\t\t\ttotal: config.moduleStats.all\n\t\t\t\t});\n\t\t\t}\n\t\t\tconfig.previousModule = this.module;\n\t\t\tconfig.moduleStats = { all: 0, bad: 0 };\n\t\t\trunLoggingCallbacks( \"moduleStart\", QUnit, {\n\t\t\t\tname: this.module\n\t\t\t});\n\t\t}\n\n\t\tconfig.current = this;\n\n\t\tthis.testEnvironment = extend({\n\t\t\tsetup: function() {},\n\t\t\tteardown: function() {}\n\t\t}, this.moduleTestEnvironment );\n\n\t\tthis.started = +new Date();\n\t\trunLoggingCallbacks( \"testStart\", QUnit, {\n\t\t\tname: this.testName,\n\t\t\tmodule: this.module\n\t\t});\n\n\t\t/*jshint camelcase:false */\n\n\n\t\t/**\n\t\t * Expose the current test environment.\n\t\t *\n\t\t * @deprecated since 1.12.0: Use QUnit.config.current.testEnvironment instead.\n\t\t */\n\t\tQUnit.current_testEnvironment = this.testEnvironment;\n\n\t\t/*jshint camelcase:true */\n\n\t\tif ( !config.pollution ) {\n\t\t\tsaveGlobal();\n\t\t}\n\t\tif ( config.notrycatch ) {\n\t\t\tthis.testEnvironment.setup.call( this.testEnvironment, QUnit.assert );\n\t\t\treturn;\n\t\t}\n\t\ttry {\n\t\t\tthis.testEnvironment.setup.call( this.testEnvironment, QUnit.assert );\n\t\t} catch( e ) {\n\t\t\tQUnit.pushFailure( \"Setup failed on \" + this.testName + \": \" + ( e.message || e ), extractStacktrace( e, 1 ) );\n\t\t}\n\t},\n\trun: function() {\n\t\tconfig.current = this;\n\n\t\tvar running = id( \"qunit-testresult\" );\n\n\t\tif ( running ) {\n\t\t\trunning.innerHTML = \"Running: <br/>\" + this.nameHtml;\n\t\t}\n\n\t\tif ( this.async ) {\n\t\t\tQUnit.stop();\n\t\t}\n\n\t\tthis.callbackStarted = +new Date();\n\n\t\tif ( config.notrycatch ) {\n\t\t\tthis.callback.call( this.testEnvironment, QUnit.assert );\n\t\t\tthis.callbackRuntime = +new Date() - this.callbackStarted;\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\tthis.callback.call( this.testEnvironment, QUnit.assert );\n\t\t\tthis.callbackRuntime = +new Date() - this.callbackStarted;\n\t\t} catch( e ) {\n\t\t\tthis.callbackRuntime = +new Date() - this.callbackStarted;\n\n\t\t\tQUnit.pushFailure( \"Died on test #\" + (this.assertions.length + 1) + \" \" + this.stack + \": \" + ( e.message || e ), extractStacktrace( e, 0 ) );\n\t\t\t// else next test will carry the responsibility\n\t\t\tsaveGlobal();\n\n\t\t\t// Restart the tests if they're blocking\n\t\t\tif ( config.blocking ) {\n\t\t\t\tQUnit.start();\n\t\t\t}\n\t\t}\n\t},\n\tteardown: function() {\n\t\tconfig.current = this;\n\t\tif ( config.notrycatch ) {\n\t\t\tif ( typeof this.callbackRuntime === \"undefined\" ) {\n\t\t\t\tthis.callbackRuntime = +new Date() - this.callbackStarted;\n\t\t\t}\n\t\t\tthis.testEnvironment.teardown.call( this.testEnvironment, QUnit.assert );\n\t\t\treturn;\n\t\t} else {\n\t\t\ttry {\n\t\t\t\tthis.testEnvironment.teardown.call( this.testEnvironment, QUnit.assert );\n\t\t\t} catch( e ) {\n\t\t\t\tQUnit.pushFailure( \"Teardown failed on \" + this.testName + \": \" + ( e.message || e ), extractStacktrace( e, 1 ) );\n\t\t\t}\n\t\t}\n\t\tcheckPollution();\n\t},\n\tfinish: function() {\n\t\tconfig.current = this;\n\t\tif ( config.requireExpects && this.expected === null ) {\n\t\t\tQUnit.pushFailure( \"Expected number of assertions to be defined, but expect() was not called.\", this.stack );\n\t\t} else if ( this.expected !== null && this.expected !== this.assertions.length ) {\n\t\t\tQUnit.pushFailure( \"Expected \" + this.expected + \" assertions, but \" + this.assertions.length + \" were run\", this.stack );\n\t\t} else if ( this.expected === null && !this.assertions.length ) {\n\t\t\tQUnit.pushFailure( \"Expected at least one assertion, but none were run - call expect(0) to accept zero assertions.\", this.stack );\n\t\t}\n\n\t\tvar i, assertion, a, b, time, li, ol,\n\t\t\ttest = this,\n\t\t\tgood = 0,\n\t\t\tbad = 0,\n\t\t\ttests = id( \"qunit-tests\" );\n\n\t\tthis.runtime = +new Date() - this.started;\n\t\tconfig.stats.all += this.assertions.length;\n\t\tconfig.moduleStats.all += this.assertions.length;\n\n\t\tif ( tests ) {\n\t\t\tol = document.createElement( \"ol\" );\n\t\t\tol.className = \"qunit-assert-list\";\n\n\t\t\tfor ( i = 0; i < this.assertions.length; i++ ) {\n\t\t\t\tassertion = this.assertions[i];\n\n\t\t\t\tli = document.createElement( \"li\" );\n\t\t\t\tli.className = assertion.result ? \"pass\" : \"fail\";\n\t\t\t\tli.innerHTML = assertion.message || ( assertion.result ? \"okay\" : \"failed\" );\n\t\t\t\tol.appendChild( li );\n\n\t\t\t\tif ( assertion.result ) {\n\t\t\t\t\tgood++;\n\t\t\t\t} else {\n\t\t\t\t\tbad++;\n\t\t\t\t\tconfig.stats.bad++;\n\t\t\t\t\tconfig.moduleStats.bad++;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// store result when possible\n\t\t\tif ( QUnit.config.reorder && defined.sessionStorage ) {\n\t\t\t\tif ( bad ) {\n\t\t\t\t\tsessionStorage.setItem( \"qunit-test-\" + this.module + \"-\" + this.testName, bad );\n\t\t\t\t} else {\n\t\t\t\t\tsessionStorage.removeItem( \"qunit-test-\" + this.module + \"-\" + this.testName );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( bad === 0 ) {\n\t\t\t\taddClass( ol, \"qunit-collapsed\" );\n\t\t\t}\n\n\t\t\t// `b` initialized at top of scope\n\t\t\tb = document.createElement( \"strong\" );\n\t\t\tb.innerHTML = this.nameHtml + \" <b class='counts'>(<b class='failed'>\" + bad + \"</b>, <b class='passed'>\" + good + \"</b>, \" + this.assertions.length + \")</b>\";\n\n\t\t\taddEvent(b, \"click\", function() {\n\t\t\t\tvar next = b.parentNode.lastChild,\n\t\t\t\t\tcollapsed = hasClass( next, \"qunit-collapsed\" );\n\t\t\t\t( collapsed ? removeClass : addClass )( next, \"qunit-collapsed\" );\n\t\t\t});\n\n\t\t\taddEvent(b, \"dblclick\", function( e ) {\n\t\t\t\tvar target = e && e.target ? e.target : window.event.srcElement;\n\t\t\t\tif ( target.nodeName.toLowerCase() === \"span\" || target.nodeName.toLowerCase() === \"b\" ) {\n\t\t\t\t\ttarget = target.parentNode;\n\t\t\t\t}\n\t\t\t\tif ( window.location && target.nodeName.toLowerCase() === \"strong\" ) {\n\t\t\t\t\twindow.location = QUnit.url({ testNumber: test.testNumber });\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// `time` initialized at top of scope\n\t\t\ttime = document.createElement( \"span\" );\n\t\t\ttime.className = \"runtime\";\n\t\t\ttime.innerHTML = this.runtime + \" ms\";\n\n\t\t\t// `li` initialized at top of scope\n\t\t\tli = id( this.id );\n\t\t\tli.className = bad ? \"fail\" : \"pass\";\n\t\t\tli.removeChild( li.firstChild );\n\t\t\ta = li.firstChild;\n\t\t\tli.appendChild( b );\n\t\t\tli.appendChild( a );\n\t\t\tli.appendChild( time );\n\t\t\tli.appendChild( ol );\n\n\t\t} else {\n\t\t\tfor ( i = 0; i < this.assertions.length; i++ ) {\n\t\t\t\tif ( !this.assertions[i].result ) {\n\t\t\t\t\tbad++;\n\t\t\t\t\tconfig.stats.bad++;\n\t\t\t\t\tconfig.moduleStats.bad++;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\trunLoggingCallbacks( \"testDone\", QUnit, {\n\t\t\tname: this.testName,\n\t\t\tmodule: this.module,\n\t\t\tfailed: bad,\n\t\t\tpassed: this.assertions.length - bad,\n\t\t\ttotal: this.assertions.length,\n\t\t\tduration: this.runtime\n\t\t});\n\n\t\tQUnit.reset();\n\n\t\tconfig.current = undefined;\n\t},\n\n\tqueue: function() {\n\t\tvar bad,\n\t\t\ttest = this;\n\n\t\tsynchronize(function() {\n\t\t\ttest.init();\n\t\t});\n\t\tfunction run() {\n\t\t\t// each of these can by async\n\t\t\tsynchronize(function() {\n\t\t\t\ttest.setup();\n\t\t\t});\n\t\t\tsynchronize(function() {\n\t\t\t\ttest.run();\n\t\t\t});\n\t\t\tsynchronize(function() {\n\t\t\t\ttest.teardown();\n\t\t\t});\n\t\t\tsynchronize(function() {\n\t\t\t\ttest.finish();\n\t\t\t});\n\t\t}\n\n\t\t// `bad` initialized at top of scope\n\t\t// defer when previous test run passed, if storage is available\n\t\tbad = QUnit.config.reorder && defined.sessionStorage &&\n\t\t\t\t\t\t+sessionStorage.getItem( \"qunit-test-\" + this.module + \"-\" + this.testName );\n\n\t\tif ( bad ) {\n\t\t\trun();\n\t\t} else {\n\t\t\tsynchronize( run, true );\n\t\t}\n\t}\n};\n\n// Root QUnit object.\n// `QUnit` initialized at top of scope\nQUnit = {\n\n\t// call on start of module test to prepend name to all tests\n\tmodule: function( name, testEnvironment ) {\n\t\tconfig.currentModule = name;\n\t\tconfig.currentModuleTestEnvironment = testEnvironment;\n\t\tconfig.modules[name] = true;\n\t},\n\n\tasyncTest: function( testName, expected, callback ) {\n\t\tif ( arguments.length === 2 ) {\n\t\t\tcallback = expected;\n\t\t\texpected = null;\n\t\t}\n\n\t\tQUnit.test( testName, expected, callback, true );\n\t},\n\n\ttest: function( testName, expected, callback, async ) {\n\t\tvar test,\n\t\t\tnameHtml = \"<span class='test-name'>\" + escapeText( testName ) + \"</span>\";\n\n\t\tif ( arguments.length === 2 ) {\n\t\t\tcallback = expected;\n\t\t\texpected = null;\n\t\t}\n\n\t\tif ( config.currentModule ) {\n\t\t\tnameHtml = \"<span class='module-name'>\" + escapeText( config.currentModule ) + \"</span>: \" + nameHtml;\n\t\t}\n\n\t\ttest = new Test({\n\t\t\tnameHtml: nameHtml,\n\t\t\ttestName: testName,\n\t\t\texpected: expected,\n\t\t\tasync: async,\n\t\t\tcallback: callback,\n\t\t\tmodule: config.currentModule,\n\t\t\tmoduleTestEnvironment: config.currentModuleTestEnvironment,\n\t\t\tstack: sourceFromStacktrace( 2 )\n\t\t});\n\n\t\tif ( !validTest( test ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\ttest.queue();\n\t},\n\n\t// Specify the number of expected assertions to guarantee that failed test (no assertions are run at all) don't slip through.\n\texpect: function( asserts ) {\n\t\tif (arguments.length === 1) {\n\t\t\tconfig.current.expected = asserts;\n\t\t} else {\n\t\t\treturn config.current.expected;\n\t\t}\n\t},\n\n\tstart: function( count ) {\n\t\t// QUnit hasn't been initialized yet.\n\t\t// Note: RequireJS (et al) may delay onLoad\n\t\tif ( config.semaphore === undefined ) {\n\t\t\tQUnit.begin(function() {\n\t\t\t\t// This is triggered at the top of QUnit.load, push start() to the event loop, to allow QUnit.load to finish first\n\t\t\t\tsetTimeout(function() {\n\t\t\t\t\tQUnit.start( count );\n\t\t\t\t});\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tconfig.semaphore -= count || 1;\n\t\t// don't start until equal number of stop-calls\n\t\tif ( config.semaphore > 0 ) {\n\t\t\treturn;\n\t\t}\n\t\t// ignore if start is called more often then stop\n\t\tif ( config.semaphore < 0 ) {\n\t\t\tconfig.semaphore = 0;\n\t\t\tQUnit.pushFailure( \"Called start() while already started (QUnit.config.semaphore was 0 already)\", null, sourceFromStacktrace(2) );\n\t\t\treturn;\n\t\t}\n\t\t// A slight delay, to avoid any current callbacks\n\t\tif ( defined.setTimeout ) {\n\t\t\tsetTimeout(function() {\n\t\t\t\tif ( config.semaphore > 0 ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif ( config.timeout ) {\n\t\t\t\t\tclearTimeout( config.timeout );\n\t\t\t\t}\n\n\t\t\t\tconfig.blocking = false;\n\t\t\t\tprocess( true );\n\t\t\t}, 13);\n\t\t} else {\n\t\t\tconfig.blocking = false;\n\t\t\tprocess( true );\n\t\t}\n\t},\n\n\tstop: function( count ) {\n\t\tconfig.semaphore += count || 1;\n\t\tconfig.blocking = true;\n\n\t\tif ( config.testTimeout && defined.setTimeout ) {\n\t\t\tclearTimeout( config.timeout );\n\t\t\tconfig.timeout = setTimeout(function() {\n\t\t\t\tQUnit.ok( false, \"Test timed out\" );\n\t\t\t\tconfig.semaphore = 1;\n\t\t\t\tQUnit.start();\n\t\t\t}, config.testTimeout );\n\t\t}\n\t}\n};\n\n// `assert` initialized at top of scope\n// Assert helpers\n// All of these must either call QUnit.push() or manually do:\n// - runLoggingCallbacks( \"log\", .. );\n// - config.current.assertions.push({ .. });\n// We attach it to the QUnit object *after* we expose the public API,\n// otherwise `assert` will become a global variable in browsers (#341).\nassert = {\n\t/**\n\t * Asserts rough true-ish result.\n\t * @name ok\n\t * @function\n\t * @example ok( \"asdfasdf\".length > 5, \"There must be at least 5 chars\" );\n\t */\n\tok: function( result, msg ) {\n\t\tif ( !config.current ) {\n\t\t\tthrow new Error( \"ok() assertion outside test context, was \" + sourceFromStacktrace(2) );\n\t\t}\n\t\tresult = !!result;\n\t\tmsg = msg || (result ? \"okay\" : \"failed\" );\n\n\t\tvar source,\n\t\t\tdetails = {\n\t\t\t\tmodule: config.current.module,\n\t\t\t\tname: config.current.testName,\n\t\t\t\tresult: result,\n\t\t\t\tmessage: msg\n\t\t\t};\n\n\t\tmsg = \"<span class='test-message'>\" + escapeText( msg ) + \"</span>\";\n\n\t\tif ( !result ) {\n\t\t\tsource = sourceFromStacktrace( 2 );\n\t\t\tif ( source ) {\n\t\t\t\tdetails.source = source;\n\t\t\t\tmsg += \"<table><tr class='test-source'><th>Source: </th><td><pre>\" + escapeText( source ) + \"</pre></td></tr></table>\";\n\t\t\t}\n\t\t}\n\t\trunLoggingCallbacks( \"log\", QUnit, details );\n\t\tconfig.current.assertions.push({\n\t\t\tresult: result,\n\t\t\tmessage: msg\n\t\t});\n\t},\n\n\t/**\n\t * Assert that the first two arguments are equal, with an optional message.\n\t * Prints out both actual and expected values.\n\t * @name equal\n\t * @function\n\t * @example equal( format( \"Received {0} bytes.\", 2), \"Received 2 bytes.\", \"format() replaces {0} with next argument\" );\n\t */\n\tequal: function( actual, expected, message ) {\n\t\t/*jshint eqeqeq:false */\n\t\tQUnit.push( expected == actual, actual, expected, message );\n\t},\n\n\t/**\n\t * @name notEqual\n\t * @function\n\t */\n\tnotEqual: function( actual, expected, message ) {\n\t\t/*jshint eqeqeq:false */\n\t\tQUnit.push( expected != actual, actual, expected, message );\n\t},\n\n\t/**\n\t * @name propEqual\n\t * @function\n\t */\n\tpropEqual: function( actual, expected, message ) {\n\t\tactual = objectValues(actual);\n\t\texpected = objectValues(expected);\n\t\tQUnit.push( QUnit.equiv(actual, expected), actual, expected, message );\n\t},\n\n\t/**\n\t * @name notPropEqual\n\t * @function\n\t */\n\tnotPropEqual: function( actual, expected, message ) {\n\t\tactual = objectValues(actual);\n\t\texpected = objectValues(expected);\n\t\tQUnit.push( !QUnit.equiv(actual, expected), actual, expected, message );\n\t},\n\n\t/**\n\t * @name deepEqual\n\t * @function\n\t */\n\tdeepEqual: function( actual, expected, message ) {\n\t\tQUnit.push( QUnit.equiv(actual, expected), actual, expected, message );\n\t},\n\n\t/**\n\t * @name notDeepEqual\n\t * @function\n\t */\n\tnotDeepEqual: function( actual, expected, message ) {\n\t\tQUnit.push( !QUnit.equiv(actual, expected), actual, expected, message );\n\t},\n\n\t/**\n\t * @name strictEqual\n\t * @function\n\t */\n\tstrictEqual: function( actual, expected, message ) {\n\t\tQUnit.push( expected === actual, actual, expected, message );\n\t},\n\n\t/**\n\t * @name notStrictEqual\n\t * @function\n\t */\n\tnotStrictEqual: function( actual, expected, message ) {\n\t\tQUnit.push( expected !== actual, actual, expected, message );\n\t},\n\n\t\"throws\": function( block, expected, message ) {\n\t\tvar actual,\n\t\t\texpectedOutput = expected,\n\t\t\tok = false;\n\n\t\t// 'expected' is optional\n\t\tif ( typeof expected === \"string\" ) {\n\t\t\tmessage = expected;\n\t\t\texpected = null;\n\t\t}\n\n\t\tconfig.current.ignoreGlobalErrors = true;\n\t\ttry {\n\t\t\tblock.call( config.current.testEnvironment );\n\t\t} catch (e) {\n\t\t\tactual = e;\n\t\t}\n\t\tconfig.current.ignoreGlobalErrors = false;\n\n\t\tif ( actual ) {\n\t\t\t// we don't want to validate thrown error\n\t\t\tif ( !expected ) {\n\t\t\t\tok = true;\n\t\t\t\texpectedOutput = null;\n\t\t\t// expected is a regexp\n\t\t\t} else if ( QUnit.objectType( expected ) === \"regexp\" ) {\n\t\t\t\tok = expected.test( errorString( actual ) );\n\t\t\t// expected is a constructor\n\t\t\t} else if ( actual instanceof expected ) {\n\t\t\t\tok = true;\n\t\t\t// expected is a validation function which returns true is validation passed\n\t\t\t} else if ( expected.call( {}, actual ) === true ) {\n\t\t\t\texpectedOutput = null;\n\t\t\t\tok = true;\n\t\t\t}\n\n\t\t\tQUnit.push( ok, actual, expectedOutput, message );\n\t\t} else {\n\t\t\tQUnit.pushFailure( message, null, \"No exception was thrown.\" );\n\t\t}\n\t}\n};\n\n/**\n * @deprecated since 1.8.0\n * Kept assertion helpers in root for backwards compatibility.\n */\nextend( QUnit, assert );\n\n/**\n * @deprecated since 1.9.0\n * Kept root \"raises()\" for backwards compatibility.\n * (Note that we don't introduce assert.raises).\n */\nQUnit.raises = assert[ \"throws\" ];\n\n/**\n * @deprecated since 1.0.0, replaced with error pushes since 1.3.0\n * Kept to avoid TypeErrors for undefined methods.\n */\nQUnit.equals = function() {\n\tQUnit.push( false, false, false, \"QUnit.equals has been deprecated since 2009 (e88049a0), use QUnit.equal instead\" );\n};\nQUnit.same = function() {\n\tQUnit.push( false, false, false, \"QUnit.same has been deprecated since 2009 (e88049a0), use QUnit.deepEqual instead\" );\n};\n\n// We want access to the constructor's prototype\n(function() {\n\tfunction F() {}\n\tF.prototype = QUnit;\n\tQUnit = new F();\n\t// Make F QUnit's constructor so that we can add to the prototype later\n\tQUnit.constructor = F;\n}());\n\n/**\n * Config object: Maintain internal state\n * Later exposed as QUnit.config\n * `config` initialized at top of scope\n */\nconfig = {\n\t// The queue of tests to run\n\tqueue: [],\n\n\t// block until document ready\n\tblocking: true,\n\n\t// when enabled, show only failing tests\n\t// gets persisted through sessionStorage and can be changed in UI via checkbox\n\thidepassed: false,\n\n\t// by default, run previously failed tests first\n\t// very useful in combination with \"Hide passed tests\" checked\n\treorder: true,\n\n\t// by default, modify document.title when suite is done\n\taltertitle: true,\n\n\t// when enabled, all tests must call expect()\n\trequireExpects: false,\n\n\t// add checkboxes that are persisted in the query-string\n\t// when enabled, the id is set to `true` as a `QUnit.config` property\n\turlConfig: [\n\t\t{\n\t\t\tid: \"noglobals\",\n\t\t\tlabel: \"Check for Globals\",\n\t\t\ttooltip: \"Enabling this will test if any test introduces new properties on the `window` object. Stored as query-strings.\"\n\t\t},\n\t\t{\n\t\t\tid: \"notrycatch\",\n\t\t\tlabel: \"No try-catch\",\n\t\t\ttooltip: \"Enabling this will run tests outside of a try-catch block. Makes debugging exceptions in IE reasonable. Stored as query-strings.\"\n\t\t}\n\t],\n\n\t// Set of all modules.\n\tmodules: {},\n\n\t// logging callback queues\n\tbegin: [],\n\tdone: [],\n\tlog: [],\n\ttestStart: [],\n\ttestDone: [],\n\tmoduleStart: [],\n\tmoduleDone: []\n};\n\n// Export global variables, unless an 'exports' object exists,\n// in that case we assume we're in CommonJS (dealt with on the bottom of the script)\nif ( typeof exports === \"undefined\" ) {\n\textend( window, QUnit.constructor.prototype );\n\n\t// Expose QUnit object\n\twindow.QUnit = QUnit;\n}\n\n// Initialize more QUnit.config and QUnit.urlParams\n(function() {\n\tvar i,\n\t\tlocation = window.location || { search: \"\", protocol: \"file:\" },\n\t\tparams = location.search.slice( 1 ).split( \"&\" ),\n\t\tlength = params.length,\n\t\turlParams = {},\n\t\tcurrent;\n\n\tif ( params[ 0 ] ) {\n\t\tfor ( i = 0; i < length; i++ ) {\n\t\t\tcurrent = params[ i ].split( \"=\" );\n\t\t\tcurrent[ 0 ] = decodeURIComponent( current[ 0 ] );\n\t\t\t// allow just a key to turn on a flag, e.g., test.html?noglobals\n\t\t\tcurrent[ 1 ] = current[ 1 ] ? decodeURIComponent( current[ 1 ] ) : true;\n\t\t\turlParams[ current[ 0 ] ] = current[ 1 ];\n\t\t}\n\t}\n\n\tQUnit.urlParams = urlParams;\n\n\t// String search anywhere in moduleName+testName\n\tconfig.filter = urlParams.filter;\n\n\t// Exact match of the module name\n\tconfig.module = urlParams.module;\n\n\tconfig.testNumber = parseInt( urlParams.testNumber, 10 ) || null;\n\n\t// Figure out if we're running the tests from a server or not\n\tQUnit.isLocal = location.protocol === \"file:\";\n}());\n\n// Extend QUnit object,\n// these after set here because they should not be exposed as global functions\nextend( QUnit, {\n\tassert: assert,\n\n\tconfig: config,\n\n\t// Initialize the configuration options\n\tinit: function() {\n\t\textend( config, {\n\t\t\tstats: { all: 0, bad: 0 },\n\t\t\tmoduleStats: { all: 0, bad: 0 },\n\t\t\tstarted: +new Date(),\n\t\t\tupdateRate: 1000,\n\t\t\tblocking: false,\n\t\t\tautostart: true,\n\t\t\tautorun: false,\n\t\t\tfilter: \"\",\n\t\t\tqueue: [],\n\t\t\tsemaphore: 1\n\t\t});\n\n\t\tvar tests, banner, result,\n\t\t\tqunit = id( \"qunit\" );\n\n\t\tif ( qunit ) {\n\t\t\tqunit.innerHTML =\n\t\t\t\t\"<h1 id='qunit-header'>\" + escapeText( document.title ) + \"</h1>\" +\n\t\t\t\t\"<h2 id='qunit-banner'></h2>\" +\n\t\t\t\t\"<div id='qunit-testrunner-toolbar'></div>\" +\n\t\t\t\t\"<h2 id='qunit-userAgent'></h2>\" +\n\t\t\t\t\"<ol id='qunit-tests'></ol>\";\n\t\t}\n\n\t\ttests = id( \"qunit-tests\" );\n\t\tbanner = id( \"qunit-banner\" );\n\t\tresult = id( \"qunit-testresult\" );\n\n\t\tif ( tests ) {\n\t\t\ttests.innerHTML = \"\";\n\t\t}\n\n\t\tif ( banner ) {\n\t\t\tbanner.className = \"\";\n\t\t}\n\n\t\tif ( result ) {\n\t\t\tresult.parentNode.removeChild( result );\n\t\t}\n\n\t\tif ( tests ) {\n\t\t\tresult = document.createElement( \"p\" );\n\t\t\tresult.id = \"qunit-testresult\";\n\t\t\tresult.className = \"result\";\n\t\t\ttests.parentNode.insertBefore( result, tests );\n\t\t\tresult.innerHTML = \"Running...<br/>&nbsp;\";\n\t\t}\n\t},\n\n\t// Resets the test setup. Useful for tests that modify the DOM.\n\t/*\n\tDEPRECATED: Use multiple tests instead of resetting inside a test.\n\tUse testStart or testDone for custom cleanup.\n\tThis method will throw an error in 2.0, and will be removed in 2.1\n\t*/\n\treset: function() {\n\t\tvar fixture = id( \"qunit-fixture\" );\n\t\tif ( fixture ) {\n\t\t\tfixture.innerHTML = config.fixture;\n\t\t}\n\t},\n\n\t// Trigger an event on an element.\n\t// @example triggerEvent( document.body, \"click\" );\n\ttriggerEvent: function( elem, type, event ) {\n\t\tif ( document.createEvent ) {\n\t\t\tevent = document.createEvent( \"MouseEvents\" );\n\t\t\tevent.initMouseEvent(type, true, true, elem.ownerDocument.defaultView,\n\t\t\t\t0, 0, 0, 0, 0, false, false, false, false, 0, null);\n\n\t\t\telem.dispatchEvent( event );\n\t\t} else if ( elem.fireEvent ) {\n\t\t\telem.fireEvent( \"on\" + type );\n\t\t}\n\t},\n\n\t// Safe object type checking\n\tis: function( type, obj ) {\n\t\treturn QUnit.objectType( obj ) === type;\n\t},\n\n\tobjectType: function( obj ) {\n\t\tif ( typeof obj === \"undefined\" ) {\n\t\t\t\treturn \"undefined\";\n\t\t// consider: typeof null === object\n\t\t}\n\t\tif ( obj === null ) {\n\t\t\t\treturn \"null\";\n\t\t}\n\n\t\tvar match = toString.call( obj ).match(/^\\[object\\s(.*)\\]$/),\n\t\t\ttype = match && match[1] || \"\";\n\n\t\tswitch ( type ) {\n\t\t\tcase \"Number\":\n\t\t\t\tif ( isNaN(obj) ) {\n\t\t\t\t\treturn \"nan\";\n\t\t\t\t}\n\t\t\t\treturn \"number\";\n\t\t\tcase \"String\":\n\t\t\tcase \"Boolean\":\n\t\t\tcase \"Array\":\n\t\t\tcase \"Date\":\n\t\t\tcase \"RegExp\":\n\t\t\tcase \"Function\":\n\t\t\t\treturn type.toLowerCase();\n\t\t}\n\t\tif ( typeof obj === \"object\" ) {\n\t\t\treturn \"object\";\n\t\t}\n\t\treturn undefined;\n\t},\n\n\tpush: function( result, actual, expected, message ) {\n\t\tif ( !config.current ) {\n\t\t\tthrow new Error( \"assertion outside test context, was \" + sourceFromStacktrace() );\n\t\t}\n\n\t\tvar output, source,\n\t\t\tdetails = {\n\t\t\t\tmodule: config.current.module,\n\t\t\t\tname: config.current.testName,\n\t\t\t\tresult: result,\n\t\t\t\tmessage: message,\n\t\t\t\tactual: actual,\n\t\t\t\texpected: expected\n\t\t\t};\n\n\t\tmessage = escapeText( message ) || ( result ? \"okay\" : \"failed\" );\n\t\tmessage = \"<span class='test-message'>\" + message + \"</span>\";\n\t\toutput = message;\n\n\t\tif ( !result ) {\n\t\t\texpected = escapeText( QUnit.jsDump.parse(expected) );\n\t\t\tactual = escapeText( QUnit.jsDump.parse(actual) );\n\t\t\toutput += \"<table><tr class='test-expected'><th>Expected: </th><td><pre>\" + expected + \"</pre></td></tr>\";\n\n\t\t\tif ( actual !== expected ) {\n\t\t\t\toutput += \"<tr class='test-actual'><th>Result: </th><td><pre>\" + actual + \"</pre></td></tr>\";\n\t\t\t\toutput += \"<tr class='test-diff'><th>Diff: </th><td><pre>\" + QUnit.diff( expected, actual ) + \"</pre></td></tr>\";\n\t\t\t}\n\n\t\t\tsource = sourceFromStacktrace();\n\n\t\t\tif ( source ) {\n\t\t\t\tdetails.source = source;\n\t\t\t\toutput += \"<tr class='test-source'><th>Source: </th><td><pre>\" + escapeText( source ) + \"</pre></td></tr>\";\n\t\t\t}\n\n\t\t\toutput += \"</table>\";\n\t\t}\n\n\t\trunLoggingCallbacks( \"log\", QUnit, details );\n\n\t\tconfig.current.assertions.push({\n\t\t\tresult: !!result,\n\t\t\tmessage: output\n\t\t});\n\t},\n\n\tpushFailure: function( message, source, actual ) {\n\t\tif ( !config.current ) {\n\t\t\tthrow new Error( \"pushFailure() assertion outside test context, was \" + sourceFromStacktrace(2) );\n\t\t}\n\n\t\tvar output,\n\t\t\tdetails = {\n\t\t\t\tmodule: config.current.module,\n\t\t\t\tname: config.current.testName,\n\t\t\t\tresult: false,\n\t\t\t\tmessage: message\n\t\t\t};\n\n\t\tmessage = escapeText( message ) || \"error\";\n\t\tmessage = \"<span class='test-message'>\" + message + \"</span>\";\n\t\toutput = message;\n\n\t\toutput += \"<table>\";\n\n\t\tif ( actual ) {\n\t\t\toutput += \"<tr class='test-actual'><th>Result: </th><td><pre>\" + escapeText( actual ) + \"</pre></td></tr>\";\n\t\t}\n\n\t\tif ( source ) {\n\t\t\tdetails.source = source;\n\t\t\toutput += \"<tr class='test-source'><th>Source: </th><td><pre>\" + escapeText( source ) + \"</pre></td></tr>\";\n\t\t}\n\n\t\toutput += \"</table>\";\n\n\t\trunLoggingCallbacks( \"log\", QUnit, details );\n\n\t\tconfig.current.assertions.push({\n\t\t\tresult: false,\n\t\t\tmessage: output\n\t\t});\n\t},\n\n\turl: function( params ) {\n\t\tparams = extend( extend( {}, QUnit.urlParams ), params );\n\t\tvar key,\n\t\t\tquerystring = \"?\";\n\n\t\tfor ( key in params ) {\n\t\t\tif ( hasOwn.call( params, key ) ) {\n\t\t\t\tquerystring += encodeURIComponent( key ) + \"=\" +\n\t\t\t\t\tencodeURIComponent( params[ key ] ) + \"&\";\n\t\t\t}\n\t\t}\n\t\treturn window.location.protocol + \"//\" + window.location.host +\n\t\t\twindow.location.pathname + querystring.slice( 0, -1 );\n\t},\n\n\textend: extend,\n\tid: id,\n\taddEvent: addEvent,\n\taddClass: addClass,\n\thasClass: hasClass,\n\tremoveClass: removeClass\n\t// load, equiv, jsDump, diff: Attached later\n});\n\n/**\n * @deprecated: Created for backwards compatibility with test runner that set the hook function\n * into QUnit.{hook}, instead of invoking it and passing the hook function.\n * QUnit.constructor is set to the empty F() above so that we can add to it's prototype here.\n * Doing this allows us to tell if the following methods have been overwritten on the actual\n * QUnit object.\n */\nextend( QUnit.constructor.prototype, {\n\n\t// Logging callbacks; all receive a single argument with the listed properties\n\t// run test/logs.html for any related changes\n\tbegin: registerLoggingCallback( \"begin\" ),\n\n\t// done: { failed, passed, total, runtime }\n\tdone: registerLoggingCallback( \"done\" ),\n\n\t// log: { result, actual, expected, message }\n\tlog: registerLoggingCallback( \"log\" ),\n\n\t// testStart: { name }\n\ttestStart: registerLoggingCallback( \"testStart\" ),\n\n\t// testDone: { name, failed, passed, total, duration }\n\ttestDone: registerLoggingCallback( \"testDone\" ),\n\n\t// moduleStart: { name }\n\tmoduleStart: registerLoggingCallback( \"moduleStart\" ),\n\n\t// moduleDone: { name, failed, passed, total }\n\tmoduleDone: registerLoggingCallback( \"moduleDone\" )\n});\n\nif ( typeof document === \"undefined\" || document.readyState === \"complete\" ) {\n\tconfig.autorun = true;\n}\n\nQUnit.load = function() {\n\trunLoggingCallbacks( \"begin\", QUnit, {} );\n\n\t// Initialize the config, saving the execution queue\n\tvar banner, filter, i, label, len, main, ol, toolbar, userAgent, val,\n\t\turlConfigCheckboxesContainer, urlConfigCheckboxes, moduleFilter,\n\t\tnumModules = 0,\n\t\tmoduleNames = [],\n\t\tmoduleFilterHtml = \"\",\n\t\turlConfigHtml = \"\",\n\t\toldconfig = extend( {}, config );\n\n\tQUnit.init();\n\textend(config, oldconfig);\n\n\tconfig.blocking = false;\n\n\tlen = config.urlConfig.length;\n\n\tfor ( i = 0; i < len; i++ ) {\n\t\tval = config.urlConfig[i];\n\t\tif ( typeof val === \"string\" ) {\n\t\t\tval = {\n\t\t\t\tid: val,\n\t\t\t\tlabel: val,\n\t\t\t\ttooltip: \"[no tooltip available]\"\n\t\t\t};\n\t\t}\n\t\tconfig[ val.id ] = QUnit.urlParams[ val.id ];\n\t\turlConfigHtml += \"<input id='qunit-urlconfig-\" + escapeText( val.id ) +\n\t\t\t\"' name='\" + escapeText( val.id ) +\n\t\t\t\"' type='checkbox'\" + ( config[ val.id ] ? \" checked='checked'\" : \"\" ) +\n\t\t\t\" title='\" + escapeText( val.tooltip ) +\n\t\t\t\"'><label for='qunit-urlconfig-\" + escapeText( val.id ) +\n\t\t\t\"' title='\" + escapeText( val.tooltip ) + \"'>\" + val.label + \"</label>\";\n\t}\n\tfor ( i in config.modules ) {\n\t\tif ( config.modules.hasOwnProperty( i ) ) {\n\t\t\tmoduleNames.push(i);\n\t\t}\n\t}\n\tnumModules = moduleNames.length;\n\tmoduleNames.sort( function( a, b ) {\n\t\treturn a.localeCompare( b );\n\t});\n\tmoduleFilterHtml += \"<label for='qunit-modulefilter'>Module: </label><select id='qunit-modulefilter' name='modulefilter'><option value='' \" +\n\t\t( config.module === undefined  ? \"selected='selected'\" : \"\" ) +\n\t\t\">< All Modules ></option>\";\n\n\n\tfor ( i = 0; i < numModules; i++) {\n\t\t\tmoduleFilterHtml += \"<option value='\" + escapeText( encodeURIComponent(moduleNames[i]) ) + \"' \" +\n\t\t\t\t( config.module === moduleNames[i] ? \"selected='selected'\" : \"\" ) +\n\t\t\t\t\">\" + escapeText(moduleNames[i]) + \"</option>\";\n\t}\n\tmoduleFilterHtml += \"</select>\";\n\n\t// `userAgent` initialized at top of scope\n\tuserAgent = id( \"qunit-userAgent\" );\n\tif ( userAgent ) {\n\t\tuserAgent.innerHTML = navigator.userAgent;\n\t}\n\n\t// `banner` initialized at top of scope\n\tbanner = id( \"qunit-header\" );\n\tif ( banner ) {\n\t\tbanner.innerHTML = \"<a href='\" + QUnit.url({ filter: undefined, module: undefined, testNumber: undefined }) + \"'>\" + banner.innerHTML + \"</a> \";\n\t}\n\n\t// `toolbar` initialized at top of scope\n\ttoolbar = id( \"qunit-testrunner-toolbar\" );\n\tif ( toolbar ) {\n\t\t// `filter` initialized at top of scope\n\t\tfilter = document.createElement( \"input\" );\n\t\tfilter.type = \"checkbox\";\n\t\tfilter.id = \"qunit-filter-pass\";\n\n\t\taddEvent( filter, \"click\", function() {\n\t\t\tvar tmp,\n\t\t\t\tol = document.getElementById( \"qunit-tests\" );\n\n\t\t\tif ( filter.checked ) {\n\t\t\t\tol.className = ol.className + \" hidepass\";\n\t\t\t} else {\n\t\t\t\ttmp = \" \" + ol.className.replace( /[\\n\\t\\r]/g, \" \" ) + \" \";\n\t\t\t\tol.className = tmp.replace( / hidepass /, \" \" );\n\t\t\t}\n\t\t\tif ( defined.sessionStorage ) {\n\t\t\t\tif (filter.checked) {\n\t\t\t\t\tsessionStorage.setItem( \"qunit-filter-passed-tests\", \"true\" );\n\t\t\t\t} else {\n\t\t\t\t\tsessionStorage.removeItem( \"qunit-filter-passed-tests\" );\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tif ( config.hidepassed || defined.sessionStorage && sessionStorage.getItem( \"qunit-filter-passed-tests\" ) ) {\n\t\t\tfilter.checked = true;\n\t\t\t// `ol` initialized at top of scope\n\t\t\tol = document.getElementById( \"qunit-tests\" );\n\t\t\tol.className = ol.className + \" hidepass\";\n\t\t}\n\t\ttoolbar.appendChild( filter );\n\n\t\t// `label` initialized at top of scope\n\t\tlabel = document.createElement( \"label\" );\n\t\tlabel.setAttribute( \"for\", \"qunit-filter-pass\" );\n\t\tlabel.setAttribute( \"title\", \"Only show tests and assertions that fail. Stored in sessionStorage.\" );\n\t\tlabel.innerHTML = \"Hide passed tests\";\n\t\ttoolbar.appendChild( label );\n\n\t\turlConfigCheckboxesContainer = document.createElement(\"span\");\n\t\turlConfigCheckboxesContainer.innerHTML = urlConfigHtml;\n\t\turlConfigCheckboxes = urlConfigCheckboxesContainer.getElementsByTagName(\"input\");\n\t\t// For oldIE support:\n\t\t// * Add handlers to the individual elements instead of the container\n\t\t// * Use \"click\" instead of \"change\"\n\t\t// * Fallback from event.target to event.srcElement\n\t\taddEvents( urlConfigCheckboxes, \"click\", function( event ) {\n\t\t\tvar params = {},\n\t\t\t\ttarget = event.target || event.srcElement;\n\t\t\tparams[ target.name ] = target.checked ? true : undefined;\n\t\t\twindow.location = QUnit.url( params );\n\t\t});\n\t\ttoolbar.appendChild( urlConfigCheckboxesContainer );\n\n\t\tif (numModules > 1) {\n\t\t\tmoduleFilter = document.createElement( \"span\" );\n\t\t\tmoduleFilter.setAttribute( \"id\", \"qunit-modulefilter-container\" );\n\t\t\tmoduleFilter.innerHTML = moduleFilterHtml;\n\t\t\taddEvent( moduleFilter.lastChild, \"change\", function() {\n\t\t\t\tvar selectBox = moduleFilter.getElementsByTagName(\"select\")[0],\n\t\t\t\t\tselectedModule = decodeURIComponent(selectBox.options[selectBox.selectedIndex].value);\n\n\t\t\t\twindow.location = QUnit.url({\n\t\t\t\t\tmodule: ( selectedModule === \"\" ) ? undefined : selectedModule,\n\t\t\t\t\t// Remove any existing filters\n\t\t\t\t\tfilter: undefined,\n\t\t\t\t\ttestNumber: undefined\n\t\t\t\t});\n\t\t\t});\n\t\t\ttoolbar.appendChild(moduleFilter);\n\t\t}\n\t}\n\n\t// `main` initialized at top of scope\n\tmain = id( \"qunit-fixture\" );\n\tif ( main ) {\n\t\tconfig.fixture = main.innerHTML;\n\t}\n\n\tif ( config.autostart ) {\n\t\tQUnit.start();\n\t}\n};\n\naddEvent( window, \"load\", QUnit.load );\n\n// `onErrorFnPrev` initialized at top of scope\n// Preserve other handlers\nonErrorFnPrev = window.onerror;\n\n// Cover uncaught exceptions\n// Returning true will suppress the default browser handler,\n// returning false will let it run.\nwindow.onerror = function ( error, filePath, linerNr ) {\n\tvar ret = false;\n\tif ( onErrorFnPrev ) {\n\t\tret = onErrorFnPrev( error, filePath, linerNr );\n\t}\n\n\t// Treat return value as window.onerror itself does,\n\t// Only do our handling if not suppressed.\n\tif ( ret !== true ) {\n\t\tif ( QUnit.config.current ) {\n\t\t\tif ( QUnit.config.current.ignoreGlobalErrors ) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tQUnit.pushFailure( error, filePath + \":\" + linerNr );\n\t\t} else {\n\t\t\tQUnit.test( \"global failure\", extend( function() {\n\t\t\t\tQUnit.pushFailure( error, filePath + \":\" + linerNr );\n\t\t\t}, { validTest: validTest } ) );\n\t\t}\n\t\treturn false;\n\t}\n\n\treturn ret;\n};\n\nfunction done() {\n\tconfig.autorun = true;\n\n\t// Log the last module results\n\tif ( config.currentModule ) {\n\t\trunLoggingCallbacks( \"moduleDone\", QUnit, {\n\t\t\tname: config.currentModule,\n\t\t\tfailed: config.moduleStats.bad,\n\t\t\tpassed: config.moduleStats.all - config.moduleStats.bad,\n\t\t\ttotal: config.moduleStats.all\n\t\t});\n\t}\n\tdelete config.previousModule;\n\n\tvar i, key,\n\t\tbanner = id( \"qunit-banner\" ),\n\t\ttests = id( \"qunit-tests\" ),\n\t\truntime = +new Date() - config.started,\n\t\tpassed = config.stats.all - config.stats.bad,\n\t\thtml = [\n\t\t\t\"Tests completed in \",\n\t\t\truntime,\n\t\t\t\" milliseconds.<br/>\",\n\t\t\t\"<span class='passed'>\",\n\t\t\tpassed,\n\t\t\t\"</span> assertions of <span class='total'>\",\n\t\t\tconfig.stats.all,\n\t\t\t\"</span> passed, <span class='failed'>\",\n\t\t\tconfig.stats.bad,\n\t\t\t\"</span> failed.\"\n\t\t].join( \"\" );\n\n\tif ( banner ) {\n\t\tbanner.className = ( config.stats.bad ? \"qunit-fail\" : \"qunit-pass\" );\n\t}\n\n\tif ( tests ) {\n\t\tid( \"qunit-testresult\" ).innerHTML = html;\n\t}\n\n\tif ( config.altertitle && typeof document !== \"undefined\" && document.title ) {\n\t\t// show ✖ for good, ✔ for bad suite result in title\n\t\t// use escape sequences in case file gets loaded with non-utf-8-charset\n\t\tdocument.title = [\n\t\t\t( config.stats.bad ? \"\\u2716\" : \"\\u2714\" ),\n\t\t\tdocument.title.replace( /^[\\u2714\\u2716] /i, \"\" )\n\t\t].join( \" \" );\n\t}\n\n\t// clear own sessionStorage items if all tests passed\n\tif ( config.reorder && defined.sessionStorage && config.stats.bad === 0 ) {\n\t\t// `key` & `i` initialized at top of scope\n\t\tfor ( i = 0; i < sessionStorage.length; i++ ) {\n\t\t\tkey = sessionStorage.key( i++ );\n\t\t\tif ( key.indexOf( \"qunit-test-\" ) === 0 ) {\n\t\t\t\tsessionStorage.removeItem( key );\n\t\t\t}\n\t\t}\n\t}\n\n\t// scroll back to top to show results\n\tif ( window.scrollTo ) {\n\t\twindow.scrollTo(0, 0);\n\t}\n\n\trunLoggingCallbacks( \"done\", QUnit, {\n\t\tfailed: config.stats.bad,\n\t\tpassed: passed,\n\t\ttotal: config.stats.all,\n\t\truntime: runtime\n\t});\n}\n\n/** @return Boolean: true if this test should be ran */\nfunction validTest( test ) {\n\tvar include,\n\t\tfilter = config.filter && config.filter.toLowerCase(),\n\t\tmodule = config.module && config.module.toLowerCase(),\n\t\tfullName = (test.module + \": \" + test.testName).toLowerCase();\n\n\t// Internally-generated tests are always valid\n\tif ( test.callback && test.callback.validTest === validTest ) {\n\t\tdelete test.callback.validTest;\n\t\treturn true;\n\t}\n\n\tif ( config.testNumber ) {\n\t\treturn test.testNumber === config.testNumber;\n\t}\n\n\tif ( module && ( !test.module || test.module.toLowerCase() !== module ) ) {\n\t\treturn false;\n\t}\n\n\tif ( !filter ) {\n\t\treturn true;\n\t}\n\n\tinclude = filter.charAt( 0 ) !== \"!\";\n\tif ( !include ) {\n\t\tfilter = filter.slice( 1 );\n\t}\n\n\t// If the filter matches, we need to honour include\n\tif ( fullName.indexOf( filter ) !== -1 ) {\n\t\treturn include;\n\t}\n\n\t// Otherwise, do the opposite\n\treturn !include;\n}\n\n// so far supports only Firefox, Chrome and Opera (buggy), Safari (for real exceptions)\n// Later Safari and IE10 are supposed to support error.stack as well\n// See also https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error/Stack\nfunction extractStacktrace( e, offset ) {\n\toffset = offset === undefined ? 3 : offset;\n\n\tvar stack, include, i;\n\n\tif ( e.stacktrace ) {\n\t\t// Opera\n\t\treturn e.stacktrace.split( \"\\n\" )[ offset + 3 ];\n\t} else if ( e.stack ) {\n\t\t// Firefox, Chrome\n\t\tstack = e.stack.split( \"\\n\" );\n\t\tif (/^error$/i.test( stack[0] ) ) {\n\t\t\tstack.shift();\n\t\t}\n\t\tif ( fileName ) {\n\t\t\tinclude = [];\n\t\t\tfor ( i = offset; i < stack.length; i++ ) {\n\t\t\t\tif ( stack[ i ].indexOf( fileName ) !== -1 ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tinclude.push( stack[ i ] );\n\t\t\t}\n\t\t\tif ( include.length ) {\n\t\t\t\treturn include.join( \"\\n\" );\n\t\t\t}\n\t\t}\n\t\treturn stack[ offset ];\n\t} else if ( e.sourceURL ) {\n\t\t// Safari, PhantomJS\n\t\t// hopefully one day Safari provides actual stacktraces\n\t\t// exclude useless self-reference for generated Error objects\n\t\tif ( /qunit.js$/.test( e.sourceURL ) ) {\n\t\t\treturn;\n\t\t}\n\t\t// for actual exceptions, this is useful\n\t\treturn e.sourceURL + \":\" + e.line;\n\t}\n}\nfunction sourceFromStacktrace( offset ) {\n\ttry {\n\t\tthrow new Error();\n\t} catch ( e ) {\n\t\treturn extractStacktrace( e, offset );\n\t}\n}\n\n/**\n * Escape text for attribute or text content.\n */\nfunction escapeText( s ) {\n\tif ( !s ) {\n\t\treturn \"\";\n\t}\n\ts = s + \"\";\n\t// Both single quotes and double quotes (for attributes)\n\treturn s.replace( /['\"<>&]/g, function( s ) {\n\t\tswitch( s ) {\n\t\t\tcase \"'\":\n\t\t\t\treturn \"&#039;\";\n\t\t\tcase \"\\\"\":\n\t\t\t\treturn \"&quot;\";\n\t\t\tcase \"<\":\n\t\t\t\treturn \"&lt;\";\n\t\t\tcase \">\":\n\t\t\t\treturn \"&gt;\";\n\t\t\tcase \"&\":\n\t\t\t\treturn \"&amp;\";\n\t\t}\n\t});\n}\n\nfunction synchronize( callback, last ) {\n\tconfig.queue.push( callback );\n\n\tif ( config.autorun && !config.blocking ) {\n\t\tprocess( last );\n\t}\n}\n\nfunction process( last ) {\n\tfunction next() {\n\t\tprocess( last );\n\t}\n\tvar start = new Date().getTime();\n\tconfig.depth = config.depth ? config.depth + 1 : 1;\n\n\twhile ( config.queue.length && !config.blocking ) {\n\t\tif ( !defined.setTimeout || config.updateRate <= 0 || ( ( new Date().getTime() - start ) < config.updateRate ) ) {\n\t\t\tconfig.queue.shift()();\n\t\t} else {\n\t\t\tsetTimeout( next, 13 );\n\t\t\tbreak;\n\t\t}\n\t}\n\tconfig.depth--;\n\tif ( last && !config.blocking && !config.queue.length && config.depth === 0 ) {\n\t\tdone();\n\t}\n}\n\nfunction saveGlobal() {\n\tconfig.pollution = [];\n\n\tif ( config.noglobals ) {\n\t\tfor ( var key in window ) {\n\t\t\tif ( hasOwn.call( window, key ) ) {\n\t\t\t\t// in Opera sometimes DOM element ids show up here, ignore them\n\t\t\t\tif ( /^qunit-test-output/.test( key ) ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconfig.pollution.push( key );\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction checkPollution() {\n\tvar newGlobals,\n\t\tdeletedGlobals,\n\t\told = config.pollution;\n\n\tsaveGlobal();\n\n\tnewGlobals = diff( config.pollution, old );\n\tif ( newGlobals.length > 0 ) {\n\t\tQUnit.pushFailure( \"Introduced global variable(s): \" + newGlobals.join(\", \") );\n\t}\n\n\tdeletedGlobals = diff( old, config.pollution );\n\tif ( deletedGlobals.length > 0 ) {\n\t\tQUnit.pushFailure( \"Deleted global variable(s): \" + deletedGlobals.join(\", \") );\n\t}\n}\n\n// returns a new Array with the elements that are in a but not in b\nfunction diff( a, b ) {\n\tvar i, j,\n\t\tresult = a.slice();\n\n\tfor ( i = 0; i < result.length; i++ ) {\n\t\tfor ( j = 0; j < b.length; j++ ) {\n\t\t\tif ( result[i] === b[j] ) {\n\t\t\t\tresult.splice( i, 1 );\n\t\t\t\ti--;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\treturn result;\n}\n\nfunction extend( a, b ) {\n\tfor ( var prop in b ) {\n\t\tif ( hasOwn.call( b, prop ) ) {\n\t\t\t// Avoid \"Member not found\" error in IE8 caused by messing with window.constructor\n\t\t\tif ( !( prop === \"constructor\" && a === window ) ) {\n\t\t\t\tif ( b[ prop ] === undefined ) {\n\t\t\t\t\tdelete a[ prop ];\n\t\t\t\t} else {\n\t\t\t\t\ta[ prop ] = b[ prop ];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn a;\n}\n\n/**\n * @param {HTMLElement} elem\n * @param {string} type\n * @param {Function} fn\n */\nfunction addEvent( elem, type, fn ) {\n\t// Standards-based browsers\n\tif ( elem.addEventListener ) {\n\t\telem.addEventListener( type, fn, false );\n\t// IE\n\t} else {\n\t\telem.attachEvent( \"on\" + type, fn );\n\t}\n}\n\n/**\n * @param {Array|NodeList} elems\n * @param {string} type\n * @param {Function} fn\n */\nfunction addEvents( elems, type, fn ) {\n\tvar i = elems.length;\n\twhile ( i-- ) {\n\t\taddEvent( elems[i], type, fn );\n\t}\n}\n\nfunction hasClass( elem, name ) {\n\treturn (\" \" + elem.className + \" \").indexOf(\" \" + name + \" \") > -1;\n}\n\nfunction addClass( elem, name ) {\n\tif ( !hasClass( elem, name ) ) {\n\t\telem.className += (elem.className ? \" \" : \"\") + name;\n\t}\n}\n\nfunction removeClass( elem, name ) {\n\tvar set = \" \" + elem.className + \" \";\n\t// Class name may appear multiple times\n\twhile ( set.indexOf(\" \" + name + \" \") > -1 ) {\n\t\tset = set.replace(\" \" + name + \" \" , \" \");\n\t}\n\t// If possible, trim it for prettiness, but not necessarily\n\telem.className = typeof set.trim === \"function\" ? set.trim() : set.replace(/^\\s+|\\s+$/g, \"\");\n}\n\nfunction id( name ) {\n\treturn !!( typeof document !== \"undefined\" && document && document.getElementById ) &&\n\t\tdocument.getElementById( name );\n}\n\nfunction registerLoggingCallback( key ) {\n\treturn function( callback ) {\n\t\tconfig[key].push( callback );\n\t};\n}\n\n// Supports deprecated method of completely overwriting logging callbacks\nfunction runLoggingCallbacks( key, scope, args ) {\n\tvar i, callbacks;\n\tif ( QUnit.hasOwnProperty( key ) ) {\n\t\tQUnit[ key ].call(scope, args );\n\t} else {\n\t\tcallbacks = config[ key ];\n\t\tfor ( i = 0; i < callbacks.length; i++ ) {\n\t\t\tcallbacks[ i ].call( scope, args );\n\t\t}\n\t}\n}\n\n// Test for equality any JavaScript type.\n// Author: Philippe Rathé <prathe@gmail.com>\nQUnit.equiv = (function() {\n\n\t// Call the o related callback with the given arguments.\n\tfunction bindCallbacks( o, callbacks, args ) {\n\t\tvar prop = QUnit.objectType( o );\n\t\tif ( prop ) {\n\t\t\tif ( QUnit.objectType( callbacks[ prop ] ) === \"function\" ) {\n\t\t\t\treturn callbacks[ prop ].apply( callbacks, args );\n\t\t\t} else {\n\t\t\t\treturn callbacks[ prop ]; // or undefined\n\t\t\t}\n\t\t}\n\t}\n\n\t// the real equiv function\n\tvar innerEquiv,\n\t\t// stack to decide between skip/abort functions\n\t\tcallers = [],\n\t\t// stack to avoiding loops from circular referencing\n\t\tparents = [],\n\t\tparentsB = [],\n\n\t\tgetProto = Object.getPrototypeOf || function ( obj ) {\n\t\t\t/*jshint camelcase:false */\n\t\t\treturn obj.__proto__;\n\t\t},\n\t\tcallbacks = (function () {\n\n\t\t\t// for string, boolean, number and null\n\t\t\tfunction useStrictEquality( b, a ) {\n\t\t\t\t/*jshint eqeqeq:false */\n\t\t\t\tif ( b instanceof a.constructor || a instanceof b.constructor ) {\n\t\t\t\t\t// to catch short annotation VS 'new' annotation of a\n\t\t\t\t\t// declaration\n\t\t\t\t\t// e.g. var i = 1;\n\t\t\t\t\t// var j = new Number(1);\n\t\t\t\t\treturn a == b;\n\t\t\t\t} else {\n\t\t\t\t\treturn a === b;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\t\"string\": useStrictEquality,\n\t\t\t\t\"boolean\": useStrictEquality,\n\t\t\t\t\"number\": useStrictEquality,\n\t\t\t\t\"null\": useStrictEquality,\n\t\t\t\t\"undefined\": useStrictEquality,\n\n\t\t\t\t\"nan\": function( b ) {\n\t\t\t\t\treturn isNaN( b );\n\t\t\t\t},\n\n\t\t\t\t\"date\": function( b, a ) {\n\t\t\t\t\treturn QUnit.objectType( b ) === \"date\" && a.valueOf() === b.valueOf();\n\t\t\t\t},\n\n\t\t\t\t\"regexp\": function( b, a ) {\n\t\t\t\t\treturn QUnit.objectType( b ) === \"regexp\" &&\n\t\t\t\t\t\t// the regex itself\n\t\t\t\t\t\ta.source === b.source &&\n\t\t\t\t\t\t// and its modifiers\n\t\t\t\t\t\ta.global === b.global &&\n\t\t\t\t\t\t// (gmi) ...\n\t\t\t\t\t\ta.ignoreCase === b.ignoreCase &&\n\t\t\t\t\t\ta.multiline === b.multiline &&\n\t\t\t\t\t\ta.sticky === b.sticky;\n\t\t\t\t},\n\n\t\t\t\t// - skip when the property is a method of an instance (OOP)\n\t\t\t\t// - abort otherwise,\n\t\t\t\t// initial === would have catch identical references anyway\n\t\t\t\t\"function\": function() {\n\t\t\t\t\tvar caller = callers[callers.length - 1];\n\t\t\t\t\treturn caller !== Object && typeof caller !== \"undefined\";\n\t\t\t\t},\n\n\t\t\t\t\"array\": function( b, a ) {\n\t\t\t\t\tvar i, j, len, loop, aCircular, bCircular;\n\n\t\t\t\t\t// b could be an object literal here\n\t\t\t\t\tif ( QUnit.objectType( b ) !== \"array\" ) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\n\t\t\t\t\tlen = a.length;\n\t\t\t\t\tif ( len !== b.length ) {\n\t\t\t\t\t\t// safe and faster\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\n\t\t\t\t\t// track reference to avoid circular references\n\t\t\t\t\tparents.push( a );\n\t\t\t\t\tparentsB.push( b );\n\t\t\t\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\t\t\t\tloop = false;\n\t\t\t\t\t\tfor ( j = 0; j < parents.length; j++ ) {\n\t\t\t\t\t\t\taCircular = parents[j] === a[i];\n\t\t\t\t\t\t\tbCircular = parentsB[j] === b[i];\n\t\t\t\t\t\t\tif ( aCircular || bCircular ) {\n\t\t\t\t\t\t\t\tif ( a[i] === b[i] || aCircular && bCircular ) {\n\t\t\t\t\t\t\t\t\tloop = true;\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tparents.pop();\n\t\t\t\t\t\t\t\t\tparentsB.pop();\n\t\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( !loop && !innerEquiv(a[i], b[i]) ) {\n\t\t\t\t\t\t\tparents.pop();\n\t\t\t\t\t\t\tparentsB.pop();\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tparents.pop();\n\t\t\t\t\tparentsB.pop();\n\t\t\t\t\treturn true;\n\t\t\t\t},\n\n\t\t\t\t\"object\": function( b, a ) {\n\t\t\t\t\t/*jshint forin:false */\n\t\t\t\t\tvar i, j, loop, aCircular, bCircular,\n\t\t\t\t\t\t// Default to true\n\t\t\t\t\t\teq = true,\n\t\t\t\t\t\taProperties = [],\n\t\t\t\t\t\tbProperties = [];\n\n\t\t\t\t\t// comparing constructors is more strict than using\n\t\t\t\t\t// instanceof\n\t\t\t\t\tif ( a.constructor !== b.constructor ) {\n\t\t\t\t\t\t// Allow objects with no prototype to be equivalent to\n\t\t\t\t\t\t// objects with Object as their constructor.\n\t\t\t\t\t\tif ( !(( getProto(a) === null && getProto(b) === Object.prototype ) ||\n\t\t\t\t\t\t\t( getProto(b) === null && getProto(a) === Object.prototype ) ) ) {\n\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// stack constructor before traversing properties\n\t\t\t\t\tcallers.push( a.constructor );\n\n\t\t\t\t\t// track reference to avoid circular references\n\t\t\t\t\tparents.push( a );\n\t\t\t\t\tparentsB.push( b );\n\n\t\t\t\t\t// be strict: don't ensure hasOwnProperty and go deep\n\t\t\t\t\tfor ( i in a ) {\n\t\t\t\t\t\tloop = false;\n\t\t\t\t\t\tfor ( j = 0; j < parents.length; j++ ) {\n\t\t\t\t\t\t\taCircular = parents[j] === a[i];\n\t\t\t\t\t\t\tbCircular = parentsB[j] === b[i];\n\t\t\t\t\t\t\tif ( aCircular || bCircular ) {\n\t\t\t\t\t\t\t\tif ( a[i] === b[i] || aCircular && bCircular ) {\n\t\t\t\t\t\t\t\t\tloop = true;\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\teq = false;\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\taProperties.push(i);\n\t\t\t\t\t\tif ( !loop && !innerEquiv(a[i], b[i]) ) {\n\t\t\t\t\t\t\teq = false;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tparents.pop();\n\t\t\t\t\tparentsB.pop();\n\t\t\t\t\tcallers.pop(); // unstack, we are done\n\n\t\t\t\t\tfor ( i in b ) {\n\t\t\t\t\t\tbProperties.push( i ); // collect b's properties\n\t\t\t\t\t}\n\n\t\t\t\t\t// Ensures identical properties name\n\t\t\t\t\treturn eq && innerEquiv( aProperties.sort(), bProperties.sort() );\n\t\t\t\t}\n\t\t\t};\n\t\t}());\n\n\tinnerEquiv = function() { // can take multiple arguments\n\t\tvar args = [].slice.apply( arguments );\n\t\tif ( args.length < 2 ) {\n\t\t\treturn true; // end transition\n\t\t}\n\n\t\treturn (function( a, b ) {\n\t\t\tif ( a === b ) {\n\t\t\t\treturn true; // catch the most you can\n\t\t\t} else if ( a === null || b === null || typeof a === \"undefined\" ||\n\t\t\t\t\ttypeof b === \"undefined\" ||\n\t\t\t\t\tQUnit.objectType(a) !== QUnit.objectType(b) ) {\n\t\t\t\treturn false; // don't lose time with error prone cases\n\t\t\t} else {\n\t\t\t\treturn bindCallbacks(a, callbacks, [ b, a ]);\n\t\t\t}\n\n\t\t\t// apply transition with (1..n) arguments\n\t\t}( args[0], args[1] ) && innerEquiv.apply( this, args.splice(1, args.length - 1 )) );\n\t};\n\n\treturn innerEquiv;\n}());\n\n/**\n * jsDump Copyright (c) 2008 Ariel Flesler - aflesler(at)gmail(dot)com |\n * http://flesler.blogspot.com Licensed under BSD\n * (http://www.opensource.org/licenses/bsd-license.php) Date: 5/15/2008\n *\n * @projectDescription Advanced and extensible data dumping for Javascript.\n * @version 1.0.0\n * @author Ariel Flesler\n * @link {http://flesler.blogspot.com/2008/05/jsdump-pretty-dump-of-any-javascript.html}\n */\nQUnit.jsDump = (function() {\n\tfunction quote( str ) {\n\t\treturn \"\\\"\" + str.toString().replace( /\"/g, \"\\\\\\\"\" ) + \"\\\"\";\n\t}\n\tfunction literal( o ) {\n\t\treturn o + \"\";\n\t}\n\tfunction join( pre, arr, post ) {\n\t\tvar s = jsDump.separator(),\n\t\t\tbase = jsDump.indent(),\n\t\t\tinner = jsDump.indent(1);\n\t\tif ( arr.join ) {\n\t\t\tarr = arr.join( \",\" + s + inner );\n\t\t}\n\t\tif ( !arr ) {\n\t\t\treturn pre + post;\n\t\t}\n\t\treturn [ pre, inner + arr, base + post ].join(s);\n\t}\n\tfunction array( arr, stack ) {\n\t\tvar i = arr.length, ret = new Array(i);\n\t\tthis.up();\n\t\twhile ( i-- ) {\n\t\t\tret[i] = this.parse( arr[i] , undefined , stack);\n\t\t}\n\t\tthis.down();\n\t\treturn join( \"[\", ret, \"]\" );\n\t}\n\n\tvar reName = /^function (\\w+)/,\n\t\tjsDump = {\n\t\t\t// type is used mostly internally, you can fix a (custom)type in advance\n\t\t\tparse: function( obj, type, stack ) {\n\t\t\t\tstack = stack || [ ];\n\t\t\t\tvar inStack, res,\n\t\t\t\t\tparser = this.parsers[ type || this.typeOf(obj) ];\n\n\t\t\t\ttype = typeof parser;\n\t\t\t\tinStack = inArray( obj, stack );\n\n\t\t\t\tif ( inStack !== -1 ) {\n\t\t\t\t\treturn \"recursion(\" + (inStack - stack.length) + \")\";\n\t\t\t\t}\n\t\t\t\tif ( type === \"function\" )  {\n\t\t\t\t\tstack.push( obj );\n\t\t\t\t\tres = parser.call( this, obj, stack );\n\t\t\t\t\tstack.pop();\n\t\t\t\t\treturn res;\n\t\t\t\t}\n\t\t\t\treturn ( type === \"string\" ) ? parser : this.parsers.error;\n\t\t\t},\n\t\t\ttypeOf: function( obj ) {\n\t\t\t\tvar type;\n\t\t\t\tif ( obj === null ) {\n\t\t\t\t\ttype = \"null\";\n\t\t\t\t} else if ( typeof obj === \"undefined\" ) {\n\t\t\t\t\ttype = \"undefined\";\n\t\t\t\t} else if ( QUnit.is( \"regexp\", obj) ) {\n\t\t\t\t\ttype = \"regexp\";\n\t\t\t\t} else if ( QUnit.is( \"date\", obj) ) {\n\t\t\t\t\ttype = \"date\";\n\t\t\t\t} else if ( QUnit.is( \"function\", obj) ) {\n\t\t\t\t\ttype = \"function\";\n\t\t\t\t} else if ( typeof obj.setInterval !== undefined && typeof obj.document !== \"undefined\" && typeof obj.nodeType === \"undefined\" ) {\n\t\t\t\t\ttype = \"window\";\n\t\t\t\t} else if ( obj.nodeType === 9 ) {\n\t\t\t\t\ttype = \"document\";\n\t\t\t\t} else if ( obj.nodeType ) {\n\t\t\t\t\ttype = \"node\";\n\t\t\t\t} else if (\n\t\t\t\t\t// native arrays\n\t\t\t\t\ttoString.call( obj ) === \"[object Array]\" ||\n\t\t\t\t\t// NodeList objects\n\t\t\t\t\t( typeof obj.length === \"number\" && typeof obj.item !== \"undefined\" && ( obj.length ? obj.item(0) === obj[0] : ( obj.item( 0 ) === null && typeof obj[0] === \"undefined\" ) ) )\n\t\t\t\t) {\n\t\t\t\t\ttype = \"array\";\n\t\t\t\t} else if ( obj.constructor === Error.prototype.constructor ) {\n\t\t\t\t\ttype = \"error\";\n\t\t\t\t} else {\n\t\t\t\t\ttype = typeof obj;\n\t\t\t\t}\n\t\t\t\treturn type;\n\t\t\t},\n\t\t\tseparator: function() {\n\t\t\t\treturn this.multiline ?\tthis.HTML ? \"<br />\" : \"\\n\" : this.HTML ? \"&nbsp;\" : \" \";\n\t\t\t},\n\t\t\t// extra can be a number, shortcut for increasing-calling-decreasing\n\t\t\tindent: function( extra ) {\n\t\t\t\tif ( !this.multiline ) {\n\t\t\t\t\treturn \"\";\n\t\t\t\t}\n\t\t\t\tvar chr = this.indentChar;\n\t\t\t\tif ( this.HTML ) {\n\t\t\t\t\tchr = chr.replace( /\\t/g, \"   \" ).replace( / /g, \"&nbsp;\" );\n\t\t\t\t}\n\t\t\t\treturn new Array( this.depth + ( extra || 0 ) ).join(chr);\n\t\t\t},\n\t\t\tup: function( a ) {\n\t\t\t\tthis.depth += a || 1;\n\t\t\t},\n\t\t\tdown: function( a ) {\n\t\t\t\tthis.depth -= a || 1;\n\t\t\t},\n\t\t\tsetParser: function( name, parser ) {\n\t\t\t\tthis.parsers[name] = parser;\n\t\t\t},\n\t\t\t// The next 3 are exposed so you can use them\n\t\t\tquote: quote,\n\t\t\tliteral: literal,\n\t\t\tjoin: join,\n\t\t\t//\n\t\t\tdepth: 1,\n\t\t\t// This is the list of parsers, to modify them, use jsDump.setParser\n\t\t\tparsers: {\n\t\t\t\twindow: \"[Window]\",\n\t\t\t\tdocument: \"[Document]\",\n\t\t\t\terror: function(error) {\n\t\t\t\t\treturn \"Error(\\\"\" + error.message + \"\\\")\";\n\t\t\t\t},\n\t\t\t\tunknown: \"[Unknown]\",\n\t\t\t\t\"null\": \"null\",\n\t\t\t\t\"undefined\": \"undefined\",\n\t\t\t\t\"function\": function( fn ) {\n\t\t\t\t\tvar ret = \"function\",\n\t\t\t\t\t\t// functions never have name in IE\n\t\t\t\t\t\tname = \"name\" in fn ? fn.name : (reName.exec(fn) || [])[1];\n\n\t\t\t\t\tif ( name ) {\n\t\t\t\t\t\tret += \" \" + name;\n\t\t\t\t\t}\n\t\t\t\t\tret += \"( \";\n\n\t\t\t\t\tret = [ ret, QUnit.jsDump.parse( fn, \"functionArgs\" ), \"){\" ].join( \"\" );\n\t\t\t\t\treturn join( ret, QUnit.jsDump.parse(fn,\"functionCode\" ), \"}\" );\n\t\t\t\t},\n\t\t\t\tarray: array,\n\t\t\t\tnodelist: array,\n\t\t\t\t\"arguments\": array,\n\t\t\t\tobject: function( map, stack ) {\n\t\t\t\t\t/*jshint forin:false */\n\t\t\t\t\tvar ret = [ ], keys, key, val, i;\n\t\t\t\t\tQUnit.jsDump.up();\n\t\t\t\t\tkeys = [];\n\t\t\t\t\tfor ( key in map ) {\n\t\t\t\t\t\tkeys.push( key );\n\t\t\t\t\t}\n\t\t\t\t\tkeys.sort();\n\t\t\t\t\tfor ( i = 0; i < keys.length; i++ ) {\n\t\t\t\t\t\tkey = keys[ i ];\n\t\t\t\t\t\tval = map[ key ];\n\t\t\t\t\t\tret.push( QUnit.jsDump.parse( key, \"key\" ) + \": \" + QUnit.jsDump.parse( val, undefined, stack ) );\n\t\t\t\t\t}\n\t\t\t\t\tQUnit.jsDump.down();\n\t\t\t\t\treturn join( \"{\", ret, \"}\" );\n\t\t\t\t},\n\t\t\t\tnode: function( node ) {\n\t\t\t\t\tvar len, i, val,\n\t\t\t\t\t\topen = QUnit.jsDump.HTML ? \"&lt;\" : \"<\",\n\t\t\t\t\t\tclose = QUnit.jsDump.HTML ? \"&gt;\" : \">\",\n\t\t\t\t\t\ttag = node.nodeName.toLowerCase(),\n\t\t\t\t\t\tret = open + tag,\n\t\t\t\t\t\tattrs = node.attributes;\n\n\t\t\t\t\tif ( attrs ) {\n\t\t\t\t\t\tfor ( i = 0, len = attrs.length; i < len; i++ ) {\n\t\t\t\t\t\t\tval = attrs[i].nodeValue;\n\t\t\t\t\t\t\t// IE6 includes all attributes in .attributes, even ones not explicitly set.\n\t\t\t\t\t\t\t// Those have values like undefined, null, 0, false, \"\" or \"inherit\".\n\t\t\t\t\t\t\tif ( val && val !== \"inherit\" ) {\n\t\t\t\t\t\t\t\tret += \" \" + attrs[i].nodeName + \"=\" + QUnit.jsDump.parse( val, \"attribute\" );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tret += close;\n\n\t\t\t\t\t// Show content of TextNode or CDATASection\n\t\t\t\t\tif ( node.nodeType === 3 || node.nodeType === 4 ) {\n\t\t\t\t\t\tret += node.nodeValue;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn ret + open + \"/\" + tag + close;\n\t\t\t\t},\n\t\t\t\t// function calls it internally, it's the arguments part of the function\n\t\t\t\tfunctionArgs: function( fn ) {\n\t\t\t\t\tvar args,\n\t\t\t\t\t\tl = fn.length;\n\n\t\t\t\t\tif ( !l ) {\n\t\t\t\t\t\treturn \"\";\n\t\t\t\t\t}\n\n\t\t\t\t\targs = new Array(l);\n\t\t\t\t\twhile ( l-- ) {\n\t\t\t\t\t\t// 97 is 'a'\n\t\t\t\t\t\targs[l] = String.fromCharCode(97+l);\n\t\t\t\t\t}\n\t\t\t\t\treturn \" \" + args.join( \", \" ) + \" \";\n\t\t\t\t},\n\t\t\t\t// object calls it internally, the key part of an item in a map\n\t\t\t\tkey: quote,\n\t\t\t\t// function calls it internally, it's the content of the function\n\t\t\t\tfunctionCode: \"[code]\",\n\t\t\t\t// node calls it internally, it's an html attribute value\n\t\t\t\tattribute: quote,\n\t\t\t\tstring: quote,\n\t\t\t\tdate: quote,\n\t\t\t\tregexp: literal,\n\t\t\t\tnumber: literal,\n\t\t\t\t\"boolean\": literal\n\t\t\t},\n\t\t\t// if true, entities are escaped ( <, >, \\t, space and \\n )\n\t\t\tHTML: false,\n\t\t\t// indentation unit\n\t\t\tindentChar: \"  \",\n\t\t\t// if true, items in a collection, are separated by a \\n, else just a space.\n\t\t\tmultiline: true\n\t\t};\n\n\treturn jsDump;\n}());\n\n// from jquery.js\nfunction inArray( elem, array ) {\n\tif ( array.indexOf ) {\n\t\treturn array.indexOf( elem );\n\t}\n\n\tfor ( var i = 0, length = array.length; i < length; i++ ) {\n\t\tif ( array[ i ] === elem ) {\n\t\t\treturn i;\n\t\t}\n\t}\n\n\treturn -1;\n}\n\n/*\n * Javascript Diff Algorithm\n *  By John Resig (http://ejohn.org/)\n *  Modified by Chu Alan \"sprite\"\n *\n * Released under the MIT license.\n *\n * More Info:\n *  http://ejohn.org/projects/javascript-diff-algorithm/\n *\n * Usage: QUnit.diff(expected, actual)\n *\n * QUnit.diff( \"the quick brown fox jumped over\", \"the quick fox jumps over\" ) == \"the  quick <del>brown </del> fox <del>jumped </del><ins>jumps </ins> over\"\n */\nQUnit.diff = (function() {\n\t/*jshint eqeqeq:false, eqnull:true */\n\tfunction diff( o, n ) {\n\t\tvar i,\n\t\t\tns = {},\n\t\t\tos = {};\n\n\t\tfor ( i = 0; i < n.length; i++ ) {\n\t\t\tif ( !hasOwn.call( ns, n[i] ) ) {\n\t\t\t\tns[ n[i] ] = {\n\t\t\t\t\trows: [],\n\t\t\t\t\to: null\n\t\t\t\t};\n\t\t\t}\n\t\t\tns[ n[i] ].rows.push( i );\n\t\t}\n\n\t\tfor ( i = 0; i < o.length; i++ ) {\n\t\t\tif ( !hasOwn.call( os, o[i] ) ) {\n\t\t\t\tos[ o[i] ] = {\n\t\t\t\t\trows: [],\n\t\t\t\t\tn: null\n\t\t\t\t};\n\t\t\t}\n\t\t\tos[ o[i] ].rows.push( i );\n\t\t}\n\n\t\tfor ( i in ns ) {\n\t\t\tif ( hasOwn.call( ns, i ) ) {\n\t\t\t\tif ( ns[i].rows.length === 1 && hasOwn.call( os, i ) && os[i].rows.length === 1 ) {\n\t\t\t\t\tn[ ns[i].rows[0] ] = {\n\t\t\t\t\t\ttext: n[ ns[i].rows[0] ],\n\t\t\t\t\t\trow: os[i].rows[0]\n\t\t\t\t\t};\n\t\t\t\t\to[ os[i].rows[0] ] = {\n\t\t\t\t\t\ttext: o[ os[i].rows[0] ],\n\t\t\t\t\t\trow: ns[i].rows[0]\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor ( i = 0; i < n.length - 1; i++ ) {\n\t\t\tif ( n[i].text != null && n[ i + 1 ].text == null && n[i].row + 1 < o.length && o[ n[i].row + 1 ].text == null &&\n\t\t\t\t\t\tn[ i + 1 ] == o[ n[i].row + 1 ] ) {\n\n\t\t\t\tn[ i + 1 ] = {\n\t\t\t\t\ttext: n[ i + 1 ],\n\t\t\t\t\trow: n[i].row + 1\n\t\t\t\t};\n\t\t\t\to[ n[i].row + 1 ] = {\n\t\t\t\t\ttext: o[ n[i].row + 1 ],\n\t\t\t\t\trow: i + 1\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tfor ( i = n.length - 1; i > 0; i-- ) {\n\t\t\tif ( n[i].text != null && n[ i - 1 ].text == null && n[i].row > 0 && o[ n[i].row - 1 ].text == null &&\n\t\t\t\t\t\tn[ i - 1 ] == o[ n[i].row - 1 ]) {\n\n\t\t\t\tn[ i - 1 ] = {\n\t\t\t\t\ttext: n[ i - 1 ],\n\t\t\t\t\trow: n[i].row - 1\n\t\t\t\t};\n\t\t\t\to[ n[i].row - 1 ] = {\n\t\t\t\t\ttext: o[ n[i].row - 1 ],\n\t\t\t\t\trow: i - 1\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\to: o,\n\t\t\tn: n\n\t\t};\n\t}\n\n\treturn function( o, n ) {\n\t\to = o.replace( /\\s+$/, \"\" );\n\t\tn = n.replace( /\\s+$/, \"\" );\n\n\t\tvar i, pre,\n\t\t\tstr = \"\",\n\t\t\tout = diff( o === \"\" ? [] : o.split(/\\s+/), n === \"\" ? [] : n.split(/\\s+/) ),\n\t\t\toSpace = o.match(/\\s+/g),\n\t\t\tnSpace = n.match(/\\s+/g);\n\n\t\tif ( oSpace == null ) {\n\t\t\toSpace = [ \" \" ];\n\t\t}\n\t\telse {\n\t\t\toSpace.push( \" \" );\n\t\t}\n\n\t\tif ( nSpace == null ) {\n\t\t\tnSpace = [ \" \" ];\n\t\t}\n\t\telse {\n\t\t\tnSpace.push( \" \" );\n\t\t}\n\n\t\tif ( out.n.length === 0 ) {\n\t\t\tfor ( i = 0; i < out.o.length; i++ ) {\n\t\t\t\tstr += \"<del>\" + out.o[i] + oSpace[i] + \"</del>\";\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tif ( out.n[0].text == null ) {\n\t\t\t\tfor ( n = 0; n < out.o.length && out.o[n].text == null; n++ ) {\n\t\t\t\t\tstr += \"<del>\" + out.o[n] + oSpace[n] + \"</del>\";\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor ( i = 0; i < out.n.length; i++ ) {\n\t\t\t\tif (out.n[i].text == null) {\n\t\t\t\t\tstr += \"<ins>\" + out.n[i] + nSpace[i] + \"</ins>\";\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\t// `pre` initialized at top of scope\n\t\t\t\t\tpre = \"\";\n\n\t\t\t\t\tfor ( n = out.n[i].row + 1; n < out.o.length && out.o[n].text == null; n++ ) {\n\t\t\t\t\t\tpre += \"<del>\" + out.o[n] + oSpace[n] + \"</del>\";\n\t\t\t\t\t}\n\t\t\t\t\tstr += \" \" + out.n[i].text + nSpace[i] + pre;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn str;\n\t};\n}());\n\n// for CommonJS environments, export everything\nif ( typeof exports !== \"undefined\" ) {\n\textend( exports, QUnit.constructor.prototype );\n}\n\n// get at whatever the global object is, like window in browsers\n}( (function() {return this;}.call()) ));\n"
  },
  {
    "path": "tests/toastr-tests.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n    <title>toastr QUnit Tests</title>\n\t<link href=\"../toastr.css\" rel=\"stylesheet\" type=\"text/css\" />\n\t<link href=\"qunit/qunit.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"result\"></div>\n\t<h1 id=\"qunit-header\">toastr QUnit Tests</h1>\n\t<h2 id=\"qunit-banner\"></h2>\n\t<div id=\"qunit-testrunner-toolbar\"></div>\n\t<h2 id=\"qunit-userAgent\"></h2>\n\t<ol id=\"qunit-tests\"></ol>\n\t<div id=\"qunit-fixture\">test markup, will be hidden</div>\n\t<script src=\"http://code.jquery.com/jquery.js\" type=\"text/javascript\"></script>\n\t<script src=\"../toastr.js\" type=\"text/javascript\"></script>\n\t<script src=\"qunit/qunit.js\" type=\"text/javascript\"></script>\n\t<script src=\"unit/toastr-tests.js\" type=\"text/javascript\"></script>\n</body>\n</html>\n"
  },
  {
    "path": "tests/unit/qunit-helper.js",
    "content": "/**\n * Hack to expose spec count from QUnit to Karma\n */\n\nvar testCount = 0;\nvar qunitTest = QUnit.test;\nQUnit.test = window.test = function () {\n    testCount += 1;\n    qunitTest.apply(this, arguments);\n};\nQUnit.begin(function (args) {\n    args.totalTests = testCount;\n});\n"
  },
  {
    "path": "tests/unit/toastr-tests.js",
    "content": "/// <reference path=\"../../../toastr.js\" />\n/// <reference path=\"../qunit/qunit.js\" />\n(function () {\n    var iconClasses = {\n        error: 'toast-error',\n        info: 'toast-info',\n        success: 'toast-success',\n        warning: 'toast-warning'\n    };\n    var positionClasses = {\n        topRight: 'toast-top-right',\n        bottomRight: 'toast-bottom-right',\n        bottomLeft: 'toast-bottom-left',\n        topLeft: 'toast-top-left',\n        topCenter: 'toast-top-center',\n        bottomCenter: 'toast-bottom-center'\n    };\n    var sampleMsg = 'I don\\'t think they really exist';\n    var sampleTitle = 'TEST';\n    var selectors = {\n        container: 'div#toast-container',\n        toastInfo: 'div#toast-container > div.toast-info',\n        toastWarning: 'div#toast-container > div.toast-success',\n        toastError: 'div#toast-container > div.toast-error',\n        toastSuccess: 'div#toast-container > div.toast-success'\n    };\n\n    toastr.options = {\n        timeOut: 2000,\n        extendedTimeOut: 0,\n        fadeOut: 0,\n        fadeIn: 0,\n        showDuration: 0,\n        hideDuration: 0,\n        debug: false\n    };\n\n    var delay = toastr.options.timeOut + 500;\n\n    // 'Clears' must go first\n    module('clear');\n    asyncTest('clear - show 3 toasts, clear the 2nd', 1, function () {\n        //Arrange\n        var $toast = [];\n        $toast[0] = toastr.info(sampleMsg, sampleTitle + '-1');\n        $toast[1] = toastr.info(sampleMsg, sampleTitle + '-2');\n        $toast[2] = toastr.info(sampleMsg, sampleTitle + '-3');\n        var $container = toastr.getContainer();\n        //Act\n        toastr.clear($toast[1]);\n        //Assert\n        setTimeout(function () {\n            ok($container && $container.children().length === 2);\n            //Teardown\n            resetContainer();\n            start();\n        }, 1000);\n    });\n    asyncTest('clear - show 3 toasts, clear all 3, 0 left', 1, function () {\n        //Arrange\n        var $toast = [];\n        $toast[0] = toastr.info(sampleMsg, sampleTitle + '-1');\n        $toast[1] = toastr.info(sampleMsg, sampleTitle + '-2');\n        $toast[2] = toastr.info(sampleMsg, sampleTitle + '-3');\n        var $container = toastr.getContainer();\n        //Act\n        toastr.clear();\n        //Assert\n        setTimeout(function () {\n            ok($container && $container.children().length === 0);\n            //Teardown\n            resetContainer();\n            start();\n        }, delay);\n    });\n    test('clear - after clear with force option toast with focus disappears', 1, function () {\n        //Arrange\n        var $toast;\n        var msg = sampleMsg + '<br/><br/><button type=\"button\">Clear</button>';\n        //Act\n        $toast = toastr.info(msg, sampleTitle + '-1');\n        $toast.find('button').focus();\n        toastr.clear($toast, { force: true });\n        var $container = toastr.getContainer();\n        //Assert\n        ok($container && $container.children().length === 0, 'Focused toast after a clear with force is not visible');\n        //Teardown\n        resetContainer();\n    });\n    asyncTest('clear and show - show 2 toasts, clear both, then show 1 more', 2, function () {\n        //Arrange\n        var $toast = [];\n        $toast[0] = toastr.info(sampleMsg, sampleTitle + '-1');\n        $toast[1] = toastr.info(sampleMsg, sampleTitle + '-2');\n        var $container = toastr.getContainer();\n        toastr.clear();\n        //Act\n        setTimeout(function () {\n            $toast[2] = toastr.info(sampleMsg, sampleTitle + '-3-Visible');\n            //Assert\n            equal($toast[2].find('div.toast-title').html(), sampleTitle + '-3-Visible', 'Finds toast after a clear');\n            ok($toast[2].is(':visible'), 'Toast after a clear is visible');\n            //Teardown\n            resetContainer();\n            start();\n        }, delay);\n    });\n    asyncTest('clear and show - clear removes toast container', 2, function () {\n        //Arrange\n        var $toast = [];\n        $toast[0] = toastr.info(sampleMsg, sampleTitle + '-1');\n        $toast[1] = toastr.info(sampleMsg, sampleTitle + '-2');\n        var $container = toastr.getContainer();\n        toastr.clear();\n        //Act\n        setTimeout(function () {\n            //Assert\n            equal($(selectors.container).length, 0, 'Toast container does not exist');\n            ok(!$toast[1].is(':visible'), 'Toast after a clear is visible');\n            //Teardown\n            resetContainer();\n            start();\n        }, delay);\n    });\n    asyncTest('clear and show - after clear new toast creates container', 1, function () {\n        //Arrange\n        var $toast = [];\n        $toast[0] = toastr.info(sampleMsg, sampleTitle + '-1');\n        $toast[1] = toastr.info(sampleMsg, sampleTitle + '-2');\n        var $container = toastr.getContainer();\n        toastr.clear();\n        //Act\n        setTimeout(function () {\n            $toast[2] = toastr.info(sampleMsg, sampleTitle + '-3-Visible');\n            //Assert\n            equal($(selectors.container).find('div.toast-title').html(), sampleTitle + '-3-Visible', 'Finds toast after a clear'); //Teardown\n            resetContainer();\n            start();\n        }, delay);\n    });\n    asyncTest('clear and show - clear toast after hover', 1, function () {\n        //Arrange\n        var $toast = toastr.info(sampleMsg, sampleTitle);\n        var $container = toastr.getContainer();\n        $toast.trigger(\"mouseout\");\n        //Act\n        setTimeout(function () {\n            //Assert\n            ok($container.find('div.toast-title').length === 0, 'Toast clears after a mouse hover'); //Teardown\n            resetContainer();\n            start();\n        }, 500);\n    });\n    asyncTest('clear and show - do not clear toast after hover', 1, function () {\n        //Arrange\n        var $toast = toastr.info(sampleMsg, sampleTitle, { closeOnHover: false });\n        var $container = toastr.getContainer();\n        $toast.trigger(\"mouseout\");\n        //Act\n        setTimeout(function () {\n            //Assert\n            ok($container.find('div.toast-title').length === 1, 'Toast does not clear after a mouse hover'); //Teardown\n            resetContainer();\n            start();\n        }, 500);\n    });\n    test('clear and show - after clear all toasts new toast still appears', 1, function () {\n        //Arrange\n        var $toast = [];\n        //Act\n        $toast[0] = toastr.info(sampleMsg, sampleTitle + '-1');\n        $toast[1] = toastr.info(sampleMsg, sampleTitle + '-2');\n        toastr.clear();\n        $toast[2] = toastr.info(sampleMsg, sampleTitle + '-3-Visible');\n        //Assert\n        ok($toast[2].is(':visible'), 'Toast after a clear is visible');\n        //Teardown\n        resetContainer();\n    });\n    module('info');\n    test('info - pass title and message', 3, function () {\n        //Arrange\n        //Act\n        var $toast = toastr.info(sampleMsg, sampleTitle);\n        //Assert\n        equal($toast.find('div.toast-title').html(), sampleTitle, 'Sets title');\n        equal($toast.find('div.toast-message').html(), sampleMsg, 'Sets message');\n        ok($toast.hasClass(iconClasses.info), 'Sets info icon');\n        //Teardown\n        $toast.remove();\n        clearContainerChildren();\n    });\n    test('info - pass message, but no title', 3, function () {\n        //Arrange\n        //Act\n        var $toast = toastr.info(sampleMsg);\n        //Assert\n        equal($toast.find('div.toast-title').length, 0, 'Sets null title');\n        equal($toast.find('div.toast-message').html(), sampleMsg, 'Sets message');\n        ok($toast.hasClass(iconClasses.info), 'Sets info icon');\n        //Teardown\n        $toast.remove();\n        clearContainerChildren();\n    });\n    test('info - pass no message nor title', 3, function () {\n        //Arrange\n        //Act\n        var $toast = toastr.info(); //Assert\n        equal($toast.find('div.toast-title').length, 0, 'Sets null title');\n        equal($toast.find('div.toast-message').html(), null, 'Sets message');\n        ok($toast.hasClass(iconClasses.info), 'Sets info icon');\n        //Teardown\n        $toast.remove();\n        clearContainerChildren();\n    });\n    module('warning');\n    test('warning - pass message and title', 3, function () {\n        //Arrange\n        //Act\n        var $toast = toastr.warning(sampleMsg, sampleTitle);\n        //Assert\n        equal($toast.find('div.toast-title').html(), sampleTitle, 'Sets title');\n        equal($toast.find('div.toast-message').html(), sampleMsg, 'Sets message');\n        ok($toast.hasClass(iconClasses.warning), 'Sets warning icon');\n        //Teardown\n        $toast.remove();\n        clearContainerChildren();\n    });\n    test('warning - pass message, but no title', 3, function () {\n        //Arrange\n        //Act\n        var $toast = toastr.warning(sampleMsg);\n        //Assert\n        equal($toast.find('div.toast-title').length, 0, 'Sets empty title');\n        equal($toast.find('div.toast-message').html(), sampleMsg, 'Sets message');\n        ok($toast.hasClass(iconClasses.warning), 'Sets warning icon');\n        //Teardown\n        $toast.remove();\n        clearContainerChildren();\n    });\n    test('warning - no message nor title', 3, function () {\n        //Arrange\n        //Act\n        var $toast = toastr.warning('');\n        //Assert\n        equal($toast.find('div.toast-title').length, 0, 'Sets null title');\n        equal($toast.find('div.toast-message').length, 0, 'Sets empty message');\n        ok($toast.hasClass(iconClasses.warning), 'Sets warning icon');\n        //Teardown\n        $toast.remove();\n        clearContainerChildren();\n    });\n    module('error');\n    test('error - pass message and title', 3, function () {\n        //Arrange\n        //Act\n        var $toast = toastr.error(sampleMsg, sampleTitle);\n        //Assert\n        equal($toast.find('div.toast-title').html(), sampleTitle, 'Sets title');\n        equal($toast.find('div.toast-message').html(), sampleMsg, 'Sets message');\n        ok($toast.hasClass(iconClasses.error), 'Sets error icon');\n        //Teardown\n        $toast.remove();\n        clearContainerChildren();\n    });\n    test('error - pass message, but no title', 3, function () {\n        //Arrange\n        //Act\n        var $toast = toastr.error(sampleMsg); //Assert\n        equal($toast.find('div.toast-title').length, 0, 'Sets empty title');\n        equal($toast.find('div.toast-message').html(), sampleMsg, 'Sets message');\n        ok($toast.hasClass(iconClasses.error), 'Sets error icon');\n        //Teardown\n        $toast.remove();\n        clearContainerChildren();\n    });\n    test('error - no message nor title', 3, function () {\n        //Arrange\n        //Act\n        var $toast = toastr.error('');\n        //Assert\n        equal($toast.find('div.toast-title').length, 0, 'Sets empty title');\n        equal($toast.find('div.toast-message').length, 0, 'Sets empty message');\n        ok($toast.hasClass(iconClasses.error), 'Sets error icon');\n        //Teardown\n        $toast.remove();\n        clearContainerChildren();\n    });\n    module('success');\n    test('success - pass message and title', 3, function () {\n        //Arrange\n        //Act\n        var $toast = toastr.success(sampleMsg, sampleTitle);\n        //Assert\n        equal($toast.find('div.toast-title').html(), sampleTitle, 'Sets title');\n        equal($toast.find('div.toast-message').html(), sampleMsg, 'Sets message');\n        ok($toast.hasClass(iconClasses.success), 'Sets success icon');\n        //Teardown\n        $toast.remove();\n        clearContainerChildren();\n    });\n    test('success - pass message, but no title', 3, function () {\n        //Arrange\n        //Act\n        var $toast = toastr.success(sampleMsg);\n        //Assert\n        equal($toast.find('div.toast-title').length, 0, 'Sets empty title');\n        equal($toast.find('div.toast-message').html(), sampleMsg, 'Sets message');\n        ok($toast.hasClass(iconClasses.success), 'Sets success icon');\n        //Teardown\n        $toast.remove();\n        clearContainerChildren();\n    });\n    test('success - no message nor title', 3, function () {\n        //Arrange\n        //Act\n        var $toast = toastr.success('');\n        //Assert\n        equal($toast.find('div.toast-title').length, 0, 'Sets null title');\n        equal($toast.find('div.toast-message').length, 0, 'Sets empty message');\n        ok($toast.hasClass(iconClasses.success), 'Sets success icon'); //Teardown\n        $toast.remove();\n        clearContainerChildren();\n    });\n\n\n    module('escape html', {\n        teardown: function () {\n            toastr.options.escapeHtml = false;\n        }\n    });\n    test('info - escape html', 2, function () {\n        //Arrange\n        toastr.options.escapeHtml = true;\n        //Act\n        var $toast = toastr.info('html <strong>message</strong>', 'html <u>title</u>');\n        //Assert\n        equal($toast.find('div.toast-title').html(), 'html &lt;u&gt;title&lt;/u&gt;', 'Title is escaped');\n        equal($toast.find('div.toast-message').html(), 'html &lt;strong&gt;message&lt;/strong&gt;', 'Message is escaped');\n        //Teardown\n        $toast.remove();\n        clearContainerChildren();\n    });\n    test('warning - escape html', 2, function () {\n        //Arrange\n        toastr.options.escapeHtml = true;\n        //Act\n        var $toast = toastr.warning('html <strong>message</strong>', 'html <u>title</u>');\n        //Assert\n        equal($toast.find('div.toast-title').html(), 'html &lt;u&gt;title&lt;/u&gt;', 'Title is escaped');\n        equal($toast.find('div.toast-message').html(), 'html &lt;strong&gt;message&lt;/strong&gt;', 'Message is escaped');\n        //Teardown\n        $toast.remove();\n        clearContainerChildren();\n    });\n    test('error - escape html', 2, function () {\n        //Arrange\n        toastr.options.escapeHtml = true;\n        //Act\n        var $toast = toastr.error('html <strong>message</strong>', 'html <u>title</u>');\n        //Assert\n        equal($toast.find('div.toast-title').html(), 'html &lt;u&gt;title&lt;/u&gt;', 'Title is escaped');\n        equal($toast.find('div.toast-message').html(), 'html &lt;strong&gt;message&lt;/strong&gt;', 'Message is escaped');\n        //Teardown\n        $toast.remove();\n        clearContainerChildren();\n    });\n    test('success - escape html', 2, function () {\n        //Arrange\n        toastr.options.escapeHtml = true;\n        //Act\n        var $toast = toastr.success('html <strong>message</strong>', 'html <u>title</u>');\n        //Assert\n        equal($toast.find('div.toast-title').html(), 'html &lt;u&gt;title&lt;/u&gt;', 'Title is escaped');\n        equal($toast.find('div.toast-message').html(), 'html &lt;strong&gt;message&lt;/strong&gt;', 'Message is escaped');\n        //Teardown\n        $toast.remove();\n        clearContainerChildren();\n    });\n\n    module('closeButton', {\n        teardown: function () {\n            toastr.options.closeButton = false;\n        }\n    });\n    test('close button disabled', 1, function () {\n        //Arrange\n        toastr.options.closeButton = false;\n        //Act\n        var $toast = toastr.success('');\n        //Assert\n        equal($toast.find('button.toast-close-button').length, 0, 'close button should not exist with closeButton=false');\n        //Teardown\n        $toast.remove();\n        clearContainerChildren();\n    });\n    test('close button enabled', 1, function () {\n        //Arrange\n        toastr.options.closeButton = true;\n        //Act\n        var $toast = toastr.success('');\n        //Assert\n        equal($toast.find('button.toast-close-button').length, 1, 'close button should exist with closeButton=true');\n        //Teardown\n        $toast.remove();\n        clearContainerChildren();\n    });\n    test('close button has type=button', 1, function () {\n        //Arrange\n        toastr.options.closeButton = true;\n        //Act\n        var $toast = toastr.success('');\n        //Assert\n        equal($toast.find('button[type=\"button\"].toast-close-button').length, 1, 'close button should have type=button');\n        //Teardown\n        $toast.remove();\n        clearContainerChildren();\n    });\n    asyncTest('close button duration', 1, function () {\n        //Arrange\n        toastr.options.closeButton = true;\n        toastr.options.closeDuration = 0;\n        toastr.options.hideDuration = 2000;\n        var $container = toastr.getContainer();\n        //Act\n        var $toast = toastr.success('');\n        $toast.find('button.toast-close-button').click();\n        setTimeout(function () {\n            //Assert\n            ok($container && $container.children().length === 0, 'close button should support own hide animation');\n            //Teardown\n            toastr.options.hideDuration = 0;\n            resetContainer();\n            start();\n        }, 500);\n    });\n\n    module('progressBar', {\n        teardown: function () {\n            toastr.options.progressBar = false;\n        }\n    });\n    test('progress bar disabled', 1, function () {\n        //Arrange\n        toastr.options.progressBar = false;\n        //Act\n        var $toast = toastr.success('');\n        //Assert\n        equal($toast.find('div.toast-progress').length, 0, 'progress bar should not exist with progressBar=false');\n        //Teardown\n        $toast.remove();\n        clearContainerChildren();\n    });\n    test('progress bar enabled', 1, function () {\n        //Arrange\n        toastr.options.progressBar = true;\n        //Act\n        var $toast = toastr.success('');\n        //Assert\n        equal($toast.find('div.toast-progress').length, 1, 'progress bar should exist with progressBar=true');\n        //Teardown\n        $toast.remove();\n        clearContainerChildren();\n    });\n\n    module('rtl', {\n        teardown: function () {\n            toastr.options.rtl = false;\n        }\n    });\n    test('toastr is ltr by default', 1, function () {\n        //Arrange\n        //Act\n        //Assert\n        toastr.subscribe(function(response) {\n            equal(response.options.rtl, false, 'ltr by default (i.e. rtl=false)');\n        });\n        var $toast = toastr.success('');\n        //Teardown\n        toastr.subscribe(null);\n        $toast.remove();\n        clearContainerChildren();\n    });\n    test('ltr toastr does not have .rtl class', 1, function () {\n        //Arrange\n        //Act\n        var $toast = toastr.success('');\n        //Assert\n        ok($toast.hasClass('rtl') === false, 'ltr div container does not have .rtl class');\n        //Teardown\n        $toast.remove();\n        clearContainerChildren();\n    });\n    test('rtl toastr has .rtl class', 1, function () {\n        //Arrange\n        toastr.options.rtl = true;\n        //Act\n        var $toast = toastr.success('');\n        //Assert\n        ok($toast.hasClass('rtl'), 'rtl div container has .rtl class');\n        //Teardown\n        $toast.remove();\n        clearContainerChildren();\n    });\n\n    module('accessibility');\n    test('toastr success has aria polite',1,function() {\n        // Arrange\n        var $toast = toastr.success('');\n\n        // Act\n        ok($toast.attr('aria-live')==='polite', 'success toast has aria-live of polite');\n\n        // Teardown\n        $toast.remove();\n        clearContainerChildren();\n    });\n    test('toastr info has aria polite',1,function() {\n        // Arrange\n        var $toast = toastr.info('');\n\n        // Act\n        ok($toast.attr('aria-live')==='polite', 'info toast has aria-live of polite');\n\n        // Teardown\n        $toast.remove();\n        clearContainerChildren();\n    });\n    test('toastr warning has aria assertive',1,function() {\n        // Arrange\n        var $toast = toastr.warning('');\n\n        // Act\n        ok($toast.attr('aria-live')==='assertive', 'warning toast has aria-live of assertive');\n\n        // Teardown\n        $toast.remove();\n        clearContainerChildren();\n    });\n    test('toastr error has aria assertive',1,function() {\n        // Arrange\n        var $toast = toastr.error('');\n\n        // Act\n        ok($toast.attr('aria-live')==='assertive', 'error toast has aria-live of assertive');\n\n        // Teardown\n        $toast.remove();\n        clearContainerChildren();\n    });\n\n    module('event', {\n        teardown: function () {\n            toastr.options.closeButton = false;\n            toastr.options.hideDuration = 0;\n        }\n    });\n    asyncTest('event - onShown is executed', 1, function () {\n        // Arrange\n        var run = false;\n        var onShown = function () { run = true; };\n        toastr.options.onShown = onShown;\n        // Act\n        var $toast = toastr.success(sampleMsg, sampleTitle);\n        setTimeout(function () {\n            // Assert\n            ok(run);\n            //Teardown\n            $toast.remove();\n            clearContainerChildren();\n            start();\n        }, delay);\n    });\n\n    asyncTest('event - onHidden is executed', 1, function () {\n        //Arrange\n        var run = false;\n        var onHidden = function () { run = true; };\n        toastr.options.onHidden = onHidden;\n        toastr.options.timeOut = 1;\n        //Act\n        var $toast = toastr.success(sampleMsg, sampleTitle);\n        setTimeout(function () {\n            // Assert\n            ok(run); //Teardown\n            $toast.remove();\n            clearContainerChildren();\n            start();\n        }, delay);\n    });\n\n    asyncTest('event - onShown and onHidden are both executed', 2, function () {\n        //Arrange\n        var onShowRun = false;\n        var onHideRun = false;\n        var onShow = function () { onShowRun = true; };\n        var onHide = function () { onHideRun = true; };\n        toastr.options.onShown = onShow;\n        toastr.options.onHidden = onHide;\n        toastr.options.timeOut = 1;\n        //Act\n        var $toast = toastr.success(sampleMsg, sampleTitle);\n        setTimeout(function () {\n            // Assert\n            ok(onShowRun);\n            ok(onHideRun);\n            //Teardown\n            $toast.remove();\n            clearContainerChildren();\n            start();\n        }, delay);\n    });\n\n    asyncTest('event - onCloseClick is executed', 1, function () {\n        //Arrange\n        var run = false;\n        toastr.options.closeButton = true;\n        toastr.options.closeDuration = 0;\n        toastr.options.hideDuration = 2000;\n        var onCloseClick = function () { run = true; };\n        toastr.options.onCloseClick = onCloseClick;\n        toastr.options.timeOut = 1;\n        //Act\n        var $toast = toastr.success(sampleMsg, sampleTitle);\n        $toast.find('button.toast-close-button').click();\n        setTimeout(function () {\n            // Assert\n            ok(run); //Teardown\n            $toast.remove();\n            clearContainerChildren();\n            start();\n        }, delay);\n    });\n\n    test('event - message appears when no show or hide method functions provided', 1, function () {\n        //Arrange\n        //Act\n        var $toast = toastr.success(sampleMsg, sampleTitle);\n        //Assert\n        ok($toast.hasClass(iconClasses.success), 'Sets success icon');\n        //Teardown\n        $toast.remove();\n        clearContainerChildren();\n    });\n\n    test('event - prevent duplicate sequential toasts.', 1, function(){\n        toastr.options.preventDuplicates = true;\n\n        var $toast = [];\n        $toast[0] = toastr.info(sampleMsg, sampleTitle);\n        $toast[1] = toastr.info(sampleMsg, sampleTitle);\n        $toast[2] = toastr.info(sampleMsg + \" 1\", sampleTitle);\n        $toast[3] = toastr.info(sampleMsg, sampleTitle);\n        var $container = toastr.getContainer();\n\n        ok($container && $container.children().length === 3);\n\n        clearContainerChildren();\n    });\n\n    test('event - prevent duplicate sequential toasts, but allow previous after clear.', 1, function(){\n        toastr.options.preventDuplicates = true;\n\n        var $toast = [];\n        $toast[0] = toastr.info(sampleMsg, sampleTitle);\n        $toast[1] = toastr.info(sampleMsg, sampleTitle);\n        clearContainerChildren();\n        $toast[3] = toastr.info(sampleMsg, sampleTitle);\n        var $container = toastr.getContainer();\n\n        ok($container && $container.children().length === 1);\n\n        clearContainerChildren();\n    });\n\n    test('event - allow duplicate sequential toasts.', 1, function(){\n        toastr.options.preventDuplicates = false;\n\n        var $toast = [];\n        $toast[0] = toastr.info(sampleMsg, sampleTitle);\n        $toast[1] = toastr.info(sampleMsg, sampleTitle);\n        $toast[1] = toastr.info(sampleMsg, sampleTitle);\n        var $container = toastr.getContainer();\n\n        ok($container && $container.children().length === 3);\n\n        clearContainerChildren();\n    });\n\n    test('event - allow preventDuplicates option to be overridden.', 1, function() {\n        var $toast = [];\n\n        $toast[0] = toastr.info(sampleMsg, sampleTitle, {\n            preventDuplicates: true\n        });\n        $toast[1] = toastr.info(sampleMsg, sampleTitle, {\n            preventDuplicates: true\n        });\n        $toast[2] = toastr.info(sampleMsg, sampleTitle);\n        var $container = toastr.getContainer();\n\n        ok($container && $container.children().length === 2);\n        clearContainerChildren();\n    });\n\n    module('subscription');\n    asyncTest('subscribe - triggers 2 visible and 2 hidden response notifications while clicking on a toast', 1, function () {\n        //Arrange\n        var $toast = [];\n        var expectedReponses = [];\n        //Act\n        toastr.subscribe(function(response) {\n          if(response.options.testId) {\n            expectedReponses.push(response);\n          }\n        })\n\n        $toast[0] = toastr.info(sampleMsg, sampleTitle, {testId : 1});\n        $toast[1] = toastr.info(sampleMsg, sampleTitle, {testId : 2});\n\n        $toast[1].click()\n\n        setTimeout(function () {\n            // Assert\n            ok(expectedReponses.length === 4);\n            //Teardown\n            clearContainerChildren();\n            toastr.subscribe(null);\n            start();\n        }, delay);\n    });\n\n    module('order of appearance');\n    test('Newest toast on top', 1, function () {\n        //Arrange\n        resetContainer();\n        toastr.options.newestOnTop = true;\n        //Act\n        var $first = toastr.success(\"First toast\");\n        var $second = toastr.success(\"Second toast\");\n        //Assert\n        var containerHtml = toastr.getContainer().html();\n        ok(containerHtml.indexOf(\"First toast\") > containerHtml.indexOf(\"Second toast\"), 'Newest toast is on top');\n        //Teardown\n        $first.remove();\n        $second.remove();\n        resetContainer();\n    });\n\n    test('Oldest toast on top', 1, function () {\n        //Arrange\n        resetContainer();\n        toastr.options.newestOnTop = false;\n        //Act\n        var $first = toastr.success(\"First toast\");\n        var $second = toastr.success(\"Second toast\");\n        //Assert\n        var containerHtml = toastr.getContainer().html();\n        ok(containerHtml.indexOf(\"First toast\") < containerHtml.indexOf(\"Second toast\"), 'Oldest toast is on top');\n        //Teardown\n        $first.remove();\n        $second.remove();\n        resetContainer();\n    });\n\n    // These must go last\n    module('positioning');\n    test('Container - position top-right', 1, function () {\n        //Arrange\n        resetContainer();\n        toastr.options.positionClass = positionClasses.topRight;\n        //Act\n        var $toast = toastr.success(sampleMsg);\n        var $container = toastr.getContainer();\n        //Assert\n        ok($container.hasClass(positionClasses.topRight), 'Has position top right');\n        //Teardown\n        $toast.remove();\n        resetContainer();\n    });\n    test('Container - position bottom-right', 1, function () {\n        //Arrange\n        resetContainer();\n        toastr.options.positionClass = positionClasses.bottomRight;\n        //Act\n        var $toast = toastr.success(sampleMsg);\n        var $container = toastr.getContainer();\n        //Assert\n        ok($container.hasClass(positionClasses.bottomRight), 'Has position bottom right');\n        //Teardown\n        $toast.remove();\n        resetContainer();\n    });\n    test('Container - position bottom-left', 1, function () {\n        //Arrange\n        resetContainer();\n        //$(selectors.container).remove()\n        toastr.options.positionClass = positionClasses.bottomLeft;\n        //Act\n        var $toast = toastr.success(sampleMsg);\n        var $container = toastr.getContainer();\n        //Assert\n        ok($container.hasClass(positionClasses.bottomLeft), 'Has position bottom left');\n        //Teardown\n        $toast.remove();\n        resetContainer();\n    });\n    test('Container - position top-left', 1, function () {\n        //Arrange\n        resetContainer();\n        toastr.options.positionClass = positionClasses.topLeft;\n        //Act\n        var $toast = toastr.success(sampleMsg);\n        var $container = toastr.getContainer();\n        //Assert\n        ok($container.hasClass(positionClasses.topLeft), 'Has position top left');\n        //Teardown\n        $toast.remove();\n        resetContainer();\n    });\n    test('Container - position top-center', 1, function () {\n        //Arrange\n        resetContainer();\n        toastr.options.positionClass = positionClasses.topCenter;\n        //Act\n        var $toast = toastr.success(sampleMsg);\n        var $container = toastr.getContainer();\n        //Assert\n        ok($container.hasClass(positionClasses.topCenter), 'Has position top center');\n        //Teardown\n        $toast.remove();\n        resetContainer();\n    });\n    test('Container - position bottom-center', 1, function () {\n        //Arrange\n        resetContainer();\n        toastr.options.positionClass = positionClasses.bottomCenter;\n        //Act\n        var $toast = toastr.success(sampleMsg);\n        var $container = toastr.getContainer();\n        //Assert\n        ok($container.hasClass(positionClasses.bottomCenter), 'Has position bottom center');\n        //Teardown\n        $toast.remove();\n        resetContainer();\n    });\n\n    function resetContainer() {\n        var $container = toastr.getContainer();\n        if ($container) {\n            $container.remove();\n        }\n        $(selectors.container).remove();\n        clearContainerChildren();\n    }\n\n    function clearContainerChildren() {\n        toastr.clear();\n    }\n\n})();\n"
  },
  {
    "path": "tests/unit/x.js",
    "content": "    test('test test', 1, function () {\n        ok(1 === 1, '1 equals 1');\n    });\n"
  },
  {
    "path": "toastr.js",
    "content": "/*\n * Toastr\n * Copyright 2012-2015\n * Authors: John Papa, Hans Fjällemark, and Tim Ferrell.\n * All Rights Reserved.\n * Use, reproduction, distribution, and modification of this code is subject to the terms and\n * conditions of the MIT license, available at http://www.opensource.org/licenses/mit-license.php\n *\n * ARIA Support: Greta Krafsig\n *\n * Project: https://github.com/CodeSeven/toastr\n */\n/* global define */\n(function (define) {\n    define(['jquery'], function ($) {\n        return (function () {\n            var $container;\n            var listener;\n            var toastId = 0;\n            var toastType = {\n                error: 'error',\n                info: 'info',\n                success: 'success',\n                warning: 'warning'\n            };\n\n            var toastr = {\n                clear: clear,\n                remove: remove,\n                error: error,\n                getContainer: getContainer,\n                info: info,\n                options: {},\n                subscribe: subscribe,\n                success: success,\n                version: '2.1.4',\n                warning: warning\n            };\n\n            var previousToast;\n\n            return toastr;\n\n            ////////////////\n\n            function error(message, title, optionsOverride) {\n                return notify({\n                    type: toastType.error,\n                    iconClass: getOptions().iconClasses.error,\n                    message: message,\n                    optionsOverride: optionsOverride,\n                    title: title\n                });\n            }\n\n            function getContainer(options, create) {\n                if (!options) { options = getOptions(); }\n                $container = $('#' + options.containerId);\n                if ($container.length) {\n                    return $container;\n                }\n                if (create) {\n                    $container = createContainer(options);\n                }\n                return $container;\n            }\n\n            function info(message, title, optionsOverride) {\n                return notify({\n                    type: toastType.info,\n                    iconClass: getOptions().iconClasses.info,\n                    message: message,\n                    optionsOverride: optionsOverride,\n                    title: title\n                });\n            }\n\n            function subscribe(callback) {\n                listener = callback;\n            }\n\n            function success(message, title, optionsOverride) {\n                return notify({\n                    type: toastType.success,\n                    iconClass: getOptions().iconClasses.success,\n                    message: message,\n                    optionsOverride: optionsOverride,\n                    title: title\n                });\n            }\n\n            function warning(message, title, optionsOverride) {\n                return notify({\n                    type: toastType.warning,\n                    iconClass: getOptions().iconClasses.warning,\n                    message: message,\n                    optionsOverride: optionsOverride,\n                    title: title\n                });\n            }\n\n            function clear($toastElement, clearOptions) {\n                var options = getOptions();\n                if (!$container) { getContainer(options); }\n                if (!clearToast($toastElement, options, clearOptions)) {\n                    clearContainer(options);\n                }\n            }\n\n            function remove($toastElement) {\n                var options = getOptions();\n                if (!$container) { getContainer(options); }\n                if ($toastElement && $(':focus', $toastElement).length === 0) {\n                    removeToast($toastElement);\n                    return;\n                }\n                if ($container.children().length) {\n                    $container.remove();\n                }\n            }\n\n            // internal functions\n\n            function clearContainer (options) {\n                var toastsToClear = $container.children();\n                for (var i = toastsToClear.length - 1; i >= 0; i--) {\n                    clearToast($(toastsToClear[i]), options);\n                }\n            }\n\n            function clearToast ($toastElement, options, clearOptions) {\n                var force = clearOptions && clearOptions.force ? clearOptions.force : false;\n                if ($toastElement && (force || $(':focus', $toastElement).length === 0)) {\n                    $toastElement[options.hideMethod]({\n                        duration: options.hideDuration,\n                        easing: options.hideEasing,\n                        complete: function () { removeToast($toastElement); }\n                    });\n                    return true;\n                }\n                return false;\n            }\n\n            function createContainer(options) {\n                $container = $('<div/>')\n                    .attr('id', options.containerId)\n                    .addClass(options.positionClass);\n\n                $container.appendTo($(options.target));\n                return $container;\n            }\n\n            function getDefaults() {\n                return {\n                    tapToDismiss: true,\n                    toastClass: 'toast',\n                    containerId: 'toast-container',\n                    debug: false,\n\n                    showMethod: 'fadeIn', //fadeIn, slideDown, and show are built into jQuery\n                    showDuration: 300,\n                    showEasing: 'swing', //swing and linear are built into jQuery\n                    onShown: undefined,\n                    hideMethod: 'fadeOut',\n                    hideDuration: 1000,\n                    hideEasing: 'swing',\n                    onHidden: undefined,\n                    closeMethod: false,\n                    closeDuration: false,\n                    closeEasing: false,\n                    closeOnHover: true,\n\n                    extendedTimeOut: 1000,\n                    iconClasses: {\n                        error: 'toast-error',\n                        info: 'toast-info',\n                        success: 'toast-success',\n                        warning: 'toast-warning'\n                    },\n                    iconClass: 'toast-info',\n                    positionClass: 'toast-top-right',\n                    timeOut: 5000, // Set timeOut and extendedTimeOut to 0 to make it sticky\n                    titleClass: 'toast-title',\n                    messageClass: 'toast-message',\n                    escapeHtml: false,\n                    target: 'body',\n                    closeHtml: '<button type=\"button\">&times;</button>',\n                    closeClass: 'toast-close-button',\n                    newestOnTop: true,\n                    preventDuplicates: false,\n                    progressBar: false,\n                    progressClass: 'toast-progress',\n                    rtl: false\n                };\n            }\n\n            function publish(args) {\n                if (!listener) { return; }\n                listener(args);\n            }\n\n            function notify(map) {\n                var options = getOptions();\n                var iconClass = map.iconClass || options.iconClass;\n\n                if (typeof (map.optionsOverride) !== 'undefined') {\n                    options = $.extend(options, map.optionsOverride);\n                    iconClass = map.optionsOverride.iconClass || iconClass;\n                }\n\n                if (shouldExit(options, map)) { return; }\n\n                toastId++;\n\n                $container = getContainer(options, true);\n\n                var intervalId = null;\n                var $toastElement = $('<div/>');\n                var $titleElement = $('<div/>');\n                var $messageElement = $('<div/>');\n                var $progressElement = $('<div/>');\n                var $closeElement = $(options.closeHtml);\n                var progressBar = {\n                    intervalId: null,\n                    hideEta: null,\n                    maxHideTime: null\n                };\n                var response = {\n                    toastId: toastId,\n                    state: 'visible',\n                    startTime: new Date(),\n                    options: options,\n                    map: map\n                };\n\n                personalizeToast();\n\n                displayToast();\n\n                handleEvents();\n\n                publish(response);\n\n                if (options.debug && console) {\n                    console.log(response);\n                }\n\n                return $toastElement;\n\n                function escapeHtml(source) {\n                    if (source == null) {\n                        source = '';\n                    }\n\n                    return source\n                        .replace(/&/g, '&amp;')\n                        .replace(/\"/g, '&quot;')\n                        .replace(/'/g, '&#39;')\n                        .replace(/</g, '&lt;')\n                        .replace(/>/g, '&gt;');\n                }\n\n                function personalizeToast() {\n                    setIcon();\n                    setTitle();\n                    setMessage();\n                    setCloseButton();\n                    setProgressBar();\n                    setRTL();\n                    setSequence();\n                    setAria();\n                }\n\n                function setAria() {\n                    var ariaValue = '';\n                    switch (map.iconClass) {\n                        case 'toast-success':\n                        case 'toast-info':\n                            ariaValue =  'polite';\n                            break;\n                        default:\n                            ariaValue = 'assertive';\n                    }\n                    $toastElement.attr('aria-live', ariaValue);\n                }\n\n                function handleEvents() {\n                    if (options.closeOnHover) {\n                        $toastElement.hover(stickAround, delayedHideToast);\n                    }\n\n                    if (!options.onclick && options.tapToDismiss) {\n                        $toastElement.click(hideToast);\n                    }\n\n                    if (options.closeButton && $closeElement) {\n                        $closeElement.click(function (event) {\n                            if (event.stopPropagation) {\n                                event.stopPropagation();\n                            } else if (event.cancelBubble !== undefined && event.cancelBubble !== true) {\n                                event.cancelBubble = true;\n                            }\n\n                            if (options.onCloseClick) {\n                                options.onCloseClick(event);\n                            }\n\n                            hideToast(true);\n                        });\n                    }\n\n                    if (options.onclick) {\n                        $toastElement.click(function (event) {\n                            options.onclick(event);\n                            hideToast();\n                        });\n                    }\n                }\n\n                function displayToast() {\n                    $toastElement.hide();\n\n                    $toastElement[options.showMethod](\n                        {duration: options.showDuration, easing: options.showEasing, complete: options.onShown}\n                    );\n\n                    if (options.timeOut > 0) {\n                        intervalId = setTimeout(hideToast, options.timeOut);\n                        progressBar.maxHideTime = parseFloat(options.timeOut);\n                        progressBar.hideEta = new Date().getTime() + progressBar.maxHideTime;\n                        if (options.progressBar) {\n                            progressBar.intervalId = setInterval(updateProgress, 10);\n                        }\n                    }\n                }\n\n                function setIcon() {\n                    if (map.iconClass) {\n                        $toastElement.addClass(options.toastClass).addClass(iconClass);\n                    }\n                }\n\n                function setSequence() {\n                    if (options.newestOnTop) {\n                        $container.prepend($toastElement);\n                    } else {\n                        $container.append($toastElement);\n                    }\n                }\n\n                function setTitle() {\n                    if (map.title) {\n                        var suffix = map.title;\n                        if (options.escapeHtml) {\n                            suffix = escapeHtml(map.title);\n                        }\n                        $titleElement.append(suffix).addClass(options.titleClass);\n                        $toastElement.append($titleElement);\n                    }\n                }\n\n                function setMessage() {\n                    if (map.message) {\n                        var suffix = map.message;\n                        if (options.escapeHtml) {\n                            suffix = escapeHtml(map.message);\n                        }\n                        $messageElement.append(suffix).addClass(options.messageClass);\n                        $toastElement.append($messageElement);\n                    }\n                }\n\n                function setCloseButton() {\n                    if (options.closeButton) {\n                        $closeElement.addClass(options.closeClass).attr('role', 'button');\n                        $toastElement.prepend($closeElement);\n                    }\n                }\n\n                function setProgressBar() {\n                    if (options.progressBar) {\n                        $progressElement.addClass(options.progressClass);\n                        $toastElement.prepend($progressElement);\n                    }\n                }\n\n                function setRTL() {\n                    if (options.rtl) {\n                        $toastElement.addClass('rtl');\n                    }\n                }\n\n                function shouldExit(options, map) {\n                    if (options.preventDuplicates) {\n                        if (map.message === previousToast) {\n                            return true;\n                        } else {\n                            previousToast = map.message;\n                        }\n                    }\n                    return false;\n                }\n\n                function hideToast(override) {\n                    var method = override && options.closeMethod !== false ? options.closeMethod : options.hideMethod;\n                    var duration = override && options.closeDuration !== false ?\n                        options.closeDuration : options.hideDuration;\n                    var easing = override && options.closeEasing !== false ? options.closeEasing : options.hideEasing;\n                    if ($(':focus', $toastElement).length && !override) {\n                        return;\n                    }\n                    clearTimeout(progressBar.intervalId);\n                    return $toastElement[method]({\n                        duration: duration,\n                        easing: easing,\n                        complete: function () {\n                            removeToast($toastElement);\n                            clearTimeout(intervalId);\n                            if (options.onHidden && response.state !== 'hidden') {\n                                options.onHidden();\n                            }\n                            response.state = 'hidden';\n                            response.endTime = new Date();\n                            publish(response);\n                        }\n                    });\n                }\n\n                function delayedHideToast() {\n                    if (options.timeOut > 0 || options.extendedTimeOut > 0) {\n                        intervalId = setTimeout(hideToast, options.extendedTimeOut);\n                        progressBar.maxHideTime = parseFloat(options.extendedTimeOut);\n                        progressBar.hideEta = new Date().getTime() + progressBar.maxHideTime;\n                    }\n                }\n\n                function stickAround() {\n                    clearTimeout(intervalId);\n                    progressBar.hideEta = 0;\n                    $toastElement.stop(true, true)[options.showMethod](\n                        {duration: options.showDuration, easing: options.showEasing}\n                    );\n                }\n\n                function updateProgress() {\n                    var percentage = ((progressBar.hideEta - (new Date().getTime())) / progressBar.maxHideTime) * 100;\n                    $progressElement.width(percentage + '%');\n                }\n            }\n\n            function getOptions() {\n                return $.extend({}, getDefaults(), toastr.options);\n            }\n\n            function removeToast($toastElement) {\n                if (!$container) { $container = getContainer(); }\n                if ($toastElement.is(':visible')) {\n                    return;\n                }\n                $toastElement.remove();\n                $toastElement = null;\n                if ($container.children().length === 0) {\n                    $container.remove();\n                    previousToast = undefined;\n                }\n            }\n\n        })();\n    });\n}(typeof define === 'function' && define.amd ? define : function (deps, factory) {\n    if (typeof module !== 'undefined' && module.exports) { //Node\n        module.exports = factory(require('jquery'));\n    } else {\n        window.toastr = factory(window.jQuery);\n    }\n}));\n"
  },
  {
    "path": "toastr.less",
    "content": "// Mix-ins\n.borderRadius(@radius) {\n\t-moz-border-radius: @radius;\n\t-webkit-border-radius: @radius;\n\tborder-radius: @radius;\n}\n\n.boxShadow(@boxShadow) {\n\t-moz-box-shadow: @boxShadow;\n\t-webkit-box-shadow: @boxShadow;\n\tbox-shadow: @boxShadow;\n}\n\n.opacity(@opacity) {\n\t@opacityPercent: (@opacity * 100);\n\topacity: @opacity;\n\t-ms-filter: ~\"progid:DXImageTransform.Microsoft.Alpha(Opacity=@{opacityPercent})\";\n\tfilter: ~\"alpha(opacity=@{opacityPercent})\";\n}\n\n.wordWrap(@wordWrap: break-word) {\n\t-ms-word-wrap: @wordWrap;\n\tword-wrap: @wordWrap;\n}\n\n// Variables\n@black: #000000;\n@grey: #999999;\n@light-grey: #CCCCCC;\n@white: #FFFFFF;\n@near-black: #030303;\n@green: #51A351;\n@red: #BD362F;\n@blue: #2F96B4;\n@orange: #F89406;\n@default-container-opacity: .8;\n\n// Styles\n.toast-title {\n\tfont-weight: bold;\n}\n\n.toast-message {\n\t.wordWrap();\n\n\ta,\n\tlabel {\n\t\tcolor: @white;\n\t}\n\n\t\ta:hover {\n\t\t\tcolor: @light-grey;\n\t\t\ttext-decoration: none;\n\t\t}\n}\n\n.toast-close-button {\n\tposition: relative;\n\tright: -0.3em;\n\ttop: -0.3em;\n\tfloat: right;\n\tfont-size: 20px;\n\tfont-weight: bold;\n\tcolor: @white;\n\t-webkit-text-shadow: 0 1px 0 rgba(255,255,255,1);\n\ttext-shadow: 0 1px 0 rgba(255,255,255,1);\n\t.opacity(0.8);\n\tline-height: 1;\n\n\t&:hover,\n\t&:focus {\n\t\tcolor: @black;\n\t\ttext-decoration: none;\n\t\tcursor: pointer;\n\t\t.opacity(0.4);\n\t}\n}\n\n.rtl .toast-close-button {\n\tleft: -0.3em;\n\tfloat: left;\n\tright: 0.3em;\n}\n\n/*Additional properties for button version\n iOS requires the button element instead of an anchor tag.\n If you want the anchor version, it requires `href=\"#\"`.*/\nbutton.toast-close-button {\n\tpadding: 0;\n\tcursor: pointer;\n\tbackground: transparent;\n\tborder: 0;\n\t-webkit-appearance: none;\n}\n\n//#endregion\n\n.toast-top-center {\n\ttop: 0;\n\tright: 0;\n\twidth: 100%;\n}\n\n.toast-bottom-center {\n\tbottom: 0;\n\tright: 0;\n\twidth: 100%;\n}\n\n.toast-top-full-width {\n\ttop: 0;\n\tright: 0;\n\twidth: 100%;\n}\n\n.toast-bottom-full-width {\n\tbottom: 0;\n\tright: 0;\n\twidth: 100%;\n}\n\n.toast-top-left {\n\ttop: 12px;\n\tleft: 12px;\n}\n\n.toast-top-right {\n\ttop: 12px;\n\tright: 12px;\n}\n\n.toast-bottom-right {\n\tright: 12px;\n\tbottom: 12px;\n}\n\n.toast-bottom-left {\n\tbottom: 12px;\n\tleft: 12px;\n}\n\n#toast-container {\n\tposition: fixed;\n\tz-index: 999999;\n\t// The container should not be clickable.\n\tpointer-events: none;\n\t* {\n\t\t-moz-box-sizing: border-box;\n\t\t-webkit-box-sizing: border-box;\n\t\tbox-sizing: border-box;\n\t}\n\n\t> div {\n\t\tposition: relative;\n\t\t// The toast itself should be clickable.\n\t\tpointer-events: auto;\n\t\toverflow: hidden;\n\t\tmargin: 0 0 6px;\n\t\tpadding: 15px 15px 15px 50px;\n\t\twidth: 300px;\n\t\t.borderRadius(3px 3px 3px 3px);\n\t\tbackground-position: 15px center;\n\t\tbackground-repeat: no-repeat;\n\t\t.boxShadow(0 0 12px @grey);\n\t\tcolor: @white;\n\t\t.opacity(@default-container-opacity);\n\t}\n\n\t> div.rtl {\n\t\tdirection: rtl;\n\t\tpadding: 15px 50px 15px 15px;\n\t\tbackground-position: right 15px center;\n\t}\n\n\t> div:hover {\n\t\t.boxShadow(0 0 12px @black);\n\t\t.opacity(1);\n\t\tcursor: pointer;\n\t}\n\n\t> .toast-info {\n\t\tbackground-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGwSURBVEhLtZa9SgNBEMc9sUxxRcoUKSzSWIhXpFMhhYWFhaBg4yPYiWCXZxBLERsLRS3EQkEfwCKdjWJAwSKCgoKCcudv4O5YLrt7EzgXhiU3/4+b2ckmwVjJSpKkQ6wAi4gwhT+z3wRBcEz0yjSseUTrcRyfsHsXmD0AmbHOC9Ii8VImnuXBPglHpQ5wwSVM7sNnTG7Za4JwDdCjxyAiH3nyA2mtaTJufiDZ5dCaqlItILh1NHatfN5skvjx9Z38m69CgzuXmZgVrPIGE763Jx9qKsRozWYw6xOHdER+nn2KkO+Bb+UV5CBN6WC6QtBgbRVozrahAbmm6HtUsgtPC19tFdxXZYBOfkbmFJ1VaHA1VAHjd0pp70oTZzvR+EVrx2Ygfdsq6eu55BHYR8hlcki+n+kERUFG8BrA0BwjeAv2M8WLQBtcy+SD6fNsmnB3AlBLrgTtVW1c2QN4bVWLATaIS60J2Du5y1TiJgjSBvFVZgTmwCU+dAZFoPxGEEs8nyHC9Bwe2GvEJv2WXZb0vjdyFT4Cxk3e/kIqlOGoVLwwPevpYHT+00T+hWwXDf4AJAOUqWcDhbwAAAAASUVORK5CYII=\") !important;\n\t}\n\n\t> .toast-error {\n\t\tbackground-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHOSURBVEhLrZa/SgNBEMZzh0WKCClSCKaIYOED+AAKeQQLG8HWztLCImBrYadgIdY+gIKNYkBFSwu7CAoqCgkkoGBI/E28PdbLZmeDLgzZzcx83/zZ2SSXC1j9fr+I1Hq93g2yxH4iwM1vkoBWAdxCmpzTxfkN2RcyZNaHFIkSo10+8kgxkXIURV5HGxTmFuc75B2RfQkpxHG8aAgaAFa0tAHqYFfQ7Iwe2yhODk8+J4C7yAoRTWI3w/4klGRgR4lO7Rpn9+gvMyWp+uxFh8+H+ARlgN1nJuJuQAYvNkEnwGFck18Er4q3egEc/oO+mhLdKgRyhdNFiacC0rlOCbhNVz4H9FnAYgDBvU3QIioZlJFLJtsoHYRDfiZoUyIxqCtRpVlANq0EU4dApjrtgezPFad5S19Wgjkc0hNVnuF4HjVA6C7QrSIbylB+oZe3aHgBsqlNqKYH48jXyJKMuAbiyVJ8KzaB3eRc0pg9VwQ4niFryI68qiOi3AbjwdsfnAtk0bCjTLJKr6mrD9g8iq/S/B81hguOMlQTnVyG40wAcjnmgsCNESDrjme7wfftP4P7SP4N3CJZdvzoNyGq2c/HWOXJGsvVg+RA/k2MC/wN6I2YA2Pt8GkAAAAASUVORK5CYII=\") !important;\n\t}\n\n\t> .toast-success {\n\t\tbackground-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAADsSURBVEhLY2AYBfQMgf///3P8+/evAIgvA/FsIF+BavYDDWMBGroaSMMBiE8VC7AZDrIFaMFnii3AZTjUgsUUWUDA8OdAH6iQbQEhw4HyGsPEcKBXBIC4ARhex4G4BsjmweU1soIFaGg/WtoFZRIZdEvIMhxkCCjXIVsATV6gFGACs4Rsw0EGgIIH3QJYJgHSARQZDrWAB+jawzgs+Q2UO49D7jnRSRGoEFRILcdmEMWGI0cm0JJ2QpYA1RDvcmzJEWhABhD/pqrL0S0CWuABKgnRki9lLseS7g2AlqwHWQSKH4oKLrILpRGhEQCw2LiRUIa4lwAAAABJRU5ErkJggg==\") !important;\n\t}\n\n\t> .toast-warning {\n\t\tbackground-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGYSURBVEhL5ZSvTsNQFMbXZGICMYGYmJhAQIJAICYQPAACiSDB8AiICQQJT4CqQEwgJvYASAQCiZiYmJhAIBATCARJy+9rTsldd8sKu1M0+dLb057v6/lbq/2rK0mS/TRNj9cWNAKPYIJII7gIxCcQ51cvqID+GIEX8ASG4B1bK5gIZFeQfoJdEXOfgX4QAQg7kH2A65yQ87lyxb27sggkAzAuFhbbg1K2kgCkB1bVwyIR9m2L7PRPIhDUIXgGtyKw575yz3lTNs6X4JXnjV+LKM/m3MydnTbtOKIjtz6VhCBq4vSm3ncdrD2lk0VgUXSVKjVDJXJzijW1RQdsU7F77He8u68koNZTz8Oz5yGa6J3H3lZ0xYgXBK2QymlWWA+RWnYhskLBv2vmE+hBMCtbA7KX5drWyRT/2JsqZ2IvfB9Y4bWDNMFbJRFmC9E74SoS0CqulwjkC0+5bpcV1CZ8NMej4pjy0U+doDQsGyo1hzVJttIjhQ7GnBtRFN1UarUlH8F3xict+HY07rEzoUGPlWcjRFRr4/gChZgc3ZL2d8oAAAAASUVORK5CYII=\") !important;\n\t}\n\n\t/*overrides*/\n\t&.toast-top-center > div,\n\t&.toast-bottom-center > div {\n\t\twidth: 300px;\n\t\tmargin-left: auto;\n\t\tmargin-right: auto;\n\t}\n\n\t&.toast-top-full-width > div,\n\t&.toast-bottom-full-width > div {\n\t\twidth: 96%;\n\t\tmargin-left: auto;\n\t\tmargin-right: auto;\n\t}\n}\n\n.toast {\n\tbackground-color: @near-black;\n}\n\n.toast-success {\n\tbackground-color: @green;\n}\n\n.toast-error {\n\tbackground-color: @red;\n}\n\n.toast-info {\n\tbackground-color: @blue;\n}\n\n.toast-warning {\n\tbackground-color: @orange;\n}\n\n.toast-progress {\n\tposition: absolute;\n\tleft: 0;\n\tbottom: 0;\n\theight: 4px;\n\tbackground-color: @black;\n\t.opacity(0.4);\n}\n\n/*Responsive Design*/\n\n@media all and (max-width: 240px) {\n\t#toast-container {\n\n\t\t> div {\n\t\t\tpadding: 8px 8px 8px 50px;\n\t\t\twidth: 11em;\n\t\t}\n\n\t\t> div.rtl {\n\t\t\tpadding: 8px 50px 8px 8px;\n\t\t}\n\n\t\t& .toast-close-button {\n\t\t\tright: -0.2em;\n\t\t\ttop: -0.2em;\n\t\t}\n\n\t\t& .rtl .toast-close-button {\n\t\t\tleft: -0.2em;\n\t\t\tright: 0.2em;\n\t\t}\n\t}\n}\n\n@media all and (min-width: 241px) and (max-width: 480px) {\n\t#toast-container {\n\t\t> div {\n\t\t\tpadding: 8px 8px 8px 50px;\n\t\t\twidth: 18em;\n\t\t}\n\n\t\t> div.rtl {\n\t\t\tpadding: 8px 50px 8px 8px;\n\t\t}\n\n\t\t& .toast-close-button {\n\t\t\tright: -0.2em;\n\t\t\ttop: -0.2em;\n\t\t}\n\n\t\t& .rtl .toast-close-button {\n\t\t\tleft: -0.2em;\n\t\t\tright: 0.2em;\n\t\t}\n\t}\n}\n\n@media all and (min-width: 481px) and (max-width: 768px) {\n\t#toast-container {\n\t\t> div {\n\t\t\tpadding: 15px 15px 15px 50px;\n\t\t\twidth: 25em;\n\t\t}\n\n\t\t> div.rtl {\n\t\t\tpadding: 15px 50px 15px 15px;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "toastr.scss",
    "content": ".toast-title {\n  font-weight: bold;\n}\n.toast-message {\n  -ms-word-wrap: break-word;\n  word-wrap: break-word;\n}\n.toast-message a,\n.toast-message label {\n  color: #ffffff;\n}\n.toast-message a:hover {\n  color: #cccccc;\n  text-decoration: none;\n}\n.toast-close-button {\n  position: relative;\n  right: -0.3em;\n  top: -0.3em;\n  float: right;\n  font-size: 20px;\n  font-weight: bold;\n  color: #ffffff;\n  -webkit-text-shadow: 0 1px 0 #ffffff;\n  text-shadow: 0 1px 0 #ffffff;\n  opacity: 0.8;\n  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=80);\n  filter: alpha(opacity=80);\n}\n.toast-close-button:hover,\n.toast-close-button:focus {\n  color: #000000;\n  text-decoration: none;\n  cursor: pointer;\n  opacity: 0.4;\n  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=40);\n  filter: alpha(opacity=40);\n}\n/*Additional properties for button version\n iOS requires the button element instead of an anchor tag.\n If you want the anchor version, it requires `href=\"#\"`.*/\nbutton.toast-close-button {\n  padding: 0;\n  cursor: pointer;\n  background: transparent;\n  border: 0;\n  -webkit-appearance: none;\n}\n.toast-top-center {\n  top: 0;\n  right: 0;\n  width: 100%;\n}\n.toast-bottom-center {\n  bottom: 0;\n  right: 0;\n  width: 100%;\n}\n.toast-top-full-width {\n  top: 0;\n  right: 0;\n  width: 100%;\n}\n.toast-bottom-full-width {\n  bottom: 0;\n  right: 0;\n  width: 100%;\n}\n.toast-top-left {\n  top: 12px;\n  left: 12px;\n}\n.toast-top-right {\n  top: 12px;\n  right: 12px;\n}\n.toast-bottom-right {\n  right: 12px;\n  bottom: 12px;\n}\n.toast-bottom-left {\n  bottom: 12px;\n  left: 12px;\n}\n#toast-container {\n  position: fixed;\n  z-index: 999999;\n  /*overrides*/\n\n}\n#toast-container * {\n  -moz-box-sizing: border-box;\n  -webkit-box-sizing: border-box;\n  box-sizing: border-box;\n}\n#toast-container > div {\n  position: relative;\n  overflow: hidden;\n  margin: 0 0 6px;\n  padding: 15px 15px 15px 50px;\n  width: 300px;\n  -moz-border-radius: 3px 3px 3px 3px;\n  -webkit-border-radius: 3px 3px 3px 3px;\n  border-radius: 3px 3px 3px 3px;\n  background-position: 15px center;\n  background-repeat: no-repeat;\n  -moz-box-shadow: 0 0 12px #999999;\n  -webkit-box-shadow: 0 0 12px #999999;\n  box-shadow: 0 0 12px #999999;\n  color: #ffffff;\n  opacity: 0.8;\n  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=80);\n  filter: alpha(opacity=80);\n}\n#toast-container > div:hover {\n  -moz-box-shadow: 0 0 12px #000000;\n  -webkit-box-shadow: 0 0 12px #000000;\n  box-shadow: 0 0 12px #000000;\n  opacity: 1;\n  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100);\n  filter: alpha(opacity=100);\n  cursor: pointer;\n}\n#toast-container > .toast-info {\n  background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGwSURBVEhLtZa9SgNBEMc9sUxxRcoUKSzSWIhXpFMhhYWFhaBg4yPYiWCXZxBLERsLRS3EQkEfwCKdjWJAwSKCgoKCcudv4O5YLrt7EzgXhiU3/4+b2ckmwVjJSpKkQ6wAi4gwhT+z3wRBcEz0yjSseUTrcRyfsHsXmD0AmbHOC9Ii8VImnuXBPglHpQ5wwSVM7sNnTG7Za4JwDdCjxyAiH3nyA2mtaTJufiDZ5dCaqlItILh1NHatfN5skvjx9Z38m69CgzuXmZgVrPIGE763Jx9qKsRozWYw6xOHdER+nn2KkO+Bb+UV5CBN6WC6QtBgbRVozrahAbmm6HtUsgtPC19tFdxXZYBOfkbmFJ1VaHA1VAHjd0pp70oTZzvR+EVrx2Ygfdsq6eu55BHYR8hlcki+n+kERUFG8BrA0BwjeAv2M8WLQBtcy+SD6fNsmnB3AlBLrgTtVW1c2QN4bVWLATaIS60J2Du5y1TiJgjSBvFVZgTmwCU+dAZFoPxGEEs8nyHC9Bwe2GvEJv2WXZb0vjdyFT4Cxk3e/kIqlOGoVLwwPevpYHT+00T+hWwXDf4AJAOUqWcDhbwAAAAASUVORK5CYII=\") !important;\n}\n#toast-container > .toast-error {\n  background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHOSURBVEhLrZa/SgNBEMZzh0WKCClSCKaIYOED+AAKeQQLG8HWztLCImBrYadgIdY+gIKNYkBFSwu7CAoqCgkkoGBI/E28PdbLZmeDLgzZzcx83/zZ2SSXC1j9fr+I1Hq93g2yxH4iwM1vkoBWAdxCmpzTxfkN2RcyZNaHFIkSo10+8kgxkXIURV5HGxTmFuc75B2RfQkpxHG8aAgaAFa0tAHqYFfQ7Iwe2yhODk8+J4C7yAoRTWI3w/4klGRgR4lO7Rpn9+gvMyWp+uxFh8+H+ARlgN1nJuJuQAYvNkEnwGFck18Er4q3egEc/oO+mhLdKgRyhdNFiacC0rlOCbhNVz4H9FnAYgDBvU3QIioZlJFLJtsoHYRDfiZoUyIxqCtRpVlANq0EU4dApjrtgezPFad5S19Wgjkc0hNVnuF4HjVA6C7QrSIbylB+oZe3aHgBsqlNqKYH48jXyJKMuAbiyVJ8KzaB3eRc0pg9VwQ4niFryI68qiOi3AbjwdsfnAtk0bCjTLJKr6mrD9g8iq/S/B81hguOMlQTnVyG40wAcjnmgsCNESDrjme7wfftP4P7SP4N3CJZdvzoNyGq2c/HWOXJGsvVg+RA/k2MC/wN6I2YA2Pt8GkAAAAASUVORK5CYII=\") !important;\n}\n#toast-container > .toast-success {\n  background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAADsSURBVEhLY2AYBfQMgf///3P8+/evAIgvA/FsIF+BavYDDWMBGroaSMMBiE8VC7AZDrIFaMFnii3AZTjUgsUUWUDA8OdAH6iQbQEhw4HyGsPEcKBXBIC4ARhex4G4BsjmweU1soIFaGg/WtoFZRIZdEvIMhxkCCjXIVsATV6gFGACs4Rsw0EGgIIH3QJYJgHSARQZDrWAB+jawzgs+Q2UO49D7jnRSRGoEFRILcdmEMWGI0cm0JJ2QpYA1RDvcmzJEWhABhD/pqrL0S0CWuABKgnRki9lLseS7g2AlqwHWQSKH4oKLrILpRGhEQCw2LiRUIa4lwAAAABJRU5ErkJggg==\") !important;\n}\n#toast-container > .toast-warning {\n  background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGYSURBVEhL5ZSvTsNQFMbXZGICMYGYmJhAQIJAICYQPAACiSDB8AiICQQJT4CqQEwgJvYASAQCiZiYmJhAIBATCARJy+9rTsldd8sKu1M0+dLb057v6/lbq/2rK0mS/TRNj9cWNAKPYIJII7gIxCcQ51cvqID+GIEX8ASG4B1bK5gIZFeQfoJdEXOfgX4QAQg7kH2A65yQ87lyxb27sggkAzAuFhbbg1K2kgCkB1bVwyIR9m2L7PRPIhDUIXgGtyKw575yz3lTNs6X4JXnjV+LKM/m3MydnTbtOKIjtz6VhCBq4vSm3ncdrD2lk0VgUXSVKjVDJXJzijW1RQdsU7F77He8u68koNZTz8Oz5yGa6J3H3lZ0xYgXBK2QymlWWA+RWnYhskLBv2vmE+hBMCtbA7KX5drWyRT/2JsqZ2IvfB9Y4bWDNMFbJRFmC9E74SoS0CqulwjkC0+5bpcV1CZ8NMej4pjy0U+doDQsGyo1hzVJttIjhQ7GnBtRFN1UarUlH8F3xict+HY07rEzoUGPlWcjRFRr4/gChZgc3ZL2d8oAAAAASUVORK5CYII=\") !important;\n}\n#toast-container.toast-top-center > div,\n#toast-container.toast-bottom-center > div {\n  width: 300px;\n  margin-left: auto;\n  margin-right: auto;\n}\n#toast-container.toast-top-full-width > div,\n#toast-container.toast-bottom-full-width > div {\n  width: 96%;\n  margin-left: auto;\n  margin-right: auto;\n}\n.toast {\n  background-color: #030303;\n}\n.toast-success {\n  background-color: #51a351;\n}\n.toast-error {\n  background-color: #bd362f;\n}\n.toast-info {\n  background-color: #2f96b4;\n}\n.toast-warning {\n  background-color: #f89406;\n}\n\n.toast-progress {\n  position: absolute;\n  left: 0;\n  bottom: 0;\n  height: 4px;\n  background-color: #000000;\n  opacity: 0.4;\n  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=40);\n  filter: alpha(opacity=40);\n}\n\n/*Responsive Design*/\n@media all and (max-width: 240px) {\n  #toast-container > div {\n    padding: 8px 8px 8px 50px;\n    width: 11em;\n  }\n  #toast-container .toast-close-button {\n    right: -0.2em;\n    top: -0.2em;\n  }\n}\n@media all and (min-width: 241px) and (max-width: 480px) {\n  #toast-container > div {\n    padding: 8px 8px 8px 50px;\n    width: 18em;\n  }\n  #toast-container .toast-close-button {\n    right: -0.2em;\n    top: -0.2em;\n  }\n}\n@media all and (min-width: 481px) and (max-width: 768px) {\n  #toast-container > div {\n    padding: 15px 15px 15px 50px;\n    width: 25em;\n  }\n}\n"
  }
]