[
  {
    "path": ".gitignore",
    "content": "node_modules/"
  },
  {
    "path": ".travis.yml",
    "content": "language: node_js\nnode_js:\n  - 0.10"
  },
  {
    "path": "CONTRIBUTING.md",
    "content": "Questions belong to StackOverflow\n=====\n\nGitHub is for issues and feature requests. Anything else belongs to [StackOverflow](http://stackoverflow.com/questions/ask?tags=skrollr).\n\nPull requests\n=====\n\nWill be ignored if the Travis build fails. Install grunt and run `grunt jshint qunit` locally before submitting pull requests.\n\nDo not include build files in your pull request (e.g. `skrollr.min.js`).\n\nDo not change the version number in your pull request.\n\nDo not try to fix multiple issues or add multiple features with a single pull request. A pull request should only do one thing."
  },
  {
    "path": "Gruntfile.js",
    "content": "module.exports = function(grunt) {\n\t//Configuration.\n\tgrunt.initConfig({\n\t\tpkg: grunt.file.readJSON('package.json') ,\n\t\tjshint: {\n\t\t\toptions: {\n\t\t\t\tsmarttabs: false,\n\t\t\t\tcurly: true,\n\t\t\t\timmed: true,\n\t\t\t\tlatedef: true,\n\t\t\t\tnoarg: true,\n\t\t\t\tquotmark: 'single',\n\t\t\t\tundef: true,\n\t\t\t\tunused: true,\n\t\t\t\tstrict: true,\n\t\t\t\ttrailing: true,\n\t\t\t\tglobals: {\n\t\t\t\t\twindow: true,\n\t\t\t\t\tdocument: true,\n\t\t\t\t\tnavigator: true,\n\t\t\t\t\tdefine: true,\n\t\t\t\t\tmodule: true\n\t\t\t\t}\n\t\t\t},\n\t\t\tall: ['src/**/*.js']\n\t\t},\n\t\tqunit: {\n\t\t\tall: ['test/index.html', 'test/loading.html']\n\t\t},\n\t\tuglify: {\n\t\t\toptions: {\n\t\t\t\tbanner: '/*! skrollr <%= pkg.version %> (<%= grunt.template.today(\"yyyy-mm-dd\") %>) | Alexander Prinzhorn - https://github.com/Prinzhorn/skrollr | Free to use under terms of MIT license */\\n'\n\t\t\t},\n\n\t\t\tall: {\n\t\t\t\tfiles: {\n\t\t\t\t\t'dist/skrollr.min.js': 'src/skrollr.js'\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n\n\t//Dependencies.\n\tgrunt.loadNpmTasks('grunt-contrib-jshint');\n\tgrunt.loadNpmTasks('grunt-contrib-qunit');\n\tgrunt.loadNpmTasks('grunt-contrib-uglify');\n\n\t//Tasks.\n\tgrunt.registerTask('default', ['jshint', 'qunit', 'uglify']);\n\tgrunt.registerTask('travis', ['jshint', 'qunit']);\n};"
  },
  {
    "path": "HISTORY.md",
    "content": "0.6.30 (2015-06-19)\n-------------------\n\n* Respect result of beforerender callback on mobile (#717)\n* Allow for a duration of 0 when scrolling (#720)\n\n0.6.29 (2014-11-17)\n-------------------\n\n* Make the ID of `skrollr-body` configurable (#592)\n\n0.6.28 (2014-11-15)\n-------------------\n\n* In cases where skrollr-body has a height other than `auto` the height of its content is now correctly calculated. This should solve many issues on mobile where scrolling got stock before reaching the bottom (#633)\n\n0.6.27 (2014-09-28)\n-------------------\n\n* Fixed AMD module definition (#609)\n\n0.6.26 (2014-06-08)\n-------------------\n\n* Fixed easing functions not working when animating attributes (#533)\n\n0.6.25 (2014-05-22)\n-------------------\n\n* CommonJS (#519).\n\n0.6.24 (2014-04-25)\n-------------------\n\n* Fixed some issue with forceHeight (#347).\n* Fixed a regression caused by #486 breaking IE 8 (#494).\n* Added support for animating attributes (#204).\n\n0.6.23 (2014-04-18)\n-------------------\n\n**note**: This particular version is broken in IE!\n\n* Experimental support for emitting events when the scrolling passes a keyframe (check out the docs for `keyframe` option/event).\n* When using `refresh`, make sure elements which do not longer have keyframes get properly cleaned up (#486).\n* Fixed `refresh` not accepting `NodeList`s (#435).\n* Expose the status of mobile mode as `isMobile()` function (#488).\n\n0.6.22 (2014-02-21)\n-------------------\n\n* Experimental AMD support (#409). Please read the documentation about it.\n\n0.6.21 (2014-01-06)\n-------------------\n\n* Disabled mobile mode on Windows Phone, since it's not needed there (#408).\n\n0.6.20 (2014-01-03)\n-------------------\n\n* Fixed broken percentage constants.\n\n0.6.19 (2014-01-02)\n-------------------\n\n* Constants can now be defined as functions or percentage offsets (#148, #404).\n\n**breaking**: When using a constant of value `100` together with percentage offsets like `data-_foo-75p`,\nthe value was implicitly handled as percentage value `100p`. Starting with this version you need to explcitly use `100p` if you want percentage constants.\nOn the plus side, you can now mix an absolute constant with a percentage keyframe or a percentage constant with an absolute keyframe.\n\n0.6.18 (2013-12-18)\n-------------------\n\n* Fixed scrolling on input elements (#397).\n\n0.6.17 (2013-10-19)\n------\n\n* Fixed keyboard not appearing on some mobile browsers when an input was focused (#349).\n\n0.6.16 (2013-10-18)\n------\n\n* Fixed `z-index:auto;` not working because it was always coerced to an integer (#351).\n\n0.6.15 (2013-10-03)\n------\n\n* Fixed clicking on links (and other elements) on mobile (#263, #303, #338).\n* Added `getMaxScrollTop` method (#238).\n\n0.6.14 (2013-10-03)\n------\n\n* Fixed the `direction` parameter that's passed to the render events (#339).\n\n0.6.13 (2013-09-29)\n-----\n\n* Added support for percentage offsets (#185).\n\n0.6.12 (2013-09-17)\n-----\n\n* Added `destroy` method (#109).\n\n0.6.11 (2013-08-13)\n-----\n\n* Made the mobile deceleration configurable and lowered the default (#222, #229).\n\n0.6.10 (2013-07-30)\n-----\n\n* Fixed bug which caused IE to perform an endless loop (#271).\n\n0.6.9 (2013-07-01)\n-----\n\n* Improved overall performance for mobile (#249).\n\n0.6.8 (2013-06-17)\n-----\n\n* Added a new option `smoothScrollingDuration`.\n\n0.6.7 (2013-06-17)\n-----\n\n* Changed the default value of `edgeStrategy` from `ease` to `set`. There are too many cases where `ease` was not wanted and unexpected.\n\n0.6.6 (2013-06-05)\n-----\n\n* Fixed IE plugin not working. This was caused by assigning `skrollr.setStyle` to a local variable inside the skrollr core. Since the IE plugin monkey-patches the skrollr.setStyle function, the core didn't notice the change (#199 comment 18986949).\n\n0.6.5 (2013-05-22)\n-----\n\n* Fixed crash in IE < 9 because the detected prefix was `null` (#220).\n\n0.6.4 (2013-05-21)\n-----\n\n* Fixed that some elements got the `skrollable-before` **and** `skrollable-after` class at the same time.\n\n0.6.3 (2013-05-19)\n-----\n\n* When resizing the browser, the scroll position was reset to 0 (#217)\n\n0.6.2 (2013-05-18)\n-----\n\n* When resizing the browser, `forceHeight` was colliding with the already forced height (#216).\n\n0.6.1 (2013-05-18)\n-----\n\n* Allow numbers inside of easing function names (#152).\n\n0.6.0 (2013-05-18)\n-----\n\n**Expect things to break when coming from 0.5! Read through the changelog. Migration is not hard.**\n\n* **[breaking]** There's no more `skrollr.mobile.js` file. You only need `skrollr.js`. You no longer need to conditionally include `skrollr.mobile.js`.\n* You can configure how skrollr detects mobile browsers using the `mobileCheck` option (check out the documentation).\n* **[possibly breaking]** The meaning of the `#skrollr-body` element changed. Put all static elements inside of it and all absolute/fixed elements outside. It doesn't need to be the first child of the body anymore.\n* **[breaking]** The `rendered` and `unrendered` classes where renamed because they were confusing and wrong. They're now called `skrollable-before` and `skrollable-after`, because that's their meaning (the element with these classes is before/after the first/last keyframe).\n\t* Added a new class `skrollable-between`, because symmetry. That's why.\n* Easing functions are now applied when exactly at a keyframe (#132).\n* **[possibly breaking]** The behavior changed for the case when the scroll position is before/after the first/last keyframe (I'm just gonna use \"before first\" from now on, because \"after last\" is analog). In 0.5 the behavior was not exactly specified and buggy (see item above regarding #132). Skrollr was applying the styles of the first keyframe to the element for all scroll position that were before the first keyframe. E.g. when `data-100=\"top:200px;\"` was the first keyframe, the element had `top:200px;` at all scroll positions before (all from `0` to `99`). From now on you can specify the behavior you want (see `edgeStrategy` option for details, set it to `set` for old behavior). **Note: 0.6.7 and up use `set` as default.**\n\n\n0.5.14\n-----\n\n* Add a `skrollr-mobile` class to the html element when the mobile script is included.\n\n0.5.13 (2013-02-08)\n-----\n\n* #131: Use a cross browser approach for getting the body scroll-height.\n* #133: Use the maximum of document height or the max keyframe for edge cases where absolute keyframes are used in a relative-mode-like document and `data-end` was calculated wrong.\n\n0.5.12 (2013-02-08)\n-----\n\n* #121: Fixed prefix detection in Safari.\n\n0.5.11 (2013-01-18)\n-----\n\n* #126: When calling refresh(), force rerendering, even if the scrollbar didn't move.\n\n0.5.10\n-----\n\n* #104: Fixed the most annoying bug on mobile. There was a large blank space at the bottom of the page.\n\n0.5.9\n-----\n\n* #118: Fixed broken prefix detection. Was broken all the time, but worked before Firefox 18.\n\n0.5.8 (2013-01-12)\n-----\n\n* #116 + #117: SVG support was broken for relative mode.\n\n0.5.7\n-----\n\n* #103: skrollr no longer depends on being added to the bottom of the document.\n\n0.5.6\n-----\n\n* #105: Fixed inconsistent behaviour for adding `rendered` and `unrendered` class on page load\n\n0.5.5\n-----\n\n* #100: Fixed relative-mode not working correctly in IE < 9 due to crippled getBoundingClientRect\n\n0.5.4 (2012-11-18)\n-----\n\n* #80: When resizing the browser window the calculation of relative mode was wrong when the element's vertical position was changed before.\n\n0.5.3\n-----\n\n* #66: Make IE 7 support a light version of `data-anchor-target` by mapping `querySelector` to `getElementById`.\n\n0.5.2\n-----\n\n* #78: Fixed that new parser didn't allowed omitting the last semicolon in a keyframe property list.\n\n0.5.1 (2012-10-29)\n-----\n\n* Fixed `setScrollTop` and `animateTo` not working because iScroll uses negative offset.\n\n0.5.0 (2012-10-09)\n-----\n\n* *breaking* the `plugin` api has been removed (the IE plugin has been updated to a new, hidden api).\n* Full mobile support using iscroll.\n* #73: Fixed parser to not mess up colons inside URLs\n* #74: Fixed parser to not treat single periods as decimal numbers\n* #76: Fixed dummy element overlaping the content, even though it should be unobtrusive\n\n0.4.13\n-----\n\n* #58: `forceHeight` now handles relative mode like a boss.\n* #59: Make `scale` option only affect absolute mode.\n\n0.4.12\n-----\n\n* #64: Setting `float` property using JavaScript didn't work across browser. Now using `styleFloat` and `cssFloat` properties.\n\n0.4.11 (2012-09-17)\n-----\n\n* The `scale` option does not affect `constants`.\n\n0.4.10\n-----\n\n* Allow smooth scrolling on element level using `data-smooth-scrolling`\n\n0.4.9\n-----\n\n* Added experimental smooth scrolling (no more CSS transitions. WORKS IN IE.).\n\n0.4.8\n-----\n\n* Added `stopAnimateTo` method.\n\n0.4.7\n-----\n\n* Updated the requestAnimationFrame polyfill for smoother animations\n* Updated the way requestAnimationFrame is used for even smoother animations\n\n0.4.6\n-----\n\n* New method `relativeToAbsolute` which was formerly private\n* New method `isAnimatingTo` to check if an animation caused by `animateTo` is running\n* Added `sqrt` easing function\n\n0.4.5\n-----\n\n* Experimental mobile support using https://github.com/zynga/scroller\n\n0.4.4\n-----\n\n* A `skrollr` class is added to the HTML element and a `no-skrollr` class is removed when `init` is called. Useful for fallback styling.\n\n0.4.3 (2012-08-02)\n-----\n\n* Added new feature \"constants\".\n\n0.4.2 (2012-07-26)\n-----\n\n* Added new feature \"anchor-target\" which allows elements to react to other elements leaving/entering the viewport.\n\n0.4.1 (2012-07-25)\n-----\n\n* Fixed a bug which broke skrollr in IE caused by wrong regular expression behavior\n\n0.4.0 (2012-07-22)\n-----\n\n* *breaking* the `data-end-[offset]` syntax changed. It's now `data-[offset]-end`.\n* Fixed a bug where white spaces between style declarations were not ignored.\n* Added support for anchors. Animations can now be specified relative to the elements position within the viewport.\n* Added support for SVG elements.\n* Added new method `refresh()`."
  },
  {
    "path": "LICENSE.txt",
    "content": "The MIT License\n\nCopyright (c) 2012-2014 Alexander Prinzhorn (@Prinzhorn)\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\nall copies 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\nTHE SOFTWARE.\n"
  },
  {
    "path": "README.md",
    "content": "[![Build Status](https://secure.travis-ci.org/Prinzhorn/skrollr.png)](http://travis-ci.org/Prinzhorn/skrollr)\n\nPlease note:\n============\n\n**skrollr hasn't been under active development since about September 2014** (check out the contributions graphs on https://github.com/Prinzhorn/skrollr/graphs/contributors) and I don't have any plans for doing major changes to it. Please consider this before using skrollr in production as problems with new browser versions, especially on mobile, will most definitely surface. To be honest, mobile support always sucked (because mobile browsers are hard) and you shouldn't compromise UX for some fancy UI effects. Ever.\n\nskrollr 0.6.30\n==============\n\nStand-alone **parallax scrolling** JavaScript library for **mobile (Android, iOS, etc.) and desktop** in about 12k minified.\n\nDesigner friendly. No JavaScript skills needed. Just plain CSS and HTML.\n\n_Actually, skrollr is much more than \"just\" **parallax scrolling**. It's a full-fledged scrolling animation library. In fact, you can use it and still have no parallax scrolling at all. But I wanted to sound hip and use some buzz-words. By the way, skrollr leverages HTML5 and CSS3 ;-)_\n\nResources\n=====\n\nPlugins\n-----\n\n### Official\n\n* [skrollr-menu](https://github.com/Prinzhorn/skrollr-menu) - Hash navigation\n* [skrollr-ie](https://github.com/Prinzhorn/skrollr-ie) - IE < 9 CSS fixes\n* [skrollr-stylesheets](https://github.com/Prinzhorn/skrollr-stylesheets) - Keyframes inside CSS files\n\n### Third party\n\n* [skrollr-colors](https://github.com/FezVrasta/skrollr-colors) - Mix and match hex, rgb and hsl colors.\n* [skrollr-decks](https://github.com/TrySound/skrollr-decks) - Fullpage presentation decks.\n\nIn the wild\n-----\n\nCheck out the [wiki page](https://github.com/Prinzhorn/skrollr/wiki/In-the-wild) for websites using skrollr and feel free to add your own website :). You can also shamelessly add yourself to the list [here](https://github.com/Prinzhorn/skrollr/wiki/Agencies-and-freelancers) if you are offering paid skrollr support.\n\nFurther resources (tutorials etc.)\n-----\n\nMoved to the [wiki](https://github.com/Prinzhorn/skrollr/wiki/Resources).\n\n\nDocumentation\n=====\n\nFirst of all: look at the [examples and read the source ;-)](https://github.com/Prinzhorn/skrollr/tree/master/examples). This might give you a feeling of how stuff works and you can see how some patterns can be implemented.\n\nAbstract\n------\n\nskrollr allows you to animate any CSS property of any element depending on the horizontal scrollbar position. All you need to do is define key frames for each element at certain points in top scroll offset.\n\nOther libraries require you to write JavaScript in order to define your animations. This introduces two main problems:\n\n* Animation and element are not at one place. In order to find out if any animations are defined for a given element, you have to scroll through many (sometimes thousands) of lines of JavaScript.\n* You have to learn a new syntax which is often very verbose and limited at the same time.\n\nWith skrollr, you put the definition of your key frames right where they belong (to the element) using a syntax you already know (plain CSS).\n\nIf you would rather have the keyframes inside a separate file, take a look at [skrollr-stylesheets](https://github.com/Prinzhorn/skrollr-stylesheets).\n\nIf you prefer to use JavaScript to define your animations make sure to take a look at [ScrollMagic](https://github.com/janpaepke/ScrollMagic). It depends on both jQuery and the Greensock Animation Platform (GSAP) and gives you full control over every detail of your animations.\n\nLet's get serious\n------\n\nFirst of all you want to include the `skrollr.min.js` file at the bottom of your document (right before the closing `</body>`) and then call `skrollr.init()`. Or you can place it inside the `<head>` if you want to, but make sure to call `init()` once the document has been loaded (e.g. jQuery's `ready` event or even `window.onload`).\n\n```html\n\t<script type=\"text/javascript\" src=\"skrollr.min.js\"></script>\n\t<script type=\"text/javascript\">\n\tvar s = skrollr.init();\n\t</script>\n</body>\n```\n\nIf you are using require.js to structure your project, you can use skrollr as a module as well.\n\n```javascript\nrequire(['skrollr'], function(skrollr){\n\tvar s = skrollr.init();\n});\n```\n\nIf you're familiar with CSS, you already know the `style` attribute. In order to create an animation you would need several, at least two, of them. That's what skrollr does. You use the HTML5 `data-` attributes to define multiple sets of styles (we call each of them **keyframe**) and skrollr interpolates between them.\n\n#### Let's change the background-color of a `div` starting at `#00f` when the scrollbar is at the top and ending with `#f00` when the user scrolled 500 pixels down\n\n```html\n<div data-0=\"background-color:rgb(0,0,255);\" data-500=\"background-color:rgb(255,0,0);\">WOOOT</div>\n```\n[View in browser](http://prinzhorn.github.io/skrollr/examples/docu/1.html)\n\n##### Lessons learned\n\n* Skrollr ensures that you can actually scroll down 500 pixels or more, even if there's not enough content. You can suppress this by using the `forceHeight` option.\n* You can't use `#00f` or `#0000ff`. You need to use `rgb` or `hsl` and explicitly decide which color space you want because they result in different animations (HSL is much cooler most of the time). Don't worry, the IE plugin teaches IE < 9 to display `rgb` and `hsl` correctly.\n\n#### Now let's do a barrel roll at the same time\n\n```html\n<div data-0=\"background-color:rgb(0,0,255);transform:rotate(0deg);\" data-500=\"background-color:rgb(255,0,0);transform:rotate(360deg);\">WOOOT</div>\n```\n[View in browser](http://prinzhorn.github.io/skrollr/examples/docu/2.html)\n\n##### Lessons learned\n\n* Skrollr handles all these nasty CSS prefixes for you. Just -moz-relax and get yourself a cup of -webkit-coffee.\n\n#### Now let the rotation bounce like it were a hip-hop video\n\n```html\n<div data-0=\"background-color:rgb(0,0,255);transform[bounce]:rotate(0deg);\" data-500=\"background-color:rgb(255,0,0);transform[bounce]:rotate(360deg);\">WOOOT</div>\n```\n[View in browser](http://prinzhorn.github.io/skrollr/examples/docu/3.html)\n\n#### Lessons learned\n\n* Skrollr allows non-linear animations. The so called *easing functions* can be used per-property by putting them in square brackets behind the property. There's a built-in list of easing functions (see below in the [JavaScript](#javascript) section) and you can use your own functions by using the `easings` options.\n\nNow you may have noticed that using `500` as a keyframe position is kind of random and the look depends on your browser size.\n\n#### Let's have the animation end when the top of the element reaches the top of the viewport (element leaves the viewport)\n\n```html\n<div data-0=\"background-color:rgb(0,0,255);transform[bounce]:rotate(0deg);\" data-top=\"background-color:rgb(255,0,0);transform[bounce]:rotate(360deg);\">WOOOT</div>\n```\n[View in browser](http://prinzhorn.github.io/skrollr/examples/docu/4.html)\n\n##### Lessons learned\n\n* Skrollr keyframes can either be [absolute](#absolute-mode-or-document-mode) or [relative](#relative-mode-or-viewport-mode).\n\nThat's the end of this short intro. The following sections will explain some more things in detail.\n\nIf you're not a fan of `data-attributes` or if you're planning a big website where you want a better and more flexible structure, take a look at [skrollr-stylesheets](https://github.com/Prinzhorn/skrollr-stylesheets).\n\nMobile support\n-----\nStarting with version 0.5.0 skrollr officially supports mobile browsers including Android and iOS. Furthermore, mobile support has been rewritten from scratch for skrollr 0.6.0.\n\n### The Problem with mobile and the solution\n\n(If you're not interested in the details, just scroll down a bit to see what you need to do for mobile support.)\n\nSome words on why this is an important milestone and why others failed: Mobile browsers try to save battery wherever they can. That's why mobile browsers delay the execution of JavaScript while you are scrolling. iOS in particular does this very aggressively and completely stops JavaScript. In short, that's the reason why many scrolling libraries either don't work on mobile devices or they come with their own scrollbar which is a usability nightmare on desktop. It was an important requirement while I developed skrollr that I don't force you to scroll the way I want it. skrollr on desktop uses a native scrollbar and you can scroll the way you want to (keyboard, mouse, etc.).\n\nYou just told me it doesn't work on mobile, but why does it? The answer is simple. When using skrollr on mobile you don't actually scroll. When detecting a mobile browser, skrollr disables native scrolling and instead listens for touch events and moves the content (more specific the `#skrollr-body` element) using CSS transforms.\n\n### What you need in order to support mobile browsers\n\nStarting with skrollr 0.6.0 there's just one thing you need to do: Include an element on your page with the id `skrollr-body`. That's the element we move in order to fake scrolling. The only case where you don't need a `#skrollr-body` is when using `position:fixed` exclusively. In fact, the skrollr website doesn't include a `#skrollr-body` element. If you need both fixed and non-fixed (i.e. static) elements, put the static ones inside the `#skrollr-body` element.\n\nOr to put it differently: On mobile the `skrollr-body` element is moved using CSS transforms. You can't have `position:fixed` or `background-attachment:fixed` inside elements which use CSS transforms as per CSS spec (http://meyerweb.com/eric/thoughts/2011/09/12/un-fixing-fixed-elements-with-css-transforms/). That's why those elements need to be **outside** of the `skrollr-body` element.\n\nThe `skrollr-body` element might be configured within the [init-options](#skrollrinitoptions).\n\nAMD\n---\n\nStarting with `0.6.22` there's experimental AMD support. Please note that only skrollr core has AMD support so far. We will update the plugins in the future.\n\n```js\nrequire(['skrollr'], function(skrollr){\n\tskrollr.init();\n});\n```\n\nAbsolute vs relative mode\n-----\n\nBeing only able to define key frames in absolute values is simply insufficient for some cases. For example, if you don't know exactly where an element will be in the document. That's why there are two modes for key frames, namely `absolute` and `relative` mode.\n\n### absolute mode (or document mode)\n\nThe key frames are defined as absolute values describing how much the **document** has been scrolled down.\n\nThe syntax is `data-[offset]-[anchor]`, where `offset` can be any integer (0 is default) and `anchor` can be either `start` (default) or `end`. Either `offset` or `anchor` can be omitted in some situations. Here are some examples of key frames and their meaning.\n\n* `data-0` = `data-start` = `data-0-start`: When the scroll top is 0.\n* `data-100` = `data-100-start`: When the scroll top is 100.\n* `data--100` = `data--100-start`: When the scroll top is -100 (sounds like nonsense, but keep in mind that interpolation will be relative to this point).\n* `data-end` = `data-0-end`: When offset is 0, but counting from the bottom of the document instead of from the top. In short: when you reach the bottom of the page.\n* `data-100-end`: 100px before we reach the bottom.\n* `data--100-end`: 100px after we reach the bottom (again, it's up to you whether you need it).\n\n### relative mode (or viewport mode)\n\nInstead of defining key frames relative to the **document** (i.e. absolute), we are able to define them depending on the position of any element in relation to the **viewport**.\n\nThe syntax is `data-[offset]-(viewport-anchor)-[element-anchor]`, where `offset` can again be any integer and defaults to 0. Both `viewport-anchor` (mandatory) and `element-anchor` (optional) can be one of `top`, `center` or `bottom`. If `element-anchor` is omitted, the value of `viewport-anchor` will be taken (just like with background-position). Here are some examples of key frames and their meaning.\n\n* `data-top` = `data-0-top` = `data-top-top` = `data-0-top-top`: When the element's top is aligned with the top of the viewport.\n* `data-100-top` = `data-100-top-top`: When the element's top is 100px above the top of the viewport.\n* `data--100-top` = `data--100-top-top`: When the element's top is 100px below the top of the viewport.\n* `data-top-bottom `= `data-0-top-bottom`: When the bottom of the element is at the top of the viewport (it's just not visible).\n* `data-center-center` = `data-0-center-center`: When the element is at the center of the viewport.\n* `data-bottom-center` = `data-0-bottom-center`: When the element's center is at the bottom of the viewport, thus the upper half of the element is visible.\n\nBy default the keyframes are triggered by the position of the element where the keyframes are described.  However there are times when the position of a second element should trigger the first element's keyframes.  The  `data-anchor-target` attribute can be used in these cases.  The `data-anchor-target` attribute accepts any CSS selector and the position of the first element on the page matching the selector will be used to trigger keyframes on the element where the attribute is defined. `data-anchor-target` requires IE 8 or greater.\n\nExamples: `<div `data-anchor-target=\"#foo\"`>`  will have it's keyframes tiggered by  the position of the `#foo element`.  Any CSS selector can be used, i.e  `data-anchor-target=\".bar:not(.bacon) ~ span > a[href]\"`\n\n**Note**: If you need to support IE 7, then you may only use IDs as `anchor-target`s, i.e. `#foo`. The IE plugin maps `querySelector` to `getElementById`.\n\nHere's an infographic for better understanding of anchors (click to open PDF):\n\n[![Anchors Guide](https://raw.github.com/Prinzhorn/skrollr/master/guide/anchor-position-guide.png)](https://raw.github.com/Prinzhorn/skrollr/master/guide/anchor-position-guide.pdf)\n\n**Important**: All those values will be calculated up-front and transformed to `absolute` mode. So if either the element's box height changes (height, padding, border) or the elements position within the document, you probably need to call `refresh()` (see documentation in JavaScript section below). **Window resizing is handled by skrollr.**\n\n\nPercentage offsets\n------------------\n\nAll offsets shown above are given in absolute pixel values, e.g. `data-300` for `300px` from the top or `data-13-top-bottom` for a `13px` offset to the `top-bottom` anchor. As of skrollr `0.6.13` you can also have offsets as percentages of the viewport by appending a `p` to the number. For example `data-75p` for when you scrolled down `75%` of the viewport or `data-10p-center` to have a `10%` offset from the `center` anchor.\n\n\nHash navigation\n-----\n\nCheck out the [skrollr-menu](https://github.com/Prinzhorn/skrollr-menu) plugin.\n\nWorking with constants\n-----\n\nI was lying to you. The syntax for absolute mode is not `data-[offset]-[anchor]` and for relative mode it's not `data-[offset]-(viewport-anchor)-[element-anchor]`. In both cases, `offset` can be preceded by a constant which can be passed to the `init` method. The name of the constant needs to be preceded with an underscore.\n\nExample:\n\n```js\nskrollr.init({\n\tconstants: {\n\t\tfoobar: 1337\n\t}\n});\n```\n\n```html\n<div data-_foobar=\"left:0%;\" data-_foobar--100=\"left:50%;\" data-_foobar-100=\"left:100%;\"></div>\n\n<!--Equal to-->\n\n<div data-1337=\"left:0%;\" data-1237=\"left:50%;\" data-1437=\"left:100%;\"></div>\n```\n\nValid characters for a constant are `[a-z0-9_]`.\n\nDynamic constants\n-----------------\n\nStarting with skrollr `0.6.19` the word \"constants\" doesn't quite fit anymore, but who cares.\n\nYou can now use functions and percentages as constants. They are automatically evaluated when the window is resized or if you call `refresh`.\n\n```js\nskrollr.init({\n\tconstants: {\n\t\tfoo: function() {\n\t\t\t//Note: you can access the skrollr instance with `this` for things like `this.relativeToAbsolute`\n\t\t\treturn Math.random() * 100;//trolololol\n\t\t},\n\t\tvh: '100p'\n\t}\n});\n```\n\nCSS classes\n-----\n\nskrollr will add a `skrollr` class to the `HTML` element when calling `init` and will remove a `no-skrollr` class if present. Additionally, it will add a `skrollr-desktop` or `skrollr-mobile` class depending on which it detects. This allows fallback CSS rules to create a good user experience on unsupported devices or when JavaScript or skrollr are disabled.\n\nAll elements under skrollr's control (elements with appropriate data-attributes) will get the `skrollable` class. In addition, we add either the `skrollable-before`, `skrollable-between` **or** `skrollable-after` class, depending on whether the current scroll position is before, between or after the first/last (smallest/largest) keyframe of an element.\n\nAnimating attributes\n--------------------\n\nStarting with skrollr 0.6.24 you can also animate attribute and not just style properties. This is especially a big thing because in the SVG world many properties are implemented as attributes and not in CSS. Animating an attribute couldn't be simplier, just prefix the property with an `@` symbol!\n\n```html\n<polygon\n\tpoints='426,720   -200,720   -200,0   955,0'\n\tdata-0=\"@points:426,720   -200,720   -200,0   955,0\"\n\tdata-500=\"@points:380,720   -200,720   -200,0   1302,0\">\n</polygon>\n```\n\nNote: as always, skrollr doesn't do any magic. It doesn't understand what a polygon or points are. It's only interpolating numbers, that's it. So make sure you have the same number of numbers in your keyframes (8 in this case).\n\nFilling missing values\n-----\n\nImagine the following animation\n\n```html\n<div data-100=\"left:0%;\" data-200=\"top:0%;\" data-300=\"left:50%;\" data-400=\"top:50%;\"></div>\n```\n\nOne could expect `left` to have a value of `25%` at keyframe `200`. That is **not** the case. By design, skrollr only interpolates values between key frames which are direct **neighbors**. What actually happens is that skrollr internally fills out all holes once from left and then from right. So the above is equivalent to\n\n```html\n<div data-100=\"left:0%;top:0%;\" data-200=\"left:0%;top:0%;\" data-300=\"left:50%;top:0%;\" data-400=\"left:50%;top:50%;\"></div>\n```\n\nPreventing interpolation\n-----\n\nThe reason why skrollr is so lightweight and powerful is because it literally interpolates **every** number it can find. If you want to prevent some side effect, you can suppress interpolation for a specific value by prepending an exclamation point.\n\nExample:\n```html\n<!-- This will get your image url f***** up because there's no \"kitten1.4561799.jpg\" and the like -->\n<div data-0=\"background-image:url(kitten1.jpg);\" data-100=\"background-image:url(kitten2.jpg)\"></div>\n\n<!-- Better -->\n<div data-0=\"background-image:!url(kitten1.jpg);\" data-100=\"background-image:!url(kitten2.jpg)\"></div>\n```\n\n**Note:** The values for both keyframes (if they contain a number) need to be prefixed if you want to avoid skrollr throwing an exception at you!\n\nLimitations\n-----\n\nThere are some limitations of skrollr you should be aware of.\n\n* All numeric values have to have the same unit, even `0` needs a unit. It's not possible to animate from `5%` to `100px`. skrollr won't complain, but results are undefined.\n* Animations between values which are composed of multiple numeric values like `margin:0 0 0 0;` are only possible for the same number of values. `margin:0px 0px 0px 0px;` to `margin:0px 100px 50px 3px;` is fine, but not `margin:10px;` to `margin:5px 10px;`.\n* Animations between CSS transforms only work when they use the same functions in same order. From `rotate(0deg) scale(1)` to `rotate(1000deg) scale(5)` is fine.\n* Color animations don't support named values like \"red\" or hex values like \"#ff0000\". Instead, you have to use `rgb()`, `rgba()`, `hsl()` and `hsla()`. Don't worry, there's a skrollr plugin for IE < 9 to support `hsl()` (without \"a\"!) and to fall rgba back to rgb.\n* Color animations only work for same color functions. `hsl()` to `hsl()` or `hsla()` is fine, but not `rgb()` to `hsl()`. Which makes sense, because animating from the same colors in rgb space and in hsl space results in different animations (hsl gives you the nice rainbow stuff).\n\nBut feel free to send in a pull request to fix any of them. Just keep in mind that keeping skrollr as lightweight as possible has high priority.\n\nJavaScript\n====\n\nOn the JavaScript part there's not much to do (you can, if you want to!). So if you only know CSS and HTML, perfect.\n\nskrollr.init([options])\n-----\n\nAll there is to do is to call `skrollr.init([options]);` which returns an instance of the singleton skrollr class. Subsequent calls to `init()` will just return the same skrollr instance again.\n\nPossible options for `init()` are\n\n### smoothScrolling=true\n\nSmooth scrolling smoothens your animations. When you scroll down 50 pixels, the animations will transition instead of jumping to the new position.\n\nThe global setting can be overridden per element by setting `data-smooth-scrolling` to `on` or `off`.\n\n### smoothScrollingDuration=200\n\nThe number of milliseconds the animations run after the scroll position changed the last time.\n\n### constants={}\n\nAn object containing integers as values. The keys can contain `[a-z0-9_]`. They *do not* need a leading underscore.\n\nExample: `data-_myconst-200` and `skrollr.init({constants: {myconst: 300}})` result in `data-500`.\n\n### scale=1\n\nBy default, skrollr uses the largest key frame and makes document height + viewport height this high, thus the max possible scroll top offset. If your animation runs too fast or too slow, just adjust the scale value.\n\n`scale` only affects keyframes in absolute mode.\n\nWhen `forceHeight` is set to false, `scale` is ignored.\n\n`scale` affects `constants` as well.\n\n`scale` does only affect key frames in absolute mode, e.g. `data-500` but not `data-top`.\n\n###forceHeight=true\n\n`true`: Make sure the document is high enough that all key frames fit inside. Example: You use `data-1000`, but the content only makes the document 500px high. skrollr will ensure that you can scroll down the whole 1000px. Or if you use relative mode, e.g. `data-top-bottom`, skrollr will make sure the bottom of the element can actually reach the top of the viewport.\n\n`false`: Don't manipulate the document and just keep the natural scrollbar.\n\n###mobileCheck=function() {...}\n\nThis option allows you to pass a function to skrollr overwriting the check for mobile devices. The function should return `true` when mobile scrolling should be used and `false` if not.\n\nThe default looks like this\n\n```js\nfunction() {\n\treturn (/Android|iPhone|iPad|iPod|BlackBerry/i).test(navigator.userAgent || navigator.vendor || window.opera);\n}\n```\n\n### mobileDeceleration=0.004\n\nThe amount of deceleration for momentum scrolling on mobile devices. This options tells skrollr how fast or slow you want the scrolling to stop after the user lifted his finger.\n\nSet it to `1` to disable momentum scrolling.\n\n### skrollrBody='skrollr-body'\n\nThis option allows you to override the default id-selector used for supporting mobile browsers. It might come in handy when the element in question already has a assigned id or if you would like to define more then one skrollrBody depending on preceding JavaScript-logic.\n\n### edgeStrategy='set'\n\nThis option specifies how to handle animations when the scroll position is outside the range on the keyframes (i.e. before the first or after the last keyframe).\n\nOne of three options are possible\n\n* `set` _(default)_: When before/after the first/last keyframe, apply the styles of the first/last keyframe to the element.\n* `ease`: Same as set, but the values will be transformed using the given easing function.\n* `reset`: When before/after the first/last keyframe, apply the styles which the element had before skrollr did anything. This means resetting the class attribute as well as removing all styles which have been applied to the `style` property. This means the element won't have any `skrollable-*` CSS classes.\n\nExample:\n\nGiven the following element with two keyframes\n\n```html\n<div data-1000=\"left:0%;top:0%;\" data-2000=\"left:50%;top:100%;\" style=\"left:-100%;\" class=\"section\"></div>\n```\n\nand the following easing function which always returns `0.5` (I know it's pointless, but it's just an example. A real world example would be an easing function that represents a curve and starts somewhere between `0` and `1`, but not at `1`)\n\n```js\nfunction(p) {\n\treturn 0.5;\n}\n```\n\nand imagine the scrollbar is at `237`, which is below the first keyframe which is at `1000`.\n\n* `set` will result in `<div style=\"left:0%;top:0%;\" class=\"section skrollable skrollable-before\"></div>` which is plain `data-1000`.\n* `ease` will result in `<div style=\"left:25%;top:50%;\" class=\"section skrollable skrollable-before\"></div>` which is `0.5 * data-1000`.\n* `reset` will result in `<div style=\"left:-100%;\" class=\"section\"></div>` which is what the element originally had. Note how `top` is missing.\n\n\n### beforerender\n\nA listener function that gets called each time right before we render everything. The function will be passed an object with the following properties:\n\n```js\n{\n\tcurTop: 10, //the current scroll top offset\n\tlastTop: 0, //the top value of last time\n\tmaxTop: 100, //the max value you can scroll to. curTop/maxTop will give you the current progress.\n\tdirection: 'down' //either up or down\n}\n```\n\nReturning `false` will prevent rendering.\n\n### render\n\nA listener function that gets called right after we finished rendering everything. The function will be passed with the same parameters as `beforerender`.\n\nExample\n\n```js\nskrollr.init({\n\trender: function(data) {\n\t\t//Log the current scroll position.\n\t\tconsole.log(data.curTop);\n\t}\n});\n```\n\n### keyframe\n\n**Experimental**\n\nIn order to receive `keyframe` events from an element, add the `data-emit-events` attribute to the element. The keyframe function will be called with three arguments\n\n1. The `element` that passed the keyframe.\n2. The `name` of the keyframe, camel-cased (see example).\n3. The `direction` the user is scrolling.\n\nExample:\n\n```html\n<div\n\tdata-500=\"...\"\n\tdata-top-bottom=\"...\"\n\tdata-_offset-center=\"...\"\n\tdata-emit-events\n>\n\tSome content\n</div>\n```\n\n```js\nskrollr.init({\n\tkeyframe: function(element, name, direction) {\n\t\t//name will be one of data500, dataTopBottom, data_offsetCenter\n\t}\n});\n```\n\nNote: this is experimental, expect the API to change! Originally I wanted to emit the events right on the element, so you could do this\n\n```js\n//Wouldn't this be nice?\ndocument.querySelector('#foo').addEventListener('skrollr.dataTopBottom.up', function() {\n\t//#foo just passed the data-top-bottom keyframe while scrolling up\n}, false)\n```\n\nbut IE.\n\n### easing\n\nAn object defining new easing functions or overwriting existing ones. Easing functions get just one argument, which is a value between 0 and 1 (the percentage of how much of the animation is done). The function should return a value between 0 and 1 as well, but for some easings a value less than 0 or greater than 1 is just fine.\n\nAn easing function basically transforms the timeline for an animation. When the animation should be 50% done, you can transform it to be 90% done or whatever your function does.\n\nExample:\n\n```js\nskrollr.init({\n\teasing: {\n\t\t//This easing will sure drive you crazy\n\t\twtf: Math.random,\n\t\tinverted: function(p) {\n\t\t\treturn 1 - p;\n\t\t}\n\t}\n});\n```\n\nYou can now use the easing functions like any other.\n\nskrollr ships with some built in functions:\n\n* linear: The default. Doesn't need to be specified.\n* quadratic: To the power of two. So 50% looks like 25%.\n* cubic: To the power of three. So 50% looks like 12.5%\n* begin/end: They always return 0 or 1 respectively. No animation.\n* swing: Slow at the beginning and accelerates at the end. So 25% -> 14.6%, 50% -> 50%, 75% -> 85.3%\n* sqrt: Square root. Starts fast, slows down at the end.\n* outCubic\n* bounce: Bounces like a ball. See https://www.desmos.com/calculator/tbr20s8vd2 for a graphical representation.\n\n**Custom easing**\n\n* Use [this](http://www.timotheegroleau.com/Flash/experiments/easing_function_generator.htm) generator\n* Insert the given polynomial coeficients instead of t, t2, t3, t4 and t5\n```\nt5*(p*p*p*p*p) + t4*(p*p*p*p) + t3*(p*p*p) + t2*(p*p) + t*p\n```\nExample shown with the values for easeOutElasticBig\n```\neaseOutElasticBig: function(p) {\n  return 56*(p*p*p*p*p) - 175*(p*p*p*p) + 200*(p*p*p) - 100*(p*p) + 20*p;\n}\n```\n\nskrollr.get()\n-----\n\nReturns the skrollr instance if `init()` has been called before or `undefined`.\n\nPublic API\n-----\n\nCalling `init()` returns an instance of skrollr which exposes a public api.\n\n### refresh([elements])\n\nReparses all given `elements`. You can pass a single element or an array-like element (Array, NodeList or jQuery object)\n\nUseful when\n\n* Elements in `relative` mode change and need to be updated.\n* Data-attributes are manipulated dynamically.\n* New elements are added to the DOM and should be controlled by skrollr.\n\nWhen no `elements` are given, all elements in the document will be parsed again. In fact, when calling `skrollr.init()` skrollr uses `refresh()` without parameters internally.\n\nTime consuming operations, should not be called on every rendering.\n\n### relativeToAbsolute(element, viewportAnchor, elementAnchor)\n\nReturns an integer which represents the absolute scroll position which correlates to the relative anchor.\n\n`element` must be a DOM element.\n\n`viewportAnchor` and `elementAnchor` must be one of `top`, `center` or `bottom`\n\nExample:\n\n```js\nvar offset = s.relativeToAbsolute(document.getElementById('foo'), 'top', 'bottom');\n\n//offset contains the scroll position at which #foo's bottom is at the top of the viewport.\n//If you now use setScrollTop(offset) or animateTo(offset) #foo's bottom will be perfectly aligned with the top of the viewport. Yay.\n```\n\n### getScrollTop()\n\nReturns the current scroll offset in pixels. Normalizes different browser quirks and handles mobile scrolling.\n\n### getMaxScrollTop()\n\nReturns the number of pixels that can be scrolled down in total. If `forceHeight` is true, that's usually the largest keyframe. Otherwise it's the height of the document minus the viewport height.\n\n### setScrollTop(top[, force = false])\n\nSets the top offset using `window.scrollTo(0, top)` on desktop or updating the internal state in case of mobile scrolling.\n\nWhen `force` is set to `true`, skrollr will jump to the new position without any kind of transition. By default, the global `smoothScrolling` setting applies.\n\n### isMobile()\n\nReturns if skrollr runs in mobile mode (see also `mobileCheck` option).\n\n### animateTo(top[, options])\n\nAnimates the scroll position from current position to `top`. Possible `options` are\n\n#### duration\n\nHow long the animation should run in milliseconds. The default is `1000` or one second.\n\n#### easing\n\nThe name of an easing function. The same functions can be used as for property animations. Default is `linear` .\n\n#### done\n\nA function to be called after the animation finished. When you pass a `top` value, which is the same as the current, then the function will be called immediately. The function gets a boolean argument `interrupted` which indicates if the animation was interrupted by `stopAnimateTo` or finished to the end.\n\n### stopAnimateTo()\n\nStops the animation and calls the `done` callback passing `true` as `interrupted` arguments.\n\n### isAnimatingTo()\n\nReturns if an animation caused by animateTo is running.\n\n### on(name, fn)\n\nSet a listener function for one of the events described in the options section (beforerender, render, keyframe). Only one listener can be attached at a given time. This method overwrites the current listener, if any.\n\n### off(name)\n\nRemoves the listener for the given event.\n\n\n### destroy()\n\nDestroys skrollr. All `class` and `style` attributes will be set to the values they had before.\n\nChangelog\n=====\n\nSee [HISTORY.md](https://github.com/Prinzhorn/skrollr/blob/master/HISTORY.md).\n"
  },
  {
    "path": "bower.json",
    "content": "{\n  \"name\": \"skrollr\",\n  \"homepage\": \"http://prinzhorn.github.io/skrollr/\",\n  \"authors\": [\n    \"Alexander Prinzhorn\"\n  ],\n  \"description\": \"Stand-alone parallax scrolling library for mobile (Android + iOS) and desktop\",\n  \"main\": \"src/skrollr.js\",\n  \"moduleType\": [\n    \"globals\"\n  ],\n  \"keywords\": [\n    \"parallax\",\n    \"scroll\",\n    \"animation\",\n    \"html5\",\n    \"css3\",\n    \"transition\"\n  ],\n  \"license\": \"MIT\",\n  \"ignore\": [\n    \"**/.*\",\n    \"node_modules\",\n    \"bower_components\",\n    \"test\",\n    \"tests\"\n  ]\n}\n"
  },
  {
    "path": "examples/README.md",
    "content": "Examples\n------\n\nShowcasing the awesomeness of skrollr.\n\n* [The \"main\" example](http://prinzhorn.github.io/skrollr/)\n* [\"Classic\" parallax with different sections and parallax images between the gaps](http://prinzhorn.github.io/skrollr/examples/classic.html)\n* [Demonstrating different anchors](http://prinzhorn.github.io/skrollr/examples/anchors.html)\n* [Demonstrating data-anchor-target](http://prinzhorn.github.io/skrollr/examples/anchor_target.html)\n* [Pausing the scrolling for a moment to do other animations](http://prinzhorn.github.io/skrollr/examples/pausing.html)\n* [Drawing a SVG path](http://prinzhorn.github.io/skrollr/examples/path.html)\n* [Using two custom easing functions to create a circular motion](http://prinzhorn.github.io/skrollr/examples/circular_motion.html)\n* [Parallax background with constant speed](http://prinzhorn.github.io/skrollr/examples/bg_constant_speed_less.html)\n* [gradientsmotherfucker](http://prinzhorn.github.io/skrollr/examples/gradientsmotherfucker.html)"
  },
  {
    "path": "examples/amd.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\n\t<meta name=\"viewport\" content=\"width=device-width, initial-scale=1, maximum-scale=1\">\n\n\t<title>skrollr - parallax scrolling for the masses</title>\n\n\t<link href=\"fixed-positioning.css\" rel=\"stylesheet\" type=\"text/css\" />\n\t<link href=\"main.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n\n<body>\n\t<div id=\"bg1\" data-0=\"background-position:0px 0px;\" data-end=\"background-position:-500px -10000px;\"></div>\n\t<div id=\"bg2\" data-0=\"background-position:0px 0px;\" data-end=\"background-position:-500px -8000px;\"></div>\n\t<div id=\"bg3\" data-0=\"background-position:0px 0px;\" data-end=\"background-position:-500px -6000px;\"></div>\n\n\t<div id=\"progress\" data-0=\"width:0%;background:hsl(200, 100%, 50%);\" data-end=\"width:100%;background:hsl(920, 100%, 50%);\"></div>\n\n\t<div id=\"intro\" data-0=\"opacity:1;top:3%;transform:rotate(0deg);transform-origin:0 0;\" data-500=\"opacity:0;top:-10%;transform:rotate(-90deg);\">\n\t\t<h1><a href=\"https://github.com/Prinzhorn/skrollr\">skrollr</a></h1>\n\t\t<h2>parallax scrolling for the masses</h2>\n\t\t<p>let's get scrollin' ;-)</p>\n\t\t<p class=\"arrows\">▼&nbsp;▼&nbsp;▼</p>\n\t</div>\n\n\t<div id=\"transform\" data-500=\"transform:scale(0) rotate(0deg);\" data-1000=\"transform:scale(1) rotate(1440deg);opacity:1;\" data-1600=\"\" data-1700=\"transform:scale(5) rotate(3240deg);opacity:0;\">\n\t\t<h2>transform</h2>\n\t\t<p>scale, skew and rotate the sh** out of any element</p>\n\t</div>\n\n\t<div id=\"properties\" data-1700=\"top:100%;\" data-2200=\"top:0%;\" data-3000=\"display:block;\" data-3700=\"top:-100%;display:none;\">\n\t\t<h2>all numeric properties</h2>\n\t\t<p>width, height, padding, font-size, z-index, blah blah blah</p>\n\t</div>\n\n\t<div id=\"easing_wrapper\" data-0=\"display:none;\" data-3900=\"display:block;\" data-4900=\"background:rgba(0, 0, 0, 0);color[swing]:rgb(0,0,0);\" data-5900=\"background:rgba(0,0,0,1);color:rgb(255,255,255);\" data-10000=\"top:0%;\" data-12000=\"top:-100%;\">\n\t\t<div id=\"easing\" data-3900=\"left:100%\" data-4600=\"left:25%;\">\n\t\t\t<h2>easing?</h2>\n\t\t\t<p>sure.</p>\n\t\t\t<p>let me dim the <span data-3900=\"\" data-4900=\"color[swing]:rgb(0,0,0);\" data-5900=\"color:rgb(255,255,0);\">lights</span> for this one...</p>\n\t\t\t<p data-5900=\"opacity:0;font-size:100%;\" data-6500=\"opacity:1;font-size:150%;\">you can set easings for each property and define own easing functions</p>\n\t\t</div>\n\n\t\t<div class=\"drop\" data-6500=\"left:15%;bottom:100%;\" data-9500=\"bottom:0%;\">linear</div>\n\t\t<div class=\"drop\" data-6500=\"left:25%;bottom[quadratic]:100%;\" data-9500=\"bottom:0%;\">quadratic</div>\n\t\t<div class=\"drop\" data-6500=\"left:35%;bottom[cubic]:100%;\" data-9500=\"bottom:0%;\">cubic</div>\n\t\t<div class=\"drop\" data-6500=\"left:45%;bottom[swing]:100%;\" data-9500=\"bottom:0%;\">swing</div>\n\t\t<div class=\"drop\" data-6500=\"left:55%;bottom[WTF]:100%;\" data-9500=\"bottom:0%;\">WTF</div>\n\t\t<div class=\"drop\" data-6500=\"left:65%;bottom[inverted]:100%;\" data-9500=\"bottom:0%;\">inverted</div>\n\t\t<div class=\"drop\" data-6500=\"left:75%;bottom[bounce]:100%;\" data-9500=\"bottom:0%;\">bounce</div>\n\t</div>\n\n\t<div id=\"download\" data-10000=\"top[cubic]:100%;border-radius[cubic]:0em;background:rgb(0,50,100);border-width:0px;\" data-12000=\"top:10%;border-radius:2em;background:rgb(190,230,255);border-width:10px;\">\n\t\t<h2>the end</h2>\n\t\t<p>by the way, you can also animate colors (you did notice this, didn't you?)</p>\n\t\t<p><strong>Now get this thing on <a href=\"https://github.com/Prinzhorn/skrollr\">GitHub</a> and spread the word, it's open source!</strong> <a href=\"https://twitter.com/share\" class=\"twitter-share-button\" data-url=\"http://prinzhorn.github.com/skrollr/\" data-via=\"Prinzhorn\">Tweet</a>\n\t\t<script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0];if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=\"//platform.twitter.com/widgets.js\";fjs.parentNode.insertBefore(js,fjs);}}(document,\"script\",\"twitter-wjs\");</script></p>\n\t\t<p>Check out more <a href=\"https://github.com/Prinzhorn/skrollr/tree/master/examples#examples\">examples</a>.</p>\n\t\t<p>Handcrafted by <a href=\"https://twitter.com/Prinzhorn\" class=\"twitter-follow-button\" data-show-count=\"false\">Follow @Prinzhorn</a>\n\t\t<script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0];if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=\"//platform.twitter.com/widgets.js\";fjs.parentNode.insertBefore(js,fjs);}}(document,\"script\",\"twitter-wjs\");</script></p>\n\t</div>\n\n\t<div id=\"scrollbar\" data-0=\"top:0%;margin-top:2px;\" data-end=\"top:100%;margin-top:-52px;\"></div>\n\n\t<script data-main=\"scripts/main\" src=\"scripts/require.js\"></script>\n\n\t<!--[if lt IE 9]>\n\t<script type=\"text/javascript\" src=\"dist/skrollr.ie.min.js\"></script>\n\t<![endif]-->\n</body>\n\n</html>\n"
  },
  {
    "path": "examples/anchor_target.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\" />\n\n\t<title>anchor-target</title>\n\n\t<style type=\"text/css\">\n\tbody {font-family:sans-serif;}\n\n\t#red, #blue {\n\t\twidth:128px;\n\t\theight:128px;\n\t\tbackground:#f33 url(images/face.png);\n\t}\n\n\t#red {\n\t\tfloat:left;\n\t\tmargin:1em;\n\t}\n\n\t#blue {\n\t\tbackground:#09f url(images/face.png) 0 bottom;\n\t\tmargin-top:20px;\n\t}\n\n\t#blue_wrapper {\n\t\tposition:fixed;\n\t\ttop:0;\n\t\tright:20px;\n\t}\n\t</style>\n</head>\n\n<body>\n\t<div id=\"skrollr-body\">\n\t\t<h1>anchor-target</h1>\n\n\t\t<p>\n\t\t\t<strong><em>BLUE</em> on the right is so unhappy. Scroll down so he can see his buddy <em>RED</em>.</strong>\n\t\t</p>\n\n\t\t<p>Biltong pastrami kielbasa short ribs, turducken shoulder pork chop boudin ground round speck cow. Fatback leberkas shank hamburger, tail pork belly tongue bresaola short ribs corned beef speck tri-tip ribeye. Filet mignon shoulder speck pastrami. Ham hock turducken corned beef shankle. Meatloaf shankle sausage boudin, shank flank turducken tenderloin pancetta ball tip. Biltong boudin jowl drumstick pig.</p>\n\n\t\t<p>Sirloin venison bresaola andouille pastrami short ribs. Short loin cow capicola tail ham hock leberkas. Frankfurter meatloaf capicola, swine ball tip jerky pork loin pork belly cow ribeye brisket strip steak jowl beef ribs ham hock. Pastrami ham hock rump turkey, pork belly capicola jerky. Turkey chuck beef, bresaola filet mignon jerky tri-tip pastrami. Bacon capicola jowl fatback short ribs. Speck shankle bacon chuck.</p>\n\n\t\t<p>Pork loin tail pork belly shank ham. Kielbasa venison ham, short loin ham hock beef ribs tri-tip ball tip pork belly. Ribeye sirloin sausage tenderloin hamburger. Strip steak tongue turkey, andouille bacon beef ribs venison. T-bone ball tip bresaola fatback, ground round meatball chicken sausage tongue pork chop leberkas sirloin jerky shank bacon. Turducken sirloin cow shankle pig, leberkas venison boudin pastrami.</p>\n\n\t\t<p>Cow fatback short loin, hamburger speck jowl turducken capicola ham hock. Hamburger corned beef strip steak shank filet mignon, jerky capicola chicken jowl ribeye pork ham hock ground round bresaola. Jowl ribeye kielbasa drumstick pork belly leberkas. Spare ribs fatback shankle, hamburger meatloaf sausage pork loin andouille pork kielbasa. Pancetta shank tongue, leberkas turducken shoulder rump meatball pork belly pig hamburger brisket biltong. Tenderloin short ribs pig, rump tail chuck turducken.</p>\n\n\t\t<p>Cow tri-tip pork loin salami corned beef. T-bone turkey ham frankfurter, brisket cow chicken bacon rump sirloin. Pancetta ribeye salami leberkas speck shank. Ribeye prosciutto swine venison speck beef.</p>\n\n\t\t<p>Biltong pastrami kielbasa short ribs, turducken shoulder pork chop boudin ground round speck cow. Fatback leberkas shank hamburger, tail pork belly tongue bresaola short ribs corned beef speck tri-tip ribeye. Filet mignon shoulder speck pastrami. Ham hock turducken corned beef shankle. Meatloaf shankle sausage boudin, shank flank turducken tenderloin pancetta ball tip. Biltong boudin jowl drumstick pig.</p>\n\n\t\t<p>Sirloin venison bresaola andouille pastrami short ribs. Short loin cow capicola tail ham hock leberkas. Frankfurter meatloaf capicola, swine ball tip jerky pork loin pork belly cow ribeye brisket strip steak jowl beef ribs ham hock. Pastrami ham hock rump turkey, pork belly capicola jerky. Turkey chuck beef, bresaola filet mignon jerky tri-tip pastrami. Bacon capicola jowl fatback short ribs. Speck shankle bacon chuck.</p>\n\n\t\t<p>Pork loin tail pork belly shank ham. Kielbasa venison ham, short loin ham hock beef ribs tri-tip ball tip pork belly. Ribeye sirloin sausage tenderloin hamburger. Strip steak tongue turkey, andouille bacon beef ribs venison. T-bone ball tip bresaola fatback, ground round meatball chicken sausage tongue pork chop leberkas sirloin jerky shank bacon. Turducken sirloin cow shankle pig, leberkas venison boudin pastrami.</p>\n\n\t\t<p>Cow fatback short loin, hamburger speck jowl turducken capicola ham hock. Hamburger corned beef strip steak shank filet mignon, jerky capicola chicken jowl ribeye pork ham hock ground round bresaola. Jowl ribeye kielbasa drumstick pork belly leberkas. Spare ribs fatback shankle, hamburger meatloaf sausage pork loin andouille pork kielbasa. Pancetta shank tongue, leberkas turducken shoulder rump meatball pork belly pig hamburger brisket biltong. Tenderloin short ribs pig, rump tail chuck turducken.</p>\n\n\t\t<p>Cow tri-tip pork loin salami corned beef. T-bone turkey ham frankfurter, brisket cow chicken bacon rump sirloin. Pancetta ribeye salami leberkas speck shank. Ribeye prosciutto swine venison speck beef.</p>\n\n\t\t<p>Biltong pastrami kielbasa short ribs, turducken shoulder pork chop boudin ground round speck cow. Fatback leberkas shank hamburger, tail pork belly tongue bresaola short ribs corned beef speck tri-tip ribeye. Filet mignon shoulder speck pastrami. Ham hock turducken corned beef shankle. Meatloaf shankle sausage boudin, shank flank turducken tenderloin pancetta ball tip. Biltong boudin jowl drumstick pig.</p>\n\n\t\t<p>Sirloin venison bresaola andouille pastrami short ribs. Short loin cow capicola tail ham hock leberkas. Frankfurter meatloaf capicola, swine ball tip jerky pork loin pork belly cow ribeye brisket strip steak jowl beef ribs ham hock. Pastrami ham hock rump turkey, pork belly capicola jerky. Turkey chuck beef, bresaola filet mignon jerky tri-tip pastrami. Bacon capicola jowl fatback short ribs. Speck shankle bacon chuck.</p>\n\n\t\t<p>Sirloin venison bresaola andouille pastrami short ribs. Short loin cow capicola tail ham hock leberkas. Frankfurter meatloaf capicola, swine ball tip jerky pork loin pork belly cow ribeye brisket strip steak jowl beef ribs ham hock. Pastrami ham hock rump turkey, pork belly capicola jerky. Turkey chuck beef, bresaola filet mignon jerky tri-tip pastrami. Bacon capicola jowl fatback short ribs. Speck shankle bacon chuck.</p>\n\n\t\t<p>Pork loin tail pork belly shank ham. Kielbasa venison ham, short loin ham hock beef ribs tri-tip ball tip pork belly. Ribeye sirloin sausage tenderloin hamburger. Strip steak tongue turkey, andouille bacon beef ribs venison. T-bone ball tip bresaola fatback, ground round meatball chicken sausage tongue pork chop leberkas sirloin jerky shank bacon. Turducken sirloin cow shankle pig, leberkas venison boudin pastrami.</p>\n\n\t\t<p>Cow fatback short loin, hamburger speck jowl turducken capicola ham hock. Hamburger corned beef strip steak shank filet mignon, jerky capicola chicken jowl ribeye pork ham hock ground round bresaola. Jowl ribeye kielbasa drumstick pork belly leberkas. Spare ribs fatback shankle, hamburger meatloaf sausage pork loin andouille pork kielbasa. Pancetta shank tongue, leberkas turducken shoulder rump meatball pork belly pig hamburger brisket biltong. Tenderloin short ribs pig, rump tail chuck turducken.</p>\n\n\t\t<p>Cow tri-tip pork loin salami corned beef. T-bone turkey ham frankfurter, brisket cow chicken bacon rump sirloin. Pancetta ribeye salami leberkas speck shank. Ribeye prosciutto swine venison speck beef.</p>\n\n\t\t<p>Biltong pastrami kielbasa short ribs, turducken shoulder pork chop boudin ground round speck cow. Fatback leberkas shank hamburger, tail pork belly tongue bresaola short ribs corned beef speck tri-tip ribeye. Filet mignon shoulder speck pastrami. Ham hock turducken corned beef shankle. Meatloaf shankle sausage boudin, shank flank turducken tenderloin pancetta ball tip. Biltong boudin jowl drumstick pig.</p>\n\n\t\t<p>Sirloin venison bresaola andouille pastrami short ribs. Short loin cow capicola tail ham hock leberkas. Frankfurter meatloaf capicola, swine ball tip jerky pork loin pork belly cow ribeye brisket strip steak jowl beef ribs ham hock. Pastrami ham hock rump turkey, pork belly capicola jerky. Turkey chuck beef, bresaola filet mignon jerky tri-tip pastrami. Bacon capicola jowl fatback short ribs. Speck shankle bacon chuck.</p>\n\n\t\t<p>Pork loin tail pork belly shank ham. Kielbasa venison ham, short loin ham hock beef ribs tri-tip ball tip pork belly. Ribeye sirloin sausage tenderloin hamburger. Strip steak tongue turkey, andouille bacon beef ribs venison. T-bone ball tip bresaola fatback, ground round meatball chicken sausage tongue pork chop leberkas sirloin jerky shank bacon. Turducken sirloin cow shankle pig, leberkas venison boudin pastrami.</p>\n\n\t\t<p>Cow fatback short loin, hamburger speck jowl turducken capicola ham hock. Hamburger corned beef strip steak shank filet mignon, jerky capicola chicken jowl ribeye pork ham hock ground round bresaola. Jowl ribeye kielbasa drumstick pork belly leberkas. Spare ribs fatback shankle, hamburger meatloaf sausage pork loin andouille pork kielbasa. Pancetta shank tongue, leberkas turducken shoulder rump meatball pork belly pig hamburger brisket biltong. Tenderloin short ribs pig, rump tail chuck turducken.</p>\n\n\t\t<p>Cow tri-tip pork loin salami corned beef. T-bone turkey ham frankfurter, brisket cow chicken bacon rump sirloin. Pancetta ribeye salami leberkas speck shank. Ribeye prosciutto swine venison speck beef.</p>\n\n\t\t<p>Biltong pastrami kielbasa short ribs, turducken shoulder pork chop boudin ground round speck cow. Fatback leberkas shank hamburger, tail pork belly tongue bresaola short ribs corned beef speck tri-tip ribeye. Filet mignon shoulder speck pastrami. Ham hock turducken corned beef shankle. Meatloaf shankle sausage boudin, shank flank turducken tenderloin pancetta ball tip. Biltong boudin jowl drumstick pig.</p>\n\n\t\t<p>Sirloin venison bresaola andouille pastrami short ribs. Short loin cow capicola tail ham hock leberkas. Frankfurter meatloaf capicola, swine ball tip jerky pork loin pork belly cow ribeye brisket strip steak jowl beef ribs ham hock. Pastrami ham hock rump turkey, pork belly capicola jerky. Turkey chuck beef, bresaola filet mignon jerky tri-tip pastrami. Bacon capicola jowl fatback short ribs. Speck shankle bacon chuck.</p>\n\n\t\t<p>Pork loin tail pork belly shank ham. Kielbasa venison ham, short loin ham hock beef ribs tri-tip ball tip pork belly. Ribeye sirloin sausage tenderloin hamburger. Strip steak tongue turkey, andouille bacon beef ribs venison. T-bone ball tip bresaola fatback, ground round meatball chicken sausage tongue pork chop leberkas sirloin jerky shank bacon. Turducken sirloin cow shankle pig, leberkas venison boudin pastrami.</p>\n\n\t\t<p>Cow fatback short loin, hamburger speck jowl turducken capicola ham hock. Hamburger corned beef strip steak shank filet mignon, jerky capicola chicken jowl ribeye pork ham hock ground round bresaola. Jowl ribeye kielbasa drumstick pork belly leberkas. Spare ribs fatback shankle, hamburger meatloaf sausage pork loin andouille pork kielbasa. Pancetta shank tongue, leberkas turducken shoulder rump meatball pork belly pig hamburger brisket biltong. Tenderloin short ribs pig, rump tail chuck turducken.</p>\n\n\t\t<p>Cow tri-tip pork loin salami corned beef. T-bone turkey ham frankfurter, brisket cow chicken bacon rump sirloin. Pancetta ribeye salami leberkas speck shank. Ribeye prosciutto swine venison speck beef.</p>\n\n\t\t<p>Biltong pastrami kielbasa short ribs, turducken shoulder pork chop boudin ground round speck cow. Fatback leberkas shank hamburger, tail pork belly tongue bresaola short ribs corned beef speck tri-tip ribeye. Filet mignon shoulder speck pastrami. Ham hock turducken corned beef shankle. Meatloaf shankle sausage boudin, shank flank turducken tenderloin pancetta ball tip. Biltong boudin jowl drumstick pig.</p>\n\n\t\t<p>Sirloin venison bresaola andouille pastrami short ribs. Short loin cow capicola tail ham hock leberkas. Frankfurter meatloaf capicola, swine ball tip jerky pork loin pork belly cow ribeye brisket strip steak jowl beef ribs ham hock. Pastrami ham hock rump turkey, pork belly capicola jerky. Turkey chuck beef, bresaola filet mignon jerky tri-tip pastrami. Bacon capicola jowl fatback short ribs. Speck shankle bacon chuck.</p>\n\n\t\t<p>Pork loin tail pork belly shank ham. Kielbasa venison ham, short loin ham hock beef ribs tri-tip ball tip pork belly. Ribeye sirloin sausage tenderloin hamburger. Strip steak tongue turkey, andouille bacon beef ribs venison. T-bone ball tip bresaola fatback, ground round meatball chicken sausage tongue pork chop leberkas sirloin jerky shank bacon. Turducken sirloin cow shankle pig, leberkas venison boudin pastrami.</p>\n\n\t\t<p>Cow tri-tip pork loin salami corned beef. T-bone turkey ham frankfurter, brisket cow chicken bacon rump sirloin. Pancetta ribeye salami leberkas speck shank. Ribeye prosciutto swine venison speck beef.</p>\n\n\n\t\t<!--RED (buddy)-->\n\t\t<div id=\"red\" data-bottom=\"transform:rotate(0deg);transform-origin:center;\" data-top=\"transform:rotate(360deg);\"></div>\n\n\n\t\t<p>Cow tri-tip pork loin salami corned beef. T-bone turkey ham frankfurter, brisket cow chicken bacon rump sirloin. Pancetta ribeye salami leberkas speck shank. Ribeye prosciutto swine venison speck beef.</p>\n\n\t\t<p>Biltong pastrami kielbasa short ribs, turducken shoulder pork chop boudin ground round speck cow. Fatback leberkas shank hamburger, tail pork belly tongue bresaola short ribs corned beef speck tri-tip ribeye. Filet mignon shoulder speck pastrami. Ham hock turducken corned beef shankle. Meatloaf shankle sausage boudin, shank flank turducken tenderloin pancetta ball tip. Biltong boudin jowl drumstick pig.</p>\n\n\t\t<p>Sirloin venison bresaola andouille pastrami short ribs. Short loin cow capicola tail ham hock leberkas. Frankfurter meatloaf capicola, swine ball tip jerky pork loin pork belly cow ribeye brisket strip steak jowl beef ribs ham hock. Pastrami ham hock rump turkey, pork belly capicola jerky. Turkey chuck beef, bresaola filet mignon jerky tri-tip pastrami. Bacon capicola jowl fatback short ribs. Speck shankle bacon chuck.</p>\n\n\t\t<p>Pork loin tail pork belly shank ham. Kielbasa venison ham, short loin ham hock beef ribs tri-tip ball tip pork belly. Ribeye sirloin sausage tenderloin hamburger. Strip steak tongue turkey, andouille bacon beef ribs venison. T-bone ball tip bresaola fatback, ground round meatball chicken sausage tongue pork chop leberkas sirloin jerky shank bacon. Turducken sirloin cow shankle pig, leberkas venison boudin pastrami.</p>\n\n\t\t<p>Cow fatback short loin, hamburger speck jowl turducken capicola ham hock. Hamburger corned beef strip steak shank filet mignon, jerky capicola chicken jowl ribeye pork ham hock ground round bresaola. Jowl ribeye kielbasa drumstick pork belly leberkas. Spare ribs fatback shankle, hamburger meatloaf sausage pork loin andouille pork kielbasa. Pancetta shank tongue, leberkas turducken shoulder rump meatball pork belly pig hamburger brisket biltong. Tenderloin short ribs pig, rump tail chuck turducken.</p>\n\n\t\t<p>Cow tri-tip pork loin salami corned beef. T-bone turkey ham frankfurter, brisket cow chicken bacon rump sirloin. Pancetta ribeye salami leberkas speck shank. Ribeye prosciutto swine venison speck beef.</p>\n\n\t\t<p>Biltong pastrami kielbasa short ribs, turducken shoulder pork chop boudin ground round speck cow. Fatback leberkas shank hamburger, tail pork belly tongue bresaola short ribs corned beef speck tri-tip ribeye. Filet mignon shoulder speck pastrami. Ham hock turducken corned beef shankle. Meatloaf shankle sausage boudin, shank flank turducken tenderloin pancetta ball tip. Biltong boudin jowl drumstick pig.</p>\n\n\t\t<p>Sirloin venison bresaola andouille pastrami short ribs. Short loin cow capicola tail ham hock leberkas. Frankfurter meatloaf capicola, swine ball tip jerky pork loin pork belly cow ribeye brisket strip steak jowl beef ribs ham hock. Pastrami ham hock rump turkey, pork belly capicola jerky. Turkey chuck beef, bresaola filet mignon jerky tri-tip pastrami. Bacon capicola jowl fatback short ribs. Speck shankle bacon chuck.</p>\n\n\t\t<p>Pork loin tail pork belly shank ham. Kielbasa venison ham, short loin ham hock beef ribs tri-tip ball tip pork belly. Ribeye sirloin sausage tenderloin hamburger. Strip steak tongue turkey, andouille bacon beef ribs venison. T-bone ball tip bresaola fatback, ground round meatball chicken sausage tongue pork chop leberkas sirloin jerky shank bacon. Turducken sirloin cow shankle pig, leberkas venison boudin pastrami.</p>\n\n\t\t<p>Cow fatback short loin, hamburger speck jowl turducken capicola ham hock. Hamburger corned beef strip steak shank filet mignon, jerky capicola chicken jowl ribeye pork ham hock ground round bresaola. Jowl ribeye kielbasa drumstick pork belly leberkas. Spare ribs fatback shankle, hamburger meatloaf sausage pork loin andouille pork kielbasa. Pancetta shank tongue, leberkas turducken shoulder rump meatball pork belly pig hamburger brisket biltong. Tenderloin short ribs pig, rump tail chuck turducken.</p>\n\n\t\t<p>Cow tri-tip pork loin salami corned beef. T-bone turkey ham frankfurter, brisket cow chicken bacon rump sirloin. Pancetta ribeye salami leberkas speck shank. Ribeye prosciutto swine venison speck beef.</p>\n\n\t\t<p>Biltong pastrami kielbasa short ribs, turducken shoulder pork chop boudin ground round speck cow. Fatback leberkas shank hamburger, tail pork belly tongue bresaola short ribs corned beef speck tri-tip ribeye. Filet mignon shoulder speck pastrami. Ham hock turducken corned beef shankle. Meatloaf shankle sausage boudin, shank flank turducken tenderloin pancetta ball tip. Biltong boudin jowl drumstick pig.</p>\n\n\t\t<p>Sirloin venison bresaola andouille pastrami short ribs. Short loin cow capicola tail ham hock leberkas. Frankfurter meatloaf capicola, swine ball tip jerky pork loin pork belly cow ribeye brisket strip steak jowl beef ribs ham hock. Pastrami ham hock rump turkey, pork belly capicola jerky. Turkey chuck beef, bresaola filet mignon jerky tri-tip pastrami. Bacon capicola jowl fatback short ribs. Speck shankle bacon chuck.</p>\n\n\t\t<p>Pork loin tail pork belly shank ham. Kielbasa venison ham, short loin ham hock beef ribs tri-tip ball tip pork belly. Ribeye sirloin sausage tenderloin hamburger. Strip steak tongue turkey, andouille bacon beef ribs venison. T-bone ball tip bresaola fatback, ground round meatball chicken sausage tongue pork chop leberkas sirloin jerky shank bacon. Turducken sirloin cow shankle pig, leberkas venison boudin pastrami.</p>\n\n\t\t<p>Cow tri-tip pork loin salami corned beef. T-bone turkey ham frankfurter, brisket cow chicken bacon rump sirloin. Pancetta ribeye salami leberkas speck shank. Ribeye prosciutto swine venison speck beef.</p>\n\n\t\t<p>Cow tri-tip pork loin salami corned beef. T-bone turkey ham frankfurter, brisket cow chicken bacon rump sirloin. Pancetta ribeye salami leberkas speck shank. Ribeye prosciutto swine venison speck beef.</p>\n\n\t\t<p>Biltong pastrami kielbasa short ribs, turducken shoulder pork chop boudin ground round speck cow. Fatback leberkas shank hamburger, tail pork belly tongue bresaola short ribs corned beef speck tri-tip ribeye. Filet mignon shoulder speck pastrami. Ham hock turducken corned beef shankle. Meatloaf shankle sausage boudin, shank flank turducken tenderloin pancetta ball tip. Biltong boudin jowl drumstick pig.</p>\n\n\t\t<p>Sirloin venison bresaola andouille pastrami short ribs. Short loin cow capicola tail ham hock leberkas. Frankfurter meatloaf capicola, swine ball tip jerky pork loin pork belly cow ribeye brisket strip steak jowl beef ribs ham hock. Pastrami ham hock rump turkey, pork belly capicola jerky. Turkey chuck beef, bresaola filet mignon jerky tri-tip pastrami. Bacon capicola jowl fatback short ribs. Speck shankle bacon chuck.</p>\n\n\t\t<p>Pork loin tail pork belly shank ham. Kielbasa venison ham, short loin ham hock beef ribs tri-tip ball tip pork belly. Ribeye sirloin sausage tenderloin hamburger. Strip steak tongue turkey, andouille bacon beef ribs venison. T-bone ball tip bresaola fatback, ground round meatball chicken sausage tongue pork chop leberkas sirloin jerky shank bacon. Turducken sirloin cow shankle pig, leberkas venison boudin pastrami.</p>\n\n\t\t<p>Cow fatback short loin, hamburger speck jowl turducken capicola ham hock. Hamburger corned beef strip steak shank filet mignon, jerky capicola chicken jowl ribeye pork ham hock ground round bresaola. Jowl ribeye kielbasa drumstick pork belly leberkas. Spare ribs fatback shankle, hamburger meatloaf sausage pork loin andouille pork kielbasa. Pancetta shank tongue, leberkas turducken shoulder rump meatball pork belly pig hamburger brisket biltong. Tenderloin short ribs pig, rump tail chuck turducken.</p>\n\n\t\t<p>Cow tri-tip pork loin salami corned beef. T-bone turkey ham frankfurter, brisket cow chicken bacon rump sirloin. Pancetta ribeye salami leberkas speck shank. Ribeye prosciutto swine venison speck beef.</p>\n\n\t\t<p>Biltong pastrami kielbasa short ribs, turducken shoulder pork chop boudin ground round speck cow. Fatback leberkas shank hamburger, tail pork belly tongue bresaola short ribs corned beef speck tri-tip ribeye. Filet mignon shoulder speck pastrami. Ham hock turducken corned beef shankle. Meatloaf shankle sausage boudin, shank flank turducken tenderloin pancetta ball tip. Biltong boudin jowl drumstick pig.</p>\n\n\t\t<p>Sirloin venison bresaola andouille pastrami short ribs. Short loin cow capicola tail ham hock leberkas. Frankfurter meatloaf capicola, swine ball tip jerky pork loin pork belly cow ribeye brisket strip steak jowl beef ribs ham hock. Pastrami ham hock rump turkey, pork belly capicola jerky. Turkey chuck beef, bresaola filet mignon jerky tri-tip pastrami. Bacon capicola jowl fatback short ribs. Speck shankle bacon chuck.</p>\n\n\t\t<p>Pork loin tail pork belly shank ham. Kielbasa venison ham, short loin ham hock beef ribs tri-tip ball tip pork belly. Ribeye sirloin sausage tenderloin hamburger. Strip steak tongue turkey, andouille bacon beef ribs venison. T-bone ball tip bresaola fatback, ground round meatball chicken sausage tongue pork chop leberkas sirloin jerky shank bacon. Turducken sirloin cow shankle pig, leberkas venison boudin pastrami.</p>\n\n\t\t<p>Cow fatback short loin, hamburger speck jowl turducken capicola ham hock. Hamburger corned beef strip steak shank filet mignon, jerky capicola chicken jowl ribeye pork ham hock ground round bresaola. Jowl ribeye kielbasa drumstick pork belly leberkas. Spare ribs fatback shankle, hamburger meatloaf sausage pork loin andouille pork kielbasa. Pancetta shank tongue, leberkas turducken shoulder rump meatball pork belly pig hamburger brisket biltong. Tenderloin short ribs pig, rump tail chuck turducken.</p>\n\n\t\t<p>Cow tri-tip pork loin salami corned beef. T-bone turkey ham frankfurter, brisket cow chicken bacon rump sirloin. Pancetta ribeye salami leberkas speck shank. Ribeye prosciutto swine venison speck beef.</p>\n\n\t\t<p>Biltong pastrami kielbasa short ribs, turducken shoulder pork chop boudin ground round speck cow. Fatback leberkas shank hamburger, tail pork belly tongue bresaola short ribs corned beef speck tri-tip ribeye. Filet mignon shoulder speck pastrami. Ham hock turducken corned beef shankle. Meatloaf shankle sausage boudin, shank flank turducken tenderloin pancetta ball tip. Biltong boudin jowl drumstick pig.</p>\n\n\t\t<p>Sirloin venison bresaola andouille pastrami short ribs. Short loin cow capicola tail ham hock leberkas. Frankfurter meatloaf capicola, swine ball tip jerky pork loin pork belly cow ribeye brisket strip steak jowl beef ribs ham hock. Pastrami ham hock rump turkey, pork belly capicola jerky. Turkey chuck beef, bresaola filet mignon jerky tri-tip pastrami. Bacon capicola jowl fatback short ribs. Speck shankle bacon chuck.</p>\n\n\t\t<p>Pork loin tail pork belly shank ham. Kielbasa venison ham, short loin ham hock beef ribs tri-tip ball tip pork belly. Ribeye sirloin sausage tenderloin hamburger. Strip steak tongue turkey, andouille bacon beef ribs venison. T-bone ball tip bresaola fatback, ground round meatball chicken sausage tongue pork chop leberkas sirloin jerky shank bacon. Turducken sirloin cow shankle pig, leberkas venison boudin pastrami.</p>\n\n\t\t<p>Cow tri-tip pork loin salami corned beef. T-bone turkey ham frankfurter, brisket cow chicken bacon rump sirloin. Pancetta ribeye salami leberkas speck shank. Ribeye prosciutto swine venison speck beef.</p>\n\t</div>\n\n\t<!--BLUE (unhappy)-->\n\t<div id=\"blue_wrapper\" data-smooth-scrolling=\"off\">\n\t\t<div id=\"blue\"\n\t\t\tdata-anchor-target=\"#red\"\n\t\t\tdata-0=\"background-position:!0 bottom;\"\n\t\t\tdata-bottom-top=\"margin-right[vibrate]:0px;background-position:!0 0;\"\n\t\t\tdata-top-bottom=\"margin-right[vibrate]:20px;background-position:!0 bottom;\"></div>\n\t</div>\n\n\t<script type=\"text/javascript\" src=\"../dist/skrollr.min.js\"></script>\n\n\t<script type=\"text/javascript\">\n\tskrollr.init({\n\t\tforceHeight: false,\n\t\teasing: {\n\t\t\tvibrate: function(p) {\n\t\t\t\treturn Math.sin(p * 10 * Math.PI);\n\t\t\t}\n\t\t}\n\t});\n\t</script>\n</body>\n\n</html>\n"
  },
  {
    "path": "examples/anchors.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\n\t<meta name=\"viewport\" content=\"width=device-width, initial-scale=1, user-scalable=no\">\n\n\t<title>Anchors</title>\n\n\t<style type=\"text/css\">\n\tbody {font-family:sans-serif;}\n\n\t#content {\n\t\twidth:90%;\n\t\tbackground:#eee;\n\t\tborder:1px solid #444;\n\t\tmargin:1em auto;\n\t}\n\n\t#content > div {\n\t\tpadding:1em;\n\t}\n\n\t.box {\n\t\tfloat:left;\n\t\tpadding:6em 1em;\n\t\tmargin:2px;\n\t}\n\n\tp {margin:1em 0;}\n\t</style>\n</head>\n\n<body>\n\t<div id=\"skrollr-body\">\n\n\t\t<div id=\"content\">\n\t\t\t<div>\n\t\t\t\t<h1>Different anchor types</h1>\n\n\t\t\t\t<p>\n\t\t\t\t\t<strong>Scroll down to see different anchors in action.</strong>\n\t\t\t\t</p>\n\n\t\t\t\t<p>Biltong pastrami kielbasa short ribs, turducken shoulder pork chop boudin ground round speck cow. Fatback leberkas shank hamburger, tail pork belly tongue bresaola short ribs corned beef speck tri-tip ribeye. Filet mignon shoulder speck pastrami. Ham hock turducken corned beef shankle. Meatloaf shankle sausage boudin, shank flank turducken tenderloin pancetta ball tip. Biltong boudin jowl drumstick pig.</p>\n\n\t\t\t\t<p>Sirloin venison bresaola andouille pastrami short ribs. Short loin cow capicola tail ham hock leberkas. Frankfurter meatloaf capicola, swine ball tip jerky pork loin pork belly cow ribeye brisket strip steak jowl beef ribs ham hock. Pastrami ham hock rump turkey, pork belly capicola jerky. Turkey chuck beef, bresaola filet mignon jerky tri-tip pastrami. Bacon capicola jowl fatback short ribs. Speck shankle bacon chuck.</p>\n\n\t\t\t\t<p>Pork loin tail pork belly shank ham. Kielbasa venison ham, short loin ham hock beef ribs tri-tip ball tip pork belly. Ribeye sirloin sausage tenderloin hamburger. Strip steak tongue turkey, andouille bacon beef ribs venison. T-bone ball tip bresaola fatback, ground round meatball chicken sausage tongue pork chop leberkas sirloin jerky shank bacon. Turducken sirloin cow shankle pig, leberkas venison boudin pastrami.</p>\n\n\t\t\t\t<p>Cow fatback short loin, hamburger speck jowl turducken capicola ham hock. Hamburger corned beef strip steak shank filet mignon, jerky capicola chicken jowl ribeye pork ham hock ground round bresaola. Jowl ribeye kielbasa drumstick pork belly leberkas. Spare ribs fatback shankle, hamburger meatloaf sausage pork loin andouille pork kielbasa. Pancetta shank tongue, leberkas turducken shoulder rump meatball pork belly pig hamburger brisket biltong. Tenderloin short ribs pig, rump tail chuck turducken.</p>\n\n\t\t\t\t<p>Cow tri-tip pork loin salami corned beef. T-bone turkey ham frankfurter, brisket cow chicken bacon rump sirloin. Pancetta ribeye salami leberkas speck shank. Ribeye prosciutto swine venison speck beef.</p>\n\n\t\t\t\t<p>Biltong pastrami kielbasa short ribs, turducken shoulder pork chop boudin ground round speck cow. Fatback leberkas shank hamburger, tail pork belly tongue bresaola short ribs corned beef speck tri-tip ribeye. Filet mignon shoulder speck pastrami. Ham hock turducken corned beef shankle. Meatloaf shankle sausage boudin, shank flank turducken tenderloin pancetta ball tip. Biltong boudin jowl drumstick pig.</p>\n\n\t\t\t\t<p>Sirloin venison bresaola andouille pastrami short ribs. Short loin cow capicola tail ham hock leberkas. Frankfurter meatloaf capicola, swine ball tip jerky pork loin pork belly cow ribeye brisket strip steak jowl beef ribs ham hock. Pastrami ham hock rump turkey, pork belly capicola jerky. Turkey chuck beef, bresaola filet mignon jerky tri-tip pastrami. Bacon capicola jowl fatback short ribs. Speck shankle bacon chuck.</p>\n\n\t\t\t\t<p>Pork loin tail pork belly shank ham. Kielbasa venison ham, short loin ham hock beef ribs tri-tip ball tip pork belly. Ribeye sirloin sausage tenderloin hamburger. Strip steak tongue turkey, andouille bacon beef ribs venison. T-bone ball tip bresaola fatback, ground round meatball chicken sausage tongue pork chop leberkas sirloin jerky shank bacon. Turducken sirloin cow shankle pig, leberkas venison boudin pastrami.</p>\n\n\t\t\t\t<p>Cow fatback short loin, hamburger speck jowl turducken capicola ham hock. Hamburger corned beef strip steak shank filet mignon, jerky capicola chicken jowl ribeye pork ham hock ground round bresaola. Jowl ribeye kielbasa drumstick pork belly leberkas. Spare ribs fatback shankle, hamburger meatloaf sausage pork loin andouille pork kielbasa. Pancetta shank tongue, leberkas turducken shoulder rump meatball pork belly pig hamburger brisket biltong. Tenderloin short ribs pig, rump tail chuck turducken.</p>\n\n\t\t\t\t<p>Cow tri-tip pork loin salami corned beef. T-bone turkey ham frankfurter, brisket cow chicken bacon rump sirloin. Pancetta ribeye salami leberkas speck shank. Ribeye prosciutto swine venison speck beef.</p>\n\n\t\t\t\t<p>Biltong pastrami kielbasa short ribs, turducken shoulder pork chop boudin ground round speck cow. Fatback leberkas shank hamburger, tail pork belly tongue bresaola short ribs corned beef speck tri-tip ribeye. Filet mignon shoulder speck pastrami. Ham hock turducken corned beef shankle. Meatloaf shankle sausage boudin, shank flank turducken tenderloin pancetta ball tip. Biltong boudin jowl drumstick pig.</p>\n\n\t\t\t\t<p>Sirloin venison bresaola andouille pastrami short ribs. Short loin cow capicola tail ham hock leberkas. Frankfurter meatloaf capicola, swine ball tip jerky pork loin pork belly cow ribeye brisket strip steak jowl beef ribs ham hock. Pastrami ham hock rump turkey, pork belly capicola jerky. Turkey chuck beef, bresaola filet mignon jerky tri-tip pastrami. Bacon capicola jowl fatback short ribs. Speck shankle bacon chuck.</p>\n\n\t\t\t\t<p>Sirloin venison bresaola andouille pastrami short ribs. Short loin cow capicola tail ham hock leberkas. Frankfurter meatloaf capicola, swine ball tip jerky pork loin pork belly cow ribeye brisket strip steak jowl beef ribs ham hock. Pastrami ham hock rump turkey, pork belly capicola jerky. Turkey chuck beef, bresaola filet mignon jerky tri-tip pastrami. Bacon capicola jowl fatback short ribs. Speck shankle bacon chuck.</p>\n\n\t\t\t\t<p>Pork loin tail pork belly shank ham. Kielbasa venison ham, short loin ham hock beef ribs tri-tip ball tip pork belly. Ribeye sirloin sausage tenderloin hamburger. Strip steak tongue turkey, andouille bacon beef ribs venison. T-bone ball tip bresaola fatback, ground round meatball chicken sausage tongue pork chop leberkas sirloin jerky shank bacon. Turducken sirloin cow shankle pig, leberkas venison boudin pastrami.</p>\n\n\t\t\t\t<p>Cow fatback short loin, hamburger speck jowl turducken capicola ham hock. Hamburger corned beef strip steak shank filet mignon, jerky capicola chicken jowl ribeye pork ham hock ground round bresaola. Jowl ribeye kielbasa drumstick pork belly leberkas. Spare ribs fatback shankle, hamburger meatloaf sausage pork loin andouille pork kielbasa. Pancetta shank tongue, leberkas turducken shoulder rump meatball pork belly pig hamburger brisket biltong. Tenderloin short ribs pig, rump tail chuck turducken.</p>\n\n\t\t\t\t<div class=\"box\" data-start=\"background:hsl(0,50%,75%);\" data-end=\"background:hsl(180,50%,75%);\">\n\t\t\t\t\tstart<br>end\n\t\t\t\t</div>\n\n\t\t\t\t<div class=\"box\" data-bottom-top=\"background:hsl(0,50%,75%);\" data-top-bottom=\"background:hsl(180,50%,75%);\">\n\t\t\t\t\tbottom-top<br>top-bottom\n\t\t\t\t</div>\n\n\t\t\t\t<div class=\"box\" data-top-top=\"background:hsl(0,50%,75%);\" data-bottom-bottom=\"background:hsl(180,50%,75%);\">\n\t\t\t\t\ttop-top<br>bottom-bottom\n\t\t\t\t</div>\n\n\t\t\t\t<div class=\"box\" data-center-top=\"background:hsl(0,50%,75%);\" data-center-bottom=\"background:hsl(180,50%,75%);\">\n\t\t\t\t\tcenter-top<br>center-bottom\n\t\t\t\t</div>\n\n\t\t\t\t<div id=\"bacon\" class=\"box\" data-center-center=\"background:hsl(0,50%,75%);\" data-1-center-center=\"background:hsl(180,50%,75%);\">\n\t\t\t\t\tcenter-center<br>1-center-center\n\t\t\t\t</div>\n\n\t\t\t\t<div class=\"box\" data-50-bottom-bottom=\"background:hsl(0,50%,75%);\" data--50-top-top=\"background:hsl(180,50%,75%);\">\n\t\t\t\t\t50-bottom-bottom<br>-50-top-top\n\t\t\t\t</div>\n\n\t\t\t\t<p style=\"clear:both;\">Cow tri-tip pork loin salami corned beef. T-bone turkey ham frankfurter, brisket cow chicken bacon rump sirloin. Pancetta ribeye salami leberkas speck shank. Ribeye prosciutto swine venison speck beef.</p>\n\n\t\t\t\t<p>Biltong pastrami kielbasa short ribs, turducken shoulder pork chop boudin ground round speck cow. Fatback leberkas shank hamburger, tail pork belly tongue bresaola short ribs corned beef speck tri-tip ribeye. Filet mignon shoulder speck pastrami. Ham hock turducken corned beef shankle. Meatloaf shankle sausage boudin, shank flank turducken tenderloin pancetta ball tip. Biltong boudin jowl drumstick pig.</p>\n\n\t\t\t\t<p>Sirloin venison bresaola andouille pastrami short ribs. Short loin cow capicola tail ham hock leberkas. Frankfurter meatloaf capicola, swine ball tip jerky pork loin pork belly cow ribeye brisket strip steak jowl beef ribs ham hock. Pastrami ham hock rump turkey, pork belly capicola jerky. Turkey chuck beef, bresaola filet mignon jerky tri-tip pastrami. Bacon capicola jowl fatback short ribs. Speck shankle bacon chuck.</p>\n\n\t\t\t\t<p>Pork loin tail pork belly shank ham. Kielbasa venison ham, short loin ham hock beef ribs tri-tip ball tip pork belly. Ribeye sirloin sausage tenderloin hamburger. Strip steak tongue turkey, andouille bacon beef ribs venison. T-bone ball tip bresaola fatback, ground round meatball chicken sausage tongue pork chop leberkas sirloin jerky shank bacon. Turducken sirloin cow shankle pig, leberkas venison boudin pastrami.</p>\n\n\t\t\t\t<p>Cow fatback short loin, hamburger speck jowl turducken capicola ham hock. Hamburger corned beef strip steak shank filet mignon, jerky capicola chicken jowl ribeye pork ham hock ground round bresaola. Jowl ribeye kielbasa drumstick pork belly leberkas. Spare ribs fatback shankle, hamburger meatloaf sausage pork loin andouille pork kielbasa. Pancetta shank tongue, leberkas turducken shoulder rump meatball pork belly pig hamburger brisket biltong. Tenderloin short ribs pig, rump tail chuck turducken.</p>\n\n\t\t\t\t<p>Cow tri-tip pork loin salami corned beef. T-bone turkey ham frankfurter, brisket cow chicken bacon rump sirloin. Pancetta ribeye salami leberkas speck shank. Ribeye prosciutto swine venison speck beef.</p>\n\n\t\t\t\t<p>Biltong pastrami kielbasa short ribs, turducken shoulder pork chop boudin ground round speck cow. Fatback leberkas shank hamburger, tail pork belly tongue bresaola short ribs corned beef speck tri-tip ribeye. Filet mignon shoulder speck pastrami. Ham hock turducken corned beef shankle. Meatloaf shankle sausage boudin, shank flank turducken tenderloin pancetta ball tip. Biltong boudin jowl drumstick pig.</p>\n\n\t\t\t\t<p>Sirloin venison bresaola andouille pastrami short ribs. Short loin cow capicola tail ham hock leberkas. Frankfurter meatloaf capicola, swine ball tip jerky pork loin pork belly cow ribeye brisket strip steak jowl beef ribs ham hock. Pastrami ham hock rump turkey, pork belly capicola jerky. Turkey chuck beef, bresaola filet mignon jerky tri-tip pastrami. Bacon capicola jowl fatback short ribs. Speck shankle bacon chuck.</p>\n\n\t\t\t\t<p>Pork loin tail pork belly shank ham. Kielbasa venison ham, short loin ham hock beef ribs tri-tip ball tip pork belly. Ribeye sirloin sausage tenderloin hamburger. Strip steak tongue turkey, andouille bacon beef ribs venison. T-bone ball tip bresaola fatback, ground round meatball chicken sausage tongue pork chop leberkas sirloin jerky shank bacon. Turducken sirloin cow shankle pig, leberkas venison boudin pastrami.</p>\n\n\t\t\t\t<p>Cow fatback short loin, hamburger speck jowl turducken capicola ham hock. Hamburger corned beef strip steak shank filet mignon, jerky capicola chicken jowl ribeye pork ham hock ground round bresaola. Jowl ribeye kielbasa drumstick pork belly leberkas. Spare ribs fatback shankle, hamburger meatloaf sausage pork loin andouille pork kielbasa. Pancetta shank tongue, leberkas turducken shoulder rump meatball pork belly pig hamburger brisket biltong. Tenderloin short ribs pig, rump tail chuck turducken.</p>\n\n\t\t\t\t<p>Cow tri-tip pork loin salami corned beef. T-bone turkey ham frankfurter, brisket cow chicken bacon rump sirloin. Pancetta ribeye salami leberkas speck shank. Ribeye prosciutto swine venison speck beef.</p>\n\n\t\t\t\t<p>Biltong pastrami kielbasa short ribs, turducken shoulder pork chop boudin ground round speck cow. Fatback leberkas shank hamburger, tail pork belly tongue bresaola short ribs corned beef speck tri-tip ribeye. Filet mignon shoulder speck pastrami. Ham hock turducken corned beef shankle. Meatloaf shankle sausage boudin, shank flank turducken tenderloin pancetta ball tip. Biltong boudin jowl drumstick pig.</p>\n\n\t\t\t\t<p>Sirloin venison bresaola andouille pastrami short ribs. Short loin cow capicola tail ham hock leberkas. Frankfurter meatloaf capicola, swine ball tip jerky pork loin pork belly cow ribeye brisket strip steak jowl beef ribs ham hock. Pastrami ham hock rump turkey, pork belly capicola jerky. Turkey chuck beef, bresaola filet mignon jerky tri-tip pastrami. Bacon capicola jowl fatback short ribs. Speck shankle bacon chuck.</p>\n\n\t\t\t\t<p>Pork loin tail pork belly shank ham. Kielbasa venison ham, short loin ham hock beef ribs tri-tip ball tip pork belly. Ribeye sirloin sausage tenderloin hamburger. Strip steak tongue turkey, andouille bacon beef ribs venison. T-bone ball tip bresaola fatback, ground round meatball chicken sausage tongue pork chop leberkas sirloin jerky shank bacon. Turducken sirloin cow shankle pig, leberkas venison boudin pastrami.</p>\n\n\t\t\t\t<p>Cow fatback short loin, hamburger speck jowl turducken capicola ham hock. Hamburger corned beef strip steak shank filet mignon, jerky capicola chicken jowl ribeye pork ham hock ground round bresaola. Jowl ribeye kielbasa drumstick pork belly leberkas. Spare ribs fatback shankle, hamburger meatloaf sausage pork loin andouille pork kielbasa. Pancetta shank tongue, leberkas turducken shoulder rump meatball pork belly pig hamburger brisket biltong. Tenderloin short ribs pig, rump tail chuck turducken.</p>\n\n\t\t\t\t<div class=\"box\" data-300-end=\"background:hsl(0,50%,75%);\" data-end=\"background:hsl(180,50%,75%);\">\n\t\t\t\t\t300-end<br>end\n\t\t\t\t</div>\n\n\t\t\t\t<p style=\"clear:both;\">Cow tri-tip pork loin salami corned beef. T-bone turkey ham frankfurter, brisket cow chicken bacon rump sirloin. Pancetta ribeye salami leberkas speck shank. Ribeye prosciutto swine venison speck beef.</p>\n\n\t\t\t\t<p>Biltong pastrami kielbasa short ribs, turducken shoulder pork chop boudin ground round speck cow. Fatback leberkas shank hamburger, tail pork belly tongue bresaola short ribs corned beef speck tri-tip ribeye. Filet mignon shoulder speck pastrami. Ham hock turducken corned beef shankle. Meatloaf shankle sausage boudin, shank flank turducken tenderloin pancetta ball tip. Biltong boudin jowl drumstick pig.</p>\n\n\t\t\t\t<p>Sirloin venison bresaola andouille pastrami short ribs. Short loin cow capicola tail ham hock leberkas. Frankfurter meatloaf capicola, swine ball tip jerky pork loin pork belly cow ribeye brisket strip steak jowl beef ribs ham hock. Pastrami ham hock rump turkey, pork belly capicola jerky. Turkey chuck beef, bresaola filet mignon jerky tri-tip pastrami. Bacon capicola jowl fatback short ribs. Speck shankle bacon chuck.</p>\n\n\t\t\t\t<p>Pork loin tail pork belly shank ham. Kielbasa venison ham, short loin ham hock beef ribs tri-tip ball tip pork belly. Ribeye sirloin sausage tenderloin hamburger. Strip steak tongue turkey, andouille bacon beef ribs venison. T-bone ball tip bresaola fatback, ground round meatball chicken sausage tongue pork chop leberkas sirloin jerky shank bacon. Turducken sirloin cow shankle pig, leberkas venison boudin pastrami.</p>\n\n\t\t\t\t<p>Cow tri-tip pork loin salami corned beef. T-bone turkey ham frankfurter, brisket cow chicken bacon rump sirloin. Pancetta ribeye salami leberkas speck shank. Ribeye prosciutto swine venison speck beef.</p>\n\t\t\t</div>\n\t\t</div>\n\n\t</div>\n\n\t<script type=\"text/javascript\" src=\"../dist/skrollr.min.js\"></script>\n\n\t<script type=\"text/javascript\">\n\tskrollr.init({\n\t\tforceHeight: false\n\t});\n\t</script>\n</body>\n\n</html>\n"
  },
  {
    "path": "examples/bg_constant_speed_less.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\n\t<meta name=\"viewport\" content=\"width=device-width, initial-scale=1, user-scalable=no\">\n\n\t<title>Background scroll - less content</title>\n\n\t<style type=\"text/css\">\n\tbody {\n\t\tbackground:url(images/bubbles.png) repeat fixed;\n\t}\n\n\t#center {\n\t\tbackground:#f9f9f9;\n\t\tbackground:rgba(240,240,240,.7);\n\t\twidth:90%;\n\t\tpadding:1em;\n\t\tmargin:1em auto;\n\t\tborder:1px solid #bbb;\n\t}\n\t</style>\n</head>\n\n<body data-0=\"background-position:0px 0px;\" data-100000=\"background-position:0px -50000px;\">\n\t<div id=\"skrollr-body\">\n\t\t<div id=\"center\">\n\t\t\t<h1>Parallax background</h1>\n\t\t\t<p>Demo of background scrolling at constant speed independent of content height.</p>\n\t\t\t<p>less content - <a href=\"bg_constant_speed_more.html\">more content</a></p>\n\t\t\t<hr />\n\t\t\t<p>\n\t\t\t\tShort loin tail salami, shank andouille short ribs flank prosciutto leberkas tenderloin chuck shankle kielbasa fatback. Ball tip rump meatloaf, drumstick frankfurter tongue jowl ham hock turducken. Shoulder shank chicken, ribeye shankle venison salami andouille pork tenderloin. Pork chop t-bone flank, pig chuck meatball cow ground round meatloaf shank bacon hamburger ribeye. Pig salami pastrami, shoulder beef ribs boudin biltong drumstick. Tail pig t-bone, capicola bresaola ball tip sausage jowl flank rump kielbasa chicken speck. Shoulder turkey spare ribs sausage corned beef ground round filet mignon tenderloin tail.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tBoudin shank ham hock beef, jowl brisket pork loin jerky kielbasa spare ribs andouille cow flank ground round. Jowl bacon chuck speck, swine kielbasa short loin tenderloin sausage. Pork chop short loin swine, cow tri-tip kielbasa capicola. Chicken bresaola pork chop drumstick chuck, sausage short ribs flank sirloin hamburger. Cow frankfurter chicken prosciutto sirloin ball tip, tail beef strip steak swine. Speck sirloin turducken pancetta short loin tenderloin.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tRibeye shoulder biltong venison beef tri-tip. Bresaola ham hamburger andouille turkey brisket, short loin frankfurter chicken corned beef filet mignon pancetta. Shoulder flank biltong, pork chop turkey cow jowl venison bresaola pork belly sirloin t-bone sausage swine ribeye. Sausage brisket beef, chicken spare ribs hamburger tail meatloaf pig tenderloin pork belly biltong. Pancetta tri-tip pork loin rump pastrami, drumstick flank turkey. Jowl ground round pork short ribs, boudin sirloin venison short loin pig ham.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tAndouille pork chuck speck, leberkas prosciutto turducken jerky brisket frankfurter ball tip filet mignon shankle beef bacon. Turducken jowl pork biltong, andouille hamburger kielbasa. Meatball capicola shoulder ground round, ball tip spare ribs frankfurter rump t-bone beef ribs. Beef ribs brisket filet mignon pork loin kielbasa jowl, t-bone ribeye short loin spare ribs tri-tip drumstick frankfurter tenderloin ham hock. T-bone beef ham hock, speck chicken chuck biltong meatball tail bacon shank turkey flank.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tTri-tip sausage tail meatloaf. Andouille salami leberkas, shank ham ribeye sirloin drumstick. Pork pork chop shankle, jowl spare ribs beef tongue meatball tri-tip beef ribs leberkas ham turkey. Andouille pastrami flank sirloin, beef tenderloin bresaola boudin chicken speck filet mignon prosciutto. Tri-tip drumstick sausage pancetta shoulder, short loin pork chop tongue chicken ham hock salami flank cow ribeye. Chuck short ribs speck bresaola, drumstick ham capicola beef ribs tri-tip meatloaf ball tip swine. Filet mignon turducken ribeye, venison tri-tip meatloaf bacon shankle beef ball tip pork flank pig beef ribs kielbasa.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tShort loin tail salami, shank andouille short ribs flank prosciutto leberkas tenderloin chuck shankle kielbasa fatback. Ball tip rump meatloaf, drumstick frankfurter tongue jowl ham hock turducken. Shoulder shank chicken, ribeye shankle venison salami andouille pork tenderloin. Pork chop t-bone flank, pig chuck meatball cow ground round meatloaf shank bacon hamburger ribeye. Pig salami pastrami, shoulder beef ribs boudin biltong drumstick. Tail pig t-bone, capicola bresaola ball tip sausage jowl flank rump kielbasa chicken speck. Shoulder turkey spare ribs sausage corned beef ground round filet mignon tenderloin tail.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tBoudin shank ham hock beef, jowl brisket pork loin jerky kielbasa spare ribs andouille cow flank ground round. Jowl bacon chuck speck, swine kielbasa short loin tenderloin sausage. Pork chop short loin swine, cow tri-tip kielbasa capicola. Chicken bresaola pork chop drumstick chuck, sausage short ribs flank sirloin hamburger. Cow frankfurter chicken prosciutto sirloin ball tip, tail beef strip steak swine. Speck sirloin turducken pancetta short loin tenderloin.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tRibeye shoulder biltong venison beef tri-tip. Bresaola ham hamburger andouille turkey brisket, short loin frankfurter chicken corned beef filet mignon pancetta. Shoulder flank biltong, pork chop turkey cow jowl venison bresaola pork belly sirloin t-bone sausage swine ribeye. Sausage brisket beef, chicken spare ribs hamburger tail meatloaf pig tenderloin pork belly biltong. Pancetta tri-tip pork loin rump pastrami, drumstick flank turkey. Jowl ground round pork short ribs, boudin sirloin venison short loin pig ham.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tAndouille pork chuck speck, leberkas prosciutto turducken jerky brisket frankfurter ball tip filet mignon shankle beef bacon. Turducken jowl pork biltong, andouille hamburger kielbasa. Meatball capicola shoulder ground round, ball tip spare ribs frankfurter rump t-bone beef ribs. Beef ribs brisket filet mignon pork loin kielbasa jowl, t-bone ribeye short loin spare ribs tri-tip drumstick frankfurter tenderloin ham hock. T-bone beef ham hock, speck chicken chuck biltong meatball tail bacon shank turkey flank.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tTri-tip sausage tail meatloaf. Andouille salami leberkas, shank ham ribeye sirloin drumstick. Pork pork chop shankle, jowl spare ribs beef tongue meatball tri-tip beef ribs leberkas ham turkey. Andouille pastrami flank sirloin, beef tenderloin bresaola boudin chicken speck filet mignon prosciutto. Tri-tip drumstick sausage pancetta shoulder, short loin pork chop tongue chicken ham hock salami flank cow ribeye. Chuck short ribs speck bresaola, drumstick ham capicola beef ribs tri-tip meatloaf ball tip swine. Filet mignon turducken ribeye, venison tri-tip meatloaf bacon shankle beef ball tip pork flank pig beef ribs kielbasa.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tShort loin tail salami, shank andouille short ribs flank prosciutto leberkas tenderloin chuck shankle kielbasa fatback. Ball tip rump meatloaf, drumstick frankfurter tongue jowl ham hock turducken. Shoulder shank chicken, ribeye shankle venison salami andouille pork tenderloin. Pork chop t-bone flank, pig chuck meatball cow ground round meatloaf shank bacon hamburger ribeye. Pig salami pastrami, shoulder beef ribs boudin biltong drumstick. Tail pig t-bone, capicola bresaola ball tip sausage jowl flank rump kielbasa chicken speck. Shoulder turkey spare ribs sausage corned beef ground round filet mignon tenderloin tail.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tBoudin shank ham hock beef, jowl brisket pork loin jerky kielbasa spare ribs andouille cow flank ground round. Jowl bacon chuck speck, swine kielbasa short loin tenderloin sausage. Pork chop short loin swine, cow tri-tip kielbasa capicola. Chicken bresaola pork chop drumstick chuck, sausage short ribs flank sirloin hamburger. Cow frankfurter chicken prosciutto sirloin ball tip, tail beef strip steak swine. Speck sirloin turducken pancetta short loin tenderloin.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tRibeye shoulder biltong venison beef tri-tip. Bresaola ham hamburger andouille turkey brisket, short loin frankfurter chicken corned beef filet mignon pancetta. Shoulder flank biltong, pork chop turkey cow jowl venison bresaola pork belly sirloin t-bone sausage swine ribeye. Sausage brisket beef, chicken spare ribs hamburger tail meatloaf pig tenderloin pork belly biltong. Pancetta tri-tip pork loin rump pastrami, drumstick flank turkey. Jowl ground round pork short ribs, boudin sirloin venison short loin pig ham.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tAndouille pork chuck speck, leberkas prosciutto turducken jerky brisket frankfurter ball tip filet mignon shankle beef bacon. Turducken jowl pork biltong, andouille hamburger kielbasa. Meatball capicola shoulder ground round, ball tip spare ribs frankfurter rump t-bone beef ribs. Beef ribs brisket filet mignon pork loin kielbasa jowl, t-bone ribeye short loin spare ribs tri-tip drumstick frankfurter tenderloin ham hock. T-bone beef ham hock, speck chicken chuck biltong meatball tail bacon shank turkey flank.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tTri-tip sausage tail meatloaf. Andouille salami leberkas, shank ham ribeye sirloin drumstick. Pork pork chop shankle, jowl spare ribs beef tongue meatball tri-tip beef ribs leberkas ham turkey. Andouille pastrami flank sirloin, beef tenderloin bresaola boudin chicken speck filet mignon prosciutto. Tri-tip drumstick sausage pancetta shoulder, short loin pork chop tongue chicken ham hock salami flank cow ribeye. Chuck short ribs speck bresaola, drumstick ham capicola beef ribs tri-tip meatloaf ball tip swine. Filet mignon turducken ribeye, venison tri-tip meatloaf bacon shankle beef ball tip pork flank pig beef ribs kielbasa.\n\t\t\t</p>\n\t\t</div>\n\t</div>\n\n\t<script type=\"text/javascript\" src=\"../dist/skrollr.min.js\"></script>\n\n\t<script type=\"text/javascript\">\n\tskrollr.init({\n\t\tforceHeight: false\n\t});\n\t</script>\n</body>\n\n</html>\n"
  },
  {
    "path": "examples/bg_constant_speed_more.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\n\t<meta name=\"viewport\" content=\"width=device-width, initial-scale=1, user-scalable=no\">\n\n\t<title>Background scroll - more content</title>\n\n\t<style type=\"text/css\">\n\tbody {\n\t\tbackground:url(images/bubbles.png) repeat fixed;\n\t}\n\n\t#center {\n\t\tbackground:#f9f9f9;\n\t\tbackground:rgba(240,240,240,.7);\n\t\twidth:90%;\n\t\tpadding:1em;\n\t\tmargin:1em auto;\n\t\tborder:1px solid #bbb;\n\t}\n\t</style>\n</head>\n\n<body data-0=\"background-position:0px 0px;\" data-100000=\"background-position:0px -50000px;\">\n\t<div id=\"skrollr-body\">\n\t\t<div id=\"center\">\n\t\t\t<h1>Parallax background</h1>\n\t\t\t<p>Demo of background scrolling at constant speed independent of content height.</p>\n\t\t\t<p><a href=\"bg_constant_speed_less.html\">less content</a> - more content</p>\n\t\t\t<hr />\n\t\t\t<p>\n\t\t\t\tShort loin tail salami, shank andouille short ribs flank prosciutto leberkas tenderloin chuck shankle kielbasa fatback. Ball tip rump meatloaf, drumstick frankfurter tongue jowl ham hock turducken. Shoulder shank chicken, ribeye shankle venison salami andouille pork tenderloin. Pork chop t-bone flank, pig chuck meatball cow ground round meatloaf shank bacon hamburger ribeye. Pig salami pastrami, shoulder beef ribs boudin biltong drumstick. Tail pig t-bone, capicola bresaola ball tip sausage jowl flank rump kielbasa chicken speck. Shoulder turkey spare ribs sausage corned beef ground round filet mignon tenderloin tail.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tBoudin shank ham hock beef, jowl brisket pork loin jerky kielbasa spare ribs andouille cow flank ground round. Jowl bacon chuck speck, swine kielbasa short loin tenderloin sausage. Pork chop short loin swine, cow tri-tip kielbasa capicola. Chicken bresaola pork chop drumstick chuck, sausage short ribs flank sirloin hamburger. Cow frankfurter chicken prosciutto sirloin ball tip, tail beef strip steak swine. Speck sirloin turducken pancetta short loin tenderloin.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tRibeye shoulder biltong venison beef tri-tip. Bresaola ham hamburger andouille turkey brisket, short loin frankfurter chicken corned beef filet mignon pancetta. Shoulder flank biltong, pork chop turkey cow jowl venison bresaola pork belly sirloin t-bone sausage swine ribeye. Sausage brisket beef, chicken spare ribs hamburger tail meatloaf pig tenderloin pork belly biltong. Pancetta tri-tip pork loin rump pastrami, drumstick flank turkey. Jowl ground round pork short ribs, boudin sirloin venison short loin pig ham.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tAndouille pork chuck speck, leberkas prosciutto turducken jerky brisket frankfurter ball tip filet mignon shankle beef bacon. Turducken jowl pork biltong, andouille hamburger kielbasa. Meatball capicola shoulder ground round, ball tip spare ribs frankfurter rump t-bone beef ribs. Beef ribs brisket filet mignon pork loin kielbasa jowl, t-bone ribeye short loin spare ribs tri-tip drumstick frankfurter tenderloin ham hock. T-bone beef ham hock, speck chicken chuck biltong meatball tail bacon shank turkey flank.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tTri-tip sausage tail meatloaf. Andouille salami leberkas, shank ham ribeye sirloin drumstick. Pork pork chop shankle, jowl spare ribs beef tongue meatball tri-tip beef ribs leberkas ham turkey. Andouille pastrami flank sirloin, beef tenderloin bresaola boudin chicken speck filet mignon prosciutto. Tri-tip drumstick sausage pancetta shoulder, short loin pork chop tongue chicken ham hock salami flank cow ribeye. Chuck short ribs speck bresaola, drumstick ham capicola beef ribs tri-tip meatloaf ball tip swine. Filet mignon turducken ribeye, venison tri-tip meatloaf bacon shankle beef ball tip pork flank pig beef ribs kielbasa.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tShort loin tail salami, shank andouille short ribs flank prosciutto leberkas tenderloin chuck shankle kielbasa fatback. Ball tip rump meatloaf, drumstick frankfurter tongue jowl ham hock turducken. Shoulder shank chicken, ribeye shankle venison salami andouille pork tenderloin. Pork chop t-bone flank, pig chuck meatball cow ground round meatloaf shank bacon hamburger ribeye. Pig salami pastrami, shoulder beef ribs boudin biltong drumstick. Tail pig t-bone, capicola bresaola ball tip sausage jowl flank rump kielbasa chicken speck. Shoulder turkey spare ribs sausage corned beef ground round filet mignon tenderloin tail.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tBoudin shank ham hock beef, jowl brisket pork loin jerky kielbasa spare ribs andouille cow flank ground round. Jowl bacon chuck speck, swine kielbasa short loin tenderloin sausage. Pork chop short loin swine, cow tri-tip kielbasa capicola. Chicken bresaola pork chop drumstick chuck, sausage short ribs flank sirloin hamburger. Cow frankfurter chicken prosciutto sirloin ball tip, tail beef strip steak swine. Speck sirloin turducken pancetta short loin tenderloin.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tRibeye shoulder biltong venison beef tri-tip. Bresaola ham hamburger andouille turkey brisket, short loin frankfurter chicken corned beef filet mignon pancetta. Shoulder flank biltong, pork chop turkey cow jowl venison bresaola pork belly sirloin t-bone sausage swine ribeye. Sausage brisket beef, chicken spare ribs hamburger tail meatloaf pig tenderloin pork belly biltong. Pancetta tri-tip pork loin rump pastrami, drumstick flank turkey. Jowl ground round pork short ribs, boudin sirloin venison short loin pig ham.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tAndouille pork chuck speck, leberkas prosciutto turducken jerky brisket frankfurter ball tip filet mignon shankle beef bacon. Turducken jowl pork biltong, andouille hamburger kielbasa. Meatball capicola shoulder ground round, ball tip spare ribs frankfurter rump t-bone beef ribs. Beef ribs brisket filet mignon pork loin kielbasa jowl, t-bone ribeye short loin spare ribs tri-tip drumstick frankfurter tenderloin ham hock. T-bone beef ham hock, speck chicken chuck biltong meatball tail bacon shank turkey flank.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tTri-tip sausage tail meatloaf. Andouille salami leberkas, shank ham ribeye sirloin drumstick. Pork pork chop shankle, jowl spare ribs beef tongue meatball tri-tip beef ribs leberkas ham turkey. Andouille pastrami flank sirloin, beef tenderloin bresaola boudin chicken speck filet mignon prosciutto. Tri-tip drumstick sausage pancetta shoulder, short loin pork chop tongue chicken ham hock salami flank cow ribeye. Chuck short ribs speck bresaola, drumstick ham capicola beef ribs tri-tip meatloaf ball tip swine. Filet mignon turducken ribeye, venison tri-tip meatloaf bacon shankle beef ball tip pork flank pig beef ribs kielbasa.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tShort loin tail salami, shank andouille short ribs flank prosciutto leberkas tenderloin chuck shankle kielbasa fatback. Ball tip rump meatloaf, drumstick frankfurter tongue jowl ham hock turducken. Shoulder shank chicken, ribeye shankle venison salami andouille pork tenderloin. Pork chop t-bone flank, pig chuck meatball cow ground round meatloaf shank bacon hamburger ribeye. Pig salami pastrami, shoulder beef ribs boudin biltong drumstick. Tail pig t-bone, capicola bresaola ball tip sausage jowl flank rump kielbasa chicken speck. Shoulder turkey spare ribs sausage corned beef ground round filet mignon tenderloin tail.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tBoudin shank ham hock beef, jowl brisket pork loin jerky kielbasa spare ribs andouille cow flank ground round. Jowl bacon chuck speck, swine kielbasa short loin tenderloin sausage. Pork chop short loin swine, cow tri-tip kielbasa capicola. Chicken bresaola pork chop drumstick chuck, sausage short ribs flank sirloin hamburger. Cow frankfurter chicken prosciutto sirloin ball tip, tail beef strip steak swine. Speck sirloin turducken pancetta short loin tenderloin.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tRibeye shoulder biltong venison beef tri-tip. Bresaola ham hamburger andouille turkey brisket, short loin frankfurter chicken corned beef filet mignon pancetta. Shoulder flank biltong, pork chop turkey cow jowl venison bresaola pork belly sirloin t-bone sausage swine ribeye. Sausage brisket beef, chicken spare ribs hamburger tail meatloaf pig tenderloin pork belly biltong. Pancetta tri-tip pork loin rump pastrami, drumstick flank turkey. Jowl ground round pork short ribs, boudin sirloin venison short loin pig ham.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tAndouille pork chuck speck, leberkas prosciutto turducken jerky brisket frankfurter ball tip filet mignon shankle beef bacon. Turducken jowl pork biltong, andouille hamburger kielbasa. Meatball capicola shoulder ground round, ball tip spare ribs frankfurter rump t-bone beef ribs. Beef ribs brisket filet mignon pork loin kielbasa jowl, t-bone ribeye short loin spare ribs tri-tip drumstick frankfurter tenderloin ham hock. T-bone beef ham hock, speck chicken chuck biltong meatball tail bacon shank turkey flank.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tTri-tip sausage tail meatloaf. Andouille salami leberkas, shank ham ribeye sirloin drumstick. Pork pork chop shankle, jowl spare ribs beef tongue meatball tri-tip beef ribs leberkas ham turkey. Andouille pastrami flank sirloin, beef tenderloin bresaola boudin chicken speck filet mignon prosciutto. Tri-tip drumstick sausage pancetta shoulder, short loin pork chop tongue chicken ham hock salami flank cow ribeye. Chuck short ribs speck bresaola, drumstick ham capicola beef ribs tri-tip meatloaf ball tip swine. Filet mignon turducken ribeye, venison tri-tip meatloaf bacon shankle beef ball tip pork flank pig beef ribs kielbasa.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tShort loin tail salami, shank andouille short ribs flank prosciutto leberkas tenderloin chuck shankle kielbasa fatback. Ball tip rump meatloaf, drumstick frankfurter tongue jowl ham hock turducken. Shoulder shank chicken, ribeye shankle venison salami andouille pork tenderloin. Pork chop t-bone flank, pig chuck meatball cow ground round meatloaf shank bacon hamburger ribeye. Pig salami pastrami, shoulder beef ribs boudin biltong drumstick. Tail pig t-bone, capicola bresaola ball tip sausage jowl flank rump kielbasa chicken speck. Shoulder turkey spare ribs sausage corned beef ground round filet mignon tenderloin tail.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tBoudin shank ham hock beef, jowl brisket pork loin jerky kielbasa spare ribs andouille cow flank ground round. Jowl bacon chuck speck, swine kielbasa short loin tenderloin sausage. Pork chop short loin swine, cow tri-tip kielbasa capicola. Chicken bresaola pork chop drumstick chuck, sausage short ribs flank sirloin hamburger. Cow frankfurter chicken prosciutto sirloin ball tip, tail beef strip steak swine. Speck sirloin turducken pancetta short loin tenderloin.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tRibeye shoulder biltong venison beef tri-tip. Bresaola ham hamburger andouille turkey brisket, short loin frankfurter chicken corned beef filet mignon pancetta. Shoulder flank biltong, pork chop turkey cow jowl venison bresaola pork belly sirloin t-bone sausage swine ribeye. Sausage brisket beef, chicken spare ribs hamburger tail meatloaf pig tenderloin pork belly biltong. Pancetta tri-tip pork loin rump pastrami, drumstick flank turkey. Jowl ground round pork short ribs, boudin sirloin venison short loin pig ham.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tAndouille pork chuck speck, leberkas prosciutto turducken jerky brisket frankfurter ball tip filet mignon shankle beef bacon. Turducken jowl pork biltong, andouille hamburger kielbasa. Meatball capicola shoulder ground round, ball tip spare ribs frankfurter rump t-bone beef ribs. Beef ribs brisket filet mignon pork loin kielbasa jowl, t-bone ribeye short loin spare ribs tri-tip drumstick frankfurter tenderloin ham hock. T-bone beef ham hock, speck chicken chuck biltong meatball tail bacon shank turkey flank.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tTri-tip sausage tail meatloaf. Andouille salami leberkas, shank ham ribeye sirloin drumstick. Pork pork chop shankle, jowl spare ribs beef tongue meatball tri-tip beef ribs leberkas ham turkey. Andouille pastrami flank sirloin, beef tenderloin bresaola boudin chicken speck filet mignon prosciutto. Tri-tip drumstick sausage pancetta shoulder, short loin pork chop tongue chicken ham hock salami flank cow ribeye. Chuck short ribs speck bresaola, drumstick ham capicola beef ribs tri-tip meatloaf ball tip swine. Filet mignon turducken ribeye, venison tri-tip meatloaf bacon shankle beef ball tip pork flank pig beef ribs kielbasa.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tShort loin tail salami, shank andouille short ribs flank prosciutto leberkas tenderloin chuck shankle kielbasa fatback. Ball tip rump meatloaf, drumstick frankfurter tongue jowl ham hock turducken. Shoulder shank chicken, ribeye shankle venison salami andouille pork tenderloin. Pork chop t-bone flank, pig chuck meatball cow ground round meatloaf shank bacon hamburger ribeye. Pig salami pastrami, shoulder beef ribs boudin biltong drumstick. Tail pig t-bone, capicola bresaola ball tip sausage jowl flank rump kielbasa chicken speck. Shoulder turkey spare ribs sausage corned beef ground round filet mignon tenderloin tail.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tBoudin shank ham hock beef, jowl brisket pork loin jerky kielbasa spare ribs andouille cow flank ground round. Jowl bacon chuck speck, swine kielbasa short loin tenderloin sausage. Pork chop short loin swine, cow tri-tip kielbasa capicola. Chicken bresaola pork chop drumstick chuck, sausage short ribs flank sirloin hamburger. Cow frankfurter chicken prosciutto sirloin ball tip, tail beef strip steak swine. Speck sirloin turducken pancetta short loin tenderloin.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tRibeye shoulder biltong venison beef tri-tip. Bresaola ham hamburger andouille turkey brisket, short loin frankfurter chicken corned beef filet mignon pancetta. Shoulder flank biltong, pork chop turkey cow jowl venison bresaola pork belly sirloin t-bone sausage swine ribeye. Sausage brisket beef, chicken spare ribs hamburger tail meatloaf pig tenderloin pork belly biltong. Pancetta tri-tip pork loin rump pastrami, drumstick flank turkey. Jowl ground round pork short ribs, boudin sirloin venison short loin pig ham.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tAndouille pork chuck speck, leberkas prosciutto turducken jerky brisket frankfurter ball tip filet mignon shankle beef bacon. Turducken jowl pork biltong, andouille hamburger kielbasa. Meatball capicola shoulder ground round, ball tip spare ribs frankfurter rump t-bone beef ribs. Beef ribs brisket filet mignon pork loin kielbasa jowl, t-bone ribeye short loin spare ribs tri-tip drumstick frankfurter tenderloin ham hock. T-bone beef ham hock, speck chicken chuck biltong meatball tail bacon shank turkey flank.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tTri-tip sausage tail meatloaf. Andouille salami leberkas, shank ham ribeye sirloin drumstick. Pork pork chop shankle, jowl spare ribs beef tongue meatball tri-tip beef ribs leberkas ham turkey. Andouille pastrami flank sirloin, beef tenderloin bresaola boudin chicken speck filet mignon prosciutto. Tri-tip drumstick sausage pancetta shoulder, short loin pork chop tongue chicken ham hock salami flank cow ribeye. Chuck short ribs speck bresaola, drumstick ham capicola beef ribs tri-tip meatloaf ball tip swine. Filet mignon turducken ribeye, venison tri-tip meatloaf bacon shankle beef ball tip pork flank pig beef ribs kielbasa.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tShort loin tail salami, shank andouille short ribs flank prosciutto leberkas tenderloin chuck shankle kielbasa fatback. Ball tip rump meatloaf, drumstick frankfurter tongue jowl ham hock turducken. Shoulder shank chicken, ribeye shankle venison salami andouille pork tenderloin. Pork chop t-bone flank, pig chuck meatball cow ground round meatloaf shank bacon hamburger ribeye. Pig salami pastrami, shoulder beef ribs boudin biltong drumstick. Tail pig t-bone, capicola bresaola ball tip sausage jowl flank rump kielbasa chicken speck. Shoulder turkey spare ribs sausage corned beef ground round filet mignon tenderloin tail.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tBoudin shank ham hock beef, jowl brisket pork loin jerky kielbasa spare ribs andouille cow flank ground round. Jowl bacon chuck speck, swine kielbasa short loin tenderloin sausage. Pork chop short loin swine, cow tri-tip kielbasa capicola. Chicken bresaola pork chop drumstick chuck, sausage short ribs flank sirloin hamburger. Cow frankfurter chicken prosciutto sirloin ball tip, tail beef strip steak swine. Speck sirloin turducken pancetta short loin tenderloin.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tRibeye shoulder biltong venison beef tri-tip. Bresaola ham hamburger andouille turkey brisket, short loin frankfurter chicken corned beef filet mignon pancetta. Shoulder flank biltong, pork chop turkey cow jowl venison bresaola pork belly sirloin t-bone sausage swine ribeye. Sausage brisket beef, chicken spare ribs hamburger tail meatloaf pig tenderloin pork belly biltong. Pancetta tri-tip pork loin rump pastrami, drumstick flank turkey. Jowl ground round pork short ribs, boudin sirloin venison short loin pig ham.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tAndouille pork chuck speck, leberkas prosciutto turducken jerky brisket frankfurter ball tip filet mignon shankle beef bacon. Turducken jowl pork biltong, andouille hamburger kielbasa. Meatball capicola shoulder ground round, ball tip spare ribs frankfurter rump t-bone beef ribs. Beef ribs brisket filet mignon pork loin kielbasa jowl, t-bone ribeye short loin spare ribs tri-tip drumstick frankfurter tenderloin ham hock. T-bone beef ham hock, speck chicken chuck biltong meatball tail bacon shank turkey flank.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tTri-tip sausage tail meatloaf. Andouille salami leberkas, shank ham ribeye sirloin drumstick. Pork pork chop shankle, jowl spare ribs beef tongue meatball tri-tip beef ribs leberkas ham turkey. Andouille pastrami flank sirloin, beef tenderloin bresaola boudin chicken speck filet mignon prosciutto. Tri-tip drumstick sausage pancetta shoulder, short loin pork chop tongue chicken ham hock salami flank cow ribeye. Chuck short ribs speck bresaola, drumstick ham capicola beef ribs tri-tip meatloaf ball tip swine. Filet mignon turducken ribeye, venison tri-tip meatloaf bacon shankle beef ball tip pork flank pig beef ribs kielbasa.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tShort loin tail salami, shank andouille short ribs flank prosciutto leberkas tenderloin chuck shankle kielbasa fatback. Ball tip rump meatloaf, drumstick frankfurter tongue jowl ham hock turducken. Shoulder shank chicken, ribeye shankle venison salami andouille pork tenderloin. Pork chop t-bone flank, pig chuck meatball cow ground round meatloaf shank bacon hamburger ribeye. Pig salami pastrami, shoulder beef ribs boudin biltong drumstick. Tail pig t-bone, capicola bresaola ball tip sausage jowl flank rump kielbasa chicken speck. Shoulder turkey spare ribs sausage corned beef ground round filet mignon tenderloin tail.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tBoudin shank ham hock beef, jowl brisket pork loin jerky kielbasa spare ribs andouille cow flank ground round. Jowl bacon chuck speck, swine kielbasa short loin tenderloin sausage. Pork chop short loin swine, cow tri-tip kielbasa capicola. Chicken bresaola pork chop drumstick chuck, sausage short ribs flank sirloin hamburger. Cow frankfurter chicken prosciutto sirloin ball tip, tail beef strip steak swine. Speck sirloin turducken pancetta short loin tenderloin.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tRibeye shoulder biltong venison beef tri-tip. Bresaola ham hamburger andouille turkey brisket, short loin frankfurter chicken corned beef filet mignon pancetta. Shoulder flank biltong, pork chop turkey cow jowl venison bresaola pork belly sirloin t-bone sausage swine ribeye. Sausage brisket beef, chicken spare ribs hamburger tail meatloaf pig tenderloin pork belly biltong. Pancetta tri-tip pork loin rump pastrami, drumstick flank turkey. Jowl ground round pork short ribs, boudin sirloin venison short loin pig ham.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tAndouille pork chuck speck, leberkas prosciutto turducken jerky brisket frankfurter ball tip filet mignon shankle beef bacon. Turducken jowl pork biltong, andouille hamburger kielbasa. Meatball capicola shoulder ground round, ball tip spare ribs frankfurter rump t-bone beef ribs. Beef ribs brisket filet mignon pork loin kielbasa jowl, t-bone ribeye short loin spare ribs tri-tip drumstick frankfurter tenderloin ham hock. T-bone beef ham hock, speck chicken chuck biltong meatball tail bacon shank turkey flank.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tTri-tip sausage tail meatloaf. Andouille salami leberkas, shank ham ribeye sirloin drumstick. Pork pork chop shankle, jowl spare ribs beef tongue meatball tri-tip beef ribs leberkas ham turkey. Andouille pastrami flank sirloin, beef tenderloin bresaola boudin chicken speck filet mignon prosciutto. Tri-tip drumstick sausage pancetta shoulder, short loin pork chop tongue chicken ham hock salami flank cow ribeye. Chuck short ribs speck bresaola, drumstick ham capicola beef ribs tri-tip meatloaf ball tip swine. Filet mignon turducken ribeye, venison tri-tip meatloaf bacon shankle beef ball tip pork flank pig beef ribs kielbasa.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tShort loin tail salami, shank andouille short ribs flank prosciutto leberkas tenderloin chuck shankle kielbasa fatback. Ball tip rump meatloaf, drumstick frankfurter tongue jowl ham hock turducken. Shoulder shank chicken, ribeye shankle venison salami andouille pork tenderloin. Pork chop t-bone flank, pig chuck meatball cow ground round meatloaf shank bacon hamburger ribeye. Pig salami pastrami, shoulder beef ribs boudin biltong drumstick. Tail pig t-bone, capicola bresaola ball tip sausage jowl flank rump kielbasa chicken speck. Shoulder turkey spare ribs sausage corned beef ground round filet mignon tenderloin tail.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tBoudin shank ham hock beef, jowl brisket pork loin jerky kielbasa spare ribs andouille cow flank ground round. Jowl bacon chuck speck, swine kielbasa short loin tenderloin sausage. Pork chop short loin swine, cow tri-tip kielbasa capicola. Chicken bresaola pork chop drumstick chuck, sausage short ribs flank sirloin hamburger. Cow frankfurter chicken prosciutto sirloin ball tip, tail beef strip steak swine. Speck sirloin turducken pancetta short loin tenderloin.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tRibeye shoulder biltong venison beef tri-tip. Bresaola ham hamburger andouille turkey brisket, short loin frankfurter chicken corned beef filet mignon pancetta. Shoulder flank biltong, pork chop turkey cow jowl venison bresaola pork belly sirloin t-bone sausage swine ribeye. Sausage brisket beef, chicken spare ribs hamburger tail meatloaf pig tenderloin pork belly biltong. Pancetta tri-tip pork loin rump pastrami, drumstick flank turkey. Jowl ground round pork short ribs, boudin sirloin venison short loin pig ham.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tAndouille pork chuck speck, leberkas prosciutto turducken jerky brisket frankfurter ball tip filet mignon shankle beef bacon. Turducken jowl pork biltong, andouille hamburger kielbasa. Meatball capicola shoulder ground round, ball tip spare ribs frankfurter rump t-bone beef ribs. Beef ribs brisket filet mignon pork loin kielbasa jowl, t-bone ribeye short loin spare ribs tri-tip drumstick frankfurter tenderloin ham hock. T-bone beef ham hock, speck chicken chuck biltong meatball tail bacon shank turkey flank.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tTri-tip sausage tail meatloaf. Andouille salami leberkas, shank ham ribeye sirloin drumstick. Pork pork chop shankle, jowl spare ribs beef tongue meatball tri-tip beef ribs leberkas ham turkey. Andouille pastrami flank sirloin, beef tenderloin bresaola boudin chicken speck filet mignon prosciutto. Tri-tip drumstick sausage pancetta shoulder, short loin pork chop tongue chicken ham hock salami flank cow ribeye. Chuck short ribs speck bresaola, drumstick ham capicola beef ribs tri-tip meatloaf ball tip swine. Filet mignon turducken ribeye, venison tri-tip meatloaf bacon shankle beef ball tip pork flank pig beef ribs kielbasa.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tShort loin tail salami, shank andouille short ribs flank prosciutto leberkas tenderloin chuck shankle kielbasa fatback. Ball tip rump meatloaf, drumstick frankfurter tongue jowl ham hock turducken. Shoulder shank chicken, ribeye shankle venison salami andouille pork tenderloin. Pork chop t-bone flank, pig chuck meatball cow ground round meatloaf shank bacon hamburger ribeye. Pig salami pastrami, shoulder beef ribs boudin biltong drumstick. Tail pig t-bone, capicola bresaola ball tip sausage jowl flank rump kielbasa chicken speck. Shoulder turkey spare ribs sausage corned beef ground round filet mignon tenderloin tail.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tBoudin shank ham hock beef, jowl brisket pork loin jerky kielbasa spare ribs andouille cow flank ground round. Jowl bacon chuck speck, swine kielbasa short loin tenderloin sausage. Pork chop short loin swine, cow tri-tip kielbasa capicola. Chicken bresaola pork chop drumstick chuck, sausage short ribs flank sirloin hamburger. Cow frankfurter chicken prosciutto sirloin ball tip, tail beef strip steak swine. Speck sirloin turducken pancetta short loin tenderloin.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tRibeye shoulder biltong venison beef tri-tip. Bresaola ham hamburger andouille turkey brisket, short loin frankfurter chicken corned beef filet mignon pancetta. Shoulder flank biltong, pork chop turkey cow jowl venison bresaola pork belly sirloin t-bone sausage swine ribeye. Sausage brisket beef, chicken spare ribs hamburger tail meatloaf pig tenderloin pork belly biltong. Pancetta tri-tip pork loin rump pastrami, drumstick flank turkey. Jowl ground round pork short ribs, boudin sirloin venison short loin pig ham.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tAndouille pork chuck speck, leberkas prosciutto turducken jerky brisket frankfurter ball tip filet mignon shankle beef bacon. Turducken jowl pork biltong, andouille hamburger kielbasa. Meatball capicola shoulder ground round, ball tip spare ribs frankfurter rump t-bone beef ribs. Beef ribs brisket filet mignon pork loin kielbasa jowl, t-bone ribeye short loin spare ribs tri-tip drumstick frankfurter tenderloin ham hock. T-bone beef ham hock, speck chicken chuck biltong meatball tail bacon shank turkey flank.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tTri-tip sausage tail meatloaf. Andouille salami leberkas, shank ham ribeye sirloin drumstick. Pork pork chop shankle, jowl spare ribs beef tongue meatball tri-tip beef ribs leberkas ham turkey. Andouille pastrami flank sirloin, beef tenderloin bresaola boudin chicken speck filet mignon prosciutto. Tri-tip drumstick sausage pancetta shoulder, short loin pork chop tongue chicken ham hock salami flank cow ribeye. Chuck short ribs speck bresaola, drumstick ham capicola beef ribs tri-tip meatloaf ball tip swine. Filet mignon turducken ribeye, venison tri-tip meatloaf bacon shankle beef ball tip pork flank pig beef ribs kielbasa.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tShort loin tail salami, shank andouille short ribs flank prosciutto leberkas tenderloin chuck shankle kielbasa fatback. Ball tip rump meatloaf, drumstick frankfurter tongue jowl ham hock turducken. Shoulder shank chicken, ribeye shankle venison salami andouille pork tenderloin. Pork chop t-bone flank, pig chuck meatball cow ground round meatloaf shank bacon hamburger ribeye. Pig salami pastrami, shoulder beef ribs boudin biltong drumstick. Tail pig t-bone, capicola bresaola ball tip sausage jowl flank rump kielbasa chicken speck. Shoulder turkey spare ribs sausage corned beef ground round filet mignon tenderloin tail.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tBoudin shank ham hock beef, jowl brisket pork loin jerky kielbasa spare ribs andouille cow flank ground round. Jowl bacon chuck speck, swine kielbasa short loin tenderloin sausage. Pork chop short loin swine, cow tri-tip kielbasa capicola. Chicken bresaola pork chop drumstick chuck, sausage short ribs flank sirloin hamburger. Cow frankfurter chicken prosciutto sirloin ball tip, tail beef strip steak swine. Speck sirloin turducken pancetta short loin tenderloin.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tRibeye shoulder biltong venison beef tri-tip. Bresaola ham hamburger andouille turkey brisket, short loin frankfurter chicken corned beef filet mignon pancetta. Shoulder flank biltong, pork chop turkey cow jowl venison bresaola pork belly sirloin t-bone sausage swine ribeye. Sausage brisket beef, chicken spare ribs hamburger tail meatloaf pig tenderloin pork belly biltong. Pancetta tri-tip pork loin rump pastrami, drumstick flank turkey. Jowl ground round pork short ribs, boudin sirloin venison short loin pig ham.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tAndouille pork chuck speck, leberkas prosciutto turducken jerky brisket frankfurter ball tip filet mignon shankle beef bacon. Turducken jowl pork biltong, andouille hamburger kielbasa. Meatball capicola shoulder ground round, ball tip spare ribs frankfurter rump t-bone beef ribs. Beef ribs brisket filet mignon pork loin kielbasa jowl, t-bone ribeye short loin spare ribs tri-tip drumstick frankfurter tenderloin ham hock. T-bone beef ham hock, speck chicken chuck biltong meatball tail bacon shank turkey flank.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tTri-tip sausage tail meatloaf. Andouille salami leberkas, shank ham ribeye sirloin drumstick. Pork pork chop shankle, jowl spare ribs beef tongue meatball tri-tip beef ribs leberkas ham turkey. Andouille pastrami flank sirloin, beef tenderloin bresaola boudin chicken speck filet mignon prosciutto. Tri-tip drumstick sausage pancetta shoulder, short loin pork chop tongue chicken ham hock salami flank cow ribeye. Chuck short ribs speck bresaola, drumstick ham capicola beef ribs tri-tip meatloaf ball tip swine. Filet mignon turducken ribeye, venison tri-tip meatloaf bacon shankle beef ball tip pork flank pig beef ribs kielbasa.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tShort loin tail salami, shank andouille short ribs flank prosciutto leberkas tenderloin chuck shankle kielbasa fatback. Ball tip rump meatloaf, drumstick frankfurter tongue jowl ham hock turducken. Shoulder shank chicken, ribeye shankle venison salami andouille pork tenderloin. Pork chop t-bone flank, pig chuck meatball cow ground round meatloaf shank bacon hamburger ribeye. Pig salami pastrami, shoulder beef ribs boudin biltong drumstick. Tail pig t-bone, capicola bresaola ball tip sausage jowl flank rump kielbasa chicken speck. Shoulder turkey spare ribs sausage corned beef ground round filet mignon tenderloin tail.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tBoudin shank ham hock beef, jowl brisket pork loin jerky kielbasa spare ribs andouille cow flank ground round. Jowl bacon chuck speck, swine kielbasa short loin tenderloin sausage. Pork chop short loin swine, cow tri-tip kielbasa capicola. Chicken bresaola pork chop drumstick chuck, sausage short ribs flank sirloin hamburger. Cow frankfurter chicken prosciutto sirloin ball tip, tail beef strip steak swine. Speck sirloin turducken pancetta short loin tenderloin.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tRibeye shoulder biltong venison beef tri-tip. Bresaola ham hamburger andouille turkey brisket, short loin frankfurter chicken corned beef filet mignon pancetta. Shoulder flank biltong, pork chop turkey cow jowl venison bresaola pork belly sirloin t-bone sausage swine ribeye. Sausage brisket beef, chicken spare ribs hamburger tail meatloaf pig tenderloin pork belly biltong. Pancetta tri-tip pork loin rump pastrami, drumstick flank turkey. Jowl ground round pork short ribs, boudin sirloin venison short loin pig ham.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tAndouille pork chuck speck, leberkas prosciutto turducken jerky brisket frankfurter ball tip filet mignon shankle beef bacon. Turducken jowl pork biltong, andouille hamburger kielbasa. Meatball capicola shoulder ground round, ball tip spare ribs frankfurter rump t-bone beef ribs. Beef ribs brisket filet mignon pork loin kielbasa jowl, t-bone ribeye short loin spare ribs tri-tip drumstick frankfurter tenderloin ham hock. T-bone beef ham hock, speck chicken chuck biltong meatball tail bacon shank turkey flank.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tTri-tip sausage tail meatloaf. Andouille salami leberkas, shank ham ribeye sirloin drumstick. Pork pork chop shankle, jowl spare ribs beef tongue meatball tri-tip beef ribs leberkas ham turkey. Andouille pastrami flank sirloin, beef tenderloin bresaola boudin chicken speck filet mignon prosciutto. Tri-tip drumstick sausage pancetta shoulder, short loin pork chop tongue chicken ham hock salami flank cow ribeye. Chuck short ribs speck bresaola, drumstick ham capicola beef ribs tri-tip meatloaf ball tip swine. Filet mignon turducken ribeye, venison tri-tip meatloaf bacon shankle beef ball tip pork flank pig beef ribs kielbasa.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tShort loin tail salami, shank andouille short ribs flank prosciutto leberkas tenderloin chuck shankle kielbasa fatback. Ball tip rump meatloaf, drumstick frankfurter tongue jowl ham hock turducken. Shoulder shank chicken, ribeye shankle venison salami andouille pork tenderloin. Pork chop t-bone flank, pig chuck meatball cow ground round meatloaf shank bacon hamburger ribeye. Pig salami pastrami, shoulder beef ribs boudin biltong drumstick. Tail pig t-bone, capicola bresaola ball tip sausage jowl flank rump kielbasa chicken speck. Shoulder turkey spare ribs sausage corned beef ground round filet mignon tenderloin tail.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tBoudin shank ham hock beef, jowl brisket pork loin jerky kielbasa spare ribs andouille cow flank ground round. Jowl bacon chuck speck, swine kielbasa short loin tenderloin sausage. Pork chop short loin swine, cow tri-tip kielbasa capicola. Chicken bresaola pork chop drumstick chuck, sausage short ribs flank sirloin hamburger. Cow frankfurter chicken prosciutto sirloin ball tip, tail beef strip steak swine. Speck sirloin turducken pancetta short loin tenderloin.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tRibeye shoulder biltong venison beef tri-tip. Bresaola ham hamburger andouille turkey brisket, short loin frankfurter chicken corned beef filet mignon pancetta. Shoulder flank biltong, pork chop turkey cow jowl venison bresaola pork belly sirloin t-bone sausage swine ribeye. Sausage brisket beef, chicken spare ribs hamburger tail meatloaf pig tenderloin pork belly biltong. Pancetta tri-tip pork loin rump pastrami, drumstick flank turkey. Jowl ground round pork short ribs, boudin sirloin venison short loin pig ham.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tAndouille pork chuck speck, leberkas prosciutto turducken jerky brisket frankfurter ball tip filet mignon shankle beef bacon. Turducken jowl pork biltong, andouille hamburger kielbasa. Meatball capicola shoulder ground round, ball tip spare ribs frankfurter rump t-bone beef ribs. Beef ribs brisket filet mignon pork loin kielbasa jowl, t-bone ribeye short loin spare ribs tri-tip drumstick frankfurter tenderloin ham hock. T-bone beef ham hock, speck chicken chuck biltong meatball tail bacon shank turkey flank.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tTri-tip sausage tail meatloaf. Andouille salami leberkas, shank ham ribeye sirloin drumstick. Pork pork chop shankle, jowl spare ribs beef tongue meatball tri-tip beef ribs leberkas ham turkey. Andouille pastrami flank sirloin, beef tenderloin bresaola boudin chicken speck filet mignon prosciutto. Tri-tip drumstick sausage pancetta shoulder, short loin pork chop tongue chicken ham hock salami flank cow ribeye. Chuck short ribs speck bresaola, drumstick ham capicola beef ribs tri-tip meatloaf ball tip swine. Filet mignon turducken ribeye, venison tri-tip meatloaf bacon shankle beef ball tip pork flank pig beef ribs kielbasa.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tShort loin tail salami, shank andouille short ribs flank prosciutto leberkas tenderloin chuck shankle kielbasa fatback. Ball tip rump meatloaf, drumstick frankfurter tongue jowl ham hock turducken. Shoulder shank chicken, ribeye shankle venison salami andouille pork tenderloin. Pork chop t-bone flank, pig chuck meatball cow ground round meatloaf shank bacon hamburger ribeye. Pig salami pastrami, shoulder beef ribs boudin biltong drumstick. Tail pig t-bone, capicola bresaola ball tip sausage jowl flank rump kielbasa chicken speck. Shoulder turkey spare ribs sausage corned beef ground round filet mignon tenderloin tail.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tBoudin shank ham hock beef, jowl brisket pork loin jerky kielbasa spare ribs andouille cow flank ground round. Jowl bacon chuck speck, swine kielbasa short loin tenderloin sausage. Pork chop short loin swine, cow tri-tip kielbasa capicola. Chicken bresaola pork chop drumstick chuck, sausage short ribs flank sirloin hamburger. Cow frankfurter chicken prosciutto sirloin ball tip, tail beef strip steak swine. Speck sirloin turducken pancetta short loin tenderloin.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tRibeye shoulder biltong venison beef tri-tip. Bresaola ham hamburger andouille turkey brisket, short loin frankfurter chicken corned beef filet mignon pancetta. Shoulder flank biltong, pork chop turkey cow jowl venison bresaola pork belly sirloin t-bone sausage swine ribeye. Sausage brisket beef, chicken spare ribs hamburger tail meatloaf pig tenderloin pork belly biltong. Pancetta tri-tip pork loin rump pastrami, drumstick flank turkey. Jowl ground round pork short ribs, boudin sirloin venison short loin pig ham.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tAndouille pork chuck speck, leberkas prosciutto turducken jerky brisket frankfurter ball tip filet mignon shankle beef bacon. Turducken jowl pork biltong, andouille hamburger kielbasa. Meatball capicola shoulder ground round, ball tip spare ribs frankfurter rump t-bone beef ribs. Beef ribs brisket filet mignon pork loin kielbasa jowl, t-bone ribeye short loin spare ribs tri-tip drumstick frankfurter tenderloin ham hock. T-bone beef ham hock, speck chicken chuck biltong meatball tail bacon shank turkey flank.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tTri-tip sausage tail meatloaf. Andouille salami leberkas, shank ham ribeye sirloin drumstick. Pork pork chop shankle, jowl spare ribs beef tongue meatball tri-tip beef ribs leberkas ham turkey. Andouille pastrami flank sirloin, beef tenderloin bresaola boudin chicken speck filet mignon prosciutto. Tri-tip drumstick sausage pancetta shoulder, short loin pork chop tongue chicken ham hock salami flank cow ribeye. Chuck short ribs speck bresaola, drumstick ham capicola beef ribs tri-tip meatloaf ball tip swine. Filet mignon turducken ribeye, venison tri-tip meatloaf bacon shankle beef ball tip pork flank pig beef ribs kielbasa.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tShort loin tail salami, shank andouille short ribs flank prosciutto leberkas tenderloin chuck shankle kielbasa fatback. Ball tip rump meatloaf, drumstick frankfurter tongue jowl ham hock turducken. Shoulder shank chicken, ribeye shankle venison salami andouille pork tenderloin. Pork chop t-bone flank, pig chuck meatball cow ground round meatloaf shank bacon hamburger ribeye. Pig salami pastrami, shoulder beef ribs boudin biltong drumstick. Tail pig t-bone, capicola bresaola ball tip sausage jowl flank rump kielbasa chicken speck. Shoulder turkey spare ribs sausage corned beef ground round filet mignon tenderloin tail.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tBoudin shank ham hock beef, jowl brisket pork loin jerky kielbasa spare ribs andouille cow flank ground round. Jowl bacon chuck speck, swine kielbasa short loin tenderloin sausage. Pork chop short loin swine, cow tri-tip kielbasa capicola. Chicken bresaola pork chop drumstick chuck, sausage short ribs flank sirloin hamburger. Cow frankfurter chicken prosciutto sirloin ball tip, tail beef strip steak swine. Speck sirloin turducken pancetta short loin tenderloin.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tRibeye shoulder biltong venison beef tri-tip. Bresaola ham hamburger andouille turkey brisket, short loin frankfurter chicken corned beef filet mignon pancetta. Shoulder flank biltong, pork chop turkey cow jowl venison bresaola pork belly sirloin t-bone sausage swine ribeye. Sausage brisket beef, chicken spare ribs hamburger tail meatloaf pig tenderloin pork belly biltong. Pancetta tri-tip pork loin rump pastrami, drumstick flank turkey. Jowl ground round pork short ribs, boudin sirloin venison short loin pig ham.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tAndouille pork chuck speck, leberkas prosciutto turducken jerky brisket frankfurter ball tip filet mignon shankle beef bacon. Turducken jowl pork biltong, andouille hamburger kielbasa. Meatball capicola shoulder ground round, ball tip spare ribs frankfurter rump t-bone beef ribs. Beef ribs brisket filet mignon pork loin kielbasa jowl, t-bone ribeye short loin spare ribs tri-tip drumstick frankfurter tenderloin ham hock. T-bone beef ham hock, speck chicken chuck biltong meatball tail bacon shank turkey flank.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tTri-tip sausage tail meatloaf. Andouille salami leberkas, shank ham ribeye sirloin drumstick. Pork pork chop shankle, jowl spare ribs beef tongue meatball tri-tip beef ribs leberkas ham turkey. Andouille pastrami flank sirloin, beef tenderloin bresaola boudin chicken speck filet mignon prosciutto. Tri-tip drumstick sausage pancetta shoulder, short loin pork chop tongue chicken ham hock salami flank cow ribeye. Chuck short ribs speck bresaola, drumstick ham capicola beef ribs tri-tip meatloaf ball tip swine. Filet mignon turducken ribeye, venison tri-tip meatloaf bacon shankle beef ball tip pork flank pig beef ribs kielbasa.\n\t\t\t</p>\n\t\t</div>\n\t</div>\n\n\t<script type=\"text/javascript\" src=\"../dist/skrollr.min.js\"></script>\n\n\t<script type=\"text/javascript\">\n\tskrollr.init({\n\t\tforceHeight: false\n\t});\n\t</script>\n</body>\n\n</html>\n"
  },
  {
    "path": "examples/circular_motion.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\" />\n\n\t<title>Creating a circular motion (easing === awesome)</title>\n\n\t<link href=\"fixed-positioning.css\" rel=\"stylesheet\" type=\"text/css\" />\n\n\t<style type=\"text/css\">\n\t#thing {\n\t\twidth:32px;\n\t\theight:32px;\n\t\tborder-radius:16px;\n\t\tbackground:#000;\n\t}\n\t</style>\n</head>\n\n<body>\n\t<div id=\"thing\" data-0=\"left[cos]:10%;top[sin]:10%;\" data-10000=\"left:90%;top:90%;\"></div>\n\n\t<script type=\"text/javascript\" src=\"../dist/skrollr.min.js\"></script>\n\t<script type=\"text/javascript\">\n\tskrollr.init({\n\t\teasing: {\n\t\t\tsin: function(p) {\n\t\t\t\treturn (Math.sin(p * Math.PI * 2 - Math.PI/2) + 1) / 2;\n\t\t\t},\n\t\t\tcos: function(p) {\n\t\t\t\treturn (Math.cos(p * Math.PI * 2 - Math.PI/2) + 1) / 2;\n\t\t\t},\n\t\t},\n\t\trender: function(data) {\n\t\t\t//Loop\n\t\t\tif(data.curTop === data.maxTop) {\n\t\t\t\tthis.setScrollTop(0, true);\n\t\t\t}\n\t\t}\n\t});\n\t</script>\n</body>\n\n</html>\n"
  },
  {
    "path": "examples/classic.html",
    "content": "<!DOCTYPE html>\n<html class=\"no-skrollr\">\n<head>\n\t<meta charset=\"utf-8\">\n\n\t<meta name=\"viewport\" content=\"width=device-width, initial-scale=1, user-scalable=no\">\n\n\t<title>Classic parallax page</title>\n\n\t<style type=\"text/css\">\n\t* {\n\t\tpadding:0;\n\t\tmargin:0;\n\t}\n\n\thtml, body {\n\t\theight:100%;\n\t}\n\n\t.skrollr-desktop body {\n\t\theight:100% !important;\n\t}\n\n\tbody {\n\t\tfont-family:sans-serif;\n\t}\n\n\tp {\n\t\tmargin:1em 0;\n\t}\n\n\t.parallax-image-wrapper {\n\t\tposition:fixed;\n\t\tleft:0;\n\t\twidth:100%;\n\t\toverflow:hidden;\n\t}\n\n\t.parallax-image-wrapper-50 {\n\t\theight:50%;\n\t\ttop:-50%;\n\t}\n\n\t.parallax-image-wrapper-100 {\n\t\theight:100%;\n\t\ttop:-100%;\n\t}\n\n\t.parallax-image {\n\t\tdisplay:none;\n\t\tposition:absolute;\n\t\tbottom:0;\n\t\tleft:0;\n\t\twidth:100%;\n\t\tbackground-repeat:no-repeat;\n\t\tbackground-position:center;\n\t\tbackground-size:cover;\n\t}\n\n\t.parallax-image-50 {\n\t\theight:200%;\n\t\ttop:-50%;\n\t}\n\n\t.parallax-image-100 {\n\t\theight:100%;\n\t\ttop:0;\n\t}\n\n\t.parallax-image.skrollable-between {\n\t\tdisplay:block;\n\t}\n\n\t.no-skrollr .parallax-image-wrapper {\n\t\tdisplay:none !important;\n\t}\n\n\t#skrollr-body {\n\t\theight:100%;\n\t\toverflow:visible;\n\t\tposition:relative;\n\t}\n\n\t.gap {\n\t\tbackground:transparent center no-repeat;\n\t\tbackground-size:cover;\n\t}\n\n\t.skrollr .gap {\n\t\tbackground:transparent !important;\n\t}\n\n\t.gap-50 {\n\t\theight:50%;\n\t}\n\n\t.gap-100 {\n\t\theight:100%;\n\t}\n\n\t.header, .content {\n\t\tbackground:#fff;\n\t\tpadding:1em;\n\n\t\t-webkit-box-sizing:border-box;\n\t\t-moz-box-sizing:border-box;\n\t\tbox-sizing:border-box;\n\t}\n\n\t.content-full {\n\t\theight:100%;\n\t}\n\n\t#done {\n\t\theight:100%;\n\t}\n\t</style>\n</head>\n\n<body>\n\t<!--\n\t\tWe position the images fixed and therefore need to place them outside of #skrollr-body.\n\t\tWe will then use data-anchor-target to display the correct image matching the current section (.gap element).\n\t-->\n\n\t<div\n\t\tclass=\"parallax-image-wrapper parallax-image-wrapper-100\"\n\t\tdata-anchor-target=\"#dragons + .gap\"\n\t\tdata-bottom-top=\"transform:translate3d(0px, 200%, 0px)\"\n\t\tdata-top-bottom=\"transform:translate3d(0px, 0%, 0px)\">\n\n\t\t<div\n\t\t\tclass=\"parallax-image parallax-image-100\"\n\t\t\tstyle=\"background-image:url(images/kitteh1.jpg)\"\n\t\t\tdata-anchor-target=\"#dragons + .gap\"\n\t\t\tdata-bottom-top=\"transform: translate3d(0px, -80%, 0px);\"\n\t\t\tdata-top-bottom=\"transform: translate3d(0px, 80%, 0px);\"\n\t\t></div>\n\t\t<!--the +/-80% translation can be adjusted to control the speed difference of the image-->\n\t</div>\n\n\t<div\n\t\tclass=\"parallax-image-wrapper parallax-image-wrapper-100\"\n\t\tdata-anchor-target=\"#bacons + .gap\"\n\t\tdata-bottom-top=\"transform:translate3d(0px, 200%, 0px)\"\n\t\tdata-top-bottom=\"transform:translate3d(0px, 0%, 0px)\">\n\n\t\t<div\n\t\t\tclass=\"parallax-image parallax-image-100\"\n\t\t\tstyle=\"background-image:url(images/kitteh2.jpg)\"\n\t\t\tdata-anchor-target=\"#bacons + .gap\"\n\t\t\tdata-bottom-top=\"transform: translate3d(0px, -80%, 0px);\"\n\t\t\tdata-top-bottom=\"transform: translate3d(0px, 80%, 0px);\"\n\t\t></div>\n\t</div>\n\n\t<div\n\t\tclass=\"parallax-image-wrapper parallax-image-wrapper-50\"\n\t\tdata-anchor-target=\"#kittens + .gap\"\n\t\tdata-bottom-top=\"transform:translate3d(0px, 300%, 0px)\"\n\t\tdata-top-bottom=\"transform:translate3d(0px, 0%, 0px)\">\n\n\t\t<div\n\t\t\tclass=\"parallax-image parallax-image-50\"\n\t\t\tstyle=\"background-image:url(images/kitteh3.jpg)\"\n\t\t\tdata-anchor-target=\"#kittens + .gap\"\n\t\t\tdata-bottom-top=\"transform: translate3d(0px, -60%, 0px);\"\n\t\t\tdata-top-bottom=\"transform: translate3d(0px, 60%, 0px);\"\n\t\t></div>\n\t</div>\n\n\t<div id=\"skrollr-body\">\n\t\t<div class=\"header\" id=\"dragons\">\n\t\t\tSkrollr demo of classic parallax sections. Degrades without JavaScript (could be disabled on mobile without breaking everything).\n\t\t</div>\n\t\t<div class=\"gap gap-100\" style=\"background-image:url(images/kitteh1.jpg);\"></div>\n\t\t<div class=\"content\" id=\"bacons\">\n\t\t\t<p>Landjaeger chicken ham fatback sausage hamburger, tri-tip capicola pastrami pancetta ribeye turducken. Rump shank turkey pig kevin sausage meatloaf tenderloin drumstick short ribs short loin. Prosciutto spare ribs chuck, pork strip steak pork chop swine bacon turkey shoulder andouille. Jowl landjaeger chicken corned beef. Ham hock kielbasa pancetta ground round sausage. Spare ribs porchetta pastrami filet mignon drumstick ball tip. Beef ribs prosciutto kevin, landjaeger shoulder ham hock ham brisket sirloin chuck t-bone drumstick kielbasa pork chop.</p>\n\n\t\t\t<p>Landjaeger spare ribs chicken ball tip, filet mignon frankfurter ribeye tenderloin corned beef. Strip steak boudin pork loin, chicken turkey ball tip beef ribs ground round shank ham hock. Kevin capicola beef, chuck pork chop shoulder brisket doner meatloaf shank ham hock tenderloin. Chuck ham hock short ribs ground round sausage prosciutto shoulder bacon andouille tri-tip beef biltong filet mignon chicken. Pork belly andouille shank, bacon sausage meatloaf bresaola pork chop short ribs t-bone. Ham hock salami porchetta bacon beef turkey, strip steak kielbasa pancetta brisket meatball t-bone.</p>\n\n\t\t\t<p>Chicken pancetta capicola chuck, turkey meatball jerky frankfurter kielbasa ball tip bacon ground round. Beef ribs brisket meatloaf short ribs landjaeger shankle spare ribs sausage, pancetta swine sirloin flank. Tail shank chuck pancetta, ham meatloaf short ribs sausage rump turkey kevin pork chop landjaeger. Doner boudin short ribs t-bone, jerky shankle bresaola drumstick. Strip steak shank spare ribs boudin doner short ribs. Boudin prosciutto jowl tenderloin tongue beef ribs, short ribs salami short loin strip steak ham jerky. Shank pancetta beef ribs, corned beef ham hock pork belly drumstick tail bresaola chuck.</p>\n\t\t</div>\n\t\t<div class=\"gap gap-100\" style=\"background-image:url(images/kitteh2.jpg);\"></div>\n\t\t<div class=\"content content-full\" id=\"kittens\">\n\t\t\tHere be kittens\n\t\t</div>\n\t\t<div class=\"gap gap-50\" style=\"background-image:url(images/kitteh3.jpg);\"></div>\n\t\t<div class=\"content\" id=\"done\">\n\t\t\tImages from <a href=\"http://placekitten.com/attribution.html\">http://placekitten.com/</a>, thanks!\n\t\t</div>\n\t</div>\n\n\t<script type=\"text/javascript\" src=\"../dist/skrollr.min.js\"></script>\n\t<script type=\"text/javascript\">\n\tskrollr.init({\n\t\tsmoothScrolling: false,\n\t\tmobileDeceleration: 0.004\n\t});\n\t</script>\n</body>\n\n</html>\n"
  },
  {
    "path": "examples/docu/1.html",
    "content": "<!DOCTYPE html>\n<html>\n<head class=\"no-skrollr\">\n\t<meta charset=\"utf-8\">\n\n\t<meta name=\"viewport\" content=\"width=device-width, initial-scale=1, user-scalable=no\">\n\n\t<title>Demo 1</title>\n</head>\n\n<body>\n\t<div id=\"skrollr-body\">\n\t\tspacer<br>spacer<br>spacer<br>spacer<br>spacer<br>spacer<br>spacer<br>spacer<br>spacer<br>spacer<br>spacer<br>spacer<br>spacer<br>spacer<br>spacer<br>spacer<br>spacer<br>spacer<br>spacer<br>spacer<br>spacer<br>spacer<br>spacer<br>spacer<br>spacer<br>spacer<br>\n\t\t<div id=\"foo\" data-0=\"background-color:rgb(0,0,255);\" data-500=\"background-color:rgb(255,0,0);\">WOOOT</div>\n\t</div>\n\n\t<script type=\"text/javascript\" src=\"../../dist/skrollr.min.js\"></script>\n\n\t<script type=\"text/javascript\">\n\t//http://detectmobilebrowsers.com/ + tablets\n\t(function(a) {\n\t\tif(/android|avantgo|bada\\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(ad|hone|od)|iris|kindle|lge |maemo|meego.+mobile|midp|mmp|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino|playbook|silk/i.test(a)\n\t\t||\n\t\t/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\\-(n|u)|c55\\/|capi|ccwa|cdm\\-|cell|chtm|cldc|cmd\\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\\-s|devi|dica|dmob|do(c|p)o|ds(12|\\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\\-|_)|g1 u|g560|gene|gf\\-5|g\\-mo|go(\\.w|od)|gr(ad|un)|haie|hcit|hd\\-(m|p|t)|hei\\-|hi(pt|ta)|hp( i|ip)|hs\\-c|ht(c(\\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\\-(20|go|ma)|i230|iac( |\\-|\\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\\/)|klon|kpt |kwc\\-|kyo(c|k)|le(no|xi)|lg( g|\\/(k|l|u)|50|54|\\-[a-w])|libw|lynx|m1\\-w|m3ga|m50\\/|ma(te|ui|xo)|mc(01|21|ca)|m\\-cr|me(di|rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\\-2|po(ck|rt|se)|prox|psio|pt\\-g|qa\\-a|qc(07|12|21|32|60|\\-[2-7]|i\\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\\-|oo|p\\-)|sdk\\/|se(c(\\-|0|1)|47|mc|nd|ri)|sgh\\-|shar|sie(\\-|m)|sk\\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\\-|v\\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\\-|tdg\\-|tel(i|m)|tim\\-|t\\-mo|to(pl|sh)|ts(70|m\\-|m3|m5)|tx\\-9|up(\\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\\-|your|zeto|zte\\-/i.test(a.substr(0,4)))\n\t\t{\n\t\t\t//Add skrollr mobile on mobile devices.\n\t\t\tdocument.write('<script type=\"text/javascript\" src=\"../../dist/skrollr.mobile.min.js\"><\\/script>');\n\t\t}\n\t})(navigator.userAgent||navigator.vendor||window.opera);\n\t</script>\n\n\t<!--[if lt IE 9]>\n\t<script type=\"text/javascript\" src=\"../../dist/skrollr.ie.min.js\"></script>\n\t<![endif]-->\n\n\t<script type=\"text/javascript\">\n\tvar s = skrollr.init();\n\t</script>\n</body>\n\n</html>"
  },
  {
    "path": "examples/docu/2.html",
    "content": "<!DOCTYPE html>\n<html>\n<head class=\"no-skrollr\">\n\t<meta charset=\"utf-8\">\n\n\t<meta name=\"viewport\" content=\"width=device-width, initial-scale=1, user-scalable=no\">\n\n\t<title>Demo 2</title>\n</head>\n\n<body>\n\t<div id=\"skrollr-body\">\n\t\tspacer<br>spacer<br>spacer<br>spacer<br>spacer<br>spacer<br>spacer<br>spacer<br>spacer<br>spacer<br>spacer<br>spacer<br>spacer<br>spacer<br>spacer<br>spacer<br>spacer<br>spacer<br>spacer<br>spacer<br>spacer<br>spacer<br>spacer<br>spacer<br>spacer<br>spacer<br>\n\t\t<div data-0=\"background-color:rgb(0,0,255);transform:rotate(0deg);\" data-500=\"background-color:rgb(255,0,0);transform:rotate(360deg);\">WOOOT</div>\n\t</div>\n\n\t<script type=\"text/javascript\" src=\"../../dist/skrollr.min.js\"></script>\n\n\t<script type=\"text/javascript\">\n\t//http://detectmobilebrowsers.com/ + tablets\n\t(function(a) {\n\t\tif(/android|avantgo|bada\\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(ad|hone|od)|iris|kindle|lge |maemo|meego.+mobile|midp|mmp|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino|playbook|silk/i.test(a)\n\t\t||\n\t\t/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\\-(n|u)|c55\\/|capi|ccwa|cdm\\-|cell|chtm|cldc|cmd\\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\\-s|devi|dica|dmob|do(c|p)o|ds(12|\\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\\-|_)|g1 u|g560|gene|gf\\-5|g\\-mo|go(\\.w|od)|gr(ad|un)|haie|hcit|hd\\-(m|p|t)|hei\\-|hi(pt|ta)|hp( i|ip)|hs\\-c|ht(c(\\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\\-(20|go|ma)|i230|iac( |\\-|\\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\\/)|klon|kpt |kwc\\-|kyo(c|k)|le(no|xi)|lg( g|\\/(k|l|u)|50|54|\\-[a-w])|libw|lynx|m1\\-w|m3ga|m50\\/|ma(te|ui|xo)|mc(01|21|ca)|m\\-cr|me(di|rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\\-2|po(ck|rt|se)|prox|psio|pt\\-g|qa\\-a|qc(07|12|21|32|60|\\-[2-7]|i\\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\\-|oo|p\\-)|sdk\\/|se(c(\\-|0|1)|47|mc|nd|ri)|sgh\\-|shar|sie(\\-|m)|sk\\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\\-|v\\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\\-|tdg\\-|tel(i|m)|tim\\-|t\\-mo|to(pl|sh)|ts(70|m\\-|m3|m5)|tx\\-9|up(\\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\\-|your|zeto|zte\\-/i.test(a.substr(0,4)))\n\t\t{\n\t\t\t//Add skrollr mobile on mobile devices.\n\t\t\tdocument.write('<script type=\"text/javascript\" src=\"../../dist/skrollr.mobile.min.js\"><\\/script>');\n\t\t}\n\t})(navigator.userAgent||navigator.vendor||window.opera);\n\t</script>\n\n\t<!--[if lt IE 9]>\n\t<script type=\"text/javascript\" src=\"../../dist/skrollr.ie.min.js\"></script>\n\t<![endif]-->\n\n\t<script type=\"text/javascript\">\n\tvar s = skrollr.init();\n\t</script>\n</body>\n\n</html>"
  },
  {
    "path": "examples/docu/3.html",
    "content": "<!DOCTYPE html>\n<html>\n<head class=\"no-skrollr\">\n\t<meta charset=\"utf-8\">\n\n\t<meta name=\"viewport\" content=\"width=device-width, initial-scale=1, user-scalable=no\">\n\n\t<title>Demo 3</title>\n</head>\n\n<body>\n\t<div id=\"skrollr-body\">\n\t\tspacer<br>spacer<br>spacer<br>spacer<br>spacer<br>spacer<br>spacer<br>spacer<br>spacer<br>spacer<br>spacer<br>spacer<br>spacer<br>spacer<br>spacer<br>spacer<br>spacer<br>spacer<br>spacer<br>spacer<br>spacer<br>spacer<br>spacer<br>spacer<br>spacer<br>spacer<br>\n\t\t<div data-0=\"background-color:rgb(0,0,255);transform[bounce]:rotate(0deg);\" data-500=\"background-color:rgb(255,0,0);transform[bounce]:rotate(360deg);\">WOOOT</div>\n\t</div>\n\n\t<script type=\"text/javascript\" src=\"../../dist/skrollr.min.js\"></script>\n\n\t<script type=\"text/javascript\">\n\t//http://detectmobilebrowsers.com/ + tablets\n\t(function(a) {\n\t\tif(/android|avantgo|bada\\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(ad|hone|od)|iris|kindle|lge |maemo|meego.+mobile|midp|mmp|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino|playbook|silk/i.test(a)\n\t\t||\n\t\t/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\\-(n|u)|c55\\/|capi|ccwa|cdm\\-|cell|chtm|cldc|cmd\\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\\-s|devi|dica|dmob|do(c|p)o|ds(12|\\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\\-|_)|g1 u|g560|gene|gf\\-5|g\\-mo|go(\\.w|od)|gr(ad|un)|haie|hcit|hd\\-(m|p|t)|hei\\-|hi(pt|ta)|hp( i|ip)|hs\\-c|ht(c(\\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\\-(20|go|ma)|i230|iac( |\\-|\\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\\/)|klon|kpt |kwc\\-|kyo(c|k)|le(no|xi)|lg( g|\\/(k|l|u)|50|54|\\-[a-w])|libw|lynx|m1\\-w|m3ga|m50\\/|ma(te|ui|xo)|mc(01|21|ca)|m\\-cr|me(di|rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\\-2|po(ck|rt|se)|prox|psio|pt\\-g|qa\\-a|qc(07|12|21|32|60|\\-[2-7]|i\\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\\-|oo|p\\-)|sdk\\/|se(c(\\-|0|1)|47|mc|nd|ri)|sgh\\-|shar|sie(\\-|m)|sk\\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\\-|v\\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\\-|tdg\\-|tel(i|m)|tim\\-|t\\-mo|to(pl|sh)|ts(70|m\\-|m3|m5)|tx\\-9|up(\\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\\-|your|zeto|zte\\-/i.test(a.substr(0,4)))\n\t\t{\n\t\t\t//Add skrollr mobile on mobile devices.\n\t\t\tdocument.write('<script type=\"text/javascript\" src=\"../../dist/skrollr.mobile.min.js\"><\\/script>');\n\t\t}\n\t})(navigator.userAgent||navigator.vendor||window.opera);\n\t</script>\n\n\t<!--[if lt IE 9]>\n\t<script type=\"text/javascript\" src=\"../../dist/skrollr.ie.min.js\"></script>\n\t<![endif]-->\n\n\t<script type=\"text/javascript\">\n\tvar s = skrollr.init();\n\t</script>\n</body>\n\n</html>"
  },
  {
    "path": "examples/docu/4.html",
    "content": "<!DOCTYPE html>\n<html>\n<head class=\"no-skrollr\">\n\t<meta charset=\"utf-8\">\n\n\t<meta name=\"viewport\" content=\"width=device-width, initial-scale=1, user-scalable=no\">\n\n\t<title>Demo 4</title>\n</head>\n\n<body>\n\t<div id=\"skrollr-body\">\n\t\tspacer<br>spacer<br>spacer<br>spacer<br>spacer<br>spacer<br>spacer<br>spacer<br>spacer<br>spacer<br>spacer<br>spacer<br>spacer<br>spacer<br>spacer<br>spacer<br>spacer<br>spacer<br>spacer<br>spacer<br>spacer<br>spacer<br>spacer<br>spacer<br>spacer<br>spacer<br>\n\t\t<div data-0=\"background-color:rgb(0,0,255);transform[bounce]:rotate(0deg);\" data-top=\"background-color:rgb(255,0,0);transform[bounce]:rotate(360deg);\">WOOOT</div>\n\t</div>\n\n\t<script type=\"text/javascript\" src=\"../../dist/skrollr.min.js\"></script>\n\n\t<script type=\"text/javascript\">\n\t//http://detectmobilebrowsers.com/ + tablets\n\t(function(a) {\n\t\tif(/android|avantgo|bada\\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(ad|hone|od)|iris|kindle|lge |maemo|meego.+mobile|midp|mmp|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino|playbook|silk/i.test(a)\n\t\t||\n\t\t/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\\-(n|u)|c55\\/|capi|ccwa|cdm\\-|cell|chtm|cldc|cmd\\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\\-s|devi|dica|dmob|do(c|p)o|ds(12|\\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\\-|_)|g1 u|g560|gene|gf\\-5|g\\-mo|go(\\.w|od)|gr(ad|un)|haie|hcit|hd\\-(m|p|t)|hei\\-|hi(pt|ta)|hp( i|ip)|hs\\-c|ht(c(\\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\\-(20|go|ma)|i230|iac( |\\-|\\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\\/)|klon|kpt |kwc\\-|kyo(c|k)|le(no|xi)|lg( g|\\/(k|l|u)|50|54|\\-[a-w])|libw|lynx|m1\\-w|m3ga|m50\\/|ma(te|ui|xo)|mc(01|21|ca)|m\\-cr|me(di|rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\\-2|po(ck|rt|se)|prox|psio|pt\\-g|qa\\-a|qc(07|12|21|32|60|\\-[2-7]|i\\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\\-|oo|p\\-)|sdk\\/|se(c(\\-|0|1)|47|mc|nd|ri)|sgh\\-|shar|sie(\\-|m)|sk\\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\\-|v\\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\\-|tdg\\-|tel(i|m)|tim\\-|t\\-mo|to(pl|sh)|ts(70|m\\-|m3|m5)|tx\\-9|up(\\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\\-|your|zeto|zte\\-/i.test(a.substr(0,4)))\n\t\t{\n\t\t\t//Add skrollr mobile on mobile devices.\n\t\t\tdocument.write('<script type=\"text/javascript\" src=\"../../dist/skrollr.mobile.min.js\"><\\/script>');\n\t\t}\n\t})(navigator.userAgent||navigator.vendor||window.opera);\n\t</script>\n\n\t<!--[if lt IE 9]>\n\t<script type=\"text/javascript\" src=\"../../dist/skrollr.ie.min.js\"></script>\n\t<![endif]-->\n\n\t<script type=\"text/javascript\">\n\tvar s = skrollr.init();\n\t</script>\n</body>\n\n</html>"
  },
  {
    "path": "examples/fixed-positioning.css",
    "content": "/*\n * This file is NOT needed in order to use skrollr.\n * The demo uses it and it may help you as well.\n */\n\n\nhtml, body {\n\twidth:100%;\n\theight:100%;\n\tpadding:0;\n\tmargin:0;\n\toverflow-x:hidden;\n}\n\n.skrollable {\n\t/*\n\t * First-level skrollables are positioned relative to window\n\t */\n\tposition:fixed;\n\n\t/*\n\t * Skrollables by default have a z-index of 100 in order to make it easy to position elements in front/back without changing each skrollable\n\t */\n\tz-index:100;\n}\n\n.skrollr-mobile .skrollable {\n\t/*\n\t\tMay cause issues on Android default browser (see #331 on GitHub).\n\t*/\n\tposition:absolute;\n}\n\n.skrollable .skrollable {\n\t/*\n\t * Second-level skrollables are positioned relative their parent skrollable\n\t */\n\tposition:absolute;\n}\n\n.skrollable .skrollable .skrollable {\n\t/*\n\t * Third-level (and below) skrollables are positioned static\n\t */\n\tposition:static;\n}\n"
  },
  {
    "path": "examples/fixed_nav.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\" />\n\n\t<title>Fixed nav (desktop only!)</title>\n\n\t<style type=\"text/css\">\n\tbody {font-family:sans-serif;}\n\n\t#content {\n\t\twidth:960px;\n\t\tbackground:#eee;\n\t\tborder:1px solid #444;\n\t\tmargin:1em auto;\n\t}\n\n\t#nav {\n\t\tdisplay:block;\n\t\tpadding:0;\n\t\tmargin:0;\n\t\twidth:960px;\n\t\tbackground:#000;\n\t\tcolor:#eee;\n\t}\n\n\t#nav > li {\n\t\tdisplay:inline-block;\n\t\tpadding:1em;\n\t\tmargin:0;\n\t}\n\t</style>\n</head>\n\n<body>\n\t<div id=\"skrollr-body\">\n\t\t<div id=\"content\">\n\t\t\t<div>\n\t\t\t\t<h1>Fixed nav (desktop only!)</h1>\n\n\n\n\t\t\t\t<ul id=\"nav\" data-0=\"position:static;\" data-top-top=\"position:fixed;top:0;\" data-edge-strategy=\"set\">\n\t\t\t\t\t<li>foo</li>\n\t\t\t\t\t<li>bar</li>\n\t\t\t\t</ul>\n\t\t\t\t<!--placeholder div to prevent jumpy content when nav gets pinned-->\n\t\t\t\t<div style=\"padding:1em;\" data-0=\"display:none;\" data-top-top=\"display:block;\" data-anchor-target=\"#nav\" data-edge-strategy=\"set\">&nbsp;</div>\n\n\n\n\t\t\t\t<p>\n\t\t\t\t\t<strong>Scroll down to see the nav getting fixed.</strong>\n\t\t\t\t</p>\n\n\t\t\t\t<p>Biltong pastrami kielbasa short ribs, turducken shoulder pork chop boudin ground round speck cow. Fatback leberkas shank hamburger, tail pork belly tongue bresaola short ribs corned beef speck tri-tip ribeye. Filet mignon shoulder speck pastrami. Ham hock turducken corned beef shankle. Meatloaf shankle sausage boudin, shank flank turducken tenderloin pancetta ball tip. Biltong boudin jowl drumstick pig.</p>\n\n\t\t\t\t<p>Sirloin venison bresaola andouille pastrami short ribs. Short loin cow capicola tail ham hock leberkas. Frankfurter meatloaf capicola, swine ball tip jerky pork loin pork belly cow ribeye brisket strip steak jowl beef ribs ham hock. Pastrami ham hock rump turkey, pork belly capicola jerky. Turkey chuck beef, bresaola filet mignon jerky tri-tip pastrami. Bacon capicola jowl fatback short ribs. Speck shankle bacon chuck.</p>\n\n\t\t\t\t<p>Pork loin tail pork belly shank ham. Kielbasa venison ham, short loin ham hock beef ribs tri-tip ball tip pork belly. Ribeye sirloin sausage tenderloin hamburger. Strip steak tongue turkey, andouille bacon beef ribs venison. T-bone ball tip bresaola fatback, ground round meatball chicken sausage tongue pork chop leberkas sirloin jerky shank bacon. Turducken sirloin cow shankle pig, leberkas venison boudin pastrami.</p>\n\n\t\t\t\t<p>Cow fatback short loin, hamburger speck jowl turducken capicola ham hock. Hamburger corned beef strip steak shank filet mignon, jerky capicola chicken jowl ribeye pork ham hock ground round bresaola. Jowl ribeye kielbasa drumstick pork belly leberkas. Spare ribs fatback shankle, hamburger meatloaf sausage pork loin andouille pork kielbasa. Pancetta shank tongue, leberkas turducken shoulder rump meatball pork belly pig hamburger brisket biltong. Tenderloin short ribs pig, rump tail chuck turducken.</p>\n\n\t\t\t\t<p>Cow tri-tip pork loin salami corned beef. T-bone turkey ham frankfurter, brisket cow chicken bacon rump sirloin. Pancetta ribeye salami leberkas speck shank. Ribeye prosciutto swine venison speck beef.</p>\n\n\t\t\t\t<p>Biltong pastrami kielbasa short ribs, turducken shoulder pork chop boudin ground round speck cow. Fatback leberkas shank hamburger, tail pork belly tongue bresaola short ribs corned beef speck tri-tip ribeye. Filet mignon shoulder speck pastrami. Ham hock turducken corned beef shankle. Meatloaf shankle sausage boudin, shank flank turducken tenderloin pancetta ball tip. Biltong boudin jowl drumstick pig.</p>\n\n\t\t\t\t<p>Sirloin venison bresaola andouille pastrami short ribs. Short loin cow capicola tail ham hock leberkas. Frankfurter meatloaf capicola, swine ball tip jerky pork loin pork belly cow ribeye brisket strip steak jowl beef ribs ham hock. Pastrami ham hock rump turkey, pork belly capicola jerky. Turkey chuck beef, bresaola filet mignon jerky tri-tip pastrami. Bacon capicola jowl fatback short ribs. Speck shankle bacon chuck.</p>\n\n\t\t\t\t<p>Pork loin tail pork belly shank ham. Kielbasa venison ham, short loin ham hock beef ribs tri-tip ball tip pork belly. Ribeye sirloin sausage tenderloin hamburger. Strip steak tongue turkey, andouille bacon beef ribs venison. T-bone ball tip bresaola fatback, ground round meatball chicken sausage tongue pork chop leberkas sirloin jerky shank bacon. Turducken sirloin cow shankle pig, leberkas venison boudin pastrami.</p>\n\n\t\t\t\t<p>Cow fatback short loin, hamburger speck jowl turducken capicola ham hock. Hamburger corned beef strip steak shank filet mignon, jerky capicola chicken jowl ribeye pork ham hock ground round bresaola. Jowl ribeye kielbasa drumstick pork belly leberkas. Spare ribs fatback shankle, hamburger meatloaf sausage pork loin andouille pork kielbasa. Pancetta shank tongue, leberkas turducken shoulder rump meatball pork belly pig hamburger brisket biltong. Tenderloin short ribs pig, rump tail chuck turducken.</p>\n\n\t\t\t\t<p>Cow tri-tip pork loin salami corned beef. T-bone turkey ham frankfurter, brisket cow chicken bacon rump sirloin. Pancetta ribeye salami leberkas speck shank. Ribeye prosciutto swine venison speck beef.</p>\n\n\t\t\t\t<p>Biltong pastrami kielbasa short ribs, turducken shoulder pork chop boudin ground round speck cow. Fatback leberkas shank hamburger, tail pork belly tongue bresaola short ribs corned beef speck tri-tip ribeye. Filet mignon shoulder speck pastrami. Ham hock turducken corned beef shankle. Meatloaf shankle sausage boudin, shank flank turducken tenderloin pancetta ball tip. Biltong boudin jowl drumstick pig.</p>\n\n\t\t\t\t<p>Sirloin venison bresaola andouille pastrami short ribs. Short loin cow capicola tail ham hock leberkas. Frankfurter meatloaf capicola, swine ball tip jerky pork loin pork belly cow ribeye brisket strip steak jowl beef ribs ham hock. Pastrami ham hock rump turkey, pork belly capicola jerky. Turkey chuck beef, bresaola filet mignon jerky tri-tip pastrami. Bacon capicola jowl fatback short ribs. Speck shankle bacon chuck.</p>\n\n\t\t\t\t<p>Sirloin venison bresaola andouille pastrami short ribs. Short loin cow capicola tail ham hock leberkas. Frankfurter meatloaf capicola, swine ball tip jerky pork loin pork belly cow ribeye brisket strip steak jowl beef ribs ham hock. Pastrami ham hock rump turkey, pork belly capicola jerky. Turkey chuck beef, bresaola filet mignon jerky tri-tip pastrami. Bacon capicola jowl fatback short ribs. Speck shankle bacon chuck.</p>\n\n\t\t\t\t<p>Pork loin tail pork belly shank ham. Kielbasa venison ham, short loin ham hock beef ribs tri-tip ball tip pork belly. Ribeye sirloin sausage tenderloin hamburger. Strip steak tongue turkey, andouille bacon beef ribs venison. T-bone ball tip bresaola fatback, ground round meatball chicken sausage tongue pork chop leberkas sirloin jerky shank bacon. Turducken sirloin cow shankle pig, leberkas venison boudin pastrami.</p>\n\n\t\t\t\t<p>Cow fatback short loin, hamburger speck jowl turducken capicola ham hock. Hamburger corned beef strip steak shank filet mignon, jerky capicola chicken jowl ribeye pork ham hock ground round bresaola. Jowl ribeye kielbasa drumstick pork belly leberkas. Spare ribs fatback shankle, hamburger meatloaf sausage pork loin andouille pork kielbasa. Pancetta shank tongue, leberkas turducken shoulder rump meatball pork belly pig hamburger brisket biltong. Tenderloin short ribs pig, rump tail chuck turducken.</p>\n\n\t\t\t\t<p>Cow tri-tip pork loin salami corned beef. T-bone turkey ham frankfurter, brisket cow chicken bacon rump sirloin. Pancetta ribeye salami leberkas speck shank. Ribeye prosciutto swine venison speck beef.</p>\n\n\t\t\t\t<p>Biltong pastrami kielbasa short ribs, turducken shoulder pork chop boudin ground round speck cow. Fatback leberkas shank hamburger, tail pork belly tongue bresaola short ribs corned beef speck tri-tip ribeye. Filet mignon shoulder speck pastrami. Ham hock turducken corned beef shankle. Meatloaf shankle sausage boudin, shank flank turducken tenderloin pancetta ball tip. Biltong boudin jowl drumstick pig.</p>\n\n\t\t\t\t<p>Sirloin venison bresaola andouille pastrami short ribs. Short loin cow capicola tail ham hock leberkas. Frankfurter meatloaf capicola, swine ball tip jerky pork loin pork belly cow ribeye brisket strip steak jowl beef ribs ham hock. Pastrami ham hock rump turkey, pork belly capicola jerky. Turkey chuck beef, bresaola filet mignon jerky tri-tip pastrami. Bacon capicola jowl fatback short ribs. Speck shankle bacon chuck.</p>\n\n\t\t\t\t<p>Pork loin tail pork belly shank ham. Kielbasa venison ham, short loin ham hock beef ribs tri-tip ball tip pork belly. Ribeye sirloin sausage tenderloin hamburger. Strip steak tongue turkey, andouille bacon beef ribs venison. T-bone ball tip bresaola fatback, ground round meatball chicken sausage tongue pork chop leberkas sirloin jerky shank bacon. Turducken sirloin cow shankle pig, leberkas venison boudin pastrami.</p>\n\n\t\t\t\t<p>Cow fatback short loin, hamburger speck jowl turducken capicola ham hock. Hamburger corned beef strip steak shank filet mignon, jerky capicola chicken jowl ribeye pork ham hock ground round bresaola. Jowl ribeye kielbasa drumstick pork belly leberkas. Spare ribs fatback shankle, hamburger meatloaf sausage pork loin andouille pork kielbasa. Pancetta shank tongue, leberkas turducken shoulder rump meatball pork belly pig hamburger brisket biltong. Tenderloin short ribs pig, rump tail chuck turducken.</p>\n\n\t\t\t\t<p>Cow tri-tip pork loin salami corned beef. T-bone turkey ham frankfurter, brisket cow chicken bacon rump sirloin. Pancetta ribeye salami leberkas speck shank. Ribeye prosciutto swine venison speck beef.</p>\n\n\t\t\t\t<p>Biltong pastrami kielbasa short ribs, turducken shoulder pork chop boudin ground round speck cow. Fatback leberkas shank hamburger, tail pork belly tongue bresaola short ribs corned beef speck tri-tip ribeye. Filet mignon shoulder speck pastrami. Ham hock turducken corned beef shankle. Meatloaf shankle sausage boudin, shank flank turducken tenderloin pancetta ball tip. Biltong boudin jowl drumstick pig.</p>\n\n\t\t\t\t<p>Sirloin venison bresaola andouille pastrami short ribs. Short loin cow capicola tail ham hock leberkas. Frankfurter meatloaf capicola, swine ball tip jerky pork loin pork belly cow ribeye brisket strip steak jowl beef ribs ham hock. Pastrami ham hock rump turkey, pork belly capicola jerky. Turkey chuck beef, bresaola filet mignon jerky tri-tip pastrami. Bacon capicola jowl fatback short ribs. Speck shankle bacon chuck.</p>\n\n\t\t\t\t<p>Pork loin tail pork belly shank ham. Kielbasa venison ham, short loin ham hock beef ribs tri-tip ball tip pork belly. Ribeye sirloin sausage tenderloin hamburger. Strip steak tongue turkey, andouille bacon beef ribs venison. T-bone ball tip bresaola fatback, ground round meatball chicken sausage tongue pork chop leberkas sirloin jerky shank bacon. Turducken sirloin cow shankle pig, leberkas venison boudin pastrami.</p>\n\n\t\t\t\t<p>Cow fatback short loin, hamburger speck jowl turducken capicola ham hock. Hamburger corned beef strip steak shank filet mignon, jerky capicola chicken jowl ribeye pork ham hock ground round bresaola. Jowl ribeye kielbasa drumstick pork belly leberkas. Spare ribs fatback shankle, hamburger meatloaf sausage pork loin andouille pork kielbasa. Pancetta shank tongue, leberkas turducken shoulder rump meatball pork belly pig hamburger brisket biltong. Tenderloin short ribs pig, rump tail chuck turducken.</p>\n\n\t\t\t\t<p>Cow tri-tip pork loin salami corned beef. T-bone turkey ham frankfurter, brisket cow chicken bacon rump sirloin. Pancetta ribeye salami leberkas speck shank. Ribeye prosciutto swine venison speck beef.</p>\n\n\t\t\t\t<p>Biltong pastrami kielbasa short ribs, turducken shoulder pork chop boudin ground round speck cow. Fatback leberkas shank hamburger, tail pork belly tongue bresaola short ribs corned beef speck tri-tip ribeye. Filet mignon shoulder speck pastrami. Ham hock turducken corned beef shankle. Meatloaf shankle sausage boudin, shank flank turducken tenderloin pancetta ball tip. Biltong boudin jowl drumstick pig.</p>\n\n\t\t\t\t<p>Sirloin venison bresaola andouille pastrami short ribs. Short loin cow capicola tail ham hock leberkas. Frankfurter meatloaf capicola, swine ball tip jerky pork loin pork belly cow ribeye brisket strip steak jowl beef ribs ham hock. Pastrami ham hock rump turkey, pork belly capicola jerky. Turkey chuck beef, bresaola filet mignon jerky tri-tip pastrami. Bacon capicola jowl fatback short ribs. Speck shankle bacon chuck.</p>\n\n\t\t\t\t<p>Pork loin tail pork belly shank ham. Kielbasa venison ham, short loin ham hock beef ribs tri-tip ball tip pork belly. Ribeye sirloin sausage tenderloin hamburger. Strip steak tongue turkey, andouille bacon beef ribs venison. T-bone ball tip bresaola fatback, ground round meatball chicken sausage tongue pork chop leberkas sirloin jerky shank bacon. Turducken sirloin cow shankle pig, leberkas venison boudin pastrami.</p>\n\n\t\t\t\t<p>Cow tri-tip pork loin salami corned beef. T-bone turkey ham frankfurter, brisket cow chicken bacon rump sirloin. Pancetta ribeye salami leberkas speck shank. Ribeye prosciutto swine venison speck beef.</p>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n\n\t<script type=\"text/javascript\" src=\"../dist/skrollr.min.js\"></script>\n\t<script type=\"text/javascript\">\n\twindow.onload = function() {\n\t\tskrollr.init({\n\t\t\tforceHeight: false\n\t\t});\n\t}\n\t</script>\n</body>\n\n</html>\n"
  },
  {
    "path": "examples/gradientsmotherfucker.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\n\t<meta name=\"viewport\" content=\"width=device-width, initial-scale=1, user-scalable=no\">\n\n\t<title>What’s the best way to appease Samuel L. Jackson’s design-lust?</title>\n\n\t<style type=\"text/css\">\n\thtml, body {\n\t\tpadding:0;\n\t\tmargin:0;\n\t\twidth:100%;\n\t\theight:100%;\n\t\tbackground-attachment:fixed;\n\t\tcolor:#fff;\n\t\tfont-family:sans-serif;\n\t\ttext-align:center;\n\t}\n\n\ta {color:#eee;}\n\n\t#top {padding-top:10em;}\n\n\t#bottom {\n\t\tposition:fixed;\n\t\tright:0;\n\t\tbottom:0;\n\t\tleft:0;\n\t}\n\n\t#bottom > img {\n\t\tdisplay:block;\n\t\tmargin:auto;\n\t}\n\n\t.hidden {display:none;}\n\t</style>\n</head>\n\n<body data-0=\"background-image:linear-gradient(0deg, hsl(0, 100%, 50%), hsl(40, 50%, 50%));\" data-5000=\"background-image:linear-gradient(3600deg, hsl(360, 100%, 50%), hsl(400, 100%, 50%));\">\n\t<div id=\"skrollr-body\">\n\t\t<div id=\"top\">\n\t\t\t<h1>What’s the best way to appease Samuel L. Jackson’s design-lust?</h1>\n\t\t\t<p>Scroll to find out</p>\n\t\t\t<p>↓</p>\n\t\t</div>\n\t</div>\n\n\t<div id=\"bottom\" data-500-end=\"opacity:0;\" data-end=\"opacity:1;\">\n\t\t<h1>Rotating gradients, motherfucker</h1>\n\t\t<p>Inspired by: <a href=\"http://gradientsmotherfucker.com/\">http://gradientsmotherfucker.com/</a></p>\n\t\t<p>Created with: <a href=\"https://github.com/Prinzhorn/skrollr\">skrollr</a></p>\n\t\t<img src=\"images/slj.png\" />\n\t</div>\n\n\t<script type=\"text/javascript\" src=\"../dist/skrollr.min.js\"></script>\n\n\t<script type=\"text/javascript\">\n\tskrollr.init();\n\t</script>\n</body>\n\n</html>\n"
  },
  {
    "path": "examples/main.css",
    "content": "html, body, div, span, p, a, del, em, img, ol, ul, li, fieldset, form, label {\n\tmargin: 0;\n\tpadding: 0;\n\tborder: 0;\n\tfont-size: 100%;\n\tfont: inherit;\n\tvertical-align: baseline;\n}\n\narticle, aside, details, figcaption, figure,\nfooter, header, hgroup, menu, nav, section {\n\tdisplay: block;\n}\n\nhtml, body {\n\tline-height: 1;\n\tmin-height:100%;\n\tfont-family:Artial, Verdana, sans-serif;\n}\n\nbody {\n\tbackground: #eeeeee;\n\tbackground: -webkit-linear-gradient(top, #eeeeee, #cccccc 100%);\n\tbackground: -moz-linear-gradient(top, #eeeeee, #cccccc 100%);\n\tbackground: -o-linear-gradient(top, #eeeeee, #cccccc 100%);\n\tbackground: -ms-linear-gradient(top, #eeeeee, #cccccc 100%);\n\tbackground: linear-gradient(top, #eeeeee, #cccccc 100%);\n\tbackground-attachment:fixed;\n}\n\nol, ul {\n\tlist-style: none;\n}\n\np {\n\tmargin:1em 0;\n\tline-height:1.1em;\n}\n\nq {\n\tfont-style:italic;\n\tcolor:#333;\n}\n\nh1 {\n\tfont-size:2.91em;\n\tmargin:0;\n}\n\nh1 > small {\n\ttext-align:right;\n\tdisplay:inline-block;\n\tfont-size:.71em;\n\ttext-indent:15em;\n\tcolor:#444;\n}\n\nh2 {\n\tcolor:inherit;\n\tfont-size:1.91em;\n\tmargin:2em 0 1em 0;\n}\n\nh2:first-child {margin-top:0;}\n\nh3 {\n\tcolor:#333;\n\tfont-size:1.41em;\n\tmargin:1em 0;\n}\n\nh4 {\n\tcolor:#444;\n\tfont-size:1.11em;\n\tmargin:1em 0;\n}\n\n#progress {\n\theight:2%;\n\tbackground:#444;\n\tbottom:0;\n\tz-index:200;\n}\n\n#scrollbar {\n\tposition:fixed;\n\tright:2px;\n\theight:50px;\n\twidth:6px;\n\tbackground:#444;\n\tbackground:rgba(0,0,0,0.6);\n\tborder:1px solid rgba(255,255,255,0.6);\n\tz-index:300;\n\tborder-radius:3px;\n}\n\n.skrollr-desktop #scrollbar {display:none;}\n\n#bg1, #bg2, #bg3 {\n\tz-index:50;\n\ttop:0;\n\tleft:0;\n\twidth:100%;\n\theight:100%;\n\tbackground:url(images/bubbles.png) repeat 0 0;\n}\n\n#bg2 {\n\tz-index:49;\n\tbackground-image:url(images/bubbles2.png);\n}\n\n#bg3 {\n\tz-index:48;\n\tbackground-image:url(images/bubbles3.png);\n}\n\n#intro {\n\twidth:80%;\n\tleft:50%;\n\ttop:1em;\n\tmargin-left:-40%;\n\tpadding:2em;\n\tbackground:#fff;\n\ttext-align:center;\n\tborder-radius:1em;\n\n\t-webkit-transform-origin:0 0;\n\t-moz-transform-origin:0 0;\n\t-ms-transform-origin:0 0;\n\t-o-transform-origin:0 0;\n\ttransform-origin:0 0;\n\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n}\n\n#intro .arrows {\n\tfont-size:2em;\n\tcolor:#09f;\n}\n\n#transform {\n\twidth:70%;\n\tleft:50%;\n\ttop:20%;\n\tmargin-left:-35%;\n\ttext-align:center;\n\tfont-size:150%;\n\n\t.transform-origin(50%, 50%);\n}\n\n#properties {\n\twidth:100%;\n\theight:100%;\n\tpadding-top:10%;\n\ttext-align:center;\n\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n}\n\n#easing_wrapper {\n\twidth:100%;\n\theight:100%;\n}\n\n#easing {\n\ttop:10%;\n\twidth:50%;\n\tz-index:101;\n}\n\n.drop {\n\tbackground:#09f;\n\tfont-weight:bold;\n\tpadding:1em;\n}\n\n#download {\n\twidth:80%;\n\tleft:10%;\n\theight:80%;\n\tpadding:3em;\n\tborder:0 solid #222;\n\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n}\n\n.twitter-share-button, .twitter-follow-button {\n\tvertical-align:middle;\n}\n"
  },
  {
    "path": "examples/path.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\" />\n\n\t<title>Drawing a path</title>\n</head>\n\n<body style=\"text-align:center;\">\n\t<div id=\"skrollr-body\">\n\t\t<h1>SVG IS AWESOME (so is skrollr)</h1>\n\t\t<p>Scroll down for details</p>\n\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" version=\"1.1\" width=\"900px\" height=\"1200px\">\n\t\t\t<path\n\t\t\t\tstyle=\"fill:none;stroke:#333333;stroke-width:7;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:6000;stroke-dashoffset:0\"\n\t\t\t\tdata-0=\"stroke-dashoffset:6000;\" data-end=\"stroke-dashoffset:0;\"\n\n\t\t\t\td=\"m 199.16266,227.29566 c 0,0 -35.71429,-184.285714 37.14286,-210.000004 72.85714,-25.7142792 95.40137,3.16127 134.28572,42.85715 C 462.01038,153.47988 433.14019,231.62843 612.01981,188.72422 740.78435,157.8401 648.46996,-124.25341 423.44838,73.009946 397.57737,95.689556 342.01981,227.29566 322.01981,268.72423 c -20,41.42857 -15.71429,142.85714 64.28571,222.85714 80,80 143.73919,-10.78923 207.14286,17.14286 89.11717,39.26002 175.71428,70 214.28571,198.57143 38.57143,128.57142 -224.28571,45.71428 -311.42857,50 -87.14286,4.28571 -174.7636,-13.7114 -273.33504,69.14573 -98.57143,82.85724 -123.427376,147.71354 -133.893126,125.93684 -13.988987,-29.1077 -55.031934,-20.6196 -72.436974,2.587 -35.52138,47.36187 48.898892,49.25187 59.501803,81.06057 11.228801,33.6863 -55.491303,91.6685 -70.7122836,61.2265 -14.3563298,-28.7127 55.6559746,-11.2104 68.9875946,-11.2104 59.313946,0 106.207266,-47.3062 135.388156,-93.99577 9.07249,-14.516 16.34065,-34.5597 6.03641,-50.0161 -24.31744,-36.4761 -61.10674,32.1704 -64.67586,50.0161 -1.78804,8.94027 -18.73345,93.13327 -18.9716,93.13327 -15.39093,0 28.03002,-116.70147 77.61105,-83.6473 22.80402,15.2025 -31.82409,33.8676 -43.11725,31.0443 -2.54514,-0.6362 -14.1213,-7.4374 -16.38456,-5.174 -1.98676,1.9867 9.07416,13.8365 10.34816,16.3845 2.87494,5.7499 10.51739,15.8661 17.24688,18.1092 69.57702,23.1924 68.47583,-63.69675 106.93079,-50.8783 25.47788,8.4926 17.93869,61.2265 13.79751,61.2265 -4.54633,0 1.86112,-32.5889 2.58704,-36.2185 1.63481,-8.1741 -8.336,-25.008 0,-25.008 23.1702,0 56.38131,-4.3117 84.50982,-4.3117 6.92267,0 20.69627,8.6474 20.69627,1.7246 0,-22.13767 -106.83933,7.883 -73.29932,52.6031 15.39517,20.5269 45.97363,7.0247 56.91476,-11.2104 4.27342,-7.1224 5.92963,-41.2859 6.03643,-41.3927 3.30032,-3.3003 25.38957,-5.1906 31.04441,-7.7611 8.17799,-3.71727 116.56888,-61.61957 80.19809,-70.71237 -62.06519,-15.5162 -84.81857,132.80117 -47.42898,132.80117 39.83429,0 168.06934,-127.94377 127.62705,-141.42457 -48.77358,-16.2579 -78.2302,99.41297 -51.74069,125.90247 20.35735,20.3573 58.34681,-22.9907 73.29932,-37.9432 37.20757,-37.20767 16.38455,62.9731 16.38455,52.603 0,-50.488 -2.86125,-72.28997 41.39257,-61.2265 18.42188,4.6055 41.59056,-2.80515 61.22649,0 33.65343,4.8077 18.48038,96.0268 157.85652,147.0903\"\n\t\t\t/>\n\t\t</svg>\n\t\t<p>WOOOT!</p>\n\t\t<p>WOOOT!</p>\n\t\t<p>WOOOT!</p>\n\t\t<p>WOOOT!</p>\n\t\t<p>WOOOT!</p>\n\t\t<p>WOOOT!</p>\n\t\t<p>WOOOT!</p>\n\t\t<p>WOOOT!</p>\n\t\t<p>WOOOT!</p>\n\t</div>\n\n\t<script type=\"text/javascript\" src=\"../dist/skrollr.min.js\"></script>\n\t<script type=\"text/javascript\">\n\tskrollr.init({\n\t\tforceHeight: false\n\t});\n\t</script>\n</body>\n\n</html>\n"
  },
  {
    "path": "examples/pausing.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\n\t<meta name=\"viewport\" content=\"width=device-width, initial-scale=1, user-scalable=no\">\n\n\t<title>Pausing</title>\n\n\t<style type=\"text/css\">\n\t* {\n\t\tmargin:0;\n\t\tpadding:0;\n\t}\n\n\thtml, body {\n\t\twidth:100%;\n\t\theight:100%;\n\t}\n\n\tbody {font-family:sans-serif;}\n\n\tbody > div {\n\t\tposition:fixed;\n\t\ttop:0;\n\t\tleft:0;\n\t\twidth:100%;\n\t\theight:100%;\n\t\tbackground:transparent center no-repeat;\n\t\tbackground-size:cover;\n\t}\n\n\tbody > div:nth-child(1) {\n\t\tbackground-image:url(http://placekitten.com/800/600?image=1);\n\t}\n\n\tbody > div:nth-child(2) {\n\t\tbackground:#f0f0f0;\n\t\toverflow:hidden;\n\t}\n\n\tbody > div:nth-child(3) {\n\t\tbackground-image:url(http://placekitten.com/800/600?image=3);\n\t}\n\n\t.box {\n\t\tposition:absolute;\n\t\tleft:0;\n\t\theight:100%;\n\t\tbackground:#09f;\n\t}\n\n\tp {margin:1em 0;}\n\t</style>\n</head>\n\n<body>\n\t<div data-0=\"transform:translate(0,0%);\" data-100p=\"transform:translate(0,-100%);\"></div>\n\n\t<div data-0=\"transform:translate(0,100%);\" data-100p=\"transform:translate(0,0%)\" data-_box-100p=\"\" data-_box-200p=\"transform:translate(0,-100%)\">\n\t\t<div class=\"box\" data-100p=\"width:0%;\" data-_box-100p=\"width:100%\"></div>\n\t</div>\n\n\t<div data-_box-100p=\"transform:translate(0,100%);\" data-_box-200p=\"transform:translate(0,0%);\"></div>\n\n\t<script type=\"text/javascript\" src=\"../dist/skrollr.min.js\"></script>\n\n\t<script type=\"text/javascript\">\n\tskrollr.init({\n\t\tconstants: {\n\t\t\t//fill the box for a \"duration\" of 150% of the viewport (pause for 150%)\n\t\t\t//adjust for shorter/longer pause\n\t\t\tbox: '150p'\n\t\t}\n\t});\n\t</script>\n</body>\n\n</html>\n"
  },
  {
    "path": "examples/scripts/main.js",
    "content": "require.config({\n\tbaseUrl: \"../dist\",\n\tpaths: {\n\t\t'skrollr' : \"skrollr.min\"\n\t},\n\twaitSeconds: 15\n});\n\nrequire(['skrollr'], function(skrollr){\n\tvar s = skrollr.init({\n\t\tedgeStrategy: 'set',\n\t\teasing: {\n\t\t\tWTF: Math.random,\n\t\t\tinverted: function(p) {\n\t\t\t\treturn 1-p;\n\t\t\t}\n\t\t}\n\t});\n});"
  },
  {
    "path": "examples/scripts/require.js",
    "content": "/*\n RequireJS 2.1.9 Copyright (c) 2010-2012, The Dojo Foundation All Rights Reserved.\n Available via the MIT or new BSD license.\n see: http://github.com/jrburke/requirejs for details\n*/\nvar requirejs,require,define;\n(function(Z){function H(b){return\"[object Function]\"===L.call(b)}function I(b){return\"[object Array]\"===L.call(b)}function y(b,c){if(b){var e;for(e=0;e<b.length&&(!b[e]||!c(b[e],e,b));e+=1);}}function M(b,c){if(b){var e;for(e=b.length-1;-1<e&&(!b[e]||!c(b[e],e,b));e-=1);}}function t(b,c){return ga.call(b,c)}function l(b,c){return t(b,c)&&b[c]}function F(b,c){for(var e in b)if(t(b,e)&&c(b[e],e))break}function Q(b,c,e,h){c&&F(c,function(c,j){if(e||!t(b,j))h&&\"string\"!==typeof c?(b[j]||(b[j]={}),Q(b[j],\nc,e,h)):b[j]=c});return b}function u(b,c){return function(){return c.apply(b,arguments)}}function aa(b){throw b;}function ba(b){if(!b)return b;var c=Z;y(b.split(\".\"),function(b){c=c[b]});return c}function A(b,c,e,h){c=Error(c+\"\\nhttp://requirejs.org/docs/errors.html#\"+b);c.requireType=b;c.requireModules=h;e&&(c.originalError=e);return c}function ha(b){function c(a,f,b){var d,m,c,g,e,h,j,i=f&&f.split(\"/\");d=i;var n=k.map,p=n&&n[\"*\"];if(a&&\".\"===a.charAt(0))if(f){d=l(k.pkgs,f)?i=[f]:i.slice(0,i.length-\n1);f=a=d.concat(a.split(\"/\"));for(d=0;f[d];d+=1)if(m=f[d],\".\"===m)f.splice(d,1),d-=1;else if(\"..\"===m)if(1===d&&(\"..\"===f[2]||\"..\"===f[0]))break;else 0<d&&(f.splice(d-1,2),d-=2);d=l(k.pkgs,f=a[0]);a=a.join(\"/\");d&&a===f+\"/\"+d.main&&(a=f)}else 0===a.indexOf(\"./\")&&(a=a.substring(2));if(b&&n&&(i||p)){f=a.split(\"/\");for(d=f.length;0<d;d-=1){c=f.slice(0,d).join(\"/\");if(i)for(m=i.length;0<m;m-=1)if(b=l(n,i.slice(0,m).join(\"/\")))if(b=l(b,c)){g=b;e=d;break}if(g)break;!h&&(p&&l(p,c))&&(h=l(p,c),j=d)}!g&&\nh&&(g=h,e=j);g&&(f.splice(0,e,g),a=f.join(\"/\"))}return a}function e(a){z&&y(document.getElementsByTagName(\"script\"),function(f){if(f.getAttribute(\"data-requiremodule\")===a&&f.getAttribute(\"data-requirecontext\")===i.contextName)return f.parentNode.removeChild(f),!0})}function h(a){var f=l(k.paths,a);if(f&&I(f)&&1<f.length)return f.shift(),i.require.undef(a),i.require([a]),!0}function $(a){var f,b=a?a.indexOf(\"!\"):-1;-1<b&&(f=a.substring(0,b),a=a.substring(b+1,a.length));return[f,a]}function n(a,f,\nb,d){var m,B,g=null,e=f?f.name:null,h=a,j=!0,k=\"\";a||(j=!1,a=\"_@r\"+(L+=1));a=$(a);g=a[0];a=a[1];g&&(g=c(g,e,d),B=l(r,g));a&&(g?k=B&&B.normalize?B.normalize(a,function(a){return c(a,e,d)}):c(a,e,d):(k=c(a,e,d),a=$(k),g=a[0],k=a[1],b=!0,m=i.nameToUrl(k)));b=g&&!B&&!b?\"_unnormalized\"+(M+=1):\"\";return{prefix:g,name:k,parentMap:f,unnormalized:!!b,url:m,originalName:h,isDefine:j,id:(g?g+\"!\"+k:k)+b}}function q(a){var f=a.id,b=l(p,f);b||(b=p[f]=new i.Module(a));return b}function s(a,f,b){var d=a.id,m=l(p,\nd);if(t(r,d)&&(!m||m.defineEmitComplete))\"defined\"===f&&b(r[d]);else if(m=q(a),m.error&&\"error\"===f)b(m.error);else m.on(f,b)}function v(a,f){var b=a.requireModules,d=!1;if(f)f(a);else if(y(b,function(f){if(f=l(p,f))f.error=a,f.events.error&&(d=!0,f.emit(\"error\",a))}),!d)j.onError(a)}function w(){R.length&&(ia.apply(G,[G.length-1,0].concat(R)),R=[])}function x(a){delete p[a];delete T[a]}function E(a,f,b){var d=a.map.id;a.error?a.emit(\"error\",a.error):(f[d]=!0,y(a.depMaps,function(d,c){var g=d.id,\ne=l(p,g);e&&(!a.depMatched[c]&&!b[g])&&(l(f,g)?(a.defineDep(c,r[g]),a.check()):E(e,f,b))}),b[d]=!0)}function C(){var a,f,b,d,m=(b=1E3*k.waitSeconds)&&i.startTime+b<(new Date).getTime(),c=[],g=[],j=!1,l=!0;if(!U){U=!0;F(T,function(b){a=b.map;f=a.id;if(b.enabled&&(a.isDefine||g.push(b),!b.error))if(!b.inited&&m)h(f)?j=d=!0:(c.push(f),e(f));else if(!b.inited&&(b.fetched&&a.isDefine)&&(j=!0,!a.prefix))return l=!1});if(m&&c.length)return b=A(\"timeout\",\"Load timeout for modules: \"+c,null,c),b.contextName=\ni.contextName,v(b);l&&y(g,function(a){E(a,{},{})});if((!m||d)&&j)if((z||da)&&!V)V=setTimeout(function(){V=0;C()},50);U=!1}}function D(a){t(r,a[0])||q(n(a[0],null,!0)).init(a[1],a[2])}function J(a){var a=a.currentTarget||a.srcElement,b=i.onScriptLoad;a.detachEvent&&!W?a.detachEvent(\"onreadystatechange\",b):a.removeEventListener(\"load\",b,!1);b=i.onScriptError;(!a.detachEvent||W)&&a.removeEventListener(\"error\",b,!1);return{node:a,id:a&&a.getAttribute(\"data-requiremodule\")}}function K(){var a;for(w();G.length;){a=\nG.shift();if(null===a[0])return v(A(\"mismatch\",\"Mismatched anonymous define() module: \"+a[a.length-1]));D(a)}}var U,X,i,N,V,k={waitSeconds:7,baseUrl:\"./\",paths:{},pkgs:{},shim:{},config:{}},p={},T={},Y={},G=[],r={},S={},L=1,M=1;N={require:function(a){return a.require?a.require:a.require=i.makeRequire(a.map)},exports:function(a){a.usingExports=!0;if(a.map.isDefine)return a.exports?a.exports:a.exports=r[a.map.id]={}},module:function(a){return a.module?a.module:a.module={id:a.map.id,uri:a.map.url,config:function(){var b=\nl(k.pkgs,a.map.id);return(b?l(k.config,a.map.id+\"/\"+b.main):l(k.config,a.map.id))||{}},exports:r[a.map.id]}}};X=function(a){this.events=l(Y,a.id)||{};this.map=a;this.shim=l(k.shim,a.id);this.depExports=[];this.depMaps=[];this.depMatched=[];this.pluginMaps={};this.depCount=0};X.prototype={init:function(a,b,c,d){d=d||{};if(!this.inited){this.factory=b;if(c)this.on(\"error\",c);else this.events.error&&(c=u(this,function(a){this.emit(\"error\",a)}));this.depMaps=a&&a.slice(0);this.errback=c;this.inited=!0;\nthis.ignore=d.ignore;d.enabled||this.enabled?this.enable():this.check()}},defineDep:function(a,b){this.depMatched[a]||(this.depMatched[a]=!0,this.depCount-=1,this.depExports[a]=b)},fetch:function(){if(!this.fetched){this.fetched=!0;i.startTime=(new Date).getTime();var a=this.map;if(this.shim)i.makeRequire(this.map,{enableBuildCallback:!0})(this.shim.deps||[],u(this,function(){return a.prefix?this.callPlugin():this.load()}));else return a.prefix?this.callPlugin():this.load()}},load:function(){var a=\nthis.map.url;S[a]||(S[a]=!0,i.load(this.map.id,a))},check:function(){if(this.enabled&&!this.enabling){var a,b,c=this.map.id;b=this.depExports;var d=this.exports,m=this.factory;if(this.inited)if(this.error)this.emit(\"error\",this.error);else{if(!this.defining){this.defining=!0;if(1>this.depCount&&!this.defined){if(H(m)){if(this.events.error&&this.map.isDefine||j.onError!==aa)try{d=i.execCb(c,m,b,d)}catch(e){a=e}else d=i.execCb(c,m,b,d);this.map.isDefine&&((b=this.module)&&void 0!==b.exports&&b.exports!==\nthis.exports?d=b.exports:void 0===d&&this.usingExports&&(d=this.exports));if(a)return a.requireMap=this.map,a.requireModules=this.map.isDefine?[this.map.id]:null,a.requireType=this.map.isDefine?\"define\":\"require\",v(this.error=a)}else d=m;this.exports=d;if(this.map.isDefine&&!this.ignore&&(r[c]=d,j.onResourceLoad))j.onResourceLoad(i,this.map,this.depMaps);x(c);this.defined=!0}this.defining=!1;this.defined&&!this.defineEmitted&&(this.defineEmitted=!0,this.emit(\"defined\",this.exports),this.defineEmitComplete=\n!0)}}else this.fetch()}},callPlugin:function(){var a=this.map,b=a.id,e=n(a.prefix);this.depMaps.push(e);s(e,\"defined\",u(this,function(d){var m,e;e=this.map.name;var g=this.map.parentMap?this.map.parentMap.name:null,h=i.makeRequire(a.parentMap,{enableBuildCallback:!0});if(this.map.unnormalized){if(d.normalize&&(e=d.normalize(e,function(a){return c(a,g,!0)})||\"\"),d=n(a.prefix+\"!\"+e,this.map.parentMap),s(d,\"defined\",u(this,function(a){this.init([],function(){return a},null,{enabled:!0,ignore:!0})})),\ne=l(p,d.id)){this.depMaps.push(d);if(this.events.error)e.on(\"error\",u(this,function(a){this.emit(\"error\",a)}));e.enable()}}else m=u(this,function(a){this.init([],function(){return a},null,{enabled:!0})}),m.error=u(this,function(a){this.inited=!0;this.error=a;a.requireModules=[b];F(p,function(a){0===a.map.id.indexOf(b+\"_unnormalized\")&&x(a.map.id)});v(a)}),m.fromText=u(this,function(d,c){var e=a.name,g=n(e),B=O;c&&(d=c);B&&(O=!1);q(g);t(k.config,b)&&(k.config[e]=k.config[b]);try{j.exec(d)}catch(ca){return v(A(\"fromtexteval\",\n\"fromText eval for \"+b+\" failed: \"+ca,ca,[b]))}B&&(O=!0);this.depMaps.push(g);i.completeLoad(e);h([e],m)}),d.load(a.name,h,m,k)}));i.enable(e,this);this.pluginMaps[e.id]=e},enable:function(){T[this.map.id]=this;this.enabling=this.enabled=!0;y(this.depMaps,u(this,function(a,b){var c,d;if(\"string\"===typeof a){a=n(a,this.map.isDefine?this.map:this.map.parentMap,!1,!this.skipMap);this.depMaps[b]=a;if(c=l(N,a.id)){this.depExports[b]=c(this);return}this.depCount+=1;s(a,\"defined\",u(this,function(a){this.defineDep(b,\na);this.check()}));this.errback&&s(a,\"error\",u(this,this.errback))}c=a.id;d=p[c];!t(N,c)&&(d&&!d.enabled)&&i.enable(a,this)}));F(this.pluginMaps,u(this,function(a){var b=l(p,a.id);b&&!b.enabled&&i.enable(a,this)}));this.enabling=!1;this.check()},on:function(a,b){var c=this.events[a];c||(c=this.events[a]=[]);c.push(b)},emit:function(a,b){y(this.events[a],function(a){a(b)});\"error\"===a&&delete this.events[a]}};i={config:k,contextName:b,registry:p,defined:r,urlFetched:S,defQueue:G,Module:X,makeModuleMap:n,\nnextTick:j.nextTick,onError:v,configure:function(a){a.baseUrl&&\"/\"!==a.baseUrl.charAt(a.baseUrl.length-1)&&(a.baseUrl+=\"/\");var b=k.pkgs,c=k.shim,d={paths:!0,config:!0,map:!0};F(a,function(a,b){d[b]?\"map\"===b?(k.map||(k.map={}),Q(k[b],a,!0,!0)):Q(k[b],a,!0):k[b]=a});a.shim&&(F(a.shim,function(a,b){I(a)&&(a={deps:a});if((a.exports||a.init)&&!a.exportsFn)a.exportsFn=i.makeShimExports(a);c[b]=a}),k.shim=c);a.packages&&(y(a.packages,function(a){a=\"string\"===typeof a?{name:a}:a;b[a.name]={name:a.name,\nlocation:a.location||a.name,main:(a.main||\"main\").replace(ja,\"\").replace(ea,\"\")}}),k.pkgs=b);F(p,function(a,b){!a.inited&&!a.map.unnormalized&&(a.map=n(b))});if(a.deps||a.callback)i.require(a.deps||[],a.callback)},makeShimExports:function(a){return function(){var b;a.init&&(b=a.init.apply(Z,arguments));return b||a.exports&&ba(a.exports)}},makeRequire:function(a,f){function h(d,c,e){var g,k;f.enableBuildCallback&&(c&&H(c))&&(c.__requireJsBuild=!0);if(\"string\"===typeof d){if(H(c))return v(A(\"requireargs\",\n\"Invalid require call\"),e);if(a&&t(N,d))return N[d](p[a.id]);if(j.get)return j.get(i,d,a,h);g=n(d,a,!1,!0);g=g.id;return!t(r,g)?v(A(\"notloaded\",'Module name \"'+g+'\" has not been loaded yet for context: '+b+(a?\"\":\". Use require([])\"))):r[g]}K();i.nextTick(function(){K();k=q(n(null,a));k.skipMap=f.skipMap;k.init(d,c,e,{enabled:!0});C()});return h}f=f||{};Q(h,{isBrowser:z,toUrl:function(b){var f,e=b.lastIndexOf(\".\"),g=b.split(\"/\")[0];if(-1!==e&&(!(\".\"===g||\"..\"===g)||1<e))f=b.substring(e,b.length),b=\nb.substring(0,e);return i.nameToUrl(c(b,a&&a.id,!0),f,!0)},defined:function(b){return t(r,n(b,a,!1,!0).id)},specified:function(b){b=n(b,a,!1,!0).id;return t(r,b)||t(p,b)}});a||(h.undef=function(b){w();var c=n(b,a,!0),f=l(p,b);e(b);delete r[b];delete S[c.url];delete Y[b];f&&(f.events.defined&&(Y[b]=f.events),x(b))});return h},enable:function(a){l(p,a.id)&&q(a).enable()},completeLoad:function(a){var b,c,d=l(k.shim,a)||{},e=d.exports;for(w();G.length;){c=G.shift();if(null===c[0]){c[0]=a;if(b)break;b=\n!0}else c[0]===a&&(b=!0);D(c)}c=l(p,a);if(!b&&!t(r,a)&&c&&!c.inited){if(k.enforceDefine&&(!e||!ba(e)))return h(a)?void 0:v(A(\"nodefine\",\"No define call for \"+a,null,[a]));D([a,d.deps||[],d.exportsFn])}C()},nameToUrl:function(a,b,c){var d,e,h,g,i,n;if(j.jsExtRegExp.test(a))g=a+(b||\"\");else{d=k.paths;e=k.pkgs;g=a.split(\"/\");for(i=g.length;0<i;i-=1)if(n=g.slice(0,i).join(\"/\"),h=l(e,n),n=l(d,n)){I(n)&&(n=n[0]);g.splice(0,i,n);break}else if(h){a=a===h.name?h.location+\"/\"+h.main:h.location;g.splice(0,i,\na);break}g=g.join(\"/\");g+=b||(/^data\\:|\\?/.test(g)||c?\"\":\".js\");g=(\"/\"===g.charAt(0)||g.match(/^[\\w\\+\\.\\-]+:/)?\"\":k.baseUrl)+g}return k.urlArgs?g+((-1===g.indexOf(\"?\")?\"?\":\"&\")+k.urlArgs):g},load:function(a,b){j.load(i,a,b)},execCb:function(a,b,c,d){return b.apply(d,c)},onScriptLoad:function(a){if(\"load\"===a.type||ka.test((a.currentTarget||a.srcElement).readyState))P=null,a=J(a),i.completeLoad(a.id)},onScriptError:function(a){var b=J(a);if(!h(b.id))return v(A(\"scripterror\",\"Script error for: \"+b.id,\na,[b.id]))}};i.require=i.makeRequire();return i}var j,w,x,C,J,D,P,K,q,fa,la=/(\\/\\*([\\s\\S]*?)\\*\\/|([^:]|^)\\/\\/(.*)$)/mg,ma=/[^.]\\s*require\\s*\\(\\s*[\"']([^'\"\\s]+)[\"']\\s*\\)/g,ea=/\\.js$/,ja=/^\\.\\//;w=Object.prototype;var L=w.toString,ga=w.hasOwnProperty,ia=Array.prototype.splice,z=!!(\"undefined\"!==typeof window&&\"undefined\"!==typeof navigator&&window.document),da=!z&&\"undefined\"!==typeof importScripts,ka=z&&\"PLAYSTATION 3\"===navigator.platform?/^complete$/:/^(complete|loaded)$/,W=\"undefined\"!==typeof opera&&\n\"[object Opera]\"===opera.toString(),E={},s={},R=[],O=!1;if(\"undefined\"===typeof define){if(\"undefined\"!==typeof requirejs){if(H(requirejs))return;s=requirejs;requirejs=void 0}\"undefined\"!==typeof require&&!H(require)&&(s=require,require=void 0);j=requirejs=function(b,c,e,h){var q,n=\"_\";!I(b)&&\"string\"!==typeof b&&(q=b,I(c)?(b=c,c=e,e=h):b=[]);q&&q.context&&(n=q.context);(h=l(E,n))||(h=E[n]=j.s.newContext(n));q&&h.configure(q);return h.require(b,c,e)};j.config=function(b){return j(b)};j.nextTick=\"undefined\"!==\ntypeof setTimeout?function(b){setTimeout(b,4)}:function(b){b()};require||(require=j);j.version=\"2.1.9\";j.jsExtRegExp=/^\\/|:|\\?|\\.js$/;j.isBrowser=z;w=j.s={contexts:E,newContext:ha};j({});y([\"toUrl\",\"undef\",\"defined\",\"specified\"],function(b){j[b]=function(){var c=E._;return c.require[b].apply(c,arguments)}});if(z&&(x=w.head=document.getElementsByTagName(\"head\")[0],C=document.getElementsByTagName(\"base\")[0]))x=w.head=C.parentNode;j.onError=aa;j.createNode=function(b){var c=b.xhtml?document.createElementNS(\"http://www.w3.org/1999/xhtml\",\n\"html:script\"):document.createElement(\"script\");c.type=b.scriptType||\"text/javascript\";c.charset=\"utf-8\";c.async=!0;return c};j.load=function(b,c,e){var h=b&&b.config||{};if(z)return h=j.createNode(h,c,e),h.setAttribute(\"data-requirecontext\",b.contextName),h.setAttribute(\"data-requiremodule\",c),h.attachEvent&&!(h.attachEvent.toString&&0>h.attachEvent.toString().indexOf(\"[native code\"))&&!W?(O=!0,h.attachEvent(\"onreadystatechange\",b.onScriptLoad)):(h.addEventListener(\"load\",b.onScriptLoad,!1),h.addEventListener(\"error\",\nb.onScriptError,!1)),h.src=e,K=h,C?x.insertBefore(h,C):x.appendChild(h),K=null,h;if(da)try{importScripts(e),b.completeLoad(c)}catch(l){b.onError(A(\"importscripts\",\"importScripts failed for \"+c+\" at \"+e,l,[c]))}};z&&!s.skipDataMain&&M(document.getElementsByTagName(\"script\"),function(b){x||(x=b.parentNode);if(J=b.getAttribute(\"data-main\"))return q=J,s.baseUrl||(D=q.split(\"/\"),q=D.pop(),fa=D.length?D.join(\"/\")+\"/\":\"./\",s.baseUrl=fa),q=q.replace(ea,\"\"),j.jsExtRegExp.test(q)&&(q=J),s.deps=s.deps?s.deps.concat(q):\n[q],!0});define=function(b,c,e){var h,j;\"string\"!==typeof b&&(e=c,c=b,b=null);I(c)||(e=c,c=null);!c&&H(e)&&(c=[],e.length&&(e.toString().replace(la,\"\").replace(ma,function(b,e){c.push(e)}),c=(1===e.length?[\"require\"]:[\"require\",\"exports\",\"module\"]).concat(c)));if(O){if(!(h=K))P&&\"interactive\"===P.readyState||M(document.getElementsByTagName(\"script\"),function(b){if(\"interactive\"===b.readyState)return P=b}),h=P;h&&(b||(b=h.getAttribute(\"data-requiremodule\")),j=E[h.getAttribute(\"data-requirecontext\")])}(j?\nj.defQueue:R).push([b,c,e])};define.amd={jQuery:!0};j.exec=function(b){return eval(b)};j(s)}})(this);\n"
  },
  {
    "path": "examples/svg.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\" />\n\n\t<title>SVG</title>\n</head>\n\n<body>\n\t<svg xmlns=\"http://www.w3.org/2000/svg\" version=\"1.1\" width=\"1000px\" height=\"1000px\">\n\t\t<rect x=\"0\" y=\"0\" width=\"100%\" height=\"100%\" stroke=\"black\" data-0=\"fill:rgb(255,0,0);\" data-500=\"fill:rgb(0,0,255);\" />\n\t\t<circle cx=\"50%\" cy=\"50%\" r=\"25%\" style=\"stroke: black;\" data-0=\"fill:rgb(0,0,255);\" data-500=\"fill:rgb(0,255,0);\" />\n\t</svg>\n\n\t<script type=\"text/javascript\" src=\"../dist/skrollr.min.js\"></script>\n\t<script type=\"text/javascript\">\n\tskrollr.init();\n\t</script>\n</body>\n\n</html>\n"
  },
  {
    "path": "index.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\n\t<meta name=\"viewport\" content=\"width=device-width, initial-scale=1, maximum-scale=1\">\n\n\t<title>skrollr - parallax scrolling for the masses</title>\n\n\t<link href=\"examples/fixed-positioning.css\" rel=\"stylesheet\" type=\"text/css\" />\n\t<link href=\"examples/main.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n\n<body>\n\t<div id=\"bg1\" data-0=\"background-position:0px 0px;\" data-end=\"background-position:-500px -10000px;\"></div>\n\t<div id=\"bg2\" data-0=\"background-position:0px 0px;\" data-end=\"background-position:-500px -8000px;\"></div>\n\t<div id=\"bg3\" data-0=\"background-position:0px 0px;\" data-end=\"background-position:-500px -6000px;\"></div>\n\n\t<div id=\"progress\" data-0=\"width:0%;background:hsl(200, 100%, 50%);\" data-end=\"width:100%;background:hsl(920, 100%, 50%);\"></div>\n\n\t<div id=\"intro\" data-0=\"opacity:1;top:3%;transform:rotate(0deg);transform-origin:0 0;\" data-500=\"opacity:0;top:-10%;transform:rotate(-90deg);\">\n\t\t<h1><a href=\"https://github.com/Prinzhorn/skrollr\">skrollr</a></h1>\n\t\t<h2>parallax scrolling for the masses</h2>\n\t\t<p>let's get scrollin' ;-)</p>\n\t\t<p class=\"arrows\">▼&nbsp;▼&nbsp;▼</p>\n\t</div>\n\n\t<div id=\"transform\" data-500=\"transform:scale(0) rotate(0deg);\" data-1000=\"transform:scale(1) rotate(1440deg);opacity:1;\" data-1600=\"\" data-1700=\"transform:scale(5) rotate(3240deg);opacity:0;\">\n\t\t<h2>transform</h2>\n\t\t<p>scale, skew and rotate the sh** out of any element</p>\n\t</div>\n\n\t<div id=\"properties\" data-1700=\"top:100%;\" data-2200=\"top:0%;\" data-3000=\"display:block;\" data-3700=\"top:-100%;display:none;\">\n\t\t<h2>all numeric properties</h2>\n\t\t<p>width, height, padding, font-size, z-index, blah blah blah</p>\n\t</div>\n\n\t<div id=\"easing_wrapper\" data-0=\"display:none;\" data-3900=\"display:block;\" data-4900=\"background:rgba(0, 0, 0, 0);color[swing]:rgb(0,0,0);\" data-5900=\"background:rgba(0,0,0,1);color:rgb(255,255,255);\" data-10000=\"top:0%;\" data-12000=\"top:-100%;\">\n\t\t<div id=\"easing\" data-3900=\"left:100%\" data-4600=\"left:25%;\">\n\t\t\t<h2>easing?</h2>\n\t\t\t<p>sure.</p>\n\t\t\t<p>let me dim the <span data-3900=\"\" data-4900=\"color[swing]:rgb(0,0,0);\" data-5900=\"color:rgb(255,255,0);\">lights</span> for this one...</p>\n\t\t\t<p data-5900=\"opacity:0;font-size:100%;\" data-6500=\"opacity:1;font-size:150%;\">you can set easings for each property and define own easing functions</p>\n\t\t</div>\n\n\t\t<div class=\"drop\" data-6500=\"left:15%;bottom:100%;\" data-9500=\"bottom:0%;\">linear</div>\n\t\t<div class=\"drop\" data-6500=\"left:25%;bottom[quadratic]:100%;\" data-9500=\"bottom:0%;\">quadratic</div>\n\t\t<div class=\"drop\" data-6500=\"left:35%;bottom[cubic]:100%;\" data-9500=\"bottom:0%;\">cubic</div>\n\t\t<div class=\"drop\" data-6500=\"left:45%;bottom[swing]:100%;\" data-9500=\"bottom:0%;\">swing</div>\n\t\t<div class=\"drop\" data-6500=\"left:55%;bottom[WTF]:100%;\" data-9500=\"bottom:0%;\">WTF</div>\n\t\t<div class=\"drop\" data-6500=\"left:65%;bottom[inverted]:100%;\" data-9500=\"bottom:0%;\">inverted</div>\n\t\t<div class=\"drop\" data-6500=\"left:75%;bottom[bounce]:100%;\" data-9500=\"bottom:0%;\">bounce</div>\n\t</div>\n\n\t<div id=\"download\" data-10000=\"top[cubic]:100%;border-radius[cubic]:0em;background:rgb(0,50,100);border-width:0px;\" data-12000=\"top:10%;border-radius:2em;background:rgb(190,230,255);border-width:10px;\">\n\t\t<h2>the end</h2>\n\t\t<p>by the way, you can also animate colors (you did notice this, didn't you?)</p>\n\t\t<p><strong>Now get this thing on <a href=\"https://github.com/Prinzhorn/skrollr\">GitHub</a> and spread the word, it's open source!</strong> <a href=\"https://twitter.com/share\" class=\"twitter-share-button\" data-url=\"http://prinzhorn.github.com/skrollr/\" data-via=\"Prinzhorn\">Tweet</a>\n\t\t<script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0];if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=\"//platform.twitter.com/widgets.js\";fjs.parentNode.insertBefore(js,fjs);}}(document,\"script\",\"twitter-wjs\");</script></p>\n\t\t<p>Check out more <a href=\"https://github.com/Prinzhorn/skrollr/tree/master/examples#examples\">examples</a>.</p>\n\t\t<p>Handcrafted by <a href=\"https://twitter.com/Prinzhorn\" class=\"twitter-follow-button\" data-show-count=\"false\">Follow @Prinzhorn</a>\n\t\t<script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0];if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=\"//platform.twitter.com/widgets.js\";fjs.parentNode.insertBefore(js,fjs);}}(document,\"script\",\"twitter-wjs\");</script></p>\n\t</div>\n\n\t<div id=\"scrollbar\" data-0=\"top:0%;margin-top:2px;\" data-end=\"top:100%;margin-top:-52px;\"></div>\n\n\t<script type=\"text/javascript\" src=\"dist/skrollr.min.js\"></script>\n\n\t<!--[if lt IE 9]>\n\t<script type=\"text/javascript\" src=\"../skrollr-ie/dist/skrollr.ie.min.js\"></script>\n\t<![endif]-->\n\n\t<script type=\"text/javascript\">\n\tvar s = skrollr.init({\n\t\tedgeStrategy: 'set',\n\t\teasing: {\n\t\t\tWTF: Math.random,\n\t\t\tinverted: function(p) {\n\t\t\t\treturn 1-p;\n\t\t\t}\n\t\t}\n\t});\n\t</script>\n</body>\n\n</html>\n"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"skrollr\",\n  \"title\": \"skrollr\",\n  \"description\": \"Stand-alone parallax scrolling library with zero dependencies.\",\n  \"version\": \"0.6.30\",\n  \"homepage\": \"https://github.com/Prinzhorn/skrollr\",\n  \"author\": {\n    \"name\": \"Alexander Prinzhorn\",\n    \"email\": \"alexander@prinzhorn.it\",\n    \"url\": \"http://www.prinzhorn.it/\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git://github.com/Prinzhorn/skrollr.git\"\n  },\n  \"bugs\": {\n    \"url\": \"https://github.com/Prinzhorn/skrollr/issues\"\n  },\n  \"licenses\": [\n    {\n      \"type\": \"MIT\",\n      \"url\": \"https://github.com/Prinzhorn/skrollr/blob/master/LICENSE.txt\"\n    }\n  ],\n  \"main\": \"dist/skrollr.min.js\",\n  \"engines\": {\n    \"node\": \"0.10.x\"\n  },\n  \"scripts\": {\n    \"test\": \"grunt travis --verbose\"\n  },\n  \"devDependencies\": {\n    \"grunt-cli\": \"~0.1.7\",\n    \"grunt\": \"~0.4.1\",\n    \"grunt-contrib-uglify\": \"~0.2.0\",\n    \"grunt-contrib-jshint\": \"~0.3.0\",\n    \"grunt-contrib-qunit\": \"~0.2.0\"\n  },\n  \"keywords\": []\n}\n"
  },
  {
    "path": "shim.html",
    "content": "<!DOCTYPE html>\n<html>\n<head class=\"no-skrollr\">\n\t<meta charset=\"utf-8\">\n\n\t<meta name=\"viewport\" content=\"width=device-width, initial-scale=1, user-scalable=no\">\n\n\t<title>Your title</title>\n</head>\n\n<body>\n\t<div id=\"skrollr-body\">\n\t<!--\n\t\tPut all your elements here.\n\t-->\n\t</div>\n\n\t<script type=\"text/javascript\" src=\"dist/skrollr.min.js\"></script>\n\n\t<!--[if lt IE 9]>\n\t<script type=\"text/javascript\" src=\"dist/skrollr.ie.min.js\"></script>\n\t<![endif]-->\n\n\t<script type=\"text/javascript\">\n\tvar s = skrollr.init();\n\n\t//Or you may call the init-function at some other point. You could for example use an image preloader.\n\t/*\n\twindow.onload = function() {\n\t\t//Calling it twice doesn't hurt.\n\t\tskrollr.init();\n\t};\n\t*/\n\t</script>\n</body>\n\n</html>"
  },
  {
    "path": "src/skrollr.js",
    "content": "/*!\n * skrollr core\n *\n * Alexander Prinzhorn - https://github.com/Prinzhorn/skrollr\n *\n * Free to use under terms of MIT license\n */\n(function(window, document, undefined) {\n\t'use strict';\n\n\t/*\n\t * Global api.\n\t */\n\tvar skrollr = {\n\t\tget: function() {\n\t\t\treturn _instance;\n\t\t},\n\t\t//Main entry point.\n\t\tinit: function(options) {\n\t\t\treturn _instance || new Skrollr(options);\n\t\t},\n\t\tVERSION: '0.6.30'\n\t};\n\n\t//Minify optimization.\n\tvar hasProp = Object.prototype.hasOwnProperty;\n\tvar Math = window.Math;\n\tvar getStyle = window.getComputedStyle;\n\n\t//They will be filled when skrollr gets initialized.\n\tvar documentElement;\n\tvar body;\n\n\tvar EVENT_TOUCHSTART = 'touchstart';\n\tvar EVENT_TOUCHMOVE = 'touchmove';\n\tvar EVENT_TOUCHCANCEL = 'touchcancel';\n\tvar EVENT_TOUCHEND = 'touchend';\n\n\tvar SKROLLABLE_CLASS = 'skrollable';\n\tvar SKROLLABLE_BEFORE_CLASS = SKROLLABLE_CLASS + '-before';\n\tvar SKROLLABLE_BETWEEN_CLASS = SKROLLABLE_CLASS + '-between';\n\tvar SKROLLABLE_AFTER_CLASS = SKROLLABLE_CLASS + '-after';\n\n\tvar SKROLLR_CLASS = 'skrollr';\n\tvar NO_SKROLLR_CLASS = 'no-' + SKROLLR_CLASS;\n\tvar SKROLLR_DESKTOP_CLASS = SKROLLR_CLASS + '-desktop';\n\tvar SKROLLR_MOBILE_CLASS = SKROLLR_CLASS + '-mobile';\n\n\tvar DEFAULT_EASING = 'linear';\n\tvar DEFAULT_DURATION = 1000;//ms\n\tvar DEFAULT_MOBILE_DECELERATION = 0.004;//pixel/ms²\n\n\tvar DEFAULT_SKROLLRBODY = 'skrollr-body';\n\n\tvar DEFAULT_SMOOTH_SCROLLING_DURATION = 200;//ms\n\n\tvar ANCHOR_START = 'start';\n\tvar ANCHOR_END = 'end';\n\tvar ANCHOR_CENTER = 'center';\n\tvar ANCHOR_BOTTOM = 'bottom';\n\n\t//The property which will be added to the DOM element to hold the ID of the skrollable.\n\tvar SKROLLABLE_ID_DOM_PROPERTY = '___skrollable_id';\n\n\tvar rxTouchIgnoreTags = /^(?:input|textarea|button|select)$/i;\n\n\tvar rxTrim = /^\\s+|\\s+$/g;\n\n\t//Find all data-attributes. data-[_constant]-[offset]-[anchor]-[anchor].\n\tvar rxKeyframeAttribute = /^data(?:-(_\\w+))?(?:-?(-?\\d*\\.?\\d+p?))?(?:-?(start|end|top|center|bottom))?(?:-?(top|center|bottom))?$/;\n\n\tvar rxPropValue = /\\s*(@?[\\w\\-\\[\\]]+)\\s*:\\s*(.+?)\\s*(?:;|$)/gi;\n\n\t//Easing function names follow the property in square brackets.\n\tvar rxPropEasing = /^(@?[a-z\\-]+)\\[(\\w+)\\]$/;\n\n\tvar rxCamelCase = /-([a-z0-9_])/g;\n\tvar rxCamelCaseFn = function(str, letter) {\n\t\treturn letter.toUpperCase();\n\t};\n\n\t//Numeric values with optional sign.\n\tvar rxNumericValue = /[\\-+]?[\\d]*\\.?[\\d]+/g;\n\n\t//Used to replace occurences of {?} with a number.\n\tvar rxInterpolateString = /\\{\\?\\}/g;\n\n\t//Finds rgb(a) colors, which don't use the percentage notation.\n\tvar rxRGBAIntegerColor = /rgba?\\(\\s*-?\\d+\\s*,\\s*-?\\d+\\s*,\\s*-?\\d+/g;\n\n\t//Finds all gradients.\n\tvar rxGradient = /[a-z\\-]+-gradient/g;\n\n\t//Vendor prefix. Will be set once skrollr gets initialized.\n\tvar theCSSPrefix = '';\n\tvar theDashedCSSPrefix = '';\n\n\t//Will be called once (when skrollr gets initialized).\n\tvar detectCSSPrefix = function() {\n\t\t//Only relevant prefixes. May be extended.\n\t\t//Could be dangerous if there will ever be a CSS property which actually starts with \"ms\". Don't hope so.\n\t\tvar rxPrefixes = /^(?:O|Moz|webkit|ms)|(?:-(?:o|moz|webkit|ms)-)/;\n\n\t\t//Detect prefix for current browser by finding the first property using a prefix.\n\t\tif(!getStyle) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar style = getStyle(body, null);\n\n\t\tfor(var k in style) {\n\t\t\t//We check the key and if the key is a number, we check the value as well, because safari's getComputedStyle returns some weird array-like thingy.\n\t\t\ttheCSSPrefix = (k.match(rxPrefixes) || (+k == k && style[k].match(rxPrefixes)));\n\n\t\t\tif(theCSSPrefix) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\t//Did we even detect a prefix?\n\t\tif(!theCSSPrefix) {\n\t\t\ttheCSSPrefix = theDashedCSSPrefix = '';\n\n\t\t\treturn;\n\t\t}\n\n\t\ttheCSSPrefix = theCSSPrefix[0];\n\n\t\t//We could have detected either a dashed prefix or this camelCaseish-inconsistent stuff.\n\t\tif(theCSSPrefix.slice(0,1) === '-') {\n\t\t\ttheDashedCSSPrefix = theCSSPrefix;\n\n\t\t\t//There's no logic behind these. Need a look up.\n\t\t\ttheCSSPrefix = ({\n\t\t\t\t'-webkit-': 'webkit',\n\t\t\t\t'-moz-': 'Moz',\n\t\t\t\t'-ms-': 'ms',\n\t\t\t\t'-o-': 'O'\n\t\t\t})[theCSSPrefix];\n\t\t} else {\n\t\t\ttheDashedCSSPrefix = '-' + theCSSPrefix.toLowerCase() + '-';\n\t\t}\n\t};\n\n\tvar polyfillRAF = function() {\n\t\tvar requestAnimFrame = window.requestAnimationFrame || window[theCSSPrefix.toLowerCase() + 'RequestAnimationFrame'];\n\n\t\tvar lastTime = _now();\n\n\t\tif(_isMobile || !requestAnimFrame) {\n\t\t\trequestAnimFrame = function(callback) {\n\t\t\t\t//How long did it take to render?\n\t\t\t\tvar deltaTime = _now() - lastTime;\n\t\t\t\tvar delay = Math.max(0, 1000 / 60 - deltaTime);\n\n\t\t\t\treturn window.setTimeout(function() {\n\t\t\t\t\tlastTime = _now();\n\t\t\t\t\tcallback();\n\t\t\t\t}, delay);\n\t\t\t};\n\t\t}\n\n\t\treturn requestAnimFrame;\n\t};\n\n\tvar polyfillCAF = function() {\n\t\tvar cancelAnimFrame = window.cancelAnimationFrame || window[theCSSPrefix.toLowerCase() + 'CancelAnimationFrame'];\n\n\t\tif(_isMobile || !cancelAnimFrame) {\n\t\t\tcancelAnimFrame = function(timeout) {\n\t\t\t\treturn window.clearTimeout(timeout);\n\t\t\t};\n\t\t}\n\n\t\treturn cancelAnimFrame;\n\t};\n\n\t//Built-in easing functions.\n\tvar easings = {\n\t\tbegin: function() {\n\t\t\treturn 0;\n\t\t},\n\t\tend: function() {\n\t\t\treturn 1;\n\t\t},\n\t\tlinear: function(p) {\n\t\t\treturn p;\n\t\t},\n\t\tquadratic: function(p) {\n\t\t\treturn p * p;\n\t\t},\n\t\tcubic: function(p) {\n\t\t\treturn p * p * p;\n\t\t},\n\t\tswing: function(p) {\n\t\t\treturn (-Math.cos(p * Math.PI) / 2) + 0.5;\n\t\t},\n\t\tsqrt: function(p) {\n\t\t\treturn Math.sqrt(p);\n\t\t},\n\t\toutCubic: function(p) {\n\t\t\treturn (Math.pow((p - 1), 3) + 1);\n\t\t},\n\t\t//see https://www.desmos.com/calculator/tbr20s8vd2 for how I did this\n\t\tbounce: function(p) {\n\t\t\tvar a;\n\n\t\t\tif(p <= 0.5083) {\n\t\t\t\ta = 3;\n\t\t\t} else if(p <= 0.8489) {\n\t\t\t\ta = 9;\n\t\t\t} else if(p <= 0.96208) {\n\t\t\t\ta = 27;\n\t\t\t} else if(p <= 0.99981) {\n\t\t\t\ta = 91;\n\t\t\t} else {\n\t\t\t\treturn 1;\n\t\t\t}\n\n\t\t\treturn 1 - Math.abs(3 * Math.cos(p * a * 1.028) / a);\n\t\t}\n\t};\n\n\t/**\n\t * Constructor.\n\t */\n\tfunction Skrollr(options) {\n\t\tdocumentElement = document.documentElement;\n\t\tbody = document.body;\n\n\t\tdetectCSSPrefix();\n\n\t\t_instance = this;\n\n\t\toptions = options || {};\n\n\t\t_constants = options.constants || {};\n\n\t\t//We allow defining custom easings or overwrite existing.\n\t\tif(options.easing) {\n\t\t\tfor(var e in options.easing) {\n\t\t\t\teasings[e] = options.easing[e];\n\t\t\t}\n\t\t}\n\n\t\t_edgeStrategy = options.edgeStrategy || 'set';\n\n\t\t_listeners = {\n\t\t\t//Function to be called right before rendering.\n\t\t\tbeforerender: options.beforerender,\n\n\t\t\t//Function to be called right after finishing rendering.\n\t\t\trender: options.render,\n\n\t\t\t//Function to be called whenever an element with the `data-emit-events` attribute passes a keyframe.\n\t\t\tkeyframe: options.keyframe\n\t\t};\n\n\t\t//forceHeight is true by default\n\t\t_forceHeight = options.forceHeight !== false;\n\n\t\tif(_forceHeight) {\n\t\t\t_scale = options.scale || 1;\n\t\t}\n\n\t\t_mobileDeceleration = options.mobileDeceleration || DEFAULT_MOBILE_DECELERATION;\n\n\t\t_smoothScrollingEnabled = options.smoothScrolling !== false;\n\t\t_smoothScrollingDuration = options.smoothScrollingDuration || DEFAULT_SMOOTH_SCROLLING_DURATION;\n\n\t\t//Dummy object. Will be overwritten in the _render method when smooth scrolling is calculated.\n\t\t_smoothScrolling = {\n\t\t\ttargetTop: _instance.getScrollTop()\n\t\t};\n\n\t\t//A custom check function may be passed.\n\t\t_isMobile = ((options.mobileCheck || function() {\n\t\t\treturn (/Android|iPhone|iPad|iPod|BlackBerry/i).test(navigator.userAgent || navigator.vendor || window.opera);\n\t\t})());\n\n\t\tif(_isMobile) {\n\t\t\t_skrollrBody = document.getElementById(options.skrollrBody || DEFAULT_SKROLLRBODY);\n\n\t\t\t//Detect 3d transform if there's a skrollr-body (only needed for #skrollr-body).\n\t\t\tif(_skrollrBody) {\n\t\t\t\t_detect3DTransforms();\n\t\t\t}\n\n\t\t\t_initMobile();\n\t\t\t_updateClass(documentElement, [SKROLLR_CLASS, SKROLLR_MOBILE_CLASS], [NO_SKROLLR_CLASS]);\n\t\t} else {\n\t\t\t_updateClass(documentElement, [SKROLLR_CLASS, SKROLLR_DESKTOP_CLASS], [NO_SKROLLR_CLASS]);\n\t\t}\n\n\t\t//Triggers parsing of elements and a first reflow.\n\t\t_instance.refresh();\n\n\t\t_addEvent(window, 'resize orientationchange', function() {\n\t\t\tvar width = documentElement.clientWidth;\n\t\t\tvar height = documentElement.clientHeight;\n\n\t\t\t//Only reflow if the size actually changed (#271).\n\t\t\tif(height !== _lastViewportHeight || width !== _lastViewportWidth) {\n\t\t\t\t_lastViewportHeight = height;\n\t\t\t\t_lastViewportWidth = width;\n\n\t\t\t\t_requestReflow = true;\n\t\t\t}\n\t\t});\n\n\t\tvar requestAnimFrame = polyfillRAF();\n\n\t\t//Let's go.\n\t\t(function animloop(){\n\t\t\t_render();\n\t\t\t_animFrame = requestAnimFrame(animloop);\n\t\t}());\n\n\t\treturn _instance;\n\t}\n\n\t/**\n\t * (Re)parses some or all elements.\n\t */\n\tSkrollr.prototype.refresh = function(elements) {\n\t\tvar elementIndex;\n\t\tvar elementsLength;\n\t\tvar ignoreID = false;\n\n\t\t//Completely reparse anything without argument.\n\t\tif(elements === undefined) {\n\t\t\t//Ignore that some elements may already have a skrollable ID.\n\t\t\tignoreID = true;\n\n\t\t\t_skrollables = [];\n\t\t\t_skrollableIdCounter = 0;\n\n\t\t\telements = document.getElementsByTagName('*');\n\t\t} else if(elements.length === undefined) {\n\t\t\t//We also accept a single element as parameter.\n\t\t\telements = [elements];\n\t\t}\n\n\t\telementIndex = 0;\n\t\telementsLength = elements.length;\n\n\t\tfor(; elementIndex < elementsLength; elementIndex++) {\n\t\t\tvar el = elements[elementIndex];\n\t\t\tvar anchorTarget = el;\n\t\t\tvar keyFrames = [];\n\n\t\t\t//If this particular element should be smooth scrolled.\n\t\t\tvar smoothScrollThis = _smoothScrollingEnabled;\n\n\t\t\t//The edge strategy for this particular element.\n\t\t\tvar edgeStrategy = _edgeStrategy;\n\n\t\t\t//If this particular element should emit keyframe events.\n\t\t\tvar emitEvents = false;\n\n\t\t\t//If we're reseting the counter, remove any old element ids that may be hanging around.\n\t\t\tif(ignoreID && SKROLLABLE_ID_DOM_PROPERTY in el) {\n\t\t\t\tdelete el[SKROLLABLE_ID_DOM_PROPERTY];\n\t\t\t}\n\n\t\t\tif(!el.attributes) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t//Iterate over all attributes and search for key frame attributes.\n\t\t\tvar attributeIndex = 0;\n\t\t\tvar attributesLength = el.attributes.length;\n\n\t\t\tfor (; attributeIndex < attributesLength; attributeIndex++) {\n\t\t\t\tvar attr = el.attributes[attributeIndex];\n\n\t\t\t\tif(attr.name === 'data-anchor-target') {\n\t\t\t\t\tanchorTarget = document.querySelector(attr.value);\n\n\t\t\t\t\tif(anchorTarget === null) {\n\t\t\t\t\t\tthrow 'Unable to find anchor target \"' + attr.value + '\"';\n\t\t\t\t\t}\n\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t//Global smooth scrolling can be overridden by the element attribute.\n\t\t\t\tif(attr.name === 'data-smooth-scrolling') {\n\t\t\t\t\tsmoothScrollThis = attr.value !== 'off';\n\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t//Global edge strategy can be overridden by the element attribute.\n\t\t\t\tif(attr.name === 'data-edge-strategy') {\n\t\t\t\t\tedgeStrategy = attr.value;\n\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t//Is this element tagged with the `data-emit-events` attribute?\n\t\t\t\tif(attr.name === 'data-emit-events') {\n\t\t\t\t\temitEvents = true;\n\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tvar match = attr.name.match(rxKeyframeAttribute);\n\n\t\t\t\tif(match === null) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tvar kf = {\n\t\t\t\t\tprops: attr.value,\n\t\t\t\t\t//Point back to the element as well.\n\t\t\t\t\telement: el,\n\t\t\t\t\t//The name of the event which this keyframe will fire, if emitEvents is\n\t\t\t\t\teventType: attr.name.replace(rxCamelCase, rxCamelCaseFn)\n\t\t\t\t};\n\n\t\t\t\tkeyFrames.push(kf);\n\n\t\t\t\tvar constant = match[1];\n\n\t\t\t\tif(constant) {\n\t\t\t\t\t//Strip the underscore prefix.\n\t\t\t\t\tkf.constant = constant.substr(1);\n\t\t\t\t}\n\n\t\t\t\t//Get the key frame offset.\n\t\t\t\tvar offset = match[2];\n\n\t\t\t\t//Is it a percentage offset?\n\t\t\t\tif(/p$/.test(offset)) {\n\t\t\t\t\tkf.isPercentage = true;\n\t\t\t\t\tkf.offset = (offset.slice(0, -1) | 0) / 100;\n\t\t\t\t} else {\n\t\t\t\t\tkf.offset = (offset | 0);\n\t\t\t\t}\n\n\t\t\t\tvar anchor1 = match[3];\n\n\t\t\t\t//If second anchor is not set, the first will be taken for both.\n\t\t\t\tvar anchor2 = match[4] || anchor1;\n\n\t\t\t\t//\"absolute\" (or \"classic\") mode, where numbers mean absolute scroll offset.\n\t\t\t\tif(!anchor1 || anchor1 === ANCHOR_START || anchor1 === ANCHOR_END) {\n\t\t\t\t\tkf.mode = 'absolute';\n\n\t\t\t\t\t//data-end needs to be calculated after all key frames are known.\n\t\t\t\t\tif(anchor1 === ANCHOR_END) {\n\t\t\t\t\t\tkf.isEnd = true;\n\t\t\t\t\t} else if(!kf.isPercentage) {\n\t\t\t\t\t\t//For data-start we can already set the key frame w/o calculations.\n\t\t\t\t\t\t//#59: \"scale\" options should only affect absolute mode.\n\t\t\t\t\t\tkf.offset = kf.offset * _scale;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t//\"relative\" mode, where numbers are relative to anchors.\n\t\t\t\telse {\n\t\t\t\t\tkf.mode = 'relative';\n\t\t\t\t\tkf.anchors = [anchor1, anchor2];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t//Does this element have key frames?\n\t\t\tif(!keyFrames.length) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t//Will hold the original style and class attributes before we controlled the element (see #80).\n\t\t\tvar styleAttr, classAttr;\n\n\t\t\tvar id;\n\n\t\t\tif(!ignoreID && SKROLLABLE_ID_DOM_PROPERTY in el) {\n\t\t\t\t//We already have this element under control. Grab the corresponding skrollable id.\n\t\t\t\tid = el[SKROLLABLE_ID_DOM_PROPERTY];\n\t\t\t\tstyleAttr = _skrollables[id].styleAttr;\n\t\t\t\tclassAttr = _skrollables[id].classAttr;\n\t\t\t} else {\n\t\t\t\t//It's an unknown element. Asign it a new skrollable id.\n\t\t\t\tid = (el[SKROLLABLE_ID_DOM_PROPERTY] = _skrollableIdCounter++);\n\t\t\t\tstyleAttr = el.style.cssText;\n\t\t\t\tclassAttr = _getClass(el);\n\t\t\t}\n\n\t\t\t_skrollables[id] = {\n\t\t\t\telement: el,\n\t\t\t\tstyleAttr: styleAttr,\n\t\t\t\tclassAttr: classAttr,\n\t\t\t\tanchorTarget: anchorTarget,\n\t\t\t\tkeyFrames: keyFrames,\n\t\t\t\tsmoothScrolling: smoothScrollThis,\n\t\t\t\tedgeStrategy: edgeStrategy,\n\t\t\t\temitEvents: emitEvents,\n\t\t\t\tlastFrameIndex: -1\n\t\t\t};\n\n\t\t\t_updateClass(el, [SKROLLABLE_CLASS], []);\n\t\t}\n\n\t\t//Reflow for the first time.\n\t\t_reflow();\n\n\t\t//Now that we got all key frame numbers right, actually parse the properties.\n\t\telementIndex = 0;\n\t\telementsLength = elements.length;\n\n\t\tfor(; elementIndex < elementsLength; elementIndex++) {\n\t\t\tvar sk = _skrollables[elements[elementIndex][SKROLLABLE_ID_DOM_PROPERTY]];\n\n\t\t\tif(sk === undefined) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t//Parse the property string to objects\n\t\t\t_parseProps(sk);\n\n\t\t\t//Fill key frames with missing properties from left and right\n\t\t\t_fillProps(sk);\n\t\t}\n\n\t\treturn _instance;\n\t};\n\n\t/**\n\t * Transform \"relative\" mode to \"absolute\" mode.\n\t * That is, calculate anchor position and offset of element.\n\t */\n\tSkrollr.prototype.relativeToAbsolute = function(element, viewportAnchor, elementAnchor) {\n\t\tvar viewportHeight = documentElement.clientHeight;\n\t\tvar box = element.getBoundingClientRect();\n\t\tvar absolute = box.top;\n\n\t\t//#100: IE doesn't supply \"height\" with getBoundingClientRect.\n\t\tvar boxHeight = box.bottom - box.top;\n\n\t\tif(viewportAnchor === ANCHOR_BOTTOM) {\n\t\t\tabsolute -= viewportHeight;\n\t\t} else if(viewportAnchor === ANCHOR_CENTER) {\n\t\t\tabsolute -= viewportHeight / 2;\n\t\t}\n\n\t\tif(elementAnchor === ANCHOR_BOTTOM) {\n\t\t\tabsolute += boxHeight;\n\t\t} else if(elementAnchor === ANCHOR_CENTER) {\n\t\t\tabsolute += boxHeight / 2;\n\t\t}\n\n\t\t//Compensate scrolling since getBoundingClientRect is relative to viewport.\n\t\tabsolute += _instance.getScrollTop();\n\n\t\treturn (absolute + 0.5) | 0;\n\t};\n\n\t/**\n\t * Animates scroll top to new position.\n\t */\n\tSkrollr.prototype.animateTo = function(top, options) {\n\t\toptions = options || {};\n\n\t\tvar now = _now();\n\t\tvar scrollTop = _instance.getScrollTop();\n\t\tvar duration = options.duration === undefined ? DEFAULT_DURATION : options.duration;\n\n\t\t//Setting this to a new value will automatically cause the current animation to stop, if any.\n\t\t_scrollAnimation = {\n\t\t\tstartTop: scrollTop,\n\t\t\ttopDiff: top - scrollTop,\n\t\t\ttargetTop: top,\n\t\t\tduration: duration,\n\t\t\tstartTime: now,\n\t\t\tendTime: now + duration,\n\t\t\teasing: easings[options.easing || DEFAULT_EASING],\n\t\t\tdone: options.done\n\t\t};\n\n\t\t//Don't queue the animation if there's nothing to animate.\n\t\tif(!_scrollAnimation.topDiff) {\n\t\t\tif(_scrollAnimation.done) {\n\t\t\t\t_scrollAnimation.done.call(_instance, false);\n\t\t\t}\n\n\t\t\t_scrollAnimation = undefined;\n\t\t}\n\n\t\treturn _instance;\n\t};\n\n\t/**\n\t * Stops animateTo animation.\n\t */\n\tSkrollr.prototype.stopAnimateTo = function() {\n\t\tif(_scrollAnimation && _scrollAnimation.done) {\n\t\t\t_scrollAnimation.done.call(_instance, true);\n\t\t}\n\n\t\t_scrollAnimation = undefined;\n\t};\n\n\t/**\n\t * Returns if an animation caused by animateTo is currently running.\n\t */\n\tSkrollr.prototype.isAnimatingTo = function() {\n\t\treturn !!_scrollAnimation;\n\t};\n\n\tSkrollr.prototype.isMobile = function() {\n\t\treturn _isMobile;\n\t};\n\n\tSkrollr.prototype.setScrollTop = function(top, force) {\n\t\t_forceRender = (force === true);\n\n\t\tif(_isMobile) {\n\t\t\t_mobileOffset = Math.min(Math.max(top, 0), _maxKeyFrame);\n\t\t} else {\n\t\t\twindow.scrollTo(0, top);\n\t\t}\n\n\t\treturn _instance;\n\t};\n\n\tSkrollr.prototype.getScrollTop = function() {\n\t\tif(_isMobile) {\n\t\t\treturn _mobileOffset;\n\t\t} else {\n\t\t\treturn window.pageYOffset || documentElement.scrollTop || body.scrollTop || 0;\n\t\t}\n\t};\n\n\tSkrollr.prototype.getMaxScrollTop = function() {\n\t\treturn _maxKeyFrame;\n\t};\n\n\tSkrollr.prototype.on = function(name, fn) {\n\t\t_listeners[name] = fn;\n\n\t\treturn _instance;\n\t};\n\n\tSkrollr.prototype.off = function(name) {\n\t\tdelete _listeners[name];\n\n\t\treturn _instance;\n\t};\n\n\tSkrollr.prototype.destroy = function() {\n\t\tvar cancelAnimFrame = polyfillCAF();\n\t\tcancelAnimFrame(_animFrame);\n\t\t_removeAllEvents();\n\n\t\t_updateClass(documentElement, [NO_SKROLLR_CLASS], [SKROLLR_CLASS, SKROLLR_DESKTOP_CLASS, SKROLLR_MOBILE_CLASS]);\n\n\t\tvar skrollableIndex = 0;\n\t\tvar skrollablesLength = _skrollables.length;\n\n\t\tfor(; skrollableIndex < skrollablesLength; skrollableIndex++) {\n\t\t\t_reset(_skrollables[skrollableIndex].element);\n\t\t}\n\n\t\tdocumentElement.style.overflow = body.style.overflow = '';\n\t\tdocumentElement.style.height = body.style.height = '';\n\n\t\tif(_skrollrBody) {\n\t\t\tskrollr.setStyle(_skrollrBody, 'transform', 'none');\n\t\t}\n\n\t\t_instance = undefined;\n\t\t_skrollrBody = undefined;\n\t\t_listeners = undefined;\n\t\t_forceHeight = undefined;\n\t\t_maxKeyFrame = 0;\n\t\t_scale = 1;\n\t\t_constants = undefined;\n\t\t_mobileDeceleration = undefined;\n\t\t_direction = 'down';\n\t\t_lastTop = -1;\n\t\t_lastViewportWidth = 0;\n\t\t_lastViewportHeight = 0;\n\t\t_requestReflow = false;\n\t\t_scrollAnimation = undefined;\n\t\t_smoothScrollingEnabled = undefined;\n\t\t_smoothScrollingDuration = undefined;\n\t\t_smoothScrolling = undefined;\n\t\t_forceRender = undefined;\n\t\t_skrollableIdCounter = 0;\n\t\t_edgeStrategy = undefined;\n\t\t_isMobile = false;\n\t\t_mobileOffset = 0;\n\t\t_translateZ = undefined;\n\t};\n\n\t/*\n\t\tPrivate methods.\n\t*/\n\n\tvar _initMobile = function() {\n\t\tvar initialElement;\n\t\tvar initialTouchY;\n\t\tvar initialTouchX;\n\t\tvar currentElement;\n\t\tvar currentTouchY;\n\t\tvar currentTouchX;\n\t\tvar lastTouchY;\n\t\tvar deltaY;\n\n\t\tvar initialTouchTime;\n\t\tvar currentTouchTime;\n\t\tvar lastTouchTime;\n\t\tvar deltaTime;\n\n\t\t_addEvent(documentElement, [EVENT_TOUCHSTART, EVENT_TOUCHMOVE, EVENT_TOUCHCANCEL, EVENT_TOUCHEND].join(' '), function(e) {\n\t\t\tvar touch = e.changedTouches[0];\n\n\t\t\tcurrentElement = e.target;\n\n\t\t\t//We don't want text nodes.\n\t\t\twhile(currentElement.nodeType === 3) {\n\t\t\t\tcurrentElement = currentElement.parentNode;\n\t\t\t}\n\n\t\t\tcurrentTouchY = touch.clientY;\n\t\t\tcurrentTouchX = touch.clientX;\n\t\t\tcurrentTouchTime = e.timeStamp;\n\n\t\t\tif(!rxTouchIgnoreTags.test(currentElement.tagName)) {\n\t\t\t\te.preventDefault();\n\t\t\t}\n\n\t\t\tswitch(e.type) {\n\t\t\t\tcase EVENT_TOUCHSTART:\n\t\t\t\t\t//The last element we tapped on.\n\t\t\t\t\tif(initialElement) {\n\t\t\t\t\t\tinitialElement.blur();\n\t\t\t\t\t}\n\n\t\t\t\t\t_instance.stopAnimateTo();\n\n\t\t\t\t\tinitialElement = currentElement;\n\n\t\t\t\t\tinitialTouchY = lastTouchY = currentTouchY;\n\t\t\t\t\tinitialTouchX = currentTouchX;\n\t\t\t\t\tinitialTouchTime = currentTouchTime;\n\n\t\t\t\t\tbreak;\n\t\t\t\tcase EVENT_TOUCHMOVE:\n\t\t\t\t\t//Prevent default event on touchIgnore elements in case they don't have focus yet.\n\t\t\t\t\tif(rxTouchIgnoreTags.test(currentElement.tagName) && document.activeElement !== currentElement) {\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t}\n\n\t\t\t\t\tdeltaY = currentTouchY - lastTouchY;\n\t\t\t\t\tdeltaTime = currentTouchTime - lastTouchTime;\n\n\t\t\t\t\t_instance.setScrollTop(_mobileOffset - deltaY, true);\n\n\t\t\t\t\tlastTouchY = currentTouchY;\n\t\t\t\t\tlastTouchTime = currentTouchTime;\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\tcase EVENT_TOUCHCANCEL:\n\t\t\t\tcase EVENT_TOUCHEND:\n\t\t\t\t\tvar distanceY = initialTouchY - currentTouchY;\n\t\t\t\t\tvar distanceX = initialTouchX - currentTouchX;\n\t\t\t\t\tvar distance2 = distanceX * distanceX + distanceY * distanceY;\n\n\t\t\t\t\t//Check if it was more like a tap (moved less than 7px).\n\t\t\t\t\tif(distance2 < 49) {\n\t\t\t\t\t\tif(!rxTouchIgnoreTags.test(initialElement.tagName)) {\n\t\t\t\t\t\t\tinitialElement.focus();\n\n\t\t\t\t\t\t\t//It was a tap, click the element.\n\t\t\t\t\t\t\tvar clickEvent = document.createEvent('MouseEvents');\n\t\t\t\t\t\t\tclickEvent.initMouseEvent('click', true, true, e.view, 1, touch.screenX, touch.screenY, touch.clientX, touch.clientY, e.ctrlKey, e.altKey, e.shiftKey, e.metaKey, 0, null);\n\t\t\t\t\t\t\tinitialElement.dispatchEvent(clickEvent);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tinitialElement = undefined;\n\n\t\t\t\t\tvar speed = deltaY / deltaTime;\n\n\t\t\t\t\t//Cap speed at 3 pixel/ms.\n\t\t\t\t\tspeed = Math.max(Math.min(speed, 3), -3);\n\n\t\t\t\t\tvar duration = Math.abs(speed / _mobileDeceleration);\n\t\t\t\t\tvar targetOffset = speed * duration + 0.5 * _mobileDeceleration * duration * duration;\n\t\t\t\t\tvar targetTop = _instance.getScrollTop() - targetOffset;\n\n\t\t\t\t\t//Relative duration change for when scrolling above bounds.\n\t\t\t\t\tvar targetRatio = 0;\n\n\t\t\t\t\t//Change duration proportionally when scrolling would leave bounds.\n\t\t\t\t\tif(targetTop > _maxKeyFrame) {\n\t\t\t\t\t\ttargetRatio = (_maxKeyFrame - targetTop) / targetOffset;\n\n\t\t\t\t\t\ttargetTop = _maxKeyFrame;\n\t\t\t\t\t} else if(targetTop < 0) {\n\t\t\t\t\t\ttargetRatio = -targetTop / targetOffset;\n\n\t\t\t\t\t\ttargetTop = 0;\n\t\t\t\t\t}\n\n\t\t\t\t\tduration = duration * (1 - targetRatio);\n\n\t\t\t\t\t_instance.animateTo((targetTop + 0.5) | 0, {easing: 'outCubic', duration: duration});\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t});\n\n\t\t//Just in case there has already been some native scrolling, reset it.\n\t\twindow.scrollTo(0, 0);\n\t\tdocumentElement.style.overflow = body.style.overflow = 'hidden';\n\t};\n\n\t/**\n\t * Updates key frames which depend on others / need to be updated on resize.\n\t * That is \"end\" in \"absolute\" mode and all key frames in \"relative\" mode.\n\t * Also handles constants, because they may change on resize.\n\t */\n\tvar _updateDependentKeyFrames = function() {\n\t\tvar viewportHeight = documentElement.clientHeight;\n\t\tvar processedConstants = _processConstants();\n\t\tvar skrollable;\n\t\tvar element;\n\t\tvar anchorTarget;\n\t\tvar keyFrames;\n\t\tvar keyFrameIndex;\n\t\tvar keyFramesLength;\n\t\tvar kf;\n\t\tvar skrollableIndex;\n\t\tvar skrollablesLength;\n\t\tvar offset;\n\t\tvar constantValue;\n\n\t\t//First process all relative-mode elements and find the max key frame.\n\t\tskrollableIndex = 0;\n\t\tskrollablesLength = _skrollables.length;\n\n\t\tfor(; skrollableIndex < skrollablesLength; skrollableIndex++) {\n\t\t\tskrollable = _skrollables[skrollableIndex];\n\t\t\telement = skrollable.element;\n\t\t\tanchorTarget = skrollable.anchorTarget;\n\t\t\tkeyFrames = skrollable.keyFrames;\n\n\t\t\tkeyFrameIndex = 0;\n\t\t\tkeyFramesLength = keyFrames.length;\n\n\t\t\tfor(; keyFrameIndex < keyFramesLength; keyFrameIndex++) {\n\t\t\t\tkf = keyFrames[keyFrameIndex];\n\n\t\t\t\toffset = kf.offset;\n\t\t\t\tconstantValue = processedConstants[kf.constant] || 0;\n\n\t\t\t\tkf.frame = offset;\n\n\t\t\t\tif(kf.isPercentage) {\n\t\t\t\t\t//Convert the offset to percentage of the viewport height.\n\t\t\t\t\toffset = offset * viewportHeight;\n\n\t\t\t\t\t//Absolute + percentage mode.\n\t\t\t\t\tkf.frame = offset;\n\t\t\t\t}\n\n\t\t\t\tif(kf.mode === 'relative') {\n\t\t\t\t\t_reset(element);\n\n\t\t\t\t\tkf.frame = _instance.relativeToAbsolute(anchorTarget, kf.anchors[0], kf.anchors[1]) - offset;\n\n\t\t\t\t\t_reset(element, true);\n\t\t\t\t}\n\n\t\t\t\tkf.frame += constantValue;\n\n\t\t\t\t//Only search for max key frame when forceHeight is enabled.\n\t\t\t\tif(_forceHeight) {\n\t\t\t\t\t//Find the max key frame, but don't use one of the data-end ones for comparison.\n\t\t\t\t\tif(!kf.isEnd && kf.frame > _maxKeyFrame) {\n\t\t\t\t\t\t_maxKeyFrame = kf.frame;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t//#133: The document can be larger than the maxKeyFrame we found.\n\t\t_maxKeyFrame = Math.max(_maxKeyFrame, _getDocumentHeight());\n\n\t\t//Now process all data-end keyframes.\n\t\tskrollableIndex = 0;\n\t\tskrollablesLength = _skrollables.length;\n\n\t\tfor(; skrollableIndex < skrollablesLength; skrollableIndex++) {\n\t\t\tskrollable = _skrollables[skrollableIndex];\n\t\t\tkeyFrames = skrollable.keyFrames;\n\n\t\t\tkeyFrameIndex = 0;\n\t\t\tkeyFramesLength = keyFrames.length;\n\n\t\t\tfor(; keyFrameIndex < keyFramesLength; keyFrameIndex++) {\n\t\t\t\tkf = keyFrames[keyFrameIndex];\n\n\t\t\t\tconstantValue = processedConstants[kf.constant] || 0;\n\n\t\t\t\tif(kf.isEnd) {\n\t\t\t\t\tkf.frame = _maxKeyFrame - kf.offset + constantValue;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tskrollable.keyFrames.sort(_keyFrameComparator);\n\t\t}\n\t};\n\n\t/**\n\t * Calculates and sets the style properties for the element at the given frame.\n\t * @param fakeFrame The frame to render at when smooth scrolling is enabled.\n\t * @param actualFrame The actual frame we are at.\n\t */\n\tvar _calcSteps = function(fakeFrame, actualFrame) {\n\t\t//Iterate over all skrollables.\n\t\tvar skrollableIndex = 0;\n\t\tvar skrollablesLength = _skrollables.length;\n\n\t\tfor(; skrollableIndex < skrollablesLength; skrollableIndex++) {\n\t\t\tvar skrollable = _skrollables[skrollableIndex];\n\t\t\tvar element = skrollable.element;\n\t\t\tvar frame = skrollable.smoothScrolling ? fakeFrame : actualFrame;\n\t\t\tvar frames = skrollable.keyFrames;\n\t\t\tvar framesLength = frames.length;\n\t\t\tvar firstFrame = frames[0];\n\t\t\tvar lastFrame = frames[frames.length - 1];\n\t\t\tvar beforeFirst = frame < firstFrame.frame;\n\t\t\tvar afterLast = frame > lastFrame.frame;\n\t\t\tvar firstOrLastFrame = beforeFirst ? firstFrame : lastFrame;\n\t\t\tvar emitEvents = skrollable.emitEvents;\n\t\t\tvar lastFrameIndex = skrollable.lastFrameIndex;\n\t\t\tvar key;\n\t\t\tvar value;\n\n\t\t\t//If we are before/after the first/last frame, set the styles according to the given edge strategy.\n\t\t\tif(beforeFirst || afterLast) {\n\t\t\t\t//Check if we already handled this edge case last time.\n\t\t\t\t//Note: using setScrollTop it's possible that we jumped from one edge to the other.\n\t\t\t\tif(beforeFirst && skrollable.edge === -1 || afterLast && skrollable.edge === 1) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t//Add the skrollr-before or -after class.\n\t\t\t\tif(beforeFirst) {\n\t\t\t\t\t_updateClass(element, [SKROLLABLE_BEFORE_CLASS], [SKROLLABLE_AFTER_CLASS, SKROLLABLE_BETWEEN_CLASS]);\n\n\t\t\t\t\t//This handles the special case where we exit the first keyframe.\n\t\t\t\t\tif(emitEvents && lastFrameIndex > -1) {\n\t\t\t\t\t\t_emitEvent(element, firstFrame.eventType, _direction);\n\t\t\t\t\t\tskrollable.lastFrameIndex = -1;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t_updateClass(element, [SKROLLABLE_AFTER_CLASS], [SKROLLABLE_BEFORE_CLASS, SKROLLABLE_BETWEEN_CLASS]);\n\n\t\t\t\t\t//This handles the special case where we exit the last keyframe.\n\t\t\t\t\tif(emitEvents && lastFrameIndex < framesLength) {\n\t\t\t\t\t\t_emitEvent(element, lastFrame.eventType, _direction);\n\t\t\t\t\t\tskrollable.lastFrameIndex = framesLength;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t//Remember that we handled the edge case (before/after the first/last keyframe).\n\t\t\t\tskrollable.edge = beforeFirst ? -1 : 1;\n\n\t\t\t\tswitch(skrollable.edgeStrategy) {\n\t\t\t\t\tcase 'reset':\n\t\t\t\t\t\t_reset(element);\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\tcase 'ease':\n\t\t\t\t\t\t//Handle this case like it would be exactly at first/last keyframe and just pass it on.\n\t\t\t\t\t\tframe = firstOrLastFrame.frame;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\tcase 'set':\n\t\t\t\t\t\tvar props = firstOrLastFrame.props;\n\n\t\t\t\t\t\tfor(key in props) {\n\t\t\t\t\t\t\tif(hasProp.call(props, key)) {\n\t\t\t\t\t\t\t\tvalue = _interpolateString(props[key].value);\n\n\t\t\t\t\t\t\t\t//Set style or attribute.\n\t\t\t\t\t\t\t\tif(key.indexOf('@') === 0) {\n\t\t\t\t\t\t\t\t\telement.setAttribute(key.substr(1), value);\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tskrollr.setStyle(element, key, value);\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\n\t\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t//Did we handle an edge last time?\n\t\t\t\tif(skrollable.edge !== 0) {\n\t\t\t\t\t_updateClass(element, [SKROLLABLE_CLASS, SKROLLABLE_BETWEEN_CLASS], [SKROLLABLE_BEFORE_CLASS, SKROLLABLE_AFTER_CLASS]);\n\t\t\t\t\tskrollable.edge = 0;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t//Find out between which two key frames we are right now.\n\t\t\tvar keyFrameIndex = 0;\n\n\t\t\tfor(; keyFrameIndex < framesLength - 1; keyFrameIndex++) {\n\t\t\t\tif(frame >= frames[keyFrameIndex].frame && frame <= frames[keyFrameIndex + 1].frame) {\n\t\t\t\t\tvar left = frames[keyFrameIndex];\n\t\t\t\t\tvar right = frames[keyFrameIndex + 1];\n\n\t\t\t\t\tfor(key in left.props) {\n\t\t\t\t\t\tif(hasProp.call(left.props, key)) {\n\t\t\t\t\t\t\tvar progress = (frame - left.frame) / (right.frame - left.frame);\n\n\t\t\t\t\t\t\t//Transform the current progress using the given easing function.\n\t\t\t\t\t\t\tprogress = left.props[key].easing(progress);\n\n\t\t\t\t\t\t\t//Interpolate between the two values\n\t\t\t\t\t\t\tvalue = _calcInterpolation(left.props[key].value, right.props[key].value, progress);\n\n\t\t\t\t\t\t\tvalue = _interpolateString(value);\n\n\t\t\t\t\t\t\t//Set style or attribute.\n\t\t\t\t\t\t\tif(key.indexOf('@') === 0) {\n\t\t\t\t\t\t\t\telement.setAttribute(key.substr(1), value);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tskrollr.setStyle(element, key, value);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t//Are events enabled on this element?\n\t\t\t\t\t//This code handles the usual cases of scrolling through different keyframes.\n\t\t\t\t\t//The special cases of before first and after last keyframe are handled above.\n\t\t\t\t\tif(emitEvents) {\n\t\t\t\t\t\t//Did we pass a new keyframe?\n\t\t\t\t\t\tif(lastFrameIndex !== keyFrameIndex) {\n\t\t\t\t\t\t\tif(_direction === 'down') {\n\t\t\t\t\t\t\t\t_emitEvent(element, left.eventType, _direction);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t_emitEvent(element, right.eventType, _direction);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tskrollable.lastFrameIndex = keyFrameIndex;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\n\t/**\n\t * Renders all elements.\n\t */\n\tvar _render = function() {\n\t\tif(_requestReflow) {\n\t\t\t_requestReflow = false;\n\t\t\t_reflow();\n\t\t}\n\n\t\t//We may render something else than the actual scrollbar position.\n\t\tvar renderTop = _instance.getScrollTop();\n\n\t\t//If there's an animation, which ends in current render call, call the callback after rendering.\n\t\tvar afterAnimationCallback;\n\t\tvar now = _now();\n\t\tvar progress;\n\n\t\t//Before actually rendering handle the scroll animation, if any.\n\t\tif(_scrollAnimation) {\n\t\t\t//It's over\n\t\t\tif(now >= _scrollAnimation.endTime) {\n\t\t\t\trenderTop = _scrollAnimation.targetTop;\n\t\t\t\tafterAnimationCallback = _scrollAnimation.done;\n\t\t\t\t_scrollAnimation = undefined;\n\t\t\t} else {\n\t\t\t\t//Map the current progress to the new progress using given easing function.\n\t\t\t\tprogress = _scrollAnimation.easing((now - _scrollAnimation.startTime) / _scrollAnimation.duration);\n\n\t\t\t\trenderTop = (_scrollAnimation.startTop + progress * _scrollAnimation.topDiff) | 0;\n\t\t\t}\n\n\t\t\t_instance.setScrollTop(renderTop, true);\n\t\t}\n\t\t//Smooth scrolling only if there's no animation running and if we're not forcing the rendering.\n\t\telse if(!_forceRender) {\n\t\t\tvar smoothScrollingDiff = _smoothScrolling.targetTop - renderTop;\n\n\t\t\t//The user scrolled, start new smooth scrolling.\n\t\t\tif(smoothScrollingDiff) {\n\t\t\t\t_smoothScrolling = {\n\t\t\t\t\tstartTop: _lastTop,\n\t\t\t\t\ttopDiff: renderTop - _lastTop,\n\t\t\t\t\ttargetTop: renderTop,\n\t\t\t\t\tstartTime: _lastRenderCall,\n\t\t\t\t\tendTime: _lastRenderCall + _smoothScrollingDuration\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t//Interpolate the internal scroll position (not the actual scrollbar).\n\t\t\tif(now <= _smoothScrolling.endTime) {\n\t\t\t\t//Map the current progress to the new progress using easing function.\n\t\t\t\tprogress = easings.sqrt((now - _smoothScrolling.startTime) / _smoothScrollingDuration);\n\n\t\t\t\trenderTop = (_smoothScrolling.startTop + progress * _smoothScrolling.topDiff) | 0;\n\t\t\t}\n\t\t}\n\n\t\t//Did the scroll position even change?\n\t\tif(_forceRender || _lastTop !== renderTop) {\n\t\t\t//Remember in which direction are we scrolling?\n\t\t\t_direction = (renderTop > _lastTop) ? 'down' : (renderTop < _lastTop ? 'up' : _direction);\n\n\t\t\t_forceRender = false;\n\n\t\t\tvar listenerParams = {\n\t\t\t\tcurTop: renderTop,\n\t\t\t\tlastTop: _lastTop,\n\t\t\t\tmaxTop: _maxKeyFrame,\n\t\t\t\tdirection: _direction\n\t\t\t};\n\n\t\t\t//Tell the listener we are about to render.\n\t\t\tvar continueRendering = _listeners.beforerender && _listeners.beforerender.call(_instance, listenerParams);\n\n\t\t\t//The beforerender listener function is able the cancel rendering.\n\t\t\tif(continueRendering !== false) {\n\t\t\t\t//Now actually interpolate all the styles.\n\t\t\t\t_calcSteps(renderTop, _instance.getScrollTop());\n\n\t\t\t\t//That's were we actually \"scroll\" on mobile.\n\t\t\t\tif(_isMobile && _skrollrBody) {\n\t\t\t\t\t//Set the transform (\"scroll it\").\n\t\t\t\t\tskrollr.setStyle(_skrollrBody, 'transform', 'translate(0, ' + -(_mobileOffset) + 'px) ' + _translateZ);\n\t\t\t\t}\n\n\t\t\t\t//Remember when we last rendered.\n\t\t\t\t_lastTop = renderTop;\n\n\t\t\t\tif(_listeners.render) {\n\t\t\t\t\t_listeners.render.call(_instance, listenerParams);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif(afterAnimationCallback) {\n\t\t\t\tafterAnimationCallback.call(_instance, false);\n\t\t\t}\n\t\t}\n\n\t\t_lastRenderCall = now;\n\t};\n\n\t/**\n\t * Parses the properties for each key frame of the given skrollable.\n\t */\n\tvar _parseProps = function(skrollable) {\n\t\t//Iterate over all key frames\n\t\tvar keyFrameIndex = 0;\n\t\tvar keyFramesLength = skrollable.keyFrames.length;\n\n\t\tfor(; keyFrameIndex < keyFramesLength; keyFrameIndex++) {\n\t\t\tvar frame = skrollable.keyFrames[keyFrameIndex];\n\t\t\tvar easing;\n\t\t\tvar value;\n\t\t\tvar prop;\n\t\t\tvar props = {};\n\n\t\t\tvar match;\n\n\t\t\twhile((match = rxPropValue.exec(frame.props)) !== null) {\n\t\t\t\tprop = match[1];\n\t\t\t\tvalue = match[2];\n\n\t\t\t\teasing = prop.match(rxPropEasing);\n\n\t\t\t\t//Is there an easing specified for this prop?\n\t\t\t\tif(easing !== null) {\n\t\t\t\t\tprop = easing[1];\n\t\t\t\t\teasing = easing[2];\n\t\t\t\t} else {\n\t\t\t\t\teasing = DEFAULT_EASING;\n\t\t\t\t}\n\n\t\t\t\t//Exclamation point at first position forces the value to be taken literal.\n\t\t\t\tvalue = value.indexOf('!') ? _parseProp(value) : [value.slice(1)];\n\n\t\t\t\t//Save the prop for this key frame with his value and easing function\n\t\t\t\tprops[prop] = {\n\t\t\t\t\tvalue: value,\n\t\t\t\t\teasing: easings[easing]\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tframe.props = props;\n\t\t}\n\t};\n\n\t/**\n\t * Parses a value extracting numeric values and generating a format string\n\t * for later interpolation of the new values in old string.\n\t *\n\t * @param val The CSS value to be parsed.\n\t * @return Something like [\"rgba(?%,?%, ?%,?)\", 100, 50, 0, .7]\n\t * where the first element is the format string later used\n\t * and all following elements are the numeric value.\n\t */\n\tvar _parseProp = function(val) {\n\t\tvar numbers = [];\n\n\t\t//One special case, where floats don't work.\n\t\t//We replace all occurences of rgba colors\n\t\t//which don't use percentage notation with the percentage notation.\n\t\trxRGBAIntegerColor.lastIndex = 0;\n\t\tval = val.replace(rxRGBAIntegerColor, function(rgba) {\n\t\t\treturn rgba.replace(rxNumericValue, function(n) {\n\t\t\t\treturn n / 255 * 100 + '%';\n\t\t\t});\n\t\t});\n\n\t\t//Handle prefixing of \"gradient\" values.\n\t\t//For now only the prefixed value will be set. Unprefixed isn't supported anyway.\n\t\tif(theDashedCSSPrefix) {\n\t\t\trxGradient.lastIndex = 0;\n\t\t\tval = val.replace(rxGradient, function(s) {\n\t\t\t\treturn theDashedCSSPrefix + s;\n\t\t\t});\n\t\t}\n\n\t\t//Now parse ANY number inside this string and create a format string.\n\t\tval = val.replace(rxNumericValue, function(n) {\n\t\t\tnumbers.push(+n);\n\t\t\treturn '{?}';\n\t\t});\n\n\t\t//Add the formatstring as first value.\n\t\tnumbers.unshift(val);\n\n\t\treturn numbers;\n\t};\n\n\t/**\n\t * Fills the key frames with missing left and right hand properties.\n\t * If key frame 1 has property X and key frame 2 is missing X,\n\t * but key frame 3 has X again, then we need to assign X to key frame 2 too.\n\t *\n\t * @param sk A skrollable.\n\t */\n\tvar _fillProps = function(sk) {\n\t\t//Will collect the properties key frame by key frame\n\t\tvar propList = {};\n\t\tvar keyFrameIndex;\n\t\tvar keyFramesLength;\n\n\t\t//Iterate over all key frames from left to right\n\t\tkeyFrameIndex = 0;\n\t\tkeyFramesLength = sk.keyFrames.length;\n\n\t\tfor(; keyFrameIndex < keyFramesLength; keyFrameIndex++) {\n\t\t\t_fillPropForFrame(sk.keyFrames[keyFrameIndex], propList);\n\t\t}\n\n\t\t//Now do the same from right to fill the last gaps\n\n\t\tpropList = {};\n\n\t\t//Iterate over all key frames from right to left\n\t\tkeyFrameIndex = sk.keyFrames.length - 1;\n\n\t\tfor(; keyFrameIndex >= 0; keyFrameIndex--) {\n\t\t\t_fillPropForFrame(sk.keyFrames[keyFrameIndex], propList);\n\t\t}\n\t};\n\n\tvar _fillPropForFrame = function(frame, propList) {\n\t\tvar key;\n\n\t\t//For each key frame iterate over all right hand properties and assign them,\n\t\t//but only if the current key frame doesn't have the property by itself\n\t\tfor(key in propList) {\n\t\t\t//The current frame misses this property, so assign it.\n\t\t\tif(!hasProp.call(frame.props, key)) {\n\t\t\t\tframe.props[key] = propList[key];\n\t\t\t}\n\t\t}\n\n\t\t//Iterate over all props of the current frame and collect them\n\t\tfor(key in frame.props) {\n\t\t\tpropList[key] = frame.props[key];\n\t\t}\n\t};\n\n\t/**\n\t * Calculates the new values for two given values array.\n\t */\n\tvar _calcInterpolation = function(val1, val2, progress) {\n\t\tvar valueIndex;\n\t\tvar val1Length = val1.length;\n\n\t\t//They both need to have the same length\n\t\tif(val1Length !== val2.length) {\n\t\t\tthrow 'Can\\'t interpolate between \"' + val1[0] + '\" and \"' + val2[0] + '\"';\n\t\t}\n\n\t\t//Add the format string as first element.\n\t\tvar interpolated = [val1[0]];\n\n\t\tvalueIndex = 1;\n\n\t\tfor(; valueIndex < val1Length; valueIndex++) {\n\t\t\t//That's the line where the two numbers are actually interpolated.\n\t\t\tinterpolated[valueIndex] = val1[valueIndex] + ((val2[valueIndex] - val1[valueIndex]) * progress);\n\t\t}\n\n\t\treturn interpolated;\n\t};\n\n\t/**\n\t * Interpolates the numeric values into the format string.\n\t */\n\tvar _interpolateString = function(val) {\n\t\tvar valueIndex = 1;\n\n\t\trxInterpolateString.lastIndex = 0;\n\n\t\treturn val[0].replace(rxInterpolateString, function() {\n\t\t\treturn val[valueIndex++];\n\t\t});\n\t};\n\n\t/**\n\t * Resets the class and style attribute to what it was before skrollr manipulated the element.\n\t * Also remembers the values it had before reseting, in order to undo the reset.\n\t */\n\tvar _reset = function(elements, undo) {\n\t\t//We accept a single element or an array of elements.\n\t\telements = [].concat(elements);\n\n\t\tvar skrollable;\n\t\tvar element;\n\t\tvar elementsIndex = 0;\n\t\tvar elementsLength = elements.length;\n\n\t\tfor(; elementsIndex < elementsLength; elementsIndex++) {\n\t\t\telement = elements[elementsIndex];\n\t\t\tskrollable = _skrollables[element[SKROLLABLE_ID_DOM_PROPERTY]];\n\n\t\t\t//Couldn't find the skrollable for this DOM element.\n\t\t\tif(!skrollable) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif(undo) {\n\t\t\t\t//Reset class and style to the \"dirty\" (set by skrollr) values.\n\t\t\t\telement.style.cssText = skrollable.dirtyStyleAttr;\n\t\t\t\t_updateClass(element, skrollable.dirtyClassAttr);\n\t\t\t} else {\n\t\t\t\t//Remember the \"dirty\" (set by skrollr) class and style.\n\t\t\t\tskrollable.dirtyStyleAttr = element.style.cssText;\n\t\t\t\tskrollable.dirtyClassAttr = _getClass(element);\n\n\t\t\t\t//Reset class and style to what it originally was.\n\t\t\t\telement.style.cssText = skrollable.styleAttr;\n\t\t\t\t_updateClass(element, skrollable.classAttr);\n\t\t\t}\n\t\t}\n\t};\n\n\t/**\n\t * Detects support for 3d transforms by applying it to the skrollr-body.\n\t */\n\tvar _detect3DTransforms = function() {\n\t\t_translateZ = 'translateZ(0)';\n\t\tskrollr.setStyle(_skrollrBody, 'transform', _translateZ);\n\n\t\tvar computedStyle = getStyle(_skrollrBody);\n\t\tvar computedTransform = computedStyle.getPropertyValue('transform');\n\t\tvar computedTransformWithPrefix = computedStyle.getPropertyValue(theDashedCSSPrefix + 'transform');\n\t\tvar has3D = (computedTransform && computedTransform !== 'none') || (computedTransformWithPrefix && computedTransformWithPrefix !== 'none');\n\n\t\tif(!has3D) {\n\t\t\t_translateZ = '';\n\t\t}\n\t};\n\n\t/**\n\t * Set the CSS property on the given element. Sets prefixed properties as well.\n\t */\n\tskrollr.setStyle = function(el, prop, val) {\n\t\tvar style = el.style;\n\n\t\t//Camel case.\n\t\tprop = prop.replace(rxCamelCase, rxCamelCaseFn).replace('-', '');\n\n\t\t//Make sure z-index gets a <integer>.\n\t\t//This is the only <integer> case we need to handle.\n\t\tif(prop === 'zIndex') {\n\t\t\tif(isNaN(val)) {\n\t\t\t\t//If it's not a number, don't touch it.\n\t\t\t\t//It could for example be \"auto\" (#351).\n\t\t\t\tstyle[prop] = val;\n\t\t\t} else {\n\t\t\t\t//Floor the number.\n\t\t\t\tstyle[prop] = '' + (val | 0);\n\t\t\t}\n\t\t}\n\t\t//#64: \"float\" can't be set across browsers. Needs to use \"cssFloat\" for all except IE.\n\t\telse if(prop === 'float') {\n\t\t\tstyle.styleFloat = style.cssFloat = val;\n\t\t}\n\t\telse {\n\t\t\t//Need try-catch for old IE.\n\t\t\ttry {\n\t\t\t\t//Set prefixed property if there's a prefix.\n\t\t\t\tif(theCSSPrefix) {\n\t\t\t\t\tstyle[theCSSPrefix + prop.slice(0,1).toUpperCase() + prop.slice(1)] = val;\n\t\t\t\t}\n\n\t\t\t\t//Set unprefixed.\n\t\t\t\tstyle[prop] = val;\n\t\t\t} catch(ignore) {}\n\t\t}\n\t};\n\n\t/**\n\t * Cross browser event handling.\n\t */\n\tvar _addEvent = skrollr.addEvent = function(element, names, callback) {\n\t\tvar intermediate = function(e) {\n\t\t\t//Normalize IE event stuff.\n\t\t\te = e || window.event;\n\n\t\t\tif(!e.target) {\n\t\t\t\te.target = e.srcElement;\n\t\t\t}\n\n\t\t\tif(!e.preventDefault) {\n\t\t\t\te.preventDefault = function() {\n\t\t\t\t\te.returnValue = false;\n\t\t\t\t\te.defaultPrevented = true;\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn callback.call(this, e);\n\t\t};\n\n\t\tnames = names.split(' ');\n\n\t\tvar name;\n\t\tvar nameCounter = 0;\n\t\tvar namesLength = names.length;\n\n\t\tfor(; nameCounter < namesLength; nameCounter++) {\n\t\t\tname = names[nameCounter];\n\n\t\t\tif(element.addEventListener) {\n\t\t\t\telement.addEventListener(name, callback, false);\n\t\t\t} else {\n\t\t\t\telement.attachEvent('on' + name, intermediate);\n\t\t\t}\n\n\t\t\t//Remember the events to be able to flush them later.\n\t\t\t_registeredEvents.push({\n\t\t\t\telement: element,\n\t\t\t\tname: name,\n\t\t\t\tlistener: callback\n\t\t\t});\n\t\t}\n\t};\n\n\tvar _removeEvent = skrollr.removeEvent = function(element, names, callback) {\n\t\tnames = names.split(' ');\n\n\t\tvar nameCounter = 0;\n\t\tvar namesLength = names.length;\n\n\t\tfor(; nameCounter < namesLength; nameCounter++) {\n\t\t\tif(element.removeEventListener) {\n\t\t\t\telement.removeEventListener(names[nameCounter], callback, false);\n\t\t\t} else {\n\t\t\t\telement.detachEvent('on' + names[nameCounter], callback);\n\t\t\t}\n\t\t}\n\t};\n\n\tvar _removeAllEvents = function() {\n\t\tvar eventData;\n\t\tvar eventCounter = 0;\n\t\tvar eventsLength = _registeredEvents.length;\n\n\t\tfor(; eventCounter < eventsLength; eventCounter++) {\n\t\t\teventData = _registeredEvents[eventCounter];\n\n\t\t\t_removeEvent(eventData.element, eventData.name, eventData.listener);\n\t\t}\n\n\t\t_registeredEvents = [];\n\t};\n\n\tvar _emitEvent = function(element, name, direction) {\n\t\tif(_listeners.keyframe) {\n\t\t\t_listeners.keyframe.call(_instance, element, name, direction);\n\t\t}\n\t};\n\n\tvar _reflow = function() {\n\t\tvar pos = _instance.getScrollTop();\n\n\t\t//Will be recalculated by _updateDependentKeyFrames.\n\t\t_maxKeyFrame = 0;\n\n\t\tif(_forceHeight && !_isMobile) {\n\t\t\t//un-\"force\" the height to not mess with the calculations in _updateDependentKeyFrames (#216).\n\t\t\tbody.style.height = '';\n\t\t}\n\n\t\t_updateDependentKeyFrames();\n\n\t\tif(_forceHeight && !_isMobile) {\n\t\t\t//\"force\" the height.\n\t\t\tbody.style.height = (_maxKeyFrame + documentElement.clientHeight) + 'px';\n\t\t}\n\n\t\t//The scroll offset may now be larger than needed (on desktop the browser/os prevents scrolling farther than the bottom).\n\t\tif(_isMobile) {\n\t\t\t_instance.setScrollTop(Math.min(_instance.getScrollTop(), _maxKeyFrame));\n\t\t} else {\n\t\t\t//Remember and reset the scroll pos (#217).\n\t\t\t_instance.setScrollTop(pos, true);\n\t\t}\n\n\t\t_forceRender = true;\n\t};\n\n\t/*\n\t * Returns a copy of the constants object where all functions and strings have been evaluated.\n\t */\n\tvar _processConstants = function() {\n\t\tvar viewportHeight = documentElement.clientHeight;\n\t\tvar copy = {};\n\t\tvar prop;\n\t\tvar value;\n\n\t\tfor(prop in _constants) {\n\t\t\tvalue = _constants[prop];\n\n\t\t\tif(typeof value === 'function') {\n\t\t\t\tvalue = value.call(_instance);\n\t\t\t}\n\t\t\t//Percentage offset.\n\t\t\telse if((/p$/).test(value)) {\n\t\t\t\tvalue = (value.slice(0, -1) / 100) * viewportHeight;\n\t\t\t}\n\n\t\t\tcopy[prop] = value;\n\t\t}\n\n\t\treturn copy;\n\t};\n\n\t/*\n\t * Returns the height of the document.\n\t */\n\tvar _getDocumentHeight = function() {\n\t\tvar skrollrBodyHeight = 0;\n\t\tvar bodyHeight;\n\n\t\tif(_skrollrBody) {\n\t\t\tskrollrBodyHeight = Math.max(_skrollrBody.offsetHeight, _skrollrBody.scrollHeight);\n\t\t}\n\n\t\tbodyHeight = Math.max(skrollrBodyHeight, body.scrollHeight, body.offsetHeight, documentElement.scrollHeight, documentElement.offsetHeight, documentElement.clientHeight);\n\n\t\treturn bodyHeight - documentElement.clientHeight;\n\t};\n\n\t/**\n\t * Returns a string of space separated classnames for the current element.\n\t * Works with SVG as well.\n\t */\n\tvar _getClass = function(element) {\n\t\tvar prop = 'className';\n\n\t\t//SVG support by using className.baseVal instead of just className.\n\t\tif(window.SVGElement && element instanceof window.SVGElement) {\n\t\t\telement = element[prop];\n\t\t\tprop = 'baseVal';\n\t\t}\n\n\t\treturn element[prop];\n\t};\n\n\t/**\n\t * Adds and removes a CSS classes.\n\t * Works with SVG as well.\n\t * add and remove are arrays of strings,\n\t * or if remove is ommited add is a string and overwrites all classes.\n\t */\n\tvar _updateClass = function(element, add, remove) {\n\t\tvar prop = 'className';\n\n\t\t//SVG support by using className.baseVal instead of just className.\n\t\tif(window.SVGElement && element instanceof window.SVGElement) {\n\t\t\telement = element[prop];\n\t\t\tprop = 'baseVal';\n\t\t}\n\n\t\t//When remove is ommited, we want to overwrite/set the classes.\n\t\tif(remove === undefined) {\n\t\t\telement[prop] = add;\n\t\t\treturn;\n\t\t}\n\n\t\t//Cache current classes. We will work on a string before passing back to DOM.\n\t\tvar val = element[prop];\n\n\t\t//All classes to be removed.\n\t\tvar classRemoveIndex = 0;\n\t\tvar removeLength = remove.length;\n\n\t\tfor(; classRemoveIndex < removeLength; classRemoveIndex++) {\n\t\t\tval = _untrim(val).replace(_untrim(remove[classRemoveIndex]), ' ');\n\t\t}\n\n\t\tval = _trim(val);\n\n\t\t//All classes to be added.\n\t\tvar classAddIndex = 0;\n\t\tvar addLength = add.length;\n\n\t\tfor(; classAddIndex < addLength; classAddIndex++) {\n\t\t\t//Only add if el not already has class.\n\t\t\tif(_untrim(val).indexOf(_untrim(add[classAddIndex])) === -1) {\n\t\t\t\tval += ' ' + add[classAddIndex];\n\t\t\t}\n\t\t}\n\n\t\telement[prop] = _trim(val);\n\t};\n\n\tvar _trim = function(a) {\n\t\treturn a.replace(rxTrim, '');\n\t};\n\n\t/**\n\t * Adds a space before and after the string.\n\t */\n\tvar _untrim = function(a) {\n\t\treturn ' ' + a + ' ';\n\t};\n\n\tvar _now = Date.now || function() {\n\t\treturn +new Date();\n\t};\n\n\tvar _keyFrameComparator = function(a, b) {\n\t\treturn a.frame - b.frame;\n\t};\n\n\t/*\n\t * Private variables.\n\t */\n\n\t//Singleton\n\tvar _instance;\n\n\t/*\n\t\tA list of all elements which should be animated associated with their the metadata.\n\t\tExmaple skrollable with two key frames animating from 100px width to 20px:\n\n\t\tskrollable = {\n\t\t\telement: <the DOM element>,\n\t\t\tstyleAttr: <style attribute of the element before skrollr>,\n\t\t\tclassAttr: <class attribute of the element before skrollr>,\n\t\t\tkeyFrames: [\n\t\t\t\t{\n\t\t\t\t\tframe: 100,\n\t\t\t\t\tprops: {\n\t\t\t\t\t\twidth: {\n\t\t\t\t\t\t\tvalue: ['{?}px', 100],\n\t\t\t\t\t\t\teasing: <reference to easing function>\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\tmode: \"absolute\"\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tframe: 200,\n\t\t\t\t\tprops: {\n\t\t\t\t\t\twidth: {\n\t\t\t\t\t\t\tvalue: ['{?}px', 20],\n\t\t\t\t\t\t\teasing: <reference to easing function>\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\tmode: \"absolute\"\n\t\t\t\t}\n\t\t\t]\n\t\t};\n\t*/\n\tvar _skrollables;\n\n\tvar _skrollrBody;\n\n\tvar _listeners;\n\tvar _forceHeight;\n\tvar _maxKeyFrame = 0;\n\n\tvar _scale = 1;\n\tvar _constants;\n\n\tvar _mobileDeceleration;\n\n\t//Current direction (up/down).\n\tvar _direction = 'down';\n\n\t//The last top offset value. Needed to determine direction.\n\tvar _lastTop = -1;\n\n\t//The last time we called the render method (doesn't mean we rendered!).\n\tvar _lastRenderCall = _now();\n\n\t//For detecting if it actually resized (#271).\n\tvar _lastViewportWidth = 0;\n\tvar _lastViewportHeight = 0;\n\n\tvar _requestReflow = false;\n\n\t//Will contain data about a running scrollbar animation, if any.\n\tvar _scrollAnimation;\n\n\tvar _smoothScrollingEnabled;\n\n\tvar _smoothScrollingDuration;\n\n\t//Will contain settins for smooth scrolling if enabled.\n\tvar _smoothScrolling;\n\n\t//Can be set by any operation/event to force rendering even if the scrollbar didn't move.\n\tvar _forceRender;\n\n\t//Each skrollable gets an unique ID incremented for each skrollable.\n\t//The ID is the index in the _skrollables array.\n\tvar _skrollableIdCounter = 0;\n\n\tvar _edgeStrategy;\n\n\n\t//Mobile specific vars. Will be stripped by UglifyJS when not in use.\n\tvar _isMobile = false;\n\n\t//The virtual scroll offset when using mobile scrolling.\n\tvar _mobileOffset = 0;\n\n\t//If the browser supports 3d transforms, this will be filled with 'translateZ(0)' (empty string otherwise).\n\tvar _translateZ;\n\n\t//Will contain data about registered events by skrollr.\n\tvar _registeredEvents = [];\n\n\t//Animation frame id returned by RequestAnimationFrame (or timeout when RAF is not supported).\n\tvar _animFrame;\n\n\t//Expose skrollr as either a global variable or a require.js module.\n\tif(typeof define === 'function' && define.amd) {\n\t\tdefine([], function () {\n\t\t\treturn skrollr;\n\t\t});\n\t} else if (typeof module !== 'undefined' && module.exports) {\n\t\tmodule.exports = skrollr;\n\t} else {\n\t\twindow.skrollr = skrollr;\n\t}\n\n}(window, document));\n"
  },
  {
    "path": "test/index.html",
    "content": "<!DOCTYPE html>\n<html class=\"no-skrollr\">\n<head>\n\t<meta charset=\"utf-8\" />\n\n\t<title>skrollr test suite</title>\n\n\t<link rel=\"stylesheet\" type=\"text/css\" href=\"qunit.css\" />\n\n\t<style type=\"text/css\">\n\t#qunit {\n\t\tposition:fixed;\n\t\tbottom:0;\n\t\tleft:0;\n\t\tright:0;\n\t\theight:50%;\n\t\toverflow:auto;\n\t\tz-index:101;\n\t}\n\n\t#anchor-1, #anchor-2 {\n\t\theight:1000px;\n\t\tbackground:#ccc;\n\t\tposition:absolute;\n\t\ttop:0;\n\t}\n\n\t#foreign-anchor {\n\t\tmargin:100px;\n\t\tpadding:100px;\n\t\tbackground:#ff0;\n\t\tposition:fixed;\n\t}\n\n\t#relative-percentage-offset {\n\t\ttop:100%;\n\t}\n\n\t#float {\n\t\tposition:static !important;\n\t}\n\n\tdiv {position:absolute;}\n\t</style>\n\n\t<script src=\"../src/skrollr.js\" type=\"text/javascript\"></script>\n</head>\n<body class=\"notransition\">\n\t<div id=\"end\" data-start=\"font-size:10px;\" data-end=\"font-size:90px;\">TEST</div>\n\t<div id=\"simple-numeric\" data-_myconst--300=\"  \tleft:-100px; top:0px\t\" data-_myconst-200-start=\"  top:50px; \t\t left:100px; \">TEST</div>\n\t<div id=\"compound-numeric\" data-_my500--500=\"margin:0px 10px 20px 30px;\" data-_my500=\"margin:30px 20px 10px 0px;\">TEST</div>\n\t<div id=\"rgb-color\" data-0=\"color:rgb(0,0,0);\" data-500=\"color:rgb(50,100,150);\">TEST</div>\n\t<div id=\"rgba-color\" data-0=\"color:rgba(0,0,0,.2);\" data-500=\"color:rgba(50,100,150,.5);\">TEST</div>\n\t<div id=\"hsl-color\" data-0=\"color:hsl(0,0%,0%);\" data-500=\"color:hsl(3600,50%,50%);\">TEST</div>\n\t<div id=\"hsla-color\" data-0=\"color:hsla(0,0%,0%,.0);\" data-500=\"color:hsla(3600,50%,50%,.5);\">TEST</div>\n\t<div id=\"no-interpolation\" data-0=\"right:!0px;\" data-499=\"right:!100px;\">TEST</div>\n\t<div id=\"anchor-1\" data-top-bottom=\"right:100px;\" data-top=\"right:0px;\">TEST</div>\n\t<div id=\"anchor-2\" data-top=\"right:0px;\" data-top-center=\"right:200px;\">TEST</div>\n\t<div id=\"foreign-anchor\" data-top=\"padding:200px;\" data-top-center=\"padding:100px;\" data-anchor-target=\"#anchor-2\"></div>\n\t<div id=\"float\" data-start=\"float:none;\" data-499=\"float:left;\" style=\"background:red;\">TEST</div>\n\n\t<svg version=\"1.1\" width=\"200px\" height=\"200px\">\n\t\t<rect\n\t\t\twidth=\"200\" height=\"200\" style=\"fill:#0000ff;fill-rule:evenodd;stroke:none\"\n\t\t\tid=\"svg-relative-mode\"\n\t\t\tdata-top=\"margin:100px;\" data-top-bottom=\"margin:200px;\" />\n\t</svg>\n\n\t<div id=\"colon-url\" data-250=\"background-image:!none;\" data-499='background-image:!url(\"https://secure.travis-ci.org/Prinzhorn/skrollr.png\");'>TEST</div>\n\t<div id=\"period-number\" data-250=\"background-image:!none;\" data-499='background-image:!url(\"https://secure.travis-ci.org/Prinzhorn/skrollr.png?1337\");'>TEST</div>\n\n\t<div id=\"easing\" data-0=\"left[half1]:0px;\" data-500=\"left[half1]:50px;\">TEST</div>\n\t<div id=\"easing_with_easing_strategy\" data-0=\"left[half1]:0px;\" data-500=\"left[half1]:50px;\" data-edge-strategy=\"ease\">TEST</div>\n\n\t<div id=\"reset-strategy\" data-0=\"left:0px;\" data-500=\"left:50px;\" data-edge-strategy=\"reset\" style=\"left:1337px;\">TEST</div>\n\n\t<div id=\"percentage-offset\" data-0=\"left:0px;\" data-200p=\"left:500px;\">TEST</div>\n\n\t<div id=\"relative-percentage-offset\" data-0=\"left:0px;\" data--100p-bottom-top=\"left:500px;\">TEST</div>\n\n\t<div id=\"auto-z-index\" data-0=\"z-index:!1;\" data-250=\"z-index:auto;\">TEST</div>\n\n\t<div id=\"attr\" data-0=\"@title:500;@data-test:skrollr\" data-250=\"@title:250\" data-500=\"@title:0;@data-test:skrollr-test\">TEST</div>\n\n\t<div id=\"qunit\"></div>\n\n\t<script src=\"qunit.js\" type=\"text/javascript\"></script>\n\t<script src=\"qunit-numeric-css-property-equals.js\" type=\"text/javascript\"></script>\n\t<script src=\"jquery.js\" type=\"text/javascript\"></script>\n\t<!--[if lt IE 9]>\n\t<script type=\"text/javascript\" src=\"../src/plugins/skrollr.ie.js\"></script>\n\t<![endif]-->\n\t<script src=\"tests.js\" type=\"text/javascript\"></script>\n</body>\n</html>\n"
  },
  {
    "path": "test/jquery.js",
    "content": "/*! jQuery v1.7.2 jquery.com | jquery.org/license */\n(function(a,b){function cy(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cu(a){if(!cj[a]){var b=c.body,d=f(\"<\"+a+\">\").appendTo(b),e=d.css(\"display\");d.remove();if(e===\"none\"||e===\"\"){ck||(ck=c.createElement(\"iframe\"),ck.frameBorder=ck.width=ck.height=0),b.appendChild(ck);if(!cl||!ck.createElement)cl=(ck.contentWindow||ck.contentDocument).document,cl.write((f.support.boxModel?\"<!doctype html>\":\"\")+\"<html><body>\"),cl.close();d=cl.createElement(a),cl.body.appendChild(d),e=f.css(d,\"display\"),b.removeChild(ck)}cj[a]=e}return cj[a]}function ct(a,b){var c={};f.each(cp.concat.apply([],cp.slice(0,b)),function(){c[this]=a});return c}function cs(){cq=b}function cr(){setTimeout(cs,0);return cq=f.now()}function ci(){try{return new a.ActiveXObject(\"Microsoft.XMLHTTP\")}catch(b){}}function ch(){try{return new a.XMLHttpRequest}catch(b){}}function cb(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g<i;g++){if(g===1)for(h in a.converters)typeof h==\"string\"&&(e[h.toLowerCase()]=a.converters[h]);l=k,k=d[g];if(k===\"*\")k=l;else if(l!==\"*\"&&l!==k){m=l+\" \"+k,n=e[m]||e[\"* \"+k];if(!n){p=b;for(o in e){j=o.split(\" \");if(j[0]===l||j[0]===\"*\"){p=e[j[1]+\" \"+k];if(p){o=e[o],o===!0?n=p:p===!0&&(n=o);break}}}}!n&&!p&&f.error(\"No conversion from \"+m.replace(\" \",\" to \")),n!==!0&&(c=n?n(c):p(o(c)))}}return c}function ca(a,c,d){var e=a.contents,f=a.dataTypes,g=a.responseFields,h,i,j,k;for(i in g)i in d&&(c[g[i]]=d[i]);while(f[0]===\"*\")f.shift(),h===b&&(h=a.mimeType||c.getResponseHeader(\"content-type\"));if(h)for(i in e)if(e[i]&&e[i].test(h)){f.unshift(i);break}if(f[0]in d)j=f[0];else{for(i in d){if(!f[0]||a.converters[i+\" \"+f[0]]){j=i;break}k||(k=i)}j=j||k}if(j){j!==f[0]&&f.unshift(j);return d[j]}}function b_(a,b,c,d){if(f.isArray(b))f.each(b,function(b,e){c||bD.test(a)?d(a,e):b_(a+\"[\"+(typeof e==\"object\"?b:\"\")+\"]\",e,c,d)});else if(!c&&f.type(b)===\"object\")for(var e in b)b_(a+\"[\"+e+\"]\",b[e],c,d);else d(a,b)}function b$(a,c){var d,e,g=f.ajaxSettings.flatOptions||{};for(d in c)c[d]!==b&&((g[d]?a:e||(e={}))[d]=c[d]);e&&f.extend(!0,a,e)}function bZ(a,c,d,e,f,g){f=f||c.dataTypes[0],g=g||{},g[f]=!0;var h=a[f],i=0,j=h?h.length:0,k=a===bS,l;for(;i<j&&(k||!l);i++)l=h[i](c,d,e),typeof l==\"string\"&&(!k||g[l]?l=b:(c.dataTypes.unshift(l),l=bZ(a,c,d,e,l,g)));(k||!l)&&!g[\"*\"]&&(l=bZ(a,c,d,e,\"*\",g));return l}function bY(a){return function(b,c){typeof b!=\"string\"&&(c=b,b=\"*\");if(f.isFunction(c)){var d=b.toLowerCase().split(bO),e=0,g=d.length,h,i,j;for(;e<g;e++)h=d[e],j=/^\\+/.test(h),j&&(h=h.substr(1)||\"*\"),i=a[h]=a[h]||[],i[j?\"unshift\":\"push\"](c)}}}function bB(a,b,c){var d=b===\"width\"?a.offsetWidth:a.offsetHeight,e=b===\"width\"?1:0,g=4;if(d>0){if(c!==\"border\")for(;e<g;e+=2)c||(d-=parseFloat(f.css(a,\"padding\"+bx[e]))||0),c===\"margin\"?d+=parseFloat(f.css(a,c+bx[e]))||0:d-=parseFloat(f.css(a,\"border\"+bx[e]+\"Width\"))||0;return d+\"px\"}d=by(a,b);if(d<0||d==null)d=a.style[b];if(bt.test(d))return d;d=parseFloat(d)||0;if(c)for(;e<g;e+=2)d+=parseFloat(f.css(a,\"padding\"+bx[e]))||0,c!==\"padding\"&&(d+=parseFloat(f.css(a,\"border\"+bx[e]+\"Width\"))||0),c===\"margin\"&&(d+=parseFloat(f.css(a,c+bx[e]))||0);return d+\"px\"}function bo(a){var b=c.createElement(\"div\");bh.appendChild(b),b.innerHTML=a.outerHTML;return b.firstChild}function bn(a){var b=(a.nodeName||\"\").toLowerCase();b===\"input\"?bm(a):b!==\"script\"&&typeof a.getElementsByTagName!=\"undefined\"&&f.grep(a.getElementsByTagName(\"input\"),bm)}function bm(a){if(a.type===\"checkbox\"||a.type===\"radio\")a.defaultChecked=a.checked}function bl(a){return typeof a.getElementsByTagName!=\"undefined\"?a.getElementsByTagName(\"*\"):typeof a.querySelectorAll!=\"undefined\"?a.querySelectorAll(\"*\"):[]}function bk(a,b){var c;b.nodeType===1&&(b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase(),c===\"object\"?b.outerHTML=a.outerHTML:c!==\"input\"||a.type!==\"checkbox\"&&a.type!==\"radio\"?c===\"option\"?b.selected=a.defaultSelected:c===\"input\"||c===\"textarea\"?b.defaultValue=a.defaultValue:c===\"script\"&&b.text!==a.text&&(b.text=a.text):(a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value)),b.removeAttribute(f.expando),b.removeAttribute(\"_submit_attached\"),b.removeAttribute(\"_change_attached\"))}function bj(a,b){if(b.nodeType===1&&!!f.hasData(a)){var c,d,e,g=f._data(a),h=f._data(b,g),i=g.events;if(i){delete h.handle,h.events={};for(c in i)for(d=0,e=i[c].length;d<e;d++)f.event.add(b,c,i[c][d])}h.data&&(h.data=f.extend({},h.data))}}function bi(a,b){return f.nodeName(a,\"table\")?a.getElementsByTagName(\"tbody\")[0]||a.appendChild(a.ownerDocument.createElement(\"tbody\")):a}function U(a){var b=V.split(\"|\"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}function T(a,b,c){b=b||0;if(f.isFunction(b))return f.grep(a,function(a,d){var e=!!b.call(a,d,a);return e===c});if(b.nodeType)return f.grep(a,function(a,d){return a===b===c});if(typeof b==\"string\"){var d=f.grep(a,function(a){return a.nodeType===1});if(O.test(b))return f.filter(b,d,!c);b=f.filter(b,d)}return f.grep(a,function(a,d){return f.inArray(a,b)>=0===c})}function S(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function K(){return!0}function J(){return!1}function n(a,b,c){var d=b+\"defer\",e=b+\"queue\",g=b+\"mark\",h=f._data(a,d);h&&(c===\"queue\"||!f._data(a,e))&&(c===\"mark\"||!f._data(a,g))&&setTimeout(function(){!f._data(a,e)&&!f._data(a,g)&&(f.removeData(a,d,!0),h.fire())},0)}function m(a){for(var b in a){if(b===\"data\"&&f.isEmptyObject(a[b]))continue;if(b!==\"toJSON\")return!1}return!0}function l(a,c,d){if(d===b&&a.nodeType===1){var e=\"data-\"+c.replace(k,\"-$1\").toLowerCase();d=a.getAttribute(e);if(typeof d==\"string\"){try{d=d===\"true\"?!0:d===\"false\"?!1:d===\"null\"?null:f.isNumeric(d)?+d:j.test(d)?f.parseJSON(d):d}catch(g){}f.data(a,c,d)}else d=b}return d}function h(a){var b=g[a]={},c,d;a=a.split(/\\s+/);for(c=0,d=a.length;c<d;c++)b[a[c]]=!0;return b}var c=a.document,d=a.navigator,e=a.location,f=function(){function J(){if(!e.isReady){try{c.documentElement.doScroll(\"left\")}catch(a){setTimeout(J,1);return}e.ready()}}var e=function(a,b){return new e.fn.init(a,b,h)},f=a.jQuery,g=a.$,h,i=/^(?:[^#<]*(<[\\w\\W]+>)[^>]*$|#([\\w\\-]*)$)/,j=/\\S/,k=/^\\s+/,l=/\\s+$/,m=/^<(\\w+)\\s*\\/?>(?:<\\/\\1>)?$/,n=/^[\\],:{}\\s]*$/,o=/\\\\(?:[\"\\\\\\/bfnrt]|u[0-9a-fA-F]{4})/g,p=/\"[^\"\\\\\\n\\r]*\"|true|false|null|-?\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d+)?/g,q=/(?:^|:|,)(?:\\s*\\[)+/g,r=/(webkit)[ \\/]([\\w.]+)/,s=/(opera)(?:.*version)?[ \\/]([\\w.]+)/,t=/(msie) ([\\w.]+)/,u=/(mozilla)(?:.*? rv:([\\w.]+))?/,v=/-([a-z]|[0-9])/ig,w=/^-ms-/,x=function(a,b){return(b+\"\").toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a===\"body\"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a==\"string\"){a.charAt(0)!==\"<\"||a.charAt(a.length-1)!==\">\"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=m.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:\"\",jquery:\"1.7.2\",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b===\"find\"?d.selector=this.selector+(this.selector?\" \":\"\")+c:b&&(d.selector=this.selector+\".\"+b+\"(\"+c+\")\");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.add(a);return this},eq:function(a){a=+a;return a===-1?this.slice(a):this.slice(a,a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(F.apply(this,arguments),\"slice\",F.call(arguments).join(\",\"))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i==\"boolean\"&&(l=i,i=arguments[1]||{},j=2),typeof i!=\"object\"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j<k;j++)if((a=arguments[j])!=null)for(c in a){d=i[c],f=a[c];if(i===f)continue;l&&f&&(e.isPlainObject(f)||(g=e.isArray(f)))?(g?(g=!1,h=d&&e.isArray(d)?d:[]):h=d&&e.isPlainObject(d)?d:{},i[c]=e.extend(l,h,f)):f!==b&&(i[c]=f)}return i},e.extend({noConflict:function(b){a.$===e&&(a.$=g),b&&a.jQuery===e&&(a.jQuery=f);return e},isReady:!1,readyWait:1,holdReady:function(a){a?e.readyWait++:e.ready(!0)},ready:function(a){if(a===!0&&!--e.readyWait||a!==!0&&!e.isReady){if(!c.body)return setTimeout(e.ready,1);e.isReady=!0;if(a!==!0&&--e.readyWait>0)return;A.fireWith(c,[e]),e.fn.trigger&&e(c).trigger(\"ready\").off(\"ready\")}},bindReady:function(){if(!A){A=e.Callbacks(\"once memory\");if(c.readyState===\"complete\")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener(\"DOMContentLoaded\",B,!1),a.addEventListener(\"load\",e.ready,!1);else if(c.attachEvent){c.attachEvent(\"onreadystatechange\",B),a.attachEvent(\"onload\",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)===\"function\"},isArray:Array.isArray||function(a){return e.type(a)===\"array\"},isWindow:function(a){return a!=null&&a==a.window},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):I[C.call(a)]||\"object\"},isPlainObject:function(a){if(!a||e.type(a)!==\"object\"||a.nodeType||e.isWindow(a))return!1;try{if(a.constructor&&!D.call(a,\"constructor\")&&!D.call(a.constructor.prototype,\"isPrototypeOf\"))return!1}catch(c){return!1}var d;for(d in a);return d===b||D.call(a,d)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw new Error(a)},parseJSON:function(b){if(typeof b!=\"string\"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(n.test(b.replace(o,\"@\").replace(p,\"]\").replace(q,\"\")))return(new Function(\"return \"+b))();e.error(\"Invalid JSON: \"+b)},parseXML:function(c){if(typeof c!=\"string\"||!c)return null;var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,\"text/xml\")):(d=new ActiveXObject(\"Microsoft.XMLDOM\"),d.async=\"false\",d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName(\"parsererror\").length)&&e.error(\"Invalid XML: \"+c);return d},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,\"ms-\").replace(v,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g<h;)if(c.apply(a[g++],d)===!1)break}else if(i){for(f in a)if(c.call(a[f],f,a[f])===!1)break}else for(;g<h;)if(c.call(a[g],g,a[g++])===!1)break;return a},trim:G?function(a){return a==null?\"\":G.call(a)}:function(a){return a==null?\"\":(a+\"\").replace(k,\"\").replace(l,\"\")},makeArray:function(a,b){var c=b||[];if(a!=null){var d=e.type(a);a.length==null||d===\"string\"||d===\"function\"||d===\"regexp\"||e.isWindow(a)?E.call(c,a):e.merge(c,a)}return c},inArray:function(a,b,c){var d;if(b){if(H)return H.call(b,a,c);d=b.length,c=c?c<0?Math.max(0,d+c):c:0;for(;c<d;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,c){var d=a.length,e=0;if(typeof c.length==\"number\")for(var f=c.length;e<f;e++)a[d++]=c[e];else while(c[e]!==b)a[d++]=c[e++];a.length=d;return a},grep:function(a,b,c){var d=[],e;c=!!c;for(var f=0,g=a.length;f<g;f++)e=!!b(a[f],f),c!==e&&d.push(a[f]);return d},map:function(a,c,d){var f,g,h=[],i=0,j=a.length,k=a instanceof e||j!==b&&typeof j==\"number\"&&(j>0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i<j;i++)f=c(a[i],i,d),f!=null&&(h[h.length]=f);else for(g in a)f=c(a[g],g,d),f!=null&&(h[h.length]=f);return h.concat.apply([],h)},guid:1,proxy:function(a,c){if(typeof c==\"string\"){var d=a[c];c=a,a=d}if(!e.isFunction(a))return b;var f=F.call(arguments,2),g=function(){return a.apply(c,f.concat(F.call(arguments)))};g.guid=a.guid=a.guid||g.guid||e.guid++;return g},access:function(a,c,d,f,g,h,i){var j,k=d==null,l=0,m=a.length;if(d&&typeof d==\"object\"){for(l in d)e.access(a,c,l,d[l],1,h,f);g=1}else if(f!==b){j=i===b&&e.isFunction(f),k&&(j?(j=c,c=function(a,b,c){return j.call(e(a),c)}):(c.call(a,f),c=null));if(c)for(;l<m;l++)c(a[l],d,j?f.call(a[l],l,c(a[l],d)):f,i);g=1}return g?a:k?c.call(a):m?c(a[0],d):h},now:function(){return(new Date).getTime()},uaMatch:function(a){a=a.toLowerCase();var b=r.exec(a)||s.exec(a)||t.exec(a)||a.indexOf(\"compatible\")<0&&u.exec(a)||[];return{browser:b[1]||\"\",version:b[2]||\"0\"}},sub:function(){function a(b,c){return new a.fn.init(b,c)}e.extend(!0,a,this),a.superclass=this,a.fn=a.prototype=this(),a.fn.constructor=a,a.sub=this.sub,a.fn.init=function(d,f){f&&f instanceof e&&!(f instanceof a)&&(f=a(f));return e.fn.init.call(this,d,f,b)},a.fn.init.prototype=a.fn;var b=a(c);return a},browser:{}}),e.each(\"Boolean Number String Function Array Date RegExp Object\".split(\" \"),function(a,b){I[\"[object \"+b+\"]\"]=b.toLowerCase()}),z=e.uaMatch(y),z.browser&&(e.browser[z.browser]=!0,e.browser.version=z.version),e.browser.webkit&&(e.browser.safari=!0),j.test(\" \")&&(k=/^[\\s\\xA0]+/,l=/[\\s\\xA0]+$/),h=e(c),c.addEventListener?B=function(){c.removeEventListener(\"DOMContentLoaded\",B,!1),e.ready()}:c.attachEvent&&(B=function(){c.readyState===\"complete\"&&(c.detachEvent(\"onreadystatechange\",B),e.ready())});return e}(),g={};f.Callbacks=function(a){a=a?g[a]||h(a):{};var c=[],d=[],e,i,j,k,l,m,n=function(b){var d,e,g,h,i;for(d=0,e=b.length;d<e;d++)g=b[d],h=f.type(g),h===\"array\"?n(g):h===\"function\"&&(!a.unique||!p.has(g))&&c.push(g)},o=function(b,f){f=f||[],e=!a.memory||[b,f],i=!0,j=!0,m=k||0,k=0,l=c.length;for(;c&&m<l;m++)if(c[m].apply(b,f)===!1&&a.stopOnFalse){e=!0;break}j=!1,c&&(a.once?e===!0?p.disable():c=[]:d&&d.length&&(e=d.shift(),p.fireWith(e[0],e[1])))},p={add:function(){if(c){var a=c.length;n(arguments),j?l=c.length:e&&e!==!0&&(k=a,o(e[0],e[1]))}return this},remove:function(){if(c){var b=arguments,d=0,e=b.length;for(;d<e;d++)for(var f=0;f<c.length;f++)if(b[d]===c[f]){j&&f<=l&&(l--,f<=m&&m--),c.splice(f--,1);if(a.unique)break}}return this},has:function(a){if(c){var b=0,d=c.length;for(;b<d;b++)if(a===c[b])return!0}return!1},empty:function(){c=[];return this},disable:function(){c=d=e=b;return this},disabled:function(){return!c},lock:function(){d=b,(!e||e===!0)&&p.disable();return this},locked:function(){return!d},fireWith:function(b,c){d&&(j?a.once||d.push([b,c]):(!a.once||!e)&&o(b,c));return this},fire:function(){p.fireWith(this,arguments);return this},fired:function(){return!!i}};return p};var i=[].slice;f.extend({Deferred:function(a){var b=f.Callbacks(\"once memory\"),c=f.Callbacks(\"once memory\"),d=f.Callbacks(\"memory\"),e=\"pending\",g={resolve:b,reject:c,notify:d},h={done:b.add,fail:c.add,progress:d.add,state:function(){return e},isResolved:b.fired,isRejected:c.fired,then:function(a,b,c){i.done(a).fail(b).progress(c);return this},always:function(){i.done.apply(i,arguments).fail.apply(i,arguments);return this},pipe:function(a,b,c){return f.Deferred(function(d){f.each({done:[a,\"resolve\"],fail:[b,\"reject\"],progress:[c,\"notify\"]},function(a,b){var c=b[0],e=b[1],g;f.isFunction(c)?i[a](function(){g=c.apply(this,arguments),g&&f.isFunction(g.promise)?g.promise().then(d.resolve,d.reject,d.notify):d[e+\"With\"](this===i?d:this,[g])}):i[a](d[e])})}).promise()},promise:function(a){if(a==null)a=h;else for(var b in h)a[b]=h[b];return a}},i=h.promise({}),j;for(j in g)i[j]=g[j].fire,i[j+\"With\"]=g[j].fireWith;i.done(function(){e=\"resolved\"},c.disable,d.lock).fail(function(){e=\"rejected\"},b.disable,d.lock),a&&a.call(i,i);return i},when:function(a){function m(a){return function(b){e[a]=arguments.length>1?i.call(arguments,0):b,j.notifyWith(k,e)}}function l(a){return function(c){b[a]=arguments.length>1?i.call(arguments,0):c,--g||j.resolveWith(j,b)}}var b=i.call(arguments,0),c=0,d=b.length,e=Array(d),g=d,h=d,j=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred(),k=j.promise();if(d>1){for(;c<d;c++)b[c]&&b[c].promise&&f.isFunction(b[c].promise)?b[c].promise().then(l(c),j.reject,m(c)):--g;g||j.resolveWith(j,b)}else j!==a&&j.resolveWith(j,d?[a]:[]);return k}}),f.support=function(){var b,d,e,g,h,i,j,k,l,m,n,o,p=c.createElement(\"div\"),q=c.documentElement;p.setAttribute(\"className\",\"t\"),p.innerHTML=\"   <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>\",d=p.getElementsByTagName(\"*\"),e=p.getElementsByTagName(\"a\")[0];if(!d||!d.length||!e)return{};g=c.createElement(\"select\"),h=g.appendChild(c.createElement(\"option\")),i=p.getElementsByTagName(\"input\")[0],b={leadingWhitespace:p.firstChild.nodeType===3,tbody:!p.getElementsByTagName(\"tbody\").length,htmlSerialize:!!p.getElementsByTagName(\"link\").length,style:/top/.test(e.getAttribute(\"style\")),hrefNormalized:e.getAttribute(\"href\")===\"/a\",opacity:/^0.55/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value===\"on\",optSelected:h.selected,getSetAttribute:p.className!==\"t\",enctype:!!c.createElement(\"form\").enctype,html5Clone:c.createElement(\"nav\").cloneNode(!0).outerHTML!==\"<:nav></:nav>\",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,pixelMargin:!0},f.boxModel=b.boxModel=c.compatMode===\"CSS1Compat\",i.checked=!0,b.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,b.optDisabled=!h.disabled;try{delete p.test}catch(r){b.deleteExpando=!1}!p.addEventListener&&p.attachEvent&&p.fireEvent&&(p.attachEvent(\"onclick\",function(){b.noCloneEvent=!1}),p.cloneNode(!0).fireEvent(\"onclick\")),i=c.createElement(\"input\"),i.value=\"t\",i.setAttribute(\"type\",\"radio\"),b.radioValue=i.value===\"t\",i.setAttribute(\"checked\",\"checked\"),i.setAttribute(\"name\",\"t\"),p.appendChild(i),j=c.createDocumentFragment(),j.appendChild(p.lastChild),b.checkClone=j.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=i.checked,j.removeChild(i),j.appendChild(p);if(p.attachEvent)for(n in{submit:1,change:1,focusin:1})m=\"on\"+n,o=m in p,o||(p.setAttribute(m,\"return;\"),o=typeof p[m]==\"function\"),b[n+\"Bubbles\"]=o;j.removeChild(p),j=g=h=p=i=null,f(function(){var d,e,g,h,i,j,l,m,n,q,r,s,t,u=c.getElementsByTagName(\"body\")[0];!u||(m=1,t=\"padding:0;margin:0;border:\",r=\"position:absolute;top:0;left:0;width:1px;height:1px;\",s=t+\"0;visibility:hidden;\",n=\"style='\"+r+t+\"5px solid #000;\",q=\"<div \"+n+\"display:block;'><div style='\"+t+\"0;display:block;overflow:hidden;'></div></div>\"+\"<table \"+n+\"' cellpadding='0' cellspacing='0'>\"+\"<tr><td></td></tr></table>\",d=c.createElement(\"div\"),d.style.cssText=s+\"width:0;height:0;position:static;top:0;margin-top:\"+m+\"px\",u.insertBefore(d,u.firstChild),p=c.createElement(\"div\"),d.appendChild(p),p.innerHTML=\"<table><tr><td style='\"+t+\"0;display:none'></td><td>t</td></tr></table>\",k=p.getElementsByTagName(\"td\"),o=k[0].offsetHeight===0,k[0].style.display=\"\",k[1].style.display=\"none\",b.reliableHiddenOffsets=o&&k[0].offsetHeight===0,a.getComputedStyle&&(p.innerHTML=\"\",l=c.createElement(\"div\"),l.style.width=\"0\",l.style.marginRight=\"0\",p.style.width=\"2px\",p.appendChild(l),b.reliableMarginRight=(parseInt((a.getComputedStyle(l,null)||{marginRight:0}).marginRight,10)||0)===0),typeof p.style.zoom!=\"undefined\"&&(p.innerHTML=\"\",p.style.width=p.style.padding=\"1px\",p.style.border=0,p.style.overflow=\"hidden\",p.style.display=\"inline\",p.style.zoom=1,b.inlineBlockNeedsLayout=p.offsetWidth===3,p.style.display=\"block\",p.style.overflow=\"visible\",p.innerHTML=\"<div style='width:5px;'></div>\",b.shrinkWrapBlocks=p.offsetWidth!==3),p.style.cssText=r+s,p.innerHTML=q,e=p.firstChild,g=e.firstChild,i=e.nextSibling.firstChild.firstChild,j={doesNotAddBorder:g.offsetTop!==5,doesAddBorderForTableAndCells:i.offsetTop===5},g.style.position=\"fixed\",g.style.top=\"20px\",j.fixedPosition=g.offsetTop===20||g.offsetTop===15,g.style.position=g.style.top=\"\",e.style.overflow=\"hidden\",e.style.position=\"relative\",j.subtractsBorderForOverflowNotVisible=g.offsetTop===-5,j.doesNotIncludeMarginInBodyOffset=u.offsetTop!==m,a.getComputedStyle&&(p.style.marginTop=\"1%\",b.pixelMargin=(a.getComputedStyle(p,null)||{marginTop:0}).marginTop!==\"1%\"),typeof d.style.zoom!=\"undefined\"&&(d.style.zoom=1),u.removeChild(d),l=p=d=null,f.extend(b,j))});return b}();var j=/^(?:\\{.*\\}|\\[.*\\])$/,k=/([A-Z])/g;f.extend({cache:{},uuid:0,expando:\"jQuery\"+(f.fn.jquery+Math.random()).replace(/\\D/g,\"\"),noData:{embed:!0,object:\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!m(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i,j=f.expando,k=typeof c==\"string\",l=a.nodeType,m=l?f.cache:a,n=l?a[j]:a[j]&&j,o=c===\"events\";if((!n||!m[n]||!o&&!e&&!m[n].data)&&k&&d===b)return;n||(l?a[j]=n=++f.uuid:n=j),m[n]||(m[n]={},l||(m[n].toJSON=f.noop));if(typeof c==\"object\"||typeof c==\"function\")e?m[n]=f.extend(m[n],c):m[n].data=f.extend(m[n].data,c);g=h=m[n],e||(h.data||(h.data={}),h=h.data),d!==b&&(h[f.camelCase(c)]=d);if(o&&!h[c])return g.events;k?(i=h[c],i==null&&(i=h[f.camelCase(c)])):i=h;return i}},removeData:function(a,b,c){if(!!f.acceptData(a)){var d,e,g,h=f.expando,i=a.nodeType,j=i?f.cache:a,k=i?a[h]:h;if(!j[k])return;if(b){d=c?j[k]:j[k].data;if(d){f.isArray(b)||(b in d?b=[b]:(b=f.camelCase(b),b in d?b=[b]:b=b.split(\" \")));for(e=0,g=b.length;e<g;e++)delete d[b[e]];if(!(c?m:f.isEmptyObject)(d))return}}if(!c){delete j[k].data;if(!m(j[k]))return}f.support.deleteExpando||!j.setInterval?delete j[k]:j[k]=null,i&&(f.support.deleteExpando?delete a[h]:a.removeAttribute?a.removeAttribute(h):a[h]=null)}},_data:function(a,b,c){return f.data(a,b,c,!0)},acceptData:function(a){if(a.nodeName){var b=f.noData[a.nodeName.toLowerCase()];if(b)return b!==!0&&a.getAttribute(\"classid\")===b}return!0}}),f.fn.extend({data:function(a,c){var d,e,g,h,i,j=this[0],k=0,m=null;if(a===b){if(this.length){m=f.data(j);if(j.nodeType===1&&!f._data(j,\"parsedAttrs\")){g=j.attributes;for(i=g.length;k<i;k++)h=g[k].name,h.indexOf(\"data-\")===0&&(h=f.camelCase(h.substring(5)),l(j,h,m[h]));f._data(j,\"parsedAttrs\",!0)}}return m}if(typeof a==\"object\")return this.each(function(){f.data(this,a)});d=a.split(\".\",2),d[1]=d[1]?\".\"+d[1]:\"\",e=d[1]+\"!\";return f.access(this,function(c){if(c===b){m=this.triggerHandler(\"getData\"+e,[d[0]]),m===b&&j&&(m=f.data(j,a),m=l(j,a,m));return m===b&&d[1]?this.data(d[0]):m}d[1]=c,this.each(function(){var b=f(this);b.triggerHandler(\"setData\"+e,d),f.data(this,a,c),b.triggerHandler(\"changeData\"+e,d)})},null,c,arguments.length>1,null,!1)},removeData:function(a){return this.each(function(){f.removeData(this,a)})}}),f.extend({_mark:function(a,b){a&&(b=(b||\"fx\")+\"mark\",f._data(a,b,(f._data(a,b)||0)+1))},_unmark:function(a,b,c){a!==!0&&(c=b,b=a,a=!1);if(b){c=c||\"fx\";var d=c+\"mark\",e=a?0:(f._data(b,d)||1)-1;e?f._data(b,d,e):(f.removeData(b,d,!0),n(b,c,\"mark\"))}},queue:function(a,b,c){var d;if(a){b=(b||\"fx\")+\"queue\",d=f._data(a,b),c&&(!d||f.isArray(c)?d=f._data(a,b,f.makeArray(c)):d.push(c));return d||[]}},dequeue:function(a,b){b=b||\"fx\";var c=f.queue(a,b),d=c.shift(),e={};d===\"inprogress\"&&(d=c.shift()),d&&(b===\"fx\"&&c.unshift(\"inprogress\"),f._data(a,b+\".run\",e),d.call(a,function(){f.dequeue(a,b)},e)),c.length||(f.removeData(a,b+\"queue \"+b+\".run\",!0),n(a,b,\"queue\"))}}),f.fn.extend({queue:function(a,c){var d=2;typeof a!=\"string\"&&(c=a,a=\"fx\",d--);if(arguments.length<d)return f.queue(this[0],a);return c===b?this:this.each(function(){var b=f.queue(this,a,c);a===\"fx\"&&b[0]!==\"inprogress\"&&f.dequeue(this,a)})},dequeue:function(a){return this.each(function(){f.dequeue(this,a)})},delay:function(a,b){a=f.fx?f.fx.speeds[a]||a:a,b=b||\"fx\";return this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},clearQueue:function(a){return this.queue(a||\"fx\",[])},promise:function(a,c){function m(){--h||d.resolveWith(e,[e])}typeof a!=\"string\"&&(c=a,a=b),a=a||\"fx\";var d=f.Deferred(),e=this,g=e.length,h=1,i=a+\"defer\",j=a+\"queue\",k=a+\"mark\",l;while(g--)if(l=f.data(e[g],i,b,!0)||(f.data(e[g],j,b,!0)||f.data(e[g],k,b,!0))&&f.data(e[g],i,f.Callbacks(\"once memory\"),!0))h++,l.add(m);m();return d.promise(c)}});var o=/[\\n\\t\\r]/g,p=/\\s+/,q=/\\r/g,r=/^(?:button|input)$/i,s=/^(?:button|input|object|select|textarea)$/i,t=/^a(?:rea)?$/i,u=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,v=f.support.getSetAttribute,w,x,y;f.fn.extend({attr:function(a,b){return f.access(this,f.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){f.removeAttr(this,a)})},prop:function(a,b){return f.access(this,f.prop,a,b,arguments.length>1)},removeProp:function(a){a=f.propFix[a]||a;return this.each(function(){try{this[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,g,h,i;if(f.isFunction(a))return this.each(function(b){f(this).addClass(a.call(this,b,this.className))});if(a&&typeof a==\"string\"){b=a.split(p);for(c=0,d=this.length;c<d;c++){e=this[c];if(e.nodeType===1)if(!e.className&&b.length===1)e.className=a;else{g=\" \"+e.className+\" \";for(h=0,i=b.length;h<i;h++)~g.indexOf(\" \"+b[h]+\" \")||(g+=b[h]+\" \");e.className=f.trim(g)}}}return this},removeClass:function(a){var c,d,e,g,h,i,j;if(f.isFunction(a))return this.each(function(b){f(this).removeClass(a.call(this,b,this.className))});if(a&&typeof a==\"string\"||a===b){c=(a||\"\").split(p);for(d=0,e=this.length;d<e;d++){g=this[d];if(g.nodeType===1&&g.className)if(a){h=(\" \"+g.className+\" \").replace(o,\" \");for(i=0,j=c.length;i<j;i++)h=h.replace(\" \"+c[i]+\" \",\" \");g.className=f.trim(h)}else g.className=\"\"}}return this},toggleClass:function(a,b){var c=typeof a,d=typeof b==\"boolean\";if(f.isFunction(a))return this.each(function(c){f(this).toggleClass(a.call(this,c,this.className,b),b)});return this.each(function(){if(c===\"string\"){var e,g=0,h=f(this),i=b,j=a.split(p);while(e=j[g++])i=d?i:!h.hasClass(e),h[i?\"addClass\":\"removeClass\"](e)}else if(c===\"undefined\"||c===\"boolean\")this.className&&f._data(this,\"__className__\",this.className),this.className=this.className||a===!1?\"\":f._data(this,\"__className__\")||\"\"})},hasClass:function(a){var b=\" \"+a+\" \",c=0,d=this.length;for(;c<d;c++)if(this[c].nodeType===1&&(\" \"+this[c].className+\" \").replace(o,\" \").indexOf(b)>-1)return!0;return!1},val:function(a){var c,d,e,g=this[0];{if(!!arguments.length){e=f.isFunction(a);return this.each(function(d){var g=f(this),h;if(this.nodeType===1){e?h=a.call(this,d,g.val()):h=a,h==null?h=\"\":typeof h==\"number\"?h+=\"\":f.isArray(h)&&(h=f.map(h,function(a){return a==null?\"\":a+\"\"})),c=f.valHooks[this.type]||f.valHooks[this.nodeName.toLowerCase()];if(!c||!(\"set\"in c)||c.set(this,h,\"value\")===b)this.value=h}})}if(g){c=f.valHooks[g.type]||f.valHooks[g.nodeName.toLowerCase()];if(c&&\"get\"in c&&(d=c.get(g,\"value\"))!==b)return d;d=g.value;return typeof d==\"string\"?d.replace(q,\"\"):d==null?\"\":d}}}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,g=a.selectedIndex,h=[],i=a.options,j=a.type===\"select-one\";if(g<0)return null;c=j?g:0,d=j?g+1:i.length;for(;c<d;c++){e=i[c];if(e.selected&&(f.support.optDisabled?!e.disabled:e.getAttribute(\"disabled\")===null)&&(!e.parentNode.disabled||!f.nodeName(e.parentNode,\"optgroup\"))){b=f(e).val();if(j)return b;h.push(b)}}if(j&&!h.length&&i.length)return f(i[g]).val();return h},set:function(a,b){var c=f.makeArray(b);f(a).find(\"option\").each(function(){this.selected=f.inArray(f(this).val(),c)>=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,d,e){var g,h,i,j=a.nodeType;if(!!a&&j!==3&&j!==8&&j!==2){if(e&&c in f.attrFn)return f(a)[c](d);if(typeof a.getAttribute==\"undefined\")return f.prop(a,c,d);i=j!==1||!f.isXMLDoc(a),i&&(c=c.toLowerCase(),h=f.attrHooks[c]||(u.test(c)?x:w));if(d!==b){if(d===null){f.removeAttr(a,c);return}if(h&&\"set\"in h&&i&&(g=h.set(a,d,c))!==b)return g;a.setAttribute(c,\"\"+d);return d}if(h&&\"get\"in h&&i&&(g=h.get(a,c))!==null)return g;g=a.getAttribute(c);return g===null?b:g}},removeAttr:function(a,b){var c,d,e,g,h,i=0;if(b&&a.nodeType===1){d=b.toLowerCase().split(p),g=d.length;for(;i<g;i++)e=d[i],e&&(c=f.propFix[e]||e,h=u.test(e),h||f.attr(a,e,\"\"),a.removeAttribute(v?e:c),h&&c in a&&(a[c]=!1))}},attrHooks:{type:{set:function(a,b){if(r.test(a.nodeName)&&a.parentNode)f.error(\"type property can't be changed\");else if(!f.support.radioValue&&b===\"radio\"&&f.nodeName(a,\"input\")){var c=a.value;a.setAttribute(\"type\",b),c&&(a.value=c);return b}}},value:{get:function(a,b){if(w&&f.nodeName(a,\"button\"))return w.get(a,b);return b in a?a.value:null},set:function(a,b,c){if(w&&f.nodeName(a,\"button\"))return w.set(a,b,c);a.value=b}}},propFix:{tabindex:\"tabIndex\",readonly:\"readOnly\",\"for\":\"htmlFor\",\"class\":\"className\",maxlength:\"maxLength\",cellspacing:\"cellSpacing\",cellpadding:\"cellPadding\",rowspan:\"rowSpan\",colspan:\"colSpan\",usemap:\"useMap\",frameborder:\"frameBorder\",contenteditable:\"contentEditable\"},prop:function(a,c,d){var e,g,h,i=a.nodeType;if(!!a&&i!==3&&i!==8&&i!==2){h=i!==1||!f.isXMLDoc(a),h&&(c=f.propFix[c]||c,g=f.propHooks[c]);return d!==b?g&&\"set\"in g&&(e=g.set(a,d,c))!==b?e:a[c]=d:g&&\"get\"in g&&(e=g.get(a,c))!==null?e:a[c]}},propHooks:{tabIndex:{get:function(a){var c=a.getAttributeNode(\"tabindex\");return c&&c.specified?parseInt(c.value,10):s.test(a.nodeName)||t.test(a.nodeName)&&a.href?0:b}}}}),f.attrHooks.tabindex=f.propHooks.tabIndex,x={get:function(a,c){var d,e=f.prop(a,c);return e===!0||typeof e!=\"boolean\"&&(d=a.getAttributeNode(c))&&d.nodeValue!==!1?c.toLowerCase():b},set:function(a,b,c){var d;b===!1?f.removeAttr(a,c):(d=f.propFix[c]||c,d in a&&(a[d]=!0),a.setAttribute(c,c.toLowerCase()));return c}},v||(y={name:!0,id:!0,coords:!0},w=f.valHooks.button={get:function(a,c){var d;d=a.getAttributeNode(c);return d&&(y[c]?d.nodeValue!==\"\":d.specified)?d.nodeValue:b},set:function(a,b,d){var e=a.getAttributeNode(d);e||(e=c.createAttribute(d),a.setAttributeNode(e));return e.nodeValue=b+\"\"}},f.attrHooks.tabindex.set=w.set,f.each([\"width\",\"height\"],function(a,b){f.attrHooks[b]=f.extend(f.attrHooks[b],{set:function(a,c){if(c===\"\"){a.setAttribute(b,\"auto\");return c}}})}),f.attrHooks.contenteditable={get:w.get,set:function(a,b,c){b===\"\"&&(b=\"false\"),w.set(a,b,c)}}),f.support.hrefNormalized||f.each([\"href\",\"src\",\"width\",\"height\"],function(a,c){f.attrHooks[c]=f.extend(f.attrHooks[c],{get:function(a){var d=a.getAttribute(c,2);return d===null?b:d}})}),f.support.style||(f.attrHooks.style={get:function(a){return a.style.cssText.toLowerCase()||b},set:function(a,b){return a.style.cssText=\"\"+b}}),f.support.optSelected||(f.propHooks.selected=f.extend(f.propHooks.selected,{get:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex);return null}})),f.support.enctype||(f.propFix.enctype=\"encoding\"),f.support.checkOn||f.each([\"radio\",\"checkbox\"],function(){f.valHooks[this]={get:function(a){return a.getAttribute(\"value\")===null?\"on\":a.value}}}),f.each([\"radio\",\"checkbox\"],function(){f.valHooks[this]=f.extend(f.valHooks[this],{set:function(a,b){if(f.isArray(b))return a.checked=f.inArray(f(a).val(),b)>=0}})});var z=/^(?:textarea|input|select)$/i,A=/^([^\\.]*)?(?:\\.(.+))?$/,B=/(?:^|\\s)hover(\\.\\S+)?\\b/,C=/^key/,D=/^(?:mouse|contextmenu)|click/,E=/^(?:focusinfocus|focusoutblur)$/,F=/^(\\w*)(?:#([\\w\\-]+))?(?:\\.([\\w\\-]+))?$/,G=function(\na){var b=F.exec(a);b&&(b[1]=(b[1]||\"\").toLowerCase(),b[3]=b[3]&&new RegExp(\"(?:^|\\\\s)\"+b[3]+\"(?:\\\\s|$)\"));return b},H=function(a,b){var c=a.attributes||{};return(!b[1]||a.nodeName.toLowerCase()===b[1])&&(!b[2]||(c.id||{}).value===b[2])&&(!b[3]||b[3].test((c[\"class\"]||{}).value))},I=function(a){return f.event.special.hover?a:a.replace(B,\"mouseenter$1 mouseleave$1\")};f.event={add:function(a,c,d,e,g){var h,i,j,k,l,m,n,o,p,q,r,s;if(!(a.nodeType===3||a.nodeType===8||!c||!d||!(h=f._data(a)))){d.handler&&(p=d,d=p.handler,g=p.selector),d.guid||(d.guid=f.guid++),j=h.events,j||(h.events=j={}),i=h.handle,i||(h.handle=i=function(a){return typeof f!=\"undefined\"&&(!a||f.event.triggered!==a.type)?f.event.dispatch.apply(i.elem,arguments):b},i.elem=a),c=f.trim(I(c)).split(\" \");for(k=0;k<c.length;k++){l=A.exec(c[k])||[],m=l[1],n=(l[2]||\"\").split(\".\").sort(),s=f.event.special[m]||{},m=(g?s.delegateType:s.bindType)||m,s=f.event.special[m]||{},o=f.extend({type:m,origType:l[1],data:e,handler:d,guid:d.guid,selector:g,quick:g&&G(g),namespace:n.join(\".\")},p),r=j[m];if(!r){r=j[m]=[],r.delegateCount=0;if(!s.setup||s.setup.call(a,e,n,i)===!1)a.addEventListener?a.addEventListener(m,i,!1):a.attachEvent&&a.attachEvent(\"on\"+m,i)}s.add&&(s.add.call(a,o),o.handler.guid||(o.handler.guid=d.guid)),g?r.splice(r.delegateCount++,0,o):r.push(o),f.event.global[m]=!0}a=null}},global:{},remove:function(a,b,c,d,e){var g=f.hasData(a)&&f._data(a),h,i,j,k,l,m,n,o,p,q,r,s;if(!!g&&!!(o=g.events)){b=f.trim(I(b||\"\")).split(\" \");for(h=0;h<b.length;h++){i=A.exec(b[h])||[],j=k=i[1],l=i[2];if(!j){for(j in o)f.event.remove(a,j+b[h],c,d,!0);continue}p=f.event.special[j]||{},j=(d?p.delegateType:p.bindType)||j,r=o[j]||[],m=r.length,l=l?new RegExp(\"(^|\\\\.)\"+l.split(\".\").sort().join(\"\\\\.(?:.*\\\\.)?\")+\"(\\\\.|$)\"):null;for(n=0;n<r.length;n++)s=r[n],(e||k===s.origType)&&(!c||c.guid===s.guid)&&(!l||l.test(s.namespace))&&(!d||d===s.selector||d===\"**\"&&s.selector)&&(r.splice(n--,1),s.selector&&r.delegateCount--,p.remove&&p.remove.call(a,s));r.length===0&&m!==r.length&&((!p.teardown||p.teardown.call(a,l)===!1)&&f.removeEvent(a,j,g.handle),delete o[j])}f.isEmptyObject(o)&&(q=g.handle,q&&(q.elem=null),f.removeData(a,[\"events\",\"handle\"],!0))}},customEvent:{getData:!0,setData:!0,changeData:!0},trigger:function(c,d,e,g){if(!e||e.nodeType!==3&&e.nodeType!==8){var h=c.type||c,i=[],j,k,l,m,n,o,p,q,r,s;if(E.test(h+f.event.triggered))return;h.indexOf(\"!\")>=0&&(h=h.slice(0,-1),k=!0),h.indexOf(\".\")>=0&&(i=h.split(\".\"),h=i.shift(),i.sort());if((!e||f.event.customEvent[h])&&!f.event.global[h])return;c=typeof c==\"object\"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.isTrigger=!0,c.exclusive=k,c.namespace=i.join(\".\"),c.namespace_re=c.namespace?new RegExp(\"(^|\\\\.)\"+i.join(\"\\\\.(?:.*\\\\.)?\")+\"(\\\\.|$)\"):null,o=h.indexOf(\":\")<0?\"on\"+h:\"\";if(!e){j=f.cache;for(l in j)j[l].events&&j[l].events[h]&&f.event.trigger(c,d,j[l].handle.elem,!0);return}c.result=b,c.target||(c.target=e),d=d!=null?f.makeArray(d):[],d.unshift(c),p=f.event.special[h]||{};if(p.trigger&&p.trigger.apply(e,d)===!1)return;r=[[e,p.bindType||h]];if(!g&&!p.noBubble&&!f.isWindow(e)){s=p.delegateType||h,m=E.test(s+h)?e:e.parentNode,n=null;for(;m;m=m.parentNode)r.push([m,s]),n=m;n&&n===e.ownerDocument&&r.push([n.defaultView||n.parentWindow||a,s])}for(l=0;l<r.length&&!c.isPropagationStopped();l++)m=r[l][0],c.type=r[l][1],q=(f._data(m,\"events\")||{})[c.type]&&f._data(m,\"handle\"),q&&q.apply(m,d),q=o&&m[o],q&&f.acceptData(m)&&q.apply(m,d)===!1&&c.preventDefault();c.type=h,!g&&!c.isDefaultPrevented()&&(!p._default||p._default.apply(e.ownerDocument,d)===!1)&&(h!==\"click\"||!f.nodeName(e,\"a\"))&&f.acceptData(e)&&o&&e[h]&&(h!==\"focus\"&&h!==\"blur\"||c.target.offsetWidth!==0)&&!f.isWindow(e)&&(n=e[o],n&&(e[o]=null),f.event.triggered=h,e[h](),f.event.triggered=b,n&&(e[o]=n));return c.result}},dispatch:function(c){c=f.event.fix(c||a.event);var d=(f._data(this,\"events\")||{})[c.type]||[],e=d.delegateCount,g=[].slice.call(arguments,0),h=!c.exclusive&&!c.namespace,i=f.event.special[c.type]||{},j=[],k,l,m,n,o,p,q,r,s,t,u;g[0]=c,c.delegateTarget=this;if(!i.preDispatch||i.preDispatch.call(this,c)!==!1){if(e&&(!c.button||c.type!==\"click\")){n=f(this),n.context=this.ownerDocument||this;for(m=c.target;m!=this;m=m.parentNode||this)if(m.disabled!==!0){p={},r=[],n[0]=m;for(k=0;k<e;k++)s=d[k],t=s.selector,p[t]===b&&(p[t]=s.quick?H(m,s.quick):n.is(t)),p[t]&&r.push(s);r.length&&j.push({elem:m,matches:r})}}d.length>e&&j.push({elem:this,matches:d.slice(e)});for(k=0;k<j.length&&!c.isPropagationStopped();k++){q=j[k],c.currentTarget=q.elem;for(l=0;l<q.matches.length&&!c.isImmediatePropagationStopped();l++){s=q.matches[l];if(h||!c.namespace&&!s.namespace||c.namespace_re&&c.namespace_re.test(s.namespace))c.data=s.data,c.handleObj=s,o=((f.event.special[s.origType]||{}).handle||s.handler).apply(q.elem,g),o!==b&&(c.result=o,o===!1&&(c.preventDefault(),c.stopPropagation()))}}i.postDispatch&&i.postDispatch.call(this,c);return c.result}},props:\"attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which\".split(\" \"),fixHooks:{},keyHooks:{props:\"char charCode key keyCode\".split(\" \"),filter:function(a,b){a.which==null&&(a.which=b.charCode!=null?b.charCode:b.keyCode);return a}},mouseHooks:{props:\"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement\".split(\" \"),filter:function(a,d){var e,f,g,h=d.button,i=d.fromElement;a.pageX==null&&d.clientX!=null&&(e=a.target.ownerDocument||c,f=e.documentElement,g=e.body,a.pageX=d.clientX+(f&&f.scrollLeft||g&&g.scrollLeft||0)-(f&&f.clientLeft||g&&g.clientLeft||0),a.pageY=d.clientY+(f&&f.scrollTop||g&&g.scrollTop||0)-(f&&f.clientTop||g&&g.clientTop||0)),!a.relatedTarget&&i&&(a.relatedTarget=i===a.target?d.toElement:i),!a.which&&h!==b&&(a.which=h&1?1:h&2?3:h&4?2:0);return a}},fix:function(a){if(a[f.expando])return a;var d,e,g=a,h=f.event.fixHooks[a.type]||{},i=h.props?this.props.concat(h.props):this.props;a=f.Event(g);for(d=i.length;d;)e=i[--d],a[e]=g[e];a.target||(a.target=g.srcElement||c),a.target.nodeType===3&&(a.target=a.target.parentNode),a.metaKey===b&&(a.metaKey=a.ctrlKey);return h.filter?h.filter(a,g):a},special:{ready:{setup:f.bindReady},load:{noBubble:!0},focus:{delegateType:\"focusin\"},blur:{delegateType:\"focusout\"},beforeunload:{setup:function(a,b,c){f.isWindow(this)&&(this.onbeforeunload=c)},teardown:function(a,b){this.onbeforeunload===b&&(this.onbeforeunload=null)}}},simulate:function(a,b,c,d){var e=f.extend(new f.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?f.event.trigger(e,null,b):f.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},f.event.handle=f.event.dispatch,f.removeEvent=c.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){a.detachEvent&&a.detachEvent(\"on\"+b,c)},f.Event=function(a,b){if(!(this instanceof f.Event))return new f.Event(a,b);a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||a.returnValue===!1||a.getPreventDefault&&a.getPreventDefault()?K:J):this.type=a,b&&f.extend(this,b),this.timeStamp=a&&a.timeStamp||f.now(),this[f.expando]=!0},f.Event.prototype={preventDefault:function(){this.isDefaultPrevented=K;var a=this.originalEvent;!a||(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){this.isPropagationStopped=K;var a=this.originalEvent;!a||(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=K,this.stopPropagation()},isDefaultPrevented:J,isPropagationStopped:J,isImmediatePropagationStopped:J},f.each({mouseenter:\"mouseover\",mouseleave:\"mouseout\"},function(a,b){f.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c=this,d=a.relatedTarget,e=a.handleObj,g=e.selector,h;if(!d||d!==c&&!f.contains(c,d))a.type=e.origType,h=e.handler.apply(this,arguments),a.type=b;return h}}}),f.support.submitBubbles||(f.event.special.submit={setup:function(){if(f.nodeName(this,\"form\"))return!1;f.event.add(this,\"click._submit keypress._submit\",function(a){var c=a.target,d=f.nodeName(c,\"input\")||f.nodeName(c,\"button\")?c.form:b;d&&!d._submit_attached&&(f.event.add(d,\"submit._submit\",function(a){a._submit_bubble=!0}),d._submit_attached=!0)})},postDispatch:function(a){a._submit_bubble&&(delete a._submit_bubble,this.parentNode&&!a.isTrigger&&f.event.simulate(\"submit\",this.parentNode,a,!0))},teardown:function(){if(f.nodeName(this,\"form\"))return!1;f.event.remove(this,\"._submit\")}}),f.support.changeBubbles||(f.event.special.change={setup:function(){if(z.test(this.nodeName)){if(this.type===\"checkbox\"||this.type===\"radio\")f.event.add(this,\"propertychange._change\",function(a){a.originalEvent.propertyName===\"checked\"&&(this._just_changed=!0)}),f.event.add(this,\"click._change\",function(a){this._just_changed&&!a.isTrigger&&(this._just_changed=!1,f.event.simulate(\"change\",this,a,!0))});return!1}f.event.add(this,\"beforeactivate._change\",function(a){var b=a.target;z.test(b.nodeName)&&!b._change_attached&&(f.event.add(b,\"change._change\",function(a){this.parentNode&&!a.isSimulated&&!a.isTrigger&&f.event.simulate(\"change\",this.parentNode,a,!0)}),b._change_attached=!0)})},handle:function(a){var b=a.target;if(this!==b||a.isSimulated||a.isTrigger||b.type!==\"radio\"&&b.type!==\"checkbox\")return a.handleObj.handler.apply(this,arguments)},teardown:function(){f.event.remove(this,\"._change\");return z.test(this.nodeName)}}),f.support.focusinBubbles||f.each({focus:\"focusin\",blur:\"focusout\"},function(a,b){var d=0,e=function(a){f.event.simulate(b,a.target,f.event.fix(a),!0)};f.event.special[b]={setup:function(){d++===0&&c.addEventListener(a,e,!0)},teardown:function(){--d===0&&c.removeEventListener(a,e,!0)}}}),f.fn.extend({on:function(a,c,d,e,g){var h,i;if(typeof a==\"object\"){typeof c!=\"string\"&&(d=d||c,c=b);for(i in a)this.on(i,c,d,a[i],g);return this}d==null&&e==null?(e=c,d=c=b):e==null&&(typeof c==\"string\"?(e=d,d=b):(e=d,d=c,c=b));if(e===!1)e=J;else if(!e)return this;g===1&&(h=e,e=function(a){f().off(a);return h.apply(this,arguments)},e.guid=h.guid||(h.guid=f.guid++));return this.each(function(){f.event.add(this,a,e,d,c)})},one:function(a,b,c,d){return this.on(a,b,c,d,1)},off:function(a,c,d){if(a&&a.preventDefault&&a.handleObj){var e=a.handleObj;f(a.delegateTarget).off(e.namespace?e.origType+\".\"+e.namespace:e.origType,e.selector,e.handler);return this}if(typeof a==\"object\"){for(var g in a)this.off(g,c,a[g]);return this}if(c===!1||typeof c==\"function\")d=c,c=b;d===!1&&(d=J);return this.each(function(){f.event.remove(this,a,d,c)})},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},live:function(a,b,c){f(this.context).on(a,this.selector,b,c);return this},die:function(a,b){f(this.context).off(a,this.selector||\"**\",b);return this},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return arguments.length==1?this.off(a,\"**\"):this.off(b,a,c)},trigger:function(a,b){return this.each(function(){f.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0])return f.event.trigger(a,b,this[0],!0)},toggle:function(a){var b=arguments,c=a.guid||f.guid++,d=0,e=function(c){var e=(f._data(this,\"lastToggle\"+a.guid)||0)%d;f._data(this,\"lastToggle\"+a.guid,e+1),c.preventDefault();return b[e].apply(this,arguments)||!1};e.guid=c;while(d<b.length)b[d++].guid=c;return this.click(e)},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),f.each(\"blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu\".split(\" \"),function(a,b){f.fn[b]=function(a,c){c==null&&(c=a,a=null);return arguments.length>0?this.on(b,null,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0),C.test(b)&&(f.event.fixHooks[b]=f.event.keyHooks),D.test(b)&&(f.event.fixHooks[b]=f.event.mouseHooks)}),function(){function x(a,b,c,e,f,g){for(var h=0,i=e.length;h<i;h++){var j=e[h];if(j){var k=!1;j=j[a];while(j){if(j[d]===c){k=e[j.sizset];break}if(j.nodeType===1){g||(j[d]=c,j.sizset=h);if(typeof b!=\"string\"){if(j===b){k=!0;break}}else if(m.filter(b,[j]).length>0){k=j;break}}j=j[a]}e[h]=k}}}function w(a,b,c,e,f,g){for(var h=0,i=e.length;h<i;h++){var j=e[h];if(j){var k=!1;j=j[a];while(j){if(j[d]===c){k=e[j.sizset];break}j.nodeType===1&&!g&&(j[d]=c,j.sizset=h);if(j.nodeName.toLowerCase()===b){k=j;break}j=j[a]}e[h]=k}}}var a=/((?:\\((?:\\([^()]+\\)|[^()]+)+\\)|\\[(?:\\[[^\\[\\]]*\\]|['\"][^'\"]*['\"]|[^\\[\\]'\"]+)+\\]|\\\\.|[^ >+~,(\\[\\\\]+)+|[>+~])(\\s*,\\s*)?((?:.|\\r|\\n)*)/g,d=\"sizcache\"+(Math.random()+\"\").replace(\".\",\"\"),e=0,g=Object.prototype.toString,h=!1,i=!0,j=/\\\\/g,k=/\\r\\n/g,l=/\\W/;[0,0].sort(function(){i=!1;return 0});var m=function(b,d,e,f){e=e||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!=\"string\")return e;var i,j,k,l,n,q,r,t,u=!0,v=m.isXML(d),w=[],x=b;do{a.exec(\"\"),i=a.exec(x);if(i){x=i[3],w.push(i[1]);if(i[2]){l=i[3];break}}}while(i);if(w.length>1&&p.exec(b))if(w.length===2&&o.relative[w[0]])j=y(w[0]+w[1],d,f);else{j=o.relative[w[0]]?[d]:m(w.shift(),d);while(w.length)b=w.shift(),o.relative[b]&&(b+=w.shift()),j=y(b,j,f)}else{!f&&w.length>1&&d.nodeType===9&&!v&&o.match.ID.test(w[0])&&!o.match.ID.test(w[w.length-1])&&(n=m.find(w.shift(),d,v),d=n.expr?m.filter(n.expr,n.set)[0]:n.set[0]);if(d){n=f?{expr:w.pop(),set:s(f)}:m.find(w.pop(),w.length===1&&(w[0]===\"~\"||w[0]===\"+\")&&d.parentNode?d.parentNode:d,v),j=n.expr?m.filter(n.expr,n.set):n.set,w.length>0?k=s(j):u=!1;while(w.length)q=w.pop(),r=q,o.relative[q]?r=w.pop():q=\"\",r==null&&(r=d),o.relative[q](k,r,v)}else k=w=[]}k||(k=j),k||m.error(q||b);if(g.call(k)===\"[object Array]\")if(!u)e.push.apply(e,k);else if(d&&d.nodeType===1)for(t=0;k[t]!=null;t++)k[t]&&(k[t]===!0||k[t].nodeType===1&&m.contains(d,k[t]))&&e.push(j[t]);else for(t=0;k[t]!=null;t++)k[t]&&k[t].nodeType===1&&e.push(j[t]);else s(k,e);l&&(m(l,h,e,f),m.uniqueSort(e));return e};m.uniqueSort=function(a){if(u){h=i,a.sort(u);if(h)for(var b=1;b<a.length;b++)a[b]===a[b-1]&&a.splice(b--,1)}return a},m.matches=function(a,b){return m(a,null,null,b)},m.matchesSelector=function(a,b){return m(b,null,null,[a]).length>0},m.find=function(a,b,c){var d,e,f,g,h,i;if(!a)return[];for(e=0,f=o.order.length;e<f;e++){h=o.order[e];if(g=o.leftMatch[h].exec(a)){i=g[1],g.splice(1,1);if(i.substr(i.length-1)!==\"\\\\\"){g[1]=(g[1]||\"\").replace(j,\"\"),d=o.find[h](g,b,c);if(d!=null){a=a.replace(o.match[h],\"\");break}}}}d||(d=typeof b.getElementsByTagName!=\"undefined\"?b.getElementsByTagName(\"*\"):[]);return{set:d,expr:a}},m.filter=function(a,c,d,e){var f,g,h,i,j,k,l,n,p,q=a,r=[],s=c,t=c&&c[0]&&m.isXML(c[0]);while(a&&c.length){for(h in o.filter)if((f=o.leftMatch[h].exec(a))!=null&&f[2]){k=o.filter[h],l=f[1],g=!1,f.splice(1,1);if(l.substr(l.length-1)===\"\\\\\")continue;s===r&&(r=[]);if(o.preFilter[h]){f=o.preFilter[h](f,s,d,r,e,t);if(!f)g=i=!0;else if(f===!0)continue}if(f)for(n=0;(j=s[n])!=null;n++)j&&(i=k(j,f,n,s),p=e^i,d&&i!=null?p?g=!0:s[n]=!1:p&&(r.push(j),g=!0));if(i!==b){d||(s=r),a=a.replace(o.match[h],\"\");if(!g)return[];break}}if(a===q)if(g==null)m.error(a);else break;q=a}return s},m.error=function(a){throw new Error(\"Syntax error, unrecognized expression: \"+a)};var n=m.getText=function(a){var b,c,d=a.nodeType,e=\"\";if(d){if(d===1||d===9||d===11){if(typeof a.textContent==\"string\")return a.textContent;if(typeof a.innerText==\"string\")return a.innerText.replace(k,\"\");for(a=a.firstChild;a;a=a.nextSibling)e+=n(a)}else if(d===3||d===4)return a.nodeValue}else for(b=0;c=a[b];b++)c.nodeType!==8&&(e+=n(c));return e},o=m.selectors={order:[\"ID\",\"NAME\",\"TAG\"],match:{ID:/#((?:[\\w\\u00c0-\\uFFFF\\-]|\\\\.)+)/,CLASS:/\\.((?:[\\w\\u00c0-\\uFFFF\\-]|\\\\.)+)/,NAME:/\\[name=['\"]*((?:[\\w\\u00c0-\\uFFFF\\-]|\\\\.)+)['\"]*\\]/,ATTR:/\\[\\s*((?:[\\w\\u00c0-\\uFFFF\\-]|\\\\.)+)\\s*(?:(\\S?=)\\s*(?:(['\"])(.*?)\\3|(#?(?:[\\w\\u00c0-\\uFFFF\\-]|\\\\.)*)|)|)\\s*\\]/,TAG:/^((?:[\\w\\u00c0-\\uFFFF\\*\\-]|\\\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\\(\\s*(even|odd|(?:[+\\-]?\\d+|(?:[+\\-]?\\d*)?n\\s*(?:[+\\-]\\s*\\d+)?))\\s*\\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\\((\\d*)\\))?(?=[^\\-]|$)/,PSEUDO:/:((?:[\\w\\u00c0-\\uFFFF\\-]|\\\\.)+)(?:\\((['\"]?)((?:\\([^\\)]+\\)|[^\\(\\)]*)+)\\2\\))?/},leftMatch:{},attrMap:{\"class\":\"className\",\"for\":\"htmlFor\"},attrHandle:{href:function(a){return a.getAttribute(\"href\")},type:function(a){return a.getAttribute(\"type\")}},relative:{\"+\":function(a,b){var c=typeof b==\"string\",d=c&&!l.test(b),e=c&&!d;d&&(b=b.toLowerCase());for(var f=0,g=a.length,h;f<g;f++)if(h=a[f]){while((h=h.previousSibling)&&h.nodeType!==1);a[f]=e||h&&h.nodeName.toLowerCase()===b?h||!1:h===b}e&&m.filter(b,a,!0)},\">\":function(a,b){var c,d=typeof b==\"string\",e=0,f=a.length;if(d&&!l.test(b)){b=b.toLowerCase();for(;e<f;e++){c=a[e];if(c){var g=c.parentNode;a[e]=g.nodeName.toLowerCase()===b?g:!1}}}else{for(;e<f;e++)c=a[e],c&&(a[e]=d?c.parentNode:c.parentNode===b);d&&m.filter(b,a,!0)}},\"\":function(a,b,c){var d,f=e++,g=x;typeof b==\"string\"&&!l.test(b)&&(b=b.toLowerCase(),d=b,g=w),g(\"parentNode\",b,f,a,d,c)},\"~\":function(a,b,c){var d,f=e++,g=x;typeof b==\"string\"&&!l.test(b)&&(b=b.toLowerCase(),d=b,g=w),g(\"previousSibling\",b,f,a,d,c)}},find:{ID:function(a,b,c){if(typeof b.getElementById!=\"undefined\"&&!c){var d=b.getElementById(a[1]);return d&&d.parentNode?[d]:[]}},NAME:function(a,b){if(typeof b.getElementsByName!=\"undefined\"){var c=[],d=b.getElementsByName(a[1]);for(var e=0,f=d.length;e<f;e++)d[e].getAttribute(\"name\")===a[1]&&c.push(d[e]);return c.length===0?null:c}},TAG:function(a,b){if(typeof b.getElementsByTagName!=\"undefined\")return b.getElementsByTagName(a[1])}},preFilter:{CLASS:function(a,b,c,d,e,f){a=\" \"+a[1].replace(j,\"\")+\" \";if(f)return a;for(var g=0,h;(h=b[g])!=null;g++)h&&(e^(h.className&&(\" \"+h.className+\" \").replace(/[\\t\\n\\r]/g,\" \").indexOf(a)>=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(j,\"\")},TAG:function(a,b){return a[1].replace(j,\"\").toLowerCase()},CHILD:function(a){if(a[1]===\"nth\"){a[2]||m.error(a[0]),a[2]=a[2].replace(/^\\+|\\s*/g,\"\");var b=/(-?)(\\d*)(?:n([+\\-]?\\d*))?/.exec(a[2]===\"even\"&&\"2n\"||a[2]===\"odd\"&&\"2n+1\"||!/\\D/.test(a[2])&&\"0n+\"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&m.error(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(j,\"\");!f&&o.attrMap[g]&&(a[1]=o.attrMap[g]),a[4]=(a[4]||a[5]||\"\").replace(j,\"\"),a[2]===\"~=\"&&(a[4]=\" \"+a[4]+\" \");return a},PSEUDO:function(b,c,d,e,f){if(b[1]===\"not\")if((a.exec(b[3])||\"\").length>1||/^\\w/.test(b[3]))b[3]=m(b[3],null,null,c);else{var g=m.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(o.match.POS.test(b[0])||o.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!==\"hidden\"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!m(c[3],a).length},header:function(a){return/h\\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute(\"type\"),c=a.type;return a.nodeName.toLowerCase()===\"input\"&&\"text\"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()===\"input\"&&\"radio\"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()===\"input\"&&\"checkbox\"===a.type},file:function(a){return a.nodeName.toLowerCase()===\"input\"&&\"file\"===a.type},password:function(a){return a.nodeName.toLowerCase()===\"input\"&&\"password\"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b===\"input\"||b===\"button\")&&\"submit\"===a.type},image:function(a){return a.nodeName.toLowerCase()===\"input\"&&\"image\"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b===\"input\"||b===\"button\")&&\"reset\"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b===\"input\"&&\"button\"===a.type||b===\"button\"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return b<c[3]-0},gt:function(a,b,c){return b>c[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=o.filters[e];if(f)return f(a,c,b,d);if(e===\"contains\")return(a.textContent||a.innerText||n([a])||\"\").indexOf(b[3])>=0;if(e===\"not\"){var g=b[3];for(var h=0,i=g.length;h<i;h++)if(g[h]===a)return!1;return!0}m.error(e)},CHILD:function(a,b){var c,e,f,g,h,i,j,k=b[1],l=a;switch(k){case\"only\":case\"first\":while(l=l.previousSibling)if(l.nodeType===1)return!1;if(k===\"first\")return!0;l=a;case\"last\":while(l=l.nextSibling)if(l.nodeType===1)return!1;return!0;case\"nth\":c=b[2],e=b[3];if(c===1&&e===0)return!0;f=b[0],g=a.parentNode;if(g&&(g[d]!==f||!a.nodeIndex)){i=0;for(l=g.firstChild;l;l=l.nextSibling)l.nodeType===1&&(l.nodeIndex=++i);g[d]=f}j=a.nodeIndex-e;return c===0?j===0:j%c===0&&j/c>=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute(\"id\")===b},TAG:function(a,b){return b===\"*\"&&a.nodeType===1||!!a.nodeName&&a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(\" \"+(a.className||a.getAttribute(\"class\"))+\" \").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=m.attr?m.attr(a,c):o.attrHandle[c]?o.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+\"\",f=b[2],g=b[4];return d==null?f===\"!=\":!f&&m.attr?d!=null:f===\"=\"?e===g:f===\"*=\"?e.indexOf(g)>=0:f===\"~=\"?(\" \"+e+\" \").indexOf(g)>=0:g?f===\"!=\"?e!==g:f===\"^=\"?e.indexOf(g)===0:f===\"$=\"?e.substr(e.length-g.length)===g:f===\"|=\"?e===g||e.substr(0,g.length+1)===g+\"-\":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=o.setFilters[e];if(f)return f(a,c,b,d)}}},p=o.match.POS,q=function(a,b){return\"\\\\\"+(b-0+1)};for(var r in o.match)o.match[r]=new RegExp(o.match[r].source+/(?![^\\[]*\\])(?![^\\(]*\\))/.source),o.leftMatch[r]=new RegExp(/(^(?:.|\\r|\\n)*?)/.source+o.match[r].source.replace(/\\\\(\\d+)/g,q));o.match.globalPOS=p;var s=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(t){s=function(a,b){var c=0,d=b||[];if(g.call(a)===\"[object Array]\")Array.prototype.push.apply(d,a);else if(typeof a.length==\"number\")for(var e=a.length;c<e;c++)d.push(a[c]);else for(;a[c];c++)d.push(a[c]);return d}}var u,v;c.documentElement.compareDocumentPosition?u=function(a,b){if(a===b){h=!0;return 0}if(!a.compareDocumentPosition||!b.compareDocumentPosition)return a.compareDocumentPosition?-1:1;return a.compareDocumentPosition(b)&4?-1:1}:(u=function(a,b){if(a===b){h=!0;return 0}if(a.sourceIndex&&b.sourceIndex)return a.sourceIndex-b.sourceIndex;var c,d,e=[],f=[],g=a.parentNode,i=b.parentNode,j=g;if(g===i)return v(a,b);if(!g)return-1;if(!i)return 1;while(j)e.unshift(j),j=j.parentNode;j=i;while(j)f.unshift(j),j=j.parentNode;c=e.length,d=f.length;for(var k=0;k<c&&k<d;k++)if(e[k]!==f[k])return v(e[k],f[k]);return k===c?v(a,f[k],-1):v(e[k],b,1)},v=function(a,b,c){if(a===b)return c;var d=a.nextSibling;while(d){if(d===b)return-1;d=d.nextSibling}return 1}),function(){var a=c.createElement(\"div\"),d=\"script\"+(new Date).getTime(),e=c.documentElement;a.innerHTML=\"<a name='\"+d+\"'/>\",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(o.find.ID=function(a,c,d){if(typeof c.getElementById!=\"undefined\"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!=\"undefined\"&&e.getAttributeNode(\"id\").nodeValue===a[1]?[e]:b:[]}},o.filter.ID=function(a,b){var c=typeof a.getAttributeNode!=\"undefined\"&&a.getAttributeNode(\"id\");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement(\"div\");a.appendChild(c.createComment(\"\")),a.getElementsByTagName(\"*\").length>0&&(o.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]===\"*\"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML=\"<a href='#'></a>\",a.firstChild&&typeof a.firstChild.getAttribute!=\"undefined\"&&a.firstChild.getAttribute(\"href\")!==\"#\"&&(o.attrHandle.href=function(a){return a.getAttribute(\"href\",2)}),a=null}(),c.querySelectorAll&&function(){var a=m,b=c.createElement(\"div\"),d=\"__sizzle__\";b.innerHTML=\"<p class='TEST'></p>\";if(!b.querySelectorAll||b.querySelectorAll(\".TEST\").length!==0){m=function(b,e,f,g){e=e||c;if(!g&&!m.isXML(e)){var h=/^(\\w+$)|^\\.([\\w\\-]+$)|^#([\\w\\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return s(e.getElementsByTagName(b),f);if(h[2]&&o.find.CLASS&&e.getElementsByClassName)return s(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b===\"body\"&&e.body)return s([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return s([],f);if(i.id===h[3])return s([i],f)}try{return s(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!==\"object\"){var k=e,l=e.getAttribute(\"id\"),n=l||d,p=e.parentNode,q=/^\\s*[+~]/.test(b);l?n=n.replace(/'/g,\"\\\\$&\"):e.setAttribute(\"id\",n),q&&p&&(e=e.parentNode);try{if(!q||p)return s(e.querySelectorAll(\"[id='\"+n+\"'] \"+b),f)}catch(r){}finally{l||k.removeAttribute(\"id\")}}}return a(b,e,f,g)};for(var e in a)m[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement(\"div\"),\"div\"),e=!1;try{b.call(c.documentElement,\"[test!='']:sizzle\")}catch(f){e=!0}m.matchesSelector=function(a,c){c=c.replace(/\\=\\s*([^'\"\\]]*)\\s*\\]/g,\"='$1']\");if(!m.isXML(a))try{if(e||!o.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return m(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement(\"div\");a.innerHTML=\"<div class='test e'></div><div class='test'></div>\";if(!!a.getElementsByClassName&&a.getElementsByClassName(\"e\").length!==0){a.lastChild.className=\"e\";if(a.getElementsByClassName(\"e\").length===1)return;o.order.splice(1,0,\"CLASS\"),o.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!=\"undefined\"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?m.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?m.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:m.contains=function(){return!1},m.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!==\"HTML\":!1};var y=function(a,b,c){var d,e=[],f=\"\",g=b.nodeType?[b]:b;while(d=o.match.PSEUDO.exec(a))f+=d[0],a=a.replace(o.match.PSEUDO,\"\");a=o.relative[a]?a+\"*\":a;for(var h=0,i=g.length;h<i;h++)m(a,g[h],e,c);return m.filter(f,e)};m.attr=f.attr,m.selectors.attrMap={},f.find=m,f.expr=m.selectors,f.expr[\":\"]=f.expr.filters,f.unique=m.uniqueSort,f.text=m.getText,f.isXMLDoc=m.isXML,f.contains=m.contains}();var L=/Until$/,M=/^(?:parents|prevUntil|prevAll)/,N=/,/,O=/^.[^:#\\[\\.,]*$/,P=Array.prototype.slice,Q=f.expr.match.globalPOS,R={children:!0,contents:!0,next:!0,prev:!0};f.fn.extend({find:function(a){var b=this,c,d;if(typeof a!=\"string\")return f(a).filter(function(){for(c=0,d=b.length;c<d;c++)if(f.contains(b[c],this))return!0});var e=this.pushStack(\"\",\"find\",a),g,h,i;for(c=0,d=this.length;c<d;c++){g=e.length,f.find(a,this[c],e);if(c>0)for(h=g;h<e.length;h++)for(i=0;i<g;i++)if(e[i]===e[h]){e.splice(h--,1);break}}return e},has:function(a){var b=f(a);return this.filter(function(){for(var a=0,c=b.length;a<c;a++)if(f.contains(this,b[a]))return!0})},not:function(a){return this.pushStack(T(this,a,!1),\"not\",a)},filter:function(a){return this.pushStack(T(this,a,!0),\"filter\",a)},is:function(a){return!!a&&(typeof a==\"string\"?Q.test(a)?f(a,this.context).index(this[0])>=0:f.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h=1;while(g&&g.ownerDocument&&g!==b){for(d=0;d<a.length;d++)f(g).is(a[d])&&c.push({selector:a[d],elem:g,level:h});g=g.parentNode,h++}return c}var i=Q.test(a)||typeof a!=\"string\"?f(a,b||this.context):0;for(d=0,e=this.length;d<e;d++){g=this[d];while(g){if(i?i.index(g)>-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,\"closest\",a)},index:function(a){if(!a)return this[0]&&this[0].parentNode?this.prevAll().length:-1;if(typeof a==\"string\")return f.inArray(this[0],f(a));return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a==\"string\"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(S(c[0])||S(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,\"parentNode\")},parentsUntil:function(a,b,c){return f.dir(a,\"parentNode\",c)},next:function(a){return f.nth(a,2,\"nextSibling\")},prev:function(a){return f.nth(a,2,\"previousSibling\")},nextAll:function(a){return f.dir(a,\"nextSibling\")},prevAll:function(a){return f.dir(a,\"previousSibling\")},nextUntil:function(a,b,c){return f.dir(a,\"nextSibling\",c)},prevUntil:function(a,b,c){return f.dir(a,\"previousSibling\",c)},siblings:function(a){return f.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,\"iframe\")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c);L.test(a)||(d=c),d&&typeof d==\"string\"&&(e=f.filter(d,e)),e=this.length>1&&!R[a]?f.unique(e):e,(this.length>1||N.test(d))&&M.test(a)&&(e=e.reverse());return this.pushStack(e,a,P.call(arguments).join(\",\"))}}),f.extend({filter:function(a,b,c){c&&(a=\":not(\"+a+\")\");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var V=\"abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video\",W=/ jQuery\\d+=\"(?:\\d+|null)\"/g,X=/^\\s+/,Y=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\\w:]+)[^>]*)\\/>/ig,Z=/<([\\w:]+)/,$=/<tbody/i,_=/<|&#?\\w+;/,ba=/<(?:script|style)/i,bb=/<(?:script|object|embed|option|style)/i,bc=new RegExp(\"<(?:\"+V+\")[\\\\s/>]\",\"i\"),bd=/checked\\s*(?:[^=]|=\\s*.checked.)/i,be=/\\/(java|ecma)script/i,bf=/^\\s*<!(?:\\[CDATA\\[|\\-\\-)/,bg={option:[1,\"<select multiple='multiple'>\",\"</select>\"],legend:[1,\"<fieldset>\",\"</fieldset>\"],thead:[1,\"<table>\",\"</table>\"],tr:[2,\"<table><tbody>\",\"</tbody></table>\"],td:[3,\"<table><tbody><tr>\",\"</tr></tbody></table>\"],col:[2,\"<table><tbody></tbody><colgroup>\",\"</colgroup></table>\"],area:[1,\"<map>\",\"</map>\"],_default:[0,\"\",\"\"]},bh=U(c);bg.optgroup=bg.option,bg.tbody=bg.tfoot=bg.colgroup=bg.caption=bg.thead,bg.th=bg.td,f.support.htmlSerialize||(bg._default=[1,\"div<div>\",\"</div>\"]),f.fn.extend({text:function(a){return f.access(this,function(a){return a===b?f.text(this):this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a))},null,a,arguments.length)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=f.isFunction(a);return this.each(function(c){f(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,\"body\")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f\n.clean(arguments);a.push.apply(a,this.toArray());return this.pushStack(a,\"before\",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,\"after\",arguments);a.push.apply(a,f.clean(arguments));return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName(\"*\")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName(\"*\"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){return f.access(this,function(a){var c=this[0]||{},d=0,e=this.length;if(a===b)return c.nodeType===1?c.innerHTML.replace(W,\"\"):null;if(typeof a==\"string\"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!bg[(Z.exec(a)||[\"\",\"\"])[1].toLowerCase()]){a=a.replace(Y,\"<$1></$2>\");try{for(;d<e;d++)c=this[d]||{},c.nodeType===1&&(f.cleanData(c.getElementsByTagName(\"*\")),c.innerHTML=a);c=0}catch(g){}}c&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(a){if(this[0]&&this[0].parentNode){if(f.isFunction(a))return this.each(function(b){var c=f(this),d=c.html();c.replaceWith(a.call(this,b,d))});typeof a!=\"string\"&&(a=f(a).detach());return this.each(function(){var b=this.nextSibling,c=this.parentNode;f(this).remove(),b?f(b).before(a):f(c).append(a)})}return this.length?this.pushStack(f(f.isFunction(a)?a():a),\"replaceWith\",a):this},detach:function(a){return this.remove(a,!0)},domManip:function(a,c,d){var e,g,h,i,j=a[0],k=[];if(!f.support.checkClone&&arguments.length===3&&typeof j==\"string\"&&bd.test(j))return this.each(function(){f(this).domManip(a,c,d,!0)});if(f.isFunction(j))return this.each(function(e){var g=f(this);a[0]=j.call(this,e,c?g.html():b),g.domManip(a,c,d)});if(this[0]){i=j&&j.parentNode,f.support.parentNode&&i&&i.nodeType===11&&i.childNodes.length===this.length?e={fragment:i}:e=f.buildFragment(a,this,k),h=e.fragment,h.childNodes.length===1?g=h=h.firstChild:g=h.firstChild;if(g){c=c&&f.nodeName(g,\"tr\");for(var l=0,m=this.length,n=m-1;l<m;l++)d.call(c?bi(this[l],g):this[l],e.cacheable||m>1&&l<n?f.clone(h,!0,!0):h)}k.length&&f.each(k,function(a,b){b.src?f.ajax({type:\"GET\",global:!1,url:b.src,async:!1,dataType:\"script\"}):f.globalEval((b.text||b.textContent||b.innerHTML||\"\").replace(bf,\"/*$0*/\")),b.parentNode&&b.parentNode.removeChild(b)})}return this}}),f.buildFragment=function(a,b,d){var e,g,h,i,j=a[0];b&&b[0]&&(i=b[0].ownerDocument||b[0]),i.createDocumentFragment||(i=c),a.length===1&&typeof j==\"string\"&&j.length<512&&i===c&&j.charAt(0)===\"<\"&&!bb.test(j)&&(f.support.checkClone||!bd.test(j))&&(f.support.html5Clone||!bc.test(j))&&(g=!0,h=f.fragments[j],h&&h!==1&&(e=h)),e||(e=i.createDocumentFragment(),f.clean(a,i,e,d)),g&&(f.fragments[j]=h?e:1);return{fragment:e,cacheable:g}},f.fragments={},f.each({appendTo:\"append\",prependTo:\"prepend\",insertBefore:\"before\",insertAfter:\"after\",replaceAll:\"replaceWith\"},function(a,b){f.fn[a]=function(c){var d=[],e=f(c),g=this.length===1&&this[0].parentNode;if(g&&g.nodeType===11&&g.childNodes.length===1&&e.length===1){e[b](this[0]);return this}for(var h=0,i=e.length;h<i;h++){var j=(h>0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d,e,g,h=f.support.html5Clone||f.isXMLDoc(a)||!bc.test(\"<\"+a.nodeName+\">\")?a.cloneNode(!0):bo(a);if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bk(a,h),d=bl(a),e=bl(h);for(g=0;d[g];++g)e[g]&&bk(d[g],e[g])}if(b){bj(a,h);if(c){d=bl(a),e=bl(h);for(g=0;d[g];++g)bj(d[g],e[g])}}d=e=null;return h},clean:function(a,b,d,e){var g,h,i,j=[];b=b||c,typeof b.createElement==\"undefined\"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);for(var k=0,l;(l=a[k])!=null;k++){typeof l==\"number\"&&(l+=\"\");if(!l)continue;if(typeof l==\"string\")if(!_.test(l))l=b.createTextNode(l);else{l=l.replace(Y,\"<$1></$2>\");var m=(Z.exec(l)||[\"\",\"\"])[1].toLowerCase(),n=bg[m]||bg._default,o=n[0],p=b.createElement(\"div\"),q=bh.childNodes,r;b===c?bh.appendChild(p):U(b).appendChild(p),p.innerHTML=n[1]+l+n[2];while(o--)p=p.lastChild;if(!f.support.tbody){var s=$.test(l),t=m===\"table\"&&!s?p.firstChild&&p.firstChild.childNodes:n[1]===\"<table>\"&&!s?p.childNodes:[];for(i=t.length-1;i>=0;--i)f.nodeName(t[i],\"tbody\")&&!t[i].childNodes.length&&t[i].parentNode.removeChild(t[i])}!f.support.leadingWhitespace&&X.test(l)&&p.insertBefore(b.createTextNode(X.exec(l)[0]),p.firstChild),l=p.childNodes,p&&(p.parentNode.removeChild(p),q.length>0&&(r=q[q.length-1],r&&r.parentNode&&r.parentNode.removeChild(r)))}var u;if(!f.support.appendChecked)if(l[0]&&typeof (u=l.length)==\"number\")for(i=0;i<u;i++)bn(l[i]);else bn(l);l.nodeType?j.push(l):j=f.merge(j,l)}if(d){g=function(a){return!a.type||be.test(a.type)};for(k=0;j[k];k++){h=j[k];if(e&&f.nodeName(h,\"script\")&&(!h.type||be.test(h.type)))e.push(h.parentNode?h.parentNode.removeChild(h):h);else{if(h.nodeType===1){var v=f.grep(h.getElementsByTagName(\"script\"),g);j.splice.apply(j,[k+1,0].concat(v))}d.appendChild(h)}}}return j},cleanData:function(a){var b,c,d=f.cache,e=f.event.special,g=f.support.deleteExpando;for(var h=0,i;(i=a[h])!=null;h++){if(i.nodeName&&f.noData[i.nodeName.toLowerCase()])continue;c=i[f.expando];if(c){b=d[c];if(b&&b.events){for(var j in b.events)e[j]?f.event.remove(i,j):f.removeEvent(i,j,b.handle);b.handle&&(b.handle.elem=null)}g?delete i[f.expando]:i.removeAttribute&&i.removeAttribute(f.expando),delete d[c]}}}});var bp=/alpha\\([^)]*\\)/i,bq=/opacity=([^)]*)/,br=/([A-Z]|^ms)/g,bs=/^[\\-+]?(?:\\d*\\.)?\\d+$/i,bt=/^-?(?:\\d*\\.)?\\d+(?!px)[^\\d\\s]+$/i,bu=/^([\\-+])=([\\-+.\\de]+)/,bv=/^margin/,bw={position:\"absolute\",visibility:\"hidden\",display:\"block\"},bx=[\"Top\",\"Right\",\"Bottom\",\"Left\"],by,bz,bA;f.fn.css=function(a,c){return f.access(this,function(a,c,d){return d!==b?f.style(a,c,d):f.css(a,c)},a,c,arguments.length>1)},f.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=by(a,\"opacity\");return c===\"\"?\"1\":c}return a.style.opacity}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{\"float\":f.support.cssFloat?\"cssFloat\":\"styleFloat\"},style:function(a,c,d,e){if(!!a&&a.nodeType!==3&&a.nodeType!==8&&!!a.style){var g,h,i=f.camelCase(c),j=a.style,k=f.cssHooks[i];c=f.cssProps[i]||i;if(d===b){if(k&&\"get\"in k&&(g=k.get(a,!1,e))!==b)return g;return j[c]}h=typeof d,h===\"string\"&&(g=bu.exec(d))&&(d=+(g[1]+1)*+g[2]+parseFloat(f.css(a,c)),h=\"number\");if(d==null||h===\"number\"&&isNaN(d))return;h===\"number\"&&!f.cssNumber[i]&&(d+=\"px\");if(!k||!(\"set\"in k)||(d=k.set(a,d))!==b)try{j[c]=d}catch(l){}}},css:function(a,c,d){var e,g;c=f.camelCase(c),g=f.cssHooks[c],c=f.cssProps[c]||c,c===\"cssFloat\"&&(c=\"float\");if(g&&\"get\"in g&&(e=g.get(a,!0,d))!==b)return e;if(by)return by(a,c)},swap:function(a,b,c){var d={},e,f;for(f in b)d[f]=a.style[f],a.style[f]=b[f];e=c.call(a);for(f in b)a.style[f]=d[f];return e}}),f.curCSS=f.css,c.defaultView&&c.defaultView.getComputedStyle&&(bz=function(a,b){var c,d,e,g,h=a.style;b=b.replace(br,\"-$1\").toLowerCase(),(d=a.ownerDocument.defaultView)&&(e=d.getComputedStyle(a,null))&&(c=e.getPropertyValue(b),c===\"\"&&!f.contains(a.ownerDocument.documentElement,a)&&(c=f.style(a,b))),!f.support.pixelMargin&&e&&bv.test(b)&&bt.test(c)&&(g=h.width,h.width=c,c=e.width,h.width=g);return c}),c.documentElement.currentStyle&&(bA=function(a,b){var c,d,e,f=a.currentStyle&&a.currentStyle[b],g=a.style;f==null&&g&&(e=g[b])&&(f=e),bt.test(f)&&(c=g.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),g.left=b===\"fontSize\"?\"1em\":f,f=g.pixelLeft+\"px\",g.left=c,d&&(a.runtimeStyle.left=d));return f===\"\"?\"auto\":f}),by=bz||bA,f.each([\"height\",\"width\"],function(a,b){f.cssHooks[b]={get:function(a,c,d){if(c)return a.offsetWidth!==0?bB(a,b,d):f.swap(a,bw,function(){return bB(a,b,d)})},set:function(a,b){return bs.test(b)?b+\"px\":b}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return bq.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||\"\")?parseFloat(RegExp.$1)/100+\"\":b?\"1\":\"\"},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNumeric(b)?\"alpha(opacity=\"+b*100+\")\":\"\",g=d&&d.filter||c.filter||\"\";c.zoom=1;if(b>=1&&f.trim(g.replace(bp,\"\"))===\"\"){c.removeAttribute(\"filter\");if(d&&!d.filter)return}c.filter=bp.test(g)?g.replace(bp,e):g+\" \"+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){return f.swap(a,{display:\"inline-block\"},function(){return b?by(a,\"margin-right\"):a.style.marginRight})}})}),f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style&&a.style.display||f.css(a,\"display\"))===\"none\"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)}),f.each({margin:\"\",padding:\"\",border:\"Width\"},function(a,b){f.cssHooks[a+b]={expand:function(c){var d,e=typeof c==\"string\"?c.split(\" \"):[c],f={};for(d=0;d<4;d++)f[a+bx[d]+b]=e[d]||e[d-2]||e[0];return f}}});var bC=/%20/g,bD=/\\[\\]$/,bE=/\\r?\\n/g,bF=/#.*$/,bG=/^(.*?):[ \\t]*([^\\r\\n]*)\\r?$/mg,bH=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bI=/^(?:about|app|app\\-storage|.+\\-extension|file|res|widget):$/,bJ=/^(?:GET|HEAD)$/,bK=/^\\/\\//,bL=/\\?/,bM=/<script\\b[^<]*(?:(?!<\\/script>)<[^<]*)*<\\/script>/gi,bN=/^(?:select|textarea)/i,bO=/\\s+/,bP=/([?&])_=[^&]*/,bQ=/^([\\w\\+\\.\\-]+:)(?:\\/\\/([^\\/?#:]*)(?::(\\d+))?)?/,bR=f.fn.load,bS={},bT={},bU,bV,bW=[\"*/\"]+[\"*\"];try{bU=e.href}catch(bX){bU=c.createElement(\"a\"),bU.href=\"\",bU=bU.href}bV=bQ.exec(bU.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!=\"string\"&&bR)return bR.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(\" \");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h=\"GET\";c&&(f.isFunction(c)?(d=c,c=b):typeof c==\"object\"&&(c=f.param(c,f.ajaxSettings.traditional),h=\"POST\"));var i=this;f.ajax({url:a,type:h,dataType:\"html\",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f(\"<div>\").append(c.replace(bM,\"\")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bN.test(this.nodeName)||bH.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bE,\"\\r\\n\")}}):{name:b.name,value:c.replace(bE,\"\\r\\n\")}}).get()}}),f.each(\"ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend\".split(\" \"),function(a,b){f.fn[b]=function(a){return this.on(b,a)}}),f.each([\"get\",\"post\"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,\"script\")},getJSON:function(a,b,c){return f.get(a,b,c,\"json\")},ajaxSetup:function(a,b){b?b$(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),b$(a,b);return a},ajaxSettings:{url:bU,isLocal:bI.test(bV[1]),global:!0,type:\"GET\",contentType:\"application/x-www-form-urlencoded; charset=UTF-8\",processData:!0,async:!0,accepts:{xml:\"application/xml, text/xml\",html:\"text/html\",text:\"text/plain\",json:\"application/json, text/javascript\",\"*\":bW},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:\"responseXML\",text:\"responseText\"},converters:{\"* text\":a.String,\"text html\":!0,\"text json\":f.parseJSON,\"text xml\":f.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:bY(bS),ajaxTransport:bY(bT),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||\"\",v.readyState=a>0?4:0;var o,r,u,w=c,x=l?ca(d,v,l):b,y,z;if(a>=200&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader(\"Last-Modified\"))f.lastModified[k]=y;if(z=v.getResponseHeader(\"Etag\"))f.etag[k]=z}if(a===304)w=\"notmodified\",o=!0;else try{r=cb(d,x),w=\"success\",o=!0}catch(A){w=\"parsererror\",u=A}}else{u=w;if(!w||a)w=\"error\",a<0&&(a=0)}v.status=a,v.statusText=\"\"+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),j=b,t&&g.trigger(\"ajax\"+(o?\"Success\":\"Error\"),[v,d,o?r:u]),i.fireWith(e,[v,w]),t&&(g.trigger(\"ajaxComplete\",[v,d]),--f.active||f.event.trigger(\"ajaxStop\"))}}typeof a==\"object\"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f.Callbacks(\"once memory\"),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bG.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||\"abort\",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.add,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+\"\").replace(bF,\"\").replace(bK,bV[1]+\"//\"),d.dataTypes=f.trim(d.dataType||\"*\").toLowerCase().split(bO),d.crossDomain==null&&(r=bQ.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bV[1]&&r[2]==bV[2]&&(r[3]||(r[1]===\"http:\"?80:443))==(bV[3]||(bV[1]===\"http:\"?80:443)))),d.data&&d.processData&&typeof d.data!=\"string\"&&(d.data=f.param(d.data,d.traditional)),bZ(bS,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bJ.test(d.type),t&&f.active++===0&&f.event.trigger(\"ajaxStart\");if(!d.hasContent){d.data&&(d.url+=(bL.test(d.url)?\"&\":\"?\")+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bP,\"$1_=\"+x);d.url=y+(y===d.url?(bL.test(d.url)?\"&\":\"?\")+\"_=\"+x:\"\")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader(\"Content-Type\",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader(\"If-Modified-Since\",f.lastModified[k]),f.etag[k]&&v.setRequestHeader(\"If-None-Match\",f.etag[k])),v.setRequestHeader(\"Accept\",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!==\"*\"?\", \"+bW+\"; q=0.01\":\"\"):d.accepts[\"*\"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=bZ(bT,d,c,v);if(!p)w(-1,\"No Transport\");else{v.readyState=1,t&&g.trigger(\"ajaxSend\",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort(\"timeout\")},d.timeout));try{s=1,p.send(l,w)}catch(z){if(s<2)w(-1,z);else throw z}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+\"=\"+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)b_(g,a[g],c,e);return d.join(\"&\").replace(bC,\"+\")}}),f.extend({active:0,lastModified:{},etag:{}});var cc=f.now(),cd=/(\\=)\\?(&|$)|\\?\\?/i;f.ajaxSetup({jsonp:\"callback\",jsonpCallback:function(){return f.expando+\"_\"+cc++}}),f.ajaxPrefilter(\"json jsonp\",function(b,c,d){var e=typeof b.data==\"string\"&&/^application\\/x\\-www\\-form\\-urlencoded/.test(b.contentType);if(b.dataTypes[0]===\"jsonp\"||b.jsonp!==!1&&(cd.test(b.url)||e&&cd.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l=\"$1\"+h+\"$2\";b.jsonp!==!1&&(j=j.replace(cd,l),b.url===j&&(e&&(k=k.replace(cd,l)),b.data===k&&(j+=(/\\?/.test(j)?\"&\":\"?\")+b.jsonp+\"=\"+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters[\"script json\"]=function(){g||f.error(h+\" was not called\");return g[0]},b.dataTypes[0]=\"json\";return\"script\"}}),f.ajaxSetup({accepts:{script:\"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript\"},contents:{script:/javascript|ecmascript/},converters:{\"text script\":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter(\"script\",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type=\"GET\",a.global=!1)}),f.ajaxTransport(\"script\",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName(\"head\")[0]||c.documentElement;return{send:function(f,g){d=c.createElement(\"script\"),d.async=\"async\",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,\"success\")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var ce=a.ActiveXObject?function(){for(var a in cg)cg[a](0,1)}:!1,cf=0,cg;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ch()||ci()}:ch,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&\"withCredentials\"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e[\"X-Requested-With\"]&&(e[\"X-Requested-With\"]=\"XMLHttpRequest\");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,ce&&delete cg[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n);try{m.text=h.responseText}catch(a){}try{k=h.statusText}catch(o){k=\"\"}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cf,ce&&(cg||(cg={},f(a).unload(ce)),cg[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var cj={},ck,cl,cm=/^(?:toggle|show|hide)$/,cn=/^([+\\-]=)?([\\d+.\\-]+)([a-z%]*)$/i,co,cp=[[\"height\",\"marginTop\",\"marginBottom\",\"paddingTop\",\"paddingBottom\"],[\"width\",\"marginLeft\",\"marginRight\",\"paddingLeft\",\"paddingRight\"],[\"opacity\"]],cq;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(ct(\"show\",3),a,b,c);for(var g=0,h=this.length;g<h;g++)d=this[g],d.style&&(e=d.style.display,!f._data(d,\"olddisplay\")&&e===\"none\"&&(e=d.style.display=\"\"),(e===\"\"&&f.css(d,\"display\")===\"none\"||!f.contains(d.ownerDocument.documentElement,d))&&f._data(d,\"olddisplay\",cu(d.nodeName)));for(g=0;g<h;g++){d=this[g];if(d.style){e=d.style.display;if(e===\"\"||e===\"none\")d.style.display=f._data(d,\"olddisplay\")||\"\"}}return this},hide:function(a,b,c){if(a||a===0)return this.animate(ct(\"hide\",3),a,b,c);var d,e,g=0,h=this.length;for(;g<h;g++)d=this[g],d.style&&(e=f.css(d,\"display\"),e!==\"none\"&&!f._data(d,\"olddisplay\")&&f._data(d,\"olddisplay\",e));for(g=0;g<h;g++)this[g].style&&(this[g].style.display=\"none\");return this},_toggle:f.fn.toggle,toggle:function(a,b,c){var d=typeof a==\"boolean\";f.isFunction(a)&&f.isFunction(b)?this._toggle.apply(this,arguments):a==null||d?this.each(function(){var b=d?a:f(this).is(\":hidden\");f(this)[b?\"show\":\"hide\"]()}):this.animate(ct(\"toggle\",3),a,b,c);return this},fadeTo:function(a,b,c,d){return this.filter(\":hidden\").css(\"opacity\",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){function g(){e.queue===!1&&f._mark(this);var b=f.extend({},e),c=this.nodeType===1,d=c&&f(this).is(\":hidden\"),g,h,i,j,k,l,m,n,o,p,q;b.animatedProperties={};for(i in a){g=f.camelCase(i),i!==g&&(a[g]=a[i],delete a[i]);if((k=f.cssHooks[g])&&\"expand\"in k){l=k.expand(a[g]),delete a[g];for(i in l)i in a||(a[i]=l[i])}}for(g in a){h=a[g],f.isArray(h)?(b.animatedProperties[g]=h[1],h=a[g]=h[0]):b.animatedProperties[g]=b.specialEasing&&b.specialEasing[g]||b.easing||\"swing\";if(h===\"hide\"&&d||h===\"show\"&&!d)return b.complete.call(this);c&&(g===\"height\"||g===\"width\")&&(b.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY],f.css(this,\"display\")===\"inline\"&&f.css(this,\"float\")===\"none\"&&(!f.support.inlineBlockNeedsLayout||cu(this.nodeName)===\"inline\"?this.style.display=\"inline-block\":this.style.zoom=1))}b.overflow!=null&&(this.style.overflow=\"hidden\");for(i in a)j=new f.fx(this,b,i),h=a[i],cm.test(h)?(q=f._data(this,\"toggle\"+i)||(h===\"toggle\"?d?\"show\":\"hide\":0),q?(f._data(this,\"toggle\"+i,q===\"show\"?\"hide\":\"show\"),j[q]()):j[h]()):(m=cn.exec(h),n=j.cur(),m?(o=parseFloat(m[2]),p=m[3]||(f.cssNumber[i]?\"\":\"px\"),p!==\"px\"&&(f.style(this,i,(o||1)+p),n=(o||1)/j.cur()*n,f.style(this,i,n+p)),m[1]&&(o=(m[1]===\"-=\"?-1:1)*o+n),j.custom(n,o,p)):j.custom(n,h,\"\"));return!0}var e=f.speed(b,c,d);if(f.isEmptyObject(a))return this.each(e.complete,[!1]);a=f.extend({},a);return e.queue===!1?this.each(g):this.queue(e.queue,g)},stop:function(a,c,d){typeof a!=\"string\"&&(d=c,c=a,a=b),c&&a!==!1&&this.queue(a||\"fx\",[]);return this.each(function(){function h(a,b,c){var e=b[c];f.removeData(a,c,!0),e.stop(d)}var b,c=!1,e=f.timers,g=f._data(this);d||f._unmark(!0,this);if(a==null)for(b in g)g[b]&&g[b].stop&&b.indexOf(\".run\")===b.length-4&&h(this,g,b);else g[b=a+\".run\"]&&g[b].stop&&h(this,g,b);for(b=e.length;b--;)e[b].elem===this&&(a==null||e[b].queue===a)&&(d?e[b](!0):e[b].saveState(),c=!0,e.splice(b,1));(!d||!c)&&f.dequeue(this,a)})}}),f.each({slideDown:ct(\"show\",1),slideUp:ct(\"hide\",1),slideToggle:ct(\"toggle\",1),fadeIn:{opacity:\"show\"},fadeOut:{opacity:\"hide\"},fadeToggle:{opacity:\"toggle\"}},function(a,b){f.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),f.extend({speed:function(a,b,c){var d=a&&typeof a==\"object\"?f.extend({},a):{complete:c||!c&&b||f.isFunction(a)&&a,duration:a,easing:c&&b||b&&!f.isFunction(b)&&b};d.duration=f.fx.off?0:typeof d.duration==\"number\"?d.duration:d.duration in f.fx.speeds?f.fx.speeds[d.duration]:f.fx.speeds._default;if(d.queue==null||d.queue===!0)d.queue=\"fx\";d.old=d.complete,d.complete=function(a){f.isFunction(d.old)&&d.old.call(this),d.queue?f.dequeue(this,d.queue):a!==!1&&f._unmark(this)};return d},easing:{linear:function(a){return a},swing:function(a){return-Math.cos(a*Math.PI)/2+.5}},timers:[],fx:function(a,b,c){this.options=b,this.elem=a,this.prop=c,b.orig=b.orig||{}}}),f.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this),(f.fx.step[this.prop]||f.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];var a,b=f.css(this.elem,this.prop);return isNaN(a=parseFloat(b))?!b||b===\"auto\"?0:b:a},custom:function(a,c,d){function h(a){return e.step(a)}var e=this,g=f.fx;this.startTime=cq||cr(),this.end=c,this.now=this.start=a,this.pos=this.state=0,this.unit=d||this.unit||(f.cssNumber[this.prop]?\"\":\"px\"),h.queue=this.options.queue,h.elem=this.elem,h.saveState=function(){f._data(e.elem,\"fxshow\"+e.prop)===b&&(e.options.hide?f._data(e.elem,\"fxshow\"+e.prop,e.start):e.options.show&&f._data(e.elem,\"fxshow\"+e.prop,e.end))},h()&&f.timers.push(h)&&!co&&(co=setInterval(g.tick,g.interval))},show:function(){var a=f._data(this.elem,\"fxshow\"+this.prop);this.options.orig[this.prop]=a||f.style(this.elem,this.prop),this.options.show=!0,a!==b?this.custom(this.cur(),a):this.custom(this.prop===\"width\"||this.prop===\"height\"?1:0,this.cur()),f(this.elem).show()},hide:function(){this.options.orig[this.prop]=f._data(this.elem,\"fxshow\"+this.prop)||f.style(this.elem,this.prop),this.options.hide=!0,this.custom(this.cur(),0)},step:function(a){var b,c,d,e=cq||cr(),g=!0,h=this.elem,i=this.options;if(a||e>=i.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),i.animatedProperties[this.prop]=!0;for(b in i.animatedProperties)i.animatedProperties[b]!==!0&&(g=!1);if(g){i.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each([\"\",\"X\",\"Y\"],function(a,b){h.style[\"overflow\"+b]=i.overflow[a]}),i.hide&&f(h).hide();if(i.hide||i.show)for(b in i.animatedProperties)f.style(h,b,i.orig[b]),f.removeData(h,\"fxshow\"+b,!0),f.removeData(h,\"toggle\"+b,!0);d=i.complete,d&&(i.complete=!1,d.call(h))}return!1}i.duration==Infinity?this.now=e:(c=e-this.startTime,this.state=c/i.duration,this.pos=f.easing[i.animatedProperties[this.prop]](this.state,c,0,1,i.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){var a,b=f.timers,c=0;for(;c<b.length;c++)a=b[c],!a()&&b[c]===a&&b.splice(c--,1);b.length||f.fx.stop()},interval:13,stop:function(){clearInterval(co),co=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){f.style(a.elem,\"opacity\",a.now)},_default:function(a){a.elem.style&&a.elem.style[a.prop]!=null?a.elem.style[a.prop]=a.now+a.unit:a.elem[a.prop]=a.now}}}),f.each(cp.concat.apply([],cp),function(a,b){b.indexOf(\"margin\")&&(f.fx.step[b]=function(a){f.style(a.elem,b,Math.max(0,a.now)+a.unit)})}),f.expr&&f.expr.filters&&(f.expr.filters.animated=function(a){return f.grep(f.timers,function(b){return a===b.elem}).length});var cv,cw=/^t(?:able|d|h)$/i,cx=/^(?:body|html)$/i;\"getBoundingClientRect\"in c.documentElement?cv=function(a,b,c,d){try{d=a.getBoundingClientRect()}catch(e){}if(!d||!f.contains(c,a))return d?{top:d.top,left:d.left}:{top:0,left:0};var g=b.body,h=cy(b),i=c.clientTop||g.clientTop||0,j=c.clientLeft||g.clientLeft||0,k=h.pageYOffset||f.support.boxModel&&c.scrollTop||g.scrollTop,l=h.pageXOffset||f.support.boxModel&&c.scrollLeft||g.scrollLeft,m=d.top+k-i,n=d.left+l-j;return{top:m,left:n}}:cv=function(a,b,c){var d,e=a.offsetParent,g=a,h=b.body,i=b.defaultView,j=i?i.getComputedStyle(a,null):a.currentStyle,k=a.offsetTop,l=a.offsetLeft;while((a=a.parentNode)&&a!==h&&a!==c){if(f.support.fixedPosition&&j.position===\"fixed\")break;d=i?i.getComputedStyle(a,null):a.currentStyle,k-=a.scrollTop,l-=a.scrollLeft,a===e&&(k+=a.offsetTop,l+=a.offsetLeft,f.support.doesNotAddBorder&&(!f.support.doesAddBorderForTableAndCells||!cw.test(a.nodeName))&&(k+=parseFloat(d.borderTopWidth)||0,l+=parseFloat(d.borderLeftWidth)||0),g=e,e=a.offsetParent),f.support.subtractsBorderForOverflowNotVisible&&d.overflow!==\"visible\"&&(k+=parseFloat(d.borderTopWidth)||0,l+=parseFloat(d.borderLeftWidth)||0),j=d}if(j.position===\"relative\"||j.position===\"static\")k+=h.offsetTop,l+=h.offsetLeft;f.support.fixedPosition&&j.position===\"fixed\"&&(k+=Math.max(c.scrollTop,h.scrollTop),l+=Math.max(c.scrollLeft,h.scrollLeft));return{top:k,left:l}},f.fn.offset=function(a){if(arguments.length)return a===b?this:this.each(function(b){f.offset.setOffset(this,a,b)});var c=this[0],d=c&&c.ownerDocument;if(!d)return null;if(c===d.body)return f.offset.bodyOffset(c);return cv(c,d,d.documentElement)},f.offset={bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;f.support.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(f.css(a,\"marginTop\"))||0,c+=parseFloat(f.css(a,\"marginLeft\"))||0);return{top:b,left:c}},setOffset:function(a,b,c){var d=f.css(a,\"position\");d===\"static\"&&(a.style.position=\"relative\");var e=f(a),g=e.offset(),h=f.css(a,\"top\"),i=f.css(a,\"left\"),j=(d===\"absolute\"||d===\"fixed\")&&f.inArray(\"auto\",[h,i])>-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),\"using\"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cx.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,\"marginTop\"))||0,c.left-=parseFloat(f.css(a,\"marginLeft\"))||0,d.top+=parseFloat(f.css(b[0],\"borderTopWidth\"))||0,d.left+=parseFloat(f.css(b[0],\"borderLeftWidth\"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cx.test(a.nodeName)&&f.css(a,\"position\")===\"static\")a=a.offsetParent;return a})}}),f.each({scrollLeft:\"pageXOffset\",scrollTop:\"pageYOffset\"},function(a,c){var d=/Y/.test(c);f.fn[a]=function(e){return f.access(this,function(a,e,g){var h=cy(a);if(g===b)return h?c in h?h[c]:f.support.boxModel&&h.document.documentElement[e]||h.document.body[e]:a[e];h?h.scrollTo(d?f(h).scrollLeft():g,d?g:f(h).scrollTop()):a[e]=g},a,e,arguments.length,null)}}),f.each({Height:\"height\",Width:\"width\"},function(a,c){var d=\"client\"+a,e=\"scroll\"+a,g=\"offset\"+a;f.fn[\"inner\"+a]=function(){var a=this[0];return a?a.style?parseFloat(f.css(a,c,\"padding\")):this[c]():null},f.fn[\"outer\"+a]=function(a){var b=this[0];return b?b.style?parseFloat(f.css(b,c,a?\"margin\":\"border\")):this[c]():null},f.fn[c]=function(a){return f.access(this,function(a,c,h){var i,j,k,l;if(f.isWindow(a)){i=a.document,j=i.documentElement[d];return f.support.boxModel&&j||i.body&&i.body[d]||j}if(a.nodeType===9){i=a.documentElement;if(i[d]>=i[e])return i[d];return Math.max(a.body[e],i[e],a.body[g],i[g])}if(h===b){k=f.css(a,c),l=parseFloat(k);return f.isNumeric(l)?l:k}f(a).css(c,h)},c,a,arguments.length,null)}}),a.jQuery=a.$=f,typeof define==\"function\"&&define.amd&&define.amd.jQuery&&define(\"jquery\",[],function(){return f})})(window);"
  },
  {
    "path": "test/loading-tests.js",
    "content": "/*\n *  Test to see if skrollr is loaded properly\n *\t\t- module support with require\n *\t\t- global variable exposure without module\n */\n\n/*global $:false, require:false, start:false, ok:false, QUnit:false, asyncTest:false */\n\n $(function(){\n\n\t'use strict';\n\n\t// a helper to load a script specified by the path argument\n\t// onLoaded is called once the script is loaded\n\tfunction loadScript(path, onLoaded){\n\t\t$.getScript( path, function() {\n\t\t\tif(typeof onLoaded === 'function'){\n\t\t\t\tonLoaded.call();\n\t\t\t}\n\t\t});\n\t}\n\n\t// remove skrollr from the global scope after each test is run \n\tQUnit.testDone(function() {\n\t\tif(typeof window.skrollr !== 'undefined'){\n\t\t\tdelete window.skrollr;\n\t\t}\n\t});\n\n\t//tests\n\n\tasyncTest('skrollr is available through global scope without require', function(){\n\t\tok(typeof skrollr === 'undefined', 'skrollr is not available before the script is loaded');\n\n\t\tloadScript('../src/skrollr.js', function() {\n\t\t\tok(typeof skrollr !== 'undefined', 'skrollr is available through global scope');\n\t\t\tstart();\n\t\t});\n\t});\n\n\tasyncTest('skrollr is available as a module when require.js is present', function(){\n\t\tok(typeof skrollr === 'undefined', 'skrollr is not available before the script is loaded');\n\n\t\tloadScript('require.js', function(){\n\t\t\trequire.config({\n\t\t\t\tbaseUrl: '../src',\n\t\t\t\twaitSeconds: 15\n\t\t\t});\n\n\t\t\trequire(['skrollr'], function(skrollr){\n\t\t\t\tok(typeof skrollr !== 'undefined', 'skrollr is available as a module');\n\t\t\t\tstart();\n\t\t\t});\n\t\t});\n\t});\n\n });"
  },
  {
    "path": "test/loading.html",
    "content": "<!DOCTYPE html>\n<html class=\"no-skrollr\">\n<head>\n\t<meta charset=\"utf-8\" />\n\t<title>skrollr test suite</title>\n\t<link rel=\"stylesheet\" type=\"text/css\" href=\"qunit.css\" />\n</head>\n<body class=\"notransition\">\n\t<div id=\"qunit\"></div>\n\t<script src=\"qunit.js\" type=\"text/javascript\"></script>\n\t<script src=\"jquery.js\" type=\"text/javascript\"></script>\n\t<!--[if lt IE 9]>\n\t<script type=\"text/javascript\" src=\"../src/plugins/skrollr.ie.js\"></script>\n\t<![endif]-->\n\t<script src=\"loading-tests.js\"></script>\n</body>\n</html>\n"
  },
  {
    "path": "test/qunit-numeric-css-property-equals.js",
    "content": "QUnit.extend(QUnit, {\n\trxNumericCSSProperty: /[0-9.]+/g,\n\tnumericCSSPropertyEquals: function(actual, expected, message) {\n\t\t//Simple case, both strings already match.\n\t\tif(actual === expected) {\n\t\t\tQUnit.push(true, actual, expected, message);\n\n\t\t\treturn;\n\t\t}\n\n\t\t//Now extract all numbers from the property string.\n\t\t//e.g. \"0.5px 100px\" will result in [\"0.5\", \"100\"]\n\t\tvar actualArray = actual.match(QUnit.rxNumericCSSProperty);\n\t\tvar expectedArray = expected.match(QUnit.rxNumericCSSProperty);\n\n\t\tvar passes = actualArray !== null && expectedArray !== null && actualArray.length === expectedArray.length;\n\n\t\tfor(var i = 0; passes && i < actualArray.length; i++) {\n\t\t\tvar curActual = actualArray[i];\n\t\t\tvar curExpected = expectedArray[i];\n\t\t\tvar delta = 0.01;\n\n\t\t\t//Use 0.01 for floats and 1 for ints.\n\t\t\tif(curActual.indexOf('.') === -1 && curExpected.indexOf('.') === -1) {\n\t\t\t\tdelta = 1;\n\t\t\t}\n\n\t\t\tcurActual = parseFloat(curActual);\n\t\t\tcurExpected = parseFloat(curExpected);\n\n\t\t\tpasses = (curActual === curExpected) || Math.abs(curActual - curExpected) <= delta;\n\t\t}\n\n\t\tQUnit.push(passes, actual, expected, message);\n\t}\n});\n"
  },
  {
    "path": "test/qunit.css",
    "content": "/**\n * QUnit v1.5.0 - A JavaScript Unit Testing Framework\n *\n * http://docs.jquery.com/QUnit\n *\n * Copyright (c) 2012 John Resig, JÃ¶rn Zaefferer\n * Dual licensed under the MIT (MIT-LICENSE.txt)\n * or GPL (GPL-LICENSE.txt) licenses.\n */\n\n/** Font Family and Sizes */\n\n#qunit-tests, #qunit-header, #qunit-banner, #qunit-testrunner-toolbar, #qunit-userAgent, #qunit-testresult {\n    font-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-tests ol, #qunit-header, #qunit-banner, #qunit-userAgent, #qunit-testresult {\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: 15px 15px 0 0;\n\t-moz-border-radius: 15px 15px 0 0;\n\t-webkit-border-top-right-radius: 15px;\n\t-webkit-border-top-left-radius: 15px;\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-header label {\n\tdisplay: inline-block;\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}\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\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 ol {\n\tmargin-top: 0.5em;\n\tpadding: 0.5em;\n\n\tbackground-color: #fff;\n\n\tborder-radius: 15px;\n\t-moz-border-radius: 15px;\n\t-webkit-border-radius: 15px;\n\n\tbox-shadow: inset 0px 2px 13px #999;\n\t-moz-box-shadow: inset 0px 2px 13px #999;\n\t-webkit-box-shadow: inset 0px 2px 13px #999;\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\tmargin: 0.5em;\n\tpadding: 0.4em 0.5em 0.4em 0.5em;\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: #5E740B;\n\tbackground-color: #fff;\n\tborder-left: 26px 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: 26px solid #EE5757;\n\twhite-space: pre;\n}\n\n#qunit-tests > li:last-child {\n\tborder-radius: 0 0 15px 15px;\n\t-moz-border-radius: 0 0 15px 15px;\n\t-webkit-border-bottom-right-radius: 15px;\n\t-webkit-border-bottom-left-radius: 15px;\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": "test/qunit.js",
    "content": "/**\n * QUnit v1.5.0 - A JavaScript Unit Testing Framework\n *\n * http://docs.jquery.com/QUnit\n *\n * Copyright (c) 2012 John Resig, Jörn Zaefferer\n * Dual licensed under the MIT (MIT-LICENSE.txt)\n * or GPL (GPL-LICENSE.txt) licenses.\n */\n\n(function(window) {\n\nvar defined = {\n    setTimeout: typeof window.setTimeout !== \"undefined\",\n\tsessionStorage: (function() {\n\t\tvar x = \"qunit-test-string\";\n\t\ttry {\n\t\t\tsessionStorage.setItem(x, x);\n\t\t\tsessionStorage.removeItem(x);\n\t\t\treturn true;\n\t\t} catch(e) {\n\t\t\treturn false;\n\t\t}\n\t}())\n};\n\nvar\ttestId = 0,\n\ttoString = Object.prototype.toString,\n\thasOwn = Object.prototype.hasOwnProperty;\n\nvar Test = function(name, testName, expected, async, callback) {\n\tthis.name = name;\n\tthis.testName = testName;\n\tthis.expected = expected;\n\tthis.async = async;\n\tthis.callback = callback;\n\tthis.assertions = [];\n};\nTest.prototype = {\n\tinit: function() {\n\t\tvar tests = id(\"qunit-tests\");\n\t\tif (tests) {\n\t\t\tvar b = document.createElement(\"strong\");\n\t\t\t\tb.innerHTML = \"Running \" + this.name;\n\t\t\tvar li = document.createElement(\"li\");\n\t\t\t\tli.appendChild( b );\n\t\t\t\tli.className = \"running\";\n\t\t\t\tli.id = this.id = \"test-output\" + testId++;\n\t\t\ttests.appendChild( li );\n\t\t}\n\t},\n\tsetup: function() {\n\t\tif (this.module != config.previousModule) {\n\t\t\tif ( 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} else if (config.autorun) {\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\t\tthis.testEnvironment = extend({\n\t\t\tsetup: function() {},\n\t\t\tteardown: function() {}\n\t\t}, this.moduleTestEnvironment);\n\n\t\trunLoggingCallbacks( 'testStart', QUnit, {\n\t\t\tname: this.testName,\n\t\t\tmodule: this.module\n\t\t});\n\n\t\t// allow utility functions to access the current test environment\n\t\t// TODO why??\n\t\tQUnit.current_testEnvironment = this.testEnvironment;\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);\n\t\t\treturn;\n\t\t}\n\t\ttry {\n\t\t\tthis.testEnvironment.setup.call(this.testEnvironment);\n\t\t} catch(e) {\n\t\t\tQUnit.pushFailure( \"Setup failed on \" + this.testName + \": \" + e.message, 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.name;\n\t\t}\n\n\t\tif ( this.async ) {\n\t\t\tQUnit.stop();\n\t\t}\n\n\t\tif ( config.notrycatch ) {\n\t\t\tthis.callback.call(this.testEnvironment);\n\t\t\treturn;\n\t\t}\n\t\ttry {\n\t\t\tthis.callback.call(this.testEnvironment);\n\t\t} catch(e) {\n\t\t\tQUnit.pushFailure( \"Died on test #\" + (this.assertions.length + 1) + \": \" + e.message, extractStacktrace( e, 1 ) );\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\tthis.testEnvironment.teardown.call(this.testEnvironment);\n\t\t\treturn;\n\t\t} else {\n\t\t\ttry {\n\t\t\t\tthis.testEnvironment.teardown.call(this.testEnvironment);\n\t\t\t} catch(e) {\n\t\t\t\tQUnit.pushFailure( \"Teardown failed on \" + this.testName + \": \" + e.message, 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 ( this.expected != null && this.expected != this.assertions.length ) {\n\t\t\tQUnit.pushFailure( \"Expected \" + this.expected + \" assertions, but \" + this.assertions.length + \" were run\" );\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.\" );\n\t\t}\n\n\t\tvar good = 0, bad = 0,\n\t\t\tli, i,\n\t\t\ttests = id(\"qunit-tests\");\n\n\t\tconfig.stats.all += this.assertions.length;\n\t\tconfig.moduleStats.all += this.assertions.length;\n\n\t\tif ( tests ) {\n\t\t\tvar ol = document.createElement(\"ol\");\n\n\t\t\tfor ( i = 0; i < this.assertions.length; i++ ) {\n\t\t\t\tvar assertion = 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\tol.style.display = \"none\";\n\t\t\t}\n\n\t\t\tvar b = document.createElement(\"strong\");\n\t\t\tb.innerHTML = this.name + \" <b class='counts'>(<b class='failed'>\" + bad + \"</b>, <b class='passed'>\" + good + \"</b>, \" + this.assertions.length + \")</b>\";\n\n\t\t\tvar a = document.createElement(\"a\");\n\t\t\ta.innerHTML = \"Rerun\";\n\t\t\ta.href = QUnit.url({ filter: getText([b]).replace(/\\([^)]+\\)$/, \"\").replace(/(^\\s*|\\s*$)/g, \"\") });\n\n\t\t\taddEvent(b, \"click\", function() {\n\t\t\t\tvar next = b.nextSibling.nextSibling,\n\t\t\t\t\tdisplay = next.style.display;\n\t\t\t\tnext.style.display = display === \"none\" ? \"block\" : \"none\";\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({ filter: getText([target]).replace(/\\([^)]+\\)$/, \"\").replace(/(^\\s*|\\s*$)/g, \"\") });\n\t\t\t\t}\n\t\t\t});\n\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\tli.appendChild( b );\n\t\t\tli.appendChild( a );\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\tQUnit.reset();\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} );\n\t},\n\n\tqueue: function() {\n\t\tvar test = this;\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\t\t// defer when previous test run passed, if storage is available\n\t\tvar bad = QUnit.config.reorder && defined.sessionStorage && +sessionStorage.getItem(\"qunit-test-\" + this.module + \"-\" + this.testName);\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\nvar QUnit = {\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.currentModuleTestEnviroment = testEnvironment;\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 name = '<span class=\"test-name\">' + escapeInnerText(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\tname = '<span class=\"module-name\">' + config.currentModule + \"</span>: \" + name;\n\t\t}\n\n\t\tif ( !validTest(config.currentModule + \": \" + testName) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar test = new Test(name, testName, expected, async, callback);\n\t\ttest.module = config.currentModule;\n\t\ttest.moduleTestEnvironment = config.currentModuleTestEnviroment;\n\t\ttest.queue();\n\t},\n\n\t// Specify the number of expected assertions to gurantee that failed test (no assertions are run at all) don't slip through.\n\texpect: function(asserts) {\n\t\tconfig.current.expected = asserts;\n\t},\n\n\t// Asserts true.\n\t// @example ok( \"asdfasdf\".length > 5, \"There must be at least 5 chars\" );\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\tvar details = {\n\t\t\tresult: result,\n\t\t\tmessage: msg\n\t\t};\n\t\tmsg = escapeInnerText(msg || (result ? \"okay\" : \"failed\"));\n\t\tif ( !result ) {\n\t\t\tvar source = 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>' + escapeInnerText(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// Checks that the first two arguments are equal, with an optional message. Prints out both actual and expected values.\n\t// @example equal( format(\"Received {0} bytes.\", 2), \"Received 2 bytes.\" );\n\tequal: function(actual, expected, message) {\n\t\tQUnit.push(expected == actual, actual, expected, message);\n\t},\n\n\tnotEqual: function(actual, expected, message) {\n\t\tQUnit.push(expected != actual, actual, expected, message);\n\t},\n\n\tdeepEqual: function(actual, expected, message) {\n\t\tQUnit.push(QUnit.equiv(actual, expected), actual, expected, message);\n\t},\n\n\tnotDeepEqual: function(actual, expected, message) {\n\t\tQUnit.push(!QUnit.equiv(actual, expected), actual, expected, message);\n\t},\n\n\tstrictEqual: function(actual, expected, message) {\n\t\tQUnit.push(expected === actual, actual, expected, message);\n\t},\n\n\tnotStrictEqual: function(actual, expected, message) {\n\t\tQUnit.push(expected !== actual, actual, expected, message);\n\t},\n\n\traises: function(block, expected, message) {\n\t\tvar actual, ok = false;\n\n\t\tif (typeof expected === 'string') {\n\t\t\tmessage = expected;\n\t\t\texpected = null;\n\t\t}\n\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\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// expected is a regexp\n\t\t\t} else if (QUnit.objectType(expected) === \"regexp\") {\n\t\t\t\tok = expected.test(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\tok = true;\n\t\t\t}\n\t\t}\n\n\t\tQUnit.ok(ok, message);\n\t},\n\n\tstart: function(count) {\n\t\tconfig.semaphore -= count || 1;\n\t\tif (config.semaphore > 0) {\n\t\t\t// don't start until equal number of stop-calls\n\t\t\treturn;\n\t\t}\n\t\tif (config.semaphore < 0) {\n\t\t\t// ignore if start is called more often then stop\n\t\t\tconfig.semaphore = 0;\n\t\t}\n\t\t// A slight delay, to avoid any current callbacks\n\t\tif ( defined.setTimeout ) {\n\t\t\twindow.setTimeout(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 = window.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//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// deprecated; still export them to window to provide clear error messages\n// next step: remove entirely\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// Maintain internal state\nvar config = {\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\turlConfig: ['noglobals', 'notrycatch'],\n\n\t//logging callback queues\n\tbegin: [],\n\tdone: [],\n\tlog: [],\n\ttestStart: [],\n\ttestDone: [],\n\tmoduleStart: [],\n\tmoduleDone: []\n};\n\n// Load paramaters\n(function() {\n\tvar location = 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 ( var 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\tconfig.filter = urlParams.filter;\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// Expose the API as global variables, unless an 'exports'\n// object exists, in that case we assume we're in CommonJS - export everything at the end\nif ( typeof exports === \"undefined\" || typeof require === \"undefined\" ) {\n\textend(window, QUnit);\n\twindow.QUnit = QUnit;\n}\n\n// define these after exposing globals to keep them in these QUnit namespace only\nextend(QUnit, {\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: 0\n\t\t});\n\n\t\tvar qunit = id( \"qunit\" );\n\t\tif ( qunit ) {\n\t\t\tqunit.innerHTML =\n\t\t\t\t'<h1 id=\"qunit-header\">' + escapeInnerText( 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\tvar tests = id( \"qunit-tests\" ),\n\t\t\tbanner = id( \"qunit-banner\" ),\n\t\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// If jQuery is available, uses jQuery's html(), otherwise just innerHTML.\n\treset: function() {\n\t\tif ( window.jQuery ) {\n\t\t\tjQuery( \"#qunit-fixture\" ).html( config.fixture );\n\t\t} else {\n\t\t\tvar main = id( 'qunit-fixture' );\n\t\t\tif ( main ) {\n\t\t\t\tmain.innerHTML = config.fixture;\n\t\t\t}\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\t\t\telem.dispatchEvent( event );\n\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\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 type = toString.call( obj ).match(/^\\[object\\s(.*)\\]$/)[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\t\treturn type.toLowerCase();\n\t\t}\n\t\tif (typeof obj === \"object\") {\n\t\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\t\tvar details = {\n\t\t\tresult: result,\n\t\t\tmessage: message,\n\t\t\tactual: actual,\n\t\t\texpected: expected\n\t\t};\n\n\t\tmessage = escapeInnerText(message) || (result ? \"okay\" : \"failed\");\n\t\tmessage = '<span class=\"test-message\">' + message + \"</span>\";\n\t\tvar output = message;\n\t\tif (!result) {\n\t\t\texpected = escapeInnerText(QUnit.jsDump.parse(expected));\n\t\t\tactual = escapeInnerText(QUnit.jsDump.parse(actual));\n\t\t\toutput += '<table><tr class=\"test-expected\"><th>Expected: </th><td><pre>' + expected + '</pre></td></tr>';\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\t\t\tvar source = sourceFromStacktrace();\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>' + escapeInnerText(source) + '</pre></td></tr>';\n\t\t\t}\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) {\n\t\tvar details = {\n\t\t\tresult: false,\n\t\t\tmessage: message\n\t\t};\n\t\tvar output = escapeInnerText(message);\n\t\tif (source) {\n\t\t\tdetails.source = source;\n\t\t\toutput += '<table><tr class=\"test-source\"><th>Source: </th><td><pre>' + escapeInnerText(source) + '</pre></td></tr></table>';\n\t\t}\n\t\trunLoggingCallbacks( 'log', QUnit, details );\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 querystring = \"?\",\n\t\t\tkey;\n\t\tfor ( key in params ) {\n\t\t\tif ( !hasOwn.call( params, key ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tquerystring += encodeURIComponent( key ) + \"=\" +\n\t\t\t\tencodeURIComponent( params[ key ] ) + \"&\";\n\t\t}\n\t\treturn window.location.pathname + querystring.slice( 0, -1 );\n\t},\n\n\textend: extend,\n\tid: id,\n\taddEvent: addEvent\n});\n\n//QUnit.constructor is set to the empty F() above so that we can add to it's prototype later\n//Doing this allows us to tell if the following methods have been overwritten on the actual\n//QUnit object, which is a deprecated way of using the callbacks.\nextend(QUnit.constructor.prototype, {\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\t// done: { failed, passed, total, runtime }\n\tdone: registerLoggingCallback('done'),\n\t// log: { result, actual, expected, message }\n\tlog: registerLoggingCallback('log'),\n\t// testStart: { name }\n\ttestStart: registerLoggingCallback('testStart'),\n\t// testDone: { name, failed, passed, total }\n\ttestDone: registerLoggingCallback('testDone'),\n\t// moduleStart: { name }\n\tmoduleStart: registerLoggingCallback('moduleStart'),\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 oldconfig = extend({}, config);\n\tQUnit.init();\n\textend(config, oldconfig);\n\n\tconfig.blocking = false;\n\n\tvar urlConfigHtml = '', len = config.urlConfig.length;\n\tfor ( var i = 0, val; i < len; i++ ) {\n\t\tval = config.urlConfig[i];\n\t\tconfig[val] = QUnit.urlParams[val];\n\t\turlConfigHtml += '<label><input name=\"' + val + '\" type=\"checkbox\"' + ( config[val] ? ' checked=\"checked\"' : '' ) + '>' + val + '</label>';\n\t}\n\n\tvar userAgent = id(\"qunit-userAgent\");\n\tif ( userAgent ) {\n\t\tuserAgent.innerHTML = navigator.userAgent;\n\t}\n\tvar banner = id(\"qunit-header\");\n\tif ( banner ) {\n\t\tbanner.innerHTML = '<a href=\"' + QUnit.url({ filter: undefined }) + '\"> ' + banner.innerHTML + '</a> ' + urlConfigHtml;\n\t\taddEvent( banner, \"change\", function( event ) {\n\t\t\tvar params = {};\n\t\t\tparams[ event.target.name ] = event.target.checked ? true : undefined;\n\t\t\twindow.location = QUnit.url( params );\n\t\t});\n\t}\n\n\tvar toolbar = id(\"qunit-testrunner-toolbar\");\n\tif ( toolbar ) {\n\t\tvar filter = document.createElement(\"input\");\n\t\tfilter.type = \"checkbox\";\n\t\tfilter.id = \"qunit-filter-pass\";\n\t\taddEvent( filter, \"click\", function() {\n\t\t\tvar ol = document.getElementById(\"qunit-tests\");\n\t\t\tif ( filter.checked ) {\n\t\t\t\tol.className = ol.className + \" hidepass\";\n\t\t\t} else {\n\t\t\t\tvar tmp = \" \" + 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\t\tif ( config.hidepassed || defined.sessionStorage && sessionStorage.getItem(\"qunit-filter-passed-tests\") ) {\n\t\t\tfilter.checked = true;\n\t\t\tvar ol = document.getElementById(\"qunit-tests\");\n\t\t\tol.className = ol.className + \" hidepass\";\n\t\t}\n\t\ttoolbar.appendChild( filter );\n\n\t\tvar label = document.createElement(\"label\");\n\t\tlabel.setAttribute(\"for\", \"qunit-filter-pass\");\n\t\tlabel.innerHTML = \"Hide passed tests\";\n\t\ttoolbar.appendChild( label );\n\t}\n\n\tvar main = 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// addEvent(window, \"error\") gives us a useless event object\nwindow.onerror = function( message, file, line ) {\n\tif ( QUnit.config.current ) {\n\t\tQUnit.pushFailure( message, file + \":\" + line );\n\t} else {\n\t\tQUnit.test( \"global failure\", function() {\n\t\t\tQUnit.pushFailure( message, file + \":\" + line );\n\t\t});\n\t}\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\n\tvar banner = 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> tests 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\tvar key;\n\t\tfor ( var 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\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\nfunction validTest( name ) {\n\tvar filter = config.filter,\n\t\trun = false;\n\n\tif ( !filter ) {\n\t\treturn true;\n\t}\n\n\tvar not = filter.charAt( 0 ) === \"!\";\n\tif ( not ) {\n\t\tfilter = filter.slice( 1 );\n\t}\n\n\tif ( name.indexOf( filter ) !== -1 ) {\n\t\treturn !not;\n\t}\n\n\tif ( not ) {\n\t\trun = true;\n\t}\n\n\treturn run;\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 || 3;\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\tvar stack = e.stack.split(\"\\n\");\n\t\tif (/^error$/i.test(stack[0])) {\n\t\t\tstack.shift();\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\nfunction escapeInnerText(s) {\n\tif (!s) {\n\t\treturn \"\";\n\t}\n\ts = s + \"\";\n\treturn s.replace(/[\\&<>]/g, function(s) {\n\t\tswitch(s) {\n\t\t\tcase \"&\": return \"&amp;\";\n\t\t\tcase \"<\": return \"&lt;\";\n\t\t\tcase \">\": return \"&gt;\";\n\t\t\tdefault: return s;\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\twindow.setTimeout( 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\tcontinue;\n\t\t\t}\n\t\t\tconfig.pollution.push( key );\n\t\t}\n\t}\n}\n\nfunction checkPollution( name ) {\n\tvar old = config.pollution;\n\tsaveGlobal();\n\n\tvar newGlobals = diff( config.pollution, old );\n\tif ( newGlobals.length > 0 ) {\n\t\tQUnit.pushFailure( \"Introduced global variable(s): \" + newGlobals.join(\", \") );\n\t}\n\n\tvar deletedGlobals = 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 result = a.slice();\n\tfor ( var i = 0; i < result.length; i++ ) {\n\t\tfor ( var 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 ( b[prop] === undefined ) {\n\t\t\tdelete a[prop];\n\n\t\t// Avoid \"Member not found\" error in IE8 caused by setting window.constructor\n\t\t} else if ( prop !== \"constructor\" || a !== window ) {\n\t\t\ta[prop] = b[prop];\n\t\t}\n\t}\n\n\treturn a;\n}\n\nfunction addEvent(elem, type, fn) {\n\tif ( elem.addEventListener ) {\n\t\telem.addEventListener( type, fn, false );\n\t} else if ( elem.attachEvent ) {\n\t\telem.attachEvent( \"on\" + type, fn );\n\t} else {\n\t\tfn();\n\t}\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\t//debugger;\n\tvar callbacks;\n\tif ( QUnit.hasOwnProperty(key) ) {\n\t\tQUnit[key].call(scope, args);\n\t} else {\n\t\tcallbacks = config[key];\n\t\tfor( var 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\tvar innerEquiv; // the real equiv function\n\tvar callers = []; // stack to decide between skip/abort functions\n\tvar parents = []; // stack to avoiding loops from circular referencing\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\tvar getProto = Object.getPrototypeOf || function (obj) {\n\t\treturn obj.__proto__;\n\t};\n\n\tvar callbacks = (function () {\n\n\t\t// for string, boolean, number and null\n\t\tfunction useStrictEquality(b, a) {\n\t\t\tif (b instanceof a.constructor || a instanceof b.constructor) {\n\t\t\t\t// to catch short annotaion VS 'new' annotation of a\n\t\t\t\t// declaration\n\t\t\t\t// e.g. var i = 1;\n\t\t\t\t// var j = new Number(1);\n\t\t\t\treturn a == b;\n\t\t\t} else {\n\t\t\t\treturn a === b;\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\t\"string\" : useStrictEquality,\n\t\t\t\"boolean\" : useStrictEquality,\n\t\t\t\"number\" : useStrictEquality,\n\t\t\t\"null\" : useStrictEquality,\n\t\t\t\"undefined\" : useStrictEquality,\n\n\t\t\t\"nan\" : function(b) {\n\t\t\t\treturn isNaN(b);\n\t\t\t},\n\n\t\t\t\"date\" : function(b, a) {\n\t\t\t\treturn QUnit.objectType(b) === \"date\" && a.valueOf() === b.valueOf();\n\t\t\t},\n\n\t\t\t\"regexp\" : function(b, a) {\n\t\t\t\treturn QUnit.objectType(b) === \"regexp\" &&\n\t\t\t\t\t// the regex itself\n\t\t\t\t\ta.source === b.source &&\n\t\t\t\t\t// and its modifers\n\t\t\t\t\ta.global === b.global &&\n\t\t\t\t\t// (gmi) ...\n\t\t\t\t\ta.ignoreCase === b.ignoreCase &&\n\t\t\t\t\ta.multiline === b.multiline;\n\t\t\t},\n\n\t\t\t// - skip when the property is a method of an instance (OOP)\n\t\t\t// - abort otherwise,\n\t\t\t// initial === would have catch identical references anyway\n\t\t\t\"function\" : function() {\n\t\t\t\tvar caller = callers[callers.length - 1];\n\t\t\t\treturn caller !== Object && typeof caller !== \"undefined\";\n\t\t\t},\n\n\t\t\t\"array\" : function(b, a) {\n\t\t\t\tvar i, j, loop;\n\t\t\t\tvar len;\n\n\t\t\t\t// b could be an object literal here\n\t\t\t\tif (QUnit.objectType(b) !== \"array\") {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\tlen = a.length;\n\t\t\t\tif (len !== b.length) { // safe and faster\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\t// track reference to avoid circular references\n\t\t\t\tparents.push(a);\n\t\t\t\tfor (i = 0; i < len; i++) {\n\t\t\t\t\tloop = false;\n\t\t\t\t\tfor (j = 0; j < parents.length; j++) {\n\t\t\t\t\t\tif (parents[j] === a[i]) {\n\t\t\t\t\t\t\tloop = true;// dont rewalk array\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (!loop && !innerEquiv(a[i], b[i])) {\n\t\t\t\t\t\tparents.pop();\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tparents.pop();\n\t\t\t\treturn true;\n\t\t\t},\n\n\t\t\t\"object\" : function(b, a) {\n\t\t\t\tvar i, j, loop;\n\t\t\t\tvar eq = true; // unless we can proove it\n\t\t\t\tvar aProperties = [], bProperties = []; // collection of\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t// strings\n\n\t\t\t\t// comparing constructors is more strict than using\n\t\t\t\t// instanceof\n\t\t\t\tif (a.constructor !== b.constructor) {\n\t\t\t\t\t// Allow objects with no prototype to be equivalent to\n\t\t\t\t\t// objects with Object as their constructor.\n\t\t\t\t\tif (!((getProto(a) === null && getProto(b) === Object.prototype) ||\n\t\t\t\t\t\t(getProto(b) === null && getProto(a) === Object.prototype)))\n\t\t\t\t\t{\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// stack constructor before traversing properties\n\t\t\t\tcallers.push(a.constructor);\n\t\t\t\t// track reference to avoid circular references\n\t\t\t\tparents.push(a);\n\n\t\t\t\tfor (i in a) { // be strict: don't ensures hasOwnProperty\n\t\t\t\t\t\t\t\t// and go deep\n\t\t\t\t\tloop = false;\n\t\t\t\t\tfor (j = 0; j < parents.length; j++) {\n\t\t\t\t\t\tif (parents[j] === a[i]) {\n\t\t\t\t\t\t\t// don't go down the same path twice\n\t\t\t\t\t\t\tloop = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\taProperties.push(i); // collect a's properties\n\n\t\t\t\t\tif (!loop && !innerEquiv(a[i], b[i])) {\n\t\t\t\t\t\teq = false;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tcallers.pop(); // unstack, we are done\n\t\t\t\tparents.pop();\n\n\t\t\t\tfor (i in b) {\n\t\t\t\t\tbProperties.push(i); // collect b's properties\n\t\t\t\t}\n\n\t\t\t\t// Ensures identical properties name\n\t\t\t\treturn eq && innerEquiv(aProperties.sort(), bProperties.sort());\n\t\t\t}\n\t\t};\n\t}());\n\n\tinnerEquiv = function() { // can take multiple arguments\n\t\tvar args = Array.prototype.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]) && arguments.callee.apply(this, args.splice(1, args.length - 1)));\n\t};\n\n\treturn innerEquiv;\n\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\n\tvar jsDump = {\n\t\tparse: function( obj, type, stack ) { //type is used mostly internally, you can fix a (custom)type in advance\n\t\t\tstack = stack || [ ];\n\t\t\tvar parser = this.parsers[ type || this.typeOf(obj) ];\n\t\t\ttype = typeof parser;\n\t\t\tvar inStack = inArray(obj, stack);\n\t\t\tif (inStack != -1) {\n\t\t\t\treturn 'recursion('+(inStack - stack.length)+')';\n\t\t\t}\n\t\t\t//else\n\t\t\tif (type == 'function')  {\n\t\t\t\t\tstack.push(obj);\n\t\t\t\t\tvar res = parser.call( this, obj, stack );\n\t\t\t\t\tstack.pop();\n\t\t\t\t\treturn res;\n\t\t\t}\n\t\t\t// else\n\t\t\treturn (type == 'string') ? parser : this.parsers.error;\n\t\t},\n\t\ttypeOf: function( obj ) {\n\t\t\tvar type;\n\t\t\tif ( obj === null ) {\n\t\t\t\ttype = \"null\";\n\t\t\t} else if (typeof obj === \"undefined\") {\n\t\t\t\ttype = \"undefined\";\n\t\t\t} else if (QUnit.is(\"RegExp\", obj)) {\n\t\t\t\ttype = \"regexp\";\n\t\t\t} else if (QUnit.is(\"Date\", obj)) {\n\t\t\t\ttype = \"date\";\n\t\t\t} else if (QUnit.is(\"Function\", obj)) {\n\t\t\t\ttype = \"function\";\n\t\t\t} else if (typeof obj.setInterval !== undefined && typeof obj.document !== \"undefined\" && typeof obj.nodeType === \"undefined\") {\n\t\t\t\ttype = \"window\";\n\t\t\t} else if (obj.nodeType === 9) {\n\t\t\t\ttype = \"document\";\n\t\t\t} else if (obj.nodeType) {\n\t\t\t\ttype = \"node\";\n\t\t\t} else if (\n\t\t\t\t// native arrays\n\t\t\t\ttoString.call( obj ) === \"[object Array]\" ||\n\t\t\t\t// NodeList objects\n\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) {\n\t\t\t\ttype = \"array\";\n\t\t\t} else {\n\t\t\t\ttype = typeof obj;\n\t\t\t}\n\t\t\treturn type;\n\t\t},\n\t\tseparator: function() {\n\t\t\treturn this.multiline ?\tthis.HTML ? '<br />' : '\\n' : this.HTML ? '&nbsp;' : ' ';\n\t\t},\n\t\tindent: function( extra ) {// extra can be a number, shortcut for increasing-calling-decreasing\n\t\t\tif ( !this.multiline ) {\n\t\t\t\treturn '';\n\t\t\t}\n\t\t\tvar chr = this.indentChar;\n\t\t\tif ( this.HTML ) {\n\t\t\t\tchr = chr.replace(/\\t/g,'   ').replace(/ /g,'&nbsp;');\n\t\t\t}\n\t\t\treturn new Array( this._depth_ + (extra||0) ).join(chr);\n\t\t},\n\t\tup: function( a ) {\n\t\t\tthis._depth_ += a || 1;\n\t\t},\n\t\tdown: function( a ) {\n\t\t\tthis._depth_ -= a || 1;\n\t\t},\n\t\tsetParser: function( name, parser ) {\n\t\t\tthis.parsers[name] = parser;\n\t\t},\n\t\t// The next 3 are exposed so you can use them\n\t\tquote: quote,\n\t\tliteral: literal,\n\t\tjoin: join,\n\t\t//\n\t\t_depth_: 1,\n\t\t// This is the list of parsers, to modify them, use jsDump.setParser\n\t\tparsers: {\n\t\t\twindow: '[Window]',\n\t\t\tdocument: '[Document]',\n\t\t\terror: '[ERROR]', //when no parser is found, shouldn't happen\n\t\t\tunknown: '[Unknown]',\n\t\t\t'null': 'null',\n\t\t\t'undefined': 'undefined',\n\t\t\t'function': function( fn ) {\n\t\t\t\tvar ret = 'function',\n\t\t\t\t\tname = 'name' in fn ? fn.name : (reName.exec(fn)||[])[1];//functions never have name in IE\n\t\t\t\tif ( name ) {\n\t\t\t\t\tret += ' ' + name;\n\t\t\t\t}\n\t\t\t\tret += '(';\n\n\t\t\t\tret = [ ret, QUnit.jsDump.parse( fn, 'functionArgs' ), '){'].join('');\n\t\t\t\treturn join( ret, QUnit.jsDump.parse(fn,'functionCode'), '}' );\n\t\t\t},\n\t\t\tarray: array,\n\t\t\tnodelist: array,\n\t\t\t'arguments': array,\n\t\t\tobject: function( map, stack ) {\n\t\t\t\tvar ret = [ ], keys, key, val, i;\n\t\t\t\tQUnit.jsDump.up();\n\t\t\t\tif (Object.keys) {\n\t\t\t\t\tkeys = Object.keys( map );\n\t\t\t\t} else {\n\t\t\t\t\tkeys = [];\n\t\t\t\t\tfor (key in map) { keys.push( key ); }\n\t\t\t\t}\n\t\t\t\tkeys.sort();\n\t\t\t\tfor (i = 0; i < keys.length; i++) {\n\t\t\t\t\tkey = keys[ i ];\n\t\t\t\t\tval = map[ key ];\n\t\t\t\t\tret.push( QUnit.jsDump.parse( key, 'key' ) + ': ' + QUnit.jsDump.parse( val, undefined, stack ) );\n\t\t\t\t}\n\t\t\t\tQUnit.jsDump.down();\n\t\t\t\treturn join( '{', ret, '}' );\n\t\t\t},\n\t\t\tnode: function( node ) {\n\t\t\t\tvar open = QUnit.jsDump.HTML ? '&lt;' : '<',\n\t\t\t\t\tclose = QUnit.jsDump.HTML ? '&gt;' : '>';\n\n\t\t\t\tvar tag = node.nodeName.toLowerCase(),\n\t\t\t\t\tret = open + tag;\n\n\t\t\t\tfor ( var a in QUnit.jsDump.DOMAttrs ) {\n\t\t\t\t\tvar val = node[QUnit.jsDump.DOMAttrs[a]];\n\t\t\t\t\tif ( val ) {\n\t\t\t\t\t\tret += ' ' + a + '=' + QUnit.jsDump.parse( val, 'attribute' );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn ret + close + open + '/' + tag + close;\n\t\t\t},\n\t\t\tfunctionArgs: function( fn ) {//function calls it internally, it's the arguments part of the function\n\t\t\t\tvar l = fn.length;\n\t\t\t\tif ( !l ) {\n\t\t\t\t\treturn '';\n\t\t\t\t}\n\n\t\t\t\tvar args = new Array(l);\n\t\t\t\twhile ( l-- ) {\n\t\t\t\t\targs[l] = String.fromCharCode(97+l);//97 is 'a'\n\t\t\t\t}\n\t\t\t\treturn ' ' + args.join(', ') + ' ';\n\t\t\t},\n\t\t\tkey: quote, //object calls it internally, the key part of an item in a map\n\t\t\tfunctionCode: '[code]', //function calls it internally, it's the content of the function\n\t\t\tattribute: quote, //node calls it internally, it's an html attribute value\n\t\t\tstring: quote,\n\t\t\tdate: quote,\n\t\t\tregexp: literal, //regex\n\t\t\tnumber: literal,\n\t\t\t'boolean': literal\n\t\t},\n\t\tDOMAttrs:{//attributes to dump from nodes, name=>realName\n\t\t\tid:'id',\n\t\t\tname:'name',\n\t\t\t'class':'className'\n\t\t},\n\t\tHTML:false,//if true, entities are escaped ( <, >, \\t, space and \\n )\n\t\tindentChar:'  ',//indentation unit\n\t\tmultiline:true //if true, items in a collection, are separated by a \\n, else just a space.\n\t};\n\n\treturn jsDump;\n}());\n\n// from Sizzle.js\nfunction getText( elems ) {\n\tvar ret = \"\", elem;\n\n\tfor ( var i = 0; elems[i]; i++ ) {\n\t\telem = elems[i];\n\n\t\t// Get the text from text nodes and CDATA nodes\n\t\tif ( elem.nodeType === 3 || elem.nodeType === 4 ) {\n\t\t\tret += elem.nodeValue;\n\n\t\t// Traverse everything else, except comment nodes\n\t\t} else if ( elem.nodeType !== 8 ) {\n\t\t\tret += getText( elem.childNodes );\n\t\t}\n\t}\n\n\treturn ret;\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\tfunction diff(o, n) {\n\t\tvar ns = {};\n\t\tvar os = {};\n\t\tvar i;\n\n\t\tfor (i = 0; i < n.length; i++) {\n\t\t\tif (ns[n[i]] == null) {\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 (os[o[i]] == null) {\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\tcontinue;\n\t\t\t}\n\t\t\tif (ns[i].rows.length == 1 && typeof(os[i]) != \"undefined\" && os[i].rows.length == 1) {\n\t\t\t\tn[ns[i].rows[0]] = {\n\t\t\t\t\ttext: n[ns[i].rows[0]],\n\t\t\t\t\trow: os[i].rows[0]\n\t\t\t\t};\n\t\t\t\to[os[i].rows[0]] = {\n\t\t\t\t\ttext: o[os[i].rows[0]],\n\t\t\t\t\trow: ns[i].rows[0]\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\tn[i + 1] == o[n[i].row + 1]) {\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\tn[i - 1] == o[n[i].row - 1]) {\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\t\tvar out = diff(o === \"\" ? [] : o.split(/\\s+/), n === \"\" ? [] : n.split(/\\s+/));\n\n\t\tvar str = \"\";\n\t\tvar i;\n\n\t\tvar oSpace = o.match(/\\s+/g);\n\t\tif (oSpace == null) {\n\t\t\toSpace = [\" \"];\n\t\t}\n\t\telse {\n\t\t\toSpace.push(\" \");\n\t\t}\n\t\tvar nSpace = n.match(/\\s+/g);\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\tvar pre = \"\";\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 enviroments, export everything\nif ( typeof exports !== \"undefined\" || typeof require !== \"undefined\" ) {\n\textend(exports, QUnit);\n}\n\n// get at whatever the global object is, like window in browsers\n}( (function() {return this;}.call()) ));\n"
  },
  {
    "path": "test/require.js",
    "content": "/*\n RequireJS 2.1.9 Copyright (c) 2010-2012, The Dojo Foundation All Rights Reserved.\n Available via the MIT or new BSD license.\n see: http://github.com/jrburke/requirejs for details\n*/\nvar requirejs,require,define;\n(function(Z){function H(b){return\"[object Function]\"===L.call(b)}function I(b){return\"[object Array]\"===L.call(b)}function y(b,c){if(b){var e;for(e=0;e<b.length&&(!b[e]||!c(b[e],e,b));e+=1);}}function M(b,c){if(b){var e;for(e=b.length-1;-1<e&&(!b[e]||!c(b[e],e,b));e-=1);}}function t(b,c){return ga.call(b,c)}function l(b,c){return t(b,c)&&b[c]}function F(b,c){for(var e in b)if(t(b,e)&&c(b[e],e))break}function Q(b,c,e,h){c&&F(c,function(c,j){if(e||!t(b,j))h&&\"string\"!==typeof c?(b[j]||(b[j]={}),Q(b[j],\nc,e,h)):b[j]=c});return b}function u(b,c){return function(){return c.apply(b,arguments)}}function aa(b){throw b;}function ba(b){if(!b)return b;var c=Z;y(b.split(\".\"),function(b){c=c[b]});return c}function A(b,c,e,h){c=Error(c+\"\\nhttp://requirejs.org/docs/errors.html#\"+b);c.requireType=b;c.requireModules=h;e&&(c.originalError=e);return c}function ha(b){function c(a,f,b){var d,m,c,g,e,h,j,i=f&&f.split(\"/\");d=i;var n=k.map,p=n&&n[\"*\"];if(a&&\".\"===a.charAt(0))if(f){d=l(k.pkgs,f)?i=[f]:i.slice(0,i.length-\n1);f=a=d.concat(a.split(\"/\"));for(d=0;f[d];d+=1)if(m=f[d],\".\"===m)f.splice(d,1),d-=1;else if(\"..\"===m)if(1===d&&(\"..\"===f[2]||\"..\"===f[0]))break;else 0<d&&(f.splice(d-1,2),d-=2);d=l(k.pkgs,f=a[0]);a=a.join(\"/\");d&&a===f+\"/\"+d.main&&(a=f)}else 0===a.indexOf(\"./\")&&(a=a.substring(2));if(b&&n&&(i||p)){f=a.split(\"/\");for(d=f.length;0<d;d-=1){c=f.slice(0,d).join(\"/\");if(i)for(m=i.length;0<m;m-=1)if(b=l(n,i.slice(0,m).join(\"/\")))if(b=l(b,c)){g=b;e=d;break}if(g)break;!h&&(p&&l(p,c))&&(h=l(p,c),j=d)}!g&&\nh&&(g=h,e=j);g&&(f.splice(0,e,g),a=f.join(\"/\"))}return a}function e(a){z&&y(document.getElementsByTagName(\"script\"),function(f){if(f.getAttribute(\"data-requiremodule\")===a&&f.getAttribute(\"data-requirecontext\")===i.contextName)return f.parentNode.removeChild(f),!0})}function h(a){var f=l(k.paths,a);if(f&&I(f)&&1<f.length)return f.shift(),i.require.undef(a),i.require([a]),!0}function $(a){var f,b=a?a.indexOf(\"!\"):-1;-1<b&&(f=a.substring(0,b),a=a.substring(b+1,a.length));return[f,a]}function n(a,f,\nb,d){var m,B,g=null,e=f?f.name:null,h=a,j=!0,k=\"\";a||(j=!1,a=\"_@r\"+(L+=1));a=$(a);g=a[0];a=a[1];g&&(g=c(g,e,d),B=l(r,g));a&&(g?k=B&&B.normalize?B.normalize(a,function(a){return c(a,e,d)}):c(a,e,d):(k=c(a,e,d),a=$(k),g=a[0],k=a[1],b=!0,m=i.nameToUrl(k)));b=g&&!B&&!b?\"_unnormalized\"+(M+=1):\"\";return{prefix:g,name:k,parentMap:f,unnormalized:!!b,url:m,originalName:h,isDefine:j,id:(g?g+\"!\"+k:k)+b}}function q(a){var f=a.id,b=l(p,f);b||(b=p[f]=new i.Module(a));return b}function s(a,f,b){var d=a.id,m=l(p,\nd);if(t(r,d)&&(!m||m.defineEmitComplete))\"defined\"===f&&b(r[d]);else if(m=q(a),m.error&&\"error\"===f)b(m.error);else m.on(f,b)}function v(a,f){var b=a.requireModules,d=!1;if(f)f(a);else if(y(b,function(f){if(f=l(p,f))f.error=a,f.events.error&&(d=!0,f.emit(\"error\",a))}),!d)j.onError(a)}function w(){R.length&&(ia.apply(G,[G.length-1,0].concat(R)),R=[])}function x(a){delete p[a];delete T[a]}function E(a,f,b){var d=a.map.id;a.error?a.emit(\"error\",a.error):(f[d]=!0,y(a.depMaps,function(d,c){var g=d.id,\ne=l(p,g);e&&(!a.depMatched[c]&&!b[g])&&(l(f,g)?(a.defineDep(c,r[g]),a.check()):E(e,f,b))}),b[d]=!0)}function C(){var a,f,b,d,m=(b=1E3*k.waitSeconds)&&i.startTime+b<(new Date).getTime(),c=[],g=[],j=!1,l=!0;if(!U){U=!0;F(T,function(b){a=b.map;f=a.id;if(b.enabled&&(a.isDefine||g.push(b),!b.error))if(!b.inited&&m)h(f)?j=d=!0:(c.push(f),e(f));else if(!b.inited&&(b.fetched&&a.isDefine)&&(j=!0,!a.prefix))return l=!1});if(m&&c.length)return b=A(\"timeout\",\"Load timeout for modules: \"+c,null,c),b.contextName=\ni.contextName,v(b);l&&y(g,function(a){E(a,{},{})});if((!m||d)&&j)if((z||da)&&!V)V=setTimeout(function(){V=0;C()},50);U=!1}}function D(a){t(r,a[0])||q(n(a[0],null,!0)).init(a[1],a[2])}function J(a){var a=a.currentTarget||a.srcElement,b=i.onScriptLoad;a.detachEvent&&!W?a.detachEvent(\"onreadystatechange\",b):a.removeEventListener(\"load\",b,!1);b=i.onScriptError;(!a.detachEvent||W)&&a.removeEventListener(\"error\",b,!1);return{node:a,id:a&&a.getAttribute(\"data-requiremodule\")}}function K(){var a;for(w();G.length;){a=\nG.shift();if(null===a[0])return v(A(\"mismatch\",\"Mismatched anonymous define() module: \"+a[a.length-1]));D(a)}}var U,X,i,N,V,k={waitSeconds:7,baseUrl:\"./\",paths:{},pkgs:{},shim:{},config:{}},p={},T={},Y={},G=[],r={},S={},L=1,M=1;N={require:function(a){return a.require?a.require:a.require=i.makeRequire(a.map)},exports:function(a){a.usingExports=!0;if(a.map.isDefine)return a.exports?a.exports:a.exports=r[a.map.id]={}},module:function(a){return a.module?a.module:a.module={id:a.map.id,uri:a.map.url,config:function(){var b=\nl(k.pkgs,a.map.id);return(b?l(k.config,a.map.id+\"/\"+b.main):l(k.config,a.map.id))||{}},exports:r[a.map.id]}}};X=function(a){this.events=l(Y,a.id)||{};this.map=a;this.shim=l(k.shim,a.id);this.depExports=[];this.depMaps=[];this.depMatched=[];this.pluginMaps={};this.depCount=0};X.prototype={init:function(a,b,c,d){d=d||{};if(!this.inited){this.factory=b;if(c)this.on(\"error\",c);else this.events.error&&(c=u(this,function(a){this.emit(\"error\",a)}));this.depMaps=a&&a.slice(0);this.errback=c;this.inited=!0;\nthis.ignore=d.ignore;d.enabled||this.enabled?this.enable():this.check()}},defineDep:function(a,b){this.depMatched[a]||(this.depMatched[a]=!0,this.depCount-=1,this.depExports[a]=b)},fetch:function(){if(!this.fetched){this.fetched=!0;i.startTime=(new Date).getTime();var a=this.map;if(this.shim)i.makeRequire(this.map,{enableBuildCallback:!0})(this.shim.deps||[],u(this,function(){return a.prefix?this.callPlugin():this.load()}));else return a.prefix?this.callPlugin():this.load()}},load:function(){var a=\nthis.map.url;S[a]||(S[a]=!0,i.load(this.map.id,a))},check:function(){if(this.enabled&&!this.enabling){var a,b,c=this.map.id;b=this.depExports;var d=this.exports,m=this.factory;if(this.inited)if(this.error)this.emit(\"error\",this.error);else{if(!this.defining){this.defining=!0;if(1>this.depCount&&!this.defined){if(H(m)){if(this.events.error&&this.map.isDefine||j.onError!==aa)try{d=i.execCb(c,m,b,d)}catch(e){a=e}else d=i.execCb(c,m,b,d);this.map.isDefine&&((b=this.module)&&void 0!==b.exports&&b.exports!==\nthis.exports?d=b.exports:void 0===d&&this.usingExports&&(d=this.exports));if(a)return a.requireMap=this.map,a.requireModules=this.map.isDefine?[this.map.id]:null,a.requireType=this.map.isDefine?\"define\":\"require\",v(this.error=a)}else d=m;this.exports=d;if(this.map.isDefine&&!this.ignore&&(r[c]=d,j.onResourceLoad))j.onResourceLoad(i,this.map,this.depMaps);x(c);this.defined=!0}this.defining=!1;this.defined&&!this.defineEmitted&&(this.defineEmitted=!0,this.emit(\"defined\",this.exports),this.defineEmitComplete=\n!0)}}else this.fetch()}},callPlugin:function(){var a=this.map,b=a.id,e=n(a.prefix);this.depMaps.push(e);s(e,\"defined\",u(this,function(d){var m,e;e=this.map.name;var g=this.map.parentMap?this.map.parentMap.name:null,h=i.makeRequire(a.parentMap,{enableBuildCallback:!0});if(this.map.unnormalized){if(d.normalize&&(e=d.normalize(e,function(a){return c(a,g,!0)})||\"\"),d=n(a.prefix+\"!\"+e,this.map.parentMap),s(d,\"defined\",u(this,function(a){this.init([],function(){return a},null,{enabled:!0,ignore:!0})})),\ne=l(p,d.id)){this.depMaps.push(d);if(this.events.error)e.on(\"error\",u(this,function(a){this.emit(\"error\",a)}));e.enable()}}else m=u(this,function(a){this.init([],function(){return a},null,{enabled:!0})}),m.error=u(this,function(a){this.inited=!0;this.error=a;a.requireModules=[b];F(p,function(a){0===a.map.id.indexOf(b+\"_unnormalized\")&&x(a.map.id)});v(a)}),m.fromText=u(this,function(d,c){var e=a.name,g=n(e),B=O;c&&(d=c);B&&(O=!1);q(g);t(k.config,b)&&(k.config[e]=k.config[b]);try{j.exec(d)}catch(ca){return v(A(\"fromtexteval\",\n\"fromText eval for \"+b+\" failed: \"+ca,ca,[b]))}B&&(O=!0);this.depMaps.push(g);i.completeLoad(e);h([e],m)}),d.load(a.name,h,m,k)}));i.enable(e,this);this.pluginMaps[e.id]=e},enable:function(){T[this.map.id]=this;this.enabling=this.enabled=!0;y(this.depMaps,u(this,function(a,b){var c,d;if(\"string\"===typeof a){a=n(a,this.map.isDefine?this.map:this.map.parentMap,!1,!this.skipMap);this.depMaps[b]=a;if(c=l(N,a.id)){this.depExports[b]=c(this);return}this.depCount+=1;s(a,\"defined\",u(this,function(a){this.defineDep(b,\na);this.check()}));this.errback&&s(a,\"error\",u(this,this.errback))}c=a.id;d=p[c];!t(N,c)&&(d&&!d.enabled)&&i.enable(a,this)}));F(this.pluginMaps,u(this,function(a){var b=l(p,a.id);b&&!b.enabled&&i.enable(a,this)}));this.enabling=!1;this.check()},on:function(a,b){var c=this.events[a];c||(c=this.events[a]=[]);c.push(b)},emit:function(a,b){y(this.events[a],function(a){a(b)});\"error\"===a&&delete this.events[a]}};i={config:k,contextName:b,registry:p,defined:r,urlFetched:S,defQueue:G,Module:X,makeModuleMap:n,\nnextTick:j.nextTick,onError:v,configure:function(a){a.baseUrl&&\"/\"!==a.baseUrl.charAt(a.baseUrl.length-1)&&(a.baseUrl+=\"/\");var b=k.pkgs,c=k.shim,d={paths:!0,config:!0,map:!0};F(a,function(a,b){d[b]?\"map\"===b?(k.map||(k.map={}),Q(k[b],a,!0,!0)):Q(k[b],a,!0):k[b]=a});a.shim&&(F(a.shim,function(a,b){I(a)&&(a={deps:a});if((a.exports||a.init)&&!a.exportsFn)a.exportsFn=i.makeShimExports(a);c[b]=a}),k.shim=c);a.packages&&(y(a.packages,function(a){a=\"string\"===typeof a?{name:a}:a;b[a.name]={name:a.name,\nlocation:a.location||a.name,main:(a.main||\"main\").replace(ja,\"\").replace(ea,\"\")}}),k.pkgs=b);F(p,function(a,b){!a.inited&&!a.map.unnormalized&&(a.map=n(b))});if(a.deps||a.callback)i.require(a.deps||[],a.callback)},makeShimExports:function(a){return function(){var b;a.init&&(b=a.init.apply(Z,arguments));return b||a.exports&&ba(a.exports)}},makeRequire:function(a,f){function h(d,c,e){var g,k;f.enableBuildCallback&&(c&&H(c))&&(c.__requireJsBuild=!0);if(\"string\"===typeof d){if(H(c))return v(A(\"requireargs\",\n\"Invalid require call\"),e);if(a&&t(N,d))return N[d](p[a.id]);if(j.get)return j.get(i,d,a,h);g=n(d,a,!1,!0);g=g.id;return!t(r,g)?v(A(\"notloaded\",'Module name \"'+g+'\" has not been loaded yet for context: '+b+(a?\"\":\". Use require([])\"))):r[g]}K();i.nextTick(function(){K();k=q(n(null,a));k.skipMap=f.skipMap;k.init(d,c,e,{enabled:!0});C()});return h}f=f||{};Q(h,{isBrowser:z,toUrl:function(b){var f,e=b.lastIndexOf(\".\"),g=b.split(\"/\")[0];if(-1!==e&&(!(\".\"===g||\"..\"===g)||1<e))f=b.substring(e,b.length),b=\nb.substring(0,e);return i.nameToUrl(c(b,a&&a.id,!0),f,!0)},defined:function(b){return t(r,n(b,a,!1,!0).id)},specified:function(b){b=n(b,a,!1,!0).id;return t(r,b)||t(p,b)}});a||(h.undef=function(b){w();var c=n(b,a,!0),f=l(p,b);e(b);delete r[b];delete S[c.url];delete Y[b];f&&(f.events.defined&&(Y[b]=f.events),x(b))});return h},enable:function(a){l(p,a.id)&&q(a).enable()},completeLoad:function(a){var b,c,d=l(k.shim,a)||{},e=d.exports;for(w();G.length;){c=G.shift();if(null===c[0]){c[0]=a;if(b)break;b=\n!0}else c[0]===a&&(b=!0);D(c)}c=l(p,a);if(!b&&!t(r,a)&&c&&!c.inited){if(k.enforceDefine&&(!e||!ba(e)))return h(a)?void 0:v(A(\"nodefine\",\"No define call for \"+a,null,[a]));D([a,d.deps||[],d.exportsFn])}C()},nameToUrl:function(a,b,c){var d,e,h,g,i,n;if(j.jsExtRegExp.test(a))g=a+(b||\"\");else{d=k.paths;e=k.pkgs;g=a.split(\"/\");for(i=g.length;0<i;i-=1)if(n=g.slice(0,i).join(\"/\"),h=l(e,n),n=l(d,n)){I(n)&&(n=n[0]);g.splice(0,i,n);break}else if(h){a=a===h.name?h.location+\"/\"+h.main:h.location;g.splice(0,i,\na);break}g=g.join(\"/\");g+=b||(/^data\\:|\\?/.test(g)||c?\"\":\".js\");g=(\"/\"===g.charAt(0)||g.match(/^[\\w\\+\\.\\-]+:/)?\"\":k.baseUrl)+g}return k.urlArgs?g+((-1===g.indexOf(\"?\")?\"?\":\"&\")+k.urlArgs):g},load:function(a,b){j.load(i,a,b)},execCb:function(a,b,c,d){return b.apply(d,c)},onScriptLoad:function(a){if(\"load\"===a.type||ka.test((a.currentTarget||a.srcElement).readyState))P=null,a=J(a),i.completeLoad(a.id)},onScriptError:function(a){var b=J(a);if(!h(b.id))return v(A(\"scripterror\",\"Script error for: \"+b.id,\na,[b.id]))}};i.require=i.makeRequire();return i}var j,w,x,C,J,D,P,K,q,fa,la=/(\\/\\*([\\s\\S]*?)\\*\\/|([^:]|^)\\/\\/(.*)$)/mg,ma=/[^.]\\s*require\\s*\\(\\s*[\"']([^'\"\\s]+)[\"']\\s*\\)/g,ea=/\\.js$/,ja=/^\\.\\//;w=Object.prototype;var L=w.toString,ga=w.hasOwnProperty,ia=Array.prototype.splice,z=!!(\"undefined\"!==typeof window&&\"undefined\"!==typeof navigator&&window.document),da=!z&&\"undefined\"!==typeof importScripts,ka=z&&\"PLAYSTATION 3\"===navigator.platform?/^complete$/:/^(complete|loaded)$/,W=\"undefined\"!==typeof opera&&\n\"[object Opera]\"===opera.toString(),E={},s={},R=[],O=!1;if(\"undefined\"===typeof define){if(\"undefined\"!==typeof requirejs){if(H(requirejs))return;s=requirejs;requirejs=void 0}\"undefined\"!==typeof require&&!H(require)&&(s=require,require=void 0);j=requirejs=function(b,c,e,h){var q,n=\"_\";!I(b)&&\"string\"!==typeof b&&(q=b,I(c)?(b=c,c=e,e=h):b=[]);q&&q.context&&(n=q.context);(h=l(E,n))||(h=E[n]=j.s.newContext(n));q&&h.configure(q);return h.require(b,c,e)};j.config=function(b){return j(b)};j.nextTick=\"undefined\"!==\ntypeof setTimeout?function(b){setTimeout(b,4)}:function(b){b()};require||(require=j);j.version=\"2.1.9\";j.jsExtRegExp=/^\\/|:|\\?|\\.js$/;j.isBrowser=z;w=j.s={contexts:E,newContext:ha};j({});y([\"toUrl\",\"undef\",\"defined\",\"specified\"],function(b){j[b]=function(){var c=E._;return c.require[b].apply(c,arguments)}});if(z&&(x=w.head=document.getElementsByTagName(\"head\")[0],C=document.getElementsByTagName(\"base\")[0]))x=w.head=C.parentNode;j.onError=aa;j.createNode=function(b){var c=b.xhtml?document.createElementNS(\"http://www.w3.org/1999/xhtml\",\n\"html:script\"):document.createElement(\"script\");c.type=b.scriptType||\"text/javascript\";c.charset=\"utf-8\";c.async=!0;return c};j.load=function(b,c,e){var h=b&&b.config||{};if(z)return h=j.createNode(h,c,e),h.setAttribute(\"data-requirecontext\",b.contextName),h.setAttribute(\"data-requiremodule\",c),h.attachEvent&&!(h.attachEvent.toString&&0>h.attachEvent.toString().indexOf(\"[native code\"))&&!W?(O=!0,h.attachEvent(\"onreadystatechange\",b.onScriptLoad)):(h.addEventListener(\"load\",b.onScriptLoad,!1),h.addEventListener(\"error\",\nb.onScriptError,!1)),h.src=e,K=h,C?x.insertBefore(h,C):x.appendChild(h),K=null,h;if(da)try{importScripts(e),b.completeLoad(c)}catch(l){b.onError(A(\"importscripts\",\"importScripts failed for \"+c+\" at \"+e,l,[c]))}};z&&!s.skipDataMain&&M(document.getElementsByTagName(\"script\"),function(b){x||(x=b.parentNode);if(J=b.getAttribute(\"data-main\"))return q=J,s.baseUrl||(D=q.split(\"/\"),q=D.pop(),fa=D.length?D.join(\"/\")+\"/\":\"./\",s.baseUrl=fa),q=q.replace(ea,\"\"),j.jsExtRegExp.test(q)&&(q=J),s.deps=s.deps?s.deps.concat(q):\n[q],!0});define=function(b,c,e){var h,j;\"string\"!==typeof b&&(e=c,c=b,b=null);I(c)||(e=c,c=null);!c&&H(e)&&(c=[],e.length&&(e.toString().replace(la,\"\").replace(ma,function(b,e){c.push(e)}),c=(1===e.length?[\"require\"]:[\"require\",\"exports\",\"module\"]).concat(c)));if(O){if(!(h=K))P&&\"interactive\"===P.readyState||M(document.getElementsByTagName(\"script\"),function(b){if(\"interactive\"===b.readyState)return P=b}),h=P;h&&(b||(b=h.getAttribute(\"data-requiremodule\")),j=E[h.getAttribute(\"data-requirecontext\")])}(j?\nj.defQueue:R).push([b,c,e])};define.amd={jQuery:!0};j.exec=function(b){return eval(b)};j(s)}})(this);\n"
  },
  {
    "path": "test/tests.js",
    "content": "$(window).on('load', function() {\n\n//Initialize skrollr and save the instance.\nvar s = skrollr.init({\n\tedgeStrategy: 'set',\n\tconstants: {\n\t\tmyconst: 300,\n\t\tmy500: function() {\n\t\t\treturn 500;\n\t\t}\n\t},\n\teasing: {\n\t\thalf1: function() {\n\t\t\treturn 0.5\n\t\t}\n\t}\n});\n\n//Counts how many assertions will be needed for the tests.\nvar countAssertions = function(tests) {\n\tvar counter = 0;\n\n\tfor(var i = 0; i < tests.length; i++) {\n\t\tvar curTest = tests[i];\n\n\t\tif(curTest.styles) {\n\t\t\t$.each(curTest.styles, function() {\n\t\t\t\tcounter++;\n\t\t\t});\n\t\t}\n\n\t\tif(curTest.attributes) {\n\t\t\t$.each(curTest.attributes, function() {\n\t\t\t\tcounter++;\n\t\t\t});\n\t\t}\n\n\t\tcounter += !!curTest.selector;\n\t}\n\n\treturn counter;\n};\n\n//A meta-test which runs common tests\n//which need synchronization of scrolling and rendering.\nvar scrollTests = function(offset, tests) {\n\tmodule('at scroll position ' + offset);\n\n\tasyncTest('rendering', function() {\n\t\t//We can't run them in parallel,\n\t\t//because they would interfere with each others scroll top offset.\n\t\tstop();\n\n\t\texpect(countAssertions(tests));\n\n\t\t//Scroll to offset, which will cause rendering (sooner or later)\n\t\ts.setScrollTop(offset, true);\n\n\t\ts.on('render', function(info) {\n\t\t\t//Prevent another render event. Only need one for test.\n\t\t\ts.off('render');\n\n\t\t\tfor(var i = 0; i < tests.length; i++) {\n\t\t\t\tvar curTest = tests[i];\n\n\t\t\t\tif(curTest.styles) {\n\t\t\t\t\t$.each(curTest.styles, function(k) {\n\t\t\t\t\t\tQUnit.numericCSSPropertyEquals(curTest.element.css(k), curTest.styles[k], curTest.message || 'element\\'s (#' + curTest.element[0].id + ') \"' + k + '\" CSS property is correct');\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tif(curTest.attributes) {\n\t\t\t\t\t$.each(curTest.attributes, function(k, value) {\n\t\t\t\t\t\tconsole.log(curTest.element.prop(k));\n\t\t\t\t\t\tQUnit.numericCSSPropertyEquals(curTest.element.attr(k), curTest.attributes[k], curTest.message || 'element\\'s (#' + curTest.element[0].id + ') \"' + k + '\" attribute is correct');\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tif(curTest.selector) {\n\t\t\t\t\tok(curTest.element.is(curTest.selector), 'element matches \"' + curTest.selector + '\"');\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tstart(2);\n\t\t});\n\t});\n};\n\n//\n// Now the actual tests.\n//\n\n//Add one element dynamically\nvar newElement = $('<div id=\"dynamic\" data-0=\"bottom:0px;\" data-250=\"bottom:100px;\">TEST</div>').appendTo('body');\ns.refresh(newElement[0]);\n\nmodule('basic stuff');\n\ntest('CSS classes present', function() {\n\tstrictEqual($('.skrollable').length, 23, 'All elements have the .skrollable class');\n\n\tok($('html').is('.skrollr'), 'HTML element has skrollr class');\n\tok($('html').is(':not(.no-skrollr)'), 'HTML element does not have no-skrollr class');\n});\n\nscrollTests(500, [\n\t{\n\t\tmessage: 'colons inside urls are preserved (#73)',\n\t\telement: $('#colon-url'),\n\t\tstyles: {\n\t\t\tbackgroundImage: 'url(https://secure.travis-ci.org/Prinzhorn/skrollr.png)'\n\t\t}\n\t},\n\t{\n\t\tmessage: 'a single period is no number (#74)',\n\t\telement: $('#period-number'),\n\t\tstyles: {\n\t\t\tbackgroundImage: 'url(https://secure.travis-ci.org/Prinzhorn/skrollr.png?1337)'\n\t\t}\n\t},\n\t{\n\t\telement: $('#simple-numeric'),\n\t\tstyles: {\n\t\t\tleft: '100px',\n\t\t\ttop: '50px'\n\t\t}\n\t},\n\t{\n\t\telement: $('#easing'),\n\t\tstyles: {\n\t\t\tleft: '25px'\n\t\t}\n\t},\n\t{\n\t\telement: $('#compound-numeric'),\n\t\tstyles: {\n\t\t\tmarginTop: '30px',\n\t\t\tmarginRight: '20px',\n\t\t\tmarginBottom: '10px',\n\t\t\tmarginLeft: '0px'\n\t\t}\n\t},\n\t{\n\t\telement: $('#rgb-color'),\n\t\tstyles: {\n\t\t\tcolor: 'rgb(50, 100, 150)'\n\t\t}\n\t},\n\t{\n\t\telement: $('#rgba-color'),\n\t\tstyles: {\n\t\t\tcolor: 'rgba(50, 100, 150, 0.5)'\n\t\t}\n\t},\n\t{\n\t\telement: $('#hsl-color'),\n\t\tstyles: {\n\t\t\tcolor: 'rgb(191, 63, 63)'\n\t\t}\n\t},\n\t{\n\t\telement: $('#no-interpolation'),\n\t\tstyles: {\n\t\t\tright: '100px'\n\t\t}\n\t},\n\t{\n\t\telement: $('#anchor-2'),\n\t\tstyles: {\n\t\t\tright: '200px'\n\t\t}\n\t},\n\t{\n\t\telement: $('#foreign-anchor'),\n\t\tstyles: {\n\t\t\tpaddingTop: '100px',\n\t\t\tpaddingRight: '100px',\n\t\t\tpaddingBottom: '100px',\n\t\t\tpaddingLeft: '100px'\n\t\t}\n\t},\n\t{\n\t\telement: $('#float'),\n\t\tstyles: {\n\t\t\tfloat: 'left'\n\t\t}\n\t},\n\t{\n\t\tmessage: 'z-index \"auto\" is no converted to a number (#351)',\n\t\telement: $('#auto-z-index'),\n\t\tstyles: {\n\t\t\tzIndex: 'auto'\n\t\t}\n\t},\n\t{\n\t\tmessage: 'attribute interpolation',\n\t\telement: $('#attr'),\n\t\tattributes: {\n\t\t\ttitle: '0'\n\t\t}\n\t}\n]);\n\nscrollTests(0, [\n\t{\n\t\telement: $('#simple-numeric'),\n\t\tstyles: {\n\t\t\tleft: '-100px',\n\t\t\ttop: '0px'\n\t\t}\n\t},\n\t{\n\t\telement: $('#easing'),\n\t\tstyles: {\n\t\t\tleft: '25px'\n\t\t}\n\t},\n\t{\n\t\telement: $('#compound-numeric'),\n\t\tstyles: {\n\t\t\tmarginTop: '0px',\n\t\t\tmarginRight: '10px',\n\t\t\tmarginBottom: '20px',\n\t\t\tmarginLeft: '30px'\n\t\t}\n\t},\n\t{\n\t\telement: $('#rgb-color'),\n\t\tstyles: {\n\t\t\tcolor: 'rgb(0, 0, 0)'\n\t\t}\n\t},\n\t{\n\t\telement: $('#rgba-color'),\n\t\tstyles: {\n\t\t\tcolor: 'rgba(0, 0, 0, 0.2)'\n\t\t}\n\t},\n\t{\n\t\telement: $('#hsl-color'),\n\t\tstyles: {\n\t\t\tcolor: 'rgb(0, 0, 0)'\n\t\t}\n\t},\n\t{\n\t\telement: $('#no-interpolation'),\n\t\tstyles: {\n\t\t\tright: '0px'\n\t\t}\n\t},\n\t{\n\t\telement: $('#end'),\n\t\tstyles: {\n\t\t\tfontSize: '10px'\n\t\t}\n\t},\n\t{\n\t\telement: newElement,\n\t\tstyles: {\n\t\t\tbottom: '0px'\n\t\t}\n\t},\n\t{\n\t\telement: $('#float'),\n\t\tstyles: {\n\t\t\tfloat: 'none'\n\t\t}\n\t},\n\t{\n\t\tmessage: 'z-index \"auto\" is no converted to a number (#351)',\n\t\telement: $('#auto-z-index'),\n\t\tstyles: {\n\t\t\tzIndex: '1'\n\t\t}\n\t},\n\t{\n\t\tmessage: 'attribute interpolation',\n\t\telement: $('#attr'),\n\t\tattributes: {\n\t\t\ttitle: '500',\n\t\t\t'data-test': 'skrollr'\n\t\t}\n\t}\n]);\n\nscrollTests(250, [\n\t{\n\t\telement: $('#simple-numeric'),\n\t\tstyles: {\n\t\t\tleft: '0px',\n\t\t\ttop: '25px'\n\t\t}\n\t},\n\t{\n\t\telement: $('#easing'),\n\t\tstyles: {\n\t\t\tleft: '25px'\n\t\t}\n\t},\n\t{\n\t\telement: $('#compound-numeric'),\n\t\tstyles: {\n\t\t\tmarginTop: '15px',\n\t\t\tmarginRight: '15px',\n\t\t\tmarginBottom: '15px',\n\t\t\tmarginLeft: '15px'\n\t\t}\n\t},\n\t{\n\t\telement: $('#rgb-color'),\n\t\tstyles: {\n\t\t\tcolor: 'rgb(25, 50, 75)'\n\t\t}\n\t},\n\t{\n\t\telement: $('#rgba-color'),\n\t\tstyles: {\n\t\t\tcolor: 'rgba(25, 50, 75, 0.35)'\n\t\t}\n\t},\n\t{\n\t\telement: $('#hsl-color'),\n\t\tstyles: {\n\t\t\tcolor: 'rgb(79, 47, 47)'\n\t\t}\n\t},\n\t{\n\t\telement: $('#no-interpolation'),\n\t\tstyles: {\n\t\t\tright: '0px'\n\t\t}\n\t},\n\t{\n\t\telement: $('#anchor-2'),\n\t\tstyles: {\n\t\t\tright: '100px'\n\t\t}\n\t},\n\t{\n\t\telement: newElement,\n\t\tstyles: {\n\t\t\tbottom: '100px'\n\t\t}\n\t},\n\t{\n\t\telement: $('#foreign-anchor'),\n\t\tstyles: {\n\t\t\tpaddingTop: '150px',\n\t\t\tpaddingRight: '150px',\n\t\t\tpaddingBottom: '150px',\n\t\t\tpaddingLeft: '150px'\n\t\t}\n\t},\n\t{\n\t\telement: $('#float'),\n\t\tstyles: {\n\t\t\tfloat: 'none'\n\t\t}\n\t},\n\t{\n\t\tmessage: 'attribute interpolation',\n\t\telement: $('#attr'),\n\t\tattributes: {\n\t\t\ttitle: '250',\n\t\t\t'data-test': 'skrollr'\n\t\t}\n\t}\n]);\n\n//bottom-top + 50%\nscrollTests(150, [\n\t{\n\t\telement: $('#relative-percentage-offset'),\n\t\tstyles: {\n\t\t\tleft: '250px'\n\t\t}\n\t}\n]);\n\n//200%\nscrollTests(600, [\n\t{\n\t\telement: $('#percentage-offset'),\n\t\tstyles: {\n\t\t\tleft: '500px'\n\t\t}\n\t},\n\t{\n\t\tmessage: 'attribute interpolation',\n\t\telement: $('#attr'),\n\t\tattributes: {\n\t\t\t'data-test': 'skrollr-test'\n\t\t}\n\t}\n]);\n\n//100%\nscrollTests(300, [\n\t{\n\t\telement: $('#percentage-offset'),\n\t\tstyles: {\n\t\t\tleft: '250px'\n\t\t}\n\t}\n]);\n\n//We scroll to a ridiculous large position so that the browser cuts it at the actual position.\nvar maxScrollHeight = s.setScrollTop(1e5) && s.getScrollTop();\n\nscrollTests(maxScrollHeight, [\n\t{\n\t\telement: $('#anchor-1'),\n\t\tstyles: {\n\t\t\tright: '100px'\n\t\t}\n\t},\n\t{\n\t\telement: $('#easing'),\n\t\tstyles: {\n\t\t\tleft: '50px'\n\t\t}\n\t},\n\t{\n\t\telement: $('#easing_with_easing_strategy'),\n\t\tstyles: {\n\t\t\tleft: '25px'\n\t\t}\n\t},\n\t{\n\t\telement: $('#reset-strategy'),\n\t\tstyles: {\n\t\t\tleft: '1337px'\n\t\t}\n\t}\n]);\n\n\n});//DOM ready\n"
  }
]